From 0e0b0374b76e50e0561797ee632eef4d3ee5d1b6 Mon Sep 17 00:00:00 2001 From: fabianlinkflink Date: Wed, 15 Jan 2025 10:38:14 +0000 Subject: [PATCH] deploy: 80e01ae1b649393af23c09399a61dd71ccc81a97 --- assets/index-755246d1.css | 1 - .../{index-af8551e8.js => index-8914f15f.js} | 892 +++++++++--------- ...-af8551e8.js.map => index-8914f15f.js.map} | 2 +- assets/index-d194e655.css | 1 + index.html | 4 +- 5 files changed, 450 insertions(+), 450 deletions(-) delete mode 100644 assets/index-755246d1.css rename assets/{index-af8551e8.js => index-8914f15f.js} (72%) rename assets/{index-af8551e8.js.map => index-8914f15f.js.map} (64%) create mode 100644 assets/index-d194e655.css diff --git a/assets/index-755246d1.css b/assets/index-755246d1.css deleted file mode 100644 index 18e372a..0000000 --- a/assets/index-755246d1.css +++ /dev/null @@ -1 +0,0 @@ -@keyframes v-pacmanStretchDelay{75%{-webkit-opacity:.7;opacity:.7}to{transform:translate(-200px,-6.25px)}}.fade-enter-active[data-v-77df4156],.fade-leave-active[data-v-77df4156]{transition:opacity .2s}.fade-enter-from[data-v-77df4156],.fade-leave-to[data-v-77df4156]{opacity:0}.ghost[data-v-6171bc79]{opacity:.5}.rect-stacked{cursor:pointer}.tooltip{pointer-events:none;position:absolute;background-color:#fff;border:1px solid gray;padding:10px;border-radius:5px;opacity:0;transition:opacity .2s}.a4-print[data-v-8a7c709b]{width:210mm;margin:0 auto;box-sizing:border-box}@media print{.viewer-container[data-v-8a7c709b]{height:auto;overflow:hidden}.graphs-container[data-v-8a7c709b],.table-container[data-v-8a7c709b],.editable-text-container[data-v-8a7c709b]{page-break-inside:avoid}.a4-print[data-v-8a7c709b]{display:block}}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}[type=text],input:where(:not([type])),[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow: 0 0 #0000}[type=text]:focus,input:where(:not([type])):focus,[type=email]:focus,[type=url]:focus,[type=password]:focus,[type=number]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=month]:focus,[type=search]:focus,[type=tel]:focus,[type=time]:focus,[type=week]:focus,[multiple]:focus,textarea:focus,select:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow: 0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 2px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:hover,[type=checkbox]:checked:focus,[type=radio]:checked:hover,[type=radio]:checked:focus{border-color:transparent;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}@media (forced-colors: active){[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:hover,[type=checkbox]:indeterminate:focus{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.-inset-0\.5{top:-.125rem;right:-.125rem;bottom:-.125rem;left:-.125rem}.-inset-1\.5{top:-.375rem;right:-.375rem;bottom:-.375rem;left:-.375rem}.-inset-2\.5{top:-.625rem;right:-.625rem;bottom:-.625rem;left:-.625rem}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.inset-y-16{top:4rem;bottom:4rem}.-left-80{left:-20rem}.-right-2{right:-.5rem}.-right-8{right:-2rem}.-top-56{top:-14rem}.bottom-0{bottom:0}.bottom-4{bottom:1rem}.left-0{left:0}.left-1{left:.25rem}.left-1\/2{left:50%}.left-1\/3{left:33.333333%}.left-2{left:.5rem}.left-4{left:1rem}.left-\[12\.5\%\]{left:12.5%}.left-\[40\%\]{left:40%}.right-0{right:0}.right-4{right:1rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-4{top:1rem}.isolate{isolation:isolate}.-z-10{z-index:-10}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[9999\]{z-index:9999}.col-span-1{grid-column:span 1 / span 1}.-m-2{margin:-.5rem}.m-1{margin:.25rem}.m-2{margin:.5rem}.m-3{margin:.75rem}.mx-auto{margin-left:auto;margin-right:auto}.-mb-6{margin-bottom:-1.5rem}.-ml-1{margin-left:-.25rem}.-ml-px{margin-left:-1px}.-mr-1{margin-right:-.25rem}.-mr-px{margin-right:-1px}.-mt-px{margin-top:-1px}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.mr-10{margin-right:2.5rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mr-6{margin-right:1.5rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mt-16{margin-top:4rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-36{margin-top:9rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.size-6{width:1.5rem;height:1.5rem}.h-1\/3{height:33.333333%}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[20vh\]{height:20vh}.h-\[33vh\]{height:33vh}.h-\[calc\(100vh-12rem\)\]{height:calc(100vh - 12rem)}.h-\[calc\(100vh-4rem\)\]{height:calc(100vh - 4rem)}.h-full{height:100%}.h-min{height:-moz-min-content;height:min-content}.h-screen{height:100vh}.max-h-2{max-height:.5rem}.max-h-60{max-height:15rem}.max-h-8{max-height:2rem}.max-h-80{max-height:20rem}.max-h-full{max-height:100%}.max-h-screen{max-height:100vh}.min-h-full{min-height:100%}.w-0{width:0px}.w-1{width:.25rem}.w-1\/12{width:8.333333%}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-1\/6{width:16.666667%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-11\/12{width:91.666667%}.w-2\/3{width:66.666667%}.w-2\/5{width:40%}.w-2\/6{width:33.333333%}.w-24{width:6rem}.w-3{width:.75rem}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-3\/6{width:50%}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-5\/6{width:83.333333%}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-\[68\.5625rem\]{width:68.5625rem}.w-\[76rem\]{width:76rem}.w-auto{width:auto}.w-full{width:100%}.w-min{width:-moz-min-content;width:min-content}.w-screen{width:100vw}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.table-auto{table-layout:auto}.table-fixed{table-layout:fixed}.origin-top-left{transform-origin:top left}.origin-top-right{transform-origin:top right}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x: 1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-4{--tw-translate-y: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.columns-2{-moz-columns:2;columns:2}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-items-center{justify-items:center}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-1{row-gap:.25rem}.gap-y-16{row-gap:4rem}.gap-y-5{row-gap:1.25rem}.gap-y-8{row-gap:2rem}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(2.5rem * var(--tw-space-x-reverse));margin-left:calc(2.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(3rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem * var(--tw-space-y-reverse))}.space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(243 244 246 / var(--tw-divide-opacity, 1))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(209 213 219 / var(--tw-divide-opacity, 1))}.place-self-center{place-self:center}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-bl-lg{border-bottom-left-radius:.5rem}.rounded-br-lg{border-bottom-right-radius:.5rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-400{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.border-gray-900\/10{border-color:#1118271a}.border-gray-900\/5{border-color:#1118270d}.border-green-500{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.border-neutral-400{--tw-border-opacity: 1;border-color:rgb(163 163 163 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-opacity-50{--tw-border-opacity: .5}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-gray-900\/10{background-color:#1118271a}.bg-gray-900\/5{background-color:#1118270d}.bg-gray-900\/90{background-color:#111827e6}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-300{--tw-bg-opacity: 1;background-color:rgb(134 239 172 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-red-300{--tw-bg-opacity: 1;background-color:rgb(252 165 165 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-opacity-10{--tw-bg-opacity: .1}.bg-opacity-75{--tw-bg-opacity: .75}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-\[\#0066CC\]{--tw-gradient-from: #0066CC var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 102 204 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-\[\#009999\]{--tw-gradient-from: #009999 var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 153 153 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-\[\#CCE5FF\]{--tw-gradient-to: #CCE5FF var(--tw-gradient-to-position)}.to-\[\#CCFFFF\]{--tw-gradient-to: #CCFFFF var(--tw-gradient-to-position)}.stroke-green-200{stroke:#bbf7d0}.object-bottom{-o-object-position:bottom;object-position:bottom}.p-0{padding:0}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-20{padding-left:5rem;padding-right:5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-36{padding-top:9rem;padding-bottom:9rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-60{padding-top:15rem;padding-bottom:15rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-12{padding-bottom:3rem}.pb-2{padding-bottom:.5rem}.pb-24{padding-bottom:6rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-60{padding-left:15rem}.pl-9{padding-left:2.25rem}.pr-0{padding-right:0}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-60{padding-right:15rem}.pr-7{padding-right:1.75rem}.pt-1{padding-top:.25rem}.pt-10{padding-top:2.5rem}.pt-16{padding-top:4rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-bottom{vertical-align:bottom}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-base{font-size:1rem;line-height:1.5rem}.text-base\/7{font-size:1rem;line-height:1.75rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-sm\/6{font-size:.875rem;line-height:1.5rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-8{line-height:2rem}.leading-9{line-height:2.25rem}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-900{--tw-text-opacity: 1;color:rgb(20 83 45 / var(--tw-text-opacity, 1))}.text-neutral-700{--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-slate-100{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-80{opacity:.8}.opacity-\[0\.45\]{opacity:.45}.mix-blend-multiply{mix-blend-mode:multiply}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-gray-300{--tw-shadow-color: #d1d5db;--tw-shadow: var(--tw-shadow-colored)}.outline{outline-style:solid}.outline-1{outline-width:1px}.outline-gray-200\/80{outline-color:#e5e7ebcc}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-inset{--tw-ring-inset: inset}.ring-black{--tw-ring-opacity: 1;--tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity, 1))}.ring-gray-200{--tw-ring-opacity: 1;--tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity, 1))}.ring-gray-300{--tw-ring-opacity: 1;--tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity, 1))}.ring-gray-400{--tw-ring-opacity: 1;--tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity, 1))}.ring-gray-400\/10{--tw-ring-color: rgb(156 163 175 / .1)}.ring-gray-900\/10{--tw-ring-color: rgb(17 24 39 / .1)}.ring-green-600\/20{--tw-ring-color: rgb(22 163 74 / .2)}.ring-opacity-5{--tw-ring-opacity: .05}.ring-opacity-50{--tw-ring-opacity: .5}.blur-3xl{--tw-blur: blur(64px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-1000{transition-duration:1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.\[key\:string\]{key:string}.\[mask-image\:radial-gradient\(100\%_100\%_at_top_right\,white\,transparent\)\]{-webkit-mask-image:radial-gradient(100% 100% at top right,white,transparent);mask-image:radial-gradient(100% 100% at top right,white,transparent)}.placeholder\:text-gray-400::-moz-placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.placeholder\:text-gray-400::placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.focus-within\:ring-2:focus-within{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-within\:ring-inset:focus-within{--tw-ring-inset: inset}.focus-within\:ring-green-600:focus-within{--tw-ring-opacity: 1;--tw-ring-color: rgb(22 163 74 / var(--tw-ring-opacity, 1))}.hover\:cursor-move:hover{cursor:move}.hover\:cursor-pointer:hover{cursor:pointer}.hover\:border-gray-300:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-green-500:hover{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.hover\:bg-green-600:hover{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.hover\:text-gray-500:hover{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.hover\:text-gray-800:hover{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-green-500:hover{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.hover\:text-green-600:hover{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.hover\:text-red-700:hover{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.focus\:z-10:focus{z-index:10}.focus\:border-indigo-500:focus{--tw-border-opacity: 1;border-color:rgb(99 102 241 / var(--tw-border-opacity, 1))}.focus\:underline:focus{text-decoration-line:underline}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-inset:focus{--tw-ring-inset: inset}.focus\:ring-gray-400:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity, 1))}.focus\:ring-gray-600:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(75 85 99 / var(--tw-ring-opacity, 1))}.focus\:ring-green-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity, 1))}.focus\:ring-green-600:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(22 163 74 / var(--tw-ring-opacity, 1))}.focus\:ring-indigo-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity, 1))}.focus\:ring-offset-0:focus{--tw-ring-offset-width: 0px}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-green-600:focus-visible{outline-color:#16a34a}.group:hover .group-hover\:text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}@media (min-width: 640px){.sm\:static{position:static}.sm\:inset-auto{inset:auto}.sm\:col-span-2{grid-column:span 2 / span 2}.sm\:col-span-4{grid-column:span 4 / span 4}.sm\:col-span-6{grid-column:span 6 / span 6}.sm\:col-start-1{grid-column-start:1}.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:ml-6{margin-left:1.5rem}.sm\:mt-0{margin-top:0}.sm\:mt-10{margin-top:2.5rem}.sm\:mt-24{margin-top:6rem}.sm\:mt-5{margin-top:1.25rem}.sm\:mt-6{margin-top:1.5rem}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:w-64{width:16rem}.sm\:w-\[1200px\]{width:1200px}.sm\:w-full{width:100%}.sm\:max-w-5xl{max-width:64rem}.sm\:max-w-\[480px\]{max-width:480px}.sm\:max-w-md{max-width:28rem}.sm\:max-w-sm{max-width:24rem}.sm\:flex-auto{flex:1 1 auto}.sm\:flex-none{flex:none}.sm\:translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:items-center{align-items:center}.sm\:items-baseline{align-items:baseline}.sm\:items-stretch{align-items:stretch}.sm\:justify-start{justify-content:flex-start}.sm\:justify-center{justify-content:center}.sm\:gap-y-20{row-gap:5rem}.sm\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(3rem * var(--tw-space-x-reverse));margin-left:calc(3rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(2rem * var(--tw-space-x-reverse));margin-left:calc(2rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem * var(--tw-space-y-reverse))}.sm\:rounded-3xl{border-radius:1.5rem}.sm\:rounded-xl{border-radius:.75rem}.sm\:p-0{padding:0}.sm\:p-4{padding:1rem}.sm\:p-6{padding:1.5rem}.sm\:px-10{padding-left:2.5rem;padding-right:2.5rem}.sm\:px-12{padding-left:3rem;padding-right:3rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-16{padding-top:4rem;padding-bottom:4rem}.sm\:py-24{padding-top:6rem;padding-bottom:6rem}.sm\:py-32{padding-top:8rem;padding-bottom:8rem}.sm\:pb-32{padding-bottom:8rem}.sm\:pr-0{padding-right:0}.sm\:pr-6{padding-right:1.5rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-5xl{font-size:3rem;line-height:1}.sm\:text-6xl{font-size:3.75rem;line-height:1}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}.sm\:leading-6{line-height:1.5rem}.sm\:leading-8{line-height:2rem}.sm\:duration-700{transition-duration:.7s}}@media (min-width: 768px){.md\:absolute{position:absolute}.md\:bottom-16{bottom:4rem}.md\:left-\[50rem\]{left:50rem}.md\:block{display:block}.md\:transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:px-12{padding-left:3rem;padding-right:3rem}.md\:blur-3xl{--tw-blur: blur(64px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}}@media (min-width: 1024px){.lg\:order-first{order:-9999}.lg\:-m-4{margin:-1rem}.lg\:mx-0{margin-left:0;margin-right:0}.lg\:ml-10{margin-left:2.5rem}.lg\:ml-auto{margin-left:auto}.lg\:mr-0{margin-right:0}.lg\:mt-0{margin-top:0}.lg\:mt-12{margin-top:3rem}.lg\:flex{display:flex}.lg\:max-w-7xl{max-width:80rem}.lg\:max-w-lg{max-width:32rem}.lg\:max-w-none{max-width:none}.lg\:max-w-xl{max-width:36rem}.lg\:flex-none{flex:none}.lg\:flex-shrink-0{flex-shrink:0}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:flex-col{flex-direction:column}.lg\:rounded-2xl{border-radius:1rem}.lg\:p-4{padding:1rem}.lg\:px-0{padding-left:0;padding-right:0}.lg\:px-20{padding-left:5rem;padding-right:5rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-20{padding-top:5rem;padding-bottom:5rem}.lg\:pl-4{padding-left:1rem}.lg\:pt-4{padding-top:1rem}.lg\:pt-8{padding-top:2rem}}@media (min-width: 1280px){.xl\:ml-32{margin-left:8rem}}@media print{.print\:flex{display:flex}.print\:hidden{display:none}.print\:max-h-\[250mm\]{max-height:250mm}.print\:max-w-\[210mm\]{max-width:210mm}.print\:flex-col{flex-direction:column}.print\:items-center{align-items:center}.print\:justify-center{justify-content:center}.print\:p-0{padding:0}} diff --git a/assets/index-af8551e8.js b/assets/index-8914f15f.js similarity index 72% rename from assets/index-af8551e8.js rename to assets/index-8914f15f.js index 10172dd..c8b17ae 100644 --- a/assets/index-af8551e8.js +++ b/assets/index-8914f15f.js @@ -1,75 +1,75 @@ -var x3e=Object.defineProperty;var T3e=(t,e,n)=>e in t?x3e(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var qt=(t,e,n)=>(T3e(t,typeof e!="symbol"?e+"":e,n),n);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const a of s.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&r(a)}).observe(document,{childList:!0,subtree:!0});function n(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(i){if(i.ep)return;i.ep=!0;const s=n(i);fetch(i.href,s)}})();/** +var T3e=Object.defineProperty;var w3e=(t,e,n)=>e in t?T3e(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var qt=(t,e,n)=>(w3e(t,typeof e!="symbol"?e+"":e,n),n);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const a of s.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&r(a)}).observe(document,{childList:!0,subtree:!0});function n(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(i){if(i.ep)return;i.ep=!0;const s=n(i);fetch(i.href,s)}})();/** * @vue/shared v3.5.13 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**//*! #__NO_SIDE_EFFECTS__ */function qR(t){const e=Object.create(null);for(const n of t.split(","))e[n]=1;return n=>n in e}const Wn={},M1=[],dl=()=>{},w3e=()=>!1,tT=t=>t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&(t.charCodeAt(2)>122||t.charCodeAt(2)<97),LX=t=>t.startsWith("onUpdate:"),Ar=Object.assign,XX=(t,e)=>{const n=t.indexOf(e);n>-1&&t.splice(n,1)},E3e=Object.prototype.hasOwnProperty,lr=(t,e)=>E3e.call(t,e),Ot=Array.isArray,P1=t=>_b(t)==="[object Map]",l0=t=>_b(t)==="[object Set]",gG=t=>_b(t)==="[object Date]",M3e=t=>_b(t)==="[object RegExp]",Yt=t=>typeof t=="function",$r=t=>typeof t=="string",Xu=t=>typeof t=="symbol",Ur=t=>t!==null&&typeof t=="object",CX=t=>(Ur(t)||Yt(t))&&Yt(t.then)&&Yt(t.catch),qre=Object.prototype.toString,_b=t=>qre.call(t),P3e=t=>_b(t).slice(8,-1),DR=t=>_b(t)==="[object Object]",KX=t=>$r(t)&&t!=="NaN"&&t[0]!=="-"&&""+parseInt(t,10)===t,R1=qR(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),WR=t=>{const e=Object.create(null);return n=>e[n]||(e[n]=t(n))},R3e=/-(\w)/g,sa=WR(t=>t.replace(R3e,(e,n)=>n?n.toUpperCase():"")),V3e=/\B([A-Z])/g,Oo=WR(t=>t.replace(V3e,"-$1").toLowerCase()),nT=WR(t=>t.charAt(0).toUpperCase()+t.slice(1)),W3=WR(t=>t?`on${nT(t)}`:""),Ba=(t,e)=>!Object.is(t,e),V1=(t,...e)=>{for(let n=0;n{Object.defineProperty(t,e,{configurable:!0,enumerable:!1,writable:r,value:n})},wM=t=>{const e=parseFloat(t);return isNaN(e)?t:e},EM=t=>{const e=$r(t)?Number(t):NaN;return isNaN(e)?t:e};let bG;const AR=()=>bG||(bG=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),z3e="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol",k3e=qR(z3e);function Ms(t){if(Ot(t)){const e={};for(let n=0;n{if(n){const r=n.split(I3e);r.length>1&&(e[r[0].trim()]=r[1].trim())}}),e}function En(t){let e="";if($r(t))e=t;else if(Ot(t))for(let n=0;nMp(n,e))}const Are=t=>!!(t&&t.__v_isRef===!0),Mt=t=>$r(t)?t:t==null?"":Ot(t)||Ur(t)&&(t.toString===qre||!Yt(t.toString))?Are(t)?Mt(t.value):JSON.stringify(t,Gre,2):String(t),Gre=(t,e)=>Are(e)?Gre(t,e.value):P1(e)?{[`Map(${e.size})`]:[...e.entries()].reduce((n,[r,i],s)=>(n[Rz(r,s)+" =>"]=i,n),{})}:l0(e)?{[`Set(${e.size})`]:[...e.values()].map(n=>Rz(n))}:Xu(e)?Rz(e):Ur(e)&&!Ot(e)&&!DR(e)?String(e):e,Rz=(t,e="")=>{var n;return Xu(t)?`Symbol(${(n=t.description)!=null?n:e})`:t};/** +**//*! #__NO_SIDE_EFFECTS__ */function qR(t){const e=Object.create(null);for(const n of t.split(","))e[n]=1;return n=>n in e}const Wn={},M1=[],cl=()=>{},E3e=()=>!1,eT=t=>t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&(t.charCodeAt(2)>122||t.charCodeAt(2)<97),XX=t=>t.startsWith("onUpdate:"),Ar=Object.assign,CX=(t,e)=>{const n=t.indexOf(e);n>-1&&t.splice(n,1)},M3e=Object.prototype.hasOwnProperty,lr=(t,e)=>M3e.call(t,e),Ot=Array.isArray,P1=t=>_b(t)==="[object Map]",l0=t=>_b(t)==="[object Set]",mG=t=>_b(t)==="[object Date]",P3e=t=>_b(t)==="[object RegExp]",Yt=t=>typeof t=="function",$r=t=>typeof t=="string",Xu=t=>typeof t=="symbol",Ur=t=>t!==null&&typeof t=="object",KX=t=>(Ur(t)||Yt(t))&&Yt(t.then)&&Yt(t.catch),Kre=Object.prototype.toString,_b=t=>Kre.call(t),R3e=t=>_b(t).slice(8,-1),DR=t=>_b(t)==="[object Object]",qX=t=>$r(t)&&t!=="NaN"&&t[0]!=="-"&&""+parseInt(t,10)===t,R1=qR(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),WR=t=>{const e=Object.create(null);return n=>e[n]||(e[n]=t(n))},V3e=/-(\w)/g,sa=WR(t=>t.replace(V3e,(e,n)=>n?n.toUpperCase():"")),z3e=/\B([A-Z])/g,ko=WR(t=>t.replace(z3e,"-$1").toLowerCase()),tT=WR(t=>t.charAt(0).toUpperCase()+t.slice(1)),D3=WR(t=>t?`on${tT(t)}`:""),Ba=(t,e)=>!Object.is(t,e),V1=(t,...e)=>{for(let n=0;n{Object.defineProperty(t,e,{configurable:!0,enumerable:!1,writable:r,value:n})},TM=t=>{const e=parseFloat(t);return isNaN(e)?t:e},wM=t=>{const e=$r(t)?Number(t):NaN;return isNaN(e)?t:e};let vG;const AR=()=>vG||(vG=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),k3e="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol",O3e=qR(k3e);function Ms(t){if(Ot(t)){const e={};for(let n=0;n{if(n){const r=n.split(U3e);r.length>1&&(e[r[0].trim()]=r[1].trim())}}),e}function En(t){let e="";if($r(t))e=t;else if(Ot(t))for(let n=0;nMp(n,e))}const Wre=t=>!!(t&&t.__v_isRef===!0),Mt=t=>$r(t)?t:t==null?"":Ot(t)||Ur(t)&&(t.toString===Kre||!Yt(t.toString))?Wre(t)?Mt(t.value):JSON.stringify(t,Are,2):String(t),Are=(t,e)=>Wre(e)?Are(t,e.value):P1(e)?{[`Map(${e.size})`]:[...e.entries()].reduce((n,[r,i],s)=>(n[Rz(r,s)+" =>"]=i,n),{})}:l0(e)?{[`Set(${e.size})`]:[...e.values()].map(n=>Rz(n))}:Xu(e)?Rz(e):Ur(e)&&!Ot(e)&&!DR(e)?String(e):e,Rz=(t,e="")=>{var n;return Xu(t)?`Symbol(${(n=t.description)!=null?n:e})`:t};/** * @vue/reactivity v3.5.13 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let Ja;class DX{constructor(e=!1){this.detached=e,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=Ja,!e&&Ja&&(this.index=(Ja.scopes||(Ja.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let e,n;if(this.scopes)for(e=0,n=this.scopes.length;e0)return;if(G3){let e=G3;for(G3=void 0;e;){const n=e.next;e.next=void 0,e.flags&=-9,e=n}}let t;for(;A3;){let e=A3;for(A3=void 0;e;){const n=e.next;if(e.next=void 0,e.flags&=-9,e.flags&1)try{e.trigger()}catch(r){t||(t=r)}e=n}}if(t)throw t}function Jre(t){for(let e=t.deps;e;e=e.nextDep)e.version=-1,e.prevActiveLink=e.dep.activeLink,e.dep.activeLink=e}function Yre(t){let e,n=t.depsTail,r=n;for(;r;){const i=r.prevDep;r.version===-1?(r===n&&(n=i),jX(r),K3e(r)):e=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=i}t.deps=e,t.depsTail=n}function cN(t){for(let e=t.deps;e;e=e.nextDep)if(e.dep.version!==e.version||e.dep.computed&&(Bre(e.dep.computed)||e.dep.version!==e.version))return!0;return!!t._dirty}function Bre(t){if(t.flags&4&&!(t.flags&16)||(t.flags&=-17,t.globalVersion===qx))return;t.globalVersion=qx;const e=t.dep;if(t.flags|=2,e.version>0&&!t.isSSR&&t.deps&&!cN(t)){t.flags&=-3;return}const n=Br,r=Ou;Br=t,Ou=!0;try{Jre(t);const i=t.fn(t._value);(e.version===0||Ba(i,t._value))&&(t._value=i,e.version++)}catch(i){throw e.version++,i}finally{Br=n,Ou=r,Yre(t),t.flags&=-3}}function jX(t,e=!1){const{dep:n,prevSub:r,nextSub:i}=t;if(r&&(r.nextSub=i,t.prevSub=void 0),i&&(i.prevSub=r,t.nextSub=void 0),n.subs===t&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let s=n.computed.deps;s;s=s.nextDep)jX(s,!0)}!e&&!--n.sc&&n.map&&n.map.delete(n.key)}function K3e(t){const{prevDep:e,nextDep:n}=t;e&&(e.nextDep=n,t.prevDep=void 0),n&&(n.prevDep=e,t.nextDep=void 0)}function q3e(t,e){t.effect instanceof Kx&&(t=t.effect.fn);const n=new Kx(t);e&&Ar(n,e);try{n.run()}catch(i){throw n.stop(),i}const r=n.run.bind(n);return r.effect=n,r}function D3e(t){t.effect.stop()}let Ou=!0;const Hre=[];function Yp(){Hre.push(Ou),Ou=!1}function Bp(){const t=Hre.pop();Ou=t===void 0?!0:t}function yG(t){const{cleanup:e}=t;if(t.cleanup=void 0,e){const n=Br;Br=void 0;try{e()}finally{Br=n}}}let qx=0;class W3e{constructor(e,n){this.sub=e,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class FR{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(e){if(!Br||!Ou||Br===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==Br)n=this.activeLink=new W3e(Br,this),Br.deps?(n.prevDep=Br.depsTail,Br.depsTail.nextDep=n,Br.depsTail=n):Br.deps=Br.depsTail=n,Qre(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=Br.depsTail,n.nextDep=void 0,Br.depsTail.nextDep=n,Br.depsTail=n,Br.deps===n&&(Br.deps=r)}return n}trigger(e){this.version++,qx++,this.notify(e)}notify(e){GX();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{FX()}}}function Qre(t){if(t.dep.sc++,t.sub.flags&4){const e=t.dep.computed;if(e&&!t.dep.subs){e.flags|=20;for(let r=e.deps;r;r=r.nextDep)Qre(r)}const n=t.dep.subs;n!==t&&(t.prevSub=n,n&&(n.nextSub=t)),t.dep.subs=t}}const MM=new WeakMap,xv=Symbol(""),dN=Symbol(""),Dx=Symbol("");function Ma(t,e,n){if(Ou&&Br){let r=MM.get(t);r||MM.set(t,r=new Map);let i=r.get(n);i||(r.set(n,i=new FR),i.map=r,i.key=n),i.track()}}function Zd(t,e,n,r,i,s){const a=MM.get(t);if(!a){qx++;return}const o=l=>{l&&l.trigger()};if(GX(),e==="clear")a.forEach(o);else{const l=Ot(t),u=l&&KX(n);if(l&&n==="length"){const c=Number(r);a.forEach((d,f)=>{(f==="length"||f===Dx||!Xu(f)&&f>=c)&&o(d)})}else switch((n!==void 0||a.has(void 0))&&o(a.get(n)),u&&o(a.get(Dx)),e){case"add":l?u&&o(a.get("length")):(o(a.get(xv)),P1(t)&&o(a.get(dN)));break;case"delete":l||(o(a.get(xv)),P1(t)&&o(a.get(dN)));break;case"set":P1(t)&&o(a.get(xv));break}}FX()}function A3e(t,e){const n=MM.get(t);return n&&n.get(e)}function Y0(t){const e=gn(t);return e===t?e:(Ma(e,"iterate",Dx),fl(t)?e:e.map(Pa))}function jR(t){return Ma(t=gn(t),"iterate",Dx),t}const G3e={__proto__:null,[Symbol.iterator](){return zz(this,Symbol.iterator,Pa)},concat(...t){return Y0(this).concat(...t.map(e=>Ot(e)?Y0(e):e))},entries(){return zz(this,"entries",t=>(t[1]=Pa(t[1]),t))},every(t,e){return gd(this,"every",t,e,void 0,arguments)},filter(t,e){return gd(this,"filter",t,e,n=>n.map(Pa),arguments)},find(t,e){return gd(this,"find",t,e,Pa,arguments)},findIndex(t,e){return gd(this,"findIndex",t,e,void 0,arguments)},findLast(t,e){return gd(this,"findLast",t,e,Pa,arguments)},findLastIndex(t,e){return gd(this,"findLastIndex",t,e,void 0,arguments)},forEach(t,e){return gd(this,"forEach",t,e,void 0,arguments)},includes(...t){return kz(this,"includes",t)},indexOf(...t){return kz(this,"indexOf",t)},join(t){return Y0(this).join(t)},lastIndexOf(...t){return kz(this,"lastIndexOf",t)},map(t,e){return gd(this,"map",t,e,void 0,arguments)},pop(){return pS(this,"pop")},push(...t){return pS(this,"push",t)},reduce(t,...e){return SG(this,"reduce",t,e)},reduceRight(t,...e){return SG(this,"reduceRight",t,e)},shift(){return pS(this,"shift")},some(t,e){return gd(this,"some",t,e,void 0,arguments)},splice(...t){return pS(this,"splice",t)},toReversed(){return Y0(this).toReversed()},toSorted(t){return Y0(this).toSorted(t)},toSpliced(...t){return Y0(this).toSpliced(...t)},unshift(...t){return pS(this,"unshift",t)},values(){return zz(this,"values",Pa)}};function zz(t,e,n){const r=jR(t),i=r[e]();return r!==t&&!fl(t)&&(i._next=i.next,i.next=()=>{const s=i._next();return s.value&&(s.value=n(s.value)),s}),i}const F3e=Array.prototype;function gd(t,e,n,r,i,s){const a=jR(t),o=a!==t&&!fl(t),l=a[e];if(l!==F3e[e]){const d=l.apply(t,s);return o?Pa(d):d}let u=n;a!==t&&(o?u=function(d,f){return n.call(this,Pa(d),f,t)}:n.length>2&&(u=function(d,f){return n.call(this,d,f,t)}));const c=l.call(a,u,r);return o&&i?i(c):c}function SG(t,e,n,r){const i=jR(t);let s=n;return i!==t&&(fl(t)?n.length>3&&(s=function(a,o,l){return n.call(this,a,o,l,t)}):s=function(a,o,l){return n.call(this,a,Pa(o),l,t)}),i[e](s,...r)}function kz(t,e,n){const r=gn(t);Ma(r,"iterate",Dx);const i=r[e](...n);return(i===-1||i===!1)&&u0(n[0])?(n[0]=gn(n[0]),r[e](...n)):i}function pS(t,e,n=[]){Yp(),GX();const r=gn(t)[e].apply(t,n);return FX(),Bp(),r}const j3e=qR("__proto__,__v_isRef,__isVue"),_re=new Set(Object.getOwnPropertyNames(Symbol).filter(t=>t!=="arguments"&&t!=="caller").map(t=>Symbol[t]).filter(Xu));function Z3e(t){Xu(t)||(t=String(t));const e=gn(this);return Ma(e,"has",t),e.hasOwnProperty(t)}class $re{constructor(e=!1,n=!1){this._isReadonly=e,this._isShallow=n}get(e,n,r){if(n==="__v_skip")return e.__v_skip;const i=this._isReadonly,s=this._isShallow;if(n==="__v_isReactive")return!i;if(n==="__v_isReadonly")return i;if(n==="__v_isShallow")return s;if(n==="__v_raw")return r===(i?s?sie:iie:s?rie:nie).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(r)?e:void 0;const a=Ot(e);if(!i){let l;if(a&&(l=G3e[n]))return l;if(n==="hasOwnProperty")return Z3e}const o=Reflect.get(e,n,gi(e)?e:r);return(Xu(n)?_re.has(n):j3e(n))||(i||Ma(e,"get",n),s)?o:gi(o)?a&&KX(n)?o:o.value:Ur(o)?i?JX(o):Go(o):o}}class eie extends $re{constructor(e=!1){super(!1,e)}set(e,n,r,i){let s=e[n];if(!this._isShallow){const l=Pp(s);if(!fl(r)&&!Pp(r)&&(s=gn(s),r=gn(r)),!Ot(e)&&gi(s)&&!gi(r))return l?!1:(s.value=r,!0)}const a=Ot(e)&&KX(n)?Number(n)t,Aw=t=>Reflect.getPrototypeOf(t);function Q3e(t,e,n){return function(...r){const i=this.__v_raw,s=gn(i),a=P1(s),o=t==="entries"||t===Symbol.iterator&&a,l=t==="keys"&&a,u=i[t](...r),c=n?fN:e?hN:Pa;return!e&&Ma(s,"iterate",l?dN:xv),{next(){const{value:d,done:f}=u.next();return f?{value:d,done:f}:{value:o?[c(d[0]),c(d[1])]:c(d),done:f}},[Symbol.iterator](){return this}}}}function Gw(t){return function(...e){return t==="delete"?!1:t==="clear"?void 0:this}}function _3e(t,e){const n={get(i){const s=this.__v_raw,a=gn(s),o=gn(i);t||(Ba(i,o)&&Ma(a,"get",i),Ma(a,"get",o));const{has:l}=Aw(a),u=e?fN:t?hN:Pa;if(l.call(a,i))return u(s.get(i));if(l.call(a,o))return u(s.get(o));s!==a&&s.get(i)},get size(){const i=this.__v_raw;return!t&&Ma(gn(i),"iterate",xv),Reflect.get(i,"size",i)},has(i){const s=this.__v_raw,a=gn(s),o=gn(i);return t||(Ba(i,o)&&Ma(a,"has",i),Ma(a,"has",o)),i===o?s.has(i):s.has(i)||s.has(o)},forEach(i,s){const a=this,o=a.__v_raw,l=gn(o),u=e?fN:t?hN:Pa;return!t&&Ma(l,"iterate",xv),o.forEach((c,d)=>i.call(s,u(c),u(d),a))}};return Ar(n,t?{add:Gw("add"),set:Gw("set"),delete:Gw("delete"),clear:Gw("clear")}:{add(i){!e&&!fl(i)&&!Pp(i)&&(i=gn(i));const s=gn(this);return Aw(s).has.call(s,i)||(s.add(i),Zd(s,"add",i,i)),this},set(i,s){!e&&!fl(s)&&!Pp(s)&&(s=gn(s));const a=gn(this),{has:o,get:l}=Aw(a);let u=o.call(a,i);u||(i=gn(i),u=o.call(a,i));const c=l.call(a,i);return a.set(i,s),u?Ba(s,c)&&Zd(a,"set",i,s):Zd(a,"add",i,s),this},delete(i){const s=gn(this),{has:a,get:o}=Aw(s);let l=a.call(s,i);l||(i=gn(i),l=a.call(s,i)),o&&o.call(s,i);const u=s.delete(i);return l&&Zd(s,"delete",i,void 0),u},clear(){const i=gn(this),s=i.size!==0,a=i.clear();return s&&Zd(i,"clear",void 0,void 0),a}}),["keys","values","entries",Symbol.iterator].forEach(i=>{n[i]=Q3e(i,t,e)}),n}function ZR(t,e){const n=_3e(t,e);return(r,i,s)=>i==="__v_isReactive"?!t:i==="__v_isReadonly"?t:i==="__v_raw"?r:Reflect.get(lr(n,i)&&i in r?n:r,i,s)}const $3e={get:ZR(!1,!1)},exe={get:ZR(!1,!0)},txe={get:ZR(!0,!1)},nxe={get:ZR(!0,!0)},nie=new WeakMap,rie=new WeakMap,iie=new WeakMap,sie=new WeakMap;function rxe(t){switch(t){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ixe(t){return t.__v_skip||!Object.isExtensible(t)?0:rxe(P3e(t))}function Go(t){return Pp(t)?t:JR(t,!1,J3e,$3e,nie)}function ZX(t){return JR(t,!1,B3e,exe,rie)}function JX(t){return JR(t,!0,Y3e,txe,iie)}function sxe(t){return JR(t,!0,H3e,nxe,sie)}function JR(t,e,n,r,i){if(!Ur(t)||t.__v_raw&&!(e&&t.__v_isReactive))return t;const s=i.get(t);if(s)return s;const a=ixe(t);if(a===0)return t;const o=new Proxy(t,a===2?r:n);return i.set(t,o),o}function Iu(t){return Pp(t)?Iu(t.__v_raw):!!(t&&t.__v_isReactive)}function Pp(t){return!!(t&&t.__v_isReadonly)}function fl(t){return!!(t&&t.__v_isShallow)}function u0(t){return t?!!t.__v_raw:!1}function gn(t){const e=t&&t.__v_raw;return e?gn(e):t}function YR(t){return!lr(t,"__v_skip")&&Object.isExtensible(t)&&Dre(t,"__v_skip",!0),t}const Pa=t=>Ur(t)?Go(t):t,hN=t=>Ur(t)?JX(t):t;function gi(t){return t?t.__v_isRef===!0:!1}function ze(t){return aie(t,!1)}function c0(t){return aie(t,!0)}function aie(t,e){return gi(t)?t:new axe(t,e)}class axe{constructor(e,n){this.dep=new FR,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?e:gn(e),this._value=n?e:Pa(e),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(e){const n=this._rawValue,r=this.__v_isShallow||fl(e)||Pp(e);e=r?e:gn(e),Ba(e,n)&&(this._rawValue=e,this._value=r?e:Pa(e),this.dep.trigger())}}function oxe(t){t.dep&&t.dep.trigger()}function Ls(t){return gi(t)?t.value:t}function lxe(t){return Yt(t)?t():Ls(t)}const uxe={get:(t,e,n)=>e==="__v_raw"?t:Ls(Reflect.get(t,e,n)),set:(t,e,n,r)=>{const i=t[e];return gi(i)&&!gi(n)?(i.value=n,!0):Reflect.set(t,e,n,r)}};function YX(t){return Iu(t)?t:new Proxy(t,uxe)}class cxe{constructor(e){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new FR,{get:r,set:i}=e(n.track.bind(n),n.trigger.bind(n));this._get=r,this._set=i}get value(){return this._value=this._get()}set value(e){this._set(e)}}function oie(t){return new cxe(t)}function lie(t){const e=Ot(t)?new Array(t.length):{};for(const n in t)e[n]=cie(t,n);return e}class dxe{constructor(e,n,r){this._object=e,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0}get value(){const e=this._object[this._key];return this._value=e===void 0?this._defaultValue:e}set value(e){this._object[this._key]=e}get dep(){return A3e(gn(this._object),this._key)}}class fxe{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function uie(t,e,n){return gi(t)?t:Yt(t)?new fxe(t):Ur(t)&&arguments.length>1?cie(t,e,n):ze(t)}function cie(t,e,n){const r=t[e];return gi(r)?r:new dxe(t,e,n)}class hxe{constructor(e,n,r){this.fn=e,this.setter=n,this._value=void 0,this.dep=new FR(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=qx-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&Br!==this)return Zre(this,!0),!0}get value(){const e=this.dep.track();return Bre(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}function pxe(t,e,n=!1){let r,i;return Yt(t)?r=t:(r=t.get,i=t.set),new hxe(r,i,n)}const mxe={GET:"get",HAS:"has",ITERATE:"iterate"},vxe={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"},Fw={},PM=new WeakMap;let Eh;function gxe(){return Eh}function die(t,e=!1,n=Eh){if(n){let r=PM.get(n);r||PM.set(n,r=[]),r.push(t)}}function bxe(t,e,n=Wn){const{immediate:r,deep:i,once:s,scheduler:a,augmentJob:o,call:l}=n,u=x=>i?x:fl(x)||i===!1||i===0?Jd(x,1):Jd(x);let c,d,f,h,p=!1,m=!1;if(gi(t)?(d=()=>t.value,p=fl(t)):Iu(t)?(d=()=>u(t),p=!0):Ot(t)?(m=!0,p=t.some(x=>Iu(x)||fl(x)),d=()=>t.map(x=>{if(gi(x))return x.value;if(Iu(x))return u(x);if(Yt(x))return l?l(x,2):x()})):Yt(t)?e?d=l?()=>l(t,2):t:d=()=>{if(f){Yp();try{f()}finally{Bp()}}const x=Eh;Eh=c;try{return l?l(t,3,[h]):t(h)}finally{Eh=x}}:d=dl,e&&i){const x=d,T=i===!0?1/0:i;d=()=>Jd(x(),T)}const v=AX(),g=()=>{c.stop(),v&&v.active&&XX(v.effects,c)};if(s&&e){const x=e;e=(...T)=>{x(...T),g()}}let b=m?new Array(t.length).fill(Fw):Fw;const y=x=>{if(!(!(c.flags&1)||!c.dirty&&!x))if(e){const T=c.run();if(i||p||(m?T.some((M,E)=>Ba(M,b[E])):Ba(T,b))){f&&f();const M=Eh;Eh=c;try{const E=[T,b===Fw?void 0:m&&b[0]===Fw?[]:b,h];l?l(e,3,E):e(...E),b=T}finally{Eh=M}}}else c.run()};return o&&o(y),c=new Kx(d),c.scheduler=a?()=>a(y,!1):y,h=x=>die(x,!1,c),f=c.onStop=()=>{const x=PM.get(c);if(x){if(l)l(x,4);else for(const T of x)T();PM.delete(c)}},e?r?y(!0):b=c.run():a?a(y.bind(null,!0),!0):c.run(),g.pause=c.pause.bind(c),g.resume=c.resume.bind(c),g.stop=g,g}function Jd(t,e=1/0,n){if(e<=0||!Ur(t)||t.__v_skip||(n=n||new Set,n.has(t)))return t;if(n.add(t),e--,gi(t))Jd(t.value,e,n);else if(Ot(t))for(let r=0;r{Jd(r,e,n)});else if(DR(t)){for(const r in t)Jd(t[r],e,n);for(const r of Object.getOwnPropertySymbols(t))Object.prototype.propertyIsEnumerable.call(t,r)&&Jd(t[r],e,n)}return t}/** +**/let Ja;class WX{constructor(e=!1){this.detached=e,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=Ja,!e&&Ja&&(this.index=(Ja.scopes||(Ja.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let e,n;if(this.scopes)for(e=0,n=this.scopes.length;e0)return;if(A3){let e=A3;for(A3=void 0;e;){const n=e.next;e.next=void 0,e.flags&=-9,e=n}}let t;for(;W3;){let e=W3;for(W3=void 0;e;){const n=e.next;if(e.next=void 0,e.flags&=-9,e.flags&1)try{e.trigger()}catch(r){t||(t=r)}e=n}}if(t)throw t}function Zre(t){for(let e=t.deps;e;e=e.nextDep)e.version=-1,e.prevActiveLink=e.dep.activeLink,e.dep.activeLink=e}function Jre(t){let e,n=t.depsTail,r=n;for(;r;){const i=r.prevDep;r.version===-1?(r===n&&(n=i),ZX(r),q3e(r)):e=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=i}t.deps=e,t.depsTail=n}function cN(t){for(let e=t.deps;e;e=e.nextDep)if(e.dep.version!==e.version||e.dep.computed&&(Yre(e.dep.computed)||e.dep.version!==e.version))return!0;return!!t._dirty}function Yre(t){if(t.flags&4&&!(t.flags&16)||(t.flags&=-17,t.globalVersion===Kx))return;t.globalVersion=Kx;const e=t.dep;if(t.flags|=2,e.version>0&&!t.isSSR&&t.deps&&!cN(t)){t.flags&=-3;return}const n=Br,r=Ou;Br=t,Ou=!0;try{Zre(t);const i=t.fn(t._value);(e.version===0||Ba(i,t._value))&&(t._value=i,e.version++)}catch(i){throw e.version++,i}finally{Br=n,Ou=r,Jre(t),t.flags&=-3}}function ZX(t,e=!1){const{dep:n,prevSub:r,nextSub:i}=t;if(r&&(r.nextSub=i,t.prevSub=void 0),i&&(i.prevSub=r,t.nextSub=void 0),n.subs===t&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let s=n.computed.deps;s;s=s.nextDep)ZX(s,!0)}!e&&!--n.sc&&n.map&&n.map.delete(n.key)}function q3e(t){const{prevDep:e,nextDep:n}=t;e&&(e.nextDep=n,t.prevDep=void 0),n&&(n.prevDep=e,t.nextDep=void 0)}function D3e(t,e){t.effect instanceof Cx&&(t=t.effect.fn);const n=new Cx(t);e&&Ar(n,e);try{n.run()}catch(i){throw n.stop(),i}const r=n.run.bind(n);return r.effect=n,r}function W3e(t){t.effect.stop()}let Ou=!0;const Bre=[];function Yp(){Bre.push(Ou),Ou=!1}function Bp(){const t=Bre.pop();Ou=t===void 0?!0:t}function gG(t){const{cleanup:e}=t;if(t.cleanup=void 0,e){const n=Br;Br=void 0;try{e()}finally{Br=n}}}let Kx=0;class A3e{constructor(e,n){this.sub=e,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class FR{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(e){if(!Br||!Ou||Br===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==Br)n=this.activeLink=new A3e(Br,this),Br.deps?(n.prevDep=Br.depsTail,Br.depsTail.nextDep=n,Br.depsTail=n):Br.deps=Br.depsTail=n,Hre(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=Br.depsTail,n.nextDep=void 0,Br.depsTail.nextDep=n,Br.depsTail=n,Br.deps===n&&(Br.deps=r)}return n}trigger(e){this.version++,Kx++,this.notify(e)}notify(e){FX();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{jX()}}}function Hre(t){if(t.dep.sc++,t.sub.flags&4){const e=t.dep.computed;if(e&&!t.dep.subs){e.flags|=20;for(let r=e.deps;r;r=r.nextDep)Hre(r)}const n=t.dep.subs;n!==t&&(t.prevSub=n,n&&(n.nextSub=t)),t.dep.subs=t}}const EM=new WeakMap,xv=Symbol(""),dN=Symbol(""),qx=Symbol("");function Ma(t,e,n){if(Ou&&Br){let r=EM.get(t);r||EM.set(t,r=new Map);let i=r.get(n);i||(r.set(n,i=new FR),i.map=r,i.key=n),i.track()}}function Zd(t,e,n,r,i,s){const a=EM.get(t);if(!a){Kx++;return}const o=l=>{l&&l.trigger()};if(FX(),e==="clear")a.forEach(o);else{const l=Ot(t),u=l&&qX(n);if(l&&n==="length"){const c=Number(r);a.forEach((d,f)=>{(f==="length"||f===qx||!Xu(f)&&f>=c)&&o(d)})}else switch((n!==void 0||a.has(void 0))&&o(a.get(n)),u&&o(a.get(qx)),e){case"add":l?u&&o(a.get("length")):(o(a.get(xv)),P1(t)&&o(a.get(dN)));break;case"delete":l||(o(a.get(xv)),P1(t)&&o(a.get(dN)));break;case"set":P1(t)&&o(a.get(xv));break}}jX()}function G3e(t,e){const n=EM.get(t);return n&&n.get(e)}function Y0(t){const e=gn(t);return e===t?e:(Ma(e,"iterate",qx),dl(t)?e:e.map(Pa))}function jR(t){return Ma(t=gn(t),"iterate",qx),t}const F3e={__proto__:null,[Symbol.iterator](){return zz(this,Symbol.iterator,Pa)},concat(...t){return Y0(this).concat(...t.map(e=>Ot(e)?Y0(e):e))},entries(){return zz(this,"entries",t=>(t[1]=Pa(t[1]),t))},every(t,e){return gd(this,"every",t,e,void 0,arguments)},filter(t,e){return gd(this,"filter",t,e,n=>n.map(Pa),arguments)},find(t,e){return gd(this,"find",t,e,Pa,arguments)},findIndex(t,e){return gd(this,"findIndex",t,e,void 0,arguments)},findLast(t,e){return gd(this,"findLast",t,e,Pa,arguments)},findLastIndex(t,e){return gd(this,"findLastIndex",t,e,void 0,arguments)},forEach(t,e){return gd(this,"forEach",t,e,void 0,arguments)},includes(...t){return kz(this,"includes",t)},indexOf(...t){return kz(this,"indexOf",t)},join(t){return Y0(this).join(t)},lastIndexOf(...t){return kz(this,"lastIndexOf",t)},map(t,e){return gd(this,"map",t,e,void 0,arguments)},pop(){return hS(this,"pop")},push(...t){return hS(this,"push",t)},reduce(t,...e){return bG(this,"reduce",t,e)},reduceRight(t,...e){return bG(this,"reduceRight",t,e)},shift(){return hS(this,"shift")},some(t,e){return gd(this,"some",t,e,void 0,arguments)},splice(...t){return hS(this,"splice",t)},toReversed(){return Y0(this).toReversed()},toSorted(t){return Y0(this).toSorted(t)},toSpliced(...t){return Y0(this).toSpliced(...t)},unshift(...t){return hS(this,"unshift",t)},values(){return zz(this,"values",Pa)}};function zz(t,e,n){const r=jR(t),i=r[e]();return r!==t&&!dl(t)&&(i._next=i.next,i.next=()=>{const s=i._next();return s.value&&(s.value=n(s.value)),s}),i}const j3e=Array.prototype;function gd(t,e,n,r,i,s){const a=jR(t),o=a!==t&&!dl(t),l=a[e];if(l!==j3e[e]){const d=l.apply(t,s);return o?Pa(d):d}let u=n;a!==t&&(o?u=function(d,f){return n.call(this,Pa(d),f,t)}:n.length>2&&(u=function(d,f){return n.call(this,d,f,t)}));const c=l.call(a,u,r);return o&&i?i(c):c}function bG(t,e,n,r){const i=jR(t);let s=n;return i!==t&&(dl(t)?n.length>3&&(s=function(a,o,l){return n.call(this,a,o,l,t)}):s=function(a,o,l){return n.call(this,a,Pa(o),l,t)}),i[e](s,...r)}function kz(t,e,n){const r=gn(t);Ma(r,"iterate",qx);const i=r[e](...n);return(i===-1||i===!1)&&u0(n[0])?(n[0]=gn(n[0]),r[e](...n)):i}function hS(t,e,n=[]){Yp(),FX();const r=gn(t)[e].apply(t,n);return jX(),Bp(),r}const Z3e=qR("__proto__,__v_isRef,__isVue"),Qre=new Set(Object.getOwnPropertyNames(Symbol).filter(t=>t!=="arguments"&&t!=="caller").map(t=>Symbol[t]).filter(Xu));function J3e(t){Xu(t)||(t=String(t));const e=gn(this);return Ma(e,"has",t),e.hasOwnProperty(t)}class _re{constructor(e=!1,n=!1){this._isReadonly=e,this._isShallow=n}get(e,n,r){if(n==="__v_skip")return e.__v_skip;const i=this._isReadonly,s=this._isShallow;if(n==="__v_isReactive")return!i;if(n==="__v_isReadonly")return i;if(n==="__v_isShallow")return s;if(n==="__v_raw")return r===(i?s?iie:rie:s?nie:tie).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(r)?e:void 0;const a=Ot(e);if(!i){let l;if(a&&(l=F3e[n]))return l;if(n==="hasOwnProperty")return J3e}const o=Reflect.get(e,n,gi(e)?e:r);return(Xu(n)?Qre.has(n):Z3e(n))||(i||Ma(e,"get",n),s)?o:gi(o)?a&&qX(n)?o:o.value:Ur(o)?i?YX(o):Ao(o):o}}class $re extends _re{constructor(e=!1){super(!1,e)}set(e,n,r,i){let s=e[n];if(!this._isShallow){const l=Pp(s);if(!dl(r)&&!Pp(r)&&(s=gn(s),r=gn(r)),!Ot(e)&&gi(s)&&!gi(r))return l?!1:(s.value=r,!0)}const a=Ot(e)&&qX(n)?Number(n)t,Aw=t=>Reflect.getPrototypeOf(t);function _3e(t,e,n){return function(...r){const i=this.__v_raw,s=gn(i),a=P1(s),o=t==="entries"||t===Symbol.iterator&&a,l=t==="keys"&&a,u=i[t](...r),c=n?fN:e?hN:Pa;return!e&&Ma(s,"iterate",l?dN:xv),{next(){const{value:d,done:f}=u.next();return f?{value:d,done:f}:{value:o?[c(d[0]),c(d[1])]:c(d),done:f}},[Symbol.iterator](){return this}}}}function Gw(t){return function(...e){return t==="delete"?!1:t==="clear"?void 0:this}}function $3e(t,e){const n={get(i){const s=this.__v_raw,a=gn(s),o=gn(i);t||(Ba(i,o)&&Ma(a,"get",i),Ma(a,"get",o));const{has:l}=Aw(a),u=e?fN:t?hN:Pa;if(l.call(a,i))return u(s.get(i));if(l.call(a,o))return u(s.get(o));s!==a&&s.get(i)},get size(){const i=this.__v_raw;return!t&&Ma(gn(i),"iterate",xv),Reflect.get(i,"size",i)},has(i){const s=this.__v_raw,a=gn(s),o=gn(i);return t||(Ba(i,o)&&Ma(a,"has",i),Ma(a,"has",o)),i===o?s.has(i):s.has(i)||s.has(o)},forEach(i,s){const a=this,o=a.__v_raw,l=gn(o),u=e?fN:t?hN:Pa;return!t&&Ma(l,"iterate",xv),o.forEach((c,d)=>i.call(s,u(c),u(d),a))}};return Ar(n,t?{add:Gw("add"),set:Gw("set"),delete:Gw("delete"),clear:Gw("clear")}:{add(i){!e&&!dl(i)&&!Pp(i)&&(i=gn(i));const s=gn(this);return Aw(s).has.call(s,i)||(s.add(i),Zd(s,"add",i,i)),this},set(i,s){!e&&!dl(s)&&!Pp(s)&&(s=gn(s));const a=gn(this),{has:o,get:l}=Aw(a);let u=o.call(a,i);u||(i=gn(i),u=o.call(a,i));const c=l.call(a,i);return a.set(i,s),u?Ba(s,c)&&Zd(a,"set",i,s):Zd(a,"add",i,s),this},delete(i){const s=gn(this),{has:a,get:o}=Aw(s);let l=a.call(s,i);l||(i=gn(i),l=a.call(s,i)),o&&o.call(s,i);const u=s.delete(i);return l&&Zd(s,"delete",i,void 0),u},clear(){const i=gn(this),s=i.size!==0,a=i.clear();return s&&Zd(i,"clear",void 0,void 0),a}}),["keys","values","entries",Symbol.iterator].forEach(i=>{n[i]=_3e(i,t,e)}),n}function ZR(t,e){const n=$3e(t,e);return(r,i,s)=>i==="__v_isReactive"?!t:i==="__v_isReadonly"?t:i==="__v_raw"?r:Reflect.get(lr(n,i)&&i in r?n:r,i,s)}const exe={get:ZR(!1,!1)},txe={get:ZR(!1,!0)},nxe={get:ZR(!0,!1)},rxe={get:ZR(!0,!0)},tie=new WeakMap,nie=new WeakMap,rie=new WeakMap,iie=new WeakMap;function ixe(t){switch(t){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function sxe(t){return t.__v_skip||!Object.isExtensible(t)?0:ixe(R3e(t))}function Ao(t){return Pp(t)?t:JR(t,!1,Y3e,exe,tie)}function JX(t){return JR(t,!1,H3e,txe,nie)}function YX(t){return JR(t,!0,B3e,nxe,rie)}function axe(t){return JR(t,!0,Q3e,rxe,iie)}function JR(t,e,n,r,i){if(!Ur(t)||t.__v_raw&&!(e&&t.__v_isReactive))return t;const s=i.get(t);if(s)return s;const a=sxe(t);if(a===0)return t;const o=new Proxy(t,a===2?r:n);return i.set(t,o),o}function Iu(t){return Pp(t)?Iu(t.__v_raw):!!(t&&t.__v_isReactive)}function Pp(t){return!!(t&&t.__v_isReadonly)}function dl(t){return!!(t&&t.__v_isShallow)}function u0(t){return t?!!t.__v_raw:!1}function gn(t){const e=t&&t.__v_raw;return e?gn(e):t}function YR(t){return!lr(t,"__v_skip")&&Object.isExtensible(t)&&qre(t,"__v_skip",!0),t}const Pa=t=>Ur(t)?Ao(t):t,hN=t=>Ur(t)?YX(t):t;function gi(t){return t?t.__v_isRef===!0:!1}function ze(t){return sie(t,!1)}function c0(t){return sie(t,!0)}function sie(t,e){return gi(t)?t:new oxe(t,e)}class oxe{constructor(e,n){this.dep=new FR,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?e:gn(e),this._value=n?e:Pa(e),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(e){const n=this._rawValue,r=this.__v_isShallow||dl(e)||Pp(e);e=r?e:gn(e),Ba(e,n)&&(this._rawValue=e,this._value=r?e:Pa(e),this.dep.trigger())}}function lxe(t){t.dep&&t.dep.trigger()}function Ls(t){return gi(t)?t.value:t}function uxe(t){return Yt(t)?t():Ls(t)}const cxe={get:(t,e,n)=>e==="__v_raw"?t:Ls(Reflect.get(t,e,n)),set:(t,e,n,r)=>{const i=t[e];return gi(i)&&!gi(n)?(i.value=n,!0):Reflect.set(t,e,n,r)}};function BX(t){return Iu(t)?t:new Proxy(t,cxe)}class dxe{constructor(e){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new FR,{get:r,set:i}=e(n.track.bind(n),n.trigger.bind(n));this._get=r,this._set=i}get value(){return this._value=this._get()}set value(e){this._set(e)}}function aie(t){return new dxe(t)}function oie(t){const e=Ot(t)?new Array(t.length):{};for(const n in t)e[n]=uie(t,n);return e}class fxe{constructor(e,n,r){this._object=e,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0}get value(){const e=this._object[this._key];return this._value=e===void 0?this._defaultValue:e}set value(e){this._object[this._key]=e}get dep(){return G3e(gn(this._object),this._key)}}class hxe{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function lie(t,e,n){return gi(t)?t:Yt(t)?new hxe(t):Ur(t)&&arguments.length>1?uie(t,e,n):ze(t)}function uie(t,e,n){const r=t[e];return gi(r)?r:new fxe(t,e,n)}class pxe{constructor(e,n,r){this.fn=e,this.setter=n,this._value=void 0,this.dep=new FR(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Kx-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&Br!==this)return jre(this,!0),!0}get value(){const e=this.dep.track();return Yre(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}function mxe(t,e,n=!1){let r,i;return Yt(t)?r=t:(r=t.get,i=t.set),new pxe(r,i,n)}const vxe={GET:"get",HAS:"has",ITERATE:"iterate"},gxe={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"},Fw={},MM=new WeakMap;let Eh;function bxe(){return Eh}function cie(t,e=!1,n=Eh){if(n){let r=MM.get(n);r||MM.set(n,r=[]),r.push(t)}}function yxe(t,e,n=Wn){const{immediate:r,deep:i,once:s,scheduler:a,augmentJob:o,call:l}=n,u=x=>i?x:dl(x)||i===!1||i===0?Jd(x,1):Jd(x);let c,d,f,h,p=!1,m=!1;if(gi(t)?(d=()=>t.value,p=dl(t)):Iu(t)?(d=()=>u(t),p=!0):Ot(t)?(m=!0,p=t.some(x=>Iu(x)||dl(x)),d=()=>t.map(x=>{if(gi(x))return x.value;if(Iu(x))return u(x);if(Yt(x))return l?l(x,2):x()})):Yt(t)?e?d=l?()=>l(t,2):t:d=()=>{if(f){Yp();try{f()}finally{Bp()}}const x=Eh;Eh=c;try{return l?l(t,3,[h]):t(h)}finally{Eh=x}}:d=cl,e&&i){const x=d,T=i===!0?1/0:i;d=()=>Jd(x(),T)}const v=GX(),g=()=>{c.stop(),v&&v.active&&CX(v.effects,c)};if(s&&e){const x=e;e=(...T)=>{x(...T),g()}}let b=m?new Array(t.length).fill(Fw):Fw;const y=x=>{if(!(!(c.flags&1)||!c.dirty&&!x))if(e){const T=c.run();if(i||p||(m?T.some((M,E)=>Ba(M,b[E])):Ba(T,b))){f&&f();const M=Eh;Eh=c;try{const E=[T,b===Fw?void 0:m&&b[0]===Fw?[]:b,h];l?l(e,3,E):e(...E),b=T}finally{Eh=M}}}else c.run()};return o&&o(y),c=new Cx(d),c.scheduler=a?()=>a(y,!1):y,h=x=>cie(x,!1,c),f=c.onStop=()=>{const x=MM.get(c);if(x){if(l)l(x,4);else for(const T of x)T();MM.delete(c)}},e?r?y(!0):b=c.run():a?a(y.bind(null,!0),!0):c.run(),g.pause=c.pause.bind(c),g.resume=c.resume.bind(c),g.stop=g,g}function Jd(t,e=1/0,n){if(e<=0||!Ur(t)||t.__v_skip||(n=n||new Set,n.has(t)))return t;if(n.add(t),e--,gi(t))Jd(t.value,e,n);else if(Ot(t))for(let r=0;r{Jd(r,e,n)});else if(DR(t)){for(const r in t)Jd(t[r],e,n);for(const r of Object.getOwnPropertySymbols(t))Object.prototype.propertyIsEnumerable.call(t,r)&&Jd(t[r],e,n)}return t}/** * @vue/runtime-core v3.5.13 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/const fie=[];function yxe(t){fie.push(t)}function Sxe(){fie.pop()}function xxe(t,e){}const Txe={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE",APP_UNMOUNT_CLEANUP:16,16:"APP_UNMOUNT_CLEANUP"},wxe={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush",15:"component update",16:"app unmount cleanup function"};function $b(t,e,n,r){try{return r?t(...r):t()}catch(i){d0(i,e,n)}}function Yl(t,e,n,r){if(Yt(t)){const i=$b(t,e,n,r);return i&&CX(i)&&i.catch(s=>{d0(s,e,n)}),i}if(Ot(t)){const i=[];for(let s=0;s>>1,i=Ha[r],s=Ax(i);s=Ax(n)?Ha.push(t):Ha.splice(Mxe(e),0,t),t.flags|=1,pie()}}function pie(){RM||(RM=hie.then(mie))}function Wx(t){Ot(t)?z1.push(...t):Mh&&t.id===-1?Mh.splice(Wg+1,0,t):t.flags&1||(z1.push(t),t.flags|=1),pie()}function xG(t,e,n=Tc+1){for(;nAx(n)-Ax(r));if(z1.length=0,Mh){Mh.push(...e);return}for(Mh=e,Wg=0;Wgt.id==null?t.flags&2?-1:1/0:t.id;function mie(t){const e=dl;try{for(Tc=0;TcAg.emit(i,...s)),jw=[]):typeof window<"u"&&window.HTMLElement&&!((r=(n=window.navigator)==null?void 0:n.userAgent)!=null&&r.includes("jsdom"))?((e.__VUE_DEVTOOLS_HOOK_REPLAY__=e.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(s=>{vie(s,e)}),setTimeout(()=>{Ag||(e.__VUE_DEVTOOLS_HOOK_REPLAY__=null,jw=[])},3e3)):jw=[]}let ws=null,BR=null;function Gx(t){const e=ws;return ws=t,BR=t&&t.type.__scopeId||null,e}function Pxe(t){BR=t}function Rxe(){BR=null}const Vxe=t=>ft;function ft(t,e=ws,n){if(!e||t._n)return t;const r=(...i)=>{r._d&&xN(-1);const s=Gx(e);let a;try{a=t(...i)}finally{Gx(s),r._d&&xN(1)}return a};return r._n=!0,r._c=!0,r._d=!0,r}function hn(t,e){if(ws===null)return t;const n=sT(ws),r=t.dirs||(t.dirs=[]);for(let i=0;it.__isTeleport,F3=t=>t&&(t.disabled||t.disabled===""),TG=t=>t&&(t.defer||t.defer===""),wG=t=>typeof SVGElement<"u"&&t instanceof SVGElement,EG=t=>typeof MathMLElement=="function"&&t instanceof MathMLElement,pN=(t,e)=>{const n=t&&t.to;return $r(n)?e?e(n):null:n},yie={name:"Teleport",__isTeleport:!0,process(t,e,n,r,i,s,a,o,l,u){const{mc:c,pc:d,pbc:f,o:{insert:h,querySelector:p,createText:m,createComment:v}}=u,g=F3(e.props);let{shapeFlag:b,children:y,dynamicChildren:x}=e;if(t==null){const T=e.el=m(""),M=e.anchor=m("");h(T,n,r),h(M,n,r);const E=(P,R)=>{b&16&&(i&&i.isCE&&(i.ce._teleportTarget=P),c(y,P,R,i,s,a,o,l))},S=()=>{const P=e.target=pN(e.props,p),R=xie(P,e,m,h);P&&(a!=="svg"&&wG(P)?a="svg":a!=="mathml"&&EG(P)&&(a="mathml"),g||(E(P,R),f7(e,!1)))};g&&(E(n,M),f7(e,!0)),TG(e.props)?gs(()=>{S(),e.el.__isMounted=!0},s):S()}else{if(TG(e.props)&&!t.el.__isMounted){gs(()=>{yie.process(t,e,n,r,i,s,a,o,l,u),delete t.el.__isMounted},s);return}e.el=t.el,e.targetStart=t.targetStart;const T=e.anchor=t.anchor,M=e.target=t.target,E=e.targetAnchor=t.targetAnchor,S=F3(t.props),P=S?n:M,R=S?T:E;if(a==="svg"||wG(M)?a="svg":(a==="mathml"||EG(M))&&(a="mathml"),x?(f(t.dynamicChildren,x,P,i,s,a,o),sC(t,e,!0)):l||d(t,e,P,R,i,s,a,o,!1),g)S?e.props&&t.props&&e.props.to!==t.props.to&&(e.props.to=t.props.to):Zw(e,n,T,u,1);else if((e.props&&e.props.to)!==(t.props&&t.props.to)){const V=e.target=pN(e.props,p);V&&Zw(e,V,null,u,0)}else S&&Zw(e,M,E,u,1);f7(e,g)}},remove(t,e,n,{um:r,o:{remove:i}},s){const{shapeFlag:a,children:o,anchor:l,targetStart:u,targetAnchor:c,target:d,props:f}=t;if(d&&(i(u),i(c)),s&&i(l),a&16){const h=s||!F3(f);for(let p=0;p{t.isMounted=!0}),ey(()=>{t.isUnmounting=!0}),t}const zl=[Function,Array],QX={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:zl,onEnter:zl,onAfterEnter:zl,onEnterCancelled:zl,onBeforeLeave:zl,onLeave:zl,onAfterLeave:zl,onLeaveCancelled:zl,onBeforeAppear:zl,onAppear:zl,onAfterAppear:zl,onAppearCancelled:zl},Tie=t=>{const e=t.subTree;return e.component?Tie(e.component):e},kxe={name:"BaseTransition",props:QX,setup(t,{slots:e}){const n=Fo(),r=HX();return()=>{const i=e.default&&HR(e.default(),!0);if(!i||!i.length)return;const s=wie(i),a=gn(t),{mode:o}=a;if(r.isLeaving)return Oz(s);const l=MG(s);if(!l)return Oz(s);let u=_1(l,a,r,n,d=>u=d);l.type!==rs&&ff(l,u);let c=n.subTree&&MG(n.subTree);if(c&&c.type!==rs&&!Tu(l,c)&&Tie(n).type!==rs){let d=_1(c,a,r,n);if(ff(c,d),o==="out-in"&&l.type!==rs)return r.isLeaving=!0,d.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete d.afterLeave,c=void 0},Oz(s);o==="in-out"&&l.type!==rs?d.delayLeave=(f,h,p)=>{const m=Mie(r,c);m[String(c.key)]=c,f[Ph]=()=>{h(),f[Ph]=void 0,delete u.delayedLeave,c=void 0},u.delayedLeave=()=>{p(),delete u.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return s}}};function wie(t){let e=t[0];if(t.length>1){for(const n of t)if(n.type!==rs){e=n;break}}return e}const Eie=kxe;function Mie(t,e){const{leavingVNodes:n}=t;let r=n.get(e.type);return r||(r=Object.create(null),n.set(e.type,r)),r}function _1(t,e,n,r,i){const{appear:s,mode:a,persisted:o=!1,onBeforeEnter:l,onEnter:u,onAfterEnter:c,onEnterCancelled:d,onBeforeLeave:f,onLeave:h,onAfterLeave:p,onLeaveCancelled:m,onBeforeAppear:v,onAppear:g,onAfterAppear:b,onAppearCancelled:y}=e,x=String(t.key),T=Mie(n,t),M=(P,R)=>{P&&Yl(P,r,9,R)},E=(P,R)=>{const V=R[1];M(P,R),Ot(P)?P.every(z=>z.length<=1)&&V():P.length<=1&&V()},S={mode:a,persisted:o,beforeEnter(P){let R=l;if(!n.isMounted)if(s)R=v||l;else return;P[Ph]&&P[Ph](!0);const V=T[x];V&&Tu(t,V)&&V.el[Ph]&&V.el[Ph](),M(R,[P])},enter(P){let R=u,V=c,z=d;if(!n.isMounted)if(s)R=g||u,V=b||c,z=y||d;else return;let k=!1;const N=P[Jw]=q=>{k||(k=!0,q?M(z,[P]):M(V,[P]),S.delayedLeave&&S.delayedLeave(),P[Jw]=void 0)};R?E(R,[P,N]):N()},leave(P,R){const V=String(t.key);if(P[Jw]&&P[Jw](!0),n.isUnmounting)return R();M(f,[P]);let z=!1;const k=P[Ph]=N=>{z||(z=!0,R(),N?M(m,[P]):M(p,[P]),P[Ph]=void 0,T[V]===t&&delete T[V])};T[V]=t,h?E(h,[P,k]):k()},clone(P){const R=_1(P,e,n,r,i);return i&&i(R),R}};return S}function Oz(t){if(rT(t))return t=Cu(t),t.children=null,t}function MG(t){if(!rT(t))return bie(t.type)&&t.children?wie(t.children):t;const{shapeFlag:e,children:n}=t;if(n){if(e&16)return n[0];if(e&32&&Yt(n.default))return n.default()}}function ff(t,e){t.shapeFlag&6&&t.component?(t.transition=e,ff(t.component.subTree,e)):t.shapeFlag&128?(t.ssContent.transition=e.clone(t.ssContent),t.ssFallback.transition=e.clone(t.ssFallback)):t.transition=e}function HR(t,e=!1,n){let r=[],i=0;for(let s=0;s1)for(let s=0;sAr({name:t.name},e,{setup:t}))():t}function Pie(){const t=Fo();return t?(t.appContext.config.idPrefix||"v")+"-"+t.ids[0]+t.ids[1]++:""}function _X(t){t.ids=[t.ids[0]+t.ids[2]+++"-",0,0]}function Oxe(t){const e=Fo(),n=c0(null);if(e){const i=e.refs===Wn?e.refs={}:e.refs;Object.defineProperty(i,t,{enumerable:!0,get:()=>n.value,set:s=>n.value=s})}return n}function Fx(t,e,n,r,i=!1){if(Ot(t)){t.forEach((p,m)=>Fx(p,e&&(Ot(e)?e[m]:e),n,r,i));return}if(ap(r)&&!i){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&Fx(t,e,n,r.component.subTree);return}const s=r.shapeFlag&4?sT(r.component):r.el,a=i?null:s,{i:o,r:l}=t,u=e&&e.r,c=o.refs===Wn?o.refs={}:o.refs,d=o.setupState,f=gn(d),h=d===Wn?()=>!1:p=>lr(f,p);if(u!=null&&u!==l&&($r(u)?(c[u]=null,h(u)&&(d[u]=null)):gi(u)&&(u.value=null)),Yt(l))$b(l,o,12,[a,c]);else{const p=$r(l),m=gi(l);if(p||m){const v=()=>{if(t.f){const g=p?h(l)?d[l]:c[l]:l.value;i?Ot(g)&&XX(g,s):Ot(g)?g.includes(s)||g.push(s):p?(c[l]=[s],h(l)&&(d[l]=c[l])):(l.value=[s],t.k&&(c[t.k]=l.value))}else p?(c[l]=a,h(l)&&(d[l]=a)):m&&(l.value=a,t.k&&(c[t.k]=a))};a?(v.id=-1,gs(v,n)):v()}}}let PG=!1;const B0=()=>{PG||(console.error("Hydration completed but contains mismatches."),PG=!0)},Ixe=t=>t.namespaceURI.includes("svg")&&t.tagName!=="foreignObject",Uxe=t=>t.namespaceURI.includes("MathML"),Yw=t=>{if(t.nodeType===1){if(Ixe(t))return"svg";if(Uxe(t))return"mathml"}},i1=t=>t.nodeType===8;function Nxe(t){const{mt:e,p:n,o:{patchProp:r,createText:i,nextSibling:s,parentNode:a,remove:o,insert:l,createComment:u}}=t,c=(y,x)=>{if(!x.hasChildNodes()){n(null,y,x),VM(),x._vnode=y;return}d(x.firstChild,y,null,null,null),VM(),x._vnode=y},d=(y,x,T,M,E,S=!1)=>{S=S||!!x.dynamicChildren;const P=i1(y)&&y.data==="[",R=()=>m(y,x,T,M,E,P),{type:V,ref:z,shapeFlag:k,patchFlag:N}=x;let q=y.nodeType;x.el=y,N===-2&&(S=!1,x.dynamicChildren=null);let L=null;switch(V){case op:q!==3?x.children===""?(l(x.el=i(""),a(y),y),L=y):L=R():(y.data!==x.children&&(B0(),y.data=x.children),L=s(y));break;case rs:b(y)?(L=s(y),g(x.el=y.content.firstChild,y,T)):q!==8||P?L=R():L=s(y);break;case wv:if(P&&(y=s(y),q=y.nodeType),q===1||q===3){L=y;const A=!x.children.length;for(let Z=0;Z{S=S||!!x.dynamicChildren;const{type:P,props:R,patchFlag:V,shapeFlag:z,dirs:k,transition:N}=x,q=P==="input"||P==="option";if(q||V!==-1){k&&Mc(x,null,T,"created");let L=!1;if(b(y)){L=$ie(null,N)&&T&&T.vnode.props&&T.vnode.props.appear;const Z=y.content.firstChild;L&&N.beforeEnter(Z),g(Z,y,T),x.el=y=Z}if(z&16&&!(R&&(R.innerHTML||R.textContent))){let Z=h(y.firstChild,x,y,T,M,E,S);for(;Z;){Bw(y,1)||B0();const j=Z;Z=Z.nextSibling,o(j)}}else if(z&8){let Z=x.children;Z[0]===` -`&&(y.tagName==="PRE"||y.tagName==="TEXTAREA")&&(Z=Z.slice(1)),y.textContent!==Z&&(Bw(y,0)||B0(),y.textContent=x.children)}if(R){if(q||!S||V&48){const Z=y.tagName.includes("-");for(const j in R)(q&&(j.endsWith("value")||j==="indeterminate")||tT(j)&&!R1(j)||j[0]==="."||Z)&&r(y,j,null,R[j],void 0,T)}else if(R.onClick)r(y,"onClick",null,R.onClick,void 0,T);else if(V&4&&Iu(R.style))for(const Z in R.style)R.style[Z]}let A;(A=R&&R.onVnodeBeforeMount)&&Ro(A,T,x),k&&Mc(x,null,T,"beforeMount"),((A=R&&R.onVnodeMounted)||k||L)&&lse(()=>{A&&Ro(A,T,x),L&&N.enter(y),k&&Mc(x,null,T,"mounted")},M)}return y.nextSibling},h=(y,x,T,M,E,S,P)=>{P=P||!!x.dynamicChildren;const R=x.children,V=R.length;for(let z=0;z{const{slotScopeIds:P}=x;P&&(E=E?E.concat(P):P);const R=a(y),V=h(s(y),x,R,T,M,E,S);return V&&i1(V)&&V.data==="]"?s(x.anchor=V):(B0(),l(x.anchor=u("]"),R,V),V)},m=(y,x,T,M,E,S)=>{if(Bw(y.parentElement,1)||B0(),x.el=null,S){const V=v(y);for(;;){const z=s(y);if(z&&z!==V)o(z);else break}}const P=s(y),R=a(y);return o(y),n(null,x,R,P,T,M,Yw(R),E),T&&(T.vnode.el=x.el,eV(T,x.el)),P},v=(y,x="[",T="]")=>{let M=0;for(;y;)if(y=s(y),y&&i1(y)&&(y.data===x&&M++,y.data===T)){if(M===0)return s(y);M--}return y},g=(y,x,T)=>{const M=x.parentNode;M&&M.replaceChild(y,x);let E=T;for(;E;)E.vnode.el===x&&(E.vnode.el=E.subTree.el=y),E=E.parent},b=y=>y.nodeType===1&&y.tagName==="TEMPLATE";return[c,d]}const RG="data-allow-mismatch",Lxe={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function Bw(t,e){if(e===0||e===1)for(;t&&!t.hasAttribute(RG);)t=t.parentElement;const n=t&&t.getAttribute(RG);if(n==null)return!1;if(n==="")return!0;{const r=n.split(",");return e===0&&r.includes("children")?!0:n.split(",").includes(Lxe[e])}}const Xxe=AR().requestIdleCallback||(t=>setTimeout(t,1)),Cxe=AR().cancelIdleCallback||(t=>clearTimeout(t)),Kxe=(t=1e4)=>e=>{const n=Xxe(e,{timeout:t});return()=>Cxe(n)};function qxe(t){const{top:e,left:n,bottom:r,right:i}=t.getBoundingClientRect(),{innerHeight:s,innerWidth:a}=window;return(e>0&&e0&&r0&&n0&&i(e,n)=>{const r=new IntersectionObserver(i=>{for(const s of i)if(s.isIntersecting){r.disconnect(),e();break}},t);return n(i=>{if(i instanceof Element){if(qxe(i))return e(),r.disconnect(),!1;r.observe(i)}}),()=>r.disconnect()},Wxe=t=>e=>{if(t){const n=matchMedia(t);if(n.matches)e();else return n.addEventListener("change",e,{once:!0}),()=>n.removeEventListener("change",e)}},Axe=(t=[])=>(e,n)=>{$r(t)&&(t=[t]);let r=!1;const i=a=>{r||(r=!0,s(),e(),a.target.dispatchEvent(new a.constructor(a.type,a)))},s=()=>{n(a=>{for(const o of t)a.removeEventListener(o,i)})};return n(a=>{for(const o of t)a.addEventListener(o,i,{once:!0})}),s};function Gxe(t,e){if(i1(t)&&t.data==="["){let n=1,r=t.nextSibling;for(;r;){if(r.nodeType===1){if(e(r)===!1)break}else if(i1(r))if(r.data==="]"){if(--n===0)break}else r.data==="["&&n++;r=r.nextSibling}}else e(t)}const ap=t=>!!t.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Fxe(t){Yt(t)&&(t={loader:t});const{loader:e,loadingComponent:n,errorComponent:r,delay:i=200,hydrate:s,timeout:a,suspensible:o=!0,onError:l}=t;let u=null,c,d=0;const f=()=>(d++,u=null,h()),h=()=>{let p;return u||(p=u=e().catch(m=>{if(m=m instanceof Error?m:new Error(String(m)),l)return new Promise((v,g)=>{l(m,()=>v(f()),()=>g(m),d+1)});throw m}).then(m=>p!==u&&u?u:(m&&(m.__esModule||m[Symbol.toStringTag]==="Module")&&(m=m.default),c=m,m)))};return pt({name:"AsyncComponentWrapper",__asyncLoader:h,__asyncHydrate(p,m,v){const g=s?()=>{const b=s(v,y=>Gxe(p,y));b&&(m.bum||(m.bum=[])).push(b)}:v;c?g():h().then(()=>!m.isUnmounted&&g())},get __asyncResolved(){return c},setup(){const p=xs;if(_X(p),c)return()=>Iz(c,p);const m=y=>{u=null,d0(y,p,13,!r)};if(o&&p.suspense||$1)return h().then(y=>()=>Iz(y,p)).catch(y=>(m(y),()=>r?xe(r,{error:y}):null));const v=ze(!1),g=ze(),b=ze(!!i);return i&&setTimeout(()=>{b.value=!1},i),a!=null&&setTimeout(()=>{if(!v.value&&!g.value){const y=new Error(`Async component timed out after ${a}ms.`);m(y),g.value=y}},a),h().then(()=>{v.value=!0,p.parent&&rT(p.parent.vnode)&&p.parent.update()}).catch(y=>{m(y),g.value=y}),()=>{if(v.value&&c)return Iz(c,p);if(g.value&&r)return xe(r,{error:g.value});if(n&&!b.value)return xe(n)}}})}function Iz(t,e){const{ref:n,props:r,children:i,ce:s}=e.vnode,a=xe(t,r,i);return a.ref=n,a.ce=s,delete e.vnode.ce,a}const rT=t=>t.type.__isKeepAlive,jxe={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(t,{slots:e}){const n=Fo(),r=n.ctx;if(!r.renderer)return()=>{const b=e.default&&e.default();return b&&b.length===1?b[0]:b};const i=new Map,s=new Set;let a=null;const o=n.suspense,{renderer:{p:l,m:u,um:c,o:{createElement:d}}}=r,f=d("div");r.activate=(b,y,x,T,M)=>{const E=b.component;u(b,y,x,0,o),l(E.vnode,b,y,x,E,o,T,b.slotScopeIds,M),gs(()=>{E.isDeactivated=!1,E.a&&V1(E.a);const S=b.props&&b.props.onVnodeMounted;S&&Ro(S,E.parent,b)},o)},r.deactivate=b=>{const y=b.component;kM(y.m),kM(y.a),u(b,f,null,1,o),gs(()=>{y.da&&V1(y.da);const x=b.props&&b.props.onVnodeUnmounted;x&&Ro(x,y.parent,b),y.isDeactivated=!0},o)};function h(b){Uz(b),c(b,n,o,!0)}function p(b){i.forEach((y,x)=>{const T=PN(y.type);T&&!b(T)&&m(x)})}function m(b){const y=i.get(b);y&&(!a||!Tu(y,a))?h(y):a&&Uz(a),i.delete(b),s.delete(b)}jt(()=>[t.include,t.exclude],([b,y])=>{b&&p(x=>p3(b,x)),y&&p(x=>!p3(y,x))},{flush:"post",deep:!0});let v=null;const g=()=>{v!=null&&(OM(n.subTree.type)?gs(()=>{i.set(v,Hw(n.subTree))},n.subTree.suspense):i.set(v,Hw(n.subTree)))};return _n(g),_R(g),ey(()=>{i.forEach(b=>{const{subTree:y,suspense:x}=n,T=Hw(y);if(b.type===T.type&&b.key===T.key){Uz(T);const M=T.component.da;M&&gs(M,x);return}h(b)})}),()=>{if(v=null,!e.default)return a=null;const b=e.default(),y=b[0];if(b.length>1)return a=null,b;if(!pf(y)||!(y.shapeFlag&4)&&!(y.shapeFlag&128))return a=null,y;let x=Hw(y);if(x.type===rs)return a=null,x;const T=x.type,M=PN(ap(x)?x.type.__asyncResolved||{}:T),{include:E,exclude:S,max:P}=t;if(E&&(!M||!p3(E,M))||S&&M&&p3(S,M))return x.shapeFlag&=-257,a=x,y;const R=x.key==null?T:x.key,V=i.get(R);return x.el&&(x=Cu(x),y.shapeFlag&128&&(y.ssContent=x)),v=R,V?(x.el=V.el,x.component=V.component,x.transition&&ff(x,x.transition),x.shapeFlag|=512,s.delete(R),s.add(R)):(s.add(R),P&&s.size>parseInt(P,10)&&m(s.values().next().value)),x.shapeFlag|=256,a=x,OM(y.type)?y:x}}},Zxe=jxe;function p3(t,e){return Ot(t)?t.some(n=>p3(n,e)):$r(t)?t.split(",").includes(e):M3e(t)?(t.lastIndex=0,t.test(e)):!1}function Rie(t,e){zie(t,"a",e)}function Vie(t,e){zie(t,"da",e)}function zie(t,e,n=xs){const r=t.__wdc||(t.__wdc=()=>{let i=n;for(;i;){if(i.isDeactivated)return;i=i.parent}return t()});if(QR(e,r,n),n){let i=n.parent;for(;i&&i.parent;)rT(i.parent.vnode)&&Jxe(r,e,n,i),i=i.parent}}function Jxe(t,e,n,r){const i=QR(e,t,r,!0);ls(()=>{XX(r[e],i)},n)}function Uz(t){t.shapeFlag&=-257,t.shapeFlag&=-513}function Hw(t){return t.shapeFlag&128?t.ssContent:t}function QR(t,e,n=xs,r=!1){if(n){const i=n[t]||(n[t]=[]),s=e.__weh||(e.__weh=(...a)=>{Yp();const o=Cv(n),l=Yl(e,n,t,a);return o(),Bp(),l});return r?i.unshift(s):i.push(s),s}}const Lf=t=>(e,n=xs)=>{(!$1||t==="sp")&&QR(t,(...r)=>e(...r),n)},kie=Lf("bm"),_n=Lf("m"),$X=Lf("bu"),_R=Lf("u"),ey=Lf("bum"),ls=Lf("um"),Oie=Lf("sp"),Iie=Lf("rtg"),Uie=Lf("rtc");function Nie(t,e=xs){QR("ec",t,e)}const eC="components",Yxe="directives";function Xe(t,e){return tC(eC,t,!0,e)||t}const Lie=Symbol.for("v-ndc");function hf(t){return $r(t)?tC(eC,t,!1)||t:t||Lie}function Xie(t){return tC(Yxe,t)}function tC(t,e,n=!0,r=!1){const i=ws||xs;if(i){const s=i.type;if(t===eC){const o=PN(s,!1);if(o&&(o===e||o===sa(e)||o===nT(sa(e))))return s}const a=VG(i[t]||s[t],e)||VG(i.appContext[t],e);return!a&&r?s:a}}function VG(t,e){return t&&(t[e]||t[sa(e)]||t[nT(sa(e))])}function Pi(t,e,n,r){let i;const s=n&&n[r],a=Ot(t);if(a||$r(t)){const o=a&&Iu(t);let l=!1;o&&(l=!fl(t),t=jR(t)),i=new Array(t.length);for(let u=0,c=t.length;ue(o,l,void 0,s&&s[l]));else{const o=Object.keys(t);i=new Array(o.length);for(let l=0,u=o.length;l{const s=r.fn(...i);return s&&(s.key=r.key),s}:r.fn)}return t}function Hxe(t,e,n={},r,i){if(ws.ce||ws.parent&&ap(ws.parent)&&ws.parent.ce)return e!=="default"&&(n.name=e),pe(),Gt(Ct,null,[xe("slot",n,r&&r())],64);let s=t[e];s&&s._c&&(s._d=!1),pe();const a=s&&nC(s(n)),o=n.key||a&&a.key,l=Gt(Ct,{key:(o&&!Xu(o)?o:`_${e}`)+(!a&&r?"_fb":"")},a||(r?r():[]),a&&t._===1?64:-2);return!i&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),s&&s._c&&(s._d=!0),l}function nC(t){return t.some(e=>pf(e)?!(e.type===rs||e.type===Ct&&!nC(e.children)):!0)?t:null}function Qxe(t,e){const n={};for(const r in t)n[e&&/[A-Z]/.test(r)?`on:${r}`:W3(r)]=t[r];return n}const mN=t=>t?pse(t)?sT(t):mN(t.parent):null,j3=Ar(Object.create(null),{$:t=>t,$el:t=>t.vnode.el,$data:t=>t.data,$props:t=>t.props,$attrs:t=>t.attrs,$slots:t=>t.slots,$refs:t=>t.refs,$parent:t=>mN(t.parent),$root:t=>mN(t.root),$host:t=>t.ce,$emit:t=>t.emit,$options:t=>rC(t),$forceUpdate:t=>t.f||(t.f=()=>{BX(t.update)}),$nextTick:t=>t.n||(t.n=Ia.bind(t.proxy)),$watch:t=>R6e.bind(t)}),Nz=(t,e)=>t!==Wn&&!t.__isScriptSetup&&lr(t,e),vN={get({_:t},e){if(e==="__v_skip")return!0;const{ctx:n,setupState:r,data:i,props:s,accessCache:a,type:o,appContext:l}=t;let u;if(e[0]!=="$"){const h=a[e];if(h!==void 0)switch(h){case 1:return r[e];case 2:return i[e];case 4:return n[e];case 3:return s[e]}else{if(Nz(r,e))return a[e]=1,r[e];if(i!==Wn&&lr(i,e))return a[e]=2,i[e];if((u=t.propsOptions[0])&&lr(u,e))return a[e]=3,s[e];if(n!==Wn&&lr(n,e))return a[e]=4,n[e];gN&&(a[e]=0)}}const c=j3[e];let d,f;if(c)return e==="$attrs"&&Ma(t.attrs,"get",""),c(t);if((d=o.__cssModules)&&(d=d[e]))return d;if(n!==Wn&&lr(n,e))return a[e]=4,n[e];if(f=l.config.globalProperties,lr(f,e))return f[e]},set({_:t},e,n){const{data:r,setupState:i,ctx:s}=t;return Nz(i,e)?(i[e]=n,!0):r!==Wn&&lr(r,e)?(r[e]=n,!0):lr(t.props,e)||e[0]==="$"&&e.slice(1)in t?!1:(s[e]=n,!0)},has({_:{data:t,setupState:e,accessCache:n,ctx:r,appContext:i,propsOptions:s}},a){let o;return!!n[a]||t!==Wn&&lr(t,a)||Nz(e,a)||(o=s[0])&&lr(o,a)||lr(r,a)||lr(j3,a)||lr(i.config.globalProperties,a)},defineProperty(t,e,n){return n.get!=null?t._.accessCache[e]=0:lr(n,"value")&&this.set(t,e,n.value,null),Reflect.defineProperty(t,e,n)}},_xe=Ar({},vN,{get(t,e){if(e!==Symbol.unscopables)return vN.get(t,e,t)},has(t,e){return e[0]!=="_"&&!k3e(e)}});function $xe(){return null}function e6e(){return null}function t6e(t){}function n6e(t){}function r6e(){return null}function i6e(){}function s6e(t,e){return null}function a6e(){return Cie().slots}function o6e(){return Cie().attrs}function Cie(){const t=Fo();return t.setupContext||(t.setupContext=gse(t))}function jx(t){return Ot(t)?t.reduce((e,n)=>(e[n]=null,e),{}):t}function l6e(t,e){const n=jx(t);for(const r in e){if(r.startsWith("__skip"))continue;let i=n[r];i?Ot(i)||Yt(i)?i=n[r]={type:i,default:e[r]}:i.default=e[r]:i===null&&(i=n[r]={default:e[r]}),i&&e[`__skip_${r}`]&&(i.skipFactory=!0)}return n}function u6e(t,e){return!t||!e?t||e:Ot(t)&&Ot(e)?t.concat(e):Ar({},jx(t),jx(e))}function c6e(t,e){const n={};for(const r in t)e.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>t[r]});return n}function d6e(t){const e=Fo();let n=t();return wN(),CX(n)&&(n=n.catch(r=>{throw Cv(e),r})),[n,()=>Cv(e)]}let gN=!0;function f6e(t){const e=rC(t),n=t.proxy,r=t.ctx;gN=!1,e.beforeCreate&&zG(e.beforeCreate,t,"bc");const{data:i,computed:s,methods:a,watch:o,provide:l,inject:u,created:c,beforeMount:d,mounted:f,beforeUpdate:h,updated:p,activated:m,deactivated:v,beforeDestroy:g,beforeUnmount:b,destroyed:y,unmounted:x,render:T,renderTracked:M,renderTriggered:E,errorCaptured:S,serverPrefetch:P,expose:R,inheritAttrs:V,components:z,directives:k,filters:N}=e;if(u&&h6e(u,r,null),a)for(const A in a){const Z=a[A];Yt(Z)&&(r[A]=Z.bind(n))}if(i){const A=i.call(n,n);Ur(A)&&(t.data=Go(A))}if(gN=!0,s)for(const A in s){const Z=s[A],j=Yt(Z)?Z.bind(n,n):Yt(Z.get)?Z.get.bind(n,n):dl,ne=!Yt(Z)&&Yt(Z.set)?Z.set.bind(n):dl,G=et({get:j,set:ne});Object.defineProperty(r,A,{enumerable:!0,configurable:!0,get:()=>G.value,set:B=>G.value=B})}if(o)for(const A in o)Kie(o[A],r,n,A);if(l){const A=Yt(l)?l.call(n):l;Reflect.ownKeys(A).forEach(Z=>{Zi(Z,A[Z])})}c&&zG(c,t,"c");function L(A,Z){Ot(Z)?Z.forEach(j=>A(j.bind(n))):Z&&A(Z.bind(n))}if(L(kie,d),L(_n,f),L($X,h),L(_R,p),L(Rie,m),L(Vie,v),L(Nie,S),L(Uie,M),L(Iie,E),L(ey,b),L(ls,x),L(Oie,P),Ot(R))if(R.length){const A=t.exposed||(t.exposed={});R.forEach(Z=>{Object.defineProperty(A,Z,{get:()=>n[Z],set:j=>n[Z]=j})})}else t.exposed||(t.exposed={});T&&t.render===dl&&(t.render=T),V!=null&&(t.inheritAttrs=V),z&&(t.components=z),k&&(t.directives=k),P&&_X(t)}function h6e(t,e,n=dl){Ot(t)&&(t=bN(t));for(const r in t){const i=t[r];let s;Ur(i)?"default"in i?s=cr(i.from||r,i.default,!0):s=cr(i.from||r):s=cr(i),gi(s)?Object.defineProperty(e,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:a=>s.value=a}):e[r]=s}}function zG(t,e,n){Yl(Ot(t)?t.map(r=>r.bind(e.proxy)):t.bind(e.proxy),e,n)}function Kie(t,e,n,r){let i=r.includes(".")?ise(n,r):()=>n[r];if($r(t)){const s=e[t];Yt(s)&&jt(i,s)}else if(Yt(t))jt(i,t.bind(n));else if(Ur(t))if(Ot(t))t.forEach(s=>Kie(s,e,n,r));else{const s=Yt(t.handler)?t.handler.bind(n):e[t.handler];Yt(s)&&jt(i,s,t)}}function rC(t){const e=t.type,{mixins:n,extends:r}=e,{mixins:i,optionsCache:s,config:{optionMergeStrategies:a}}=t.appContext,o=s.get(e);let l;return o?l=o:!i.length&&!n&&!r?l=e:(l={},i.length&&i.forEach(u=>zM(l,u,a,!0)),zM(l,e,a)),Ur(e)&&s.set(e,l),l}function zM(t,e,n,r=!1){const{mixins:i,extends:s}=e;s&&zM(t,s,n,!0),i&&i.forEach(a=>zM(t,a,n,!0));for(const a in e)if(!(r&&a==="expose")){const o=p6e[a]||n&&n[a];t[a]=o?o(t[a],e[a]):e[a]}return t}const p6e={data:kG,props:OG,emits:OG,methods:m3,computed:m3,beforeCreate:Aa,created:Aa,beforeMount:Aa,mounted:Aa,beforeUpdate:Aa,updated:Aa,beforeDestroy:Aa,beforeUnmount:Aa,destroyed:Aa,unmounted:Aa,activated:Aa,deactivated:Aa,errorCaptured:Aa,serverPrefetch:Aa,components:m3,directives:m3,watch:v6e,provide:kG,inject:m6e};function kG(t,e){return e?t?function(){return Ar(Yt(t)?t.call(this,this):t,Yt(e)?e.call(this,this):e)}:e:t}function m6e(t,e){return m3(bN(t),bN(e))}function bN(t){if(Ot(t)){const e={};for(let n=0;n1)return n&&Yt(e)?e.call(r&&r.proxy):e}}function Die(){return!!(xs||ws||Tv)}const Wie={},Aie=()=>Object.create(Wie),Gie=t=>Object.getPrototypeOf(t)===Wie;function y6e(t,e,n,r=!1){const i={},s=Aie();t.propsDefaults=Object.create(null),Fie(t,e,i,s);for(const a in t.propsOptions[0])a in i||(i[a]=void 0);n?t.props=r?i:ZX(i):t.type.props?t.props=i:t.props=s,t.attrs=s}function S6e(t,e,n,r){const{props:i,attrs:s,vnode:{patchFlag:a}}=t,o=gn(i),[l]=t.propsOptions;let u=!1;if((r||a>0)&&!(a&16)){if(a&8){const c=t.vnode.dynamicProps;for(let d=0;d{l=!0;const[f,h]=jie(d,e,!0);Ar(a,f),h&&o.push(...h)};!n&&e.mixins.length&&e.mixins.forEach(c),t.extends&&c(t.extends),t.mixins&&t.mixins.forEach(c)}if(!s&&!l)return Ur(t)&&r.set(t,M1),M1;if(Ot(s))for(let c=0;ct[0]==="_"||t==="$stable",iC=t=>Ot(t)?t.map(ko):[ko(t)],T6e=(t,e,n)=>{if(e._n)return e;const r=ft((...i)=>iC(e(...i)),n);return r._c=!1,r},Jie=(t,e,n)=>{const r=t._ctx;for(const i in t){if(Zie(i))continue;const s=t[i];if(Yt(s))e[i]=T6e(i,s,r);else if(s!=null){const a=iC(s);e[i]=()=>a}}},Yie=(t,e)=>{const n=iC(e);t.slots.default=()=>n},Bie=(t,e,n)=>{for(const r in e)(n||r!=="_")&&(t[r]=e[r])},w6e=(t,e,n)=>{const r=t.slots=Aie();if(t.vnode.shapeFlag&32){const i=e._;i?(Bie(r,e,n),n&&Dre(r,"_",i,!0)):Jie(e,r)}else e&&Yie(t,e)},E6e=(t,e,n)=>{const{vnode:r,slots:i}=t;let s=!0,a=Wn;if(r.shapeFlag&32){const o=e._;o?n&&o===1?s=!1:Bie(i,e,n):(s=!e.$stable,Jie(e,i)),a=e}else e&&(Yie(t,e),a={default:1});if(s)for(const o in i)!Zie(o)&&a[o]==null&&delete i[o]},gs=lse;function Hie(t){return _ie(t)}function Qie(t){return _ie(t,Nxe)}function _ie(t,e){const n=AR();n.__VUE__=!0;const{insert:r,remove:i,patchProp:s,createElement:a,createText:o,createComment:l,setText:u,setElementText:c,parentNode:d,nextSibling:f,setScopeId:h=dl,insertStaticContent:p}=t,m=(D,F,re,de=null,Te=null,he=null,be=void 0,we=null,se=!!F.dynamicChildren)=>{if(D===F)return;D&&!Tu(D,F)&&(de=_(D),B(D,Te,he,!0),D=null),F.patchFlag===-2&&(se=!1,F.dynamicChildren=null);const{type:W,ref:K,shapeFlag:ie}=F;switch(W){case op:v(D,F,re,de);break;case rs:g(D,F,re,de);break;case wv:D==null&&b(F,re,de,be);break;case Ct:z(D,F,re,de,Te,he,be,we,se);break;default:ie&1?T(D,F,re,de,Te,he,be,we,se):ie&6?k(D,F,re,de,Te,he,be,we,se):(ie&64||ie&128)&&W.process(D,F,re,de,Te,he,be,we,se,ve)}K!=null&&Te&&Fx(K,D&&D.ref,he,F||D,!F)},v=(D,F,re,de)=>{if(D==null)r(F.el=o(F.children),re,de);else{const Te=F.el=D.el;F.children!==D.children&&u(Te,F.children)}},g=(D,F,re,de)=>{D==null?r(F.el=l(F.children||""),re,de):F.el=D.el},b=(D,F,re,de)=>{[D.el,D.anchor]=p(D.children,F,re,de,D.el,D.anchor)},y=({el:D,anchor:F},re,de)=>{let Te;for(;D&&D!==F;)Te=f(D),r(D,re,de),D=Te;r(F,re,de)},x=({el:D,anchor:F})=>{let re;for(;D&&D!==F;)re=f(D),i(D),D=re;i(F)},T=(D,F,re,de,Te,he,be,we,se)=>{F.type==="svg"?be="svg":F.type==="math"&&(be="mathml"),D==null?M(F,re,de,Te,he,be,we,se):P(D,F,Te,he,be,we,se)},M=(D,F,re,de,Te,he,be,we)=>{let se,W;const{props:K,shapeFlag:ie,transition:me,dirs:We}=D;if(se=D.el=a(D.type,he,K&&K.is,K),ie&8?c(se,D.children):ie&16&&S(D.children,se,null,de,Te,Lz(D,he),be,we),We&&Mc(D,null,de,"created"),E(se,D,D.scopeId,be,de),K){for(const Ae in K)Ae!=="value"&&!R1(Ae)&&s(se,Ae,null,K[Ae],he,de);"value"in K&&s(se,"value",null,K.value,he),(W=K.onVnodeBeforeMount)&&Ro(W,de,D)}We&&Mc(D,null,de,"beforeMount");const Ce=$ie(Te,me);Ce&&me.beforeEnter(se),r(se,F,re),((W=K&&K.onVnodeMounted)||Ce||We)&&gs(()=>{W&&Ro(W,de,D),Ce&&me.enter(se),We&&Mc(D,null,de,"mounted")},Te)},E=(D,F,re,de,Te)=>{if(re&&h(D,re),de)for(let he=0;he{for(let W=se;W{const we=F.el=D.el;let{patchFlag:se,dynamicChildren:W,dirs:K}=F;se|=D.patchFlag&16;const ie=D.props||Wn,me=F.props||Wn;let We;if(re&&wm(re,!1),(We=me.onVnodeBeforeUpdate)&&Ro(We,re,F,D),K&&Mc(F,D,re,"beforeUpdate"),re&&wm(re,!0),(ie.innerHTML&&me.innerHTML==null||ie.textContent&&me.textContent==null)&&c(we,""),W?R(D.dynamicChildren,W,we,re,de,Lz(F,Te),he):be||Z(D,F,we,null,re,de,Lz(F,Te),he,!1),se>0){if(se&16)V(we,ie,me,re,Te);else if(se&2&&ie.class!==me.class&&s(we,"class",null,me.class,Te),se&4&&s(we,"style",ie.style,me.style,Te),se&8){const Ce=F.dynamicProps;for(let Ae=0;Ae{We&&Ro(We,re,F,D),K&&Mc(F,D,re,"updated")},de)},R=(D,F,re,de,Te,he,be)=>{for(let we=0;we{if(F!==re){if(F!==Wn)for(const he in F)!R1(he)&&!(he in re)&&s(D,he,F[he],null,Te,de);for(const he in re){if(R1(he))continue;const be=re[he],we=F[he];be!==we&&he!=="value"&&s(D,he,we,be,Te,de)}"value"in re&&s(D,"value",F.value,re.value,Te)}},z=(D,F,re,de,Te,he,be,we,se)=>{const W=F.el=D?D.el:o(""),K=F.anchor=D?D.anchor:o("");let{patchFlag:ie,dynamicChildren:me,slotScopeIds:We}=F;We&&(we=we?we.concat(We):We),D==null?(r(W,re,de),r(K,re,de),S(F.children||[],re,K,Te,he,be,we,se)):ie>0&&ie&64&&me&&D.dynamicChildren?(R(D.dynamicChildren,me,re,Te,he,be,we),(F.key!=null||Te&&F===Te.subTree)&&sC(D,F,!0)):Z(D,F,re,K,Te,he,be,we,se)},k=(D,F,re,de,Te,he,be,we,se)=>{F.slotScopeIds=we,D==null?F.shapeFlag&512?Te.ctx.activate(F,re,de,be,se):N(F,re,de,Te,he,be,se):q(D,F,se)},N=(D,F,re,de,Te,he,be)=>{const we=D.component=hse(D,de,Te);if(rT(D)&&(we.ctx.renderer=ve),mse(we,!1,be),we.asyncDep){if(Te&&Te.registerDep(we,L,be),!D.el){const se=we.subTree=xe(rs);g(null,se,F,re)}}else L(we,D,F,re,Te,he,be)},q=(D,F,re)=>{const de=F.component=D.component;if(U6e(D,F,re))if(de.asyncDep&&!de.asyncResolved){A(de,F,re);return}else de.next=F,de.update();else F.el=D.el,de.vnode=F},L=(D,F,re,de,Te,he,be)=>{const we=()=>{if(D.isMounted){let{next:ie,bu:me,u:We,parent:Ce,vnode:Ae}=D;{const Q=ese(D);if(Q){ie&&(ie.el=Ae.el,A(D,ie,be)),Q.asyncDep.then(()=>{D.isUnmounted||we()});return}}let J=ie,ue;wm(D,!1),ie?(ie.el=Ae.el,A(D,ie,be)):ie=Ae,me&&V1(me),(ue=ie.props&&ie.props.onVnodeBeforeUpdate)&&Ro(ue,Ce,ie,Ae),wm(D,!0);const ge=h7(D),Se=D.subTree;D.subTree=ge,m(Se,ge,d(Se.el),_(Se),D,Te,he),ie.el=ge.el,J===null&&eV(D,ge.el),We&&gs(We,Te),(ue=ie.props&&ie.props.onVnodeUpdated)&&gs(()=>Ro(ue,Ce,ie,Ae),Te)}else{let ie;const{el:me,props:We}=F,{bm:Ce,m:Ae,parent:J,root:ue,type:ge}=D,Se=ap(F);if(wm(D,!1),Ce&&V1(Ce),!Se&&(ie=We&&We.onVnodeBeforeMount)&&Ro(ie,J,F),wm(D,!0),me&&le){const Q=()=>{D.subTree=h7(D),le(me,D.subTree,D,Te,null)};Se&&ge.__asyncHydrate?ge.__asyncHydrate(me,D,Q):Q()}else{ue.ce&&ue.ce._injectChildStyle(ge);const Q=D.subTree=h7(D);m(null,Q,re,de,D,Te,he),F.el=Q.el}if(Ae&&gs(Ae,Te),!Se&&(ie=We&&We.onVnodeMounted)){const Q=F;gs(()=>Ro(ie,J,Q),Te)}(F.shapeFlag&256||J&&ap(J.vnode)&&J.vnode.shapeFlag&256)&&D.a&&gs(D.a,Te),D.isMounted=!0,F=re=de=null}};D.scope.on();const se=D.effect=new Kx(we);D.scope.off();const W=D.update=se.run.bind(se),K=D.job=se.runIfDirty.bind(se);K.i=D,K.id=D.uid,se.scheduler=()=>BX(K),wm(D,!0),W()},A=(D,F,re)=>{F.component=D;const de=D.vnode.props;D.vnode=F,D.next=null,S6e(D,F.props,de,re),E6e(D,F.children,re),Yp(),xG(D),Bp()},Z=(D,F,re,de,Te,he,be,we,se=!1)=>{const W=D&&D.children,K=D?D.shapeFlag:0,ie=F.children,{patchFlag:me,shapeFlag:We}=F;if(me>0){if(me&128){ne(W,ie,re,de,Te,he,be,we,se);return}else if(me&256){j(W,ie,re,de,Te,he,be,we,se);return}}We&8?(K&16&&te(W,Te,he),ie!==W&&c(re,ie)):K&16?We&16?ne(W,ie,re,de,Te,he,be,we,se):te(W,Te,he,!0):(K&8&&c(re,""),We&16&&S(ie,re,de,Te,he,be,we,se))},j=(D,F,re,de,Te,he,be,we,se)=>{D=D||M1,F=F||M1;const W=D.length,K=F.length,ie=Math.min(W,K);let me;for(me=0;meK?te(D,Te,he,!0,!1,ie):S(F,re,de,Te,he,be,we,se,ie)},ne=(D,F,re,de,Te,he,be,we,se)=>{let W=0;const K=F.length;let ie=D.length-1,me=K-1;for(;W<=ie&&W<=me;){const We=D[W],Ce=F[W]=se?Rh(F[W]):ko(F[W]);if(Tu(We,Ce))m(We,Ce,re,null,Te,he,be,we,se);else break;W++}for(;W<=ie&&W<=me;){const We=D[ie],Ce=F[me]=se?Rh(F[me]):ko(F[me]);if(Tu(We,Ce))m(We,Ce,re,null,Te,he,be,we,se);else break;ie--,me--}if(W>ie){if(W<=me){const We=me+1,Ce=Weme)for(;W<=ie;)B(D[W],Te,he,!0),W++;else{const We=W,Ce=W,Ae=new Map;for(W=Ce;W<=me;W++){const Fe=F[W]=se?Rh(F[W]):ko(F[W]);Fe.key!=null&&Ae.set(Fe.key,W)}let J,ue=0;const ge=me-Ce+1;let Se=!1,Q=0;const Pe=new Array(ge);for(W=0;W=ge){B(Fe,Te,he,!0);continue}let je;if(Fe.key!=null)je=Ae.get(Fe.key);else for(J=Ce;J<=me;J++)if(Pe[J-Ce]===0&&Tu(Fe,F[J])){je=J;break}je===void 0?B(Fe,Te,he,!0):(Pe[je-Ce]=W+1,je>=Q?Q=je:Se=!0,m(Fe,F[je],re,null,Te,he,be,we,se),ue++)}const Ve=Se?M6e(Pe):M1;for(J=Ve.length-1,W=ge-1;W>=0;W--){const Fe=Ce+W,je=F[Fe],Ze=Fe+1{const{el:he,type:be,transition:we,children:se,shapeFlag:W}=D;if(W&6){G(D.component.subTree,F,re,de);return}if(W&128){D.suspense.move(F,re,de);return}if(W&64){be.move(D,F,re,ve);return}if(be===Ct){r(he,F,re);for(let ie=0;iewe.enter(he),Te);else{const{leave:ie,delayLeave:me,afterLeave:We}=we,Ce=()=>r(he,F,re),Ae=()=>{ie(he,()=>{Ce(),We&&We()})};me?me(he,Ce,Ae):Ae()}else r(he,F,re)},B=(D,F,re,de=!1,Te=!1)=>{const{type:he,props:be,ref:we,children:se,dynamicChildren:W,shapeFlag:K,patchFlag:ie,dirs:me,cacheIndex:We}=D;if(ie===-2&&(Te=!1),we!=null&&Fx(we,null,re,D,!0),We!=null&&(F.renderCache[We]=void 0),K&256){F.ctx.deactivate(D);return}const Ce=K&1&&me,Ae=!ap(D);let J;if(Ae&&(J=be&&be.onVnodeBeforeUnmount)&&Ro(J,F,D),K&6)fe(D.component,re,de);else{if(K&128){D.suspense.unmount(re,de);return}Ce&&Mc(D,null,F,"beforeUnmount"),K&64?D.type.remove(D,F,re,ve,de):W&&!W.hasOnce&&(he!==Ct||ie>0&&ie&64)?te(W,F,re,!1,!0):(he===Ct&&ie&384||!Te&&K&16)&&te(se,F,re),de&&ee(D)}(Ae&&(J=be&&be.onVnodeUnmounted)||Ce)&&gs(()=>{J&&Ro(J,F,D),Ce&&Mc(D,null,F,"unmounted")},re)},ee=D=>{const{type:F,el:re,anchor:de,transition:Te}=D;if(F===Ct){ce(re,de);return}if(F===wv){x(D);return}const he=()=>{i(re),Te&&!Te.persisted&&Te.afterLeave&&Te.afterLeave()};if(D.shapeFlag&1&&Te&&!Te.persisted){const{leave:be,delayLeave:we}=Te,se=()=>be(re,he);we?we(D.el,he,se):se()}else he()},ce=(D,F)=>{let re;for(;D!==F;)re=f(D),i(D),D=re;i(F)},fe=(D,F,re)=>{const{bum:de,scope:Te,job:he,subTree:be,um:we,m:se,a:W}=D;kM(se),kM(W),de&&V1(de),Te.stop(),he&&(he.flags|=8,B(be,D,F,re)),we&&gs(we,F),gs(()=>{D.isUnmounted=!0},F),F&&F.pendingBranch&&!F.isUnmounted&&D.asyncDep&&!D.asyncResolved&&D.suspenseId===F.pendingId&&(F.deps--,F.deps===0&&F.resolve())},te=(D,F,re,de=!1,Te=!1,he=0)=>{for(let be=he;be{if(D.shapeFlag&6)return _(D.component.subTree);if(D.shapeFlag&128)return D.suspense.next();const F=f(D.anchor||D.el),re=F&&F[gie];return re?f(re):F};let oe=!1;const ye=(D,F,re)=>{D==null?F._vnode&&B(F._vnode,null,null,!0):m(F._vnode||null,D,F,null,null,null,re),F._vnode=D,oe||(oe=!0,xG(),VM(),oe=!1)},ve={p:m,um:B,m:G,r:ee,mt:N,mc:S,pc:Z,pbc:R,n:_,o:t};let Ke,le;return e&&([Ke,le]=e(ve)),{render:ye,hydrate:Ke,createApp:b6e(ye,Ke)}}function Lz({type:t,props:e},n){return n==="svg"&&t==="foreignObject"||n==="mathml"&&t==="annotation-xml"&&e&&e.encoding&&e.encoding.includes("html")?void 0:n}function wm({effect:t,job:e},n){n?(t.flags|=32,e.flags|=4):(t.flags&=-33,e.flags&=-5)}function $ie(t,e){return(!t||t&&!t.pendingBranch)&&e&&!e.persisted}function sC(t,e,n=!1){const r=t.children,i=e.children;if(Ot(r)&&Ot(i))for(let s=0;s>1,t[n[o]]0&&(e[r]=n[s-1]),n[s]=r)}}for(s=n.length,a=n[s-1];s-- >0;)n[s]=a,a=e[a];return n}function ese(t){const e=t.subTree.component;if(e)return e.asyncDep&&!e.asyncResolved?e:ese(e)}function kM(t){if(t)for(let e=0;ecr(tse);function Ps(t,e){return iT(t,null,e)}function P6e(t,e){return iT(t,null,{flush:"post"})}function rse(t,e){return iT(t,null,{flush:"sync"})}function jt(t,e,n){return iT(t,e,n)}function iT(t,e,n=Wn){const{immediate:r,deep:i,flush:s,once:a}=n,o=Ar({},n),l=e&&r||!e&&s!=="post";let u;if($1){if(s==="sync"){const h=nse();u=h.__watcherHandles||(h.__watcherHandles=[])}else if(!l){const h=()=>{};return h.stop=dl,h.resume=dl,h.pause=dl,h}}const c=xs;o.call=(h,p,m)=>Yl(h,c,p,m);let d=!1;s==="post"?o.scheduler=h=>{gs(h,c&&c.suspense)}:s!=="sync"&&(d=!0,o.scheduler=(h,p)=>{p?h():BX(h)}),o.augmentJob=h=>{e&&(h.flags|=4),d&&(h.flags|=2,c&&(h.id=c.uid,h.i=c))};const f=bxe(t,e,o);return $1&&(u?u.push(f):l&&f()),f}function R6e(t,e,n){const r=this.proxy,i=$r(t)?t.includes(".")?ise(r,t):()=>r[t]:t.bind(r,r);let s;Yt(e)?s=e:(s=e.handler,n=e);const a=Cv(this),o=iT(i,s.bind(r),n);return a(),o}function ise(t,e){const n=e.split(".");return()=>{let r=t;for(let i=0;i{let c,d=Wn,f;return rse(()=>{const h=t[i];Ba(c,h)&&(c=h,u())}),{get(){return l(),n.get?n.get(c):c},set(h){const p=n.set?n.set(h):h;if(!Ba(p,c)&&!(d!==Wn&&Ba(h,d)))return;const m=r.vnode.props;m&&(e in m||i in m||s in m)&&(`onUpdate:${e}`in m||`onUpdate:${i}`in m||`onUpdate:${s}`in m)||(c=h,u()),r.emit(`update:${e}`,p),Ba(h,p)&&Ba(h,d)&&!Ba(p,f)&&u(),d=h,f=p}}});return o[Symbol.iterator]=()=>{let l=0;return{next(){return l<2?{value:l++?a||Wn:o,done:!1}:{done:!0}}}},o}const sse=(t,e)=>e==="modelValue"||e==="model-value"?t.modelModifiers:t[`${e}Modifiers`]||t[`${sa(e)}Modifiers`]||t[`${Oo(e)}Modifiers`];function z6e(t,e,...n){if(t.isUnmounted)return;const r=t.vnode.props||Wn;let i=n;const s=e.startsWith("update:"),a=s&&sse(r,e.slice(7));a&&(a.trim&&(i=n.map(c=>$r(c)?c.trim():c)),a.number&&(i=n.map(wM)));let o,l=r[o=W3(e)]||r[o=W3(sa(e))];!l&&s&&(l=r[o=W3(Oo(e))]),l&&Yl(l,t,6,i);const u=r[o+"Once"];if(u){if(!t.emitted)t.emitted={};else if(t.emitted[o])return;t.emitted[o]=!0,Yl(u,t,6,i)}}function ase(t,e,n=!1){const r=e.emitsCache,i=r.get(t);if(i!==void 0)return i;const s=t.emits;let a={},o=!1;if(!Yt(t)){const l=u=>{const c=ase(u,e,!0);c&&(o=!0,Ar(a,c))};!n&&e.mixins.length&&e.mixins.forEach(l),t.extends&&l(t.extends),t.mixins&&t.mixins.forEach(l)}return!s&&!o?(Ur(t)&&r.set(t,null),null):(Ot(s)?s.forEach(l=>a[l]=null):Ar(a,s),Ur(t)&&r.set(t,a),a)}function $R(t,e){return!t||!tT(e)?!1:(e=e.slice(2).replace(/Once$/,""),lr(t,e[0].toLowerCase()+e.slice(1))||lr(t,Oo(e))||lr(t,e))}function h7(t){const{type:e,vnode:n,proxy:r,withProxy:i,propsOptions:[s],slots:a,attrs:o,emit:l,render:u,renderCache:c,props:d,data:f,setupState:h,ctx:p,inheritAttrs:m}=t,v=Gx(t);let g,b;try{if(n.shapeFlag&4){const x=i||r,T=x;g=ko(u.call(T,x,c,d,h,f,p)),b=o}else{const x=e;g=ko(x.length>1?x(d,{attrs:o,slots:a,emit:l}):x(d,null)),b=e.props?o:O6e(o)}}catch(x){Z3.length=0,d0(x,t,1),g=xe(rs)}let y=g;if(b&&m!==!1){const x=Object.keys(b),{shapeFlag:T}=y;x.length&&T&7&&(s&&x.some(LX)&&(b=I6e(b,s)),y=Cu(y,b,!1,!0))}return n.dirs&&(y=Cu(y,null,!1,!0),y.dirs=y.dirs?y.dirs.concat(n.dirs):n.dirs),n.transition&&ff(y,n.transition),g=y,Gx(v),g}function k6e(t,e=!0){let n;for(let r=0;r{let e;for(const n in t)(n==="class"||n==="style"||tT(n))&&((e||(e={}))[n]=t[n]);return e},I6e=(t,e)=>{const n={};for(const r in t)(!LX(r)||!(r.slice(9)in e))&&(n[r]=t[r]);return n};function U6e(t,e,n){const{props:r,children:i,component:s}=t,{props:a,children:o,patchFlag:l}=e,u=s.emitsOptions;if(e.dirs||e.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?UG(r,a,u):!!a;if(l&8){const c=e.dynamicProps;for(let d=0;dt.__isSuspense;let SN=0;const N6e={name:"Suspense",__isSuspense:!0,process(t,e,n,r,i,s,a,o,l,u){if(t==null)L6e(e,n,r,i,s,a,o,l,u);else{if(s&&s.deps>0&&!t.suspense.isInFallback){e.suspense=t.suspense,e.suspense.vnode=e,e.el=t.el;return}X6e(t,e,n,r,i,a,o,l,u)}},hydrate:C6e,normalize:K6e},tV=N6e;function Zx(t,e){const n=t.props&&t.props[e];Yt(n)&&n()}function L6e(t,e,n,r,i,s,a,o,l){const{p:u,o:{createElement:c}}=l,d=c("div"),f=t.suspense=ose(t,i,r,e,d,n,s,a,o,l);u(null,f.pendingBranch=t.ssContent,d,null,r,f,s,a),f.deps>0?(Zx(t,"onPending"),Zx(t,"onFallback"),u(null,t.ssFallback,e,n,r,null,s,a),k1(f,t.ssFallback)):f.resolve(!1,!0)}function X6e(t,e,n,r,i,s,a,o,{p:l,um:u,o:{createElement:c}}){const d=e.suspense=t.suspense;d.vnode=e,e.el=t.el;const f=e.ssContent,h=e.ssFallback,{activeBranch:p,pendingBranch:m,isInFallback:v,isHydrating:g}=d;if(m)d.pendingBranch=f,Tu(f,m)?(l(m,f,d.hiddenContainer,null,i,d,s,a,o),d.deps<=0?d.resolve():v&&(g||(l(p,h,n,r,i,null,s,a,o),k1(d,h)))):(d.pendingId=SN++,g?(d.isHydrating=!1,d.activeBranch=m):u(m,i,d),d.deps=0,d.effects.length=0,d.hiddenContainer=c("div"),v?(l(null,f,d.hiddenContainer,null,i,d,s,a,o),d.deps<=0?d.resolve():(l(p,h,n,r,i,null,s,a,o),k1(d,h))):p&&Tu(f,p)?(l(p,f,n,r,i,d,s,a,o),d.resolve(!0)):(l(null,f,d.hiddenContainer,null,i,d,s,a,o),d.deps<=0&&d.resolve()));else if(p&&Tu(f,p))l(p,f,n,r,i,d,s,a,o),k1(d,f);else if(Zx(e,"onPending"),d.pendingBranch=f,f.shapeFlag&512?d.pendingId=f.component.suspenseId:d.pendingId=SN++,l(null,f,d.hiddenContainer,null,i,d,s,a,o),d.deps<=0)d.resolve();else{const{timeout:b,pendingId:y}=d;b>0?setTimeout(()=>{d.pendingId===y&&d.fallback(h)},b):b===0&&d.fallback(h)}}function ose(t,e,n,r,i,s,a,o,l,u,c=!1){const{p:d,m:f,um:h,n:p,o:{parentNode:m,remove:v}}=u;let g;const b=q6e(t);b&&e&&e.pendingBranch&&(g=e.pendingId,e.deps++);const y=t.props?EM(t.props.timeout):void 0,x=s,T={vnode:t,parent:e,parentComponent:n,namespace:a,container:r,hiddenContainer:i,deps:0,pendingId:SN++,timeout:typeof y=="number"?y:-1,activeBranch:null,pendingBranch:null,isInFallback:!c,isHydrating:c,isUnmounted:!1,effects:[],resolve(M=!1,E=!1){const{vnode:S,activeBranch:P,pendingBranch:R,pendingId:V,effects:z,parentComponent:k,container:N}=T;let q=!1;T.isHydrating?T.isHydrating=!1:M||(q=P&&R.transition&&R.transition.mode==="out-in",q&&(P.transition.afterLeave=()=>{V===T.pendingId&&(f(R,N,s===x?p(P):s,0),Wx(z))}),P&&(m(P.el)===N&&(s=p(P)),h(P,k,T,!0)),q||f(R,N,s,0)),k1(T,R),T.pendingBranch=null,T.isInFallback=!1;let L=T.parent,A=!1;for(;L;){if(L.pendingBranch){L.effects.push(...z),A=!0;break}L=L.parent}!A&&!q&&Wx(z),T.effects=[],b&&e&&e.pendingBranch&&g===e.pendingId&&(e.deps--,e.deps===0&&!E&&e.resolve()),Zx(S,"onResolve")},fallback(M){if(!T.pendingBranch)return;const{vnode:E,activeBranch:S,parentComponent:P,container:R,namespace:V}=T;Zx(E,"onFallback");const z=p(S),k=()=>{T.isInFallback&&(d(null,M,R,z,P,null,V,o,l),k1(T,M))},N=M.transition&&M.transition.mode==="out-in";N&&(S.transition.afterLeave=k),T.isInFallback=!0,h(S,P,null,!0),N||k()},move(M,E,S){T.activeBranch&&f(T.activeBranch,M,E,S),T.container=M},next(){return T.activeBranch&&p(T.activeBranch)},registerDep(M,E,S){const P=!!T.pendingBranch;P&&T.deps++;const R=M.vnode.el;M.asyncDep.catch(V=>{d0(V,M,0)}).then(V=>{if(M.isUnmounted||T.isUnmounted||T.pendingId!==M.suspenseId)return;M.asyncResolved=!0;const{vnode:z}=M;EN(M,V,!1),R&&(z.el=R);const k=!R&&M.subTree.el;E(M,z,m(R||M.subTree.el),R?null:p(M.subTree),T,a,S),k&&v(k),eV(M,z.el),P&&--T.deps===0&&T.resolve()})},unmount(M,E){T.isUnmounted=!0,T.activeBranch&&h(T.activeBranch,n,M,E),T.pendingBranch&&h(T.pendingBranch,n,M,E)}};return T}function C6e(t,e,n,r,i,s,a,o,l){const u=e.suspense=ose(e,r,n,t.parentNode,document.createElement("div"),null,i,s,a,o,!0),c=l(t,u.pendingBranch=e.ssContent,n,u,s,a);return u.deps===0&&u.resolve(!1,!0),c}function K6e(t){const{shapeFlag:e,children:n}=t,r=e&32;t.ssContent=NG(r?n.default:n),t.ssFallback=r?NG(n.fallback):xe(rs)}function NG(t){let e;if(Yt(t)){const n=Xv&&t._c;n&&(t._d=!1,pe()),t=t(),n&&(t._d=!0,e=ka,use())}return Ot(t)&&(t=k6e(t)),t=ko(t),e&&!t.dynamicChildren&&(t.dynamicChildren=e.filter(n=>n!==t)),t}function lse(t,e){e&&e.pendingBranch?Ot(t)?e.effects.push(...t):e.effects.push(t):Wx(t)}function k1(t,e){t.activeBranch=e;const{vnode:n,parentComponent:r}=t;let i=e.el;for(;!i&&e.component;)e=e.component.subTree,i=e.el;n.el=i,r&&r.subTree===n&&(r.vnode.el=i,eV(r,i))}function q6e(t){const e=t.props&&t.props.suspensible;return e!=null&&e!==!1}const Ct=Symbol.for("v-fgt"),op=Symbol.for("v-txt"),rs=Symbol.for("v-cmt"),wv=Symbol.for("v-stc"),Z3=[];let ka=null;function pe(t=!1){Z3.push(ka=t?null:[])}function use(){Z3.pop(),ka=Z3[Z3.length-1]||null}let Xv=1;function xN(t,e=!1){Xv+=t,t<0&&ka&&e&&(ka.hasOnce=!0)}function cse(t){return t.dynamicChildren=Xv>0?ka||M1:null,use(),Xv>0&&ka&&ka.push(t),t}function ke(t,e,n,r,i,s){return cse(O(t,e,n,r,i,s,!0))}function Gt(t,e,n,r,i){return cse(xe(t,e,n,r,i,!0))}function pf(t){return t?t.__v_isVNode===!0:!1}function Tu(t,e){return t.type===e.type&&t.key===e.key}function D6e(t){}const dse=({key:t})=>t??null,p7=({ref:t,ref_key:e,ref_for:n})=>(typeof t=="number"&&(t=""+t),t!=null?$r(t)||gi(t)||Yt(t)?{i:ws,r:t,k:e,f:!!n}:t:null);function O(t,e=null,n=null,r=0,i=null,s=t===Ct?0:1,a=!1,o=!1){const l={__v_isVNode:!0,__v_skip:!0,type:t,props:e,key:e&&dse(e),ref:e&&p7(e),scopeId:BR,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:ws};return o?(aC(l,n),s&128&&t.normalize(l)):n&&(l.shapeFlag|=$r(n)?8:16),Xv>0&&!a&&ka&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&ka.push(l),l}const xe=W6e;function W6e(t,e=null,n=null,r=0,i=null,s=!1){if((!t||t===Lie)&&(t=rs),pf(t)){const o=Cu(t,e,!0);return n&&aC(o,n),Xv>0&&!s&&ka&&(o.shapeFlag&6?ka[ka.indexOf(t)]=o:ka.push(o)),o.patchFlag=-2,o}if(Y6e(t)&&(t=t.__vccOpts),e){e=nV(e);let{class:o,style:l}=e;o&&!$r(o)&&(e.class=En(o)),Ur(l)&&(u0(l)&&!Ot(l)&&(l=Ar({},l)),e.style=Ms(l))}const a=$r(t)?1:OM(t)?128:bie(t)?64:Ur(t)?4:Yt(t)?2:0;return O(t,e,n,r,i,a,s,!0)}function nV(t){return t?u0(t)||Gie(t)?Ar({},t):t:null}function Cu(t,e,n=!1,r=!1){const{props:i,ref:s,patchFlag:a,children:o,transition:l}=t,u=e?fse(i||{},e):i,c={__v_isVNode:!0,__v_skip:!0,type:t.type,props:u,key:u&&dse(u),ref:e&&e.ref?n&&s?Ot(s)?s.concat(p7(e)):[s,p7(e)]:p7(e):s,scopeId:t.scopeId,slotScopeIds:t.slotScopeIds,children:o,target:t.target,targetStart:t.targetStart,targetAnchor:t.targetAnchor,staticCount:t.staticCount,shapeFlag:t.shapeFlag,patchFlag:e&&t.type!==Ct?a===-1?16:a|16:a,dynamicProps:t.dynamicProps,dynamicChildren:t.dynamicChildren,appContext:t.appContext,dirs:t.dirs,transition:l,component:t.component,suspense:t.suspense,ssContent:t.ssContent&&Cu(t.ssContent),ssFallback:t.ssFallback&&Cu(t.ssFallback),el:t.el,anchor:t.anchor,ctx:t.ctx,ce:t.ce};return l&&r&&ff(c,l.clone(c)),c}function yr(t=" ",e=0){return xe(op,null,t,e)}function rV(t,e){const n=xe(wv,null,t);return n.staticCount=e,n}function Ln(t="",e=!1){return e?(pe(),Gt(rs,null,t)):xe(rs,null,t)}function ko(t){return t==null||typeof t=="boolean"?xe(rs):Ot(t)?xe(Ct,null,t.slice()):pf(t)?Rh(t):xe(op,null,String(t))}function Rh(t){return t.el===null&&t.patchFlag!==-1||t.memo?t:Cu(t)}function aC(t,e){let n=0;const{shapeFlag:r}=t;if(e==null)e=null;else if(Ot(e))n=16;else if(typeof e=="object")if(r&65){const i=e.default;i&&(i._c&&(i._d=!1),aC(t,i()),i._c&&(i._d=!0));return}else{n=32;const i=e._;!i&&!Gie(e)?e._ctx=ws:i===3&&ws&&(ws.slots._===1?e._=1:(e._=2,t.patchFlag|=1024))}else Yt(e)?(e={default:e,_ctx:ws},n=32):(e=String(e),r&64?(n=16,e=[yr(e)]):n=8);t.children=e,t.shapeFlag|=n}function fse(...t){const e={};for(let n=0;nxs||ws;let IM,TN;{const t=AR(),e=(n,r)=>{let i;return(i=t[n])||(i=t[n]=[]),i.push(r),s=>{i.length>1?i.forEach(a=>a(s)):i[0](s)}};IM=e("__VUE_INSTANCE_SETTERS__",n=>xs=n),TN=e("__VUE_SSR_SETTERS__",n=>$1=n)}const Cv=t=>{const e=xs;return IM(t),t.scope.on(),()=>{t.scope.off(),IM(e)}},wN=()=>{xs&&xs.scope.off(),IM(null)};function pse(t){return t.vnode.shapeFlag&4}let $1=!1;function mse(t,e=!1,n=!1){e&&TN(e);const{props:r,children:i}=t.vnode,s=pse(t);y6e(t,r,s,e),w6e(t,i,n);const a=s?F6e(t,e):void 0;return e&&TN(!1),a}function F6e(t,e){const n=t.type;t.accessCache=Object.create(null),t.proxy=new Proxy(t.ctx,vN);const{setup:r}=n;if(r){Yp();const i=t.setupContext=r.length>1?gse(t):null,s=Cv(t),a=$b(r,t,0,[t.props,i]),o=CX(a);if(Bp(),s(),(o||t.sp)&&!ap(t)&&_X(t),o){if(a.then(wN,wN),e)return a.then(l=>{EN(t,l,e)}).catch(l=>{d0(l,t,0)});t.asyncDep=a}else EN(t,a,e)}else vse(t,e)}function EN(t,e,n){Yt(e)?t.type.__ssrInlineRender?t.ssrRender=e:t.render=e:Ur(e)&&(t.setupState=YX(e)),vse(t,n)}let UM,MN;function j6e(t){UM=t,MN=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,_xe))}}const Z6e=()=>!UM;function vse(t,e,n){const r=t.type;if(!t.render){if(!e&&UM&&!r.render){const i=r.template||rC(t).template;if(i){const{isCustomElement:s,compilerOptions:a}=t.appContext.config,{delimiters:o,compilerOptions:l}=r,u=Ar(Ar({isCustomElement:s,delimiters:o},a),l);r.render=UM(i,u)}}t.render=r.render||dl,MN&&MN(t)}{const i=Cv(t);Yp();try{f6e(t)}finally{Bp(),i()}}}const J6e={get(t,e){return Ma(t,"get",""),t[e]}};function gse(t){const e=n=>{t.exposed=n||{}};return{attrs:new Proxy(t.attrs,J6e),slots:t.slots,emit:t.emit,expose:e}}function sT(t){return t.exposed?t.exposeProxy||(t.exposeProxy=new Proxy(YX(YR(t.exposed)),{get(e,n){if(n in e)return e[n];if(n in j3)return j3[n](t)},has(e,n){return n in e||n in j3}})):t.proxy}function PN(t,e=!0){return Yt(t)?t.displayName||t.name:t.name||e&&t.__name}function Y6e(t){return Yt(t)&&"__vccOpts"in t}const et=(t,e)=>pxe(t,e,$1);function An(t,e,n){const r=arguments.length;return r===2?Ur(e)&&!Ot(e)?pf(e)?xe(t,null,[e]):xe(t,e):xe(t,null,e):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&pf(n)&&(n=[n]),xe(t,e,n))}function B6e(){}function H6e(t,e,n,r){const i=n[r];if(i&&bse(i,t))return i;const s=e();return s.memo=t.slice(),s.cacheIndex=r,n[r]=s}function bse(t,e){const n=t.memo;if(n.length!=e.length)return!1;for(let r=0;r0&&ka&&ka.push(t),!0}const oC="3.5.13",Q6e=dl,_6e=wxe,$6e=Ag,eTe=vie,tTe={createComponentInstance:hse,setupComponent:mse,renderComponentRoot:h7,setCurrentRenderingInstance:Gx,isVNode:pf,normalizeVNode:ko,getComponentPublicInstance:sT,ensureValidVNode:nC,pushWarningContext:yxe,popWarningContext:Sxe},nTe=tTe,rTe=null,iTe=null,sTe=null;/** +**/const die=[];function Sxe(t){die.push(t)}function xxe(){die.pop()}function Txe(t,e){}const wxe={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE",APP_UNMOUNT_CLEANUP:16,16:"APP_UNMOUNT_CLEANUP"},Exe={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush",15:"component update",16:"app unmount cleanup function"};function $b(t,e,n,r){try{return r?t(...r):t()}catch(i){d0(i,e,n)}}function Yl(t,e,n,r){if(Yt(t)){const i=$b(t,e,n,r);return i&&KX(i)&&i.catch(s=>{d0(s,e,n)}),i}if(Ot(t)){const i=[];for(let s=0;s>>1,i=Ha[r],s=Wx(i);s=Wx(n)?Ha.push(t):Ha.splice(Pxe(e),0,t),t.flags|=1,hie()}}function hie(){PM||(PM=fie.then(pie))}function Dx(t){Ot(t)?z1.push(...t):Mh&&t.id===-1?Mh.splice(Wg+1,0,t):t.flags&1||(z1.push(t),t.flags|=1),hie()}function yG(t,e,n=Tc+1){for(;nWx(n)-Wx(r));if(z1.length=0,Mh){Mh.push(...e);return}for(Mh=e,Wg=0;Wgt.id==null?t.flags&2?-1:1/0:t.id;function pie(t){const e=cl;try{for(Tc=0;TcAg.emit(i,...s)),jw=[]):typeof window<"u"&&window.HTMLElement&&!((r=(n=window.navigator)==null?void 0:n.userAgent)!=null&&r.includes("jsdom"))?((e.__VUE_DEVTOOLS_HOOK_REPLAY__=e.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(s=>{mie(s,e)}),setTimeout(()=>{Ag||(e.__VUE_DEVTOOLS_HOOK_REPLAY__=null,jw=[])},3e3)):jw=[]}let ws=null,BR=null;function Ax(t){const e=ws;return ws=t,BR=t&&t.type.__scopeId||null,e}function Rxe(t){BR=t}function Vxe(){BR=null}const zxe=t=>ft;function ft(t,e=ws,n){if(!e||t._n)return t;const r=(...i)=>{r._d&&xN(-1);const s=Ax(e);let a;try{a=t(...i)}finally{Ax(s),r._d&&xN(1)}return a};return r._n=!0,r._c=!0,r._d=!0,r}function hn(t,e){if(ws===null)return t;const n=iT(ws),r=t.dirs||(t.dirs=[]);for(let i=0;it.__isTeleport,G3=t=>t&&(t.disabled||t.disabled===""),SG=t=>t&&(t.defer||t.defer===""),xG=t=>typeof SVGElement<"u"&&t instanceof SVGElement,TG=t=>typeof MathMLElement=="function"&&t instanceof MathMLElement,pN=(t,e)=>{const n=t&&t.to;return $r(n)?e?e(n):null:n},bie={name:"Teleport",__isTeleport:!0,process(t,e,n,r,i,s,a,o,l,u){const{mc:c,pc:d,pbc:f,o:{insert:h,querySelector:p,createText:m,createComment:v}}=u,g=G3(e.props);let{shapeFlag:b,children:y,dynamicChildren:x}=e;if(t==null){const T=e.el=m(""),M=e.anchor=m("");h(T,n,r),h(M,n,r);const E=(P,R)=>{b&16&&(i&&i.isCE&&(i.ce._teleportTarget=P),c(y,P,R,i,s,a,o,l))},S=()=>{const P=e.target=pN(e.props,p),R=Sie(P,e,m,h);P&&(a!=="svg"&&xG(P)?a="svg":a!=="mathml"&&TG(P)&&(a="mathml"),g||(E(P,R),f7(e,!1)))};g&&(E(n,M),f7(e,!0)),SG(e.props)?gs(()=>{S(),e.el.__isMounted=!0},s):S()}else{if(SG(e.props)&&!t.el.__isMounted){gs(()=>{bie.process(t,e,n,r,i,s,a,o,l,u),delete t.el.__isMounted},s);return}e.el=t.el,e.targetStart=t.targetStart;const T=e.anchor=t.anchor,M=e.target=t.target,E=e.targetAnchor=t.targetAnchor,S=G3(t.props),P=S?n:M,R=S?T:E;if(a==="svg"||xG(M)?a="svg":(a==="mathml"||TG(M))&&(a="mathml"),x?(f(t.dynamicChildren,x,P,i,s,a,o),aC(t,e,!0)):l||d(t,e,P,R,i,s,a,o,!1),g)S?e.props&&t.props&&e.props.to!==t.props.to&&(e.props.to=t.props.to):Zw(e,n,T,u,1);else if((e.props&&e.props.to)!==(t.props&&t.props.to)){const V=e.target=pN(e.props,p);V&&Zw(e,V,null,u,0)}else S&&Zw(e,M,E,u,1);f7(e,g)}},remove(t,e,n,{um:r,o:{remove:i}},s){const{shapeFlag:a,children:o,anchor:l,targetStart:u,targetAnchor:c,target:d,props:f}=t;if(d&&(i(u),i(c)),s&&i(l),a&16){const h=s||!G3(f);for(let p=0;p{t.isMounted=!0}),ey(()=>{t.isUnmounting=!0}),t}const zl=[Function,Array],_X={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:zl,onEnter:zl,onAfterEnter:zl,onEnterCancelled:zl,onBeforeLeave:zl,onLeave:zl,onAfterLeave:zl,onLeaveCancelled:zl,onBeforeAppear:zl,onAppear:zl,onAfterAppear:zl,onAppearCancelled:zl},xie=t=>{const e=t.subTree;return e.component?xie(e.component):e},Oxe={name:"BaseTransition",props:_X,setup(t,{slots:e}){const n=Go(),r=QX();return()=>{const i=e.default&&HR(e.default(),!0);if(!i||!i.length)return;const s=Tie(i),a=gn(t),{mode:o}=a;if(r.isLeaving)return Oz(s);const l=wG(s);if(!l)return Oz(s);let u=_1(l,a,r,n,d=>u=d);l.type!==rs&&ff(l,u);let c=n.subTree&&wG(n.subTree);if(c&&c.type!==rs&&!Tu(l,c)&&xie(n).type!==rs){let d=_1(c,a,r,n);if(ff(c,d),o==="out-in"&&l.type!==rs)return r.isLeaving=!0,d.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete d.afterLeave,c=void 0},Oz(s);o==="in-out"&&l.type!==rs?d.delayLeave=(f,h,p)=>{const m=Eie(r,c);m[String(c.key)]=c,f[Ph]=()=>{h(),f[Ph]=void 0,delete u.delayedLeave,c=void 0},u.delayedLeave=()=>{p(),delete u.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return s}}};function Tie(t){let e=t[0];if(t.length>1){for(const n of t)if(n.type!==rs){e=n;break}}return e}const wie=Oxe;function Eie(t,e){const{leavingVNodes:n}=t;let r=n.get(e.type);return r||(r=Object.create(null),n.set(e.type,r)),r}function _1(t,e,n,r,i){const{appear:s,mode:a,persisted:o=!1,onBeforeEnter:l,onEnter:u,onAfterEnter:c,onEnterCancelled:d,onBeforeLeave:f,onLeave:h,onAfterLeave:p,onLeaveCancelled:m,onBeforeAppear:v,onAppear:g,onAfterAppear:b,onAppearCancelled:y}=e,x=String(t.key),T=Eie(n,t),M=(P,R)=>{P&&Yl(P,r,9,R)},E=(P,R)=>{const V=R[1];M(P,R),Ot(P)?P.every(z=>z.length<=1)&&V():P.length<=1&&V()},S={mode:a,persisted:o,beforeEnter(P){let R=l;if(!n.isMounted)if(s)R=v||l;else return;P[Ph]&&P[Ph](!0);const V=T[x];V&&Tu(t,V)&&V.el[Ph]&&V.el[Ph](),M(R,[P])},enter(P){let R=u,V=c,z=d;if(!n.isMounted)if(s)R=g||u,V=b||c,z=y||d;else return;let k=!1;const N=P[Jw]=q=>{k||(k=!0,q?M(z,[P]):M(V,[P]),S.delayedLeave&&S.delayedLeave(),P[Jw]=void 0)};R?E(R,[P,N]):N()},leave(P,R){const V=String(t.key);if(P[Jw]&&P[Jw](!0),n.isUnmounting)return R();M(f,[P]);let z=!1;const k=P[Ph]=N=>{z||(z=!0,R(),N?M(m,[P]):M(p,[P]),P[Ph]=void 0,T[V]===t&&delete T[V])};T[V]=t,h?E(h,[P,k]):k()},clone(P){const R=_1(P,e,n,r,i);return i&&i(R),R}};return S}function Oz(t){if(nT(t))return t=Cu(t),t.children=null,t}function wG(t){if(!nT(t))return gie(t.type)&&t.children?Tie(t.children):t;const{shapeFlag:e,children:n}=t;if(n){if(e&16)return n[0];if(e&32&&Yt(n.default))return n.default()}}function ff(t,e){t.shapeFlag&6&&t.component?(t.transition=e,ff(t.component.subTree,e)):t.shapeFlag&128?(t.ssContent.transition=e.clone(t.ssContent),t.ssFallback.transition=e.clone(t.ssFallback)):t.transition=e}function HR(t,e=!1,n){let r=[],i=0;for(let s=0;s1)for(let s=0;sAr({name:t.name},e,{setup:t}))():t}function Mie(){const t=Go();return t?(t.appContext.config.idPrefix||"v")+"-"+t.ids[0]+t.ids[1]++:""}function $X(t){t.ids=[t.ids[0]+t.ids[2]+++"-",0,0]}function Ixe(t){const e=Go(),n=c0(null);if(e){const i=e.refs===Wn?e.refs={}:e.refs;Object.defineProperty(i,t,{enumerable:!0,get:()=>n.value,set:s=>n.value=s})}return n}function Gx(t,e,n,r,i=!1){if(Ot(t)){t.forEach((p,m)=>Gx(p,e&&(Ot(e)?e[m]:e),n,r,i));return}if(ap(r)&&!i){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&Gx(t,e,n,r.component.subTree);return}const s=r.shapeFlag&4?iT(r.component):r.el,a=i?null:s,{i:o,r:l}=t,u=e&&e.r,c=o.refs===Wn?o.refs={}:o.refs,d=o.setupState,f=gn(d),h=d===Wn?()=>!1:p=>lr(f,p);if(u!=null&&u!==l&&($r(u)?(c[u]=null,h(u)&&(d[u]=null)):gi(u)&&(u.value=null)),Yt(l))$b(l,o,12,[a,c]);else{const p=$r(l),m=gi(l);if(p||m){const v=()=>{if(t.f){const g=p?h(l)?d[l]:c[l]:l.value;i?Ot(g)&&CX(g,s):Ot(g)?g.includes(s)||g.push(s):p?(c[l]=[s],h(l)&&(d[l]=c[l])):(l.value=[s],t.k&&(c[t.k]=l.value))}else p?(c[l]=a,h(l)&&(d[l]=a)):m&&(l.value=a,t.k&&(c[t.k]=a))};a?(v.id=-1,gs(v,n)):v()}}}let EG=!1;const B0=()=>{EG||(console.error("Hydration completed but contains mismatches."),EG=!0)},Uxe=t=>t.namespaceURI.includes("svg")&&t.tagName!=="foreignObject",Nxe=t=>t.namespaceURI.includes("MathML"),Yw=t=>{if(t.nodeType===1){if(Uxe(t))return"svg";if(Nxe(t))return"mathml"}},i1=t=>t.nodeType===8;function Lxe(t){const{mt:e,p:n,o:{patchProp:r,createText:i,nextSibling:s,parentNode:a,remove:o,insert:l,createComment:u}}=t,c=(y,x)=>{if(!x.hasChildNodes()){n(null,y,x),RM(),x._vnode=y;return}d(x.firstChild,y,null,null,null),RM(),x._vnode=y},d=(y,x,T,M,E,S=!1)=>{S=S||!!x.dynamicChildren;const P=i1(y)&&y.data==="[",R=()=>m(y,x,T,M,E,P),{type:V,ref:z,shapeFlag:k,patchFlag:N}=x;let q=y.nodeType;x.el=y,N===-2&&(S=!1,x.dynamicChildren=null);let L=null;switch(V){case op:q!==3?x.children===""?(l(x.el=i(""),a(y),y),L=y):L=R():(y.data!==x.children&&(B0(),y.data=x.children),L=s(y));break;case rs:b(y)?(L=s(y),g(x.el=y.content.firstChild,y,T)):q!==8||P?L=R():L=s(y);break;case wv:if(P&&(y=s(y),q=y.nodeType),q===1||q===3){L=y;const A=!x.children.length;for(let J=0;J{S=S||!!x.dynamicChildren;const{type:P,props:R,patchFlag:V,shapeFlag:z,dirs:k,transition:N}=x,q=P==="input"||P==="option";if(q||V!==-1){k&&Mc(x,null,T,"created");let L=!1;if(b(y)){L=_ie(null,N)&&T&&T.vnode.props&&T.vnode.props.appear;const J=y.content.firstChild;L&&N.beforeEnter(J),g(J,y,T),x.el=y=J}if(z&16&&!(R&&(R.innerHTML||R.textContent))){let J=h(y.firstChild,x,y,T,M,E,S);for(;J;){Bw(y,1)||B0();const F=J;J=J.nextSibling,o(F)}}else if(z&8){let J=x.children;J[0]===` +`&&(y.tagName==="PRE"||y.tagName==="TEXTAREA")&&(J=J.slice(1)),y.textContent!==J&&(Bw(y,0)||B0(),y.textContent=x.children)}if(R){if(q||!S||V&48){const J=y.tagName.includes("-");for(const F in R)(q&&(F.endsWith("value")||F==="indeterminate")||eT(F)&&!R1(F)||F[0]==="."||J)&&r(y,F,null,R[F],void 0,T)}else if(R.onClick)r(y,"onClick",null,R.onClick,void 0,T);else if(V&4&&Iu(R.style))for(const J in R.style)R.style[J]}let A;(A=R&&R.onVnodeBeforeMount)&&Po(A,T,x),k&&Mc(x,null,T,"beforeMount"),((A=R&&R.onVnodeMounted)||k||L)&&ose(()=>{A&&Po(A,T,x),L&&N.enter(y),k&&Mc(x,null,T,"mounted")},M)}return y.nextSibling},h=(y,x,T,M,E,S,P)=>{P=P||!!x.dynamicChildren;const R=x.children,V=R.length;for(let z=0;z{const{slotScopeIds:P}=x;P&&(E=E?E.concat(P):P);const R=a(y),V=h(s(y),x,R,T,M,E,S);return V&&i1(V)&&V.data==="]"?s(x.anchor=V):(B0(),l(x.anchor=u("]"),R,V),V)},m=(y,x,T,M,E,S)=>{if(Bw(y.parentElement,1)||B0(),x.el=null,S){const V=v(y);for(;;){const z=s(y);if(z&&z!==V)o(z);else break}}const P=s(y),R=a(y);return o(y),n(null,x,R,P,T,M,Yw(R),E),T&&(T.vnode.el=x.el,eV(T,x.el)),P},v=(y,x="[",T="]")=>{let M=0;for(;y;)if(y=s(y),y&&i1(y)&&(y.data===x&&M++,y.data===T)){if(M===0)return s(y);M--}return y},g=(y,x,T)=>{const M=x.parentNode;M&&M.replaceChild(y,x);let E=T;for(;E;)E.vnode.el===x&&(E.vnode.el=E.subTree.el=y),E=E.parent},b=y=>y.nodeType===1&&y.tagName==="TEMPLATE";return[c,d]}const MG="data-allow-mismatch",Xxe={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function Bw(t,e){if(e===0||e===1)for(;t&&!t.hasAttribute(MG);)t=t.parentElement;const n=t&&t.getAttribute(MG);if(n==null)return!1;if(n==="")return!0;{const r=n.split(",");return e===0&&r.includes("children")?!0:n.split(",").includes(Xxe[e])}}const Cxe=AR().requestIdleCallback||(t=>setTimeout(t,1)),Kxe=AR().cancelIdleCallback||(t=>clearTimeout(t)),qxe=(t=1e4)=>e=>{const n=Cxe(e,{timeout:t});return()=>Kxe(n)};function Dxe(t){const{top:e,left:n,bottom:r,right:i}=t.getBoundingClientRect(),{innerHeight:s,innerWidth:a}=window;return(e>0&&e0&&r0&&n0&&i(e,n)=>{const r=new IntersectionObserver(i=>{for(const s of i)if(s.isIntersecting){r.disconnect(),e();break}},t);return n(i=>{if(i instanceof Element){if(Dxe(i))return e(),r.disconnect(),!1;r.observe(i)}}),()=>r.disconnect()},Axe=t=>e=>{if(t){const n=matchMedia(t);if(n.matches)e();else return n.addEventListener("change",e,{once:!0}),()=>n.removeEventListener("change",e)}},Gxe=(t=[])=>(e,n)=>{$r(t)&&(t=[t]);let r=!1;const i=a=>{r||(r=!0,s(),e(),a.target.dispatchEvent(new a.constructor(a.type,a)))},s=()=>{n(a=>{for(const o of t)a.removeEventListener(o,i)})};return n(a=>{for(const o of t)a.addEventListener(o,i,{once:!0})}),s};function Fxe(t,e){if(i1(t)&&t.data==="["){let n=1,r=t.nextSibling;for(;r;){if(r.nodeType===1){if(e(r)===!1)break}else if(i1(r))if(r.data==="]"){if(--n===0)break}else r.data==="["&&n++;r=r.nextSibling}}else e(t)}const ap=t=>!!t.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function jxe(t){Yt(t)&&(t={loader:t});const{loader:e,loadingComponent:n,errorComponent:r,delay:i=200,hydrate:s,timeout:a,suspensible:o=!0,onError:l}=t;let u=null,c,d=0;const f=()=>(d++,u=null,h()),h=()=>{let p;return u||(p=u=e().catch(m=>{if(m=m instanceof Error?m:new Error(String(m)),l)return new Promise((v,g)=>{l(m,()=>v(f()),()=>g(m),d+1)});throw m}).then(m=>p!==u&&u?u:(m&&(m.__esModule||m[Symbol.toStringTag]==="Module")&&(m=m.default),c=m,m)))};return pt({name:"AsyncComponentWrapper",__asyncLoader:h,__asyncHydrate(p,m,v){const g=s?()=>{const b=s(v,y=>Fxe(p,y));b&&(m.bum||(m.bum=[])).push(b)}:v;c?g():h().then(()=>!m.isUnmounted&&g())},get __asyncResolved(){return c},setup(){const p=xs;if($X(p),c)return()=>Iz(c,p);const m=y=>{u=null,d0(y,p,13,!r)};if(o&&p.suspense||$1)return h().then(y=>()=>Iz(y,p)).catch(y=>(m(y),()=>r?xe(r,{error:y}):null));const v=ze(!1),g=ze(),b=ze(!!i);return i&&setTimeout(()=>{b.value=!1},i),a!=null&&setTimeout(()=>{if(!v.value&&!g.value){const y=new Error(`Async component timed out after ${a}ms.`);m(y),g.value=y}},a),h().then(()=>{v.value=!0,p.parent&&nT(p.parent.vnode)&&p.parent.update()}).catch(y=>{m(y),g.value=y}),()=>{if(v.value&&c)return Iz(c,p);if(g.value&&r)return xe(r,{error:g.value});if(n&&!b.value)return xe(n)}}})}function Iz(t,e){const{ref:n,props:r,children:i,ce:s}=e.vnode,a=xe(t,r,i);return a.ref=n,a.ce=s,delete e.vnode.ce,a}const nT=t=>t.type.__isKeepAlive,Zxe={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(t,{slots:e}){const n=Go(),r=n.ctx;if(!r.renderer)return()=>{const b=e.default&&e.default();return b&&b.length===1?b[0]:b};const i=new Map,s=new Set;let a=null;const o=n.suspense,{renderer:{p:l,m:u,um:c,o:{createElement:d}}}=r,f=d("div");r.activate=(b,y,x,T,M)=>{const E=b.component;u(b,y,x,0,o),l(E.vnode,b,y,x,E,o,T,b.slotScopeIds,M),gs(()=>{E.isDeactivated=!1,E.a&&V1(E.a);const S=b.props&&b.props.onVnodeMounted;S&&Po(S,E.parent,b)},o)},r.deactivate=b=>{const y=b.component;zM(y.m),zM(y.a),u(b,f,null,1,o),gs(()=>{y.da&&V1(y.da);const x=b.props&&b.props.onVnodeUnmounted;x&&Po(x,y.parent,b),y.isDeactivated=!0},o)};function h(b){Uz(b),c(b,n,o,!0)}function p(b){i.forEach((y,x)=>{const T=PN(y.type);T&&!b(T)&&m(x)})}function m(b){const y=i.get(b);y&&(!a||!Tu(y,a))?h(y):a&&Uz(a),i.delete(b),s.delete(b)}jt(()=>[t.include,t.exclude],([b,y])=>{b&&p(x=>h3(b,x)),y&&p(x=>!h3(y,x))},{flush:"post",deep:!0});let v=null;const g=()=>{v!=null&&(kM(n.subTree.type)?gs(()=>{i.set(v,Hw(n.subTree))},n.subTree.suspense):i.set(v,Hw(n.subTree)))};return _n(g),_R(g),ey(()=>{i.forEach(b=>{const{subTree:y,suspense:x}=n,T=Hw(y);if(b.type===T.type&&b.key===T.key){Uz(T);const M=T.component.da;M&&gs(M,x);return}h(b)})}),()=>{if(v=null,!e.default)return a=null;const b=e.default(),y=b[0];if(b.length>1)return a=null,b;if(!pf(y)||!(y.shapeFlag&4)&&!(y.shapeFlag&128))return a=null,y;let x=Hw(y);if(x.type===rs)return a=null,x;const T=x.type,M=PN(ap(x)?x.type.__asyncResolved||{}:T),{include:E,exclude:S,max:P}=t;if(E&&(!M||!h3(E,M))||S&&M&&h3(S,M))return x.shapeFlag&=-257,a=x,y;const R=x.key==null?T:x.key,V=i.get(R);return x.el&&(x=Cu(x),y.shapeFlag&128&&(y.ssContent=x)),v=R,V?(x.el=V.el,x.component=V.component,x.transition&&ff(x,x.transition),x.shapeFlag|=512,s.delete(R),s.add(R)):(s.add(R),P&&s.size>parseInt(P,10)&&m(s.values().next().value)),x.shapeFlag|=256,a=x,kM(y.type)?y:x}}},Jxe=Zxe;function h3(t,e){return Ot(t)?t.some(n=>h3(n,e)):$r(t)?t.split(",").includes(e):P3e(t)?(t.lastIndex=0,t.test(e)):!1}function Pie(t,e){Vie(t,"a",e)}function Rie(t,e){Vie(t,"da",e)}function Vie(t,e,n=xs){const r=t.__wdc||(t.__wdc=()=>{let i=n;for(;i;){if(i.isDeactivated)return;i=i.parent}return t()});if(QR(e,r,n),n){let i=n.parent;for(;i&&i.parent;)nT(i.parent.vnode)&&Yxe(r,e,n,i),i=i.parent}}function Yxe(t,e,n,r){const i=QR(e,t,r,!0);ls(()=>{CX(r[e],i)},n)}function Uz(t){t.shapeFlag&=-257,t.shapeFlag&=-513}function Hw(t){return t.shapeFlag&128?t.ssContent:t}function QR(t,e,n=xs,r=!1){if(n){const i=n[t]||(n[t]=[]),s=e.__weh||(e.__weh=(...a)=>{Yp();const o=Cv(n),l=Yl(e,n,t,a);return o(),Bp(),l});return r?i.unshift(s):i.push(s),s}}const Lf=t=>(e,n=xs)=>{(!$1||t==="sp")&&QR(t,(...r)=>e(...r),n)},zie=Lf("bm"),_n=Lf("m"),eC=Lf("bu"),_R=Lf("u"),ey=Lf("bum"),ls=Lf("um"),kie=Lf("sp"),Oie=Lf("rtg"),Iie=Lf("rtc");function Uie(t,e=xs){QR("ec",t,e)}const tC="components",Bxe="directives";function Xe(t,e){return nC(tC,t,!0,e)||t}const Nie=Symbol.for("v-ndc");function hf(t){return $r(t)?nC(tC,t,!1)||t:t||Nie}function Lie(t){return nC(Bxe,t)}function nC(t,e,n=!0,r=!1){const i=ws||xs;if(i){const s=i.type;if(t===tC){const o=PN(s,!1);if(o&&(o===e||o===sa(e)||o===tT(sa(e))))return s}const a=PG(i[t]||s[t],e)||PG(i.appContext[t],e);return!a&&r?s:a}}function PG(t,e){return t&&(t[e]||t[sa(e)]||t[tT(sa(e))])}function Pi(t,e,n,r){let i;const s=n&&n[r],a=Ot(t);if(a||$r(t)){const o=a&&Iu(t);let l=!1;o&&(l=!dl(t),t=jR(t)),i=new Array(t.length);for(let u=0,c=t.length;ue(o,l,void 0,s&&s[l]));else{const o=Object.keys(t);i=new Array(o.length);for(let l=0,u=o.length;l{const s=r.fn(...i);return s&&(s.key=r.key),s}:r.fn)}return t}function Qxe(t,e,n={},r,i){if(ws.ce||ws.parent&&ap(ws.parent)&&ws.parent.ce)return e!=="default"&&(n.name=e),pe(),Gt(Ct,null,[xe("slot",n,r&&r())],64);let s=t[e];s&&s._c&&(s._d=!1),pe();const a=s&&rC(s(n)),o=n.key||a&&a.key,l=Gt(Ct,{key:(o&&!Xu(o)?o:`_${e}`)+(!a&&r?"_fb":"")},a||(r?r():[]),a&&t._===1?64:-2);return!i&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),s&&s._c&&(s._d=!0),l}function rC(t){return t.some(e=>pf(e)?!(e.type===rs||e.type===Ct&&!rC(e.children)):!0)?t:null}function _xe(t,e){const n={};for(const r in t)n[e&&/[A-Z]/.test(r)?`on:${r}`:D3(r)]=t[r];return n}const mN=t=>t?hse(t)?iT(t):mN(t.parent):null,F3=Ar(Object.create(null),{$:t=>t,$el:t=>t.vnode.el,$data:t=>t.data,$props:t=>t.props,$attrs:t=>t.attrs,$slots:t=>t.slots,$refs:t=>t.refs,$parent:t=>mN(t.parent),$root:t=>mN(t.root),$host:t=>t.ce,$emit:t=>t.emit,$options:t=>iC(t),$forceUpdate:t=>t.f||(t.f=()=>{HX(t.update)}),$nextTick:t=>t.n||(t.n=Ia.bind(t.proxy)),$watch:t=>V6e.bind(t)}),Nz=(t,e)=>t!==Wn&&!t.__isScriptSetup&&lr(t,e),vN={get({_:t},e){if(e==="__v_skip")return!0;const{ctx:n,setupState:r,data:i,props:s,accessCache:a,type:o,appContext:l}=t;let u;if(e[0]!=="$"){const h=a[e];if(h!==void 0)switch(h){case 1:return r[e];case 2:return i[e];case 4:return n[e];case 3:return s[e]}else{if(Nz(r,e))return a[e]=1,r[e];if(i!==Wn&&lr(i,e))return a[e]=2,i[e];if((u=t.propsOptions[0])&&lr(u,e))return a[e]=3,s[e];if(n!==Wn&&lr(n,e))return a[e]=4,n[e];gN&&(a[e]=0)}}const c=F3[e];let d,f;if(c)return e==="$attrs"&&Ma(t.attrs,"get",""),c(t);if((d=o.__cssModules)&&(d=d[e]))return d;if(n!==Wn&&lr(n,e))return a[e]=4,n[e];if(f=l.config.globalProperties,lr(f,e))return f[e]},set({_:t},e,n){const{data:r,setupState:i,ctx:s}=t;return Nz(i,e)?(i[e]=n,!0):r!==Wn&&lr(r,e)?(r[e]=n,!0):lr(t.props,e)||e[0]==="$"&&e.slice(1)in t?!1:(s[e]=n,!0)},has({_:{data:t,setupState:e,accessCache:n,ctx:r,appContext:i,propsOptions:s}},a){let o;return!!n[a]||t!==Wn&&lr(t,a)||Nz(e,a)||(o=s[0])&&lr(o,a)||lr(r,a)||lr(F3,a)||lr(i.config.globalProperties,a)},defineProperty(t,e,n){return n.get!=null?t._.accessCache[e]=0:lr(n,"value")&&this.set(t,e,n.value,null),Reflect.defineProperty(t,e,n)}},$xe=Ar({},vN,{get(t,e){if(e!==Symbol.unscopables)return vN.get(t,e,t)},has(t,e){return e[0]!=="_"&&!O3e(e)}});function e6e(){return null}function t6e(){return null}function n6e(t){}function r6e(t){}function i6e(){return null}function s6e(){}function a6e(t,e){return null}function o6e(){return Xie().slots}function l6e(){return Xie().attrs}function Xie(){const t=Go();return t.setupContext||(t.setupContext=vse(t))}function Fx(t){return Ot(t)?t.reduce((e,n)=>(e[n]=null,e),{}):t}function u6e(t,e){const n=Fx(t);for(const r in e){if(r.startsWith("__skip"))continue;let i=n[r];i?Ot(i)||Yt(i)?i=n[r]={type:i,default:e[r]}:i.default=e[r]:i===null&&(i=n[r]={default:e[r]}),i&&e[`__skip_${r}`]&&(i.skipFactory=!0)}return n}function c6e(t,e){return!t||!e?t||e:Ot(t)&&Ot(e)?t.concat(e):Ar({},Fx(t),Fx(e))}function d6e(t,e){const n={};for(const r in t)e.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>t[r]});return n}function f6e(t){const e=Go();let n=t();return wN(),KX(n)&&(n=n.catch(r=>{throw Cv(e),r})),[n,()=>Cv(e)]}let gN=!0;function h6e(t){const e=iC(t),n=t.proxy,r=t.ctx;gN=!1,e.beforeCreate&&RG(e.beforeCreate,t,"bc");const{data:i,computed:s,methods:a,watch:o,provide:l,inject:u,created:c,beforeMount:d,mounted:f,beforeUpdate:h,updated:p,activated:m,deactivated:v,beforeDestroy:g,beforeUnmount:b,destroyed:y,unmounted:x,render:T,renderTracked:M,renderTriggered:E,errorCaptured:S,serverPrefetch:P,expose:R,inheritAttrs:V,components:z,directives:k,filters:N}=e;if(u&&p6e(u,r,null),a)for(const A in a){const J=a[A];Yt(J)&&(r[A]=J.bind(n))}if(i){const A=i.call(n,n);Ur(A)&&(t.data=Ao(A))}if(gN=!0,s)for(const A in s){const J=s[A],F=Yt(J)?J.bind(n,n):Yt(J.get)?J.get.bind(n,n):cl,ne=!Yt(J)&&Yt(J.set)?J.set.bind(n):cl,j=et({get:F,set:ne});Object.defineProperty(r,A,{enumerable:!0,configurable:!0,get:()=>j.value,set:Z=>j.value=Z})}if(o)for(const A in o)Cie(o[A],r,n,A);if(l){const A=Yt(l)?l.call(n):l;Reflect.ownKeys(A).forEach(J=>{Zi(J,A[J])})}c&&RG(c,t,"c");function L(A,J){Ot(J)?J.forEach(F=>A(F.bind(n))):J&&A(J.bind(n))}if(L(zie,d),L(_n,f),L(eC,h),L(_R,p),L(Pie,m),L(Rie,v),L(Uie,S),L(Iie,M),L(Oie,E),L(ey,b),L(ls,x),L(kie,P),Ot(R))if(R.length){const A=t.exposed||(t.exposed={});R.forEach(J=>{Object.defineProperty(A,J,{get:()=>n[J],set:F=>n[J]=F})})}else t.exposed||(t.exposed={});T&&t.render===cl&&(t.render=T),V!=null&&(t.inheritAttrs=V),z&&(t.components=z),k&&(t.directives=k),P&&$X(t)}function p6e(t,e,n=cl){Ot(t)&&(t=bN(t));for(const r in t){const i=t[r];let s;Ur(i)?"default"in i?s=cr(i.from||r,i.default,!0):s=cr(i.from||r):s=cr(i),gi(s)?Object.defineProperty(e,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:a=>s.value=a}):e[r]=s}}function RG(t,e,n){Yl(Ot(t)?t.map(r=>r.bind(e.proxy)):t.bind(e.proxy),e,n)}function Cie(t,e,n,r){let i=r.includes(".")?rse(n,r):()=>n[r];if($r(t)){const s=e[t];Yt(s)&&jt(i,s)}else if(Yt(t))jt(i,t.bind(n));else if(Ur(t))if(Ot(t))t.forEach(s=>Cie(s,e,n,r));else{const s=Yt(t.handler)?t.handler.bind(n):e[t.handler];Yt(s)&&jt(i,s,t)}}function iC(t){const e=t.type,{mixins:n,extends:r}=e,{mixins:i,optionsCache:s,config:{optionMergeStrategies:a}}=t.appContext,o=s.get(e);let l;return o?l=o:!i.length&&!n&&!r?l=e:(l={},i.length&&i.forEach(u=>VM(l,u,a,!0)),VM(l,e,a)),Ur(e)&&s.set(e,l),l}function VM(t,e,n,r=!1){const{mixins:i,extends:s}=e;s&&VM(t,s,n,!0),i&&i.forEach(a=>VM(t,a,n,!0));for(const a in e)if(!(r&&a==="expose")){const o=m6e[a]||n&&n[a];t[a]=o?o(t[a],e[a]):e[a]}return t}const m6e={data:VG,props:zG,emits:zG,methods:p3,computed:p3,beforeCreate:Aa,created:Aa,beforeMount:Aa,mounted:Aa,beforeUpdate:Aa,updated:Aa,beforeDestroy:Aa,beforeUnmount:Aa,destroyed:Aa,unmounted:Aa,activated:Aa,deactivated:Aa,errorCaptured:Aa,serverPrefetch:Aa,components:p3,directives:p3,watch:g6e,provide:VG,inject:v6e};function VG(t,e){return e?t?function(){return Ar(Yt(t)?t.call(this,this):t,Yt(e)?e.call(this,this):e)}:e:t}function v6e(t,e){return p3(bN(t),bN(e))}function bN(t){if(Ot(t)){const e={};for(let n=0;n1)return n&&Yt(e)?e.call(r&&r.proxy):e}}function qie(){return!!(xs||ws||Tv)}const Die={},Wie=()=>Object.create(Die),Aie=t=>Object.getPrototypeOf(t)===Die;function S6e(t,e,n,r=!1){const i={},s=Wie();t.propsDefaults=Object.create(null),Gie(t,e,i,s);for(const a in t.propsOptions[0])a in i||(i[a]=void 0);n?t.props=r?i:JX(i):t.type.props?t.props=i:t.props=s,t.attrs=s}function x6e(t,e,n,r){const{props:i,attrs:s,vnode:{patchFlag:a}}=t,o=gn(i),[l]=t.propsOptions;let u=!1;if((r||a>0)&&!(a&16)){if(a&8){const c=t.vnode.dynamicProps;for(let d=0;d{l=!0;const[f,h]=Fie(d,e,!0);Ar(a,f),h&&o.push(...h)};!n&&e.mixins.length&&e.mixins.forEach(c),t.extends&&c(t.extends),t.mixins&&t.mixins.forEach(c)}if(!s&&!l)return Ur(t)&&r.set(t,M1),M1;if(Ot(s))for(let c=0;ct[0]==="_"||t==="$stable",sC=t=>Ot(t)?t.map(zo):[zo(t)],w6e=(t,e,n)=>{if(e._n)return e;const r=ft((...i)=>sC(e(...i)),n);return r._c=!1,r},Zie=(t,e,n)=>{const r=t._ctx;for(const i in t){if(jie(i))continue;const s=t[i];if(Yt(s))e[i]=w6e(i,s,r);else if(s!=null){const a=sC(s);e[i]=()=>a}}},Jie=(t,e)=>{const n=sC(e);t.slots.default=()=>n},Yie=(t,e,n)=>{for(const r in e)(n||r!=="_")&&(t[r]=e[r])},E6e=(t,e,n)=>{const r=t.slots=Wie();if(t.vnode.shapeFlag&32){const i=e._;i?(Yie(r,e,n),n&&qre(r,"_",i,!0)):Zie(e,r)}else e&&Jie(t,e)},M6e=(t,e,n)=>{const{vnode:r,slots:i}=t;let s=!0,a=Wn;if(r.shapeFlag&32){const o=e._;o?n&&o===1?s=!1:Yie(i,e,n):(s=!e.$stable,Zie(e,i)),a=e}else e&&(Jie(t,e),a={default:1});if(s)for(const o in i)!jie(o)&&a[o]==null&&delete i[o]},gs=ose;function Bie(t){return Qie(t)}function Hie(t){return Qie(t,Lxe)}function Qie(t,e){const n=AR();n.__VUE__=!0;const{insert:r,remove:i,patchProp:s,createElement:a,createText:o,createComment:l,setText:u,setElementText:c,parentNode:d,nextSibling:f,setScopeId:h=cl,insertStaticContent:p}=t,m=(D,G,re,de=null,Te=null,he=null,ye=void 0,we=null,se=!!G.dynamicChildren)=>{if(D===G)return;D&&!Tu(D,G)&&(de=$(D),Z(D,Te,he,!0),D=null),G.patchFlag===-2&&(se=!1,G.dynamicChildren=null);const{type:W,ref:K,shapeFlag:ie}=G;switch(W){case op:v(D,G,re,de);break;case rs:g(D,G,re,de);break;case wv:D==null&&b(G,re,de,ye);break;case Ct:z(D,G,re,de,Te,he,ye,we,se);break;default:ie&1?T(D,G,re,de,Te,he,ye,we,se):ie&6?k(D,G,re,de,Te,he,ye,we,se):(ie&64||ie&128)&&W.process(D,G,re,de,Te,he,ye,we,se,ve)}K!=null&&Te&&Gx(K,D&&D.ref,he,G||D,!G)},v=(D,G,re,de)=>{if(D==null)r(G.el=o(G.children),re,de);else{const Te=G.el=D.el;G.children!==D.children&&u(Te,G.children)}},g=(D,G,re,de)=>{D==null?r(G.el=l(G.children||""),re,de):G.el=D.el},b=(D,G,re,de)=>{[D.el,D.anchor]=p(D.children,G,re,de,D.el,D.anchor)},y=({el:D,anchor:G},re,de)=>{let Te;for(;D&&D!==G;)Te=f(D),r(D,re,de),D=Te;r(G,re,de)},x=({el:D,anchor:G})=>{let re;for(;D&&D!==G;)re=f(D),i(D),D=re;i(G)},T=(D,G,re,de,Te,he,ye,we,se)=>{G.type==="svg"?ye="svg":G.type==="math"&&(ye="mathml"),D==null?M(G,re,de,Te,he,ye,we,se):P(D,G,Te,he,ye,we,se)},M=(D,G,re,de,Te,he,ye,we)=>{let se,W;const{props:K,shapeFlag:ie,transition:me,dirs:We}=D;if(se=D.el=a(D.type,he,K&&K.is,K),ie&8?c(se,D.children):ie&16&&S(D.children,se,null,de,Te,Lz(D,he),ye,we),We&&Mc(D,null,de,"created"),E(se,D,D.scopeId,ye,de),K){for(const Ae in K)Ae!=="value"&&!R1(Ae)&&s(se,Ae,null,K[Ae],he,de);"value"in K&&s(se,"value",null,K.value,he),(W=K.onVnodeBeforeMount)&&Po(W,de,D)}We&&Mc(D,null,de,"beforeMount");const Ce=_ie(Te,me);Ce&&me.beforeEnter(se),r(se,G,re),((W=K&&K.onVnodeMounted)||Ce||We)&&gs(()=>{W&&Po(W,de,D),Ce&&me.enter(se),We&&Mc(D,null,de,"mounted")},Te)},E=(D,G,re,de,Te)=>{if(re&&h(D,re),de)for(let he=0;he{for(let W=se;W{const we=G.el=D.el;let{patchFlag:se,dynamicChildren:W,dirs:K}=G;se|=D.patchFlag&16;const ie=D.props||Wn,me=G.props||Wn;let We;if(re&&wm(re,!1),(We=me.onVnodeBeforeUpdate)&&Po(We,re,G,D),K&&Mc(G,D,re,"beforeUpdate"),re&&wm(re,!0),(ie.innerHTML&&me.innerHTML==null||ie.textContent&&me.textContent==null)&&c(we,""),W?R(D.dynamicChildren,W,we,re,de,Lz(G,Te),he):ye||J(D,G,we,null,re,de,Lz(G,Te),he,!1),se>0){if(se&16)V(we,ie,me,re,Te);else if(se&2&&ie.class!==me.class&&s(we,"class",null,me.class,Te),se&4&&s(we,"style",ie.style,me.style,Te),se&8){const Ce=G.dynamicProps;for(let Ae=0;Ae{We&&Po(We,re,G,D),K&&Mc(G,D,re,"updated")},de)},R=(D,G,re,de,Te,he,ye)=>{for(let we=0;we{if(G!==re){if(G!==Wn)for(const he in G)!R1(he)&&!(he in re)&&s(D,he,G[he],null,Te,de);for(const he in re){if(R1(he))continue;const ye=re[he],we=G[he];ye!==we&&he!=="value"&&s(D,he,we,ye,Te,de)}"value"in re&&s(D,"value",G.value,re.value,Te)}},z=(D,G,re,de,Te,he,ye,we,se)=>{const W=G.el=D?D.el:o(""),K=G.anchor=D?D.anchor:o("");let{patchFlag:ie,dynamicChildren:me,slotScopeIds:We}=G;We&&(we=we?we.concat(We):We),D==null?(r(W,re,de),r(K,re,de),S(G.children||[],re,K,Te,he,ye,we,se)):ie>0&&ie&64&&me&&D.dynamicChildren?(R(D.dynamicChildren,me,re,Te,he,ye,we),(G.key!=null||Te&&G===Te.subTree)&&aC(D,G,!0)):J(D,G,re,K,Te,he,ye,we,se)},k=(D,G,re,de,Te,he,ye,we,se)=>{G.slotScopeIds=we,D==null?G.shapeFlag&512?Te.ctx.activate(G,re,de,ye,se):N(G,re,de,Te,he,ye,se):q(D,G,se)},N=(D,G,re,de,Te,he,ye)=>{const we=D.component=fse(D,de,Te);if(nT(D)&&(we.ctx.renderer=ve),pse(we,!1,ye),we.asyncDep){if(Te&&Te.registerDep(we,L,ye),!D.el){const se=we.subTree=xe(rs);g(null,se,G,re)}}else L(we,D,G,re,Te,he,ye)},q=(D,G,re)=>{const de=G.component=D.component;if(N6e(D,G,re))if(de.asyncDep&&!de.asyncResolved){A(de,G,re);return}else de.next=G,de.update();else G.el=D.el,de.vnode=G},L=(D,G,re,de,Te,he,ye)=>{const we=()=>{if(D.isMounted){let{next:ie,bu:me,u:We,parent:Ce,vnode:Ae}=D;{const Q=$ie(D);if(Q){ie&&(ie.el=Ae.el,A(D,ie,ye)),Q.asyncDep.then(()=>{D.isUnmounted||we()});return}}let Y=ie,ce;wm(D,!1),ie?(ie.el=Ae.el,A(D,ie,ye)):ie=Ae,me&&V1(me),(ce=ie.props&&ie.props.onVnodeBeforeUpdate)&&Po(ce,Ce,ie,Ae),wm(D,!0);const be=h7(D),Se=D.subTree;D.subTree=be,m(Se,be,d(Se.el),$(Se),D,Te,he),ie.el=be.el,Y===null&&eV(D,be.el),We&&gs(We,Te),(ce=ie.props&&ie.props.onVnodeUpdated)&&gs(()=>Po(ce,Ce,ie,Ae),Te)}else{let ie;const{el:me,props:We}=G,{bm:Ce,m:Ae,parent:Y,root:ce,type:be}=D,Se=ap(G);if(wm(D,!1),Ce&&V1(Ce),!Se&&(ie=We&&We.onVnodeBeforeMount)&&Po(ie,Y,G),wm(D,!0),me&&ue){const Q=()=>{D.subTree=h7(D),ue(me,D.subTree,D,Te,null)};Se&&be.__asyncHydrate?be.__asyncHydrate(me,D,Q):Q()}else{ce.ce&&ce.ce._injectChildStyle(be);const Q=D.subTree=h7(D);m(null,Q,re,de,D,Te,he),G.el=Q.el}if(Ae&&gs(Ae,Te),!Se&&(ie=We&&We.onVnodeMounted)){const Q=G;gs(()=>Po(ie,Y,Q),Te)}(G.shapeFlag&256||Y&&ap(Y.vnode)&&Y.vnode.shapeFlag&256)&&D.a&&gs(D.a,Te),D.isMounted=!0,G=re=de=null}};D.scope.on();const se=D.effect=new Cx(we);D.scope.off();const W=D.update=se.run.bind(se),K=D.job=se.runIfDirty.bind(se);K.i=D,K.id=D.uid,se.scheduler=()=>HX(K),wm(D,!0),W()},A=(D,G,re)=>{G.component=D;const de=D.vnode.props;D.vnode=G,D.next=null,x6e(D,G.props,de,re),M6e(D,G.children,re),Yp(),yG(D),Bp()},J=(D,G,re,de,Te,he,ye,we,se=!1)=>{const W=D&&D.children,K=D?D.shapeFlag:0,ie=G.children,{patchFlag:me,shapeFlag:We}=G;if(me>0){if(me&128){ne(W,ie,re,de,Te,he,ye,we,se);return}else if(me&256){F(W,ie,re,de,Te,he,ye,we,se);return}}We&8?(K&16&&te(W,Te,he),ie!==W&&c(re,ie)):K&16?We&16?ne(W,ie,re,de,Te,he,ye,we,se):te(W,Te,he,!0):(K&8&&c(re,""),We&16&&S(ie,re,de,Te,he,ye,we,se))},F=(D,G,re,de,Te,he,ye,we,se)=>{D=D||M1,G=G||M1;const W=D.length,K=G.length,ie=Math.min(W,K);let me;for(me=0;meK?te(D,Te,he,!0,!1,ie):S(G,re,de,Te,he,ye,we,se,ie)},ne=(D,G,re,de,Te,he,ye,we,se)=>{let W=0;const K=G.length;let ie=D.length-1,me=K-1;for(;W<=ie&&W<=me;){const We=D[W],Ce=G[W]=se?Rh(G[W]):zo(G[W]);if(Tu(We,Ce))m(We,Ce,re,null,Te,he,ye,we,se);else break;W++}for(;W<=ie&&W<=me;){const We=D[ie],Ce=G[me]=se?Rh(G[me]):zo(G[me]);if(Tu(We,Ce))m(We,Ce,re,null,Te,he,ye,we,se);else break;ie--,me--}if(W>ie){if(W<=me){const We=me+1,Ce=Weme)for(;W<=ie;)Z(D[W],Te,he,!0),W++;else{const We=W,Ce=W,Ae=new Map;for(W=Ce;W<=me;W++){const Fe=G[W]=se?Rh(G[W]):zo(G[W]);Fe.key!=null&&Ae.set(Fe.key,W)}let Y,ce=0;const be=me-Ce+1;let Se=!1,Q=0;const Pe=new Array(be);for(W=0;W=be){Z(Fe,Te,he,!0);continue}let je;if(Fe.key!=null)je=Ae.get(Fe.key);else for(Y=Ce;Y<=me;Y++)if(Pe[Y-Ce]===0&&Tu(Fe,G[Y])){je=Y;break}je===void 0?Z(Fe,Te,he,!0):(Pe[je-Ce]=W+1,je>=Q?Q=je:Se=!0,m(Fe,G[je],re,null,Te,he,ye,we,se),ce++)}const Ve=Se?P6e(Pe):M1;for(Y=Ve.length-1,W=be-1;W>=0;W--){const Fe=Ce+W,je=G[Fe],Ze=Fe+1{const{el:he,type:ye,transition:we,children:se,shapeFlag:W}=D;if(W&6){j(D.component.subTree,G,re,de);return}if(W&128){D.suspense.move(G,re,de);return}if(W&64){ye.move(D,G,re,ve);return}if(ye===Ct){r(he,G,re);for(let ie=0;iewe.enter(he),Te);else{const{leave:ie,delayLeave:me,afterLeave:We}=we,Ce=()=>r(he,G,re),Ae=()=>{ie(he,()=>{Ce(),We&&We()})};me?me(he,Ce,Ae):Ae()}else r(he,G,re)},Z=(D,G,re,de=!1,Te=!1)=>{const{type:he,props:ye,ref:we,children:se,dynamicChildren:W,shapeFlag:K,patchFlag:ie,dirs:me,cacheIndex:We}=D;if(ie===-2&&(Te=!1),we!=null&&Gx(we,null,re,D,!0),We!=null&&(G.renderCache[We]=void 0),K&256){G.ctx.deactivate(D);return}const Ce=K&1&&me,Ae=!ap(D);let Y;if(Ae&&(Y=ye&&ye.onVnodeBeforeUnmount)&&Po(Y,G,D),K&6)fe(D.component,re,de);else{if(K&128){D.suspense.unmount(re,de);return}Ce&&Mc(D,null,G,"beforeUnmount"),K&64?D.type.remove(D,G,re,ve,de):W&&!W.hasOnce&&(he!==Ct||ie>0&&ie&64)?te(W,G,re,!1,!0):(he===Ct&&ie&384||!Te&&K&16)&&te(se,G,re),de&&_(D)}(Ae&&(Y=ye&&ye.onVnodeUnmounted)||Ce)&&gs(()=>{Y&&Po(Y,G,D),Ce&&Mc(D,null,G,"unmounted")},re)},_=D=>{const{type:G,el:re,anchor:de,transition:Te}=D;if(G===Ct){le(re,de);return}if(G===wv){x(D);return}const he=()=>{i(re),Te&&!Te.persisted&&Te.afterLeave&&Te.afterLeave()};if(D.shapeFlag&1&&Te&&!Te.persisted){const{leave:ye,delayLeave:we}=Te,se=()=>ye(re,he);we?we(D.el,he,se):se()}else he()},le=(D,G)=>{let re;for(;D!==G;)re=f(D),i(D),D=re;i(G)},fe=(D,G,re)=>{const{bum:de,scope:Te,job:he,subTree:ye,um:we,m:se,a:W}=D;zM(se),zM(W),de&&V1(de),Te.stop(),he&&(he.flags|=8,Z(ye,D,G,re)),we&&gs(we,G),gs(()=>{D.isUnmounted=!0},G),G&&G.pendingBranch&&!G.isUnmounted&&D.asyncDep&&!D.asyncResolved&&D.suspenseId===G.pendingId&&(G.deps--,G.deps===0&&G.resolve())},te=(D,G,re,de=!1,Te=!1,he=0)=>{for(let ye=he;ye{if(D.shapeFlag&6)return $(D.component.subTree);if(D.shapeFlag&128)return D.suspense.next();const G=f(D.anchor||D.el),re=G&&G[vie];return re?f(re):G};let oe=!1;const ge=(D,G,re)=>{D==null?G._vnode&&Z(G._vnode,null,null,!0):m(G._vnode||null,D,G,null,null,null,re),G._vnode=D,oe||(oe=!0,yG(),RM(),oe=!1)},ve={p:m,um:Z,m:j,r:_,mt:N,mc:S,pc:J,pbc:R,n:$,o:t};let Ke,ue;return e&&([Ke,ue]=e(ve)),{render:ge,hydrate:Ke,createApp:y6e(ge,Ke)}}function Lz({type:t,props:e},n){return n==="svg"&&t==="foreignObject"||n==="mathml"&&t==="annotation-xml"&&e&&e.encoding&&e.encoding.includes("html")?void 0:n}function wm({effect:t,job:e},n){n?(t.flags|=32,e.flags|=4):(t.flags&=-33,e.flags&=-5)}function _ie(t,e){return(!t||t&&!t.pendingBranch)&&e&&!e.persisted}function aC(t,e,n=!1){const r=t.children,i=e.children;if(Ot(r)&&Ot(i))for(let s=0;s>1,t[n[o]]0&&(e[r]=n[s-1]),n[s]=r)}}for(s=n.length,a=n[s-1];s-- >0;)n[s]=a,a=e[a];return n}function $ie(t){const e=t.subTree.component;if(e)return e.asyncDep&&!e.asyncResolved?e:$ie(e)}function zM(t){if(t)for(let e=0;ecr(ese);function Ps(t,e){return rT(t,null,e)}function R6e(t,e){return rT(t,null,{flush:"post"})}function nse(t,e){return rT(t,null,{flush:"sync"})}function jt(t,e,n){return rT(t,e,n)}function rT(t,e,n=Wn){const{immediate:r,deep:i,flush:s,once:a}=n,o=Ar({},n),l=e&&r||!e&&s!=="post";let u;if($1){if(s==="sync"){const h=tse();u=h.__watcherHandles||(h.__watcherHandles=[])}else if(!l){const h=()=>{};return h.stop=cl,h.resume=cl,h.pause=cl,h}}const c=xs;o.call=(h,p,m)=>Yl(h,c,p,m);let d=!1;s==="post"?o.scheduler=h=>{gs(h,c&&c.suspense)}:s!=="sync"&&(d=!0,o.scheduler=(h,p)=>{p?h():HX(h)}),o.augmentJob=h=>{e&&(h.flags|=4),d&&(h.flags|=2,c&&(h.id=c.uid,h.i=c))};const f=yxe(t,e,o);return $1&&(u?u.push(f):l&&f()),f}function V6e(t,e,n){const r=this.proxy,i=$r(t)?t.includes(".")?rse(r,t):()=>r[t]:t.bind(r,r);let s;Yt(e)?s=e:(s=e.handler,n=e);const a=Cv(this),o=rT(i,s.bind(r),n);return a(),o}function rse(t,e){const n=e.split(".");return()=>{let r=t;for(let i=0;i{let c,d=Wn,f;return nse(()=>{const h=t[i];Ba(c,h)&&(c=h,u())}),{get(){return l(),n.get?n.get(c):c},set(h){const p=n.set?n.set(h):h;if(!Ba(p,c)&&!(d!==Wn&&Ba(h,d)))return;const m=r.vnode.props;m&&(e in m||i in m||s in m)&&(`onUpdate:${e}`in m||`onUpdate:${i}`in m||`onUpdate:${s}`in m)||(c=h,u()),r.emit(`update:${e}`,p),Ba(h,p)&&Ba(h,d)&&!Ba(p,f)&&u(),d=h,f=p}}});return o[Symbol.iterator]=()=>{let l=0;return{next(){return l<2?{value:l++?a||Wn:o,done:!1}:{done:!0}}}},o}const ise=(t,e)=>e==="modelValue"||e==="model-value"?t.modelModifiers:t[`${e}Modifiers`]||t[`${sa(e)}Modifiers`]||t[`${ko(e)}Modifiers`];function k6e(t,e,...n){if(t.isUnmounted)return;const r=t.vnode.props||Wn;let i=n;const s=e.startsWith("update:"),a=s&&ise(r,e.slice(7));a&&(a.trim&&(i=n.map(c=>$r(c)?c.trim():c)),a.number&&(i=n.map(TM)));let o,l=r[o=D3(e)]||r[o=D3(sa(e))];!l&&s&&(l=r[o=D3(ko(e))]),l&&Yl(l,t,6,i);const u=r[o+"Once"];if(u){if(!t.emitted)t.emitted={};else if(t.emitted[o])return;t.emitted[o]=!0,Yl(u,t,6,i)}}function sse(t,e,n=!1){const r=e.emitsCache,i=r.get(t);if(i!==void 0)return i;const s=t.emits;let a={},o=!1;if(!Yt(t)){const l=u=>{const c=sse(u,e,!0);c&&(o=!0,Ar(a,c))};!n&&e.mixins.length&&e.mixins.forEach(l),t.extends&&l(t.extends),t.mixins&&t.mixins.forEach(l)}return!s&&!o?(Ur(t)&&r.set(t,null),null):(Ot(s)?s.forEach(l=>a[l]=null):Ar(a,s),Ur(t)&&r.set(t,a),a)}function $R(t,e){return!t||!eT(e)?!1:(e=e.slice(2).replace(/Once$/,""),lr(t,e[0].toLowerCase()+e.slice(1))||lr(t,ko(e))||lr(t,e))}function h7(t){const{type:e,vnode:n,proxy:r,withProxy:i,propsOptions:[s],slots:a,attrs:o,emit:l,render:u,renderCache:c,props:d,data:f,setupState:h,ctx:p,inheritAttrs:m}=t,v=Ax(t);let g,b;try{if(n.shapeFlag&4){const x=i||r,T=x;g=zo(u.call(T,x,c,d,h,f,p)),b=o}else{const x=e;g=zo(x.length>1?x(d,{attrs:o,slots:a,emit:l}):x(d,null)),b=e.props?o:I6e(o)}}catch(x){j3.length=0,d0(x,t,1),g=xe(rs)}let y=g;if(b&&m!==!1){const x=Object.keys(b),{shapeFlag:T}=y;x.length&&T&7&&(s&&x.some(XX)&&(b=U6e(b,s)),y=Cu(y,b,!1,!0))}return n.dirs&&(y=Cu(y,null,!1,!0),y.dirs=y.dirs?y.dirs.concat(n.dirs):n.dirs),n.transition&&ff(y,n.transition),g=y,Ax(v),g}function O6e(t,e=!0){let n;for(let r=0;r{let e;for(const n in t)(n==="class"||n==="style"||eT(n))&&((e||(e={}))[n]=t[n]);return e},U6e=(t,e)=>{const n={};for(const r in t)(!XX(r)||!(r.slice(9)in e))&&(n[r]=t[r]);return n};function N6e(t,e,n){const{props:r,children:i,component:s}=t,{props:a,children:o,patchFlag:l}=e,u=s.emitsOptions;if(e.dirs||e.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?OG(r,a,u):!!a;if(l&8){const c=e.dynamicProps;for(let d=0;dt.__isSuspense;let SN=0;const L6e={name:"Suspense",__isSuspense:!0,process(t,e,n,r,i,s,a,o,l,u){if(t==null)X6e(e,n,r,i,s,a,o,l,u);else{if(s&&s.deps>0&&!t.suspense.isInFallback){e.suspense=t.suspense,e.suspense.vnode=e,e.el=t.el;return}C6e(t,e,n,r,i,a,o,l,u)}},hydrate:K6e,normalize:q6e},tV=L6e;function jx(t,e){const n=t.props&&t.props[e];Yt(n)&&n()}function X6e(t,e,n,r,i,s,a,o,l){const{p:u,o:{createElement:c}}=l,d=c("div"),f=t.suspense=ase(t,i,r,e,d,n,s,a,o,l);u(null,f.pendingBranch=t.ssContent,d,null,r,f,s,a),f.deps>0?(jx(t,"onPending"),jx(t,"onFallback"),u(null,t.ssFallback,e,n,r,null,s,a),k1(f,t.ssFallback)):f.resolve(!1,!0)}function C6e(t,e,n,r,i,s,a,o,{p:l,um:u,o:{createElement:c}}){const d=e.suspense=t.suspense;d.vnode=e,e.el=t.el;const f=e.ssContent,h=e.ssFallback,{activeBranch:p,pendingBranch:m,isInFallback:v,isHydrating:g}=d;if(m)d.pendingBranch=f,Tu(f,m)?(l(m,f,d.hiddenContainer,null,i,d,s,a,o),d.deps<=0?d.resolve():v&&(g||(l(p,h,n,r,i,null,s,a,o),k1(d,h)))):(d.pendingId=SN++,g?(d.isHydrating=!1,d.activeBranch=m):u(m,i,d),d.deps=0,d.effects.length=0,d.hiddenContainer=c("div"),v?(l(null,f,d.hiddenContainer,null,i,d,s,a,o),d.deps<=0?d.resolve():(l(p,h,n,r,i,null,s,a,o),k1(d,h))):p&&Tu(f,p)?(l(p,f,n,r,i,d,s,a,o),d.resolve(!0)):(l(null,f,d.hiddenContainer,null,i,d,s,a,o),d.deps<=0&&d.resolve()));else if(p&&Tu(f,p))l(p,f,n,r,i,d,s,a,o),k1(d,f);else if(jx(e,"onPending"),d.pendingBranch=f,f.shapeFlag&512?d.pendingId=f.component.suspenseId:d.pendingId=SN++,l(null,f,d.hiddenContainer,null,i,d,s,a,o),d.deps<=0)d.resolve();else{const{timeout:b,pendingId:y}=d;b>0?setTimeout(()=>{d.pendingId===y&&d.fallback(h)},b):b===0&&d.fallback(h)}}function ase(t,e,n,r,i,s,a,o,l,u,c=!1){const{p:d,m:f,um:h,n:p,o:{parentNode:m,remove:v}}=u;let g;const b=D6e(t);b&&e&&e.pendingBranch&&(g=e.pendingId,e.deps++);const y=t.props?wM(t.props.timeout):void 0,x=s,T={vnode:t,parent:e,parentComponent:n,namespace:a,container:r,hiddenContainer:i,deps:0,pendingId:SN++,timeout:typeof y=="number"?y:-1,activeBranch:null,pendingBranch:null,isInFallback:!c,isHydrating:c,isUnmounted:!1,effects:[],resolve(M=!1,E=!1){const{vnode:S,activeBranch:P,pendingBranch:R,pendingId:V,effects:z,parentComponent:k,container:N}=T;let q=!1;T.isHydrating?T.isHydrating=!1:M||(q=P&&R.transition&&R.transition.mode==="out-in",q&&(P.transition.afterLeave=()=>{V===T.pendingId&&(f(R,N,s===x?p(P):s,0),Dx(z))}),P&&(m(P.el)===N&&(s=p(P)),h(P,k,T,!0)),q||f(R,N,s,0)),k1(T,R),T.pendingBranch=null,T.isInFallback=!1;let L=T.parent,A=!1;for(;L;){if(L.pendingBranch){L.effects.push(...z),A=!0;break}L=L.parent}!A&&!q&&Dx(z),T.effects=[],b&&e&&e.pendingBranch&&g===e.pendingId&&(e.deps--,e.deps===0&&!E&&e.resolve()),jx(S,"onResolve")},fallback(M){if(!T.pendingBranch)return;const{vnode:E,activeBranch:S,parentComponent:P,container:R,namespace:V}=T;jx(E,"onFallback");const z=p(S),k=()=>{T.isInFallback&&(d(null,M,R,z,P,null,V,o,l),k1(T,M))},N=M.transition&&M.transition.mode==="out-in";N&&(S.transition.afterLeave=k),T.isInFallback=!0,h(S,P,null,!0),N||k()},move(M,E,S){T.activeBranch&&f(T.activeBranch,M,E,S),T.container=M},next(){return T.activeBranch&&p(T.activeBranch)},registerDep(M,E,S){const P=!!T.pendingBranch;P&&T.deps++;const R=M.vnode.el;M.asyncDep.catch(V=>{d0(V,M,0)}).then(V=>{if(M.isUnmounted||T.isUnmounted||T.pendingId!==M.suspenseId)return;M.asyncResolved=!0;const{vnode:z}=M;EN(M,V,!1),R&&(z.el=R);const k=!R&&M.subTree.el;E(M,z,m(R||M.subTree.el),R?null:p(M.subTree),T,a,S),k&&v(k),eV(M,z.el),P&&--T.deps===0&&T.resolve()})},unmount(M,E){T.isUnmounted=!0,T.activeBranch&&h(T.activeBranch,n,M,E),T.pendingBranch&&h(T.pendingBranch,n,M,E)}};return T}function K6e(t,e,n,r,i,s,a,o,l){const u=e.suspense=ase(e,r,n,t.parentNode,document.createElement("div"),null,i,s,a,o,!0),c=l(t,u.pendingBranch=e.ssContent,n,u,s,a);return u.deps===0&&u.resolve(!1,!0),c}function q6e(t){const{shapeFlag:e,children:n}=t,r=e&32;t.ssContent=IG(r?n.default:n),t.ssFallback=r?IG(n.fallback):xe(rs)}function IG(t){let e;if(Yt(t)){const n=Xv&&t._c;n&&(t._d=!1,pe()),t=t(),n&&(t._d=!0,e=ka,lse())}return Ot(t)&&(t=O6e(t)),t=zo(t),e&&!t.dynamicChildren&&(t.dynamicChildren=e.filter(n=>n!==t)),t}function ose(t,e){e&&e.pendingBranch?Ot(t)?e.effects.push(...t):e.effects.push(t):Dx(t)}function k1(t,e){t.activeBranch=e;const{vnode:n,parentComponent:r}=t;let i=e.el;for(;!i&&e.component;)e=e.component.subTree,i=e.el;n.el=i,r&&r.subTree===n&&(r.vnode.el=i,eV(r,i))}function D6e(t){const e=t.props&&t.props.suspensible;return e!=null&&e!==!1}const Ct=Symbol.for("v-fgt"),op=Symbol.for("v-txt"),rs=Symbol.for("v-cmt"),wv=Symbol.for("v-stc"),j3=[];let ka=null;function pe(t=!1){j3.push(ka=t?null:[])}function lse(){j3.pop(),ka=j3[j3.length-1]||null}let Xv=1;function xN(t,e=!1){Xv+=t,t<0&&ka&&e&&(ka.hasOnce=!0)}function use(t){return t.dynamicChildren=Xv>0?ka||M1:null,lse(),Xv>0&&ka&&ka.push(t),t}function ke(t,e,n,r,i,s){return use(O(t,e,n,r,i,s,!0))}function Gt(t,e,n,r,i){return use(xe(t,e,n,r,i,!0))}function pf(t){return t?t.__v_isVNode===!0:!1}function Tu(t,e){return t.type===e.type&&t.key===e.key}function W6e(t){}const cse=({key:t})=>t??null,p7=({ref:t,ref_key:e,ref_for:n})=>(typeof t=="number"&&(t=""+t),t!=null?$r(t)||gi(t)||Yt(t)?{i:ws,r:t,k:e,f:!!n}:t:null);function O(t,e=null,n=null,r=0,i=null,s=t===Ct?0:1,a=!1,o=!1){const l={__v_isVNode:!0,__v_skip:!0,type:t,props:e,key:e&&cse(e),ref:e&&p7(e),scopeId:BR,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:ws};return o?(oC(l,n),s&128&&t.normalize(l)):n&&(l.shapeFlag|=$r(n)?8:16),Xv>0&&!a&&ka&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&ka.push(l),l}const xe=A6e;function A6e(t,e=null,n=null,r=0,i=null,s=!1){if((!t||t===Nie)&&(t=rs),pf(t)){const o=Cu(t,e,!0);return n&&oC(o,n),Xv>0&&!s&&ka&&(o.shapeFlag&6?ka[ka.indexOf(t)]=o:ka.push(o)),o.patchFlag=-2,o}if(B6e(t)&&(t=t.__vccOpts),e){e=nV(e);let{class:o,style:l}=e;o&&!$r(o)&&(e.class=En(o)),Ur(l)&&(u0(l)&&!Ot(l)&&(l=Ar({},l)),e.style=Ms(l))}const a=$r(t)?1:kM(t)?128:gie(t)?64:Ur(t)?4:Yt(t)?2:0;return O(t,e,n,r,i,a,s,!0)}function nV(t){return t?u0(t)||Aie(t)?Ar({},t):t:null}function Cu(t,e,n=!1,r=!1){const{props:i,ref:s,patchFlag:a,children:o,transition:l}=t,u=e?dse(i||{},e):i,c={__v_isVNode:!0,__v_skip:!0,type:t.type,props:u,key:u&&cse(u),ref:e&&e.ref?n&&s?Ot(s)?s.concat(p7(e)):[s,p7(e)]:p7(e):s,scopeId:t.scopeId,slotScopeIds:t.slotScopeIds,children:o,target:t.target,targetStart:t.targetStart,targetAnchor:t.targetAnchor,staticCount:t.staticCount,shapeFlag:t.shapeFlag,patchFlag:e&&t.type!==Ct?a===-1?16:a|16:a,dynamicProps:t.dynamicProps,dynamicChildren:t.dynamicChildren,appContext:t.appContext,dirs:t.dirs,transition:l,component:t.component,suspense:t.suspense,ssContent:t.ssContent&&Cu(t.ssContent),ssFallback:t.ssFallback&&Cu(t.ssFallback),el:t.el,anchor:t.anchor,ctx:t.ctx,ce:t.ce};return l&&r&&ff(c,l.clone(c)),c}function yr(t=" ",e=0){return xe(op,null,t,e)}function rV(t,e){const n=xe(wv,null,t);return n.staticCount=e,n}function In(t="",e=!1){return e?(pe(),Gt(rs,null,t)):xe(rs,null,t)}function zo(t){return t==null||typeof t=="boolean"?xe(rs):Ot(t)?xe(Ct,null,t.slice()):pf(t)?Rh(t):xe(op,null,String(t))}function Rh(t){return t.el===null&&t.patchFlag!==-1||t.memo?t:Cu(t)}function oC(t,e){let n=0;const{shapeFlag:r}=t;if(e==null)e=null;else if(Ot(e))n=16;else if(typeof e=="object")if(r&65){const i=e.default;i&&(i._c&&(i._d=!1),oC(t,i()),i._c&&(i._d=!0));return}else{n=32;const i=e._;!i&&!Aie(e)?e._ctx=ws:i===3&&ws&&(ws.slots._===1?e._=1:(e._=2,t.patchFlag|=1024))}else Yt(e)?(e={default:e,_ctx:ws},n=32):(e=String(e),r&64?(n=16,e=[yr(e)]):n=8);t.children=e,t.shapeFlag|=n}function dse(...t){const e={};for(let n=0;nxs||ws;let OM,TN;{const t=AR(),e=(n,r)=>{let i;return(i=t[n])||(i=t[n]=[]),i.push(r),s=>{i.length>1?i.forEach(a=>a(s)):i[0](s)}};OM=e("__VUE_INSTANCE_SETTERS__",n=>xs=n),TN=e("__VUE_SSR_SETTERS__",n=>$1=n)}const Cv=t=>{const e=xs;return OM(t),t.scope.on(),()=>{t.scope.off(),OM(e)}},wN=()=>{xs&&xs.scope.off(),OM(null)};function hse(t){return t.vnode.shapeFlag&4}let $1=!1;function pse(t,e=!1,n=!1){e&&TN(e);const{props:r,children:i}=t.vnode,s=hse(t);S6e(t,r,s,e),E6e(t,i,n);const a=s?j6e(t,e):void 0;return e&&TN(!1),a}function j6e(t,e){const n=t.type;t.accessCache=Object.create(null),t.proxy=new Proxy(t.ctx,vN);const{setup:r}=n;if(r){Yp();const i=t.setupContext=r.length>1?vse(t):null,s=Cv(t),a=$b(r,t,0,[t.props,i]),o=KX(a);if(Bp(),s(),(o||t.sp)&&!ap(t)&&$X(t),o){if(a.then(wN,wN),e)return a.then(l=>{EN(t,l,e)}).catch(l=>{d0(l,t,0)});t.asyncDep=a}else EN(t,a,e)}else mse(t,e)}function EN(t,e,n){Yt(e)?t.type.__ssrInlineRender?t.ssrRender=e:t.render=e:Ur(e)&&(t.setupState=BX(e)),mse(t,n)}let IM,MN;function Z6e(t){IM=t,MN=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,$xe))}}const J6e=()=>!IM;function mse(t,e,n){const r=t.type;if(!t.render){if(!e&&IM&&!r.render){const i=r.template||iC(t).template;if(i){const{isCustomElement:s,compilerOptions:a}=t.appContext.config,{delimiters:o,compilerOptions:l}=r,u=Ar(Ar({isCustomElement:s,delimiters:o},a),l);r.render=IM(i,u)}}t.render=r.render||cl,MN&&MN(t)}{const i=Cv(t);Yp();try{h6e(t)}finally{Bp(),i()}}}const Y6e={get(t,e){return Ma(t,"get",""),t[e]}};function vse(t){const e=n=>{t.exposed=n||{}};return{attrs:new Proxy(t.attrs,Y6e),slots:t.slots,emit:t.emit,expose:e}}function iT(t){return t.exposed?t.exposeProxy||(t.exposeProxy=new Proxy(BX(YR(t.exposed)),{get(e,n){if(n in e)return e[n];if(n in F3)return F3[n](t)},has(e,n){return n in e||n in F3}})):t.proxy}function PN(t,e=!0){return Yt(t)?t.displayName||t.name:t.name||e&&t.__name}function B6e(t){return Yt(t)&&"__vccOpts"in t}const et=(t,e)=>mxe(t,e,$1);function An(t,e,n){const r=arguments.length;return r===2?Ur(e)&&!Ot(e)?pf(e)?xe(t,null,[e]):xe(t,e):xe(t,null,e):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&pf(n)&&(n=[n]),xe(t,e,n))}function H6e(){}function Q6e(t,e,n,r){const i=n[r];if(i&&gse(i,t))return i;const s=e();return s.memo=t.slice(),s.cacheIndex=r,n[r]=s}function gse(t,e){const n=t.memo;if(n.length!=e.length)return!1;for(let r=0;r0&&ka&&ka.push(t),!0}const lC="3.5.13",_6e=cl,$6e=Exe,eTe=Ag,tTe=mie,nTe={createComponentInstance:fse,setupComponent:pse,renderComponentRoot:h7,setCurrentRenderingInstance:Ax,isVNode:pf,normalizeVNode:zo,getComponentPublicInstance:iT,ensureValidVNode:rC,pushWarningContext:Sxe,popWarningContext:xxe},rTe=nTe,iTe=null,sTe=null,aTe=null;/** * @vue/runtime-dom v3.5.13 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let RN;const LG=typeof window<"u"&&window.trustedTypes;if(LG)try{RN=LG.createPolicy("vue",{createHTML:t=>t})}catch{}const yse=RN?t=>RN.createHTML(t):t=>t,aTe="http://www.w3.org/2000/svg",oTe="http://www.w3.org/1998/Math/MathML",Kd=typeof document<"u"?document:null,XG=Kd&&Kd.createElement("template"),lTe={insert:(t,e,n)=>{e.insertBefore(t,n||null)},remove:t=>{const e=t.parentNode;e&&e.removeChild(t)},createElement:(t,e,n,r)=>{const i=e==="svg"?Kd.createElementNS(aTe,t):e==="mathml"?Kd.createElementNS(oTe,t):n?Kd.createElement(t,{is:n}):Kd.createElement(t);return t==="select"&&r&&r.multiple!=null&&i.setAttribute("multiple",r.multiple),i},createText:t=>Kd.createTextNode(t),createComment:t=>Kd.createComment(t),setText:(t,e)=>{t.nodeValue=e},setElementText:(t,e)=>{t.textContent=e},parentNode:t=>t.parentNode,nextSibling:t=>t.nextSibling,querySelector:t=>Kd.querySelector(t),setScopeId(t,e){t.setAttribute(e,"")},insertStaticContent(t,e,n,r,i,s){const a=n?n.previousSibling:e.lastChild;if(i&&(i===s||i.nextSibling))for(;e.insertBefore(i.cloneNode(!0),n),!(i===s||!(i=i.nextSibling)););else{XG.innerHTML=yse(r==="svg"?`${t}`:r==="mathml"?`${t}`:t);const o=XG.content;if(r==="svg"||r==="mathml"){const l=o.firstChild;for(;l.firstChild;)o.appendChild(l.firstChild);o.removeChild(l)}e.insertBefore(o,n)}return[a?a.nextSibling:e.firstChild,n?n.previousSibling:e.lastChild]}},th="transition",mS="animation",eb=Symbol("_vtc"),Sse={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},xse=Ar({},QX,Sse),uTe=t=>(t.displayName="Transition",t.props=xse,t),Rp=uTe((t,{slots:e})=>An(Eie,Tse(t),e)),Em=(t,e=[])=>{Ot(t)?t.forEach(n=>n(...e)):t&&t(...e)},CG=t=>t?Ot(t)?t.some(e=>e.length>1):t.length>1:!1;function Tse(t){const e={};for(const z in t)z in Sse||(e[z]=t[z]);if(t.css===!1)return e;const{name:n="v",type:r,duration:i,enterFromClass:s=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:o=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:u=a,appearToClass:c=o,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=t,p=cTe(i),m=p&&p[0],v=p&&p[1],{onBeforeEnter:g,onEnter:b,onEnterCancelled:y,onLeave:x,onLeaveCancelled:T,onBeforeAppear:M=g,onAppear:E=b,onAppearCancelled:S=y}=e,P=(z,k,N,q)=>{z._enterCancelled=q,Sh(z,k?c:o),Sh(z,k?u:a),N&&N()},R=(z,k)=>{z._isLeaving=!1,Sh(z,d),Sh(z,h),Sh(z,f),k&&k()},V=z=>(k,N)=>{const q=z?E:b,L=()=>P(k,z,N);Em(q,[k,L]),KG(()=>{Sh(k,z?l:s),yc(k,z?c:o),CG(q)||qG(k,r,m,L)})};return Ar(e,{onBeforeEnter(z){Em(g,[z]),yc(z,s),yc(z,a)},onBeforeAppear(z){Em(M,[z]),yc(z,l),yc(z,u)},onEnter:V(!1),onAppear:V(!0),onLeave(z,k){z._isLeaving=!0;const N=()=>R(z,k);yc(z,d),z._enterCancelled?(yc(z,f),VN()):(VN(),yc(z,f)),KG(()=>{z._isLeaving&&(Sh(z,d),yc(z,h),CG(x)||qG(z,r,v,N))}),Em(x,[z,N])},onEnterCancelled(z){P(z,!1,void 0,!0),Em(y,[z])},onAppearCancelled(z){P(z,!0,void 0,!0),Em(S,[z])},onLeaveCancelled(z){R(z),Em(T,[z])}})}function cTe(t){if(t==null)return null;if(Ur(t))return[Xz(t.enter),Xz(t.leave)];{const e=Xz(t);return[e,e]}}function Xz(t){return EM(t)}function yc(t,e){e.split(/\s+/).forEach(n=>n&&t.classList.add(n)),(t[eb]||(t[eb]=new Set)).add(e)}function Sh(t,e){e.split(/\s+/).forEach(r=>r&&t.classList.remove(r));const n=t[eb];n&&(n.delete(e),n.size||(t[eb]=void 0))}function KG(t){requestAnimationFrame(()=>{requestAnimationFrame(t)})}let dTe=0;function qG(t,e,n,r){const i=t._endId=++dTe,s=()=>{i===t._endId&&r()};if(n!=null)return setTimeout(s,n);const{type:a,timeout:o,propCount:l}=wse(t,e);if(!a)return r();const u=a+"end";let c=0;const d=()=>{t.removeEventListener(u,f),s()},f=h=>{h.target===t&&++c>=l&&d()};setTimeout(()=>{c(n[p]||"").split(", "),i=r(`${th}Delay`),s=r(`${th}Duration`),a=DG(i,s),o=r(`${mS}Delay`),l=r(`${mS}Duration`),u=DG(o,l);let c=null,d=0,f=0;e===th?a>0&&(c=th,d=a,f=s.length):e===mS?u>0&&(c=mS,d=u,f=l.length):(d=Math.max(a,u),c=d>0?a>u?th:mS:null,f=c?c===th?s.length:l.length:0);const h=c===th&&/\b(transform|all)(,|$)/.test(r(`${th}Property`).toString());return{type:c,timeout:d,propCount:f,hasTransform:h}}function DG(t,e){for(;t.lengthWG(n)+WG(t[r])))}function WG(t){return t==="auto"?0:Number(t.slice(0,-1).replace(",","."))*1e3}function VN(){return document.body.offsetHeight}function fTe(t,e,n){const r=t[eb];r&&(e=(e?[e,...r]:[...r]).join(" ")),e==null?t.removeAttribute("class"):n?t.setAttribute("class",e):t.className=e}const NM=Symbol("_vod"),Ese=Symbol("_vsh"),lC={beforeMount(t,{value:e},{transition:n}){t[NM]=t.style.display==="none"?"":t.style.display,n&&e?n.beforeEnter(t):vS(t,e)},mounted(t,{value:e},{transition:n}){n&&e&&n.enter(t)},updated(t,{value:e,oldValue:n},{transition:r}){!e!=!n&&(r?e?(r.beforeEnter(t),vS(t,!0),r.enter(t)):r.leave(t,()=>{vS(t,!1)}):vS(t,e))},beforeUnmount(t,{value:e}){vS(t,e)}};function vS(t,e){t.style.display=e?t[NM]:"none",t[Ese]=!e}function hTe(){lC.getSSRProps=({value:t})=>{if(!t)return{style:{display:"none"}}}}const Mse=Symbol("");function pTe(t){const e=Fo();if(!e)return;const n=e.ut=(i=t(e.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${e.uid}"]`)).forEach(s=>LM(s,i))},r=()=>{const i=t(e.proxy);e.ce?LM(e.ce,i):zN(e.subTree,i),n(i)};$X(()=>{Wx(r)}),_n(()=>{jt(r,dl,{flush:"post"});const i=new MutationObserver(r);i.observe(e.subTree.el.parentNode,{childList:!0}),ls(()=>i.disconnect())})}function zN(t,e){if(t.shapeFlag&128){const n=t.suspense;t=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{zN(n.activeBranch,e)})}for(;t.component;)t=t.component.subTree;if(t.shapeFlag&1&&t.el)LM(t.el,e);else if(t.type===Ct)t.children.forEach(n=>zN(n,e));else if(t.type===wv){let{el:n,anchor:r}=t;for(;n&&(LM(n,e),n!==r);)n=n.nextSibling}}function LM(t,e){if(t.nodeType===1){const n=t.style;let r="";for(const i in e)n.setProperty(`--${i}`,e[i]),r+=`--${i}: ${e[i]};`;n[Mse]=r}}const mTe=/(^|;)\s*display\s*:/;function vTe(t,e,n){const r=t.style,i=$r(n);let s=!1;if(n&&!i){if(e)if($r(e))for(const a of e.split(";")){const o=a.slice(0,a.indexOf(":")).trim();n[o]==null&&m7(r,o,"")}else for(const a in e)n[a]==null&&m7(r,a,"");for(const a in n)a==="display"&&(s=!0),m7(r,a,n[a])}else if(i){if(e!==n){const a=r[Mse];a&&(n+=";"+a),r.cssText=n,s=mTe.test(n)}}else e&&t.removeAttribute("style");NM in t&&(t[NM]=s?r.display:"",t[Ese]&&(r.display="none"))}const AG=/\s*!important$/;function m7(t,e,n){if(Ot(n))n.forEach(r=>m7(t,e,r));else if(n==null&&(n=""),e.startsWith("--"))t.setProperty(e,n);else{const r=gTe(t,e);AG.test(n)?t.setProperty(Oo(r),n.replace(AG,""),"important"):t[r]=n}}const GG=["Webkit","Moz","ms"],Cz={};function gTe(t,e){const n=Cz[e];if(n)return n;let r=sa(e);if(r!=="filter"&&r in t)return Cz[e]=r;r=nT(r);for(let i=0;iKz||(xTe.then(()=>Kz=0),Kz=Date.now());function wTe(t,e){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Yl(ETe(r,n.value),e,5,[r])};return n.value=t,n.attached=TTe(),n}function ETe(t,e){if(Ot(e)){const n=t.stopImmediatePropagation;return t.stopImmediatePropagation=()=>{n.call(t),t._stopped=!0},e.map(r=>i=>!i._stopped&&r&&r(i))}else return e}const BG=t=>t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&t.charCodeAt(2)>96&&t.charCodeAt(2)<123,MTe=(t,e,n,r,i,s)=>{const a=i==="svg";e==="class"?fTe(t,r,a):e==="style"?vTe(t,n,r):tT(e)?LX(e)||yTe(t,e,n,r,s):(e[0]==="."?(e=e.slice(1),!0):e[0]==="^"?(e=e.slice(1),!1):PTe(t,e,r,a))?(ZG(t,e,r),!t.tagName.includes("-")&&(e==="value"||e==="checked"||e==="selected")&&jG(t,e,r,a,s,e!=="value")):t._isVueCE&&(/[A-Z]/.test(e)||!$r(r))?ZG(t,sa(e),r,s,e):(e==="true-value"?t._trueValue=r:e==="false-value"&&(t._falseValue=r),jG(t,e,r,a))};function PTe(t,e,n,r){if(r)return!!(e==="innerHTML"||e==="textContent"||e in t&&BG(e)&&Yt(n));if(e==="spellcheck"||e==="draggable"||e==="translate"||e==="form"||e==="list"&&t.tagName==="INPUT"||e==="type"&&t.tagName==="TEXTAREA")return!1;if(e==="width"||e==="height"){const i=t.tagName;if(i==="IMG"||i==="VIDEO"||i==="CANVAS"||i==="SOURCE")return!1}return BG(e)&&$r(n)?!1:e in t}const HG={};/*! #__NO_SIDE_EFFECTS__ */function Pse(t,e,n){const r=pt(t,e);DR(r)&&Ar(r,e);class i extends iV{constructor(a){super(r,a,n)}}return i.def=r,i}/*! #__NO_SIDE_EFFECTS__ */const RTe=(t,e)=>Pse(t,e,qse),VTe=typeof HTMLElement<"u"?HTMLElement:class{};class iV extends VTe{constructor(e,n={},r=CM){super(),this._def=e,this._props=n,this._createApp=r,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._ob=null,this.shadowRoot&&r!==CM?this._root=this.shadowRoot:e.shadowRoot!==!1?(this.attachShadow({mode:"open"}),this._root=this.shadowRoot):this._root=this,this._def.__asyncLoader||this._resolveProps(this._def)}connectedCallback(){if(!this.isConnected)return;this.shadowRoot||this._parseSlots(),this._connected=!0;let e=this;for(;e=e&&(e.parentNode||e.host);)if(e instanceof iV){this._parent=e;break}this._instance||(this._resolved?(this._setParent(),this._update()):e&&e._pendingResolve?this._pendingResolve=e._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(e=this._parent){e&&(this._instance.parent=e._instance,this._instance.provides=e._instance.provides)}disconnectedCallback(){this._connected=!1,Ia(()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null)})}_resolveDef(){if(this._pendingResolve)return;for(let r=0;r{for(const i of r)this._setAttr(i.attributeName)}),this._ob.observe(this,{attributes:!0});const e=(r,i=!1)=>{this._resolved=!0,this._pendingResolve=void 0;const{props:s,styles:a}=r;let o;if(s&&!Ot(s))for(const l in s){const u=s[l];(u===Number||u&&u.type===Number)&&(l in this._props&&(this._props[l]=EM(this._props[l])),(o||(o=Object.create(null)))[sa(l)]=!0)}this._numberProps=o,i&&this._resolveProps(r),this.shadowRoot&&this._applyStyles(a),this._mount(r)},n=this._def.__asyncLoader;n?this._pendingResolve=n().then(r=>e(this._def=r,!0)):e(this._def)}_mount(e){this._app=this._createApp(e),e.configureApp&&e.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);const n=this._instance&&this._instance.exposed;if(n)for(const r in n)lr(this,r)||Object.defineProperty(this,r,{get:()=>Ls(n[r])})}_resolveProps(e){const{props:n}=e,r=Ot(n)?n:Object.keys(n||{});for(const i of Object.keys(this))i[0]!=="_"&&r.includes(i)&&this._setProp(i,this[i]);for(const i of r.map(sa))Object.defineProperty(this,i,{get(){return this._getProp(i)},set(s){this._setProp(i,s,!0,!0)}})}_setAttr(e){if(e.startsWith("data-v-"))return;const n=this.hasAttribute(e);let r=n?this.getAttribute(e):HG;const i=sa(e);n&&this._numberProps&&this._numberProps[i]&&(r=EM(r)),this._setProp(i,r,!1,!0)}_getProp(e){return this._props[e]}_setProp(e,n,r=!0,i=!1){if(n!==this._props[e]&&(n===HG?delete this._props[e]:(this._props[e]=n,e==="key"&&this._app&&(this._app._ceVNode.key=n)),i&&this._instance&&this._update(),r)){const s=this._ob;s&&s.disconnect(),n===!0?this.setAttribute(Oo(e),""):typeof n=="string"||typeof n=="number"?this.setAttribute(Oo(e),n+""):n||this.removeAttribute(Oo(e)),s&&s.observe(this,{attributes:!0})}}_update(){Kse(this._createVNode(),this._root)}_createVNode(){const e={};this.shadowRoot||(e.onVnodeMounted=e.onVnodeUpdated=this._renderSlots.bind(this));const n=xe(this._def,Ar(e,this._props));return this._instance||(n.ce=r=>{this._instance=r,r.ce=this,r.isCE=!0;const i=(s,a)=>{this.dispatchEvent(new CustomEvent(s,DR(a[0])?Ar({detail:a},a[0]):{detail:a}))};r.emit=(s,...a)=>{i(s,a),Oo(s)!==s&&i(Oo(s),a)},this._setParent()}),n}_applyStyles(e,n){if(!e)return;if(n){if(n===this._def||this._styleChildren.has(n))return;this._styleChildren.add(n)}const r=this._nonce;for(let i=e.length-1;i>=0;i--){const s=document.createElement("style");r&&s.setAttribute("nonce",r),s.textContent=e[i],this.shadowRoot.prepend(s)}}_parseSlots(){const e=this._slots={};let n;for(;n=this.firstChild;){const r=n.nodeType===1&&n.getAttribute("slot")||"default";(e[r]||(e[r]=[])).push(n),this.removeChild(n)}}_renderSlots(){const e=(this._teleportTarget||this).querySelectorAll("slot"),n=this._instance.type.__scopeId;for(let r=0;r(delete t.props.mode,t),ITe=OTe({name:"TransitionGroup",props:Ar({},xse,{tag:String,moveClass:String}),setup(t,{slots:e}){const n=Fo(),r=HX();let i,s;return _R(()=>{if(!i.length)return;const a=t.moveClass||`${t.name||"v"}-move`;if(!CTe(i[0].el,n.vnode.el,a))return;i.forEach(NTe),i.forEach(LTe);const o=i.filter(XTe);VN(),o.forEach(l=>{const u=l.el,c=u.style;yc(u,a),c.transform=c.webkitTransform=c.transitionDuration="";const d=u[XM]=f=>{f&&f.target!==u||(!f||/transform$/.test(f.propertyName))&&(u.removeEventListener("transitionend",d),u[XM]=null,Sh(u,a))};u.addEventListener("transitionend",d)})}),()=>{const a=gn(t),o=Tse(a);let l=a.tag||Ct;if(i=[],s)for(let u=0;u{o.split(/\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\s+/).forEach(o=>o&&r.classList.add(o)),r.style.display="none";const s=e.nodeType===1?e:e.parentNode;s.appendChild(r);const{hasTransform:a}=wse(r);return s.removeChild(r),a}const Vp=t=>{const e=t.props["onUpdate:modelValue"]||!1;return Ot(e)?n=>V1(e,n):e};function KTe(t){t.target.composing=!0}function _G(t){const e=t.target;e.composing&&(e.composing=!1,e.dispatchEvent(new Event("input")))}const jl=Symbol("_assign"),On={created(t,{modifiers:{lazy:e,trim:n,number:r}},i){t[jl]=Vp(i);const s=r||i.props&&i.props.type==="number";Yd(t,e?"change":"input",a=>{if(a.target.composing)return;let o=t.value;n&&(o=o.trim()),s&&(o=wM(o)),t[jl](o)}),n&&Yd(t,"change",()=>{t.value=t.value.trim()}),e||(Yd(t,"compositionstart",KTe),Yd(t,"compositionend",_G),Yd(t,"change",_G))},mounted(t,{value:e}){t.value=e??""},beforeUpdate(t,{value:e,oldValue:n,modifiers:{lazy:r,trim:i,number:s}},a){if(t[jl]=Vp(a),t.composing)return;const o=(s||t.type==="number")&&!/^0\d/.test(t.value)?wM(t.value):t.value,l=e??"";o!==l&&(document.activeElement===t&&t.type!=="range"&&(r&&e===n||i&&t.value.trim()===l)||(t.value=l))}},mf={deep:!0,created(t,e,n){t[jl]=Vp(n),Yd(t,"change",()=>{const r=t._modelValue,i=tb(t),s=t.checked,a=t[jl];if(Ot(r)){const o=GR(r,i),l=o!==-1;if(s&&!l)a(r.concat(i));else if(!s&&l){const u=[...r];u.splice(o,1),a(u)}}else if(l0(r)){const o=new Set(r);s?o.add(i):o.delete(i),a(o)}else a(Ose(t,s))})},mounted:$G,beforeUpdate(t,e,n){t[jl]=Vp(n),$G(t,e,n)}};function $G(t,{value:e,oldValue:n},r){t._modelValue=e;let i;if(Ot(e))i=GR(e,r.props.value)>-1;else if(l0(e))i=e.has(r.props.value);else{if(e===n)return;i=Mp(e,Ose(t,!0))}t.checked!==i&&(t.checked=i)}const uC={created(t,{value:e},n){t.checked=Mp(e,n.props.value),t[jl]=Vp(n),Yd(t,"change",()=>{t[jl](tb(t))})},beforeUpdate(t,{value:e,oldValue:n},r){t[jl]=Vp(r),e!==n&&(t.checked=Mp(e,r.props.value))}},kse={deep:!0,created(t,{value:e,modifiers:{number:n}},r){const i=l0(e);Yd(t,"change",()=>{const s=Array.prototype.filter.call(t.options,a=>a.selected).map(a=>n?wM(tb(a)):tb(a));t[jl](t.multiple?i?new Set(s):s:s[0]),t._assigning=!0,Ia(()=>{t._assigning=!1})}),t[jl]=Vp(r)},mounted(t,{value:e}){eF(t,e)},beforeUpdate(t,e,n){t[jl]=Vp(n)},updated(t,{value:e}){t._assigning||eF(t,e)}};function eF(t,e){const n=t.multiple,r=Ot(e);if(!(n&&!r&&!l0(e))){for(let i=0,s=t.options.length;iString(u)===String(o)):a.selected=GR(e,o)>-1}else a.selected=e.has(o);else if(Mp(tb(a),e)){t.selectedIndex!==i&&(t.selectedIndex=i);return}}!n&&t.selectedIndex!==-1&&(t.selectedIndex=-1)}}function tb(t){return"_value"in t?t._value:t.value}function Ose(t,e){const n=e?"_trueValue":"_falseValue";return n in t?t[n]:e}const Ise={created(t,e,n){Qw(t,e,n,null,"created")},mounted(t,e,n){Qw(t,e,n,null,"mounted")},beforeUpdate(t,e,n,r){Qw(t,e,n,r,"beforeUpdate")},updated(t,e,n,r){Qw(t,e,n,r,"updated")}};function Use(t,e){switch(t){case"SELECT":return kse;case"TEXTAREA":return On;default:switch(e){case"checkbox":return mf;case"radio":return uC;default:return On}}}function Qw(t,e,n,r,i){const a=Use(t.tagName,n.props&&n.props.type)[i];a&&a(t,e,n,r)}function qTe(){On.getSSRProps=({value:t})=>({value:t}),uC.getSSRProps=({value:t},e)=>{if(e.props&&Mp(e.props.value,t))return{checked:!0}},mf.getSSRProps=({value:t},e)=>{if(Ot(t)){if(e.props&&GR(t,e.props.value)>-1)return{checked:!0}}else if(l0(t)){if(e.props&&t.has(e.props.value))return{checked:!0}}else if(t)return{checked:!0}},Ise.getSSRProps=(t,e)=>{if(typeof e.type!="string")return;const n=Use(e.type.toUpperCase(),e.props&&e.props.type);if(n.getSSRProps)return n.getSSRProps(t,e)}}const DTe=["ctrl","shift","alt","meta"],WTe={stop:t=>t.stopPropagation(),prevent:t=>t.preventDefault(),self:t=>t.target!==t.currentTarget,ctrl:t=>!t.ctrlKey,shift:t=>!t.shiftKey,alt:t=>!t.altKey,meta:t=>!t.metaKey,left:t=>"button"in t&&t.button!==0,middle:t=>"button"in t&&t.button!==1,right:t=>"button"in t&&t.button!==2,exact:(t,e)=>DTe.some(n=>t[`${n}Key`]&&!e.includes(n))},f0=(t,e)=>{const n=t._withMods||(t._withMods={}),r=e.join(".");return n[r]||(n[r]=(i,...s)=>{for(let a=0;a{const n=t._withKeys||(t._withKeys={}),r=e.join(".");return n[r]||(n[r]=i=>{if(!("key"in i))return;const s=Oo(i.key);if(e.some(a=>a===s||ATe[a]===s))return t(i)})},Lse=Ar({patchProp:MTe},lTe);let J3,tF=!1;function Xse(){return J3||(J3=Hie(Lse))}function Cse(){return J3=tF?J3:Qie(Lse),tF=!0,J3}const Kse=(...t)=>{Xse().render(...t)},GTe=(...t)=>{Cse().hydrate(...t)},CM=(...t)=>{const e=Xse().createApp(...t),{mount:n}=e;return e.mount=r=>{const i=Wse(r);if(!i)return;const s=e._component;!Yt(s)&&!s.render&&!s.template&&(s.template=i.innerHTML),i.nodeType===1&&(i.textContent="");const a=n(i,!1,Dse(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),a},e},qse=(...t)=>{const e=Cse().createApp(...t),{mount:n}=e;return e.mount=r=>{const i=Wse(r);if(i)return n(i,!0,Dse(i))},e};function Dse(t){if(t instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&t instanceof MathMLElement)return"mathml"}function Wse(t){return $r(t)?document.querySelector(t):t}let nF=!1;const FTe=()=>{nF||(nF=!0,qTe(),hTe())};/** +**/let RN;const UG=typeof window<"u"&&window.trustedTypes;if(UG)try{RN=UG.createPolicy("vue",{createHTML:t=>t})}catch{}const bse=RN?t=>RN.createHTML(t):t=>t,oTe="http://www.w3.org/2000/svg",lTe="http://www.w3.org/1998/Math/MathML",Kd=typeof document<"u"?document:null,NG=Kd&&Kd.createElement("template"),uTe={insert:(t,e,n)=>{e.insertBefore(t,n||null)},remove:t=>{const e=t.parentNode;e&&e.removeChild(t)},createElement:(t,e,n,r)=>{const i=e==="svg"?Kd.createElementNS(oTe,t):e==="mathml"?Kd.createElementNS(lTe,t):n?Kd.createElement(t,{is:n}):Kd.createElement(t);return t==="select"&&r&&r.multiple!=null&&i.setAttribute("multiple",r.multiple),i},createText:t=>Kd.createTextNode(t),createComment:t=>Kd.createComment(t),setText:(t,e)=>{t.nodeValue=e},setElementText:(t,e)=>{t.textContent=e},parentNode:t=>t.parentNode,nextSibling:t=>t.nextSibling,querySelector:t=>Kd.querySelector(t),setScopeId(t,e){t.setAttribute(e,"")},insertStaticContent(t,e,n,r,i,s){const a=n?n.previousSibling:e.lastChild;if(i&&(i===s||i.nextSibling))for(;e.insertBefore(i.cloneNode(!0),n),!(i===s||!(i=i.nextSibling)););else{NG.innerHTML=bse(r==="svg"?`${t}`:r==="mathml"?`${t}`:t);const o=NG.content;if(r==="svg"||r==="mathml"){const l=o.firstChild;for(;l.firstChild;)o.appendChild(l.firstChild);o.removeChild(l)}e.insertBefore(o,n)}return[a?a.nextSibling:e.firstChild,n?n.previousSibling:e.lastChild]}},th="transition",pS="animation",eb=Symbol("_vtc"),yse={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Sse=Ar({},_X,yse),cTe=t=>(t.displayName="Transition",t.props=Sse,t),Rp=cTe((t,{slots:e})=>An(wie,xse(t),e)),Em=(t,e=[])=>{Ot(t)?t.forEach(n=>n(...e)):t&&t(...e)},LG=t=>t?Ot(t)?t.some(e=>e.length>1):t.length>1:!1;function xse(t){const e={};for(const z in t)z in yse||(e[z]=t[z]);if(t.css===!1)return e;const{name:n="v",type:r,duration:i,enterFromClass:s=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:o=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:u=a,appearToClass:c=o,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=t,p=dTe(i),m=p&&p[0],v=p&&p[1],{onBeforeEnter:g,onEnter:b,onEnterCancelled:y,onLeave:x,onLeaveCancelled:T,onBeforeAppear:M=g,onAppear:E=b,onAppearCancelled:S=y}=e,P=(z,k,N,q)=>{z._enterCancelled=q,Sh(z,k?c:o),Sh(z,k?u:a),N&&N()},R=(z,k)=>{z._isLeaving=!1,Sh(z,d),Sh(z,h),Sh(z,f),k&&k()},V=z=>(k,N)=>{const q=z?E:b,L=()=>P(k,z,N);Em(q,[k,L]),XG(()=>{Sh(k,z?l:s),yc(k,z?c:o),LG(q)||CG(k,r,m,L)})};return Ar(e,{onBeforeEnter(z){Em(g,[z]),yc(z,s),yc(z,a)},onBeforeAppear(z){Em(M,[z]),yc(z,l),yc(z,u)},onEnter:V(!1),onAppear:V(!0),onLeave(z,k){z._isLeaving=!0;const N=()=>R(z,k);yc(z,d),z._enterCancelled?(yc(z,f),VN()):(VN(),yc(z,f)),XG(()=>{z._isLeaving&&(Sh(z,d),yc(z,h),LG(x)||CG(z,r,v,N))}),Em(x,[z,N])},onEnterCancelled(z){P(z,!1,void 0,!0),Em(y,[z])},onAppearCancelled(z){P(z,!0,void 0,!0),Em(S,[z])},onLeaveCancelled(z){R(z),Em(T,[z])}})}function dTe(t){if(t==null)return null;if(Ur(t))return[Xz(t.enter),Xz(t.leave)];{const e=Xz(t);return[e,e]}}function Xz(t){return wM(t)}function yc(t,e){e.split(/\s+/).forEach(n=>n&&t.classList.add(n)),(t[eb]||(t[eb]=new Set)).add(e)}function Sh(t,e){e.split(/\s+/).forEach(r=>r&&t.classList.remove(r));const n=t[eb];n&&(n.delete(e),n.size||(t[eb]=void 0))}function XG(t){requestAnimationFrame(()=>{requestAnimationFrame(t)})}let fTe=0;function CG(t,e,n,r){const i=t._endId=++fTe,s=()=>{i===t._endId&&r()};if(n!=null)return setTimeout(s,n);const{type:a,timeout:o,propCount:l}=Tse(t,e);if(!a)return r();const u=a+"end";let c=0;const d=()=>{t.removeEventListener(u,f),s()},f=h=>{h.target===t&&++c>=l&&d()};setTimeout(()=>{c(n[p]||"").split(", "),i=r(`${th}Delay`),s=r(`${th}Duration`),a=KG(i,s),o=r(`${pS}Delay`),l=r(`${pS}Duration`),u=KG(o,l);let c=null,d=0,f=0;e===th?a>0&&(c=th,d=a,f=s.length):e===pS?u>0&&(c=pS,d=u,f=l.length):(d=Math.max(a,u),c=d>0?a>u?th:pS:null,f=c?c===th?s.length:l.length:0);const h=c===th&&/\b(transform|all)(,|$)/.test(r(`${th}Property`).toString());return{type:c,timeout:d,propCount:f,hasTransform:h}}function KG(t,e){for(;t.lengthqG(n)+qG(t[r])))}function qG(t){return t==="auto"?0:Number(t.slice(0,-1).replace(",","."))*1e3}function VN(){return document.body.offsetHeight}function hTe(t,e,n){const r=t[eb];r&&(e=(e?[e,...r]:[...r]).join(" ")),e==null?t.removeAttribute("class"):n?t.setAttribute("class",e):t.className=e}const UM=Symbol("_vod"),wse=Symbol("_vsh"),uC={beforeMount(t,{value:e},{transition:n}){t[UM]=t.style.display==="none"?"":t.style.display,n&&e?n.beforeEnter(t):mS(t,e)},mounted(t,{value:e},{transition:n}){n&&e&&n.enter(t)},updated(t,{value:e,oldValue:n},{transition:r}){!e!=!n&&(r?e?(r.beforeEnter(t),mS(t,!0),r.enter(t)):r.leave(t,()=>{mS(t,!1)}):mS(t,e))},beforeUnmount(t,{value:e}){mS(t,e)}};function mS(t,e){t.style.display=e?t[UM]:"none",t[wse]=!e}function pTe(){uC.getSSRProps=({value:t})=>{if(!t)return{style:{display:"none"}}}}const Ese=Symbol("");function mTe(t){const e=Go();if(!e)return;const n=e.ut=(i=t(e.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${e.uid}"]`)).forEach(s=>NM(s,i))},r=()=>{const i=t(e.proxy);e.ce?NM(e.ce,i):zN(e.subTree,i),n(i)};eC(()=>{Dx(r)}),_n(()=>{jt(r,cl,{flush:"post"});const i=new MutationObserver(r);i.observe(e.subTree.el.parentNode,{childList:!0}),ls(()=>i.disconnect())})}function zN(t,e){if(t.shapeFlag&128){const n=t.suspense;t=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{zN(n.activeBranch,e)})}for(;t.component;)t=t.component.subTree;if(t.shapeFlag&1&&t.el)NM(t.el,e);else if(t.type===Ct)t.children.forEach(n=>zN(n,e));else if(t.type===wv){let{el:n,anchor:r}=t;for(;n&&(NM(n,e),n!==r);)n=n.nextSibling}}function NM(t,e){if(t.nodeType===1){const n=t.style;let r="";for(const i in e)n.setProperty(`--${i}`,e[i]),r+=`--${i}: ${e[i]};`;n[Ese]=r}}const vTe=/(^|;)\s*display\s*:/;function gTe(t,e,n){const r=t.style,i=$r(n);let s=!1;if(n&&!i){if(e)if($r(e))for(const a of e.split(";")){const o=a.slice(0,a.indexOf(":")).trim();n[o]==null&&m7(r,o,"")}else for(const a in e)n[a]==null&&m7(r,a,"");for(const a in n)a==="display"&&(s=!0),m7(r,a,n[a])}else if(i){if(e!==n){const a=r[Ese];a&&(n+=";"+a),r.cssText=n,s=vTe.test(n)}}else e&&t.removeAttribute("style");UM in t&&(t[UM]=s?r.display:"",t[wse]&&(r.display="none"))}const DG=/\s*!important$/;function m7(t,e,n){if(Ot(n))n.forEach(r=>m7(t,e,r));else if(n==null&&(n=""),e.startsWith("--"))t.setProperty(e,n);else{const r=bTe(t,e);DG.test(n)?t.setProperty(ko(r),n.replace(DG,""),"important"):t[r]=n}}const WG=["Webkit","Moz","ms"],Cz={};function bTe(t,e){const n=Cz[e];if(n)return n;let r=sa(e);if(r!=="filter"&&r in t)return Cz[e]=r;r=tT(r);for(let i=0;iKz||(TTe.then(()=>Kz=0),Kz=Date.now());function ETe(t,e){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Yl(MTe(r,n.value),e,5,[r])};return n.value=t,n.attached=wTe(),n}function MTe(t,e){if(Ot(e)){const n=t.stopImmediatePropagation;return t.stopImmediatePropagation=()=>{n.call(t),t._stopped=!0},e.map(r=>i=>!i._stopped&&r&&r(i))}else return e}const JG=t=>t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&t.charCodeAt(2)>96&&t.charCodeAt(2)<123,PTe=(t,e,n,r,i,s)=>{const a=i==="svg";e==="class"?hTe(t,r,a):e==="style"?gTe(t,n,r):eT(e)?XX(e)||STe(t,e,n,r,s):(e[0]==="."?(e=e.slice(1),!0):e[0]==="^"?(e=e.slice(1),!1):RTe(t,e,r,a))?(FG(t,e,r),!t.tagName.includes("-")&&(e==="value"||e==="checked"||e==="selected")&&GG(t,e,r,a,s,e!=="value")):t._isVueCE&&(/[A-Z]/.test(e)||!$r(r))?FG(t,sa(e),r,s,e):(e==="true-value"?t._trueValue=r:e==="false-value"&&(t._falseValue=r),GG(t,e,r,a))};function RTe(t,e,n,r){if(r)return!!(e==="innerHTML"||e==="textContent"||e in t&&JG(e)&&Yt(n));if(e==="spellcheck"||e==="draggable"||e==="translate"||e==="form"||e==="list"&&t.tagName==="INPUT"||e==="type"&&t.tagName==="TEXTAREA")return!1;if(e==="width"||e==="height"){const i=t.tagName;if(i==="IMG"||i==="VIDEO"||i==="CANVAS"||i==="SOURCE")return!1}return JG(e)&&$r(n)?!1:e in t}const YG={};/*! #__NO_SIDE_EFFECTS__ */function Mse(t,e,n){const r=pt(t,e);DR(r)&&Ar(r,e);class i extends iV{constructor(a){super(r,a,n)}}return i.def=r,i}/*! #__NO_SIDE_EFFECTS__ */const VTe=(t,e)=>Mse(t,e,Kse),zTe=typeof HTMLElement<"u"?HTMLElement:class{};class iV extends zTe{constructor(e,n={},r=XM){super(),this._def=e,this._props=n,this._createApp=r,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._ob=null,this.shadowRoot&&r!==XM?this._root=this.shadowRoot:e.shadowRoot!==!1?(this.attachShadow({mode:"open"}),this._root=this.shadowRoot):this._root=this,this._def.__asyncLoader||this._resolveProps(this._def)}connectedCallback(){if(!this.isConnected)return;this.shadowRoot||this._parseSlots(),this._connected=!0;let e=this;for(;e=e&&(e.parentNode||e.host);)if(e instanceof iV){this._parent=e;break}this._instance||(this._resolved?(this._setParent(),this._update()):e&&e._pendingResolve?this._pendingResolve=e._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(e=this._parent){e&&(this._instance.parent=e._instance,this._instance.provides=e._instance.provides)}disconnectedCallback(){this._connected=!1,Ia(()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null)})}_resolveDef(){if(this._pendingResolve)return;for(let r=0;r{for(const i of r)this._setAttr(i.attributeName)}),this._ob.observe(this,{attributes:!0});const e=(r,i=!1)=>{this._resolved=!0,this._pendingResolve=void 0;const{props:s,styles:a}=r;let o;if(s&&!Ot(s))for(const l in s){const u=s[l];(u===Number||u&&u.type===Number)&&(l in this._props&&(this._props[l]=wM(this._props[l])),(o||(o=Object.create(null)))[sa(l)]=!0)}this._numberProps=o,i&&this._resolveProps(r),this.shadowRoot&&this._applyStyles(a),this._mount(r)},n=this._def.__asyncLoader;n?this._pendingResolve=n().then(r=>e(this._def=r,!0)):e(this._def)}_mount(e){this._app=this._createApp(e),e.configureApp&&e.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);const n=this._instance&&this._instance.exposed;if(n)for(const r in n)lr(this,r)||Object.defineProperty(this,r,{get:()=>Ls(n[r])})}_resolveProps(e){const{props:n}=e,r=Ot(n)?n:Object.keys(n||{});for(const i of Object.keys(this))i[0]!=="_"&&r.includes(i)&&this._setProp(i,this[i]);for(const i of r.map(sa))Object.defineProperty(this,i,{get(){return this._getProp(i)},set(s){this._setProp(i,s,!0,!0)}})}_setAttr(e){if(e.startsWith("data-v-"))return;const n=this.hasAttribute(e);let r=n?this.getAttribute(e):YG;const i=sa(e);n&&this._numberProps&&this._numberProps[i]&&(r=wM(r)),this._setProp(i,r,!1,!0)}_getProp(e){return this._props[e]}_setProp(e,n,r=!0,i=!1){if(n!==this._props[e]&&(n===YG?delete this._props[e]:(this._props[e]=n,e==="key"&&this._app&&(this._app._ceVNode.key=n)),i&&this._instance&&this._update(),r)){const s=this._ob;s&&s.disconnect(),n===!0?this.setAttribute(ko(e),""):typeof n=="string"||typeof n=="number"?this.setAttribute(ko(e),n+""):n||this.removeAttribute(ko(e)),s&&s.observe(this,{attributes:!0})}}_update(){Cse(this._createVNode(),this._root)}_createVNode(){const e={};this.shadowRoot||(e.onVnodeMounted=e.onVnodeUpdated=this._renderSlots.bind(this));const n=xe(this._def,Ar(e,this._props));return this._instance||(n.ce=r=>{this._instance=r,r.ce=this,r.isCE=!0;const i=(s,a)=>{this.dispatchEvent(new CustomEvent(s,DR(a[0])?Ar({detail:a},a[0]):{detail:a}))};r.emit=(s,...a)=>{i(s,a),ko(s)!==s&&i(ko(s),a)},this._setParent()}),n}_applyStyles(e,n){if(!e)return;if(n){if(n===this._def||this._styleChildren.has(n))return;this._styleChildren.add(n)}const r=this._nonce;for(let i=e.length-1;i>=0;i--){const s=document.createElement("style");r&&s.setAttribute("nonce",r),s.textContent=e[i],this.shadowRoot.prepend(s)}}_parseSlots(){const e=this._slots={};let n;for(;n=this.firstChild;){const r=n.nodeType===1&&n.getAttribute("slot")||"default";(e[r]||(e[r]=[])).push(n),this.removeChild(n)}}_renderSlots(){const e=(this._teleportTarget||this).querySelectorAll("slot"),n=this._instance.type.__scopeId;for(let r=0;r(delete t.props.mode,t),UTe=ITe({name:"TransitionGroup",props:Ar({},Sse,{tag:String,moveClass:String}),setup(t,{slots:e}){const n=Go(),r=QX();let i,s;return _R(()=>{if(!i.length)return;const a=t.moveClass||`${t.name||"v"}-move`;if(!KTe(i[0].el,n.vnode.el,a))return;i.forEach(LTe),i.forEach(XTe);const o=i.filter(CTe);VN(),o.forEach(l=>{const u=l.el,c=u.style;yc(u,a),c.transform=c.webkitTransform=c.transitionDuration="";const d=u[LM]=f=>{f&&f.target!==u||(!f||/transform$/.test(f.propertyName))&&(u.removeEventListener("transitionend",d),u[LM]=null,Sh(u,a))};u.addEventListener("transitionend",d)})}),()=>{const a=gn(t),o=xse(a);let l=a.tag||Ct;if(i=[],s)for(let u=0;u{o.split(/\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\s+/).forEach(o=>o&&r.classList.add(o)),r.style.display="none";const s=e.nodeType===1?e:e.parentNode;s.appendChild(r);const{hasTransform:a}=Tse(r);return s.removeChild(r),a}const Vp=t=>{const e=t.props["onUpdate:modelValue"]||!1;return Ot(e)?n=>V1(e,n):e};function qTe(t){t.target.composing=!0}function HG(t){const e=t.target;e.composing&&(e.composing=!1,e.dispatchEvent(new Event("input")))}const jl=Symbol("_assign"),On={created(t,{modifiers:{lazy:e,trim:n,number:r}},i){t[jl]=Vp(i);const s=r||i.props&&i.props.type==="number";Yd(t,e?"change":"input",a=>{if(a.target.composing)return;let o=t.value;n&&(o=o.trim()),s&&(o=TM(o)),t[jl](o)}),n&&Yd(t,"change",()=>{t.value=t.value.trim()}),e||(Yd(t,"compositionstart",qTe),Yd(t,"compositionend",HG),Yd(t,"change",HG))},mounted(t,{value:e}){t.value=e??""},beforeUpdate(t,{value:e,oldValue:n,modifiers:{lazy:r,trim:i,number:s}},a){if(t[jl]=Vp(a),t.composing)return;const o=(s||t.type==="number")&&!/^0\d/.test(t.value)?TM(t.value):t.value,l=e??"";o!==l&&(document.activeElement===t&&t.type!=="range"&&(r&&e===n||i&&t.value.trim()===l)||(t.value=l))}},mf={deep:!0,created(t,e,n){t[jl]=Vp(n),Yd(t,"change",()=>{const r=t._modelValue,i=tb(t),s=t.checked,a=t[jl];if(Ot(r)){const o=GR(r,i),l=o!==-1;if(s&&!l)a(r.concat(i));else if(!s&&l){const u=[...r];u.splice(o,1),a(u)}}else if(l0(r)){const o=new Set(r);s?o.add(i):o.delete(i),a(o)}else a(kse(t,s))})},mounted:QG,beforeUpdate(t,e,n){t[jl]=Vp(n),QG(t,e,n)}};function QG(t,{value:e,oldValue:n},r){t._modelValue=e;let i;if(Ot(e))i=GR(e,r.props.value)>-1;else if(l0(e))i=e.has(r.props.value);else{if(e===n)return;i=Mp(e,kse(t,!0))}t.checked!==i&&(t.checked=i)}const cC={created(t,{value:e},n){t.checked=Mp(e,n.props.value),t[jl]=Vp(n),Yd(t,"change",()=>{t[jl](tb(t))})},beforeUpdate(t,{value:e,oldValue:n},r){t[jl]=Vp(r),e!==n&&(t.checked=Mp(e,r.props.value))}},zse={deep:!0,created(t,{value:e,modifiers:{number:n}},r){const i=l0(e);Yd(t,"change",()=>{const s=Array.prototype.filter.call(t.options,a=>a.selected).map(a=>n?TM(tb(a)):tb(a));t[jl](t.multiple?i?new Set(s):s:s[0]),t._assigning=!0,Ia(()=>{t._assigning=!1})}),t[jl]=Vp(r)},mounted(t,{value:e}){_G(t,e)},beforeUpdate(t,e,n){t[jl]=Vp(n)},updated(t,{value:e}){t._assigning||_G(t,e)}};function _G(t,e){const n=t.multiple,r=Ot(e);if(!(n&&!r&&!l0(e))){for(let i=0,s=t.options.length;iString(u)===String(o)):a.selected=GR(e,o)>-1}else a.selected=e.has(o);else if(Mp(tb(a),e)){t.selectedIndex!==i&&(t.selectedIndex=i);return}}!n&&t.selectedIndex!==-1&&(t.selectedIndex=-1)}}function tb(t){return"_value"in t?t._value:t.value}function kse(t,e){const n=e?"_trueValue":"_falseValue";return n in t?t[n]:e}const Ose={created(t,e,n){Qw(t,e,n,null,"created")},mounted(t,e,n){Qw(t,e,n,null,"mounted")},beforeUpdate(t,e,n,r){Qw(t,e,n,r,"beforeUpdate")},updated(t,e,n,r){Qw(t,e,n,r,"updated")}};function Ise(t,e){switch(t){case"SELECT":return zse;case"TEXTAREA":return On;default:switch(e){case"checkbox":return mf;case"radio":return cC;default:return On}}}function Qw(t,e,n,r,i){const a=Ise(t.tagName,n.props&&n.props.type)[i];a&&a(t,e,n,r)}function DTe(){On.getSSRProps=({value:t})=>({value:t}),cC.getSSRProps=({value:t},e)=>{if(e.props&&Mp(e.props.value,t))return{checked:!0}},mf.getSSRProps=({value:t},e)=>{if(Ot(t)){if(e.props&&GR(t,e.props.value)>-1)return{checked:!0}}else if(l0(t)){if(e.props&&t.has(e.props.value))return{checked:!0}}else if(t)return{checked:!0}},Ose.getSSRProps=(t,e)=>{if(typeof e.type!="string")return;const n=Ise(e.type.toUpperCase(),e.props&&e.props.type);if(n.getSSRProps)return n.getSSRProps(t,e)}}const WTe=["ctrl","shift","alt","meta"],ATe={stop:t=>t.stopPropagation(),prevent:t=>t.preventDefault(),self:t=>t.target!==t.currentTarget,ctrl:t=>!t.ctrlKey,shift:t=>!t.shiftKey,alt:t=>!t.altKey,meta:t=>!t.metaKey,left:t=>"button"in t&&t.button!==0,middle:t=>"button"in t&&t.button!==1,right:t=>"button"in t&&t.button!==2,exact:(t,e)=>WTe.some(n=>t[`${n}Key`]&&!e.includes(n))},f0=(t,e)=>{const n=t._withMods||(t._withMods={}),r=e.join(".");return n[r]||(n[r]=(i,...s)=>{for(let a=0;a{const n=t._withKeys||(t._withKeys={}),r=e.join(".");return n[r]||(n[r]=i=>{if(!("key"in i))return;const s=ko(i.key);if(e.some(a=>a===s||GTe[a]===s))return t(i)})},Nse=Ar({patchProp:PTe},uTe);let Z3,$G=!1;function Lse(){return Z3||(Z3=Bie(Nse))}function Xse(){return Z3=$G?Z3:Hie(Nse),$G=!0,Z3}const Cse=(...t)=>{Lse().render(...t)},FTe=(...t)=>{Xse().hydrate(...t)},XM=(...t)=>{const e=Lse().createApp(...t),{mount:n}=e;return e.mount=r=>{const i=Dse(r);if(!i)return;const s=e._component;!Yt(s)&&!s.render&&!s.template&&(s.template=i.innerHTML),i.nodeType===1&&(i.textContent="");const a=n(i,!1,qse(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),a},e},Kse=(...t)=>{const e=Xse().createApp(...t),{mount:n}=e;return e.mount=r=>{const i=Dse(r);if(i)return n(i,!0,qse(i))},e};function qse(t){if(t instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&t instanceof MathMLElement)return"mathml"}function Dse(t){return $r(t)?document.querySelector(t):t}let eF=!1;const jTe=()=>{eF||(eF=!0,DTe(),pTe())};/** * vue v3.5.13 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/const jTe=()=>{},ZTe=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:Eie,BaseTransitionPropsValidators:QX,Comment:rs,DeprecationTypes:sTe,EffectScope:DX,ErrorCodes:Txe,ErrorTypeStrings:_6e,Fragment:Ct,KeepAlive:Zxe,ReactiveEffect:Kx,Static:wv,Suspense:tV,Teleport:Sie,Text:op,TrackOpTypes:mxe,Transition:Rp,TransitionGroup:UTe,TriggerOpTypes:vxe,VueElement:iV,assertNumber:xxe,callWithAsyncErrorHandling:Yl,callWithErrorHandling:$b,camelize:sa,capitalize:nT,cloneVNode:Cu,compatUtils:iTe,compile:jTe,computed:et,createApp:CM,createBlock:Gt,createCommentVNode:Ln,createElementBlock:ke,createElementVNode:O,createHydrationRenderer:Qie,createPropsRestProxy:c6e,createRenderer:Hie,createSSRApp:qse,createSlots:Bxe,createStaticVNode:rV,createTextVNode:yr,createVNode:xe,customRef:oie,defineAsyncComponent:Fxe,defineComponent:pt,defineCustomElement:Pse,defineEmits:e6e,defineExpose:t6e,defineModel:i6e,defineOptions:n6e,defineProps:$xe,defineSSRCustomElement:RTe,defineSlots:r6e,devtools:$6e,effect:q3e,effectScope:WX,getCurrentInstance:Fo,getCurrentScope:AX,getCurrentWatcher:gxe,getTransitionRawChildren:HR,guardReactiveProps:nV,h:An,handleError:d0,hasInjectionContext:Die,hydrate:GTe,hydrateOnIdle:Kxe,hydrateOnInteraction:Axe,hydrateOnMediaQuery:Wxe,hydrateOnVisible:Dxe,initCustomFormatter:B6e,initDirectivesForSSR:FTe,inject:cr,isMemoSame:bse,isProxy:u0,isReactive:Iu,isReadonly:Pp,isRef:gi,isRuntimeOnly:Z6e,isShallow:fl,isVNode:pf,markRaw:YR,mergeDefaults:l6e,mergeModels:u6e,mergeProps:fse,nextTick:Ia,normalizeClass:En,normalizeProps:qX,normalizeStyle:Ms,onActivated:Rie,onBeforeMount:kie,onBeforeUnmount:ey,onBeforeUpdate:$X,onDeactivated:Vie,onErrorCaptured:Nie,onMounted:_n,onRenderTracked:Uie,onRenderTriggered:Iie,onScopeDispose:Fre,onServerPrefetch:Oie,onUnmounted:ls,onUpdated:_R,onWatcherCleanup:die,openBlock:pe,popScopeId:Rxe,provide:Zi,proxyRefs:YX,pushScopeId:Pxe,queuePostFlushCb:Wx,reactive:Go,readonly:JX,ref:ze,registerRuntimeCompiler:j6e,render:Kse,renderList:Pi,renderSlot:Hxe,resolveComponent:Xe,resolveDirective:Xie,resolveDynamicComponent:hf,resolveFilter:rTe,resolveTransitionHooks:_1,setBlockTracking:xN,setDevtoolsHook:eTe,setTransitionHooks:ff,shallowReactive:ZX,shallowReadonly:sxe,shallowRef:c0,ssrContextKey:tse,ssrUtils:nTe,stop:D3e,toDisplayString:Mt,toHandlerKey:W3,toHandlers:Qxe,toRaw:gn,toRef:uie,toRefs:lie,toValue:lxe,transformVNodeArgs:D6e,triggerRef:oxe,unref:Ls,useAttrs:o6e,useCssModule:kTe,useCssVars:pTe,useHost:Rse,useId:Pie,useModel:V6e,useSSRContext:nse,useShadowRoot:zTe,useSlots:a6e,useTemplateRef:Oxe,useTransitionState:HX,vModelCheckbox:mf,vModelDynamic:Ise,vModelRadio:uC,vModelSelect:kse,vModelText:On,vShow:lC,version:oC,warn:Q6e,watch:jt,watchEffect:Ps,watchPostEffect:P6e,watchSyncEffect:rse,withAsyncContext:d6e,withCtx:ft,withDefaults:s6e,withDirectives:hn,withKeys:Nse,withMemo:H6e,withModifiers:f0,withScopeId:Vxe},Symbol.toStringTag,{value:"Module"}));var JTe=!1;/*! +**/const ZTe=()=>{},JTe=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:wie,BaseTransitionPropsValidators:_X,Comment:rs,DeprecationTypes:aTe,EffectScope:WX,ErrorCodes:wxe,ErrorTypeStrings:$6e,Fragment:Ct,KeepAlive:Jxe,ReactiveEffect:Cx,Static:wv,Suspense:tV,Teleport:yie,Text:op,TrackOpTypes:vxe,Transition:Rp,TransitionGroup:NTe,TriggerOpTypes:gxe,VueElement:iV,assertNumber:Txe,callWithAsyncErrorHandling:Yl,callWithErrorHandling:$b,camelize:sa,capitalize:tT,cloneVNode:Cu,compatUtils:sTe,compile:ZTe,computed:et,createApp:XM,createBlock:Gt,createCommentVNode:In,createElementBlock:ke,createElementVNode:O,createHydrationRenderer:Hie,createPropsRestProxy:d6e,createRenderer:Bie,createSSRApp:Kse,createSlots:Hxe,createStaticVNode:rV,createTextVNode:yr,createVNode:xe,customRef:aie,defineAsyncComponent:jxe,defineComponent:pt,defineCustomElement:Mse,defineEmits:t6e,defineExpose:n6e,defineModel:s6e,defineOptions:r6e,defineProps:e6e,defineSSRCustomElement:VTe,defineSlots:i6e,devtools:eTe,effect:D3e,effectScope:AX,getCurrentInstance:Go,getCurrentScope:GX,getCurrentWatcher:bxe,getTransitionRawChildren:HR,guardReactiveProps:nV,h:An,handleError:d0,hasInjectionContext:qie,hydrate:FTe,hydrateOnIdle:qxe,hydrateOnInteraction:Gxe,hydrateOnMediaQuery:Axe,hydrateOnVisible:Wxe,initCustomFormatter:H6e,initDirectivesForSSR:jTe,inject:cr,isMemoSame:gse,isProxy:u0,isReactive:Iu,isReadonly:Pp,isRef:gi,isRuntimeOnly:J6e,isShallow:dl,isVNode:pf,markRaw:YR,mergeDefaults:u6e,mergeModels:c6e,mergeProps:dse,nextTick:Ia,normalizeClass:En,normalizeProps:DX,normalizeStyle:Ms,onActivated:Pie,onBeforeMount:zie,onBeforeUnmount:ey,onBeforeUpdate:eC,onDeactivated:Rie,onErrorCaptured:Uie,onMounted:_n,onRenderTracked:Iie,onRenderTriggered:Oie,onScopeDispose:Gre,onServerPrefetch:kie,onUnmounted:ls,onUpdated:_R,onWatcherCleanup:cie,openBlock:pe,popScopeId:Vxe,provide:Zi,proxyRefs:BX,pushScopeId:Rxe,queuePostFlushCb:Dx,reactive:Ao,readonly:YX,ref:ze,registerRuntimeCompiler:Z6e,render:Cse,renderList:Pi,renderSlot:Qxe,resolveComponent:Xe,resolveDirective:Lie,resolveDynamicComponent:hf,resolveFilter:iTe,resolveTransitionHooks:_1,setBlockTracking:xN,setDevtoolsHook:tTe,setTransitionHooks:ff,shallowReactive:JX,shallowReadonly:axe,shallowRef:c0,ssrContextKey:ese,ssrUtils:rTe,stop:W3e,toDisplayString:Mt,toHandlerKey:D3,toHandlers:_xe,toRaw:gn,toRef:lie,toRefs:oie,toValue:uxe,transformVNodeArgs:W6e,triggerRef:lxe,unref:Ls,useAttrs:l6e,useCssModule:OTe,useCssVars:mTe,useHost:Pse,useId:Mie,useModel:z6e,useSSRContext:tse,useShadowRoot:kTe,useSlots:o6e,useTemplateRef:Ixe,useTransitionState:QX,vModelCheckbox:mf,vModelDynamic:Ose,vModelRadio:cC,vModelSelect:zse,vModelText:On,vShow:uC,version:lC,warn:_6e,watch:jt,watchEffect:Ps,watchPostEffect:R6e,watchSyncEffect:nse,withAsyncContext:f6e,withCtx:ft,withDefaults:a6e,withDirectives:hn,withKeys:Use,withMemo:Q6e,withModifiers:f0,withScopeId:zxe},Symbol.toStringTag,{value:"Module"}));var YTe=!1;/*! * pinia v2.3.0 * (c) 2024 Eduardo San Martin Morote * @license MIT - */let Ase;const sV=t=>Ase=t,Gse=Symbol();function kN(t){return t&&typeof t=="object"&&Object.prototype.toString.call(t)==="[object Object]"&&typeof t.toJSON!="function"}var Y3;(function(t){t.direct="direct",t.patchObject="patch object",t.patchFunction="patch function"})(Y3||(Y3={}));function YTe(){const t=WX(!0),e=t.run(()=>ze({}));let n=[],r=[];const i=YR({install(s){sV(i),i._a=s,s.provide(Gse,i),s.config.globalProperties.$pinia=i,r.forEach(a=>n.push(a)),r=[]},use(s){return!this._a&&!JTe?r.push(s):n.push(s),this},_p:n,_a:null,_e:t,_s:new Map,state:e});return i}const Fse=()=>{};function rF(t,e,n,r=Fse){t.push(e);const i=()=>{const s=t.indexOf(e);s>-1&&(t.splice(s,1),r())};return!n&&AX()&&Fre(i),i}function H0(t,...e){t.slice().forEach(n=>{n(...e)})}const BTe=t=>t(),iF=Symbol(),qz=Symbol();function ON(t,e){t instanceof Map&&e instanceof Map?e.forEach((n,r)=>t.set(r,n)):t instanceof Set&&e instanceof Set&&e.forEach(t.add,t);for(const n in e){if(!e.hasOwnProperty(n))continue;const r=e[n],i=t[n];kN(i)&&kN(r)&&t.hasOwnProperty(n)&&!gi(r)&&!Iu(r)?t[n]=ON(i,r):t[n]=r}return t}const HTe=Symbol();function QTe(t){return!kN(t)||!t.hasOwnProperty(HTe)}const{assign:xh}=Object;function _Te(t){return!!(gi(t)&&t.effect)}function $Te(t,e,n,r){const{state:i,actions:s,getters:a}=e,o=n.state.value[t];let l;function u(){o||(n.state.value[t]=i?i():{});const c=lie(n.state.value[t]);return xh(c,s,Object.keys(a||{}).reduce((d,f)=>(d[f]=YR(et(()=>{sV(n);const h=n._s.get(t);return a[f].call(h,h)})),d),{}))}return l=jse(t,u,e,n,r,!0),l}function jse(t,e,n={},r,i,s){let a;const o=xh({actions:{}},n),l={deep:!0};let u,c,d=[],f=[],h;const p=r.state.value[t];!s&&!p&&(r.state.value[t]={}),ze({});let m;function v(S){let P;u=c=!1,typeof S=="function"?(S(r.state.value[t]),P={type:Y3.patchFunction,storeId:t,events:h}):(ON(r.state.value[t],S),P={type:Y3.patchObject,payload:S,storeId:t,events:h});const R=m=Symbol();Ia().then(()=>{m===R&&(u=!0)}),c=!0,H0(d,P,r.state.value[t])}const g=s?function(){const{state:P}=n,R=P?P():{};this.$patch(V=>{xh(V,R)})}:Fse;function b(){a.stop(),d=[],f=[],r._s.delete(t)}const y=(S,P="")=>{if(iF in S)return S[qz]=P,S;const R=function(){sV(r);const V=Array.from(arguments),z=[],k=[];function N(A){z.push(A)}function q(A){k.push(A)}H0(f,{args:V,name:R[qz],store:T,after:N,onError:q});let L;try{L=S.apply(this&&this.$id===t?this:T,V)}catch(A){throw H0(k,A),A}return L instanceof Promise?L.then(A=>(H0(z,A),A)).catch(A=>(H0(k,A),Promise.reject(A))):(H0(z,L),L)};return R[iF]=!0,R[qz]=P,R},x={_p:r,$id:t,$onAction:rF.bind(null,f),$patch:v,$reset:g,$subscribe(S,P={}){const R=rF(d,S,P.detached,()=>V()),V=a.run(()=>jt(()=>r.state.value[t],z=>{(P.flush==="sync"?c:u)&&S({storeId:t,type:Y3.direct,events:h},z)},xh({},l,P)));return R},$dispose:b},T=Go(x);r._s.set(t,T);const E=(r._a&&r._a.runWithContext||BTe)(()=>r._e.run(()=>(a=WX()).run(()=>e({action:y}))));for(const S in E){const P=E[S];if(gi(P)&&!_Te(P)||Iu(P))s||(p&&QTe(P)&&(gi(P)?P.value=p[S]:ON(P,p[S])),r.state.value[t][S]=P);else if(typeof P=="function"){const R=y(P,S);E[S]=R,o.actions[S]=P}}return xh(T,E),xh(gn(T),E),Object.defineProperty(T,"$state",{get:()=>r.state.value[t],set:S=>{v(P=>{xh(P,S)})}}),r._p.forEach(S=>{xh(T,a.run(()=>S({store:T,app:r._a,pinia:r,options:o})))}),p&&s&&n.hydrate&&n.hydrate(T.$state,p),u=!0,c=!0,T}/*! #__NO_SIDE_EFFECTS__ */function h0(t,e,n){let r,i;const s=typeof e=="function";typeof t=="string"?(r=t,i=s?n:e):(i=t,r=t.id);function a(o,l){const u=Die();return o=o||(u?cr(Gse,null):null),o&&sV(o),o=Ase,o._s.has(r)||(s?jse(r,e,i,o):$Te(r,i,o)),o._s.get(r)}return a.$id=r,a}function ai(t){{const e=gn(t),n={};for(const r in e){const i=e[r];i.effect?n[r]=et({get:()=>t[r],set(s){t[r]=s}}):(gi(i)||Iu(i))&&(n[r]=uie(t,r))}return n}}const ewe=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,twe=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,nwe=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function rwe(t,e){if(t==="__proto__"||t==="constructor"&&e&&typeof e=="object"&&"prototype"in e){iwe(t);return}return e}function iwe(t){console.warn(`[destr] Dropping "${t}" key to prevent prototype pollution.`)}function swe(t,e={}){if(typeof t!="string")return t;const n=t.trim();if(t[0]==='"'&&t.endsWith('"')&&!t.includes("\\"))return n.slice(1,-1);if(n.length<=9){const r=n.toLowerCase();if(r==="true")return!0;if(r==="false")return!1;if(r==="undefined")return;if(r==="null")return null;if(r==="nan")return Number.NaN;if(r==="infinity")return Number.POSITIVE_INFINITY;if(r==="-infinity")return Number.NEGATIVE_INFINITY}if(!nwe.test(t)){if(e.strict)throw new SyntaxError("[destr] Invalid JSON");return t}try{if(ewe.test(t)||twe.test(t)){if(e.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(t,rwe)}return JSON.parse(t)}catch(r){if(e.strict)throw r;return t}}function awe(t,e){if(t==null)return;let n=t;for(let r=0;r1&&(e=cC(typeof t!="object"||t===null||!Object.prototype.hasOwnProperty.call(t,r)?Number.isInteger(Number(n[1]))?[]:{}:t[r],e,Array.prototype.slice.call(n,1))),Number.isInteger(Number(r))&&Array.isArray(t)?t.slice()[r]:Object.assign({},t,{[r]:e})}function Zse(t,e){if(t==null||e.length===0)return t;if(e.length===1){if(t==null)return t;if(Number.isInteger(e[0])&&Array.isArray(t))return Array.prototype.slice.call(t,0).splice(e[0],1);const n={};for(const r in t)n[r]=t[r];return delete n[e[0]],n}if(t[e[0]]==null){if(Number.isInteger(e[0])&&Array.isArray(t))return Array.prototype.concat.call([],t);const n={};for(const r in t)n[r]=t[r];return n}return cC(t,Zse(t[e[0]],Array.prototype.slice.call(e,1)),[e[0]])}function Jse(t,e){return e.map(n=>n.split(".")).map(n=>[n,awe(t,n)]).filter(n=>n[1]!==void 0).reduce((n,r)=>cC(n,r[1],r[0]),{})}function Yse(t,e){return e.map(n=>n.split(".")).reduce((n,r)=>Zse(n,r),t)}function sF(t,{storage:e,serializer:n,key:r,debug:i,pick:s,omit:a,beforeHydrate:o,afterHydrate:l},u,c=!0){try{c&&(o==null||o(u));const d=e.getItem(r);if(d){const f=n.deserialize(d),h=s?Jse(f,s):f,p=a?Yse(h,a):h;t.$patch(p)}c&&(l==null||l(u))}catch(d){i&&console.error("[pinia-plugin-persistedstate]",d)}}function aF(t,{storage:e,serializer:n,key:r,debug:i,pick:s,omit:a}){try{const o=s?Jse(t,s):t,l=a?Yse(o,a):o,u=n.serialize(l);e.setItem(r,u)}catch(o){i&&console.error("[pinia-plugin-persistedstate]",o)}}function owe(t,e,n){const{pinia:r,store:i,options:{persist:s=n}}=t;if(!s)return;if(!(i.$id in r.state.value)){const l=r._s.get(i.$id.replace("__hot:",""));l&&Promise.resolve().then(()=>l.$persist());return}const o=(Array.isArray(s)?s:s===!0?[{}]:[s]).map(e);i.$hydrate=({runHooks:l=!0}={})=>{o.forEach(u=>{sF(i,u,t,l)})},i.$persist=()=>{o.forEach(l=>{aF(i.$state,l)})},o.forEach(l=>{sF(i,l,t),i.$subscribe((u,c)=>aF(c,l),{detached:!0})})}function lwe(t={}){return function(e){owe(e,n=>({key:(t.key?t.key:r=>r)(n.key??e.store.$id),debug:n.debug??t.debug??!1,serializer:n.serializer??t.serializer??{serialize:r=>JSON.stringify(r),deserialize:r=>swe(r)},storage:n.storage??t.storage??window.localStorage,beforeHydrate:n.beforeHydrate,afterHydrate:n.afterHydrate,pick:n.pick,omit:n.omit}),t.auto??!1)}}var uwe=lwe();/*! + */let Wse;const sV=t=>Wse=t,Ase=Symbol();function kN(t){return t&&typeof t=="object"&&Object.prototype.toString.call(t)==="[object Object]"&&typeof t.toJSON!="function"}var J3;(function(t){t.direct="direct",t.patchObject="patch object",t.patchFunction="patch function"})(J3||(J3={}));function BTe(){const t=AX(!0),e=t.run(()=>ze({}));let n=[],r=[];const i=YR({install(s){sV(i),i._a=s,s.provide(Ase,i),s.config.globalProperties.$pinia=i,r.forEach(a=>n.push(a)),r=[]},use(s){return!this._a&&!YTe?r.push(s):n.push(s),this},_p:n,_a:null,_e:t,_s:new Map,state:e});return i}const Gse=()=>{};function tF(t,e,n,r=Gse){t.push(e);const i=()=>{const s=t.indexOf(e);s>-1&&(t.splice(s,1),r())};return!n&&GX()&&Gre(i),i}function H0(t,...e){t.slice().forEach(n=>{n(...e)})}const HTe=t=>t(),nF=Symbol(),qz=Symbol();function ON(t,e){t instanceof Map&&e instanceof Map?e.forEach((n,r)=>t.set(r,n)):t instanceof Set&&e instanceof Set&&e.forEach(t.add,t);for(const n in e){if(!e.hasOwnProperty(n))continue;const r=e[n],i=t[n];kN(i)&&kN(r)&&t.hasOwnProperty(n)&&!gi(r)&&!Iu(r)?t[n]=ON(i,r):t[n]=r}return t}const QTe=Symbol();function _Te(t){return!kN(t)||!t.hasOwnProperty(QTe)}const{assign:xh}=Object;function $Te(t){return!!(gi(t)&&t.effect)}function ewe(t,e,n,r){const{state:i,actions:s,getters:a}=e,o=n.state.value[t];let l;function u(){o||(n.state.value[t]=i?i():{});const c=oie(n.state.value[t]);return xh(c,s,Object.keys(a||{}).reduce((d,f)=>(d[f]=YR(et(()=>{sV(n);const h=n._s.get(t);return a[f].call(h,h)})),d),{}))}return l=Fse(t,u,e,n,r,!0),l}function Fse(t,e,n={},r,i,s){let a;const o=xh({actions:{}},n),l={deep:!0};let u,c,d=[],f=[],h;const p=r.state.value[t];!s&&!p&&(r.state.value[t]={}),ze({});let m;function v(S){let P;u=c=!1,typeof S=="function"?(S(r.state.value[t]),P={type:J3.patchFunction,storeId:t,events:h}):(ON(r.state.value[t],S),P={type:J3.patchObject,payload:S,storeId:t,events:h});const R=m=Symbol();Ia().then(()=>{m===R&&(u=!0)}),c=!0,H0(d,P,r.state.value[t])}const g=s?function(){const{state:P}=n,R=P?P():{};this.$patch(V=>{xh(V,R)})}:Gse;function b(){a.stop(),d=[],f=[],r._s.delete(t)}const y=(S,P="")=>{if(nF in S)return S[qz]=P,S;const R=function(){sV(r);const V=Array.from(arguments),z=[],k=[];function N(A){z.push(A)}function q(A){k.push(A)}H0(f,{args:V,name:R[qz],store:T,after:N,onError:q});let L;try{L=S.apply(this&&this.$id===t?this:T,V)}catch(A){throw H0(k,A),A}return L instanceof Promise?L.then(A=>(H0(z,A),A)).catch(A=>(H0(k,A),Promise.reject(A))):(H0(z,L),L)};return R[nF]=!0,R[qz]=P,R},x={_p:r,$id:t,$onAction:tF.bind(null,f),$patch:v,$reset:g,$subscribe(S,P={}){const R=tF(d,S,P.detached,()=>V()),V=a.run(()=>jt(()=>r.state.value[t],z=>{(P.flush==="sync"?c:u)&&S({storeId:t,type:J3.direct,events:h},z)},xh({},l,P)));return R},$dispose:b},T=Ao(x);r._s.set(t,T);const E=(r._a&&r._a.runWithContext||HTe)(()=>r._e.run(()=>(a=AX()).run(()=>e({action:y}))));for(const S in E){const P=E[S];if(gi(P)&&!$Te(P)||Iu(P))s||(p&&_Te(P)&&(gi(P)?P.value=p[S]:ON(P,p[S])),r.state.value[t][S]=P);else if(typeof P=="function"){const R=y(P,S);E[S]=R,o.actions[S]=P}}return xh(T,E),xh(gn(T),E),Object.defineProperty(T,"$state",{get:()=>r.state.value[t],set:S=>{v(P=>{xh(P,S)})}}),r._p.forEach(S=>{xh(T,a.run(()=>S({store:T,app:r._a,pinia:r,options:o})))}),p&&s&&n.hydrate&&n.hydrate(T.$state,p),u=!0,c=!0,T}/*! #__NO_SIDE_EFFECTS__ */function h0(t,e,n){let r,i;const s=typeof e=="function";typeof t=="string"?(r=t,i=s?n:e):(i=t,r=t.id);function a(o,l){const u=qie();return o=o||(u?cr(Ase,null):null),o&&sV(o),o=Wse,o._s.has(r)||(s?Fse(r,e,i,o):ewe(r,i,o)),o._s.get(r)}return a.$id=r,a}function ai(t){{const e=gn(t),n={};for(const r in e){const i=e[r];i.effect?n[r]=et({get:()=>t[r],set(s){t[r]=s}}):(gi(i)||Iu(i))&&(n[r]=lie(t,r))}return n}}const twe=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,nwe=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,rwe=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function iwe(t,e){if(t==="__proto__"||t==="constructor"&&e&&typeof e=="object"&&"prototype"in e){swe(t);return}return e}function swe(t){console.warn(`[destr] Dropping "${t}" key to prevent prototype pollution.`)}function awe(t,e={}){if(typeof t!="string")return t;const n=t.trim();if(t[0]==='"'&&t.endsWith('"')&&!t.includes("\\"))return n.slice(1,-1);if(n.length<=9){const r=n.toLowerCase();if(r==="true")return!0;if(r==="false")return!1;if(r==="undefined")return;if(r==="null")return null;if(r==="nan")return Number.NaN;if(r==="infinity")return Number.POSITIVE_INFINITY;if(r==="-infinity")return Number.NEGATIVE_INFINITY}if(!rwe.test(t)){if(e.strict)throw new SyntaxError("[destr] Invalid JSON");return t}try{if(twe.test(t)||nwe.test(t)){if(e.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(t,iwe)}return JSON.parse(t)}catch(r){if(e.strict)throw r;return t}}function owe(t,e){if(t==null)return;let n=t;for(let r=0;r1&&(e=dC(typeof t!="object"||t===null||!Object.prototype.hasOwnProperty.call(t,r)?Number.isInteger(Number(n[1]))?[]:{}:t[r],e,Array.prototype.slice.call(n,1))),Number.isInteger(Number(r))&&Array.isArray(t)?t.slice()[r]:Object.assign({},t,{[r]:e})}function jse(t,e){if(t==null||e.length===0)return t;if(e.length===1){if(t==null)return t;if(Number.isInteger(e[0])&&Array.isArray(t))return Array.prototype.slice.call(t,0).splice(e[0],1);const n={};for(const r in t)n[r]=t[r];return delete n[e[0]],n}if(t[e[0]]==null){if(Number.isInteger(e[0])&&Array.isArray(t))return Array.prototype.concat.call([],t);const n={};for(const r in t)n[r]=t[r];return n}return dC(t,jse(t[e[0]],Array.prototype.slice.call(e,1)),[e[0]])}function Zse(t,e){return e.map(n=>n.split(".")).map(n=>[n,owe(t,n)]).filter(n=>n[1]!==void 0).reduce((n,r)=>dC(n,r[1],r[0]),{})}function Jse(t,e){return e.map(n=>n.split(".")).reduce((n,r)=>jse(n,r),t)}function rF(t,{storage:e,serializer:n,key:r,debug:i,pick:s,omit:a,beforeHydrate:o,afterHydrate:l},u,c=!0){try{c&&(o==null||o(u));const d=e.getItem(r);if(d){const f=n.deserialize(d),h=s?Zse(f,s):f,p=a?Jse(h,a):h;t.$patch(p)}c&&(l==null||l(u))}catch(d){i&&console.error("[pinia-plugin-persistedstate]",d)}}function iF(t,{storage:e,serializer:n,key:r,debug:i,pick:s,omit:a}){try{const o=s?Zse(t,s):t,l=a?Jse(o,a):o,u=n.serialize(l);e.setItem(r,u)}catch(o){i&&console.error("[pinia-plugin-persistedstate]",o)}}function lwe(t,e,n){const{pinia:r,store:i,options:{persist:s=n}}=t;if(!s)return;if(!(i.$id in r.state.value)){const l=r._s.get(i.$id.replace("__hot:",""));l&&Promise.resolve().then(()=>l.$persist());return}const o=(Array.isArray(s)?s:s===!0?[{}]:[s]).map(e);i.$hydrate=({runHooks:l=!0}={})=>{o.forEach(u=>{rF(i,u,t,l)})},i.$persist=()=>{o.forEach(l=>{iF(i.$state,l)})},o.forEach(l=>{rF(i,l,t),i.$subscribe((u,c)=>iF(c,l),{detached:!0})})}function uwe(t={}){return function(e){lwe(e,n=>({key:(t.key?t.key:r=>r)(n.key??e.store.$id),debug:n.debug??t.debug??!1,serializer:n.serializer??t.serializer??{serialize:r=>JSON.stringify(r),deserialize:r=>awe(r)},storage:n.storage??t.storage??window.localStorage,beforeHydrate:n.beforeHydrate,afterHydrate:n.afterHydrate,pick:n.pick,omit:n.omit}),t.auto??!1)}}var cwe=uwe();/*! * vue-router v4.5.0 * (c) 2024 Eduardo San Martin Morote * @license MIT - */const Gg=typeof document<"u";function Bse(t){return typeof t=="object"||"displayName"in t||"props"in t||"__vccOpts"in t}function cwe(t){return t.__esModule||t[Symbol.toStringTag]==="Module"||t.default&&Bse(t.default)}const pr=Object.assign;function Dz(t,e){const n={};for(const r in e){const i=e[r];n[r]=Ku(i)?i.map(t):t(i)}return n}const B3=()=>{},Ku=Array.isArray,Hse=/#/g,dwe=/&/g,fwe=/\//g,hwe=/=/g,pwe=/\?/g,Qse=/\+/g,mwe=/%5B/g,vwe=/%5D/g,_se=/%5E/g,gwe=/%60/g,$se=/%7B/g,bwe=/%7C/g,eae=/%7D/g,ywe=/%20/g;function dC(t){return encodeURI(""+t).replace(bwe,"|").replace(mwe,"[").replace(vwe,"]")}function Swe(t){return dC(t).replace($se,"{").replace(eae,"}").replace(_se,"^")}function IN(t){return dC(t).replace(Qse,"%2B").replace(ywe,"+").replace(Hse,"%23").replace(dwe,"%26").replace(gwe,"`").replace($se,"{").replace(eae,"}").replace(_se,"^")}function xwe(t){return IN(t).replace(hwe,"%3D")}function Twe(t){return dC(t).replace(Hse,"%23").replace(pwe,"%3F")}function wwe(t){return t==null?"":Twe(t).replace(fwe,"%2F")}function Jx(t){try{return decodeURIComponent(""+t)}catch{}return""+t}const Ewe=/\/$/,Mwe=t=>t.replace(Ewe,"");function Wz(t,e,n="/"){let r,i={},s="",a="";const o=e.indexOf("#");let l=e.indexOf("?");return o=0&&(l=-1),l>-1&&(r=e.slice(0,l),s=e.slice(l+1,o>-1?o:e.length),i=t(s)),o>-1&&(r=r||e.slice(0,o),a=e.slice(o,e.length)),r=zwe(r??e,n),{fullPath:r+(s&&"?")+s+a,path:r,query:i,hash:Jx(a)}}function Pwe(t,e){const n=e.query?t(e.query):"";return e.path+(n&&"?")+n+(e.hash||"")}function oF(t,e){return!e||!t.toLowerCase().startsWith(e.toLowerCase())?t:t.slice(e.length)||"/"}function Rwe(t,e,n){const r=e.matched.length-1,i=n.matched.length-1;return r>-1&&r===i&&nb(e.matched[r],n.matched[i])&&tae(e.params,n.params)&&t(e.query)===t(n.query)&&e.hash===n.hash}function nb(t,e){return(t.aliasOf||t)===(e.aliasOf||e)}function tae(t,e){if(Object.keys(t).length!==Object.keys(e).length)return!1;for(const n in t)if(!Vwe(t[n],e[n]))return!1;return!0}function Vwe(t,e){return Ku(t)?lF(t,e):Ku(e)?lF(e,t):t===e}function lF(t,e){return Ku(e)?t.length===e.length&&t.every((n,r)=>n===e[r]):t.length===1&&t[0]===e}function zwe(t,e){if(t.startsWith("/"))return t;if(!t)return e;const n=e.split("/"),r=t.split("/"),i=r[r.length-1];(i===".."||i===".")&&r.push("");let s=n.length-1,a,o;for(a=0;a1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(a).join("/")}const nh={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var Yx;(function(t){t.pop="pop",t.push="push"})(Yx||(Yx={}));var H3;(function(t){t.back="back",t.forward="forward",t.unknown=""})(H3||(H3={}));function kwe(t){if(!t)if(Gg){const e=document.querySelector("base");t=e&&e.getAttribute("href")||"/",t=t.replace(/^\w+:\/\/[^\/]+/,"")}else t="/";return t[0]!=="/"&&t[0]!=="#"&&(t="/"+t),Mwe(t)}const Owe=/^[^#]+#/;function Iwe(t,e){return t.replace(Owe,"#")+e}function Uwe(t,e){const n=document.documentElement.getBoundingClientRect(),r=t.getBoundingClientRect();return{behavior:e.behavior,left:r.left-n.left-(e.left||0),top:r.top-n.top-(e.top||0)}}const aV=()=>({left:window.scrollX,top:window.scrollY});function Nwe(t){let e;if("el"in t){const n=t.el,r=typeof n=="string"&&n.startsWith("#"),i=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!i)return;e=Uwe(i,t)}else e=t;"scrollBehavior"in document.documentElement.style?window.scrollTo(e):window.scrollTo(e.left!=null?e.left:window.scrollX,e.top!=null?e.top:window.scrollY)}function uF(t,e){return(history.state?history.state.position-e:-1)+t}const UN=new Map;function Lwe(t,e){UN.set(t,e)}function Xwe(t){const e=UN.get(t);return UN.delete(t),e}let Cwe=()=>location.protocol+"//"+location.host;function nae(t,e){const{pathname:n,search:r,hash:i}=e,s=t.indexOf("#");if(s>-1){let o=i.includes(t.slice(s))?t.slice(s).length:1,l=i.slice(o);return l[0]!=="/"&&(l="/"+l),oF(l,"")}return oF(n,t)+r+i}function Kwe(t,e,n,r){let i=[],s=[],a=null;const o=({state:f})=>{const h=nae(t,location),p=n.value,m=e.value;let v=0;if(f){if(n.value=h,e.value=f,a&&a===p){a=null;return}v=m?f.position-m.position:0}else r(h);i.forEach(g=>{g(n.value,p,{delta:v,type:Yx.pop,direction:v?v>0?H3.forward:H3.back:H3.unknown})})};function l(){a=n.value}function u(f){i.push(f);const h=()=>{const p=i.indexOf(f);p>-1&&i.splice(p,1)};return s.push(h),h}function c(){const{history:f}=window;f.state&&f.replaceState(pr({},f.state,{scroll:aV()}),"")}function d(){for(const f of s)f();s=[],window.removeEventListener("popstate",o),window.removeEventListener("beforeunload",c)}return window.addEventListener("popstate",o),window.addEventListener("beforeunload",c,{passive:!0}),{pauseListeners:l,listen:u,destroy:d}}function cF(t,e,n,r=!1,i=!1){return{back:t,current:e,forward:n,replaced:r,position:window.history.length,scroll:i?aV():null}}function qwe(t){const{history:e,location:n}=window,r={value:nae(t,n)},i={value:e.state};i.value||s(r.value,{back:null,current:r.value,forward:null,position:e.length-1,replaced:!0,scroll:null},!0);function s(l,u,c){const d=t.indexOf("#"),f=d>-1?(n.host&&document.querySelector("base")?t:t.slice(d))+l:Cwe()+t+l;try{e[c?"replaceState":"pushState"](u,"",f),i.value=u}catch(h){console.error(h),n[c?"replace":"assign"](f)}}function a(l,u){const c=pr({},e.state,cF(i.value.back,l,i.value.forward,!0),u,{position:i.value.position});s(l,c,!0),r.value=l}function o(l,u){const c=pr({},i.value,e.state,{forward:l,scroll:aV()});s(c.current,c,!0);const d=pr({},cF(r.value,l,null),{position:c.position+1},u);s(l,d,!1),r.value=l}return{location:r,state:i,push:o,replace:a}}function Dwe(t){t=kwe(t);const e=qwe(t),n=Kwe(t,e.state,e.location,e.replace);function r(s,a=!0){a||n.pauseListeners(),history.go(s)}const i=pr({location:"",base:t,go:r,createHref:Iwe.bind(null,t)},e,n);return Object.defineProperty(i,"location",{enumerable:!0,get:()=>e.location.value}),Object.defineProperty(i,"state",{enumerable:!0,get:()=>e.state.value}),i}function Wwe(t){return typeof t=="string"||t&&typeof t=="object"}function rae(t){return typeof t=="string"||typeof t=="symbol"}const iae=Symbol("");var dF;(function(t){t[t.aborted=4]="aborted",t[t.cancelled=8]="cancelled",t[t.duplicated=16]="duplicated"})(dF||(dF={}));function rb(t,e){return pr(new Error,{type:t,[iae]:!0},e)}function bd(t,e){return t instanceof Error&&iae in t&&(e==null||!!(t.type&e))}const fF="[^/]+?",Awe={sensitive:!1,strict:!1,start:!0,end:!0},Gwe=/[.+*?^${}()[\]/\\]/g;function Fwe(t,e){const n=pr({},Awe,e),r=[];let i=n.start?"^":"";const s=[];for(const u of t){const c=u.length?[]:[90];n.strict&&!u.length&&(i+="/");for(let d=0;de.length?e.length===1&&e[0]===40+40?1:-1:0}function sae(t,e){let n=0;const r=t.score,i=e.score;for(;n0&&e[e.length-1]<0}const Zwe={type:0,value:""},Jwe=/[a-zA-Z0-9_]/;function Ywe(t){if(!t)return[[]];if(t==="/")return[[Zwe]];if(!t.startsWith("/"))throw new Error(`Invalid path "${t}"`);function e(h){throw new Error(`ERR (${n})/"${u}": ${h}`)}let n=0,r=n;const i=[];let s;function a(){s&&i.push(s),s=[]}let o=0,l,u="",c="";function d(){u&&(n===0?s.push({type:0,value:u}):n===1||n===2||n===3?(s.length>1&&(l==="*"||l==="+")&&e(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:u,regexp:c,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):e("Invalid state to consume buffer"),u="")}function f(){u+=l}for(;o{a(y)}:B3}function a(d){if(rae(d)){const f=r.get(d);f&&(r.delete(d),n.splice(n.indexOf(f),1),f.children.forEach(a),f.alias.forEach(a))}else{const f=n.indexOf(d);f>-1&&(n.splice(f,1),d.record.name&&r.delete(d.record.name),d.children.forEach(a),d.alias.forEach(a))}}function o(){return n}function l(d){const f=$we(d,n);n.splice(f,0,d),d.record.name&&!vF(d)&&r.set(d.record.name,d)}function u(d,f){let h,p={},m,v;if("name"in d&&d.name){if(h=r.get(d.name),!h)throw rb(1,{location:d});v=h.record.name,p=pr(pF(f.params,h.keys.filter(y=>!y.optional).concat(h.parent?h.parent.keys.filter(y=>y.optional):[]).map(y=>y.name)),d.params&&pF(d.params,h.keys.map(y=>y.name))),m=h.stringify(p)}else if(d.path!=null)m=d.path,h=n.find(y=>y.re.test(m)),h&&(p=h.parse(m),v=h.record.name);else{if(h=f.name?r.get(f.name):n.find(y=>y.re.test(f.path)),!h)throw rb(1,{location:d,currentLocation:f});v=h.record.name,p=pr({},f.params,d.params),m=h.stringify(p)}const g=[];let b=h;for(;b;)g.unshift(b.record),b=b.parent;return{name:v,path:m,params:p,matched:g,meta:_we(g)}}t.forEach(d=>s(d));function c(){n.length=0,r.clear()}return{addRoute:s,resolve:u,removeRoute:a,clearRoutes:c,getRoutes:o,getRecordMatcher:i}}function pF(t,e){const n={};for(const r of e)r in t&&(n[r]=t[r]);return n}function mF(t){const e={path:t.path,redirect:t.redirect,name:t.name,meta:t.meta||{},aliasOf:t.aliasOf,beforeEnter:t.beforeEnter,props:Qwe(t),children:t.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in t?t.components||null:t.component&&{default:t.component}};return Object.defineProperty(e,"mods",{value:{}}),e}function Qwe(t){const e={},n=t.props||!1;if("component"in t)e.default=n;else for(const r in t.components)e[r]=typeof n=="object"?n[r]:n;return e}function vF(t){for(;t;){if(t.record.aliasOf)return!0;t=t.parent}return!1}function _we(t){return t.reduce((e,n)=>pr(e,n.meta),{})}function gF(t,e){const n={};for(const r in t)n[r]=r in e?e[r]:t[r];return n}function $we(t,e){let n=0,r=e.length;for(;n!==r;){const s=n+r>>1;sae(t,e[s])<0?r=s:n=s+1}const i=e2e(t);return i&&(r=e.lastIndexOf(i,r-1)),r}function e2e(t){let e=t;for(;e=e.parent;)if(aae(e)&&sae(t,e)===0)return e}function aae({record:t}){return!!(t.name||t.components&&Object.keys(t.components).length||t.redirect)}function t2e(t){const e={};if(t===""||t==="?")return e;const r=(t[0]==="?"?t.slice(1):t).split("&");for(let i=0;is&&IN(s)):[r&&IN(r)]).forEach(s=>{s!==void 0&&(e+=(e.length?"&":"")+n,s!=null&&(e+="="+s))})}return e}function n2e(t){const e={};for(const n in t){const r=t[n];r!==void 0&&(e[n]=Ku(r)?r.map(i=>i==null?null:""+i):r==null?r:""+r)}return e}const r2e=Symbol(""),yF=Symbol(""),fC=Symbol(""),hC=Symbol(""),NN=Symbol("");function gS(){let t=[];function e(r){return t.push(r),()=>{const i=t.indexOf(r);i>-1&&t.splice(i,1)}}function n(){t=[]}return{add:e,list:()=>t.slice(),reset:n}}function Vh(t,e,n,r,i,s=a=>a()){const a=r&&(r.enterCallbacks[i]=r.enterCallbacks[i]||[]);return()=>new Promise((o,l)=>{const u=f=>{f===!1?l(rb(4,{from:n,to:e})):f instanceof Error?l(f):Wwe(f)?l(rb(2,{from:e,to:f})):(a&&r.enterCallbacks[i]===a&&typeof f=="function"&&a.push(f),o())},c=s(()=>t.call(r&&r.instances[i],e,n,u));let d=Promise.resolve(c);t.length<3&&(d=d.then(u)),d.catch(f=>l(f))})}function Az(t,e,n,r,i=s=>s()){const s=[];for(const a of t)for(const o in a.components){let l=a.components[o];if(!(e!=="beforeRouteEnter"&&!a.instances[o]))if(Bse(l)){const c=(l.__vccOpts||l)[e];c&&s.push(Vh(c,n,r,a,o,i))}else{let u=l();s.push(()=>u.then(c=>{if(!c)throw new Error(`Couldn't resolve component "${o}" at "${a.path}"`);const d=cwe(c)?c.default:c;a.mods[o]=c,a.components[o]=d;const h=(d.__vccOpts||d)[e];return h&&Vh(h,n,r,a,o,i)()}))}}return s}function SF(t){const e=cr(fC),n=cr(hC),r=et(()=>{const l=Ls(t.to);return e.resolve(l)}),i=et(()=>{const{matched:l}=r.value,{length:u}=l,c=l[u-1],d=n.matched;if(!c||!d.length)return-1;const f=d.findIndex(nb.bind(null,c));if(f>-1)return f;const h=xF(l[u-2]);return u>1&&xF(c)===h&&d[d.length-1].path!==h?d.findIndex(nb.bind(null,l[u-2])):f}),s=et(()=>i.value>-1&&l2e(n.params,r.value.params)),a=et(()=>i.value>-1&&i.value===n.matched.length-1&&tae(n.params,r.value.params));function o(l={}){if(o2e(l)){const u=e[Ls(t.replace)?"replace":"push"](Ls(t.to)).catch(B3);return t.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>u),u}return Promise.resolve()}return{route:r,href:et(()=>r.value.href),isActive:s,isExactActive:a,navigate:o}}function i2e(t){return t.length===1?t[0]:t}const s2e=pt({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:SF,setup(t,{slots:e}){const n=Go(SF(t)),{options:r}=cr(fC),i=et(()=>({[TF(t.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[TF(t.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=e.default&&i2e(e.default(n));return t.custom?s:An("a",{"aria-current":n.isExactActive?t.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:i.value},s)}}}),a2e=s2e;function o2e(t){if(!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey)&&!t.defaultPrevented&&!(t.button!==void 0&&t.button!==0)){if(t.currentTarget&&t.currentTarget.getAttribute){const e=t.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(e))return}return t.preventDefault&&t.preventDefault(),!0}}function l2e(t,e){for(const n in e){const r=e[n],i=t[n];if(typeof r=="string"){if(r!==i)return!1}else if(!Ku(i)||i.length!==r.length||r.some((s,a)=>s!==i[a]))return!1}return!0}function xF(t){return t?t.aliasOf?t.aliasOf.path:t.path:""}const TF=(t,e,n)=>t??e??n,u2e=pt({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(t,{attrs:e,slots:n}){const r=cr(NN),i=et(()=>t.route||r.value),s=cr(yF,0),a=et(()=>{let u=Ls(s);const{matched:c}=i.value;let d;for(;(d=c[u])&&!d.components;)u++;return u}),o=et(()=>i.value.matched[a.value]);Zi(yF,et(()=>a.value+1)),Zi(r2e,o),Zi(NN,i);const l=ze();return jt(()=>[l.value,o.value,t.name],([u,c,d],[f,h,p])=>{c&&(c.instances[d]=u,h&&h!==c&&u&&u===f&&(c.leaveGuards.size||(c.leaveGuards=h.leaveGuards),c.updateGuards.size||(c.updateGuards=h.updateGuards))),u&&c&&(!h||!nb(c,h)||!f)&&(c.enterCallbacks[d]||[]).forEach(m=>m(u))},{flush:"post"}),()=>{const u=i.value,c=t.name,d=o.value,f=d&&d.components[c];if(!f)return wF(n.default,{Component:f,route:u});const h=d.props[c],p=h?h===!0?u.params:typeof h=="function"?h(u):h:null,v=An(f,pr({},p,e,{onVnodeUnmounted:g=>{g.component.isUnmounted&&(d.instances[c]=null)},ref:l}));return wF(n.default,{Component:v,route:u})||v}}});function wF(t,e){if(!t)return null;const n=t(e);return n.length===1?n[0]:n}const c2e=u2e;function d2e(t){const e=Hwe(t.routes,t),n=t.parseQuery||t2e,r=t.stringifyQuery||bF,i=t.history,s=gS(),a=gS(),o=gS(),l=c0(nh);let u=nh;Gg&&t.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=Dz.bind(null,_=>""+_),d=Dz.bind(null,wwe),f=Dz.bind(null,Jx);function h(_,oe){let ye,ve;return rae(_)?(ye=e.getRecordMatcher(_),ve=oe):ve=_,e.addRoute(ve,ye)}function p(_){const oe=e.getRecordMatcher(_);oe&&e.removeRoute(oe)}function m(){return e.getRoutes().map(_=>_.record)}function v(_){return!!e.getRecordMatcher(_)}function g(_,oe){if(oe=pr({},oe||l.value),typeof _=="string"){const F=Wz(n,_,oe.path),re=e.resolve({path:F.path},oe),de=i.createHref(F.fullPath);return pr(F,re,{params:f(re.params),hash:Jx(F.hash),redirectedFrom:void 0,href:de})}let ye;if(_.path!=null)ye=pr({},_,{path:Wz(n,_.path,oe.path).path});else{const F=pr({},_.params);for(const re in F)F[re]==null&&delete F[re];ye=pr({},_,{params:d(F)}),oe.params=d(oe.params)}const ve=e.resolve(ye,oe),Ke=_.hash||"";ve.params=c(f(ve.params));const le=Pwe(r,pr({},_,{hash:Swe(Ke),path:ve.path})),D=i.createHref(le);return pr({fullPath:le,hash:Ke,query:r===bF?n2e(_.query):_.query||{}},ve,{redirectedFrom:void 0,href:D})}function b(_){return typeof _=="string"?Wz(n,_,l.value.path):pr({},_)}function y(_,oe){if(u!==_)return rb(8,{from:oe,to:_})}function x(_){return E(_)}function T(_){return x(pr(b(_),{replace:!0}))}function M(_){const oe=_.matched[_.matched.length-1];if(oe&&oe.redirect){const{redirect:ye}=oe;let ve=typeof ye=="function"?ye(_):ye;return typeof ve=="string"&&(ve=ve.includes("?")||ve.includes("#")?ve=b(ve):{path:ve},ve.params={}),pr({query:_.query,hash:_.hash,params:ve.path!=null?{}:_.params},ve)}}function E(_,oe){const ye=u=g(_),ve=l.value,Ke=_.state,le=_.force,D=_.replace===!0,F=M(ye);if(F)return E(pr(b(F),{state:typeof F=="object"?pr({},Ke,F.state):Ke,force:le,replace:D}),oe||ye);const re=ye;re.redirectedFrom=oe;let de;return!le&&Rwe(r,ve,ye)&&(de=rb(16,{to:re,from:ve}),G(ve,ve,!0,!1)),(de?Promise.resolve(de):R(re,ve)).catch(Te=>bd(Te)?bd(Te,2)?Te:ne(Te):Z(Te,re,ve)).then(Te=>{if(Te){if(bd(Te,2))return E(pr({replace:D},b(Te.to),{state:typeof Te.to=="object"?pr({},Ke,Te.to.state):Ke,force:le}),oe||re)}else Te=z(re,ve,!0,D,Ke);return V(re,ve,Te),Te})}function S(_,oe){const ye=y(_,oe);return ye?Promise.reject(ye):Promise.resolve()}function P(_){const oe=ce.values().next().value;return oe&&typeof oe.runWithContext=="function"?oe.runWithContext(_):_()}function R(_,oe){let ye;const[ve,Ke,le]=f2e(_,oe);ye=Az(ve.reverse(),"beforeRouteLeave",_,oe);for(const F of ve)F.leaveGuards.forEach(re=>{ye.push(Vh(re,_,oe))});const D=S.bind(null,_,oe);return ye.push(D),te(ye).then(()=>{ye=[];for(const F of s.list())ye.push(Vh(F,_,oe));return ye.push(D),te(ye)}).then(()=>{ye=Az(Ke,"beforeRouteUpdate",_,oe);for(const F of Ke)F.updateGuards.forEach(re=>{ye.push(Vh(re,_,oe))});return ye.push(D),te(ye)}).then(()=>{ye=[];for(const F of le)if(F.beforeEnter)if(Ku(F.beforeEnter))for(const re of F.beforeEnter)ye.push(Vh(re,_,oe));else ye.push(Vh(F.beforeEnter,_,oe));return ye.push(D),te(ye)}).then(()=>(_.matched.forEach(F=>F.enterCallbacks={}),ye=Az(le,"beforeRouteEnter",_,oe,P),ye.push(D),te(ye))).then(()=>{ye=[];for(const F of a.list())ye.push(Vh(F,_,oe));return ye.push(D),te(ye)}).catch(F=>bd(F,8)?F:Promise.reject(F))}function V(_,oe,ye){o.list().forEach(ve=>P(()=>ve(_,oe,ye)))}function z(_,oe,ye,ve,Ke){const le=y(_,oe);if(le)return le;const D=oe===nh,F=Gg?history.state:{};ye&&(ve||D?i.replace(_.fullPath,pr({scroll:D&&F&&F.scroll},Ke)):i.push(_.fullPath,Ke)),l.value=_,G(_,oe,ye,D),ne()}let k;function N(){k||(k=i.listen((_,oe,ye)=>{if(!fe.listening)return;const ve=g(_),Ke=M(ve);if(Ke){E(pr(Ke,{replace:!0,force:!0}),ve).catch(B3);return}u=ve;const le=l.value;Gg&&Lwe(uF(le.fullPath,ye.delta),aV()),R(ve,le).catch(D=>bd(D,12)?D:bd(D,2)?(E(pr(b(D.to),{force:!0}),ve).then(F=>{bd(F,20)&&!ye.delta&&ye.type===Yx.pop&&i.go(-1,!1)}).catch(B3),Promise.reject()):(ye.delta&&i.go(-ye.delta,!1),Z(D,ve,le))).then(D=>{D=D||z(ve,le,!1),D&&(ye.delta&&!bd(D,8)?i.go(-ye.delta,!1):ye.type===Yx.pop&&bd(D,20)&&i.go(-1,!1)),V(ve,le,D)}).catch(B3)}))}let q=gS(),L=gS(),A;function Z(_,oe,ye){ne(_);const ve=L.list();return ve.length?ve.forEach(Ke=>Ke(_,oe,ye)):console.error(_),Promise.reject(_)}function j(){return A&&l.value!==nh?Promise.resolve():new Promise((_,oe)=>{q.add([_,oe])})}function ne(_){return A||(A=!_,N(),q.list().forEach(([oe,ye])=>_?ye(_):oe()),q.reset()),_}function G(_,oe,ye,ve){const{scrollBehavior:Ke}=t;if(!Gg||!Ke)return Promise.resolve();const le=!ye&&Xwe(uF(_.fullPath,0))||(ve||!ye)&&history.state&&history.state.scroll||null;return Ia().then(()=>Ke(_,oe,le)).then(D=>D&&Nwe(D)).catch(D=>Z(D,_,oe))}const B=_=>i.go(_);let ee;const ce=new Set,fe={currentRoute:l,listening:!0,addRoute:h,removeRoute:p,clearRoutes:e.clearRoutes,hasRoute:v,getRoutes:m,resolve:g,options:t,push:x,replace:T,go:B,back:()=>B(-1),forward:()=>B(1),beforeEach:s.add,beforeResolve:a.add,afterEach:o.add,onError:L.add,isReady:j,install(_){const oe=this;_.component("RouterLink",a2e),_.component("RouterView",c2e),_.config.globalProperties.$router=oe,Object.defineProperty(_.config.globalProperties,"$route",{enumerable:!0,get:()=>Ls(l)}),Gg&&!ee&&l.value===nh&&(ee=!0,x(i.location).catch(Ke=>{}));const ye={};for(const Ke in nh)Object.defineProperty(ye,Ke,{get:()=>l.value[Ke],enumerable:!0});_.provide(fC,oe),_.provide(hC,ZX(ye)),_.provide(NN,l);const ve=_.unmount;ce.add(_),_.unmount=function(){ce.delete(_),ce.size<1&&(u=nh,k&&k(),k=null,l.value=nh,ee=!1,A=!1),ve()}}};function te(_){return _.reduce((oe,ye)=>oe.then(()=>P(ye)),Promise.resolve())}return fe}function f2e(t,e){const n=[],r=[],i=[],s=Math.max(e.matched.length,t.matched.length);for(let a=0;anb(u,o))?r.push(o):n.push(o));const l=t.matched[a];l&&(e.matched.find(u=>nb(u,l))||i.push(l))}return[n,r,i]}function h2e(t){return cr(hC)}const oae=Object.prototype.toString;function lae(t){switch(oae.call(t)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return vf(t,Error)}}function ty(t,e){return oae.call(t)===`[object ${e}]`}function pC(t){return ty(t,"ErrorEvent")}function EF(t){return ty(t,"DOMError")}function p2e(t){return ty(t,"DOMException")}function Dc(t){return ty(t,"String")}function mC(t){return typeof t=="object"&&t!==null&&"__sentry_template_string__"in t&&"__sentry_template_values__"in t}function vC(t){return t===null||mC(t)||typeof t!="object"&&typeof t!="function"}function ib(t){return ty(t,"Object")}function oV(t){return typeof Event<"u"&&vf(t,Event)}function m2e(t){return typeof Element<"u"&&vf(t,Element)}function v2e(t){return ty(t,"RegExp")}function lV(t){return!!(t&&t.then&&typeof t.then=="function")}function g2e(t){return ib(t)&&"nativeEvent"in t&&"preventDefault"in t&&"stopPropagation"in t}function uae(t){return typeof t=="number"&&t!==t}function vf(t,e){try{return t instanceof e}catch{return!1}}function cae(t){return!!(typeof t=="object"&&t!==null&&(t.__isVue||t._isVue))}function O1(t,e=0){return typeof t!="string"||e===0||t.length<=e?t:`${t.slice(0,e)}...`}function MF(t,e){if(!Array.isArray(t))return"";const n=[];for(let r=0;rb2e(t,r,n))}function y2e(t,e,n=250,r,i,s,a){if(!s.exception||!s.exception.values||!a||!vf(a.originalException,Error))return;const o=s.exception.values.length>0?s.exception.values[s.exception.values.length-1]:void 0;o&&(s.exception.values=S2e(LN(t,e,i,a.originalException,r,s.exception.values,o,0),n))}function LN(t,e,n,r,i,s,a,o){if(s.length>=n+1)return s;let l=[...s];if(vf(r[i],Error)){PF(a,o);const u=t(e,r[i]),c=l.length;RF(u,i,c,o),l=LN(t,e,n,r[i],i,[u,...l],u,c)}return Array.isArray(r.errors)&&r.errors.forEach((u,c)=>{if(vf(u,Error)){PF(a,o);const d=t(e,u),f=l.length;RF(d,`errors[${c}]`,f,o),l=LN(t,e,n,u,i,[d,...l],d,f)}}),l}function PF(t,e){t.mechanism=t.mechanism||{type:"generic",handled:!0},t.mechanism={...t.mechanism,...t.type==="AggregateError"&&{is_exception_group:!0},exception_id:e}}function RF(t,e,n,r){t.mechanism=t.mechanism||{type:"generic",handled:!0},t.mechanism={...t.mechanism,type:"chained",source:e,exception_id:n,parent_id:r}}function S2e(t,e){return t.map(n=>(n.value&&(n.value=O1(n.value,e)),n))}function _w(t){return t&&t.Math==Math?t:void 0}const Gn=typeof globalThis=="object"&&_w(globalThis)||typeof window=="object"&&_w(window)||typeof self=="object"&&_w(self)||typeof global=="object"&&_w(global)||function(){return this}()||{};function gC(){return Gn}function dae(t,e,n){const r=n||Gn,i=r.__SENTRY__=r.__SENTRY__||{};return i[t]||(i[t]=e())}const I1=gC(),x2e=80;function zp(t,e={}){if(!t)return"";try{let n=t;const r=5,i=[];let s=0,a=0;const o=" > ",l=o.length;let u;const c=Array.isArray(e)?e:e.keyAttrs,d=!Array.isArray(e)&&e.maxStringLength||x2e;for(;n&&s++1&&a+i.length*l+u.length>=d));)i.push(u),a+=u.length,n=n.parentNode;return i.reverse().join(o)}catch{return""}}function T2e(t,e){const n=t,r=[];let i,s,a,o,l;if(!n||!n.tagName)return"";if(I1.HTMLElement&&n instanceof HTMLElement&&n.dataset&&n.dataset.sentryComponent)return n.dataset.sentryComponent;r.push(n.tagName.toLowerCase());const u=e&&e.length?e.filter(d=>n.getAttribute(d)).map(d=>[d,n.getAttribute(d)]):null;if(u&&u.length)u.forEach(d=>{r.push(`[${d[0]}="${d[1]}"]`)});else if(n.id&&r.push(`#${n.id}`),i=n.className,i&&Dc(i))for(s=i.split(/\s+/),l=0;l"u"||__SENTRY_DEBUG__,M2e="Sentry Logger ",XN=["debug","info","warn","error","log","assert","trace"],KM={};function Qc(t){if(!("console"in Gn))return t();const e=Gn.console,n={},r=Object.keys(KM);r.forEach(i=>{const s=KM[i];n[i]=e[i],e[i]=s});try{return t()}finally{r.forEach(i=>{e[i]=n[i]})}}function P2e(){let t=!1;const e={enable:()=>{t=!0},disable:()=>{t=!1},isEnabled:()=>t};return ry?XN.forEach(n=>{e[n]=(...r)=>{t&&Qc(()=>{Gn.console[n](`${M2e}[${n}]:`,...r)})}}):XN.forEach(n=>{e[n]=()=>{}}),e}const He=P2e(),R2e=/^(?:(\w+):)\/\/(?:(\w+)(?::(\w+)?)?@)([\w.-]+)(?::(\d+))?\/(.+)/;function V2e(t){return t==="http"||t==="https"}function iy(t,e=!1){const{host:n,path:r,pass:i,port:s,projectId:a,protocol:o,publicKey:l}=t;return`${o}://${l}${e&&i?`:${i}`:""}@${n}${s?`:${s}`:""}/${r&&`${r}/`}${a}`}function z2e(t){const e=R2e.exec(t);if(!e){Qc(()=>{console.error(`Invalid Sentry Dsn: ${t}`)});return}const[n,r,i="",s,a="",o]=e.slice(1);let l="",u=o;const c=u.split("/");if(c.length>1&&(l=c.slice(0,-1).join("/"),u=c.pop()),u){const d=u.match(/^\d+/);d&&(u=d[0])}return hae({host:s,pass:i,path:l,projectId:u,port:a,protocol:n,publicKey:r})}function hae(t){return{protocol:t.protocol,publicKey:t.publicKey||"",pass:t.pass||"",host:t.host,port:t.port||"",path:t.path||"",projectId:t.projectId}}function k2e(t){if(!ry)return!0;const{port:e,projectId:n,protocol:r}=t;return["protocol","publicKey","host","projectId"].find(a=>t[a]?!1:(He.error(`Invalid Sentry Dsn: ${a} missing`),!0))?!1:n.match(/^\d+$/)?V2e(r)?e&&isNaN(parseInt(e,10))?(He.error(`Invalid Sentry Dsn: Invalid port ${e}`),!1):!0:(He.error(`Invalid Sentry Dsn: Invalid protocol ${r}`),!1):(He.error(`Invalid Sentry Dsn: Invalid projectId ${n}`),!1)}function O2e(t){const e=typeof t=="string"?z2e(t):hae(t);if(!(!e||!k2e(e)))return e}class Uc extends Error{constructor(e,n="warn"){super(e),this.message=e,this.name=new.target.prototype.constructor.name,Object.setPrototypeOf(this,new.target.prototype),this.logLevel=n}}function Cs(t,e,n){if(!(e in t))return;const r=t[e],i=n(r);typeof i=="function"&&pae(i,r),t[e]=i}function Kv(t,e,n){try{Object.defineProperty(t,e,{value:n,writable:!0,configurable:!0})}catch{ry&&He.log(`Failed to add non-enumerable property "${e}" to object`,t)}}function pae(t,e){try{const n=e.prototype||{};t.prototype=e.prototype=n,Kv(t,"__sentry_original__",e)}catch{}}function bC(t){return t.__sentry_original__}function I2e(t){return Object.keys(t).map(e=>`${encodeURIComponent(e)}=${encodeURIComponent(t[e])}`).join("&")}function mae(t){if(lae(t))return{message:t.message,name:t.name,stack:t.stack,...zF(t)};if(oV(t)){const e={type:t.type,target:VF(t.target),currentTarget:VF(t.currentTarget),...zF(t)};return typeof CustomEvent<"u"&&vf(t,CustomEvent)&&(e.detail=t.detail),e}else return t}function VF(t){try{return m2e(t)?zp(t):Object.prototype.toString.call(t)}catch{return""}}function zF(t){if(typeof t=="object"&&t!==null){const e={};for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}else return{}}function U2e(t,e=40){const n=Object.keys(mae(t));if(n.sort(),!n.length)return"[object has no keys]";if(n[0].length>=e)return O1(n[0],e);for(let r=n.length;r>0;r--){const i=n.slice(0,r).join(", ");if(!(i.length>e))return r===n.length?i:O1(i,e)}return""}function to(t){return CN(t,new Map)}function CN(t,e){if(N2e(t)){const n=e.get(t);if(n!==void 0)return n;const r={};e.set(t,r);for(const i of Object.keys(t))typeof t[i]<"u"&&(r[i]=CN(t[i],e));return r}if(Array.isArray(t)){const n=e.get(t);if(n!==void 0)return n;const r=[];return e.set(t,r),t.forEach(i=>{r.push(CN(i,e))}),r}return t}function N2e(t){if(!ib(t))return!1;try{const e=Object.getPrototypeOf(t).constructor.name;return!e||e==="Object"}catch{return!0}}const vae=50,kF=/\(error: (.*)\)/,OF=/captureMessage|captureException/;function gae(...t){const e=t.sort((n,r)=>n[0]-r[0]).map(n=>n[1]);return(n,r=0)=>{const i=[],s=n.split(` -`);for(let a=r;a1024)continue;const l=kF.test(o)?o.replace(kF,"$1"):o;if(!l.match(/\S*Error: /)){for(const u of e){const c=u(l);if(c){i.push(c);break}}if(i.length>=vae)break}}return X2e(i)}}function L2e(t){return Array.isArray(t)?gae(...t):t}function X2e(t){if(!t.length)return[];const e=Array.from(t);return/sentryWrapped/.test(e[e.length-1].function||"")&&e.pop(),e.reverse(),OF.test(e[e.length-1].function||"")&&(e.pop(),OF.test(e[e.length-1].function||"")&&e.pop()),e.slice(0,vae).map(n=>({...n,filename:n.filename||e[e.length-1].filename,function:n.function||"?"}))}const Gz="";function gf(t){try{return!t||typeof t!="function"?Gz:t.name||Gz}catch{return Gz}}const v7={},IF={};function p0(t,e){v7[t]=v7[t]||[],v7[t].push(e)}function m0(t,e){IF[t]||(e(),IF[t]=!0)}function Uu(t,e){const n=t&&v7[t];if(n)for(const r of n)try{r(e)}catch(i){ry&&He.error(`Error while triggering instrumentation handler. + */const Gg=typeof document<"u";function Yse(t){return typeof t=="object"||"displayName"in t||"props"in t||"__vccOpts"in t}function dwe(t){return t.__esModule||t[Symbol.toStringTag]==="Module"||t.default&&Yse(t.default)}const pr=Object.assign;function Dz(t,e){const n={};for(const r in e){const i=e[r];n[r]=Ku(i)?i.map(t):t(i)}return n}const Y3=()=>{},Ku=Array.isArray,Bse=/#/g,fwe=/&/g,hwe=/\//g,pwe=/=/g,mwe=/\?/g,Hse=/\+/g,vwe=/%5B/g,gwe=/%5D/g,Qse=/%5E/g,bwe=/%60/g,_se=/%7B/g,ywe=/%7C/g,$se=/%7D/g,Swe=/%20/g;function fC(t){return encodeURI(""+t).replace(ywe,"|").replace(vwe,"[").replace(gwe,"]")}function xwe(t){return fC(t).replace(_se,"{").replace($se,"}").replace(Qse,"^")}function IN(t){return fC(t).replace(Hse,"%2B").replace(Swe,"+").replace(Bse,"%23").replace(fwe,"%26").replace(bwe,"`").replace(_se,"{").replace($se,"}").replace(Qse,"^")}function Twe(t){return IN(t).replace(pwe,"%3D")}function wwe(t){return fC(t).replace(Bse,"%23").replace(mwe,"%3F")}function Ewe(t){return t==null?"":wwe(t).replace(hwe,"%2F")}function Zx(t){try{return decodeURIComponent(""+t)}catch{}return""+t}const Mwe=/\/$/,Pwe=t=>t.replace(Mwe,"");function Wz(t,e,n="/"){let r,i={},s="",a="";const o=e.indexOf("#");let l=e.indexOf("?");return o=0&&(l=-1),l>-1&&(r=e.slice(0,l),s=e.slice(l+1,o>-1?o:e.length),i=t(s)),o>-1&&(r=r||e.slice(0,o),a=e.slice(o,e.length)),r=kwe(r??e,n),{fullPath:r+(s&&"?")+s+a,path:r,query:i,hash:Zx(a)}}function Rwe(t,e){const n=e.query?t(e.query):"";return e.path+(n&&"?")+n+(e.hash||"")}function sF(t,e){return!e||!t.toLowerCase().startsWith(e.toLowerCase())?t:t.slice(e.length)||"/"}function Vwe(t,e,n){const r=e.matched.length-1,i=n.matched.length-1;return r>-1&&r===i&&nb(e.matched[r],n.matched[i])&&eae(e.params,n.params)&&t(e.query)===t(n.query)&&e.hash===n.hash}function nb(t,e){return(t.aliasOf||t)===(e.aliasOf||e)}function eae(t,e){if(Object.keys(t).length!==Object.keys(e).length)return!1;for(const n in t)if(!zwe(t[n],e[n]))return!1;return!0}function zwe(t,e){return Ku(t)?aF(t,e):Ku(e)?aF(e,t):t===e}function aF(t,e){return Ku(e)?t.length===e.length&&t.every((n,r)=>n===e[r]):t.length===1&&t[0]===e}function kwe(t,e){if(t.startsWith("/"))return t;if(!t)return e;const n=e.split("/"),r=t.split("/"),i=r[r.length-1];(i===".."||i===".")&&r.push("");let s=n.length-1,a,o;for(a=0;a1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(a).join("/")}const nh={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var Jx;(function(t){t.pop="pop",t.push="push"})(Jx||(Jx={}));var B3;(function(t){t.back="back",t.forward="forward",t.unknown=""})(B3||(B3={}));function Owe(t){if(!t)if(Gg){const e=document.querySelector("base");t=e&&e.getAttribute("href")||"/",t=t.replace(/^\w+:\/\/[^\/]+/,"")}else t="/";return t[0]!=="/"&&t[0]!=="#"&&(t="/"+t),Pwe(t)}const Iwe=/^[^#]+#/;function Uwe(t,e){return t.replace(Iwe,"#")+e}function Nwe(t,e){const n=document.documentElement.getBoundingClientRect(),r=t.getBoundingClientRect();return{behavior:e.behavior,left:r.left-n.left-(e.left||0),top:r.top-n.top-(e.top||0)}}const aV=()=>({left:window.scrollX,top:window.scrollY});function Lwe(t){let e;if("el"in t){const n=t.el,r=typeof n=="string"&&n.startsWith("#"),i=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!i)return;e=Nwe(i,t)}else e=t;"scrollBehavior"in document.documentElement.style?window.scrollTo(e):window.scrollTo(e.left!=null?e.left:window.scrollX,e.top!=null?e.top:window.scrollY)}function oF(t,e){return(history.state?history.state.position-e:-1)+t}const UN=new Map;function Xwe(t,e){UN.set(t,e)}function Cwe(t){const e=UN.get(t);return UN.delete(t),e}let Kwe=()=>location.protocol+"//"+location.host;function tae(t,e){const{pathname:n,search:r,hash:i}=e,s=t.indexOf("#");if(s>-1){let o=i.includes(t.slice(s))?t.slice(s).length:1,l=i.slice(o);return l[0]!=="/"&&(l="/"+l),sF(l,"")}return sF(n,t)+r+i}function qwe(t,e,n,r){let i=[],s=[],a=null;const o=({state:f})=>{const h=tae(t,location),p=n.value,m=e.value;let v=0;if(f){if(n.value=h,e.value=f,a&&a===p){a=null;return}v=m?f.position-m.position:0}else r(h);i.forEach(g=>{g(n.value,p,{delta:v,type:Jx.pop,direction:v?v>0?B3.forward:B3.back:B3.unknown})})};function l(){a=n.value}function u(f){i.push(f);const h=()=>{const p=i.indexOf(f);p>-1&&i.splice(p,1)};return s.push(h),h}function c(){const{history:f}=window;f.state&&f.replaceState(pr({},f.state,{scroll:aV()}),"")}function d(){for(const f of s)f();s=[],window.removeEventListener("popstate",o),window.removeEventListener("beforeunload",c)}return window.addEventListener("popstate",o),window.addEventListener("beforeunload",c,{passive:!0}),{pauseListeners:l,listen:u,destroy:d}}function lF(t,e,n,r=!1,i=!1){return{back:t,current:e,forward:n,replaced:r,position:window.history.length,scroll:i?aV():null}}function Dwe(t){const{history:e,location:n}=window,r={value:tae(t,n)},i={value:e.state};i.value||s(r.value,{back:null,current:r.value,forward:null,position:e.length-1,replaced:!0,scroll:null},!0);function s(l,u,c){const d=t.indexOf("#"),f=d>-1?(n.host&&document.querySelector("base")?t:t.slice(d))+l:Kwe()+t+l;try{e[c?"replaceState":"pushState"](u,"",f),i.value=u}catch(h){console.error(h),n[c?"replace":"assign"](f)}}function a(l,u){const c=pr({},e.state,lF(i.value.back,l,i.value.forward,!0),u,{position:i.value.position});s(l,c,!0),r.value=l}function o(l,u){const c=pr({},i.value,e.state,{forward:l,scroll:aV()});s(c.current,c,!0);const d=pr({},lF(r.value,l,null),{position:c.position+1},u);s(l,d,!1),r.value=l}return{location:r,state:i,push:o,replace:a}}function Wwe(t){t=Owe(t);const e=Dwe(t),n=qwe(t,e.state,e.location,e.replace);function r(s,a=!0){a||n.pauseListeners(),history.go(s)}const i=pr({location:"",base:t,go:r,createHref:Uwe.bind(null,t)},e,n);return Object.defineProperty(i,"location",{enumerable:!0,get:()=>e.location.value}),Object.defineProperty(i,"state",{enumerable:!0,get:()=>e.state.value}),i}function Awe(t){return typeof t=="string"||t&&typeof t=="object"}function nae(t){return typeof t=="string"||typeof t=="symbol"}const rae=Symbol("");var uF;(function(t){t[t.aborted=4]="aborted",t[t.cancelled=8]="cancelled",t[t.duplicated=16]="duplicated"})(uF||(uF={}));function rb(t,e){return pr(new Error,{type:t,[rae]:!0},e)}function bd(t,e){return t instanceof Error&&rae in t&&(e==null||!!(t.type&e))}const cF="[^/]+?",Gwe={sensitive:!1,strict:!1,start:!0,end:!0},Fwe=/[.+*?^${}()[\]/\\]/g;function jwe(t,e){const n=pr({},Gwe,e),r=[];let i=n.start?"^":"";const s=[];for(const u of t){const c=u.length?[]:[90];n.strict&&!u.length&&(i+="/");for(let d=0;de.length?e.length===1&&e[0]===40+40?1:-1:0}function iae(t,e){let n=0;const r=t.score,i=e.score;for(;n0&&e[e.length-1]<0}const Jwe={type:0,value:""},Ywe=/[a-zA-Z0-9_]/;function Bwe(t){if(!t)return[[]];if(t==="/")return[[Jwe]];if(!t.startsWith("/"))throw new Error(`Invalid path "${t}"`);function e(h){throw new Error(`ERR (${n})/"${u}": ${h}`)}let n=0,r=n;const i=[];let s;function a(){s&&i.push(s),s=[]}let o=0,l,u="",c="";function d(){u&&(n===0?s.push({type:0,value:u}):n===1||n===2||n===3?(s.length>1&&(l==="*"||l==="+")&&e(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:u,regexp:c,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):e("Invalid state to consume buffer"),u="")}function f(){u+=l}for(;o{a(y)}:Y3}function a(d){if(nae(d)){const f=r.get(d);f&&(r.delete(d),n.splice(n.indexOf(f),1),f.children.forEach(a),f.alias.forEach(a))}else{const f=n.indexOf(d);f>-1&&(n.splice(f,1),d.record.name&&r.delete(d.record.name),d.children.forEach(a),d.alias.forEach(a))}}function o(){return n}function l(d){const f=e2e(d,n);n.splice(f,0,d),d.record.name&&!pF(d)&&r.set(d.record.name,d)}function u(d,f){let h,p={},m,v;if("name"in d&&d.name){if(h=r.get(d.name),!h)throw rb(1,{location:d});v=h.record.name,p=pr(fF(f.params,h.keys.filter(y=>!y.optional).concat(h.parent?h.parent.keys.filter(y=>y.optional):[]).map(y=>y.name)),d.params&&fF(d.params,h.keys.map(y=>y.name))),m=h.stringify(p)}else if(d.path!=null)m=d.path,h=n.find(y=>y.re.test(m)),h&&(p=h.parse(m),v=h.record.name);else{if(h=f.name?r.get(f.name):n.find(y=>y.re.test(f.path)),!h)throw rb(1,{location:d,currentLocation:f});v=h.record.name,p=pr({},f.params,d.params),m=h.stringify(p)}const g=[];let b=h;for(;b;)g.unshift(b.record),b=b.parent;return{name:v,path:m,params:p,matched:g,meta:$we(g)}}t.forEach(d=>s(d));function c(){n.length=0,r.clear()}return{addRoute:s,resolve:u,removeRoute:a,clearRoutes:c,getRoutes:o,getRecordMatcher:i}}function fF(t,e){const n={};for(const r of e)r in t&&(n[r]=t[r]);return n}function hF(t){const e={path:t.path,redirect:t.redirect,name:t.name,meta:t.meta||{},aliasOf:t.aliasOf,beforeEnter:t.beforeEnter,props:_we(t),children:t.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in t?t.components||null:t.component&&{default:t.component}};return Object.defineProperty(e,"mods",{value:{}}),e}function _we(t){const e={},n=t.props||!1;if("component"in t)e.default=n;else for(const r in t.components)e[r]=typeof n=="object"?n[r]:n;return e}function pF(t){for(;t;){if(t.record.aliasOf)return!0;t=t.parent}return!1}function $we(t){return t.reduce((e,n)=>pr(e,n.meta),{})}function mF(t,e){const n={};for(const r in t)n[r]=r in e?e[r]:t[r];return n}function e2e(t,e){let n=0,r=e.length;for(;n!==r;){const s=n+r>>1;iae(t,e[s])<0?r=s:n=s+1}const i=t2e(t);return i&&(r=e.lastIndexOf(i,r-1)),r}function t2e(t){let e=t;for(;e=e.parent;)if(sae(e)&&iae(t,e)===0)return e}function sae({record:t}){return!!(t.name||t.components&&Object.keys(t.components).length||t.redirect)}function n2e(t){const e={};if(t===""||t==="?")return e;const r=(t[0]==="?"?t.slice(1):t).split("&");for(let i=0;is&&IN(s)):[r&&IN(r)]).forEach(s=>{s!==void 0&&(e+=(e.length?"&":"")+n,s!=null&&(e+="="+s))})}return e}function r2e(t){const e={};for(const n in t){const r=t[n];r!==void 0&&(e[n]=Ku(r)?r.map(i=>i==null?null:""+i):r==null?r:""+r)}return e}const i2e=Symbol(""),gF=Symbol(""),hC=Symbol(""),pC=Symbol(""),NN=Symbol("");function vS(){let t=[];function e(r){return t.push(r),()=>{const i=t.indexOf(r);i>-1&&t.splice(i,1)}}function n(){t=[]}return{add:e,list:()=>t.slice(),reset:n}}function Vh(t,e,n,r,i,s=a=>a()){const a=r&&(r.enterCallbacks[i]=r.enterCallbacks[i]||[]);return()=>new Promise((o,l)=>{const u=f=>{f===!1?l(rb(4,{from:n,to:e})):f instanceof Error?l(f):Awe(f)?l(rb(2,{from:e,to:f})):(a&&r.enterCallbacks[i]===a&&typeof f=="function"&&a.push(f),o())},c=s(()=>t.call(r&&r.instances[i],e,n,u));let d=Promise.resolve(c);t.length<3&&(d=d.then(u)),d.catch(f=>l(f))})}function Az(t,e,n,r,i=s=>s()){const s=[];for(const a of t)for(const o in a.components){let l=a.components[o];if(!(e!=="beforeRouteEnter"&&!a.instances[o]))if(Yse(l)){const c=(l.__vccOpts||l)[e];c&&s.push(Vh(c,n,r,a,o,i))}else{let u=l();s.push(()=>u.then(c=>{if(!c)throw new Error(`Couldn't resolve component "${o}" at "${a.path}"`);const d=dwe(c)?c.default:c;a.mods[o]=c,a.components[o]=d;const h=(d.__vccOpts||d)[e];return h&&Vh(h,n,r,a,o,i)()}))}}return s}function bF(t){const e=cr(hC),n=cr(pC),r=et(()=>{const l=Ls(t.to);return e.resolve(l)}),i=et(()=>{const{matched:l}=r.value,{length:u}=l,c=l[u-1],d=n.matched;if(!c||!d.length)return-1;const f=d.findIndex(nb.bind(null,c));if(f>-1)return f;const h=yF(l[u-2]);return u>1&&yF(c)===h&&d[d.length-1].path!==h?d.findIndex(nb.bind(null,l[u-2])):f}),s=et(()=>i.value>-1&&u2e(n.params,r.value.params)),a=et(()=>i.value>-1&&i.value===n.matched.length-1&&eae(n.params,r.value.params));function o(l={}){if(l2e(l)){const u=e[Ls(t.replace)?"replace":"push"](Ls(t.to)).catch(Y3);return t.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>u),u}return Promise.resolve()}return{route:r,href:et(()=>r.value.href),isActive:s,isExactActive:a,navigate:o}}function s2e(t){return t.length===1?t[0]:t}const a2e=pt({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:bF,setup(t,{slots:e}){const n=Ao(bF(t)),{options:r}=cr(hC),i=et(()=>({[SF(t.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[SF(t.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=e.default&&s2e(e.default(n));return t.custom?s:An("a",{"aria-current":n.isExactActive?t.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:i.value},s)}}}),o2e=a2e;function l2e(t){if(!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey)&&!t.defaultPrevented&&!(t.button!==void 0&&t.button!==0)){if(t.currentTarget&&t.currentTarget.getAttribute){const e=t.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(e))return}return t.preventDefault&&t.preventDefault(),!0}}function u2e(t,e){for(const n in e){const r=e[n],i=t[n];if(typeof r=="string"){if(r!==i)return!1}else if(!Ku(i)||i.length!==r.length||r.some((s,a)=>s!==i[a]))return!1}return!0}function yF(t){return t?t.aliasOf?t.aliasOf.path:t.path:""}const SF=(t,e,n)=>t??e??n,c2e=pt({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(t,{attrs:e,slots:n}){const r=cr(NN),i=et(()=>t.route||r.value),s=cr(gF,0),a=et(()=>{let u=Ls(s);const{matched:c}=i.value;let d;for(;(d=c[u])&&!d.components;)u++;return u}),o=et(()=>i.value.matched[a.value]);Zi(gF,et(()=>a.value+1)),Zi(i2e,o),Zi(NN,i);const l=ze();return jt(()=>[l.value,o.value,t.name],([u,c,d],[f,h,p])=>{c&&(c.instances[d]=u,h&&h!==c&&u&&u===f&&(c.leaveGuards.size||(c.leaveGuards=h.leaveGuards),c.updateGuards.size||(c.updateGuards=h.updateGuards))),u&&c&&(!h||!nb(c,h)||!f)&&(c.enterCallbacks[d]||[]).forEach(m=>m(u))},{flush:"post"}),()=>{const u=i.value,c=t.name,d=o.value,f=d&&d.components[c];if(!f)return xF(n.default,{Component:f,route:u});const h=d.props[c],p=h?h===!0?u.params:typeof h=="function"?h(u):h:null,v=An(f,pr({},p,e,{onVnodeUnmounted:g=>{g.component.isUnmounted&&(d.instances[c]=null)},ref:l}));return xF(n.default,{Component:v,route:u})||v}}});function xF(t,e){if(!t)return null;const n=t(e);return n.length===1?n[0]:n}const d2e=c2e;function f2e(t){const e=Qwe(t.routes,t),n=t.parseQuery||n2e,r=t.stringifyQuery||vF,i=t.history,s=vS(),a=vS(),o=vS(),l=c0(nh);let u=nh;Gg&&t.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=Dz.bind(null,$=>""+$),d=Dz.bind(null,Ewe),f=Dz.bind(null,Zx);function h($,oe){let ge,ve;return nae($)?(ge=e.getRecordMatcher($),ve=oe):ve=$,e.addRoute(ve,ge)}function p($){const oe=e.getRecordMatcher($);oe&&e.removeRoute(oe)}function m(){return e.getRoutes().map($=>$.record)}function v($){return!!e.getRecordMatcher($)}function g($,oe){if(oe=pr({},oe||l.value),typeof $=="string"){const G=Wz(n,$,oe.path),re=e.resolve({path:G.path},oe),de=i.createHref(G.fullPath);return pr(G,re,{params:f(re.params),hash:Zx(G.hash),redirectedFrom:void 0,href:de})}let ge;if($.path!=null)ge=pr({},$,{path:Wz(n,$.path,oe.path).path});else{const G=pr({},$.params);for(const re in G)G[re]==null&&delete G[re];ge=pr({},$,{params:d(G)}),oe.params=d(oe.params)}const ve=e.resolve(ge,oe),Ke=$.hash||"";ve.params=c(f(ve.params));const ue=Rwe(r,pr({},$,{hash:xwe(Ke),path:ve.path})),D=i.createHref(ue);return pr({fullPath:ue,hash:Ke,query:r===vF?r2e($.query):$.query||{}},ve,{redirectedFrom:void 0,href:D})}function b($){return typeof $=="string"?Wz(n,$,l.value.path):pr({},$)}function y($,oe){if(u!==$)return rb(8,{from:oe,to:$})}function x($){return E($)}function T($){return x(pr(b($),{replace:!0}))}function M($){const oe=$.matched[$.matched.length-1];if(oe&&oe.redirect){const{redirect:ge}=oe;let ve=typeof ge=="function"?ge($):ge;return typeof ve=="string"&&(ve=ve.includes("?")||ve.includes("#")?ve=b(ve):{path:ve},ve.params={}),pr({query:$.query,hash:$.hash,params:ve.path!=null?{}:$.params},ve)}}function E($,oe){const ge=u=g($),ve=l.value,Ke=$.state,ue=$.force,D=$.replace===!0,G=M(ge);if(G)return E(pr(b(G),{state:typeof G=="object"?pr({},Ke,G.state):Ke,force:ue,replace:D}),oe||ge);const re=ge;re.redirectedFrom=oe;let de;return!ue&&Vwe(r,ve,ge)&&(de=rb(16,{to:re,from:ve}),j(ve,ve,!0,!1)),(de?Promise.resolve(de):R(re,ve)).catch(Te=>bd(Te)?bd(Te,2)?Te:ne(Te):J(Te,re,ve)).then(Te=>{if(Te){if(bd(Te,2))return E(pr({replace:D},b(Te.to),{state:typeof Te.to=="object"?pr({},Ke,Te.to.state):Ke,force:ue}),oe||re)}else Te=z(re,ve,!0,D,Ke);return V(re,ve,Te),Te})}function S($,oe){const ge=y($,oe);return ge?Promise.reject(ge):Promise.resolve()}function P($){const oe=le.values().next().value;return oe&&typeof oe.runWithContext=="function"?oe.runWithContext($):$()}function R($,oe){let ge;const[ve,Ke,ue]=h2e($,oe);ge=Az(ve.reverse(),"beforeRouteLeave",$,oe);for(const G of ve)G.leaveGuards.forEach(re=>{ge.push(Vh(re,$,oe))});const D=S.bind(null,$,oe);return ge.push(D),te(ge).then(()=>{ge=[];for(const G of s.list())ge.push(Vh(G,$,oe));return ge.push(D),te(ge)}).then(()=>{ge=Az(Ke,"beforeRouteUpdate",$,oe);for(const G of Ke)G.updateGuards.forEach(re=>{ge.push(Vh(re,$,oe))});return ge.push(D),te(ge)}).then(()=>{ge=[];for(const G of ue)if(G.beforeEnter)if(Ku(G.beforeEnter))for(const re of G.beforeEnter)ge.push(Vh(re,$,oe));else ge.push(Vh(G.beforeEnter,$,oe));return ge.push(D),te(ge)}).then(()=>($.matched.forEach(G=>G.enterCallbacks={}),ge=Az(ue,"beforeRouteEnter",$,oe,P),ge.push(D),te(ge))).then(()=>{ge=[];for(const G of a.list())ge.push(Vh(G,$,oe));return ge.push(D),te(ge)}).catch(G=>bd(G,8)?G:Promise.reject(G))}function V($,oe,ge){o.list().forEach(ve=>P(()=>ve($,oe,ge)))}function z($,oe,ge,ve,Ke){const ue=y($,oe);if(ue)return ue;const D=oe===nh,G=Gg?history.state:{};ge&&(ve||D?i.replace($.fullPath,pr({scroll:D&&G&&G.scroll},Ke)):i.push($.fullPath,Ke)),l.value=$,j($,oe,ge,D),ne()}let k;function N(){k||(k=i.listen(($,oe,ge)=>{if(!fe.listening)return;const ve=g($),Ke=M(ve);if(Ke){E(pr(Ke,{replace:!0,force:!0}),ve).catch(Y3);return}u=ve;const ue=l.value;Gg&&Xwe(oF(ue.fullPath,ge.delta),aV()),R(ve,ue).catch(D=>bd(D,12)?D:bd(D,2)?(E(pr(b(D.to),{force:!0}),ve).then(G=>{bd(G,20)&&!ge.delta&&ge.type===Jx.pop&&i.go(-1,!1)}).catch(Y3),Promise.reject()):(ge.delta&&i.go(-ge.delta,!1),J(D,ve,ue))).then(D=>{D=D||z(ve,ue,!1),D&&(ge.delta&&!bd(D,8)?i.go(-ge.delta,!1):ge.type===Jx.pop&&bd(D,20)&&i.go(-1,!1)),V(ve,ue,D)}).catch(Y3)}))}let q=vS(),L=vS(),A;function J($,oe,ge){ne($);const ve=L.list();return ve.length?ve.forEach(Ke=>Ke($,oe,ge)):console.error($),Promise.reject($)}function F(){return A&&l.value!==nh?Promise.resolve():new Promise(($,oe)=>{q.add([$,oe])})}function ne($){return A||(A=!$,N(),q.list().forEach(([oe,ge])=>$?ge($):oe()),q.reset()),$}function j($,oe,ge,ve){const{scrollBehavior:Ke}=t;if(!Gg||!Ke)return Promise.resolve();const ue=!ge&&Cwe(oF($.fullPath,0))||(ve||!ge)&&history.state&&history.state.scroll||null;return Ia().then(()=>Ke($,oe,ue)).then(D=>D&&Lwe(D)).catch(D=>J(D,$,oe))}const Z=$=>i.go($);let _;const le=new Set,fe={currentRoute:l,listening:!0,addRoute:h,removeRoute:p,clearRoutes:e.clearRoutes,hasRoute:v,getRoutes:m,resolve:g,options:t,push:x,replace:T,go:Z,back:()=>Z(-1),forward:()=>Z(1),beforeEach:s.add,beforeResolve:a.add,afterEach:o.add,onError:L.add,isReady:F,install($){const oe=this;$.component("RouterLink",o2e),$.component("RouterView",d2e),$.config.globalProperties.$router=oe,Object.defineProperty($.config.globalProperties,"$route",{enumerable:!0,get:()=>Ls(l)}),Gg&&!_&&l.value===nh&&(_=!0,x(i.location).catch(Ke=>{}));const ge={};for(const Ke in nh)Object.defineProperty(ge,Ke,{get:()=>l.value[Ke],enumerable:!0});$.provide(hC,oe),$.provide(pC,JX(ge)),$.provide(NN,l);const ve=$.unmount;le.add($),$.unmount=function(){le.delete($),le.size<1&&(u=nh,k&&k(),k=null,l.value=nh,_=!1,A=!1),ve()}}};function te($){return $.reduce((oe,ge)=>oe.then(()=>P(ge)),Promise.resolve())}return fe}function h2e(t,e){const n=[],r=[],i=[],s=Math.max(e.matched.length,t.matched.length);for(let a=0;anb(u,o))?r.push(o):n.push(o));const l=t.matched[a];l&&(e.matched.find(u=>nb(u,l))||i.push(l))}return[n,r,i]}function p2e(t){return cr(pC)}const aae=Object.prototype.toString;function oae(t){switch(aae.call(t)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return vf(t,Error)}}function ty(t,e){return aae.call(t)===`[object ${e}]`}function mC(t){return ty(t,"ErrorEvent")}function TF(t){return ty(t,"DOMError")}function m2e(t){return ty(t,"DOMException")}function Dc(t){return ty(t,"String")}function vC(t){return typeof t=="object"&&t!==null&&"__sentry_template_string__"in t&&"__sentry_template_values__"in t}function gC(t){return t===null||vC(t)||typeof t!="object"&&typeof t!="function"}function ib(t){return ty(t,"Object")}function oV(t){return typeof Event<"u"&&vf(t,Event)}function v2e(t){return typeof Element<"u"&&vf(t,Element)}function g2e(t){return ty(t,"RegExp")}function lV(t){return!!(t&&t.then&&typeof t.then=="function")}function b2e(t){return ib(t)&&"nativeEvent"in t&&"preventDefault"in t&&"stopPropagation"in t}function lae(t){return typeof t=="number"&&t!==t}function vf(t,e){try{return t instanceof e}catch{return!1}}function uae(t){return!!(typeof t=="object"&&t!==null&&(t.__isVue||t._isVue))}function O1(t,e=0){return typeof t!="string"||e===0||t.length<=e?t:`${t.slice(0,e)}...`}function wF(t,e){if(!Array.isArray(t))return"";const n=[];for(let r=0;ry2e(t,r,n))}function S2e(t,e,n=250,r,i,s,a){if(!s.exception||!s.exception.values||!a||!vf(a.originalException,Error))return;const o=s.exception.values.length>0?s.exception.values[s.exception.values.length-1]:void 0;o&&(s.exception.values=x2e(LN(t,e,i,a.originalException,r,s.exception.values,o,0),n))}function LN(t,e,n,r,i,s,a,o){if(s.length>=n+1)return s;let l=[...s];if(vf(r[i],Error)){EF(a,o);const u=t(e,r[i]),c=l.length;MF(u,i,c,o),l=LN(t,e,n,r[i],i,[u,...l],u,c)}return Array.isArray(r.errors)&&r.errors.forEach((u,c)=>{if(vf(u,Error)){EF(a,o);const d=t(e,u),f=l.length;MF(d,`errors[${c}]`,f,o),l=LN(t,e,n,u,i,[d,...l],d,f)}}),l}function EF(t,e){t.mechanism=t.mechanism||{type:"generic",handled:!0},t.mechanism={...t.mechanism,...t.type==="AggregateError"&&{is_exception_group:!0},exception_id:e}}function MF(t,e,n,r){t.mechanism=t.mechanism||{type:"generic",handled:!0},t.mechanism={...t.mechanism,type:"chained",source:e,exception_id:n,parent_id:r}}function x2e(t,e){return t.map(n=>(n.value&&(n.value=O1(n.value,e)),n))}function _w(t){return t&&t.Math==Math?t:void 0}const Gn=typeof globalThis=="object"&&_w(globalThis)||typeof window=="object"&&_w(window)||typeof self=="object"&&_w(self)||typeof global=="object"&&_w(global)||function(){return this}()||{};function bC(){return Gn}function cae(t,e,n){const r=n||Gn,i=r.__SENTRY__=r.__SENTRY__||{};return i[t]||(i[t]=e())}const I1=bC(),T2e=80;function zp(t,e={}){if(!t)return"";try{let n=t;const r=5,i=[];let s=0,a=0;const o=" > ",l=o.length;let u;const c=Array.isArray(e)?e:e.keyAttrs,d=!Array.isArray(e)&&e.maxStringLength||T2e;for(;n&&s++1&&a+i.length*l+u.length>=d));)i.push(u),a+=u.length,n=n.parentNode;return i.reverse().join(o)}catch{return""}}function w2e(t,e){const n=t,r=[];let i,s,a,o,l;if(!n||!n.tagName)return"";if(I1.HTMLElement&&n instanceof HTMLElement&&n.dataset&&n.dataset.sentryComponent)return n.dataset.sentryComponent;r.push(n.tagName.toLowerCase());const u=e&&e.length?e.filter(d=>n.getAttribute(d)).map(d=>[d,n.getAttribute(d)]):null;if(u&&u.length)u.forEach(d=>{r.push(`[${d[0]}="${d[1]}"]`)});else if(n.id&&r.push(`#${n.id}`),i=n.className,i&&Dc(i))for(s=i.split(/\s+/),l=0;l"u"||__SENTRY_DEBUG__,P2e="Sentry Logger ",XN=["debug","info","warn","error","log","assert","trace"],CM={};function Qc(t){if(!("console"in Gn))return t();const e=Gn.console,n={},r=Object.keys(CM);r.forEach(i=>{const s=CM[i];n[i]=e[i],e[i]=s});try{return t()}finally{r.forEach(i=>{e[i]=n[i]})}}function R2e(){let t=!1;const e={enable:()=>{t=!0},disable:()=>{t=!1},isEnabled:()=>t};return ry?XN.forEach(n=>{e[n]=(...r)=>{t&&Qc(()=>{Gn.console[n](`${P2e}[${n}]:`,...r)})}}):XN.forEach(n=>{e[n]=()=>{}}),e}const He=R2e(),V2e=/^(?:(\w+):)\/\/(?:(\w+)(?::(\w+)?)?@)([\w.-]+)(?::(\d+))?\/(.+)/;function z2e(t){return t==="http"||t==="https"}function iy(t,e=!1){const{host:n,path:r,pass:i,port:s,projectId:a,protocol:o,publicKey:l}=t;return`${o}://${l}${e&&i?`:${i}`:""}@${n}${s?`:${s}`:""}/${r&&`${r}/`}${a}`}function k2e(t){const e=V2e.exec(t);if(!e){Qc(()=>{console.error(`Invalid Sentry Dsn: ${t}`)});return}const[n,r,i="",s,a="",o]=e.slice(1);let l="",u=o;const c=u.split("/");if(c.length>1&&(l=c.slice(0,-1).join("/"),u=c.pop()),u){const d=u.match(/^\d+/);d&&(u=d[0])}return fae({host:s,pass:i,path:l,projectId:u,port:a,protocol:n,publicKey:r})}function fae(t){return{protocol:t.protocol,publicKey:t.publicKey||"",pass:t.pass||"",host:t.host,port:t.port||"",path:t.path||"",projectId:t.projectId}}function O2e(t){if(!ry)return!0;const{port:e,projectId:n,protocol:r}=t;return["protocol","publicKey","host","projectId"].find(a=>t[a]?!1:(He.error(`Invalid Sentry Dsn: ${a} missing`),!0))?!1:n.match(/^\d+$/)?z2e(r)?e&&isNaN(parseInt(e,10))?(He.error(`Invalid Sentry Dsn: Invalid port ${e}`),!1):!0:(He.error(`Invalid Sentry Dsn: Invalid protocol ${r}`),!1):(He.error(`Invalid Sentry Dsn: Invalid projectId ${n}`),!1)}function I2e(t){const e=typeof t=="string"?k2e(t):fae(t);if(!(!e||!O2e(e)))return e}class Uc extends Error{constructor(e,n="warn"){super(e),this.message=e,this.name=new.target.prototype.constructor.name,Object.setPrototypeOf(this,new.target.prototype),this.logLevel=n}}function Cs(t,e,n){if(!(e in t))return;const r=t[e],i=n(r);typeof i=="function"&&hae(i,r),t[e]=i}function Kv(t,e,n){try{Object.defineProperty(t,e,{value:n,writable:!0,configurable:!0})}catch{ry&&He.log(`Failed to add non-enumerable property "${e}" to object`,t)}}function hae(t,e){try{const n=e.prototype||{};t.prototype=e.prototype=n,Kv(t,"__sentry_original__",e)}catch{}}function yC(t){return t.__sentry_original__}function U2e(t){return Object.keys(t).map(e=>`${encodeURIComponent(e)}=${encodeURIComponent(t[e])}`).join("&")}function pae(t){if(oae(t))return{message:t.message,name:t.name,stack:t.stack,...RF(t)};if(oV(t)){const e={type:t.type,target:PF(t.target),currentTarget:PF(t.currentTarget),...RF(t)};return typeof CustomEvent<"u"&&vf(t,CustomEvent)&&(e.detail=t.detail),e}else return t}function PF(t){try{return v2e(t)?zp(t):Object.prototype.toString.call(t)}catch{return""}}function RF(t){if(typeof t=="object"&&t!==null){const e={};for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}else return{}}function N2e(t,e=40){const n=Object.keys(pae(t));if(n.sort(),!n.length)return"[object has no keys]";if(n[0].length>=e)return O1(n[0],e);for(let r=n.length;r>0;r--){const i=n.slice(0,r).join(", ");if(!(i.length>e))return r===n.length?i:O1(i,e)}return""}function to(t){return CN(t,new Map)}function CN(t,e){if(L2e(t)){const n=e.get(t);if(n!==void 0)return n;const r={};e.set(t,r);for(const i of Object.keys(t))typeof t[i]<"u"&&(r[i]=CN(t[i],e));return r}if(Array.isArray(t)){const n=e.get(t);if(n!==void 0)return n;const r=[];return e.set(t,r),t.forEach(i=>{r.push(CN(i,e))}),r}return t}function L2e(t){if(!ib(t))return!1;try{const e=Object.getPrototypeOf(t).constructor.name;return!e||e==="Object"}catch{return!0}}const mae=50,VF=/\(error: (.*)\)/,zF=/captureMessage|captureException/;function vae(...t){const e=t.sort((n,r)=>n[0]-r[0]).map(n=>n[1]);return(n,r=0)=>{const i=[],s=n.split(` +`);for(let a=r;a1024)continue;const l=VF.test(o)?o.replace(VF,"$1"):o;if(!l.match(/\S*Error: /)){for(const u of e){const c=u(l);if(c){i.push(c);break}}if(i.length>=mae)break}}return C2e(i)}}function X2e(t){return Array.isArray(t)?vae(...t):t}function C2e(t){if(!t.length)return[];const e=Array.from(t);return/sentryWrapped/.test(e[e.length-1].function||"")&&e.pop(),e.reverse(),zF.test(e[e.length-1].function||"")&&(e.pop(),zF.test(e[e.length-1].function||"")&&e.pop()),e.slice(0,mae).map(n=>({...n,filename:n.filename||e[e.length-1].filename,function:n.function||"?"}))}const Gz="";function gf(t){try{return!t||typeof t!="function"?Gz:t.name||Gz}catch{return Gz}}const v7={},kF={};function p0(t,e){v7[t]=v7[t]||[],v7[t].push(e)}function m0(t,e){kF[t]||(e(),kF[t]=!0)}function Uu(t,e){const n=t&&v7[t];if(n)for(const r of n)try{r(e)}catch(i){ry&&He.error(`Error while triggering instrumentation handler. Type: ${t} Name: ${gf(r)} -Error:`,i)}}function C2e(t){const e="console";p0(e,t),m0(e,K2e)}function K2e(){"console"in Gn&&XN.forEach(function(t){t in Gn.console&&Cs(Gn.console,t,function(e){return KM[t]=e,function(...n){Uu("console",{args:n,level:t});const i=KM[t];i&&i.apply(Gn.console,n)}})})}function Ci(){const t=Gn,e=t.crypto||t.msCrypto;let n=()=>Math.random()*16;try{if(e&&e.randomUUID)return e.randomUUID().replace(/-/g,"");e&&e.getRandomValues&&(n=()=>{const r=new Uint8Array(1);return e.getRandomValues(r),r[0]})}catch{}return([1e7]+1e3+4e3+8e3+1e11).replace(/[018]/g,r=>(r^(n()&15)>>r/4).toString(16))}function bae(t){return t.exception&&t.exception.values?t.exception.values[0]:void 0}function Kh(t){const{message:e,event_id:n}=t;if(e)return e;const r=bae(t);return r?r.type&&r.value?`${r.type}: ${r.value}`:r.type||r.value||n||"":n||""}function KN(t,e,n){const r=t.exception=t.exception||{},i=r.values=r.values||[],s=i[0]=i[0]||{};s.value||(s.value=e||""),s.type||(s.type=n||"Error")}function Bx(t,e){const n=bae(t);if(!n)return;const r={type:"generic",handled:!0},i=n.mechanism;if(n.mechanism={...r,...i,...e},e&&"data"in e){const s={...i&&i.data,...e.data};n.mechanism.data=s}}function UF(t){if(t&&t.__sentry_captured__)return!0;try{Kv(t,"__sentry_captured__",!0)}catch{}return!1}function yC(t){return Array.isArray(t)?t:[t]}const Fg=Gn,q2e=1e3;let NF,qN,DN;function yae(t){const e="dom";p0(e,t),m0(e,D2e)}function D2e(){if(!Fg.document)return;const t=Uu.bind(null,"dom"),e=LF(t,!0);Fg.document.addEventListener("click",e,!1),Fg.document.addEventListener("keypress",e,!1),["EventTarget","Node"].forEach(n=>{const r=Fg[n]&&Fg[n].prototype;!r||!r.hasOwnProperty||!r.hasOwnProperty("addEventListener")||(Cs(r,"addEventListener",function(i){return function(s,a,o){if(s==="click"||s=="keypress")try{const l=this,u=l.__sentry_instrumentation_handlers__=l.__sentry_instrumentation_handlers__||{},c=u[s]=u[s]||{refCount:0};if(!c.handler){const d=LF(t);c.handler=d,i.call(this,s,d,o)}c.refCount++}catch{}return i.call(this,s,a,o)}}),Cs(r,"removeEventListener",function(i){return function(s,a,o){if(s==="click"||s=="keypress")try{const l=this,u=l.__sentry_instrumentation_handlers__||{},c=u[s];c&&(c.refCount--,c.refCount<=0&&(i.call(this,s,c.handler,o),c.handler=void 0,delete u[s]),Object.keys(u).length===0&&delete l.__sentry_instrumentation_handlers__)}catch{}return i.call(this,s,a,o)}}))})}function W2e(t){if(t.type!==qN)return!1;try{if(!t.target||t.target._sentryId!==DN)return!1}catch{}return!0}function A2e(t,e){return t!=="keypress"?!1:!e||!e.tagName?!0:!(e.tagName==="INPUT"||e.tagName==="TEXTAREA"||e.isContentEditable)}function LF(t,e=!1){return n=>{if(!n||n._sentryCaptured)return;const r=G2e(n);if(A2e(n.type,r))return;Kv(n,"_sentryCaptured",!0),r&&!r._sentryId&&Kv(r,"_sentryId",Ci());const i=n.type==="keypress"?"input":n.type;W2e(n)||(t({event:n,name:i,global:e}),qN=n.type,DN=r?r._sentryId:void 0),clearTimeout(NF),NF=Fg.setTimeout(()=>{DN=void 0,qN=void 0},q2e)}}function G2e(t){try{return t.target}catch{return null}}const WN=gC();function Sae(){if(!("fetch"in WN))return!1;try{return new Headers,new Request("http://www.example.com"),new Response,!0}catch{return!1}}function AN(t){return t&&/^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(t.toString())}function F2e(){if(typeof EdgeRuntime=="string")return!0;if(!Sae())return!1;if(AN(WN.fetch))return!0;let t=!1;const e=WN.document;if(e&&typeof e.createElement=="function")try{const n=e.createElement("iframe");n.hidden=!0,e.head.appendChild(n),n.contentWindow&&n.contentWindow.fetch&&(t=AN(n.contentWindow.fetch)),e.head.removeChild(n)}catch(n){ry&&He.warn("Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ",n)}return t}function SC(t){const e="fetch";p0(e,t),m0(e,j2e)}function j2e(){F2e()&&Cs(Gn,"fetch",function(t){return function(...e){const{method:n,url:r}=Z2e(e),i={args:e,fetchData:{method:n,url:r},startTimestamp:Date.now()};return Uu("fetch",{...i}),t.apply(Gn,e).then(s=>{const a={...i,endTimestamp:Date.now(),response:s};return Uu("fetch",a),s},s=>{const a={...i,endTimestamp:Date.now(),error:s};throw Uu("fetch",a),s})}})}function GN(t,e){return!!t&&typeof t=="object"&&!!t[e]}function XF(t){return typeof t=="string"?t:t?GN(t,"url")?t.url:t.toString?t.toString():"":""}function Z2e(t){if(t.length===0)return{method:"GET",url:""};if(t.length===2){const[n,r]=t;return{url:XF(n),method:GN(r,"method")?String(r.method).toUpperCase():"GET"}}const e=t[0];return{url:XF(e),method:GN(e,"method")?String(e.method).toUpperCase():"GET"}}let $w=null;function xae(t){const e="error";p0(e,t),m0(e,J2e)}function J2e(){$w=Gn.onerror,Gn.onerror=function(t,e,n,r,i){return Uu("error",{column:r,error:i,line:n,msg:t,url:e}),$w&&!$w.__SENTRY_LOADER__?$w.apply(this,arguments):!1},Gn.onerror.__SENTRY_INSTRUMENTED__=!0}let e2=null;function Tae(t){const e="unhandledrejection";p0(e,t),m0(e,Y2e)}function Y2e(){e2=Gn.onunhandledrejection,Gn.onunhandledrejection=function(t){return Uu("unhandledrejection",t),e2&&!e2.__SENTRY_LOADER__?e2.apply(this,arguments):!0},Gn.onunhandledrejection.__SENTRY_INSTRUMENTED__=!0}const t2=gC();function B2e(){const t=t2.chrome,e=t&&t.app&&t.app.runtime,n="history"in t2&&!!t2.history.pushState&&!!t2.history.replaceState;return!e&&n}const bS=Gn;let n2;function uV(t){const e="history";p0(e,t),m0(e,H2e)}function H2e(){if(!B2e())return;const t=bS.onpopstate;bS.onpopstate=function(...n){const r=bS.location.href,i=n2;if(n2=r,Uu("history",{from:i,to:r}),t)try{return t.apply(this,n)}catch{}};function e(n){return function(...r){const i=r.length>2?r[2]:void 0;if(i){const s=n2,a=String(i);n2=a,Uu("history",{from:s,to:a})}return n.apply(this,r)}}Cs(bS.history,"pushState",e),Cs(bS.history,"replaceState",e)}const Q2e=Gn,jh="__sentry_xhr_v3__";function xC(t){const e="xhr";p0(e,t),m0(e,_2e)}function _2e(){if(!Q2e.XMLHttpRequest)return;const t=XMLHttpRequest.prototype;Cs(t,"open",function(e){return function(...n){const r=Date.now(),i=Dc(n[0])?n[0].toUpperCase():void 0,s=$2e(n[1]);if(!i||!s)return e.apply(this,n);this[jh]={method:i,url:s,request_headers:{}},i==="POST"&&s.match(/sentry_key/)&&(this.__sentry_own_request__=!0);const a=()=>{const o=this[jh];if(o&&this.readyState===4){try{o.status_code=this.status}catch{}const l={args:[i,s],endTimestamp:Date.now(),startTimestamp:r,xhr:this};Uu("xhr",l)}};return"onreadystatechange"in this&&typeof this.onreadystatechange=="function"?Cs(this,"onreadystatechange",function(o){return function(...l){return a(),o.apply(this,l)}}):this.addEventListener("readystatechange",a),Cs(this,"setRequestHeader",function(o){return function(...l){const[u,c]=l,d=this[jh];return d&&Dc(u)&&Dc(c)&&(d.request_headers[u.toLowerCase()]=c),o.apply(this,l)}}),e.apply(this,n)}}),Cs(t,"send",function(e){return function(...n){const r=this[jh];if(!r)return e.apply(this,n);n[0]!==void 0&&(r.body=n[0]);const i={args:[r.method,r.url],startTimestamp:Date.now(),xhr:this};return Uu("xhr",i),e.apply(this,n)}})}function $2e(t){if(Dc(t))return t;try{return t.toString()}catch{}}function e5e(){return typeof __SENTRY_BROWSER_BUNDLE__<"u"&&!!__SENTRY_BROWSER_BUNDLE__}function t5e(){return"npm"}function n5e(){return!e5e()&&Object.prototype.toString.call(typeof process<"u"?process:0)==="[object process]"}function CF(){return typeof window<"u"&&(!n5e()||r5e())}function r5e(){return Gn.process!==void 0&&Gn.process.type==="renderer"}function i5e(){const t=typeof WeakSet=="function",e=t?new WeakSet:[];function n(i){if(t)return e.has(i)?!0:(e.add(i),!1);for(let s=0;sn?wae(t,e-1,n):r}function FN(t,e,n=1/0,r=1/0,i=i5e()){const[s,a]=i;if(e==null||["number","boolean","string"].includes(typeof e)&&!uae(e))return e;const o=s5e(t,e);if(!o.startsWith("[object "))return o;if(e.__sentry_skip_normalization__)return e;const l=typeof e.__sentry_override_normalization_depth__=="number"?e.__sentry_override_normalization_depth__:n;if(l===0)return o.replace("object ","");if(s(e))return"[Circular ~]";const u=e;if(u&&typeof u.toJSON=="function")try{const h=u.toJSON();return FN("",h,l-1,r,i)}catch{}const c=Array.isArray(e)?[]:{};let d=0;const f=mae(e);for(const h in f){if(!Object.prototype.hasOwnProperty.call(f,h))continue;if(d>=r){c[h]="[MaxProperties ~]";break}const p=f[h];c[h]=FN(h,p,l-1,r,i),d++}return a(e),c}function s5e(t,e){try{if(t==="domain"&&e&&typeof e=="object"&&e._events)return"[Domain]";if(t==="domainEmitter")return"[DomainEmitter]";if(typeof global<"u"&&e===global)return"[Global]";if(typeof window<"u"&&e===window)return"[Window]";if(typeof document<"u"&&e===document)return"[Document]";if(cae(e))return"[VueViewModel]";if(g2e(e))return"[SyntheticEvent]";if(typeof e=="number"&&e!==e)return"[NaN]";if(typeof e=="function")return`[Function: ${gf(e)}]`;if(typeof e=="symbol")return`[${String(e)}]`;if(typeof e=="bigint")return`[BigInt: ${String(e)}]`;const n=a5e(e);return/^HTML(\w*)Element$/.test(n)?`[HTMLElement: ${n}]`:`[object ${n}]`}catch(n){return`**non-serializable** (${n})`}}function a5e(t){const e=Object.getPrototypeOf(t);return e?e.constructor.name:"null prototype"}function o5e(t){return~-encodeURI(t).split(/%..|./).length}function l5e(t){return o5e(JSON.stringify(t))}var qd;(function(t){t[t.PENDING=0]="PENDING";const n=1;t[t.RESOLVED=n]="RESOLVED";const r=2;t[t.REJECTED=r]="REJECTED"})(qd||(qd={}));function sb(t){return new sl(e=>{e(t)})}function TC(t){return new sl((e,n)=>{n(t)})}class sl{constructor(e){sl.prototype.__init.call(this),sl.prototype.__init2.call(this),sl.prototype.__init3.call(this),sl.prototype.__init4.call(this),this._state=qd.PENDING,this._handlers=[];try{e(this._resolve,this._reject)}catch(n){this._reject(n)}}then(e,n){return new sl((r,i)=>{this._handlers.push([!1,s=>{if(!e)r(s);else try{r(e(s))}catch(a){i(a)}},s=>{if(!n)i(s);else try{r(n(s))}catch(a){i(a)}}]),this._executeHandlers()})}catch(e){return this.then(n=>n,e)}finally(e){return new sl((n,r)=>{let i,s;return this.then(a=>{s=!1,i=a,e&&e()},a=>{s=!0,i=a,e&&e()}).then(()=>{if(s){r(i);return}n(i)})})}__init(){this._resolve=e=>{this._setResult(qd.RESOLVED,e)}}__init2(){this._reject=e=>{this._setResult(qd.REJECTED,e)}}__init3(){this._setResult=(e,n)=>{if(this._state===qd.PENDING){if(lV(n)){n.then(this._resolve,this._reject);return}this._state=e,this._value=n,this._executeHandlers()}}}__init4(){this._executeHandlers=()=>{if(this._state===qd.PENDING)return;const e=this._handlers.slice();this._handlers=[],e.forEach(n=>{n[0]||(this._state===qd.RESOLVED&&n[1](this._value),this._state===qd.REJECTED&&n[2](this._value),n[0]=!0)})}}}function u5e(t){const e=[];function n(){return t===void 0||e.lengthr(o)).then(null,()=>r(o).then(null,()=>{})),o}function s(a){return new sl((o,l)=>{let u=e.length;if(!u)return o(!0);const c=setTimeout(()=>{a&&a>0&&o(!1)},a);e.forEach(d=>{sb(d).then(()=>{--u||(clearTimeout(c),o(!0))},l)})})}return{$:e,add:i,drain:s}}function Ev(t){if(!t)return{};const e=t.match(/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);if(!e)return{};const n=e[6]||"",r=e[8]||"";return{host:e[4],path:e[5],protocol:e[2],search:n,hash:r,relative:e[5]+n+r}}const c5e=["fatal","error","warning","log","info","debug"];function d5e(t){return t==="warn"?"warning":c5e.includes(t)?t:"log"}const Eae=1e3;function aT(){return Date.now()/Eae}function f5e(){const{performance:t}=Gn;if(!t||!t.now)return aT;const e=Date.now()-t.now(),n=t.timeOrigin==null?e:t.timeOrigin;return()=>(n+t.now())/Eae}const sy=f5e(),bl=(()=>{const{performance:t}=Gn;if(!t||!t.now)return;const e=3600*1e3,n=t.now(),r=Date.now(),i=t.timeOrigin?Math.abs(t.timeOrigin+n-r):e,s=i{const s=KF(i);for(const a of Object.keys(s))r[a]=s[a];return r},{});else{if(!t)return;e=KF(t)}const n=Object.entries(e).reduce((r,[i,s])=>{if(i.match(h5e)){const a=i.slice(Mae.length);r[a]=s}return r},{});if(Object.keys(n).length>0)return n}function Pae(t){if(!t)return;const e=Object.entries(t).reduce((n,[r,i])=>(i&&(n[`${Mae}${r}`]=i),n),{});return v5e(e)}function KF(t){return t.split(",").map(e=>e.split("=").map(n=>decodeURIComponent(n.trim()))).reduce((e,[n,r])=>(e[n]=r,e),{})}function v5e(t){if(Object.keys(t).length!==0)return Object.entries(t).reduce((e,[n,r],i)=>{const s=`${encodeURIComponent(n)}=${encodeURIComponent(r)}`,a=i===0?s:`${e},${s}`;return a.length>p5e?(ry&&He.warn(`Not adding key: ${n} with val: ${r} to baggage header due to exceeding baggage size limits.`),e):a},"")}const g5e=new RegExp("^[ \\t]*([0-9a-f]{32})?-?([0-9a-f]{16})?-?([01])?[ \\t]*$");function b5e(t){if(!t)return;const e=t.match(g5e);if(!e)return;let n;return e[3]==="1"?n=!0:e[3]==="0"&&(n=!1),{traceId:e[1],parentSampled:n,parentSpanId:e[2]}}function y5e(t,e){const n=b5e(t),r=m5e(e),{traceId:i,parentSpanId:s,parentSampled:a}=n||{};return n?{traceId:i||Ci(),parentSpanId:s||Ci().substring(16),spanId:Ci().substring(16),sampled:a,dsc:r||{}}:{traceId:i||Ci(),spanId:Ci().substring(16)}}function wC(t=Ci(),e=Ci().substring(16),n){let r="";return n!==void 0&&(r=n?"-1":"-0"),`${t}-${e}${r}`}function Hp(t,e=[]){return[t,e]}function S5e(t,e){const[n,r]=t;return[n,[...r,e]]}function qF(t,e){const n=t[1];for(const r of n){const i=r[0].type;if(e(r,i))return!0}return!1}function ZN(t,e){return(e||new TextEncoder).encode(t)}function x5e(t,e){const[n,r]=t;let i=JSON.stringify(n);function s(a){typeof i=="string"?i=typeof a=="string"?i+a:[ZN(i,e),a]:i.push(typeof a=="string"?ZN(a,e):a)}for(const a of r){const[o,l]=a;if(s(` +Error:`,i)}}function K2e(t){const e="console";p0(e,t),m0(e,q2e)}function q2e(){"console"in Gn&&XN.forEach(function(t){t in Gn.console&&Cs(Gn.console,t,function(e){return CM[t]=e,function(...n){Uu("console",{args:n,level:t});const i=CM[t];i&&i.apply(Gn.console,n)}})})}function Ci(){const t=Gn,e=t.crypto||t.msCrypto;let n=()=>Math.random()*16;try{if(e&&e.randomUUID)return e.randomUUID().replace(/-/g,"");e&&e.getRandomValues&&(n=()=>{const r=new Uint8Array(1);return e.getRandomValues(r),r[0]})}catch{}return([1e7]+1e3+4e3+8e3+1e11).replace(/[018]/g,r=>(r^(n()&15)>>r/4).toString(16))}function gae(t){return t.exception&&t.exception.values?t.exception.values[0]:void 0}function Kh(t){const{message:e,event_id:n}=t;if(e)return e;const r=gae(t);return r?r.type&&r.value?`${r.type}: ${r.value}`:r.type||r.value||n||"":n||""}function KN(t,e,n){const r=t.exception=t.exception||{},i=r.values=r.values||[],s=i[0]=i[0]||{};s.value||(s.value=e||""),s.type||(s.type=n||"Error")}function Yx(t,e){const n=gae(t);if(!n)return;const r={type:"generic",handled:!0},i=n.mechanism;if(n.mechanism={...r,...i,...e},e&&"data"in e){const s={...i&&i.data,...e.data};n.mechanism.data=s}}function OF(t){if(t&&t.__sentry_captured__)return!0;try{Kv(t,"__sentry_captured__",!0)}catch{}return!1}function SC(t){return Array.isArray(t)?t:[t]}const Fg=Gn,D2e=1e3;let IF,qN,DN;function bae(t){const e="dom";p0(e,t),m0(e,W2e)}function W2e(){if(!Fg.document)return;const t=Uu.bind(null,"dom"),e=UF(t,!0);Fg.document.addEventListener("click",e,!1),Fg.document.addEventListener("keypress",e,!1),["EventTarget","Node"].forEach(n=>{const r=Fg[n]&&Fg[n].prototype;!r||!r.hasOwnProperty||!r.hasOwnProperty("addEventListener")||(Cs(r,"addEventListener",function(i){return function(s,a,o){if(s==="click"||s=="keypress")try{const l=this,u=l.__sentry_instrumentation_handlers__=l.__sentry_instrumentation_handlers__||{},c=u[s]=u[s]||{refCount:0};if(!c.handler){const d=UF(t);c.handler=d,i.call(this,s,d,o)}c.refCount++}catch{}return i.call(this,s,a,o)}}),Cs(r,"removeEventListener",function(i){return function(s,a,o){if(s==="click"||s=="keypress")try{const l=this,u=l.__sentry_instrumentation_handlers__||{},c=u[s];c&&(c.refCount--,c.refCount<=0&&(i.call(this,s,c.handler,o),c.handler=void 0,delete u[s]),Object.keys(u).length===0&&delete l.__sentry_instrumentation_handlers__)}catch{}return i.call(this,s,a,o)}}))})}function A2e(t){if(t.type!==qN)return!1;try{if(!t.target||t.target._sentryId!==DN)return!1}catch{}return!0}function G2e(t,e){return t!=="keypress"?!1:!e||!e.tagName?!0:!(e.tagName==="INPUT"||e.tagName==="TEXTAREA"||e.isContentEditable)}function UF(t,e=!1){return n=>{if(!n||n._sentryCaptured)return;const r=F2e(n);if(G2e(n.type,r))return;Kv(n,"_sentryCaptured",!0),r&&!r._sentryId&&Kv(r,"_sentryId",Ci());const i=n.type==="keypress"?"input":n.type;A2e(n)||(t({event:n,name:i,global:e}),qN=n.type,DN=r?r._sentryId:void 0),clearTimeout(IF),IF=Fg.setTimeout(()=>{DN=void 0,qN=void 0},D2e)}}function F2e(t){try{return t.target}catch{return null}}const WN=bC();function yae(){if(!("fetch"in WN))return!1;try{return new Headers,new Request("http://www.example.com"),new Response,!0}catch{return!1}}function AN(t){return t&&/^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(t.toString())}function j2e(){if(typeof EdgeRuntime=="string")return!0;if(!yae())return!1;if(AN(WN.fetch))return!0;let t=!1;const e=WN.document;if(e&&typeof e.createElement=="function")try{const n=e.createElement("iframe");n.hidden=!0,e.head.appendChild(n),n.contentWindow&&n.contentWindow.fetch&&(t=AN(n.contentWindow.fetch)),e.head.removeChild(n)}catch(n){ry&&He.warn("Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ",n)}return t}function xC(t){const e="fetch";p0(e,t),m0(e,Z2e)}function Z2e(){j2e()&&Cs(Gn,"fetch",function(t){return function(...e){const{method:n,url:r}=J2e(e),i={args:e,fetchData:{method:n,url:r},startTimestamp:Date.now()};return Uu("fetch",{...i}),t.apply(Gn,e).then(s=>{const a={...i,endTimestamp:Date.now(),response:s};return Uu("fetch",a),s},s=>{const a={...i,endTimestamp:Date.now(),error:s};throw Uu("fetch",a),s})}})}function GN(t,e){return!!t&&typeof t=="object"&&!!t[e]}function NF(t){return typeof t=="string"?t:t?GN(t,"url")?t.url:t.toString?t.toString():"":""}function J2e(t){if(t.length===0)return{method:"GET",url:""};if(t.length===2){const[n,r]=t;return{url:NF(n),method:GN(r,"method")?String(r.method).toUpperCase():"GET"}}const e=t[0];return{url:NF(e),method:GN(e,"method")?String(e.method).toUpperCase():"GET"}}let $w=null;function Sae(t){const e="error";p0(e,t),m0(e,Y2e)}function Y2e(){$w=Gn.onerror,Gn.onerror=function(t,e,n,r,i){return Uu("error",{column:r,error:i,line:n,msg:t,url:e}),$w&&!$w.__SENTRY_LOADER__?$w.apply(this,arguments):!1},Gn.onerror.__SENTRY_INSTRUMENTED__=!0}let e2=null;function xae(t){const e="unhandledrejection";p0(e,t),m0(e,B2e)}function B2e(){e2=Gn.onunhandledrejection,Gn.onunhandledrejection=function(t){return Uu("unhandledrejection",t),e2&&!e2.__SENTRY_LOADER__?e2.apply(this,arguments):!0},Gn.onunhandledrejection.__SENTRY_INSTRUMENTED__=!0}const t2=bC();function H2e(){const t=t2.chrome,e=t&&t.app&&t.app.runtime,n="history"in t2&&!!t2.history.pushState&&!!t2.history.replaceState;return!e&&n}const gS=Gn;let n2;function uV(t){const e="history";p0(e,t),m0(e,Q2e)}function Q2e(){if(!H2e())return;const t=gS.onpopstate;gS.onpopstate=function(...n){const r=gS.location.href,i=n2;if(n2=r,Uu("history",{from:i,to:r}),t)try{return t.apply(this,n)}catch{}};function e(n){return function(...r){const i=r.length>2?r[2]:void 0;if(i){const s=n2,a=String(i);n2=a,Uu("history",{from:s,to:a})}return n.apply(this,r)}}Cs(gS.history,"pushState",e),Cs(gS.history,"replaceState",e)}const _2e=Gn,jh="__sentry_xhr_v3__";function TC(t){const e="xhr";p0(e,t),m0(e,$2e)}function $2e(){if(!_2e.XMLHttpRequest)return;const t=XMLHttpRequest.prototype;Cs(t,"open",function(e){return function(...n){const r=Date.now(),i=Dc(n[0])?n[0].toUpperCase():void 0,s=e5e(n[1]);if(!i||!s)return e.apply(this,n);this[jh]={method:i,url:s,request_headers:{}},i==="POST"&&s.match(/sentry_key/)&&(this.__sentry_own_request__=!0);const a=()=>{const o=this[jh];if(o&&this.readyState===4){try{o.status_code=this.status}catch{}const l={args:[i,s],endTimestamp:Date.now(),startTimestamp:r,xhr:this};Uu("xhr",l)}};return"onreadystatechange"in this&&typeof this.onreadystatechange=="function"?Cs(this,"onreadystatechange",function(o){return function(...l){return a(),o.apply(this,l)}}):this.addEventListener("readystatechange",a),Cs(this,"setRequestHeader",function(o){return function(...l){const[u,c]=l,d=this[jh];return d&&Dc(u)&&Dc(c)&&(d.request_headers[u.toLowerCase()]=c),o.apply(this,l)}}),e.apply(this,n)}}),Cs(t,"send",function(e){return function(...n){const r=this[jh];if(!r)return e.apply(this,n);n[0]!==void 0&&(r.body=n[0]);const i={args:[r.method,r.url],startTimestamp:Date.now(),xhr:this};return Uu("xhr",i),e.apply(this,n)}})}function e5e(t){if(Dc(t))return t;try{return t.toString()}catch{}}function t5e(){return typeof __SENTRY_BROWSER_BUNDLE__<"u"&&!!__SENTRY_BROWSER_BUNDLE__}function n5e(){return"npm"}function r5e(){return!t5e()&&Object.prototype.toString.call(typeof process<"u"?process:0)==="[object process]"}function LF(){return typeof window<"u"&&(!r5e()||i5e())}function i5e(){return Gn.process!==void 0&&Gn.process.type==="renderer"}function s5e(){const t=typeof WeakSet=="function",e=t?new WeakSet:[];function n(i){if(t)return e.has(i)?!0:(e.add(i),!1);for(let s=0;sn?Tae(t,e-1,n):r}function FN(t,e,n=1/0,r=1/0,i=s5e()){const[s,a]=i;if(e==null||["number","boolean","string"].includes(typeof e)&&!lae(e))return e;const o=a5e(t,e);if(!o.startsWith("[object "))return o;if(e.__sentry_skip_normalization__)return e;const l=typeof e.__sentry_override_normalization_depth__=="number"?e.__sentry_override_normalization_depth__:n;if(l===0)return o.replace("object ","");if(s(e))return"[Circular ~]";const u=e;if(u&&typeof u.toJSON=="function")try{const h=u.toJSON();return FN("",h,l-1,r,i)}catch{}const c=Array.isArray(e)?[]:{};let d=0;const f=pae(e);for(const h in f){if(!Object.prototype.hasOwnProperty.call(f,h))continue;if(d>=r){c[h]="[MaxProperties ~]";break}const p=f[h];c[h]=FN(h,p,l-1,r,i),d++}return a(e),c}function a5e(t,e){try{if(t==="domain"&&e&&typeof e=="object"&&e._events)return"[Domain]";if(t==="domainEmitter")return"[DomainEmitter]";if(typeof global<"u"&&e===global)return"[Global]";if(typeof window<"u"&&e===window)return"[Window]";if(typeof document<"u"&&e===document)return"[Document]";if(uae(e))return"[VueViewModel]";if(b2e(e))return"[SyntheticEvent]";if(typeof e=="number"&&e!==e)return"[NaN]";if(typeof e=="function")return`[Function: ${gf(e)}]`;if(typeof e=="symbol")return`[${String(e)}]`;if(typeof e=="bigint")return`[BigInt: ${String(e)}]`;const n=o5e(e);return/^HTML(\w*)Element$/.test(n)?`[HTMLElement: ${n}]`:`[object ${n}]`}catch(n){return`**non-serializable** (${n})`}}function o5e(t){const e=Object.getPrototypeOf(t);return e?e.constructor.name:"null prototype"}function l5e(t){return~-encodeURI(t).split(/%..|./).length}function u5e(t){return l5e(JSON.stringify(t))}var qd;(function(t){t[t.PENDING=0]="PENDING";const n=1;t[t.RESOLVED=n]="RESOLVED";const r=2;t[t.REJECTED=r]="REJECTED"})(qd||(qd={}));function sb(t){return new il(e=>{e(t)})}function wC(t){return new il((e,n)=>{n(t)})}class il{constructor(e){il.prototype.__init.call(this),il.prototype.__init2.call(this),il.prototype.__init3.call(this),il.prototype.__init4.call(this),this._state=qd.PENDING,this._handlers=[];try{e(this._resolve,this._reject)}catch(n){this._reject(n)}}then(e,n){return new il((r,i)=>{this._handlers.push([!1,s=>{if(!e)r(s);else try{r(e(s))}catch(a){i(a)}},s=>{if(!n)i(s);else try{r(n(s))}catch(a){i(a)}}]),this._executeHandlers()})}catch(e){return this.then(n=>n,e)}finally(e){return new il((n,r)=>{let i,s;return this.then(a=>{s=!1,i=a,e&&e()},a=>{s=!0,i=a,e&&e()}).then(()=>{if(s){r(i);return}n(i)})})}__init(){this._resolve=e=>{this._setResult(qd.RESOLVED,e)}}__init2(){this._reject=e=>{this._setResult(qd.REJECTED,e)}}__init3(){this._setResult=(e,n)=>{if(this._state===qd.PENDING){if(lV(n)){n.then(this._resolve,this._reject);return}this._state=e,this._value=n,this._executeHandlers()}}}__init4(){this._executeHandlers=()=>{if(this._state===qd.PENDING)return;const e=this._handlers.slice();this._handlers=[],e.forEach(n=>{n[0]||(this._state===qd.RESOLVED&&n[1](this._value),this._state===qd.REJECTED&&n[2](this._value),n[0]=!0)})}}}function c5e(t){const e=[];function n(){return t===void 0||e.lengthr(o)).then(null,()=>r(o).then(null,()=>{})),o}function s(a){return new il((o,l)=>{let u=e.length;if(!u)return o(!0);const c=setTimeout(()=>{a&&a>0&&o(!1)},a);e.forEach(d=>{sb(d).then(()=>{--u||(clearTimeout(c),o(!0))},l)})})}return{$:e,add:i,drain:s}}function Ev(t){if(!t)return{};const e=t.match(/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);if(!e)return{};const n=e[6]||"",r=e[8]||"";return{host:e[4],path:e[5],protocol:e[2],search:n,hash:r,relative:e[5]+n+r}}const d5e=["fatal","error","warning","log","info","debug"];function f5e(t){return t==="warn"?"warning":d5e.includes(t)?t:"log"}const wae=1e3;function sT(){return Date.now()/wae}function h5e(){const{performance:t}=Gn;if(!t||!t.now)return sT;const e=Date.now()-t.now(),n=t.timeOrigin==null?e:t.timeOrigin;return()=>(n+t.now())/wae}const sy=h5e(),gl=(()=>{const{performance:t}=Gn;if(!t||!t.now)return;const e=3600*1e3,n=t.now(),r=Date.now(),i=t.timeOrigin?Math.abs(t.timeOrigin+n-r):e,s=i{const s=XF(i);for(const a of Object.keys(s))r[a]=s[a];return r},{});else{if(!t)return;e=XF(t)}const n=Object.entries(e).reduce((r,[i,s])=>{if(i.match(p5e)){const a=i.slice(Eae.length);r[a]=s}return r},{});if(Object.keys(n).length>0)return n}function Mae(t){if(!t)return;const e=Object.entries(t).reduce((n,[r,i])=>(i&&(n[`${Eae}${r}`]=i),n),{});return g5e(e)}function XF(t){return t.split(",").map(e=>e.split("=").map(n=>decodeURIComponent(n.trim()))).reduce((e,[n,r])=>(e[n]=r,e),{})}function g5e(t){if(Object.keys(t).length!==0)return Object.entries(t).reduce((e,[n,r],i)=>{const s=`${encodeURIComponent(n)}=${encodeURIComponent(r)}`,a=i===0?s:`${e},${s}`;return a.length>m5e?(ry&&He.warn(`Not adding key: ${n} with val: ${r} to baggage header due to exceeding baggage size limits.`),e):a},"")}const b5e=new RegExp("^[ \\t]*([0-9a-f]{32})?-?([0-9a-f]{16})?-?([01])?[ \\t]*$");function y5e(t){if(!t)return;const e=t.match(b5e);if(!e)return;let n;return e[3]==="1"?n=!0:e[3]==="0"&&(n=!1),{traceId:e[1],parentSampled:n,parentSpanId:e[2]}}function S5e(t,e){const n=y5e(t),r=v5e(e),{traceId:i,parentSpanId:s,parentSampled:a}=n||{};return n?{traceId:i||Ci(),parentSpanId:s||Ci().substring(16),spanId:Ci().substring(16),sampled:a,dsc:r||{}}:{traceId:i||Ci(),spanId:Ci().substring(16)}}function EC(t=Ci(),e=Ci().substring(16),n){let r="";return n!==void 0&&(r=n?"-1":"-0"),`${t}-${e}${r}`}function Hp(t,e=[]){return[t,e]}function x5e(t,e){const[n,r]=t;return[n,[...r,e]]}function CF(t,e){const n=t[1];for(const r of n){const i=r[0].type;if(e(r,i))return!0}return!1}function ZN(t,e){return(e||new TextEncoder).encode(t)}function T5e(t,e){const[n,r]=t;let i=JSON.stringify(n);function s(a){typeof i=="string"?i=typeof a=="string"?i+a:[ZN(i,e),a]:i.push(typeof a=="string"?ZN(a,e):a)}for(const a of r){const[o,l]=a;if(s(` ${JSON.stringify(o)} -`),typeof l=="string"||l instanceof Uint8Array)s(l);else{let u;try{u=JSON.stringify(l)}catch{u=JSON.stringify(Rc(l))}s(u)}}return typeof i=="string"?i:T5e(i)}function T5e(t){const e=t.reduce((i,s)=>i+s.length,0),n=new Uint8Array(e);let r=0;for(const i of t)n.set(i,r),r+=i.length;return n}function w5e(t,e){const n=typeof t.data=="string"?ZN(t.data,e):t.data;return[to({type:"attachment",length:n.length,filename:t.filename,content_type:t.contentType,attachment_type:t.attachmentType}),n]}const E5e={session:"session",sessions:"session",attachment:"attachment",transaction:"transaction",event:"error",client_report:"internal",user_report:"default",profile:"profile",replay_event:"replay",replay_recording:"replay",check_in:"monitor",feedback:"feedback",span:"span",statsd:"metric_bucket"};function DF(t){return E5e[t]}function EC(t){if(!t||!t.sdk)return;const{name:e,version:n}=t.sdk;return{name:e,version:n}}function Rae(t,e,n,r){const i=t.sdkProcessingMetadata&&t.sdkProcessingMetadata.dynamicSamplingContext;return{event_id:t.event_id,sent_at:new Date().toISOString(),...e&&{sdk:e},...!!n&&r&&{dsn:iy(r)},...i&&{trace:to({...i})}}}function M5e(t,e,n){const r=[{type:"client_report"},{timestamp:n||aT(),discarded_events:t}];return Hp(e?{dsn:e}:{},[r])}const P5e=60*1e3;function R5e(t,e=Date.now()){const n=parseInt(`${t}`,10);if(!isNaN(n))return n*1e3;const r=Date.parse(`${t}`);return isNaN(r)?P5e:r-e}function V5e(t,e){return t[e]||t.all||0}function Vae(t,e,n=Date.now()){return V5e(t,e)>n}function zae(t,{statusCode:e,headers:n},r=Date.now()){const i={...t},s=n&&n["x-sentry-rate-limits"],a=n&&n["retry-after"];if(s)for(const o of s.trim().split(",")){const[l,u,,,c]=o.split(":",5),d=parseInt(l,10),f=(isNaN(d)?60:d)*1e3;if(!u)i.all=r+f;else for(const h of u.split(";"))h==="metric_bucket"?(!c||c.split(";").includes("custom"))&&(i[h]=r+f):i[h]=r+f}else a?i.all=r+R5e(a,r):e===429&&(i.all=r+60*1e3);return i}function z5e(t,e){return t??e()}function Fz(t){let e,n=t[0],r=1;for(;rn.call(e,...a)),e=void 0)}return n}const At=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,cV="production";function MC(){return dae("globalEventProcessors",()=>[])}function k5e(t){MC().push(t)}function qM(t,e,n,r=0){return new sl((i,s)=>{const a=t[r];if(e===null||typeof a!="function")i(e);else{const o=a({...e},n);At&&a.id&&o===null&&He.log(`Event processor "${a.id}" dropped event`),lV(o)?o.then(l=>qM(t,l,n,r+1).then(i)).then(null,s):qM(t,o,n,r+1).then(i).then(null,s)}})}function kae(t){const e=sy(),n={sid:Ci(),init:!0,timestamp:e,started:e,duration:0,status:"ok",errors:0,ignoreDuration:!1,toJSON:()=>O5e(n)};return t&&qv(n,t),n}function qv(t,e={}){if(e.user&&(!t.ipAddress&&e.user.ip_address&&(t.ipAddress=e.user.ip_address),!t.did&&!e.did&&(t.did=e.user.id||e.user.email||e.user.username)),t.timestamp=e.timestamp||sy(),e.abnormal_mechanism&&(t.abnormal_mechanism=e.abnormal_mechanism),e.ignoreDuration&&(t.ignoreDuration=e.ignoreDuration),e.sid&&(t.sid=e.sid.length===32?e.sid:Ci()),e.init!==void 0&&(t.init=e.init),!t.did&&e.did&&(t.did=`${e.did}`),typeof e.started=="number"&&(t.started=e.started),t.ignoreDuration)t.duration=void 0;else if(typeof e.duration=="number")t.duration=e.duration;else{const n=t.timestamp-t.started;t.duration=n>=0?n:0}e.release&&(t.release=e.release),e.environment&&(t.environment=e.environment),!t.ipAddress&&e.ipAddress&&(t.ipAddress=e.ipAddress),!t.userAgent&&e.userAgent&&(t.userAgent=e.userAgent),typeof e.errors=="number"&&(t.errors=e.errors),e.status&&(t.status=e.status)}function Oae(t,e){let n={};e?n={status:e}:t.status==="ok"&&(n={status:"exited"}),qv(t,n)}function O5e(t){return to({sid:`${t.sid}`,init:t.init,started:new Date(t.started*1e3).toISOString(),timestamp:new Date(t.timestamp*1e3).toISOString(),status:t.status,errors:t.errors,did:typeof t.did=="number"||typeof t.did=="string"?`${t.did}`:void 0,duration:t.duration,abnormal_mechanism:t.abnormal_mechanism,attrs:{release:t.release,environment:t.environment,ip_address:t.ipAddress,user_agent:t.userAgent}})}const I5e=0,Iae=1;function PC(t){const{spanId:e,traceId:n}=t.spanContext(),{data:r,op:i,parent_span_id:s,status:a,tags:o,origin:l}=As(t);return to({data:r,op:i,parent_span_id:s,span_id:e,status:a,tags:o,trace_id:n,origin:l})}function dV(t){const{traceId:e,spanId:n}=t.spanContext(),r=RC(t);return wC(e,n,r)}function fV(t){return typeof t=="number"?WF(t):Array.isArray(t)?t[0]+t[1]/1e9:t instanceof Date?WF(t.getTime()):sy()}function WF(t){return t>9999999999?t/1e3:t}function As(t){return U5e(t)?t.getSpanJSON():typeof t.toJSON=="function"?t.toJSON():{}}function U5e(t){return typeof t.getSpanJSON=="function"}function RC(t){const{traceFlags:e}=t.spanContext();return!!(e&Iae)}function Uae(t,e,n,r,i,s){const{normalizeDepth:a=3,normalizeMaxBreadth:o=1e3}=t,l={...e,event_id:e.event_id||n.event_id||Ci(),timestamp:e.timestamp||aT()},u=n.integrations||t.integrations.map(v=>v.name);N5e(l,t),C5e(l,u),e.type===void 0&&L5e(l,t.stackParser);const c=q5e(r,n.captureContext);n.mechanism&&Bx(l,n.mechanism);const d=i&&i.getEventProcessors?i.getEventProcessors():[],f=$5e().getScopeData();if(s){const v=s.getScopeData();jF(f,v)}if(c){const v=c.getScopeData();jF(f,v)}const h=[...n.attachments||[],...f.attachments];h.length&&(n.attachments=h),Cae(l,f);const p=[...d,...MC(),...f.eventProcessors];return qM(p,l,n).then(v=>(v&&X5e(v),typeof a=="number"&&a>0?K5e(v,a,o):v))}function N5e(t,e){const{environment:n,release:r,dist:i,maxValueLength:s=250}=e;"environment"in t||(t.environment="environment"in e?n:cV),t.release===void 0&&r!==void 0&&(t.release=r),t.dist===void 0&&i!==void 0&&(t.dist=i),t.message&&(t.message=O1(t.message,s));const a=t.exception&&t.exception.values&&t.exception.values[0];a&&a.value&&(a.value=O1(a.value,s));const o=t.request;o&&o.url&&(o.url=O1(o.url,s))}const AF=new WeakMap;function L5e(t,e){const n=Gn._sentryDebugIds;if(!n)return;let r;const i=AF.get(e);i?r=i:(r=new Map,AF.set(e,r));const s=Object.keys(n).reduce((a,o)=>{let l;const u=r.get(o);u?l=u:(l=e(o),r.set(o,l));for(let c=l.length-1;c>=0;c--){const d=l[c];if(d.filename){a[d.filename]=n[o];break}}return a},{});try{t.exception.values.forEach(a=>{a.stacktrace.frames.forEach(o=>{o.filename&&(o.debug_id=s[o.filename])})})}catch{}}function X5e(t){const e={};try{t.exception.values.forEach(r=>{r.stacktrace.frames.forEach(i=>{i.debug_id&&(i.abs_path?e[i.abs_path]=i.debug_id:i.filename&&(e[i.filename]=i.debug_id),delete i.debug_id)})})}catch{}if(Object.keys(e).length===0)return;t.debug_meta=t.debug_meta||{},t.debug_meta.images=t.debug_meta.images||[];const n=t.debug_meta.images;Object.keys(e).forEach(r=>{n.push({type:"sourcemap",code_file:r,debug_id:e[r]})})}function C5e(t,e){e.length>0&&(t.sdk=t.sdk||{},t.sdk.integrations=[...t.sdk.integrations||[],...e])}function K5e(t,e,n){if(!t)return null;const r={...t,...t.breadcrumbs&&{breadcrumbs:t.breadcrumbs.map(i=>({...i,...i.data&&{data:Rc(i.data,e,n)}}))},...t.user&&{user:Rc(t.user,e,n)},...t.contexts&&{contexts:Rc(t.contexts,e,n)},...t.extra&&{extra:Rc(t.extra,e,n)}};return t.contexts&&t.contexts.trace&&r.contexts&&(r.contexts.trace=t.contexts.trace,t.contexts.trace.data&&(r.contexts.trace.data=Rc(t.contexts.trace.data,e,n))),t.spans&&(r.spans=t.spans.map(i=>{const s=As(i).data;return s&&(i.data=Rc(s,e,n)),i})),r}function q5e(t,e){if(!e)return t;const n=t?t.clone():new of;return n.update(e),n}function D5e(t){if(t)return W5e(t)?{captureContext:t}:G5e(t)?{captureContext:t}:t}function W5e(t){return t instanceof of||typeof t=="function"}const A5e=["user","level","extra","contexts","tags","fingerprint","requestSession","propagationContext"];function G5e(t){return Object.keys(t).some(e=>A5e.includes(e))}function ay(t,e){return Zo().captureException(t,D5e(e))}function F5e(t,e){const n=typeof e=="string"?e:void 0,r=typeof e!="string"?{captureContext:e}:void 0;return Zo().captureMessage(t,n,r)}function Nae(t,e){return Zo().captureEvent(t,e)}function kp(t,e){Zo().addBreadcrumb(t,e)}function j5e(t,e){Zo().setContext(t,e)}function Z5e(...t){const e=Zo();if(t.length===2){const[n,r]=t;return n?e.withScope(()=>(e.getStackTop().scope=n,r(n))):e.withScope(r)}return e.withScope(t[0])}function Rr(){return Zo().getClient()}function jo(){return Zo().getScope()}function GF(t){const e=Rr(),n=Qp(),r=jo(),{release:i,environment:s=cV}=e&&e.getOptions()||{},{userAgent:a}=Gn.navigator||{},o=kae({release:i,environment:s,user:r.getUser()||n.getUser(),...a&&{userAgent:a},...t}),l=n.getSession();return l&&l.status==="ok"&&qv(l,{status:"exited"}),Lae(),n.setSession(o),r.setSession(o),o}function Lae(){const t=Qp(),e=jo(),n=e.getSession()||t.getSession();n&&Oae(n),Xae(),t.setSession(),e.setSession()}function Xae(){const t=Qp(),e=jo(),n=Rr(),r=e.getSession()||t.getSession();r&&n&&n.captureSession&&n.captureSession(r)}function FF(t=!1){if(t){Lae();return}Xae()}function DM(t){return t.transaction}function hV(t,e,n){const r=e.getOptions(),{publicKey:i}=e.getDsn()||{},{segment:s}=n&&n.getUser()||{},a=to({environment:r.environment||cV,release:r.release,user_segment:s,public_key:i,trace_id:t});return e.emit&&e.emit("createDsc",a),a}function ab(t){const e=Rr();if(!e)return{};const n=hV(As(t).trace_id||"",e,jo()),r=DM(t);if(!r)return n;const i=r&&r._frozenDynamicSamplingContext;if(i)return i;const{sampleRate:s,source:a}=r.metadata;s!=null&&(n.sample_rate=`${s}`);const o=As(r);return a&&a!=="url"&&(n.transaction=o.description),n.sampled=String(RC(r)),e.emit&&e.emit("createDsc",n),n}function Cae(t,e){const{fingerprint:n,span:r,breadcrumbs:i,sdkProcessingMetadata:s}=e;J5e(t,e),r&&H5e(t,r),Q5e(t,n),Y5e(t,i),B5e(t,s)}function jF(t,e){const{extra:n,tags:r,user:i,contexts:s,level:a,sdkProcessingMetadata:o,breadcrumbs:l,fingerprint:u,eventProcessors:c,attachments:d,propagationContext:f,transactionName:h,span:p}=e;yS(t,"extra",n),yS(t,"tags",r),yS(t,"user",i),yS(t,"contexts",s),yS(t,"sdkProcessingMetadata",o),a&&(t.level=a),h&&(t.transactionName=h),p&&(t.span=p),l.length&&(t.breadcrumbs=[...t.breadcrumbs,...l]),u.length&&(t.fingerprint=[...t.fingerprint,...u]),c.length&&(t.eventProcessors=[...t.eventProcessors,...c]),d.length&&(t.attachments=[...t.attachments,...d]),t.propagationContext={...t.propagationContext,...f}}function yS(t,e,n){if(n&&Object.keys(n).length){t[e]={...t[e]};for(const r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[e][r]=n[r])}}function J5e(t,e){const{extra:n,tags:r,user:i,contexts:s,level:a,transactionName:o}=e,l=to(n);l&&Object.keys(l).length&&(t.extra={...l,...t.extra});const u=to(r);u&&Object.keys(u).length&&(t.tags={...u,...t.tags});const c=to(i);c&&Object.keys(c).length&&(t.user={...c,...t.user});const d=to(s);d&&Object.keys(d).length&&(t.contexts={...d,...t.contexts}),a&&(t.level=a),o&&(t.transaction=o)}function Y5e(t,e){const n=[...t.breadcrumbs||[],...e];t.breadcrumbs=n.length?n:void 0}function B5e(t,e){t.sdkProcessingMetadata={...t.sdkProcessingMetadata,...e}}function H5e(t,e){t.contexts={trace:PC(e),...t.contexts};const n=DM(e);if(n){t.sdkProcessingMetadata={dynamicSamplingContext:ab(e),...t.sdkProcessingMetadata};const r=As(n).description;r&&(t.tags={transaction:r,...t.tags})}}function Q5e(t,e){t.fingerprint=t.fingerprint?yC(t.fingerprint):[],e&&(t.fingerprint=t.fingerprint.concat(e)),t.fingerprint&&!t.fingerprint.length&&delete t.fingerprint}const _5e=100;let jz;class of{constructor(){this._notifyingListeners=!1,this._scopeListeners=[],this._eventProcessors=[],this._breadcrumbs=[],this._attachments=[],this._user={},this._tags={},this._extra={},this._contexts={},this._sdkProcessingMetadata={},this._propagationContext=ZF()}static clone(e){return e?e.clone():new of}clone(){const e=new of;return e._breadcrumbs=[...this._breadcrumbs],e._tags={...this._tags},e._extra={...this._extra},e._contexts={...this._contexts},e._user=this._user,e._level=this._level,e._span=this._span,e._session=this._session,e._transactionName=this._transactionName,e._fingerprint=this._fingerprint,e._eventProcessors=[...this._eventProcessors],e._requestSession=this._requestSession,e._attachments=[...this._attachments],e._sdkProcessingMetadata={...this._sdkProcessingMetadata},e._propagationContext={...this._propagationContext},e._client=this._client,e}setClient(e){this._client=e}getClient(){return this._client}addScopeListener(e){this._scopeListeners.push(e)}addEventProcessor(e){return this._eventProcessors.push(e),this}setUser(e){return this._user=e||{email:void 0,id:void 0,ip_address:void 0,segment:void 0,username:void 0},this._session&&qv(this._session,{user:e}),this._notifyScopeListeners(),this}getUser(){return this._user}getRequestSession(){return this._requestSession}setRequestSession(e){return this._requestSession=e,this}setTags(e){return this._tags={...this._tags,...e},this._notifyScopeListeners(),this}setTag(e,n){return this._tags={...this._tags,[e]:n},this._notifyScopeListeners(),this}setExtras(e){return this._extra={...this._extra,...e},this._notifyScopeListeners(),this}setExtra(e,n){return this._extra={...this._extra,[e]:n},this._notifyScopeListeners(),this}setFingerprint(e){return this._fingerprint=e,this._notifyScopeListeners(),this}setLevel(e){return this._level=e,this._notifyScopeListeners(),this}setTransactionName(e){return this._transactionName=e,this._notifyScopeListeners(),this}setContext(e,n){return n===null?delete this._contexts[e]:this._contexts[e]=n,this._notifyScopeListeners(),this}setSpan(e){return this._span=e,this._notifyScopeListeners(),this}getSpan(){return this._span}getTransaction(){const e=this._span;return e&&e.transaction}setSession(e){return e?this._session=e:delete this._session,this._notifyScopeListeners(),this}getSession(){return this._session}update(e){if(!e)return this;const n=typeof e=="function"?e(this):e;if(n instanceof of){const r=n.getScopeData();this._tags={...this._tags,...r.tags},this._extra={...this._extra,...r.extra},this._contexts={...this._contexts,...r.contexts},r.user&&Object.keys(r.user).length&&(this._user=r.user),r.level&&(this._level=r.level),r.fingerprint.length&&(this._fingerprint=r.fingerprint),n.getRequestSession()&&(this._requestSession=n.getRequestSession()),r.propagationContext&&(this._propagationContext=r.propagationContext)}else if(ib(n)){const r=e;this._tags={...this._tags,...r.tags},this._extra={...this._extra,...r.extra},this._contexts={...this._contexts,...r.contexts},r.user&&(this._user=r.user),r.level&&(this._level=r.level),r.fingerprint&&(this._fingerprint=r.fingerprint),r.requestSession&&(this._requestSession=r.requestSession),r.propagationContext&&(this._propagationContext=r.propagationContext)}return this}clear(){return this._breadcrumbs=[],this._tags={},this._extra={},this._user={},this._contexts={},this._level=void 0,this._transactionName=void 0,this._fingerprint=void 0,this._requestSession=void 0,this._span=void 0,this._session=void 0,this._notifyScopeListeners(),this._attachments=[],this._propagationContext=ZF(),this}addBreadcrumb(e,n){const r=typeof n=="number"?n:_5e;if(r<=0)return this;const i={timestamp:aT(),...e},s=this._breadcrumbs;return s.push(i),this._breadcrumbs=s.length>r?s.slice(-r):s,this._notifyScopeListeners(),this}getLastBreadcrumb(){return this._breadcrumbs[this._breadcrumbs.length-1]}clearBreadcrumbs(){return this._breadcrumbs=[],this._notifyScopeListeners(),this}addAttachment(e){return this._attachments.push(e),this}getAttachments(){return this.getScopeData().attachments}clearAttachments(){return this._attachments=[],this}getScopeData(){const{_breadcrumbs:e,_attachments:n,_contexts:r,_tags:i,_extra:s,_user:a,_level:o,_fingerprint:l,_eventProcessors:u,_propagationContext:c,_sdkProcessingMetadata:d,_transactionName:f,_span:h}=this;return{breadcrumbs:e,attachments:n,contexts:r,tags:i,extra:s,user:a,level:o,fingerprint:l||[],eventProcessors:u,propagationContext:c,sdkProcessingMetadata:d,transactionName:f,span:h}}applyToEvent(e,n={},r=[]){Cae(e,this.getScopeData());const i=[...r,...MC(),...this._eventProcessors];return qM(i,e,n)}setSDKProcessingMetadata(e){return this._sdkProcessingMetadata={...this._sdkProcessingMetadata,...e},this}setPropagationContext(e){return this._propagationContext=e,this}getPropagationContext(){return this._propagationContext}captureException(e,n){const r=n&&n.event_id?n.event_id:Ci();if(!this._client)return He.warn("No client configured on scope - will not capture exception!"),r;const i=new Error("Sentry syntheticException");return this._client.captureException(e,{originalException:e,syntheticException:i,...n,event_id:r},this),r}captureMessage(e,n,r){const i=r&&r.event_id?r.event_id:Ci();if(!this._client)return He.warn("No client configured on scope - will not capture message!"),i;const s=new Error(e);return this._client.captureMessage(e,n,{originalException:e,syntheticException:s,...r,event_id:i},this),i}captureEvent(e,n){const r=n&&n.event_id?n.event_id:Ci();return this._client?(this._client.captureEvent(e,{...n,event_id:r},this),r):(He.warn("No client configured on scope - will not capture event!"),r)}_notifyScopeListeners(){this._notifyingListeners||(this._notifyingListeners=!0,this._scopeListeners.forEach(e=>{e(this)}),this._notifyingListeners=!1)}}function $5e(){return jz||(jz=new of),jz}function ZF(){return{traceId:Ci(),spanId:Ci().substring(16)}}const Hx="7.120.3",Kae=parseFloat(Hx),eEe=100;class qae{constructor(e,n,r,i=Kae){this._version=i;let s;n?s=n:(s=new of,s.setClient(e));let a;r?a=r:(a=new of,a.setClient(e)),this._stack=[{scope:s}],e&&this.bindClient(e),this._isolationScope=a}isOlderThan(e){return this._version(this.popScope(),i),i=>{throw this.popScope(),i}):(this.popScope(),r)}getClient(){return this.getStackTop().client}getScope(){return this.getStackTop().scope}getIsolationScope(){return this._isolationScope}getStack(){return this._stack}getStackTop(){return this._stack[this._stack.length-1]}captureException(e,n){const r=this._lastEventId=n&&n.event_id?n.event_id:Ci(),i=new Error("Sentry syntheticException");return this.getScope().captureException(e,{originalException:e,syntheticException:i,...n,event_id:r}),r}captureMessage(e,n,r){const i=this._lastEventId=r&&r.event_id?r.event_id:Ci(),s=new Error(e);return this.getScope().captureMessage(e,n,{originalException:e,syntheticException:s,...r,event_id:i}),i}captureEvent(e,n){const r=n&&n.event_id?n.event_id:Ci();return e.type||(this._lastEventId=r),this.getScope().captureEvent(e,{...n,event_id:r}),r}lastEventId(){return this._lastEventId}addBreadcrumb(e,n){const{scope:r,client:i}=this.getStackTop();if(!i)return;const{beforeBreadcrumb:s=null,maxBreadcrumbs:a=eEe}=i.getOptions&&i.getOptions()||{};if(a<=0)return;const l={timestamp:aT(),...e},u=s?Qc(()=>s(l,n)):l;u!==null&&(i.emit&&i.emit("beforeAddBreadcrumb",u,n),r.addBreadcrumb(u,a))}setUser(e){this.getScope().setUser(e),this.getIsolationScope().setUser(e)}setTags(e){this.getScope().setTags(e),this.getIsolationScope().setTags(e)}setExtras(e){this.getScope().setExtras(e),this.getIsolationScope().setExtras(e)}setTag(e,n){this.getScope().setTag(e,n),this.getIsolationScope().setTag(e,n)}setExtra(e,n){this.getScope().setExtra(e,n),this.getIsolationScope().setExtra(e,n)}setContext(e,n){this.getScope().setContext(e,n),this.getIsolationScope().setContext(e,n)}configureScope(e){const{scope:n,client:r}=this.getStackTop();r&&e(n)}run(e){const n=JF(this);try{e(this)}finally{JF(n)}}getIntegration(e){const n=this.getClient();if(!n)return null;try{return n.getIntegration(e)}catch{return At&&He.warn(`Cannot retrieve integration ${e.id} from the current Hub`),null}}startTransaction(e,n){const r=this._callExtensionMethod("startTransaction",e,n);return At&&!r&&(this.getClient()?He.warn(`Tracing extension 'startTransaction' has not been added. Call 'addTracingExtensions' before calling 'init': +`),typeof l=="string"||l instanceof Uint8Array)s(l);else{let u;try{u=JSON.stringify(l)}catch{u=JSON.stringify(Rc(l))}s(u)}}return typeof i=="string"?i:w5e(i)}function w5e(t){const e=t.reduce((i,s)=>i+s.length,0),n=new Uint8Array(e);let r=0;for(const i of t)n.set(i,r),r+=i.length;return n}function E5e(t,e){const n=typeof t.data=="string"?ZN(t.data,e):t.data;return[to({type:"attachment",length:n.length,filename:t.filename,content_type:t.contentType,attachment_type:t.attachmentType}),n]}const M5e={session:"session",sessions:"session",attachment:"attachment",transaction:"transaction",event:"error",client_report:"internal",user_report:"default",profile:"profile",replay_event:"replay",replay_recording:"replay",check_in:"monitor",feedback:"feedback",span:"span",statsd:"metric_bucket"};function KF(t){return M5e[t]}function MC(t){if(!t||!t.sdk)return;const{name:e,version:n}=t.sdk;return{name:e,version:n}}function Pae(t,e,n,r){const i=t.sdkProcessingMetadata&&t.sdkProcessingMetadata.dynamicSamplingContext;return{event_id:t.event_id,sent_at:new Date().toISOString(),...e&&{sdk:e},...!!n&&r&&{dsn:iy(r)},...i&&{trace:to({...i})}}}function P5e(t,e,n){const r=[{type:"client_report"},{timestamp:n||sT(),discarded_events:t}];return Hp(e?{dsn:e}:{},[r])}const R5e=60*1e3;function V5e(t,e=Date.now()){const n=parseInt(`${t}`,10);if(!isNaN(n))return n*1e3;const r=Date.parse(`${t}`);return isNaN(r)?R5e:r-e}function z5e(t,e){return t[e]||t.all||0}function Rae(t,e,n=Date.now()){return z5e(t,e)>n}function Vae(t,{statusCode:e,headers:n},r=Date.now()){const i={...t},s=n&&n["x-sentry-rate-limits"],a=n&&n["retry-after"];if(s)for(const o of s.trim().split(",")){const[l,u,,,c]=o.split(":",5),d=parseInt(l,10),f=(isNaN(d)?60:d)*1e3;if(!u)i.all=r+f;else for(const h of u.split(";"))h==="metric_bucket"?(!c||c.split(";").includes("custom"))&&(i[h]=r+f):i[h]=r+f}else a?i.all=r+V5e(a,r):e===429&&(i.all=r+60*1e3);return i}function k5e(t,e){return t??e()}function Fz(t){let e,n=t[0],r=1;for(;rn.call(e,...a)),e=void 0)}return n}const At=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,cV="production";function PC(){return cae("globalEventProcessors",()=>[])}function O5e(t){PC().push(t)}function KM(t,e,n,r=0){return new il((i,s)=>{const a=t[r];if(e===null||typeof a!="function")i(e);else{const o=a({...e},n);At&&a.id&&o===null&&He.log(`Event processor "${a.id}" dropped event`),lV(o)?o.then(l=>KM(t,l,n,r+1).then(i)).then(null,s):KM(t,o,n,r+1).then(i).then(null,s)}})}function zae(t){const e=sy(),n={sid:Ci(),init:!0,timestamp:e,started:e,duration:0,status:"ok",errors:0,ignoreDuration:!1,toJSON:()=>I5e(n)};return t&&qv(n,t),n}function qv(t,e={}){if(e.user&&(!t.ipAddress&&e.user.ip_address&&(t.ipAddress=e.user.ip_address),!t.did&&!e.did&&(t.did=e.user.id||e.user.email||e.user.username)),t.timestamp=e.timestamp||sy(),e.abnormal_mechanism&&(t.abnormal_mechanism=e.abnormal_mechanism),e.ignoreDuration&&(t.ignoreDuration=e.ignoreDuration),e.sid&&(t.sid=e.sid.length===32?e.sid:Ci()),e.init!==void 0&&(t.init=e.init),!t.did&&e.did&&(t.did=`${e.did}`),typeof e.started=="number"&&(t.started=e.started),t.ignoreDuration)t.duration=void 0;else if(typeof e.duration=="number")t.duration=e.duration;else{const n=t.timestamp-t.started;t.duration=n>=0?n:0}e.release&&(t.release=e.release),e.environment&&(t.environment=e.environment),!t.ipAddress&&e.ipAddress&&(t.ipAddress=e.ipAddress),!t.userAgent&&e.userAgent&&(t.userAgent=e.userAgent),typeof e.errors=="number"&&(t.errors=e.errors),e.status&&(t.status=e.status)}function kae(t,e){let n={};e?n={status:e}:t.status==="ok"&&(n={status:"exited"}),qv(t,n)}function I5e(t){return to({sid:`${t.sid}`,init:t.init,started:new Date(t.started*1e3).toISOString(),timestamp:new Date(t.timestamp*1e3).toISOString(),status:t.status,errors:t.errors,did:typeof t.did=="number"||typeof t.did=="string"?`${t.did}`:void 0,duration:t.duration,abnormal_mechanism:t.abnormal_mechanism,attrs:{release:t.release,environment:t.environment,ip_address:t.ipAddress,user_agent:t.userAgent}})}const U5e=0,Oae=1;function RC(t){const{spanId:e,traceId:n}=t.spanContext(),{data:r,op:i,parent_span_id:s,status:a,tags:o,origin:l}=As(t);return to({data:r,op:i,parent_span_id:s,span_id:e,status:a,tags:o,trace_id:n,origin:l})}function dV(t){const{traceId:e,spanId:n}=t.spanContext(),r=VC(t);return EC(e,n,r)}function fV(t){return typeof t=="number"?qF(t):Array.isArray(t)?t[0]+t[1]/1e9:t instanceof Date?qF(t.getTime()):sy()}function qF(t){return t>9999999999?t/1e3:t}function As(t){return N5e(t)?t.getSpanJSON():typeof t.toJSON=="function"?t.toJSON():{}}function N5e(t){return typeof t.getSpanJSON=="function"}function VC(t){const{traceFlags:e}=t.spanContext();return!!(e&Oae)}function Iae(t,e,n,r,i,s){const{normalizeDepth:a=3,normalizeMaxBreadth:o=1e3}=t,l={...e,event_id:e.event_id||n.event_id||Ci(),timestamp:e.timestamp||sT()},u=n.integrations||t.integrations.map(v=>v.name);L5e(l,t),K5e(l,u),e.type===void 0&&X5e(l,t.stackParser);const c=D5e(r,n.captureContext);n.mechanism&&Yx(l,n.mechanism);const d=i&&i.getEventProcessors?i.getEventProcessors():[],f=eEe().getScopeData();if(s){const v=s.getScopeData();GF(f,v)}if(c){const v=c.getScopeData();GF(f,v)}const h=[...n.attachments||[],...f.attachments];h.length&&(n.attachments=h),Xae(l,f);const p=[...d,...PC(),...f.eventProcessors];return KM(p,l,n).then(v=>(v&&C5e(v),typeof a=="number"&&a>0?q5e(v,a,o):v))}function L5e(t,e){const{environment:n,release:r,dist:i,maxValueLength:s=250}=e;"environment"in t||(t.environment="environment"in e?n:cV),t.release===void 0&&r!==void 0&&(t.release=r),t.dist===void 0&&i!==void 0&&(t.dist=i),t.message&&(t.message=O1(t.message,s));const a=t.exception&&t.exception.values&&t.exception.values[0];a&&a.value&&(a.value=O1(a.value,s));const o=t.request;o&&o.url&&(o.url=O1(o.url,s))}const DF=new WeakMap;function X5e(t,e){const n=Gn._sentryDebugIds;if(!n)return;let r;const i=DF.get(e);i?r=i:(r=new Map,DF.set(e,r));const s=Object.keys(n).reduce((a,o)=>{let l;const u=r.get(o);u?l=u:(l=e(o),r.set(o,l));for(let c=l.length-1;c>=0;c--){const d=l[c];if(d.filename){a[d.filename]=n[o];break}}return a},{});try{t.exception.values.forEach(a=>{a.stacktrace.frames.forEach(o=>{o.filename&&(o.debug_id=s[o.filename])})})}catch{}}function C5e(t){const e={};try{t.exception.values.forEach(r=>{r.stacktrace.frames.forEach(i=>{i.debug_id&&(i.abs_path?e[i.abs_path]=i.debug_id:i.filename&&(e[i.filename]=i.debug_id),delete i.debug_id)})})}catch{}if(Object.keys(e).length===0)return;t.debug_meta=t.debug_meta||{},t.debug_meta.images=t.debug_meta.images||[];const n=t.debug_meta.images;Object.keys(e).forEach(r=>{n.push({type:"sourcemap",code_file:r,debug_id:e[r]})})}function K5e(t,e){e.length>0&&(t.sdk=t.sdk||{},t.sdk.integrations=[...t.sdk.integrations||[],...e])}function q5e(t,e,n){if(!t)return null;const r={...t,...t.breadcrumbs&&{breadcrumbs:t.breadcrumbs.map(i=>({...i,...i.data&&{data:Rc(i.data,e,n)}}))},...t.user&&{user:Rc(t.user,e,n)},...t.contexts&&{contexts:Rc(t.contexts,e,n)},...t.extra&&{extra:Rc(t.extra,e,n)}};return t.contexts&&t.contexts.trace&&r.contexts&&(r.contexts.trace=t.contexts.trace,t.contexts.trace.data&&(r.contexts.trace.data=Rc(t.contexts.trace.data,e,n))),t.spans&&(r.spans=t.spans.map(i=>{const s=As(i).data;return s&&(i.data=Rc(s,e,n)),i})),r}function D5e(t,e){if(!e)return t;const n=t?t.clone():new of;return n.update(e),n}function W5e(t){if(t)return A5e(t)?{captureContext:t}:F5e(t)?{captureContext:t}:t}function A5e(t){return t instanceof of||typeof t=="function"}const G5e=["user","level","extra","contexts","tags","fingerprint","requestSession","propagationContext"];function F5e(t){return Object.keys(t).some(e=>G5e.includes(e))}function ay(t,e){return jo().captureException(t,W5e(e))}function j5e(t,e){const n=typeof e=="string"?e:void 0,r=typeof e!="string"?{captureContext:e}:void 0;return jo().captureMessage(t,n,r)}function Uae(t,e){return jo().captureEvent(t,e)}function kp(t,e){jo().addBreadcrumb(t,e)}function Z5e(t,e){jo().setContext(t,e)}function J5e(...t){const e=jo();if(t.length===2){const[n,r]=t;return n?e.withScope(()=>(e.getStackTop().scope=n,r(n))):e.withScope(r)}return e.withScope(t[0])}function Rr(){return jo().getClient()}function Fo(){return jo().getScope()}function WF(t){const e=Rr(),n=Qp(),r=Fo(),{release:i,environment:s=cV}=e&&e.getOptions()||{},{userAgent:a}=Gn.navigator||{},o=zae({release:i,environment:s,user:r.getUser()||n.getUser(),...a&&{userAgent:a},...t}),l=n.getSession();return l&&l.status==="ok"&&qv(l,{status:"exited"}),Nae(),n.setSession(o),r.setSession(o),o}function Nae(){const t=Qp(),e=Fo(),n=e.getSession()||t.getSession();n&&kae(n),Lae(),t.setSession(),e.setSession()}function Lae(){const t=Qp(),e=Fo(),n=Rr(),r=e.getSession()||t.getSession();r&&n&&n.captureSession&&n.captureSession(r)}function AF(t=!1){if(t){Nae();return}Lae()}function qM(t){return t.transaction}function hV(t,e,n){const r=e.getOptions(),{publicKey:i}=e.getDsn()||{},{segment:s}=n&&n.getUser()||{},a=to({environment:r.environment||cV,release:r.release,user_segment:s,public_key:i,trace_id:t});return e.emit&&e.emit("createDsc",a),a}function ab(t){const e=Rr();if(!e)return{};const n=hV(As(t).trace_id||"",e,Fo()),r=qM(t);if(!r)return n;const i=r&&r._frozenDynamicSamplingContext;if(i)return i;const{sampleRate:s,source:a}=r.metadata;s!=null&&(n.sample_rate=`${s}`);const o=As(r);return a&&a!=="url"&&(n.transaction=o.description),n.sampled=String(VC(r)),e.emit&&e.emit("createDsc",n),n}function Xae(t,e){const{fingerprint:n,span:r,breadcrumbs:i,sdkProcessingMetadata:s}=e;Y5e(t,e),r&&Q5e(t,r),_5e(t,n),B5e(t,i),H5e(t,s)}function GF(t,e){const{extra:n,tags:r,user:i,contexts:s,level:a,sdkProcessingMetadata:o,breadcrumbs:l,fingerprint:u,eventProcessors:c,attachments:d,propagationContext:f,transactionName:h,span:p}=e;bS(t,"extra",n),bS(t,"tags",r),bS(t,"user",i),bS(t,"contexts",s),bS(t,"sdkProcessingMetadata",o),a&&(t.level=a),h&&(t.transactionName=h),p&&(t.span=p),l.length&&(t.breadcrumbs=[...t.breadcrumbs,...l]),u.length&&(t.fingerprint=[...t.fingerprint,...u]),c.length&&(t.eventProcessors=[...t.eventProcessors,...c]),d.length&&(t.attachments=[...t.attachments,...d]),t.propagationContext={...t.propagationContext,...f}}function bS(t,e,n){if(n&&Object.keys(n).length){t[e]={...t[e]};for(const r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[e][r]=n[r])}}function Y5e(t,e){const{extra:n,tags:r,user:i,contexts:s,level:a,transactionName:o}=e,l=to(n);l&&Object.keys(l).length&&(t.extra={...l,...t.extra});const u=to(r);u&&Object.keys(u).length&&(t.tags={...u,...t.tags});const c=to(i);c&&Object.keys(c).length&&(t.user={...c,...t.user});const d=to(s);d&&Object.keys(d).length&&(t.contexts={...d,...t.contexts}),a&&(t.level=a),o&&(t.transaction=o)}function B5e(t,e){const n=[...t.breadcrumbs||[],...e];t.breadcrumbs=n.length?n:void 0}function H5e(t,e){t.sdkProcessingMetadata={...t.sdkProcessingMetadata,...e}}function Q5e(t,e){t.contexts={trace:RC(e),...t.contexts};const n=qM(e);if(n){t.sdkProcessingMetadata={dynamicSamplingContext:ab(e),...t.sdkProcessingMetadata};const r=As(n).description;r&&(t.tags={transaction:r,...t.tags})}}function _5e(t,e){t.fingerprint=t.fingerprint?SC(t.fingerprint):[],e&&(t.fingerprint=t.fingerprint.concat(e)),t.fingerprint&&!t.fingerprint.length&&delete t.fingerprint}const $5e=100;let jz;class of{constructor(){this._notifyingListeners=!1,this._scopeListeners=[],this._eventProcessors=[],this._breadcrumbs=[],this._attachments=[],this._user={},this._tags={},this._extra={},this._contexts={},this._sdkProcessingMetadata={},this._propagationContext=FF()}static clone(e){return e?e.clone():new of}clone(){const e=new of;return e._breadcrumbs=[...this._breadcrumbs],e._tags={...this._tags},e._extra={...this._extra},e._contexts={...this._contexts},e._user=this._user,e._level=this._level,e._span=this._span,e._session=this._session,e._transactionName=this._transactionName,e._fingerprint=this._fingerprint,e._eventProcessors=[...this._eventProcessors],e._requestSession=this._requestSession,e._attachments=[...this._attachments],e._sdkProcessingMetadata={...this._sdkProcessingMetadata},e._propagationContext={...this._propagationContext},e._client=this._client,e}setClient(e){this._client=e}getClient(){return this._client}addScopeListener(e){this._scopeListeners.push(e)}addEventProcessor(e){return this._eventProcessors.push(e),this}setUser(e){return this._user=e||{email:void 0,id:void 0,ip_address:void 0,segment:void 0,username:void 0},this._session&&qv(this._session,{user:e}),this._notifyScopeListeners(),this}getUser(){return this._user}getRequestSession(){return this._requestSession}setRequestSession(e){return this._requestSession=e,this}setTags(e){return this._tags={...this._tags,...e},this._notifyScopeListeners(),this}setTag(e,n){return this._tags={...this._tags,[e]:n},this._notifyScopeListeners(),this}setExtras(e){return this._extra={...this._extra,...e},this._notifyScopeListeners(),this}setExtra(e,n){return this._extra={...this._extra,[e]:n},this._notifyScopeListeners(),this}setFingerprint(e){return this._fingerprint=e,this._notifyScopeListeners(),this}setLevel(e){return this._level=e,this._notifyScopeListeners(),this}setTransactionName(e){return this._transactionName=e,this._notifyScopeListeners(),this}setContext(e,n){return n===null?delete this._contexts[e]:this._contexts[e]=n,this._notifyScopeListeners(),this}setSpan(e){return this._span=e,this._notifyScopeListeners(),this}getSpan(){return this._span}getTransaction(){const e=this._span;return e&&e.transaction}setSession(e){return e?this._session=e:delete this._session,this._notifyScopeListeners(),this}getSession(){return this._session}update(e){if(!e)return this;const n=typeof e=="function"?e(this):e;if(n instanceof of){const r=n.getScopeData();this._tags={...this._tags,...r.tags},this._extra={...this._extra,...r.extra},this._contexts={...this._contexts,...r.contexts},r.user&&Object.keys(r.user).length&&(this._user=r.user),r.level&&(this._level=r.level),r.fingerprint.length&&(this._fingerprint=r.fingerprint),n.getRequestSession()&&(this._requestSession=n.getRequestSession()),r.propagationContext&&(this._propagationContext=r.propagationContext)}else if(ib(n)){const r=e;this._tags={...this._tags,...r.tags},this._extra={...this._extra,...r.extra},this._contexts={...this._contexts,...r.contexts},r.user&&(this._user=r.user),r.level&&(this._level=r.level),r.fingerprint&&(this._fingerprint=r.fingerprint),r.requestSession&&(this._requestSession=r.requestSession),r.propagationContext&&(this._propagationContext=r.propagationContext)}return this}clear(){return this._breadcrumbs=[],this._tags={},this._extra={},this._user={},this._contexts={},this._level=void 0,this._transactionName=void 0,this._fingerprint=void 0,this._requestSession=void 0,this._span=void 0,this._session=void 0,this._notifyScopeListeners(),this._attachments=[],this._propagationContext=FF(),this}addBreadcrumb(e,n){const r=typeof n=="number"?n:$5e;if(r<=0)return this;const i={timestamp:sT(),...e},s=this._breadcrumbs;return s.push(i),this._breadcrumbs=s.length>r?s.slice(-r):s,this._notifyScopeListeners(),this}getLastBreadcrumb(){return this._breadcrumbs[this._breadcrumbs.length-1]}clearBreadcrumbs(){return this._breadcrumbs=[],this._notifyScopeListeners(),this}addAttachment(e){return this._attachments.push(e),this}getAttachments(){return this.getScopeData().attachments}clearAttachments(){return this._attachments=[],this}getScopeData(){const{_breadcrumbs:e,_attachments:n,_contexts:r,_tags:i,_extra:s,_user:a,_level:o,_fingerprint:l,_eventProcessors:u,_propagationContext:c,_sdkProcessingMetadata:d,_transactionName:f,_span:h}=this;return{breadcrumbs:e,attachments:n,contexts:r,tags:i,extra:s,user:a,level:o,fingerprint:l||[],eventProcessors:u,propagationContext:c,sdkProcessingMetadata:d,transactionName:f,span:h}}applyToEvent(e,n={},r=[]){Xae(e,this.getScopeData());const i=[...r,...PC(),...this._eventProcessors];return KM(i,e,n)}setSDKProcessingMetadata(e){return this._sdkProcessingMetadata={...this._sdkProcessingMetadata,...e},this}setPropagationContext(e){return this._propagationContext=e,this}getPropagationContext(){return this._propagationContext}captureException(e,n){const r=n&&n.event_id?n.event_id:Ci();if(!this._client)return He.warn("No client configured on scope - will not capture exception!"),r;const i=new Error("Sentry syntheticException");return this._client.captureException(e,{originalException:e,syntheticException:i,...n,event_id:r},this),r}captureMessage(e,n,r){const i=r&&r.event_id?r.event_id:Ci();if(!this._client)return He.warn("No client configured on scope - will not capture message!"),i;const s=new Error(e);return this._client.captureMessage(e,n,{originalException:e,syntheticException:s,...r,event_id:i},this),i}captureEvent(e,n){const r=n&&n.event_id?n.event_id:Ci();return this._client?(this._client.captureEvent(e,{...n,event_id:r},this),r):(He.warn("No client configured on scope - will not capture event!"),r)}_notifyScopeListeners(){this._notifyingListeners||(this._notifyingListeners=!0,this._scopeListeners.forEach(e=>{e(this)}),this._notifyingListeners=!1)}}function eEe(){return jz||(jz=new of),jz}function FF(){return{traceId:Ci(),spanId:Ci().substring(16)}}const Bx="7.120.3",Cae=parseFloat(Bx),tEe=100;class Kae{constructor(e,n,r,i=Cae){this._version=i;let s;n?s=n:(s=new of,s.setClient(e));let a;r?a=r:(a=new of,a.setClient(e)),this._stack=[{scope:s}],e&&this.bindClient(e),this._isolationScope=a}isOlderThan(e){return this._version(this.popScope(),i),i=>{throw this.popScope(),i}):(this.popScope(),r)}getClient(){return this.getStackTop().client}getScope(){return this.getStackTop().scope}getIsolationScope(){return this._isolationScope}getStack(){return this._stack}getStackTop(){return this._stack[this._stack.length-1]}captureException(e,n){const r=this._lastEventId=n&&n.event_id?n.event_id:Ci(),i=new Error("Sentry syntheticException");return this.getScope().captureException(e,{originalException:e,syntheticException:i,...n,event_id:r}),r}captureMessage(e,n,r){const i=this._lastEventId=r&&r.event_id?r.event_id:Ci(),s=new Error(e);return this.getScope().captureMessage(e,n,{originalException:e,syntheticException:s,...r,event_id:i}),i}captureEvent(e,n){const r=n&&n.event_id?n.event_id:Ci();return e.type||(this._lastEventId=r),this.getScope().captureEvent(e,{...n,event_id:r}),r}lastEventId(){return this._lastEventId}addBreadcrumb(e,n){const{scope:r,client:i}=this.getStackTop();if(!i)return;const{beforeBreadcrumb:s=null,maxBreadcrumbs:a=tEe}=i.getOptions&&i.getOptions()||{};if(a<=0)return;const l={timestamp:sT(),...e},u=s?Qc(()=>s(l,n)):l;u!==null&&(i.emit&&i.emit("beforeAddBreadcrumb",u,n),r.addBreadcrumb(u,a))}setUser(e){this.getScope().setUser(e),this.getIsolationScope().setUser(e)}setTags(e){this.getScope().setTags(e),this.getIsolationScope().setTags(e)}setExtras(e){this.getScope().setExtras(e),this.getIsolationScope().setExtras(e)}setTag(e,n){this.getScope().setTag(e,n),this.getIsolationScope().setTag(e,n)}setExtra(e,n){this.getScope().setExtra(e,n),this.getIsolationScope().setExtra(e,n)}setContext(e,n){this.getScope().setContext(e,n),this.getIsolationScope().setContext(e,n)}configureScope(e){const{scope:n,client:r}=this.getStackTop();r&&e(n)}run(e){const n=jF(this);try{e(this)}finally{jF(n)}}getIntegration(e){const n=this.getClient();if(!n)return null;try{return n.getIntegration(e)}catch{return At&&He.warn(`Cannot retrieve integration ${e.id} from the current Hub`),null}}startTransaction(e,n){const r=this._callExtensionMethod("startTransaction",e,n);return At&&!r&&(this.getClient()?He.warn(`Tracing extension 'startTransaction' has not been added. Call 'addTracingExtensions' before calling 'init': Sentry.addTracingExtensions(); Sentry.init({...}); -`):He.warn("Tracing extension 'startTransaction' is missing. You should 'init' the SDK before calling 'startTransaction'")),r}traceHeaders(){return this._callExtensionMethod("traceHeaders")}captureSession(e=!1){if(e)return this.endSession();this._sendSessionUpdate()}endSession(){const n=this.getStackTop().scope,r=n.getSession();r&&Oae(r),this._sendSessionUpdate(),n.setSession()}startSession(e){const{scope:n,client:r}=this.getStackTop(),{release:i,environment:s=cV}=r&&r.getOptions()||{},{userAgent:a}=Gn.navigator||{},o=kae({release:i,environment:s,user:n.getUser(),...a&&{userAgent:a},...e}),l=n.getSession&&n.getSession();return l&&l.status==="ok"&&qv(l,{status:"exited"}),this.endSession(),n.setSession(o),o}shouldSendDefaultPii(){const e=this.getClient(),n=e&&e.getOptions();return!!(n&&n.sendDefaultPii)}_sendSessionUpdate(){const{scope:e,client:n}=this.getStackTop(),r=e.getSession();r&&n&&n.captureSession&&n.captureSession(r)}_callExtensionMethod(e,...n){const i=oT().__SENTRY__;if(i&&i.extensions&&typeof i.extensions[e]=="function")return i.extensions[e].apply(this,n);At&&He.warn(`Extension method ${e} couldn't be found, doing nothing.`)}}function oT(){return Gn.__SENTRY__=Gn.__SENTRY__||{extensions:{},hub:void 0},Gn}function JF(t){const e=oT(),n=JN(e);return Dae(e,t),n}function Zo(){const t=oT();if(t.__SENTRY__&&t.__SENTRY__.acs){const e=t.__SENTRY__.acs.getCurrentHub();if(e)return e}return tEe(t)}function Qp(){return Zo().getIsolationScope()}function tEe(t=oT()){return(!nEe(t)||JN(t).isOlderThan(Kae))&&Dae(t,new qae),JN(t)}function nEe(t){return!!(t&&t.__SENTRY__&&t.__SENTRY__.hub)}function JN(t){return dae("hub",()=>new qae,t)}function Dae(t,e){if(!t)return!1;const n=t.__SENTRY__=t.__SENTRY__||{};return n.hub=e,!0}function Dv(t){return(t||Zo()).getScope().getTransaction()}let YF=!1;function rEe(){YF||(YF=!0,xae(YN),Tae(YN))}function YN(){const t=Dv();if(t){const e="internal_error";At&&He.log(`[Tracing] Transaction: ${e} -> Global error occured`),t.setStatus(e)}}YN.tag="sentry_tracingErrorCallback";var BF;(function(t){const e="ok";t.Ok=e;const n="deadline_exceeded";t.DeadlineExceeded=n;const r="unauthenticated";t.Unauthenticated=r;const i="permission_denied";t.PermissionDenied=i;const s="not_found";t.NotFound=s;const a="resource_exhausted";t.ResourceExhausted=a;const o="invalid_argument";t.InvalidArgument=o;const l="unimplemented";t.Unimplemented=l;const u="unavailable";t.Unavailable=u;const c="internal_error";t.InternalError=c;const d="unknown_error";t.UnknownError=d;const f="cancelled";t.Cancelled=f;const h="already_exists";t.AlreadyExists=h;const p="failed_precondition";t.FailedPrecondition=p;const m="aborted";t.Aborted=m;const v="out_of_range";t.OutOfRange=v;const g="data_loss";t.DataLoss=g})(BF||(BF={}));function iEe(t){if(t<400&&t>=100)return"ok";if(t>=400&&t<500)switch(t){case 401:return"unauthenticated";case 403:return"permission_denied";case 404:return"not_found";case 409:return"already_exists";case 413:return"failed_precondition";case 429:return"resource_exhausted";default:return"invalid_argument"}if(t>=500&&t<600)switch(t){case 501:return"unimplemented";case 503:return"unavailable";case 504:return"deadline_exceeded";default:return"internal_error"}return"unknown_error"}function VC(t,e){t.setTag("http.status_code",String(e)),t.setData("http.response.status_code",e);const n=iEe(e);n!=="unknown_error"&&t.setStatus(n)}function v0(t){if(typeof __SENTRY_TRACING__=="boolean"&&!__SENTRY_TRACING__)return!1;const e=Rr(),n=t||e&&e.getOptions();return!!n&&(n.enableTracing||"tracesSampleRate"in n||"tracesSampler"in n)}function WM(t){if(!v0())return;const e=aEe(t),n=Zo(),r=t.scope?t.scope.getSpan():BN();if(t.onlyIfParent&&!r)return;const a=(t.scope||jo()).clone();return sEe(n,{parentSpan:r,spanContext:e,forceTransaction:t.forceTransaction,scope:a})}function BN(){return jo().getSpan()}function sEe(t,{parentSpan:e,spanContext:n,forceTransaction:r,scope:i}){if(!v0())return;const s=Qp();let a;if(e&&!r)a=e.startChild(n);else if(e){const o=ab(e),{traceId:l,spanId:u}=e.spanContext(),c=RC(e);a=t.startTransaction({traceId:l,parentSpanId:u,parentSampled:c,...n,metadata:{dynamicSamplingContext:o,...n.metadata}})}else{const{traceId:o,dsc:l,parentSpanId:u,sampled:c}={...s.getPropagationContext(),...i.getPropagationContext()};a=t.startTransaction({traceId:o,parentSpanId:u,parentSampled:c,...n,metadata:{dynamicSamplingContext:l,...n.metadata}})}return i.setSpan(a),oEe(a,i,s),a}function aEe(t){if(t.startTime){const e={...t};return e.startTimestamp=fV(t.startTime),delete e.startTime,e}return t}const Wae="_sentryScope",Aae="_sentryIsolationScope";function oEe(t,e,n){t&&(Kv(t,Aae,n),Kv(t,Wae,e))}function lEe(t){return{scope:t[Wae],isolationScope:t[Aae]}}const Nu="sentry.source",s1="sentry.sample_rate",r2="sentry.op",_d="sentry.origin",uEe="profile_id";class Gae{constructor(e=1e3){this._maxlen=e,this.spans=[]}add(e){this.spans.length>this._maxlen?e.spanRecorder=void 0:this.spans.push(e)}}class pV{constructor(e={}){this._traceId=e.traceId||Ci(),this._spanId=e.spanId||Ci().substring(16),this._startTime=e.startTimestamp||sy(),this.tags=e.tags?{...e.tags}:{},this.data=e.data?{...e.data}:{},this.instrumenter=e.instrumenter||"sentry",this._attributes={},this.setAttributes({[_d]:e.origin||"manual",[r2]:e.op,...e.attributes}),this._name=e.name||e.description,e.parentSpanId&&(this._parentSpanId=e.parentSpanId),"sampled"in e&&(this._sampled=e.sampled),e.status&&(this._status=e.status),e.endTimestamp&&(this._endTime=e.endTimestamp),e.exclusiveTime!==void 0&&(this._exclusiveTime=e.exclusiveTime),this._measurements=e.measurements?{...e.measurements}:{}}get name(){return this._name||""}set name(e){this.updateName(e)}get description(){return this._name}set description(e){this._name=e}get traceId(){return this._traceId}set traceId(e){this._traceId=e}get spanId(){return this._spanId}set spanId(e){this._spanId=e}set parentSpanId(e){this._parentSpanId=e}get parentSpanId(){return this._parentSpanId}get sampled(){return this._sampled}set sampled(e){this._sampled=e}get attributes(){return this._attributes}set attributes(e){this._attributes=e}get startTimestamp(){return this._startTime}set startTimestamp(e){this._startTime=e}get endTimestamp(){return this._endTime}set endTimestamp(e){this._endTime=e}get status(){return this._status}set status(e){this._status=e}get op(){return this._attributes[r2]}set op(e){this.setAttribute(r2,e)}get origin(){return this._attributes[_d]}set origin(e){this.setAttribute(_d,e)}spanContext(){const{_spanId:e,_traceId:n,_sampled:r}=this;return{spanId:e,traceId:n,traceFlags:r?Iae:I5e}}startChild(e){const n=new pV({...e,parentSpanId:this._spanId,sampled:this._sampled,traceId:this._traceId});n.spanRecorder=this.spanRecorder,n.spanRecorder&&n.spanRecorder.add(n);const r=DM(this);if(n.transaction=r,At&&r){const i=e&&e.op||"< unknown op >",s=As(n).description||"< unknown name >",a=r.spanContext().spanId,o=`[Tracing] Starting '${i}' span on transaction '${s}' (${a}).`;He.log(o),this._logMessage=o}return n}setTag(e,n){return this.tags={...this.tags,[e]:n},this}setData(e,n){return this.data={...this.data,[e]:n},this}setAttribute(e,n){n===void 0?delete this._attributes[e]:this._attributes[e]=n}setAttributes(e){Object.keys(e).forEach(n=>this.setAttribute(n,e[n]))}setStatus(e){return this._status=e,this}setHttpStatus(e){return VC(this,e),this}setName(e){this.updateName(e)}updateName(e){return this._name=e,this}isSuccess(){return this._status==="ok"}finish(e){return this.end(e)}end(e){if(this._endTime)return;const n=DM(this);if(At&&n&&n.spanContext().spanId!==this._spanId){const r=this._logMessage;r&&He.log(r.replace("Starting","Finishing"))}this._endTime=fV(e)}toTraceparent(){return dV(this)}toContext(){return to({data:this._getData(),description:this._name,endTimestamp:this._endTime,op:this.op,parentSpanId:this._parentSpanId,sampled:this._sampled,spanId:this._spanId,startTimestamp:this._startTime,status:this._status,tags:this.tags,traceId:this._traceId})}updateWithContext(e){return this.data=e.data||{},this._name=e.name||e.description,this._endTime=e.endTimestamp,this.op=e.op,this._parentSpanId=e.parentSpanId,this._sampled=e.sampled,this._spanId=e.spanId||this._spanId,this._startTime=e.startTimestamp||this._startTime,this._status=e.status,this.tags=e.tags||{},this._traceId=e.traceId||this._traceId,this}getTraceContext(){return PC(this)}getSpanJSON(){return to({data:this._getData(),description:this._name,op:this._attributes[r2],parent_span_id:this._parentSpanId,span_id:this._spanId,start_timestamp:this._startTime,status:this._status,tags:Object.keys(this.tags).length>0?this.tags:void 0,timestamp:this._endTime,trace_id:this._traceId,origin:this._attributes[_d],_metrics_summary:void 0,profile_id:this._attributes[uEe],exclusive_time:this._exclusiveTime,measurements:Object.keys(this._measurements).length>0?this._measurements:void 0})}isRecording(){return!this._endTime&&!!this._sampled}toJSON(){return this.getSpanJSON()}_getData(){const{data:e,_attributes:n}=this,r=Object.keys(e).length>0,i=Object.keys(n).length>0;if(!(!r&&!i))return r&&i?{...e,...n}:r?e:n}}class Fae extends pV{constructor(e,n){super(e),this._contexts={},this._hub=n||Zo(),this._name=e.name||"",this._metadata={...e.metadata},this._trimEnd=e.trimEnd,this.transaction=this;const r=this._metadata.dynamicSamplingContext;r&&(this._frozenDynamicSamplingContext={...r})}get name(){return this._name}set name(e){this.setName(e)}get metadata(){return{source:"custom",spanMetadata:{},...this._metadata,...this._attributes[Nu]&&{source:this._attributes[Nu]},...this._attributes[s1]&&{sampleRate:this._attributes[s1]}}}set metadata(e){this._metadata=e}setName(e,n="custom"){this._name=e,this.setAttribute(Nu,n)}updateName(e){return this._name=e,this}initSpanRecorder(e=1e3){this.spanRecorder||(this.spanRecorder=new Gae(e)),this.spanRecorder.add(this)}setContext(e,n){n===null?delete this._contexts[e]:this._contexts[e]=n}setMeasurement(e,n,r=""){this._measurements[e]={value:n,unit:r}}setMetadata(e){this._metadata={...this._metadata,...e}}end(e){const n=fV(e),r=this._finishTransaction(n);if(r)return this._hub.captureEvent(r)}toContext(){const e=super.toContext();return to({...e,name:this._name,trimEnd:this._trimEnd})}updateWithContext(e){return super.updateWithContext(e),this._name=e.name||"",this._trimEnd=e.trimEnd,this}getDynamicSamplingContext(){return ab(this)}setHub(e){this._hub=e}getProfileId(){if(this._contexts!==void 0&&this._contexts.profile!==void 0)return this._contexts.profile.profile_id}_finishTransaction(e){if(this._endTime!==void 0)return;this._name||(At&&He.warn("Transaction has no name, falling back to ``."),this._name=""),super.end(e);const n=this._hub.getClient();if(n&&n.emit&&n.emit("finishTransaction",this),this._sampled!==!0){At&&He.log("[Tracing] Discarding transaction because its trace was not chosen to be sampled."),n&&n.recordDroppedEvent("sample_rate","transaction");return}const r=this.spanRecorder?this.spanRecorder.spans.filter(c=>c!==this&&As(c).timestamp):[];if(this._trimEnd&&r.length>0){const c=r.map(d=>As(d).timestamp).filter(Boolean);this._endTime=c.reduce((d,f)=>d>f?d:f)}const{scope:i,isolationScope:s}=lEe(this),{metadata:a}=this,{source:o}=a,l={contexts:{...this._contexts,trace:PC(this)},spans:r,start_timestamp:this._startTime,tags:this.tags,timestamp:this._endTime,transaction:this._name,type:"transaction",sdkProcessingMetadata:{...a,capturedSpanScope:i,capturedSpanIsolationScope:s,...to({dynamicSamplingContext:ab(this)})},_metrics_summary:void 0,...o&&{transaction_info:{source:o}}};return Object.keys(this._measurements).length>0&&(At&&He.log("[Measurements] Adding measurements to transaction",JSON.stringify(this._measurements,void 0,2)),l.measurements=this._measurements),At&&He.log(`[Tracing] Finishing ${this.op} transaction: ${this._name}.`),l}}const g7={idleTimeout:1e3,finalTimeout:3e4,heartbeatInterval:5e3},cEe="finishReason",Q0=["heartbeatFailed","idleTimeout","documentHidden","finalTimeout","externalFinish","cancelled"];class dEe extends Gae{constructor(e,n,r,i){super(i),this._pushActivity=e,this._popActivity=n,this.transactionSpanId=r}add(e){if(e.spanContext().spanId!==this.transactionSpanId){const n=e.end;e.end=(...r)=>(this._popActivity(e.spanContext().spanId),n.apply(e,r)),As(e).timestamp===void 0&&this._pushActivity(e.spanContext().spanId)}super.add(e)}}class fEe extends Fae{constructor(e,n,r=g7.idleTimeout,i=g7.finalTimeout,s=g7.heartbeatInterval,a=!1,o=!1){super(e,n),this._idleHub=n,this._idleTimeout=r,this._finalTimeout=i,this._heartbeatInterval=s,this._onScope=a,this.activities={},this._heartbeatCounter=0,this._finished=!1,this._idleTimeoutCanceledPermanently=!1,this._beforeFinishCallbacks=[],this._finishReason=Q0[4],this._autoFinishAllowed=!o,a&&(At&&He.log(`Setting idle transaction on scope. Span ID: ${this.spanContext().spanId}`),n.getScope().setSpan(this)),o||this._restartIdleTimeout(),setTimeout(()=>{this._finished||(this.setStatus("deadline_exceeded"),this._finishReason=Q0[3],this.end())},this._finalTimeout)}end(e){const n=fV(e);if(this._finished=!0,this.activities={},this.op==="ui.action.click"&&this.setAttribute(cEe,this._finishReason),this.spanRecorder){At&&He.log("[Tracing] finishing IdleTransaction",new Date(n*1e3).toISOString(),this.op);for(const r of this._beforeFinishCallbacks)r(this,n);this.spanRecorder.spans=this.spanRecorder.spans.filter(r=>{if(r.spanContext().spanId===this.spanContext().spanId)return!0;As(r).timestamp||(r.setStatus("cancelled"),r.end(n),At&&He.log("[Tracing] cancelling span since transaction ended early",JSON.stringify(r,void 0,2)));const{start_timestamp:i,timestamp:s}=As(r),a=i&&i{this._finished||this._pushActivity(i)},r=i=>{this._finished||this._popActivity(i)};this.spanRecorder=new dEe(n,r,this.spanContext().spanId,e),At&&He.log("Starting heartbeat"),this._pingHeartbeat()}this.spanRecorder.add(this)}cancelIdleTimeout(e,{restartOnChildSpanChange:n}={restartOnChildSpanChange:!0}){this._idleTimeoutCanceledPermanently=n===!1,this._idleTimeoutID&&(clearTimeout(this._idleTimeoutID),this._idleTimeoutID=void 0,Object.keys(this.activities).length===0&&this._idleTimeoutCanceledPermanently&&(this._finishReason=Q0[5],this.end(e)))}setFinishReason(e){this._finishReason=e}sendAutoFinishSignal(){this._autoFinishAllowed||(At&&He.log("[Tracing] Received finish signal for idle transaction."),this._restartIdleTimeout(),this._autoFinishAllowed=!0)}_restartIdleTimeout(e){this.cancelIdleTimeout(),this._idleTimeoutID=setTimeout(()=>{!this._finished&&Object.keys(this.activities).length===0&&(this._finishReason=Q0[1],this.end(e))},this._idleTimeout)}_pushActivity(e){this.cancelIdleTimeout(void 0,{restartOnChildSpanChange:!this._idleTimeoutCanceledPermanently}),At&&He.log(`[Tracing] pushActivity: ${e}`),this.activities[e]=!0,At&&He.log("[Tracing] new activities count",Object.keys(this.activities).length)}_popActivity(e){if(this.activities[e]&&(At&&He.log(`[Tracing] popActivity ${e}`),delete this.activities[e],At&&He.log("[Tracing] new activities count",Object.keys(this.activities).length)),Object.keys(this.activities).length===0){const n=sy();this._idleTimeoutCanceledPermanently?this._autoFinishAllowed&&(this._finishReason=Q0[5],this.end(n)):this._restartIdleTimeout(n+this._idleTimeout/1e3)}}_beat(){if(this._finished)return;const e=Object.keys(this.activities).join("");e===this._prevHeartbeatString?this._heartbeatCounter++:this._heartbeatCounter=1,this._prevHeartbeatString=e,this._heartbeatCounter>=3?this._autoFinishAllowed&&(At&&He.log("[Tracing] Transaction finished because of no change for 3 heart beats"),this.setStatus("deadline_exceeded"),this._finishReason=Q0[0],this.end()):this._pingHeartbeat()}_pingHeartbeat(){At&&He.log(`pinging Heartbeat -> current counter: ${this._heartbeatCounter}`),setTimeout(()=>{this._beat()},this._heartbeatInterval)}}function jae(t,e,n){if(!v0(e))return t.sampled=!1,t;if(t.sampled!==void 0)return t.setAttribute(s1,Number(t.sampled)),t;let r;return typeof e.tracesSampler=="function"?(r=e.tracesSampler(n),t.setAttribute(s1,Number(r))):n.parentSampled!==void 0?r=n.parentSampled:typeof e.tracesSampleRate<"u"?(r=e.tracesSampleRate,t.setAttribute(s1,Number(r))):(r=1,t.setAttribute(s1,r)),Zae(r)?r?(t.sampled=Math.random()1?(At&&He.warn(`[Tracing] Given sample rate is invalid. Sample rate must be between 0 and 1. Got ${t}.`),!1):!0}function hEe(){const e=this.getScope().getSpan();return e?{"sentry-trace":dV(e)}:{}}function pEe(t,e){const n=this.getClient(),r=n&&n.getOptions()||{},i=r.instrumenter||"sentry",s=t.instrumenter||"sentry";i!==s&&(At&&He.error(`A transaction was started with instrumenter=\`${s}\`, but the SDK is configured with the \`${i}\` instrumenter. -The transaction will not be sampled. Please use the ${i} instrumentation to start transactions.`),t.sampled=!1);let a=new Fae(t,this);return a=jae(a,r,{name:t.name,parentSampled:t.parentSampled,transactionContext:t,attributes:{...t.data,...t.attributes},...e}),a.isRecording()&&a.initSpanRecorder(r._experiments&&r._experiments.maxSpans),n&&n.emit&&n.emit("startTransaction",a),a}function HF(t,e,n,r,i,s,a,o=!1){const l=t.getClient(),u=l&&l.getOptions()||{};let c=new fEe(e,t,n,r,a,i,o);return c=jae(c,u,{name:e.name,parentSampled:e.parentSampled,transactionContext:e,attributes:{...e.data,...e.attributes},...s}),c.isRecording()&&c.initSpanRecorder(u._experiments&&u._experiments.maxSpans),l&&l.emit&&l.emit("startTransaction",c),c}function mEe(){const t=oT();t.__SENTRY__&&(t.__SENTRY__.extensions=t.__SENTRY__.extensions||{},t.__SENTRY__.extensions.startTransaction||(t.__SENTRY__.extensions.startTransaction=pEe),t.__SENTRY__.extensions.traceHeaders||(t.__SENTRY__.extensions.traceHeaders=hEe),rEe())}function vEe(t,e,n){const r=Dv();r&&r.setMeasurement(t,e,n)}function gEe(t,e){return e&&(t.sdk=t.sdk||{},t.sdk.name=t.sdk.name||e.name,t.sdk.version=t.sdk.version||e.version,t.sdk.integrations=[...t.sdk.integrations||[],...e.integrations||[]],t.sdk.packages=[...t.sdk.packages||[],...e.packages||[]]),t}function bEe(t,e,n,r){const i=EC(n),s={sent_at:new Date().toISOString(),...i&&{sdk:i},...!!r&&e&&{dsn:iy(e)}},a="aggregates"in t?[{type:"sessions"},t]:[{type:"session"},t.toJSON()];return Hp(s,[a])}function yEe(t,e,n,r){const i=EC(n),s=t.type&&t.type!=="replay_event"?t.type:"event";gEe(t,n&&n.sdk);const a=Rae(t,i,r,e);return delete t.sdkProcessingMetadata,Hp(a,[[{type:s},t]])}const SEe="7";function xEe(t){const e=t.protocol?`${t.protocol}:`:"",n=t.port?`:${t.port}`:"";return`${e}//${t.host}${n}${t.path?`/${t.path}`:""}/api/`}function TEe(t){return`${xEe(t)}${t.projectId}/envelope/`}function wEe(t,e){return I2e({sentry_key:t.publicKey,sentry_version:SEe,...e&&{sentry_client:`${e.name}/${e.version}`}})}function EEe(t,e={}){const n=typeof e=="string"?e:e.tunnel,r=typeof e=="string"||!e._metadata?void 0:e._metadata.sdk;return n||`${TEe(t)}?${wEe(t,r)}`}const QF=[];function MEe(t){const e={};return t.forEach(n=>{const{name:r}=n,i=e[r];i&&!i.isDefaultInstance&&n.isDefaultInstance||(e[r]=n)}),Object.keys(e).map(n=>e[n])}function PEe(t){const e=t.defaultIntegrations||[],n=t.integrations;e.forEach(a=>{a.isDefaultInstance=!0});let r;Array.isArray(n)?r=[...e,...n]:typeof n=="function"?r=yC(n(e)):r=e;const i=MEe(r),s=VEe(i,a=>a.name==="Debug");if(s!==-1){const[a]=i.splice(s,1);i.push(a)}return i}function REe(t,e){const n={};return e.forEach(r=>{r&&Jae(t,r,n)}),n}function _F(t,e){for(const n of e)n&&n.afterAllSetup&&n.afterAllSetup(t)}function Jae(t,e,n){if(n[e.name]){At&&He.log(`Integration skipped because it was already installed: ${e.name}`);return}if(n[e.name]=e,QF.indexOf(e.name)===-1&&(e.setupOnce(k5e,Zo),QF.push(e.name)),e.setup&&typeof e.setup=="function"&&e.setup(t),t.on&&typeof e.preprocessEvent=="function"){const r=e.preprocessEvent.bind(e);t.on("preprocessEvent",(i,s)=>r(i,s,t))}if(t.addEventProcessor&&typeof e.processEvent=="function"){const r=e.processEvent.bind(e),i=Object.assign((s,a)=>r(s,a,t),{id:e.name});t.addEventProcessor(i)}At&&He.log(`Integration installed: ${e.name}`)}function VEe(t,e){for(let n=0;n0?`|#${r.map(([s,a])=>`${s}:${a}`).join(",")}`:"";e+=`${n.name}@${n.unit}:${n.metric}|${n.metricType}${i}|T${n.timestamp} -`}return e}function kEe(t,e,n,r){const i={sent_at:new Date().toISOString()};n&&n.sdk&&(i.sdk={name:n.sdk.name,version:n.sdk.version}),r&&e&&(i.dsn=iy(e));const s=OEe(t);return Hp(i,[s])}function OEe(t){const e=zEe(t);return[{type:"statsd",length:e.length},e]}const $F="Not capturing exception because it's already been captured.";class IEe{constructor(e){if(this._options=e,this._integrations={},this._integrationsInitialized=!1,this._numProcessing=0,this._outcomes={},this._hooks={},this._eventProcessors=[],e.dsn?this._dsn=O2e(e.dsn):At&&He.warn("No DSN provided, client will not send events."),this._dsn){const n=EEe(this._dsn,e);this._transport=e.transport({tunnel:this._options.tunnel,recordDroppedEvent:this.recordDroppedEvent.bind(this),...e.transportOptions,url:n})}}captureException(e,n,r){if(UF(e)){At&&He.log($F);return}let i=n&&n.event_id;return this._process(this.eventFromException(e,n).then(s=>this._captureEvent(s,n,r)).then(s=>{i=s})),i}captureMessage(e,n,r,i){let s=r&&r.event_id;const a=mC(e)?e:String(e),o=vC(e)?this.eventFromMessage(a,n,r):this.eventFromException(e,r);return this._process(o.then(l=>this._captureEvent(l,r,i)).then(l=>{s=l})),s}captureEvent(e,n,r){if(n&&n.originalException&&UF(n.originalException)){At&&He.log($F);return}let i=n&&n.event_id;const a=(e.sdkProcessingMetadata||{}).capturedSpanScope;return this._process(this._captureEvent(e,n,a||r).then(o=>{i=o})),i}captureSession(e){typeof e.release!="string"?At&&He.warn("Discarded session because of missing or non-string release"):(this.sendSession(e),qv(e,{init:!1}))}getDsn(){return this._dsn}getOptions(){return this._options}getSdkMetadata(){return this._options._metadata}getTransport(){return this._transport}flush(e){const n=this._transport;return n?(this.metricsAggregator&&this.metricsAggregator.flush(),this._isClientDoneProcessing(e).then(r=>n.flush(e).then(i=>r&&i))):sb(!0)}close(e){return this.flush(e).then(n=>(this.getOptions().enabled=!1,this.metricsAggregator&&this.metricsAggregator.close(),n))}getEventProcessors(){return this._eventProcessors}addEventProcessor(e){this._eventProcessors.push(e)}setupIntegrations(e){(e&&!this._integrationsInitialized||this._isEnabled()&&!this._integrationsInitialized)&&this._setupIntegrations()}init(){this._isEnabled()&&this._setupIntegrations()}getIntegrationById(e){return this.getIntegrationByName(e)}getIntegrationByName(e){return this._integrations[e]}getIntegration(e){try{return this._integrations[e.id]||null}catch{return At&&He.warn(`Cannot retrieve integration ${e.id} from the current Client`),null}}addIntegration(e){const n=this._integrations[e.name];Jae(this,e,this._integrations),n||_F(this,[e])}sendEvent(e,n={}){this.emit("beforeSendEvent",e,n);let r=yEe(e,this._dsn,this._options._metadata,this._options.tunnel);for(const s of n.attachments||[])r=S5e(r,w5e(s,this._options.transportOptions&&this._options.transportOptions.textEncoder));const i=this._sendEnvelope(r);i&&i.then(s=>this.emit("afterSendEvent",e,s),null)}sendSession(e){const n=bEe(e,this._dsn,this._options._metadata,this._options.tunnel);this._sendEnvelope(n)}recordDroppedEvent(e,n,r){if(this._options.sendClientReports){const i=typeof r=="number"?r:1,s=`${e}:${n}`;At&&He.log(`Recording outcome: "${s}"${i>1?` (${i} times)`:""}`),this._outcomes[s]=(this._outcomes[s]||0)+i}}captureAggregateMetrics(e){At&&He.log(`Flushing aggregated metrics, number of metrics: ${e.length}`);const n=kEe(e,this._dsn,this._options._metadata,this._options.tunnel);this._sendEnvelope(n)}on(e,n){this._hooks[e]||(this._hooks[e]=[]),this._hooks[e].push(n)}emit(e,...n){this._hooks[e]&&this._hooks[e].forEach(r=>r(...n))}_setupIntegrations(){const{integrations:e}=this._options;this._integrations=REe(this,e),_F(this,e),this._integrationsInitialized=!0}_updateSessionFromEvent(e,n){let r=!1,i=!1;const s=n.exception&&n.exception.values;if(s){i=!0;for(const l of s){const u=l.mechanism;if(u&&u.handled===!1){r=!0;break}}}const a=e.status==="ok";(a&&e.errors===0||a&&r)&&(qv(e,{...r&&{status:"crashed"},errors:e.errors||Number(i||r)}),this.captureSession(e))}_isClientDoneProcessing(e){return new sl(n=>{let r=0;const i=1,s=setInterval(()=>{this._numProcessing==0?(clearInterval(s),n(!0)):(r+=i,e&&r>=e&&(clearInterval(s),n(!1)))},i)})}_isEnabled(){return this.getOptions().enabled!==!1&&this._transport!==void 0}_prepareEvent(e,n,r,i=Qp()){const s=this.getOptions(),a=Object.keys(this._integrations);return!n.integrations&&a.length>0&&(n.integrations=a),this.emit("preprocessEvent",e,n),Uae(s,e,n,r,this,i).then(o=>{if(o===null)return o;const l={...i.getPropagationContext(),...r?r.getPropagationContext():void 0};if(!(o.contexts&&o.contexts.trace)&&l){const{traceId:c,spanId:d,parentSpanId:f,dsc:h}=l;o.contexts={trace:{trace_id:c,span_id:d,parent_span_id:f},...o.contexts};const p=h||hV(c,this,r);o.sdkProcessingMetadata={dynamicSamplingContext:p,...o.sdkProcessingMetadata}}return o})}_captureEvent(e,n={},r){return this._processEvent(e,n,r).then(i=>i.event_id,i=>{if(At){const s=i;s.logLevel==="log"?He.log(s.message):He.warn(s)}})}_processEvent(e,n,r){const i=this.getOptions(),{sampleRate:s}=i,a=Bae(e),o=Yae(e),l=e.type||"error",u=`before send for type \`${l}\``;if(o&&typeof s=="number"&&Math.random()>s)return this.recordDroppedEvent("sample_rate","error",e),TC(new Uc(`Discarding event because it's not included in the random sample (sampling rate = ${s})`,"log"));const c=l==="replay_event"?"replay":l,f=(e.sdkProcessingMetadata||{}).capturedSpanIsolationScope;return this._prepareEvent(e,n,r,f).then(h=>{if(h===null)throw this.recordDroppedEvent("event_processor",c,e),new Uc("An event processor returned `null`, will not send event.","log");if(n.data&&n.data.__sentry__===!0)return h;const m=NEe(i,h,n);return UEe(m,u)}).then(h=>{if(h===null){if(this.recordDroppedEvent("before_send",c,e),a){const g=1+(e.spans||[]).length;this.recordDroppedEvent("before_send","span",g)}throw new Uc(`${u} returned \`null\`, will not send event.`,"log")}const p=r&&r.getSession();if(!a&&p&&this._updateSessionFromEvent(p,h),a){const v=h.sdkProcessingMetadata&&h.sdkProcessingMetadata.spanCountBeforeProcessing||0,g=h.spans?h.spans.length:0,b=v-g;b>0&&this.recordDroppedEvent("before_send","span",b)}const m=h.transaction_info;if(a&&m&&h.transaction!==e.transaction){const v="custom";h.transaction_info={...m,source:v}}return this.sendEvent(h,n),h}).then(null,h=>{throw h instanceof Uc?h:(this.captureException(h,{data:{__sentry__:!0},originalException:h}),new Uc(`Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event. -Reason: ${h}`))})}_process(e){this._numProcessing++,e.then(n=>(this._numProcessing--,n),n=>(this._numProcessing--,n))}_sendEnvelope(e){if(this.emit("beforeEnvelope",e),this._isEnabled()&&this._transport)return this._transport.send(e).then(null,n=>{At&&He.error("Error while sending event:",n)});At&&He.error("Transport disabled")}_clearOutcomes(){const e=this._outcomes;return this._outcomes={},Object.keys(e).map(n=>{const[r,i]=n.split(":");return{reason:r,category:i,quantity:e[n]}})}}function UEe(t,e){const n=`${e} must return \`null\` or a valid event.`;if(lV(t))return t.then(r=>{if(!ib(r)&&r!==null)throw new Uc(n);return r},r=>{throw new Uc(`${e} rejected with ${r}`)});if(!ib(t)&&t!==null)throw new Uc(n);return t}function NEe(t,e,n){const{beforeSend:r,beforeSendTransaction:i}=t;if(Yae(e)&&r)return r(e,n);if(Bae(e)&&i){if(e.spans){const s=e.spans.length;e.sdkProcessingMetadata={...e.sdkProcessingMetadata,spanCountBeforeProcessing:s}}return i(e,n)}return e}function Yae(t){return t.type===void 0}function Bae(t){return t.type==="transaction"}function LEe(t){const e=Rr();!e||!e.addEventProcessor||e.addEventProcessor(t)}function XEe(t,e){e.debug===!0&&(At?He.enable():Qc(()=>{console.warn("[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.")})),jo().update(e.initialScope);const r=new t(e);CEe(r),KEe(r)}function CEe(t){const n=Zo().getStackTop();n.client=t,n.scope.setClient(t)}function KEe(t){t.init?t.init():t.setupIntegrations&&t.setupIntegrations()}const qEe=30;function Hae(t,e,n=u5e(t.bufferSize||qEe)){let r={};const i=a=>n.drain(a);function s(a){const o=[];if(qF(a,(d,f)=>{const h=DF(f);if(Vae(r,h)){const p=ej(d,f);t.recordDroppedEvent("ratelimit_backoff",h,p)}else o.push(d)}),o.length===0)return sb();const l=Hp(a[0],o),u=d=>{qF(l,(f,h)=>{const p=ej(f,h);t.recordDroppedEvent(d,DF(h),p)})},c=()=>e({body:x5e(l,t.textEncoder)}).then(d=>(d.statusCode!==void 0&&(d.statusCode<200||d.statusCode>=300)&&At&&He.warn(`Sentry responded with status code ${d.statusCode} to sent event.`),r=zae(r,d),d),d=>{throw u("network_error"),d});return n.add(c).then(d=>d,d=>{if(d instanceof Uc)return At&&He.error("Skipped sending event because buffer is full."),u("queue_overflow"),sb();throw d})}return s.__sentry__baseTransport__=!0,{send:s,flush:i}}function ej(t,e){if(!(e!=="event"&&e!=="transaction"))return Array.isArray(t)?t[1]:void 0}function DEe(t,e){const n={sent_at:new Date().toISOString()};e&&(n.dsn=iy(e));const r=t.map(WEe);return Hp(n,r)}function WEe(t){return[{type:"span"},t]}function AEe(t,e){const n=e&&jEe(e)?e.getClient():e,r=n&&n.getDsn(),i=n&&n.getOptions().tunnel;return FEe(t,r)||GEe(t,i)}function GEe(t,e){return e?tj(t)===tj(e):!1}function FEe(t,e){return e?t.includes(e.host):!1}function tj(t){return t[t.length-1]==="/"?t.slice(0,-1):t}function jEe(t){return t.getClient!==void 0}function ZEe(t,e,n=[e],r="npm"){const i=t._metadata||{};i.sdk||(i.sdk={name:`sentry.javascript.${e}`,packages:n.map(s=>({name:`${r}:@sentry/${s}`,version:Hx})),version:Hx}),t._metadata=i}const JEe=[/^Script error\.?$/,/^Javascript error: Script error\.? on line 0$/,/^ResizeObserver loop completed with undelivered notifications.$/,/^Cannot redefine property: googletag$/],YEe=[/^.*\/healthcheck$/,/^.*\/healthy$/,/^.*\/live$/,/^.*\/ready$/,/^.*\/heartbeat$/,/^.*\/health$/,/^.*\/healthz$/],Qae="InboundFilters",BEe=(t={})=>({name:Qae,setupOnce(){},processEvent(e,n,r){const i=r.getOptions(),s=HEe(t,i);return QEe(e,s)?null:e}}),_ae=BEe;Xf(Qae,_ae);function HEe(t={},e={}){return{allowUrls:[...t.allowUrls||[],...e.allowUrls||[]],denyUrls:[...t.denyUrls||[],...e.denyUrls||[]],ignoreErrors:[...t.ignoreErrors||[],...e.ignoreErrors||[],...t.disableErrorDefaults?[]:JEe],ignoreTransactions:[...t.ignoreTransactions||[],...e.ignoreTransactions||[],...t.disableTransactionDefaults?[]:YEe],ignoreInternal:t.ignoreInternal!==void 0?t.ignoreInternal:!0}}function QEe(t,e){return e.ignoreInternal&&r7e(t)?(At&&He.warn(`Event dropped due to being internal Sentry Error. -Event: ${Kh(t)}`),!0):_Ee(t,e.ignoreErrors)?(At&&He.warn(`Event dropped due to being matched by \`ignoreErrors\` option. -Event: ${Kh(t)}`),!0):$Ee(t,e.ignoreTransactions)?(At&&He.warn(`Event dropped due to being matched by \`ignoreTransactions\` option. -Event: ${Kh(t)}`),!0):e7e(t,e.denyUrls)?(At&&He.warn(`Event dropped due to being matched by \`denyUrls\` option. +`):He.warn("Tracing extension 'startTransaction' is missing. You should 'init' the SDK before calling 'startTransaction'")),r}traceHeaders(){return this._callExtensionMethod("traceHeaders")}captureSession(e=!1){if(e)return this.endSession();this._sendSessionUpdate()}endSession(){const n=this.getStackTop().scope,r=n.getSession();r&&kae(r),this._sendSessionUpdate(),n.setSession()}startSession(e){const{scope:n,client:r}=this.getStackTop(),{release:i,environment:s=cV}=r&&r.getOptions()||{},{userAgent:a}=Gn.navigator||{},o=zae({release:i,environment:s,user:n.getUser(),...a&&{userAgent:a},...e}),l=n.getSession&&n.getSession();return l&&l.status==="ok"&&qv(l,{status:"exited"}),this.endSession(),n.setSession(o),o}shouldSendDefaultPii(){const e=this.getClient(),n=e&&e.getOptions();return!!(n&&n.sendDefaultPii)}_sendSessionUpdate(){const{scope:e,client:n}=this.getStackTop(),r=e.getSession();r&&n&&n.captureSession&&n.captureSession(r)}_callExtensionMethod(e,...n){const i=aT().__SENTRY__;if(i&&i.extensions&&typeof i.extensions[e]=="function")return i.extensions[e].apply(this,n);At&&He.warn(`Extension method ${e} couldn't be found, doing nothing.`)}}function aT(){return Gn.__SENTRY__=Gn.__SENTRY__||{extensions:{},hub:void 0},Gn}function jF(t){const e=aT(),n=JN(e);return qae(e,t),n}function jo(){const t=aT();if(t.__SENTRY__&&t.__SENTRY__.acs){const e=t.__SENTRY__.acs.getCurrentHub();if(e)return e}return nEe(t)}function Qp(){return jo().getIsolationScope()}function nEe(t=aT()){return(!rEe(t)||JN(t).isOlderThan(Cae))&&qae(t,new Kae),JN(t)}function rEe(t){return!!(t&&t.__SENTRY__&&t.__SENTRY__.hub)}function JN(t){return cae("hub",()=>new Kae,t)}function qae(t,e){if(!t)return!1;const n=t.__SENTRY__=t.__SENTRY__||{};return n.hub=e,!0}function Dv(t){return(t||jo()).getScope().getTransaction()}let ZF=!1;function iEe(){ZF||(ZF=!0,Sae(YN),xae(YN))}function YN(){const t=Dv();if(t){const e="internal_error";At&&He.log(`[Tracing] Transaction: ${e} -> Global error occured`),t.setStatus(e)}}YN.tag="sentry_tracingErrorCallback";var JF;(function(t){const e="ok";t.Ok=e;const n="deadline_exceeded";t.DeadlineExceeded=n;const r="unauthenticated";t.Unauthenticated=r;const i="permission_denied";t.PermissionDenied=i;const s="not_found";t.NotFound=s;const a="resource_exhausted";t.ResourceExhausted=a;const o="invalid_argument";t.InvalidArgument=o;const l="unimplemented";t.Unimplemented=l;const u="unavailable";t.Unavailable=u;const c="internal_error";t.InternalError=c;const d="unknown_error";t.UnknownError=d;const f="cancelled";t.Cancelled=f;const h="already_exists";t.AlreadyExists=h;const p="failed_precondition";t.FailedPrecondition=p;const m="aborted";t.Aborted=m;const v="out_of_range";t.OutOfRange=v;const g="data_loss";t.DataLoss=g})(JF||(JF={}));function sEe(t){if(t<400&&t>=100)return"ok";if(t>=400&&t<500)switch(t){case 401:return"unauthenticated";case 403:return"permission_denied";case 404:return"not_found";case 409:return"already_exists";case 413:return"failed_precondition";case 429:return"resource_exhausted";default:return"invalid_argument"}if(t>=500&&t<600)switch(t){case 501:return"unimplemented";case 503:return"unavailable";case 504:return"deadline_exceeded";default:return"internal_error"}return"unknown_error"}function zC(t,e){t.setTag("http.status_code",String(e)),t.setData("http.response.status_code",e);const n=sEe(e);n!=="unknown_error"&&t.setStatus(n)}function v0(t){if(typeof __SENTRY_TRACING__=="boolean"&&!__SENTRY_TRACING__)return!1;const e=Rr(),n=t||e&&e.getOptions();return!!n&&(n.enableTracing||"tracesSampleRate"in n||"tracesSampler"in n)}function DM(t){if(!v0())return;const e=oEe(t),n=jo(),r=t.scope?t.scope.getSpan():BN();if(t.onlyIfParent&&!r)return;const a=(t.scope||Fo()).clone();return aEe(n,{parentSpan:r,spanContext:e,forceTransaction:t.forceTransaction,scope:a})}function BN(){return Fo().getSpan()}function aEe(t,{parentSpan:e,spanContext:n,forceTransaction:r,scope:i}){if(!v0())return;const s=Qp();let a;if(e&&!r)a=e.startChild(n);else if(e){const o=ab(e),{traceId:l,spanId:u}=e.spanContext(),c=VC(e);a=t.startTransaction({traceId:l,parentSpanId:u,parentSampled:c,...n,metadata:{dynamicSamplingContext:o,...n.metadata}})}else{const{traceId:o,dsc:l,parentSpanId:u,sampled:c}={...s.getPropagationContext(),...i.getPropagationContext()};a=t.startTransaction({traceId:o,parentSpanId:u,parentSampled:c,...n,metadata:{dynamicSamplingContext:l,...n.metadata}})}return i.setSpan(a),lEe(a,i,s),a}function oEe(t){if(t.startTime){const e={...t};return e.startTimestamp=fV(t.startTime),delete e.startTime,e}return t}const Dae="_sentryScope",Wae="_sentryIsolationScope";function lEe(t,e,n){t&&(Kv(t,Wae,n),Kv(t,Dae,e))}function uEe(t){return{scope:t[Dae],isolationScope:t[Wae]}}const Nu="sentry.source",s1="sentry.sample_rate",r2="sentry.op",_d="sentry.origin",cEe="profile_id";class Aae{constructor(e=1e3){this._maxlen=e,this.spans=[]}add(e){this.spans.length>this._maxlen?e.spanRecorder=void 0:this.spans.push(e)}}class pV{constructor(e={}){this._traceId=e.traceId||Ci(),this._spanId=e.spanId||Ci().substring(16),this._startTime=e.startTimestamp||sy(),this.tags=e.tags?{...e.tags}:{},this.data=e.data?{...e.data}:{},this.instrumenter=e.instrumenter||"sentry",this._attributes={},this.setAttributes({[_d]:e.origin||"manual",[r2]:e.op,...e.attributes}),this._name=e.name||e.description,e.parentSpanId&&(this._parentSpanId=e.parentSpanId),"sampled"in e&&(this._sampled=e.sampled),e.status&&(this._status=e.status),e.endTimestamp&&(this._endTime=e.endTimestamp),e.exclusiveTime!==void 0&&(this._exclusiveTime=e.exclusiveTime),this._measurements=e.measurements?{...e.measurements}:{}}get name(){return this._name||""}set name(e){this.updateName(e)}get description(){return this._name}set description(e){this._name=e}get traceId(){return this._traceId}set traceId(e){this._traceId=e}get spanId(){return this._spanId}set spanId(e){this._spanId=e}set parentSpanId(e){this._parentSpanId=e}get parentSpanId(){return this._parentSpanId}get sampled(){return this._sampled}set sampled(e){this._sampled=e}get attributes(){return this._attributes}set attributes(e){this._attributes=e}get startTimestamp(){return this._startTime}set startTimestamp(e){this._startTime=e}get endTimestamp(){return this._endTime}set endTimestamp(e){this._endTime=e}get status(){return this._status}set status(e){this._status=e}get op(){return this._attributes[r2]}set op(e){this.setAttribute(r2,e)}get origin(){return this._attributes[_d]}set origin(e){this.setAttribute(_d,e)}spanContext(){const{_spanId:e,_traceId:n,_sampled:r}=this;return{spanId:e,traceId:n,traceFlags:r?Oae:U5e}}startChild(e){const n=new pV({...e,parentSpanId:this._spanId,sampled:this._sampled,traceId:this._traceId});n.spanRecorder=this.spanRecorder,n.spanRecorder&&n.spanRecorder.add(n);const r=qM(this);if(n.transaction=r,At&&r){const i=e&&e.op||"< unknown op >",s=As(n).description||"< unknown name >",a=r.spanContext().spanId,o=`[Tracing] Starting '${i}' span on transaction '${s}' (${a}).`;He.log(o),this._logMessage=o}return n}setTag(e,n){return this.tags={...this.tags,[e]:n},this}setData(e,n){return this.data={...this.data,[e]:n},this}setAttribute(e,n){n===void 0?delete this._attributes[e]:this._attributes[e]=n}setAttributes(e){Object.keys(e).forEach(n=>this.setAttribute(n,e[n]))}setStatus(e){return this._status=e,this}setHttpStatus(e){return zC(this,e),this}setName(e){this.updateName(e)}updateName(e){return this._name=e,this}isSuccess(){return this._status==="ok"}finish(e){return this.end(e)}end(e){if(this._endTime)return;const n=qM(this);if(At&&n&&n.spanContext().spanId!==this._spanId){const r=this._logMessage;r&&He.log(r.replace("Starting","Finishing"))}this._endTime=fV(e)}toTraceparent(){return dV(this)}toContext(){return to({data:this._getData(),description:this._name,endTimestamp:this._endTime,op:this.op,parentSpanId:this._parentSpanId,sampled:this._sampled,spanId:this._spanId,startTimestamp:this._startTime,status:this._status,tags:this.tags,traceId:this._traceId})}updateWithContext(e){return this.data=e.data||{},this._name=e.name||e.description,this._endTime=e.endTimestamp,this.op=e.op,this._parentSpanId=e.parentSpanId,this._sampled=e.sampled,this._spanId=e.spanId||this._spanId,this._startTime=e.startTimestamp||this._startTime,this._status=e.status,this.tags=e.tags||{},this._traceId=e.traceId||this._traceId,this}getTraceContext(){return RC(this)}getSpanJSON(){return to({data:this._getData(),description:this._name,op:this._attributes[r2],parent_span_id:this._parentSpanId,span_id:this._spanId,start_timestamp:this._startTime,status:this._status,tags:Object.keys(this.tags).length>0?this.tags:void 0,timestamp:this._endTime,trace_id:this._traceId,origin:this._attributes[_d],_metrics_summary:void 0,profile_id:this._attributes[cEe],exclusive_time:this._exclusiveTime,measurements:Object.keys(this._measurements).length>0?this._measurements:void 0})}isRecording(){return!this._endTime&&!!this._sampled}toJSON(){return this.getSpanJSON()}_getData(){const{data:e,_attributes:n}=this,r=Object.keys(e).length>0,i=Object.keys(n).length>0;if(!(!r&&!i))return r&&i?{...e,...n}:r?e:n}}class Gae extends pV{constructor(e,n){super(e),this._contexts={},this._hub=n||jo(),this._name=e.name||"",this._metadata={...e.metadata},this._trimEnd=e.trimEnd,this.transaction=this;const r=this._metadata.dynamicSamplingContext;r&&(this._frozenDynamicSamplingContext={...r})}get name(){return this._name}set name(e){this.setName(e)}get metadata(){return{source:"custom",spanMetadata:{},...this._metadata,...this._attributes[Nu]&&{source:this._attributes[Nu]},...this._attributes[s1]&&{sampleRate:this._attributes[s1]}}}set metadata(e){this._metadata=e}setName(e,n="custom"){this._name=e,this.setAttribute(Nu,n)}updateName(e){return this._name=e,this}initSpanRecorder(e=1e3){this.spanRecorder||(this.spanRecorder=new Aae(e)),this.spanRecorder.add(this)}setContext(e,n){n===null?delete this._contexts[e]:this._contexts[e]=n}setMeasurement(e,n,r=""){this._measurements[e]={value:n,unit:r}}setMetadata(e){this._metadata={...this._metadata,...e}}end(e){const n=fV(e),r=this._finishTransaction(n);if(r)return this._hub.captureEvent(r)}toContext(){const e=super.toContext();return to({...e,name:this._name,trimEnd:this._trimEnd})}updateWithContext(e){return super.updateWithContext(e),this._name=e.name||"",this._trimEnd=e.trimEnd,this}getDynamicSamplingContext(){return ab(this)}setHub(e){this._hub=e}getProfileId(){if(this._contexts!==void 0&&this._contexts.profile!==void 0)return this._contexts.profile.profile_id}_finishTransaction(e){if(this._endTime!==void 0)return;this._name||(At&&He.warn("Transaction has no name, falling back to ``."),this._name=""),super.end(e);const n=this._hub.getClient();if(n&&n.emit&&n.emit("finishTransaction",this),this._sampled!==!0){At&&He.log("[Tracing] Discarding transaction because its trace was not chosen to be sampled."),n&&n.recordDroppedEvent("sample_rate","transaction");return}const r=this.spanRecorder?this.spanRecorder.spans.filter(c=>c!==this&&As(c).timestamp):[];if(this._trimEnd&&r.length>0){const c=r.map(d=>As(d).timestamp).filter(Boolean);this._endTime=c.reduce((d,f)=>d>f?d:f)}const{scope:i,isolationScope:s}=uEe(this),{metadata:a}=this,{source:o}=a,l={contexts:{...this._contexts,trace:RC(this)},spans:r,start_timestamp:this._startTime,tags:this.tags,timestamp:this._endTime,transaction:this._name,type:"transaction",sdkProcessingMetadata:{...a,capturedSpanScope:i,capturedSpanIsolationScope:s,...to({dynamicSamplingContext:ab(this)})},_metrics_summary:void 0,...o&&{transaction_info:{source:o}}};return Object.keys(this._measurements).length>0&&(At&&He.log("[Measurements] Adding measurements to transaction",JSON.stringify(this._measurements,void 0,2)),l.measurements=this._measurements),At&&He.log(`[Tracing] Finishing ${this.op} transaction: ${this._name}.`),l}}const g7={idleTimeout:1e3,finalTimeout:3e4,heartbeatInterval:5e3},dEe="finishReason",Q0=["heartbeatFailed","idleTimeout","documentHidden","finalTimeout","externalFinish","cancelled"];class fEe extends Aae{constructor(e,n,r,i){super(i),this._pushActivity=e,this._popActivity=n,this.transactionSpanId=r}add(e){if(e.spanContext().spanId!==this.transactionSpanId){const n=e.end;e.end=(...r)=>(this._popActivity(e.spanContext().spanId),n.apply(e,r)),As(e).timestamp===void 0&&this._pushActivity(e.spanContext().spanId)}super.add(e)}}class hEe extends Gae{constructor(e,n,r=g7.idleTimeout,i=g7.finalTimeout,s=g7.heartbeatInterval,a=!1,o=!1){super(e,n),this._idleHub=n,this._idleTimeout=r,this._finalTimeout=i,this._heartbeatInterval=s,this._onScope=a,this.activities={},this._heartbeatCounter=0,this._finished=!1,this._idleTimeoutCanceledPermanently=!1,this._beforeFinishCallbacks=[],this._finishReason=Q0[4],this._autoFinishAllowed=!o,a&&(At&&He.log(`Setting idle transaction on scope. Span ID: ${this.spanContext().spanId}`),n.getScope().setSpan(this)),o||this._restartIdleTimeout(),setTimeout(()=>{this._finished||(this.setStatus("deadline_exceeded"),this._finishReason=Q0[3],this.end())},this._finalTimeout)}end(e){const n=fV(e);if(this._finished=!0,this.activities={},this.op==="ui.action.click"&&this.setAttribute(dEe,this._finishReason),this.spanRecorder){At&&He.log("[Tracing] finishing IdleTransaction",new Date(n*1e3).toISOString(),this.op);for(const r of this._beforeFinishCallbacks)r(this,n);this.spanRecorder.spans=this.spanRecorder.spans.filter(r=>{if(r.spanContext().spanId===this.spanContext().spanId)return!0;As(r).timestamp||(r.setStatus("cancelled"),r.end(n),At&&He.log("[Tracing] cancelling span since transaction ended early",JSON.stringify(r,void 0,2)));const{start_timestamp:i,timestamp:s}=As(r),a=i&&i{this._finished||this._pushActivity(i)},r=i=>{this._finished||this._popActivity(i)};this.spanRecorder=new fEe(n,r,this.spanContext().spanId,e),At&&He.log("Starting heartbeat"),this._pingHeartbeat()}this.spanRecorder.add(this)}cancelIdleTimeout(e,{restartOnChildSpanChange:n}={restartOnChildSpanChange:!0}){this._idleTimeoutCanceledPermanently=n===!1,this._idleTimeoutID&&(clearTimeout(this._idleTimeoutID),this._idleTimeoutID=void 0,Object.keys(this.activities).length===0&&this._idleTimeoutCanceledPermanently&&(this._finishReason=Q0[5],this.end(e)))}setFinishReason(e){this._finishReason=e}sendAutoFinishSignal(){this._autoFinishAllowed||(At&&He.log("[Tracing] Received finish signal for idle transaction."),this._restartIdleTimeout(),this._autoFinishAllowed=!0)}_restartIdleTimeout(e){this.cancelIdleTimeout(),this._idleTimeoutID=setTimeout(()=>{!this._finished&&Object.keys(this.activities).length===0&&(this._finishReason=Q0[1],this.end(e))},this._idleTimeout)}_pushActivity(e){this.cancelIdleTimeout(void 0,{restartOnChildSpanChange:!this._idleTimeoutCanceledPermanently}),At&&He.log(`[Tracing] pushActivity: ${e}`),this.activities[e]=!0,At&&He.log("[Tracing] new activities count",Object.keys(this.activities).length)}_popActivity(e){if(this.activities[e]&&(At&&He.log(`[Tracing] popActivity ${e}`),delete this.activities[e],At&&He.log("[Tracing] new activities count",Object.keys(this.activities).length)),Object.keys(this.activities).length===0){const n=sy();this._idleTimeoutCanceledPermanently?this._autoFinishAllowed&&(this._finishReason=Q0[5],this.end(n)):this._restartIdleTimeout(n+this._idleTimeout/1e3)}}_beat(){if(this._finished)return;const e=Object.keys(this.activities).join("");e===this._prevHeartbeatString?this._heartbeatCounter++:this._heartbeatCounter=1,this._prevHeartbeatString=e,this._heartbeatCounter>=3?this._autoFinishAllowed&&(At&&He.log("[Tracing] Transaction finished because of no change for 3 heart beats"),this.setStatus("deadline_exceeded"),this._finishReason=Q0[0],this.end()):this._pingHeartbeat()}_pingHeartbeat(){At&&He.log(`pinging Heartbeat -> current counter: ${this._heartbeatCounter}`),setTimeout(()=>{this._beat()},this._heartbeatInterval)}}function Fae(t,e,n){if(!v0(e))return t.sampled=!1,t;if(t.sampled!==void 0)return t.setAttribute(s1,Number(t.sampled)),t;let r;return typeof e.tracesSampler=="function"?(r=e.tracesSampler(n),t.setAttribute(s1,Number(r))):n.parentSampled!==void 0?r=n.parentSampled:typeof e.tracesSampleRate<"u"?(r=e.tracesSampleRate,t.setAttribute(s1,Number(r))):(r=1,t.setAttribute(s1,r)),jae(r)?r?(t.sampled=Math.random()1?(At&&He.warn(`[Tracing] Given sample rate is invalid. Sample rate must be between 0 and 1. Got ${t}.`),!1):!0}function pEe(){const e=this.getScope().getSpan();return e?{"sentry-trace":dV(e)}:{}}function mEe(t,e){const n=this.getClient(),r=n&&n.getOptions()||{},i=r.instrumenter||"sentry",s=t.instrumenter||"sentry";i!==s&&(At&&He.error(`A transaction was started with instrumenter=\`${s}\`, but the SDK is configured with the \`${i}\` instrumenter. +The transaction will not be sampled. Please use the ${i} instrumentation to start transactions.`),t.sampled=!1);let a=new Gae(t,this);return a=Fae(a,r,{name:t.name,parentSampled:t.parentSampled,transactionContext:t,attributes:{...t.data,...t.attributes},...e}),a.isRecording()&&a.initSpanRecorder(r._experiments&&r._experiments.maxSpans),n&&n.emit&&n.emit("startTransaction",a),a}function YF(t,e,n,r,i,s,a,o=!1){const l=t.getClient(),u=l&&l.getOptions()||{};let c=new hEe(e,t,n,r,a,i,o);return c=Fae(c,u,{name:e.name,parentSampled:e.parentSampled,transactionContext:e,attributes:{...e.data,...e.attributes},...s}),c.isRecording()&&c.initSpanRecorder(u._experiments&&u._experiments.maxSpans),l&&l.emit&&l.emit("startTransaction",c),c}function vEe(){const t=aT();t.__SENTRY__&&(t.__SENTRY__.extensions=t.__SENTRY__.extensions||{},t.__SENTRY__.extensions.startTransaction||(t.__SENTRY__.extensions.startTransaction=mEe),t.__SENTRY__.extensions.traceHeaders||(t.__SENTRY__.extensions.traceHeaders=pEe),iEe())}function gEe(t,e,n){const r=Dv();r&&r.setMeasurement(t,e,n)}function bEe(t,e){return e&&(t.sdk=t.sdk||{},t.sdk.name=t.sdk.name||e.name,t.sdk.version=t.sdk.version||e.version,t.sdk.integrations=[...t.sdk.integrations||[],...e.integrations||[]],t.sdk.packages=[...t.sdk.packages||[],...e.packages||[]]),t}function yEe(t,e,n,r){const i=MC(n),s={sent_at:new Date().toISOString(),...i&&{sdk:i},...!!r&&e&&{dsn:iy(e)}},a="aggregates"in t?[{type:"sessions"},t]:[{type:"session"},t.toJSON()];return Hp(s,[a])}function SEe(t,e,n,r){const i=MC(n),s=t.type&&t.type!=="replay_event"?t.type:"event";bEe(t,n&&n.sdk);const a=Pae(t,i,r,e);return delete t.sdkProcessingMetadata,Hp(a,[[{type:s},t]])}const xEe="7";function TEe(t){const e=t.protocol?`${t.protocol}:`:"",n=t.port?`:${t.port}`:"";return`${e}//${t.host}${n}${t.path?`/${t.path}`:""}/api/`}function wEe(t){return`${TEe(t)}${t.projectId}/envelope/`}function EEe(t,e){return U2e({sentry_key:t.publicKey,sentry_version:xEe,...e&&{sentry_client:`${e.name}/${e.version}`}})}function MEe(t,e={}){const n=typeof e=="string"?e:e.tunnel,r=typeof e=="string"||!e._metadata?void 0:e._metadata.sdk;return n||`${wEe(t)}?${EEe(t,r)}`}const BF=[];function PEe(t){const e={};return t.forEach(n=>{const{name:r}=n,i=e[r];i&&!i.isDefaultInstance&&n.isDefaultInstance||(e[r]=n)}),Object.keys(e).map(n=>e[n])}function REe(t){const e=t.defaultIntegrations||[],n=t.integrations;e.forEach(a=>{a.isDefaultInstance=!0});let r;Array.isArray(n)?r=[...e,...n]:typeof n=="function"?r=SC(n(e)):r=e;const i=PEe(r),s=zEe(i,a=>a.name==="Debug");if(s!==-1){const[a]=i.splice(s,1);i.push(a)}return i}function VEe(t,e){const n={};return e.forEach(r=>{r&&Zae(t,r,n)}),n}function HF(t,e){for(const n of e)n&&n.afterAllSetup&&n.afterAllSetup(t)}function Zae(t,e,n){if(n[e.name]){At&&He.log(`Integration skipped because it was already installed: ${e.name}`);return}if(n[e.name]=e,BF.indexOf(e.name)===-1&&(e.setupOnce(O5e,jo),BF.push(e.name)),e.setup&&typeof e.setup=="function"&&e.setup(t),t.on&&typeof e.preprocessEvent=="function"){const r=e.preprocessEvent.bind(e);t.on("preprocessEvent",(i,s)=>r(i,s,t))}if(t.addEventProcessor&&typeof e.processEvent=="function"){const r=e.processEvent.bind(e),i=Object.assign((s,a)=>r(s,a,t),{id:e.name});t.addEventProcessor(i)}At&&He.log(`Integration installed: ${e.name}`)}function zEe(t,e){for(let n=0;n0?`|#${r.map(([s,a])=>`${s}:${a}`).join(",")}`:"";e+=`${n.name}@${n.unit}:${n.metric}|${n.metricType}${i}|T${n.timestamp} +`}return e}function OEe(t,e,n,r){const i={sent_at:new Date().toISOString()};n&&n.sdk&&(i.sdk={name:n.sdk.name,version:n.sdk.version}),r&&e&&(i.dsn=iy(e));const s=IEe(t);return Hp(i,[s])}function IEe(t){const e=kEe(t);return[{type:"statsd",length:e.length},e]}const QF="Not capturing exception because it's already been captured.";class UEe{constructor(e){if(this._options=e,this._integrations={},this._integrationsInitialized=!1,this._numProcessing=0,this._outcomes={},this._hooks={},this._eventProcessors=[],e.dsn?this._dsn=I2e(e.dsn):At&&He.warn("No DSN provided, client will not send events."),this._dsn){const n=MEe(this._dsn,e);this._transport=e.transport({tunnel:this._options.tunnel,recordDroppedEvent:this.recordDroppedEvent.bind(this),...e.transportOptions,url:n})}}captureException(e,n,r){if(OF(e)){At&&He.log(QF);return}let i=n&&n.event_id;return this._process(this.eventFromException(e,n).then(s=>this._captureEvent(s,n,r)).then(s=>{i=s})),i}captureMessage(e,n,r,i){let s=r&&r.event_id;const a=vC(e)?e:String(e),o=gC(e)?this.eventFromMessage(a,n,r):this.eventFromException(e,r);return this._process(o.then(l=>this._captureEvent(l,r,i)).then(l=>{s=l})),s}captureEvent(e,n,r){if(n&&n.originalException&&OF(n.originalException)){At&&He.log(QF);return}let i=n&&n.event_id;const a=(e.sdkProcessingMetadata||{}).capturedSpanScope;return this._process(this._captureEvent(e,n,a||r).then(o=>{i=o})),i}captureSession(e){typeof e.release!="string"?At&&He.warn("Discarded session because of missing or non-string release"):(this.sendSession(e),qv(e,{init:!1}))}getDsn(){return this._dsn}getOptions(){return this._options}getSdkMetadata(){return this._options._metadata}getTransport(){return this._transport}flush(e){const n=this._transport;return n?(this.metricsAggregator&&this.metricsAggregator.flush(),this._isClientDoneProcessing(e).then(r=>n.flush(e).then(i=>r&&i))):sb(!0)}close(e){return this.flush(e).then(n=>(this.getOptions().enabled=!1,this.metricsAggregator&&this.metricsAggregator.close(),n))}getEventProcessors(){return this._eventProcessors}addEventProcessor(e){this._eventProcessors.push(e)}setupIntegrations(e){(e&&!this._integrationsInitialized||this._isEnabled()&&!this._integrationsInitialized)&&this._setupIntegrations()}init(){this._isEnabled()&&this._setupIntegrations()}getIntegrationById(e){return this.getIntegrationByName(e)}getIntegrationByName(e){return this._integrations[e]}getIntegration(e){try{return this._integrations[e.id]||null}catch{return At&&He.warn(`Cannot retrieve integration ${e.id} from the current Client`),null}}addIntegration(e){const n=this._integrations[e.name];Zae(this,e,this._integrations),n||HF(this,[e])}sendEvent(e,n={}){this.emit("beforeSendEvent",e,n);let r=SEe(e,this._dsn,this._options._metadata,this._options.tunnel);for(const s of n.attachments||[])r=x5e(r,E5e(s,this._options.transportOptions&&this._options.transportOptions.textEncoder));const i=this._sendEnvelope(r);i&&i.then(s=>this.emit("afterSendEvent",e,s),null)}sendSession(e){const n=yEe(e,this._dsn,this._options._metadata,this._options.tunnel);this._sendEnvelope(n)}recordDroppedEvent(e,n,r){if(this._options.sendClientReports){const i=typeof r=="number"?r:1,s=`${e}:${n}`;At&&He.log(`Recording outcome: "${s}"${i>1?` (${i} times)`:""}`),this._outcomes[s]=(this._outcomes[s]||0)+i}}captureAggregateMetrics(e){At&&He.log(`Flushing aggregated metrics, number of metrics: ${e.length}`);const n=OEe(e,this._dsn,this._options._metadata,this._options.tunnel);this._sendEnvelope(n)}on(e,n){this._hooks[e]||(this._hooks[e]=[]),this._hooks[e].push(n)}emit(e,...n){this._hooks[e]&&this._hooks[e].forEach(r=>r(...n))}_setupIntegrations(){const{integrations:e}=this._options;this._integrations=VEe(this,e),HF(this,e),this._integrationsInitialized=!0}_updateSessionFromEvent(e,n){let r=!1,i=!1;const s=n.exception&&n.exception.values;if(s){i=!0;for(const l of s){const u=l.mechanism;if(u&&u.handled===!1){r=!0;break}}}const a=e.status==="ok";(a&&e.errors===0||a&&r)&&(qv(e,{...r&&{status:"crashed"},errors:e.errors||Number(i||r)}),this.captureSession(e))}_isClientDoneProcessing(e){return new il(n=>{let r=0;const i=1,s=setInterval(()=>{this._numProcessing==0?(clearInterval(s),n(!0)):(r+=i,e&&r>=e&&(clearInterval(s),n(!1)))},i)})}_isEnabled(){return this.getOptions().enabled!==!1&&this._transport!==void 0}_prepareEvent(e,n,r,i=Qp()){const s=this.getOptions(),a=Object.keys(this._integrations);return!n.integrations&&a.length>0&&(n.integrations=a),this.emit("preprocessEvent",e,n),Iae(s,e,n,r,this,i).then(o=>{if(o===null)return o;const l={...i.getPropagationContext(),...r?r.getPropagationContext():void 0};if(!(o.contexts&&o.contexts.trace)&&l){const{traceId:c,spanId:d,parentSpanId:f,dsc:h}=l;o.contexts={trace:{trace_id:c,span_id:d,parent_span_id:f},...o.contexts};const p=h||hV(c,this,r);o.sdkProcessingMetadata={dynamicSamplingContext:p,...o.sdkProcessingMetadata}}return o})}_captureEvent(e,n={},r){return this._processEvent(e,n,r).then(i=>i.event_id,i=>{if(At){const s=i;s.logLevel==="log"?He.log(s.message):He.warn(s)}})}_processEvent(e,n,r){const i=this.getOptions(),{sampleRate:s}=i,a=Yae(e),o=Jae(e),l=e.type||"error",u=`before send for type \`${l}\``;if(o&&typeof s=="number"&&Math.random()>s)return this.recordDroppedEvent("sample_rate","error",e),wC(new Uc(`Discarding event because it's not included in the random sample (sampling rate = ${s})`,"log"));const c=l==="replay_event"?"replay":l,f=(e.sdkProcessingMetadata||{}).capturedSpanIsolationScope;return this._prepareEvent(e,n,r,f).then(h=>{if(h===null)throw this.recordDroppedEvent("event_processor",c,e),new Uc("An event processor returned `null`, will not send event.","log");if(n.data&&n.data.__sentry__===!0)return h;const m=LEe(i,h,n);return NEe(m,u)}).then(h=>{if(h===null){if(this.recordDroppedEvent("before_send",c,e),a){const g=1+(e.spans||[]).length;this.recordDroppedEvent("before_send","span",g)}throw new Uc(`${u} returned \`null\`, will not send event.`,"log")}const p=r&&r.getSession();if(!a&&p&&this._updateSessionFromEvent(p,h),a){const v=h.sdkProcessingMetadata&&h.sdkProcessingMetadata.spanCountBeforeProcessing||0,g=h.spans?h.spans.length:0,b=v-g;b>0&&this.recordDroppedEvent("before_send","span",b)}const m=h.transaction_info;if(a&&m&&h.transaction!==e.transaction){const v="custom";h.transaction_info={...m,source:v}}return this.sendEvent(h,n),h}).then(null,h=>{throw h instanceof Uc?h:(this.captureException(h,{data:{__sentry__:!0},originalException:h}),new Uc(`Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event. +Reason: ${h}`))})}_process(e){this._numProcessing++,e.then(n=>(this._numProcessing--,n),n=>(this._numProcessing--,n))}_sendEnvelope(e){if(this.emit("beforeEnvelope",e),this._isEnabled()&&this._transport)return this._transport.send(e).then(null,n=>{At&&He.error("Error while sending event:",n)});At&&He.error("Transport disabled")}_clearOutcomes(){const e=this._outcomes;return this._outcomes={},Object.keys(e).map(n=>{const[r,i]=n.split(":");return{reason:r,category:i,quantity:e[n]}})}}function NEe(t,e){const n=`${e} must return \`null\` or a valid event.`;if(lV(t))return t.then(r=>{if(!ib(r)&&r!==null)throw new Uc(n);return r},r=>{throw new Uc(`${e} rejected with ${r}`)});if(!ib(t)&&t!==null)throw new Uc(n);return t}function LEe(t,e,n){const{beforeSend:r,beforeSendTransaction:i}=t;if(Jae(e)&&r)return r(e,n);if(Yae(e)&&i){if(e.spans){const s=e.spans.length;e.sdkProcessingMetadata={...e.sdkProcessingMetadata,spanCountBeforeProcessing:s}}return i(e,n)}return e}function Jae(t){return t.type===void 0}function Yae(t){return t.type==="transaction"}function XEe(t){const e=Rr();!e||!e.addEventProcessor||e.addEventProcessor(t)}function CEe(t,e){e.debug===!0&&(At?He.enable():Qc(()=>{console.warn("[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.")})),Fo().update(e.initialScope);const r=new t(e);KEe(r),qEe(r)}function KEe(t){const n=jo().getStackTop();n.client=t,n.scope.setClient(t)}function qEe(t){t.init?t.init():t.setupIntegrations&&t.setupIntegrations()}const DEe=30;function Bae(t,e,n=c5e(t.bufferSize||DEe)){let r={};const i=a=>n.drain(a);function s(a){const o=[];if(CF(a,(d,f)=>{const h=KF(f);if(Rae(r,h)){const p=_F(d,f);t.recordDroppedEvent("ratelimit_backoff",h,p)}else o.push(d)}),o.length===0)return sb();const l=Hp(a[0],o),u=d=>{CF(l,(f,h)=>{const p=_F(f,h);t.recordDroppedEvent(d,KF(h),p)})},c=()=>e({body:T5e(l,t.textEncoder)}).then(d=>(d.statusCode!==void 0&&(d.statusCode<200||d.statusCode>=300)&&At&&He.warn(`Sentry responded with status code ${d.statusCode} to sent event.`),r=Vae(r,d),d),d=>{throw u("network_error"),d});return n.add(c).then(d=>d,d=>{if(d instanceof Uc)return At&&He.error("Skipped sending event because buffer is full."),u("queue_overflow"),sb();throw d})}return s.__sentry__baseTransport__=!0,{send:s,flush:i}}function _F(t,e){if(!(e!=="event"&&e!=="transaction"))return Array.isArray(t)?t[1]:void 0}function WEe(t,e){const n={sent_at:new Date().toISOString()};e&&(n.dsn=iy(e));const r=t.map(AEe);return Hp(n,r)}function AEe(t){return[{type:"span"},t]}function GEe(t,e){const n=e&&ZEe(e)?e.getClient():e,r=n&&n.getDsn(),i=n&&n.getOptions().tunnel;return jEe(t,r)||FEe(t,i)}function FEe(t,e){return e?$F(t)===$F(e):!1}function jEe(t,e){return e?t.includes(e.host):!1}function $F(t){return t[t.length-1]==="/"?t.slice(0,-1):t}function ZEe(t){return t.getClient!==void 0}function JEe(t,e,n=[e],r="npm"){const i=t._metadata||{};i.sdk||(i.sdk={name:`sentry.javascript.${e}`,packages:n.map(s=>({name:`${r}:@sentry/${s}`,version:Bx})),version:Bx}),t._metadata=i}const YEe=[/^Script error\.?$/,/^Javascript error: Script error\.? on line 0$/,/^ResizeObserver loop completed with undelivered notifications.$/,/^Cannot redefine property: googletag$/],BEe=[/^.*\/healthcheck$/,/^.*\/healthy$/,/^.*\/live$/,/^.*\/ready$/,/^.*\/heartbeat$/,/^.*\/health$/,/^.*\/healthz$/],Hae="InboundFilters",HEe=(t={})=>({name:Hae,setupOnce(){},processEvent(e,n,r){const i=r.getOptions(),s=QEe(t,i);return _Ee(e,s)?null:e}}),Qae=HEe;Xf(Hae,Qae);function QEe(t={},e={}){return{allowUrls:[...t.allowUrls||[],...e.allowUrls||[]],denyUrls:[...t.denyUrls||[],...e.denyUrls||[]],ignoreErrors:[...t.ignoreErrors||[],...e.ignoreErrors||[],...t.disableErrorDefaults?[]:YEe],ignoreTransactions:[...t.ignoreTransactions||[],...e.ignoreTransactions||[],...t.disableTransactionDefaults?[]:BEe],ignoreInternal:t.ignoreInternal!==void 0?t.ignoreInternal:!0}}function _Ee(t,e){return e.ignoreInternal&&i7e(t)?(At&&He.warn(`Event dropped due to being internal Sentry Error. +Event: ${Kh(t)}`),!0):$Ee(t,e.ignoreErrors)?(At&&He.warn(`Event dropped due to being matched by \`ignoreErrors\` option. +Event: ${Kh(t)}`),!0):e7e(t,e.ignoreTransactions)?(At&&He.warn(`Event dropped due to being matched by \`ignoreTransactions\` option. +Event: ${Kh(t)}`),!0):t7e(t,e.denyUrls)?(At&&He.warn(`Event dropped due to being matched by \`denyUrls\` option. Event: ${Kh(t)}. -Url: ${AM(t)}`),!0):t7e(t,e.allowUrls)?!1:(At&&He.warn(`Event dropped due to not being matched by \`allowUrls\` option. +Url: ${WM(t)}`),!0):n7e(t,e.allowUrls)?!1:(At&&He.warn(`Event dropped due to not being matched by \`allowUrls\` option. Event: ${Kh(t)}. -Url: ${AM(t)}`),!0)}function _Ee(t,e){return t.type||!e||!e.length?!1:n7e(t).some(n=>ny(n,e))}function $Ee(t,e){if(t.type!=="transaction"||!e||!e.length)return!1;const n=t.transaction;return n?ny(n,e):!1}function e7e(t,e){if(!e||!e.length)return!1;const n=AM(t);return n?ny(n,e):!1}function t7e(t,e){if(!e||!e.length)return!0;const n=AM(t);return n?ny(n,e):!0}function n7e(t){const e=[];t.message&&e.push(t.message);let n;try{n=t.exception.values[t.exception.values.length-1]}catch{}return n&&n.value&&(e.push(n.value),n.type&&e.push(`${n.type}: ${n.value}`)),At&&e.length===0&&He.error(`Could not extract message for event ${Kh(t)}`),e}function r7e(t){try{return t.exception.values[0].type==="SentryError"}catch{}return!1}function i7e(t=[]){for(let e=t.length-1;e>=0;e--){const n=t[e];if(n&&n.filename!==""&&n.filename!=="[native code]")return n.filename||null}return null}function AM(t){try{let e;try{e=t.exception.values[0].stacktrace.frames}catch{}return e?i7e(e):null}catch{return At&&He.error(`Cannot extract url for event ${Kh(t)}`),null}}let nj;const $ae="FunctionToString",rj=new WeakMap,s7e=()=>({name:$ae,setupOnce(){nj=Function.prototype.toString;try{Function.prototype.toString=function(...t){const e=bC(this),n=rj.has(Rr())&&e!==void 0?e:this;return nj.apply(n,t)}}catch{}},setup(t){rj.set(t,!0)}}),eoe=s7e;Xf($ae,eoe);const _r=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,pn=Gn;function a7e(){pn.document?pn.document.addEventListener("visibilitychange",()=>{const t=Dv();if(pn.document.hidden&&t){const e="cancelled",{op:n,status:r}=As(t);_r&&He.log(`[Tracing] Transaction: ${e} -> since tab moved to the background, op: ${n}`),r||t.setStatus(e),t.setTag("visibilitychange","document.hidden"),t.end()}}):_r&&He.warn("[Tracing] Could not set up background tab detection due to lack of global document")}const lT=(t,e,n)=>{let r,i;return s=>{e.value>=0&&(s||n)&&(i=e.value-(r||0),(i||r===void 0)&&(r=e.value,e.delta=i,t(e)))}},o7e=()=>`v3-${Date.now()}-${Math.floor(Math.random()*(9e12-1))+1e12}`,l7e=()=>{const t=pn.performance.timing,e=pn.performance.navigation.type,n={entryType:"navigation",startTime:0,type:e==2?"back_forward":e===1?"reload":"navigate"};for(const r in t)r!=="navigationStart"&&r!=="toJSON"&&(n[r]=Math.max(t[r]-t.navigationStart,0));return n},mV=()=>pn.__WEB_VITALS_POLYFILL__?pn.performance&&(performance.getEntriesByType&&performance.getEntriesByType("navigation")[0]||l7e()):pn.performance&&performance.getEntriesByType&&performance.getEntriesByType("navigation")[0],zC=()=>{const t=mV();return t&&t.activationStart||0},uT=(t,e)=>{const n=mV();let r="navigate";return n&&(pn.document&&pn.document.prerendering||zC()>0?r="prerender":r=n.type.replace(/_/g,"-")),{name:t,value:typeof e>"u"?-1:e,rating:"good",delta:0,entries:[],id:o7e(),navigationType:r}},oy=(t,e,n)=>{try{if(PerformanceObserver.supportedEntryTypes.includes(t)){const r=new PerformanceObserver(i=>{e(i.getEntries())});return r.observe(Object.assign({type:t,buffered:!0},n||{})),r}}catch{}},cT=(t,e)=>{const n=r=>{(r.type==="pagehide"||pn.document.visibilityState==="hidden")&&(t(r),e&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};pn.document&&(addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0))},u7e=(t,e={})=>{const n=uT("CLS",0);let r,i=0,s=[];const a=l=>{l.forEach(u=>{if(!u.hadRecentInput){const c=s[0],d=s[s.length-1];i&&s.length!==0&&u.startTime-d.startTime<1e3&&u.startTime-c.startTime<5e3?(i+=u.value,s.push(u)):(i=u.value,s=[u]),i>n.value&&(n.value=i,n.entries=s,r&&r())}})},o=oy("layout-shift",a);if(o){r=lT(t,n,e.reportAllChanges);const l=()=>{a(o.takeRecords()),r(!0)};return cT(l),l}};let GM=-1;const c7e=()=>{pn.document&&pn.document.visibilityState&&(GM=pn.document.visibilityState==="hidden"&&!pn.document.prerendering?0:1/0)},d7e=()=>{cT(({timeStamp:t})=>{GM=t},!0)},kC=()=>(GM<0&&(c7e(),d7e()),{get firstHiddenTime(){return GM}}),f7e=t=>{const e=kC(),n=uT("FID");let r;const i=o=>{o.startTime{o.forEach(i)},a=oy("first-input",s);r=lT(t,n),a&&cT(()=>{s(a.takeRecords()),a.disconnect()},!0)};let toe=0,Zz=1/0,i2=0;const h7e=t=>{t.forEach(e=>{e.interactionId&&(Zz=Math.min(Zz,e.interactionId),i2=Math.max(i2,e.interactionId),toe=i2?(i2-Zz)/7+1:0)})};let HN;const p7e=()=>HN?toe:performance.interactionCount||0,m7e=()=>{"interactionCount"in performance||HN||(HN=oy("event",h7e,{type:"event",buffered:!0,durationThreshold:0}))},noe=()=>p7e(),ij=10,Ad=[],Jz={},sj=t=>{const e=Ad[Ad.length-1],n=Jz[t.interactionId];if(n||Ad.lengthe.latency){if(n)n.entries.push(t),n.latency=Math.max(n.latency,t.duration);else{const r={id:t.interactionId,latency:t.duration,entries:[t]};Jz[r.id]=r,Ad.push(r)}Ad.sort((r,i)=>i.latency-r.latency),Ad.splice(ij).forEach(r=>{delete Jz[r.id]})}},v7e=()=>{const t=Math.min(Ad.length-1,Math.floor(noe()/50));return Ad[t]},g7e=(t,e)=>{e=e||{},m7e();const n=uT("INP");let r;const i=a=>{a.forEach(l=>{l.interactionId&&sj(l),l.entryType==="first-input"&&!Ad.some(c=>c.entries.some(d=>l.duration===d.duration&&l.startTime===d.startTime))&&sj(l)});const o=v7e();o&&o.latency!==n.value&&(n.value=o.latency,n.entries=o.entries,r())},s=oy("event",i,{durationThreshold:e.durationThreshold||40});r=lT(t,n,e.reportAllChanges),s&&(s.observe({type:"first-input",buffered:!0}),cT(()=>{i(s.takeRecords()),n.value<0&&noe()>0&&(n.value=0,n.entries=[]),r(!0)}))},aj={},b7e=t=>{const e=kC(),n=uT("LCP");let r;const i=a=>{const o=a[a.length-1];if(o){const l=Math.max(o.startTime-zC(),0);l{aj[n.id]||(i(s.takeRecords()),s.disconnect(),aj[n.id]=!0,r(!0))};return["keydown","click"].forEach(o=>{pn.document&&addEventListener(o,a,{once:!0,capture:!0})}),cT(a,!0),a}},QN=t=>{pn.document&&(pn.document.prerendering?addEventListener("prerenderingchange",()=>QN(t),!0):pn.document.readyState!=="complete"?addEventListener("load",()=>QN(t),!0):setTimeout(t,0))},y7e=(t,e)=>{e=e||{};const n=uT("TTFB"),r=lT(t,n,e.reportAllChanges);QN(()=>{const i=mV();if(i){if(n.value=Math.max(i.responseStart-zC(),0),n.value<0||n.value>performance.now())return;n.entries=[i],r(!0)}})},Q3={},FM={};let roe,ioe,soe,aoe,ooe;function S7e(t,e=!1){return dT("cls",t,E7e,roe,e)}function loe(t,e=!1){return dT("lcp",t,P7e,soe,e)}function x7e(t){return dT("ttfb",t,R7e,aoe)}function T7e(t){return dT("fid",t,M7e,ioe)}function w7e(t){return dT("inp",t,V7e,ooe)}function ob(t,e){return uoe(t,e),FM[t]||(z7e(t),FM[t]=!0),coe(t,e)}function ly(t,e){const n=Q3[t];if(!(!n||!n.length))for(const r of n)try{r(e)}catch(i){_r&&He.error(`Error while triggering instrumentation handler. +Url: ${WM(t)}`),!0)}function $Ee(t,e){return t.type||!e||!e.length?!1:r7e(t).some(n=>ny(n,e))}function e7e(t,e){if(t.type!=="transaction"||!e||!e.length)return!1;const n=t.transaction;return n?ny(n,e):!1}function t7e(t,e){if(!e||!e.length)return!1;const n=WM(t);return n?ny(n,e):!1}function n7e(t,e){if(!e||!e.length)return!0;const n=WM(t);return n?ny(n,e):!0}function r7e(t){const e=[];t.message&&e.push(t.message);let n;try{n=t.exception.values[t.exception.values.length-1]}catch{}return n&&n.value&&(e.push(n.value),n.type&&e.push(`${n.type}: ${n.value}`)),At&&e.length===0&&He.error(`Could not extract message for event ${Kh(t)}`),e}function i7e(t){try{return t.exception.values[0].type==="SentryError"}catch{}return!1}function s7e(t=[]){for(let e=t.length-1;e>=0;e--){const n=t[e];if(n&&n.filename!==""&&n.filename!=="[native code]")return n.filename||null}return null}function WM(t){try{let e;try{e=t.exception.values[0].stacktrace.frames}catch{}return e?s7e(e):null}catch{return At&&He.error(`Cannot extract url for event ${Kh(t)}`),null}}let ej;const _ae="FunctionToString",tj=new WeakMap,a7e=()=>({name:_ae,setupOnce(){ej=Function.prototype.toString;try{Function.prototype.toString=function(...t){const e=yC(this),n=tj.has(Rr())&&e!==void 0?e:this;return ej.apply(n,t)}}catch{}},setup(t){tj.set(t,!0)}}),$ae=a7e;Xf(_ae,$ae);const _r=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,pn=Gn;function o7e(){pn.document?pn.document.addEventListener("visibilitychange",()=>{const t=Dv();if(pn.document.hidden&&t){const e="cancelled",{op:n,status:r}=As(t);_r&&He.log(`[Tracing] Transaction: ${e} -> since tab moved to the background, op: ${n}`),r||t.setStatus(e),t.setTag("visibilitychange","document.hidden"),t.end()}}):_r&&He.warn("[Tracing] Could not set up background tab detection due to lack of global document")}const oT=(t,e,n)=>{let r,i;return s=>{e.value>=0&&(s||n)&&(i=e.value-(r||0),(i||r===void 0)&&(r=e.value,e.delta=i,t(e)))}},l7e=()=>`v3-${Date.now()}-${Math.floor(Math.random()*(9e12-1))+1e12}`,u7e=()=>{const t=pn.performance.timing,e=pn.performance.navigation.type,n={entryType:"navigation",startTime:0,type:e==2?"back_forward":e===1?"reload":"navigate"};for(const r in t)r!=="navigationStart"&&r!=="toJSON"&&(n[r]=Math.max(t[r]-t.navigationStart,0));return n},mV=()=>pn.__WEB_VITALS_POLYFILL__?pn.performance&&(performance.getEntriesByType&&performance.getEntriesByType("navigation")[0]||u7e()):pn.performance&&performance.getEntriesByType&&performance.getEntriesByType("navigation")[0],kC=()=>{const t=mV();return t&&t.activationStart||0},lT=(t,e)=>{const n=mV();let r="navigate";return n&&(pn.document&&pn.document.prerendering||kC()>0?r="prerender":r=n.type.replace(/_/g,"-")),{name:t,value:typeof e>"u"?-1:e,rating:"good",delta:0,entries:[],id:l7e(),navigationType:r}},oy=(t,e,n)=>{try{if(PerformanceObserver.supportedEntryTypes.includes(t)){const r=new PerformanceObserver(i=>{e(i.getEntries())});return r.observe(Object.assign({type:t,buffered:!0},n||{})),r}}catch{}},uT=(t,e)=>{const n=r=>{(r.type==="pagehide"||pn.document.visibilityState==="hidden")&&(t(r),e&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};pn.document&&(addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0))},c7e=(t,e={})=>{const n=lT("CLS",0);let r,i=0,s=[];const a=l=>{l.forEach(u=>{if(!u.hadRecentInput){const c=s[0],d=s[s.length-1];i&&s.length!==0&&u.startTime-d.startTime<1e3&&u.startTime-c.startTime<5e3?(i+=u.value,s.push(u)):(i=u.value,s=[u]),i>n.value&&(n.value=i,n.entries=s,r&&r())}})},o=oy("layout-shift",a);if(o){r=oT(t,n,e.reportAllChanges);const l=()=>{a(o.takeRecords()),r(!0)};return uT(l),l}};let AM=-1;const d7e=()=>{pn.document&&pn.document.visibilityState&&(AM=pn.document.visibilityState==="hidden"&&!pn.document.prerendering?0:1/0)},f7e=()=>{uT(({timeStamp:t})=>{AM=t},!0)},OC=()=>(AM<0&&(d7e(),f7e()),{get firstHiddenTime(){return AM}}),h7e=t=>{const e=OC(),n=lT("FID");let r;const i=o=>{o.startTime{o.forEach(i)},a=oy("first-input",s);r=oT(t,n),a&&uT(()=>{s(a.takeRecords()),a.disconnect()},!0)};let eoe=0,Zz=1/0,i2=0;const p7e=t=>{t.forEach(e=>{e.interactionId&&(Zz=Math.min(Zz,e.interactionId),i2=Math.max(i2,e.interactionId),eoe=i2?(i2-Zz)/7+1:0)})};let HN;const m7e=()=>HN?eoe:performance.interactionCount||0,v7e=()=>{"interactionCount"in performance||HN||(HN=oy("event",p7e,{type:"event",buffered:!0,durationThreshold:0}))},toe=()=>m7e(),nj=10,Ad=[],Jz={},rj=t=>{const e=Ad[Ad.length-1],n=Jz[t.interactionId];if(n||Ad.lengthe.latency){if(n)n.entries.push(t),n.latency=Math.max(n.latency,t.duration);else{const r={id:t.interactionId,latency:t.duration,entries:[t]};Jz[r.id]=r,Ad.push(r)}Ad.sort((r,i)=>i.latency-r.latency),Ad.splice(nj).forEach(r=>{delete Jz[r.id]})}},g7e=()=>{const t=Math.min(Ad.length-1,Math.floor(toe()/50));return Ad[t]},b7e=(t,e)=>{e=e||{},v7e();const n=lT("INP");let r;const i=a=>{a.forEach(l=>{l.interactionId&&rj(l),l.entryType==="first-input"&&!Ad.some(c=>c.entries.some(d=>l.duration===d.duration&&l.startTime===d.startTime))&&rj(l)});const o=g7e();o&&o.latency!==n.value&&(n.value=o.latency,n.entries=o.entries,r())},s=oy("event",i,{durationThreshold:e.durationThreshold||40});r=oT(t,n,e.reportAllChanges),s&&(s.observe({type:"first-input",buffered:!0}),uT(()=>{i(s.takeRecords()),n.value<0&&toe()>0&&(n.value=0,n.entries=[]),r(!0)}))},ij={},y7e=t=>{const e=OC(),n=lT("LCP");let r;const i=a=>{const o=a[a.length-1];if(o){const l=Math.max(o.startTime-kC(),0);l{ij[n.id]||(i(s.takeRecords()),s.disconnect(),ij[n.id]=!0,r(!0))};return["keydown","click"].forEach(o=>{pn.document&&addEventListener(o,a,{once:!0,capture:!0})}),uT(a,!0),a}},QN=t=>{pn.document&&(pn.document.prerendering?addEventListener("prerenderingchange",()=>QN(t),!0):pn.document.readyState!=="complete"?addEventListener("load",()=>QN(t),!0):setTimeout(t,0))},S7e=(t,e)=>{e=e||{};const n=lT("TTFB"),r=oT(t,n,e.reportAllChanges);QN(()=>{const i=mV();if(i){if(n.value=Math.max(i.responseStart-kC(),0),n.value<0||n.value>performance.now())return;n.entries=[i],r(!0)}})},H3={},GM={};let noe,roe,ioe,soe,aoe;function x7e(t,e=!1){return cT("cls",t,M7e,noe,e)}function ooe(t,e=!1){return cT("lcp",t,R7e,ioe,e)}function T7e(t){return cT("ttfb",t,V7e,soe)}function w7e(t){return cT("fid",t,P7e,roe)}function E7e(t){return cT("inp",t,z7e,aoe)}function ob(t,e){return loe(t,e),GM[t]||(k7e(t),GM[t]=!0),uoe(t,e)}function ly(t,e){const n=H3[t];if(!(!n||!n.length))for(const r of n)try{r(e)}catch(i){_r&&He.error(`Error while triggering instrumentation handler. Type: ${t} Name: ${gf(r)} -Error:`,i)}}function E7e(){return u7e(t=>{ly("cls",{metric:t}),roe=t},{reportAllChanges:!0})}function M7e(){return f7e(t=>{ly("fid",{metric:t}),ioe=t})}function P7e(){return b7e(t=>{ly("lcp",{metric:t}),soe=t})}function R7e(){return y7e(t=>{ly("ttfb",{metric:t}),aoe=t})}function V7e(){return g7e(t=>{ly("inp",{metric:t}),ooe=t})}function dT(t,e,n,r,i=!1){uoe(t,e);let s;return FM[t]||(s=n(),FM[t]=!0),r&&e({metric:r}),coe(t,e,i?s:void 0)}function z7e(t){const e={};t==="event"&&(e.durationThreshold=0),oy(t,n=>{ly(t,{entries:n})},e)}function uoe(t,e){Q3[t]=Q3[t]||[],Q3[t].push(e)}function coe(t,e,n){return()=>{n&&n();const r=Q3[t];if(!r)return;const i=r.indexOf(e);i!==-1&&r.splice(i,1)}}function Yz(t){return typeof t=="number"&&isFinite(t)}function lb(t,{startTimestamp:e,...n}){return e&&t.startTimestamp>e&&(t.startTimestamp=e),t.startChild({startTimestamp:e,...n})}const k7e=2147483647;function Ts(t){return t/1e3}function OC(){return pn&&pn.addEventListener&&pn.performance}let oj=0,Ui={},wc,_3;function O7e(){const t=OC();if(t&&bl){t.mark&&pn.performance.mark("sentry-tracing-init");const e=C7e(),n=L7e(),r=X7e(),i=K7e();return()=>{e(),n(),r(),i()}}return()=>{}}function I7e(){ob("longtask",({entries:t})=>{for(const e of t){const n=Dv();if(!n)return;const r=Ts(bl+e.startTime),i=Ts(e.duration);n.startChild({description:"Main UI thread blocked",op:"ui.long-task",origin:"auto.ui.browser.metrics",startTimestamp:r,endTimestamp:r+i})}})}function U7e(){ob("event",({entries:t})=>{for(const e of t){const n=Dv();if(!n)return;if(e.name==="click"){const r=Ts(bl+e.startTime),i=Ts(e.duration),s={description:zp(e.target),op:`ui.interaction.${e.name}`,origin:"auto.ui.browser.metrics",startTimestamp:r,endTimestamp:r+i},a=fae(e.target);a&&(s.attributes={"ui.component_name":a}),n.startChild(s)}}})}function N7e(t,e){if(OC()&&bl){const r=q7e(t,e);return()=>{r()}}return()=>{}}function L7e(){return S7e(({metric:t})=>{const e=t.entries[t.entries.length-1];e&&(_r&&He.log("[Measurements] Adding CLS"),Ui.cls={value:t.value,unit:""},_3=e)},!0)}function X7e(){return loe(({metric:t})=>{const e=t.entries[t.entries.length-1];e&&(_r&&He.log("[Measurements] Adding LCP"),Ui.lcp={value:t.value,unit:"millisecond"},wc=e)},!0)}function C7e(){return T7e(({metric:t})=>{const e=t.entries[t.entries.length-1];if(!e)return;const n=Ts(bl),r=Ts(e.startTime);_r&&He.log("[Measurements] Adding FID"),Ui.fid={value:t.value,unit:"millisecond"},Ui["mark.fid"]={value:n+r,unit:"second"}})}function K7e(){return x7e(({metric:t})=>{t.entries[t.entries.length-1]&&(_r&&He.log("[Measurements] Adding TTFB"),Ui.ttfb={value:t.value,unit:"millisecond"})})}const lj={click:"click",pointerdown:"click",pointerup:"click",mousedown:"click",mouseup:"click",touchstart:"click",touchend:"click",mouseover:"hover",mouseout:"hover",mouseenter:"hover",mouseleave:"hover",pointerover:"hover",pointerout:"hover",pointerenter:"hover",pointerleave:"hover",dragstart:"drag",dragend:"drag",drag:"drag",dragenter:"drag",dragleave:"drag",dragover:"drag",drop:"drag",keydown:"press",keyup:"press",keypress:"press",input:"press"};function q7e(t,e){return w7e(({metric:n})=>{if(n.value===void 0)return;const r=n.entries.find(y=>y.duration===n.value&&lj[y.name]!==void 0),i=Rr();if(!r||!i)return;const s=lj[r.name],a=i.getOptions(),o=Ts(bl+r.startTime),l=Ts(n.value),u=r.interactionId!==void 0?t[r.interactionId]:void 0;if(u===void 0)return;const{routeName:c,parentContext:d,activeTransaction:f,user:h,replayId:p}=u,m=h!==void 0?h.email||h.id||h.ip_address:void 0,v=f!==void 0?f.getProfileId():void 0,g=new pV({startTimestamp:o,endTimestamp:o+l,op:`ui.interaction.${s}`,name:zp(r.target),attributes:{release:a.release,environment:a.environment,transaction:c,...m!==void 0&&m!==""?{user:m}:{},...v!==void 0?{profile_id:v}:{},...p!==void 0?{replay_id:p}:{}},exclusiveTime:n.value,measurements:{inp:{value:n.value,unit:"millisecond"}}}),b=Y7e(d,a,e);if(b&&Math.random(){_r&&He.error("Error while sending interaction:",T)});return}})}function D7e(t){const e=OC();if(!e||!pn.performance.getEntries||!bl)return;_r&&He.log("[Tracing] Adding & adjusting spans using Performance API");const n=Ts(bl),r=e.getEntries(),{op:i,start_timestamp:s}=As(t);if(r.slice(oj).forEach(a=>{const o=Ts(a.startTime),l=Ts(a.duration);if(!(t.op==="navigation"&&s&&n+o{if(!Ui[o]||!s||n>=s)return;const l=Ui[o].value,u=n+Ts(l),c=Math.abs((u-s)*1e3),d=c-l;_r&&He.log(`[Measurements] Normalized ${o} from ${l} to ${c} (${d})`),Ui[o].value=c});const a=Ui["mark.fid"];a&&Ui.fid&&(lb(t,{description:"first input delay",endTimestamp:a.value+Ts(Ui.fid.value),op:"ui.action",origin:"auto.ui.browser.metrics",startTimestamp:a.value}),delete Ui["mark.fid"]),"fcp"in Ui||delete Ui.cls,Object.keys(Ui).forEach(o=>{vEe(o,Ui[o].value,Ui[o].unit)}),Z7e(t)}wc=void 0,_3=void 0,Ui={}}function W7e(t,e,n,r,i){const s=i+n,a=s+r;return lb(t,{description:e.name,endTimestamp:a,op:e.entryType,origin:"auto.resource.browser.metrics",startTimestamp:s}),s}function A7e(t,e,n){["unloadEvent","redirect","domContentLoadedEvent","loadEvent","connect"].forEach(r=>{s2(t,e,r,n)}),s2(t,e,"secureConnection",n,"TLS/SSL","connectEnd"),s2(t,e,"fetch",n,"cache","domainLookupStart"),s2(t,e,"domainLookup",n,"DNS"),G7e(t,e,n)}function s2(t,e,n,r,i,s){const a=s?e[s]:e[`${n}End`],o=e[`${n}Start`];!o||!a||lb(t,{op:"browser",origin:"auto.browser.browser.metrics",description:i||n,startTimestamp:r+Ts(o),endTimestamp:r+Ts(a)})}function G7e(t,e,n){e.responseEnd&&(lb(t,{op:"browser",origin:"auto.browser.browser.metrics",description:"request",startTimestamp:n+Ts(e.requestStart),endTimestamp:n+Ts(e.responseEnd)}),lb(t,{op:"browser",origin:"auto.browser.browser.metrics",description:"response",startTimestamp:n+Ts(e.responseStart),endTimestamp:n+Ts(e.responseEnd)}))}function F7e(t,e,n,r,i,s){if(e.initiatorType==="xmlhttprequest"||e.initiatorType==="fetch")return;const a=Ev(n),o={};Bz(o,e,"transferSize","http.response_transfer_size"),Bz(o,e,"encodedBodySize","http.response_content_length"),Bz(o,e,"decodedBodySize","http.decoded_response_content_length"),"renderBlockingStatus"in e&&(o["resource.render_blocking_status"]=e.renderBlockingStatus),a.protocol&&(o["url.scheme"]=a.protocol.split(":").pop()),a.host&&(o["server.address"]=a.host),o["url.same_origin"]=n.includes(pn.location.origin);const l=s+r,u=l+i;lb(t,{description:n.replace(pn.location.origin,""),endTimestamp:u,op:e.initiatorType?`resource.${e.initiatorType}`:"resource.other",origin:"auto.resource.browser.metrics",startTimestamp:l,data:o})}function j7e(t){const e=pn.navigator;if(!e)return;const n=e.connection;n&&(n.effectiveType&&t.setTag("effectiveConnectionType",n.effectiveType),n.type&&t.setTag("connectionType",n.type),Yz(n.rtt)&&(Ui["connection.rtt"]={value:n.rtt,unit:"millisecond"})),Yz(e.deviceMemory)&&t.setTag("deviceMemory",`${e.deviceMemory} GB`),Yz(e.hardwareConcurrency)&&t.setTag("hardwareConcurrency",String(e.hardwareConcurrency))}function Z7e(t){wc&&(_r&&He.log("[Measurements] Adding LCP Data"),wc.element&&t.setTag("lcp.element",zp(wc.element)),wc.id&&t.setTag("lcp.id",wc.id),wc.url&&t.setTag("lcp.url",wc.url.trim().slice(0,200)),t.setTag("lcp.size",wc.size)),_3&&_3.sources&&(_r&&He.log("[Measurements] Adding CLS Data"),_3.sources.forEach((e,n)=>t.setTag(`cls.source.${n+1}`,zp(e.node))))}function Bz(t,e,n,r){const i=e[n];i!=null&&i0?m.join(","):void 0}}else return{"sentry-trace":d,baggage:f}}function Q7e(t){try{return new URL(t).href}catch{return}}function _7e(t,e){if(e.response){VC(t,e.response.status);const n=e.response&&e.response.headers&&e.response.headers.get("content-length");if(n){const r=parseInt(n);r>0&&t.setAttribute("http.response_content_length",r)}}else e.error&&t.setStatus("internal_error");t.end()}const _N=["localhost",/^\/(?!\/)/],$N={traceFetch:!0,traceXHR:!0,enableHTTPTimings:!0,tracingOrigins:_N,tracePropagationTargets:_N};function $7e(t){const{traceFetch:e,traceXHR:n,tracePropagationTargets:r,tracingOrigins:i,shouldCreateSpanForRequest:s,enableHTTPTimings:a}={traceFetch:$N.traceFetch,traceXHR:$N.traceXHR,...t},o=typeof s=="function"?s:c=>!0,l=c=>rMe(c,r||i),u={};e&&SC(c=>{const d=B7e(c,o,l,u);if(d){const f=doe(c.fetchData.url),h=f?Ev(f).host:void 0;d.setAttributes({"http.url":f,"server.address":h})}a&&d&&uj(d)}),n&&xC(c=>{const d=iMe(c,o,l,u);a&&d&&uj(d)})}function eMe(t){return t.entryType==="resource"&&"initiatorType"in t&&typeof t.nextHopProtocol=="string"&&(t.initiatorType==="fetch"||t.initiatorType==="xmlhttprequest")}function uj(t){const{url:e}=As(t).data||{};if(!e||typeof e!="string")return;const n=ob("resource",({entries:r})=>{r.forEach(i=>{eMe(i)&&i.name.endsWith(e)&&(nMe(i).forEach(a=>t.setAttribute(...a)),setTimeout(n))})})}function tMe(t){let e="unknown",n="unknown",r="";for(const i of t){if(i==="/"){[e,n]=t.split("/");break}if(!isNaN(Number(i))){e=r==="h"?"http":r,n=t.split(r)[1];break}r+=i}return r===t&&(e=r),{name:e,version:n}}function ic(t=0){return((bl||performance.timeOrigin)+t)/1e3}function nMe(t){const{name:e,version:n}=tMe(t.nextHopProtocol),r=[];return r.push(["network.protocol.version",n],["network.protocol.name",e]),bl?[...r,["http.request.redirect_start",ic(t.redirectStart)],["http.request.fetch_start",ic(t.fetchStart)],["http.request.domain_lookup_start",ic(t.domainLookupStart)],["http.request.domain_lookup_end",ic(t.domainLookupEnd)],["http.request.connect_start",ic(t.connectStart)],["http.request.secure_connection_start",ic(t.secureConnectionStart)],["http.request.connection_end",ic(t.connectEnd)],["http.request.request_start",ic(t.requestStart)],["http.request.response_start",ic(t.responseStart)],["http.request.response_end",ic(t.responseEnd)]]:r}function rMe(t,e){return ny(t,e||_N)}function iMe(t,e,n,r){const i=t.xhr,s=i&&i[jh];if(!v0()||!i||i.__sentry_own_request__||!s)return;const a=e(s.url);if(t.endTimestamp&&a){const h=i.__sentry_xhr_span_id__;if(!h)return;const p=r[h];p&&s.status_code!==void 0&&(VC(p,s.status_code),p.end(),delete r[h]);return}const o=jo(),l=Qp(),u=doe(s.url),c=u?Ev(u).host:void 0,d=a?WM({name:`${s.method} ${s.url}`,onlyIfParent:!0,attributes:{type:"xhr","http.method":s.method,"http.url":u,url:s.url,"server.address":c,[_d]:"auto.http.browser"},op:"http.client"}):void 0;d&&(i.__sentry_xhr_span_id__=d.spanContext().spanId,r[i.__sentry_xhr_span_id__]=d);const f=Rr();if(i.setRequestHeader&&n(s.url)&&f){const{traceId:h,spanId:p,sampled:m,dsc:v}={...l.getPropagationContext(),...o.getPropagationContext()},g=d?dV(d):wC(h,p,m),b=Pae(v||(d?ab(d):hV(h,f,o)));sMe(i,g,b)}return d}function sMe(t,e,n){try{t.setRequestHeader("sentry-trace",e),n&&t.setRequestHeader(jN,n)}catch{}}function doe(t){try{return new URL(t,pn.location.origin).href}catch{return}}function aMe(t,e=!0,n=!0){if(!pn||!pn.location){_r&&He.warn("Could not initialize routing instrumentation due to invalid location");return}let r=pn.location.href,i;e&&(i=t({name:pn.location.pathname,startTimestamp:bl?bl/1e3:void 0,op:"pageload",origin:"auto.pageload.browser",metadata:{source:"url"}})),n&&uV(({to:s,from:a})=>{if(a===void 0&&r&&r.indexOf(s)!==-1){r=void 0;return}a!==s&&(r=void 0,i&&(_r&&He.log(`[Tracing] Finishing current transaction with op: ${i.op}`),i.end()),i=t({name:pn.location.pathname,op:"navigation",origin:"auto.navigation.browser",metadata:{source:"url"}}))})}const oMe="BrowserTracing",lMe={...g7,markBackgroundTransactions:!0,routingInstrumentation:aMe,startTransactionOnLocationChange:!0,startTransactionOnPageLoad:!0,enableLongTask:!0,enableInp:!1,interactionsSampleRate:1,_experiments:{},...$N},cj=10;class uMe{constructor(e){this.name=oMe,this._hasSetTracePropagationTargets=!1,mEe(),_r&&(this._hasSetTracePropagationTargets=!!(e&&(e.tracePropagationTargets||e.tracingOrigins))),this.options={...lMe,...e},this.options._experiments.enableLongTask!==void 0&&(this.options.enableLongTask=this.options._experiments.enableLongTask),e&&!e.tracePropagationTargets&&e.tracingOrigins&&(this.options.tracePropagationTargets=e.tracingOrigins),this._collectWebVitals=O7e(),this._interactionIdToRouteNameMapping={},this.options.enableInp&&N7e(this._interactionIdToRouteNameMapping,this.options.interactionsSampleRate),this.options.enableLongTask&&I7e(),this.options._experiments.enableInteractions&&U7e(),this._latestRoute={name:void 0,context:void 0}}setupOnce(e,n){this._getCurrentHub=n;const i=n().getClient(),s=i&&i.getOptions(),{routingInstrumentation:a,startTransactionOnLocationChange:o,startTransactionOnPageLoad:l,markBackgroundTransactions:u,traceFetch:c,traceXHR:d,shouldCreateSpanForRequest:f,enableHTTPTimings:h,_experiments:p}=this.options,m=s&&s.tracePropagationTargets,v=m||this.options.tracePropagationTargets;_r&&this._hasSetTracePropagationTargets&&m&&He.warn("[Tracing] The `tracePropagationTargets` option was set in the BrowserTracing integration and top level `Sentry.init`. The top level `Sentry.init` value is being used."),a(g=>{const b=this._createRouteTransaction(g);return this.options._experiments.onStartRouteTransaction&&this.options._experiments.onStartRouteTransaction(b,g,n),b},l,o),u&&a7e(),p.enableInteractions&&this._registerInteractionListener(),this.options.enableInp&&this._registerInpInteractionListener(),$7e({traceFetch:c,traceXHR:d,tracePropagationTargets:v,shouldCreateSpanForRequest:f,enableHTTPTimings:h})}_createRouteTransaction(e){if(!this._getCurrentHub){_r&&He.warn(`[Tracing] Did not create ${e.op} transaction because _getCurrentHub is invalid.`);return}const n=this._getCurrentHub(),{beforeNavigate:r,idleTimeout:i,finalTimeout:s,heartbeatInterval:a}=this.options,o=e.op==="pageload";let l;if(o){const h=o?dj("sentry-trace"):"",p=o?dj("baggage"):void 0,{traceId:m,dsc:v,parentSpanId:g,sampled:b}=y5e(h,p);l={traceId:m,parentSpanId:g,parentSampled:b,...e,metadata:{...e.metadata,dynamicSamplingContext:v},trimEnd:!0}}else l={trimEnd:!0,...e};const u=typeof r=="function"?r(l):l,c=u===void 0?{...l,sampled:!1}:u;c.metadata=c.name!==l.name?{...c.metadata,source:"custom"}:c.metadata,this._latestRoute.name=c.name,this._latestRoute.context=c,c.sampled===!1&&_r&&He.log(`[Tracing] Will not send ${c.op} transaction because of beforeNavigate.`),_r&&He.log(`[Tracing] Starting ${c.op} transaction on scope`);const{location:d}=pn,f=HF(n,c,i,s,!0,{location:d},a,o);return o&&pn.document&&(pn.document.addEventListener("readystatechange",()=>{["interactive","complete"].includes(pn.document.readyState)&&f.sendAutoFinishSignal()}),["interactive","complete"].includes(pn.document.readyState)&&f.sendAutoFinishSignal()),f.registerBeforeFinishCallback(h=>{this._collectWebVitals(),D7e(h)}),f}_registerInteractionListener(){let e;const n=()=>{const{idleTimeout:r,finalTimeout:i,heartbeatInterval:s}=this.options,a="ui.action.click",o=Dv();if(o&&o.op&&["navigation","pageload"].includes(o.op)){_r&&He.warn(`[Tracing] Did not create ${a} transaction because a pageload or navigation transaction is in progress.`);return}if(e&&(e.setFinishReason("interactionInterrupted"),e.end(),e=void 0),!this._getCurrentHub){_r&&He.warn(`[Tracing] Did not create ${a} transaction because _getCurrentHub is invalid.`);return}if(!this._latestRoute.name){_r&&He.warn(`[Tracing] Did not create ${a} transaction because _latestRouteName is missing.`);return}const l=this._getCurrentHub(),{location:u}=pn,c={name:this._latestRoute.name,op:a,trimEnd:!0,data:{[Nu]:this._latestRoute.context?cMe(this._latestRoute.context):"url"}};e=HF(l,c,r,i,!0,{location:u},s)};["click"].forEach(r=>{pn.document&&addEventListener(r,n,{once:!1,capture:!0})})}_registerInpInteractionListener(){const e=({entries:n})=>{const r=Rr(),i=r!==void 0&&r.getIntegrationByName!==void 0?r.getIntegrationByName("Replay"):void 0,s=i!==void 0?i.getReplayId():void 0,a=Dv(),o=jo(),l=o!==void 0?o.getUser():void 0;n.forEach(u=>{if(dMe(u)){const c=u.interactionId;if(c===void 0)return;const d=this._interactionIdToRouteNameMapping[c],f=u.duration,h=u.startTime,p=Object.keys(this._interactionIdToRouteNameMapping),m=p.length>0?p.reduce((v,g)=>this._interactionIdToRouteNameMapping[v].durationthis._interactionIdToRouteNameMapping[g]).some(g=>g.duration===f&&g.startTime===h)||!c)return;if(d)d.duration=Math.max(d.duration,f);else if(p.lengththis._interactionIdToRouteNameMapping[m].duration){const v=this._latestRoute.name,g=this._latestRoute.context;v&&g&&(m&&Object.keys(this._interactionIdToRouteNameMapping).length>=cj&&delete this._interactionIdToRouteNameMapping[m],this._interactionIdToRouteNameMapping[c]={routeName:v,duration:f,parentContext:g,user:l,activeTransaction:a,replayId:s,startTime:h})}}})};ob("event",e),ob("first-input",e)}}function dj(t){const e=E2e(`meta[name=${t}]`);return e?e.getAttribute("content"):void 0}function cMe(t){const e=t.attributes&&t.attributes[Nu],n=t.data&&t.data[Nu],r=t.metadata&&t.metadata.source;return e||n||r}function dMe(t){return"duration"in t}const gr=Gn;let eL=0;function foe(){return eL>0}function fMe(){eL++,setTimeout(()=>{eL--})}function ub(t,e={},n){if(typeof t!="function")return t;try{const i=t.__sentry_wrapped__;if(i)return typeof i=="function"?i:t;if(bC(t))return t}catch{return t}const r=function(){const i=Array.prototype.slice.call(arguments);try{n&&typeof n=="function"&&n.apply(this,arguments);const s=i.map(a=>ub(a,e));return t.apply(this,s)}catch(s){throw fMe(),Z5e(a=>{a.addEventProcessor(o=>(e.mechanism&&(KN(o,void 0,void 0),Bx(o,e.mechanism)),o.extra={...o.extra,arguments:i},o)),ay(s)}),s}};try{for(const i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[i]=t[i])}catch{}pae(r,t),Kv(t,"__sentry_wrapped__",r);try{Object.getOwnPropertyDescriptor(r,"name").configurable&&Object.defineProperty(r,"name",{get(){return t.name}})}catch{}return r}const $d=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__;function hoe(t,e){const n=IC(t,e),r={type:e&&e.name,value:vMe(e)};return n.length&&(r.stacktrace={frames:n}),r.type===void 0&&r.value===""&&(r.value="Unrecoverable error caught"),r}function hMe(t,e,n,r){const i=Rr(),s=i&&i.getOptions().normalizeDepth,a={exception:{values:[{type:oV(e)?e.constructor.name:r?"UnhandledRejection":"Error",value:yMe(e,{isUnhandledRejection:r})}]},extra:{__serialized__:wae(e,s)}};if(n){const o=IC(t,n);o.length&&(a.exception.values[0].stacktrace={frames:o})}return a}function Hz(t,e){return{exception:{values:[hoe(t,e)]}}}function IC(t,e){const n=e.stacktrace||e.stack||"",r=mMe(e);try{return t(n,r)}catch{}return[]}const pMe=/Minified React error #\d+;/i;function mMe(t){if(t){if(typeof t.framesToPop=="number")return t.framesToPop;if(pMe.test(t.message))return 1}return 0}function vMe(t){const e=t&&t.message;return e?e.error&&typeof e.error.message=="string"?e.error.message:e:"No error message"}function gMe(t,e,n,r){const i=n&&n.syntheticException||void 0,s=UC(t,e,i,r);return Bx(s),s.level="error",n&&n.event_id&&(s.event_id=n.event_id),sb(s)}function bMe(t,e,n="info",r,i){const s=r&&r.syntheticException||void 0,a=tL(t,e,s,i);return a.level=n,r&&r.event_id&&(a.event_id=r.event_id),sb(a)}function UC(t,e,n,r,i){let s;if(pC(e)&&e.error)return Hz(t,e.error);if(EF(e)||p2e(e)){const a=e;if("stack"in e)s=Hz(t,e);else{const o=a.name||(EF(a)?"DOMError":"DOMException"),l=a.message?`${o}: ${a.message}`:o;s=tL(t,l,n,r),KN(s,l)}return"code"in a&&(s.tags={...s.tags,"DOMException.code":`${a.code}`}),s}return lae(e)?Hz(t,e):ib(e)||oV(e)?(s=hMe(t,e,n,i),Bx(s,{synthetic:!0}),s):(s=tL(t,e,n,r),KN(s,`${e}`,void 0),Bx(s,{synthetic:!0}),s)}function tL(t,e,n,r){const i={};if(r&&n){const s=IC(t,n);s.length&&(i.exception={values:[{value:e,stacktrace:{frames:s}}]})}if(mC(e)){const{__sentry_template_string__:s,__sentry_template_values__:a}=e;return i.logentry={message:s,params:a},i}return i.message=e,i}function yMe(t,{isUnhandledRejection:e}){const n=U2e(t),r=e?"promise rejection":"exception";return pC(t)?`Event \`ErrorEvent\` captured as ${r} with message \`${t.message}\``:oV(t)?`Event \`${SMe(t)}\` (type=${t.type}) captured as ${r}`:`Object captured as ${r} with keys: ${n}`}function SMe(t){try{const e=Object.getPrototypeOf(t);return e?e.constructor.name:void 0}catch{}}function xMe(t,{metadata:e,tunnel:n,dsn:r}){const i={event_id:t.event_id,sent_at:new Date().toISOString(),...e&&e.sdk&&{sdk:{name:e.sdk.name,version:e.sdk.version}},...!!n&&!!r&&{dsn:iy(r)}},s=TMe(t);return Hp(i,[s])}function TMe(t){return[{type:"user_report"},t]}class wMe extends IEe{constructor(e){const n=gr.SENTRY_SDK_SOURCE||t5e();ZEe(e,"browser",["browser"],n),super(e),e.sendClientReports&&gr.document&&gr.document.addEventListener("visibilitychange",()=>{gr.document.visibilityState==="hidden"&&this._flushOutcomes()})}eventFromException(e,n){return gMe(this._options.stackParser,e,n,this._options.attachStacktrace)}eventFromMessage(e,n="info",r){return bMe(this._options.stackParser,e,n,r,this._options.attachStacktrace)}captureUserFeedback(e){if(!this._isEnabled()){$d&&He.warn("SDK not enabled, will not capture user feedback.");return}const n=xMe(e,{metadata:this.getSdkMetadata(),dsn:this.getDsn(),tunnel:this.getOptions().tunnel});this._sendEnvelope(n)}_prepareEvent(e,n,r){return e.platform=e.platform||"javascript",super._prepareEvent(e,n,r)}_flushOutcomes(){const e=this._clearOutcomes();if(e.length===0){$d&&He.log("No outcomes to send");return}if(!this._dsn){$d&&He.log("No dsn provided, will not send outcomes");return}$d&&He.log("Sending outcomes:",e);const n=M5e(e,this._options.tunnel&&iy(this._dsn));this._sendEnvelope(n)}}let v3;function EMe(){if(v3)return v3;if(AN(gr.fetch))return v3=gr.fetch.bind(gr);const t=gr.document;let e=gr.fetch;if(t&&typeof t.createElement=="function")try{const n=t.createElement("iframe");n.hidden=!0,t.head.appendChild(n);const r=n.contentWindow;r&&r.fetch&&(e=r.fetch),t.head.removeChild(n)}catch(n){$d&&He.warn("Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ",n)}return v3=e.bind(gr)}function MMe(){v3=void 0}function PMe(t,e=EMe()){let n=0,r=0;function i(s){const a=s.body.length;n+=a,r++;const o={body:s.body,method:"POST",referrerPolicy:"origin",headers:t.headers,keepalive:n<=6e4&&r<15,...t.fetchOptions};try{return e(t.url,o).then(l=>(n-=a,r--,{statusCode:l.status,headers:{"x-sentry-rate-limits":l.headers.get("X-Sentry-Rate-Limits"),"retry-after":l.headers.get("Retry-After")}}))}catch(l){return MMe(),n-=a,r--,TC(l)}}return Hae(t,i)}const RMe=4;function VMe(t){function e(n){return new sl((r,i)=>{const s=new XMLHttpRequest;s.onerror=i,s.onreadystatechange=()=>{s.readyState===RMe&&r({statusCode:s.status,headers:{"x-sentry-rate-limits":s.getResponseHeader("X-Sentry-Rate-Limits"),"retry-after":s.getResponseHeader("Retry-After")}})},s.open("POST",t.url);for(const a in t.headers)Object.prototype.hasOwnProperty.call(t.headers,a)&&s.setRequestHeader(a,t.headers[a]);s.send(n.body)})}return Hae(t,e)}const vV="?",zMe=30,kMe=40,OMe=50;function NC(t,e,n,r){const i={filename:t,function:e,in_app:!0};return n!==void 0&&(i.lineno=n),r!==void 0&&(i.colno=r),i}const IMe=/^\s*at (?:(.+?\)(?: \[.+\])?|.*?) ?\((?:address at )?)?(?:async )?((?:|[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,UMe=/\((\S*)(?::(\d+))(?::(\d+))\)/,NMe=t=>{const e=IMe.exec(t);if(e){if(e[2]&&e[2].indexOf("eval")===0){const s=UMe.exec(e[2]);s&&(e[2]=s[1],e[3]=s[2],e[4]=s[3])}const[r,i]=poe(e[1]||vV,e[2]);return NC(i,r,e[3]?+e[3]:void 0,e[4]?+e[4]:void 0)}},LMe=[zMe,NMe],XMe=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:[-a-z]+)?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i,CMe=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,KMe=t=>{const e=XMe.exec(t);if(e){if(e[3]&&e[3].indexOf(" > eval")>-1){const s=CMe.exec(e[3]);s&&(e[1]=e[1]||"eval",e[3]=s[1],e[4]=s[2],e[5]="")}let r=e[3],i=e[1]||vV;return[i,r]=poe(i,r),NC(r,i,e[4]?+e[4]:void 0,e[5]?+e[5]:void 0)}},qMe=[OMe,KMe],DMe=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:[-a-z]+):.*?):(\d+)(?::(\d+))?\)?\s*$/i,WMe=t=>{const e=DMe.exec(t);return e?NC(e[2],e[1]||vV,+e[3],e[4]?+e[4]:void 0):void 0},AMe=[kMe,WMe],GMe=[LMe,qMe,AMe],FMe=gae(...GMe),poe=(t,e)=>{const n=t.indexOf("safari-extension")!==-1,r=t.indexOf("safari-web-extension")!==-1;return n||r?[t.indexOf("@")!==-1?t.split("@")[0]:vV,n?`safari-extension:${e}`:`safari-web-extension:${e}`]:[t,e]},a2=1024,moe="Breadcrumbs",jMe=(t={})=>{const e={console:!0,dom:!0,fetch:!0,history:!0,sentry:!0,xhr:!0,...t};return{name:moe,setupOnce(){},setup(n){e.console&&C2e(YMe(n)),e.dom&&yae(JMe(n,e.dom)),e.xhr&&xC(BMe(n)),e.fetch&&SC(HMe(n)),e.history&&uV(QMe(n)),e.sentry&&n.on&&n.on("beforeSendEvent",ZMe(n))}}},voe=jMe;Xf(moe,voe);function ZMe(t){return function(n){Rr()===t&&kp({category:`sentry.${n.type==="transaction"?"transaction":"event"}`,event_id:n.event_id,level:n.level,message:Kh(n)},{event:n})}}function JMe(t,e){return function(r){if(Rr()!==t)return;let i,s,a=typeof e=="object"?e.serializeAttribute:void 0,o=typeof e=="object"&&typeof e.maxStringLength=="number"?e.maxStringLength:void 0;o&&o>a2&&($d&&He.warn(`\`dom.maxStringLength\` cannot exceed ${a2}, but a value of ${o} was configured. Sentry will use ${a2} instead.`),o=a2),typeof a=="string"&&(a=[a]);try{const u=r.event,c=_Me(u)?u.target:u;i=zp(c,{keyAttrs:a,maxStringLength:o}),s=fae(c)}catch{i=""}if(i.length===0)return;const l={category:`ui.${r.name}`,message:i};s&&(l.data={"ui.component_name":s}),kp(l,{event:r.event,name:r.name,global:r.global})}}function YMe(t){return function(n){if(Rr()!==t)return;const r={category:"console",data:{arguments:n.args,logger:"console"},level:d5e(n.level),message:MF(n.args," ")};if(n.level==="assert")if(n.args[0]===!1)r.message=`Assertion failed: ${MF(n.args.slice(1)," ")||"console.assert"}`,r.data.arguments=n.args.slice(1);else return;kp(r,{input:n.args,level:n.level})}}function BMe(t){return function(n){if(Rr()!==t)return;const{startTimestamp:r,endTimestamp:i}=n,s=n.xhr[jh];if(!r||!i||!s)return;const{method:a,url:o,status_code:l,body:u}=s,c={method:a,url:o,status_code:l},d={xhr:n.xhr,input:u,startTimestamp:r,endTimestamp:i};kp({category:"xhr",data:c,type:"http"},d)}}function HMe(t){return function(n){if(Rr()!==t)return;const{startTimestamp:r,endTimestamp:i}=n;if(i&&!(n.fetchData.url.match(/sentry_key/)&&n.fetchData.method==="POST"))if(n.error){const s=n.fetchData,a={data:n.error,input:n.args,startTimestamp:r,endTimestamp:i};kp({category:"fetch",data:s,level:"error",type:"http"},a)}else{const s=n.response,a={...n.fetchData,status_code:s&&s.status},o={input:n.args,response:s,startTimestamp:r,endTimestamp:i};kp({category:"fetch",data:a,type:"http"},o)}}}function QMe(t){return function(n){if(Rr()!==t)return;let r=n.from,i=n.to;const s=Ev(gr.location.href);let a=r?Ev(r):void 0;const o=Ev(i);(!a||!a.path)&&(a=s),s.protocol===o.protocol&&s.host===o.host&&(i=o.relative),s.protocol===a.protocol&&s.host===a.host&&(r=a.relative),kp({category:"navigation",data:{from:r,to:i}})}}function _Me(t){return!!t&&!!t.target}const goe="Dedupe",$Me=()=>{let t;return{name:goe,setupOnce(){},processEvent(e){if(e.type)return e;try{if(ePe(e,t))return $d&&He.warn("Event dropped due to being a duplicate of previously captured event."),null}catch{}return t=e}}},boe=$Me;Xf(goe,boe);function ePe(t,e){return e?!!(tPe(t,e)||nPe(t,e)):!1}function tPe(t,e){const n=t.message,r=e.message;return!(!n&&!r||n&&!r||!n&&r||n!==r||!Soe(t,e)||!yoe(t,e))}function nPe(t,e){const n=fj(e),r=fj(t);return!(!n||!r||n.type!==r.type||n.value!==r.value||!Soe(t,e)||!yoe(t,e))}function yoe(t,e){let n=hj(t),r=hj(e);if(!n&&!r)return!0;if(n&&!r||!n&&r||(n=n,r=r,r.length!==n.length))return!1;for(let i=0;i{const e={onerror:!0,onunhandledrejection:!0,...t};return{name:xoe,setupOnce(){Error.stackTraceLimit=50},setup(n){e.onerror&&(iPe(n),pj("onerror")),e.onunhandledrejection&&(sPe(n),pj("onunhandledrejection"))}}},Toe=rPe;Xf(xoe,Toe);function iPe(t){xae(e=>{const{stackParser:n,attachStacktrace:r}=Eoe();if(Rr()!==t||foe())return;const{msg:i,url:s,line:a,column:o,error:l}=e,u=l===void 0&&Dc(i)?lPe(i,s,a,o):woe(UC(n,l||i,void 0,r,!1),s,a,o);u.level="error",Nae(u,{originalException:l,mechanism:{handled:!1,type:"onerror"}})})}function sPe(t){Tae(e=>{const{stackParser:n,attachStacktrace:r}=Eoe();if(Rr()!==t||foe())return;const i=aPe(e),s=vC(i)?oPe(i):UC(n,i,void 0,r,!0);s.level="error",Nae(s,{originalException:i,mechanism:{handled:!1,type:"onunhandledrejection"}})})}function aPe(t){if(vC(t))return t;const e=t;try{if("reason"in e)return e.reason;if("detail"in e&&"reason"in e.detail)return e.detail.reason}catch{}return t}function oPe(t){return{exception:{values:[{type:"UnhandledRejection",value:`Non-Error promise rejection captured with value: ${String(t)}`}]}}}function lPe(t,e,n,r){const i=/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;let s=pC(t)?t.message:t,a="Error";const o=s.match(i);return o&&(a=o[1],s=o[2]),woe({exception:{values:[{type:a,value:s}]}},e,n,r)}function woe(t,e,n,r){const i=t.exception=t.exception||{},s=i.values=i.values||[],a=s[0]=s[0]||{},o=a.stacktrace=a.stacktrace||{},l=o.frames=o.frames||[],u=isNaN(parseInt(r,10))?void 0:r,c=isNaN(parseInt(n,10))?void 0:n,d=Dc(e)&&e.length>0?e:w2e();return l.length===0&&l.push({colno:u,filename:d,function:"?",in_app:!0,lineno:c}),t}function pj(t){$d&&He.log(`Global Handler attached: ${t}`)}function Eoe(){const t=Rr();return t&&t.getOptions()||{stackParser:()=>[],attachStacktrace:!1}}const Moe="HttpContext",uPe=()=>({name:Moe,setupOnce(){},preprocessEvent(t){if(!gr.navigator&&!gr.location&&!gr.document)return;const e=t.request&&t.request.url||gr.location&&gr.location.href,{referrer:n}=gr.document||{},{userAgent:r}=gr.navigator||{},i={...t.request&&t.request.headers,...n&&{Referer:n},...r&&{"User-Agent":r}},s={...t.request,...e&&{url:e},headers:i};t.request=s}}),Poe=uPe;Xf(Moe,Poe);const cPe="cause",dPe=5,Roe="LinkedErrors",fPe=(t={})=>{const e=t.limit||dPe,n=t.key||cPe;return{name:Roe,setupOnce(){},preprocessEvent(r,i,s){const a=s.getOptions();y2e(hoe,a.stackParser,a.maxValueLength,n,e,r,i)}}},Voe=fPe;Xf(Roe,Voe);const hPe=["EventTarget","Window","Node","ApplicationCache","AudioTrackList","BroadcastChannel","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","SharedWorker","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"],zoe="TryCatch",pPe=(t={})=>{const e={XMLHttpRequest:!0,eventTarget:!0,requestAnimationFrame:!0,setInterval:!0,setTimeout:!0,...t};return{name:zoe,setupOnce(){e.setTimeout&&Cs(gr,"setTimeout",mj),e.setInterval&&Cs(gr,"setInterval",mj),e.requestAnimationFrame&&Cs(gr,"requestAnimationFrame",mPe),e.XMLHttpRequest&&"XMLHttpRequest"in gr&&Cs(XMLHttpRequest.prototype,"send",vPe);const n=e.eventTarget;n&&(Array.isArray(n)?n:hPe).forEach(gPe)}}},koe=pPe;Xf(zoe,koe);function mj(t){return function(...e){const n=e[0];return e[0]=ub(n,{mechanism:{data:{function:gf(t)},handled:!1,type:"instrument"}}),t.apply(this,e)}}function mPe(t){return function(e){return t.apply(this,[ub(e,{mechanism:{data:{function:"requestAnimationFrame",handler:gf(t)},handled:!1,type:"instrument"}})])}}function vPe(t){return function(...e){const n=this;return["onload","onerror","onprogress","onreadystatechange"].forEach(i=>{i in n&&typeof n[i]=="function"&&Cs(n,i,function(s){const a={mechanism:{data:{function:i,handler:gf(s)},handled:!1,type:"instrument"}},o=bC(s);return o&&(a.mechanism.data.handler=gf(o)),ub(s,a)})}),t.apply(this,e)}}function gPe(t){const e=gr,n=e[t]&&e[t].prototype;!n||!n.hasOwnProperty||!n.hasOwnProperty("addEventListener")||(Cs(n,"addEventListener",function(r){return function(i,s,a){try{typeof s.handleEvent=="function"&&(s.handleEvent=ub(s.handleEvent,{mechanism:{data:{function:"handleEvent",handler:gf(s),target:t},handled:!1,type:"instrument"}}))}catch{}return r.apply(this,[i,ub(s,{mechanism:{data:{function:"addEventListener",handler:gf(s),target:t},handled:!1,type:"instrument"}}),a])}}),Cs(n,"removeEventListener",function(r){return function(i,s,a){const o=s;try{const l=o&&o.__sentry_wrapped__;l&&r.call(this,i,l,a)}catch{}return r.call(this,i,o,a)}}))}const bPe=[_ae(),eoe(),koe(),voe(),Toe(),Voe(),boe(),Poe()];function Ooe(t){return[...bPe]}function yPe(t={}){t.defaultIntegrations===void 0&&(t.defaultIntegrations=Ooe()),t.release===void 0&&(typeof __SENTRY_RELEASE__=="string"&&(t.release=__SENTRY_RELEASE__),gr.SENTRY_RELEASE&&gr.SENTRY_RELEASE.id&&(t.release=gr.SENTRY_RELEASE.id)),t.autoSessionTracking===void 0&&(t.autoSessionTracking=!0),t.sendClientReports===void 0&&(t.sendClientReports=!0);const e={...t,stackParser:L2e(t.stackParser||FMe),integrations:PEe(t),transport:t.transport||(Sae()?PMe:VMe)};XEe(wMe,e),t.autoSessionTracking&&SPe()}function SPe(){if(typeof gr.document>"u"){$d&&He.warn("Session tracking in non-browser environment with @sentry/browser is not supported.");return}GF({ignoreDuration:!0}),FF(),uV(({from:t,to:e})=>{t!==void 0&&t!==e&&(GF({ignoreDuration:!0}),FF())})}const Hr=Gn,LC="sentryReplaySession",xPe="replay_event",XC="Unable to send Replay",TPe=3e5,wPe=9e5,EPe=5e3,MPe=5500,PPe=6e4,RPe=5e3,VPe=3,vj=15e4,o2=5e3,zPe=3e3,kPe=300,CC=2e7,OPe=4999,IPe=15e3,gj=36e5;function UPe(t,e){return t??e()}function jM(t){let e,n=t[0],r=1;for(;rn.call(e,...a)),e=void 0)}return n}var Ss;(function(t){t[t.Document=0]="Document",t[t.DocumentType=1]="DocumentType",t[t.Element=2]="Element",t[t.Text=3]="Text",t[t.CDATA=4]="CDATA",t[t.Comment=5]="Comment"})(Ss||(Ss={}));function NPe(t){return t.nodeType===t.ELEMENT_NODE}function $3(t){const e=jM([t,"optionalAccess",n=>n.host]);return jM([e,"optionalAccess",n=>n.shadowRoot])===t}function ex(t){return Object.prototype.toString.call(t)==="[object ShadowRoot]"}function LPe(t){return t.includes(" background-clip: text;")&&!t.includes(" -webkit-background-clip: text;")&&(t=t.replace(" background-clip: text;"," -webkit-background-clip: text; background-clip: text;")),t}function XPe(t){const{cssText:e}=t;if(e.split('"').length<3)return e;const n=["@import",`url(${JSON.stringify(t.href)})`];return t.layerName===""?n.push("layer"):t.layerName&&n.push(`layer(${t.layerName})`),t.supportsText&&n.push(`supports(${t.supportsText})`),t.media.length&&n.push(t.media.mediaText),n.join(" ")+";"}function ZM(t){try{const e=t.rules||t.cssRules;return e?LPe(Array.from(e,Ioe).join("")):null}catch{return null}}function Ioe(t){let e;if(KPe(t))try{e=ZM(t.styleSheet)||XPe(t)}catch{}else if(qPe(t)&&t.selectorText.includes(":"))return CPe(t.cssText);return e||t.cssText}function CPe(t){const e=/(\[(?:[\w-]+)[^\\])(:(?:[\w-]+)\])/gm;return t.replace(e,"$1\\$2")}function KPe(t){return"styleSheet"in t}function qPe(t){return"selectorText"in t}class Uoe{constructor(){this.idNodeMap=new Map,this.nodeMetaMap=new WeakMap}getId(e){if(!e)return-1;const n=jM([this,"access",r=>r.getMeta,"call",r=>r(e),"optionalAccess",r=>r.id]);return UPe(n,()=>-1)}getNode(e){return this.idNodeMap.get(e)||null}getIds(){return Array.from(this.idNodeMap.keys())}getMeta(e){return this.nodeMetaMap.get(e)||null}removeNodeFromMap(e){const n=this.getId(e);this.idNodeMap.delete(n),e.childNodes&&e.childNodes.forEach(r=>this.removeNodeFromMap(r))}has(e){return this.idNodeMap.has(e)}hasNode(e){return this.nodeMetaMap.has(e)}add(e,n){const r=n.id;this.idNodeMap.set(r,e),this.nodeMetaMap.set(e,n)}replace(e,n){const r=this.getNode(e);if(r){const i=this.nodeMetaMap.get(r);i&&this.nodeMetaMap.set(n,i)}this.idNodeMap.set(e,n)}reset(){this.idNodeMap=new Map,this.nodeMetaMap=new WeakMap}}function DPe(){return new Uoe}function gV({maskInputOptions:t,tagName:e,type:n}){return e==="OPTION"&&(e="SELECT"),!!(t[e.toLowerCase()]||n&&t[n]||n==="password"||e==="INPUT"&&!n&&t.text)}function Qx({isMasked:t,element:e,value:n,maskInputFn:r}){let i=n||"";return t?(r&&(i=r(i,e)),"*".repeat(i.length)):i}function cb(t){return t.toLowerCase()}function nL(t){return t.toUpperCase()}const bj="__rrweb_original__";function WPe(t){const e=t.getContext("2d");if(!e)return!0;const n=50;for(let r=0;rl!==0))return!1}return!0}function KC(t){const e=t.type;return t.hasAttribute("data-rr-is-password")?"password":e?cb(e):null}function JM(t,e,n){return e==="INPUT"&&(n==="radio"||n==="checkbox")?t.getAttribute("value")||"":t.value}let APe=1;const GPe=new RegExp("[^a-z0-9-_:]"),_x=-2;function qC(){return APe++}function FPe(t){if(t instanceof HTMLFormElement)return"form";const e=cb(t.tagName);return GPe.test(e)?"div":e}function jPe(t){let e="";return t.indexOf("//")>-1?e=t.split("/").slice(0,3).join("/"):e=t.split("/")[0],e=e.split("?")[0],e}let _0,yj;const ZPe=/url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm,JPe=/^(?:[a-z+]+:)?\/\//i,YPe=/^www\..*/i,BPe=/^(data:)([^,]*),(.*)/i;function YM(t,e){return(t||"").replace(ZPe,(n,r,i,s,a,o)=>{const l=i||a||o,u=r||s||"";if(!l)return n;if(JPe.test(l)||YPe.test(l))return`url(${u}${l}${u})`;if(BPe.test(l))return`url(${u}${l}${u})`;if(l[0]==="/")return`url(${u}${jPe(e)+l}${u})`;const c=e.split("/"),d=l.split("/");c.pop();for(const f of d)f!=="."&&(f===".."?c.pop():c.push(f));return`url(${u}${c.join("/")}${u})`})}const HPe=/^[^ \t\n\r\u000c]+/,QPe=/^[, \t\n\r\u000c]+/;function _Pe(t,e){if(e.trim()==="")return e;let n=0;function r(s){let a;const o=s.exec(e.substring(n));return o?(a=o[0],n+=a.length,a):""}const i=[];for(;r(QPe),!(n>=e.length);){let s=r(HPe);if(s.slice(-1)===",")s=a1(t,s.substring(0,s.length-1)),i.push(s);else{let a="";s=a1(t,s);let o=!1;for(;;){const l=e.charAt(n);if(l===""){i.push((s+a).trim());break}else if(o)l===")"&&(o=!1);else if(l===","){n+=1,i.push((s+a).trim());break}else l==="("&&(o=!0);a+=l,n+=1}}}return i.join(", ")}function a1(t,e){if(!e||e.trim()==="")return e;const n=t.createElement("a");return n.href=e,n.href}function $Pe(t){return!!(t.tagName==="svg"||t.ownerSVGElement)}function DC(){const t=document.createElement("a");return t.href="",t.href}function Noe(t,e,n,r,i,s){return r&&(n==="src"||n==="href"&&!(e==="use"&&r[0]==="#")||n==="xlink:href"&&r[0]!=="#"||n==="background"&&(e==="table"||e==="td"||e==="th")?a1(t,r):n==="srcset"?_Pe(t,r):n==="style"?YM(r,DC()):e==="object"&&n==="data"?a1(t,r):typeof s=="function"?s(n,r,i):r)}function Loe(t,e,n){return(t==="video"||t==="audio")&&e==="autoplay"}function eRe(t,e,n,r){try{if(r&&t.matches(r))return!1;if(typeof e=="string"){if(t.classList.contains(e))return!0}else for(let i=t.classList.length;i--;){const s=t.classList[i];if(e.test(s))return!0}if(n)return t.matches(n)}catch{}return!1}function tRe(t,e){for(let n=t.classList.length;n--;){const r=t.classList[n];if(e.test(r))return!0}return!1}function lv(t,e,n=1/0,r=0){return!t||t.nodeType!==t.ELEMENT_NODE||r>n?-1:e(t)?r:lv(t.parentNode,e,n,r+1)}function o1(t,e){return n=>{const r=n;if(r===null)return!1;try{if(t){if(typeof t=="string"){if(r.matches(`.${t}`))return!0}else if(tRe(r,t))return!0}return!!(e&&r.matches(e))}catch{return!1}}}function db(t,e,n,r,i,s){try{const a=t.nodeType===t.ELEMENT_NODE?t:t.parentElement;if(a===null)return!1;if(a.tagName==="INPUT"){const u=a.getAttribute("autocomplete");if(["current-password","new-password","cc-number","cc-exp","cc-exp-month","cc-exp-year","cc-csc"].includes(u))return!0}let o=-1,l=-1;if(s){if(l=lv(a,o1(r,i)),l<0)return!0;o=lv(a,o1(e,n),l>=0?l:1/0)}else{if(o=lv(a,o1(e,n)),o<0)return!1;l=lv(a,o1(r,i),o>=0?o:1/0)}return o>=0?l>=0?o<=l:!0:l>=0?!1:!!s}catch{}return!!s}function nRe(t,e,n){const r=t.contentWindow;if(!r)return;let i=!1,s;try{s=r.document.readyState}catch{return}if(s!=="complete"){const o=setTimeout(()=>{i||(e(),i=!0)},n);t.addEventListener("load",()=>{clearTimeout(o),i=!0,e()});return}const a="about:blank";if(r.location.href!==a||t.src===a||t.src==="")return setTimeout(e,0),t.addEventListener("load",e);t.addEventListener("load",e)}function rRe(t,e,n){let r=!1,i;try{i=t.sheet}catch{return}if(i)return;const s=setTimeout(()=>{r||(e(),r=!0)},n);t.addEventListener("load",()=>{clearTimeout(s),r=!0,e()})}function iRe(t,e){const{doc:n,mirror:r,blockClass:i,blockSelector:s,unblockSelector:a,maskAllText:o,maskAttributeFn:l,maskTextClass:u,unmaskTextClass:c,maskTextSelector:d,unmaskTextSelector:f,inlineStylesheet:h,maskInputOptions:p={},maskTextFn:m,maskInputFn:v,dataURLOptions:g={},inlineImages:b,recordCanvas:y,keepIframeSrcFn:x,newlyAddedElement:T=!1}=e,M=sRe(n,r);switch(t.nodeType){case t.DOCUMENT_NODE:return t.compatMode!=="CSS1Compat"?{type:Ss.Document,childNodes:[],compatMode:t.compatMode}:{type:Ss.Document,childNodes:[]};case t.DOCUMENT_TYPE_NODE:return{type:Ss.DocumentType,name:t.name,publicId:t.publicId,systemId:t.systemId,rootId:M};case t.ELEMENT_NODE:return oRe(t,{doc:n,blockClass:i,blockSelector:s,unblockSelector:a,inlineStylesheet:h,maskAttributeFn:l,maskInputOptions:p,maskInputFn:v,dataURLOptions:g,inlineImages:b,recordCanvas:y,keepIframeSrcFn:x,newlyAddedElement:T,rootId:M,maskAllText:o,maskTextClass:u,unmaskTextClass:c,maskTextSelector:d,unmaskTextSelector:f});case t.TEXT_NODE:return aRe(t,{maskAllText:o,maskTextClass:u,unmaskTextClass:c,maskTextSelector:d,unmaskTextSelector:f,maskTextFn:m,maskInputOptions:p,maskInputFn:v,rootId:M});case t.CDATA_SECTION_NODE:return{type:Ss.CDATA,textContent:"",rootId:M};case t.COMMENT_NODE:return{type:Ss.Comment,textContent:t.textContent||"",rootId:M};default:return!1}}function sRe(t,e){if(!e.hasNode(t))return;const n=e.getId(t);return n===1?void 0:n}function aRe(t,e){const{maskAllText:n,maskTextClass:r,unmaskTextClass:i,maskTextSelector:s,unmaskTextSelector:a,maskTextFn:o,maskInputOptions:l,maskInputFn:u,rootId:c}=e,d=t.parentNode&&t.parentNode.tagName;let f=t.textContent;const h=d==="STYLE"?!0:void 0,p=d==="SCRIPT"?!0:void 0,m=d==="TEXTAREA"?!0:void 0;if(h&&f){try{t.nextSibling||t.previousSibling||jM([t,"access",g=>g.parentNode,"access",g=>g.sheet,"optionalAccess",g=>g.cssRules])&&(f=ZM(t.parentNode.sheet))}catch(g){console.warn(`Cannot get CSS styles from text's parentNode. Error: ${g}`,t)}f=YM(f,DC())}p&&(f="SCRIPT_PLACEHOLDER");const v=db(t,r,s,i,a,n);if(!h&&!p&&!m&&f&&v&&(f=o?o(f,t.parentElement):f.replace(/[\S]/g,"*")),m&&f&&(l.textarea||v)&&(f=u?u(f,t.parentNode):f.replace(/[\S]/g,"*")),d==="OPTION"&&f){const g=gV({type:null,tagName:d,maskInputOptions:l});f=Qx({isMasked:db(t,r,s,i,a,g),element:t,value:f,maskInputFn:u})}return{type:Ss.Text,textContent:f||"",isStyle:h,rootId:c}}function oRe(t,e){const{doc:n,blockClass:r,blockSelector:i,unblockSelector:s,inlineStylesheet:a,maskInputOptions:o={},maskAttributeFn:l,maskInputFn:u,dataURLOptions:c={},inlineImages:d,recordCanvas:f,keepIframeSrcFn:h,newlyAddedElement:p=!1,rootId:m,maskAllText:v,maskTextClass:g,unmaskTextClass:b,maskTextSelector:y,unmaskTextSelector:x}=e,T=eRe(t,r,i,s),M=FPe(t);let E={};const S=t.attributes.length;for(let R=0;Rz.href===t.href);let V=null;R&&(V=ZM(R)),V&&(delete E.rel,delete E.href,E._cssText=YM(V,R.href))}if(M==="style"&&t.sheet&&!(t.innerText||t.textContent||"").trim().length){const R=ZM(t.sheet);R&&(E._cssText=YM(R,DC()))}if(M==="input"||M==="textarea"||M==="select"||M==="option"){const R=t,V=KC(R),z=JM(R,nL(M),V),k=R.checked;if(V!=="submit"&&V!=="button"&&z){const N=db(R,g,y,b,x,gV({type:V,tagName:nL(M),maskInputOptions:o}));E.value=Qx({isMasked:N,element:R,value:z,maskInputFn:u})}k&&(E.checked=k)}if(M==="option"&&(t.selected&&!o.select?E.selected=!0:delete E.selected),M==="canvas"&&f){if(t.__context==="2d")WPe(t)||(E.rr_dataURL=t.toDataURL(c.type,c.quality));else if(!("__context"in t)){const R=t.toDataURL(c.type,c.quality),V=document.createElement("canvas");V.width=t.width,V.height=t.height;const z=V.toDataURL(c.type,c.quality);R!==z&&(E.rr_dataURL=R)}}if(M==="img"&&d){_0||(_0=n.createElement("canvas"),yj=_0.getContext("2d"));const R=t,V=R.crossOrigin;R.crossOrigin="anonymous";const z=()=>{R.removeEventListener("load",z);try{_0.width=R.naturalWidth,_0.height=R.naturalHeight,yj.drawImage(R,0,0),E.rr_dataURL=_0.toDataURL(c.type,c.quality)}catch(k){console.warn(`Cannot inline img src=${R.currentSrc}! Error: ${k}`)}V?E.crossOrigin=V:R.removeAttribute("crossorigin")};R.complete&&R.naturalWidth!==0?z():R.addEventListener("load",z)}if((M==="audio"||M==="video")&&(E.rr_mediaState=t.paused?"paused":"played",E.rr_mediaCurrentTime=t.currentTime),p||(t.scrollLeft&&(E.rr_scrollLeft=t.scrollLeft),t.scrollTop&&(E.rr_scrollTop=t.scrollTop)),T){const{width:R,height:V}=t.getBoundingClientRect();E={class:E.class,rr_width:`${R}px`,rr_height:`${V}px`}}M==="iframe"&&!h(E.src)&&(t.contentDocument||(E.rr_src=E.src),delete E.src);let P;try{customElements.get(M)&&(P=!0)}catch{}return{type:Ss.Element,tagName:M,attributes:E,childNodes:[],isSVG:$Pe(t)||void 0,needBlock:T,rootId:m,isCustom:P}}function jr(t){return t==null?"":t.toLowerCase()}function lRe(t,e){if(e.comment&&t.type===Ss.Comment)return!0;if(t.type===Ss.Element){if(e.script&&(t.tagName==="script"||t.tagName==="link"&&(t.attributes.rel==="preload"||t.attributes.rel==="modulepreload")&&t.attributes.as==="script"||t.tagName==="link"&&t.attributes.rel==="prefetch"&&typeof t.attributes.href=="string"&&t.attributes.href.endsWith(".js")))return!0;if(e.headFavicon&&(t.tagName==="link"&&t.attributes.rel==="shortcut icon"||t.tagName==="meta"&&(jr(t.attributes.name).match(/^msapplication-tile(image|color)$/)||jr(t.attributes.name)==="application-name"||jr(t.attributes.rel)==="icon"||jr(t.attributes.rel)==="apple-touch-icon"||jr(t.attributes.rel)==="shortcut icon")))return!0;if(t.tagName==="meta"){if(e.headMetaDescKeywords&&jr(t.attributes.name).match(/^description|keywords$/))return!0;if(e.headMetaSocial&&(jr(t.attributes.property).match(/^(og|twitter|fb):/)||jr(t.attributes.name).match(/^(og|twitter):/)||jr(t.attributes.name)==="pinterest"))return!0;if(e.headMetaRobots&&(jr(t.attributes.name)==="robots"||jr(t.attributes.name)==="googlebot"||jr(t.attributes.name)==="bingbot"))return!0;if(e.headMetaHttpEquiv&&t.attributes["http-equiv"]!==void 0)return!0;if(e.headMetaAuthorship&&(jr(t.attributes.name)==="author"||jr(t.attributes.name)==="generator"||jr(t.attributes.name)==="framework"||jr(t.attributes.name)==="publisher"||jr(t.attributes.name)==="progid"||jr(t.attributes.property).match(/^article:/)||jr(t.attributes.property).match(/^product:/)))return!0;if(e.headMetaVerification&&(jr(t.attributes.name)==="google-site-verification"||jr(t.attributes.name)==="yandex-verification"||jr(t.attributes.name)==="csrf-token"||jr(t.attributes.name)==="p:domain_verify"||jr(t.attributes.name)==="verify-v1"||jr(t.attributes.name)==="verification"||jr(t.attributes.name)==="shopify-checkout-api-token"))return!0}}return!1}function l1(t,e){const{doc:n,mirror:r,blockClass:i,blockSelector:s,unblockSelector:a,maskAllText:o,maskTextClass:l,unmaskTextClass:u,maskTextSelector:c,unmaskTextSelector:d,skipChild:f=!1,inlineStylesheet:h=!0,maskInputOptions:p={},maskAttributeFn:m,maskTextFn:v,maskInputFn:g,slimDOMOptions:b,dataURLOptions:y={},inlineImages:x=!1,recordCanvas:T=!1,onSerialize:M,onIframeLoad:E,iframeLoadTimeout:S=5e3,onStylesheetLoad:P,stylesheetLoadTimeout:R=5e3,keepIframeSrcFn:V=()=>!1,newlyAddedElement:z=!1}=e;let{preserveWhiteSpace:k=!0}=e;const N=iRe(t,{doc:n,mirror:r,blockClass:i,blockSelector:s,maskAllText:o,unblockSelector:a,maskTextClass:l,unmaskTextClass:u,maskTextSelector:c,unmaskTextSelector:d,inlineStylesheet:h,maskInputOptions:p,maskAttributeFn:m,maskTextFn:v,maskInputFn:g,dataURLOptions:y,inlineImages:x,recordCanvas:T,keepIframeSrcFn:V,newlyAddedElement:z});if(!N)return console.warn(t,"not serialized"),null;let q;r.hasNode(t)?q=r.getId(t):lRe(N,b)||!k&&N.type===Ss.Text&&!N.isStyle&&!N.textContent.replace(/^\s+|\s+$/gm,"").length?q=_x:q=qC();const L=Object.assign(N,{id:q});if(r.add(t,L),q===_x)return null;M&&M(t);let A=!f;if(L.type===Ss.Element){A=A&&!L.needBlock,delete L.needBlock;const Z=t.shadowRoot;Z&&ex(Z)&&(L.isShadowHost=!0)}if((L.type===Ss.Document||L.type===Ss.Element)&&A){b.headWhitespace&&L.type===Ss.Element&&L.tagName==="head"&&(k=!1);const Z={doc:n,mirror:r,blockClass:i,blockSelector:s,maskAllText:o,unblockSelector:a,maskTextClass:l,unmaskTextClass:u,maskTextSelector:c,unmaskTextSelector:d,skipChild:f,inlineStylesheet:h,maskInputOptions:p,maskAttributeFn:m,maskTextFn:v,maskInputFn:g,slimDOMOptions:b,dataURLOptions:y,inlineImages:x,recordCanvas:T,preserveWhiteSpace:k,onSerialize:M,onIframeLoad:E,iframeLoadTimeout:S,onStylesheetLoad:P,stylesheetLoadTimeout:R,keepIframeSrcFn:V};for(const j of Array.from(t.childNodes)){const ne=l1(j,Z);ne&&L.childNodes.push(ne)}if(NPe(t)&&t.shadowRoot)for(const j of Array.from(t.shadowRoot.childNodes)){const ne=l1(j,Z);ne&&(ex(t.shadowRoot)&&(ne.isShadow=!0),L.childNodes.push(ne))}}return t.parentNode&&$3(t.parentNode)&&ex(t.parentNode)&&(L.isShadow=!0),L.type===Ss.Element&&L.tagName==="iframe"&&nRe(t,()=>{const Z=t.contentDocument;if(Z&&E){const j=l1(Z,{doc:Z,mirror:r,blockClass:i,blockSelector:s,unblockSelector:a,maskAllText:o,maskTextClass:l,unmaskTextClass:u,maskTextSelector:c,unmaskTextSelector:d,skipChild:!1,inlineStylesheet:h,maskInputOptions:p,maskAttributeFn:m,maskTextFn:v,maskInputFn:g,slimDOMOptions:b,dataURLOptions:y,inlineImages:x,recordCanvas:T,preserveWhiteSpace:k,onSerialize:M,onIframeLoad:E,iframeLoadTimeout:S,onStylesheetLoad:P,stylesheetLoadTimeout:R,keepIframeSrcFn:V});j&&E(t,j)}},S),L.type===Ss.Element&&L.tagName==="link"&&L.attributes.rel==="stylesheet"&&rRe(t,()=>{if(P){const Z=l1(t,{doc:n,mirror:r,blockClass:i,blockSelector:s,unblockSelector:a,maskAllText:o,maskTextClass:l,unmaskTextClass:u,maskTextSelector:c,unmaskTextSelector:d,skipChild:!1,inlineStylesheet:h,maskInputOptions:p,maskAttributeFn:m,maskTextFn:v,maskInputFn:g,slimDOMOptions:b,dataURLOptions:y,inlineImages:x,recordCanvas:T,preserveWhiteSpace:k,onSerialize:M,onIframeLoad:E,iframeLoadTimeout:S,onStylesheetLoad:P,stylesheetLoadTimeout:R,keepIframeSrcFn:V});Z&&P(t,Z)}},R),L}function uRe(t,e){const{mirror:n=new Uoe,blockClass:r="rr-block",blockSelector:i=null,unblockSelector:s=null,maskAllText:a=!1,maskTextClass:o="rr-mask",unmaskTextClass:l=null,maskTextSelector:u=null,unmaskTextSelector:c=null,inlineStylesheet:d=!0,inlineImages:f=!1,recordCanvas:h=!1,maskAllInputs:p=!1,maskAttributeFn:m,maskTextFn:v,maskInputFn:g,slimDOM:b=!1,dataURLOptions:y,preserveWhiteSpace:x,onSerialize:T,onIframeLoad:M,iframeLoadTimeout:E,onStylesheetLoad:S,stylesheetLoadTimeout:P,keepIframeSrcFn:R=()=>!1}=e||{};return l1(t,{doc:t,mirror:n,blockClass:r,blockSelector:i,unblockSelector:s,maskAllText:a,maskTextClass:o,unmaskTextClass:l,maskTextSelector:u,unmaskTextSelector:c,skipChild:!1,inlineStylesheet:d,maskInputOptions:p===!0?{color:!0,date:!0,"datetime-local":!0,email:!0,month:!0,number:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0,textarea:!0,select:!0}:p===!1?{}:p,maskAttributeFn:m,maskTextFn:v,maskInputFn:g,slimDOMOptions:b===!0||b==="all"?{script:!0,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaDescKeywords:b==="all",headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaAuthorship:!0,headMetaVerification:!0}:b===!1?{}:b,dataURLOptions:y,inlineImages:f,recordCanvas:h,preserveWhiteSpace:x,onSerialize:T,onIframeLoad:M,iframeLoadTimeout:E,onStylesheetLoad:S,stylesheetLoadTimeout:P,keepIframeSrcFn:R,newlyAddedElement:!1})}function zh(t){let e,n=t[0],r=1;for(;rn.call(e,...a)),e=void 0)}return n}function Qa(t,e,n=document){const r={capture:!0,passive:!0};return n.addEventListener(t,e,r),()=>n.removeEventListener(t,e,r)}const jg=`Please stop import mirror directly. Instead of that,\r +Error:`,i)}}function M7e(){return c7e(t=>{ly("cls",{metric:t}),noe=t},{reportAllChanges:!0})}function P7e(){return h7e(t=>{ly("fid",{metric:t}),roe=t})}function R7e(){return y7e(t=>{ly("lcp",{metric:t}),ioe=t})}function V7e(){return S7e(t=>{ly("ttfb",{metric:t}),soe=t})}function z7e(){return b7e(t=>{ly("inp",{metric:t}),aoe=t})}function cT(t,e,n,r,i=!1){loe(t,e);let s;return GM[t]||(s=n(),GM[t]=!0),r&&e({metric:r}),uoe(t,e,i?s:void 0)}function k7e(t){const e={};t==="event"&&(e.durationThreshold=0),oy(t,n=>{ly(t,{entries:n})},e)}function loe(t,e){H3[t]=H3[t]||[],H3[t].push(e)}function uoe(t,e,n){return()=>{n&&n();const r=H3[t];if(!r)return;const i=r.indexOf(e);i!==-1&&r.splice(i,1)}}function Yz(t){return typeof t=="number"&&isFinite(t)}function lb(t,{startTimestamp:e,...n}){return e&&t.startTimestamp>e&&(t.startTimestamp=e),t.startChild({startTimestamp:e,...n})}const O7e=2147483647;function Ts(t){return t/1e3}function IC(){return pn&&pn.addEventListener&&pn.performance}let sj=0,Ui={},wc,Q3;function I7e(){const t=IC();if(t&&gl){t.mark&&pn.performance.mark("sentry-tracing-init");const e=K7e(),n=X7e(),r=C7e(),i=q7e();return()=>{e(),n(),r(),i()}}return()=>{}}function U7e(){ob("longtask",({entries:t})=>{for(const e of t){const n=Dv();if(!n)return;const r=Ts(gl+e.startTime),i=Ts(e.duration);n.startChild({description:"Main UI thread blocked",op:"ui.long-task",origin:"auto.ui.browser.metrics",startTimestamp:r,endTimestamp:r+i})}})}function N7e(){ob("event",({entries:t})=>{for(const e of t){const n=Dv();if(!n)return;if(e.name==="click"){const r=Ts(gl+e.startTime),i=Ts(e.duration),s={description:zp(e.target),op:`ui.interaction.${e.name}`,origin:"auto.ui.browser.metrics",startTimestamp:r,endTimestamp:r+i},a=dae(e.target);a&&(s.attributes={"ui.component_name":a}),n.startChild(s)}}})}function L7e(t,e){if(IC()&&gl){const r=D7e(t,e);return()=>{r()}}return()=>{}}function X7e(){return x7e(({metric:t})=>{const e=t.entries[t.entries.length-1];e&&(_r&&He.log("[Measurements] Adding CLS"),Ui.cls={value:t.value,unit:""},Q3=e)},!0)}function C7e(){return ooe(({metric:t})=>{const e=t.entries[t.entries.length-1];e&&(_r&&He.log("[Measurements] Adding LCP"),Ui.lcp={value:t.value,unit:"millisecond"},wc=e)},!0)}function K7e(){return w7e(({metric:t})=>{const e=t.entries[t.entries.length-1];if(!e)return;const n=Ts(gl),r=Ts(e.startTime);_r&&He.log("[Measurements] Adding FID"),Ui.fid={value:t.value,unit:"millisecond"},Ui["mark.fid"]={value:n+r,unit:"second"}})}function q7e(){return T7e(({metric:t})=>{t.entries[t.entries.length-1]&&(_r&&He.log("[Measurements] Adding TTFB"),Ui.ttfb={value:t.value,unit:"millisecond"})})}const aj={click:"click",pointerdown:"click",pointerup:"click",mousedown:"click",mouseup:"click",touchstart:"click",touchend:"click",mouseover:"hover",mouseout:"hover",mouseenter:"hover",mouseleave:"hover",pointerover:"hover",pointerout:"hover",pointerenter:"hover",pointerleave:"hover",dragstart:"drag",dragend:"drag",drag:"drag",dragenter:"drag",dragleave:"drag",dragover:"drag",drop:"drag",keydown:"press",keyup:"press",keypress:"press",input:"press"};function D7e(t,e){return E7e(({metric:n})=>{if(n.value===void 0)return;const r=n.entries.find(y=>y.duration===n.value&&aj[y.name]!==void 0),i=Rr();if(!r||!i)return;const s=aj[r.name],a=i.getOptions(),o=Ts(gl+r.startTime),l=Ts(n.value),u=r.interactionId!==void 0?t[r.interactionId]:void 0;if(u===void 0)return;const{routeName:c,parentContext:d,activeTransaction:f,user:h,replayId:p}=u,m=h!==void 0?h.email||h.id||h.ip_address:void 0,v=f!==void 0?f.getProfileId():void 0,g=new pV({startTimestamp:o,endTimestamp:o+l,op:`ui.interaction.${s}`,name:zp(r.target),attributes:{release:a.release,environment:a.environment,transaction:c,...m!==void 0&&m!==""?{user:m}:{},...v!==void 0?{profile_id:v}:{},...p!==void 0?{replay_id:p}:{}},exclusiveTime:n.value,measurements:{inp:{value:n.value,unit:"millisecond"}}}),b=B7e(d,a,e);if(b&&Math.random(){_r&&He.error("Error while sending interaction:",T)});return}})}function W7e(t){const e=IC();if(!e||!pn.performance.getEntries||!gl)return;_r&&He.log("[Tracing] Adding & adjusting spans using Performance API");const n=Ts(gl),r=e.getEntries(),{op:i,start_timestamp:s}=As(t);if(r.slice(sj).forEach(a=>{const o=Ts(a.startTime),l=Ts(a.duration);if(!(t.op==="navigation"&&s&&n+o{if(!Ui[o]||!s||n>=s)return;const l=Ui[o].value,u=n+Ts(l),c=Math.abs((u-s)*1e3),d=c-l;_r&&He.log(`[Measurements] Normalized ${o} from ${l} to ${c} (${d})`),Ui[o].value=c});const a=Ui["mark.fid"];a&&Ui.fid&&(lb(t,{description:"first input delay",endTimestamp:a.value+Ts(Ui.fid.value),op:"ui.action",origin:"auto.ui.browser.metrics",startTimestamp:a.value}),delete Ui["mark.fid"]),"fcp"in Ui||delete Ui.cls,Object.keys(Ui).forEach(o=>{gEe(o,Ui[o].value,Ui[o].unit)}),J7e(t)}wc=void 0,Q3=void 0,Ui={}}function A7e(t,e,n,r,i){const s=i+n,a=s+r;return lb(t,{description:e.name,endTimestamp:a,op:e.entryType,origin:"auto.resource.browser.metrics",startTimestamp:s}),s}function G7e(t,e,n){["unloadEvent","redirect","domContentLoadedEvent","loadEvent","connect"].forEach(r=>{s2(t,e,r,n)}),s2(t,e,"secureConnection",n,"TLS/SSL","connectEnd"),s2(t,e,"fetch",n,"cache","domainLookupStart"),s2(t,e,"domainLookup",n,"DNS"),F7e(t,e,n)}function s2(t,e,n,r,i,s){const a=s?e[s]:e[`${n}End`],o=e[`${n}Start`];!o||!a||lb(t,{op:"browser",origin:"auto.browser.browser.metrics",description:i||n,startTimestamp:r+Ts(o),endTimestamp:r+Ts(a)})}function F7e(t,e,n){e.responseEnd&&(lb(t,{op:"browser",origin:"auto.browser.browser.metrics",description:"request",startTimestamp:n+Ts(e.requestStart),endTimestamp:n+Ts(e.responseEnd)}),lb(t,{op:"browser",origin:"auto.browser.browser.metrics",description:"response",startTimestamp:n+Ts(e.responseStart),endTimestamp:n+Ts(e.responseEnd)}))}function j7e(t,e,n,r,i,s){if(e.initiatorType==="xmlhttprequest"||e.initiatorType==="fetch")return;const a=Ev(n),o={};Bz(o,e,"transferSize","http.response_transfer_size"),Bz(o,e,"encodedBodySize","http.response_content_length"),Bz(o,e,"decodedBodySize","http.decoded_response_content_length"),"renderBlockingStatus"in e&&(o["resource.render_blocking_status"]=e.renderBlockingStatus),a.protocol&&(o["url.scheme"]=a.protocol.split(":").pop()),a.host&&(o["server.address"]=a.host),o["url.same_origin"]=n.includes(pn.location.origin);const l=s+r,u=l+i;lb(t,{description:n.replace(pn.location.origin,""),endTimestamp:u,op:e.initiatorType?`resource.${e.initiatorType}`:"resource.other",origin:"auto.resource.browser.metrics",startTimestamp:l,data:o})}function Z7e(t){const e=pn.navigator;if(!e)return;const n=e.connection;n&&(n.effectiveType&&t.setTag("effectiveConnectionType",n.effectiveType),n.type&&t.setTag("connectionType",n.type),Yz(n.rtt)&&(Ui["connection.rtt"]={value:n.rtt,unit:"millisecond"})),Yz(e.deviceMemory)&&t.setTag("deviceMemory",`${e.deviceMemory} GB`),Yz(e.hardwareConcurrency)&&t.setTag("hardwareConcurrency",String(e.hardwareConcurrency))}function J7e(t){wc&&(_r&&He.log("[Measurements] Adding LCP Data"),wc.element&&t.setTag("lcp.element",zp(wc.element)),wc.id&&t.setTag("lcp.id",wc.id),wc.url&&t.setTag("lcp.url",wc.url.trim().slice(0,200)),t.setTag("lcp.size",wc.size)),Q3&&Q3.sources&&(_r&&He.log("[Measurements] Adding CLS Data"),Q3.sources.forEach((e,n)=>t.setTag(`cls.source.${n+1}`,zp(e.node))))}function Bz(t,e,n,r){const i=e[n];i!=null&&i0?m.join(","):void 0}}else return{"sentry-trace":d,baggage:f}}function _7e(t){try{return new URL(t).href}catch{return}}function $7e(t,e){if(e.response){zC(t,e.response.status);const n=e.response&&e.response.headers&&e.response.headers.get("content-length");if(n){const r=parseInt(n);r>0&&t.setAttribute("http.response_content_length",r)}}else e.error&&t.setStatus("internal_error");t.end()}const _N=["localhost",/^\/(?!\/)/],$N={traceFetch:!0,traceXHR:!0,enableHTTPTimings:!0,tracingOrigins:_N,tracePropagationTargets:_N};function eMe(t){const{traceFetch:e,traceXHR:n,tracePropagationTargets:r,tracingOrigins:i,shouldCreateSpanForRequest:s,enableHTTPTimings:a}={traceFetch:$N.traceFetch,traceXHR:$N.traceXHR,...t},o=typeof s=="function"?s:c=>!0,l=c=>iMe(c,r||i),u={};e&&xC(c=>{const d=H7e(c,o,l,u);if(d){const f=coe(c.fetchData.url),h=f?Ev(f).host:void 0;d.setAttributes({"http.url":f,"server.address":h})}a&&d&&oj(d)}),n&&TC(c=>{const d=sMe(c,o,l,u);a&&d&&oj(d)})}function tMe(t){return t.entryType==="resource"&&"initiatorType"in t&&typeof t.nextHopProtocol=="string"&&(t.initiatorType==="fetch"||t.initiatorType==="xmlhttprequest")}function oj(t){const{url:e}=As(t).data||{};if(!e||typeof e!="string")return;const n=ob("resource",({entries:r})=>{r.forEach(i=>{tMe(i)&&i.name.endsWith(e)&&(rMe(i).forEach(a=>t.setAttribute(...a)),setTimeout(n))})})}function nMe(t){let e="unknown",n="unknown",r="";for(const i of t){if(i==="/"){[e,n]=t.split("/");break}if(!isNaN(Number(i))){e=r==="h"?"http":r,n=t.split(r)[1];break}r+=i}return r===t&&(e=r),{name:e,version:n}}function ic(t=0){return((gl||performance.timeOrigin)+t)/1e3}function rMe(t){const{name:e,version:n}=nMe(t.nextHopProtocol),r=[];return r.push(["network.protocol.version",n],["network.protocol.name",e]),gl?[...r,["http.request.redirect_start",ic(t.redirectStart)],["http.request.fetch_start",ic(t.fetchStart)],["http.request.domain_lookup_start",ic(t.domainLookupStart)],["http.request.domain_lookup_end",ic(t.domainLookupEnd)],["http.request.connect_start",ic(t.connectStart)],["http.request.secure_connection_start",ic(t.secureConnectionStart)],["http.request.connection_end",ic(t.connectEnd)],["http.request.request_start",ic(t.requestStart)],["http.request.response_start",ic(t.responseStart)],["http.request.response_end",ic(t.responseEnd)]]:r}function iMe(t,e){return ny(t,e||_N)}function sMe(t,e,n,r){const i=t.xhr,s=i&&i[jh];if(!v0()||!i||i.__sentry_own_request__||!s)return;const a=e(s.url);if(t.endTimestamp&&a){const h=i.__sentry_xhr_span_id__;if(!h)return;const p=r[h];p&&s.status_code!==void 0&&(zC(p,s.status_code),p.end(),delete r[h]);return}const o=Fo(),l=Qp(),u=coe(s.url),c=u?Ev(u).host:void 0,d=a?DM({name:`${s.method} ${s.url}`,onlyIfParent:!0,attributes:{type:"xhr","http.method":s.method,"http.url":u,url:s.url,"server.address":c,[_d]:"auto.http.browser"},op:"http.client"}):void 0;d&&(i.__sentry_xhr_span_id__=d.spanContext().spanId,r[i.__sentry_xhr_span_id__]=d);const f=Rr();if(i.setRequestHeader&&n(s.url)&&f){const{traceId:h,spanId:p,sampled:m,dsc:v}={...l.getPropagationContext(),...o.getPropagationContext()},g=d?dV(d):EC(h,p,m),b=Mae(v||(d?ab(d):hV(h,f,o)));aMe(i,g,b)}return d}function aMe(t,e,n){try{t.setRequestHeader("sentry-trace",e),n&&t.setRequestHeader(jN,n)}catch{}}function coe(t){try{return new URL(t,pn.location.origin).href}catch{return}}function oMe(t,e=!0,n=!0){if(!pn||!pn.location){_r&&He.warn("Could not initialize routing instrumentation due to invalid location");return}let r=pn.location.href,i;e&&(i=t({name:pn.location.pathname,startTimestamp:gl?gl/1e3:void 0,op:"pageload",origin:"auto.pageload.browser",metadata:{source:"url"}})),n&&uV(({to:s,from:a})=>{if(a===void 0&&r&&r.indexOf(s)!==-1){r=void 0;return}a!==s&&(r=void 0,i&&(_r&&He.log(`[Tracing] Finishing current transaction with op: ${i.op}`),i.end()),i=t({name:pn.location.pathname,op:"navigation",origin:"auto.navigation.browser",metadata:{source:"url"}}))})}const lMe="BrowserTracing",uMe={...g7,markBackgroundTransactions:!0,routingInstrumentation:oMe,startTransactionOnLocationChange:!0,startTransactionOnPageLoad:!0,enableLongTask:!0,enableInp:!1,interactionsSampleRate:1,_experiments:{},...$N},lj=10;class cMe{constructor(e){this.name=lMe,this._hasSetTracePropagationTargets=!1,vEe(),_r&&(this._hasSetTracePropagationTargets=!!(e&&(e.tracePropagationTargets||e.tracingOrigins))),this.options={...uMe,...e},this.options._experiments.enableLongTask!==void 0&&(this.options.enableLongTask=this.options._experiments.enableLongTask),e&&!e.tracePropagationTargets&&e.tracingOrigins&&(this.options.tracePropagationTargets=e.tracingOrigins),this._collectWebVitals=I7e(),this._interactionIdToRouteNameMapping={},this.options.enableInp&&L7e(this._interactionIdToRouteNameMapping,this.options.interactionsSampleRate),this.options.enableLongTask&&U7e(),this.options._experiments.enableInteractions&&N7e(),this._latestRoute={name:void 0,context:void 0}}setupOnce(e,n){this._getCurrentHub=n;const i=n().getClient(),s=i&&i.getOptions(),{routingInstrumentation:a,startTransactionOnLocationChange:o,startTransactionOnPageLoad:l,markBackgroundTransactions:u,traceFetch:c,traceXHR:d,shouldCreateSpanForRequest:f,enableHTTPTimings:h,_experiments:p}=this.options,m=s&&s.tracePropagationTargets,v=m||this.options.tracePropagationTargets;_r&&this._hasSetTracePropagationTargets&&m&&He.warn("[Tracing] The `tracePropagationTargets` option was set in the BrowserTracing integration and top level `Sentry.init`. The top level `Sentry.init` value is being used."),a(g=>{const b=this._createRouteTransaction(g);return this.options._experiments.onStartRouteTransaction&&this.options._experiments.onStartRouteTransaction(b,g,n),b},l,o),u&&o7e(),p.enableInteractions&&this._registerInteractionListener(),this.options.enableInp&&this._registerInpInteractionListener(),eMe({traceFetch:c,traceXHR:d,tracePropagationTargets:v,shouldCreateSpanForRequest:f,enableHTTPTimings:h})}_createRouteTransaction(e){if(!this._getCurrentHub){_r&&He.warn(`[Tracing] Did not create ${e.op} transaction because _getCurrentHub is invalid.`);return}const n=this._getCurrentHub(),{beforeNavigate:r,idleTimeout:i,finalTimeout:s,heartbeatInterval:a}=this.options,o=e.op==="pageload";let l;if(o){const h=o?uj("sentry-trace"):"",p=o?uj("baggage"):void 0,{traceId:m,dsc:v,parentSpanId:g,sampled:b}=S5e(h,p);l={traceId:m,parentSpanId:g,parentSampled:b,...e,metadata:{...e.metadata,dynamicSamplingContext:v},trimEnd:!0}}else l={trimEnd:!0,...e};const u=typeof r=="function"?r(l):l,c=u===void 0?{...l,sampled:!1}:u;c.metadata=c.name!==l.name?{...c.metadata,source:"custom"}:c.metadata,this._latestRoute.name=c.name,this._latestRoute.context=c,c.sampled===!1&&_r&&He.log(`[Tracing] Will not send ${c.op} transaction because of beforeNavigate.`),_r&&He.log(`[Tracing] Starting ${c.op} transaction on scope`);const{location:d}=pn,f=YF(n,c,i,s,!0,{location:d},a,o);return o&&pn.document&&(pn.document.addEventListener("readystatechange",()=>{["interactive","complete"].includes(pn.document.readyState)&&f.sendAutoFinishSignal()}),["interactive","complete"].includes(pn.document.readyState)&&f.sendAutoFinishSignal()),f.registerBeforeFinishCallback(h=>{this._collectWebVitals(),W7e(h)}),f}_registerInteractionListener(){let e;const n=()=>{const{idleTimeout:r,finalTimeout:i,heartbeatInterval:s}=this.options,a="ui.action.click",o=Dv();if(o&&o.op&&["navigation","pageload"].includes(o.op)){_r&&He.warn(`[Tracing] Did not create ${a} transaction because a pageload or navigation transaction is in progress.`);return}if(e&&(e.setFinishReason("interactionInterrupted"),e.end(),e=void 0),!this._getCurrentHub){_r&&He.warn(`[Tracing] Did not create ${a} transaction because _getCurrentHub is invalid.`);return}if(!this._latestRoute.name){_r&&He.warn(`[Tracing] Did not create ${a} transaction because _latestRouteName is missing.`);return}const l=this._getCurrentHub(),{location:u}=pn,c={name:this._latestRoute.name,op:a,trimEnd:!0,data:{[Nu]:this._latestRoute.context?dMe(this._latestRoute.context):"url"}};e=YF(l,c,r,i,!0,{location:u},s)};["click"].forEach(r=>{pn.document&&addEventListener(r,n,{once:!1,capture:!0})})}_registerInpInteractionListener(){const e=({entries:n})=>{const r=Rr(),i=r!==void 0&&r.getIntegrationByName!==void 0?r.getIntegrationByName("Replay"):void 0,s=i!==void 0?i.getReplayId():void 0,a=Dv(),o=Fo(),l=o!==void 0?o.getUser():void 0;n.forEach(u=>{if(fMe(u)){const c=u.interactionId;if(c===void 0)return;const d=this._interactionIdToRouteNameMapping[c],f=u.duration,h=u.startTime,p=Object.keys(this._interactionIdToRouteNameMapping),m=p.length>0?p.reduce((v,g)=>this._interactionIdToRouteNameMapping[v].durationthis._interactionIdToRouteNameMapping[g]).some(g=>g.duration===f&&g.startTime===h)||!c)return;if(d)d.duration=Math.max(d.duration,f);else if(p.lengththis._interactionIdToRouteNameMapping[m].duration){const v=this._latestRoute.name,g=this._latestRoute.context;v&&g&&(m&&Object.keys(this._interactionIdToRouteNameMapping).length>=lj&&delete this._interactionIdToRouteNameMapping[m],this._interactionIdToRouteNameMapping[c]={routeName:v,duration:f,parentContext:g,user:l,activeTransaction:a,replayId:s,startTime:h})}}})};ob("event",e),ob("first-input",e)}}function uj(t){const e=M2e(`meta[name=${t}]`);return e?e.getAttribute("content"):void 0}function dMe(t){const e=t.attributes&&t.attributes[Nu],n=t.data&&t.data[Nu],r=t.metadata&&t.metadata.source;return e||n||r}function fMe(t){return"duration"in t}const gr=Gn;let eL=0;function doe(){return eL>0}function hMe(){eL++,setTimeout(()=>{eL--})}function ub(t,e={},n){if(typeof t!="function")return t;try{const i=t.__sentry_wrapped__;if(i)return typeof i=="function"?i:t;if(yC(t))return t}catch{return t}const r=function(){const i=Array.prototype.slice.call(arguments);try{n&&typeof n=="function"&&n.apply(this,arguments);const s=i.map(a=>ub(a,e));return t.apply(this,s)}catch(s){throw hMe(),J5e(a=>{a.addEventProcessor(o=>(e.mechanism&&(KN(o,void 0,void 0),Yx(o,e.mechanism)),o.extra={...o.extra,arguments:i},o)),ay(s)}),s}};try{for(const i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[i]=t[i])}catch{}hae(r,t),Kv(t,"__sentry_wrapped__",r);try{Object.getOwnPropertyDescriptor(r,"name").configurable&&Object.defineProperty(r,"name",{get(){return t.name}})}catch{}return r}const $d=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__;function foe(t,e){const n=UC(t,e),r={type:e&&e.name,value:gMe(e)};return n.length&&(r.stacktrace={frames:n}),r.type===void 0&&r.value===""&&(r.value="Unrecoverable error caught"),r}function pMe(t,e,n,r){const i=Rr(),s=i&&i.getOptions().normalizeDepth,a={exception:{values:[{type:oV(e)?e.constructor.name:r?"UnhandledRejection":"Error",value:SMe(e,{isUnhandledRejection:r})}]},extra:{__serialized__:Tae(e,s)}};if(n){const o=UC(t,n);o.length&&(a.exception.values[0].stacktrace={frames:o})}return a}function Hz(t,e){return{exception:{values:[foe(t,e)]}}}function UC(t,e){const n=e.stacktrace||e.stack||"",r=vMe(e);try{return t(n,r)}catch{}return[]}const mMe=/Minified React error #\d+;/i;function vMe(t){if(t){if(typeof t.framesToPop=="number")return t.framesToPop;if(mMe.test(t.message))return 1}return 0}function gMe(t){const e=t&&t.message;return e?e.error&&typeof e.error.message=="string"?e.error.message:e:"No error message"}function bMe(t,e,n,r){const i=n&&n.syntheticException||void 0,s=NC(t,e,i,r);return Yx(s),s.level="error",n&&n.event_id&&(s.event_id=n.event_id),sb(s)}function yMe(t,e,n="info",r,i){const s=r&&r.syntheticException||void 0,a=tL(t,e,s,i);return a.level=n,r&&r.event_id&&(a.event_id=r.event_id),sb(a)}function NC(t,e,n,r,i){let s;if(mC(e)&&e.error)return Hz(t,e.error);if(TF(e)||m2e(e)){const a=e;if("stack"in e)s=Hz(t,e);else{const o=a.name||(TF(a)?"DOMError":"DOMException"),l=a.message?`${o}: ${a.message}`:o;s=tL(t,l,n,r),KN(s,l)}return"code"in a&&(s.tags={...s.tags,"DOMException.code":`${a.code}`}),s}return oae(e)?Hz(t,e):ib(e)||oV(e)?(s=pMe(t,e,n,i),Yx(s,{synthetic:!0}),s):(s=tL(t,e,n,r),KN(s,`${e}`,void 0),Yx(s,{synthetic:!0}),s)}function tL(t,e,n,r){const i={};if(r&&n){const s=UC(t,n);s.length&&(i.exception={values:[{value:e,stacktrace:{frames:s}}]})}if(vC(e)){const{__sentry_template_string__:s,__sentry_template_values__:a}=e;return i.logentry={message:s,params:a},i}return i.message=e,i}function SMe(t,{isUnhandledRejection:e}){const n=N2e(t),r=e?"promise rejection":"exception";return mC(t)?`Event \`ErrorEvent\` captured as ${r} with message \`${t.message}\``:oV(t)?`Event \`${xMe(t)}\` (type=${t.type}) captured as ${r}`:`Object captured as ${r} with keys: ${n}`}function xMe(t){try{const e=Object.getPrototypeOf(t);return e?e.constructor.name:void 0}catch{}}function TMe(t,{metadata:e,tunnel:n,dsn:r}){const i={event_id:t.event_id,sent_at:new Date().toISOString(),...e&&e.sdk&&{sdk:{name:e.sdk.name,version:e.sdk.version}},...!!n&&!!r&&{dsn:iy(r)}},s=wMe(t);return Hp(i,[s])}function wMe(t){return[{type:"user_report"},t]}class EMe extends UEe{constructor(e){const n=gr.SENTRY_SDK_SOURCE||n5e();JEe(e,"browser",["browser"],n),super(e),e.sendClientReports&&gr.document&&gr.document.addEventListener("visibilitychange",()=>{gr.document.visibilityState==="hidden"&&this._flushOutcomes()})}eventFromException(e,n){return bMe(this._options.stackParser,e,n,this._options.attachStacktrace)}eventFromMessage(e,n="info",r){return yMe(this._options.stackParser,e,n,r,this._options.attachStacktrace)}captureUserFeedback(e){if(!this._isEnabled()){$d&&He.warn("SDK not enabled, will not capture user feedback.");return}const n=TMe(e,{metadata:this.getSdkMetadata(),dsn:this.getDsn(),tunnel:this.getOptions().tunnel});this._sendEnvelope(n)}_prepareEvent(e,n,r){return e.platform=e.platform||"javascript",super._prepareEvent(e,n,r)}_flushOutcomes(){const e=this._clearOutcomes();if(e.length===0){$d&&He.log("No outcomes to send");return}if(!this._dsn){$d&&He.log("No dsn provided, will not send outcomes");return}$d&&He.log("Sending outcomes:",e);const n=P5e(e,this._options.tunnel&&iy(this._dsn));this._sendEnvelope(n)}}let m3;function MMe(){if(m3)return m3;if(AN(gr.fetch))return m3=gr.fetch.bind(gr);const t=gr.document;let e=gr.fetch;if(t&&typeof t.createElement=="function")try{const n=t.createElement("iframe");n.hidden=!0,t.head.appendChild(n);const r=n.contentWindow;r&&r.fetch&&(e=r.fetch),t.head.removeChild(n)}catch(n){$d&&He.warn("Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ",n)}return m3=e.bind(gr)}function PMe(){m3=void 0}function RMe(t,e=MMe()){let n=0,r=0;function i(s){const a=s.body.length;n+=a,r++;const o={body:s.body,method:"POST",referrerPolicy:"origin",headers:t.headers,keepalive:n<=6e4&&r<15,...t.fetchOptions};try{return e(t.url,o).then(l=>(n-=a,r--,{statusCode:l.status,headers:{"x-sentry-rate-limits":l.headers.get("X-Sentry-Rate-Limits"),"retry-after":l.headers.get("Retry-After")}}))}catch(l){return PMe(),n-=a,r--,wC(l)}}return Bae(t,i)}const VMe=4;function zMe(t){function e(n){return new il((r,i)=>{const s=new XMLHttpRequest;s.onerror=i,s.onreadystatechange=()=>{s.readyState===VMe&&r({statusCode:s.status,headers:{"x-sentry-rate-limits":s.getResponseHeader("X-Sentry-Rate-Limits"),"retry-after":s.getResponseHeader("Retry-After")}})},s.open("POST",t.url);for(const a in t.headers)Object.prototype.hasOwnProperty.call(t.headers,a)&&s.setRequestHeader(a,t.headers[a]);s.send(n.body)})}return Bae(t,e)}const vV="?",kMe=30,OMe=40,IMe=50;function LC(t,e,n,r){const i={filename:t,function:e,in_app:!0};return n!==void 0&&(i.lineno=n),r!==void 0&&(i.colno=r),i}const UMe=/^\s*at (?:(.+?\)(?: \[.+\])?|.*?) ?\((?:address at )?)?(?:async )?((?:|[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,NMe=/\((\S*)(?::(\d+))(?::(\d+))\)/,LMe=t=>{const e=UMe.exec(t);if(e){if(e[2]&&e[2].indexOf("eval")===0){const s=NMe.exec(e[2]);s&&(e[2]=s[1],e[3]=s[2],e[4]=s[3])}const[r,i]=hoe(e[1]||vV,e[2]);return LC(i,r,e[3]?+e[3]:void 0,e[4]?+e[4]:void 0)}},XMe=[kMe,LMe],CMe=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:[-a-z]+)?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i,KMe=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,qMe=t=>{const e=CMe.exec(t);if(e){if(e[3]&&e[3].indexOf(" > eval")>-1){const s=KMe.exec(e[3]);s&&(e[1]=e[1]||"eval",e[3]=s[1],e[4]=s[2],e[5]="")}let r=e[3],i=e[1]||vV;return[i,r]=hoe(i,r),LC(r,i,e[4]?+e[4]:void 0,e[5]?+e[5]:void 0)}},DMe=[IMe,qMe],WMe=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:[-a-z]+):.*?):(\d+)(?::(\d+))?\)?\s*$/i,AMe=t=>{const e=WMe.exec(t);return e?LC(e[2],e[1]||vV,+e[3],e[4]?+e[4]:void 0):void 0},GMe=[OMe,AMe],FMe=[XMe,DMe,GMe],jMe=vae(...FMe),hoe=(t,e)=>{const n=t.indexOf("safari-extension")!==-1,r=t.indexOf("safari-web-extension")!==-1;return n||r?[t.indexOf("@")!==-1?t.split("@")[0]:vV,n?`safari-extension:${e}`:`safari-web-extension:${e}`]:[t,e]},a2=1024,poe="Breadcrumbs",ZMe=(t={})=>{const e={console:!0,dom:!0,fetch:!0,history:!0,sentry:!0,xhr:!0,...t};return{name:poe,setupOnce(){},setup(n){e.console&&K2e(BMe(n)),e.dom&&bae(YMe(n,e.dom)),e.xhr&&TC(HMe(n)),e.fetch&&xC(QMe(n)),e.history&&uV(_Me(n)),e.sentry&&n.on&&n.on("beforeSendEvent",JMe(n))}}},moe=ZMe;Xf(poe,moe);function JMe(t){return function(n){Rr()===t&&kp({category:`sentry.${n.type==="transaction"?"transaction":"event"}`,event_id:n.event_id,level:n.level,message:Kh(n)},{event:n})}}function YMe(t,e){return function(r){if(Rr()!==t)return;let i,s,a=typeof e=="object"?e.serializeAttribute:void 0,o=typeof e=="object"&&typeof e.maxStringLength=="number"?e.maxStringLength:void 0;o&&o>a2&&($d&&He.warn(`\`dom.maxStringLength\` cannot exceed ${a2}, but a value of ${o} was configured. Sentry will use ${a2} instead.`),o=a2),typeof a=="string"&&(a=[a]);try{const u=r.event,c=$Me(u)?u.target:u;i=zp(c,{keyAttrs:a,maxStringLength:o}),s=dae(c)}catch{i=""}if(i.length===0)return;const l={category:`ui.${r.name}`,message:i};s&&(l.data={"ui.component_name":s}),kp(l,{event:r.event,name:r.name,global:r.global})}}function BMe(t){return function(n){if(Rr()!==t)return;const r={category:"console",data:{arguments:n.args,logger:"console"},level:f5e(n.level),message:wF(n.args," ")};if(n.level==="assert")if(n.args[0]===!1)r.message=`Assertion failed: ${wF(n.args.slice(1)," ")||"console.assert"}`,r.data.arguments=n.args.slice(1);else return;kp(r,{input:n.args,level:n.level})}}function HMe(t){return function(n){if(Rr()!==t)return;const{startTimestamp:r,endTimestamp:i}=n,s=n.xhr[jh];if(!r||!i||!s)return;const{method:a,url:o,status_code:l,body:u}=s,c={method:a,url:o,status_code:l},d={xhr:n.xhr,input:u,startTimestamp:r,endTimestamp:i};kp({category:"xhr",data:c,type:"http"},d)}}function QMe(t){return function(n){if(Rr()!==t)return;const{startTimestamp:r,endTimestamp:i}=n;if(i&&!(n.fetchData.url.match(/sentry_key/)&&n.fetchData.method==="POST"))if(n.error){const s=n.fetchData,a={data:n.error,input:n.args,startTimestamp:r,endTimestamp:i};kp({category:"fetch",data:s,level:"error",type:"http"},a)}else{const s=n.response,a={...n.fetchData,status_code:s&&s.status},o={input:n.args,response:s,startTimestamp:r,endTimestamp:i};kp({category:"fetch",data:a,type:"http"},o)}}}function _Me(t){return function(n){if(Rr()!==t)return;let r=n.from,i=n.to;const s=Ev(gr.location.href);let a=r?Ev(r):void 0;const o=Ev(i);(!a||!a.path)&&(a=s),s.protocol===o.protocol&&s.host===o.host&&(i=o.relative),s.protocol===a.protocol&&s.host===a.host&&(r=a.relative),kp({category:"navigation",data:{from:r,to:i}})}}function $Me(t){return!!t&&!!t.target}const voe="Dedupe",ePe=()=>{let t;return{name:voe,setupOnce(){},processEvent(e){if(e.type)return e;try{if(tPe(e,t))return $d&&He.warn("Event dropped due to being a duplicate of previously captured event."),null}catch{}return t=e}}},goe=ePe;Xf(voe,goe);function tPe(t,e){return e?!!(nPe(t,e)||rPe(t,e)):!1}function nPe(t,e){const n=t.message,r=e.message;return!(!n&&!r||n&&!r||!n&&r||n!==r||!yoe(t,e)||!boe(t,e))}function rPe(t,e){const n=cj(e),r=cj(t);return!(!n||!r||n.type!==r.type||n.value!==r.value||!yoe(t,e)||!boe(t,e))}function boe(t,e){let n=dj(t),r=dj(e);if(!n&&!r)return!0;if(n&&!r||!n&&r||(n=n,r=r,r.length!==n.length))return!1;for(let i=0;i{const e={onerror:!0,onunhandledrejection:!0,...t};return{name:Soe,setupOnce(){Error.stackTraceLimit=50},setup(n){e.onerror&&(sPe(n),fj("onerror")),e.onunhandledrejection&&(aPe(n),fj("onunhandledrejection"))}}},xoe=iPe;Xf(Soe,xoe);function sPe(t){Sae(e=>{const{stackParser:n,attachStacktrace:r}=woe();if(Rr()!==t||doe())return;const{msg:i,url:s,line:a,column:o,error:l}=e,u=l===void 0&&Dc(i)?uPe(i,s,a,o):Toe(NC(n,l||i,void 0,r,!1),s,a,o);u.level="error",Uae(u,{originalException:l,mechanism:{handled:!1,type:"onerror"}})})}function aPe(t){xae(e=>{const{stackParser:n,attachStacktrace:r}=woe();if(Rr()!==t||doe())return;const i=oPe(e),s=gC(i)?lPe(i):NC(n,i,void 0,r,!0);s.level="error",Uae(s,{originalException:i,mechanism:{handled:!1,type:"onunhandledrejection"}})})}function oPe(t){if(gC(t))return t;const e=t;try{if("reason"in e)return e.reason;if("detail"in e&&"reason"in e.detail)return e.detail.reason}catch{}return t}function lPe(t){return{exception:{values:[{type:"UnhandledRejection",value:`Non-Error promise rejection captured with value: ${String(t)}`}]}}}function uPe(t,e,n,r){const i=/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;let s=mC(t)?t.message:t,a="Error";const o=s.match(i);return o&&(a=o[1],s=o[2]),Toe({exception:{values:[{type:a,value:s}]}},e,n,r)}function Toe(t,e,n,r){const i=t.exception=t.exception||{},s=i.values=i.values||[],a=s[0]=s[0]||{},o=a.stacktrace=a.stacktrace||{},l=o.frames=o.frames||[],u=isNaN(parseInt(r,10))?void 0:r,c=isNaN(parseInt(n,10))?void 0:n,d=Dc(e)&&e.length>0?e:E2e();return l.length===0&&l.push({colno:u,filename:d,function:"?",in_app:!0,lineno:c}),t}function fj(t){$d&&He.log(`Global Handler attached: ${t}`)}function woe(){const t=Rr();return t&&t.getOptions()||{stackParser:()=>[],attachStacktrace:!1}}const Eoe="HttpContext",cPe=()=>({name:Eoe,setupOnce(){},preprocessEvent(t){if(!gr.navigator&&!gr.location&&!gr.document)return;const e=t.request&&t.request.url||gr.location&&gr.location.href,{referrer:n}=gr.document||{},{userAgent:r}=gr.navigator||{},i={...t.request&&t.request.headers,...n&&{Referer:n},...r&&{"User-Agent":r}},s={...t.request,...e&&{url:e},headers:i};t.request=s}}),Moe=cPe;Xf(Eoe,Moe);const dPe="cause",fPe=5,Poe="LinkedErrors",hPe=(t={})=>{const e=t.limit||fPe,n=t.key||dPe;return{name:Poe,setupOnce(){},preprocessEvent(r,i,s){const a=s.getOptions();S2e(foe,a.stackParser,a.maxValueLength,n,e,r,i)}}},Roe=hPe;Xf(Poe,Roe);const pPe=["EventTarget","Window","Node","ApplicationCache","AudioTrackList","BroadcastChannel","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","SharedWorker","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"],Voe="TryCatch",mPe=(t={})=>{const e={XMLHttpRequest:!0,eventTarget:!0,requestAnimationFrame:!0,setInterval:!0,setTimeout:!0,...t};return{name:Voe,setupOnce(){e.setTimeout&&Cs(gr,"setTimeout",hj),e.setInterval&&Cs(gr,"setInterval",hj),e.requestAnimationFrame&&Cs(gr,"requestAnimationFrame",vPe),e.XMLHttpRequest&&"XMLHttpRequest"in gr&&Cs(XMLHttpRequest.prototype,"send",gPe);const n=e.eventTarget;n&&(Array.isArray(n)?n:pPe).forEach(bPe)}}},zoe=mPe;Xf(Voe,zoe);function hj(t){return function(...e){const n=e[0];return e[0]=ub(n,{mechanism:{data:{function:gf(t)},handled:!1,type:"instrument"}}),t.apply(this,e)}}function vPe(t){return function(e){return t.apply(this,[ub(e,{mechanism:{data:{function:"requestAnimationFrame",handler:gf(t)},handled:!1,type:"instrument"}})])}}function gPe(t){return function(...e){const n=this;return["onload","onerror","onprogress","onreadystatechange"].forEach(i=>{i in n&&typeof n[i]=="function"&&Cs(n,i,function(s){const a={mechanism:{data:{function:i,handler:gf(s)},handled:!1,type:"instrument"}},o=yC(s);return o&&(a.mechanism.data.handler=gf(o)),ub(s,a)})}),t.apply(this,e)}}function bPe(t){const e=gr,n=e[t]&&e[t].prototype;!n||!n.hasOwnProperty||!n.hasOwnProperty("addEventListener")||(Cs(n,"addEventListener",function(r){return function(i,s,a){try{typeof s.handleEvent=="function"&&(s.handleEvent=ub(s.handleEvent,{mechanism:{data:{function:"handleEvent",handler:gf(s),target:t},handled:!1,type:"instrument"}}))}catch{}return r.apply(this,[i,ub(s,{mechanism:{data:{function:"addEventListener",handler:gf(s),target:t},handled:!1,type:"instrument"}}),a])}}),Cs(n,"removeEventListener",function(r){return function(i,s,a){const o=s;try{const l=o&&o.__sentry_wrapped__;l&&r.call(this,i,l,a)}catch{}return r.call(this,i,o,a)}}))}const yPe=[Qae(),$ae(),zoe(),moe(),xoe(),Roe(),goe(),Moe()];function koe(t){return[...yPe]}function SPe(t={}){t.defaultIntegrations===void 0&&(t.defaultIntegrations=koe()),t.release===void 0&&(typeof __SENTRY_RELEASE__=="string"&&(t.release=__SENTRY_RELEASE__),gr.SENTRY_RELEASE&&gr.SENTRY_RELEASE.id&&(t.release=gr.SENTRY_RELEASE.id)),t.autoSessionTracking===void 0&&(t.autoSessionTracking=!0),t.sendClientReports===void 0&&(t.sendClientReports=!0);const e={...t,stackParser:X2e(t.stackParser||jMe),integrations:REe(t),transport:t.transport||(yae()?RMe:zMe)};CEe(EMe,e),t.autoSessionTracking&&xPe()}function xPe(){if(typeof gr.document>"u"){$d&&He.warn("Session tracking in non-browser environment with @sentry/browser is not supported.");return}WF({ignoreDuration:!0}),AF(),uV(({from:t,to:e})=>{t!==void 0&&t!==e&&(WF({ignoreDuration:!0}),AF())})}const Hr=Gn,XC="sentryReplaySession",TPe="replay_event",CC="Unable to send Replay",wPe=3e5,EPe=9e5,MPe=5e3,PPe=5500,RPe=6e4,VPe=5e3,zPe=3,pj=15e4,o2=5e3,kPe=3e3,OPe=300,KC=2e7,IPe=4999,UPe=15e3,mj=36e5;function NPe(t,e){return t??e()}function FM(t){let e,n=t[0],r=1;for(;rn.call(e,...a)),e=void 0)}return n}var Ss;(function(t){t[t.Document=0]="Document",t[t.DocumentType=1]="DocumentType",t[t.Element=2]="Element",t[t.Text=3]="Text",t[t.CDATA=4]="CDATA",t[t.Comment=5]="Comment"})(Ss||(Ss={}));function LPe(t){return t.nodeType===t.ELEMENT_NODE}function _3(t){const e=FM([t,"optionalAccess",n=>n.host]);return FM([e,"optionalAccess",n=>n.shadowRoot])===t}function $3(t){return Object.prototype.toString.call(t)==="[object ShadowRoot]"}function XPe(t){return t.includes(" background-clip: text;")&&!t.includes(" -webkit-background-clip: text;")&&(t=t.replace(" background-clip: text;"," -webkit-background-clip: text; background-clip: text;")),t}function CPe(t){const{cssText:e}=t;if(e.split('"').length<3)return e;const n=["@import",`url(${JSON.stringify(t.href)})`];return t.layerName===""?n.push("layer"):t.layerName&&n.push(`layer(${t.layerName})`),t.supportsText&&n.push(`supports(${t.supportsText})`),t.media.length&&n.push(t.media.mediaText),n.join(" ")+";"}function jM(t){try{const e=t.rules||t.cssRules;return e?XPe(Array.from(e,Ooe).join("")):null}catch{return null}}function Ooe(t){let e;if(qPe(t))try{e=jM(t.styleSheet)||CPe(t)}catch{}else if(DPe(t)&&t.selectorText.includes(":"))return KPe(t.cssText);return e||t.cssText}function KPe(t){const e=/(\[(?:[\w-]+)[^\\])(:(?:[\w-]+)\])/gm;return t.replace(e,"$1\\$2")}function qPe(t){return"styleSheet"in t}function DPe(t){return"selectorText"in t}class Ioe{constructor(){this.idNodeMap=new Map,this.nodeMetaMap=new WeakMap}getId(e){if(!e)return-1;const n=FM([this,"access",r=>r.getMeta,"call",r=>r(e),"optionalAccess",r=>r.id]);return NPe(n,()=>-1)}getNode(e){return this.idNodeMap.get(e)||null}getIds(){return Array.from(this.idNodeMap.keys())}getMeta(e){return this.nodeMetaMap.get(e)||null}removeNodeFromMap(e){const n=this.getId(e);this.idNodeMap.delete(n),e.childNodes&&e.childNodes.forEach(r=>this.removeNodeFromMap(r))}has(e){return this.idNodeMap.has(e)}hasNode(e){return this.nodeMetaMap.has(e)}add(e,n){const r=n.id;this.idNodeMap.set(r,e),this.nodeMetaMap.set(e,n)}replace(e,n){const r=this.getNode(e);if(r){const i=this.nodeMetaMap.get(r);i&&this.nodeMetaMap.set(n,i)}this.idNodeMap.set(e,n)}reset(){this.idNodeMap=new Map,this.nodeMetaMap=new WeakMap}}function WPe(){return new Ioe}function gV({maskInputOptions:t,tagName:e,type:n}){return e==="OPTION"&&(e="SELECT"),!!(t[e.toLowerCase()]||n&&t[n]||n==="password"||e==="INPUT"&&!n&&t.text)}function Hx({isMasked:t,element:e,value:n,maskInputFn:r}){let i=n||"";return t?(r&&(i=r(i,e)),"*".repeat(i.length)):i}function cb(t){return t.toLowerCase()}function nL(t){return t.toUpperCase()}const vj="__rrweb_original__";function APe(t){const e=t.getContext("2d");if(!e)return!0;const n=50;for(let r=0;rl!==0))return!1}return!0}function qC(t){const e=t.type;return t.hasAttribute("data-rr-is-password")?"password":e?cb(e):null}function ZM(t,e,n){return e==="INPUT"&&(n==="radio"||n==="checkbox")?t.getAttribute("value")||"":t.value}let GPe=1;const FPe=new RegExp("[^a-z0-9-_:]"),Qx=-2;function DC(){return GPe++}function jPe(t){if(t instanceof HTMLFormElement)return"form";const e=cb(t.tagName);return FPe.test(e)?"div":e}function ZPe(t){let e="";return t.indexOf("//")>-1?e=t.split("/").slice(0,3).join("/"):e=t.split("/")[0],e=e.split("?")[0],e}let _0,gj;const JPe=/url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm,YPe=/^(?:[a-z+]+:)?\/\//i,BPe=/^www\..*/i,HPe=/^(data:)([^,]*),(.*)/i;function JM(t,e){return(t||"").replace(JPe,(n,r,i,s,a,o)=>{const l=i||a||o,u=r||s||"";if(!l)return n;if(YPe.test(l)||BPe.test(l))return`url(${u}${l}${u})`;if(HPe.test(l))return`url(${u}${l}${u})`;if(l[0]==="/")return`url(${u}${ZPe(e)+l}${u})`;const c=e.split("/"),d=l.split("/");c.pop();for(const f of d)f!=="."&&(f===".."?c.pop():c.push(f));return`url(${u}${c.join("/")}${u})`})}const QPe=/^[^ \t\n\r\u000c]+/,_Pe=/^[, \t\n\r\u000c]+/;function $Pe(t,e){if(e.trim()==="")return e;let n=0;function r(s){let a;const o=s.exec(e.substring(n));return o?(a=o[0],n+=a.length,a):""}const i=[];for(;r(_Pe),!(n>=e.length);){let s=r(QPe);if(s.slice(-1)===",")s=a1(t,s.substring(0,s.length-1)),i.push(s);else{let a="";s=a1(t,s);let o=!1;for(;;){const l=e.charAt(n);if(l===""){i.push((s+a).trim());break}else if(o)l===")"&&(o=!1);else if(l===","){n+=1,i.push((s+a).trim());break}else l==="("&&(o=!0);a+=l,n+=1}}}return i.join(", ")}function a1(t,e){if(!e||e.trim()==="")return e;const n=t.createElement("a");return n.href=e,n.href}function eRe(t){return!!(t.tagName==="svg"||t.ownerSVGElement)}function WC(){const t=document.createElement("a");return t.href="",t.href}function Uoe(t,e,n,r,i,s){return r&&(n==="src"||n==="href"&&!(e==="use"&&r[0]==="#")||n==="xlink:href"&&r[0]!=="#"||n==="background"&&(e==="table"||e==="td"||e==="th")?a1(t,r):n==="srcset"?$Pe(t,r):n==="style"?JM(r,WC()):e==="object"&&n==="data"?a1(t,r):typeof s=="function"?s(n,r,i):r)}function Noe(t,e,n){return(t==="video"||t==="audio")&&e==="autoplay"}function tRe(t,e,n,r){try{if(r&&t.matches(r))return!1;if(typeof e=="string"){if(t.classList.contains(e))return!0}else for(let i=t.classList.length;i--;){const s=t.classList[i];if(e.test(s))return!0}if(n)return t.matches(n)}catch{}return!1}function nRe(t,e){for(let n=t.classList.length;n--;){const r=t.classList[n];if(e.test(r))return!0}return!1}function lv(t,e,n=1/0,r=0){return!t||t.nodeType!==t.ELEMENT_NODE||r>n?-1:e(t)?r:lv(t.parentNode,e,n,r+1)}function o1(t,e){return n=>{const r=n;if(r===null)return!1;try{if(t){if(typeof t=="string"){if(r.matches(`.${t}`))return!0}else if(nRe(r,t))return!0}return!!(e&&r.matches(e))}catch{return!1}}}function db(t,e,n,r,i,s){try{const a=t.nodeType===t.ELEMENT_NODE?t:t.parentElement;if(a===null)return!1;if(a.tagName==="INPUT"){const u=a.getAttribute("autocomplete");if(["current-password","new-password","cc-number","cc-exp","cc-exp-month","cc-exp-year","cc-csc"].includes(u))return!0}let o=-1,l=-1;if(s){if(l=lv(a,o1(r,i)),l<0)return!0;o=lv(a,o1(e,n),l>=0?l:1/0)}else{if(o=lv(a,o1(e,n)),o<0)return!1;l=lv(a,o1(r,i),o>=0?o:1/0)}return o>=0?l>=0?o<=l:!0:l>=0?!1:!!s}catch{}return!!s}function rRe(t,e,n){const r=t.contentWindow;if(!r)return;let i=!1,s;try{s=r.document.readyState}catch{return}if(s!=="complete"){const o=setTimeout(()=>{i||(e(),i=!0)},n);t.addEventListener("load",()=>{clearTimeout(o),i=!0,e()});return}const a="about:blank";if(r.location.href!==a||t.src===a||t.src==="")return setTimeout(e,0),t.addEventListener("load",e);t.addEventListener("load",e)}function iRe(t,e,n){let r=!1,i;try{i=t.sheet}catch{return}if(i)return;const s=setTimeout(()=>{r||(e(),r=!0)},n);t.addEventListener("load",()=>{clearTimeout(s),r=!0,e()})}function sRe(t,e){const{doc:n,mirror:r,blockClass:i,blockSelector:s,unblockSelector:a,maskAllText:o,maskAttributeFn:l,maskTextClass:u,unmaskTextClass:c,maskTextSelector:d,unmaskTextSelector:f,inlineStylesheet:h,maskInputOptions:p={},maskTextFn:m,maskInputFn:v,dataURLOptions:g={},inlineImages:b,recordCanvas:y,keepIframeSrcFn:x,newlyAddedElement:T=!1}=e,M=aRe(n,r);switch(t.nodeType){case t.DOCUMENT_NODE:return t.compatMode!=="CSS1Compat"?{type:Ss.Document,childNodes:[],compatMode:t.compatMode}:{type:Ss.Document,childNodes:[]};case t.DOCUMENT_TYPE_NODE:return{type:Ss.DocumentType,name:t.name,publicId:t.publicId,systemId:t.systemId,rootId:M};case t.ELEMENT_NODE:return lRe(t,{doc:n,blockClass:i,blockSelector:s,unblockSelector:a,inlineStylesheet:h,maskAttributeFn:l,maskInputOptions:p,maskInputFn:v,dataURLOptions:g,inlineImages:b,recordCanvas:y,keepIframeSrcFn:x,newlyAddedElement:T,rootId:M,maskAllText:o,maskTextClass:u,unmaskTextClass:c,maskTextSelector:d,unmaskTextSelector:f});case t.TEXT_NODE:return oRe(t,{maskAllText:o,maskTextClass:u,unmaskTextClass:c,maskTextSelector:d,unmaskTextSelector:f,maskTextFn:m,maskInputOptions:p,maskInputFn:v,rootId:M});case t.CDATA_SECTION_NODE:return{type:Ss.CDATA,textContent:"",rootId:M};case t.COMMENT_NODE:return{type:Ss.Comment,textContent:t.textContent||"",rootId:M};default:return!1}}function aRe(t,e){if(!e.hasNode(t))return;const n=e.getId(t);return n===1?void 0:n}function oRe(t,e){const{maskAllText:n,maskTextClass:r,unmaskTextClass:i,maskTextSelector:s,unmaskTextSelector:a,maskTextFn:o,maskInputOptions:l,maskInputFn:u,rootId:c}=e,d=t.parentNode&&t.parentNode.tagName;let f=t.textContent;const h=d==="STYLE"?!0:void 0,p=d==="SCRIPT"?!0:void 0,m=d==="TEXTAREA"?!0:void 0;if(h&&f){try{t.nextSibling||t.previousSibling||FM([t,"access",g=>g.parentNode,"access",g=>g.sheet,"optionalAccess",g=>g.cssRules])&&(f=jM(t.parentNode.sheet))}catch(g){console.warn(`Cannot get CSS styles from text's parentNode. Error: ${g}`,t)}f=JM(f,WC())}p&&(f="SCRIPT_PLACEHOLDER");const v=db(t,r,s,i,a,n);if(!h&&!p&&!m&&f&&v&&(f=o?o(f,t.parentElement):f.replace(/[\S]/g,"*")),m&&f&&(l.textarea||v)&&(f=u?u(f,t.parentNode):f.replace(/[\S]/g,"*")),d==="OPTION"&&f){const g=gV({type:null,tagName:d,maskInputOptions:l});f=Hx({isMasked:db(t,r,s,i,a,g),element:t,value:f,maskInputFn:u})}return{type:Ss.Text,textContent:f||"",isStyle:h,rootId:c}}function lRe(t,e){const{doc:n,blockClass:r,blockSelector:i,unblockSelector:s,inlineStylesheet:a,maskInputOptions:o={},maskAttributeFn:l,maskInputFn:u,dataURLOptions:c={},inlineImages:d,recordCanvas:f,keepIframeSrcFn:h,newlyAddedElement:p=!1,rootId:m,maskAllText:v,maskTextClass:g,unmaskTextClass:b,maskTextSelector:y,unmaskTextSelector:x}=e,T=tRe(t,r,i,s),M=jPe(t);let E={};const S=t.attributes.length;for(let R=0;Rz.href===t.href);let V=null;R&&(V=jM(R)),V&&(delete E.rel,delete E.href,E._cssText=JM(V,R.href))}if(M==="style"&&t.sheet&&!(t.innerText||t.textContent||"").trim().length){const R=jM(t.sheet);R&&(E._cssText=JM(R,WC()))}if(M==="input"||M==="textarea"||M==="select"||M==="option"){const R=t,V=qC(R),z=ZM(R,nL(M),V),k=R.checked;if(V!=="submit"&&V!=="button"&&z){const N=db(R,g,y,b,x,gV({type:V,tagName:nL(M),maskInputOptions:o}));E.value=Hx({isMasked:N,element:R,value:z,maskInputFn:u})}k&&(E.checked=k)}if(M==="option"&&(t.selected&&!o.select?E.selected=!0:delete E.selected),M==="canvas"&&f){if(t.__context==="2d")APe(t)||(E.rr_dataURL=t.toDataURL(c.type,c.quality));else if(!("__context"in t)){const R=t.toDataURL(c.type,c.quality),V=document.createElement("canvas");V.width=t.width,V.height=t.height;const z=V.toDataURL(c.type,c.quality);R!==z&&(E.rr_dataURL=R)}}if(M==="img"&&d){_0||(_0=n.createElement("canvas"),gj=_0.getContext("2d"));const R=t,V=R.crossOrigin;R.crossOrigin="anonymous";const z=()=>{R.removeEventListener("load",z);try{_0.width=R.naturalWidth,_0.height=R.naturalHeight,gj.drawImage(R,0,0),E.rr_dataURL=_0.toDataURL(c.type,c.quality)}catch(k){console.warn(`Cannot inline img src=${R.currentSrc}! Error: ${k}`)}V?E.crossOrigin=V:R.removeAttribute("crossorigin")};R.complete&&R.naturalWidth!==0?z():R.addEventListener("load",z)}if((M==="audio"||M==="video")&&(E.rr_mediaState=t.paused?"paused":"played",E.rr_mediaCurrentTime=t.currentTime),p||(t.scrollLeft&&(E.rr_scrollLeft=t.scrollLeft),t.scrollTop&&(E.rr_scrollTop=t.scrollTop)),T){const{width:R,height:V}=t.getBoundingClientRect();E={class:E.class,rr_width:`${R}px`,rr_height:`${V}px`}}M==="iframe"&&!h(E.src)&&(t.contentDocument||(E.rr_src=E.src),delete E.src);let P;try{customElements.get(M)&&(P=!0)}catch{}return{type:Ss.Element,tagName:M,attributes:E,childNodes:[],isSVG:eRe(t)||void 0,needBlock:T,rootId:m,isCustom:P}}function jr(t){return t==null?"":t.toLowerCase()}function uRe(t,e){if(e.comment&&t.type===Ss.Comment)return!0;if(t.type===Ss.Element){if(e.script&&(t.tagName==="script"||t.tagName==="link"&&(t.attributes.rel==="preload"||t.attributes.rel==="modulepreload")&&t.attributes.as==="script"||t.tagName==="link"&&t.attributes.rel==="prefetch"&&typeof t.attributes.href=="string"&&t.attributes.href.endsWith(".js")))return!0;if(e.headFavicon&&(t.tagName==="link"&&t.attributes.rel==="shortcut icon"||t.tagName==="meta"&&(jr(t.attributes.name).match(/^msapplication-tile(image|color)$/)||jr(t.attributes.name)==="application-name"||jr(t.attributes.rel)==="icon"||jr(t.attributes.rel)==="apple-touch-icon"||jr(t.attributes.rel)==="shortcut icon")))return!0;if(t.tagName==="meta"){if(e.headMetaDescKeywords&&jr(t.attributes.name).match(/^description|keywords$/))return!0;if(e.headMetaSocial&&(jr(t.attributes.property).match(/^(og|twitter|fb):/)||jr(t.attributes.name).match(/^(og|twitter):/)||jr(t.attributes.name)==="pinterest"))return!0;if(e.headMetaRobots&&(jr(t.attributes.name)==="robots"||jr(t.attributes.name)==="googlebot"||jr(t.attributes.name)==="bingbot"))return!0;if(e.headMetaHttpEquiv&&t.attributes["http-equiv"]!==void 0)return!0;if(e.headMetaAuthorship&&(jr(t.attributes.name)==="author"||jr(t.attributes.name)==="generator"||jr(t.attributes.name)==="framework"||jr(t.attributes.name)==="publisher"||jr(t.attributes.name)==="progid"||jr(t.attributes.property).match(/^article:/)||jr(t.attributes.property).match(/^product:/)))return!0;if(e.headMetaVerification&&(jr(t.attributes.name)==="google-site-verification"||jr(t.attributes.name)==="yandex-verification"||jr(t.attributes.name)==="csrf-token"||jr(t.attributes.name)==="p:domain_verify"||jr(t.attributes.name)==="verify-v1"||jr(t.attributes.name)==="verification"||jr(t.attributes.name)==="shopify-checkout-api-token"))return!0}}return!1}function l1(t,e){const{doc:n,mirror:r,blockClass:i,blockSelector:s,unblockSelector:a,maskAllText:o,maskTextClass:l,unmaskTextClass:u,maskTextSelector:c,unmaskTextSelector:d,skipChild:f=!1,inlineStylesheet:h=!0,maskInputOptions:p={},maskAttributeFn:m,maskTextFn:v,maskInputFn:g,slimDOMOptions:b,dataURLOptions:y={},inlineImages:x=!1,recordCanvas:T=!1,onSerialize:M,onIframeLoad:E,iframeLoadTimeout:S=5e3,onStylesheetLoad:P,stylesheetLoadTimeout:R=5e3,keepIframeSrcFn:V=()=>!1,newlyAddedElement:z=!1}=e;let{preserveWhiteSpace:k=!0}=e;const N=sRe(t,{doc:n,mirror:r,blockClass:i,blockSelector:s,maskAllText:o,unblockSelector:a,maskTextClass:l,unmaskTextClass:u,maskTextSelector:c,unmaskTextSelector:d,inlineStylesheet:h,maskInputOptions:p,maskAttributeFn:m,maskTextFn:v,maskInputFn:g,dataURLOptions:y,inlineImages:x,recordCanvas:T,keepIframeSrcFn:V,newlyAddedElement:z});if(!N)return console.warn(t,"not serialized"),null;let q;r.hasNode(t)?q=r.getId(t):uRe(N,b)||!k&&N.type===Ss.Text&&!N.isStyle&&!N.textContent.replace(/^\s+|\s+$/gm,"").length?q=Qx:q=DC();const L=Object.assign(N,{id:q});if(r.add(t,L),q===Qx)return null;M&&M(t);let A=!f;if(L.type===Ss.Element){A=A&&!L.needBlock,delete L.needBlock;const J=t.shadowRoot;J&&$3(J)&&(L.isShadowHost=!0)}if((L.type===Ss.Document||L.type===Ss.Element)&&A){b.headWhitespace&&L.type===Ss.Element&&L.tagName==="head"&&(k=!1);const J={doc:n,mirror:r,blockClass:i,blockSelector:s,maskAllText:o,unblockSelector:a,maskTextClass:l,unmaskTextClass:u,maskTextSelector:c,unmaskTextSelector:d,skipChild:f,inlineStylesheet:h,maskInputOptions:p,maskAttributeFn:m,maskTextFn:v,maskInputFn:g,slimDOMOptions:b,dataURLOptions:y,inlineImages:x,recordCanvas:T,preserveWhiteSpace:k,onSerialize:M,onIframeLoad:E,iframeLoadTimeout:S,onStylesheetLoad:P,stylesheetLoadTimeout:R,keepIframeSrcFn:V};for(const F of Array.from(t.childNodes)){const ne=l1(F,J);ne&&L.childNodes.push(ne)}if(LPe(t)&&t.shadowRoot)for(const F of Array.from(t.shadowRoot.childNodes)){const ne=l1(F,J);ne&&($3(t.shadowRoot)&&(ne.isShadow=!0),L.childNodes.push(ne))}}return t.parentNode&&_3(t.parentNode)&&$3(t.parentNode)&&(L.isShadow=!0),L.type===Ss.Element&&L.tagName==="iframe"&&rRe(t,()=>{const J=t.contentDocument;if(J&&E){const F=l1(J,{doc:J,mirror:r,blockClass:i,blockSelector:s,unblockSelector:a,maskAllText:o,maskTextClass:l,unmaskTextClass:u,maskTextSelector:c,unmaskTextSelector:d,skipChild:!1,inlineStylesheet:h,maskInputOptions:p,maskAttributeFn:m,maskTextFn:v,maskInputFn:g,slimDOMOptions:b,dataURLOptions:y,inlineImages:x,recordCanvas:T,preserveWhiteSpace:k,onSerialize:M,onIframeLoad:E,iframeLoadTimeout:S,onStylesheetLoad:P,stylesheetLoadTimeout:R,keepIframeSrcFn:V});F&&E(t,F)}},S),L.type===Ss.Element&&L.tagName==="link"&&L.attributes.rel==="stylesheet"&&iRe(t,()=>{if(P){const J=l1(t,{doc:n,mirror:r,blockClass:i,blockSelector:s,unblockSelector:a,maskAllText:o,maskTextClass:l,unmaskTextClass:u,maskTextSelector:c,unmaskTextSelector:d,skipChild:!1,inlineStylesheet:h,maskInputOptions:p,maskAttributeFn:m,maskTextFn:v,maskInputFn:g,slimDOMOptions:b,dataURLOptions:y,inlineImages:x,recordCanvas:T,preserveWhiteSpace:k,onSerialize:M,onIframeLoad:E,iframeLoadTimeout:S,onStylesheetLoad:P,stylesheetLoadTimeout:R,keepIframeSrcFn:V});J&&P(t,J)}},R),L}function cRe(t,e){const{mirror:n=new Ioe,blockClass:r="rr-block",blockSelector:i=null,unblockSelector:s=null,maskAllText:a=!1,maskTextClass:o="rr-mask",unmaskTextClass:l=null,maskTextSelector:u=null,unmaskTextSelector:c=null,inlineStylesheet:d=!0,inlineImages:f=!1,recordCanvas:h=!1,maskAllInputs:p=!1,maskAttributeFn:m,maskTextFn:v,maskInputFn:g,slimDOM:b=!1,dataURLOptions:y,preserveWhiteSpace:x,onSerialize:T,onIframeLoad:M,iframeLoadTimeout:E,onStylesheetLoad:S,stylesheetLoadTimeout:P,keepIframeSrcFn:R=()=>!1}=e||{};return l1(t,{doc:t,mirror:n,blockClass:r,blockSelector:i,unblockSelector:s,maskAllText:a,maskTextClass:o,unmaskTextClass:l,maskTextSelector:u,unmaskTextSelector:c,skipChild:!1,inlineStylesheet:d,maskInputOptions:p===!0?{color:!0,date:!0,"datetime-local":!0,email:!0,month:!0,number:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0,textarea:!0,select:!0}:p===!1?{}:p,maskAttributeFn:m,maskTextFn:v,maskInputFn:g,slimDOMOptions:b===!0||b==="all"?{script:!0,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaDescKeywords:b==="all",headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaAuthorship:!0,headMetaVerification:!0}:b===!1?{}:b,dataURLOptions:y,inlineImages:f,recordCanvas:h,preserveWhiteSpace:x,onSerialize:T,onIframeLoad:M,iframeLoadTimeout:E,onStylesheetLoad:S,stylesheetLoadTimeout:P,keepIframeSrcFn:R,newlyAddedElement:!1})}function zh(t){let e,n=t[0],r=1;for(;rn.call(e,...a)),e=void 0)}return n}function Qa(t,e,n=document){const r={capture:!0,passive:!0};return n.addEventListener(t,e,r),()=>n.removeEventListener(t,e,r)}const jg=`Please stop import mirror directly. Instead of that,\r now you can use replayer.getMirror() to access the mirror instance of a replayer,\r -or you can use record.mirror to access the mirror instance during recording.`;let Sj={map:{},getId(){return console.error(jg),-1},getNode(){return console.error(jg),null},removeNodeFromMap(){console.error(jg)},has(){return console.error(jg),!1},reset(){console.error(jg)}};typeof window<"u"&&window.Proxy&&window.Reflect&&(Sj=new Proxy(Sj,{get(t,e,n){return e==="map"&&console.error(jg),Reflect.get(t,e,n)}}));function $x(t,e,n={}){let r=null,i=0;return function(...s){const a=Date.now();!i&&n.leading===!1&&(i=a);const o=e-(a-i),l=this;o<=0||o>e?(r&&(vRe(r),r=null),i=a,t.apply(l,s)):!r&&n.trailing!==!1&&(r=bV(()=>{i=n.leading===!1?0:Date.now(),r=null,t.apply(l,s)},o))}}function Xoe(t,e,n,r,i=window){const s=i.Object.getOwnPropertyDescriptor(t,e);return i.Object.defineProperty(t,e,r?n:{set(a){bV(()=>{n.set.call(this,a)},0),s&&s.set&&s.set.call(this,a)}}),()=>Xoe(t,e,s||{},!0)}function WC(t,e,n){try{if(!(e in t))return()=>{};const r=t[e],i=n(r);return typeof i=="function"&&(i.prototype=i.prototype||{},Object.defineProperties(i,{__rrweb_original__:{enumerable:!1,value:r}})),t[e]=i,()=>{t[e]=r}}catch{return()=>{}}}let BM=Date.now;/[1-9][0-9]{12}/.test(Date.now().toString())||(BM=()=>new Date().getTime());function Coe(t){const e=t.document;return{left:e.scrollingElement?e.scrollingElement.scrollLeft:t.pageXOffset!==void 0?t.pageXOffset:zh([e,"optionalAccess",n=>n.documentElement,"access",n=>n.scrollLeft])||zh([e,"optionalAccess",n=>n.body,"optionalAccess",n=>n.parentElement,"optionalAccess",n=>n.scrollLeft])||zh([e,"optionalAccess",n=>n.body,"optionalAccess",n=>n.scrollLeft])||0,top:e.scrollingElement?e.scrollingElement.scrollTop:t.pageYOffset!==void 0?t.pageYOffset:zh([e,"optionalAccess",n=>n.documentElement,"access",n=>n.scrollTop])||zh([e,"optionalAccess",n=>n.body,"optionalAccess",n=>n.parentElement,"optionalAccess",n=>n.scrollTop])||zh([e,"optionalAccess",n=>n.body,"optionalAccess",n=>n.scrollTop])||0}}function Koe(){return window.innerHeight||document.documentElement&&document.documentElement.clientHeight||document.body&&document.body.clientHeight}function qoe(){return window.innerWidth||document.documentElement&&document.documentElement.clientWidth||document.body&&document.body.clientWidth}function Doe(t){return t?t.nodeType===t.ELEMENT_NODE?t:t.parentElement:null}function wu(t,e,n,r,i){if(!t)return!1;const s=Doe(t);if(!s)return!1;const a=o1(e,n);if(!i){const u=r&&s.matches(r);return a(s)&&!u}const o=lv(s,a);let l=-1;return o<0?!1:(r&&(l=lv(s,o1(null,r))),o>-1&&l<0?!0:o{let n=e[0];if(!(0 in e))throw new TypeError("1 argument is required");do if(this===n)return!0;while(n=n&&n.parentNode);return!1})}function Aoe(t,e){return!!(t.nodeName==="IFRAME"&&e.getMeta(t))}function Goe(t,e){return!!(t.nodeName==="LINK"&&t.nodeType===t.ELEMENT_NODE&&t.getAttribute&&t.getAttribute("rel")==="stylesheet"&&e.getMeta(t))}function iL(t){return!!zh([t,"optionalAccess",e=>e.shadowRoot])}class fRe{constructor(){this.id=1,this.styleIDMap=new WeakMap,this.idStyleMap=new Map}getId(e){return z5e(this.styleIDMap.get(e),()=>-1)}has(e){return this.styleIDMap.has(e)}add(e,n){if(this.has(e))return this.getId(e);let r;return n===void 0?r=this.id++:r=n,this.styleIDMap.set(e,r),this.idStyleMap.set(r,e),r}getStyle(e){return this.idStyleMap.get(e)||null}reset(){this.styleIDMap=new WeakMap,this.idStyleMap=new Map,this.id=1}generateId(){return this.id++}}function Foe(t){let e=null;return zh([t,"access",n=>n.getRootNode,"optionalCall",n=>n(),"optionalAccess",n=>n.nodeType])===Node.DOCUMENT_FRAGMENT_NODE&&t.getRootNode().host&&(e=t.getRootNode().host),e}function hRe(t){let e=t,n;for(;n=Foe(e);)e=n;return e}function pRe(t){const e=t.ownerDocument;if(!e)return!1;const n=hRe(t);return e.contains(n)}function joe(t){const e=t.ownerDocument;return e?e.contains(t)||pRe(t):!1}const xj={};function AC(t){const e=xj[t];if(e)return e;const n=window.document;let r=window[t];if(n&&typeof n.createElement=="function")try{const i=n.createElement("iframe");i.hidden=!0,n.head.appendChild(i);const s=i.contentWindow;s&&s[t]&&(r=s[t]),n.head.removeChild(i)}catch{}return xj[t]=r.bind(window)}function mRe(...t){return AC("requestAnimationFrame")(...t)}function bV(...t){return AC("setTimeout")(...t)}function vRe(...t){return AC("clearTimeout")(...t)}var xn=(t=>(t[t.DomContentLoaded=0]="DomContentLoaded",t[t.Load=1]="Load",t[t.FullSnapshot=2]="FullSnapshot",t[t.IncrementalSnapshot=3]="IncrementalSnapshot",t[t.Meta=4]="Meta",t[t.Custom=5]="Custom",t[t.Plugin=6]="Plugin",t))(xn||{}),Tn=(t=>(t[t.Mutation=0]="Mutation",t[t.MouseMove=1]="MouseMove",t[t.MouseInteraction=2]="MouseInteraction",t[t.Scroll=3]="Scroll",t[t.ViewportResize=4]="ViewportResize",t[t.Input=5]="Input",t[t.TouchMove=6]="TouchMove",t[t.MediaInteraction=7]="MediaInteraction",t[t.StyleSheetRule=8]="StyleSheetRule",t[t.CanvasMutation=9]="CanvasMutation",t[t.Font=10]="Font",t[t.Log=11]="Log",t[t.Drag=12]="Drag",t[t.StyleDeclaration=13]="StyleDeclaration",t[t.Selection=14]="Selection",t[t.AdoptedStyleSheet=15]="AdoptedStyleSheet",t[t.CustomElement=16]="CustomElement",t))(Tn||{}),Fa=(t=>(t[t.MouseUp=0]="MouseUp",t[t.MouseDown=1]="MouseDown",t[t.Click=2]="Click",t[t.ContextMenu=3]="ContextMenu",t[t.DblClick=4]="DblClick",t[t.Focus=5]="Focus",t[t.Blur=6]="Blur",t[t.TouchStart=7]="TouchStart",t[t.TouchMove_Departed=8]="TouchMove_Departed",t[t.TouchEnd=9]="TouchEnd",t[t.TouchCancel=10]="TouchCancel",t))(Fa||{}),Ud=(t=>(t[t.Mouse=0]="Mouse",t[t.Pen=1]="Pen",t[t.Touch=2]="Touch",t))(Ud||{});function gRe(t){let e,n=t[0],r=1;for(;rn.call(e,...a)),e=void 0)}return n}function Tj(t){return"__ln"in t}class bRe{constructor(){this.length=0,this.head=null,this.tail=null}get(e){if(e>=this.length)throw new Error("Position outside of list range");let n=this.head;for(let r=0;ri.next])||null;return n}addNode(e){const n={value:e,previous:null,next:null};if(e.__ln=n,e.previousSibling&&Tj(e.previousSibling)){const r=e.previousSibling.__ln.next;n.next=r,n.previous=e.previousSibling.__ln,e.previousSibling.__ln.next=n,r&&(r.previous=n)}else if(e.nextSibling&&Tj(e.nextSibling)&&e.nextSibling.__ln.previous){const r=e.nextSibling.__ln.previous;n.previous=r,n.next=e.nextSibling.__ln,e.nextSibling.__ln.previous=n,r&&(r.next=n)}else this.head&&(this.head.previous=n),n.next=this.head,this.head=n;n.next===null&&(this.tail=n),this.length++}removeNode(e){const n=e.__ln;this.head&&(n.previous?(n.previous.next=n.next,n.next?n.next.previous=n.previous:this.tail=n.previous):(this.head=n.next,this.head?this.head.previous=null:this.tail=null),e.__ln&&delete e.__ln,this.length--)}}const wj=(t,e)=>`${t}@${e}`;class yRe{constructor(){this.frozen=!1,this.locked=!1,this.texts=[],this.attributes=[],this.attributeMap=new WeakMap,this.removes=[],this.mapRemoves=[],this.movedMap={},this.addedSet=new Set,this.movedSet=new Set,this.droppedSet=new Set,this.processMutations=e=>{e.forEach(this.processMutation),this.emit()},this.emit=()=>{if(this.frozen||this.locked)return;const e=[],n=new Set,r=new bRe,i=l=>{let u=l,c=_x;for(;c===_x;)u=u&&u.nextSibling,c=u&&this.mirror.getId(u);return c},s=l=>{if(!l.parentNode||!joe(l))return;const u=$3(l.parentNode)?this.mirror.getId(Foe(l)):this.mirror.getId(l.parentNode),c=i(l);if(u===-1||c===-1)return r.addNode(l);const d=l1(l,{doc:this.doc,mirror:this.mirror,blockClass:this.blockClass,blockSelector:this.blockSelector,maskAllText:this.maskAllText,unblockSelector:this.unblockSelector,maskTextClass:this.maskTextClass,unmaskTextClass:this.unmaskTextClass,maskTextSelector:this.maskTextSelector,unmaskTextSelector:this.unmaskTextSelector,skipChild:!0,newlyAddedElement:!0,inlineStylesheet:this.inlineStylesheet,maskInputOptions:this.maskInputOptions,maskAttributeFn:this.maskAttributeFn,maskTextFn:this.maskTextFn,maskInputFn:this.maskInputFn,slimDOMOptions:this.slimDOMOptions,dataURLOptions:this.dataURLOptions,recordCanvas:this.recordCanvas,inlineImages:this.inlineImages,onSerialize:f=>{Aoe(f,this.mirror)&&this.iframeManager.addIframe(f),Goe(f,this.mirror)&&this.stylesheetManager.trackLinkElement(f),iL(l)&&this.shadowDomManager.addShadowRoot(l.shadowRoot,this.doc)},onIframeLoad:(f,h)=>{this.iframeManager.attachIframe(f,h),this.shadowDomManager.observeAttachShadow(f)},onStylesheetLoad:(f,h)=>{this.stylesheetManager.attachLinkElement(f,h)}});d&&(e.push({parentId:u,nextId:c,node:d}),n.add(d.id))};for(;this.mapRemoves.length;)this.mirror.removeNodeFromMap(this.mapRemoves.shift());for(const l of this.movedSet)Ej(this.removes,l,this.mirror)&&!this.movedSet.has(l.parentNode)||s(l);for(const l of this.addedSet)!Mj(this.droppedSet,l)&&!Ej(this.removes,l,this.mirror)||Mj(this.movedSet,l)?s(l):this.droppedSet.add(l);let a=null;for(;r.length;){let l=null;if(a){const u=this.mirror.getId(a.value.parentNode),c=i(a.value);u!==-1&&c!==-1&&(l=a)}if(!l){let u=r.tail;for(;u;){const c=u;if(u=u.previous,c){const d=this.mirror.getId(c.value.parentNode);if(i(c.value)===-1)continue;if(d!==-1){l=c;break}else{const h=c.value;if(h.parentNode&&h.parentNode.nodeType===Node.DOCUMENT_FRAGMENT_NODE){const p=h.parentNode.host;if(this.mirror.getId(p)!==-1){l=c;break}}}}}}if(!l){for(;r.head;)r.removeNode(r.head.value);break}a=l.previous,r.removeNode(l.value),s(l.value)}const o={texts:this.texts.map(l=>({id:this.mirror.getId(l.node),value:l.value})).filter(l=>!n.has(l.id)).filter(l=>this.mirror.has(l.id)),attributes:this.attributes.map(l=>{const{attributes:u}=l;if(typeof u.style=="string"){const c=JSON.stringify(l.styleDiff),d=JSON.stringify(l._unchangedStyles);c.length!n.has(l.id)).filter(l=>this.mirror.has(l.id)),removes:this.removes,adds:e};!o.texts.length&&!o.attributes.length&&!o.removes.length&&!o.adds.length||(this.texts=[],this.attributes=[],this.attributeMap=new WeakMap,this.removes=[],this.addedSet=new Set,this.movedSet=new Set,this.droppedSet=new Set,this.movedMap={},this.mutationCb(o))},this.processMutation=e=>{if(!Qz(e.target,this.mirror))switch(e.type){case"characterData":{const n=e.target.textContent;!wu(e.target,this.blockClass,this.blockSelector,this.unblockSelector,!1)&&n!==e.oldValue&&this.texts.push({value:db(e.target,this.maskTextClass,this.maskTextSelector,this.unmaskTextClass,this.unmaskTextSelector,this.maskAllText)&&n?this.maskTextFn?this.maskTextFn(n,Doe(e.target)):n.replace(/[\S]/g,"*"):n,node:e.target});break}case"attributes":{const n=e.target;let r=e.attributeName,i=e.target.getAttribute(r);if(r==="value"){const a=KC(n),o=n.tagName;i=JM(n,o,a);const l=gV({maskInputOptions:this.maskInputOptions,tagName:o,type:a}),u=db(e.target,this.maskTextClass,this.maskTextSelector,this.unmaskTextClass,this.unmaskTextSelector,l);i=Qx({isMasked:u,element:n,value:i,maskInputFn:this.maskInputFn})}if(wu(e.target,this.blockClass,this.blockSelector,this.unblockSelector,!1)||i===e.oldValue)return;let s=this.attributeMap.get(e.target);if(n.tagName==="IFRAME"&&r==="src"&&!this.keepIframeSrcFn(i))if(!n.contentDocument)r="rr_src";else return;if(s||(s={node:e.target,attributes:{},styleDiff:{},_unchangedStyles:{}},this.attributes.push(s),this.attributeMap.set(e.target,s)),r==="type"&&n.tagName==="INPUT"&&(e.oldValue||"").toLowerCase()==="password"&&n.setAttribute("data-rr-is-password","true"),!Loe(n.tagName,r)&&(s.attributes[r]=Noe(this.doc,cb(n.tagName),cb(r),i,n,this.maskAttributeFn),r==="style")){if(!this.unattachedDoc)try{this.unattachedDoc=document.implementation.createHTMLDocument()}catch{this.unattachedDoc=this.doc}const a=this.unattachedDoc.createElement("span");e.oldValue&&a.setAttribute("style",e.oldValue);for(const o of Array.from(n.style)){const l=n.style.getPropertyValue(o),u=n.style.getPropertyPriority(o);l!==a.style.getPropertyValue(o)||u!==a.style.getPropertyPriority(o)?u===""?s.styleDiff[o]=l:s.styleDiff[o]=[l,u]:s._unchangedStyles[o]=[l,u]}for(const o of Array.from(a.style))n.style.getPropertyValue(o)===""&&(s.styleDiff[o]=!1)}break}case"childList":{if(wu(e.target,this.blockClass,this.blockSelector,this.unblockSelector,!0))return;e.addedNodes.forEach(n=>this.genAdds(n,e.target)),e.removedNodes.forEach(n=>{const r=this.mirror.getId(n),i=$3(e.target)?this.mirror.getId(e.target.host):this.mirror.getId(e.target);wu(e.target,this.blockClass,this.blockSelector,this.unblockSelector,!1)||Qz(n,this.mirror)||!cRe(n,this.mirror)||(this.addedSet.has(n)?(sL(this.addedSet,n),this.droppedSet.add(n)):this.addedSet.has(e.target)&&r===-1||Woe(e.target,this.mirror)||(this.movedSet.has(n)&&this.movedMap[wj(r,i)]?sL(this.movedSet,n):this.removes.push({parentId:i,id:r,isShadow:$3(e.target)&&ex(e.target)?!0:void 0})),this.mapRemoves.push(n))});break}}},this.genAdds=(e,n)=>{if(!this.processedNodeManager.inOtherBuffer(e,this)&&!(this.addedSet.has(e)||this.movedSet.has(e))){if(this.mirror.hasNode(e)){if(Qz(e,this.mirror))return;this.movedSet.add(e);let r=null;n&&this.mirror.hasNode(n)&&(r=this.mirror.getId(n)),r&&r!==-1&&(this.movedMap[wj(this.mirror.getId(e),r)]=!0)}else this.addedSet.add(e),this.droppedSet.delete(e);wu(e,this.blockClass,this.blockSelector,this.unblockSelector,!1)||(e.childNodes.forEach(r=>this.genAdds(r)),iL(e)&&e.shadowRoot.childNodes.forEach(r=>{this.processedNodeManager.add(r,this),this.genAdds(r,e)}))}}}init(e){["mutationCb","blockClass","blockSelector","unblockSelector","maskAllText","maskTextClass","unmaskTextClass","maskTextSelector","unmaskTextSelector","inlineStylesheet","maskInputOptions","maskAttributeFn","maskTextFn","maskInputFn","keepIframeSrcFn","recordCanvas","inlineImages","slimDOMOptions","dataURLOptions","doc","mirror","iframeManager","stylesheetManager","shadowDomManager","canvasManager","processedNodeManager"].forEach(n=>{this[n]=e[n]})}freeze(){this.frozen=!0,this.canvasManager.freeze()}unfreeze(){this.frozen=!1,this.canvasManager.unfreeze(),this.emit()}isFrozen(){return this.frozen}lock(){this.locked=!0,this.canvasManager.lock()}unlock(){this.locked=!1,this.canvasManager.unlock(),this.emit()}reset(){this.shadowDomManager.reset(),this.canvasManager.reset()}}function sL(t,e){t.delete(e),e.childNodes.forEach(n=>sL(t,n))}function Ej(t,e,n){return t.length===0?!1:Zoe(t,e,n)}function Zoe(t,e,n){const{parentNode:r}=e;if(!r)return!1;const i=n.getId(r);return t.some(s=>s.id===i)?!0:Zoe(t,r,n)}function Mj(t,e){return t.size===0?!1:Joe(t,e)}function Joe(t,e){const{parentNode:n}=e;return n?t.has(n)?!0:Joe(t,n):!1}let tx;function SRe(t){tx=t}function xRe(){tx=void 0}const jn=t=>tx?(...n)=>{try{return t(...n)}catch(r){if(tx&&tx(r)===!0)return()=>{};throw r}}:t;function Vc(t){let e,n=t[0],r=1;for(;rn.call(e,...a)),e=void 0)}return n}const u1=[];function fT(t){try{if("composedPath"in t){const e=t.composedPath();if(e.length)return e[0]}else if("path"in t&&t.path.length)return t.path[0]}catch{}return t&&t.target}function Yoe(t,e){const n=new yRe;u1.push(n),n.init(t);let r=window.MutationObserver||window.__rrMutationObserver;const i=Vc([window,"optionalAccess",a=>a.Zone,"optionalAccess",a=>a.__symbol__,"optionalCall",a=>a("MutationObserver")]);i&&window[i]&&(r=window[i]);const s=new r(jn(a=>{t.onMutation&&t.onMutation(a)===!1||n.processMutations.bind(n)(a)}));return s.observe(e,{attributes:!0,attributeOldValue:!0,characterData:!0,characterDataOldValue:!0,childList:!0,subtree:!0}),s}function TRe({mousemoveCb:t,sampling:e,doc:n,mirror:r}){if(e.mousemove===!1)return()=>{};const i=typeof e.mousemove=="number"?e.mousemove:50,s=typeof e.mousemoveCallback=="number"?e.mousemoveCallback:500;let a=[],o;const l=$x(jn(d=>{const f=Date.now()-o;t(a.map(h=>(h.timeOffset-=f,h)),d),a=[],o=null}),s),u=jn($x(jn(d=>{const f=fT(d),{clientX:h,clientY:p}=rL(d)?d.changedTouches[0]:d;o||(o=BM()),a.push({x:h,y:p,id:r.getId(f),timeOffset:BM()-o}),l(typeof DragEvent<"u"&&d instanceof DragEvent?Tn.Drag:d instanceof MouseEvent?Tn.MouseMove:Tn.TouchMove)}),i,{trailing:!1})),c=[Qa("mousemove",u,n),Qa("touchmove",u,n),Qa("drag",u,n)];return jn(()=>{c.forEach(d=>d())})}function wRe({mouseInteractionCb:t,doc:e,mirror:n,blockClass:r,blockSelector:i,unblockSelector:s,sampling:a}){if(a.mouseInteraction===!1)return()=>{};const o=a.mouseInteraction===!0||a.mouseInteraction===void 0?{}:a.mouseInteraction,l=[];let u=null;const c=d=>f=>{const h=fT(f);if(wu(h,r,i,s,!0))return;let p=null,m=d;if("pointerType"in f){switch(f.pointerType){case"mouse":p=Ud.Mouse;break;case"touch":p=Ud.Touch;break;case"pen":p=Ud.Pen;break}p===Ud.Touch?Fa[d]===Fa.MouseDown?m="TouchStart":Fa[d]===Fa.MouseUp&&(m="TouchEnd"):Ud.Pen}else rL(f)&&(p=Ud.Touch);p!==null?(u=p,(m.startsWith("Touch")&&p===Ud.Touch||m.startsWith("Mouse")&&p===Ud.Mouse)&&(p=null)):Fa[d]===Fa.Click&&(p=u,u=null);const v=rL(f)?f.changedTouches[0]:f;if(!v)return;const g=n.getId(h),{clientX:b,clientY:y}=v;jn(t)({type:Fa[m],id:g,x:b,y,...p!==null&&{pointerType:p}})};return Object.keys(Fa).filter(d=>Number.isNaN(Number(d))&&!d.endsWith("_Departed")&&o[d]!==!1).forEach(d=>{let f=cb(d);const h=c(d);if(window.PointerEvent)switch(Fa[d]){case Fa.MouseDown:case Fa.MouseUp:f=f.replace("mouse","pointer");break;case Fa.TouchStart:case Fa.TouchEnd:return}l.push(Qa(f,h,e))}),jn(()=>{l.forEach(d=>d())})}function Boe({scrollCb:t,doc:e,mirror:n,blockClass:r,blockSelector:i,unblockSelector:s,sampling:a}){const o=jn($x(jn(l=>{const u=fT(l);if(!u||wu(u,r,i,s,!0))return;const c=n.getId(u);if(u===e&&e.defaultView){const d=Coe(e.defaultView);t({id:c,x:d.left,y:d.top})}else t({id:c,x:u.scrollLeft,y:u.scrollTop})}),a.scroll||100));return Qa("scroll",o,e)}function ERe({viewportResizeCb:t},{win:e}){let n=-1,r=-1;const i=jn($x(jn(()=>{const s=Koe(),a=qoe();(n!==s||r!==a)&&(t({width:Number(a),height:Number(s)}),n=s,r=a)}),200));return Qa("resize",i,e)}const MRe=["INPUT","TEXTAREA","SELECT"],Pj=new WeakMap;function PRe({inputCb:t,doc:e,mirror:n,blockClass:r,blockSelector:i,unblockSelector:s,ignoreClass:a,ignoreSelector:o,maskInputOptions:l,maskInputFn:u,sampling:c,userTriggeredOnInput:d,maskTextClass:f,unmaskTextClass:h,maskTextSelector:p,unmaskTextSelector:m}){function v(E){let S=fT(E);const P=E.isTrusted,R=S&&nL(S.tagName);if(R==="OPTION"&&(S=S.parentElement),!S||!R||MRe.indexOf(R)<0||wu(S,r,i,s,!0))return;const V=S;if(V.classList.contains(a)||o&&V.matches(o))return;const z=KC(S);let k=JM(V,R,z),N=!1;const q=gV({maskInputOptions:l,tagName:R,type:z}),L=db(S,f,p,h,m,q);(z==="radio"||z==="checkbox")&&(N=S.checked),k=Qx({isMasked:L,element:S,value:k,maskInputFn:u}),g(S,d?{text:k,isChecked:N,userTriggered:P}:{text:k,isChecked:N});const A=S.name;z==="radio"&&A&&N&&e.querySelectorAll(`input[type="radio"][name="${A}"]`).forEach(Z=>{if(Z!==S){const j=Qx({isMasked:L,element:Z,value:JM(Z,R,z),maskInputFn:u});g(Z,d?{text:j,isChecked:!N,userTriggered:!1}:{text:j,isChecked:!N})}})}function g(E,S){const P=Pj.get(E);if(!P||P.text!==S.text||P.isChecked!==S.isChecked){Pj.set(E,S);const R=n.getId(E);jn(t)({...S,id:R})}}const y=(c.input==="last"?["change"]:["input","change"]).map(E=>Qa(E,jn(v),e)),x=e.defaultView;if(!x)return()=>{y.forEach(E=>E())};const T=x.Object.getOwnPropertyDescriptor(x.HTMLInputElement.prototype,"value"),M=[[x.HTMLInputElement.prototype,"value"],[x.HTMLInputElement.prototype,"checked"],[x.HTMLSelectElement.prototype,"value"],[x.HTMLTextAreaElement.prototype,"value"],[x.HTMLSelectElement.prototype,"selectedIndex"],[x.HTMLOptionElement.prototype,"selected"]];return T&&T.set&&y.push(...M.map(E=>Xoe(E[0],E[1],{set(){jn(v)({target:this,isTrusted:!1})}},!1,x))),jn(()=>{y.forEach(E=>E())})}function HM(t){const e=[];function n(r,i){if(l2("CSSGroupingRule")&&r.parentRule instanceof CSSGroupingRule||l2("CSSMediaRule")&&r.parentRule instanceof CSSMediaRule||l2("CSSSupportsRule")&&r.parentRule instanceof CSSSupportsRule||l2("CSSConditionRule")&&r.parentRule instanceof CSSConditionRule){const a=Array.from(r.parentRule.cssRules).indexOf(r);i.unshift(a)}else if(r.parentStyleSheet){const a=Array.from(r.parentStyleSheet.cssRules).indexOf(r);i.unshift(a)}return i}return n(t,e)}function kh(t,e,n){let r,i;return t?(t.ownerNode?r=e.getId(t.ownerNode):i=n.getId(t),{styleId:i,id:r}):{}}function RRe({styleSheetRuleCb:t,mirror:e,stylesheetManager:n},{win:r}){if(!r.CSSStyleSheet||!r.CSSStyleSheet.prototype)return()=>{};const i=r.CSSStyleSheet.prototype.insertRule;r.CSSStyleSheet.prototype.insertRule=new Proxy(i,{apply:jn((c,d,f)=>{const[h,p]=f,{id:m,styleId:v}=kh(d,e,n.styleMirror);return(m&&m!==-1||v&&v!==-1)&&t({id:m,styleId:v,adds:[{rule:h,index:p}]}),c.apply(d,f)})});const s=r.CSSStyleSheet.prototype.deleteRule;r.CSSStyleSheet.prototype.deleteRule=new Proxy(s,{apply:jn((c,d,f)=>{const[h]=f,{id:p,styleId:m}=kh(d,e,n.styleMirror);return(p&&p!==-1||m&&m!==-1)&&t({id:p,styleId:m,removes:[{index:h}]}),c.apply(d,f)})});let a;r.CSSStyleSheet.prototype.replace&&(a=r.CSSStyleSheet.prototype.replace,r.CSSStyleSheet.prototype.replace=new Proxy(a,{apply:jn((c,d,f)=>{const[h]=f,{id:p,styleId:m}=kh(d,e,n.styleMirror);return(p&&p!==-1||m&&m!==-1)&&t({id:p,styleId:m,replace:h}),c.apply(d,f)})}));let o;r.CSSStyleSheet.prototype.replaceSync&&(o=r.CSSStyleSheet.prototype.replaceSync,r.CSSStyleSheet.prototype.replaceSync=new Proxy(o,{apply:jn((c,d,f)=>{const[h]=f,{id:p,styleId:m}=kh(d,e,n.styleMirror);return(p&&p!==-1||m&&m!==-1)&&t({id:p,styleId:m,replaceSync:h}),c.apply(d,f)})}));const l={};u2("CSSGroupingRule")?l.CSSGroupingRule=r.CSSGroupingRule:(u2("CSSMediaRule")&&(l.CSSMediaRule=r.CSSMediaRule),u2("CSSConditionRule")&&(l.CSSConditionRule=r.CSSConditionRule),u2("CSSSupportsRule")&&(l.CSSSupportsRule=r.CSSSupportsRule));const u={};return Object.entries(l).forEach(([c,d])=>{u[c]={insertRule:d.prototype.insertRule,deleteRule:d.prototype.deleteRule},d.prototype.insertRule=new Proxy(u[c].insertRule,{apply:jn((f,h,p)=>{const[m,v]=p,{id:g,styleId:b}=kh(h.parentStyleSheet,e,n.styleMirror);return(g&&g!==-1||b&&b!==-1)&&t({id:g,styleId:b,adds:[{rule:m,index:[...HM(h),v||0]}]}),f.apply(h,p)})}),d.prototype.deleteRule=new Proxy(u[c].deleteRule,{apply:jn((f,h,p)=>{const[m]=p,{id:v,styleId:g}=kh(h.parentStyleSheet,e,n.styleMirror);return(v&&v!==-1||g&&g!==-1)&&t({id:v,styleId:g,removes:[{index:[...HM(h),m]}]}),f.apply(h,p)})})}),jn(()=>{r.CSSStyleSheet.prototype.insertRule=i,r.CSSStyleSheet.prototype.deleteRule=s,a&&(r.CSSStyleSheet.prototype.replace=a),o&&(r.CSSStyleSheet.prototype.replaceSync=o),Object.entries(l).forEach(([c,d])=>{d.prototype.insertRule=u[c].insertRule,d.prototype.deleteRule=u[c].deleteRule})})}function Hoe({mirror:t,stylesheetManager:e},n){let r=null;n.nodeName==="#document"?r=t.getId(n):r=t.getId(n.host);const i=n.nodeName==="#document"?Vc([n,"access",a=>a.defaultView,"optionalAccess",a=>a.Document]):Vc([n,"access",a=>a.ownerDocument,"optionalAccess",a=>a.defaultView,"optionalAccess",a=>a.ShadowRoot]),s=Vc([i,"optionalAccess",a=>a.prototype])?Object.getOwnPropertyDescriptor(Vc([i,"optionalAccess",a=>a.prototype]),"adoptedStyleSheets"):void 0;return r===null||r===-1||!i||!s?()=>{}:(Object.defineProperty(n,"adoptedStyleSheets",{configurable:s.configurable,enumerable:s.enumerable,get(){return Vc([s,"access",a=>a.get,"optionalAccess",a=>a.call,"call",a=>a(this)])},set(a){const o=Vc([s,"access",l=>l.set,"optionalAccess",l=>l.call,"call",l=>l(this,a)]);if(r!==null&&r!==-1)try{e.adoptStyleSheets(a,r)}catch{}return o}}),jn(()=>{Object.defineProperty(n,"adoptedStyleSheets",{configurable:s.configurable,enumerable:s.enumerable,get:s.get,set:s.set})}))}function VRe({styleDeclarationCb:t,mirror:e,ignoreCSSAttributes:n,stylesheetManager:r},{win:i}){const s=i.CSSStyleDeclaration.prototype.setProperty;i.CSSStyleDeclaration.prototype.setProperty=new Proxy(s,{apply:jn((o,l,u)=>{const[c,d,f]=u;if(n.has(c))return s.apply(l,[c,d,f]);const{id:h,styleId:p}=kh(Vc([l,"access",m=>m.parentRule,"optionalAccess",m=>m.parentStyleSheet]),e,r.styleMirror);return(h&&h!==-1||p&&p!==-1)&&t({id:h,styleId:p,set:{property:c,value:d,priority:f},index:HM(l.parentRule)}),o.apply(l,u)})});const a=i.CSSStyleDeclaration.prototype.removeProperty;return i.CSSStyleDeclaration.prototype.removeProperty=new Proxy(a,{apply:jn((o,l,u)=>{const[c]=u;if(n.has(c))return a.apply(l,[c]);const{id:d,styleId:f}=kh(Vc([l,"access",h=>h.parentRule,"optionalAccess",h=>h.parentStyleSheet]),e,r.styleMirror);return(d&&d!==-1||f&&f!==-1)&&t({id:d,styleId:f,remove:{property:c},index:HM(l.parentRule)}),o.apply(l,u)})}),jn(()=>{i.CSSStyleDeclaration.prototype.setProperty=s,i.CSSStyleDeclaration.prototype.removeProperty=a})}function zRe({mediaInteractionCb:t,blockClass:e,blockSelector:n,unblockSelector:r,mirror:i,sampling:s,doc:a}){const o=jn(u=>$x(jn(c=>{const d=fT(c);if(!d||wu(d,e,n,r,!0))return;const{currentTime:f,volume:h,muted:p,playbackRate:m}=d;t({type:u,id:i.getId(d),currentTime:f,volume:h,muted:p,playbackRate:m})}),s.media||500)),l=[Qa("play",o(0),a),Qa("pause",o(1),a),Qa("seeked",o(2),a),Qa("volumechange",o(3),a),Qa("ratechange",o(4),a)];return jn(()=>{l.forEach(u=>u())})}function kRe({fontCb:t,doc:e}){const n=e.defaultView;if(!n)return()=>{};const r=[],i=new WeakMap,s=n.FontFace;n.FontFace=function(l,u,c){const d=new s(l,u,c);return i.set(d,{family:l,buffer:typeof u!="string",descriptors:c,fontSource:typeof u=="string"?u:JSON.stringify(Array.from(new Uint8Array(u)))}),d};const a=WC(e.fonts,"add",function(o){return function(l){return bV(jn(()=>{const u=i.get(l);u&&(t(u),i.delete(l))}),0),o.apply(this,[l])}});return r.push(()=>{n.FontFace=s}),r.push(a),jn(()=>{r.forEach(o=>o())})}function ORe(t){const{doc:e,mirror:n,blockClass:r,blockSelector:i,unblockSelector:s,selectionCb:a}=t;let o=!0;const l=jn(()=>{const u=e.getSelection();if(!u||o&&Vc([u,"optionalAccess",f=>f.isCollapsed]))return;o=u.isCollapsed||!1;const c=[],d=u.rangeCount||0;for(let f=0;f{}:WC(n.customElements,"define",function(i){return function(s,a,o){try{e({define:{name:s}})}catch{}return i.apply(this,[s,a,o])}})}function URe(t,e={}){const n=t.doc.defaultView;if(!n)return()=>{};const r=Yoe(t,t.doc),i=TRe(t),s=wRe(t),a=Boe(t),o=ERe(t,{win:n}),l=PRe(t),u=zRe(t),c=RRe(t,{win:n}),d=Hoe(t,t.doc),f=VRe(t,{win:n}),h=t.collectFonts?kRe(t):()=>{},p=ORe(t),m=IRe(t),v=[];for(const g of t.plugins)v.push(g.observer(g.callback,n,g.options));return jn(()=>{u1.forEach(g=>g.reset()),r.disconnect(),i(),s(),a(),o(),l(),u(),c(),d(),f(),h(),p(),m(),v.forEach(g=>g())})}function l2(t){return typeof window[t]<"u"}function u2(t){return!!(typeof window[t]<"u"&&window[t].prototype&&"insertRule"in window[t].prototype&&"deleteRule"in window[t].prototype)}class aL{constructor(e){this.generateIdFn=e,this.iframeIdToRemoteIdMap=new WeakMap,this.iframeRemoteIdToIdMap=new WeakMap}getId(e,n,r,i){const s=r||this.getIdToRemoteIdMap(e),a=i||this.getRemoteIdToIdMap(e);let o=s.get(n);return o||(o=this.generateIdFn(),s.set(n,o),a.set(o,n)),o}getIds(e,n){const r=this.getIdToRemoteIdMap(e),i=this.getRemoteIdToIdMap(e);return n.map(s=>this.getId(e,s,r,i))}getRemoteId(e,n,r){const i=r||this.getRemoteIdToIdMap(e);if(typeof n!="number")return n;const s=i.get(n);return s||-1}getRemoteIds(e,n){const r=this.getRemoteIdToIdMap(e);return n.map(i=>this.getRemoteId(e,i,r))}reset(e){if(!e){this.iframeIdToRemoteIdMap=new WeakMap,this.iframeRemoteIdToIdMap=new WeakMap;return}this.iframeIdToRemoteIdMap.delete(e),this.iframeRemoteIdToIdMap.delete(e)}getIdToRemoteIdMap(e){let n=this.iframeIdToRemoteIdMap.get(e);return n||(n=new Map,this.iframeIdToRemoteIdMap.set(e,n)),n}getRemoteIdToIdMap(e){let n=this.iframeRemoteIdToIdMap.get(e);return n||(n=new Map,this.iframeRemoteIdToIdMap.set(e,n)),n}}function Rj(t){let e,n=t[0],r=1;for(;rn.call(e,...a)),e=void 0)}return n}class NRe{constructor(){this.crossOriginIframeMirror=new aL(qC),this.crossOriginIframeRootIdMap=new WeakMap}addIframe(){}addLoadListener(){}attachIframe(){}}class LRe{constructor(e){this.iframes=new WeakMap,this.crossOriginIframeMap=new WeakMap,this.crossOriginIframeMirror=new aL(qC),this.crossOriginIframeRootIdMap=new WeakMap,this.mutationCb=e.mutationCb,this.wrappedEmit=e.wrappedEmit,this.stylesheetManager=e.stylesheetManager,this.recordCrossOriginIframes=e.recordCrossOriginIframes,this.crossOriginIframeStyleMirror=new aL(this.stylesheetManager.styleMirror.generateId.bind(this.stylesheetManager.styleMirror)),this.mirror=e.mirror,this.recordCrossOriginIframes&&window.addEventListener("message",this.handleMessage.bind(this))}addIframe(e){this.iframes.set(e,!0),e.contentWindow&&this.crossOriginIframeMap.set(e.contentWindow,e)}addLoadListener(e){this.loadListener=e}attachIframe(e,n){this.mutationCb({adds:[{parentId:this.mirror.getId(e),nextId:null,node:n}],removes:[],texts:[],attributes:[],isAttachIframe:!0}),Rj([this,"access",r=>r.loadListener,"optionalCall",r=>r(e)]),e.contentDocument&&e.contentDocument.adoptedStyleSheets&&e.contentDocument.adoptedStyleSheets.length>0&&this.stylesheetManager.adoptStyleSheets(e.contentDocument.adoptedStyleSheets,this.mirror.getId(e.contentDocument))}handleMessage(e){const n=e;if(n.data.type!=="rrweb"||n.origin!==n.data.origin||!e.source)return;const i=this.crossOriginIframeMap.get(e.source);if(!i)return;const s=this.transformCrossOriginEvent(i,n.data.event);s&&this.wrappedEmit(s,n.data.isCheckout)}transformCrossOriginEvent(e,n){switch(n.type){case xn.FullSnapshot:{this.crossOriginIframeMirror.reset(e),this.crossOriginIframeStyleMirror.reset(e),this.replaceIdOnNode(n.data.node,e);const r=n.data.node.id;return this.crossOriginIframeRootIdMap.set(e,r),this.patchRootIdOnNode(n.data.node,r),{timestamp:n.timestamp,type:xn.IncrementalSnapshot,data:{source:Tn.Mutation,adds:[{parentId:this.mirror.getId(e),nextId:null,node:n.data.node}],removes:[],texts:[],attributes:[],isAttachIframe:!0}}}case xn.Meta:case xn.Load:case xn.DomContentLoaded:return!1;case xn.Plugin:return n;case xn.Custom:return this.replaceIds(n.data.payload,e,["id","parentId","previousId","nextId"]),n;case xn.IncrementalSnapshot:switch(n.data.source){case Tn.Mutation:return n.data.adds.forEach(r=>{this.replaceIds(r,e,["parentId","nextId","previousId"]),this.replaceIdOnNode(r.node,e);const i=this.crossOriginIframeRootIdMap.get(e);i&&this.patchRootIdOnNode(r.node,i)}),n.data.removes.forEach(r=>{this.replaceIds(r,e,["parentId","id"])}),n.data.attributes.forEach(r=>{this.replaceIds(r,e,["id"])}),n.data.texts.forEach(r=>{this.replaceIds(r,e,["id"])}),n;case Tn.Drag:case Tn.TouchMove:case Tn.MouseMove:return n.data.positions.forEach(r=>{this.replaceIds(r,e,["id"])}),n;case Tn.ViewportResize:return!1;case Tn.MediaInteraction:case Tn.MouseInteraction:case Tn.Scroll:case Tn.CanvasMutation:case Tn.Input:return this.replaceIds(n.data,e,["id"]),n;case Tn.StyleSheetRule:case Tn.StyleDeclaration:return this.replaceIds(n.data,e,["id"]),this.replaceStyleIds(n.data,e,["styleId"]),n;case Tn.Font:return n;case Tn.Selection:return n.data.ranges.forEach(r=>{this.replaceIds(r,e,["start","end"])}),n;case Tn.AdoptedStyleSheet:return this.replaceIds(n.data,e,["id"]),this.replaceStyleIds(n.data,e,["styleIds"]),Rj([n,"access",r=>r.data,"access",r=>r.styles,"optionalAccess",r=>r.forEach,"call",r=>r(i=>{this.replaceStyleIds(i,e,["styleId"])})]),n}}return!1}replace(e,n,r,i){for(const s of i)!Array.isArray(n[s])&&typeof n[s]!="number"||(Array.isArray(n[s])?n[s]=e.getIds(r,n[s]):n[s]=e.getId(r,n[s]));return n}replaceIds(e,n,r){return this.replace(this.crossOriginIframeMirror,e,n,r)}replaceStyleIds(e,n,r){return this.replace(this.crossOriginIframeStyleMirror,e,n,r)}replaceIdOnNode(e,n){this.replaceIds(e,n,["id","rootId"]),"childNodes"in e&&e.childNodes.forEach(r=>{this.replaceIdOnNode(r,n)})}patchRootIdOnNode(e,n){e.type!==Ss.Document&&!e.rootId&&(e.rootId=n),"childNodes"in e&&e.childNodes.forEach(r=>{this.patchRootIdOnNode(r,n)})}}class XRe{init(){}addShadowRoot(){}observeAttachShadow(){}reset(){}}class CRe{constructor(e){this.shadowDoms=new WeakSet,this.restoreHandlers=[],this.mutationCb=e.mutationCb,this.scrollCb=e.scrollCb,this.bypassOptions=e.bypassOptions,this.mirror=e.mirror,this.init()}init(){this.reset(),this.patchAttachShadow(Element,document)}addShadowRoot(e,n){if(!ex(e)||this.shadowDoms.has(e))return;this.shadowDoms.add(e);const r=Yoe({...this.bypassOptions,doc:n,mutationCb:this.mutationCb,mirror:this.mirror,shadowDomManager:this},e);this.restoreHandlers.push(()=>r.disconnect()),this.restoreHandlers.push(Boe({...this.bypassOptions,scrollCb:this.scrollCb,doc:e,mirror:this.mirror})),bV(()=>{e.adoptedStyleSheets&&e.adoptedStyleSheets.length>0&&this.bypassOptions.stylesheetManager.adoptStyleSheets(e.adoptedStyleSheets,this.mirror.getId(e.host)),this.restoreHandlers.push(Hoe({mirror:this.mirror,stylesheetManager:this.bypassOptions.stylesheetManager},e))},0)}observeAttachShadow(e){!e.contentWindow||!e.contentDocument||this.patchAttachShadow(e.contentWindow.Element,e.contentDocument)}patchAttachShadow(e,n){const r=this;this.restoreHandlers.push(WC(e.prototype,"attachShadow",function(i){return function(s){const a=i.call(this,s);return this.shadowRoot&&joe(this)&&r.addShadowRoot(this.shadowRoot,n),a}}))}reset(){this.restoreHandlers.forEach(e=>{try{e()}catch{}}),this.restoreHandlers=[],this.shadowDoms=new WeakSet}}class Vj{reset(){}freeze(){}unfreeze(){}lock(){}unlock(){}snapshot(){}}class KRe{constructor(e){this.trackedLinkElements=new WeakSet,this.styleMirror=new fRe,this.mutationCb=e.mutationCb,this.adoptedStyleSheetCb=e.adoptedStyleSheetCb}attachLinkElement(e,n){"_cssText"in n.attributes&&this.mutationCb({adds:[],removes:[],texts:[],attributes:[{id:n.id,attributes:n.attributes}]}),this.trackLinkElement(e)}trackLinkElement(e){this.trackedLinkElements.has(e)||(this.trackedLinkElements.add(e),this.trackStylesheetInLinkElement(e))}adoptStyleSheets(e,n){if(e.length===0)return;const r={id:n,styleIds:[]},i=[];for(const s of e){let a;this.styleMirror.has(s)?a=this.styleMirror.getId(s):(a=this.styleMirror.add(s),i.push({styleId:a,rules:Array.from(s.rules||CSSRule,(o,l)=>({rule:Ioe(o),index:l}))})),r.styleIds.push(a)}i.length>0&&(r.styles=i),this.adoptedStyleSheetCb(r)}reset(){this.styleMirror.reset(),this.trackedLinkElements=new WeakSet}trackStylesheetInLinkElement(e){}}class qRe{constructor(){this.nodeMap=new WeakMap,this.loop=!0,this.periodicallyClear()}periodicallyClear(){mRe(()=>{this.clear(),this.loop&&this.periodicallyClear()})}inOtherBuffer(e,n){const r=this.nodeMap.get(e);return r&&Array.from(r).some(i=>i!==n)}add(e,n){this.nodeMap.set(e,(this.nodeMap.get(e)||new Set).add(n))}clear(){this.nodeMap=new WeakMap}destroy(){this.loop=!1}}let zi,QM;const pu=DPe();function lp(t={}){const{emit:e,checkoutEveryNms:n,checkoutEveryNth:r,blockClass:i="rr-block",blockSelector:s=null,unblockSelector:a=null,ignoreClass:o="rr-ignore",ignoreSelector:l=null,maskAllText:u=!1,maskTextClass:c="rr-mask",unmaskTextClass:d=null,maskTextSelector:f=null,unmaskTextSelector:h=null,inlineStylesheet:p=!0,maskAllInputs:m,maskInputOptions:v,slimDOMOptions:g,maskAttributeFn:b,maskInputFn:y,maskTextFn:x,maxCanvasSize:T=null,packFn:M,sampling:E={},dataURLOptions:S={},mousemoveWait:P,recordCanvas:R=!1,recordCrossOriginIframes:V=!1,recordAfter:z=t.recordAfter==="DOMContentLoaded"?t.recordAfter:"load",userTriggeredOnInput:k=!1,collectFonts:N=!1,inlineImages:q=!1,plugins:L,keepIframeSrcFn:A=()=>!1,ignoreCSSAttributes:Z=new Set([]),errorHandler:j,onMutation:ne,getCanvasManager:G}=t;SRe(j);const B=V?window.parent===window:!0;let ee=!1;if(!B)try{window.parent.document&&(ee=!1)}catch{ee=!0}if(B&&!e)throw new Error("emit function is required");P!==void 0&&E.mousemove===void 0&&(E.mousemove=P),pu.reset();const ce=m===!0?{color:!0,date:!0,"datetime-local":!0,email:!0,month:!0,number:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0,textarea:!0,select:!0,radio:!0,checkbox:!0}:v!==void 0?v:{},fe=g===!0||g==="all"?{script:!0,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaVerification:!0,headMetaAuthorship:g==="all",headMetaDescKeywords:g==="all"}:g||{};dRe();let te,_=0;const oe=be=>{for(const we of L||[])we.eventProcessor&&(be=we.eventProcessor(be));return M&&!ee&&(be=M(be)),be};zi=(be,we)=>{const se=be;if(se.timestamp=BM(),Fz([u1,"access",W=>W[0],"optionalAccess",W=>W.isFrozen,"call",W=>W()])&&se.type!==xn.FullSnapshot&&!(se.type===xn.IncrementalSnapshot&&se.data.source===Tn.Mutation)&&u1.forEach(W=>W.unfreeze()),B)Fz([e,"optionalCall",W=>W(oe(se),we)]);else if(ee){const W={type:"rrweb",event:oe(se),origin:window.location.origin,isCheckout:we};window.parent.postMessage(W,"*")}if(se.type===xn.FullSnapshot)te=se,_=0;else if(se.type===xn.IncrementalSnapshot){if(se.data.source===Tn.Mutation&&se.data.isAttachIframe)return;_++;const W=r&&_>=r,K=n&&te&&se.timestamp-te.timestamp>n;(W||K)&&he(!0)}};const ye=be=>{zi({type:xn.IncrementalSnapshot,data:{source:Tn.Mutation,...be}})},ve=be=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.Scroll,...be}}),Ke=be=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.CanvasMutation,...be}}),le=be=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.AdoptedStyleSheet,...be}}),D=new KRe({mutationCb:ye,adoptedStyleSheetCb:le}),F=typeof __RRWEB_EXCLUDE_IFRAME__=="boolean"&&__RRWEB_EXCLUDE_IFRAME__?new NRe:new LRe({mirror:pu,mutationCb:ye,stylesheetManager:D,recordCrossOriginIframes:V,wrappedEmit:zi});for(const be of L||[])be.getMirror&&be.getMirror({nodeMirror:pu,crossOriginIframeMirror:F.crossOriginIframeMirror,crossOriginIframeStyleMirror:F.crossOriginIframeStyleMirror});const re=new qRe,de=WRe(G,{mirror:pu,win:window,mutationCb:be=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.CanvasMutation,...be}}),recordCanvas:R,blockClass:i,blockSelector:s,unblockSelector:a,maxCanvasSize:T,sampling:E.canvas,dataURLOptions:S,errorHandler:j}),Te=typeof __RRWEB_EXCLUDE_SHADOW_DOM__=="boolean"&&__RRWEB_EXCLUDE_SHADOW_DOM__?new XRe:new CRe({mutationCb:ye,scrollCb:ve,bypassOptions:{onMutation:ne,blockClass:i,blockSelector:s,unblockSelector:a,maskAllText:u,maskTextClass:c,unmaskTextClass:d,maskTextSelector:f,unmaskTextSelector:h,inlineStylesheet:p,maskInputOptions:ce,dataURLOptions:S,maskAttributeFn:b,maskTextFn:x,maskInputFn:y,recordCanvas:R,inlineImages:q,sampling:E,slimDOMOptions:fe,iframeManager:F,stylesheetManager:D,canvasManager:de,keepIframeSrcFn:A,processedNodeManager:re},mirror:pu}),he=(be=!1)=>{zi({type:xn.Meta,data:{href:window.location.href,width:qoe(),height:Koe()}},be),D.reset(),Te.init(),u1.forEach(se=>se.lock());const we=uRe(document,{mirror:pu,blockClass:i,blockSelector:s,unblockSelector:a,maskAllText:u,maskTextClass:c,unmaskTextClass:d,maskTextSelector:f,unmaskTextSelector:h,inlineStylesheet:p,maskAllInputs:ce,maskAttributeFn:b,maskInputFn:y,maskTextFn:x,slimDOM:fe,dataURLOptions:S,recordCanvas:R,inlineImages:q,onSerialize:se=>{Aoe(se,pu)&&F.addIframe(se),Goe(se,pu)&&D.trackLinkElement(se),iL(se)&&Te.addShadowRoot(se.shadowRoot,document)},onIframeLoad:(se,W)=>{F.attachIframe(se,W),Te.observeAttachShadow(se)},onStylesheetLoad:(se,W)=>{D.attachLinkElement(se,W)},keepIframeSrcFn:A});if(!we)return console.warn("Failed to snapshot the document");zi({type:xn.FullSnapshot,data:{node:we,initialOffset:Coe(window)}}),u1.forEach(se=>se.unlock()),document.adoptedStyleSheets&&document.adoptedStyleSheets.length>0&&D.adoptStyleSheets(document.adoptedStyleSheets,pu.getId(document))};QM=he;try{const be=[],we=W=>jn(URe)({onMutation:ne,mutationCb:ye,mousemoveCb:(K,ie)=>zi({type:xn.IncrementalSnapshot,data:{source:ie,positions:K}}),mouseInteractionCb:K=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.MouseInteraction,...K}}),scrollCb:ve,viewportResizeCb:K=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.ViewportResize,...K}}),inputCb:K=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.Input,...K}}),mediaInteractionCb:K=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.MediaInteraction,...K}}),styleSheetRuleCb:K=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.StyleSheetRule,...K}}),styleDeclarationCb:K=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.StyleDeclaration,...K}}),canvasMutationCb:Ke,fontCb:K=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.Font,...K}}),selectionCb:K=>{zi({type:xn.IncrementalSnapshot,data:{source:Tn.Selection,...K}})},customElementCb:K=>{zi({type:xn.IncrementalSnapshot,data:{source:Tn.CustomElement,...K}})},blockClass:i,ignoreClass:o,ignoreSelector:l,maskAllText:u,maskTextClass:c,unmaskTextClass:d,maskTextSelector:f,unmaskTextSelector:h,maskInputOptions:ce,inlineStylesheet:p,sampling:E,recordCanvas:R,inlineImages:q,userTriggeredOnInput:k,collectFonts:N,doc:W,maskAttributeFn:b,maskInputFn:y,maskTextFn:x,keepIframeSrcFn:A,blockSelector:s,unblockSelector:a,slimDOMOptions:fe,dataURLOptions:S,mirror:pu,iframeManager:F,stylesheetManager:D,shadowDomManager:Te,processedNodeManager:re,canvasManager:de,ignoreCSSAttributes:Z,plugins:Fz([L,"optionalAccess",K=>K.filter,"call",K=>K(ie=>ie.observer),"optionalAccess",K=>K.map,"call",K=>K(ie=>({observer:ie.observer,options:ie.options,callback:me=>zi({type:xn.Plugin,data:{plugin:ie.name,payload:me}})}))])||[]},{});F.addLoadListener(W=>{try{be.push(we(W.contentDocument))}catch(K){console.warn(K)}});const se=()=>{he(),be.push(we(document))};return document.readyState==="interactive"||document.readyState==="complete"?se():(be.push(Qa("DOMContentLoaded",()=>{zi({type:xn.DomContentLoaded,data:{}}),z==="DOMContentLoaded"&&se()})),be.push(Qa("load",()=>{zi({type:xn.Load,data:{}}),z==="load"&&se()},window))),()=>{be.forEach(W=>W()),re.destroy(),QM=void 0,xRe()}}catch(be){console.warn(be)}}function DRe(t){if(!QM)throw new Error("please take full snapshot after start recording");QM(t)}lp.mirror=pu;lp.takeFullSnapshot=DRe;function WRe(t,e){try{return t?t(e):new Vj}catch{return console.warn("Unable to initialize CanvasManager"),new Vj}}const ARe=3,GRe=5;function GC(t){return t>9999999999?t:t*1e3}function _z(t){return t>9999999999?t/1e3:t}function hT(t,e){e.category!=="sentry.transaction"&&(["ui.click","ui.input"].includes(e.category)?t.triggerUserActivity():t.checkAndHandleExpiredSession(),t.addUpdate(()=>(t.throttledAddEvent({type:xn.Custom,timestamp:(e.timestamp||0)*1e3,data:{tag:"breadcrumb",payload:Rc(e,10,1e3)}}),e.category==="console")))}const FRe="button,a";function Qoe(t){return t.closest(FRe)||t}function _oe(t){const e=$oe(t);return!e||!(e instanceof Element)?e:Qoe(e)}function $oe(t){return jRe(t)?t.target:t}function jRe(t){return typeof t=="object"&&!!t&&"target"in t}let Oh;function ZRe(t){return Oh||(Oh=[],JRe()),Oh.push(t),()=>{const e=Oh?Oh.indexOf(t):-1;e>-1&&Oh.splice(e,1)}}function JRe(){Cs(Hr,"open",function(t){return function(...e){if(Oh)try{Oh.forEach(n=>n())}catch{}return t.apply(Hr,e)}})}function YRe(t,e,n){t.handleClick(e,n)}class BRe{constructor(e,n,r=hT){this._lastMutation=0,this._lastScroll=0,this._clicks=[],this._timeout=n.timeout/1e3,this._threshold=n.threshold/1e3,this._scollTimeout=n.scrollTimeout/1e3,this._replay=e,this._ignoreSelector=n.ignoreSelector,this._addBreadcrumbEvent=r}addListeners(){const e=ZRe(()=>{this._lastMutation=zj()});this._teardown=()=>{e(),this._clicks=[],this._lastMutation=0,this._lastScroll=0}}removeListeners(){this._teardown&&this._teardown(),this._checkClickTimeout&&clearTimeout(this._checkClickTimeout)}handleClick(e,n){if(QRe(n,this._ignoreSelector)||!_Re(e))return;const r={timestamp:_z(e.timestamp),clickBreadcrumb:e,clickCount:0,node:n};this._clicks.some(i=>i.node===r.node&&Math.abs(i.timestamp-r.timestamp)<1)||(this._clicks.push(r),this._clicks.length===1&&this._scheduleCheckClicks())}registerMutation(e=Date.now()){this._lastMutation=_z(e)}registerScroll(e=Date.now()){this._lastScroll=_z(e)}registerClick(e){const n=Qoe(e);this._handleMultiClick(n)}_handleMultiClick(e){this._getClicks(e).forEach(n=>{n.clickCount++})}_getClicks(e){return this._clicks.filter(n=>n.node===e)}_checkClicks(){const e=[],n=zj();this._clicks.forEach(r=>{!r.mutationAfter&&this._lastMutation&&(r.mutationAfter=r.timestamp<=this._lastMutation?this._lastMutation-r.timestamp:void 0),!r.scrollAfter&&this._lastScroll&&(r.scrollAfter=r.timestamp<=this._lastScroll?this._lastScroll-r.timestamp:void 0),r.timestamp+this._timeout<=n&&e.push(r)});for(const r of e){const i=this._clicks.indexOf(r);i>-1&&(this._generateBreadcrumbs(r),this._clicks.splice(i,1))}this._clicks.length&&this._scheduleCheckClicks()}_generateBreadcrumbs(e){const n=this._replay,r=e.scrollAfter&&e.scrollAfter<=this._scollTimeout,i=e.mutationAfter&&e.mutationAfter<=this._threshold,s=!r&&!i,{clickCount:a,clickBreadcrumb:o}=e;if(s){const l=Math.min(e.mutationAfter||this._timeout,this._timeout)*1e3,u=l1){const l={type:"default",message:o.message,timestamp:o.timestamp,category:"ui.multiClick",data:{...o.data,url:Hr.location.href,route:n.getCurrentRoute(),clickCount:a,metric:!0}};this._addBreadcrumbEvent(n,l)}}_scheduleCheckClicks(){this._checkClickTimeout&&clearTimeout(this._checkClickTimeout),this._checkClickTimeout=setTimeout(()=>this._checkClicks(),1e3)}}const HRe=["A","BUTTON","INPUT"];function QRe(t,e){return!!(!HRe.includes(t.tagName)||t.tagName==="INPUT"&&!["submit","button"].includes(t.getAttribute("type")||"")||t.tagName==="A"&&(t.hasAttribute("download")||t.hasAttribute("target")&&t.getAttribute("target")!=="_self")||e&&t.matches(e))}function _Re(t){return!!(t.data&&typeof t.data.nodeId=="number"&&t.timestamp)}function zj(){return Date.now()/1e3}function $Re(t,e){try{if(!eVe(e))return;const{source:n}=e.data;if(n===Tn.Mutation&&t.registerMutation(e.timestamp),n===Tn.Scroll&&t.registerScroll(e.timestamp),tVe(e)){const{type:r,id:i}=e.data,s=lp.mirror.getNode(i);s instanceof HTMLElement&&r===Fa.Click&&t.registerClick(s)}}catch{}}function eVe(t){return t.type===ARe}function tVe(t){return t.data.source===Tn.MouseInteraction}function Cc(t){return{timestamp:Date.now()/1e3,type:"default",...t}}var _M;(function(t){t[t.Document=0]="Document",t[t.DocumentType=1]="DocumentType",t[t.Element=2]="Element",t[t.Text=3]="Text",t[t.CDATA=4]="CDATA",t[t.Comment=5]="Comment"})(_M||(_M={}));const nVe=new Set(["id","class","aria-label","role","name","alt","title","data-test-id","data-testid","disabled","aria-disabled","data-sentry-component"]);function rVe(t){const e={};for(const n in t)if(nVe.has(n)){let r=n;(n==="data-testid"||n==="data-test-id")&&(r="testId"),e[r]=t[n]}return e}const iVe=t=>e=>{if(!t.isEnabled())return;const n=sVe(e);if(!n)return;const r=e.name==="click",i=r?e.event:void 0;r&&t.clickDetector&&i&&i.target&&!i.altKey&&!i.metaKey&&!i.ctrlKey&&!i.shiftKey&&YRe(t.clickDetector,n,_oe(e.event)),hT(t,n)};function ele(t,e){const n=lp.mirror.getId(t),r=n&&lp.mirror.getNode(n),i=r&&lp.mirror.getMeta(r),s=i&&oVe(i)?i:null;return{message:e,data:s?{nodeId:n,node:{id:n,tagName:s.tagName,textContent:Array.from(s.childNodes).map(a=>a.type===_M.Text&&a.textContent).filter(Boolean).map(a=>a.trim()).join(""),attributes:rVe(s.attributes)}}:{}}}function sVe(t){const{target:e,message:n}=aVe(t);return Cc({category:`ui.${t.name}`,...ele(e,n)})}function aVe(t){const e=t.name==="click";let n,r=null;try{r=e?_oe(t.event):$oe(t.event),n=zp(r,{maxStringLength:200})||""}catch{n=""}return{target:r,message:n}}function oVe(t){return t.type===_M.Element}function lVe(t,e){if(!t.isEnabled())return;t.updateUserActivity();const n=uVe(e);n&&hT(t,n)}function uVe(t){const{metaKey:e,shiftKey:n,ctrlKey:r,altKey:i,key:s,target:a}=t;if(!a||cVe(a)||!s)return null;const o=e||r||i,l=s.length===1;if(!o&&l)return null;const u=zp(a,{maxStringLength:200})||"",c=ele(a,u);return Cc({category:"ui.keyDown",message:u,data:{...c.data,metaKey:e,shiftKey:n,ctrlKey:r,altKey:i,key:s}})}function cVe(t){return t.tagName==="INPUT"||t.tagName==="TEXTAREA"||t.isContentEditable}const kj={resource:mVe,paint:hVe,navigation:pVe};function dVe(t){return t.map(fVe).filter(Boolean)}function fVe(t){return kj[t.entryType]?kj[t.entryType](t):null}function fb(t){return((bl||Hr.performance.timeOrigin)+t)/1e3}function hVe(t){const{duration:e,entryType:n,name:r,startTime:i}=t,s=fb(i);return{type:n,name:r,start:s,end:s+e,data:void 0}}function pVe(t){const{entryType:e,name:n,decodedBodySize:r,duration:i,domComplete:s,encodedBodySize:a,domContentLoadedEventStart:o,domContentLoadedEventEnd:l,domInteractive:u,loadEventStart:c,loadEventEnd:d,redirectCount:f,startTime:h,transferSize:p,type:m}=t;return i===0?null:{type:`${e}.${m}`,start:fb(h),end:fb(s),name:n,data:{size:p,decodedBodySize:r,encodedBodySize:a,duration:i,domInteractive:u,domContentLoadedEventStart:o,domContentLoadedEventEnd:l,loadEventStart:c,loadEventEnd:d,domComplete:s,redirectCount:f}}}function mVe(t){const{entryType:e,initiatorType:n,name:r,responseEnd:i,startTime:s,decodedBodySize:a,encodedBodySize:o,responseStatus:l,transferSize:u}=t;return["fetch","xmlhttprequest"].includes(n)?null:{type:`${e}.${n}`,start:fb(s),end:fb(i),name:r,data:{size:u,statusCode:l,decodedBodySize:a,encodedBodySize:o}}}function vVe(t){const e=t.entries,n=e[e.length-1],r=n?n.element:void 0,i=t.value,s=fb(i);return{type:"largest-contentful-paint",name:"largest-contentful-paint",start:s,end:s,data:{value:i,size:i,nodeId:r?lp.mirror.getId(r):void 0}}}function gVe(t){function e(i){t.performanceEntries.includes(i)||t.performanceEntries.push(i)}function n({entries:i}){i.forEach(e)}const r=[];return["navigation","paint","resource"].forEach(i=>{r.push(ob(i,n))}),r.push(loe(({metric:i})=>{t.replayPerformanceEntries.push(vVe(i))})),()=>{r.forEach(i=>i())}}const Dr=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,bVe='var t=Uint8Array,n=Uint16Array,r=Int32Array,e=new t([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),i=new t([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),a=new t([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),s=function(t,e){for(var i=new n(31),a=0;a<31;++a)i[a]=e+=1<>1|(21845&c)<<1;v=(61680&(v=(52428&v)>>2|(13107&v)<<2))>>4|(3855&v)<<4,u[c]=((65280&v)>>8|(255&v)<<8)>>1}var d=function(t,r,e){for(var i=t.length,a=0,s=new n(r);a>h]=l}else for(o=new n(i),a=0;a>15-t[a]);return o},g=new t(288);for(c=0;c<144;++c)g[c]=8;for(c=144;c<256;++c)g[c]=9;for(c=256;c<280;++c)g[c]=7;for(c=280;c<288;++c)g[c]=8;var w=new t(32);for(c=0;c<32;++c)w[c]=5;var p=d(g,9,0),y=d(w,5,0),m=function(t){return(t+7)/8|0},b=function(n,r,e){return(null==r||r<0)&&(r=0),(null==e||e>n.length)&&(e=n.length),new t(n.subarray(r,e))},M=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],E=function(t,n,r){var e=new Error(n||M[t]);if(e.code=t,Error.captureStackTrace&&Error.captureStackTrace(e,E),!r)throw e;return e},z=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8},A=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8,t[e+2]|=r>>16},_=function(r,e){for(var i=[],a=0;ad&&(d=o[a].s);var g=new n(d+1),w=x(i[c-1],g,0);if(w>e){a=0;var p=0,y=w-e,m=1<e))break;p+=m-(1<>=y;p>0;){var M=o[a].s;g[M]=0&&p;--a){var E=o[a].s;g[E]==e&&(--g[E],++p)}w=e}return{t:new t(g),l:w}},x=function(t,n,r){return-1==t.s?Math.max(x(t.l,n,r+1),x(t.r,n,r+1)):n[t.s]=r},D=function(t){for(var r=t.length;r&&!t[--r];);for(var e=new n(++r),i=0,a=t[0],s=1,o=function(t){e[i++]=t},f=1;f<=r;++f)if(t[f]==a&&f!=r)++s;else{if(!a&&s>2){for(;s>138;s-=138)o(32754);s>2&&(o(s>10?s-11<<5|28690:s-3<<5|12305),s=0)}else if(s>3){for(o(a),--s;s>6;s-=6)o(8304);s>2&&(o(s-3<<5|8208),s=0)}for(;s--;)o(a);s=1,a=t[f]}return{c:e.subarray(0,i),n:r}},T=function(t,n){for(var r=0,e=0;e>8,t[i+2]=255^t[i],t[i+3]=255^t[i+1];for(var a=0;a4&&!H[a[K-1]];--K);var N,P,Q,R,V=v+5<<3,W=T(f,g)+T(h,w)+l,X=T(f,M)+T(h,C)+l+14+3*K+T(q,H)+2*q[16]+3*q[17]+7*q[18];if(c>=0&&V<=W&&V<=X)return k(r,m,t.subarray(c,c+v));if(z(r,m,1+(X15&&(z(r,m,tt[B]>>5&127),m+=tt[B]>>12)}}}else N=p,P=g,Q=y,R=w;for(B=0;B255){A(r,m,N[(nt=rt>>18&31)+257]),m+=P[nt+257],nt>7&&(z(r,m,rt>>23&31),m+=e[nt]);var et=31&rt;A(r,m,Q[et]),m+=R[et],et>3&&(A(r,m,rt>>5&8191),m+=i[et])}else A(r,m,N[rt]),m+=P[rt]}return A(r,m,N[256]),m+P[256]},U=new r([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),F=new t(0),I=function(){for(var t=new Int32Array(256),n=0;n<256;++n){for(var r=n,e=9;--e;)r=(1&r&&-306674912)^r>>>1;t[n]=r}return t}(),S=function(){var t=1,n=0;return{p:function(r){for(var e=t,i=n,a=0|r.length,s=0;s!=a;){for(var o=Math.min(s+2655,a);s>16),i=(65535&i)+15*(i>>16)}t=e,n=i},d:function(){return(255&(t%=65521))<<24|(65280&t)<<8|(255&(n%=65521))<<8|n>>8}}},L=function(a,s,o,f,u){if(!u&&(u={l:1},s.dictionary)){var c=s.dictionary.subarray(-32768),v=new t(c.length+a.length);v.set(c),v.set(a,c.length),a=v,u.w=c.length}return function(a,s,o,f,u,c){var v=c.z||a.length,d=new t(f+v+5*(1+Math.ceil(v/7e3))+u),g=d.subarray(f,d.length-u),w=c.l,p=7&(c.r||0);if(s){p&&(g[0]=c.r>>3);for(var y=U[s-1],M=y>>13,E=8191&y,z=(1<7e3||q>24576)&&(N>423||!w)){p=C(a,g,0,F,I,S,O,q,G,j-G,p),q=L=O=0,G=j;for(var P=0;P<286;++P)I[P]=0;for(P=0;P<30;++P)S[P]=0}var Q=2,R=0,V=E,W=J-K&32767;if(N>2&&H==T(j-W))for(var X=Math.min(M,N)-1,Y=Math.min(32767,j),Z=Math.min(258,N);W<=Y&&--V&&J!=K;){if(a[j+Q]==a[j+Q-W]){for(var $=0;$Q){if(Q=$,R=W,$>X)break;var tt=Math.min(W,$-2),nt=0;for(P=0;Pnt&&(nt=et,K=rt)}}}W+=(J=K)-(K=A[J])&32767}if(R){F[q++]=268435456|h[Q]<<18|l[R];var it=31&h[Q],at=31&l[R];O+=e[it]+i[at],++I[257+it],++S[at],B=j+Q,++L}else F[q++]=a[j],++I[a[j]]}}for(j=Math.max(j,B);j=v&&(g[p/8|0]=w,st=v),p=k(g,p+1,a.subarray(j,st))}c.i=v}return b(d,0,f+m(p)+u)}(a,null==s.level?6:s.level,null==s.mem?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(a.length)))):12+s.mem,o,f,u)},O=function(t,n,r){for(;r;++n)t[n]=r,r>>>=8},j=function(){function n(n,r){if("function"==typeof n&&(r=n,n={}),this.ondata=r,this.o=n||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new t(98304),this.o.dictionary){var e=this.o.dictionary.subarray(-32768);this.b.set(e,32768-e.length),this.s.i=32768-e.length}}return n.prototype.p=function(t,n){this.ondata(L(t,this.o,0,0,this.s),n)},n.prototype.push=function(n,r){this.ondata||E(5),this.s.l&&E(4);var e=n.length+this.s.z;if(e>this.b.length){if(e>2*this.b.length-32768){var i=new t(-32768&e);i.set(this.b.subarray(0,this.s.z)),this.b=i}var a=this.b.length-this.s.z;a&&(this.b.set(n.subarray(0,a),this.s.z),this.s.z=this.b.length,this.p(this.b,!1)),this.b.set(this.b.subarray(-32768)),this.b.set(n.subarray(a),32768),this.s.z=n.length-a+32768,this.s.i=32766,this.s.w=32768}else this.b.set(n,this.s.z),this.s.z+=n.length;this.s.l=1&r,(this.s.z>this.s.w+8191||r)&&(this.p(this.b,r||!1),this.s.w=this.s.i,this.s.i-=2)},n}();function q(t,n){n||(n={});var r=function(){var t=-1;return{p:function(n){for(var r=t,e=0;e>>8;t=r},d:function(){return~t}}}(),e=t.length;r.p(t);var i,a=L(t,n,10+((i=n).filename?i.filename.length+1:0),8),s=a.length;return function(t,n){var r=n.filename;if(t[0]=31,t[1]=139,t[2]=8,t[8]=n.level<2?4:9==n.level?2:0,t[9]=3,0!=n.mtime&&O(t,4,Math.floor(new Date(n.mtime||Date.now())/1e3)),r){t[3]=8;for(var e=0;e<=r.length;++e)t[e+10]=r.charCodeAt(e)}}(a,n),O(a,s-8,r.d()),O(a,s-4,e),a}var B=function(){function t(t,n){this.c=S(),this.v=1,j.call(this,t,n)}return t.prototype.push=function(t,n){this.c.p(t),j.prototype.push.call(this,t,n)},t.prototype.p=function(t,n){var r=L(t,this.o,this.v&&(this.o.dictionary?6:2),n&&4,this.s);this.v&&(function(t,n){var r=n.level,e=0==r?0:r<6?1:9==r?3:2;if(t[0]=120,t[1]=e<<6|(n.dictionary&&32),t[1]|=31-(t[0]<<8|t[1])%31,n.dictionary){var i=S();i.p(n.dictionary),O(t,2,i.d())}}(r,this.o),this.v=0),n&&O(r,r.length-4,this.c.d()),this.ondata(r,n)},t}(),G="undefined"!=typeof TextEncoder&&new TextEncoder,H="undefined"!=typeof TextDecoder&&new TextDecoder;try{H.decode(F,{stream:!0})}catch(t){}var J=function(){function t(t){this.ondata=t}return t.prototype.push=function(t,n){this.ondata||E(5),this.d&&E(4),this.ondata(K(t),this.d=n||!1)},t}();function K(n,r){if(r){for(var e=new t(n.length),i=0;i>1)),o=0,f=function(t){s[o++]=t};for(i=0;is.length){var h=new t(o+8+(a-i<<1));h.set(s),s=h}var l=n.charCodeAt(i);l<128||r?f(l):l<2048?(f(192|l>>6),f(128|63&l)):l>55295&&l<57344?(f(240|(l=65536+(1047552&l)|1023&n.charCodeAt(++i))>>18),f(128|l>>12&63),f(128|l>>6&63),f(128|63&l)):(f(224|l>>12),f(128|l>>6&63),f(128|63&l))}return b(s,0,o)}const N=new class{constructor(){this._init()}clear(){this._init()}addEvent(t){if(!t)throw new Error("Adding invalid event");const n=this._hasEvents?",":"";this.stream.push(n+t),this._hasEvents=!0}finish(){this.stream.push("]",!0);const t=function(t){let n=0;for(let r=0,e=t.length;r{this._deflatedData.push(t)},this.stream=new J(((t,n)=>{this.deflate.push(t,n)})),this.stream.push("[")}},P={clear:()=>{N.clear()},addEvent:t=>N.addEvent(t),finish:()=>N.finish(),compress:t=>function(t){return q(K(t))}(t)};addEventListener("message",(function(t){const n=t.data.method,r=t.data.id,e=t.data.arg;if(n in P&&"function"==typeof P[n])try{const t=P[n](e);postMessage({id:r,method:n,success:!0,response:t})}catch(t){postMessage({id:r,method:n,success:!1,response:t.message}),console.error(t)}})),postMessage({id:void 0,method:"init",success:!0,response:void 0});';function yVe(){const t=new Blob([bVe]);return URL.createObjectURL(t)}function Ya(t,e){Dr&&(He.info(t),e&&tle(t))}function U1(t,e){Dr&&(He.info(t),e&&setTimeout(()=>{tle(t)},0))}function tle(t){kp({category:"console",data:{logger:"replay"},level:"info",message:t},{level:"info"})}class FC extends Error{constructor(){super(`Event buffer exceeded maximum size of ${CC}.`)}}class nle{constructor(){this.events=[],this._totalSize=0,this.hasCheckout=!1}get hasEvents(){return this.events.length>0}get type(){return"sync"}destroy(){this.events=[]}async addEvent(e){const n=JSON.stringify(e).length;if(this._totalSize+=n,this._totalSize>CC)throw new FC;this.events.push(e)}finish(){return new Promise(e=>{const n=this.events;this.clear(),e(JSON.stringify(n))})}clear(){this.events=[],this._totalSize=0,this.hasCheckout=!1}getEarliestTimestamp(){const e=this.events.map(n=>n.timestamp).sort()[0];return e?GC(e):null}}class SVe{constructor(e){this._worker=e,this._id=0}ensureReady(){return this._ensureReadyPromise?this._ensureReadyPromise:(this._ensureReadyPromise=new Promise((e,n)=>{this._worker.addEventListener("message",({data:r})=>{r.success?e():n()},{once:!0}),this._worker.addEventListener("error",r=>{n(r)},{once:!0})}),this._ensureReadyPromise)}destroy(){Ya("[Replay] Destroying compression worker"),this._worker.terminate()}postMessage(e,n){const r=this._getAndIncrementId();return new Promise((i,s)=>{const a=({data:o})=>{const l=o;if(l.method===e&&l.id===r){if(this._worker.removeEventListener("message",a),!l.success){Dr&&He.error("[Replay]",l.response),s(new Error("Error in compression worker"));return}i(l.response)}};this._worker.addEventListener("message",a),this._worker.postMessage({id:r,method:e,arg:n})})}_getAndIncrementId(){return this._id++}}class xVe{constructor(e){this._worker=new SVe(e),this._earliestTimestamp=null,this._totalSize=0,this.hasCheckout=!1}get hasEvents(){return!!this._earliestTimestamp}get type(){return"worker"}ensureReady(){return this._worker.ensureReady()}destroy(){this._worker.destroy()}addEvent(e){const n=GC(e.timestamp);(!this._earliestTimestamp||nCC?Promise.reject(new FC):this._sendEventToWorker(r)}finish(){return this._finishRequest()}clear(){this._earliestTimestamp=null,this._totalSize=0,this.hasCheckout=!1,this._worker.postMessage("clear").then(null,e=>{Dr&&He.warn('[Replay] Sending "clear" message to worker failed',e)})}getEarliestTimestamp(){return this._earliestTimestamp}_sendEventToWorker(e){return this._worker.postMessage("addEvent",e)}async _finishRequest(){const e=await this._worker.postMessage("finish");return this._earliestTimestamp=null,this._totalSize=0,e}}class TVe{constructor(e){this._fallback=new nle,this._compression=new xVe(e),this._used=this._fallback,this._ensureWorkerIsLoadedPromise=this._ensureWorkerIsLoaded()}get type(){return this._used.type}get hasEvents(){return this._used.hasEvents}get hasCheckout(){return this._used.hasCheckout}set hasCheckout(e){this._used.hasCheckout=e}destroy(){this._fallback.destroy(),this._compression.destroy()}clear(){return this._used.clear()}getEarliestTimestamp(){return this._used.getEarliestTimestamp()}addEvent(e){return this._used.addEvent(e)}async finish(){return await this.ensureWorkerIsLoaded(),this._used.finish()}ensureWorkerIsLoaded(){return this._ensureWorkerIsLoadedPromise}async _ensureWorkerIsLoaded(){try{await this._compression.ensureReady()}catch{Ya("[Replay] Failed to load the compression worker, falling back to simple buffer");return}await this._switchToCompressionWorker()}async _switchToCompressionWorker(){const{events:e,hasCheckout:n}=this._fallback,r=[];for(const i of e)r.push(this._compression.addEvent(i));this._compression.hasCheckout=n,this._used=this._compression;try{await Promise.all(r)}catch(i){Dr&&He.warn("[Replay] Failed to add events when switching buffers.",i)}}}function wVe({useCompression:t,workerUrl:e}){if(t&&window.Worker){const n=EVe(e);if(n)return n}return Ya("[Replay] Using simple buffer"),new nle}function EVe(t){try{const e=t||MVe();if(!e)return;Ya(`[Replay] Using compression worker${t?` from ${t}`:""}`);const n=new Worker(e);return new TVe(n)}catch{Ya("[Replay] Failed to create compression worker")}}function MVe(){return typeof __SENTRY_EXCLUDE_REPLAY_WORKER__>"u"||!__SENTRY_EXCLUDE_REPLAY_WORKER__?yVe():""}function jC(){try{return"sessionStorage"in Hr&&!!Hr.sessionStorage}catch{return!1}}function PVe(t){RVe(),t.session=void 0}function RVe(){if(jC())try{Hr.sessionStorage.removeItem(LC)}catch{}}function rle(t){return t===void 0?!1:Math.random()t.getContext().initialTimestamp+t.getOptions().maxReplayDuration?(Ya(`[Replay] Skipping event with timestamp ${n} because it is after maxReplayDuration`,t.getOptions()._experiments.traceInternals),!1):!0}function IVe(t,e){try{if(typeof e=="function"&&kVe(t))return e(t)}catch(n){return Dr&&He.error("[Replay] An error occured in the `beforeAddRecordingEvent` callback, skipping the event...",n),null}return t}function YC(t){return!t.type}function lL(t){return t.type==="transaction"}function UVe(t){return t.type==="replay_event"}function Ij(t){return t.type==="feedback"}function ule(t){const e=XVe();return(n,r)=>{if(!t.isEnabled()||!YC(n)&&!lL(n))return;const i=r&&r.statusCode;if(!(e&&(!i||i<200||i>=300))){if(lL(n)){NVe(t,n);return}LVe(t,n)}}}function NVe(t,e){const n=t.getContext();e.contexts&&e.contexts.trace&&e.contexts.trace.trace_id&&n.traceIds.size<100&&n.traceIds.add(e.contexts.trace.trace_id)}function LVe(t,e){const n=t.getContext();if(e.event_id&&n.errorIds.size<100&&n.errorIds.add(e.event_id),t.recordingMode!=="buffer"||!e.tags||!e.tags.replayId)return;const{beforeErrorSampling:r}=t.getOptions();typeof r=="function"&&!r(e)||setTimeout(()=>{t.sendBufferedReplayOrFlush()})}function XVe(){const t=Rr();if(!t)return!1;const e=t.getTransport();return e&&e.send.__sentry__baseTransport__||!1}function CVe(t){return e=>{!t.isEnabled()||!YC(e)||KVe(t,e)}}function KVe(t,e){const n=e.exception&&e.exception.values&&e.exception.values[0].value;if(typeof n=="string"&&(n.match(/reactjs\.org\/docs\/error-decoder\.html\?invariant=(418|419|422|423|425)/)||n.match(/(does not match server-rendered HTML|Hydration failed because)/i))){const r=Cc({category:"replay.hydrate-error"});hT(t,r)}}function qVe(t,e){return t.type||!t.exception||!t.exception.values||!t.exception.values.length?!1:!!(e.originalException&&e.originalException.__rrweb__)}function DVe(t,e){t.triggerUserActivity(),t.addUpdate(()=>e.timestamp?(t.throttledAddEvent({type:xn.Custom,timestamp:e.timestamp*1e3,data:{tag:"breadcrumb",payload:{timestamp:e.timestamp,type:"default",category:"sentry.feedback",data:{feedbackId:e.event_id}}}}),!1):!0)}function WVe(t,e){return t.recordingMode!=="buffer"||e.message===XC||!e.exception||e.type?!1:rle(t.getOptions().errorSampleRate)}function AVe(t,e=!1){const n=e?ule(t):void 0;return Object.assign((r,i)=>t.isEnabled()?UVe(r)?(delete r.breadcrumbs,r):!YC(r)&&!lL(r)&&!Ij(r)||!t.checkAndHandleExpiredSession()?r:Ij(r)?(t.flush(),r.contexts.feedback.replay_id=t.getSessionId(),DVe(t,r),r):qVe(r,i)&&!t.getOptions()._experiments.captureExceptions?(Dr&&He.log("[Replay] Ignoring error from rrweb internals",r),null):((WVe(t,r)||t.recordingMode==="session")&&(r.tags={...r.tags,replayId:t.getSessionId()}),n&&n(r,{statusCode:200}),r):r,{id:"Replay"})}function yV(t,e){return e.map(({type:n,start:r,end:i,name:s,data:a})=>{const o=t.throttledAddEvent({type:xn.Custom,timestamp:r,data:{tag:"performanceSpan",payload:{op:n,description:s,startTimestamp:r,endTimestamp:i,data:a}}});return typeof o=="string"?Promise.resolve(null):o})}function GVe(t){const{from:e,to:n}=t,r=Date.now()/1e3;return{type:"navigation.push",start:r,end:r,name:n,data:{previous:e}}}function FVe(t){return e=>{if(!t.isEnabled())return;const n=GVe(e);n!==null&&(t.getContext().urls.push(n.name),t.triggerUserActivity(),t.addUpdate(()=>(yV(t,[n]),!1)))}}function jVe(t,e){return Dr&&t.getOptions()._experiments.traceInternals?!1:AEe(e,Rr())}function SV(t,e){t.isEnabled()&&e!==null&&(jVe(t,e.name)||t.addUpdate(()=>(yV(t,[e]),!0)))}function ZVe(t){const{startTimestamp:e,endTimestamp:n,fetchData:r,response:i}=t;if(!n)return null;const{method:s,url:a}=r;return{type:"resource.fetch",start:e/1e3,end:n/1e3,name:a,data:{method:s,statusCode:i?i.status:void 0}}}function JVe(t){return e=>{if(!t.isEnabled())return;const n=ZVe(e);SV(t,n)}}function YVe(t){const{startTimestamp:e,endTimestamp:n,xhr:r}=t,i=r[jh];if(!e||!n||!i)return null;const{method:s,url:a,status_code:o}=i;return a===void 0?null:{type:"resource.xhr",name:a,start:e/1e3,end:n/1e3,data:{method:s,statusCode:o}}}function BVe(t){return e=>{if(!t.isEnabled())return;const n=YVe(e);SV(t,n)}}function xV(t,e){if(t)try{if(typeof t=="string")return e.encode(t).length;if(t instanceof URLSearchParams)return e.encode(t.toString()).length;if(t instanceof FormData){const n=hle(t);return e.encode(n).length}if(t instanceof Blob)return t.size;if(t instanceof ArrayBuffer)return t.byteLength}catch{}}function cle(t){if(!t)return;const e=parseInt(t,10);return isNaN(e)?void 0:e}function dle(t){try{if(typeof t=="string")return[t];if(t instanceof URLSearchParams)return[t.toString()];if(t instanceof FormData)return[hle(t)];if(!t)return[void 0]}catch{return Dr&&He.warn("[Replay] Failed to serialize body",t),[void 0,"BODY_PARSE_ERROR"]}return Dr&&He.info("[Replay] Skipping network body because of body type",t),[void 0,"UNPARSEABLE_BODY_TYPE"]}function $M(t,e){if(!t)return{headers:{},size:void 0,_meta:{warnings:[e]}};const n={...t._meta},r=n.warnings||[];return n.warnings=[...r,e],t._meta=n,t}function fle(t,e){if(!e)return null;const{startTimestamp:n,endTimestamp:r,url:i,method:s,statusCode:a,request:o,response:l}=e;return{type:t,start:n/1e3,end:r/1e3,name:i,data:to({method:s,statusCode:a,request:o,response:l})}}function e6(t){return{headers:{},size:t,_meta:{warnings:["URL_SKIPPED"]}}}function up(t,e,n){if(!e&&Object.keys(t).length===0)return;if(!e)return{headers:t};if(!n)return{headers:t,size:e};const r={headers:t,size:e},{body:i,warnings:s}=HVe(n);return r.body=i,s&&s.length>0&&(r._meta={warnings:s}),r}function uL(t,e){return Object.keys(t).reduce((n,r)=>{const i=r.toLowerCase();return e.includes(i)&&t[r]&&(n[i]=t[r]),n},{})}function hle(t){return new URLSearchParams(t).toString()}function HVe(t){if(!t||typeof t!="string")return{body:t};const e=t.length>vj,n=QVe(t);if(e){const r=t.slice(0,vj);return n?{body:r,warnings:["MAYBE_JSON_TRUNCATED"]}:{body:`${r}…`,warnings:["TEXT_TRUNCATED"]}}if(n)try{return{body:JSON.parse(t)}}catch{}return{body:t}}function QVe(t){const e=t[0],n=t[t.length-1];return e==="["&&n==="]"||e==="{"&&n==="}"}function eP(t,e){const n=_Ve(t);return ny(n,e)}function _Ve(t,e=Hr.document.baseURI){if(t.startsWith("http://")||t.startsWith("https://")||t.startsWith(Hr.location.origin))return t;const n=new URL(t,e);if(n.origin!==new URL(e).origin)return t;const r=n.href;return!t.endsWith("/")&&r.endsWith("/")?r.slice(0,-1):r}async function $Ve(t,e,n){try{const r=await t9e(t,e,n),i=fle("resource.fetch",r);SV(n.replay,i)}catch(r){Dr&&He.error("[Replay] Failed to capture fetch breadcrumb",r)}}function e9e(t,e,n){const{input:r,response:i}=e,s=r?ple(r):void 0,a=xV(s,n.textEncoder),o=i?cle(i.headers.get("content-length")):void 0;a!==void 0&&(t.data.request_body_size=a),o!==void 0&&(t.data.response_body_size=o)}async function t9e(t,e,n){const r=Date.now(),{startTimestamp:i=r,endTimestamp:s=r}=e,{url:a,method:o,status_code:l=0,request_body_size:u,response_body_size:c}=t.data,d=eP(a,n.networkDetailAllowUrls)&&!eP(a,n.networkDetailDenyUrls),f=d?n9e(n,e.input,u):e6(u),h=await r9e(d,n,e.response,c);return{startTimestamp:i,endTimestamp:s,url:a,method:o,statusCode:l,request:f,response:h}}function n9e({networkCaptureBodies:t,networkRequestHeaders:e},n,r){const i=n?a9e(n,e):{};if(!t)return up(i,r,void 0);const s=ple(n),[a,o]=dle(s),l=up(i,r,a);return o?$M(l,o):l}async function r9e(t,{networkCaptureBodies:e,textEncoder:n,networkResponseHeaders:r},i,s){if(!t&&s!==void 0)return e6(s);const a=i?mle(i.headers,r):{};if(!i||!e&&s!==void 0)return up(a,s,void 0);const[o,l]=await s9e(i),u=i9e(o,{networkCaptureBodies:e,textEncoder:n,responseBodySize:s,captureDetails:t,headers:a});return l?$M(u,l):u}function i9e(t,{networkCaptureBodies:e,textEncoder:n,responseBodySize:r,captureDetails:i,headers:s}){try{const a=t&&t.length&&r===void 0?xV(t,n):r;return i?e?up(s,a,t):up(s,a,void 0):e6(a)}catch(a){return Dr&&He.warn("[Replay] Failed to serialize response body",a),up(s,r,void 0)}}async function s9e(t){const e=o9e(t);if(!e)return[void 0,"BODY_PARSE_ERROR"];try{return[await l9e(e)]}catch(n){return Dr&&He.warn("[Replay] Failed to get text body from response",n),[void 0,"BODY_PARSE_ERROR"]}}function ple(t=[]){if(!(t.length!==2||typeof t[1]!="object"))return t[1].body}function mle(t,e){const n={};return e.forEach(r=>{t.get(r)&&(n[r]=t.get(r))}),n}function a9e(t,e){return t.length===1&&typeof t[0]!="string"?Uj(t[0],e):t.length===2?Uj(t[1],e):{}}function Uj(t,e){if(!t)return{};const n=t.headers;return n?n instanceof Headers?mle(n,e):Array.isArray(n)?{}:uL(n,e):{}}function o9e(t){try{return t.clone()}catch(e){Dr&&He.warn("[Replay] Failed to clone response body",e)}}function l9e(t){return new Promise((e,n)=>{const r=setTimeout(()=>n(new Error("Timeout while trying to read response body")),500);u9e(t).then(i=>e(i),i=>n(i)).finally(()=>clearTimeout(r))})}async function u9e(t){return await t.text()}async function c9e(t,e,n){try{const r=f9e(t,e,n),i=fle("resource.xhr",r);SV(n.replay,i)}catch(r){Dr&&He.error("[Replay] Failed to capture xhr breadcrumb",r)}}function d9e(t,e,n){const{xhr:r,input:i}=e;if(!r)return;const s=xV(i,n.textEncoder),a=r.getResponseHeader("content-length")?cle(r.getResponseHeader("content-length")):v9e(r.response,r.responseType,n.textEncoder);s!==void 0&&(t.data.request_body_size=s),a!==void 0&&(t.data.response_body_size=a)}function f9e(t,e,n){const r=Date.now(),{startTimestamp:i=r,endTimestamp:s=r,input:a,xhr:o}=e,{url:l,method:u,status_code:c=0,request_body_size:d,response_body_size:f}=t.data;if(!l)return null;if(!o||!eP(l,n.networkDetailAllowUrls)||eP(l,n.networkDetailDenyUrls)){const M=e6(d),E=e6(f);return{startTimestamp:i,endTimestamp:s,url:l,method:u,statusCode:c,request:M,response:E}}const h=o[jh],p=h?uL(h.request_headers,n.networkRequestHeaders):{},m=uL(h9e(o),n.networkResponseHeaders),[v,g]=n.networkCaptureBodies?dle(a):[void 0],[b,y]=n.networkCaptureBodies?p9e(o):[void 0],x=up(p,d,v),T=up(m,f,b);return{startTimestamp:i,endTimestamp:s,url:l,method:u,statusCode:c,request:g?$M(x,g):x,response:y?$M(T,y):T}}function h9e(t){const e=t.getAllResponseHeaders();return e?e.split(`\r -`).reduce((n,r)=>{const[i,s]=r.split(": ");return n[i.toLowerCase()]=s,n},{}):{}}function p9e(t){const e=[];try{return[t.responseText]}catch(n){e.push(n)}try{return m9e(t.response,t.responseType)}catch(n){e.push(n)}return Dr&&He.warn("[Replay] Failed to get xhr response body",...e),[void 0]}function m9e(t,e){try{if(typeof t=="string")return[t];if(t instanceof Document)return[t.body.outerHTML];if(e==="json"&&t&&typeof t=="object")return[JSON.stringify(t)];if(!t)return[void 0]}catch{return Dr&&He.warn("[Replay] Failed to serialize body",t),[void 0,"BODY_PARSE_ERROR"]}return Dr&&He.info("[Replay] Skipping network body because of body type",t),[void 0,"UNPARSEABLE_BODY_TYPE"]}function v9e(t,e,n){try{const r=e==="json"&&t&&typeof t=="object"?JSON.stringify(t):t;return xV(r,n)}catch{return}}function g9e(t){const e=Rr();try{const n=new TextEncoder,{networkDetailAllowUrls:r,networkDetailDenyUrls:i,networkCaptureBodies:s,networkRequestHeaders:a,networkResponseHeaders:o}=t.getOptions(),l={replay:t,textEncoder:n,networkDetailAllowUrls:r,networkDetailDenyUrls:i,networkCaptureBodies:s,networkRequestHeaders:a,networkResponseHeaders:o};e&&e.on?e.on("beforeAddBreadcrumb",(u,c)=>b9e(l,u,c)):(SC(JVe(t)),xC(BVe(t)))}catch{}}function b9e(t,e,n){if(e.data)try{y9e(e)&&x9e(n)&&(d9e(e,n,t),c9e(e,n,t)),S9e(e)&&T9e(n)&&(e9e(e,n,t),$Ve(e,n,t))}catch{Dr&&He.warn("Error when enriching network breadcrumb")}}function y9e(t){return t.category==="xhr"}function S9e(t){return t.category==="fetch"}function x9e(t){return t&&t.xhr}function T9e(t){return t&&t.response}let Nj=null;function w9e(t){return!!t.category}const E9e=t=>e=>{if(!t.isEnabled())return;const n=M9e(e);n&&hT(t,n)};function M9e(t){const e=t.getLastBreadcrumb&&t.getLastBreadcrumb();return Nj===e||!e||(Nj=e,!w9e(e)||["fetch","xhr","sentry.event","sentry.transaction"].includes(e.category)||e.category.startsWith("ui."))?null:e.category==="console"?P9e(e):Cc(e)}function P9e(t){const e=t.data&&t.data.arguments;if(!Array.isArray(e)||e.length===0)return Cc(t);let n=!1;const r=e.map(i=>{if(!i)return i;if(typeof i=="string")return i.length>o2?(n=!0,`${i.slice(0,o2)}…`):i;if(typeof i=="object")try{const s=Rc(i,7);return JSON.stringify(s).length>o2?(n=!0,`${JSON.stringify(s,null,2).slice(0,o2)}…`):s}catch{}return i});return Cc({...t,data:{...t.data,arguments:r,...n?{_meta:{warnings:["CONSOLE_ARG_TRUNCATED"]}}:{}}})}function R9e(t){const e=jo(),n=Rr();e.addScopeListener(E9e(t)),yae(iVe(t)),uV(FVe(t)),g9e(t);const r=AVe(t,!Lj(n));n&&n.addEventProcessor?n.addEventProcessor(r):LEe(r),Lj(n)&&(n.on("beforeSendEvent",CVe(t)),n.on("afterSendEvent",ule(t)),n.on("createDsc",i=>{const s=t.getSessionId();s&&t.isEnabled()&&t.recordingMode==="session"&&t.checkAndHandleExpiredSession()&&(i.replay_id=s)}),n.on("startTransaction",i=>{t.lastTransaction=i}),n.on("finishTransaction",i=>{t.lastTransaction=i}),n.on("beforeSendFeedback",(i,s)=>{const a=t.getSessionId();s&&s.includeReplay&&t.isEnabled()&&a&&i.contexts&&i.contexts.feedback&&(i.contexts.feedback.replay_id=a)}))}function Lj(t){return!!(t&&t.on)}async function V9e(t){try{return Promise.all(yV(t,[z9e(Hr.performance.memory)]))}catch{return[]}}function z9e(t){const{jsHeapSizeLimit:e,totalJSHeapSize:n,usedJSHeapSize:r}=t,i=Date.now()/1e3;return{type:"memory",name:"memory",start:i,end:i,data:{memory:{jsHeapSizeLimit:e,totalJSHeapSize:n,usedJSHeapSize:r}}}}function k9e(t,e,n){let r,i,s;const a=n&&n.maxWait?Math.max(n.maxWait,e):0;function o(){return l(),r=t(),r}function l(){i!==void 0&&clearTimeout(i),s!==void 0&&clearTimeout(s),i=s=void 0}function u(){return i!==void 0||s!==void 0?o():r}function c(){return i&&clearTimeout(i),i=setTimeout(o,e),a&&s===void 0&&(s=setTimeout(o,a)),r}return c.cancel=l,c.flush=u,c}function O9e(t){let e=!1;return(n,r)=>{if(!t.checkAndHandleExpiredSession()){Dr&&He.warn("[Replay] Received replay event after session expired.");return}const i=r||!e;e=!0,t.clickDetector&&$Re(t.clickDetector,n),t.addUpdate(()=>{if(t.recordingMode==="buffer"&&i&&t.setInitialState(),!JC(t,n,i))return!0;if(!i)return!1;if(U9e(t,i),t.session&&t.session.previousSessionId)return!0;if(t.recordingMode==="buffer"&&t.session&&t.eventBuffer){const s=t.eventBuffer.getEarliestTimestamp();s&&(Ya(`[Replay] Updating session start time to earliest event in buffer to ${new Date(s)}`,t.getOptions()._experiments.traceInternals),t.session.started=s,t.getOptions().stickySession&&ZC(t.session))}return t.recordingMode==="session"&&t.flush(),!0})}}function I9e(t){const e=t.getOptions();return{type:xn.Custom,timestamp:Date.now(),data:{tag:"options",payload:{shouldRecordCanvas:t.isRecordingCanvas(),sessionSampleRate:e.sessionSampleRate,errorSampleRate:e.errorSampleRate,useCompressionOption:e.useCompression,blockAllMedia:e.blockAllMedia,maskAllText:e.maskAllText,maskAllInputs:e.maskAllInputs,useCompression:t.eventBuffer?t.eventBuffer.type==="worker":!1,networkDetailHasUrls:e.networkDetailAllowUrls.length>0,networkCaptureBodies:e.networkCaptureBodies,networkRequestHasHeaders:e.networkRequestHeaders.length>0,networkResponseHasHeaders:e.networkResponseHeaders.length>0}}}}function U9e(t,e){!e||!t.session||t.session.segmentId!==0||JC(t,I9e(t),!1)}function N9e(t,e,n,r){return Hp(Rae(t,EC(t),r,n),[[{type:"replay_event"},t],[{type:"replay_recording",length:typeof e=="string"?new TextEncoder().encode(e).length:e.length},e]])}function L9e({recordingData:t,headers:e}){let n;const r=`${JSON.stringify(e)} -`;if(typeof t=="string")n=`${r}${t}`;else{const s=new TextEncoder().encode(r);n=new Uint8Array(s.length+t.length),n.set(s),n.set(t,s.length)}return n}async function X9e({client:t,scope:e,replayId:n,event:r}){const i=typeof t._integrations=="object"&&t._integrations!==null&&!Array.isArray(t._integrations)?Object.keys(t._integrations):void 0,s={event_id:n,integrations:i};t.emit&&t.emit("preprocessEvent",r,s);const a=await Uae(t.getOptions(),r,s,e,t,Qp());if(!a)return null;a.platform=a.platform||"javascript";const o=t.getSdkMetadata&&t.getSdkMetadata(),{name:l,version:u}=o&&o.sdk||{};return a.sdk={...a.sdk,name:l||"sentry.javascript.unknown",version:u||"0.0.0"},a}async function C9e({recordingData:t,replayId:e,segmentId:n,eventContext:r,timestamp:i,session:s}){const a=L9e({recordingData:t,headers:{segment_id:n}}),{urls:o,errorIds:l,traceIds:u,initialTimestamp:c}=r,d=Rr(),f=jo(),h=d&&d.getTransport(),p=d&&d.getDsn();if(!d||!h||!p||!s.sampled)return;const m={type:xPe,replay_start_timestamp:c/1e3,timestamp:i/1e3,error_ids:l,trace_ids:u,urls:o,replay_id:e,segment_id:n,replay_type:s.sampled},v=await X9e({scope:f,client:d,replayId:e,event:m});if(!v){d.recordDroppedEvent("event_processor","replay",m),Ya("An event processor returned `null`, will not send event.");return}delete v.sdkProcessingMetadata;const g=N9e(v,a,p,d.getOptions().tunnel);let b;try{b=await h.send(g)}catch(x){const T=new Error(XC);try{T.cause=x}catch{}throw T}if(!b)return b;if(typeof b.statusCode=="number"&&(b.statusCode<200||b.statusCode>=300))throw new vle(b.statusCode);const y=zae({},b);if(Vae(y,"replay"))throw new gle(y);return b}class vle extends Error{constructor(e){super(`Transport returned status code ${e}`)}}class gle extends Error{constructor(e){super("Rate limit hit"),this.rateLimits=e}}async function ble(t,e={count:0,interval:RPe}){const{recordingData:n,options:r}=t;if(n.length)try{return await C9e(t),!0}catch(i){if(i instanceof vle||i instanceof gle)throw i;if(j5e("Replays",{_retryCount:e.count}),Dr&&r._experiments&&r._experiments.captureExceptions&&ay(i),e.count>=VPe){const s=new Error(`${XC} - max retries exceeded`);try{s.cause=i}catch{}throw s}return e.interval*=++e.count,new Promise((s,a)=>{setTimeout(async()=>{try{await ble(t,e),s(!0)}catch(o){a(o)}},e.interval)})}}const yle="__THROTTLED",K9e="__SKIPPED";function q9e(t,e,n){const r=new Map,i=o=>{const l=o-n;r.forEach((u,c)=>{c[...r.values()].reduce((o,l)=>o+l,0);let a=!1;return(...o)=>{const l=Math.floor(Date.now()/1e3);if(i(l),s()>=e){const c=a;return a=!0,c?K9e:yle}a=!1;const u=r.get(l)||0;return r.set(l,u+1),t(...o)}}class Ih{constructor({options:e,recordingOptions:n}){Ih.prototype.__init.call(this),Ih.prototype.__init2.call(this),Ih.prototype.__init3.call(this),Ih.prototype.__init4.call(this),Ih.prototype.__init5.call(this),Ih.prototype.__init6.call(this),this.eventBuffer=null,this.performanceEntries=[],this.replayPerformanceEntries=[],this.recordingMode="session",this.timeouts={sessionIdlePause:TPe,sessionIdleExpire:wPe},this._lastActivity=Date.now(),this._isEnabled=!1,this._isPaused=!1,this._hasInitializedCoreListeners=!1,this._context={errorIds:new Set,traceIds:new Set,urls:[],initialTimestamp:Date.now(),initialUrl:""},this._recordingOptions=n,this._options=e,this._debouncedFlush=k9e(()=>this._flush(),this._options.flushMinDelay,{maxWait:this._options.flushMaxDelay}),this._throttledAddEvent=q9e((a,o)=>OVe(this,a,o),300,5);const{slowClickTimeout:r,slowClickIgnoreSelectors:i}=this.getOptions(),s=r?{threshold:Math.min(zPe,r),timeout:r,scrollTimeout:kPe,ignoreSelector:i?i.join(","):""}:void 0;s&&(this.clickDetector=new BRe(this,s))}getContext(){return this._context}isEnabled(){return this._isEnabled}isPaused(){return this._isPaused}isRecordingCanvas(){return!!this._canvas}getOptions(){return this._options}initializeSampling(e){const{errorSampleRate:n,sessionSampleRate:r}=this._options;if(!(n<=0&&r<=0)){if(this._initializeSessionForSampling(e),!this.session){this._handleException(new Error("Unable to initialize and create session"));return}this.session.sampled!==!1&&(this.recordingMode=this.session.sampled==="buffer"&&this.session.segmentId===0?"buffer":"session",U1(`[Replay] Starting replay in ${this.recordingMode} mode`,this._options._experiments.traceInternals),this._initializeRecording())}}start(){if(this._isEnabled&&this.recordingMode==="session")throw new Error("Replay recording is already in progress");if(this._isEnabled&&this.recordingMode==="buffer")throw new Error("Replay buffering is in progress, call `flush()` to save the replay");U1("[Replay] Starting replay in session mode",this._options._experiments.traceInternals),this._updateUserActivity();const e=$z({maxReplayDuration:this._options.maxReplayDuration,sessionIdleExpire:this.timeouts.sessionIdleExpire,traceInternals:this._options._experiments.traceInternals},{stickySession:this._options.stickySession,sessionSampleRate:1,allowBuffering:!1});this.session=e,this._initializeRecording()}startBuffering(){if(this._isEnabled)throw new Error("Replay recording is already in progress");U1("[Replay] Starting replay in buffer mode",this._options._experiments.traceInternals);const e=$z({sessionIdleExpire:this.timeouts.sessionIdleExpire,maxReplayDuration:this._options.maxReplayDuration,traceInternals:this._options._experiments.traceInternals},{stickySession:this._options.stickySession,sessionSampleRate:0,allowBuffering:!0});this.session=e,this.recordingMode="buffer",this._initializeRecording()}startRecording(){try{const e=this._canvas;this._stopRecording=lp({...this._recordingOptions,...this.recordingMode==="buffer"&&{checkoutEveryNms:PPe},emit:O9e(this),onMutation:this._onMutationHandler,...e?{recordCanvas:e.recordCanvas,getCanvasManager:e.getCanvasManager,sampling:e.sampling,dataURLOptions:e.dataURLOptions}:{}})}catch(e){this._handleException(e)}}stopRecording(){try{return this._stopRecording&&(this._stopRecording(),this._stopRecording=void 0),!0}catch(e){return this._handleException(e),!1}}async stop({forceFlush:e=!1,reason:n}={}){if(this._isEnabled){this._isEnabled=!1;try{Ya(`[Replay] Stopping Replay${n?` triggered by ${n}`:""}`,this._options._experiments.traceInternals),this._removeListeners(),this.stopRecording(),this._debouncedFlush.cancel(),e&&await this._flush({force:!0}),this.eventBuffer&&this.eventBuffer.destroy(),this.eventBuffer=null,PVe(this)}catch(r){this._handleException(r)}}}pause(){this._isPaused||(this._isPaused=!0,this.stopRecording(),Ya("[Replay] Pausing replay",this._options._experiments.traceInternals))}resume(){!this._isPaused||!this._checkSession()||(this._isPaused=!1,this.startRecording(),Ya("[Replay] Resuming replay",this._options._experiments.traceInternals))}async sendBufferedReplayOrFlush({continueRecording:e=!0}={}){if(this.recordingMode==="session")return this.flushImmediate();const n=Date.now();Ya("[Replay] Converting buffer to session",this._options._experiments.traceInternals),await this.flushImmediate();const r=this.stopRecording();!e||!r||this.recordingMode!=="session"&&(this.recordingMode="session",this.session&&(this._updateUserActivity(n),this._updateSessionActivity(n),this._maybeSaveSession()),this.startRecording())}addUpdate(e){const n=e();this.recordingMode!=="buffer"&&n!==!0&&this._debouncedFlush()}triggerUserActivity(){if(this._updateUserActivity(),!this._stopRecording){if(!this._checkSession())return;this.resume();return}this.checkAndHandleExpiredSession(),this._updateSessionActivity()}updateUserActivity(){this._updateUserActivity(),this._updateSessionActivity()}conditionalFlush(){return this.recordingMode==="buffer"?Promise.resolve():this.flushImmediate()}flush(){return this._debouncedFlush()}flushImmediate(){return this._debouncedFlush(),this._debouncedFlush.flush()}cancelFlush(){this._debouncedFlush.cancel()}getSessionId(){return this.session&&this.session.id}checkAndHandleExpiredSession(){if(this._lastActivity&&oL(this._lastActivity,this.timeouts.sessionIdlePause)&&this.session&&this.session.sampled==="session"){this.pause();return}return!!this._checkSession()}setInitialState(){const e=`${Hr.location.pathname}${Hr.location.hash}${Hr.location.search}`,n=`${Hr.location.origin}${e}`;this.performanceEntries=[],this.replayPerformanceEntries=[],this._clearContext(),this._context.initialUrl=n,this._context.initialTimestamp=Date.now(),this._context.urls.push(n)}throttledAddEvent(e,n){const r=this._throttledAddEvent(e,n);if(r===yle){const i=Cc({category:"replay.throttled"});this.addUpdate(()=>!JC(this,{type:GRe,timestamp:i.timestamp||0,data:{tag:"breadcrumb",payload:i,metric:!0}}))}return r}getCurrentRoute(){const e=this.lastTransaction||jo().getTransaction(),r=(e&&As(e).data||{})[Nu];if(!(!e||!r||!["route","custom"].includes(r)))return As(e).description}_initializeRecording(){this.setInitialState(),this._updateSessionActivity(),this.eventBuffer=wVe({useCompression:this._options.useCompression,workerUrl:this._options.workerUrl}),this._removeListeners(),this._addListeners(),this._isEnabled=!0,this._isPaused=!1,this.startRecording()}_handleException(e){Dr&&He.error("[Replay]",e),Dr&&this._options._experiments&&this._options._experiments.captureExceptions&&ay(e)}_initializeSessionForSampling(e){const n=this._options.errorSampleRate>0,r=$z({sessionIdleExpire:this.timeouts.sessionIdleExpire,maxReplayDuration:this._options.maxReplayDuration,traceInternals:this._options._experiments.traceInternals,previousSessionId:e},{stickySession:this._options.stickySession,sessionSampleRate:this._options.sessionSampleRate,allowBuffering:n});this.session=r}_checkSession(){if(!this.session)return!1;const e=this.session;return ale(e,{sessionIdleExpire:this.timeouts.sessionIdleExpire,maxReplayDuration:this._options.maxReplayDuration})?(this._refreshSession(e),!1):!0}async _refreshSession(e){this._isEnabled&&(await this.stop({reason:"refresh session"}),this.initializeSampling(e.id))}_addListeners(){try{Hr.document.addEventListener("visibilitychange",this._handleVisibilityChange),Hr.addEventListener("blur",this._handleWindowBlur),Hr.addEventListener("focus",this._handleWindowFocus),Hr.addEventListener("keydown",this._handleKeyboardEvent),this.clickDetector&&this.clickDetector.addListeners(),this._hasInitializedCoreListeners||(R9e(this),this._hasInitializedCoreListeners=!0)}catch(e){this._handleException(e)}this._performanceCleanupCallback=gVe(this)}_removeListeners(){try{Hr.document.removeEventListener("visibilitychange",this._handleVisibilityChange),Hr.removeEventListener("blur",this._handleWindowBlur),Hr.removeEventListener("focus",this._handleWindowFocus),Hr.removeEventListener("keydown",this._handleKeyboardEvent),this.clickDetector&&this.clickDetector.removeListeners(),this._performanceCleanupCallback&&this._performanceCleanupCallback()}catch(e){this._handleException(e)}}__init(){this._handleVisibilityChange=()=>{Hr.document.visibilityState==="visible"?this._doChangeToForegroundTasks():this._doChangeToBackgroundTasks()}}__init2(){this._handleWindowBlur=()=>{const e=Cc({category:"ui.blur"});this._doChangeToBackgroundTasks(e)}}__init3(){this._handleWindowFocus=()=>{const e=Cc({category:"ui.focus"});this._doChangeToForegroundTasks(e)}}__init4(){this._handleKeyboardEvent=e=>{lVe(this,e)}}_doChangeToBackgroundTasks(e){!this.session||sle(this.session,{maxReplayDuration:this._options.maxReplayDuration,sessionIdleExpire:this.timeouts.sessionIdleExpire})||(e&&this._createCustomBreadcrumb(e),this.conditionalFlush())}_doChangeToForegroundTasks(e){if(!this.session)return;if(!this.checkAndHandleExpiredSession()){Ya("[Replay] Document has become active, but session has expired");return}e&&this._createCustomBreadcrumb(e)}_updateUserActivity(e=Date.now()){this._lastActivity=e}_updateSessionActivity(e=Date.now()){this.session&&(this.session.lastActivity=e,this._maybeSaveSession())}_createCustomBreadcrumb(e){this.addUpdate(()=>{this.throttledAddEvent({type:xn.Custom,timestamp:e.timestamp||0,data:{tag:"breadcrumb",payload:e}})})}_addPerformanceEntries(){const e=dVe(this.performanceEntries).concat(this.replayPerformanceEntries);return this.performanceEntries=[],this.replayPerformanceEntries=[],Promise.all(yV(this,e))}_clearContext(){this._context.errorIds.clear(),this._context.traceIds.clear(),this._context.urls=[]}_updateInitialTimestampFromEventBuffer(){const{session:e,eventBuffer:n}=this;if(!e||!n||e.segmentId)return;const r=n.getEarliestTimestamp();r&&rthis._options.maxReplayDuration+3e4)throw new Error("Session is too long, not sending replay");const r=this._popEventContext(),i=this.session.segmentId++;this._maybeSaveSession();const s=await this.eventBuffer.finish();await ble({replayId:e,recordingData:s,segmentId:i,eventContext:r,session:this.session,options:this.getOptions(),timestamp:n})}catch(n){this._handleException(n),this.stop({reason:"sendReplay"});const r=Rr();r&&r.recordDroppedEvent("send_error","replay")}}__init5(){this._flush=async({force:e=!1}={})=>{if(!this._isEnabled&&!e)return;if(!this.checkAndHandleExpiredSession()){Dr&&He.error("[Replay] Attempting to finish replay event after session expired.");return}if(!this.session)return;const n=this.session.started,i=Date.now()-n;this._debouncedFlush.cancel();const s=ithis._options.maxReplayDuration+5e3;if(s||a){Ya(`[Replay] Session duration (${Math.floor(i/1e3)}s) is too ${s?"short":"long"}, not sending replay.`,this._options._experiments.traceInternals),s&&this._debouncedFlush();return}const o=this.eventBuffer;if(o&&this.session.segmentId===0&&!o.hasCheckout&&Ya("[Replay] Flushing initial segment without checkout.",this._options._experiments.traceInternals),!this._flushLock){this._flushLock=this._runFlush(),await this._flushLock,this._flushLock=void 0;return}try{await this._flushLock}catch(l){Dr&&He.error(l)}finally{this._debouncedFlush()}}}_maybeSaveSession(){this.session&&this._options.stickySession&&ZC(this.session)}__init6(){this._onMutationHandler=e=>{const n=e.length,r=this._options.mutationLimit,i=this._options.mutationBreadcrumbLimit,s=r&&n>r;if(n>i||s){const a=Cc({category:"replay.mutations",data:{count:n,limit:s}});this._createCustomBreadcrumb(a)}return s?(this.stop({reason:"mutationLimit",forceFlush:this.recordingMode==="session"}),!1):!0}}}function SS(t,e,n,r){const i=typeof r=="string"?r.split(","):[],s=[...t,...i,...e];return typeof n<"u"&&(typeof n=="string"&&s.push(`.${n}`),Qc(()=>{console.warn("[Replay] You are using a deprecated configuration item for privacy. Read the documentation on how to use the new privacy configuration.")})),s.join(",")}function D9e({mask:t,unmask:e,block:n,unblock:r,ignore:i,blockClass:s,blockSelector:a,maskTextClass:o,maskTextSelector:l,ignoreClass:u}){const c=['base[href="/"]'],d=SS(t,[".sentry-mask","[data-sentry-mask]"],o,l),f=SS(e,[".sentry-unmask","[data-sentry-unmask]"]),h={maskTextSelector:d,unmaskTextSelector:f,blockSelector:SS(n,[".sentry-block","[data-sentry-block]",...c],s,a),unblockSelector:SS(r,[".sentry-unblock","[data-sentry-unblock]"]),ignoreSelector:SS(i,[".sentry-ignore","[data-sentry-ignore]",'input[type="file"]'],u)};return s instanceof RegExp&&(h.blockClass=s),o instanceof RegExp&&(h.maskTextClass=o),h}function W9e({el:t,key:e,maskAttributes:n,maskAllText:r,privacyOptions:i,value:s}){return!r||i.unmaskTextSelector&&t.matches(i.unmaskTextSelector)?s:n.includes(e)||e==="value"&&t.tagName==="INPUT"&&["submit","button"].includes(t.getAttribute("type")||"")?s.replace(/[\S]/g,"*"):s}const Xj='img,image,svg,video,object,picture,embed,map,audio,link[rel="icon"],link[rel="apple-touch-icon"]',A9e=["content-length","content-type","accept"];let Cj=!1;class TV{static __initStatic(){this.id="Replay"}constructor({flushMinDelay:e=EPe,flushMaxDelay:n=MPe,minReplayDuration:r=OPe,maxReplayDuration:i=gj,stickySession:s=!0,useCompression:a=!0,workerUrl:o,_experiments:l={},sessionSampleRate:u,errorSampleRate:c,maskAllText:d=!0,maskAllInputs:f=!0,blockAllMedia:h=!0,mutationBreadcrumbLimit:p=750,mutationLimit:m=1e4,slowClickTimeout:v=7e3,slowClickIgnoreSelectors:g=[],networkDetailAllowUrls:b=[],networkDetailDenyUrls:y=[],networkCaptureBodies:x=!0,networkRequestHeaders:T=[],networkResponseHeaders:M=[],mask:E=[],maskAttributes:S=["title","placeholder"],unmask:P=[],block:R=[],unblock:V=[],ignore:z=[],maskFn:k,beforeAddRecordingEvent:N,beforeErrorSampling:q,blockClass:L,blockSelector:A,maskInputOptions:Z,maskTextClass:j,maskTextSelector:ne,ignoreClass:G}={}){this.name=TV.id;const B=D9e({mask:E,unmask:P,block:R,unblock:V,ignore:z,blockClass:L,blockSelector:A,maskTextClass:j,maskTextSelector:ne,ignoreClass:G});if(this._recordingOptions={maskAllInputs:f,maskAllText:d,maskInputOptions:{...Z||{},password:!0},maskTextFn:k,maskInputFn:k,maskAttributeFn:(ee,ce,fe)=>W9e({maskAttributes:S,maskAllText:d,privacyOptions:B,key:ee,value:ce,el:fe}),...B,slimDOMOptions:"all",inlineStylesheet:!0,inlineImages:!1,collectFonts:!0,errorHandler:ee=>{try{ee.__rrweb__=!0}catch{}}},this._initialOptions={flushMinDelay:e,flushMaxDelay:n,minReplayDuration:Math.min(r,IPe),maxReplayDuration:Math.min(i,gj),stickySession:s,sessionSampleRate:u,errorSampleRate:c,useCompression:a,workerUrl:o,blockAllMedia:h,maskAllInputs:f,maskAllText:d,mutationBreadcrumbLimit:p,mutationLimit:m,slowClickTimeout:v,slowClickIgnoreSelectors:g,networkDetailAllowUrls:b,networkDetailDenyUrls:y,networkCaptureBodies:x,networkRequestHeaders:Kj(T),networkResponseHeaders:Kj(M),beforeAddRecordingEvent:N,beforeErrorSampling:q,_experiments:l},typeof u=="number"&&(console.warn(`[Replay] You are passing \`sessionSampleRate\` to the Replay integration. +or you can use record.mirror to access the mirror instance during recording.`;let bj={map:{},getId(){return console.error(jg),-1},getNode(){return console.error(jg),null},removeNodeFromMap(){console.error(jg)},has(){return console.error(jg),!1},reset(){console.error(jg)}};typeof window<"u"&&window.Proxy&&window.Reflect&&(bj=new Proxy(bj,{get(t,e,n){return e==="map"&&console.error(jg),Reflect.get(t,e,n)}}));function _x(t,e,n={}){let r=null,i=0;return function(...s){const a=Date.now();!i&&n.leading===!1&&(i=a);const o=e-(a-i),l=this;o<=0||o>e?(r&&(gRe(r),r=null),i=a,t.apply(l,s)):!r&&n.trailing!==!1&&(r=bV(()=>{i=n.leading===!1?0:Date.now(),r=null,t.apply(l,s)},o))}}function Loe(t,e,n,r,i=window){const s=i.Object.getOwnPropertyDescriptor(t,e);return i.Object.defineProperty(t,e,r?n:{set(a){bV(()=>{n.set.call(this,a)},0),s&&s.set&&s.set.call(this,a)}}),()=>Loe(t,e,s||{},!0)}function AC(t,e,n){try{if(!(e in t))return()=>{};const r=t[e],i=n(r);return typeof i=="function"&&(i.prototype=i.prototype||{},Object.defineProperties(i,{__rrweb_original__:{enumerable:!1,value:r}})),t[e]=i,()=>{t[e]=r}}catch{return()=>{}}}let YM=Date.now;/[1-9][0-9]{12}/.test(Date.now().toString())||(YM=()=>new Date().getTime());function Xoe(t){const e=t.document;return{left:e.scrollingElement?e.scrollingElement.scrollLeft:t.pageXOffset!==void 0?t.pageXOffset:zh([e,"optionalAccess",n=>n.documentElement,"access",n=>n.scrollLeft])||zh([e,"optionalAccess",n=>n.body,"optionalAccess",n=>n.parentElement,"optionalAccess",n=>n.scrollLeft])||zh([e,"optionalAccess",n=>n.body,"optionalAccess",n=>n.scrollLeft])||0,top:e.scrollingElement?e.scrollingElement.scrollTop:t.pageYOffset!==void 0?t.pageYOffset:zh([e,"optionalAccess",n=>n.documentElement,"access",n=>n.scrollTop])||zh([e,"optionalAccess",n=>n.body,"optionalAccess",n=>n.parentElement,"optionalAccess",n=>n.scrollTop])||zh([e,"optionalAccess",n=>n.body,"optionalAccess",n=>n.scrollTop])||0}}function Coe(){return window.innerHeight||document.documentElement&&document.documentElement.clientHeight||document.body&&document.body.clientHeight}function Koe(){return window.innerWidth||document.documentElement&&document.documentElement.clientWidth||document.body&&document.body.clientWidth}function qoe(t){return t?t.nodeType===t.ELEMENT_NODE?t:t.parentElement:null}function wu(t,e,n,r,i){if(!t)return!1;const s=qoe(t);if(!s)return!1;const a=o1(e,n);if(!i){const u=r&&s.matches(r);return a(s)&&!u}const o=lv(s,a);let l=-1;return o<0?!1:(r&&(l=lv(s,o1(null,r))),o>-1&&l<0?!0:o{let n=e[0];if(!(0 in e))throw new TypeError("1 argument is required");do if(this===n)return!0;while(n=n&&n.parentNode);return!1})}function Woe(t,e){return!!(t.nodeName==="IFRAME"&&e.getMeta(t))}function Aoe(t,e){return!!(t.nodeName==="LINK"&&t.nodeType===t.ELEMENT_NODE&&t.getAttribute&&t.getAttribute("rel")==="stylesheet"&&e.getMeta(t))}function iL(t){return!!zh([t,"optionalAccess",e=>e.shadowRoot])}class hRe{constructor(){this.id=1,this.styleIDMap=new WeakMap,this.idStyleMap=new Map}getId(e){return k5e(this.styleIDMap.get(e),()=>-1)}has(e){return this.styleIDMap.has(e)}add(e,n){if(this.has(e))return this.getId(e);let r;return n===void 0?r=this.id++:r=n,this.styleIDMap.set(e,r),this.idStyleMap.set(r,e),r}getStyle(e){return this.idStyleMap.get(e)||null}reset(){this.styleIDMap=new WeakMap,this.idStyleMap=new Map,this.id=1}generateId(){return this.id++}}function Goe(t){let e=null;return zh([t,"access",n=>n.getRootNode,"optionalCall",n=>n(),"optionalAccess",n=>n.nodeType])===Node.DOCUMENT_FRAGMENT_NODE&&t.getRootNode().host&&(e=t.getRootNode().host),e}function pRe(t){let e=t,n;for(;n=Goe(e);)e=n;return e}function mRe(t){const e=t.ownerDocument;if(!e)return!1;const n=pRe(t);return e.contains(n)}function Foe(t){const e=t.ownerDocument;return e?e.contains(t)||mRe(t):!1}const yj={};function GC(t){const e=yj[t];if(e)return e;const n=window.document;let r=window[t];if(n&&typeof n.createElement=="function")try{const i=n.createElement("iframe");i.hidden=!0,n.head.appendChild(i);const s=i.contentWindow;s&&s[t]&&(r=s[t]),n.head.removeChild(i)}catch{}return yj[t]=r.bind(window)}function vRe(...t){return GC("requestAnimationFrame")(...t)}function bV(...t){return GC("setTimeout")(...t)}function gRe(...t){return GC("clearTimeout")(...t)}var xn=(t=>(t[t.DomContentLoaded=0]="DomContentLoaded",t[t.Load=1]="Load",t[t.FullSnapshot=2]="FullSnapshot",t[t.IncrementalSnapshot=3]="IncrementalSnapshot",t[t.Meta=4]="Meta",t[t.Custom=5]="Custom",t[t.Plugin=6]="Plugin",t))(xn||{}),Tn=(t=>(t[t.Mutation=0]="Mutation",t[t.MouseMove=1]="MouseMove",t[t.MouseInteraction=2]="MouseInteraction",t[t.Scroll=3]="Scroll",t[t.ViewportResize=4]="ViewportResize",t[t.Input=5]="Input",t[t.TouchMove=6]="TouchMove",t[t.MediaInteraction=7]="MediaInteraction",t[t.StyleSheetRule=8]="StyleSheetRule",t[t.CanvasMutation=9]="CanvasMutation",t[t.Font=10]="Font",t[t.Log=11]="Log",t[t.Drag=12]="Drag",t[t.StyleDeclaration=13]="StyleDeclaration",t[t.Selection=14]="Selection",t[t.AdoptedStyleSheet=15]="AdoptedStyleSheet",t[t.CustomElement=16]="CustomElement",t))(Tn||{}),Fa=(t=>(t[t.MouseUp=0]="MouseUp",t[t.MouseDown=1]="MouseDown",t[t.Click=2]="Click",t[t.ContextMenu=3]="ContextMenu",t[t.DblClick=4]="DblClick",t[t.Focus=5]="Focus",t[t.Blur=6]="Blur",t[t.TouchStart=7]="TouchStart",t[t.TouchMove_Departed=8]="TouchMove_Departed",t[t.TouchEnd=9]="TouchEnd",t[t.TouchCancel=10]="TouchCancel",t))(Fa||{}),Ud=(t=>(t[t.Mouse=0]="Mouse",t[t.Pen=1]="Pen",t[t.Touch=2]="Touch",t))(Ud||{});function bRe(t){let e,n=t[0],r=1;for(;rn.call(e,...a)),e=void 0)}return n}function Sj(t){return"__ln"in t}class yRe{constructor(){this.length=0,this.head=null,this.tail=null}get(e){if(e>=this.length)throw new Error("Position outside of list range");let n=this.head;for(let r=0;ri.next])||null;return n}addNode(e){const n={value:e,previous:null,next:null};if(e.__ln=n,e.previousSibling&&Sj(e.previousSibling)){const r=e.previousSibling.__ln.next;n.next=r,n.previous=e.previousSibling.__ln,e.previousSibling.__ln.next=n,r&&(r.previous=n)}else if(e.nextSibling&&Sj(e.nextSibling)&&e.nextSibling.__ln.previous){const r=e.nextSibling.__ln.previous;n.previous=r,n.next=e.nextSibling.__ln,e.nextSibling.__ln.previous=n,r&&(r.next=n)}else this.head&&(this.head.previous=n),n.next=this.head,this.head=n;n.next===null&&(this.tail=n),this.length++}removeNode(e){const n=e.__ln;this.head&&(n.previous?(n.previous.next=n.next,n.next?n.next.previous=n.previous:this.tail=n.previous):(this.head=n.next,this.head?this.head.previous=null:this.tail=null),e.__ln&&delete e.__ln,this.length--)}}const xj=(t,e)=>`${t}@${e}`;class SRe{constructor(){this.frozen=!1,this.locked=!1,this.texts=[],this.attributes=[],this.attributeMap=new WeakMap,this.removes=[],this.mapRemoves=[],this.movedMap={},this.addedSet=new Set,this.movedSet=new Set,this.droppedSet=new Set,this.processMutations=e=>{e.forEach(this.processMutation),this.emit()},this.emit=()=>{if(this.frozen||this.locked)return;const e=[],n=new Set,r=new yRe,i=l=>{let u=l,c=Qx;for(;c===Qx;)u=u&&u.nextSibling,c=u&&this.mirror.getId(u);return c},s=l=>{if(!l.parentNode||!Foe(l))return;const u=_3(l.parentNode)?this.mirror.getId(Goe(l)):this.mirror.getId(l.parentNode),c=i(l);if(u===-1||c===-1)return r.addNode(l);const d=l1(l,{doc:this.doc,mirror:this.mirror,blockClass:this.blockClass,blockSelector:this.blockSelector,maskAllText:this.maskAllText,unblockSelector:this.unblockSelector,maskTextClass:this.maskTextClass,unmaskTextClass:this.unmaskTextClass,maskTextSelector:this.maskTextSelector,unmaskTextSelector:this.unmaskTextSelector,skipChild:!0,newlyAddedElement:!0,inlineStylesheet:this.inlineStylesheet,maskInputOptions:this.maskInputOptions,maskAttributeFn:this.maskAttributeFn,maskTextFn:this.maskTextFn,maskInputFn:this.maskInputFn,slimDOMOptions:this.slimDOMOptions,dataURLOptions:this.dataURLOptions,recordCanvas:this.recordCanvas,inlineImages:this.inlineImages,onSerialize:f=>{Woe(f,this.mirror)&&this.iframeManager.addIframe(f),Aoe(f,this.mirror)&&this.stylesheetManager.trackLinkElement(f),iL(l)&&this.shadowDomManager.addShadowRoot(l.shadowRoot,this.doc)},onIframeLoad:(f,h)=>{this.iframeManager.attachIframe(f,h),this.shadowDomManager.observeAttachShadow(f)},onStylesheetLoad:(f,h)=>{this.stylesheetManager.attachLinkElement(f,h)}});d&&(e.push({parentId:u,nextId:c,node:d}),n.add(d.id))};for(;this.mapRemoves.length;)this.mirror.removeNodeFromMap(this.mapRemoves.shift());for(const l of this.movedSet)Tj(this.removes,l,this.mirror)&&!this.movedSet.has(l.parentNode)||s(l);for(const l of this.addedSet)!wj(this.droppedSet,l)&&!Tj(this.removes,l,this.mirror)||wj(this.movedSet,l)?s(l):this.droppedSet.add(l);let a=null;for(;r.length;){let l=null;if(a){const u=this.mirror.getId(a.value.parentNode),c=i(a.value);u!==-1&&c!==-1&&(l=a)}if(!l){let u=r.tail;for(;u;){const c=u;if(u=u.previous,c){const d=this.mirror.getId(c.value.parentNode);if(i(c.value)===-1)continue;if(d!==-1){l=c;break}else{const h=c.value;if(h.parentNode&&h.parentNode.nodeType===Node.DOCUMENT_FRAGMENT_NODE){const p=h.parentNode.host;if(this.mirror.getId(p)!==-1){l=c;break}}}}}}if(!l){for(;r.head;)r.removeNode(r.head.value);break}a=l.previous,r.removeNode(l.value),s(l.value)}const o={texts:this.texts.map(l=>({id:this.mirror.getId(l.node),value:l.value})).filter(l=>!n.has(l.id)).filter(l=>this.mirror.has(l.id)),attributes:this.attributes.map(l=>{const{attributes:u}=l;if(typeof u.style=="string"){const c=JSON.stringify(l.styleDiff),d=JSON.stringify(l._unchangedStyles);c.length!n.has(l.id)).filter(l=>this.mirror.has(l.id)),removes:this.removes,adds:e};!o.texts.length&&!o.attributes.length&&!o.removes.length&&!o.adds.length||(this.texts=[],this.attributes=[],this.attributeMap=new WeakMap,this.removes=[],this.addedSet=new Set,this.movedSet=new Set,this.droppedSet=new Set,this.movedMap={},this.mutationCb(o))},this.processMutation=e=>{if(!Qz(e.target,this.mirror))switch(e.type){case"characterData":{const n=e.target.textContent;!wu(e.target,this.blockClass,this.blockSelector,this.unblockSelector,!1)&&n!==e.oldValue&&this.texts.push({value:db(e.target,this.maskTextClass,this.maskTextSelector,this.unmaskTextClass,this.unmaskTextSelector,this.maskAllText)&&n?this.maskTextFn?this.maskTextFn(n,qoe(e.target)):n.replace(/[\S]/g,"*"):n,node:e.target});break}case"attributes":{const n=e.target;let r=e.attributeName,i=e.target.getAttribute(r);if(r==="value"){const a=qC(n),o=n.tagName;i=ZM(n,o,a);const l=gV({maskInputOptions:this.maskInputOptions,tagName:o,type:a}),u=db(e.target,this.maskTextClass,this.maskTextSelector,this.unmaskTextClass,this.unmaskTextSelector,l);i=Hx({isMasked:u,element:n,value:i,maskInputFn:this.maskInputFn})}if(wu(e.target,this.blockClass,this.blockSelector,this.unblockSelector,!1)||i===e.oldValue)return;let s=this.attributeMap.get(e.target);if(n.tagName==="IFRAME"&&r==="src"&&!this.keepIframeSrcFn(i))if(!n.contentDocument)r="rr_src";else return;if(s||(s={node:e.target,attributes:{},styleDiff:{},_unchangedStyles:{}},this.attributes.push(s),this.attributeMap.set(e.target,s)),r==="type"&&n.tagName==="INPUT"&&(e.oldValue||"").toLowerCase()==="password"&&n.setAttribute("data-rr-is-password","true"),!Noe(n.tagName,r)&&(s.attributes[r]=Uoe(this.doc,cb(n.tagName),cb(r),i,n,this.maskAttributeFn),r==="style")){if(!this.unattachedDoc)try{this.unattachedDoc=document.implementation.createHTMLDocument()}catch{this.unattachedDoc=this.doc}const a=this.unattachedDoc.createElement("span");e.oldValue&&a.setAttribute("style",e.oldValue);for(const o of Array.from(n.style)){const l=n.style.getPropertyValue(o),u=n.style.getPropertyPriority(o);l!==a.style.getPropertyValue(o)||u!==a.style.getPropertyPriority(o)?u===""?s.styleDiff[o]=l:s.styleDiff[o]=[l,u]:s._unchangedStyles[o]=[l,u]}for(const o of Array.from(a.style))n.style.getPropertyValue(o)===""&&(s.styleDiff[o]=!1)}break}case"childList":{if(wu(e.target,this.blockClass,this.blockSelector,this.unblockSelector,!0))return;e.addedNodes.forEach(n=>this.genAdds(n,e.target)),e.removedNodes.forEach(n=>{const r=this.mirror.getId(n),i=_3(e.target)?this.mirror.getId(e.target.host):this.mirror.getId(e.target);wu(e.target,this.blockClass,this.blockSelector,this.unblockSelector,!1)||Qz(n,this.mirror)||!dRe(n,this.mirror)||(this.addedSet.has(n)?(sL(this.addedSet,n),this.droppedSet.add(n)):this.addedSet.has(e.target)&&r===-1||Doe(e.target,this.mirror)||(this.movedSet.has(n)&&this.movedMap[xj(r,i)]?sL(this.movedSet,n):this.removes.push({parentId:i,id:r,isShadow:_3(e.target)&&$3(e.target)?!0:void 0})),this.mapRemoves.push(n))});break}}},this.genAdds=(e,n)=>{if(!this.processedNodeManager.inOtherBuffer(e,this)&&!(this.addedSet.has(e)||this.movedSet.has(e))){if(this.mirror.hasNode(e)){if(Qz(e,this.mirror))return;this.movedSet.add(e);let r=null;n&&this.mirror.hasNode(n)&&(r=this.mirror.getId(n)),r&&r!==-1&&(this.movedMap[xj(this.mirror.getId(e),r)]=!0)}else this.addedSet.add(e),this.droppedSet.delete(e);wu(e,this.blockClass,this.blockSelector,this.unblockSelector,!1)||(e.childNodes.forEach(r=>this.genAdds(r)),iL(e)&&e.shadowRoot.childNodes.forEach(r=>{this.processedNodeManager.add(r,this),this.genAdds(r,e)}))}}}init(e){["mutationCb","blockClass","blockSelector","unblockSelector","maskAllText","maskTextClass","unmaskTextClass","maskTextSelector","unmaskTextSelector","inlineStylesheet","maskInputOptions","maskAttributeFn","maskTextFn","maskInputFn","keepIframeSrcFn","recordCanvas","inlineImages","slimDOMOptions","dataURLOptions","doc","mirror","iframeManager","stylesheetManager","shadowDomManager","canvasManager","processedNodeManager"].forEach(n=>{this[n]=e[n]})}freeze(){this.frozen=!0,this.canvasManager.freeze()}unfreeze(){this.frozen=!1,this.canvasManager.unfreeze(),this.emit()}isFrozen(){return this.frozen}lock(){this.locked=!0,this.canvasManager.lock()}unlock(){this.locked=!1,this.canvasManager.unlock(),this.emit()}reset(){this.shadowDomManager.reset(),this.canvasManager.reset()}}function sL(t,e){t.delete(e),e.childNodes.forEach(n=>sL(t,n))}function Tj(t,e,n){return t.length===0?!1:joe(t,e,n)}function joe(t,e,n){const{parentNode:r}=e;if(!r)return!1;const i=n.getId(r);return t.some(s=>s.id===i)?!0:joe(t,r,n)}function wj(t,e){return t.size===0?!1:Zoe(t,e)}function Zoe(t,e){const{parentNode:n}=e;return n?t.has(n)?!0:Zoe(t,n):!1}let ex;function xRe(t){ex=t}function TRe(){ex=void 0}const jn=t=>ex?(...n)=>{try{return t(...n)}catch(r){if(ex&&ex(r)===!0)return()=>{};throw r}}:t;function Vc(t){let e,n=t[0],r=1;for(;rn.call(e,...a)),e=void 0)}return n}const u1=[];function dT(t){try{if("composedPath"in t){const e=t.composedPath();if(e.length)return e[0]}else if("path"in t&&t.path.length)return t.path[0]}catch{}return t&&t.target}function Joe(t,e){const n=new SRe;u1.push(n),n.init(t);let r=window.MutationObserver||window.__rrMutationObserver;const i=Vc([window,"optionalAccess",a=>a.Zone,"optionalAccess",a=>a.__symbol__,"optionalCall",a=>a("MutationObserver")]);i&&window[i]&&(r=window[i]);const s=new r(jn(a=>{t.onMutation&&t.onMutation(a)===!1||n.processMutations.bind(n)(a)}));return s.observe(e,{attributes:!0,attributeOldValue:!0,characterData:!0,characterDataOldValue:!0,childList:!0,subtree:!0}),s}function wRe({mousemoveCb:t,sampling:e,doc:n,mirror:r}){if(e.mousemove===!1)return()=>{};const i=typeof e.mousemove=="number"?e.mousemove:50,s=typeof e.mousemoveCallback=="number"?e.mousemoveCallback:500;let a=[],o;const l=_x(jn(d=>{const f=Date.now()-o;t(a.map(h=>(h.timeOffset-=f,h)),d),a=[],o=null}),s),u=jn(_x(jn(d=>{const f=dT(d),{clientX:h,clientY:p}=rL(d)?d.changedTouches[0]:d;o||(o=YM()),a.push({x:h,y:p,id:r.getId(f),timeOffset:YM()-o}),l(typeof DragEvent<"u"&&d instanceof DragEvent?Tn.Drag:d instanceof MouseEvent?Tn.MouseMove:Tn.TouchMove)}),i,{trailing:!1})),c=[Qa("mousemove",u,n),Qa("touchmove",u,n),Qa("drag",u,n)];return jn(()=>{c.forEach(d=>d())})}function ERe({mouseInteractionCb:t,doc:e,mirror:n,blockClass:r,blockSelector:i,unblockSelector:s,sampling:a}){if(a.mouseInteraction===!1)return()=>{};const o=a.mouseInteraction===!0||a.mouseInteraction===void 0?{}:a.mouseInteraction,l=[];let u=null;const c=d=>f=>{const h=dT(f);if(wu(h,r,i,s,!0))return;let p=null,m=d;if("pointerType"in f){switch(f.pointerType){case"mouse":p=Ud.Mouse;break;case"touch":p=Ud.Touch;break;case"pen":p=Ud.Pen;break}p===Ud.Touch?Fa[d]===Fa.MouseDown?m="TouchStart":Fa[d]===Fa.MouseUp&&(m="TouchEnd"):Ud.Pen}else rL(f)&&(p=Ud.Touch);p!==null?(u=p,(m.startsWith("Touch")&&p===Ud.Touch||m.startsWith("Mouse")&&p===Ud.Mouse)&&(p=null)):Fa[d]===Fa.Click&&(p=u,u=null);const v=rL(f)?f.changedTouches[0]:f;if(!v)return;const g=n.getId(h),{clientX:b,clientY:y}=v;jn(t)({type:Fa[m],id:g,x:b,y,...p!==null&&{pointerType:p}})};return Object.keys(Fa).filter(d=>Number.isNaN(Number(d))&&!d.endsWith("_Departed")&&o[d]!==!1).forEach(d=>{let f=cb(d);const h=c(d);if(window.PointerEvent)switch(Fa[d]){case Fa.MouseDown:case Fa.MouseUp:f=f.replace("mouse","pointer");break;case Fa.TouchStart:case Fa.TouchEnd:return}l.push(Qa(f,h,e))}),jn(()=>{l.forEach(d=>d())})}function Yoe({scrollCb:t,doc:e,mirror:n,blockClass:r,blockSelector:i,unblockSelector:s,sampling:a}){const o=jn(_x(jn(l=>{const u=dT(l);if(!u||wu(u,r,i,s,!0))return;const c=n.getId(u);if(u===e&&e.defaultView){const d=Xoe(e.defaultView);t({id:c,x:d.left,y:d.top})}else t({id:c,x:u.scrollLeft,y:u.scrollTop})}),a.scroll||100));return Qa("scroll",o,e)}function MRe({viewportResizeCb:t},{win:e}){let n=-1,r=-1;const i=jn(_x(jn(()=>{const s=Coe(),a=Koe();(n!==s||r!==a)&&(t({width:Number(a),height:Number(s)}),n=s,r=a)}),200));return Qa("resize",i,e)}const PRe=["INPUT","TEXTAREA","SELECT"],Ej=new WeakMap;function RRe({inputCb:t,doc:e,mirror:n,blockClass:r,blockSelector:i,unblockSelector:s,ignoreClass:a,ignoreSelector:o,maskInputOptions:l,maskInputFn:u,sampling:c,userTriggeredOnInput:d,maskTextClass:f,unmaskTextClass:h,maskTextSelector:p,unmaskTextSelector:m}){function v(E){let S=dT(E);const P=E.isTrusted,R=S&&nL(S.tagName);if(R==="OPTION"&&(S=S.parentElement),!S||!R||PRe.indexOf(R)<0||wu(S,r,i,s,!0))return;const V=S;if(V.classList.contains(a)||o&&V.matches(o))return;const z=qC(S);let k=ZM(V,R,z),N=!1;const q=gV({maskInputOptions:l,tagName:R,type:z}),L=db(S,f,p,h,m,q);(z==="radio"||z==="checkbox")&&(N=S.checked),k=Hx({isMasked:L,element:S,value:k,maskInputFn:u}),g(S,d?{text:k,isChecked:N,userTriggered:P}:{text:k,isChecked:N});const A=S.name;z==="radio"&&A&&N&&e.querySelectorAll(`input[type="radio"][name="${A}"]`).forEach(J=>{if(J!==S){const F=Hx({isMasked:L,element:J,value:ZM(J,R,z),maskInputFn:u});g(J,d?{text:F,isChecked:!N,userTriggered:!1}:{text:F,isChecked:!N})}})}function g(E,S){const P=Ej.get(E);if(!P||P.text!==S.text||P.isChecked!==S.isChecked){Ej.set(E,S);const R=n.getId(E);jn(t)({...S,id:R})}}const y=(c.input==="last"?["change"]:["input","change"]).map(E=>Qa(E,jn(v),e)),x=e.defaultView;if(!x)return()=>{y.forEach(E=>E())};const T=x.Object.getOwnPropertyDescriptor(x.HTMLInputElement.prototype,"value"),M=[[x.HTMLInputElement.prototype,"value"],[x.HTMLInputElement.prototype,"checked"],[x.HTMLSelectElement.prototype,"value"],[x.HTMLTextAreaElement.prototype,"value"],[x.HTMLSelectElement.prototype,"selectedIndex"],[x.HTMLOptionElement.prototype,"selected"]];return T&&T.set&&y.push(...M.map(E=>Loe(E[0],E[1],{set(){jn(v)({target:this,isTrusted:!1})}},!1,x))),jn(()=>{y.forEach(E=>E())})}function BM(t){const e=[];function n(r,i){if(l2("CSSGroupingRule")&&r.parentRule instanceof CSSGroupingRule||l2("CSSMediaRule")&&r.parentRule instanceof CSSMediaRule||l2("CSSSupportsRule")&&r.parentRule instanceof CSSSupportsRule||l2("CSSConditionRule")&&r.parentRule instanceof CSSConditionRule){const a=Array.from(r.parentRule.cssRules).indexOf(r);i.unshift(a)}else if(r.parentStyleSheet){const a=Array.from(r.parentStyleSheet.cssRules).indexOf(r);i.unshift(a)}return i}return n(t,e)}function kh(t,e,n){let r,i;return t?(t.ownerNode?r=e.getId(t.ownerNode):i=n.getId(t),{styleId:i,id:r}):{}}function VRe({styleSheetRuleCb:t,mirror:e,stylesheetManager:n},{win:r}){if(!r.CSSStyleSheet||!r.CSSStyleSheet.prototype)return()=>{};const i=r.CSSStyleSheet.prototype.insertRule;r.CSSStyleSheet.prototype.insertRule=new Proxy(i,{apply:jn((c,d,f)=>{const[h,p]=f,{id:m,styleId:v}=kh(d,e,n.styleMirror);return(m&&m!==-1||v&&v!==-1)&&t({id:m,styleId:v,adds:[{rule:h,index:p}]}),c.apply(d,f)})});const s=r.CSSStyleSheet.prototype.deleteRule;r.CSSStyleSheet.prototype.deleteRule=new Proxy(s,{apply:jn((c,d,f)=>{const[h]=f,{id:p,styleId:m}=kh(d,e,n.styleMirror);return(p&&p!==-1||m&&m!==-1)&&t({id:p,styleId:m,removes:[{index:h}]}),c.apply(d,f)})});let a;r.CSSStyleSheet.prototype.replace&&(a=r.CSSStyleSheet.prototype.replace,r.CSSStyleSheet.prototype.replace=new Proxy(a,{apply:jn((c,d,f)=>{const[h]=f,{id:p,styleId:m}=kh(d,e,n.styleMirror);return(p&&p!==-1||m&&m!==-1)&&t({id:p,styleId:m,replace:h}),c.apply(d,f)})}));let o;r.CSSStyleSheet.prototype.replaceSync&&(o=r.CSSStyleSheet.prototype.replaceSync,r.CSSStyleSheet.prototype.replaceSync=new Proxy(o,{apply:jn((c,d,f)=>{const[h]=f,{id:p,styleId:m}=kh(d,e,n.styleMirror);return(p&&p!==-1||m&&m!==-1)&&t({id:p,styleId:m,replaceSync:h}),c.apply(d,f)})}));const l={};u2("CSSGroupingRule")?l.CSSGroupingRule=r.CSSGroupingRule:(u2("CSSMediaRule")&&(l.CSSMediaRule=r.CSSMediaRule),u2("CSSConditionRule")&&(l.CSSConditionRule=r.CSSConditionRule),u2("CSSSupportsRule")&&(l.CSSSupportsRule=r.CSSSupportsRule));const u={};return Object.entries(l).forEach(([c,d])=>{u[c]={insertRule:d.prototype.insertRule,deleteRule:d.prototype.deleteRule},d.prototype.insertRule=new Proxy(u[c].insertRule,{apply:jn((f,h,p)=>{const[m,v]=p,{id:g,styleId:b}=kh(h.parentStyleSheet,e,n.styleMirror);return(g&&g!==-1||b&&b!==-1)&&t({id:g,styleId:b,adds:[{rule:m,index:[...BM(h),v||0]}]}),f.apply(h,p)})}),d.prototype.deleteRule=new Proxy(u[c].deleteRule,{apply:jn((f,h,p)=>{const[m]=p,{id:v,styleId:g}=kh(h.parentStyleSheet,e,n.styleMirror);return(v&&v!==-1||g&&g!==-1)&&t({id:v,styleId:g,removes:[{index:[...BM(h),m]}]}),f.apply(h,p)})})}),jn(()=>{r.CSSStyleSheet.prototype.insertRule=i,r.CSSStyleSheet.prototype.deleteRule=s,a&&(r.CSSStyleSheet.prototype.replace=a),o&&(r.CSSStyleSheet.prototype.replaceSync=o),Object.entries(l).forEach(([c,d])=>{d.prototype.insertRule=u[c].insertRule,d.prototype.deleteRule=u[c].deleteRule})})}function Boe({mirror:t,stylesheetManager:e},n){let r=null;n.nodeName==="#document"?r=t.getId(n):r=t.getId(n.host);const i=n.nodeName==="#document"?Vc([n,"access",a=>a.defaultView,"optionalAccess",a=>a.Document]):Vc([n,"access",a=>a.ownerDocument,"optionalAccess",a=>a.defaultView,"optionalAccess",a=>a.ShadowRoot]),s=Vc([i,"optionalAccess",a=>a.prototype])?Object.getOwnPropertyDescriptor(Vc([i,"optionalAccess",a=>a.prototype]),"adoptedStyleSheets"):void 0;return r===null||r===-1||!i||!s?()=>{}:(Object.defineProperty(n,"adoptedStyleSheets",{configurable:s.configurable,enumerable:s.enumerable,get(){return Vc([s,"access",a=>a.get,"optionalAccess",a=>a.call,"call",a=>a(this)])},set(a){const o=Vc([s,"access",l=>l.set,"optionalAccess",l=>l.call,"call",l=>l(this,a)]);if(r!==null&&r!==-1)try{e.adoptStyleSheets(a,r)}catch{}return o}}),jn(()=>{Object.defineProperty(n,"adoptedStyleSheets",{configurable:s.configurable,enumerable:s.enumerable,get:s.get,set:s.set})}))}function zRe({styleDeclarationCb:t,mirror:e,ignoreCSSAttributes:n,stylesheetManager:r},{win:i}){const s=i.CSSStyleDeclaration.prototype.setProperty;i.CSSStyleDeclaration.prototype.setProperty=new Proxy(s,{apply:jn((o,l,u)=>{const[c,d,f]=u;if(n.has(c))return s.apply(l,[c,d,f]);const{id:h,styleId:p}=kh(Vc([l,"access",m=>m.parentRule,"optionalAccess",m=>m.parentStyleSheet]),e,r.styleMirror);return(h&&h!==-1||p&&p!==-1)&&t({id:h,styleId:p,set:{property:c,value:d,priority:f},index:BM(l.parentRule)}),o.apply(l,u)})});const a=i.CSSStyleDeclaration.prototype.removeProperty;return i.CSSStyleDeclaration.prototype.removeProperty=new Proxy(a,{apply:jn((o,l,u)=>{const[c]=u;if(n.has(c))return a.apply(l,[c]);const{id:d,styleId:f}=kh(Vc([l,"access",h=>h.parentRule,"optionalAccess",h=>h.parentStyleSheet]),e,r.styleMirror);return(d&&d!==-1||f&&f!==-1)&&t({id:d,styleId:f,remove:{property:c},index:BM(l.parentRule)}),o.apply(l,u)})}),jn(()=>{i.CSSStyleDeclaration.prototype.setProperty=s,i.CSSStyleDeclaration.prototype.removeProperty=a})}function kRe({mediaInteractionCb:t,blockClass:e,blockSelector:n,unblockSelector:r,mirror:i,sampling:s,doc:a}){const o=jn(u=>_x(jn(c=>{const d=dT(c);if(!d||wu(d,e,n,r,!0))return;const{currentTime:f,volume:h,muted:p,playbackRate:m}=d;t({type:u,id:i.getId(d),currentTime:f,volume:h,muted:p,playbackRate:m})}),s.media||500)),l=[Qa("play",o(0),a),Qa("pause",o(1),a),Qa("seeked",o(2),a),Qa("volumechange",o(3),a),Qa("ratechange",o(4),a)];return jn(()=>{l.forEach(u=>u())})}function ORe({fontCb:t,doc:e}){const n=e.defaultView;if(!n)return()=>{};const r=[],i=new WeakMap,s=n.FontFace;n.FontFace=function(l,u,c){const d=new s(l,u,c);return i.set(d,{family:l,buffer:typeof u!="string",descriptors:c,fontSource:typeof u=="string"?u:JSON.stringify(Array.from(new Uint8Array(u)))}),d};const a=AC(e.fonts,"add",function(o){return function(l){return bV(jn(()=>{const u=i.get(l);u&&(t(u),i.delete(l))}),0),o.apply(this,[l])}});return r.push(()=>{n.FontFace=s}),r.push(a),jn(()=>{r.forEach(o=>o())})}function IRe(t){const{doc:e,mirror:n,blockClass:r,blockSelector:i,unblockSelector:s,selectionCb:a}=t;let o=!0;const l=jn(()=>{const u=e.getSelection();if(!u||o&&Vc([u,"optionalAccess",f=>f.isCollapsed]))return;o=u.isCollapsed||!1;const c=[],d=u.rangeCount||0;for(let f=0;f{}:AC(n.customElements,"define",function(i){return function(s,a,o){try{e({define:{name:s}})}catch{}return i.apply(this,[s,a,o])}})}function NRe(t,e={}){const n=t.doc.defaultView;if(!n)return()=>{};const r=Joe(t,t.doc),i=wRe(t),s=ERe(t),a=Yoe(t),o=MRe(t,{win:n}),l=RRe(t),u=kRe(t),c=VRe(t,{win:n}),d=Boe(t,t.doc),f=zRe(t,{win:n}),h=t.collectFonts?ORe(t):()=>{},p=IRe(t),m=URe(t),v=[];for(const g of t.plugins)v.push(g.observer(g.callback,n,g.options));return jn(()=>{u1.forEach(g=>g.reset()),r.disconnect(),i(),s(),a(),o(),l(),u(),c(),d(),f(),h(),p(),m(),v.forEach(g=>g())})}function l2(t){return typeof window[t]<"u"}function u2(t){return!!(typeof window[t]<"u"&&window[t].prototype&&"insertRule"in window[t].prototype&&"deleteRule"in window[t].prototype)}class aL{constructor(e){this.generateIdFn=e,this.iframeIdToRemoteIdMap=new WeakMap,this.iframeRemoteIdToIdMap=new WeakMap}getId(e,n,r,i){const s=r||this.getIdToRemoteIdMap(e),a=i||this.getRemoteIdToIdMap(e);let o=s.get(n);return o||(o=this.generateIdFn(),s.set(n,o),a.set(o,n)),o}getIds(e,n){const r=this.getIdToRemoteIdMap(e),i=this.getRemoteIdToIdMap(e);return n.map(s=>this.getId(e,s,r,i))}getRemoteId(e,n,r){const i=r||this.getRemoteIdToIdMap(e);if(typeof n!="number")return n;const s=i.get(n);return s||-1}getRemoteIds(e,n){const r=this.getRemoteIdToIdMap(e);return n.map(i=>this.getRemoteId(e,i,r))}reset(e){if(!e){this.iframeIdToRemoteIdMap=new WeakMap,this.iframeRemoteIdToIdMap=new WeakMap;return}this.iframeIdToRemoteIdMap.delete(e),this.iframeRemoteIdToIdMap.delete(e)}getIdToRemoteIdMap(e){let n=this.iframeIdToRemoteIdMap.get(e);return n||(n=new Map,this.iframeIdToRemoteIdMap.set(e,n)),n}getRemoteIdToIdMap(e){let n=this.iframeRemoteIdToIdMap.get(e);return n||(n=new Map,this.iframeRemoteIdToIdMap.set(e,n)),n}}function Mj(t){let e,n=t[0],r=1;for(;rn.call(e,...a)),e=void 0)}return n}class LRe{constructor(){this.crossOriginIframeMirror=new aL(DC),this.crossOriginIframeRootIdMap=new WeakMap}addIframe(){}addLoadListener(){}attachIframe(){}}class XRe{constructor(e){this.iframes=new WeakMap,this.crossOriginIframeMap=new WeakMap,this.crossOriginIframeMirror=new aL(DC),this.crossOriginIframeRootIdMap=new WeakMap,this.mutationCb=e.mutationCb,this.wrappedEmit=e.wrappedEmit,this.stylesheetManager=e.stylesheetManager,this.recordCrossOriginIframes=e.recordCrossOriginIframes,this.crossOriginIframeStyleMirror=new aL(this.stylesheetManager.styleMirror.generateId.bind(this.stylesheetManager.styleMirror)),this.mirror=e.mirror,this.recordCrossOriginIframes&&window.addEventListener("message",this.handleMessage.bind(this))}addIframe(e){this.iframes.set(e,!0),e.contentWindow&&this.crossOriginIframeMap.set(e.contentWindow,e)}addLoadListener(e){this.loadListener=e}attachIframe(e,n){this.mutationCb({adds:[{parentId:this.mirror.getId(e),nextId:null,node:n}],removes:[],texts:[],attributes:[],isAttachIframe:!0}),Mj([this,"access",r=>r.loadListener,"optionalCall",r=>r(e)]),e.contentDocument&&e.contentDocument.adoptedStyleSheets&&e.contentDocument.adoptedStyleSheets.length>0&&this.stylesheetManager.adoptStyleSheets(e.contentDocument.adoptedStyleSheets,this.mirror.getId(e.contentDocument))}handleMessage(e){const n=e;if(n.data.type!=="rrweb"||n.origin!==n.data.origin||!e.source)return;const i=this.crossOriginIframeMap.get(e.source);if(!i)return;const s=this.transformCrossOriginEvent(i,n.data.event);s&&this.wrappedEmit(s,n.data.isCheckout)}transformCrossOriginEvent(e,n){switch(n.type){case xn.FullSnapshot:{this.crossOriginIframeMirror.reset(e),this.crossOriginIframeStyleMirror.reset(e),this.replaceIdOnNode(n.data.node,e);const r=n.data.node.id;return this.crossOriginIframeRootIdMap.set(e,r),this.patchRootIdOnNode(n.data.node,r),{timestamp:n.timestamp,type:xn.IncrementalSnapshot,data:{source:Tn.Mutation,adds:[{parentId:this.mirror.getId(e),nextId:null,node:n.data.node}],removes:[],texts:[],attributes:[],isAttachIframe:!0}}}case xn.Meta:case xn.Load:case xn.DomContentLoaded:return!1;case xn.Plugin:return n;case xn.Custom:return this.replaceIds(n.data.payload,e,["id","parentId","previousId","nextId"]),n;case xn.IncrementalSnapshot:switch(n.data.source){case Tn.Mutation:return n.data.adds.forEach(r=>{this.replaceIds(r,e,["parentId","nextId","previousId"]),this.replaceIdOnNode(r.node,e);const i=this.crossOriginIframeRootIdMap.get(e);i&&this.patchRootIdOnNode(r.node,i)}),n.data.removes.forEach(r=>{this.replaceIds(r,e,["parentId","id"])}),n.data.attributes.forEach(r=>{this.replaceIds(r,e,["id"])}),n.data.texts.forEach(r=>{this.replaceIds(r,e,["id"])}),n;case Tn.Drag:case Tn.TouchMove:case Tn.MouseMove:return n.data.positions.forEach(r=>{this.replaceIds(r,e,["id"])}),n;case Tn.ViewportResize:return!1;case Tn.MediaInteraction:case Tn.MouseInteraction:case Tn.Scroll:case Tn.CanvasMutation:case Tn.Input:return this.replaceIds(n.data,e,["id"]),n;case Tn.StyleSheetRule:case Tn.StyleDeclaration:return this.replaceIds(n.data,e,["id"]),this.replaceStyleIds(n.data,e,["styleId"]),n;case Tn.Font:return n;case Tn.Selection:return n.data.ranges.forEach(r=>{this.replaceIds(r,e,["start","end"])}),n;case Tn.AdoptedStyleSheet:return this.replaceIds(n.data,e,["id"]),this.replaceStyleIds(n.data,e,["styleIds"]),Mj([n,"access",r=>r.data,"access",r=>r.styles,"optionalAccess",r=>r.forEach,"call",r=>r(i=>{this.replaceStyleIds(i,e,["styleId"])})]),n}}return!1}replace(e,n,r,i){for(const s of i)!Array.isArray(n[s])&&typeof n[s]!="number"||(Array.isArray(n[s])?n[s]=e.getIds(r,n[s]):n[s]=e.getId(r,n[s]));return n}replaceIds(e,n,r){return this.replace(this.crossOriginIframeMirror,e,n,r)}replaceStyleIds(e,n,r){return this.replace(this.crossOriginIframeStyleMirror,e,n,r)}replaceIdOnNode(e,n){this.replaceIds(e,n,["id","rootId"]),"childNodes"in e&&e.childNodes.forEach(r=>{this.replaceIdOnNode(r,n)})}patchRootIdOnNode(e,n){e.type!==Ss.Document&&!e.rootId&&(e.rootId=n),"childNodes"in e&&e.childNodes.forEach(r=>{this.patchRootIdOnNode(r,n)})}}class CRe{init(){}addShadowRoot(){}observeAttachShadow(){}reset(){}}class KRe{constructor(e){this.shadowDoms=new WeakSet,this.restoreHandlers=[],this.mutationCb=e.mutationCb,this.scrollCb=e.scrollCb,this.bypassOptions=e.bypassOptions,this.mirror=e.mirror,this.init()}init(){this.reset(),this.patchAttachShadow(Element,document)}addShadowRoot(e,n){if(!$3(e)||this.shadowDoms.has(e))return;this.shadowDoms.add(e);const r=Joe({...this.bypassOptions,doc:n,mutationCb:this.mutationCb,mirror:this.mirror,shadowDomManager:this},e);this.restoreHandlers.push(()=>r.disconnect()),this.restoreHandlers.push(Yoe({...this.bypassOptions,scrollCb:this.scrollCb,doc:e,mirror:this.mirror})),bV(()=>{e.adoptedStyleSheets&&e.adoptedStyleSheets.length>0&&this.bypassOptions.stylesheetManager.adoptStyleSheets(e.adoptedStyleSheets,this.mirror.getId(e.host)),this.restoreHandlers.push(Boe({mirror:this.mirror,stylesheetManager:this.bypassOptions.stylesheetManager},e))},0)}observeAttachShadow(e){!e.contentWindow||!e.contentDocument||this.patchAttachShadow(e.contentWindow.Element,e.contentDocument)}patchAttachShadow(e,n){const r=this;this.restoreHandlers.push(AC(e.prototype,"attachShadow",function(i){return function(s){const a=i.call(this,s);return this.shadowRoot&&Foe(this)&&r.addShadowRoot(this.shadowRoot,n),a}}))}reset(){this.restoreHandlers.forEach(e=>{try{e()}catch{}}),this.restoreHandlers=[],this.shadowDoms=new WeakSet}}class Pj{reset(){}freeze(){}unfreeze(){}lock(){}unlock(){}snapshot(){}}class qRe{constructor(e){this.trackedLinkElements=new WeakSet,this.styleMirror=new hRe,this.mutationCb=e.mutationCb,this.adoptedStyleSheetCb=e.adoptedStyleSheetCb}attachLinkElement(e,n){"_cssText"in n.attributes&&this.mutationCb({adds:[],removes:[],texts:[],attributes:[{id:n.id,attributes:n.attributes}]}),this.trackLinkElement(e)}trackLinkElement(e){this.trackedLinkElements.has(e)||(this.trackedLinkElements.add(e),this.trackStylesheetInLinkElement(e))}adoptStyleSheets(e,n){if(e.length===0)return;const r={id:n,styleIds:[]},i=[];for(const s of e){let a;this.styleMirror.has(s)?a=this.styleMirror.getId(s):(a=this.styleMirror.add(s),i.push({styleId:a,rules:Array.from(s.rules||CSSRule,(o,l)=>({rule:Ooe(o),index:l}))})),r.styleIds.push(a)}i.length>0&&(r.styles=i),this.adoptedStyleSheetCb(r)}reset(){this.styleMirror.reset(),this.trackedLinkElements=new WeakSet}trackStylesheetInLinkElement(e){}}class DRe{constructor(){this.nodeMap=new WeakMap,this.loop=!0,this.periodicallyClear()}periodicallyClear(){vRe(()=>{this.clear(),this.loop&&this.periodicallyClear()})}inOtherBuffer(e,n){const r=this.nodeMap.get(e);return r&&Array.from(r).some(i=>i!==n)}add(e,n){this.nodeMap.set(e,(this.nodeMap.get(e)||new Set).add(n))}clear(){this.nodeMap=new WeakMap}destroy(){this.loop=!1}}let zi,HM;const pu=WPe();function lp(t={}){const{emit:e,checkoutEveryNms:n,checkoutEveryNth:r,blockClass:i="rr-block",blockSelector:s=null,unblockSelector:a=null,ignoreClass:o="rr-ignore",ignoreSelector:l=null,maskAllText:u=!1,maskTextClass:c="rr-mask",unmaskTextClass:d=null,maskTextSelector:f=null,unmaskTextSelector:h=null,inlineStylesheet:p=!0,maskAllInputs:m,maskInputOptions:v,slimDOMOptions:g,maskAttributeFn:b,maskInputFn:y,maskTextFn:x,maxCanvasSize:T=null,packFn:M,sampling:E={},dataURLOptions:S={},mousemoveWait:P,recordCanvas:R=!1,recordCrossOriginIframes:V=!1,recordAfter:z=t.recordAfter==="DOMContentLoaded"?t.recordAfter:"load",userTriggeredOnInput:k=!1,collectFonts:N=!1,inlineImages:q=!1,plugins:L,keepIframeSrcFn:A=()=>!1,ignoreCSSAttributes:J=new Set([]),errorHandler:F,onMutation:ne,getCanvasManager:j}=t;xRe(F);const Z=V?window.parent===window:!0;let _=!1;if(!Z)try{window.parent.document&&(_=!1)}catch{_=!0}if(Z&&!e)throw new Error("emit function is required");P!==void 0&&E.mousemove===void 0&&(E.mousemove=P),pu.reset();const le=m===!0?{color:!0,date:!0,"datetime-local":!0,email:!0,month:!0,number:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0,textarea:!0,select:!0,radio:!0,checkbox:!0}:v!==void 0?v:{},fe=g===!0||g==="all"?{script:!0,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaVerification:!0,headMetaAuthorship:g==="all",headMetaDescKeywords:g==="all"}:g||{};fRe();let te,$=0;const oe=ye=>{for(const we of L||[])we.eventProcessor&&(ye=we.eventProcessor(ye));return M&&!_&&(ye=M(ye)),ye};zi=(ye,we)=>{const se=ye;if(se.timestamp=YM(),Fz([u1,"access",W=>W[0],"optionalAccess",W=>W.isFrozen,"call",W=>W()])&&se.type!==xn.FullSnapshot&&!(se.type===xn.IncrementalSnapshot&&se.data.source===Tn.Mutation)&&u1.forEach(W=>W.unfreeze()),Z)Fz([e,"optionalCall",W=>W(oe(se),we)]);else if(_){const W={type:"rrweb",event:oe(se),origin:window.location.origin,isCheckout:we};window.parent.postMessage(W,"*")}if(se.type===xn.FullSnapshot)te=se,$=0;else if(se.type===xn.IncrementalSnapshot){if(se.data.source===Tn.Mutation&&se.data.isAttachIframe)return;$++;const W=r&&$>=r,K=n&&te&&se.timestamp-te.timestamp>n;(W||K)&&he(!0)}};const ge=ye=>{zi({type:xn.IncrementalSnapshot,data:{source:Tn.Mutation,...ye}})},ve=ye=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.Scroll,...ye}}),Ke=ye=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.CanvasMutation,...ye}}),ue=ye=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.AdoptedStyleSheet,...ye}}),D=new qRe({mutationCb:ge,adoptedStyleSheetCb:ue}),G=typeof __RRWEB_EXCLUDE_IFRAME__=="boolean"&&__RRWEB_EXCLUDE_IFRAME__?new LRe:new XRe({mirror:pu,mutationCb:ge,stylesheetManager:D,recordCrossOriginIframes:V,wrappedEmit:zi});for(const ye of L||[])ye.getMirror&&ye.getMirror({nodeMirror:pu,crossOriginIframeMirror:G.crossOriginIframeMirror,crossOriginIframeStyleMirror:G.crossOriginIframeStyleMirror});const re=new DRe,de=ARe(j,{mirror:pu,win:window,mutationCb:ye=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.CanvasMutation,...ye}}),recordCanvas:R,blockClass:i,blockSelector:s,unblockSelector:a,maxCanvasSize:T,sampling:E.canvas,dataURLOptions:S,errorHandler:F}),Te=typeof __RRWEB_EXCLUDE_SHADOW_DOM__=="boolean"&&__RRWEB_EXCLUDE_SHADOW_DOM__?new CRe:new KRe({mutationCb:ge,scrollCb:ve,bypassOptions:{onMutation:ne,blockClass:i,blockSelector:s,unblockSelector:a,maskAllText:u,maskTextClass:c,unmaskTextClass:d,maskTextSelector:f,unmaskTextSelector:h,inlineStylesheet:p,maskInputOptions:le,dataURLOptions:S,maskAttributeFn:b,maskTextFn:x,maskInputFn:y,recordCanvas:R,inlineImages:q,sampling:E,slimDOMOptions:fe,iframeManager:G,stylesheetManager:D,canvasManager:de,keepIframeSrcFn:A,processedNodeManager:re},mirror:pu}),he=(ye=!1)=>{zi({type:xn.Meta,data:{href:window.location.href,width:Koe(),height:Coe()}},ye),D.reset(),Te.init(),u1.forEach(se=>se.lock());const we=cRe(document,{mirror:pu,blockClass:i,blockSelector:s,unblockSelector:a,maskAllText:u,maskTextClass:c,unmaskTextClass:d,maskTextSelector:f,unmaskTextSelector:h,inlineStylesheet:p,maskAllInputs:le,maskAttributeFn:b,maskInputFn:y,maskTextFn:x,slimDOM:fe,dataURLOptions:S,recordCanvas:R,inlineImages:q,onSerialize:se=>{Woe(se,pu)&&G.addIframe(se),Aoe(se,pu)&&D.trackLinkElement(se),iL(se)&&Te.addShadowRoot(se.shadowRoot,document)},onIframeLoad:(se,W)=>{G.attachIframe(se,W),Te.observeAttachShadow(se)},onStylesheetLoad:(se,W)=>{D.attachLinkElement(se,W)},keepIframeSrcFn:A});if(!we)return console.warn("Failed to snapshot the document");zi({type:xn.FullSnapshot,data:{node:we,initialOffset:Xoe(window)}}),u1.forEach(se=>se.unlock()),document.adoptedStyleSheets&&document.adoptedStyleSheets.length>0&&D.adoptStyleSheets(document.adoptedStyleSheets,pu.getId(document))};HM=he;try{const ye=[],we=W=>jn(NRe)({onMutation:ne,mutationCb:ge,mousemoveCb:(K,ie)=>zi({type:xn.IncrementalSnapshot,data:{source:ie,positions:K}}),mouseInteractionCb:K=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.MouseInteraction,...K}}),scrollCb:ve,viewportResizeCb:K=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.ViewportResize,...K}}),inputCb:K=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.Input,...K}}),mediaInteractionCb:K=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.MediaInteraction,...K}}),styleSheetRuleCb:K=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.StyleSheetRule,...K}}),styleDeclarationCb:K=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.StyleDeclaration,...K}}),canvasMutationCb:Ke,fontCb:K=>zi({type:xn.IncrementalSnapshot,data:{source:Tn.Font,...K}}),selectionCb:K=>{zi({type:xn.IncrementalSnapshot,data:{source:Tn.Selection,...K}})},customElementCb:K=>{zi({type:xn.IncrementalSnapshot,data:{source:Tn.CustomElement,...K}})},blockClass:i,ignoreClass:o,ignoreSelector:l,maskAllText:u,maskTextClass:c,unmaskTextClass:d,maskTextSelector:f,unmaskTextSelector:h,maskInputOptions:le,inlineStylesheet:p,sampling:E,recordCanvas:R,inlineImages:q,userTriggeredOnInput:k,collectFonts:N,doc:W,maskAttributeFn:b,maskInputFn:y,maskTextFn:x,keepIframeSrcFn:A,blockSelector:s,unblockSelector:a,slimDOMOptions:fe,dataURLOptions:S,mirror:pu,iframeManager:G,stylesheetManager:D,shadowDomManager:Te,processedNodeManager:re,canvasManager:de,ignoreCSSAttributes:J,plugins:Fz([L,"optionalAccess",K=>K.filter,"call",K=>K(ie=>ie.observer),"optionalAccess",K=>K.map,"call",K=>K(ie=>({observer:ie.observer,options:ie.options,callback:me=>zi({type:xn.Plugin,data:{plugin:ie.name,payload:me}})}))])||[]},{});G.addLoadListener(W=>{try{ye.push(we(W.contentDocument))}catch(K){console.warn(K)}});const se=()=>{he(),ye.push(we(document))};return document.readyState==="interactive"||document.readyState==="complete"?se():(ye.push(Qa("DOMContentLoaded",()=>{zi({type:xn.DomContentLoaded,data:{}}),z==="DOMContentLoaded"&&se()})),ye.push(Qa("load",()=>{zi({type:xn.Load,data:{}}),z==="load"&&se()},window))),()=>{ye.forEach(W=>W()),re.destroy(),HM=void 0,TRe()}}catch(ye){console.warn(ye)}}function WRe(t){if(!HM)throw new Error("please take full snapshot after start recording");HM(t)}lp.mirror=pu;lp.takeFullSnapshot=WRe;function ARe(t,e){try{return t?t(e):new Pj}catch{return console.warn("Unable to initialize CanvasManager"),new Pj}}const GRe=3,FRe=5;function FC(t){return t>9999999999?t:t*1e3}function _z(t){return t>9999999999?t/1e3:t}function fT(t,e){e.category!=="sentry.transaction"&&(["ui.click","ui.input"].includes(e.category)?t.triggerUserActivity():t.checkAndHandleExpiredSession(),t.addUpdate(()=>(t.throttledAddEvent({type:xn.Custom,timestamp:(e.timestamp||0)*1e3,data:{tag:"breadcrumb",payload:Rc(e,10,1e3)}}),e.category==="console")))}const jRe="button,a";function Hoe(t){return t.closest(jRe)||t}function Qoe(t){const e=_oe(t);return!e||!(e instanceof Element)?e:Hoe(e)}function _oe(t){return ZRe(t)?t.target:t}function ZRe(t){return typeof t=="object"&&!!t&&"target"in t}let Oh;function JRe(t){return Oh||(Oh=[],YRe()),Oh.push(t),()=>{const e=Oh?Oh.indexOf(t):-1;e>-1&&Oh.splice(e,1)}}function YRe(){Cs(Hr,"open",function(t){return function(...e){if(Oh)try{Oh.forEach(n=>n())}catch{}return t.apply(Hr,e)}})}function BRe(t,e,n){t.handleClick(e,n)}class HRe{constructor(e,n,r=fT){this._lastMutation=0,this._lastScroll=0,this._clicks=[],this._timeout=n.timeout/1e3,this._threshold=n.threshold/1e3,this._scollTimeout=n.scrollTimeout/1e3,this._replay=e,this._ignoreSelector=n.ignoreSelector,this._addBreadcrumbEvent=r}addListeners(){const e=JRe(()=>{this._lastMutation=Rj()});this._teardown=()=>{e(),this._clicks=[],this._lastMutation=0,this._lastScroll=0}}removeListeners(){this._teardown&&this._teardown(),this._checkClickTimeout&&clearTimeout(this._checkClickTimeout)}handleClick(e,n){if(_Re(n,this._ignoreSelector)||!$Re(e))return;const r={timestamp:_z(e.timestamp),clickBreadcrumb:e,clickCount:0,node:n};this._clicks.some(i=>i.node===r.node&&Math.abs(i.timestamp-r.timestamp)<1)||(this._clicks.push(r),this._clicks.length===1&&this._scheduleCheckClicks())}registerMutation(e=Date.now()){this._lastMutation=_z(e)}registerScroll(e=Date.now()){this._lastScroll=_z(e)}registerClick(e){const n=Hoe(e);this._handleMultiClick(n)}_handleMultiClick(e){this._getClicks(e).forEach(n=>{n.clickCount++})}_getClicks(e){return this._clicks.filter(n=>n.node===e)}_checkClicks(){const e=[],n=Rj();this._clicks.forEach(r=>{!r.mutationAfter&&this._lastMutation&&(r.mutationAfter=r.timestamp<=this._lastMutation?this._lastMutation-r.timestamp:void 0),!r.scrollAfter&&this._lastScroll&&(r.scrollAfter=r.timestamp<=this._lastScroll?this._lastScroll-r.timestamp:void 0),r.timestamp+this._timeout<=n&&e.push(r)});for(const r of e){const i=this._clicks.indexOf(r);i>-1&&(this._generateBreadcrumbs(r),this._clicks.splice(i,1))}this._clicks.length&&this._scheduleCheckClicks()}_generateBreadcrumbs(e){const n=this._replay,r=e.scrollAfter&&e.scrollAfter<=this._scollTimeout,i=e.mutationAfter&&e.mutationAfter<=this._threshold,s=!r&&!i,{clickCount:a,clickBreadcrumb:o}=e;if(s){const l=Math.min(e.mutationAfter||this._timeout,this._timeout)*1e3,u=l1){const l={type:"default",message:o.message,timestamp:o.timestamp,category:"ui.multiClick",data:{...o.data,url:Hr.location.href,route:n.getCurrentRoute(),clickCount:a,metric:!0}};this._addBreadcrumbEvent(n,l)}}_scheduleCheckClicks(){this._checkClickTimeout&&clearTimeout(this._checkClickTimeout),this._checkClickTimeout=setTimeout(()=>this._checkClicks(),1e3)}}const QRe=["A","BUTTON","INPUT"];function _Re(t,e){return!!(!QRe.includes(t.tagName)||t.tagName==="INPUT"&&!["submit","button"].includes(t.getAttribute("type")||"")||t.tagName==="A"&&(t.hasAttribute("download")||t.hasAttribute("target")&&t.getAttribute("target")!=="_self")||e&&t.matches(e))}function $Re(t){return!!(t.data&&typeof t.data.nodeId=="number"&&t.timestamp)}function Rj(){return Date.now()/1e3}function eVe(t,e){try{if(!tVe(e))return;const{source:n}=e.data;if(n===Tn.Mutation&&t.registerMutation(e.timestamp),n===Tn.Scroll&&t.registerScroll(e.timestamp),nVe(e)){const{type:r,id:i}=e.data,s=lp.mirror.getNode(i);s instanceof HTMLElement&&r===Fa.Click&&t.registerClick(s)}}catch{}}function tVe(t){return t.type===GRe}function nVe(t){return t.data.source===Tn.MouseInteraction}function Cc(t){return{timestamp:Date.now()/1e3,type:"default",...t}}var QM;(function(t){t[t.Document=0]="Document",t[t.DocumentType=1]="DocumentType",t[t.Element=2]="Element",t[t.Text=3]="Text",t[t.CDATA=4]="CDATA",t[t.Comment=5]="Comment"})(QM||(QM={}));const rVe=new Set(["id","class","aria-label","role","name","alt","title","data-test-id","data-testid","disabled","aria-disabled","data-sentry-component"]);function iVe(t){const e={};for(const n in t)if(rVe.has(n)){let r=n;(n==="data-testid"||n==="data-test-id")&&(r="testId"),e[r]=t[n]}return e}const sVe=t=>e=>{if(!t.isEnabled())return;const n=aVe(e);if(!n)return;const r=e.name==="click",i=r?e.event:void 0;r&&t.clickDetector&&i&&i.target&&!i.altKey&&!i.metaKey&&!i.ctrlKey&&!i.shiftKey&&BRe(t.clickDetector,n,Qoe(e.event)),fT(t,n)};function $oe(t,e){const n=lp.mirror.getId(t),r=n&&lp.mirror.getNode(n),i=r&&lp.mirror.getMeta(r),s=i&&lVe(i)?i:null;return{message:e,data:s?{nodeId:n,node:{id:n,tagName:s.tagName,textContent:Array.from(s.childNodes).map(a=>a.type===QM.Text&&a.textContent).filter(Boolean).map(a=>a.trim()).join(""),attributes:iVe(s.attributes)}}:{}}}function aVe(t){const{target:e,message:n}=oVe(t);return Cc({category:`ui.${t.name}`,...$oe(e,n)})}function oVe(t){const e=t.name==="click";let n,r=null;try{r=e?Qoe(t.event):_oe(t.event),n=zp(r,{maxStringLength:200})||""}catch{n=""}return{target:r,message:n}}function lVe(t){return t.type===QM.Element}function uVe(t,e){if(!t.isEnabled())return;t.updateUserActivity();const n=cVe(e);n&&fT(t,n)}function cVe(t){const{metaKey:e,shiftKey:n,ctrlKey:r,altKey:i,key:s,target:a}=t;if(!a||dVe(a)||!s)return null;const o=e||r||i,l=s.length===1;if(!o&&l)return null;const u=zp(a,{maxStringLength:200})||"",c=$oe(a,u);return Cc({category:"ui.keyDown",message:u,data:{...c.data,metaKey:e,shiftKey:n,ctrlKey:r,altKey:i,key:s}})}function dVe(t){return t.tagName==="INPUT"||t.tagName==="TEXTAREA"||t.isContentEditable}const Vj={resource:vVe,paint:pVe,navigation:mVe};function fVe(t){return t.map(hVe).filter(Boolean)}function hVe(t){return Vj[t.entryType]?Vj[t.entryType](t):null}function fb(t){return((gl||Hr.performance.timeOrigin)+t)/1e3}function pVe(t){const{duration:e,entryType:n,name:r,startTime:i}=t,s=fb(i);return{type:n,name:r,start:s,end:s+e,data:void 0}}function mVe(t){const{entryType:e,name:n,decodedBodySize:r,duration:i,domComplete:s,encodedBodySize:a,domContentLoadedEventStart:o,domContentLoadedEventEnd:l,domInteractive:u,loadEventStart:c,loadEventEnd:d,redirectCount:f,startTime:h,transferSize:p,type:m}=t;return i===0?null:{type:`${e}.${m}`,start:fb(h),end:fb(s),name:n,data:{size:p,decodedBodySize:r,encodedBodySize:a,duration:i,domInteractive:u,domContentLoadedEventStart:o,domContentLoadedEventEnd:l,loadEventStart:c,loadEventEnd:d,domComplete:s,redirectCount:f}}}function vVe(t){const{entryType:e,initiatorType:n,name:r,responseEnd:i,startTime:s,decodedBodySize:a,encodedBodySize:o,responseStatus:l,transferSize:u}=t;return["fetch","xmlhttprequest"].includes(n)?null:{type:`${e}.${n}`,start:fb(s),end:fb(i),name:r,data:{size:u,statusCode:l,decodedBodySize:a,encodedBodySize:o}}}function gVe(t){const e=t.entries,n=e[e.length-1],r=n?n.element:void 0,i=t.value,s=fb(i);return{type:"largest-contentful-paint",name:"largest-contentful-paint",start:s,end:s,data:{value:i,size:i,nodeId:r?lp.mirror.getId(r):void 0}}}function bVe(t){function e(i){t.performanceEntries.includes(i)||t.performanceEntries.push(i)}function n({entries:i}){i.forEach(e)}const r=[];return["navigation","paint","resource"].forEach(i=>{r.push(ob(i,n))}),r.push(ooe(({metric:i})=>{t.replayPerformanceEntries.push(gVe(i))})),()=>{r.forEach(i=>i())}}const Dr=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,yVe='var t=Uint8Array,n=Uint16Array,r=Int32Array,e=new t([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),i=new t([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),a=new t([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),s=function(t,e){for(var i=new n(31),a=0;a<31;++a)i[a]=e+=1<>1|(21845&c)<<1;v=(61680&(v=(52428&v)>>2|(13107&v)<<2))>>4|(3855&v)<<4,u[c]=((65280&v)>>8|(255&v)<<8)>>1}var d=function(t,r,e){for(var i=t.length,a=0,s=new n(r);a>h]=l}else for(o=new n(i),a=0;a>15-t[a]);return o},g=new t(288);for(c=0;c<144;++c)g[c]=8;for(c=144;c<256;++c)g[c]=9;for(c=256;c<280;++c)g[c]=7;for(c=280;c<288;++c)g[c]=8;var w=new t(32);for(c=0;c<32;++c)w[c]=5;var p=d(g,9,0),y=d(w,5,0),m=function(t){return(t+7)/8|0},b=function(n,r,e){return(null==r||r<0)&&(r=0),(null==e||e>n.length)&&(e=n.length),new t(n.subarray(r,e))},M=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],E=function(t,n,r){var e=new Error(n||M[t]);if(e.code=t,Error.captureStackTrace&&Error.captureStackTrace(e,E),!r)throw e;return e},z=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8},A=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8,t[e+2]|=r>>16},_=function(r,e){for(var i=[],a=0;ad&&(d=o[a].s);var g=new n(d+1),w=x(i[c-1],g,0);if(w>e){a=0;var p=0,y=w-e,m=1<e))break;p+=m-(1<>=y;p>0;){var M=o[a].s;g[M]=0&&p;--a){var E=o[a].s;g[E]==e&&(--g[E],++p)}w=e}return{t:new t(g),l:w}},x=function(t,n,r){return-1==t.s?Math.max(x(t.l,n,r+1),x(t.r,n,r+1)):n[t.s]=r},D=function(t){for(var r=t.length;r&&!t[--r];);for(var e=new n(++r),i=0,a=t[0],s=1,o=function(t){e[i++]=t},f=1;f<=r;++f)if(t[f]==a&&f!=r)++s;else{if(!a&&s>2){for(;s>138;s-=138)o(32754);s>2&&(o(s>10?s-11<<5|28690:s-3<<5|12305),s=0)}else if(s>3){for(o(a),--s;s>6;s-=6)o(8304);s>2&&(o(s-3<<5|8208),s=0)}for(;s--;)o(a);s=1,a=t[f]}return{c:e.subarray(0,i),n:r}},T=function(t,n){for(var r=0,e=0;e>8,t[i+2]=255^t[i],t[i+3]=255^t[i+1];for(var a=0;a4&&!H[a[K-1]];--K);var N,P,Q,R,V=v+5<<3,W=T(f,g)+T(h,w)+l,X=T(f,M)+T(h,C)+l+14+3*K+T(q,H)+2*q[16]+3*q[17]+7*q[18];if(c>=0&&V<=W&&V<=X)return k(r,m,t.subarray(c,c+v));if(z(r,m,1+(X15&&(z(r,m,tt[B]>>5&127),m+=tt[B]>>12)}}}else N=p,P=g,Q=y,R=w;for(B=0;B255){A(r,m,N[(nt=rt>>18&31)+257]),m+=P[nt+257],nt>7&&(z(r,m,rt>>23&31),m+=e[nt]);var et=31&rt;A(r,m,Q[et]),m+=R[et],et>3&&(A(r,m,rt>>5&8191),m+=i[et])}else A(r,m,N[rt]),m+=P[rt]}return A(r,m,N[256]),m+P[256]},U=new r([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),F=new t(0),I=function(){for(var t=new Int32Array(256),n=0;n<256;++n){for(var r=n,e=9;--e;)r=(1&r&&-306674912)^r>>>1;t[n]=r}return t}(),S=function(){var t=1,n=0;return{p:function(r){for(var e=t,i=n,a=0|r.length,s=0;s!=a;){for(var o=Math.min(s+2655,a);s>16),i=(65535&i)+15*(i>>16)}t=e,n=i},d:function(){return(255&(t%=65521))<<24|(65280&t)<<8|(255&(n%=65521))<<8|n>>8}}},L=function(a,s,o,f,u){if(!u&&(u={l:1},s.dictionary)){var c=s.dictionary.subarray(-32768),v=new t(c.length+a.length);v.set(c),v.set(a,c.length),a=v,u.w=c.length}return function(a,s,o,f,u,c){var v=c.z||a.length,d=new t(f+v+5*(1+Math.ceil(v/7e3))+u),g=d.subarray(f,d.length-u),w=c.l,p=7&(c.r||0);if(s){p&&(g[0]=c.r>>3);for(var y=U[s-1],M=y>>13,E=8191&y,z=(1<7e3||q>24576)&&(N>423||!w)){p=C(a,g,0,F,I,S,O,q,G,j-G,p),q=L=O=0,G=j;for(var P=0;P<286;++P)I[P]=0;for(P=0;P<30;++P)S[P]=0}var Q=2,R=0,V=E,W=J-K&32767;if(N>2&&H==T(j-W))for(var X=Math.min(M,N)-1,Y=Math.min(32767,j),Z=Math.min(258,N);W<=Y&&--V&&J!=K;){if(a[j+Q]==a[j+Q-W]){for(var $=0;$Q){if(Q=$,R=W,$>X)break;var tt=Math.min(W,$-2),nt=0;for(P=0;Pnt&&(nt=et,K=rt)}}}W+=(J=K)-(K=A[J])&32767}if(R){F[q++]=268435456|h[Q]<<18|l[R];var it=31&h[Q],at=31&l[R];O+=e[it]+i[at],++I[257+it],++S[at],B=j+Q,++L}else F[q++]=a[j],++I[a[j]]}}for(j=Math.max(j,B);j=v&&(g[p/8|0]=w,st=v),p=k(g,p+1,a.subarray(j,st))}c.i=v}return b(d,0,f+m(p)+u)}(a,null==s.level?6:s.level,null==s.mem?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(a.length)))):12+s.mem,o,f,u)},O=function(t,n,r){for(;r;++n)t[n]=r,r>>>=8},j=function(){function n(n,r){if("function"==typeof n&&(r=n,n={}),this.ondata=r,this.o=n||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new t(98304),this.o.dictionary){var e=this.o.dictionary.subarray(-32768);this.b.set(e,32768-e.length),this.s.i=32768-e.length}}return n.prototype.p=function(t,n){this.ondata(L(t,this.o,0,0,this.s),n)},n.prototype.push=function(n,r){this.ondata||E(5),this.s.l&&E(4);var e=n.length+this.s.z;if(e>this.b.length){if(e>2*this.b.length-32768){var i=new t(-32768&e);i.set(this.b.subarray(0,this.s.z)),this.b=i}var a=this.b.length-this.s.z;a&&(this.b.set(n.subarray(0,a),this.s.z),this.s.z=this.b.length,this.p(this.b,!1)),this.b.set(this.b.subarray(-32768)),this.b.set(n.subarray(a),32768),this.s.z=n.length-a+32768,this.s.i=32766,this.s.w=32768}else this.b.set(n,this.s.z),this.s.z+=n.length;this.s.l=1&r,(this.s.z>this.s.w+8191||r)&&(this.p(this.b,r||!1),this.s.w=this.s.i,this.s.i-=2)},n}();function q(t,n){n||(n={});var r=function(){var t=-1;return{p:function(n){for(var r=t,e=0;e>>8;t=r},d:function(){return~t}}}(),e=t.length;r.p(t);var i,a=L(t,n,10+((i=n).filename?i.filename.length+1:0),8),s=a.length;return function(t,n){var r=n.filename;if(t[0]=31,t[1]=139,t[2]=8,t[8]=n.level<2?4:9==n.level?2:0,t[9]=3,0!=n.mtime&&O(t,4,Math.floor(new Date(n.mtime||Date.now())/1e3)),r){t[3]=8;for(var e=0;e<=r.length;++e)t[e+10]=r.charCodeAt(e)}}(a,n),O(a,s-8,r.d()),O(a,s-4,e),a}var B=function(){function t(t,n){this.c=S(),this.v=1,j.call(this,t,n)}return t.prototype.push=function(t,n){this.c.p(t),j.prototype.push.call(this,t,n)},t.prototype.p=function(t,n){var r=L(t,this.o,this.v&&(this.o.dictionary?6:2),n&&4,this.s);this.v&&(function(t,n){var r=n.level,e=0==r?0:r<6?1:9==r?3:2;if(t[0]=120,t[1]=e<<6|(n.dictionary&&32),t[1]|=31-(t[0]<<8|t[1])%31,n.dictionary){var i=S();i.p(n.dictionary),O(t,2,i.d())}}(r,this.o),this.v=0),n&&O(r,r.length-4,this.c.d()),this.ondata(r,n)},t}(),G="undefined"!=typeof TextEncoder&&new TextEncoder,H="undefined"!=typeof TextDecoder&&new TextDecoder;try{H.decode(F,{stream:!0})}catch(t){}var J=function(){function t(t){this.ondata=t}return t.prototype.push=function(t,n){this.ondata||E(5),this.d&&E(4),this.ondata(K(t),this.d=n||!1)},t}();function K(n,r){if(r){for(var e=new t(n.length),i=0;i>1)),o=0,f=function(t){s[o++]=t};for(i=0;is.length){var h=new t(o+8+(a-i<<1));h.set(s),s=h}var l=n.charCodeAt(i);l<128||r?f(l):l<2048?(f(192|l>>6),f(128|63&l)):l>55295&&l<57344?(f(240|(l=65536+(1047552&l)|1023&n.charCodeAt(++i))>>18),f(128|l>>12&63),f(128|l>>6&63),f(128|63&l)):(f(224|l>>12),f(128|l>>6&63),f(128|63&l))}return b(s,0,o)}const N=new class{constructor(){this._init()}clear(){this._init()}addEvent(t){if(!t)throw new Error("Adding invalid event");const n=this._hasEvents?",":"";this.stream.push(n+t),this._hasEvents=!0}finish(){this.stream.push("]",!0);const t=function(t){let n=0;for(let r=0,e=t.length;r{this._deflatedData.push(t)},this.stream=new J(((t,n)=>{this.deflate.push(t,n)})),this.stream.push("[")}},P={clear:()=>{N.clear()},addEvent:t=>N.addEvent(t),finish:()=>N.finish(),compress:t=>function(t){return q(K(t))}(t)};addEventListener("message",(function(t){const n=t.data.method,r=t.data.id,e=t.data.arg;if(n in P&&"function"==typeof P[n])try{const t=P[n](e);postMessage({id:r,method:n,success:!0,response:t})}catch(t){postMessage({id:r,method:n,success:!1,response:t.message}),console.error(t)}})),postMessage({id:void 0,method:"init",success:!0,response:void 0});';function SVe(){const t=new Blob([yVe]);return URL.createObjectURL(t)}function Ya(t,e){Dr&&(He.info(t),e&&ele(t))}function U1(t,e){Dr&&(He.info(t),e&&setTimeout(()=>{ele(t)},0))}function ele(t){kp({category:"console",data:{logger:"replay"},level:"info",message:t},{level:"info"})}class jC extends Error{constructor(){super(`Event buffer exceeded maximum size of ${KC}.`)}}class tle{constructor(){this.events=[],this._totalSize=0,this.hasCheckout=!1}get hasEvents(){return this.events.length>0}get type(){return"sync"}destroy(){this.events=[]}async addEvent(e){const n=JSON.stringify(e).length;if(this._totalSize+=n,this._totalSize>KC)throw new jC;this.events.push(e)}finish(){return new Promise(e=>{const n=this.events;this.clear(),e(JSON.stringify(n))})}clear(){this.events=[],this._totalSize=0,this.hasCheckout=!1}getEarliestTimestamp(){const e=this.events.map(n=>n.timestamp).sort()[0];return e?FC(e):null}}class xVe{constructor(e){this._worker=e,this._id=0}ensureReady(){return this._ensureReadyPromise?this._ensureReadyPromise:(this._ensureReadyPromise=new Promise((e,n)=>{this._worker.addEventListener("message",({data:r})=>{r.success?e():n()},{once:!0}),this._worker.addEventListener("error",r=>{n(r)},{once:!0})}),this._ensureReadyPromise)}destroy(){Ya("[Replay] Destroying compression worker"),this._worker.terminate()}postMessage(e,n){const r=this._getAndIncrementId();return new Promise((i,s)=>{const a=({data:o})=>{const l=o;if(l.method===e&&l.id===r){if(this._worker.removeEventListener("message",a),!l.success){Dr&&He.error("[Replay]",l.response),s(new Error("Error in compression worker"));return}i(l.response)}};this._worker.addEventListener("message",a),this._worker.postMessage({id:r,method:e,arg:n})})}_getAndIncrementId(){return this._id++}}class TVe{constructor(e){this._worker=new xVe(e),this._earliestTimestamp=null,this._totalSize=0,this.hasCheckout=!1}get hasEvents(){return!!this._earliestTimestamp}get type(){return"worker"}ensureReady(){return this._worker.ensureReady()}destroy(){this._worker.destroy()}addEvent(e){const n=FC(e.timestamp);(!this._earliestTimestamp||nKC?Promise.reject(new jC):this._sendEventToWorker(r)}finish(){return this._finishRequest()}clear(){this._earliestTimestamp=null,this._totalSize=0,this.hasCheckout=!1,this._worker.postMessage("clear").then(null,e=>{Dr&&He.warn('[Replay] Sending "clear" message to worker failed',e)})}getEarliestTimestamp(){return this._earliestTimestamp}_sendEventToWorker(e){return this._worker.postMessage("addEvent",e)}async _finishRequest(){const e=await this._worker.postMessage("finish");return this._earliestTimestamp=null,this._totalSize=0,e}}class wVe{constructor(e){this._fallback=new tle,this._compression=new TVe(e),this._used=this._fallback,this._ensureWorkerIsLoadedPromise=this._ensureWorkerIsLoaded()}get type(){return this._used.type}get hasEvents(){return this._used.hasEvents}get hasCheckout(){return this._used.hasCheckout}set hasCheckout(e){this._used.hasCheckout=e}destroy(){this._fallback.destroy(),this._compression.destroy()}clear(){return this._used.clear()}getEarliestTimestamp(){return this._used.getEarliestTimestamp()}addEvent(e){return this._used.addEvent(e)}async finish(){return await this.ensureWorkerIsLoaded(),this._used.finish()}ensureWorkerIsLoaded(){return this._ensureWorkerIsLoadedPromise}async _ensureWorkerIsLoaded(){try{await this._compression.ensureReady()}catch{Ya("[Replay] Failed to load the compression worker, falling back to simple buffer");return}await this._switchToCompressionWorker()}async _switchToCompressionWorker(){const{events:e,hasCheckout:n}=this._fallback,r=[];for(const i of e)r.push(this._compression.addEvent(i));this._compression.hasCheckout=n,this._used=this._compression;try{await Promise.all(r)}catch(i){Dr&&He.warn("[Replay] Failed to add events when switching buffers.",i)}}}function EVe({useCompression:t,workerUrl:e}){if(t&&window.Worker){const n=MVe(e);if(n)return n}return Ya("[Replay] Using simple buffer"),new tle}function MVe(t){try{const e=t||PVe();if(!e)return;Ya(`[Replay] Using compression worker${t?` from ${t}`:""}`);const n=new Worker(e);return new wVe(n)}catch{Ya("[Replay] Failed to create compression worker")}}function PVe(){return typeof __SENTRY_EXCLUDE_REPLAY_WORKER__>"u"||!__SENTRY_EXCLUDE_REPLAY_WORKER__?SVe():""}function ZC(){try{return"sessionStorage"in Hr&&!!Hr.sessionStorage}catch{return!1}}function RVe(t){VVe(),t.session=void 0}function VVe(){if(ZC())try{Hr.sessionStorage.removeItem(XC)}catch{}}function nle(t){return t===void 0?!1:Math.random()t.getContext().initialTimestamp+t.getOptions().maxReplayDuration?(Ya(`[Replay] Skipping event with timestamp ${n} because it is after maxReplayDuration`,t.getOptions()._experiments.traceInternals),!1):!0}function UVe(t,e){try{if(typeof e=="function"&&OVe(t))return e(t)}catch(n){return Dr&&He.error("[Replay] An error occured in the `beforeAddRecordingEvent` callback, skipping the event...",n),null}return t}function BC(t){return!t.type}function lL(t){return t.type==="transaction"}function NVe(t){return t.type==="replay_event"}function kj(t){return t.type==="feedback"}function lle(t){const e=CVe();return(n,r)=>{if(!t.isEnabled()||!BC(n)&&!lL(n))return;const i=r&&r.statusCode;if(!(e&&(!i||i<200||i>=300))){if(lL(n)){LVe(t,n);return}XVe(t,n)}}}function LVe(t,e){const n=t.getContext();e.contexts&&e.contexts.trace&&e.contexts.trace.trace_id&&n.traceIds.size<100&&n.traceIds.add(e.contexts.trace.trace_id)}function XVe(t,e){const n=t.getContext();if(e.event_id&&n.errorIds.size<100&&n.errorIds.add(e.event_id),t.recordingMode!=="buffer"||!e.tags||!e.tags.replayId)return;const{beforeErrorSampling:r}=t.getOptions();typeof r=="function"&&!r(e)||setTimeout(()=>{t.sendBufferedReplayOrFlush()})}function CVe(){const t=Rr();if(!t)return!1;const e=t.getTransport();return e&&e.send.__sentry__baseTransport__||!1}function KVe(t){return e=>{!t.isEnabled()||!BC(e)||qVe(t,e)}}function qVe(t,e){const n=e.exception&&e.exception.values&&e.exception.values[0].value;if(typeof n=="string"&&(n.match(/reactjs\.org\/docs\/error-decoder\.html\?invariant=(418|419|422|423|425)/)||n.match(/(does not match server-rendered HTML|Hydration failed because)/i))){const r=Cc({category:"replay.hydrate-error"});fT(t,r)}}function DVe(t,e){return t.type||!t.exception||!t.exception.values||!t.exception.values.length?!1:!!(e.originalException&&e.originalException.__rrweb__)}function WVe(t,e){t.triggerUserActivity(),t.addUpdate(()=>e.timestamp?(t.throttledAddEvent({type:xn.Custom,timestamp:e.timestamp*1e3,data:{tag:"breadcrumb",payload:{timestamp:e.timestamp,type:"default",category:"sentry.feedback",data:{feedbackId:e.event_id}}}}),!1):!0)}function AVe(t,e){return t.recordingMode!=="buffer"||e.message===CC||!e.exception||e.type?!1:nle(t.getOptions().errorSampleRate)}function GVe(t,e=!1){const n=e?lle(t):void 0;return Object.assign((r,i)=>t.isEnabled()?NVe(r)?(delete r.breadcrumbs,r):!BC(r)&&!lL(r)&&!kj(r)||!t.checkAndHandleExpiredSession()?r:kj(r)?(t.flush(),r.contexts.feedback.replay_id=t.getSessionId(),WVe(t,r),r):DVe(r,i)&&!t.getOptions()._experiments.captureExceptions?(Dr&&He.log("[Replay] Ignoring error from rrweb internals",r),null):((AVe(t,r)||t.recordingMode==="session")&&(r.tags={...r.tags,replayId:t.getSessionId()}),n&&n(r,{statusCode:200}),r):r,{id:"Replay"})}function yV(t,e){return e.map(({type:n,start:r,end:i,name:s,data:a})=>{const o=t.throttledAddEvent({type:xn.Custom,timestamp:r,data:{tag:"performanceSpan",payload:{op:n,description:s,startTimestamp:r,endTimestamp:i,data:a}}});return typeof o=="string"?Promise.resolve(null):o})}function FVe(t){const{from:e,to:n}=t,r=Date.now()/1e3;return{type:"navigation.push",start:r,end:r,name:n,data:{previous:e}}}function jVe(t){return e=>{if(!t.isEnabled())return;const n=FVe(e);n!==null&&(t.getContext().urls.push(n.name),t.triggerUserActivity(),t.addUpdate(()=>(yV(t,[n]),!1)))}}function ZVe(t,e){return Dr&&t.getOptions()._experiments.traceInternals?!1:GEe(e,Rr())}function SV(t,e){t.isEnabled()&&e!==null&&(ZVe(t,e.name)||t.addUpdate(()=>(yV(t,[e]),!0)))}function JVe(t){const{startTimestamp:e,endTimestamp:n,fetchData:r,response:i}=t;if(!n)return null;const{method:s,url:a}=r;return{type:"resource.fetch",start:e/1e3,end:n/1e3,name:a,data:{method:s,statusCode:i?i.status:void 0}}}function YVe(t){return e=>{if(!t.isEnabled())return;const n=JVe(e);SV(t,n)}}function BVe(t){const{startTimestamp:e,endTimestamp:n,xhr:r}=t,i=r[jh];if(!e||!n||!i)return null;const{method:s,url:a,status_code:o}=i;return a===void 0?null:{type:"resource.xhr",name:a,start:e/1e3,end:n/1e3,data:{method:s,statusCode:o}}}function HVe(t){return e=>{if(!t.isEnabled())return;const n=BVe(e);SV(t,n)}}function xV(t,e){if(t)try{if(typeof t=="string")return e.encode(t).length;if(t instanceof URLSearchParams)return e.encode(t.toString()).length;if(t instanceof FormData){const n=fle(t);return e.encode(n).length}if(t instanceof Blob)return t.size;if(t instanceof ArrayBuffer)return t.byteLength}catch{}}function ule(t){if(!t)return;const e=parseInt(t,10);return isNaN(e)?void 0:e}function cle(t){try{if(typeof t=="string")return[t];if(t instanceof URLSearchParams)return[t.toString()];if(t instanceof FormData)return[fle(t)];if(!t)return[void 0]}catch{return Dr&&He.warn("[Replay] Failed to serialize body",t),[void 0,"BODY_PARSE_ERROR"]}return Dr&&He.info("[Replay] Skipping network body because of body type",t),[void 0,"UNPARSEABLE_BODY_TYPE"]}function _M(t,e){if(!t)return{headers:{},size:void 0,_meta:{warnings:[e]}};const n={...t._meta},r=n.warnings||[];return n.warnings=[...r,e],t._meta=n,t}function dle(t,e){if(!e)return null;const{startTimestamp:n,endTimestamp:r,url:i,method:s,statusCode:a,request:o,response:l}=e;return{type:t,start:n/1e3,end:r/1e3,name:i,data:to({method:s,statusCode:a,request:o,response:l})}}function $x(t){return{headers:{},size:t,_meta:{warnings:["URL_SKIPPED"]}}}function up(t,e,n){if(!e&&Object.keys(t).length===0)return;if(!e)return{headers:t};if(!n)return{headers:t,size:e};const r={headers:t,size:e},{body:i,warnings:s}=QVe(n);return r.body=i,s&&s.length>0&&(r._meta={warnings:s}),r}function uL(t,e){return Object.keys(t).reduce((n,r)=>{const i=r.toLowerCase();return e.includes(i)&&t[r]&&(n[i]=t[r]),n},{})}function fle(t){return new URLSearchParams(t).toString()}function QVe(t){if(!t||typeof t!="string")return{body:t};const e=t.length>pj,n=_Ve(t);if(e){const r=t.slice(0,pj);return n?{body:r,warnings:["MAYBE_JSON_TRUNCATED"]}:{body:`${r}…`,warnings:["TEXT_TRUNCATED"]}}if(n)try{return{body:JSON.parse(t)}}catch{}return{body:t}}function _Ve(t){const e=t[0],n=t[t.length-1];return e==="["&&n==="]"||e==="{"&&n==="}"}function $M(t,e){const n=$Ve(t);return ny(n,e)}function $Ve(t,e=Hr.document.baseURI){if(t.startsWith("http://")||t.startsWith("https://")||t.startsWith(Hr.location.origin))return t;const n=new URL(t,e);if(n.origin!==new URL(e).origin)return t;const r=n.href;return!t.endsWith("/")&&r.endsWith("/")?r.slice(0,-1):r}async function e9e(t,e,n){try{const r=await n9e(t,e,n),i=dle("resource.fetch",r);SV(n.replay,i)}catch(r){Dr&&He.error("[Replay] Failed to capture fetch breadcrumb",r)}}function t9e(t,e,n){const{input:r,response:i}=e,s=r?hle(r):void 0,a=xV(s,n.textEncoder),o=i?ule(i.headers.get("content-length")):void 0;a!==void 0&&(t.data.request_body_size=a),o!==void 0&&(t.data.response_body_size=o)}async function n9e(t,e,n){const r=Date.now(),{startTimestamp:i=r,endTimestamp:s=r}=e,{url:a,method:o,status_code:l=0,request_body_size:u,response_body_size:c}=t.data,d=$M(a,n.networkDetailAllowUrls)&&!$M(a,n.networkDetailDenyUrls),f=d?r9e(n,e.input,u):$x(u),h=await i9e(d,n,e.response,c);return{startTimestamp:i,endTimestamp:s,url:a,method:o,statusCode:l,request:f,response:h}}function r9e({networkCaptureBodies:t,networkRequestHeaders:e},n,r){const i=n?o9e(n,e):{};if(!t)return up(i,r,void 0);const s=hle(n),[a,o]=cle(s),l=up(i,r,a);return o?_M(l,o):l}async function i9e(t,{networkCaptureBodies:e,textEncoder:n,networkResponseHeaders:r},i,s){if(!t&&s!==void 0)return $x(s);const a=i?ple(i.headers,r):{};if(!i||!e&&s!==void 0)return up(a,s,void 0);const[o,l]=await a9e(i),u=s9e(o,{networkCaptureBodies:e,textEncoder:n,responseBodySize:s,captureDetails:t,headers:a});return l?_M(u,l):u}function s9e(t,{networkCaptureBodies:e,textEncoder:n,responseBodySize:r,captureDetails:i,headers:s}){try{const a=t&&t.length&&r===void 0?xV(t,n):r;return i?e?up(s,a,t):up(s,a,void 0):$x(a)}catch(a){return Dr&&He.warn("[Replay] Failed to serialize response body",a),up(s,r,void 0)}}async function a9e(t){const e=l9e(t);if(!e)return[void 0,"BODY_PARSE_ERROR"];try{return[await u9e(e)]}catch(n){return Dr&&He.warn("[Replay] Failed to get text body from response",n),[void 0,"BODY_PARSE_ERROR"]}}function hle(t=[]){if(!(t.length!==2||typeof t[1]!="object"))return t[1].body}function ple(t,e){const n={};return e.forEach(r=>{t.get(r)&&(n[r]=t.get(r))}),n}function o9e(t,e){return t.length===1&&typeof t[0]!="string"?Oj(t[0],e):t.length===2?Oj(t[1],e):{}}function Oj(t,e){if(!t)return{};const n=t.headers;return n?n instanceof Headers?ple(n,e):Array.isArray(n)?{}:uL(n,e):{}}function l9e(t){try{return t.clone()}catch(e){Dr&&He.warn("[Replay] Failed to clone response body",e)}}function u9e(t){return new Promise((e,n)=>{const r=setTimeout(()=>n(new Error("Timeout while trying to read response body")),500);c9e(t).then(i=>e(i),i=>n(i)).finally(()=>clearTimeout(r))})}async function c9e(t){return await t.text()}async function d9e(t,e,n){try{const r=h9e(t,e,n),i=dle("resource.xhr",r);SV(n.replay,i)}catch(r){Dr&&He.error("[Replay] Failed to capture xhr breadcrumb",r)}}function f9e(t,e,n){const{xhr:r,input:i}=e;if(!r)return;const s=xV(i,n.textEncoder),a=r.getResponseHeader("content-length")?ule(r.getResponseHeader("content-length")):g9e(r.response,r.responseType,n.textEncoder);s!==void 0&&(t.data.request_body_size=s),a!==void 0&&(t.data.response_body_size=a)}function h9e(t,e,n){const r=Date.now(),{startTimestamp:i=r,endTimestamp:s=r,input:a,xhr:o}=e,{url:l,method:u,status_code:c=0,request_body_size:d,response_body_size:f}=t.data;if(!l)return null;if(!o||!$M(l,n.networkDetailAllowUrls)||$M(l,n.networkDetailDenyUrls)){const M=$x(d),E=$x(f);return{startTimestamp:i,endTimestamp:s,url:l,method:u,statusCode:c,request:M,response:E}}const h=o[jh],p=h?uL(h.request_headers,n.networkRequestHeaders):{},m=uL(p9e(o),n.networkResponseHeaders),[v,g]=n.networkCaptureBodies?cle(a):[void 0],[b,y]=n.networkCaptureBodies?m9e(o):[void 0],x=up(p,d,v),T=up(m,f,b);return{startTimestamp:i,endTimestamp:s,url:l,method:u,statusCode:c,request:g?_M(x,g):x,response:y?_M(T,y):T}}function p9e(t){const e=t.getAllResponseHeaders();return e?e.split(`\r +`).reduce((n,r)=>{const[i,s]=r.split(": ");return n[i.toLowerCase()]=s,n},{}):{}}function m9e(t){const e=[];try{return[t.responseText]}catch(n){e.push(n)}try{return v9e(t.response,t.responseType)}catch(n){e.push(n)}return Dr&&He.warn("[Replay] Failed to get xhr response body",...e),[void 0]}function v9e(t,e){try{if(typeof t=="string")return[t];if(t instanceof Document)return[t.body.outerHTML];if(e==="json"&&t&&typeof t=="object")return[JSON.stringify(t)];if(!t)return[void 0]}catch{return Dr&&He.warn("[Replay] Failed to serialize body",t),[void 0,"BODY_PARSE_ERROR"]}return Dr&&He.info("[Replay] Skipping network body because of body type",t),[void 0,"UNPARSEABLE_BODY_TYPE"]}function g9e(t,e,n){try{const r=e==="json"&&t&&typeof t=="object"?JSON.stringify(t):t;return xV(r,n)}catch{return}}function b9e(t){const e=Rr();try{const n=new TextEncoder,{networkDetailAllowUrls:r,networkDetailDenyUrls:i,networkCaptureBodies:s,networkRequestHeaders:a,networkResponseHeaders:o}=t.getOptions(),l={replay:t,textEncoder:n,networkDetailAllowUrls:r,networkDetailDenyUrls:i,networkCaptureBodies:s,networkRequestHeaders:a,networkResponseHeaders:o};e&&e.on?e.on("beforeAddBreadcrumb",(u,c)=>y9e(l,u,c)):(xC(YVe(t)),TC(HVe(t)))}catch{}}function y9e(t,e,n){if(e.data)try{S9e(e)&&T9e(n)&&(f9e(e,n,t),d9e(e,n,t)),x9e(e)&&w9e(n)&&(t9e(e,n,t),e9e(e,n,t))}catch{Dr&&He.warn("Error when enriching network breadcrumb")}}function S9e(t){return t.category==="xhr"}function x9e(t){return t.category==="fetch"}function T9e(t){return t&&t.xhr}function w9e(t){return t&&t.response}let Ij=null;function E9e(t){return!!t.category}const M9e=t=>e=>{if(!t.isEnabled())return;const n=P9e(e);n&&fT(t,n)};function P9e(t){const e=t.getLastBreadcrumb&&t.getLastBreadcrumb();return Ij===e||!e||(Ij=e,!E9e(e)||["fetch","xhr","sentry.event","sentry.transaction"].includes(e.category)||e.category.startsWith("ui."))?null:e.category==="console"?R9e(e):Cc(e)}function R9e(t){const e=t.data&&t.data.arguments;if(!Array.isArray(e)||e.length===0)return Cc(t);let n=!1;const r=e.map(i=>{if(!i)return i;if(typeof i=="string")return i.length>o2?(n=!0,`${i.slice(0,o2)}…`):i;if(typeof i=="object")try{const s=Rc(i,7);return JSON.stringify(s).length>o2?(n=!0,`${JSON.stringify(s,null,2).slice(0,o2)}…`):s}catch{}return i});return Cc({...t,data:{...t.data,arguments:r,...n?{_meta:{warnings:["CONSOLE_ARG_TRUNCATED"]}}:{}}})}function V9e(t){const e=Fo(),n=Rr();e.addScopeListener(M9e(t)),bae(sVe(t)),uV(jVe(t)),b9e(t);const r=GVe(t,!Uj(n));n&&n.addEventProcessor?n.addEventProcessor(r):XEe(r),Uj(n)&&(n.on("beforeSendEvent",KVe(t)),n.on("afterSendEvent",lle(t)),n.on("createDsc",i=>{const s=t.getSessionId();s&&t.isEnabled()&&t.recordingMode==="session"&&t.checkAndHandleExpiredSession()&&(i.replay_id=s)}),n.on("startTransaction",i=>{t.lastTransaction=i}),n.on("finishTransaction",i=>{t.lastTransaction=i}),n.on("beforeSendFeedback",(i,s)=>{const a=t.getSessionId();s&&s.includeReplay&&t.isEnabled()&&a&&i.contexts&&i.contexts.feedback&&(i.contexts.feedback.replay_id=a)}))}function Uj(t){return!!(t&&t.on)}async function z9e(t){try{return Promise.all(yV(t,[k9e(Hr.performance.memory)]))}catch{return[]}}function k9e(t){const{jsHeapSizeLimit:e,totalJSHeapSize:n,usedJSHeapSize:r}=t,i=Date.now()/1e3;return{type:"memory",name:"memory",start:i,end:i,data:{memory:{jsHeapSizeLimit:e,totalJSHeapSize:n,usedJSHeapSize:r}}}}function O9e(t,e,n){let r,i,s;const a=n&&n.maxWait?Math.max(n.maxWait,e):0;function o(){return l(),r=t(),r}function l(){i!==void 0&&clearTimeout(i),s!==void 0&&clearTimeout(s),i=s=void 0}function u(){return i!==void 0||s!==void 0?o():r}function c(){return i&&clearTimeout(i),i=setTimeout(o,e),a&&s===void 0&&(s=setTimeout(o,a)),r}return c.cancel=l,c.flush=u,c}function I9e(t){let e=!1;return(n,r)=>{if(!t.checkAndHandleExpiredSession()){Dr&&He.warn("[Replay] Received replay event after session expired.");return}const i=r||!e;e=!0,t.clickDetector&&eVe(t.clickDetector,n),t.addUpdate(()=>{if(t.recordingMode==="buffer"&&i&&t.setInitialState(),!YC(t,n,i))return!0;if(!i)return!1;if(N9e(t,i),t.session&&t.session.previousSessionId)return!0;if(t.recordingMode==="buffer"&&t.session&&t.eventBuffer){const s=t.eventBuffer.getEarliestTimestamp();s&&(Ya(`[Replay] Updating session start time to earliest event in buffer to ${new Date(s)}`,t.getOptions()._experiments.traceInternals),t.session.started=s,t.getOptions().stickySession&&JC(t.session))}return t.recordingMode==="session"&&t.flush(),!0})}}function U9e(t){const e=t.getOptions();return{type:xn.Custom,timestamp:Date.now(),data:{tag:"options",payload:{shouldRecordCanvas:t.isRecordingCanvas(),sessionSampleRate:e.sessionSampleRate,errorSampleRate:e.errorSampleRate,useCompressionOption:e.useCompression,blockAllMedia:e.blockAllMedia,maskAllText:e.maskAllText,maskAllInputs:e.maskAllInputs,useCompression:t.eventBuffer?t.eventBuffer.type==="worker":!1,networkDetailHasUrls:e.networkDetailAllowUrls.length>0,networkCaptureBodies:e.networkCaptureBodies,networkRequestHasHeaders:e.networkRequestHeaders.length>0,networkResponseHasHeaders:e.networkResponseHeaders.length>0}}}}function N9e(t,e){!e||!t.session||t.session.segmentId!==0||YC(t,U9e(t),!1)}function L9e(t,e,n,r){return Hp(Pae(t,MC(t),r,n),[[{type:"replay_event"},t],[{type:"replay_recording",length:typeof e=="string"?new TextEncoder().encode(e).length:e.length},e]])}function X9e({recordingData:t,headers:e}){let n;const r=`${JSON.stringify(e)} +`;if(typeof t=="string")n=`${r}${t}`;else{const s=new TextEncoder().encode(r);n=new Uint8Array(s.length+t.length),n.set(s),n.set(t,s.length)}return n}async function C9e({client:t,scope:e,replayId:n,event:r}){const i=typeof t._integrations=="object"&&t._integrations!==null&&!Array.isArray(t._integrations)?Object.keys(t._integrations):void 0,s={event_id:n,integrations:i};t.emit&&t.emit("preprocessEvent",r,s);const a=await Iae(t.getOptions(),r,s,e,t,Qp());if(!a)return null;a.platform=a.platform||"javascript";const o=t.getSdkMetadata&&t.getSdkMetadata(),{name:l,version:u}=o&&o.sdk||{};return a.sdk={...a.sdk,name:l||"sentry.javascript.unknown",version:u||"0.0.0"},a}async function K9e({recordingData:t,replayId:e,segmentId:n,eventContext:r,timestamp:i,session:s}){const a=X9e({recordingData:t,headers:{segment_id:n}}),{urls:o,errorIds:l,traceIds:u,initialTimestamp:c}=r,d=Rr(),f=Fo(),h=d&&d.getTransport(),p=d&&d.getDsn();if(!d||!h||!p||!s.sampled)return;const m={type:TPe,replay_start_timestamp:c/1e3,timestamp:i/1e3,error_ids:l,trace_ids:u,urls:o,replay_id:e,segment_id:n,replay_type:s.sampled},v=await C9e({scope:f,client:d,replayId:e,event:m});if(!v){d.recordDroppedEvent("event_processor","replay",m),Ya("An event processor returned `null`, will not send event.");return}delete v.sdkProcessingMetadata;const g=L9e(v,a,p,d.getOptions().tunnel);let b;try{b=await h.send(g)}catch(x){const T=new Error(CC);try{T.cause=x}catch{}throw T}if(!b)return b;if(typeof b.statusCode=="number"&&(b.statusCode<200||b.statusCode>=300))throw new mle(b.statusCode);const y=Vae({},b);if(Rae(y,"replay"))throw new vle(y);return b}class mle extends Error{constructor(e){super(`Transport returned status code ${e}`)}}class vle extends Error{constructor(e){super("Rate limit hit"),this.rateLimits=e}}async function gle(t,e={count:0,interval:VPe}){const{recordingData:n,options:r}=t;if(n.length)try{return await K9e(t),!0}catch(i){if(i instanceof mle||i instanceof vle)throw i;if(Z5e("Replays",{_retryCount:e.count}),Dr&&r._experiments&&r._experiments.captureExceptions&&ay(i),e.count>=zPe){const s=new Error(`${CC} - max retries exceeded`);try{s.cause=i}catch{}throw s}return e.interval*=++e.count,new Promise((s,a)=>{setTimeout(async()=>{try{await gle(t,e),s(!0)}catch(o){a(o)}},e.interval)})}}const ble="__THROTTLED",q9e="__SKIPPED";function D9e(t,e,n){const r=new Map,i=o=>{const l=o-n;r.forEach((u,c)=>{c[...r.values()].reduce((o,l)=>o+l,0);let a=!1;return(...o)=>{const l=Math.floor(Date.now()/1e3);if(i(l),s()>=e){const c=a;return a=!0,c?q9e:ble}a=!1;const u=r.get(l)||0;return r.set(l,u+1),t(...o)}}class Ih{constructor({options:e,recordingOptions:n}){Ih.prototype.__init.call(this),Ih.prototype.__init2.call(this),Ih.prototype.__init3.call(this),Ih.prototype.__init4.call(this),Ih.prototype.__init5.call(this),Ih.prototype.__init6.call(this),this.eventBuffer=null,this.performanceEntries=[],this.replayPerformanceEntries=[],this.recordingMode="session",this.timeouts={sessionIdlePause:wPe,sessionIdleExpire:EPe},this._lastActivity=Date.now(),this._isEnabled=!1,this._isPaused=!1,this._hasInitializedCoreListeners=!1,this._context={errorIds:new Set,traceIds:new Set,urls:[],initialTimestamp:Date.now(),initialUrl:""},this._recordingOptions=n,this._options=e,this._debouncedFlush=O9e(()=>this._flush(),this._options.flushMinDelay,{maxWait:this._options.flushMaxDelay}),this._throttledAddEvent=D9e((a,o)=>IVe(this,a,o),300,5);const{slowClickTimeout:r,slowClickIgnoreSelectors:i}=this.getOptions(),s=r?{threshold:Math.min(kPe,r),timeout:r,scrollTimeout:OPe,ignoreSelector:i?i.join(","):""}:void 0;s&&(this.clickDetector=new HRe(this,s))}getContext(){return this._context}isEnabled(){return this._isEnabled}isPaused(){return this._isPaused}isRecordingCanvas(){return!!this._canvas}getOptions(){return this._options}initializeSampling(e){const{errorSampleRate:n,sessionSampleRate:r}=this._options;if(!(n<=0&&r<=0)){if(this._initializeSessionForSampling(e),!this.session){this._handleException(new Error("Unable to initialize and create session"));return}this.session.sampled!==!1&&(this.recordingMode=this.session.sampled==="buffer"&&this.session.segmentId===0?"buffer":"session",U1(`[Replay] Starting replay in ${this.recordingMode} mode`,this._options._experiments.traceInternals),this._initializeRecording())}}start(){if(this._isEnabled&&this.recordingMode==="session")throw new Error("Replay recording is already in progress");if(this._isEnabled&&this.recordingMode==="buffer")throw new Error("Replay buffering is in progress, call `flush()` to save the replay");U1("[Replay] Starting replay in session mode",this._options._experiments.traceInternals),this._updateUserActivity();const e=$z({maxReplayDuration:this._options.maxReplayDuration,sessionIdleExpire:this.timeouts.sessionIdleExpire,traceInternals:this._options._experiments.traceInternals},{stickySession:this._options.stickySession,sessionSampleRate:1,allowBuffering:!1});this.session=e,this._initializeRecording()}startBuffering(){if(this._isEnabled)throw new Error("Replay recording is already in progress");U1("[Replay] Starting replay in buffer mode",this._options._experiments.traceInternals);const e=$z({sessionIdleExpire:this.timeouts.sessionIdleExpire,maxReplayDuration:this._options.maxReplayDuration,traceInternals:this._options._experiments.traceInternals},{stickySession:this._options.stickySession,sessionSampleRate:0,allowBuffering:!0});this.session=e,this.recordingMode="buffer",this._initializeRecording()}startRecording(){try{const e=this._canvas;this._stopRecording=lp({...this._recordingOptions,...this.recordingMode==="buffer"&&{checkoutEveryNms:RPe},emit:I9e(this),onMutation:this._onMutationHandler,...e?{recordCanvas:e.recordCanvas,getCanvasManager:e.getCanvasManager,sampling:e.sampling,dataURLOptions:e.dataURLOptions}:{}})}catch(e){this._handleException(e)}}stopRecording(){try{return this._stopRecording&&(this._stopRecording(),this._stopRecording=void 0),!0}catch(e){return this._handleException(e),!1}}async stop({forceFlush:e=!1,reason:n}={}){if(this._isEnabled){this._isEnabled=!1;try{Ya(`[Replay] Stopping Replay${n?` triggered by ${n}`:""}`,this._options._experiments.traceInternals),this._removeListeners(),this.stopRecording(),this._debouncedFlush.cancel(),e&&await this._flush({force:!0}),this.eventBuffer&&this.eventBuffer.destroy(),this.eventBuffer=null,RVe(this)}catch(r){this._handleException(r)}}}pause(){this._isPaused||(this._isPaused=!0,this.stopRecording(),Ya("[Replay] Pausing replay",this._options._experiments.traceInternals))}resume(){!this._isPaused||!this._checkSession()||(this._isPaused=!1,this.startRecording(),Ya("[Replay] Resuming replay",this._options._experiments.traceInternals))}async sendBufferedReplayOrFlush({continueRecording:e=!0}={}){if(this.recordingMode==="session")return this.flushImmediate();const n=Date.now();Ya("[Replay] Converting buffer to session",this._options._experiments.traceInternals),await this.flushImmediate();const r=this.stopRecording();!e||!r||this.recordingMode!=="session"&&(this.recordingMode="session",this.session&&(this._updateUserActivity(n),this._updateSessionActivity(n),this._maybeSaveSession()),this.startRecording())}addUpdate(e){const n=e();this.recordingMode!=="buffer"&&n!==!0&&this._debouncedFlush()}triggerUserActivity(){if(this._updateUserActivity(),!this._stopRecording){if(!this._checkSession())return;this.resume();return}this.checkAndHandleExpiredSession(),this._updateSessionActivity()}updateUserActivity(){this._updateUserActivity(),this._updateSessionActivity()}conditionalFlush(){return this.recordingMode==="buffer"?Promise.resolve():this.flushImmediate()}flush(){return this._debouncedFlush()}flushImmediate(){return this._debouncedFlush(),this._debouncedFlush.flush()}cancelFlush(){this._debouncedFlush.cancel()}getSessionId(){return this.session&&this.session.id}checkAndHandleExpiredSession(){if(this._lastActivity&&oL(this._lastActivity,this.timeouts.sessionIdlePause)&&this.session&&this.session.sampled==="session"){this.pause();return}return!!this._checkSession()}setInitialState(){const e=`${Hr.location.pathname}${Hr.location.hash}${Hr.location.search}`,n=`${Hr.location.origin}${e}`;this.performanceEntries=[],this.replayPerformanceEntries=[],this._clearContext(),this._context.initialUrl=n,this._context.initialTimestamp=Date.now(),this._context.urls.push(n)}throttledAddEvent(e,n){const r=this._throttledAddEvent(e,n);if(r===ble){const i=Cc({category:"replay.throttled"});this.addUpdate(()=>!YC(this,{type:FRe,timestamp:i.timestamp||0,data:{tag:"breadcrumb",payload:i,metric:!0}}))}return r}getCurrentRoute(){const e=this.lastTransaction||Fo().getTransaction(),r=(e&&As(e).data||{})[Nu];if(!(!e||!r||!["route","custom"].includes(r)))return As(e).description}_initializeRecording(){this.setInitialState(),this._updateSessionActivity(),this.eventBuffer=EVe({useCompression:this._options.useCompression,workerUrl:this._options.workerUrl}),this._removeListeners(),this._addListeners(),this._isEnabled=!0,this._isPaused=!1,this.startRecording()}_handleException(e){Dr&&He.error("[Replay]",e),Dr&&this._options._experiments&&this._options._experiments.captureExceptions&&ay(e)}_initializeSessionForSampling(e){const n=this._options.errorSampleRate>0,r=$z({sessionIdleExpire:this.timeouts.sessionIdleExpire,maxReplayDuration:this._options.maxReplayDuration,traceInternals:this._options._experiments.traceInternals,previousSessionId:e},{stickySession:this._options.stickySession,sessionSampleRate:this._options.sessionSampleRate,allowBuffering:n});this.session=r}_checkSession(){if(!this.session)return!1;const e=this.session;return sle(e,{sessionIdleExpire:this.timeouts.sessionIdleExpire,maxReplayDuration:this._options.maxReplayDuration})?(this._refreshSession(e),!1):!0}async _refreshSession(e){this._isEnabled&&(await this.stop({reason:"refresh session"}),this.initializeSampling(e.id))}_addListeners(){try{Hr.document.addEventListener("visibilitychange",this._handleVisibilityChange),Hr.addEventListener("blur",this._handleWindowBlur),Hr.addEventListener("focus",this._handleWindowFocus),Hr.addEventListener("keydown",this._handleKeyboardEvent),this.clickDetector&&this.clickDetector.addListeners(),this._hasInitializedCoreListeners||(V9e(this),this._hasInitializedCoreListeners=!0)}catch(e){this._handleException(e)}this._performanceCleanupCallback=bVe(this)}_removeListeners(){try{Hr.document.removeEventListener("visibilitychange",this._handleVisibilityChange),Hr.removeEventListener("blur",this._handleWindowBlur),Hr.removeEventListener("focus",this._handleWindowFocus),Hr.removeEventListener("keydown",this._handleKeyboardEvent),this.clickDetector&&this.clickDetector.removeListeners(),this._performanceCleanupCallback&&this._performanceCleanupCallback()}catch(e){this._handleException(e)}}__init(){this._handleVisibilityChange=()=>{Hr.document.visibilityState==="visible"?this._doChangeToForegroundTasks():this._doChangeToBackgroundTasks()}}__init2(){this._handleWindowBlur=()=>{const e=Cc({category:"ui.blur"});this._doChangeToBackgroundTasks(e)}}__init3(){this._handleWindowFocus=()=>{const e=Cc({category:"ui.focus"});this._doChangeToForegroundTasks(e)}}__init4(){this._handleKeyboardEvent=e=>{uVe(this,e)}}_doChangeToBackgroundTasks(e){!this.session||ile(this.session,{maxReplayDuration:this._options.maxReplayDuration,sessionIdleExpire:this.timeouts.sessionIdleExpire})||(e&&this._createCustomBreadcrumb(e),this.conditionalFlush())}_doChangeToForegroundTasks(e){if(!this.session)return;if(!this.checkAndHandleExpiredSession()){Ya("[Replay] Document has become active, but session has expired");return}e&&this._createCustomBreadcrumb(e)}_updateUserActivity(e=Date.now()){this._lastActivity=e}_updateSessionActivity(e=Date.now()){this.session&&(this.session.lastActivity=e,this._maybeSaveSession())}_createCustomBreadcrumb(e){this.addUpdate(()=>{this.throttledAddEvent({type:xn.Custom,timestamp:e.timestamp||0,data:{tag:"breadcrumb",payload:e}})})}_addPerformanceEntries(){const e=fVe(this.performanceEntries).concat(this.replayPerformanceEntries);return this.performanceEntries=[],this.replayPerformanceEntries=[],Promise.all(yV(this,e))}_clearContext(){this._context.errorIds.clear(),this._context.traceIds.clear(),this._context.urls=[]}_updateInitialTimestampFromEventBuffer(){const{session:e,eventBuffer:n}=this;if(!e||!n||e.segmentId)return;const r=n.getEarliestTimestamp();r&&rthis._options.maxReplayDuration+3e4)throw new Error("Session is too long, not sending replay");const r=this._popEventContext(),i=this.session.segmentId++;this._maybeSaveSession();const s=await this.eventBuffer.finish();await gle({replayId:e,recordingData:s,segmentId:i,eventContext:r,session:this.session,options:this.getOptions(),timestamp:n})}catch(n){this._handleException(n),this.stop({reason:"sendReplay"});const r=Rr();r&&r.recordDroppedEvent("send_error","replay")}}__init5(){this._flush=async({force:e=!1}={})=>{if(!this._isEnabled&&!e)return;if(!this.checkAndHandleExpiredSession()){Dr&&He.error("[Replay] Attempting to finish replay event after session expired.");return}if(!this.session)return;const n=this.session.started,i=Date.now()-n;this._debouncedFlush.cancel();const s=ithis._options.maxReplayDuration+5e3;if(s||a){Ya(`[Replay] Session duration (${Math.floor(i/1e3)}s) is too ${s?"short":"long"}, not sending replay.`,this._options._experiments.traceInternals),s&&this._debouncedFlush();return}const o=this.eventBuffer;if(o&&this.session.segmentId===0&&!o.hasCheckout&&Ya("[Replay] Flushing initial segment without checkout.",this._options._experiments.traceInternals),!this._flushLock){this._flushLock=this._runFlush(),await this._flushLock,this._flushLock=void 0;return}try{await this._flushLock}catch(l){Dr&&He.error(l)}finally{this._debouncedFlush()}}}_maybeSaveSession(){this.session&&this._options.stickySession&&JC(this.session)}__init6(){this._onMutationHandler=e=>{const n=e.length,r=this._options.mutationLimit,i=this._options.mutationBreadcrumbLimit,s=r&&n>r;if(n>i||s){const a=Cc({category:"replay.mutations",data:{count:n,limit:s}});this._createCustomBreadcrumb(a)}return s?(this.stop({reason:"mutationLimit",forceFlush:this.recordingMode==="session"}),!1):!0}}}function yS(t,e,n,r){const i=typeof r=="string"?r.split(","):[],s=[...t,...i,...e];return typeof n<"u"&&(typeof n=="string"&&s.push(`.${n}`),Qc(()=>{console.warn("[Replay] You are using a deprecated configuration item for privacy. Read the documentation on how to use the new privacy configuration.")})),s.join(",")}function W9e({mask:t,unmask:e,block:n,unblock:r,ignore:i,blockClass:s,blockSelector:a,maskTextClass:o,maskTextSelector:l,ignoreClass:u}){const c=['base[href="/"]'],d=yS(t,[".sentry-mask","[data-sentry-mask]"],o,l),f=yS(e,[".sentry-unmask","[data-sentry-unmask]"]),h={maskTextSelector:d,unmaskTextSelector:f,blockSelector:yS(n,[".sentry-block","[data-sentry-block]",...c],s,a),unblockSelector:yS(r,[".sentry-unblock","[data-sentry-unblock]"]),ignoreSelector:yS(i,[".sentry-ignore","[data-sentry-ignore]",'input[type="file"]'],u)};return s instanceof RegExp&&(h.blockClass=s),o instanceof RegExp&&(h.maskTextClass=o),h}function A9e({el:t,key:e,maskAttributes:n,maskAllText:r,privacyOptions:i,value:s}){return!r||i.unmaskTextSelector&&t.matches(i.unmaskTextSelector)?s:n.includes(e)||e==="value"&&t.tagName==="INPUT"&&["submit","button"].includes(t.getAttribute("type")||"")?s.replace(/[\S]/g,"*"):s}const Nj='img,image,svg,video,object,picture,embed,map,audio,link[rel="icon"],link[rel="apple-touch-icon"]',G9e=["content-length","content-type","accept"];let Lj=!1;class TV{static __initStatic(){this.id="Replay"}constructor({flushMinDelay:e=MPe,flushMaxDelay:n=PPe,minReplayDuration:r=IPe,maxReplayDuration:i=mj,stickySession:s=!0,useCompression:a=!0,workerUrl:o,_experiments:l={},sessionSampleRate:u,errorSampleRate:c,maskAllText:d=!0,maskAllInputs:f=!0,blockAllMedia:h=!0,mutationBreadcrumbLimit:p=750,mutationLimit:m=1e4,slowClickTimeout:v=7e3,slowClickIgnoreSelectors:g=[],networkDetailAllowUrls:b=[],networkDetailDenyUrls:y=[],networkCaptureBodies:x=!0,networkRequestHeaders:T=[],networkResponseHeaders:M=[],mask:E=[],maskAttributes:S=["title","placeholder"],unmask:P=[],block:R=[],unblock:V=[],ignore:z=[],maskFn:k,beforeAddRecordingEvent:N,beforeErrorSampling:q,blockClass:L,blockSelector:A,maskInputOptions:J,maskTextClass:F,maskTextSelector:ne,ignoreClass:j}={}){this.name=TV.id;const Z=W9e({mask:E,unmask:P,block:R,unblock:V,ignore:z,blockClass:L,blockSelector:A,maskTextClass:F,maskTextSelector:ne,ignoreClass:j});if(this._recordingOptions={maskAllInputs:f,maskAllText:d,maskInputOptions:{...J||{},password:!0},maskTextFn:k,maskInputFn:k,maskAttributeFn:(_,le,fe)=>A9e({maskAttributes:S,maskAllText:d,privacyOptions:Z,key:_,value:le,el:fe}),...Z,slimDOMOptions:"all",inlineStylesheet:!0,inlineImages:!1,collectFonts:!0,errorHandler:_=>{try{_.__rrweb__=!0}catch{}}},this._initialOptions={flushMinDelay:e,flushMaxDelay:n,minReplayDuration:Math.min(r,UPe),maxReplayDuration:Math.min(i,mj),stickySession:s,sessionSampleRate:u,errorSampleRate:c,useCompression:a,workerUrl:o,blockAllMedia:h,maskAllInputs:f,maskAllText:d,mutationBreadcrumbLimit:p,mutationLimit:m,slowClickTimeout:v,slowClickIgnoreSelectors:g,networkDetailAllowUrls:b,networkDetailDenyUrls:y,networkCaptureBodies:x,networkRequestHeaders:Xj(T),networkResponseHeaders:Xj(M),beforeAddRecordingEvent:N,beforeErrorSampling:q,_experiments:l},typeof u=="number"&&(console.warn(`[Replay] You are passing \`sessionSampleRate\` to the Replay integration. This option is deprecated and will be removed soon. Instead, configure \`replaysSessionSampleRate\` directly in the SDK init options, e.g.: Sentry.init({ replaysSessionSampleRate: ${u} })`),this._initialOptions.sessionSampleRate=u),typeof c=="number"&&(console.warn(`[Replay] You are passing \`errorSampleRate\` to the Replay integration. This option is deprecated and will be removed soon. Instead, configure \`replaysOnErrorSampleRate\` directly in the SDK init options, e.g.: -Sentry.init({ replaysOnErrorSampleRate: ${c} })`),this._initialOptions.errorSampleRate=c),this._initialOptions.blockAllMedia&&(this._recordingOptions.blockSelector=this._recordingOptions.blockSelector?`${this._recordingOptions.blockSelector},${Xj}`:Xj),this._isInitialized&&CF())throw new Error("Multiple Sentry Session Replay instances are not supported");this._isInitialized=!0}get _isInitialized(){return Cj}set _isInitialized(e){Cj=e}setupOnce(){CF()&&(this._setup(),setTimeout(()=>this._initialize()))}start(){this._replay&&this._replay.start()}startBuffering(){this._replay&&this._replay.startBuffering()}stop(){return this._replay?this._replay.stop({forceFlush:this._replay.recordingMode==="session"}):Promise.resolve()}flush(e){return!this._replay||!this._replay.isEnabled()?Promise.resolve():this._replay.sendBufferedReplayOrFlush(e)}getReplayId(){if(!(!this._replay||!this._replay.isEnabled()))return this._replay.getSessionId()}_initialize(){this._replay&&(this._maybeLoadFromReplayCanvasIntegration(),this._replay.initializeSampling())}_setup(){const e=G9e(this._initialOptions);this._replay=new Ih({options:e,recordingOptions:this._recordingOptions})}_maybeLoadFromReplayCanvasIntegration(){try{const n=Rr().getIntegrationByName("ReplayCanvas");if(!n)return;this._replay._canvas=n.getOptions()}catch{}}}TV.__initStatic();function G9e(t){const e=Rr(),n=e&&e.getOptions(),r={sessionSampleRate:0,errorSampleRate:0,...to(t)};return n?(t.sessionSampleRate==null&&t.errorSampleRate==null&&n.replaysSessionSampleRate==null&&n.replaysOnErrorSampleRate==null&&Qc(()=>{console.warn("Replay is disabled because neither `replaysSessionSampleRate` nor `replaysOnErrorSampleRate` are set.")}),typeof n.replaysSessionSampleRate=="number"&&(r.sessionSampleRate=n.replaysSessionSampleRate),typeof n.replaysOnErrorSampleRate=="number"&&(r.errorSampleRate=n.replaysOnErrorSampleRate),r):(Qc(()=>{console.warn("SDK client is not available.")}),r)}function Kj(t){return[...A9e,...t.map(e=>e.toLowerCase())]}var Ks=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function wV(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}function Sle(t){if(t.__esModule)return t;var e=t.default;if(typeof e=="function"){var n=function r(){return this instanceof r?Reflect.construct(e,arguments,this.constructor):e.apply(this,arguments)};n.prototype=e.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(t).forEach(function(r){var i=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(n,r,i.get?i:{enumerable:!0,get:function(){return t[r]}})}),n}const xle=["activate","mount","update"],F9e=/(?:^|[-_])(\w)/g,j9e=t=>t.replace(F9e,e=>e.toUpperCase()).replace(/[-_]/g,""),Z9e="",ek="",J9e=(t,e)=>t.repeat?t.repeat(e):t,nx=(t,e)=>{if(!t)return ek;if(t.$root===t)return Z9e;if(!t.$options)return ek;const n=t.$options;let r=n.name||n._componentTag;const i=n.__file;if(!r&&i){const s=i.match(/([^/\\]+)\.vue$/);s&&(r=s[1])}return(r?`<${j9e(r)}>`:ek)+(i&&e!==!1?` at ${i}`:"")},Y9e=t=>{if(t&&(t._isVue||t.__isVue)&&t.$parent){const e=[];let n=0;for(;t;){if(e.length>0){const i=e[e.length-1];if(i.constructor===t.constructor){n++,t=t.$parent;continue}else n>0&&(e[e.length-1]=[i,n],n=0)}e.push(t),t=t.$parent}return` +Sentry.init({ replaysOnErrorSampleRate: ${c} })`),this._initialOptions.errorSampleRate=c),this._initialOptions.blockAllMedia&&(this._recordingOptions.blockSelector=this._recordingOptions.blockSelector?`${this._recordingOptions.blockSelector},${Nj}`:Nj),this._isInitialized&&LF())throw new Error("Multiple Sentry Session Replay instances are not supported");this._isInitialized=!0}get _isInitialized(){return Lj}set _isInitialized(e){Lj=e}setupOnce(){LF()&&(this._setup(),setTimeout(()=>this._initialize()))}start(){this._replay&&this._replay.start()}startBuffering(){this._replay&&this._replay.startBuffering()}stop(){return this._replay?this._replay.stop({forceFlush:this._replay.recordingMode==="session"}):Promise.resolve()}flush(e){return!this._replay||!this._replay.isEnabled()?Promise.resolve():this._replay.sendBufferedReplayOrFlush(e)}getReplayId(){if(!(!this._replay||!this._replay.isEnabled()))return this._replay.getSessionId()}_initialize(){this._replay&&(this._maybeLoadFromReplayCanvasIntegration(),this._replay.initializeSampling())}_setup(){const e=F9e(this._initialOptions);this._replay=new Ih({options:e,recordingOptions:this._recordingOptions})}_maybeLoadFromReplayCanvasIntegration(){try{const n=Rr().getIntegrationByName("ReplayCanvas");if(!n)return;this._replay._canvas=n.getOptions()}catch{}}}TV.__initStatic();function F9e(t){const e=Rr(),n=e&&e.getOptions(),r={sessionSampleRate:0,errorSampleRate:0,...to(t)};return n?(t.sessionSampleRate==null&&t.errorSampleRate==null&&n.replaysSessionSampleRate==null&&n.replaysOnErrorSampleRate==null&&Qc(()=>{console.warn("Replay is disabled because neither `replaysSessionSampleRate` nor `replaysOnErrorSampleRate` are set.")}),typeof n.replaysSessionSampleRate=="number"&&(r.sessionSampleRate=n.replaysSessionSampleRate),typeof n.replaysOnErrorSampleRate=="number"&&(r.errorSampleRate=n.replaysOnErrorSampleRate),r):(Qc(()=>{console.warn("SDK client is not available.")}),r)}function Xj(t){return[...G9e,...t.map(e=>e.toLowerCase())]}var Ks=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function wV(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}function yle(t){if(t.__esModule)return t;var e=t.default;if(typeof e=="function"){var n=function r(){return this instanceof r?Reflect.construct(e,arguments,this.constructor):e.apply(this,arguments)};n.prototype=e.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(t).forEach(function(r){var i=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(n,r,i.get?i:{enumerable:!0,get:function(){return t[r]}})}),n}const Sle=["activate","mount","update"],j9e=/(?:^|[-_])(\w)/g,Z9e=t=>t.replace(j9e,e=>e.toUpperCase()).replace(/[-_]/g,""),J9e="",ek="",Y9e=(t,e)=>t.repeat?t.repeat(e):t,tx=(t,e)=>{if(!t)return ek;if(t.$root===t)return J9e;if(!t.$options)return ek;const n=t.$options;let r=n.name||n._componentTag;const i=n.__file;if(!r&&i){const s=i.match(/([^/\\]+)\.vue$/);s&&(r=s[1])}return(r?`<${Z9e(r)}>`:ek)+(i&&e!==!1?` at ${i}`:"")},B9e=t=>{if(t&&(t._isVue||t.__isVue)&&t.$parent){const e=[];let n=0;for(;t;){if(e.length>0){const i=e[e.length-1];if(i.constructor===t.constructor){n++,t=t.$parent;continue}else n>0&&(e[e.length-1]=[i,n],n=0)}e.push(t),t=t.$parent}return` found in -${e.map((i,s)=>`${(s===0?"---> ":J9e(" ",5+s*2))+(Array.isArray(i)?`${nx(i[0])}... (${i[1]} recursive calls)`:nx(i))}`).join(` +${e.map((i,s)=>`${(s===0?"---> ":Y9e(" ",5+s*2))+(Array.isArray(i)?`${tx(i[0])}... (${i[1]} recursive calls)`:tx(i))}`).join(` `)}`}return` -(found in ${nx(t)})`},B9e=(t,e)=>{const{errorHandler:n,warnHandler:r,silent:i}=t.config;t.config.errorHandler=(s,a,o)=>{const l=nx(a,!1),u=a?Y9e(a):"",c={componentName:l,lifecycleHook:o,trace:u};if(e.attachProps&&a&&(a.$options&&a.$options.propsData?c.propsData=a.$options.propsData:a.$props&&(c.propsData=a.$props)),setTimeout(()=>{ay(s,{captureContext:{contexts:{vue:c}},mechanism:{handled:!1}})}),typeof n=="function"&&n.call(t,s,a,o),e.logErrors){const d=typeof console<"u",f=`Error in ${o}: "${s&&s.toString()}"`;r?r.call(null,f,a,u):d&&!i&&Qc(()=>{console.error(`[Vue warn]: ${f}${u}`)})}}},H9e=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,qj="ui.vue",Q9e={activate:["activated","deactivated"],create:["beforeCreate","created"],unmount:["beforeUnmount","unmounted"],destroy:["beforeDestroy","destroyed"],mount:["beforeMount","mounted"],update:["beforeUpdate","updated"]};function _9e(){return jo().getTransaction()}function $9e(t,e,n){t.$_sentryRootSpanTimer&&clearTimeout(t.$_sentryRootSpanTimer),t.$_sentryRootSpanTimer=setTimeout(()=>{t.$root&&t.$root.$_sentryRootSpan&&(t.$root.$_sentryRootSpan.end(e),t.$root.$_sentryRootSpan=void 0)},n)}const eze=t=>{const e=(t.hooks||[]).concat(xle).filter((r,i,s)=>s.indexOf(r)===i),n={};for(const r of e){const i=Q9e[r];if(!i){H9e&&He.warn(`Unknown hook: ${r}`);continue}for(const s of i)n[s]=function(){const a=this.$root===this;a&&BN()&&(this.$_sentryRootSpan=this.$_sentryRootSpan||WM({name:"Application Render",op:`${qj}.render`,origin:"auto.ui.vue"}));const o=nx(this,!1),l=Array.isArray(t.trackComponents)?t.trackComponents.indexOf(o)>-1:t.trackComponents;if(!(!a&&!l))if(this.$_sentrySpans=this.$_sentrySpans||{},s==i[0]){if(this.$root&&this.$root.$_sentryRootSpan||BN()){const c=this.$_sentrySpans[r];c&&c.end(),this.$_sentrySpans[r]=WM({name:`Vue <${o}>`,op:`${qj}.${r}`,origin:"auto.ui.vue"})}}else{const u=this.$_sentrySpans[r];if(!u)return;u.end(),$9e(this,sy(),t.timeout)}}}return n},tze=Gn,nze={Vue:tze.Vue,attachProps:!0,logErrors:!0,hooks:xle,timeout:2e3,trackComponents:!1},Tle="Vue",rze=(t={})=>({name:Tle,setupOnce(){},setup(e){ize(e,t)}}),wle=rze;Xf(Tle,wle);function ize(t,e){const n={...nze,...t.getOptions(),...e};if(!n.Vue&&!n.app){Qc(()=>{console.warn("[@sentry/vue]: Misconfigured SDK. Vue specific errors will not be captured.\nUpdate your `Sentry.init` call with an appropriate config option:\n`app` (Application Instance - Vue 3) or `Vue` (Vue Constructor - Vue 2).")});return}n.app?yC(n.app).forEach(i=>Dj(i,n)):n.Vue&&Dj(n.Vue,n)}const Dj=(t,e)=>{const n=t;(n._instance&&n._instance.isMounted)===!0&&Qc(()=>{console.warn("[@sentry/vue]: Misconfigured SDK. Vue app is already mounted. Make sure to call `app.mount()` after `Sentry.init()`.")}),B9e(t,e),v0(e)&&t.mixin(eze({...e,...e.tracingOptions}))};function sze(t={}){const e={_metadata:{sdk:{name:"sentry.javascript.vue",packages:[{name:"npm:@sentry/vue",version:Hx}],version:Hx}},defaultIntegrations:[...Ooe(),wle()],...t};yPe(e)}function aze(t,e={}){return(n,r=!0,i=!0)=>{r&&gr&&gr.location&&n({name:gr.location.pathname,op:"pageload",attributes:{[_d]:"auto.pageload.vue",[Nu]:"url"}}),oze(t,{routeLabel:e.routeLabel||"name",instrumentNavigation:i,instrumentPageLoad:r},n)}}function oze(t,e,n){t.onError(r=>ay(r,{mechanism:{handled:!1}})),t.beforeEach((r,i,s)=>{const a=i.name==null&&i.matched.length===0,o={[_d]:"auto.navigation.vue"};for(const c of Object.keys(r.params))o[`params.${c}`]=r.params[c];for(const c of Object.keys(r.query)){const d=r.query[c];d&&(o[`query.${c}`]=d)}let l=r.path,u="url";if(r.name&&e.routeLabel!=="path"?(l=r.name.toString(),u="custom"):r.matched[0]&&r.matched[0].path&&(l=r.matched[0].path,u="route"),e.instrumentPageLoad&&a){const c=_9e();c&&((As(c).data||{})[Nu]!=="custom"&&(c.updateName(l),c.setAttribute(Nu,u)),c.setAttributes({...o,[_d]:"auto.pageload.vue"}))}e.instrumentNavigation&&!a&&(o[Nu]=u,n({name:l,op:"navigation",attributes:o})),s&&s()})}function ef(t,e){const n=new Date().toTimeString();F5e(t,e),console.log(`[Sentry] - Severity: ${e}, Info: ${t} at ${n}`)}function lze(t){const e=new Date().toTimeString();ay(t),console.log(`[Sentry] - Error: ${t.name} at ${e}`)}function uze(t,e,n){let r=ze(n==null?void 0:n.value),i=et(()=>t.value!==void 0);return[et(()=>i.value?t.value:r.value),function(s){return i.value||(r.value=s),e==null?void 0:e(s)}]}function BC(t){typeof queueMicrotask=="function"?queueMicrotask(t):Promise.resolve().then(t).catch(e=>setTimeout(()=>{throw e}))}function pT(){let t=[],e={addEventListener(n,r,i,s){return n.addEventListener(r,i,s),e.add(()=>n.removeEventListener(r,i,s))},requestAnimationFrame(...n){let r=requestAnimationFrame(...n);e.add(()=>cancelAnimationFrame(r))},nextFrame(...n){e.requestAnimationFrame(()=>{e.requestAnimationFrame(...n)})},setTimeout(...n){let r=setTimeout(...n);e.add(()=>clearTimeout(r))},microTask(...n){let r={current:!0};return BC(()=>{r.current&&n[0]()}),e.add(()=>{r.current=!1})},style(n,r,i){let s=n.style.getPropertyValue(r);return Object.assign(n.style,{[r]:i}),this.add(()=>{Object.assign(n.style,{[r]:s})})},group(n){let r=pT();return n(r),this.add(()=>r.dispose())},add(n){return t.push(n),()=>{let r=t.indexOf(n);if(r>=0)for(let i of t.splice(r,1))i()}},dispose(){for(let n of t.splice(0))n()}};return e}var Wj;let cze=Symbol("headlessui.useid"),dze=0;const ro=(Wj=Pie)!=null?Wj:function(){return cr(cze,()=>`${++dze}`)()};function mt(t){var e;if(t==null||t.value==null)return null;let n=(e=t.value.$el)!=null?e:t.value;return n instanceof Node?n:null}function Rs(t,e,...n){if(t in e){let i=e[t];return typeof i=="function"?i(...n):i}let r=new Error(`Tried to handle "${t}" but there is no handler defined. Only defined handlers are: ${Object.keys(e).map(i=>`"${i}"`).join(", ")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,Rs),r}var fze=Object.defineProperty,hze=(t,e,n)=>e in t?fze(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Aj=(t,e,n)=>(hze(t,typeof e!="symbol"?e+"":e,n),n);let pze=class{constructor(){Aj(this,"current",this.detect()),Aj(this,"currentId",0)}set(e){this.current!==e&&(this.currentId=0,this.current=e)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return this.current==="server"}get isClient(){return this.current==="client"}detect(){return typeof window>"u"||typeof document>"u"?"server":"client"}},mT=new pze;function _l(t){if(mT.isServer)return null;if(t instanceof Node)return t.ownerDocument;if(t!=null&&t.hasOwnProperty("value")){let e=mt(t);if(e)return e.ownerDocument}return document}let cL=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map(t=>`${t}:not([tabindex='-1'])`).join(",");var Xs=(t=>(t[t.First=1]="First",t[t.Previous=2]="Previous",t[t.Next=4]="Next",t[t.Last=8]="Last",t[t.WrapAround=16]="WrapAround",t[t.NoScroll=32]="NoScroll",t))(Xs||{}),t6=(t=>(t[t.Error=0]="Error",t[t.Overflow=1]="Overflow",t[t.Success=2]="Success",t[t.Underflow=3]="Underflow",t))(t6||{}),mze=(t=>(t[t.Previous=-1]="Previous",t[t.Next=1]="Next",t))(mze||{});function vT(t=document.body){return t==null?[]:Array.from(t.querySelectorAll(cL)).sort((e,n)=>Math.sign((e.tabIndex||Number.MAX_SAFE_INTEGER)-(n.tabIndex||Number.MAX_SAFE_INTEGER)))}var EV=(t=>(t[t.Strict=0]="Strict",t[t.Loose=1]="Loose",t))(EV||{});function MV(t,e=0){var n;return t===((n=_l(t))==null?void 0:n.body)?!1:Rs(e,{0(){return t.matches(cL)},1(){let r=t;for(;r!==null;){if(r.matches(cL))return!0;r=r.parentElement}return!1}})}function Ele(t){let e=_l(t);Ia(()=>{e&&!MV(e.activeElement,0)&&cp(t)})}var vze=(t=>(t[t.Keyboard=0]="Keyboard",t[t.Mouse=1]="Mouse",t))(vze||{});typeof window<"u"&&typeof document<"u"&&(document.addEventListener("keydown",t=>{t.metaKey||t.altKey||t.ctrlKey||(document.documentElement.dataset.headlessuiFocusVisible="")},!0),document.addEventListener("click",t=>{t.detail===1?delete document.documentElement.dataset.headlessuiFocusVisible:t.detail===0&&(document.documentElement.dataset.headlessuiFocusVisible="")},!0));function cp(t){t==null||t.focus({preventScroll:!0})}let gze=["textarea","input"].join(",");function bze(t){var e,n;return(n=(e=t==null?void 0:t.matches)==null?void 0:e.call(t,gze))!=null?n:!1}function Mle(t,e=n=>n){return t.slice().sort((n,r)=>{let i=e(n),s=e(r);if(i===null||s===null)return 0;let a=i.compareDocumentPosition(s);return a&Node.DOCUMENT_POSITION_FOLLOWING?-1:a&Node.DOCUMENT_POSITION_PRECEDING?1:0})}function yze(t,e){return Wl(vT(),e,{relativeTo:t})}function Wl(t,e,{sorted:n=!0,relativeTo:r=null,skipElements:i=[]}={}){var s;let a=(s=Array.isArray(t)?t.length>0?t[0].ownerDocument:document:t==null?void 0:t.ownerDocument)!=null?s:document,o=Array.isArray(t)?n?Mle(t):t:vT(t);i.length>0&&o.length>1&&(o=o.filter(p=>!i.includes(p))),r=r??a.activeElement;let l=(()=>{if(e&5)return 1;if(e&10)return-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),u=(()=>{if(e&1)return 0;if(e&2)return Math.max(0,o.indexOf(r))-1;if(e&4)return Math.max(0,o.indexOf(r))+1;if(e&8)return o.length-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),c=e&32?{preventScroll:!0}:{},d=0,f=o.length,h;do{if(d>=f||d+f<=0)return 0;let p=u+d;if(e&16)p=(p+f)%f;else{if(p<0)return 3;if(p>=f)return 1}h=o[p],h==null||h.focus(c),d+=l}while(h!==a.activeElement);return e&6&&bze(h)&&h.select(),2}function Ple(){return/iPhone/gi.test(window.navigator.platform)||/Mac/gi.test(window.navigator.platform)&&window.navigator.maxTouchPoints>0}function Sze(){return/Android/gi.test(window.navigator.userAgent)}function xze(){return Ple()||Sze()}function c2(t,e,n){mT.isServer||Ps(r=>{document.addEventListener(t,e,n),r(()=>document.removeEventListener(t,e,n))})}function Rle(t,e,n){mT.isServer||Ps(r=>{window.addEventListener(t,e,n),r(()=>window.removeEventListener(t,e,n))})}function HC(t,e,n=et(()=>!0)){function r(s,a){if(!n.value||s.defaultPrevented)return;let o=a(s);if(o===null||!o.getRootNode().contains(o))return;let l=function u(c){return typeof c=="function"?u(c()):Array.isArray(c)||c instanceof Set?c:[c]}(t);for(let u of l){if(u===null)continue;let c=u instanceof HTMLElement?u:mt(u);if(c!=null&&c.contains(o)||s.composed&&s.composedPath().includes(c))return}return!MV(o,EV.Loose)&&o.tabIndex!==-1&&s.preventDefault(),e(s,o)}let i=ze(null);c2("pointerdown",s=>{var a,o;n.value&&(i.value=((o=(a=s.composedPath)==null?void 0:a.call(s))==null?void 0:o[0])||s.target)},!0),c2("mousedown",s=>{var a,o;n.value&&(i.value=((o=(a=s.composedPath)==null?void 0:a.call(s))==null?void 0:o[0])||s.target)},!0),c2("click",s=>{xze()||i.value&&(r(s,()=>i.value),i.value=null)},!0),c2("touchend",s=>r(s,()=>s.target instanceof HTMLElement?s.target:null),!0),Rle("blur",s=>r(s,()=>window.document.activeElement instanceof HTMLIFrameElement?window.document.activeElement:null),!0)}function Gj(t,e){if(t)return t;let n=e??"button";if(typeof n=="string"&&n.toLowerCase()==="button")return"button"}function PV(t,e){let n=ze(Gj(t.value.type,t.value.as));return _n(()=>{n.value=Gj(t.value.type,t.value.as)}),Ps(()=>{var r;n.value||mt(e)&&mt(e)instanceof HTMLButtonElement&&!((r=mt(e))!=null&&r.hasAttribute("type"))&&(n.value="button")}),n}function Fj(t){return[t.screenX,t.screenY]}function Tze(){let t=ze([-1,-1]);return{wasMoved(e){let n=Fj(e);return t.value[0]===n[0]&&t.value[1]===n[1]?!1:(t.value=n,!0)},update(e){t.value=Fj(e)}}}function wze({container:t,accept:e,walk:n,enabled:r}){Ps(()=>{let i=t.value;if(!i||r!==void 0&&!r.value)return;let s=_l(t);if(!s)return;let a=Object.assign(l=>e(l),{acceptNode:e}),o=s.createTreeWalker(i,NodeFilter.SHOW_ELEMENT,a,!1);for(;o.nextNode();)n(o.currentNode)})}var _c=(t=>(t[t.None=0]="None",t[t.RenderStrategy=1]="RenderStrategy",t[t.Static=2]="Static",t))(_c||{}),Zh=(t=>(t[t.Unmount=0]="Unmount",t[t.Hidden=1]="Hidden",t))(Zh||{});function Wi({visible:t=!0,features:e=0,ourProps:n,theirProps:r,...i}){var s;let a=zle(r,n),o=Object.assign(i,{props:a});if(t||e&2&&a.static)return tk(o);if(e&1){let l=(s=a.unmount)==null||s?0:1;return Rs(l,{0(){return null},1(){return tk({...i,props:{...a,hidden:!0,style:{display:"none"}}})}})}return tk(o)}function tk({props:t,attrs:e,slots:n,slot:r,name:i}){var s,a;let{as:o,...l}=QC(t,["unmount","static"]),u=(s=n.default)==null?void 0:s.call(n,r),c={};if(r){let d=!1,f=[];for(let[h,p]of Object.entries(r))typeof p=="boolean"&&(d=!0),p===!0&&f.push(h);d&&(c["data-headlessui-state"]=f.join(" "))}if(o==="template"){if(u=Vle(u??[]),Object.keys(l).length>0||Object.keys(e).length>0){let[d,...f]=u??[];if(!Mze(d)||f.length>0)throw new Error(['Passing props on "template"!',"",`The current component <${i} /> is rendering a "template".`,"However we need to passthrough the following props:",Object.keys(l).concat(Object.keys(e)).map(m=>m.trim()).filter((m,v,g)=>g.indexOf(m)===v).sort((m,v)=>m.localeCompare(v)).map(m=>` - ${m}`).join(` +(found in ${tx(t)})`},H9e=(t,e)=>{const{errorHandler:n,warnHandler:r,silent:i}=t.config;t.config.errorHandler=(s,a,o)=>{const l=tx(a,!1),u=a?B9e(a):"",c={componentName:l,lifecycleHook:o,trace:u};if(e.attachProps&&a&&(a.$options&&a.$options.propsData?c.propsData=a.$options.propsData:a.$props&&(c.propsData=a.$props)),setTimeout(()=>{ay(s,{captureContext:{contexts:{vue:c}},mechanism:{handled:!1}})}),typeof n=="function"&&n.call(t,s,a,o),e.logErrors){const d=typeof console<"u",f=`Error in ${o}: "${s&&s.toString()}"`;r?r.call(null,f,a,u):d&&!i&&Qc(()=>{console.error(`[Vue warn]: ${f}${u}`)})}}},Q9e=typeof __SENTRY_DEBUG__>"u"||__SENTRY_DEBUG__,Cj="ui.vue",_9e={activate:["activated","deactivated"],create:["beforeCreate","created"],unmount:["beforeUnmount","unmounted"],destroy:["beforeDestroy","destroyed"],mount:["beforeMount","mounted"],update:["beforeUpdate","updated"]};function $9e(){return Fo().getTransaction()}function eze(t,e,n){t.$_sentryRootSpanTimer&&clearTimeout(t.$_sentryRootSpanTimer),t.$_sentryRootSpanTimer=setTimeout(()=>{t.$root&&t.$root.$_sentryRootSpan&&(t.$root.$_sentryRootSpan.end(e),t.$root.$_sentryRootSpan=void 0)},n)}const tze=t=>{const e=(t.hooks||[]).concat(Sle).filter((r,i,s)=>s.indexOf(r)===i),n={};for(const r of e){const i=_9e[r];if(!i){Q9e&&He.warn(`Unknown hook: ${r}`);continue}for(const s of i)n[s]=function(){const a=this.$root===this;a&&BN()&&(this.$_sentryRootSpan=this.$_sentryRootSpan||DM({name:"Application Render",op:`${Cj}.render`,origin:"auto.ui.vue"}));const o=tx(this,!1),l=Array.isArray(t.trackComponents)?t.trackComponents.indexOf(o)>-1:t.trackComponents;if(!(!a&&!l))if(this.$_sentrySpans=this.$_sentrySpans||{},s==i[0]){if(this.$root&&this.$root.$_sentryRootSpan||BN()){const c=this.$_sentrySpans[r];c&&c.end(),this.$_sentrySpans[r]=DM({name:`Vue <${o}>`,op:`${Cj}.${r}`,origin:"auto.ui.vue"})}}else{const u=this.$_sentrySpans[r];if(!u)return;u.end(),eze(this,sy(),t.timeout)}}}return n},nze=Gn,rze={Vue:nze.Vue,attachProps:!0,logErrors:!0,hooks:Sle,timeout:2e3,trackComponents:!1},xle="Vue",ize=(t={})=>({name:xle,setupOnce(){},setup(e){sze(e,t)}}),Tle=ize;Xf(xle,Tle);function sze(t,e){const n={...rze,...t.getOptions(),...e};if(!n.Vue&&!n.app){Qc(()=>{console.warn("[@sentry/vue]: Misconfigured SDK. Vue specific errors will not be captured.\nUpdate your `Sentry.init` call with an appropriate config option:\n`app` (Application Instance - Vue 3) or `Vue` (Vue Constructor - Vue 2).")});return}n.app?SC(n.app).forEach(i=>Kj(i,n)):n.Vue&&Kj(n.Vue,n)}const Kj=(t,e)=>{const n=t;(n._instance&&n._instance.isMounted)===!0&&Qc(()=>{console.warn("[@sentry/vue]: Misconfigured SDK. Vue app is already mounted. Make sure to call `app.mount()` after `Sentry.init()`.")}),H9e(t,e),v0(e)&&t.mixin(tze({...e,...e.tracingOptions}))};function aze(t={}){const e={_metadata:{sdk:{name:"sentry.javascript.vue",packages:[{name:"npm:@sentry/vue",version:Bx}],version:Bx}},defaultIntegrations:[...koe(),Tle()],...t};SPe(e)}function oze(t,e={}){return(n,r=!0,i=!0)=>{r&&gr&&gr.location&&n({name:gr.location.pathname,op:"pageload",attributes:{[_d]:"auto.pageload.vue",[Nu]:"url"}}),lze(t,{routeLabel:e.routeLabel||"name",instrumentNavigation:i,instrumentPageLoad:r},n)}}function lze(t,e,n){t.onError(r=>ay(r,{mechanism:{handled:!1}})),t.beforeEach((r,i,s)=>{const a=i.name==null&&i.matched.length===0,o={[_d]:"auto.navigation.vue"};for(const c of Object.keys(r.params))o[`params.${c}`]=r.params[c];for(const c of Object.keys(r.query)){const d=r.query[c];d&&(o[`query.${c}`]=d)}let l=r.path,u="url";if(r.name&&e.routeLabel!=="path"?(l=r.name.toString(),u="custom"):r.matched[0]&&r.matched[0].path&&(l=r.matched[0].path,u="route"),e.instrumentPageLoad&&a){const c=$9e();c&&((As(c).data||{})[Nu]!=="custom"&&(c.updateName(l),c.setAttribute(Nu,u)),c.setAttributes({...o,[_d]:"auto.pageload.vue"}))}e.instrumentNavigation&&!a&&(o[Nu]=u,n({name:l,op:"navigation",attributes:o})),s&&s()})}function ef(t,e){const n=new Date().toTimeString();j5e(t,e),console.log(`[Sentry] - Severity: ${e}, Info: ${t} at ${n}`)}function uze(t){const e=new Date().toTimeString();ay(t),console.log(`[Sentry] - Error: ${t.name} at ${e}`)}function cze(t,e,n){let r=ze(n==null?void 0:n.value),i=et(()=>t.value!==void 0);return[et(()=>i.value?t.value:r.value),function(s){return i.value||(r.value=s),e==null?void 0:e(s)}]}function HC(t){typeof queueMicrotask=="function"?queueMicrotask(t):Promise.resolve().then(t).catch(e=>setTimeout(()=>{throw e}))}function hT(){let t=[],e={addEventListener(n,r,i,s){return n.addEventListener(r,i,s),e.add(()=>n.removeEventListener(r,i,s))},requestAnimationFrame(...n){let r=requestAnimationFrame(...n);e.add(()=>cancelAnimationFrame(r))},nextFrame(...n){e.requestAnimationFrame(()=>{e.requestAnimationFrame(...n)})},setTimeout(...n){let r=setTimeout(...n);e.add(()=>clearTimeout(r))},microTask(...n){let r={current:!0};return HC(()=>{r.current&&n[0]()}),e.add(()=>{r.current=!1})},style(n,r,i){let s=n.style.getPropertyValue(r);return Object.assign(n.style,{[r]:i}),this.add(()=>{Object.assign(n.style,{[r]:s})})},group(n){let r=hT();return n(r),this.add(()=>r.dispose())},add(n){return t.push(n),()=>{let r=t.indexOf(n);if(r>=0)for(let i of t.splice(r,1))i()}},dispose(){for(let n of t.splice(0))n()}};return e}var qj;let dze=Symbol("headlessui.useid"),fze=0;const ro=(qj=Mie)!=null?qj:function(){return cr(dze,()=>`${++fze}`)()};function mt(t){var e;if(t==null||t.value==null)return null;let n=(e=t.value.$el)!=null?e:t.value;return n instanceof Node?n:null}function Rs(t,e,...n){if(t in e){let i=e[t];return typeof i=="function"?i(...n):i}let r=new Error(`Tried to handle "${t}" but there is no handler defined. Only defined handlers are: ${Object.keys(e).map(i=>`"${i}"`).join(", ")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,Rs),r}var hze=Object.defineProperty,pze=(t,e,n)=>e in t?hze(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Dj=(t,e,n)=>(pze(t,typeof e!="symbol"?e+"":e,n),n);let mze=class{constructor(){Dj(this,"current",this.detect()),Dj(this,"currentId",0)}set(e){this.current!==e&&(this.currentId=0,this.current=e)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return this.current==="server"}get isClient(){return this.current==="client"}detect(){return typeof window>"u"||typeof document>"u"?"server":"client"}},pT=new mze;function _l(t){if(pT.isServer)return null;if(t instanceof Node)return t.ownerDocument;if(t!=null&&t.hasOwnProperty("value")){let e=mt(t);if(e)return e.ownerDocument}return document}let cL=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map(t=>`${t}:not([tabindex='-1'])`).join(",");var Xs=(t=>(t[t.First=1]="First",t[t.Previous=2]="Previous",t[t.Next=4]="Next",t[t.Last=8]="Last",t[t.WrapAround=16]="WrapAround",t[t.NoScroll=32]="NoScroll",t))(Xs||{}),e6=(t=>(t[t.Error=0]="Error",t[t.Overflow=1]="Overflow",t[t.Success=2]="Success",t[t.Underflow=3]="Underflow",t))(e6||{}),vze=(t=>(t[t.Previous=-1]="Previous",t[t.Next=1]="Next",t))(vze||{});function mT(t=document.body){return t==null?[]:Array.from(t.querySelectorAll(cL)).sort((e,n)=>Math.sign((e.tabIndex||Number.MAX_SAFE_INTEGER)-(n.tabIndex||Number.MAX_SAFE_INTEGER)))}var EV=(t=>(t[t.Strict=0]="Strict",t[t.Loose=1]="Loose",t))(EV||{});function MV(t,e=0){var n;return t===((n=_l(t))==null?void 0:n.body)?!1:Rs(e,{0(){return t.matches(cL)},1(){let r=t;for(;r!==null;){if(r.matches(cL))return!0;r=r.parentElement}return!1}})}function wle(t){let e=_l(t);Ia(()=>{e&&!MV(e.activeElement,0)&&cp(t)})}var gze=(t=>(t[t.Keyboard=0]="Keyboard",t[t.Mouse=1]="Mouse",t))(gze||{});typeof window<"u"&&typeof document<"u"&&(document.addEventListener("keydown",t=>{t.metaKey||t.altKey||t.ctrlKey||(document.documentElement.dataset.headlessuiFocusVisible="")},!0),document.addEventListener("click",t=>{t.detail===1?delete document.documentElement.dataset.headlessuiFocusVisible:t.detail===0&&(document.documentElement.dataset.headlessuiFocusVisible="")},!0));function cp(t){t==null||t.focus({preventScroll:!0})}let bze=["textarea","input"].join(",");function yze(t){var e,n;return(n=(e=t==null?void 0:t.matches)==null?void 0:e.call(t,bze))!=null?n:!1}function Ele(t,e=n=>n){return t.slice().sort((n,r)=>{let i=e(n),s=e(r);if(i===null||s===null)return 0;let a=i.compareDocumentPosition(s);return a&Node.DOCUMENT_POSITION_FOLLOWING?-1:a&Node.DOCUMENT_POSITION_PRECEDING?1:0})}function Sze(t,e){return Wl(mT(),e,{relativeTo:t})}function Wl(t,e,{sorted:n=!0,relativeTo:r=null,skipElements:i=[]}={}){var s;let a=(s=Array.isArray(t)?t.length>0?t[0].ownerDocument:document:t==null?void 0:t.ownerDocument)!=null?s:document,o=Array.isArray(t)?n?Ele(t):t:mT(t);i.length>0&&o.length>1&&(o=o.filter(p=>!i.includes(p))),r=r??a.activeElement;let l=(()=>{if(e&5)return 1;if(e&10)return-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),u=(()=>{if(e&1)return 0;if(e&2)return Math.max(0,o.indexOf(r))-1;if(e&4)return Math.max(0,o.indexOf(r))+1;if(e&8)return o.length-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),c=e&32?{preventScroll:!0}:{},d=0,f=o.length,h;do{if(d>=f||d+f<=0)return 0;let p=u+d;if(e&16)p=(p+f)%f;else{if(p<0)return 3;if(p>=f)return 1}h=o[p],h==null||h.focus(c),d+=l}while(h!==a.activeElement);return e&6&&yze(h)&&h.select(),2}function Mle(){return/iPhone/gi.test(window.navigator.platform)||/Mac/gi.test(window.navigator.platform)&&window.navigator.maxTouchPoints>0}function xze(){return/Android/gi.test(window.navigator.userAgent)}function Tze(){return Mle()||xze()}function c2(t,e,n){pT.isServer||Ps(r=>{document.addEventListener(t,e,n),r(()=>document.removeEventListener(t,e,n))})}function Ple(t,e,n){pT.isServer||Ps(r=>{window.addEventListener(t,e,n),r(()=>window.removeEventListener(t,e,n))})}function QC(t,e,n=et(()=>!0)){function r(s,a){if(!n.value||s.defaultPrevented)return;let o=a(s);if(o===null||!o.getRootNode().contains(o))return;let l=function u(c){return typeof c=="function"?u(c()):Array.isArray(c)||c instanceof Set?c:[c]}(t);for(let u of l){if(u===null)continue;let c=u instanceof HTMLElement?u:mt(u);if(c!=null&&c.contains(o)||s.composed&&s.composedPath().includes(c))return}return!MV(o,EV.Loose)&&o.tabIndex!==-1&&s.preventDefault(),e(s,o)}let i=ze(null);c2("pointerdown",s=>{var a,o;n.value&&(i.value=((o=(a=s.composedPath)==null?void 0:a.call(s))==null?void 0:o[0])||s.target)},!0),c2("mousedown",s=>{var a,o;n.value&&(i.value=((o=(a=s.composedPath)==null?void 0:a.call(s))==null?void 0:o[0])||s.target)},!0),c2("click",s=>{Tze()||i.value&&(r(s,()=>i.value),i.value=null)},!0),c2("touchend",s=>r(s,()=>s.target instanceof HTMLElement?s.target:null),!0),Ple("blur",s=>r(s,()=>window.document.activeElement instanceof HTMLIFrameElement?window.document.activeElement:null),!0)}function Wj(t,e){if(t)return t;let n=e??"button";if(typeof n=="string"&&n.toLowerCase()==="button")return"button"}function PV(t,e){let n=ze(Wj(t.value.type,t.value.as));return _n(()=>{n.value=Wj(t.value.type,t.value.as)}),Ps(()=>{var r;n.value||mt(e)&&mt(e)instanceof HTMLButtonElement&&!((r=mt(e))!=null&&r.hasAttribute("type"))&&(n.value="button")}),n}function Aj(t){return[t.screenX,t.screenY]}function wze(){let t=ze([-1,-1]);return{wasMoved(e){let n=Aj(e);return t.value[0]===n[0]&&t.value[1]===n[1]?!1:(t.value=n,!0)},update(e){t.value=Aj(e)}}}function Eze({container:t,accept:e,walk:n,enabled:r}){Ps(()=>{let i=t.value;if(!i||r!==void 0&&!r.value)return;let s=_l(t);if(!s)return;let a=Object.assign(l=>e(l),{acceptNode:e}),o=s.createTreeWalker(i,NodeFilter.SHOW_ELEMENT,a,!1);for(;o.nextNode();)n(o.currentNode)})}var _c=(t=>(t[t.None=0]="None",t[t.RenderStrategy=1]="RenderStrategy",t[t.Static=2]="Static",t))(_c||{}),Zh=(t=>(t[t.Unmount=0]="Unmount",t[t.Hidden=1]="Hidden",t))(Zh||{});function Wi({visible:t=!0,features:e=0,ourProps:n,theirProps:r,...i}){var s;let a=Vle(r,n),o=Object.assign(i,{props:a});if(t||e&2&&a.static)return tk(o);if(e&1){let l=(s=a.unmount)==null||s?0:1;return Rs(l,{0(){return null},1(){return tk({...i,props:{...a,hidden:!0,style:{display:"none"}}})}})}return tk(o)}function tk({props:t,attrs:e,slots:n,slot:r,name:i}){var s,a;let{as:o,...l}=_C(t,["unmount","static"]),u=(s=n.default)==null?void 0:s.call(n,r),c={};if(r){let d=!1,f=[];for(let[h,p]of Object.entries(r))typeof p=="boolean"&&(d=!0),p===!0&&f.push(h);d&&(c["data-headlessui-state"]=f.join(" "))}if(o==="template"){if(u=Rle(u??[]),Object.keys(l).length>0||Object.keys(e).length>0){let[d,...f]=u??[];if(!Pze(d)||f.length>0)throw new Error(['Passing props on "template"!',"",`The current component <${i} /> is rendering a "template".`,"However we need to passthrough the following props:",Object.keys(l).concat(Object.keys(e)).map(m=>m.trim()).filter((m,v,g)=>g.indexOf(m)===v).sort((m,v)=>m.localeCompare(v)).map(m=>` - ${m}`).join(` `),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "template".',"Render a single element as the child so that we can forward the props onto that element."].map(m=>` - ${m}`).join(` `)].join(` -`));let h=zle((a=d.props)!=null?a:{},l,c),p=Cu(d,h,!0);for(let m in h)m.startsWith("on")&&(p.props||(p.props={}),p.props[m]=h[m]);return p}return Array.isArray(u)&&u.length===1?u[0]:u}return An(o,Object.assign({},l,c),{default:()=>u})}function Vle(t){return t.flatMap(e=>e.type===Ct?Vle(e.children):[e])}function zle(...t){if(t.length===0)return{};if(t.length===1)return t[0];let e={},n={};for(let r of t)for(let i in r)i.startsWith("on")&&typeof r[i]=="function"?(n[i]!=null||(n[i]=[]),n[i].push(r[i])):e[i]=r[i];if(e.disabled||e["aria-disabled"])return Object.assign(e,Object.fromEntries(Object.keys(n).map(r=>[r,void 0])));for(let r in n)Object.assign(e,{[r](i,...s){let a=n[r];for(let o of a){if(i instanceof Event&&i.defaultPrevented)return;o(i,...s)}}});return e}function Eze(t){let e=Object.assign({},t);for(let n in e)e[n]===void 0&&delete e[n];return e}function QC(t,e=[]){let n=Object.assign({},t);for(let r of e)r in n&&delete n[r];return n}function Mze(t){return t==null?!1:typeof t.type=="string"||typeof t.type=="object"||typeof t.type=="function"}var bf=(t=>(t[t.None=1]="None",t[t.Focusable=2]="Focusable",t[t.Hidden=4]="Hidden",t))(bf||{});let Op=pt({name:"Hidden",props:{as:{type:[Object,String],default:"div"},features:{type:Number,default:1}},setup(t,{slots:e,attrs:n}){return()=>{var r;let{features:i,...s}=t,a={"aria-hidden":(i&2)===2?!0:(r=s["aria-hidden"])!=null?r:void 0,hidden:(i&4)===4?!0:void 0,style:{position:"fixed",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...(i&4)===4&&(i&2)!==2&&{display:"none"}}};return Wi({ourProps:a,theirProps:s,slot:{},attrs:n,slots:e,name:"Hidden"})}}}),kle=Symbol("Context");var ni=(t=>(t[t.Open=1]="Open",t[t.Closed=2]="Closed",t[t.Closing=4]="Closing",t[t.Opening=8]="Opening",t))(ni||{});function Pze(){return uy()!==null}function uy(){return cr(kle,null)}function RV(t){Zi(kle,t)}var nr=(t=>(t.Space=" ",t.Enter="Enter",t.Escape="Escape",t.Backspace="Backspace",t.Delete="Delete",t.ArrowLeft="ArrowLeft",t.ArrowUp="ArrowUp",t.ArrowRight="ArrowRight",t.ArrowDown="ArrowDown",t.Home="Home",t.End="End",t.PageUp="PageUp",t.PageDown="PageDown",t.Tab="Tab",t))(nr||{});function Rze(t){function e(){document.readyState!=="loading"&&(t(),document.removeEventListener("DOMContentLoaded",e))}typeof window<"u"&&typeof document<"u"&&(document.addEventListener("DOMContentLoaded",e),e())}let sv=[];Rze(()=>{function t(e){e.target instanceof HTMLElement&&e.target!==document.body&&sv[0]!==e.target&&(sv.unshift(e.target),sv=sv.filter(n=>n!=null&&n.isConnected),sv.splice(10))}window.addEventListener("click",t,{capture:!0}),window.addEventListener("mousedown",t,{capture:!0}),window.addEventListener("focus",t,{capture:!0}),document.body.addEventListener("click",t,{capture:!0}),document.body.addEventListener("mousedown",t,{capture:!0}),document.body.addEventListener("focus",t,{capture:!0})});function Vze(t){throw new Error("Unexpected object: "+t)}var al=(t=>(t[t.First=0]="First",t[t.Previous=1]="Previous",t[t.Next=2]="Next",t[t.Last=3]="Last",t[t.Specific=4]="Specific",t[t.Nothing=5]="Nothing",t))(al||{});function zze(t,e){let n=e.resolveItems();if(n.length<=0)return null;let r=e.resolveActiveIndex(),i=r??-1;switch(t.focus){case 0:{for(let s=0;s=0;--s)if(!e.resolveDisabled(n[s],s,n))return s;return r}case 2:{for(let s=i+1;s=0;--s)if(!e.resolveDisabled(n[s],s,n))return s;return r}case 4:{for(let s=0;s{t=t??window,t.addEventListener(e,n,r),i(()=>t.removeEventListener(e,n,r))})}var ol=(t=>(t[t.Forwards=0]="Forwards",t[t.Backwards=1]="Backwards",t))(ol||{});function $C(){let t=ze(0);return Rle("keydown",e=>{e.key==="Tab"&&(t.value=e.shiftKey?1:0)}),t}function Ole(t){if(!t)return new Set;if(typeof t=="function")return new Set(t());let e=new Set;for(let n of t.value){let r=mt(n);r instanceof HTMLElement&&e.add(r)}return e}var Ile=(t=>(t[t.None=1]="None",t[t.InitialFocus=2]="InitialFocus",t[t.TabLock=4]="TabLock",t[t.FocusLock=8]="FocusLock",t[t.RestoreFocus=16]="RestoreFocus",t[t.All=30]="All",t))(Ile||{});let xS=Object.assign(pt({name:"FocusTrap",props:{as:{type:[Object,String],default:"div"},initialFocus:{type:Object,default:null},features:{type:Number,default:30},containers:{type:[Object,Function],default:ze(new Set)}},inheritAttrs:!1,setup(t,{attrs:e,slots:n,expose:r}){let i=ze(null);r({el:i,$el:i});let s=et(()=>_l(i)),a=ze(!1);_n(()=>a.value=!0),ls(()=>a.value=!1),Ize({ownerDocument:s},et(()=>a.value&&!!(t.features&16)));let o=Uze({ownerDocument:s,container:i,initialFocus:et(()=>t.initialFocus)},et(()=>a.value&&!!(t.features&2)));Nze({ownerDocument:s,container:i,containers:t.containers,previousActiveElement:o},et(()=>a.value&&!!(t.features&8)));let l=$C();function u(h){let p=mt(i);p&&(m=>m())(()=>{Rs(l.value,{[ol.Forwards]:()=>{Wl(p,Xs.First,{skipElements:[h.relatedTarget]})},[ol.Backwards]:()=>{Wl(p,Xs.Last,{skipElements:[h.relatedTarget]})}})})}let c=ze(!1);function d(h){h.key==="Tab"&&(c.value=!0,requestAnimationFrame(()=>{c.value=!1}))}function f(h){if(!a.value)return;let p=Ole(t.containers);mt(i)instanceof HTMLElement&&p.add(mt(i));let m=h.relatedTarget;m instanceof HTMLElement&&m.dataset.headlessuiFocusGuard!=="true"&&(Ule(p,m)||(c.value?Wl(mt(i),Rs(l.value,{[ol.Forwards]:()=>Xs.Next,[ol.Backwards]:()=>Xs.Previous})|Xs.WrapAround,{relativeTo:h.target}):h.target instanceof HTMLElement&&cp(h.target)))}return()=>{let h={},p={ref:i,onKeydown:d,onFocusout:f},{features:m,initialFocus:v,containers:g,...b}=t;return An(Ct,[!!(m&4)&&An(Op,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:u,features:bf.Focusable}),Wi({ourProps:p,theirProps:{...e,...b},slot:h,attrs:e,slots:n,name:"FocusTrap"}),!!(m&4)&&An(Op,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:u,features:bf.Focusable})])}}}),{features:Ile});function Oze(t){let e=ze(sv.slice());return jt([t],([n],[r])=>{r===!0&&n===!1?BC(()=>{e.value.splice(0)}):r===!1&&n===!0&&(e.value=sv.slice())},{flush:"post"}),()=>{var n;return(n=e.value.find(r=>r!=null&&r.isConnected))!=null?n:null}}function Ize({ownerDocument:t},e){let n=Oze(e);_n(()=>{Ps(()=>{var r,i;e.value||((r=t.value)==null?void 0:r.activeElement)===((i=t.value)==null?void 0:i.body)&&cp(n())},{flush:"post"})}),ls(()=>{e.value&&cp(n())})}function Uze({ownerDocument:t,container:e,initialFocus:n},r){let i=ze(null),s=ze(!1);return _n(()=>s.value=!0),ls(()=>s.value=!1),_n(()=>{jt([e,n,r],(a,o)=>{if(a.every((u,c)=>(o==null?void 0:o[c])===u)||!r.value)return;let l=mt(e);l&&BC(()=>{var u,c;if(!s.value)return;let d=mt(n),f=(u=t.value)==null?void 0:u.activeElement;if(d){if(d===f){i.value=f;return}}else if(l.contains(f)){i.value=f;return}d?cp(d):Wl(l,Xs.First|Xs.NoScroll)===t6.Error&&console.warn("There are no focusable elements inside the "),i.value=(c=t.value)==null?void 0:c.activeElement})},{immediate:!0,flush:"post"})}),i}function Nze({ownerDocument:t,container:e,containers:n,previousActiveElement:r},i){var s;_C((s=t.value)==null?void 0:s.defaultView,"focus",a=>{if(!i.value)return;let o=Ole(n);mt(e)instanceof HTMLElement&&o.add(mt(e));let l=r.value;if(!l)return;let u=a.target;u&&u instanceof HTMLElement?Ule(o,u)?(r.value=u,cp(u)):(a.preventDefault(),a.stopPropagation(),cp(l)):cp(r.value)},!0)}function Ule(t,e){for(let n of t)if(n.contains(e))return!0;return!1}function Lze(t){let e=c0(t.getSnapshot());return ls(t.subscribe(()=>{e.value=t.getSnapshot()})),e}function Xze(t,e){let n=t(),r=new Set;return{getSnapshot(){return n},subscribe(i){return r.add(i),()=>r.delete(i)},dispatch(i,...s){let a=e[i].call(n,...s);a&&(n=a,r.forEach(o=>o()))}}}function Cze(){let t;return{before({doc:e}){var n;let r=e.documentElement;t=((n=e.defaultView)!=null?n:window).innerWidth-r.clientWidth},after({doc:e,d:n}){let r=e.documentElement,i=r.clientWidth-r.offsetWidth,s=t-i;n.style(r,"paddingRight",`${s}px`)}}}function Kze(){return Ple()?{before({doc:t,d:e,meta:n}){function r(i){return n.containers.flatMap(s=>s()).some(s=>s.contains(i))}e.microTask(()=>{var i;if(window.getComputedStyle(t.documentElement).scrollBehavior!=="auto"){let o=pT();o.style(t.documentElement,"scrollBehavior","auto"),e.add(()=>e.microTask(()=>o.dispose()))}let s=(i=window.scrollY)!=null?i:window.pageYOffset,a=null;e.addEventListener(t,"click",o=>{if(o.target instanceof HTMLElement)try{let l=o.target.closest("a");if(!l)return;let{hash:u}=new URL(l.href),c=t.querySelector(u);c&&!r(c)&&(a=c)}catch{}},!0),e.addEventListener(t,"touchstart",o=>{if(o.target instanceof HTMLElement)if(r(o.target)){let l=o.target;for(;l.parentElement&&r(l.parentElement);)l=l.parentElement;e.style(l,"overscrollBehavior","contain")}else e.style(o.target,"touchAction","none")}),e.addEventListener(t,"touchmove",o=>{if(o.target instanceof HTMLElement){if(o.target.tagName==="INPUT")return;if(r(o.target)){let l=o.target;for(;l.parentElement&&l.dataset.headlessuiPortal!==""&&!(l.scrollHeight>l.clientHeight||l.scrollWidth>l.clientWidth);)l=l.parentElement;l.dataset.headlessuiPortal===""&&o.preventDefault()}else o.preventDefault()}},{passive:!1}),e.add(()=>{var o;let l=(o=window.scrollY)!=null?o:window.pageYOffset;s!==l&&window.scrollTo(0,s),a&&a.isConnected&&(a.scrollIntoView({block:"nearest"}),a=null)})})}}:{}}function qze(){return{before({doc:t,d:e}){e.style(t.documentElement,"overflow","hidden")}}}function Dze(t){let e={};for(let n of t)Object.assign(e,n(e));return e}let uv=Xze(()=>new Map,{PUSH(t,e){var n;let r=(n=this.get(t))!=null?n:{doc:t,count:0,d:pT(),meta:new Set};return r.count++,r.meta.add(e),this.set(t,r),this},POP(t,e){let n=this.get(t);return n&&(n.count--,n.meta.delete(e)),this},SCROLL_PREVENT({doc:t,d:e,meta:n}){let r={doc:t,d:e,meta:Dze(n)},i=[Kze(),Cze(),qze()];i.forEach(({before:s})=>s==null?void 0:s(r)),i.forEach(({after:s})=>s==null?void 0:s(r))},SCROLL_ALLOW({d:t}){t.dispose()},TEARDOWN({doc:t}){this.delete(t)}});uv.subscribe(()=>{let t=uv.getSnapshot(),e=new Map;for(let[n]of t)e.set(n,n.documentElement.style.overflow);for(let n of t.values()){let r=e.get(n.doc)==="hidden",i=n.count!==0;(i&&!r||!i&&r)&&uv.dispatch(n.count>0?"SCROLL_PREVENT":"SCROLL_ALLOW",n),n.count===0&&uv.dispatch("TEARDOWN",n)}});function Wze(t,e,n){let r=Lze(uv),i=et(()=>{let s=t.value?r.value.get(t.value):void 0;return s?s.count>0:!1});return jt([t,e],([s,a],[o],l)=>{if(!s||!a)return;uv.dispatch("PUSH",s,n);let u=!1;l(()=>{u||(uv.dispatch("POP",o??s,n),u=!0)})},{immediate:!0}),i}let nk=new Map,TS=new Map;function jj(t,e=ze(!0)){Ps(n=>{var r;if(!e.value)return;let i=mt(t);if(!i)return;n(function(){var a;if(!i)return;let o=(a=TS.get(i))!=null?a:1;if(o===1?TS.delete(i):TS.set(i,o-1),o!==1)return;let l=nk.get(i);l&&(l["aria-hidden"]===null?i.removeAttribute("aria-hidden"):i.setAttribute("aria-hidden",l["aria-hidden"]),i.inert=l.inert,nk.delete(i))});let s=(r=TS.get(i))!=null?r:0;TS.set(i,s+1),s===0&&(nk.set(i,{"aria-hidden":i.getAttribute("aria-hidden"),inert:i.inert}),i.setAttribute("aria-hidden","true"),i.inert=!0)})}function Nle({defaultContainers:t=[],portals:e,mainTreeNodeRef:n}={}){let r=ze(null),i=_l(r);function s(){var a,o,l;let u=[];for(let c of t)c!==null&&(c instanceof HTMLElement?u.push(c):"value"in c&&c.value instanceof HTMLElement&&u.push(c.value));if(e!=null&&e.value)for(let c of e.value)u.push(c);for(let c of(a=i==null?void 0:i.querySelectorAll("html > *, body > *"))!=null?a:[])c!==document.body&&c!==document.head&&c instanceof HTMLElement&&c.id!=="headlessui-portal-root"&&(c.contains(mt(r))||c.contains((l=(o=mt(r))==null?void 0:o.getRootNode())==null?void 0:l.host)||u.some(d=>c.contains(d))||u.push(c));return u}return{resolveContainers:s,contains(a){return s().some(o=>o.contains(a))},mainTreeNodeRef:r,MainTreeNode(){return n!=null?null:An(Op,{features:bf.Hidden,ref:r})}}}function Aze(){let t=ze(null);return{mainTreeNodeRef:t,MainTreeNode(){return An(Op,{features:bf.Hidden,ref:t})}}}let Lle=Symbol("ForcePortalRootContext");function Gze(){return cr(Lle,!1)}let Zj=pt({name:"ForcePortalRoot",props:{as:{type:[Object,String],default:"template"},force:{type:Boolean,default:!1}},setup(t,{slots:e,attrs:n}){return Zi(Lle,t.force),()=>{let{force:r,...i}=t;return Wi({theirProps:i,ourProps:{},slot:{},slots:e,attrs:n,name:"ForcePortalRoot"})}}}),Xle=Symbol("StackContext");var dL=(t=>(t[t.Add=0]="Add",t[t.Remove=1]="Remove",t))(dL||{});function Fze(){return cr(Xle,()=>{})}function jze({type:t,enabled:e,element:n,onUpdate:r}){let i=Fze();function s(...a){r==null||r(...a),i(...a)}_n(()=>{jt(e,(a,o)=>{a?s(0,t,n):o===!0&&s(1,t,n)},{immediate:!0,flush:"sync"})}),ls(()=>{e.value&&s(1,t,n)}),Zi(Xle,s)}let Zze=Symbol("DescriptionContext");function Jze({slot:t=ze({}),name:e="Description",props:n={}}={}){let r=ze([]);function i(s){return r.value.push(s),()=>{let a=r.value.indexOf(s);a!==-1&&r.value.splice(a,1)}}return Zi(Zze,{register:i,slot:t,name:e,props:n}),et(()=>r.value.length>0?r.value.join(" "):void 0)}function Yze(t){let e=_l(t);if(!e){if(t===null)return null;throw new Error(`[Headless UI]: Cannot find ownerDocument for contextElement: ${t}`)}let n=e.getElementById("headlessui-portal-root");if(n)return n;let r=e.createElement("div");return r.setAttribute("id","headlessui-portal-root"),e.body.appendChild(r)}const fL=new WeakMap;function Bze(t){var e;return(e=fL.get(t))!=null?e:0}function Jj(t,e){let n=e(Bze(t));return n<=0?fL.delete(t):fL.set(t,n),n}let Hze=pt({name:"Portal",props:{as:{type:[Object,String],default:"div"}},setup(t,{slots:e,attrs:n}){let r=ze(null),i=et(()=>_l(r)),s=Gze(),a=cr(Kle,null),o=ze(s===!0||a==null?Yze(r.value):a.resolveTarget());o.value&&Jj(o.value,f=>f+1);let l=ze(!1);_n(()=>{l.value=!0}),Ps(()=>{s||a!=null&&(o.value=a.resolveTarget())});let u=cr(hL,null),c=!1,d=Fo();return jt(r,()=>{if(c||!u)return;let f=mt(r);f&&(ls(u.register(f),d),c=!0)}),ls(()=>{var f,h;let p=(f=i.value)==null?void 0:f.getElementById("headlessui-portal-root");!p||o.value!==p||Jj(o.value,m=>m-1)||o.value.children.length>0||(h=o.value.parentElement)==null||h.removeChild(o.value)}),()=>{if(!l.value||o.value===null)return null;let f={ref:r,"data-headlessui-portal":""};return An(Sie,{to:o.value},Wi({ourProps:f,theirProps:t,slot:{},attrs:n,slots:e,name:"Portal"}))}}}),hL=Symbol("PortalParentContext");function Cle(){let t=cr(hL,null),e=ze([]);function n(s){return e.value.push(s),t&&t.register(s),()=>r(s)}function r(s){let a=e.value.indexOf(s);a!==-1&&e.value.splice(a,1),t&&t.unregister(s)}let i={register:n,unregister:r,portals:e};return[e,pt({name:"PortalWrapper",setup(s,{slots:a}){return Zi(hL,i),()=>{var o;return(o=a.default)==null?void 0:o.call(a)}}})]}let Kle=Symbol("PortalGroupContext"),Qze=pt({name:"PortalGroup",props:{as:{type:[Object,String],default:"template"},target:{type:Object,default:null}},setup(t,{attrs:e,slots:n}){let r=Go({resolveTarget(){return t.target}});return Zi(Kle,r),()=>{let{target:i,...s}=t;return Wi({theirProps:s,ourProps:{},slot:{},attrs:e,slots:n,name:"PortalGroup"})}}});var _ze=(t=>(t[t.Open=0]="Open",t[t.Closed=1]="Closed",t))(_ze||{});let pL=Symbol("DialogContext");function eK(t){let e=cr(pL,null);if(e===null){let n=new Error(`<${t} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,eK),n}return e}let d2="DC8F892D-2EBD-447C-A4C8-A03058436FF4",_p=pt({name:"Dialog",inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},open:{type:[Boolean,String],default:d2},initialFocus:{type:Object,default:null},id:{type:String,default:null},role:{type:String,default:"dialog"}},emits:{close:t=>!0},setup(t,{emit:e,attrs:n,slots:r,expose:i}){var s,a;let o=(s=t.id)!=null?s:`headlessui-dialog-${ro()}`,l=ze(!1);_n(()=>{l.value=!0});let u=!1,c=et(()=>t.role==="dialog"||t.role==="alertdialog"?t.role:(u||(u=!0,console.warn(`Invalid role [${c}] passed to . Only \`dialog\` and and \`alertdialog\` are supported. Using \`dialog\` instead.`)),"dialog")),d=ze(0),f=uy(),h=et(()=>t.open===d2&&f!==null?(f.value&ni.Open)===ni.Open:t.open),p=ze(null),m=et(()=>_l(p));if(i({el:p,$el:p}),!(t.open!==d2||f!==null))throw new Error("You forgot to provide an `open` prop to the `Dialog`.");if(typeof h.value!="boolean")throw new Error(`You provided an \`open\` prop to the \`Dialog\`, but the value is not a boolean. Received: ${h.value===d2?void 0:t.open}`);let v=et(()=>l.value&&h.value?0:1),g=et(()=>v.value===0),b=et(()=>d.value>1),y=cr(pL,null)!==null,[x,T]=Cle(),{resolveContainers:M,mainTreeNodeRef:E,MainTreeNode:S}=Nle({portals:x,defaultContainers:[et(()=>{var G;return(G=A.panelRef.value)!=null?G:p.value})]}),P=et(()=>b.value?"parent":"leaf"),R=et(()=>f!==null?(f.value&ni.Closing)===ni.Closing:!1),V=et(()=>y||R.value?!1:g.value),z=et(()=>{var G,B,ee;return(ee=Array.from((B=(G=m.value)==null?void 0:G.querySelectorAll("body > *"))!=null?B:[]).find(ce=>ce.id==="headlessui-portal-root"?!1:ce.contains(mt(E))&&ce instanceof HTMLElement))!=null?ee:null});jj(z,V);let k=et(()=>b.value?!0:g.value),N=et(()=>{var G,B,ee;return(ee=Array.from((B=(G=m.value)==null?void 0:G.querySelectorAll("[data-headlessui-portal]"))!=null?B:[]).find(ce=>ce.contains(mt(E))&&ce instanceof HTMLElement))!=null?ee:null});jj(N,k),jze({type:"Dialog",enabled:et(()=>v.value===0),element:p,onUpdate:(G,B)=>{if(B==="Dialog")return Rs(G,{[dL.Add]:()=>d.value+=1,[dL.Remove]:()=>d.value-=1})}});let q=Jze({name:"DialogDescription",slot:et(()=>({open:h.value}))}),L=ze(null),A={titleId:L,panelRef:ze(null),dialogState:v,setTitleId(G){L.value!==G&&(L.value=G)},close(){e("close",!1)}};Zi(pL,A);let Z=et(()=>!(!g.value||b.value));HC(M,(G,B)=>{G.preventDefault(),A.close(),Ia(()=>B==null?void 0:B.focus())},Z);let j=et(()=>!(b.value||v.value!==0));_C((a=m.value)==null?void 0:a.defaultView,"keydown",G=>{j.value&&(G.defaultPrevented||G.key===nr.Escape&&(G.preventDefault(),G.stopPropagation(),A.close()))});let ne=et(()=>!(R.value||v.value!==0||y));return Wze(m,ne,G=>{var B;return{containers:[...(B=G.containers)!=null?B:[],M]}}),Ps(G=>{if(v.value!==0)return;let B=mt(p);if(!B)return;let ee=new ResizeObserver(ce=>{for(let fe of ce){let te=fe.target.getBoundingClientRect();te.x===0&&te.y===0&&te.width===0&&te.height===0&&A.close()}});ee.observe(B),G(()=>ee.disconnect())}),()=>{let{open:G,initialFocus:B,...ee}=t,ce={...n,ref:p,id:o,role:c.value,"aria-modal":v.value===0?!0:void 0,"aria-labelledby":L.value,"aria-describedby":q.value},fe={open:v.value===0};return An(Zj,{force:!0},()=>[An(Hze,()=>An(Qze,{target:p.value},()=>An(Zj,{force:!1},()=>An(xS,{initialFocus:B,containers:M,features:g.value?Rs(P.value,{parent:xS.features.RestoreFocus,leaf:xS.features.All&~xS.features.FocusLock}):xS.features.None},()=>An(T,{},()=>Wi({ourProps:ce,theirProps:{...ee,...n},slot:fe,attrs:n,slots:r,visible:v.value===0,features:_c.RenderStrategy|_c.Static,name:"Dialog"})))))),An(S)])}}}),g0=pt({name:"DialogPanel",props:{as:{type:[Object,String],default:"div"},id:{type:String,default:null}},setup(t,{attrs:e,slots:n,expose:r}){var i;let s=(i=t.id)!=null?i:`headlessui-dialog-panel-${ro()}`,a=eK("DialogPanel");r({el:a.panelRef,$el:a.panelRef});function o(l){l.stopPropagation()}return()=>{let{...l}=t,u={id:s,ref:a.panelRef,onClick:o};return Wi({ourProps:u,theirProps:l,slot:{open:a.dialogState.value===0},attrs:e,slots:n,name:"DialogPanel"})}}}),$ze=pt({name:"DialogTitle",props:{as:{type:[Object,String],default:"h2"},id:{type:String,default:null}},setup(t,{attrs:e,slots:n}){var r;let i=(r=t.id)!=null?r:`headlessui-dialog-title-${ro()}`,s=eK("DialogTitle");return _n(()=>{s.setTitleId(i),ls(()=>s.setTitleId(null))}),()=>{let{...a}=t;return Wi({ourProps:{id:i},theirProps:a,slot:{open:s.dialogState.value===0},attrs:e,slots:n,name:"DialogTitle"})}}});var eke=(t=>(t[t.Open=0]="Open",t[t.Closed=1]="Closed",t))(eke||{});let qle=Symbol("DisclosureContext");function tK(t){let e=cr(qle,null);if(e===null){let n=new Error(`<${t} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,tK),n}return e}let Dle=Symbol("DisclosurePanelContext");function tke(){return cr(Dle,null)}let nke=pt({name:"Disclosure",props:{as:{type:[Object,String],default:"template"},defaultOpen:{type:[Boolean],default:!1}},setup(t,{slots:e,attrs:n}){let r=ze(t.defaultOpen?0:1),i=ze(null),s=ze(null),a={buttonId:ze(`headlessui-disclosure-button-${ro()}`),panelId:ze(`headlessui-disclosure-panel-${ro()}`),disclosureState:r,panel:i,button:s,toggleDisclosure(){r.value=Rs(r.value,{0:1,1:0})},closeDisclosure(){r.value!==1&&(r.value=1)},close(o){a.closeDisclosure();let l=(()=>o?o instanceof HTMLElement?o:o.value instanceof HTMLElement?mt(o):mt(a.button):mt(a.button))();l==null||l.focus()}};return Zi(qle,a),RV(et(()=>Rs(r.value,{0:ni.Open,1:ni.Closed}))),()=>{let{defaultOpen:o,...l}=t,u={open:r.value===0,close:a.close};return Wi({theirProps:l,ourProps:{},slot:u,slots:e,attrs:n,name:"Disclosure"})}}}),rke=pt({name:"DisclosureButton",props:{as:{type:[Object,String],default:"button"},disabled:{type:[Boolean],default:!1},id:{type:String,default:null}},setup(t,{attrs:e,slots:n,expose:r}){let i=tK("DisclosureButton"),s=tke(),a=et(()=>s===null?!1:s.value===i.panelId.value);_n(()=>{a.value||t.id!==null&&(i.buttonId.value=t.id)}),ls(()=>{a.value||(i.buttonId.value=null)});let o=ze(null);r({el:o,$el:o}),a.value||Ps(()=>{i.button.value=o.value});let l=PV(et(()=>({as:t.as,type:e.type})),o);function u(){var f;t.disabled||(a.value?(i.toggleDisclosure(),(f=mt(i.button))==null||f.focus()):i.toggleDisclosure())}function c(f){var h;if(!t.disabled)if(a.value)switch(f.key){case nr.Space:case nr.Enter:f.preventDefault(),f.stopPropagation(),i.toggleDisclosure(),(h=mt(i.button))==null||h.focus();break}else switch(f.key){case nr.Space:case nr.Enter:f.preventDefault(),f.stopPropagation(),i.toggleDisclosure();break}}function d(f){switch(f.key){case nr.Space:f.preventDefault();break}}return()=>{var f;let h={open:i.disclosureState.value===0},{id:p,...m}=t,v=a.value?{ref:o,type:l.value,onClick:u,onKeydown:c}:{id:(f=i.buttonId.value)!=null?f:p,ref:o,type:l.value,"aria-expanded":i.disclosureState.value===0,"aria-controls":i.disclosureState.value===0||mt(i.panel)?i.panelId.value:void 0,disabled:t.disabled?!0:void 0,onClick:u,onKeydown:c,onKeyup:d};return Wi({ourProps:v,theirProps:m,slot:h,attrs:e,slots:n,name:"DisclosureButton"})}}}),ike=pt({name:"DisclosurePanel",props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:null}},setup(t,{attrs:e,slots:n,expose:r}){let i=tK("DisclosurePanel");_n(()=>{t.id!==null&&(i.panelId.value=t.id)}),ls(()=>{i.panelId.value=null}),r({el:i.panel,$el:i.panel}),Zi(Dle,i.panelId);let s=uy(),a=et(()=>s!==null?(s.value&ni.Open)===ni.Open:i.disclosureState.value===0);return()=>{var o;let l={open:i.disclosureState.value===0,close:i.close},{id:u,...c}=t,d={id:(o=i.panelId.value)!=null?o:u,ref:i.panel};return Wi({ourProps:d,theirProps:c,slot:l,attrs:e,slots:n,features:_c.RenderStrategy|_c.Static,visible:a.value,name:"DisclosurePanel"})}}}),Yj=/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g;function Bj(t){var e,n;let r=(e=t.innerText)!=null?e:"",i=t.cloneNode(!0);if(!(i instanceof HTMLElement))return r;let s=!1;for(let o of i.querySelectorAll('[hidden],[aria-hidden],[role="img"]'))o.remove(),s=!0;let a=s?(n=i.innerText)!=null?n:"":r;return Yj.test(a)&&(a=a.replace(Yj,"")),a}function ske(t){let e=t.getAttribute("aria-label");if(typeof e=="string")return e.trim();let n=t.getAttribute("aria-labelledby");if(n){let r=n.split(" ").map(i=>{let s=document.getElementById(i);if(s){let a=s.getAttribute("aria-label");return typeof a=="string"?a.trim():Bj(s).trim()}return null}).filter(Boolean);if(r.length>0)return r.join(", ")}return Bj(t).trim()}function ake(t){let e=ze(""),n=ze("");return()=>{let r=mt(t);if(!r)return"";let i=r.innerText;if(e.value===i)return n.value;let s=ske(r).trim().toLowerCase();return e.value=i,n.value=s,s}}var oke=(t=>(t[t.Open=0]="Open",t[t.Closed=1]="Closed",t))(oke||{}),lke=(t=>(t[t.Pointer=0]="Pointer",t[t.Other=1]="Other",t))(lke||{});function uke(t){requestAnimationFrame(()=>requestAnimationFrame(t))}let Wle=Symbol("MenuContext");function VV(t){let e=cr(Wle,null);if(e===null){let n=new Error(`<${t} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,VV),n}return e}let Ale=pt({name:"Menu",props:{as:{type:[Object,String],default:"template"}},setup(t,{slots:e,attrs:n}){let r=ze(1),i=ze(null),s=ze(null),a=ze([]),o=ze(""),l=ze(null),u=ze(1);function c(f=h=>h){let h=l.value!==null?a.value[l.value]:null,p=Mle(f(a.value.slice()),v=>mt(v.dataRef.domRef)),m=h?p.indexOf(h):null;return m===-1&&(m=null),{items:p,activeItemIndex:m}}let d={menuState:r,buttonRef:i,itemsRef:s,items:a,searchQuery:o,activeItemIndex:l,activationTrigger:u,closeMenu:()=>{r.value=1,l.value=null},openMenu:()=>r.value=0,goToItem(f,h,p){let m=c(),v=zze(f===al.Specific?{focus:al.Specific,id:h}:{focus:f},{resolveItems:()=>m.items,resolveActiveIndex:()=>m.activeItemIndex,resolveId:g=>g.id,resolveDisabled:g=>g.dataRef.disabled});o.value="",l.value=v,u.value=p??1,a.value=m.items},search(f){let h=o.value!==""?0:1;o.value+=f.toLowerCase();let p=(l.value!==null?a.value.slice(l.value+h).concat(a.value.slice(0,l.value+h)):a.value).find(v=>v.dataRef.textValue.startsWith(o.value)&&!v.dataRef.disabled),m=p?a.value.indexOf(p):-1;m===-1||m===l.value||(l.value=m,u.value=1)},clearSearch(){o.value=""},registerItem(f,h){let p=c(m=>[...m,{id:f,dataRef:h}]);a.value=p.items,l.value=p.activeItemIndex,u.value=1},unregisterItem(f){let h=c(p=>{let m=p.findIndex(v=>v.id===f);return m!==-1&&p.splice(m,1),p});a.value=h.items,l.value=h.activeItemIndex,u.value=1}};return HC([i,s],(f,h)=>{var p;d.closeMenu(),MV(h,EV.Loose)||(f.preventDefault(),(p=mt(i))==null||p.focus())},et(()=>r.value===0)),Zi(Wle,d),RV(et(()=>Rs(r.value,{0:ni.Open,1:ni.Closed}))),()=>{let f={open:r.value===0,close:d.closeMenu};return Wi({ourProps:{},theirProps:t,slot:f,slots:e,attrs:n,name:"Menu"})}}}),Gle=pt({name:"MenuButton",props:{disabled:{type:Boolean,default:!1},as:{type:[Object,String],default:"button"},id:{type:String,default:null}},setup(t,{attrs:e,slots:n,expose:r}){var i;let s=(i=t.id)!=null?i:`headlessui-menu-button-${ro()}`,a=VV("MenuButton");r({el:a.buttonRef,$el:a.buttonRef});function o(d){switch(d.key){case nr.Space:case nr.Enter:case nr.ArrowDown:d.preventDefault(),d.stopPropagation(),a.openMenu(),Ia(()=>{var f;(f=mt(a.itemsRef))==null||f.focus({preventScroll:!0}),a.goToItem(al.First)});break;case nr.ArrowUp:d.preventDefault(),d.stopPropagation(),a.openMenu(),Ia(()=>{var f;(f=mt(a.itemsRef))==null||f.focus({preventScroll:!0}),a.goToItem(al.Last)});break}}function l(d){switch(d.key){case nr.Space:d.preventDefault();break}}function u(d){t.disabled||(a.menuState.value===0?(a.closeMenu(),Ia(()=>{var f;return(f=mt(a.buttonRef))==null?void 0:f.focus({preventScroll:!0})})):(d.preventDefault(),a.openMenu(),uke(()=>{var f;return(f=mt(a.itemsRef))==null?void 0:f.focus({preventScroll:!0})})))}let c=PV(et(()=>({as:t.as,type:e.type})),a.buttonRef);return()=>{var d;let f={open:a.menuState.value===0},{...h}=t,p={ref:a.buttonRef,id:s,type:c.value,"aria-haspopup":"menu","aria-controls":(d=mt(a.itemsRef))==null?void 0:d.id,"aria-expanded":a.menuState.value===0,onKeydown:o,onKeyup:l,onClick:u};return Wi({ourProps:p,theirProps:h,slot:f,attrs:e,slots:n,name:"MenuButton"})}}}),Fle=pt({name:"MenuItems",props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:null}},setup(t,{attrs:e,slots:n,expose:r}){var i;let s=(i=t.id)!=null?i:`headlessui-menu-items-${ro()}`,a=VV("MenuItems"),o=ze(null);r({el:a.itemsRef,$el:a.itemsRef}),wze({container:et(()=>mt(a.itemsRef)),enabled:et(()=>a.menuState.value===0),accept(f){return f.getAttribute("role")==="menuitem"?NodeFilter.FILTER_REJECT:f.hasAttribute("role")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT},walk(f){f.setAttribute("role","none")}});function l(f){var h;switch(o.value&&clearTimeout(o.value),f.key){case nr.Space:if(a.searchQuery.value!=="")return f.preventDefault(),f.stopPropagation(),a.search(f.key);case nr.Enter:if(f.preventDefault(),f.stopPropagation(),a.activeItemIndex.value!==null){let p=a.items.value[a.activeItemIndex.value];(h=mt(p.dataRef.domRef))==null||h.click()}a.closeMenu(),Ele(mt(a.buttonRef));break;case nr.ArrowDown:return f.preventDefault(),f.stopPropagation(),a.goToItem(al.Next);case nr.ArrowUp:return f.preventDefault(),f.stopPropagation(),a.goToItem(al.Previous);case nr.Home:case nr.PageUp:return f.preventDefault(),f.stopPropagation(),a.goToItem(al.First);case nr.End:case nr.PageDown:return f.preventDefault(),f.stopPropagation(),a.goToItem(al.Last);case nr.Escape:f.preventDefault(),f.stopPropagation(),a.closeMenu(),Ia(()=>{var p;return(p=mt(a.buttonRef))==null?void 0:p.focus({preventScroll:!0})});break;case nr.Tab:f.preventDefault(),f.stopPropagation(),a.closeMenu(),Ia(()=>yze(mt(a.buttonRef),f.shiftKey?Xs.Previous:Xs.Next));break;default:f.key.length===1&&(a.search(f.key),o.value=setTimeout(()=>a.clearSearch(),350));break}}function u(f){switch(f.key){case nr.Space:f.preventDefault();break}}let c=uy(),d=et(()=>c!==null?(c.value&ni.Open)===ni.Open:a.menuState.value===0);return()=>{var f,h;let p={open:a.menuState.value===0},{...m}=t,v={"aria-activedescendant":a.activeItemIndex.value===null||(f=a.items.value[a.activeItemIndex.value])==null?void 0:f.id,"aria-labelledby":(h=mt(a.buttonRef))==null?void 0:h.id,id:s,onKeydown:l,onKeyup:u,role:"menu",tabIndex:0,ref:a.itemsRef};return Wi({ourProps:v,theirProps:m,slot:p,attrs:e,slots:n,features:_c.RenderStrategy|_c.Static,visible:d.value,name:"MenuItems"})}}}),jle=pt({name:"MenuItem",inheritAttrs:!1,props:{as:{type:[Object,String],default:"template"},disabled:{type:Boolean,default:!1},id:{type:String,default:null}},setup(t,{slots:e,attrs:n,expose:r}){var i;let s=(i=t.id)!=null?i:`headlessui-menu-item-${ro()}`,a=VV("MenuItem"),o=ze(null);r({el:o,$el:o});let l=et(()=>a.activeItemIndex.value!==null?a.items.value[a.activeItemIndex.value].id===s:!1),u=ake(o),c=et(()=>({disabled:t.disabled,get textValue(){return u()},domRef:o}));_n(()=>a.registerItem(s,c)),ls(()=>a.unregisterItem(s)),Ps(()=>{a.menuState.value===0&&l.value&&a.activationTrigger.value!==0&&Ia(()=>{var g,b;return(b=(g=mt(o))==null?void 0:g.scrollIntoView)==null?void 0:b.call(g,{block:"nearest"})})});function d(g){if(t.disabled)return g.preventDefault();a.closeMenu(),Ele(mt(a.buttonRef))}function f(){if(t.disabled)return a.goToItem(al.Nothing);a.goToItem(al.Specific,s)}let h=Tze();function p(g){h.update(g)}function m(g){h.wasMoved(g)&&(t.disabled||l.value||a.goToItem(al.Specific,s,0))}function v(g){h.wasMoved(g)&&(t.disabled||l.value&&a.goToItem(al.Nothing))}return()=>{let{disabled:g,...b}=t,y={active:l.value,disabled:g,close:a.closeMenu};return Wi({ourProps:{id:s,ref:o,role:"menuitem",tabIndex:g===!0?void 0:-1,"aria-disabled":g===!0?!0:void 0,onClick:d,onFocus:f,onPointerenter:p,onMouseenter:p,onPointermove:m,onMousemove:m,onPointerleave:v,onMouseleave:v},theirProps:{...n,...b},slot:y,attrs:n,slots:e,name:"MenuItem"})}}});var cke=(t=>(t[t.Open=0]="Open",t[t.Closed=1]="Closed",t))(cke||{});let Zle=Symbol("PopoverContext");function nK(t){let e=cr(Zle,null);if(e===null){let n=new Error(`<${t} /> is missing a parent <${Hle.name} /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,nK),n}return e}let Jle=Symbol("PopoverGroupContext");function Yle(){return cr(Jle,null)}let Ble=Symbol("PopoverPanelContext");function dke(){return cr(Ble,null)}let Hle=pt({name:"Popover",inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"}},setup(t,{slots:e,attrs:n,expose:r}){var i;let s=ze(null);r({el:s,$el:s});let a=ze(1),o=ze(null),l=ze(null),u=ze(null),c=ze(null),d=et(()=>_l(s)),f=et(()=>{var T,M;if(!mt(o)||!mt(c))return!1;for(let k of document.querySelectorAll("body > *"))if(Number(k==null?void 0:k.contains(mt(o)))^Number(k==null?void 0:k.contains(mt(c))))return!0;let E=vT(),S=E.indexOf(mt(o)),P=(S+E.length-1)%E.length,R=(S+1)%E.length,V=E[P],z=E[R];return!((T=mt(c))!=null&&T.contains(V))&&!((M=mt(c))!=null&&M.contains(z))}),h={popoverState:a,buttonId:ze(null),panelId:ze(null),panel:c,button:o,isPortalled:f,beforePanelSentinel:l,afterPanelSentinel:u,togglePopover(){a.value=Rs(a.value,{0:1,1:0})},closePopover(){a.value!==1&&(a.value=1)},close(T){h.closePopover();let M=(()=>T?T instanceof HTMLElement?T:T.value instanceof HTMLElement?mt(T):mt(h.button):mt(h.button))();M==null||M.focus()}};Zi(Zle,h),RV(et(()=>Rs(a.value,{0:ni.Open,1:ni.Closed})));let p={buttonId:h.buttonId,panelId:h.panelId,close(){h.closePopover()}},m=Yle(),v=m==null?void 0:m.registerPopover,[g,b]=Cle(),y=Nle({mainTreeNodeRef:m==null?void 0:m.mainTreeNodeRef,portals:g,defaultContainers:[o,c]});function x(){var T,M,E,S;return(S=m==null?void 0:m.isFocusWithinPopoverGroup())!=null?S:((T=d.value)==null?void 0:T.activeElement)&&(((M=mt(o))==null?void 0:M.contains(d.value.activeElement))||((E=mt(c))==null?void 0:E.contains(d.value.activeElement)))}return Ps(()=>v==null?void 0:v(p)),_C((i=d.value)==null?void 0:i.defaultView,"focus",T=>{var M,E;T.target!==window&&T.target instanceof HTMLElement&&a.value===0&&(x()||o&&c&&(y.contains(T.target)||(M=mt(h.beforePanelSentinel))!=null&&M.contains(T.target)||(E=mt(h.afterPanelSentinel))!=null&&E.contains(T.target)||h.closePopover()))},!0),HC(y.resolveContainers,(T,M)=>{var E;h.closePopover(),MV(M,EV.Loose)||(T.preventDefault(),(E=mt(o))==null||E.focus())},et(()=>a.value===0)),()=>{let T={open:a.value===0,close:h.close};return An(Ct,[An(b,{},()=>Wi({theirProps:{...t,...n},ourProps:{ref:s},slot:T,slots:e,attrs:n,name:"Popover"})),An(y.MainTreeNode)])}}}),fke=pt({name:"PopoverButton",props:{as:{type:[Object,String],default:"button"},disabled:{type:[Boolean],default:!1},id:{type:String,default:null}},inheritAttrs:!1,setup(t,{attrs:e,slots:n,expose:r}){var i;let s=(i=t.id)!=null?i:`headlessui-popover-button-${ro()}`,a=nK("PopoverButton"),o=et(()=>_l(a.button));r({el:a.button,$el:a.button}),_n(()=>{a.buttonId.value=s}),ls(()=>{a.buttonId.value=null});let l=Yle(),u=l==null?void 0:l.closeOthers,c=dke(),d=et(()=>c===null?!1:c.value===a.panelId.value),f=ze(null),h=`headlessui-focus-sentinel-${ro()}`;d.value||Ps(()=>{a.button.value=mt(f)});let p=PV(et(()=>({as:t.as,type:e.type})),f);function m(T){var M,E,S,P,R;if(d.value){if(a.popoverState.value===1)return;switch(T.key){case nr.Space:case nr.Enter:T.preventDefault(),(E=(M=T.target).click)==null||E.call(M),a.closePopover(),(S=mt(a.button))==null||S.focus();break}}else switch(T.key){case nr.Space:case nr.Enter:T.preventDefault(),T.stopPropagation(),a.popoverState.value===1&&(u==null||u(a.buttonId.value)),a.togglePopover();break;case nr.Escape:if(a.popoverState.value!==0)return u==null?void 0:u(a.buttonId.value);if(!mt(a.button)||(P=o.value)!=null&&P.activeElement&&!((R=mt(a.button))!=null&&R.contains(o.value.activeElement)))return;T.preventDefault(),T.stopPropagation(),a.closePopover();break}}function v(T){d.value||T.key===nr.Space&&T.preventDefault()}function g(T){var M,E;t.disabled||(d.value?(a.closePopover(),(M=mt(a.button))==null||M.focus()):(T.preventDefault(),T.stopPropagation(),a.popoverState.value===1&&(u==null||u(a.buttonId.value)),a.togglePopover(),(E=mt(a.button))==null||E.focus()))}function b(T){T.preventDefault(),T.stopPropagation()}let y=$C();function x(){let T=mt(a.panel);if(!T)return;function M(){Rs(y.value,{[ol.Forwards]:()=>Wl(T,Xs.First),[ol.Backwards]:()=>Wl(T,Xs.Last)})===t6.Error&&Wl(vT().filter(E=>E.dataset.headlessuiFocusGuard!=="true"),Rs(y.value,{[ol.Forwards]:Xs.Next,[ol.Backwards]:Xs.Previous}),{relativeTo:mt(a.button)})}M()}return()=>{let T=a.popoverState.value===0,M={open:T},{...E}=t,S=d.value?{ref:f,type:p.value,onKeydown:m,onClick:g}:{ref:f,id:s,type:p.value,"aria-expanded":a.popoverState.value===0,"aria-controls":mt(a.panel)?a.panelId.value:void 0,disabled:t.disabled?!0:void 0,onKeydown:m,onKeyup:v,onClick:g,onMousedown:b};return An(Ct,[Wi({ourProps:S,theirProps:{...e,...E},slot:M,attrs:e,slots:n,name:"PopoverButton"}),T&&!d.value&&a.isPortalled.value&&An(Op,{id:h,features:bf.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:x})])}}}),hke=pt({name:"PopoverPanel",props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},focus:{type:Boolean,default:!1},id:{type:String,default:null}},inheritAttrs:!1,setup(t,{attrs:e,slots:n,expose:r}){var i;let s=(i=t.id)!=null?i:`headlessui-popover-panel-${ro()}`,{focus:a}=t,o=nK("PopoverPanel"),l=et(()=>_l(o.panel)),u=`headlessui-focus-sentinel-before-${ro()}`,c=`headlessui-focus-sentinel-after-${ro()}`;r({el:o.panel,$el:o.panel}),_n(()=>{o.panelId.value=s}),ls(()=>{o.panelId.value=null}),Zi(Ble,o.panelId),Ps(()=>{var b,y;if(!a||o.popoverState.value!==0||!o.panel)return;let x=(b=l.value)==null?void 0:b.activeElement;(y=mt(o.panel))!=null&&y.contains(x)||Wl(mt(o.panel),Xs.First)});let d=uy(),f=et(()=>d!==null?(d.value&ni.Open)===ni.Open:o.popoverState.value===0);function h(b){var y,x;switch(b.key){case nr.Escape:if(o.popoverState.value!==0||!mt(o.panel)||l.value&&!((y=mt(o.panel))!=null&&y.contains(l.value.activeElement)))return;b.preventDefault(),b.stopPropagation(),o.closePopover(),(x=mt(o.button))==null||x.focus();break}}function p(b){var y,x,T,M,E;let S=b.relatedTarget;S&&mt(o.panel)&&((y=mt(o.panel))!=null&&y.contains(S)||(o.closePopover(),((T=(x=mt(o.beforePanelSentinel))==null?void 0:x.contains)!=null&&T.call(x,S)||(E=(M=mt(o.afterPanelSentinel))==null?void 0:M.contains)!=null&&E.call(M,S))&&S.focus({preventScroll:!0})))}let m=$C();function v(){let b=mt(o.panel);if(!b)return;function y(){Rs(m.value,{[ol.Forwards]:()=>{var x;Wl(b,Xs.First)===t6.Error&&((x=mt(o.afterPanelSentinel))==null||x.focus())},[ol.Backwards]:()=>{var x;(x=mt(o.button))==null||x.focus({preventScroll:!0})}})}y()}function g(){let b=mt(o.panel);if(!b)return;function y(){Rs(m.value,{[ol.Forwards]:()=>{let x=mt(o.button),T=mt(o.panel);if(!x)return;let M=vT(),E=M.indexOf(x),S=M.slice(0,E+1),P=[...M.slice(E+1),...S];for(let R of P.slice())if(R.dataset.headlessuiFocusGuard==="true"||T!=null&&T.contains(R)){let V=P.indexOf(R);V!==-1&&P.splice(V,1)}Wl(P,Xs.First,{sorted:!1})},[ol.Backwards]:()=>{var x;Wl(b,Xs.Previous)===t6.Error&&((x=mt(o.button))==null||x.focus())}})}y()}return()=>{let b={open:o.popoverState.value===0,close:o.close},{focus:y,...x}=t,T={ref:o.panel,id:s,onKeydown:h,onFocusout:a&&o.popoverState.value===0?p:void 0,tabIndex:-1};return Wi({ourProps:T,theirProps:{...e,...x},attrs:e,slot:b,slots:{...n,default:(...M)=>{var E;return[An(Ct,[f.value&&o.isPortalled.value&&An(Op,{id:u,ref:o.beforePanelSentinel,features:bf.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:v}),(E=n.default)==null?void 0:E.call(n,...M),f.value&&o.isPortalled.value&&An(Op,{id:c,ref:o.afterPanelSentinel,features:bf.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:g})])]}},features:_c.RenderStrategy|_c.Static,visible:f.value,name:"PopoverPanel"})}}}),pke=pt({name:"PopoverGroup",inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"}},setup(t,{attrs:e,slots:n,expose:r}){let i=ze(null),s=c0([]),a=et(()=>_l(i)),o=Aze();r({el:i,$el:i});function l(f){let h=s.value.indexOf(f);h!==-1&&s.value.splice(h,1)}function u(f){return s.value.push(f),()=>{l(f)}}function c(){var f;let h=a.value;if(!h)return!1;let p=h.activeElement;return(f=mt(i))!=null&&f.contains(p)?!0:s.value.some(m=>{var v,g;return((v=h.getElementById(m.buttonId.value))==null?void 0:v.contains(p))||((g=h.getElementById(m.panelId.value))==null?void 0:g.contains(p))})}function d(f){for(let h of s.value)h.buttonId.value!==f&&h.close()}return Zi(Jle,{registerPopover:u,unregisterPopover:l,isFocusWithinPopoverGroup:c,closeOthers:d,mainTreeNodeRef:o.mainTreeNodeRef}),()=>An(Ct,[Wi({ourProps:{ref:i},theirProps:{...t,...e},slot:{},attrs:e,slots:n,name:"PopoverGroup"}),An(o.MainTreeNode)])}}),mke=Symbol("GroupContext"),vke=pt({name:"Switch",emits:{"update:modelValue":t=>!0},props:{as:{type:[Object,String],default:"button"},modelValue:{type:Boolean,default:void 0},defaultChecked:{type:Boolean,optional:!0},form:{type:String,optional:!0},name:{type:String,optional:!0},value:{type:String,optional:!0},id:{type:String,default:null},disabled:{type:Boolean,default:!1},tabIndex:{type:Number,default:0}},inheritAttrs:!1,setup(t,{emit:e,attrs:n,slots:r,expose:i}){var s;let a=(s=t.id)!=null?s:`headlessui-switch-${ro()}`,o=cr(mke,null),[l,u]=uze(et(()=>t.modelValue),b=>e("update:modelValue",b),et(()=>t.defaultChecked));function c(){u(!l.value)}let d=ze(null),f=o===null?d:o.switchRef,h=PV(et(()=>({as:t.as,type:n.type})),f);i({el:f,$el:f});function p(b){b.preventDefault(),c()}function m(b){b.key===nr.Space?(b.preventDefault(),c()):b.key===nr.Enter&&kze(b.currentTarget)}function v(b){b.preventDefault()}let g=et(()=>{var b,y;return(y=(b=mt(f))==null?void 0:b.closest)==null?void 0:y.call(b,"form")});return _n(()=>{jt([g],()=>{if(!g.value||t.defaultChecked===void 0)return;function b(){u(t.defaultChecked)}return g.value.addEventListener("reset",b),()=>{var y;(y=g.value)==null||y.removeEventListener("reset",b)}},{immediate:!0})}),()=>{let{name:b,value:y,form:x,tabIndex:T,...M}=t,E={checked:l.value},S={id:a,ref:f,role:"switch",type:h.value,tabIndex:T===-1?0:T,"aria-checked":l.value,"aria-labelledby":o==null?void 0:o.labelledby.value,"aria-describedby":o==null?void 0:o.describedby.value,onClick:p,onKeyup:m,onKeypress:v};return An(Ct,[b!=null&&l.value!=null?An(Op,Eze({features:bf.Hidden,as:"input",type:"checkbox",hidden:!0,readOnly:!0,checked:l.value,form:x,disabled:M.disabled,name:b,value:y})):null,Wi({ourProps:S,theirProps:{...n,...QC(M,["modelValue","defaultChecked"])},slot:E,attrs:n,slots:r,name:"Switch"})])}}});function gke(t){let e={called:!1};return(...n)=>{if(!e.called)return e.called=!0,t(...n)}}function rk(t,...e){t&&e.length>0&&t.classList.add(...e)}function f2(t,...e){t&&e.length>0&&t.classList.remove(...e)}var mL=(t=>(t.Finished="finished",t.Cancelled="cancelled",t))(mL||{});function bke(t,e){let n=pT();if(!t)return n.dispose;let{transitionDuration:r,transitionDelay:i}=getComputedStyle(t),[s,a]=[r,i].map(o=>{let[l=0]=o.split(",").filter(Boolean).map(u=>u.includes("ms")?parseFloat(u):parseFloat(u)*1e3).sort((u,c)=>c-u);return l});return s!==0?n.setTimeout(()=>e("finished"),s+a):e("finished"),n.add(()=>e("cancelled")),n.dispose}function Hj(t,e,n,r,i,s){let a=pT(),o=s!==void 0?gke(s):()=>{};return f2(t,...i),rk(t,...e,...n),a.nextFrame(()=>{f2(t,...n),rk(t,...r),a.add(bke(t,l=>(f2(t,...r,...e),rk(t,...i),o(l))))}),a.add(()=>f2(t,...e,...n,...r,...i)),a.add(()=>o("cancelled")),a.dispose}function Mm(t=""){return t.split(/\s+/).filter(e=>e.length>1)}let rK=Symbol("TransitionContext");var yke=(t=>(t.Visible="visible",t.Hidden="hidden",t))(yke||{});function Ske(){return cr(rK,null)!==null}function xke(){let t=cr(rK,null);if(t===null)throw new Error("A is used but it is missing a parent .");return t}function Tke(){let t=cr(iK,null);if(t===null)throw new Error("A is used but it is missing a parent .");return t}let iK=Symbol("NestingContext");function zV(t){return"children"in t?zV(t.children):t.value.filter(({state:e})=>e==="visible").length>0}function Qle(t){let e=ze([]),n=ze(!1);_n(()=>n.value=!0),ls(()=>n.value=!1);function r(s,a=Zh.Hidden){let o=e.value.findIndex(({id:l})=>l===s);o!==-1&&(Rs(a,{[Zh.Unmount](){e.value.splice(o,1)},[Zh.Hidden](){e.value[o].state="hidden"}}),!zV(e)&&n.value&&(t==null||t()))}function i(s){let a=e.value.find(({id:o})=>o===s);return a?a.state!=="visible"&&(a.state="visible"):e.value.push({id:s,state:"visible"}),()=>r(s,Zh.Unmount)}return{children:e,register:i,unregister:r}}let _le=_c.RenderStrategy,Zu=pt({props:{as:{type:[Object,String],default:"div"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:""},enterFrom:{type:[String],default:""},enterTo:{type:[String],default:""},entered:{type:[String],default:""},leave:{type:[String],default:""},leaveFrom:{type:[String],default:""},leaveTo:{type:[String],default:""}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(t,{emit:e,attrs:n,slots:r,expose:i}){let s=ze(0);function a(){s.value|=ni.Opening,e("beforeEnter")}function o(){s.value&=~ni.Opening,e("afterEnter")}function l(){s.value|=ni.Closing,e("beforeLeave")}function u(){s.value&=~ni.Closing,e("afterLeave")}if(!Ske()&&Pze())return()=>An(Ju,{...t,onBeforeEnter:a,onAfterEnter:o,onBeforeLeave:l,onAfterLeave:u},r);let c=ze(null),d=et(()=>t.unmount?Zh.Unmount:Zh.Hidden);i({el:c,$el:c});let{show:f,appear:h}=xke(),{register:p,unregister:m}=Tke(),v=ze(f.value?"visible":"hidden"),g={value:!0},b=ro(),y={value:!1},x=Qle(()=>{!y.value&&v.value!=="hidden"&&(v.value="hidden",m(b),u())});_n(()=>{let k=p(b);ls(k)}),Ps(()=>{if(d.value===Zh.Hidden&&b){if(f.value&&v.value!=="visible"){v.value="visible";return}Rs(v.value,{hidden:()=>m(b),visible:()=>p(b)})}});let T=Mm(t.enter),M=Mm(t.enterFrom),E=Mm(t.enterTo),S=Mm(t.entered),P=Mm(t.leave),R=Mm(t.leaveFrom),V=Mm(t.leaveTo);_n(()=>{Ps(()=>{if(v.value==="visible"){let k=mt(c);if(k instanceof Comment&&k.data==="")throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")}})});function z(k){let N=g.value&&!h.value,q=mt(c);!q||!(q instanceof HTMLElement)||N||(y.value=!0,f.value&&a(),f.value||l(),k(f.value?Hj(q,T,M,E,S,L=>{y.value=!1,L===mL.Finished&&o()}):Hj(q,P,R,V,S,L=>{y.value=!1,L===mL.Finished&&(zV(x)||(v.value="hidden",m(b),u()))})))}return _n(()=>{jt([f],(k,N,q)=>{z(q),g.value=!1},{immediate:!0})}),Zi(iK,x),RV(et(()=>Rs(v.value,{visible:ni.Open,hidden:ni.Closed})|s.value)),()=>{let{appear:k,show:N,enter:q,enterFrom:L,enterTo:A,entered:Z,leave:j,leaveFrom:ne,leaveTo:G,...B}=t,ee={ref:c},ce={...B,...h.value&&f.value&&mT.isServer?{class:En([n.class,B.class,...T,...M])}:{}};return Wi({theirProps:ce,ourProps:ee,slot:{},slots:r,attrs:n,features:_le,visible:v.value==="visible",name:"TransitionChild"})}}}),wke=Zu,Ju=pt({inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:""},enterFrom:{type:[String],default:""},enterTo:{type:[String],default:""},entered:{type:[String],default:""},leave:{type:[String],default:""},leaveFrom:{type:[String],default:""},leaveTo:{type:[String],default:""}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(t,{emit:e,attrs:n,slots:r}){let i=uy(),s=et(()=>t.show===null&&i!==null?(i.value&ni.Open)===ni.Open:t.show);Ps(()=>{if(![!0,!1].includes(s.value))throw new Error('A is used but it is missing a `:show="true | false"` prop.')});let a=ze(s.value?"visible":"hidden"),o=Qle(()=>{a.value="hidden"}),l=ze(!0),u={show:s,appear:et(()=>t.appear||!l.value)};return _n(()=>{Ps(()=>{l.value=!1,s.value?a.value="visible":zV(o)||(a.value="hidden")})}),Zi(iK,o),Zi(rK,u),()=>{let c=QC(t,["show","appear","unmount","onBeforeEnter","onBeforeLeave","onAfterEnter","onAfterLeave"]),d={unmount:t.unmount};return Wi({ourProps:{...d,as:"template"},theirProps:{},slot:{},slots:{...r,default:()=>[An(wke,{onBeforeEnter:()=>e("beforeEnter"),onAfterEnter:()=>e("afterEnter"),onBeforeLeave:()=>e("beforeLeave"),onAfterLeave:()=>e("afterLeave"),...n,...d,...c},r.default)]},attrs:{},features:_le,visible:a.value==="visible",name:"Transition"})}}});const li=h0({id:"navigationStore",state:()=>({activePage:"Projects",slideoverOpen:!1,editName:null,groupModalOpen:!1,mappingModalOpen:!1,loading:!1,groupColorMode:!1,sideBarShow:!0,saveModalOpen:!1,assemblyModalOpen:!1,assemblyTableShow:!1,settingsModalOpen:!1}),actions:{setActivePage(t){this.activePage=t},toggleSlideover(){this.slideoverOpen=!this.slideoverOpen},toggleLoading(){this.loading=!this.loading},toggleGroupModal(){this.groupModalOpen=!this.groupModalOpen},toggleMappingModal(){this.mappingModalOpen=!this.mappingModalOpen},toggleSettingsModal(){this.settingsModalOpen=!this.settingsModalOpen},toggleEditName(t){this.editName===t?this.editName=null:this.editName=t},toggleColorMode(){this.groupColorMode=!this.groupColorMode},toggleSideBar(){this.sideBarShow=!this.sideBarShow},toggleSaveModal(){this.saveModalOpen=!this.saveModalOpen},toggleAssemblyModal(){this.assemblyModalOpen=!this.assemblyModalOpen},toggleAssemblyTable(){this.assemblyTableShow=!this.assemblyTableShow}},getters:{getActivePage:t=>t.activePage,getSlideoverOpen:t=>t.slideoverOpen}}),Eke=pt({name:"PacmanLoader",components:{Dialog:_p,TransitionRoot:Ju,TransitionChild:Zu},props:{color:{type:String,default:"#22B864"},size:{type:String,default:"50px"},dotSize:{type:String,default:"25px"},margin:{type:String,default:"2px"},radius:{type:String,default:"100%"}},setup(t){const e=li(),n=ai(e),r=[.25,.5,.75,1].map(o=>({animationDelay:`${o}s`})),i=et(()=>({backgroundColor:t.color,width:t.size,height:t.size,margin:t.margin,borderRadius:t.radius})),s=et(()=>({width:0,height:0,borderTop:`${t.size} solid ${t.color}`,borderRight:`${t.size} solid transparent`,borderBottom:`${t.size} solid ${t.color}`,borderLeft:`${t.size} solid ${t.color}`,borderRadius:t.size})),a={width:t.dotSize,height:t.dotSize,transform:`translate(0, -${parseFloat(t.dotSize)/4}px)`,position:"absolute",top:"40px",left:"200px",animationName:"v-pacmanStretchDelay",animationDuration:"1s",animationIterationCount:"infinite",animationTimingFunction:"linear",animationFillMode:"both"};return{navRef:n,delays:r,spinnerStyle:i,spinnerStyle1:s,animationStyle:a}}});const Vt=(t,e)=>{const n=t.__vccOpts||t;for(const[r,i]of e)n[r]=i;return n},Mke={class:"fixed inset-0 z-10 w-screen overflow-y-auto"},Pke={class:"flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0"},Rke={class:"flex v-spinner text-center"},Vke={class:"relative inline-block",style:{fontSize:"0"}};function zke(t,e,n,r,i,s){const a=Xe("TransitionChild"),o=Xe("Dialog"),l=Xe("TransitionRoot");return pe(),Gt(l,{as:"template",show:t.navRef.loading.value},{default:ft(()=>[xe(o,{as:"div",class:"relative z-10"},{default:ft(()=>[xe(a,{as:"template",enter:"ease-out duration-300","enter-from":"opacity-0","enter-to":"opacity-100",leave:"ease-in duration-200","leave-from":"opacity-100","leave-to":"opacity-0"},{default:ft(()=>e[0]||(e[0]=[O("div",{class:"fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"},null,-1)])),_:1}),O("div",Mke,[O("div",Pke,[xe(a,{as:"template",enter:"ease-out duration-300","enter-from":"opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95","enter-to":"opacity-100 translate-y-0 sm:scale-100",leave:"ease-in duration-200","leave-from":"opacity-100 translate-y-0 sm:scale-100","leave-to":"opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"},{default:ft(()=>[hn(O("div",Rke,[O("div",Vke,[O("div",{class:"v-pacman v-pacman1",style:Ms(t.spinnerStyle1)},null,4),(pe(!0),ke(Ct,null,Pi(t.delays,(u,c)=>(pe(),ke("div",{key:c,class:En(`v-pacman v-pacman${c+2}`),style:Ms([t.spinnerStyle,t.animationStyle,u])},null,6))),128))])],512),[[lC,t.navRef.loading]])]),_:1}),e[1]||(e[1]=O("p",{class:"flex text-slate-100 text-3xl text-left mt-36 font-medium"}," Loading... ",-1))])])]),_:1})]),_:1},8,["show"])}const kke=Vt(Eke,[["render",zke]]),Oke=pt({name:"SpeckLCA",components:{pacmanLoader:kke},setup(){const t=h2e();if(t.redirectedFrom!==null){const e=t.redirectedFrom,n=t.path,r=t.query,i=t.params;ef(`Route redirected from ${e} to ${n} with query params ${JSON.stringify(r)} and params ${JSON.stringify(i)}`,"warning")}return{route:t}}}),Ike={id:"app"};function Uke(t,e,n,r,i,s){const a=Xe("pacman-loader"),o=Xe("router-view");return pe(),ke("div",Ike,[xe(a),xe(o)])}const Nke=Vt(Oke,[["render",Uke]]);function Qj(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M10 1c-1.716 0-3.408.106-5.07.31C3.806 1.45 3 2.414 3 3.517V16.75A2.25 2.25 0 0 0 5.25 19h9.5A2.25 2.25 0 0 0 17 16.75V3.517c0-1.103-.806-2.068-1.93-2.207A41.403 41.403 0 0 0 10 1ZM5.99 8.75A.75.75 0 0 1 6.74 8h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm-.75 2.916a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm1.417-5.75a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm-.75 2.916a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm1.42-5.75a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm-.75 2.916a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01ZM12.5 8.75a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm0 2.166a.75.75 0 0 1 .75.75v2.167a.75.75 0 1 1-1.5 0v-2.167a.75.75 0 0 1 .75-.75ZM6.75 4a.75.75 0 0 0-.75.75v.5c0 .414.336.75.75.75h6.5a.75.75 0 0 0 .75-.75v-.5a.75.75 0 0 0-.75-.75h-6.5Z","clip-rule":"evenodd"})])}function $le(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z","clip-rule":"evenodd"})])}function eue(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z","clip-rule":"evenodd"})])}function Lke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M9.47 6.47a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 1 1-1.06 1.06L10 8.06l-3.72 3.72a.75.75 0 0 1-1.06-1.06l4.25-4.25Z","clip-rule":"evenodd"})])}function Xke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Zm7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06ZM11.377 2.011a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612Z","clip-rule":"evenodd"})])}function Cke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{d:"M10 12.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z"}),O("path",{"fill-rule":"evenodd",d:"M.664 10.59a1.651 1.651 0 0 1 0-1.186A10.004 10.004 0 0 1 10 3c4.257 0 7.893 2.66 9.336 6.41.147.381.146.804 0 1.186A10.004 10.004 0 0 1 10 17c-4.257 0-7.893-2.66-9.336-6.41ZM14 10a4 4 0 1 1-8 0 4 4 0 0 1 8 0Z","clip-rule":"evenodd"})])}function _j(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M10 2.5c-1.31 0-2.526.386-3.546 1.051a.75.75 0 0 1-.82-1.256A8 8 0 0 1 18 9a22.47 22.47 0 0 1-1.228 7.351.75.75 0 1 1-1.417-.49A20.97 20.97 0 0 0 16.5 9 6.5 6.5 0 0 0 10 2.5ZM4.333 4.416a.75.75 0 0 1 .218 1.038A6.466 6.466 0 0 0 3.5 9a7.966 7.966 0 0 1-1.293 4.362.75.75 0 0 1-1.257-.819A6.466 6.466 0 0 0 2 9c0-1.61.476-3.11 1.295-4.365a.75.75 0 0 1 1.038-.219ZM10 6.12a3 3 0 0 0-3.001 3.041 11.455 11.455 0 0 1-2.697 7.24.75.75 0 0 1-1.148-.965A9.957 9.957 0 0 0 5.5 9c0-.028.002-.055.004-.082a4.5 4.5 0 0 1 8.996.084V9.15l-.005.297a.75.75 0 1 1-1.5-.034c.003-.11.004-.219.005-.328a3 3 0 0 0-3-2.965Zm0 2.13a.75.75 0 0 1 .75.75c0 3.51-1.187 6.745-3.181 9.323a.75.75 0 1 1-1.186-.918A13.687 13.687 0 0 0 9.25 9a.75.75 0 0 1 .75-.75Zm3.529 3.698a.75.75 0 0 1 .584.885 18.883 18.883 0 0 1-2.257 5.84.75.75 0 1 1-1.29-.764 17.386 17.386 0 0 0 2.078-5.377.75.75 0 0 1 .885-.584Z","clip-rule":"evenodd"})])}function Kke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M2.628 1.601C5.028 1.206 7.49 1 10 1s4.973.206 7.372.601a.75.75 0 0 1 .628.74v2.288a2.25 2.25 0 0 1-.659 1.59l-4.682 4.683a2.25 2.25 0 0 0-.659 1.59v3.037c0 .684-.31 1.33-.844 1.757l-1.937 1.55A.75.75 0 0 1 8 18.25v-5.757a2.25 2.25 0 0 0-.659-1.591L2.659 6.22A2.25 2.25 0 0 1 2 4.629V2.34a.75.75 0 0 1 .628-.74Z","clip-rule":"evenodd"})])}function qke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{d:"M14.916 2.404a.75.75 0 0 1-.32 1.011l-.596.31V17a1 1 0 0 1-1 1h-2.26a.75.75 0 0 1-.75-.75v-3.5a.75.75 0 0 0-.75-.75H6.75a.75.75 0 0 0-.75.75v3.5a.75.75 0 0 1-.75.75h-3.5a.75.75 0 0 1 0-1.5H2V9.957a.75.75 0 0 1-.596-1.372L2 8.275V5.75a.75.75 0 0 1 1.5 0v1.745l10.404-5.41a.75.75 0 0 1 1.012.319ZM15.861 8.57a.75.75 0 0 1 .736-.025l1.999 1.04A.75.75 0 0 1 18 10.957V16.5h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1-.75-.75V9.21a.75.75 0 0 1 .361-.64Z"})])}function Dke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M9.293 2.293a1 1 0 0 1 1.414 0l7 7A1 1 0 0 1 17 11h-1v6a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-3a1 1 0 0 0-1-1H9a1 1 0 0 0-1 1v3a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-6H3a1 1 0 0 1-.707-1.707l7-7Z","clip-rule":"evenodd"})])}function Wke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{d:"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}),O("path",{d:"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"})])}function Ake(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM6.75 9.25a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5h-6.5Z","clip-rule":"evenodd"})])}function Gke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{d:"M15.993 1.385a1.87 1.87 0 0 1 2.623 2.622l-4.03 5.27a12.749 12.749 0 0 1-4.237 3.562 4.508 4.508 0 0 0-3.188-3.188 12.75 12.75 0 0 1 3.562-4.236l5.27-4.03ZM6 11a3 3 0 0 0-3 3 .5.5 0 0 1-.72.45.75.75 0 0 0-1.035.931A4.001 4.001 0 0 0 9 14.004V14a3.01 3.01 0 0 0-1.66-2.685A2.99 2.99 0 0 0 6 11Z"})])}function Fke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm.75-11.25a.75.75 0 0 0-1.5 0v2.5h-2.5a.75.75 0 0 0 0 1.5h2.5v2.5a.75.75 0 0 0 1.5 0v-2.5h2.5a.75.75 0 0 0 0-1.5h-2.5v-2.5Z","clip-rule":"evenodd"})])}function jke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{d:"M4.464 3.162A2 2 0 0 1 6.28 2h7.44a2 2 0 0 1 1.816 1.162l1.154 2.5c.067.145.115.291.145.438A3.508 3.508 0 0 0 16 6H4c-.288 0-.568.035-.835.1.03-.147.078-.293.145-.438l1.154-2.5Z"}),O("path",{"fill-rule":"evenodd",d:"M2 9.5a2 2 0 0 1 2-2h12a2 2 0 1 1 0 4H4a2 2 0 0 1-2-2Zm13.24 0a.75.75 0 0 1 .75-.75H16a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75V9.5Zm-2.25-.75a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75H13a.75.75 0 0 0 .75-.75V9.5a.75.75 0 0 0-.75-.75h-.01ZM2 15a2 2 0 0 1 2-2h12a2 2 0 1 1 0 4H4a2 2 0 0 1-2-2Zm13.24 0a.75.75 0 0 1 .75-.75H16a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75V15Zm-2.25-.75a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75H13a.75.75 0 0 0 .75-.75V15a.75.75 0 0 0-.75-.75h-.01Z","clip-rule":"evenodd"})])}function $j(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-5.5-2.5a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0ZM10 12a5.99 5.99 0 0 0-4.793 2.39A6.483 6.483 0 0 0 10 16.5a6.483 6.483 0 0 0 4.793-2.11A5.99 5.99 0 0 0 10 12Z","clip-rule":"evenodd"})])}function Zke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{d:"M3.25 4A2.25 2.25 0 0 0 1 6.25v7.5A2.25 2.25 0 0 0 3.25 16h7.5A2.25 2.25 0 0 0 13 13.75v-7.5A2.25 2.25 0 0 0 10.75 4h-7.5ZM19 4.75a.75.75 0 0 0-1.28-.53l-3 3a.75.75 0 0 0-.22.53v4.5c0 .199.079.39.22.53l3 3a.75.75 0 0 0 1.28-.53V4.75Z"})])}const kV=[{name:"0 SANERING OCH RIVNING",children:[{name:"00 Sammansatta",selected:!1},{name:"01 Demontoring",selected:!1},{name:"02 Sanering och lätt rivning",selected:!1},{name:"03 Tung rivning",selected:!1},{name:"04 Efterlagning",selected:!1},{name:"06 Håltagning",selected:!1},{name:"07 Arbeten för installationer",selected:!1}]},{name:"1 MARK",children:[{name:"10 Sammansatta",selected:!1},{name:"11 Röjning, rivning och flyttning",selected:!1},{name:"12 Schakter, fyllning",selected:!1},{name:"13 Markförstärkning, dränering",selected:!1},{name:"15 Ledningar, kulvertar, tunnlar",selected:!1},{name:"16 Vägar, planer",selected:!1},{name:"17 Trädgård",selected:!1},{name:"18 Markrutt, Stödmurar, komplementbyggnader",selected:!1},{name:"19 Mark övrigt",selected:!1}]},{name:"2. HUSUNDERBYGGNAD",children:[{name:"20 Sammansatta",selected:!1},{name:"22 Schakt, fyllning",selected:!1},{name:"23 Markförstärkning, dränering",selected:!1},{name:"24 Grundkonstruktioner",selected:!1},{name:"25 Kulvertar, tunnlar",selected:!1},{name:"26 Garage",selected:!1},{name:"27 Platta på mark",selected:!1},{name:"28 Huskomplementering, husunderbyggnad",selected:!1},{name:"29 Husunderbyggnad övrigt",selected:!1}]},{name:"3. STOMME",children:[{name:"30 Sammansatta",selected:!1},{name:"31 Stomme - väggar",selected:!1},{name:"32 Stomme - pelare",selected:!1},{name:"33 Prefab",selected:!1},{name:"34 Stomme bjälklag, balkar",selected:!1},{name:"35 Smide",selected:!1},{name:"36 Stomme, trappor, hisschakt",selected:!1},{name:"37 Samverkande takstomme",selected:!1},{name:"38 Huskomplementering, stomme",selected:!1},{name:"39 Stomme övrigt",selected:!1}]},{name:"4. YTTERTAK",children:[{name:"40 Sammansatta",selected:!1},{name:"41 Tak-stomme",selected:!1},{name:"42 Taklagskomplettering",selected:!1},{name:"43 Taktäckning",selected:!1},{name:"44 Takfot och gavlar",selected:!1},{name:"45 Öppningskompletteringar, yttertak",selected:!1},{name:"46 Plåt",selected:!1},{name:"47 Terasstak, altaner",selected:!1},{name:"48 Huskomplettering, yttertak",selected:!1},{name:"49 Yttertak övrigt",selected:!1}]},{name:"5. FASADER",children:[{name:"50 Sammansatta",selected:!1},{name:"51 Stomkomplement, utfackning",selected:!1},{name:"53 Fasadbeklädnad",selected:!1},{name:"55 Fönster, dörrar, partier, portar",selected:!1},{name:"58 Huskomplettering ytterväggar",selected:!1},{name:"59 Ytterväggar övrigt",selected:!1}]},{name:"6. STOMKOMPL. RUMSBILDN.",children:[{name:"60 Sammansatta",selected:!1},{name:"61 Insida yttervägg",selected:!1},{name:"62 Undergolv",selected:!1},{name:"63 Innerväggar",selected:!1},{name:"64 Innertak",selected:!1},{name:"65 Invändiga dörrar, glaspartier",selected:!1},{name:"66 Invändiga trappor",selected:!1},{name:"68 Huskomplettering, rumsbildning",selected:!1},{name:"69 Rumsbildning övrigt",selected:!1}]},{name:"7. INVÄNDIGA YTSKIKT RUMSKOMPL.",children:[{name:"70 Sammansatta",selected:!1},{name:"72 Ytskikt golv, sporer",selected:!1},{name:"73 Ytskikt vägg",selected:!1},{name:"74 Ytskikt tak, undertak",selected:!1},{name:"75 Målning",selected:!1},{name:"76 Vitvaror",selected:!1},{name:"77 Skåpsinsikter",selected:!1},{name:"78 Rumsinsikter",selected:!1},{name:"79 Rumsinsikter övrigt",selected:!1}]},{name:"8 INSTALLATIONER",children:[{name:"80 Sammansatta",selected:!1},{name:"82 Process",selected:!1},{name:"83 Storkök",selected:!1},{name:"84 Sanitet, värme",selected:!1},{name:"85 Kyla, luft",selected:!1},{name:"86 El",selected:!1},{name:"87 Transport",selected:!1},{name:"88 Styr och regler",selected:!1},{name:"89 Installationer övrigt",selected:!1}]},{name:"9. GEMENSAMMA ARBETEN",children:[{name:"90 Gemensamma arbeten sammansatta",selected:!1},{name:"91 Gemensamma arbeten",selected:!1}]}],Jke=[{name:"1. Substructure",children:[{name:"1.1 Foundations",selected:!1},{name:"1.2 Basement Construction"}]},{name:"2. Superstructure",children:[{name:"2.1 Structural Frame",selected:!1},{name:"2.2 External Walls",selected:!1},{name:"2.3 Internal Walls",selected:!1},{name:"2.4 Upper Floors",selected:!1},{name:"2.5 Roof Structure",selected:!1}]},{name:"3. Finishes",children:[{name:"3.1 Wall Finishes",selected:!1},{name:"3.2 Floor Finishes",selected:!1},{name:"3.3 Ceiling Finishes",selected:!1}]},{name:"4. Fittings and Furnishings",children:[{name:"4.1 Fixed Furniture",selected:!1},{name:"4.2 Movable Furniture",selected:!1}]},{name:"5. Building Services",children:[{name:"5.1 Heating, Ventilation, and Air Conditioning (HVAC)",selected:!1},{name:"5.2 Electrical Installations",selected:!1},{name:"5.3 Plumbing Installations",selected:!1},{name:"5.4 Fire Protection Systems",selected:!1}]},{name:"6. External Works",children:[{name:"6.1 Landscaping",selected:!1},{name:"6.2 Site Infrastructure",selected:!1}]}],eZ={BSAB96:kV,generic:Jke};var vL=(t=>(t[t.EcoPortal=0]="EcoPortal",t[t.Revalu=1]="Revalu",t[t.LCAByg=2]="LCAByg",t[t.Other=3]="Other",t))(vL||{});const Yke={colorscheme:"light",area:1e3},Bke={materialKeys:{revalu:null,ecoPortal:null},githubApiKey:null,firebaseConfig:{apiKey:null,authDomain:"specklca.firebaseapp.com",projectId:"specklca",storageBucket:"specklca.appspot.com",messagingSenderId:"660785821928",appId:"1:660785821928:web:236a8b63b72bf6abcc715d",measurementId:"G-EKQGVJLEEG"},speckleConfig:{serverUrl:"https://app.speckle.systems",id:"25477842e5",secret:"c5a683ccc4"}},Hke={includedStages:{relevantStages:[{included:!0,stage:"a1a3"},{included:!0,stage:"a4"},{included:!0,stage:"a5"},{included:!0,stage:"b1"},{included:!0,stage:"c1"}]},standardImpactCategory:"gwp",buildingCode:{key:"BSAB96",data:kV}},Qke={epdSource:1},Nr=h0({id:"settingsStore",state:()=>({appSettings:Yke,calculationSettings:Hke,keySettings:Bke,materialSettings:Qke}),persist:{storage:localStorage,afterHydrate:t=>{console.log(`just hydrated '${t.store.$id}'`)}},actions:{updateFirebaseSettings(t){this.keySettings.firebaseConfig=t},updateSpeckleSettings(t){this.keySettings.speckleConfig=t},updateMaterialKeys(t){this.keySettings.materialKeys=t},updateEPDSource(t){this.materialSettings.epdSource=t},updateGithubApiKey(t){this.keySettings.githubApiKey=t},updateIncludedStages(t){this.calculationSettings.includedStages=t},updateStandardImpactCategory(t){this.calculationSettings.standardImpactCategory=t},updateBuildingCode(t){this.calculationSettings.buildingCode=t},updateArea(t){this.appSettings.area=t}}}),tue="/SpeckleLCA/assets/logo-0f801c3a.svg",_ke="/SpeckleLCA/assets/AppPicture3D-67929e5c.png",$ke=pt({name:"SettingsSidebar",components:{},props:{settingViews:{type:Array,required:!0}},emits:["view-changed"],setup(t,{emit:e}){return{handleClick:r=>{t.settingViews.forEach(i=>{i.current=i.name===r.name}),e("view-changed",r)}}}}),eOe={class:"overflow-x-auto border-b border-gray-900/5 block w-64 flex-none border-0 py-36"},tOe={class:"flex-none px-4 sm:px-6 lg:px-0"},nOe={role:"list",class:"flex gap-x-3 gap-y-1 whitespace-nowrap lg:flex-col"},rOe=["onClick"];function iOe(t,e,n,r,i,s){return pe(),ke("aside",eOe,[O("nav",tOe,[O("ul",nOe,[(pe(!0),ke(Ct,null,Pi(t.settingViews,a=>(pe(),ke("li",{key:a.name},[O("a",{href:"#",class:En([a.current?"bg-gray-50 text-green-600":"text-gray-700 hover:bg-gray-50 hover:text-green-600","group flex gap-x-3 rounded-md py-2 pl-2 pr-3 text-sm/6 font-semibold"]),onClick:f0(o=>t.handleClick(a),["prevent"])},[(pe(),Gt(hf(a.icon),{class:En([a.current?"text-green-600":"text-gray-400 group-hover:text-green-600","size-6 shrink-0"]),"aria-hidden":"true"},null,8,["class"])),yr(" "+Mt(a.name),1)],10,rOe)]))),128))])])])}const sOe=Vt($ke,[["render",iOe]]),aOe=pt({name:"UpdateButton",props:{label:{type:String,default:"Update"}},emits:["click"],setup(t,{emit:e}){return{handleClick:()=>{e("click")}}}});function oOe(t,e,n,r,i,s){return pe(),ke("button",{type:"button",class:"font-semibold text-green-600 hover:text-green-500",onClick:e[0]||(e[0]=(...a)=>t.handleClick&&t.handleClick(...a))},Mt(t.label),1)}const Cf=Vt(aOe,[["render",oOe]]),lOe=pt({name:"SettingsGeneral",components:{UpdateButton:Cf},setup(){const t=Nr(),e=ze(t.appSettings.area);return{area:e,updateGeneral:()=>{t.updateArea(e.value)}}}}),uOe={class:"mt-6 space-y-6 divide-y divide-gray-100 border-t border-gray-200 text-sm/6"},cOe={class:"pt-6 sm:flex"},dOe={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"},fOe={class:"pt-6 sm:flex"},hOe={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"},pOe={class:"pt-6 sm:flex"},mOe={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"};function vOe(t,e,n,r,i,s){const a=Xe("UpdateButton");return pe(),ke("div",null,[e[6]||(e[6]=O("h2",{class:"text-base/7 font-semibold text-gray-900"},"General User Settings",-1)),e[7]||(e[7]=O("p",{class:"mt-1 text-sm/6 text-gray-500"},"General settings for the project.",-1)),O("dl",uOe,[O("div",cOe,[e[1]||(e[1]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Area",-1)),O("dd",dOe,[hn(O("input",{"onUpdate:modelValue":e[0]||(e[0]=o=>t.area=o),type:"text",placeholder:"Unit",class:"w-full border p-2 rounded-md"},null,512),[[On,t.area]]),xe(a,{onClick:t.updateGeneral},null,8,["onClick"])])]),O("div",fOe,[e[3]||(e[3]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Show popups",-1)),O("dd",hOe,[e[2]||(e[2]=O("input",{type:"text",placeholder:"True",class:"w-full border p-2 rounded-md"},null,-1)),xe(a,{onClick:t.updateGeneral},null,8,["onClick"])])]),O("div",pOe,[e[5]||(e[5]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Standard result values",-1)),O("dd",mOe,[e[4]||(e[4]=O("input",{type:"text",placeholder:"kg co2e",class:"w-full border p-2 rounded-md"},null,-1)),xe(a,{onClick:t.updateGeneral},null,8,["onClick"])])])])])}const gOe=Vt(lOe,[["render",vOe]]),nue=[{parameter:"parameters.category",displayName:"Category",data:[]},{parameter:"material.name",displayName:"Material",data:[]},{parameter:"material.metaData.materialType",displayName:"Material Type",data:[]},{parameter:"BSABCodes",displayName:"BSAB Codes",data:[]},{parameter:"parameters.speckle_type",displayName:"Speckle Type",data:[]}],od=h0({id:"resultStore",state:()=>({aggregatedResults:[],resultList:nue,activeParameter:"parameters.category",reloadChartData:!0}),actions:{setResultList(t){this.resultList=t},getGroupedResults(t="all"){return t==="all"?this.resultList:this.resultList[t]?{[t]:this.resultList[t]}:{}},toggleReloadData(){this.reloadChartData=!this.reloadChartData},setReloadData(t){this.reloadChartData=t},setActiveParameter(t){this.activeParameter=t}}}),N1=(t,e=0,n=1)=>aK(oK(e,t),n),sK=t=>{t._clipped=!1,t._unclipped=t.slice(0);for(let e=0;e<=3;e++)e<3?((t[e]<0||t[e]>255)&&(t._clipped=!0),t[e]=N1(t[e],0,255)):e===3&&(t[e]=N1(t[e],0,1));return t},rue={};for(let t of["Boolean","Number","String","Function","Array","Date","RegExp","Undefined","Null"])rue[`[object ${t}]`]=t.toLowerCase();function Mn(t){return rue[Object.prototype.toString.call(t)]||"object"}const Pn=(t,e=null)=>t.length>=3?Array.prototype.slice.call(t):Mn(t[0])=="object"&&e?e.split("").filter(n=>t[0][n]!==void 0).map(n=>t[0][n]):t[0],OV=t=>{if(t.length<2)return null;const e=t.length-1;return Mn(t[e])=="string"?t[e].toLowerCase():null},{PI:IV,min:aK,max:oK}=Math,Gd=IV*2,ik=IV/3,bOe=IV/180,yOe=180/IV,ln={format:{},autodetect:[]};let ht=class{constructor(...e){const n=this;if(Mn(e[0])==="object"&&e[0].constructor&&e[0].constructor===this.constructor)return e[0];let r=OV(e),i=!1;if(!r){i=!0,ln.sorted||(ln.autodetect=ln.autodetect.sort((s,a)=>a.p-s.p),ln.sorted=!0);for(let s of ln.autodetect)if(r=s.test(...e),r)break}if(ln.format[r]){const s=ln.format[r].apply(null,i?e:e.slice(0,-1));n._rgb=sK(s)}else throw new Error("unknown format: "+e);n._rgb.length===3&&n._rgb.push(1)}toString(){return Mn(this.hex)=="function"?this.hex():`[${this._rgb.join(",")}]`}};const SOe="2.6.0",en=(...t)=>new en.Color(...t);en.Color=ht;en.version=SOe;const xOe=(...t)=>{t=Pn(t,"cmyk");const[e,n,r,i]=t,s=t.length>4?t[4]:1;return i===1?[0,0,0,s]:[e>=1?0:255*(1-e)*(1-i),n>=1?0:255*(1-n)*(1-i),r>=1?0:255*(1-r)*(1-i),s]},{max:tZ}=Math,TOe=(...t)=>{let[e,n,r]=Pn(t,"rgb");e=e/255,n=n/255,r=r/255;const i=1-tZ(e,tZ(n,r)),s=i<1?1/(1-i):0,a=(1-e-i)*s,o=(1-n-i)*s,l=(1-r-i)*s;return[a,o,l,i]};ht.prototype.cmyk=function(){return TOe(this._rgb)};en.cmyk=(...t)=>new ht(...t,"cmyk");ln.format.cmyk=xOe;ln.autodetect.push({p:2,test:(...t)=>{if(t=Pn(t,"cmyk"),Mn(t)==="array"&&t.length===4)return"cmyk"}});const sk=t=>Math.round(t*100)/100,wOe=(...t)=>{const e=Pn(t,"hsla");let n=OV(t)||"lsa";return e[0]=sk(e[0]||0),e[1]=sk(e[1]*100)+"%",e[2]=sk(e[2]*100)+"%",n==="hsla"||e.length>3&&e[3]<1?(e[3]=e.length>3?e[3]:1,n="hsla"):e.length=3,`${n}(${e.join(",")})`},iue=(...t)=>{t=Pn(t,"rgba");let[e,n,r]=t;e/=255,n/=255,r/=255;const i=aK(e,n,r),s=oK(e,n,r),a=(s+i)/2;let o,l;return s===i?(o=0,l=Number.NaN):o=a<.5?(s-i)/(s+i):(s-i)/(2-s-i),e==s?l=(n-r)/(s-i):n==s?l=2+(r-e)/(s-i):r==s&&(l=4+(e-n)/(s-i)),l*=60,l<0&&(l+=360),t.length>3&&t[3]!==void 0?[l,o,a,t[3]]:[l,o,a]},{round:ak}=Math,EOe=(...t)=>{const e=Pn(t,"rgba");let n=OV(t)||"rgb";return n.substr(0,3)=="hsl"?wOe(iue(e),n):(e[0]=ak(e[0]),e[1]=ak(e[1]),e[2]=ak(e[2]),(n==="rgba"||e.length>3&&e[3]<1)&&(e[3]=e.length>3?e[3]:1,n="rgba"),`${n}(${e.slice(0,n==="rgb"?3:4).join(",")})`)},{round:ok}=Math,gL=(...t)=>{t=Pn(t,"hsl");const[e,n,r]=t;let i,s,a;if(n===0)i=s=a=r*255;else{const o=[0,0,0],l=[0,0,0],u=r<.5?r*(1+n):r+n-r*n,c=2*r-u,d=e/360;o[0]=d+1/3,o[1]=d,o[2]=d-1/3;for(let f=0;f<3;f++)o[f]<0&&(o[f]+=1),o[f]>1&&(o[f]-=1),6*o[f]<1?l[f]=c+(u-c)*6*o[f]:2*o[f]<1?l[f]=u:3*o[f]<2?l[f]=c+(u-c)*(2/3-o[f])*6:l[f]=c;[i,s,a]=[ok(l[0]*255),ok(l[1]*255),ok(l[2]*255)]}return t.length>3?[i,s,a,t[3]]:[i,s,a,1]},sue=/^rgb\(\s*(-?\d+),\s*(-?\d+)\s*,\s*(-?\d+)\s*\)$/,aue=/^rgba\(\s*(-?\d+),\s*(-?\d+)\s*,\s*(-?\d+)\s*,\s*([01]|[01]?\.\d+)\)$/,oue=/^rgb\(\s*(-?\d+(?:\.\d+)?)%,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*\)$/,lue=/^rgba\(\s*(-?\d+(?:\.\d+)?)%,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/,uue=/^hsl\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*\)$/,cue=/^hsla\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/,{round:nZ}=Math,lK=t=>{t=t.toLowerCase().trim();let e;if(ln.format.named)try{return ln.format.named(t)}catch{}if(e=t.match(sue)){const n=e.slice(1,4);for(let r=0;r<3;r++)n[r]=+n[r];return n[3]=1,n}if(e=t.match(aue)){const n=e.slice(1,5);for(let r=0;r<4;r++)n[r]=+n[r];return n}if(e=t.match(oue)){const n=e.slice(1,4);for(let r=0;r<3;r++)n[r]=nZ(n[r]*2.55);return n[3]=1,n}if(e=t.match(lue)){const n=e.slice(1,5);for(let r=0;r<3;r++)n[r]=nZ(n[r]*2.55);return n[3]=+n[3],n}if(e=t.match(uue)){const n=e.slice(1,4);n[1]*=.01,n[2]*=.01;const r=gL(n);return r[3]=1,r}if(e=t.match(cue)){const n=e.slice(1,4);n[1]*=.01,n[2]*=.01;const r=gL(n);return r[3]=+e[4],r}};lK.test=t=>sue.test(t)||aue.test(t)||oue.test(t)||lue.test(t)||uue.test(t)||cue.test(t);ht.prototype.css=function(t){return EOe(this._rgb,t)};en.css=(...t)=>new ht(...t,"css");ln.format.css=lK;ln.autodetect.push({p:5,test:(t,...e)=>{if(!e.length&&Mn(t)==="string"&&lK.test(t))return"css"}});ln.format.gl=(...t)=>{const e=Pn(t,"rgba");return e[0]*=255,e[1]*=255,e[2]*=255,e};en.gl=(...t)=>new ht(...t,"gl");ht.prototype.gl=function(){const t=this._rgb;return[t[0]/255,t[1]/255,t[2]/255,t[3]]};const{floor:MOe}=Math,POe=(...t)=>{t=Pn(t,"hcg");let[e,n,r]=t,i,s,a;r=r*255;const o=n*255;if(n===0)i=s=a=r;else{e===360&&(e=0),e>360&&(e-=360),e<0&&(e+=360),e/=60;const l=MOe(e),u=e-l,c=r*(1-n),d=c+o*(1-u),f=c+o*u,h=c+o;switch(l){case 0:[i,s,a]=[h,f,c];break;case 1:[i,s,a]=[d,h,c];break;case 2:[i,s,a]=[c,h,f];break;case 3:[i,s,a]=[c,d,h];break;case 4:[i,s,a]=[f,c,h];break;case 5:[i,s,a]=[h,c,d];break}}return[i,s,a,t.length>3?t[3]:1]},ROe=(...t)=>{const[e,n,r]=Pn(t,"rgb"),i=aK(e,n,r),s=oK(e,n,r),a=s-i,o=a*100/255,l=i/(255-a)*100;let u;return a===0?u=Number.NaN:(e===s&&(u=(n-r)/a),n===s&&(u=2+(r-e)/a),r===s&&(u=4+(e-n)/a),u*=60,u<0&&(u+=360)),[u,o,l]};ht.prototype.hcg=function(){return ROe(this._rgb)};en.hcg=(...t)=>new ht(...t,"hcg");ln.format.hcg=POe;ln.autodetect.push({p:1,test:(...t)=>{if(t=Pn(t,"hcg"),Mn(t)==="array"&&t.length===3)return"hcg"}});const VOe=/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,zOe=/^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/,due=t=>{if(t.match(VOe)){(t.length===4||t.length===7)&&(t=t.substr(1)),t.length===3&&(t=t.split(""),t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]);const e=parseInt(t,16),n=e>>16,r=e>>8&255,i=e&255;return[n,r,i,1]}if(t.match(zOe)){(t.length===5||t.length===9)&&(t=t.substr(1)),t.length===4&&(t=t.split(""),t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]+t[3]+t[3]);const e=parseInt(t,16),n=e>>24&255,r=e>>16&255,i=e>>8&255,s=Math.round((e&255)/255*100)/100;return[n,r,i,s]}throw new Error(`unknown hex color: ${t}`)},{round:h2}=Math,fue=(...t)=>{let[e,n,r,i]=Pn(t,"rgba"),s=OV(t)||"auto";i===void 0&&(i=1),s==="auto"&&(s=i<1?"rgba":"rgb"),e=h2(e),n=h2(n),r=h2(r);let o="000000"+(e<<16|n<<8|r).toString(16);o=o.substr(o.length-6);let l="0"+h2(i*255).toString(16);switch(l=l.substr(l.length-2),s.toLowerCase()){case"rgba":return`#${o}${l}`;case"argb":return`#${l}${o}`;default:return`#${o}`}};ht.prototype.hex=function(t){return fue(this._rgb,t)};en.hex=(...t)=>new ht(...t,"hex");ln.format.hex=due;ln.autodetect.push({p:4,test:(t,...e)=>{if(!e.length&&Mn(t)==="string"&&[3,4,5,6,7,8,9].indexOf(t.length)>=0)return"hex"}});const{cos:$0}=Math,kOe=(...t)=>{t=Pn(t,"hsi");let[e,n,r]=t,i,s,a;return isNaN(e)&&(e=0),isNaN(n)&&(n=0),e>360&&(e-=360),e<0&&(e+=360),e/=360,e<1/3?(a=(1-n)/3,i=(1+n*$0(Gd*e)/$0(ik-Gd*e))/3,s=1-(a+i)):e<2/3?(e-=1/3,i=(1-n)/3,s=(1+n*$0(Gd*e)/$0(ik-Gd*e))/3,a=1-(i+s)):(e-=2/3,s=(1-n)/3,a=(1+n*$0(Gd*e)/$0(ik-Gd*e))/3,i=1-(s+a)),i=N1(r*i*3),s=N1(r*s*3),a=N1(r*a*3),[i*255,s*255,a*255,t.length>3?t[3]:1]},{min:OOe,sqrt:IOe,acos:UOe}=Math,NOe=(...t)=>{let[e,n,r]=Pn(t,"rgb");e/=255,n/=255,r/=255;let i;const s=OOe(e,n,r),a=(e+n+r)/3,o=a>0?1-s/a:0;return o===0?i=NaN:(i=(e-n+(e-r))/2,i/=IOe((e-n)*(e-n)+(e-r)*(n-r)),i=UOe(i),r>n&&(i=Gd-i),i/=Gd),[i*360,o,a]};ht.prototype.hsi=function(){return NOe(this._rgb)};en.hsi=(...t)=>new ht(...t,"hsi");ln.format.hsi=kOe;ln.autodetect.push({p:2,test:(...t)=>{if(t=Pn(t,"hsi"),Mn(t)==="array"&&t.length===3)return"hsi"}});ht.prototype.hsl=function(){return iue(this._rgb)};en.hsl=(...t)=>new ht(...t,"hsl");ln.format.hsl=gL;ln.autodetect.push({p:2,test:(...t)=>{if(t=Pn(t,"hsl"),Mn(t)==="array"&&t.length===3)return"hsl"}});const{floor:LOe}=Math,XOe=(...t)=>{t=Pn(t,"hsv");let[e,n,r]=t,i,s,a;if(r*=255,n===0)i=s=a=r;else{e===360&&(e=0),e>360&&(e-=360),e<0&&(e+=360),e/=60;const o=LOe(e),l=e-o,u=r*(1-n),c=r*(1-n*l),d=r*(1-n*(1-l));switch(o){case 0:[i,s,a]=[r,d,u];break;case 1:[i,s,a]=[c,r,u];break;case 2:[i,s,a]=[u,r,d];break;case 3:[i,s,a]=[u,c,r];break;case 4:[i,s,a]=[d,u,r];break;case 5:[i,s,a]=[r,u,c];break}}return[i,s,a,t.length>3?t[3]:1]},{min:COe,max:KOe}=Math,qOe=(...t)=>{t=Pn(t,"rgb");let[e,n,r]=t;const i=COe(e,n,r),s=KOe(e,n,r),a=s-i;let o,l,u;return u=s/255,s===0?(o=Number.NaN,l=0):(l=a/s,e===s&&(o=(n-r)/a),n===s&&(o=2+(r-e)/a),r===s&&(o=4+(e-n)/a),o*=60,o<0&&(o+=360)),[o,l,u]};ht.prototype.hsv=function(){return qOe(this._rgb)};en.hsv=(...t)=>new ht(...t,"hsv");ln.format.hsv=XOe;ln.autodetect.push({p:2,test:(...t)=>{if(t=Pn(t,"hsv"),Mn(t)==="array"&&t.length===3)return"hsv"}});const Co={Kn:18,Xn:.95047,Yn:1,Zn:1.08883,t0:.137931034,t1:.206896552,t2:.12841855,t3:.008856452},{pow:DOe}=Math,hue=(...t)=>{t=Pn(t,"lab");const[e,n,r]=t;let i,s,a,o,l,u;return s=(e+16)/116,i=isNaN(n)?s:s+n/500,a=isNaN(r)?s:s-r/200,s=Co.Yn*uk(s),i=Co.Xn*uk(i),a=Co.Zn*uk(a),o=lk(3.2404542*i-1.5371385*s-.4985314*a),l=lk(-.969266*i+1.8760108*s+.041556*a),u=lk(.0556434*i-.2040259*s+1.0572252*a),[o,l,u,t.length>3?t[3]:1]},lk=t=>255*(t<=.00304?12.92*t:1.055*DOe(t,1/2.4)-.055),uk=t=>t>Co.t1?t*t*t:Co.t2*(t-Co.t0),{pow:pue}=Math,mue=(...t)=>{const[e,n,r]=Pn(t,"rgb"),[i,s,a]=WOe(e,n,r),o=116*s-16;return[o<0?0:o,500*(i-s),200*(s-a)]},ck=t=>(t/=255)<=.04045?t/12.92:pue((t+.055)/1.055,2.4),dk=t=>t>Co.t3?pue(t,1/3):t/Co.t2+Co.t0,WOe=(t,e,n)=>{t=ck(t),e=ck(e),n=ck(n);const r=dk((.4124564*t+.3575761*e+.1804375*n)/Co.Xn),i=dk((.2126729*t+.7151522*e+.072175*n)/Co.Yn),s=dk((.0193339*t+.119192*e+.9503041*n)/Co.Zn);return[r,i,s]};ht.prototype.lab=function(){return mue(this._rgb)};en.lab=(...t)=>new ht(...t,"lab");ln.format.lab=hue;ln.autodetect.push({p:2,test:(...t)=>{if(t=Pn(t,"lab"),Mn(t)==="array"&&t.length===3)return"lab"}});const{sin:AOe,cos:GOe}=Math,vue=(...t)=>{let[e,n,r]=Pn(t,"lch");return isNaN(r)&&(r=0),r=r*bOe,[e,GOe(r)*n,AOe(r)*n]},gue=(...t)=>{t=Pn(t,"lch");const[e,n,r]=t,[i,s,a]=vue(e,n,r),[o,l,u]=hue(i,s,a);return[o,l,u,t.length>3?t[3]:1]},FOe=(...t)=>{const e=Pn(t,"hcl").reverse();return gue(...e)},{sqrt:jOe,atan2:ZOe,round:JOe}=Math,bue=(...t)=>{const[e,n,r]=Pn(t,"lab"),i=jOe(n*n+r*r);let s=(ZOe(r,n)*yOe+360)%360;return JOe(i*1e4)===0&&(s=Number.NaN),[e,i,s]},yue=(...t)=>{const[e,n,r]=Pn(t,"rgb"),[i,s,a]=mue(e,n,r);return bue(i,s,a)};ht.prototype.lch=function(){return yue(this._rgb)};ht.prototype.hcl=function(){return yue(this._rgb).reverse()};en.lch=(...t)=>new ht(...t,"lch");en.hcl=(...t)=>new ht(...t,"hcl");ln.format.lch=gue;ln.format.hcl=FOe;["lch","hcl"].forEach(t=>ln.autodetect.push({p:2,test:(...e)=>{if(e=Pn(e,t),Mn(e)==="array"&&e.length===3)return t}}));const hb={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",laserlemon:"#ffff54",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrod:"#fafad2",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",maroon2:"#7f0000",maroon3:"#b03060",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",purple2:"#7f007f",purple3:"#a020f0",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};ht.prototype.name=function(){const t=fue(this._rgb,"rgb");for(let e of Object.keys(hb))if(hb[e]===t)return e.toLowerCase();return t};ln.format.named=t=>{if(t=t.toLowerCase(),hb[t])return due(hb[t]);throw new Error("unknown color name: "+t)};ln.autodetect.push({p:5,test:(t,...e)=>{if(!e.length&&Mn(t)==="string"&&hb[t.toLowerCase()])return"named"}});const YOe=t=>{if(Mn(t)=="number"&&t>=0&&t<=16777215){const e=t>>16,n=t>>8&255,r=t&255;return[e,n,r,1]}throw new Error("unknown num color: "+t)},BOe=(...t)=>{const[e,n,r]=Pn(t,"rgb");return(e<<16)+(n<<8)+r};ht.prototype.num=function(){return BOe(this._rgb)};en.num=(...t)=>new ht(...t,"num");ln.format.num=YOe;ln.autodetect.push({p:5,test:(...t)=>{if(t.length===1&&Mn(t[0])==="number"&&t[0]>=0&&t[0]<=16777215)return"num"}});const{round:Sue}=Math;ht.prototype.rgb=function(t=!0){return t===!1?this._rgb.slice(0,3):this._rgb.slice(0,3).map(Sue)};ht.prototype.rgba=function(t=!0){return this._rgb.slice(0,4).map((e,n)=>n<3?t===!1?e:Sue(e):e)};en.rgb=(...t)=>new ht(...t,"rgb");ln.format.rgb=(...t)=>{const e=Pn(t,"rgba");return e[3]===void 0&&(e[3]=1),e};ln.autodetect.push({p:3,test:(...t)=>{if(t=Pn(t,"rgba"),Mn(t)==="array"&&(t.length===3||t.length===4&&Mn(t[3])=="number"&&t[3]>=0&&t[3]<=1))return"rgb"}});const{log:p2}=Math,xue=t=>{const e=t/100;let n,r,i;return e<66?(n=255,r=e<6?0:-155.25485562709179-.44596950469579133*(r=e-2)+104.49216199393888*p2(r),i=e<20?0:-254.76935184120902+.8274096064007395*(i=e-10)+115.67994401066147*p2(i)):(n=351.97690566805693+.114206453784165*(n=e-55)-40.25366309332127*p2(n),r=325.4494125711974+.07943456536662342*(r=e-50)-28.0852963507957*p2(r),i=255),[n,r,i,1]},{round:HOe}=Math,QOe=(...t)=>{const e=Pn(t,"rgb"),n=e[0],r=e[2];let i=1e3,s=4e4;const a=.4;let o;for(;s-i>a;){o=(s+i)*.5;const l=xue(o);l[2]/l[0]>=r/n?s=o:i=o}return HOe(o)};ht.prototype.temp=ht.prototype.kelvin=ht.prototype.temperature=function(){return QOe(this._rgb)};en.temp=en.kelvin=en.temperature=(...t)=>new ht(...t,"temp");ln.format.temp=ln.format.kelvin=ln.format.temperature=xue;const{pow:b7,sign:_Oe}=Math,Tue=(...t)=>{t=Pn(t,"lab");const[e,n,r]=t,i=b7(e+.3963377774*n+.2158037573*r,3),s=b7(e-.1055613458*n-.0638541728*r,3),a=b7(e-.0894841775*n-1.291485548*r,3);return[255*fk(4.0767416621*i-3.3077115913*s+.2309699292*a),255*fk(-1.2684380046*i+2.6097574011*s-.3413193965*a),255*fk(-.0041960863*i-.7034186147*s+1.707614701*a),t.length>3?t[3]:1]};function fk(t){const e=Math.abs(t);return e>.0031308?(_Oe(t)||1)*(1.055*b7(e,1/2.4)-.055):t*12.92}const{cbrt:hk,pow:$Oe,sign:eIe}=Math,wue=(...t)=>{const[e,n,r]=Pn(t,"rgb"),[i,s,a]=[pk(e/255),pk(n/255),pk(r/255)],o=hk(.4122214708*i+.5363325363*s+.0514459929*a),l=hk(.2119034982*i+.6806995451*s+.1073969566*a),u=hk(.0883024619*i+.2817188376*s+.6299787005*a);return[.2104542553*o+.793617785*l-.0040720468*u,1.9779984951*o-2.428592205*l+.4505937099*u,.0259040371*o+.7827717662*l-.808675766*u]};function pk(t){const e=Math.abs(t);return e<.04045?t/12.92:(eIe(t)||1)*$Oe((e+.055)/1.055,2.4)}ht.prototype.oklab=function(){return wue(this._rgb)};en.oklab=(...t)=>new ht(...t,"oklab");ln.format.oklab=Tue;ln.autodetect.push({p:3,test:(...t)=>{if(t=Pn(t,"oklab"),Mn(t)==="array"&&t.length===3)return"oklab"}});const tIe=(...t)=>{t=Pn(t,"lch");const[e,n,r]=t,[i,s,a]=vue(e,n,r),[o,l,u]=Tue(i,s,a);return[o,l,u,t.length>3?t[3]:1]},nIe=(...t)=>{const[e,n,r]=Pn(t,"rgb"),[i,s,a]=wue(e,n,r);return bue(i,s,a)};ht.prototype.oklch=function(){return nIe(this._rgb)};en.oklch=(...t)=>new ht(...t,"oklch");ln.format.oklch=tIe;ln.autodetect.push({p:3,test:(...t)=>{if(t=Pn(t,"oklch"),Mn(t)==="array"&&t.length===3)return"oklch"}});ht.prototype.alpha=function(t,e=!1){return t!==void 0&&Mn(t)==="number"?e?(this._rgb[3]=t,this):new ht([this._rgb[0],this._rgb[1],this._rgb[2],t],"rgb"):this._rgb[3]};ht.prototype.clipped=function(){return this._rgb._clipped||!1};ht.prototype.darken=function(t=1){const e=this,n=e.lab();return n[0]-=Co.Kn*t,new ht(n,"lab").alpha(e.alpha(),!0)};ht.prototype.brighten=function(t=1){return this.darken(-t)};ht.prototype.darker=ht.prototype.darken;ht.prototype.brighter=ht.prototype.brighten;ht.prototype.get=function(t){const[e,n]=t.split("."),r=this[e]();if(n){const i=e.indexOf(n)-(e.substr(0,2)==="ok"?2:0);if(i>-1)return r[i];throw new Error(`unknown channel ${n} in mode ${e}`)}else return r};const{pow:rIe}=Math,iIe=1e-7,sIe=20;ht.prototype.luminance=function(t,e="rgb"){if(t!==void 0&&Mn(t)==="number"){if(t===0)return new ht([0,0,0,this._rgb[3]],"rgb");if(t===1)return new ht([255,255,255,this._rgb[3]],"rgb");let n=this.luminance(),r=sIe;const i=(a,o)=>{const l=a.interpolate(o,.5,e),u=l.luminance();return Math.abs(t-u)t?i(a,l):i(l,o)},s=(n>t?i(new ht([0,0,0]),this):i(this,new ht([255,255,255]))).rgb();return new ht([...s,this._rgb[3]])}return aIe(...this._rgb.slice(0,3))};const aIe=(t,e,n)=>(t=mk(t),e=mk(e),n=mk(n),.2126*t+.7152*e+.0722*n),mk=t=>(t/=255,t<=.03928?t/12.92:rIe((t+.055)/1.055,2.4)),Oa={},n6=(t,e,n=.5,...r)=>{let i=r[0]||"lrgb";if(!Oa[i]&&!r.length&&(i=Object.keys(Oa)[0]),!Oa[i])throw new Error(`interpolation mode ${i} is not defined`);return Mn(t)!=="object"&&(t=new ht(t)),Mn(e)!=="object"&&(e=new ht(e)),Oa[i](t,e,n).alpha(t.alpha()+n*(e.alpha()-t.alpha()))};ht.prototype.mix=ht.prototype.interpolate=function(t,e=.5,...n){return n6(this,t,e,...n)};ht.prototype.premultiply=function(t=!1){const e=this._rgb,n=e[3];return t?(this._rgb=[e[0]*n,e[1]*n,e[2]*n,n],this):new ht([e[0]*n,e[1]*n,e[2]*n,n],"rgb")};ht.prototype.saturate=function(t=1){const e=this,n=e.lch();return n[1]+=Co.Kn*t,n[1]<0&&(n[1]=0),new ht(n,"lch").alpha(e.alpha(),!0)};ht.prototype.desaturate=function(t=1){return this.saturate(-t)};ht.prototype.set=function(t,e,n=!1){const[r,i]=t.split("."),s=this[r]();if(i){const a=r.indexOf(i)-(r.substr(0,2)==="ok"?2:0);if(a>-1){if(Mn(e)=="string")switch(e.charAt(0)){case"+":s[a]+=+e;break;case"-":s[a]+=+e;break;case"*":s[a]*=+e.substr(1);break;case"/":s[a]/=+e.substr(1);break;default:s[a]=+e}else if(Mn(e)==="number")s[a]=e;else throw new Error("unsupported value for Color.set");const o=new ht(s,r);return n?(this._rgb=o._rgb,this):o}throw new Error(`unknown channel ${i} in mode ${r}`)}else return s};ht.prototype.tint=function(t=.5,...e){return n6(this,"white",t,...e)};ht.prototype.shade=function(t=.5,...e){return n6(this,"black",t,...e)};const oIe=(t,e,n)=>{const r=t._rgb,i=e._rgb;return new ht(r[0]+n*(i[0]-r[0]),r[1]+n*(i[1]-r[1]),r[2]+n*(i[2]-r[2]),"rgb")};Oa.rgb=oIe;const{sqrt:vk,pow:eg}=Math,lIe=(t,e,n)=>{const[r,i,s]=t._rgb,[a,o,l]=e._rgb;return new ht(vk(eg(r,2)*(1-n)+eg(a,2)*n),vk(eg(i,2)*(1-n)+eg(o,2)*n),vk(eg(s,2)*(1-n)+eg(l,2)*n),"rgb")};Oa.lrgb=lIe;const uIe=(t,e,n)=>{const r=t.lab(),i=e.lab();return new ht(r[0]+n*(i[0]-r[0]),r[1]+n*(i[1]-r[1]),r[2]+n*(i[2]-r[2]),"lab")};Oa.lab=uIe;const cy=(t,e,n,r)=>{let i,s;r==="hsl"?(i=t.hsl(),s=e.hsl()):r==="hsv"?(i=t.hsv(),s=e.hsv()):r==="hcg"?(i=t.hcg(),s=e.hcg()):r==="hsi"?(i=t.hsi(),s=e.hsi()):r==="lch"||r==="hcl"?(r="hcl",i=t.hcl(),s=e.hcl()):r==="oklch"&&(i=t.oklch().reverse(),s=e.oklch().reverse());let a,o,l,u,c,d;(r.substr(0,1)==="h"||r==="oklch")&&([a,l,c]=i,[o,u,d]=s);let f,h,p,m;return!isNaN(a)&&!isNaN(o)?(o>a&&o-a>180?m=o-(a+360):o180?m=o+360-a:m=o-a,h=a+n*m):isNaN(a)?isNaN(o)?h=Number.NaN:(h=o,(c==1||c==0)&&r!="hsv"&&(f=u)):(h=a,(d==1||d==0)&&r!="hsv"&&(f=l)),f===void 0&&(f=l+n*(u-l)),p=c+n*(d-c),r==="oklch"?new ht([p,f,h],r):new ht([h,f,p],r)},Eue=(t,e,n)=>cy(t,e,n,"lch");Oa.lch=Eue;Oa.hcl=Eue;const cIe=(t,e,n)=>{const r=t.num(),i=e.num();return new ht(r+n*(i-r),"num")};Oa.num=cIe;const dIe=(t,e,n)=>cy(t,e,n,"hcg");Oa.hcg=dIe;const fIe=(t,e,n)=>cy(t,e,n,"hsi");Oa.hsi=fIe;const hIe=(t,e,n)=>cy(t,e,n,"hsl");Oa.hsl=hIe;const pIe=(t,e,n)=>cy(t,e,n,"hsv");Oa.hsv=pIe;const mIe=(t,e,n)=>{const r=t.oklab(),i=e.oklab();return new ht(r[0]+n*(i[0]-r[0]),r[1]+n*(i[1]-r[1]),r[2]+n*(i[2]-r[2]),"oklab")};Oa.oklab=mIe;const vIe=(t,e,n)=>cy(t,e,n,"oklch");Oa.oklch=vIe;const{pow:gk,sqrt:bk,PI:yk,cos:rZ,sin:iZ,atan2:gIe}=Math,bIe=(t,e="lrgb",n=null)=>{const r=t.length;n||(n=Array.from(new Array(r)).map(()=>1));const i=r/n.reduce(function(d,f){return d+f});if(n.forEach((d,f)=>{n[f]*=i}),t=t.map(d=>new ht(d)),e==="lrgb")return yIe(t,n);const s=t.shift(),a=s.get(e),o=[];let l=0,u=0;for(let d=0;d{const h=d.get(e);c+=d.alpha()*n[f+1];for(let p=0;p=360;)f-=360;a[d]=f}else a[d]=a[d]/o[d];return c/=r,new ht(a,e).alpha(c>.99999?1:c,!0)},yIe=(t,e)=>{const n=t.length,r=[0,0,0,0];for(let i=0;i.9999999&&(r[3]=1),new ht(sK(r))},{pow:SIe}=Math;function tP(t){let e="rgb",n=en("#ccc"),r=0,i=[0,1],s=[],a=[0,0],o=!1,l=[],u=!1,c=0,d=1,f=!1,h={},p=!0,m=1;const v=function(E){if(E=E||["#fff","#000"],E&&Mn(E)==="string"&&en.brewer&&en.brewer[E.toLowerCase()]&&(E=en.brewer[E.toLowerCase()]),Mn(E)==="array"){E.length===1&&(E=[E[0],E[0]]),E=E.slice(0);for(let S=0;S=o[P];)P++;return P-1}return 0};let b=E=>E,y=E=>E;const x=function(E,S){let P,R;if(S==null&&(S=!1),isNaN(E)||E===null)return n;S?R=E:o&&o.length>2?R=g(E)/(o.length-2):d!==c?R=(E-c)/(d-c):R=1,R=y(R),S||(R=b(R)),m!==1&&(R=SIe(R,m)),R=a[0]+R*(1-a[0]-a[1]),R=N1(R,0,1);const V=Math.floor(R*1e4);if(p&&h[V])P=h[V];else{if(Mn(l)==="array")for(let z=0;z=k&&z===s.length-1){P=l[z];break}if(R>k&&Rh={};v(t);const M=function(E){const S=en(x(E));return u&&S[u]?S[u]():S};return M.classes=function(E){if(E!=null){if(Mn(E)==="array")o=E,i=[E[0],E[E.length-1]];else{const S=en.analyze(i);E===0?o=[S.min,S.max]:o=en.limits(S,"e",E)}return M}return o},M.domain=function(E){if(!arguments.length)return i;c=E[0],d=E[E.length-1],s=[];const S=l.length;if(E.length===S&&c!==d)for(let P of Array.from(E))s.push((P-c)/(d-c));else{for(let P=0;P2){const P=E.map((V,z)=>z/(E.length-1)),R=E.map(V=>(V-c)/(d-c));R.every((V,z)=>P[z]===V)||(y=V=>{if(V<=0||V>=1)return V;let z=0;for(;V>=R[z+1];)z++;const k=(V-R[z])/(R[z+1]-R[z]);return P[z]+k*(P[z+1]-P[z])})}}return i=[c,d],M},M.mode=function(E){return arguments.length?(e=E,T(),M):e},M.range=function(E,S){return v(E),M},M.out=function(E){return u=E,M},M.spread=function(E){return arguments.length?(r=E,M):r},M.correctLightness=function(E){return E==null&&(E=!0),f=E,T(),f?b=function(S){const P=x(0,!0).lab()[0],R=x(1,!0).lab()[0],V=P>R;let z=x(S,!0).lab()[0];const k=P+(R-P)*S;let N=z-k,q=0,L=1,A=20;for(;Math.abs(N)>.01&&A-- >0;)(function(){return V&&(N*=-1),N<0?(q=S,S+=(L-S)*.5):(L=S,S+=(q-S)*.5),z=x(S,!0).lab()[0],N=z-k})();return S}:b=S=>S,M},M.padding=function(E){return E!=null?(Mn(E)==="number"&&(E=[E,E]),a=E,M):a},M.colors=function(E,S){arguments.length<2&&(S="hex");let P=[];if(arguments.length===0)P=l.slice(0);else if(E===1)P=[M(.5)];else if(E>1){const R=i[0],V=i[1]-R;P=xIe(0,E,!1).map(z=>M(R+z/(E-1)*V))}else{t=[];let R=[];if(o&&o.length>2)for(let V=1,z=o.length,k=1<=z;k?Vz;k?V++:V--)R.push((o[V-1]+o[V])*.5);else R=i;P=R.map(V=>M(V))}return en[S]&&(P=P.map(R=>R[S]())),P},M.cache=function(E){return E!=null?(p=E,M):p},M.gamma=function(E){return E!=null?(m=E,M):m},M.nodata=function(E){return E!=null?(n=en(E),M):n},M}function xIe(t,e,n){let r=[],i=ts;i?a++:a--)r.push(a);return r}const TIe=function(t){let e=[1,1];for(let n=1;nnew ht(s)),t.length===2)[n,r]=t.map(s=>s.lab()),e=function(s){const a=[0,1,2].map(o=>n[o]+s*(r[o]-n[o]));return new ht(a,"lab")};else if(t.length===3)[n,r,i]=t.map(s=>s.lab()),e=function(s){const a=[0,1,2].map(o=>(1-s)*(1-s)*n[o]+2*(1-s)*s*r[o]+s*s*i[o]);return new ht(a,"lab")};else if(t.length===4){let s;[n,r,i,s]=t.map(a=>a.lab()),e=function(a){const o=[0,1,2].map(l=>(1-a)*(1-a)*(1-a)*n[l]+3*(1-a)*(1-a)*a*r[l]+3*(1-a)*a*a*i[l]+a*a*a*s[l]);return new ht(o,"lab")}}else if(t.length>=5){let s,a,o;s=t.map(l=>l.lab()),o=t.length-1,a=TIe(o),e=function(l){const u=1-l,c=[0,1,2].map(d=>s.reduce((f,h,p)=>f+a[p]*u**(o-p)*l**p*h[d],0));return new ht(c,"lab")}}else throw new RangeError("No point in running bezier with only one color.");return e},EIe=t=>{const e=wIe(t);return e.scale=()=>tP(e),e},qu=(t,e,n)=>{if(!qu[n])throw new Error("unknown blend mode "+n);return qu[n](t,e)},$p=t=>(e,n)=>{const r=en(n).rgb(),i=en(e).rgb();return en.rgb(t(r,i))},em=t=>(e,n)=>{const r=[];return r[0]=t(e[0],n[0]),r[1]=t(e[1],n[1]),r[2]=t(e[2],n[2]),r},MIe=t=>t,PIe=(t,e)=>t*e/255,RIe=(t,e)=>t>e?e:t,VIe=(t,e)=>t>e?t:e,zIe=(t,e)=>255*(1-(1-t/255)*(1-e/255)),kIe=(t,e)=>e<128?2*t*e/255:255*(1-2*(1-t/255)*(1-e/255)),OIe=(t,e)=>255*(1-(1-e/255)/(t/255)),IIe=(t,e)=>t===255?255:(t=255*(e/255)/(1-t/255),t>255?255:t);qu.normal=$p(em(MIe));qu.multiply=$p(em(PIe));qu.screen=$p(em(zIe));qu.overlay=$p(em(kIe));qu.darken=$p(em(RIe));qu.lighten=$p(em(VIe));qu.dodge=$p(em(IIe));qu.burn=$p(em(OIe));const{pow:UIe,sin:NIe,cos:LIe}=Math;function XIe(t=300,e=-1.5,n=1,r=1,i=[0,1]){let s=0,a;Mn(i)==="array"?a=i[1]-i[0]:(a=0,i=[i,i]);const o=function(l){const u=Gd*((t+120)/360+e*l),c=UIe(i[0]+a*l,r),f=(s!==0?n[0]+l*s:n)*c*(1-c)/2,h=LIe(u),p=NIe(u),m=c+f*(-.14861*h+1.78277*p),v=c+f*(-.29227*h-.90649*p),g=c+f*(1.97294*h);return en(sK([m*255,v*255,g*255,1]))};return o.start=function(l){return l==null?t:(t=l,o)},o.rotations=function(l){return l==null?e:(e=l,o)},o.gamma=function(l){return l==null?r:(r=l,o)},o.hue=function(l){return l==null?n:(n=l,Mn(n)==="array"?(s=n[1]-n[0],s===0&&(n=n[1])):s=0,o)},o.lightness=function(l){return l==null?i:(Mn(l)==="array"?(i=l,a=l[1]-l[0]):(i=[l,l],a=0),o)},o.scale=()=>en.scale(o),o.hue(n),o}const CIe="0123456789abcdef",{floor:KIe,random:qIe}=Math,DIe=()=>{let t="#";for(let e=0;e<6;e++)t+=CIe.charAt(KIe(qIe()*16));return new ht(t,"hex")},{log:sZ,pow:WIe,floor:AIe,abs:GIe}=Math;function Mue(t,e=null){const n={min:Number.MAX_VALUE,max:Number.MAX_VALUE*-1,sum:0,values:[],count:0};return Mn(t)==="object"&&(t=Object.values(t)),t.forEach(r=>{e&&Mn(r)==="object"&&(r=r[e]),r!=null&&!isNaN(r)&&(n.values.push(r),n.sum+=r,rn.max&&(n.max=r),n.count+=1)}),n.domain=[n.min,n.max],n.limits=(r,i)=>Pue(n,r,i),n}function Pue(t,e="equal",n=7){Mn(t)=="array"&&(t=Mue(t));const{min:r,max:i}=t,s=t.values.sort((o,l)=>o-l);if(n===1)return[r,i];const a=[];if(e.substr(0,1)==="c"&&(a.push(r),a.push(i)),e.substr(0,1)==="e"){a.push(r);for(let o=1;o 0");const o=Math.LOG10E*sZ(r),l=Math.LOG10E*sZ(i);a.push(r);for(let u=1;u200&&(d=!1)}const p={};for(let v=0;vv-g),a.push(m[0]);for(let v=1;v{t=new ht(t),e=new ht(e);const n=t.luminance(),r=e.luminance();return n>r?(n+.05)/(r+.05):(r+.05)/(n+.05)},{sqrt:yd,pow:Hi,min:jIe,max:ZIe,atan2:aZ,abs:oZ,cos:m2,sin:lZ,exp:JIe,PI:uZ}=Math;function YIe(t,e,n=1,r=1,i=1){var s=function(ee){return 360*ee/(2*uZ)},a=function(ee){return 2*uZ*ee/360};t=new ht(t),e=new ht(e);const[o,l,u]=Array.from(t.lab()),[c,d,f]=Array.from(e.lab()),h=(o+c)/2,p=yd(Hi(l,2)+Hi(u,2)),m=yd(Hi(d,2)+Hi(f,2)),v=(p+m)/2,g=.5*(1-yd(Hi(v,7)/(Hi(v,7)+Hi(25,7)))),b=l*(1+g),y=d*(1+g),x=yd(Hi(b,2)+Hi(u,2)),T=yd(Hi(y,2)+Hi(f,2)),M=(x+T)/2,E=s(aZ(u,b)),S=s(aZ(f,y)),P=E>=0?E:E+360,R=S>=0?S:S+360,V=oZ(P-R)>180?(P+R+360)/2:(P+R)/2,z=1-.17*m2(a(V-30))+.24*m2(a(2*V))+.32*m2(a(3*V+6))-.2*m2(a(4*V-63));let k=R-P;k=oZ(k)<=180?k:R<=P?k+360:k-360,k=2*yd(x*T)*lZ(a(k)/2);const N=c-o,q=T-x,L=1+.015*Hi(h-50,2)/yd(20+Hi(h-50,2)),A=1+.045*M,Z=1+.015*M*z,j=30*JIe(-Hi((V-275)/25,2)),G=-(2*yd(Hi(M,7)/(Hi(M,7)+Hi(25,7))))*lZ(2*a(j)),B=yd(Hi(N/(n*L),2)+Hi(q/(r*A),2)+Hi(k/(i*Z),2)+G*(q/(r*A))*(k/(i*Z)));return ZIe(0,jIe(100,B))}function BIe(t,e,n="lab"){t=new ht(t),e=new ht(e);const r=t.get(n),i=e.get(n);let s=0;for(let a in r){const o=(r[a]||0)-(i[a]||0);s+=o*o}return Math.sqrt(s)}const HIe=(...t)=>{try{return new ht(...t),!0}catch{return!1}},QIe={cool(){return tP([en.hsl(180,1,.9),en.hsl(250,.7,.4)])},hot(){return tP(["#000","#f00","#ff0","#fff"]).mode("rgb")}},y7={OrRd:["#fff7ec","#fee8c8","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#b30000","#7f0000"],PuBu:["#fff7fb","#ece7f2","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#045a8d","#023858"],BuPu:["#f7fcfd","#e0ecf4","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#810f7c","#4d004b"],Oranges:["#fff5eb","#fee6ce","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#a63603","#7f2704"],BuGn:["#f7fcfd","#e5f5f9","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#006d2c","#00441b"],YlOrBr:["#ffffe5","#fff7bc","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#993404","#662506"],YlGn:["#ffffe5","#f7fcb9","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#006837","#004529"],Reds:["#fff5f0","#fee0d2","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#a50f15","#67000d"],RdPu:["#fff7f3","#fde0dd","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177","#49006a"],Greens:["#f7fcf5","#e5f5e0","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#006d2c","#00441b"],YlGnBu:["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#253494","#081d58"],Purples:["#fcfbfd","#efedf5","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#54278f","#3f007d"],GnBu:["#f7fcf0","#e0f3db","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#0868ac","#084081"],Greys:["#ffffff","#f0f0f0","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525","#000000"],YlOrRd:["#ffffcc","#ffeda0","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#bd0026","#800026"],PuRd:["#f7f4f9","#e7e1ef","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#980043","#67001f"],Blues:["#f7fbff","#deebf7","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#08519c","#08306b"],PuBuGn:["#fff7fb","#ece2f0","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016c59","#014636"],Viridis:["#440154","#482777","#3f4a8a","#31678e","#26838f","#1f9d8a","#6cce5a","#b6de2b","#fee825"],Spectral:["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#ffffbf","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2"],RdYlGn:["#a50026","#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850","#006837"],RdBu:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac","#053061"],PiYG:["#8e0152","#c51b7d","#de77ae","#f1b6da","#fde0ef","#f7f7f7","#e6f5d0","#b8e186","#7fbc41","#4d9221","#276419"],PRGn:["#40004b","#762a83","#9970ab","#c2a5cf","#e7d4e8","#f7f7f7","#d9f0d3","#a6dba0","#5aae61","#1b7837","#00441b"],RdYlBu:["#a50026","#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"],BrBG:["#543005","#8c510a","#bf812d","#dfc27d","#f6e8c3","#f5f5f5","#c7eae5","#80cdc1","#35978f","#01665e","#003c30"],RdGy:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#ffffff","#e0e0e0","#bababa","#878787","#4d4d4d","#1a1a1a"],PuOr:["#7f3b08","#b35806","#e08214","#fdb863","#fee0b6","#f7f7f7","#d8daeb","#b2abd2","#8073ac","#542788","#2d004b"],Set2:["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854","#ffd92f","#e5c494","#b3b3b3"],Accent:["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0","#f0027f","#bf5b17","#666666"],Set1:["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf","#999999"],Set3:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd","#ccebc5","#ffed6f"],Dark2:["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02","#a6761d","#666666"],Paired:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6","#6a3d9a","#ffff99","#b15928"],Pastel2:["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9","#fff2ae","#f1e2cc","#cccccc"],Pastel1:["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc","#e5d8bd","#fddaec","#f2f2f2"]};for(let t of Object.keys(y7))y7[t.toLowerCase()]=y7[t];Object.assign(en,{average:bIe,bezier:EIe,blend:qu,cubehelix:XIe,mix:n6,interpolate:n6,random:DIe,scale:tP,analyze:Mue,contrast:FIe,deltaE:YIe,distance:BIe,limits:Pue,valid:HIe,scales:QIe,input:ln,colors:hb,brewer:y7});const r6={primaryGreen:"#95C92C",secondaryGreen:"#B5E655",primaryRed:"#F06000",secondaryRed:"#FF8F00",primaryGrey:"#E0E0E0"},cZ={white:"text-gray-200",black:"text-gray-700"};class _Ie{constructor(){qt(this,"colors",["rgb(153,128,119)","rgb(199,151,129)","rgb(187,167,137)","rgb(205,197,177)","rgb(224,222,197)","rgb(194,207,179)","rgb(173,183,167)","rgb(160,167,159)","rgb(140,144,145)","rgb(62,85,100)","rgb(106,119,134)","rgb(150,151,170)","rgb(111,85,101)","rgb(128,106,109)"]);qt(this,"colorIndex",0)}rgbStringToArray(e){const n=e.match(/\d+/g);return n?n.map(Number):[0,0,0]}rgbToHsl(e){const[n,r,i]=this.rgbStringToArray(e).map(c=>c/255),s=Math.max(n,r,i),a=Math.min(n,r,i);let o=0,l,u=(s+a)/2;if(s===a)o=l=0;else{const c=s-a;switch(l=u>.5?c/(2-s-a):c/(s+a),s){case n:o=(r-i)/c+(r=this.colors.length)return this.colors.map(r=>this.hslToString(this.rgbToHsl(r)));const n=[this.hslToString(this.rgbToHsl(this.colors[0]))];for(let r=1;rthis.calculateColorDistanceHSL(this.hslToString(this.rgbToHsl(l)),a)));o>i&&(i=o,s=a)}n.push(this.hslToString(this.rgbToHsl(s)))}return n}getNextColor(){return this.hslToString(this.rgbToHsl(this.colors[this.colorIndex++%this.colors.length]))}resetColorIndex(e=0){this.colorIndex=e}}function $Ie(t){var r;const e=(r=t.match(/\d+/g))==null?void 0:r.map(Number);if(!e||e.length!==3)throw new Error("Invalid HSL format");return e[2]<50?cZ.white:cZ.black}function dZ(t,e,n){n/=100;const r=e*Math.min(n,1-n)/100,i=s=>{const a=(s+t/30)%12,o=n-r*Math.max(Math.min(a-3,9-a,1),-1);return Math.round(255*o).toString(16).padStart(2,"0")};return`#${i(0)}${i(8)}${i(4)}`}function UV(t,e,n,r=r6.primaryGreen,i=r6.primaryRed){const s=(t-e)/(n-e);return en.scale([r,i])(s).hex()}var dy=(t=>(t[t.LCAbyg=0]="LCAbyg",t[t.Organisation=1]="Organisation",t[t.Revalu=2]="Revalu",t[t.ECOPortal=3]="ECOPortal",t))(dy||{});const eUe=["gwp","gwp_total","gwp_fossil","gwp_biogenic","gwp_LULUC","odp","ap","pocp"],tUe=["a1a3","a4","a5","b1","b2","b3","b4","b5","b6","c1","c2","c3","c4","d"],nUe=[{id:"9ebc16ed-ae04-462b-bb9e-3e8411a51aae",name:"Crosslaminated timber. CLT (Forbrænding EoL)",description:"Cross Laminated Timber is a solid construction wood product consisting of bonded wood layer panels arranged at right angles to each other.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"-664",C3:"744",C4:"0",D:"-387"}},conversions:{kg:{to:"kg",value:"470"}},source:{url:"https://www.epddanmark.dk/media/tmwhxyym/md-20007-en_rev1_tr%c3%a6dk.pdf"},subType:"Branche data",materialType:"Wood"},{id:"d71b6dca-db6f-401a-b39a-6ff5a87c1f3c",name:"Construction wood - pine. Planed (Forbrænding EoL)",description:"Danish planed construction wood products of coniferous wood.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"-652",C3:"709",C4:"0",D:"-425"}},conversions:{kg:{to:"kg",value:"536"}},source:{url:"https://www.epddanmark.dk/media/4p1frhby/md-20003-en-tr%c3%a6-dk-c-o-tr%c3%a6-og-m%c3%b8belindustrien.pdf"},subType:"Branche data",materialType:"Wood"},{id:"c00435c8-b4ef-4467-af08-ca881c96ea73",name:"Construction wood - pine. Wet and sawn (Forbrænding EoL)",description:"Danish, wet and sawn construction wood products of coniferous wood.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"-664",C3:"709",C4:"0",D:"-425"}},conversions:{kg:{to:"kg",value:"644"}},source:{url:"https://www.epddanmark.dk/media/oxujrihc/md-20001-en-tr%c3%a6-dk-c-o-tr%c3%a6-og-m%c3%b8belindustrien.pdf"},subType:"Branche data",materialType:"Wood"},{id:"e17fc44d-d098-4574-80cb-6aadf382a5b4",name:"Limtræs-produkter af fyr og gran. (Forbrænding EoL)",description:"Glulam construction wood products of pine and spruce.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"-610",C3:"743",C4:"0",D:"-395"}},conversions:{kg:{to:"kg",value:"500"}},source:{url:"https://www.epddanmark.dk/media/hzjhj3s2/md-20005-en_rev1_tr%c3%a6dk.pdf"},subType:"Branche data",materialType:"Wood"},{id:"c0648552-a21e-4344-a415-5830840a8532",name:"Huldæk element. 22 cm. 6-10 forspændingsliner",description:"22 cm tyk huldæk element I beton, med 6-10 forspændingsliner i diameter 12,5 mm",location:"DK",unit:"m2",emission:{gwp:{a1a3:"49.8",C3:"1.04",C4:"0.76",D:"-0.705"}},conversions:{kg:{to:"kg",value:"344.6"}},source:{url:"https://www.epddanmark.dk/media/ksolk4dz/md-20017-da_rev2-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"6f865697-927b-4bcc-99cd-c75885a6ec0a",name:"Huldæk element. 32 cm. 6-10 forspændingsliner",description:"32 cm tyk huldæk element I beton, med 6-10 forspændingsliner i diameter 12,5 mm",location:"DK",unit:"m2",emission:{gwp:{a1a3:"66.4",C3:"1.4",C4:"1.03",D:"-0.953"}},conversions:{kg:{to:"kg",value:"459.6"}},source:{url:"https://www.epddanmark.dk/media/ksolk4dz/md-20017-da_rev2-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"9f7e5dfb-808e-4253-9b56-d28958212b85",name:"Huldæk element. 32 cm. 11-17 forspændingsliner",description:"32 cm tyk huldæk element I beton, med 11-17 forspændingsliner i diameter 12,5 mm",location:"DK",unit:"m2",emission:{gwp:{a1a3:"67.9",C3:"1.37",C4:"1",D:"-0.925"}},conversions:{kg:{to:"kg",value:"451.4"}},source:{url:"https://www.epddanmark.dk/media/ksolk4dz/md-20017-da_rev2-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"ad5a72de-38c2-43eb-8866-9ff8254fdcad",name:"Letklinkerblok. massiv",description:"Letklinkerblokke anvendes bl.a. til følgende bygningsdele: Fundamenter og sokler, kældertrapper og lyskasser, kældervægge, støttemure, og indvendige og udvendige vægge.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"194",C3:"1.6",C4:"1.19",D:"-1.1"}},conversions:{kg:{to:"kg",value:"600"}},source:{url:"https://www.epddanmark.dk/media/n5xnbcl5/md-20023-da_rev1-dansk-beton-blokforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"c7157686-c9fb-4691-ab31-b5415fa6efb1",name:"Letklinkerblok med hvid EPS isolering",description:"Letklinkerblokke anvendes bl.a. til følgende bygningsdele: Fundamenter og sokler, kældertrapper og lyskasser, kældervægge, støttemure, og indvendige og udvendige vægge.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"130",C3:"0.961",C4:"6.19",D:"-4.39"}},conversions:{kg:{to:"kg",value:"375"}},source:{url:"https://www.epddanmark.dk/media/n5xnbcl5/md-20023-da_rev1-dansk-beton-blokforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"73a3618e-e55a-455b-a231-b159a75a01f9",name:"Letklinkerblok med grå EPS isolering",description:"Letklinkerblokke anvendes bl.a. til følgende bygningsdele: Fundamenter og sokler, kældertrapper og lyskasser, kældervægge, støttemure, og indvendige og udvendige vægge.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"121",C3:"0.836",C4:"0.618",D:"-0.572"}},conversions:{kg:{to:"kg",value:"327"}},source:{url:"https://www.epddanmark.dk/media/n5xnbcl5/md-20023-da_rev1-dansk-beton-blokforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"c12503a9-f80f-4fa0-a20f-4c5f23059aae",name:"Konstruktionstræ af fyr og gran. Høvlet (Forbrænding EoL)",description:"Planed construction wood products of pine and spruce.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"-670",C3:"728",C4:"0",D:"-371"}},conversions:{kg:{to:"kg",value:"456"}},source:{url:"https://www.epddanmark.dk/media/l4zjf2xp/md-20004-en_rev1_tr%c3%a6dk.pdf"},subType:"Branche data",materialType:"Wood"},{id:"6538eff9-d01e-4847-a31a-952ef16b2a59",name:"Sandwichelement med mineraluld (Facade)",description:"1 m2 sandwichelement/facadeelement, bestående af 150 mm bagmur, 200-300 mm mineral uld isolering, og 70-80 mm facadeplade, med 10% udsparinger.",location:"DK",unit:"m2",emission:{gwp:{a1a3:"90.6",C3:"1.51",C4:"1.25",D:"-1.21"}},conversions:{kg:{to:"kg",value:"501.8"}},source:{url:"https://www.epddanmark.dk/media/0bpbhpbl/md-20019-da_rev2.pdf"},subType:"Branche data",materialType:"Facade"},{id:"305e9ca4-b551-4fc6-b3bb-6b9df74d660b",name:"Sandwichelement med EPS (Facade)",description:"1 m2 sandwichelement/facadeelement, bestående af 150 mm bagmur, 200-300 mm isolering, og 70-80 mm facadeplade, med 10% udsparinger.",location:"DK",unit:"m2",emission:{gwp:{a1a3:"87.3",C3:"1.49",C4:"10.8",D:"-7.83"}},conversions:{kg:{to:"kg",value:"495.2"}},source:{url:"https://www.epddanmark.dk/media/0bpbhpbl/md-20019-da_rev2.pdf"},subType:"Branche data",materialType:"Facade"},{id:"c108bf89-f9d4-40f2-bf39-bfb01ea62ae7",name:"Beton vægelementer. 15 cm tyk væg med 5-15 kg armering (11% udsparinger)",description:"15 cm tyk beton væg, 11% udsparinger, med 5-15 kg armering",location:"DK",unit:"m2",emission:{gwp:{a1a3:"53.1",C3:"0.965",C4:"0.7",D:"-0.787"}},conversions:{kg:{to:"kg",value:"320.9"}},source:{url:"https://www.epddanmark.dk/media/oq0dzm1j/md-20015-da_rev1-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"2a6bf17b-b6e0-4e31-89b7-ddaedaf7240d",name:"Beton vægelementer. 20 cm tyk væg med 5-15 kg armering (11% udsparinger)",description:"20 cm tyk beton væg, 11% udsparinger, med 5-15 kg armering",location:"DK",unit:"m2",emission:{gwp:{a1a3:"66.9",C3:"1.28",C4:"0.93",D:"-1.01"}},conversions:{kg:{to:"kg",value:"426.4"}},source:{url:"https://www.epddanmark.dk/media/oq0dzm1j/md-20015-da_rev1-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"673ec5ce-04b9-45dc-8956-ac9257a68279",name:"Beton vægelementer. 20 cm tyk væg med 16-25 kg armering (11% udsparinger)",description:"20 cm tyk beton væg, 11% udsparinger, med 16-25 kg armering",location:"DK",unit:"m2",emission:{gwp:{a1a3:"73.2",C3:"1.29",C4:"0.932",D:"-1.08"}},conversions:{kg:{to:"kg",value:"433.9"}},source:{url:"https://www.epddanmark.dk/media/oq0dzm1j/md-20015-da_rev1-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"49d85f1d-ab7f-4c9a-8a47-d4664d99cae6",name:"Letbeton vægelement. 100 mm tyk væg. 10% udsparinger",description:"100 mm tyk letbeton vægelement, 10% udsparinger, densitet: 1750-1850 kg/m3",location:"DK",unit:"m2",emission:{gwp:{a1a3:"26.8",C3:"0.486",C4:"0.356",D:"-0.363"}},conversions:{kg:{to:"kg",value:"161.5"}},source:{url:"https://www.epddanmark.dk/media/niyexcvm/md-20016-da_rev1-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"6b5e401d-5593-4704-b30c-f2324a140f1a",name:"Letbeton vægelement. 150 mm tyk væg. 10% udsparinger",description:"150 mm tyk letbeton vægelement, 10% udsparinger, densitet: 1750-1850 kg/m3",location:"DK",unit:"m2",emission:{gwp:{a1a3:"38.6",C3:"0.744",C4:"0.538",D:"-0.621"}},conversions:{kg:{to:"kg",value:"242.4"}},source:{url:"https://www.epddanmark.dk/media/niyexcvm/md-20016-da_rev1-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"8c6dd10a-0e6f-44bb-99cb-3c615db92445",name:"Letbeton vægelement. 220 mm tyk væg. 10% udsparinger",description:"220 mm tyk letbeton vægelement, 10% udsparinger, densitet: 1950-2050 kg/m3",location:"DK",unit:"m2",emission:{gwp:{a1a3:"63",C3:"1.15",C4:"0.836",D:"-0.931"}},conversions:{kg:{to:"kg",value:"394.8"}},source:{url:"https://www.epddanmark.dk/media/niyexcvm/md-20016-da_rev1-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"8dde0b7f-862d-47b7-b5bd-803bc2e562fc",name:"TT-element/Ribbedæk. TT60 med 12-18 pcs. L12.5 liner. og 1.3-3.3 kg slap armering",description:"TT60-beton element med 12-18 pcs. L12,5 liner, og 1,3-3,3 kg slap armering",location:"DK",unit:"m2",emission:{gwp:{a1a3:"56.3",C3:"1",C4:"0.734",D:"-0.695"}},conversions:{kg:{to:"kg",value:"332.7"}},source:{url:"https://www.epddanmark.dk/media/jylpjfbu/md-20018-da_rev2.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"27dc407d-25ed-4cb4-a58f-8079f05acfac",name:"TT-element/Ribbedæk. TTS90 med 16-22 pcs. L12.5 liner. og 1-2.5 kg slap armering",description:"TTS90-beton element med 16-22 pcs. L12,5 liner, og 1-2,5 kg slap armering",location:"DK",unit:"m2",emission:{gwp:{a1a3:"55.3",C3:"0.908",C4:"0.658",D:"-0.613"}},conversions:{kg:{to:"kg",value:"302"}},source:{url:"https://www.epddanmark.dk/media/jylpjfbu/md-20018-da_rev2.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"3106550b-89f6-4368-92ea-9c4d0fb10bbf",name:"TT-element/Ribbedæk. TT60 med 20-28 pcs. L12.5 liner. og 2-4 kg slap armering",description:"TT60-beton element med 20-28 pcs. L12,5 liner, og 2-4 kg slap armering",location:"DK",unit:"m2",emission:{gwp:{a1a3:"57.7",C3:"1.01",C4:"0.734",D:"-0.711"}},conversions:{kg:{to:"kg",value:"335.1"}},source:{url:"https://www.epddanmark.dk/media/jylpjfbu/md-20018-da_rev2.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"4844bfd5-3b5e-4fb4-988d-dc9b92f49122",name:"Fabriksbeton (C20/25 SCC) i eksponeringsklasserne X0 og XC1",description:"C20/25 SCC (selvkompakterende beton)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"215",C3:"6.94",C4:"5.13",D:"-4.74"}},conversions:{kg:{to:"kg",value:"2212"}},source:{url:"https://www.epddanmark.dk/media/qoelm3vd/md-20011-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"a979d5f6-c5d8-4276-b482-1f07ef45b5d0",name:"Fabriksbeton (C25/30) i eksponeringsklasserne X0 og XC1",description:"C25/30 (sætmålsbeton)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"241",C3:"6.73",C4:"4.97",D:"-4.6"}},conversions:{kg:{to:"kg",value:"2246"}},source:{url:"https://www.epddanmark.dk/media/qoelm3vd/md-20011-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"8bd8a129-41e5-42cc-aa91-6afc99a19165",name:"Fabriksbeton C35/45 – CEm I SR-5",description:"C35/45 – CEm I SR-5 (Sætmålsbeton fremstillet med sulfatbestandig cement typisk anvendt til anlægskonstruktioner)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"403",C3:"6.85",C4:"5.06",D:"-4.68"}},conversions:{kg:{to:"kg",value:"2304"}},source:{url:"https://www.epddanmark.dk/media/nvwgry4v/md-20013-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"f888ed95-62fa-40e1-a8cb-2c2f9058eb1e",name:"Fabriksbeton C35/45 – CEm I",description:"C35/45 – CEm I (Sætmålsbeton fremstillet med cement for forholdsvis hurtig styrkeudvikling til en bred anvendelse i byggeriet)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"362",C3:"7.07",C4:"5.23",D:"-4.84"}},conversions:{kg:{to:"kg",value:"2267"}},source:{url:"https://www.epddanmark.dk/media/nvwgry4v/md-20013-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"893a4175-cd1b-4d4a-8d26-48bcc69a7b36",name:"Fabriksbeton C35/45 (fugebeton)",description:"C35/45 fugebeton / sammenstøbningsbeton med max stenstørrelse på 8 mm",location:"DK",unit:"m3",emission:{gwp:{a1a3:"377",C3:"6.63",C4:"4.9",D:"-4.54"}},conversions:{kg:{to:"kg",value:"2256"}},source:{url:"https://www.epddanmark.dk/media/nvwgry4v/md-20013-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"49356a0b-831a-4295-9fc8-ceb87a058fed",name:"Fabriksbeton C40/50 – CEm I SR-5",description:"C40/50 – CEm I SR-5 (sætmålsbeton fremstillet med sulfatbestandig cement typisk anvendt til anlægskonstruktioner)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"465",C3:"6.95",C4:"5.14",D:"-4.76"}},conversions:{kg:{to:"kg",value:"2284"}},source:{url:"https://www.epddanmark.dk/media/oz1jfz20/md-20014-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"74085511-73f3-4912-9479-3a6166c7cec3",name:"Fabriksbeton C40/50 – CEm I",description:"C40/50 – CEm I (sætmålsbeton fremstillet med cement for forholdsvis hurtig styrkeudvikling til en bred anvendelse i byggeriet)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"429",C3:"6.77",C4:"5",D:"-4.63"}},conversions:{kg:{to:"kg",value:"2267"}},source:{url:"https://www.epddanmark.dk/media/oz1jfz20/md-20014-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"363ae9ee-23e4-4b62-8749-65ccd56f0f0a",name:"Fabriksbeton C45/55",description:"C45/55 – CEm I (sætmålsbeton fremstillet med cement for forholdsvis hurtig styrkeudvikling til en bred anvendelse i byggeriet)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"426",C3:"6.75",C4:"4.99",D:"-4.62"}},conversions:{kg:{to:"kg",value:"2229"}},source:{url:"https://www.epddanmark.dk/media/oz1jfz20/md-20014-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"7728bf76-474c-444d-a807-888e5bd54eb4",name:"Fabriksbeton C30/37",description:"C30/37 (sætmålsbeton)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"282",C3:"6.72",C4:"4.97",D:"-4.6"}},conversions:{kg:{to:"kg",value:"2255"}},source:{url:"https://www.epddanmark.dk/media/c3alzank/md-20012-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"25f77b3b-76d5-43fd-8ec2-41b8994b8d06",name:"Fabriksbeton C35/45 SCC",description:"C35/45 SCC (selvkompakterende beton)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"300",C3:"6.54",C4:"4.83",D:"-4.47"}},conversions:{kg:{to:"kg",value:"2254"}},source:{url:"https://www.epddanmark.dk/media/c3alzank/md-20012-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"6100aee3-169b-4df3-ab9d-70cb18d51881",name:"Konstruktionstræ af fyr og gran. Savede og tørrede (Forbrænding EoL)",description:"Sawn and dried construction wood products of pine and spruce.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"-680",C3:"728",C4:"0",D:"-371"}},conversions:{kg:{to:"kg",value:"456"}},source:{url:"https://www.epddanmark.dk/media/vf0jy3ur/md-20002-en-tr%C3%A6-dk-c-o-tr%C3%A6-og-m%C3%B8belindustrien.pdf"},subType:"Branche data",materialType:"Wood"},{id:"090d25f0-f57f-4ce5-8c65-e9d84287a6b4",name:"Krydsfiner. ubehandlet (Forbrænding EoL)",description:"WISA Spruce plywood, uncoated.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"-599",C3:"743",C4:"0",D:"-391"}},conversions:{kg:{to:"kg",value:"480"}},source:{url:"https://www.epddanmark.dk/media/luijc3vg/md-20008-en_rev2_tr%c3%a6dk.pdf"},subType:"Branche data",materialType:"Wood"},{id:"056aa5c5-d4e7-4046-a701-a65c5a1f660e",name:"Fireproof glass Pyrobel",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"71.6",C3:"-",C4:"0.645",D:"-"}},conversions:{kg:{to:"kg",value:"50.05"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/70d35332-9f2d-4f3b-8688-431388263d2d?version=00.00.011"},subType:"Generisk data",materialType:"Glass"},{id:"6455bd98-404d-40a8-a1ae-5d34c684ceb3",name:"Copper piping",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"1.97",C3:"-",C4:"0.000949",D:"-0.733"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6943ea24-03bc-4a84-9bf9-c320b052be82?version=00.03.000"},subType:"Generisk data",materialType:"metal"},{id:"7552e777-1be7-4f2e-8a79-f9da6445482f",name:"Roofing stones, concrete",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"255.909",C3:"-",C4:"16.07",D:"-2.681"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"https://oekobaudat.de/OEKOBAU.DAT/datasetdetail/process.xhtml?uuid=19249f5e-d218-43dd-834d-aa60f389adae&version=00.03.000&stock=OBD_2021_II&lang=de"},subType:"Generisk data",materialType:"Concrete"},{id:"951163ea-55b3-40e8-905d-586791708367",name:"Carpeted tiling",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"20",C3:"0.0341",C4:"4.56",D:"-0.0958"}},conversions:{kg:{to:"kg",value:"1.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ea1e97c0-5232-43cf-b56a-adde6e3e5916?version=00.03.000"},subType:"Generisk data",materialType:"Flooring"},{id:"2d897e19-3bed-4079-98ef-32b4040da3cc",name:"Wood fiber insulation",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-156.3",C3:"238.2",C4:"-",D:"-124"}},conversions:{kg:{to:"kg",value:"157.49"}},source:{url:"https://oekobaudat.de/OEKOBAU.DAT/datasetdetail/process.xhtml?uuid=51a420d8-6366-4e14-83db-ecfe0721774d&version=00.00.050&stock=OBD_2021_II&lang=de"},subType:"Generisk data",materialType:"Insulation"},{id:"c509b9e0-b4e5-4182-8261-d8b7ffa19943",name:"Zink, patinaed",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"2.09",C3:"-",C4:"#G0122",D:"#G0122"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0ea8dd25-57aa-4b87-87e3-4496368f765b?version=00.04.000"},subType:"Generisk data",materialType:"metal"},{id:"794f3076-c0d0-44fd-aa40-89195bf73148",name:"Grout mortar",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.465",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6f38efae-dc15-4667-96a4-1b87be6a80a5?version=00.04.000"},subType:"Generisk data",materialType:"mortar"},{id:"dc80901a-0486-4f94-b427-2189d3ff80fa",name:"Waterprrofing membrane, liquid",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"1.11",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/285ae869-97d4-4032-8269-767c9371e71f?version=00.03.000"},subType:"Generisk data",materialType:"membrane"},{id:"eaf70f20-3f98-4391-8532-ce7455b2ee4a",name:"PE-foamcovered copper piping",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"2.29",C3:"-",C4:"0.377",D:"-0.868"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a2bad85c-ee4b-4007-bdb6-935826c4dc1f?version=00.03.000"},subType:"Generisk data",materialType:"Plastic"},{id:"3834c760-b1e2-4a59-936f-595b07463d70",name:"PE-covered copper piping",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"2.07",C3:"-",C4:"0.964",D:"-1.1"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/52378794-74b6-40ae-a8a8-a259c55f0a9d?version=00.05.000"},subType:"Generisk data",materialType:"Plastic"},{id:"1c7131a1-b315-4d11-b92e-d97e20546eb1",name:"PU-foamcovered copper piping",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"2.85",C3:"-",C4:"0.611",D:"-0.952"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4fe143d7-f46a-468f-950c-b90b804b6fe1?version=00.03.000"},subType:"Generisk data",materialType:"Plastic"},{id:"4eb7e3f5-a903-4593-ad9e-371583899ee1",name:"PU foamplate (12 cm)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"14.8",C3:"0.102",C4:"8.74",D:"-4"}},conversions:{kg:{to:"kg",value:"3.96"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/880e05ea-55c6-4346-a3ea-5af0e5f299e2?version=00.03.000"},subType:"Generisk data",materialType:"Insulation"},{id:"66c2cfbb-b461-4957-91fe-63e420082fa7",name:"PVC-covered copper piping",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"1.83",C3:"-",C4:"0.987",D:"-1.12"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6a6756b7-a985-4358-8222-01254ddb6aa9?version=00.03.000"},subType:"Generisk data",materialType:"Plastic"},{id:"c35cda56-aab8-401b-85b5-5b62f9b4c4ea",name:"WPC façade panel",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-0.558",C3:"878.167",C4:"-",D:"-274.917"}},conversions:{kg:{to:"kg",value:"7.79"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/dd603f7a-93de-4a24-a26f-76a366966d4a?version=00.03.000"},subType:"Generisk data",materialType:"Wood"},{id:"821c4b45-e968-4efd-9682-b1c168350d87",name:"WPC terrace covering",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.253",C3:"210.833",C4:"-",D:"-487.195"}},conversions:{kg:{to:"kg",value:"18.36"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0452f1bc-9766-4785-bf4e-44bc76dedf75?version=00.03.000"},subType:"Generisk data",materialType:"Wood"},{id:"9fded55b-9688-4fe3-8871-3b0b564b73ed",name:"EPS insulation (grey) with thermal ray absorbant",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"49.7",C3:"-",C4:"55.6",D:"-28.7"}},conversions:{kg:{to:"kg",value:"16.6"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8dfa6b75-0dcb-4748-a2d9-2d572d87ba61?version=00.08.000"},subType:"Generisk data",materialType:"Insulation"},{id:"436ece26-9cab-4e22-bff5-3f438733a8db",name:"EPS insulation for walls and roofs 035",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"59.5",C3:"-",C4:"75.2",D:"-39.6"}},conversions:{kg:{to:"kg",value:"22.7"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c5edec42-1921-46c6-a3aa-5cbd27685a74?version=00.07.000"},subType:"Generisk data",materialType:"Insulation"},{id:"c172ab9e-bad0-432d-bac6-c2c5ff4aefd5",name:"EPS insulation for ceilings/floors and cellar walls/ground deck 035",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"75.4",C3:"-",C4:"85.9",D:"-45.2"}},conversions:{kg:{to:"kg",value:"25.9"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ee10b277-07b5-4c0a-8a48-e0412a9630ff?version=00.07.000"},subType:"Generisk data",materialType:"Insulation"},{id:"f48e56ef-8fa2-4be9-8213-d88953623db9",name:"EPS insulation for walls and roofs 040",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"52.5",C3:"-",C4:"59.5",D:"-31.3"}},conversions:{kg:{to:"kg",value:"18"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/64564161-a587-47de-b195-b6b13b3bfb07?version=00.07.000"},subType:"Generisk data",materialType:"Insulation"},{id:"ccd76857-b465-4a43-9757-6a84d5a0de55",name:"EPS insulation for ceilings/floors and cellar walls/ground deck 040",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"53.8",C3:"-",C4:"61",D:"-32.1"}},conversions:{kg:{to:"kg",value:"18.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d63926ea-8473-4ea7-b965-a7bae6e5e022?version=00.07.000"},subType:"Generisk data",materialType:"Insulation"},{id:"9a094253-c41b-497c-9bf1-79287713e80c",name:"PU foam Insulation, covered with aluminium on both sides (12 cm)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"12.9",C3:"0.106",C4:"8.56",D:"-4.98"}},conversions:{kg:{to:"kg",value:"3.72"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ee4fb7c2-6119-4f00-8cb6-fc74cb66fe9a?version=00.08.000"},subType:"Generisk data",materialType:"Insulation"},{id:"a949734e-f019-4ecf-9d40-c2f634920c6b",name:"Cellular glass insulation - 115 kg/m³",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"1.32",C3:"-",C4:"#G0912",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/55943b94-ad62-4372-9dfc-bc50e19e52c0?version=00.05.000"},subType:"Generisk data",materialType:"Insulation"},{id:"17f70e58-22b1-4a31-b21d-b867a9ea4639",name:"Steel, rolled profiles and plates",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"1125",C3:"1.844",C4:"-",D:"-413.4"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5cb2c568-76fe-4803-8b46-0084e79800c8?version=00.06.000"},subType:"Generisk data",materialType:"metal"},{id:"d03a8039-b5ab-4f86-8851-426d11fab193",name:"Surface, façade paint, primer, dispersion",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"210.646",C3:"-",C4:"0.0150055",D:"-0.00942649"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/948f8f68-f1f2-42f6-8350-6e27d6e80c7c?version=20.19.120"},subType:"Generisk data",materialType:"Paint"},{id:"a3bdcc4f-ba00-41a7-84d5-1dd45825745c",name:"Piping for electric heating (water-water) 70 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"417.966",C3:"0.0147327",C4:"-",D:"-280.661"}},conversions:{kg:{to:"kg",value:"123"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fbfe5992-4cd4-4875-867d-5e89cb453e2c?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"8df52ea3-5559-4d84-840b-1380348d8689",name:"Stone plaster",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.00230588",C3:"-",C4:"0.0150055",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fbd76e49-0fb1-47e0-abba-903ce1272684?version=20.19.120"},subType:"Generisk data",materialType:"Plaster"},{id:"4830c500-9569-422c-b519-405c7bc01705",name:"Boksventilator 30.000 m³/h.",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"846.712",C3:"118.708",C4:"0.0982552",D:"-506.236"}},conversions:{kg:{to:"kg",value:"1.678.000.002"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fbb81ecc-f707-4afb-bcce-758b6be6d337?version=20.19.120"},subType:"Generisk data",materialType:"Ventilator"},{id:"03ca0ea9-d26b-4772-bc7a-375bb374f07d",name:"Varmepumpe. jordvarmesonde. 70 Kw",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"6262.06",C3:"114.807",C4:"0.0300174",D:"-267.67"}},conversions:{kg:{to:"kg",value:"4854.66"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fbb56e56-29d6-408e-8941-fc37ed48fb11?version=20.19.120"},subType:"Generisk data",materialType:"Heat pump"},{id:"424f5e55-5d92-40c9-80d9-a3e555097e53",name:"Fiberglass cloth",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.293104",C3:"0",C4:"0.00196436",D:"-"}},conversions:{kg:{to:"kg",value:"0.12"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fa976ebb-09ce-4e5b-9976-621d9ac1f12e?version=20.19.120"},subType:"Generisk data",materialType:"Insulation"},{id:"5d42013b-8647-4997-aa19-fba309d1cf1b",name:"Curtain wall facade with 3-lags ruder. Steel",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"970.738",C3:"620.355",C4:"0.420155",D:"-154.654"}},conversions:{kg:{to:"kg",value:"21.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f939c2b2-7f3d-40f8-9903-d0fc30a62d91?version=20.19.120"},subType:"Generisk data",materialType:"Facade"},{id:"5f226b79-c9cd-4e2e-a20d-88ca3abc8342",name:"Lavagrus",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.00379143",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f8d6bd85-55e0-42d3-982b-b814387b7f58?version=20.19.120"},subType:"Generisk data",materialType:"Gravel"},{id:"22ee5777-cb5d-4d5d-b2ff-8cb49cd071b3",name:"Teglsten. formur",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"528.541",C3:"13.207",C4:"-",D:"-369.717"}},conversions:{kg:{to:"kg",value:"1800"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f74a19da-df9a-4462-a632-3b3dc83377b1?version=20.19.120"},subType:"Generisk data",materialType:"Brick"},{id:"9c4d4e87-7e31-4013-a947-b06b5791e812",name:"Rør. Afløbsrør. PVC",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"191.881",C3:"0.607628",C4:"-",D:"-0.259614"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f5c6cbd6-258c-4542-876a-1d44adfc0992?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"78e85e83-dd07-43cc-8c10-c240afb91b63",name:"Stål. varmvalset plade. Genanvendelse",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"-",C4:"0.00068207",D:"-181.062"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f34a799a-52de-4f69-a623-335f5be207d9?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"a820e473-b064-4a8c-a88b-5cb023420cd5",name:"Teflon-membran. polytetrafluoroethylen (PTFE)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"144.411",C3:"0.364086",C4:"-",D:"-0.167871"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f281ecaf-5754-4d27-8d70-cfd18780b192?version=20.19.120"},subType:"Generisk data",materialType:"membrane"},{id:"c6f1db0f-4044-4c26-89e8-0a95be88c141",name:"Decentralt ventilationsanlæg med varmegenvinding (væg & loft) 60 m3 / h",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"253.286",C3:"448.641",C4:"0.0504797",D:"-11.696"}},conversions:{kg:{to:"kg",value:"3.69"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/efabdf2d-993e-418c-ba86-85a3a91562a2?version=20.19.120"},subType:"Generisk data",materialType:"Ventilator"},{id:"145a0738-c2a7-44fb-8833-485469d4f2f4",name:"Varmepumpe (luft-vand) 7kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"321.294",C3:"210.599",C4:"299.723",D:"-169.065"}},conversions:{kg:{to:"kg",value:"93.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/efa279e8-0ac1-4883-b87c-0cb11e17d265?version=20.19.120"},subType:"Generisk data",materialType:"Heat pump"},{id:"bcd284d6-299f-4702-a567-9602e4991fa0",name:"Gips. beta-halvhydrat",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.103165",C3:"-",C4:"0.0150055",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ee840270-3055-428a-b38d-e7727426cc35?version=20.19.120"},subType:"Generisk data",materialType:"Plaster"},{id:"a5abdbd7-90cc-43b3-bd91-73fe246b3210",name:"Gulvvarmesystem inkl. isolering. PEX (100 mm afstand)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"774.763",C3:"668.108",C4:"-",D:"-278.435"}},conversions:{kg:{to:"kg",value:"1.9"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ed997c1e-274c-4d38-a5bf-2016693c91a3?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"9312362d-ba26-4215-b205-aa132615a08b",name:"Overflade. Anodisering af aluminiumplade",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"611.931",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ecf20fae-fe11-41ad-b248-8b4118fd7cc7?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"f3f04c9b-0c5e-4eea-9e95-9725bffd387c",name:"Overflade. Pulverlakering (Industri. udendørs. hvid)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"473.516",C3:"104.568",C4:"-",D:"-0.321226"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/eaec8e5d-f70a-4993-b3a6-814607f5e7b3?version=20.19.120"},subType:"Generisk data",materialType:"Paint"},{id:"433b852e-ff03-4880-991f-c843e1c6b77f",name:"Beslag. stålvindue",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"927.171",C3:"-",C4:"#G0204",D:"#G0204"}},conversions:{kg:{to:"kg",value:"2.63"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ea4ff1e8-4ee8-4ecf-8951-a79b5b60dd2a?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"9e375b9d-6761-4ac4-918e-e18fdb717955",name:"Armeringsnet",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.683355",C3:"-",C4:"#G0204",D:"#G0204"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e9ae96ee-ba8d-420d-9725-7c8abd06e082?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"00b81137-211c-496a-b7a3-8200a9fcf650",name:"Afretningslag. hårdt plast",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.3311",C3:"-",C4:"0.0163697",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e98995e0-f945-4fea-849f-cec0aff6cb0c?version=20.19.120"},subType:"Generisk data",materialType:"Plastic"},{id:"cecbad5b-d553-4658-81d0-6d905d1aa8d9",name:"Boksventilator 10.000 m³/h.",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"343.014",C3:"480.918",C4:"0.0398429",D:"-205.411"}},conversions:{kg:{to:"kg",value:"68"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e8afb4e6-1f0d-479b-a54a-c818970dcb42?version=20.19.120"},subType:"Generisk data",materialType:"Ventilator"},{id:"aae5e6d3-591c-4acd-8ce0-b92acdfba99e",name:"Grus 2-32 mm. tørret",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0332595",C3:"0.00733722",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e7b1d3c2-3494-4ae6-9f98-d4d507dcd0c2?version=20.19.120"},subType:"Generisk data",materialType:"Gravel"},{id:"32b95d6a-c7ad-401f-a5b8-0cbdfc0c4be4",name:"Polystyren skumfyldning (uden bindemiddel)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"488.671",C3:"554.102",C4:"-",D:"-23.208"}},conversions:{kg:{to:"kg",value:"15"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e6b12fcd-c1fb-40d9-a9ec-d0149c3d1cd8?version=20.19.120"},subType:"Generisk data",materialType:"Insulation"},{id:"c3c23159-b1cd-472e-b694-631bfe660d68",name:"Oliekedel. lav temperatur. 20-120 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1287.48",C3:"190.828",C4:"159.552",D:"-223.013"}},conversions:{kg:{to:"kg",value:"354"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e69bcb28-f58b-443b-b62f-810bbdf6cedb?version=20.19.120"},subType:"Generisk data",materialType:"Boiler"},{id:"f5cde9bf-4a06-42ab-8b2f-20a70cdcc8b4",name:"Fibercementplade",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"6.993",C3:"-",C4:"0.195072",D:"-"}},conversions:{kg:{to:"kg",value:"13"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e24f9f47-8580-45c2-b16d-45145d65a813?version=20.19.120"},subType:"Generisk data",materialType:"Plaster"},{id:"15b61d9d-6526-439a-9f24-8256e2c99e95",name:"Ekspanderet glasgranulat",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.273532",C3:"-",C4:"#G0912",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e2306538-776d-4bc5-ae3b-1c920fb40285?version=20.19.120"},subType:"Generisk data",materialType:"Gravel"},{id:"808d0f35-d75b-4361-a37d-5fb242b83a60",name:"Rør. Kloakrør PVC",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"28.225",C3:"301.298",C4:"-",D:"-0.66727"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e1f7f83b-6f6e-4ed8-a666-0d49682982e1?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"d0a33e3a-6dfc-4b5f-825e-57aec9021d00",name:"Gaskedel. kondenserende. < 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"446.213",C3:"915.866",C4:"0.638208",D:"-631.364"}},conversions:{kg:{to:"kg",value:"118"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e1ccc83d-01d7-407a-ab59-8c3e1265e8cf?version=20.19.120"},subType:"Generisk data",materialType:"Boiler"},{id:"70857bce-c8bf-4b88-a15d-7665a1034ff9",name:"EPDm skum (rørisolering)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"245.125",C3:"137.702",C4:"-",D:"-695.688"}},conversions:{kg:{to:"kg",value:"55"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e1875cbe-23ad-4800-b40d-ca36b9baab6a?version=20.19.120"},subType:"Generisk data",materialType:"Insulation"},{id:"93098ace-c336-4419-94f1-99f86cc905e7",name:"Vindueskarm. aluminium",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"157.712",C3:"0.693459",C4:"-",D:"-951.688"}},conversions:{kg:{to:"kg",value:"1.43"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/dfa64bbb-dc8d-497b-9557-300416b8448f?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"fb1d2dff-4dc9-45e8-8035-1d722128f362",name:"Stokerfyr 20-120 KW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2218.21",C3:"508.292",C4:"180.285",D:"-998.687"}},conversions:{kg:{to:"kg",value:"921"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/df3ec8a0-012d-49ba-ac07-878cdb764bf6?version=20.19.120"},subType:"Generisk data",materialType:"Boiler"},{id:"bd1862d7-56bd-46c7-9778-62200e8b9cab",name:"Kalkcementpuds",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"356.634",C3:"-",C4:"27.01",D:"-"}},conversions:{kg:{to:"kg",value:"1800"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/dea7df16-f59b-4842-a66c-cb9463a58ae3?version=20.19.120"},subType:"Generisk data",materialType:"Plaster"},{id:"0f1cf3f8-ed32-458e-9ce0-c7bc7053cadc",name:"Grus 16/32 (tørret)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0342735",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/de7fbcfc-0ee0-4e65-a1f9-af1551a20281?version=20.19.120"},subType:"Generisk data",materialType:"Gravel"},{id:"21d069a2-676c-4197-bc80-44fa47541879",name:"Fjernvarmeanlæg",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"47.708",C3:"0.20703",C4:"0.00917947",D:"-122.993"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/dcd5e23a-9bec-40b6-b07c-1642fe696a2e?version=20.19.120"},subType:"Generisk data",materialType:"Boiler"},{id:"1c6ba4ec-04a4-40bb-b0da-637038cbe7ed",name:"Grå støbejern",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"163.536",C3:"-",C4:"#G0204",D:"#G0204"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/dbc94e02-b28f-43eb-8133-a161e9b83dfa?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"5cdee5a1-182d-4728-8aa7-ed6f6ef4d51e",name:"Stålprofil. Genanvendelse",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"-",C4:"0.00068207",D:"-0.393"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d9f045e5-ae07-4ae6-9fde-5346560411d8?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"4c913b2f-e07d-4c61-ba9e-64a06e884dbc",name:"messing",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"138.566",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d9ee3a94-83a2-4615-b071-9afa3aaeff42?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"16c5c2d8-2de4-4dbd-a661-998132316ef6",name:"Rør. Regnvandsrør. PVC",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"242.826",C3:"301.298",C4:"-",D:"-0.66727"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d9baa9f5-b9d2-4f8f-928d-2f4116b36662?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"20aadcf5-6f63-4a6a-b7de-a9d8c7be2a7b",name:"Rude. 2-lags",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"369.941",C3:"151.738",C4:"0.327394",D:"-0.702716"}},conversions:{kg:{to:"kg",value:"20.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d941f45e-1244-419c-a083-e4a49fb5498e?version=20.19.120"},subType:"Generisk data",materialType:"Glass"},{id:"8183db7a-cb59-430c-8b7c-adb839845a38",name:"Bære-/slidlag. Asfalt",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0789355",C3:"0",C4:"-",D:"-0.0263052"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d84cbf6a-0a50-426f-aa3d-c45918b43575?version=20.19.120"},subType:"Generisk data",materialType:"Asphalt"},{id:"e67c0ac4-a461-49a8-aac3-6065fa23a3c2",name:"Kalkpuds",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"407.986",C3:"-",C4:"27.01",D:"-"}},conversions:{kg:{to:"kg",value:"1800"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d7f4a913-441f-4c21-aae5-42e421737e29?version=20.19.120"},subType:"Generisk data",materialType:"Plaster"},{id:"07c72f20-caf8-4ed0-b3aa-c17ec6375462",name:"Rør til el-varmepumpe (lodret jordvarme. saltvand). probe. 10 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"614.302",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"188.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d775709c-1411-4aeb-9d20-36e1e8def5e2?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"690efae6-7318-463e-bd21-9246e93a9464",name:"Træ. lærk",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-907.564",C3:"1186.9",C4:"-",D:"-314.259"}},conversions:{kg:{to:"kg",value:"660.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8c47fba4-0e61-48d1-a03f-bf17911f0dae?version=20.19.120"},subType:"Generisk data",materialType:"Wood"},{id:"37d549fd-651b-40b7-995f-381e20368cc6",name:"Rør til el-varmepumpe (lodret jordvarme. saltvand). probe. 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"6027.13",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"551.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/79002203-de3f-4da6-9a72-b689615b9963?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"fc69697d-6969-42fd-bc76-62a66feac8c9",name:"Overflade. Pulver coating af metal",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"409.796",C3:"0.205333",C4:"-",D:"-0.0578208"}},conversions:{kg:{to:"kg",value:"0.18"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d61a6f60-bcca-4bf6-a151-bd076b4c3366?version=20.19.120"},subType:"Generisk data",materialType:"Paint"},{id:"1a71dcf9-59f8-4952-a493-1893a103fd6c",name:"Overflade. trævinduer. hvid grunder",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"182.186",C3:"0.784673",C4:"-",D:"-0.243853"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d5fe89f0-5fd2-4981-bb87-e74bbf13ef88?version=20.19.120"},subType:"Generisk data",materialType:"Paint"},{id:"142b6736-ac06-4536-8d2a-4d59ba69100d",name:"Blyplader",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"128.344",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d596ddf7-aaf3-44cc-b7ae-faedc8d0870a?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"88043cf8-129c-4864-a406-b2b7f9a34130",name:"Buffertank. rustfast stål",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"405.831",C3:"0.663445",C4:"-",D:"-120.298"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d3f58b23-9526-43be-8a32-fb583dfebfaa?version=20.19.120"},subType:"Generisk data",materialType:"Boiler"},{id:"2eb92ac2-81a1-4c2b-a779-e6779f11e9da",name:"Porebeton 474 kg/m³. armeret",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"263.192",C3:"336.101",C4:"-",D:"-102.642"}},conversions:{kg:{to:"kg",value:"500"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d3b59cac-3b4e-4d18-8c3a-780b553c9591?version=20.19.120"},subType:"Generisk data",materialType:"Concrete"},{id:"19916389-e963-4cee-ae67-6fcc2d12c60a",name:"Facadeklinker",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"541.904",C3:"134.516",C4:"-",D:"-410.796"}},conversions:{kg:{to:"kg",value:"2000"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d311ba82-a703-4865-b5e3-f704e5b88712?version=20.19.120"},subType:"Generisk data",materialType:"Brick"},{id:"6c91d4e5-b9c7-4342-8f41-be96848cb12b",name:"Kalk. malet",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"144.393",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d1d6f54d-9709-4302-8276-fdb7d06801fd?version=20.19.120"},subType:"Generisk data",materialType:"Plaster"},{id:"cf2b5aa8-2e68-48d6-bd34-884572bda87c",name:"Difluormethan (R32)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"522.467",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d05ec06c-0443-4357-8915-ba745dcc84a5?version=20.19.120"},subType:"Generisk data",materialType:"Coolant"},{id:"393a150c-4905-489e-b5d9-154ed3977c73",name:"Gas varmepumpe (luft) 20-70 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"362.364",C3:"10.373",C4:"632.349",D:"-207.236"}},conversions:{kg:{to:"kg",value:"156.82"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d05d595c-7542-42e2-9a02-df9c8c75e567?version=20.19.120"},subType:"Generisk data",materialType:"Boiler"},{id:"3e6cca9b-ce6d-4ec0-aef5-9f4d61599f6d",name:"Gaskedel. kondenserende. 120-400 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2842.15",C3:"715.794",C4:"180.384",D:"-507.684"}},conversions:{kg:{to:"kg",value:"937"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/cf9764d1-3aba-4e5e-8795-a8f1ee93d9e5?version=20.19.120"},subType:"Generisk data",materialType:"Boiler"},{id:"9e2fbc5e-8ce7-459d-b980-9f882de16df9",name:"Papiruldsplader",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-199.935",C3:"176.145",C4:"-",D:"-696.378"}},conversions:{kg:{to:"kg",value:"80"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/cf963fcb-0e03-48c0-b501-ad0d1e3c22c0?version=20.19.120"},subType:"Generisk data",materialType:"Insulation"},{id:"13f8ce74-9a32-4bfd-b0f0-054228f5c8c6",name:"Phenolplast. stift skum (PF)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"873.203",C3:"900.279",C4:"-",D:"-319.992"}},conversions:{kg:{to:"kg",value:"40"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/cf6e341b-3de7-4e24-b4d2-8ac484ee7c0e?version=20.19.120"},subType:"Generisk data",materialType:"Plastic"},{id:"ac2303b9-57a8-46ea-b050-536a8070b11c",name:"Rør. Kloakrør HDPE",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"209.831",C3:"345.444",C4:"-",D:"-170.559"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/cd5b784e-497d-4c76-abbd-d66867e1e986?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"046e5a39-555c-4174-abcb-804b684463c5",name:"Kunststenplade (bundet af epoxyharpiks)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"283.505",C3:"0.381535",C4:"-",D:"-0.106807"}},conversions:{kg:{to:"kg",value:"52"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ccdb5f3c-7305-46c7-ad5b-a05bb922a743?version=20.19.120"},subType:"Generisk data",materialType:"Stone"},{id:"06eaa736-fc22-479b-b834-b39f18eecc96",name:"Elevator (grundkomponenter pr. pcs.)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"5193",C3:"373.937",C4:"488.271",D:"-1579.64"}},conversions:{kg:{to:"kg",value:"1603"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/cca90907-409d-4f9c-9922-fdc011a0eb6f?version=20.19.120"},subType:"Generisk data",materialType:"Elevator"},{id:"113becf0-1db1-43eb-b2f5-3ea7f05f8df5",name:"Sanitetskeramik",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"280.282",C3:"0.0163697",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/cace7e48-3fb4-4e11-8cc4-fcefc8b4116a?version=20.19.120"},subType:"Generisk data",materialType:"Ceramic"},{id:"e3ff6cac-6000-4a7a-9c95-dd3d06cf32fe",name:"Ventilationsanlæg decentraliseret (væg & loft) 60 m3 / h",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"408.676",C3:"12.972",C4:"0.0180285",D:"-138.003"}},conversions:{kg:{to:"kg",value:"0.878"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c8cf7494-2f23-4193-a185-f7d4fdfa36b6?version=20.19.120"},subType:"Generisk data",materialType:"Ventilation"},{id:"6b2ce313-8749-43c5-aa83-13eb61a06b53",name:"Radiator. stålplade",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"444.802",C3:"0.000818484",C4:"-",D:"-155.923"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c6de5beb-ffe9-4b5f-aba8-c0c2d3528c58?version=20.19.120"},subType:"Generisk data",materialType:"Radiator"},{id:"a2d85d3e-9765-4f8f-89c0-3cc339743fb0",name:"EPDm-tætning til aluminiumsprofil. med kuldebroafbrydelse",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"138.151",C3:"134.947",C4:"134.869",D:"-14.583"}},conversions:{kg:{to:"kg",value:"0.43"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c445279d-1358-4e36-9f0d-7ecfe8abda81?version=20.19.120"},subType:"Generisk data",materialType:"Seal"},{id:"42687052-d6ef-4c9e-b22b-1c3b99b7a797",name:"Klordifluormethan (R22)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"475.856",C3:"-",C4:"177.483",D:"-0.212757"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c3d4882b-ee25-4595-9b95-01a318e72a44?version=20.19.120"},subType:"Generisk data",materialType:"Coolant"},{id:"eb2d0d79-44c0-4a87-a235-4380df0e6125",name:"Papiruldsisolering. løsfyld",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-733.725",C3:"990.818",C4:"-",D:"-305.055"}},conversions:{kg:{to:"kg",value:"45"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c355d75b-9026-4899-a41c-e5d221c424f2?version=20.19.120"},subType:"Generisk data",materialType:"Insulation"},{id:"567294e0-8b9e-42c0-b932-7a8b0c1fef9f",name:"PUR fugemasse",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"533.286",C3:"265.674",C4:"-",D:"-0.944422"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c34147d4-e691-4733-bf78-8a7ccd039006?version=20.19.120"},subType:"Generisk data",materialType:"Seal"},{id:"7fb96497-1cbc-454b-b4ba-daed5b1c8bae",name:"LPG tank 6400 l / t 2.9 (overjordiske)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"3107.97",C3:"0.957626",C4:"-",D:"-1824.3"}},conversions:{kg:{to:"kg",value:"1170"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c258eabc-6b25-4dff-8a92-b6240f0bccc5?version=20.19.120"},subType:"Generisk data"},{id:"c959446b-f171-41cb-8c1f-efce6ba17a76",name:"Vinduesramme. aluminium",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"17.055",C3:"0.58799",C4:"-",D:"-104.202"}},conversions:{kg:{to:"kg",value:"1.51"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c1cacd2c-d98d-4795-84db-b567d25bb1ed?version=20.19.120"},subType:"Generisk data"},{id:"69f557cf-4068-4d7e-a5bc-0b1a7f6b3eb3",name:"Overflade. Træmaling. udendørs. dækkende (topcoat-system)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"274.094",C3:"0.836874",C4:"-",D:"-0.261171"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c1bc4706-9d3a-4468-8ecb-5a569226d75f?version=20.19.120"},subType:"Generisk data"},{id:"bea3257f-260b-4a60-92a7-61bd03769f40",name:"Sand 0-2 mm. tørret",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0332595",C3:"0.00733722",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c1b237e1-2206-4318-8d99-f023b8aeb5d6?version=20.19.120"},subType:"Generisk data"},{id:"f4cf8d86-a7b9-4dbe-9cd3-34550dd4ab1f",name:"Overflade. Parket lak transparent",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"34.614",C3:"0.912953",C4:"-",D:"-0.256981"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c1328d7d-8ad6-4e74-a701-ffab0c542534?version=20.19.120"},subType:"Generisk data"},{id:"451a0a87-a9fe-4414-bf24-ccbc42638b07",name:"EVA-tagmembran",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"512.518",C3:"79.699",C4:"-",D:"-360.722"}},conversions:{kg:{to:"kg",value:"2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bff01a9a-6b09-429f-b7ff-17d84fbef7ec?version=20.19.120"},subType:"Generisk data"},{id:"bfd1ded2-1d1a-45e2-bd7b-62b9de3ffbe3",name:"Betonmursten",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"242.351",C3:"134.516",C4:"-",D:"-410.796"}},conversions:{kg:{to:"kg",value:"2000"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bdda4364-451f-4df2-a68b-5912469ee4c9?version=20.19.120"},subType:"Generisk data"},{id:"53f9ade7-cfe5-4eb2-9af7-6601508515a2",name:"Aluminiumsprofil",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"10.677",C3:"-",C4:"#G0500",D:"#G0500"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bd6d6d89-b76d-4002-a217-afffbb8aa308?version=20.19.120"},subType:"Generisk data"},{id:"981932b6-d951-49f5-a3f4-9c1b093ef1b1",name:"Skærver 16-32 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.014695",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bd6aa879-e6e6-4181-afc5-1374b2f32dd1?version=20.19.120"},subType:"Generisk data"},{id:"84642ad8-0ace-40ad-86ce-a0c4f25b21c9",name:"Fugemasse. Silikone",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"726.875",C3:"151.829",C4:"-",D:"-0.702716"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bc8d8fd4-6c25-4bd6-bcbf-6f994e8e5753?version=20.19.120"},subType:"Generisk data"},{id:"ace727ff-a23f-4f00-ae6d-c7e0acd8784a",name:"Keramikfliser. u-glaseret",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"685.115",C3:"0.146744",C4:"-",D:"-0.0410796"}},conversions:{kg:{to:"kg",value:"20"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bc2f9dde-f2a6-4630-bf7c-0ad3870012ef?version=20.19.120"},subType:"Generisk data"},{id:"f2fd0d19-a0d5-49be-889a-d44d23b1a33b",name:"Ventilationsaggregat m. varmegenvinding 1000 m3 / h",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"372.133",C3:"0.611164",C4:"0.0901424",D:"-212.093"}},conversions:{kg:{to:"kg",value:"99.1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bc243a22-e260-43d9-9072-dc2006bf8d19?version=20.19.120"},subType:"Generisk data"},{id:"583c7e22-7914-448d-a8ae-125ecd579391",name:"Fugemasse. Acryl",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"303.501",C3:"219.227",C4:"-",D:"-101.503"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b9272c24-9228-45b1-a2a3-d361abe0bb7f?version=20.19.120"},subType:"Generisk data"},{id:"708836a2-17e3-4120-95c3-c61e67e26bda",name:"Puds. gips-kalk",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"119.397",C3:"-",C4:"13.505",D:"-"}},conversions:{kg:{to:"kg",value:"900"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b7fb8ab4-e1e2-4a0b-a9c4-abd6cfa6c7f3?version=20.19.120"},subType:"Generisk data"},{id:"14e92c67-203c-446e-8a1f-9aeaaf7c4fd6",name:"Ekspanderet skifer",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.341109",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b76ded67-067b-47f6-b131-a73db86039b0?version=20.19.120"},subType:"Generisk data"},{id:"714dccda-f18e-42b6-b8ba-0b57e69eb899",name:"Boksventilator 5.000 m³/h",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"217.047",C3:"304.278",C4:"0.0251497",D:"-130.012"}},conversions:{kg:{to:"kg",value:"43"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b5d12008-3cfd-46d7-a564-1164f1a7ddf5?version=20.19.120"},subType:"Generisk data"},{id:"6586e6a7-7782-4b89-b973-0c13e34d80c6",name:"Lerrør. glaseret. DN 400",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"515.194",C3:"112.871",C4:"-",D:"-0.291665"}},conversions:{kg:{to:"kg",value:"142"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b59f6603-c75b-47bb-b1f1-5336affb2acd?version=20.19.120"},subType:"Generisk data"},{id:"0be3ac30-f234-4b99-9bb1-289fa62d6cf7",name:"Kork. expanderet",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-969.007",C3:"151.505",C4:"-",D:"-388.339"}},conversions:{kg:{to:"kg",value:"80"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b50fa992-e435-455a-8dfe-82254e9f4f48?version=20.19.120"},subType:"Generisk data"},{id:"7ce1554d-dec5-4745-9419-d2695954787e",name:"Kertotræ (LVL)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-465.421",C3:"896.177",C4:"-",D:"-304.837"}},conversions:{kg:{to:"kg",value:"465.7"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b50f7b36-d9aa-40c5-b839-4925a1500952?version=20.19.120"},subType:"Generisk data"},{id:"5d2290bc-b54a-4760-8d45-ec0b9b48be53",name:"Cirkulationspumpe 50-250 W",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"264.569",C3:"0.86599",C4:"0.0450712",D:"-506.214"}},conversions:{kg:{to:"kg",value:"4.94"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b4e4d89b-e4d0-4df3-a233-deacc76b2fee?version=20.19.120"},subType:"Generisk data"},{id:"141cf5c3-ab0b-45a4-a598-c5d363e2e41f",name:"Tetrafluorethan (R134a)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"838.634",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b47d86ac-60fa-46f7-ac5c-f98be4b7acdd?version=20.19.120"},subType:"Generisk data"},{id:"3ee03c7b-f893-4f59-ae34-299ab0585833",name:"Tetrafluorpropen (R1234ze)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"612.734",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b3875fa1-4d62-40dc-ab2d-68fe1fbaf352?version=20.19.120"},subType:"Generisk data"},{id:"e8dd2c71-5fb1-4e22-bf9c-768cbdda5fa1",name:"mørtel. cementmørtel",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"345.107",C3:"-",C4:"293.017",D:"-"}},conversions:{kg:{to:"kg",value:"2000"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b2c3f5a3-7858-4644-a49a-2eb883d37c91?version=20.19.120"},subType:"Generisk data"},{id:"cb06057e-dfb8-4045-b040-f4491da13d15",name:"Buffertank. stål",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"31.687",C3:"0.663445",C4:"-",D:"-142.578"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b273afc9-27a1-4a82-a390-8780fd631008?version=20.19.120"},subType:"Generisk data"},{id:"f52f590d-c0b6-4d64-90f2-273fa95deaca",name:"Ventilationskanal. galvaniseret stål",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"304.722",C3:"0.00163697",C4:"-",D:"-158.648"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b24ae8b5-e28a-42f7-a592-05779a347164?version=20.19.120"},subType:"Generisk data"},{id:"8588c622-6d70-4c26-ad57-9408e1e3654a",name:"Beslag til dreje-kip vinduer (aluminium)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"123.655",C3:"-",C4:"#G0763",D:"#G0763"}},conversions:{kg:{to:"kg",value:"1.647"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b1efabb9-6371-4b96-9ee2-d1f11f9f3b25?version=20.19.120"},subType:"Generisk data"},{id:"6b969e2d-c860-4a1e-9f12-ce04d0a857c9",name:"Byggepap",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-0.0897286",C3:"0.162065",C4:"-",D:"-0.0579045"}},conversions:{kg:{to:"kg",value:"0.08"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b1ea7c10-4471-4485-95bf-7dc0a00025b6?version=20.19.120"},subType:"Generisk data"},{id:"d7e2e052-4d86-4541-922c-8dbdaf47fd49",name:"Rør til el-varmepumpe (lodret jordvarme. saltvand). collector. 70 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2541.8",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"987"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b12f748d-5aa2-4cf6-a0b7-46ce0465ee02?version=20.19.120"},subType:"Generisk data"},{id:"8abab2eb-0feb-4d58-9d55-18d75c533fca",name:"Rør til el-varmepumpe (vand-vand) 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"174.764",C3:"0.0147327",C4:"-",D:"-280.661"}},conversions:{kg:{to:"kg",value:"48"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/af5e34f6-7790-431e-b535-fcc2c0e55aab?version=20.19.120"},subType:"Generisk data"},{id:"66c22e07-d274-4d8f-92c9-c5524aff525b",name:"Hørfiberdug",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"160.445",C3:"861.825",C4:"-",D:"-120.031"}},conversions:{kg:{to:"kg",value:"38"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/af13e5a8-0961-454a-ad3a-7093a37fc802?version=20.19.120"},subType:"Generisk data"},{id:"b2e21b24-983e-47ef-80ec-ab30d181706c",name:"Træ. egetræ (12% fugt / 10.7% H2O)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-1063",C3:"1287.83",C4:"-",D:"-341.221"}},conversions:{kg:{to:"kg",value:"716.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7ec1d463-fd99-4b1d-9a57-9a72cac408d2?version=20.19.120"},subType:"Generisk data"},{id:"acd73399-28d6-41d0-bc16-350dab423584",name:"Støbeasfalt",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0972808",C3:"0",C4:"-",D:"-0.0263052"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5bebcf89-2e6b-46ce-b05e-3e02929c8af4?version=20.19.120"},subType:"Generisk data"},{id:"ca7da2c1-1e28-4358-9842-c84ffbb9191c",name:"Ventilationsaggregat m. varmegenvinding 5000 m3 / h",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1460.38",C3:"177.427",C4:"0.180285",D:"-881.899"}},conversions:{kg:{to:"kg",value:"367.94"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/aca6eca0-ff86-4818-beac-76df2ffebaed?version=20.19.120"},subType:"Generisk data"},{id:"4d1e80d4-827c-499a-9a07-e4a1100c2e79",name:"Betontrappe. etagehøj",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"312.836",C3:"139.419",C4:"-",D:"-390.288"}},conversions:{kg:{to:"kg",value:"1965"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ab0a0f3c-41f6-4b0a-a12c-f8bd0c8a4a23?version=20.19.120"},subType:"Generisk data"},{id:"168e2c18-4cf8-47da-a1c6-34aa35e7e661",name:"ECB-plast tagmembran. ifølge DIN 16729 (med PES-filt)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"823.049",C3:"704.063",C4:"-",D:"-32.606"}},conversions:{kg:{to:"kg",value:"2.32"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/aaf4baca-7530-435b-8736-0bd3bb51e36d?version=20.19.120"},subType:"Generisk data"},{id:"8b6fa2af-1928-4ad3-9fe0-6f987f0f5d43",name:"Solvarmekollektor. vakuumrør",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"109.581",C3:"233.419",C4:"-",D:"-388.375"}},conversions:{kg:{to:"kg",value:"29.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/aa6822f9-a10e-45c9-a164-f08ebc994379?version=20.19.120"},subType:"Generisk data"},{id:"ca196873-e4f0-428f-aa09-8318880e711b",name:"Rør til el-varmepumpe (vand-vand) 10 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"136.135",C3:"0.0147327",C4:"-",D:"-280.661"}},conversions:{kg:{to:"kg",value:"33"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/aa0311ec-2e2a-4afa-af9e-5b6122b730ef?version=20.19.120"},subType:"Generisk data"},{id:"0bc0dc28-f83b-426e-b6f6-f510f8d98cd2",name:"Varmepumpe. vand-vand. 70 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"553.729",C3:"136.581",C4:"0.0300174",D:"-307.478"}},conversions:{kg:{to:"kg",value:"199.22"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a70d347a-239c-4e45-a8dc-e9e574dbf898?version=20.19.120"},subType:"Generisk data"},{id:"c9b249d1-62b4-42fd-8cc0-ff5a5c80c318",name:"Bitumenemulsion (40% bitumen. 60% vand)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.356326",C3:"0",C4:"0.0859383",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a6b26cf9-3f9a-4abc-9412-87fdc0cdf3f6?version=20.19.120"},subType:"Generisk data"},{id:"c5efeb16-b069-4794-bd06-7a17c9b7212a",name:"Curtain wall profiler. stål",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"366.271",C3:"342.169",C4:"-",D:"-148.223"}},conversions:{kg:{to:"kg",value:"9.48"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a60431a7-10aa-4106-bc7c-c6acb01ee9b3?version=20.19.120"},subType:"Generisk data"},{id:"b9270b73-dec8-4366-82ed-45adc18d2336",name:"Kuldioxid (R744)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"10.753",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a5bb6444-74e1-43f7-8e7d-55aed1ac1b6e?version=20.19.120"},subType:"Generisk data"},{id:"9862f4ea-c11c-44a4-a463-91f2b56b6a3b",name:"Slaggebeton. sten",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"352.838",C3:"102.721",C4:"-",D:"-287.557"}},conversions:{kg:{to:"kg",value:"1400"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a4fceab4-71a2-46c9-ac9a-19a964d48ce5?version=20.19.120"},subType:"Generisk data"},{id:"5a138edb-5930-4187-b19d-ac31e3f9296b",name:"Stenmel 0/2",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.014695",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a4d16918-287f-43af-831d-baf80093fe4a?version=20.19.120"},subType:"Generisk data"},{id:"b999d0e7-bdcc-4131-b3dc-1922e059c9f1",name:"Aluminiumsplade",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"104.617",C3:"-",C4:"#G0500",D:"#G0500"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a4c1c27c-53a0-4027-83f6-88c52c758bb1?version=20.19.120"},subType:"Generisk data"},{id:"53083bc6-e480-44ea-8663-421dae1f384d",name:"Rulletrappe (komponenter. som er afhængige af højden)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2467.1",C3:"272.787",C4:"-",D:"-1251.37"}},conversions:{kg:{to:"kg",value:"800"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a4233092-7d86-4a97-ba5c-abc551564f6f?version=20.19.120"},subType:"Generisk data"},{id:"4e4cb97d-1966-4b93-92bf-d6386d9d9a30",name:"Stål. Smedestål",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"280.793",C3:"-",C4:"#G0204",D:"#G0204"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a255934e-5461-4501-9acf-20ad1b51b044?version=20.19.120"},subType:"Generisk data"},{id:"200b7205-a6f5-4b60-a969-7d2e7fba3721",name:"Cementbundet spånplade",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"1694.15",C3:"279.382",C4:"-",D:"-846.451"}},conversions:{kg:{to:"kg",value:"1200"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a0d69f94-040e-44b1-a88b-bbaeeb0aae2a?version=20.19.120"},subType:"Generisk data"},{id:"6e0f5c88-cda3-49b2-8675-9c6e0d8d7c40",name:"Elevator (komponenter pr. etage)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"969.289",C3:"0.295179",C4:"-",D:"-493.136"}},conversions:{kg:{to:"kg",value:"333"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a074d0aa-68fd-4105-9b27-e9cf0042cb4d?version=20.19.120"},subType:"Generisk data"},{id:"b470cf8b-e875-4401-ad08-6b7edeece1b5",name:"Glasfiber-forstærket plast. polyester (30% fiberandel)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"373.108",C3:"159.357",C4:"-",D:"-0.737851"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a051b8eb-5e03-486a-b9c3-bfc9d19234de?version=20.19.120"},subType:"Generisk data"},{id:"7c7e1f63-acaf-4c34-81b0-4ef80b7f304c",name:"Cirkulationspumpe 250-1000 W",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"132.285",C3:"432.995",C4:"0.225356",D:"-253.107"}},conversions:{kg:{to:"kg",value:"24.7"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/9fe2649f-bd76-41d8-b952-0021143f1ef7?version=20.19.120"},subType:"Generisk data"},{id:"e0127c03-5eb6-4c55-b9de-0501aadcec57",name:"Rør. Afløbsrør. ABS",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"440.853",C3:"255.257",C4:"-",D:"-14.943"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/9fcc1331-0b4f-4c52-a5fc-e42d25c601dd?version=20.19.120"},subType:"Generisk data"},{id:"96c43b8d-9881-444f-9416-e8f1f1cf09d8",name:"Rør. Brugsvandsrør. PEX",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"410.333",C3:"376.848",C4:"-",D:"-170.559"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/9d623359-570b-40ca-8875-60dea3687846?version=20.19.120"},subType:"Generisk data"},{id:"e8191464-2d06-42dd-bfe0-962c6cf94f97",name:"Stålplade (0.3-3.0mm)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"242.761",C3:"-",C4:"#G0122",D:"#G0122"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/9cbdbafe-8377-46ca-a640-8e3c8fc518c0?version=20.19.120"},subType:"Generisk data"},{id:"6779efce-7bce-4fca-a739-38cace099941",name:"Gulvvarmesystem inkl. isolering. Kobber (100 mm afstand)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"223.208",C3:"317.258",C4:"-",D:"-679.116"}},conversions:{kg:{to:"kg",value:"5.7"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/99bbfb89-cbca-448d-a991-7cc302a97d4a?version=20.19.120"},subType:"Generisk data"},{id:"f68a2430-cbc5-407a-86bb-26b957149505",name:"Kølemiddel (R410a)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"806.324",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/988bb7c3-0a15-4626-a6c0-0883d4ff33dd?version=20.19.120"},subType:"Generisk data"},{id:"120cc3f5-09ca-4178-b48f-8aa6287039b1",name:"Ammoniak (R717)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"249.446",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/98482ce0-df9d-4ffd-8d52-43f468022595?version=20.19.120"},subType:"Generisk data"},{id:"0e8b7ad6-ee4b-46d8-bffc-01dde2f44897",name:"Overflade. Opløsningsmiddelbaseret lak. hvid",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"295.014",C3:"0.68517",C4:"-",D:"-0.192736"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/95c6760d-1605-430b-8216-825f6c0ac409?version=20.19.120"},subType:"Generisk data"},{id:"b73d4be2-a2b1-4605-a3a9-a9695e07bd82",name:"Fiberdug. PE / PP",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"126.052",C3:"188.424",C4:"-",D:"-0.852793"}},conversions:{kg:{to:"kg",value:"0.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/95a4f4b3-b354-4e2c-9046-0a36175cd768?version=20.19.120"},subType:"Generisk data"},{id:"7857a3ef-849c-439e-8230-9720d991fa81",name:"Overflade. Facademaling. grunder. silikat",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.900033",C3:"-",C4:"0.0150055",D:"-0.010823"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0b488798-140f-4efa-96e2-55aa46ed129a?version=20.19.120"},subType:"Generisk data"},{id:"95ee9c70-abe7-496f-9697-2d3c638d2f32",name:"Rør. polypropylen (PP)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"261.984",C3:"322.333",C4:"-",D:"-146.545"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/94355965-8d24-4e78-a910-9f35b8ae1193?version=20.19.120"},subType:"Generisk data"},{id:"d752ce13-d6da-4ab5-a261-a38a2e36cb41",name:"Stålplade (20 mikrometer galvaniseret)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"267.628",C3:"-",C4:"#G0122",D:"#G0122"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/93edef71-49e3-4e1f-ba6d-1e449e7d328d?version=20.19.120"},subType:"Generisk data"},{id:"d06667c5-37d9-476e-859d-076930ef5b3e",name:"Aluminium. plade og profil. Genanvendelse",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"-",C4:"0.00068207",D:"-826.778"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/93eb05bd-e607-46de-8d7b-e0727f8d2400?version=20.19.120"},subType:"Generisk data"},{id:"ba5746b3-7abe-49ae-bead-ed793ee3a54e",name:"Overflade. metalcoating (vandbaseret)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"209.554",C3:"0.248242",C4:"-",D:"-0.0698668"}},conversions:{kg:{to:"kg",value:"0.29"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/93eac197-0003-41ea-b81f-e517dd3389fb?version=20.19.120"},subType:"Generisk data"},{id:"6d4527b8-d60f-4547-9344-fa7479fb76a1",name:"Skorsten stål (enkelt væg)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"402.074",C3:"0.000818484",C4:"-",D:"-127.358"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/93a3f055-f26f-4702-a917-2951ca81cd21?version=20.19.120"},subType:"Generisk data"},{id:"bebbfc7f-251f-4eab-8ae4-6ec4a4674401",name:"Vinduesramme. plast",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"924.199",C3:"482.076",C4:"-",D:"-342.906"}},conversions:{kg:{to:"kg",value:"3.1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/91ea177a-e65a-4fe2-ac2d-2f378a03e168?version=20.19.120"},subType:"Generisk data"},{id:"52483dc8-2ba0-4f79-aa9b-e29cc023acbd",name:"mineraluld. stenuld. teknisk pladeisolering",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"196.032",C3:"0.0163697",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"146.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/908c07fa-6fba-42e4-a91e-d771444309eb?version=20.19.120"},subType:"Generisk data"},{id:"f19aeb46-790f-47bf-b6f1-015708dd1ef0",name:"Porebeton 380 kg/m³",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"182.392",C3:"25.558",C4:"-",D:"-0.780513"}},conversions:{kg:{to:"kg",value:"380"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/906b4864-0511-480f-a8bc-7b8302efbf0b?version=20.19.120"},subType:"Generisk data"},{id:"8cc610e5-0b4b-408b-9ccc-32728d713d7a",name:"Folie. PE-HD med PP-fiberdug",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"321.161",C3:"484.274",C4:"-",D:"-219.178"}},conversions:{kg:{to:"kg",value:"1.3"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/900336a3-b5f9-4c40-91a9-f9551f84ac64?version=20.19.120"},subType:"Generisk data"},{id:"c33133b9-103f-4eea-842f-29a88e67557d",name:"Pimpsten. grus",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.00871442",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8de12467-96a0-459e-9f97-90e95fb7b23f?version=20.19.120"},subType:"Generisk data"},{id:"968779d0-95d8-4d8b-9357-37bb55ab8acb",name:"Curtain wall facade med 3-lags ruder. aluminium",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"121.145",C3:"620.355",C4:"0.420155",D:"-370.598"}},conversions:{kg:{to:"kg",value:"16.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8d6eba49-1c20-444a-8b34-0b6b47379618?version=20.19.120"},subType:"Generisk data"},{id:"2434092f-a7ab-4c27-860c-d6c893850b88",name:"Solcelleanlæg 1000 kWh / m2*a",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"296.686",C3:"-",C4:"121.364",D:"-362.013"}},conversions:{kg:{to:"kg",value:"9"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8cfea619-e284-4b6f-a281-46e362a868c4?version=20.19.120"},subType:"Generisk data"},{id:"18ed23d9-9d30-489b-805f-3709a3dd13cf",name:"HPL- plade",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-385.54",C3:"1978.67",C4:"-",D:"121.285"}},conversions:{kg:{to:"kg",value:"1400"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8cf90240-cbdd-4415-93a8-9c56da22f111?version=20.19.120"},subType:"Generisk data"},{id:"a7ff0957-1dcc-4766-bab1-00da613594e3",name:"Træ. gran (12% fugt / 10.7% H2O)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-693.836",C3:"876.037",C4:"-",D:"-238.748"}},conversions:{kg:{to:"kg",value:"481.6"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3057d7c0-7bee-4ba2-9edf-517d4cd97a14?version=20.19.120"},subType:"Generisk data"},{id:"9c871c59-3d99-4af9-a933-75357af77a33",name:"Lerpuds",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"931.477",C3:"280.641",C4:"-",D:"-389.165"}},conversions:{kg:{to:"kg",value:"900"}},source:{url:"https://oekobaudat.de/OEKOBAU.DAT/datasetdetail/process.xhtml?uuid=8be785fa-5548-4ea5-a2d7-b962675b9eff&version=20.19.120&stock=OBD_2021_II&lang=de"},subType:"Generisk data"},{id:"2d7ce1e8-33d5-4b32-80ec-e6ae80134040",name:"Vinduesprofil. karm. alu. pulverlak.",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"130.541",C3:"-",C4:"#G0500",D:"#G0500"}},conversions:{kg:{to:"kg",value:"1.02"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8b3ee4e2-c086-41dc-bd07-e9e853f9da8b?version=20.19.120"},subType:"Generisk data"},{id:"8dc49987-91d3-4f27-b6eb-813cc7c8112f",name:"Kondenserende gaskedel <20 kW (væg enhed)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"243.628",C3:"705.425",C4:"0.512009",D:"-593.075"}},conversions:{kg:{to:"kg",value:"43"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8acef115-85c0-45f8-9999-9d3b87692fa7?version=20.19.120"},subType:"Generisk data"},{id:"612baa78-7cae-4609-8e79-8ee253d48283",name:"Stålplade. rustfri",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"342.727",C3:"-",C4:"#G0763",D:"#G0763"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/88559403-7658-48f2-bac9-7986b4d0f4c2?version=20.19.120"},subType:"Generisk data"},{id:"51f4d29a-7be7-42c2-ad33-03a4b2589d72",name:"Plast profil CR (chloropren gummi)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"635.686",C3:"356.146",C4:"-",D:"-152.255"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/884efbb3-7be6-4e4d-9726-c39c1b781436?version=20.19.120"},subType:"Generisk data"},{id:"379d9721-8c45-4996-ba09-40eeb8ac666f",name:"Stålrør. gevindrør",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"251.374",C3:"0.00150055",C4:"-",D:"-155.923"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8622539c-592c-45b0-9a4b-e5f8b4fea367?version=20.19.120"},subType:"Generisk data"},{id:"270d869c-0187-4ff9-9c11-355967d30a99",name:"Asfalt. bærelag",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0711519",C3:"0",C4:"-",D:"-0.0263052"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/85de02e5-2782-4050-9c01-c5de3849fbce?version=20.19.120"},subType:"Generisk data"},{id:"a76d9d77-7cf2-4ef2-8972-7c2a5d4786c2",name:"Grunder. silikat dispersion",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.579701",C3:"-",C4:"0.0163697",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/85c41389-d62e-4dff-a819-896b35367cbc?version=20.19.120"},subType:"Generisk data"},{id:"60a197fe-d1c0-450c-b6a3-ab32ae063fef",name:"Overflade. Parket lak (primer til træ; fortyndet med vand)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"181.695",C3:"0.912953",C4:"-",D:"-0.256981"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/859897ae-5ea2-4b55-9508-49297dd6ba6c?version=20.19.120"},subType:"Generisk data"},{id:"1375e9a8-4d66-420e-bd95-d2ef53463b9d",name:"LPG tank 4850 l / 2.1 t (underjordisk)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"3084.11",C3:"781.327",C4:"-",D:"-1735.34"}},conversions:{kg:{to:"kg",value:"1116.7"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8595cc43-c24f-4002-8d2b-c9386de7fae4?version=20.19.120"},subType:"Generisk data"},{id:"dfccf021-7639-4500-beb6-c1f31a788955",name:"Polybutadiene rør (PB)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"410.241",C3:"322.333",C4:"-",D:"-146.545"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/83a21998-b507-429e-bbe3-b5629e601138?version=20.19.120"},subType:"Generisk data"},{id:"29afd4a6-cb07-4631-b0e5-a3891b38604b",name:"Anhydrit mix",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0892567",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/839771be-ab23-4873-8b14-b2aa0f6ce9d9?version=20.19.120"},subType:"Generisk data"},{id:"5f37845d-13cd-4d2c-95bd-3670b2f81b23",name:"Perlite 0-1 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.522459",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/82c7e263-3026-45f8-aec7-ebdf818464e4?version=20.19.120"},subType:"Generisk data"},{id:"3df49b1c-f450-4d7f-bfad-d44b4049c50a",name:"Tagsten. tegl",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"158.784",C3:"0.30266",C4:"-",D:"-0.0924292"}},conversions:{kg:{to:"kg",value:"45"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/826fa2c2-c691-4844-83d3-aea0e8a54bcd?version=20.19.120"},subType:"Generisk data"},{id:"9f5b4a83-529c-41ba-af89-b87bd6a9b876",name:"Pimpsten 0-4 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.00869385",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/81a76ff5-8928-4f71-8e1f-c7c78b7e5a95?version=20.19.120"},subType:"Generisk data"},{id:"ad4518f3-e398-4959-a475-7068e7d07e1b",name:"Overflade. Facademaling. silikoneharpiks",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"125.633",C3:"0",C4:"0.0150055",D:"-0.00967088"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/815fb8f6-04cc-494d-ab6b-1b6eae98bfca?version=20.19.120"},subType:"Generisk data"},{id:"f79dce98-f816-42f5-935c-934764117bdc",name:"Træ. ceder",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-809.968",C3:"1037.52",C4:"-",D:"-282.581"}},conversions:{kg:{to:"kg",value:"571"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d7073560-4c4b-4cb0-b6bf-a902950c5109?version=20.19.120"},subType:"Generisk data"},{id:"7368a126-12db-4e71-8c15-1e97a682c714",name:"Gummigulve med skumbagside EN 1816",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"13.22",C3:"109.893",C4:"-",D:"-647.756"}},conversions:{kg:{to:"kg",value:"3.82"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7d8cb95b-99c2-4824-97a0-55d2fca5cedd?version=20.19.120"},subType:"Generisk data"},{id:"6295bb48-624a-4a91-932b-f945c8dad89a",name:"Varmepumpe. vand-vand. 10 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"284.922",C3:"522.458",C4:"0.0300174",D:"-173.463"}},conversions:{kg:{to:"kg",value:"104.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7d027677-b2e3-40dd-a4b1-91bd8f7383d5?version=20.19.120"},subType:"Generisk data"},{id:"fee1bb2b-48b1-44d5-8be4-9848056a7712",name:"Varmepumpe (luft-vand) 10 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"458.991",C3:"300.855",C4:"428.176",D:"-241.521"}},conversions:{kg:{to:"kg",value:"134"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7c0455a7-fc89-4c3c-8225-d528e4375662?version=20.19.120"},subType:"Generisk data"},{id:"813d6654-9925-44d3-afb9-04fbddc2b447",name:"Overflade. Kalkmaling",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.924854",C3:"-",C4:"0.0163697",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7baed44c-c80b-4340-b3af-f01d71fbbb43?version=20.19.120"},subType:"Generisk data"},{id:"247479d8-c365-45b3-aa77-e4d8e7dd025b",name:"Gummitætning",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"36.402",C3:"303.476",C4:"-",D:"-140.543"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7a4d3393-a33a-47c8-b42f-42d8ec6a90f6?version=20.19.120"},subType:"Generisk data"},{id:"62d0630e-3c62-45bc-beec-dd18a65d6a21",name:"Rør. Kloakrør PP",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"261.984",C3:"345.444",C4:"-",D:"-170.559"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/795b4798-b745-4189-a2b8-5d5f37d8d490?version=20.19.120"},subType:"Generisk data"},{id:"7491b1bd-3055-4b28-9974-8b17c057acae",name:"Plastplade. transparent. PmmA støbte",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"6291.42",C3:"2889.91",C4:"-",D:"-1139.6"}},conversions:{kg:{to:"kg",value:"1190"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/795ab193-fc50-463d-a5f8-e37d5336ee78?version=20.19.120"},subType:"Generisk data"},{id:"5cff71f6-cadb-4ce4-b77a-cf0266d7a263",name:"Naturstenplade. blød. facade",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"16.231",C3:"0.699482",C4:"-",D:"-0.213614"}},conversions:{kg:{to:"kg",value:"104"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/79075297-4dc0-42c6-bc90-e3bf9fa0fb4c?version=20.19.120"},subType:"Generisk data"},{id:"e5af6165-5402-4124-a43d-81b117bccd6d",name:"Rør til el-varmepumpe (lodret jordvarme. saltvand). probe. 70 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1804.28",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1843.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d61e346a-1490-4ac6-adf5-3e9323f5b967?version=20.19.120"},subType:"Generisk data"},{id:"95113356-2a02-470e-85e8-4e02a30f2156",name:"mørtel. fliseklæber",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.347032",C3:"-",C4:"0.0163697",D:"-0.00285525"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/78b7cd15-d82a-4ffa-ae08-870b6e5d35d4?version=20.19.120"},subType:"Generisk data"},{id:"57da24fb-771f-44d9-92b2-bc99f0aae41b",name:"Aluminiumsfolie (d=0.1 mm)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"311.981",C3:"-",C4:"#G0500",D:"#G0500"}},conversions:{kg:{to:"kg",value:"0.28"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/785d5ac4-c69d-4e00-941e-26433c1d023d?version=20.19.120"},subType:"Generisk data"},{id:"f3cd151d-60f7-4930-84f8-c3aa89be966e",name:"Træbetonplade",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-293.699",C3:"317.455",C4:"-",D:"-113.794"}},conversions:{kg:{to:"kg",value:"360"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/76d3f78a-8743-49fe-b4a1-f43b819cb930?version=20.19.120"},subType:"Generisk data"},{id:"f9f84d33-268d-4933-a83e-8d4ff7b99281",name:"Plastprofil. silikone",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"685.795",C3:"10.128",C4:"-",D:"-0.468477"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/763abb33-ad4f-44fa-bc49-8c483e67b2b1?version=20.19.120"},subType:"Generisk data"},{id:"dd18586d-8bf4-4bee-b854-bfd125c941a6",name:"Polyurethanskum (rørisolering)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"200.718",C3:"273.128",C4:"-",D:"-126.489"}},conversions:{kg:{to:"kg",value:"30"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/75ce5bab-4506-4f7e-8c20-a638a98b7537?version=20.19.120"},subType:"Generisk data"},{id:"06d93c55-03cb-4035-ba99-b5a62a3066d5",name:"Nylonstøbning (PA 6.6)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"106.619",C3:"287.643",C4:"-",D:"-108.716"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7511c948-c441-42fb-9ff1-cfdc54e58d7e?version=20.19.120"},subType:"Generisk data"},{id:"183a8002-ee96-4d1d-93a7-293b4df8cad6",name:"Grus. 2-15 mm. tørret",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0342735",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7502766c-df2f-4f8d-8d45-17bb6938eac8?version=20.19.120"},subType:"Generisk data"},{id:"6a62b2e0-9f74-4157-b901-83631d19e6c4",name:"Beslag til lodrette skydevinduer",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"11.591",C3:"-",C4:"#G0763",D:"#G0763"}},conversions:{kg:{to:"kg",value:"0.93"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/72c69944-5250-4269-ad34-2e20e5e38231?version=20.19.120"},subType:"Generisk data"},{id:"59fae312-e45b-46e4-af75-a82e3ff47531",name:"Puds. kalk-gips. inde",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"198.85",C3:"-",C4:"13.505",D:"-"}},conversions:{kg:{to:"kg",value:"900"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/70f6e305-e46f-4719-a94f-70267b936029?version=20.19.120"},subType:"Generisk data"},{id:"1de7a32d-314f-4f35-91e8-e6faa4d38497",name:"melamin-skum",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"65.813",C3:"143.404",C4:"-",D:"-0.663676"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7082b2c3-5203-40ba-a6f8-d16edba60f5f?version=20.19.120"},subType:"Generisk data"},{id:"fc8cd470-17bc-4816-98e1-6abd6593b1cd",name:"Polystyren granulat (cementbundet)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"160.083",C3:"103.432",C4:"-",D:"-433.217"}},conversions:{kg:{to:"kg",value:"350"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/704177f4-78cd-47a3-b71c-07899df86615?version=20.19.120"},subType:"Generisk data"},{id:"0ce6b695-054d-4033-8501-4084999ea63a",name:"Polycarbonatplade",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"593.594",C3:"332.856",C4:"-",D:"-114.044"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6fc1267a-1f4d-4244-a65e-df8a0a3ccc50?version=20.19.120"},subType:"Generisk data"},{id:"ef595daa-7b37-41dc-adf4-f538fcd44ae7",name:"Gulvvarmesystem inkl. isolering. PP (100 mm afstand)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"613.759",C3:"668.108",C4:"-",D:"-278.435"}},conversions:{kg:{to:"kg",value:"1.9"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6f4a3a08-50d7-45e0-a4f8-e34f1bc6430e?version=20.19.120"},subType:"Generisk data"},{id:"2d635d00-cd3d-46ed-8229-db591390c915",name:"Ventilationsaggregat m. varmegenvinding 10 000 m3 / h",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2815.96",C3:"347.325",C4:"0.270427",D:"-1717.02"}},conversions:{kg:{to:"kg",value:"703.94"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6e62f780-792b-406b-84a0-6beac88d1245?version=20.19.120"},subType:"Generisk data"},{id:"b52c97fb-7221-4de3-86a9-2286965f0228",name:"LPG tank 2700 l / 1.2 t (underjordisk)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2135.85",C3:"542.252",C4:"-",D:"-1202.05"}},conversions:{kg:{to:"kg",value:"773.33"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6e520eb3-0b5e-4c7a-b702-244f93faff73?version=20.19.120"},subType:"Generisk data"},{id:"f110eb1e-656e-447c-a7a0-f9b9b731af7c",name:"Bindelag",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0778388",C3:"0",C4:"-",D:"-0.0263052"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6b6b68f8-34a4-4a0f-97ee-714bf106c3e0?version=20.19.120"},subType:"Generisk data"},{id:"587f4c33-628b-49de-b591-80879c096300",name:"Vinduesramme. pulverlakeret aluminium",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"125.422",C3:"-",C4:"#G0500",D:"#G0500"}},conversions:{kg:{to:"kg",value:"0.98"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/66990642-726e-4483-abc3-d5d0b4d7a5e7?version=20.19.120"},subType:"Generisk data"},{id:"fa7703c4-1914-4c88-80f6-1ca5be9db4fa",name:"EPDm-tætning til aluminiumsprofil",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"0.578307",C3:"0.564894",C4:"0.564566",D:"-0.610451"}},conversions:{kg:{to:"kg",value:"0.18"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/66094ad5-51d6-45c4-b2e3-451220520cab?version=20.19.120"},subType:"Generisk data"},{id:"31678e00-c120-4a75-aeca-a02fce22c1ff",name:"Skortsten polypropylen (PP)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"250.046",C3:"273.128",C4:"-",D:"-126.489"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/65ed50b4-0fd3-45b2-8ccd-990908939d46?version=20.19.120"},subType:"Generisk data"},{id:"e747e433-d091-4d1b-94c9-2cf34f0e9266",name:"Polyethylen-skum",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"305.545",C3:"398.495",C4:"-",D:"-180.361"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/65af52ac-382b-4069-aafe-b044b3960356?version=20.19.120"},subType:"Generisk data"},{id:"3cc9e12a-d916-48c4-9b47-5803b235176b",name:"Regnvandsrør. støbejern",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.722883",C3:"-",C4:"#G0204",D:"#G0204"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/64e16249-8051-483b-968e-46008a43ef18?version=20.19.120"},subType:"Generisk data"},{id:"da808d1e-dec3-43f9-bd8d-ad20477765cb",name:"Kalciumsilikatplade",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"550.399",C3:"165.087",C4:"-",D:"-0.462146"}},conversions:{kg:{to:"kg",value:"225"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6405878c-ed34-4bee-b100-5208a3212ec6?version=20.19.120"},subType:"Generisk data"},{id:"da75982d-6e84-4a42-b5b8-1794f653e143",name:"Sand 0-2 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.00285398",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/61655387-edd4-4800-ba3e-67bc15f2f096?version=20.19.120"},subType:"Generisk data"},{id:"5bf05389-684f-4464-87db-d56a7c6701aa",name:"Spånplade",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-873.594",C3:"1268.47",C4:"-",D:"-293.429"}},conversions:{kg:{to:"kg",value:"700"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/60e8b384-adf2-4c3b-b3da-e407df106cf5?version=20.19.120"},subType:"Generisk data"},{id:"040c6f7a-620d-43da-9bb4-767b7c15f48d",name:"Solvarmekollektor. plan",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"104.039",C3:"117.626",C4:"-",D:"-572.425"}},conversions:{kg:{to:"kg",value:"18.27"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/60e0575b-6cb4-4ba4-a9f0-78d8fb65c9a9?version=20.19.120"},subType:"Generisk data"},{id:"ce08e4d9-b602-4346-af14-3a3de95368f9",name:"Lersten",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"936.405",C3:"40.537",C4:"-",D:"-176.256"}},conversions:{kg:{to:"kg",value:"1200"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/606d978a-c44a-4b3e-8387-b1291b12e522?version=20.19.120"},subType:"Generisk data"},{id:"f1610791-141c-47ef-80cd-9fffe71787e8",name:"mineraluld. løsfyld",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"640.233",C3:"124.651",C4:"0.690596",D:"-"}},conversions:{kg:{to:"kg",value:"50"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/601af947-1f14-474d-8233-780715a12268?version=20.19.120"},subType:"Generisk data"},{id:"5c86c1b1-b653-4626-b518-ed17940a5939",name:"Hampfiberdug",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"191.569",C3:"861.825",C4:"-",D:"-120.031"}},conversions:{kg:{to:"kg",value:"38"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5ef0c519-f5b2-4d45-809d-5f417f90e90b?version=20.19.120"},subType:"Generisk data"},{id:"7cb6df86-a59d-463a-b78f-3cbb2e812a18",name:"Vindueskarm. plast",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"825.055",C3:"391.687",C4:"-",D:"-322.888"}},conversions:{kg:{to:"kg",value:"2.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5e90e94d-6e79-4d9f-854c-fb33f15c033e?version=20.19.120"},subType:"Generisk data"},{id:"2540e19c-da1b-4204-bae7-5c9bdfab1b04",name:"Gulvvarmesystem inkl. isolering. Kobber (200 mm afstand)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"12.979",C3:"316.865",C4:"-",D:"-405.503"}},conversions:{kg:{to:"kg",value:"3.3"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5dad78e0-234c-49d0-93aa-a06c6efee60f?version=20.19.120"},subType:"Generisk data"},{id:"77106f7d-2e9c-47ff-ae4c-6318abf1fdd8",name:"Gipspulver. Alpha-halvhydrat",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.261835",C3:"-",C4:"0.0163697",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5ce375b1-eb6d-4fc7-84bb-11ae702d3056?version=20.19.120"},subType:"Generisk data"},{id:"5d8c5d8a-ac88-47ad-bea4-1b56f7e77b57",name:"mineraluld. stenuld. rørskål",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"317.952",C3:"0.0163697",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"151"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5c1776a7-de57-4b4d-87fc-933f52fddd6e?version=20.19.120"},subType:"Generisk data"},{id:"db7d7415-8f11-499a-ba1f-221ecec9d944",name:"Støbeasfalt",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.11688",C3:"0",C4:"0.0793276",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ad94ce55-af1d-4da0-963c-bf263aaa37ee?version=20.19.120"},subType:"Generisk data"},{id:"4b5951ed-4445-4e57-abca-2725d9165439",name:"Bitumenklæber",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.61328",C3:"0",C4:"0.0859383",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5ae00c4e-1b1c-4374-9864-2aee735a0563?version=20.19.120"},subType:"Generisk data"},{id:"9346f5f7-6f87-4ca7-b0a7-43069d45a342",name:"Plastplade. transparent. PVC",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"3996.11",C3:"4010",C4:"-",D:"-814.07"}},conversions:{kg:{to:"kg",value:"1220"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5a88b96e-23d0-4656-9ee2-fc271c89c95b?version=20.19.120"},subType:"Generisk data"},{id:"11407d68-fb6e-4503-b6a9-34386c7efc4a",name:"Betonrør. armeret",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.141743",C3:"0.00721909",C4:"-",D:"-0.00202091"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5a1cbf92-ed39-4e8c-bd01-5463bffb3c9d?version=20.19.120"},subType:"Generisk data"},{id:"a808d60b-1942-4633-b4f6-9ea1b15ef8ff",name:"Ler. stampet ler",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"934.931",C3:"675.616",C4:"-",D:"-293.761"}},conversions:{kg:{to:"kg",value:"2000"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/59622fc0-d719-43bf-a16b-ae924ae0d276?version=20.19.120"},subType:"Generisk data"},{id:"88714b5b-de56-44ab-a6d3-1ddcd4a0275d",name:"Porebeton granulat",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"528.468",C3:"269.031",C4:"-",D:"-0.821592"}},conversions:{kg:{to:"kg",value:"400"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/57a87943-dbdd-4221-bbd2-481b8fcd1d2b?version=20.19.120"},subType:"Generisk data"},{id:"bd422805-b3eb-4452-bbd8-b54ac3a63a65",name:"Solafskærmning. polyethylenterephthalat (PET)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"4.194",C3:"110.342",C4:"-",D:"-0.335872"}},conversions:{kg:{to:"kg",value:"0.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5662c927-cd47-46e5-b753-925db31b9870?version=20.19.120"},subType:"Generisk data"},{id:"5dc1dd34-17ca-4caa-8a93-270097f607de",name:"Solafskærmning. aluminiumslameller",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"236.353",C3:"-",C4:"#G0500",D:"#G0500"}},conversions:{kg:{to:"kg",value:"2.391"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/563350f7-fb56-4363-b86a-690227dd450e?version=20.19.120"},subType:"Generisk data"},{id:"059d0d79-7a2f-4894-9327-0e330c65779c",name:"mørtel. armeringsmørtel. kunstharpiks spartelmasse",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.476923",C3:"0",C4:"0.0163697",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/55a89d7b-b585-404f-be34-bb7285730a89?version=20.19.120"},subType:"Generisk data"},{id:"f9a5ef25-5f6b-432c-b080-4678144a3103",name:"Rustfri stål. genanvendelse",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"-",C4:"0.00068207",D:"-266.377"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/55945019-018a-46da-baae-a3ee62d59cf3?version=20.19.120"},subType:"Generisk data"},{id:"de7ce158-8b03-4ef3-bc60-0420db431584",name:"Affald. træ. forbrænding fjernvarme",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"182.315",C4:"-",D:"-0.685639"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/553d7a7a-bf66-4a69-b1ae-6cf15e396935?version=20.19.120"},subType:"Generisk data"},{id:"135c5f45-f388-49c2-9780-a8af84a6a3e1",name:"Stål. varmvalset plade. 2-20 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"267.628",C3:"-",C4:"#G0122",D:"#G0122"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/531ab34f-6750-41a8-aedc-35cf4df3c8b1?version=20.19.120"},subType:"Generisk data"},{id:"1ceafb89-5c07-49a8-9d57-0ce48563bf7e",name:"Stål. Varmgalvaniseret stålplade",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"163.885",C3:"-",C4:"#G0122",D:"#G0122"}},conversions:{kg:{to:"kg",value:"5.72"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/50c9e674-afd9-456c-9440-6506bec6d55b?version=20.19.120"},subType:"Generisk data"},{id:"d4964645-01bc-498d-81e4-d562aeae5204",name:"Kalkcementmørtel",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"202.003",C3:"-",C4:"294.654",D:"-"}},conversions:{kg:{to:"kg",value:"1800"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/50180064-236e-4e52-9a1e-f172dde80844?version=20.19.120"},subType:"Generisk data"},{id:"b8a166f0-3ea1-4aea-a354-3cdb1230cee0",name:"Oliekedel. lav temperatur. 120-400 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"3035.05",C3:"536.451",C4:"180.285",D:"-626.817"}},conversions:{kg:{to:"kg",value:"992"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4e5198e4-4eea-4550-8853-b76a6d6f9f05?version=20.19.120"},subType:"Generisk data"},{id:"5d74de19-2388-4457-8edf-c82a0911496b",name:"Brugsvandsrør. rustfast stål",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"355.922",C3:"-",C4:"#G0763",D:"#G0763"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4d37d8f4-13db-418d-820d-5cf08f050eff?version=20.19.120"},subType:"Generisk data"},{id:"0b1289c2-ae39-4576-b374-a191ae942694",name:"Vandvarmer. el. gennemstrøm. 21 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"147.374",C3:"492.449",C4:"-",D:"-693.214"}},conversions:{kg:{to:"kg",value:"3.95"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4ce46be9-2f9c-4686-aa21-7ebf34783674?version=20.19.120"},subType:"Generisk data"},{id:"4d9cf76a-821f-4a60-b6fb-8233675be8fb",name:"Brugsvandsrør. Alu-PEX",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"762.125",C3:"188.424",C4:"-",D:"-479.765"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4c33a250-3979-4e5f-9a7c-0d351085da22?version=20.19.120"},subType:"Generisk data"},{id:"75f8a981-fc14-4eb1-8210-4ece3564d86a",name:"Vinduesbeslag. aluminium",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"873.468",C3:"-",C4:"#G0763",D:"#G0763"}},conversions:{kg:{to:"kg",value:"1.014"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4bf26663-9018-47a1-943d-8ed4d3f87d0f?version=20.19.120"},subType:"Generisk data"},{id:"888faeac-1ce2-4fc2-8626-0046b1969cfe",name:"Dampspærre PA",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.707438",C3:"0.219924",C4:"-",D:"-0.0874466"}},conversions:{kg:{to:"kg",value:"0.08"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4bb6f0f6-178c-41e0-8700-bd597f23ccb8?version=20.19.120"},subType:"Generisk data"},{id:"191ba89d-7286-4035-a3a8-b5c5176f1665",name:"Oparbejdning af byggeaffald",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"0.002663",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4a937f66-c9c2-402b-9a00-83767031bfa7?version=20.19.120"},subType:"Generisk data"},{id:"86cefc59-6467-4917-9c41-dc88dc4e1fc6",name:"Puds. syntetisk harpiks",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"1201.64",C3:"-",C4:"255.094",D:"-"}},conversions:{kg:{to:"kg",value:"1700"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4a7c30d1-37d7-47e2-8271-dbb3bee91560?version=20.19.120"},subType:"Generisk data"},{id:"d43f0caa-6d3a-4b9a-98ef-83a0256eba98",name:"Varmepumpe (luft-vand) 14kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"642.587",C3:"421.198",C4:"599.447",D:"-338.129"}},conversions:{kg:{to:"kg",value:"187.6"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4a08f220-1c52-453c-bf8f-f209586e96c8?version=20.19.120"},subType:"Generisk data"},{id:"5741339f-e388-4699-af21-a7ae4ad4f0b5",name:"Pillefyr. 20-120 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2329.17",C3:"329.897",C4:"180.285",D:"-1021.95"}},conversions:{kg:{to:"kg",value:"833"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/49660117-13cd-4475-a66b-a13801723a37?version=20.19.120"},subType:"Generisk data"},{id:"4dfc855e-49bd-4ef6-aee7-cd420891bf48",name:"Rulletrappe (grundkomponenter pr. trappe)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"12715.1",C3:"105.496",C4:"488.271",D:"-5674.33"}},conversions:{kg:{to:"kg",value:"4076"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/493df9d1-493c-4820-8bbf-8f1a5f1aec5e?version=20.19.120"},subType:"Generisk data"},{id:"b5656347-b96a-41eb-8693-7e667972caaa",name:"Brugsvandsrør. PEX-Alu-PEX",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"779.468",C3:"30.242",C4:"-",D:"-292.695"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/47165a1f-51e3-4612-b076-facd01e3b236?version=20.19.120"},subType:"Generisk data"},{id:"ef4df72f-6513-42a9-9e6a-c274ccbee121",name:"Brugsvandsrør. PB",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"399.847",C3:"390.707",C4:"-",D:"-162.827"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/45db3c26-a316-4ba7-ade5-6adc43c71118?version=20.19.120"},subType:"Generisk data"},{id:"2348a19e-1e18-4627-ba22-0d4d1b989fb6",name:"Træprodukter. affaldsforbrænding",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"180.183",C4:"-",D:"-0.523199"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/44e4bf51-8e23-47e3-8f5e-5243525bb32e?version=20.19.120"},subType:"Generisk data"},{id:"9cedd018-6fbc-4ea3-b24c-e1a475cbe746",name:"Perlite 0-3 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.558289",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/44c57da1-24ce-488d-b4f9-283fa603cc9d?version=20.19.120"},subType:"Generisk data"},{id:"988cb65f-d066-4b75-bba9-59a21589f617",name:"Lithiumbromid",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"808.139",C3:"-",C4:"923.499",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/446ba42f-701c-4bf5-84cb-9b0963860182?version=20.19.120"},subType:"Generisk data"},{id:"340fbc9d-bcfb-4d60-b970-334e82ba0591",name:"LPG tank 6400 l / 2.9 t (underjordisk)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"3839.02",C3:"973.728",C4:"-",D:"-2159.91"}},conversions:{kg:{to:"kg",value:"1390"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4411ce80-6a9a-4088-94bb-426805d99bfc?version=20.19.120"},subType:"Generisk data"},{id:"625d1c63-2cf5-4c31-8ed7-194d146201ef",name:"XPS isolering",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"963.403",C3:"118.208",C4:"-",D:"-495.105"}},conversions:{kg:{to:"kg",value:"32"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/43e99b8c-90d8-4fcd-90ce-342fb0b7366e?version=20.19.120"},subType:"Generisk data"},{id:"7b67e3fd-3c3a-4d5c-a738-9d6ea83723c4",name:"Lim til gipsplader",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.103165",C3:"-",C4:"0.0150055",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/43c3fd78-c67e-438b-b726-dd512df5d881?version=20.19.120"},subType:"Generisk data"},{id:"97dfd1a5-1a00-47ec-ae74-e28e632845ba",name:"Plastplade. transparent. PmmA ekstruderet",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"5756.79",C3:"2889.91",C4:"-",D:"-1139.6"}},conversions:{kg:{to:"kg",value:"1190"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/41b8a86d-5d44-49fb-a9b8-de2a9041f1fd?version=20.19.120"},subType:"Generisk data"},{id:"b16e3db7-ee41-4bd3-af8e-f3483edd832a",name:"Vindueskarm. træ",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"-0.369776",C3:"403.683",C4:"-",D:"-162.212"}},conversions:{kg:{to:"kg",value:"2.11"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4127e60a-3c42-4076-83f5-5232b4ed642e?version=20.19.120"},subType:"Generisk data"},{id:"ecc541e5-6e8a-4232-bceb-a48f9bf7caec",name:"Ler pulver",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.349057",C3:"0.00337808",C4:"-",D:"-0.0014688"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3d9f0293-304f-4731-8136-326cebf8b1f0?version=20.19.120"},subType:"Generisk data"},{id:"cbdf2b4f-4869-4952-9129-75fadf8735b5",name:"Skorsten opmuret (2 rør)",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"474.265",C3:"320.127",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"195.6"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3d6c39b1-98ef-472d-95e3-c0b49d4109c6?version=20.19.120"},subType:"Generisk data"},{id:"83e0b154-ab44-4c40-b9aa-aeee527eedef",name:"Rør til el-varmepumpe (lodret jordvarme. saltvand). collector. 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"726.23",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"282"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3d3873a9-16dd-4771-82be-f7b79bbd3f53?version=20.19.120"},subType:"Generisk data"},{id:"2def1bcc-93ce-43d6-8973-afea90a5c540",name:"Grus 2-32 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.00285398",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3ce61a4e-4d91-4b1d-b675-276be05b9225?version=20.19.120"},subType:"Generisk data"},{id:"c7315e1a-4f05-4333-bf7e-58e906e6dcb1",name:"Rulleskodder. PVC",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"234.651",C3:"120.519",C4:"-",D:"-100.487"}},conversions:{kg:{to:"kg",value:"6.24"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3ce53be7-a3e5-4757-b7f9-68a6ecf66eb9?version=20.19.120"},subType:"Generisk data"},{id:"0390b975-78bf-4359-b3cd-98cb7e33e6ae",name:"El-varmepumpe (lodret jordvarme. saltvand) 10 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"338.947",C3:"435.298",C4:"0.0300174",D:"-156.278"}},conversions:{kg:{to:"kg",value:"139"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3bf7183e-741e-4fb7-a32e-574e76e3e747?version=20.19.120"},subType:"Generisk data"},{id:"72d441cc-d024-4316-926c-b26a02dc20e6",name:"Grunder til silikonespuds",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.692053",C3:"-",C4:"0.0163697",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3a99d696-4911-45da-9f80-647ce214bca0?version=20.19.120"},subType:"Generisk data"},{id:"3b9fdfac-e621-40d4-8d7c-afb95658911d",name:"PVC gulvbelægning",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"8.191",C3:"108.467",C4:"-",D:"-220.199"}},conversions:{kg:{to:"kg",value:"3.3"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/39da14a3-8f39-4af9-955c-6a70f091acb8?version=20.19.120"},subType:"Generisk data"},{id:"ac8eaf35-1fda-478a-b82c-573d105bc374",name:"Læsket kalk. pulver",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"109.784",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/39bd1632-3f36-410c-86d9-cab27e91b1c5?version=20.19.120"},subType:"Generisk data"},{id:"8ee96207-9c43-48cf-95a3-7dd1311a1fb1",name:"Træfiberisoleringsplade (våd proces)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-182.182",C3:"334.691",C4:"-",D:"-886.621"}},conversions:{kg:{to:"kg",value:"160"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/393f494d-8738-4330-aa5e-1652bb29b574?version=20.19.120"},subType:"Generisk data"},{id:"342401b6-3d54-4eb1-b585-7d5fb9ebda13",name:"Vindueshåndtag",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"0.957379",C3:"0.251996",C4:"-",D:"-0.109308"}},conversions:{kg:{to:"kg",value:"0.1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/38ddefe2-e01c-4ece-9952-a353b7dfb246?version=20.19.120"},subType:"Generisk data"},{id:"4a57f963-9732-4459-b79f-3a72d54b48e6",name:"Gaskedel. kondenserende. 20-120 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1104.19",C3:"226.536",C4:"157.929",D:"-157.721"}},conversions:{kg:{to:"kg",value:"292"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/38053775-45d9-4649-8299-ec8a5a60cbd9?version=20.19.120"},subType:"Generisk data"},{id:"90d95eb6-d484-43f8-9b3a-52042f1453b2",name:"Stålprofil",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.994444",C3:"-",C4:"#G0204",D:"#G0204"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/38051c22-fbd1-4b0e-944a-ae348b8c7695?version=20.19.120"},subType:"Generisk data"},{id:"ea4f6dcc-8cb6-454a-8568-235b5f9310ca",name:"Kondenserende gaskedel 120-400 kW (standalone enhed)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"3422.37",C3:"161.496",C4:"180.285",D:"-1357.73"}},conversions:{kg:{to:"kg",value:"974"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/36d1bbf3-1e67-4a93-92f5-0321cc30018a?version=20.19.120"},subType:"Generisk data"},{id:"3849ed23-b2f0-44ee-a624-ee47ec1fb85e",name:"Overflade. Indendørsmaling. emulsions maling. slidstærk",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"262.123",C3:"-",C4:"0.0150055",D:"-0.010823"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/35be6146-5a80-4a9e-a32d-5d05c03a8d5c?version=20.19.120"},subType:"Generisk data"},{id:"d48d26e3-038e-4a2c-a8d6-90af4fd22f43",name:"Kalciumsulfat",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.107014",C3:"-",C4:"0.0150055",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/34d3bb5e-f241-45b4-b257-123281364d97?version=20.19.120"},subType:"Generisk data"},{id:"d2ab1811-8438-4ae5-8bb0-b6a057486ccc",name:"Varmepumpe. vand-vand. 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"284.32",C3:"522.458",C4:"0.0300174",D:"-173.463"}},conversions:{kg:{to:"kg",value:"104"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/34ad748d-a657-4d69-92ae-c53dd18a0094?version=20.19.120"},subType:"Generisk data"},{id:"d9be1941-b646-4303-9a5e-0768c07f0c83",name:"Lerrør. glaseret. DN 250",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"262.848",C3:"0.405381",C4:"-",D:"-0.104753"}},conversions:{kg:{to:"kg",value:"51"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/335c3c94-a981-4dbd-af2f-811e918f1b94?version=20.19.120"},subType:"Generisk data"},{id:"706069d7-bc34-4f96-bd22-f2eb0689af1a",name:"Vinduesramme. træ",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"-0.147349",C3:"403.685",C4:"-",D:"-161.135"}},conversions:{kg:{to:"kg",value:"2.11"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/318f08e0-1b04-49eb-ab16-531482cd75da?version=20.19.120"},subType:"Generisk data"},{id:"31cc0d99-f9fb-4739-a1d9-c23532aebd13",name:"Træ. fyrretræ (12% fugt / 10.7% H2O)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-783.129",C3:"985.049",C4:"-",D:"-260.334"}},conversions:{kg:{to:"kg",value:"548.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/aea021e8-7e2f-4f6b-ae3f-a76cba4c5d6e?version=20.19.120"},subType:"Generisk data"},{id:"82b47265-aa6a-48ec-8e4c-2a8876d34af2",name:"Cirkulationspumpe < 50 W",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"132.285",C3:"0.432995",C4:"0.0225356",D:"-253.107"}},conversions:{kg:{to:"kg",value:"2.47"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/301c6f09-ce88-4818-96c3-e420fe799d62?version=20.19.120"},subType:"Generisk data"},{id:"5cffdd0d-f894-4544-a6fc-058ca0bf8c7a",name:"Overflade. Vinduesmaling. hvid",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"182.186",C3:"0.784673",C4:"-",D:"-0.243853"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2e5ca27a-fcd0-4dc1-b0ab-4a4c7eb4e030?version=20.19.120"},subType:"Generisk data"},{id:"b3a6cc93-4451-49d9-a629-6d38b214ca70",name:"LPG tank 2700 l / t 1.2 (overjordiske)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1720.01",C3:"0.433551",C4:"-",D:"-825.924"}},conversions:{kg:{to:"kg",value:"648"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2d5644dd-ac9f-4546-a004-20ca372d5d08?version=20.19.120"},subType:"Generisk data"},{id:"aef575c2-78f4-45be-8fc1-32e966b5ab12",name:"Affald. inert. deponering (glas)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"-",C4:"0.0136414",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2d30b3f0-d118-4b24-a037-11f154b43f6f?version=20.19.120"},subType:"Generisk data"},{id:"99442ed2-f027-4ef2-bcdc-6ce544ed3703",name:"LPG tank 4850 l / 2.1t (overjordiske)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2762.64",C3:"0.851223",C4:"-",D:"-1621.6"}},conversions:{kg:{to:"kg",value:"1040"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2c6e929d-026a-4547-b872-1213fba3a690?version=20.19.120"},subType:"Generisk data"},{id:"9ec81b5e-c3bf-4654-8077-f51e807f3c00",name:"PIR-skum. høj densitet (250 kg/m3)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"781.381",C3:"644.627",C4:"-",D:"-249.994"}},conversions:{kg:{to:"kg",value:"250"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2c076ee7-3853-4f69-9bf5-8ec265fa43e0?version=20.19.120"},subType:"Generisk data"},{id:"aab84b72-bab2-4997-a8dc-2e53738c3cc9",name:"El-varmepumpe (lodret jordvarme. saltvand) 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1997.42",C3:"435.299",C4:"0.0300174",D:"-156.292"}},conversions:{kg:{to:"kg",value:"1498.05"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2af8a919-15c5-4709-bc6c-276d1e0951d5?version=20.19.120"},subType:"Generisk data"},{id:"c83f59b4-6c59-4bc1-8e3c-13bdf63e4162",name:"Oliekedel. lav temperatur. <20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"803.765",C3:"119.181",C4:"0.946495",D:"-139.23"}},conversions:{kg:{to:"kg",value:"221"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2aa9cc62-46ee-447f-85e8-50d03e0574f4?version=20.19.120"},subType:"Generisk data"},{id:"ebe88a7c-000d-4a16-a014-9035e592d833",name:"Gulvvarmesystem inkl. isolering. PEX (200 mm afstand)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"56.924",C3:"49.229",C4:"-",D:"-205.162"}},conversions:{kg:{to:"kg",value:"1.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2a99b26d-db9a-4514-bb03-ed965ed61558?version=20.19.120"},subType:"Generisk data"},{id:"a200f1b1-ea08-4b65-ad4a-a2813459478b",name:"Kalksandsten",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"306.119",C3:"134.516",C4:"-",D:"-410.796"}},conversions:{kg:{to:"kg",value:"2000"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/29e6c6cf-0552-4e4b-85c7-26a68a625252?version=20.19.120"},subType:"Generisk data"},{id:"16419ebb-e8fe-417d-bc03-9910a45fa0fb",name:"Singels 2-15 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.014695",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/26ad7410-7fcb-42e8-b622-d1ba2edbf10c?version=20.19.120"},subType:"Generisk data"},{id:"acba2ef7-3e65-4ea6-abc9-efda4bb9b016",name:"Gulvvarmesystem inkl. isolering. PP (200 mm afstand)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"488.738",C3:"49.229",C4:"-",D:"-205.162"}},conversions:{kg:{to:"kg",value:"1.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/243f619c-c8ee-4339-9bbd-4df03737aa1a?version=20.19.120"},subType:"Generisk data"},{id:"532631c1-fa37-47aa-bc80-f5f1cf4410ee",name:"Kølemiddel (R407c)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"838.122",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/242540e0-6b44-4080-bf2e-72fa45376cab?version=20.19.120"},subType:"Generisk data"},{id:"0e7f98bf-df37-462f-81d7-7afd569efd92",name:"Sand. knust. tørret",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0342735",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/230cd2c6-0b79-461b-b51a-d092e66843ca?version=20.19.120"},subType:"Generisk data"},{id:"4c1532ae-747c-4df3-bc72-13bedba9b6a6",name:"Plastplade. transparent. PC",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"6131.21",C3:"3661.42",C4:"-",D:"-1368.53"}},conversions:{kg:{to:"kg",value:"1200"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/222023f8-36c2-4345-a863-b49828a41e96?version=20.19.120"},subType:"Generisk data"},{id:"3839b7d9-d9e4-4b7f-b73d-60f9da4fe563",name:"CR-profil til forsegling (chloropren gummi)",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"0.895329",C3:"0.555074",C4:"-",D:"-0.276832"}},conversions:{kg:{to:"kg",value:"0.18"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/208395ce-85db-4ec3-ab24-8e5920f58077?version=20.19.120"},subType:"Generisk data"},{id:"a3202c5a-fd56-471e-a22a-fee7ccd1d298",name:"Gipskartonplade 13 mm. hulplade",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"136.406",C3:"-",C4:"0.127547",D:"-"}},conversions:{kg:{to:"kg",value:"8.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/207cde6a-73be-4ffb-972d-30d3d8619fc3?version=20.19.120"},subType:"Generisk data"},{id:"61435a47-ad63-4be6-92f0-85a9db05f9e7",name:"Bomuld",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-0.780289",C3:"220.182",C4:"-",D:"-0.722834"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/206deb33-2710-417d-9b92-aa70c7958334?version=20.19.120"},subType:"Generisk data"},{id:"2eed008c-537f-4f39-9152-a1f0a8799e06",name:"Glasbyggesten",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"3926.96",C3:"-",C4:"443.346",D:"-"}},conversions:{kg:{to:"kg",value:"2500"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1f2d6e42-9ffc-421d-990d-555eee4a7529?version=20.19.120"},subType:"Generisk data"},{id:"2f03f792-994f-4411-a6dc-fbf52ae6ed90",name:"Aluminium. støbegods",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"109.481",C3:"-",C4:"#G0500",D:"#G0500"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1e8e3c3e-aad0-44ef-977e-d040c4597df0?version=20.19.120"},subType:"Generisk data"},{id:"a3692582-1d7d-4382-a20f-2d0cfb2e9d85",name:"Stokerfyr 120-400 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"7141.52",C3:"187.887",C4:"180.285",D:"-3691.63"}},conversions:{kg:{to:"kg",value:"3399"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1de7287f-aa29-4d83-92c6-e88bc14c76c2?version=20.19.120"},subType:"Generisk data"},{id:"af56abf4-a0a4-4c95-91b9-7e7feb706796",name:"Curtain wall profiler. aluminium",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"551.564",C3:"342.169",C4:"-",D:"-356.544"}},conversions:{kg:{to:"kg",value:"5.7"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1d2945e3-856e-4c5f-9894-e75bafad3a76?version=20.19.120"},subType:"Generisk data"},{id:"3a606eb1-344f-4864-8f54-eec8feafa70a",name:"Plast profil SBR",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"420.151",C3:"31.383",C4:"-",D:"-16.957"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1b69b3a2-3164-436b-a934-ed7d926f5f53?version=20.19.120"},subType:"Generisk data"},{id:"ada3c244-2e27-4741-bc1e-1f299357385c",name:"Overflade. træfacade. semi-pigmenteret lasursystem",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"27.365",C3:"0.836874",C4:"-",D:"-0.261171"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1a4a4522-7297-4ae5-a430-689e89ec2159?version=20.19.120"},subType:"Generisk data"},{id:"7b84a369-abee-4511-9f69-c161154c9b09",name:"Porebeton 472 kg/m³",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"222.605",C3:"317.457",C4:"-",D:"-0.969479"}},conversions:{kg:{to:"kg",value:"472"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1a43ae76-2dc9-4a3a-9926-47e7137e773d?version=20.19.120"},subType:"Generisk data"},{id:"d0aa3f5c-1774-4e78-96da-c7336a8ef26e",name:"Rør til el-varmepumpe (lodret jordvarme. saltvand). collector. 10 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"363.115",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"141"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1a27c109-1e99-45e7-b198-7c79f926b996?version=20.19.120"},subType:"Generisk data"},{id:"28db7874-e6cd-439b-9df4-923e9ee253ed",name:"Skærvemastisk asfalt (SmA)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0765834",C3:"0",C4:"-",D:"-0.0263052"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/19f46be3-d65a-441f-8d74-dfc412160cf1?version=20.19.120"},subType:"Generisk data"},{id:"87668aa9-319f-42ae-9d73-10778018341f",name:"Glas 4 mm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"133.289",C3:"-",C4:"0.163697",D:"-"}},conversions:{kg:{to:"kg",value:"10"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1490b480-2c36-43f2-ba8b-4ea49948f7c3?version=20.19.120"},subType:"Generisk data"},{id:"12b8481e-0d43-4712-afac-983892b3dbfa",name:"Kondenserende gaskedel <20 kW (standalone enhed)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"753.547",C3:"218.182",C4:"15.829",D:"-183.436"}},conversions:{kg:{to:"kg",value:"133"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/12bd4f95-1ff1-4b63-8654-e2dca3fd38fe?version=20.19.120"},subType:"Generisk data"},{id:"d3fdfd1c-ac0c-48bf-8ed3-ff9a4cf2e3a2",name:"Overflade. metal maling (opløsningsmiddelbaseret)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"228.622",C3:"0.143886",C4:"-",D:"-0.0404745"}},conversions:{kg:{to:"kg",value:"0.21"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/118d1b5e-5f22-4d04-8711-c4b02de02209?version=20.19.120"},subType:"Generisk data"},{id:"352a177b-d863-4730-974a-ef7f9dbefb82",name:"Lithium jernfosfat (LiFePO4) batteri (1 kWh lagring)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"241.48",C3:"-",C4:"225.933",D:"-352.863"}},conversions:{kg:{to:"kg",value:"23.3"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/10c531c8-329c-479a-bbe9-17990ca5dfd6?version=20.19.120"},subType:"Generisk data"},{id:"3904c4eb-5556-4f20-97e2-44ceb58ae673",name:"Kondenserende gaskedel 20-120 kW (standalone enhed)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1268.3",C3:"467.263",C4:"180.285",D:"-392.75"}},conversions:{kg:{to:"kg",value:"283"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0fa37281-b976-458b-880e-46268ca7a294?version=20.19.120"},subType:"Generisk data"},{id:"1350d3e5-e067-48a9-af6b-5a67f9da1757",name:"Overflade. Vandbaseret lak. hvid",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"201.226",C3:"0.856007",C4:"-",D:"-0.24092"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0f072f06-faa5-466e-970c-a7215685f5a2?version=20.19.120"},subType:"Generisk data"},{id:"0b6768f9-1dd0-4a26-9d37-2e734827536c",name:"Betonrør. u-armeret",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.132191",C3:"0.00733722",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0eada728-b626-4f79-ba67-020635b4e67f?version=20.19.120"},subType:"Generisk data"},{id:"2fb0a351-e02b-41b4-91cf-2803a0b33983",name:"PVC plastisol",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"243.275",C3:"273.937",C4:"-",D:"-0.556058"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0e39587e-8c05-4a8e-80b5-bb9a57bbe164?version=20.19.120"},subType:"Generisk data"},{id:"d7516f2d-bc40-45cc-a0c9-66e1de068cc3",name:"Pellet-kedel. <20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1168.47",C3:"131.871",C4:"180.285",D:"-409.511"}},conversions:{kg:{to:"kg",value:"335"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0e03a1c1-0aa9-4e94-bbc5-653d967b0d8d?version=20.19.120"},subType:"Generisk data"},{id:"8136446a-3883-4de7-8e88-6d675093c684",name:"Rørgods",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"177.322",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0cc9aee8-95a6-45bf-b581-1d982e593703?version=20.19.120"},subType:"Generisk data"},{id:"83b6c437-2c23-490e-ad9a-11df207e8440",name:"Overflade. Facademaling. silikat",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.865769",C3:"-",C4:"0.0150055",D:"-0.010823"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/02f2750e-eec2-492a-9f05-b9600593b6c5?version=20.19.120"},subType:"Generisk data"},{id:"7a182510-9d92-4abb-a90f-6b1063a3c52f",name:"Puds. gips",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"134.173",C3:"-",C4:"13.505",D:"-"}},conversions:{kg:{to:"kg",value:"900"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0b0d0210-c31d-4fc7-b11a-9cdfe0a87ed6?version=20.19.120"},subType:"Generisk data"},{id:"b18a1c75-ca61-49e7-95d2-b43de51ef5fc",name:"Afretningslag. cementbaseret",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.183551",C3:"-",C4:"0.0150055",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0973f221-2284-4892-ae3d-1b8c2986b6dd?version=20.19.120"},subType:"Generisk data"},{id:"5e790f73-7e8d-4aa8-87aa-8cf1f29d4f95",name:"Varmepumpe. jordvarmesonde. 10 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"855.755",C3:"435.299",C4:"0.0300174",D:"-156.292"}},conversions:{kg:{to:"kg",value:"563"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0959c210-3af7-43df-9a7b-0f5ac19656ea?version=20.19.120"},subType:"Generisk data"},{id:"53447b80-748f-4b86-b2af-3c68041b44b1",name:"Urea formaldehyd skum isolering",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"288.236",C3:"187.588",C4:"-",D:"-0.666651"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/08bdbef6-9134-422f-8504-00eeee75d31f?version=20.19.120"},subType:"Generisk data"},{id:"0cd2b8cd-cb29-4b13-a90f-bee1b0e42c33",name:"Træbrædder. bøg (12% fugtighed / 10.7% H2O)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-1093.21",C3:"1328.2",C4:"-",D:"-352.468"}},conversions:{kg:{to:"kg",value:"739.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/08bbc2e2-1513-4ce3-816e-99e95fdafc4e?version=20.19.120"},subType:"Generisk data"},{id:"73d9153e-a923-4f21-89ba-034ff7ba30b9",name:"Overflade. Vinduesmaling. mellemlag dækkende hvid",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"178.204",C3:"0.784673",C4:"-",D:"-0.243992"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/08138b62-1b5f-497a-bf9a-d7f857a2e575?version=20.19.120"},subType:"Generisk data"},{id:"70dba606-668e-48ba-a595-a1af2a98a156",name:"Kalkpuds. tørstof",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"190.611",C3:"-",C4:"13.505",D:"-"}},conversions:{kg:{to:"kg",value:"900"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/07f3cd13-22bb-494d-803a-f0a440fbce7a?version=20.19.120"},subType:"Generisk data"},{id:"945c039e-c087-4ab8-9e74-ca35206bb798",name:"Varmepumpe. jordvarmeslange. 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"392.972",C3:"435.298",C4:"0.0300174",D:"-156.278"}},conversions:{kg:{to:"kg",value:"184.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/063cabc8-b90e-4629-b514-a39dc10f0552?version=20.19.120"},subType:"Generisk data"},{id:"4393e250-0acf-4cd4-b5a8-e01d313ab797",name:"Varmepumpe. jordvarmeslange. 70 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"931.906",C3:"114.808",C4:"0.0300174",D:"-267.738"}},conversions:{kg:{to:"kg",value:"488.9"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/062fc223-898a-42bd-a133-8e0fe95cb7a5?version=20.19.120"},subType:"Generisk data"},{id:"3c567de0-7e5f-4d51-9ede-5a4aa32d9858",name:"Bomuld. økologisk",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-0.553836",C3:"220.182",C4:"-",D:"-0.722834"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/061f0d5b-61f4-476d-9f2e-96f6a6df7786?version=20.19.120"},subType:"Generisk data"},{id:"9f80be0d-e324-4267-95a9-430a3e6b80c4",name:"Affald (forbrænding). kunststof. fjernvarme",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"252.745",C4:"-",D:"-140.543"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0532424f-838f-4411-b8cc-0e29ad16d64b?version=20.19.120"},subType:"Generisk data"},{id:"6e86bba6-e50e-45dc-902d-a2b74b862ddf",name:"Propan (R290)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.556878",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/03517019-174a-47f4-8f28-01ed77584cb9?version=20.19.120"},subType:"Generisk data"},{id:"8965176d-ed3b-42db-ac08-641f8dabf2ec",name:"Aircondition (direkte fordamper) (per 1 kW)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"457.792",C3:"303.977",C4:"0.428176",D:"-241.576"}},conversions:{kg:{to:"kg",value:"13.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/02f86799-1fba-4c8e-9820-027e6f2fae0e?version=20.19.120"},subType:"Generisk data"},{id:"1752b740-6928-437c-95a0-769af0dc665b",name:"Overflade. Facademaling. akryl maling",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"148.132",C3:"-",C4:"0.0150055",D:"-0.0101248"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fcf6494c-aad2-4180-b1a2-392cc954ae52?version=20.19.120"},subType:"Generisk data"},{id:"865ee297-40a5-4ed6-96a9-9eb06c3b169b",name:"Skorsten opmuret (1 rør)",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"238.032",C3:"160.914",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"98.3"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/026e073f-83f3-4460-8b03-b748b7c9b597?version=20.19.120"},subType:"Generisk data"},{id:"1b33aad0-030e-4f9f-8543-c73942821d20",name:"Stokerfyr <20 KW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1642.03",C3:"347.892",C4:"180.285",D:"-683.535"}},conversions:{kg:{to:"kg",value:"631"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/022640ea-1bf1-4ba9-82bd-da28d968e658?version=20.19.120"},subType:"Generisk data"},{id:"889b8b3c-bccb-4016-9c08-700d927d535f",name:"Kølemiddel (R404a)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"948.597",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/01ccf18a-a8cf-4da8-8e3d-951a2d136a3a?version=20.19.120"},subType:"Generisk data"},{id:"936880ee-f647-4d31-9a1a-f0106f307558",name:"Beslag til vandrette skydevinduer",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"575.046",C3:"-",C4:"#G0763",D:"#G0763"}},conversions:{kg:{to:"kg",value:"0.696"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/00c28f1f-1d49-4c81-9208-138922a1dd6c?version=20.19.120"},subType:"Generisk data"},{id:"f17ef05a-7fe6-4137-bc8e-1bfc8a56cc79",name:"Tagpap. bitumen toplag. ikke skiferbestrøet",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"535.539",C3:"0",C4:"0.413297",D:"-"}},conversions:{kg:{to:"kg",value:"5.21"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ff9336ea-fb7f-4299-8a40-5e9a28538c85?version=20.20.010"},subType:"Generisk data"},{id:"bee96d2e-a6fa-4a31-89be-78f4c1086a46",name:"Rude (3-lags)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"577.726",C3:"303.476",C4:"0.49109",D:"-140.543"}},conversions:{kg:{to:"kg",value:"30"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fa9f6670-3170-4597-92ab-a2fdec7f1451?version=20.20.010"},subType:"Generisk data"},{id:"f79a4d53-9062-4975-bb69-f893ae89b81e",name:"Gummigulve profileret EN 12199",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"12.884",C3:"13.866",C4:"-",D:"-817.326"}},conversions:{kg:{to:"kg",value:"4.82"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f814e7e2-e438-4ea9-80cc-81254d01aba2?version=20.20.010"},subType:"Generisk data"},{id:"c5b26052-8e72-4390-b4bb-ba11d71d3711",name:"Naturstenplade. blød. gulv",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"149.203",C3:"0.349741",C4:"-",D:"-0.106807"}},conversions:{kg:{to:"kg",value:"52"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ef0d9cbc-4e89-4e78-8cb2-68f02a49b87d?version=20.20.010"},subType:"Generisk data"},{id:"29ad3ccb-6243-4025-8d84-669f943d831f",name:"marmorplade (tykkelse 0.02 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"162.767",C3:"0.381535",C4:"-",D:"-0.106807"}},conversions:{kg:{to:"kg",value:"52"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e9be7506-62ce-45b8-853f-c45c3f82401f?version=20.20.010"},subType:"Generisk data"},{id:"f70a14b1-7ab2-4add-bc31-dcd3c19db506",name:"Naturstenplade. hård. gulv",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"317.513",C3:"0.349741",C4:"-",D:"-0.106807"}},conversions:{kg:{to:"kg",value:"52"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e8db532f-ee15-42a4-89c3-5ef789e1fb8f?version=20.20.010"},subType:"Generisk data"},{id:"c240e1b5-570a-4d4c-9847-f266adddbe13",name:"Kork linoleumsgulv (tykkelse 0.0025 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"360.243",C3:"358.677",C4:"-",D:"-0.350728"}},conversions:{kg:{to:"kg",value:"3.1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e5f97559-bb92-4c23-a722-480da1b559ad?version=20.20.010"},subType:"Generisk data"},{id:"7aacdae8-9e02-4b70-be4a-37677391f147",name:"Loftspanel med mineraluld",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"34.872",C3:"0",C4:"0.0360133",D:"-"}},conversions:{kg:{to:"kg",value:"2.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/def9e058-ac16-489e-9457-db7645404194?version=20.20.010"},subType:"Generisk data"},{id:"aae0fd4d-a0c5-4e3c-b350-31f79d43db06",name:"Undertag. PP-membran",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.407157",C3:"0.333621",C4:"-",D:"-0.164677"}},conversions:{kg:{to:"kg",value:"0.15"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/deb7fe73-3eb8-4f80-937b-7ce3a0a977ed?version=20.20.010"},subType:"Generisk data"},{id:"bd56f0b0-d16b-469e-bf6a-129cec31442d",name:"Gipskartonplade. brandimprægneret",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"154.129",C3:"-",C4:"0.150055",D:"-"}},conversions:{kg:{to:"kg",value:"10"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/da72684f-471c-425b-817d-69f262323f04?version=20.20.010"},subType:"Generisk data"},{id:"8543c7f6-6ccb-4ab2-b052-adb88f066b78",name:"Naturstensplade. udendørsbrug",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"573.544",C3:"139.896",C4:"-",D:"-0.427228"}},conversions:{kg:{to:"kg",value:"208"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/da4b704a-c901-414f-943f-8e1ff0f4566c?version=20.20.010"},subType:"Generisk data"},{id:"210c5acb-868b-4077-a7ea-9fb5e3344d6e",name:"Tagpap. bitumen toplag. skiferbestrøet",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"536.407",C3:"0",C4:"0.491831",D:"-"}},conversions:{kg:{to:"kg",value:"6.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d56bd904-09a0-4d30-bdbe-5d4f892cc12b?version=20.20.010"},subType:"Generisk data"},{id:"6286c076-61bd-4f08-a255-9806b7c8d016",name:"Naturstenplade. hård. facade",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"324.057",C3:"0.524611",C4:"-",D:"-0.160211"}},conversions:{kg:{to:"kg",value:"78"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/cb3f4a56-460c-4a3e-ae43-3e0a9dcb4319?version=20.20.010"},subType:"Generisk data"},{id:"ef07d863-e855-4856-9afe-62dc4879b21e",name:"Net-forstærket dampspærre PET",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.742035",C3:"0.331026",C4:"-",D:"-0.100762"}},conversions:{kg:{to:"kg",value:"0.12"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bc50a404-ddf0-4f37-b62f-95130786b004?version=20.20.010"},subType:"Generisk data"},{id:"52e6c819-4285-4b9e-b702-02e1fdff3371",name:"Keramikfliser. glaseret",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"617.969",C3:"0.146744",C4:"-",D:"-0.0410796"}},conversions:{kg:{to:"kg",value:"20"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b4a0e610-e038-47d3-b86e-cef013cd7c83?version=20.20.010"},subType:"Generisk data"},{id:"96b81028-538a-404b-8f54-f736eeacaacb",name:"Gips. tørstof (gipskartonplade) (tykkelse 0.025 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"311.901",C3:"-",C4:"0.301611",D:"-"}},conversions:{kg:{to:"kg",value:"20.07"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ab574186-139f-4816-b7c1-d457b1258c7d?version=20.20.010"},subType:"Generisk data"},{id:"8ae7b949-b6ab-409c-8afe-f84a5ca78964",name:"Gips. tørstof (gipsfiberplade) (tykkelse 0.025 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"755.456",C3:"0",C4:"0.361634",D:"-"}},conversions:{kg:{to:"kg",value:"24.07"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a9a79b38-dc2c-4b51-a3cc-cf9fa0d299e7?version=20.20.010"},subType:"Generisk data"},{id:"cedd4aaa-7070-4ec7-a0a9-508ed680496d",name:"PUR-underlag på PET-flis (tykkelse 0.0005 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"106.631",C3:"0.54176",C4:"-",D:"-0.192588"}},conversions:{kg:{to:"kg",value:"0.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a92bd5a5-7cef-4050-8659-20a8d5a7a72b?version=20.20.010"},subType:"Generisk data"},{id:"3b988338-d81a-4c62-a43c-5bad58ea70f3",name:"Dampspærre PE (tykkelse 0.0002 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.399404",C3:"0.555951",C4:"-",D:"-0.274462"}},conversions:{kg:{to:"kg",value:"0.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/99792cbc-c5f4-4d2d-bc9e-3790509891a0?version=20.20.010"},subType:"Generisk data"},{id:"115b7a43-9133-437c-a25b-b28a16e36c8c",name:"Skifer",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"150.386",C3:"0.201774",C4:"-",D:"-0.0616194"}},conversions:{kg:{to:"kg",value:"30"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/9049a94f-a527-4d87-a4b9-5a3a56f5ea19?version=20.20.010"},subType:"Generisk data"},{id:"ae50ca64-06a3-4a1e-a35f-fe05bd6c8c0e",name:"Folie til grønt tag",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"354.926",C3:"495.155",C4:"-",D:"-100.535"}},conversions:{kg:{to:"kg",value:"1.13"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8a37ac61-585c-43a8-9773-10fce30096e4?version=20.20.010"},subType:"Generisk data"},{id:"d93857c6-73bd-48a5-9203-e67dfe0c4701",name:"Trægulv. stavparket. 22 mm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-150.494",C3:"236.049",C4:"-",D:"-636.585"}},conversions:{kg:{to:"kg",value:"11.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/88619ce6-c0aa-43bd-9ac6-477b5d6ce442?version=20.20.010"},subType:"Generisk data"},{id:"03d8376e-b372-4630-9bb2-a6cb85cb5df1",name:"Dampspærre. bitumen",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"20.393",C3:"0",C4:"0.396638",D:"-"}},conversions:{kg:{to:"kg",value:"5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/73d1c1b7-d509-44c8-8518-848babdd7c01?version=20.20.010"},subType:"Generisk data"},{id:"98c98a60-a57a-406c-af5b-6ef215814724",name:"Gipsfiberplade 10 mm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"318.612",C3:"0",C4:"0.150055",D:"-"}},conversions:{kg:{to:"kg",value:"10"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6d535792-4351-4d7d-97c6-6d2c3624f3e0?version=20.20.010"},subType:"Generisk data"},{id:"5e5cb68c-a237-4e3c-bed5-abd50c6739da",name:"Lerplade (tykkelse 0.02 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.0530942",C3:"0.0436552",C4:"-",D:"-0.0205632"}},conversions:{kg:{to:"kg",value:"14"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6aff7a60-d7cd-430e-8b15-02556b6f62ff?version=20.20.010"},subType:"Generisk data"},{id:"3ce18a0c-bb2d-410c-be6d-7b279601a38e",name:"Undertag. fiberarmeret PE-membran",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.425628",C3:"0.315442",C4:"-",D:"-0.14272"}},conversions:{kg:{to:"kg",value:"0.14"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/66a90b47-27b8-46ce-830e-8ed22f4165d8?version=20.20.010"},subType:"Generisk data"},{id:"95ab4bd4-0c7c-4709-bb45-5a61c380a0da",name:"Tagpap. bitumen undermembran",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"24.749",C3:"0",C4:"0.396638",D:"-"}},conversions:{kg:{to:"kg",value:"5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/64da45fc-f415-4875-8a4e-7c23fe7a7aa9?version=20.20.010"},subType:"Generisk data"},{id:"90f9719e-3a6e-434f-a9ec-03369ffa86ef",name:"Linoleum gulvbelægning (tykkelse 0.0025 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-324.756",C3:"35.866",C4:"-",D:"-0.444446"}},conversions:{kg:{to:"kg",value:"3"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/56e977b3-d042-4843-b40d-3a33dbb5a555?version=20.20.010"},subType:"Generisk data"},{id:"108c6fd2-72bd-4e98-b579-822fff206fc3",name:"Tagmembran. PVC",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"607.292",C3:"493.032",C4:"-",D:"-100.091"}},conversions:{kg:{to:"kg",value:"1.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4f4e989b-bd5e-4d85-9a50-53f3c61eea70?version=20.20.010"},subType:"Generisk data"},{id:"74ba310b-a989-4e6e-986a-d843dc8b5331",name:"Korkfliser 8 mm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-608.412",C3:"638.655",C4:"-",D:"-0.665479"}},conversions:{kg:{to:"kg",value:"3.6"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4e2c6692-148d-4311-b0cf-f0f174002d9e?version=20.20.010"},subType:"Generisk data"},{id:"94454a3a-18c5-4bc5-a600-0fdab08f647f",name:"Fugtisolering. grundmursplade. PE",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"408.909",C3:"414.532",C4:"-",D:"-20.467"}},conversions:{kg:{to:"kg",value:"1.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/49b4cbe9-ac63-4811-a1c7-dd7278db8ac0?version=20.20.010"},subType:"Generisk data"},{id:"bd47a819-bf05-4bd5-a009-e7e2e31a270a",name:"Parket. flerlag (tykkelse 0.01 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-445.326",C3:"118.038",C4:"-",D:"-231.635"}},conversions:{kg:{to:"kg",value:"6.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3b66b7be-bc1e-4dd4-8779-453d4f81825f?version=20.20.010"},subType:"Generisk data"},{id:"c668631a-c4d6-438e-829b-825e0b3592fb",name:"Korkfliser 6 mm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-456.492",C3:"484.491",C4:"-",D:"-0.544943"}},conversions:{kg:{to:"kg",value:"2.7"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/38babeb7-2b2f-42e2-9270-0daac46ebe07?version=20.20.010"},subType:"Generisk data"},{id:"b28ebad6-c133-4e2f-9e9d-67b6edf3ef5f",name:"Gips. vægplade (tykkelse 0.1 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"223.539",C3:"-",C4:"126.047",D:"-"}},conversions:{kg:{to:"kg",value:"84"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/38a8d707-0c7f-4d91-a3db-9b5b2c9bb147?version=20.20.010"},subType:"Generisk data"},{id:"22e40fd9-bbc3-4948-b7d4-979e041e10db",name:"Korkfliser 4 mm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-304.279",C3:"321.527",C4:"-",D:"-0.351073"}},conversions:{kg:{to:"kg",value:"1.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/360cbe6a-bd01-4660-bd08-f7d3eb3d8b79?version=20.20.010"},subType:"Generisk data"},{id:"7a8be224-e7cc-41c9-9958-3cbd4f45dd15",name:"Tagfolie EPDm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"859.954",C3:"679.964",C4:"-",D:"-339.139"}},conversions:{kg:{to:"kg",value:"2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/341e2e42-dab2-427b-86f6-a80c701b6071?version=20.20.010"},subType:"Generisk data"},{id:"a42fa185-fddf-408e-8cc0-dca304123b3d",name:"Gipskartonplade 13 mm. imprægneret",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"162.283",C3:"-",C4:"0.150055",D:"-"}},conversions:{kg:{to:"kg",value:"10"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/07423e99-8c7c-4e93-8311-dcf7ae85c41d?version=20.20.010"},subType:"Generisk data"},{id:"3ea68eeb-78dc-4c6c-9571-09a5e13d82de",name:"Halm",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-127",C3:"0",C4:"134",D:"0"}},conversions:{kg:{to:"kg",value:"100"}},source:{url:"https://www.oekobaudat.de/OEKOBAU.DAT/datasetdetail/process.xhtml?uuid=d2d1b29f-8dd7-4373-ab2a-de57acd51e72&version=00.00.029"},subType:"Generisk data"},{id:"e9ab52ae-4a3c-4141-92a5-aed1b7bdba1a",name:"Ovenlyskuppel. plast (komplet ovenlys)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"45.7",C3:"42.5",C4:"0.18",D:"-37.1"}},conversions:{kg:{to:"kg",value:"35.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2bf377b2-7923-4e05-b7a0-3c02e63d3476?version=00.00.007"},subType:"Generisk data"},{id:"ee318ec7-12d9-4e85-8f31-7dbfaeec8941",name:"Rytterlys. plast/aluminium (komplet vindue)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"84.7",C3:"10.6",C4:"0.0495",D:"-68.6"}},conversions:{kg:{to:"kg",value:"18.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/da649461-9a6f-49c9-aa2e-5d91b1969328?version=00.00.003"},subType:"Generisk data"},{id:"166876af-f942-4382-9535-c85dc5b6a0a4",name:"Fladtagsvindue. plast (komplet vindue)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"226",C3:"15.1",C4:"0.21",D:"-148"}},conversions:{kg:{to:"kg",value:"72.1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/966b0795-c7e3-4f23-86ba-55c4aa8fb5ff?version=00.00.004"},subType:"Generisk data"},{id:"3b07c284-6fd3-4946-ac53-615e5942054f",name:"Glastag. aluminium (komplet vindue)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"232",C3:"10.6",C4:"0.12",D:"-77.4"}},conversions:{kg:{to:"kg",value:"61.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f4e70d32-54be-4de5-9771-855e038b9133?version=00.00.005"},subType:"Generisk data"},{id:"69619293-6feb-4566-9738-841a51665bf3",name:"Dør. alu. hoveddør",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"163.382",C3:"105.204",C4:"0.117048",D:"-925.086"}},conversions:{kg:{to:"kg",value:"47"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4d22a515-cfcc-4bcb-bbf9-a6e647bed9ab?version=00.00.007"},subType:"Generisk data"},{id:"9ee8d7d8-8400-441e-8a33-a4475f20820e",name:"Dør. alu. røgdør",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"157.17",C3:"0.866486",C4:"0.238074",D:"-702.062"}},conversions:{kg:{to:"kg",value:"41"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8526239b-fa75-4b15-b4d5-790f1a15bba6?version=00.00.009"},subType:"Generisk data"},{id:"c62c0ecb-cf1f-4fd9-b409-c7de3ac751a0",name:"Dør. alu. T30/EI30",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"221.423",C3:"0.927273",C4:"0.389603",D:"-740.761"}},conversions:{kg:{to:"kg",value:"55"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b9c08cf4-c6ad-4f12-bd5a-524c5a10ef51?version=00.00.008"},subType:"Generisk data"},{id:"238b7cca-1316-489a-b724-3a056dcf62d3",name:"Dør. alu. T90/EI90",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"351.666",C3:"0.927262",C4:"0.863448",D:"-847.245"}},conversions:{kg:{to:"kg",value:"101"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/34a3f341-4af5-4ad4-9e17-6ff9b0713dfc?version=00.01.007"},subType:"Generisk data"},{id:"c04df3b4-b9c7-4abf-8da8-6b95e45864a1",name:"Dør. industriport",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"263.69",C3:"0.0519",C4:"5.71",D:"-121.04"}},conversions:{kg:{to:"kg",value:"88.54"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/81f26749-0b39-4eb5-9015-bbebae3c7413?version=00.00.008"},subType:"Generisk data"},{id:"8f00269a-cfc0-4342-b26e-f3c3b2bab602",name:"Dør. stål. indv/udv/brand/røg mv",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"135.75",C3:"0.0578",C4:"1.72",D:"-63.02"}},conversions:{kg:{to:"kg",value:"44.1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/24f9f8e0-423c-4fe3-a16a-7b93efae9421?version=00.02.004"},subType:"Generisk data"},{id:"3fd560e6-0963-4788-a619-432e5b01523b",name:"mineraluld. alm.",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"403.055",C3:"0.72123",C4:"0.399579",D:"-"}},conversions:{kg:{to:"kg",value:"26.25"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fafd5743-0b42-4614-8e3d-5c4eacdfba98?version=20.20.020"},subType:"Generisk data"},{id:"80147761-92cd-4c8a-a4ed-7bb17c469056",name:"mineraluld. facadesystem",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"703.915",C3:"126.969",C4:"0.703441",D:"-"}},conversions:{kg:{to:"kg",value:"46.25"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f8afef87-5de3-4996-838c-1f2af9ef81df?version=20.20.020"},subType:"Generisk data"},{id:"d3f3709c-4eee-4064-964a-002a3f4d05a4",name:"ETICS limning og mineralsk puds (Kratzputz)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"98.439",C3:"0",C4:"0.527835",D:"-"}},conversions:{kg:{to:"kg",value:"35.18"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e5cd5727-a516-4081-8fdf-4fc0ce142d90?version=20.20.020"},subType:"Generisk data"},{id:"cf3082bd-125b-4c3a-8e18-c0e4d26d4362",name:"Smeltekammergranulat",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d895bdb7-0dff-457e-9ad2-45662fc227f5?version=20.20.020"},subType:"Generisk data"},{id:"8188de64-5ca7-43e1-801e-8b78bf5f591e",name:"ETICS-limning og belægning af silikatdispersionspuds",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"548.029",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"12.48"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/94ef6ac0-956a-4d60-9062-990df91e7917?version=20.20.020"},subType:"Generisk data"},{id:"591ae5dc-a5c6-4194-af9f-13924bd3586f",name:"Pimpsten (SFK-4)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"780.446",C3:"66.035",C4:"-",D:"-184.858"}},conversions:{kg:{to:"kg",value:"900"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8f44840b-28ae-418b-bf12-fcac5b7c68b3?version=20.20.020"},subType:"Generisk data"},{id:"78ffebad-f1cc-44e2-a470-d1cf4f99a1d4",name:"ETICS-limning og belægning af syntetisk harpikspuds",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"670.288",C3:"0",C4:"0.187209",D:"-"}},conversions:{kg:{to:"kg",value:"12.48"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/88cc57f7-384d-47a3-826a-e4fce57a32bd?version=20.20.020"},subType:"Generisk data"},{id:"eaca794e-47d3-4358-b097-7bc07de2eee4",name:"mineraluld. skråtag",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"465.164",C3:"0.783207",C4:"0.455523",D:"-"}},conversions:{kg:{to:"kg",value:"30"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/86380db6-3062-4d40-826d-732c24ed3cad?version=20.20.020"},subType:"Generisk data"},{id:"168bfc43-bc80-413b-8871-b5f4bd89ac23",name:"ETICS limning og mineralsk letpuds",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"473.572",C3:"0",C4:"0.168362",D:"-"}},conversions:{kg:{to:"kg",value:"11.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6108c144-5112-4f18-bcb1-d1ff8eb831a6?version=20.20.020"},subType:"Generisk data"},{id:"a6e05669-d932-41d5-af63-30f084daaa71",name:"ETICS limning og mineralsk puds (Dekorputz)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"733.681",C3:"0",C4:"0.258395",D:"-"}},conversions:{kg:{to:"kg",value:"17.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/49fe2b06-ea9c-4cef-b0a1-a75fd1ed6bf8?version=20.20.020"},subType:"Generisk data"},{id:"193c0f30-3321-4de9-af1d-93214bbf672e",name:"mineraluld. trykfast til tagsystem",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"209.503",C3:"397.636",C4:"2.203",D:"-"}},conversions:{kg:{to:"kg",value:"145"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4477c6ca-b728-41fb-a231-366e159a73df?version=20.20.020"},subType:"Generisk data"},{id:"d1a5787a-0d70-48e7-96f3-97de2859f893",name:"Ekspanderet Ler. sand",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.338274",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3749834e-307f-4cb2-b903-4ef4bd463446?version=20.20.020"},subType:"Generisk data"},{id:"5d68608e-2373-49f5-b053-b0514ba02f1d",name:"mineraluld. terræn",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"133.91",C3:"233.097",C4:"129.141",D:"-"}},conversions:{kg:{to:"kg",value:"85"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2691d6e4-a41e-40d7-92ca-680f8785fc1d?version=20.20.020"},subType:"Generisk data"},{id:"55aaea50-9ca0-4c3c-91a5-499aa3831e2b",name:"ETICS limning og silikonepuds",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"548.029",C3:"0",C4:"0.187209",D:"-"}},conversions:{kg:{to:"kg",value:"12.3"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1b84e630-6489-493e-a066-1b976684dd03?version=20.20.020"},subType:"Generisk data"},{id:"6f49231a-34e9-4ad0-93a4-cc121349478f",name:"OSB-plade",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-572.706",C3:"#G0810",C4:"-",D:"#G0810"}},conversions:{kg:{to:"kg",value:"600"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e71b8242-eda8-408a-9ff8-37cd28896b4a?version=01.02.000"},subType:"Generisk data"},{id:"f30d4cba-0b8b-4c4a-993c-b9c6fed87a4e",name:"Spånplade. melaminbelagt",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-691.465",C3:"#G0810",C4:"-",D:"#G0810"}},conversions:{kg:{to:"kg",value:"633.29"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c56b1971-bdde-41b5-b139-9daed5baca91?version=00.02.000"},subType:"Generisk data"},{id:"8514ce21-a7c2-436d-814b-010590c725ca",name:"Parket i massivt træ",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-120.662",C3:"#G0765",C4:"-",D:"#G0765"}},conversions:{kg:{to:"kg",value:"11.71"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1e86515c-3d07-4c59-8f81-84cc5fe0fca7?version=00.02.000"},subType:"Generisk data"},{id:"79b22748-baa7-424c-8121-8c94ecb12606",name:"Træfiberplade. høj densitet. HDF",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-854.246",C3:"#G0810",C4:"-",D:"#G0810"}},conversions:{kg:{to:"kg",value:"849.92"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6e578da4-f52f-440c-87b9-a4ba2344b426?version=00.02.000"},subType:"Generisk data"},{id:"ed3efe91-4a13-4467-aef2-9718f42beb1c",name:"Træfiberplade. medium densitet. mDF",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-726.358",C3:"#G0810",C4:"-",D:"#G0810"}},conversions:{kg:{to:"kg",value:"737.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e5141109-efd6-4fbc-a850-53a48ad30f18?version=00.02.000"},subType:"Generisk data"},{id:"23300d73-6cd0-4208-a831-b44acc3f0ce7",name:"Tom affaldsproces",description:"-",location:"DK",unit:"kg",emission:{gwp:{a1a3:"-",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"-"},subType:"Generisk data"},{id:"18a302c7-67a0-403e-b5c3-761dea9949b2",name:"Silikatmaling (indendørs)",description:"-",location:"DK",unit:"kg",emission:{gwp:{a1a3:"0.955",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.epddanmark.dk/media/1035/md-keim-farver-18012-en.pdf"},subType:"Generisk data"},{id:"ff0ff4e4-387a-41c4-8db5-6b9292e96304",name:"Silikatmaling (udendørs)",description:"-",location:"DK",unit:"kg",emission:{gwp:{a1a3:"1.2",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.epddanmark.dk/media/1036/md-keim-farver-18013-en.pdf"},subType:"Generisk data"},{id:"41c5a2ca-ad17-41ac-8161-082031d251a4",name:"Laminatgulv 8 mm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-5.272",C3:"13.5",C4:"-",D:"-3.649"}},conversions:{kg:{to:"kg",value:"7.45"}},source:{url:"https://www.oekobaudat.de/OEKOBAU.DAT/datasetdetail/process.xhtml?uuid=8f764a39-2539-4510-8c0a-ab5d67fbb59b&stock=OBD_2020_II&lang=de"},subType:"Generisk data"},{id:"1e664221-ba13-4473-a49a-7ce3fdcbbe50",name:"Oliekedel. lav temperatur. kondenserende. < 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"891.1",C3:"26.61",C4:"1.803",D:"-223.6"}},conversions:{kg:{to:"kg",value:"162"}},source:{url:"https://oekobaudat.de/OEKOBAU.DAT/datasetdetail/process.xhtml?uuid=0c44c3ec-2984-4985-995c-90a4881505a0&version=20.19.120"},subType:"Generisk data"},{id:"8778c40c-7186-490f-8ecf-9cac56c85978",name:"Oliekedel. lav temperatur. kondenserende. 20-120 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1755",C3:"72.67",C4:"1.803",D:"-610.8"}},conversions:{kg:{to:"kg",value:"439"}},source:{url:"https://oekobaudat.de/OEKOBAU.DAT/datasetdetail/productFlow.xhtml?uuid=f556eb88-ea53-403c-bda4-c38de1855844&version=39.00.000"},subType:"Generisk data"},{id:"dfeb410e-d578-4a79-9dc2-f1915b1b3bc4",name:"Oliekedel. lav temperatur. kondenserende. 120-400 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"5075",C3:"249.5",C4:"1.803",D:"-2099"}},conversions:{kg:{to:"kg",value:"1504"}},source:{url:"https://oekobaudat.de/OEKOBAU.DAT/datasetdetail/process.xhtml?uuid=e88588a0-0974-4214-86bd-dcbf5caf656a&version=20.19.120"},subType:"Generisk data"},{id:"73f98b61-f707-4449-bfd4-f4492f9a0432",name:"Affald. byggeaffald. deponering (ikke glas)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"-",C4:"0.0136414",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b7cacb37-7945-4518-be5a-bf7df7edf5c2?version=20.19.120"},subType:"Generisk data"},{id:"b83121d4-578b-47d6-b256-3bbd967a0cf6",name:"Affald. stenuld høj densitet",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-",C3:"-",C4:"2.46",D:"-5.42"}},conversions:{kg:{to:"kg",value:"155"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b0e3aedd-a5e2-4b97-b0f3-e51548912687?version=00.06.000"},subType:"Generisk data"},{id:"09ad8491-0561-437a-83f8-10dacf5f4818",name:"Affald. stenuld lav densitet",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-",C3:"-",C4:"0.62",D:"-1.36"}},conversions:{kg:{to:"kg",value:"39"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ec17f51c-27ff-4729-977e-cd0e273c2ee3?version=00.03.000"},subType:"Generisk data"},{id:"7b5dfc52-f6c5-467a-916b-c10986b1c945",name:"Affald. stenuld middel densitet",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-",C3:"-",C4:"1.52",D:"-3.36"}},conversions:{kg:{to:"kg",value:"96"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/eca9691f-06d7-48a7-94a9-ea808e2d67e8?version=00.06.000"},subType:"Generisk data"},{id:"6bc215cd-ca97-4bb9-bac1-cc57e9da3349",name:"Affald (forbrænding). tekstil. fjernvarme",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"173.941",C4:"-",D:"-0.826165"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/97505f38-cf73-475a-a8d8-cc2db219565b?version=20.19.120"},subType:"Generisk data"},{id:"9d2c2c01-1548-4efd-960b-ebb542ee7f7f",name:"Affald (forbrænding). polystyren (PS). fjernvarme",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"337.892",C4:"-",D:"-154.693"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/56d90d2e-11c8-4b49-bc6c-c61f682d0be1?version=20.19.120"},subType:"Generisk data"},{id:"948d76d5-9045-4bba-88e9-ffbddfd933a8",name:"Tæppe gulvbelægning (tykkelse 0.006 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-",C3:"404.533",C4:"-",D:"-160.441"}},conversions:{kg:{to:"kg",value:"1.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/76ab64f6-6d08-4b67-8cd7-13d26e68d95a?version=20.20.010"},subType:"Generisk data"},{id:"9fc344c7-917b-4fff-a0b1-7cc02610a378",name:"Kobberrør (blank)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"0.00136414",C4:"-",D:"-114.005"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/55e5f6b9-224f-4938-8ae7-5495fade6f19?version=20.19.120"},subType:"Generisk data"},{id:"80d7da2f-96ba-405a-a4bc-dd65e5c4b87f",name:"Kobberrør (coatede)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"0.00136414",C4:"-",D:"-140.501"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5c82c3cf-7c88-441f-b430-a815501d06e1?version=20.19.120"},subType:"Generisk data"},{id:"22b566ec-1930-405d-9dde-b2dbcc1be0fb",name:"Enfamiliehuse. afløb",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.00863",C3:"0.01137",C4:"-",D:"-0.00562"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi"},{id:"bec44243-61de-4465-9450-e2ff6f352cf7",name:"Enfamiliehuse. vand",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.04831",C3:"0.01169",C4:"-",D:"-0.0294"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi"},{id:"44b5a12d-11f0-4b82-9ad1-cf2796abeb79",name:"Enfamiliehuse. varme. ventilation og køl",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.49399",C3:"0.10567",C4:"0.00034",D:"-0.1975"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi"},{id:"98569cdf-0635-48df-8ca6-f1230292e399",name:"Rækkehuse. afløb",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.0414",C3:"0.0486",C4:"-",D:"-0.0205"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi"},{id:"35829214-e46b-4037-8374-2a2e69a5371b",name:"Rækkehuse. vand",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.0244",C3:"0.0156",C4:"-",D:"-0.0123"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi"},{id:"dd14f056-57dd-4a71-9dbb-cb5aa7c0a9cb",name:"Rækkehuse. varme. ventilation og køl",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.44844",C3:"0.0641",C4:"0.00027",D:"-0.2035"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Wood Link Standard"}},{id:"31652caa-6b04-4b39-86e6-482b4bd26416",name:"Etageboliger. afløb",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.054",C3:"0.066",C4:"-",D:"-0.0324"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Wood Facade Link Standard"}},{id:"4d0ef38d-b47e-4d10-be49-d8c24a6ebfe2",name:"Etageboliger. vand",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.0522",C3:"0.0078",C4:"-",D:"-0.0282"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Windows Link Standard"}},{id:"c9eb9a0e-372d-47dc-8428-13bb0697b3b7",name:"Etageboliger.varme. ventilation og køl",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.4335",C3:"0.0765",C4:"-",D:"-0.1683"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Steel Link Standard"}},{id:"d9cab14f-d708-49d4-9605-810a69b96eb1",name:"Kontor. skoler og daginstitutioner. afløb",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.018",C3:"0.022",C4:"-",D:"-0.0108"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Roof Link Standard"}},{id:"89e2c27d-e240-4b17-b590-e61701f653dd",name:"Kontor. skoler og daginstitutioner. vand",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.048",C3:"0.012",C4:"-",D:"-0.0192"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Metal Facades Link Standard"}},{id:"fce38f39-ff71-4a3b-9050-c64f37803d2d",name:"Kontor. skoler og daginstitutioner. varme. ventilation og køl",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.7224",C3:"0.1176",C4:"-",D:"-0.3528"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Gypsum Link Standard"}},{id:"00fb66f3-39e7-437a-86dc-a355fbbf248e",name:"Øvrige bygninger. afløb",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.0225",C3:"0.0275",C4:"-",D:"-0.0135"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Floor Link Standard"}},{id:"cc8a21ec-1813-4055-a108-2be8a3f07fa6",name:"Øvrige bygninger. vand",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.064",C3:"0.016",C4:"-",D:"-0.0256"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Concrete Link Standard"}},{id:"1383f0f9-d75c-4372-b690-5e44779f1618",name:"Øvrige bygninger. varme. ventilation og køl",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.9374",C3:"0.1526",C4:"-",D:"-0.4578"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Bricks Link Standard"}}],Tl=h0({id:"materialStore",state:()=>({materials:[],assemblies:[],currentMapping:null,currentAssemby:null,sorting:{parameter:"name",direction:"asc"},EPDMode:!0,EPDList:[],assemblyList:[],paramFilters:{matParam:[],subParam:[],unitParam:[]},sortingParameters:[{filterName:"name",displayName:"Name",paramName:null},{filterName:"subType",displayName:"EPD Type",paramName:"subParam"},{filterName:"materialType",displayName:"Material Type",paramName:"matParam"},{filterName:"declared_unit",displayName:"Declared Unit",paramName:"unitParam"}],mapping:null}),actions:{addMaterial(t){this.materials.push(t),this.updateParameters()},addMaterialList(t){this.materials=t,this.updateParameters()},removeMaterial(t){const e=this.materials.indexOf(t);e!==-1&&this.materials.splice(e,1)},addAssembly(t){const e=this.assemblies.findIndex(n=>n.id===t.id);e!==-1?this.assemblies[e]=t:this.assemblies.push(t)},removeAssembly(t){const e=this.assemblies.indexOf(t);e!==-1&&this.assemblies.splice(e,1)},setCurrentMapping(t){this.currentMapping=t},setCurrentAssembly(t){this.currentAssemby=t},setFilteredMaterials(t){this.EPDList=t},getCurrentMapping(){return this.mapping},async materialsFromJson(){try{this.materials=nUe.map(t=>{var e;return{...t,metaData:{materialType:t.materialType,Collection:((e=t==null?void 0:t.metaData)==null?void 0:e.Collection)??"-"},source:dy.LCAbyg}}),this.EPDList=this.materials,this.updateParameters()}catch(t){console.error("Error fetching JSON:",t)}},updateParameters(){const t=Array.from(new Set(this.materials.map(n=>{var r;return(r=n.metaData)==null?void 0:r.materialType}))).filter(Boolean),e=Array.from(new Set(this.materials.map(n=>n.unit))).filter(Boolean);this.paramFilters.matParam=t.map(n=>({name:n,selected:!1,filterParamter:"metaData.materialType"})),this.paramFilters.unitParam=e.map(n=>({name:n,selected:!1,filterParamter:"unit"}))},setSorting(t,e){const n={parameter:t,direction:e};this.sorting=n,this.sortList()},triggerParamSort(){if(this.EPDMode===!0){this.EPDList=this.materials,this.sortList();for(const t in this.paramFilters)if(this.paramFilters[t].some(e=>e.selected))this.EPDList=hte(this.EPDList,this.paramFilters[t]);else continue}else this.assemblyList=this.assemblyList.filter(t=>Object.values(t.products).some(e=>{for(const n in this.paramFilters){if(!this.paramFilters[n].some(i=>i.selected))continue;if(hte([e],this.paramFilters[n]).length>0)return!0}return!1}))},resetSorting(){this.sorting={parameter:"name",direction:"asc"}},sortList(){const{parameter:t,direction:e}=this.sorting;this.EPDList.sort((n,r)=>n[t]r[t]?e==="asc"?1:-1:0)},setMapping(t){this.mapping=t},updateMappingMaterial(t,e){this.mapping||(this.mapping={id:crypto.randomUUID(),name:"temp",filters:[],steps:[]});const n=this.mapping.steps.findIndex(r=>r.nestedGroupId===t);n!==-1&&(this.mapping.steps[n].material=e)},removeMappingMaterial(t){const e=this.mapping.steps.findIndex(n=>n.nestedGroupId===t);e!==-1&&this.mapping.steps.splice(e,1)},addStep(t,e,n){var r;(r=this.mapping)==null||r.steps.push({filterId:n,nestedGroupId:t.id,material:e})}}}),rUe=` +`));let h=Vle((a=d.props)!=null?a:{},l,c),p=Cu(d,h,!0);for(let m in h)m.startsWith("on")&&(p.props||(p.props={}),p.props[m]=h[m]);return p}return Array.isArray(u)&&u.length===1?u[0]:u}return An(o,Object.assign({},l,c),{default:()=>u})}function Rle(t){return t.flatMap(e=>e.type===Ct?Rle(e.children):[e])}function Vle(...t){if(t.length===0)return{};if(t.length===1)return t[0];let e={},n={};for(let r of t)for(let i in r)i.startsWith("on")&&typeof r[i]=="function"?(n[i]!=null||(n[i]=[]),n[i].push(r[i])):e[i]=r[i];if(e.disabled||e["aria-disabled"])return Object.assign(e,Object.fromEntries(Object.keys(n).map(r=>[r,void 0])));for(let r in n)Object.assign(e,{[r](i,...s){let a=n[r];for(let o of a){if(i instanceof Event&&i.defaultPrevented)return;o(i,...s)}}});return e}function Mze(t){let e=Object.assign({},t);for(let n in e)e[n]===void 0&&delete e[n];return e}function _C(t,e=[]){let n=Object.assign({},t);for(let r of e)r in n&&delete n[r];return n}function Pze(t){return t==null?!1:typeof t.type=="string"||typeof t.type=="object"||typeof t.type=="function"}var bf=(t=>(t[t.None=1]="None",t[t.Focusable=2]="Focusable",t[t.Hidden=4]="Hidden",t))(bf||{});let Op=pt({name:"Hidden",props:{as:{type:[Object,String],default:"div"},features:{type:Number,default:1}},setup(t,{slots:e,attrs:n}){return()=>{var r;let{features:i,...s}=t,a={"aria-hidden":(i&2)===2?!0:(r=s["aria-hidden"])!=null?r:void 0,hidden:(i&4)===4?!0:void 0,style:{position:"fixed",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...(i&4)===4&&(i&2)!==2&&{display:"none"}}};return Wi({ourProps:a,theirProps:s,slot:{},attrs:n,slots:e,name:"Hidden"})}}}),zle=Symbol("Context");var ni=(t=>(t[t.Open=1]="Open",t[t.Closed=2]="Closed",t[t.Closing=4]="Closing",t[t.Opening=8]="Opening",t))(ni||{});function Rze(){return uy()!==null}function uy(){return cr(zle,null)}function RV(t){Zi(zle,t)}var nr=(t=>(t.Space=" ",t.Enter="Enter",t.Escape="Escape",t.Backspace="Backspace",t.Delete="Delete",t.ArrowLeft="ArrowLeft",t.ArrowUp="ArrowUp",t.ArrowRight="ArrowRight",t.ArrowDown="ArrowDown",t.Home="Home",t.End="End",t.PageUp="PageUp",t.PageDown="PageDown",t.Tab="Tab",t))(nr||{});function Vze(t){function e(){document.readyState!=="loading"&&(t(),document.removeEventListener("DOMContentLoaded",e))}typeof window<"u"&&typeof document<"u"&&(document.addEventListener("DOMContentLoaded",e),e())}let sv=[];Vze(()=>{function t(e){e.target instanceof HTMLElement&&e.target!==document.body&&sv[0]!==e.target&&(sv.unshift(e.target),sv=sv.filter(n=>n!=null&&n.isConnected),sv.splice(10))}window.addEventListener("click",t,{capture:!0}),window.addEventListener("mousedown",t,{capture:!0}),window.addEventListener("focus",t,{capture:!0}),document.body.addEventListener("click",t,{capture:!0}),document.body.addEventListener("mousedown",t,{capture:!0}),document.body.addEventListener("focus",t,{capture:!0})});function zze(t){throw new Error("Unexpected object: "+t)}var sl=(t=>(t[t.First=0]="First",t[t.Previous=1]="Previous",t[t.Next=2]="Next",t[t.Last=3]="Last",t[t.Specific=4]="Specific",t[t.Nothing=5]="Nothing",t))(sl||{});function kze(t,e){let n=e.resolveItems();if(n.length<=0)return null;let r=e.resolveActiveIndex(),i=r??-1;switch(t.focus){case 0:{for(let s=0;s=0;--s)if(!e.resolveDisabled(n[s],s,n))return s;return r}case 2:{for(let s=i+1;s=0;--s)if(!e.resolveDisabled(n[s],s,n))return s;return r}case 4:{for(let s=0;s{t=t??window,t.addEventListener(e,n,r),i(()=>t.removeEventListener(e,n,r))})}var al=(t=>(t[t.Forwards=0]="Forwards",t[t.Backwards=1]="Backwards",t))(al||{});function eK(){let t=ze(0);return Ple("keydown",e=>{e.key==="Tab"&&(t.value=e.shiftKey?1:0)}),t}function kle(t){if(!t)return new Set;if(typeof t=="function")return new Set(t());let e=new Set;for(let n of t.value){let r=mt(n);r instanceof HTMLElement&&e.add(r)}return e}var Ole=(t=>(t[t.None=1]="None",t[t.InitialFocus=2]="InitialFocus",t[t.TabLock=4]="TabLock",t[t.FocusLock=8]="FocusLock",t[t.RestoreFocus=16]="RestoreFocus",t[t.All=30]="All",t))(Ole||{});let SS=Object.assign(pt({name:"FocusTrap",props:{as:{type:[Object,String],default:"div"},initialFocus:{type:Object,default:null},features:{type:Number,default:30},containers:{type:[Object,Function],default:ze(new Set)}},inheritAttrs:!1,setup(t,{attrs:e,slots:n,expose:r}){let i=ze(null);r({el:i,$el:i});let s=et(()=>_l(i)),a=ze(!1);_n(()=>a.value=!0),ls(()=>a.value=!1),Uze({ownerDocument:s},et(()=>a.value&&!!(t.features&16)));let o=Nze({ownerDocument:s,container:i,initialFocus:et(()=>t.initialFocus)},et(()=>a.value&&!!(t.features&2)));Lze({ownerDocument:s,container:i,containers:t.containers,previousActiveElement:o},et(()=>a.value&&!!(t.features&8)));let l=eK();function u(h){let p=mt(i);p&&(m=>m())(()=>{Rs(l.value,{[al.Forwards]:()=>{Wl(p,Xs.First,{skipElements:[h.relatedTarget]})},[al.Backwards]:()=>{Wl(p,Xs.Last,{skipElements:[h.relatedTarget]})}})})}let c=ze(!1);function d(h){h.key==="Tab"&&(c.value=!0,requestAnimationFrame(()=>{c.value=!1}))}function f(h){if(!a.value)return;let p=kle(t.containers);mt(i)instanceof HTMLElement&&p.add(mt(i));let m=h.relatedTarget;m instanceof HTMLElement&&m.dataset.headlessuiFocusGuard!=="true"&&(Ile(p,m)||(c.value?Wl(mt(i),Rs(l.value,{[al.Forwards]:()=>Xs.Next,[al.Backwards]:()=>Xs.Previous})|Xs.WrapAround,{relativeTo:h.target}):h.target instanceof HTMLElement&&cp(h.target)))}return()=>{let h={},p={ref:i,onKeydown:d,onFocusout:f},{features:m,initialFocus:v,containers:g,...b}=t;return An(Ct,[!!(m&4)&&An(Op,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:u,features:bf.Focusable}),Wi({ourProps:p,theirProps:{...e,...b},slot:h,attrs:e,slots:n,name:"FocusTrap"}),!!(m&4)&&An(Op,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:u,features:bf.Focusable})])}}}),{features:Ole});function Ize(t){let e=ze(sv.slice());return jt([t],([n],[r])=>{r===!0&&n===!1?HC(()=>{e.value.splice(0)}):r===!1&&n===!0&&(e.value=sv.slice())},{flush:"post"}),()=>{var n;return(n=e.value.find(r=>r!=null&&r.isConnected))!=null?n:null}}function Uze({ownerDocument:t},e){let n=Ize(e);_n(()=>{Ps(()=>{var r,i;e.value||((r=t.value)==null?void 0:r.activeElement)===((i=t.value)==null?void 0:i.body)&&cp(n())},{flush:"post"})}),ls(()=>{e.value&&cp(n())})}function Nze({ownerDocument:t,container:e,initialFocus:n},r){let i=ze(null),s=ze(!1);return _n(()=>s.value=!0),ls(()=>s.value=!1),_n(()=>{jt([e,n,r],(a,o)=>{if(a.every((u,c)=>(o==null?void 0:o[c])===u)||!r.value)return;let l=mt(e);l&&HC(()=>{var u,c;if(!s.value)return;let d=mt(n),f=(u=t.value)==null?void 0:u.activeElement;if(d){if(d===f){i.value=f;return}}else if(l.contains(f)){i.value=f;return}d?cp(d):Wl(l,Xs.First|Xs.NoScroll)===e6.Error&&console.warn("There are no focusable elements inside the "),i.value=(c=t.value)==null?void 0:c.activeElement})},{immediate:!0,flush:"post"})}),i}function Lze({ownerDocument:t,container:e,containers:n,previousActiveElement:r},i){var s;$C((s=t.value)==null?void 0:s.defaultView,"focus",a=>{if(!i.value)return;let o=kle(n);mt(e)instanceof HTMLElement&&o.add(mt(e));let l=r.value;if(!l)return;let u=a.target;u&&u instanceof HTMLElement?Ile(o,u)?(r.value=u,cp(u)):(a.preventDefault(),a.stopPropagation(),cp(l)):cp(r.value)},!0)}function Ile(t,e){for(let n of t)if(n.contains(e))return!0;return!1}function Xze(t){let e=c0(t.getSnapshot());return ls(t.subscribe(()=>{e.value=t.getSnapshot()})),e}function Cze(t,e){let n=t(),r=new Set;return{getSnapshot(){return n},subscribe(i){return r.add(i),()=>r.delete(i)},dispatch(i,...s){let a=e[i].call(n,...s);a&&(n=a,r.forEach(o=>o()))}}}function Kze(){let t;return{before({doc:e}){var n;let r=e.documentElement;t=((n=e.defaultView)!=null?n:window).innerWidth-r.clientWidth},after({doc:e,d:n}){let r=e.documentElement,i=r.clientWidth-r.offsetWidth,s=t-i;n.style(r,"paddingRight",`${s}px`)}}}function qze(){return Mle()?{before({doc:t,d:e,meta:n}){function r(i){return n.containers.flatMap(s=>s()).some(s=>s.contains(i))}e.microTask(()=>{var i;if(window.getComputedStyle(t.documentElement).scrollBehavior!=="auto"){let o=hT();o.style(t.documentElement,"scrollBehavior","auto"),e.add(()=>e.microTask(()=>o.dispose()))}let s=(i=window.scrollY)!=null?i:window.pageYOffset,a=null;e.addEventListener(t,"click",o=>{if(o.target instanceof HTMLElement)try{let l=o.target.closest("a");if(!l)return;let{hash:u}=new URL(l.href),c=t.querySelector(u);c&&!r(c)&&(a=c)}catch{}},!0),e.addEventListener(t,"touchstart",o=>{if(o.target instanceof HTMLElement)if(r(o.target)){let l=o.target;for(;l.parentElement&&r(l.parentElement);)l=l.parentElement;e.style(l,"overscrollBehavior","contain")}else e.style(o.target,"touchAction","none")}),e.addEventListener(t,"touchmove",o=>{if(o.target instanceof HTMLElement){if(o.target.tagName==="INPUT")return;if(r(o.target)){let l=o.target;for(;l.parentElement&&l.dataset.headlessuiPortal!==""&&!(l.scrollHeight>l.clientHeight||l.scrollWidth>l.clientWidth);)l=l.parentElement;l.dataset.headlessuiPortal===""&&o.preventDefault()}else o.preventDefault()}},{passive:!1}),e.add(()=>{var o;let l=(o=window.scrollY)!=null?o:window.pageYOffset;s!==l&&window.scrollTo(0,s),a&&a.isConnected&&(a.scrollIntoView({block:"nearest"}),a=null)})})}}:{}}function Dze(){return{before({doc:t,d:e}){e.style(t.documentElement,"overflow","hidden")}}}function Wze(t){let e={};for(let n of t)Object.assign(e,n(e));return e}let uv=Cze(()=>new Map,{PUSH(t,e){var n;let r=(n=this.get(t))!=null?n:{doc:t,count:0,d:hT(),meta:new Set};return r.count++,r.meta.add(e),this.set(t,r),this},POP(t,e){let n=this.get(t);return n&&(n.count--,n.meta.delete(e)),this},SCROLL_PREVENT({doc:t,d:e,meta:n}){let r={doc:t,d:e,meta:Wze(n)},i=[qze(),Kze(),Dze()];i.forEach(({before:s})=>s==null?void 0:s(r)),i.forEach(({after:s})=>s==null?void 0:s(r))},SCROLL_ALLOW({d:t}){t.dispose()},TEARDOWN({doc:t}){this.delete(t)}});uv.subscribe(()=>{let t=uv.getSnapshot(),e=new Map;for(let[n]of t)e.set(n,n.documentElement.style.overflow);for(let n of t.values()){let r=e.get(n.doc)==="hidden",i=n.count!==0;(i&&!r||!i&&r)&&uv.dispatch(n.count>0?"SCROLL_PREVENT":"SCROLL_ALLOW",n),n.count===0&&uv.dispatch("TEARDOWN",n)}});function Aze(t,e,n){let r=Xze(uv),i=et(()=>{let s=t.value?r.value.get(t.value):void 0;return s?s.count>0:!1});return jt([t,e],([s,a],[o],l)=>{if(!s||!a)return;uv.dispatch("PUSH",s,n);let u=!1;l(()=>{u||(uv.dispatch("POP",o??s,n),u=!0)})},{immediate:!0}),i}let nk=new Map,xS=new Map;function Gj(t,e=ze(!0)){Ps(n=>{var r;if(!e.value)return;let i=mt(t);if(!i)return;n(function(){var a;if(!i)return;let o=(a=xS.get(i))!=null?a:1;if(o===1?xS.delete(i):xS.set(i,o-1),o!==1)return;let l=nk.get(i);l&&(l["aria-hidden"]===null?i.removeAttribute("aria-hidden"):i.setAttribute("aria-hidden",l["aria-hidden"]),i.inert=l.inert,nk.delete(i))});let s=(r=xS.get(i))!=null?r:0;xS.set(i,s+1),s===0&&(nk.set(i,{"aria-hidden":i.getAttribute("aria-hidden"),inert:i.inert}),i.setAttribute("aria-hidden","true"),i.inert=!0)})}function Ule({defaultContainers:t=[],portals:e,mainTreeNodeRef:n}={}){let r=ze(null),i=_l(r);function s(){var a,o,l;let u=[];for(let c of t)c!==null&&(c instanceof HTMLElement?u.push(c):"value"in c&&c.value instanceof HTMLElement&&u.push(c.value));if(e!=null&&e.value)for(let c of e.value)u.push(c);for(let c of(a=i==null?void 0:i.querySelectorAll("html > *, body > *"))!=null?a:[])c!==document.body&&c!==document.head&&c instanceof HTMLElement&&c.id!=="headlessui-portal-root"&&(c.contains(mt(r))||c.contains((l=(o=mt(r))==null?void 0:o.getRootNode())==null?void 0:l.host)||u.some(d=>c.contains(d))||u.push(c));return u}return{resolveContainers:s,contains(a){return s().some(o=>o.contains(a))},mainTreeNodeRef:r,MainTreeNode(){return n!=null?null:An(Op,{features:bf.Hidden,ref:r})}}}function Gze(){let t=ze(null);return{mainTreeNodeRef:t,MainTreeNode(){return An(Op,{features:bf.Hidden,ref:t})}}}let Nle=Symbol("ForcePortalRootContext");function Fze(){return cr(Nle,!1)}let Fj=pt({name:"ForcePortalRoot",props:{as:{type:[Object,String],default:"template"},force:{type:Boolean,default:!1}},setup(t,{slots:e,attrs:n}){return Zi(Nle,t.force),()=>{let{force:r,...i}=t;return Wi({theirProps:i,ourProps:{},slot:{},slots:e,attrs:n,name:"ForcePortalRoot"})}}}),Lle=Symbol("StackContext");var dL=(t=>(t[t.Add=0]="Add",t[t.Remove=1]="Remove",t))(dL||{});function jze(){return cr(Lle,()=>{})}function Zze({type:t,enabled:e,element:n,onUpdate:r}){let i=jze();function s(...a){r==null||r(...a),i(...a)}_n(()=>{jt(e,(a,o)=>{a?s(0,t,n):o===!0&&s(1,t,n)},{immediate:!0,flush:"sync"})}),ls(()=>{e.value&&s(1,t,n)}),Zi(Lle,s)}let Jze=Symbol("DescriptionContext");function Yze({slot:t=ze({}),name:e="Description",props:n={}}={}){let r=ze([]);function i(s){return r.value.push(s),()=>{let a=r.value.indexOf(s);a!==-1&&r.value.splice(a,1)}}return Zi(Jze,{register:i,slot:t,name:e,props:n}),et(()=>r.value.length>0?r.value.join(" "):void 0)}function Bze(t){let e=_l(t);if(!e){if(t===null)return null;throw new Error(`[Headless UI]: Cannot find ownerDocument for contextElement: ${t}`)}let n=e.getElementById("headlessui-portal-root");if(n)return n;let r=e.createElement("div");return r.setAttribute("id","headlessui-portal-root"),e.body.appendChild(r)}const fL=new WeakMap;function Hze(t){var e;return(e=fL.get(t))!=null?e:0}function jj(t,e){let n=e(Hze(t));return n<=0?fL.delete(t):fL.set(t,n),n}let Qze=pt({name:"Portal",props:{as:{type:[Object,String],default:"div"}},setup(t,{slots:e,attrs:n}){let r=ze(null),i=et(()=>_l(r)),s=Fze(),a=cr(Cle,null),o=ze(s===!0||a==null?Bze(r.value):a.resolveTarget());o.value&&jj(o.value,f=>f+1);let l=ze(!1);_n(()=>{l.value=!0}),Ps(()=>{s||a!=null&&(o.value=a.resolveTarget())});let u=cr(hL,null),c=!1,d=Go();return jt(r,()=>{if(c||!u)return;let f=mt(r);f&&(ls(u.register(f),d),c=!0)}),ls(()=>{var f,h;let p=(f=i.value)==null?void 0:f.getElementById("headlessui-portal-root");!p||o.value!==p||jj(o.value,m=>m-1)||o.value.children.length>0||(h=o.value.parentElement)==null||h.removeChild(o.value)}),()=>{if(!l.value||o.value===null)return null;let f={ref:r,"data-headlessui-portal":""};return An(yie,{to:o.value},Wi({ourProps:f,theirProps:t,slot:{},attrs:n,slots:e,name:"Portal"}))}}}),hL=Symbol("PortalParentContext");function Xle(){let t=cr(hL,null),e=ze([]);function n(s){return e.value.push(s),t&&t.register(s),()=>r(s)}function r(s){let a=e.value.indexOf(s);a!==-1&&e.value.splice(a,1),t&&t.unregister(s)}let i={register:n,unregister:r,portals:e};return[e,pt({name:"PortalWrapper",setup(s,{slots:a}){return Zi(hL,i),()=>{var o;return(o=a.default)==null?void 0:o.call(a)}}})]}let Cle=Symbol("PortalGroupContext"),_ze=pt({name:"PortalGroup",props:{as:{type:[Object,String],default:"template"},target:{type:Object,default:null}},setup(t,{attrs:e,slots:n}){let r=Ao({resolveTarget(){return t.target}});return Zi(Cle,r),()=>{let{target:i,...s}=t;return Wi({theirProps:s,ourProps:{},slot:{},attrs:e,slots:n,name:"PortalGroup"})}}});var $ze=(t=>(t[t.Open=0]="Open",t[t.Closed=1]="Closed",t))($ze||{});let pL=Symbol("DialogContext");function tK(t){let e=cr(pL,null);if(e===null){let n=new Error(`<${t} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,tK),n}return e}let d2="DC8F892D-2EBD-447C-A4C8-A03058436FF4",_p=pt({name:"Dialog",inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},open:{type:[Boolean,String],default:d2},initialFocus:{type:Object,default:null},id:{type:String,default:null},role:{type:String,default:"dialog"}},emits:{close:t=>!0},setup(t,{emit:e,attrs:n,slots:r,expose:i}){var s,a;let o=(s=t.id)!=null?s:`headlessui-dialog-${ro()}`,l=ze(!1);_n(()=>{l.value=!0});let u=!1,c=et(()=>t.role==="dialog"||t.role==="alertdialog"?t.role:(u||(u=!0,console.warn(`Invalid role [${c}] passed to . Only \`dialog\` and and \`alertdialog\` are supported. Using \`dialog\` instead.`)),"dialog")),d=ze(0),f=uy(),h=et(()=>t.open===d2&&f!==null?(f.value&ni.Open)===ni.Open:t.open),p=ze(null),m=et(()=>_l(p));if(i({el:p,$el:p}),!(t.open!==d2||f!==null))throw new Error("You forgot to provide an `open` prop to the `Dialog`.");if(typeof h.value!="boolean")throw new Error(`You provided an \`open\` prop to the \`Dialog\`, but the value is not a boolean. Received: ${h.value===d2?void 0:t.open}`);let v=et(()=>l.value&&h.value?0:1),g=et(()=>v.value===0),b=et(()=>d.value>1),y=cr(pL,null)!==null,[x,T]=Xle(),{resolveContainers:M,mainTreeNodeRef:E,MainTreeNode:S}=Ule({portals:x,defaultContainers:[et(()=>{var j;return(j=A.panelRef.value)!=null?j:p.value})]}),P=et(()=>b.value?"parent":"leaf"),R=et(()=>f!==null?(f.value&ni.Closing)===ni.Closing:!1),V=et(()=>y||R.value?!1:g.value),z=et(()=>{var j,Z,_;return(_=Array.from((Z=(j=m.value)==null?void 0:j.querySelectorAll("body > *"))!=null?Z:[]).find(le=>le.id==="headlessui-portal-root"?!1:le.contains(mt(E))&&le instanceof HTMLElement))!=null?_:null});Gj(z,V);let k=et(()=>b.value?!0:g.value),N=et(()=>{var j,Z,_;return(_=Array.from((Z=(j=m.value)==null?void 0:j.querySelectorAll("[data-headlessui-portal]"))!=null?Z:[]).find(le=>le.contains(mt(E))&&le instanceof HTMLElement))!=null?_:null});Gj(N,k),Zze({type:"Dialog",enabled:et(()=>v.value===0),element:p,onUpdate:(j,Z)=>{if(Z==="Dialog")return Rs(j,{[dL.Add]:()=>d.value+=1,[dL.Remove]:()=>d.value-=1})}});let q=Yze({name:"DialogDescription",slot:et(()=>({open:h.value}))}),L=ze(null),A={titleId:L,panelRef:ze(null),dialogState:v,setTitleId(j){L.value!==j&&(L.value=j)},close(){e("close",!1)}};Zi(pL,A);let J=et(()=>!(!g.value||b.value));QC(M,(j,Z)=>{j.preventDefault(),A.close(),Ia(()=>Z==null?void 0:Z.focus())},J);let F=et(()=>!(b.value||v.value!==0));$C((a=m.value)==null?void 0:a.defaultView,"keydown",j=>{F.value&&(j.defaultPrevented||j.key===nr.Escape&&(j.preventDefault(),j.stopPropagation(),A.close()))});let ne=et(()=>!(R.value||v.value!==0||y));return Aze(m,ne,j=>{var Z;return{containers:[...(Z=j.containers)!=null?Z:[],M]}}),Ps(j=>{if(v.value!==0)return;let Z=mt(p);if(!Z)return;let _=new ResizeObserver(le=>{for(let fe of le){let te=fe.target.getBoundingClientRect();te.x===0&&te.y===0&&te.width===0&&te.height===0&&A.close()}});_.observe(Z),j(()=>_.disconnect())}),()=>{let{open:j,initialFocus:Z,..._}=t,le={...n,ref:p,id:o,role:c.value,"aria-modal":v.value===0?!0:void 0,"aria-labelledby":L.value,"aria-describedby":q.value},fe={open:v.value===0};return An(Fj,{force:!0},()=>[An(Qze,()=>An(_ze,{target:p.value},()=>An(Fj,{force:!1},()=>An(SS,{initialFocus:Z,containers:M,features:g.value?Rs(P.value,{parent:SS.features.RestoreFocus,leaf:SS.features.All&~SS.features.FocusLock}):SS.features.None},()=>An(T,{},()=>Wi({ourProps:le,theirProps:{..._,...n},slot:fe,attrs:n,slots:r,visible:v.value===0,features:_c.RenderStrategy|_c.Static,name:"Dialog"})))))),An(S)])}}}),g0=pt({name:"DialogPanel",props:{as:{type:[Object,String],default:"div"},id:{type:String,default:null}},setup(t,{attrs:e,slots:n,expose:r}){var i;let s=(i=t.id)!=null?i:`headlessui-dialog-panel-${ro()}`,a=tK("DialogPanel");r({el:a.panelRef,$el:a.panelRef});function o(l){l.stopPropagation()}return()=>{let{...l}=t,u={id:s,ref:a.panelRef,onClick:o};return Wi({ourProps:u,theirProps:l,slot:{open:a.dialogState.value===0},attrs:e,slots:n,name:"DialogPanel"})}}}),eke=pt({name:"DialogTitle",props:{as:{type:[Object,String],default:"h2"},id:{type:String,default:null}},setup(t,{attrs:e,slots:n}){var r;let i=(r=t.id)!=null?r:`headlessui-dialog-title-${ro()}`,s=tK("DialogTitle");return _n(()=>{s.setTitleId(i),ls(()=>s.setTitleId(null))}),()=>{let{...a}=t;return Wi({ourProps:{id:i},theirProps:a,slot:{open:s.dialogState.value===0},attrs:e,slots:n,name:"DialogTitle"})}}});var tke=(t=>(t[t.Open=0]="Open",t[t.Closed=1]="Closed",t))(tke||{});let Kle=Symbol("DisclosureContext");function nK(t){let e=cr(Kle,null);if(e===null){let n=new Error(`<${t} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,nK),n}return e}let qle=Symbol("DisclosurePanelContext");function nke(){return cr(qle,null)}let rke=pt({name:"Disclosure",props:{as:{type:[Object,String],default:"template"},defaultOpen:{type:[Boolean],default:!1}},setup(t,{slots:e,attrs:n}){let r=ze(t.defaultOpen?0:1),i=ze(null),s=ze(null),a={buttonId:ze(`headlessui-disclosure-button-${ro()}`),panelId:ze(`headlessui-disclosure-panel-${ro()}`),disclosureState:r,panel:i,button:s,toggleDisclosure(){r.value=Rs(r.value,{0:1,1:0})},closeDisclosure(){r.value!==1&&(r.value=1)},close(o){a.closeDisclosure();let l=(()=>o?o instanceof HTMLElement?o:o.value instanceof HTMLElement?mt(o):mt(a.button):mt(a.button))();l==null||l.focus()}};return Zi(Kle,a),RV(et(()=>Rs(r.value,{0:ni.Open,1:ni.Closed}))),()=>{let{defaultOpen:o,...l}=t,u={open:r.value===0,close:a.close};return Wi({theirProps:l,ourProps:{},slot:u,slots:e,attrs:n,name:"Disclosure"})}}}),ike=pt({name:"DisclosureButton",props:{as:{type:[Object,String],default:"button"},disabled:{type:[Boolean],default:!1},id:{type:String,default:null}},setup(t,{attrs:e,slots:n,expose:r}){let i=nK("DisclosureButton"),s=nke(),a=et(()=>s===null?!1:s.value===i.panelId.value);_n(()=>{a.value||t.id!==null&&(i.buttonId.value=t.id)}),ls(()=>{a.value||(i.buttonId.value=null)});let o=ze(null);r({el:o,$el:o}),a.value||Ps(()=>{i.button.value=o.value});let l=PV(et(()=>({as:t.as,type:e.type})),o);function u(){var f;t.disabled||(a.value?(i.toggleDisclosure(),(f=mt(i.button))==null||f.focus()):i.toggleDisclosure())}function c(f){var h;if(!t.disabled)if(a.value)switch(f.key){case nr.Space:case nr.Enter:f.preventDefault(),f.stopPropagation(),i.toggleDisclosure(),(h=mt(i.button))==null||h.focus();break}else switch(f.key){case nr.Space:case nr.Enter:f.preventDefault(),f.stopPropagation(),i.toggleDisclosure();break}}function d(f){switch(f.key){case nr.Space:f.preventDefault();break}}return()=>{var f;let h={open:i.disclosureState.value===0},{id:p,...m}=t,v=a.value?{ref:o,type:l.value,onClick:u,onKeydown:c}:{id:(f=i.buttonId.value)!=null?f:p,ref:o,type:l.value,"aria-expanded":i.disclosureState.value===0,"aria-controls":i.disclosureState.value===0||mt(i.panel)?i.panelId.value:void 0,disabled:t.disabled?!0:void 0,onClick:u,onKeydown:c,onKeyup:d};return Wi({ourProps:v,theirProps:m,slot:h,attrs:e,slots:n,name:"DisclosureButton"})}}}),ske=pt({name:"DisclosurePanel",props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:null}},setup(t,{attrs:e,slots:n,expose:r}){let i=nK("DisclosurePanel");_n(()=>{t.id!==null&&(i.panelId.value=t.id)}),ls(()=>{i.panelId.value=null}),r({el:i.panel,$el:i.panel}),Zi(qle,i.panelId);let s=uy(),a=et(()=>s!==null?(s.value&ni.Open)===ni.Open:i.disclosureState.value===0);return()=>{var o;let l={open:i.disclosureState.value===0,close:i.close},{id:u,...c}=t,d={id:(o=i.panelId.value)!=null?o:u,ref:i.panel};return Wi({ourProps:d,theirProps:c,slot:l,attrs:e,slots:n,features:_c.RenderStrategy|_c.Static,visible:a.value,name:"DisclosurePanel"})}}}),Zj=/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g;function Jj(t){var e,n;let r=(e=t.innerText)!=null?e:"",i=t.cloneNode(!0);if(!(i instanceof HTMLElement))return r;let s=!1;for(let o of i.querySelectorAll('[hidden],[aria-hidden],[role="img"]'))o.remove(),s=!0;let a=s?(n=i.innerText)!=null?n:"":r;return Zj.test(a)&&(a=a.replace(Zj,"")),a}function ake(t){let e=t.getAttribute("aria-label");if(typeof e=="string")return e.trim();let n=t.getAttribute("aria-labelledby");if(n){let r=n.split(" ").map(i=>{let s=document.getElementById(i);if(s){let a=s.getAttribute("aria-label");return typeof a=="string"?a.trim():Jj(s).trim()}return null}).filter(Boolean);if(r.length>0)return r.join(", ")}return Jj(t).trim()}function oke(t){let e=ze(""),n=ze("");return()=>{let r=mt(t);if(!r)return"";let i=r.innerText;if(e.value===i)return n.value;let s=ake(r).trim().toLowerCase();return e.value=i,n.value=s,s}}var lke=(t=>(t[t.Open=0]="Open",t[t.Closed=1]="Closed",t))(lke||{}),uke=(t=>(t[t.Pointer=0]="Pointer",t[t.Other=1]="Other",t))(uke||{});function cke(t){requestAnimationFrame(()=>requestAnimationFrame(t))}let Dle=Symbol("MenuContext");function VV(t){let e=cr(Dle,null);if(e===null){let n=new Error(`<${t} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,VV),n}return e}let Wle=pt({name:"Menu",props:{as:{type:[Object,String],default:"template"}},setup(t,{slots:e,attrs:n}){let r=ze(1),i=ze(null),s=ze(null),a=ze([]),o=ze(""),l=ze(null),u=ze(1);function c(f=h=>h){let h=l.value!==null?a.value[l.value]:null,p=Ele(f(a.value.slice()),v=>mt(v.dataRef.domRef)),m=h?p.indexOf(h):null;return m===-1&&(m=null),{items:p,activeItemIndex:m}}let d={menuState:r,buttonRef:i,itemsRef:s,items:a,searchQuery:o,activeItemIndex:l,activationTrigger:u,closeMenu:()=>{r.value=1,l.value=null},openMenu:()=>r.value=0,goToItem(f,h,p){let m=c(),v=kze(f===sl.Specific?{focus:sl.Specific,id:h}:{focus:f},{resolveItems:()=>m.items,resolveActiveIndex:()=>m.activeItemIndex,resolveId:g=>g.id,resolveDisabled:g=>g.dataRef.disabled});o.value="",l.value=v,u.value=p??1,a.value=m.items},search(f){let h=o.value!==""?0:1;o.value+=f.toLowerCase();let p=(l.value!==null?a.value.slice(l.value+h).concat(a.value.slice(0,l.value+h)):a.value).find(v=>v.dataRef.textValue.startsWith(o.value)&&!v.dataRef.disabled),m=p?a.value.indexOf(p):-1;m===-1||m===l.value||(l.value=m,u.value=1)},clearSearch(){o.value=""},registerItem(f,h){let p=c(m=>[...m,{id:f,dataRef:h}]);a.value=p.items,l.value=p.activeItemIndex,u.value=1},unregisterItem(f){let h=c(p=>{let m=p.findIndex(v=>v.id===f);return m!==-1&&p.splice(m,1),p});a.value=h.items,l.value=h.activeItemIndex,u.value=1}};return QC([i,s],(f,h)=>{var p;d.closeMenu(),MV(h,EV.Loose)||(f.preventDefault(),(p=mt(i))==null||p.focus())},et(()=>r.value===0)),Zi(Dle,d),RV(et(()=>Rs(r.value,{0:ni.Open,1:ni.Closed}))),()=>{let f={open:r.value===0,close:d.closeMenu};return Wi({ourProps:{},theirProps:t,slot:f,slots:e,attrs:n,name:"Menu"})}}}),Ale=pt({name:"MenuButton",props:{disabled:{type:Boolean,default:!1},as:{type:[Object,String],default:"button"},id:{type:String,default:null}},setup(t,{attrs:e,slots:n,expose:r}){var i;let s=(i=t.id)!=null?i:`headlessui-menu-button-${ro()}`,a=VV("MenuButton");r({el:a.buttonRef,$el:a.buttonRef});function o(d){switch(d.key){case nr.Space:case nr.Enter:case nr.ArrowDown:d.preventDefault(),d.stopPropagation(),a.openMenu(),Ia(()=>{var f;(f=mt(a.itemsRef))==null||f.focus({preventScroll:!0}),a.goToItem(sl.First)});break;case nr.ArrowUp:d.preventDefault(),d.stopPropagation(),a.openMenu(),Ia(()=>{var f;(f=mt(a.itemsRef))==null||f.focus({preventScroll:!0}),a.goToItem(sl.Last)});break}}function l(d){switch(d.key){case nr.Space:d.preventDefault();break}}function u(d){t.disabled||(a.menuState.value===0?(a.closeMenu(),Ia(()=>{var f;return(f=mt(a.buttonRef))==null?void 0:f.focus({preventScroll:!0})})):(d.preventDefault(),a.openMenu(),cke(()=>{var f;return(f=mt(a.itemsRef))==null?void 0:f.focus({preventScroll:!0})})))}let c=PV(et(()=>({as:t.as,type:e.type})),a.buttonRef);return()=>{var d;let f={open:a.menuState.value===0},{...h}=t,p={ref:a.buttonRef,id:s,type:c.value,"aria-haspopup":"menu","aria-controls":(d=mt(a.itemsRef))==null?void 0:d.id,"aria-expanded":a.menuState.value===0,onKeydown:o,onKeyup:l,onClick:u};return Wi({ourProps:p,theirProps:h,slot:f,attrs:e,slots:n,name:"MenuButton"})}}}),Gle=pt({name:"MenuItems",props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:null}},setup(t,{attrs:e,slots:n,expose:r}){var i;let s=(i=t.id)!=null?i:`headlessui-menu-items-${ro()}`,a=VV("MenuItems"),o=ze(null);r({el:a.itemsRef,$el:a.itemsRef}),Eze({container:et(()=>mt(a.itemsRef)),enabled:et(()=>a.menuState.value===0),accept(f){return f.getAttribute("role")==="menuitem"?NodeFilter.FILTER_REJECT:f.hasAttribute("role")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT},walk(f){f.setAttribute("role","none")}});function l(f){var h;switch(o.value&&clearTimeout(o.value),f.key){case nr.Space:if(a.searchQuery.value!=="")return f.preventDefault(),f.stopPropagation(),a.search(f.key);case nr.Enter:if(f.preventDefault(),f.stopPropagation(),a.activeItemIndex.value!==null){let p=a.items.value[a.activeItemIndex.value];(h=mt(p.dataRef.domRef))==null||h.click()}a.closeMenu(),wle(mt(a.buttonRef));break;case nr.ArrowDown:return f.preventDefault(),f.stopPropagation(),a.goToItem(sl.Next);case nr.ArrowUp:return f.preventDefault(),f.stopPropagation(),a.goToItem(sl.Previous);case nr.Home:case nr.PageUp:return f.preventDefault(),f.stopPropagation(),a.goToItem(sl.First);case nr.End:case nr.PageDown:return f.preventDefault(),f.stopPropagation(),a.goToItem(sl.Last);case nr.Escape:f.preventDefault(),f.stopPropagation(),a.closeMenu(),Ia(()=>{var p;return(p=mt(a.buttonRef))==null?void 0:p.focus({preventScroll:!0})});break;case nr.Tab:f.preventDefault(),f.stopPropagation(),a.closeMenu(),Ia(()=>Sze(mt(a.buttonRef),f.shiftKey?Xs.Previous:Xs.Next));break;default:f.key.length===1&&(a.search(f.key),o.value=setTimeout(()=>a.clearSearch(),350));break}}function u(f){switch(f.key){case nr.Space:f.preventDefault();break}}let c=uy(),d=et(()=>c!==null?(c.value&ni.Open)===ni.Open:a.menuState.value===0);return()=>{var f,h;let p={open:a.menuState.value===0},{...m}=t,v={"aria-activedescendant":a.activeItemIndex.value===null||(f=a.items.value[a.activeItemIndex.value])==null?void 0:f.id,"aria-labelledby":(h=mt(a.buttonRef))==null?void 0:h.id,id:s,onKeydown:l,onKeyup:u,role:"menu",tabIndex:0,ref:a.itemsRef};return Wi({ourProps:v,theirProps:m,slot:p,attrs:e,slots:n,features:_c.RenderStrategy|_c.Static,visible:d.value,name:"MenuItems"})}}}),Fle=pt({name:"MenuItem",inheritAttrs:!1,props:{as:{type:[Object,String],default:"template"},disabled:{type:Boolean,default:!1},id:{type:String,default:null}},setup(t,{slots:e,attrs:n,expose:r}){var i;let s=(i=t.id)!=null?i:`headlessui-menu-item-${ro()}`,a=VV("MenuItem"),o=ze(null);r({el:o,$el:o});let l=et(()=>a.activeItemIndex.value!==null?a.items.value[a.activeItemIndex.value].id===s:!1),u=oke(o),c=et(()=>({disabled:t.disabled,get textValue(){return u()},domRef:o}));_n(()=>a.registerItem(s,c)),ls(()=>a.unregisterItem(s)),Ps(()=>{a.menuState.value===0&&l.value&&a.activationTrigger.value!==0&&Ia(()=>{var g,b;return(b=(g=mt(o))==null?void 0:g.scrollIntoView)==null?void 0:b.call(g,{block:"nearest"})})});function d(g){if(t.disabled)return g.preventDefault();a.closeMenu(),wle(mt(a.buttonRef))}function f(){if(t.disabled)return a.goToItem(sl.Nothing);a.goToItem(sl.Specific,s)}let h=wze();function p(g){h.update(g)}function m(g){h.wasMoved(g)&&(t.disabled||l.value||a.goToItem(sl.Specific,s,0))}function v(g){h.wasMoved(g)&&(t.disabled||l.value&&a.goToItem(sl.Nothing))}return()=>{let{disabled:g,...b}=t,y={active:l.value,disabled:g,close:a.closeMenu};return Wi({ourProps:{id:s,ref:o,role:"menuitem",tabIndex:g===!0?void 0:-1,"aria-disabled":g===!0?!0:void 0,onClick:d,onFocus:f,onPointerenter:p,onMouseenter:p,onPointermove:m,onMousemove:m,onPointerleave:v,onMouseleave:v},theirProps:{...n,...b},slot:y,attrs:n,slots:e,name:"MenuItem"})}}});var dke=(t=>(t[t.Open=0]="Open",t[t.Closed=1]="Closed",t))(dke||{});let jle=Symbol("PopoverContext");function rK(t){let e=cr(jle,null);if(e===null){let n=new Error(`<${t} /> is missing a parent <${Ble.name} /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,rK),n}return e}let Zle=Symbol("PopoverGroupContext");function Jle(){return cr(Zle,null)}let Yle=Symbol("PopoverPanelContext");function fke(){return cr(Yle,null)}let Ble=pt({name:"Popover",inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"}},setup(t,{slots:e,attrs:n,expose:r}){var i;let s=ze(null);r({el:s,$el:s});let a=ze(1),o=ze(null),l=ze(null),u=ze(null),c=ze(null),d=et(()=>_l(s)),f=et(()=>{var T,M;if(!mt(o)||!mt(c))return!1;for(let k of document.querySelectorAll("body > *"))if(Number(k==null?void 0:k.contains(mt(o)))^Number(k==null?void 0:k.contains(mt(c))))return!0;let E=mT(),S=E.indexOf(mt(o)),P=(S+E.length-1)%E.length,R=(S+1)%E.length,V=E[P],z=E[R];return!((T=mt(c))!=null&&T.contains(V))&&!((M=mt(c))!=null&&M.contains(z))}),h={popoverState:a,buttonId:ze(null),panelId:ze(null),panel:c,button:o,isPortalled:f,beforePanelSentinel:l,afterPanelSentinel:u,togglePopover(){a.value=Rs(a.value,{0:1,1:0})},closePopover(){a.value!==1&&(a.value=1)},close(T){h.closePopover();let M=(()=>T?T instanceof HTMLElement?T:T.value instanceof HTMLElement?mt(T):mt(h.button):mt(h.button))();M==null||M.focus()}};Zi(jle,h),RV(et(()=>Rs(a.value,{0:ni.Open,1:ni.Closed})));let p={buttonId:h.buttonId,panelId:h.panelId,close(){h.closePopover()}},m=Jle(),v=m==null?void 0:m.registerPopover,[g,b]=Xle(),y=Ule({mainTreeNodeRef:m==null?void 0:m.mainTreeNodeRef,portals:g,defaultContainers:[o,c]});function x(){var T,M,E,S;return(S=m==null?void 0:m.isFocusWithinPopoverGroup())!=null?S:((T=d.value)==null?void 0:T.activeElement)&&(((M=mt(o))==null?void 0:M.contains(d.value.activeElement))||((E=mt(c))==null?void 0:E.contains(d.value.activeElement)))}return Ps(()=>v==null?void 0:v(p)),$C((i=d.value)==null?void 0:i.defaultView,"focus",T=>{var M,E;T.target!==window&&T.target instanceof HTMLElement&&a.value===0&&(x()||o&&c&&(y.contains(T.target)||(M=mt(h.beforePanelSentinel))!=null&&M.contains(T.target)||(E=mt(h.afterPanelSentinel))!=null&&E.contains(T.target)||h.closePopover()))},!0),QC(y.resolveContainers,(T,M)=>{var E;h.closePopover(),MV(M,EV.Loose)||(T.preventDefault(),(E=mt(o))==null||E.focus())},et(()=>a.value===0)),()=>{let T={open:a.value===0,close:h.close};return An(Ct,[An(b,{},()=>Wi({theirProps:{...t,...n},ourProps:{ref:s},slot:T,slots:e,attrs:n,name:"Popover"})),An(y.MainTreeNode)])}}}),hke=pt({name:"PopoverButton",props:{as:{type:[Object,String],default:"button"},disabled:{type:[Boolean],default:!1},id:{type:String,default:null}},inheritAttrs:!1,setup(t,{attrs:e,slots:n,expose:r}){var i;let s=(i=t.id)!=null?i:`headlessui-popover-button-${ro()}`,a=rK("PopoverButton"),o=et(()=>_l(a.button));r({el:a.button,$el:a.button}),_n(()=>{a.buttonId.value=s}),ls(()=>{a.buttonId.value=null});let l=Jle(),u=l==null?void 0:l.closeOthers,c=fke(),d=et(()=>c===null?!1:c.value===a.panelId.value),f=ze(null),h=`headlessui-focus-sentinel-${ro()}`;d.value||Ps(()=>{a.button.value=mt(f)});let p=PV(et(()=>({as:t.as,type:e.type})),f);function m(T){var M,E,S,P,R;if(d.value){if(a.popoverState.value===1)return;switch(T.key){case nr.Space:case nr.Enter:T.preventDefault(),(E=(M=T.target).click)==null||E.call(M),a.closePopover(),(S=mt(a.button))==null||S.focus();break}}else switch(T.key){case nr.Space:case nr.Enter:T.preventDefault(),T.stopPropagation(),a.popoverState.value===1&&(u==null||u(a.buttonId.value)),a.togglePopover();break;case nr.Escape:if(a.popoverState.value!==0)return u==null?void 0:u(a.buttonId.value);if(!mt(a.button)||(P=o.value)!=null&&P.activeElement&&!((R=mt(a.button))!=null&&R.contains(o.value.activeElement)))return;T.preventDefault(),T.stopPropagation(),a.closePopover();break}}function v(T){d.value||T.key===nr.Space&&T.preventDefault()}function g(T){var M,E;t.disabled||(d.value?(a.closePopover(),(M=mt(a.button))==null||M.focus()):(T.preventDefault(),T.stopPropagation(),a.popoverState.value===1&&(u==null||u(a.buttonId.value)),a.togglePopover(),(E=mt(a.button))==null||E.focus()))}function b(T){T.preventDefault(),T.stopPropagation()}let y=eK();function x(){let T=mt(a.panel);if(!T)return;function M(){Rs(y.value,{[al.Forwards]:()=>Wl(T,Xs.First),[al.Backwards]:()=>Wl(T,Xs.Last)})===e6.Error&&Wl(mT().filter(E=>E.dataset.headlessuiFocusGuard!=="true"),Rs(y.value,{[al.Forwards]:Xs.Next,[al.Backwards]:Xs.Previous}),{relativeTo:mt(a.button)})}M()}return()=>{let T=a.popoverState.value===0,M={open:T},{...E}=t,S=d.value?{ref:f,type:p.value,onKeydown:m,onClick:g}:{ref:f,id:s,type:p.value,"aria-expanded":a.popoverState.value===0,"aria-controls":mt(a.panel)?a.panelId.value:void 0,disabled:t.disabled?!0:void 0,onKeydown:m,onKeyup:v,onClick:g,onMousedown:b};return An(Ct,[Wi({ourProps:S,theirProps:{...e,...E},slot:M,attrs:e,slots:n,name:"PopoverButton"}),T&&!d.value&&a.isPortalled.value&&An(Op,{id:h,features:bf.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:x})])}}}),pke=pt({name:"PopoverPanel",props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},focus:{type:Boolean,default:!1},id:{type:String,default:null}},inheritAttrs:!1,setup(t,{attrs:e,slots:n,expose:r}){var i;let s=(i=t.id)!=null?i:`headlessui-popover-panel-${ro()}`,{focus:a}=t,o=rK("PopoverPanel"),l=et(()=>_l(o.panel)),u=`headlessui-focus-sentinel-before-${ro()}`,c=`headlessui-focus-sentinel-after-${ro()}`;r({el:o.panel,$el:o.panel}),_n(()=>{o.panelId.value=s}),ls(()=>{o.panelId.value=null}),Zi(Yle,o.panelId),Ps(()=>{var b,y;if(!a||o.popoverState.value!==0||!o.panel)return;let x=(b=l.value)==null?void 0:b.activeElement;(y=mt(o.panel))!=null&&y.contains(x)||Wl(mt(o.panel),Xs.First)});let d=uy(),f=et(()=>d!==null?(d.value&ni.Open)===ni.Open:o.popoverState.value===0);function h(b){var y,x;switch(b.key){case nr.Escape:if(o.popoverState.value!==0||!mt(o.panel)||l.value&&!((y=mt(o.panel))!=null&&y.contains(l.value.activeElement)))return;b.preventDefault(),b.stopPropagation(),o.closePopover(),(x=mt(o.button))==null||x.focus();break}}function p(b){var y,x,T,M,E;let S=b.relatedTarget;S&&mt(o.panel)&&((y=mt(o.panel))!=null&&y.contains(S)||(o.closePopover(),((T=(x=mt(o.beforePanelSentinel))==null?void 0:x.contains)!=null&&T.call(x,S)||(E=(M=mt(o.afterPanelSentinel))==null?void 0:M.contains)!=null&&E.call(M,S))&&S.focus({preventScroll:!0})))}let m=eK();function v(){let b=mt(o.panel);if(!b)return;function y(){Rs(m.value,{[al.Forwards]:()=>{var x;Wl(b,Xs.First)===e6.Error&&((x=mt(o.afterPanelSentinel))==null||x.focus())},[al.Backwards]:()=>{var x;(x=mt(o.button))==null||x.focus({preventScroll:!0})}})}y()}function g(){let b=mt(o.panel);if(!b)return;function y(){Rs(m.value,{[al.Forwards]:()=>{let x=mt(o.button),T=mt(o.panel);if(!x)return;let M=mT(),E=M.indexOf(x),S=M.slice(0,E+1),P=[...M.slice(E+1),...S];for(let R of P.slice())if(R.dataset.headlessuiFocusGuard==="true"||T!=null&&T.contains(R)){let V=P.indexOf(R);V!==-1&&P.splice(V,1)}Wl(P,Xs.First,{sorted:!1})},[al.Backwards]:()=>{var x;Wl(b,Xs.Previous)===e6.Error&&((x=mt(o.button))==null||x.focus())}})}y()}return()=>{let b={open:o.popoverState.value===0,close:o.close},{focus:y,...x}=t,T={ref:o.panel,id:s,onKeydown:h,onFocusout:a&&o.popoverState.value===0?p:void 0,tabIndex:-1};return Wi({ourProps:T,theirProps:{...e,...x},attrs:e,slot:b,slots:{...n,default:(...M)=>{var E;return[An(Ct,[f.value&&o.isPortalled.value&&An(Op,{id:u,ref:o.beforePanelSentinel,features:bf.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:v}),(E=n.default)==null?void 0:E.call(n,...M),f.value&&o.isPortalled.value&&An(Op,{id:c,ref:o.afterPanelSentinel,features:bf.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:g})])]}},features:_c.RenderStrategy|_c.Static,visible:f.value,name:"PopoverPanel"})}}}),mke=pt({name:"PopoverGroup",inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"}},setup(t,{attrs:e,slots:n,expose:r}){let i=ze(null),s=c0([]),a=et(()=>_l(i)),o=Gze();r({el:i,$el:i});function l(f){let h=s.value.indexOf(f);h!==-1&&s.value.splice(h,1)}function u(f){return s.value.push(f),()=>{l(f)}}function c(){var f;let h=a.value;if(!h)return!1;let p=h.activeElement;return(f=mt(i))!=null&&f.contains(p)?!0:s.value.some(m=>{var v,g;return((v=h.getElementById(m.buttonId.value))==null?void 0:v.contains(p))||((g=h.getElementById(m.panelId.value))==null?void 0:g.contains(p))})}function d(f){for(let h of s.value)h.buttonId.value!==f&&h.close()}return Zi(Zle,{registerPopover:u,unregisterPopover:l,isFocusWithinPopoverGroup:c,closeOthers:d,mainTreeNodeRef:o.mainTreeNodeRef}),()=>An(Ct,[Wi({ourProps:{ref:i},theirProps:{...t,...e},slot:{},attrs:e,slots:n,name:"PopoverGroup"}),An(o.MainTreeNode)])}}),vke=Symbol("GroupContext"),gke=pt({name:"Switch",emits:{"update:modelValue":t=>!0},props:{as:{type:[Object,String],default:"button"},modelValue:{type:Boolean,default:void 0},defaultChecked:{type:Boolean,optional:!0},form:{type:String,optional:!0},name:{type:String,optional:!0},value:{type:String,optional:!0},id:{type:String,default:null},disabled:{type:Boolean,default:!1},tabIndex:{type:Number,default:0}},inheritAttrs:!1,setup(t,{emit:e,attrs:n,slots:r,expose:i}){var s;let a=(s=t.id)!=null?s:`headlessui-switch-${ro()}`,o=cr(vke,null),[l,u]=cze(et(()=>t.modelValue),b=>e("update:modelValue",b),et(()=>t.defaultChecked));function c(){u(!l.value)}let d=ze(null),f=o===null?d:o.switchRef,h=PV(et(()=>({as:t.as,type:n.type})),f);i({el:f,$el:f});function p(b){b.preventDefault(),c()}function m(b){b.key===nr.Space?(b.preventDefault(),c()):b.key===nr.Enter&&Oze(b.currentTarget)}function v(b){b.preventDefault()}let g=et(()=>{var b,y;return(y=(b=mt(f))==null?void 0:b.closest)==null?void 0:y.call(b,"form")});return _n(()=>{jt([g],()=>{if(!g.value||t.defaultChecked===void 0)return;function b(){u(t.defaultChecked)}return g.value.addEventListener("reset",b),()=>{var y;(y=g.value)==null||y.removeEventListener("reset",b)}},{immediate:!0})}),()=>{let{name:b,value:y,form:x,tabIndex:T,...M}=t,E={checked:l.value},S={id:a,ref:f,role:"switch",type:h.value,tabIndex:T===-1?0:T,"aria-checked":l.value,"aria-labelledby":o==null?void 0:o.labelledby.value,"aria-describedby":o==null?void 0:o.describedby.value,onClick:p,onKeyup:m,onKeypress:v};return An(Ct,[b!=null&&l.value!=null?An(Op,Mze({features:bf.Hidden,as:"input",type:"checkbox",hidden:!0,readOnly:!0,checked:l.value,form:x,disabled:M.disabled,name:b,value:y})):null,Wi({ourProps:S,theirProps:{...n,..._C(M,["modelValue","defaultChecked"])},slot:E,attrs:n,slots:r,name:"Switch"})])}}});function bke(t){let e={called:!1};return(...n)=>{if(!e.called)return e.called=!0,t(...n)}}function rk(t,...e){t&&e.length>0&&t.classList.add(...e)}function f2(t,...e){t&&e.length>0&&t.classList.remove(...e)}var mL=(t=>(t.Finished="finished",t.Cancelled="cancelled",t))(mL||{});function yke(t,e){let n=hT();if(!t)return n.dispose;let{transitionDuration:r,transitionDelay:i}=getComputedStyle(t),[s,a]=[r,i].map(o=>{let[l=0]=o.split(",").filter(Boolean).map(u=>u.includes("ms")?parseFloat(u):parseFloat(u)*1e3).sort((u,c)=>c-u);return l});return s!==0?n.setTimeout(()=>e("finished"),s+a):e("finished"),n.add(()=>e("cancelled")),n.dispose}function Yj(t,e,n,r,i,s){let a=hT(),o=s!==void 0?bke(s):()=>{};return f2(t,...i),rk(t,...e,...n),a.nextFrame(()=>{f2(t,...n),rk(t,...r),a.add(yke(t,l=>(f2(t,...r,...e),rk(t,...i),o(l))))}),a.add(()=>f2(t,...e,...n,...r,...i)),a.add(()=>o("cancelled")),a.dispose}function Mm(t=""){return t.split(/\s+/).filter(e=>e.length>1)}let iK=Symbol("TransitionContext");var Ske=(t=>(t.Visible="visible",t.Hidden="hidden",t))(Ske||{});function xke(){return cr(iK,null)!==null}function Tke(){let t=cr(iK,null);if(t===null)throw new Error("A is used but it is missing a parent .");return t}function wke(){let t=cr(sK,null);if(t===null)throw new Error("A is used but it is missing a parent .");return t}let sK=Symbol("NestingContext");function zV(t){return"children"in t?zV(t.children):t.value.filter(({state:e})=>e==="visible").length>0}function Hle(t){let e=ze([]),n=ze(!1);_n(()=>n.value=!0),ls(()=>n.value=!1);function r(s,a=Zh.Hidden){let o=e.value.findIndex(({id:l})=>l===s);o!==-1&&(Rs(a,{[Zh.Unmount](){e.value.splice(o,1)},[Zh.Hidden](){e.value[o].state="hidden"}}),!zV(e)&&n.value&&(t==null||t()))}function i(s){let a=e.value.find(({id:o})=>o===s);return a?a.state!=="visible"&&(a.state="visible"):e.value.push({id:s,state:"visible"}),()=>r(s,Zh.Unmount)}return{children:e,register:i,unregister:r}}let Qle=_c.RenderStrategy,Zu=pt({props:{as:{type:[Object,String],default:"div"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:""},enterFrom:{type:[String],default:""},enterTo:{type:[String],default:""},entered:{type:[String],default:""},leave:{type:[String],default:""},leaveFrom:{type:[String],default:""},leaveTo:{type:[String],default:""}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(t,{emit:e,attrs:n,slots:r,expose:i}){let s=ze(0);function a(){s.value|=ni.Opening,e("beforeEnter")}function o(){s.value&=~ni.Opening,e("afterEnter")}function l(){s.value|=ni.Closing,e("beforeLeave")}function u(){s.value&=~ni.Closing,e("afterLeave")}if(!xke()&&Rze())return()=>An(Ju,{...t,onBeforeEnter:a,onAfterEnter:o,onBeforeLeave:l,onAfterLeave:u},r);let c=ze(null),d=et(()=>t.unmount?Zh.Unmount:Zh.Hidden);i({el:c,$el:c});let{show:f,appear:h}=Tke(),{register:p,unregister:m}=wke(),v=ze(f.value?"visible":"hidden"),g={value:!0},b=ro(),y={value:!1},x=Hle(()=>{!y.value&&v.value!=="hidden"&&(v.value="hidden",m(b),u())});_n(()=>{let k=p(b);ls(k)}),Ps(()=>{if(d.value===Zh.Hidden&&b){if(f.value&&v.value!=="visible"){v.value="visible";return}Rs(v.value,{hidden:()=>m(b),visible:()=>p(b)})}});let T=Mm(t.enter),M=Mm(t.enterFrom),E=Mm(t.enterTo),S=Mm(t.entered),P=Mm(t.leave),R=Mm(t.leaveFrom),V=Mm(t.leaveTo);_n(()=>{Ps(()=>{if(v.value==="visible"){let k=mt(c);if(k instanceof Comment&&k.data==="")throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")}})});function z(k){let N=g.value&&!h.value,q=mt(c);!q||!(q instanceof HTMLElement)||N||(y.value=!0,f.value&&a(),f.value||l(),k(f.value?Yj(q,T,M,E,S,L=>{y.value=!1,L===mL.Finished&&o()}):Yj(q,P,R,V,S,L=>{y.value=!1,L===mL.Finished&&(zV(x)||(v.value="hidden",m(b),u()))})))}return _n(()=>{jt([f],(k,N,q)=>{z(q),g.value=!1},{immediate:!0})}),Zi(sK,x),RV(et(()=>Rs(v.value,{visible:ni.Open,hidden:ni.Closed})|s.value)),()=>{let{appear:k,show:N,enter:q,enterFrom:L,enterTo:A,entered:J,leave:F,leaveFrom:ne,leaveTo:j,...Z}=t,_={ref:c},le={...Z,...h.value&&f.value&&pT.isServer?{class:En([n.class,Z.class,...T,...M])}:{}};return Wi({theirProps:le,ourProps:_,slot:{},slots:r,attrs:n,features:Qle,visible:v.value==="visible",name:"TransitionChild"})}}}),Eke=Zu,Ju=pt({inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:""},enterFrom:{type:[String],default:""},enterTo:{type:[String],default:""},entered:{type:[String],default:""},leave:{type:[String],default:""},leaveFrom:{type:[String],default:""},leaveTo:{type:[String],default:""}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(t,{emit:e,attrs:n,slots:r}){let i=uy(),s=et(()=>t.show===null&&i!==null?(i.value&ni.Open)===ni.Open:t.show);Ps(()=>{if(![!0,!1].includes(s.value))throw new Error('A is used but it is missing a `:show="true | false"` prop.')});let a=ze(s.value?"visible":"hidden"),o=Hle(()=>{a.value="hidden"}),l=ze(!0),u={show:s,appear:et(()=>t.appear||!l.value)};return _n(()=>{Ps(()=>{l.value=!1,s.value?a.value="visible":zV(o)||(a.value="hidden")})}),Zi(sK,o),Zi(iK,u),()=>{let c=_C(t,["show","appear","unmount","onBeforeEnter","onBeforeLeave","onAfterEnter","onAfterLeave"]),d={unmount:t.unmount};return Wi({ourProps:{...d,as:"template"},theirProps:{},slot:{},slots:{...r,default:()=>[An(Eke,{onBeforeEnter:()=>e("beforeEnter"),onAfterEnter:()=>e("afterEnter"),onBeforeLeave:()=>e("beforeLeave"),onAfterLeave:()=>e("afterLeave"),...n,...d,...c},r.default)]},attrs:{},features:Qle,visible:a.value==="visible",name:"Transition"})}}});const li=h0({id:"navigationStore",state:()=>({activePage:"Projects",slideoverOpen:!1,editName:null,groupModalOpen:!1,mappingModalOpen:!1,loading:!1,groupColorMode:!1,sideBarShow:!0,saveModalOpen:!1,assemblyModalOpen:!1,assemblyTableShow:!1,settingsModalOpen:!1}),actions:{setActivePage(t){this.activePage=t},toggleSlideover(){this.slideoverOpen=!this.slideoverOpen},toggleLoading(){this.loading=!this.loading},toggleGroupModal(){this.groupModalOpen=!this.groupModalOpen},toggleMappingModal(){this.mappingModalOpen=!this.mappingModalOpen},toggleSettingsModal(){this.settingsModalOpen=!this.settingsModalOpen},toggleEditName(t){this.editName===t?this.editName=null:this.editName=t},toggleColorMode(){this.groupColorMode=!this.groupColorMode},toggleSideBar(){this.sideBarShow=!this.sideBarShow},toggleSaveModal(){this.saveModalOpen=!this.saveModalOpen},toggleAssemblyModal(){this.assemblyModalOpen=!this.assemblyModalOpen},toggleAssemblyTable(){this.assemblyTableShow=!this.assemblyTableShow}},getters:{getActivePage:t=>t.activePage,getSlideoverOpen:t=>t.slideoverOpen}}),Mke=pt({name:"PacmanLoader",components:{Dialog:_p,TransitionRoot:Ju,TransitionChild:Zu},props:{color:{type:String,default:"#22B864"},size:{type:String,default:"50px"},dotSize:{type:String,default:"25px"},margin:{type:String,default:"2px"},radius:{type:String,default:"100%"}},setup(t){const e=li(),n=ai(e),r=[.25,.5,.75,1].map(o=>({animationDelay:`${o}s`})),i=et(()=>({backgroundColor:t.color,width:t.size,height:t.size,margin:t.margin,borderRadius:t.radius})),s=et(()=>({width:0,height:0,borderTop:`${t.size} solid ${t.color}`,borderRight:`${t.size} solid transparent`,borderBottom:`${t.size} solid ${t.color}`,borderLeft:`${t.size} solid ${t.color}`,borderRadius:t.size})),a={width:t.dotSize,height:t.dotSize,transform:`translate(0, -${parseFloat(t.dotSize)/4}px)`,position:"absolute",top:"40px",left:"200px",animationName:"v-pacmanStretchDelay",animationDuration:"1s",animationIterationCount:"infinite",animationTimingFunction:"linear",animationFillMode:"both"};return{navRef:n,delays:r,spinnerStyle:i,spinnerStyle1:s,animationStyle:a}}});const Vt=(t,e)=>{const n=t.__vccOpts||t;for(const[r,i]of e)n[r]=i;return n},Pke={class:"fixed inset-0 z-10 w-screen overflow-y-auto"},Rke={class:"flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0"},Vke={class:"flex v-spinner text-center"},zke={class:"relative inline-block",style:{fontSize:"0"}};function kke(t,e,n,r,i,s){const a=Xe("TransitionChild"),o=Xe("Dialog"),l=Xe("TransitionRoot");return pe(),Gt(l,{as:"template",show:t.navRef.loading.value},{default:ft(()=>[xe(o,{as:"div",class:"relative z-10"},{default:ft(()=>[xe(a,{as:"template",enter:"ease-out duration-300","enter-from":"opacity-0","enter-to":"opacity-100",leave:"ease-in duration-200","leave-from":"opacity-100","leave-to":"opacity-0"},{default:ft(()=>e[0]||(e[0]=[O("div",{class:"fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"},null,-1)])),_:1}),O("div",Pke,[O("div",Rke,[xe(a,{as:"template",enter:"ease-out duration-300","enter-from":"opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95","enter-to":"opacity-100 translate-y-0 sm:scale-100",leave:"ease-in duration-200","leave-from":"opacity-100 translate-y-0 sm:scale-100","leave-to":"opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"},{default:ft(()=>[hn(O("div",Vke,[O("div",zke,[O("div",{class:"v-pacman v-pacman1",style:Ms(t.spinnerStyle1)},null,4),(pe(!0),ke(Ct,null,Pi(t.delays,(u,c)=>(pe(),ke("div",{key:c,class:En(`v-pacman v-pacman${c+2}`),style:Ms([t.spinnerStyle,t.animationStyle,u])},null,6))),128))])],512),[[uC,t.navRef.loading]])]),_:1}),e[1]||(e[1]=O("p",{class:"flex text-slate-100 text-3xl text-left mt-36 font-medium"}," Loading... ",-1))])])]),_:1})]),_:1},8,["show"])}const Oke=Vt(Mke,[["render",kke]]),Ike=pt({name:"SpeckLCA",components:{pacmanLoader:Oke},setup(){const t=p2e();if(t.redirectedFrom!==null){const e=t.redirectedFrom,n=t.path,r=t.query,i=t.params;ef(`Route redirected from ${e} to ${n} with query params ${JSON.stringify(r)} and params ${JSON.stringify(i)}`,"warning")}return{route:t}}}),Uke={id:"app"};function Nke(t,e,n,r,i,s){const a=Xe("pacman-loader"),o=Xe("router-view");return pe(),ke("div",Uke,[xe(a),xe(o)])}const Lke=Vt(Ike,[["render",Nke]]);function Bj(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M10 1c-1.716 0-3.408.106-5.07.31C3.806 1.45 3 2.414 3 3.517V16.75A2.25 2.25 0 0 0 5.25 19h9.5A2.25 2.25 0 0 0 17 16.75V3.517c0-1.103-.806-2.068-1.93-2.207A41.403 41.403 0 0 0 10 1ZM5.99 8.75A.75.75 0 0 1 6.74 8h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm-.75 2.916a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm1.417-5.75a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm-.75 2.916a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm1.42-5.75a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm-.75 2.916a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01ZM12.5 8.75a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm0 2.166a.75.75 0 0 1 .75.75v2.167a.75.75 0 1 1-1.5 0v-2.167a.75.75 0 0 1 .75-.75ZM6.75 4a.75.75 0 0 0-.75.75v.5c0 .414.336.75.75.75h6.5a.75.75 0 0 0 .75-.75v-.5a.75.75 0 0 0-.75-.75h-6.5Z","clip-rule":"evenodd"})])}function _le(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z","clip-rule":"evenodd"})])}function $le(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z","clip-rule":"evenodd"})])}function Xke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M9.47 6.47a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 1 1-1.06 1.06L10 8.06l-3.72 3.72a.75.75 0 0 1-1.06-1.06l4.25-4.25Z","clip-rule":"evenodd"})])}function Cke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Zm7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06ZM11.377 2.011a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612Z","clip-rule":"evenodd"})])}function Kke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{d:"M10 12.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z"}),O("path",{"fill-rule":"evenodd",d:"M.664 10.59a1.651 1.651 0 0 1 0-1.186A10.004 10.004 0 0 1 10 3c4.257 0 7.893 2.66 9.336 6.41.147.381.146.804 0 1.186A10.004 10.004 0 0 1 10 17c-4.257 0-7.893-2.66-9.336-6.41ZM14 10a4 4 0 1 1-8 0 4 4 0 0 1 8 0Z","clip-rule":"evenodd"})])}function Hj(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M10 2.5c-1.31 0-2.526.386-3.546 1.051a.75.75 0 0 1-.82-1.256A8 8 0 0 1 18 9a22.47 22.47 0 0 1-1.228 7.351.75.75 0 1 1-1.417-.49A20.97 20.97 0 0 0 16.5 9 6.5 6.5 0 0 0 10 2.5ZM4.333 4.416a.75.75 0 0 1 .218 1.038A6.466 6.466 0 0 0 3.5 9a7.966 7.966 0 0 1-1.293 4.362.75.75 0 0 1-1.257-.819A6.466 6.466 0 0 0 2 9c0-1.61.476-3.11 1.295-4.365a.75.75 0 0 1 1.038-.219ZM10 6.12a3 3 0 0 0-3.001 3.041 11.455 11.455 0 0 1-2.697 7.24.75.75 0 0 1-1.148-.965A9.957 9.957 0 0 0 5.5 9c0-.028.002-.055.004-.082a4.5 4.5 0 0 1 8.996.084V9.15l-.005.297a.75.75 0 1 1-1.5-.034c.003-.11.004-.219.005-.328a3 3 0 0 0-3-2.965Zm0 2.13a.75.75 0 0 1 .75.75c0 3.51-1.187 6.745-3.181 9.323a.75.75 0 1 1-1.186-.918A13.687 13.687 0 0 0 9.25 9a.75.75 0 0 1 .75-.75Zm3.529 3.698a.75.75 0 0 1 .584.885 18.883 18.883 0 0 1-2.257 5.84.75.75 0 1 1-1.29-.764 17.386 17.386 0 0 0 2.078-5.377.75.75 0 0 1 .885-.584Z","clip-rule":"evenodd"})])}function qke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M2.628 1.601C5.028 1.206 7.49 1 10 1s4.973.206 7.372.601a.75.75 0 0 1 .628.74v2.288a2.25 2.25 0 0 1-.659 1.59l-4.682 4.683a2.25 2.25 0 0 0-.659 1.59v3.037c0 .684-.31 1.33-.844 1.757l-1.937 1.55A.75.75 0 0 1 8 18.25v-5.757a2.25 2.25 0 0 0-.659-1.591L2.659 6.22A2.25 2.25 0 0 1 2 4.629V2.34a.75.75 0 0 1 .628-.74Z","clip-rule":"evenodd"})])}function Dke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{d:"M14.916 2.404a.75.75 0 0 1-.32 1.011l-.596.31V17a1 1 0 0 1-1 1h-2.26a.75.75 0 0 1-.75-.75v-3.5a.75.75 0 0 0-.75-.75H6.75a.75.75 0 0 0-.75.75v3.5a.75.75 0 0 1-.75.75h-3.5a.75.75 0 0 1 0-1.5H2V9.957a.75.75 0 0 1-.596-1.372L2 8.275V5.75a.75.75 0 0 1 1.5 0v1.745l10.404-5.41a.75.75 0 0 1 1.012.319ZM15.861 8.57a.75.75 0 0 1 .736-.025l1.999 1.04A.75.75 0 0 1 18 10.957V16.5h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1-.75-.75V9.21a.75.75 0 0 1 .361-.64Z"})])}function Wke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M9.293 2.293a1 1 0 0 1 1.414 0l7 7A1 1 0 0 1 17 11h-1v6a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-3a1 1 0 0 0-1-1H9a1 1 0 0 0-1 1v3a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-6H3a1 1 0 0 1-.707-1.707l7-7Z","clip-rule":"evenodd"})])}function Ake(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{d:"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}),O("path",{d:"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"})])}function Gke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM6.75 9.25a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5h-6.5Z","clip-rule":"evenodd"})])}function Fke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{d:"M15.993 1.385a1.87 1.87 0 0 1 2.623 2.622l-4.03 5.27a12.749 12.749 0 0 1-4.237 3.562 4.508 4.508 0 0 0-3.188-3.188 12.75 12.75 0 0 1 3.562-4.236l5.27-4.03ZM6 11a3 3 0 0 0-3 3 .5.5 0 0 1-.72.45.75.75 0 0 0-1.035.931A4.001 4.001 0 0 0 9 14.004V14a3.01 3.01 0 0 0-1.66-2.685A2.99 2.99 0 0 0 6 11Z"})])}function jke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm.75-11.25a.75.75 0 0 0-1.5 0v2.5h-2.5a.75.75 0 0 0 0 1.5h2.5v2.5a.75.75 0 0 0 1.5 0v-2.5h2.5a.75.75 0 0 0 0-1.5h-2.5v-2.5Z","clip-rule":"evenodd"})])}function Zke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{d:"M4.464 3.162A2 2 0 0 1 6.28 2h7.44a2 2 0 0 1 1.816 1.162l1.154 2.5c.067.145.115.291.145.438A3.508 3.508 0 0 0 16 6H4c-.288 0-.568.035-.835.1.03-.147.078-.293.145-.438l1.154-2.5Z"}),O("path",{"fill-rule":"evenodd",d:"M2 9.5a2 2 0 0 1 2-2h12a2 2 0 1 1 0 4H4a2 2 0 0 1-2-2Zm13.24 0a.75.75 0 0 1 .75-.75H16a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75V9.5Zm-2.25-.75a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75H13a.75.75 0 0 0 .75-.75V9.5a.75.75 0 0 0-.75-.75h-.01ZM2 15a2 2 0 0 1 2-2h12a2 2 0 1 1 0 4H4a2 2 0 0 1-2-2Zm13.24 0a.75.75 0 0 1 .75-.75H16a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75V15Zm-2.25-.75a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75H13a.75.75 0 0 0 .75-.75V15a.75.75 0 0 0-.75-.75h-.01Z","clip-rule":"evenodd"})])}function Qj(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-5.5-2.5a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0ZM10 12a5.99 5.99 0 0 0-4.793 2.39A6.483 6.483 0 0 0 10 16.5a6.483 6.483 0 0 0 4.793-2.11A5.99 5.99 0 0 0 10 12Z","clip-rule":"evenodd"})])}function Jke(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{d:"M3.25 4A2.25 2.25 0 0 0 1 6.25v7.5A2.25 2.25 0 0 0 3.25 16h7.5A2.25 2.25 0 0 0 13 13.75v-7.5A2.25 2.25 0 0 0 10.75 4h-7.5ZM19 4.75a.75.75 0 0 0-1.28-.53l-3 3a.75.75 0 0 0-.22.53v4.5c0 .199.079.39.22.53l3 3a.75.75 0 0 0 1.28-.53V4.75Z"})])}const kV=[{name:"0 SANERING OCH RIVNING",children:[{name:"00 Sammansatta",selected:!1},{name:"01 Demontoring",selected:!1},{name:"02 Sanering och lätt rivning",selected:!1},{name:"03 Tung rivning",selected:!1},{name:"04 Efterlagning",selected:!1},{name:"06 Håltagning",selected:!1},{name:"07 Arbeten för installationer",selected:!1}]},{name:"1 MARK",children:[{name:"10 Sammansatta",selected:!1},{name:"11 Röjning, rivning och flyttning",selected:!1},{name:"12 Schakter, fyllning",selected:!1},{name:"13 Markförstärkning, dränering",selected:!1},{name:"15 Ledningar, kulvertar, tunnlar",selected:!1},{name:"16 Vägar, planer",selected:!1},{name:"17 Trädgård",selected:!1},{name:"18 Markrutt, Stödmurar, komplementbyggnader",selected:!1},{name:"19 Mark övrigt",selected:!1}]},{name:"2. HUSUNDERBYGGNAD",children:[{name:"20 Sammansatta",selected:!1},{name:"22 Schakt, fyllning",selected:!1},{name:"23 Markförstärkning, dränering",selected:!1},{name:"24 Grundkonstruktioner",selected:!1},{name:"25 Kulvertar, tunnlar",selected:!1},{name:"26 Garage",selected:!1},{name:"27 Platta på mark",selected:!1},{name:"28 Huskomplementering, husunderbyggnad",selected:!1},{name:"29 Husunderbyggnad övrigt",selected:!1}]},{name:"3. STOMME",children:[{name:"30 Sammansatta",selected:!1},{name:"31 Stomme - väggar",selected:!1},{name:"32 Stomme - pelare",selected:!1},{name:"33 Prefab",selected:!1},{name:"34 Stomme bjälklag, balkar",selected:!1},{name:"35 Smide",selected:!1},{name:"36 Stomme, trappor, hisschakt",selected:!1},{name:"37 Samverkande takstomme",selected:!1},{name:"38 Huskomplementering, stomme",selected:!1},{name:"39 Stomme övrigt",selected:!1}]},{name:"4. YTTERTAK",children:[{name:"40 Sammansatta",selected:!1},{name:"41 Tak-stomme",selected:!1},{name:"42 Taklagskomplettering",selected:!1},{name:"43 Taktäckning",selected:!1},{name:"44 Takfot och gavlar",selected:!1},{name:"45 Öppningskompletteringar, yttertak",selected:!1},{name:"46 Plåt",selected:!1},{name:"47 Terasstak, altaner",selected:!1},{name:"48 Huskomplettering, yttertak",selected:!1},{name:"49 Yttertak övrigt",selected:!1}]},{name:"5. FASADER",children:[{name:"50 Sammansatta",selected:!1},{name:"51 Stomkomplement, utfackning",selected:!1},{name:"53 Fasadbeklädnad",selected:!1},{name:"55 Fönster, dörrar, partier, portar",selected:!1},{name:"58 Huskomplettering ytterväggar",selected:!1},{name:"59 Ytterväggar övrigt",selected:!1}]},{name:"6. STOMKOMPL. RUMSBILDN.",children:[{name:"60 Sammansatta",selected:!1},{name:"61 Insida yttervägg",selected:!1},{name:"62 Undergolv",selected:!1},{name:"63 Innerväggar",selected:!1},{name:"64 Innertak",selected:!1},{name:"65 Invändiga dörrar, glaspartier",selected:!1},{name:"66 Invändiga trappor",selected:!1},{name:"68 Huskomplettering, rumsbildning",selected:!1},{name:"69 Rumsbildning övrigt",selected:!1}]},{name:"7. INVÄNDIGA YTSKIKT RUMSKOMPL.",children:[{name:"70 Sammansatta",selected:!1},{name:"72 Ytskikt golv, sporer",selected:!1},{name:"73 Ytskikt vägg",selected:!1},{name:"74 Ytskikt tak, undertak",selected:!1},{name:"75 Målning",selected:!1},{name:"76 Vitvaror",selected:!1},{name:"77 Skåpsinsikter",selected:!1},{name:"78 Rumsinsikter",selected:!1},{name:"79 Rumsinsikter övrigt",selected:!1}]},{name:"8 INSTALLATIONER",children:[{name:"80 Sammansatta",selected:!1},{name:"82 Process",selected:!1},{name:"83 Storkök",selected:!1},{name:"84 Sanitet, värme",selected:!1},{name:"85 Kyla, luft",selected:!1},{name:"86 El",selected:!1},{name:"87 Transport",selected:!1},{name:"88 Styr och regler",selected:!1},{name:"89 Installationer övrigt",selected:!1}]},{name:"9. GEMENSAMMA ARBETEN",children:[{name:"90 Gemensamma arbeten sammansatta",selected:!1},{name:"91 Gemensamma arbeten",selected:!1}]}],Yke=[{name:"1. Substructure",children:[{name:"1.1 Foundations",selected:!1},{name:"1.2 Basement Construction"}]},{name:"2. Superstructure",children:[{name:"2.1 Structural Frame",selected:!1},{name:"2.2 External Walls",selected:!1},{name:"2.3 Internal Walls",selected:!1},{name:"2.4 Upper Floors",selected:!1},{name:"2.5 Roof Structure",selected:!1}]},{name:"3. Finishes",children:[{name:"3.1 Wall Finishes",selected:!1},{name:"3.2 Floor Finishes",selected:!1},{name:"3.3 Ceiling Finishes",selected:!1}]},{name:"4. Fittings and Furnishings",children:[{name:"4.1 Fixed Furniture",selected:!1},{name:"4.2 Movable Furniture",selected:!1}]},{name:"5. Building Services",children:[{name:"5.1 Heating, Ventilation, and Air Conditioning (HVAC)",selected:!1},{name:"5.2 Electrical Installations",selected:!1},{name:"5.3 Plumbing Installations",selected:!1},{name:"5.4 Fire Protection Systems",selected:!1}]},{name:"6. External Works",children:[{name:"6.1 Landscaping",selected:!1},{name:"6.2 Site Infrastructure",selected:!1}]}],_j={BSAB96:kV,generic:Yke};var vL=(t=>(t[t.EcoPortal=0]="EcoPortal",t[t.Revalu=1]="Revalu",t[t.LCAByg=2]="LCAByg",t[t.Other=3]="Other",t))(vL||{});const Bke={colorscheme:"light",area:1e3},Hke={materialKeys:{revalu:null,ecoPortal:null},githubApiKey:null,firebaseConfig:{apiKey:null,authDomain:"specklca.firebaseapp.com",projectId:"specklca",storageBucket:"specklca.appspot.com",messagingSenderId:"660785821928",appId:"1:660785821928:web:236a8b63b72bf6abcc715d",measurementId:"G-EKQGVJLEEG"},speckleConfig:{serverUrl:"https://app.speckle.systems",id:"25477842e5",secret:"c5a683ccc4"}},Qke={includedStages:{relevantStages:[{included:!0,stage:"a1a3"},{included:!0,stage:"a4"},{included:!0,stage:"a5"},{included:!0,stage:"b1"},{included:!0,stage:"c1"}]},standardImpactCategory:"gwp",buildingCode:{key:"BSAB96",data:kV}},_ke={epdSource:1},Nr=h0({id:"settingsStore",state:()=>({appSettings:Bke,calculationSettings:Qke,keySettings:Hke,materialSettings:_ke}),persist:{storage:localStorage,afterHydrate:t=>{console.log(`just hydrated '${t.store.$id}'`)}},actions:{updateFirebaseSettings(t){this.keySettings.firebaseConfig=t},updateSpeckleSettings(t){this.keySettings.speckleConfig=t},updateMaterialKeys(t){this.keySettings.materialKeys=t},updateEPDSource(t){this.materialSettings.epdSource=t},updateGithubApiKey(t){this.keySettings.githubApiKey=t},updateIncludedStages(t){this.calculationSettings.includedStages=t},updateStandardImpactCategory(t){this.calculationSettings.standardImpactCategory=t},updateBuildingCode(t){this.calculationSettings.buildingCode=t},updateArea(t){this.appSettings.area=t}}}),eue="/SpeckleLCA/assets/logo-0f801c3a.svg",$ke="/SpeckleLCA/assets/AppPicture3D-67929e5c.png",eOe=pt({name:"SettingsSidebar",components:{},props:{settingViews:{type:Array,required:!0}},emits:["view-changed"],setup(t,{emit:e}){return{handleClick:r=>{t.settingViews.forEach(i=>{i.current=i.name===r.name}),e("view-changed",r)}}}}),tOe={class:"overflow-x-auto border-b border-gray-900/5 block w-64 flex-none border-0 py-36"},nOe={class:"flex-none px-4 sm:px-6 lg:px-0"},rOe={role:"list",class:"flex gap-x-3 gap-y-1 whitespace-nowrap lg:flex-col"},iOe=["onClick"];function sOe(t,e,n,r,i,s){return pe(),ke("aside",tOe,[O("nav",nOe,[O("ul",rOe,[(pe(!0),ke(Ct,null,Pi(t.settingViews,a=>(pe(),ke("li",{key:a.name},[O("a",{href:"#",class:En([a.current?"bg-gray-50 text-green-600":"text-gray-700 hover:bg-gray-50 hover:text-green-600","group flex gap-x-3 rounded-md py-2 pl-2 pr-3 text-sm/6 font-semibold"]),onClick:f0(o=>t.handleClick(a),["prevent"])},[(pe(),Gt(hf(a.icon),{class:En([a.current?"text-green-600":"text-gray-400 group-hover:text-green-600","size-6 shrink-0"]),"aria-hidden":"true"},null,8,["class"])),yr(" "+Mt(a.name),1)],10,iOe)]))),128))])])])}const aOe=Vt(eOe,[["render",sOe]]),oOe=pt({name:"UpdateButton",props:{label:{type:String,default:"Update"}},emits:["click"],setup(t,{emit:e}){return{handleClick:()=>{e("click")}}}});function lOe(t,e,n,r,i,s){return pe(),ke("button",{type:"button",class:"font-semibold text-green-600 hover:text-green-500",onClick:e[0]||(e[0]=(...a)=>t.handleClick&&t.handleClick(...a))},Mt(t.label),1)}const Cf=Vt(oOe,[["render",lOe]]),uOe=pt({name:"SettingsGeneral",components:{UpdateButton:Cf},setup(){const t=Nr(),e=ze(t.appSettings.area);return{area:e,updateGeneral:()=>{t.updateArea(e.value)}}}}),cOe={class:"mt-6 space-y-6 divide-y divide-gray-100 border-t border-gray-200 text-sm/6"},dOe={class:"pt-6 sm:flex"},fOe={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"},hOe={class:"pt-6 sm:flex"},pOe={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"},mOe={class:"pt-6 sm:flex"},vOe={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"};function gOe(t,e,n,r,i,s){const a=Xe("UpdateButton");return pe(),ke("div",null,[e[6]||(e[6]=O("h2",{class:"text-base/7 font-semibold text-gray-900"},"General User Settings",-1)),e[7]||(e[7]=O("p",{class:"mt-1 text-sm/6 text-gray-500"},"General settings for the project.",-1)),O("dl",cOe,[O("div",dOe,[e[1]||(e[1]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Area",-1)),O("dd",fOe,[hn(O("input",{"onUpdate:modelValue":e[0]||(e[0]=o=>t.area=o),type:"text",placeholder:"Unit",class:"w-full border p-2 rounded-md"},null,512),[[On,t.area]]),xe(a,{onClick:t.updateGeneral},null,8,["onClick"])])]),O("div",hOe,[e[3]||(e[3]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Show popups",-1)),O("dd",pOe,[e[2]||(e[2]=O("input",{type:"text",placeholder:"True",class:"w-full border p-2 rounded-md"},null,-1)),xe(a,{onClick:t.updateGeneral},null,8,["onClick"])])]),O("div",mOe,[e[5]||(e[5]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Standard result values",-1)),O("dd",vOe,[e[4]||(e[4]=O("input",{type:"text",placeholder:"kg co2e",class:"w-full border p-2 rounded-md"},null,-1)),xe(a,{onClick:t.updateGeneral},null,8,["onClick"])])])])])}const bOe=Vt(uOe,[["render",gOe]]),tue=[{parameter:"parameters.category",displayName:"Category",data:[]},{parameter:"material.name",displayName:"Material",data:[]},{parameter:"material.metaData.materialType",displayName:"Material Type",data:[]},{parameter:"BSABCodes",displayName:"BSAB Codes",data:[]},{parameter:"parameters.speckle_type",displayName:"Speckle Type",data:[]}],od=h0({id:"resultStore",state:()=>({aggregatedResults:[],resultList:tue,activeParameter:"parameters.category",reloadChartData:!0}),actions:{setResultList(t){this.resultList=t},getGroupedResults(t="all"){return t==="all"?this.resultList:this.resultList[t]?{[t]:this.resultList[t]}:{}},toggleReloadData(){this.reloadChartData=!this.reloadChartData},setReloadData(t){this.reloadChartData=t},setActiveParameter(t){this.activeParameter=t}}}),N1=(t,e=0,n=1)=>oK(lK(e,t),n),aK=t=>{t._clipped=!1,t._unclipped=t.slice(0);for(let e=0;e<=3;e++)e<3?((t[e]<0||t[e]>255)&&(t._clipped=!0),t[e]=N1(t[e],0,255)):e===3&&(t[e]=N1(t[e],0,1));return t},nue={};for(let t of["Boolean","Number","String","Function","Array","Date","RegExp","Undefined","Null"])nue[`[object ${t}]`]=t.toLowerCase();function Mn(t){return nue[Object.prototype.toString.call(t)]||"object"}const Pn=(t,e=null)=>t.length>=3?Array.prototype.slice.call(t):Mn(t[0])=="object"&&e?e.split("").filter(n=>t[0][n]!==void 0).map(n=>t[0][n]):t[0],OV=t=>{if(t.length<2)return null;const e=t.length-1;return Mn(t[e])=="string"?t[e].toLowerCase():null},{PI:IV,min:oK,max:lK}=Math,Gd=IV*2,ik=IV/3,yOe=IV/180,SOe=180/IV,ln={format:{},autodetect:[]};let ht=class{constructor(...e){const n=this;if(Mn(e[0])==="object"&&e[0].constructor&&e[0].constructor===this.constructor)return e[0];let r=OV(e),i=!1;if(!r){i=!0,ln.sorted||(ln.autodetect=ln.autodetect.sort((s,a)=>a.p-s.p),ln.sorted=!0);for(let s of ln.autodetect)if(r=s.test(...e),r)break}if(ln.format[r]){const s=ln.format[r].apply(null,i?e:e.slice(0,-1));n._rgb=aK(s)}else throw new Error("unknown format: "+e);n._rgb.length===3&&n._rgb.push(1)}toString(){return Mn(this.hex)=="function"?this.hex():`[${this._rgb.join(",")}]`}};const xOe="2.6.0",en=(...t)=>new en.Color(...t);en.Color=ht;en.version=xOe;const TOe=(...t)=>{t=Pn(t,"cmyk");const[e,n,r,i]=t,s=t.length>4?t[4]:1;return i===1?[0,0,0,s]:[e>=1?0:255*(1-e)*(1-i),n>=1?0:255*(1-n)*(1-i),r>=1?0:255*(1-r)*(1-i),s]},{max:$j}=Math,wOe=(...t)=>{let[e,n,r]=Pn(t,"rgb");e=e/255,n=n/255,r=r/255;const i=1-$j(e,$j(n,r)),s=i<1?1/(1-i):0,a=(1-e-i)*s,o=(1-n-i)*s,l=(1-r-i)*s;return[a,o,l,i]};ht.prototype.cmyk=function(){return wOe(this._rgb)};en.cmyk=(...t)=>new ht(...t,"cmyk");ln.format.cmyk=TOe;ln.autodetect.push({p:2,test:(...t)=>{if(t=Pn(t,"cmyk"),Mn(t)==="array"&&t.length===4)return"cmyk"}});const sk=t=>Math.round(t*100)/100,EOe=(...t)=>{const e=Pn(t,"hsla");let n=OV(t)||"lsa";return e[0]=sk(e[0]||0),e[1]=sk(e[1]*100)+"%",e[2]=sk(e[2]*100)+"%",n==="hsla"||e.length>3&&e[3]<1?(e[3]=e.length>3?e[3]:1,n="hsla"):e.length=3,`${n}(${e.join(",")})`},rue=(...t)=>{t=Pn(t,"rgba");let[e,n,r]=t;e/=255,n/=255,r/=255;const i=oK(e,n,r),s=lK(e,n,r),a=(s+i)/2;let o,l;return s===i?(o=0,l=Number.NaN):o=a<.5?(s-i)/(s+i):(s-i)/(2-s-i),e==s?l=(n-r)/(s-i):n==s?l=2+(r-e)/(s-i):r==s&&(l=4+(e-n)/(s-i)),l*=60,l<0&&(l+=360),t.length>3&&t[3]!==void 0?[l,o,a,t[3]]:[l,o,a]},{round:ak}=Math,MOe=(...t)=>{const e=Pn(t,"rgba");let n=OV(t)||"rgb";return n.substr(0,3)=="hsl"?EOe(rue(e),n):(e[0]=ak(e[0]),e[1]=ak(e[1]),e[2]=ak(e[2]),(n==="rgba"||e.length>3&&e[3]<1)&&(e[3]=e.length>3?e[3]:1,n="rgba"),`${n}(${e.slice(0,n==="rgb"?3:4).join(",")})`)},{round:ok}=Math,gL=(...t)=>{t=Pn(t,"hsl");const[e,n,r]=t;let i,s,a;if(n===0)i=s=a=r*255;else{const o=[0,0,0],l=[0,0,0],u=r<.5?r*(1+n):r+n-r*n,c=2*r-u,d=e/360;o[0]=d+1/3,o[1]=d,o[2]=d-1/3;for(let f=0;f<3;f++)o[f]<0&&(o[f]+=1),o[f]>1&&(o[f]-=1),6*o[f]<1?l[f]=c+(u-c)*6*o[f]:2*o[f]<1?l[f]=u:3*o[f]<2?l[f]=c+(u-c)*(2/3-o[f])*6:l[f]=c;[i,s,a]=[ok(l[0]*255),ok(l[1]*255),ok(l[2]*255)]}return t.length>3?[i,s,a,t[3]]:[i,s,a,1]},iue=/^rgb\(\s*(-?\d+),\s*(-?\d+)\s*,\s*(-?\d+)\s*\)$/,sue=/^rgba\(\s*(-?\d+),\s*(-?\d+)\s*,\s*(-?\d+)\s*,\s*([01]|[01]?\.\d+)\)$/,aue=/^rgb\(\s*(-?\d+(?:\.\d+)?)%,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*\)$/,oue=/^rgba\(\s*(-?\d+(?:\.\d+)?)%,\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/,lue=/^hsl\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*\)$/,uue=/^hsla\(\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)%\s*,\s*(-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)$/,{round:eZ}=Math,uK=t=>{t=t.toLowerCase().trim();let e;if(ln.format.named)try{return ln.format.named(t)}catch{}if(e=t.match(iue)){const n=e.slice(1,4);for(let r=0;r<3;r++)n[r]=+n[r];return n[3]=1,n}if(e=t.match(sue)){const n=e.slice(1,5);for(let r=0;r<4;r++)n[r]=+n[r];return n}if(e=t.match(aue)){const n=e.slice(1,4);for(let r=0;r<3;r++)n[r]=eZ(n[r]*2.55);return n[3]=1,n}if(e=t.match(oue)){const n=e.slice(1,5);for(let r=0;r<3;r++)n[r]=eZ(n[r]*2.55);return n[3]=+n[3],n}if(e=t.match(lue)){const n=e.slice(1,4);n[1]*=.01,n[2]*=.01;const r=gL(n);return r[3]=1,r}if(e=t.match(uue)){const n=e.slice(1,4);n[1]*=.01,n[2]*=.01;const r=gL(n);return r[3]=+e[4],r}};uK.test=t=>iue.test(t)||sue.test(t)||aue.test(t)||oue.test(t)||lue.test(t)||uue.test(t);ht.prototype.css=function(t){return MOe(this._rgb,t)};en.css=(...t)=>new ht(...t,"css");ln.format.css=uK;ln.autodetect.push({p:5,test:(t,...e)=>{if(!e.length&&Mn(t)==="string"&&uK.test(t))return"css"}});ln.format.gl=(...t)=>{const e=Pn(t,"rgba");return e[0]*=255,e[1]*=255,e[2]*=255,e};en.gl=(...t)=>new ht(...t,"gl");ht.prototype.gl=function(){const t=this._rgb;return[t[0]/255,t[1]/255,t[2]/255,t[3]]};const{floor:POe}=Math,ROe=(...t)=>{t=Pn(t,"hcg");let[e,n,r]=t,i,s,a;r=r*255;const o=n*255;if(n===0)i=s=a=r;else{e===360&&(e=0),e>360&&(e-=360),e<0&&(e+=360),e/=60;const l=POe(e),u=e-l,c=r*(1-n),d=c+o*(1-u),f=c+o*u,h=c+o;switch(l){case 0:[i,s,a]=[h,f,c];break;case 1:[i,s,a]=[d,h,c];break;case 2:[i,s,a]=[c,h,f];break;case 3:[i,s,a]=[c,d,h];break;case 4:[i,s,a]=[f,c,h];break;case 5:[i,s,a]=[h,c,d];break}}return[i,s,a,t.length>3?t[3]:1]},VOe=(...t)=>{const[e,n,r]=Pn(t,"rgb"),i=oK(e,n,r),s=lK(e,n,r),a=s-i,o=a*100/255,l=i/(255-a)*100;let u;return a===0?u=Number.NaN:(e===s&&(u=(n-r)/a),n===s&&(u=2+(r-e)/a),r===s&&(u=4+(e-n)/a),u*=60,u<0&&(u+=360)),[u,o,l]};ht.prototype.hcg=function(){return VOe(this._rgb)};en.hcg=(...t)=>new ht(...t,"hcg");ln.format.hcg=ROe;ln.autodetect.push({p:1,test:(...t)=>{if(t=Pn(t,"hcg"),Mn(t)==="array"&&t.length===3)return"hcg"}});const zOe=/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,kOe=/^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/,cue=t=>{if(t.match(zOe)){(t.length===4||t.length===7)&&(t=t.substr(1)),t.length===3&&(t=t.split(""),t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]);const e=parseInt(t,16),n=e>>16,r=e>>8&255,i=e&255;return[n,r,i,1]}if(t.match(kOe)){(t.length===5||t.length===9)&&(t=t.substr(1)),t.length===4&&(t=t.split(""),t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]+t[3]+t[3]);const e=parseInt(t,16),n=e>>24&255,r=e>>16&255,i=e>>8&255,s=Math.round((e&255)/255*100)/100;return[n,r,i,s]}throw new Error(`unknown hex color: ${t}`)},{round:h2}=Math,due=(...t)=>{let[e,n,r,i]=Pn(t,"rgba"),s=OV(t)||"auto";i===void 0&&(i=1),s==="auto"&&(s=i<1?"rgba":"rgb"),e=h2(e),n=h2(n),r=h2(r);let o="000000"+(e<<16|n<<8|r).toString(16);o=o.substr(o.length-6);let l="0"+h2(i*255).toString(16);switch(l=l.substr(l.length-2),s.toLowerCase()){case"rgba":return`#${o}${l}`;case"argb":return`#${l}${o}`;default:return`#${o}`}};ht.prototype.hex=function(t){return due(this._rgb,t)};en.hex=(...t)=>new ht(...t,"hex");ln.format.hex=cue;ln.autodetect.push({p:4,test:(t,...e)=>{if(!e.length&&Mn(t)==="string"&&[3,4,5,6,7,8,9].indexOf(t.length)>=0)return"hex"}});const{cos:$0}=Math,OOe=(...t)=>{t=Pn(t,"hsi");let[e,n,r]=t,i,s,a;return isNaN(e)&&(e=0),isNaN(n)&&(n=0),e>360&&(e-=360),e<0&&(e+=360),e/=360,e<1/3?(a=(1-n)/3,i=(1+n*$0(Gd*e)/$0(ik-Gd*e))/3,s=1-(a+i)):e<2/3?(e-=1/3,i=(1-n)/3,s=(1+n*$0(Gd*e)/$0(ik-Gd*e))/3,a=1-(i+s)):(e-=2/3,s=(1-n)/3,a=(1+n*$0(Gd*e)/$0(ik-Gd*e))/3,i=1-(s+a)),i=N1(r*i*3),s=N1(r*s*3),a=N1(r*a*3),[i*255,s*255,a*255,t.length>3?t[3]:1]},{min:IOe,sqrt:UOe,acos:NOe}=Math,LOe=(...t)=>{let[e,n,r]=Pn(t,"rgb");e/=255,n/=255,r/=255;let i;const s=IOe(e,n,r),a=(e+n+r)/3,o=a>0?1-s/a:0;return o===0?i=NaN:(i=(e-n+(e-r))/2,i/=UOe((e-n)*(e-n)+(e-r)*(n-r)),i=NOe(i),r>n&&(i=Gd-i),i/=Gd),[i*360,o,a]};ht.prototype.hsi=function(){return LOe(this._rgb)};en.hsi=(...t)=>new ht(...t,"hsi");ln.format.hsi=OOe;ln.autodetect.push({p:2,test:(...t)=>{if(t=Pn(t,"hsi"),Mn(t)==="array"&&t.length===3)return"hsi"}});ht.prototype.hsl=function(){return rue(this._rgb)};en.hsl=(...t)=>new ht(...t,"hsl");ln.format.hsl=gL;ln.autodetect.push({p:2,test:(...t)=>{if(t=Pn(t,"hsl"),Mn(t)==="array"&&t.length===3)return"hsl"}});const{floor:XOe}=Math,COe=(...t)=>{t=Pn(t,"hsv");let[e,n,r]=t,i,s,a;if(r*=255,n===0)i=s=a=r;else{e===360&&(e=0),e>360&&(e-=360),e<0&&(e+=360),e/=60;const o=XOe(e),l=e-o,u=r*(1-n),c=r*(1-n*l),d=r*(1-n*(1-l));switch(o){case 0:[i,s,a]=[r,d,u];break;case 1:[i,s,a]=[c,r,u];break;case 2:[i,s,a]=[u,r,d];break;case 3:[i,s,a]=[u,c,r];break;case 4:[i,s,a]=[d,u,r];break;case 5:[i,s,a]=[r,u,c];break}}return[i,s,a,t.length>3?t[3]:1]},{min:KOe,max:qOe}=Math,DOe=(...t)=>{t=Pn(t,"rgb");let[e,n,r]=t;const i=KOe(e,n,r),s=qOe(e,n,r),a=s-i;let o,l,u;return u=s/255,s===0?(o=Number.NaN,l=0):(l=a/s,e===s&&(o=(n-r)/a),n===s&&(o=2+(r-e)/a),r===s&&(o=4+(e-n)/a),o*=60,o<0&&(o+=360)),[o,l,u]};ht.prototype.hsv=function(){return DOe(this._rgb)};en.hsv=(...t)=>new ht(...t,"hsv");ln.format.hsv=COe;ln.autodetect.push({p:2,test:(...t)=>{if(t=Pn(t,"hsv"),Mn(t)==="array"&&t.length===3)return"hsv"}});const Xo={Kn:18,Xn:.95047,Yn:1,Zn:1.08883,t0:.137931034,t1:.206896552,t2:.12841855,t3:.008856452},{pow:WOe}=Math,fue=(...t)=>{t=Pn(t,"lab");const[e,n,r]=t;let i,s,a,o,l,u;return s=(e+16)/116,i=isNaN(n)?s:s+n/500,a=isNaN(r)?s:s-r/200,s=Xo.Yn*uk(s),i=Xo.Xn*uk(i),a=Xo.Zn*uk(a),o=lk(3.2404542*i-1.5371385*s-.4985314*a),l=lk(-.969266*i+1.8760108*s+.041556*a),u=lk(.0556434*i-.2040259*s+1.0572252*a),[o,l,u,t.length>3?t[3]:1]},lk=t=>255*(t<=.00304?12.92*t:1.055*WOe(t,1/2.4)-.055),uk=t=>t>Xo.t1?t*t*t:Xo.t2*(t-Xo.t0),{pow:hue}=Math,pue=(...t)=>{const[e,n,r]=Pn(t,"rgb"),[i,s,a]=AOe(e,n,r),o=116*s-16;return[o<0?0:o,500*(i-s),200*(s-a)]},ck=t=>(t/=255)<=.04045?t/12.92:hue((t+.055)/1.055,2.4),dk=t=>t>Xo.t3?hue(t,1/3):t/Xo.t2+Xo.t0,AOe=(t,e,n)=>{t=ck(t),e=ck(e),n=ck(n);const r=dk((.4124564*t+.3575761*e+.1804375*n)/Xo.Xn),i=dk((.2126729*t+.7151522*e+.072175*n)/Xo.Yn),s=dk((.0193339*t+.119192*e+.9503041*n)/Xo.Zn);return[r,i,s]};ht.prototype.lab=function(){return pue(this._rgb)};en.lab=(...t)=>new ht(...t,"lab");ln.format.lab=fue;ln.autodetect.push({p:2,test:(...t)=>{if(t=Pn(t,"lab"),Mn(t)==="array"&&t.length===3)return"lab"}});const{sin:GOe,cos:FOe}=Math,mue=(...t)=>{let[e,n,r]=Pn(t,"lch");return isNaN(r)&&(r=0),r=r*yOe,[e,FOe(r)*n,GOe(r)*n]},vue=(...t)=>{t=Pn(t,"lch");const[e,n,r]=t,[i,s,a]=mue(e,n,r),[o,l,u]=fue(i,s,a);return[o,l,u,t.length>3?t[3]:1]},jOe=(...t)=>{const e=Pn(t,"hcl").reverse();return vue(...e)},{sqrt:ZOe,atan2:JOe,round:YOe}=Math,gue=(...t)=>{const[e,n,r]=Pn(t,"lab"),i=ZOe(n*n+r*r);let s=(JOe(r,n)*SOe+360)%360;return YOe(i*1e4)===0&&(s=Number.NaN),[e,i,s]},bue=(...t)=>{const[e,n,r]=Pn(t,"rgb"),[i,s,a]=pue(e,n,r);return gue(i,s,a)};ht.prototype.lch=function(){return bue(this._rgb)};ht.prototype.hcl=function(){return bue(this._rgb).reverse()};en.lch=(...t)=>new ht(...t,"lch");en.hcl=(...t)=>new ht(...t,"hcl");ln.format.lch=vue;ln.format.hcl=jOe;["lch","hcl"].forEach(t=>ln.autodetect.push({p:2,test:(...e)=>{if(e=Pn(e,t),Mn(e)==="array"&&e.length===3)return t}}));const hb={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",laserlemon:"#ffff54",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrod:"#fafad2",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",maroon2:"#7f0000",maroon3:"#b03060",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",purple2:"#7f007f",purple3:"#a020f0",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};ht.prototype.name=function(){const t=due(this._rgb,"rgb");for(let e of Object.keys(hb))if(hb[e]===t)return e.toLowerCase();return t};ln.format.named=t=>{if(t=t.toLowerCase(),hb[t])return cue(hb[t]);throw new Error("unknown color name: "+t)};ln.autodetect.push({p:5,test:(t,...e)=>{if(!e.length&&Mn(t)==="string"&&hb[t.toLowerCase()])return"named"}});const BOe=t=>{if(Mn(t)=="number"&&t>=0&&t<=16777215){const e=t>>16,n=t>>8&255,r=t&255;return[e,n,r,1]}throw new Error("unknown num color: "+t)},HOe=(...t)=>{const[e,n,r]=Pn(t,"rgb");return(e<<16)+(n<<8)+r};ht.prototype.num=function(){return HOe(this._rgb)};en.num=(...t)=>new ht(...t,"num");ln.format.num=BOe;ln.autodetect.push({p:5,test:(...t)=>{if(t.length===1&&Mn(t[0])==="number"&&t[0]>=0&&t[0]<=16777215)return"num"}});const{round:yue}=Math;ht.prototype.rgb=function(t=!0){return t===!1?this._rgb.slice(0,3):this._rgb.slice(0,3).map(yue)};ht.prototype.rgba=function(t=!0){return this._rgb.slice(0,4).map((e,n)=>n<3?t===!1?e:yue(e):e)};en.rgb=(...t)=>new ht(...t,"rgb");ln.format.rgb=(...t)=>{const e=Pn(t,"rgba");return e[3]===void 0&&(e[3]=1),e};ln.autodetect.push({p:3,test:(...t)=>{if(t=Pn(t,"rgba"),Mn(t)==="array"&&(t.length===3||t.length===4&&Mn(t[3])=="number"&&t[3]>=0&&t[3]<=1))return"rgb"}});const{log:p2}=Math,Sue=t=>{const e=t/100;let n,r,i;return e<66?(n=255,r=e<6?0:-155.25485562709179-.44596950469579133*(r=e-2)+104.49216199393888*p2(r),i=e<20?0:-254.76935184120902+.8274096064007395*(i=e-10)+115.67994401066147*p2(i)):(n=351.97690566805693+.114206453784165*(n=e-55)-40.25366309332127*p2(n),r=325.4494125711974+.07943456536662342*(r=e-50)-28.0852963507957*p2(r),i=255),[n,r,i,1]},{round:QOe}=Math,_Oe=(...t)=>{const e=Pn(t,"rgb"),n=e[0],r=e[2];let i=1e3,s=4e4;const a=.4;let o;for(;s-i>a;){o=(s+i)*.5;const l=Sue(o);l[2]/l[0]>=r/n?s=o:i=o}return QOe(o)};ht.prototype.temp=ht.prototype.kelvin=ht.prototype.temperature=function(){return _Oe(this._rgb)};en.temp=en.kelvin=en.temperature=(...t)=>new ht(...t,"temp");ln.format.temp=ln.format.kelvin=ln.format.temperature=Sue;const{pow:b7,sign:$Oe}=Math,xue=(...t)=>{t=Pn(t,"lab");const[e,n,r]=t,i=b7(e+.3963377774*n+.2158037573*r,3),s=b7(e-.1055613458*n-.0638541728*r,3),a=b7(e-.0894841775*n-1.291485548*r,3);return[255*fk(4.0767416621*i-3.3077115913*s+.2309699292*a),255*fk(-1.2684380046*i+2.6097574011*s-.3413193965*a),255*fk(-.0041960863*i-.7034186147*s+1.707614701*a),t.length>3?t[3]:1]};function fk(t){const e=Math.abs(t);return e>.0031308?($Oe(t)||1)*(1.055*b7(e,1/2.4)-.055):t*12.92}const{cbrt:hk,pow:eIe,sign:tIe}=Math,Tue=(...t)=>{const[e,n,r]=Pn(t,"rgb"),[i,s,a]=[pk(e/255),pk(n/255),pk(r/255)],o=hk(.4122214708*i+.5363325363*s+.0514459929*a),l=hk(.2119034982*i+.6806995451*s+.1073969566*a),u=hk(.0883024619*i+.2817188376*s+.6299787005*a);return[.2104542553*o+.793617785*l-.0040720468*u,1.9779984951*o-2.428592205*l+.4505937099*u,.0259040371*o+.7827717662*l-.808675766*u]};function pk(t){const e=Math.abs(t);return e<.04045?t/12.92:(tIe(t)||1)*eIe((e+.055)/1.055,2.4)}ht.prototype.oklab=function(){return Tue(this._rgb)};en.oklab=(...t)=>new ht(...t,"oklab");ln.format.oklab=xue;ln.autodetect.push({p:3,test:(...t)=>{if(t=Pn(t,"oklab"),Mn(t)==="array"&&t.length===3)return"oklab"}});const nIe=(...t)=>{t=Pn(t,"lch");const[e,n,r]=t,[i,s,a]=mue(e,n,r),[o,l,u]=xue(i,s,a);return[o,l,u,t.length>3?t[3]:1]},rIe=(...t)=>{const[e,n,r]=Pn(t,"rgb"),[i,s,a]=Tue(e,n,r);return gue(i,s,a)};ht.prototype.oklch=function(){return rIe(this._rgb)};en.oklch=(...t)=>new ht(...t,"oklch");ln.format.oklch=nIe;ln.autodetect.push({p:3,test:(...t)=>{if(t=Pn(t,"oklch"),Mn(t)==="array"&&t.length===3)return"oklch"}});ht.prototype.alpha=function(t,e=!1){return t!==void 0&&Mn(t)==="number"?e?(this._rgb[3]=t,this):new ht([this._rgb[0],this._rgb[1],this._rgb[2],t],"rgb"):this._rgb[3]};ht.prototype.clipped=function(){return this._rgb._clipped||!1};ht.prototype.darken=function(t=1){const e=this,n=e.lab();return n[0]-=Xo.Kn*t,new ht(n,"lab").alpha(e.alpha(),!0)};ht.prototype.brighten=function(t=1){return this.darken(-t)};ht.prototype.darker=ht.prototype.darken;ht.prototype.brighter=ht.prototype.brighten;ht.prototype.get=function(t){const[e,n]=t.split("."),r=this[e]();if(n){const i=e.indexOf(n)-(e.substr(0,2)==="ok"?2:0);if(i>-1)return r[i];throw new Error(`unknown channel ${n} in mode ${e}`)}else return r};const{pow:iIe}=Math,sIe=1e-7,aIe=20;ht.prototype.luminance=function(t,e="rgb"){if(t!==void 0&&Mn(t)==="number"){if(t===0)return new ht([0,0,0,this._rgb[3]],"rgb");if(t===1)return new ht([255,255,255,this._rgb[3]],"rgb");let n=this.luminance(),r=aIe;const i=(a,o)=>{const l=a.interpolate(o,.5,e),u=l.luminance();return Math.abs(t-u)t?i(a,l):i(l,o)},s=(n>t?i(new ht([0,0,0]),this):i(this,new ht([255,255,255]))).rgb();return new ht([...s,this._rgb[3]])}return oIe(...this._rgb.slice(0,3))};const oIe=(t,e,n)=>(t=mk(t),e=mk(e),n=mk(n),.2126*t+.7152*e+.0722*n),mk=t=>(t/=255,t<=.03928?t/12.92:iIe((t+.055)/1.055,2.4)),Oa={},t6=(t,e,n=.5,...r)=>{let i=r[0]||"lrgb";if(!Oa[i]&&!r.length&&(i=Object.keys(Oa)[0]),!Oa[i])throw new Error(`interpolation mode ${i} is not defined`);return Mn(t)!=="object"&&(t=new ht(t)),Mn(e)!=="object"&&(e=new ht(e)),Oa[i](t,e,n).alpha(t.alpha()+n*(e.alpha()-t.alpha()))};ht.prototype.mix=ht.prototype.interpolate=function(t,e=.5,...n){return t6(this,t,e,...n)};ht.prototype.premultiply=function(t=!1){const e=this._rgb,n=e[3];return t?(this._rgb=[e[0]*n,e[1]*n,e[2]*n,n],this):new ht([e[0]*n,e[1]*n,e[2]*n,n],"rgb")};ht.prototype.saturate=function(t=1){const e=this,n=e.lch();return n[1]+=Xo.Kn*t,n[1]<0&&(n[1]=0),new ht(n,"lch").alpha(e.alpha(),!0)};ht.prototype.desaturate=function(t=1){return this.saturate(-t)};ht.prototype.set=function(t,e,n=!1){const[r,i]=t.split("."),s=this[r]();if(i){const a=r.indexOf(i)-(r.substr(0,2)==="ok"?2:0);if(a>-1){if(Mn(e)=="string")switch(e.charAt(0)){case"+":s[a]+=+e;break;case"-":s[a]+=+e;break;case"*":s[a]*=+e.substr(1);break;case"/":s[a]/=+e.substr(1);break;default:s[a]=+e}else if(Mn(e)==="number")s[a]=e;else throw new Error("unsupported value for Color.set");const o=new ht(s,r);return n?(this._rgb=o._rgb,this):o}throw new Error(`unknown channel ${i} in mode ${r}`)}else return s};ht.prototype.tint=function(t=.5,...e){return t6(this,"white",t,...e)};ht.prototype.shade=function(t=.5,...e){return t6(this,"black",t,...e)};const lIe=(t,e,n)=>{const r=t._rgb,i=e._rgb;return new ht(r[0]+n*(i[0]-r[0]),r[1]+n*(i[1]-r[1]),r[2]+n*(i[2]-r[2]),"rgb")};Oa.rgb=lIe;const{sqrt:vk,pow:eg}=Math,uIe=(t,e,n)=>{const[r,i,s]=t._rgb,[a,o,l]=e._rgb;return new ht(vk(eg(r,2)*(1-n)+eg(a,2)*n),vk(eg(i,2)*(1-n)+eg(o,2)*n),vk(eg(s,2)*(1-n)+eg(l,2)*n),"rgb")};Oa.lrgb=uIe;const cIe=(t,e,n)=>{const r=t.lab(),i=e.lab();return new ht(r[0]+n*(i[0]-r[0]),r[1]+n*(i[1]-r[1]),r[2]+n*(i[2]-r[2]),"lab")};Oa.lab=cIe;const cy=(t,e,n,r)=>{let i,s;r==="hsl"?(i=t.hsl(),s=e.hsl()):r==="hsv"?(i=t.hsv(),s=e.hsv()):r==="hcg"?(i=t.hcg(),s=e.hcg()):r==="hsi"?(i=t.hsi(),s=e.hsi()):r==="lch"||r==="hcl"?(r="hcl",i=t.hcl(),s=e.hcl()):r==="oklch"&&(i=t.oklch().reverse(),s=e.oklch().reverse());let a,o,l,u,c,d;(r.substr(0,1)==="h"||r==="oklch")&&([a,l,c]=i,[o,u,d]=s);let f,h,p,m;return!isNaN(a)&&!isNaN(o)?(o>a&&o-a>180?m=o-(a+360):o180?m=o+360-a:m=o-a,h=a+n*m):isNaN(a)?isNaN(o)?h=Number.NaN:(h=o,(c==1||c==0)&&r!="hsv"&&(f=u)):(h=a,(d==1||d==0)&&r!="hsv"&&(f=l)),f===void 0&&(f=l+n*(u-l)),p=c+n*(d-c),r==="oklch"?new ht([p,f,h],r):new ht([h,f,p],r)},wue=(t,e,n)=>cy(t,e,n,"lch");Oa.lch=wue;Oa.hcl=wue;const dIe=(t,e,n)=>{const r=t.num(),i=e.num();return new ht(r+n*(i-r),"num")};Oa.num=dIe;const fIe=(t,e,n)=>cy(t,e,n,"hcg");Oa.hcg=fIe;const hIe=(t,e,n)=>cy(t,e,n,"hsi");Oa.hsi=hIe;const pIe=(t,e,n)=>cy(t,e,n,"hsl");Oa.hsl=pIe;const mIe=(t,e,n)=>cy(t,e,n,"hsv");Oa.hsv=mIe;const vIe=(t,e,n)=>{const r=t.oklab(),i=e.oklab();return new ht(r[0]+n*(i[0]-r[0]),r[1]+n*(i[1]-r[1]),r[2]+n*(i[2]-r[2]),"oklab")};Oa.oklab=vIe;const gIe=(t,e,n)=>cy(t,e,n,"oklch");Oa.oklch=gIe;const{pow:gk,sqrt:bk,PI:yk,cos:tZ,sin:nZ,atan2:bIe}=Math,yIe=(t,e="lrgb",n=null)=>{const r=t.length;n||(n=Array.from(new Array(r)).map(()=>1));const i=r/n.reduce(function(d,f){return d+f});if(n.forEach((d,f)=>{n[f]*=i}),t=t.map(d=>new ht(d)),e==="lrgb")return SIe(t,n);const s=t.shift(),a=s.get(e),o=[];let l=0,u=0;for(let d=0;d{const h=d.get(e);c+=d.alpha()*n[f+1];for(let p=0;p=360;)f-=360;a[d]=f}else a[d]=a[d]/o[d];return c/=r,new ht(a,e).alpha(c>.99999?1:c,!0)},SIe=(t,e)=>{const n=t.length,r=[0,0,0,0];for(let i=0;i.9999999&&(r[3]=1),new ht(aK(r))},{pow:xIe}=Math;function eP(t){let e="rgb",n=en("#ccc"),r=0,i=[0,1],s=[],a=[0,0],o=!1,l=[],u=!1,c=0,d=1,f=!1,h={},p=!0,m=1;const v=function(E){if(E=E||["#fff","#000"],E&&Mn(E)==="string"&&en.brewer&&en.brewer[E.toLowerCase()]&&(E=en.brewer[E.toLowerCase()]),Mn(E)==="array"){E.length===1&&(E=[E[0],E[0]]),E=E.slice(0);for(let S=0;S=o[P];)P++;return P-1}return 0};let b=E=>E,y=E=>E;const x=function(E,S){let P,R;if(S==null&&(S=!1),isNaN(E)||E===null)return n;S?R=E:o&&o.length>2?R=g(E)/(o.length-2):d!==c?R=(E-c)/(d-c):R=1,R=y(R),S||(R=b(R)),m!==1&&(R=xIe(R,m)),R=a[0]+R*(1-a[0]-a[1]),R=N1(R,0,1);const V=Math.floor(R*1e4);if(p&&h[V])P=h[V];else{if(Mn(l)==="array")for(let z=0;z=k&&z===s.length-1){P=l[z];break}if(R>k&&Rh={};v(t);const M=function(E){const S=en(x(E));return u&&S[u]?S[u]():S};return M.classes=function(E){if(E!=null){if(Mn(E)==="array")o=E,i=[E[0],E[E.length-1]];else{const S=en.analyze(i);E===0?o=[S.min,S.max]:o=en.limits(S,"e",E)}return M}return o},M.domain=function(E){if(!arguments.length)return i;c=E[0],d=E[E.length-1],s=[];const S=l.length;if(E.length===S&&c!==d)for(let P of Array.from(E))s.push((P-c)/(d-c));else{for(let P=0;P2){const P=E.map((V,z)=>z/(E.length-1)),R=E.map(V=>(V-c)/(d-c));R.every((V,z)=>P[z]===V)||(y=V=>{if(V<=0||V>=1)return V;let z=0;for(;V>=R[z+1];)z++;const k=(V-R[z])/(R[z+1]-R[z]);return P[z]+k*(P[z+1]-P[z])})}}return i=[c,d],M},M.mode=function(E){return arguments.length?(e=E,T(),M):e},M.range=function(E,S){return v(E),M},M.out=function(E){return u=E,M},M.spread=function(E){return arguments.length?(r=E,M):r},M.correctLightness=function(E){return E==null&&(E=!0),f=E,T(),f?b=function(S){const P=x(0,!0).lab()[0],R=x(1,!0).lab()[0],V=P>R;let z=x(S,!0).lab()[0];const k=P+(R-P)*S;let N=z-k,q=0,L=1,A=20;for(;Math.abs(N)>.01&&A-- >0;)(function(){return V&&(N*=-1),N<0?(q=S,S+=(L-S)*.5):(L=S,S+=(q-S)*.5),z=x(S,!0).lab()[0],N=z-k})();return S}:b=S=>S,M},M.padding=function(E){return E!=null?(Mn(E)==="number"&&(E=[E,E]),a=E,M):a},M.colors=function(E,S){arguments.length<2&&(S="hex");let P=[];if(arguments.length===0)P=l.slice(0);else if(E===1)P=[M(.5)];else if(E>1){const R=i[0],V=i[1]-R;P=TIe(0,E,!1).map(z=>M(R+z/(E-1)*V))}else{t=[];let R=[];if(o&&o.length>2)for(let V=1,z=o.length,k=1<=z;k?Vz;k?V++:V--)R.push((o[V-1]+o[V])*.5);else R=i;P=R.map(V=>M(V))}return en[S]&&(P=P.map(R=>R[S]())),P},M.cache=function(E){return E!=null?(p=E,M):p},M.gamma=function(E){return E!=null?(m=E,M):m},M.nodata=function(E){return E!=null?(n=en(E),M):n},M}function TIe(t,e,n){let r=[],i=ts;i?a++:a--)r.push(a);return r}const wIe=function(t){let e=[1,1];for(let n=1;nnew ht(s)),t.length===2)[n,r]=t.map(s=>s.lab()),e=function(s){const a=[0,1,2].map(o=>n[o]+s*(r[o]-n[o]));return new ht(a,"lab")};else if(t.length===3)[n,r,i]=t.map(s=>s.lab()),e=function(s){const a=[0,1,2].map(o=>(1-s)*(1-s)*n[o]+2*(1-s)*s*r[o]+s*s*i[o]);return new ht(a,"lab")};else if(t.length===4){let s;[n,r,i,s]=t.map(a=>a.lab()),e=function(a){const o=[0,1,2].map(l=>(1-a)*(1-a)*(1-a)*n[l]+3*(1-a)*(1-a)*a*r[l]+3*(1-a)*a*a*i[l]+a*a*a*s[l]);return new ht(o,"lab")}}else if(t.length>=5){let s,a,o;s=t.map(l=>l.lab()),o=t.length-1,a=wIe(o),e=function(l){const u=1-l,c=[0,1,2].map(d=>s.reduce((f,h,p)=>f+a[p]*u**(o-p)*l**p*h[d],0));return new ht(c,"lab")}}else throw new RangeError("No point in running bezier with only one color.");return e},MIe=t=>{const e=EIe(t);return e.scale=()=>eP(e),e},qu=(t,e,n)=>{if(!qu[n])throw new Error("unknown blend mode "+n);return qu[n](t,e)},$p=t=>(e,n)=>{const r=en(n).rgb(),i=en(e).rgb();return en.rgb(t(r,i))},em=t=>(e,n)=>{const r=[];return r[0]=t(e[0],n[0]),r[1]=t(e[1],n[1]),r[2]=t(e[2],n[2]),r},PIe=t=>t,RIe=(t,e)=>t*e/255,VIe=(t,e)=>t>e?e:t,zIe=(t,e)=>t>e?t:e,kIe=(t,e)=>255*(1-(1-t/255)*(1-e/255)),OIe=(t,e)=>e<128?2*t*e/255:255*(1-2*(1-t/255)*(1-e/255)),IIe=(t,e)=>255*(1-(1-e/255)/(t/255)),UIe=(t,e)=>t===255?255:(t=255*(e/255)/(1-t/255),t>255?255:t);qu.normal=$p(em(PIe));qu.multiply=$p(em(RIe));qu.screen=$p(em(kIe));qu.overlay=$p(em(OIe));qu.darken=$p(em(VIe));qu.lighten=$p(em(zIe));qu.dodge=$p(em(UIe));qu.burn=$p(em(IIe));const{pow:NIe,sin:LIe,cos:XIe}=Math;function CIe(t=300,e=-1.5,n=1,r=1,i=[0,1]){let s=0,a;Mn(i)==="array"?a=i[1]-i[0]:(a=0,i=[i,i]);const o=function(l){const u=Gd*((t+120)/360+e*l),c=NIe(i[0]+a*l,r),f=(s!==0?n[0]+l*s:n)*c*(1-c)/2,h=XIe(u),p=LIe(u),m=c+f*(-.14861*h+1.78277*p),v=c+f*(-.29227*h-.90649*p),g=c+f*(1.97294*h);return en(aK([m*255,v*255,g*255,1]))};return o.start=function(l){return l==null?t:(t=l,o)},o.rotations=function(l){return l==null?e:(e=l,o)},o.gamma=function(l){return l==null?r:(r=l,o)},o.hue=function(l){return l==null?n:(n=l,Mn(n)==="array"?(s=n[1]-n[0],s===0&&(n=n[1])):s=0,o)},o.lightness=function(l){return l==null?i:(Mn(l)==="array"?(i=l,a=l[1]-l[0]):(i=[l,l],a=0),o)},o.scale=()=>en.scale(o),o.hue(n),o}const KIe="0123456789abcdef",{floor:qIe,random:DIe}=Math,WIe=()=>{let t="#";for(let e=0;e<6;e++)t+=KIe.charAt(qIe(DIe()*16));return new ht(t,"hex")},{log:rZ,pow:AIe,floor:GIe,abs:FIe}=Math;function Eue(t,e=null){const n={min:Number.MAX_VALUE,max:Number.MAX_VALUE*-1,sum:0,values:[],count:0};return Mn(t)==="object"&&(t=Object.values(t)),t.forEach(r=>{e&&Mn(r)==="object"&&(r=r[e]),r!=null&&!isNaN(r)&&(n.values.push(r),n.sum+=r,rn.max&&(n.max=r),n.count+=1)}),n.domain=[n.min,n.max],n.limits=(r,i)=>Mue(n,r,i),n}function Mue(t,e="equal",n=7){Mn(t)=="array"&&(t=Eue(t));const{min:r,max:i}=t,s=t.values.sort((o,l)=>o-l);if(n===1)return[r,i];const a=[];if(e.substr(0,1)==="c"&&(a.push(r),a.push(i)),e.substr(0,1)==="e"){a.push(r);for(let o=1;o 0");const o=Math.LOG10E*rZ(r),l=Math.LOG10E*rZ(i);a.push(r);for(let u=1;u200&&(d=!1)}const p={};for(let v=0;vv-g),a.push(m[0]);for(let v=1;v{t=new ht(t),e=new ht(e);const n=t.luminance(),r=e.luminance();return n>r?(n+.05)/(r+.05):(r+.05)/(n+.05)},{sqrt:yd,pow:Hi,min:ZIe,max:JIe,atan2:iZ,abs:sZ,cos:m2,sin:aZ,exp:YIe,PI:oZ}=Math;function BIe(t,e,n=1,r=1,i=1){var s=function(_){return 360*_/(2*oZ)},a=function(_){return 2*oZ*_/360};t=new ht(t),e=new ht(e);const[o,l,u]=Array.from(t.lab()),[c,d,f]=Array.from(e.lab()),h=(o+c)/2,p=yd(Hi(l,2)+Hi(u,2)),m=yd(Hi(d,2)+Hi(f,2)),v=(p+m)/2,g=.5*(1-yd(Hi(v,7)/(Hi(v,7)+Hi(25,7)))),b=l*(1+g),y=d*(1+g),x=yd(Hi(b,2)+Hi(u,2)),T=yd(Hi(y,2)+Hi(f,2)),M=(x+T)/2,E=s(iZ(u,b)),S=s(iZ(f,y)),P=E>=0?E:E+360,R=S>=0?S:S+360,V=sZ(P-R)>180?(P+R+360)/2:(P+R)/2,z=1-.17*m2(a(V-30))+.24*m2(a(2*V))+.32*m2(a(3*V+6))-.2*m2(a(4*V-63));let k=R-P;k=sZ(k)<=180?k:R<=P?k+360:k-360,k=2*yd(x*T)*aZ(a(k)/2);const N=c-o,q=T-x,L=1+.015*Hi(h-50,2)/yd(20+Hi(h-50,2)),A=1+.045*M,J=1+.015*M*z,F=30*YIe(-Hi((V-275)/25,2)),j=-(2*yd(Hi(M,7)/(Hi(M,7)+Hi(25,7))))*aZ(2*a(F)),Z=yd(Hi(N/(n*L),2)+Hi(q/(r*A),2)+Hi(k/(i*J),2)+j*(q/(r*A))*(k/(i*J)));return JIe(0,ZIe(100,Z))}function HIe(t,e,n="lab"){t=new ht(t),e=new ht(e);const r=t.get(n),i=e.get(n);let s=0;for(let a in r){const o=(r[a]||0)-(i[a]||0);s+=o*o}return Math.sqrt(s)}const QIe=(...t)=>{try{return new ht(...t),!0}catch{return!1}},_Ie={cool(){return eP([en.hsl(180,1,.9),en.hsl(250,.7,.4)])},hot(){return eP(["#000","#f00","#ff0","#fff"]).mode("rgb")}},y7={OrRd:["#fff7ec","#fee8c8","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#b30000","#7f0000"],PuBu:["#fff7fb","#ece7f2","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#045a8d","#023858"],BuPu:["#f7fcfd","#e0ecf4","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#810f7c","#4d004b"],Oranges:["#fff5eb","#fee6ce","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#a63603","#7f2704"],BuGn:["#f7fcfd","#e5f5f9","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#006d2c","#00441b"],YlOrBr:["#ffffe5","#fff7bc","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#993404","#662506"],YlGn:["#ffffe5","#f7fcb9","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#006837","#004529"],Reds:["#fff5f0","#fee0d2","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#a50f15","#67000d"],RdPu:["#fff7f3","#fde0dd","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177","#49006a"],Greens:["#f7fcf5","#e5f5e0","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#006d2c","#00441b"],YlGnBu:["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#253494","#081d58"],Purples:["#fcfbfd","#efedf5","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#54278f","#3f007d"],GnBu:["#f7fcf0","#e0f3db","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#0868ac","#084081"],Greys:["#ffffff","#f0f0f0","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525","#000000"],YlOrRd:["#ffffcc","#ffeda0","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#bd0026","#800026"],PuRd:["#f7f4f9","#e7e1ef","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#980043","#67001f"],Blues:["#f7fbff","#deebf7","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#08519c","#08306b"],PuBuGn:["#fff7fb","#ece2f0","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016c59","#014636"],Viridis:["#440154","#482777","#3f4a8a","#31678e","#26838f","#1f9d8a","#6cce5a","#b6de2b","#fee825"],Spectral:["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#ffffbf","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2"],RdYlGn:["#a50026","#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850","#006837"],RdBu:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac","#053061"],PiYG:["#8e0152","#c51b7d","#de77ae","#f1b6da","#fde0ef","#f7f7f7","#e6f5d0","#b8e186","#7fbc41","#4d9221","#276419"],PRGn:["#40004b","#762a83","#9970ab","#c2a5cf","#e7d4e8","#f7f7f7","#d9f0d3","#a6dba0","#5aae61","#1b7837","#00441b"],RdYlBu:["#a50026","#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"],BrBG:["#543005","#8c510a","#bf812d","#dfc27d","#f6e8c3","#f5f5f5","#c7eae5","#80cdc1","#35978f","#01665e","#003c30"],RdGy:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#ffffff","#e0e0e0","#bababa","#878787","#4d4d4d","#1a1a1a"],PuOr:["#7f3b08","#b35806","#e08214","#fdb863","#fee0b6","#f7f7f7","#d8daeb","#b2abd2","#8073ac","#542788","#2d004b"],Set2:["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854","#ffd92f","#e5c494","#b3b3b3"],Accent:["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0","#f0027f","#bf5b17","#666666"],Set1:["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf","#999999"],Set3:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd","#ccebc5","#ffed6f"],Dark2:["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02","#a6761d","#666666"],Paired:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6","#6a3d9a","#ffff99","#b15928"],Pastel2:["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9","#fff2ae","#f1e2cc","#cccccc"],Pastel1:["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc","#e5d8bd","#fddaec","#f2f2f2"]};for(let t of Object.keys(y7))y7[t.toLowerCase()]=y7[t];Object.assign(en,{average:yIe,bezier:MIe,blend:qu,cubehelix:CIe,mix:t6,interpolate:t6,random:WIe,scale:eP,analyze:Eue,contrast:jIe,deltaE:BIe,distance:HIe,limits:Mue,valid:QIe,scales:_Ie,input:ln,colors:hb,brewer:y7});const n6={primaryGreen:"#95C92C",secondaryGreen:"#B5E655",primaryRed:"#F06000",secondaryRed:"#FF8F00",primaryGrey:"#E0E0E0"},lZ={white:"text-gray-200",black:"text-gray-700"};class $Ie{constructor(){qt(this,"colors",["rgb(153,128,119)","rgb(199,151,129)","rgb(187,167,137)","rgb(205,197,177)","rgb(224,222,197)","rgb(194,207,179)","rgb(173,183,167)","rgb(160,167,159)","rgb(140,144,145)","rgb(62,85,100)","rgb(106,119,134)","rgb(150,151,170)","rgb(111,85,101)","rgb(128,106,109)"]);qt(this,"colorIndex",0)}rgbStringToArray(e){const n=e.match(/\d+/g);return n?n.map(Number):[0,0,0]}rgbToHsl(e){const[n,r,i]=this.rgbStringToArray(e).map(c=>c/255),s=Math.max(n,r,i),a=Math.min(n,r,i);let o=0,l,u=(s+a)/2;if(s===a)o=l=0;else{const c=s-a;switch(l=u>.5?c/(2-s-a):c/(s+a),s){case n:o=(r-i)/c+(r=this.colors.length)return this.colors.map(r=>this.hslToString(this.rgbToHsl(r)));const n=[this.hslToString(this.rgbToHsl(this.colors[0]))];for(let r=1;rthis.calculateColorDistanceHSL(this.hslToString(this.rgbToHsl(l)),a)));o>i&&(i=o,s=a)}n.push(this.hslToString(this.rgbToHsl(s)))}return n}getNextColor(){return this.hslToString(this.rgbToHsl(this.colors[this.colorIndex++%this.colors.length]))}resetColorIndex(e=0){this.colorIndex=e}}function eUe(t){var r;const e=(r=t.match(/\d+/g))==null?void 0:r.map(Number);if(!e||e.length!==3)throw new Error("Invalid HSL format");return e[2]<50?lZ.white:lZ.black}function uZ(t,e,n){n/=100;const r=e*Math.min(n,1-n)/100,i=s=>{const a=(s+t/30)%12,o=n-r*Math.max(Math.min(a-3,9-a,1),-1);return Math.round(255*o).toString(16).padStart(2,"0")};return`#${i(0)}${i(8)}${i(4)}`}function UV(t,e,n,r=n6.primaryGreen,i=n6.primaryRed){const s=(t-e)/(n-e);return en.scale([r,i])(s).hex()}var vT=(t=>(t[t.LCAbyg=0]="LCAbyg",t[t.Organisation=1]="Organisation",t[t.Revalu=2]="Revalu",t[t.ECOPortal=3]="ECOPortal",t))(vT||{});const tUe=["gwp","gwp_total","gwp_fossil","gwp_biogenic","gwp_LULUC","odp","ap","pocp"],nUe=["a1a3","a4","a5","b1","b2","b3","b4","b5","b6","c1","c2","c3","c4","d"],rUe=[{id:"9ebc16ed-ae04-462b-bb9e-3e8411a51aae",name:"Crosslaminated timber. CLT (Forbrænding EoL)",description:"Cross Laminated Timber is a solid construction wood product consisting of bonded wood layer panels arranged at right angles to each other.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"-664",C3:"744",C4:"0",D:"-387"}},conversions:{kg:{to:"kg",value:"470"}},source:{url:"https://www.epddanmark.dk/media/tmwhxyym/md-20007-en_rev1_tr%c3%a6dk.pdf"},subType:"Branche data",materialType:"Wood"},{id:"d71b6dca-db6f-401a-b39a-6ff5a87c1f3c",name:"Construction wood - pine. Planed (Forbrænding EoL)",description:"Danish planed construction wood products of coniferous wood.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"-652",C3:"709",C4:"0",D:"-425"}},conversions:{kg:{to:"kg",value:"536"}},source:{url:"https://www.epddanmark.dk/media/4p1frhby/md-20003-en-tr%c3%a6-dk-c-o-tr%c3%a6-og-m%c3%b8belindustrien.pdf"},subType:"Branche data",materialType:"Wood"},{id:"c00435c8-b4ef-4467-af08-ca881c96ea73",name:"Construction wood - pine. Wet and sawn (Forbrænding EoL)",description:"Danish, wet and sawn construction wood products of coniferous wood.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"-664",C3:"709",C4:"0",D:"-425"}},conversions:{kg:{to:"kg",value:"644"}},source:{url:"https://www.epddanmark.dk/media/oxujrihc/md-20001-en-tr%c3%a6-dk-c-o-tr%c3%a6-og-m%c3%b8belindustrien.pdf"},subType:"Branche data",materialType:"Wood"},{id:"e17fc44d-d098-4574-80cb-6aadf382a5b4",name:"Limtræs-produkter af fyr og gran. (Forbrænding EoL)",description:"Glulam construction wood products of pine and spruce.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"-610",C3:"743",C4:"0",D:"-395"}},conversions:{kg:{to:"kg",value:"500"}},source:{url:"https://www.epddanmark.dk/media/hzjhj3s2/md-20005-en_rev1_tr%c3%a6dk.pdf"},subType:"Branche data",materialType:"Wood"},{id:"c0648552-a21e-4344-a415-5830840a8532",name:"Huldæk element. 22 cm. 6-10 forspændingsliner",description:"22 cm tyk huldæk element I beton, med 6-10 forspændingsliner i diameter 12,5 mm",location:"DK",unit:"m2",emission:{gwp:{a1a3:"49.8",C3:"1.04",C4:"0.76",D:"-0.705"}},conversions:{kg:{to:"kg",value:"344.6"}},source:{url:"https://www.epddanmark.dk/media/ksolk4dz/md-20017-da_rev2-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"6f865697-927b-4bcc-99cd-c75885a6ec0a",name:"Huldæk element. 32 cm. 6-10 forspændingsliner",description:"32 cm tyk huldæk element I beton, med 6-10 forspændingsliner i diameter 12,5 mm",location:"DK",unit:"m2",emission:{gwp:{a1a3:"66.4",C3:"1.4",C4:"1.03",D:"-0.953"}},conversions:{kg:{to:"kg",value:"459.6"}},source:{url:"https://www.epddanmark.dk/media/ksolk4dz/md-20017-da_rev2-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"9f7e5dfb-808e-4253-9b56-d28958212b85",name:"Huldæk element. 32 cm. 11-17 forspændingsliner",description:"32 cm tyk huldæk element I beton, med 11-17 forspændingsliner i diameter 12,5 mm",location:"DK",unit:"m2",emission:{gwp:{a1a3:"67.9",C3:"1.37",C4:"1",D:"-0.925"}},conversions:{kg:{to:"kg",value:"451.4"}},source:{url:"https://www.epddanmark.dk/media/ksolk4dz/md-20017-da_rev2-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"ad5a72de-38c2-43eb-8866-9ff8254fdcad",name:"Letklinkerblok. massiv",description:"Letklinkerblokke anvendes bl.a. til følgende bygningsdele: Fundamenter og sokler, kældertrapper og lyskasser, kældervægge, støttemure, og indvendige og udvendige vægge.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"194",C3:"1.6",C4:"1.19",D:"-1.1"}},conversions:{kg:{to:"kg",value:"600"}},source:{url:"https://www.epddanmark.dk/media/n5xnbcl5/md-20023-da_rev1-dansk-beton-blokforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"c7157686-c9fb-4691-ab31-b5415fa6efb1",name:"Letklinkerblok med hvid EPS isolering",description:"Letklinkerblokke anvendes bl.a. til følgende bygningsdele: Fundamenter og sokler, kældertrapper og lyskasser, kældervægge, støttemure, og indvendige og udvendige vægge.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"130",C3:"0.961",C4:"6.19",D:"-4.39"}},conversions:{kg:{to:"kg",value:"375"}},source:{url:"https://www.epddanmark.dk/media/n5xnbcl5/md-20023-da_rev1-dansk-beton-blokforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"73a3618e-e55a-455b-a231-b159a75a01f9",name:"Letklinkerblok med grå EPS isolering",description:"Letklinkerblokke anvendes bl.a. til følgende bygningsdele: Fundamenter og sokler, kældertrapper og lyskasser, kældervægge, støttemure, og indvendige og udvendige vægge.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"121",C3:"0.836",C4:"0.618",D:"-0.572"}},conversions:{kg:{to:"kg",value:"327"}},source:{url:"https://www.epddanmark.dk/media/n5xnbcl5/md-20023-da_rev1-dansk-beton-blokforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"c12503a9-f80f-4fa0-a20f-4c5f23059aae",name:"Konstruktionstræ af fyr og gran. Høvlet (Forbrænding EoL)",description:"Planed construction wood products of pine and spruce.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"-670",C3:"728",C4:"0",D:"-371"}},conversions:{kg:{to:"kg",value:"456"}},source:{url:"https://www.epddanmark.dk/media/l4zjf2xp/md-20004-en_rev1_tr%c3%a6dk.pdf"},subType:"Branche data",materialType:"Wood"},{id:"6538eff9-d01e-4847-a31a-952ef16b2a59",name:"Sandwichelement med mineraluld (Facade)",description:"1 m2 sandwichelement/facadeelement, bestående af 150 mm bagmur, 200-300 mm mineral uld isolering, og 70-80 mm facadeplade, med 10% udsparinger.",location:"DK",unit:"m2",emission:{gwp:{a1a3:"90.6",C3:"1.51",C4:"1.25",D:"-1.21"}},conversions:{kg:{to:"kg",value:"501.8"}},source:{url:"https://www.epddanmark.dk/media/0bpbhpbl/md-20019-da_rev2.pdf"},subType:"Branche data",materialType:"Facade"},{id:"305e9ca4-b551-4fc6-b3bb-6b9df74d660b",name:"Sandwichelement med EPS (Facade)",description:"1 m2 sandwichelement/facadeelement, bestående af 150 mm bagmur, 200-300 mm isolering, og 70-80 mm facadeplade, med 10% udsparinger.",location:"DK",unit:"m2",emission:{gwp:{a1a3:"87.3",C3:"1.49",C4:"10.8",D:"-7.83"}},conversions:{kg:{to:"kg",value:"495.2"}},source:{url:"https://www.epddanmark.dk/media/0bpbhpbl/md-20019-da_rev2.pdf"},subType:"Branche data",materialType:"Facade"},{id:"c108bf89-f9d4-40f2-bf39-bfb01ea62ae7",name:"Beton vægelementer. 15 cm tyk væg med 5-15 kg armering (11% udsparinger)",description:"15 cm tyk beton væg, 11% udsparinger, med 5-15 kg armering",location:"DK",unit:"m2",emission:{gwp:{a1a3:"53.1",C3:"0.965",C4:"0.7",D:"-0.787"}},conversions:{kg:{to:"kg",value:"320.9"}},source:{url:"https://www.epddanmark.dk/media/oq0dzm1j/md-20015-da_rev1-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"2a6bf17b-b6e0-4e31-89b7-ddaedaf7240d",name:"Beton vægelementer. 20 cm tyk væg med 5-15 kg armering (11% udsparinger)",description:"20 cm tyk beton væg, 11% udsparinger, med 5-15 kg armering",location:"DK",unit:"m2",emission:{gwp:{a1a3:"66.9",C3:"1.28",C4:"0.93",D:"-1.01"}},conversions:{kg:{to:"kg",value:"426.4"}},source:{url:"https://www.epddanmark.dk/media/oq0dzm1j/md-20015-da_rev1-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"673ec5ce-04b9-45dc-8956-ac9257a68279",name:"Beton vægelementer. 20 cm tyk væg med 16-25 kg armering (11% udsparinger)",description:"20 cm tyk beton væg, 11% udsparinger, med 16-25 kg armering",location:"DK",unit:"m2",emission:{gwp:{a1a3:"73.2",C3:"1.29",C4:"0.932",D:"-1.08"}},conversions:{kg:{to:"kg",value:"433.9"}},source:{url:"https://www.epddanmark.dk/media/oq0dzm1j/md-20015-da_rev1-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"49d85f1d-ab7f-4c9a-8a47-d4664d99cae6",name:"Letbeton vægelement. 100 mm tyk væg. 10% udsparinger",description:"100 mm tyk letbeton vægelement, 10% udsparinger, densitet: 1750-1850 kg/m3",location:"DK",unit:"m2",emission:{gwp:{a1a3:"26.8",C3:"0.486",C4:"0.356",D:"-0.363"}},conversions:{kg:{to:"kg",value:"161.5"}},source:{url:"https://www.epddanmark.dk/media/niyexcvm/md-20016-da_rev1-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"6b5e401d-5593-4704-b30c-f2324a140f1a",name:"Letbeton vægelement. 150 mm tyk væg. 10% udsparinger",description:"150 mm tyk letbeton vægelement, 10% udsparinger, densitet: 1750-1850 kg/m3",location:"DK",unit:"m2",emission:{gwp:{a1a3:"38.6",C3:"0.744",C4:"0.538",D:"-0.621"}},conversions:{kg:{to:"kg",value:"242.4"}},source:{url:"https://www.epddanmark.dk/media/niyexcvm/md-20016-da_rev1-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"8c6dd10a-0e6f-44bb-99cb-3c615db92445",name:"Letbeton vægelement. 220 mm tyk væg. 10% udsparinger",description:"220 mm tyk letbeton vægelement, 10% udsparinger, densitet: 1950-2050 kg/m3",location:"DK",unit:"m2",emission:{gwp:{a1a3:"63",C3:"1.15",C4:"0.836",D:"-0.931"}},conversions:{kg:{to:"kg",value:"394.8"}},source:{url:"https://www.epddanmark.dk/media/niyexcvm/md-20016-da_rev1-betonelement-foreningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"8dde0b7f-862d-47b7-b5bd-803bc2e562fc",name:"TT-element/Ribbedæk. TT60 med 12-18 pcs. L12.5 liner. og 1.3-3.3 kg slap armering",description:"TT60-beton element med 12-18 pcs. L12,5 liner, og 1,3-3,3 kg slap armering",location:"DK",unit:"m2",emission:{gwp:{a1a3:"56.3",C3:"1",C4:"0.734",D:"-0.695"}},conversions:{kg:{to:"kg",value:"332.7"}},source:{url:"https://www.epddanmark.dk/media/jylpjfbu/md-20018-da_rev2.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"27dc407d-25ed-4cb4-a58f-8079f05acfac",name:"TT-element/Ribbedæk. TTS90 med 16-22 pcs. L12.5 liner. og 1-2.5 kg slap armering",description:"TTS90-beton element med 16-22 pcs. L12,5 liner, og 1-2,5 kg slap armering",location:"DK",unit:"m2",emission:{gwp:{a1a3:"55.3",C3:"0.908",C4:"0.658",D:"-0.613"}},conversions:{kg:{to:"kg",value:"302"}},source:{url:"https://www.epddanmark.dk/media/jylpjfbu/md-20018-da_rev2.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"3106550b-89f6-4368-92ea-9c4d0fb10bbf",name:"TT-element/Ribbedæk. TT60 med 20-28 pcs. L12.5 liner. og 2-4 kg slap armering",description:"TT60-beton element med 20-28 pcs. L12,5 liner, og 2-4 kg slap armering",location:"DK",unit:"m2",emission:{gwp:{a1a3:"57.7",C3:"1.01",C4:"0.734",D:"-0.711"}},conversions:{kg:{to:"kg",value:"335.1"}},source:{url:"https://www.epddanmark.dk/media/jylpjfbu/md-20018-da_rev2.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"4844bfd5-3b5e-4fb4-988d-dc9b92f49122",name:"Fabriksbeton (C20/25 SCC) i eksponeringsklasserne X0 og XC1",description:"C20/25 SCC (selvkompakterende beton)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"215",C3:"6.94",C4:"5.13",D:"-4.74"}},conversions:{kg:{to:"kg",value:"2212"}},source:{url:"https://www.epddanmark.dk/media/qoelm3vd/md-20011-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"a979d5f6-c5d8-4276-b482-1f07ef45b5d0",name:"Fabriksbeton (C25/30) i eksponeringsklasserne X0 og XC1",description:"C25/30 (sætmålsbeton)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"241",C3:"6.73",C4:"4.97",D:"-4.6"}},conversions:{kg:{to:"kg",value:"2246"}},source:{url:"https://www.epddanmark.dk/media/qoelm3vd/md-20011-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"8bd8a129-41e5-42cc-aa91-6afc99a19165",name:"Fabriksbeton C35/45 – CEm I SR-5",description:"C35/45 – CEm I SR-5 (Sætmålsbeton fremstillet med sulfatbestandig cement typisk anvendt til anlægskonstruktioner)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"403",C3:"6.85",C4:"5.06",D:"-4.68"}},conversions:{kg:{to:"kg",value:"2304"}},source:{url:"https://www.epddanmark.dk/media/nvwgry4v/md-20013-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"f888ed95-62fa-40e1-a8cb-2c2f9058eb1e",name:"Fabriksbeton C35/45 – CEm I",description:"C35/45 – CEm I (Sætmålsbeton fremstillet med cement for forholdsvis hurtig styrkeudvikling til en bred anvendelse i byggeriet)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"362",C3:"7.07",C4:"5.23",D:"-4.84"}},conversions:{kg:{to:"kg",value:"2267"}},source:{url:"https://www.epddanmark.dk/media/nvwgry4v/md-20013-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"893a4175-cd1b-4d4a-8d26-48bcc69a7b36",name:"Fabriksbeton C35/45 (fugebeton)",description:"C35/45 fugebeton / sammenstøbningsbeton med max stenstørrelse på 8 mm",location:"DK",unit:"m3",emission:{gwp:{a1a3:"377",C3:"6.63",C4:"4.9",D:"-4.54"}},conversions:{kg:{to:"kg",value:"2256"}},source:{url:"https://www.epddanmark.dk/media/nvwgry4v/md-20013-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"49356a0b-831a-4295-9fc8-ceb87a058fed",name:"Fabriksbeton C40/50 – CEm I SR-5",description:"C40/50 – CEm I SR-5 (sætmålsbeton fremstillet med sulfatbestandig cement typisk anvendt til anlægskonstruktioner)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"465",C3:"6.95",C4:"5.14",D:"-4.76"}},conversions:{kg:{to:"kg",value:"2284"}},source:{url:"https://www.epddanmark.dk/media/oz1jfz20/md-20014-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"74085511-73f3-4912-9479-3a6166c7cec3",name:"Fabriksbeton C40/50 – CEm I",description:"C40/50 – CEm I (sætmålsbeton fremstillet med cement for forholdsvis hurtig styrkeudvikling til en bred anvendelse i byggeriet)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"429",C3:"6.77",C4:"5",D:"-4.63"}},conversions:{kg:{to:"kg",value:"2267"}},source:{url:"https://www.epddanmark.dk/media/oz1jfz20/md-20014-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"363ae9ee-23e4-4b62-8749-65ccd56f0f0a",name:"Fabriksbeton C45/55",description:"C45/55 – CEm I (sætmålsbeton fremstillet med cement for forholdsvis hurtig styrkeudvikling til en bred anvendelse i byggeriet)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"426",C3:"6.75",C4:"4.99",D:"-4.62"}},conversions:{kg:{to:"kg",value:"2229"}},source:{url:"https://www.epddanmark.dk/media/oz1jfz20/md-20014-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"7728bf76-474c-444d-a807-888e5bd54eb4",name:"Fabriksbeton C30/37",description:"C30/37 (sætmålsbeton)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"282",C3:"6.72",C4:"4.97",D:"-4.6"}},conversions:{kg:{to:"kg",value:"2255"}},source:{url:"https://www.epddanmark.dk/media/c3alzank/md-20012-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"25f77b3b-76d5-43fd-8ec2-41b8994b8d06",name:"Fabriksbeton C35/45 SCC",description:"C35/45 SCC (selvkompakterende beton)",location:"DK",unit:"m3",emission:{gwp:{a1a3:"300",C3:"6.54",C4:"4.83",D:"-4.47"}},conversions:{kg:{to:"kg",value:"2254"}},source:{url:"https://www.epddanmark.dk/media/c3alzank/md-20012-da_rev1-dansk-beton-fabriksbetonforeningen.pdf"},subType:"Branche data",materialType:"Concrete"},{id:"6100aee3-169b-4df3-ab9d-70cb18d51881",name:"Konstruktionstræ af fyr og gran. Savede og tørrede (Forbrænding EoL)",description:"Sawn and dried construction wood products of pine and spruce.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"-680",C3:"728",C4:"0",D:"-371"}},conversions:{kg:{to:"kg",value:"456"}},source:{url:"https://www.epddanmark.dk/media/vf0jy3ur/md-20002-en-tr%C3%A6-dk-c-o-tr%C3%A6-og-m%C3%B8belindustrien.pdf"},subType:"Branche data",materialType:"Wood"},{id:"090d25f0-f57f-4ce5-8c65-e9d84287a6b4",name:"Krydsfiner. ubehandlet (Forbrænding EoL)",description:"WISA Spruce plywood, uncoated.",location:"DK",unit:"m3",emission:{gwp:{a1a3:"-599",C3:"743",C4:"0",D:"-391"}},conversions:{kg:{to:"kg",value:"480"}},source:{url:"https://www.epddanmark.dk/media/luijc3vg/md-20008-en_rev2_tr%c3%a6dk.pdf"},subType:"Branche data",materialType:"Wood"},{id:"056aa5c5-d4e7-4046-a701-a65c5a1f660e",name:"Fireproof glass Pyrobel",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"71.6",C3:"-",C4:"0.645",D:"-"}},conversions:{kg:{to:"kg",value:"50.05"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/70d35332-9f2d-4f3b-8688-431388263d2d?version=00.00.011"},subType:"Generisk data",materialType:"Glass"},{id:"6455bd98-404d-40a8-a1ae-5d34c684ceb3",name:"Copper piping",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"1.97",C3:"-",C4:"0.000949",D:"-0.733"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6943ea24-03bc-4a84-9bf9-c320b052be82?version=00.03.000"},subType:"Generisk data",materialType:"metal"},{id:"7552e777-1be7-4f2e-8a79-f9da6445482f",name:"Roofing stones, concrete",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"255.909",C3:"-",C4:"16.07",D:"-2.681"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"https://oekobaudat.de/OEKOBAU.DAT/datasetdetail/process.xhtml?uuid=19249f5e-d218-43dd-834d-aa60f389adae&version=00.03.000&stock=OBD_2021_II&lang=de"},subType:"Generisk data",materialType:"Concrete"},{id:"951163ea-55b3-40e8-905d-586791708367",name:"Carpeted tiling",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"20",C3:"0.0341",C4:"4.56",D:"-0.0958"}},conversions:{kg:{to:"kg",value:"1.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ea1e97c0-5232-43cf-b56a-adde6e3e5916?version=00.03.000"},subType:"Generisk data",materialType:"Flooring"},{id:"2d897e19-3bed-4079-98ef-32b4040da3cc",name:"Wood fiber insulation",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-156.3",C3:"238.2",C4:"-",D:"-124"}},conversions:{kg:{to:"kg",value:"157.49"}},source:{url:"https://oekobaudat.de/OEKOBAU.DAT/datasetdetail/process.xhtml?uuid=51a420d8-6366-4e14-83db-ecfe0721774d&version=00.00.050&stock=OBD_2021_II&lang=de"},subType:"Generisk data",materialType:"Insulation"},{id:"c509b9e0-b4e5-4182-8261-d8b7ffa19943",name:"Zink, patinaed",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"2.09",C3:"-",C4:"#G0122",D:"#G0122"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0ea8dd25-57aa-4b87-87e3-4496368f765b?version=00.04.000"},subType:"Generisk data",materialType:"metal"},{id:"794f3076-c0d0-44fd-aa40-89195bf73148",name:"Grout mortar",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.465",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6f38efae-dc15-4667-96a4-1b87be6a80a5?version=00.04.000"},subType:"Generisk data",materialType:"mortar"},{id:"dc80901a-0486-4f94-b427-2189d3ff80fa",name:"Waterprrofing membrane, liquid",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"1.11",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/285ae869-97d4-4032-8269-767c9371e71f?version=00.03.000"},subType:"Generisk data",materialType:"membrane"},{id:"eaf70f20-3f98-4391-8532-ce7455b2ee4a",name:"PE-foamcovered copper piping",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"2.29",C3:"-",C4:"0.377",D:"-0.868"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a2bad85c-ee4b-4007-bdb6-935826c4dc1f?version=00.03.000"},subType:"Generisk data",materialType:"Plastic"},{id:"3834c760-b1e2-4a59-936f-595b07463d70",name:"PE-covered copper piping",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"2.07",C3:"-",C4:"0.964",D:"-1.1"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/52378794-74b6-40ae-a8a8-a259c55f0a9d?version=00.05.000"},subType:"Generisk data",materialType:"Plastic"},{id:"1c7131a1-b315-4d11-b92e-d97e20546eb1",name:"PU-foamcovered copper piping",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"2.85",C3:"-",C4:"0.611",D:"-0.952"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4fe143d7-f46a-468f-950c-b90b804b6fe1?version=00.03.000"},subType:"Generisk data",materialType:"Plastic"},{id:"4eb7e3f5-a903-4593-ad9e-371583899ee1",name:"PU foamplate (12 cm)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"14.8",C3:"0.102",C4:"8.74",D:"-4"}},conversions:{kg:{to:"kg",value:"3.96"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/880e05ea-55c6-4346-a3ea-5af0e5f299e2?version=00.03.000"},subType:"Generisk data",materialType:"Insulation"},{id:"66c2cfbb-b461-4957-91fe-63e420082fa7",name:"PVC-covered copper piping",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"1.83",C3:"-",C4:"0.987",D:"-1.12"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6a6756b7-a985-4358-8222-01254ddb6aa9?version=00.03.000"},subType:"Generisk data",materialType:"Plastic"},{id:"c35cda56-aab8-401b-85b5-5b62f9b4c4ea",name:"WPC façade panel",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-0.558",C3:"878.167",C4:"-",D:"-274.917"}},conversions:{kg:{to:"kg",value:"7.79"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/dd603f7a-93de-4a24-a26f-76a366966d4a?version=00.03.000"},subType:"Generisk data",materialType:"Wood"},{id:"821c4b45-e968-4efd-9682-b1c168350d87",name:"WPC terrace covering",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.253",C3:"210.833",C4:"-",D:"-487.195"}},conversions:{kg:{to:"kg",value:"18.36"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0452f1bc-9766-4785-bf4e-44bc76dedf75?version=00.03.000"},subType:"Generisk data",materialType:"Wood"},{id:"9fded55b-9688-4fe3-8871-3b0b564b73ed",name:"EPS insulation (grey) with thermal ray absorbant",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"49.7",C3:"-",C4:"55.6",D:"-28.7"}},conversions:{kg:{to:"kg",value:"16.6"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8dfa6b75-0dcb-4748-a2d9-2d572d87ba61?version=00.08.000"},subType:"Generisk data",materialType:"Insulation"},{id:"436ece26-9cab-4e22-bff5-3f438733a8db",name:"EPS insulation for walls and roofs 035",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"59.5",C3:"-",C4:"75.2",D:"-39.6"}},conversions:{kg:{to:"kg",value:"22.7"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c5edec42-1921-46c6-a3aa-5cbd27685a74?version=00.07.000"},subType:"Generisk data",materialType:"Insulation"},{id:"c172ab9e-bad0-432d-bac6-c2c5ff4aefd5",name:"EPS insulation for ceilings/floors and cellar walls/ground deck 035",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"75.4",C3:"-",C4:"85.9",D:"-45.2"}},conversions:{kg:{to:"kg",value:"25.9"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ee10b277-07b5-4c0a-8a48-e0412a9630ff?version=00.07.000"},subType:"Generisk data",materialType:"Insulation"},{id:"f48e56ef-8fa2-4be9-8213-d88953623db9",name:"EPS insulation for walls and roofs 040",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"52.5",C3:"-",C4:"59.5",D:"-31.3"}},conversions:{kg:{to:"kg",value:"18"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/64564161-a587-47de-b195-b6b13b3bfb07?version=00.07.000"},subType:"Generisk data",materialType:"Insulation"},{id:"ccd76857-b465-4a43-9757-6a84d5a0de55",name:"EPS insulation for ceilings/floors and cellar walls/ground deck 040",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"53.8",C3:"-",C4:"61",D:"-32.1"}},conversions:{kg:{to:"kg",value:"18.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d63926ea-8473-4ea7-b965-a7bae6e5e022?version=00.07.000"},subType:"Generisk data",materialType:"Insulation"},{id:"9a094253-c41b-497c-9bf1-79287713e80c",name:"PU foam Insulation, covered with aluminium on both sides (12 cm)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"12.9",C3:"0.106",C4:"8.56",D:"-4.98"}},conversions:{kg:{to:"kg",value:"3.72"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ee4fb7c2-6119-4f00-8cb6-fc74cb66fe9a?version=00.08.000"},subType:"Generisk data",materialType:"Insulation"},{id:"a949734e-f019-4ecf-9d40-c2f634920c6b",name:"Cellular glass insulation - 115 kg/m³",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"1.32",C3:"-",C4:"#G0912",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/55943b94-ad62-4372-9dfc-bc50e19e52c0?version=00.05.000"},subType:"Generisk data",materialType:"Insulation"},{id:"17f70e58-22b1-4a31-b21d-b867a9ea4639",name:"Steel, rolled profiles and plates",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"1125",C3:"1.844",C4:"-",D:"-413.4"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5cb2c568-76fe-4803-8b46-0084e79800c8?version=00.06.000"},subType:"Generisk data",materialType:"metal"},{id:"d03a8039-b5ab-4f86-8851-426d11fab193",name:"Surface, façade paint, primer, dispersion",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"210.646",C3:"-",C4:"0.0150055",D:"-0.00942649"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/948f8f68-f1f2-42f6-8350-6e27d6e80c7c?version=20.19.120"},subType:"Generisk data",materialType:"Paint"},{id:"a3bdcc4f-ba00-41a7-84d5-1dd45825745c",name:"Piping for electric heating (water-water) 70 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"417.966",C3:"0.0147327",C4:"-",D:"-280.661"}},conversions:{kg:{to:"kg",value:"123"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fbfe5992-4cd4-4875-867d-5e89cb453e2c?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"8df52ea3-5559-4d84-840b-1380348d8689",name:"Stone plaster",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.00230588",C3:"-",C4:"0.0150055",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fbd76e49-0fb1-47e0-abba-903ce1272684?version=20.19.120"},subType:"Generisk data",materialType:"Plaster"},{id:"4830c500-9569-422c-b519-405c7bc01705",name:"Boksventilator 30.000 m³/h.",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"846.712",C3:"118.708",C4:"0.0982552",D:"-506.236"}},conversions:{kg:{to:"kg",value:"1.678.000.002"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fbb81ecc-f707-4afb-bcce-758b6be6d337?version=20.19.120"},subType:"Generisk data",materialType:"Ventilator"},{id:"03ca0ea9-d26b-4772-bc7a-375bb374f07d",name:"Varmepumpe. jordvarmesonde. 70 Kw",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"6262.06",C3:"114.807",C4:"0.0300174",D:"-267.67"}},conversions:{kg:{to:"kg",value:"4854.66"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fbb56e56-29d6-408e-8941-fc37ed48fb11?version=20.19.120"},subType:"Generisk data",materialType:"Heat pump"},{id:"424f5e55-5d92-40c9-80d9-a3e555097e53",name:"Fiberglass cloth",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.293104",C3:"0",C4:"0.00196436",D:"-"}},conversions:{kg:{to:"kg",value:"0.12"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fa976ebb-09ce-4e5b-9976-621d9ac1f12e?version=20.19.120"},subType:"Generisk data",materialType:"Insulation"},{id:"5d42013b-8647-4997-aa19-fba309d1cf1b",name:"Curtain wall facade with 3-lags ruder. Steel",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"970.738",C3:"620.355",C4:"0.420155",D:"-154.654"}},conversions:{kg:{to:"kg",value:"21.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f939c2b2-7f3d-40f8-9903-d0fc30a62d91?version=20.19.120"},subType:"Generisk data",materialType:"Facade"},{id:"5f226b79-c9cd-4e2e-a20d-88ca3abc8342",name:"Lavagrus",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.00379143",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f8d6bd85-55e0-42d3-982b-b814387b7f58?version=20.19.120"},subType:"Generisk data",materialType:"Gravel"},{id:"22ee5777-cb5d-4d5d-b2ff-8cb49cd071b3",name:"Teglsten. formur",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"528.541",C3:"13.207",C4:"-",D:"-369.717"}},conversions:{kg:{to:"kg",value:"1800"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f74a19da-df9a-4462-a632-3b3dc83377b1?version=20.19.120"},subType:"Generisk data",materialType:"Brick"},{id:"9c4d4e87-7e31-4013-a947-b06b5791e812",name:"Rør. Afløbsrør. PVC",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"191.881",C3:"0.607628",C4:"-",D:"-0.259614"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f5c6cbd6-258c-4542-876a-1d44adfc0992?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"78e85e83-dd07-43cc-8c10-c240afb91b63",name:"Stål. varmvalset plade. Genanvendelse",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"-",C4:"0.00068207",D:"-181.062"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f34a799a-52de-4f69-a623-335f5be207d9?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"a820e473-b064-4a8c-a88b-5cb023420cd5",name:"Teflon-membran. polytetrafluoroethylen (PTFE)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"144.411",C3:"0.364086",C4:"-",D:"-0.167871"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f281ecaf-5754-4d27-8d70-cfd18780b192?version=20.19.120"},subType:"Generisk data",materialType:"membrane"},{id:"c6f1db0f-4044-4c26-89e8-0a95be88c141",name:"Decentralt ventilationsanlæg med varmegenvinding (væg & loft) 60 m3 / h",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"253.286",C3:"448.641",C4:"0.0504797",D:"-11.696"}},conversions:{kg:{to:"kg",value:"3.69"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/efabdf2d-993e-418c-ba86-85a3a91562a2?version=20.19.120"},subType:"Generisk data",materialType:"Ventilator"},{id:"145a0738-c2a7-44fb-8833-485469d4f2f4",name:"Varmepumpe (luft-vand) 7kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"321.294",C3:"210.599",C4:"299.723",D:"-169.065"}},conversions:{kg:{to:"kg",value:"93.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/efa279e8-0ac1-4883-b87c-0cb11e17d265?version=20.19.120"},subType:"Generisk data",materialType:"Heat pump"},{id:"bcd284d6-299f-4702-a567-9602e4991fa0",name:"Gips. beta-halvhydrat",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.103165",C3:"-",C4:"0.0150055",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ee840270-3055-428a-b38d-e7727426cc35?version=20.19.120"},subType:"Generisk data",materialType:"Plaster"},{id:"a5abdbd7-90cc-43b3-bd91-73fe246b3210",name:"Gulvvarmesystem inkl. isolering. PEX (100 mm afstand)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"774.763",C3:"668.108",C4:"-",D:"-278.435"}},conversions:{kg:{to:"kg",value:"1.9"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ed997c1e-274c-4d38-a5bf-2016693c91a3?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"9312362d-ba26-4215-b205-aa132615a08b",name:"Overflade. Anodisering af aluminiumplade",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"611.931",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ecf20fae-fe11-41ad-b248-8b4118fd7cc7?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"f3f04c9b-0c5e-4eea-9e95-9725bffd387c",name:"Overflade. Pulverlakering (Industri. udendørs. hvid)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"473.516",C3:"104.568",C4:"-",D:"-0.321226"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/eaec8e5d-f70a-4993-b3a6-814607f5e7b3?version=20.19.120"},subType:"Generisk data",materialType:"Paint"},{id:"433b852e-ff03-4880-991f-c843e1c6b77f",name:"Beslag. stålvindue",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"927.171",C3:"-",C4:"#G0204",D:"#G0204"}},conversions:{kg:{to:"kg",value:"2.63"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ea4ff1e8-4ee8-4ecf-8951-a79b5b60dd2a?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"9e375b9d-6761-4ac4-918e-e18fdb717955",name:"Armeringsnet",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.683355",C3:"-",C4:"#G0204",D:"#G0204"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e9ae96ee-ba8d-420d-9725-7c8abd06e082?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"00b81137-211c-496a-b7a3-8200a9fcf650",name:"Afretningslag. hårdt plast",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.3311",C3:"-",C4:"0.0163697",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e98995e0-f945-4fea-849f-cec0aff6cb0c?version=20.19.120"},subType:"Generisk data",materialType:"Plastic"},{id:"cecbad5b-d553-4658-81d0-6d905d1aa8d9",name:"Boksventilator 10.000 m³/h.",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"343.014",C3:"480.918",C4:"0.0398429",D:"-205.411"}},conversions:{kg:{to:"kg",value:"68"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e8afb4e6-1f0d-479b-a54a-c818970dcb42?version=20.19.120"},subType:"Generisk data",materialType:"Ventilator"},{id:"aae5e6d3-591c-4acd-8ce0-b92acdfba99e",name:"Grus 2-32 mm. tørret",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0332595",C3:"0.00733722",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e7b1d3c2-3494-4ae6-9f98-d4d507dcd0c2?version=20.19.120"},subType:"Generisk data",materialType:"Gravel"},{id:"32b95d6a-c7ad-401f-a5b8-0cbdfc0c4be4",name:"Polystyren skumfyldning (uden bindemiddel)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"488.671",C3:"554.102",C4:"-",D:"-23.208"}},conversions:{kg:{to:"kg",value:"15"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e6b12fcd-c1fb-40d9-a9ec-d0149c3d1cd8?version=20.19.120"},subType:"Generisk data",materialType:"Insulation"},{id:"c3c23159-b1cd-472e-b694-631bfe660d68",name:"Oliekedel. lav temperatur. 20-120 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1287.48",C3:"190.828",C4:"159.552",D:"-223.013"}},conversions:{kg:{to:"kg",value:"354"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e69bcb28-f58b-443b-b62f-810bbdf6cedb?version=20.19.120"},subType:"Generisk data",materialType:"Boiler"},{id:"f5cde9bf-4a06-42ab-8b2f-20a70cdcc8b4",name:"Fibercementplade",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"6.993",C3:"-",C4:"0.195072",D:"-"}},conversions:{kg:{to:"kg",value:"13"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e24f9f47-8580-45c2-b16d-45145d65a813?version=20.19.120"},subType:"Generisk data",materialType:"Plaster"},{id:"15b61d9d-6526-439a-9f24-8256e2c99e95",name:"Ekspanderet glasgranulat",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.273532",C3:"-",C4:"#G0912",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e2306538-776d-4bc5-ae3b-1c920fb40285?version=20.19.120"},subType:"Generisk data",materialType:"Gravel"},{id:"808d0f35-d75b-4361-a37d-5fb242b83a60",name:"Rør. Kloakrør PVC",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"28.225",C3:"301.298",C4:"-",D:"-0.66727"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e1f7f83b-6f6e-4ed8-a666-0d49682982e1?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"d0a33e3a-6dfc-4b5f-825e-57aec9021d00",name:"Gaskedel. kondenserende. < 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"446.213",C3:"915.866",C4:"0.638208",D:"-631.364"}},conversions:{kg:{to:"kg",value:"118"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e1ccc83d-01d7-407a-ab59-8c3e1265e8cf?version=20.19.120"},subType:"Generisk data",materialType:"Boiler"},{id:"70857bce-c8bf-4b88-a15d-7665a1034ff9",name:"EPDm skum (rørisolering)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"245.125",C3:"137.702",C4:"-",D:"-695.688"}},conversions:{kg:{to:"kg",value:"55"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e1875cbe-23ad-4800-b40d-ca36b9baab6a?version=20.19.120"},subType:"Generisk data",materialType:"Insulation"},{id:"93098ace-c336-4419-94f1-99f86cc905e7",name:"Vindueskarm. aluminium",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"157.712",C3:"0.693459",C4:"-",D:"-951.688"}},conversions:{kg:{to:"kg",value:"1.43"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/dfa64bbb-dc8d-497b-9557-300416b8448f?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"fb1d2dff-4dc9-45e8-8035-1d722128f362",name:"Stokerfyr 20-120 KW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2218.21",C3:"508.292",C4:"180.285",D:"-998.687"}},conversions:{kg:{to:"kg",value:"921"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/df3ec8a0-012d-49ba-ac07-878cdb764bf6?version=20.19.120"},subType:"Generisk data",materialType:"Boiler"},{id:"bd1862d7-56bd-46c7-9778-62200e8b9cab",name:"Kalkcementpuds",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"356.634",C3:"-",C4:"27.01",D:"-"}},conversions:{kg:{to:"kg",value:"1800"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/dea7df16-f59b-4842-a66c-cb9463a58ae3?version=20.19.120"},subType:"Generisk data",materialType:"Plaster"},{id:"0f1cf3f8-ed32-458e-9ce0-c7bc7053cadc",name:"Grus 16/32 (tørret)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0342735",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/de7fbcfc-0ee0-4e65-a1f9-af1551a20281?version=20.19.120"},subType:"Generisk data",materialType:"Gravel"},{id:"21d069a2-676c-4197-bc80-44fa47541879",name:"Fjernvarmeanlæg",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"47.708",C3:"0.20703",C4:"0.00917947",D:"-122.993"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/dcd5e23a-9bec-40b6-b07c-1642fe696a2e?version=20.19.120"},subType:"Generisk data",materialType:"Boiler"},{id:"1c6ba4ec-04a4-40bb-b0da-637038cbe7ed",name:"Grå støbejern",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"163.536",C3:"-",C4:"#G0204",D:"#G0204"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/dbc94e02-b28f-43eb-8133-a161e9b83dfa?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"5cdee5a1-182d-4728-8aa7-ed6f6ef4d51e",name:"Stålprofil. Genanvendelse",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"-",C4:"0.00068207",D:"-0.393"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d9f045e5-ae07-4ae6-9fde-5346560411d8?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"4c913b2f-e07d-4c61-ba9e-64a06e884dbc",name:"messing",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"138.566",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d9ee3a94-83a2-4615-b071-9afa3aaeff42?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"16c5c2d8-2de4-4dbd-a661-998132316ef6",name:"Rør. Regnvandsrør. PVC",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"242.826",C3:"301.298",C4:"-",D:"-0.66727"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d9baa9f5-b9d2-4f8f-928d-2f4116b36662?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"20aadcf5-6f63-4a6a-b7de-a9d8c7be2a7b",name:"Rude. 2-lags",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"369.941",C3:"151.738",C4:"0.327394",D:"-0.702716"}},conversions:{kg:{to:"kg",value:"20.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d941f45e-1244-419c-a083-e4a49fb5498e?version=20.19.120"},subType:"Generisk data",materialType:"Glass"},{id:"8183db7a-cb59-430c-8b7c-adb839845a38",name:"Bære-/slidlag. Asfalt",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0789355",C3:"0",C4:"-",D:"-0.0263052"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d84cbf6a-0a50-426f-aa3d-c45918b43575?version=20.19.120"},subType:"Generisk data",materialType:"Asphalt"},{id:"e67c0ac4-a461-49a8-aac3-6065fa23a3c2",name:"Kalkpuds",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"407.986",C3:"-",C4:"27.01",D:"-"}},conversions:{kg:{to:"kg",value:"1800"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d7f4a913-441f-4c21-aae5-42e421737e29?version=20.19.120"},subType:"Generisk data",materialType:"Plaster"},{id:"07c72f20-caf8-4ed0-b3aa-c17ec6375462",name:"Rør til el-varmepumpe (lodret jordvarme. saltvand). probe. 10 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"614.302",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"188.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d775709c-1411-4aeb-9d20-36e1e8def5e2?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"690efae6-7318-463e-bd21-9246e93a9464",name:"Træ. lærk",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-907.564",C3:"1186.9",C4:"-",D:"-314.259"}},conversions:{kg:{to:"kg",value:"660.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8c47fba4-0e61-48d1-a03f-bf17911f0dae?version=20.19.120"},subType:"Generisk data",materialType:"Wood"},{id:"37d549fd-651b-40b7-995f-381e20368cc6",name:"Rør til el-varmepumpe (lodret jordvarme. saltvand). probe. 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"6027.13",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"551.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/79002203-de3f-4da6-9a72-b689615b9963?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"fc69697d-6969-42fd-bc76-62a66feac8c9",name:"Overflade. Pulver coating af metal",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"409.796",C3:"0.205333",C4:"-",D:"-0.0578208"}},conversions:{kg:{to:"kg",value:"0.18"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d61a6f60-bcca-4bf6-a151-bd076b4c3366?version=20.19.120"},subType:"Generisk data",materialType:"Paint"},{id:"1a71dcf9-59f8-4952-a493-1893a103fd6c",name:"Overflade. trævinduer. hvid grunder",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"182.186",C3:"0.784673",C4:"-",D:"-0.243853"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d5fe89f0-5fd2-4981-bb87-e74bbf13ef88?version=20.19.120"},subType:"Generisk data",materialType:"Paint"},{id:"142b6736-ac06-4536-8d2a-4d59ba69100d",name:"Blyplader",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"128.344",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d596ddf7-aaf3-44cc-b7ae-faedc8d0870a?version=20.19.120"},subType:"Generisk data",materialType:"metal"},{id:"88043cf8-129c-4864-a406-b2b7f9a34130",name:"Buffertank. rustfast stål",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"405.831",C3:"0.663445",C4:"-",D:"-120.298"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d3f58b23-9526-43be-8a32-fb583dfebfaa?version=20.19.120"},subType:"Generisk data",materialType:"Boiler"},{id:"2eb92ac2-81a1-4c2b-a779-e6779f11e9da",name:"Porebeton 474 kg/m³. armeret",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"263.192",C3:"336.101",C4:"-",D:"-102.642"}},conversions:{kg:{to:"kg",value:"500"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d3b59cac-3b4e-4d18-8c3a-780b553c9591?version=20.19.120"},subType:"Generisk data",materialType:"Concrete"},{id:"19916389-e963-4cee-ae67-6fcc2d12c60a",name:"Facadeklinker",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"541.904",C3:"134.516",C4:"-",D:"-410.796"}},conversions:{kg:{to:"kg",value:"2000"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d311ba82-a703-4865-b5e3-f704e5b88712?version=20.19.120"},subType:"Generisk data",materialType:"Brick"},{id:"6c91d4e5-b9c7-4342-8f41-be96848cb12b",name:"Kalk. malet",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"144.393",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d1d6f54d-9709-4302-8276-fdb7d06801fd?version=20.19.120"},subType:"Generisk data",materialType:"Plaster"},{id:"cf2b5aa8-2e68-48d6-bd34-884572bda87c",name:"Difluormethan (R32)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"522.467",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d05ec06c-0443-4357-8915-ba745dcc84a5?version=20.19.120"},subType:"Generisk data",materialType:"Coolant"},{id:"393a150c-4905-489e-b5d9-154ed3977c73",name:"Gas varmepumpe (luft) 20-70 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"362.364",C3:"10.373",C4:"632.349",D:"-207.236"}},conversions:{kg:{to:"kg",value:"156.82"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d05d595c-7542-42e2-9a02-df9c8c75e567?version=20.19.120"},subType:"Generisk data",materialType:"Boiler"},{id:"3e6cca9b-ce6d-4ec0-aef5-9f4d61599f6d",name:"Gaskedel. kondenserende. 120-400 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2842.15",C3:"715.794",C4:"180.384",D:"-507.684"}},conversions:{kg:{to:"kg",value:"937"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/cf9764d1-3aba-4e5e-8795-a8f1ee93d9e5?version=20.19.120"},subType:"Generisk data",materialType:"Boiler"},{id:"9e2fbc5e-8ce7-459d-b980-9f882de16df9",name:"Papiruldsplader",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-199.935",C3:"176.145",C4:"-",D:"-696.378"}},conversions:{kg:{to:"kg",value:"80"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/cf963fcb-0e03-48c0-b501-ad0d1e3c22c0?version=20.19.120"},subType:"Generisk data",materialType:"Insulation"},{id:"13f8ce74-9a32-4bfd-b0f0-054228f5c8c6",name:"Phenolplast. stift skum (PF)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"873.203",C3:"900.279",C4:"-",D:"-319.992"}},conversions:{kg:{to:"kg",value:"40"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/cf6e341b-3de7-4e24-b4d2-8ac484ee7c0e?version=20.19.120"},subType:"Generisk data",materialType:"Plastic"},{id:"ac2303b9-57a8-46ea-b050-536a8070b11c",name:"Rør. Kloakrør HDPE",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"209.831",C3:"345.444",C4:"-",D:"-170.559"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/cd5b784e-497d-4c76-abbd-d66867e1e986?version=20.19.120"},subType:"Generisk data",materialType:"Piping"},{id:"046e5a39-555c-4174-abcb-804b684463c5",name:"Kunststenplade (bundet af epoxyharpiks)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"283.505",C3:"0.381535",C4:"-",D:"-0.106807"}},conversions:{kg:{to:"kg",value:"52"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ccdb5f3c-7305-46c7-ad5b-a05bb922a743?version=20.19.120"},subType:"Generisk data",materialType:"Stone"},{id:"06eaa736-fc22-479b-b834-b39f18eecc96",name:"Elevator (grundkomponenter pr. pcs.)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"5193",C3:"373.937",C4:"488.271",D:"-1579.64"}},conversions:{kg:{to:"kg",value:"1603"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/cca90907-409d-4f9c-9922-fdc011a0eb6f?version=20.19.120"},subType:"Generisk data",materialType:"Elevator"},{id:"113becf0-1db1-43eb-b2f5-3ea7f05f8df5",name:"Sanitetskeramik",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"280.282",C3:"0.0163697",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/cace7e48-3fb4-4e11-8cc4-fcefc8b4116a?version=20.19.120"},subType:"Generisk data",materialType:"Ceramic"},{id:"e3ff6cac-6000-4a7a-9c95-dd3d06cf32fe",name:"Ventilationsanlæg decentraliseret (væg & loft) 60 m3 / h",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"408.676",C3:"12.972",C4:"0.0180285",D:"-138.003"}},conversions:{kg:{to:"kg",value:"0.878"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c8cf7494-2f23-4193-a185-f7d4fdfa36b6?version=20.19.120"},subType:"Generisk data",materialType:"Ventilation"},{id:"6b2ce313-8749-43c5-aa83-13eb61a06b53",name:"Radiator. stålplade",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"444.802",C3:"0.000818484",C4:"-",D:"-155.923"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c6de5beb-ffe9-4b5f-aba8-c0c2d3528c58?version=20.19.120"},subType:"Generisk data",materialType:"Radiator"},{id:"a2d85d3e-9765-4f8f-89c0-3cc339743fb0",name:"EPDm-tætning til aluminiumsprofil. med kuldebroafbrydelse",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"138.151",C3:"134.947",C4:"134.869",D:"-14.583"}},conversions:{kg:{to:"kg",value:"0.43"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c445279d-1358-4e36-9f0d-7ecfe8abda81?version=20.19.120"},subType:"Generisk data",materialType:"Seal"},{id:"42687052-d6ef-4c9e-b22b-1c3b99b7a797",name:"Klordifluormethan (R22)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"475.856",C3:"-",C4:"177.483",D:"-0.212757"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c3d4882b-ee25-4595-9b95-01a318e72a44?version=20.19.120"},subType:"Generisk data",materialType:"Coolant"},{id:"eb2d0d79-44c0-4a87-a235-4380df0e6125",name:"Papiruldsisolering. løsfyld",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-733.725",C3:"990.818",C4:"-",D:"-305.055"}},conversions:{kg:{to:"kg",value:"45"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c355d75b-9026-4899-a41c-e5d221c424f2?version=20.19.120"},subType:"Generisk data",materialType:"Insulation"},{id:"567294e0-8b9e-42c0-b932-7a8b0c1fef9f",name:"PUR fugemasse",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"533.286",C3:"265.674",C4:"-",D:"-0.944422"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c34147d4-e691-4733-bf78-8a7ccd039006?version=20.19.120"},subType:"Generisk data",materialType:"Seal"},{id:"7fb96497-1cbc-454b-b4ba-daed5b1c8bae",name:"LPG tank 6400 l / t 2.9 (overjordiske)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"3107.97",C3:"0.957626",C4:"-",D:"-1824.3"}},conversions:{kg:{to:"kg",value:"1170"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c258eabc-6b25-4dff-8a92-b6240f0bccc5?version=20.19.120"},subType:"Generisk data"},{id:"c959446b-f171-41cb-8c1f-efce6ba17a76",name:"Vinduesramme. aluminium",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"17.055",C3:"0.58799",C4:"-",D:"-104.202"}},conversions:{kg:{to:"kg",value:"1.51"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c1cacd2c-d98d-4795-84db-b567d25bb1ed?version=20.19.120"},subType:"Generisk data"},{id:"69f557cf-4068-4d7e-a5bc-0b1a7f6b3eb3",name:"Overflade. Træmaling. udendørs. dækkende (topcoat-system)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"274.094",C3:"0.836874",C4:"-",D:"-0.261171"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c1bc4706-9d3a-4468-8ecb-5a569226d75f?version=20.19.120"},subType:"Generisk data"},{id:"bea3257f-260b-4a60-92a7-61bd03769f40",name:"Sand 0-2 mm. tørret",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0332595",C3:"0.00733722",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c1b237e1-2206-4318-8d99-f023b8aeb5d6?version=20.19.120"},subType:"Generisk data"},{id:"f4cf8d86-a7b9-4dbe-9cd3-34550dd4ab1f",name:"Overflade. Parket lak transparent",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"34.614",C3:"0.912953",C4:"-",D:"-0.256981"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c1328d7d-8ad6-4e74-a701-ffab0c542534?version=20.19.120"},subType:"Generisk data"},{id:"451a0a87-a9fe-4414-bf24-ccbc42638b07",name:"EVA-tagmembran",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"512.518",C3:"79.699",C4:"-",D:"-360.722"}},conversions:{kg:{to:"kg",value:"2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bff01a9a-6b09-429f-b7ff-17d84fbef7ec?version=20.19.120"},subType:"Generisk data"},{id:"bfd1ded2-1d1a-45e2-bd7b-62b9de3ffbe3",name:"Betonmursten",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"242.351",C3:"134.516",C4:"-",D:"-410.796"}},conversions:{kg:{to:"kg",value:"2000"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bdda4364-451f-4df2-a68b-5912469ee4c9?version=20.19.120"},subType:"Generisk data"},{id:"53f9ade7-cfe5-4eb2-9af7-6601508515a2",name:"Aluminiumsprofil",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"10.677",C3:"-",C4:"#G0500",D:"#G0500"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bd6d6d89-b76d-4002-a217-afffbb8aa308?version=20.19.120"},subType:"Generisk data"},{id:"981932b6-d951-49f5-a3f4-9c1b093ef1b1",name:"Skærver 16-32 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.014695",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bd6aa879-e6e6-4181-afc5-1374b2f32dd1?version=20.19.120"},subType:"Generisk data"},{id:"84642ad8-0ace-40ad-86ce-a0c4f25b21c9",name:"Fugemasse. Silikone",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"726.875",C3:"151.829",C4:"-",D:"-0.702716"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bc8d8fd4-6c25-4bd6-bcbf-6f994e8e5753?version=20.19.120"},subType:"Generisk data"},{id:"ace727ff-a23f-4f00-ae6d-c7e0acd8784a",name:"Keramikfliser. u-glaseret",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"685.115",C3:"0.146744",C4:"-",D:"-0.0410796"}},conversions:{kg:{to:"kg",value:"20"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bc2f9dde-f2a6-4630-bf7c-0ad3870012ef?version=20.19.120"},subType:"Generisk data"},{id:"f2fd0d19-a0d5-49be-889a-d44d23b1a33b",name:"Ventilationsaggregat m. varmegenvinding 1000 m3 / h",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"372.133",C3:"0.611164",C4:"0.0901424",D:"-212.093"}},conversions:{kg:{to:"kg",value:"99.1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bc243a22-e260-43d9-9072-dc2006bf8d19?version=20.19.120"},subType:"Generisk data"},{id:"583c7e22-7914-448d-a8ae-125ecd579391",name:"Fugemasse. Acryl",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"303.501",C3:"219.227",C4:"-",D:"-101.503"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b9272c24-9228-45b1-a2a3-d361abe0bb7f?version=20.19.120"},subType:"Generisk data"},{id:"708836a2-17e3-4120-95c3-c61e67e26bda",name:"Puds. gips-kalk",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"119.397",C3:"-",C4:"13.505",D:"-"}},conversions:{kg:{to:"kg",value:"900"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b7fb8ab4-e1e2-4a0b-a9c4-abd6cfa6c7f3?version=20.19.120"},subType:"Generisk data"},{id:"14e92c67-203c-446e-8a1f-9aeaaf7c4fd6",name:"Ekspanderet skifer",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.341109",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b76ded67-067b-47f6-b131-a73db86039b0?version=20.19.120"},subType:"Generisk data"},{id:"714dccda-f18e-42b6-b8ba-0b57e69eb899",name:"Boksventilator 5.000 m³/h",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"217.047",C3:"304.278",C4:"0.0251497",D:"-130.012"}},conversions:{kg:{to:"kg",value:"43"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b5d12008-3cfd-46d7-a564-1164f1a7ddf5?version=20.19.120"},subType:"Generisk data"},{id:"6586e6a7-7782-4b89-b973-0c13e34d80c6",name:"Lerrør. glaseret. DN 400",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"515.194",C3:"112.871",C4:"-",D:"-0.291665"}},conversions:{kg:{to:"kg",value:"142"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b59f6603-c75b-47bb-b1f1-5336affb2acd?version=20.19.120"},subType:"Generisk data"},{id:"0be3ac30-f234-4b99-9bb1-289fa62d6cf7",name:"Kork. expanderet",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-969.007",C3:"151.505",C4:"-",D:"-388.339"}},conversions:{kg:{to:"kg",value:"80"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b50fa992-e435-455a-8dfe-82254e9f4f48?version=20.19.120"},subType:"Generisk data"},{id:"7ce1554d-dec5-4745-9419-d2695954787e",name:"Kertotræ (LVL)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-465.421",C3:"896.177",C4:"-",D:"-304.837"}},conversions:{kg:{to:"kg",value:"465.7"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b50f7b36-d9aa-40c5-b839-4925a1500952?version=20.19.120"},subType:"Generisk data"},{id:"5d2290bc-b54a-4760-8d45-ec0b9b48be53",name:"Cirkulationspumpe 50-250 W",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"264.569",C3:"0.86599",C4:"0.0450712",D:"-506.214"}},conversions:{kg:{to:"kg",value:"4.94"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b4e4d89b-e4d0-4df3-a233-deacc76b2fee?version=20.19.120"},subType:"Generisk data"},{id:"141cf5c3-ab0b-45a4-a598-c5d363e2e41f",name:"Tetrafluorethan (R134a)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"838.634",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b47d86ac-60fa-46f7-ac5c-f98be4b7acdd?version=20.19.120"},subType:"Generisk data"},{id:"3ee03c7b-f893-4f59-ae34-299ab0585833",name:"Tetrafluorpropen (R1234ze)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"612.734",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b3875fa1-4d62-40dc-ab2d-68fe1fbaf352?version=20.19.120"},subType:"Generisk data"},{id:"e8dd2c71-5fb1-4e22-bf9c-768cbdda5fa1",name:"mørtel. cementmørtel",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"345.107",C3:"-",C4:"293.017",D:"-"}},conversions:{kg:{to:"kg",value:"2000"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b2c3f5a3-7858-4644-a49a-2eb883d37c91?version=20.19.120"},subType:"Generisk data"},{id:"cb06057e-dfb8-4045-b040-f4491da13d15",name:"Buffertank. stål",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"31.687",C3:"0.663445",C4:"-",D:"-142.578"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b273afc9-27a1-4a82-a390-8780fd631008?version=20.19.120"},subType:"Generisk data"},{id:"f52f590d-c0b6-4d64-90f2-273fa95deaca",name:"Ventilationskanal. galvaniseret stål",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"304.722",C3:"0.00163697",C4:"-",D:"-158.648"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b24ae8b5-e28a-42f7-a592-05779a347164?version=20.19.120"},subType:"Generisk data"},{id:"8588c622-6d70-4c26-ad57-9408e1e3654a",name:"Beslag til dreje-kip vinduer (aluminium)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"123.655",C3:"-",C4:"#G0763",D:"#G0763"}},conversions:{kg:{to:"kg",value:"1.647"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b1efabb9-6371-4b96-9ee2-d1f11f9f3b25?version=20.19.120"},subType:"Generisk data"},{id:"6b969e2d-c860-4a1e-9f12-ce04d0a857c9",name:"Byggepap",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-0.0897286",C3:"0.162065",C4:"-",D:"-0.0579045"}},conversions:{kg:{to:"kg",value:"0.08"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b1ea7c10-4471-4485-95bf-7dc0a00025b6?version=20.19.120"},subType:"Generisk data"},{id:"d7e2e052-4d86-4541-922c-8dbdaf47fd49",name:"Rør til el-varmepumpe (lodret jordvarme. saltvand). collector. 70 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2541.8",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"987"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b12f748d-5aa2-4cf6-a0b7-46ce0465ee02?version=20.19.120"},subType:"Generisk data"},{id:"8abab2eb-0feb-4d58-9d55-18d75c533fca",name:"Rør til el-varmepumpe (vand-vand) 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"174.764",C3:"0.0147327",C4:"-",D:"-280.661"}},conversions:{kg:{to:"kg",value:"48"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/af5e34f6-7790-431e-b535-fcc2c0e55aab?version=20.19.120"},subType:"Generisk data"},{id:"66c22e07-d274-4d8f-92c9-c5524aff525b",name:"Hørfiberdug",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"160.445",C3:"861.825",C4:"-",D:"-120.031"}},conversions:{kg:{to:"kg",value:"38"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/af13e5a8-0961-454a-ad3a-7093a37fc802?version=20.19.120"},subType:"Generisk data"},{id:"b2e21b24-983e-47ef-80ec-ab30d181706c",name:"Træ. egetræ (12% fugt / 10.7% H2O)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-1063",C3:"1287.83",C4:"-",D:"-341.221"}},conversions:{kg:{to:"kg",value:"716.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7ec1d463-fd99-4b1d-9a57-9a72cac408d2?version=20.19.120"},subType:"Generisk data"},{id:"acd73399-28d6-41d0-bc16-350dab423584",name:"Støbeasfalt",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0972808",C3:"0",C4:"-",D:"-0.0263052"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5bebcf89-2e6b-46ce-b05e-3e02929c8af4?version=20.19.120"},subType:"Generisk data"},{id:"ca7da2c1-1e28-4358-9842-c84ffbb9191c",name:"Ventilationsaggregat m. varmegenvinding 5000 m3 / h",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1460.38",C3:"177.427",C4:"0.180285",D:"-881.899"}},conversions:{kg:{to:"kg",value:"367.94"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/aca6eca0-ff86-4818-beac-76df2ffebaed?version=20.19.120"},subType:"Generisk data"},{id:"4d1e80d4-827c-499a-9a07-e4a1100c2e79",name:"Betontrappe. etagehøj",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"312.836",C3:"139.419",C4:"-",D:"-390.288"}},conversions:{kg:{to:"kg",value:"1965"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ab0a0f3c-41f6-4b0a-a12c-f8bd0c8a4a23?version=20.19.120"},subType:"Generisk data"},{id:"168e2c18-4cf8-47da-a1c6-34aa35e7e661",name:"ECB-plast tagmembran. ifølge DIN 16729 (med PES-filt)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"823.049",C3:"704.063",C4:"-",D:"-32.606"}},conversions:{kg:{to:"kg",value:"2.32"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/aaf4baca-7530-435b-8736-0bd3bb51e36d?version=20.19.120"},subType:"Generisk data"},{id:"8b6fa2af-1928-4ad3-9fe0-6f987f0f5d43",name:"Solvarmekollektor. vakuumrør",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"109.581",C3:"233.419",C4:"-",D:"-388.375"}},conversions:{kg:{to:"kg",value:"29.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/aa6822f9-a10e-45c9-a164-f08ebc994379?version=20.19.120"},subType:"Generisk data"},{id:"ca196873-e4f0-428f-aa09-8318880e711b",name:"Rør til el-varmepumpe (vand-vand) 10 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"136.135",C3:"0.0147327",C4:"-",D:"-280.661"}},conversions:{kg:{to:"kg",value:"33"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/aa0311ec-2e2a-4afa-af9e-5b6122b730ef?version=20.19.120"},subType:"Generisk data"},{id:"0bc0dc28-f83b-426e-b6f6-f510f8d98cd2",name:"Varmepumpe. vand-vand. 70 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"553.729",C3:"136.581",C4:"0.0300174",D:"-307.478"}},conversions:{kg:{to:"kg",value:"199.22"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a70d347a-239c-4e45-a8dc-e9e574dbf898?version=20.19.120"},subType:"Generisk data"},{id:"c9b249d1-62b4-42fd-8cc0-ff5a5c80c318",name:"Bitumenemulsion (40% bitumen. 60% vand)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.356326",C3:"0",C4:"0.0859383",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a6b26cf9-3f9a-4abc-9412-87fdc0cdf3f6?version=20.19.120"},subType:"Generisk data"},{id:"c5efeb16-b069-4794-bd06-7a17c9b7212a",name:"Curtain wall profiler. stål",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"366.271",C3:"342.169",C4:"-",D:"-148.223"}},conversions:{kg:{to:"kg",value:"9.48"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a60431a7-10aa-4106-bc7c-c6acb01ee9b3?version=20.19.120"},subType:"Generisk data"},{id:"b9270b73-dec8-4366-82ed-45adc18d2336",name:"Kuldioxid (R744)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"10.753",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a5bb6444-74e1-43f7-8e7d-55aed1ac1b6e?version=20.19.120"},subType:"Generisk data"},{id:"9862f4ea-c11c-44a4-a463-91f2b56b6a3b",name:"Slaggebeton. sten",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"352.838",C3:"102.721",C4:"-",D:"-287.557"}},conversions:{kg:{to:"kg",value:"1400"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a4fceab4-71a2-46c9-ac9a-19a964d48ce5?version=20.19.120"},subType:"Generisk data"},{id:"5a138edb-5930-4187-b19d-ac31e3f9296b",name:"Stenmel 0/2",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.014695",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a4d16918-287f-43af-831d-baf80093fe4a?version=20.19.120"},subType:"Generisk data"},{id:"b999d0e7-bdcc-4131-b3dc-1922e059c9f1",name:"Aluminiumsplade",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"104.617",C3:"-",C4:"#G0500",D:"#G0500"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a4c1c27c-53a0-4027-83f6-88c52c758bb1?version=20.19.120"},subType:"Generisk data"},{id:"53083bc6-e480-44ea-8663-421dae1f384d",name:"Rulletrappe (komponenter. som er afhængige af højden)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2467.1",C3:"272.787",C4:"-",D:"-1251.37"}},conversions:{kg:{to:"kg",value:"800"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a4233092-7d86-4a97-ba5c-abc551564f6f?version=20.19.120"},subType:"Generisk data"},{id:"4e4cb97d-1966-4b93-92bf-d6386d9d9a30",name:"Stål. Smedestål",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"280.793",C3:"-",C4:"#G0204",D:"#G0204"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a255934e-5461-4501-9acf-20ad1b51b044?version=20.19.120"},subType:"Generisk data"},{id:"200b7205-a6f5-4b60-a969-7d2e7fba3721",name:"Cementbundet spånplade",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"1694.15",C3:"279.382",C4:"-",D:"-846.451"}},conversions:{kg:{to:"kg",value:"1200"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a0d69f94-040e-44b1-a88b-bbaeeb0aae2a?version=20.19.120"},subType:"Generisk data"},{id:"6e0f5c88-cda3-49b2-8675-9c6e0d8d7c40",name:"Elevator (komponenter pr. etage)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"969.289",C3:"0.295179",C4:"-",D:"-493.136"}},conversions:{kg:{to:"kg",value:"333"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a074d0aa-68fd-4105-9b27-e9cf0042cb4d?version=20.19.120"},subType:"Generisk data"},{id:"b470cf8b-e875-4401-ad08-6b7edeece1b5",name:"Glasfiber-forstærket plast. polyester (30% fiberandel)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"373.108",C3:"159.357",C4:"-",D:"-0.737851"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a051b8eb-5e03-486a-b9c3-bfc9d19234de?version=20.19.120"},subType:"Generisk data"},{id:"7c7e1f63-acaf-4c34-81b0-4ef80b7f304c",name:"Cirkulationspumpe 250-1000 W",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"132.285",C3:"432.995",C4:"0.225356",D:"-253.107"}},conversions:{kg:{to:"kg",value:"24.7"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/9fe2649f-bd76-41d8-b952-0021143f1ef7?version=20.19.120"},subType:"Generisk data"},{id:"e0127c03-5eb6-4c55-b9de-0501aadcec57",name:"Rør. Afløbsrør. ABS",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"440.853",C3:"255.257",C4:"-",D:"-14.943"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/9fcc1331-0b4f-4c52-a5fc-e42d25c601dd?version=20.19.120"},subType:"Generisk data"},{id:"96c43b8d-9881-444f-9416-e8f1f1cf09d8",name:"Rør. Brugsvandsrør. PEX",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"410.333",C3:"376.848",C4:"-",D:"-170.559"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/9d623359-570b-40ca-8875-60dea3687846?version=20.19.120"},subType:"Generisk data"},{id:"e8191464-2d06-42dd-bfe0-962c6cf94f97",name:"Stålplade (0.3-3.0mm)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"242.761",C3:"-",C4:"#G0122",D:"#G0122"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/9cbdbafe-8377-46ca-a640-8e3c8fc518c0?version=20.19.120"},subType:"Generisk data"},{id:"6779efce-7bce-4fca-a739-38cace099941",name:"Gulvvarmesystem inkl. isolering. Kobber (100 mm afstand)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"223.208",C3:"317.258",C4:"-",D:"-679.116"}},conversions:{kg:{to:"kg",value:"5.7"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/99bbfb89-cbca-448d-a991-7cc302a97d4a?version=20.19.120"},subType:"Generisk data"},{id:"f68a2430-cbc5-407a-86bb-26b957149505",name:"Kølemiddel (R410a)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"806.324",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/988bb7c3-0a15-4626-a6c0-0883d4ff33dd?version=20.19.120"},subType:"Generisk data"},{id:"120cc3f5-09ca-4178-b48f-8aa6287039b1",name:"Ammoniak (R717)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"249.446",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/98482ce0-df9d-4ffd-8d52-43f468022595?version=20.19.120"},subType:"Generisk data"},{id:"0e8b7ad6-ee4b-46d8-bffc-01dde2f44897",name:"Overflade. Opløsningsmiddelbaseret lak. hvid",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"295.014",C3:"0.68517",C4:"-",D:"-0.192736"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/95c6760d-1605-430b-8216-825f6c0ac409?version=20.19.120"},subType:"Generisk data"},{id:"b73d4be2-a2b1-4605-a3a9-a9695e07bd82",name:"Fiberdug. PE / PP",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"126.052",C3:"188.424",C4:"-",D:"-0.852793"}},conversions:{kg:{to:"kg",value:"0.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/95a4f4b3-b354-4e2c-9046-0a36175cd768?version=20.19.120"},subType:"Generisk data"},{id:"7857a3ef-849c-439e-8230-9720d991fa81",name:"Overflade. Facademaling. grunder. silikat",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.900033",C3:"-",C4:"0.0150055",D:"-0.010823"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0b488798-140f-4efa-96e2-55aa46ed129a?version=20.19.120"},subType:"Generisk data"},{id:"95ee9c70-abe7-496f-9697-2d3c638d2f32",name:"Rør. polypropylen (PP)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"261.984",C3:"322.333",C4:"-",D:"-146.545"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/94355965-8d24-4e78-a910-9f35b8ae1193?version=20.19.120"},subType:"Generisk data"},{id:"d752ce13-d6da-4ab5-a261-a38a2e36cb41",name:"Stålplade (20 mikrometer galvaniseret)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"267.628",C3:"-",C4:"#G0122",D:"#G0122"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/93edef71-49e3-4e1f-ba6d-1e449e7d328d?version=20.19.120"},subType:"Generisk data"},{id:"d06667c5-37d9-476e-859d-076930ef5b3e",name:"Aluminium. plade og profil. Genanvendelse",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"-",C4:"0.00068207",D:"-826.778"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/93eb05bd-e607-46de-8d7b-e0727f8d2400?version=20.19.120"},subType:"Generisk data"},{id:"ba5746b3-7abe-49ae-bead-ed793ee3a54e",name:"Overflade. metalcoating (vandbaseret)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"209.554",C3:"0.248242",C4:"-",D:"-0.0698668"}},conversions:{kg:{to:"kg",value:"0.29"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/93eac197-0003-41ea-b81f-e517dd3389fb?version=20.19.120"},subType:"Generisk data"},{id:"6d4527b8-d60f-4547-9344-fa7479fb76a1",name:"Skorsten stål (enkelt væg)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"402.074",C3:"0.000818484",C4:"-",D:"-127.358"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/93a3f055-f26f-4702-a917-2951ca81cd21?version=20.19.120"},subType:"Generisk data"},{id:"bebbfc7f-251f-4eab-8ae4-6ec4a4674401",name:"Vinduesramme. plast",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"924.199",C3:"482.076",C4:"-",D:"-342.906"}},conversions:{kg:{to:"kg",value:"3.1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/91ea177a-e65a-4fe2-ac2d-2f378a03e168?version=20.19.120"},subType:"Generisk data"},{id:"52483dc8-2ba0-4f79-aa9b-e29cc023acbd",name:"mineraluld. stenuld. teknisk pladeisolering",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"196.032",C3:"0.0163697",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"146.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/908c07fa-6fba-42e4-a91e-d771444309eb?version=20.19.120"},subType:"Generisk data"},{id:"f19aeb46-790f-47bf-b6f1-015708dd1ef0",name:"Porebeton 380 kg/m³",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"182.392",C3:"25.558",C4:"-",D:"-0.780513"}},conversions:{kg:{to:"kg",value:"380"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/906b4864-0511-480f-a8bc-7b8302efbf0b?version=20.19.120"},subType:"Generisk data"},{id:"8cc610e5-0b4b-408b-9ccc-32728d713d7a",name:"Folie. PE-HD med PP-fiberdug",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"321.161",C3:"484.274",C4:"-",D:"-219.178"}},conversions:{kg:{to:"kg",value:"1.3"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/900336a3-b5f9-4c40-91a9-f9551f84ac64?version=20.19.120"},subType:"Generisk data"},{id:"c33133b9-103f-4eea-842f-29a88e67557d",name:"Pimpsten. grus",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.00871442",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8de12467-96a0-459e-9f97-90e95fb7b23f?version=20.19.120"},subType:"Generisk data"},{id:"968779d0-95d8-4d8b-9357-37bb55ab8acb",name:"Curtain wall facade med 3-lags ruder. aluminium",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"121.145",C3:"620.355",C4:"0.420155",D:"-370.598"}},conversions:{kg:{to:"kg",value:"16.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8d6eba49-1c20-444a-8b34-0b6b47379618?version=20.19.120"},subType:"Generisk data"},{id:"2434092f-a7ab-4c27-860c-d6c893850b88",name:"Solcelleanlæg 1000 kWh / m2*a",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"296.686",C3:"-",C4:"121.364",D:"-362.013"}},conversions:{kg:{to:"kg",value:"9"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8cfea619-e284-4b6f-a281-46e362a868c4?version=20.19.120"},subType:"Generisk data"},{id:"18ed23d9-9d30-489b-805f-3709a3dd13cf",name:"HPL- plade",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-385.54",C3:"1978.67",C4:"-",D:"121.285"}},conversions:{kg:{to:"kg",value:"1400"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8cf90240-cbdd-4415-93a8-9c56da22f111?version=20.19.120"},subType:"Generisk data"},{id:"a7ff0957-1dcc-4766-bab1-00da613594e3",name:"Træ. gran (12% fugt / 10.7% H2O)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-693.836",C3:"876.037",C4:"-",D:"-238.748"}},conversions:{kg:{to:"kg",value:"481.6"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3057d7c0-7bee-4ba2-9edf-517d4cd97a14?version=20.19.120"},subType:"Generisk data"},{id:"9c871c59-3d99-4af9-a933-75357af77a33",name:"Lerpuds",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"931.477",C3:"280.641",C4:"-",D:"-389.165"}},conversions:{kg:{to:"kg",value:"900"}},source:{url:"https://oekobaudat.de/OEKOBAU.DAT/datasetdetail/process.xhtml?uuid=8be785fa-5548-4ea5-a2d7-b962675b9eff&version=20.19.120&stock=OBD_2021_II&lang=de"},subType:"Generisk data"},{id:"2d7ce1e8-33d5-4b32-80ec-e6ae80134040",name:"Vinduesprofil. karm. alu. pulverlak.",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"130.541",C3:"-",C4:"#G0500",D:"#G0500"}},conversions:{kg:{to:"kg",value:"1.02"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8b3ee4e2-c086-41dc-bd07-e9e853f9da8b?version=20.19.120"},subType:"Generisk data"},{id:"8dc49987-91d3-4f27-b6eb-813cc7c8112f",name:"Kondenserende gaskedel <20 kW (væg enhed)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"243.628",C3:"705.425",C4:"0.512009",D:"-593.075"}},conversions:{kg:{to:"kg",value:"43"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8acef115-85c0-45f8-9999-9d3b87692fa7?version=20.19.120"},subType:"Generisk data"},{id:"612baa78-7cae-4609-8e79-8ee253d48283",name:"Stålplade. rustfri",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"342.727",C3:"-",C4:"#G0763",D:"#G0763"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/88559403-7658-48f2-bac9-7986b4d0f4c2?version=20.19.120"},subType:"Generisk data"},{id:"51f4d29a-7be7-42c2-ad33-03a4b2589d72",name:"Plast profil CR (chloropren gummi)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"635.686",C3:"356.146",C4:"-",D:"-152.255"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/884efbb3-7be6-4e4d-9726-c39c1b781436?version=20.19.120"},subType:"Generisk data"},{id:"379d9721-8c45-4996-ba09-40eeb8ac666f",name:"Stålrør. gevindrør",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"251.374",C3:"0.00150055",C4:"-",D:"-155.923"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8622539c-592c-45b0-9a4b-e5f8b4fea367?version=20.19.120"},subType:"Generisk data"},{id:"270d869c-0187-4ff9-9c11-355967d30a99",name:"Asfalt. bærelag",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0711519",C3:"0",C4:"-",D:"-0.0263052"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/85de02e5-2782-4050-9c01-c5de3849fbce?version=20.19.120"},subType:"Generisk data"},{id:"a76d9d77-7cf2-4ef2-8972-7c2a5d4786c2",name:"Grunder. silikat dispersion",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.579701",C3:"-",C4:"0.0163697",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/85c41389-d62e-4dff-a819-896b35367cbc?version=20.19.120"},subType:"Generisk data"},{id:"60a197fe-d1c0-450c-b6a3-ab32ae063fef",name:"Overflade. Parket lak (primer til træ; fortyndet med vand)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"181.695",C3:"0.912953",C4:"-",D:"-0.256981"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/859897ae-5ea2-4b55-9508-49297dd6ba6c?version=20.19.120"},subType:"Generisk data"},{id:"1375e9a8-4d66-420e-bd95-d2ef53463b9d",name:"LPG tank 4850 l / 2.1 t (underjordisk)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"3084.11",C3:"781.327",C4:"-",D:"-1735.34"}},conversions:{kg:{to:"kg",value:"1116.7"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8595cc43-c24f-4002-8d2b-c9386de7fae4?version=20.19.120"},subType:"Generisk data"},{id:"dfccf021-7639-4500-beb6-c1f31a788955",name:"Polybutadiene rør (PB)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"410.241",C3:"322.333",C4:"-",D:"-146.545"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/83a21998-b507-429e-bbe3-b5629e601138?version=20.19.120"},subType:"Generisk data"},{id:"29afd4a6-cb07-4631-b0e5-a3891b38604b",name:"Anhydrit mix",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0892567",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/839771be-ab23-4873-8b14-b2aa0f6ce9d9?version=20.19.120"},subType:"Generisk data"},{id:"5f37845d-13cd-4d2c-95bd-3670b2f81b23",name:"Perlite 0-1 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.522459",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/82c7e263-3026-45f8-aec7-ebdf818464e4?version=20.19.120"},subType:"Generisk data"},{id:"3df49b1c-f450-4d7f-bfad-d44b4049c50a",name:"Tagsten. tegl",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"158.784",C3:"0.30266",C4:"-",D:"-0.0924292"}},conversions:{kg:{to:"kg",value:"45"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/826fa2c2-c691-4844-83d3-aea0e8a54bcd?version=20.19.120"},subType:"Generisk data"},{id:"9f5b4a83-529c-41ba-af89-b87bd6a9b876",name:"Pimpsten 0-4 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.00869385",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/81a76ff5-8928-4f71-8e1f-c7c78b7e5a95?version=20.19.120"},subType:"Generisk data"},{id:"ad4518f3-e398-4959-a475-7068e7d07e1b",name:"Overflade. Facademaling. silikoneharpiks",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"125.633",C3:"0",C4:"0.0150055",D:"-0.00967088"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/815fb8f6-04cc-494d-ab6b-1b6eae98bfca?version=20.19.120"},subType:"Generisk data"},{id:"f79dce98-f816-42f5-935c-934764117bdc",name:"Træ. ceder",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-809.968",C3:"1037.52",C4:"-",D:"-282.581"}},conversions:{kg:{to:"kg",value:"571"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d7073560-4c4b-4cb0-b6bf-a902950c5109?version=20.19.120"},subType:"Generisk data"},{id:"7368a126-12db-4e71-8c15-1e97a682c714",name:"Gummigulve med skumbagside EN 1816",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"13.22",C3:"109.893",C4:"-",D:"-647.756"}},conversions:{kg:{to:"kg",value:"3.82"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7d8cb95b-99c2-4824-97a0-55d2fca5cedd?version=20.19.120"},subType:"Generisk data"},{id:"6295bb48-624a-4a91-932b-f945c8dad89a",name:"Varmepumpe. vand-vand. 10 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"284.922",C3:"522.458",C4:"0.0300174",D:"-173.463"}},conversions:{kg:{to:"kg",value:"104.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7d027677-b2e3-40dd-a4b1-91bd8f7383d5?version=20.19.120"},subType:"Generisk data"},{id:"fee1bb2b-48b1-44d5-8be4-9848056a7712",name:"Varmepumpe (luft-vand) 10 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"458.991",C3:"300.855",C4:"428.176",D:"-241.521"}},conversions:{kg:{to:"kg",value:"134"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7c0455a7-fc89-4c3c-8225-d528e4375662?version=20.19.120"},subType:"Generisk data"},{id:"813d6654-9925-44d3-afb9-04fbddc2b447",name:"Overflade. Kalkmaling",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.924854",C3:"-",C4:"0.0163697",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7baed44c-c80b-4340-b3af-f01d71fbbb43?version=20.19.120"},subType:"Generisk data"},{id:"247479d8-c365-45b3-aa77-e4d8e7dd025b",name:"Gummitætning",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"36.402",C3:"303.476",C4:"-",D:"-140.543"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7a4d3393-a33a-47c8-b42f-42d8ec6a90f6?version=20.19.120"},subType:"Generisk data"},{id:"62d0630e-3c62-45bc-beec-dd18a65d6a21",name:"Rør. Kloakrør PP",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"261.984",C3:"345.444",C4:"-",D:"-170.559"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/795b4798-b745-4189-a2b8-5d5f37d8d490?version=20.19.120"},subType:"Generisk data"},{id:"7491b1bd-3055-4b28-9974-8b17c057acae",name:"Plastplade. transparent. PmmA støbte",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"6291.42",C3:"2889.91",C4:"-",D:"-1139.6"}},conversions:{kg:{to:"kg",value:"1190"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/795ab193-fc50-463d-a5f8-e37d5336ee78?version=20.19.120"},subType:"Generisk data"},{id:"5cff71f6-cadb-4ce4-b77a-cf0266d7a263",name:"Naturstenplade. blød. facade",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"16.231",C3:"0.699482",C4:"-",D:"-0.213614"}},conversions:{kg:{to:"kg",value:"104"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/79075297-4dc0-42c6-bc90-e3bf9fa0fb4c?version=20.19.120"},subType:"Generisk data"},{id:"e5af6165-5402-4124-a43d-81b117bccd6d",name:"Rør til el-varmepumpe (lodret jordvarme. saltvand). probe. 70 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1804.28",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1843.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d61e346a-1490-4ac6-adf5-3e9323f5b967?version=20.19.120"},subType:"Generisk data"},{id:"95113356-2a02-470e-85e8-4e02a30f2156",name:"mørtel. fliseklæber",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.347032",C3:"-",C4:"0.0163697",D:"-0.00285525"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/78b7cd15-d82a-4ffa-ae08-870b6e5d35d4?version=20.19.120"},subType:"Generisk data"},{id:"57da24fb-771f-44d9-92b2-bc99f0aae41b",name:"Aluminiumsfolie (d=0.1 mm)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"311.981",C3:"-",C4:"#G0500",D:"#G0500"}},conversions:{kg:{to:"kg",value:"0.28"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/785d5ac4-c69d-4e00-941e-26433c1d023d?version=20.19.120"},subType:"Generisk data"},{id:"f3cd151d-60f7-4930-84f8-c3aa89be966e",name:"Træbetonplade",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-293.699",C3:"317.455",C4:"-",D:"-113.794"}},conversions:{kg:{to:"kg",value:"360"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/76d3f78a-8743-49fe-b4a1-f43b819cb930?version=20.19.120"},subType:"Generisk data"},{id:"f9f84d33-268d-4933-a83e-8d4ff7b99281",name:"Plastprofil. silikone",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"685.795",C3:"10.128",C4:"-",D:"-0.468477"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/763abb33-ad4f-44fa-bc49-8c483e67b2b1?version=20.19.120"},subType:"Generisk data"},{id:"dd18586d-8bf4-4bee-b854-bfd125c941a6",name:"Polyurethanskum (rørisolering)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"200.718",C3:"273.128",C4:"-",D:"-126.489"}},conversions:{kg:{to:"kg",value:"30"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/75ce5bab-4506-4f7e-8c20-a638a98b7537?version=20.19.120"},subType:"Generisk data"},{id:"06d93c55-03cb-4035-ba99-b5a62a3066d5",name:"Nylonstøbning (PA 6.6)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"106.619",C3:"287.643",C4:"-",D:"-108.716"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7511c948-c441-42fb-9ff1-cfdc54e58d7e?version=20.19.120"},subType:"Generisk data"},{id:"183a8002-ee96-4d1d-93a7-293b4df8cad6",name:"Grus. 2-15 mm. tørret",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0342735",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7502766c-df2f-4f8d-8d45-17bb6938eac8?version=20.19.120"},subType:"Generisk data"},{id:"6a62b2e0-9f74-4157-b901-83631d19e6c4",name:"Beslag til lodrette skydevinduer",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"11.591",C3:"-",C4:"#G0763",D:"#G0763"}},conversions:{kg:{to:"kg",value:"0.93"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/72c69944-5250-4269-ad34-2e20e5e38231?version=20.19.120"},subType:"Generisk data"},{id:"59fae312-e45b-46e4-af75-a82e3ff47531",name:"Puds. kalk-gips. inde",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"198.85",C3:"-",C4:"13.505",D:"-"}},conversions:{kg:{to:"kg",value:"900"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/70f6e305-e46f-4719-a94f-70267b936029?version=20.19.120"},subType:"Generisk data"},{id:"1de7a32d-314f-4f35-91e8-e6faa4d38497",name:"melamin-skum",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"65.813",C3:"143.404",C4:"-",D:"-0.663676"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/7082b2c3-5203-40ba-a6f8-d16edba60f5f?version=20.19.120"},subType:"Generisk data"},{id:"fc8cd470-17bc-4816-98e1-6abd6593b1cd",name:"Polystyren granulat (cementbundet)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"160.083",C3:"103.432",C4:"-",D:"-433.217"}},conversions:{kg:{to:"kg",value:"350"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/704177f4-78cd-47a3-b71c-07899df86615?version=20.19.120"},subType:"Generisk data"},{id:"0ce6b695-054d-4033-8501-4084999ea63a",name:"Polycarbonatplade",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"593.594",C3:"332.856",C4:"-",D:"-114.044"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6fc1267a-1f4d-4244-a65e-df8a0a3ccc50?version=20.19.120"},subType:"Generisk data"},{id:"ef595daa-7b37-41dc-adf4-f538fcd44ae7",name:"Gulvvarmesystem inkl. isolering. PP (100 mm afstand)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"613.759",C3:"668.108",C4:"-",D:"-278.435"}},conversions:{kg:{to:"kg",value:"1.9"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6f4a3a08-50d7-45e0-a4f8-e34f1bc6430e?version=20.19.120"},subType:"Generisk data"},{id:"2d635d00-cd3d-46ed-8229-db591390c915",name:"Ventilationsaggregat m. varmegenvinding 10 000 m3 / h",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2815.96",C3:"347.325",C4:"0.270427",D:"-1717.02"}},conversions:{kg:{to:"kg",value:"703.94"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6e62f780-792b-406b-84a0-6beac88d1245?version=20.19.120"},subType:"Generisk data"},{id:"b52c97fb-7221-4de3-86a9-2286965f0228",name:"LPG tank 2700 l / 1.2 t (underjordisk)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2135.85",C3:"542.252",C4:"-",D:"-1202.05"}},conversions:{kg:{to:"kg",value:"773.33"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6e520eb3-0b5e-4c7a-b702-244f93faff73?version=20.19.120"},subType:"Generisk data"},{id:"f110eb1e-656e-447c-a7a0-f9b9b731af7c",name:"Bindelag",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0778388",C3:"0",C4:"-",D:"-0.0263052"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6b6b68f8-34a4-4a0f-97ee-714bf106c3e0?version=20.19.120"},subType:"Generisk data"},{id:"587f4c33-628b-49de-b591-80879c096300",name:"Vinduesramme. pulverlakeret aluminium",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"125.422",C3:"-",C4:"#G0500",D:"#G0500"}},conversions:{kg:{to:"kg",value:"0.98"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/66990642-726e-4483-abc3-d5d0b4d7a5e7?version=20.19.120"},subType:"Generisk data"},{id:"fa7703c4-1914-4c88-80f6-1ca5be9db4fa",name:"EPDm-tætning til aluminiumsprofil",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"0.578307",C3:"0.564894",C4:"0.564566",D:"-0.610451"}},conversions:{kg:{to:"kg",value:"0.18"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/66094ad5-51d6-45c4-b2e3-451220520cab?version=20.19.120"},subType:"Generisk data"},{id:"31678e00-c120-4a75-aeca-a02fce22c1ff",name:"Skortsten polypropylen (PP)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"250.046",C3:"273.128",C4:"-",D:"-126.489"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/65ed50b4-0fd3-45b2-8ccd-990908939d46?version=20.19.120"},subType:"Generisk data"},{id:"e747e433-d091-4d1b-94c9-2cf34f0e9266",name:"Polyethylen-skum",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"305.545",C3:"398.495",C4:"-",D:"-180.361"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/65af52ac-382b-4069-aafe-b044b3960356?version=20.19.120"},subType:"Generisk data"},{id:"3cc9e12a-d916-48c4-9b47-5803b235176b",name:"Regnvandsrør. støbejern",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.722883",C3:"-",C4:"#G0204",D:"#G0204"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/64e16249-8051-483b-968e-46008a43ef18?version=20.19.120"},subType:"Generisk data"},{id:"da808d1e-dec3-43f9-bd8d-ad20477765cb",name:"Kalciumsilikatplade",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"550.399",C3:"165.087",C4:"-",D:"-0.462146"}},conversions:{kg:{to:"kg",value:"225"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6405878c-ed34-4bee-b100-5208a3212ec6?version=20.19.120"},subType:"Generisk data"},{id:"da75982d-6e84-4a42-b5b8-1794f653e143",name:"Sand 0-2 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.00285398",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/61655387-edd4-4800-ba3e-67bc15f2f096?version=20.19.120"},subType:"Generisk data"},{id:"5bf05389-684f-4464-87db-d56a7c6701aa",name:"Spånplade",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-873.594",C3:"1268.47",C4:"-",D:"-293.429"}},conversions:{kg:{to:"kg",value:"700"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/60e8b384-adf2-4c3b-b3da-e407df106cf5?version=20.19.120"},subType:"Generisk data"},{id:"040c6f7a-620d-43da-9bb4-767b7c15f48d",name:"Solvarmekollektor. plan",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"104.039",C3:"117.626",C4:"-",D:"-572.425"}},conversions:{kg:{to:"kg",value:"18.27"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/60e0575b-6cb4-4ba4-a9f0-78d8fb65c9a9?version=20.19.120"},subType:"Generisk data"},{id:"ce08e4d9-b602-4346-af14-3a3de95368f9",name:"Lersten",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"936.405",C3:"40.537",C4:"-",D:"-176.256"}},conversions:{kg:{to:"kg",value:"1200"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/606d978a-c44a-4b3e-8387-b1291b12e522?version=20.19.120"},subType:"Generisk data"},{id:"f1610791-141c-47ef-80cd-9fffe71787e8",name:"mineraluld. løsfyld",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"640.233",C3:"124.651",C4:"0.690596",D:"-"}},conversions:{kg:{to:"kg",value:"50"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/601af947-1f14-474d-8233-780715a12268?version=20.19.120"},subType:"Generisk data"},{id:"5c86c1b1-b653-4626-b518-ed17940a5939",name:"Hampfiberdug",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"191.569",C3:"861.825",C4:"-",D:"-120.031"}},conversions:{kg:{to:"kg",value:"38"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5ef0c519-f5b2-4d45-809d-5f417f90e90b?version=20.19.120"},subType:"Generisk data"},{id:"7cb6df86-a59d-463a-b78f-3cbb2e812a18",name:"Vindueskarm. plast",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"825.055",C3:"391.687",C4:"-",D:"-322.888"}},conversions:{kg:{to:"kg",value:"2.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5e90e94d-6e79-4d9f-854c-fb33f15c033e?version=20.19.120"},subType:"Generisk data"},{id:"2540e19c-da1b-4204-bae7-5c9bdfab1b04",name:"Gulvvarmesystem inkl. isolering. Kobber (200 mm afstand)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"12.979",C3:"316.865",C4:"-",D:"-405.503"}},conversions:{kg:{to:"kg",value:"3.3"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5dad78e0-234c-49d0-93aa-a06c6efee60f?version=20.19.120"},subType:"Generisk data"},{id:"77106f7d-2e9c-47ff-ae4c-6318abf1fdd8",name:"Gipspulver. Alpha-halvhydrat",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.261835",C3:"-",C4:"0.0163697",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5ce375b1-eb6d-4fc7-84bb-11ae702d3056?version=20.19.120"},subType:"Generisk data"},{id:"5d8c5d8a-ac88-47ad-bea4-1b56f7e77b57",name:"mineraluld. stenuld. rørskål",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"317.952",C3:"0.0163697",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"151"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5c1776a7-de57-4b4d-87fc-933f52fddd6e?version=20.19.120"},subType:"Generisk data"},{id:"db7d7415-8f11-499a-ba1f-221ecec9d944",name:"Støbeasfalt",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.11688",C3:"0",C4:"0.0793276",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ad94ce55-af1d-4da0-963c-bf263aaa37ee?version=20.19.120"},subType:"Generisk data"},{id:"4b5951ed-4445-4e57-abca-2725d9165439",name:"Bitumenklæber",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.61328",C3:"0",C4:"0.0859383",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5ae00c4e-1b1c-4374-9864-2aee735a0563?version=20.19.120"},subType:"Generisk data"},{id:"9346f5f7-6f87-4ca7-b0a7-43069d45a342",name:"Plastplade. transparent. PVC",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"3996.11",C3:"4010",C4:"-",D:"-814.07"}},conversions:{kg:{to:"kg",value:"1220"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5a88b96e-23d0-4656-9ee2-fc271c89c95b?version=20.19.120"},subType:"Generisk data"},{id:"11407d68-fb6e-4503-b6a9-34386c7efc4a",name:"Betonrør. armeret",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.141743",C3:"0.00721909",C4:"-",D:"-0.00202091"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5a1cbf92-ed39-4e8c-bd01-5463bffb3c9d?version=20.19.120"},subType:"Generisk data"},{id:"a808d60b-1942-4633-b4f6-9ea1b15ef8ff",name:"Ler. stampet ler",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"934.931",C3:"675.616",C4:"-",D:"-293.761"}},conversions:{kg:{to:"kg",value:"2000"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/59622fc0-d719-43bf-a16b-ae924ae0d276?version=20.19.120"},subType:"Generisk data"},{id:"88714b5b-de56-44ab-a6d3-1ddcd4a0275d",name:"Porebeton granulat",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"528.468",C3:"269.031",C4:"-",D:"-0.821592"}},conversions:{kg:{to:"kg",value:"400"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/57a87943-dbdd-4221-bbd2-481b8fcd1d2b?version=20.19.120"},subType:"Generisk data"},{id:"bd422805-b3eb-4452-bbd8-b54ac3a63a65",name:"Solafskærmning. polyethylenterephthalat (PET)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"4.194",C3:"110.342",C4:"-",D:"-0.335872"}},conversions:{kg:{to:"kg",value:"0.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5662c927-cd47-46e5-b753-925db31b9870?version=20.19.120"},subType:"Generisk data"},{id:"5dc1dd34-17ca-4caa-8a93-270097f607de",name:"Solafskærmning. aluminiumslameller",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"236.353",C3:"-",C4:"#G0500",D:"#G0500"}},conversions:{kg:{to:"kg",value:"2.391"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/563350f7-fb56-4363-b86a-690227dd450e?version=20.19.120"},subType:"Generisk data"},{id:"059d0d79-7a2f-4894-9327-0e330c65779c",name:"mørtel. armeringsmørtel. kunstharpiks spartelmasse",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.476923",C3:"0",C4:"0.0163697",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/55a89d7b-b585-404f-be34-bb7285730a89?version=20.19.120"},subType:"Generisk data"},{id:"f9a5ef25-5f6b-432c-b080-4678144a3103",name:"Rustfri stål. genanvendelse",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"-",C4:"0.00068207",D:"-266.377"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/55945019-018a-46da-baae-a3ee62d59cf3?version=20.19.120"},subType:"Generisk data"},{id:"de7ce158-8b03-4ef3-bc60-0420db431584",name:"Affald. træ. forbrænding fjernvarme",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"182.315",C4:"-",D:"-0.685639"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/553d7a7a-bf66-4a69-b1ae-6cf15e396935?version=20.19.120"},subType:"Generisk data"},{id:"135c5f45-f388-49c2-9780-a8af84a6a3e1",name:"Stål. varmvalset plade. 2-20 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"267.628",C3:"-",C4:"#G0122",D:"#G0122"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/531ab34f-6750-41a8-aedc-35cf4df3c8b1?version=20.19.120"},subType:"Generisk data"},{id:"1ceafb89-5c07-49a8-9d57-0ce48563bf7e",name:"Stål. Varmgalvaniseret stålplade",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"163.885",C3:"-",C4:"#G0122",D:"#G0122"}},conversions:{kg:{to:"kg",value:"5.72"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/50c9e674-afd9-456c-9440-6506bec6d55b?version=20.19.120"},subType:"Generisk data"},{id:"d4964645-01bc-498d-81e4-d562aeae5204",name:"Kalkcementmørtel",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"202.003",C3:"-",C4:"294.654",D:"-"}},conversions:{kg:{to:"kg",value:"1800"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/50180064-236e-4e52-9a1e-f172dde80844?version=20.19.120"},subType:"Generisk data"},{id:"b8a166f0-3ea1-4aea-a354-3cdb1230cee0",name:"Oliekedel. lav temperatur. 120-400 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"3035.05",C3:"536.451",C4:"180.285",D:"-626.817"}},conversions:{kg:{to:"kg",value:"992"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4e5198e4-4eea-4550-8853-b76a6d6f9f05?version=20.19.120"},subType:"Generisk data"},{id:"5d74de19-2388-4457-8edf-c82a0911496b",name:"Brugsvandsrør. rustfast stål",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"355.922",C3:"-",C4:"#G0763",D:"#G0763"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4d37d8f4-13db-418d-820d-5cf08f050eff?version=20.19.120"},subType:"Generisk data"},{id:"0b1289c2-ae39-4576-b374-a191ae942694",name:"Vandvarmer. el. gennemstrøm. 21 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"147.374",C3:"492.449",C4:"-",D:"-693.214"}},conversions:{kg:{to:"kg",value:"3.95"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4ce46be9-2f9c-4686-aa21-7ebf34783674?version=20.19.120"},subType:"Generisk data"},{id:"4d9cf76a-821f-4a60-b6fb-8233675be8fb",name:"Brugsvandsrør. Alu-PEX",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"762.125",C3:"188.424",C4:"-",D:"-479.765"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4c33a250-3979-4e5f-9a7c-0d351085da22?version=20.19.120"},subType:"Generisk data"},{id:"75f8a981-fc14-4eb1-8210-4ece3564d86a",name:"Vinduesbeslag. aluminium",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"873.468",C3:"-",C4:"#G0763",D:"#G0763"}},conversions:{kg:{to:"kg",value:"1.014"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4bf26663-9018-47a1-943d-8ed4d3f87d0f?version=20.19.120"},subType:"Generisk data"},{id:"888faeac-1ce2-4fc2-8626-0046b1969cfe",name:"Dampspærre PA",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.707438",C3:"0.219924",C4:"-",D:"-0.0874466"}},conversions:{kg:{to:"kg",value:"0.08"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4bb6f0f6-178c-41e0-8700-bd597f23ccb8?version=20.19.120"},subType:"Generisk data"},{id:"191ba89d-7286-4035-a3a8-b5c5176f1665",name:"Oparbejdning af byggeaffald",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"0.002663",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4a937f66-c9c2-402b-9a00-83767031bfa7?version=20.19.120"},subType:"Generisk data"},{id:"86cefc59-6467-4917-9c41-dc88dc4e1fc6",name:"Puds. syntetisk harpiks",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"1201.64",C3:"-",C4:"255.094",D:"-"}},conversions:{kg:{to:"kg",value:"1700"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4a7c30d1-37d7-47e2-8271-dbb3bee91560?version=20.19.120"},subType:"Generisk data"},{id:"d43f0caa-6d3a-4b9a-98ef-83a0256eba98",name:"Varmepumpe (luft-vand) 14kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"642.587",C3:"421.198",C4:"599.447",D:"-338.129"}},conversions:{kg:{to:"kg",value:"187.6"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4a08f220-1c52-453c-bf8f-f209586e96c8?version=20.19.120"},subType:"Generisk data"},{id:"5741339f-e388-4699-af21-a7ae4ad4f0b5",name:"Pillefyr. 20-120 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2329.17",C3:"329.897",C4:"180.285",D:"-1021.95"}},conversions:{kg:{to:"kg",value:"833"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/49660117-13cd-4475-a66b-a13801723a37?version=20.19.120"},subType:"Generisk data"},{id:"4dfc855e-49bd-4ef6-aee7-cd420891bf48",name:"Rulletrappe (grundkomponenter pr. trappe)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"12715.1",C3:"105.496",C4:"488.271",D:"-5674.33"}},conversions:{kg:{to:"kg",value:"4076"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/493df9d1-493c-4820-8bbf-8f1a5f1aec5e?version=20.19.120"},subType:"Generisk data"},{id:"b5656347-b96a-41eb-8693-7e667972caaa",name:"Brugsvandsrør. PEX-Alu-PEX",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"779.468",C3:"30.242",C4:"-",D:"-292.695"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/47165a1f-51e3-4612-b076-facd01e3b236?version=20.19.120"},subType:"Generisk data"},{id:"ef4df72f-6513-42a9-9e6a-c274ccbee121",name:"Brugsvandsrør. PB",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"399.847",C3:"390.707",C4:"-",D:"-162.827"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/45db3c26-a316-4ba7-ade5-6adc43c71118?version=20.19.120"},subType:"Generisk data"},{id:"2348a19e-1e18-4627-ba22-0d4d1b989fb6",name:"Træprodukter. affaldsforbrænding",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"180.183",C4:"-",D:"-0.523199"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/44e4bf51-8e23-47e3-8f5e-5243525bb32e?version=20.19.120"},subType:"Generisk data"},{id:"9cedd018-6fbc-4ea3-b24c-e1a475cbe746",name:"Perlite 0-3 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.558289",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/44c57da1-24ce-488d-b4f9-283fa603cc9d?version=20.19.120"},subType:"Generisk data"},{id:"988cb65f-d066-4b75-bba9-59a21589f617",name:"Lithiumbromid",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"808.139",C3:"-",C4:"923.499",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/446ba42f-701c-4bf5-84cb-9b0963860182?version=20.19.120"},subType:"Generisk data"},{id:"340fbc9d-bcfb-4d60-b970-334e82ba0591",name:"LPG tank 6400 l / 2.9 t (underjordisk)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"3839.02",C3:"973.728",C4:"-",D:"-2159.91"}},conversions:{kg:{to:"kg",value:"1390"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4411ce80-6a9a-4088-94bb-426805d99bfc?version=20.19.120"},subType:"Generisk data"},{id:"625d1c63-2cf5-4c31-8ed7-194d146201ef",name:"XPS isolering",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"963.403",C3:"118.208",C4:"-",D:"-495.105"}},conversions:{kg:{to:"kg",value:"32"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/43e99b8c-90d8-4fcd-90ce-342fb0b7366e?version=20.19.120"},subType:"Generisk data"},{id:"7b67e3fd-3c3a-4d5c-a738-9d6ea83723c4",name:"Lim til gipsplader",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.103165",C3:"-",C4:"0.0150055",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/43c3fd78-c67e-438b-b726-dd512df5d881?version=20.19.120"},subType:"Generisk data"},{id:"97dfd1a5-1a00-47ec-ae74-e28e632845ba",name:"Plastplade. transparent. PmmA ekstruderet",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"5756.79",C3:"2889.91",C4:"-",D:"-1139.6"}},conversions:{kg:{to:"kg",value:"1190"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/41b8a86d-5d44-49fb-a9b8-de2a9041f1fd?version=20.19.120"},subType:"Generisk data"},{id:"b16e3db7-ee41-4bd3-af8e-f3483edd832a",name:"Vindueskarm. træ",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"-0.369776",C3:"403.683",C4:"-",D:"-162.212"}},conversions:{kg:{to:"kg",value:"2.11"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4127e60a-3c42-4076-83f5-5232b4ed642e?version=20.19.120"},subType:"Generisk data"},{id:"ecc541e5-6e8a-4232-bceb-a48f9bf7caec",name:"Ler pulver",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.349057",C3:"0.00337808",C4:"-",D:"-0.0014688"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3d9f0293-304f-4731-8136-326cebf8b1f0?version=20.19.120"},subType:"Generisk data"},{id:"cbdf2b4f-4869-4952-9129-75fadf8735b5",name:"Skorsten opmuret (2 rør)",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"474.265",C3:"320.127",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"195.6"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3d6c39b1-98ef-472d-95e3-c0b49d4109c6?version=20.19.120"},subType:"Generisk data"},{id:"83e0b154-ab44-4c40-b9aa-aeee527eedef",name:"Rør til el-varmepumpe (lodret jordvarme. saltvand). collector. 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"726.23",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"282"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3d3873a9-16dd-4771-82be-f7b79bbd3f53?version=20.19.120"},subType:"Generisk data"},{id:"2def1bcc-93ce-43d6-8973-afea90a5c540",name:"Grus 2-32 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.00285398",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3ce61a4e-4d91-4b1d-b675-276be05b9225?version=20.19.120"},subType:"Generisk data"},{id:"c7315e1a-4f05-4333-bf7e-58e906e6dcb1",name:"Rulleskodder. PVC",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"234.651",C3:"120.519",C4:"-",D:"-100.487"}},conversions:{kg:{to:"kg",value:"6.24"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3ce53be7-a3e5-4757-b7f9-68a6ecf66eb9?version=20.19.120"},subType:"Generisk data"},{id:"0390b975-78bf-4359-b3cd-98cb7e33e6ae",name:"El-varmepumpe (lodret jordvarme. saltvand) 10 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"338.947",C3:"435.298",C4:"0.0300174",D:"-156.278"}},conversions:{kg:{to:"kg",value:"139"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3bf7183e-741e-4fb7-a32e-574e76e3e747?version=20.19.120"},subType:"Generisk data"},{id:"72d441cc-d024-4316-926c-b26a02dc20e6",name:"Grunder til silikonespuds",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.692053",C3:"-",C4:"0.0163697",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3a99d696-4911-45da-9f80-647ce214bca0?version=20.19.120"},subType:"Generisk data"},{id:"3b9fdfac-e621-40d4-8d7c-afb95658911d",name:"PVC gulvbelægning",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"8.191",C3:"108.467",C4:"-",D:"-220.199"}},conversions:{kg:{to:"kg",value:"3.3"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/39da14a3-8f39-4af9-955c-6a70f091acb8?version=20.19.120"},subType:"Generisk data"},{id:"ac8eaf35-1fda-478a-b82c-573d105bc374",name:"Læsket kalk. pulver",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"109.784",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/39bd1632-3f36-410c-86d9-cab27e91b1c5?version=20.19.120"},subType:"Generisk data"},{id:"8ee96207-9c43-48cf-95a3-7dd1311a1fb1",name:"Træfiberisoleringsplade (våd proces)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-182.182",C3:"334.691",C4:"-",D:"-886.621"}},conversions:{kg:{to:"kg",value:"160"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/393f494d-8738-4330-aa5e-1652bb29b574?version=20.19.120"},subType:"Generisk data"},{id:"342401b6-3d54-4eb1-b585-7d5fb9ebda13",name:"Vindueshåndtag",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"0.957379",C3:"0.251996",C4:"-",D:"-0.109308"}},conversions:{kg:{to:"kg",value:"0.1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/38ddefe2-e01c-4ece-9952-a353b7dfb246?version=20.19.120"},subType:"Generisk data"},{id:"4a57f963-9732-4459-b79f-3a72d54b48e6",name:"Gaskedel. kondenserende. 20-120 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1104.19",C3:"226.536",C4:"157.929",D:"-157.721"}},conversions:{kg:{to:"kg",value:"292"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/38053775-45d9-4649-8299-ec8a5a60cbd9?version=20.19.120"},subType:"Generisk data"},{id:"90d95eb6-d484-43f8-9b3a-52042f1453b2",name:"Stålprofil",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.994444",C3:"-",C4:"#G0204",D:"#G0204"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/38051c22-fbd1-4b0e-944a-ae348b8c7695?version=20.19.120"},subType:"Generisk data"},{id:"ea4f6dcc-8cb6-454a-8568-235b5f9310ca",name:"Kondenserende gaskedel 120-400 kW (standalone enhed)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"3422.37",C3:"161.496",C4:"180.285",D:"-1357.73"}},conversions:{kg:{to:"kg",value:"974"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/36d1bbf3-1e67-4a93-92f5-0321cc30018a?version=20.19.120"},subType:"Generisk data"},{id:"3849ed23-b2f0-44ee-a624-ee47ec1fb85e",name:"Overflade. Indendørsmaling. emulsions maling. slidstærk",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"262.123",C3:"-",C4:"0.0150055",D:"-0.010823"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/35be6146-5a80-4a9e-a32d-5d05c03a8d5c?version=20.19.120"},subType:"Generisk data"},{id:"d48d26e3-038e-4a2c-a8d6-90af4fd22f43",name:"Kalciumsulfat",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.107014",C3:"-",C4:"0.0150055",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/34d3bb5e-f241-45b4-b257-123281364d97?version=20.19.120"},subType:"Generisk data"},{id:"d2ab1811-8438-4ae5-8bb0-b6a057486ccc",name:"Varmepumpe. vand-vand. 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"284.32",C3:"522.458",C4:"0.0300174",D:"-173.463"}},conversions:{kg:{to:"kg",value:"104"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/34ad748d-a657-4d69-92ae-c53dd18a0094?version=20.19.120"},subType:"Generisk data"},{id:"d9be1941-b646-4303-9a5e-0768c07f0c83",name:"Lerrør. glaseret. DN 250",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"262.848",C3:"0.405381",C4:"-",D:"-0.104753"}},conversions:{kg:{to:"kg",value:"51"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/335c3c94-a981-4dbd-af2f-811e918f1b94?version=20.19.120"},subType:"Generisk data"},{id:"706069d7-bc34-4f96-bd22-f2eb0689af1a",name:"Vinduesramme. træ",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"-0.147349",C3:"403.685",C4:"-",D:"-161.135"}},conversions:{kg:{to:"kg",value:"2.11"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/318f08e0-1b04-49eb-ab16-531482cd75da?version=20.19.120"},subType:"Generisk data"},{id:"31cc0d99-f9fb-4739-a1d9-c23532aebd13",name:"Træ. fyrretræ (12% fugt / 10.7% H2O)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-783.129",C3:"985.049",C4:"-",D:"-260.334"}},conversions:{kg:{to:"kg",value:"548.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/aea021e8-7e2f-4f6b-ae3f-a76cba4c5d6e?version=20.19.120"},subType:"Generisk data"},{id:"82b47265-aa6a-48ec-8e4c-2a8876d34af2",name:"Cirkulationspumpe < 50 W",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"132.285",C3:"0.432995",C4:"0.0225356",D:"-253.107"}},conversions:{kg:{to:"kg",value:"2.47"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/301c6f09-ce88-4818-96c3-e420fe799d62?version=20.19.120"},subType:"Generisk data"},{id:"5cffdd0d-f894-4544-a6fc-058ca0bf8c7a",name:"Overflade. Vinduesmaling. hvid",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"182.186",C3:"0.784673",C4:"-",D:"-0.243853"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2e5ca27a-fcd0-4dc1-b0ab-4a4c7eb4e030?version=20.19.120"},subType:"Generisk data"},{id:"b3a6cc93-4451-49d9-a629-6d38b214ca70",name:"LPG tank 2700 l / t 1.2 (overjordiske)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1720.01",C3:"0.433551",C4:"-",D:"-825.924"}},conversions:{kg:{to:"kg",value:"648"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2d5644dd-ac9f-4546-a004-20ca372d5d08?version=20.19.120"},subType:"Generisk data"},{id:"aef575c2-78f4-45be-8fc1-32e966b5ab12",name:"Affald. inert. deponering (glas)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"-",C4:"0.0136414",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2d30b3f0-d118-4b24-a037-11f154b43f6f?version=20.19.120"},subType:"Generisk data"},{id:"99442ed2-f027-4ef2-bcdc-6ce544ed3703",name:"LPG tank 4850 l / 2.1t (overjordiske)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"2762.64",C3:"0.851223",C4:"-",D:"-1621.6"}},conversions:{kg:{to:"kg",value:"1040"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2c6e929d-026a-4547-b872-1213fba3a690?version=20.19.120"},subType:"Generisk data"},{id:"9ec81b5e-c3bf-4654-8077-f51e807f3c00",name:"PIR-skum. høj densitet (250 kg/m3)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"781.381",C3:"644.627",C4:"-",D:"-249.994"}},conversions:{kg:{to:"kg",value:"250"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2c076ee7-3853-4f69-9bf5-8ec265fa43e0?version=20.19.120"},subType:"Generisk data"},{id:"aab84b72-bab2-4997-a8dc-2e53738c3cc9",name:"El-varmepumpe (lodret jordvarme. saltvand) 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1997.42",C3:"435.299",C4:"0.0300174",D:"-156.292"}},conversions:{kg:{to:"kg",value:"1498.05"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2af8a919-15c5-4709-bc6c-276d1e0951d5?version=20.19.120"},subType:"Generisk data"},{id:"c83f59b4-6c59-4bc1-8e3c-13bdf63e4162",name:"Oliekedel. lav temperatur. <20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"803.765",C3:"119.181",C4:"0.946495",D:"-139.23"}},conversions:{kg:{to:"kg",value:"221"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2aa9cc62-46ee-447f-85e8-50d03e0574f4?version=20.19.120"},subType:"Generisk data"},{id:"ebe88a7c-000d-4a16-a014-9035e592d833",name:"Gulvvarmesystem inkl. isolering. PEX (200 mm afstand)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"56.924",C3:"49.229",C4:"-",D:"-205.162"}},conversions:{kg:{to:"kg",value:"1.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2a99b26d-db9a-4514-bb03-ed965ed61558?version=20.19.120"},subType:"Generisk data"},{id:"a200f1b1-ea08-4b65-ad4a-a2813459478b",name:"Kalksandsten",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"306.119",C3:"134.516",C4:"-",D:"-410.796"}},conversions:{kg:{to:"kg",value:"2000"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/29e6c6cf-0552-4e4b-85c7-26a68a625252?version=20.19.120"},subType:"Generisk data"},{id:"16419ebb-e8fe-417d-bc03-9910a45fa0fb",name:"Singels 2-15 mm",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.014695",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/26ad7410-7fcb-42e8-b622-d1ba2edbf10c?version=20.19.120"},subType:"Generisk data"},{id:"acba2ef7-3e65-4ea6-abc9-efda4bb9b016",name:"Gulvvarmesystem inkl. isolering. PP (200 mm afstand)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"488.738",C3:"49.229",C4:"-",D:"-205.162"}},conversions:{kg:{to:"kg",value:"1.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/243f619c-c8ee-4339-9bbd-4df03737aa1a?version=20.19.120"},subType:"Generisk data"},{id:"532631c1-fa37-47aa-bc80-f5f1cf4410ee",name:"Kølemiddel (R407c)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"838.122",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/242540e0-6b44-4080-bf2e-72fa45376cab?version=20.19.120"},subType:"Generisk data"},{id:"0e7f98bf-df37-462f-81d7-7afd569efd92",name:"Sand. knust. tørret",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0342735",C3:"0.00672578",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/230cd2c6-0b79-461b-b51a-d092e66843ca?version=20.19.120"},subType:"Generisk data"},{id:"4c1532ae-747c-4df3-bc72-13bedba9b6a6",name:"Plastplade. transparent. PC",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"6131.21",C3:"3661.42",C4:"-",D:"-1368.53"}},conversions:{kg:{to:"kg",value:"1200"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/222023f8-36c2-4345-a863-b49828a41e96?version=20.19.120"},subType:"Generisk data"},{id:"3839b7d9-d9e4-4b7f-b73d-60f9da4fe563",name:"CR-profil til forsegling (chloropren gummi)",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"0.895329",C3:"0.555074",C4:"-",D:"-0.276832"}},conversions:{kg:{to:"kg",value:"0.18"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/208395ce-85db-4ec3-ab24-8e5920f58077?version=20.19.120"},subType:"Generisk data"},{id:"a3202c5a-fd56-471e-a22a-fee7ccd1d298",name:"Gipskartonplade 13 mm. hulplade",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"136.406",C3:"-",C4:"0.127547",D:"-"}},conversions:{kg:{to:"kg",value:"8.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/207cde6a-73be-4ffb-972d-30d3d8619fc3?version=20.19.120"},subType:"Generisk data"},{id:"61435a47-ad63-4be6-92f0-85a9db05f9e7",name:"Bomuld",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-0.780289",C3:"220.182",C4:"-",D:"-0.722834"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/206deb33-2710-417d-9b92-aa70c7958334?version=20.19.120"},subType:"Generisk data"},{id:"2eed008c-537f-4f39-9152-a1f0a8799e06",name:"Glasbyggesten",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"3926.96",C3:"-",C4:"443.346",D:"-"}},conversions:{kg:{to:"kg",value:"2500"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1f2d6e42-9ffc-421d-990d-555eee4a7529?version=20.19.120"},subType:"Generisk data"},{id:"2f03f792-994f-4411-a6dc-fbf52ae6ed90",name:"Aluminium. støbegods",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"109.481",C3:"-",C4:"#G0500",D:"#G0500"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1e8e3c3e-aad0-44ef-977e-d040c4597df0?version=20.19.120"},subType:"Generisk data"},{id:"a3692582-1d7d-4382-a20f-2d0cfb2e9d85",name:"Stokerfyr 120-400 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"7141.52",C3:"187.887",C4:"180.285",D:"-3691.63"}},conversions:{kg:{to:"kg",value:"3399"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1de7287f-aa29-4d83-92c6-e88bc14c76c2?version=20.19.120"},subType:"Generisk data"},{id:"af56abf4-a0a4-4c95-91b9-7e7feb706796",name:"Curtain wall profiler. aluminium",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"551.564",C3:"342.169",C4:"-",D:"-356.544"}},conversions:{kg:{to:"kg",value:"5.7"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1d2945e3-856e-4c5f-9894-e75bafad3a76?version=20.19.120"},subType:"Generisk data"},{id:"3a606eb1-344f-4864-8f54-eec8feafa70a",name:"Plast profil SBR",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"420.151",C3:"31.383",C4:"-",D:"-16.957"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1b69b3a2-3164-436b-a934-ed7d926f5f53?version=20.19.120"},subType:"Generisk data"},{id:"ada3c244-2e27-4741-bc1e-1f299357385c",name:"Overflade. træfacade. semi-pigmenteret lasursystem",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"27.365",C3:"0.836874",C4:"-",D:"-0.261171"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1a4a4522-7297-4ae5-a430-689e89ec2159?version=20.19.120"},subType:"Generisk data"},{id:"7b84a369-abee-4511-9f69-c161154c9b09",name:"Porebeton 472 kg/m³",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"222.605",C3:"317.457",C4:"-",D:"-0.969479"}},conversions:{kg:{to:"kg",value:"472"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1a43ae76-2dc9-4a3a-9926-47e7137e773d?version=20.19.120"},subType:"Generisk data"},{id:"d0aa3f5c-1774-4e78-96da-c7336a8ef26e",name:"Rør til el-varmepumpe (lodret jordvarme. saltvand). collector. 10 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"363.115",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"141"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1a27c109-1e99-45e7-b198-7c79f926b996?version=20.19.120"},subType:"Generisk data"},{id:"28db7874-e6cd-439b-9df4-923e9ee253ed",name:"Skærvemastisk asfalt (SmA)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.0765834",C3:"0",C4:"-",D:"-0.0263052"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/19f46be3-d65a-441f-8d74-dfc412160cf1?version=20.19.120"},subType:"Generisk data"},{id:"87668aa9-319f-42ae-9d73-10778018341f",name:"Glas 4 mm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"133.289",C3:"-",C4:"0.163697",D:"-"}},conversions:{kg:{to:"kg",value:"10"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1490b480-2c36-43f2-ba8b-4ea49948f7c3?version=20.19.120"},subType:"Generisk data"},{id:"12b8481e-0d43-4712-afac-983892b3dbfa",name:"Kondenserende gaskedel <20 kW (standalone enhed)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"753.547",C3:"218.182",C4:"15.829",D:"-183.436"}},conversions:{kg:{to:"kg",value:"133"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/12bd4f95-1ff1-4b63-8654-e2dca3fd38fe?version=20.19.120"},subType:"Generisk data"},{id:"d3fdfd1c-ac0c-48bf-8ed3-ff9a4cf2e3a2",name:"Overflade. metal maling (opløsningsmiddelbaseret)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"228.622",C3:"0.143886",C4:"-",D:"-0.0404745"}},conversions:{kg:{to:"kg",value:"0.21"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/118d1b5e-5f22-4d04-8711-c4b02de02209?version=20.19.120"},subType:"Generisk data"},{id:"352a177b-d863-4730-974a-ef7f9dbefb82",name:"Lithium jernfosfat (LiFePO4) batteri (1 kWh lagring)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"241.48",C3:"-",C4:"225.933",D:"-352.863"}},conversions:{kg:{to:"kg",value:"23.3"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/10c531c8-329c-479a-bbe9-17990ca5dfd6?version=20.19.120"},subType:"Generisk data"},{id:"3904c4eb-5556-4f20-97e2-44ceb58ae673",name:"Kondenserende gaskedel 20-120 kW (standalone enhed)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1268.3",C3:"467.263",C4:"180.285",D:"-392.75"}},conversions:{kg:{to:"kg",value:"283"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0fa37281-b976-458b-880e-46268ca7a294?version=20.19.120"},subType:"Generisk data"},{id:"1350d3e5-e067-48a9-af6b-5a67f9da1757",name:"Overflade. Vandbaseret lak. hvid",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"201.226",C3:"0.856007",C4:"-",D:"-0.24092"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0f072f06-faa5-466e-970c-a7215685f5a2?version=20.19.120"},subType:"Generisk data"},{id:"0b6768f9-1dd0-4a26-9d37-2e734827536c",name:"Betonrør. u-armeret",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.132191",C3:"0.00733722",C4:"-",D:"-0.00205398"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0eada728-b626-4f79-ba67-020635b4e67f?version=20.19.120"},subType:"Generisk data"},{id:"2fb0a351-e02b-41b4-91cf-2803a0b33983",name:"PVC plastisol",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"243.275",C3:"273.937",C4:"-",D:"-0.556058"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0e39587e-8c05-4a8e-80b5-bb9a57bbe164?version=20.19.120"},subType:"Generisk data"},{id:"d7516f2d-bc40-45cc-a0c9-66e1de068cc3",name:"Pellet-kedel. <20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1168.47",C3:"131.871",C4:"180.285",D:"-409.511"}},conversions:{kg:{to:"kg",value:"335"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0e03a1c1-0aa9-4e94-bbc5-653d967b0d8d?version=20.19.120"},subType:"Generisk data"},{id:"8136446a-3883-4de7-8e88-6d675093c684",name:"Rørgods",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"177.322",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0cc9aee8-95a6-45bf-b581-1d982e593703?version=20.19.120"},subType:"Generisk data"},{id:"83b6c437-2c23-490e-ad9a-11df207e8440",name:"Overflade. Facademaling. silikat",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.865769",C3:"-",C4:"0.0150055",D:"-0.010823"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/02f2750e-eec2-492a-9f05-b9600593b6c5?version=20.19.120"},subType:"Generisk data"},{id:"7a182510-9d92-4abb-a90f-6b1063a3c52f",name:"Puds. gips",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"134.173",C3:"-",C4:"13.505",D:"-"}},conversions:{kg:{to:"kg",value:"900"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0b0d0210-c31d-4fc7-b11a-9cdfe0a87ed6?version=20.19.120"},subType:"Generisk data"},{id:"b18a1c75-ca61-49e7-95d2-b43de51ef5fc",name:"Afretningslag. cementbaseret",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.183551",C3:"-",C4:"0.0150055",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0973f221-2284-4892-ae3d-1b8c2986b6dd?version=20.19.120"},subType:"Generisk data"},{id:"5e790f73-7e8d-4aa8-87aa-8cf1f29d4f95",name:"Varmepumpe. jordvarmesonde. 10 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"855.755",C3:"435.299",C4:"0.0300174",D:"-156.292"}},conversions:{kg:{to:"kg",value:"563"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0959c210-3af7-43df-9a7b-0f5ac19656ea?version=20.19.120"},subType:"Generisk data"},{id:"53447b80-748f-4b86-b2af-3c68041b44b1",name:"Urea formaldehyd skum isolering",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"288.236",C3:"187.588",C4:"-",D:"-0.666651"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/08bdbef6-9134-422f-8504-00eeee75d31f?version=20.19.120"},subType:"Generisk data"},{id:"0cd2b8cd-cb29-4b13-a90f-bee1b0e42c33",name:"Træbrædder. bøg (12% fugtighed / 10.7% H2O)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-1093.21",C3:"1328.2",C4:"-",D:"-352.468"}},conversions:{kg:{to:"kg",value:"739.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/08bbc2e2-1513-4ce3-816e-99e95fdafc4e?version=20.19.120"},subType:"Generisk data"},{id:"73d9153e-a923-4f21-89ba-034ff7ba30b9",name:"Overflade. Vinduesmaling. mellemlag dækkende hvid",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"178.204",C3:"0.784673",C4:"-",D:"-0.243992"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/08138b62-1b5f-497a-bf9a-d7f857a2e575?version=20.19.120"},subType:"Generisk data"},{id:"70dba606-668e-48ba-a595-a1af2a98a156",name:"Kalkpuds. tørstof",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"190.611",C3:"-",C4:"13.505",D:"-"}},conversions:{kg:{to:"kg",value:"900"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/07f3cd13-22bb-494d-803a-f0a440fbce7a?version=20.19.120"},subType:"Generisk data"},{id:"945c039e-c087-4ab8-9e74-ca35206bb798",name:"Varmepumpe. jordvarmeslange. 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"392.972",C3:"435.298",C4:"0.0300174",D:"-156.278"}},conversions:{kg:{to:"kg",value:"184.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/063cabc8-b90e-4629-b514-a39dc10f0552?version=20.19.120"},subType:"Generisk data"},{id:"4393e250-0acf-4cd4-b5a8-e01d313ab797",name:"Varmepumpe. jordvarmeslange. 70 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"931.906",C3:"114.808",C4:"0.0300174",D:"-267.738"}},conversions:{kg:{to:"kg",value:"488.9"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/062fc223-898a-42bd-a133-8e0fe95cb7a5?version=20.19.120"},subType:"Generisk data"},{id:"3c567de0-7e5f-4d51-9ede-5a4aa32d9858",name:"Bomuld. økologisk",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-0.553836",C3:"220.182",C4:"-",D:"-0.722834"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/061f0d5b-61f4-476d-9f2e-96f6a6df7786?version=20.19.120"},subType:"Generisk data"},{id:"9f80be0d-e324-4267-95a9-430a3e6b80c4",name:"Affald (forbrænding). kunststof. fjernvarme",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"252.745",C4:"-",D:"-140.543"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/0532424f-838f-4411-b8cc-0e29ad16d64b?version=20.19.120"},subType:"Generisk data"},{id:"6e86bba6-e50e-45dc-902d-a2b74b862ddf",name:"Propan (R290)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.556878",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/03517019-174a-47f4-8f28-01ed77584cb9?version=20.19.120"},subType:"Generisk data"},{id:"8965176d-ed3b-42db-ac08-641f8dabf2ec",name:"Aircondition (direkte fordamper) (per 1 kW)",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"457.792",C3:"303.977",C4:"0.428176",D:"-241.576"}},conversions:{kg:{to:"kg",value:"13.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/02f86799-1fba-4c8e-9820-027e6f2fae0e?version=20.19.120"},subType:"Generisk data"},{id:"1752b740-6928-437c-95a0-769af0dc665b",name:"Overflade. Facademaling. akryl maling",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"148.132",C3:"-",C4:"0.0150055",D:"-0.0101248"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fcf6494c-aad2-4180-b1a2-392cc954ae52?version=20.19.120"},subType:"Generisk data"},{id:"865ee297-40a5-4ed6-96a9-9eb06c3b169b",name:"Skorsten opmuret (1 rør)",description:"-",location:"DE",unit:"m",emission:{gwp:{a1a3:"238.032",C3:"160.914",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"98.3"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/026e073f-83f3-4460-8b03-b748b7c9b597?version=20.19.120"},subType:"Generisk data"},{id:"1b33aad0-030e-4f9f-8543-c73942821d20",name:"Stokerfyr <20 KW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1642.03",C3:"347.892",C4:"180.285",D:"-683.535"}},conversions:{kg:{to:"kg",value:"631"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/022640ea-1bf1-4ba9-82bd-da28d968e658?version=20.19.120"},subType:"Generisk data"},{id:"889b8b3c-bccb-4016-9c08-700d927d535f",name:"Kølemiddel (R404a)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"948.597",C3:"#G1298",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/01ccf18a-a8cf-4da8-8e3d-951a2d136a3a?version=20.19.120"},subType:"Generisk data"},{id:"936880ee-f647-4d31-9a1a-f0106f307558",name:"Beslag til vandrette skydevinduer",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"575.046",C3:"-",C4:"#G0763",D:"#G0763"}},conversions:{kg:{to:"kg",value:"0.696"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/00c28f1f-1d49-4c81-9208-138922a1dd6c?version=20.19.120"},subType:"Generisk data"},{id:"f17ef05a-7fe6-4137-bc8e-1bfc8a56cc79",name:"Tagpap. bitumen toplag. ikke skiferbestrøet",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"535.539",C3:"0",C4:"0.413297",D:"-"}},conversions:{kg:{to:"kg",value:"5.21"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ff9336ea-fb7f-4299-8a40-5e9a28538c85?version=20.20.010"},subType:"Generisk data"},{id:"bee96d2e-a6fa-4a31-89be-78f4c1086a46",name:"Rude (3-lags)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"577.726",C3:"303.476",C4:"0.49109",D:"-140.543"}},conversions:{kg:{to:"kg",value:"30"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fa9f6670-3170-4597-92ab-a2fdec7f1451?version=20.20.010"},subType:"Generisk data"},{id:"f79a4d53-9062-4975-bb69-f893ae89b81e",name:"Gummigulve profileret EN 12199",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"12.884",C3:"13.866",C4:"-",D:"-817.326"}},conversions:{kg:{to:"kg",value:"4.82"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f814e7e2-e438-4ea9-80cc-81254d01aba2?version=20.20.010"},subType:"Generisk data"},{id:"c5b26052-8e72-4390-b4bb-ba11d71d3711",name:"Naturstenplade. blød. gulv",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"149.203",C3:"0.349741",C4:"-",D:"-0.106807"}},conversions:{kg:{to:"kg",value:"52"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ef0d9cbc-4e89-4e78-8cb2-68f02a49b87d?version=20.20.010"},subType:"Generisk data"},{id:"29ad3ccb-6243-4025-8d84-669f943d831f",name:"marmorplade (tykkelse 0.02 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"162.767",C3:"0.381535",C4:"-",D:"-0.106807"}},conversions:{kg:{to:"kg",value:"52"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e9be7506-62ce-45b8-853f-c45c3f82401f?version=20.20.010"},subType:"Generisk data"},{id:"f70a14b1-7ab2-4add-bc31-dcd3c19db506",name:"Naturstenplade. hård. gulv",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"317.513",C3:"0.349741",C4:"-",D:"-0.106807"}},conversions:{kg:{to:"kg",value:"52"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e8db532f-ee15-42a4-89c3-5ef789e1fb8f?version=20.20.010"},subType:"Generisk data"},{id:"c240e1b5-570a-4d4c-9847-f266adddbe13",name:"Kork linoleumsgulv (tykkelse 0.0025 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"360.243",C3:"358.677",C4:"-",D:"-0.350728"}},conversions:{kg:{to:"kg",value:"3.1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e5f97559-bb92-4c23-a722-480da1b559ad?version=20.20.010"},subType:"Generisk data"},{id:"7aacdae8-9e02-4b70-be4a-37677391f147",name:"Loftspanel med mineraluld",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"34.872",C3:"0",C4:"0.0360133",D:"-"}},conversions:{kg:{to:"kg",value:"2.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/def9e058-ac16-489e-9457-db7645404194?version=20.20.010"},subType:"Generisk data"},{id:"aae0fd4d-a0c5-4e3c-b350-31f79d43db06",name:"Undertag. PP-membran",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.407157",C3:"0.333621",C4:"-",D:"-0.164677"}},conversions:{kg:{to:"kg",value:"0.15"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/deb7fe73-3eb8-4f80-937b-7ce3a0a977ed?version=20.20.010"},subType:"Generisk data"},{id:"bd56f0b0-d16b-469e-bf6a-129cec31442d",name:"Gipskartonplade. brandimprægneret",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"154.129",C3:"-",C4:"0.150055",D:"-"}},conversions:{kg:{to:"kg",value:"10"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/da72684f-471c-425b-817d-69f262323f04?version=20.20.010"},subType:"Generisk data"},{id:"8543c7f6-6ccb-4ab2-b052-adb88f066b78",name:"Naturstensplade. udendørsbrug",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"573.544",C3:"139.896",C4:"-",D:"-0.427228"}},conversions:{kg:{to:"kg",value:"208"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/da4b704a-c901-414f-943f-8e1ff0f4566c?version=20.20.010"},subType:"Generisk data"},{id:"210c5acb-868b-4077-a7ea-9fb5e3344d6e",name:"Tagpap. bitumen toplag. skiferbestrøet",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"536.407",C3:"0",C4:"0.491831",D:"-"}},conversions:{kg:{to:"kg",value:"6.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d56bd904-09a0-4d30-bdbe-5d4f892cc12b?version=20.20.010"},subType:"Generisk data"},{id:"6286c076-61bd-4f08-a255-9806b7c8d016",name:"Naturstenplade. hård. facade",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"324.057",C3:"0.524611",C4:"-",D:"-0.160211"}},conversions:{kg:{to:"kg",value:"78"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/cb3f4a56-460c-4a3e-ae43-3e0a9dcb4319?version=20.20.010"},subType:"Generisk data"},{id:"ef07d863-e855-4856-9afe-62dc4879b21e",name:"Net-forstærket dampspærre PET",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.742035",C3:"0.331026",C4:"-",D:"-0.100762"}},conversions:{kg:{to:"kg",value:"0.12"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/bc50a404-ddf0-4f37-b62f-95130786b004?version=20.20.010"},subType:"Generisk data"},{id:"52e6c819-4285-4b9e-b702-02e1fdff3371",name:"Keramikfliser. glaseret",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"617.969",C3:"0.146744",C4:"-",D:"-0.0410796"}},conversions:{kg:{to:"kg",value:"20"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b4a0e610-e038-47d3-b86e-cef013cd7c83?version=20.20.010"},subType:"Generisk data"},{id:"96b81028-538a-404b-8f54-f736eeacaacb",name:"Gips. tørstof (gipskartonplade) (tykkelse 0.025 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"311.901",C3:"-",C4:"0.301611",D:"-"}},conversions:{kg:{to:"kg",value:"20.07"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ab574186-139f-4816-b7c1-d457b1258c7d?version=20.20.010"},subType:"Generisk data"},{id:"8ae7b949-b6ab-409c-8afe-f84a5ca78964",name:"Gips. tørstof (gipsfiberplade) (tykkelse 0.025 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"755.456",C3:"0",C4:"0.361634",D:"-"}},conversions:{kg:{to:"kg",value:"24.07"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a9a79b38-dc2c-4b51-a3cc-cf9fa0d299e7?version=20.20.010"},subType:"Generisk data"},{id:"cedd4aaa-7070-4ec7-a0a9-508ed680496d",name:"PUR-underlag på PET-flis (tykkelse 0.0005 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"106.631",C3:"0.54176",C4:"-",D:"-0.192588"}},conversions:{kg:{to:"kg",value:"0.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/a92bd5a5-7cef-4050-8659-20a8d5a7a72b?version=20.20.010"},subType:"Generisk data"},{id:"3b988338-d81a-4c62-a43c-5bad58ea70f3",name:"Dampspærre PE (tykkelse 0.0002 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.399404",C3:"0.555951",C4:"-",D:"-0.274462"}},conversions:{kg:{to:"kg",value:"0.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/99792cbc-c5f4-4d2d-bc9e-3790509891a0?version=20.20.010"},subType:"Generisk data"},{id:"115b7a43-9133-437c-a25b-b28a16e36c8c",name:"Skifer",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"150.386",C3:"0.201774",C4:"-",D:"-0.0616194"}},conversions:{kg:{to:"kg",value:"30"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/9049a94f-a527-4d87-a4b9-5a3a56f5ea19?version=20.20.010"},subType:"Generisk data"},{id:"ae50ca64-06a3-4a1e-a35f-fe05bd6c8c0e",name:"Folie til grønt tag",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"354.926",C3:"495.155",C4:"-",D:"-100.535"}},conversions:{kg:{to:"kg",value:"1.13"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8a37ac61-585c-43a8-9773-10fce30096e4?version=20.20.010"},subType:"Generisk data"},{id:"d93857c6-73bd-48a5-9203-e67dfe0c4701",name:"Trægulv. stavparket. 22 mm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-150.494",C3:"236.049",C4:"-",D:"-636.585"}},conversions:{kg:{to:"kg",value:"11.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/88619ce6-c0aa-43bd-9ac6-477b5d6ce442?version=20.20.010"},subType:"Generisk data"},{id:"03d8376e-b372-4630-9bb2-a6cb85cb5df1",name:"Dampspærre. bitumen",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"20.393",C3:"0",C4:"0.396638",D:"-"}},conversions:{kg:{to:"kg",value:"5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/73d1c1b7-d509-44c8-8518-848babdd7c01?version=20.20.010"},subType:"Generisk data"},{id:"98c98a60-a57a-406c-af5b-6ef215814724",name:"Gipsfiberplade 10 mm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"318.612",C3:"0",C4:"0.150055",D:"-"}},conversions:{kg:{to:"kg",value:"10"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6d535792-4351-4d7d-97c6-6d2c3624f3e0?version=20.20.010"},subType:"Generisk data"},{id:"5e5cb68c-a237-4e3c-bed5-abd50c6739da",name:"Lerplade (tykkelse 0.02 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.0530942",C3:"0.0436552",C4:"-",D:"-0.0205632"}},conversions:{kg:{to:"kg",value:"14"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6aff7a60-d7cd-430e-8b15-02556b6f62ff?version=20.20.010"},subType:"Generisk data"},{id:"3ce18a0c-bb2d-410c-be6d-7b279601a38e",name:"Undertag. fiberarmeret PE-membran",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"0.425628",C3:"0.315442",C4:"-",D:"-0.14272"}},conversions:{kg:{to:"kg",value:"0.14"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/66a90b47-27b8-46ce-830e-8ed22f4165d8?version=20.20.010"},subType:"Generisk data"},{id:"95ab4bd4-0c7c-4709-bb45-5a61c380a0da",name:"Tagpap. bitumen undermembran",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"24.749",C3:"0",C4:"0.396638",D:"-"}},conversions:{kg:{to:"kg",value:"5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/64da45fc-f415-4875-8a4e-7c23fe7a7aa9?version=20.20.010"},subType:"Generisk data"},{id:"90f9719e-3a6e-434f-a9ec-03369ffa86ef",name:"Linoleum gulvbelægning (tykkelse 0.0025 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-324.756",C3:"35.866",C4:"-",D:"-0.444446"}},conversions:{kg:{to:"kg",value:"3"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/56e977b3-d042-4843-b40d-3a33dbb5a555?version=20.20.010"},subType:"Generisk data"},{id:"108c6fd2-72bd-4e98-b579-822fff206fc3",name:"Tagmembran. PVC",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"607.292",C3:"493.032",C4:"-",D:"-100.091"}},conversions:{kg:{to:"kg",value:"1.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4f4e989b-bd5e-4d85-9a50-53f3c61eea70?version=20.20.010"},subType:"Generisk data"},{id:"74ba310b-a989-4e6e-986a-d843dc8b5331",name:"Korkfliser 8 mm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-608.412",C3:"638.655",C4:"-",D:"-0.665479"}},conversions:{kg:{to:"kg",value:"3.6"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4e2c6692-148d-4311-b0cf-f0f174002d9e?version=20.20.010"},subType:"Generisk data"},{id:"94454a3a-18c5-4bc5-a600-0fdab08f647f",name:"Fugtisolering. grundmursplade. PE",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"408.909",C3:"414.532",C4:"-",D:"-20.467"}},conversions:{kg:{to:"kg",value:"1.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/49b4cbe9-ac63-4811-a1c7-dd7278db8ac0?version=20.20.010"},subType:"Generisk data"},{id:"bd47a819-bf05-4bd5-a009-e7e2e31a270a",name:"Parket. flerlag (tykkelse 0.01 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-445.326",C3:"118.038",C4:"-",D:"-231.635"}},conversions:{kg:{to:"kg",value:"6.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3b66b7be-bc1e-4dd4-8779-453d4f81825f?version=20.20.010"},subType:"Generisk data"},{id:"c668631a-c4d6-438e-829b-825e0b3592fb",name:"Korkfliser 6 mm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-456.492",C3:"484.491",C4:"-",D:"-0.544943"}},conversions:{kg:{to:"kg",value:"2.7"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/38babeb7-2b2f-42e2-9270-0daac46ebe07?version=20.20.010"},subType:"Generisk data"},{id:"b28ebad6-c133-4e2f-9e9d-67b6edf3ef5f",name:"Gips. vægplade (tykkelse 0.1 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"223.539",C3:"-",C4:"126.047",D:"-"}},conversions:{kg:{to:"kg",value:"84"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/38a8d707-0c7f-4d91-a3db-9b5b2c9bb147?version=20.20.010"},subType:"Generisk data"},{id:"22e40fd9-bbc3-4948-b7d4-979e041e10db",name:"Korkfliser 4 mm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-304.279",C3:"321.527",C4:"-",D:"-0.351073"}},conversions:{kg:{to:"kg",value:"1.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/360cbe6a-bd01-4660-bd08-f7d3eb3d8b79?version=20.20.010"},subType:"Generisk data"},{id:"7a8be224-e7cc-41c9-9958-3cbd4f45dd15",name:"Tagfolie EPDm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"859.954",C3:"679.964",C4:"-",D:"-339.139"}},conversions:{kg:{to:"kg",value:"2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/341e2e42-dab2-427b-86f6-a80c701b6071?version=20.20.010"},subType:"Generisk data"},{id:"a42fa185-fddf-408e-8cc0-dca304123b3d",name:"Gipskartonplade 13 mm. imprægneret",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"162.283",C3:"-",C4:"0.150055",D:"-"}},conversions:{kg:{to:"kg",value:"10"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/07423e99-8c7c-4e93-8311-dcf7ae85c41d?version=20.20.010"},subType:"Generisk data"},{id:"3ea68eeb-78dc-4c6c-9571-09a5e13d82de",name:"Halm",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-127",C3:"0",C4:"134",D:"0"}},conversions:{kg:{to:"kg",value:"100"}},source:{url:"https://www.oekobaudat.de/OEKOBAU.DAT/datasetdetail/process.xhtml?uuid=d2d1b29f-8dd7-4373-ab2a-de57acd51e72&version=00.00.029"},subType:"Generisk data"},{id:"e9ab52ae-4a3c-4141-92a5-aed1b7bdba1a",name:"Ovenlyskuppel. plast (komplet ovenlys)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"45.7",C3:"42.5",C4:"0.18",D:"-37.1"}},conversions:{kg:{to:"kg",value:"35.2"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2bf377b2-7923-4e05-b7a0-3c02e63d3476?version=00.00.007"},subType:"Generisk data"},{id:"ee318ec7-12d9-4e85-8f31-7dbfaeec8941",name:"Rytterlys. plast/aluminium (komplet vindue)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"84.7",C3:"10.6",C4:"0.0495",D:"-68.6"}},conversions:{kg:{to:"kg",value:"18.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/da649461-9a6f-49c9-aa2e-5d91b1969328?version=00.00.003"},subType:"Generisk data"},{id:"166876af-f942-4382-9535-c85dc5b6a0a4",name:"Fladtagsvindue. plast (komplet vindue)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"226",C3:"15.1",C4:"0.21",D:"-148"}},conversions:{kg:{to:"kg",value:"72.1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/966b0795-c7e3-4f23-86ba-55c4aa8fb5ff?version=00.00.004"},subType:"Generisk data"},{id:"3b07c284-6fd3-4946-ac53-615e5942054f",name:"Glastag. aluminium (komplet vindue)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"232",C3:"10.6",C4:"0.12",D:"-77.4"}},conversions:{kg:{to:"kg",value:"61.8"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f4e70d32-54be-4de5-9771-855e038b9133?version=00.00.005"},subType:"Generisk data"},{id:"69619293-6feb-4566-9738-841a51665bf3",name:"Dør. alu. hoveddør",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"163.382",C3:"105.204",C4:"0.117048",D:"-925.086"}},conversions:{kg:{to:"kg",value:"47"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4d22a515-cfcc-4bcb-bbf9-a6e647bed9ab?version=00.00.007"},subType:"Generisk data"},{id:"9ee8d7d8-8400-441e-8a33-a4475f20820e",name:"Dør. alu. røgdør",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"157.17",C3:"0.866486",C4:"0.238074",D:"-702.062"}},conversions:{kg:{to:"kg",value:"41"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8526239b-fa75-4b15-b4d5-790f1a15bba6?version=00.00.009"},subType:"Generisk data"},{id:"c62c0ecb-cf1f-4fd9-b409-c7de3ac751a0",name:"Dør. alu. T30/EI30",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"221.423",C3:"0.927273",C4:"0.389603",D:"-740.761"}},conversions:{kg:{to:"kg",value:"55"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b9c08cf4-c6ad-4f12-bd5a-524c5a10ef51?version=00.00.008"},subType:"Generisk data"},{id:"238b7cca-1316-489a-b724-3a056dcf62d3",name:"Dør. alu. T90/EI90",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"351.666",C3:"0.927262",C4:"0.863448",D:"-847.245"}},conversions:{kg:{to:"kg",value:"101"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/34a3f341-4af5-4ad4-9e17-6ff9b0713dfc?version=00.01.007"},subType:"Generisk data"},{id:"c04df3b4-b9c7-4abf-8da8-6b95e45864a1",name:"Dør. industriport",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"263.69",C3:"0.0519",C4:"5.71",D:"-121.04"}},conversions:{kg:{to:"kg",value:"88.54"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/81f26749-0b39-4eb5-9015-bbebae3c7413?version=00.00.008"},subType:"Generisk data"},{id:"8f00269a-cfc0-4342-b26e-f3c3b2bab602",name:"Dør. stål. indv/udv/brand/røg mv",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"135.75",C3:"0.0578",C4:"1.72",D:"-63.02"}},conversions:{kg:{to:"kg",value:"44.1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/24f9f8e0-423c-4fe3-a16a-7b93efae9421?version=00.02.004"},subType:"Generisk data"},{id:"3fd560e6-0963-4788-a619-432e5b01523b",name:"mineraluld. alm.",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"403.055",C3:"0.72123",C4:"0.399579",D:"-"}},conversions:{kg:{to:"kg",value:"26.25"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/fafd5743-0b42-4614-8e3d-5c4eacdfba98?version=20.20.020"},subType:"Generisk data"},{id:"80147761-92cd-4c8a-a4ed-7bb17c469056",name:"mineraluld. facadesystem",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"703.915",C3:"126.969",C4:"0.703441",D:"-"}},conversions:{kg:{to:"kg",value:"46.25"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/f8afef87-5de3-4996-838c-1f2af9ef81df?version=20.20.020"},subType:"Generisk data"},{id:"d3f3709c-4eee-4064-964a-002a3f4d05a4",name:"ETICS limning og mineralsk puds (Kratzputz)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"98.439",C3:"0",C4:"0.527835",D:"-"}},conversions:{kg:{to:"kg",value:"35.18"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e5cd5727-a516-4081-8fdf-4fc0ce142d90?version=20.20.020"},subType:"Generisk data"},{id:"cf3082bd-125b-4c3a-8e18-c0e4d26d4362",name:"Smeltekammergranulat",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/d895bdb7-0dff-457e-9ad2-45662fc227f5?version=20.20.020"},subType:"Generisk data"},{id:"8188de64-5ca7-43e1-801e-8b78bf5f591e",name:"ETICS-limning og belægning af silikatdispersionspuds",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"548.029",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"12.48"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/94ef6ac0-956a-4d60-9062-990df91e7917?version=20.20.020"},subType:"Generisk data"},{id:"591ae5dc-a5c6-4194-af9f-13924bd3586f",name:"Pimpsten (SFK-4)",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"780.446",C3:"66.035",C4:"-",D:"-184.858"}},conversions:{kg:{to:"kg",value:"900"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/8f44840b-28ae-418b-bf12-fcac5b7c68b3?version=20.20.020"},subType:"Generisk data"},{id:"78ffebad-f1cc-44e2-a470-d1cf4f99a1d4",name:"ETICS-limning og belægning af syntetisk harpikspuds",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"670.288",C3:"0",C4:"0.187209",D:"-"}},conversions:{kg:{to:"kg",value:"12.48"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/88cc57f7-384d-47a3-826a-e4fce57a32bd?version=20.20.020"},subType:"Generisk data"},{id:"eaca794e-47d3-4358-b097-7bc07de2eee4",name:"mineraluld. skråtag",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"465.164",C3:"0.783207",C4:"0.455523",D:"-"}},conversions:{kg:{to:"kg",value:"30"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/86380db6-3062-4d40-826d-732c24ed3cad?version=20.20.020"},subType:"Generisk data"},{id:"168bfc43-bc80-413b-8871-b5f4bd89ac23",name:"ETICS limning og mineralsk letpuds",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"473.572",C3:"0",C4:"0.168362",D:"-"}},conversions:{kg:{to:"kg",value:"11.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6108c144-5112-4f18-bcb1-d1ff8eb831a6?version=20.20.020"},subType:"Generisk data"},{id:"a6e05669-d932-41d5-af63-30f084daaa71",name:"ETICS limning og mineralsk puds (Dekorputz)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"733.681",C3:"0",C4:"0.258395",D:"-"}},conversions:{kg:{to:"kg",value:"17.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/49fe2b06-ea9c-4cef-b0a1-a75fd1ed6bf8?version=20.20.020"},subType:"Generisk data"},{id:"193c0f30-3321-4de9-af1d-93214bbf672e",name:"mineraluld. trykfast til tagsystem",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"209.503",C3:"397.636",C4:"2.203",D:"-"}},conversions:{kg:{to:"kg",value:"145"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/4477c6ca-b728-41fb-a231-366e159a73df?version=20.20.020"},subType:"Generisk data"},{id:"d1a5787a-0d70-48e7-96f3-97de2859f893",name:"Ekspanderet Ler. sand",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"0.338274",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/3749834e-307f-4cb2-b903-4ef4bd463446?version=20.20.020"},subType:"Generisk data"},{id:"5d68608e-2373-49f5-b053-b0514ba02f1d",name:"mineraluld. terræn",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"133.91",C3:"233.097",C4:"129.141",D:"-"}},conversions:{kg:{to:"kg",value:"85"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/2691d6e4-a41e-40d7-92ca-680f8785fc1d?version=20.20.020"},subType:"Generisk data"},{id:"55aaea50-9ca0-4c3c-91a5-499aa3831e2b",name:"ETICS limning og silikonepuds",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"548.029",C3:"0",C4:"0.187209",D:"-"}},conversions:{kg:{to:"kg",value:"12.3"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1b84e630-6489-493e-a066-1b976684dd03?version=20.20.020"},subType:"Generisk data"},{id:"6f49231a-34e9-4ad0-93a4-cc121349478f",name:"OSB-plade",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-572.706",C3:"#G0810",C4:"-",D:"#G0810"}},conversions:{kg:{to:"kg",value:"600"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e71b8242-eda8-408a-9ff8-37cd28896b4a?version=01.02.000"},subType:"Generisk data"},{id:"f30d4cba-0b8b-4c4a-993c-b9c6fed87a4e",name:"Spånplade. melaminbelagt",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-691.465",C3:"#G0810",C4:"-",D:"#G0810"}},conversions:{kg:{to:"kg",value:"633.29"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/c56b1971-bdde-41b5-b139-9daed5baca91?version=00.02.000"},subType:"Generisk data"},{id:"8514ce21-a7c2-436d-814b-010590c725ca",name:"Parket i massivt træ",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-120.662",C3:"#G0765",C4:"-",D:"#G0765"}},conversions:{kg:{to:"kg",value:"11.71"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/1e86515c-3d07-4c59-8f81-84cc5fe0fca7?version=00.02.000"},subType:"Generisk data"},{id:"79b22748-baa7-424c-8121-8c94ecb12606",name:"Træfiberplade. høj densitet. HDF",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-854.246",C3:"#G0810",C4:"-",D:"#G0810"}},conversions:{kg:{to:"kg",value:"849.92"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/6e578da4-f52f-440c-87b9-a4ba2344b426?version=00.02.000"},subType:"Generisk data"},{id:"ed3efe91-4a13-4467-aef2-9718f42beb1c",name:"Træfiberplade. medium densitet. mDF",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-726.358",C3:"#G0810",C4:"-",D:"#G0810"}},conversions:{kg:{to:"kg",value:"737.5"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/e5141109-efd6-4fbc-a850-53a48ad30f18?version=00.02.000"},subType:"Generisk data"},{id:"23300d73-6cd0-4208-a831-b44acc3f0ce7",name:"Tom affaldsproces",description:"-",location:"DK",unit:"kg",emission:{gwp:{a1a3:"-",C3:"0",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"-"},subType:"Generisk data"},{id:"18a302c7-67a0-403e-b5c3-761dea9949b2",name:"Silikatmaling (indendørs)",description:"-",location:"DK",unit:"kg",emission:{gwp:{a1a3:"0.955",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.epddanmark.dk/media/1035/md-keim-farver-18012-en.pdf"},subType:"Generisk data"},{id:"ff0ff4e4-387a-41c4-8db5-6b9292e96304",name:"Silikatmaling (udendørs)",description:"-",location:"DK",unit:"kg",emission:{gwp:{a1a3:"1.2",C3:"#G0789",C4:"-",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.epddanmark.dk/media/1036/md-keim-farver-18013-en.pdf"},subType:"Generisk data"},{id:"41c5a2ca-ad17-41ac-8161-082031d251a4",name:"Laminatgulv 8 mm",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-5.272",C3:"13.5",C4:"-",D:"-3.649"}},conversions:{kg:{to:"kg",value:"7.45"}},source:{url:"https://www.oekobaudat.de/OEKOBAU.DAT/datasetdetail/process.xhtml?uuid=8f764a39-2539-4510-8c0a-ab5d67fbb59b&stock=OBD_2020_II&lang=de"},subType:"Generisk data"},{id:"1e664221-ba13-4473-a49a-7ce3fdcbbe50",name:"Oliekedel. lav temperatur. kondenserende. < 20 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"891.1",C3:"26.61",C4:"1.803",D:"-223.6"}},conversions:{kg:{to:"kg",value:"162"}},source:{url:"https://oekobaudat.de/OEKOBAU.DAT/datasetdetail/process.xhtml?uuid=0c44c3ec-2984-4985-995c-90a4881505a0&version=20.19.120"},subType:"Generisk data"},{id:"8778c40c-7186-490f-8ecf-9cac56c85978",name:"Oliekedel. lav temperatur. kondenserende. 20-120 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"1755",C3:"72.67",C4:"1.803",D:"-610.8"}},conversions:{kg:{to:"kg",value:"439"}},source:{url:"https://oekobaudat.de/OEKOBAU.DAT/datasetdetail/productFlow.xhtml?uuid=f556eb88-ea53-403c-bda4-c38de1855844&version=39.00.000"},subType:"Generisk data"},{id:"dfeb410e-d578-4a79-9dc2-f1915b1b3bc4",name:"Oliekedel. lav temperatur. kondenserende. 120-400 kW",description:"-",location:"DE",unit:"pcs",emission:{gwp:{a1a3:"5075",C3:"249.5",C4:"1.803",D:"-2099"}},conversions:{kg:{to:"kg",value:"1504"}},source:{url:"https://oekobaudat.de/OEKOBAU.DAT/datasetdetail/process.xhtml?uuid=e88588a0-0974-4214-86bd-dcbf5caf656a&version=20.19.120"},subType:"Generisk data"},{id:"73f98b61-f707-4449-bfd4-f4492f9a0432",name:"Affald. byggeaffald. deponering (ikke glas)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"-",C4:"0.0136414",D:"-"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b7cacb37-7945-4518-be5a-bf7df7edf5c2?version=20.19.120"},subType:"Generisk data"},{id:"b83121d4-578b-47d6-b256-3bbd967a0cf6",name:"Affald. stenuld høj densitet",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-",C3:"-",C4:"2.46",D:"-5.42"}},conversions:{kg:{to:"kg",value:"155"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/b0e3aedd-a5e2-4b97-b0f3-e51548912687?version=00.06.000"},subType:"Generisk data"},{id:"09ad8491-0561-437a-83f8-10dacf5f4818",name:"Affald. stenuld lav densitet",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-",C3:"-",C4:"0.62",D:"-1.36"}},conversions:{kg:{to:"kg",value:"39"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/ec17f51c-27ff-4729-977e-cd0e273c2ee3?version=00.03.000"},subType:"Generisk data"},{id:"7b5dfc52-f6c5-467a-916b-c10986b1c945",name:"Affald. stenuld middel densitet",description:"-",location:"DE",unit:"m3",emission:{gwp:{a1a3:"-",C3:"-",C4:"1.52",D:"-3.36"}},conversions:{kg:{to:"kg",value:"96"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/eca9691f-06d7-48a7-94a9-ea808e2d67e8?version=00.06.000"},subType:"Generisk data"},{id:"6bc215cd-ca97-4bb9-bac1-cc57e9da3349",name:"Affald (forbrænding). tekstil. fjernvarme",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"173.941",C4:"-",D:"-0.826165"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/97505f38-cf73-475a-a8d8-cc2db219565b?version=20.19.120"},subType:"Generisk data"},{id:"9d2c2c01-1548-4efd-960b-ebb542ee7f7f",name:"Affald (forbrænding). polystyren (PS). fjernvarme",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"337.892",C4:"-",D:"-154.693"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/56d90d2e-11c8-4b49-bc6c-c61f682d0be1?version=20.19.120"},subType:"Generisk data"},{id:"948d76d5-9045-4bba-88e9-ffbddfd933a8",name:"Tæppe gulvbelægning (tykkelse 0.006 m)",description:"-",location:"DE",unit:"m2",emission:{gwp:{a1a3:"-",C3:"404.533",C4:"-",D:"-160.441"}},conversions:{kg:{to:"kg",value:"1.4"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/76ab64f6-6d08-4b67-8cd7-13d26e68d95a?version=20.20.010"},subType:"Generisk data"},{id:"9fc344c7-917b-4fff-a0b1-7cc02610a378",name:"Kobberrør (blank)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"0.00136414",C4:"-",D:"-114.005"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/55e5f6b9-224f-4938-8ae7-5495fade6f19?version=20.19.120"},subType:"Generisk data"},{id:"80d7da2f-96ba-405a-a4bc-dd65e5c4b87f",name:"Kobberrør (coatede)",description:"-",location:"DE",unit:"kg",emission:{gwp:{a1a3:"-",C3:"0.00136414",C4:"-",D:"-140.501"}},conversions:{kg:{to:"kg",value:"1"}},source:{url:"http://www.oekobaudat.de/OEKOBAU.DAT/resource/processes/5c82c3cf-7c88-441f-b430-a815501d06e1?version=20.19.120"},subType:"Generisk data"},{id:"22b566ec-1930-405d-9dde-b2dbcc1be0fb",name:"Enfamiliehuse. afløb",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.00863",C3:"0.01137",C4:"-",D:"-0.00562"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi"},{id:"bec44243-61de-4465-9450-e2ff6f352cf7",name:"Enfamiliehuse. vand",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.04831",C3:"0.01169",C4:"-",D:"-0.0294"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi"},{id:"44b5a12d-11f0-4b82-9ad1-cf2796abeb79",name:"Enfamiliehuse. varme. ventilation og køl",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.49399",C3:"0.10567",C4:"0.00034",D:"-0.1975"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi"},{id:"98569cdf-0635-48df-8ca6-f1230292e399",name:"Rækkehuse. afløb",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.0414",C3:"0.0486",C4:"-",D:"-0.0205"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi"},{id:"35829214-e46b-4037-8374-2a2e69a5371b",name:"Rækkehuse. vand",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.0244",C3:"0.0156",C4:"-",D:"-0.0123"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi"},{id:"dd14f056-57dd-4a71-9dbb-cb5aa7c0a9cb",name:"Rækkehuse. varme. ventilation og køl",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.44844",C3:"0.0641",C4:"0.00027",D:"-0.2035"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Wood Link Standard"}},{id:"31652caa-6b04-4b39-86e6-482b4bd26416",name:"Etageboliger. afløb",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.054",C3:"0.066",C4:"-",D:"-0.0324"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Wood Facade Link Standard"}},{id:"4d0ef38d-b47e-4d10-be49-d8c24a6ebfe2",name:"Etageboliger. vand",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.0522",C3:"0.0078",C4:"-",D:"-0.0282"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Windows Link Standard"}},{id:"c9eb9a0e-372d-47dc-8428-13bb0697b3b7",name:"Etageboliger.varme. ventilation og køl",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.4335",C3:"0.0765",C4:"-",D:"-0.1683"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Steel Link Standard"}},{id:"d9cab14f-d708-49d4-9605-810a69b96eb1",name:"Kontor. skoler og daginstitutioner. afløb",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.018",C3:"0.022",C4:"-",D:"-0.0108"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Roof Link Standard"}},{id:"89e2c27d-e240-4b17-b590-e61701f653dd",name:"Kontor. skoler og daginstitutioner. vand",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.048",C3:"0.012",C4:"-",D:"-0.0192"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Metal Facades Link Standard"}},{id:"fce38f39-ff71-4a3b-9050-c64f37803d2d",name:"Kontor. skoler og daginstitutioner. varme. ventilation og køl",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.7224",C3:"0.1176",C4:"-",D:"-0.3528"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Gypsum Link Standard"}},{id:"00fb66f3-39e7-437a-86dc-a355fbbf248e",name:"Øvrige bygninger. afløb",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.0225",C3:"0.0275",C4:"-",D:"-0.0135"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Floor Link Standard"}},{id:"cc8a21ec-1813-4055-a108-2be8a3f07fa6",name:"Øvrige bygninger. vand",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.064",C3:"0.016",C4:"-",D:"-0.0256"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Concrete Link Standard"}},{id:"1383f0f9-d75c-4372-b690-5e44779f1618",name:"Øvrige bygninger. varme. ventilation og køl",description:"-",location:"DK",unit:"-",emission:{gwp:{a1a3:"0.9374",C3:"0.1526",C4:"-",D:"-0.4578"}},conversions:{kg:{to:"kg",value:"-"}},source:{url:"-"},subType:"Standardværdi",metaData:{Collection:"Bricks Link Standard"}}],Tl=h0({id:"materialStore",state:()=>({materials:[],assemblies:[],currentMapping:null,currentAssemby:null,sorting:{parameter:"name",direction:"asc"},EPDMode:!0,EPDList:[],assemblyList:[],paramFilters:{matParam:[],subParam:[],unitParam:[]},sortingParameters:[{filterName:"name",displayName:"Name",paramName:null},{filterName:"subType",displayName:"EPD Type",paramName:"subParam"},{filterName:"materialType",displayName:"Material Type",paramName:"matParam"},{filterName:"declared_unit",displayName:"Declared Unit",paramName:"unitParam"}],mapping:null}),actions:{addMaterial(t){this.materials.push(t),this.updateParameters()},addMaterialList(t){this.materials=t,this.updateParameters()},removeMaterial(t){const e=this.materials.indexOf(t);e!==-1&&this.materials.splice(e,1)},addAssembly(t){const e=this.assemblies.findIndex(n=>n.id===t.id);e!==-1?this.assemblies[e]=t:this.assemblies.push(t)},removeAssembly(t){const e=this.assemblies.indexOf(t);e!==-1&&this.assemblies.splice(e,1)},setCurrentMapping(t){this.currentMapping=t},setCurrentAssembly(t){this.currentAssemby=t},setFilteredMaterials(t){this.EPDList=t},getCurrentMapping(){return this.mapping},async materialsFromJson(){try{this.materials=rUe.map(t=>{var e;return{...t,metaData:{materialType:t.materialType,Collection:((e=t==null?void 0:t.metaData)==null?void 0:e.Collection)??"-"},source:vT.LCAbyg}}),this.EPDList=this.materials,this.updateParameters()}catch(t){console.error("Error fetching JSON:",t)}},updateParameters(){const t=Array.from(new Set(this.materials.map(n=>{var r;return(r=n.metaData)==null?void 0:r.materialType}))).filter(Boolean),e=Array.from(new Set(this.materials.map(n=>n.unit))).filter(Boolean);this.paramFilters.matParam=t.map(n=>({name:n,selected:!1,filterParamter:"metaData.materialType"})),this.paramFilters.unitParam=e.map(n=>({name:n,selected:!1,filterParamter:"unit"}))},setSorting(t,e){const n={parameter:t,direction:e};this.sorting=n,this.sortList()},triggerParamSort(){if(this.EPDMode===!0){this.EPDList=this.materials,this.sortList();for(const t in this.paramFilters)if(this.paramFilters[t].some(e=>e.selected))this.EPDList=dte(this.EPDList,this.paramFilters[t]);else continue}else this.assemblyList=this.assemblyList.filter(t=>Object.values(t.products).some(e=>{for(const n in this.paramFilters){if(!this.paramFilters[n].some(i=>i.selected))continue;if(dte([e],this.paramFilters[n]).length>0)return!0}return!1}))},resetSorting(){this.sorting={parameter:"name",direction:"asc"}},sortList(){const{parameter:t,direction:e}=this.sorting;this.EPDList.sort((n,r)=>n[t]r[t]?e==="asc"?1:-1:0)},setMapping(t){this.mapping=t},updateMappingMaterial(t,e){this.mapping||(this.mapping={id:crypto.randomUUID(),name:"temp",filters:[],steps:[]});const n=this.mapping.steps.findIndex(r=>r.nestedGroupId===t);n!==-1&&(this.mapping.steps[n].material=e)},removeMappingMaterial(t){const e=this.mapping.steps.findIndex(n=>n.nestedGroupId===t);e!==-1&&this.mapping.steps.splice(e,1)},addStep(t,e,n){var r;(r=this.mapping)==null||r.steps.push({filterId:n,nestedGroupId:t.id,material:e})}}}),iUe=` query { user { name @@ -81,7 +81,7 @@ ${e.map((i,s)=>`${(s===0?"---> ":J9e(" ",5+s*2))+(Array.isArray(i)?`${nx(i[0])}. name company } - }`,iUe=` + }`,sUe=` query($id: String!) { stream(id: $id){ name @@ -101,7 +101,7 @@ ${e.map((i,s)=>`${(s===0?"---> ":J9e(" ",5+s*2))+(Array.isArray(i)?`${nx(i[0])}. } } } - }`,sUe=`query { + }`,aUe=`query { streams(limit: 10){ cursor totalCount @@ -113,7 +113,7 @@ ${e.map((i,s)=>`${(s===0?"---> ":J9e(" ",5+s*2))+(Array.isArray(i)?`${nx(i[0])}. updatedAt } } -}`,aUe=`query($projectId: String!) { +}`,oUe=`query($projectId: String!) { project(id: $projectId) { models { items { @@ -122,7 +122,7 @@ ${e.map((i,s)=>`${(s===0?"---> ":J9e(" ",5+s*2))+(Array.isArray(i)?`${nx(i[0])}. } } } -`,oUe=`query Stream($streamId: String!, $objectId: String!, $select: [String]) { +`,lUe=`query Stream($streamId: String!, $objectId: String!, $select: [String]) { stream(id: $streamId) { object(id: $objectId) { totalChildrenCount @@ -134,15 +134,15 @@ ${e.map((i,s)=>`${(s===0?"---> ":J9e(" ",5+s*2))+(Array.isArray(i)?`${nx(i[0])}. } } } -}`;function lUe(t){const e=[];return e.push(...uUe),t.includes("Archicad")&&e.push(...cUe),t.includes("Revit")&&e.push(...dUe),t.includes("IFC")&&e.push(...fUe),t.includes("Rhino")&&t.includes("Grasshopper")&&e.push(...hUe),e}const uUe=["name","speckleType","height","width","level"],cUe=["elementType","area","volume","number","sideMaterialName","oppositeMaterialName","referenceMaterialName","botMat","topMat","sideMat","buildingMaterialName","classifications"],dUe=["type","family","category","parameters.HOST_AREA_COMPUTED.value","parameters.HOST_VOLUME_COMPUTED.value"],fUe=["Name","GlobalId","Type","BIP","Tag"],hUe=["area","provenance","volume"],uK="SpeckLCA",cK=`${uK}.AuthToken`,Rue=`${uK}.RefreshToken`,bL=`${uK}.Challenge`;function pUe(){const t=Nr(),e=Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15);localStorage.setItem(bL,e),window.location.href=`${t.keySettings.speckleConfig.serverUrl}/authn/verify/${t.keySettings.speckleConfig.id}/${e}`}function mUe(){localStorage.removeItem(cK),localStorage.removeItem(Rue)}async function vUe(t){const e=Nr(),r=await(await fetch(`${e.keySettings.speckleConfig.serverUrl}/auth/token/`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({accessCode:t,appId:e.keySettings.speckleConfig.id,appSecret:e.keySettings.speckleConfig.secret,challenge:localStorage.getItem(bL)})})).json();return r.token&&(localStorage.removeItem(bL),localStorage.setItem(cK,r.token),localStorage.setItem(Rue,r.refreshToken)),r}async function gT(t,e){const n=Nr(),r=localStorage.getItem(cK);if(r)try{return await(await fetch(`${n.keySettings.speckleConfig.serverUrl}/graphql`,{method:"POST",headers:{Authorization:"Bearer "+r,"Content-Type":"application/json"},body:JSON.stringify({query:t,variables:e||null})})).json()}catch(i){const s="API call failed!";return lze(i),console.error(s,i),Promise.reject(s)}else return Promise.reject("You are not logged in. (Token does not exist.)")}const gUe=()=>gT(rUe);function bUe(t,e,n){return gT(iUe,{id:t,cursor:n,limit:e})}function yUe(){return gT(sUe)}function SUe(t){return gT(aUe,{projectId:t})}async function xUe(t,e,n){const r=lUe(n);return await gT(oUe,{streamId:t,objectId:e,selection:r})}function TUe(t){const e=go(),r=t.data.stream.object.elements.objects.filter(a=>a.data.speckle_type!=="Speckle.Core.Models.DataChunk"),i=e.getProjectDetails,s=e.getSelectedVersion;if(i&&s){const a=[];return r.forEach(l=>{const u=wUe(l),c=l.data.name?l.data.name:l.data.speckle_type,d={id:l.id,name:c,quantity:u,parameters:l.data,URI:l.id};a.push(d)}),{name:i.stream.name,id:i.stream.id,description:s.message,geometry:a}}return null}function wUe(t){const e={m2:0},n=[{searchValue:"area",metric:"m2",mmConversion:1e6},{searchValue:"volume",metric:"m3",mmConversion:1e9},{searchValue:"length",metric:"m",mmConversion:1e3}],r=(i,s)=>{for(const a in i)if(Object.prototype.hasOwnProperty.call(i,a)){if(typeof i[a]=="object"&&i[a]!==null)r(i[a],s);else if(typeof i[a]=="string"&&i[a].toLowerCase()==s.searchValue){let o=i[a];typeof o=="string"&&(o=i.value),e[s.metric]=o}else if(a==s.searchValue){let o=i[a];typeof o=="string"&&(o=i.value),i.units=="mm"&&(o=o/s.mmConversion),e[s.metric]=o}}};return t.data&&n.forEach(i=>{r(t.data,i)}),e}/** +}`;function uUe(t){const e=[];return e.push(...cUe),t.includes("Archicad")&&e.push(...dUe),t.includes("Revit")&&e.push(...fUe),t.includes("IFC")&&e.push(...hUe),t.includes("Rhino")&&t.includes("Grasshopper")&&e.push(...pUe),e}const cUe=["name","speckleType","height","width","level"],dUe=["elementType","area","volume","number","sideMaterialName","oppositeMaterialName","referenceMaterialName","botMat","topMat","sideMat","buildingMaterialName","classifications"],fUe=["type","family","category","parameters.HOST_AREA_COMPUTED.value","parameters.HOST_VOLUME_COMPUTED.value"],hUe=["Name","GlobalId","Type","BIP","Tag"],pUe=["area","provenance","volume"],cK="SpeckLCA",dK=`${cK}.AuthToken`,Pue=`${cK}.RefreshToken`,bL=`${cK}.Challenge`;function mUe(){const t=Nr(),e=Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15);localStorage.setItem(bL,e),window.location.href=`${t.keySettings.speckleConfig.serverUrl}/authn/verify/${t.keySettings.speckleConfig.id}/${e}`}function vUe(){localStorage.removeItem(dK),localStorage.removeItem(Pue)}async function gUe(t){const e=Nr(),r=await(await fetch(`${e.keySettings.speckleConfig.serverUrl}/auth/token/`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({accessCode:t,appId:e.keySettings.speckleConfig.id,appSecret:e.keySettings.speckleConfig.secret,challenge:localStorage.getItem(bL)})})).json();return r.token&&(localStorage.removeItem(bL),localStorage.setItem(dK,r.token),localStorage.setItem(Pue,r.refreshToken)),r}async function gT(t,e){const n=Nr(),r=localStorage.getItem(dK);if(r)try{return await(await fetch(`${n.keySettings.speckleConfig.serverUrl}/graphql`,{method:"POST",headers:{Authorization:"Bearer "+r,"Content-Type":"application/json"},body:JSON.stringify({query:t,variables:e||null})})).json()}catch(i){const s="API call failed!";return uze(i),console.error(s,i),Promise.reject(s)}else return Promise.reject("You are not logged in. (Token does not exist.)")}const bUe=()=>gT(iUe);function yUe(t,e,n){return gT(sUe,{id:t,cursor:n,limit:e})}function SUe(){return gT(aUe)}function xUe(t){return gT(oUe,{projectId:t})}async function TUe(t,e,n){const r=uUe(n);return await gT(lUe,{streamId:t,objectId:e,selection:r})}function wUe(t){const e=vo(),r=t.data.stream.object.elements.objects.filter(a=>a.data.speckle_type!=="Speckle.Core.Models.DataChunk"),i=e.getProjectDetails,s=e.getSelectedVersion;if(i&&s){const a=[];return r.forEach(l=>{const u=EUe(l),c=l.data.name?l.data.name:l.data.speckle_type,d={id:l.id,name:c,quantity:u,parameters:l.data,URI:l.id};a.push(d)}),{name:i.stream.name,id:i.stream.id,description:s.message,geometry:a}}return null}function EUe(t){const e={m2:0},n=[{searchValue:"area",metric:"m2",mmConversion:1e6},{searchValue:"volume",metric:"m3",mmConversion:1e9},{searchValue:"length",metric:"m",mmConversion:1e3}],r=(i,s)=>{for(const a in i)if(Object.prototype.hasOwnProperty.call(i,a)){if(typeof i[a]=="object"&&i[a]!==null)r(i[a],s);else if(typeof i[a]=="string"&&i[a].toLowerCase()==s.searchValue){let o=i[a];typeof o=="string"&&(o=i.value),e[s.metric]=o}else if(a==s.searchValue){let o=i[a];typeof o=="string"&&(o=i.value),i.units=="mm"&&(o=o/s.mmConversion),e[s.metric]=o}}};return t.data&&n.forEach(i=>{r(t.data,i)}),e}/** * @license * Copyright 2010-2022 Three.js Authors * SPDX-License-Identifier: MIT - */const NV="140",EUe={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},MUe={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},Vue=0,yL=1,zue=2,PUe=3,RUe=0,dK=1,kue=2,cv=3,Ki=0,Ua=1,rn=2,fK=1,VUe=2,os=0,Mv=1,SL=2,xL=3,TL=4,bT=5,Eu=100,Oue=101,hK=102,wL=103,nP=104,i6=200,Jh=201,Iue=202,Uue=203,pK=204,mK=205,LV=206,Nue=207,vK=208,Lue=209,Xue=210,Cue=0,Kue=1,que=2,rP=3,Due=4,Wue=5,Aue=6,Gue=7,yT=0,Fue=1,jue=2,Wc=0,Zue=1,Jue=2,Yue=3,gK=4,Bue=5,XV=300,Ip=301,Up=302,s6=303,a6=304,fy=306,yf=1e3,_a=1001,o6=1002,Ir=1003,iP=1004,zUe=1004,sP=1005,kUe=1005,Hn=1006,bK=1007,OUe=1007,b0=1008,IUe=1008,Np=1009,Hue=1010,Que=1011,pb=1012,_ue=1013,rx=1014,na=1015,No=1016,$ue=1017,ece=1018,Pv=1020,tce=1021,nce=1022,no=1023,rce=1024,ice=1025,dp=1026,Wv=1027,CV=1028,sce=1029,ace=1030,oce=1031,lce=1033,S7=33776,x7=33777,T7=33778,w7=33779,EL=35840,ML=35841,PL=35842,RL=35843,uce=36196,VL=37492,zL=37496,kL=37808,OL=37809,IL=37810,UL=37811,NL=37812,LL=37813,XL=37814,CL=37815,KL=37816,qL=37817,DL=37818,WL=37819,AL=37820,GL=37821,FL=36492,cce=2200,dce=2201,fce=2202,l6=2300,u6=2301,E7=2302,dv=2400,fv=2401,c6=2402,KV=2500,yK=2501,hce=0,UUe=1,NUe=2,yl=3e3,Jr=3001,SK=3200,ST=3201,y0=0,pce=1,LUe="",Pc="srgb",Yh="srgb-linear",XUe=0,M7=7680,zc=7681,CUe=7682,KUe=7683,qUe=34055,DUe=34056,WUe=5386,AUe=512,GUe=513,mce=514,FUe=515,jUe=516,ZUe=517,JUe=518,d6=519,mb=35044,Bl=35048,YUe=35040,BUe=35045,HUe=35049,QUe=35041,_Ue=35046,$Ue=35050,eNe=35042,tNe="100",jL="300 es",aP=1035;let tm=class{addEventListener(e,n){this._listeners===void 0&&(this._listeners={});const r=this._listeners;r[e]===void 0&&(r[e]=[]),r[e].indexOf(n)===-1&&r[e].push(n)}hasEventListener(e,n){if(this._listeners===void 0)return!1;const r=this._listeners;return r[e]!==void 0&&r[e].indexOf(n)!==-1}removeEventListener(e,n){if(this._listeners===void 0)return;const i=this._listeners[e];if(i!==void 0){const s=i.indexOf(n);s!==-1&&i.splice(s,1)}}dispatchEvent(e){if(this._listeners===void 0)return;const r=this._listeners[e.type];if(r!==void 0){e.target=this;const i=r.slice(0);for(let s=0,a=i.length;s>8&255]+Ys[t>>16&255]+Ys[t>>24&255]+"-"+Ys[e&255]+Ys[e>>8&255]+"-"+Ys[e>>16&15|64]+Ys[e>>24&255]+"-"+Ys[n&63|128]+Ys[n>>8&255]+"-"+Ys[n>>16&255]+Ys[n>>24&255]+Ys[r&255]+Ys[r>>8&255]+Ys[r>>16&255]+Ys[r>>24&255]).toLowerCase()}function Fi(t,e,n){return Math.max(e,Math.min(n,t))}function xK(t,e){return(t%e+e)%e}function nNe(t,e,n,r,i){return r+(t-e)*(i-r)/(n-e)}function rNe(t,e,n){return t!==e?(n-t)/(e-t):0}function ix(t,e,n){return(1-n)*t+n*e}function iNe(t,e,n,r){return ix(t,e,1-Math.exp(-n*r))}function sNe(t,e=1){return e-Math.abs(xK(t,e*2)-e)}function aNe(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e),t*t*(3-2*t))}function oNe(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e),t*t*t*(t*(t*6-15)+10))}function lNe(t,e){return t+Math.floor(Math.random()*(e-t+1))}function uNe(t,e){return t+Math.random()*(e-t)}function cNe(t){return t*(.5-Math.random())}function dNe(t){t!==void 0&&(fZ=t);let e=fZ+=1831565813;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}function fNe(t){return t*Rv}function hNe(t){return t*f6}function ZL(t){return(t&t-1)===0&&t!==0}function vce(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function oP(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}function pNe(t,e,n,r,i){const s=Math.cos,a=Math.sin,o=s(n/2),l=a(n/2),u=s((e+r)/2),c=a((e+r)/2),d=s((e-r)/2),f=a((e-r)/2),h=s((r-e)/2),p=a((r-e)/2);switch(i){case"XYX":t.set(o*c,l*d,l*f,o*u);break;case"YZY":t.set(l*f,o*c,l*d,o*u);break;case"ZXZ":t.set(l*d,l*f,o*c,o*u);break;case"XZX":t.set(o*c,l*p,l*h,o*u);break;case"YXY":t.set(l*h,o*c,l*p,o*u);break;case"ZYZ":t.set(l*p,l*h,o*c,o*u);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+i)}}function mNe(t,e){switch(e.constructor){case Float32Array:return t;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function vNe(t,e){switch(e.constructor){case Float32Array:return t;case Uint16Array:return Math.round(t*65535);case Uint8Array:return Math.round(t*255);case Int16Array:return Math.round(t*32767);case Int8Array:return Math.round(t*127);default:throw new Error("Invalid component type.")}}var fp=Object.freeze({__proto__:null,DEG2RAD:Rv,RAD2DEG:f6,generateUUID:hl,clamp:Fi,euclideanModulo:xK,mapLinear:nNe,inverseLerp:rNe,lerp:ix,damp:iNe,pingpong:sNe,smoothstep:aNe,smootherstep:oNe,randInt:lNe,randFloat:uNe,randFloatSpread:cNe,seededRandom:dNe,degToRad:fNe,radToDeg:hNe,isPowerOfTwo:ZL,ceilPowerOfTwo:vce,floorPowerOfTwo:oP,setQuaternionFromProperEuler:pNe,normalize:vNe,denormalize:mNe});class Oe{constructor(e=0,n=0){this.x=e,this.y=n}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,n){return this.x=e,this.y=n,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e,n){return n!==void 0?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,n)):(this.x+=e.x,this.y+=e.y,this)}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this}sub(e,n){return n!==void 0?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,n)):(this.x-=e.x,this.y-=e.y,this)}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const n=this.x,r=this.y,i=e.elements;return this.x=i[0]*n+i[3]*r+i[6],this.y=i[1]*n+i[4]*r+i[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,n){return this.x=Math.max(e.x,Math.min(n.x,this.x)),this.y=Math.max(e.y,Math.min(n.y,this.y)),this}clampScalar(e,n){return this.x=Math.max(e,Math.min(n,this.x)),this.y=Math.max(e,Math.min(n,this.y)),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(n,r)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const n=this.x-e.x,r=this.y-e.y;return n*n+r*r}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e}fromBufferAttribute(e,n,r){return r!==void 0&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(n),this.y=e.getY(n),this}rotateAround(e,n){const r=Math.cos(n),i=Math.sin(n),s=this.x-e.x,a=this.y-e.y;return this.x=s*r-a*i+e.x,this.y=s*i+a*r+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}Oe.prototype.isVector2=!0;class as{constructor(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}set(e,n,r,i,s,a,o,l,u){const c=this.elements;return c[0]=e,c[1]=i,c[2]=o,c[3]=n,c[4]=s,c[5]=l,c[6]=r,c[7]=a,c[8]=u,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const n=this.elements,r=e.elements;return n[0]=r[0],n[1]=r[1],n[2]=r[2],n[3]=r[3],n[4]=r[4],n[5]=r[5],n[6]=r[6],n[7]=r[7],n[8]=r[8],this}extractBasis(e,n,r){return e.setFromMatrix3Column(this,0),n.setFromMatrix3Column(this,1),r.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const n=e.elements;return this.set(n[0],n[4],n[8],n[1],n[5],n[9],n[2],n[6],n[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,n){const r=e.elements,i=n.elements,s=this.elements,a=r[0],o=r[3],l=r[6],u=r[1],c=r[4],d=r[7],f=r[2],h=r[5],p=r[8],m=i[0],v=i[3],g=i[6],b=i[1],y=i[4],x=i[7],T=i[2],M=i[5],E=i[8];return s[0]=a*m+o*b+l*T,s[3]=a*v+o*y+l*M,s[6]=a*g+o*x+l*E,s[1]=u*m+c*b+d*T,s[4]=u*v+c*y+d*M,s[7]=u*g+c*x+d*E,s[2]=f*m+h*b+p*T,s[5]=f*v+h*y+p*M,s[8]=f*g+h*x+p*E,this}multiplyScalar(e){const n=this.elements;return n[0]*=e,n[3]*=e,n[6]*=e,n[1]*=e,n[4]*=e,n[7]*=e,n[2]*=e,n[5]*=e,n[8]*=e,this}determinant(){const e=this.elements,n=e[0],r=e[1],i=e[2],s=e[3],a=e[4],o=e[5],l=e[6],u=e[7],c=e[8];return n*a*c-n*o*u-r*s*c+r*o*l+i*s*u-i*a*l}invert(){const e=this.elements,n=e[0],r=e[1],i=e[2],s=e[3],a=e[4],o=e[5],l=e[6],u=e[7],c=e[8],d=c*a-o*u,f=o*l-c*s,h=u*s-a*l,p=n*d+r*f+i*h;if(p===0)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return e[0]=d*m,e[1]=(i*u-c*r)*m,e[2]=(o*r-i*a)*m,e[3]=f*m,e[4]=(c*n-i*l)*m,e[5]=(i*s-o*n)*m,e[6]=h*m,e[7]=(r*l-u*n)*m,e[8]=(a*n-r*s)*m,this}transpose(){let e;const n=this.elements;return e=n[1],n[1]=n[3],n[3]=e,e=n[2],n[2]=n[6],n[6]=e,e=n[5],n[5]=n[7],n[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const n=this.elements;return e[0]=n[0],e[1]=n[3],e[2]=n[6],e[3]=n[1],e[4]=n[4],e[5]=n[7],e[6]=n[2],e[7]=n[5],e[8]=n[8],this}setUvTransform(e,n,r,i,s,a,o){const l=Math.cos(s),u=Math.sin(s);return this.set(r*l,r*u,-r*(l*a+u*o)+a+e,-i*u,i*l,-i*(-u*a+l*o)+o+n,0,0,1),this}scale(e,n){const r=this.elements;return r[0]*=e,r[3]*=e,r[6]*=e,r[1]*=n,r[4]*=n,r[7]*=n,this}rotate(e){const n=Math.cos(e),r=Math.sin(e),i=this.elements,s=i[0],a=i[3],o=i[6],l=i[1],u=i[4],c=i[7];return i[0]=n*s+r*l,i[3]=n*a+r*u,i[6]=n*o+r*c,i[1]=-r*s+n*l,i[4]=-r*a+n*u,i[7]=-r*o+n*c,this}translate(e,n){const r=this.elements;return r[0]+=e*r[2],r[3]+=e*r[5],r[6]+=e*r[8],r[1]+=n*r[2],r[4]+=n*r[5],r[7]+=n*r[8],this}equals(e){const n=this.elements,r=e.elements;for(let i=0;i<9;i++)if(n[i]!==r[i])return!1;return!0}fromArray(e,n=0){for(let r=0;r<9;r++)this.elements[r]=e[r+n];return this}toArray(e=[],n=0){const r=this.elements;return e[n]=r[0],e[n+1]=r[1],e[n+2]=r[2],e[n+3]=r[3],e[n+4]=r[4],e[n+5]=r[5],e[n+6]=r[6],e[n+7]=r[7],e[n+8]=r[8],e}clone(){return new this.constructor().fromArray(this.elements)}}as.prototype.isMatrix3=!0;function gce(t){for(let e=t.length-1;e>=0;--e)if(t[e]>65535)return!0;return!1}const gNe={Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array};function c1(t,e){return new gNe[t](e)}function h6(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function Vv(t){return t<.04045?t*.0773993808:Math.pow(t*.9478672986+.0521327014,2.4)}function P7(t){return t<.0031308?t*12.92:1.055*Math.pow(t,.41666)-.055}const Sk={[Pc]:{[Yh]:Vv},[Yh]:{[Pc]:P7}},Xl={legacyMode:!0,get workingColorSpace(){return Yh},set workingColorSpace(t){console.warn("THREE.ColorManagement: .workingColorSpace is readonly.")},convert:function(t,e,n){if(this.legacyMode||e===n||!e||!n)return t;if(Sk[e]&&Sk[e][n]!==void 0){const r=Sk[e][n];return t.r=r(t.r),t.g=r(t.g),t.b=r(t.b),t}throw new Error("Unsupported color space conversion.")},fromWorkingColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},toWorkingColorSpace:function(t,e){return this.convert(t,e,this.workingColorSpace)}},bce={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},hs={r:0,g:0,b:0},au={h:0,s:0,l:0},v2={h:0,s:0,l:0};function xk(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+(e-t)*6*n:n<1/2?e:n<2/3?t+(e-t)*6*(2/3-n):t}function g2(t,e){return e.r=t.r,e.g=t.g,e.b=t.b,e}let tt=class{constructor(e,n,r){return n===void 0&&r===void 0?this.set(e):this.setRGB(e,n,r)}set(e){return e&&e.isColor?this.copy(e):typeof e=="number"?this.setHex(e):typeof e=="string"&&this.setStyle(e),this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,n=Pc){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,Xl.toWorkingColorSpace(this,n),this}setRGB(e,n,r,i=Yh){return this.r=e,this.g=n,this.b=r,Xl.toWorkingColorSpace(this,i),this}setHSL(e,n,r,i=Yh){if(e=xK(e,1),n=Fi(n,0,1),r=Fi(r,0,1),n===0)this.r=this.g=this.b=r;else{const s=r<=.5?r*(1+n):r+n-r*n,a=2*r-s;this.r=xk(a,s,e+1/3),this.g=xk(a,s,e),this.b=xk(a,s,e-1/3)}return Xl.toWorkingColorSpace(this,i),this}setStyle(e,n=Pc){function r(s){s!==void 0&&parseFloat(s)<1&&console.warn("THREE.Color: Alpha component of "+e+" will be ignored.")}let i;if(i=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(e)){let s;const a=i[1],o=i[2];switch(a){case"rgb":case"rgba":if(s=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return this.r=Math.min(255,parseInt(s[1],10))/255,this.g=Math.min(255,parseInt(s[2],10))/255,this.b=Math.min(255,parseInt(s[3],10))/255,Xl.toWorkingColorSpace(this,n),r(s[4]),this;if(s=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return this.r=Math.min(100,parseInt(s[1],10))/100,this.g=Math.min(100,parseInt(s[2],10))/100,this.b=Math.min(100,parseInt(s[3],10))/100,Xl.toWorkingColorSpace(this,n),r(s[4]),this;break;case"hsl":case"hsla":if(s=/^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o)){const l=parseFloat(s[1])/360,u=parseInt(s[2],10)/100,c=parseInt(s[3],10)/100;return r(s[4]),this.setHSL(l,u,c,n)}break}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(e)){const s=i[1],a=s.length;if(a===3)return this.r=parseInt(s.charAt(0)+s.charAt(0),16)/255,this.g=parseInt(s.charAt(1)+s.charAt(1),16)/255,this.b=parseInt(s.charAt(2)+s.charAt(2),16)/255,Xl.toWorkingColorSpace(this,n),this;if(a===6)return this.r=parseInt(s.charAt(0)+s.charAt(1),16)/255,this.g=parseInt(s.charAt(2)+s.charAt(3),16)/255,this.b=parseInt(s.charAt(4)+s.charAt(5),16)/255,Xl.toWorkingColorSpace(this,n),this}return e&&e.length>0?this.setColorName(e,n):this}setColorName(e,n=Pc){const r=bce[e.toLowerCase()];return r!==void 0?this.setHex(r,n):console.warn("THREE.Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=Vv(e.r),this.g=Vv(e.g),this.b=Vv(e.b),this}copyLinearToSRGB(e){return this.r=P7(e.r),this.g=P7(e.g),this.b=P7(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=Pc){return Xl.fromWorkingColorSpace(g2(this,hs),e),Fi(hs.r*255,0,255)<<16^Fi(hs.g*255,0,255)<<8^Fi(hs.b*255,0,255)<<0}getHexString(e=Pc){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,n=Yh){Xl.fromWorkingColorSpace(g2(this,hs),n);const r=hs.r,i=hs.g,s=hs.b,a=Math.max(r,i,s),o=Math.min(r,i,s);let l,u;const c=(o+a)/2;if(o===a)l=0,u=0;else{const d=a-o;switch(u=c<=.5?d/(a+o):d/(2-a-o),a){case r:l=(i-s)/d+(i"u")return e.src;let n;if(e instanceof HTMLCanvasElement)n=e;else{tg===void 0&&(tg=h6("canvas")),tg.width=e.width,tg.height=e.height;const r=tg.getContext("2d");e instanceof ImageData?r.putImageData(e,0,0):r.drawImage(e,0,0,e.width,e.height),n=tg}return n.width>2048||n.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",e),n.toDataURL("image/jpeg",.6)):n.toDataURL("image/png")}static sRGBToLinear(e){if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&e instanceof ImageBitmap){const n=h6("canvas");n.width=e.width,n.height=e.height;const r=n.getContext("2d");r.drawImage(e,0,0,e.width,e.height);const i=r.getImageData(0,0,e.width,e.height),s=i.data;for(let a=0;a1)switch(this.wrapS){case yf:e.x=e.x-Math.floor(e.x);break;case _a:e.x=e.x<0?0:1;break;case o6:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case yf:e.y=e.y-Math.floor(e.y);break;case _a:e.y=e.y<0?0:1;break;case o6:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}}Di.DEFAULT_IMAGE=null;Di.DEFAULT_MAPPING=XV;Di.prototype.isTexture=!0;class Qt{constructor(e=0,n=0,r=0,i=1){this.x=e,this.y=n,this.z=r,this.w=i}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,n,r,i){return this.x=e,this.y=n,this.z=r,this.w=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;case 2:this.z=n;break;case 3:this.w=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w!==void 0?e.w:1,this}add(e,n){return n!==void 0?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,n)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this)}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this.z=e.z+n.z,this.w=e.w+n.w,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this.z+=e.z*n,this.w+=e.w*n,this}sub(e,n){return n!==void 0?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,n)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this)}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this.w=e.w-n.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const n=this.x,r=this.y,i=this.z,s=this.w,a=e.elements;return this.x=a[0]*n+a[4]*r+a[8]*i+a[12]*s,this.y=a[1]*n+a[5]*r+a[9]*i+a[13]*s,this.z=a[2]*n+a[6]*r+a[10]*i+a[14]*s,this.w=a[3]*n+a[7]*r+a[11]*i+a[15]*s,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const n=Math.sqrt(1-e.w*e.w);return n<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/n,this.y=e.y/n,this.z=e.z/n),this}setAxisAngleFromRotationMatrix(e){let n,r,i,s;const l=e.elements,u=l[0],c=l[4],d=l[8],f=l[1],h=l[5],p=l[9],m=l[2],v=l[6],g=l[10];if(Math.abs(c-f)<.01&&Math.abs(d-m)<.01&&Math.abs(p-v)<.01){if(Math.abs(c+f)<.1&&Math.abs(d+m)<.1&&Math.abs(p+v)<.1&&Math.abs(u+h+g-3)<.1)return this.set(1,0,0,0),this;n=Math.PI;const y=(u+1)/2,x=(h+1)/2,T=(g+1)/2,M=(c+f)/4,E=(d+m)/4,S=(p+v)/4;return y>x&&y>T?y<.01?(r=0,i=.707106781,s=.707106781):(r=Math.sqrt(y),i=M/r,s=E/r):x>T?x<.01?(r=.707106781,i=0,s=.707106781):(i=Math.sqrt(x),r=M/i,s=S/i):T<.01?(r=.707106781,i=.707106781,s=0):(s=Math.sqrt(T),r=E/s,i=S/s),this.set(r,i,s,n),this}let b=Math.sqrt((v-p)*(v-p)+(d-m)*(d-m)+(f-c)*(f-c));return Math.abs(b)<.001&&(b=1),this.x=(v-p)/b,this.y=(d-m)/b,this.z=(f-c)/b,this.w=Math.acos((u+h+g-1)/2),this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,n){return this.x=Math.max(e.x,Math.min(n.x,this.x)),this.y=Math.max(e.y,Math.min(n.y,this.y)),this.z=Math.max(e.z,Math.min(n.z,this.z)),this.w=Math.max(e.w,Math.min(n.w,this.w)),this}clampScalar(e,n){return this.x=Math.max(e,Math.min(n,this.x)),this.y=Math.max(e,Math.min(n,this.y)),this.z=Math.max(e,Math.min(n,this.z)),this.w=Math.max(e,Math.min(n,this.w)),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(n,r)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this.z+=(e.z-this.z)*n,this.w+=(e.w-this.w)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this.z=e.z+(n.z-e.z)*r,this.w=e.w+(n.w-e.w)*r,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this.z=e[n+2],this.w=e[n+3],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e[n+2]=this.z,e[n+3]=this.w,e}fromBufferAttribute(e,n,r){return r!==void 0&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(n),this.y=e.getY(n),this.z=e.getZ(n),this.w=e.getW(n),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}Qt.prototype.isVector4=!0;class oi extends tm{constructor(e,n,r={}){super(),this.width=e,this.height=n,this.depth=1,this.scissor=new Qt(0,0,e,n),this.scissorTest=!1,this.viewport=new Qt(0,0,e,n);const i={width:e,height:n,depth:1};this.texture=new Di(i,r.mapping,r.wrapS,r.wrapT,r.magFilter,r.minFilter,r.format,r.type,r.anisotropy,r.encoding),this.texture.isRenderTargetTexture=!0,this.texture.flipY=!1,this.texture.generateMipmaps=r.generateMipmaps!==void 0?r.generateMipmaps:!1,this.texture.internalFormat=r.internalFormat!==void 0?r.internalFormat:null,this.texture.minFilter=r.minFilter!==void 0?r.minFilter:Hn,this.depthBuffer=r.depthBuffer!==void 0?r.depthBuffer:!0,this.stencilBuffer=r.stencilBuffer!==void 0?r.stencilBuffer:!1,this.depthTexture=r.depthTexture!==void 0?r.depthTexture:null,this.samples=r.samples!==void 0?r.samples:0}setSize(e,n,r=1){(this.width!==e||this.height!==n||this.depth!==r)&&(this.width=e,this.height=n,this.depth=r,this.texture.image.width=e,this.texture.image.height=n,this.texture.image.depth=r,this.dispose()),this.viewport.set(0,0,e,n),this.scissor.set(0,0,e,n)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.viewport.copy(e.viewport),this.texture=e.texture.clone(),this.texture.isRenderTargetTexture=!0;const n=Object.assign({},e.texture.image);return this.texture.source=new Bh(n),this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,e.depthTexture!==null&&(this.depthTexture=e.depthTexture.clone()),this.samples=e.samples,this}dispose(){this.dispatchEvent({type:"dispose"})}}oi.prototype.isWebGLRenderTarget=!0;class hy extends Di{constructor(e=null,n=1,r=1,i=1){super(null),this.image={data:e,width:n,height:r,depth:i},this.magFilter=Ir,this.minFilter=Ir,this.wrapR=_a,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}hy.prototype.isDataArrayTexture=!0;class yce extends oi{constructor(e,n,r){super(e,n),this.depth=r,this.texture=new hy(null,e,n,r),this.texture.isRenderTargetTexture=!0}}yce.prototype.isWebGLArrayRenderTarget=!0;class xT extends Di{constructor(e=null,n=1,r=1,i=1){super(null),this.image={data:e,width:n,height:r,depth:i},this.magFilter=Ir,this.minFilter=Ir,this.wrapR=_a,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}xT.prototype.isData3DTexture=!0;class Sce extends oi{constructor(e,n,r){super(e,n),this.depth=r,this.texture=new xT(null,e,n,r),this.texture.isRenderTargetTexture=!0}}Sce.prototype.isWebGL3DRenderTarget=!0;class xce extends oi{constructor(e,n,r,i={}){super(e,n,i);const s=this.texture;this.texture=[];for(let a=0;a=0?1:-1,y=1-g*g;if(y>Number.EPSILON){const T=Math.sqrt(y),M=Math.atan2(T,g*b);v=Math.sin(v*M)/T,o=Math.sin(o*M)/T}const x=o*b;if(l=l*v+f*x,u=u*v+h*x,c=c*v+p*x,d=d*v+m*x,v===1-o){const T=1/Math.sqrt(l*l+u*u+c*c+d*d);l*=T,u*=T,c*=T,d*=T}}e[n]=l,e[n+1]=u,e[n+2]=c,e[n+3]=d}static multiplyQuaternionsFlat(e,n,r,i,s,a){const o=r[i],l=r[i+1],u=r[i+2],c=r[i+3],d=s[a],f=s[a+1],h=s[a+2],p=s[a+3];return e[n]=o*p+c*d+l*h-u*f,e[n+1]=l*p+c*f+u*d-o*h,e[n+2]=u*p+c*h+o*f-l*d,e[n+3]=c*p-o*d-l*f-u*h,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,n,r,i){return this._x=e,this._y=n,this._z=r,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,n){if(!(e&&e.isEuler))throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");const r=e._x,i=e._y,s=e._z,a=e._order,o=Math.cos,l=Math.sin,u=o(r/2),c=o(i/2),d=o(s/2),f=l(r/2),h=l(i/2),p=l(s/2);switch(a){case"XYZ":this._x=f*c*d+u*h*p,this._y=u*h*d-f*c*p,this._z=u*c*p+f*h*d,this._w=u*c*d-f*h*p;break;case"YXZ":this._x=f*c*d+u*h*p,this._y=u*h*d-f*c*p,this._z=u*c*p-f*h*d,this._w=u*c*d+f*h*p;break;case"ZXY":this._x=f*c*d-u*h*p,this._y=u*h*d+f*c*p,this._z=u*c*p+f*h*d,this._w=u*c*d-f*h*p;break;case"ZYX":this._x=f*c*d-u*h*p,this._y=u*h*d+f*c*p,this._z=u*c*p-f*h*d,this._w=u*c*d+f*h*p;break;case"YZX":this._x=f*c*d+u*h*p,this._y=u*h*d+f*c*p,this._z=u*c*p-f*h*d,this._w=u*c*d-f*h*p;break;case"XZY":this._x=f*c*d-u*h*p,this._y=u*h*d-f*c*p,this._z=u*c*p+f*h*d,this._w=u*c*d+f*h*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+a)}return n!==!1&&this._onChangeCallback(),this}setFromAxisAngle(e,n){const r=n/2,i=Math.sin(r);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(r),this._onChangeCallback(),this}setFromRotationMatrix(e){const n=e.elements,r=n[0],i=n[4],s=n[8],a=n[1],o=n[5],l=n[9],u=n[2],c=n[6],d=n[10],f=r+o+d;if(f>0){const h=.5/Math.sqrt(f+1);this._w=.25/h,this._x=(c-l)*h,this._y=(s-u)*h,this._z=(a-i)*h}else if(r>o&&r>d){const h=2*Math.sqrt(1+r-o-d);this._w=(c-l)/h,this._x=.25*h,this._y=(i+a)/h,this._z=(s+u)/h}else if(o>d){const h=2*Math.sqrt(1+o-r-d);this._w=(s-u)/h,this._x=(i+a)/h,this._y=.25*h,this._z=(l+c)/h}else{const h=2*Math.sqrt(1+d-r-o);this._w=(a-i)/h,this._x=(s+u)/h,this._y=(l+c)/h,this._z=.25*h}return this._onChangeCallback(),this}setFromUnitVectors(e,n){let r=e.dot(n)+1;return rMath.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=r):(this._x=0,this._y=-e.z,this._z=e.y,this._w=r)):(this._x=e.y*n.z-e.z*n.y,this._y=e.z*n.x-e.x*n.z,this._z=e.x*n.y-e.y*n.x,this._w=r),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(Fi(this.dot(e),-1,1)))}rotateTowards(e,n){const r=this.angleTo(e);if(r===0)return this;const i=Math.min(1,n/r);return this.slerp(e,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e,n){return n!==void 0?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(e,n)):this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,n){const r=e._x,i=e._y,s=e._z,a=e._w,o=n._x,l=n._y,u=n._z,c=n._w;return this._x=r*c+a*o+i*u-s*l,this._y=i*c+a*l+s*o-r*u,this._z=s*c+a*u+r*l-i*o,this._w=a*c-r*o-i*l-s*u,this._onChangeCallback(),this}slerp(e,n){if(n===0)return this;if(n===1)return this.copy(e);const r=this._x,i=this._y,s=this._z,a=this._w;let o=a*e._w+r*e._x+i*e._y+s*e._z;if(o<0?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,o=-o):this.copy(e),o>=1)return this._w=a,this._x=r,this._y=i,this._z=s,this;const l=1-o*o;if(l<=Number.EPSILON){const h=1-n;return this._w=h*a+n*this._w,this._x=h*r+n*this._x,this._y=h*i+n*this._y,this._z=h*s+n*this._z,this.normalize(),this._onChangeCallback(),this}const u=Math.sqrt(l),c=Math.atan2(u,o),d=Math.sin((1-n)*c)/u,f=Math.sin(n*c)/u;return this._w=a*d+this._w*f,this._x=r*d+this._x*f,this._y=i*d+this._y*f,this._z=s*d+this._z*f,this._onChangeCallback(),this}slerpQuaternions(e,n,r){return this.copy(e).slerp(n,r)}random(){const e=Math.random(),n=Math.sqrt(1-e),r=Math.sqrt(e),i=2*Math.PI*Math.random(),s=2*Math.PI*Math.random();return this.set(n*Math.cos(i),r*Math.sin(s),r*Math.cos(s),n*Math.sin(i))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,n=0){return this._x=e[n],this._y=e[n+1],this._z=e[n+2],this._w=e[n+3],this._onChangeCallback(),this}toArray(e=[],n=0){return e[n]=this._x,e[n+1]=this._y,e[n+2]=this._z,e[n+3]=this._w,e}fromBufferAttribute(e,n){return this._x=e.getX(n),this._y=e.getY(n),this._z=e.getZ(n),this._w=e.getW(n),this}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}Or.prototype.isQuaternion=!0;class U{constructor(e=0,n=0,r=0){this.x=e,this.y=n,this.z=r}set(e,n,r){return r===void 0&&(r=this.z),this.x=e,this.y=n,this.z=r,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;case 2:this.z=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e,n){return n!==void 0?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,n)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this)}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this.z=e.z+n.z,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this.z+=e.z*n,this}sub(e,n){return n!==void 0?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,n)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this)}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this}multiply(e,n){return n!==void 0?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(e,n)):(this.x*=e.x,this.y*=e.y,this.z*=e.z,this)}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,n){return this.x=e.x*n.x,this.y=e.y*n.y,this.z=e.z*n.z,this}applyEuler(e){return e&&e.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(hZ.setFromEuler(e))}applyAxisAngle(e,n){return this.applyQuaternion(hZ.setFromAxisAngle(e,n))}applyMatrix3(e){const n=this.x,r=this.y,i=this.z,s=e.elements;return this.x=s[0]*n+s[3]*r+s[6]*i,this.y=s[1]*n+s[4]*r+s[7]*i,this.z=s[2]*n+s[5]*r+s[8]*i,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const n=this.x,r=this.y,i=this.z,s=e.elements,a=1/(s[3]*n+s[7]*r+s[11]*i+s[15]);return this.x=(s[0]*n+s[4]*r+s[8]*i+s[12])*a,this.y=(s[1]*n+s[5]*r+s[9]*i+s[13])*a,this.z=(s[2]*n+s[6]*r+s[10]*i+s[14])*a,this}applyQuaternion(e){const n=this.x,r=this.y,i=this.z,s=e.x,a=e.y,o=e.z,l=e.w,u=l*n+a*i-o*r,c=l*r+o*n-s*i,d=l*i+s*r-a*n,f=-s*n-a*r-o*i;return this.x=u*l+f*-s+c*-o-d*-a,this.y=c*l+f*-a+d*-s-u*-o,this.z=d*l+f*-o+u*-a-c*-s,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const n=this.x,r=this.y,i=this.z,s=e.elements;return this.x=s[0]*n+s[4]*r+s[8]*i,this.y=s[1]*n+s[5]*r+s[9]*i,this.z=s[2]*n+s[6]*r+s[10]*i,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,n){return this.x=Math.max(e.x,Math.min(n.x,this.x)),this.y=Math.max(e.y,Math.min(n.y,this.y)),this.z=Math.max(e.z,Math.min(n.z,this.z)),this}clampScalar(e,n){return this.x=Math.max(e,Math.min(n,this.x)),this.y=Math.max(e,Math.min(n,this.y)),this.z=Math.max(e,Math.min(n,this.z)),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(n,r)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this.z+=(e.z-this.z)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this.z=e.z+(n.z-e.z)*r,this}cross(e,n){return n!==void 0?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(e,n)):this.crossVectors(this,e)}crossVectors(e,n){const r=e.x,i=e.y,s=e.z,a=n.x,o=n.y,l=n.z;return this.x=i*l-s*o,this.y=s*a-r*l,this.z=r*o-i*a,this}projectOnVector(e){const n=e.lengthSq();if(n===0)return this.set(0,0,0);const r=e.dot(this)/n;return this.copy(e).multiplyScalar(r)}projectOnPlane(e){return wk.copy(this).projectOnVector(e),this.sub(wk)}reflect(e){return this.sub(wk.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const n=Math.sqrt(this.lengthSq()*e.lengthSq());if(n===0)return Math.PI/2;const r=this.dot(e)/n;return Math.acos(Fi(r,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const n=this.x-e.x,r=this.y-e.y,i=this.z-e.z;return n*n+r*r+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,n,r){const i=Math.sin(n)*e;return this.x=i*Math.sin(r),this.y=Math.cos(n)*e,this.z=i*Math.cos(r),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,n,r){return this.x=e*Math.sin(n),this.y=r,this.z=e*Math.cos(n),this}setFromMatrixPosition(e){const n=e.elements;return this.x=n[12],this.y=n[13],this.z=n[14],this}setFromMatrixScale(e){const n=this.setFromMatrixColumn(e,0).length(),r=this.setFromMatrixColumn(e,1).length(),i=this.setFromMatrixColumn(e,2).length();return this.x=n,this.y=r,this.z=i,this}setFromMatrixColumn(e,n){return this.fromArray(e.elements,n*4)}setFromMatrix3Column(e,n){return this.fromArray(e.elements,n*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this.z=e[n+2],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e[n+2]=this.z,e}fromBufferAttribute(e,n,r){return r!==void 0&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(n),this.y=e.getY(n),this.z=e.getZ(n),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=(Math.random()-.5)*2,n=Math.random()*Math.PI*2,r=Math.sqrt(1-e**2);return this.x=r*Math.cos(n),this.y=r*Math.sin(n),this.z=e,this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}U.prototype.isVector3=!0;const wk=new U,hZ=new Or;class Jt{constructor(e=new U(1/0,1/0,1/0),n=new U(-1/0,-1/0,-1/0)){this.min=e,this.max=n}set(e,n){return this.min.copy(e),this.max.copy(n),this}setFromArray(e){let n=1/0,r=1/0,i=1/0,s=-1/0,a=-1/0,o=-1/0;for(let l=0,u=e.length;ls&&(s=c),d>a&&(a=d),f>o&&(o=f)}return this.min.set(n,r,i),this.max.set(s,a,o),this}setFromBufferAttribute(e){let n=1/0,r=1/0,i=1/0,s=-1/0,a=-1/0,o=-1/0;for(let l=0,u=e.count;ls&&(s=c),d>a&&(a=d),f>o&&(o=f)}return this.min.set(n,r,i),this.max.set(s,a,o),this}setFromPoints(e){this.makeEmpty();for(let n=0,r=e.length;nthis.max.x||e.ythis.max.y||e.zthis.max.z)}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,n){return n.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return!(e.max.xthis.max.x||e.max.ythis.max.y||e.max.zthis.max.z)}intersectsSphere(e){return this.clampPoint(e.center,Pm),Pm.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let n,r;return e.normal.x>0?(n=e.normal.x*this.min.x,r=e.normal.x*this.max.x):(n=e.normal.x*this.max.x,r=e.normal.x*this.min.x),e.normal.y>0?(n+=e.normal.y*this.min.y,r+=e.normal.y*this.max.y):(n+=e.normal.y*this.max.y,r+=e.normal.y*this.min.y),e.normal.z>0?(n+=e.normal.z*this.min.z,r+=e.normal.z*this.max.z):(n+=e.normal.z*this.max.z,r+=e.normal.z*this.min.z),n<=-e.constant&&r>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(wS),b2.subVectors(this.max,wS),ng.subVectors(e.a,wS),rg.subVectors(e.b,wS),ig.subVectors(e.c,wS),rh.subVectors(rg,ng),ih.subVectors(ig,rg),Rm.subVectors(ng,ig);let n=[0,-rh.z,rh.y,0,-ih.z,ih.y,0,-Rm.z,Rm.y,rh.z,0,-rh.x,ih.z,0,-ih.x,Rm.z,0,-Rm.x,-rh.y,rh.x,0,-ih.y,ih.x,0,-Rm.y,Rm.x,0];return!Mk(n,ng,rg,ig,b2)||(n=[1,0,0,0,1,0,0,0,1],!Mk(n,ng,rg,ig,b2))?!1:(y2.crossVectors(rh,ih),n=[y2.x,y2.y,y2.z],Mk(n,ng,rg,ig,b2))}clampPoint(e,n){return n.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return Pm.copy(e).clamp(this.min,this.max).sub(e).length()}getBoundingSphere(e){return this.getCenter(e.center),e.radius=this.getSize(Pm).length()*.5,e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(Sd[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),Sd[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),Sd[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),Sd[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),Sd[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),Sd[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),Sd[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),Sd[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(Sd),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}Jt.prototype.isBox3=!0;const Sd=[new U,new U,new U,new U,new U,new U,new U,new U],Pm=new U,Ek=new Jt,ng=new U,rg=new U,ig=new U,rh=new U,ih=new U,Rm=new U,wS=new U,b2=new U,y2=new U,Vm=new U;function Mk(t,e,n,r,i){for(let s=0,a=t.length-3;s<=a;s+=3){Vm.fromArray(t,s);const o=i.x*Math.abs(Vm.x)+i.y*Math.abs(Vm.y)+i.z*Math.abs(Vm.z),l=e.dot(Vm),u=n.dot(Vm),c=r.dot(Vm);if(Math.max(-Math.max(l,u,c),Math.min(l,u,c))>o)return!1}return!0}const yNe=new Jt,pZ=new U,S2=new U,Pk=new U;class so{constructor(e=new U,n=-1){this.center=e,this.radius=n}set(e,n){return this.center.copy(e),this.radius=n,this}setFromPoints(e,n){const r=this.center;n!==void 0?r.copy(n):yNe.setFromPoints(e).getCenter(r);let i=0;for(let s=0,a=e.length;sthis.radius*this.radius&&(n.sub(this.center).normalize(),n.multiplyScalar(this.radius).add(this.center)),n}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){Pk.subVectors(e,this.center);const n=Pk.lengthSq();if(n>this.radius*this.radius){const r=Math.sqrt(n),i=(r-this.radius)*.5;this.center.add(Pk.multiplyScalar(i/r)),this.radius+=i}return this}union(e){return this.center.equals(e.center)===!0?S2.set(0,0,1).multiplyScalar(e.radius):S2.subVectors(e.center,this.center).normalize().multiplyScalar(e.radius),this.expandByPoint(pZ.copy(e.center).add(S2)),this.expandByPoint(pZ.copy(e.center).sub(S2)),this}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}}const xd=new U,Rk=new U,x2=new U,sh=new U,Vk=new U,T2=new U,zk=new U;class qo{constructor(e=new U,n=new U(0,0,-1)){this.origin=e,this.direction=n}set(e,n){return this.origin.copy(e),this.direction.copy(n),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,n){return n.copy(this.direction).multiplyScalar(e).add(this.origin)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,xd)),this}closestPointToPoint(e,n){n.subVectors(e,this.origin);const r=n.dot(this.direction);return r<0?n.copy(this.origin):n.copy(this.direction).multiplyScalar(r).add(this.origin)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const n=xd.subVectors(e,this.origin).dot(this.direction);return n<0?this.origin.distanceToSquared(e):(xd.copy(this.direction).multiplyScalar(n).add(this.origin),xd.distanceToSquared(e))}distanceSqToSegment(e,n,r,i){Rk.copy(e).add(n).multiplyScalar(.5),x2.copy(n).sub(e).normalize(),sh.copy(this.origin).sub(Rk);const s=e.distanceTo(n)*.5,a=-this.direction.dot(x2),o=sh.dot(this.direction),l=-sh.dot(x2),u=sh.lengthSq(),c=Math.abs(1-a*a);let d,f,h,p;if(c>0)if(d=a*l-o,f=a*o-l,p=s*c,d>=0)if(f>=-p)if(f<=p){const m=1/c;d*=m,f*=m,h=d*(d+a*f+2*o)+f*(a*d+f+2*l)+u}else f=s,d=Math.max(0,-(a*f+o)),h=-d*d+f*(f+2*l)+u;else f=-s,d=Math.max(0,-(a*f+o)),h=-d*d+f*(f+2*l)+u;else f<=-p?(d=Math.max(0,-(-a*s+o)),f=d>0?-s:Math.min(Math.max(-s,-l),s),h=-d*d+f*(f+2*l)+u):f<=p?(d=0,f=Math.min(Math.max(-s,-l),s),h=f*(f+2*l)+u):(d=Math.max(0,-(a*s+o)),f=d>0?s:Math.min(Math.max(-s,-l),s),h=-d*d+f*(f+2*l)+u);else f=a>0?-s:s,d=Math.max(0,-(a*f+o)),h=-d*d+f*(f+2*l)+u;return r&&r.copy(this.direction).multiplyScalar(d).add(this.origin),i&&i.copy(x2).multiplyScalar(f).add(Rk),h}intersectSphere(e,n){xd.subVectors(e.center,this.origin);const r=xd.dot(this.direction),i=xd.dot(xd)-r*r,s=e.radius*e.radius;if(i>s)return null;const a=Math.sqrt(s-i),o=r-a,l=r+a;return o<0&&l<0?null:o<0?this.at(l,n):this.at(o,n)}intersectsSphere(e){return this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const n=e.normal.dot(this.direction);if(n===0)return e.distanceToPoint(this.origin)===0?0:null;const r=-(this.origin.dot(e.normal)+e.constant)/n;return r>=0?r:null}intersectPlane(e,n){const r=this.distanceToPlane(e);return r===null?null:this.at(r,n)}intersectsPlane(e){const n=e.distanceToPoint(this.origin);return n===0||e.normal.dot(this.direction)*n<0}intersectBox(e,n){let r,i,s,a,o,l;const u=1/this.direction.x,c=1/this.direction.y,d=1/this.direction.z,f=this.origin;return u>=0?(r=(e.min.x-f.x)*u,i=(e.max.x-f.x)*u):(r=(e.max.x-f.x)*u,i=(e.min.x-f.x)*u),c>=0?(s=(e.min.y-f.y)*c,a=(e.max.y-f.y)*c):(s=(e.max.y-f.y)*c,a=(e.min.y-f.y)*c),r>a||s>i||((s>r||r!==r)&&(r=s),(a=0?(o=(e.min.z-f.z)*d,l=(e.max.z-f.z)*d):(o=(e.max.z-f.z)*d,l=(e.min.z-f.z)*d),r>l||o>i)||((o>r||r!==r)&&(r=o),(l=0?r:i,n)}intersectsBox(e){return this.intersectBox(e,xd)!==null}intersectTriangle(e,n,r,i,s){Vk.subVectors(n,e),T2.subVectors(r,e),zk.crossVectors(Vk,T2);let a=this.direction.dot(zk),o;if(a>0){if(i)return null;o=1}else if(a<0)o=-1,a=-a;else return null;sh.subVectors(this.origin,e);const l=o*this.direction.dot(T2.crossVectors(sh,T2));if(l<0)return null;const u=o*this.direction.dot(Vk.cross(sh));if(u<0||l+u>a)return null;const c=-o*sh.dot(zk);return c<0?null:this.at(c/a,s)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class Be{constructor(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}set(e,n,r,i,s,a,o,l,u,c,d,f,h,p,m,v){const g=this.elements;return g[0]=e,g[4]=n,g[8]=r,g[12]=i,g[1]=s,g[5]=a,g[9]=o,g[13]=l,g[2]=u,g[6]=c,g[10]=d,g[14]=f,g[3]=h,g[7]=p,g[11]=m,g[15]=v,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new Be().fromArray(this.elements)}copy(e){const n=this.elements,r=e.elements;return n[0]=r[0],n[1]=r[1],n[2]=r[2],n[3]=r[3],n[4]=r[4],n[5]=r[5],n[6]=r[6],n[7]=r[7],n[8]=r[8],n[9]=r[9],n[10]=r[10],n[11]=r[11],n[12]=r[12],n[13]=r[13],n[14]=r[14],n[15]=r[15],this}copyPosition(e){const n=this.elements,r=e.elements;return n[12]=r[12],n[13]=r[13],n[14]=r[14],this}setFromMatrix3(e){const n=e.elements;return this.set(n[0],n[3],n[6],0,n[1],n[4],n[7],0,n[2],n[5],n[8],0,0,0,0,1),this}extractBasis(e,n,r){return e.setFromMatrixColumn(this,0),n.setFromMatrixColumn(this,1),r.setFromMatrixColumn(this,2),this}makeBasis(e,n,r){return this.set(e.x,n.x,r.x,0,e.y,n.y,r.y,0,e.z,n.z,r.z,0,0,0,0,1),this}extractRotation(e){const n=this.elements,r=e.elements,i=1/sg.setFromMatrixColumn(e,0).length(),s=1/sg.setFromMatrixColumn(e,1).length(),a=1/sg.setFromMatrixColumn(e,2).length();return n[0]=r[0]*i,n[1]=r[1]*i,n[2]=r[2]*i,n[3]=0,n[4]=r[4]*s,n[5]=r[5]*s,n[6]=r[6]*s,n[7]=0,n[8]=r[8]*a,n[9]=r[9]*a,n[10]=r[10]*a,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,this}makeRotationFromEuler(e){e&&e.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");const n=this.elements,r=e.x,i=e.y,s=e.z,a=Math.cos(r),o=Math.sin(r),l=Math.cos(i),u=Math.sin(i),c=Math.cos(s),d=Math.sin(s);if(e.order==="XYZ"){const f=a*c,h=a*d,p=o*c,m=o*d;n[0]=l*c,n[4]=-l*d,n[8]=u,n[1]=h+p*u,n[5]=f-m*u,n[9]=-o*l,n[2]=m-f*u,n[6]=p+h*u,n[10]=a*l}else if(e.order==="YXZ"){const f=l*c,h=l*d,p=u*c,m=u*d;n[0]=f+m*o,n[4]=p*o-h,n[8]=a*u,n[1]=a*d,n[5]=a*c,n[9]=-o,n[2]=h*o-p,n[6]=m+f*o,n[10]=a*l}else if(e.order==="ZXY"){const f=l*c,h=l*d,p=u*c,m=u*d;n[0]=f-m*o,n[4]=-a*d,n[8]=p+h*o,n[1]=h+p*o,n[5]=a*c,n[9]=m-f*o,n[2]=-a*u,n[6]=o,n[10]=a*l}else if(e.order==="ZYX"){const f=a*c,h=a*d,p=o*c,m=o*d;n[0]=l*c,n[4]=p*u-h,n[8]=f*u+m,n[1]=l*d,n[5]=m*u+f,n[9]=h*u-p,n[2]=-u,n[6]=o*l,n[10]=a*l}else if(e.order==="YZX"){const f=a*l,h=a*u,p=o*l,m=o*u;n[0]=l*c,n[4]=m-f*d,n[8]=p*d+h,n[1]=d,n[5]=a*c,n[9]=-o*c,n[2]=-u*c,n[6]=h*d+p,n[10]=f-m*d}else if(e.order==="XZY"){const f=a*l,h=a*u,p=o*l,m=o*u;n[0]=l*c,n[4]=-d,n[8]=u*c,n[1]=f*d+m,n[5]=a*c,n[9]=h*d-p,n[2]=p*d-h,n[6]=o*c,n[10]=m*d+f}return n[3]=0,n[7]=0,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,this}makeRotationFromQuaternion(e){return this.compose(SNe,e,xNe)}lookAt(e,n,r){const i=this.elements;return Qo.subVectors(e,n),Qo.lengthSq()===0&&(Qo.z=1),Qo.normalize(),ah.crossVectors(r,Qo),ah.lengthSq()===0&&(Math.abs(r.z)===1?Qo.x+=1e-4:Qo.z+=1e-4,Qo.normalize(),ah.crossVectors(r,Qo)),ah.normalize(),w2.crossVectors(Qo,ah),i[0]=ah.x,i[4]=w2.x,i[8]=Qo.x,i[1]=ah.y,i[5]=w2.y,i[9]=Qo.y,i[2]=ah.z,i[6]=w2.z,i[10]=Qo.z,this}multiply(e,n){return n!==void 0?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(e,n)):this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,n){const r=e.elements,i=n.elements,s=this.elements,a=r[0],o=r[4],l=r[8],u=r[12],c=r[1],d=r[5],f=r[9],h=r[13],p=r[2],m=r[6],v=r[10],g=r[14],b=r[3],y=r[7],x=r[11],T=r[15],M=i[0],E=i[4],S=i[8],P=i[12],R=i[1],V=i[5],z=i[9],k=i[13],N=i[2],q=i[6],L=i[10],A=i[14],Z=i[3],j=i[7],ne=i[11],G=i[15];return s[0]=a*M+o*R+l*N+u*Z,s[4]=a*E+o*V+l*q+u*j,s[8]=a*S+o*z+l*L+u*ne,s[12]=a*P+o*k+l*A+u*G,s[1]=c*M+d*R+f*N+h*Z,s[5]=c*E+d*V+f*q+h*j,s[9]=c*S+d*z+f*L+h*ne,s[13]=c*P+d*k+f*A+h*G,s[2]=p*M+m*R+v*N+g*Z,s[6]=p*E+m*V+v*q+g*j,s[10]=p*S+m*z+v*L+g*ne,s[14]=p*P+m*k+v*A+g*G,s[3]=b*M+y*R+x*N+T*Z,s[7]=b*E+y*V+x*q+T*j,s[11]=b*S+y*z+x*L+T*ne,s[15]=b*P+y*k+x*A+T*G,this}multiplyScalar(e){const n=this.elements;return n[0]*=e,n[4]*=e,n[8]*=e,n[12]*=e,n[1]*=e,n[5]*=e,n[9]*=e,n[13]*=e,n[2]*=e,n[6]*=e,n[10]*=e,n[14]*=e,n[3]*=e,n[7]*=e,n[11]*=e,n[15]*=e,this}determinant(){const e=this.elements,n=e[0],r=e[4],i=e[8],s=e[12],a=e[1],o=e[5],l=e[9],u=e[13],c=e[2],d=e[6],f=e[10],h=e[14],p=e[3],m=e[7],v=e[11],g=e[15];return p*(+s*l*d-i*u*d-s*o*f+r*u*f+i*o*h-r*l*h)+m*(+n*l*h-n*u*f+s*a*f-i*a*h+i*u*c-s*l*c)+v*(+n*u*d-n*o*h-s*a*d+r*a*h+s*o*c-r*u*c)+g*(-i*o*c-n*l*d+n*o*f+i*a*d-r*a*f+r*l*c)}transpose(){const e=this.elements;let n;return n=e[1],e[1]=e[4],e[4]=n,n=e[2],e[2]=e[8],e[8]=n,n=e[6],e[6]=e[9],e[9]=n,n=e[3],e[3]=e[12],e[12]=n,n=e[7],e[7]=e[13],e[13]=n,n=e[11],e[11]=e[14],e[14]=n,this}setPosition(e,n,r){const i=this.elements;return e.isVector3?(i[12]=e.x,i[13]=e.y,i[14]=e.z):(i[12]=e,i[13]=n,i[14]=r),this}invert(){const e=this.elements,n=e[0],r=e[1],i=e[2],s=e[3],a=e[4],o=e[5],l=e[6],u=e[7],c=e[8],d=e[9],f=e[10],h=e[11],p=e[12],m=e[13],v=e[14],g=e[15],b=d*v*u-m*f*u+m*l*h-o*v*h-d*l*g+o*f*g,y=p*f*u-c*v*u-p*l*h+a*v*h+c*l*g-a*f*g,x=c*m*u-p*d*u+p*o*h-a*m*h-c*o*g+a*d*g,T=p*d*l-c*m*l-p*o*f+a*m*f+c*o*v-a*d*v,M=n*b+r*y+i*x+s*T;if(M===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const E=1/M;return e[0]=b*E,e[1]=(m*f*s-d*v*s-m*i*h+r*v*h+d*i*g-r*f*g)*E,e[2]=(o*v*s-m*l*s+m*i*u-r*v*u-o*i*g+r*l*g)*E,e[3]=(d*l*s-o*f*s-d*i*u+r*f*u+o*i*h-r*l*h)*E,e[4]=y*E,e[5]=(c*v*s-p*f*s+p*i*h-n*v*h-c*i*g+n*f*g)*E,e[6]=(p*l*s-a*v*s-p*i*u+n*v*u+a*i*g-n*l*g)*E,e[7]=(a*f*s-c*l*s+c*i*u-n*f*u-a*i*h+n*l*h)*E,e[8]=x*E,e[9]=(p*d*s-c*m*s-p*r*h+n*m*h+c*r*g-n*d*g)*E,e[10]=(a*m*s-p*o*s+p*r*u-n*m*u-a*r*g+n*o*g)*E,e[11]=(c*o*s-a*d*s-c*r*u+n*d*u+a*r*h-n*o*h)*E,e[12]=T*E,e[13]=(c*m*i-p*d*i+p*r*f-n*m*f-c*r*v+n*d*v)*E,e[14]=(p*o*i-a*m*i-p*r*l+n*m*l+a*r*v-n*o*v)*E,e[15]=(a*d*i-c*o*i+c*r*l-n*d*l-a*r*f+n*o*f)*E,this}scale(e){const n=this.elements,r=e.x,i=e.y,s=e.z;return n[0]*=r,n[4]*=i,n[8]*=s,n[1]*=r,n[5]*=i,n[9]*=s,n[2]*=r,n[6]*=i,n[10]*=s,n[3]*=r,n[7]*=i,n[11]*=s,this}getMaxScaleOnAxis(){const e=this.elements,n=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],r=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],i=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(n,r,i))}makeTranslation(e,n,r){return this.set(1,0,0,e,0,1,0,n,0,0,1,r,0,0,0,1),this}makeRotationX(e){const n=Math.cos(e),r=Math.sin(e);return this.set(1,0,0,0,0,n,-r,0,0,r,n,0,0,0,0,1),this}makeRotationY(e){const n=Math.cos(e),r=Math.sin(e);return this.set(n,0,r,0,0,1,0,0,-r,0,n,0,0,0,0,1),this}makeRotationZ(e){const n=Math.cos(e),r=Math.sin(e);return this.set(n,-r,0,0,r,n,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,n){const r=Math.cos(n),i=Math.sin(n),s=1-r,a=e.x,o=e.y,l=e.z,u=s*a,c=s*o;return this.set(u*a+r,u*o-i*l,u*l+i*o,0,u*o+i*l,c*o+r,c*l-i*a,0,u*l-i*o,c*l+i*a,s*l*l+r,0,0,0,0,1),this}makeScale(e,n,r){return this.set(e,0,0,0,0,n,0,0,0,0,r,0,0,0,0,1),this}makeShear(e,n,r,i,s,a){return this.set(1,r,s,0,e,1,a,0,n,i,1,0,0,0,0,1),this}compose(e,n,r){const i=this.elements,s=n._x,a=n._y,o=n._z,l=n._w,u=s+s,c=a+a,d=o+o,f=s*u,h=s*c,p=s*d,m=a*c,v=a*d,g=o*d,b=l*u,y=l*c,x=l*d,T=r.x,M=r.y,E=r.z;return i[0]=(1-(m+g))*T,i[1]=(h+x)*T,i[2]=(p-y)*T,i[3]=0,i[4]=(h-x)*M,i[5]=(1-(f+g))*M,i[6]=(v+b)*M,i[7]=0,i[8]=(p+y)*E,i[9]=(v-b)*E,i[10]=(1-(f+m))*E,i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this}decompose(e,n,r){const i=this.elements;let s=sg.set(i[0],i[1],i[2]).length();const a=sg.set(i[4],i[5],i[6]).length(),o=sg.set(i[8],i[9],i[10]).length();this.determinant()<0&&(s=-s),e.x=i[12],e.y=i[13],e.z=i[14],ou.copy(this);const u=1/s,c=1/a,d=1/o;return ou.elements[0]*=u,ou.elements[1]*=u,ou.elements[2]*=u,ou.elements[4]*=c,ou.elements[5]*=c,ou.elements[6]*=c,ou.elements[8]*=d,ou.elements[9]*=d,ou.elements[10]*=d,n.setFromRotationMatrix(ou),r.x=s,r.y=a,r.z=o,this}makePerspective(e,n,r,i,s,a){a===void 0&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");const o=this.elements,l=2*s/(n-e),u=2*s/(r-i),c=(n+e)/(n-e),d=(r+i)/(r-i),f=-(a+s)/(a-s),h=-2*a*s/(a-s);return o[0]=l,o[4]=0,o[8]=c,o[12]=0,o[1]=0,o[5]=u,o[9]=d,o[13]=0,o[2]=0,o[6]=0,o[10]=f,o[14]=h,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this}makeOrthographic(e,n,r,i,s,a){const o=this.elements,l=1/(n-e),u=1/(r-i),c=1/(a-s),d=(n+e)*l,f=(r+i)*u,h=(a+s)*c;return o[0]=2*l,o[4]=0,o[8]=0,o[12]=-d,o[1]=0,o[5]=2*u,o[9]=0,o[13]=-f,o[2]=0,o[6]=0,o[10]=-2*c,o[14]=-h,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this}equals(e){const n=this.elements,r=e.elements;for(let i=0;i<16;i++)if(n[i]!==r[i])return!1;return!0}fromArray(e,n=0){for(let r=0;r<16;r++)this.elements[r]=e[r+n];return this}toArray(e=[],n=0){const r=this.elements;return e[n]=r[0],e[n+1]=r[1],e[n+2]=r[2],e[n+3]=r[3],e[n+4]=r[4],e[n+5]=r[5],e[n+6]=r[6],e[n+7]=r[7],e[n+8]=r[8],e[n+9]=r[9],e[n+10]=r[10],e[n+11]=r[11],e[n+12]=r[12],e[n+13]=r[13],e[n+14]=r[14],e[n+15]=r[15],e}}Be.prototype.isMatrix4=!0;const sg=new U,ou=new Be,SNe=new U(0,0,0),xNe=new U(1,1,1),ah=new U,w2=new U,Qo=new U,mZ=new Be,vZ=new Or;class ld{constructor(e=0,n=0,r=0,i=ld.DefaultOrder){this._x=e,this._y=n,this._z=r,this._order=i}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,n,r,i=this._order){return this._x=e,this._y=n,this._z=r,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,n=this._order,r=!0){const i=e.elements,s=i[0],a=i[4],o=i[8],l=i[1],u=i[5],c=i[9],d=i[2],f=i[6],h=i[10];switch(n){case"XYZ":this._y=Math.asin(Fi(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,h),this._z=Math.atan2(-a,s)):(this._x=Math.atan2(f,u),this._z=0);break;case"YXZ":this._x=Math.asin(-Fi(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(o,h),this._z=Math.atan2(l,u)):(this._y=Math.atan2(-d,s),this._z=0);break;case"ZXY":this._x=Math.asin(Fi(f,-1,1)),Math.abs(f)<.9999999?(this._y=Math.atan2(-d,h),this._z=Math.atan2(-a,u)):(this._y=0,this._z=Math.atan2(l,s));break;case"ZYX":this._y=Math.asin(-Fi(d,-1,1)),Math.abs(d)<.9999999?(this._x=Math.atan2(f,h),this._z=Math.atan2(l,s)):(this._x=0,this._z=Math.atan2(-a,u));break;case"YZX":this._z=Math.asin(Fi(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-c,u),this._y=Math.atan2(-d,s)):(this._x=0,this._y=Math.atan2(o,h));break;case"XZY":this._z=Math.asin(-Fi(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(f,u),this._y=Math.atan2(o,s)):(this._x=Math.atan2(-c,h),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+n)}return this._order=n,r===!0&&this._onChangeCallback(),this}setFromQuaternion(e,n,r){return mZ.makeRotationFromQuaternion(e),this.setFromRotationMatrix(mZ,n,r)}setFromVector3(e,n=this._order){return this.set(e.x,e.y,e.z,n)}reorder(e){return vZ.setFromEuler(this),this.setFromQuaternion(vZ,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],e[3]!==void 0&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],n=0){return e[n]=this._x,e[n+1]=this._y,e[n+2]=this._z,e[n+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}ld.prototype.isEuler=!0;ld.DefaultOrder="XYZ";ld.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];class qV{constructor(){this.mask=1}set(e){this.mask=(1<>>0}enable(e){this.mask|=1<1){for(let n=0;n1){for(let r=0;r0){i.children=[];for(let o=0;o0){i.animations=[];for(let o=0;o0&&(r.geometries=o),l.length>0&&(r.materials=l),u.length>0&&(r.textures=u),c.length>0&&(r.images=c),d.length>0&&(r.shapes=d),f.length>0&&(r.skeletons=f),h.length>0&&(r.animations=h),p.length>0&&(r.nodes=p)}return r.object=i,r;function a(o){const l=[];for(const u in o){const c=o[u];delete c.metadata,l.push(c)}return l}}clone(e){return new this.constructor().copy(this,e)}copy(e,n=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.userData=JSON.parse(JSON.stringify(e.userData)),n===!0)for(let r=0;r0?i.multiplyScalar(1/Math.sqrt(s)):i.set(0,0,0)}static getBarycoord(e,n,r,i,s){lu.subVectors(i,n),wd.subVectors(r,n),kk.subVectors(e,n);const a=lu.dot(lu),o=lu.dot(wd),l=lu.dot(kk),u=wd.dot(wd),c=wd.dot(kk),d=a*u-o*o;if(d===0)return s.set(-2,-1,-1);const f=1/d,h=(u*l-o*c)*f,p=(a*c-o*l)*f;return s.set(1-h-p,p,h)}static containsPoint(e,n,r,i){return this.getBarycoord(e,n,r,i,Ed),Ed.x>=0&&Ed.y>=0&&Ed.x+Ed.y<=1}static getUV(e,n,r,i,s,a,o,l){return this.getBarycoord(e,n,r,i,Ed),l.set(0,0),l.addScaledVector(s,Ed.x),l.addScaledVector(a,Ed.y),l.addScaledVector(o,Ed.z),l}static isFrontFacing(e,n,r,i){return lu.subVectors(r,n),wd.subVectors(e,n),lu.cross(wd).dot(i)<0}set(e,n,r){return this.a.copy(e),this.b.copy(n),this.c.copy(r),this}setFromPointsAndIndices(e,n,r,i){return this.a.copy(e[n]),this.b.copy(e[r]),this.c.copy(e[i]),this}setFromAttributeAndIndices(e,n,r,i){return this.a.fromBufferAttribute(e,n),this.b.fromBufferAttribute(e,r),this.c.fromBufferAttribute(e,i),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return lu.subVectors(this.c,this.b),wd.subVectors(this.a,this.b),lu.cross(wd).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return Wr.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,n){return Wr.getBarycoord(e,this.a,this.b,this.c,n)}getUV(e,n,r,i,s){return Wr.getUV(e,this.a,this.b,this.c,n,r,i,s)}containsPoint(e){return Wr.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return Wr.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,n){const r=this.a,i=this.b,s=this.c;let a,o;og.subVectors(i,r),lg.subVectors(s,r),Ok.subVectors(e,r);const l=og.dot(Ok),u=lg.dot(Ok);if(l<=0&&u<=0)return n.copy(r);Ik.subVectors(e,i);const c=og.dot(Ik),d=lg.dot(Ik);if(c>=0&&d<=c)return n.copy(i);const f=l*d-c*u;if(f<=0&&l>=0&&c<=0)return a=l/(l-c),n.copy(r).addScaledVector(og,a);Uk.subVectors(e,s);const h=og.dot(Uk),p=lg.dot(Uk);if(p>=0&&h<=p)return n.copy(s);const m=h*u-l*p;if(m<=0&&u>=0&&p<=0)return o=u/(u-p),n.copy(r).addScaledVector(lg,o);const v=c*p-h*d;if(v<=0&&d-c>=0&&h-p>=0)return TZ.subVectors(s,i),o=(d-c)/(d-c+(h-p)),n.copy(i).addScaledVector(TZ,o);const g=1/(v+m+f);return a=m*g,o=f*g,n.copy(r).addScaledVector(og,a).addScaledVector(lg,o)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}let PNe=0;class Ji extends tm{constructor(){super(),Object.defineProperty(this,"id",{value:PNe++}),this.uuid=hl(),this.name="",this.type="Material",this.blending=Mv,this.side=Ki,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=pK,this.blendDst=mK,this.blendEquation=Eu,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=rP,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=d6,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=M7,this.stencilZFail=M7,this.stencilZPass=M7,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(e){this._alphaTest>0!=e>0&&this.version++,this._alphaTest=e}onBuild(){}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(const n in e){const r=e[n];if(r===void 0){console.warn("THREE.Material: '"+n+"' parameter is undefined.");continue}if(n==="shading"){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=r===fK;continue}const i=this[n];if(i===void 0){console.warn("THREE."+this.type+": '"+n+"' is not a property of this material.");continue}i&&i.isColor?i.set(r):i&&i.isVector3&&r&&r.isVector3?i.copy(r):this[n]=r}}toJSON(e){const n=e===void 0||typeof e=="string";n&&(e={textures:{},images:{}});const r={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};r.uuid=this.uuid,r.type=this.type,this.name!==""&&(r.name=this.name),this.color&&this.color.isColor&&(r.color=this.color.getHex()),this.roughness!==void 0&&(r.roughness=this.roughness),this.metalness!==void 0&&(r.metalness=this.metalness),this.sheen!==void 0&&(r.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(r.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(r.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(r.emissive=this.emissive.getHex()),this.emissiveIntensity&&this.emissiveIntensity!==1&&(r.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(r.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(r.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(r.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(r.shininess=this.shininess),this.clearcoat!==void 0&&(r.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(r.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(r.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(r.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(r.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,r.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(r.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(r.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(r.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(r.lightMap=this.lightMap.toJSON(e).uuid,r.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(r.aoMap=this.aoMap.toJSON(e).uuid,r.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(r.bumpMap=this.bumpMap.toJSON(e).uuid,r.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(r.normalMap=this.normalMap.toJSON(e).uuid,r.normalMapType=this.normalMapType,r.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(r.displacementMap=this.displacementMap.toJSON(e).uuid,r.displacementScale=this.displacementScale,r.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(r.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(r.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(r.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(r.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(r.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(r.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(r.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(r.combine=this.combine)),this.envMapIntensity!==void 0&&(r.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(r.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(r.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(r.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(r.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(r.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(r.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(r.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&(r.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(r.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(r.size=this.size),this.shadowSide!==null&&(r.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(r.sizeAttenuation=this.sizeAttenuation),this.blending!==Mv&&(r.blending=this.blending),this.side!==Ki&&(r.side=this.side),this.vertexColors&&(r.vertexColors=!0),this.opacity<1&&(r.opacity=this.opacity),this.transparent===!0&&(r.transparent=this.transparent),r.depthFunc=this.depthFunc,r.depthTest=this.depthTest,r.depthWrite=this.depthWrite,r.colorWrite=this.colorWrite,r.stencilWrite=this.stencilWrite,r.stencilWriteMask=this.stencilWriteMask,r.stencilFunc=this.stencilFunc,r.stencilRef=this.stencilRef,r.stencilFuncMask=this.stencilFuncMask,r.stencilFail=this.stencilFail,r.stencilZFail=this.stencilZFail,r.stencilZPass=this.stencilZPass,this.rotation!==void 0&&this.rotation!==0&&(r.rotation=this.rotation),this.polygonOffset===!0&&(r.polygonOffset=!0),this.polygonOffsetFactor!==0&&(r.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(r.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(r.linewidth=this.linewidth),this.dashSize!==void 0&&(r.dashSize=this.dashSize),this.gapSize!==void 0&&(r.gapSize=this.gapSize),this.scale!==void 0&&(r.scale=this.scale),this.dithering===!0&&(r.dithering=!0),this.alphaTest>0&&(r.alphaTest=this.alphaTest),this.alphaToCoverage===!0&&(r.alphaToCoverage=this.alphaToCoverage),this.premultipliedAlpha===!0&&(r.premultipliedAlpha=this.premultipliedAlpha),this.wireframe===!0&&(r.wireframe=this.wireframe),this.wireframeLinewidth>1&&(r.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(r.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(r.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(r.flatShading=this.flatShading),this.visible===!1&&(r.visible=!1),this.toneMapped===!1&&(r.toneMapped=!1),this.fog===!1&&(r.fog=!1),JSON.stringify(this.userData)!=="{}"&&(r.userData=this.userData);function i(s){const a=[];for(const o in s){const l=s[o];delete l.metadata,a.push(l)}return a}if(n){const s=i(e.textures),a=i(e.images);s.length>0&&(r.textures=s),a.length>0&&(r.images=a)}return r}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const n=e.clippingPlanes;let r=null;if(n!==null){const i=n.length;r=new Array(i);for(let s=0;s!==i;++s)r[s]=n[s].clone()}return this.clippingPlanes=r,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){e===!0&&this.version++}}Ji.prototype.isMaterial=!0;Ji.fromType=function(){return null};class ho extends Ji{constructor(e){super(),this.type="MeshBasicMaterial",this.color=new tt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=yT,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}ho.prototype.isMeshBasicMaterial=!0;const Qi=new U,M2=new Oe;class un{constructor(e,n,r){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="",this.array=e,this.itemSize=n,this.count=e!==void 0?e.length/n:0,this.normalized=r===!0,this.usage=mb,this.updateRange={offset:0,count:-1},this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this}copyAt(e,n,r){e*=this.itemSize,r*=n.itemSize;for(let i=0,s=this.itemSize;i0&&(e.userData=this.userData),this.parameters!==void 0){const l=this.parameters;for(const u in l)l[u]!==void 0&&(e[u]=l[u]);return e}e.data={attributes:{}};const n=this.index;n!==null&&(e.data.index={type:n.array.constructor.name,array:Array.prototype.slice.call(n.array)});const r=this.attributes;for(const l in r){const u=r[l];e.data.attributes[l]=u.toJSON(e.data)}const i={};let s=!1;for(const l in this.morphAttributes){const u=this.morphAttributes[l],c=[];for(let d=0,f=u.length;d0&&(i[l]=c,s=!0)}s&&(e.data.morphAttributes=i,e.data.morphTargetsRelative=this.morphTargetsRelative);const a=this.groups;a.length>0&&(e.data.groups=JSON.parse(JSON.stringify(a)));const o=this.boundingSphere;return o!==null&&(e.data.boundingSphere={center:o.center.toArray(),radius:o.radius}),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const n={};this.name=e.name;const r=e.index;r!==null&&this.setIndex(r.clone(n));const i=e.attributes;for(const u in i){const c=i[u];this.setAttribute(u,c.clone(n))}const s=e.morphAttributes;for(const u in s){const c=[],d=s[u];for(let f=0,h=d.length;f0){const i=n[r[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let s=0,a=i.length;s0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}raycast(e,n){const r=this.geometry,i=this.material,s=this.matrixWorld;if(i===void 0||(r.boundingSphere===null&&r.computeBoundingSphere(),Lk.copy(r.boundingSphere),Lk.applyMatrix4(s),e.ray.intersectsSphere(Lk)===!1)||(wZ.copy(s).invert(),cg.copy(e.ray).applyMatrix4(wZ),r.boundingBox!==null&&cg.intersectsBox(r.boundingBox)===!1))return;let a;if(r.isBufferGeometry){const o=r.index,l=r.attributes.position,u=r.morphAttributes.position,c=r.morphTargetsRelative,d=r.attributes.uv,f=r.attributes.uv2,h=r.groups,p=r.drawRange;if(o!==null)if(Array.isArray(i))for(let m=0,v=h.length;mn.far?null:{distance:u,point:I2.clone(),object:t}}function U2(t,e,n,r,i,s,a,o,l,u,c,d){oh.fromBufferAttribute(i,u),lh.fromBufferAttribute(i,c),uh.fromBufferAttribute(i,d);const f=t.morphTargetInfluences;if(s&&f){P2.set(0,0,0),R2.set(0,0,0),V2.set(0,0,0);for(let p=0,m=s.length;p0?1:-1,c.push(j.x,j.y,j.z),d.push(B/E),d.push(1-ne/S),A+=1}}for(let ne=0;ne>8&255]+Ys[t>>16&255]+Ys[t>>24&255]+"-"+Ys[e&255]+Ys[e>>8&255]+"-"+Ys[e>>16&15|64]+Ys[e>>24&255]+"-"+Ys[n&63|128]+Ys[n>>8&255]+"-"+Ys[n>>16&255]+Ys[n>>24&255]+Ys[r&255]+Ys[r>>8&255]+Ys[r>>16&255]+Ys[r>>24&255]).toLowerCase()}function Fi(t,e,n){return Math.max(e,Math.min(n,t))}function TK(t,e){return(t%e+e)%e}function rNe(t,e,n,r,i){return r+(t-e)*(i-r)/(n-e)}function iNe(t,e,n){return t!==e?(n-t)/(e-t):0}function rx(t,e,n){return(1-n)*t+n*e}function sNe(t,e,n,r){return rx(t,e,1-Math.exp(-n*r))}function aNe(t,e=1){return e-Math.abs(TK(t,e*2)-e)}function oNe(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e),t*t*(3-2*t))}function lNe(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e),t*t*t*(t*(t*6-15)+10))}function uNe(t,e){return t+Math.floor(Math.random()*(e-t+1))}function cNe(t,e){return t+Math.random()*(e-t)}function dNe(t){return t*(.5-Math.random())}function fNe(t){t!==void 0&&(cZ=t);let e=cZ+=1831565813;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}function hNe(t){return t*Rv}function pNe(t){return t*d6}function ZL(t){return(t&t-1)===0&&t!==0}function mce(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function aP(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}function mNe(t,e,n,r,i){const s=Math.cos,a=Math.sin,o=s(n/2),l=a(n/2),u=s((e+r)/2),c=a((e+r)/2),d=s((e-r)/2),f=a((e-r)/2),h=s((r-e)/2),p=a((r-e)/2);switch(i){case"XYX":t.set(o*c,l*d,l*f,o*u);break;case"YZY":t.set(l*f,o*c,l*d,o*u);break;case"ZXZ":t.set(l*d,l*f,o*c,o*u);break;case"XZX":t.set(o*c,l*p,l*h,o*u);break;case"YXY":t.set(l*h,o*c,l*p,o*u);break;case"ZYZ":t.set(l*p,l*h,o*c,o*u);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+i)}}function vNe(t,e){switch(e.constructor){case Float32Array:return t;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function gNe(t,e){switch(e.constructor){case Float32Array:return t;case Uint16Array:return Math.round(t*65535);case Uint8Array:return Math.round(t*255);case Int16Array:return Math.round(t*32767);case Int8Array:return Math.round(t*127);default:throw new Error("Invalid component type.")}}var fp=Object.freeze({__proto__:null,DEG2RAD:Rv,RAD2DEG:d6,generateUUID:fl,clamp:Fi,euclideanModulo:TK,mapLinear:rNe,inverseLerp:iNe,lerp:rx,damp:sNe,pingpong:aNe,smoothstep:oNe,smootherstep:lNe,randInt:uNe,randFloat:cNe,randFloatSpread:dNe,seededRandom:fNe,degToRad:hNe,radToDeg:pNe,isPowerOfTwo:ZL,ceilPowerOfTwo:mce,floorPowerOfTwo:aP,setQuaternionFromProperEuler:mNe,normalize:gNe,denormalize:vNe});class Oe{constructor(e=0,n=0){this.x=e,this.y=n}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,n){return this.x=e,this.y=n,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e,n){return n!==void 0?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,n)):(this.x+=e.x,this.y+=e.y,this)}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this}sub(e,n){return n!==void 0?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,n)):(this.x-=e.x,this.y-=e.y,this)}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const n=this.x,r=this.y,i=e.elements;return this.x=i[0]*n+i[3]*r+i[6],this.y=i[1]*n+i[4]*r+i[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,n){return this.x=Math.max(e.x,Math.min(n.x,this.x)),this.y=Math.max(e.y,Math.min(n.y,this.y)),this}clampScalar(e,n){return this.x=Math.max(e,Math.min(n,this.x)),this.y=Math.max(e,Math.min(n,this.y)),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(n,r)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const n=this.x-e.x,r=this.y-e.y;return n*n+r*r}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e}fromBufferAttribute(e,n,r){return r!==void 0&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(n),this.y=e.getY(n),this}rotateAround(e,n){const r=Math.cos(n),i=Math.sin(n),s=this.x-e.x,a=this.y-e.y;return this.x=s*r-a*i+e.x,this.y=s*i+a*r+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}Oe.prototype.isVector2=!0;class as{constructor(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}set(e,n,r,i,s,a,o,l,u){const c=this.elements;return c[0]=e,c[1]=i,c[2]=o,c[3]=n,c[4]=s,c[5]=l,c[6]=r,c[7]=a,c[8]=u,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const n=this.elements,r=e.elements;return n[0]=r[0],n[1]=r[1],n[2]=r[2],n[3]=r[3],n[4]=r[4],n[5]=r[5],n[6]=r[6],n[7]=r[7],n[8]=r[8],this}extractBasis(e,n,r){return e.setFromMatrix3Column(this,0),n.setFromMatrix3Column(this,1),r.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const n=e.elements;return this.set(n[0],n[4],n[8],n[1],n[5],n[9],n[2],n[6],n[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,n){const r=e.elements,i=n.elements,s=this.elements,a=r[0],o=r[3],l=r[6],u=r[1],c=r[4],d=r[7],f=r[2],h=r[5],p=r[8],m=i[0],v=i[3],g=i[6],b=i[1],y=i[4],x=i[7],T=i[2],M=i[5],E=i[8];return s[0]=a*m+o*b+l*T,s[3]=a*v+o*y+l*M,s[6]=a*g+o*x+l*E,s[1]=u*m+c*b+d*T,s[4]=u*v+c*y+d*M,s[7]=u*g+c*x+d*E,s[2]=f*m+h*b+p*T,s[5]=f*v+h*y+p*M,s[8]=f*g+h*x+p*E,this}multiplyScalar(e){const n=this.elements;return n[0]*=e,n[3]*=e,n[6]*=e,n[1]*=e,n[4]*=e,n[7]*=e,n[2]*=e,n[5]*=e,n[8]*=e,this}determinant(){const e=this.elements,n=e[0],r=e[1],i=e[2],s=e[3],a=e[4],o=e[5],l=e[6],u=e[7],c=e[8];return n*a*c-n*o*u-r*s*c+r*o*l+i*s*u-i*a*l}invert(){const e=this.elements,n=e[0],r=e[1],i=e[2],s=e[3],a=e[4],o=e[5],l=e[6],u=e[7],c=e[8],d=c*a-o*u,f=o*l-c*s,h=u*s-a*l,p=n*d+r*f+i*h;if(p===0)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return e[0]=d*m,e[1]=(i*u-c*r)*m,e[2]=(o*r-i*a)*m,e[3]=f*m,e[4]=(c*n-i*l)*m,e[5]=(i*s-o*n)*m,e[6]=h*m,e[7]=(r*l-u*n)*m,e[8]=(a*n-r*s)*m,this}transpose(){let e;const n=this.elements;return e=n[1],n[1]=n[3],n[3]=e,e=n[2],n[2]=n[6],n[6]=e,e=n[5],n[5]=n[7],n[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const n=this.elements;return e[0]=n[0],e[1]=n[3],e[2]=n[6],e[3]=n[1],e[4]=n[4],e[5]=n[7],e[6]=n[2],e[7]=n[5],e[8]=n[8],this}setUvTransform(e,n,r,i,s,a,o){const l=Math.cos(s),u=Math.sin(s);return this.set(r*l,r*u,-r*(l*a+u*o)+a+e,-i*u,i*l,-i*(-u*a+l*o)+o+n,0,0,1),this}scale(e,n){const r=this.elements;return r[0]*=e,r[3]*=e,r[6]*=e,r[1]*=n,r[4]*=n,r[7]*=n,this}rotate(e){const n=Math.cos(e),r=Math.sin(e),i=this.elements,s=i[0],a=i[3],o=i[6],l=i[1],u=i[4],c=i[7];return i[0]=n*s+r*l,i[3]=n*a+r*u,i[6]=n*o+r*c,i[1]=-r*s+n*l,i[4]=-r*a+n*u,i[7]=-r*o+n*c,this}translate(e,n){const r=this.elements;return r[0]+=e*r[2],r[3]+=e*r[5],r[6]+=e*r[8],r[1]+=n*r[2],r[4]+=n*r[5],r[7]+=n*r[8],this}equals(e){const n=this.elements,r=e.elements;for(let i=0;i<9;i++)if(n[i]!==r[i])return!1;return!0}fromArray(e,n=0){for(let r=0;r<9;r++)this.elements[r]=e[r+n];return this}toArray(e=[],n=0){const r=this.elements;return e[n]=r[0],e[n+1]=r[1],e[n+2]=r[2],e[n+3]=r[3],e[n+4]=r[4],e[n+5]=r[5],e[n+6]=r[6],e[n+7]=r[7],e[n+8]=r[8],e}clone(){return new this.constructor().fromArray(this.elements)}}as.prototype.isMatrix3=!0;function vce(t){for(let e=t.length-1;e>=0;--e)if(t[e]>65535)return!0;return!1}const bNe={Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array};function c1(t,e){return new bNe[t](e)}function f6(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function Vv(t){return t<.04045?t*.0773993808:Math.pow(t*.9478672986+.0521327014,2.4)}function P7(t){return t<.0031308?t*12.92:1.055*Math.pow(t,.41666)-.055}const Sk={[Pc]:{[Yh]:Vv},[Yh]:{[Pc]:P7}},Xl={legacyMode:!0,get workingColorSpace(){return Yh},set workingColorSpace(t){console.warn("THREE.ColorManagement: .workingColorSpace is readonly.")},convert:function(t,e,n){if(this.legacyMode||e===n||!e||!n)return t;if(Sk[e]&&Sk[e][n]!==void 0){const r=Sk[e][n];return t.r=r(t.r),t.g=r(t.g),t.b=r(t.b),t}throw new Error("Unsupported color space conversion.")},fromWorkingColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},toWorkingColorSpace:function(t,e){return this.convert(t,e,this.workingColorSpace)}},gce={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},hs={r:0,g:0,b:0},au={h:0,s:0,l:0},v2={h:0,s:0,l:0};function xk(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+(e-t)*6*n:n<1/2?e:n<2/3?t+(e-t)*6*(2/3-n):t}function g2(t,e){return e.r=t.r,e.g=t.g,e.b=t.b,e}let tt=class{constructor(e,n,r){return n===void 0&&r===void 0?this.set(e):this.setRGB(e,n,r)}set(e){return e&&e.isColor?this.copy(e):typeof e=="number"?this.setHex(e):typeof e=="string"&&this.setStyle(e),this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,n=Pc){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,Xl.toWorkingColorSpace(this,n),this}setRGB(e,n,r,i=Yh){return this.r=e,this.g=n,this.b=r,Xl.toWorkingColorSpace(this,i),this}setHSL(e,n,r,i=Yh){if(e=TK(e,1),n=Fi(n,0,1),r=Fi(r,0,1),n===0)this.r=this.g=this.b=r;else{const s=r<=.5?r*(1+n):r+n-r*n,a=2*r-s;this.r=xk(a,s,e+1/3),this.g=xk(a,s,e),this.b=xk(a,s,e-1/3)}return Xl.toWorkingColorSpace(this,i),this}setStyle(e,n=Pc){function r(s){s!==void 0&&parseFloat(s)<1&&console.warn("THREE.Color: Alpha component of "+e+" will be ignored.")}let i;if(i=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(e)){let s;const a=i[1],o=i[2];switch(a){case"rgb":case"rgba":if(s=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return this.r=Math.min(255,parseInt(s[1],10))/255,this.g=Math.min(255,parseInt(s[2],10))/255,this.b=Math.min(255,parseInt(s[3],10))/255,Xl.toWorkingColorSpace(this,n),r(s[4]),this;if(s=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return this.r=Math.min(100,parseInt(s[1],10))/100,this.g=Math.min(100,parseInt(s[2],10))/100,this.b=Math.min(100,parseInt(s[3],10))/100,Xl.toWorkingColorSpace(this,n),r(s[4]),this;break;case"hsl":case"hsla":if(s=/^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o)){const l=parseFloat(s[1])/360,u=parseInt(s[2],10)/100,c=parseInt(s[3],10)/100;return r(s[4]),this.setHSL(l,u,c,n)}break}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(e)){const s=i[1],a=s.length;if(a===3)return this.r=parseInt(s.charAt(0)+s.charAt(0),16)/255,this.g=parseInt(s.charAt(1)+s.charAt(1),16)/255,this.b=parseInt(s.charAt(2)+s.charAt(2),16)/255,Xl.toWorkingColorSpace(this,n),this;if(a===6)return this.r=parseInt(s.charAt(0)+s.charAt(1),16)/255,this.g=parseInt(s.charAt(2)+s.charAt(3),16)/255,this.b=parseInt(s.charAt(4)+s.charAt(5),16)/255,Xl.toWorkingColorSpace(this,n),this}return e&&e.length>0?this.setColorName(e,n):this}setColorName(e,n=Pc){const r=gce[e.toLowerCase()];return r!==void 0?this.setHex(r,n):console.warn("THREE.Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=Vv(e.r),this.g=Vv(e.g),this.b=Vv(e.b),this}copyLinearToSRGB(e){return this.r=P7(e.r),this.g=P7(e.g),this.b=P7(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=Pc){return Xl.fromWorkingColorSpace(g2(this,hs),e),Fi(hs.r*255,0,255)<<16^Fi(hs.g*255,0,255)<<8^Fi(hs.b*255,0,255)<<0}getHexString(e=Pc){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,n=Yh){Xl.fromWorkingColorSpace(g2(this,hs),n);const r=hs.r,i=hs.g,s=hs.b,a=Math.max(r,i,s),o=Math.min(r,i,s);let l,u;const c=(o+a)/2;if(o===a)l=0,u=0;else{const d=a-o;switch(u=c<=.5?d/(a+o):d/(2-a-o),a){case r:l=(i-s)/d+(i"u")return e.src;let n;if(e instanceof HTMLCanvasElement)n=e;else{tg===void 0&&(tg=f6("canvas")),tg.width=e.width,tg.height=e.height;const r=tg.getContext("2d");e instanceof ImageData?r.putImageData(e,0,0):r.drawImage(e,0,0,e.width,e.height),n=tg}return n.width>2048||n.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",e),n.toDataURL("image/jpeg",.6)):n.toDataURL("image/png")}static sRGBToLinear(e){if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&e instanceof ImageBitmap){const n=f6("canvas");n.width=e.width,n.height=e.height;const r=n.getContext("2d");r.drawImage(e,0,0,e.width,e.height);const i=r.getImageData(0,0,e.width,e.height),s=i.data;for(let a=0;a1)switch(this.wrapS){case yf:e.x=e.x-Math.floor(e.x);break;case _a:e.x=e.x<0?0:1;break;case a6:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case yf:e.y=e.y-Math.floor(e.y);break;case _a:e.y=e.y<0?0:1;break;case a6:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}}Di.DEFAULT_IMAGE=null;Di.DEFAULT_MAPPING=XV;Di.prototype.isTexture=!0;class Qt{constructor(e=0,n=0,r=0,i=1){this.x=e,this.y=n,this.z=r,this.w=i}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,n,r,i){return this.x=e,this.y=n,this.z=r,this.w=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;case 2:this.z=n;break;case 3:this.w=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w!==void 0?e.w:1,this}add(e,n){return n!==void 0?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,n)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this)}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this.z=e.z+n.z,this.w=e.w+n.w,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this.z+=e.z*n,this.w+=e.w*n,this}sub(e,n){return n!==void 0?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,n)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this)}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this.w=e.w-n.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const n=this.x,r=this.y,i=this.z,s=this.w,a=e.elements;return this.x=a[0]*n+a[4]*r+a[8]*i+a[12]*s,this.y=a[1]*n+a[5]*r+a[9]*i+a[13]*s,this.z=a[2]*n+a[6]*r+a[10]*i+a[14]*s,this.w=a[3]*n+a[7]*r+a[11]*i+a[15]*s,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const n=Math.sqrt(1-e.w*e.w);return n<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/n,this.y=e.y/n,this.z=e.z/n),this}setAxisAngleFromRotationMatrix(e){let n,r,i,s;const l=e.elements,u=l[0],c=l[4],d=l[8],f=l[1],h=l[5],p=l[9],m=l[2],v=l[6],g=l[10];if(Math.abs(c-f)<.01&&Math.abs(d-m)<.01&&Math.abs(p-v)<.01){if(Math.abs(c+f)<.1&&Math.abs(d+m)<.1&&Math.abs(p+v)<.1&&Math.abs(u+h+g-3)<.1)return this.set(1,0,0,0),this;n=Math.PI;const y=(u+1)/2,x=(h+1)/2,T=(g+1)/2,M=(c+f)/4,E=(d+m)/4,S=(p+v)/4;return y>x&&y>T?y<.01?(r=0,i=.707106781,s=.707106781):(r=Math.sqrt(y),i=M/r,s=E/r):x>T?x<.01?(r=.707106781,i=0,s=.707106781):(i=Math.sqrt(x),r=M/i,s=S/i):T<.01?(r=.707106781,i=.707106781,s=0):(s=Math.sqrt(T),r=E/s,i=S/s),this.set(r,i,s,n),this}let b=Math.sqrt((v-p)*(v-p)+(d-m)*(d-m)+(f-c)*(f-c));return Math.abs(b)<.001&&(b=1),this.x=(v-p)/b,this.y=(d-m)/b,this.z=(f-c)/b,this.w=Math.acos((u+h+g-1)/2),this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,n){return this.x=Math.max(e.x,Math.min(n.x,this.x)),this.y=Math.max(e.y,Math.min(n.y,this.y)),this.z=Math.max(e.z,Math.min(n.z,this.z)),this.w=Math.max(e.w,Math.min(n.w,this.w)),this}clampScalar(e,n){return this.x=Math.max(e,Math.min(n,this.x)),this.y=Math.max(e,Math.min(n,this.y)),this.z=Math.max(e,Math.min(n,this.z)),this.w=Math.max(e,Math.min(n,this.w)),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(n,r)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this.z+=(e.z-this.z)*n,this.w+=(e.w-this.w)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this.z=e.z+(n.z-e.z)*r,this.w=e.w+(n.w-e.w)*r,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this.z=e[n+2],this.w=e[n+3],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e[n+2]=this.z,e[n+3]=this.w,e}fromBufferAttribute(e,n,r){return r!==void 0&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(n),this.y=e.getY(n),this.z=e.getZ(n),this.w=e.getW(n),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}Qt.prototype.isVector4=!0;class oi extends tm{constructor(e,n,r={}){super(),this.width=e,this.height=n,this.depth=1,this.scissor=new Qt(0,0,e,n),this.scissorTest=!1,this.viewport=new Qt(0,0,e,n);const i={width:e,height:n,depth:1};this.texture=new Di(i,r.mapping,r.wrapS,r.wrapT,r.magFilter,r.minFilter,r.format,r.type,r.anisotropy,r.encoding),this.texture.isRenderTargetTexture=!0,this.texture.flipY=!1,this.texture.generateMipmaps=r.generateMipmaps!==void 0?r.generateMipmaps:!1,this.texture.internalFormat=r.internalFormat!==void 0?r.internalFormat:null,this.texture.minFilter=r.minFilter!==void 0?r.minFilter:Hn,this.depthBuffer=r.depthBuffer!==void 0?r.depthBuffer:!0,this.stencilBuffer=r.stencilBuffer!==void 0?r.stencilBuffer:!1,this.depthTexture=r.depthTexture!==void 0?r.depthTexture:null,this.samples=r.samples!==void 0?r.samples:0}setSize(e,n,r=1){(this.width!==e||this.height!==n||this.depth!==r)&&(this.width=e,this.height=n,this.depth=r,this.texture.image.width=e,this.texture.image.height=n,this.texture.image.depth=r,this.dispose()),this.viewport.set(0,0,e,n),this.scissor.set(0,0,e,n)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.viewport.copy(e.viewport),this.texture=e.texture.clone(),this.texture.isRenderTargetTexture=!0;const n=Object.assign({},e.texture.image);return this.texture.source=new Bh(n),this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,e.depthTexture!==null&&(this.depthTexture=e.depthTexture.clone()),this.samples=e.samples,this}dispose(){this.dispatchEvent({type:"dispose"})}}oi.prototype.isWebGLRenderTarget=!0;class fy extends Di{constructor(e=null,n=1,r=1,i=1){super(null),this.image={data:e,width:n,height:r,depth:i},this.magFilter=Ir,this.minFilter=Ir,this.wrapR=_a,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}fy.prototype.isDataArrayTexture=!0;class bce extends oi{constructor(e,n,r){super(e,n),this.depth=r,this.texture=new fy(null,e,n,r),this.texture.isRenderTargetTexture=!0}}bce.prototype.isWebGLArrayRenderTarget=!0;class xT extends Di{constructor(e=null,n=1,r=1,i=1){super(null),this.image={data:e,width:n,height:r,depth:i},this.magFilter=Ir,this.minFilter=Ir,this.wrapR=_a,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}xT.prototype.isData3DTexture=!0;class yce extends oi{constructor(e,n,r){super(e,n),this.depth=r,this.texture=new xT(null,e,n,r),this.texture.isRenderTargetTexture=!0}}yce.prototype.isWebGL3DRenderTarget=!0;class Sce extends oi{constructor(e,n,r,i={}){super(e,n,i);const s=this.texture;this.texture=[];for(let a=0;a=0?1:-1,y=1-g*g;if(y>Number.EPSILON){const T=Math.sqrt(y),M=Math.atan2(T,g*b);v=Math.sin(v*M)/T,o=Math.sin(o*M)/T}const x=o*b;if(l=l*v+f*x,u=u*v+h*x,c=c*v+p*x,d=d*v+m*x,v===1-o){const T=1/Math.sqrt(l*l+u*u+c*c+d*d);l*=T,u*=T,c*=T,d*=T}}e[n]=l,e[n+1]=u,e[n+2]=c,e[n+3]=d}static multiplyQuaternionsFlat(e,n,r,i,s,a){const o=r[i],l=r[i+1],u=r[i+2],c=r[i+3],d=s[a],f=s[a+1],h=s[a+2],p=s[a+3];return e[n]=o*p+c*d+l*h-u*f,e[n+1]=l*p+c*f+u*d-o*h,e[n+2]=u*p+c*h+o*f-l*d,e[n+3]=c*p-o*d-l*f-u*h,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,n,r,i){return this._x=e,this._y=n,this._z=r,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,n){if(!(e&&e.isEuler))throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");const r=e._x,i=e._y,s=e._z,a=e._order,o=Math.cos,l=Math.sin,u=o(r/2),c=o(i/2),d=o(s/2),f=l(r/2),h=l(i/2),p=l(s/2);switch(a){case"XYZ":this._x=f*c*d+u*h*p,this._y=u*h*d-f*c*p,this._z=u*c*p+f*h*d,this._w=u*c*d-f*h*p;break;case"YXZ":this._x=f*c*d+u*h*p,this._y=u*h*d-f*c*p,this._z=u*c*p-f*h*d,this._w=u*c*d+f*h*p;break;case"ZXY":this._x=f*c*d-u*h*p,this._y=u*h*d+f*c*p,this._z=u*c*p+f*h*d,this._w=u*c*d-f*h*p;break;case"ZYX":this._x=f*c*d-u*h*p,this._y=u*h*d+f*c*p,this._z=u*c*p-f*h*d,this._w=u*c*d+f*h*p;break;case"YZX":this._x=f*c*d+u*h*p,this._y=u*h*d+f*c*p,this._z=u*c*p-f*h*d,this._w=u*c*d-f*h*p;break;case"XZY":this._x=f*c*d-u*h*p,this._y=u*h*d-f*c*p,this._z=u*c*p+f*h*d,this._w=u*c*d+f*h*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+a)}return n!==!1&&this._onChangeCallback(),this}setFromAxisAngle(e,n){const r=n/2,i=Math.sin(r);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(r),this._onChangeCallback(),this}setFromRotationMatrix(e){const n=e.elements,r=n[0],i=n[4],s=n[8],a=n[1],o=n[5],l=n[9],u=n[2],c=n[6],d=n[10],f=r+o+d;if(f>0){const h=.5/Math.sqrt(f+1);this._w=.25/h,this._x=(c-l)*h,this._y=(s-u)*h,this._z=(a-i)*h}else if(r>o&&r>d){const h=2*Math.sqrt(1+r-o-d);this._w=(c-l)/h,this._x=.25*h,this._y=(i+a)/h,this._z=(s+u)/h}else if(o>d){const h=2*Math.sqrt(1+o-r-d);this._w=(s-u)/h,this._x=(i+a)/h,this._y=.25*h,this._z=(l+c)/h}else{const h=2*Math.sqrt(1+d-r-o);this._w=(a-i)/h,this._x=(s+u)/h,this._y=(l+c)/h,this._z=.25*h}return this._onChangeCallback(),this}setFromUnitVectors(e,n){let r=e.dot(n)+1;return rMath.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=r):(this._x=0,this._y=-e.z,this._z=e.y,this._w=r)):(this._x=e.y*n.z-e.z*n.y,this._y=e.z*n.x-e.x*n.z,this._z=e.x*n.y-e.y*n.x,this._w=r),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(Fi(this.dot(e),-1,1)))}rotateTowards(e,n){const r=this.angleTo(e);if(r===0)return this;const i=Math.min(1,n/r);return this.slerp(e,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e,n){return n!==void 0?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(e,n)):this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,n){const r=e._x,i=e._y,s=e._z,a=e._w,o=n._x,l=n._y,u=n._z,c=n._w;return this._x=r*c+a*o+i*u-s*l,this._y=i*c+a*l+s*o-r*u,this._z=s*c+a*u+r*l-i*o,this._w=a*c-r*o-i*l-s*u,this._onChangeCallback(),this}slerp(e,n){if(n===0)return this;if(n===1)return this.copy(e);const r=this._x,i=this._y,s=this._z,a=this._w;let o=a*e._w+r*e._x+i*e._y+s*e._z;if(o<0?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,o=-o):this.copy(e),o>=1)return this._w=a,this._x=r,this._y=i,this._z=s,this;const l=1-o*o;if(l<=Number.EPSILON){const h=1-n;return this._w=h*a+n*this._w,this._x=h*r+n*this._x,this._y=h*i+n*this._y,this._z=h*s+n*this._z,this.normalize(),this._onChangeCallback(),this}const u=Math.sqrt(l),c=Math.atan2(u,o),d=Math.sin((1-n)*c)/u,f=Math.sin(n*c)/u;return this._w=a*d+this._w*f,this._x=r*d+this._x*f,this._y=i*d+this._y*f,this._z=s*d+this._z*f,this._onChangeCallback(),this}slerpQuaternions(e,n,r){return this.copy(e).slerp(n,r)}random(){const e=Math.random(),n=Math.sqrt(1-e),r=Math.sqrt(e),i=2*Math.PI*Math.random(),s=2*Math.PI*Math.random();return this.set(n*Math.cos(i),r*Math.sin(s),r*Math.cos(s),n*Math.sin(i))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,n=0){return this._x=e[n],this._y=e[n+1],this._z=e[n+2],this._w=e[n+3],this._onChangeCallback(),this}toArray(e=[],n=0){return e[n]=this._x,e[n+1]=this._y,e[n+2]=this._z,e[n+3]=this._w,e}fromBufferAttribute(e,n){return this._x=e.getX(n),this._y=e.getY(n),this._z=e.getZ(n),this._w=e.getW(n),this}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}Or.prototype.isQuaternion=!0;class U{constructor(e=0,n=0,r=0){this.x=e,this.y=n,this.z=r}set(e,n,r){return r===void 0&&(r=this.z),this.x=e,this.y=n,this.z=r,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;case 2:this.z=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e,n){return n!==void 0?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,n)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this)}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this.z=e.z+n.z,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this.z+=e.z*n,this}sub(e,n){return n!==void 0?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,n)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this)}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this}multiply(e,n){return n!==void 0?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(e,n)):(this.x*=e.x,this.y*=e.y,this.z*=e.z,this)}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,n){return this.x=e.x*n.x,this.y=e.y*n.y,this.z=e.z*n.z,this}applyEuler(e){return e&&e.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(dZ.setFromEuler(e))}applyAxisAngle(e,n){return this.applyQuaternion(dZ.setFromAxisAngle(e,n))}applyMatrix3(e){const n=this.x,r=this.y,i=this.z,s=e.elements;return this.x=s[0]*n+s[3]*r+s[6]*i,this.y=s[1]*n+s[4]*r+s[7]*i,this.z=s[2]*n+s[5]*r+s[8]*i,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const n=this.x,r=this.y,i=this.z,s=e.elements,a=1/(s[3]*n+s[7]*r+s[11]*i+s[15]);return this.x=(s[0]*n+s[4]*r+s[8]*i+s[12])*a,this.y=(s[1]*n+s[5]*r+s[9]*i+s[13])*a,this.z=(s[2]*n+s[6]*r+s[10]*i+s[14])*a,this}applyQuaternion(e){const n=this.x,r=this.y,i=this.z,s=e.x,a=e.y,o=e.z,l=e.w,u=l*n+a*i-o*r,c=l*r+o*n-s*i,d=l*i+s*r-a*n,f=-s*n-a*r-o*i;return this.x=u*l+f*-s+c*-o-d*-a,this.y=c*l+f*-a+d*-s-u*-o,this.z=d*l+f*-o+u*-a-c*-s,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const n=this.x,r=this.y,i=this.z,s=e.elements;return this.x=s[0]*n+s[4]*r+s[8]*i,this.y=s[1]*n+s[5]*r+s[9]*i,this.z=s[2]*n+s[6]*r+s[10]*i,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,n){return this.x=Math.max(e.x,Math.min(n.x,this.x)),this.y=Math.max(e.y,Math.min(n.y,this.y)),this.z=Math.max(e.z,Math.min(n.z,this.z)),this}clampScalar(e,n){return this.x=Math.max(e,Math.min(n,this.x)),this.y=Math.max(e,Math.min(n,this.y)),this.z=Math.max(e,Math.min(n,this.z)),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(e,Math.min(n,r)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this.z+=(e.z-this.z)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this.z=e.z+(n.z-e.z)*r,this}cross(e,n){return n!==void 0?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(e,n)):this.crossVectors(this,e)}crossVectors(e,n){const r=e.x,i=e.y,s=e.z,a=n.x,o=n.y,l=n.z;return this.x=i*l-s*o,this.y=s*a-r*l,this.z=r*o-i*a,this}projectOnVector(e){const n=e.lengthSq();if(n===0)return this.set(0,0,0);const r=e.dot(this)/n;return this.copy(e).multiplyScalar(r)}projectOnPlane(e){return wk.copy(this).projectOnVector(e),this.sub(wk)}reflect(e){return this.sub(wk.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const n=Math.sqrt(this.lengthSq()*e.lengthSq());if(n===0)return Math.PI/2;const r=this.dot(e)/n;return Math.acos(Fi(r,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const n=this.x-e.x,r=this.y-e.y,i=this.z-e.z;return n*n+r*r+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,n,r){const i=Math.sin(n)*e;return this.x=i*Math.sin(r),this.y=Math.cos(n)*e,this.z=i*Math.cos(r),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,n,r){return this.x=e*Math.sin(n),this.y=r,this.z=e*Math.cos(n),this}setFromMatrixPosition(e){const n=e.elements;return this.x=n[12],this.y=n[13],this.z=n[14],this}setFromMatrixScale(e){const n=this.setFromMatrixColumn(e,0).length(),r=this.setFromMatrixColumn(e,1).length(),i=this.setFromMatrixColumn(e,2).length();return this.x=n,this.y=r,this.z=i,this}setFromMatrixColumn(e,n){return this.fromArray(e.elements,n*4)}setFromMatrix3Column(e,n){return this.fromArray(e.elements,n*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this.z=e[n+2],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e[n+2]=this.z,e}fromBufferAttribute(e,n,r){return r!==void 0&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(n),this.y=e.getY(n),this.z=e.getZ(n),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=(Math.random()-.5)*2,n=Math.random()*Math.PI*2,r=Math.sqrt(1-e**2);return this.x=r*Math.cos(n),this.y=r*Math.sin(n),this.z=e,this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}U.prototype.isVector3=!0;const wk=new U,dZ=new Or;class Jt{constructor(e=new U(1/0,1/0,1/0),n=new U(-1/0,-1/0,-1/0)){this.min=e,this.max=n}set(e,n){return this.min.copy(e),this.max.copy(n),this}setFromArray(e){let n=1/0,r=1/0,i=1/0,s=-1/0,a=-1/0,o=-1/0;for(let l=0,u=e.length;ls&&(s=c),d>a&&(a=d),f>o&&(o=f)}return this.min.set(n,r,i),this.max.set(s,a,o),this}setFromBufferAttribute(e){let n=1/0,r=1/0,i=1/0,s=-1/0,a=-1/0,o=-1/0;for(let l=0,u=e.count;ls&&(s=c),d>a&&(a=d),f>o&&(o=f)}return this.min.set(n,r,i),this.max.set(s,a,o),this}setFromPoints(e){this.makeEmpty();for(let n=0,r=e.length;nthis.max.x||e.ythis.max.y||e.zthis.max.z)}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,n){return n.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return!(e.max.xthis.max.x||e.max.ythis.max.y||e.max.zthis.max.z)}intersectsSphere(e){return this.clampPoint(e.center,Pm),Pm.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let n,r;return e.normal.x>0?(n=e.normal.x*this.min.x,r=e.normal.x*this.max.x):(n=e.normal.x*this.max.x,r=e.normal.x*this.min.x),e.normal.y>0?(n+=e.normal.y*this.min.y,r+=e.normal.y*this.max.y):(n+=e.normal.y*this.max.y,r+=e.normal.y*this.min.y),e.normal.z>0?(n+=e.normal.z*this.min.z,r+=e.normal.z*this.max.z):(n+=e.normal.z*this.max.z,r+=e.normal.z*this.min.z),n<=-e.constant&&r>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(TS),b2.subVectors(this.max,TS),ng.subVectors(e.a,TS),rg.subVectors(e.b,TS),ig.subVectors(e.c,TS),rh.subVectors(rg,ng),ih.subVectors(ig,rg),Rm.subVectors(ng,ig);let n=[0,-rh.z,rh.y,0,-ih.z,ih.y,0,-Rm.z,Rm.y,rh.z,0,-rh.x,ih.z,0,-ih.x,Rm.z,0,-Rm.x,-rh.y,rh.x,0,-ih.y,ih.x,0,-Rm.y,Rm.x,0];return!Mk(n,ng,rg,ig,b2)||(n=[1,0,0,0,1,0,0,0,1],!Mk(n,ng,rg,ig,b2))?!1:(y2.crossVectors(rh,ih),n=[y2.x,y2.y,y2.z],Mk(n,ng,rg,ig,b2))}clampPoint(e,n){return n.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return Pm.copy(e).clamp(this.min,this.max).sub(e).length()}getBoundingSphere(e){return this.getCenter(e.center),e.radius=this.getSize(Pm).length()*.5,e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(Sd[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),Sd[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),Sd[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),Sd[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),Sd[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),Sd[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),Sd[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),Sd[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(Sd),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}Jt.prototype.isBox3=!0;const Sd=[new U,new U,new U,new U,new U,new U,new U,new U],Pm=new U,Ek=new Jt,ng=new U,rg=new U,ig=new U,rh=new U,ih=new U,Rm=new U,TS=new U,b2=new U,y2=new U,Vm=new U;function Mk(t,e,n,r,i){for(let s=0,a=t.length-3;s<=a;s+=3){Vm.fromArray(t,s);const o=i.x*Math.abs(Vm.x)+i.y*Math.abs(Vm.y)+i.z*Math.abs(Vm.z),l=e.dot(Vm),u=n.dot(Vm),c=r.dot(Vm);if(Math.max(-Math.max(l,u,c),Math.min(l,u,c))>o)return!1}return!0}const SNe=new Jt,fZ=new U,S2=new U,Pk=new U;class so{constructor(e=new U,n=-1){this.center=e,this.radius=n}set(e,n){return this.center.copy(e),this.radius=n,this}setFromPoints(e,n){const r=this.center;n!==void 0?r.copy(n):SNe.setFromPoints(e).getCenter(r);let i=0;for(let s=0,a=e.length;sthis.radius*this.radius&&(n.sub(this.center).normalize(),n.multiplyScalar(this.radius).add(this.center)),n}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){Pk.subVectors(e,this.center);const n=Pk.lengthSq();if(n>this.radius*this.radius){const r=Math.sqrt(n),i=(r-this.radius)*.5;this.center.add(Pk.multiplyScalar(i/r)),this.radius+=i}return this}union(e){return this.center.equals(e.center)===!0?S2.set(0,0,1).multiplyScalar(e.radius):S2.subVectors(e.center,this.center).normalize().multiplyScalar(e.radius),this.expandByPoint(fZ.copy(e.center).add(S2)),this.expandByPoint(fZ.copy(e.center).sub(S2)),this}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}}const xd=new U,Rk=new U,x2=new U,sh=new U,Vk=new U,T2=new U,zk=new U;class Ko{constructor(e=new U,n=new U(0,0,-1)){this.origin=e,this.direction=n}set(e,n){return this.origin.copy(e),this.direction.copy(n),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,n){return n.copy(this.direction).multiplyScalar(e).add(this.origin)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,xd)),this}closestPointToPoint(e,n){n.subVectors(e,this.origin);const r=n.dot(this.direction);return r<0?n.copy(this.origin):n.copy(this.direction).multiplyScalar(r).add(this.origin)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const n=xd.subVectors(e,this.origin).dot(this.direction);return n<0?this.origin.distanceToSquared(e):(xd.copy(this.direction).multiplyScalar(n).add(this.origin),xd.distanceToSquared(e))}distanceSqToSegment(e,n,r,i){Rk.copy(e).add(n).multiplyScalar(.5),x2.copy(n).sub(e).normalize(),sh.copy(this.origin).sub(Rk);const s=e.distanceTo(n)*.5,a=-this.direction.dot(x2),o=sh.dot(this.direction),l=-sh.dot(x2),u=sh.lengthSq(),c=Math.abs(1-a*a);let d,f,h,p;if(c>0)if(d=a*l-o,f=a*o-l,p=s*c,d>=0)if(f>=-p)if(f<=p){const m=1/c;d*=m,f*=m,h=d*(d+a*f+2*o)+f*(a*d+f+2*l)+u}else f=s,d=Math.max(0,-(a*f+o)),h=-d*d+f*(f+2*l)+u;else f=-s,d=Math.max(0,-(a*f+o)),h=-d*d+f*(f+2*l)+u;else f<=-p?(d=Math.max(0,-(-a*s+o)),f=d>0?-s:Math.min(Math.max(-s,-l),s),h=-d*d+f*(f+2*l)+u):f<=p?(d=0,f=Math.min(Math.max(-s,-l),s),h=f*(f+2*l)+u):(d=Math.max(0,-(a*s+o)),f=d>0?s:Math.min(Math.max(-s,-l),s),h=-d*d+f*(f+2*l)+u);else f=a>0?-s:s,d=Math.max(0,-(a*f+o)),h=-d*d+f*(f+2*l)+u;return r&&r.copy(this.direction).multiplyScalar(d).add(this.origin),i&&i.copy(x2).multiplyScalar(f).add(Rk),h}intersectSphere(e,n){xd.subVectors(e.center,this.origin);const r=xd.dot(this.direction),i=xd.dot(xd)-r*r,s=e.radius*e.radius;if(i>s)return null;const a=Math.sqrt(s-i),o=r-a,l=r+a;return o<0&&l<0?null:o<0?this.at(l,n):this.at(o,n)}intersectsSphere(e){return this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const n=e.normal.dot(this.direction);if(n===0)return e.distanceToPoint(this.origin)===0?0:null;const r=-(this.origin.dot(e.normal)+e.constant)/n;return r>=0?r:null}intersectPlane(e,n){const r=this.distanceToPlane(e);return r===null?null:this.at(r,n)}intersectsPlane(e){const n=e.distanceToPoint(this.origin);return n===0||e.normal.dot(this.direction)*n<0}intersectBox(e,n){let r,i,s,a,o,l;const u=1/this.direction.x,c=1/this.direction.y,d=1/this.direction.z,f=this.origin;return u>=0?(r=(e.min.x-f.x)*u,i=(e.max.x-f.x)*u):(r=(e.max.x-f.x)*u,i=(e.min.x-f.x)*u),c>=0?(s=(e.min.y-f.y)*c,a=(e.max.y-f.y)*c):(s=(e.max.y-f.y)*c,a=(e.min.y-f.y)*c),r>a||s>i||((s>r||r!==r)&&(r=s),(a=0?(o=(e.min.z-f.z)*d,l=(e.max.z-f.z)*d):(o=(e.max.z-f.z)*d,l=(e.min.z-f.z)*d),r>l||o>i)||((o>r||r!==r)&&(r=o),(l=0?r:i,n)}intersectsBox(e){return this.intersectBox(e,xd)!==null}intersectTriangle(e,n,r,i,s){Vk.subVectors(n,e),T2.subVectors(r,e),zk.crossVectors(Vk,T2);let a=this.direction.dot(zk),o;if(a>0){if(i)return null;o=1}else if(a<0)o=-1,a=-a;else return null;sh.subVectors(this.origin,e);const l=o*this.direction.dot(T2.crossVectors(sh,T2));if(l<0)return null;const u=o*this.direction.dot(Vk.cross(sh));if(u<0||l+u>a)return null;const c=-o*sh.dot(zk);return c<0?null:this.at(c/a,s)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class Be{constructor(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}set(e,n,r,i,s,a,o,l,u,c,d,f,h,p,m,v){const g=this.elements;return g[0]=e,g[4]=n,g[8]=r,g[12]=i,g[1]=s,g[5]=a,g[9]=o,g[13]=l,g[2]=u,g[6]=c,g[10]=d,g[14]=f,g[3]=h,g[7]=p,g[11]=m,g[15]=v,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new Be().fromArray(this.elements)}copy(e){const n=this.elements,r=e.elements;return n[0]=r[0],n[1]=r[1],n[2]=r[2],n[3]=r[3],n[4]=r[4],n[5]=r[5],n[6]=r[6],n[7]=r[7],n[8]=r[8],n[9]=r[9],n[10]=r[10],n[11]=r[11],n[12]=r[12],n[13]=r[13],n[14]=r[14],n[15]=r[15],this}copyPosition(e){const n=this.elements,r=e.elements;return n[12]=r[12],n[13]=r[13],n[14]=r[14],this}setFromMatrix3(e){const n=e.elements;return this.set(n[0],n[3],n[6],0,n[1],n[4],n[7],0,n[2],n[5],n[8],0,0,0,0,1),this}extractBasis(e,n,r){return e.setFromMatrixColumn(this,0),n.setFromMatrixColumn(this,1),r.setFromMatrixColumn(this,2),this}makeBasis(e,n,r){return this.set(e.x,n.x,r.x,0,e.y,n.y,r.y,0,e.z,n.z,r.z,0,0,0,0,1),this}extractRotation(e){const n=this.elements,r=e.elements,i=1/sg.setFromMatrixColumn(e,0).length(),s=1/sg.setFromMatrixColumn(e,1).length(),a=1/sg.setFromMatrixColumn(e,2).length();return n[0]=r[0]*i,n[1]=r[1]*i,n[2]=r[2]*i,n[3]=0,n[4]=r[4]*s,n[5]=r[5]*s,n[6]=r[6]*s,n[7]=0,n[8]=r[8]*a,n[9]=r[9]*a,n[10]=r[10]*a,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,this}makeRotationFromEuler(e){e&&e.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");const n=this.elements,r=e.x,i=e.y,s=e.z,a=Math.cos(r),o=Math.sin(r),l=Math.cos(i),u=Math.sin(i),c=Math.cos(s),d=Math.sin(s);if(e.order==="XYZ"){const f=a*c,h=a*d,p=o*c,m=o*d;n[0]=l*c,n[4]=-l*d,n[8]=u,n[1]=h+p*u,n[5]=f-m*u,n[9]=-o*l,n[2]=m-f*u,n[6]=p+h*u,n[10]=a*l}else if(e.order==="YXZ"){const f=l*c,h=l*d,p=u*c,m=u*d;n[0]=f+m*o,n[4]=p*o-h,n[8]=a*u,n[1]=a*d,n[5]=a*c,n[9]=-o,n[2]=h*o-p,n[6]=m+f*o,n[10]=a*l}else if(e.order==="ZXY"){const f=l*c,h=l*d,p=u*c,m=u*d;n[0]=f-m*o,n[4]=-a*d,n[8]=p+h*o,n[1]=h+p*o,n[5]=a*c,n[9]=m-f*o,n[2]=-a*u,n[6]=o,n[10]=a*l}else if(e.order==="ZYX"){const f=a*c,h=a*d,p=o*c,m=o*d;n[0]=l*c,n[4]=p*u-h,n[8]=f*u+m,n[1]=l*d,n[5]=m*u+f,n[9]=h*u-p,n[2]=-u,n[6]=o*l,n[10]=a*l}else if(e.order==="YZX"){const f=a*l,h=a*u,p=o*l,m=o*u;n[0]=l*c,n[4]=m-f*d,n[8]=p*d+h,n[1]=d,n[5]=a*c,n[9]=-o*c,n[2]=-u*c,n[6]=h*d+p,n[10]=f-m*d}else if(e.order==="XZY"){const f=a*l,h=a*u,p=o*l,m=o*u;n[0]=l*c,n[4]=-d,n[8]=u*c,n[1]=f*d+m,n[5]=a*c,n[9]=h*d-p,n[2]=p*d-h,n[6]=o*c,n[10]=m*d+f}return n[3]=0,n[7]=0,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,this}makeRotationFromQuaternion(e){return this.compose(xNe,e,TNe)}lookAt(e,n,r){const i=this.elements;return Ho.subVectors(e,n),Ho.lengthSq()===0&&(Ho.z=1),Ho.normalize(),ah.crossVectors(r,Ho),ah.lengthSq()===0&&(Math.abs(r.z)===1?Ho.x+=1e-4:Ho.z+=1e-4,Ho.normalize(),ah.crossVectors(r,Ho)),ah.normalize(),w2.crossVectors(Ho,ah),i[0]=ah.x,i[4]=w2.x,i[8]=Ho.x,i[1]=ah.y,i[5]=w2.y,i[9]=Ho.y,i[2]=ah.z,i[6]=w2.z,i[10]=Ho.z,this}multiply(e,n){return n!==void 0?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(e,n)):this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,n){const r=e.elements,i=n.elements,s=this.elements,a=r[0],o=r[4],l=r[8],u=r[12],c=r[1],d=r[5],f=r[9],h=r[13],p=r[2],m=r[6],v=r[10],g=r[14],b=r[3],y=r[7],x=r[11],T=r[15],M=i[0],E=i[4],S=i[8],P=i[12],R=i[1],V=i[5],z=i[9],k=i[13],N=i[2],q=i[6],L=i[10],A=i[14],J=i[3],F=i[7],ne=i[11],j=i[15];return s[0]=a*M+o*R+l*N+u*J,s[4]=a*E+o*V+l*q+u*F,s[8]=a*S+o*z+l*L+u*ne,s[12]=a*P+o*k+l*A+u*j,s[1]=c*M+d*R+f*N+h*J,s[5]=c*E+d*V+f*q+h*F,s[9]=c*S+d*z+f*L+h*ne,s[13]=c*P+d*k+f*A+h*j,s[2]=p*M+m*R+v*N+g*J,s[6]=p*E+m*V+v*q+g*F,s[10]=p*S+m*z+v*L+g*ne,s[14]=p*P+m*k+v*A+g*j,s[3]=b*M+y*R+x*N+T*J,s[7]=b*E+y*V+x*q+T*F,s[11]=b*S+y*z+x*L+T*ne,s[15]=b*P+y*k+x*A+T*j,this}multiplyScalar(e){const n=this.elements;return n[0]*=e,n[4]*=e,n[8]*=e,n[12]*=e,n[1]*=e,n[5]*=e,n[9]*=e,n[13]*=e,n[2]*=e,n[6]*=e,n[10]*=e,n[14]*=e,n[3]*=e,n[7]*=e,n[11]*=e,n[15]*=e,this}determinant(){const e=this.elements,n=e[0],r=e[4],i=e[8],s=e[12],a=e[1],o=e[5],l=e[9],u=e[13],c=e[2],d=e[6],f=e[10],h=e[14],p=e[3],m=e[7],v=e[11],g=e[15];return p*(+s*l*d-i*u*d-s*o*f+r*u*f+i*o*h-r*l*h)+m*(+n*l*h-n*u*f+s*a*f-i*a*h+i*u*c-s*l*c)+v*(+n*u*d-n*o*h-s*a*d+r*a*h+s*o*c-r*u*c)+g*(-i*o*c-n*l*d+n*o*f+i*a*d-r*a*f+r*l*c)}transpose(){const e=this.elements;let n;return n=e[1],e[1]=e[4],e[4]=n,n=e[2],e[2]=e[8],e[8]=n,n=e[6],e[6]=e[9],e[9]=n,n=e[3],e[3]=e[12],e[12]=n,n=e[7],e[7]=e[13],e[13]=n,n=e[11],e[11]=e[14],e[14]=n,this}setPosition(e,n,r){const i=this.elements;return e.isVector3?(i[12]=e.x,i[13]=e.y,i[14]=e.z):(i[12]=e,i[13]=n,i[14]=r),this}invert(){const e=this.elements,n=e[0],r=e[1],i=e[2],s=e[3],a=e[4],o=e[5],l=e[6],u=e[7],c=e[8],d=e[9],f=e[10],h=e[11],p=e[12],m=e[13],v=e[14],g=e[15],b=d*v*u-m*f*u+m*l*h-o*v*h-d*l*g+o*f*g,y=p*f*u-c*v*u-p*l*h+a*v*h+c*l*g-a*f*g,x=c*m*u-p*d*u+p*o*h-a*m*h-c*o*g+a*d*g,T=p*d*l-c*m*l-p*o*f+a*m*f+c*o*v-a*d*v,M=n*b+r*y+i*x+s*T;if(M===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const E=1/M;return e[0]=b*E,e[1]=(m*f*s-d*v*s-m*i*h+r*v*h+d*i*g-r*f*g)*E,e[2]=(o*v*s-m*l*s+m*i*u-r*v*u-o*i*g+r*l*g)*E,e[3]=(d*l*s-o*f*s-d*i*u+r*f*u+o*i*h-r*l*h)*E,e[4]=y*E,e[5]=(c*v*s-p*f*s+p*i*h-n*v*h-c*i*g+n*f*g)*E,e[6]=(p*l*s-a*v*s-p*i*u+n*v*u+a*i*g-n*l*g)*E,e[7]=(a*f*s-c*l*s+c*i*u-n*f*u-a*i*h+n*l*h)*E,e[8]=x*E,e[9]=(p*d*s-c*m*s-p*r*h+n*m*h+c*r*g-n*d*g)*E,e[10]=(a*m*s-p*o*s+p*r*u-n*m*u-a*r*g+n*o*g)*E,e[11]=(c*o*s-a*d*s-c*r*u+n*d*u+a*r*h-n*o*h)*E,e[12]=T*E,e[13]=(c*m*i-p*d*i+p*r*f-n*m*f-c*r*v+n*d*v)*E,e[14]=(p*o*i-a*m*i-p*r*l+n*m*l+a*r*v-n*o*v)*E,e[15]=(a*d*i-c*o*i+c*r*l-n*d*l-a*r*f+n*o*f)*E,this}scale(e){const n=this.elements,r=e.x,i=e.y,s=e.z;return n[0]*=r,n[4]*=i,n[8]*=s,n[1]*=r,n[5]*=i,n[9]*=s,n[2]*=r,n[6]*=i,n[10]*=s,n[3]*=r,n[7]*=i,n[11]*=s,this}getMaxScaleOnAxis(){const e=this.elements,n=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],r=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],i=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(n,r,i))}makeTranslation(e,n,r){return this.set(1,0,0,e,0,1,0,n,0,0,1,r,0,0,0,1),this}makeRotationX(e){const n=Math.cos(e),r=Math.sin(e);return this.set(1,0,0,0,0,n,-r,0,0,r,n,0,0,0,0,1),this}makeRotationY(e){const n=Math.cos(e),r=Math.sin(e);return this.set(n,0,r,0,0,1,0,0,-r,0,n,0,0,0,0,1),this}makeRotationZ(e){const n=Math.cos(e),r=Math.sin(e);return this.set(n,-r,0,0,r,n,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,n){const r=Math.cos(n),i=Math.sin(n),s=1-r,a=e.x,o=e.y,l=e.z,u=s*a,c=s*o;return this.set(u*a+r,u*o-i*l,u*l+i*o,0,u*o+i*l,c*o+r,c*l-i*a,0,u*l-i*o,c*l+i*a,s*l*l+r,0,0,0,0,1),this}makeScale(e,n,r){return this.set(e,0,0,0,0,n,0,0,0,0,r,0,0,0,0,1),this}makeShear(e,n,r,i,s,a){return this.set(1,r,s,0,e,1,a,0,n,i,1,0,0,0,0,1),this}compose(e,n,r){const i=this.elements,s=n._x,a=n._y,o=n._z,l=n._w,u=s+s,c=a+a,d=o+o,f=s*u,h=s*c,p=s*d,m=a*c,v=a*d,g=o*d,b=l*u,y=l*c,x=l*d,T=r.x,M=r.y,E=r.z;return i[0]=(1-(m+g))*T,i[1]=(h+x)*T,i[2]=(p-y)*T,i[3]=0,i[4]=(h-x)*M,i[5]=(1-(f+g))*M,i[6]=(v+b)*M,i[7]=0,i[8]=(p+y)*E,i[9]=(v-b)*E,i[10]=(1-(f+m))*E,i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this}decompose(e,n,r){const i=this.elements;let s=sg.set(i[0],i[1],i[2]).length();const a=sg.set(i[4],i[5],i[6]).length(),o=sg.set(i[8],i[9],i[10]).length();this.determinant()<0&&(s=-s),e.x=i[12],e.y=i[13],e.z=i[14],ou.copy(this);const u=1/s,c=1/a,d=1/o;return ou.elements[0]*=u,ou.elements[1]*=u,ou.elements[2]*=u,ou.elements[4]*=c,ou.elements[5]*=c,ou.elements[6]*=c,ou.elements[8]*=d,ou.elements[9]*=d,ou.elements[10]*=d,n.setFromRotationMatrix(ou),r.x=s,r.y=a,r.z=o,this}makePerspective(e,n,r,i,s,a){a===void 0&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");const o=this.elements,l=2*s/(n-e),u=2*s/(r-i),c=(n+e)/(n-e),d=(r+i)/(r-i),f=-(a+s)/(a-s),h=-2*a*s/(a-s);return o[0]=l,o[4]=0,o[8]=c,o[12]=0,o[1]=0,o[5]=u,o[9]=d,o[13]=0,o[2]=0,o[6]=0,o[10]=f,o[14]=h,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this}makeOrthographic(e,n,r,i,s,a){const o=this.elements,l=1/(n-e),u=1/(r-i),c=1/(a-s),d=(n+e)*l,f=(r+i)*u,h=(a+s)*c;return o[0]=2*l,o[4]=0,o[8]=0,o[12]=-d,o[1]=0,o[5]=2*u,o[9]=0,o[13]=-f,o[2]=0,o[6]=0,o[10]=-2*c,o[14]=-h,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this}equals(e){const n=this.elements,r=e.elements;for(let i=0;i<16;i++)if(n[i]!==r[i])return!1;return!0}fromArray(e,n=0){for(let r=0;r<16;r++)this.elements[r]=e[r+n];return this}toArray(e=[],n=0){const r=this.elements;return e[n]=r[0],e[n+1]=r[1],e[n+2]=r[2],e[n+3]=r[3],e[n+4]=r[4],e[n+5]=r[5],e[n+6]=r[6],e[n+7]=r[7],e[n+8]=r[8],e[n+9]=r[9],e[n+10]=r[10],e[n+11]=r[11],e[n+12]=r[12],e[n+13]=r[13],e[n+14]=r[14],e[n+15]=r[15],e}}Be.prototype.isMatrix4=!0;const sg=new U,ou=new Be,xNe=new U(0,0,0),TNe=new U(1,1,1),ah=new U,w2=new U,Ho=new U,hZ=new Be,pZ=new Or;class ld{constructor(e=0,n=0,r=0,i=ld.DefaultOrder){this._x=e,this._y=n,this._z=r,this._order=i}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,n,r,i=this._order){return this._x=e,this._y=n,this._z=r,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,n=this._order,r=!0){const i=e.elements,s=i[0],a=i[4],o=i[8],l=i[1],u=i[5],c=i[9],d=i[2],f=i[6],h=i[10];switch(n){case"XYZ":this._y=Math.asin(Fi(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,h),this._z=Math.atan2(-a,s)):(this._x=Math.atan2(f,u),this._z=0);break;case"YXZ":this._x=Math.asin(-Fi(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(o,h),this._z=Math.atan2(l,u)):(this._y=Math.atan2(-d,s),this._z=0);break;case"ZXY":this._x=Math.asin(Fi(f,-1,1)),Math.abs(f)<.9999999?(this._y=Math.atan2(-d,h),this._z=Math.atan2(-a,u)):(this._y=0,this._z=Math.atan2(l,s));break;case"ZYX":this._y=Math.asin(-Fi(d,-1,1)),Math.abs(d)<.9999999?(this._x=Math.atan2(f,h),this._z=Math.atan2(l,s)):(this._x=0,this._z=Math.atan2(-a,u));break;case"YZX":this._z=Math.asin(Fi(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-c,u),this._y=Math.atan2(-d,s)):(this._x=0,this._y=Math.atan2(o,h));break;case"XZY":this._z=Math.asin(-Fi(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(f,u),this._y=Math.atan2(o,s)):(this._x=Math.atan2(-c,h),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+n)}return this._order=n,r===!0&&this._onChangeCallback(),this}setFromQuaternion(e,n,r){return hZ.makeRotationFromQuaternion(e),this.setFromRotationMatrix(hZ,n,r)}setFromVector3(e,n=this._order){return this.set(e.x,e.y,e.z,n)}reorder(e){return pZ.setFromEuler(this),this.setFromQuaternion(pZ,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],e[3]!==void 0&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],n=0){return e[n]=this._x,e[n+1]=this._y,e[n+2]=this._z,e[n+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}ld.prototype.isEuler=!0;ld.DefaultOrder="XYZ";ld.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];class qV{constructor(){this.mask=1}set(e){this.mask=(1<>>0}enable(e){this.mask|=1<1){for(let n=0;n1){for(let r=0;r0){i.children=[];for(let o=0;o0){i.animations=[];for(let o=0;o0&&(r.geometries=o),l.length>0&&(r.materials=l),u.length>0&&(r.textures=u),c.length>0&&(r.images=c),d.length>0&&(r.shapes=d),f.length>0&&(r.skeletons=f),h.length>0&&(r.animations=h),p.length>0&&(r.nodes=p)}return r.object=i,r;function a(o){const l=[];for(const u in o){const c=o[u];delete c.metadata,l.push(c)}return l}}clone(e){return new this.constructor().copy(this,e)}copy(e,n=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.userData=JSON.parse(JSON.stringify(e.userData)),n===!0)for(let r=0;r0?i.multiplyScalar(1/Math.sqrt(s)):i.set(0,0,0)}static getBarycoord(e,n,r,i,s){lu.subVectors(i,n),wd.subVectors(r,n),kk.subVectors(e,n);const a=lu.dot(lu),o=lu.dot(wd),l=lu.dot(kk),u=wd.dot(wd),c=wd.dot(kk),d=a*u-o*o;if(d===0)return s.set(-2,-1,-1);const f=1/d,h=(u*l-o*c)*f,p=(a*c-o*l)*f;return s.set(1-h-p,p,h)}static containsPoint(e,n,r,i){return this.getBarycoord(e,n,r,i,Ed),Ed.x>=0&&Ed.y>=0&&Ed.x+Ed.y<=1}static getUV(e,n,r,i,s,a,o,l){return this.getBarycoord(e,n,r,i,Ed),l.set(0,0),l.addScaledVector(s,Ed.x),l.addScaledVector(a,Ed.y),l.addScaledVector(o,Ed.z),l}static isFrontFacing(e,n,r,i){return lu.subVectors(r,n),wd.subVectors(e,n),lu.cross(wd).dot(i)<0}set(e,n,r){return this.a.copy(e),this.b.copy(n),this.c.copy(r),this}setFromPointsAndIndices(e,n,r,i){return this.a.copy(e[n]),this.b.copy(e[r]),this.c.copy(e[i]),this}setFromAttributeAndIndices(e,n,r,i){return this.a.fromBufferAttribute(e,n),this.b.fromBufferAttribute(e,r),this.c.fromBufferAttribute(e,i),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return lu.subVectors(this.c,this.b),wd.subVectors(this.a,this.b),lu.cross(wd).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return Wr.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,n){return Wr.getBarycoord(e,this.a,this.b,this.c,n)}getUV(e,n,r,i,s){return Wr.getUV(e,this.a,this.b,this.c,n,r,i,s)}containsPoint(e){return Wr.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return Wr.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,n){const r=this.a,i=this.b,s=this.c;let a,o;og.subVectors(i,r),lg.subVectors(s,r),Ok.subVectors(e,r);const l=og.dot(Ok),u=lg.dot(Ok);if(l<=0&&u<=0)return n.copy(r);Ik.subVectors(e,i);const c=og.dot(Ik),d=lg.dot(Ik);if(c>=0&&d<=c)return n.copy(i);const f=l*d-c*u;if(f<=0&&l>=0&&c<=0)return a=l/(l-c),n.copy(r).addScaledVector(og,a);Uk.subVectors(e,s);const h=og.dot(Uk),p=lg.dot(Uk);if(p>=0&&h<=p)return n.copy(s);const m=h*u-l*p;if(m<=0&&u>=0&&p<=0)return o=u/(u-p),n.copy(r).addScaledVector(lg,o);const v=c*p-h*d;if(v<=0&&d-c>=0&&h-p>=0)return SZ.subVectors(s,i),o=(d-c)/(d-c+(h-p)),n.copy(i).addScaledVector(SZ,o);const g=1/(v+m+f);return a=m*g,o=f*g,n.copy(r).addScaledVector(og,a).addScaledVector(lg,o)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}let RNe=0;class Ji extends tm{constructor(){super(),Object.defineProperty(this,"id",{value:RNe++}),this.uuid=fl(),this.name="",this.type="Material",this.blending=Mv,this.side=Ki,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=mK,this.blendDst=vK,this.blendEquation=Eu,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=nP,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=c6,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=M7,this.stencilZFail=M7,this.stencilZPass=M7,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(e){this._alphaTest>0!=e>0&&this.version++,this._alphaTest=e}onBuild(){}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(const n in e){const r=e[n];if(r===void 0){console.warn("THREE.Material: '"+n+"' parameter is undefined.");continue}if(n==="shading"){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=r===hK;continue}const i=this[n];if(i===void 0){console.warn("THREE."+this.type+": '"+n+"' is not a property of this material.");continue}i&&i.isColor?i.set(r):i&&i.isVector3&&r&&r.isVector3?i.copy(r):this[n]=r}}toJSON(e){const n=e===void 0||typeof e=="string";n&&(e={textures:{},images:{}});const r={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};r.uuid=this.uuid,r.type=this.type,this.name!==""&&(r.name=this.name),this.color&&this.color.isColor&&(r.color=this.color.getHex()),this.roughness!==void 0&&(r.roughness=this.roughness),this.metalness!==void 0&&(r.metalness=this.metalness),this.sheen!==void 0&&(r.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(r.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(r.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(r.emissive=this.emissive.getHex()),this.emissiveIntensity&&this.emissiveIntensity!==1&&(r.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(r.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(r.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(r.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(r.shininess=this.shininess),this.clearcoat!==void 0&&(r.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(r.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(r.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(r.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(r.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,r.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(r.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(r.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(r.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(r.lightMap=this.lightMap.toJSON(e).uuid,r.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(r.aoMap=this.aoMap.toJSON(e).uuid,r.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(r.bumpMap=this.bumpMap.toJSON(e).uuid,r.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(r.normalMap=this.normalMap.toJSON(e).uuid,r.normalMapType=this.normalMapType,r.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(r.displacementMap=this.displacementMap.toJSON(e).uuid,r.displacementScale=this.displacementScale,r.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(r.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(r.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(r.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(r.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(r.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(r.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(r.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(r.combine=this.combine)),this.envMapIntensity!==void 0&&(r.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(r.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(r.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(r.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(r.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(r.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(r.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(r.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&(r.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(r.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(r.size=this.size),this.shadowSide!==null&&(r.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(r.sizeAttenuation=this.sizeAttenuation),this.blending!==Mv&&(r.blending=this.blending),this.side!==Ki&&(r.side=this.side),this.vertexColors&&(r.vertexColors=!0),this.opacity<1&&(r.opacity=this.opacity),this.transparent===!0&&(r.transparent=this.transparent),r.depthFunc=this.depthFunc,r.depthTest=this.depthTest,r.depthWrite=this.depthWrite,r.colorWrite=this.colorWrite,r.stencilWrite=this.stencilWrite,r.stencilWriteMask=this.stencilWriteMask,r.stencilFunc=this.stencilFunc,r.stencilRef=this.stencilRef,r.stencilFuncMask=this.stencilFuncMask,r.stencilFail=this.stencilFail,r.stencilZFail=this.stencilZFail,r.stencilZPass=this.stencilZPass,this.rotation!==void 0&&this.rotation!==0&&(r.rotation=this.rotation),this.polygonOffset===!0&&(r.polygonOffset=!0),this.polygonOffsetFactor!==0&&(r.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(r.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(r.linewidth=this.linewidth),this.dashSize!==void 0&&(r.dashSize=this.dashSize),this.gapSize!==void 0&&(r.gapSize=this.gapSize),this.scale!==void 0&&(r.scale=this.scale),this.dithering===!0&&(r.dithering=!0),this.alphaTest>0&&(r.alphaTest=this.alphaTest),this.alphaToCoverage===!0&&(r.alphaToCoverage=this.alphaToCoverage),this.premultipliedAlpha===!0&&(r.premultipliedAlpha=this.premultipliedAlpha),this.wireframe===!0&&(r.wireframe=this.wireframe),this.wireframeLinewidth>1&&(r.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(r.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(r.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(r.flatShading=this.flatShading),this.visible===!1&&(r.visible=!1),this.toneMapped===!1&&(r.toneMapped=!1),this.fog===!1&&(r.fog=!1),JSON.stringify(this.userData)!=="{}"&&(r.userData=this.userData);function i(s){const a=[];for(const o in s){const l=s[o];delete l.metadata,a.push(l)}return a}if(n){const s=i(e.textures),a=i(e.images);s.length>0&&(r.textures=s),a.length>0&&(r.images=a)}return r}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const n=e.clippingPlanes;let r=null;if(n!==null){const i=n.length;r=new Array(i);for(let s=0;s!==i;++s)r[s]=n[s].clone()}return this.clippingPlanes=r,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){e===!0&&this.version++}}Ji.prototype.isMaterial=!0;Ji.fromType=function(){return null};class fo extends Ji{constructor(e){super(),this.type="MeshBasicMaterial",this.color=new tt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=yT,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}fo.prototype.isMeshBasicMaterial=!0;const Qi=new U,M2=new Oe;class un{constructor(e,n,r){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="",this.array=e,this.itemSize=n,this.count=e!==void 0?e.length/n:0,this.normalized=r===!0,this.usage=mb,this.updateRange={offset:0,count:-1},this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this}copyAt(e,n,r){e*=this.itemSize,r*=n.itemSize;for(let i=0,s=this.itemSize;i0&&(e.userData=this.userData),this.parameters!==void 0){const l=this.parameters;for(const u in l)l[u]!==void 0&&(e[u]=l[u]);return e}e.data={attributes:{}};const n=this.index;n!==null&&(e.data.index={type:n.array.constructor.name,array:Array.prototype.slice.call(n.array)});const r=this.attributes;for(const l in r){const u=r[l];e.data.attributes[l]=u.toJSON(e.data)}const i={};let s=!1;for(const l in this.morphAttributes){const u=this.morphAttributes[l],c=[];for(let d=0,f=u.length;d0&&(i[l]=c,s=!0)}s&&(e.data.morphAttributes=i,e.data.morphTargetsRelative=this.morphTargetsRelative);const a=this.groups;a.length>0&&(e.data.groups=JSON.parse(JSON.stringify(a)));const o=this.boundingSphere;return o!==null&&(e.data.boundingSphere={center:o.center.toArray(),radius:o.radius}),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const n={};this.name=e.name;const r=e.index;r!==null&&this.setIndex(r.clone(n));const i=e.attributes;for(const u in i){const c=i[u];this.setAttribute(u,c.clone(n))}const s=e.morphAttributes;for(const u in s){const c=[],d=s[u];for(let f=0,h=d.length;f0){const i=n[r[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let s=0,a=i.length;s0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}raycast(e,n){const r=this.geometry,i=this.material,s=this.matrixWorld;if(i===void 0||(r.boundingSphere===null&&r.computeBoundingSphere(),Lk.copy(r.boundingSphere),Lk.applyMatrix4(s),e.ray.intersectsSphere(Lk)===!1)||(xZ.copy(s).invert(),cg.copy(e.ray).applyMatrix4(xZ),r.boundingBox!==null&&cg.intersectsBox(r.boundingBox)===!1))return;let a;if(r.isBufferGeometry){const o=r.index,l=r.attributes.position,u=r.morphAttributes.position,c=r.morphTargetsRelative,d=r.attributes.uv,f=r.attributes.uv2,h=r.groups,p=r.drawRange;if(o!==null)if(Array.isArray(i))for(let m=0,v=h.length;mn.far?null:{distance:u,point:I2.clone(),object:t}}function U2(t,e,n,r,i,s,a,o,l,u,c,d){oh.fromBufferAttribute(i,u),lh.fromBufferAttribute(i,c),uh.fromBufferAttribute(i,d);const f=t.morphTargetInfluences;if(s&&f){P2.set(0,0,0),R2.set(0,0,0),V2.set(0,0,0);for(let p=0,m=s.length;p0?1:-1,c.push(F.x,F.y,F.z),d.push(Z/E),d.push(1-ne/S),A+=1}}for(let ne=0;ne0&&(n.defines=this.defines),n.vertexShader=this.vertexShader,n.fragmentShader=this.fragmentShader;const r={};for(const i in this.extensions)this.extensions[i]===!0&&(r[i]=!0);return Object.keys(r).length>0&&(n.extensions=r),n}}bi.prototype.isShaderMaterial=!0;class TT extends cn{constructor(){super(),this.type="Camera",this.matrixWorldInverse=new Be,this.projectionMatrix=new Be,this.projectionMatrixInverse=new Be}copy(e,n){return super.copy(e,n),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this}getWorldDirection(e){this.updateWorldMatrix(!0,!1);const n=this.matrixWorld.elements;return e.set(-n[8],-n[9],-n[10]).normalize()}updateMatrixWorld(e){super.updateMatrixWorld(e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(e,n){super.updateWorldMatrix(e,n),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}TT.prototype.isCamera=!0;class ns extends TT{constructor(e=50,n=1,r=.1,i=2e3){super(),this.type="PerspectiveCamera",this.fov=e,this.zoom=1,this.near=r,this.far=i,this.focus=10,this.aspect=n,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(e,n){return super.copy(e,n),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=e.view===null?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this}setFocalLength(e){const n=.5*this.getFilmHeight()/e;this.fov=f6*2*Math.atan(n),this.updateProjectionMatrix()}getFocalLength(){const e=Math.tan(Rv*.5*this.fov);return .5*this.getFilmHeight()/e}getEffectiveFOV(){return f6*2*Math.atan(Math.tan(Rv*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(e,n,r,i,s,a){this.aspect=e/n,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=n,this.view.offsetX=r,this.view.offsetY=i,this.view.width=s,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=this.near;let n=e*Math.tan(Rv*.5*this.fov)/this.zoom,r=2*n,i=this.aspect*r,s=-.5*i;const a=this.view;if(this.view!==null&&this.view.enabled){const l=a.fullWidth,u=a.fullHeight;s+=a.offsetX*i/l,n-=a.offsetY*r/u,i*=a.width/l,r*=a.height/u}const o=this.filmOffset;o!==0&&(s+=e*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(s,s+i,n,n-r,e,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const n=super.toJSON(e);return n.object.fov=this.fov,n.object.zoom=this.zoom,n.object.near=this.near,n.object.far=this.far,n.object.focus=this.focus,n.object.aspect=this.aspect,this.view!==null&&(n.object.view=Object.assign({},this.view)),n.object.filmGauge=this.filmGauge,n.object.filmOffset=this.filmOffset,n}}ns.prototype.isPerspectiveCamera=!0;const dg=90,fg=1;class DV extends cn{constructor(e,n,r){if(super(),this.type="CubeCamera",r.isWebGLCubeRenderTarget!==!0){console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");return}this.renderTarget=r;const i=new ns(dg,fg,e,n);i.layers=this.layers,i.up.set(0,-1,0),i.lookAt(new U(1,0,0)),this.add(i);const s=new ns(dg,fg,e,n);s.layers=this.layers,s.up.set(0,-1,0),s.lookAt(new U(-1,0,0)),this.add(s);const a=new ns(dg,fg,e,n);a.layers=this.layers,a.up.set(0,0,1),a.lookAt(new U(0,1,0)),this.add(a);const o=new ns(dg,fg,e,n);o.layers=this.layers,o.up.set(0,0,-1),o.lookAt(new U(0,-1,0)),this.add(o);const l=new ns(dg,fg,e,n);l.layers=this.layers,l.up.set(0,-1,0),l.lookAt(new U(0,0,1)),this.add(l);const u=new ns(dg,fg,e,n);u.layers=this.layers,u.up.set(0,-1,0),u.lookAt(new U(0,0,-1)),this.add(u)}update(e,n){this.parent===null&&this.updateMatrixWorld();const r=this.renderTarget,[i,s,a,o,l,u]=this.children,c=e.getRenderTarget(),d=e.toneMapping,f=e.xr.enabled;e.toneMapping=Wc,e.xr.enabled=!1;const h=r.texture.generateMipmaps;r.texture.generateMipmaps=!1,e.setRenderTarget(r,0),e.render(n,i),e.setRenderTarget(r,1),e.render(n,s),e.setRenderTarget(r,2),e.render(n,a),e.setRenderTarget(r,3),e.render(n,o),e.setRenderTarget(r,4),e.render(n,l),r.texture.generateMipmaps=h,e.setRenderTarget(r,5),e.render(n,u),e.setRenderTarget(c),e.toneMapping=d,e.xr.enabled=f,r.texture.needsPMREMUpdate=!0}}class py extends Di{constructor(e,n,r,i,s,a,o,l,u,c){e=e!==void 0?e:[],n=n!==void 0?n:Ip,super(e,n,r,i,s,a,o,l,u,c),this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}py.prototype.isCubeTexture=!0;class WV extends oi{constructor(e,n={}){super(e,e,n);const r={width:e,height:e,depth:1},i=[r,r,r,r,r,r];this.texture=new py(i,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.encoding),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=n.generateMipmaps!==void 0?n.generateMipmaps:!1,this.texture.minFilter=n.minFilter!==void 0?n.minFilter:Hn}fromEquirectangularTexture(e,n){this.texture.type=n.type,this.texture.encoding=n.encoding,this.texture.generateMipmaps=n.generateMipmaps,this.texture.minFilter=n.minFilter,this.texture.magFilter=n.magFilter;const r={uniforms:{tEquirect:{value:null}},vertexShader:` +}`;class bi extends Ji{constructor(e){super(),this.type="ShaderMaterial",this.defines={},this.uniforms={},this.vertexShader=kNe,this.fragmentShader=ONe,this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,e!==void 0&&(e.attributes!==void 0&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(e))}copy(e){return super.copy(e),this.fragmentShader=e.fragmentShader,this.vertexShader=e.vertexShader,this.uniforms=vb(e.uniforms),this.defines=Object.assign({},e.defines),this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.fog=e.fog,this.lights=e.lights,this.clipping=e.clipping,this.extensions=Object.assign({},e.extensions),this.glslVersion=e.glslVersion,this}toJSON(e){const n=super.toJSON(e);n.glslVersion=this.glslVersion,n.uniforms={};for(const i in this.uniforms){const a=this.uniforms[i].value;a&&a.isTexture?n.uniforms[i]={type:"t",value:a.toJSON(e).uuid}:a&&a.isColor?n.uniforms[i]={type:"c",value:a.getHex()}:a&&a.isVector2?n.uniforms[i]={type:"v2",value:a.toArray()}:a&&a.isVector3?n.uniforms[i]={type:"v3",value:a.toArray()}:a&&a.isVector4?n.uniforms[i]={type:"v4",value:a.toArray()}:a&&a.isMatrix3?n.uniforms[i]={type:"m3",value:a.toArray()}:a&&a.isMatrix4?n.uniforms[i]={type:"m4",value:a.toArray()}:n.uniforms[i]={value:a}}Object.keys(this.defines).length>0&&(n.defines=this.defines),n.vertexShader=this.vertexShader,n.fragmentShader=this.fragmentShader;const r={};for(const i in this.extensions)this.extensions[i]===!0&&(r[i]=!0);return Object.keys(r).length>0&&(n.extensions=r),n}}bi.prototype.isShaderMaterial=!0;class TT extends cn{constructor(){super(),this.type="Camera",this.matrixWorldInverse=new Be,this.projectionMatrix=new Be,this.projectionMatrixInverse=new Be}copy(e,n){return super.copy(e,n),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this}getWorldDirection(e){this.updateWorldMatrix(!0,!1);const n=this.matrixWorld.elements;return e.set(-n[8],-n[9],-n[10]).normalize()}updateMatrixWorld(e){super.updateMatrixWorld(e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(e,n){super.updateWorldMatrix(e,n),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}TT.prototype.isCamera=!0;class ns extends TT{constructor(e=50,n=1,r=.1,i=2e3){super(),this.type="PerspectiveCamera",this.fov=e,this.zoom=1,this.near=r,this.far=i,this.focus=10,this.aspect=n,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(e,n){return super.copy(e,n),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=e.view===null?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this}setFocalLength(e){const n=.5*this.getFilmHeight()/e;this.fov=d6*2*Math.atan(n),this.updateProjectionMatrix()}getFocalLength(){const e=Math.tan(Rv*.5*this.fov);return .5*this.getFilmHeight()/e}getEffectiveFOV(){return d6*2*Math.atan(Math.tan(Rv*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(e,n,r,i,s,a){this.aspect=e/n,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=n,this.view.offsetX=r,this.view.offsetY=i,this.view.width=s,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=this.near;let n=e*Math.tan(Rv*.5*this.fov)/this.zoom,r=2*n,i=this.aspect*r,s=-.5*i;const a=this.view;if(this.view!==null&&this.view.enabled){const l=a.fullWidth,u=a.fullHeight;s+=a.offsetX*i/l,n-=a.offsetY*r/u,i*=a.width/l,r*=a.height/u}const o=this.filmOffset;o!==0&&(s+=e*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(s,s+i,n,n-r,e,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const n=super.toJSON(e);return n.object.fov=this.fov,n.object.zoom=this.zoom,n.object.near=this.near,n.object.far=this.far,n.object.focus=this.focus,n.object.aspect=this.aspect,this.view!==null&&(n.object.view=Object.assign({},this.view)),n.object.filmGauge=this.filmGauge,n.object.filmOffset=this.filmOffset,n}}ns.prototype.isPerspectiveCamera=!0;const dg=90,fg=1;class DV extends cn{constructor(e,n,r){if(super(),this.type="CubeCamera",r.isWebGLCubeRenderTarget!==!0){console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");return}this.renderTarget=r;const i=new ns(dg,fg,e,n);i.layers=this.layers,i.up.set(0,-1,0),i.lookAt(new U(1,0,0)),this.add(i);const s=new ns(dg,fg,e,n);s.layers=this.layers,s.up.set(0,-1,0),s.lookAt(new U(-1,0,0)),this.add(s);const a=new ns(dg,fg,e,n);a.layers=this.layers,a.up.set(0,0,1),a.lookAt(new U(0,1,0)),this.add(a);const o=new ns(dg,fg,e,n);o.layers=this.layers,o.up.set(0,0,-1),o.lookAt(new U(0,-1,0)),this.add(o);const l=new ns(dg,fg,e,n);l.layers=this.layers,l.up.set(0,-1,0),l.lookAt(new U(0,0,1)),this.add(l);const u=new ns(dg,fg,e,n);u.layers=this.layers,u.up.set(0,-1,0),u.lookAt(new U(0,0,-1)),this.add(u)}update(e,n){this.parent===null&&this.updateMatrixWorld();const r=this.renderTarget,[i,s,a,o,l,u]=this.children,c=e.getRenderTarget(),d=e.toneMapping,f=e.xr.enabled;e.toneMapping=Wc,e.xr.enabled=!1;const h=r.texture.generateMipmaps;r.texture.generateMipmaps=!1,e.setRenderTarget(r,0),e.render(n,i),e.setRenderTarget(r,1),e.render(n,s),e.setRenderTarget(r,2),e.render(n,a),e.setRenderTarget(r,3),e.render(n,o),e.setRenderTarget(r,4),e.render(n,l),r.texture.generateMipmaps=h,e.setRenderTarget(r,5),e.render(n,u),e.setRenderTarget(c),e.toneMapping=d,e.xr.enabled=f,r.texture.needsPMREMUpdate=!0}}class hy extends Di{constructor(e,n,r,i,s,a,o,l,u,c){e=e!==void 0?e:[],n=n!==void 0?n:Ip,super(e,n,r,i,s,a,o,l,u,c),this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}hy.prototype.isCubeTexture=!0;class WV extends oi{constructor(e,n={}){super(e,e,n);const r={width:e,height:e,depth:1},i=[r,r,r,r,r,r];this.texture=new hy(i,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.encoding),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=n.generateMipmaps!==void 0?n.generateMipmaps:!1,this.texture.minFilter=n.minFilter!==void 0?n.minFilter:Hn}fromEquirectangularTexture(e,n){this.texture.type=n.type,this.texture.encoding=n.encoding,this.texture.generateMipmaps=n.generateMipmaps,this.texture.minFilter=n.minFilter,this.texture.magFilter=n.magFilter;const r={uniforms:{tEquirect:{value:null}},vertexShader:` varying vec3 vWorldDirection; @@ -177,28 +177,28 @@ ${e.map((i,s)=>`${(s===0?"---> ":J9e(" ",5+s*2))+(Array.isArray(i)?`${nx(i[0])}. gl_FragColor = texture2D( tEquirect, sampleUV ); } - `},i=new pi(5,5,5),s=new bi({name:"CubemapFromEquirect",uniforms:vb(r.uniforms),vertexShader:r.vertexShader,fragmentShader:r.fragmentShader,side:Ua,blending:os});s.uniforms.tEquirect.value=n;const a=new ut(i,s),o=n.minFilter;return n.minFilter===b0&&(n.minFilter=Hn),new DV(1,10,this).update(e,a),n.minFilter=o,a.geometry.dispose(),a.material.dispose(),this}clear(e,n,r,i){const s=e.getRenderTarget();for(let a=0;a<6;a++)e.setRenderTarget(this,a),e.clear(n,r,i);e.setRenderTarget(s)}}WV.prototype.isWebGLCubeRenderTarget=!0;const Dk=new U,ONe=new U,INe=new as;class ri{constructor(e=new U(1,0,0),n=0){this.normal=e,this.constant=n}set(e,n){return this.normal.copy(e),this.constant=n,this}setComponents(e,n,r,i){return this.normal.set(e,n,r),this.constant=i,this}setFromNormalAndCoplanarPoint(e,n){return this.normal.copy(e),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(e,n,r){const i=Dk.subVectors(r,n).cross(ONe.subVectors(e,n)).normalize();return this.setFromNormalAndCoplanarPoint(i,e),this}copy(e){return this.normal.copy(e.normal),this.constant=e.constant,this}normalize(){const e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}distanceToSphere(e){return this.distanceToPoint(e.center)-e.radius}projectPoint(e,n){return n.copy(this.normal).multiplyScalar(-this.distanceToPoint(e)).add(e)}intersectLine(e,n){const r=e.delta(Dk),i=this.normal.dot(r);if(i===0)return this.distanceToPoint(e.start)===0?n.copy(e.start):null;const s=-(e.start.dot(this.normal)+this.constant)/i;return s<0||s>1?null:n.copy(r).multiplyScalar(s).add(e.start)}intersectsLine(e){const n=this.distanceToPoint(e.start),r=this.distanceToPoint(e.end);return n<0&&r>0||r<0&&n>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,n){const r=n||INe.getNormalMatrix(e),i=this.coplanarPoint(Dk).applyMatrix4(e),s=this.normal.applyMatrix3(r).normalize();return this.constant=-i.dot(s),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return new this.constructor().copy(this)}}ri.prototype.isPlane=!0;const hg=new so,N2=new U;class wT{constructor(e=new ri,n=new ri,r=new ri,i=new ri,s=new ri,a=new ri){this.planes=[e,n,r,i,s,a]}set(e,n,r,i,s,a){const o=this.planes;return o[0].copy(e),o[1].copy(n),o[2].copy(r),o[3].copy(i),o[4].copy(s),o[5].copy(a),this}copy(e){const n=this.planes;for(let r=0;r<6;r++)n[r].copy(e.planes[r]);return this}setFromProjectionMatrix(e){const n=this.planes,r=e.elements,i=r[0],s=r[1],a=r[2],o=r[3],l=r[4],u=r[5],c=r[6],d=r[7],f=r[8],h=r[9],p=r[10],m=r[11],v=r[12],g=r[13],b=r[14],y=r[15];return n[0].setComponents(o-i,d-l,m-f,y-v).normalize(),n[1].setComponents(o+i,d+l,m+f,y+v).normalize(),n[2].setComponents(o+s,d+u,m+h,y+g).normalize(),n[3].setComponents(o-s,d-u,m-h,y-g).normalize(),n[4].setComponents(o-a,d-c,m-p,y-b).normalize(),n[5].setComponents(o+a,d+c,m+p,y+b).normalize(),this}intersectsObject(e){const n=e.geometry;return n.boundingSphere===null&&n.computeBoundingSphere(),hg.copy(n.boundingSphere).applyMatrix4(e.matrixWorld),this.intersectsSphere(hg)}intersectsSprite(e){return hg.center.set(0,0,0),hg.radius=.7071067811865476,hg.applyMatrix4(e.matrixWorld),this.intersectsSphere(hg)}intersectsSphere(e){const n=this.planes,r=e.center,i=-e.radius;for(let s=0;s<6;s++)if(n[s].distanceToPoint(r)0?e.max.x:e.min.x,N2.y=i.normal.y>0?e.max.y:e.min.y,N2.z=i.normal.z>0?e.max.z:e.min.z,i.distanceToPoint(N2)<0)return!1}return!0}containsPoint(e){const n=this.planes;for(let r=0;r<6;r++)if(n[r].distanceToPoint(e)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}function zce(){let t=null,e=!1,n=null,r=null;function i(s,a){n(s,a),r=t.requestAnimationFrame(i)}return{start:function(){e!==!0&&n!==null&&(r=t.requestAnimationFrame(i),e=!0)},stop:function(){t.cancelAnimationFrame(r),e=!1},setAnimationLoop:function(s){n=s},setContext:function(s){t=s}}}function UNe(t,e){const n=e.isWebGL2,r=new WeakMap;function i(u,c){const d=u.array,f=u.usage,h=t.createBuffer();t.bindBuffer(c,h),t.bufferData(c,d,f),u.onUploadCallback();let p;if(d instanceof Float32Array)p=5126;else if(d instanceof Uint16Array)if(u.isFloat16BufferAttribute)if(n)p=5131;else throw new Error("THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.");else p=5123;else if(d instanceof Int16Array)p=5122;else if(d instanceof Uint32Array)p=5125;else if(d instanceof Int32Array)p=5124;else if(d instanceof Int8Array)p=5120;else if(d instanceof Uint8Array)p=5121;else if(d instanceof Uint8ClampedArray)p=5121;else throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: "+d);return{buffer:h,type:p,bytesPerElement:d.BYTES_PER_ELEMENT,version:u.version}}function s(u,c,d){const f=c.array,h=c.updateRange;t.bindBuffer(d,u),h.count===-1?t.bufferSubData(d,0,f):(n?t.bufferSubData(d,h.offset*f.BYTES_PER_ELEMENT,f,h.offset,h.count):t.bufferSubData(d,h.offset*f.BYTES_PER_ELEMENT,f.subarray(h.offset,h.offset+h.count)),h.count=-1)}function a(u){return u.isInterleavedBufferAttribute&&(u=u.data),r.get(u)}function o(u){u.isInterleavedBufferAttribute&&(u=u.data);const c=r.get(u);c&&(t.deleteBuffer(c.buffer),r.delete(u))}function l(u,c){if(u.isGLBufferAttribute){const f=r.get(u);(!f||f.version1?null:n.copy(r).multiplyScalar(s).add(e.start)}intersectsLine(e){const n=this.distanceToPoint(e.start),r=this.distanceToPoint(e.end);return n<0&&r>0||r<0&&n>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,n){const r=n||UNe.getNormalMatrix(e),i=this.coplanarPoint(Dk).applyMatrix4(e),s=this.normal.applyMatrix3(r).normalize();return this.constant=-i.dot(s),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return new this.constructor().copy(this)}}ri.prototype.isPlane=!0;const hg=new so,N2=new U;class wT{constructor(e=new ri,n=new ri,r=new ri,i=new ri,s=new ri,a=new ri){this.planes=[e,n,r,i,s,a]}set(e,n,r,i,s,a){const o=this.planes;return o[0].copy(e),o[1].copy(n),o[2].copy(r),o[3].copy(i),o[4].copy(s),o[5].copy(a),this}copy(e){const n=this.planes;for(let r=0;r<6;r++)n[r].copy(e.planes[r]);return this}setFromProjectionMatrix(e){const n=this.planes,r=e.elements,i=r[0],s=r[1],a=r[2],o=r[3],l=r[4],u=r[5],c=r[6],d=r[7],f=r[8],h=r[9],p=r[10],m=r[11],v=r[12],g=r[13],b=r[14],y=r[15];return n[0].setComponents(o-i,d-l,m-f,y-v).normalize(),n[1].setComponents(o+i,d+l,m+f,y+v).normalize(),n[2].setComponents(o+s,d+u,m+h,y+g).normalize(),n[3].setComponents(o-s,d-u,m-h,y-g).normalize(),n[4].setComponents(o-a,d-c,m-p,y-b).normalize(),n[5].setComponents(o+a,d+c,m+p,y+b).normalize(),this}intersectsObject(e){const n=e.geometry;return n.boundingSphere===null&&n.computeBoundingSphere(),hg.copy(n.boundingSphere).applyMatrix4(e.matrixWorld),this.intersectsSphere(hg)}intersectsSprite(e){return hg.center.set(0,0,0),hg.radius=.7071067811865476,hg.applyMatrix4(e.matrixWorld),this.intersectsSphere(hg)}intersectsSphere(e){const n=this.planes,r=e.center,i=-e.radius;for(let s=0;s<6;s++)if(n[s].distanceToPoint(r)0?e.max.x:e.min.x,N2.y=i.normal.y>0?e.max.y:e.min.y,N2.z=i.normal.z>0?e.max.z:e.min.z,i.distanceToPoint(N2)<0)return!1}return!0}containsPoint(e){const n=this.planes;for(let r=0;r<6;r++)if(n[r].distanceToPoint(e)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}function Vce(){let t=null,e=!1,n=null,r=null;function i(s,a){n(s,a),r=t.requestAnimationFrame(i)}return{start:function(){e!==!0&&n!==null&&(r=t.requestAnimationFrame(i),e=!0)},stop:function(){t.cancelAnimationFrame(r),e=!1},setAnimationLoop:function(s){n=s},setContext:function(s){t=s}}}function NNe(t,e){const n=e.isWebGL2,r=new WeakMap;function i(u,c){const d=u.array,f=u.usage,h=t.createBuffer();t.bindBuffer(c,h),t.bufferData(c,d,f),u.onUploadCallback();let p;if(d instanceof Float32Array)p=5126;else if(d instanceof Uint16Array)if(u.isFloat16BufferAttribute)if(n)p=5131;else throw new Error("THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.");else p=5123;else if(d instanceof Int16Array)p=5122;else if(d instanceof Uint32Array)p=5125;else if(d instanceof Int32Array)p=5124;else if(d instanceof Int8Array)p=5120;else if(d instanceof Uint8Array)p=5121;else if(d instanceof Uint8ClampedArray)p=5121;else throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: "+d);return{buffer:h,type:p,bytesPerElement:d.BYTES_PER_ELEMENT,version:u.version}}function s(u,c,d){const f=c.array,h=c.updateRange;t.bindBuffer(d,u),h.count===-1?t.bufferSubData(d,0,f):(n?t.bufferSubData(d,h.offset*f.BYTES_PER_ELEMENT,f,h.offset,h.count):t.bufferSubData(d,h.offset*f.BYTES_PER_ELEMENT,f.subarray(h.offset,h.offset+h.count)),h.count=-1)}function a(u){return u.isInterleavedBufferAttribute&&(u=u.data),r.get(u)}function o(u){u.isInterleavedBufferAttribute&&(u=u.data);const c=r.get(u);c&&(t.deleteBuffer(c.buffer),r.delete(u))}function l(u,c){if(u.isGLBufferAttribute){const f=r.get(u);(!f||f.version 0 +#endif`,jNe=`#if NUM_CLIPPING_PLANES > 0 vec4 plane; #pragma unroll_loop_start for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) { @@ -350,26 +350,26 @@ vec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 no #pragma unroll_loop_end if ( clipped ) discard; #endif -#endif`,jNe=`#if NUM_CLIPPING_PLANES > 0 - varying vec3 vClipPosition; - uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ]; #endif`,ZNe=`#if NUM_CLIPPING_PLANES > 0 varying vec3 vClipPosition; + uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ]; #endif`,JNe=`#if NUM_CLIPPING_PLANES > 0 + varying vec3 vClipPosition; +#endif`,YNe=`#if NUM_CLIPPING_PLANES > 0 vClipPosition = - mvPosition.xyz; -#endif`,YNe=`#if defined( USE_COLOR_ALPHA ) +#endif`,BNe=`#if defined( USE_COLOR_ALPHA ) diffuseColor *= vColor; #elif defined( USE_COLOR ) diffuseColor.rgb *= vColor; -#endif`,BNe=`#if defined( USE_COLOR_ALPHA ) +#endif`,HNe=`#if defined( USE_COLOR_ALPHA ) varying vec4 vColor; #elif defined( USE_COLOR ) varying vec3 vColor; -#endif`,HNe=`#if defined( USE_COLOR_ALPHA ) +#endif`,QNe=`#if defined( USE_COLOR_ALPHA ) varying vec4 vColor; #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) varying vec3 vColor; -#endif`,QNe=`#if defined( USE_COLOR_ALPHA ) +#endif`,_Ne=`#if defined( USE_COLOR_ALPHA ) vColor = vec4( 1.0 ); #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) vColor = vec3( 1.0 ); @@ -379,7 +379,7 @@ vec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 no #endif #ifdef USE_INSTANCING_COLOR vColor.xyz *= instanceColor.xyz; -#endif`,_Ne=`#define PI 3.141592653589793 +#endif`,$Ne=`#define PI 3.141592653589793 #define PI2 6.283185307179586 #define PI_HALF 1.5707963267948966 #define RECIPROCAL_PI 0.3183098861837907 @@ -450,7 +450,7 @@ vec2 equirectUv( in vec3 dir ) { float u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5; float v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; return vec2( u, v ); -}`,$Ne=`#ifdef ENVMAP_TYPE_CUBE_UV +}`,eLe=`#ifdef ENVMAP_TYPE_CUBE_UV #define cubeUV_minMipLevel 4.0 #define cubeUV_minTileSize 16.0 float getFace( vec3 direction ) { @@ -548,7 +548,7 @@ vec2 equirectUv( in vec3 dir ) { return vec4( mix( color0, color1, mipF ), 1.0 ); } } -#endif`,eLe=`vec3 transformedNormal = objectNormal; +#endif`,tLe=`vec3 transformedNormal = objectNormal; #ifdef USE_INSTANCING mat3 m = mat3( instanceMatrix ); transformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) ); @@ -563,23 +563,23 @@ transformedNormal = normalMatrix * transformedNormal; #ifdef FLIP_SIDED transformedTangent = - transformedTangent; #endif -#endif`,tLe=`#ifdef USE_DISPLACEMENTMAP +#endif`,nLe=`#ifdef USE_DISPLACEMENTMAP uniform sampler2D displacementMap; uniform float displacementScale; uniform float displacementBias; -#endif`,nLe=`#ifdef USE_DISPLACEMENTMAP +#endif`,rLe=`#ifdef USE_DISPLACEMENTMAP transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias ); -#endif`,rLe=`#ifdef USE_EMISSIVEMAP +#endif`,iLe=`#ifdef USE_EMISSIVEMAP vec4 emissiveColor = texture2D( emissiveMap, vUv ); totalEmissiveRadiance *= emissiveColor.rgb; -#endif`,iLe=`#ifdef USE_EMISSIVEMAP +#endif`,sLe=`#ifdef USE_EMISSIVEMAP uniform sampler2D emissiveMap; -#endif`,sLe="gl_FragColor = linearToOutputTexel( gl_FragColor );",aLe=`vec4 LinearToLinear( in vec4 value ) { +#endif`,aLe="gl_FragColor = linearToOutputTexel( gl_FragColor );",oLe=`vec4 LinearToLinear( in vec4 value ) { return value; } vec4 LinearTosRGB( in vec4 value ) { return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a ); -}`,oLe=`#ifdef USE_ENVMAP +}`,lLe=`#ifdef USE_ENVMAP #ifdef ENV_WORLDPOS vec3 cameraToFrag; if ( isOrthographic ) { @@ -610,7 +610,7 @@ vec4 LinearTosRGB( in vec4 value ) { #elif defined( ENVMAP_BLENDING_ADD ) outgoingLight += envColor.xyz * specularStrength * reflectivity; #endif -#endif`,lLe=`#ifdef USE_ENVMAP +#endif`,uLe=`#ifdef USE_ENVMAP uniform float envMapIntensity; uniform float flipEnvMap; #ifdef ENVMAP_TYPE_CUBE @@ -619,7 +619,7 @@ vec4 LinearTosRGB( in vec4 value ) { uniform sampler2D envMap; #endif -#endif`,uLe=`#ifdef USE_ENVMAP +#endif`,cLe=`#ifdef USE_ENVMAP uniform float reflectivity; #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) #define ENV_WORLDPOS @@ -630,7 +630,7 @@ vec4 LinearTosRGB( in vec4 value ) { #else varying vec3 vReflect; #endif -#endif`,cLe=`#ifdef USE_ENVMAP +#endif`,dLe=`#ifdef USE_ENVMAP #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG ) #define ENV_WORLDPOS #endif @@ -641,7 +641,7 @@ vec4 LinearTosRGB( in vec4 value ) { varying vec3 vReflect; uniform float refractionRatio; #endif -#endif`,dLe=`#ifdef USE_ENVMAP +#endif`,fLe=`#ifdef USE_ENVMAP #ifdef ENV_WORLDPOS vWorldPosition = worldPosition.xyz; #else @@ -658,18 +658,18 @@ vec4 LinearTosRGB( in vec4 value ) { vReflect = refract( cameraToVertex, worldNormal, refractionRatio ); #endif #endif -#endif`,fLe=`#ifdef USE_FOG - vFogDepth = - mvPosition.z; #endif`,hLe=`#ifdef USE_FOG - varying float vFogDepth; + vFogDepth = - mvPosition.z; #endif`,pLe=`#ifdef USE_FOG + varying float vFogDepth; +#endif`,mLe=`#ifdef USE_FOG #ifdef FOG_EXP2 float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth ); #else float fogFactor = smoothstep( fogNear, fogFar, vFogDepth ); #endif gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor ); -#endif`,mLe=`#ifdef USE_FOG +#endif`,vLe=`#ifdef USE_FOG uniform vec3 fogColor; varying float vFogDepth; #ifdef FOG_EXP2 @@ -678,7 +678,7 @@ vec4 LinearTosRGB( in vec4 value ) { uniform float fogNear; uniform float fogFar; #endif -#endif`,vLe=`#ifdef USE_GRADIENTMAP +#endif`,gLe=`#ifdef USE_GRADIENTMAP uniform sampler2D gradientMap; #endif vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { @@ -689,14 +689,14 @@ vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { #else return ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 ); #endif -}`,gLe=`#ifdef USE_LIGHTMAP +}`,bLe=`#ifdef USE_LIGHTMAP vec4 lightMapTexel = texture2D( lightMap, vUv2 ); vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity; reflectedLight.indirectDiffuse += lightMapIrradiance; -#endif`,bLe=`#ifdef USE_LIGHTMAP +#endif`,yLe=`#ifdef USE_LIGHTMAP uniform sampler2D lightMap; uniform float lightMapIntensity; -#endif`,yLe=`vec3 diffuse = vec3( 1.0 ); +#endif`,SLe=`vec3 diffuse = vec3( 1.0 ); GeometricContext geometry; geometry.position = mvPosition.xyz; geometry.normal = normalize( transformedNormal ); @@ -768,7 +768,7 @@ vIndirectFront += getLightProbeIrradiance( lightProbe, geometry.normal ); #endif } #pragma unroll_loop_end -#endif`,SLe=`uniform bool receiveShadow; +#endif`,xLe=`uniform bool receiveShadow; uniform vec3 ambientLightColor; uniform vec3 lightProbe[ 9 ]; vec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) { @@ -889,7 +889,7 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight ); return irradiance; } -#endif`,xLe=`#if defined( USE_ENVMAP ) +#endif`,TLe=`#if defined( USE_ENVMAP ) vec3 getIBLIrradiance( const in vec3 normal ) { #if defined( ENVMAP_TYPE_CUBE_UV ) vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); @@ -910,8 +910,8 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi return vec3( 0.0 ); #endif } -#endif`,TLe=`ToonMaterial material; -material.diffuseColor = diffuseColor.rgb;`,wLe=`varying vec3 vViewPosition; +#endif`,wLe=`ToonMaterial material; +material.diffuseColor = diffuseColor.rgb;`,ELe=`varying vec3 vViewPosition; struct ToonMaterial { vec3 diffuseColor; }; @@ -924,11 +924,11 @@ void RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContex } #define RE_Direct RE_Direct_Toon #define RE_IndirectDiffuse RE_IndirectDiffuse_Toon -#define Material_LightProbeLOD( material ) (0)`,ELe=`BlinnPhongMaterial material; +#define Material_LightProbeLOD( material ) (0)`,MLe=`BlinnPhongMaterial material; material.diffuseColor = diffuseColor.rgb; material.specularColor = specular; material.specularShininess = shininess; -material.specularStrength = specularStrength;`,MLe=`varying vec3 vViewPosition; +material.specularStrength = specularStrength;`,PLe=`varying vec3 vViewPosition; struct BlinnPhongMaterial { vec3 diffuseColor; vec3 specularColor; @@ -946,7 +946,7 @@ void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in Geometric } #define RE_Direct RE_Direct_BlinnPhong #define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong -#define Material_LightProbeLOD( material ) (0)`,PLe=`PhysicalMaterial material; +#define Material_LightProbeLOD( material ) (0)`,RLe=`PhysicalMaterial material; material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor ); vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) ); float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z ); @@ -997,7 +997,7 @@ material.roughness = min( material.roughness, 1.0 ); #ifdef USE_SHEENROUGHNESSMAP material.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a; #endif -#endif`,RLe=`struct PhysicalMaterial { +#endif`,VLe=`struct PhysicalMaterial { vec3 diffuseColor; float roughness; vec3 specularColor; @@ -1111,7 +1111,7 @@ void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradia #define RE_IndirectSpecular RE_IndirectSpecular_Physical float computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) { return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion ); -}`,VLe=` +}`,zLe=` GeometricContext geometry; geometry.position = - vViewPosition; geometry.normal = normal; @@ -1195,7 +1195,7 @@ IncidentLight directLight; #if defined( RE_IndirectSpecular ) vec3 radiance = vec3( 0.0 ); vec3 clearcoatRadiance = vec3( 0.0 ); -#endif`,zLe=`#if defined( RE_IndirectDiffuse ) +#endif`,kLe=`#if defined( RE_IndirectDiffuse ) #ifdef USE_LIGHTMAP vec4 lightMapTexel = texture2D( lightMap, vUv2 ); vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity; @@ -1210,25 +1210,25 @@ IncidentLight directLight; #ifdef USE_CLEARCOAT clearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness ); #endif -#endif`,kLe=`#if defined( RE_IndirectDiffuse ) +#endif`,OLe=`#if defined( RE_IndirectDiffuse ) RE_IndirectDiffuse( irradiance, geometry, material, reflectedLight ); #endif #if defined( RE_IndirectSpecular ) RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight ); -#endif`,OLe=`#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT ) - gl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; #endif`,ILe=`#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT ) + gl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; +#endif`,ULe=`#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT ) uniform float logDepthBufFC; varying float vFragDepth; varying float vIsPerspective; -#endif`,ULe=`#ifdef USE_LOGDEPTHBUF +#endif`,NLe=`#ifdef USE_LOGDEPTHBUF #ifdef USE_LOGDEPTHBUF_EXT varying float vFragDepth; varying float vIsPerspective; #else uniform float logDepthBufFC; #endif -#endif`,NLe=`#ifdef USE_LOGDEPTHBUF +#endif`,LLe=`#ifdef USE_LOGDEPTHBUF #ifdef USE_LOGDEPTHBUF_EXT vFragDepth = 1.0 + gl_Position.w; vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) ); @@ -1238,15 +1238,15 @@ IncidentLight directLight; gl_Position.z *= gl_Position.w; } #endif -#endif`,LLe=`#ifdef USE_MAP +#endif`,XLe=`#ifdef USE_MAP vec4 sampledDiffuseColor = texture2D( map, vUv ); #ifdef DECODE_VIDEO_TEXTURE sampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w ); #endif diffuseColor *= sampledDiffuseColor; -#endif`,XLe=`#ifdef USE_MAP +#endif`,CLe=`#ifdef USE_MAP uniform sampler2D map; -#endif`,CLe=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) +#endif`,KLe=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) vec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy; #endif #ifdef USE_MAP @@ -1254,7 +1254,7 @@ IncidentLight directLight; #endif #ifdef USE_ALPHAMAP diffuseColor.a *= texture2D( alphaMap, uv ).g; -#endif`,KLe=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) +#endif`,qLe=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) uniform mat3 uvTransform; #endif #ifdef USE_MAP @@ -1262,13 +1262,13 @@ IncidentLight directLight; #endif #ifdef USE_ALPHAMAP uniform sampler2D alphaMap; -#endif`,qLe=`float metalnessFactor = metalness; +#endif`,DLe=`float metalnessFactor = metalness; #ifdef USE_METALNESSMAP vec4 texelMetalness = texture2D( metalnessMap, vUv ); metalnessFactor *= texelMetalness.b; -#endif`,DLe=`#ifdef USE_METALNESSMAP +#endif`,WLe=`#ifdef USE_METALNESSMAP uniform sampler2D metalnessMap; -#endif`,WLe=`#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE ) +#endif`,ALe=`#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE ) vColor *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { #if defined( USE_COLOR_ALPHA ) @@ -1277,7 +1277,7 @@ IncidentLight directLight; if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ]; #endif } -#endif`,ALe=`#ifdef USE_MORPHNORMALS +#endif`,GLe=`#ifdef USE_MORPHNORMALS objectNormal *= morphTargetBaseInfluence; #ifdef MORPHTARGETS_TEXTURE for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { @@ -1289,7 +1289,7 @@ IncidentLight directLight; objectNormal += morphNormal2 * morphTargetInfluences[ 2 ]; objectNormal += morphNormal3 * morphTargetInfluences[ 3 ]; #endif -#endif`,GLe=`#ifdef USE_MORPHTARGETS +#endif`,FLe=`#ifdef USE_MORPHTARGETS uniform float morphTargetBaseInfluence; #ifdef MORPHTARGETS_TEXTURE uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ]; @@ -1309,7 +1309,7 @@ IncidentLight directLight; uniform float morphTargetInfluences[ 4 ]; #endif #endif -#endif`,FLe=`#ifdef USE_MORPHTARGETS +#endif`,jLe=`#ifdef USE_MORPHTARGETS transformed *= morphTargetBaseInfluence; #ifdef MORPHTARGETS_TEXTURE for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { @@ -1327,7 +1327,7 @@ IncidentLight directLight; transformed += morphTarget7 * morphTargetInfluences[ 7 ]; #endif #endif -#endif`,jLe=`float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; +#endif`,ZLe=`float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; #ifdef FLAT_SHADED vec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) ); vec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) ); @@ -1349,7 +1349,7 @@ IncidentLight directLight; #endif #endif #endif -vec3 geometryNormal = normal;`,ZLe=`#ifdef OBJECTSPACE_NORMALMAP +vec3 geometryNormal = normal;`,JLe=`#ifdef OBJECTSPACE_NORMALMAP normal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0; #ifdef FLIP_SIDED normal = - normal; @@ -1368,25 +1368,25 @@ vec3 geometryNormal = normal;`,ZLe=`#ifdef OBJECTSPACE_NORMALMAP #endif #elif defined( USE_BUMPMAP ) normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection ); -#endif`,JLe=`#ifndef FLAT_SHADED +#endif`,YLe=`#ifndef FLAT_SHADED varying vec3 vNormal; #ifdef USE_TANGENT varying vec3 vTangent; varying vec3 vBitangent; #endif -#endif`,YLe=`#ifndef FLAT_SHADED +#endif`,BLe=`#ifndef FLAT_SHADED varying vec3 vNormal; #ifdef USE_TANGENT varying vec3 vTangent; varying vec3 vBitangent; #endif -#endif`,BLe=`#ifndef FLAT_SHADED +#endif`,HLe=`#ifndef FLAT_SHADED vNormal = normalize( transformedNormal ); #ifdef USE_TANGENT vTangent = normalize( transformedTangent ); vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w ); #endif -#endif`,HLe=`#ifdef USE_NORMALMAP +#endif`,QLe=`#ifdef USE_NORMALMAP uniform sampler2D normalMap; uniform vec2 normalScale; #endif @@ -1408,9 +1408,9 @@ vec3 geometryNormal = normal;`,ZLe=`#ifdef OBJECTSPACE_NORMALMAP float scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det ); return normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z ); } -#endif`,QLe=`#ifdef USE_CLEARCOAT +#endif`,_Le=`#ifdef USE_CLEARCOAT vec3 clearcoatNormal = geometryNormal; -#endif`,_Le=`#ifdef USE_CLEARCOAT_NORMALMAP +#endif`,$Le=`#ifdef USE_CLEARCOAT_NORMALMAP vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0; clearcoatMapN.xy *= clearcoatNormalScale; #ifdef USE_TANGENT @@ -1418,7 +1418,7 @@ vec3 geometryNormal = normal;`,ZLe=`#ifdef OBJECTSPACE_NORMALMAP #else clearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection ); #endif -#endif`,$Le=`#ifdef USE_CLEARCOATMAP +#endif`,e8e=`#ifdef USE_CLEARCOATMAP uniform sampler2D clearcoatMap; #endif #ifdef USE_CLEARCOAT_ROUGHNESSMAP @@ -1427,13 +1427,13 @@ vec3 geometryNormal = normal;`,ZLe=`#ifdef OBJECTSPACE_NORMALMAP #ifdef USE_CLEARCOAT_NORMALMAP uniform sampler2D clearcoatNormalMap; uniform vec2 clearcoatNormalScale; -#endif`,e8e=`#ifdef OPAQUE +#endif`,t8e=`#ifdef OPAQUE diffuseColor.a = 1.0; #endif #ifdef USE_TRANSMISSION diffuseColor.a *= transmissionAlpha + 0.1; #endif -gl_FragColor = vec4( outgoingLight, diffuseColor.a );`,t8e=`vec3 packNormalToRGB( const in vec3 normal ) { +gl_FragColor = vec4( outgoingLight, diffuseColor.a );`,n8e=`vec3 packNormalToRGB( const in vec3 normal ) { return normalize( normal ) * 0.5 + 0.5; } vec3 unpackRGBToNormal( const in vec3 rgb ) { @@ -1468,29 +1468,29 @@ float viewZToPerspectiveDepth( const in float viewZ, const in float near, const } float perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) { return ( near * far ) / ( ( far - near ) * invClipZ - far ); -}`,n8e=`#ifdef PREMULTIPLIED_ALPHA +}`,r8e=`#ifdef PREMULTIPLIED_ALPHA gl_FragColor.rgb *= gl_FragColor.a; -#endif`,r8e=`vec4 mvPosition = vec4( transformed, 1.0 ); +#endif`,i8e=`vec4 mvPosition = vec4( transformed, 1.0 ); #ifdef USE_INSTANCING mvPosition = instanceMatrix * mvPosition; #endif mvPosition = modelViewMatrix * mvPosition; -gl_Position = projectionMatrix * mvPosition;`,i8e=`#ifdef DITHERING +gl_Position = projectionMatrix * mvPosition;`,s8e=`#ifdef DITHERING gl_FragColor.rgb = dithering( gl_FragColor.rgb ); -#endif`,s8e=`#ifdef DITHERING +#endif`,a8e=`#ifdef DITHERING vec3 dithering( vec3 color ) { float grid_position = rand( gl_FragCoord.xy ); vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 ); dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position ); return color + dither_shift_RGB; } -#endif`,a8e=`float roughnessFactor = roughness; +#endif`,o8e=`float roughnessFactor = roughness; #ifdef USE_ROUGHNESSMAP vec4 texelRoughness = texture2D( roughnessMap, vUv ); roughnessFactor *= texelRoughness.g; -#endif`,o8e=`#ifdef USE_ROUGHNESSMAP +#endif`,l8e=`#ifdef USE_ROUGHNESSMAP uniform sampler2D roughnessMap; -#endif`,l8e=`#ifdef USE_SHADOWMAP +#endif`,u8e=`#ifdef USE_SHADOWMAP #if NUM_DIR_LIGHT_SHADOWS > 0 uniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ]; varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ]; @@ -1664,7 +1664,7 @@ gl_Position = projectionMatrix * mvPosition;`,i8e=`#ifdef DITHERING return texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ); #endif } -#endif`,u8e=`#ifdef USE_SHADOWMAP +#endif`,c8e=`#ifdef USE_SHADOWMAP #if NUM_DIR_LIGHT_SHADOWS > 0 uniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ]; varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ]; @@ -1700,7 +1700,7 @@ gl_Position = projectionMatrix * mvPosition;`,i8e=`#ifdef DITHERING }; uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; #endif -#endif`,c8e=`#ifdef USE_SHADOWMAP +#endif`,d8e=`#ifdef USE_SHADOWMAP #if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); vec4 shadowWorldPosition; @@ -1729,7 +1729,7 @@ gl_Position = projectionMatrix * mvPosition;`,i8e=`#ifdef DITHERING } #pragma unroll_loop_end #endif -#endif`,d8e=`float getShadowMask() { +#endif`,f8e=`float getShadowMask() { float shadow = 1.0; #ifdef USE_SHADOWMAP #if NUM_DIR_LIGHT_SHADOWS > 0 @@ -1761,12 +1761,12 @@ gl_Position = projectionMatrix * mvPosition;`,i8e=`#ifdef DITHERING #endif #endif return shadow; -}`,f8e=`#ifdef USE_SKINNING +}`,h8e=`#ifdef USE_SKINNING mat4 boneMatX = getBoneMatrix( skinIndex.x ); mat4 boneMatY = getBoneMatrix( skinIndex.y ); mat4 boneMatZ = getBoneMatrix( skinIndex.z ); mat4 boneMatW = getBoneMatrix( skinIndex.w ); -#endif`,h8e=`#ifdef USE_SKINNING +#endif`,p8e=`#ifdef USE_SKINNING uniform mat4 bindMatrix; uniform mat4 bindMatrixInverse; uniform highp sampler2D boneTexture; @@ -1785,7 +1785,7 @@ gl_Position = projectionMatrix * mvPosition;`,i8e=`#ifdef DITHERING mat4 bone = mat4( v1, v2, v3, v4 ); return bone; } -#endif`,p8e=`#ifdef USE_SKINNING +#endif`,m8e=`#ifdef USE_SKINNING vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 ); vec4 skinned = vec4( 0.0 ); skinned += boneMatX * skinVertex * skinWeight.x; @@ -1793,7 +1793,7 @@ gl_Position = projectionMatrix * mvPosition;`,i8e=`#ifdef DITHERING skinned += boneMatZ * skinVertex * skinWeight.z; skinned += boneMatW * skinVertex * skinWeight.w; transformed = ( bindMatrixInverse * skinned ).xyz; -#endif`,m8e=`#ifdef USE_SKINNING +#endif`,v8e=`#ifdef USE_SKINNING mat4 skinMatrix = mat4( 0.0 ); skinMatrix += skinWeight.x * boneMatX; skinMatrix += skinWeight.y * boneMatY; @@ -1804,17 +1804,17 @@ gl_Position = projectionMatrix * mvPosition;`,i8e=`#ifdef DITHERING #ifdef USE_TANGENT objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz; #endif -#endif`,v8e=`float specularStrength; +#endif`,g8e=`float specularStrength; #ifdef USE_SPECULARMAP vec4 texelSpecular = texture2D( specularMap, vUv ); specularStrength = texelSpecular.r; #else specularStrength = 1.0; -#endif`,g8e=`#ifdef USE_SPECULARMAP +#endif`,b8e=`#ifdef USE_SPECULARMAP uniform sampler2D specularMap; -#endif`,b8e=`#if defined( TONE_MAPPING ) +#endif`,y8e=`#if defined( TONE_MAPPING ) gl_FragColor.rgb = toneMapping( gl_FragColor.rgb ); -#endif`,y8e=`#ifndef saturate +#endif`,S8e=`#ifndef saturate #define saturate( a ) clamp( a, 0.0, 1.0 ) #endif uniform float toneMappingExposure; @@ -1850,7 +1850,7 @@ vec3 ACESFilmicToneMapping( vec3 color ) { color = ACESOutputMat * color; return saturate( color ); } -vec3 CustomToneMapping( vec3 color ) { return color; }`,S8e=`#ifdef USE_TRANSMISSION +vec3 CustomToneMapping( vec3 color ) { return color; }`,x8e=`#ifdef USE_TRANSMISSION float transmissionAlpha = 1.0; float transmissionFactor = transmission; float thicknessFactor = thickness; @@ -1869,7 +1869,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,S8e=`#ifdef USE_TRANSMIS attenuationColor, attenuationDistance ); totalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor ); transmissionAlpha = mix( transmissionAlpha, transmission.a, transmissionFactor ); -#endif`,x8e=`#ifdef USE_TRANSMISSION +#endif`,T8e=`#ifdef USE_TRANSMISSION uniform float transmission; uniform float thickness; uniform float attenuationDistance; @@ -1927,37 +1927,37 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,S8e=`#ifdef USE_TRANSMIS vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness ); return vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a ); } -#endif`,T8e=`#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) ) +#endif`,w8e=`#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) ) varying vec2 vUv; -#endif`,w8e=`#ifdef USE_UV +#endif`,E8e=`#ifdef USE_UV #ifdef UVS_VERTEX_ONLY vec2 vUv; #else varying vec2 vUv; #endif uniform mat3 uvTransform; -#endif`,E8e=`#ifdef USE_UV +#endif`,M8e=`#ifdef USE_UV vUv = ( uvTransform * vec3( uv, 1 ) ).xy; -#endif`,M8e=`#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP ) - varying vec2 vUv2; #endif`,P8e=`#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP ) + varying vec2 vUv2; +#endif`,R8e=`#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP ) attribute vec2 uv2; varying vec2 vUv2; uniform mat3 uv2Transform; -#endif`,R8e=`#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP ) +#endif`,V8e=`#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP ) vUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy; -#endif`,V8e=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) +#endif`,z8e=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) vec4 worldPosition = vec4( transformed, 1.0 ); #ifdef USE_INSTANCING worldPosition = instanceMatrix * worldPosition; #endif worldPosition = modelMatrix * worldPosition; -#endif`;const z8e=`varying vec2 vUv; +#endif`;const k8e=`varying vec2 vUv; uniform mat3 uvTransform; void main() { vUv = ( uvTransform * vec3( uv, 1 ) ).xy; gl_Position = vec4( position.xy, 1.0, 1.0 ); -}`,k8e=`uniform sampler2D t2D; +}`,O8e=`uniform sampler2D t2D; varying vec2 vUv; void main() { gl_FragColor = texture2D( t2D, vUv ); @@ -1966,14 +1966,14 @@ void main() { #endif #include #include -}`,O8e=`varying vec3 vWorldDirection; +}`,I8e=`varying vec3 vWorldDirection; #include void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include #include gl_Position.z = gl_Position.w; -}`,I8e=`#include +}`,U8e=`#include uniform float opacity; varying vec3 vWorldDirection; #include @@ -1984,7 +1984,7 @@ void main() { gl_FragColor.a *= opacity; #include #include -}`,U8e=`#include +}`,N8e=`#include #include #include #include @@ -2008,7 +2008,7 @@ void main() { #include #include vHighPrecisionZW = gl_Position.zw; -}`,N8e=`#if DEPTH_PACKING == 3200 +}`,L8e=`#if DEPTH_PACKING == 3200 uniform float opacity; #endif #include @@ -2036,7 +2036,7 @@ void main() { #elif DEPTH_PACKING == 3201 gl_FragColor = packDepthToRGBA( fragCoordZ ); #endif -}`,L8e=`#define DISTANCE +}`,X8e=`#define DISTANCE varying vec3 vWorldPosition; #include #include @@ -2060,7 +2060,7 @@ void main() { #include #include vWorldPosition = worldPosition.xyz; -}`,X8e=`#define DISTANCE +}`,C8e=`#define DISTANCE uniform vec3 referencePosition; uniform float nearDistance; uniform float farDistance; @@ -2082,13 +2082,13 @@ void main () { dist = ( dist - nearDistance ) / ( farDistance - nearDistance ); dist = saturate( dist ); gl_FragColor = packDepthToRGBA( dist ); -}`,C8e=`varying vec3 vWorldDirection; +}`,K8e=`varying vec3 vWorldDirection; #include void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include #include -}`,K8e=`uniform sampler2D tEquirect; +}`,q8e=`uniform sampler2D tEquirect; varying vec3 vWorldDirection; #include void main() { @@ -2097,7 +2097,7 @@ void main() { gl_FragColor = texture2D( tEquirect, sampleUV ); #include #include -}`,q8e=`uniform float scale; +}`,D8e=`uniform float scale; attribute float lineDistance; varying float vLineDistance; #include @@ -2116,7 +2116,7 @@ void main() { #include #include #include -}`,D8e=`uniform vec3 diffuse; +}`,W8e=`uniform vec3 diffuse; uniform float opacity; uniform float dashSize; uniform float totalSize; @@ -2141,7 +2141,7 @@ void main() { #include #include #include -}`,W8e=`#include +}`,A8e=`#include #include #include #include @@ -2172,7 +2172,7 @@ void main() { #include #include #include -}`,A8e=`uniform vec3 diffuse; +}`,G8e=`uniform vec3 diffuse; uniform float opacity; #ifndef FLAT_SHADED varying vec3 vNormal; @@ -2220,7 +2220,7 @@ void main() { #include #include #include -}`,G8e=`#define LAMBERT +}`,F8e=`#define LAMBERT varying vec3 vLightFront; varying vec3 vIndirectFront; #ifdef DOUBLE_SIDED @@ -2261,7 +2261,7 @@ void main() { #include #include #include -}`,F8e=`uniform vec3 diffuse; +}`,j8e=`uniform vec3 diffuse; uniform vec3 emissive; uniform float opacity; varying vec3 vLightFront; @@ -2327,7 +2327,7 @@ void main() { #include #include #include -}`,j8e=`#define MATCAP +}`,Z8e=`#define MATCAP varying vec3 vViewPosition; #include #include @@ -2358,7 +2358,7 @@ void main() { #include #include vViewPosition = - mvPosition.xyz; -}`,Z8e=`#define MATCAP +}`,J8e=`#define MATCAP uniform vec3 diffuse; uniform float opacity; uniform sampler2D matcap; @@ -2402,7 +2402,7 @@ void main() { #include #include #include -}`,J8e=`#define NORMAL +}`,Y8e=`#define NORMAL #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP ) varying vec3 vViewPosition; #endif @@ -2432,7 +2432,7 @@ void main() { #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP ) vViewPosition = - mvPosition.xyz; #endif -}`,Y8e=`#define NORMAL +}`,B8e=`#define NORMAL uniform float opacity; #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP ) varying vec3 vViewPosition; @@ -2453,7 +2453,7 @@ void main() { #ifdef OPAQUE gl_FragColor.a = 1.0; #endif -}`,B8e=`#define PHONG +}`,H8e=`#define PHONG varying vec3 vViewPosition; #include #include @@ -2491,7 +2491,7 @@ void main() { #include #include #include -}`,H8e=`#define PHONG +}`,Q8e=`#define PHONG uniform vec3 diffuse; uniform vec3 emissive; uniform vec3 specular; @@ -2550,7 +2550,7 @@ void main() { #include #include #include -}`,Q8e=`#define STANDARD +}`,_8e=`#define STANDARD varying vec3 vViewPosition; #ifdef USE_TRANSMISSION varying vec3 vWorldPosition; @@ -2592,7 +2592,7 @@ void main() { #ifdef USE_TRANSMISSION vWorldPosition = worldPosition.xyz; #endif -}`,_8e=`#define STANDARD +}`,$8e=`#define STANDARD #ifdef PHYSICAL #define IOR #define SPECULAR @@ -2700,7 +2700,7 @@ void main() { #include #include #include -}`,$8e=`#define TOON +}`,e4e=`#define TOON varying vec3 vViewPosition; #include #include @@ -2736,7 +2736,7 @@ void main() { #include #include #include -}`,e4e=`#define TOON +}`,t4e=`#define TOON uniform vec3 diffuse; uniform vec3 emissive; uniform float opacity; @@ -2788,7 +2788,7 @@ void main() { #include #include #include -}`,t4e=`uniform float size; +}`,n4e=`uniform float size; uniform float scale; #include #include @@ -2811,7 +2811,7 @@ void main() { #include #include #include -}`,n4e=`uniform vec3 diffuse; +}`,r4e=`uniform vec3 diffuse; uniform float opacity; #include #include @@ -2834,7 +2834,7 @@ void main() { #include #include #include -}`,r4e=`#include +}`,i4e=`#include #include #include #include @@ -2852,7 +2852,7 @@ void main() { #include #include #include -}`,i4e=`uniform vec3 color; +}`,s4e=`uniform vec3 color; uniform float opacity; #include #include @@ -2866,7 +2866,7 @@ void main() { #include #include #include -}`,s4e=`uniform float rotation; +}`,a4e=`uniform float rotation; uniform vec2 center; #include #include @@ -2892,7 +2892,7 @@ void main() { #include #include #include -}`,a4e=`uniform vec3 diffuse; +}`,o4e=`uniform vec3 diffuse; uniform float opacity; #include #include @@ -2915,7 +2915,7 @@ void main() { #include #include #include -}`,yn={alphamap_fragment:NNe,alphamap_pars_fragment:LNe,alphatest_fragment:XNe,alphatest_pars_fragment:CNe,aomap_fragment:KNe,aomap_pars_fragment:qNe,begin_vertex:DNe,beginnormal_vertex:WNe,bsdfs:ANe,bumpmap_pars_fragment:GNe,clipping_planes_fragment:FNe,clipping_planes_pars_fragment:jNe,clipping_planes_pars_vertex:ZNe,clipping_planes_vertex:JNe,color_fragment:YNe,color_pars_fragment:BNe,color_pars_vertex:HNe,color_vertex:QNe,common:_Ne,cube_uv_reflection_fragment:$Ne,defaultnormal_vertex:eLe,displacementmap_pars_vertex:tLe,displacementmap_vertex:nLe,emissivemap_fragment:rLe,emissivemap_pars_fragment:iLe,encodings_fragment:sLe,encodings_pars_fragment:aLe,envmap_fragment:oLe,envmap_common_pars_fragment:lLe,envmap_pars_fragment:uLe,envmap_pars_vertex:cLe,envmap_physical_pars_fragment:xLe,envmap_vertex:dLe,fog_vertex:fLe,fog_pars_vertex:hLe,fog_fragment:pLe,fog_pars_fragment:mLe,gradientmap_pars_fragment:vLe,lightmap_fragment:gLe,lightmap_pars_fragment:bLe,lights_lambert_vertex:yLe,lights_pars_begin:SLe,lights_toon_fragment:TLe,lights_toon_pars_fragment:wLe,lights_phong_fragment:ELe,lights_phong_pars_fragment:MLe,lights_physical_fragment:PLe,lights_physical_pars_fragment:RLe,lights_fragment_begin:VLe,lights_fragment_maps:zLe,lights_fragment_end:kLe,logdepthbuf_fragment:OLe,logdepthbuf_pars_fragment:ILe,logdepthbuf_pars_vertex:ULe,logdepthbuf_vertex:NLe,map_fragment:LLe,map_pars_fragment:XLe,map_particle_fragment:CLe,map_particle_pars_fragment:KLe,metalnessmap_fragment:qLe,metalnessmap_pars_fragment:DLe,morphcolor_vertex:WLe,morphnormal_vertex:ALe,morphtarget_pars_vertex:GLe,morphtarget_vertex:FLe,normal_fragment_begin:jLe,normal_fragment_maps:ZLe,normal_pars_fragment:JLe,normal_pars_vertex:YLe,normal_vertex:BLe,normalmap_pars_fragment:HLe,clearcoat_normal_fragment_begin:QLe,clearcoat_normal_fragment_maps:_Le,clearcoat_pars_fragment:$Le,output_fragment:e8e,packing:t8e,premultiplied_alpha_fragment:n8e,project_vertex:r8e,dithering_fragment:i8e,dithering_pars_fragment:s8e,roughnessmap_fragment:a8e,roughnessmap_pars_fragment:o8e,shadowmap_pars_fragment:l8e,shadowmap_pars_vertex:u8e,shadowmap_vertex:c8e,shadowmask_pars_fragment:d8e,skinbase_vertex:f8e,skinning_pars_vertex:h8e,skinning_vertex:p8e,skinnormal_vertex:m8e,specularmap_fragment:v8e,specularmap_pars_fragment:g8e,tonemapping_fragment:b8e,tonemapping_pars_fragment:y8e,transmission_fragment:S8e,transmission_pars_fragment:x8e,uv_pars_fragment:T8e,uv_pars_vertex:w8e,uv_vertex:E8e,uv2_pars_fragment:M8e,uv2_pars_vertex:P8e,uv2_vertex:R8e,worldpos_vertex:V8e,background_vert:z8e,background_frag:k8e,cube_vert:O8e,cube_frag:I8e,depth_vert:U8e,depth_frag:N8e,distanceRGBA_vert:L8e,distanceRGBA_frag:X8e,equirect_vert:C8e,equirect_frag:K8e,linedashed_vert:q8e,linedashed_frag:D8e,meshbasic_vert:W8e,meshbasic_frag:A8e,meshlambert_vert:G8e,meshlambert_frag:F8e,meshmatcap_vert:j8e,meshmatcap_frag:Z8e,meshnormal_vert:J8e,meshnormal_frag:Y8e,meshphong_vert:B8e,meshphong_frag:H8e,meshphysical_vert:Q8e,meshphysical_frag:_8e,meshtoon_vert:$8e,meshtoon_frag:e4e,points_vert:t4e,points_frag:n4e,shadow_vert:r4e,shadow_frag:i4e,sprite_vert:s4e,sprite_frag:a4e},St={common:{diffuse:{value:new tt(16777215)},opacity:{value:1},map:{value:null},uvTransform:{value:new as},uv2Transform:{value:new as},alphaMap:{value:null},alphaTest:{value:0}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new Oe(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new tt(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new tt(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new as}},sprite:{diffuse:{value:new tt(16777215)},opacity:{value:1},center:{value:new Oe(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new as}}},wi={basic:{uniforms:Sa([St.common,St.specularmap,St.envmap,St.aomap,St.lightmap,St.fog]),vertexShader:yn.meshbasic_vert,fragmentShader:yn.meshbasic_frag},lambert:{uniforms:Sa([St.common,St.specularmap,St.envmap,St.aomap,St.lightmap,St.emissivemap,St.fog,St.lights,{emissive:{value:new tt(0)}}]),vertexShader:yn.meshlambert_vert,fragmentShader:yn.meshlambert_frag},phong:{uniforms:Sa([St.common,St.specularmap,St.envmap,St.aomap,St.lightmap,St.emissivemap,St.bumpmap,St.normalmap,St.displacementmap,St.fog,St.lights,{emissive:{value:new tt(0)},specular:{value:new tt(1118481)},shininess:{value:30}}]),vertexShader:yn.meshphong_vert,fragmentShader:yn.meshphong_frag},standard:{uniforms:Sa([St.common,St.envmap,St.aomap,St.lightmap,St.emissivemap,St.bumpmap,St.normalmap,St.displacementmap,St.roughnessmap,St.metalnessmap,St.fog,St.lights,{emissive:{value:new tt(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:yn.meshphysical_vert,fragmentShader:yn.meshphysical_frag},toon:{uniforms:Sa([St.common,St.aomap,St.lightmap,St.emissivemap,St.bumpmap,St.normalmap,St.displacementmap,St.gradientmap,St.fog,St.lights,{emissive:{value:new tt(0)}}]),vertexShader:yn.meshtoon_vert,fragmentShader:yn.meshtoon_frag},matcap:{uniforms:Sa([St.common,St.bumpmap,St.normalmap,St.displacementmap,St.fog,{matcap:{value:null}}]),vertexShader:yn.meshmatcap_vert,fragmentShader:yn.meshmatcap_frag},points:{uniforms:Sa([St.points,St.fog]),vertexShader:yn.points_vert,fragmentShader:yn.points_frag},dashed:{uniforms:Sa([St.common,St.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:yn.linedashed_vert,fragmentShader:yn.linedashed_frag},depth:{uniforms:Sa([St.common,St.displacementmap]),vertexShader:yn.depth_vert,fragmentShader:yn.depth_frag},normal:{uniforms:Sa([St.common,St.bumpmap,St.normalmap,St.displacementmap,{opacity:{value:1}}]),vertexShader:yn.meshnormal_vert,fragmentShader:yn.meshnormal_frag},sprite:{uniforms:Sa([St.sprite,St.fog]),vertexShader:yn.sprite_vert,fragmentShader:yn.sprite_frag},background:{uniforms:{uvTransform:{value:new as},t2D:{value:null}},vertexShader:yn.background_vert,fragmentShader:yn.background_frag},cube:{uniforms:Sa([St.envmap,{opacity:{value:1}}]),vertexShader:yn.cube_vert,fragmentShader:yn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:yn.equirect_vert,fragmentShader:yn.equirect_frag},distanceRGBA:{uniforms:Sa([St.common,St.displacementmap,{referencePosition:{value:new U},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:yn.distanceRGBA_vert,fragmentShader:yn.distanceRGBA_frag},shadow:{uniforms:Sa([St.lights,St.fog,{color:{value:new tt(0)},opacity:{value:1}}]),vertexShader:yn.shadow_vert,fragmentShader:yn.shadow_frag}};wi.physical={uniforms:Sa([wi.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new Oe(1,1)},clearcoatNormalMap:{value:null},sheen:{value:0},sheenColor:{value:new tt(0)},sheenColorMap:{value:null},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},transmission:{value:0},transmissionMap:{value:null},transmissionSamplerSize:{value:new Oe},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},attenuationDistance:{value:0},attenuationColor:{value:new tt(0)},specularIntensity:{value:1},specularIntensityMap:{value:null},specularColor:{value:new tt(1,1,1)},specularColorMap:{value:null}}]),vertexShader:yn.meshphysical_vert,fragmentShader:yn.meshphysical_frag};function o4e(t,e,n,r,i,s){const a=new tt(0);let o=i===!0?0:1,l,u,c=null,d=0,f=null;function h(m,v){let g=!1,b=v.isScene===!0?v.background:null;b&&b.isTexture&&(b=e.get(b));const y=t.xr,x=y.getSession&&y.getSession();x&&x.environmentBlendMode==="additive"&&(b=null),b===null?p(a,o):b&&b.isColor&&(p(b,1),g=!0),(t.autoClear||g)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),b&&(b.isCubeTexture||b.mapping===fy)?(u===void 0&&(u=new ut(new pi(1,1,1),new bi({name:"BackgroundCubeMaterial",uniforms:vb(wi.cube.uniforms),vertexShader:wi.cube.vertexShader,fragmentShader:wi.cube.fragmentShader,side:Ua,depthTest:!1,depthWrite:!1,fog:!1})),u.geometry.deleteAttribute("normal"),u.geometry.deleteAttribute("uv"),u.onBeforeRender=function(T,M,E){this.matrixWorld.copyPosition(E.matrixWorld)},Object.defineProperty(u.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),r.update(u)),u.material.uniforms.envMap.value=b,u.material.uniforms.flipEnvMap.value=b.isCubeTexture&&b.isRenderTargetTexture===!1?-1:1,(c!==b||d!==b.version||f!==t.toneMapping)&&(u.material.needsUpdate=!0,c=b,d=b.version,f=t.toneMapping),u.layers.enableAll(),m.unshift(u,u.geometry,u.material,0,0,null)):b&&b.isTexture&&(l===void 0&&(l=new ut(new ao(2,2),new bi({name:"BackgroundMaterial",uniforms:vb(wi.background.uniforms),vertexShader:wi.background.vertexShader,fragmentShader:wi.background.fragmentShader,side:Ki,depthTest:!1,depthWrite:!1,fog:!1})),l.geometry.deleteAttribute("normal"),Object.defineProperty(l.material,"map",{get:function(){return this.uniforms.t2D.value}}),r.update(l)),l.material.uniforms.t2D.value=b,b.matrixAutoUpdate===!0&&b.updateMatrix(),l.material.uniforms.uvTransform.value.copy(b.matrix),(c!==b||d!==b.version||f!==t.toneMapping)&&(l.material.needsUpdate=!0,c=b,d=b.version,f=t.toneMapping),l.layers.enableAll(),m.unshift(l,l.geometry,l.material,0,0,null))}function p(m,v){n.buffers.color.setClear(m.r,m.g,m.b,v,s)}return{getClearColor:function(){return a},setClearColor:function(m,v=1){a.set(m),o=v,p(a,o)},getClearAlpha:function(){return o},setClearAlpha:function(m){o=m,p(a,o)},render:h}}function l4e(t,e,n,r){const i=t.getParameter(34921),s=r.isWebGL2?null:e.get("OES_vertex_array_object"),a=r.isWebGL2||s!==null,o={},l=v(null);let u=l,c=!1;function d(N,q,L,A,Z){let j=!1;if(a){const ne=m(A,L,q);u!==ne&&(u=ne,h(u.object)),j=g(N,A,L,Z),j&&b(N,A,L,Z)}else{const ne=q.wireframe===!0;(u.geometry!==A.id||u.program!==L.id||u.wireframe!==ne)&&(u.geometry=A.id,u.program=L.id,u.wireframe=ne,j=!0)}Z!==null&&n.update(Z,34963),(j||c)&&(c=!1,S(N,q,L,A),Z!==null&&t.bindBuffer(34963,n.get(Z).buffer))}function f(){return r.isWebGL2?t.createVertexArray():s.createVertexArrayOES()}function h(N){return r.isWebGL2?t.bindVertexArray(N):s.bindVertexArrayOES(N)}function p(N){return r.isWebGL2?t.deleteVertexArray(N):s.deleteVertexArrayOES(N)}function m(N,q,L){const A=L.wireframe===!0;let Z=o[N.id];Z===void 0&&(Z={},o[N.id]=Z);let j=Z[q.id];j===void 0&&(j={},Z[q.id]=j);let ne=j[A];return ne===void 0&&(ne=v(f()),j[A]=ne),ne}function v(N){const q=[],L=[],A=[];for(let Z=0;Z=0){const ce=Z[B];let fe=j[B];if(fe===void 0&&(B==="instanceMatrix"&&N.instanceMatrix&&(fe=N.instanceMatrix),B==="instanceColor"&&N.instanceColor&&(fe=N.instanceColor)),ce===void 0||ce.attribute!==fe||fe&&ce.data!==fe.data)return!0;ne++}return u.attributesNum!==ne||u.index!==A}function b(N,q,L,A){const Z={},j=q.attributes;let ne=0;const G=L.getAttributes();for(const B in G)if(G[B].location>=0){let ce=j[B];ce===void 0&&(B==="instanceMatrix"&&N.instanceMatrix&&(ce=N.instanceMatrix),B==="instanceColor"&&N.instanceColor&&(ce=N.instanceColor));const fe={};fe.attribute=ce,ce&&ce.data&&(fe.data=ce.data),Z[B]=fe,ne++}u.attributes=Z,u.attributesNum=ne,u.index=A}function y(){const N=u.newAttributes;for(let q=0,L=N.length;q=0){let ee=Z[G];if(ee===void 0&&(G==="instanceMatrix"&&N.instanceMatrix&&(ee=N.instanceMatrix),G==="instanceColor"&&N.instanceColor&&(ee=N.instanceColor)),ee!==void 0){const ce=ee.normalized,fe=ee.itemSize,te=n.get(ee);if(te===void 0)continue;const _=te.buffer,oe=te.type,ye=te.bytesPerElement;if(ee.isInterleavedBufferAttribute){const ve=ee.data,Ke=ve.stride,le=ee.offset;if(ve.isInstancedInterleavedBuffer){for(let D=0;D0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";E="mediump"}return E==="mediump"&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const a=typeof WebGL2RenderingContext<"u"&&t instanceof WebGL2RenderingContext||typeof WebGL2ComputeRenderingContext<"u"&&t instanceof WebGL2ComputeRenderingContext;let o=n.precision!==void 0?n.precision:"highp";const l=s(o);l!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",l,"instead."),o=l);const u=a||e.has("WEBGL_draw_buffers"),c=n.logarithmicDepthBuffer===!0,d=t.getParameter(34930),f=t.getParameter(35660),h=t.getParameter(3379),p=t.getParameter(34076),m=t.getParameter(34921),v=t.getParameter(36347),g=t.getParameter(36348),b=t.getParameter(36349),y=f>0,x=a||e.has("OES_texture_float"),T=y&&x,M=a?t.getParameter(36183):0;return{isWebGL2:a,drawBuffers:u,getMaxAnisotropy:i,getMaxPrecision:s,precision:o,logarithmicDepthBuffer:c,maxTextures:d,maxVertexTextures:f,maxTextureSize:h,maxCubemapSize:p,maxAttributes:m,maxVertexUniforms:v,maxVaryings:g,maxFragmentUniforms:b,vertexTextures:y,floatFragmentTextures:x,floatVertexTextures:T,maxSamples:M}}function d4e(t){const e=this;let n=null,r=0,i=!1,s=!1;const a=new ri,o=new as,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(d,f,h){const p=d.length!==0||f||r!==0||i;return i=f,n=c(d,h,0),r=d.length,p},this.beginShadows=function(){s=!0,c(null)},this.endShadows=function(){s=!1,u()},this.setState=function(d,f,h){const p=d.clippingPlanes,m=d.clipIntersection,v=d.clipShadows,g=t.get(d);if(!i||p===null||p.length===0||s&&!v)s?c(null):u();else{const b=s?0:r,y=b*4;let x=g.clippingState||null;l.value=x,x=c(p,f,y,h);for(let T=0;T!==y;++T)x[T]=n[T];g.clippingState=x,this.numIntersection=m?this.numPlanes:0,this.numPlanes+=b}};function u(){l.value!==n&&(l.value=n,l.needsUpdate=r>0),e.numPlanes=r,e.numIntersection=0}function c(d,f,h,p){const m=d!==null?d.length:0;let v=null;if(m!==0){if(v=l.value,p!==!0||v===null){const g=h+m*4,b=f.matrixWorldInverse;o.getNormalMatrix(b),(v===null||v.length0){const u=new WV(l.height/2);return u.fromEquirectangularTexture(t,a),e.set(a,u),a.addEventListener("dispose",i),n(u.texture,a.mapping)}else return null}}return a}function i(a){const o=a.target;o.removeEventListener("dispose",i);const l=e.get(o);l!==void 0&&(e.delete(o),l.dispose())}function s(){e=new WeakMap}return{get:r,dispose:s}}class Kf extends TT{constructor(e=-1,n=1,r=1,i=-1,s=.1,a=2e3){super(),this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=e,this.right=n,this.top=r,this.bottom=i,this.near=s,this.far=a,this.updateProjectionMatrix()}copy(e,n){return super.copy(e,n),this.left=e.left,this.right=e.right,this.top=e.top,this.bottom=e.bottom,this.near=e.near,this.far=e.far,this.zoom=e.zoom,this.view=e.view===null?null:Object.assign({},e.view),this}setViewOffset(e,n,r,i,s,a){this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=n,this.view.offsetX=r,this.view.offsetY=i,this.view.width=s,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=(this.right-this.left)/(2*this.zoom),n=(this.top-this.bottom)/(2*this.zoom),r=(this.right+this.left)/2,i=(this.top+this.bottom)/2;let s=r-e,a=r+e,o=i+n,l=i-n;if(this.view!==null&&this.view.enabled){const u=(this.right-this.left)/this.view.fullWidth/this.zoom,c=(this.top-this.bottom)/this.view.fullHeight/this.zoom;s+=u*this.view.offsetX,a=s+u*this.view.width,o-=c*this.view.offsetY,l=o-c*this.view.height}this.projectionMatrix.makeOrthographic(s,a,o,l,this.near,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const n=super.toJSON(e);return n.object.zoom=this.zoom,n.object.left=this.left,n.object.right=this.right,n.object.top=this.top,n.object.bottom=this.bottom,n.object.near=this.near,n.object.far=this.far,this.view!==null&&(n.object.view=Object.assign({},this.view)),n}}Kf.prototype.isOrthographicCamera=!0;const d1=4,EZ=[.125,.215,.35,.446,.526,.582],av=20,Wk=new Kf,MZ=new tt;let Ak=null;const $m=(1+Math.sqrt(5))/2,pg=1/$m,PZ=[new U(1,1,1),new U(-1,1,1),new U(1,1,-1),new U(-1,1,-1),new U(0,$m,pg),new U(0,$m,-pg),new U(pg,0,$m),new U(-pg,0,$m),new U($m,pg,0),new U(-$m,pg,0)];class lP{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,n=0,r=.1,i=100){Ak=this._renderer.getRenderTarget(),this._setSize(256);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,r,i,s),n>0&&this._blur(s,0,0,n),this._applyPMREM(s),this._cleanup(s),s}fromEquirectangular(e,n=null){return this._fromTexture(e,n)}fromCubemap(e,n=null){return this._fromTexture(e,n)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=zZ(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=VZ(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose()}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let e=0;e2?y:0,y,y),c.setRenderTarget(i),m&&c.render(p,o),c.render(e,o)}p.geometry.dispose(),p.material.dispose(),c.toneMapping=f,c.autoClear=d,e.background=v}_textureToCubeUV(e,n){const r=this._renderer,i=e.mapping===Ip||e.mapping===Up;i?(this._cubemapMaterial===null&&(this._cubemapMaterial=zZ()),this._cubemapMaterial.uniforms.flipEnvMap.value=e.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=VZ());const s=i?this._cubemapMaterial:this._equirectMaterial,a=new ut(this._lodPlanes[0],s),o=s.uniforms;o.envMap.value=e;const l=this._cubeSize;L2(n,0,0,3*l,2*l),r.setRenderTarget(n),r.render(a,Wk)}_applyPMREM(e){const n=this._renderer,r=n.autoClear;n.autoClear=!1;for(let i=1;iav&&console.warn(`sigmaRadians, ${s}, is too large and will clip, as it requested ${v} samples when the maximum is set to ${av}`);const g=[];let b=0;for(let E=0;Ey-d1?i-y+d1:0),M=4*(this._cubeSize-x);L2(n,T,M,3*x,2*x),l.setRenderTarget(n),l.render(d,Wk)}}function h4e(t){const e=[],n=[],r=[];let i=t;const s=t-d1+1+EZ.length;for(let a=0;at-d1?l=EZ[a-t+d1-1]:a===0&&(l=0),r.push(l);const u=1/(o-2),c=-u,d=1+u,f=[c,c,d,c,d,d,c,c,d,d,c,d],h=6,p=6,m=3,v=2,g=1,b=new Float32Array(m*p*h),y=new Float32Array(v*p*h),x=new Float32Array(g*p*h);for(let M=0;M2?0:-1,P=[E,S,0,E+2/3,S,0,E+2/3,S+1,0,E,S,0,E+2/3,S+1,0,E,S+1,0];b.set(P,m*p*M),y.set(f,v*p*M);const R=[M,M,M,M,M,M];x.set(R,g*p*M)}const T=new Lt;T.setAttribute("position",new un(b,m)),T.setAttribute("uv",new un(y,v)),T.setAttribute("faceIndex",new un(x,g)),e.push(T),i>d1&&i--}return{lodPlanes:e,sizeLods:n,sigmas:r}}function RZ(t,e,n){const r=new oi(t,e,n);return r.texture.mapping=fy,r.texture.name="PMREM.cubeUv",r.scissorTest=!0,r}function L2(t,e,n,r,i){t.viewport.set(e,n,r,i),t.scissor.set(e,n,r,i)}function p4e(t,e,n){const r=new Float32Array(av),i=new U(0,1,0);return new bi({name:"SphericalGaussianBlur",defines:{n:av,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${t}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:r},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:i}},vertexShader:TK(),fragmentShader:` +}`,yn={alphamap_fragment:LNe,alphamap_pars_fragment:XNe,alphatest_fragment:CNe,alphatest_pars_fragment:KNe,aomap_fragment:qNe,aomap_pars_fragment:DNe,begin_vertex:WNe,beginnormal_vertex:ANe,bsdfs:GNe,bumpmap_pars_fragment:FNe,clipping_planes_fragment:jNe,clipping_planes_pars_fragment:ZNe,clipping_planes_pars_vertex:JNe,clipping_planes_vertex:YNe,color_fragment:BNe,color_pars_fragment:HNe,color_pars_vertex:QNe,color_vertex:_Ne,common:$Ne,cube_uv_reflection_fragment:eLe,defaultnormal_vertex:tLe,displacementmap_pars_vertex:nLe,displacementmap_vertex:rLe,emissivemap_fragment:iLe,emissivemap_pars_fragment:sLe,encodings_fragment:aLe,encodings_pars_fragment:oLe,envmap_fragment:lLe,envmap_common_pars_fragment:uLe,envmap_pars_fragment:cLe,envmap_pars_vertex:dLe,envmap_physical_pars_fragment:TLe,envmap_vertex:fLe,fog_vertex:hLe,fog_pars_vertex:pLe,fog_fragment:mLe,fog_pars_fragment:vLe,gradientmap_pars_fragment:gLe,lightmap_fragment:bLe,lightmap_pars_fragment:yLe,lights_lambert_vertex:SLe,lights_pars_begin:xLe,lights_toon_fragment:wLe,lights_toon_pars_fragment:ELe,lights_phong_fragment:MLe,lights_phong_pars_fragment:PLe,lights_physical_fragment:RLe,lights_physical_pars_fragment:VLe,lights_fragment_begin:zLe,lights_fragment_maps:kLe,lights_fragment_end:OLe,logdepthbuf_fragment:ILe,logdepthbuf_pars_fragment:ULe,logdepthbuf_pars_vertex:NLe,logdepthbuf_vertex:LLe,map_fragment:XLe,map_pars_fragment:CLe,map_particle_fragment:KLe,map_particle_pars_fragment:qLe,metalnessmap_fragment:DLe,metalnessmap_pars_fragment:WLe,morphcolor_vertex:ALe,morphnormal_vertex:GLe,morphtarget_pars_vertex:FLe,morphtarget_vertex:jLe,normal_fragment_begin:ZLe,normal_fragment_maps:JLe,normal_pars_fragment:YLe,normal_pars_vertex:BLe,normal_vertex:HLe,normalmap_pars_fragment:QLe,clearcoat_normal_fragment_begin:_Le,clearcoat_normal_fragment_maps:$Le,clearcoat_pars_fragment:e8e,output_fragment:t8e,packing:n8e,premultiplied_alpha_fragment:r8e,project_vertex:i8e,dithering_fragment:s8e,dithering_pars_fragment:a8e,roughnessmap_fragment:o8e,roughnessmap_pars_fragment:l8e,shadowmap_pars_fragment:u8e,shadowmap_pars_vertex:c8e,shadowmap_vertex:d8e,shadowmask_pars_fragment:f8e,skinbase_vertex:h8e,skinning_pars_vertex:p8e,skinning_vertex:m8e,skinnormal_vertex:v8e,specularmap_fragment:g8e,specularmap_pars_fragment:b8e,tonemapping_fragment:y8e,tonemapping_pars_fragment:S8e,transmission_fragment:x8e,transmission_pars_fragment:T8e,uv_pars_fragment:w8e,uv_pars_vertex:E8e,uv_vertex:M8e,uv2_pars_fragment:P8e,uv2_pars_vertex:R8e,uv2_vertex:V8e,worldpos_vertex:z8e,background_vert:k8e,background_frag:O8e,cube_vert:I8e,cube_frag:U8e,depth_vert:N8e,depth_frag:L8e,distanceRGBA_vert:X8e,distanceRGBA_frag:C8e,equirect_vert:K8e,equirect_frag:q8e,linedashed_vert:D8e,linedashed_frag:W8e,meshbasic_vert:A8e,meshbasic_frag:G8e,meshlambert_vert:F8e,meshlambert_frag:j8e,meshmatcap_vert:Z8e,meshmatcap_frag:J8e,meshnormal_vert:Y8e,meshnormal_frag:B8e,meshphong_vert:H8e,meshphong_frag:Q8e,meshphysical_vert:_8e,meshphysical_frag:$8e,meshtoon_vert:e4e,meshtoon_frag:t4e,points_vert:n4e,points_frag:r4e,shadow_vert:i4e,shadow_frag:s4e,sprite_vert:a4e,sprite_frag:o4e},St={common:{diffuse:{value:new tt(16777215)},opacity:{value:1},map:{value:null},uvTransform:{value:new as},uv2Transform:{value:new as},alphaMap:{value:null},alphaTest:{value:0}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new Oe(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new tt(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new tt(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new as}},sprite:{diffuse:{value:new tt(16777215)},opacity:{value:1},center:{value:new Oe(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new as}}},wi={basic:{uniforms:Sa([St.common,St.specularmap,St.envmap,St.aomap,St.lightmap,St.fog]),vertexShader:yn.meshbasic_vert,fragmentShader:yn.meshbasic_frag},lambert:{uniforms:Sa([St.common,St.specularmap,St.envmap,St.aomap,St.lightmap,St.emissivemap,St.fog,St.lights,{emissive:{value:new tt(0)}}]),vertexShader:yn.meshlambert_vert,fragmentShader:yn.meshlambert_frag},phong:{uniforms:Sa([St.common,St.specularmap,St.envmap,St.aomap,St.lightmap,St.emissivemap,St.bumpmap,St.normalmap,St.displacementmap,St.fog,St.lights,{emissive:{value:new tt(0)},specular:{value:new tt(1118481)},shininess:{value:30}}]),vertexShader:yn.meshphong_vert,fragmentShader:yn.meshphong_frag},standard:{uniforms:Sa([St.common,St.envmap,St.aomap,St.lightmap,St.emissivemap,St.bumpmap,St.normalmap,St.displacementmap,St.roughnessmap,St.metalnessmap,St.fog,St.lights,{emissive:{value:new tt(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:yn.meshphysical_vert,fragmentShader:yn.meshphysical_frag},toon:{uniforms:Sa([St.common,St.aomap,St.lightmap,St.emissivemap,St.bumpmap,St.normalmap,St.displacementmap,St.gradientmap,St.fog,St.lights,{emissive:{value:new tt(0)}}]),vertexShader:yn.meshtoon_vert,fragmentShader:yn.meshtoon_frag},matcap:{uniforms:Sa([St.common,St.bumpmap,St.normalmap,St.displacementmap,St.fog,{matcap:{value:null}}]),vertexShader:yn.meshmatcap_vert,fragmentShader:yn.meshmatcap_frag},points:{uniforms:Sa([St.points,St.fog]),vertexShader:yn.points_vert,fragmentShader:yn.points_frag},dashed:{uniforms:Sa([St.common,St.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:yn.linedashed_vert,fragmentShader:yn.linedashed_frag},depth:{uniforms:Sa([St.common,St.displacementmap]),vertexShader:yn.depth_vert,fragmentShader:yn.depth_frag},normal:{uniforms:Sa([St.common,St.bumpmap,St.normalmap,St.displacementmap,{opacity:{value:1}}]),vertexShader:yn.meshnormal_vert,fragmentShader:yn.meshnormal_frag},sprite:{uniforms:Sa([St.sprite,St.fog]),vertexShader:yn.sprite_vert,fragmentShader:yn.sprite_frag},background:{uniforms:{uvTransform:{value:new as},t2D:{value:null}},vertexShader:yn.background_vert,fragmentShader:yn.background_frag},cube:{uniforms:Sa([St.envmap,{opacity:{value:1}}]),vertexShader:yn.cube_vert,fragmentShader:yn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:yn.equirect_vert,fragmentShader:yn.equirect_frag},distanceRGBA:{uniforms:Sa([St.common,St.displacementmap,{referencePosition:{value:new U},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:yn.distanceRGBA_vert,fragmentShader:yn.distanceRGBA_frag},shadow:{uniforms:Sa([St.lights,St.fog,{color:{value:new tt(0)},opacity:{value:1}}]),vertexShader:yn.shadow_vert,fragmentShader:yn.shadow_frag}};wi.physical={uniforms:Sa([wi.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new Oe(1,1)},clearcoatNormalMap:{value:null},sheen:{value:0},sheenColor:{value:new tt(0)},sheenColorMap:{value:null},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},transmission:{value:0},transmissionMap:{value:null},transmissionSamplerSize:{value:new Oe},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},attenuationDistance:{value:0},attenuationColor:{value:new tt(0)},specularIntensity:{value:1},specularIntensityMap:{value:null},specularColor:{value:new tt(1,1,1)},specularColorMap:{value:null}}]),vertexShader:yn.meshphysical_vert,fragmentShader:yn.meshphysical_frag};function l4e(t,e,n,r,i,s){const a=new tt(0);let o=i===!0?0:1,l,u,c=null,d=0,f=null;function h(m,v){let g=!1,b=v.isScene===!0?v.background:null;b&&b.isTexture&&(b=e.get(b));const y=t.xr,x=y.getSession&&y.getSession();x&&x.environmentBlendMode==="additive"&&(b=null),b===null?p(a,o):b&&b.isColor&&(p(b,1),g=!0),(t.autoClear||g)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),b&&(b.isCubeTexture||b.mapping===dy)?(u===void 0&&(u=new ut(new pi(1,1,1),new bi({name:"BackgroundCubeMaterial",uniforms:vb(wi.cube.uniforms),vertexShader:wi.cube.vertexShader,fragmentShader:wi.cube.fragmentShader,side:Ua,depthTest:!1,depthWrite:!1,fog:!1})),u.geometry.deleteAttribute("normal"),u.geometry.deleteAttribute("uv"),u.onBeforeRender=function(T,M,E){this.matrixWorld.copyPosition(E.matrixWorld)},Object.defineProperty(u.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),r.update(u)),u.material.uniforms.envMap.value=b,u.material.uniforms.flipEnvMap.value=b.isCubeTexture&&b.isRenderTargetTexture===!1?-1:1,(c!==b||d!==b.version||f!==t.toneMapping)&&(u.material.needsUpdate=!0,c=b,d=b.version,f=t.toneMapping),u.layers.enableAll(),m.unshift(u,u.geometry,u.material,0,0,null)):b&&b.isTexture&&(l===void 0&&(l=new ut(new ao(2,2),new bi({name:"BackgroundMaterial",uniforms:vb(wi.background.uniforms),vertexShader:wi.background.vertexShader,fragmentShader:wi.background.fragmentShader,side:Ki,depthTest:!1,depthWrite:!1,fog:!1})),l.geometry.deleteAttribute("normal"),Object.defineProperty(l.material,"map",{get:function(){return this.uniforms.t2D.value}}),r.update(l)),l.material.uniforms.t2D.value=b,b.matrixAutoUpdate===!0&&b.updateMatrix(),l.material.uniforms.uvTransform.value.copy(b.matrix),(c!==b||d!==b.version||f!==t.toneMapping)&&(l.material.needsUpdate=!0,c=b,d=b.version,f=t.toneMapping),l.layers.enableAll(),m.unshift(l,l.geometry,l.material,0,0,null))}function p(m,v){n.buffers.color.setClear(m.r,m.g,m.b,v,s)}return{getClearColor:function(){return a},setClearColor:function(m,v=1){a.set(m),o=v,p(a,o)},getClearAlpha:function(){return o},setClearAlpha:function(m){o=m,p(a,o)},render:h}}function u4e(t,e,n,r){const i=t.getParameter(34921),s=r.isWebGL2?null:e.get("OES_vertex_array_object"),a=r.isWebGL2||s!==null,o={},l=v(null);let u=l,c=!1;function d(N,q,L,A,J){let F=!1;if(a){const ne=m(A,L,q);u!==ne&&(u=ne,h(u.object)),F=g(N,A,L,J),F&&b(N,A,L,J)}else{const ne=q.wireframe===!0;(u.geometry!==A.id||u.program!==L.id||u.wireframe!==ne)&&(u.geometry=A.id,u.program=L.id,u.wireframe=ne,F=!0)}J!==null&&n.update(J,34963),(F||c)&&(c=!1,S(N,q,L,A),J!==null&&t.bindBuffer(34963,n.get(J).buffer))}function f(){return r.isWebGL2?t.createVertexArray():s.createVertexArrayOES()}function h(N){return r.isWebGL2?t.bindVertexArray(N):s.bindVertexArrayOES(N)}function p(N){return r.isWebGL2?t.deleteVertexArray(N):s.deleteVertexArrayOES(N)}function m(N,q,L){const A=L.wireframe===!0;let J=o[N.id];J===void 0&&(J={},o[N.id]=J);let F=J[q.id];F===void 0&&(F={},J[q.id]=F);let ne=F[A];return ne===void 0&&(ne=v(f()),F[A]=ne),ne}function v(N){const q=[],L=[],A=[];for(let J=0;J=0){const le=J[Z];let fe=F[Z];if(fe===void 0&&(Z==="instanceMatrix"&&N.instanceMatrix&&(fe=N.instanceMatrix),Z==="instanceColor"&&N.instanceColor&&(fe=N.instanceColor)),le===void 0||le.attribute!==fe||fe&&le.data!==fe.data)return!0;ne++}return u.attributesNum!==ne||u.index!==A}function b(N,q,L,A){const J={},F=q.attributes;let ne=0;const j=L.getAttributes();for(const Z in j)if(j[Z].location>=0){let le=F[Z];le===void 0&&(Z==="instanceMatrix"&&N.instanceMatrix&&(le=N.instanceMatrix),Z==="instanceColor"&&N.instanceColor&&(le=N.instanceColor));const fe={};fe.attribute=le,le&&le.data&&(fe.data=le.data),J[Z]=fe,ne++}u.attributes=J,u.attributesNum=ne,u.index=A}function y(){const N=u.newAttributes;for(let q=0,L=N.length;q=0){let _=J[j];if(_===void 0&&(j==="instanceMatrix"&&N.instanceMatrix&&(_=N.instanceMatrix),j==="instanceColor"&&N.instanceColor&&(_=N.instanceColor)),_!==void 0){const le=_.normalized,fe=_.itemSize,te=n.get(_);if(te===void 0)continue;const $=te.buffer,oe=te.type,ge=te.bytesPerElement;if(_.isInterleavedBufferAttribute){const ve=_.data,Ke=ve.stride,ue=_.offset;if(ve.isInstancedInterleavedBuffer){for(let D=0;D0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";E="mediump"}return E==="mediump"&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const a=typeof WebGL2RenderingContext<"u"&&t instanceof WebGL2RenderingContext||typeof WebGL2ComputeRenderingContext<"u"&&t instanceof WebGL2ComputeRenderingContext;let o=n.precision!==void 0?n.precision:"highp";const l=s(o);l!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",l,"instead."),o=l);const u=a||e.has("WEBGL_draw_buffers"),c=n.logarithmicDepthBuffer===!0,d=t.getParameter(34930),f=t.getParameter(35660),h=t.getParameter(3379),p=t.getParameter(34076),m=t.getParameter(34921),v=t.getParameter(36347),g=t.getParameter(36348),b=t.getParameter(36349),y=f>0,x=a||e.has("OES_texture_float"),T=y&&x,M=a?t.getParameter(36183):0;return{isWebGL2:a,drawBuffers:u,getMaxAnisotropy:i,getMaxPrecision:s,precision:o,logarithmicDepthBuffer:c,maxTextures:d,maxVertexTextures:f,maxTextureSize:h,maxCubemapSize:p,maxAttributes:m,maxVertexUniforms:v,maxVaryings:g,maxFragmentUniforms:b,vertexTextures:y,floatFragmentTextures:x,floatVertexTextures:T,maxSamples:M}}function f4e(t){const e=this;let n=null,r=0,i=!1,s=!1;const a=new ri,o=new as,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(d,f,h){const p=d.length!==0||f||r!==0||i;return i=f,n=c(d,h,0),r=d.length,p},this.beginShadows=function(){s=!0,c(null)},this.endShadows=function(){s=!1,u()},this.setState=function(d,f,h){const p=d.clippingPlanes,m=d.clipIntersection,v=d.clipShadows,g=t.get(d);if(!i||p===null||p.length===0||s&&!v)s?c(null):u();else{const b=s?0:r,y=b*4;let x=g.clippingState||null;l.value=x,x=c(p,f,y,h);for(let T=0;T!==y;++T)x[T]=n[T];g.clippingState=x,this.numIntersection=m?this.numPlanes:0,this.numPlanes+=b}};function u(){l.value!==n&&(l.value=n,l.needsUpdate=r>0),e.numPlanes=r,e.numIntersection=0}function c(d,f,h,p){const m=d!==null?d.length:0;let v=null;if(m!==0){if(v=l.value,p!==!0||v===null){const g=h+m*4,b=f.matrixWorldInverse;o.getNormalMatrix(b),(v===null||v.length0){const u=new WV(l.height/2);return u.fromEquirectangularTexture(t,a),e.set(a,u),a.addEventListener("dispose",i),n(u.texture,a.mapping)}else return null}}return a}function i(a){const o=a.target;o.removeEventListener("dispose",i);const l=e.get(o);l!==void 0&&(e.delete(o),l.dispose())}function s(){e=new WeakMap}return{get:r,dispose:s}}class Kf extends TT{constructor(e=-1,n=1,r=1,i=-1,s=.1,a=2e3){super(),this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=e,this.right=n,this.top=r,this.bottom=i,this.near=s,this.far=a,this.updateProjectionMatrix()}copy(e,n){return super.copy(e,n),this.left=e.left,this.right=e.right,this.top=e.top,this.bottom=e.bottom,this.near=e.near,this.far=e.far,this.zoom=e.zoom,this.view=e.view===null?null:Object.assign({},e.view),this}setViewOffset(e,n,r,i,s,a){this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=n,this.view.offsetX=r,this.view.offsetY=i,this.view.width=s,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=(this.right-this.left)/(2*this.zoom),n=(this.top-this.bottom)/(2*this.zoom),r=(this.right+this.left)/2,i=(this.top+this.bottom)/2;let s=r-e,a=r+e,o=i+n,l=i-n;if(this.view!==null&&this.view.enabled){const u=(this.right-this.left)/this.view.fullWidth/this.zoom,c=(this.top-this.bottom)/this.view.fullHeight/this.zoom;s+=u*this.view.offsetX,a=s+u*this.view.width,o-=c*this.view.offsetY,l=o-c*this.view.height}this.projectionMatrix.makeOrthographic(s,a,o,l,this.near,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const n=super.toJSON(e);return n.object.zoom=this.zoom,n.object.left=this.left,n.object.right=this.right,n.object.top=this.top,n.object.bottom=this.bottom,n.object.near=this.near,n.object.far=this.far,this.view!==null&&(n.object.view=Object.assign({},this.view)),n}}Kf.prototype.isOrthographicCamera=!0;const d1=4,TZ=[.125,.215,.35,.446,.526,.582],av=20,Wk=new Kf,wZ=new tt;let Ak=null;const $m=(1+Math.sqrt(5))/2,pg=1/$m,EZ=[new U(1,1,1),new U(-1,1,1),new U(1,1,-1),new U(-1,1,-1),new U(0,$m,pg),new U(0,$m,-pg),new U(pg,0,$m),new U(-pg,0,$m),new U($m,pg,0),new U(-$m,pg,0)];class oP{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,n=0,r=.1,i=100){Ak=this._renderer.getRenderTarget(),this._setSize(256);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,r,i,s),n>0&&this._blur(s,0,0,n),this._applyPMREM(s),this._cleanup(s),s}fromEquirectangular(e,n=null){return this._fromTexture(e,n)}fromCubemap(e,n=null){return this._fromTexture(e,n)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=RZ(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=PZ(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose()}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let e=0;e2?y:0,y,y),c.setRenderTarget(i),m&&c.render(p,o),c.render(e,o)}p.geometry.dispose(),p.material.dispose(),c.toneMapping=f,c.autoClear=d,e.background=v}_textureToCubeUV(e,n){const r=this._renderer,i=e.mapping===Ip||e.mapping===Up;i?(this._cubemapMaterial===null&&(this._cubemapMaterial=RZ()),this._cubemapMaterial.uniforms.flipEnvMap.value=e.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=PZ());const s=i?this._cubemapMaterial:this._equirectMaterial,a=new ut(this._lodPlanes[0],s),o=s.uniforms;o.envMap.value=e;const l=this._cubeSize;L2(n,0,0,3*l,2*l),r.setRenderTarget(n),r.render(a,Wk)}_applyPMREM(e){const n=this._renderer,r=n.autoClear;n.autoClear=!1;for(let i=1;iav&&console.warn(`sigmaRadians, ${s}, is too large and will clip, as it requested ${v} samples when the maximum is set to ${av}`);const g=[];let b=0;for(let E=0;Ey-d1?i-y+d1:0),M=4*(this._cubeSize-x);L2(n,T,M,3*x,2*x),l.setRenderTarget(n),l.render(d,Wk)}}function p4e(t){const e=[],n=[],r=[];let i=t;const s=t-d1+1+TZ.length;for(let a=0;at-d1?l=TZ[a-t+d1-1]:a===0&&(l=0),r.push(l);const u=1/(o-2),c=-u,d=1+u,f=[c,c,d,c,d,d,c,c,d,d,c,d],h=6,p=6,m=3,v=2,g=1,b=new Float32Array(m*p*h),y=new Float32Array(v*p*h),x=new Float32Array(g*p*h);for(let M=0;M2?0:-1,P=[E,S,0,E+2/3,S,0,E+2/3,S+1,0,E,S,0,E+2/3,S+1,0,E,S+1,0];b.set(P,m*p*M),y.set(f,v*p*M);const R=[M,M,M,M,M,M];x.set(R,g*p*M)}const T=new Lt;T.setAttribute("position",new un(b,m)),T.setAttribute("uv",new un(y,v)),T.setAttribute("faceIndex",new un(x,g)),e.push(T),i>d1&&i--}return{lodPlanes:e,sizeLods:n,sigmas:r}}function MZ(t,e,n){const r=new oi(t,e,n);return r.texture.mapping=dy,r.texture.name="PMREM.cubeUv",r.scissorTest=!0,r}function L2(t,e,n,r,i){t.viewport.set(e,n,r,i),t.scissor.set(e,n,r,i)}function m4e(t,e,n){const r=new Float32Array(av),i=new U(0,1,0);return new bi({name:"SphericalGaussianBlur",defines:{n:av,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${t}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:r},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:i}},vertexShader:wK(),fragmentShader:` precision mediump float; precision mediump int; @@ -2975,7 +2975,7 @@ void main() { } } - `,blending:os,depthTest:!1,depthWrite:!1})}function VZ(){return new bi({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:TK(),fragmentShader:` + `,blending:os,depthTest:!1,depthWrite:!1})}function PZ(){return new bi({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:wK(),fragmentShader:` precision mediump float; precision mediump int; @@ -2994,7 +2994,7 @@ void main() { gl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 ); } - `,blending:os,depthTest:!1,depthWrite:!1})}function zZ(){return new bi({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:TK(),fragmentShader:` + `,blending:os,depthTest:!1,depthWrite:!1})}function RZ(){return new bi({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:wK(),fragmentShader:` precision mediump float; precision mediump int; @@ -3010,7 +3010,7 @@ void main() { gl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) ); } - `,blending:os,depthTest:!1,depthWrite:!1})}function TK(){return` + `,blending:os,depthTest:!1,depthWrite:!1})}function wK(){return` precision mediump float; precision mediump int; @@ -3065,39 +3065,39 @@ void main() { gl_Position = vec4( position, 1.0 ); } - `}function m4e(t){let e=new WeakMap,n=null;function r(o){if(o&&o.isTexture){const l=o.mapping,u=l===s6||l===a6,c=l===Ip||l===Up;if(u||c)if(o.isRenderTargetTexture&&o.needsPMREMUpdate===!0){o.needsPMREMUpdate=!1;let d=e.get(o);return n===null&&(n=new lP(t)),d=u?n.fromEquirectangular(o,d):n.fromCubemap(o,d),e.set(o,d),d.texture}else{if(e.has(o))return e.get(o).texture;{const d=o.image;if(u&&d&&d.height>0||c&&d&&i(d)){n===null&&(n=new lP(t));const f=u?n.fromEquirectangular(o):n.fromCubemap(o);return e.set(o,f),o.addEventListener("dispose",s),f.texture}else return null}}}return o}function i(o){let l=0;const u=6;for(let c=0;ce.maxTextureSize&&(z=Math.ceil(V/e.maxTextureSize),V=e.maxTextureSize);const k=new Float32Array(V*z*4*v),N=new hy(k,V,z,v);N.type=na,N.needsUpdate=!0;const q=R*4;for(let A=0;A0)return t;const i=e*n;let s=kZ[i];if(s===void 0&&(s=new Float32Array(i),kZ[i]=s),e!==0){r.toArray(s,0);for(let a=1,o=0;a!==e;++a)o+=n,t[a].toArray(s,o)}return s}function oo(t,e){if(t.length!==e.length)return!1;for(let n=0,r=t.length;n0||c&&d&&i(d)){n===null&&(n=new oP(t));const f=u?n.fromEquirectangular(o):n.fromCubemap(o);return e.set(o,f),o.addEventListener("dispose",s),f.texture}else return null}}}return o}function i(o){let l=0;const u=6;for(let c=0;ce.maxTextureSize&&(z=Math.ceil(V/e.maxTextureSize),V=e.maxTextureSize);const k=new Float32Array(V*z*4*v),N=new fy(k,V,z,v);N.type=na,N.needsUpdate=!0;const q=R*4;for(let A=0;A0)return t;const i=e*n;let s=VZ[i];if(s===void 0&&(s=new Float32Array(i),VZ[i]=s),e!==0){r.toArray(s,0);for(let a=1,o=0;a!==e;++a)o+=n,t[a].toArray(s,o)}return s}function oo(t,e){if(t.length!==e.length)return!1;for(let n=0,r=t.length;n/gm;function JL(t){return t.replace(xXe,TXe)}function TXe(t,e){const n=yn[e];if(n===void 0)throw new Error("Can not resolve #include <"+e+">");return JL(n)}const wXe=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,EXe=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function DZ(t){return t.replace(EXe,Lce).replace(wXe,MXe)}function MXe(t,e,n,r){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),Lce(t,e,n,r)}function Lce(t,e,n,r){let i="";for(let s=parseInt(e);s/gm;function JL(t){return t.replace(TXe,wXe)}function wXe(t,e){const n=yn[e];if(n===void 0)throw new Error("Can not resolve #include <"+e+">");return JL(n)}const EXe=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,MXe=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function KZ(t){return t.replace(MXe,Nce).replace(EXe,PXe)}function PXe(t,e,n,r){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),Nce(t,e,n,r)}function Nce(t,e,n,r){let i="";for(let s=parseInt(e);s0&&(v+=` -`),g=[h,p].filter(g3).join(` +`),g=[h,p].filter(v3).join(` `),g.length>0&&(g+=` -`)):(v=[WZ(n),"#define SHADER_NAME "+n.shaderName,p,n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.supportsVertexTextures?"#define VERTEX_TEXTURES":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+c:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.displacementMap&&n.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",n.specularColorMap?"#define USE_SPECULARCOLORMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEENCOLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&n.flatShading===!1?"#define USE_MORPHNORMALS":"",n.morphColors&&n.isWebGL2?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0&&n.isWebGL2?"#define MORPHTARGETS_TEXTURE":"",n.morphTargetsCount>0&&n.isWebGL2?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0&&n.isWebGL2?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR"," attribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT"," attribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )"," attribute vec4 color;","#elif defined( USE_COLOR )"," attribute vec3 color;","#endif","#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )"," attribute vec3 morphTarget0;"," attribute vec3 morphTarget1;"," attribute vec3 morphTarget2;"," attribute vec3 morphTarget3;"," #ifdef USE_MORPHNORMALS"," attribute vec3 morphNormal0;"," attribute vec3 morphNormal1;"," attribute vec3 morphNormal2;"," attribute vec3 morphNormal3;"," #else"," attribute vec3 morphTarget4;"," attribute vec3 morphTarget5;"," attribute vec3 morphTarget6;"," attribute vec3 morphTarget7;"," #endif","#endif","#ifdef USE_SKINNING"," attribute vec4 skinIndex;"," attribute vec4 skinWeight;","#endif",` -`].filter(g3).join(` -`),g=[h,WZ(n),"#define SHADER_NAME "+n.shaderName,p,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+u:"",n.envMap?"#define "+c:"",n.envMap?"#define "+d:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",n.specularColorMap?"#define USE_SPECULARCOLORMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEENCOLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==Wc?"#define TONE_MAPPING":"",n.toneMapping!==Wc?yn.tonemapping_pars_fragment:"",n.toneMapping!==Wc?gXe("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",yn.encodings_pars_fragment,vXe("linearToOutputTexel",n.outputEncoding),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"",` -`].filter(g3).join(` -`)),a=JL(a),a=KZ(a,n),a=qZ(a,n),o=JL(o),o=KZ(o,n),o=qZ(o,n),a=DZ(a),o=DZ(o),n.isWebGL2&&n.isRawShaderMaterial!==!0&&(b=`#version 300 es +`)):(v=[qZ(n),"#define SHADER_NAME "+n.shaderName,p,n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.supportsVertexTextures?"#define VERTEX_TEXTURES":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+c:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.displacementMap&&n.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",n.specularColorMap?"#define USE_SPECULARCOLORMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEENCOLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&n.flatShading===!1?"#define USE_MORPHNORMALS":"",n.morphColors&&n.isWebGL2?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0&&n.isWebGL2?"#define MORPHTARGETS_TEXTURE":"",n.morphTargetsCount>0&&n.isWebGL2?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0&&n.isWebGL2?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR"," attribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT"," attribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )"," attribute vec4 color;","#elif defined( USE_COLOR )"," attribute vec3 color;","#endif","#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )"," attribute vec3 morphTarget0;"," attribute vec3 morphTarget1;"," attribute vec3 morphTarget2;"," attribute vec3 morphTarget3;"," #ifdef USE_MORPHNORMALS"," attribute vec3 morphNormal0;"," attribute vec3 morphNormal1;"," attribute vec3 morphNormal2;"," attribute vec3 morphNormal3;"," #else"," attribute vec3 morphTarget4;"," attribute vec3 morphTarget5;"," attribute vec3 morphTarget6;"," attribute vec3 morphTarget7;"," #endif","#endif","#ifdef USE_SKINNING"," attribute vec4 skinIndex;"," attribute vec4 skinWeight;","#endif",` +`].filter(v3).join(` +`),g=[h,qZ(n),"#define SHADER_NAME "+n.shaderName,p,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+u:"",n.envMap?"#define "+c:"",n.envMap?"#define "+d:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",n.specularColorMap?"#define USE_SPECULARCOLORMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEENCOLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==Wc?"#define TONE_MAPPING":"",n.toneMapping!==Wc?yn.tonemapping_pars_fragment:"",n.toneMapping!==Wc?bXe("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",yn.encodings_pars_fragment,gXe("linearToOutputTexel",n.outputEncoding),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"",` +`].filter(v3).join(` +`)),a=JL(a),a=XZ(a,n),a=CZ(a,n),o=JL(o),o=XZ(o,n),o=CZ(o,n),a=KZ(a),o=KZ(o),n.isWebGL2&&n.isRawShaderMaterial!==!0&&(b=`#version 300 es `,v=["precision mediump sampler2DArray;","#define attribute in","#define varying out","#define texture2D texture"].join(` `)+` `+v,g=["#define varying in",n.glslVersion===jL?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===jL?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join(` `)+` -`+g);const y=b+v+a,x=b+g+o,T=XZ(i,35633,y),M=XZ(i,35632,x);if(i.attachShader(m,T),i.attachShader(m,M),n.index0AttributeName!==void 0?i.bindAttribLocation(m,0,n.index0AttributeName):n.morphTargets===!0&&i.bindAttribLocation(m,0,"position"),i.linkProgram(m),t.debug.checkShaderErrors){const P=i.getProgramInfoLog(m).trim(),R=i.getShaderInfoLog(T).trim(),V=i.getShaderInfoLog(M).trim();let z=!0,k=!0;if(i.getProgramParameter(m,35714)===!1){z=!1;const N=CZ(i,T,"vertex"),q=CZ(i,M,"fragment");console.error("THREE.WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(m,35715)+` +`+g);const y=b+v+a,x=b+g+o,T=NZ(i,35633,y),M=NZ(i,35632,x);if(i.attachShader(m,T),i.attachShader(m,M),n.index0AttributeName!==void 0?i.bindAttribLocation(m,0,n.index0AttributeName):n.morphTargets===!0&&i.bindAttribLocation(m,0,"position"),i.linkProgram(m),t.debug.checkShaderErrors){const P=i.getProgramInfoLog(m).trim(),R=i.getShaderInfoLog(T).trim(),V=i.getShaderInfoLog(M).trim();let z=!0,k=!0;if(i.getProgramParameter(m,35714)===!1){z=!1;const N=LZ(i,T,"vertex"),q=LZ(i,M,"fragment");console.error("THREE.WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(m,35715)+` Program Info Log: `+P+` `+N+` -`+q)}else P!==""?console.warn("THREE.WebGLProgram: Program Info Log:",P):(R===""||V==="")&&(k=!1);k&&(this.diagnostics={runnable:z,programLog:P,vertexShader:{log:R,prefix:v},fragmentShader:{log:V,prefix:g}})}i.deleteShader(T),i.deleteShader(M);let E;this.getUniforms=function(){return E===void 0&&(E=new hp(i,m)),E};let S;return this.getAttributes=function(){return S===void 0&&(S=SXe(i,m)),S},this.destroy=function(){r.releaseStatesOfProgram(this),i.deleteProgram(m),this.program=void 0},this.name=n.shaderName,this.id=hXe++,this.cacheKey=e,this.usedTimes=1,this.program=m,this.vertexShader=T,this.fragmentShader=M,this}let IXe=0;class UXe{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(e){const n=e.vertexShader,r=e.fragmentShader,i=this._getShaderStage(n),s=this._getShaderStage(r),a=this._getShaderCacheForMaterial(e);return a.has(i)===!1&&(a.add(i),i.usedTimes++),a.has(s)===!1&&(a.add(s),s.usedTimes++),this}remove(e){const n=this.materialCache.get(e);for(const r of n)r.usedTimes--,r.usedTimes===0&&this.shaderCache.delete(r.code);return this.materialCache.delete(e),this}getVertexShaderID(e){return this._getShaderStage(e.vertexShader).id}getFragmentShaderID(e){return this._getShaderStage(e.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(e){const n=this.materialCache;return n.has(e)===!1&&n.set(e,new Set),n.get(e)}_getShaderStage(e){const n=this.shaderCache;if(n.has(e)===!1){const r=new NXe(e);n.set(e,r)}return n.get(e)}}class NXe{constructor(e){this.id=IXe++,this.code=e,this.usedTimes=0}}function LXe(t,e,n,r,i,s,a){const o=new qV,l=new UXe,u=[],c=i.isWebGL2,d=i.logarithmicDepthBuffer,f=i.vertexTextures;let h=i.precision;const p={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function m(S,P,R,V,z){const k=V.fog,N=z.geometry,q=S.isMeshStandardMaterial?V.environment:null,L=(S.isMeshStandardMaterial?n:e).get(S.envMap||q),A=L&&L.mapping===fy?L.image.height:null,Z=p[S.type];S.precision!==null&&(h=i.getMaxPrecision(S.precision),h!==S.precision&&console.warn("THREE.WebGLProgram.getParameters:",S.precision,"not supported, using",h,"instead."));const j=N.morphAttributes.position||N.morphAttributes.normal||N.morphAttributes.color,ne=j!==void 0?j.length:0;let G=0;N.morphAttributes.position!==void 0&&(G=1),N.morphAttributes.normal!==void 0&&(G=2),N.morphAttributes.color!==void 0&&(G=3);let B,ee,ce,fe;if(Z){const ve=wi[Z];B=ve.vertexShader,ee=ve.fragmentShader}else B=S.vertexShader,ee=S.fragmentShader,l.update(S),ce=l.getVertexShaderID(S),fe=l.getFragmentShaderID(S);const te=t.getRenderTarget(),_=S.alphaTest>0,oe=S.clearcoat>0;return{isWebGL2:c,shaderID:Z,shaderName:S.type,vertexShader:B,fragmentShader:ee,defines:S.defines,customVertexShaderID:ce,customFragmentShaderID:fe,isRawShaderMaterial:S.isRawShaderMaterial===!0,glslVersion:S.glslVersion,precision:h,instancing:z.isInstancedMesh===!0,instancingColor:z.isInstancedMesh===!0&&z.instanceColor!==null,supportsVertexTextures:f,outputEncoding:te===null?t.outputEncoding:te.isXRRenderTarget===!0?te.texture.encoding:yl,map:!!S.map,matcap:!!S.matcap,envMap:!!L,envMapMode:L&&L.mapping,envMapCubeUVHeight:A,lightMap:!!S.lightMap,aoMap:!!S.aoMap,emissiveMap:!!S.emissiveMap,bumpMap:!!S.bumpMap,normalMap:!!S.normalMap,objectSpaceNormalMap:S.normalMapType===pce,tangentSpaceNormalMap:S.normalMapType===y0,decodeVideoTexture:!!S.map&&S.map.isVideoTexture===!0&&S.map.encoding===Jr,clearcoat:oe,clearcoatMap:oe&&!!S.clearcoatMap,clearcoatRoughnessMap:oe&&!!S.clearcoatRoughnessMap,clearcoatNormalMap:oe&&!!S.clearcoatNormalMap,displacementMap:!!S.displacementMap,roughnessMap:!!S.roughnessMap,metalnessMap:!!S.metalnessMap,specularMap:!!S.specularMap,specularIntensityMap:!!S.specularIntensityMap,specularColorMap:!!S.specularColorMap,opaque:S.transparent===!1&&S.blending===Mv,alphaMap:!!S.alphaMap,alphaTest:_,gradientMap:!!S.gradientMap,sheen:S.sheen>0,sheenColorMap:!!S.sheenColorMap,sheenRoughnessMap:!!S.sheenRoughnessMap,transmission:S.transmission>0,transmissionMap:!!S.transmissionMap,thicknessMap:!!S.thicknessMap,combine:S.combine,vertexTangents:!!S.normalMap&&!!N.attributes.tangent,vertexColors:S.vertexColors,vertexAlphas:S.vertexColors===!0&&!!N.attributes.color&&N.attributes.color.itemSize===4,vertexUvs:!!S.map||!!S.bumpMap||!!S.normalMap||!!S.specularMap||!!S.alphaMap||!!S.emissiveMap||!!S.roughnessMap||!!S.metalnessMap||!!S.clearcoatMap||!!S.clearcoatRoughnessMap||!!S.clearcoatNormalMap||!!S.displacementMap||!!S.transmissionMap||!!S.thicknessMap||!!S.specularIntensityMap||!!S.specularColorMap||!!S.sheenColorMap||!!S.sheenRoughnessMap,uvsVertexOnly:!(S.map||S.bumpMap||S.normalMap||S.specularMap||S.alphaMap||S.emissiveMap||S.roughnessMap||S.metalnessMap||S.clearcoatNormalMap||S.transmission>0||S.transmissionMap||S.thicknessMap||S.specularIntensityMap||S.specularColorMap||S.sheen>0||S.sheenColorMap||S.sheenRoughnessMap)&&!!S.displacementMap,fog:!!k,useFog:S.fog===!0,fogExp2:k&&k.isFogExp2,flatShading:!!S.flatShading,sizeAttenuation:S.sizeAttenuation,logarithmicDepthBuffer:d,skinning:z.isSkinnedMesh===!0,morphTargets:N.morphAttributes.position!==void 0,morphNormals:N.morphAttributes.normal!==void 0,morphColors:N.morphAttributes.color!==void 0,morphTargetsCount:ne,morphTextureStride:G,numDirLights:P.directional.length,numPointLights:P.point.length,numSpotLights:P.spot.length,numRectAreaLights:P.rectArea.length,numHemiLights:P.hemi.length,numDirLightShadows:P.directionalShadowMap.length,numPointLightShadows:P.pointShadowMap.length,numSpotLightShadows:P.spotShadowMap.length,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:S.dithering,shadowMapEnabled:t.shadowMap.enabled&&R.length>0,shadowMapType:t.shadowMap.type,toneMapping:S.toneMapped?t.toneMapping:Wc,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:S.premultipliedAlpha,doubleSided:S.side===rn,flipSided:S.side===Ua,useDepthPacking:!!S.depthPacking,depthPacking:S.depthPacking||0,index0AttributeName:S.index0AttributeName,extensionDerivatives:S.extensions&&S.extensions.derivatives,extensionFragDepth:S.extensions&&S.extensions.fragDepth,extensionDrawBuffers:S.extensions&&S.extensions.drawBuffers,extensionShaderTextureLOD:S.extensions&&S.extensions.shaderTextureLOD,rendererExtensionFragDepth:c||r.has("EXT_frag_depth"),rendererExtensionDrawBuffers:c||r.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:c||r.has("EXT_shader_texture_lod"),customProgramCacheKey:S.customProgramCacheKey()}}function v(S){const P=[];if(S.shaderID?P.push(S.shaderID):(P.push(S.customVertexShaderID),P.push(S.customFragmentShaderID)),S.defines!==void 0)for(const R in S.defines)P.push(R),P.push(S.defines[R]);return S.isRawShaderMaterial===!1&&(g(P,S),b(P,S),P.push(t.outputEncoding)),P.push(S.customProgramCacheKey),P.join()}function g(S,P){S.push(P.precision),S.push(P.outputEncoding),S.push(P.envMapMode),S.push(P.envMapCubeUVHeight),S.push(P.combine),S.push(P.vertexUvs),S.push(P.fogExp2),S.push(P.sizeAttenuation),S.push(P.morphTargetsCount),S.push(P.morphAttributeCount),S.push(P.numDirLights),S.push(P.numPointLights),S.push(P.numSpotLights),S.push(P.numHemiLights),S.push(P.numRectAreaLights),S.push(P.numDirLightShadows),S.push(P.numPointLightShadows),S.push(P.numSpotLightShadows),S.push(P.shadowMapType),S.push(P.toneMapping),S.push(P.numClippingPlanes),S.push(P.numClipIntersection),S.push(P.depthPacking)}function b(S,P){o.disableAll(),P.isWebGL2&&o.enable(0),P.supportsVertexTextures&&o.enable(1),P.instancing&&o.enable(2),P.instancingColor&&o.enable(3),P.map&&o.enable(4),P.matcap&&o.enable(5),P.envMap&&o.enable(6),P.lightMap&&o.enable(7),P.aoMap&&o.enable(8),P.emissiveMap&&o.enable(9),P.bumpMap&&o.enable(10),P.normalMap&&o.enable(11),P.objectSpaceNormalMap&&o.enable(12),P.tangentSpaceNormalMap&&o.enable(13),P.clearcoat&&o.enable(14),P.clearcoatMap&&o.enable(15),P.clearcoatRoughnessMap&&o.enable(16),P.clearcoatNormalMap&&o.enable(17),P.displacementMap&&o.enable(18),P.specularMap&&o.enable(19),P.roughnessMap&&o.enable(20),P.metalnessMap&&o.enable(21),P.gradientMap&&o.enable(22),P.alphaMap&&o.enable(23),P.alphaTest&&o.enable(24),P.vertexColors&&o.enable(25),P.vertexAlphas&&o.enable(26),P.vertexUvs&&o.enable(27),P.vertexTangents&&o.enable(28),P.uvsVertexOnly&&o.enable(29),P.fog&&o.enable(30),S.push(o.mask),o.disableAll(),P.useFog&&o.enable(0),P.flatShading&&o.enable(1),P.logarithmicDepthBuffer&&o.enable(2),P.skinning&&o.enable(3),P.morphTargets&&o.enable(4),P.morphNormals&&o.enable(5),P.morphColors&&o.enable(6),P.premultipliedAlpha&&o.enable(7),P.shadowMapEnabled&&o.enable(8),P.physicallyCorrectLights&&o.enable(9),P.doubleSided&&o.enable(10),P.flipSided&&o.enable(11),P.useDepthPacking&&o.enable(12),P.dithering&&o.enable(13),P.specularIntensityMap&&o.enable(14),P.specularColorMap&&o.enable(15),P.transmission&&o.enable(16),P.transmissionMap&&o.enable(17),P.thicknessMap&&o.enable(18),P.sheen&&o.enable(19),P.sheenColorMap&&o.enable(20),P.sheenRoughnessMap&&o.enable(21),P.decodeVideoTexture&&o.enable(22),P.opaque&&o.enable(23),S.push(o.mask)}function y(S){const P=p[S.type];let R;if(P){const V=wi[P];R=Na.clone(V.uniforms)}else R=S.uniforms;return R}function x(S,P){let R;for(let V=0,z=u.length;V0?r.push(g):h.transparent===!0?i.push(g):n.push(g)}function l(d,f,h,p,m,v){const g=a(d,f,h,p,m,v);h.transmission>0?r.unshift(g):h.transparent===!0?i.unshift(g):n.unshift(g)}function u(d,f){n.length>1&&n.sort(d||CXe),r.length>1&&r.sort(f||AZ),i.length>1&&i.sort(f||AZ)}function c(){for(let d=e,f=t.length;d=t.get(r).length?(s=new GZ,t.get(r).push(s)):s=t.get(r)[i],s}function n(){t=new WeakMap}return{get:e,dispose:n}}function qXe(){const t={};return{get:function(e){if(t[e.id]!==void 0)return t[e.id];let n;switch(e.type){case"DirectionalLight":n={direction:new U,color:new tt};break;case"SpotLight":n={position:new U,direction:new U,color:new tt,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":n={position:new U,color:new tt,distance:0,decay:0};break;case"HemisphereLight":n={direction:new U,skyColor:new tt,groundColor:new tt};break;case"RectAreaLight":n={color:new tt,position:new U,halfWidth:new U,halfHeight:new U};break}return t[e.id]=n,n}}}function DXe(){const t={};return{get:function(e){if(t[e.id]!==void 0)return t[e.id];let n;switch(e.type){case"DirectionalLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Oe};break;case"SpotLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Oe};break;case"PointLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Oe,shadowCameraNear:1,shadowCameraFar:1e3};break}return t[e.id]=n,n}}}let WXe=0;function AXe(t,e){return(e.castShadow?1:0)-(t.castShadow?1:0)}function GXe(t,e){const n=new qXe,r=DXe(),i={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]};for(let c=0;c<9;c++)i.probe.push(new U);const s=new U,a=new Be,o=new Be;function l(c,d){let f=0,h=0,p=0;for(let P=0;P<9;P++)i.probe[P].set(0,0,0);let m=0,v=0,g=0,b=0,y=0,x=0,T=0,M=0;c.sort(AXe);const E=d!==!0?Math.PI:1;for(let P=0,R=c.length;P0&&(e.isWebGL2||t.has("OES_texture_float_linear")===!0?(i.rectAreaLTC1=St.LTC_FLOAT_1,i.rectAreaLTC2=St.LTC_FLOAT_2):t.has("OES_texture_half_float_linear")===!0?(i.rectAreaLTC1=St.LTC_HALF_1,i.rectAreaLTC2=St.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),i.ambient[0]=f,i.ambient[1]=h,i.ambient[2]=p;const S=i.hash;(S.directionalLength!==m||S.pointLength!==v||S.spotLength!==g||S.rectAreaLength!==b||S.hemiLength!==y||S.numDirectionalShadows!==x||S.numPointShadows!==T||S.numSpotShadows!==M)&&(i.directional.length=m,i.spot.length=g,i.rectArea.length=b,i.point.length=v,i.hemi.length=y,i.directionalShadow.length=x,i.directionalShadowMap.length=x,i.pointShadow.length=T,i.pointShadowMap.length=T,i.spotShadow.length=M,i.spotShadowMap.length=M,i.directionalShadowMatrix.length=x,i.pointShadowMatrix.length=T,i.spotShadowMatrix.length=M,S.directionalLength=m,S.pointLength=v,S.spotLength=g,S.rectAreaLength=b,S.hemiLength=y,S.numDirectionalShadows=x,S.numPointShadows=T,S.numSpotShadows=M,i.version=WXe++)}function u(c,d){let f=0,h=0,p=0,m=0,v=0;const g=d.matrixWorldInverse;for(let b=0,y=c.length;b=n.get(s).length?(o=new FZ(t,e),n.get(s).push(o)):o=n.get(s)[a],o}function i(){n=new WeakMap}return{get:r,dispose:i}}class vy extends Ji{constructor(e){super(),this.type="MeshDepthMaterial",this.depthPacking=SK,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}}vy.prototype.isMeshDepthMaterial=!0;class ET extends Ji{constructor(e){super(),this.type="MeshDistanceMaterial",this.referencePosition=new U,this.nearDistance=1,this.farDistance=1e3,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(e)}copy(e){return super.copy(e),this.referencePosition.copy(e.referencePosition),this.nearDistance=e.nearDistance,this.farDistance=e.farDistance,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}}ET.prototype.isMeshDistanceMaterial=!0;const jXe=`void main() { +`+q)}else P!==""?console.warn("THREE.WebGLProgram: Program Info Log:",P):(R===""||V==="")&&(k=!1);k&&(this.diagnostics={runnable:z,programLog:P,vertexShader:{log:R,prefix:v},fragmentShader:{log:V,prefix:g}})}i.deleteShader(T),i.deleteShader(M);let E;this.getUniforms=function(){return E===void 0&&(E=new hp(i,m)),E};let S;return this.getAttributes=function(){return S===void 0&&(S=xXe(i,m)),S},this.destroy=function(){r.releaseStatesOfProgram(this),i.deleteProgram(m),this.program=void 0},this.name=n.shaderName,this.id=pXe++,this.cacheKey=e,this.usedTimes=1,this.program=m,this.vertexShader=T,this.fragmentShader=M,this}let UXe=0;class NXe{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(e){const n=e.vertexShader,r=e.fragmentShader,i=this._getShaderStage(n),s=this._getShaderStage(r),a=this._getShaderCacheForMaterial(e);return a.has(i)===!1&&(a.add(i),i.usedTimes++),a.has(s)===!1&&(a.add(s),s.usedTimes++),this}remove(e){const n=this.materialCache.get(e);for(const r of n)r.usedTimes--,r.usedTimes===0&&this.shaderCache.delete(r.code);return this.materialCache.delete(e),this}getVertexShaderID(e){return this._getShaderStage(e.vertexShader).id}getFragmentShaderID(e){return this._getShaderStage(e.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(e){const n=this.materialCache;return n.has(e)===!1&&n.set(e,new Set),n.get(e)}_getShaderStage(e){const n=this.shaderCache;if(n.has(e)===!1){const r=new LXe(e);n.set(e,r)}return n.get(e)}}class LXe{constructor(e){this.id=UXe++,this.code=e,this.usedTimes=0}}function XXe(t,e,n,r,i,s,a){const o=new qV,l=new NXe,u=[],c=i.isWebGL2,d=i.logarithmicDepthBuffer,f=i.vertexTextures;let h=i.precision;const p={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function m(S,P,R,V,z){const k=V.fog,N=z.geometry,q=S.isMeshStandardMaterial?V.environment:null,L=(S.isMeshStandardMaterial?n:e).get(S.envMap||q),A=L&&L.mapping===dy?L.image.height:null,J=p[S.type];S.precision!==null&&(h=i.getMaxPrecision(S.precision),h!==S.precision&&console.warn("THREE.WebGLProgram.getParameters:",S.precision,"not supported, using",h,"instead."));const F=N.morphAttributes.position||N.morphAttributes.normal||N.morphAttributes.color,ne=F!==void 0?F.length:0;let j=0;N.morphAttributes.position!==void 0&&(j=1),N.morphAttributes.normal!==void 0&&(j=2),N.morphAttributes.color!==void 0&&(j=3);let Z,_,le,fe;if(J){const ve=wi[J];Z=ve.vertexShader,_=ve.fragmentShader}else Z=S.vertexShader,_=S.fragmentShader,l.update(S),le=l.getVertexShaderID(S),fe=l.getFragmentShaderID(S);const te=t.getRenderTarget(),$=S.alphaTest>0,oe=S.clearcoat>0;return{isWebGL2:c,shaderID:J,shaderName:S.type,vertexShader:Z,fragmentShader:_,defines:S.defines,customVertexShaderID:le,customFragmentShaderID:fe,isRawShaderMaterial:S.isRawShaderMaterial===!0,glslVersion:S.glslVersion,precision:h,instancing:z.isInstancedMesh===!0,instancingColor:z.isInstancedMesh===!0&&z.instanceColor!==null,supportsVertexTextures:f,outputEncoding:te===null?t.outputEncoding:te.isXRRenderTarget===!0?te.texture.encoding:bl,map:!!S.map,matcap:!!S.matcap,envMap:!!L,envMapMode:L&&L.mapping,envMapCubeUVHeight:A,lightMap:!!S.lightMap,aoMap:!!S.aoMap,emissiveMap:!!S.emissiveMap,bumpMap:!!S.bumpMap,normalMap:!!S.normalMap,objectSpaceNormalMap:S.normalMapType===hce,tangentSpaceNormalMap:S.normalMapType===y0,decodeVideoTexture:!!S.map&&S.map.isVideoTexture===!0&&S.map.encoding===Jr,clearcoat:oe,clearcoatMap:oe&&!!S.clearcoatMap,clearcoatRoughnessMap:oe&&!!S.clearcoatRoughnessMap,clearcoatNormalMap:oe&&!!S.clearcoatNormalMap,displacementMap:!!S.displacementMap,roughnessMap:!!S.roughnessMap,metalnessMap:!!S.metalnessMap,specularMap:!!S.specularMap,specularIntensityMap:!!S.specularIntensityMap,specularColorMap:!!S.specularColorMap,opaque:S.transparent===!1&&S.blending===Mv,alphaMap:!!S.alphaMap,alphaTest:$,gradientMap:!!S.gradientMap,sheen:S.sheen>0,sheenColorMap:!!S.sheenColorMap,sheenRoughnessMap:!!S.sheenRoughnessMap,transmission:S.transmission>0,transmissionMap:!!S.transmissionMap,thicknessMap:!!S.thicknessMap,combine:S.combine,vertexTangents:!!S.normalMap&&!!N.attributes.tangent,vertexColors:S.vertexColors,vertexAlphas:S.vertexColors===!0&&!!N.attributes.color&&N.attributes.color.itemSize===4,vertexUvs:!!S.map||!!S.bumpMap||!!S.normalMap||!!S.specularMap||!!S.alphaMap||!!S.emissiveMap||!!S.roughnessMap||!!S.metalnessMap||!!S.clearcoatMap||!!S.clearcoatRoughnessMap||!!S.clearcoatNormalMap||!!S.displacementMap||!!S.transmissionMap||!!S.thicknessMap||!!S.specularIntensityMap||!!S.specularColorMap||!!S.sheenColorMap||!!S.sheenRoughnessMap,uvsVertexOnly:!(S.map||S.bumpMap||S.normalMap||S.specularMap||S.alphaMap||S.emissiveMap||S.roughnessMap||S.metalnessMap||S.clearcoatNormalMap||S.transmission>0||S.transmissionMap||S.thicknessMap||S.specularIntensityMap||S.specularColorMap||S.sheen>0||S.sheenColorMap||S.sheenRoughnessMap)&&!!S.displacementMap,fog:!!k,useFog:S.fog===!0,fogExp2:k&&k.isFogExp2,flatShading:!!S.flatShading,sizeAttenuation:S.sizeAttenuation,logarithmicDepthBuffer:d,skinning:z.isSkinnedMesh===!0,morphTargets:N.morphAttributes.position!==void 0,morphNormals:N.morphAttributes.normal!==void 0,morphColors:N.morphAttributes.color!==void 0,morphTargetsCount:ne,morphTextureStride:j,numDirLights:P.directional.length,numPointLights:P.point.length,numSpotLights:P.spot.length,numRectAreaLights:P.rectArea.length,numHemiLights:P.hemi.length,numDirLightShadows:P.directionalShadowMap.length,numPointLightShadows:P.pointShadowMap.length,numSpotLightShadows:P.spotShadowMap.length,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:S.dithering,shadowMapEnabled:t.shadowMap.enabled&&R.length>0,shadowMapType:t.shadowMap.type,toneMapping:S.toneMapped?t.toneMapping:Wc,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:S.premultipliedAlpha,doubleSided:S.side===rn,flipSided:S.side===Ua,useDepthPacking:!!S.depthPacking,depthPacking:S.depthPacking||0,index0AttributeName:S.index0AttributeName,extensionDerivatives:S.extensions&&S.extensions.derivatives,extensionFragDepth:S.extensions&&S.extensions.fragDepth,extensionDrawBuffers:S.extensions&&S.extensions.drawBuffers,extensionShaderTextureLOD:S.extensions&&S.extensions.shaderTextureLOD,rendererExtensionFragDepth:c||r.has("EXT_frag_depth"),rendererExtensionDrawBuffers:c||r.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:c||r.has("EXT_shader_texture_lod"),customProgramCacheKey:S.customProgramCacheKey()}}function v(S){const P=[];if(S.shaderID?P.push(S.shaderID):(P.push(S.customVertexShaderID),P.push(S.customFragmentShaderID)),S.defines!==void 0)for(const R in S.defines)P.push(R),P.push(S.defines[R]);return S.isRawShaderMaterial===!1&&(g(P,S),b(P,S),P.push(t.outputEncoding)),P.push(S.customProgramCacheKey),P.join()}function g(S,P){S.push(P.precision),S.push(P.outputEncoding),S.push(P.envMapMode),S.push(P.envMapCubeUVHeight),S.push(P.combine),S.push(P.vertexUvs),S.push(P.fogExp2),S.push(P.sizeAttenuation),S.push(P.morphTargetsCount),S.push(P.morphAttributeCount),S.push(P.numDirLights),S.push(P.numPointLights),S.push(P.numSpotLights),S.push(P.numHemiLights),S.push(P.numRectAreaLights),S.push(P.numDirLightShadows),S.push(P.numPointLightShadows),S.push(P.numSpotLightShadows),S.push(P.shadowMapType),S.push(P.toneMapping),S.push(P.numClippingPlanes),S.push(P.numClipIntersection),S.push(P.depthPacking)}function b(S,P){o.disableAll(),P.isWebGL2&&o.enable(0),P.supportsVertexTextures&&o.enable(1),P.instancing&&o.enable(2),P.instancingColor&&o.enable(3),P.map&&o.enable(4),P.matcap&&o.enable(5),P.envMap&&o.enable(6),P.lightMap&&o.enable(7),P.aoMap&&o.enable(8),P.emissiveMap&&o.enable(9),P.bumpMap&&o.enable(10),P.normalMap&&o.enable(11),P.objectSpaceNormalMap&&o.enable(12),P.tangentSpaceNormalMap&&o.enable(13),P.clearcoat&&o.enable(14),P.clearcoatMap&&o.enable(15),P.clearcoatRoughnessMap&&o.enable(16),P.clearcoatNormalMap&&o.enable(17),P.displacementMap&&o.enable(18),P.specularMap&&o.enable(19),P.roughnessMap&&o.enable(20),P.metalnessMap&&o.enable(21),P.gradientMap&&o.enable(22),P.alphaMap&&o.enable(23),P.alphaTest&&o.enable(24),P.vertexColors&&o.enable(25),P.vertexAlphas&&o.enable(26),P.vertexUvs&&o.enable(27),P.vertexTangents&&o.enable(28),P.uvsVertexOnly&&o.enable(29),P.fog&&o.enable(30),S.push(o.mask),o.disableAll(),P.useFog&&o.enable(0),P.flatShading&&o.enable(1),P.logarithmicDepthBuffer&&o.enable(2),P.skinning&&o.enable(3),P.morphTargets&&o.enable(4),P.morphNormals&&o.enable(5),P.morphColors&&o.enable(6),P.premultipliedAlpha&&o.enable(7),P.shadowMapEnabled&&o.enable(8),P.physicallyCorrectLights&&o.enable(9),P.doubleSided&&o.enable(10),P.flipSided&&o.enable(11),P.useDepthPacking&&o.enable(12),P.dithering&&o.enable(13),P.specularIntensityMap&&o.enable(14),P.specularColorMap&&o.enable(15),P.transmission&&o.enable(16),P.transmissionMap&&o.enable(17),P.thicknessMap&&o.enable(18),P.sheen&&o.enable(19),P.sheenColorMap&&o.enable(20),P.sheenRoughnessMap&&o.enable(21),P.decodeVideoTexture&&o.enable(22),P.opaque&&o.enable(23),S.push(o.mask)}function y(S){const P=p[S.type];let R;if(P){const V=wi[P];R=Na.clone(V.uniforms)}else R=S.uniforms;return R}function x(S,P){let R;for(let V=0,z=u.length;V0?r.push(g):h.transparent===!0?i.push(g):n.push(g)}function l(d,f,h,p,m,v){const g=a(d,f,h,p,m,v);h.transmission>0?r.unshift(g):h.transparent===!0?i.unshift(g):n.unshift(g)}function u(d,f){n.length>1&&n.sort(d||KXe),r.length>1&&r.sort(f||DZ),i.length>1&&i.sort(f||DZ)}function c(){for(let d=e,f=t.length;d=t.get(r).length?(s=new WZ,t.get(r).push(s)):s=t.get(r)[i],s}function n(){t=new WeakMap}return{get:e,dispose:n}}function DXe(){const t={};return{get:function(e){if(t[e.id]!==void 0)return t[e.id];let n;switch(e.type){case"DirectionalLight":n={direction:new U,color:new tt};break;case"SpotLight":n={position:new U,direction:new U,color:new tt,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":n={position:new U,color:new tt,distance:0,decay:0};break;case"HemisphereLight":n={direction:new U,skyColor:new tt,groundColor:new tt};break;case"RectAreaLight":n={color:new tt,position:new U,halfWidth:new U,halfHeight:new U};break}return t[e.id]=n,n}}}function WXe(){const t={};return{get:function(e){if(t[e.id]!==void 0)return t[e.id];let n;switch(e.type){case"DirectionalLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Oe};break;case"SpotLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Oe};break;case"PointLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Oe,shadowCameraNear:1,shadowCameraFar:1e3};break}return t[e.id]=n,n}}}let AXe=0;function GXe(t,e){return(e.castShadow?1:0)-(t.castShadow?1:0)}function FXe(t,e){const n=new DXe,r=WXe(),i={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]};for(let c=0;c<9;c++)i.probe.push(new U);const s=new U,a=new Be,o=new Be;function l(c,d){let f=0,h=0,p=0;for(let P=0;P<9;P++)i.probe[P].set(0,0,0);let m=0,v=0,g=0,b=0,y=0,x=0,T=0,M=0;c.sort(GXe);const E=d!==!0?Math.PI:1;for(let P=0,R=c.length;P0&&(e.isWebGL2||t.has("OES_texture_float_linear")===!0?(i.rectAreaLTC1=St.LTC_FLOAT_1,i.rectAreaLTC2=St.LTC_FLOAT_2):t.has("OES_texture_half_float_linear")===!0?(i.rectAreaLTC1=St.LTC_HALF_1,i.rectAreaLTC2=St.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),i.ambient[0]=f,i.ambient[1]=h,i.ambient[2]=p;const S=i.hash;(S.directionalLength!==m||S.pointLength!==v||S.spotLength!==g||S.rectAreaLength!==b||S.hemiLength!==y||S.numDirectionalShadows!==x||S.numPointShadows!==T||S.numSpotShadows!==M)&&(i.directional.length=m,i.spot.length=g,i.rectArea.length=b,i.point.length=v,i.hemi.length=y,i.directionalShadow.length=x,i.directionalShadowMap.length=x,i.pointShadow.length=T,i.pointShadowMap.length=T,i.spotShadow.length=M,i.spotShadowMap.length=M,i.directionalShadowMatrix.length=x,i.pointShadowMatrix.length=T,i.spotShadowMatrix.length=M,S.directionalLength=m,S.pointLength=v,S.spotLength=g,S.rectAreaLength=b,S.hemiLength=y,S.numDirectionalShadows=x,S.numPointShadows=T,S.numSpotShadows=M,i.version=AXe++)}function u(c,d){let f=0,h=0,p=0,m=0,v=0;const g=d.matrixWorldInverse;for(let b=0,y=c.length;b=n.get(s).length?(o=new AZ(t,e),n.get(s).push(o)):o=n.get(s)[a],o}function i(){n=new WeakMap}return{get:r,dispose:i}}class my extends Ji{constructor(e){super(),this.type="MeshDepthMaterial",this.depthPacking=xK,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}}my.prototype.isMeshDepthMaterial=!0;class ET extends Ji{constructor(e){super(),this.type="MeshDistanceMaterial",this.referencePosition=new U,this.nearDistance=1,this.farDistance=1e3,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(e)}copy(e){return super.copy(e),this.referencePosition.copy(e.referencePosition),this.nearDistance=e.nearDistance,this.farDistance=e.farDistance,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}}ET.prototype.isMeshDistanceMaterial=!0;const ZXe=`void main() { gl_Position = vec4( position, 1.0 ); -}`,ZXe=`uniform sampler2D shadow_pass; +}`,JXe=`uniform sampler2D shadow_pass; uniform vec2 resolution; uniform float radius; #include @@ -3123,23 +3123,23 @@ void main() { squared_mean = squared_mean / samples; float std_dev = sqrt( squared_mean - mean * mean ); gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) ); -}`;function Xce(t,e,n){let r=new wT;const i=new Oe,s=new Oe,a=new Qt,o=new vy({depthPacking:ST}),l=new ET,u={},c=n.maxTextureSize,d={0:Ua,1:Ki,2:rn},f=new bi({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new Oe},radius:{value:4}},vertexShader:jXe,fragmentShader:ZXe}),h=f.clone();h.defines.HORIZONTAL_PASS=1;const p=new Lt;p.setAttribute("position",new un(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const m=new ut(p,f),v=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=dK,this.render=function(x,T,M){if(v.enabled===!1||v.autoUpdate===!1&&v.needsUpdate===!1||x.length===0)return;const E=t.getRenderTarget(),S=t.getActiveCubeFace(),P=t.getActiveMipmapLevel(),R=t.state;R.setBlending(os),R.buffers.color.setClear(1,1,1,1),R.buffers.depth.setTest(!0),R.setScissorTest(!1);for(let V=0,z=x.length;Vc||i.y>c)&&(i.x>c&&(s.x=Math.floor(c/q.x),i.x=s.x*q.x,N.mapSize.x=s.x),i.y>c&&(s.y=Math.floor(c/q.y),i.y=s.y*q.y,N.mapSize.y=s.y)),N.map===null&&!N.isPointLightShadow&&this.type===cv&&(N.map=new oi(i.x,i.y),N.map.texture.name=k.name+".shadowMap",N.mapPass=new oi(i.x,i.y),N.camera.updateProjectionMatrix()),N.map===null){const A={minFilter:Ir,magFilter:Ir,format:no};N.map=new oi(i.x,i.y,A),N.map.texture.name=k.name+".shadowMap",N.camera.updateProjectionMatrix()}t.setRenderTarget(N.map),t.clear();const L=N.getViewportCount();for(let A=0;A0){const z=R.uuid,k=T.uuid;let N=u[z];N===void 0&&(N={},u[z]=N);let q=N[k];q===void 0&&(q=R.clone(),N[k]=q),R=q}return R.visible=T.visible,R.wireframe=T.wireframe,P===cv?R.side=T.shadowSide!==null?T.shadowSide:T.side:R.side=T.shadowSide!==null?T.shadowSide:d[T.side],R.alphaMap=T.alphaMap,R.alphaTest=T.alphaTest,R.clipShadows=T.clipShadows,R.clippingPlanes=T.clippingPlanes,R.clipIntersection=T.clipIntersection,R.displacementMap=T.displacementMap,R.displacementScale=T.displacementScale,R.displacementBias=T.displacementBias,R.wireframeLinewidth=T.wireframeLinewidth,R.linewidth=T.linewidth,M.isPointLight===!0&&R.isMeshDistanceMaterial===!0&&(R.referencePosition.setFromMatrixPosition(M.matrixWorld),R.nearDistance=E,R.farDistance=S),R}function y(x,T,M,E,S){if(x.visible===!1)return;if(x.layers.test(T.layers)&&(x.isMesh||x.isLine||x.isPoints)&&(x.castShadow||x.receiveShadow&&S===cv)&&(!x.frustumCulled||r.intersectsObject(x))){x.modelViewMatrix.multiplyMatrices(M.matrixWorldInverse,x.matrixWorld);const V=e.update(x),z=x.material;if(Array.isArray(z)){const k=V.groups;for(let N=0,q=k.length;N=1):L.indexOf("OpenGL ES")!==-1&&(q=parseFloat(/^OpenGL ES (\d)/.exec(L)[1]),N=q>=2);let A=null,Z={};const j=t.getParameter(3088),ne=t.getParameter(2978),G=new Qt().fromArray(j),B=new Qt().fromArray(ne);function ee(Q,Pe,Ve){const Fe=new Uint8Array(4),je=t.createTexture();t.bindTexture(Q,je),t.texParameteri(Q,10241,9728),t.texParameteri(Q,10240,9728);for(let Ze=0;Zeme||W.height>me)&&(We=me/Math.max(W.width,W.height)),We<1||K===!0)if(typeof HTMLImageElement<"u"&&W instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&W instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&W instanceof ImageBitmap){const Ce=K?oP:Math.floor,Ae=Ce(We*W.width),J=Ce(We*W.height);m===void 0&&(m=b(Ae,J));const ue=ie?b(Ae,J):m;return ue.width=Ae,ue.height=J,ue.getContext("2d").drawImage(W,0,0,Ae,J),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+W.width+"x"+W.height+") to ("+Ae+"x"+J+")."),ue}else return"data"in W&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+W.width+"x"+W.height+")."),W;return W}function x(W){return ZL(W.width)&&ZL(W.height)}function T(W){return o?!1:W.wrapS!==_a||W.wrapT!==_a||W.minFilter!==Ir&&W.minFilter!==Hn}function M(W,K){return W.generateMipmaps&&K&&W.minFilter!==Ir&&W.minFilter!==Hn}function E(W){t.generateMipmap(W)}function S(W,K,ie,me,We=!1){if(o===!1)return K;if(W!==null){if(t[W]!==void 0)return t[W];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+W+"'")}let Ce=K;return K===6403&&(ie===5126&&(Ce=33326),ie===5131&&(Ce=33325),ie===5121&&(Ce=33321)),K===33319&&(ie===5126&&(Ce=33328),ie===5131&&(Ce=33327),ie===5121&&(Ce=33323)),K===6408&&(ie===5126&&(Ce=34836),ie===5131&&(Ce=34842),ie===5121&&(Ce=me===Jr&&We===!1?35907:32856),ie===32819&&(Ce=32854),ie===32820&&(Ce=32855)),(Ce===33325||Ce===33326||Ce===33327||Ce===33328||Ce===34842||Ce===34836)&&e.get("EXT_color_buffer_float"),Ce}function P(W,K,ie){return M(W,ie)===!0||W.isFramebufferTexture&&W.minFilter!==Ir&&W.minFilter!==Hn?Math.log2(Math.max(K.width,K.height))+1:W.mipmaps!==void 0&&W.mipmaps.length>0?W.mipmaps.length:W.isCompressedTexture&&Array.isArray(W.image)?K.mipmaps.length:1}function R(W){return W===Ir||W===iP||W===sP?9728:9729}function V(W){const K=W.target;K.removeEventListener("dispose",V),k(K),K.isVideoTexture&&p.delete(K)}function z(W){const K=W.target;K.removeEventListener("dispose",z),q(K)}function k(W){const K=r.get(W);if(K.__webglInit===void 0)return;const ie=W.source,me=v.get(ie);if(me){const We=me[K.__cacheKey];We.usedTimes--,We.usedTimes===0&&N(W),Object.keys(me).length===0&&v.delete(ie)}r.remove(W)}function N(W){const K=r.get(W);t.deleteTexture(K.__webglTexture);const ie=W.source,me=v.get(ie);delete me[K.__cacheKey],a.memory.textures--}function q(W){const K=W.texture,ie=r.get(W),me=r.get(K);if(me.__webglTexture!==void 0&&(t.deleteTexture(me.__webglTexture),a.memory.textures--),W.depthTexture&&W.depthTexture.dispose(),W.isWebGLCubeRenderTarget)for(let We=0;We<6;We++)t.deleteFramebuffer(ie.__webglFramebuffer[We]),ie.__webglDepthbuffer&&t.deleteRenderbuffer(ie.__webglDepthbuffer[We]);else t.deleteFramebuffer(ie.__webglFramebuffer),ie.__webglDepthbuffer&&t.deleteRenderbuffer(ie.__webglDepthbuffer),ie.__webglMultisampledFramebuffer&&t.deleteFramebuffer(ie.__webglMultisampledFramebuffer),ie.__webglColorRenderbuffer&&t.deleteRenderbuffer(ie.__webglColorRenderbuffer),ie.__webglDepthRenderbuffer&&t.deleteRenderbuffer(ie.__webglDepthRenderbuffer);if(W.isWebGLMultipleRenderTargets)for(let We=0,Ce=K.length;We=l&&console.warn("THREE.WebGLTextures: Trying to use "+W+" texture units while this GPU supports only "+l),L+=1,W}function j(W){const K=[];return K.push(W.wrapS),K.push(W.wrapT),K.push(W.magFilter),K.push(W.minFilter),K.push(W.anisotropy),K.push(W.internalFormat),K.push(W.format),K.push(W.type),K.push(W.generateMipmaps),K.push(W.premultiplyAlpha),K.push(W.flipY),K.push(W.unpackAlignment),K.push(W.encoding),K.join()}function ne(W,K){const ie=r.get(W);if(W.isVideoTexture&&we(W),W.isRenderTargetTexture===!1&&W.version>0&&ie.__version!==W.version){const me=W.image;if(me===null)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else if(me.complete===!1)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else{oe(ie,W,K);return}}n.activeTexture(33984+K),n.bindTexture(3553,ie.__webglTexture)}function G(W,K){const ie=r.get(W);if(W.version>0&&ie.__version!==W.version){oe(ie,W,K);return}n.activeTexture(33984+K),n.bindTexture(35866,ie.__webglTexture)}function B(W,K){const ie=r.get(W);if(W.version>0&&ie.__version!==W.version){oe(ie,W,K);return}n.activeTexture(33984+K),n.bindTexture(32879,ie.__webglTexture)}function ee(W,K){const ie=r.get(W);if(W.version>0&&ie.__version!==W.version){ye(ie,W,K);return}n.activeTexture(33984+K),n.bindTexture(34067,ie.__webglTexture)}const ce={[yf]:10497,[_a]:33071,[o6]:33648},fe={[Ir]:9728,[iP]:9984,[sP]:9986,[Hn]:9729,[bK]:9985,[b0]:9987};function te(W,K,ie){if(ie?(t.texParameteri(W,10242,ce[K.wrapS]),t.texParameteri(W,10243,ce[K.wrapT]),(W===32879||W===35866)&&t.texParameteri(W,32882,ce[K.wrapR]),t.texParameteri(W,10240,fe[K.magFilter]),t.texParameteri(W,10241,fe[K.minFilter])):(t.texParameteri(W,10242,33071),t.texParameteri(W,10243,33071),(W===32879||W===35866)&&t.texParameteri(W,32882,33071),(K.wrapS!==_a||K.wrapT!==_a)&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),t.texParameteri(W,10240,R(K.magFilter)),t.texParameteri(W,10241,R(K.minFilter)),K.minFilter!==Ir&&K.minFilter!==Hn&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")),e.has("EXT_texture_filter_anisotropic")===!0){const me=e.get("EXT_texture_filter_anisotropic");if(K.type===na&&e.has("OES_texture_float_linear")===!1||o===!1&&K.type===No&&e.has("OES_texture_half_float_linear")===!1)return;(K.anisotropy>1||r.get(K).__currentAnisotropy)&&(t.texParameterf(W,me.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(K.anisotropy,i.getMaxAnisotropy())),r.get(K).__currentAnisotropy=K.anisotropy)}}function _(W,K){let ie=!1;W.__webglInit===void 0&&(W.__webglInit=!0,K.addEventListener("dispose",V));const me=K.source;let We=v.get(me);We===void 0&&(We={},v.set(me,We));const Ce=j(K);if(Ce!==W.__cacheKey){We[Ce]===void 0&&(We[Ce]={texture:t.createTexture(),usedTimes:0},a.memory.textures++,ie=!0),We[Ce].usedTimes++;const Ae=We[W.__cacheKey];Ae!==void 0&&(We[W.__cacheKey].usedTimes--,Ae.usedTimes===0&&N(K)),W.__cacheKey=Ce,W.__webglTexture=We[Ce].texture}return ie}function oe(W,K,ie){let me=3553;K.isDataArrayTexture&&(me=35866),K.isData3DTexture&&(me=32879);const We=_(W,K),Ce=K.source;if(n.activeTexture(33984+ie),n.bindTexture(me,W.__webglTexture),Ce.version!==Ce.__currentVersion||We===!0){t.pixelStorei(37440,K.flipY),t.pixelStorei(37441,K.premultiplyAlpha),t.pixelStorei(3317,K.unpackAlignment),t.pixelStorei(37443,0);const Ae=T(K)&&x(K.image)===!1;let J=y(K.image,Ae,!1,c);J=se(K,J);const ue=x(J)||o,ge=s.convert(K.format,K.encoding);let Se=s.convert(K.type),Q=S(K.internalFormat,ge,Se,K.encoding,K.isVideoTexture);te(me,K,ue);let Pe;const Ve=K.mipmaps,Fe=o&&K.isVideoTexture!==!0,je=W.__version===void 0||We===!0,Ze=P(K,J,ue);if(K.isDepthTexture)Q=6402,o?K.type===na?Q=36012:K.type===rx?Q=33190:K.type===Pv?Q=35056:Q=33189:K.type===na&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),K.format===dp&&Q===6402&&K.type!==pb&&K.type!==rx&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),K.type=pb,Se=s.convert(K.type)),K.format===Wv&&Q===6402&&(Q=34041,K.type!==Pv&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),K.type=Pv,Se=s.convert(K.type))),je&&(Fe?n.texStorage2D(3553,1,Q,J.width,J.height):n.texImage2D(3553,0,Q,J.width,J.height,0,ge,Se,null));else if(K.isDataTexture)if(Ve.length>0&&ue){Fe&&je&&n.texStorage2D(3553,Ze,Q,Ve[0].width,Ve[0].height);for(let Re=0,Me=Ve.length;Re>=1,Me>>=1}}else if(Ve.length>0&&ue){Fe&&je&&n.texStorage2D(3553,Ze,Q,Ve[0].width,Ve[0].height);for(let Re=0,Me=Ve.length;Re0&&je++,n.texStorage2D(34067,je,Pe,J[0].width,J[0].height));for(let Re=0;Re<6;Re++)if(Ae){Ve?n.texSubImage2D(34069+Re,0,0,0,J[Re].width,J[Re].height,Se,Q,J[Re].data):n.texImage2D(34069+Re,0,Pe,J[Re].width,J[Re].height,0,Se,Q,J[Re].data);for(let Me=0;Me0&&be(W)===!1){ie.__webglMultisampledFramebuffer=t.createFramebuffer(),ie.__webglColorRenderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(36161,ie.__webglColorRenderbuffer);const J=s.convert(K.format,K.encoding),ue=s.convert(K.type),ge=S(K.internalFormat,J,ue,K.encoding),Se=he(W);t.renderbufferStorageMultisample(36161,Se,ge,W.width,W.height),n.bindFramebuffer(36160,ie.__webglMultisampledFramebuffer),t.framebufferRenderbuffer(36160,36064,36161,ie.__webglColorRenderbuffer),t.bindRenderbuffer(36161,null),W.depthBuffer&&(ie.__webglDepthRenderbuffer=t.createRenderbuffer(),Ke(ie.__webglDepthRenderbuffer,W,!0)),n.bindFramebuffer(36160,null)}if(We){n.bindTexture(34067,me.__webglTexture),te(34067,K,Ae);for(let J=0;J<6;J++)ve(ie.__webglFramebuffer[J],W,K,36064,34069+J);M(K,Ae)&&E(34067),n.unbindTexture()}else if(Ce){const J=W.texture;for(let ue=0,ge=J.length;ue0&&be(W)===!1){const K=W.width,ie=W.height;let me=16384;const We=[36064],Ce=W.stencilBuffer?33306:36096;W.depthBuffer&&We.push(Ce);const Ae=r.get(W),J=Ae.__ignoreDepthValues!==void 0?Ae.__ignoreDepthValues:!1;J===!1&&(W.depthBuffer&&(me|=256),W.stencilBuffer&&(me|=1024)),n.bindFramebuffer(36008,Ae.__webglMultisampledFramebuffer),n.bindFramebuffer(36009,Ae.__webglFramebuffer),J===!0&&(t.invalidateFramebuffer(36008,[Ce]),t.invalidateFramebuffer(36009,[Ce])),t.blitFramebuffer(0,0,K,ie,0,0,K,ie,me,9728),h&&t.invalidateFramebuffer(36008,We),n.bindFramebuffer(36008,null),n.bindFramebuffer(36009,Ae.__webglMultisampledFramebuffer)}}function he(W){return Math.min(d,W.samples)}function be(W){const K=r.get(W);return o&&W.samples>0&&e.has("WEBGL_multisampled_render_to_texture")===!0&&K.__useRenderToTexture!==!1}function we(W){const K=a.render.frame;p.get(W)!==K&&(p.set(W,K),W.update())}function se(W,K){const ie=W.encoding,me=W.format,We=W.type;return W.isCompressedTexture===!0||W.isVideoTexture===!0||W.format===aP||ie!==yl&&(ie===Jr?o===!1?e.has("EXT_sRGB")===!0&&me===no?(W.format=aP,W.minFilter=Hn,W.generateMipmaps=!1):K=nm.sRGBToLinear(K):(me!==no||We!==Np)&&console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture encoding:",ie)),K}this.allocateTextureUnit=Z,this.resetTextureUnits=A,this.setTexture2D=ne,this.setTexture2DArray=G,this.setTexture3D=B,this.setTextureCube=ee,this.rebindTextures=F,this.setupRenderTarget=re,this.updateRenderTargetMipmap=de,this.updateMultisampleRenderTarget=Te,this.setupDepthRenderbuffer=D,this.setupFrameBufferTexture=ve,this.useMultisampledRTT=be}function Cce(t,e,n){const r=n.isWebGL2;function i(s,a=null){let o;if(s===Np)return 5121;if(s===$ue)return 32819;if(s===ece)return 32820;if(s===Hue)return 5120;if(s===Que)return 5122;if(s===pb)return 5123;if(s===_ue)return 5124;if(s===rx)return 5125;if(s===na)return 5126;if(s===No)return r?5131:(o=e.get("OES_texture_half_float"),o!==null?o.HALF_FLOAT_OES:null);if(s===tce)return 6406;if(s===no)return 6408;if(s===rce)return 6409;if(s===ice)return 6410;if(s===dp)return 6402;if(s===Wv)return 34041;if(s===CV)return 6403;if(s===nce)return console.warn("THREE.WebGLRenderer: THREE.RGBFormat has been removed. Use THREE.RGBAFormat instead. https://github.com/mrdoob/three.js/pull/23228"),6408;if(s===aP)return o=e.get("EXT_sRGB"),o!==null?o.SRGB_ALPHA_EXT:null;if(s===sce)return 36244;if(s===ace)return 33319;if(s===oce)return 33320;if(s===lce)return 36249;if(s===S7||s===x7||s===T7||s===w7)if(a===Jr)if(o=e.get("WEBGL_compressed_texture_s3tc_srgb"),o!==null){if(s===S7)return o.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(s===x7)return o.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(s===T7)return o.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(s===w7)return o.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(o=e.get("WEBGL_compressed_texture_s3tc"),o!==null){if(s===S7)return o.COMPRESSED_RGB_S3TC_DXT1_EXT;if(s===x7)return o.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(s===T7)return o.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(s===w7)return o.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(s===EL||s===ML||s===PL||s===RL)if(o=e.get("WEBGL_compressed_texture_pvrtc"),o!==null){if(s===EL)return o.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(s===ML)return o.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(s===PL)return o.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(s===RL)return o.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(s===uce)return o=e.get("WEBGL_compressed_texture_etc1"),o!==null?o.COMPRESSED_RGB_ETC1_WEBGL:null;if(s===VL||s===zL)if(o=e.get("WEBGL_compressed_texture_etc"),o!==null){if(s===VL)return a===Jr?o.COMPRESSED_SRGB8_ETC2:o.COMPRESSED_RGB8_ETC2;if(s===zL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:o.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(s===kL||s===OL||s===IL||s===UL||s===NL||s===LL||s===XL||s===CL||s===KL||s===qL||s===DL||s===WL||s===AL||s===GL)if(o=e.get("WEBGL_compressed_texture_astc"),o!==null){if(s===kL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:o.COMPRESSED_RGBA_ASTC_4x4_KHR;if(s===OL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:o.COMPRESSED_RGBA_ASTC_5x4_KHR;if(s===IL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:o.COMPRESSED_RGBA_ASTC_5x5_KHR;if(s===UL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:o.COMPRESSED_RGBA_ASTC_6x5_KHR;if(s===NL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:o.COMPRESSED_RGBA_ASTC_6x6_KHR;if(s===LL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:o.COMPRESSED_RGBA_ASTC_8x5_KHR;if(s===XL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:o.COMPRESSED_RGBA_ASTC_8x6_KHR;if(s===CL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:o.COMPRESSED_RGBA_ASTC_8x8_KHR;if(s===KL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:o.COMPRESSED_RGBA_ASTC_10x5_KHR;if(s===qL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:o.COMPRESSED_RGBA_ASTC_10x6_KHR;if(s===DL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:o.COMPRESSED_RGBA_ASTC_10x8_KHR;if(s===WL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:o.COMPRESSED_RGBA_ASTC_10x10_KHR;if(s===AL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:o.COMPRESSED_RGBA_ASTC_12x10_KHR;if(s===GL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:o.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(s===FL)if(o=e.get("EXT_texture_compression_bptc"),o!==null){if(s===FL)return a===Jr?o.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:o.COMPRESSED_RGBA_BPTC_UNORM_EXT}else return null;return s===Pv?r?34042:(o=e.get("WEBGL_depth_texture"),o!==null?o.UNSIGNED_INT_24_8_WEBGL:null):t[s]!==void 0?t[s]:null}return{convert:i}}class wK extends ns{constructor(e=[]){super(),this.cameras=e}}wK.prototype.isArrayCamera=!0;class $a extends cn{constructor(){super(),this.type="Group"}}$a.prototype.isGroup=!0;const BXe={type:"move"};class jk{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return this._hand===null&&(this._hand=new $a,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return this._targetRay===null&&(this._targetRay=new $a,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new U,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new U),this._targetRay}getGripSpace(){return this._grip===null&&(this._grip=new $a,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new U,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new U),this._grip}dispatchEvent(e){return this._targetRay!==null&&this._targetRay.dispatchEvent(e),this._grip!==null&&this._grip.dispatchEvent(e),this._hand!==null&&this._hand.dispatchEvent(e),this}disconnect(e){return this.dispatchEvent({type:"disconnected",data:e}),this._targetRay!==null&&(this._targetRay.visible=!1),this._grip!==null&&(this._grip.visible=!1),this._hand!==null&&(this._hand.visible=!1),this}update(e,n,r){let i=null,s=null,a=null;const o=this._targetRay,l=this._grip,u=this._hand;if(e&&n.session.visibilityState!=="visible-blurred")if(o!==null&&(i=n.getPose(e.targetRaySpace,r),i!==null&&(o.matrix.fromArray(i.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),i.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(i.linearVelocity)):o.hasLinearVelocity=!1,i.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(i.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(BXe))),u&&e.hand){a=!0;for(const m of e.hand.values()){const v=n.getJointPose(m,r);if(u.joints[m.jointName]===void 0){const b=new $a;b.matrixAutoUpdate=!1,b.visible=!1,u.joints[m.jointName]=b,u.add(b)}const g=u.joints[m.jointName];v!==null&&(g.matrix.fromArray(v.transform.matrix),g.matrix.decompose(g.position,g.rotation,g.scale),g.jointRadius=v.radius),g.visible=v!==null}const c=u.joints["index-finger-tip"],d=u.joints["thumb-tip"],f=c.position.distanceTo(d.position),h=.02,p=.005;u.inputState.pinching&&f>h+p?(u.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!u.inputState.pinching&&f<=h-p&&(u.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else l!==null&&e.gripSpace&&(s=n.getPose(e.gripSpace,r),s!==null&&(l.matrix.fromArray(s.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),s.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(s.linearVelocity)):l.hasLinearVelocity=!1,s.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(s.angularVelocity)):l.hasAngularVelocity=!1));return o!==null&&(o.visible=i!==null),l!==null&&(l.visible=s!==null),u!==null&&(u.visible=a!==null),this}}class EK extends Di{constructor(e,n,r,i,s,a,o,l,u,c){if(c=c!==void 0?c:dp,c!==dp&&c!==Wv)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");r===void 0&&c===dp&&(r=pb),r===void 0&&c===Wv&&(r=Pv),super(null,i,s,a,o,l,c,r,u),this.image={width:e,height:n},this.magFilter=o!==void 0?o:Ir,this.minFilter=l!==void 0?l:Ir,this.flipY=!1,this.generateMipmaps=!1}}EK.prototype.isDepthTexture=!0;class HXe extends tm{constructor(e,n){super();const r=this;let i=null,s=1,a=null,o="local-floor",l=null,u=null,c=null,d=null,f=null,h=null;const p=n.getContextAttributes();let m=null,v=null;const g=[],b=new Map,y=new ns;y.layers.enable(1),y.viewport=new Qt;const x=new ns;x.layers.enable(2),x.viewport=new Qt;const T=[y,x],M=new wK;M.layers.enable(1),M.layers.enable(2);let E=null,S=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(j){let ne=g[j];return ne===void 0&&(ne=new jk,g[j]=ne),ne.getTargetRaySpace()},this.getControllerGrip=function(j){let ne=g[j];return ne===void 0&&(ne=new jk,g[j]=ne),ne.getGripSpace()},this.getHand=function(j){let ne=g[j];return ne===void 0&&(ne=new jk,g[j]=ne),ne.getHandSpace()};function P(j){const ne=b.get(j.inputSource);ne&&ne.dispatchEvent({type:j.type,data:j.inputSource})}function R(){b.forEach(function(j,ne){j.disconnect(ne)}),b.clear(),E=null,S=null,e.setRenderTarget(m),f=null,d=null,c=null,i=null,v=null,Z.stop(),r.isPresenting=!1,r.dispatchEvent({type:"sessionend"})}this.setFramebufferScaleFactor=function(j){s=j,r.isPresenting===!0&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(j){o=j,r.isPresenting===!0&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return l||a},this.setReferenceSpace=function(j){l=j},this.getBaseLayer=function(){return d!==null?d:f},this.getBinding=function(){return c},this.getFrame=function(){return h},this.getSession=function(){return i},this.setSession=async function(j){if(i=j,i!==null){if(m=e.getRenderTarget(),i.addEventListener("select",P),i.addEventListener("selectstart",P),i.addEventListener("selectend",P),i.addEventListener("squeeze",P),i.addEventListener("squeezestart",P),i.addEventListener("squeezeend",P),i.addEventListener("end",R),i.addEventListener("inputsourceschange",V),p.xrCompatible!==!0&&await n.makeXRCompatible(),i.renderState.layers===void 0||e.capabilities.isWebGL2===!1){const ne={antialias:i.renderState.layers===void 0?p.antialias:!0,alpha:p.alpha,depth:p.depth,stencil:p.stencil,framebufferScaleFactor:s};f=new XRWebGLLayer(i,n,ne),i.updateRenderState({baseLayer:f}),v=new oi(f.framebufferWidth,f.framebufferHeight,{format:no,type:Np,encoding:e.outputEncoding})}else{let ne=null,G=null,B=null;p.depth&&(B=p.stencil?35056:33190,ne=p.stencil?Wv:dp,G=p.stencil?Pv:pb);const ee={colorFormat:e.outputEncoding===Jr?35907:32856,depthFormat:B,scaleFactor:s};c=new XRWebGLBinding(i,n),d=c.createProjectionLayer(ee),i.updateRenderState({layers:[d]}),v=new oi(d.textureWidth,d.textureHeight,{format:no,type:Np,depthTexture:new EK(d.textureWidth,d.textureHeight,G,void 0,void 0,void 0,void 0,void 0,void 0,ne),stencilBuffer:p.stencil,encoding:e.outputEncoding,samples:p.antialias?4:0});const ce=e.properties.get(v);ce.__ignoreDepthValues=d.ignoreDepthValues}v.isXRRenderTarget=!0,this.setFoveation(1),a=await i.requestReferenceSpace(o),Z.setContext(i),Z.start(),r.isPresenting=!0,r.dispatchEvent({type:"sessionstart"})}};function V(j){const ne=i.inputSources;for(let G=0;G0&&(m.alphaTest.value=v.alphaTest);const g=e.get(v).envMap;if(g&&(m.envMap.value=g,m.flipEnvMap.value=g.isCubeTexture&&g.isRenderTargetTexture===!1?-1:1,m.reflectivity.value=v.reflectivity,m.ior.value=v.ior,m.refractionRatio.value=v.refractionRatio),v.lightMap){m.lightMap.value=v.lightMap;const x=t.physicallyCorrectLights!==!0?Math.PI:1;m.lightMapIntensity.value=v.lightMapIntensity*x}v.aoMap&&(m.aoMap.value=v.aoMap,m.aoMapIntensity.value=v.aoMapIntensity);let b;v.map?b=v.map:v.specularMap?b=v.specularMap:v.displacementMap?b=v.displacementMap:v.normalMap?b=v.normalMap:v.bumpMap?b=v.bumpMap:v.roughnessMap?b=v.roughnessMap:v.metalnessMap?b=v.metalnessMap:v.alphaMap?b=v.alphaMap:v.emissiveMap?b=v.emissiveMap:v.clearcoatMap?b=v.clearcoatMap:v.clearcoatNormalMap?b=v.clearcoatNormalMap:v.clearcoatRoughnessMap?b=v.clearcoatRoughnessMap:v.specularIntensityMap?b=v.specularIntensityMap:v.specularColorMap?b=v.specularColorMap:v.transmissionMap?b=v.transmissionMap:v.thicknessMap?b=v.thicknessMap:v.sheenColorMap?b=v.sheenColorMap:v.sheenRoughnessMap&&(b=v.sheenRoughnessMap),b!==void 0&&(b.isWebGLRenderTarget&&(b=b.texture),b.matrixAutoUpdate===!0&&b.updateMatrix(),m.uvTransform.value.copy(b.matrix));let y;v.aoMap?y=v.aoMap:v.lightMap&&(y=v.lightMap),y!==void 0&&(y.isWebGLRenderTarget&&(y=y.texture),y.matrixAutoUpdate===!0&&y.updateMatrix(),m.uv2Transform.value.copy(y.matrix))}function s(m,v){m.diffuse.value.copy(v.color),m.opacity.value=v.opacity}function a(m,v){m.dashSize.value=v.dashSize,m.totalSize.value=v.dashSize+v.gapSize,m.scale.value=v.scale}function o(m,v,g,b){m.diffuse.value.copy(v.color),m.opacity.value=v.opacity,m.size.value=v.size*g,m.scale.value=b*.5,v.map&&(m.map.value=v.map),v.alphaMap&&(m.alphaMap.value=v.alphaMap),v.alphaTest>0&&(m.alphaTest.value=v.alphaTest);let y;v.map?y=v.map:v.alphaMap&&(y=v.alphaMap),y!==void 0&&(y.matrixAutoUpdate===!0&&y.updateMatrix(),m.uvTransform.value.copy(y.matrix))}function l(m,v){m.diffuse.value.copy(v.color),m.opacity.value=v.opacity,m.rotation.value=v.rotation,v.map&&(m.map.value=v.map),v.alphaMap&&(m.alphaMap.value=v.alphaMap),v.alphaTest>0&&(m.alphaTest.value=v.alphaTest);let g;v.map?g=v.map:v.alphaMap&&(g=v.alphaMap),g!==void 0&&(g.matrixAutoUpdate===!0&&g.updateMatrix(),m.uvTransform.value.copy(g.matrix))}function u(m,v){m.specular.value.copy(v.specular),m.shininess.value=Math.max(v.shininess,1e-4)}function c(m,v){v.gradientMap&&(m.gradientMap.value=v.gradientMap)}function d(m,v){m.roughness.value=v.roughness,m.metalness.value=v.metalness,v.roughnessMap&&(m.roughnessMap.value=v.roughnessMap),v.metalnessMap&&(m.metalnessMap.value=v.metalnessMap),e.get(v).envMap&&(m.envMapIntensity.value=v.envMapIntensity)}function f(m,v,g){m.ior.value=v.ior,v.sheen>0&&(m.sheenColor.value.copy(v.sheenColor).multiplyScalar(v.sheen),m.sheenRoughness.value=v.sheenRoughness,v.sheenColorMap&&(m.sheenColorMap.value=v.sheenColorMap),v.sheenRoughnessMap&&(m.sheenRoughnessMap.value=v.sheenRoughnessMap)),v.clearcoat>0&&(m.clearcoat.value=v.clearcoat,m.clearcoatRoughness.value=v.clearcoatRoughness,v.clearcoatMap&&(m.clearcoatMap.value=v.clearcoatMap),v.clearcoatRoughnessMap&&(m.clearcoatRoughnessMap.value=v.clearcoatRoughnessMap),v.clearcoatNormalMap&&(m.clearcoatNormalScale.value.copy(v.clearcoatNormalScale),m.clearcoatNormalMap.value=v.clearcoatNormalMap,v.side===Ua&&m.clearcoatNormalScale.value.negate())),v.transmission>0&&(m.transmission.value=v.transmission,m.transmissionSamplerMap.value=g.texture,m.transmissionSamplerSize.value.set(g.width,g.height),v.transmissionMap&&(m.transmissionMap.value=v.transmissionMap),m.thickness.value=v.thickness,v.thicknessMap&&(m.thicknessMap.value=v.thicknessMap),m.attenuationDistance.value=v.attenuationDistance,m.attenuationColor.value.copy(v.attenuationColor)),m.specularIntensity.value=v.specularIntensity,m.specularColor.value.copy(v.specularColor),v.specularIntensityMap&&(m.specularIntensityMap.value=v.specularIntensityMap),v.specularColorMap&&(m.specularColorMap.value=v.specularColorMap)}function h(m,v){v.matcap&&(m.matcap.value=v.matcap)}function p(m,v){m.referencePosition.value.copy(v.referencePosition),m.nearDistance.value=v.nearDistance,m.farDistance.value=v.farDistance}return{refreshFogUniforms:n,refreshMaterialUniforms:r}}function _Xe(){const t=h6("canvas");return t.style.display="block",t}function xr(t={}){const e=t.canvas!==void 0?t.canvas:_Xe(),n=t.context!==void 0?t.context:null,r=t.depth!==void 0?t.depth:!0,i=t.stencil!==void 0?t.stencil:!0,s=t.antialias!==void 0?t.antialias:!1,a=t.premultipliedAlpha!==void 0?t.premultipliedAlpha:!0,o=t.preserveDrawingBuffer!==void 0?t.preserveDrawingBuffer:!1,l=t.powerPreference!==void 0?t.powerPreference:"default",u=t.failIfMajorPerformanceCaveat!==void 0?t.failIfMajorPerformanceCaveat:!1;let c;n!==null?c=n.getContextAttributes().alpha:c=t.alpha!==void 0?t.alpha:!1;let d=null,f=null;const h=[],p=[];this.domElement=e,this.debug={checkShaderErrors:!0},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.outputEncoding=yl,this.physicallyCorrectLights=!1,this.toneMapping=Wc,this.toneMappingExposure=1;const m=this;let v=!1,g=0,b=0,y=null,x=-1,T=null;const M=new Qt,E=new Qt;let S=null,P=e.width,R=e.height,V=1,z=null,k=null;const N=new Qt(0,0,P,R),q=new Qt(0,0,P,R);let L=!1;const A=new wT;let Z=!1,j=!1,ne=null;const G=new Be,B=new Oe,ee=new U,ce={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function fe(){return y===null?V:1}let te=n;function _($,Ie){for(let Ge=0;Ge<$.length;Ge++){const qe=$[Ge],Ue=e.getContext(qe,Ie);if(Ue!==null)return Ue}return null}try{const $={alpha:!0,depth:r,stencil:i,antialias:s,premultipliedAlpha:a,preserveDrawingBuffer:o,powerPreference:l,failIfMajorPerformanceCaveat:u};if("setAttribute"in e&&e.setAttribute("data-engine",`three.js r${NV}`),e.addEventListener("webglcontextlost",Q,!1),e.addEventListener("webglcontextrestored",Pe,!1),te===null){const Ie=["webgl2","webgl","experimental-webgl"];if(m.isWebGL1Renderer===!0&&Ie.shift(),te=_(Ie,$),te===null)throw _(Ie)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}te.getShaderPrecisionFormat===void 0&&(te.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch($){throw console.error("THREE.WebGLRenderer: "+$.message),$}let oe,ye,ve,Ke,le,D,F,re,de,Te,he,be,we,se,W,K,ie,me,We,Ce,Ae,J,ue;function ge(){oe=new v4e(te),ye=new c4e(te,oe,t),oe.init(ye),J=new Cce(te,oe,ye),ve=new JXe(te,oe,ye),Ke=new y4e,le=new XXe,D=new YXe(te,oe,ve,le,ye,J,Ke),F=new f4e(m),re=new m4e(m),de=new UNe(te,ye),ue=new l4e(te,oe,de,ye),Te=new g4e(te,de,Ke,ue),he=new w4e(te,Te,de,Ke),We=new T4e(te,ye,D),K=new d4e(le),be=new LXe(m,F,re,oe,ye,ue,K),we=new QXe(m,le),se=new KXe,W=new FXe(oe,ye),me=new o4e(m,F,ve,he,c,a),ie=new Xce(m,he,ye),Ce=new u4e(te,oe,Ke,ye),Ae=new b4e(te,oe,Ke,ye),Ke.programs=be.programs,m.capabilities=ye,m.extensions=oe,m.properties=le,m.renderLists=se,m.shadowMap=ie,m.state=ve,m.info=Ke}ge();const Se=new HXe(m,te);this.xr=Se,this.getContext=function(){return te},this.getContextAttributes=function(){return te.getContextAttributes()},this.forceContextLoss=function(){const $=oe.get("WEBGL_lose_context");$&&$.loseContext()},this.forceContextRestore=function(){const $=oe.get("WEBGL_lose_context");$&&$.restoreContext()},this.getPixelRatio=function(){return V},this.setPixelRatio=function($){$!==void 0&&(V=$,this.setSize(P,R,!1))},this.getSize=function($){return $.set(P,R)},this.setSize=function($,Ie,Ge){if(Se.isPresenting){console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting.");return}P=$,R=Ie,e.width=Math.floor($*V),e.height=Math.floor(Ie*V),Ge!==!1&&(e.style.width=$+"px",e.style.height=Ie+"px"),this.setViewport(0,0,$,Ie)},this.getDrawingBufferSize=function($){return $.set(P*V,R*V).floor()},this.setDrawingBufferSize=function($,Ie,Ge){P=$,R=Ie,V=Ge,e.width=Math.floor($*Ge),e.height=Math.floor(Ie*Ge),this.setViewport(0,0,$,Ie)},this.getCurrentViewport=function($){return $.copy(M)},this.getViewport=function($){return $.copy(N)},this.setViewport=function($,Ie,Ge,qe){$.isVector4?N.set($.x,$.y,$.z,$.w):N.set($,Ie,Ge,qe),ve.viewport(M.copy(N).multiplyScalar(V).floor())},this.getScissor=function($){return $.copy(q)},this.setScissor=function($,Ie,Ge,qe){$.isVector4?q.set($.x,$.y,$.z,$.w):q.set($,Ie,Ge,qe),ve.scissor(E.copy(q).multiplyScalar(V).floor())},this.getScissorTest=function(){return L},this.setScissorTest=function($){ve.setScissorTest(L=$)},this.setOpaqueSort=function($){z=$},this.setTransparentSort=function($){k=$},this.getClearColor=function($){return $.copy(me.getClearColor())},this.setClearColor=function(){me.setClearColor.apply(me,arguments)},this.getClearAlpha=function(){return me.getClearAlpha()},this.setClearAlpha=function(){me.setClearAlpha.apply(me,arguments)},this.clear=function($=!0,Ie=!0,Ge=!0){let qe=0;$&&(qe|=16384),Ie&&(qe|=256),Ge&&(qe|=1024),te.clear(qe)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){e.removeEventListener("webglcontextlost",Q,!1),e.removeEventListener("webglcontextrestored",Pe,!1),se.dispose(),W.dispose(),le.dispose(),F.dispose(),re.dispose(),he.dispose(),ue.dispose(),be.dispose(),Se.dispose(),Se.removeEventListener("sessionstart",Me),Se.removeEventListener("sessionend",lt),ne&&(ne.dispose(),ne=null),vt.stop()};function Q($){$.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),v=!0}function Pe(){console.log("THREE.WebGLRenderer: Context Restored."),v=!1;const $=Ke.autoReset,Ie=ie.enabled,Ge=ie.autoUpdate,qe=ie.needsUpdate,Ue=ie.type;ge(),Ke.autoReset=$,ie.enabled=Ie,ie.autoUpdate=Ge,ie.needsUpdate=qe,ie.type=Ue}function Ve($){const Ie=$.target;Ie.removeEventListener("dispose",Ve),Fe(Ie)}function Fe($){je($),le.remove($)}function je($){const Ie=le.get($).programs;Ie!==void 0&&(Ie.forEach(function(Ge){be.releaseProgram(Ge)}),$.isShaderMaterial&&be.releaseShaderCache($))}this.renderBufferDirect=function($,Ie,Ge,qe,Ue,Pt){Ie===null&&(Ie=ce);const Dt=Ue.isMesh&&Ue.matrixWorld.determinant()<0,C=wr($,Ie,Ge,qe,Ue);ve.setMaterial(qe,Dt);let Y=Ge.index;const ae=Ge.attributes.position;if(Y===null){if(ae===void 0||ae.count===0)return}else if(Y.count===0)return;let Ee=1;qe.wireframe===!0&&(Y=Te.getWireframeAttribute(Ge),Ee=2),ue.setup(Ue,qe,C,Ge,Y);let Le,De=Ce;Y!==null&&(Le=de.get(Y),De=Ae,De.setIndex(Le));const it=Y!==null?Y.count:ae.count,ot=Ge.drawRange.start*Ee,ct=Ge.drawRange.count*Ee,$e=Pt!==null?Pt.start*Ee:0,_e=Pt!==null?Pt.count*Ee:1/0,Qe=Math.max(ot,$e),dt=Math.min(it,ot+ct,$e+_e)-1,zt=Math.max(0,dt-Qe+1);if(zt!==0){if(Ue.isMesh)qe.wireframe===!0?(ve.setLineWidth(qe.wireframeLinewidth*fe()),De.setMode(1)):De.setMode(4);else if(Ue.isLine){let Xt=qe.linewidth;Xt===void 0&&(Xt=1),ve.setLineWidth(Xt*fe()),Ue.isLineSegments?De.setMode(1):Ue.isLineLoop?De.setMode(2):De.setMode(3)}else Ue.isPoints?De.setMode(0):Ue.isSprite&&De.setMode(4);if(Ue.isInstancedMesh)De.renderInstances(Qe,zt,Ue.count);else if(Ge.isInstancedBufferGeometry){const Xt=Math.min(Ge.instanceCount,Ge._maxInstanceCount);De.renderInstances(Qe,zt,Xt)}else De.render(Qe,zt)}},this.compile=function($,Ie){f=W.get($),f.init(),p.push(f),$.traverseVisible(function(Ge){Ge.isLight&&Ge.layers.test(Ie.layers)&&(f.pushLight(Ge),Ge.castShadow&&f.pushShadow(Ge))}),f.setupLights(m.physicallyCorrectLights),$.traverse(function(Ge){const qe=Ge.material;if(qe)if(Array.isArray(qe))for(let Ue=0;Ue0?f=p[p.length-1]:f=null,h.pop(),h.length>0?d=h[h.length-1]:d=null};function bn($,Ie,Ge,qe){if($.visible===!1)return;if($.layers.test(Ie.layers)){if($.isGroup)Ge=$.renderOrder;else if($.isLOD)$.autoUpdate===!0&&$.update(Ie);else if($.isLight)f.pushLight($),$.castShadow&&f.pushShadow($);else if($.isSprite){if(!$.frustumCulled||A.intersectsSprite($)){qe&&ee.setFromMatrixPosition($.matrixWorld).applyMatrix4(G);const Dt=he.update($),C=$.material;C.visible&&d.push($,Dt,C,Ge,ee.z,null)}}else if(($.isMesh||$.isLine||$.isPoints)&&($.isSkinnedMesh&&$.skeleton.frame!==Ke.render.frame&&($.skeleton.update(),$.skeleton.frame=Ke.render.frame),!$.frustumCulled||A.intersectsObject($))){qe&&ee.setFromMatrixPosition($.matrixWorld).applyMatrix4(G);const Dt=he.update($),C=$.material;if(Array.isArray(C)){const Y=Dt.groups;for(let ae=0,Ee=Y.length;ae0&&Fr(Ue,Ie,Ge),qe&&ve.viewport(M.copy(qe)),Ue.length>0&&zr(Ue,Ie,Ge),Pt.length>0&&zr(Pt,Ie,Ge),Dt.length>0&&zr(Dt,Ie,Ge),ve.buffers.depth.setTest(!0),ve.buffers.depth.setMask(!0),ve.buffers.color.setMask(!0),ve.setPolygonOffset(!1)}function Fr($,Ie,Ge){const qe=ye.isWebGL2;ne===null&&(ne=new oi(1,1,{generateMipmaps:!0,type:oe.has("EXT_color_buffer_half_float")?No:Np,minFilter:b0,samples:qe&&s===!0?4:0})),m.getDrawingBufferSize(B),qe?ne.setSize(B.x,B.y):ne.setSize(oP(B.x),oP(B.y));const Ue=m.getRenderTarget();m.setRenderTarget(ne),m.clear();const Pt=m.toneMapping;m.toneMapping=Wc,zr($,Ie,Ge),m.toneMapping=Pt,D.updateMultisampleRenderTarget(ne),D.updateRenderTargetMipmap(ne),m.setRenderTarget(Ue)}function zr($,Ie,Ge){const qe=Ie.isScene===!0?Ie.overrideMaterial:null;for(let Ue=0,Pt=$.length;Ue0&&D.useMultisampledRTT($)===!1?Ue=le.get($).__webglMultisampledFramebuffer:Ue=ae,M.copy($.viewport),E.copy($.scissor),S=$.scissorTest}else M.copy(N).multiplyScalar(V).floor(),E.copy(q).multiplyScalar(V).floor(),S=L;if(ve.bindFramebuffer(36160,Ue)&&ye.drawBuffers&&qe&&ve.drawBuffers($,Ue),ve.viewport(M),ve.scissor(E),ve.setScissorTest(S),Pt){const Y=le.get($.texture);te.framebufferTexture2D(36160,36064,34069+Ie,Y.__webglTexture,Ge)}else if(Dt){const Y=le.get($.texture),ae=Ie||0;te.framebufferTextureLayer(36160,36064,Y.__webglTexture,Ge||0,ae)}x=-1},this.readRenderTargetPixels=function($,Ie,Ge,qe,Ue,Pt,Dt){if(!($&&$.isWebGLRenderTarget)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");return}let C=le.get($).__webglFramebuffer;if($.isWebGLCubeRenderTarget&&Dt!==void 0&&(C=C[Dt]),C){ve.bindFramebuffer(36160,C);try{const Y=$.texture,ae=Y.format,Ee=Y.type;if(ae!==no&&J.convert(ae)!==te.getParameter(35739)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");return}const Le=Ee===No&&(oe.has("EXT_color_buffer_half_float")||ye.isWebGL2&&oe.has("EXT_color_buffer_float"));if(Ee!==Np&&J.convert(Ee)!==te.getParameter(35738)&&!(Ee===na&&(ye.isWebGL2||oe.has("OES_texture_float")||oe.has("WEBGL_color_buffer_float")))&&!Le){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");return}Ie>=0&&Ie<=$.width-qe&&Ge>=0&&Ge<=$.height-Ue&&te.readPixels(Ie,Ge,qe,Ue,J.convert(ae),J.convert(Ee),Pt)}finally{const Y=y!==null?le.get(y).__webglFramebuffer:null;ve.bindFramebuffer(36160,Y)}}},this.copyFramebufferToTexture=function($,Ie,Ge=0){if(Ie.isFramebufferTexture!==!0){console.error("THREE.WebGLRenderer: copyFramebufferToTexture() can only be used with FramebufferTexture.");return}const qe=Math.pow(2,-Ge),Ue=Math.floor(Ie.image.width*qe),Pt=Math.floor(Ie.image.height*qe);D.setTexture2D(Ie,0),te.copyTexSubImage2D(3553,Ge,0,0,$.x,$.y,Ue,Pt),ve.unbindTexture()},this.copyTextureToTexture=function($,Ie,Ge,qe=0){const Ue=Ie.image.width,Pt=Ie.image.height,Dt=J.convert(Ge.format),C=J.convert(Ge.type);D.setTexture2D(Ge,0),te.pixelStorei(37440,Ge.flipY),te.pixelStorei(37441,Ge.premultiplyAlpha),te.pixelStorei(3317,Ge.unpackAlignment),Ie.isDataTexture?te.texSubImage2D(3553,qe,$.x,$.y,Ue,Pt,Dt,C,Ie.image.data):Ie.isCompressedTexture?te.compressedTexSubImage2D(3553,qe,$.x,$.y,Ie.mipmaps[0].width,Ie.mipmaps[0].height,Dt,Ie.mipmaps[0].data):te.texSubImage2D(3553,qe,$.x,$.y,Dt,C,Ie.image),qe===0&&Ge.generateMipmaps&&te.generateMipmap(3553),ve.unbindTexture()},this.copyTextureToTexture3D=function($,Ie,Ge,qe,Ue=0){if(m.isWebGL1Renderer){console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");return}const Pt=$.max.x-$.min.x+1,Dt=$.max.y-$.min.y+1,C=$.max.z-$.min.z+1,Y=J.convert(qe.format),ae=J.convert(qe.type);let Ee;if(qe.isData3DTexture)D.setTexture3D(qe,0),Ee=32879;else if(qe.isDataArrayTexture)D.setTexture2DArray(qe,0),Ee=35866;else{console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");return}te.pixelStorei(37440,qe.flipY),te.pixelStorei(37441,qe.premultiplyAlpha),te.pixelStorei(3317,qe.unpackAlignment);const Le=te.getParameter(3314),De=te.getParameter(32878),it=te.getParameter(3316),ot=te.getParameter(3315),ct=te.getParameter(32877),$e=Ge.isCompressedTexture?Ge.mipmaps[0]:Ge.image;te.pixelStorei(3314,$e.width),te.pixelStorei(32878,$e.height),te.pixelStorei(3316,$.min.x),te.pixelStorei(3315,$.min.y),te.pixelStorei(32877,$.min.z),Ge.isDataTexture||Ge.isData3DTexture?te.texSubImage3D(Ee,Ue,Ie.x,Ie.y,Ie.z,Pt,Dt,C,Y,ae,$e.data):Ge.isCompressedTexture?(console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture."),te.compressedTexSubImage3D(Ee,Ue,Ie.x,Ie.y,Ie.z,Pt,Dt,C,Y,$e.data)):te.texSubImage3D(Ee,Ue,Ie.x,Ie.y,Ie.z,Pt,Dt,C,Y,ae,$e),te.pixelStorei(3314,Le),te.pixelStorei(32878,De),te.pixelStorei(3316,it),te.pixelStorei(3315,ot),te.pixelStorei(32877,ct),Ue===0&&qe.generateMipmaps&&te.generateMipmap(Ee),ve.unbindTexture()},this.initTexture=function($){D.setTexture2D($,0),ve.unbindTexture()},this.resetState=function(){g=0,b=0,y=null,ve.reset(),ue.reset()},typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}xr.prototype.isWebGLRenderer=!0;class Kce extends xr{}Kce.prototype.isWebGL1Renderer=!0;class MT{constructor(e,n=25e-5){this.name="",this.color=new tt(e),this.density=n}clone(){return new MT(this.color,this.density)}toJSON(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}MT.prototype.isFogExp2=!0;class PT{constructor(e,n=1,r=1e3){this.name="",this.color=new tt(e),this.near=n,this.far=r}clone(){return new PT(this.color,this.near,this.far)}toJSON(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}PT.prototype.isFog=!0;class RT extends cn{constructor(){super(),this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.overrideMaterial=null,this.autoUpdate=!0,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(e,n){return super.copy(e,n),e.background!==null&&(this.background=e.background.clone()),e.environment!==null&&(this.environment=e.environment.clone()),e.fog!==null&&(this.fog=e.fog.clone()),e.overrideMaterial!==null&&(this.overrideMaterial=e.overrideMaterial.clone()),this.autoUpdate=e.autoUpdate,this.matrixAutoUpdate=e.matrixAutoUpdate,this}toJSON(e){const n=super.toJSON(e);return this.fog!==null&&(n.object.fog=this.fog.toJSON()),n}}RT.prototype.isScene=!0;class S0{constructor(e,n){this.array=e,this.stride=n,this.count=e!==void 0?e.length/n:0,this.usage=mb,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=hl()}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}copy(e){return this.array=new e.array.constructor(e.array),this.count=e.count,this.stride=e.stride,this.usage=e.usage,this}copyAt(e,n,r){e*=this.stride,r*=n.stride;for(let i=0,s=this.stride;ie.far||n.push({distance:l,point:PS.clone(),uv:Wr.getUV(PS,X2,VS,C2,jZ,Zk,ZZ,new Oe),face:null,object:this})}copy(e){return super.copy(e),e.center!==void 0&&this.center.copy(e.center),this.material=e.material,this}}FV.prototype.isSprite=!0;function K2(t,e,n,r,i,s){bg.subVectors(t,n).addScalar(.5).multiply(r),i!==void 0?(RS.x=s*bg.x-i*bg.y,RS.y=i*bg.x+s*bg.y):RS.copy(bg),t.copy(e),t.x+=RS.x,t.y+=RS.y,t.applyMatrix4(qce)}const q2=new U,JZ=new U;class Dce extends cn{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(e){super.copy(e,!1);const n=e.levels;for(let r=0,i=n.length;r0){let r,i;for(r=1,i=n.length;r0){q2.setFromMatrixPosition(this.matrixWorld);const i=e.ray.origin.distanceTo(q2);this.getObjectForDistance(i).raycast(e,n)}}update(e){const n=this.levels;if(n.length>1){q2.setFromMatrixPosition(e.matrixWorld),JZ.setFromMatrixPosition(this.matrixWorld);const r=q2.distanceTo(JZ)/e.zoom;n[0].object.visible=!0;let i,s;for(i=1,s=n.length;i=n[i].distance;i++)n[i-1].object.visible=!1,n[i].object.visible=!0;for(this._currentLevel=i-1;il)continue;f.applyMatrix4(this.matrixWorld);const S=e.ray.origin.distanceTo(f);Se.far||n.push({distance:S,point:d.clone().applyMatrix4(this.matrixWorld),index:y,face:null,faceIndex:null,object:this})}}else{const g=Math.max(0,a.start),b=Math.min(v.count,a.start+a.count);for(let y=g,x=b-1;yl)continue;f.applyMatrix4(this.matrixWorld);const M=e.ray.origin.distanceTo(f);Me.far||n.push({distance:M,point:d.clone().applyMatrix4(this.matrixWorld),index:y,face:null,faceIndex:null,object:this})}}}else r.isGeometry&&console.error("THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}updateMorphTargets(){const e=this.geometry;if(e.isBufferGeometry){const n=e.morphAttributes,r=Object.keys(n);if(r.length>0){const i=n[r[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let s=0,a=i.length;s0&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}$s.prototype.isLine=!0;const iJ=new U,sJ=new U;class Do extends $s{constructor(e,n){super(e,n),this.type="LineSegments"}computeLineDistances(){const e=this.geometry;if(e.isBufferGeometry)if(e.index===null){const n=e.attributes.position,r=[];for(let i=0,s=n.count;i0){const i=n[r[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let s=0,a=i.length;s0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}gy.prototype.isPoints=!0;function oJ(t,e,n,r,i,s,a){const o=YL.distanceSqToPoint(t);if(oi.far)return;s.push({distance:u,distanceToRay:Math.sqrt(o),point:l,index:e,face:null,object:a})}}class Wce extends Di{constructor(e,n,r,i,s,a,o,l,u){super(e,n,r,i,s,a,o,l,u),this.minFilter=a!==void 0?a:Hn,this.magFilter=s!==void 0?s:Hn,this.generateMipmaps=!1;const c=this;function d(){c.needsUpdate=!0,e.requestVideoFrameCallback(d)}"requestVideoFrameCallback"in e&&e.requestVideoFrameCallback(d)}clone(){return new this.constructor(this.image).copy(this)}update(){const e=this.image;"requestVideoFrameCallback"in e===!1&&e.readyState>=e.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}Wce.prototype.isVideoTexture=!0;class Ace extends Di{constructor(e,n,r){super({width:e,height:n}),this.format=r,this.magFilter=Ir,this.minFilter=Ir,this.generateMipmaps=!1,this.needsUpdate=!0}}Ace.prototype.isFramebufferTexture=!0;class RK extends Di{constructor(e,n,r,i,s,a,o,l,u,c,d,f){super(null,a,o,l,u,c,i,s,d,f),this.image={width:n,height:r},this.mipmaps=e,this.flipY=!1,this.generateMipmaps=!1}}RK.prototype.isCompressedTexture=!0;class Gce extends Di{constructor(e,n,r,i,s,a,o,l,u){super(e,n,r,i,s,a,o,l,u),this.needsUpdate=!0}}Gce.prototype.isCanvasTexture=!0;class Sl{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(e,n){const r=this.getUtoTmapping(e);return this.getPoint(r,n)}getPoints(e=5){const n=[];for(let r=0;r<=e;r++)n.push(this.getPoint(r/e));return n}getSpacedPoints(e=5){const n=[];for(let r=0;r<=e;r++)n.push(this.getPointAt(r/e));return n}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const n=[];let r,i=this.getPoint(0),s=0;n.push(0);for(let a=1;a<=e;a++)r=this.getPoint(a/e),s+=r.distanceTo(i),n.push(s),i=r;return this.cacheArcLengths=n,n}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(e,n){const r=this.getLengths();let i=0;const s=r.length;let a;n?a=n:a=e*r[s-1];let o=0,l=s-1,u;for(;o<=l;)if(i=Math.floor(o+(l-o)/2),u=r[i]-a,u<0)o=i+1;else if(u>0)l=i-1;else{l=i;break}if(i=l,r[i]===a)return i/(s-1);const c=r[i],f=r[i+1]-c,h=(a-c)/f;return(i+h)/(s-1)}getTangent(e,n){let i=e-1e-4,s=e+1e-4;i<0&&(i=0),s>1&&(s=1);const a=this.getPoint(i),o=this.getPoint(s),l=n||(a.isVector2?new Oe:new U);return l.copy(o).sub(a).normalize(),l}getTangentAt(e,n){const r=this.getUtoTmapping(e);return this.getTangent(r,n)}computeFrenetFrames(e,n){const r=new U,i=[],s=[],a=[],o=new U,l=new Be;for(let h=0;h<=e;h++){const p=h/e;i[h]=this.getTangentAt(p,new U)}s[0]=new U,a[0]=new U;let u=Number.MAX_VALUE;const c=Math.abs(i[0].x),d=Math.abs(i[0].y),f=Math.abs(i[0].z);c<=u&&(u=c,r.set(1,0,0)),d<=u&&(u=d,r.set(0,1,0)),f<=u&&r.set(0,0,1),o.crossVectors(i[0],r).normalize(),s[0].crossVectors(i[0],o),a[0].crossVectors(i[0],s[0]);for(let h=1;h<=e;h++){if(s[h]=s[h-1].clone(),a[h]=a[h-1].clone(),o.crossVectors(i[h-1],i[h]),o.length()>Number.EPSILON){o.normalize();const p=Math.acos(Fi(i[h-1].dot(i[h]),-1,1));s[h].applyMatrix4(l.makeRotationAxis(o,p))}a[h].crossVectors(i[h],s[h])}if(n===!0){let h=Math.acos(Fi(s[0].dot(s[e]),-1,1));h/=e,i[0].dot(o.crossVectors(s[0],s[e]))>0&&(h=-h);for(let p=1;p<=e;p++)s[p].applyMatrix4(l.makeRotationAxis(i[p],h*p)),a[p].crossVectors(i[p],s[p])}return{tangents:i,normals:s,binormals:a}}clone(){return new this.constructor().copy(this)}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}toJSON(){const e={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return e.arcLengthDivisions=this.arcLengthDivisions,e.type=this.type,e}fromJSON(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}class by extends Sl{constructor(e=0,n=0,r=1,i=1,s=0,a=Math.PI*2,o=!1,l=0){super(),this.type="EllipseCurve",this.aX=e,this.aY=n,this.xRadius=r,this.yRadius=i,this.aStartAngle=s,this.aEndAngle=a,this.aClockwise=o,this.aRotation=l}getPoint(e,n){const r=n||new Oe,i=Math.PI*2;let s=this.aEndAngle-this.aStartAngle;const a=Math.abs(s)i;)s-=i;s0?0:(Math.floor(Math.abs(o)/s)+1)*s:l===0&&o===s-1&&(o=s-2,l=1);let u,c;this.closed||o>0?u=i[(o-1)%s]:(F2.subVectors(i[0],i[1]).add(i[0]),u=F2);const d=i[o%s],f=i[(o+1)%s];if(this.closed||o+2i.length-2?i.length-1:a+1],d=i[a>i.length-3?i.length-1:a+2];return r.set(lJ(o,l.x,u.x,c.x,d.x),lJ(o,l.y,u.y,c.y,d.y)),r}copy(e){super.copy(e),this.points=[];for(let n=0,r=e.points.length;n=r){const a=i[s]-r,o=this.curves[s],l=o.getLength(),u=l===0?0:1-a/l;return o.getPointAt(u,n)}s++}return null}getLength(){const e=this.getCurveLengths();return e[e.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const e=[];let n=0;for(let r=0,i=this.curves.length;r1&&!n[n.length-1].equals(n[0])&&n.push(n[0]),n}copy(e){super.copy(e),this.curves=[];for(let n=0,r=e.curves.length;n0){const d=u.getPoint(0);d.equals(this.currentPoint)||this.lineTo(d.x,d.y)}this.curves.push(u);const c=u.getPoint(1);return this.currentPoint.copy(c),this}copy(e){return super.copy(e),this.currentPoint.copy(e.currentPoint),this}toJSON(){const e=super.toJSON();return e.currentPoint=this.currentPoint.toArray(),e}fromJSON(e){return super.fromJSON(e),this.currentPoint.fromArray(e.currentPoint),this}};class Fv extends Lt{constructor(e=[new Oe(0,.5),new Oe(.5,0),new Oe(0,-.5)],n=12,r=0,i=Math.PI*2){super(),this.type="LatheGeometry",this.parameters={points:e,segments:n,phiStart:r,phiLength:i},n=Math.floor(n),i=Fi(i,0,Math.PI*2);const s=[],a=[],o=[],l=[],u=[],c=1/n,d=new U,f=new Oe,h=new U,p=new U,m=new U;let v=0,g=0;for(let b=0;b<=e.length-1;b++)switch(b){case 0:v=e[b+1].x-e[b].x,g=e[b+1].y-e[b].y,h.x=g*1,h.y=-v,h.z=g*0,m.copy(h),h.normalize(),l.push(h.x,h.y,h.z);break;case e.length-1:l.push(m.x,m.y,m.z);break;default:v=e[b+1].x-e[b].x,g=e[b+1].y-e[b].y,h.x=g*1,h.y=-v,h.z=g*0,p.copy(h),h.x+=m.x,h.y+=m.y,h.z+=m.z,h.normalize(),l.push(h.x,h.y,h.z),m.copy(p)}for(let b=0;b<=n;b++){const y=r+b*c*i,x=Math.sin(y),T=Math.cos(y);for(let M=0;M<=e.length-1;M++){d.x=e[M].x*x,d.y=e[M].y,d.z=e[M].x*T,a.push(d.x,d.y,d.z),f.x=b/n,f.y=M/(e.length-1),o.push(f.x,f.y);const E=l[3*M+0]*x,S=l[3*M+1],P=l[3*M+0]*T;u.push(E,S,P)}}for(let b=0;b0&&y(!0),n>0&&y(!1)),this.setIndex(c),this.setAttribute("position",new xt(d,3)),this.setAttribute("normal",new xt(f,3)),this.setAttribute("uv",new xt(h,2));function b(){const x=new U,T=new U;let M=0;const E=(n-e)/r;for(let S=0;S<=s;S++){const P=[],R=S/s,V=R*(n-e)+e;for(let z=0;z<=i;z++){const k=z/i,N=k*l+o,q=Math.sin(N),L=Math.cos(N);T.x=V*q,T.y=-R*r+v,T.z=V*L,d.push(T.x,T.y,T.z),x.set(q,E,L).normalize(),f.push(x.x,x.y,x.z),h.push(k,1-R),P.push(p++)}m.push(P)}for(let S=0;S.9&&E<.1&&(y<.2&&(a[b+0]+=1),x<.2&&(a[b+2]+=1),T<.2&&(a[b+4]+=1))}}function f(b){s.push(b.x,b.y,b.z)}function h(b,y){const x=b*3;y.x=e[x+0],y.y=e[x+1],y.z=e[x+2]}function p(){const b=new U,y=new U,x=new U,T=new U,M=new Oe,E=new Oe,S=new Oe;for(let P=0,R=0;P80*n){o=u=t[0],l=c=t[1];for(let p=n;pu&&(u=d),f>c&&(c=f);h=Math.max(u-o,c-l),h=h!==0?1/h:0}return p6(s,a,n,o,l,h),a}};function Zce(t,e,n,r,i){let s,a;if(i===ECe(t,e,n,r)>0)for(s=e;s=e;s-=r)a=uJ(s,t[s],t[s+1],a);return a&&_V(a,a.next)&&(v6(a),a=a.next),a}function Cp(t,e){if(!t)return t;e||(e=t);let n=t,r;do if(r=!1,!n.steiner&&(_V(n,n.next)||Ei(n.prev,n,n.next)===0)){if(v6(n),n=e=n.prev,n===n.next)break;r=!0}else n=n.next;while(r||n!==e);return e}function p6(t,e,n,r,i,s,a){if(!t)return;!a&&s&&bCe(t,r,i,s);let o=t,l,u;for(;t.prev!==t.next;){if(l=t.prev,u=t.next,s?cCe(t,r,i,s):uCe(t)){e.push(l.i/n),e.push(t.i/n),e.push(u.i/n),v6(t),t=u.next,o=u.next;continue}if(t=u,t===o){a?a===1?(t=dCe(Cp(t),e,n),p6(t,e,n,r,i,s,2)):a===2&&fCe(t,e,n,r,i,s):p6(Cp(t),e,n,r,i,s,1);break}}}function uCe(t){const e=t.prev,n=t,r=t.next;if(Ei(e,n,r)>=0)return!1;let i=t.next.next;for(;i!==t.prev;){if(f1(e.x,e.y,n.x,n.y,r.x,r.y,i.x,i.y)&&Ei(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function cCe(t,e,n,r){const i=t.prev,s=t,a=t.next;if(Ei(i,s,a)>=0)return!1;const o=i.xs.x?i.x>a.x?i.x:a.x:s.x>a.x?s.x:a.x,c=i.y>s.y?i.y>a.y?i.y:a.y:s.y>a.y?s.y:a.y,d=BL(o,l,e,n,r),f=BL(u,c,e,n,r);let h=t.prevZ,p=t.nextZ;for(;h&&h.z>=d&&p&&p.z<=f;){if(h!==t.prev&&h!==t.next&&f1(i.x,i.y,s.x,s.y,a.x,a.y,h.x,h.y)&&Ei(h.prev,h,h.next)>=0||(h=h.prevZ,p!==t.prev&&p!==t.next&&f1(i.x,i.y,s.x,s.y,a.x,a.y,p.x,p.y)&&Ei(p.prev,p,p.next)>=0))return!1;p=p.nextZ}for(;h&&h.z>=d;){if(h!==t.prev&&h!==t.next&&f1(i.x,i.y,s.x,s.y,a.x,a.y,h.x,h.y)&&Ei(h.prev,h,h.next)>=0)return!1;h=h.prevZ}for(;p&&p.z<=f;){if(p!==t.prev&&p!==t.next&&f1(i.x,i.y,s.x,s.y,a.x,a.y,p.x,p.y)&&Ei(p.prev,p,p.next)>=0)return!1;p=p.nextZ}return!0}function dCe(t,e,n){let r=t;do{const i=r.prev,s=r.next.next;!_V(i,s)&&Jce(i,r,r.next,s)&&m6(i,s)&&m6(s,i)&&(e.push(i.i/n),e.push(r.i/n),e.push(s.i/n),v6(r),v6(r.next),r=t=s),r=r.next}while(r!==t);return Cp(r)}function fCe(t,e,n,r,i,s){let a=t;do{let o=a.next.next;for(;o!==a.prev;){if(a.i!==o.i&&xCe(a,o)){let l=Yce(a,o);a=Cp(a,a.next),l=Cp(l,l.next),p6(a,e,n,r,i,s),p6(l,e,n,r,i,s);return}o=o.next}a=a.next}while(a!==t)}function hCe(t,e,n,r){const i=[];let s,a,o,l,u;for(s=0,a=e.length;s=n.next.y&&n.next.y!==n.y){const f=n.x+(i-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(f<=r&&f>s){if(s=f,f===r){if(i===n.y)return n;if(i===n.next.y)return n.next}a=n.x=n.x&&n.x>=l&&r!==n.x&&f1(ia.x||n.x===a.x&&gCe(a,n)))&&(a=n,c=d)),n=n.next;while(n!==o);return a}function gCe(t,e){return Ei(t.prev,t,e.prev)<0&&Ei(e.next,t,t.next)<0}function bCe(t,e,n,r){let i=t;do i.z===null&&(i.z=BL(i.x,i.y,e,n,r)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,yCe(i)}function yCe(t){let e,n,r,i,s,a,o,l,u=1;do{for(n=t,t=null,s=null,a=0;n;){for(a++,r=n,o=0,e=0;e0||l>0&&r;)o!==0&&(l===0||!r||n.z<=r.z)?(i=n,n=n.nextZ,o--):(i=r,r=r.nextZ,l--),s?s.nextZ=i:t=i,i.prevZ=s,s=i;n=r}s.nextZ=null,u*=2}while(a>1);return t}function BL(t,e,n,r,i){return t=32767*(t-n)*i,e=32767*(e-r)*i,t=(t|t<<8)&16711935,t=(t|t<<4)&252645135,t=(t|t<<2)&858993459,t=(t|t<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,t|e<<1}function SCe(t){let e=t,n=t;do(e.x=0&&(t-a)*(r-o)-(n-a)*(e-o)>=0&&(n-a)*(s-o)-(i-a)*(r-o)>=0}function xCe(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!TCe(t,e)&&(m6(t,e)&&m6(e,t)&&wCe(t,e)&&(Ei(t.prev,t,e.prev)||Ei(t,e.prev,e))||_V(t,e)&&Ei(t.prev,t,t.next)>0&&Ei(e.prev,e,e.next)>0)}function Ei(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function _V(t,e){return t.x===e.x&&t.y===e.y}function Jce(t,e,n,r){const i=B2(Ei(t,e,n)),s=B2(Ei(t,e,r)),a=B2(Ei(n,r,t)),o=B2(Ei(n,r,e));return!!(i!==s&&a!==o||i===0&&Y2(t,n,e)||s===0&&Y2(t,r,e)||a===0&&Y2(n,t,r)||o===0&&Y2(n,e,r))}function Y2(t,e,n){return e.x<=Math.max(t.x,n.x)&&e.x>=Math.min(t.x,n.x)&&e.y<=Math.max(t.y,n.y)&&e.y>=Math.min(t.y,n.y)}function B2(t){return t>0?1:t<0?-1:0}function TCe(t,e){let n=t;do{if(n.i!==t.i&&n.next.i!==t.i&&n.i!==e.i&&n.next.i!==e.i&&Jce(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}function m6(t,e){return Ei(t.prev,t,t.next)<0?Ei(t,e,t.next)>=0&&Ei(t,t.prev,e)>=0:Ei(t,e,t.prev)<0||Ei(t,t.next,e)<0}function wCe(t,e){let n=t,r=!1;const i=(t.x+e.x)/2,s=(t.y+e.y)/2;do n.y>s!=n.next.y>s&&n.next.y!==n.y&&i<(n.next.x-n.x)*(s-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next;while(n!==t);return r}function Yce(t,e){const n=new HL(t.i,t.x,t.y),r=new HL(e.i,e.x,e.y),i=t.next,s=e.prev;return t.next=e,e.prev=t,n.next=i,i.prev=n,r.next=n,n.prev=r,s.next=r,r.prev=s,r}function uJ(t,e,n,r){const i=new HL(t,e,n);return r?(i.next=r.next,i.prev=r,r.next.prev=i,r.next=i):(i.prev=i,i.next=i),i}function v6(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function HL(t,e,n){this.i=t,this.x=e,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function ECe(t,e,n,r){let i=0;for(let s=e,a=n-r;s2&&t[e-1].equals(t[0])&&t.pop()}function dJ(t,e){for(let n=0;nNumber.EPSILON){const ie=Math.sqrt(W),me=Math.sqrt(we*we+se*se),We=D.x-be/ie,Ce=D.y+he/ie,Ae=F.x-se/me,J=F.y+we/me,ue=((Ae-We)*se-(J-Ce)*we)/(he*se-be*we);re=We+he*ue-le.x,de=Ce+be*ue-le.y;const ge=re*re+de*de;if(ge<=2)return new Oe(re,de);Te=Math.sqrt(ge/2)}else{let ie=!1;he>Number.EPSILON?we>Number.EPSILON&&(ie=!0):he<-Number.EPSILON?we<-Number.EPSILON&&(ie=!0):Math.sign(be)===Math.sign(se)&&(ie=!0),ie?(re=-be,de=he,Te=Math.sqrt(W)):(re=he,de=be,Te=Math.sqrt(W/2))}return new Oe(re/Te,de/Te)}const j=[];for(let le=0,D=N.length,F=D-1,re=le+1;le=0;le--){const D=le/v,F=h*Math.cos(D*Math.PI/2),re=p*Math.sin(D*Math.PI/2)+m;for(let de=0,Te=N.length;de=0;){const re=F;let de=F-1;de<0&&(de=le.length-1);for(let Te=0,he=c+v*2;Te0)&&h.push(y,x,M),(g!==r-1||l0!=e>0&&this.version++,this._sheen=e}get clearcoat(){return this._clearcoat}set clearcoat(e){this._clearcoat>0!=e>0&&this.version++,this._clearcoat=e}get transmission(){return this._transmission}set transmission(e){this._transmission>0!=e>0&&this.version++,this._transmission=e}copy(e){return super.copy(e),this.defines={STANDARD:"",PHYSICAL:""},this.clearcoat=e.clearcoat,this.clearcoatMap=e.clearcoatMap,this.clearcoatRoughness=e.clearcoatRoughness,this.clearcoatRoughnessMap=e.clearcoatRoughnessMap,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.ior=e.ior,this.sheen=e.sheen,this.sheenColor.copy(e.sheenColor),this.sheenColorMap=e.sheenColorMap,this.sheenRoughness=e.sheenRoughness,this.sheenRoughnessMap=e.sheenRoughnessMap,this.transmission=e.transmission,this.transmissionMap=e.transmissionMap,this.thickness=e.thickness,this.thicknessMap=e.thicknessMap,this.attenuationDistance=e.attenuationDistance,this.attenuationColor.copy(e.attenuationColor),this.specularIntensity=e.specularIntensity,this.specularIntensityMap=e.specularIntensityMap,this.specularColor.copy(e.specularColor),this.specularColorMap=e.specularColorMap,this}}XK.prototype.isMeshPhysicalMaterial=!0;class CK extends Ji{constructor(e){super(),this.type="MeshPhongMaterial",this.color=new tt(16777215),this.specular=new tt(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new tt(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=y0,this.normalScale=new Oe(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=yT,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}CK.prototype.isMeshPhongMaterial=!0;class KK extends Ji{constructor(e){super(),this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new tt(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new tt(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=y0,this.normalScale=new Oe(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.gradientMap=e.gradientMap,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.alphaMap=e.alphaMap,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}KK.prototype.isMeshToonMaterial=!0;class e9 extends Ji{constructor(e){super(),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=y0,this.normalScale=new Oe(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.flatShading=e.flatShading,this}}e9.prototype.isMeshNormalMaterial=!0;class qK extends Ji{constructor(e){super(),this.type="MeshLambertMaterial",this.color=new tt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new tt(0),this.emissiveIntensity=1,this.emissiveMap=null,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=yT,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}qK.prototype.isMeshLambertMaterial=!0;class DK extends Ji{constructor(e){super(),this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new tt(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=y0,this.normalScale=new Oe(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.defines={MATCAP:""},this.color.copy(e.color),this.matcap=e.matcap,this.map=e.map,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.alphaMap=e.alphaMap,this.flatShading=e.flatShading,this.fog=e.fog,this}}DK.prototype.isMeshMatcapMaterial=!0;class WK extends cs{constructor(e){super(),this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(e)}copy(e){return super.copy(e),this.scale=e.scale,this.dashSize=e.dashSize,this.gapSize=e.gapSize,this}}WK.prototype.isLineDashedMaterial=!0;const VCe={ShadowMaterial:NK,SpriteMaterial:GV,RawShaderMaterial:LK,ShaderMaterial:bi,PointsMaterial:qf,MeshPhysicalMaterial:XK,MeshStandardMaterial:pp,MeshPhongMaterial:CK,MeshToonMaterial:KK,MeshNormalMaterial:e9,MeshLambertMaterial:qK,MeshDepthMaterial:vy,MeshDistanceMaterial:ET,MeshBasicMaterial:ho,MeshMatcapMaterial:DK,LineDashedMaterial:WK,LineBasicMaterial:cs,Material:Ji};Ji.fromType=function(t){return new VCe[t]};const ti={arraySlice:function(t,e,n){return ti.isTypedArray(t)?new t.constructor(t.subarray(e,n!==void 0?n:t.length)):t.slice(e,n)},convertArray:function(t,e,n){return!t||!n&&t.constructor===e?t:typeof e.BYTES_PER_ELEMENT=="number"?new e(t):Array.prototype.slice.call(t)},isTypedArray:function(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)},getKeyframeOrder:function(t){function e(i,s){return t[i]-t[s]}const n=t.length,r=new Array(n);for(let i=0;i!==n;++i)r[i]=i;return r.sort(e),r},sortedArray:function(t,e,n){const r=t.length,i=new t.constructor(r);for(let s=0,a=0;a!==r;++s){const o=n[s]*e;for(let l=0;l!==e;++l)i[a++]=t[o+l]}return i},flattenJSON:function(t,e,n,r){let i=1,s=t[0];for(;s!==void 0&&s[r]===void 0;)s=t[i++];if(s===void 0)return;let a=s[r];if(a!==void 0)if(Array.isArray(a))do a=s[r],a!==void 0&&(e.push(s.time),n.push.apply(n,a)),s=t[i++];while(s!==void 0);else if(a.toArray!==void 0)do a=s[r],a!==void 0&&(e.push(s.time),a.toArray(n,n.length)),s=t[i++];while(s!==void 0);else do a=s[r],a!==void 0&&(e.push(s.time),n.push(a)),s=t[i++];while(s!==void 0)},subclip:function(t,e,n,r,i=30){const s=t.clone();s.name=e;const a=[];for(let l=0;l=r)){d.push(u.times[h]);for(let m=0;ms.tracks[l].times[0]&&(o=s.tracks[l].times[0]);for(let l=0;l=o.times[p]){const g=p*d+c,b=g+d-c;m=ti.arraySlice(o.values,g,b)}else{const g=o.createInterpolant(),b=c,y=d-c;g.evaluate(s),m=ti.arraySlice(g.resultBuffer,b,y)}l==="quaternion"&&new Or().fromArray(m).normalize().conjugate().toArray(m);const v=u.times.length;for(let g=0;g=s)){const o=n[1];e=s)break t}a=r,r=0;break n}break e}for(;r>>1;en;)--a;if(++a,s!==0||a!==i){s>=a&&(a=Math.max(a,1),s=a-1);const o=this.getValueSize();this.times=ti.arraySlice(r,s,a),this.values=ti.arraySlice(this.values,s*o,a*o)}return this}validate(){let e=!0;const n=this.getValueSize();n-Math.floor(n)!==0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),e=!1);const r=this.times,i=this.values,s=r.length;s===0&&(console.error("THREE.KeyframeTrack: Track is empty.",this),e=!1);let a=null;for(let o=0;o!==s;o++){const l=r[o];if(typeof l=="number"&&isNaN(l)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,o,l),e=!1;break}if(a!==null&&a>l){console.error("THREE.KeyframeTrack: Out of order keys.",this,o,l,a),e=!1;break}a=l}if(i!==void 0&&ti.isTypedArray(i))for(let o=0,l=i.length;o!==l;++o){const u=i[o];if(isNaN(u)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,o,u),e=!1;break}}return e}optimize(){const e=ti.arraySlice(this.times),n=ti.arraySlice(this.values),r=this.getValueSize(),i=this.getInterpolation()===E7,s=e.length-1;let a=1;for(let o=1;o0){e[a]=e[s];for(let o=s*r,l=a*r,u=0;u!==r;++u)n[l+u]=n[o+u];++a}return a!==e.length?(this.times=ti.arraySlice(e,0,a),this.values=ti.arraySlice(n,0,a*r)):(this.times=e,this.values=n),this}clone(){const e=ti.arraySlice(this.times,0),n=ti.arraySlice(this.values,0),r=this.constructor,i=new r(this.name,e,n);return i.createInterpolant=this.createInterpolant,i}}Yu.prototype.TimeBufferType=Float32Array;Yu.prototype.ValueBufferType=Float32Array;Yu.prototype.DefaultInterpolation=u6;class x0 extends Yu{}x0.prototype.ValueTypeName="bool";x0.prototype.ValueBufferType=Array;x0.prototype.DefaultInterpolation=l6;x0.prototype.InterpolantFactoryMethodLinear=void 0;x0.prototype.InterpolantFactoryMethodSmooth=void 0;class GK extends Yu{}GK.prototype.ValueTypeName="color";class g6 extends Yu{}g6.prototype.ValueTypeName="number";class Qce extends xf{constructor(e,n,r,i){super(e,n,r,i)}interpolate_(e,n,r,i){const s=this.resultBuffer,a=this.sampleValues,o=this.valueSize,l=(r-n)/(i-n);let u=e*o;for(let c=u+o;u!==c;u+=4)Or.slerpFlat(s,0,a,u-o,a,u,l);return s}}class yy extends Yu{InterpolantFactoryMethodLinear(e){return new Qce(this.times,this.values,this.getValueSize(),e)}}yy.prototype.ValueTypeName="quaternion";yy.prototype.DefaultInterpolation=u6;yy.prototype.InterpolantFactoryMethodSmooth=void 0;class T0 extends Yu{}T0.prototype.ValueTypeName="string";T0.prototype.ValueBufferType=Array;T0.prototype.DefaultInterpolation=l6;T0.prototype.InterpolantFactoryMethodLinear=void 0;T0.prototype.InterpolantFactoryMethodSmooth=void 0;class b6 extends Yu{}b6.prototype.ValueTypeName="vector";class y6{constructor(e,n=-1,r,i=KV){this.name=e,this.tracks=r,this.duration=n,this.blendMode=i,this.uuid=hl(),this.duration<0&&this.resetDuration()}static parse(e){const n=[],r=e.tracks,i=1/(e.fps||1);for(let a=0,o=r.length;a!==o;++a)n.push(kCe(r[a]).scale(i));const s=new this(e.name,e.duration,n,e.blendMode);return s.uuid=e.uuid,s}static toJSON(e){const n=[],r=e.tracks,i={name:e.name,duration:e.duration,tracks:n,uuid:e.uuid,blendMode:e.blendMode};for(let s=0,a=r.length;s!==a;++s)n.push(Yu.toJSON(r[s]));return i}static CreateFromMorphTargetSequence(e,n,r,i){const s=n.length,a=[];for(let o=0;o1){const d=c[1];let f=i[d];f||(i[d]=f=[]),f.push(u)}}const a=[];for(const o in i)a.push(this.CreateFromMorphTargetSequence(o,i[o],n,r));return a}static parseAnimation(e,n){if(!e)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const r=function(d,f,h,p,m){if(h.length!==0){const v=[],g=[];ti.flattenJSON(h,v,g,p),v.length!==0&&m.push(new d(f,v,g))}},i=[],s=e.name||"default",a=e.fps||30,o=e.blendMode;let l=e.length||-1;const u=e.hierarchy||[];for(let d=0;d{n&&n(s),this.manager.itemEnd(e)},0),s;if(Md[e]!==void 0){Md[e].push({onLoad:n,onProgress:r,onError:i});return}Md[e]=[],Md[e].push({onLoad:n,onProgress:r,onError:i});const a=new Request(e,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"}),o=this.mimeType,l=this.responseType;fetch(a).then(u=>{if(u.status===200||u.status===0){if(u.status===0&&console.warn("THREE.FileLoader: HTTP Status 0 received."),typeof ReadableStream>"u"||u.body===void 0||u.body.getReader===void 0)return u;const c=Md[e],d=u.body.getReader(),f=u.headers.get("Content-Length"),h=f?parseInt(f):0,p=h!==0;let m=0;const v=new ReadableStream({start(g){b();function b(){d.read().then(({done:y,value:x})=>{if(y)g.close();else{m+=x.byteLength;const T=new ProgressEvent("progress",{lengthComputable:p,loaded:m,total:h});for(let M=0,E=c.length;M{switch(l){case"arraybuffer":return u.arrayBuffer();case"blob":return u.blob();case"document":return u.text().then(c=>new DOMParser().parseFromString(c,o));case"json":return u.json();default:if(o===void 0)return u.text();{const d=/charset="?([^;"\s]*)"?/i.exec(o),f=d&&d[1]?d[1].toLowerCase():void 0,h=new TextDecoder(f);return u.arrayBuffer().then(p=>h.decode(p))}}}).then(u=>{Zv.add(e,u);const c=Md[e];delete Md[e];for(let d=0,f=c.length;d{const c=Md[e];if(c===void 0)throw this.manager.itemError(e),u;delete Md[e];for(let d=0,f=c.length;d{this.manager.itemEnd(e)}),this.manager.itemStart(e)}setResponseType(e){return this.responseType=e,this}setMimeType(e){return this.mimeType=e,this}}class OCe extends Xa{constructor(e){super(e)}load(e,n,r,i){const s=this,a=new Du(this.manager);a.setPath(this.path),a.setRequestHeader(this.requestHeader),a.setWithCredentials(this.withCredentials),a.load(e,function(o){try{n(s.parse(JSON.parse(o)))}catch(l){i?i(l):console.error(l),s.manager.itemError(e)}},r,i)}parse(e){const n=[];for(let r=0;r0:i.vertexColors=e.vertexColors),e.uniforms!==void 0)for(const s in e.uniforms){const a=e.uniforms[s];switch(i.uniforms[s]={},a.type){case"t":i.uniforms[s].value=r(a.value);break;case"c":i.uniforms[s].value=new tt().setHex(a.value);break;case"v2":i.uniforms[s].value=new Oe().fromArray(a.value);break;case"v3":i.uniforms[s].value=new U().fromArray(a.value);break;case"v4":i.uniforms[s].value=new Qt().fromArray(a.value);break;case"m3":i.uniforms[s].value=new as().fromArray(a.value);break;case"m4":i.uniforms[s].value=new Be().fromArray(a.value);break;default:i.uniforms[s].value=a.value}}if(e.defines!==void 0&&(i.defines=e.defines),e.vertexShader!==void 0&&(i.vertexShader=e.vertexShader),e.fragmentShader!==void 0&&(i.fragmentShader=e.fragmentShader),e.extensions!==void 0)for(const s in e.extensions)i.extensions[s]=e.extensions[s];if(e.shading!==void 0&&(i.flatShading=e.shading===1),e.size!==void 0&&(i.size=e.size),e.sizeAttenuation!==void 0&&(i.sizeAttenuation=e.sizeAttenuation),e.map!==void 0&&(i.map=r(e.map)),e.matcap!==void 0&&(i.matcap=r(e.matcap)),e.alphaMap!==void 0&&(i.alphaMap=r(e.alphaMap)),e.bumpMap!==void 0&&(i.bumpMap=r(e.bumpMap)),e.bumpScale!==void 0&&(i.bumpScale=e.bumpScale),e.normalMap!==void 0&&(i.normalMap=r(e.normalMap)),e.normalMapType!==void 0&&(i.normalMapType=e.normalMapType),e.normalScale!==void 0){let s=e.normalScale;Array.isArray(s)===!1&&(s=[s,s]),i.normalScale=new Oe().fromArray(s)}return e.displacementMap!==void 0&&(i.displacementMap=r(e.displacementMap)),e.displacementScale!==void 0&&(i.displacementScale=e.displacementScale),e.displacementBias!==void 0&&(i.displacementBias=e.displacementBias),e.roughnessMap!==void 0&&(i.roughnessMap=r(e.roughnessMap)),e.metalnessMap!==void 0&&(i.metalnessMap=r(e.metalnessMap)),e.emissiveMap!==void 0&&(i.emissiveMap=r(e.emissiveMap)),e.emissiveIntensity!==void 0&&(i.emissiveIntensity=e.emissiveIntensity),e.specularMap!==void 0&&(i.specularMap=r(e.specularMap)),e.specularIntensityMap!==void 0&&(i.specularIntensityMap=r(e.specularIntensityMap)),e.specularColorMap!==void 0&&(i.specularColorMap=r(e.specularColorMap)),e.envMap!==void 0&&(i.envMap=r(e.envMap)),e.envMapIntensity!==void 0&&(i.envMapIntensity=e.envMapIntensity),e.reflectivity!==void 0&&(i.reflectivity=e.reflectivity),e.refractionRatio!==void 0&&(i.refractionRatio=e.refractionRatio),e.lightMap!==void 0&&(i.lightMap=r(e.lightMap)),e.lightMapIntensity!==void 0&&(i.lightMapIntensity=e.lightMapIntensity),e.aoMap!==void 0&&(i.aoMap=r(e.aoMap)),e.aoMapIntensity!==void 0&&(i.aoMapIntensity=e.aoMapIntensity),e.gradientMap!==void 0&&(i.gradientMap=r(e.gradientMap)),e.clearcoatMap!==void 0&&(i.clearcoatMap=r(e.clearcoatMap)),e.clearcoatRoughnessMap!==void 0&&(i.clearcoatRoughnessMap=r(e.clearcoatRoughnessMap)),e.clearcoatNormalMap!==void 0&&(i.clearcoatNormalMap=r(e.clearcoatNormalMap)),e.clearcoatNormalScale!==void 0&&(i.clearcoatNormalScale=new Oe().fromArray(e.clearcoatNormalScale)),e.transmissionMap!==void 0&&(i.transmissionMap=r(e.transmissionMap)),e.thicknessMap!==void 0&&(i.thicknessMap=r(e.thicknessMap)),e.sheenColorMap!==void 0&&(i.sheenColorMap=r(e.sheenColorMap)),e.sheenRoughnessMap!==void 0&&(i.sheenRoughnessMap=r(e.sheenRoughnessMap)),i}setTextures(e){return this.textures=e,this}}class uP{static decodeText(e){if(typeof TextDecoder<"u")return new TextDecoder().decode(e);let n="";for(let r=0,i=e.length;r0){const l=new FK(n);s=new S6(l),s.setCrossOrigin(this.crossOrigin);for(let u=0,c=e.length;u0){i=new S6(this.manager),i.setCrossOrigin(this.crossOrigin);for(let a=0,o=e.length;a"u"&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."),typeof fetch>"u"&&console.warn("THREE.ImageBitmapLoader: fetch() not supported."),this.options={premultiplyAlpha:"none"}}setOptions(e){return this.options=e,this}load(e,n,r,i){e===void 0&&(e=""),this.path!==void 0&&(e=this.path+e),e=this.manager.resolveURL(e);const s=this,a=Zv.get(e);if(a!==void 0)return s.manager.itemStart(e),setTimeout(function(){n&&n(a),s.manager.itemEnd(e)},0),a;const o={};o.credentials=this.crossOrigin==="anonymous"?"same-origin":"include",o.headers=this.requestHeader,fetch(e,o).then(function(l){return l.blob()}).then(function(l){return createImageBitmap(l,Object.assign(s.options,{colorSpaceConversion:"none"}))}).then(function(l){Zv.add(e,l),n&&n(l),s.manager.itemEnd(e)}).catch(function(l){i&&i(l),s.manager.itemError(e),s.manager.itemEnd(e)}),s.manager.itemStart(e)}}sde.prototype.isImageBitmapLoader=!0;let H2;const $K={getContext:function(){return H2===void 0&&(H2=new(window.AudioContext||window.webkitAudioContext)),H2},setContext:function(t){H2=t}};class ade extends Xa{constructor(e){super(e)}load(e,n,r,i){const s=this,a=new Du(this.manager);a.setResponseType("arraybuffer"),a.setPath(this.path),a.setRequestHeader(this.requestHeader),a.setWithCredentials(this.withCredentials),a.load(e,function(o){try{const l=o.slice(0);$K.getContext().decodeAudioData(l,function(c){n(c)})}catch(l){i?i(l):console.error(l),s.manager.itemError(e)}},r,i)}}class ode extends zT{constructor(e,n,r=1){super(void 0,r);const i=new tt().set(e),s=new tt().set(n),a=new U(i.r,i.g,i.b),o=new U(s.r,s.g,s.b),l=Math.sqrt(Math.PI),u=l*Math.sqrt(.75);this.sh.coefficients[0].copy(a).add(o).multiplyScalar(l),this.sh.coefficients[1].copy(a).sub(o).multiplyScalar(u)}}ode.prototype.isHemisphereLightProbe=!0;class lde extends zT{constructor(e,n=1){super(void 0,n);const r=new tt().set(e);this.sh.coefficients[0].set(r.r,r.g,r.b).multiplyScalar(2*Math.sqrt(Math.PI))}}lde.prototype.isAmbientLightProbe=!0;const SJ=new Be,xJ=new Be,zm=new Be;class LCe{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new ns,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new ns,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(e){const n=this._cache;if(n.focus!==e.focus||n.fov!==e.fov||n.aspect!==e.aspect*this.aspect||n.near!==e.near||n.far!==e.far||n.zoom!==e.zoom||n.eyeSep!==this.eyeSep){n.focus=e.focus,n.fov=e.fov,n.aspect=e.aspect*this.aspect,n.near=e.near,n.far=e.far,n.zoom=e.zoom,n.eyeSep=this.eyeSep,zm.copy(e.projectionMatrix);const i=n.eyeSep/2,s=i*n.near/n.focus,a=n.near*Math.tan(Rv*n.fov*.5)/n.zoom;let o,l;xJ.elements[12]=-i,SJ.elements[12]=i,o=-a*n.aspect+s,l=a*n.aspect+s,zm.elements[0]=2*n.near/(l-o),zm.elements[8]=(l+o)/(l-o),this.cameraL.projectionMatrix.copy(zm),o=-a*n.aspect-s,l=a*n.aspect-s,zm.elements[0]=2*n.near/(l-o),zm.elements[8]=(l+o)/(l-o),this.cameraR.projectionMatrix.copy(zm)}this.cameraL.matrixWorld.copy(e.matrixWorld).multiply(xJ),this.cameraR.matrixWorld.copy(e.matrixWorld).multiply(SJ)}}class r9{constructor(e=!0){this.autoStart=e,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=TJ(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let e=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const n=TJ();e=(n-this.oldTime)/1e3,this.oldTime=n,this.elapsedTime+=e}return e}}function TJ(){return(typeof performance>"u"?Date:performance).now()}const km=new U,wJ=new Or,XCe=new U,Om=new U;class CCe extends cn{constructor(){super(),this.type="AudioListener",this.context=$K.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new r9}getInput(){return this.gain}removeFilter(){return this.filter!==null&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(e){return this.filter!==null?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=e,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(e){return this.gain.gain.setTargetAtTime(e,this.context.currentTime,.01),this}updateMatrixWorld(e){super.updateMatrixWorld(e);const n=this.context.listener,r=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(km,wJ,XCe),Om.set(0,0,-1).applyQuaternion(wJ),n.positionX){const i=this.context.currentTime+this.timeDelta;n.positionX.linearRampToValueAtTime(km.x,i),n.positionY.linearRampToValueAtTime(km.y,i),n.positionZ.linearRampToValueAtTime(km.z,i),n.forwardX.linearRampToValueAtTime(Om.x,i),n.forwardY.linearRampToValueAtTime(Om.y,i),n.forwardZ.linearRampToValueAtTime(Om.z,i),n.upX.linearRampToValueAtTime(r.x,i),n.upY.linearRampToValueAtTime(r.y,i),n.upZ.linearRampToValueAtTime(r.z,i)}else n.setPosition(km.x,km.y,km.z),n.setOrientation(Om.x,Om.y,Om.z,r.x,r.y,r.z)}}class eq extends cn{constructor(e){super(),this.type="Audio",this.listener=e,this.context=e.context,this.gain=this.context.createGain(),this.gain.connect(e.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(e){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=e,this.connect(),this}setMediaElementSource(e){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(e),this.connect(),this}setMediaStreamSource(e){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(e),this.connect(),this}setBuffer(e){return this.buffer=e,this.sourceType="buffer",this.autoplay&&this.play(),this}play(e=0){if(this.isPlaying===!0){console.warn("THREE.Audio: Audio is already playing.");return}if(this.hasPlaybackControl===!1){console.warn("THREE.Audio: this Audio has no playback control.");return}this._startedAt=this.context.currentTime+e;const n=this.context.createBufferSource();return n.buffer=this.buffer,n.loop=this.loop,n.loopStart=this.loopStart,n.loopEnd=this.loopEnd,n.onended=this.onEnded.bind(this),n.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=n,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(this.hasPlaybackControl===!1){console.warn("THREE.Audio: this Audio has no playback control.");return}return this.isPlaying===!0&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,this.loop===!0&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this}stop(){if(this.hasPlaybackControl===!1){console.warn("THREE.Audio: this Audio has no playback control.");return}return this._progress=0,this.source.stop(),this.source.onended=null,this.isPlaying=!1,this}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let e=1,n=this.filters.length;e0){this.source.disconnect(this.filters[0]);for(let e=1,n=this.filters.length;e0&&this._mixBufferRegionAdditive(r,i,this._addIndex*n,1,n);for(let l=n,u=n+n;l!==u;++l)if(r[l]!==r[l+n]){o.setValue(r,i);break}}saveOriginalState(){const e=this.binding,n=this.buffer,r=this.valueSize,i=r*this._origIndex;e.getValue(n,i);for(let s=r,a=i;s!==a;++s)n[s]=n[i+s%r];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const e=this.valueSize*3;this.binding.setValue(this.buffer,e)}_setAdditiveIdentityNumeric(){const e=this._addIndex*this.valueSize,n=e+this.valueSize;for(let r=e;r=.5)for(let a=0;a!==s;++a)e[n+a]=e[r+a]}_slerp(e,n,r,i){Or.slerpFlat(e,n,e,n,e,r,i)}_slerpAdditive(e,n,r,i,s){const a=this._workIndex*s;Or.multiplyQuaternionsFlat(e,a,e,n,e,r),Or.slerpFlat(e,n,e,n,e,a,i)}_lerp(e,n,r,i,s){const a=1-i;for(let o=0;o!==s;++o){const l=n+o;e[l]=e[l]*a+e[r+o]*i}}_lerpAdditive(e,n,r,i,s){for(let a=0;a!==s;++a){const o=n+a;e[o]=e[o]+e[r+a]*i}}}const tq="\\[\\]\\.:\\/",DCe=new RegExp("["+tq+"]","g"),nq="[^"+tq+"]",WCe="[^"+tq.replace("\\.","")+"]",ACe=/((?:WC+[\/:])*)/.source.replace("WC",nq),GCe=/(WCOD+)?/.source.replace("WCOD",WCe),FCe=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",nq),jCe=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",nq),ZCe=new RegExp("^"+ACe+GCe+FCe+jCe+"$"),JCe=["material","materials","bones"];class YCe{constructor(e,n,r){const i=r||Bn.parseTrackName(n);this._targetGroup=e,this._bindings=e.subscribe_(n,i)}getValue(e,n){this.bind();const r=this._targetGroup.nCachedObjects_,i=this._bindings[r];i!==void 0&&i.getValue(e,n)}setValue(e,n){const r=this._bindings;for(let i=this._targetGroup.nCachedObjects_,s=r.length;i!==s;++i)r[i].setValue(e,n)}bind(){const e=this._bindings;for(let n=this._targetGroup.nCachedObjects_,r=e.length;n!==r;++n)e[n].bind()}unbind(){const e=this._bindings;for(let n=this._targetGroup.nCachedObjects_,r=e.length;n!==r;++n)e[n].unbind()}}class Bn{constructor(e,n,r){this.path=n,this.parsedPath=r||Bn.parseTrackName(n),this.node=Bn.findNode(e,this.parsedPath.nodeName)||e,this.rootNode=e,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(e,n,r){return e&&e.isAnimationObjectGroup?new Bn.Composite(e,n,r):new Bn(e,n,r)}static sanitizeNodeName(e){return e.replace(/\s/g,"_").replace(DCe,"")}static parseTrackName(e){const n=ZCe.exec(e);if(n===null)throw new Error("PropertyBinding: Cannot parse trackName: "+e);const r={nodeName:n[2],objectName:n[3],objectIndex:n[4],propertyName:n[5],propertyIndex:n[6]},i=r.nodeName&&r.nodeName.lastIndexOf(".");if(i!==void 0&&i!==-1){const s=r.nodeName.substring(i+1);JCe.indexOf(s)!==-1&&(r.nodeName=r.nodeName.substring(0,i),r.objectName=s)}if(r.propertyName===null||r.propertyName.length===0)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+e);return r}static findNode(e,n){if(n===void 0||n===""||n==="."||n===-1||n===e.name||n===e.uuid)return e;if(e.skeleton){const r=e.skeleton.getBoneByName(n);if(r!==void 0)return r}if(e.children){const r=function(s){for(let a=0;a=s){const d=s++,f=e[d];n[f.uuid]=c,e[c]=f,n[u]=d,e[d]=l;for(let h=0,p=i;h!==p;++h){const m=r[h],v=m[d],g=m[c];m[c]=v,m[d]=g}}}this.nCachedObjects_=s}uncache(){const e=this._objects,n=this._indicesByUUID,r=this._bindings,i=r.length;let s=this.nCachedObjects_,a=e.length;for(let o=0,l=arguments.length;o!==l;++o){const u=arguments[o],c=u.uuid,d=n[c];if(d!==void 0)if(delete n[c],d0&&(n[h.uuid]=d),e[d]=h,e.pop();for(let p=0,m=i;p!==m;++p){const v=r[p];v[d]=v[f],v.pop()}}}this.nCachedObjects_=s}subscribe_(e,n){const r=this._bindingsIndicesByPath;let i=r[e];const s=this._bindings;if(i!==void 0)return s[i];const a=this._paths,o=this._parsedPaths,l=this._objects,u=l.length,c=this.nCachedObjects_,d=new Array(u);i=s.length,r[e]=i,a.push(e),o.push(n),s.push(d);for(let f=c,h=l.length;f!==h;++f){const p=l[f];d[f]=new Bn(p,e,n)}return d}unsubscribe_(e){const n=this._bindingsIndicesByPath,r=n[e];if(r!==void 0){const i=this._paths,s=this._parsedPaths,a=this._bindings,o=a.length-1,l=a[o],u=e[o];n[u]=r,a[r]=l,a.pop(),s[r]=s[o],s.pop(),i[r]=i[o],i.pop()}}}dde.prototype.isAnimationObjectGroup=!0;class BCe{constructor(e,n,r=null,i=n.blendMode){this._mixer=e,this._clip=n,this._localRoot=r,this.blendMode=i;const s=n.tracks,a=s.length,o=new Array(a),l={endingStart:dv,endingEnd:dv};for(let u=0;u!==a;++u){const c=s[u].createInterpolant(null);o[u]=c,c.settings=l}this._interpolantSettings=l,this._interpolants=o,this._propertyBindings=new Array(a),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=dce,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&this.timeScale!==0&&this._startTime===null&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(e){return this._startTime=e,this}setLoop(e,n){return this.loop=e,this.repetitions=n,this}setEffectiveWeight(e){return this.weight=e,this._effectiveWeight=this.enabled?e:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(e){return this._scheduleFading(e,0,1)}fadeOut(e){return this._scheduleFading(e,1,0)}crossFadeFrom(e,n,r){if(e.fadeOut(n),this.fadeIn(n),r){const i=this._clip.duration,s=e._clip.duration,a=s/i,o=i/s;e.warp(1,a,n),this.warp(o,1,n)}return this}crossFadeTo(e,n,r){return e.crossFadeFrom(this,n,r)}stopFading(){const e=this._weightInterpolant;return e!==null&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this}setEffectiveTimeScale(e){return this.timeScale=e,this._effectiveTimeScale=this.paused?0:e,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(e){return this.timeScale=this._clip.duration/e,this.stopWarping()}syncWith(e){return this.time=e.time,this.timeScale=e.timeScale,this.stopWarping()}halt(e){return this.warp(this._effectiveTimeScale,0,e)}warp(e,n,r){const i=this._mixer,s=i.time,a=this.timeScale;let o=this._timeScaleInterpolant;o===null&&(o=i._lendControlInterpolant(),this._timeScaleInterpolant=o);const l=o.parameterPositions,u=o.sampleValues;return l[0]=s,l[1]=s+r,u[0]=e/a,u[1]=n/a,this}stopWarping(){const e=this._timeScaleInterpolant;return e!==null&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(e,n,r,i){if(!this.enabled){this._updateWeight(e);return}const s=this._startTime;if(s!==null){const l=(e-s)*r;if(l<0||r===0)return;this._startTime=null,n=r*l}n*=this._updateTimeScale(e);const a=this._updateTime(n),o=this._updateWeight(e);if(o>0){const l=this._interpolants,u=this._propertyBindings;switch(this.blendMode){case yK:for(let c=0,d=l.length;c!==d;++c)l[c].evaluate(a),u[c].accumulateAdditive(o);break;case KV:default:for(let c=0,d=l.length;c!==d;++c)l[c].evaluate(a),u[c].accumulate(i,o)}}}_updateWeight(e){let n=0;if(this.enabled){n=this.weight;const r=this._weightInterpolant;if(r!==null){const i=r.evaluate(e)[0];n*=i,e>r.parameterPositions[1]&&(this.stopFading(),i===0&&(this.enabled=!1))}}return this._effectiveWeight=n,n}_updateTimeScale(e){let n=0;if(!this.paused){n=this.timeScale;const r=this._timeScaleInterpolant;if(r!==null){const i=r.evaluate(e)[0];n*=i,e>r.parameterPositions[1]&&(this.stopWarping(),n===0?this.paused=!0:this.timeScale=n)}}return this._effectiveTimeScale=n,n}_updateTime(e){const n=this._clip.duration,r=this.loop;let i=this.time+e,s=this._loopCount;const a=r===fce;if(e===0)return s===-1?i:a&&(s&1)===1?n-i:i;if(r===cce){s===-1&&(this._loopCount=0,this._setEndings(!0,!0,!1));e:{if(i>=n)i=n;else if(i<0)i=0;else{this.time=i;break e}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:e<0?-1:1})}}else{if(s===-1&&(e>=0?(s=0,this._setEndings(!0,this.repetitions===0,a)):this._setEndings(this.repetitions===0,!0,a)),i>=n||i<0){const o=Math.floor(i/n);i-=n*o,s+=Math.abs(o);const l=this.repetitions-s;if(l<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,i=e>0?n:0,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:e>0?1:-1});else{if(l===1){const u=e<0;this._setEndings(u,!u,a)}else this._setEndings(!1,!1,a);this._loopCount=s,this.time=i,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:o})}}else this.time=i;if(a&&(s&1)===1)return n-i}return i}_setEndings(e,n,r){const i=this._interpolantSettings;r?(i.endingStart=fv,i.endingEnd=fv):(e?i.endingStart=this.zeroSlopeAtStart?fv:dv:i.endingStart=c6,n?i.endingEnd=this.zeroSlopeAtEnd?fv:dv:i.endingEnd=c6)}_scheduleFading(e,n,r){const i=this._mixer,s=i.time;let a=this._weightInterpolant;a===null&&(a=i._lendControlInterpolant(),this._weightInterpolant=a);const o=a.parameterPositions,l=a.sampleValues;return o[0]=s,l[0]=n,o[1]=s+e,l[1]=r,this}}class fde extends tm{constructor(e){super(),this._root=e,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(e,n){const r=e._localRoot||this._root,i=e._clip.tracks,s=i.length,a=e._propertyBindings,o=e._interpolants,l=r.uuid,u=this._bindingsByRootAndName;let c=u[l];c===void 0&&(c={},u[l]=c);for(let d=0;d!==s;++d){const f=i[d],h=f.name;let p=c[h];if(p!==void 0)++p.referenceCount,a[d]=p;else{if(p=a[d],p!==void 0){p._cacheIndex===null&&(++p.referenceCount,this._addInactiveBinding(p,l,h));continue}const m=n&&n._propertyBindings[d].binding.parsedPath;p=new cde(Bn.create(r,h,m),f.ValueTypeName,f.getValueSize()),++p.referenceCount,this._addInactiveBinding(p,l,h),a[d]=p}o[d].resultBuffer=p.buffer}}_activateAction(e){if(!this._isActiveAction(e)){if(e._cacheIndex===null){const r=(e._localRoot||this._root).uuid,i=e._clip.uuid,s=this._actionsByClip[i];this._bindAction(e,s&&s.knownActions[0]),this._addInactiveAction(e,i,r)}const n=e._propertyBindings;for(let r=0,i=n.length;r!==i;++r){const s=n[r];s.useCount++===0&&(this._lendBinding(s),s.saveOriginalState())}this._lendAction(e)}}_deactivateAction(e){if(this._isActiveAction(e)){const n=e._propertyBindings;for(let r=0,i=n.length;r!==i;++r){const s=n[r];--s.useCount===0&&(s.restoreOriginalState(),this._takeBackBinding(s))}this._takeBackAction(e)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const e=this;this.stats={actions:{get total(){return e._actions.length},get inUse(){return e._nActiveActions}},bindings:{get total(){return e._bindings.length},get inUse(){return e._nActiveBindings}},controlInterpolants:{get total(){return e._controlInterpolants.length},get inUse(){return e._nActiveControlInterpolants}}}}_isActiveAction(e){const n=e._cacheIndex;return n!==null&&n=0;--r)e[r].stop();return this}update(e){e*=this.timeScale;const n=this._actions,r=this._nActiveActions,i=this.time+=e,s=Math.sign(e),a=this._accuIndex^=1;for(let u=0;u!==r;++u)n[u]._update(i,e,s,a);const o=this._bindings,l=this._nActiveBindings;for(let u=0;u!==l;++u)o[u].apply(a);return this}setTime(e){this.time=0;for(let n=0;nthis.max.x||e.ythis.max.y)}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y}getParameter(e,n){return n.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(e){return!(e.max.xthis.max.x||e.max.ythis.max.y)}clampPoint(e,n){return n.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return PJ.copy(e).clamp(this.min,this.max).sub(e).length()}intersect(e){return this.min.max(e.min),this.max.min(e.max),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}xy.prototype.isBox2=!0;const RJ=new U,Q2=new U;class pl{constructor(e=new U,n=new U){this.start=e,this.end=n}set(e,n){return this.start.copy(e),this.end.copy(n),this}copy(e){return this.start.copy(e.start),this.end.copy(e.end),this}getCenter(e){return e.addVectors(this.start,this.end).multiplyScalar(.5)}delta(e){return e.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(e,n){return this.delta(n).multiplyScalar(e).add(this.start)}closestPointToPointParameter(e,n){RJ.subVectors(e,this.start),Q2.subVectors(this.end,this.start);const r=Q2.dot(Q2);let s=Q2.dot(RJ)/r;return n&&(s=Fi(s,0,1)),s}closestPointToPoint(e,n,r){const i=this.closestPointToPointParameter(e,n);return this.delta(r).multiplyScalar(i).add(this.start)}applyMatrix4(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this}equals(e){return e.start.equals(this.start)&&e.end.equals(this.end)}clone(){return new this.constructor().copy(this)}}const VJ=new U;class QCe extends cn{constructor(e,n){super(),this.light=e,this.light.updateMatrixWorld(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.color=n;const r=new Lt,i=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let a=0,o=1,l=32;a.99999)this.quaternion.set(0,0,0,1);else if(e.y<-.99999)this.quaternion.set(1,0,0,0);else{UJ.set(e.z,0,-e.x).normalize();const n=Math.acos(e.y);this.quaternion.setFromAxisAngle(UJ,n)}}setLength(e,n=e*.2,r=n*.2){this.line.scale.set(1,Math.max(1e-4,e-n),1),this.line.updateMatrix(),this.cone.scale.set(r,n,r),this.cone.position.y=e,this.cone.updateMatrix()}setColor(e){this.line.material.color.set(e),this.cone.material.color.set(e)}copy(e){return super.copy(e,!1),this.line.copy(e.line),this.cone.copy(e.cone),this}}class Sde extends Do{constructor(e=1){const n=[0,0,0,e,0,0,0,0,0,0,e,0,0,0,0,0,0,e],r=[1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],i=new Lt;i.setAttribute("position",new xt(n,3)),i.setAttribute("color",new xt(r,3));const s=new cs({vertexColors:!0,toneMapped:!1});super(i,s),this.type="AxesHelper"}setColors(e,n,r){const i=new tt,s=this.geometry.attributes.color.array;return i.set(e),i.toArray(s,0),i.toArray(s,3),i.set(n),i.toArray(s,6),i.toArray(s,9),i.set(r),i.toArray(s,12),i.toArray(s,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class xde{constructor(){this.type="ShapePath",this.color=new tt,this.subPaths=[],this.currentPath=null}moveTo(e,n){return this.currentPath=new gb,this.subPaths.push(this.currentPath),this.currentPath.moveTo(e,n),this}lineTo(e,n){return this.currentPath.lineTo(e,n),this}quadraticCurveTo(e,n,r,i){return this.currentPath.quadraticCurveTo(e,n,r,i),this}bezierCurveTo(e,n,r,i,s,a){return this.currentPath.bezierCurveTo(e,n,r,i,s,a),this}splineThru(e){return this.currentPath.splineThru(e),this}toShapes(e,n){function r(b){const y=[];for(let x=0,T=b.length;xNumber.EPSILON){if(V<0&&(S=y[E],R=-R,P=y[M],V=-V),b.yP.y)continue;if(b.y===S.y){if(b.x===S.x)return!0}else{const z=V*(b.x-S.x)-R*(b.y-S.y);if(z===0)return!0;if(z<0)continue;T=!T}}else{if(b.y!==S.y)continue;if(P.x<=b.x&&b.x<=S.x||S.x<=b.x&&b.x<=P.x)return!0}}return T}const s=Fc.isClockWise,a=this.subPaths;if(a.length===0)return[];if(n===!0)return r(a);let o,l,u;const c=[];if(a.length===1)return l=a[0],u=new Gc,u.curves=l.curves,c.push(u),c;let d=!s(a[0].getPoints());d=e?!d:d;const f=[],h=[];let p=[],m=0,v;h[m]=void 0,p[m]=[];for(let b=0,y=a.length;b1){let b=!1,y=0;for(let x=0,T=h.length;x0&&b===!1&&(p=f)}let g;for(let b=0,y=h.length;b65504&&console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."),e=Fi(e,-65504,65504),NJ[0]=e;const n=LJ[0],r=n>>23&511;return mu[r]+((n&8388607)>>vu[r])}static fromHalfFloat(e){const n=e>>10;return LJ[0]=iq[wde[n]+(e&1023)]+Ty[n],NJ[0]}}const Tde=new ArrayBuffer(4),NJ=new Float32Array(Tde),LJ=new Uint32Array(Tde),mu=new Uint32Array(512),vu=new Uint32Array(512);for(let t=0;t<256;++t){const e=t-127;e<-27?(mu[t]=0,mu[t|256]=32768,vu[t]=24,vu[t|256]=24):e<-14?(mu[t]=1024>>-e-14,mu[t|256]=1024>>-e-14|32768,vu[t]=-e-1,vu[t|256]=-e-1):e<=15?(mu[t]=e+15<<10,mu[t|256]=e+15<<10|32768,vu[t]=13,vu[t|256]=13):e<128?(mu[t]=31744,mu[t|256]=64512,vu[t]=24,vu[t|256]=24):(mu[t]=31744,mu[t|256]=64512,vu[t]=13,vu[t|256]=13)}const iq=new Uint32Array(2048),Ty=new Uint32Array(64),wde=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,n=0;for(;!(e&8388608);)e<<=1,n-=8388608;e&=-8388609,n+=947912704,iq[t]=e|n}for(let t=1024;t<2048;++t)iq[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)Ty[t]=t<<23;Ty[31]=1199570944;Ty[32]=2147483648;for(let t=33;t<63;++t)Ty[t]=2147483648+(t-32<<23);Ty[63]=3347054592;for(let t=1;t<64;++t)t!==32&&(wde[t]=1024);const iKe=0,sKe=1,aKe=0,oKe=1,lKe=2;function uKe(t){return console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead."),t}function cKe(t=[]){return console.warn("THREE.MultiMaterial has been removed. Use an Array instead."),t.isMultiMaterial=!0,t.materials=t,t.clone=function(){return t.slice()},t}class dKe extends gy{constructor(e,n){console.warn("THREE.PointCloud has been renamed to THREE.Points."),super(e,n)}}class fKe extends FV{constructor(e){console.warn("THREE.Particle has been renamed to THREE.Sprite."),super(e)}}class hKe extends gy{constructor(e,n){console.warn("THREE.ParticleSystem has been renamed to THREE.Points."),super(e,n)}}class pKe extends qf{constructor(e){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial."),super(e)}}class mKe extends qf{constructor(e){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial."),super(e)}}class vKe extends qf{constructor(e){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial."),super(e)}}class gKe extends U{constructor(e,n,r){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead."),super(e,n,r)}}class bKe extends un{constructor(e,n){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead."),super(e,n),this.setUsage(Bl)}}class yKe extends Tce{constructor(e,n){console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead."),super(e,n)}}class SKe extends wce{constructor(e,n){console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead."),super(e,n)}}class xKe extends Ece{constructor(e,n){console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead."),super(e,n)}}class TKe extends Mce{constructor(e,n){console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead."),super(e,n)}}class wKe extends Av{constructor(e,n){console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead."),super(e,n)}}class EKe extends Pce{constructor(e,n){console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead."),super(e,n)}}class MKe extends Gv{constructor(e,n){console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead."),super(e,n)}}class PKe extends xt{constructor(e,n){console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead."),super(e,n)}}class RKe extends Vce{constructor(e,n){console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead."),super(e,n)}}Sl.create=function(t,e){return console.log("THREE.Curve.create() has been deprecated"),t.prototype=Object.create(Sl.prototype),t.prototype.constructor=t,t.prototype.getPoint=e,t};gb.prototype.fromPoints=function(t){return console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."),this.setFromPoints(t)};class VKe extends Sde{constructor(e){console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper."),super(e)}}class zKe extends yde{constructor(e,n){console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead."),super(e,n)}}class kKe extends Do{constructor(e,n){console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead."),super(new UK(e.geometry),new cs({color:n!==void 0?n:16777215}))}}gde.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};mde.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")};class OKe extends Do{constructor(e,n){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead."),super(new $V(e.geometry),new cs({color:n!==void 0?n:16777215}))}}Xa.prototype.extractUrlBase=function(t){return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."),uP.extractUrlBase(t)};Xa.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}};class IKe extends Du{constructor(e){console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader."),super(e)}}class UKe extends t9{constructor(e){console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader."),super(e)}}xy.prototype.center=function(t){return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."),this.getCenter(t)};xy.prototype.empty=function(){return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."),this.isEmpty()};xy.prototype.isIntersectionBox=function(t){return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)};xy.prototype.size=function(t){return console.warn("THREE.Box2: .size() has been renamed to .getSize()."),this.getSize(t)};Jt.prototype.center=function(t){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(t)};Jt.prototype.empty=function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()};Jt.prototype.isIntersectionBox=function(t){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)};Jt.prototype.isIntersectionSphere=function(t){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)};Jt.prototype.size=function(t){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(t)};ld.prototype.toVector3=function(){console.error("THREE.Euler: .toVector3() has been removed. Use Vector3.setFromEuler() instead")};so.prototype.empty=function(){return console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty()."),this.isEmpty()};wT.prototype.setFromMatrix=function(t){return console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix()."),this.setFromProjectionMatrix(t)};pl.prototype.center=function(t){return console.warn("THREE.Line3: .center() has been renamed to .getCenter()."),this.getCenter(t)};as.prototype.flattenToArrayOffset=function(t,e){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)};as.prototype.multiplyVector3=function(t){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)};as.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")};as.prototype.applyToBufferAttribute=function(t){return console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)};as.prototype.applyToVector3Array=function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")};as.prototype.getInverse=function(t){return console.warn("THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()};Be.prototype.extractPosition=function(t){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(t)};Be.prototype.flattenToArrayOffset=function(t,e){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)};Be.prototype.getPosition=function(){return console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),new U().setFromMatrixColumn(this,3)};Be.prototype.setRotationFromQuaternion=function(t){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(t)};Be.prototype.multiplyToArray=function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")};Be.prototype.multiplyVector3=function(t){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)};Be.prototype.multiplyVector4=function(t){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)};Be.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")};Be.prototype.rotateAxis=function(t){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),t.transformDirection(this)};Be.prototype.crossVector=function(t){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)};Be.prototype.translate=function(){console.error("THREE.Matrix4: .translate() has been removed.")};Be.prototype.rotateX=function(){console.error("THREE.Matrix4: .rotateX() has been removed.")};Be.prototype.rotateY=function(){console.error("THREE.Matrix4: .rotateY() has been removed.")};Be.prototype.rotateZ=function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")};Be.prototype.rotateByAxis=function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")};Be.prototype.applyToBufferAttribute=function(t){return console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)};Be.prototype.applyToVector3Array=function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")};Be.prototype.makeFrustum=function(t,e,n,r,i,s){return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."),this.makePerspective(t,e,r,n,i,s)};Be.prototype.getInverse=function(t){return console.warn("THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()};ri.prototype.isIntersectionLine=function(t){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(t)};Or.prototype.multiplyVector3=function(t){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),t.applyQuaternion(this)};Or.prototype.inverse=function(){return console.warn("THREE.Quaternion: .inverse() has been renamed to invert()."),this.invert()};qo.prototype.isIntersectionBox=function(t){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)};qo.prototype.isIntersectionPlane=function(t){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(t)};qo.prototype.isIntersectionSphere=function(t){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)};Wr.prototype.area=function(){return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."),this.getArea()};Wr.prototype.barycoordFromPoint=function(t,e){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),this.getBarycoord(t,e)};Wr.prototype.midpoint=function(t){return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."),this.getMidpoint(t)};Wr.prototypenormal=function(t){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),this.getNormal(t)};Wr.prototype.plane=function(t){return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."),this.getPlane(t)};Wr.barycoordFromPoint=function(t,e,n,r,i){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),Wr.getBarycoord(t,e,n,r,i)};Wr.normal=function(t,e,n,r){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),Wr.getNormal(t,e,n,r)};Gc.prototype.extractAllPoints=function(t){return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."),this.extractPoints(t)};Gc.prototype.extrude=function(t){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new ed(this,t)};Gc.prototype.makeGeometry=function(t){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new jv(this,t)};Oe.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)};Oe.prototype.distanceToManhattan=function(t){return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)};Oe.prototype.lengthManhattan=function(){return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()};U.prototype.setEulerFromRotationMatrix=function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")};U.prototype.setEulerFromQuaternion=function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")};U.prototype.getPositionFromMatrix=function(t){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(t)};U.prototype.getScaleFromMatrix=function(t){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(t)};U.prototype.getColumnFromMatrix=function(t,e){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(e,t)};U.prototype.applyProjection=function(t){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(t)};U.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)};U.prototype.distanceToManhattan=function(t){return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)};U.prototype.lengthManhattan=function(){return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()};Qt.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)};Qt.prototype.lengthManhattan=function(){return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()};cn.prototype.getChildByName=function(t){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(t)};cn.prototype.renderDepth=function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")};cn.prototype.translate=function(t,e){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(e,t)};cn.prototype.getWorldRotation=function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")};cn.prototype.applyMatrix=function(t){return console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)};Object.defineProperties(cn.prototype,{eulerOrder:{get:function(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set:function(t){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=t}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});ut.prototype.setDrawMode=function(){console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")};Object.defineProperties(ut.prototype,{drawMode:{get:function(){return console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode."),hce},set:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}});jV.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")};ns.prototype.setLens=function(t,e){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."),e!==void 0&&(this.filmGauge=e),this.setFocalLength(t)};Object.defineProperties(Wu.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(t){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."),this.shadow.camera.fov=t}},shadowCameraLeft:{set:function(t){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."),this.shadow.camera.left=t}},shadowCameraRight:{set:function(t){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."),this.shadow.camera.right=t}},shadowCameraTop:{set:function(t){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."),this.shadow.camera.top=t}},shadowCameraBottom:{set:function(t){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."),this.shadow.camera.bottom=t}},shadowCameraNear:{set:function(t){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."),this.shadow.camera.near=t}},shadowCameraFar:{set:function(t){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."),this.shadow.camera.far=t}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(t){console.warn("THREE.Light: .shadowBias is now .shadow.bias."),this.shadow.bias=t}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(t){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."),this.shadow.mapSize.width=t}},shadowMapHeight:{set:function(t){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."),this.shadow.mapSize.height=t}}});Object.defineProperties(un.prototype,{length:{get:function(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."),this.array.length}},dynamic:{get:function(){return console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.usage===Bl},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.setUsage(Bl)}}});un.prototype.setDynamic=function(t){return console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(t===!0?Bl:mb),this};un.prototype.copyIndicesArray=function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},un.prototype.setArray=function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")};Lt.prototype.addIndex=function(t){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(t)};Lt.prototype.addAttribute=function(t,e){return console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute()."),!(e&&e.isBufferAttribute)&&!(e&&e.isInterleavedBufferAttribute)?(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.setAttribute(t,new un(arguments[1],arguments[2]))):t==="index"?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(e),this):this.setAttribute(t,e)};Lt.prototype.addDrawCall=function(t,e,n){n!==void 0&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(t,e)};Lt.prototype.clearDrawCalls=function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()};Lt.prototype.computeOffsets=function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")};Lt.prototype.removeAttribute=function(t){return console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute()."),this.deleteAttribute(t)};Lt.prototype.applyMatrix=function(t){return console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)};Object.defineProperties(Lt.prototype,{drawcalls:{get:function(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups}},offsets:{get:function(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups}}});S0.prototype.setDynamic=function(t){return console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(t===!0?Bl:mb),this};S0.prototype.setArray=function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")};ed.prototype.getArrays=function(){console.error("THREE.ExtrudeGeometry: .getArrays() has been removed.")};ed.prototype.addShapeList=function(){console.error("THREE.ExtrudeGeometry: .addShapeList() has been removed.")};ed.prototype.addShape=function(){console.error("THREE.ExtrudeGeometry: .addShape() has been removed.")};RT.prototype.dispose=function(){console.error("THREE.Scene: .dispose() has been removed.")};i9.prototype.onUpdate=function(){return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."),this};Object.defineProperties(Ji.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},overdraw:{get:function(){console.warn("THREE.Material: .overdraw has been removed.")},set:function(){console.warn("THREE.Material: .overdraw has been removed.")}},wrapRGB:{get:function(){return console.warn("THREE.Material: .wrapRGB has been removed."),new tt}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(t){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=t===fK}},stencilMask:{get:function(){return console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask},set:function(t){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask=t}},vertexTangents:{get:function(){console.warn("THREE."+this.type+": .vertexTangents has been removed.")},set:function(){console.warn("THREE."+this.type+": .vertexTangents has been removed.")}}});Object.defineProperties(bi.prototype,{derivatives:{get:function(){return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives},set:function(t){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives=t}}});xr.prototype.clearTarget=function(t,e,n,r){console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead."),this.setRenderTarget(t),this.clear(e,n,r)};xr.prototype.animate=function(t){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."),this.setAnimationLoop(t)};xr.prototype.getCurrentRenderTarget=function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()};xr.prototype.getMaxAnisotropy=function(){return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."),this.capabilities.getMaxAnisotropy()};xr.prototype.getPrecision=function(){return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."),this.capabilities.precision};xr.prototype.resetGLState=function(){return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."),this.state.reset()};xr.prototype.supportsFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")};xr.prototype.supportsHalfFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")};xr.prototype.supportsStandardDerivatives=function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")};xr.prototype.supportsCompressedTextureS3TC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")};xr.prototype.supportsCompressedTexturePVRTC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")};xr.prototype.supportsBlendMinMax=function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")};xr.prototype.supportsVertexTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures};xr.prototype.supportsInstancedArrays=function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")};xr.prototype.enableScissorTest=function(t){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(t)};xr.prototype.initMaterial=function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")};xr.prototype.addPrePlugin=function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")};xr.prototype.addPostPlugin=function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")};xr.prototype.updateShadowMap=function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")};xr.prototype.setFaceCulling=function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")};xr.prototype.allocTextureUnit=function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")};xr.prototype.setTexture=function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")};xr.prototype.setTexture2D=function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")};xr.prototype.setTextureCube=function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")};xr.prototype.getActiveMipMapLevel=function(){return console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel()."),this.getActiveMipmapLevel()};Object.defineProperties(xr.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),this.shadowMap.enabled=t}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),this.shadowMap.type=t}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){return console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead."),this.getContext()}},vr:{get:function(){return console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr"),this.xr}},gammaInput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead."),!1},set:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.")}},gammaOutput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),!1},set:function(t){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),this.outputEncoding=t===!0?Jr:yl}},toneMappingWhitePoint:{get:function(){return console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed."),1},set:function(){console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.")}},gammaFactor:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaFactor has been removed."),2},set:function(){console.warn("THREE.WebGLRenderer: .gammaFactor has been removed.")}}});Object.defineProperties(Xce.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}});class NKe extends WV{constructor(e,n,r){console.warn("THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options )."),super(e,r)}}Object.defineProperties(oi.prototype,{wrapS:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=t}},wrapT:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=t}},magFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=t}},minFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=t}},anisotropy:{get:function(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set:function(t){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=t}},offset:{get:function(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set:function(t){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=t}},repeat:{get:function(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set:function(t){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=t}},format:{get:function(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set:function(t){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=t}},type:{get:function(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set:function(t){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=t}},generateMipmaps:{get:function(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set:function(t){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=t}}});eq.prototype.load=function(t){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");const e=this;return new ade().load(t,function(r){e.setBuffer(r)}),this};ude.prototype.getData=function(){return console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData()."),this.getFrequencyData()};DV.prototype.updateCubeMap=function(t,e){return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."),this.update(t,e)};DV.prototype.clear=function(t,e,n,r){return console.warn("THREE.CubeCamera: .clear() is now .renderTarget.clear()."),this.renderTarget.clear(t,e,n,r)};nm.crossOrigin=void 0;nm.loadTexture=function(t,e,n,r){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");const i=new jK;i.setCrossOrigin(this.crossOrigin);const s=i.load(t,n,void 0,r);return e&&(s.mapping=e),s};nm.loadTextureCube=function(t,e,n,r){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");const i=new $ce;i.setCrossOrigin(this.crossOrigin);const s=i.load(t,n,void 0,r);return e&&(s.mapping=e),s};nm.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")};nm.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};function LKe(){console.error("THREE.CanvasRenderer has been removed")}function XKe(){console.error("THREE.JSONLoader has been removed.")}const CKe={createMultiMaterialObject:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},detach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},attach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")}};function KKe(){console.error("THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js")}class qKe extends Lt{constructor(){console.error("THREE.ParametricGeometry has been moved to /examples/jsm/geometries/ParametricGeometry.js"),super()}}class DKe extends Lt{constructor(){console.error("THREE.TextGeometry has been moved to /examples/jsm/geometries/TextGeometry.js"),super()}}function WKe(){console.error("THREE.FontLoader has been moved to /examples/jsm/loaders/FontLoader.js")}function AKe(){console.error("THREE.Font has been moved to /examples/jsm/loaders/FontLoader.js")}function GKe(){console.error("THREE.ImmediateRenderObject has been removed.")}class FKe extends oi{constructor(e,n,r){console.error('THREE.WebGLMultisampleRenderTarget has been removed. Use a normal render target and set the "samples" property to greater 0 to enable multisampling.'),super(e,n,r),this.samples=4}}class jKe extends hy{constructor(e,n,r,i){console.warn("THREE.DataTexture2DArray has been renamed to DataArrayTexture."),super(e,n,r,i)}}class ZKe extends xT{constructor(e,n,r,i){console.warn("THREE.DataTexture3D has been renamed to Data3DTexture."),super(e,n,r,i)}}typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:NV}}));typeof window<"u"&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=NV);const JKe=Object.freeze(Object.defineProperty({__proto__:null,ACESFilmicToneMapping:gK,AddEquation:Eu,AddOperation:jue,AdditiveAnimationBlendMode:yK,AdditiveBlending:SL,AlphaFormat:tce,AlwaysDepth:Kue,AlwaysStencilFunc:d6,AmbientLight:HK,AmbientLightProbe:lde,AnimationClip:y6,AnimationLoader:OCe,AnimationMixer:fde,AnimationObjectGroup:dde,AnimationUtils:ti,ArcCurve:VK,ArrayCamera:wK,ArrowHelper:rKe,Audio:eq,AudioAnalyser:ude,AudioContext:$K,AudioListener:CCe,AudioLoader:ade,AxesHelper:Sde,AxisHelper:VKe,BackSide:Ua,BasicDepthPacking:SK,BasicShadowMap:RUe,BinaryTextureLoader:UKe,Bone:ZV,BooleanKeyframeTrack:x0,BoundingBoxHelper:zKe,Box2:xy,Box3:Jt,Box3Helper:OT,BoxBufferGeometry:pi,BoxGeometry:pi,BoxHelper:yde,BufferAttribute:un,BufferGeometry:Lt,BufferGeometryLoader:ide,ByteType:Hue,Cache:Zv,Camera:TT,CameraHelper:rq,CanvasRenderer:LKe,CanvasTexture:Gce,CapsuleBufferGeometry:bb,CapsuleGeometry:bb,CatmullRomCurve3:kK,CineonToneMapping:Yue,CircleBufferGeometry:Xp,CircleGeometry:Xp,ClampToEdgeWrapping:_a,Clock:r9,Color:tt,ColorKeyframeTrack:GK,ColorManagement:Xl,CompressedTexture:RK,CompressedTextureLoader:ICe,ConeBufferGeometry:yb,ConeGeometry:yb,CubeCamera:DV,CubeReflectionMapping:Ip,CubeRefractionMapping:Up,CubeTexture:py,CubeTextureLoader:$ce,CubeUVReflectionMapping:fy,CubicBezierCurve:YV,CubicBezierCurve3:OK,CubicInterpolant:Bce,CullFaceBack:yL,CullFaceFront:zue,CullFaceFrontBack:PUe,CullFaceNone:Vue,Curve:Sl,CurvePath:jce,CustomBlending:bT,CustomToneMapping:Bue,CylinderBufferGeometry:Ni,CylinderGeometry:Ni,Cylindrical:HCe,Data3DTexture:xT,DataArrayTexture:hy,DataTexture:Ac,DataTexture2DArray:jKe,DataTexture3D:ZKe,DataTextureLoader:t9,DataUtils:hv,DecrementStencilOp:KUe,DecrementWrapStencilOp:DUe,DefaultLoadingManager:_ce,DepthFormat:dp,DepthStencilFormat:Wv,DepthTexture:EK,DirectionalLight:n9,DirectionalLightHelper:bde,DiscreteInterpolant:Hce,DodecahedronBufferGeometry:Sb,DodecahedronGeometry:Sb,DoubleSide:rn,DstAlphaFactor:LV,DstColorFactor:vK,DynamicBufferAttribute:bKe,DynamicCopyUsage:$Ue,DynamicDrawUsage:Bl,DynamicReadUsage:HUe,EdgesGeometry:UK,EdgesHelper:kKe,EllipseCurve:by,EqualDepth:Due,EqualStencilFunc:mce,EquirectangularReflectionMapping:s6,EquirectangularRefractionMapping:a6,Euler:ld,EventDispatcher:tm,ExtrudeBufferGeometry:ed,ExtrudeGeometry:ed,FaceColors:oKe,FileLoader:Du,FlatShading:fK,Float16BufferAttribute:Rce,Float32Attribute:PKe,Float32BufferAttribute:xt,Float64Attribute:RKe,Float64BufferAttribute:Vce,FloatType:na,Fog:PT,FogExp2:MT,Font:AKe,FontLoader:WKe,FramebufferTexture:Ace,FrontSide:Ki,Frustum:wT,GLBufferAttribute:hde,GLSL1:tNe,GLSL3:jL,GreaterDepth:Aue,GreaterEqualDepth:Wue,GreaterEqualStencilFunc:JUe,GreaterStencilFunc:jUe,GridHelper:gde,Group:$a,HalfFloatType:No,HemisphereLight:ZK,HemisphereLightHelper:eKe,HemisphereLightProbe:ode,IcosahedronBufferGeometry:xb,IcosahedronGeometry:xb,ImageBitmapLoader:sde,ImageLoader:S6,ImageUtils:nm,ImmediateRenderObject:GKe,IncrementStencilOp:CUe,IncrementWrapStencilOp:qUe,InstancedBufferAttribute:Lp,InstancedBufferGeometry:kT,InstancedInterleavedBuffer:Jv,InstancedMesh:MK,Int16Attribute:TKe,Int16BufferAttribute:Mce,Int32Attribute:EKe,Int32BufferAttribute:Pce,Int8Attribute:yKe,Int8BufferAttribute:Tce,IntType:_ue,InterleavedBuffer:S0,InterleavedBufferAttribute:qs,Interpolant:xf,InterpolateDiscrete:l6,InterpolateLinear:u6,InterpolateSmooth:E7,InvertStencilOp:WUe,JSONLoader:XKe,KeepStencilOp:M7,KeyframeTrack:Yu,LOD:Dce,LatheBufferGeometry:Fv,LatheGeometry:Fv,Layers:qV,LensFlare:KKe,LessDepth:que,LessEqualDepth:rP,LessEqualStencilFunc:FUe,LessStencilFunc:GUe,Light:Wu,LightProbe:zT,Line:$s,Line3:pl,LineBasicMaterial:cs,LineCurve:VT,LineCurve3:Fce,LineDashedMaterial:WK,LineLoop:PK,LinePieces:sKe,LineSegments:Do,LineStrip:iKe,LinearEncoding:yl,LinearFilter:Hn,LinearInterpolant:AK,LinearMipMapLinearFilter:IUe,LinearMipMapNearestFilter:OUe,LinearMipmapLinearFilter:b0,LinearMipmapNearestFilter:bK,LinearSRGBColorSpace:Yh,LinearToneMapping:Zue,Loader:Xa,LoaderUtils:uP,LoadingManager:FK,LoopOnce:cce,LoopPingPong:fce,LoopRepeat:dce,LuminanceAlphaFormat:ice,LuminanceFormat:rce,MOUSE:EUe,Material:Ji,MaterialLoader:rde,Math:fp,MathUtils:fp,Matrix3:as,Matrix4:Be,MaxEquation:nP,Mesh:ut,MeshBasicMaterial:ho,MeshDepthMaterial:vy,MeshDistanceMaterial:ET,MeshFaceMaterial:uKe,MeshLambertMaterial:qK,MeshMatcapMaterial:DK,MeshNormalMaterial:e9,MeshPhongMaterial:CK,MeshPhysicalMaterial:XK,MeshStandardMaterial:pp,MeshToonMaterial:KK,MinEquation:wL,MirroredRepeatWrapping:o6,MixOperation:Fue,MultiMaterial:cKe,MultiplyBlending:TL,MultiplyOperation:yT,NearestFilter:Ir,NearestMipMapLinearFilter:kUe,NearestMipMapNearestFilter:zUe,NearestMipmapLinearFilter:sP,NearestMipmapNearestFilter:iP,NeverDepth:Cue,NeverStencilFunc:AUe,NoBlending:os,NoColorSpace:LUe,NoColors:aKe,NoToneMapping:Wc,NormalAnimationBlendMode:KV,NormalBlending:Mv,NotEqualDepth:Gue,NotEqualStencilFunc:ZUe,NumberKeyframeTrack:g6,Object3D:cn,ObjectLoader:UCe,ObjectSpaceNormalMap:pce,OctahedronBufferGeometry:zu,OctahedronGeometry:zu,OneFactor:Jh,OneMinusDstAlphaFactor:Nue,OneMinusDstColorFactor:Lue,OneMinusSrcAlphaFactor:mK,OneMinusSrcColorFactor:Uue,OrthographicCamera:Kf,PCFShadowMap:dK,PCFSoftShadowMap:kue,PMREMGenerator:lP,ParametricGeometry:qKe,Particle:fKe,ParticleBasicMaterial:mKe,ParticleSystem:hKe,ParticleSystemMaterial:vKe,Path:gb,PerspectiveCamera:ns,Plane:ri,PlaneBufferGeometry:ao,PlaneGeometry:ao,PlaneHelper:nKe,PointCloud:dKe,PointCloudMaterial:pKe,PointLight:BK,PointLightHelper:_Ce,Points:gy,PointsMaterial:qf,PolarGridHelper:tKe,PolyhedronBufferGeometry:$c,PolyhedronGeometry:$c,PositionalAudio:qCe,PropertyBinding:Bn,PropertyMixer:cde,QuadraticBezierCurve:BV,QuadraticBezierCurve3:HV,Quaternion:Or,QuaternionKeyframeTrack:yy,QuaternionLinearInterpolant:Qce,REVISION:NV,RGBADepthPacking:ST,RGBAFormat:no,RGBAIntegerFormat:lce,RGBA_ASTC_10x10_Format:WL,RGBA_ASTC_10x5_Format:KL,RGBA_ASTC_10x6_Format:qL,RGBA_ASTC_10x8_Format:DL,RGBA_ASTC_12x10_Format:AL,RGBA_ASTC_12x12_Format:GL,RGBA_ASTC_4x4_Format:kL,RGBA_ASTC_5x4_Format:OL,RGBA_ASTC_5x5_Format:IL,RGBA_ASTC_6x5_Format:UL,RGBA_ASTC_6x6_Format:NL,RGBA_ASTC_8x5_Format:LL,RGBA_ASTC_8x6_Format:XL,RGBA_ASTC_8x8_Format:CL,RGBA_BPTC_Format:FL,RGBA_ETC2_EAC_Format:zL,RGBA_PVRTC_2BPPV1_Format:RL,RGBA_PVRTC_4BPPV1_Format:PL,RGBA_S3TC_DXT1_Format:x7,RGBA_S3TC_DXT3_Format:T7,RGBA_S3TC_DXT5_Format:w7,RGBFormat:nce,RGB_ETC1_Format:uce,RGB_ETC2_Format:VL,RGB_PVRTC_2BPPV1_Format:ML,RGB_PVRTC_4BPPV1_Format:EL,RGB_S3TC_DXT1_Format:S7,RGFormat:ace,RGIntegerFormat:oce,RawShaderMaterial:LK,Ray:qo,Raycaster:Sy,RectAreaLight:QK,RedFormat:CV,RedIntegerFormat:sce,ReinhardToneMapping:Jue,RepeatWrapping:yf,ReplaceStencilOp:zc,ReverseSubtractEquation:hK,RingBufferGeometry:Tb,RingGeometry:Tb,SRGBColorSpace:Pc,Scene:RT,SceneUtils:CKe,ShaderChunk:yn,ShaderLib:wi,ShaderMaterial:bi,ShadowMaterial:NK,Shape:Gc,ShapeBufferGeometry:jv,ShapeGeometry:jv,ShapePath:xde,ShapeUtils:Fc,ShortType:Que,Skeleton:JV,SkeletonHelper:mde,SkinnedMesh:jV,SmoothShading:VUe,Source:Bh,Sphere:so,SphereBufferGeometry:Sf,SphereGeometry:Sf,Spherical:pde,SphericalHarmonics3:_K,SplineCurve:QV,SpotLight:YK,SpotLightHelper:QCe,Sprite:FV,SpriteMaterial:GV,SrcAlphaFactor:pK,SrcAlphaSaturateFactor:Xue,SrcColorFactor:Iue,StaticCopyUsage:_Ue,StaticDrawUsage:mb,StaticReadUsage:BUe,StereoCamera:LCe,StreamCopyUsage:eNe,StreamDrawUsage:YUe,StreamReadUsage:QUe,StringKeyframeTrack:T0,SubtractEquation:Oue,SubtractiveBlending:xL,TOUCH:MUe,TangentSpaceNormalMap:y0,TetrahedronBufferGeometry:wb,TetrahedronGeometry:wb,TextGeometry:DKe,Texture:Di,TextureLoader:jK,TorusBufferGeometry:Mu,TorusGeometry:Mu,TorusKnotBufferGeometry:Eb,TorusKnotGeometry:Eb,Triangle:Wr,TriangleFanDrawMode:NUe,TriangleStripDrawMode:UUe,TrianglesDrawMode:hce,TubeBufferGeometry:Mb,TubeGeometry:Mb,UVMapping:XV,Uint16Attribute:wKe,Uint16BufferAttribute:Av,Uint32Attribute:MKe,Uint32BufferAttribute:Gv,Uint8Attribute:SKe,Uint8BufferAttribute:wce,Uint8ClampedAttribute:xKe,Uint8ClampedBufferAttribute:Ece,Uniform:i9,UniformsLib:St,UniformsUtils:Na,UnsignedByteType:Np,UnsignedInt248Type:Pv,UnsignedIntType:rx,UnsignedShort4444Type:$ue,UnsignedShort5551Type:ece,UnsignedShortType:pb,VSMShadowMap:cv,Vector2:Oe,Vector3:U,Vector4:Qt,VectorKeyframeTrack:b6,Vertex:gKe,VertexColors:lKe,VideoTexture:Wce,WebGL1Renderer:Kce,WebGL3DRenderTarget:Sce,WebGLArrayRenderTarget:yce,WebGLCubeRenderTarget:WV,WebGLMultipleRenderTargets:xce,WebGLMultisampleRenderTarget:FKe,WebGLRenderTarget:oi,WebGLRenderTargetCube:NKe,WebGLRenderer:xr,WebGLUtils:Cce,WireframeGeometry:$V,WireframeHelper:OKe,WrapAroundEnding:c6,XHRLoader:IKe,ZeroCurvatureEnding:dv,ZeroFactor:i6,ZeroSlopeEnding:fv,ZeroStencilOp:XUe,_SRGBAFormat:aP,sRGBEncoding:Jr},Symbol.toStringTag,{value:"Module"}));var ox=function(){var t=0,e=document.createElement("div");e.style.cssText="position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000",e.addEventListener("click",function(c){c.preventDefault(),r(++t%e.children.length)},!1);function n(c){return e.appendChild(c.dom),c}function r(c){for(var d=0;d=s+1e3&&(o.update(a*1e3/(c-s),100),s=c,a=0,u)){var d=performance.memory;u.update(d.usedJSHeapSize/1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){i=this.end()},domElement:e,setMode:r}};ox.Panel=function(t,e,n){var r=1/0,i=0,s=Math.round,a=s(window.devicePixelRatio||1),o=80*a,l=48*a,u=3*a,c=2*a,d=3*a,f=15*a,h=74*a,p=30*a,m=document.createElement("canvas");m.width=o,m.height=l,m.style.cssText="width:80px;height:48px";var v=m.getContext("2d");return v.font="bold "+9*a+"px Helvetica,Arial,sans-serif",v.textBaseline="top",v.fillStyle=n,v.fillRect(0,0,o,l),v.fillStyle=e,v.fillText(t,u,c),v.fillRect(d,f,h,p),v.fillStyle=n,v.globalAlpha=.9,v.fillRect(d,f,h,p),{dom:m,update:function(g,b){r=Math.min(r,g),i=Math.max(i,g),v.fillStyle=n,v.globalAlpha=1,v.fillRect(0,0,o,f),v.fillStyle=e,v.fillText(s(g)+" "+t+" ("+s(r)+"-"+s(i)+")",u,c),v.drawImage(m,d+a,f,h-a,p,d,f,h-a,p),v.fillRect(d+h-a,f,a,p),v.fillStyle=n,v.globalAlpha=.9,v.fillRect(d+h-a,f,a,s((1-g/b)*p))}}};const YKe=ox;var OS=function(t){return t&&t.Math===Math&&t},on=OS(typeof globalThis=="object"&&globalThis)||OS(typeof window=="object"&&window)||OS(typeof self=="object"&&self)||OS(typeof Ks=="object"&&Ks)||OS(typeof Ks=="object"&&Ks)||function(){return this}()||Function("return this")(),IT={},Rn=function(t){try{return!!t()}catch{return!0}},BKe=Rn,Gr=!BKe(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!==7}),HKe=Rn,s9=!HKe(function(){var t=(function(){}).bind();return typeof t!="function"||t.hasOwnProperty("prototype")}),QKe=s9,r5=Function.prototype.call,Vn=QKe?r5.bind(r5):function(){return r5.apply(r5,arguments)},sq={},Ede={}.propertyIsEnumerable,Mde=Object.getOwnPropertyDescriptor,_Ke=Mde&&!Ede.call({1:2},1);sq.f=_Ke?function(e){var n=Mde(this,e);return!!n&&n.enumerable}:Ede;var rm=function(t,e){return{enumerable:!(t&1),configurable:!(t&2),writable:!(t&4),value:e}},Pde=s9,Rde=Function.prototype,_L=Rde.call,$Ke=Pde&&Rde.bind.bind(_L,_L),tn=Pde?$Ke:function(t){return function(){return _L.apply(t,arguments)}},Vde=tn,eqe=Vde({}.toString),tqe=Vde("".slice),ud=function(t){return tqe(eqe(t),8,-1)},nqe=tn,rqe=Rn,iqe=ud,tO=Object,sqe=nqe("".split),a9=rqe(function(){return!tO("z").propertyIsEnumerable(0)})?function(t){return iqe(t)==="String"?sqe(t,""):tO(t)}:tO,wl=function(t){return t==null},aqe=wl,oqe=TypeError,cd=function(t){if(aqe(t))throw new oqe("Can't call method on "+t);return t},lqe=a9,uqe=cd,wy=function(t){return lqe(uqe(t))},nO=typeof document=="object"&&document.all,ir=typeof nO>"u"&&nO!==void 0?function(t){return typeof t=="function"||t===nO}:function(t){return typeof t=="function"},cqe=ir,ei=function(t){return typeof t=="object"?t!==null:cqe(t)},rO=on,dqe=ir,fqe=function(t){return dqe(t)?t:void 0},ca=function(t,e){return arguments.length<2?fqe(rO[t]):rO[t]&&rO[t][e]},hqe=tn,Df=hqe({}.isPrototypeOf),pqe=on,XJ=pqe.navigator,CJ=XJ&&XJ.userAgent,Wf=CJ?String(CJ):"",zde=on,iO=Wf,KJ=zde.process,qJ=zde.Deno,DJ=KJ&&KJ.versions||qJ&&qJ.version,WJ=DJ&&DJ.v8,Su,cP;WJ&&(Su=WJ.split("."),cP=Su[0]>0&&Su[0]<4?1:+(Su[0]+Su[1]));!cP&&iO&&(Su=iO.match(/Edge\/(\d+)/),(!Su||Su[1]>=74)&&(Su=iO.match(/Chrome\/(\d+)/),Su&&(cP=+Su[1])));var Ey=cP,AJ=Ey,mqe=Rn,vqe=on,gqe=vqe.String,kde=!!Object.getOwnPropertySymbols&&!mqe(function(){var t=Symbol("symbol detection");return!gqe(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&AJ&&AJ<41}),bqe=kde,Ode=bqe&&!Symbol.sham&&typeof Symbol.iterator=="symbol",yqe=ca,Sqe=ir,xqe=Df,Tqe=Ode,wqe=Object,aq=Tqe?function(t){return typeof t=="symbol"}:function(t){var e=yqe("Symbol");return Sqe(e)&&xqe(e.prototype,wqe(t))},Eqe=String,My=function(t){try{return Eqe(t)}catch{return"Object"}},Mqe=ir,Pqe=My,Rqe=TypeError,yi=function(t){if(Mqe(t))return t;throw new Rqe(Pqe(t)+" is not a function")},Vqe=yi,zqe=wl,im=function(t,e){var n=t[e];return zqe(n)?void 0:Vqe(n)},sO=Vn,aO=ir,oO=ei,kqe=TypeError,Oqe=function(t,e){var n,r;if(e==="string"&&aO(n=t.toString)&&!oO(r=sO(n,t))||aO(n=t.valueOf)&&!oO(r=sO(n,t))||e!=="string"&&aO(n=t.toString)&&!oO(r=sO(n,t)))return r;throw new kqe("Can't convert object to primitive value")},Ide={exports:{}},Ude=!1,GJ=on,Iqe=Object.defineProperty,oq=function(t,e){try{Iqe(GJ,t,{value:e,configurable:!0,writable:!0})}catch{GJ[t]=e}return e},Uqe=on,Nqe=oq,FJ="__core-js_shared__",jJ=Ide.exports=Uqe[FJ]||Nqe(FJ,{});(jJ.versions||(jJ.versions=[])).push({version:"3.40.0",mode:"global",copyright:"© 2014-2025 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.40.0/LICENSE",source:"https://github.com/zloirock/core-js"});var lq=Ide.exports,ZJ=lq,o9=function(t,e){return ZJ[t]||(ZJ[t]=e||{})},Lqe=cd,Xqe=Object,da=function(t){return Xqe(Lqe(t))},Cqe=tn,Kqe=da,qqe=Cqe({}.hasOwnProperty),Yi=Object.hasOwn||function(e,n){return qqe(Kqe(e),n)},Dqe=tn,Wqe=0,Aqe=Math.random(),Gqe=Dqe(1 .toString),l9=function(t){return"Symbol("+(t===void 0?"":t)+")_"+Gqe(++Wqe+Aqe,36)},Fqe=on,jqe=o9,JJ=Yi,Zqe=l9,Jqe=kde,Yqe=Ode,h1=Fqe.Symbol,lO=jqe("wks"),Bqe=Yqe?h1.for||h1:h1&&h1.withoutSetter||Zqe,Vr=function(t){return JJ(lO,t)||(lO[t]=Jqe&&JJ(h1,t)?h1[t]:Bqe("Symbol."+t)),lO[t]},Hqe=Vn,YJ=ei,BJ=aq,Qqe=im,_qe=Oqe,$qe=Vr,eDe=TypeError,tDe=$qe("toPrimitive"),Nde=function(t,e){if(!YJ(t)||BJ(t))return t;var n=Qqe(t,tDe),r;if(n){if(e===void 0&&(e="default"),r=Hqe(n,t,e),!YJ(r)||BJ(r))return r;throw new eDe("Can't convert object to primitive value")}return e===void 0&&(e="number"),_qe(t,e)},nDe=Nde,rDe=aq,uq=function(t){var e=nDe(t,"string");return rDe(e)?e:e+""},iDe=on,HJ=ei,$L=iDe.document,sDe=HJ($L)&&HJ($L.createElement),u9=function(t){return sDe?$L.createElement(t):{}},aDe=Gr,oDe=Rn,lDe=u9,Lde=!aDe&&!oDe(function(){return Object.defineProperty(lDe("div"),"a",{get:function(){return 7}}).a!==7}),uDe=Gr,cDe=Vn,dDe=sq,fDe=rm,hDe=wy,pDe=uq,mDe=Yi,vDe=Lde,QJ=Object.getOwnPropertyDescriptor;IT.f=uDe?QJ:function(e,n){if(e=hDe(e),n=pDe(n),vDe)try{return QJ(e,n)}catch{}if(mDe(e,n))return fDe(!cDe(dDe.f,e,n),e[n])};var po={},gDe=Gr,bDe=Rn,Xde=gDe&&bDe(function(){return Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype!==42}),yDe=ei,SDe=String,xDe=TypeError,dr=function(t){if(yDe(t))return t;throw new xDe(SDe(t)+" is not an object")},TDe=Gr,wDe=Lde,EDe=Xde,i5=dr,_J=uq,MDe=TypeError,uO=Object.defineProperty,PDe=Object.getOwnPropertyDescriptor,cO="enumerable",dO="configurable",fO="writable";po.f=TDe?EDe?function(e,n,r){if(i5(e),n=_J(n),i5(r),typeof e=="function"&&n==="prototype"&&"value"in r&&fO in r&&!r[fO]){var i=PDe(e,n);i&&i[fO]&&(e[n]=r.value,r={configurable:dO in r?r[dO]:i[dO],enumerable:cO in r?r[cO]:i[cO],writable:!1})}return uO(e,n,r)}:uO:function(e,n,r){if(i5(e),n=_J(n),i5(r),wDe)try{return uO(e,n,r)}catch{}if("get"in r||"set"in r)throw new MDe("Accessors not supported");return"value"in r&&(e[n]=r.value),e};var RDe=Gr,VDe=po,zDe=rm,$l=RDe?function(t,e,n){return VDe.f(t,e,zDe(1,n))}:function(t,e,n){return t[e]=n,t},Cde={exports:{}},e8=Gr,kDe=Yi,Kde=Function.prototype,ODe=e8&&Object.getOwnPropertyDescriptor,cq=kDe(Kde,"name"),IDe=cq&&(function(){}).name==="something",UDe=cq&&(!e8||e8&&ODe(Kde,"name").configurable),dq={EXISTS:cq,PROPER:IDe,CONFIGURABLE:UDe},NDe=tn,LDe=ir,t8=lq,XDe=NDe(Function.toString);LDe(t8.inspectSource)||(t8.inspectSource=function(t){return XDe(t)});var fq=t8.inspectSource,CDe=on,KDe=ir,$J=CDe.WeakMap,qde=KDe($J)&&/native code/.test(String($J)),qDe=o9,DDe=l9,eY=qDe("keys"),hq=function(t){return eY[t]||(eY[t]=DDe(t))},c9={},WDe=qde,Dde=on,ADe=ei,GDe=$l,hO=Yi,pO=lq,FDe=hq,jDe=c9,tY="Object already initialized",n8=Dde.TypeError,ZDe=Dde.WeakMap,dP,x6,fP,JDe=function(t){return fP(t)?x6(t):dP(t,{})},YDe=function(t){return function(e){var n;if(!ADe(e)||(n=x6(e)).type!==t)throw new n8("Incompatible receiver, "+t+" required");return n}};if(WDe||pO.state){var sc=pO.state||(pO.state=new ZDe);sc.get=sc.get,sc.has=sc.has,sc.set=sc.set,dP=function(t,e){if(sc.has(t))throw new n8(tY);return e.facade=t,sc.set(t,e),e},x6=function(t){return sc.get(t)||{}},fP=function(t){return sc.has(t)}}else{var yg=FDe("state");jDe[yg]=!0,dP=function(t,e){if(hO(t,yg))throw new n8(tY);return e.facade=t,GDe(t,yg,e),e},x6=function(t){return hO(t,yg)?t[yg]:{}},fP=function(t){return hO(t,yg)}}var Fs={set:dP,get:x6,has:fP,enforce:JDe,getterFor:YDe},pq=tn,BDe=Rn,HDe=ir,s5=Yi,r8=Gr,QDe=dq.CONFIGURABLE,_De=fq,Wde=Fs,$De=Wde.enforce,eWe=Wde.get,nY=String,R7=Object.defineProperty,tWe=pq("".slice),nWe=pq("".replace),rWe=pq([].join),iWe=r8&&!BDe(function(){return R7(function(){},"length",{value:8}).length!==8}),sWe=String(String).split("String"),aWe=Cde.exports=function(t,e,n){tWe(nY(e),0,7)==="Symbol("&&(e="["+nWe(nY(e),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),n&&n.getter&&(e="get "+e),n&&n.setter&&(e="set "+e),(!s5(t,"name")||QDe&&t.name!==e)&&(r8?R7(t,"name",{value:e,configurable:!0}):t.name=e),iWe&&n&&s5(n,"arity")&&t.length!==n.arity&&R7(t,"length",{value:n.arity});try{n&&s5(n,"constructor")&&n.constructor?r8&&R7(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch{}var r=$De(t);return s5(r,"source")||(r.source=rWe(sWe,typeof e=="string"?e:"")),t};Function.prototype.toString=aWe(function(){return HDe(this)&&eWe(this).source||_De(this)},"toString");var Ade=Cde.exports,oWe=ir,lWe=po,uWe=Ade,cWe=oq,mo=function(t,e,n,r){r||(r={});var i=r.enumerable,s=r.name!==void 0?r.name:e;if(oWe(n)&&uWe(n,s,r),r.global)i?t[e]=n:cWe(e,n);else{try{r.unsafe?t[e]&&(i=!0):delete t[e]}catch{}i?t[e]=n:lWe.f(t,e,{value:n,enumerable:!1,configurable:!r.nonConfigurable,writable:!r.nonWritable})}return t},Py={},dWe=Math.ceil,fWe=Math.floor,hWe=Math.trunc||function(e){var n=+e;return(n>0?fWe:dWe)(n)},pWe=hWe,Bu=function(t){var e=+t;return e!==e||e===0?0:pWe(e)},mWe=Bu,vWe=Math.max,gWe=Math.min,mq=function(t,e){var n=mWe(t);return n<0?vWe(n+e,0):gWe(n,e)},bWe=Bu,yWe=Math.min,Ry=function(t){var e=bWe(t);return e>0?yWe(e,9007199254740991):0},SWe=Ry,Ca=function(t){return SWe(t.length)},xWe=wy,TWe=mq,wWe=Ca,rY=function(t){return function(e,n,r){var i=xWe(e),s=wWe(i);if(s===0)return!t&&-1;var a=TWe(r,s),o;if(t&&n!==n){for(;s>a;)if(o=i[a++],o!==o)return!0}else for(;s>a;a++)if((t||a in i)&&i[a]===n)return t||a||0;return!t&&-1}},Gde={includes:rY(!0),indexOf:rY(!1)},EWe=tn,mO=Yi,MWe=wy,PWe=Gde.indexOf,RWe=c9,iY=EWe([].push),Fde=function(t,e){var n=MWe(t),r=0,i=[],s;for(s in n)!mO(RWe,s)&&mO(n,s)&&iY(i,s);for(;e.length>r;)mO(n,s=e[r++])&&(~PWe(i,s)||iY(i,s));return i},vq=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],VWe=Fde,zWe=vq,kWe=zWe.concat("length","prototype");Py.f=Object.getOwnPropertyNames||function(e){return VWe(e,kWe)};var gq={};gq.f=Object.getOwnPropertySymbols;var OWe=ca,IWe=tn,UWe=Py,NWe=gq,LWe=dr,XWe=IWe([].concat),CWe=OWe("Reflect","ownKeys")||function(e){var n=UWe.f(LWe(e)),r=NWe.f;return r?XWe(n,r(e)):n},sY=Yi,KWe=CWe,qWe=IT,DWe=po,d9=function(t,e,n){for(var r=KWe(e),i=DWe.f,s=qWe.f,a=0;akAe)throw zAe("Maximum allowed index exceeded");return t},IAe=ud,UAe=tn,bq=function(t){if(IAe(t)==="Function")return UAe(t)},lY=bq,NAe=yi,LAe=s9,XAe=lY(lY.bind),Vi=function(t,e){return NAe(t),e===void 0?t:LAe?XAe(t,e):function(){return t.apply(e,arguments)}},CAe=Zde,KAe=Ca,qAe=OAe,DAe=Vi,Jde=function(t,e,n,r,i,s,a,o){for(var l=i,u=0,c=a?DAe(a,o):!1,d,f;u0&&CAe(d)?(f=KAe(d),l=Jde(t,e,d,f,l,s-1)-1):(qAe(l+1),t[l]=d),l++),u++;return l},Yde=Jde,WAe=tn,AAe=Rn,Bde=ir,GAe=sm,FAe=ca,jAe=fq,Hde=function(){},Qde=FAe("Reflect","construct"),yq=/^\s*(?:class|function)\b/,ZAe=WAe(yq.exec),JAe=!yq.test(Hde),IS=function(e){if(!Bde(e))return!1;try{return Qde(Hde,[],e),!0}catch{return!1}},_de=function(e){if(!Bde(e))return!1;switch(GAe(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return JAe||!!ZAe(yq,jAe(e))}catch{return!0}};_de.sham=!0;var NT=!Qde||AAe(function(){var t;return IS(IS.call)||!IS(Object)||!IS(function(){t=!0})||t})?_de:IS,uY=Zde,YAe=NT,BAe=ei,HAe=Vr,QAe=HAe("species"),cY=Array,_Ae=function(t){var e;return uY(t)&&(e=t.constructor,YAe(e)&&(e===cY||uY(e.prototype))?e=void 0:BAe(e)&&(e=e[QAe],e===null&&(e=void 0))),e===void 0?cY:e},$Ae=_Ae,Sq=function(t,e){return new($Ae(t))(e===0?0:e)},eGe=rt,tGe=Yde,nGe=da,rGe=Ca,iGe=Bu,sGe=Sq;eGe({target:"Array",proto:!0},{flat:function(){var e=arguments.length?arguments[0]:void 0,n=nGe(this),r=rGe(n),i=sGe(n,0);return i.length=tGe(i,n,n,r,0,e===void 0?1:iGe(e)),i}});var aGe=rt,oGe=Yde,lGe=yi,uGe=da,cGe=Ca,dGe=Sq;aGe({target:"Array",proto:!0},{flatMap:function(e){var n=uGe(this),r=cGe(n),i;return lGe(e),i=dGe(n,0),i.length=oGe(i,n,n,r,0,1,e,arguments.length>1?arguments[1]:void 0),i}});var $de={},fGe=Fde,hGe=vq,efe=Object.keys||function(e){return fGe(e,hGe)},pGe=Gr,mGe=Xde,vGe=po,gGe=dr,bGe=wy,yGe=efe;$de.f=pGe&&!mGe?Object.defineProperties:function(e,n){gGe(e);for(var r=bGe(n),i=yGe(n),s=i.length,a=0,o;s>a;)vGe.f(e,o=i[a++],r[o]);return e};var SGe=ca,tfe=SGe("document","documentElement"),xGe=dr,TGe=$de,dY=vq,wGe=c9,EGe=tfe,MGe=u9,PGe=hq,fY=">",hY="<",i8="prototype",s8="script",nfe=PGe("IE_PROTO"),vO=function(){},rfe=function(t){return hY+s8+fY+t+hY+"/"+s8+fY},pY=function(t){t.write(rfe("")),t.close();var e=t.parentWindow.Object;return t=null,e},RGe=function(){var t=MGe("iframe"),e="java"+s8+":",n;return t.style.display="none",EGe.appendChild(t),t.src=String(e),n=t.contentWindow.document,n.open(),n.write(rfe("document.F=Object")),n.close(),n.F},u5,z7=function(){try{u5=new ActiveXObject("htmlfile")}catch{}z7=typeof document<"u"?document.domain&&u5?pY(u5):RGe():pY(u5);for(var t=dY.length;t--;)delete z7[i8][dY[t]];return z7()};wGe[nfe]=!0;var dd=Object.create||function(e,n){var r;return e!==null?(vO[i8]=xGe(e),r=new vO,vO[i8]=null,r[nfe]=e):r=z7(),n===void 0?r:TGe.f(r,n)},VGe=Vr,zGe=dd,kGe=po.f,a8=VGe("unscopables"),o8=Array.prototype;o8[a8]===void 0&&kGe(o8,a8,{configurable:!0,value:zGe(null)});var Vy=function(t){o8[a8][t]=!0},OGe=rt,IGe=Gde.includes,UGe=Rn,NGe=Vy,LGe=UGe(function(){return!Array(1).includes()});OGe({target:"Array",proto:!0,forced:LGe},{includes:function(e){return IGe(this,e,arguments.length>1?arguments[1]:void 0)}});NGe("includes");var XGe=yi,CGe=da,KGe=a9,qGe=Ca,mY=TypeError,vY="Reduce of empty array with no initial value",gY=function(t){return function(e,n,r,i){var s=CGe(e),a=KGe(s),o=qGe(s);if(XGe(n),o===0&&r<2)throw new mY(vY);var l=t?o-1:0,u=t?-1:1;if(r<2)for(;;){if(l in a){i=a[l],l+=u;break}if(l+=u,t?l<0:o<=l)throw new mY(vY)}for(;t?l>=0:o>l;l+=u)l in a&&(i=n(i,a[l],l,s));return i}},ife={left:gY(!1),right:gY(!0)},DGe=Rn,xq=function(t,e){var n=[][t];return!!n&&DGe(function(){n.call(null,e||function(){return 1},1)})},US=on,WGe=Wf,AGe=ud,c5=function(t){return WGe.slice(0,t.length)===t},Tq=function(){return c5("Bun/")?"BUN":c5("Cloudflare-Workers")?"CLOUDFLARE":c5("Deno/")?"DENO":c5("Node.js/")?"NODE":US.Bun&&typeof Bun.version=="string"?"BUN":US.Deno&&typeof Deno.version=="object"?"DENO":AGe(US.process)==="process"?"NODE":US.window&&US.document?"BROWSER":"REST"}(),GGe=Tq,LT=GGe==="NODE",FGe=rt,jGe=ife.left,ZGe=xq,bY=Ey,JGe=LT,YGe=!JGe&&bY>79&&bY<83,BGe=YGe||!ZGe("reduce");FGe({target:"Array",proto:!0,forced:BGe},{reduce:function(e){var n=arguments.length;return jGe(this,e,n,n>1?arguments[1]:void 0)}});var HGe=rt,QGe=ife.right,_Ge=xq,yY=Ey,$Ge=LT,eFe=!$Ge&&yY>79&&yY<83,tFe=eFe||!_Ge("reduceRight");HGe({target:"Array",proto:!0,forced:tFe},{reduceRight:function(e){return QGe(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}});var SY=My,nFe=TypeError,rFe=function(t,e){if(!delete t[e])throw new nFe("Cannot delete property "+SY(e)+" of "+SY(t))},iFe=tn,w0=iFe([].slice),xY=w0,sFe=Math.floor,l8=function(t,e){var n=t.length;if(n<8)for(var r=1,i,s;r0;)t[s]=t[--s];s!==r++&&(t[s]=i)}else for(var a=sFe(n/2),o=l8(xY(t,0,a),e),l=l8(xY(t,a),e),u=o.length,c=l.length,d=0,f=0;d3)){if(mFe)return!0;if(VY)return VY<603;var t="",e,n,r,i;for(e=65;e<76;e++){switch(n=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:r=3;break;case 68:case 71:r=4;break;default:r=2}for(i=0;i<47;i++)Hh.push({k:n+i,v:r})}for(Hh.sort(function(s,a){return a.v-s.v}),i=0;iMY(n)?1:-1}};uFe({target:"Array",proto:!0,forced:SFe},{sort:function(e){e!==void 0&&cFe(e);var n=dFe(this);if(ufe)return e===void 0?zY(n):zY(n,e);var r=[],i=EY(n),s,a;for(a=0;a0?(l=o/a,r+=l*l):r+=o;return a===1/0?1/0:a*PFe(r)}});var zy={},VFe=Vr,zFe=zy,kFe=VFe("iterator"),OFe=Array.prototype,Mq=function(t){return t!==void 0&&(zFe.Array===t||OFe[kFe]===t)},IFe=sm,OY=im,UFe=wl,NFe=zy,LFe=Vr,XFe=LFe("iterator"),XT=function(t){if(!UFe(t))return OY(t,XFe)||OY(t,"@@iterator")||NFe[IFe(t)]},CFe=Vn,KFe=yi,qFe=dr,DFe=My,WFe=XT,AFe=TypeError,CT=function(t,e){var n=arguments.length<2?WFe(t):e;if(KFe(n))return qFe(CFe(n,t));throw new AFe(DFe(t)+" is not iterable")},GFe=Vn,IY=dr,FFe=im,h9=function(t,e,n){var r,i;IY(t);try{if(r=FFe(t,"return"),!r){if(e==="throw")throw n;return n}r=GFe(r,t)}catch(s){i=!0,r=s}if(e==="throw")throw n;if(i)throw r;return IY(r),n},jFe=Vi,ZFe=Vn,JFe=dr,YFe=My,BFe=Mq,HFe=Ca,UY=Df,QFe=CT,_Fe=XT,NY=h9,$Fe=TypeError,k7=function(t,e){this.stopped=t,this.result=e},LY=k7.prototype,Jo=function(t,e,n){var r=n&&n.that,i=!!(n&&n.AS_ENTRIES),s=!!(n&&n.IS_RECORD),a=!!(n&&n.IS_ITERATOR),o=!!(n&&n.INTERRUPTED),l=jFe(e,r),u,c,d,f,h,p,m,v=function(b){return u&&NY(u,"normal",b),new k7(!0,b)},g=function(b){return i?(JFe(b),o?l(b[0],b[1],v):l(b[0],b[1])):o?l(b,v):l(b)};if(s)u=t.iterator;else if(a)u=t;else{if(c=_Fe(t),!c)throw new $Fe(YFe(t)+" is not iterable");if(BFe(c)){for(d=0,f=HFe(t);f>d;d++)if(h=g(t[d]),h&&UY(LY,h))return h;return new k7(!1)}u=QFe(t,c)}for(p=s?t.next:u.next;!(m=ZFe(p,u)).done;){try{h=g(m.value)}catch(b){NY(u,"throw",b)}if(typeof h=="object"&&h&&UY(LY,h))return h}return new k7(!1)},eje=Gr,tje=po,nje=rm,cfe=function(t,e,n){eje?tje.f(t,e,nje(0,n)):t[e]=n},rje=rt,ije=Jo,sje=cfe;rje({target:"Object",stat:!0},{fromEntries:function(e){var n={};return ije(e,function(r,i){sje(n,r,i)},{AS_ENTRIES:!0}),n}});var aje=tn,oje=yi,dfe=function(t,e,n){try{return aje(oje(Object.getOwnPropertyDescriptor(t,e)[n]))}catch{}},lje=ei,uje=function(t){return lje(t)||t===null},cje=uje,dje=String,fje=TypeError,hje=function(t){if(cje(t))return t;throw new fje("Can't set "+dje(t)+" as a prototype")},pje=dfe,mje=ei,vje=cd,gje=hje,E0=Object.setPrototypeOf||("__proto__"in{}?function(){var t=!1,e={},n;try{n=pje(Object.prototype,"__proto__","set"),n(e,[]),t=e instanceof Array}catch{}return function(i,s){return vje(i),gje(s),mje(i)&&(t?n(i,s):i.__proto__=s),i}}():void 0),bje=po.f,yje=Yi,Sje=Vr,XY=Sje("toStringTag"),am=function(t,e,n){t&&!n&&(t=t.prototype),t&&!yje(t,XY)&&bje(t,XY,{configurable:!0,value:e})},xje=ca,Tje=eu,wje=Vr,Eje=Gr,CY=wje("species"),KT=function(t){var e=xje(t);Eje&&e&&!e[CY]&&Tje(e,CY,{configurable:!0,get:function(){return this}})},Mje=Df,Pje=TypeError,Af=function(t,e){if(Mje(e,t))return t;throw new Pje("Incorrect invocation")},Rje=NT,Vje=My,zje=TypeError,ffe=function(t){if(Rje(t))return t;throw new zje(Vje(t)+" is not a constructor")},KY=dr,kje=ffe,Oje=wl,Ije=Vr,Uje=Ije("species"),Pq=function(t,e){var n=KY(t).constructor,r;return n===void 0||Oje(r=KY(n)[Uje])?e:kje(r)},Nje=s9,hfe=Function.prototype,qY=hfe.apply,DY=hfe.call,ky=typeof Reflect=="object"&&Reflect.apply||(Nje?DY.bind(qY):function(){return DY.apply(qY,arguments)}),Lje=TypeError,qT=function(t,e){if(tb)","g");return t.exec("b").groups.a!=="b"||"b".replace(t,"$c")!=="bc"}),WJe=Gr,qq=on,AT=tn,AJe=f9,GJe=g9,FJe=$l,jJe=dd,ZJe=Py.f,mB=Df,JJe=Uq,vB=vo,YJe=Lq,Afe=qfe,BJe=NJe,HJe=mo,QJe=Rn,_Je=Yi,$Je=Fs.enforce,eYe=KT,tYe=Vr,Gfe=Dfe,Ffe=Wfe,nYe=tYe("match"),mp=qq.RegExp,Jg=mp.prototype,rYe=qq.SyntaxError,iYe=AT(Jg.exec),vP=AT("".charAt),gB=AT("".replace),bB=AT("".indexOf),yB=AT("".slice),sYe=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,zv=/a/g,VO=/a/g,aYe=new mp(zv)!==zv,jfe=Afe.MISSED_STICKY,oYe=Afe.UNSUPPORTED_Y,lYe=WJe&&(!aYe||jfe||Gfe||Ffe||QJe(function(){return VO[nYe]=!1,mp(zv)!==zv||mp(VO)===VO||String(mp(zv,"i"))!=="/a/i"})),uYe=function(t){for(var e=t.length,n=0,r="",i=!1,s;n<=e;n++){if(s=vP(t,n),s==="\\"){r+=s+vP(t,++n);continue}!i&&s==="."?r+="[\\s\\S]":(s==="["?i=!0:s==="]"&&(i=!1),r+=s)}return r},cYe=function(t){for(var e=t.length,n=0,r="",i=[],s=jJe(null),a=!1,o=!1,l=0,u="",c;n<=e;n++){if(c=vP(t,n),c==="\\")c+=vP(t,++n);else if(c==="]")a=!1;else if(!a)switch(!0){case c==="[":a=!0;break;case c==="(":if(r+=c,yB(t,n+1,n+3)==="?:")continue;iYe(sYe,yB(t,n+1))&&(n+=2,o=!0),l++;continue;case(c===">"&&o):if(u===""||_Je(s,u))throw new rYe("Invalid capture group name");s[u]=!0,i[i.length]=[u,l],o=!1,u="";continue}o?u+=c:r+=c}return[r,i]};if(AJe("RegExp",lYe)){for(var Xm=function(e,n){var r=mB(Jg,this),i=JJe(e),s=n===void 0,a=[],o=e,l,u,c,d,f,h;if(!r&&i&&s&&e.constructor===Xm)return e;if((i||mB(Jg,e))&&(e=e.source,s&&(n=YJe(o))),e=e===void 0?"":vB(e),n=n===void 0?"":vB(n),o=e,Gfe&&"dotAll"in zv&&(u=!!n&&bB(n,"s")>-1,u&&(n=gB(n,/s/g,""))),l=n,jfe&&"sticky"in zv&&(c=!!n&&bB(n,"y")>-1,c&&oYe&&(n=gB(n,/y/g,""))),Ffe&&(d=cYe(e),e=d[0],a=d[1]),f=GJe(mp(e,n),r?this:Jg,Xm),(u||c||a.length)&&(h=$Je(f),u&&(h.dotAll=!0,h.raw=Xm(uYe(e),l)),c&&(h.sticky=!0),a.length&&(h.groups=a)),e!==o)try{FJe(f,"source",o===""?"(?:)":o)}catch{}return f},SB=ZJe(mp),xB=0;SB.length>xB;)BJe(Xm,mp,SB[xB++]);Jg.constructor=Xm,Xm.prototype=Jg,HJe(qq,"RegExp",Xm,{constructor:!0})}eYe("RegExp");var m1=Vn,b9=tn,dYe=vo,fYe=Nq,hYe=qfe,pYe=o9,mYe=dd,vYe=Fs.get,gYe=Dfe,bYe=Wfe,yYe=pYe("native-string-replace",String.prototype.replace),gP=RegExp.prototype.exec,b8=gP,SYe=b9("".charAt),xYe=b9("".indexOf),TYe=b9("".replace),zO=b9("".slice),y8=function(){var t=/a/,e=/b*/g;return m1(gP,t,"a"),m1(gP,e,"a"),t.lastIndex!==0||e.lastIndex!==0}(),Zfe=hYe.BROKEN_CARET,S8=/()??/.exec("")[1]!==void 0,wYe=y8||S8||Zfe||gYe||bYe;wYe&&(b8=function(e){var n=this,r=vYe(n),i=dYe(e),s=r.raw,a,o,l,u,c,d,f;if(s)return s.lastIndex=n.lastIndex,a=m1(b8,s,i),n.lastIndex=s.lastIndex,a;var h=r.groups,p=Zfe&&n.sticky,m=m1(fYe,n),v=n.source,g=0,b=i;if(p&&(m=TYe(m,"y",""),xYe(m,"g")===-1&&(m+="g"),b=zO(i,n.lastIndex),n.lastIndex>0&&(!n.multiline||n.multiline&&SYe(i,n.lastIndex-1)!==` -`)&&(v="(?: "+v+")",b=" "+b,g++),o=new RegExp("^(?:"+v+")",m)),S8&&(o=new RegExp("^"+v+"$(?!\\s)",m)),y8&&(l=n.lastIndex),u=m1(gP,p?o:n,b),p?u?(u.input=zO(u.input,g),u[0]=zO(u[0],g),u.index=n.lastIndex,n.lastIndex+=u[0].length):n.lastIndex=0:y8&&u&&(n.lastIndex=n.global?u.index+u[0].length:l),S8&&u&&u.length>1&&m1(yYe,u[0],o,function(){for(c=1;c=s?t?"":void 0:(a=PB(r,i),a<55296||a>56319||i+1===s||(o=PB(r,i+1))<56320||o>57343?t?KYe(r,i):a:t?qYe(r,i,i+2):(a-55296<<10)+(o-56320)+65536)}},GT={codeAt:RB(!1),charAt:RB(!0)},DYe=GT.charAt,Hfe=function(t,e,n){return e+(n?DYe(t,e).length:1)},Aq=tn,WYe=da,AYe=Math.floor,OO=Aq("".charAt),GYe=Aq("".replace),IO=Aq("".slice),FYe=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,jYe=/\$([$&'`]|\d{1,2})/g,Qfe=function(t,e,n,r,i,s){var a=n+t.length,o=r.length,l=jYe;return i!==void 0&&(i=WYe(i),l=FYe),GYe(s,l,function(u,c){var d;switch(OO(c,0)){case"$":return"$";case"&":return t;case"`":return IO(e,0,n);case"'":return IO(e,a);case"<":d=i[IO(c,1,-1)];break;default:var f=+c;if(f===0)return u;if(f>o){var h=AYe(f/10);return h===0?u:h<=o?r[h-1]===void 0?OO(c,1):r[h-1]+OO(c,1):u}d=r[f-1]}return d===void 0?"":d})},VB=Vn,ZYe=dr,JYe=ir,YYe=ud,BYe=Dq,HYe=TypeError,_fe=function(t,e){var n=t.exec;if(JYe(n)){var r=VB(n,t,e);return r!==null&&ZYe(r),r}if(YYe(t)==="RegExp")return VB(BYe,t,e);throw new HYe("RegExp#exec called on incompatible receiver")},QYe=ky,zB=Vn,y9=tn,_Ye=NYe,$Ye=Rn,eBe=dr,tBe=ir,nBe=wl,rBe=Bu,iBe=Ry,xg=vo,sBe=cd,aBe=Hfe,oBe=im,lBe=Qfe,uBe=_fe,cBe=Vr,x8=cBe("replace"),dBe=Math.max,fBe=Math.min,hBe=y9([].concat),UO=y9([].push),kB=y9("".indexOf),OB=y9("".slice),pBe=function(t){return t===void 0?t:String(t)},mBe=function(){return"a".replace(/./,"$0")==="$0"}(),IB=function(){return/./[x8]?/./[x8]("a","$0")==="":!1}(),vBe=!$Ye(function(){var t=/./;return t.exec=function(){var e=[];return e.groups={a:"7"},e},"".replace(t,"$")!=="7"});_Ye("replace",function(t,e,n){var r=IB?"$":"$0";return[function(s,a){var o=sBe(this),l=nBe(s)?void 0:oBe(s,x8);return l?zB(l,s,o,a):zB(e,xg(o),s,a)},function(i,s){var a=eBe(this),o=xg(i);if(typeof s=="string"&&kB(s,r)===-1&&kB(s,"$<")===-1){var l=n(e,a,o,s);if(l.done)return l.value}var u=tBe(s);u||(s=xg(s));var c=a.global,d;c&&(d=a.unicode,a.lastIndex=0);for(var f=[],h;h=uBe(a,o),!(h===null||(UO(f,h),!c));){var p=xg(h[0]);p===""&&(a.lastIndex=aBe(o,iBe(a.lastIndex),d))}for(var m="",v=0,g=0;g=v&&(m+=OB(o,v,y)+T,v=y+b.length)}return m+OB(o,v)}]},!vBe||!mBe||IB);var T8={exports:{}},$fe=typeof ArrayBuffer<"u"&&typeof DataView<"u",gBe=Rn,bBe=!gBe(function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}),yBe=Yi,SBe=ir,xBe=da,TBe=hq,wBe=bBe,UB=TBe("IE_PROTO"),w8=Object,EBe=w8.prototype,om=wBe?w8.getPrototypeOf:function(t){var e=xBe(t);if(yBe(e,UB))return e[UB];var n=e.constructor;return SBe(n)&&e instanceof n?n.prototype:e instanceof w8?EBe:null},MBe=$fe,Gq=Gr,uo=on,ehe=ir,S9=ei,qp=Yi,Fq=sm,PBe=My,RBe=$l,E8=mo,VBe=eu,zBe=Df,x9=om,Iy=E0,kBe=Vr,OBe=l9,the=Fs,nhe=the.enforce,IBe=the.get,bP=uo.Int8Array,M8=bP&&bP.prototype,NB=uo.Uint8ClampedArray,LB=NB&&NB.prototype,Kc=bP&&x9(bP),ku=M8&&x9(M8),UBe=Object.prototype,jq=uo.TypeError,XB=kBe("toStringTag"),P8=OBe("TYPED_ARRAY_TAG"),yP="TypedArrayConstructor",Tf=MBe&&!!Iy&&Fq(uo.opera)!=="Opera",rhe=!1,Lo,Qh,X1,wf={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},Zq={BigInt64Array:8,BigUint64Array:8},NBe=function(e){if(!S9(e))return!1;var n=Fq(e);return n==="DataView"||qp(wf,n)||qp(Zq,n)},ihe=function(t){var e=x9(t);if(S9(e)){var n=IBe(e);return n&&qp(n,yP)?n[yP]:ihe(e)}},she=function(t){if(!S9(t))return!1;var e=Fq(t);return qp(wf,e)||qp(Zq,e)},LBe=function(t){if(she(t))return t;throw new jq("Target is not a typed array")},XBe=function(t){if(ehe(t)&&(!Iy||zBe(Kc,t)))return t;throw new jq(PBe(t)+" is not a typed array constructor")},CBe=function(t,e,n,r){if(Gq){if(n)for(var i in wf){var s=uo[i];if(s&&qp(s.prototype,t))try{delete s.prototype[t]}catch{try{s.prototype[t]=e}catch{}}}(!ku[t]||n)&&E8(ku,t,n?e:Tf&&M8[t]||e,r)}},KBe=function(t,e,n){var r,i;if(Gq){if(Iy){if(n){for(r in wf)if(i=uo[r],i&&qp(i,t))try{delete i[t]}catch{}}if(!Kc[t]||n)try{return E8(Kc,t,n?e:Tf&&Kc[t]||e)}catch{}else return}for(r in wf)i=uo[r],i&&(!i[t]||n)&&E8(i,t,e)}};for(Lo in wf)Qh=uo[Lo],X1=Qh&&Qh.prototype,X1?nhe(X1)[yP]=Qh:Tf=!1;for(Lo in Zq)Qh=uo[Lo],X1=Qh&&Qh.prototype,X1&&(nhe(X1)[yP]=Qh);if((!Tf||!ehe(Kc)||Kc===Function.prototype)&&(Kc=function(){throw new jq("Incorrect invocation")},Tf))for(Lo in wf)uo[Lo]&&Iy(uo[Lo],Kc);if((!Tf||!ku||ku===UBe)&&(ku=Kc.prototype,Tf))for(Lo in wf)uo[Lo]&&Iy(uo[Lo].prototype,ku);Tf&&x9(LB)!==ku&&Iy(LB,ku);if(Gq&&!qp(ku,XB)){rhe=!0,VBe(ku,XB,{configurable:!0,get:function(){return S9(this)?this[P8]:void 0}});for(Lo in wf)uo[Lo]&&RBe(uo[Lo],P8,Lo)}var M0={NATIVE_ARRAY_BUFFER_VIEWS:Tf,TYPED_ARRAY_TAG:rhe&&P8,aTypedArray:LBe,aTypedArrayConstructor:XBe,exportTypedArrayMethod:CBe,exportTypedArrayStaticMethod:KBe,getTypedArrayConstructor:ihe,isView:NBe,isTypedArray:she,TypedArray:Kc,TypedArrayPrototype:ku},ahe=on,NO=Rn,qBe=Iq,DBe=M0.NATIVE_ARRAY_BUFFER_VIEWS,WBe=ahe.ArrayBuffer,Cm=ahe.Int8Array,Jq=!DBe||!NO(function(){Cm(1)})||!NO(function(){new Cm(-1)})||!qBe(function(t){new Cm,new Cm(null),new Cm(1.5),new Cm(t)},!0)||NO(function(){return new Cm(new WBe(2),1,void 0).length!==1}),ABe=mo,Uy=function(t,e,n){for(var r in e)ABe(t,r,e[r],n);return t},GBe=Bu,FBe=Ry,jBe=RangeError,ohe=function(t){if(t===void 0)return 0;var e=GBe(t),n=FBe(e);if(e!==n)throw new jBe("Wrong length or index");return n},ZBe=Math.sign||function(e){var n=+e;return n===0||n!==n?n:n<0?-1:1},JBe=2220446049250313e-31,CB=1/JBe,YBe=function(t){return t+CB-CB},BBe=ZBe,HBe=YBe,QBe=Math.abs,_Be=2220446049250313e-31,$Be=function(t,e,n,r){var i=+t,s=QBe(i),a=BBe(i);if(sn||l!==l?a*(1/0):a*l},eHe=$Be,tHe=11920928955078125e-23,nHe=34028234663852886e22,rHe=11754943508222875e-54,lhe=Math.fround||function(e){return eHe(e,tHe,nHe,rHe)},iHe=Array,sHe=Math.abs,Wd=Math.pow,aHe=Math.floor,oHe=Math.log,lHe=Math.LN2,uHe=function(t,e,n){var r=iHe(n),i=n*8-e-1,s=(1<>1,o=e===23?Wd(2,-24)-Wd(2,-77):0,l=t<0||t===0&&1/t<0?1:0,u=0,c,d,f;for(t=sHe(t),t!==t||t===1/0?(d=t!==t?1:0,c=s):(c=aHe(oHe(t)/lHe),f=Wd(2,-c),t*f<1&&(c--,f*=2),c+a>=1?t+=o/f:t+=o*Wd(2,1-a),t*f>=2&&(c++,f/=2),c+a>=s?(d=0,c=s):c+a>=1?(d=(t*f-1)*Wd(2,e),c+=a):(d=t*Wd(2,a-1)*Wd(2,e),c=0));e>=8;)r[u++]=d&255,d/=256,e-=8;for(c=c<0;)r[u++]=c&255,c/=256,i-=8;return r[u-1]|=l*128,r},cHe=function(t,e){var n=t.length,r=n*8-e-1,i=(1<>1,a=r-7,o=n-1,l=t[o--],u=l&127,c;for(l>>=7;a>0;)u=u*256+t[o--],a-=8;for(c=u&(1<<-a)-1,u>>=-a,a+=e;a>0;)c=c*256+t[o--],a-=8;if(u===0)u=1-s;else{if(u===i)return c?NaN:l?-1/0:1/0;c+=Wd(2,e),u-=s}return(l?-1:1)*c*Wd(2,u-e)},dHe={pack:uHe,unpack:cHe},fHe=da,KB=mq,hHe=Ca,pHe=function(e){for(var n=fHe(this),r=hHe(n),i=arguments.length,s=KB(i>1?arguments[1]:void 0,r),a=i>2?arguments[2]:void 0,o=a===void 0?r:KB(a,r);o>s;)n[s++]=e;return n},T9=on,Yq=tn,LO=Gr,mHe=$fe,uhe=dq,vHe=$l,gHe=eu,qB=Uy,XO=Rn,g5=Af,bHe=Bu,yHe=Ry,SP=ohe,SHe=lhe,che=dHe,xHe=om,DB=E0,THe=pHe,wHe=w0,EHe=g9,MHe=d9,dhe=am,Bq=Fs,PHe=uhe.PROPER,WB=uhe.CONFIGURABLE,C1="ArrayBuffer",w9="DataView",K1="prototype",RHe="Wrong length",fhe="Wrong index",AB=Bq.getterFor(C1),cx=Bq.getterFor(w9),GB=Bq.set,gu=T9[C1],nl=gu,Tg=nl&&nl[K1],kc=T9[w9],Km=kc&&kc[K1],FB=Object.prototype,VHe=T9.Array,xP=T9.RangeError,zHe=Yq(THe),kHe=Yq([].reverse),hhe=che.pack,jB=che.unpack,ZB=function(t){return[t&255]},JB=function(t){return[t&255,t>>8&255]},YB=function(t){return[t&255,t>>8&255,t>>16&255,t>>24&255]},BB=function(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]},OHe=function(t){return hhe(SHe(t),23,4)},IHe=function(t){return hhe(t,52,8)},b5=function(t,e,n){gHe(t[K1],e,{configurable:!0,get:function(){return n(this)[e]}})},dh=function(t,e,n,r){var i=cx(t),s=SP(n),a=!!r;if(s+e>i.byteLength)throw new xP(fhe);var o=i.bytes,l=s+i.byteOffset,u=wHe(o,l,l+e);return a?u:kHe(u)},fh=function(t,e,n,r,i,s){var a=cx(t),o=SP(n),l=r(+i),u=!!s;if(o+e>a.byteLength)throw new xP(fhe);for(var c=a.bytes,d=o+a.byteOffset,f=0;fs)throw new xP("Wrong offset");if(r=r===void 0?s-a:yHe(r),a+r>s)throw new xP(RHe);GB(this,{type:w9,buffer:e,byteLength:r,byteOffset:a,bytes:i.bytes}),LO||(this.buffer=e,this.byteLength=r,this.byteOffset=a)},Km=kc[K1],LO&&(b5(nl,"byteLength",AB),b5(kc,"buffer",cx),b5(kc,"byteLength",cx),b5(kc,"byteOffset",cx)),qB(Km,{getInt8:function(e){return dh(this,1,e)[0]<<24>>24},getUint8:function(e){return dh(this,1,e)[0]},getInt16:function(e){var n=dh(this,2,e,arguments.length>1?arguments[1]:!1);return(n[1]<<8|n[0])<<16>>16},getUint16:function(e){var n=dh(this,2,e,arguments.length>1?arguments[1]:!1);return n[1]<<8|n[0]},getInt32:function(e){return BB(dh(this,4,e,arguments.length>1?arguments[1]:!1))},getUint32:function(e){return BB(dh(this,4,e,arguments.length>1?arguments[1]:!1))>>>0},getFloat32:function(e){return jB(dh(this,4,e,arguments.length>1?arguments[1]:!1),23)},getFloat64:function(e){return jB(dh(this,8,e,arguments.length>1?arguments[1]:!1),52)},setInt8:function(e,n){fh(this,1,e,ZB,n)},setUint8:function(e,n){fh(this,1,e,ZB,n)},setInt16:function(e,n){fh(this,2,e,JB,n,arguments.length>2?arguments[2]:!1)},setUint16:function(e,n){fh(this,2,e,JB,n,arguments.length>2?arguments[2]:!1)},setInt32:function(e,n){fh(this,4,e,YB,n,arguments.length>2?arguments[2]:!1)},setUint32:function(e,n){fh(this,4,e,YB,n,arguments.length>2?arguments[2]:!1)},setFloat32:function(e,n){fh(this,4,e,OHe,n,arguments.length>2?arguments[2]:!1)},setFloat64:function(e,n){fh(this,8,e,IHe,n,arguments.length>2?arguments[2]:!1)}});else{var HB=PHe&&gu.name!==C1;!XO(function(){gu(1)})||!XO(function(){new gu(-1)})||XO(function(){return new gu,new gu(1.5),new gu(NaN),gu.length!==1||HB&&!WB})?(nl=function(e){return g5(this,Tg),EHe(new gu(SP(e)),this,nl)},nl[K1]=Tg,Tg.constructor=nl,MHe(nl,gu)):HB&&WB&&vHe(gu,"name",C1),DB&&xHe(Km)!==FB&&DB(Km,FB);var y5=new kc(new nl(2)),QB=Yq(Km.setInt8);y5.setInt8(0,2147483648),y5.setInt8(1,2147483649),(y5.getInt8(0)||!y5.getInt8(1))&&qB(Km,{setInt8:function(e,n){QB(this,e,n<<24>>24)},setUint8:function(e,n){QB(this,e,n<<24>>24)}},{unsafe:!0})}dhe(nl,C1);dhe(kc,w9);var UHe={ArrayBuffer:nl,DataView:kc},NHe=ei,LHe=Math.floor,XHe=Number.isInteger||function(e){return!NHe(e)&&isFinite(e)&&LHe(e)===e},CHe=Bu,KHe=RangeError,qHe=function(t){var e=CHe(t);if(e<0)throw new KHe("The argument can't be less than 0");return e},DHe=qHe,WHe=RangeError,phe=function(t,e){var n=DHe(t);if(n%e)throw new WHe("Wrong offset");return n},AHe=Math.round,GHe=function(t){var e=AHe(t);return e<0?0:e>255?255:e&255},FHe=sm,jHe=function(t){var e=FHe(t);return e==="BigInt64Array"||e==="BigUint64Array"},ZHe=Nde,JHe=TypeError,YHe=function(t){var e=ZHe(t,"number");if(typeof e=="number")throw new JHe("Can't convert number to bigint");return BigInt(e)},BHe=Vi,HHe=Vn,QHe=ffe,_He=da,$He=Ca,eQe=CT,tQe=XT,nQe=Mq,rQe=jHe,iQe=M0.aTypedArrayConstructor,sQe=YHe,mhe=function(e){var n=QHe(this),r=_He(e),i=arguments.length,s=i>1?arguments[1]:void 0,a=s!==void 0,o=tQe(r),l,u,c,d,f,h,p,m;if(o&&!nQe(o))for(p=eQe(r,o),m=p.next,r=[];!(h=HHe(m,p)).done;)r.push(h.value);for(a&&i>2&&(s=BHe(s,arguments[2])),u=$He(r),c=new(iQe(n))(u),d=rQe(c),l=0;u>l;l++)f=a?s(r[l],l):r[l],c[l]=d?sQe(f):+f;return c},aQe=Vi,oQe=tn,lQe=a9,uQe=da,cQe=Ca,dQe=Sq,_B=oQe([].push),hh=function(t){var e=t===1,n=t===2,r=t===3,i=t===4,s=t===6,a=t===7,o=t===5||s;return function(l,u,c,d){for(var f=uQe(l),h=lQe(f),p=cQe(h),m=aQe(u,c),v=0,g=d||dQe,b=e?g(l,p):n||a?g(l,0):void 0,y,x;p>v;v++)if((o||v in h)&&(y=h[v],x=m(y,v,f),t))if(e)b[v]=x;else if(x)switch(t){case 3:return!0;case 5:return y;case 6:return v;case 2:_B(b,y)}else switch(t){case 4:return!1;case 7:_B(b,y)}return s?-1:r||i?i:b}},vhe={forEach:hh(0),map:hh(1),filter:hh(2),some:hh(3),every:hh(4),find:hh(5),findIndex:hh(6),filterReject:hh(7)},fQe=Ca,hQe=function(t,e,n){for(var r=0,i=arguments.length>2?n:fQe(e),s=new t(i);i>r;)s[r]=e[r++];return s},$B=rt,ghe=on,eH=Vn,pQe=Gr,mQe=Jq,FT=M0,bhe=UHe,tH=Af,vQe=rm,NS=$l,gQe=XHe,bQe=Ry,nH=ohe,CO=phe,yQe=GHe,yhe=uq,LS=Yi,SQe=sm,R8=ei,xQe=aq,TQe=dd,wQe=Df,S5=E0,EQe=Py.f,rH=mhe,MQe=vhe.forEach,PQe=KT,RQe=eu,She=po,xhe=IT,iH=hQe,Hq=Fs,VQe=g9,V8=Hq.get,zQe=Hq.set,kQe=Hq.enforce,The=She.f,OQe=xhe.f,KO=ghe.RangeError,whe=bhe.ArrayBuffer,IQe=whe.prototype,UQe=bhe.DataView,x5=FT.NATIVE_ARRAY_BUFFER_VIEWS,sH=FT.TYPED_ARRAY_TAG,aH=FT.TypedArray,XS=FT.TypedArrayPrototype,z8=FT.isTypedArray,T5="BYTES_PER_ELEMENT",qO="Wrong length",w5=function(t,e){RQe(t,e,{configurable:!0,get:function(){return V8(this)[e]}})},oH=function(t){var e;return wQe(IQe,t)||(e=SQe(t))==="ArrayBuffer"||e==="SharedArrayBuffer"},Ehe=function(t,e){return z8(t)&&!xQe(e)&&e in t&&gQe(+e)&&e>=0},lH=function(e,n){return n=yhe(n),Ehe(e,n)?vQe(2,e[n]):OQe(e,n)},uH=function(e,n,r){return n=yhe(n),Ehe(e,n)&&R8(r)&&LS(r,"value")&&!LS(r,"get")&&!LS(r,"set")&&!r.configurable&&(!LS(r,"writable")||r.writable)&&(!LS(r,"enumerable")||r.enumerable)?(e[n]=r.value,e):The(e,n,r)};pQe?(x5||(xhe.f=lH,She.f=uH,w5(XS,"buffer"),w5(XS,"byteOffset"),w5(XS,"byteLength"),w5(XS,"length")),$B({target:"Object",stat:!0,forced:!x5},{getOwnPropertyDescriptor:lH,defineProperty:uH}),T8.exports=function(t,e,n){var r=t.match(/\d+/)[0]/8,i=t+(n?"Clamped":"")+"Array",s="get"+t,a="set"+t,o=ghe[i],l=o,u=l&&l.prototype,c={},d=function(m,v){var g=V8(m);return g.view[s](v*r+g.byteOffset,!0)},f=function(m,v,g){var b=V8(m);b.view[a](v*r+b.byteOffset,n?yQe(g):g,!0)},h=function(m,v){The(m,v,{get:function(){return d(this,v)},set:function(g){return f(this,v,g)},enumerable:!0})};x5?mQe&&(l=e(function(m,v,g,b){return tH(m,u),VQe(function(){return R8(v)?oH(v)?b!==void 0?new o(v,CO(g,r),b):g!==void 0?new o(v,CO(g,r)):new o(v):z8(v)?iH(l,v):eH(rH,l,v):new o(nH(v))}(),m,l)}),S5&&S5(l,aH),MQe(EQe(o),function(m){m in l||NS(l,m,o[m])}),l.prototype=u):(l=e(function(m,v,g,b){tH(m,u);var y=0,x=0,T,M,E;if(!R8(v))E=nH(v),M=E*r,T=new whe(M);else if(oH(v)){T=v,x=CO(g,r);var S=v.byteLength;if(b===void 0){if(S%r)throw new KO(qO);if(M=S-x,M<0)throw new KO(qO)}else if(M=bQe(b)*r,M+x>S)throw new KO(qO);E=M/r}else return z8(v)?iH(l,v):eH(rH,l,v);for(zQe(m,{buffer:T,byteOffset:x,byteLength:M,length:E,view:new UQe(T)});ye;)r[e]=arguments[e++];return r},ZQe);var Phe=on,Rhe=Vn,Qq=M0,BQe=Ca,HQe=phe,QQe=da,Vhe=Rn,_Qe=Phe.RangeError,k8=Phe.Int8Array,cH=k8&&k8.prototype,zhe=cH&&cH.set,$Qe=Qq.aTypedArray,e_e=Qq.exportTypedArrayMethod,O8=!Vhe(function(){var t=new Uint8ClampedArray(2);return Rhe(zhe,t,{length:1,0:3},1),t[1]!==3}),t_e=O8&&Qq.NATIVE_ARRAY_BUFFER_VIEWS&&Vhe(function(){var t=new k8(2);return t.set(1),t.set("2",1),t[0]!==0||t[1]!==2});e_e("set",function(e){$Qe(this);var n=HQe(arguments.length>1?arguments[1]:void 0,1),r=QQe(e);if(O8)return Rhe(zhe,this,r,n);var i=this.length,s=BQe(r),a=0;if(s+n>i)throw new _Qe("Wrong length");for(;a0&&1/n<0?1:-1:e>n}};l_e("sort",function(e){return e!==void 0&&i_e(e),pH?q1(this,e):s_e(o_e(this),c_e(e))},!pH||u_e);var d_e=ei,f_e=$l,h_e=function(t,e){d_e(e)&&"cause"in e&&f_e(t,"cause",e.cause)},p_e=tn,Ohe=Error,m_e=p_e("".replace),v_e=function(t){return String(new Ohe(t).stack)}("zxcasd"),Ihe=/\n\s*at [^:]*:[^\n]*/,g_e=Ihe.test(v_e),b_e=function(t,e){if(g_e&&typeof t=="string"&&!Ohe.prepareStackTrace)for(;e--;)t=m_e(t,Ihe,"");return t},y_e=Rn,S_e=rm,x_e=!y_e(function(){var t=new Error("a");return"stack"in t?(Object.defineProperty(t,"stack",S_e(1,7)),t.stack!==7):!0}),T_e=$l,w_e=b_e,E_e=x_e,mH=Error.captureStackTrace,M_e=function(t,e,n,r){E_e&&(mH?mH(t,e):T_e(t,"stack",w_e(n,r)))},P_e=vo,R_e=function(t,e){return t===void 0?arguments.length<2?"":e:P_e(t)},V_e=rt,z_e=Df,k_e=om,TP=E0,O_e=d9,Uhe=dd,DO=$l,WO=rm,I_e=h_e,U_e=M_e,N_e=Jo,L_e=R_e,X_e=Vr,C_e=X_e("toStringTag"),wP=Error,K_e=[].push,Vb=function(e,n){var r=z_e(AO,this),i;TP?i=TP(new wP,r?k_e(this):AO):(i=r?this:Uhe(AO),DO(i,C_e,"Error")),n!==void 0&&DO(i,"message",L_e(n)),U_e(i,Vb,i.stack,1),arguments.length>2&&I_e(i,arguments[2]);var s=[];return N_e(e,K_e,{that:s}),DO(i,"errors",s),i};TP?TP(Vb,wP):O_e(Vb,wP,{name:!0});var AO=Vb.prototype=Uhe(wP.prototype,{constructor:WO(1,Vb),message:WO(1,""),name:WO(1,"AggregateError")});V_e({global:!0,constructor:!0,arity:2},{AggregateError:Vb});var q_e=Gr,D_e=Vy,W_e=da,A_e=Ca,G_e=eu;q_e&&(G_e(Array.prototype,"lastIndex",{configurable:!0,get:function(){var e=W_e(this),n=A_e(e);return n===0?0:n-1}}),D_e("lastIndex"));var F_e=Gr,j_e=Vy,vH=da,gH=Ca,Z_e=eu;F_e&&(Z_e(Array.prototype,"lastItem",{configurable:!0,get:function(){var e=vH(this),n=gH(e);return n===0?void 0:e[n-1]},set:function(e){var n=vH(this),r=gH(n);return n[r===0?0:r-1]=e}}),j_e("lastItem"));var Nhe={exports:{}},Lhe={},J_e=ud,Y_e=wy,Xhe=Py.f,B_e=w0,Che=typeof window=="object"&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],H_e=function(t){try{return Xhe(t)}catch{return B_e(Che)}};Lhe.f=function(e){return Che&&J_e(e)==="Window"?H_e(e):Xhe(Y_e(e))};var Q_e=Rn,__e=Q_e(function(){if(typeof ArrayBuffer=="function"){var t=new ArrayBuffer(8);Object.isExtensible(t)&&Object.defineProperty(t,"a",{value:8})}}),$_e=Rn,e$e=ei,t$e=ud,bH=__e,I7=Object.isExtensible,n$e=$_e(function(){I7(1)}),r$e=n$e||bH?function(e){return!e$e(e)||bH&&t$e(e)==="ArrayBuffer"?!1:I7?I7(e):!0}:I7,i$e=Rn,Khe=!i$e(function(){return Object.isExtensible(Object.preventExtensions({}))}),s$e=rt,a$e=tn,o$e=c9,l$e=ei,_q=Yi,u$e=po.f,yH=Py,c$e=Lhe,$q=r$e,d$e=l9,f$e=Khe,qhe=!1,Ef=d$e("meta"),h$e=0,eD=function(t){u$e(t,Ef,{value:{objectID:"O"+h$e++,weakData:{}}})},p$e=function(t,e){if(!l$e(t))return typeof t=="symbol"?t:(typeof t=="string"?"S":"P")+t;if(!_q(t,Ef)){if(!$q(t))return"F";if(!e)return"E";eD(t)}return t[Ef].objectID},m$e=function(t,e){if(!_q(t,Ef)){if(!$q(t))return!0;if(!e)return!1;eD(t)}return t[Ef].weakData},v$e=function(t){return f$e&&qhe&&$q(t)&&!_q(t,Ef)&&eD(t),t},g$e=function(){b$e.enable=function(){},qhe=!0;var t=yH.f,e=a$e([].splice),n={};n[Ef]=1,t(n).length&&(yH.f=function(r){for(var i=t(r),s=0,a=i.length;s1?arguments[1]:void 0),h;h=h?h.next:d.first;)for(f(h.value,h.key,this);h&&h.removed;)h=h.previous},has:function(c){return!!l(this,c)}}),VH(s,n?{get:function(c){var d=l(this,c);return d&&d.value},set:function(c,d){return o(this,c===0?0:c,d)}}:{add:function(c){return o(this,c=c===0?0:c,c)}}),qS&&eet(s,"size",{configurable:!0,get:function(){return a(this).size}}),i},setStrong:function(t,e,n){var r=e+" Iterator",i=YO(e),s=YO(r);set(t,e,function(a,o){kH(this,{type:r,target:a,state:i(a),kind:o,last:null})},function(){for(var a=s(this),o=a.kind,l=a.last;l&&l.removed;)l=l.previous;return!a.target||!(a.last=l=l?l.next:a.state.first)?(a.target=null,M5(void 0,!0)):M5(o==="keys"?l.key:o==="values"?l.value:[l.key,l.value],!1)},n?"entries":"values",!n,!0),aet(e)}},uet=Dhe,cet=oet;uet("Map",function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},cet);var det=tn,OH=Uy,P5=E9.getWeakData,fet=Af,het=dr,pet=wl,BO=ei,met=Jo,Zhe=vhe,IH=Yi,Jhe=Fs,vet=Jhe.set,get=Jhe.getterFor,bet=Zhe.find,yet=Zhe.findIndex,xet=det([].splice),Tet=0,R5=function(t){return t.frozen||(t.frozen=new Yhe)},Yhe=function(){this.entries=[]},HO=function(t,e){return bet(t.entries,function(n){return n[0]===e})};Yhe.prototype={get:function(t){var e=HO(this,t);if(e)return e[1]},has:function(t){return!!HO(this,t)},set:function(t,e){var n=HO(this,t);n?n[1]=e:this.entries.push([t,e])},delete:function(t){var e=yet(this.entries,function(n){return n[0]===t});return~e&&xet(this.entries,e,1),!!~e}};var wet={getConstructor:function(t,e,n,r){var i=t(function(l,u){fet(l,s),vet(l,{type:e,id:Tet++,frozen:null}),pet(u)||met(u,l[r],{that:l,AS_ENTRIES:n})}),s=i.prototype,a=get(e),o=function(l,u,c){var d=a(l),f=P5(het(u),!0);return f===!0?R5(d).set(u,c):f[d.id]=c,l};return OH(s,{delete:function(l){var u=a(this);if(!BO(l))return!1;var c=P5(l);return c===!0?R5(u).delete(l):c&&IH(c,u.id)&&delete c[u.id]},has:function(u){var c=a(this);if(!BO(u))return!1;var d=P5(u);return d===!0?R5(c).has(u):d&&IH(d,c.id)}}),OH(s,n?{get:function(u){var c=a(this);if(BO(u)){var d=P5(u);if(d===!0)return R5(c).get(u);if(d)return d[c.id]}},set:function(u,c){return o(this,u,c)}}:{add:function(u){return o(this,u,!0)}}),i}},Eet=Khe,UH=on,U7=tn,NH=Uy,Met=E9,Pet=Dhe,Bhe=wet,V5=ei,z5=Fs.enforce,Ret=Rn,Vet=qde,ZT=Object,zet=Array.isArray,k5=ZT.isExtensible,Hhe=ZT.isFrozen,ket=ZT.isSealed,Qhe=ZT.freeze,Oet=ZT.seal,Iet=!UH.ActiveXObject&&"ActiveXObject"in UH,DS,_he=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},$he=Pet("WeakMap",_he,Bhe),Yg=$he.prototype,N7=U7(Yg.set),Uet=function(){return Eet&&Ret(function(){var t=Qhe([]);return N7(new $he,t,1),!Hhe(t)})};if(Vet)if(Iet){DS=Bhe.getConstructor(_he,"WeakMap",!0),Met.enable();var LH=U7(Yg.delete),O5=U7(Yg.has),XH=U7(Yg.get);NH(Yg,{delete:function(t){if(V5(t)&&!k5(t)){var e=z5(this);return e.frozen||(e.frozen=new DS),LH(this,t)||e.frozen.delete(t)}return LH(this,t)},has:function(e){if(V5(e)&&!k5(e)){var n=z5(this);return n.frozen||(n.frozen=new DS),O5(this,e)||n.frozen.has(e)}return O5(this,e)},get:function(e){if(V5(e)&&!k5(e)){var n=z5(this);return n.frozen||(n.frozen=new DS),O5(this,e)?XH(this,e):n.frozen.get(e)}return XH(this,e)},set:function(e,n){if(V5(e)&&!k5(e)){var r=z5(this);r.frozen||(r.frozen=new DS),O5(this,e)?N7(this,e,n):r.frozen.set(e,n)}else N7(this,e,n);return this}})}else Uet()&&NH(Yg,{set:function(e,n){var r;return zet(e)&&(Hhe(e)?r=Qhe:ket(e)&&(r=Oet)),N7(this,e,n),r&&r(e),this}});var epe=ca,Net=dd,CH=ei,Let=Object,Xet=TypeError,Cet=epe("Map"),Ket=epe("WeakMap"),EP=function(){this.object=null,this.symbol=null,this.primitives=null,this.objectsByIndex=Net(null)};EP.prototype.get=function(t,e){return this[t]||(this[t]=e())};EP.prototype.next=function(t,e,n){var r=n?this.objectsByIndex[t]||(this.objectsByIndex[t]=new Ket):this.primitives||(this.primitives=new Cet),i=r.get(e);return i||r.set(e,i=new EP),i};var KH=new EP,tpe=function(){var t=KH,e=arguments.length,n,r;for(n=0;n1?arguments[1]:void 0);return ott(n,function(i,s){if(!r(i,s,n))return!1},!0)!==!1}});var ltt=rt,utt=Vi,ctt=Ml,ape=El,dtt=Hu,ftt=ape.Map,htt=ape.set;ltt({target:"Map",proto:!0,real:!0,forced:!0},{filter:function(e){var n=ctt(this),r=utt(e,arguments.length>1?arguments[1]:void 0),i=new ftt;return dtt(n,function(s,a){r(s,a,n)&&htt(i,a,s)}),i}});var ptt=rt,mtt=Vi,vtt=Ml,gtt=Hu;ptt({target:"Map",proto:!0,real:!0,forced:!0},{find:function(e){var n=vtt(this),r=mtt(e,arguments.length>1?arguments[1]:void 0),i=gtt(n,function(s,a){if(r(s,a,n))return{value:s}},!0);return i&&i.value}});var btt=rt,ytt=Vi,Stt=Ml,xtt=Hu;btt({target:"Map",proto:!0,real:!0,forced:!0},{findKey:function(e){var n=Stt(this),r=ytt(e,arguments.length>1?arguments[1]:void 0),i=xtt(n,function(s,a){if(r(s,a,n))return{key:a}},!0);return i&&i.key}});var Ttt=Vi,wtt=dr,Ett=da,Mtt=Jo,M9=function(t,e,n){return function(i){var s=Ett(i),a=arguments.length,o=a>1?arguments[1]:void 0,l=o!==void 0,u=l?Ttt(o,a>2?arguments[2]:void 0):void 0,c=new t,d=0;return Mtt(s,function(f){var h=l?u(f,d++):f;n?e(c,wtt(h)[0],h[1]):e(c,h)}),c}},Ptt=rt,WH=El,Rtt=M9;Ptt({target:"Map",stat:!0,forced:!0},{from:Rtt(WH.Map,WH.set,!0)});var Vtt=rt,ztt=tn,ktt=yi,Ott=cd,Itt=Jo,P9=El,Utt=Rn,ope=P9.Map,Ntt=P9.has,Ltt=P9.get,Xtt=P9.set,Ctt=ztt([].push),Ktt=Utt(function(){return ope.groupBy("ab",function(t){return t}).get("a").length!==1});Vtt({target:"Map",stat:!0,forced:Ktt},{groupBy:function(e,n){Ott(e),ktt(n);var r=new ope,i=0;return Itt(e,function(s){var a=n(s,i++);Ntt(r,a)?Ctt(Ltt(r,a),s):Xtt(r,a,[s])}),r}});var qtt=function(t,e){return t===e||t!==t&&e!==e},Dtt=rt,Wtt=qtt,Att=Ml,Gtt=Hu;Dtt({target:"Map",proto:!0,real:!0,forced:!0},{includes:function(e){return Gtt(Att(this),function(n){if(Wtt(n,e))return!0},!0)===!0}});var Ftt=rt,jtt=Vn,Ztt=Jo,Jtt=ir,AH=yi,Ytt=El.Map;Ftt({target:"Map",stat:!0,forced:!0},{keyBy:function(e,n){var r=Jtt(this)?this:Ytt,i=new r;AH(n);var s=AH(i.set);return Ztt(e,function(a){jtt(s,i,n(a),a)}),i}});var Btt=rt,Htt=Ml,Qtt=Hu;Btt({target:"Map",proto:!0,real:!0,forced:!0},{keyOf:function(e){var n=Qtt(Htt(this),function(r,i){if(r===e)return{key:i}},!0);return n&&n.key}});var _tt=rt,$tt=Vi,ent=Ml,lpe=El,tnt=Hu,nnt=lpe.Map,rnt=lpe.set;_tt({target:"Map",proto:!0,real:!0,forced:!0},{mapKeys:function(e){var n=ent(this),r=$tt(e,arguments.length>1?arguments[1]:void 0),i=new nnt;return tnt(n,function(s,a){rnt(i,r(s,a,n),s)}),i}});var int=rt,snt=Vi,ant=Ml,upe=El,ont=Hu,lnt=upe.Map,unt=upe.set;int({target:"Map",proto:!0,real:!0,forced:!0},{mapValues:function(e){var n=ant(this),r=snt(e,arguments.length>1?arguments[1]:void 0),i=new lnt;return ont(n,function(s,a){unt(i,a,r(s,a,n))}),i}});var cnt=rt,dnt=Ml,fnt=Jo,hnt=El.set;cnt({target:"Map",proto:!0,real:!0,arity:1,forced:!0},{merge:function(e){for(var n=dnt(this),r=arguments.length,i=0;i1?arguments[1]:void 0);return Mnt(n,function(i,s){if(r(i,s,n))return!0},!0)===!0}});var Pnt=rt,FH=yi,Rnt=Ml,nD=El,Vnt=TypeError,znt=nD.get,knt=nD.has,Ont=nD.set;Pnt({target:"Map",proto:!0,real:!0,forced:!0},{update:function(e,n){var r=Rnt(this),i=arguments.length;FH(n);var s=knt(r,e);if(!s&&i<3)throw new Vnt("Updating absent value");var a=s?znt(r,e):FH(i>2?arguments[2]:void 0)(e,r);return Ont(r,e,n(a,e,r)),r}});var Int=rt,Unt=Math.min,Nnt=Math.max;Int({target:"Math",stat:!0,forced:!0},{clamp:function(e,n,r){return Unt(r,Nnt(n,e))}});var Lnt=rt;Lnt({target:"Math",stat:!0,nonConfigurable:!0,nonWritable:!0},{DEG_PER_RAD:Math.PI/180});var Xnt=rt,Cnt=180/Math.PI;Xnt({target:"Math",stat:!0,forced:!0},{degrees:function(e){return e*Cnt}});var cpe=function(e,n,r,i,s){var a=+e,o=+n,l=+r,u=+i,c=+s;return a!==a||o!==o||l!==l||u!==u||c!==c?NaN:a===1/0||a===-1/0?a:(a-o)*(c-u)/(l-o)+u},Knt=rt,qnt=cpe,Dnt=lhe;Knt({target:"Math",stat:!0,forced:!0},{fscale:function(e,n,r,i,s){return Dnt(qnt(e,n,r,i,s))}});var Wnt=rt;Wnt({target:"Math",stat:!0,forced:!0},{iaddh:function(e,n,r,i){var s=e>>>0,a=n>>>0,o=r>>>0;return a+(i>>>0)+((s&o|(s|o)&~(s+o>>>0))>>>31)|0}});var Ant=rt;Ant({target:"Math",stat:!0,forced:!0},{imulh:function(e,n){var r=65535,i=+e,s=+n,a=i&r,o=s&r,l=i>>16,u=s>>16,c=(l*o>>>0)+(a*o>>>16);return l*u+(c>>16)+((a*u>>>0)+(c&r)>>16)}});var Gnt=rt;Gnt({target:"Math",stat:!0,forced:!0},{isubh:function(e,n,r,i){var s=e>>>0,a=n>>>0,o=r>>>0;return a-(i>>>0)-((~s&o|~(s^o)&s-o>>>0)>>>31)|0}});var Fnt=rt;Fnt({target:"Math",stat:!0,nonConfigurable:!0,nonWritable:!0},{RAD_PER_DEG:180/Math.PI});var jnt=rt,Znt=Math.PI/180;jnt({target:"Math",stat:!0,forced:!0},{radians:function(e){return e*Znt}});var Jnt=rt,Ynt=cpe;Jnt({target:"Math",stat:!0,forced:!0},{scale:Ynt});var Bnt=on,Hnt=Bnt.isFinite,Qnt=Number.isFinite||function(e){return typeof e=="number"&&Hnt(e)},_nt=rt,$nt=dr,ert=Qnt,trt=jT,nrt=P0,dpe=Fs,fpe="Seeded Random",hpe=fpe+" Generator",rrt='Math.seededPRNG() argument should have a "seed" field with a finite value.',irt=dpe.set,srt=dpe.getterFor(hpe),art=TypeError,ort=trt(function(e){irt(this,{type:hpe,seed:e%2147483647})},fpe,function(){var e=srt(this),n=e.seed=(e.seed*1103515245+12345)%2147483647;return nrt((n&1073741823)/1073741823,!1)});_nt({target:"Math",stat:!0,forced:!0},{seededPRNG:function(e){var n=$nt(e).seed;if(!ert(n))throw new art(rrt);return new ort(n)}});var lrt=rt;lrt({target:"Math",stat:!0,forced:!0},{signbit:function(e){var n=+e;return n===n&&n===0?1/n===-1/0:n<0}});var urt=rt;urt({target:"Math",stat:!0,forced:!0},{umulh:function(e,n){var r=65535,i=+e,s=+n,a=i&r,o=s&r,l=i>>>16,u=s>>>16,c=(l*o>>>0)+(a*o>>>16);return l*u+(c>>>16)+((a*u>>>0)+(c&r)>>>16)}});var crt=rt,JT=tn,drt=Bu,AS="Invalid number representation",frt="Invalid radix",hrt=RangeError,U5=SyntaxError,prt=TypeError,jH=parseInt,mrt=Math.pow,ppe=/^[\d.a-z]+$/,vrt=JT("".charAt),grt=JT(ppe.exec),brt=JT(1 .toString),yrt=JT("".slice),Srt=JT("".split);crt({target:"Number",stat:!0,forced:!0},{fromString:function(e,n){var r=1;if(typeof e!="string")throw new prt(AS);if(!e.length)throw new U5(AS);if(vrt(e,0)==="-"&&(r=-1,e=yrt(e,1),!e.length))throw new U5(AS);var i=n===void 0?10:drt(n);if(i<2||i>36)throw new hrt(frt);if(!grt(ppe,e))throw new U5(AS);var s=Srt(e,"."),a=jH(s[0],i);if(s.length>1&&(a+=jH(s[1],i)/mrt(i,s[1].length)),i===10&&brt(a,i)!==e)throw new U5(AS);return r*a}});var xrt=rt,L7=Vn,YT=Gr,Trt=KT,mpe=yi,wrt=dr,Ert=Af,vpe=ir,Mrt=wl,Prt=ei,X7=im,Rrt=mo,rD=Uy,gpe=eu,v1=Sfe,Vrt=Vr,bpe=Fs,zrt=Vrt("observable"),iD="Observable",ype="Subscription",Spe="SubscriptionObserver",sD=bpe.getterFor,aD=bpe.set,krt=sD(iD),xpe=sD(ype),C7=sD(Spe),Tpe=function(t){this.observer=wrt(t),this.cleanup=null,this.subscriptionObserver=null};Tpe.prototype={type:ype,clean:function(){var t=this.cleanup;if(t){this.cleanup=null;try{t()}catch(e){v1(e)}}},close:function(){if(!YT){var t=this.facade,e=this.subscriptionObserver;t.closed=!0,e&&(e.closed=!0)}this.observer=null},isClosed:function(){return this.observer===null}};var oD=function(t,e){var n=aD(this,new Tpe(t)),r;YT||(this.closed=!1);try{(r=X7(t,"start"))&&L7(r,t,this)}catch(o){v1(o)}if(!n.isClosed()){var i=n.subscriptionObserver=new lD(n);try{var s=e(i),a=s;Mrt(s)||(n.cleanup=vpe(s.unsubscribe)?function(){a.unsubscribe()}:mpe(s))}catch(o){i.error(o);return}n.isClosed()&&n.clean()}};oD.prototype=rD({},{unsubscribe:function(){var e=xpe(this);e.isClosed()||(e.close(),e.clean())}});YT&&gpe(oD.prototype,"closed",{configurable:!0,get:function(){return xpe(this).isClosed()}});var lD=function(t){aD(this,{type:Spe,subscriptionState:t}),YT||(this.closed=!1)};lD.prototype=rD({},{next:function(e){var n=C7(this).subscriptionState;if(!n.isClosed()){var r=n.observer;try{var i=X7(r,"next");i&&L7(i,r,e)}catch(s){v1(s)}}},error:function(e){var n=C7(this).subscriptionState;if(!n.isClosed()){var r=n.observer;n.close();try{var i=X7(r,"error");i?L7(i,r,e):v1(e)}catch(s){v1(s)}n.clean()}},complete:function(){var e=C7(this).subscriptionState;if(!e.isClosed()){var n=e.observer;e.close();try{var r=X7(n,"complete");r&&L7(r,n)}catch(i){v1(i)}e.clean()}}});YT&&gpe(lD.prototype,"closed",{configurable:!0,get:function(){return C7(this).subscriptionState.isClosed()}});var wpe=function(e){Ert(this,uD),aD(this,{type:iD,subscriber:mpe(e)})},uD=wpe.prototype;rD(uD,{subscribe:function(e){var n=arguments.length;return new oD(vpe(e)?{next:e,error:n>1?arguments[1]:void 0,complete:n>2?arguments[2]:void 0}:Prt(e)?e:{},krt(this).subscriber)}});Rrt(uD,zrt,function(){return this});xrt({global:!0,constructor:!0,forced:!0},{Observable:wpe});Trt(iD);var Ort=rt,Irt=ca,Urt=Vn,ZH=dr,Nrt=NT,Lrt=CT,Xrt=im,Crt=Jo,Krt=Vr,qrt=Krt("observable");Ort({target:"Observable",stat:!0,forced:!0},{from:function(e){var n=Nrt(this)?this:Irt("Observable"),r=Xrt(ZH(e),qrt);if(r){var i=ZH(Urt(r,e));return i.constructor===n?i:new n(function(a){return i.subscribe(a)})}var s=Lrt(e);return new n(function(a){Crt(s,function(o,l){if(a.next(o),a.closed)return l()},{IS_ITERATOR:!0,INTERRUPTED:!0}),a.complete()})}});var Drt=rt,Epe=ca,Wrt=NT,Art=Epe("Array");Drt({target:"Observable",stat:!0,forced:!0},{of:function(){for(var e=Wrt(this)?this:Epe("Observable"),n=arguments.length,r=Art(n),i=0;i1?oit(arguments,1):[],n=lit.f(this),r=Mpe(function(){return ait(uit(t),void 0,e)});return(r.error?n.reject:n.resolve)(r.value),n.promise}});var Ppe=ca,dit=tn,fit=o9,BH=Ppe("Map"),hit=Ppe("WeakMap"),pit=dit([].push),HH=fit("metadata"),N8=HH.store||(HH.store=new hit),BT=function(t,e,n){var r=N8.get(t);if(!r){if(!n)return;N8.set(t,r=new BH)}var i=r.get(e);if(!i){if(!n)return;r.set(e,i=new BH)}return i},mit=function(t,e,n){var r=BT(e,n,!1);return r===void 0?!1:r.has(t)},vit=function(t,e,n){var r=BT(e,n,!1);return r===void 0?void 0:r.get(t)},git=function(t,e,n,r){BT(n,r,!0).set(t,e)},bit=function(t,e){var n=BT(t,e,!1),r=[];return n&&n.forEach(function(i,s){pit(r,s)}),r},yit=function(t){return t===void 0||typeof t=="symbol"?t:String(t)},jf={store:N8,getMap:BT,has:mit,get:vit,set:git,keys:bit,toKey:yit},Sit=rt,Rpe=jf,xit=dr,Tit=Rpe.toKey,wit=Rpe.set;Sit({target:"Reflect",stat:!0},{defineMetadata:function(e,n,r){var i=arguments.length<4?void 0:Tit(arguments[3]);wit(e,n,xit(r),i)}});var Eit=rt,cD=jf,Mit=dr,Pit=cD.toKey,Rit=cD.getMap,QH=cD.store;Eit({target:"Reflect",stat:!0},{deleteMetadata:function(e,n){var r=arguments.length<3?void 0:Pit(arguments[2]),i=Rit(Mit(n),r,!1);if(i===void 0||!i.delete(e))return!1;if(i.size)return!0;var s=QH.get(n);return s.delete(r),!!s.size||QH.delete(n)}});var Vit=rt,dD=jf,zit=dr,kit=om,Oit=dD.has,Iit=dD.get,Uit=dD.toKey,Vpe=function(t,e,n){var r=Oit(t,e,n);if(r)return Iit(t,e,n);var i=kit(e);return i!==null?Vpe(t,i,n):void 0};Vit({target:"Reflect",stat:!0},{getMetadata:function(e,n){var r=arguments.length<3?void 0:Uit(arguments[2]);return Vpe(e,zit(n),r)}});var Nit=tn,Lit=yi,Xit=wl,Cit=Ca,Kit=da,fD=El,qit=Hu,Dit=fD.Map,Wit=fD.has,Ait=fD.set,Git=Nit([].push),Fit=function(e){var n=Kit(this),r=Cit(n),i=[],s=new Dit,a=Xit(e)?function(c){return c}:Lit(e),o,l,u;for(o=0;o1?arguments[1]:void 0);return vat(n,function(i){if(!r(i,i,n))return!1},!0)!==!1}});var gat=rt,bat=Vi,yat=qa,Zpe=Ka,Sat=tu,xat=Zpe.Set,Tat=Zpe.add;gat({target:"Set",proto:!0,real:!0,forced:!0},{filter:function(e){var n=yat(this),r=bat(e,arguments.length>1?arguments[1]:void 0),i=new xat;return Sat(n,function(s){r(s,s,n)&&Tat(i,s)}),i}});var wat=rt,Eat=Vi,Mat=qa,Pat=tu;wat({target:"Set",proto:!0,real:!0,forced:!0},{find:function(e){var n=Mat(this),r=Eat(e,arguments.length>1?arguments[1]:void 0),i=Pat(n,function(s){if(r(s,s,n))return{value:s}},!0);return i&&i.value}});var Rat=rt,rQ=Ka,Vat=M9;Rat({target:"Set",stat:!0,forced:!0},{from:Vat(rQ.Set,rQ.add,!1)});var zat=qa,pD=Ka,kat=HT,Oat=V0,Iat=tu,Uat=lm,Nat=pD.Set,iQ=pD.add,Lat=pD.has,Xat=function(e){var n=zat(this),r=Oat(e),i=new Nat;return kat(n)>r.size?Uat(r.getIterator(),function(s){Lat(n,s)&&iQ(i,s)}):Iat(n,function(s){r.includes(s)&&iQ(i,s)}),i},Cat=rt,Kat=Vn,qat=R0,Dat=Xat;Cat({target:"Set",proto:!0,real:!0,forced:!0},{intersection:function(e){return Kat(Dat,this,qat(e))}});var Wat=qa,Aat=Ka.has,Gat=HT,Fat=V0,jat=tu,Zat=lm,Jat=h9,Yat=function(e){var n=Wat(this),r=Fat(e);if(Gat(n)<=r.size)return jat(n,function(s){if(r.includes(s))return!1},!0)!==!1;var i=r.getIterator();return Zat(i,function(s){if(Aat(n,s))return Jat(i,"normal",!1)})!==!1},Bat=rt,Hat=Vn,Qat=R0,_at=Yat;Bat({target:"Set",proto:!0,real:!0,forced:!0},{isDisjointFrom:function(e){return Hat(_at,this,Qat(e))}});var $at=qa,eot=HT,tot=tu,not=V0,rot=function(e){var n=$at(this),r=not(e);return eot(n)>r.size?!1:tot(n,function(i){if(!r.includes(i))return!1},!0)!==!1},iot=rt,sot=Vn,aot=R0,oot=rot;iot({target:"Set",proto:!0,real:!0,forced:!0},{isSubsetOf:function(e){return sot(oot,this,aot(e))}});var lot=qa,uot=Ka.has,cot=HT,dot=V0,fot=lm,hot=h9,pot=function(e){var n=lot(this),r=dot(e);if(cot(n)1?arguments[1]:void 0),i=new zot;return Vot(n,function(s){kot(i,r(s,s,n))}),i}});var Oot=rt,sQ=Ka,Iot=R9;Oot({target:"Set",stat:!0,forced:!0},{of:Iot(sQ.Set,sQ.add,!1)});var Uot=rt,Not=yi,Lot=qa,Xot=tu,Cot=TypeError;Uot({target:"Set",proto:!0,real:!0,forced:!0},{reduce:function(e){var n=Lot(this),r=arguments.length<2,i=r?void 0:arguments[1];if(Not(e),Xot(n,function(s){r?(r=!1,i=s):i=e(i,s,s,n)}),r)throw new Cot("Reduce of empty set with no initial value");return i}});var Kot=rt,qot=Vi,Dot=qa,Wot=tu;Kot({target:"Set",proto:!0,real:!0,forced:!0},{some:function(e){var n=Dot(this),r=qot(e,arguments.length>1?arguments[1]:void 0);return Wot(n,function(i){if(r(i,i,n))return!0},!0)===!0}});var Aot=qa,mD=Ka,Got=hD,Fot=V0,jot=lm,Zot=mD.add,Jot=mD.has,Yot=mD.remove,Bot=function(e){var n=Aot(this),r=Fot(e).getIterator(),i=Got(n);return jot(r,function(s){Jot(n,s)?Yot(i,s):Zot(i,s)}),i},Hot=rt,Qot=Vn,_ot=R0,$ot=Bot;Hot({target:"Set",proto:!0,real:!0,forced:!0},{symmetricDifference:function(e){return Qot($ot,this,_ot(e))}});var elt=qa,tlt=Ka.add,nlt=hD,rlt=V0,ilt=lm,slt=function(e){var n=elt(this),r=rlt(e).getIterator(),i=nlt(n);return ilt(r,function(s){tlt(i,s)}),i},alt=rt,olt=Vn,llt=R0,ult=slt;alt({target:"Set",proto:!0,real:!0,forced:!0},{union:function(e){return olt(ult,this,llt(e))}});var clt=rt,dlt=GT.charAt,flt=cd,hlt=Bu,plt=vo;clt({target:"String",proto:!0,forced:!0},{at:function(e){var n=plt(flt(this)),r=n.length,i=hlt(e),s=i>=0?i:r+i;return s<0||s>=r?void 0:dlt(n,s)}});var mlt=rt,vlt=jT,aQ=P0,glt=cd,blt=vo,Bpe=Fs,Hpe=GT,ylt=Hpe.codeAt,Slt=Hpe.charAt,Qpe="String Iterator",xlt=Bpe.set,Tlt=Bpe.getterFor(Qpe),wlt=vlt(function(e){xlt(this,{type:Qpe,string:e,index:0})},"String",function(){var e=Tlt(this),n=e.string,r=e.index,i;return r>=n.length?aQ(void 0,!0):(i=Slt(n,r),e.index+=i.length,aQ({codePoint:ylt(i,0),position:r},!1))});mlt({target:"String",proto:!0,forced:!0},{codePoints:function(){return new wlt(blt(glt(this)))}});var Elt=rt,Mlt=Vn,_pe=bq,Plt=jT,L5=P0,oQ=cd,$pe=Ry,E6=vo,Rlt=dr,Vlt=wl,zlt=ud,klt=Uq,eme=Lq,Olt=im,Ilt=mo,Ult=Rn,Nlt=Vr,Llt=Pq,Xlt=Hfe,Clt=_fe,tme=Fs,Klt=Ude,MP=Nlt("matchAll"),nme="RegExp String",rme=nme+" Iterator",qlt=tme.set,Dlt=tme.getterFor(rme),lQ=RegExp.prototype,Wlt=TypeError,L8=_pe("".indexOf),PP=_pe("".matchAll),eI=!!PP&&!Ult(function(){PP("a",/./)}),Alt=Plt(function(e,n,r,i){qlt(this,{type:rme,regexp:e,string:n,global:r,unicode:i,done:!1})},nme,function(){var e=Dlt(this);if(e.done)return L5(void 0,!0);var n=e.regexp,r=e.string,i=Clt(n,r);return i===null?(e.done=!0,L5(void 0,!0)):e.global?(E6(i[0])===""&&(n.lastIndex=Xlt(r,$pe(n.lastIndex),e.unicode)),L5(i,!1)):(e.done=!0,L5(i,!1))}),ime=function(t){var e=Rlt(this),n=E6(t),r=Llt(e,RegExp),i=E6(eme(e)),s,a,o;return s=new r(r===RegExp?e.source:e,i),a=!!~L8(i,"g"),o=!!~L8(i,"u"),s.lastIndex=$pe(e.lastIndex),new Alt(s,n,a,o)};Elt({target:"String",proto:!0,forced:eI},{matchAll:function(e){var n=oQ(this),r,i,s,a;if(Vlt(e)){if(eI)return PP(n,e)}else{if(klt(e)&&(r=E6(oQ(eme(e))),!~L8(r,"g")))throw new Wlt("`.matchAll` does not allow non-global regexes");if(eI)return PP(n,e);if(s=Olt(e,MP),s===void 0&&Klt&&zlt(e)==="RegExp"&&(s=ime),s)return Mlt(s,e,n)}return i=E6(n),a=new RegExp(e,"g"),a[MP](i)}});MP in lQ||Ilt(lQ,MP,ime);var Glt=rt,Flt=Vn,vD=tn,uQ=cd,jlt=ir,Zlt=wl,Jlt=Uq,GS=vo,Ylt=im,Blt=Lq,Hlt=Qfe,Qlt=Vr,_lt=Qlt("replace"),$lt=TypeError,tI=vD("".indexOf);vD("".replace);var cQ=vD("".slice),eut=Math.max;Glt({target:"String",proto:!0},{replaceAll:function(e,n){var r=uQ(this),i,s,a,o,l,u,c,d,f,h,p=0,m="";if(!Zlt(e)){if(i=Jlt(e),i&&(s=GS(uQ(Blt(e))),!~tI(s,"g")))throw new $lt("`.replaceAll` does not allow non-global regexes");if(a=Ylt(e,_lt),a)return Flt(a,e,r,n)}for(o=GS(r),l=GS(e),u=jlt(n),u||(n=GS(n)),c=l.length,d=eut(1,c),f=tI(o,l);f!==-1;)h=u?GS(n(l,f,o)):Hlt(l,o,f,[],void 0,n),m+=cQ(o,p,f)+h,p=f+c,f=f+d>o.length?-1:tI(o,l,f+d);return p=e.length)return t.target=null,q5(void 0,!0);switch(t.kind){case"keys":return q5(n,!1);case"values":return q5(e[n],!1)}return q5([n,e[n]],!1)},"values"),bQ=gQ.Arguments=gQ.Array;bD("keys");bD("values");bD("entries");if(qut&&bQ.name!=="values")try{Cut(bQ,"name",{value:"values"})}catch{}var yQ=on,ume=Uut,Gut=Lut,b3=Aut,SQ=$l,Fut=am,jut=Vr,aI=jut("iterator"),oI=b3.values,cme=function(t,e){if(t){if(t[aI]!==oI)try{SQ(t,aI,oI)}catch{t[aI]=oI}if(Fut(t,e,!0),ume[e]){for(var n in b3)if(t[n]!==b3[n])try{SQ(t,n,b3[n])}catch{t[n]=b3[n]}}}};for(var lI in ume)cme(yQ[lI]&&yQ[lI].prototype,lI);cme(Gut,"DOMTokenList");var Zut=rt,Jut=on,xQ=p9.clear;Zut({global:!0,bind:!0,enumerable:!0,forced:Jut.clearImmediate!==xQ},{clearImmediate:xQ});var dme=on,Yut=ky,But=ir,Hut=Tq,Qut=Wf,_ut=w0,$ut=qT,ect=dme.Function,tct=/MSIE .\./.test(Qut)||Hut==="BUN"&&function(){var t=dme.Bun.version.split(".");return t.length<3||t[0]==="0"&&(t[1]<3||t[1]==="3"&&t[2]==="0")}(),nct=function(t,e){var n=e?2:1;return tct?function(r,i){var s=$ut(arguments.length,1)>n,a=But(r)?r:ect(r),o=s?_ut(arguments,n):[],l=s?function(){Yut(a,this,o)}:a;return e?t(l,i):t(l)}:t},rct=rt,fme=on,TQ=p9.set,ict=nct,wQ=fme.setImmediate?ict(TQ,!1):TQ;rct({global:!0,bind:!0,enumerable:!0,forced:fme.setImmediate!==wQ},{setImmediate:wQ});var sct=rt,act=on,oct=yfe,lct=yi,uct=qT,cct=Rn,dct=Gr,fct=cct(function(){return dct&&Object.getOwnPropertyDescriptor(act,"queueMicrotask").value.length!==1});sct({global:!0,enumerable:!0,dontCallGetSet:!0,forced:fct},{queueMicrotask:function(e){uct(arguments.length,1),oct(lct(e))}});var hct=GT.charAt,pct=vo,hme=Fs,mct=tD,EQ=P0,pme="String Iterator",vct=hme.set,gct=hme.getterFor(pme);mct(String,"String",function(t){vct(this,{type:pme,string:pct(t),index:0})},function(){var e=gct(this),n=e.string,r=e.index,i;return r>=n.length?EQ(void 0,!0):(i=hct(n,r),e.index+=i.length,EQ(i,!1))});var bct=Rn,yct=Vr,Sct=Gr,MQ=Ude,xct=yct("iterator"),mme=!bct(function(){var t=new URL("b?a=1&b=2&c=3","https://a"),e=t.searchParams,n=new URLSearchParams("a=1&a=2&b=3"),r="";return t.pathname="c%20d",e.forEach(function(i,s){e.delete("b"),r+=s+i}),n.delete("a",2),n.delete("b",void 0),MQ&&(!t.toJSON||!n.has("a",1)||n.has("a",2)||!n.has("a",void 0)||n.has("b"))||!e.size&&(MQ||!Sct)||!e.sort||t.href!=="https://a/c%20d?a=1&c=3"||e.get("c")!=="3"||String(new URLSearchParams("?a=1"))!=="a=1"||!e[xct]||new URL("https://a@b").username!=="a"||new URLSearchParams(new URLSearchParams("a=b")).get("a")!=="b"||new URL("https://тест").host!=="xn--e1aybc"||new URL("https://a#б").hash!=="#%D0%B1"||r!=="a1c3"||new URL("https://x",void 0).host!=="x"}),PQ=Gr,Tct=tn,wct=Vn,Ect=Rn,uI=efe,Mct=gq,Pct=sq,Rct=da,Vct=a9,wg=Object.assign,RQ=Object.defineProperty,zct=Tct([].concat),kct=!wg||Ect(function(){if(PQ&&wg({b:1},wg(RQ({},"a",{enumerable:!0,get:function(){RQ(this,"b",{value:3,enumerable:!1})}}),{b:2})).b!==1)return!0;var t={},e={},n=Symbol("assign detection"),r="abcdefghijklmnopqrst";return t[n]=7,r.split("").forEach(function(i){e[i]=i}),wg({},t)[n]!==7||uI(wg({},e)).join("")!==r})?function(e,n){for(var r=Rct(e),i=arguments.length,s=1,a=Mct.f,o=Pct.f;i>s;)for(var l=Vct(arguments[s++]),u=a?zct(uI(l),a(l)):uI(l),c=u.length,d=0,f;c>d;)f=u[d++],(!PQ||wct(o,l,f))&&(r[f]=l[f]);return r}:wg,Oct=dr,Ict=h9,Uct=function(t,e,n,r){try{return r?e(Oct(n)[0],n[1]):e(n)}catch(i){Ict(t,"throw",i)}},Nct=Vi,Lct=Vn,Xct=da,Cct=Uct,Kct=Mq,qct=NT,Dct=Ca,VQ=cfe,Wct=CT,Act=XT,zQ=Array,Gct=function(e){var n=Xct(e),r=qct(this),i=arguments.length,s=i>1?arguments[1]:void 0,a=s!==void 0;a&&(s=Nct(s,i>2?arguments[2]:void 0));var o=Act(n),l=0,u,c,d,f,h,p;if(o&&!(this===zQ&&Kct(o)))for(c=r?new this:[],f=Wct(n,o),h=f.next;!(d=Lct(h,f)).done;l++)p=a?Cct(f,s,[d.value,l],!0):d.value,VQ(c,l,p);else for(u=Dct(n),c=r?new this(u):zQ(u);u>l;l++)p=a?s(n[l],l):n[l],VQ(c,l,p);return c.length=l,c},z0=tn,cI=2147483647,dx=36,vme=1,X8=26,Fct=38,jct=700,Zct=72,Jct=128,Yct="-",Bct=/[^\0-\u007E]/,gme=/[.\u3002\uFF0E\uFF61]/g,kQ="Overflow: input needs wider integers to process",dI=dx-vme,OQ=RangeError,Hct=z0(gme.exec),g1=Math.floor,fI=String.fromCharCode,IQ=z0("".charCodeAt),bme=z0([].join),_h=z0([].push),Qct=z0("".replace),_ct=z0("".split),$ct=z0("".toLowerCase),edt=function(t){for(var e=[],n=0,r=t.length;n=55296&&i<=56319&&n>1,t+=g1(t/e);t>dI*X8>>1;)t=g1(t/dI),r+=dx;return g1(r+(dI+1)*t/(t+Fct))},ndt=function(t){var e=[];t=edt(t);var n=t.length,r=Jct,i=0,s=Zct,a,o;for(a=0;a=r&&og1((cI-i)/d))throw new OQ(kQ);for(i+=(c-r)*d,r=c,a=0;acI)throw new OQ(kQ);if(o===r){for(var f=i,h=dx;;){var p=h<=s?vme:h>=s+X8?X8:h-s;if(fi;){if(s=+arguments[i++],adt(s,1114111)!==s)throw new odt(s+" is not a valid code point");n[i]=s<65536?NQ(s):NQ(((s-=65536)>>10)+55296,s%1024+56320)}return ldt(n,"")}});var C8=rt,yme=on,yD=vfe,cdt=ca,D5=Vn,Au=tn,fx=Gr,Sme=mme,xme=mo,ddt=eu,fdt=Uy,hdt=am,pdt=jT,SD=Fs,Tme=Af,hI=ir,mdt=Yi,vdt=Vi,gdt=sm,bdt=dr,wme=ei,Za=vo,ydt=dd,XQ=rm,CQ=CT,Sdt=XT,W5=P0,Eg=qT,xdt=Vr,Tdt=wq,wdt=xdt("iterator"),Ny="URLSearchParams",Eme=Ny+"Iterator",Mme=SD.set,Kl=SD.getterFor(Ny),Edt=SD.getterFor(Eme),KQ=yD("fetch"),RP=yD("Request"),hx=yD("Headers"),pI=RP&&RP.prototype,qQ=hx&&hx.prototype,Mdt=yme.TypeError,Pdt=yme.encodeURIComponent,Rdt=String.fromCharCode,Vdt=cdt("String","fromCodePoint"),zdt=parseInt,K7=Au("".charAt),DQ=Au([].join),$h=Au([].push),Pme=Au("".replace),kdt=Au([].shift),WQ=Au([].splice),AQ=Au("".split),Rme=Au("".slice),Odt=Au(/./.exec),Idt=/\+/g,mI="�",Udt=/^[0-9a-f]+$/i,GQ=function(t,e){var n=Rme(t,e,e+2);return Odt(Udt,n)?zdt(n,16):NaN},Ndt=function(t){for(var e=0,n=128;n>0&&t&n;n>>=1)e++;return e},Ldt=function(t){var e=null;switch(t.length){case 1:e=t[0];break;case 2:e=(t[0]&31)<<6|t[1]&63;break;case 3:e=(t[0]&15)<<12|(t[1]&63)<<6|t[2]&63;break;case 4:e=(t[0]&7)<<18|(t[1]&63)<<12|(t[2]&63)<<6|t[3]&63;break}return e>1114111?null:e},FQ=function(t){t=Pme(t,Idt," ");for(var e=t.length,n="",r=0;re){n+="%",r++;continue}var s=GQ(t,r+1);if(s!==s){n+=i,r++;continue}r+=2;var a=Ndt(s);if(a===0)i=Rdt(s);else{if(a===1||a>4){n+=mI,r++;continue}for(var o=[s],l=1;le||K7(t,r)!=="%"));){var u=GQ(t,r+1);if(u!==u){r+=3;break}if(u>191||u<128)break;$h(o,u),r+=2,l++}if(o.length!==a){n+=mI;continue}var c=Ldt(o);c===null?n+=mI:i=Vdt(c)}}n+=i,r++}return n},Xdt=/[!'()~]|%20/g,Cdt={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},Kdt=function(t){return Cdt[t]},jQ=function(t){return Pme(Pdt(t),Xdt,Kdt)},vI=pdt(function(e,n){Mme(this,{type:Eme,target:Kl(e).entries,index:0,kind:n})},Ny,function(){var e=Edt(this),n=e.target,r=e.index++;if(!n||r>=n.length)return e.target=null,W5(void 0,!0);var i=n[r];switch(e.kind){case"keys":return W5(i.key,!1);case"values":return W5(i.value,!1)}return W5([i.key,i.value],!1)},!0),Vme=function(t){this.entries=[],this.url=null,t!==void 0&&(wme(t)?this.parseObject(t):this.parseQuery(typeof t=="string"?K7(t,0)==="?"?Rme(t,1):t:Za(t)))};Vme.prototype={type:Ny,bindURL:function(t){this.url=t,this.update()},parseObject:function(t){var e=this.entries,n=Sdt(t),r,i,s,a,o,l,u;if(n)for(r=CQ(t,n),i=r.next;!(s=D5(i,r)).done;){if(a=CQ(bdt(s.value)),o=a.next,(l=D5(o,a)).done||(u=D5(o,a)).done||!D5(o,a).done)throw new Mdt("Expected sequence with length 2");$h(e,{key:Za(l.value),value:Za(u.value)})}else for(var c in t)mdt(t,c)&&$h(e,{key:c,value:Za(t[c])})},parseQuery:function(t){if(t)for(var e=this.entries,n=AQ(t,"&"),r=0,i,s;r0?arguments[0]:void 0,n=Mme(this,new Vme(e));fx||(this.size=n.entries.length)},zb=z9.prototype;fdt(zb,{append:function(e,n){var r=Kl(this);Eg(arguments.length,2),$h(r.entries,{key:Za(e),value:Za(n)}),fx||this.length++,r.updateURL()},delete:function(t){for(var e=Kl(this),n=Eg(arguments.length,1),r=e.entries,i=Za(t),s=n<2?void 0:arguments[1],a=s===void 0?s:Za(s),o=0;or.key?1:-1}),e.updateURL()},forEach:function(e){for(var n=Kl(this).entries,r=vdt(e,arguments.length>1?arguments[1]:void 0),i=0,s;i1?ZQ(arguments[1]):{})}}),hI(RP)){var gI=function(e){return Tme(this,pI),new RP(e,arguments.length>1?ZQ(arguments[1]):{})};pI.constructor=gI,gI.prototype=pI,C8({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:gI})}}var Wdt={URLSearchParams:z9,getState:Kl},Adt=rt,xD=Gr,Gdt=mme,TD=on,JQ=Vi,nu=tn,VP=mo,Ol=eu,Fdt=Af,K8=Yi,wD=kct,Mg=Gct,uu=w0,jdt=GT.codeAt,Zdt=rdt,Nd=vo,Jdt=am,Ydt=qT,zme=Wdt,kme=Fs,Bdt=kme.set,zP=kme.getterFor("URL"),Hdt=zme.URLSearchParams,Qdt=zme.getState,FS=TD.URL,q8=TD.TypeError,kP=TD.parseInt,_dt=Math.floor,YQ=Math.pow,Dl=nu("".charAt),Pu=nu(/./.exec),y3=nu([].join),$dt=nu(1 .toString),eft=nu([].pop),Bg=nu([].push),bI=nu("".replace),tft=nu([].shift),nft=nu("".split),px=nu("".slice),OP=nu("".toLowerCase),rft=nu([].unshift),ift="Invalid authority",yI="Invalid scheme",qm="Invalid host",BQ="Invalid port",Ome=/[a-z]/i,sft=/[\d+-.a-z]/i,D8=/\d/,aft=/^0x/i,oft=/^[0-7]+$/,lft=/^\d+$/,Ime=/^[\da-f]+$/i,uft=/[\0\t\n\r #%/:<>?@[\\\]^|]/,cft=/[\0\t\n\r #/:<>?@[\\\]^|]/,dft=/^[\u0000-\u0020]+/,fft=/(^|[^\u0000-\u0020])[\u0000-\u0020]+$/,hft=/[\t\n\r]/g,Il,pft=function(t){var e=nft(t,"."),n,r,i,s,a,o,l;if(e.length&&e[e.length-1]===""&&e.length--,n=e.length,n>4)return t;for(r=[],i=0;i1&&Dl(s,0)==="0"&&(a=Pu(aft,s)?16:8,s=px(s,a===8?1:2)),s==="")o=0;else{if(!Pu(a===10?lft:a===8?oft:Ime,s))return t;o=kP(s,a)}Bg(r,o)}for(i=0;i=YQ(256,5-n))return null}else if(o>255)return null;for(l=eft(r),i=0;i6))return;for(o=0;f();){if(l=null,o>0)if(f()==="."&&o<4)i++;else return;if(!Pu(D8,f()))return;for(;Pu(D8,f());){if(u=kP(f(),10),l===null)l=u;else{if(l===0)return;l=l*10+u}if(l>255)return;i++}e[n]=e[n]*256+l,o++,(o===2||o===4)&&n++}if(o!==4)return;break}else if(f()===":"){if(i++,!f())return}else if(f())return;e[n++]=s}if(r!==null)for(c=n-r,n=7;n!==0&&c>0;)d=e[n],e[n--]=e[r+c-1],e[r+--c]=d;else if(n!==8)return;return e},vft=function(t){for(var e=null,n=1,r=null,i=0,s=0;s<8;s++)t[s]!==0?(i>n&&(e=r,n=i),r=null,i=0):(r===null&&(r=s),++i);return i>n?r:e},jS=function(t){var e,n,r,i;if(typeof t=="number"){for(e=[],n=0;n<4;n++)rft(e,t%256),t=_dt(t/256);return y3(e,".")}if(typeof t=="object"){for(e="",r=vft(t),n=0;n<8;n++)i&&t[n]===0||(i&&(i=!1),r===n?(e+=n?":":"::",i=!0):(e+=$dt(t[n],16),n<7&&(e+=":")));return"["+e+"]"}return t},q7={},Ume=wD({},q7,{" ":1,'"':1,"<":1,">":1,"`":1}),Nme=wD({},Ume,{"#":1,"?":1,"{":1,"}":1}),SI=wD({},Nme,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),ph=function(t,e){var n=jdt(t,0);return n>32&&n<127&&!K8(e,t)?t:encodeURIComponent(t)},A5={ftp:21,file:null,http:80,https:443,ws:80,wss:443},S3=function(t,e){var n;return t.length===2&&Pu(Ome,Dl(t,0))&&((n=Dl(t,1))===":"||!e&&n==="|")},HQ=function(t){var e;return t.length>1&&S3(px(t,0,2))&&(t.length===2||(e=Dl(t,2))==="/"||e==="\\"||e==="?"||e==="#")},gft=function(t){return t==="."||OP(t)==="%2e"},bft=function(t){return t=OP(t),t===".."||t==="%2e."||t===".%2e"||t==="%2e%2e"},xI={},QQ={},TI={},_Q={},$Q={},wI={},e_={},t_={},G5={},F5={},EI={},MI={},PI={},RI={},n_={},VI={},Pg={},ac={},r_={},Dm={},Pd={},ED=function(t,e,n){var r=Nd(t),i,s,a;if(e){if(s=this.parse(r),s)throw new q8(s);this.searchParams=null}else{if(n!==void 0&&(i=new ED(n,!0)),s=this.parse(r,null,i),s)throw new q8(s);a=Qdt(new Hdt),a.bindURL(this),this.searchParams=a}};ED.prototype={type:"URL",parse:function(t,e,n){var r=this,i=e||xI,s=0,a="",o=!1,l=!1,u=!1,c,d,f,h;for(t=Nd(t),e||(r.scheme="",r.username="",r.password="",r.host=null,r.port=null,r.path=[],r.query=null,r.fragment=null,r.cannotBeABaseURL=!1,t=bI(t,dft,""),t=bI(t,fft,"$1")),t=bI(t,hft,""),c=Mg(t);s<=c.length;){switch(d=c[s],i){case xI:if(d&&Pu(Ome,d))a+=OP(d),i=QQ;else{if(e)return yI;i=TI;continue}break;case QQ:if(d&&(Pu(sft,d)||d==="+"||d==="-"||d==="."))a+=OP(d);else if(d===":"){if(e&&(r.isSpecial()!==K8(A5,a)||a==="file"&&(r.includesCredentials()||r.port!==null)||r.scheme==="file"&&!r.host))return;if(r.scheme=a,e){r.isSpecial()&&A5[r.scheme]===r.port&&(r.port=null);return}a="",r.scheme==="file"?i=RI:r.isSpecial()&&n&&n.scheme===r.scheme?i=_Q:r.isSpecial()?i=t_:c[s+1]==="/"?(i=$Q,s++):(r.cannotBeABaseURL=!0,Bg(r.path,""),i=r_)}else{if(e)return yI;a="",i=TI,s=0;continue}break;case TI:if(!n||n.cannotBeABaseURL&&d!=="#")return yI;if(n.cannotBeABaseURL&&d==="#"){r.scheme=n.scheme,r.path=uu(n.path),r.query=n.query,r.fragment="",r.cannotBeABaseURL=!0,i=Pd;break}i=n.scheme==="file"?RI:wI;continue;case _Q:if(d==="/"&&c[s+1]==="/")i=G5,s++;else{i=wI;continue}break;case $Q:if(d==="/"){i=F5;break}else{i=ac;continue}case wI:if(r.scheme=n.scheme,d===Il)r.username=n.username,r.password=n.password,r.host=n.host,r.port=n.port,r.path=uu(n.path),r.query=n.query;else if(d==="/"||d==="\\"&&r.isSpecial())i=e_;else if(d==="?")r.username=n.username,r.password=n.password,r.host=n.host,r.port=n.port,r.path=uu(n.path),r.query="",i=Dm;else if(d==="#")r.username=n.username,r.password=n.password,r.host=n.host,r.port=n.port,r.path=uu(n.path),r.query=n.query,r.fragment="",i=Pd;else{r.username=n.username,r.password=n.password,r.host=n.host,r.port=n.port,r.path=uu(n.path),r.path.length--,i=ac;continue}break;case e_:if(r.isSpecial()&&(d==="/"||d==="\\"))i=G5;else if(d==="/")i=F5;else{r.username=n.username,r.password=n.password,r.host=n.host,r.port=n.port,i=ac;continue}break;case t_:if(i=G5,d!=="/"||Dl(a,s+1)!=="/")continue;s++;break;case G5:if(d!=="/"&&d!=="\\"){i=F5;continue}break;case F5:if(d==="@"){o&&(a="%40"+a),o=!0,f=Mg(a);for(var p=0;p65535)return BQ;r.port=r.isSpecial()&&g===A5[r.scheme]?null:g,a=""}if(e)return;i=Pg;continue}else return BQ;break;case RI:if(r.scheme="file",d==="/"||d==="\\")i=n_;else if(n&&n.scheme==="file")switch(d){case Il:r.host=n.host,r.path=uu(n.path),r.query=n.query;break;case"?":r.host=n.host,r.path=uu(n.path),r.query="",i=Dm;break;case"#":r.host=n.host,r.path=uu(n.path),r.query=n.query,r.fragment="",i=Pd;break;default:HQ(y3(uu(c,s),""))||(r.host=n.host,r.path=uu(n.path),r.shortenPath()),i=ac;continue}else{i=ac;continue}break;case n_:if(d==="/"||d==="\\"){i=VI;break}n&&n.scheme==="file"&&!HQ(y3(uu(c,s),""))&&(S3(n.path[0],!0)?Bg(r.path,n.path[0]):r.host=n.host),i=ac;continue;case VI:if(d===Il||d==="/"||d==="\\"||d==="?"||d==="#"){if(!e&&S3(a))i=ac;else if(a===""){if(r.host="",e)return;i=Pg}else{if(h=r.parseHost(a),h)return h;if(r.host==="localhost"&&(r.host=""),e)return;a="",i=Pg}continue}else a+=d;break;case Pg:if(r.isSpecial()){if(i=ac,d!=="/"&&d!=="\\")continue}else if(!e&&d==="?")r.query="",i=Dm;else if(!e&&d==="#")r.fragment="",i=Pd;else if(d!==Il&&(i=ac,d!=="/"))continue;break;case ac:if(d===Il||d==="/"||d==="\\"&&r.isSpecial()||!e&&(d==="?"||d==="#")){if(bft(a)?(r.shortenPath(),d!=="/"&&!(d==="\\"&&r.isSpecial())&&Bg(r.path,"")):gft(a)?d!=="/"&&!(d==="\\"&&r.isSpecial())&&Bg(r.path,""):(r.scheme==="file"&&!r.path.length&&S3(a)&&(r.host&&(r.host=""),a=Dl(a,0)+":"),Bg(r.path,a)),a="",r.scheme==="file"&&(d===Il||d==="?"||d==="#"))for(;r.path.length>1&&r.path[0]==="";)tft(r.path);d==="?"?(r.query="",i=Dm):d==="#"&&(r.fragment="",i=Pd)}else a+=ph(d,Nme);break;case r_:d==="?"?(r.query="",i=Dm):d==="#"?(r.fragment="",i=Pd):d!==Il&&(r.path[0]+=ph(d,q7));break;case Dm:!e&&d==="#"?(r.fragment="",i=Pd):d!==Il&&(d==="'"&&r.isSpecial()?r.query+="%27":d==="#"?r.query+="%23":r.query+=ph(d,q7));break;case Pd:d!==Il&&(r.fragment+=ph(d,Ume));break}s++}},parseHost:function(t){var e,n,r;if(Dl(t,0)==="["){if(Dl(t,t.length-1)!=="]"||(e=mft(px(t,1,-1)),!e))return qm;this.host=e}else if(this.isSpecial()){if(t=Zdt(t),Pu(uft,t)||(e=pft(t),e===null))return qm;this.host=e}else{if(Pu(cft,t))return qm;for(e="",n=Mg(t),r=0;r1?arguments[1]:void 0,i=Bdt(n,new ED(e,!1,r));xD||(n.href=i.serialize(),n.origin=i.getOrigin(),n.protocol=i.getProtocol(),n.username=i.getUsername(),n.password=i.getPassword(),n.host=i.getHost(),n.hostname=i.getHostname(),n.port=i.getPort(),n.pathname=i.getPathname(),n.search=i.getSearch(),n.searchParams=i.getSearchParams(),n.hash=i.getHash())},ja=kb.prototype,Ul=function(t,e){return{get:function(){return zP(this)[t]()},set:e&&function(n){return zP(this)[e](n)},configurable:!0,enumerable:!0}};xD&&(Ol(ja,"href",Ul("serialize","setHref")),Ol(ja,"origin",Ul("getOrigin")),Ol(ja,"protocol",Ul("getProtocol","setProtocol")),Ol(ja,"username",Ul("getUsername","setUsername")),Ol(ja,"password",Ul("getPassword","setPassword")),Ol(ja,"host",Ul("getHost","setHost")),Ol(ja,"hostname",Ul("getHostname","setHostname")),Ol(ja,"port",Ul("getPort","setPort")),Ol(ja,"pathname",Ul("getPathname","setPathname")),Ol(ja,"search",Ul("getSearch","setSearch")),Ol(ja,"searchParams",Ul("getSearchParams")),Ol(ja,"hash",Ul("getHash","setHash")));VP(ja,"toJSON",function(){return zP(this).serialize()},{enumerable:!0});VP(ja,"toString",function(){return zP(this).serialize()},{enumerable:!0});if(FS){var i_=FS.createObjectURL,s_=FS.revokeObjectURL;i_&&VP(kb,"createObjectURL",JQ(i_,FS)),s_&&VP(kb,"revokeObjectURL",JQ(s_,FS))}Jdt(kb,"URL");Adt({global:!0,constructor:!0,forced:!Gdt,sham:!xD},{URL:kb});var yft=rt,Sft=Vn;yft({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return Sft(URL.prototype.toString,this)}});var xft=typeof global=="object"&&global&&global.Object===Object&&global;const Tft=xft;var wft=typeof self=="object"&&self&&self.Object===Object&&self,Eft=Tft||wft||Function("return this")();const Mft=Eft;var Pft=Mft.Symbol;const IP=Pft;var Lme=Object.prototype,Rft=Lme.hasOwnProperty,Vft=Lme.toString,ZS=IP?IP.toStringTag:void 0;function zft(t){var e=Rft.call(t,ZS),n=t[ZS];try{t[ZS]=void 0;var r=!0}catch{}var i=Vft.call(t);return r&&(e?t[ZS]=n:delete t[ZS]),i}var kft=Object.prototype,Oft=kft.toString;function Ift(t){return Oft.call(t)}var Uft="[object Null]",Nft="[object Undefined]",a_=IP?IP.toStringTag:void 0;function MD(t){return t==null?t===void 0?Nft:Uft:a_&&a_ in Object(t)?zft(t):Ift(t)}function Xme(t){return t!=null&&typeof t=="object"}var Lft="[object Symbol]";function Xft(t){return typeof t=="symbol"||Xme(t)&&MD(t)==Lft}var Cft=Array.isArray;const Kft=Cft;var qft=/\s/;function Dft(t){for(var e=t.length;e--&&qft.test(t.charAt(e)););return e}var Wft=/^\s+/;function Aft(t){return t&&t.slice(0,Dft(t)+1).replace(Wft,"")}function UP(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}var o_=0/0,Gft=/^[-+]0x[0-9a-f]+$/i,Fft=/^0b[01]+$/i,jft=/^0o[0-7]+$/i,Zft=parseInt;function Jft(t){if(typeof t=="number")return t;if(Xft(t))return o_;if(UP(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=UP(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=Aft(t);var n=Fft.test(t);return n||jft.test(t)?Zft(t.slice(2),n?2:8):Gft.test(t)?o_:+t}var l_=1/0,Yft=17976931348623157e292;function Bft(t){if(!t)return t===0?t:0;if(t=Jft(t),t===l_||t===-l_){var e=t<0?-1:1;return e*Yft}return t===t?t:0}function Hft(t){var e=Bft(t),n=e%1;return e===e?n?e-n:e:0}var Qft="[object AsyncFunction]",_ft="[object Function]",$ft="[object GeneratorFunction]",eht="[object Proxy]";function tht(t){if(!UP(t))return!1;var e=MD(t);return e==_ft||e==$ft||e==Qft||e==eht}var nht=9007199254740991,rht=/^(?:0|[1-9]\d*)$/;function iht(t,e){var n=typeof t;return e=e??nht,!!e&&(n=="number"||n!="symbol"&&rht.test(t))&&t>-1&&t%1==0&&t-1&&t%1==0&&t<=aht}function lht(t){return t!=null&&oht(t.length)&&!tht(t)}function uht(t,e,n){if(!UP(n))return!1;var r=typeof e;return(r=="number"?lht(n)&&iht(e,n.length):r=="string"&&e in n)?sht(n[e],t):!1}function cht(t,e,n){var r=-1,i=t.length;e<0&&(e=-e>i?0:i+e),n=n>i?i:n,n<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var s=Array(i);++r ",performance.now()-n);const i=r[0];return new class extends VD{constructor(){super({serverUrl:"dummy",streamId:"dummy",undefined:void 0,objectId:i.id}),this.objectId=i.id}async getRootObject(){return i}async getTotalObjectCount(){return Object.keys((i==null?void 0:i.__closure)||{}).length}async*getObjectIterator(){const s=Date.now();let a=0;for await(const{id:o,obj:l}of this.getRawObjectIterator(r))this.buffer[o]=l,a+=1,yield l;this.logger("Loaded ".concat(a," objects in: ").concat((Date.now()-s)/1e3))}async*getRawObjectIterator(s){if(yield{id:s[0].id,obj:s[0]},s[0].__closure)for(const a of s)yield{id:a.id,obj:a}}}}async asyncPause(){Date.now()-this.lastAsyncPause>=100&&(this.lastAsyncPause=Date.now(),this.existingAsyncPause=new Promise(e=>setTimeout(e,0)),await this.existingAsyncPause,this.existingAsyncPause=null,Date.now()-this.lastAsyncPause>500&&this.logger("Loader Event loop lag: ",Date.now()-this.lastAsyncPause))}dispose(){this.buffer=[],this.promises=[],Object.values(this.intervals).forEach(e=>clearInterval(e.interval))}async getTotalObjectCount(){const e=await this.getRawRootObject(),n=JSON.parse(e);return Object.keys((n==null?void 0:n.__closure)||{}).length}async getRootObject(){const e=await this.getRawRootObject();return JSON.parse(e)}async getAndConstructObject(e){await this.downloadObjectsInBuffer(e);const n=await this.getObject(this.objectId);return this.traverseAndConstruct(n,e)}async downloadObjectsInBuffer(e){let n=!0,r=0;for await(const i of this.getObjectIterator())n&&(this.totalChildrenCount=i.totalChildrenCount,n=!1,this.isLoading=!0),r++,e&&e({stage:"download",current:r,total:this.totalChildrenCount});this.isLoading=!1}async traverseAndConstruct(e,n){if(e){if(typeof e!="object")return e;if(Array.isArray(e)&&e.length!==0){var r,i;const s=[];for(const a of e){if(!a)continue;if(typeof a!="object"&&!this.options.fullyTraverseArrays)return e;const o=a.referencedId?await this.getObject(a.referencedId):a;a.referencedId&&n&&n({stage:"construction",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount}),s.push(await this.traverseAndConstruct(o,n))}return(r=s[0])!==null&&r!==void 0&&(i=r.speckle_type)!==null&&i!==void 0&&i.toLowerCase().includes("datachunk")?s.reduce((a,o)=>a.concat(o.data),[]):s}for(const s of this.options.excludeProps)delete e[s];for(const s in e)typeof e[s]=="object"&&e[s]!==null&&(e[s].referencedId&&(e[s]=await this.getObject(e[s].referencedId),n&&n({stage:"construction",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount})),e[s]=await this.traverseAndConstruct(e[s],n));return e}}async getObject(e){return this.buffer[e]?this.buffer[e]:new Promise((n,r)=>{if(this.promises.push({id:e,resolve:n,reject:r}),this.intervals[e])this.intervals[e].elapsed=0;else{const i=setInterval(this.tryResolvePromise.bind(this),this.INTERVAL_MS,e);this.intervals[e]={interval:i,elapsed:0}}})}tryResolvePromise(e){if(this.intervals[e].elapsed+=this.INTERVAL_MS,this.buffer[e]){for(const n of this.promises.filter(r=>r.id===e))n.resolve(this.buffer[e]);return clearInterval(this.intervals[e].interval),void delete this.intervals[e]}this.intervals[e].elapsed>this.TIMEOUT_MS&&(this.warner("Timeout resolving ".concat(e,". HIC SVNT DRACONES.")),clearInterval(this.intervals[e].interval),this.promises.filter(n=>n.id===e).forEach(n=>n.reject()),this.promises=this.promises.filter(n=>n.id!=n.id))}async*getObjectIterator(){const e=Date.now();let n=0;for await(const r of this.getRawObjectIterator()){const{id:i,obj:s}=this.processLine(r);this.buffer[i]=s,n+=1,yield s}this.logger("Loaded ".concat(n," objects in: ").concat((Date.now()-e)/1e3))}processLine(e){const n=e.split(" "),[r,i]=n;let s;try{s=JSON.parse(i)}catch(a){throw new Error("Error parsing object ".concat(r,": ").concat(a.message))}return{id:r,obj:s}}supportsCache(){return!(!this.options.enableCaching||!globalThis.indexedDB)}async setupCacheDb(){if(!this.supportsCache()||this.cacheDB!==null)return;await function(){if(navigator.userAgentData||!/Safari\//.test(navigator.userAgent)||/Chrom(e|ium)\//.test(navigator.userAgent)||!indexedDB.databases)return Promise.resolve();let n;return new Promise(r=>{const i=()=>indexedDB.databases().finally(r);n=setInterval(i,100),i()}).finally(()=>clearInterval(n))}();const e=indexedDB.open("speckle-object-cache",1);e.onupgradeneeded=()=>e.result.createObjectStore("objects"),this.cacheDB=await this.promisifyIdbRequest(e)}async*getRawObjectIterator(){await this.setupCacheDb();const e=await this.getRawRootObject();yield"".concat(this.objectId," ").concat(e);const n=JSON.parse(e);if(!n.__closure)return;let r=Object.keys(n.__closure).filter(c=>!c.includes("blob")).sort((c,d)=>n.__closure[c]-n.__closure[d]);if(r.length===0)return;let i=[];if(r.length>50){const c=[[],[],[],[]];let d=0;for(;d<.05*r.length;d++)c[0].push(r[d]);for(;d<.2*r.length;d++)c[1].push(r[d]);for(;d<.6*r.length;d++)c[2].push(r[d]);for(;dn.__closure[y]-n.__closure[x]);for(const y of v)yield"".concat(y," ").concat(m[y]);const g=c[p].filter(y=>!(y in m)),b=hht(g,500);for(let y=0;yn.__closure[f]-n.__closure[h]);for(const f of d)yield"".concat(f," ").concat(c[f]);if(r=r.filter(f=>!(f in c)),r.length===0)return;i.push(r)}const s=[],a=[],o=[],l=[],u=[];for(let c=0;c{d.body.getReader&&(d.body.iterator=async function*(){const p=this.getReader();for(;;){const m=await p.read();if(m.done)return m.value;yield m.value}});const f=d.body.iterator();a[c]=f;const h=f.next().then(p=>(p.reqId=c,p));o[c]=h});for(;;){const c=o.filter(g=>!!g);if(c.length===0){if(u.every(g=>g))break;await new Promise(g=>{setTimeout(g,10)});continue}const d=await Promise.any(c);let{value:f,done:h,reqId:p}=d;if(u[p]=h,h)l[p].length>0&&(yield l[p],l[p]=""),o[p]=null;else{const g=a[p].next().then(b=>(b.reqId=p,b));o[p]=g}if(!f)continue;f=s[p].decode(f);const m=(l[p]+f).split(/\r\n|\n|\r/),v=m.pop();l[p]=v;for(const g of m)yield g;this.cacheStoreObjects(m)}}async getRawRootObject(){const e=await this.cacheGetObjects([this.objectId]);if(e[this.objectId])return e[this.objectId];const n=await this.fetch(this.requestUrlRootObj,{headers:this.headers}),r=await n.text();if([401,403].includes(n.status))throw new W8("You do not have access to the root object!");return this.cacheStoreObjects(["".concat(this.objectId," ").concat(r)]),r}promisifyIdbRequest(e){return new Promise((n,r)=>{e.oncomplete=e.onsuccess=()=>n(e.result),e.onabort=e.onerror=()=>r(e.error)})}async cacheGetObjects(e){if(!this.supportsCache())return{};this.cacheDB===null&&await this.setupCacheDb();const n={};for(let r=0;rthis.promisifyIdbRequest(s.get(l)).then(u=>({id:l,data:u}))),o=await Promise.all(a);for(const l of o)!l.data||u_(l.data)&&l.data.startsWith(">8&255]+Bs[t>>16&255]+Bs[t>>24&255]+"-"+Bs[e&255]+Bs[e>>8&255]+"-"+Bs[e>>16&15|64]+Bs[e>>24&255]+"-"+Bs[n&63|128]+Bs[n>>8&255]+"-"+Bs[n>>16&255]+Bs[n>>24&255]+Bs[r&255]+Bs[r>>8&255]+Bs[r>>16&255]+Bs[r>>24&255]).toLowerCase()}var Cme={exports:{}};/*! +}`;function Lce(t,e,n){let r=new wT;const i=new Oe,s=new Oe,a=new Qt,o=new my({depthPacking:ST}),l=new ET,u={},c=n.maxTextureSize,d={0:Ua,1:Ki,2:rn},f=new bi({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new Oe},radius:{value:4}},vertexShader:ZXe,fragmentShader:JXe}),h=f.clone();h.defines.HORIZONTAL_PASS=1;const p=new Lt;p.setAttribute("position",new un(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const m=new ut(p,f),v=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=fK,this.render=function(x,T,M){if(v.enabled===!1||v.autoUpdate===!1&&v.needsUpdate===!1||x.length===0)return;const E=t.getRenderTarget(),S=t.getActiveCubeFace(),P=t.getActiveMipmapLevel(),R=t.state;R.setBlending(os),R.buffers.color.setClear(1,1,1,1),R.buffers.depth.setTest(!0),R.setScissorTest(!1);for(let V=0,z=x.length;Vc||i.y>c)&&(i.x>c&&(s.x=Math.floor(c/q.x),i.x=s.x*q.x,N.mapSize.x=s.x),i.y>c&&(s.y=Math.floor(c/q.y),i.y=s.y*q.y,N.mapSize.y=s.y)),N.map===null&&!N.isPointLightShadow&&this.type===cv&&(N.map=new oi(i.x,i.y),N.map.texture.name=k.name+".shadowMap",N.mapPass=new oi(i.x,i.y),N.camera.updateProjectionMatrix()),N.map===null){const A={minFilter:Ir,magFilter:Ir,format:no};N.map=new oi(i.x,i.y,A),N.map.texture.name=k.name+".shadowMap",N.camera.updateProjectionMatrix()}t.setRenderTarget(N.map),t.clear();const L=N.getViewportCount();for(let A=0;A0){const z=R.uuid,k=T.uuid;let N=u[z];N===void 0&&(N={},u[z]=N);let q=N[k];q===void 0&&(q=R.clone(),N[k]=q),R=q}return R.visible=T.visible,R.wireframe=T.wireframe,P===cv?R.side=T.shadowSide!==null?T.shadowSide:T.side:R.side=T.shadowSide!==null?T.shadowSide:d[T.side],R.alphaMap=T.alphaMap,R.alphaTest=T.alphaTest,R.clipShadows=T.clipShadows,R.clippingPlanes=T.clippingPlanes,R.clipIntersection=T.clipIntersection,R.displacementMap=T.displacementMap,R.displacementScale=T.displacementScale,R.displacementBias=T.displacementBias,R.wireframeLinewidth=T.wireframeLinewidth,R.linewidth=T.linewidth,M.isPointLight===!0&&R.isMeshDistanceMaterial===!0&&(R.referencePosition.setFromMatrixPosition(M.matrixWorld),R.nearDistance=E,R.farDistance=S),R}function y(x,T,M,E,S){if(x.visible===!1)return;if(x.layers.test(T.layers)&&(x.isMesh||x.isLine||x.isPoints)&&(x.castShadow||x.receiveShadow&&S===cv)&&(!x.frustumCulled||r.intersectsObject(x))){x.modelViewMatrix.multiplyMatrices(M.matrixWorldInverse,x.matrixWorld);const V=e.update(x),z=x.material;if(Array.isArray(z)){const k=V.groups;for(let N=0,q=k.length;N=1):L.indexOf("OpenGL ES")!==-1&&(q=parseFloat(/^OpenGL ES (\d)/.exec(L)[1]),N=q>=2);let A=null,J={};const F=t.getParameter(3088),ne=t.getParameter(2978),j=new Qt().fromArray(F),Z=new Qt().fromArray(ne);function _(Q,Pe,Ve){const Fe=new Uint8Array(4),je=t.createTexture();t.bindTexture(Q,je),t.texParameteri(Q,10241,9728),t.texParameteri(Q,10240,9728);for(let Ze=0;Zeme||W.height>me)&&(We=me/Math.max(W.width,W.height)),We<1||K===!0)if(typeof HTMLImageElement<"u"&&W instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&W instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&W instanceof ImageBitmap){const Ce=K?aP:Math.floor,Ae=Ce(We*W.width),Y=Ce(We*W.height);m===void 0&&(m=b(Ae,Y));const ce=ie?b(Ae,Y):m;return ce.width=Ae,ce.height=Y,ce.getContext("2d").drawImage(W,0,0,Ae,Y),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+W.width+"x"+W.height+") to ("+Ae+"x"+Y+")."),ce}else return"data"in W&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+W.width+"x"+W.height+")."),W;return W}function x(W){return ZL(W.width)&&ZL(W.height)}function T(W){return o?!1:W.wrapS!==_a||W.wrapT!==_a||W.minFilter!==Ir&&W.minFilter!==Hn}function M(W,K){return W.generateMipmaps&&K&&W.minFilter!==Ir&&W.minFilter!==Hn}function E(W){t.generateMipmap(W)}function S(W,K,ie,me,We=!1){if(o===!1)return K;if(W!==null){if(t[W]!==void 0)return t[W];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+W+"'")}let Ce=K;return K===6403&&(ie===5126&&(Ce=33326),ie===5131&&(Ce=33325),ie===5121&&(Ce=33321)),K===33319&&(ie===5126&&(Ce=33328),ie===5131&&(Ce=33327),ie===5121&&(Ce=33323)),K===6408&&(ie===5126&&(Ce=34836),ie===5131&&(Ce=34842),ie===5121&&(Ce=me===Jr&&We===!1?35907:32856),ie===32819&&(Ce=32854),ie===32820&&(Ce=32855)),(Ce===33325||Ce===33326||Ce===33327||Ce===33328||Ce===34842||Ce===34836)&&e.get("EXT_color_buffer_float"),Ce}function P(W,K,ie){return M(W,ie)===!0||W.isFramebufferTexture&&W.minFilter!==Ir&&W.minFilter!==Hn?Math.log2(Math.max(K.width,K.height))+1:W.mipmaps!==void 0&&W.mipmaps.length>0?W.mipmaps.length:W.isCompressedTexture&&Array.isArray(W.image)?K.mipmaps.length:1}function R(W){return W===Ir||W===rP||W===iP?9728:9729}function V(W){const K=W.target;K.removeEventListener("dispose",V),k(K),K.isVideoTexture&&p.delete(K)}function z(W){const K=W.target;K.removeEventListener("dispose",z),q(K)}function k(W){const K=r.get(W);if(K.__webglInit===void 0)return;const ie=W.source,me=v.get(ie);if(me){const We=me[K.__cacheKey];We.usedTimes--,We.usedTimes===0&&N(W),Object.keys(me).length===0&&v.delete(ie)}r.remove(W)}function N(W){const K=r.get(W);t.deleteTexture(K.__webglTexture);const ie=W.source,me=v.get(ie);delete me[K.__cacheKey],a.memory.textures--}function q(W){const K=W.texture,ie=r.get(W),me=r.get(K);if(me.__webglTexture!==void 0&&(t.deleteTexture(me.__webglTexture),a.memory.textures--),W.depthTexture&&W.depthTexture.dispose(),W.isWebGLCubeRenderTarget)for(let We=0;We<6;We++)t.deleteFramebuffer(ie.__webglFramebuffer[We]),ie.__webglDepthbuffer&&t.deleteRenderbuffer(ie.__webglDepthbuffer[We]);else t.deleteFramebuffer(ie.__webglFramebuffer),ie.__webglDepthbuffer&&t.deleteRenderbuffer(ie.__webglDepthbuffer),ie.__webglMultisampledFramebuffer&&t.deleteFramebuffer(ie.__webglMultisampledFramebuffer),ie.__webglColorRenderbuffer&&t.deleteRenderbuffer(ie.__webglColorRenderbuffer),ie.__webglDepthRenderbuffer&&t.deleteRenderbuffer(ie.__webglDepthRenderbuffer);if(W.isWebGLMultipleRenderTargets)for(let We=0,Ce=K.length;We=l&&console.warn("THREE.WebGLTextures: Trying to use "+W+" texture units while this GPU supports only "+l),L+=1,W}function F(W){const K=[];return K.push(W.wrapS),K.push(W.wrapT),K.push(W.magFilter),K.push(W.minFilter),K.push(W.anisotropy),K.push(W.internalFormat),K.push(W.format),K.push(W.type),K.push(W.generateMipmaps),K.push(W.premultiplyAlpha),K.push(W.flipY),K.push(W.unpackAlignment),K.push(W.encoding),K.join()}function ne(W,K){const ie=r.get(W);if(W.isVideoTexture&&we(W),W.isRenderTargetTexture===!1&&W.version>0&&ie.__version!==W.version){const me=W.image;if(me===null)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else if(me.complete===!1)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else{oe(ie,W,K);return}}n.activeTexture(33984+K),n.bindTexture(3553,ie.__webglTexture)}function j(W,K){const ie=r.get(W);if(W.version>0&&ie.__version!==W.version){oe(ie,W,K);return}n.activeTexture(33984+K),n.bindTexture(35866,ie.__webglTexture)}function Z(W,K){const ie=r.get(W);if(W.version>0&&ie.__version!==W.version){oe(ie,W,K);return}n.activeTexture(33984+K),n.bindTexture(32879,ie.__webglTexture)}function _(W,K){const ie=r.get(W);if(W.version>0&&ie.__version!==W.version){ge(ie,W,K);return}n.activeTexture(33984+K),n.bindTexture(34067,ie.__webglTexture)}const le={[yf]:10497,[_a]:33071,[a6]:33648},fe={[Ir]:9728,[rP]:9984,[iP]:9986,[Hn]:9729,[yK]:9985,[b0]:9987};function te(W,K,ie){if(ie?(t.texParameteri(W,10242,le[K.wrapS]),t.texParameteri(W,10243,le[K.wrapT]),(W===32879||W===35866)&&t.texParameteri(W,32882,le[K.wrapR]),t.texParameteri(W,10240,fe[K.magFilter]),t.texParameteri(W,10241,fe[K.minFilter])):(t.texParameteri(W,10242,33071),t.texParameteri(W,10243,33071),(W===32879||W===35866)&&t.texParameteri(W,32882,33071),(K.wrapS!==_a||K.wrapT!==_a)&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),t.texParameteri(W,10240,R(K.magFilter)),t.texParameteri(W,10241,R(K.minFilter)),K.minFilter!==Ir&&K.minFilter!==Hn&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")),e.has("EXT_texture_filter_anisotropic")===!0){const me=e.get("EXT_texture_filter_anisotropic");if(K.type===na&&e.has("OES_texture_float_linear")===!1||o===!1&&K.type===Uo&&e.has("OES_texture_half_float_linear")===!1)return;(K.anisotropy>1||r.get(K).__currentAnisotropy)&&(t.texParameterf(W,me.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(K.anisotropy,i.getMaxAnisotropy())),r.get(K).__currentAnisotropy=K.anisotropy)}}function $(W,K){let ie=!1;W.__webglInit===void 0&&(W.__webglInit=!0,K.addEventListener("dispose",V));const me=K.source;let We=v.get(me);We===void 0&&(We={},v.set(me,We));const Ce=F(K);if(Ce!==W.__cacheKey){We[Ce]===void 0&&(We[Ce]={texture:t.createTexture(),usedTimes:0},a.memory.textures++,ie=!0),We[Ce].usedTimes++;const Ae=We[W.__cacheKey];Ae!==void 0&&(We[W.__cacheKey].usedTimes--,Ae.usedTimes===0&&N(K)),W.__cacheKey=Ce,W.__webglTexture=We[Ce].texture}return ie}function oe(W,K,ie){let me=3553;K.isDataArrayTexture&&(me=35866),K.isData3DTexture&&(me=32879);const We=$(W,K),Ce=K.source;if(n.activeTexture(33984+ie),n.bindTexture(me,W.__webglTexture),Ce.version!==Ce.__currentVersion||We===!0){t.pixelStorei(37440,K.flipY),t.pixelStorei(37441,K.premultiplyAlpha),t.pixelStorei(3317,K.unpackAlignment),t.pixelStorei(37443,0);const Ae=T(K)&&x(K.image)===!1;let Y=y(K.image,Ae,!1,c);Y=se(K,Y);const ce=x(Y)||o,be=s.convert(K.format,K.encoding);let Se=s.convert(K.type),Q=S(K.internalFormat,be,Se,K.encoding,K.isVideoTexture);te(me,K,ce);let Pe;const Ve=K.mipmaps,Fe=o&&K.isVideoTexture!==!0,je=W.__version===void 0||We===!0,Ze=P(K,Y,ce);if(K.isDepthTexture)Q=6402,o?K.type===na?Q=36012:K.type===nx?Q=33190:K.type===Pv?Q=35056:Q=33189:K.type===na&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),K.format===dp&&Q===6402&&K.type!==pb&&K.type!==nx&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),K.type=pb,Se=s.convert(K.type)),K.format===Wv&&Q===6402&&(Q=34041,K.type!==Pv&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),K.type=Pv,Se=s.convert(K.type))),je&&(Fe?n.texStorage2D(3553,1,Q,Y.width,Y.height):n.texImage2D(3553,0,Q,Y.width,Y.height,0,be,Se,null));else if(K.isDataTexture)if(Ve.length>0&&ce){Fe&&je&&n.texStorage2D(3553,Ze,Q,Ve[0].width,Ve[0].height);for(let Re=0,Me=Ve.length;Re>=1,Me>>=1}}else if(Ve.length>0&&ce){Fe&&je&&n.texStorage2D(3553,Ze,Q,Ve[0].width,Ve[0].height);for(let Re=0,Me=Ve.length;Re0&&je++,n.texStorage2D(34067,je,Pe,Y[0].width,Y[0].height));for(let Re=0;Re<6;Re++)if(Ae){Ve?n.texSubImage2D(34069+Re,0,0,0,Y[Re].width,Y[Re].height,Se,Q,Y[Re].data):n.texImage2D(34069+Re,0,Pe,Y[Re].width,Y[Re].height,0,Se,Q,Y[Re].data);for(let Me=0;Me0&&ye(W)===!1){ie.__webglMultisampledFramebuffer=t.createFramebuffer(),ie.__webglColorRenderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(36161,ie.__webglColorRenderbuffer);const Y=s.convert(K.format,K.encoding),ce=s.convert(K.type),be=S(K.internalFormat,Y,ce,K.encoding),Se=he(W);t.renderbufferStorageMultisample(36161,Se,be,W.width,W.height),n.bindFramebuffer(36160,ie.__webglMultisampledFramebuffer),t.framebufferRenderbuffer(36160,36064,36161,ie.__webglColorRenderbuffer),t.bindRenderbuffer(36161,null),W.depthBuffer&&(ie.__webglDepthRenderbuffer=t.createRenderbuffer(),Ke(ie.__webglDepthRenderbuffer,W,!0)),n.bindFramebuffer(36160,null)}if(We){n.bindTexture(34067,me.__webglTexture),te(34067,K,Ae);for(let Y=0;Y<6;Y++)ve(ie.__webglFramebuffer[Y],W,K,36064,34069+Y);M(K,Ae)&&E(34067),n.unbindTexture()}else if(Ce){const Y=W.texture;for(let ce=0,be=Y.length;ce0&&ye(W)===!1){const K=W.width,ie=W.height;let me=16384;const We=[36064],Ce=W.stencilBuffer?33306:36096;W.depthBuffer&&We.push(Ce);const Ae=r.get(W),Y=Ae.__ignoreDepthValues!==void 0?Ae.__ignoreDepthValues:!1;Y===!1&&(W.depthBuffer&&(me|=256),W.stencilBuffer&&(me|=1024)),n.bindFramebuffer(36008,Ae.__webglMultisampledFramebuffer),n.bindFramebuffer(36009,Ae.__webglFramebuffer),Y===!0&&(t.invalidateFramebuffer(36008,[Ce]),t.invalidateFramebuffer(36009,[Ce])),t.blitFramebuffer(0,0,K,ie,0,0,K,ie,me,9728),h&&t.invalidateFramebuffer(36008,We),n.bindFramebuffer(36008,null),n.bindFramebuffer(36009,Ae.__webglMultisampledFramebuffer)}}function he(W){return Math.min(d,W.samples)}function ye(W){const K=r.get(W);return o&&W.samples>0&&e.has("WEBGL_multisampled_render_to_texture")===!0&&K.__useRenderToTexture!==!1}function we(W){const K=a.render.frame;p.get(W)!==K&&(p.set(W,K),W.update())}function se(W,K){const ie=W.encoding,me=W.format,We=W.type;return W.isCompressedTexture===!0||W.isVideoTexture===!0||W.format===sP||ie!==bl&&(ie===Jr?o===!1?e.has("EXT_sRGB")===!0&&me===no?(W.format=sP,W.minFilter=Hn,W.generateMipmaps=!1):K=nm.sRGBToLinear(K):(me!==no||We!==Np)&&console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture encoding:",ie)),K}this.allocateTextureUnit=J,this.resetTextureUnits=A,this.setTexture2D=ne,this.setTexture2DArray=j,this.setTexture3D=Z,this.setTextureCube=_,this.rebindTextures=G,this.setupRenderTarget=re,this.updateRenderTargetMipmap=de,this.updateMultisampleRenderTarget=Te,this.setupDepthRenderbuffer=D,this.setupFrameBufferTexture=ve,this.useMultisampledRTT=ye}function Xce(t,e,n){const r=n.isWebGL2;function i(s,a=null){let o;if(s===Np)return 5121;if(s===_ue)return 32819;if(s===$ue)return 32820;if(s===Bue)return 5120;if(s===Hue)return 5122;if(s===pb)return 5123;if(s===Que)return 5124;if(s===nx)return 5125;if(s===na)return 5126;if(s===Uo)return r?5131:(o=e.get("OES_texture_half_float"),o!==null?o.HALF_FLOAT_OES:null);if(s===ece)return 6406;if(s===no)return 6408;if(s===nce)return 6409;if(s===rce)return 6410;if(s===dp)return 6402;if(s===Wv)return 34041;if(s===CV)return 6403;if(s===tce)return console.warn("THREE.WebGLRenderer: THREE.RGBFormat has been removed. Use THREE.RGBAFormat instead. https://github.com/mrdoob/three.js/pull/23228"),6408;if(s===sP)return o=e.get("EXT_sRGB"),o!==null?o.SRGB_ALPHA_EXT:null;if(s===ice)return 36244;if(s===sce)return 33319;if(s===ace)return 33320;if(s===oce)return 36249;if(s===S7||s===x7||s===T7||s===w7)if(a===Jr)if(o=e.get("WEBGL_compressed_texture_s3tc_srgb"),o!==null){if(s===S7)return o.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(s===x7)return o.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(s===T7)return o.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(s===w7)return o.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(o=e.get("WEBGL_compressed_texture_s3tc"),o!==null){if(s===S7)return o.COMPRESSED_RGB_S3TC_DXT1_EXT;if(s===x7)return o.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(s===T7)return o.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(s===w7)return o.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(s===EL||s===ML||s===PL||s===RL)if(o=e.get("WEBGL_compressed_texture_pvrtc"),o!==null){if(s===EL)return o.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(s===ML)return o.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(s===PL)return o.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(s===RL)return o.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(s===lce)return o=e.get("WEBGL_compressed_texture_etc1"),o!==null?o.COMPRESSED_RGB_ETC1_WEBGL:null;if(s===VL||s===zL)if(o=e.get("WEBGL_compressed_texture_etc"),o!==null){if(s===VL)return a===Jr?o.COMPRESSED_SRGB8_ETC2:o.COMPRESSED_RGB8_ETC2;if(s===zL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:o.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(s===kL||s===OL||s===IL||s===UL||s===NL||s===LL||s===XL||s===CL||s===KL||s===qL||s===DL||s===WL||s===AL||s===GL)if(o=e.get("WEBGL_compressed_texture_astc"),o!==null){if(s===kL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:o.COMPRESSED_RGBA_ASTC_4x4_KHR;if(s===OL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:o.COMPRESSED_RGBA_ASTC_5x4_KHR;if(s===IL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:o.COMPRESSED_RGBA_ASTC_5x5_KHR;if(s===UL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:o.COMPRESSED_RGBA_ASTC_6x5_KHR;if(s===NL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:o.COMPRESSED_RGBA_ASTC_6x6_KHR;if(s===LL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:o.COMPRESSED_RGBA_ASTC_8x5_KHR;if(s===XL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:o.COMPRESSED_RGBA_ASTC_8x6_KHR;if(s===CL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:o.COMPRESSED_RGBA_ASTC_8x8_KHR;if(s===KL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:o.COMPRESSED_RGBA_ASTC_10x5_KHR;if(s===qL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:o.COMPRESSED_RGBA_ASTC_10x6_KHR;if(s===DL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:o.COMPRESSED_RGBA_ASTC_10x8_KHR;if(s===WL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:o.COMPRESSED_RGBA_ASTC_10x10_KHR;if(s===AL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:o.COMPRESSED_RGBA_ASTC_12x10_KHR;if(s===GL)return a===Jr?o.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:o.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(s===FL)if(o=e.get("EXT_texture_compression_bptc"),o!==null){if(s===FL)return a===Jr?o.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:o.COMPRESSED_RGBA_BPTC_UNORM_EXT}else return null;return s===Pv?r?34042:(o=e.get("WEBGL_depth_texture"),o!==null?o.UNSIGNED_INT_24_8_WEBGL:null):t[s]!==void 0?t[s]:null}return{convert:i}}class EK extends ns{constructor(e=[]){super(),this.cameras=e}}EK.prototype.isArrayCamera=!0;class $a extends cn{constructor(){super(),this.type="Group"}}$a.prototype.isGroup=!0;const HXe={type:"move"};class jk{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return this._hand===null&&(this._hand=new $a,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return this._targetRay===null&&(this._targetRay=new $a,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new U,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new U),this._targetRay}getGripSpace(){return this._grip===null&&(this._grip=new $a,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new U,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new U),this._grip}dispatchEvent(e){return this._targetRay!==null&&this._targetRay.dispatchEvent(e),this._grip!==null&&this._grip.dispatchEvent(e),this._hand!==null&&this._hand.dispatchEvent(e),this}disconnect(e){return this.dispatchEvent({type:"disconnected",data:e}),this._targetRay!==null&&(this._targetRay.visible=!1),this._grip!==null&&(this._grip.visible=!1),this._hand!==null&&(this._hand.visible=!1),this}update(e,n,r){let i=null,s=null,a=null;const o=this._targetRay,l=this._grip,u=this._hand;if(e&&n.session.visibilityState!=="visible-blurred")if(o!==null&&(i=n.getPose(e.targetRaySpace,r),i!==null&&(o.matrix.fromArray(i.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),i.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(i.linearVelocity)):o.hasLinearVelocity=!1,i.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(i.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(HXe))),u&&e.hand){a=!0;for(const m of e.hand.values()){const v=n.getJointPose(m,r);if(u.joints[m.jointName]===void 0){const b=new $a;b.matrixAutoUpdate=!1,b.visible=!1,u.joints[m.jointName]=b,u.add(b)}const g=u.joints[m.jointName];v!==null&&(g.matrix.fromArray(v.transform.matrix),g.matrix.decompose(g.position,g.rotation,g.scale),g.jointRadius=v.radius),g.visible=v!==null}const c=u.joints["index-finger-tip"],d=u.joints["thumb-tip"],f=c.position.distanceTo(d.position),h=.02,p=.005;u.inputState.pinching&&f>h+p?(u.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!u.inputState.pinching&&f<=h-p&&(u.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else l!==null&&e.gripSpace&&(s=n.getPose(e.gripSpace,r),s!==null&&(l.matrix.fromArray(s.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),s.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(s.linearVelocity)):l.hasLinearVelocity=!1,s.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(s.angularVelocity)):l.hasAngularVelocity=!1));return o!==null&&(o.visible=i!==null),l!==null&&(l.visible=s!==null),u!==null&&(u.visible=a!==null),this}}class MK extends Di{constructor(e,n,r,i,s,a,o,l,u,c){if(c=c!==void 0?c:dp,c!==dp&&c!==Wv)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");r===void 0&&c===dp&&(r=pb),r===void 0&&c===Wv&&(r=Pv),super(null,i,s,a,o,l,c,r,u),this.image={width:e,height:n},this.magFilter=o!==void 0?o:Ir,this.minFilter=l!==void 0?l:Ir,this.flipY=!1,this.generateMipmaps=!1}}MK.prototype.isDepthTexture=!0;class QXe extends tm{constructor(e,n){super();const r=this;let i=null,s=1,a=null,o="local-floor",l=null,u=null,c=null,d=null,f=null,h=null;const p=n.getContextAttributes();let m=null,v=null;const g=[],b=new Map,y=new ns;y.layers.enable(1),y.viewport=new Qt;const x=new ns;x.layers.enable(2),x.viewport=new Qt;const T=[y,x],M=new EK;M.layers.enable(1),M.layers.enable(2);let E=null,S=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(F){let ne=g[F];return ne===void 0&&(ne=new jk,g[F]=ne),ne.getTargetRaySpace()},this.getControllerGrip=function(F){let ne=g[F];return ne===void 0&&(ne=new jk,g[F]=ne),ne.getGripSpace()},this.getHand=function(F){let ne=g[F];return ne===void 0&&(ne=new jk,g[F]=ne),ne.getHandSpace()};function P(F){const ne=b.get(F.inputSource);ne&&ne.dispatchEvent({type:F.type,data:F.inputSource})}function R(){b.forEach(function(F,ne){F.disconnect(ne)}),b.clear(),E=null,S=null,e.setRenderTarget(m),f=null,d=null,c=null,i=null,v=null,J.stop(),r.isPresenting=!1,r.dispatchEvent({type:"sessionend"})}this.setFramebufferScaleFactor=function(F){s=F,r.isPresenting===!0&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(F){o=F,r.isPresenting===!0&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return l||a},this.setReferenceSpace=function(F){l=F},this.getBaseLayer=function(){return d!==null?d:f},this.getBinding=function(){return c},this.getFrame=function(){return h},this.getSession=function(){return i},this.setSession=async function(F){if(i=F,i!==null){if(m=e.getRenderTarget(),i.addEventListener("select",P),i.addEventListener("selectstart",P),i.addEventListener("selectend",P),i.addEventListener("squeeze",P),i.addEventListener("squeezestart",P),i.addEventListener("squeezeend",P),i.addEventListener("end",R),i.addEventListener("inputsourceschange",V),p.xrCompatible!==!0&&await n.makeXRCompatible(),i.renderState.layers===void 0||e.capabilities.isWebGL2===!1){const ne={antialias:i.renderState.layers===void 0?p.antialias:!0,alpha:p.alpha,depth:p.depth,stencil:p.stencil,framebufferScaleFactor:s};f=new XRWebGLLayer(i,n,ne),i.updateRenderState({baseLayer:f}),v=new oi(f.framebufferWidth,f.framebufferHeight,{format:no,type:Np,encoding:e.outputEncoding})}else{let ne=null,j=null,Z=null;p.depth&&(Z=p.stencil?35056:33190,ne=p.stencil?Wv:dp,j=p.stencil?Pv:pb);const _={colorFormat:e.outputEncoding===Jr?35907:32856,depthFormat:Z,scaleFactor:s};c=new XRWebGLBinding(i,n),d=c.createProjectionLayer(_),i.updateRenderState({layers:[d]}),v=new oi(d.textureWidth,d.textureHeight,{format:no,type:Np,depthTexture:new MK(d.textureWidth,d.textureHeight,j,void 0,void 0,void 0,void 0,void 0,void 0,ne),stencilBuffer:p.stencil,encoding:e.outputEncoding,samples:p.antialias?4:0});const le=e.properties.get(v);le.__ignoreDepthValues=d.ignoreDepthValues}v.isXRRenderTarget=!0,this.setFoveation(1),a=await i.requestReferenceSpace(o),J.setContext(i),J.start(),r.isPresenting=!0,r.dispatchEvent({type:"sessionstart"})}};function V(F){const ne=i.inputSources;for(let j=0;j0&&(m.alphaTest.value=v.alphaTest);const g=e.get(v).envMap;if(g&&(m.envMap.value=g,m.flipEnvMap.value=g.isCubeTexture&&g.isRenderTargetTexture===!1?-1:1,m.reflectivity.value=v.reflectivity,m.ior.value=v.ior,m.refractionRatio.value=v.refractionRatio),v.lightMap){m.lightMap.value=v.lightMap;const x=t.physicallyCorrectLights!==!0?Math.PI:1;m.lightMapIntensity.value=v.lightMapIntensity*x}v.aoMap&&(m.aoMap.value=v.aoMap,m.aoMapIntensity.value=v.aoMapIntensity);let b;v.map?b=v.map:v.specularMap?b=v.specularMap:v.displacementMap?b=v.displacementMap:v.normalMap?b=v.normalMap:v.bumpMap?b=v.bumpMap:v.roughnessMap?b=v.roughnessMap:v.metalnessMap?b=v.metalnessMap:v.alphaMap?b=v.alphaMap:v.emissiveMap?b=v.emissiveMap:v.clearcoatMap?b=v.clearcoatMap:v.clearcoatNormalMap?b=v.clearcoatNormalMap:v.clearcoatRoughnessMap?b=v.clearcoatRoughnessMap:v.specularIntensityMap?b=v.specularIntensityMap:v.specularColorMap?b=v.specularColorMap:v.transmissionMap?b=v.transmissionMap:v.thicknessMap?b=v.thicknessMap:v.sheenColorMap?b=v.sheenColorMap:v.sheenRoughnessMap&&(b=v.sheenRoughnessMap),b!==void 0&&(b.isWebGLRenderTarget&&(b=b.texture),b.matrixAutoUpdate===!0&&b.updateMatrix(),m.uvTransform.value.copy(b.matrix));let y;v.aoMap?y=v.aoMap:v.lightMap&&(y=v.lightMap),y!==void 0&&(y.isWebGLRenderTarget&&(y=y.texture),y.matrixAutoUpdate===!0&&y.updateMatrix(),m.uv2Transform.value.copy(y.matrix))}function s(m,v){m.diffuse.value.copy(v.color),m.opacity.value=v.opacity}function a(m,v){m.dashSize.value=v.dashSize,m.totalSize.value=v.dashSize+v.gapSize,m.scale.value=v.scale}function o(m,v,g,b){m.diffuse.value.copy(v.color),m.opacity.value=v.opacity,m.size.value=v.size*g,m.scale.value=b*.5,v.map&&(m.map.value=v.map),v.alphaMap&&(m.alphaMap.value=v.alphaMap),v.alphaTest>0&&(m.alphaTest.value=v.alphaTest);let y;v.map?y=v.map:v.alphaMap&&(y=v.alphaMap),y!==void 0&&(y.matrixAutoUpdate===!0&&y.updateMatrix(),m.uvTransform.value.copy(y.matrix))}function l(m,v){m.diffuse.value.copy(v.color),m.opacity.value=v.opacity,m.rotation.value=v.rotation,v.map&&(m.map.value=v.map),v.alphaMap&&(m.alphaMap.value=v.alphaMap),v.alphaTest>0&&(m.alphaTest.value=v.alphaTest);let g;v.map?g=v.map:v.alphaMap&&(g=v.alphaMap),g!==void 0&&(g.matrixAutoUpdate===!0&&g.updateMatrix(),m.uvTransform.value.copy(g.matrix))}function u(m,v){m.specular.value.copy(v.specular),m.shininess.value=Math.max(v.shininess,1e-4)}function c(m,v){v.gradientMap&&(m.gradientMap.value=v.gradientMap)}function d(m,v){m.roughness.value=v.roughness,m.metalness.value=v.metalness,v.roughnessMap&&(m.roughnessMap.value=v.roughnessMap),v.metalnessMap&&(m.metalnessMap.value=v.metalnessMap),e.get(v).envMap&&(m.envMapIntensity.value=v.envMapIntensity)}function f(m,v,g){m.ior.value=v.ior,v.sheen>0&&(m.sheenColor.value.copy(v.sheenColor).multiplyScalar(v.sheen),m.sheenRoughness.value=v.sheenRoughness,v.sheenColorMap&&(m.sheenColorMap.value=v.sheenColorMap),v.sheenRoughnessMap&&(m.sheenRoughnessMap.value=v.sheenRoughnessMap)),v.clearcoat>0&&(m.clearcoat.value=v.clearcoat,m.clearcoatRoughness.value=v.clearcoatRoughness,v.clearcoatMap&&(m.clearcoatMap.value=v.clearcoatMap),v.clearcoatRoughnessMap&&(m.clearcoatRoughnessMap.value=v.clearcoatRoughnessMap),v.clearcoatNormalMap&&(m.clearcoatNormalScale.value.copy(v.clearcoatNormalScale),m.clearcoatNormalMap.value=v.clearcoatNormalMap,v.side===Ua&&m.clearcoatNormalScale.value.negate())),v.transmission>0&&(m.transmission.value=v.transmission,m.transmissionSamplerMap.value=g.texture,m.transmissionSamplerSize.value.set(g.width,g.height),v.transmissionMap&&(m.transmissionMap.value=v.transmissionMap),m.thickness.value=v.thickness,v.thicknessMap&&(m.thicknessMap.value=v.thicknessMap),m.attenuationDistance.value=v.attenuationDistance,m.attenuationColor.value.copy(v.attenuationColor)),m.specularIntensity.value=v.specularIntensity,m.specularColor.value.copy(v.specularColor),v.specularIntensityMap&&(m.specularIntensityMap.value=v.specularIntensityMap),v.specularColorMap&&(m.specularColorMap.value=v.specularColorMap)}function h(m,v){v.matcap&&(m.matcap.value=v.matcap)}function p(m,v){m.referencePosition.value.copy(v.referencePosition),m.nearDistance.value=v.nearDistance,m.farDistance.value=v.farDistance}return{refreshFogUniforms:n,refreshMaterialUniforms:r}}function $Xe(){const t=f6("canvas");return t.style.display="block",t}function xr(t={}){const e=t.canvas!==void 0?t.canvas:$Xe(),n=t.context!==void 0?t.context:null,r=t.depth!==void 0?t.depth:!0,i=t.stencil!==void 0?t.stencil:!0,s=t.antialias!==void 0?t.antialias:!1,a=t.premultipliedAlpha!==void 0?t.premultipliedAlpha:!0,o=t.preserveDrawingBuffer!==void 0?t.preserveDrawingBuffer:!1,l=t.powerPreference!==void 0?t.powerPreference:"default",u=t.failIfMajorPerformanceCaveat!==void 0?t.failIfMajorPerformanceCaveat:!1;let c;n!==null?c=n.getContextAttributes().alpha:c=t.alpha!==void 0?t.alpha:!1;let d=null,f=null;const h=[],p=[];this.domElement=e,this.debug={checkShaderErrors:!0},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.outputEncoding=bl,this.physicallyCorrectLights=!1,this.toneMapping=Wc,this.toneMappingExposure=1;const m=this;let v=!1,g=0,b=0,y=null,x=-1,T=null;const M=new Qt,E=new Qt;let S=null,P=e.width,R=e.height,V=1,z=null,k=null;const N=new Qt(0,0,P,R),q=new Qt(0,0,P,R);let L=!1;const A=new wT;let J=!1,F=!1,ne=null;const j=new Be,Z=new Oe,_=new U,le={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function fe(){return y===null?V:1}let te=n;function $(ee,Ie){for(let Ge=0;Ge0?f=p[p.length-1]:f=null,h.pop(),h.length>0?d=h[h.length-1]:d=null};function bn(ee,Ie,Ge,qe){if(ee.visible===!1)return;if(ee.layers.test(Ie.layers)){if(ee.isGroup)Ge=ee.renderOrder;else if(ee.isLOD)ee.autoUpdate===!0&&ee.update(Ie);else if(ee.isLight)f.pushLight(ee),ee.castShadow&&f.pushShadow(ee);else if(ee.isSprite){if(!ee.frustumCulled||A.intersectsSprite(ee)){qe&&_.setFromMatrixPosition(ee.matrixWorld).applyMatrix4(j);const Dt=he.update(ee),C=ee.material;C.visible&&d.push(ee,Dt,C,Ge,_.z,null)}}else if((ee.isMesh||ee.isLine||ee.isPoints)&&(ee.isSkinnedMesh&&ee.skeleton.frame!==Ke.render.frame&&(ee.skeleton.update(),ee.skeleton.frame=Ke.render.frame),!ee.frustumCulled||A.intersectsObject(ee))){qe&&_.setFromMatrixPosition(ee.matrixWorld).applyMatrix4(j);const Dt=he.update(ee),C=ee.material;if(Array.isArray(C)){const B=Dt.groups;for(let ae=0,Ee=B.length;ae0&&Fr(Ue,Ie,Ge),qe&&ve.viewport(M.copy(qe)),Ue.length>0&&zr(Ue,Ie,Ge),Pt.length>0&&zr(Pt,Ie,Ge),Dt.length>0&&zr(Dt,Ie,Ge),ve.buffers.depth.setTest(!0),ve.buffers.depth.setMask(!0),ve.buffers.color.setMask(!0),ve.setPolygonOffset(!1)}function Fr(ee,Ie,Ge){const qe=ge.isWebGL2;ne===null&&(ne=new oi(1,1,{generateMipmaps:!0,type:oe.has("EXT_color_buffer_half_float")?Uo:Np,minFilter:b0,samples:qe&&s===!0?4:0})),m.getDrawingBufferSize(Z),qe?ne.setSize(Z.x,Z.y):ne.setSize(aP(Z.x),aP(Z.y));const Ue=m.getRenderTarget();m.setRenderTarget(ne),m.clear();const Pt=m.toneMapping;m.toneMapping=Wc,zr(ee,Ie,Ge),m.toneMapping=Pt,D.updateMultisampleRenderTarget(ne),D.updateRenderTargetMipmap(ne),m.setRenderTarget(Ue)}function zr(ee,Ie,Ge){const qe=Ie.isScene===!0?Ie.overrideMaterial:null;for(let Ue=0,Pt=ee.length;Ue0&&D.useMultisampledRTT(ee)===!1?Ue=ue.get(ee).__webglMultisampledFramebuffer:Ue=ae,M.copy(ee.viewport),E.copy(ee.scissor),S=ee.scissorTest}else M.copy(N).multiplyScalar(V).floor(),E.copy(q).multiplyScalar(V).floor(),S=L;if(ve.bindFramebuffer(36160,Ue)&&ge.drawBuffers&&qe&&ve.drawBuffers(ee,Ue),ve.viewport(M),ve.scissor(E),ve.setScissorTest(S),Pt){const B=ue.get(ee.texture);te.framebufferTexture2D(36160,36064,34069+Ie,B.__webglTexture,Ge)}else if(Dt){const B=ue.get(ee.texture),ae=Ie||0;te.framebufferTextureLayer(36160,36064,B.__webglTexture,Ge||0,ae)}x=-1},this.readRenderTargetPixels=function(ee,Ie,Ge,qe,Ue,Pt,Dt){if(!(ee&&ee.isWebGLRenderTarget)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");return}let C=ue.get(ee).__webglFramebuffer;if(ee.isWebGLCubeRenderTarget&&Dt!==void 0&&(C=C[Dt]),C){ve.bindFramebuffer(36160,C);try{const B=ee.texture,ae=B.format,Ee=B.type;if(ae!==no&&Y.convert(ae)!==te.getParameter(35739)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");return}const Le=Ee===Uo&&(oe.has("EXT_color_buffer_half_float")||ge.isWebGL2&&oe.has("EXT_color_buffer_float"));if(Ee!==Np&&Y.convert(Ee)!==te.getParameter(35738)&&!(Ee===na&&(ge.isWebGL2||oe.has("OES_texture_float")||oe.has("WEBGL_color_buffer_float")))&&!Le){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");return}Ie>=0&&Ie<=ee.width-qe&&Ge>=0&&Ge<=ee.height-Ue&&te.readPixels(Ie,Ge,qe,Ue,Y.convert(ae),Y.convert(Ee),Pt)}finally{const B=y!==null?ue.get(y).__webglFramebuffer:null;ve.bindFramebuffer(36160,B)}}},this.copyFramebufferToTexture=function(ee,Ie,Ge=0){if(Ie.isFramebufferTexture!==!0){console.error("THREE.WebGLRenderer: copyFramebufferToTexture() can only be used with FramebufferTexture.");return}const qe=Math.pow(2,-Ge),Ue=Math.floor(Ie.image.width*qe),Pt=Math.floor(Ie.image.height*qe);D.setTexture2D(Ie,0),te.copyTexSubImage2D(3553,Ge,0,0,ee.x,ee.y,Ue,Pt),ve.unbindTexture()},this.copyTextureToTexture=function(ee,Ie,Ge,qe=0){const Ue=Ie.image.width,Pt=Ie.image.height,Dt=Y.convert(Ge.format),C=Y.convert(Ge.type);D.setTexture2D(Ge,0),te.pixelStorei(37440,Ge.flipY),te.pixelStorei(37441,Ge.premultiplyAlpha),te.pixelStorei(3317,Ge.unpackAlignment),Ie.isDataTexture?te.texSubImage2D(3553,qe,ee.x,ee.y,Ue,Pt,Dt,C,Ie.image.data):Ie.isCompressedTexture?te.compressedTexSubImage2D(3553,qe,ee.x,ee.y,Ie.mipmaps[0].width,Ie.mipmaps[0].height,Dt,Ie.mipmaps[0].data):te.texSubImage2D(3553,qe,ee.x,ee.y,Dt,C,Ie.image),qe===0&&Ge.generateMipmaps&&te.generateMipmap(3553),ve.unbindTexture()},this.copyTextureToTexture3D=function(ee,Ie,Ge,qe,Ue=0){if(m.isWebGL1Renderer){console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");return}const Pt=ee.max.x-ee.min.x+1,Dt=ee.max.y-ee.min.y+1,C=ee.max.z-ee.min.z+1,B=Y.convert(qe.format),ae=Y.convert(qe.type);let Ee;if(qe.isData3DTexture)D.setTexture3D(qe,0),Ee=32879;else if(qe.isDataArrayTexture)D.setTexture2DArray(qe,0),Ee=35866;else{console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");return}te.pixelStorei(37440,qe.flipY),te.pixelStorei(37441,qe.premultiplyAlpha),te.pixelStorei(3317,qe.unpackAlignment);const Le=te.getParameter(3314),De=te.getParameter(32878),it=te.getParameter(3316),ot=te.getParameter(3315),ct=te.getParameter(32877),$e=Ge.isCompressedTexture?Ge.mipmaps[0]:Ge.image;te.pixelStorei(3314,$e.width),te.pixelStorei(32878,$e.height),te.pixelStorei(3316,ee.min.x),te.pixelStorei(3315,ee.min.y),te.pixelStorei(32877,ee.min.z),Ge.isDataTexture||Ge.isData3DTexture?te.texSubImage3D(Ee,Ue,Ie.x,Ie.y,Ie.z,Pt,Dt,C,B,ae,$e.data):Ge.isCompressedTexture?(console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture."),te.compressedTexSubImage3D(Ee,Ue,Ie.x,Ie.y,Ie.z,Pt,Dt,C,B,$e.data)):te.texSubImage3D(Ee,Ue,Ie.x,Ie.y,Ie.z,Pt,Dt,C,B,ae,$e),te.pixelStorei(3314,Le),te.pixelStorei(32878,De),te.pixelStorei(3316,it),te.pixelStorei(3315,ot),te.pixelStorei(32877,ct),Ue===0&&qe.generateMipmaps&&te.generateMipmap(Ee),ve.unbindTexture()},this.initTexture=function(ee){D.setTexture2D(ee,0),ve.unbindTexture()},this.resetState=function(){g=0,b=0,y=null,ve.reset(),ce.reset()},typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}xr.prototype.isWebGLRenderer=!0;class Cce extends xr{}Cce.prototype.isWebGL1Renderer=!0;class MT{constructor(e,n=25e-5){this.name="",this.color=new tt(e),this.density=n}clone(){return new MT(this.color,this.density)}toJSON(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}MT.prototype.isFogExp2=!0;class PT{constructor(e,n=1,r=1e3){this.name="",this.color=new tt(e),this.near=n,this.far=r}clone(){return new PT(this.color,this.near,this.far)}toJSON(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}PT.prototype.isFog=!0;class RT extends cn{constructor(){super(),this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.overrideMaterial=null,this.autoUpdate=!0,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(e,n){return super.copy(e,n),e.background!==null&&(this.background=e.background.clone()),e.environment!==null&&(this.environment=e.environment.clone()),e.fog!==null&&(this.fog=e.fog.clone()),e.overrideMaterial!==null&&(this.overrideMaterial=e.overrideMaterial.clone()),this.autoUpdate=e.autoUpdate,this.matrixAutoUpdate=e.matrixAutoUpdate,this}toJSON(e){const n=super.toJSON(e);return this.fog!==null&&(n.object.fog=this.fog.toJSON()),n}}RT.prototype.isScene=!0;class S0{constructor(e,n){this.array=e,this.stride=n,this.count=e!==void 0?e.length/n:0,this.usage=mb,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=fl()}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}copy(e){return this.array=new e.array.constructor(e.array),this.count=e.count,this.stride=e.stride,this.usage=e.usage,this}copyAt(e,n,r){e*=this.stride,r*=n.stride;for(let i=0,s=this.stride;ie.far||n.push({distance:l,point:MS.clone(),uv:Wr.getUV(MS,X2,RS,C2,GZ,Zk,FZ,new Oe),face:null,object:this})}copy(e){return super.copy(e),e.center!==void 0&&this.center.copy(e.center),this.material=e.material,this}}FV.prototype.isSprite=!0;function K2(t,e,n,r,i,s){bg.subVectors(t,n).addScalar(.5).multiply(r),i!==void 0?(PS.x=s*bg.x-i*bg.y,PS.y=i*bg.x+s*bg.y):PS.copy(bg),t.copy(e),t.x+=PS.x,t.y+=PS.y,t.applyMatrix4(Kce)}const q2=new U,jZ=new U;class qce extends cn{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(e){super.copy(e,!1);const n=e.levels;for(let r=0,i=n.length;r0){let r,i;for(r=1,i=n.length;r0){q2.setFromMatrixPosition(this.matrixWorld);const i=e.ray.origin.distanceTo(q2);this.getObjectForDistance(i).raycast(e,n)}}update(e){const n=this.levels;if(n.length>1){q2.setFromMatrixPosition(e.matrixWorld),jZ.setFromMatrixPosition(this.matrixWorld);const r=q2.distanceTo(jZ)/e.zoom;n[0].object.visible=!0;let i,s;for(i=1,s=n.length;i=n[i].distance;i++)n[i-1].object.visible=!1,n[i].object.visible=!0;for(this._currentLevel=i-1;il)continue;f.applyMatrix4(this.matrixWorld);const S=e.ray.origin.distanceTo(f);Se.far||n.push({distance:S,point:d.clone().applyMatrix4(this.matrixWorld),index:y,face:null,faceIndex:null,object:this})}}else{const g=Math.max(0,a.start),b=Math.min(v.count,a.start+a.count);for(let y=g,x=b-1;yl)continue;f.applyMatrix4(this.matrixWorld);const M=e.ray.origin.distanceTo(f);Me.far||n.push({distance:M,point:d.clone().applyMatrix4(this.matrixWorld),index:y,face:null,faceIndex:null,object:this})}}}else r.isGeometry&&console.error("THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}updateMorphTargets(){const e=this.geometry;if(e.isBufferGeometry){const n=e.morphAttributes,r=Object.keys(n);if(r.length>0){const i=n[r[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let s=0,a=i.length;s0&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}$s.prototype.isLine=!0;const nJ=new U,rJ=new U;class qo extends $s{constructor(e,n){super(e,n),this.type="LineSegments"}computeLineDistances(){const e=this.geometry;if(e.isBufferGeometry)if(e.index===null){const n=e.attributes.position,r=[];for(let i=0,s=n.count;i0){const i=n[r[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let s=0,a=i.length;s0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}vy.prototype.isPoints=!0;function sJ(t,e,n,r,i,s,a){const o=YL.distanceSqToPoint(t);if(oi.far)return;s.push({distance:u,distanceToRay:Math.sqrt(o),point:l,index:e,face:null,object:a})}}class Dce extends Di{constructor(e,n,r,i,s,a,o,l,u){super(e,n,r,i,s,a,o,l,u),this.minFilter=a!==void 0?a:Hn,this.magFilter=s!==void 0?s:Hn,this.generateMipmaps=!1;const c=this;function d(){c.needsUpdate=!0,e.requestVideoFrameCallback(d)}"requestVideoFrameCallback"in e&&e.requestVideoFrameCallback(d)}clone(){return new this.constructor(this.image).copy(this)}update(){const e=this.image;"requestVideoFrameCallback"in e===!1&&e.readyState>=e.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}Dce.prototype.isVideoTexture=!0;class Wce extends Di{constructor(e,n,r){super({width:e,height:n}),this.format=r,this.magFilter=Ir,this.minFilter=Ir,this.generateMipmaps=!1,this.needsUpdate=!0}}Wce.prototype.isFramebufferTexture=!0;class VK extends Di{constructor(e,n,r,i,s,a,o,l,u,c,d,f){super(null,a,o,l,u,c,i,s,d,f),this.image={width:n,height:r},this.mipmaps=e,this.flipY=!1,this.generateMipmaps=!1}}VK.prototype.isCompressedTexture=!0;class Ace extends Di{constructor(e,n,r,i,s,a,o,l,u){super(e,n,r,i,s,a,o,l,u),this.needsUpdate=!0}}Ace.prototype.isCanvasTexture=!0;class yl{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(e,n){const r=this.getUtoTmapping(e);return this.getPoint(r,n)}getPoints(e=5){const n=[];for(let r=0;r<=e;r++)n.push(this.getPoint(r/e));return n}getSpacedPoints(e=5){const n=[];for(let r=0;r<=e;r++)n.push(this.getPointAt(r/e));return n}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const n=[];let r,i=this.getPoint(0),s=0;n.push(0);for(let a=1;a<=e;a++)r=this.getPoint(a/e),s+=r.distanceTo(i),n.push(s),i=r;return this.cacheArcLengths=n,n}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(e,n){const r=this.getLengths();let i=0;const s=r.length;let a;n?a=n:a=e*r[s-1];let o=0,l=s-1,u;for(;o<=l;)if(i=Math.floor(o+(l-o)/2),u=r[i]-a,u<0)o=i+1;else if(u>0)l=i-1;else{l=i;break}if(i=l,r[i]===a)return i/(s-1);const c=r[i],f=r[i+1]-c,h=(a-c)/f;return(i+h)/(s-1)}getTangent(e,n){let i=e-1e-4,s=e+1e-4;i<0&&(i=0),s>1&&(s=1);const a=this.getPoint(i),o=this.getPoint(s),l=n||(a.isVector2?new Oe:new U);return l.copy(o).sub(a).normalize(),l}getTangentAt(e,n){const r=this.getUtoTmapping(e);return this.getTangent(r,n)}computeFrenetFrames(e,n){const r=new U,i=[],s=[],a=[],o=new U,l=new Be;for(let h=0;h<=e;h++){const p=h/e;i[h]=this.getTangentAt(p,new U)}s[0]=new U,a[0]=new U;let u=Number.MAX_VALUE;const c=Math.abs(i[0].x),d=Math.abs(i[0].y),f=Math.abs(i[0].z);c<=u&&(u=c,r.set(1,0,0)),d<=u&&(u=d,r.set(0,1,0)),f<=u&&r.set(0,0,1),o.crossVectors(i[0],r).normalize(),s[0].crossVectors(i[0],o),a[0].crossVectors(i[0],s[0]);for(let h=1;h<=e;h++){if(s[h]=s[h-1].clone(),a[h]=a[h-1].clone(),o.crossVectors(i[h-1],i[h]),o.length()>Number.EPSILON){o.normalize();const p=Math.acos(Fi(i[h-1].dot(i[h]),-1,1));s[h].applyMatrix4(l.makeRotationAxis(o,p))}a[h].crossVectors(i[h],s[h])}if(n===!0){let h=Math.acos(Fi(s[0].dot(s[e]),-1,1));h/=e,i[0].dot(o.crossVectors(s[0],s[e]))>0&&(h=-h);for(let p=1;p<=e;p++)s[p].applyMatrix4(l.makeRotationAxis(i[p],h*p)),a[p].crossVectors(i[p],s[p])}return{tangents:i,normals:s,binormals:a}}clone(){return new this.constructor().copy(this)}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}toJSON(){const e={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return e.arcLengthDivisions=this.arcLengthDivisions,e.type=this.type,e}fromJSON(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}class gy extends yl{constructor(e=0,n=0,r=1,i=1,s=0,a=Math.PI*2,o=!1,l=0){super(),this.type="EllipseCurve",this.aX=e,this.aY=n,this.xRadius=r,this.yRadius=i,this.aStartAngle=s,this.aEndAngle=a,this.aClockwise=o,this.aRotation=l}getPoint(e,n){const r=n||new Oe,i=Math.PI*2;let s=this.aEndAngle-this.aStartAngle;const a=Math.abs(s)i;)s-=i;s0?0:(Math.floor(Math.abs(o)/s)+1)*s:l===0&&o===s-1&&(o=s-2,l=1);let u,c;this.closed||o>0?u=i[(o-1)%s]:(F2.subVectors(i[0],i[1]).add(i[0]),u=F2);const d=i[o%s],f=i[(o+1)%s];if(this.closed||o+2i.length-2?i.length-1:a+1],d=i[a>i.length-3?i.length-1:a+2];return r.set(aJ(o,l.x,u.x,c.x,d.x),aJ(o,l.y,u.y,c.y,d.y)),r}copy(e){super.copy(e),this.points=[];for(let n=0,r=e.points.length;n=r){const a=i[s]-r,o=this.curves[s],l=o.getLength(),u=l===0?0:1-a/l;return o.getPointAt(u,n)}s++}return null}getLength(){const e=this.getCurveLengths();return e[e.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const e=[];let n=0;for(let r=0,i=this.curves.length;r1&&!n[n.length-1].equals(n[0])&&n.push(n[0]),n}copy(e){super.copy(e),this.curves=[];for(let n=0,r=e.curves.length;n0){const d=u.getPoint(0);d.equals(this.currentPoint)||this.lineTo(d.x,d.y)}this.curves.push(u);const c=u.getPoint(1);return this.currentPoint.copy(c),this}copy(e){return super.copy(e),this.currentPoint.copy(e.currentPoint),this}toJSON(){const e=super.toJSON();return e.currentPoint=this.currentPoint.toArray(),e}fromJSON(e){return super.fromJSON(e),this.currentPoint.fromArray(e.currentPoint),this}};class Fv extends Lt{constructor(e=[new Oe(0,.5),new Oe(.5,0),new Oe(0,-.5)],n=12,r=0,i=Math.PI*2){super(),this.type="LatheGeometry",this.parameters={points:e,segments:n,phiStart:r,phiLength:i},n=Math.floor(n),i=Fi(i,0,Math.PI*2);const s=[],a=[],o=[],l=[],u=[],c=1/n,d=new U,f=new Oe,h=new U,p=new U,m=new U;let v=0,g=0;for(let b=0;b<=e.length-1;b++)switch(b){case 0:v=e[b+1].x-e[b].x,g=e[b+1].y-e[b].y,h.x=g*1,h.y=-v,h.z=g*0,m.copy(h),h.normalize(),l.push(h.x,h.y,h.z);break;case e.length-1:l.push(m.x,m.y,m.z);break;default:v=e[b+1].x-e[b].x,g=e[b+1].y-e[b].y,h.x=g*1,h.y=-v,h.z=g*0,p.copy(h),h.x+=m.x,h.y+=m.y,h.z+=m.z,h.normalize(),l.push(h.x,h.y,h.z),m.copy(p)}for(let b=0;b<=n;b++){const y=r+b*c*i,x=Math.sin(y),T=Math.cos(y);for(let M=0;M<=e.length-1;M++){d.x=e[M].x*x,d.y=e[M].y,d.z=e[M].x*T,a.push(d.x,d.y,d.z),f.x=b/n,f.y=M/(e.length-1),o.push(f.x,f.y);const E=l[3*M+0]*x,S=l[3*M+1],P=l[3*M+0]*T;u.push(E,S,P)}}for(let b=0;b0&&y(!0),n>0&&y(!1)),this.setIndex(c),this.setAttribute("position",new xt(d,3)),this.setAttribute("normal",new xt(f,3)),this.setAttribute("uv",new xt(h,2));function b(){const x=new U,T=new U;let M=0;const E=(n-e)/r;for(let S=0;S<=s;S++){const P=[],R=S/s,V=R*(n-e)+e;for(let z=0;z<=i;z++){const k=z/i,N=k*l+o,q=Math.sin(N),L=Math.cos(N);T.x=V*q,T.y=-R*r+v,T.z=V*L,d.push(T.x,T.y,T.z),x.set(q,E,L).normalize(),f.push(x.x,x.y,x.z),h.push(k,1-R),P.push(p++)}m.push(P)}for(let S=0;S.9&&E<.1&&(y<.2&&(a[b+0]+=1),x<.2&&(a[b+2]+=1),T<.2&&(a[b+4]+=1))}}function f(b){s.push(b.x,b.y,b.z)}function h(b,y){const x=b*3;y.x=e[x+0],y.y=e[x+1],y.z=e[x+2]}function p(){const b=new U,y=new U,x=new U,T=new U,M=new Oe,E=new Oe,S=new Oe;for(let P=0,R=0;P80*n){o=u=t[0],l=c=t[1];for(let p=n;pu&&(u=d),f>c&&(c=f);h=Math.max(u-o,c-l),h=h!==0?1/h:0}return h6(s,a,n,o,l,h),a}};function jce(t,e,n,r,i){let s,a;if(i===MCe(t,e,n,r)>0)for(s=e;s=e;s-=r)a=oJ(s,t[s],t[s+1],a);return a&&_V(a,a.next)&&(m6(a),a=a.next),a}function Cp(t,e){if(!t)return t;e||(e=t);let n=t,r;do if(r=!1,!n.steiner&&(_V(n,n.next)||Ei(n.prev,n,n.next)===0)){if(m6(n),n=e=n.prev,n===n.next)break;r=!0}else n=n.next;while(r||n!==e);return e}function h6(t,e,n,r,i,s,a){if(!t)return;!a&&s&&yCe(t,r,i,s);let o=t,l,u;for(;t.prev!==t.next;){if(l=t.prev,u=t.next,s?dCe(t,r,i,s):cCe(t)){e.push(l.i/n),e.push(t.i/n),e.push(u.i/n),m6(t),t=u.next,o=u.next;continue}if(t=u,t===o){a?a===1?(t=fCe(Cp(t),e,n),h6(t,e,n,r,i,s,2)):a===2&&hCe(t,e,n,r,i,s):h6(Cp(t),e,n,r,i,s,1);break}}}function cCe(t){const e=t.prev,n=t,r=t.next;if(Ei(e,n,r)>=0)return!1;let i=t.next.next;for(;i!==t.prev;){if(f1(e.x,e.y,n.x,n.y,r.x,r.y,i.x,i.y)&&Ei(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function dCe(t,e,n,r){const i=t.prev,s=t,a=t.next;if(Ei(i,s,a)>=0)return!1;const o=i.xs.x?i.x>a.x?i.x:a.x:s.x>a.x?s.x:a.x,c=i.y>s.y?i.y>a.y?i.y:a.y:s.y>a.y?s.y:a.y,d=BL(o,l,e,n,r),f=BL(u,c,e,n,r);let h=t.prevZ,p=t.nextZ;for(;h&&h.z>=d&&p&&p.z<=f;){if(h!==t.prev&&h!==t.next&&f1(i.x,i.y,s.x,s.y,a.x,a.y,h.x,h.y)&&Ei(h.prev,h,h.next)>=0||(h=h.prevZ,p!==t.prev&&p!==t.next&&f1(i.x,i.y,s.x,s.y,a.x,a.y,p.x,p.y)&&Ei(p.prev,p,p.next)>=0))return!1;p=p.nextZ}for(;h&&h.z>=d;){if(h!==t.prev&&h!==t.next&&f1(i.x,i.y,s.x,s.y,a.x,a.y,h.x,h.y)&&Ei(h.prev,h,h.next)>=0)return!1;h=h.prevZ}for(;p&&p.z<=f;){if(p!==t.prev&&p!==t.next&&f1(i.x,i.y,s.x,s.y,a.x,a.y,p.x,p.y)&&Ei(p.prev,p,p.next)>=0)return!1;p=p.nextZ}return!0}function fCe(t,e,n){let r=t;do{const i=r.prev,s=r.next.next;!_V(i,s)&&Zce(i,r,r.next,s)&&p6(i,s)&&p6(s,i)&&(e.push(i.i/n),e.push(r.i/n),e.push(s.i/n),m6(r),m6(r.next),r=t=s),r=r.next}while(r!==t);return Cp(r)}function hCe(t,e,n,r,i,s){let a=t;do{let o=a.next.next;for(;o!==a.prev;){if(a.i!==o.i&&TCe(a,o)){let l=Jce(a,o);a=Cp(a,a.next),l=Cp(l,l.next),h6(a,e,n,r,i,s),h6(l,e,n,r,i,s);return}o=o.next}a=a.next}while(a!==t)}function pCe(t,e,n,r){const i=[];let s,a,o,l,u;for(s=0,a=e.length;s=n.next.y&&n.next.y!==n.y){const f=n.x+(i-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(f<=r&&f>s){if(s=f,f===r){if(i===n.y)return n;if(i===n.next.y)return n.next}a=n.x=n.x&&n.x>=l&&r!==n.x&&f1(ia.x||n.x===a.x&&bCe(a,n)))&&(a=n,c=d)),n=n.next;while(n!==o);return a}function bCe(t,e){return Ei(t.prev,t,e.prev)<0&&Ei(e.next,t,t.next)<0}function yCe(t,e,n,r){let i=t;do i.z===null&&(i.z=BL(i.x,i.y,e,n,r)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,SCe(i)}function SCe(t){let e,n,r,i,s,a,o,l,u=1;do{for(n=t,t=null,s=null,a=0;n;){for(a++,r=n,o=0,e=0;e0||l>0&&r;)o!==0&&(l===0||!r||n.z<=r.z)?(i=n,n=n.nextZ,o--):(i=r,r=r.nextZ,l--),s?s.nextZ=i:t=i,i.prevZ=s,s=i;n=r}s.nextZ=null,u*=2}while(a>1);return t}function BL(t,e,n,r,i){return t=32767*(t-n)*i,e=32767*(e-r)*i,t=(t|t<<8)&16711935,t=(t|t<<4)&252645135,t=(t|t<<2)&858993459,t=(t|t<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,t|e<<1}function xCe(t){let e=t,n=t;do(e.x=0&&(t-a)*(r-o)-(n-a)*(e-o)>=0&&(n-a)*(s-o)-(i-a)*(r-o)>=0}function TCe(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!wCe(t,e)&&(p6(t,e)&&p6(e,t)&&ECe(t,e)&&(Ei(t.prev,t,e.prev)||Ei(t,e.prev,e))||_V(t,e)&&Ei(t.prev,t,t.next)>0&&Ei(e.prev,e,e.next)>0)}function Ei(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function _V(t,e){return t.x===e.x&&t.y===e.y}function Zce(t,e,n,r){const i=B2(Ei(t,e,n)),s=B2(Ei(t,e,r)),a=B2(Ei(n,r,t)),o=B2(Ei(n,r,e));return!!(i!==s&&a!==o||i===0&&Y2(t,n,e)||s===0&&Y2(t,r,e)||a===0&&Y2(n,t,r)||o===0&&Y2(n,e,r))}function Y2(t,e,n){return e.x<=Math.max(t.x,n.x)&&e.x>=Math.min(t.x,n.x)&&e.y<=Math.max(t.y,n.y)&&e.y>=Math.min(t.y,n.y)}function B2(t){return t>0?1:t<0?-1:0}function wCe(t,e){let n=t;do{if(n.i!==t.i&&n.next.i!==t.i&&n.i!==e.i&&n.next.i!==e.i&&Zce(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}function p6(t,e){return Ei(t.prev,t,t.next)<0?Ei(t,e,t.next)>=0&&Ei(t,t.prev,e)>=0:Ei(t,e,t.prev)<0||Ei(t,t.next,e)<0}function ECe(t,e){let n=t,r=!1;const i=(t.x+e.x)/2,s=(t.y+e.y)/2;do n.y>s!=n.next.y>s&&n.next.y!==n.y&&i<(n.next.x-n.x)*(s-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next;while(n!==t);return r}function Jce(t,e){const n=new HL(t.i,t.x,t.y),r=new HL(e.i,e.x,e.y),i=t.next,s=e.prev;return t.next=e,e.prev=t,n.next=i,i.prev=n,r.next=n,n.prev=r,s.next=r,r.prev=s,r}function oJ(t,e,n,r){const i=new HL(t,e,n);return r?(i.next=r.next,i.prev=r,r.next.prev=i,r.next=i):(i.prev=i,i.next=i),i}function m6(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function HL(t,e,n){this.i=t,this.x=e,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function MCe(t,e,n,r){let i=0;for(let s=e,a=n-r;s2&&t[e-1].equals(t[0])&&t.pop()}function uJ(t,e){for(let n=0;nNumber.EPSILON){const ie=Math.sqrt(W),me=Math.sqrt(we*we+se*se),We=D.x-ye/ie,Ce=D.y+he/ie,Ae=G.x-se/me,Y=G.y+we/me,ce=((Ae-We)*se-(Y-Ce)*we)/(he*se-ye*we);re=We+he*ce-ue.x,de=Ce+ye*ce-ue.y;const be=re*re+de*de;if(be<=2)return new Oe(re,de);Te=Math.sqrt(be/2)}else{let ie=!1;he>Number.EPSILON?we>Number.EPSILON&&(ie=!0):he<-Number.EPSILON?we<-Number.EPSILON&&(ie=!0):Math.sign(ye)===Math.sign(se)&&(ie=!0),ie?(re=-ye,de=he,Te=Math.sqrt(W)):(re=he,de=ye,Te=Math.sqrt(W/2))}return new Oe(re/Te,de/Te)}const F=[];for(let ue=0,D=N.length,G=D-1,re=ue+1;ue=0;ue--){const D=ue/v,G=h*Math.cos(D*Math.PI/2),re=p*Math.sin(D*Math.PI/2)+m;for(let de=0,Te=N.length;de=0;){const re=G;let de=G-1;de<0&&(de=ue.length-1);for(let Te=0,he=c+v*2;Te0)&&h.push(y,x,M),(g!==r-1||l0!=e>0&&this.version++,this._sheen=e}get clearcoat(){return this._clearcoat}set clearcoat(e){this._clearcoat>0!=e>0&&this.version++,this._clearcoat=e}get transmission(){return this._transmission}set transmission(e){this._transmission>0!=e>0&&this.version++,this._transmission=e}copy(e){return super.copy(e),this.defines={STANDARD:"",PHYSICAL:""},this.clearcoat=e.clearcoat,this.clearcoatMap=e.clearcoatMap,this.clearcoatRoughness=e.clearcoatRoughness,this.clearcoatRoughnessMap=e.clearcoatRoughnessMap,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.ior=e.ior,this.sheen=e.sheen,this.sheenColor.copy(e.sheenColor),this.sheenColorMap=e.sheenColorMap,this.sheenRoughness=e.sheenRoughness,this.sheenRoughnessMap=e.sheenRoughnessMap,this.transmission=e.transmission,this.transmissionMap=e.transmissionMap,this.thickness=e.thickness,this.thicknessMap=e.thicknessMap,this.attenuationDistance=e.attenuationDistance,this.attenuationColor.copy(e.attenuationColor),this.specularIntensity=e.specularIntensity,this.specularIntensityMap=e.specularIntensityMap,this.specularColor.copy(e.specularColor),this.specularColorMap=e.specularColorMap,this}}CK.prototype.isMeshPhysicalMaterial=!0;class KK extends Ji{constructor(e){super(),this.type="MeshPhongMaterial",this.color=new tt(16777215),this.specular=new tt(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new tt(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=y0,this.normalScale=new Oe(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=yT,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}KK.prototype.isMeshPhongMaterial=!0;class qK extends Ji{constructor(e){super(),this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new tt(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new tt(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=y0,this.normalScale=new Oe(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.gradientMap=e.gradientMap,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.alphaMap=e.alphaMap,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}qK.prototype.isMeshToonMaterial=!0;class e9 extends Ji{constructor(e){super(),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=y0,this.normalScale=new Oe(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.flatShading=e.flatShading,this}}e9.prototype.isMeshNormalMaterial=!0;class DK extends Ji{constructor(e){super(),this.type="MeshLambertMaterial",this.color=new tt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new tt(0),this.emissiveIntensity=1,this.emissiveMap=null,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=yT,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}DK.prototype.isMeshLambertMaterial=!0;class WK extends Ji{constructor(e){super(),this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new tt(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=y0,this.normalScale=new Oe(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.defines={MATCAP:""},this.color.copy(e.color),this.matcap=e.matcap,this.map=e.map,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.alphaMap=e.alphaMap,this.flatShading=e.flatShading,this.fog=e.fog,this}}WK.prototype.isMeshMatcapMaterial=!0;class AK extends cs{constructor(e){super(),this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(e)}copy(e){return super.copy(e),this.scale=e.scale,this.dashSize=e.dashSize,this.gapSize=e.gapSize,this}}AK.prototype.isLineDashedMaterial=!0;const zCe={ShadowMaterial:LK,SpriteMaterial:GV,RawShaderMaterial:XK,ShaderMaterial:bi,PointsMaterial:qf,MeshPhysicalMaterial:CK,MeshStandardMaterial:pp,MeshPhongMaterial:KK,MeshToonMaterial:qK,MeshNormalMaterial:e9,MeshLambertMaterial:DK,MeshDepthMaterial:my,MeshDistanceMaterial:ET,MeshBasicMaterial:fo,MeshMatcapMaterial:WK,LineDashedMaterial:AK,LineBasicMaterial:cs,Material:Ji};Ji.fromType=function(t){return new zCe[t]};const ti={arraySlice:function(t,e,n){return ti.isTypedArray(t)?new t.constructor(t.subarray(e,n!==void 0?n:t.length)):t.slice(e,n)},convertArray:function(t,e,n){return!t||!n&&t.constructor===e?t:typeof e.BYTES_PER_ELEMENT=="number"?new e(t):Array.prototype.slice.call(t)},isTypedArray:function(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)},getKeyframeOrder:function(t){function e(i,s){return t[i]-t[s]}const n=t.length,r=new Array(n);for(let i=0;i!==n;++i)r[i]=i;return r.sort(e),r},sortedArray:function(t,e,n){const r=t.length,i=new t.constructor(r);for(let s=0,a=0;a!==r;++s){const o=n[s]*e;for(let l=0;l!==e;++l)i[a++]=t[o+l]}return i},flattenJSON:function(t,e,n,r){let i=1,s=t[0];for(;s!==void 0&&s[r]===void 0;)s=t[i++];if(s===void 0)return;let a=s[r];if(a!==void 0)if(Array.isArray(a))do a=s[r],a!==void 0&&(e.push(s.time),n.push.apply(n,a)),s=t[i++];while(s!==void 0);else if(a.toArray!==void 0)do a=s[r],a!==void 0&&(e.push(s.time),a.toArray(n,n.length)),s=t[i++];while(s!==void 0);else do a=s[r],a!==void 0&&(e.push(s.time),n.push(a)),s=t[i++];while(s!==void 0)},subclip:function(t,e,n,r,i=30){const s=t.clone();s.name=e;const a=[];for(let l=0;l=r)){d.push(u.times[h]);for(let m=0;ms.tracks[l].times[0]&&(o=s.tracks[l].times[0]);for(let l=0;l=o.times[p]){const g=p*d+c,b=g+d-c;m=ti.arraySlice(o.values,g,b)}else{const g=o.createInterpolant(),b=c,y=d-c;g.evaluate(s),m=ti.arraySlice(g.resultBuffer,b,y)}l==="quaternion"&&new Or().fromArray(m).normalize().conjugate().toArray(m);const v=u.times.length;for(let g=0;g=s)){const o=n[1];e=s)break t}a=r,r=0;break n}break e}for(;r>>1;en;)--a;if(++a,s!==0||a!==i){s>=a&&(a=Math.max(a,1),s=a-1);const o=this.getValueSize();this.times=ti.arraySlice(r,s,a),this.values=ti.arraySlice(this.values,s*o,a*o)}return this}validate(){let e=!0;const n=this.getValueSize();n-Math.floor(n)!==0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),e=!1);const r=this.times,i=this.values,s=r.length;s===0&&(console.error("THREE.KeyframeTrack: Track is empty.",this),e=!1);let a=null;for(let o=0;o!==s;o++){const l=r[o];if(typeof l=="number"&&isNaN(l)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,o,l),e=!1;break}if(a!==null&&a>l){console.error("THREE.KeyframeTrack: Out of order keys.",this,o,l,a),e=!1;break}a=l}if(i!==void 0&&ti.isTypedArray(i))for(let o=0,l=i.length;o!==l;++o){const u=i[o];if(isNaN(u)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,o,u),e=!1;break}}return e}optimize(){const e=ti.arraySlice(this.times),n=ti.arraySlice(this.values),r=this.getValueSize(),i=this.getInterpolation()===E7,s=e.length-1;let a=1;for(let o=1;o0){e[a]=e[s];for(let o=s*r,l=a*r,u=0;u!==r;++u)n[l+u]=n[o+u];++a}return a!==e.length?(this.times=ti.arraySlice(e,0,a),this.values=ti.arraySlice(n,0,a*r)):(this.times=e,this.values=n),this}clone(){const e=ti.arraySlice(this.times,0),n=ti.arraySlice(this.values,0),r=this.constructor,i=new r(this.name,e,n);return i.createInterpolant=this.createInterpolant,i}}Yu.prototype.TimeBufferType=Float32Array;Yu.prototype.ValueBufferType=Float32Array;Yu.prototype.DefaultInterpolation=l6;class x0 extends Yu{}x0.prototype.ValueTypeName="bool";x0.prototype.ValueBufferType=Array;x0.prototype.DefaultInterpolation=o6;x0.prototype.InterpolantFactoryMethodLinear=void 0;x0.prototype.InterpolantFactoryMethodSmooth=void 0;class FK extends Yu{}FK.prototype.ValueTypeName="color";class v6 extends Yu{}v6.prototype.ValueTypeName="number";class Hce extends xf{constructor(e,n,r,i){super(e,n,r,i)}interpolate_(e,n,r,i){const s=this.resultBuffer,a=this.sampleValues,o=this.valueSize,l=(r-n)/(i-n);let u=e*o;for(let c=u+o;u!==c;u+=4)Or.slerpFlat(s,0,a,u-o,a,u,l);return s}}class by extends Yu{InterpolantFactoryMethodLinear(e){return new Hce(this.times,this.values,this.getValueSize(),e)}}by.prototype.ValueTypeName="quaternion";by.prototype.DefaultInterpolation=l6;by.prototype.InterpolantFactoryMethodSmooth=void 0;class T0 extends Yu{}T0.prototype.ValueTypeName="string";T0.prototype.ValueBufferType=Array;T0.prototype.DefaultInterpolation=o6;T0.prototype.InterpolantFactoryMethodLinear=void 0;T0.prototype.InterpolantFactoryMethodSmooth=void 0;class g6 extends Yu{}g6.prototype.ValueTypeName="vector";class b6{constructor(e,n=-1,r,i=KV){this.name=e,this.tracks=r,this.duration=n,this.blendMode=i,this.uuid=fl(),this.duration<0&&this.resetDuration()}static parse(e){const n=[],r=e.tracks,i=1/(e.fps||1);for(let a=0,o=r.length;a!==o;++a)n.push(OCe(r[a]).scale(i));const s=new this(e.name,e.duration,n,e.blendMode);return s.uuid=e.uuid,s}static toJSON(e){const n=[],r=e.tracks,i={name:e.name,duration:e.duration,tracks:n,uuid:e.uuid,blendMode:e.blendMode};for(let s=0,a=r.length;s!==a;++s)n.push(Yu.toJSON(r[s]));return i}static CreateFromMorphTargetSequence(e,n,r,i){const s=n.length,a=[];for(let o=0;o1){const d=c[1];let f=i[d];f||(i[d]=f=[]),f.push(u)}}const a=[];for(const o in i)a.push(this.CreateFromMorphTargetSequence(o,i[o],n,r));return a}static parseAnimation(e,n){if(!e)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const r=function(d,f,h,p,m){if(h.length!==0){const v=[],g=[];ti.flattenJSON(h,v,g,p),v.length!==0&&m.push(new d(f,v,g))}},i=[],s=e.name||"default",a=e.fps||30,o=e.blendMode;let l=e.length||-1;const u=e.hierarchy||[];for(let d=0;d{n&&n(s),this.manager.itemEnd(e)},0),s;if(Md[e]!==void 0){Md[e].push({onLoad:n,onProgress:r,onError:i});return}Md[e]=[],Md[e].push({onLoad:n,onProgress:r,onError:i});const a=new Request(e,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"}),o=this.mimeType,l=this.responseType;fetch(a).then(u=>{if(u.status===200||u.status===0){if(u.status===0&&console.warn("THREE.FileLoader: HTTP Status 0 received."),typeof ReadableStream>"u"||u.body===void 0||u.body.getReader===void 0)return u;const c=Md[e],d=u.body.getReader(),f=u.headers.get("Content-Length"),h=f?parseInt(f):0,p=h!==0;let m=0;const v=new ReadableStream({start(g){b();function b(){d.read().then(({done:y,value:x})=>{if(y)g.close();else{m+=x.byteLength;const T=new ProgressEvent("progress",{lengthComputable:p,loaded:m,total:h});for(let M=0,E=c.length;M{switch(l){case"arraybuffer":return u.arrayBuffer();case"blob":return u.blob();case"document":return u.text().then(c=>new DOMParser().parseFromString(c,o));case"json":return u.json();default:if(o===void 0)return u.text();{const d=/charset="?([^;"\s]*)"?/i.exec(o),f=d&&d[1]?d[1].toLowerCase():void 0,h=new TextDecoder(f);return u.arrayBuffer().then(p=>h.decode(p))}}}).then(u=>{Zv.add(e,u);const c=Md[e];delete Md[e];for(let d=0,f=c.length;d{const c=Md[e];if(c===void 0)throw this.manager.itemError(e),u;delete Md[e];for(let d=0,f=c.length;d{this.manager.itemEnd(e)}),this.manager.itemStart(e)}setResponseType(e){return this.responseType=e,this}setMimeType(e){return this.mimeType=e,this}}class ICe extends Xa{constructor(e){super(e)}load(e,n,r,i){const s=this,a=new Du(this.manager);a.setPath(this.path),a.setRequestHeader(this.requestHeader),a.setWithCredentials(this.withCredentials),a.load(e,function(o){try{n(s.parse(JSON.parse(o)))}catch(l){i?i(l):console.error(l),s.manager.itemError(e)}},r,i)}parse(e){const n=[];for(let r=0;r0:i.vertexColors=e.vertexColors),e.uniforms!==void 0)for(const s in e.uniforms){const a=e.uniforms[s];switch(i.uniforms[s]={},a.type){case"t":i.uniforms[s].value=r(a.value);break;case"c":i.uniforms[s].value=new tt().setHex(a.value);break;case"v2":i.uniforms[s].value=new Oe().fromArray(a.value);break;case"v3":i.uniforms[s].value=new U().fromArray(a.value);break;case"v4":i.uniforms[s].value=new Qt().fromArray(a.value);break;case"m3":i.uniforms[s].value=new as().fromArray(a.value);break;case"m4":i.uniforms[s].value=new Be().fromArray(a.value);break;default:i.uniforms[s].value=a.value}}if(e.defines!==void 0&&(i.defines=e.defines),e.vertexShader!==void 0&&(i.vertexShader=e.vertexShader),e.fragmentShader!==void 0&&(i.fragmentShader=e.fragmentShader),e.extensions!==void 0)for(const s in e.extensions)i.extensions[s]=e.extensions[s];if(e.shading!==void 0&&(i.flatShading=e.shading===1),e.size!==void 0&&(i.size=e.size),e.sizeAttenuation!==void 0&&(i.sizeAttenuation=e.sizeAttenuation),e.map!==void 0&&(i.map=r(e.map)),e.matcap!==void 0&&(i.matcap=r(e.matcap)),e.alphaMap!==void 0&&(i.alphaMap=r(e.alphaMap)),e.bumpMap!==void 0&&(i.bumpMap=r(e.bumpMap)),e.bumpScale!==void 0&&(i.bumpScale=e.bumpScale),e.normalMap!==void 0&&(i.normalMap=r(e.normalMap)),e.normalMapType!==void 0&&(i.normalMapType=e.normalMapType),e.normalScale!==void 0){let s=e.normalScale;Array.isArray(s)===!1&&(s=[s,s]),i.normalScale=new Oe().fromArray(s)}return e.displacementMap!==void 0&&(i.displacementMap=r(e.displacementMap)),e.displacementScale!==void 0&&(i.displacementScale=e.displacementScale),e.displacementBias!==void 0&&(i.displacementBias=e.displacementBias),e.roughnessMap!==void 0&&(i.roughnessMap=r(e.roughnessMap)),e.metalnessMap!==void 0&&(i.metalnessMap=r(e.metalnessMap)),e.emissiveMap!==void 0&&(i.emissiveMap=r(e.emissiveMap)),e.emissiveIntensity!==void 0&&(i.emissiveIntensity=e.emissiveIntensity),e.specularMap!==void 0&&(i.specularMap=r(e.specularMap)),e.specularIntensityMap!==void 0&&(i.specularIntensityMap=r(e.specularIntensityMap)),e.specularColorMap!==void 0&&(i.specularColorMap=r(e.specularColorMap)),e.envMap!==void 0&&(i.envMap=r(e.envMap)),e.envMapIntensity!==void 0&&(i.envMapIntensity=e.envMapIntensity),e.reflectivity!==void 0&&(i.reflectivity=e.reflectivity),e.refractionRatio!==void 0&&(i.refractionRatio=e.refractionRatio),e.lightMap!==void 0&&(i.lightMap=r(e.lightMap)),e.lightMapIntensity!==void 0&&(i.lightMapIntensity=e.lightMapIntensity),e.aoMap!==void 0&&(i.aoMap=r(e.aoMap)),e.aoMapIntensity!==void 0&&(i.aoMapIntensity=e.aoMapIntensity),e.gradientMap!==void 0&&(i.gradientMap=r(e.gradientMap)),e.clearcoatMap!==void 0&&(i.clearcoatMap=r(e.clearcoatMap)),e.clearcoatRoughnessMap!==void 0&&(i.clearcoatRoughnessMap=r(e.clearcoatRoughnessMap)),e.clearcoatNormalMap!==void 0&&(i.clearcoatNormalMap=r(e.clearcoatNormalMap)),e.clearcoatNormalScale!==void 0&&(i.clearcoatNormalScale=new Oe().fromArray(e.clearcoatNormalScale)),e.transmissionMap!==void 0&&(i.transmissionMap=r(e.transmissionMap)),e.thicknessMap!==void 0&&(i.thicknessMap=r(e.thicknessMap)),e.sheenColorMap!==void 0&&(i.sheenColorMap=r(e.sheenColorMap)),e.sheenRoughnessMap!==void 0&&(i.sheenRoughnessMap=r(e.sheenRoughnessMap)),i}setTextures(e){return this.textures=e,this}}class lP{static decodeText(e){if(typeof TextDecoder<"u")return new TextDecoder().decode(e);let n="";for(let r=0,i=e.length;r0){const l=new jK(n);s=new y6(l),s.setCrossOrigin(this.crossOrigin);for(let u=0,c=e.length;u0){i=new y6(this.manager),i.setCrossOrigin(this.crossOrigin);for(let a=0,o=e.length;a"u"&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."),typeof fetch>"u"&&console.warn("THREE.ImageBitmapLoader: fetch() not supported."),this.options={premultiplyAlpha:"none"}}setOptions(e){return this.options=e,this}load(e,n,r,i){e===void 0&&(e=""),this.path!==void 0&&(e=this.path+e),e=this.manager.resolveURL(e);const s=this,a=Zv.get(e);if(a!==void 0)return s.manager.itemStart(e),setTimeout(function(){n&&n(a),s.manager.itemEnd(e)},0),a;const o={};o.credentials=this.crossOrigin==="anonymous"?"same-origin":"include",o.headers=this.requestHeader,fetch(e,o).then(function(l){return l.blob()}).then(function(l){return createImageBitmap(l,Object.assign(s.options,{colorSpaceConversion:"none"}))}).then(function(l){Zv.add(e,l),n&&n(l),s.manager.itemEnd(e)}).catch(function(l){i&&i(l),s.manager.itemError(e),s.manager.itemEnd(e)}),s.manager.itemStart(e)}}ide.prototype.isImageBitmapLoader=!0;let H2;const eq={getContext:function(){return H2===void 0&&(H2=new(window.AudioContext||window.webkitAudioContext)),H2},setContext:function(t){H2=t}};class sde extends Xa{constructor(e){super(e)}load(e,n,r,i){const s=this,a=new Du(this.manager);a.setResponseType("arraybuffer"),a.setPath(this.path),a.setRequestHeader(this.requestHeader),a.setWithCredentials(this.withCredentials),a.load(e,function(o){try{const l=o.slice(0);eq.getContext().decodeAudioData(l,function(c){n(c)})}catch(l){i?i(l):console.error(l),s.manager.itemError(e)}},r,i)}}class ade extends zT{constructor(e,n,r=1){super(void 0,r);const i=new tt().set(e),s=new tt().set(n),a=new U(i.r,i.g,i.b),o=new U(s.r,s.g,s.b),l=Math.sqrt(Math.PI),u=l*Math.sqrt(.75);this.sh.coefficients[0].copy(a).add(o).multiplyScalar(l),this.sh.coefficients[1].copy(a).sub(o).multiplyScalar(u)}}ade.prototype.isHemisphereLightProbe=!0;class ode extends zT{constructor(e,n=1){super(void 0,n);const r=new tt().set(e);this.sh.coefficients[0].set(r.r,r.g,r.b).multiplyScalar(2*Math.sqrt(Math.PI))}}ode.prototype.isAmbientLightProbe=!0;const bJ=new Be,yJ=new Be,zm=new Be;class XCe{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new ns,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new ns,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(e){const n=this._cache;if(n.focus!==e.focus||n.fov!==e.fov||n.aspect!==e.aspect*this.aspect||n.near!==e.near||n.far!==e.far||n.zoom!==e.zoom||n.eyeSep!==this.eyeSep){n.focus=e.focus,n.fov=e.fov,n.aspect=e.aspect*this.aspect,n.near=e.near,n.far=e.far,n.zoom=e.zoom,n.eyeSep=this.eyeSep,zm.copy(e.projectionMatrix);const i=n.eyeSep/2,s=i*n.near/n.focus,a=n.near*Math.tan(Rv*n.fov*.5)/n.zoom;let o,l;yJ.elements[12]=-i,bJ.elements[12]=i,o=-a*n.aspect+s,l=a*n.aspect+s,zm.elements[0]=2*n.near/(l-o),zm.elements[8]=(l+o)/(l-o),this.cameraL.projectionMatrix.copy(zm),o=-a*n.aspect-s,l=a*n.aspect-s,zm.elements[0]=2*n.near/(l-o),zm.elements[8]=(l+o)/(l-o),this.cameraR.projectionMatrix.copy(zm)}this.cameraL.matrixWorld.copy(e.matrixWorld).multiply(yJ),this.cameraR.matrixWorld.copy(e.matrixWorld).multiply(bJ)}}class r9{constructor(e=!0){this.autoStart=e,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=SJ(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let e=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const n=SJ();e=(n-this.oldTime)/1e3,this.oldTime=n,this.elapsedTime+=e}return e}}function SJ(){return(typeof performance>"u"?Date:performance).now()}const km=new U,xJ=new Or,CCe=new U,Om=new U;class KCe extends cn{constructor(){super(),this.type="AudioListener",this.context=eq.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new r9}getInput(){return this.gain}removeFilter(){return this.filter!==null&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(e){return this.filter!==null?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=e,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(e){return this.gain.gain.setTargetAtTime(e,this.context.currentTime,.01),this}updateMatrixWorld(e){super.updateMatrixWorld(e);const n=this.context.listener,r=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(km,xJ,CCe),Om.set(0,0,-1).applyQuaternion(xJ),n.positionX){const i=this.context.currentTime+this.timeDelta;n.positionX.linearRampToValueAtTime(km.x,i),n.positionY.linearRampToValueAtTime(km.y,i),n.positionZ.linearRampToValueAtTime(km.z,i),n.forwardX.linearRampToValueAtTime(Om.x,i),n.forwardY.linearRampToValueAtTime(Om.y,i),n.forwardZ.linearRampToValueAtTime(Om.z,i),n.upX.linearRampToValueAtTime(r.x,i),n.upY.linearRampToValueAtTime(r.y,i),n.upZ.linearRampToValueAtTime(r.z,i)}else n.setPosition(km.x,km.y,km.z),n.setOrientation(Om.x,Om.y,Om.z,r.x,r.y,r.z)}}class tq extends cn{constructor(e){super(),this.type="Audio",this.listener=e,this.context=e.context,this.gain=this.context.createGain(),this.gain.connect(e.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(e){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=e,this.connect(),this}setMediaElementSource(e){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(e),this.connect(),this}setMediaStreamSource(e){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(e),this.connect(),this}setBuffer(e){return this.buffer=e,this.sourceType="buffer",this.autoplay&&this.play(),this}play(e=0){if(this.isPlaying===!0){console.warn("THREE.Audio: Audio is already playing.");return}if(this.hasPlaybackControl===!1){console.warn("THREE.Audio: this Audio has no playback control.");return}this._startedAt=this.context.currentTime+e;const n=this.context.createBufferSource();return n.buffer=this.buffer,n.loop=this.loop,n.loopStart=this.loopStart,n.loopEnd=this.loopEnd,n.onended=this.onEnded.bind(this),n.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=n,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(this.hasPlaybackControl===!1){console.warn("THREE.Audio: this Audio has no playback control.");return}return this.isPlaying===!0&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,this.loop===!0&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this}stop(){if(this.hasPlaybackControl===!1){console.warn("THREE.Audio: this Audio has no playback control.");return}return this._progress=0,this.source.stop(),this.source.onended=null,this.isPlaying=!1,this}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let e=1,n=this.filters.length;e0){this.source.disconnect(this.filters[0]);for(let e=1,n=this.filters.length;e0&&this._mixBufferRegionAdditive(r,i,this._addIndex*n,1,n);for(let l=n,u=n+n;l!==u;++l)if(r[l]!==r[l+n]){o.setValue(r,i);break}}saveOriginalState(){const e=this.binding,n=this.buffer,r=this.valueSize,i=r*this._origIndex;e.getValue(n,i);for(let s=r,a=i;s!==a;++s)n[s]=n[i+s%r];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const e=this.valueSize*3;this.binding.setValue(this.buffer,e)}_setAdditiveIdentityNumeric(){const e=this._addIndex*this.valueSize,n=e+this.valueSize;for(let r=e;r=.5)for(let a=0;a!==s;++a)e[n+a]=e[r+a]}_slerp(e,n,r,i){Or.slerpFlat(e,n,e,n,e,r,i)}_slerpAdditive(e,n,r,i,s){const a=this._workIndex*s;Or.multiplyQuaternionsFlat(e,a,e,n,e,r),Or.slerpFlat(e,n,e,n,e,a,i)}_lerp(e,n,r,i,s){const a=1-i;for(let o=0;o!==s;++o){const l=n+o;e[l]=e[l]*a+e[r+o]*i}}_lerpAdditive(e,n,r,i,s){for(let a=0;a!==s;++a){const o=n+a;e[o]=e[o]+e[r+a]*i}}}const nq="\\[\\]\\.:\\/",WCe=new RegExp("["+nq+"]","g"),rq="[^"+nq+"]",ACe="[^"+nq.replace("\\.","")+"]",GCe=/((?:WC+[\/:])*)/.source.replace("WC",rq),FCe=/(WCOD+)?/.source.replace("WCOD",ACe),jCe=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",rq),ZCe=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",rq),JCe=new RegExp("^"+GCe+FCe+jCe+ZCe+"$"),YCe=["material","materials","bones"];class BCe{constructor(e,n,r){const i=r||Bn.parseTrackName(n);this._targetGroup=e,this._bindings=e.subscribe_(n,i)}getValue(e,n){this.bind();const r=this._targetGroup.nCachedObjects_,i=this._bindings[r];i!==void 0&&i.getValue(e,n)}setValue(e,n){const r=this._bindings;for(let i=this._targetGroup.nCachedObjects_,s=r.length;i!==s;++i)r[i].setValue(e,n)}bind(){const e=this._bindings;for(let n=this._targetGroup.nCachedObjects_,r=e.length;n!==r;++n)e[n].bind()}unbind(){const e=this._bindings;for(let n=this._targetGroup.nCachedObjects_,r=e.length;n!==r;++n)e[n].unbind()}}class Bn{constructor(e,n,r){this.path=n,this.parsedPath=r||Bn.parseTrackName(n),this.node=Bn.findNode(e,this.parsedPath.nodeName)||e,this.rootNode=e,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(e,n,r){return e&&e.isAnimationObjectGroup?new Bn.Composite(e,n,r):new Bn(e,n,r)}static sanitizeNodeName(e){return e.replace(/\s/g,"_").replace(WCe,"")}static parseTrackName(e){const n=JCe.exec(e);if(n===null)throw new Error("PropertyBinding: Cannot parse trackName: "+e);const r={nodeName:n[2],objectName:n[3],objectIndex:n[4],propertyName:n[5],propertyIndex:n[6]},i=r.nodeName&&r.nodeName.lastIndexOf(".");if(i!==void 0&&i!==-1){const s=r.nodeName.substring(i+1);YCe.indexOf(s)!==-1&&(r.nodeName=r.nodeName.substring(0,i),r.objectName=s)}if(r.propertyName===null||r.propertyName.length===0)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+e);return r}static findNode(e,n){if(n===void 0||n===""||n==="."||n===-1||n===e.name||n===e.uuid)return e;if(e.skeleton){const r=e.skeleton.getBoneByName(n);if(r!==void 0)return r}if(e.children){const r=function(s){for(let a=0;a=s){const d=s++,f=e[d];n[f.uuid]=c,e[c]=f,n[u]=d,e[d]=l;for(let h=0,p=i;h!==p;++h){const m=r[h],v=m[d],g=m[c];m[c]=v,m[d]=g}}}this.nCachedObjects_=s}uncache(){const e=this._objects,n=this._indicesByUUID,r=this._bindings,i=r.length;let s=this.nCachedObjects_,a=e.length;for(let o=0,l=arguments.length;o!==l;++o){const u=arguments[o],c=u.uuid,d=n[c];if(d!==void 0)if(delete n[c],d0&&(n[h.uuid]=d),e[d]=h,e.pop();for(let p=0,m=i;p!==m;++p){const v=r[p];v[d]=v[f],v.pop()}}}this.nCachedObjects_=s}subscribe_(e,n){const r=this._bindingsIndicesByPath;let i=r[e];const s=this._bindings;if(i!==void 0)return s[i];const a=this._paths,o=this._parsedPaths,l=this._objects,u=l.length,c=this.nCachedObjects_,d=new Array(u);i=s.length,r[e]=i,a.push(e),o.push(n),s.push(d);for(let f=c,h=l.length;f!==h;++f){const p=l[f];d[f]=new Bn(p,e,n)}return d}unsubscribe_(e){const n=this._bindingsIndicesByPath,r=n[e];if(r!==void 0){const i=this._paths,s=this._parsedPaths,a=this._bindings,o=a.length-1,l=a[o],u=e[o];n[u]=r,a[r]=l,a.pop(),s[r]=s[o],s.pop(),i[r]=i[o],i.pop()}}}cde.prototype.isAnimationObjectGroup=!0;class HCe{constructor(e,n,r=null,i=n.blendMode){this._mixer=e,this._clip=n,this._localRoot=r,this.blendMode=i;const s=n.tracks,a=s.length,o=new Array(a),l={endingStart:dv,endingEnd:dv};for(let u=0;u!==a;++u){const c=s[u].createInterpolant(null);o[u]=c,c.settings=l}this._interpolantSettings=l,this._interpolants=o,this._propertyBindings=new Array(a),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=cce,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&this.timeScale!==0&&this._startTime===null&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(e){return this._startTime=e,this}setLoop(e,n){return this.loop=e,this.repetitions=n,this}setEffectiveWeight(e){return this.weight=e,this._effectiveWeight=this.enabled?e:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(e){return this._scheduleFading(e,0,1)}fadeOut(e){return this._scheduleFading(e,1,0)}crossFadeFrom(e,n,r){if(e.fadeOut(n),this.fadeIn(n),r){const i=this._clip.duration,s=e._clip.duration,a=s/i,o=i/s;e.warp(1,a,n),this.warp(o,1,n)}return this}crossFadeTo(e,n,r){return e.crossFadeFrom(this,n,r)}stopFading(){const e=this._weightInterpolant;return e!==null&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this}setEffectiveTimeScale(e){return this.timeScale=e,this._effectiveTimeScale=this.paused?0:e,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(e){return this.timeScale=this._clip.duration/e,this.stopWarping()}syncWith(e){return this.time=e.time,this.timeScale=e.timeScale,this.stopWarping()}halt(e){return this.warp(this._effectiveTimeScale,0,e)}warp(e,n,r){const i=this._mixer,s=i.time,a=this.timeScale;let o=this._timeScaleInterpolant;o===null&&(o=i._lendControlInterpolant(),this._timeScaleInterpolant=o);const l=o.parameterPositions,u=o.sampleValues;return l[0]=s,l[1]=s+r,u[0]=e/a,u[1]=n/a,this}stopWarping(){const e=this._timeScaleInterpolant;return e!==null&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(e,n,r,i){if(!this.enabled){this._updateWeight(e);return}const s=this._startTime;if(s!==null){const l=(e-s)*r;if(l<0||r===0)return;this._startTime=null,n=r*l}n*=this._updateTimeScale(e);const a=this._updateTime(n),o=this._updateWeight(e);if(o>0){const l=this._interpolants,u=this._propertyBindings;switch(this.blendMode){case SK:for(let c=0,d=l.length;c!==d;++c)l[c].evaluate(a),u[c].accumulateAdditive(o);break;case KV:default:for(let c=0,d=l.length;c!==d;++c)l[c].evaluate(a),u[c].accumulate(i,o)}}}_updateWeight(e){let n=0;if(this.enabled){n=this.weight;const r=this._weightInterpolant;if(r!==null){const i=r.evaluate(e)[0];n*=i,e>r.parameterPositions[1]&&(this.stopFading(),i===0&&(this.enabled=!1))}}return this._effectiveWeight=n,n}_updateTimeScale(e){let n=0;if(!this.paused){n=this.timeScale;const r=this._timeScaleInterpolant;if(r!==null){const i=r.evaluate(e)[0];n*=i,e>r.parameterPositions[1]&&(this.stopWarping(),n===0?this.paused=!0:this.timeScale=n)}}return this._effectiveTimeScale=n,n}_updateTime(e){const n=this._clip.duration,r=this.loop;let i=this.time+e,s=this._loopCount;const a=r===dce;if(e===0)return s===-1?i:a&&(s&1)===1?n-i:i;if(r===uce){s===-1&&(this._loopCount=0,this._setEndings(!0,!0,!1));e:{if(i>=n)i=n;else if(i<0)i=0;else{this.time=i;break e}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:e<0?-1:1})}}else{if(s===-1&&(e>=0?(s=0,this._setEndings(!0,this.repetitions===0,a)):this._setEndings(this.repetitions===0,!0,a)),i>=n||i<0){const o=Math.floor(i/n);i-=n*o,s+=Math.abs(o);const l=this.repetitions-s;if(l<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,i=e>0?n:0,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:e>0?1:-1});else{if(l===1){const u=e<0;this._setEndings(u,!u,a)}else this._setEndings(!1,!1,a);this._loopCount=s,this.time=i,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:o})}}else this.time=i;if(a&&(s&1)===1)return n-i}return i}_setEndings(e,n,r){const i=this._interpolantSettings;r?(i.endingStart=fv,i.endingEnd=fv):(e?i.endingStart=this.zeroSlopeAtStart?fv:dv:i.endingStart=u6,n?i.endingEnd=this.zeroSlopeAtEnd?fv:dv:i.endingEnd=u6)}_scheduleFading(e,n,r){const i=this._mixer,s=i.time;let a=this._weightInterpolant;a===null&&(a=i._lendControlInterpolant(),this._weightInterpolant=a);const o=a.parameterPositions,l=a.sampleValues;return o[0]=s,l[0]=n,o[1]=s+e,l[1]=r,this}}class dde extends tm{constructor(e){super(),this._root=e,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(e,n){const r=e._localRoot||this._root,i=e._clip.tracks,s=i.length,a=e._propertyBindings,o=e._interpolants,l=r.uuid,u=this._bindingsByRootAndName;let c=u[l];c===void 0&&(c={},u[l]=c);for(let d=0;d!==s;++d){const f=i[d],h=f.name;let p=c[h];if(p!==void 0)++p.referenceCount,a[d]=p;else{if(p=a[d],p!==void 0){p._cacheIndex===null&&(++p.referenceCount,this._addInactiveBinding(p,l,h));continue}const m=n&&n._propertyBindings[d].binding.parsedPath;p=new ude(Bn.create(r,h,m),f.ValueTypeName,f.getValueSize()),++p.referenceCount,this._addInactiveBinding(p,l,h),a[d]=p}o[d].resultBuffer=p.buffer}}_activateAction(e){if(!this._isActiveAction(e)){if(e._cacheIndex===null){const r=(e._localRoot||this._root).uuid,i=e._clip.uuid,s=this._actionsByClip[i];this._bindAction(e,s&&s.knownActions[0]),this._addInactiveAction(e,i,r)}const n=e._propertyBindings;for(let r=0,i=n.length;r!==i;++r){const s=n[r];s.useCount++===0&&(this._lendBinding(s),s.saveOriginalState())}this._lendAction(e)}}_deactivateAction(e){if(this._isActiveAction(e)){const n=e._propertyBindings;for(let r=0,i=n.length;r!==i;++r){const s=n[r];--s.useCount===0&&(s.restoreOriginalState(),this._takeBackBinding(s))}this._takeBackAction(e)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const e=this;this.stats={actions:{get total(){return e._actions.length},get inUse(){return e._nActiveActions}},bindings:{get total(){return e._bindings.length},get inUse(){return e._nActiveBindings}},controlInterpolants:{get total(){return e._controlInterpolants.length},get inUse(){return e._nActiveControlInterpolants}}}}_isActiveAction(e){const n=e._cacheIndex;return n!==null&&n=0;--r)e[r].stop();return this}update(e){e*=this.timeScale;const n=this._actions,r=this._nActiveActions,i=this.time+=e,s=Math.sign(e),a=this._accuIndex^=1;for(let u=0;u!==r;++u)n[u]._update(i,e,s,a);const o=this._bindings,l=this._nActiveBindings;for(let u=0;u!==l;++u)o[u].apply(a);return this}setTime(e){this.time=0;for(let n=0;nthis.max.x||e.ythis.max.y)}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y}getParameter(e,n){return n.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(e){return!(e.max.xthis.max.x||e.max.ythis.max.y)}clampPoint(e,n){return n.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return EJ.copy(e).clamp(this.min,this.max).sub(e).length()}intersect(e){return this.min.max(e.min),this.max.min(e.max),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}Sy.prototype.isBox2=!0;const MJ=new U,Q2=new U;class hl{constructor(e=new U,n=new U){this.start=e,this.end=n}set(e,n){return this.start.copy(e),this.end.copy(n),this}copy(e){return this.start.copy(e.start),this.end.copy(e.end),this}getCenter(e){return e.addVectors(this.start,this.end).multiplyScalar(.5)}delta(e){return e.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(e,n){return this.delta(n).multiplyScalar(e).add(this.start)}closestPointToPointParameter(e,n){MJ.subVectors(e,this.start),Q2.subVectors(this.end,this.start);const r=Q2.dot(Q2);let s=Q2.dot(MJ)/r;return n&&(s=Fi(s,0,1)),s}closestPointToPoint(e,n,r){const i=this.closestPointToPointParameter(e,n);return this.delta(r).multiplyScalar(i).add(this.start)}applyMatrix4(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this}equals(e){return e.start.equals(this.start)&&e.end.equals(this.end)}clone(){return new this.constructor().copy(this)}}const PJ=new U;class _Ce extends cn{constructor(e,n){super(),this.light=e,this.light.updateMatrixWorld(),this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1,this.color=n;const r=new Lt,i=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let a=0,o=1,l=32;a.99999)this.quaternion.set(0,0,0,1);else if(e.y<-.99999)this.quaternion.set(1,0,0,0);else{OJ.set(e.z,0,-e.x).normalize();const n=Math.acos(e.y);this.quaternion.setFromAxisAngle(OJ,n)}}setLength(e,n=e*.2,r=n*.2){this.line.scale.set(1,Math.max(1e-4,e-n),1),this.line.updateMatrix(),this.cone.scale.set(r,n,r),this.cone.position.y=e,this.cone.updateMatrix()}setColor(e){this.line.material.color.set(e),this.cone.material.color.set(e)}copy(e){return super.copy(e,!1),this.line.copy(e.line),this.cone.copy(e.cone),this}}class yde extends qo{constructor(e=1){const n=[0,0,0,e,0,0,0,0,0,0,e,0,0,0,0,0,0,e],r=[1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],i=new Lt;i.setAttribute("position",new xt(n,3)),i.setAttribute("color",new xt(r,3));const s=new cs({vertexColors:!0,toneMapped:!1});super(i,s),this.type="AxesHelper"}setColors(e,n,r){const i=new tt,s=this.geometry.attributes.color.array;return i.set(e),i.toArray(s,0),i.toArray(s,3),i.set(n),i.toArray(s,6),i.toArray(s,9),i.set(r),i.toArray(s,12),i.toArray(s,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class Sde{constructor(){this.type="ShapePath",this.color=new tt,this.subPaths=[],this.currentPath=null}moveTo(e,n){return this.currentPath=new gb,this.subPaths.push(this.currentPath),this.currentPath.moveTo(e,n),this}lineTo(e,n){return this.currentPath.lineTo(e,n),this}quadraticCurveTo(e,n,r,i){return this.currentPath.quadraticCurveTo(e,n,r,i),this}bezierCurveTo(e,n,r,i,s,a){return this.currentPath.bezierCurveTo(e,n,r,i,s,a),this}splineThru(e){return this.currentPath.splineThru(e),this}toShapes(e,n){function r(b){const y=[];for(let x=0,T=b.length;xNumber.EPSILON){if(V<0&&(S=y[E],R=-R,P=y[M],V=-V),b.yP.y)continue;if(b.y===S.y){if(b.x===S.x)return!0}else{const z=V*(b.x-S.x)-R*(b.y-S.y);if(z===0)return!0;if(z<0)continue;T=!T}}else{if(b.y!==S.y)continue;if(P.x<=b.x&&b.x<=S.x||S.x<=b.x&&b.x<=P.x)return!0}}return T}const s=Fc.isClockWise,a=this.subPaths;if(a.length===0)return[];if(n===!0)return r(a);let o,l,u;const c=[];if(a.length===1)return l=a[0],u=new Gc,u.curves=l.curves,c.push(u),c;let d=!s(a[0].getPoints());d=e?!d:d;const f=[],h=[];let p=[],m=0,v;h[m]=void 0,p[m]=[];for(let b=0,y=a.length;b1){let b=!1,y=0;for(let x=0,T=h.length;x0&&b===!1&&(p=f)}let g;for(let b=0,y=h.length;b65504&&console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."),e=Fi(e,-65504,65504),IJ[0]=e;const n=UJ[0],r=n>>23&511;return mu[r]+((n&8388607)>>vu[r])}static fromHalfFloat(e){const n=e>>10;return UJ[0]=sq[Tde[n]+(e&1023)]+xy[n],IJ[0]}}const xde=new ArrayBuffer(4),IJ=new Float32Array(xde),UJ=new Uint32Array(xde),mu=new Uint32Array(512),vu=new Uint32Array(512);for(let t=0;t<256;++t){const e=t-127;e<-27?(mu[t]=0,mu[t|256]=32768,vu[t]=24,vu[t|256]=24):e<-14?(mu[t]=1024>>-e-14,mu[t|256]=1024>>-e-14|32768,vu[t]=-e-1,vu[t|256]=-e-1):e<=15?(mu[t]=e+15<<10,mu[t|256]=e+15<<10|32768,vu[t]=13,vu[t|256]=13):e<128?(mu[t]=31744,mu[t|256]=64512,vu[t]=24,vu[t|256]=24):(mu[t]=31744,mu[t|256]=64512,vu[t]=13,vu[t|256]=13)}const sq=new Uint32Array(2048),xy=new Uint32Array(64),Tde=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,n=0;for(;!(e&8388608);)e<<=1,n-=8388608;e&=-8388609,n+=947912704,sq[t]=e|n}for(let t=1024;t<2048;++t)sq[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)xy[t]=t<<23;xy[31]=1199570944;xy[32]=2147483648;for(let t=33;t<63;++t)xy[t]=2147483648+(t-32<<23);xy[63]=3347054592;for(let t=1;t<64;++t)t!==32&&(Tde[t]=1024);const sKe=0,aKe=1,oKe=0,lKe=1,uKe=2;function cKe(t){return console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead."),t}function dKe(t=[]){return console.warn("THREE.MultiMaterial has been removed. Use an Array instead."),t.isMultiMaterial=!0,t.materials=t,t.clone=function(){return t.slice()},t}class fKe extends vy{constructor(e,n){console.warn("THREE.PointCloud has been renamed to THREE.Points."),super(e,n)}}class hKe extends FV{constructor(e){console.warn("THREE.Particle has been renamed to THREE.Sprite."),super(e)}}class pKe extends vy{constructor(e,n){console.warn("THREE.ParticleSystem has been renamed to THREE.Points."),super(e,n)}}class mKe extends qf{constructor(e){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial."),super(e)}}class vKe extends qf{constructor(e){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial."),super(e)}}class gKe extends qf{constructor(e){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial."),super(e)}}class bKe extends U{constructor(e,n,r){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead."),super(e,n,r)}}class yKe extends un{constructor(e,n){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead."),super(e,n),this.setUsage(Bl)}}class SKe extends xce{constructor(e,n){console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead."),super(e,n)}}class xKe extends Tce{constructor(e,n){console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead."),super(e,n)}}class TKe extends wce{constructor(e,n){console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead."),super(e,n)}}class wKe extends Ece{constructor(e,n){console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead."),super(e,n)}}class EKe extends Av{constructor(e,n){console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead."),super(e,n)}}class MKe extends Mce{constructor(e,n){console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead."),super(e,n)}}class PKe extends Gv{constructor(e,n){console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead."),super(e,n)}}class RKe extends xt{constructor(e,n){console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead."),super(e,n)}}class VKe extends Rce{constructor(e,n){console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead."),super(e,n)}}yl.create=function(t,e){return console.log("THREE.Curve.create() has been deprecated"),t.prototype=Object.create(yl.prototype),t.prototype.constructor=t,t.prototype.getPoint=e,t};gb.prototype.fromPoints=function(t){return console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."),this.setFromPoints(t)};class zKe extends yde{constructor(e){console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper."),super(e)}}class kKe extends bde{constructor(e,n){console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead."),super(e,n)}}class OKe extends qo{constructor(e,n){console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead."),super(new NK(e.geometry),new cs({color:n!==void 0?n:16777215}))}}vde.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};pde.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")};class IKe extends qo{constructor(e,n){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead."),super(new $V(e.geometry),new cs({color:n!==void 0?n:16777215}))}}Xa.prototype.extractUrlBase=function(t){return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."),lP.extractUrlBase(t)};Xa.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}};class UKe extends Du{constructor(e){console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader."),super(e)}}class NKe extends t9{constructor(e){console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader."),super(e)}}Sy.prototype.center=function(t){return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."),this.getCenter(t)};Sy.prototype.empty=function(){return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."),this.isEmpty()};Sy.prototype.isIntersectionBox=function(t){return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)};Sy.prototype.size=function(t){return console.warn("THREE.Box2: .size() has been renamed to .getSize()."),this.getSize(t)};Jt.prototype.center=function(t){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(t)};Jt.prototype.empty=function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()};Jt.prototype.isIntersectionBox=function(t){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)};Jt.prototype.isIntersectionSphere=function(t){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)};Jt.prototype.size=function(t){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(t)};ld.prototype.toVector3=function(){console.error("THREE.Euler: .toVector3() has been removed. Use Vector3.setFromEuler() instead")};so.prototype.empty=function(){return console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty()."),this.isEmpty()};wT.prototype.setFromMatrix=function(t){return console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix()."),this.setFromProjectionMatrix(t)};hl.prototype.center=function(t){return console.warn("THREE.Line3: .center() has been renamed to .getCenter()."),this.getCenter(t)};as.prototype.flattenToArrayOffset=function(t,e){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)};as.prototype.multiplyVector3=function(t){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)};as.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")};as.prototype.applyToBufferAttribute=function(t){return console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)};as.prototype.applyToVector3Array=function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")};as.prototype.getInverse=function(t){return console.warn("THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()};Be.prototype.extractPosition=function(t){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(t)};Be.prototype.flattenToArrayOffset=function(t,e){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)};Be.prototype.getPosition=function(){return console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),new U().setFromMatrixColumn(this,3)};Be.prototype.setRotationFromQuaternion=function(t){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(t)};Be.prototype.multiplyToArray=function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")};Be.prototype.multiplyVector3=function(t){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)};Be.prototype.multiplyVector4=function(t){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)};Be.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")};Be.prototype.rotateAxis=function(t){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),t.transformDirection(this)};Be.prototype.crossVector=function(t){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)};Be.prototype.translate=function(){console.error("THREE.Matrix4: .translate() has been removed.")};Be.prototype.rotateX=function(){console.error("THREE.Matrix4: .rotateX() has been removed.")};Be.prototype.rotateY=function(){console.error("THREE.Matrix4: .rotateY() has been removed.")};Be.prototype.rotateZ=function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")};Be.prototype.rotateByAxis=function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")};Be.prototype.applyToBufferAttribute=function(t){return console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)};Be.prototype.applyToVector3Array=function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")};Be.prototype.makeFrustum=function(t,e,n,r,i,s){return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."),this.makePerspective(t,e,r,n,i,s)};Be.prototype.getInverse=function(t){return console.warn("THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()};ri.prototype.isIntersectionLine=function(t){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(t)};Or.prototype.multiplyVector3=function(t){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),t.applyQuaternion(this)};Or.prototype.inverse=function(){return console.warn("THREE.Quaternion: .inverse() has been renamed to invert()."),this.invert()};Ko.prototype.isIntersectionBox=function(t){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)};Ko.prototype.isIntersectionPlane=function(t){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(t)};Ko.prototype.isIntersectionSphere=function(t){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)};Wr.prototype.area=function(){return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."),this.getArea()};Wr.prototype.barycoordFromPoint=function(t,e){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),this.getBarycoord(t,e)};Wr.prototype.midpoint=function(t){return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."),this.getMidpoint(t)};Wr.prototypenormal=function(t){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),this.getNormal(t)};Wr.prototype.plane=function(t){return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."),this.getPlane(t)};Wr.barycoordFromPoint=function(t,e,n,r,i){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),Wr.getBarycoord(t,e,n,r,i)};Wr.normal=function(t,e,n,r){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),Wr.getNormal(t,e,n,r)};Gc.prototype.extractAllPoints=function(t){return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."),this.extractPoints(t)};Gc.prototype.extrude=function(t){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new ed(this,t)};Gc.prototype.makeGeometry=function(t){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new jv(this,t)};Oe.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)};Oe.prototype.distanceToManhattan=function(t){return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)};Oe.prototype.lengthManhattan=function(){return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()};U.prototype.setEulerFromRotationMatrix=function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")};U.prototype.setEulerFromQuaternion=function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")};U.prototype.getPositionFromMatrix=function(t){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(t)};U.prototype.getScaleFromMatrix=function(t){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(t)};U.prototype.getColumnFromMatrix=function(t,e){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(e,t)};U.prototype.applyProjection=function(t){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(t)};U.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)};U.prototype.distanceToManhattan=function(t){return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)};U.prototype.lengthManhattan=function(){return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()};Qt.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)};Qt.prototype.lengthManhattan=function(){return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()};cn.prototype.getChildByName=function(t){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(t)};cn.prototype.renderDepth=function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")};cn.prototype.translate=function(t,e){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(e,t)};cn.prototype.getWorldRotation=function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")};cn.prototype.applyMatrix=function(t){return console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)};Object.defineProperties(cn.prototype,{eulerOrder:{get:function(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set:function(t){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=t}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});ut.prototype.setDrawMode=function(){console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")};Object.defineProperties(ut.prototype,{drawMode:{get:function(){return console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode."),fce},set:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}});jV.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")};ns.prototype.setLens=function(t,e){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."),e!==void 0&&(this.filmGauge=e),this.setFocalLength(t)};Object.defineProperties(Wu.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(t){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."),this.shadow.camera.fov=t}},shadowCameraLeft:{set:function(t){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."),this.shadow.camera.left=t}},shadowCameraRight:{set:function(t){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."),this.shadow.camera.right=t}},shadowCameraTop:{set:function(t){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."),this.shadow.camera.top=t}},shadowCameraBottom:{set:function(t){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."),this.shadow.camera.bottom=t}},shadowCameraNear:{set:function(t){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."),this.shadow.camera.near=t}},shadowCameraFar:{set:function(t){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."),this.shadow.camera.far=t}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(t){console.warn("THREE.Light: .shadowBias is now .shadow.bias."),this.shadow.bias=t}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(t){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."),this.shadow.mapSize.width=t}},shadowMapHeight:{set:function(t){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."),this.shadow.mapSize.height=t}}});Object.defineProperties(un.prototype,{length:{get:function(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."),this.array.length}},dynamic:{get:function(){return console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.usage===Bl},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.setUsage(Bl)}}});un.prototype.setDynamic=function(t){return console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(t===!0?Bl:mb),this};un.prototype.copyIndicesArray=function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},un.prototype.setArray=function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")};Lt.prototype.addIndex=function(t){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(t)};Lt.prototype.addAttribute=function(t,e){return console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute()."),!(e&&e.isBufferAttribute)&&!(e&&e.isInterleavedBufferAttribute)?(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.setAttribute(t,new un(arguments[1],arguments[2]))):t==="index"?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(e),this):this.setAttribute(t,e)};Lt.prototype.addDrawCall=function(t,e,n){n!==void 0&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(t,e)};Lt.prototype.clearDrawCalls=function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()};Lt.prototype.computeOffsets=function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")};Lt.prototype.removeAttribute=function(t){return console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute()."),this.deleteAttribute(t)};Lt.prototype.applyMatrix=function(t){return console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)};Object.defineProperties(Lt.prototype,{drawcalls:{get:function(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups}},offsets:{get:function(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups}}});S0.prototype.setDynamic=function(t){return console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(t===!0?Bl:mb),this};S0.prototype.setArray=function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")};ed.prototype.getArrays=function(){console.error("THREE.ExtrudeGeometry: .getArrays() has been removed.")};ed.prototype.addShapeList=function(){console.error("THREE.ExtrudeGeometry: .addShapeList() has been removed.")};ed.prototype.addShape=function(){console.error("THREE.ExtrudeGeometry: .addShape() has been removed.")};RT.prototype.dispose=function(){console.error("THREE.Scene: .dispose() has been removed.")};i9.prototype.onUpdate=function(){return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."),this};Object.defineProperties(Ji.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},overdraw:{get:function(){console.warn("THREE.Material: .overdraw has been removed.")},set:function(){console.warn("THREE.Material: .overdraw has been removed.")}},wrapRGB:{get:function(){return console.warn("THREE.Material: .wrapRGB has been removed."),new tt}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(t){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=t===hK}},stencilMask:{get:function(){return console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask},set:function(t){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask=t}},vertexTangents:{get:function(){console.warn("THREE."+this.type+": .vertexTangents has been removed.")},set:function(){console.warn("THREE."+this.type+": .vertexTangents has been removed.")}}});Object.defineProperties(bi.prototype,{derivatives:{get:function(){return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives},set:function(t){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives=t}}});xr.prototype.clearTarget=function(t,e,n,r){console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead."),this.setRenderTarget(t),this.clear(e,n,r)};xr.prototype.animate=function(t){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."),this.setAnimationLoop(t)};xr.prototype.getCurrentRenderTarget=function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()};xr.prototype.getMaxAnisotropy=function(){return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."),this.capabilities.getMaxAnisotropy()};xr.prototype.getPrecision=function(){return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."),this.capabilities.precision};xr.prototype.resetGLState=function(){return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."),this.state.reset()};xr.prototype.supportsFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")};xr.prototype.supportsHalfFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")};xr.prototype.supportsStandardDerivatives=function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")};xr.prototype.supportsCompressedTextureS3TC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")};xr.prototype.supportsCompressedTexturePVRTC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")};xr.prototype.supportsBlendMinMax=function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")};xr.prototype.supportsVertexTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures};xr.prototype.supportsInstancedArrays=function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")};xr.prototype.enableScissorTest=function(t){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(t)};xr.prototype.initMaterial=function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")};xr.prototype.addPrePlugin=function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")};xr.prototype.addPostPlugin=function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")};xr.prototype.updateShadowMap=function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")};xr.prototype.setFaceCulling=function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")};xr.prototype.allocTextureUnit=function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")};xr.prototype.setTexture=function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")};xr.prototype.setTexture2D=function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")};xr.prototype.setTextureCube=function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")};xr.prototype.getActiveMipMapLevel=function(){return console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel()."),this.getActiveMipmapLevel()};Object.defineProperties(xr.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),this.shadowMap.enabled=t}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),this.shadowMap.type=t}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){return console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead."),this.getContext()}},vr:{get:function(){return console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr"),this.xr}},gammaInput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead."),!1},set:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.")}},gammaOutput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),!1},set:function(t){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),this.outputEncoding=t===!0?Jr:bl}},toneMappingWhitePoint:{get:function(){return console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed."),1},set:function(){console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.")}},gammaFactor:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaFactor has been removed."),2},set:function(){console.warn("THREE.WebGLRenderer: .gammaFactor has been removed.")}}});Object.defineProperties(Lce.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}});class LKe extends WV{constructor(e,n,r){console.warn("THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options )."),super(e,r)}}Object.defineProperties(oi.prototype,{wrapS:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=t}},wrapT:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=t}},magFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=t}},minFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=t}},anisotropy:{get:function(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set:function(t){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=t}},offset:{get:function(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set:function(t){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=t}},repeat:{get:function(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set:function(t){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=t}},format:{get:function(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set:function(t){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=t}},type:{get:function(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set:function(t){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=t}},generateMipmaps:{get:function(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set:function(t){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=t}}});tq.prototype.load=function(t){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");const e=this;return new sde().load(t,function(r){e.setBuffer(r)}),this};lde.prototype.getData=function(){return console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData()."),this.getFrequencyData()};DV.prototype.updateCubeMap=function(t,e){return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."),this.update(t,e)};DV.prototype.clear=function(t,e,n,r){return console.warn("THREE.CubeCamera: .clear() is now .renderTarget.clear()."),this.renderTarget.clear(t,e,n,r)};nm.crossOrigin=void 0;nm.loadTexture=function(t,e,n,r){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");const i=new ZK;i.setCrossOrigin(this.crossOrigin);const s=i.load(t,n,void 0,r);return e&&(s.mapping=e),s};nm.loadTextureCube=function(t,e,n,r){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");const i=new _ce;i.setCrossOrigin(this.crossOrigin);const s=i.load(t,n,void 0,r);return e&&(s.mapping=e),s};nm.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")};nm.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};function XKe(){console.error("THREE.CanvasRenderer has been removed")}function CKe(){console.error("THREE.JSONLoader has been removed.")}const KKe={createMultiMaterialObject:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},detach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},attach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")}};function qKe(){console.error("THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js")}class DKe extends Lt{constructor(){console.error("THREE.ParametricGeometry has been moved to /examples/jsm/geometries/ParametricGeometry.js"),super()}}class WKe extends Lt{constructor(){console.error("THREE.TextGeometry has been moved to /examples/jsm/geometries/TextGeometry.js"),super()}}function AKe(){console.error("THREE.FontLoader has been moved to /examples/jsm/loaders/FontLoader.js")}function GKe(){console.error("THREE.Font has been moved to /examples/jsm/loaders/FontLoader.js")}function FKe(){console.error("THREE.ImmediateRenderObject has been removed.")}class jKe extends oi{constructor(e,n,r){console.error('THREE.WebGLMultisampleRenderTarget has been removed. Use a normal render target and set the "samples" property to greater 0 to enable multisampling.'),super(e,n,r),this.samples=4}}class ZKe extends fy{constructor(e,n,r,i){console.warn("THREE.DataTexture2DArray has been renamed to DataArrayTexture."),super(e,n,r,i)}}class JKe extends xT{constructor(e,n,r,i){console.warn("THREE.DataTexture3D has been renamed to Data3DTexture."),super(e,n,r,i)}}typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:NV}}));typeof window<"u"&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=NV);const YKe=Object.freeze(Object.defineProperty({__proto__:null,ACESFilmicToneMapping:bK,AddEquation:Eu,AddOperation:Fue,AdditiveAnimationBlendMode:SK,AdditiveBlending:SL,AlphaFormat:ece,AlwaysDepth:Cue,AlwaysStencilFunc:c6,AmbientLight:QK,AmbientLightProbe:ode,AnimationClip:b6,AnimationLoader:ICe,AnimationMixer:dde,AnimationObjectGroup:cde,AnimationUtils:ti,ArcCurve:zK,ArrayCamera:EK,ArrowHelper:iKe,Audio:tq,AudioAnalyser:lde,AudioContext:eq,AudioListener:KCe,AudioLoader:sde,AxesHelper:yde,AxisHelper:zKe,BackSide:Ua,BasicDepthPacking:xK,BasicShadowMap:VUe,BinaryTextureLoader:NKe,Bone:ZV,BooleanKeyframeTrack:x0,BoundingBoxHelper:kKe,Box2:Sy,Box3:Jt,Box3Helper:OT,BoxBufferGeometry:pi,BoxGeometry:pi,BoxHelper:bde,BufferAttribute:un,BufferGeometry:Lt,BufferGeometryLoader:rde,ByteType:Bue,Cache:Zv,Camera:TT,CameraHelper:iq,CanvasRenderer:XKe,CanvasTexture:Ace,CapsuleBufferGeometry:bb,CapsuleGeometry:bb,CatmullRomCurve3:OK,CineonToneMapping:Jue,CircleBufferGeometry:Xp,CircleGeometry:Xp,ClampToEdgeWrapping:_a,Clock:r9,Color:tt,ColorKeyframeTrack:FK,ColorManagement:Xl,CompressedTexture:VK,CompressedTextureLoader:UCe,ConeBufferGeometry:yb,ConeGeometry:yb,CubeCamera:DV,CubeReflectionMapping:Ip,CubeRefractionMapping:Up,CubeTexture:hy,CubeTextureLoader:_ce,CubeUVReflectionMapping:dy,CubicBezierCurve:YV,CubicBezierCurve3:IK,CubicInterpolant:Yce,CullFaceBack:yL,CullFaceFront:Vue,CullFaceFrontBack:RUe,CullFaceNone:Rue,Curve:yl,CurvePath:Fce,CustomBlending:bT,CustomToneMapping:Yue,CylinderBufferGeometry:Ni,CylinderGeometry:Ni,Cylindrical:QCe,Data3DTexture:xT,DataArrayTexture:fy,DataTexture:Ac,DataTexture2DArray:ZKe,DataTexture3D:JKe,DataTextureLoader:t9,DataUtils:hv,DecrementStencilOp:qUe,DecrementWrapStencilOp:WUe,DefaultLoadingManager:Qce,DepthFormat:dp,DepthStencilFormat:Wv,DepthTexture:MK,DirectionalLight:n9,DirectionalLightHelper:gde,DiscreteInterpolant:Bce,DodecahedronBufferGeometry:Sb,DodecahedronGeometry:Sb,DoubleSide:rn,DstAlphaFactor:LV,DstColorFactor:gK,DynamicBufferAttribute:yKe,DynamicCopyUsage:eNe,DynamicDrawUsage:Bl,DynamicReadUsage:QUe,EdgesGeometry:NK,EdgesHelper:OKe,EllipseCurve:gy,EqualDepth:que,EqualStencilFunc:pce,EquirectangularReflectionMapping:i6,EquirectangularRefractionMapping:s6,Euler:ld,EventDispatcher:tm,ExtrudeBufferGeometry:ed,ExtrudeGeometry:ed,FaceColors:lKe,FileLoader:Du,FlatShading:hK,Float16BufferAttribute:Pce,Float32Attribute:RKe,Float32BufferAttribute:xt,Float64Attribute:VKe,Float64BufferAttribute:Rce,FloatType:na,Fog:PT,FogExp2:MT,Font:GKe,FontLoader:AKe,FramebufferTexture:Wce,FrontSide:Ki,Frustum:wT,GLBufferAttribute:fde,GLSL1:nNe,GLSL3:jL,GreaterDepth:Wue,GreaterEqualDepth:Due,GreaterEqualStencilFunc:YUe,GreaterStencilFunc:ZUe,GridHelper:vde,Group:$a,HalfFloatType:Uo,HemisphereLight:JK,HemisphereLightHelper:tKe,HemisphereLightProbe:ade,IcosahedronBufferGeometry:xb,IcosahedronGeometry:xb,ImageBitmapLoader:ide,ImageLoader:y6,ImageUtils:nm,ImmediateRenderObject:FKe,IncrementStencilOp:KUe,IncrementWrapStencilOp:DUe,InstancedBufferAttribute:Lp,InstancedBufferGeometry:kT,InstancedInterleavedBuffer:Jv,InstancedMesh:PK,Int16Attribute:wKe,Int16BufferAttribute:Ece,Int32Attribute:MKe,Int32BufferAttribute:Mce,Int8Attribute:SKe,Int8BufferAttribute:xce,IntType:Que,InterleavedBuffer:S0,InterleavedBufferAttribute:qs,Interpolant:xf,InterpolateDiscrete:o6,InterpolateLinear:l6,InterpolateSmooth:E7,InvertStencilOp:AUe,JSONLoader:CKe,KeepStencilOp:M7,KeyframeTrack:Yu,LOD:qce,LatheBufferGeometry:Fv,LatheGeometry:Fv,Layers:qV,LensFlare:qKe,LessDepth:Kue,LessEqualDepth:nP,LessEqualStencilFunc:jUe,LessStencilFunc:FUe,Light:Wu,LightProbe:zT,Line:$s,Line3:hl,LineBasicMaterial:cs,LineCurve:VT,LineCurve3:Gce,LineDashedMaterial:AK,LineLoop:RK,LinePieces:aKe,LineSegments:qo,LineStrip:sKe,LinearEncoding:bl,LinearFilter:Hn,LinearInterpolant:GK,LinearMipMapLinearFilter:UUe,LinearMipMapNearestFilter:IUe,LinearMipmapLinearFilter:b0,LinearMipmapNearestFilter:yK,LinearSRGBColorSpace:Yh,LinearToneMapping:jue,Loader:Xa,LoaderUtils:lP,LoadingManager:jK,LoopOnce:uce,LoopPingPong:dce,LoopRepeat:cce,LuminanceAlphaFormat:rce,LuminanceFormat:nce,MOUSE:MUe,Material:Ji,MaterialLoader:nde,Math:fp,MathUtils:fp,Matrix3:as,Matrix4:Be,MaxEquation:tP,Mesh:ut,MeshBasicMaterial:fo,MeshDepthMaterial:my,MeshDistanceMaterial:ET,MeshFaceMaterial:cKe,MeshLambertMaterial:DK,MeshMatcapMaterial:WK,MeshNormalMaterial:e9,MeshPhongMaterial:KK,MeshPhysicalMaterial:CK,MeshStandardMaterial:pp,MeshToonMaterial:qK,MinEquation:wL,MirroredRepeatWrapping:a6,MixOperation:Gue,MultiMaterial:dKe,MultiplyBlending:TL,MultiplyOperation:yT,NearestFilter:Ir,NearestMipMapLinearFilter:OUe,NearestMipMapNearestFilter:kUe,NearestMipmapLinearFilter:iP,NearestMipmapNearestFilter:rP,NeverDepth:Xue,NeverStencilFunc:GUe,NoBlending:os,NoColorSpace:XUe,NoColors:oKe,NoToneMapping:Wc,NormalAnimationBlendMode:KV,NormalBlending:Mv,NotEqualDepth:Aue,NotEqualStencilFunc:JUe,NumberKeyframeTrack:v6,Object3D:cn,ObjectLoader:NCe,ObjectSpaceNormalMap:hce,OctahedronBufferGeometry:zu,OctahedronGeometry:zu,OneFactor:Jh,OneMinusDstAlphaFactor:Uue,OneMinusDstColorFactor:Nue,OneMinusSrcAlphaFactor:vK,OneMinusSrcColorFactor:Iue,OrthographicCamera:Kf,PCFShadowMap:fK,PCFSoftShadowMap:zue,PMREMGenerator:oP,ParametricGeometry:DKe,Particle:hKe,ParticleBasicMaterial:vKe,ParticleSystem:pKe,ParticleSystemMaterial:gKe,Path:gb,PerspectiveCamera:ns,Plane:ri,PlaneBufferGeometry:ao,PlaneGeometry:ao,PlaneHelper:rKe,PointCloud:fKe,PointCloudMaterial:mKe,PointLight:HK,PointLightHelper:$Ce,Points:vy,PointsMaterial:qf,PolarGridHelper:nKe,PolyhedronBufferGeometry:$c,PolyhedronGeometry:$c,PositionalAudio:DCe,PropertyBinding:Bn,PropertyMixer:ude,QuadraticBezierCurve:BV,QuadraticBezierCurve3:HV,Quaternion:Or,QuaternionKeyframeTrack:by,QuaternionLinearInterpolant:Hce,REVISION:NV,RGBADepthPacking:ST,RGBAFormat:no,RGBAIntegerFormat:oce,RGBA_ASTC_10x10_Format:WL,RGBA_ASTC_10x5_Format:KL,RGBA_ASTC_10x6_Format:qL,RGBA_ASTC_10x8_Format:DL,RGBA_ASTC_12x10_Format:AL,RGBA_ASTC_12x12_Format:GL,RGBA_ASTC_4x4_Format:kL,RGBA_ASTC_5x4_Format:OL,RGBA_ASTC_5x5_Format:IL,RGBA_ASTC_6x5_Format:UL,RGBA_ASTC_6x6_Format:NL,RGBA_ASTC_8x5_Format:LL,RGBA_ASTC_8x6_Format:XL,RGBA_ASTC_8x8_Format:CL,RGBA_BPTC_Format:FL,RGBA_ETC2_EAC_Format:zL,RGBA_PVRTC_2BPPV1_Format:RL,RGBA_PVRTC_4BPPV1_Format:PL,RGBA_S3TC_DXT1_Format:x7,RGBA_S3TC_DXT3_Format:T7,RGBA_S3TC_DXT5_Format:w7,RGBFormat:tce,RGB_ETC1_Format:lce,RGB_ETC2_Format:VL,RGB_PVRTC_2BPPV1_Format:ML,RGB_PVRTC_4BPPV1_Format:EL,RGB_S3TC_DXT1_Format:S7,RGFormat:sce,RGIntegerFormat:ace,RawShaderMaterial:XK,Ray:Ko,Raycaster:yy,RectAreaLight:_K,RedFormat:CV,RedIntegerFormat:ice,ReinhardToneMapping:Zue,RepeatWrapping:yf,ReplaceStencilOp:zc,ReverseSubtractEquation:pK,RingBufferGeometry:Tb,RingGeometry:Tb,SRGBColorSpace:Pc,Scene:RT,SceneUtils:KKe,ShaderChunk:yn,ShaderLib:wi,ShaderMaterial:bi,ShadowMaterial:LK,Shape:Gc,ShapeBufferGeometry:jv,ShapeGeometry:jv,ShapePath:Sde,ShapeUtils:Fc,ShortType:Hue,Skeleton:JV,SkeletonHelper:pde,SkinnedMesh:jV,SmoothShading:zUe,Source:Bh,Sphere:so,SphereBufferGeometry:Sf,SphereGeometry:Sf,Spherical:hde,SphericalHarmonics3:$K,SplineCurve:QV,SpotLight:BK,SpotLightHelper:_Ce,Sprite:FV,SpriteMaterial:GV,SrcAlphaFactor:mK,SrcAlphaSaturateFactor:Lue,SrcColorFactor:Oue,StaticCopyUsage:$Ue,StaticDrawUsage:mb,StaticReadUsage:HUe,StereoCamera:XCe,StreamCopyUsage:tNe,StreamDrawUsage:BUe,StreamReadUsage:_Ue,StringKeyframeTrack:T0,SubtractEquation:kue,SubtractiveBlending:xL,TOUCH:PUe,TangentSpaceNormalMap:y0,TetrahedronBufferGeometry:wb,TetrahedronGeometry:wb,TextGeometry:WKe,Texture:Di,TextureLoader:ZK,TorusBufferGeometry:Mu,TorusGeometry:Mu,TorusKnotBufferGeometry:Eb,TorusKnotGeometry:Eb,Triangle:Wr,TriangleFanDrawMode:LUe,TriangleStripDrawMode:NUe,TrianglesDrawMode:fce,TubeBufferGeometry:Mb,TubeGeometry:Mb,UVMapping:XV,Uint16Attribute:EKe,Uint16BufferAttribute:Av,Uint32Attribute:PKe,Uint32BufferAttribute:Gv,Uint8Attribute:xKe,Uint8BufferAttribute:Tce,Uint8ClampedAttribute:TKe,Uint8ClampedBufferAttribute:wce,Uniform:i9,UniformsLib:St,UniformsUtils:Na,UnsignedByteType:Np,UnsignedInt248Type:Pv,UnsignedIntType:nx,UnsignedShort4444Type:_ue,UnsignedShort5551Type:$ue,UnsignedShortType:pb,VSMShadowMap:cv,Vector2:Oe,Vector3:U,Vector4:Qt,VectorKeyframeTrack:g6,Vertex:bKe,VertexColors:uKe,VideoTexture:Dce,WebGL1Renderer:Cce,WebGL3DRenderTarget:yce,WebGLArrayRenderTarget:bce,WebGLCubeRenderTarget:WV,WebGLMultipleRenderTargets:Sce,WebGLMultisampleRenderTarget:jKe,WebGLRenderTarget:oi,WebGLRenderTargetCube:LKe,WebGLRenderer:xr,WebGLUtils:Xce,WireframeGeometry:$V,WireframeHelper:IKe,WrapAroundEnding:u6,XHRLoader:UKe,ZeroCurvatureEnding:dv,ZeroFactor:r6,ZeroSlopeEnding:fv,ZeroStencilOp:CUe,_SRGBAFormat:sP,sRGBEncoding:Jr},Symbol.toStringTag,{value:"Module"}));var ax=function(){var t=0,e=document.createElement("div");e.style.cssText="position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000",e.addEventListener("click",function(c){c.preventDefault(),r(++t%e.children.length)},!1);function n(c){return e.appendChild(c.dom),c}function r(c){for(var d=0;d=s+1e3&&(o.update(a*1e3/(c-s),100),s=c,a=0,u)){var d=performance.memory;u.update(d.usedJSHeapSize/1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){i=this.end()},domElement:e,setMode:r}};ax.Panel=function(t,e,n){var r=1/0,i=0,s=Math.round,a=s(window.devicePixelRatio||1),o=80*a,l=48*a,u=3*a,c=2*a,d=3*a,f=15*a,h=74*a,p=30*a,m=document.createElement("canvas");m.width=o,m.height=l,m.style.cssText="width:80px;height:48px";var v=m.getContext("2d");return v.font="bold "+9*a+"px Helvetica,Arial,sans-serif",v.textBaseline="top",v.fillStyle=n,v.fillRect(0,0,o,l),v.fillStyle=e,v.fillText(t,u,c),v.fillRect(d,f,h,p),v.fillStyle=n,v.globalAlpha=.9,v.fillRect(d,f,h,p),{dom:m,update:function(g,b){r=Math.min(r,g),i=Math.max(i,g),v.fillStyle=n,v.globalAlpha=1,v.fillRect(0,0,o,f),v.fillStyle=e,v.fillText(s(g)+" "+t+" ("+s(r)+"-"+s(i)+")",u,c),v.drawImage(m,d+a,f,h-a,p,d,f,h-a,p),v.fillRect(d+h-a,f,a,p),v.fillStyle=n,v.globalAlpha=.9,v.fillRect(d+h-a,f,a,s((1-g/b)*p))}}};const BKe=ax;var kS=function(t){return t&&t.Math===Math&&t},on=kS(typeof globalThis=="object"&&globalThis)||kS(typeof window=="object"&&window)||kS(typeof self=="object"&&self)||kS(typeof Ks=="object"&&Ks)||kS(typeof Ks=="object"&&Ks)||function(){return this}()||Function("return this")(),IT={},Rn=function(t){try{return!!t()}catch{return!0}},HKe=Rn,Gr=!HKe(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!==7}),QKe=Rn,s9=!QKe(function(){var t=(function(){}).bind();return typeof t!="function"||t.hasOwnProperty("prototype")}),_Ke=s9,r5=Function.prototype.call,Vn=_Ke?r5.bind(r5):function(){return r5.apply(r5,arguments)},aq={},wde={}.propertyIsEnumerable,Ede=Object.getOwnPropertyDescriptor,$Ke=Ede&&!wde.call({1:2},1);aq.f=$Ke?function(e){var n=Ede(this,e);return!!n&&n.enumerable}:wde;var rm=function(t,e){return{enumerable:!(t&1),configurable:!(t&2),writable:!(t&4),value:e}},Mde=s9,Pde=Function.prototype,_L=Pde.call,eqe=Mde&&Pde.bind.bind(_L,_L),tn=Mde?eqe:function(t){return function(){return _L.apply(t,arguments)}},Rde=tn,tqe=Rde({}.toString),nqe=Rde("".slice),ud=function(t){return nqe(tqe(t),8,-1)},rqe=tn,iqe=Rn,sqe=ud,tO=Object,aqe=rqe("".split),a9=iqe(function(){return!tO("z").propertyIsEnumerable(0)})?function(t){return sqe(t)==="String"?aqe(t,""):tO(t)}:tO,wl=function(t){return t==null},oqe=wl,lqe=TypeError,cd=function(t){if(oqe(t))throw new lqe("Can't call method on "+t);return t},uqe=a9,cqe=cd,Ty=function(t){return uqe(cqe(t))},nO=typeof document=="object"&&document.all,ir=typeof nO>"u"&&nO!==void 0?function(t){return typeof t=="function"||t===nO}:function(t){return typeof t=="function"},dqe=ir,ei=function(t){return typeof t=="object"?t!==null:dqe(t)},rO=on,fqe=ir,hqe=function(t){return fqe(t)?t:void 0},ca=function(t,e){return arguments.length<2?hqe(rO[t]):rO[t]&&rO[t][e]},pqe=tn,Df=pqe({}.isPrototypeOf),mqe=on,NJ=mqe.navigator,LJ=NJ&&NJ.userAgent,Wf=LJ?String(LJ):"",Vde=on,iO=Wf,XJ=Vde.process,CJ=Vde.Deno,KJ=XJ&&XJ.versions||CJ&&CJ.version,qJ=KJ&&KJ.v8,Su,uP;qJ&&(Su=qJ.split("."),uP=Su[0]>0&&Su[0]<4?1:+(Su[0]+Su[1]));!uP&&iO&&(Su=iO.match(/Edge\/(\d+)/),(!Su||Su[1]>=74)&&(Su=iO.match(/Chrome\/(\d+)/),Su&&(uP=+Su[1])));var wy=uP,DJ=wy,vqe=Rn,gqe=on,bqe=gqe.String,zde=!!Object.getOwnPropertySymbols&&!vqe(function(){var t=Symbol("symbol detection");return!bqe(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&DJ&&DJ<41}),yqe=zde,kde=yqe&&!Symbol.sham&&typeof Symbol.iterator=="symbol",Sqe=ca,xqe=ir,Tqe=Df,wqe=kde,Eqe=Object,oq=wqe?function(t){return typeof t=="symbol"}:function(t){var e=Sqe("Symbol");return xqe(e)&&Tqe(e.prototype,Eqe(t))},Mqe=String,Ey=function(t){try{return Mqe(t)}catch{return"Object"}},Pqe=ir,Rqe=Ey,Vqe=TypeError,yi=function(t){if(Pqe(t))return t;throw new Vqe(Rqe(t)+" is not a function")},zqe=yi,kqe=wl,im=function(t,e){var n=t[e];return kqe(n)?void 0:zqe(n)},sO=Vn,aO=ir,oO=ei,Oqe=TypeError,Iqe=function(t,e){var n,r;if(e==="string"&&aO(n=t.toString)&&!oO(r=sO(n,t))||aO(n=t.valueOf)&&!oO(r=sO(n,t))||e!=="string"&&aO(n=t.toString)&&!oO(r=sO(n,t)))return r;throw new Oqe("Can't convert object to primitive value")},Ode={exports:{}},Ide=!1,WJ=on,Uqe=Object.defineProperty,lq=function(t,e){try{Uqe(WJ,t,{value:e,configurable:!0,writable:!0})}catch{WJ[t]=e}return e},Nqe=on,Lqe=lq,AJ="__core-js_shared__",GJ=Ode.exports=Nqe[AJ]||Lqe(AJ,{});(GJ.versions||(GJ.versions=[])).push({version:"3.40.0",mode:"global",copyright:"© 2014-2025 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.40.0/LICENSE",source:"https://github.com/zloirock/core-js"});var uq=Ode.exports,FJ=uq,o9=function(t,e){return FJ[t]||(FJ[t]=e||{})},Xqe=cd,Cqe=Object,da=function(t){return Cqe(Xqe(t))},Kqe=tn,qqe=da,Dqe=Kqe({}.hasOwnProperty),Yi=Object.hasOwn||function(e,n){return Dqe(qqe(e),n)},Wqe=tn,Aqe=0,Gqe=Math.random(),Fqe=Wqe(1 .toString),l9=function(t){return"Symbol("+(t===void 0?"":t)+")_"+Fqe(++Aqe+Gqe,36)},jqe=on,Zqe=o9,jJ=Yi,Jqe=l9,Yqe=zde,Bqe=kde,h1=jqe.Symbol,lO=Zqe("wks"),Hqe=Bqe?h1.for||h1:h1&&h1.withoutSetter||Jqe,Vr=function(t){return jJ(lO,t)||(lO[t]=Yqe&&jJ(h1,t)?h1[t]:Hqe("Symbol."+t)),lO[t]},Qqe=Vn,ZJ=ei,JJ=oq,_qe=im,$qe=Iqe,eDe=Vr,tDe=TypeError,nDe=eDe("toPrimitive"),Ude=function(t,e){if(!ZJ(t)||JJ(t))return t;var n=_qe(t,nDe),r;if(n){if(e===void 0&&(e="default"),r=Qqe(n,t,e),!ZJ(r)||JJ(r))return r;throw new tDe("Can't convert object to primitive value")}return e===void 0&&(e="number"),$qe(t,e)},rDe=Ude,iDe=oq,cq=function(t){var e=rDe(t,"string");return iDe(e)?e:e+""},sDe=on,YJ=ei,$L=sDe.document,aDe=YJ($L)&&YJ($L.createElement),u9=function(t){return aDe?$L.createElement(t):{}},oDe=Gr,lDe=Rn,uDe=u9,Nde=!oDe&&!lDe(function(){return Object.defineProperty(uDe("div"),"a",{get:function(){return 7}}).a!==7}),cDe=Gr,dDe=Vn,fDe=aq,hDe=rm,pDe=Ty,mDe=cq,vDe=Yi,gDe=Nde,BJ=Object.getOwnPropertyDescriptor;IT.f=cDe?BJ:function(e,n){if(e=pDe(e),n=mDe(n),gDe)try{return BJ(e,n)}catch{}if(vDe(e,n))return hDe(!dDe(fDe.f,e,n),e[n])};var ho={},bDe=Gr,yDe=Rn,Lde=bDe&&yDe(function(){return Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype!==42}),SDe=ei,xDe=String,TDe=TypeError,dr=function(t){if(SDe(t))return t;throw new TDe(xDe(t)+" is not an object")},wDe=Gr,EDe=Nde,MDe=Lde,i5=dr,HJ=cq,PDe=TypeError,uO=Object.defineProperty,RDe=Object.getOwnPropertyDescriptor,cO="enumerable",dO="configurable",fO="writable";ho.f=wDe?MDe?function(e,n,r){if(i5(e),n=HJ(n),i5(r),typeof e=="function"&&n==="prototype"&&"value"in r&&fO in r&&!r[fO]){var i=RDe(e,n);i&&i[fO]&&(e[n]=r.value,r={configurable:dO in r?r[dO]:i[dO],enumerable:cO in r?r[cO]:i[cO],writable:!1})}return uO(e,n,r)}:uO:function(e,n,r){if(i5(e),n=HJ(n),i5(r),EDe)try{return uO(e,n,r)}catch{}if("get"in r||"set"in r)throw new PDe("Accessors not supported");return"value"in r&&(e[n]=r.value),e};var VDe=Gr,zDe=ho,kDe=rm,$l=VDe?function(t,e,n){return zDe.f(t,e,kDe(1,n))}:function(t,e,n){return t[e]=n,t},Xde={exports:{}},e8=Gr,ODe=Yi,Cde=Function.prototype,IDe=e8&&Object.getOwnPropertyDescriptor,dq=ODe(Cde,"name"),UDe=dq&&(function(){}).name==="something",NDe=dq&&(!e8||e8&&IDe(Cde,"name").configurable),fq={EXISTS:dq,PROPER:UDe,CONFIGURABLE:NDe},LDe=tn,XDe=ir,t8=uq,CDe=LDe(Function.toString);XDe(t8.inspectSource)||(t8.inspectSource=function(t){return CDe(t)});var hq=t8.inspectSource,KDe=on,qDe=ir,QJ=KDe.WeakMap,Kde=qDe(QJ)&&/native code/.test(String(QJ)),DDe=o9,WDe=l9,_J=DDe("keys"),pq=function(t){return _J[t]||(_J[t]=WDe(t))},c9={},ADe=Kde,qde=on,GDe=ei,FDe=$l,hO=Yi,pO=uq,jDe=pq,ZDe=c9,$J="Object already initialized",n8=qde.TypeError,JDe=qde.WeakMap,cP,S6,dP,YDe=function(t){return dP(t)?S6(t):cP(t,{})},BDe=function(t){return function(e){var n;if(!GDe(e)||(n=S6(e)).type!==t)throw new n8("Incompatible receiver, "+t+" required");return n}};if(ADe||pO.state){var sc=pO.state||(pO.state=new JDe);sc.get=sc.get,sc.has=sc.has,sc.set=sc.set,cP=function(t,e){if(sc.has(t))throw new n8($J);return e.facade=t,sc.set(t,e),e},S6=function(t){return sc.get(t)||{}},dP=function(t){return sc.has(t)}}else{var yg=jDe("state");ZDe[yg]=!0,cP=function(t,e){if(hO(t,yg))throw new n8($J);return e.facade=t,FDe(t,yg,e),e},S6=function(t){return hO(t,yg)?t[yg]:{}},dP=function(t){return hO(t,yg)}}var Fs={set:cP,get:S6,has:dP,enforce:YDe,getterFor:BDe},mq=tn,HDe=Rn,QDe=ir,s5=Yi,r8=Gr,_De=fq.CONFIGURABLE,$De=hq,Dde=Fs,eWe=Dde.enforce,tWe=Dde.get,eY=String,R7=Object.defineProperty,nWe=mq("".slice),rWe=mq("".replace),iWe=mq([].join),sWe=r8&&!HDe(function(){return R7(function(){},"length",{value:8}).length!==8}),aWe=String(String).split("String"),oWe=Xde.exports=function(t,e,n){nWe(eY(e),0,7)==="Symbol("&&(e="["+rWe(eY(e),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),n&&n.getter&&(e="get "+e),n&&n.setter&&(e="set "+e),(!s5(t,"name")||_De&&t.name!==e)&&(r8?R7(t,"name",{value:e,configurable:!0}):t.name=e),sWe&&n&&s5(n,"arity")&&t.length!==n.arity&&R7(t,"length",{value:n.arity});try{n&&s5(n,"constructor")&&n.constructor?r8&&R7(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch{}var r=eWe(t);return s5(r,"source")||(r.source=iWe(aWe,typeof e=="string"?e:"")),t};Function.prototype.toString=oWe(function(){return QDe(this)&&tWe(this).source||$De(this)},"toString");var Wde=Xde.exports,lWe=ir,uWe=ho,cWe=Wde,dWe=lq,po=function(t,e,n,r){r||(r={});var i=r.enumerable,s=r.name!==void 0?r.name:e;if(lWe(n)&&cWe(n,s,r),r.global)i?t[e]=n:dWe(e,n);else{try{r.unsafe?t[e]&&(i=!0):delete t[e]}catch{}i?t[e]=n:uWe.f(t,e,{value:n,enumerable:!1,configurable:!r.nonConfigurable,writable:!r.nonWritable})}return t},My={},fWe=Math.ceil,hWe=Math.floor,pWe=Math.trunc||function(e){var n=+e;return(n>0?hWe:fWe)(n)},mWe=pWe,Bu=function(t){var e=+t;return e!==e||e===0?0:mWe(e)},vWe=Bu,gWe=Math.max,bWe=Math.min,vq=function(t,e){var n=vWe(t);return n<0?gWe(n+e,0):bWe(n,e)},yWe=Bu,SWe=Math.min,Py=function(t){var e=yWe(t);return e>0?SWe(e,9007199254740991):0},xWe=Py,Ca=function(t){return xWe(t.length)},TWe=Ty,wWe=vq,EWe=Ca,tY=function(t){return function(e,n,r){var i=TWe(e),s=EWe(i);if(s===0)return!t&&-1;var a=wWe(r,s),o;if(t&&n!==n){for(;s>a;)if(o=i[a++],o!==o)return!0}else for(;s>a;a++)if((t||a in i)&&i[a]===n)return t||a||0;return!t&&-1}},Ade={includes:tY(!0),indexOf:tY(!1)},MWe=tn,mO=Yi,PWe=Ty,RWe=Ade.indexOf,VWe=c9,nY=MWe([].push),Gde=function(t,e){var n=PWe(t),r=0,i=[],s;for(s in n)!mO(VWe,s)&&mO(n,s)&&nY(i,s);for(;e.length>r;)mO(n,s=e[r++])&&(~RWe(i,s)||nY(i,s));return i},gq=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],zWe=Gde,kWe=gq,OWe=kWe.concat("length","prototype");My.f=Object.getOwnPropertyNames||function(e){return zWe(e,OWe)};var bq={};bq.f=Object.getOwnPropertySymbols;var IWe=ca,UWe=tn,NWe=My,LWe=bq,XWe=dr,CWe=UWe([].concat),KWe=IWe("Reflect","ownKeys")||function(e){var n=NWe.f(XWe(e)),r=LWe.f;return r?CWe(n,r(e)):n},rY=Yi,qWe=KWe,DWe=IT,WWe=ho,d9=function(t,e,n){for(var r=qWe(e),i=WWe.f,s=DWe.f,a=0;aOAe)throw kAe("Maximum allowed index exceeded");return t},UAe=ud,NAe=tn,yq=function(t){if(UAe(t)==="Function")return NAe(t)},aY=yq,LAe=yi,XAe=s9,CAe=aY(aY.bind),Vi=function(t,e){return LAe(t),e===void 0?t:XAe?CAe(t,e):function(){return t.apply(e,arguments)}},KAe=jde,qAe=Ca,DAe=IAe,WAe=Vi,Zde=function(t,e,n,r,i,s,a,o){for(var l=i,u=0,c=a?WAe(a,o):!1,d,f;u0&&KAe(d)?(f=qAe(d),l=Zde(t,e,d,f,l,s-1)-1):(DAe(l+1),t[l]=d),l++),u++;return l},Jde=Zde,AAe=tn,GAe=Rn,Yde=ir,FAe=sm,jAe=ca,ZAe=hq,Bde=function(){},Hde=jAe("Reflect","construct"),Sq=/^\s*(?:class|function)\b/,JAe=AAe(Sq.exec),YAe=!Sq.test(Bde),OS=function(e){if(!Yde(e))return!1;try{return Hde(Bde,[],e),!0}catch{return!1}},Qde=function(e){if(!Yde(e))return!1;switch(FAe(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return YAe||!!JAe(Sq,ZAe(e))}catch{return!0}};Qde.sham=!0;var NT=!Hde||GAe(function(){var t;return OS(OS.call)||!OS(Object)||!OS(function(){t=!0})||t})?Qde:OS,oY=jde,BAe=NT,HAe=ei,QAe=Vr,_Ae=QAe("species"),lY=Array,$Ae=function(t){var e;return oY(t)&&(e=t.constructor,BAe(e)&&(e===lY||oY(e.prototype))?e=void 0:HAe(e)&&(e=e[_Ae],e===null&&(e=void 0))),e===void 0?lY:e},eGe=$Ae,xq=function(t,e){return new(eGe(t))(e===0?0:e)},tGe=rt,nGe=Jde,rGe=da,iGe=Ca,sGe=Bu,aGe=xq;tGe({target:"Array",proto:!0},{flat:function(){var e=arguments.length?arguments[0]:void 0,n=rGe(this),r=iGe(n),i=aGe(n,0);return i.length=nGe(i,n,n,r,0,e===void 0?1:sGe(e)),i}});var oGe=rt,lGe=Jde,uGe=yi,cGe=da,dGe=Ca,fGe=xq;oGe({target:"Array",proto:!0},{flatMap:function(e){var n=cGe(this),r=dGe(n),i;return uGe(e),i=fGe(n,0),i.length=lGe(i,n,n,r,0,1,e,arguments.length>1?arguments[1]:void 0),i}});var _de={},hGe=Gde,pGe=gq,$de=Object.keys||function(e){return hGe(e,pGe)},mGe=Gr,vGe=Lde,gGe=ho,bGe=dr,yGe=Ty,SGe=$de;_de.f=mGe&&!vGe?Object.defineProperties:function(e,n){bGe(e);for(var r=yGe(n),i=SGe(n),s=i.length,a=0,o;s>a;)gGe.f(e,o=i[a++],r[o]);return e};var xGe=ca,efe=xGe("document","documentElement"),TGe=dr,wGe=_de,uY=gq,EGe=c9,MGe=efe,PGe=u9,RGe=pq,cY=">",dY="<",i8="prototype",s8="script",tfe=RGe("IE_PROTO"),vO=function(){},nfe=function(t){return dY+s8+cY+t+dY+"/"+s8+cY},fY=function(t){t.write(nfe("")),t.close();var e=t.parentWindow.Object;return t=null,e},VGe=function(){var t=PGe("iframe"),e="java"+s8+":",n;return t.style.display="none",MGe.appendChild(t),t.src=String(e),n=t.contentWindow.document,n.open(),n.write(nfe("document.F=Object")),n.close(),n.F},u5,z7=function(){try{u5=new ActiveXObject("htmlfile")}catch{}z7=typeof document<"u"?document.domain&&u5?fY(u5):VGe():fY(u5);for(var t=uY.length;t--;)delete z7[i8][uY[t]];return z7()};EGe[tfe]=!0;var dd=Object.create||function(e,n){var r;return e!==null?(vO[i8]=TGe(e),r=new vO,vO[i8]=null,r[tfe]=e):r=z7(),n===void 0?r:wGe.f(r,n)},zGe=Vr,kGe=dd,OGe=ho.f,a8=zGe("unscopables"),o8=Array.prototype;o8[a8]===void 0&&OGe(o8,a8,{configurable:!0,value:kGe(null)});var Ry=function(t){o8[a8][t]=!0},IGe=rt,UGe=Ade.includes,NGe=Rn,LGe=Ry,XGe=NGe(function(){return!Array(1).includes()});IGe({target:"Array",proto:!0,forced:XGe},{includes:function(e){return UGe(this,e,arguments.length>1?arguments[1]:void 0)}});LGe("includes");var CGe=yi,KGe=da,qGe=a9,DGe=Ca,hY=TypeError,pY="Reduce of empty array with no initial value",mY=function(t){return function(e,n,r,i){var s=KGe(e),a=qGe(s),o=DGe(s);if(CGe(n),o===0&&r<2)throw new hY(pY);var l=t?o-1:0,u=t?-1:1;if(r<2)for(;;){if(l in a){i=a[l],l+=u;break}if(l+=u,t?l<0:o<=l)throw new hY(pY)}for(;t?l>=0:o>l;l+=u)l in a&&(i=n(i,a[l],l,s));return i}},rfe={left:mY(!1),right:mY(!0)},WGe=Rn,Tq=function(t,e){var n=[][t];return!!n&&WGe(function(){n.call(null,e||function(){return 1},1)})},IS=on,AGe=Wf,GGe=ud,c5=function(t){return AGe.slice(0,t.length)===t},wq=function(){return c5("Bun/")?"BUN":c5("Cloudflare-Workers")?"CLOUDFLARE":c5("Deno/")?"DENO":c5("Node.js/")?"NODE":IS.Bun&&typeof Bun.version=="string"?"BUN":IS.Deno&&typeof Deno.version=="object"?"DENO":GGe(IS.process)==="process"?"NODE":IS.window&&IS.document?"BROWSER":"REST"}(),FGe=wq,LT=FGe==="NODE",jGe=rt,ZGe=rfe.left,JGe=Tq,vY=wy,YGe=LT,BGe=!YGe&&vY>79&&vY<83,HGe=BGe||!JGe("reduce");jGe({target:"Array",proto:!0,forced:HGe},{reduce:function(e){var n=arguments.length;return ZGe(this,e,n,n>1?arguments[1]:void 0)}});var QGe=rt,_Ge=rfe.right,$Ge=Tq,gY=wy,eFe=LT,tFe=!eFe&&gY>79&&gY<83,nFe=tFe||!$Ge("reduceRight");QGe({target:"Array",proto:!0,forced:nFe},{reduceRight:function(e){return _Ge(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}});var bY=Ey,rFe=TypeError,iFe=function(t,e){if(!delete t[e])throw new rFe("Cannot delete property "+bY(e)+" of "+bY(t))},sFe=tn,w0=sFe([].slice),yY=w0,aFe=Math.floor,l8=function(t,e){var n=t.length;if(n<8)for(var r=1,i,s;r0;)t[s]=t[--s];s!==r++&&(t[s]=i)}else for(var a=aFe(n/2),o=l8(yY(t,0,a),e),l=l8(yY(t,a),e),u=o.length,c=l.length,d=0,f=0;d3)){if(vFe)return!0;if(PY)return PY<603;var t="",e,n,r,i;for(e=65;e<76;e++){switch(n=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:r=3;break;case 68:case 71:r=4;break;default:r=2}for(i=0;i<47;i++)Hh.push({k:n+i,v:r})}for(Hh.sort(function(s,a){return a.v-s.v}),i=0;iwY(n)?1:-1}};cFe({target:"Array",proto:!0,forced:xFe},{sort:function(e){e!==void 0&&dFe(e);var n=fFe(this);if(lfe)return e===void 0?RY(n):RY(n,e);var r=[],i=TY(n),s,a;for(a=0;a0?(l=o/a,r+=l*l):r+=o;return a===1/0?1/0:a*RFe(r)}});var Vy={},zFe=Vr,kFe=Vy,OFe=zFe("iterator"),IFe=Array.prototype,Pq=function(t){return t!==void 0&&(kFe.Array===t||IFe[OFe]===t)},UFe=sm,zY=im,NFe=wl,LFe=Vy,XFe=Vr,CFe=XFe("iterator"),XT=function(t){if(!NFe(t))return zY(t,CFe)||zY(t,"@@iterator")||LFe[UFe(t)]},KFe=Vn,qFe=yi,DFe=dr,WFe=Ey,AFe=XT,GFe=TypeError,CT=function(t,e){var n=arguments.length<2?AFe(t):e;if(qFe(n))return DFe(KFe(n,t));throw new GFe(WFe(t)+" is not iterable")},FFe=Vn,kY=dr,jFe=im,h9=function(t,e,n){var r,i;kY(t);try{if(r=jFe(t,"return"),!r){if(e==="throw")throw n;return n}r=FFe(r,t)}catch(s){i=!0,r=s}if(e==="throw")throw n;if(i)throw r;return kY(r),n},ZFe=Vi,JFe=Vn,YFe=dr,BFe=Ey,HFe=Pq,QFe=Ca,OY=Df,_Fe=CT,$Fe=XT,IY=h9,eje=TypeError,k7=function(t,e){this.stopped=t,this.result=e},UY=k7.prototype,Zo=function(t,e,n){var r=n&&n.that,i=!!(n&&n.AS_ENTRIES),s=!!(n&&n.IS_RECORD),a=!!(n&&n.IS_ITERATOR),o=!!(n&&n.INTERRUPTED),l=ZFe(e,r),u,c,d,f,h,p,m,v=function(b){return u&&IY(u,"normal",b),new k7(!0,b)},g=function(b){return i?(YFe(b),o?l(b[0],b[1],v):l(b[0],b[1])):o?l(b,v):l(b)};if(s)u=t.iterator;else if(a)u=t;else{if(c=$Fe(t),!c)throw new eje(BFe(t)+" is not iterable");if(HFe(c)){for(d=0,f=QFe(t);f>d;d++)if(h=g(t[d]),h&&OY(UY,h))return h;return new k7(!1)}u=_Fe(t,c)}for(p=s?t.next:u.next;!(m=JFe(p,u)).done;){try{h=g(m.value)}catch(b){IY(u,"throw",b)}if(typeof h=="object"&&h&&OY(UY,h))return h}return new k7(!1)},tje=Gr,nje=ho,rje=rm,ufe=function(t,e,n){tje?nje.f(t,e,rje(0,n)):t[e]=n},ije=rt,sje=Zo,aje=ufe;ije({target:"Object",stat:!0},{fromEntries:function(e){var n={};return sje(e,function(r,i){aje(n,r,i)},{AS_ENTRIES:!0}),n}});var oje=tn,lje=yi,cfe=function(t,e,n){try{return oje(lje(Object.getOwnPropertyDescriptor(t,e)[n]))}catch{}},uje=ei,cje=function(t){return uje(t)||t===null},dje=cje,fje=String,hje=TypeError,pje=function(t){if(dje(t))return t;throw new hje("Can't set "+fje(t)+" as a prototype")},mje=cfe,vje=ei,gje=cd,bje=pje,E0=Object.setPrototypeOf||("__proto__"in{}?function(){var t=!1,e={},n;try{n=mje(Object.prototype,"__proto__","set"),n(e,[]),t=e instanceof Array}catch{}return function(i,s){return gje(i),bje(s),vje(i)&&(t?n(i,s):i.__proto__=s),i}}():void 0),yje=ho.f,Sje=Yi,xje=Vr,NY=xje("toStringTag"),am=function(t,e,n){t&&!n&&(t=t.prototype),t&&!Sje(t,NY)&&yje(t,NY,{configurable:!0,value:e})},Tje=ca,wje=eu,Eje=Vr,Mje=Gr,LY=Eje("species"),KT=function(t){var e=Tje(t);Mje&&e&&!e[LY]&&wje(e,LY,{configurable:!0,get:function(){return this}})},Pje=Df,Rje=TypeError,Af=function(t,e){if(Pje(e,t))return t;throw new Rje("Incorrect invocation")},Vje=NT,zje=Ey,kje=TypeError,dfe=function(t){if(Vje(t))return t;throw new kje(zje(t)+" is not a constructor")},XY=dr,Oje=dfe,Ije=wl,Uje=Vr,Nje=Uje("species"),Rq=function(t,e){var n=XY(t).constructor,r;return n===void 0||Ije(r=XY(n)[Nje])?e:Oje(r)},Lje=s9,ffe=Function.prototype,CY=ffe.apply,KY=ffe.call,zy=typeof Reflect=="object"&&Reflect.apply||(Lje?KY.bind(CY):function(){return KY.apply(CY,arguments)}),Xje=TypeError,qT=function(t,e){if(tb)","g");return t.exec("b").groups.a!=="b"||"b".replace(t,"$c")!=="bc"}),AJe=Gr,Dq=on,AT=tn,GJe=f9,FJe=g9,jJe=$l,ZJe=dd,JJe=My.f,hB=Df,YJe=Nq,pB=mo,BJe=Xq,Wfe=Kfe,HJe=LJe,QJe=po,_Je=Rn,$Je=Yi,eYe=Fs.enforce,tYe=KT,nYe=Vr,Afe=qfe,Gfe=Dfe,rYe=nYe("match"),mp=Dq.RegExp,Jg=mp.prototype,iYe=Dq.SyntaxError,sYe=AT(Jg.exec),mP=AT("".charAt),mB=AT("".replace),vB=AT("".indexOf),gB=AT("".slice),aYe=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,zv=/a/g,VO=/a/g,oYe=new mp(zv)!==zv,Ffe=Wfe.MISSED_STICKY,lYe=Wfe.UNSUPPORTED_Y,uYe=AJe&&(!oYe||Ffe||Afe||Gfe||_Je(function(){return VO[rYe]=!1,mp(zv)!==zv||mp(VO)===VO||String(mp(zv,"i"))!=="/a/i"})),cYe=function(t){for(var e=t.length,n=0,r="",i=!1,s;n<=e;n++){if(s=mP(t,n),s==="\\"){r+=s+mP(t,++n);continue}!i&&s==="."?r+="[\\s\\S]":(s==="["?i=!0:s==="]"&&(i=!1),r+=s)}return r},dYe=function(t){for(var e=t.length,n=0,r="",i=[],s=ZJe(null),a=!1,o=!1,l=0,u="",c;n<=e;n++){if(c=mP(t,n),c==="\\")c+=mP(t,++n);else if(c==="]")a=!1;else if(!a)switch(!0){case c==="[":a=!0;break;case c==="(":if(r+=c,gB(t,n+1,n+3)==="?:")continue;sYe(aYe,gB(t,n+1))&&(n+=2,o=!0),l++;continue;case(c===">"&&o):if(u===""||$Je(s,u))throw new iYe("Invalid capture group name");s[u]=!0,i[i.length]=[u,l],o=!1,u="";continue}o?u+=c:r+=c}return[r,i]};if(GJe("RegExp",uYe)){for(var Xm=function(e,n){var r=hB(Jg,this),i=YJe(e),s=n===void 0,a=[],o=e,l,u,c,d,f,h;if(!r&&i&&s&&e.constructor===Xm)return e;if((i||hB(Jg,e))&&(e=e.source,s&&(n=BJe(o))),e=e===void 0?"":pB(e),n=n===void 0?"":pB(n),o=e,Afe&&"dotAll"in zv&&(u=!!n&&vB(n,"s")>-1,u&&(n=mB(n,/s/g,""))),l=n,Ffe&&"sticky"in zv&&(c=!!n&&vB(n,"y")>-1,c&&lYe&&(n=mB(n,/y/g,""))),Gfe&&(d=dYe(e),e=d[0],a=d[1]),f=FJe(mp(e,n),r?this:Jg,Xm),(u||c||a.length)&&(h=eYe(f),u&&(h.dotAll=!0,h.raw=Xm(cYe(e),l)),c&&(h.sticky=!0),a.length&&(h.groups=a)),e!==o)try{jJe(f,"source",o===""?"(?:)":o)}catch{}return f},bB=JJe(mp),yB=0;bB.length>yB;)HJe(Xm,mp,bB[yB++]);Jg.constructor=Xm,Xm.prototype=Jg,QJe(Dq,"RegExp",Xm,{constructor:!0})}tYe("RegExp");var m1=Vn,b9=tn,fYe=mo,hYe=Lq,pYe=Kfe,mYe=o9,vYe=dd,gYe=Fs.get,bYe=qfe,yYe=Dfe,SYe=mYe("native-string-replace",String.prototype.replace),vP=RegExp.prototype.exec,b8=vP,xYe=b9("".charAt),TYe=b9("".indexOf),wYe=b9("".replace),zO=b9("".slice),y8=function(){var t=/a/,e=/b*/g;return m1(vP,t,"a"),m1(vP,e,"a"),t.lastIndex!==0||e.lastIndex!==0}(),jfe=pYe.BROKEN_CARET,S8=/()??/.exec("")[1]!==void 0,EYe=y8||S8||jfe||bYe||yYe;EYe&&(b8=function(e){var n=this,r=gYe(n),i=fYe(e),s=r.raw,a,o,l,u,c,d,f;if(s)return s.lastIndex=n.lastIndex,a=m1(b8,s,i),n.lastIndex=s.lastIndex,a;var h=r.groups,p=jfe&&n.sticky,m=m1(hYe,n),v=n.source,g=0,b=i;if(p&&(m=wYe(m,"y",""),TYe(m,"g")===-1&&(m+="g"),b=zO(i,n.lastIndex),n.lastIndex>0&&(!n.multiline||n.multiline&&xYe(i,n.lastIndex-1)!==` +`)&&(v="(?: "+v+")",b=" "+b,g++),o=new RegExp("^(?:"+v+")",m)),S8&&(o=new RegExp("^"+v+"$(?!\\s)",m)),y8&&(l=n.lastIndex),u=m1(vP,p?o:n,b),p?u?(u.input=zO(u.input,g),u[0]=zO(u[0],g),u.index=n.lastIndex,n.lastIndex+=u[0].length):n.lastIndex=0:y8&&u&&(n.lastIndex=n.global?u.index+u[0].length:l),S8&&u&&u.length>1&&m1(SYe,u[0],o,function(){for(c=1;c=s?t?"":void 0:(a=EB(r,i),a<55296||a>56319||i+1===s||(o=EB(r,i+1))<56320||o>57343?t?qYe(r,i):a:t?DYe(r,i,i+2):(a-55296<<10)+(o-56320)+65536)}},GT={codeAt:MB(!1),charAt:MB(!0)},WYe=GT.charAt,Bfe=function(t,e,n){return e+(n?WYe(t,e).length:1)},Gq=tn,AYe=da,GYe=Math.floor,OO=Gq("".charAt),FYe=Gq("".replace),IO=Gq("".slice),jYe=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,ZYe=/\$([$&'`]|\d{1,2})/g,Hfe=function(t,e,n,r,i,s){var a=n+t.length,o=r.length,l=ZYe;return i!==void 0&&(i=AYe(i),l=jYe),FYe(s,l,function(u,c){var d;switch(OO(c,0)){case"$":return"$";case"&":return t;case"`":return IO(e,0,n);case"'":return IO(e,a);case"<":d=i[IO(c,1,-1)];break;default:var f=+c;if(f===0)return u;if(f>o){var h=GYe(f/10);return h===0?u:h<=o?r[h-1]===void 0?OO(c,1):r[h-1]+OO(c,1):u}d=r[f-1]}return d===void 0?"":d})},PB=Vn,JYe=dr,YYe=ir,BYe=ud,HYe=Wq,QYe=TypeError,Qfe=function(t,e){var n=t.exec;if(YYe(n)){var r=PB(n,t,e);return r!==null&&JYe(r),r}if(BYe(t)==="RegExp")return PB(HYe,t,e);throw new QYe("RegExp#exec called on incompatible receiver")},_Ye=zy,RB=Vn,y9=tn,$Ye=LYe,eBe=Rn,tBe=dr,nBe=ir,rBe=wl,iBe=Bu,sBe=Py,xg=mo,aBe=cd,oBe=Bfe,lBe=im,uBe=Hfe,cBe=Qfe,dBe=Vr,x8=dBe("replace"),fBe=Math.max,hBe=Math.min,pBe=y9([].concat),UO=y9([].push),VB=y9("".indexOf),zB=y9("".slice),mBe=function(t){return t===void 0?t:String(t)},vBe=function(){return"a".replace(/./,"$0")==="$0"}(),kB=function(){return/./[x8]?/./[x8]("a","$0")==="":!1}(),gBe=!eBe(function(){var t=/./;return t.exec=function(){var e=[];return e.groups={a:"7"},e},"".replace(t,"$")!=="7"});$Ye("replace",function(t,e,n){var r=kB?"$":"$0";return[function(s,a){var o=aBe(this),l=rBe(s)?void 0:lBe(s,x8);return l?RB(l,s,o,a):RB(e,xg(o),s,a)},function(i,s){var a=tBe(this),o=xg(i);if(typeof s=="string"&&VB(s,r)===-1&&VB(s,"$<")===-1){var l=n(e,a,o,s);if(l.done)return l.value}var u=nBe(s);u||(s=xg(s));var c=a.global,d;c&&(d=a.unicode,a.lastIndex=0);for(var f=[],h;h=cBe(a,o),!(h===null||(UO(f,h),!c));){var p=xg(h[0]);p===""&&(a.lastIndex=oBe(o,sBe(a.lastIndex),d))}for(var m="",v=0,g=0;g=v&&(m+=zB(o,v,y)+T,v=y+b.length)}return m+zB(o,v)}]},!gBe||!vBe||kB);var T8={exports:{}},_fe=typeof ArrayBuffer<"u"&&typeof DataView<"u",bBe=Rn,yBe=!bBe(function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}),SBe=Yi,xBe=ir,TBe=da,wBe=pq,EBe=yBe,OB=wBe("IE_PROTO"),w8=Object,MBe=w8.prototype,om=EBe?w8.getPrototypeOf:function(t){var e=TBe(t);if(SBe(e,OB))return e[OB];var n=e.constructor;return xBe(n)&&e instanceof n?n.prototype:e instanceof w8?MBe:null},PBe=_fe,Fq=Gr,uo=on,$fe=ir,S9=ei,qp=Yi,jq=sm,RBe=Ey,VBe=$l,E8=po,zBe=eu,kBe=Df,x9=om,Oy=E0,OBe=Vr,IBe=l9,ehe=Fs,the=ehe.enforce,UBe=ehe.get,gP=uo.Int8Array,M8=gP&&gP.prototype,IB=uo.Uint8ClampedArray,UB=IB&&IB.prototype,Kc=gP&&x9(gP),ku=M8&&x9(M8),NBe=Object.prototype,Zq=uo.TypeError,NB=OBe("toStringTag"),P8=IBe("TYPED_ARRAY_TAG"),bP="TypedArrayConstructor",Tf=PBe&&!!Oy&&jq(uo.opera)!=="Opera",nhe=!1,No,Qh,X1,wf={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},Jq={BigInt64Array:8,BigUint64Array:8},LBe=function(e){if(!S9(e))return!1;var n=jq(e);return n==="DataView"||qp(wf,n)||qp(Jq,n)},rhe=function(t){var e=x9(t);if(S9(e)){var n=UBe(e);return n&&qp(n,bP)?n[bP]:rhe(e)}},ihe=function(t){if(!S9(t))return!1;var e=jq(t);return qp(wf,e)||qp(Jq,e)},XBe=function(t){if(ihe(t))return t;throw new Zq("Target is not a typed array")},CBe=function(t){if($fe(t)&&(!Oy||kBe(Kc,t)))return t;throw new Zq(RBe(t)+" is not a typed array constructor")},KBe=function(t,e,n,r){if(Fq){if(n)for(var i in wf){var s=uo[i];if(s&&qp(s.prototype,t))try{delete s.prototype[t]}catch{try{s.prototype[t]=e}catch{}}}(!ku[t]||n)&&E8(ku,t,n?e:Tf&&M8[t]||e,r)}},qBe=function(t,e,n){var r,i;if(Fq){if(Oy){if(n){for(r in wf)if(i=uo[r],i&&qp(i,t))try{delete i[t]}catch{}}if(!Kc[t]||n)try{return E8(Kc,t,n?e:Tf&&Kc[t]||e)}catch{}else return}for(r in wf)i=uo[r],i&&(!i[t]||n)&&E8(i,t,e)}};for(No in wf)Qh=uo[No],X1=Qh&&Qh.prototype,X1?the(X1)[bP]=Qh:Tf=!1;for(No in Jq)Qh=uo[No],X1=Qh&&Qh.prototype,X1&&(the(X1)[bP]=Qh);if((!Tf||!$fe(Kc)||Kc===Function.prototype)&&(Kc=function(){throw new Zq("Incorrect invocation")},Tf))for(No in wf)uo[No]&&Oy(uo[No],Kc);if((!Tf||!ku||ku===NBe)&&(ku=Kc.prototype,Tf))for(No in wf)uo[No]&&Oy(uo[No].prototype,ku);Tf&&x9(UB)!==ku&&Oy(UB,ku);if(Fq&&!qp(ku,NB)){nhe=!0,zBe(ku,NB,{configurable:!0,get:function(){return S9(this)?this[P8]:void 0}});for(No in wf)uo[No]&&VBe(uo[No],P8,No)}var M0={NATIVE_ARRAY_BUFFER_VIEWS:Tf,TYPED_ARRAY_TAG:nhe&&P8,aTypedArray:XBe,aTypedArrayConstructor:CBe,exportTypedArrayMethod:KBe,exportTypedArrayStaticMethod:qBe,getTypedArrayConstructor:rhe,isView:LBe,isTypedArray:ihe,TypedArray:Kc,TypedArrayPrototype:ku},she=on,NO=Rn,DBe=Uq,WBe=M0.NATIVE_ARRAY_BUFFER_VIEWS,ABe=she.ArrayBuffer,Cm=she.Int8Array,Yq=!WBe||!NO(function(){Cm(1)})||!NO(function(){new Cm(-1)})||!DBe(function(t){new Cm,new Cm(null),new Cm(1.5),new Cm(t)},!0)||NO(function(){return new Cm(new ABe(2),1,void 0).length!==1}),GBe=po,Iy=function(t,e,n){for(var r in e)GBe(t,r,e[r],n);return t},FBe=Bu,jBe=Py,ZBe=RangeError,ahe=function(t){if(t===void 0)return 0;var e=FBe(t),n=jBe(e);if(e!==n)throw new ZBe("Wrong length or index");return n},JBe=Math.sign||function(e){var n=+e;return n===0||n!==n?n:n<0?-1:1},YBe=2220446049250313e-31,LB=1/YBe,BBe=function(t){return t+LB-LB},HBe=JBe,QBe=BBe,_Be=Math.abs,$Be=2220446049250313e-31,eHe=function(t,e,n,r){var i=+t,s=_Be(i),a=HBe(i);if(sn||l!==l?a*(1/0):a*l},tHe=eHe,nHe=11920928955078125e-23,rHe=34028234663852886e22,iHe=11754943508222875e-54,ohe=Math.fround||function(e){return tHe(e,nHe,rHe,iHe)},sHe=Array,aHe=Math.abs,Wd=Math.pow,oHe=Math.floor,lHe=Math.log,uHe=Math.LN2,cHe=function(t,e,n){var r=sHe(n),i=n*8-e-1,s=(1<>1,o=e===23?Wd(2,-24)-Wd(2,-77):0,l=t<0||t===0&&1/t<0?1:0,u=0,c,d,f;for(t=aHe(t),t!==t||t===1/0?(d=t!==t?1:0,c=s):(c=oHe(lHe(t)/uHe),f=Wd(2,-c),t*f<1&&(c--,f*=2),c+a>=1?t+=o/f:t+=o*Wd(2,1-a),t*f>=2&&(c++,f/=2),c+a>=s?(d=0,c=s):c+a>=1?(d=(t*f-1)*Wd(2,e),c+=a):(d=t*Wd(2,a-1)*Wd(2,e),c=0));e>=8;)r[u++]=d&255,d/=256,e-=8;for(c=c<0;)r[u++]=c&255,c/=256,i-=8;return r[u-1]|=l*128,r},dHe=function(t,e){var n=t.length,r=n*8-e-1,i=(1<>1,a=r-7,o=n-1,l=t[o--],u=l&127,c;for(l>>=7;a>0;)u=u*256+t[o--],a-=8;for(c=u&(1<<-a)-1,u>>=-a,a+=e;a>0;)c=c*256+t[o--],a-=8;if(u===0)u=1-s;else{if(u===i)return c?NaN:l?-1/0:1/0;c+=Wd(2,e),u-=s}return(l?-1:1)*c*Wd(2,u-e)},fHe={pack:cHe,unpack:dHe},hHe=da,XB=vq,pHe=Ca,mHe=function(e){for(var n=hHe(this),r=pHe(n),i=arguments.length,s=XB(i>1?arguments[1]:void 0,r),a=i>2?arguments[2]:void 0,o=a===void 0?r:XB(a,r);o>s;)n[s++]=e;return n},T9=on,Bq=tn,LO=Gr,vHe=_fe,lhe=fq,gHe=$l,bHe=eu,CB=Iy,XO=Rn,g5=Af,yHe=Bu,SHe=Py,yP=ahe,xHe=ohe,uhe=fHe,THe=om,KB=E0,wHe=mHe,EHe=w0,MHe=g9,PHe=d9,che=am,Hq=Fs,RHe=lhe.PROPER,qB=lhe.CONFIGURABLE,C1="ArrayBuffer",w9="DataView",K1="prototype",VHe="Wrong length",dhe="Wrong index",DB=Hq.getterFor(C1),ux=Hq.getterFor(w9),WB=Hq.set,gu=T9[C1],tl=gu,Tg=tl&&tl[K1],kc=T9[w9],Km=kc&&kc[K1],AB=Object.prototype,zHe=T9.Array,SP=T9.RangeError,kHe=Bq(wHe),OHe=Bq([].reverse),fhe=uhe.pack,GB=uhe.unpack,FB=function(t){return[t&255]},jB=function(t){return[t&255,t>>8&255]},ZB=function(t){return[t&255,t>>8&255,t>>16&255,t>>24&255]},JB=function(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]},IHe=function(t){return fhe(xHe(t),23,4)},UHe=function(t){return fhe(t,52,8)},b5=function(t,e,n){bHe(t[K1],e,{configurable:!0,get:function(){return n(this)[e]}})},dh=function(t,e,n,r){var i=ux(t),s=yP(n),a=!!r;if(s+e>i.byteLength)throw new SP(dhe);var o=i.bytes,l=s+i.byteOffset,u=EHe(o,l,l+e);return a?u:OHe(u)},fh=function(t,e,n,r,i,s){var a=ux(t),o=yP(n),l=r(+i),u=!!s;if(o+e>a.byteLength)throw new SP(dhe);for(var c=a.bytes,d=o+a.byteOffset,f=0;fs)throw new SP("Wrong offset");if(r=r===void 0?s-a:SHe(r),a+r>s)throw new SP(VHe);WB(this,{type:w9,buffer:e,byteLength:r,byteOffset:a,bytes:i.bytes}),LO||(this.buffer=e,this.byteLength=r,this.byteOffset=a)},Km=kc[K1],LO&&(b5(tl,"byteLength",DB),b5(kc,"buffer",ux),b5(kc,"byteLength",ux),b5(kc,"byteOffset",ux)),CB(Km,{getInt8:function(e){return dh(this,1,e)[0]<<24>>24},getUint8:function(e){return dh(this,1,e)[0]},getInt16:function(e){var n=dh(this,2,e,arguments.length>1?arguments[1]:!1);return(n[1]<<8|n[0])<<16>>16},getUint16:function(e){var n=dh(this,2,e,arguments.length>1?arguments[1]:!1);return n[1]<<8|n[0]},getInt32:function(e){return JB(dh(this,4,e,arguments.length>1?arguments[1]:!1))},getUint32:function(e){return JB(dh(this,4,e,arguments.length>1?arguments[1]:!1))>>>0},getFloat32:function(e){return GB(dh(this,4,e,arguments.length>1?arguments[1]:!1),23)},getFloat64:function(e){return GB(dh(this,8,e,arguments.length>1?arguments[1]:!1),52)},setInt8:function(e,n){fh(this,1,e,FB,n)},setUint8:function(e,n){fh(this,1,e,FB,n)},setInt16:function(e,n){fh(this,2,e,jB,n,arguments.length>2?arguments[2]:!1)},setUint16:function(e,n){fh(this,2,e,jB,n,arguments.length>2?arguments[2]:!1)},setInt32:function(e,n){fh(this,4,e,ZB,n,arguments.length>2?arguments[2]:!1)},setUint32:function(e,n){fh(this,4,e,ZB,n,arguments.length>2?arguments[2]:!1)},setFloat32:function(e,n){fh(this,4,e,IHe,n,arguments.length>2?arguments[2]:!1)},setFloat64:function(e,n){fh(this,8,e,UHe,n,arguments.length>2?arguments[2]:!1)}});else{var YB=RHe&&gu.name!==C1;!XO(function(){gu(1)})||!XO(function(){new gu(-1)})||XO(function(){return new gu,new gu(1.5),new gu(NaN),gu.length!==1||YB&&!qB})?(tl=function(e){return g5(this,Tg),MHe(new gu(yP(e)),this,tl)},tl[K1]=Tg,Tg.constructor=tl,PHe(tl,gu)):YB&&qB&&gHe(gu,"name",C1),KB&&THe(Km)!==AB&&KB(Km,AB);var y5=new kc(new tl(2)),BB=Bq(Km.setInt8);y5.setInt8(0,2147483648),y5.setInt8(1,2147483649),(y5.getInt8(0)||!y5.getInt8(1))&&CB(Km,{setInt8:function(e,n){BB(this,e,n<<24>>24)},setUint8:function(e,n){BB(this,e,n<<24>>24)}},{unsafe:!0})}che(tl,C1);che(kc,w9);var NHe={ArrayBuffer:tl,DataView:kc},LHe=ei,XHe=Math.floor,CHe=Number.isInteger||function(e){return!LHe(e)&&isFinite(e)&&XHe(e)===e},KHe=Bu,qHe=RangeError,DHe=function(t){var e=KHe(t);if(e<0)throw new qHe("The argument can't be less than 0");return e},WHe=DHe,AHe=RangeError,hhe=function(t,e){var n=WHe(t);if(n%e)throw new AHe("Wrong offset");return n},GHe=Math.round,FHe=function(t){var e=GHe(t);return e<0?0:e>255?255:e&255},jHe=sm,ZHe=function(t){var e=jHe(t);return e==="BigInt64Array"||e==="BigUint64Array"},JHe=Ude,YHe=TypeError,BHe=function(t){var e=JHe(t,"number");if(typeof e=="number")throw new YHe("Can't convert number to bigint");return BigInt(e)},HHe=Vi,QHe=Vn,_He=dfe,$He=da,eQe=Ca,tQe=CT,nQe=XT,rQe=Pq,iQe=ZHe,sQe=M0.aTypedArrayConstructor,aQe=BHe,phe=function(e){var n=_He(this),r=$He(e),i=arguments.length,s=i>1?arguments[1]:void 0,a=s!==void 0,o=nQe(r),l,u,c,d,f,h,p,m;if(o&&!rQe(o))for(p=tQe(r,o),m=p.next,r=[];!(h=QHe(m,p)).done;)r.push(h.value);for(a&&i>2&&(s=HHe(s,arguments[2])),u=eQe(r),c=new(sQe(n))(u),d=iQe(c),l=0;u>l;l++)f=a?s(r[l],l):r[l],c[l]=d?aQe(f):+f;return c},oQe=Vi,lQe=tn,uQe=a9,cQe=da,dQe=Ca,fQe=xq,HB=lQe([].push),hh=function(t){var e=t===1,n=t===2,r=t===3,i=t===4,s=t===6,a=t===7,o=t===5||s;return function(l,u,c,d){for(var f=cQe(l),h=uQe(f),p=dQe(h),m=oQe(u,c),v=0,g=d||fQe,b=e?g(l,p):n||a?g(l,0):void 0,y,x;p>v;v++)if((o||v in h)&&(y=h[v],x=m(y,v,f),t))if(e)b[v]=x;else if(x)switch(t){case 3:return!0;case 5:return y;case 6:return v;case 2:HB(b,y)}else switch(t){case 4:return!1;case 7:HB(b,y)}return s?-1:r||i?i:b}},mhe={forEach:hh(0),map:hh(1),filter:hh(2),some:hh(3),every:hh(4),find:hh(5),findIndex:hh(6),filterReject:hh(7)},hQe=Ca,pQe=function(t,e,n){for(var r=0,i=arguments.length>2?n:hQe(e),s=new t(i);i>r;)s[r]=e[r++];return s},QB=rt,vhe=on,_B=Vn,mQe=Gr,vQe=Yq,FT=M0,ghe=NHe,$B=Af,gQe=rm,US=$l,bQe=CHe,yQe=Py,eH=ahe,CO=hhe,SQe=FHe,bhe=cq,NS=Yi,xQe=sm,R8=ei,TQe=oq,wQe=dd,EQe=Df,S5=E0,MQe=My.f,tH=phe,PQe=mhe.forEach,RQe=KT,VQe=eu,yhe=ho,She=IT,nH=pQe,Qq=Fs,zQe=g9,V8=Qq.get,kQe=Qq.set,OQe=Qq.enforce,xhe=yhe.f,IQe=She.f,KO=vhe.RangeError,The=ghe.ArrayBuffer,UQe=The.prototype,NQe=ghe.DataView,x5=FT.NATIVE_ARRAY_BUFFER_VIEWS,rH=FT.TYPED_ARRAY_TAG,iH=FT.TypedArray,LS=FT.TypedArrayPrototype,z8=FT.isTypedArray,T5="BYTES_PER_ELEMENT",qO="Wrong length",w5=function(t,e){VQe(t,e,{configurable:!0,get:function(){return V8(this)[e]}})},sH=function(t){var e;return EQe(UQe,t)||(e=xQe(t))==="ArrayBuffer"||e==="SharedArrayBuffer"},whe=function(t,e){return z8(t)&&!TQe(e)&&e in t&&bQe(+e)&&e>=0},aH=function(e,n){return n=bhe(n),whe(e,n)?gQe(2,e[n]):IQe(e,n)},oH=function(e,n,r){return n=bhe(n),whe(e,n)&&R8(r)&&NS(r,"value")&&!NS(r,"get")&&!NS(r,"set")&&!r.configurable&&(!NS(r,"writable")||r.writable)&&(!NS(r,"enumerable")||r.enumerable)?(e[n]=r.value,e):xhe(e,n,r)};mQe?(x5||(She.f=aH,yhe.f=oH,w5(LS,"buffer"),w5(LS,"byteOffset"),w5(LS,"byteLength"),w5(LS,"length")),QB({target:"Object",stat:!0,forced:!x5},{getOwnPropertyDescriptor:aH,defineProperty:oH}),T8.exports=function(t,e,n){var r=t.match(/\d+/)[0]/8,i=t+(n?"Clamped":"")+"Array",s="get"+t,a="set"+t,o=vhe[i],l=o,u=l&&l.prototype,c={},d=function(m,v){var g=V8(m);return g.view[s](v*r+g.byteOffset,!0)},f=function(m,v,g){var b=V8(m);b.view[a](v*r+b.byteOffset,n?SQe(g):g,!0)},h=function(m,v){xhe(m,v,{get:function(){return d(this,v)},set:function(g){return f(this,v,g)},enumerable:!0})};x5?vQe&&(l=e(function(m,v,g,b){return $B(m,u),zQe(function(){return R8(v)?sH(v)?b!==void 0?new o(v,CO(g,r),b):g!==void 0?new o(v,CO(g,r)):new o(v):z8(v)?nH(l,v):_B(tH,l,v):new o(eH(v))}(),m,l)}),S5&&S5(l,iH),PQe(MQe(o),function(m){m in l||US(l,m,o[m])}),l.prototype=u):(l=e(function(m,v,g,b){$B(m,u);var y=0,x=0,T,M,E;if(!R8(v))E=eH(v),M=E*r,T=new The(M);else if(sH(v)){T=v,x=CO(g,r);var S=v.byteLength;if(b===void 0){if(S%r)throw new KO(qO);if(M=S-x,M<0)throw new KO(qO)}else if(M=yQe(b)*r,M+x>S)throw new KO(qO);E=M/r}else return z8(v)?nH(l,v):_B(tH,l,v);for(kQe(m,{buffer:T,byteOffset:x,byteLength:M,length:E,view:new NQe(T)});ye;)r[e]=arguments[e++];return r},JQe);var Mhe=on,Phe=Vn,_q=M0,HQe=Ca,QQe=hhe,_Qe=da,Rhe=Rn,$Qe=Mhe.RangeError,k8=Mhe.Int8Array,lH=k8&&k8.prototype,Vhe=lH&&lH.set,e_e=_q.aTypedArray,t_e=_q.exportTypedArrayMethod,O8=!Rhe(function(){var t=new Uint8ClampedArray(2);return Phe(Vhe,t,{length:1,0:3},1),t[1]!==3}),n_e=O8&&_q.NATIVE_ARRAY_BUFFER_VIEWS&&Rhe(function(){var t=new k8(2);return t.set(1),t.set("2",1),t[0]!==0||t[1]!==2});t_e("set",function(e){e_e(this);var n=QQe(arguments.length>1?arguments[1]:void 0,1),r=_Qe(e);if(O8)return Phe(Vhe,this,r,n);var i=this.length,s=HQe(r),a=0;if(s+n>i)throw new $Qe("Wrong length");for(;a0&&1/n<0?1:-1:e>n}};u_e("sort",function(e){return e!==void 0&&s_e(e),fH?q1(this,e):a_e(l_e(this),d_e(e))},!fH||c_e);var f_e=ei,h_e=$l,p_e=function(t,e){f_e(e)&&"cause"in e&&h_e(t,"cause",e.cause)},m_e=tn,khe=Error,v_e=m_e("".replace),g_e=function(t){return String(new khe(t).stack)}("zxcasd"),Ohe=/\n\s*at [^:]*:[^\n]*/,b_e=Ohe.test(g_e),y_e=function(t,e){if(b_e&&typeof t=="string"&&!khe.prepareStackTrace)for(;e--;)t=v_e(t,Ohe,"");return t},S_e=Rn,x_e=rm,T_e=!S_e(function(){var t=new Error("a");return"stack"in t?(Object.defineProperty(t,"stack",x_e(1,7)),t.stack!==7):!0}),w_e=$l,E_e=y_e,M_e=T_e,hH=Error.captureStackTrace,P_e=function(t,e,n,r){M_e&&(hH?hH(t,e):w_e(t,"stack",E_e(n,r)))},R_e=mo,V_e=function(t,e){return t===void 0?arguments.length<2?"":e:R_e(t)},z_e=rt,k_e=Df,O_e=om,xP=E0,I_e=d9,Ihe=dd,DO=$l,WO=rm,U_e=p_e,N_e=P_e,L_e=Zo,X_e=V_e,C_e=Vr,K_e=C_e("toStringTag"),TP=Error,q_e=[].push,Vb=function(e,n){var r=k_e(AO,this),i;xP?i=xP(new TP,r?O_e(this):AO):(i=r?this:Ihe(AO),DO(i,K_e,"Error")),n!==void 0&&DO(i,"message",X_e(n)),N_e(i,Vb,i.stack,1),arguments.length>2&&U_e(i,arguments[2]);var s=[];return L_e(e,q_e,{that:s}),DO(i,"errors",s),i};xP?xP(Vb,TP):I_e(Vb,TP,{name:!0});var AO=Vb.prototype=Ihe(TP.prototype,{constructor:WO(1,Vb),message:WO(1,""),name:WO(1,"AggregateError")});z_e({global:!0,constructor:!0,arity:2},{AggregateError:Vb});var D_e=Gr,W_e=Ry,A_e=da,G_e=Ca,F_e=eu;D_e&&(F_e(Array.prototype,"lastIndex",{configurable:!0,get:function(){var e=A_e(this),n=G_e(e);return n===0?0:n-1}}),W_e("lastIndex"));var j_e=Gr,Z_e=Ry,pH=da,mH=Ca,J_e=eu;j_e&&(J_e(Array.prototype,"lastItem",{configurable:!0,get:function(){var e=pH(this),n=mH(e);return n===0?void 0:e[n-1]},set:function(e){var n=pH(this),r=mH(n);return n[r===0?0:r-1]=e}}),Z_e("lastItem"));var Uhe={exports:{}},Nhe={},Y_e=ud,B_e=Ty,Lhe=My.f,H_e=w0,Xhe=typeof window=="object"&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],Q_e=function(t){try{return Lhe(t)}catch{return H_e(Xhe)}};Nhe.f=function(e){return Xhe&&Y_e(e)==="Window"?Q_e(e):Lhe(B_e(e))};var __e=Rn,$_e=__e(function(){if(typeof ArrayBuffer=="function"){var t=new ArrayBuffer(8);Object.isExtensible(t)&&Object.defineProperty(t,"a",{value:8})}}),e$e=Rn,t$e=ei,n$e=ud,vH=$_e,I7=Object.isExtensible,r$e=e$e(function(){I7(1)}),i$e=r$e||vH?function(e){return!t$e(e)||vH&&n$e(e)==="ArrayBuffer"?!1:I7?I7(e):!0}:I7,s$e=Rn,Che=!s$e(function(){return Object.isExtensible(Object.preventExtensions({}))}),a$e=rt,o$e=tn,l$e=c9,u$e=ei,$q=Yi,c$e=ho.f,gH=My,d$e=Nhe,eD=i$e,f$e=l9,h$e=Che,Khe=!1,Ef=f$e("meta"),p$e=0,tD=function(t){c$e(t,Ef,{value:{objectID:"O"+p$e++,weakData:{}}})},m$e=function(t,e){if(!u$e(t))return typeof t=="symbol"?t:(typeof t=="string"?"S":"P")+t;if(!$q(t,Ef)){if(!eD(t))return"F";if(!e)return"E";tD(t)}return t[Ef].objectID},v$e=function(t,e){if(!$q(t,Ef)){if(!eD(t))return!0;if(!e)return!1;tD(t)}return t[Ef].weakData},g$e=function(t){return h$e&&Khe&&eD(t)&&!$q(t,Ef)&&tD(t),t},b$e=function(){y$e.enable=function(){},Khe=!0;var t=gH.f,e=o$e([].splice),n={};n[Ef]=1,t(n).length&&(gH.f=function(r){for(var i=t(r),s=0,a=i.length;s1?arguments[1]:void 0),h;h=h?h.next:d.first;)for(f(h.value,h.key,this);h&&h.removed;)h=h.previous},has:function(c){return!!l(this,c)}}),PH(s,n?{get:function(c){var d=l(this,c);return d&&d.value},set:function(c,d){return o(this,c===0?0:c,d)}}:{add:function(c){return o(this,c=c===0?0:c,c)}}),KS&&tet(s,"size",{configurable:!0,get:function(){return a(this).size}}),i},setStrong:function(t,e,n){var r=e+" Iterator",i=YO(e),s=YO(r);aet(t,e,function(a,o){VH(this,{type:r,target:a,state:i(a),kind:o,last:null})},function(){for(var a=s(this),o=a.kind,l=a.last;l&&l.removed;)l=l.previous;return!a.target||!(a.last=l=l?l.next:a.state.first)?(a.target=null,M5(void 0,!0)):M5(o==="keys"?l.key:o==="values"?l.value:[l.key,l.value],!1)},n?"entries":"values",!n,!0),oet(e)}},cet=qhe,det=uet;cet("Map",function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},det);var fet=tn,zH=Iy,P5=E9.getWeakData,het=Af,pet=dr,met=wl,BO=ei,vet=Zo,jhe=mhe,kH=Yi,Zhe=Fs,get=Zhe.set,bet=Zhe.getterFor,yet=jhe.find,xet=jhe.findIndex,Tet=fet([].splice),wet=0,R5=function(t){return t.frozen||(t.frozen=new Jhe)},Jhe=function(){this.entries=[]},HO=function(t,e){return yet(t.entries,function(n){return n[0]===e})};Jhe.prototype={get:function(t){var e=HO(this,t);if(e)return e[1]},has:function(t){return!!HO(this,t)},set:function(t,e){var n=HO(this,t);n?n[1]=e:this.entries.push([t,e])},delete:function(t){var e=xet(this.entries,function(n){return n[0]===t});return~e&&Tet(this.entries,e,1),!!~e}};var Eet={getConstructor:function(t,e,n,r){var i=t(function(l,u){het(l,s),get(l,{type:e,id:wet++,frozen:null}),met(u)||vet(u,l[r],{that:l,AS_ENTRIES:n})}),s=i.prototype,a=bet(e),o=function(l,u,c){var d=a(l),f=P5(pet(u),!0);return f===!0?R5(d).set(u,c):f[d.id]=c,l};return zH(s,{delete:function(l){var u=a(this);if(!BO(l))return!1;var c=P5(l);return c===!0?R5(u).delete(l):c&&kH(c,u.id)&&delete c[u.id]},has:function(u){var c=a(this);if(!BO(u))return!1;var d=P5(u);return d===!0?R5(c).has(u):d&&kH(d,c.id)}}),zH(s,n?{get:function(u){var c=a(this);if(BO(u)){var d=P5(u);if(d===!0)return R5(c).get(u);if(d)return d[c.id]}},set:function(u,c){return o(this,u,c)}}:{add:function(u){return o(this,u,!0)}}),i}},Met=Che,OH=on,U7=tn,IH=Iy,Pet=E9,Ret=qhe,Yhe=Eet,V5=ei,z5=Fs.enforce,Vet=Rn,zet=Kde,ZT=Object,ket=Array.isArray,k5=ZT.isExtensible,Bhe=ZT.isFrozen,Oet=ZT.isSealed,Hhe=ZT.freeze,Iet=ZT.seal,Uet=!OH.ActiveXObject&&"ActiveXObject"in OH,qS,Qhe=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},_he=Ret("WeakMap",Qhe,Yhe),Yg=_he.prototype,N7=U7(Yg.set),Net=function(){return Met&&Vet(function(){var t=Hhe([]);return N7(new _he,t,1),!Bhe(t)})};if(zet)if(Uet){qS=Yhe.getConstructor(Qhe,"WeakMap",!0),Pet.enable();var UH=U7(Yg.delete),O5=U7(Yg.has),NH=U7(Yg.get);IH(Yg,{delete:function(t){if(V5(t)&&!k5(t)){var e=z5(this);return e.frozen||(e.frozen=new qS),UH(this,t)||e.frozen.delete(t)}return UH(this,t)},has:function(e){if(V5(e)&&!k5(e)){var n=z5(this);return n.frozen||(n.frozen=new qS),O5(this,e)||n.frozen.has(e)}return O5(this,e)},get:function(e){if(V5(e)&&!k5(e)){var n=z5(this);return n.frozen||(n.frozen=new qS),O5(this,e)?NH(this,e):n.frozen.get(e)}return NH(this,e)},set:function(e,n){if(V5(e)&&!k5(e)){var r=z5(this);r.frozen||(r.frozen=new qS),O5(this,e)?N7(this,e,n):r.frozen.set(e,n)}else N7(this,e,n);return this}})}else Net()&&IH(Yg,{set:function(e,n){var r;return ket(e)&&(Bhe(e)?r=Hhe:Oet(e)&&(r=Iet)),N7(this,e,n),r&&r(e),this}});var $he=ca,Let=dd,LH=ei,Xet=Object,Cet=TypeError,Ket=$he("Map"),qet=$he("WeakMap"),wP=function(){this.object=null,this.symbol=null,this.primitives=null,this.objectsByIndex=Let(null)};wP.prototype.get=function(t,e){return this[t]||(this[t]=e())};wP.prototype.next=function(t,e,n){var r=n?this.objectsByIndex[t]||(this.objectsByIndex[t]=new qet):this.primitives||(this.primitives=new Ket),i=r.get(e);return i||r.set(e,i=new wP),i};var XH=new wP,epe=function(){var t=XH,e=arguments.length,n,r;for(n=0;n1?arguments[1]:void 0);return ltt(n,function(i,s){if(!r(i,s,n))return!1},!0)!==!1}});var utt=rt,ctt=Vi,dtt=Ml,spe=El,ftt=Hu,htt=spe.Map,ptt=spe.set;utt({target:"Map",proto:!0,real:!0,forced:!0},{filter:function(e){var n=dtt(this),r=ctt(e,arguments.length>1?arguments[1]:void 0),i=new htt;return ftt(n,function(s,a){r(s,a,n)&&ptt(i,a,s)}),i}});var mtt=rt,vtt=Vi,gtt=Ml,btt=Hu;mtt({target:"Map",proto:!0,real:!0,forced:!0},{find:function(e){var n=gtt(this),r=vtt(e,arguments.length>1?arguments[1]:void 0),i=btt(n,function(s,a){if(r(s,a,n))return{value:s}},!0);return i&&i.value}});var ytt=rt,Stt=Vi,xtt=Ml,Ttt=Hu;ytt({target:"Map",proto:!0,real:!0,forced:!0},{findKey:function(e){var n=xtt(this),r=Stt(e,arguments.length>1?arguments[1]:void 0),i=Ttt(n,function(s,a){if(r(s,a,n))return{key:a}},!0);return i&&i.key}});var wtt=Vi,Ett=dr,Mtt=da,Ptt=Zo,M9=function(t,e,n){return function(i){var s=Mtt(i),a=arguments.length,o=a>1?arguments[1]:void 0,l=o!==void 0,u=l?wtt(o,a>2?arguments[2]:void 0):void 0,c=new t,d=0;return Ptt(s,function(f){var h=l?u(f,d++):f;n?e(c,Ett(h)[0],h[1]):e(c,h)}),c}},Rtt=rt,qH=El,Vtt=M9;Rtt({target:"Map",stat:!0,forced:!0},{from:Vtt(qH.Map,qH.set,!0)});var ztt=rt,ktt=tn,Ott=yi,Itt=cd,Utt=Zo,P9=El,Ntt=Rn,ape=P9.Map,Ltt=P9.has,Xtt=P9.get,Ctt=P9.set,Ktt=ktt([].push),qtt=Ntt(function(){return ape.groupBy("ab",function(t){return t}).get("a").length!==1});ztt({target:"Map",stat:!0,forced:qtt},{groupBy:function(e,n){Itt(e),Ott(n);var r=new ape,i=0;return Utt(e,function(s){var a=n(s,i++);Ltt(r,a)?Ktt(Xtt(r,a),s):Ctt(r,a,[s])}),r}});var Dtt=function(t,e){return t===e||t!==t&&e!==e},Wtt=rt,Att=Dtt,Gtt=Ml,Ftt=Hu;Wtt({target:"Map",proto:!0,real:!0,forced:!0},{includes:function(e){return Ftt(Gtt(this),function(n){if(Att(n,e))return!0},!0)===!0}});var jtt=rt,Ztt=Vn,Jtt=Zo,Ytt=ir,DH=yi,Btt=El.Map;jtt({target:"Map",stat:!0,forced:!0},{keyBy:function(e,n){var r=Ytt(this)?this:Btt,i=new r;DH(n);var s=DH(i.set);return Jtt(e,function(a){Ztt(s,i,n(a),a)}),i}});var Htt=rt,Qtt=Ml,_tt=Hu;Htt({target:"Map",proto:!0,real:!0,forced:!0},{keyOf:function(e){var n=_tt(Qtt(this),function(r,i){if(r===e)return{key:i}},!0);return n&&n.key}});var $tt=rt,ent=Vi,tnt=Ml,ope=El,nnt=Hu,rnt=ope.Map,int=ope.set;$tt({target:"Map",proto:!0,real:!0,forced:!0},{mapKeys:function(e){var n=tnt(this),r=ent(e,arguments.length>1?arguments[1]:void 0),i=new rnt;return nnt(n,function(s,a){int(i,r(s,a,n),s)}),i}});var snt=rt,ant=Vi,ont=Ml,lpe=El,lnt=Hu,unt=lpe.Map,cnt=lpe.set;snt({target:"Map",proto:!0,real:!0,forced:!0},{mapValues:function(e){var n=ont(this),r=ant(e,arguments.length>1?arguments[1]:void 0),i=new unt;return lnt(n,function(s,a){cnt(i,a,r(s,a,n))}),i}});var dnt=rt,fnt=Ml,hnt=Zo,pnt=El.set;dnt({target:"Map",proto:!0,real:!0,arity:1,forced:!0},{merge:function(e){for(var n=fnt(this),r=arguments.length,i=0;i1?arguments[1]:void 0);return Pnt(n,function(i,s){if(r(i,s,n))return!0},!0)===!0}});var Rnt=rt,AH=yi,Vnt=Ml,rD=El,znt=TypeError,knt=rD.get,Ont=rD.has,Int=rD.set;Rnt({target:"Map",proto:!0,real:!0,forced:!0},{update:function(e,n){var r=Vnt(this),i=arguments.length;AH(n);var s=Ont(r,e);if(!s&&i<3)throw new znt("Updating absent value");var a=s?knt(r,e):AH(i>2?arguments[2]:void 0)(e,r);return Int(r,e,n(a,e,r)),r}});var Unt=rt,Nnt=Math.min,Lnt=Math.max;Unt({target:"Math",stat:!0,forced:!0},{clamp:function(e,n,r){return Nnt(r,Lnt(n,e))}});var Xnt=rt;Xnt({target:"Math",stat:!0,nonConfigurable:!0,nonWritable:!0},{DEG_PER_RAD:Math.PI/180});var Cnt=rt,Knt=180/Math.PI;Cnt({target:"Math",stat:!0,forced:!0},{degrees:function(e){return e*Knt}});var upe=function(e,n,r,i,s){var a=+e,o=+n,l=+r,u=+i,c=+s;return a!==a||o!==o||l!==l||u!==u||c!==c?NaN:a===1/0||a===-1/0?a:(a-o)*(c-u)/(l-o)+u},qnt=rt,Dnt=upe,Wnt=ohe;qnt({target:"Math",stat:!0,forced:!0},{fscale:function(e,n,r,i,s){return Wnt(Dnt(e,n,r,i,s))}});var Ant=rt;Ant({target:"Math",stat:!0,forced:!0},{iaddh:function(e,n,r,i){var s=e>>>0,a=n>>>0,o=r>>>0;return a+(i>>>0)+((s&o|(s|o)&~(s+o>>>0))>>>31)|0}});var Gnt=rt;Gnt({target:"Math",stat:!0,forced:!0},{imulh:function(e,n){var r=65535,i=+e,s=+n,a=i&r,o=s&r,l=i>>16,u=s>>16,c=(l*o>>>0)+(a*o>>>16);return l*u+(c>>16)+((a*u>>>0)+(c&r)>>16)}});var Fnt=rt;Fnt({target:"Math",stat:!0,forced:!0},{isubh:function(e,n,r,i){var s=e>>>0,a=n>>>0,o=r>>>0;return a-(i>>>0)-((~s&o|~(s^o)&s-o>>>0)>>>31)|0}});var jnt=rt;jnt({target:"Math",stat:!0,nonConfigurable:!0,nonWritable:!0},{RAD_PER_DEG:180/Math.PI});var Znt=rt,Jnt=Math.PI/180;Znt({target:"Math",stat:!0,forced:!0},{radians:function(e){return e*Jnt}});var Ynt=rt,Bnt=upe;Ynt({target:"Math",stat:!0,forced:!0},{scale:Bnt});var Hnt=on,Qnt=Hnt.isFinite,_nt=Number.isFinite||function(e){return typeof e=="number"&&Qnt(e)},$nt=rt,ert=dr,trt=_nt,nrt=jT,rrt=P0,cpe=Fs,dpe="Seeded Random",fpe=dpe+" Generator",irt='Math.seededPRNG() argument should have a "seed" field with a finite value.',srt=cpe.set,art=cpe.getterFor(fpe),ort=TypeError,lrt=nrt(function(e){srt(this,{type:fpe,seed:e%2147483647})},dpe,function(){var e=art(this),n=e.seed=(e.seed*1103515245+12345)%2147483647;return rrt((n&1073741823)/1073741823,!1)});$nt({target:"Math",stat:!0,forced:!0},{seededPRNG:function(e){var n=ert(e).seed;if(!trt(n))throw new ort(irt);return new lrt(n)}});var urt=rt;urt({target:"Math",stat:!0,forced:!0},{signbit:function(e){var n=+e;return n===n&&n===0?1/n===-1/0:n<0}});var crt=rt;crt({target:"Math",stat:!0,forced:!0},{umulh:function(e,n){var r=65535,i=+e,s=+n,a=i&r,o=s&r,l=i>>>16,u=s>>>16,c=(l*o>>>0)+(a*o>>>16);return l*u+(c>>>16)+((a*u>>>0)+(c&r)>>>16)}});var drt=rt,JT=tn,frt=Bu,WS="Invalid number representation",hrt="Invalid radix",prt=RangeError,U5=SyntaxError,mrt=TypeError,GH=parseInt,vrt=Math.pow,hpe=/^[\d.a-z]+$/,grt=JT("".charAt),brt=JT(hpe.exec),yrt=JT(1 .toString),Srt=JT("".slice),xrt=JT("".split);drt({target:"Number",stat:!0,forced:!0},{fromString:function(e,n){var r=1;if(typeof e!="string")throw new mrt(WS);if(!e.length)throw new U5(WS);if(grt(e,0)==="-"&&(r=-1,e=Srt(e,1),!e.length))throw new U5(WS);var i=n===void 0?10:frt(n);if(i<2||i>36)throw new prt(hrt);if(!brt(hpe,e))throw new U5(WS);var s=xrt(e,"."),a=GH(s[0],i);if(s.length>1&&(a+=GH(s[1],i)/vrt(i,s[1].length)),i===10&&yrt(a,i)!==e)throw new U5(WS);return r*a}});var Trt=rt,L7=Vn,YT=Gr,wrt=KT,ppe=yi,Ert=dr,Mrt=Af,mpe=ir,Prt=wl,Rrt=ei,X7=im,Vrt=po,iD=Iy,vpe=eu,v1=yfe,zrt=Vr,gpe=Fs,krt=zrt("observable"),sD="Observable",bpe="Subscription",ype="SubscriptionObserver",aD=gpe.getterFor,oD=gpe.set,Ort=aD(sD),Spe=aD(bpe),C7=aD(ype),xpe=function(t){this.observer=Ert(t),this.cleanup=null,this.subscriptionObserver=null};xpe.prototype={type:bpe,clean:function(){var t=this.cleanup;if(t){this.cleanup=null;try{t()}catch(e){v1(e)}}},close:function(){if(!YT){var t=this.facade,e=this.subscriptionObserver;t.closed=!0,e&&(e.closed=!0)}this.observer=null},isClosed:function(){return this.observer===null}};var lD=function(t,e){var n=oD(this,new xpe(t)),r;YT||(this.closed=!1);try{(r=X7(t,"start"))&&L7(r,t,this)}catch(o){v1(o)}if(!n.isClosed()){var i=n.subscriptionObserver=new uD(n);try{var s=e(i),a=s;Prt(s)||(n.cleanup=mpe(s.unsubscribe)?function(){a.unsubscribe()}:ppe(s))}catch(o){i.error(o);return}n.isClosed()&&n.clean()}};lD.prototype=iD({},{unsubscribe:function(){var e=Spe(this);e.isClosed()||(e.close(),e.clean())}});YT&&vpe(lD.prototype,"closed",{configurable:!0,get:function(){return Spe(this).isClosed()}});var uD=function(t){oD(this,{type:ype,subscriptionState:t}),YT||(this.closed=!1)};uD.prototype=iD({},{next:function(e){var n=C7(this).subscriptionState;if(!n.isClosed()){var r=n.observer;try{var i=X7(r,"next");i&&L7(i,r,e)}catch(s){v1(s)}}},error:function(e){var n=C7(this).subscriptionState;if(!n.isClosed()){var r=n.observer;n.close();try{var i=X7(r,"error");i?L7(i,r,e):v1(e)}catch(s){v1(s)}n.clean()}},complete:function(){var e=C7(this).subscriptionState;if(!e.isClosed()){var n=e.observer;e.close();try{var r=X7(n,"complete");r&&L7(r,n)}catch(i){v1(i)}e.clean()}}});YT&&vpe(uD.prototype,"closed",{configurable:!0,get:function(){return C7(this).subscriptionState.isClosed()}});var Tpe=function(e){Mrt(this,cD),oD(this,{type:sD,subscriber:ppe(e)})},cD=Tpe.prototype;iD(cD,{subscribe:function(e){var n=arguments.length;return new lD(mpe(e)?{next:e,error:n>1?arguments[1]:void 0,complete:n>2?arguments[2]:void 0}:Rrt(e)?e:{},Ort(this).subscriber)}});Vrt(cD,krt,function(){return this});Trt({global:!0,constructor:!0,forced:!0},{Observable:Tpe});wrt(sD);var Irt=rt,Urt=ca,Nrt=Vn,FH=dr,Lrt=NT,Xrt=CT,Crt=im,Krt=Zo,qrt=Vr,Drt=qrt("observable");Irt({target:"Observable",stat:!0,forced:!0},{from:function(e){var n=Lrt(this)?this:Urt("Observable"),r=Crt(FH(e),Drt);if(r){var i=FH(Nrt(r,e));return i.constructor===n?i:new n(function(a){return i.subscribe(a)})}var s=Xrt(e);return new n(function(a){Krt(s,function(o,l){if(a.next(o),a.closed)return l()},{IS_ITERATOR:!0,INTERRUPTED:!0}),a.complete()})}});var Wrt=rt,wpe=ca,Art=NT,Grt=wpe("Array");Wrt({target:"Observable",stat:!0,forced:!0},{of:function(){for(var e=Art(this)?this:wpe("Observable"),n=arguments.length,r=Grt(n),i=0;i1?lit(arguments,1):[],n=uit.f(this),r=Epe(function(){return oit(cit(t),void 0,e)});return(r.error?n.reject:n.resolve)(r.value),n.promise}});var Mpe=ca,fit=tn,hit=o9,JH=Mpe("Map"),pit=Mpe("WeakMap"),mit=fit([].push),YH=hit("metadata"),N8=YH.store||(YH.store=new pit),BT=function(t,e,n){var r=N8.get(t);if(!r){if(!n)return;N8.set(t,r=new JH)}var i=r.get(e);if(!i){if(!n)return;r.set(e,i=new JH)}return i},vit=function(t,e,n){var r=BT(e,n,!1);return r===void 0?!1:r.has(t)},git=function(t,e,n){var r=BT(e,n,!1);return r===void 0?void 0:r.get(t)},bit=function(t,e,n,r){BT(n,r,!0).set(t,e)},yit=function(t,e){var n=BT(t,e,!1),r=[];return n&&n.forEach(function(i,s){mit(r,s)}),r},Sit=function(t){return t===void 0||typeof t=="symbol"?t:String(t)},jf={store:N8,getMap:BT,has:vit,get:git,set:bit,keys:yit,toKey:Sit},xit=rt,Ppe=jf,Tit=dr,wit=Ppe.toKey,Eit=Ppe.set;xit({target:"Reflect",stat:!0},{defineMetadata:function(e,n,r){var i=arguments.length<4?void 0:wit(arguments[3]);Eit(e,n,Tit(r),i)}});var Mit=rt,dD=jf,Pit=dr,Rit=dD.toKey,Vit=dD.getMap,BH=dD.store;Mit({target:"Reflect",stat:!0},{deleteMetadata:function(e,n){var r=arguments.length<3?void 0:Rit(arguments[2]),i=Vit(Pit(n),r,!1);if(i===void 0||!i.delete(e))return!1;if(i.size)return!0;var s=BH.get(n);return s.delete(r),!!s.size||BH.delete(n)}});var zit=rt,fD=jf,kit=dr,Oit=om,Iit=fD.has,Uit=fD.get,Nit=fD.toKey,Rpe=function(t,e,n){var r=Iit(t,e,n);if(r)return Uit(t,e,n);var i=Oit(e);return i!==null?Rpe(t,i,n):void 0};zit({target:"Reflect",stat:!0},{getMetadata:function(e,n){var r=arguments.length<3?void 0:Nit(arguments[2]);return Rpe(e,kit(n),r)}});var Lit=tn,Xit=yi,Cit=wl,Kit=Ca,qit=da,hD=El,Dit=Hu,Wit=hD.Map,Ait=hD.has,Git=hD.set,Fit=Lit([].push),jit=function(e){var n=qit(this),r=Kit(n),i=[],s=new Wit,a=Cit(e)?function(c){return c}:Xit(e),o,l,u;for(o=0;o1?arguments[1]:void 0);return gat(n,function(i){if(!r(i,i,n))return!1},!0)!==!1}});var bat=rt,yat=Vi,Sat=qa,jpe=Ka,xat=tu,Tat=jpe.Set,wat=jpe.add;bat({target:"Set",proto:!0,real:!0,forced:!0},{filter:function(e){var n=Sat(this),r=yat(e,arguments.length>1?arguments[1]:void 0),i=new Tat;return xat(n,function(s){r(s,s,n)&&wat(i,s)}),i}});var Eat=rt,Mat=Vi,Pat=qa,Rat=tu;Eat({target:"Set",proto:!0,real:!0,forced:!0},{find:function(e){var n=Pat(this),r=Mat(e,arguments.length>1?arguments[1]:void 0),i=Rat(n,function(s){if(r(s,s,n))return{value:s}},!0);return i&&i.value}});var Vat=rt,tQ=Ka,zat=M9;Vat({target:"Set",stat:!0,forced:!0},{from:zat(tQ.Set,tQ.add,!1)});var kat=qa,mD=Ka,Oat=HT,Iat=V0,Uat=tu,Nat=lm,Lat=mD.Set,nQ=mD.add,Xat=mD.has,Cat=function(e){var n=kat(this),r=Iat(e),i=new Lat;return Oat(n)>r.size?Nat(r.getIterator(),function(s){Xat(n,s)&&nQ(i,s)}):Uat(n,function(s){r.includes(s)&&nQ(i,s)}),i},Kat=rt,qat=Vn,Dat=R0,Wat=Cat;Kat({target:"Set",proto:!0,real:!0,forced:!0},{intersection:function(e){return qat(Wat,this,Dat(e))}});var Aat=qa,Gat=Ka.has,Fat=HT,jat=V0,Zat=tu,Jat=lm,Yat=h9,Bat=function(e){var n=Aat(this),r=jat(e);if(Fat(n)<=r.size)return Zat(n,function(s){if(r.includes(s))return!1},!0)!==!1;var i=r.getIterator();return Jat(i,function(s){if(Gat(n,s))return Yat(i,"normal",!1)})!==!1},Hat=rt,Qat=Vn,_at=R0,$at=Bat;Hat({target:"Set",proto:!0,real:!0,forced:!0},{isDisjointFrom:function(e){return Qat($at,this,_at(e))}});var eot=qa,tot=HT,not=tu,rot=V0,iot=function(e){var n=eot(this),r=rot(e);return tot(n)>r.size?!1:not(n,function(i){if(!r.includes(i))return!1},!0)!==!1},sot=rt,aot=Vn,oot=R0,lot=iot;sot({target:"Set",proto:!0,real:!0,forced:!0},{isSubsetOf:function(e){return aot(lot,this,oot(e))}});var uot=qa,cot=Ka.has,dot=HT,fot=V0,hot=lm,pot=h9,mot=function(e){var n=uot(this),r=fot(e);if(dot(n)1?arguments[1]:void 0),i=new kot;return zot(n,function(s){Oot(i,r(s,s,n))}),i}});var Iot=rt,rQ=Ka,Uot=R9;Iot({target:"Set",stat:!0,forced:!0},{of:Uot(rQ.Set,rQ.add,!1)});var Not=rt,Lot=yi,Xot=qa,Cot=tu,Kot=TypeError;Not({target:"Set",proto:!0,real:!0,forced:!0},{reduce:function(e){var n=Xot(this),r=arguments.length<2,i=r?void 0:arguments[1];if(Lot(e),Cot(n,function(s){r?(r=!1,i=s):i=e(i,s,s,n)}),r)throw new Kot("Reduce of empty set with no initial value");return i}});var qot=rt,Dot=Vi,Wot=qa,Aot=tu;qot({target:"Set",proto:!0,real:!0,forced:!0},{some:function(e){var n=Wot(this),r=Dot(e,arguments.length>1?arguments[1]:void 0);return Aot(n,function(i){if(r(i,i,n))return!0},!0)===!0}});var Got=qa,vD=Ka,Fot=pD,jot=V0,Zot=lm,Jot=vD.add,Yot=vD.has,Bot=vD.remove,Hot=function(e){var n=Got(this),r=jot(e).getIterator(),i=Fot(n);return Zot(r,function(s){Yot(n,s)?Bot(i,s):Jot(i,s)}),i},Qot=rt,_ot=Vn,$ot=R0,elt=Hot;Qot({target:"Set",proto:!0,real:!0,forced:!0},{symmetricDifference:function(e){return _ot(elt,this,$ot(e))}});var tlt=qa,nlt=Ka.add,rlt=pD,ilt=V0,slt=lm,alt=function(e){var n=tlt(this),r=ilt(e).getIterator(),i=rlt(n);return slt(r,function(s){nlt(i,s)}),i},olt=rt,llt=Vn,ult=R0,clt=alt;olt({target:"Set",proto:!0,real:!0,forced:!0},{union:function(e){return llt(clt,this,ult(e))}});var dlt=rt,flt=GT.charAt,hlt=cd,plt=Bu,mlt=mo;dlt({target:"String",proto:!0,forced:!0},{at:function(e){var n=mlt(hlt(this)),r=n.length,i=plt(e),s=i>=0?i:r+i;return s<0||s>=r?void 0:flt(n,s)}});var vlt=rt,glt=jT,iQ=P0,blt=cd,ylt=mo,Ype=Fs,Bpe=GT,Slt=Bpe.codeAt,xlt=Bpe.charAt,Hpe="String Iterator",Tlt=Ype.set,wlt=Ype.getterFor(Hpe),Elt=glt(function(e){Tlt(this,{type:Hpe,string:e,index:0})},"String",function(){var e=wlt(this),n=e.string,r=e.index,i;return r>=n.length?iQ(void 0,!0):(i=xlt(n,r),e.index+=i.length,iQ({codePoint:Slt(i,0),position:r},!1))});vlt({target:"String",proto:!0,forced:!0},{codePoints:function(){return new Elt(ylt(blt(this)))}});var Mlt=rt,Plt=Vn,Qpe=yq,Rlt=jT,L5=P0,sQ=cd,_pe=Py,w6=mo,Vlt=dr,zlt=wl,klt=ud,Olt=Nq,$pe=Xq,Ilt=im,Ult=po,Nlt=Rn,Llt=Vr,Xlt=Rq,Clt=Bfe,Klt=Qfe,eme=Fs,qlt=Ide,EP=Llt("matchAll"),tme="RegExp String",nme=tme+" Iterator",Dlt=eme.set,Wlt=eme.getterFor(nme),aQ=RegExp.prototype,Alt=TypeError,L8=Qpe("".indexOf),MP=Qpe("".matchAll),eI=!!MP&&!Nlt(function(){MP("a",/./)}),Glt=Rlt(function(e,n,r,i){Dlt(this,{type:nme,regexp:e,string:n,global:r,unicode:i,done:!1})},tme,function(){var e=Wlt(this);if(e.done)return L5(void 0,!0);var n=e.regexp,r=e.string,i=Klt(n,r);return i===null?(e.done=!0,L5(void 0,!0)):e.global?(w6(i[0])===""&&(n.lastIndex=Clt(r,_pe(n.lastIndex),e.unicode)),L5(i,!1)):(e.done=!0,L5(i,!1))}),rme=function(t){var e=Vlt(this),n=w6(t),r=Xlt(e,RegExp),i=w6($pe(e)),s,a,o;return s=new r(r===RegExp?e.source:e,i),a=!!~L8(i,"g"),o=!!~L8(i,"u"),s.lastIndex=_pe(e.lastIndex),new Glt(s,n,a,o)};Mlt({target:"String",proto:!0,forced:eI},{matchAll:function(e){var n=sQ(this),r,i,s,a;if(zlt(e)){if(eI)return MP(n,e)}else{if(Olt(e)&&(r=w6(sQ($pe(e))),!~L8(r,"g")))throw new Alt("`.matchAll` does not allow non-global regexes");if(eI)return MP(n,e);if(s=Ilt(e,EP),s===void 0&&qlt&&klt(e)==="RegExp"&&(s=rme),s)return Plt(s,e,n)}return i=w6(n),a=new RegExp(e,"g"),a[EP](i)}});EP in aQ||Ult(aQ,EP,rme);var Flt=rt,jlt=Vn,gD=tn,oQ=cd,Zlt=ir,Jlt=wl,Ylt=Nq,AS=mo,Blt=im,Hlt=Xq,Qlt=Hfe,_lt=Vr,$lt=_lt("replace"),eut=TypeError,tI=gD("".indexOf);gD("".replace);var lQ=gD("".slice),tut=Math.max;Flt({target:"String",proto:!0},{replaceAll:function(e,n){var r=oQ(this),i,s,a,o,l,u,c,d,f,h,p=0,m="";if(!Jlt(e)){if(i=Ylt(e),i&&(s=AS(oQ(Hlt(e))),!~tI(s,"g")))throw new eut("`.replaceAll` does not allow non-global regexes");if(a=Blt(e,$lt),a)return jlt(a,e,r,n)}for(o=AS(r),l=AS(e),u=Zlt(n),u||(n=AS(n)),c=l.length,d=tut(1,c),f=tI(o,l);f!==-1;)h=u?AS(n(l,f,o)):Qlt(l,o,f,[],void 0,n),m+=lQ(o,p,f)+h,p=f+c,f=f+d>o.length?-1:tI(o,l,f+d);return p=e.length)return t.target=null,q5(void 0,!0);switch(t.kind){case"keys":return q5(n,!1);case"values":return q5(e[n],!1)}return q5([n,e[n]],!1)},"values"),vQ=mQ.Arguments=mQ.Array;yD("keys");yD("values");yD("entries");if(Dut&&vQ.name!=="values")try{Kut(vQ,"name",{value:"values"})}catch{}var gQ=on,lme=Nut,Fut=Xut,g3=Gut,bQ=$l,jut=am,Zut=Vr,aI=Zut("iterator"),oI=g3.values,ume=function(t,e){if(t){if(t[aI]!==oI)try{bQ(t,aI,oI)}catch{t[aI]=oI}if(jut(t,e,!0),lme[e]){for(var n in g3)if(t[n]!==g3[n])try{bQ(t,n,g3[n])}catch{t[n]=g3[n]}}}};for(var lI in lme)ume(gQ[lI]&&gQ[lI].prototype,lI);ume(Fut,"DOMTokenList");var Jut=rt,Yut=on,yQ=p9.clear;Jut({global:!0,bind:!0,enumerable:!0,forced:Yut.clearImmediate!==yQ},{clearImmediate:yQ});var cme=on,But=zy,Hut=ir,Qut=wq,_ut=Wf,$ut=w0,ect=qT,tct=cme.Function,nct=/MSIE .\./.test(_ut)||Qut==="BUN"&&function(){var t=cme.Bun.version.split(".");return t.length<3||t[0]==="0"&&(t[1]<3||t[1]==="3"&&t[2]==="0")}(),rct=function(t,e){var n=e?2:1;return nct?function(r,i){var s=ect(arguments.length,1)>n,a=Hut(r)?r:tct(r),o=s?$ut(arguments,n):[],l=s?function(){But(a,this,o)}:a;return e?t(l,i):t(l)}:t},ict=rt,dme=on,SQ=p9.set,sct=rct,xQ=dme.setImmediate?sct(SQ,!1):SQ;ict({global:!0,bind:!0,enumerable:!0,forced:dme.setImmediate!==xQ},{setImmediate:xQ});var act=rt,oct=on,lct=bfe,uct=yi,cct=qT,dct=Rn,fct=Gr,hct=dct(function(){return fct&&Object.getOwnPropertyDescriptor(oct,"queueMicrotask").value.length!==1});act({global:!0,enumerable:!0,dontCallGetSet:!0,forced:hct},{queueMicrotask:function(e){cct(arguments.length,1),lct(uct(e))}});var pct=GT.charAt,mct=mo,fme=Fs,vct=nD,TQ=P0,hme="String Iterator",gct=fme.set,bct=fme.getterFor(hme);vct(String,"String",function(t){gct(this,{type:hme,string:mct(t),index:0})},function(){var e=bct(this),n=e.string,r=e.index,i;return r>=n.length?TQ(void 0,!0):(i=pct(n,r),e.index+=i.length,TQ(i,!1))});var yct=Rn,Sct=Vr,xct=Gr,wQ=Ide,Tct=Sct("iterator"),pme=!yct(function(){var t=new URL("b?a=1&b=2&c=3","https://a"),e=t.searchParams,n=new URLSearchParams("a=1&a=2&b=3"),r="";return t.pathname="c%20d",e.forEach(function(i,s){e.delete("b"),r+=s+i}),n.delete("a",2),n.delete("b",void 0),wQ&&(!t.toJSON||!n.has("a",1)||n.has("a",2)||!n.has("a",void 0)||n.has("b"))||!e.size&&(wQ||!xct)||!e.sort||t.href!=="https://a/c%20d?a=1&c=3"||e.get("c")!=="3"||String(new URLSearchParams("?a=1"))!=="a=1"||!e[Tct]||new URL("https://a@b").username!=="a"||new URLSearchParams(new URLSearchParams("a=b")).get("a")!=="b"||new URL("https://тест").host!=="xn--e1aybc"||new URL("https://a#б").hash!=="#%D0%B1"||r!=="a1c3"||new URL("https://x",void 0).host!=="x"}),EQ=Gr,wct=tn,Ect=Vn,Mct=Rn,uI=$de,Pct=bq,Rct=aq,Vct=da,zct=a9,wg=Object.assign,MQ=Object.defineProperty,kct=wct([].concat),Oct=!wg||Mct(function(){if(EQ&&wg({b:1},wg(MQ({},"a",{enumerable:!0,get:function(){MQ(this,"b",{value:3,enumerable:!1})}}),{b:2})).b!==1)return!0;var t={},e={},n=Symbol("assign detection"),r="abcdefghijklmnopqrst";return t[n]=7,r.split("").forEach(function(i){e[i]=i}),wg({},t)[n]!==7||uI(wg({},e)).join("")!==r})?function(e,n){for(var r=Vct(e),i=arguments.length,s=1,a=Pct.f,o=Rct.f;i>s;)for(var l=zct(arguments[s++]),u=a?kct(uI(l),a(l)):uI(l),c=u.length,d=0,f;c>d;)f=u[d++],(!EQ||Ect(o,l,f))&&(r[f]=l[f]);return r}:wg,Ict=dr,Uct=h9,Nct=function(t,e,n,r){try{return r?e(Ict(n)[0],n[1]):e(n)}catch(i){Uct(t,"throw",i)}},Lct=Vi,Xct=Vn,Cct=da,Kct=Nct,qct=Pq,Dct=NT,Wct=Ca,PQ=ufe,Act=CT,Gct=XT,RQ=Array,Fct=function(e){var n=Cct(e),r=Dct(this),i=arguments.length,s=i>1?arguments[1]:void 0,a=s!==void 0;a&&(s=Lct(s,i>2?arguments[2]:void 0));var o=Gct(n),l=0,u,c,d,f,h,p;if(o&&!(this===RQ&&qct(o)))for(c=r?new this:[],f=Act(n,o),h=f.next;!(d=Xct(h,f)).done;l++)p=a?Kct(f,s,[d.value,l],!0):d.value,PQ(c,l,p);else for(u=Wct(n),c=r?new this(u):RQ(u);u>l;l++)p=a?s(n[l],l):n[l],PQ(c,l,p);return c.length=l,c},z0=tn,cI=2147483647,cx=36,mme=1,X8=26,jct=38,Zct=700,Jct=72,Yct=128,Bct="-",Hct=/[^\0-\u007E]/,vme=/[.\u3002\uFF0E\uFF61]/g,VQ="Overflow: input needs wider integers to process",dI=cx-mme,zQ=RangeError,Qct=z0(vme.exec),g1=Math.floor,fI=String.fromCharCode,kQ=z0("".charCodeAt),gme=z0([].join),_h=z0([].push),_ct=z0("".replace),$ct=z0("".split),edt=z0("".toLowerCase),tdt=function(t){for(var e=[],n=0,r=t.length;n=55296&&i<=56319&&n>1,t+=g1(t/e);t>dI*X8>>1;)t=g1(t/dI),r+=cx;return g1(r+(dI+1)*t/(t+jct))},rdt=function(t){var e=[];t=tdt(t);var n=t.length,r=Yct,i=0,s=Jct,a,o;for(a=0;a=r&&og1((cI-i)/d))throw new zQ(VQ);for(i+=(c-r)*d,r=c,a=0;acI)throw new zQ(VQ);if(o===r){for(var f=i,h=cx;;){var p=h<=s?mme:h>=s+X8?X8:h-s;if(fi;){if(s=+arguments[i++],odt(s,1114111)!==s)throw new ldt(s+" is not a valid code point");n[i]=s<65536?IQ(s):IQ(((s-=65536)>>10)+55296,s%1024+56320)}return udt(n,"")}});var C8=rt,bme=on,SD=mfe,ddt=ca,D5=Vn,Au=tn,dx=Gr,yme=pme,Sme=po,fdt=eu,hdt=Iy,pdt=am,mdt=jT,xD=Fs,xme=Af,hI=ir,vdt=Yi,gdt=Vi,bdt=sm,ydt=dr,Tme=ei,Za=mo,Sdt=dd,NQ=rm,LQ=CT,xdt=XT,W5=P0,Eg=qT,Tdt=Vr,wdt=Eq,Edt=Tdt("iterator"),Uy="URLSearchParams",wme=Uy+"Iterator",Eme=xD.set,Kl=xD.getterFor(Uy),Mdt=xD.getterFor(wme),XQ=SD("fetch"),PP=SD("Request"),fx=SD("Headers"),pI=PP&&PP.prototype,CQ=fx&&fx.prototype,Pdt=bme.TypeError,Rdt=bme.encodeURIComponent,Vdt=String.fromCharCode,zdt=ddt("String","fromCodePoint"),kdt=parseInt,K7=Au("".charAt),KQ=Au([].join),$h=Au([].push),Mme=Au("".replace),Odt=Au([].shift),qQ=Au([].splice),DQ=Au("".split),Pme=Au("".slice),Idt=Au(/./.exec),Udt=/\+/g,mI="�",Ndt=/^[0-9a-f]+$/i,WQ=function(t,e){var n=Pme(t,e,e+2);return Idt(Ndt,n)?kdt(n,16):NaN},Ldt=function(t){for(var e=0,n=128;n>0&&t&n;n>>=1)e++;return e},Xdt=function(t){var e=null;switch(t.length){case 1:e=t[0];break;case 2:e=(t[0]&31)<<6|t[1]&63;break;case 3:e=(t[0]&15)<<12|(t[1]&63)<<6|t[2]&63;break;case 4:e=(t[0]&7)<<18|(t[1]&63)<<12|(t[2]&63)<<6|t[3]&63;break}return e>1114111?null:e},AQ=function(t){t=Mme(t,Udt," ");for(var e=t.length,n="",r=0;re){n+="%",r++;continue}var s=WQ(t,r+1);if(s!==s){n+=i,r++;continue}r+=2;var a=Ldt(s);if(a===0)i=Vdt(s);else{if(a===1||a>4){n+=mI,r++;continue}for(var o=[s],l=1;le||K7(t,r)!=="%"));){var u=WQ(t,r+1);if(u!==u){r+=3;break}if(u>191||u<128)break;$h(o,u),r+=2,l++}if(o.length!==a){n+=mI;continue}var c=Xdt(o);c===null?n+=mI:i=zdt(c)}}n+=i,r++}return n},Cdt=/[!'()~]|%20/g,Kdt={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},qdt=function(t){return Kdt[t]},GQ=function(t){return Mme(Rdt(t),Cdt,qdt)},vI=mdt(function(e,n){Eme(this,{type:wme,target:Kl(e).entries,index:0,kind:n})},Uy,function(){var e=Mdt(this),n=e.target,r=e.index++;if(!n||r>=n.length)return e.target=null,W5(void 0,!0);var i=n[r];switch(e.kind){case"keys":return W5(i.key,!1);case"values":return W5(i.value,!1)}return W5([i.key,i.value],!1)},!0),Rme=function(t){this.entries=[],this.url=null,t!==void 0&&(Tme(t)?this.parseObject(t):this.parseQuery(typeof t=="string"?K7(t,0)==="?"?Pme(t,1):t:Za(t)))};Rme.prototype={type:Uy,bindURL:function(t){this.url=t,this.update()},parseObject:function(t){var e=this.entries,n=xdt(t),r,i,s,a,o,l,u;if(n)for(r=LQ(t,n),i=r.next;!(s=D5(i,r)).done;){if(a=LQ(ydt(s.value)),o=a.next,(l=D5(o,a)).done||(u=D5(o,a)).done||!D5(o,a).done)throw new Pdt("Expected sequence with length 2");$h(e,{key:Za(l.value),value:Za(u.value)})}else for(var c in t)vdt(t,c)&&$h(e,{key:c,value:Za(t[c])})},parseQuery:function(t){if(t)for(var e=this.entries,n=DQ(t,"&"),r=0,i,s;r0?arguments[0]:void 0,n=Eme(this,new Rme(e));dx||(this.size=n.entries.length)},zb=z9.prototype;hdt(zb,{append:function(e,n){var r=Kl(this);Eg(arguments.length,2),$h(r.entries,{key:Za(e),value:Za(n)}),dx||this.length++,r.updateURL()},delete:function(t){for(var e=Kl(this),n=Eg(arguments.length,1),r=e.entries,i=Za(t),s=n<2?void 0:arguments[1],a=s===void 0?s:Za(s),o=0;or.key?1:-1}),e.updateURL()},forEach:function(e){for(var n=Kl(this).entries,r=gdt(e,arguments.length>1?arguments[1]:void 0),i=0,s;i1?FQ(arguments[1]):{})}}),hI(PP)){var gI=function(e){return xme(this,pI),new PP(e,arguments.length>1?FQ(arguments[1]):{})};pI.constructor=gI,gI.prototype=pI,C8({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:gI})}}var Adt={URLSearchParams:z9,getState:Kl},Gdt=rt,TD=Gr,Fdt=pme,wD=on,jQ=Vi,nu=tn,RP=po,Ol=eu,jdt=Af,K8=Yi,ED=Oct,Mg=Fct,uu=w0,Zdt=GT.codeAt,Jdt=idt,Nd=mo,Ydt=am,Bdt=qT,Vme=Adt,zme=Fs,Hdt=zme.set,VP=zme.getterFor("URL"),Qdt=Vme.URLSearchParams,_dt=Vme.getState,GS=wD.URL,q8=wD.TypeError,zP=wD.parseInt,$dt=Math.floor,ZQ=Math.pow,Dl=nu("".charAt),Pu=nu(/./.exec),b3=nu([].join),eft=nu(1 .toString),tft=nu([].pop),Bg=nu([].push),bI=nu("".replace),nft=nu([].shift),rft=nu("".split),hx=nu("".slice),kP=nu("".toLowerCase),ift=nu([].unshift),sft="Invalid authority",yI="Invalid scheme",qm="Invalid host",JQ="Invalid port",kme=/[a-z]/i,aft=/[\d+-.a-z]/i,D8=/\d/,oft=/^0x/i,lft=/^[0-7]+$/,uft=/^\d+$/,Ome=/^[\da-f]+$/i,cft=/[\0\t\n\r #%/:<>?@[\\\]^|]/,dft=/[\0\t\n\r #/:<>?@[\\\]^|]/,fft=/^[\u0000-\u0020]+/,hft=/(^|[^\u0000-\u0020])[\u0000-\u0020]+$/,pft=/[\t\n\r]/g,Il,mft=function(t){var e=rft(t,"."),n,r,i,s,a,o,l;if(e.length&&e[e.length-1]===""&&e.length--,n=e.length,n>4)return t;for(r=[],i=0;i1&&Dl(s,0)==="0"&&(a=Pu(oft,s)?16:8,s=hx(s,a===8?1:2)),s==="")o=0;else{if(!Pu(a===10?uft:a===8?lft:Ome,s))return t;o=zP(s,a)}Bg(r,o)}for(i=0;i=ZQ(256,5-n))return null}else if(o>255)return null;for(l=tft(r),i=0;i6))return;for(o=0;f();){if(l=null,o>0)if(f()==="."&&o<4)i++;else return;if(!Pu(D8,f()))return;for(;Pu(D8,f());){if(u=zP(f(),10),l===null)l=u;else{if(l===0)return;l=l*10+u}if(l>255)return;i++}e[n]=e[n]*256+l,o++,(o===2||o===4)&&n++}if(o!==4)return;break}else if(f()===":"){if(i++,!f())return}else if(f())return;e[n++]=s}if(r!==null)for(c=n-r,n=7;n!==0&&c>0;)d=e[n],e[n--]=e[r+c-1],e[r+--c]=d;else if(n!==8)return;return e},gft=function(t){for(var e=null,n=1,r=null,i=0,s=0;s<8;s++)t[s]!==0?(i>n&&(e=r,n=i),r=null,i=0):(r===null&&(r=s),++i);return i>n?r:e},FS=function(t){var e,n,r,i;if(typeof t=="number"){for(e=[],n=0;n<4;n++)ift(e,t%256),t=$dt(t/256);return b3(e,".")}if(typeof t=="object"){for(e="",r=gft(t),n=0;n<8;n++)i&&t[n]===0||(i&&(i=!1),r===n?(e+=n?":":"::",i=!0):(e+=eft(t[n],16),n<7&&(e+=":")));return"["+e+"]"}return t},q7={},Ime=ED({},q7,{" ":1,'"':1,"<":1,">":1,"`":1}),Ume=ED({},Ime,{"#":1,"?":1,"{":1,"}":1}),SI=ED({},Ume,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),ph=function(t,e){var n=Zdt(t,0);return n>32&&n<127&&!K8(e,t)?t:encodeURIComponent(t)},A5={ftp:21,file:null,http:80,https:443,ws:80,wss:443},y3=function(t,e){var n;return t.length===2&&Pu(kme,Dl(t,0))&&((n=Dl(t,1))===":"||!e&&n==="|")},YQ=function(t){var e;return t.length>1&&y3(hx(t,0,2))&&(t.length===2||(e=Dl(t,2))==="/"||e==="\\"||e==="?"||e==="#")},bft=function(t){return t==="."||kP(t)==="%2e"},yft=function(t){return t=kP(t),t===".."||t==="%2e."||t===".%2e"||t==="%2e%2e"},xI={},BQ={},TI={},HQ={},QQ={},wI={},_Q={},$Q={},G5={},F5={},EI={},MI={},PI={},RI={},e_={},VI={},Pg={},ac={},t_={},Dm={},Pd={},MD=function(t,e,n){var r=Nd(t),i,s,a;if(e){if(s=this.parse(r),s)throw new q8(s);this.searchParams=null}else{if(n!==void 0&&(i=new MD(n,!0)),s=this.parse(r,null,i),s)throw new q8(s);a=_dt(new Qdt),a.bindURL(this),this.searchParams=a}};MD.prototype={type:"URL",parse:function(t,e,n){var r=this,i=e||xI,s=0,a="",o=!1,l=!1,u=!1,c,d,f,h;for(t=Nd(t),e||(r.scheme="",r.username="",r.password="",r.host=null,r.port=null,r.path=[],r.query=null,r.fragment=null,r.cannotBeABaseURL=!1,t=bI(t,fft,""),t=bI(t,hft,"$1")),t=bI(t,pft,""),c=Mg(t);s<=c.length;){switch(d=c[s],i){case xI:if(d&&Pu(kme,d))a+=kP(d),i=BQ;else{if(e)return yI;i=TI;continue}break;case BQ:if(d&&(Pu(aft,d)||d==="+"||d==="-"||d==="."))a+=kP(d);else if(d===":"){if(e&&(r.isSpecial()!==K8(A5,a)||a==="file"&&(r.includesCredentials()||r.port!==null)||r.scheme==="file"&&!r.host))return;if(r.scheme=a,e){r.isSpecial()&&A5[r.scheme]===r.port&&(r.port=null);return}a="",r.scheme==="file"?i=RI:r.isSpecial()&&n&&n.scheme===r.scheme?i=HQ:r.isSpecial()?i=$Q:c[s+1]==="/"?(i=QQ,s++):(r.cannotBeABaseURL=!0,Bg(r.path,""),i=t_)}else{if(e)return yI;a="",i=TI,s=0;continue}break;case TI:if(!n||n.cannotBeABaseURL&&d!=="#")return yI;if(n.cannotBeABaseURL&&d==="#"){r.scheme=n.scheme,r.path=uu(n.path),r.query=n.query,r.fragment="",r.cannotBeABaseURL=!0,i=Pd;break}i=n.scheme==="file"?RI:wI;continue;case HQ:if(d==="/"&&c[s+1]==="/")i=G5,s++;else{i=wI;continue}break;case QQ:if(d==="/"){i=F5;break}else{i=ac;continue}case wI:if(r.scheme=n.scheme,d===Il)r.username=n.username,r.password=n.password,r.host=n.host,r.port=n.port,r.path=uu(n.path),r.query=n.query;else if(d==="/"||d==="\\"&&r.isSpecial())i=_Q;else if(d==="?")r.username=n.username,r.password=n.password,r.host=n.host,r.port=n.port,r.path=uu(n.path),r.query="",i=Dm;else if(d==="#")r.username=n.username,r.password=n.password,r.host=n.host,r.port=n.port,r.path=uu(n.path),r.query=n.query,r.fragment="",i=Pd;else{r.username=n.username,r.password=n.password,r.host=n.host,r.port=n.port,r.path=uu(n.path),r.path.length--,i=ac;continue}break;case _Q:if(r.isSpecial()&&(d==="/"||d==="\\"))i=G5;else if(d==="/")i=F5;else{r.username=n.username,r.password=n.password,r.host=n.host,r.port=n.port,i=ac;continue}break;case $Q:if(i=G5,d!=="/"||Dl(a,s+1)!=="/")continue;s++;break;case G5:if(d!=="/"&&d!=="\\"){i=F5;continue}break;case F5:if(d==="@"){o&&(a="%40"+a),o=!0,f=Mg(a);for(var p=0;p65535)return JQ;r.port=r.isSpecial()&&g===A5[r.scheme]?null:g,a=""}if(e)return;i=Pg;continue}else return JQ;break;case RI:if(r.scheme="file",d==="/"||d==="\\")i=e_;else if(n&&n.scheme==="file")switch(d){case Il:r.host=n.host,r.path=uu(n.path),r.query=n.query;break;case"?":r.host=n.host,r.path=uu(n.path),r.query="",i=Dm;break;case"#":r.host=n.host,r.path=uu(n.path),r.query=n.query,r.fragment="",i=Pd;break;default:YQ(b3(uu(c,s),""))||(r.host=n.host,r.path=uu(n.path),r.shortenPath()),i=ac;continue}else{i=ac;continue}break;case e_:if(d==="/"||d==="\\"){i=VI;break}n&&n.scheme==="file"&&!YQ(b3(uu(c,s),""))&&(y3(n.path[0],!0)?Bg(r.path,n.path[0]):r.host=n.host),i=ac;continue;case VI:if(d===Il||d==="/"||d==="\\"||d==="?"||d==="#"){if(!e&&y3(a))i=ac;else if(a===""){if(r.host="",e)return;i=Pg}else{if(h=r.parseHost(a),h)return h;if(r.host==="localhost"&&(r.host=""),e)return;a="",i=Pg}continue}else a+=d;break;case Pg:if(r.isSpecial()){if(i=ac,d!=="/"&&d!=="\\")continue}else if(!e&&d==="?")r.query="",i=Dm;else if(!e&&d==="#")r.fragment="",i=Pd;else if(d!==Il&&(i=ac,d!=="/"))continue;break;case ac:if(d===Il||d==="/"||d==="\\"&&r.isSpecial()||!e&&(d==="?"||d==="#")){if(yft(a)?(r.shortenPath(),d!=="/"&&!(d==="\\"&&r.isSpecial())&&Bg(r.path,"")):bft(a)?d!=="/"&&!(d==="\\"&&r.isSpecial())&&Bg(r.path,""):(r.scheme==="file"&&!r.path.length&&y3(a)&&(r.host&&(r.host=""),a=Dl(a,0)+":"),Bg(r.path,a)),a="",r.scheme==="file"&&(d===Il||d==="?"||d==="#"))for(;r.path.length>1&&r.path[0]==="";)nft(r.path);d==="?"?(r.query="",i=Dm):d==="#"&&(r.fragment="",i=Pd)}else a+=ph(d,Ume);break;case t_:d==="?"?(r.query="",i=Dm):d==="#"?(r.fragment="",i=Pd):d!==Il&&(r.path[0]+=ph(d,q7));break;case Dm:!e&&d==="#"?(r.fragment="",i=Pd):d!==Il&&(d==="'"&&r.isSpecial()?r.query+="%27":d==="#"?r.query+="%23":r.query+=ph(d,q7));break;case Pd:d!==Il&&(r.fragment+=ph(d,Ime));break}s++}},parseHost:function(t){var e,n,r;if(Dl(t,0)==="["){if(Dl(t,t.length-1)!=="]"||(e=vft(hx(t,1,-1)),!e))return qm;this.host=e}else if(this.isSpecial()){if(t=Jdt(t),Pu(cft,t)||(e=mft(t),e===null))return qm;this.host=e}else{if(Pu(dft,t))return qm;for(e="",n=Mg(t),r=0;r1?arguments[1]:void 0,i=Hdt(n,new MD(e,!1,r));TD||(n.href=i.serialize(),n.origin=i.getOrigin(),n.protocol=i.getProtocol(),n.username=i.getUsername(),n.password=i.getPassword(),n.host=i.getHost(),n.hostname=i.getHostname(),n.port=i.getPort(),n.pathname=i.getPathname(),n.search=i.getSearch(),n.searchParams=i.getSearchParams(),n.hash=i.getHash())},ja=kb.prototype,Ul=function(t,e){return{get:function(){return VP(this)[t]()},set:e&&function(n){return VP(this)[e](n)},configurable:!0,enumerable:!0}};TD&&(Ol(ja,"href",Ul("serialize","setHref")),Ol(ja,"origin",Ul("getOrigin")),Ol(ja,"protocol",Ul("getProtocol","setProtocol")),Ol(ja,"username",Ul("getUsername","setUsername")),Ol(ja,"password",Ul("getPassword","setPassword")),Ol(ja,"host",Ul("getHost","setHost")),Ol(ja,"hostname",Ul("getHostname","setHostname")),Ol(ja,"port",Ul("getPort","setPort")),Ol(ja,"pathname",Ul("getPathname","setPathname")),Ol(ja,"search",Ul("getSearch","setSearch")),Ol(ja,"searchParams",Ul("getSearchParams")),Ol(ja,"hash",Ul("getHash","setHash")));RP(ja,"toJSON",function(){return VP(this).serialize()},{enumerable:!0});RP(ja,"toString",function(){return VP(this).serialize()},{enumerable:!0});if(GS){var n_=GS.createObjectURL,r_=GS.revokeObjectURL;n_&&RP(kb,"createObjectURL",jQ(n_,GS)),r_&&RP(kb,"revokeObjectURL",jQ(r_,GS))}Ydt(kb,"URL");Gdt({global:!0,constructor:!0,forced:!Fdt,sham:!TD},{URL:kb});var Sft=rt,xft=Vn;Sft({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return xft(URL.prototype.toString,this)}});var Tft=typeof global=="object"&&global&&global.Object===Object&&global;const wft=Tft;var Eft=typeof self=="object"&&self&&self.Object===Object&&self,Mft=wft||Eft||Function("return this")();const Pft=Mft;var Rft=Pft.Symbol;const OP=Rft;var Nme=Object.prototype,Vft=Nme.hasOwnProperty,zft=Nme.toString,jS=OP?OP.toStringTag:void 0;function kft(t){var e=Vft.call(t,jS),n=t[jS];try{t[jS]=void 0;var r=!0}catch{}var i=zft.call(t);return r&&(e?t[jS]=n:delete t[jS]),i}var Oft=Object.prototype,Ift=Oft.toString;function Uft(t){return Ift.call(t)}var Nft="[object Null]",Lft="[object Undefined]",i_=OP?OP.toStringTag:void 0;function PD(t){return t==null?t===void 0?Lft:Nft:i_&&i_ in Object(t)?kft(t):Uft(t)}function Lme(t){return t!=null&&typeof t=="object"}var Xft="[object Symbol]";function Cft(t){return typeof t=="symbol"||Lme(t)&&PD(t)==Xft}var Kft=Array.isArray;const qft=Kft;var Dft=/\s/;function Wft(t){for(var e=t.length;e--&&Dft.test(t.charAt(e)););return e}var Aft=/^\s+/;function Gft(t){return t&&t.slice(0,Wft(t)+1).replace(Aft,"")}function IP(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}var s_=0/0,Fft=/^[-+]0x[0-9a-f]+$/i,jft=/^0b[01]+$/i,Zft=/^0o[0-7]+$/i,Jft=parseInt;function Yft(t){if(typeof t=="number")return t;if(Cft(t))return s_;if(IP(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=IP(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=Gft(t);var n=jft.test(t);return n||Zft.test(t)?Jft(t.slice(2),n?2:8):Fft.test(t)?s_:+t}var a_=1/0,Bft=17976931348623157e292;function Hft(t){if(!t)return t===0?t:0;if(t=Yft(t),t===a_||t===-a_){var e=t<0?-1:1;return e*Bft}return t===t?t:0}function Qft(t){var e=Hft(t),n=e%1;return e===e?n?e-n:e:0}var _ft="[object AsyncFunction]",$ft="[object Function]",eht="[object GeneratorFunction]",tht="[object Proxy]";function nht(t){if(!IP(t))return!1;var e=PD(t);return e==$ft||e==eht||e==_ft||e==tht}var rht=9007199254740991,iht=/^(?:0|[1-9]\d*)$/;function sht(t,e){var n=typeof t;return e=e??rht,!!e&&(n=="number"||n!="symbol"&&iht.test(t))&&t>-1&&t%1==0&&t-1&&t%1==0&&t<=oht}function uht(t){return t!=null&&lht(t.length)&&!nht(t)}function cht(t,e,n){if(!IP(n))return!1;var r=typeof e;return(r=="number"?uht(n)&&sht(e,n.length):r=="string"&&e in n)?aht(n[e],t):!1}function dht(t,e,n){var r=-1,i=t.length;e<0&&(e=-e>i?0:i+e),n=n>i?i:n,n<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var s=Array(i);++r ",performance.now()-n);const i=r[0];return new class extends zD{constructor(){super({serverUrl:"dummy",streamId:"dummy",undefined:void 0,objectId:i.id}),this.objectId=i.id}async getRootObject(){return i}async getTotalObjectCount(){return Object.keys((i==null?void 0:i.__closure)||{}).length}async*getObjectIterator(){const s=Date.now();let a=0;for await(const{id:o,obj:l}of this.getRawObjectIterator(r))this.buffer[o]=l,a+=1,yield l;this.logger("Loaded ".concat(a," objects in: ").concat((Date.now()-s)/1e3))}async*getRawObjectIterator(s){if(yield{id:s[0].id,obj:s[0]},s[0].__closure)for(const a of s)yield{id:a.id,obj:a}}}}async asyncPause(){Date.now()-this.lastAsyncPause>=100&&(this.lastAsyncPause=Date.now(),this.existingAsyncPause=new Promise(e=>setTimeout(e,0)),await this.existingAsyncPause,this.existingAsyncPause=null,Date.now()-this.lastAsyncPause>500&&this.logger("Loader Event loop lag: ",Date.now()-this.lastAsyncPause))}dispose(){this.buffer=[],this.promises=[],Object.values(this.intervals).forEach(e=>clearInterval(e.interval))}async getTotalObjectCount(){const e=await this.getRawRootObject(),n=JSON.parse(e);return Object.keys((n==null?void 0:n.__closure)||{}).length}async getRootObject(){const e=await this.getRawRootObject();return JSON.parse(e)}async getAndConstructObject(e){await this.downloadObjectsInBuffer(e);const n=await this.getObject(this.objectId);return this.traverseAndConstruct(n,e)}async downloadObjectsInBuffer(e){let n=!0,r=0;for await(const i of this.getObjectIterator())n&&(this.totalChildrenCount=i.totalChildrenCount,n=!1,this.isLoading=!0),r++,e&&e({stage:"download",current:r,total:this.totalChildrenCount});this.isLoading=!1}async traverseAndConstruct(e,n){if(e){if(typeof e!="object")return e;if(Array.isArray(e)&&e.length!==0){var r,i;const s=[];for(const a of e){if(!a)continue;if(typeof a!="object"&&!this.options.fullyTraverseArrays)return e;const o=a.referencedId?await this.getObject(a.referencedId):a;a.referencedId&&n&&n({stage:"construction",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount}),s.push(await this.traverseAndConstruct(o,n))}return(r=s[0])!==null&&r!==void 0&&(i=r.speckle_type)!==null&&i!==void 0&&i.toLowerCase().includes("datachunk")?s.reduce((a,o)=>a.concat(o.data),[]):s}for(const s of this.options.excludeProps)delete e[s];for(const s in e)typeof e[s]=="object"&&e[s]!==null&&(e[s].referencedId&&(e[s]=await this.getObject(e[s].referencedId),n&&n({stage:"construction",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount})),e[s]=await this.traverseAndConstruct(e[s],n));return e}}async getObject(e){return this.buffer[e]?this.buffer[e]:new Promise((n,r)=>{if(this.promises.push({id:e,resolve:n,reject:r}),this.intervals[e])this.intervals[e].elapsed=0;else{const i=setInterval(this.tryResolvePromise.bind(this),this.INTERVAL_MS,e);this.intervals[e]={interval:i,elapsed:0}}})}tryResolvePromise(e){if(this.intervals[e].elapsed+=this.INTERVAL_MS,this.buffer[e]){for(const n of this.promises.filter(r=>r.id===e))n.resolve(this.buffer[e]);return clearInterval(this.intervals[e].interval),void delete this.intervals[e]}this.intervals[e].elapsed>this.TIMEOUT_MS&&(this.warner("Timeout resolving ".concat(e,". HIC SVNT DRACONES.")),clearInterval(this.intervals[e].interval),this.promises.filter(n=>n.id===e).forEach(n=>n.reject()),this.promises=this.promises.filter(n=>n.id!=n.id))}async*getObjectIterator(){const e=Date.now();let n=0;for await(const r of this.getRawObjectIterator()){const{id:i,obj:s}=this.processLine(r);this.buffer[i]=s,n+=1,yield s}this.logger("Loaded ".concat(n," objects in: ").concat((Date.now()-e)/1e3))}processLine(e){const n=e.split(" "),[r,i]=n;let s;try{s=JSON.parse(i)}catch(a){throw new Error("Error parsing object ".concat(r,": ").concat(a.message))}return{id:r,obj:s}}supportsCache(){return!(!this.options.enableCaching||!globalThis.indexedDB)}async setupCacheDb(){if(!this.supportsCache()||this.cacheDB!==null)return;await function(){if(navigator.userAgentData||!/Safari\//.test(navigator.userAgent)||/Chrom(e|ium)\//.test(navigator.userAgent)||!indexedDB.databases)return Promise.resolve();let n;return new Promise(r=>{const i=()=>indexedDB.databases().finally(r);n=setInterval(i,100),i()}).finally(()=>clearInterval(n))}();const e=indexedDB.open("speckle-object-cache",1);e.onupgradeneeded=()=>e.result.createObjectStore("objects"),this.cacheDB=await this.promisifyIdbRequest(e)}async*getRawObjectIterator(){await this.setupCacheDb();const e=await this.getRawRootObject();yield"".concat(this.objectId," ").concat(e);const n=JSON.parse(e);if(!n.__closure)return;let r=Object.keys(n.__closure).filter(c=>!c.includes("blob")).sort((c,d)=>n.__closure[c]-n.__closure[d]);if(r.length===0)return;let i=[];if(r.length>50){const c=[[],[],[],[]];let d=0;for(;d<.05*r.length;d++)c[0].push(r[d]);for(;d<.2*r.length;d++)c[1].push(r[d]);for(;d<.6*r.length;d++)c[2].push(r[d]);for(;dn.__closure[y]-n.__closure[x]);for(const y of v)yield"".concat(y," ").concat(m[y]);const g=c[p].filter(y=>!(y in m)),b=pht(g,500);for(let y=0;yn.__closure[f]-n.__closure[h]);for(const f of d)yield"".concat(f," ").concat(c[f]);if(r=r.filter(f=>!(f in c)),r.length===0)return;i.push(r)}const s=[],a=[],o=[],l=[],u=[];for(let c=0;c{d.body.getReader&&(d.body.iterator=async function*(){const p=this.getReader();for(;;){const m=await p.read();if(m.done)return m.value;yield m.value}});const f=d.body.iterator();a[c]=f;const h=f.next().then(p=>(p.reqId=c,p));o[c]=h});for(;;){const c=o.filter(g=>!!g);if(c.length===0){if(u.every(g=>g))break;await new Promise(g=>{setTimeout(g,10)});continue}const d=await Promise.any(c);let{value:f,done:h,reqId:p}=d;if(u[p]=h,h)l[p].length>0&&(yield l[p],l[p]=""),o[p]=null;else{const g=a[p].next().then(b=>(b.reqId=p,b));o[p]=g}if(!f)continue;f=s[p].decode(f);const m=(l[p]+f).split(/\r\n|\n|\r/),v=m.pop();l[p]=v;for(const g of m)yield g;this.cacheStoreObjects(m)}}async getRawRootObject(){const e=await this.cacheGetObjects([this.objectId]);if(e[this.objectId])return e[this.objectId];const n=await this.fetch(this.requestUrlRootObj,{headers:this.headers}),r=await n.text();if([401,403].includes(n.status))throw new W8("You do not have access to the root object!");return this.cacheStoreObjects(["".concat(this.objectId," ").concat(r)]),r}promisifyIdbRequest(e){return new Promise((n,r)=>{e.oncomplete=e.onsuccess=()=>n(e.result),e.onabort=e.onerror=()=>r(e.error)})}async cacheGetObjects(e){if(!this.supportsCache())return{};this.cacheDB===null&&await this.setupCacheDb();const n={};for(let r=0;rthis.promisifyIdbRequest(s.get(l)).then(u=>({id:l,data:u}))),o=await Promise.all(a);for(const l of o)!l.data||o_(l.data)&&l.data.startsWith(">8&255]+Bs[t>>16&255]+Bs[t>>24&255]+"-"+Bs[e&255]+Bs[e>>8&255]+"-"+Bs[e>>16&15|64]+Bs[e>>24&255]+"-"+Bs[n&63|128]+Bs[n>>8&255]+"-"+Bs[n>>16&255]+Bs[n>>24&255]+Bs[r&255]+Bs[r>>8&255]+Bs[r>>16&255]+Bs[r>>24&255]).toLowerCase()}var Xme={exports:{}};/*! * js-logger - http://github.com/jonnyreeves/js-logger * Jonny Reeves, http://jonnyreeves.co.uk/ * js-logger may be freely distributed under the MIT license. - */(function(t){(function(e){var n={};n.VERSION="1.6.1";var r,i={},s=function(c,d){return function(){return d.apply(c,arguments)}},a=function(){var c=arguments,d=c[0],f,h;for(h=1;h=d.value},trace:function(){this.invoke(n.TRACE,arguments)},debug:function(){this.invoke(n.DEBUG,arguments)},info:function(){this.invoke(n.INFO,arguments)},warn:function(){this.invoke(n.WARN,arguments)},error:function(){this.invoke(n.ERROR,arguments)},time:function(c){typeof c=="string"&&c.length>0&&this.invoke(n.TIME,[c,"start"])},timeEnd:function(c){typeof c=="string"&&c.length>0&&this.invoke(n.TIME,[c,"end"])},invoke:function(c,d){r&&this.enabledFor(c)&&r(d,a({level:c},this.context))}};var u=new l({filterLevel:n.OFF});(function(){var c=n;c.enabledFor=s(u,u.enabledFor),c.trace=s(u,u.trace),c.debug=s(u,u.debug),c.time=s(u,u.time),c.timeEnd=s(u,u.timeEnd),c.info=s(u,u.info),c.warn=s(u,u.warn),c.error=s(u,u.error),c.log=c.info})(),n.setHandler=function(c){r=c},n.setLevel=function(c){u.setLevel(c);for(var d in i)i.hasOwnProperty(d)&&i[d].setLevel(c)},n.getLevel=function(){return u.getLevel()},n.get=function(c){return i[c]||(i[c]=new l(a({name:c},u.context)))},n.createDefaultHandler=function(c){c=c||{},c.formatter=c.formatter||function(p,m){m.name&&p.unshift("["+m.name+"]")};var d={},f=function(h,p){Function.prototype.apply.call(h,console,p)};return typeof console>"u"?function(){}:function(h,p){h=Array.prototype.slice.call(h);var m=console.log,v;p.level===n.TIME?(v=(p.name?"["+p.name+"] ":"")+h[0],h[1]==="start"?console.time?console.time(v):d[v]=new Date().getTime():console.timeEnd?console.timeEnd(v):f(m,[v+": "+(new Date().getTime()-d[v])+"ms"])):(p.level===n.WARN&&console.warn?m=console.warn:p.level===n.ERROR&&console.error?m=console.error:p.level===n.INFO&&console.info?m=console.info:p.level===n.DEBUG&&console.debug?m=console.debug:p.level===n.TRACE&&console.trace&&(m=console.trace),c.formatter(h,p),f(m,h))}},n.useDefaults=function(c){n.setLevel(c&&c.defaultLevel||n.DEBUG),n.setHandler(n.createDefaultHandler(c))},n.setDefaults=n.useDefaults,t.exports?t.exports=n:(n._prevLogger=e.Logger,n.noConflict=function(){return e.Logger=n._prevLogger,n},e.Logger=n)})(Ks)})(Cme);var mht=Cme.exports;const Zt=wV(mht);/*! + */(function(t){(function(e){var n={};n.VERSION="1.6.1";var r,i={},s=function(c,d){return function(){return d.apply(c,arguments)}},a=function(){var c=arguments,d=c[0],f,h;for(h=1;h=d.value},trace:function(){this.invoke(n.TRACE,arguments)},debug:function(){this.invoke(n.DEBUG,arguments)},info:function(){this.invoke(n.INFO,arguments)},warn:function(){this.invoke(n.WARN,arguments)},error:function(){this.invoke(n.ERROR,arguments)},time:function(c){typeof c=="string"&&c.length>0&&this.invoke(n.TIME,[c,"start"])},timeEnd:function(c){typeof c=="string"&&c.length>0&&this.invoke(n.TIME,[c,"end"])},invoke:function(c,d){r&&this.enabledFor(c)&&r(d,a({level:c},this.context))}};var u=new l({filterLevel:n.OFF});(function(){var c=n;c.enabledFor=s(u,u.enabledFor),c.trace=s(u,u.trace),c.debug=s(u,u.debug),c.time=s(u,u.time),c.timeEnd=s(u,u.timeEnd),c.info=s(u,u.info),c.warn=s(u,u.warn),c.error=s(u,u.error),c.log=c.info})(),n.setHandler=function(c){r=c},n.setLevel=function(c){u.setLevel(c);for(var d in i)i.hasOwnProperty(d)&&i[d].setLevel(c)},n.getLevel=function(){return u.getLevel()},n.get=function(c){return i[c]||(i[c]=new l(a({name:c},u.context)))},n.createDefaultHandler=function(c){c=c||{},c.formatter=c.formatter||function(p,m){m.name&&p.unshift("["+m.name+"]")};var d={},f=function(h,p){Function.prototype.apply.call(h,console,p)};return typeof console>"u"?function(){}:function(h,p){h=Array.prototype.slice.call(h);var m=console.log,v;p.level===n.TIME?(v=(p.name?"["+p.name+"] ":"")+h[0],h[1]==="start"?console.time?console.time(v):d[v]=new Date().getTime():console.timeEnd?console.timeEnd(v):f(m,[v+": "+(new Date().getTime()-d[v])+"ms"])):(p.level===n.WARN&&console.warn?m=console.warn:p.level===n.ERROR&&console.error?m=console.error:p.level===n.INFO&&console.info?m=console.info:p.level===n.DEBUG&&console.debug?m=console.debug:p.level===n.TRACE&&console.trace&&(m=console.trace),c.formatter(h,p),f(m,h))}},n.useDefaults=function(c){n.setLevel(c&&c.defaultLevel||n.DEBUG),n.setHandler(n.createDefaultHandler(c))},n.setDefaults=n.useDefaults,t.exports?t.exports=n:(n._prevLogger=e.Logger,n.noConflict=function(){return e.Logger=n._prevLogger,n},e.Logger=n)})(Ks)})(Xme);var vht=Xme.exports;const Zt=wV(vht);/*! * camera-controls * https://github.com/yomotsu/camera-controls * (c) 2017 @yomotsu * Released under the MIT License. - */const ks={LEFT:1,RIGHT:2,MIDDLE:4},gt=Object.freeze({NONE:0,ROTATE:1,TRUCK:2,OFFSET:4,DOLLY:8,ZOOM:16,TOUCH_ROTATE:32,TOUCH_TRUCK:64,TOUCH_OFFSET:128,TOUCH_DOLLY:256,TOUCH_ZOOM:512,TOUCH_DOLLY_TRUCK:1024,TOUCH_DOLLY_OFFSET:2048,TOUCH_DOLLY_ROTATE:4096,TOUCH_ZOOM_TRUCK:8192,TOUCH_ZOOM_OFFSET:16384,TOUCH_ZOOM_ROTATE:32768});function Wm(t){return t.isPerspectiveCamera}function Th(t){return t.isOrthographicCamera}const Rg=Math.PI*2,c_=Math.PI/2,Kme=1e-5;function ci(t,e=Kme){return Math.abs(t){e.x+=n.clientX,e.y+=n.clientY}),e.x/=t.length,e.y/=t.length}function kI(t,e){return Th(t)?(console.warn(`${e} is not supported in OrthographicCamera`),!0):!1}function f_(t){return t.invert?t.invert():t.inverse(),t}let vht=class{constructor(){this._listeners={}}addEventListener(e,n){const r=this._listeners;r[e]===void 0&&(r[e]=[]),r[e].indexOf(n)===-1&&r[e].push(n)}hasEventListener(e,n){const r=this._listeners;return r[e]!==void 0&&r[e].indexOf(n)!==-1}removeEventListener(e,n){const i=this._listeners[e];if(i!==void 0){const s=i.indexOf(n);s!==-1&&i.splice(s,1)}}removeAllEventListeners(e){if(!e){this._listeners={};return}Array.isArray(this._listeners[e])&&(this._listeners[e].length=0)}dispatchEvent(e){const r=this._listeners[e.type];if(r!==void 0){e.target=this;const i=r.slice(0);for(let s=0,a=i.length;s{},this._enabled=!0,this._state=gt.NONE,this._viewport=null,this._affectOffset=!1,this._dollyControlAmount=0,this._hasRested=!0,this._boundaryEnclosesCamera=!1,this._needsUpdate=!0,this._updatedLastTime=!1,this._elementRect=new DOMRect,this._activePointers=[],this._truckInternal=(T,M,E)=>{if(Wm(this._camera)){const S=zn.copy(this._camera.position).sub(this._target),P=this._camera.getEffectiveFOV()*Wt.MathUtils.DEG2RAD,R=S.length()*Math.tan(P*.5),V=this.truckSpeed*T*R/this._elementRect.height,z=this.truckSpeed*M*R/this._elementRect.height;this.verticalDragToForward?(E?this.setFocalOffset(this._focalOffsetEnd.x+V,this._focalOffsetEnd.y,this._focalOffsetEnd.z,!0):this.truck(V,0,!0),this.forward(-z,!0)):E?this.setFocalOffset(this._focalOffsetEnd.x+V,this._focalOffsetEnd.y+z,this._focalOffsetEnd.z,!0):this.truck(V,z,!0)}else if(Th(this._camera)){const S=this._camera,P=T*(S.right-S.left)/S.zoom/this._elementRect.width,R=M*(S.top-S.bottom)/S.zoom/this._elementRect.height;E?this.setFocalOffset(this._focalOffsetEnd.x+P,this._focalOffsetEnd.y+R,this._focalOffsetEnd.z,!0):this.truck(P,R,!0)}},this._rotateInternal=(T,M)=>{const E=Rg*this.azimuthRotateSpeed*T/this._elementRect.height,S=Rg*this.polarRotateSpeed*M/this._elementRect.height;this.rotate(E,S,!0)},this._dollyInternal=(T,M,E)=>{const S=Math.pow(.95,-T*this.dollySpeed),P=this._sphericalEnd.radius*S,R=this._sphericalEnd.radius,V=R*(T>=0?-1:1);this.dollyTo(P),this.infinityDolly&&(P{const S=Math.pow(.95,T*this.dollySpeed),P=this._zoomEnd;this.zoomTo(this._zoom*S),this.dollyToCursor&&(this._dollyControlAmount+=this._zoomEnd-P,this._dollyControlCoord.set(M,E))},typeof Wt>"u"&&console.error("camera-controls: `THREE` is undefined. You must first run `CameraControls.install( { THREE: THREE } )`. Check the docs for further information."),this._camera=e,this._yAxisUpSpace=new Wt.Quaternion().setFromUnitVectors(this._camera.up,Z5),this._yAxisUpSpaceInverse=f_(this._yAxisUpSpace.clone()),this._state=gt.NONE,this._target=new Wt.Vector3,this._targetEnd=this._target.clone(),this._focalOffset=new Wt.Vector3,this._focalOffsetEnd=this._focalOffset.clone(),this._spherical=new Wt.Spherical().setFromVector3(zn.copy(this._camera.position).applyQuaternion(this._yAxisUpSpace)),this._sphericalEnd=this._spherical.clone(),this._zoom=this._camera.zoom,this._zoomEnd=this._zoom,this._nearPlaneCorners=[new Wt.Vector3,new Wt.Vector3,new Wt.Vector3,new Wt.Vector3],this._updateNearPlaneCorners(),this._boundary=new Wt.Box3(new Wt.Vector3(-1/0,-1/0,-1/0),new Wt.Vector3(1/0,1/0,1/0)),this._target0=this._target.clone(),this._position0=this._camera.position.clone(),this._zoom0=this._zoom,this._focalOffset0=this._focalOffset.clone(),this._dollyControlAmount=0,this._dollyControlCoord=new Wt.Vector2,this.mouseButtons={left:gt.ROTATE,middle:gt.DOLLY,right:gt.TRUCK,wheel:Wm(this._camera)?gt.DOLLY:Th(this._camera)?gt.ZOOM:gt.NONE},this.touches={one:gt.TOUCH_ROTATE,two:Wm(this._camera)?gt.TOUCH_DOLLY_TRUCK:Th(this._camera)?gt.TOUCH_ZOOM_TRUCK:gt.NONE,three:gt.TOUCH_TRUCK};const r=new Wt.Vector2,i=new Wt.Vector2,s=new Wt.Vector2,a=T=>{if(!this._enabled||!this._domElement)return;const M={pointerId:T.pointerId,clientX:T.clientX,clientY:T.clientY,deltaX:0,deltaY:0};this._activePointers.push(M),this._domElement.ownerDocument.removeEventListener("pointermove",u,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",f),this._domElement.ownerDocument.addEventListener("pointermove",u,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",f),b(T)},o=T=>{if(!this._enabled||!this._domElement)return;const M={pointerId:0,clientX:T.clientX,clientY:T.clientY,deltaX:0,deltaY:0};this._activePointers.push(M),this._domElement.ownerDocument.removeEventListener("mousemove",c),this._domElement.ownerDocument.removeEventListener("mouseup",h),this._domElement.ownerDocument.addEventListener("mousemove",c),this._domElement.ownerDocument.addEventListener("mouseup",h),b(T)},l=T=>{!this._enabled||!this._domElement||(T.preventDefault(),Array.prototype.forEach.call(T.changedTouches,M=>{const E={pointerId:M.identifier,clientX:M.clientX,clientY:M.clientY,deltaX:0,deltaY:0};this._activePointers.push(E)}),this._domElement.ownerDocument.removeEventListener("touchmove",d,{passive:!1}),this._domElement.ownerDocument.removeEventListener("touchend",p),this._domElement.ownerDocument.addEventListener("touchmove",d,{passive:!1}),this._domElement.ownerDocument.addEventListener("touchend",p),b(T))},u=T=>{T.cancelable&&T.preventDefault();const M=T.pointerId,E=this._findPointerById(M);if(E){if(E.clientX=T.clientX,E.clientY=T.clientY,E.deltaX=T.movementX,E.deltaY=T.movementY,T.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else this._state=0,(T.buttons&ks.LEFT)===ks.LEFT&&(this._state=this._state|this.mouseButtons.left),(T.buttons&ks.MIDDLE)===ks.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(T.buttons&ks.RIGHT)===ks.RIGHT&&(this._state=this._state|this.mouseButtons.right);y()}},c=T=>{const M=this._findPointerById(0);M&&(M.clientX=T.clientX,M.clientY=T.clientY,M.deltaX=T.movementX,M.deltaY=T.movementY,this._state=0,(T.buttons&ks.LEFT)===ks.LEFT&&(this._state=this._state|this.mouseButtons.left),(T.buttons&ks.MIDDLE)===ks.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(T.buttons&ks.RIGHT)===ks.RIGHT&&(this._state=this._state|this.mouseButtons.right),y())},d=T=>{T.cancelable&&T.preventDefault(),Array.prototype.forEach.call(T.changedTouches,M=>{const E=M.identifier,S=this._findPointerById(E);S&&(S.clientX=M.clientX,S.clientY=M.clientY)}),y()},f=T=>{const M=T.pointerId,E=this._findPointerById(M);if(E&&this._activePointers.splice(this._activePointers.indexOf(E),1),T.pointerType==="touch")switch(this._activePointers.length){case 0:this._state=gt.NONE;break;case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else this._state=gt.NONE;x()},h=()=>{const T=this._findPointerById(0);T&&this._activePointers.splice(this._activePointers.indexOf(T),1),this._state=gt.NONE,x()},p=T=>{switch(Array.prototype.forEach.call(T.changedTouches,M=>{const E=M.identifier,S=this._findPointerById(E);S&&this._activePointers.splice(this._activePointers.indexOf(S),1)}),this._activePointers.length){case 0:this._state=gt.NONE;break;case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}x()};let m=-1;const v=T=>{if(!this._enabled||this.mouseButtons.wheel===gt.NONE)return;if(T.preventDefault(),this.dollyToCursor||this.mouseButtons.wheel===gt.ROTATE||this.mouseButtons.wheel===gt.TRUCK){const R=performance.now();m-R<1e3&&this._getClientRect(this._elementRect),m=R}const M=bht?-1:-3,E=T.deltaMode===1?T.deltaY/M:T.deltaY/(M*10),S=this.dollyToCursor?(T.clientX-this._elementRect.x)/this._elementRect.width*2-1:0,P=this.dollyToCursor?(T.clientY-this._elementRect.y)/this._elementRect.height*-2+1:0;switch(this.mouseButtons.wheel){case gt.ROTATE:{this._rotateInternal(T.deltaX,T.deltaY);break}case gt.TRUCK:{this._truckInternal(T.deltaX,T.deltaY,!1);break}case gt.OFFSET:{this._truckInternal(T.deltaX,T.deltaY,!0);break}case gt.DOLLY:{this._dollyInternal(-E,S,P);break}case gt.ZOOM:{this._zoomInternal(-E,S,P);break}}this.dispatchEvent({type:"control"})},g=T=>{this._enabled&&T.preventDefault()},b=T=>{if(!this._enabled)return;if(zI(this._activePointers,xo),this._getClientRect(this._elementRect),r.copy(xo),i.copy(xo),this._activePointers.length>=2){const E=xo.x-this._activePointers[1].clientX,S=xo.y-this._activePointers[1].clientY,P=Math.sqrt(E*E+S*S);s.set(0,P);const R=(this._activePointers[0].clientX+this._activePointers[1].clientX)*.5,V=(this._activePointers[0].clientY+this._activePointers[1].clientY)*.5;i.set(R,V)}if("touches"in T||"pointerType"in T&&T.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else this._state=0,(T.buttons&ks.LEFT)===ks.LEFT&&(this._state=this._state|this.mouseButtons.left),(T.buttons&ks.MIDDLE)===ks.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(T.buttons&ks.RIGHT)===ks.RIGHT&&(this._state=this._state|this.mouseButtons.right);this.dispatchEvent({type:"controlstart"})},y=()=>{if(!this._enabled)return;zI(this._activePointers,xo);const T=this._domElement&&document.pointerLockElement===this._domElement,M=T?-this._activePointers[0].deltaX:i.x-xo.x,E=T?-this._activePointers[0].deltaY:i.y-xo.y;if(i.copy(xo),((this._state>.ROTATE)===gt.ROTATE||(this._state>.TOUCH_ROTATE)===gt.TOUCH_ROTATE||(this._state>.TOUCH_DOLLY_ROTATE)===gt.TOUCH_DOLLY_ROTATE||(this._state>.TOUCH_ZOOM_ROTATE)===gt.TOUCH_ZOOM_ROTATE)&&this._rotateInternal(M,E),(this._state>.DOLLY)===gt.DOLLY||(this._state>.ZOOM)===gt.ZOOM){const S=this.dollyToCursor?(r.x-this._elementRect.x)/this._elementRect.width*2-1:0,P=this.dollyToCursor?(r.y-this._elementRect.y)/this._elementRect.height*-2+1:0;(this._state>.DOLLY)===gt.DOLLY?this._dollyInternal(E*j5,S,P):this._zoomInternal(E*j5,S,P)}if((this._state>.TOUCH_DOLLY)===gt.TOUCH_DOLLY||(this._state>.TOUCH_ZOOM)===gt.TOUCH_ZOOM||(this._state>.TOUCH_DOLLY_TRUCK)===gt.TOUCH_DOLLY_TRUCK||(this._state>.TOUCH_ZOOM_TRUCK)===gt.TOUCH_ZOOM_TRUCK||(this._state>.TOUCH_DOLLY_OFFSET)===gt.TOUCH_DOLLY_OFFSET||(this._state>.TOUCH_ZOOM_OFFSET)===gt.TOUCH_ZOOM_OFFSET||(this._state>.TOUCH_DOLLY_ROTATE)===gt.TOUCH_DOLLY_ROTATE||(this._state>.TOUCH_ZOOM_ROTATE)===gt.TOUCH_ZOOM_ROTATE){const S=xo.x-this._activePointers[1].clientX,P=xo.y-this._activePointers[1].clientY,R=Math.sqrt(S*S+P*P),V=s.y-R;s.set(0,R);const z=this.dollyToCursor?(i.x-this._elementRect.x)/this._elementRect.width*2-1:0,k=this.dollyToCursor?(i.y-this._elementRect.y)/this._elementRect.height*-2+1:0;(this._state>.TOUCH_DOLLY)===gt.TOUCH_DOLLY||(this._state>.TOUCH_DOLLY_ROTATE)===gt.TOUCH_DOLLY_ROTATE||(this._state>.TOUCH_DOLLY_TRUCK)===gt.TOUCH_DOLLY_TRUCK||(this._state>.TOUCH_DOLLY_OFFSET)===gt.TOUCH_DOLLY_OFFSET?this._dollyInternal(V*j5,z,k):this._zoomInternal(V*j5,z,k)}((this._state>.TRUCK)===gt.TRUCK||(this._state>.TOUCH_TRUCK)===gt.TOUCH_TRUCK||(this._state>.TOUCH_DOLLY_TRUCK)===gt.TOUCH_DOLLY_TRUCK||(this._state>.TOUCH_ZOOM_TRUCK)===gt.TOUCH_ZOOM_TRUCK)&&this._truckInternal(M,E,!1),((this._state>.OFFSET)===gt.OFFSET||(this._state>.TOUCH_OFFSET)===gt.TOUCH_OFFSET||(this._state>.TOUCH_DOLLY_OFFSET)===gt.TOUCH_DOLLY_OFFSET||(this._state>.TOUCH_ZOOM_OFFSET)===gt.TOUCH_ZOOM_OFFSET)&&this._truckInternal(M,E,!0),this.dispatchEvent({type:"control"})},x=()=>{zI(this._activePointers,xo),i.copy(xo),this._activePointers.length===0&&this._domElement&&(this._domElement.ownerDocument.removeEventListener("pointermove",u,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",f),this._domElement.ownerDocument.removeEventListener("touchmove",d,{passive:!1}),this._domElement.ownerDocument.removeEventListener("touchend",p),this.dispatchEvent({type:"controlend"}))};this._addAllEventListeners=T=>{this._domElement=T,this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none",this._domElement.addEventListener("pointerdown",a),h_&&this._domElement.addEventListener("mousedown",o),h_&&this._domElement.addEventListener("touchstart",l),this._domElement.addEventListener("pointercancel",f),this._domElement.addEventListener("wheel",v,{passive:!1}),this._domElement.addEventListener("contextmenu",g)},this._removeAllEventListeners=()=>{this._domElement&&(this._domElement.removeEventListener("pointerdown",a),this._domElement.removeEventListener("mousedown",o),this._domElement.removeEventListener("touchstart",l),this._domElement.removeEventListener("pointercancel",f),this._domElement.removeEventListener("wheel",v,{passive:!1}),this._domElement.removeEventListener("contextmenu",g),this._domElement.ownerDocument.removeEventListener("pointermove",u,{passive:!1}),this._domElement.ownerDocument.removeEventListener("mousemove",c),this._domElement.ownerDocument.removeEventListener("touchmove",d,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",f),this._domElement.ownerDocument.removeEventListener("mouseup",h),this._domElement.ownerDocument.removeEventListener("touchend",p))},this.cancel=()=>{this._state!==gt.NONE&&(this._state=gt.NONE,this._activePointers.length=0,x())},n&&this.connect(n),this.update(0)}get camera(){return this._camera}set camera(e){this._camera=e,this.updateCameraUp(),this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0}get enabled(){return this._enabled}set enabled(e){this._domElement&&(this._enabled=e,e?(this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none"):(this.cancel(),this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect=""))}get active(){return!this._hasRested}get currentAction(){return this._state}get distance(){return this._spherical.radius}set distance(e){this._spherical.radius===e&&this._sphericalEnd.radius===e||(this._spherical.radius=e,this._sphericalEnd.radius=e,this._needsUpdate=!0)}get azimuthAngle(){return this._spherical.theta}set azimuthAngle(e){this._spherical.theta===e&&this._sphericalEnd.theta===e||(this._spherical.theta=e,this._sphericalEnd.theta=e,this._needsUpdate=!0)}get polarAngle(){return this._spherical.phi}set polarAngle(e){this._spherical.phi===e&&this._sphericalEnd.phi===e||(this._spherical.phi=e,this._sphericalEnd.phi=e,this._needsUpdate=!0)}get boundaryEnclosesCamera(){return this._boundaryEnclosesCamera}set boundaryEnclosesCamera(e){this._boundaryEnclosesCamera=e,this._needsUpdate=!0}addEventListener(e,n){super.addEventListener(e,n)}removeEventListener(e,n){super.removeEventListener(e,n)}rotate(e,n,r=!1){return this.rotateTo(this._sphericalEnd.theta+e,this._sphericalEnd.phi+n,r)}rotateAzimuthTo(e,n=!1){return this.rotateTo(e,this._sphericalEnd.phi,n)}rotatePolarTo(e,n=!1){return this.rotateTo(this._sphericalEnd.theta,e,n)}rotateTo(e,n,r=!1){const i=Wt.MathUtils.clamp(e,this.minAzimuthAngle,this.maxAzimuthAngle),s=Wt.MathUtils.clamp(n,this.minPolarAngle,this.maxPolarAngle);this._sphericalEnd.theta=i,this._sphericalEnd.phi=s,this._sphericalEnd.makeSafe(),this._needsUpdate=!0,r||(this._spherical.theta=this._sphericalEnd.theta,this._spherical.phi=this._sphericalEnd.phi);const a=!r||ui(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&ui(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold);return this._createOnRestPromise(a)}dolly(e,n=!1){return this.dollyTo(this._sphericalEnd.radius-e,n)}dollyTo(e,n=!1){const r=this._sphericalEnd.radius,i=Wt.MathUtils.clamp(e,this.minDistance,this.maxDistance);if(this.colliderMeshes.length>=1){const o=this._collisionTest(),l=ui(o,this._spherical.radius);if(!(r>i)&&l)return Promise.resolve();this._sphericalEnd.radius=Math.min(i,o)}else this._sphericalEnd.radius=i;this._needsUpdate=!0,n||(this._spherical.radius=this._sphericalEnd.radius);const a=!n||ui(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(a)}zoom(e,n=!1){return this.zoomTo(this._zoomEnd+e,n)}zoomTo(e,n=!1){this._zoomEnd=Wt.MathUtils.clamp(e,this.minZoom,this.maxZoom),this._needsUpdate=!0,n||(this._zoom=this._zoomEnd);const r=!n||ui(this._zoom,this._zoomEnd,this.restThreshold);return this._createOnRestPromise(r)}pan(e,n,r=!1){return console.warn("`pan` has been renamed to `truck`"),this.truck(e,n,r)}truck(e,n,r=!1){this._camera.updateMatrix(),oc.setFromMatrixColumn(this._camera.matrix,0),lc.setFromMatrixColumn(this._camera.matrix,1),oc.multiplyScalar(e),lc.multiplyScalar(-n);const i=zn.copy(oc).add(lc),s=kr.copy(this._targetEnd).add(i);return this.moveTo(s.x,s.y,s.z,r)}forward(e,n=!1){zn.setFromMatrixColumn(this._camera.matrix,0),zn.crossVectors(this._camera.up,zn),zn.multiplyScalar(e);const r=kr.copy(this._targetEnd).add(zn);return this.moveTo(r.x,r.y,r.z,n)}moveTo(e,n,r,i=!1){const s=zn.set(e,n,r).sub(this._targetEnd);this._encloseToBoundary(this._targetEnd,s,this.boundaryFriction),this._needsUpdate=!0,i||this._target.copy(this._targetEnd);const a=!i||ui(this._target.x,this._targetEnd.x,this.restThreshold)&&ui(this._target.y,this._targetEnd.y,this.restThreshold)&&ui(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(a)}fitToBox(e,n,{cover:r=!1,paddingLeft:i=0,paddingRight:s=0,paddingBottom:a=0,paddingTop:o=0}={}){const l=[],u=e.isBox3?D1.copy(e):D1.setFromObject(e);u.isEmpty()&&(console.warn("camera-controls: fitTo() cannot be used with an empty box. Aborting"),Promise.resolve());const c=d_(this._sphericalEnd.theta,c_),d=d_(this._sphericalEnd.phi,c_);l.push(this.rotateTo(c,d,n));const f=zn.setFromSpherical(this._sphericalEnd).normalize(),h=b_.setFromUnitVectors(f,OI),p=ui(Math.abs(f.y),1);p&&h.multiply(UI.setFromAxisAngle(Z5,c)),h.multiply(this._yAxisUpSpaceInverse);const m=g_.makeEmpty();kr.copy(u.min).applyQuaternion(h),m.expandByPoint(kr),kr.copy(u.min).setX(u.max.x).applyQuaternion(h),m.expandByPoint(kr),kr.copy(u.min).setY(u.max.y).applyQuaternion(h),m.expandByPoint(kr),kr.copy(u.max).setZ(u.min.z).applyQuaternion(h),m.expandByPoint(kr),kr.copy(u.min).setZ(u.max.z).applyQuaternion(h),m.expandByPoint(kr),kr.copy(u.max).setY(u.min.y).applyQuaternion(h),m.expandByPoint(kr),kr.copy(u.max).setX(u.min.x).applyQuaternion(h),m.expandByPoint(kr),kr.copy(u.max).applyQuaternion(h),m.expandByPoint(kr),m.min.x-=i,m.min.y-=a,m.max.x+=s,m.max.y+=o,h.setFromUnitVectors(OI,f),p&&h.premultiply(UI.invert()),h.premultiply(this._yAxisUpSpace);const v=m.getSize(zn),g=m.getCenter(kr).applyQuaternion(h);if(Wm(this._camera)){const b=this.getDistanceToFitBox(v.x,v.y,v.z,r);l.push(this.moveTo(g.x,g.y,g.z,n)),l.push(this.dollyTo(b,n)),l.push(this.setFocalOffset(0,0,0,n))}else if(Th(this._camera)){const b=this._camera,y=b.right-b.left,x=b.top-b.bottom,T=r?Math.max(y/v.x,x/v.y):Math.min(y/v.x,x/v.y);l.push(this.moveTo(g.x,g.y,g.z,n)),l.push(this.zoomTo(T,n)),l.push(this.setFocalOffset(0,0,0,n))}return Promise.all(l)}fitToSphere(e,n){const r=[],s=e instanceof Wt.Sphere?II.copy(e):yht(e,II);if(r.push(this.moveTo(s.center.x,s.center.y,s.center.z,n)),Wm(this._camera)){const a=this.getDistanceToFitSphere(s.radius);r.push(this.dollyTo(a,n))}else if(Th(this._camera)){const a=this._camera.right-this._camera.left,o=this._camera.top-this._camera.bottom,l=2*s.radius,u=Math.min(a/l,o/l);r.push(this.zoomTo(u,n))}return r.push(this.setFocalOffset(0,0,0,n)),Promise.all(r)}setLookAt(e,n,r,i,s,a,o=!1){const l=kr.set(i,s,a),u=zn.set(e,n,r);this._targetEnd.copy(l),this._sphericalEnd.setFromVector3(u.sub(l).applyQuaternion(this._yAxisUpSpace)),this.normalizeRotations(),this._needsUpdate=!0,o||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const c=!o||ui(this._target.x,this._targetEnd.x,this.restThreshold)&&ui(this._target.y,this._targetEnd.y,this.restThreshold)&&ui(this._target.z,this._targetEnd.z,this.restThreshold)&&ui(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&ui(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&ui(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(c)}lerpLookAt(e,n,r,i,s,a,o,l,u,c,d,f,h,p=!1){const m=zn.set(i,s,a),v=kr.set(e,n,r);cu.setFromVector3(v.sub(m).applyQuaternion(this._yAxisUpSpace));const g=Vg.set(c,d,f),b=kr.set(o,l,u);BS.setFromVector3(b.sub(g).applyQuaternion(this._yAxisUpSpace)),this._targetEnd.copy(m.lerp(g,h));const y=BS.theta-cu.theta,x=BS.phi-cu.phi,T=BS.radius-cu.radius;this._sphericalEnd.set(cu.radius+T*h,cu.phi+x*h,cu.theta+y*h),this.normalizeRotations(),this._needsUpdate=!0,p||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const M=!p||ui(this._target.x,this._targetEnd.x,this.restThreshold)&&ui(this._target.y,this._targetEnd.y,this.restThreshold)&&ui(this._target.z,this._targetEnd.z,this.restThreshold)&&ui(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&ui(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&ui(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(M)}setPosition(e,n,r,i=!1){return this.setLookAt(e,n,r,this._targetEnd.x,this._targetEnd.y,this._targetEnd.z,i)}setTarget(e,n,r,i=!1){const s=this.getPosition(zn),a=this.setLookAt(s.x,s.y,s.z,e,n,r,i);return this._sphericalEnd.phi=Wt.MathUtils.clamp(this.polarAngle,this.minPolarAngle,this.maxPolarAngle),a}setFocalOffset(e,n,r,i=!1){this._focalOffsetEnd.set(e,n,r),this._needsUpdate=!0,i||this._focalOffset.copy(this._focalOffsetEnd),this._affectOffset=!ci(e)||!ci(n)||!ci(r);const s=!i||ui(this._focalOffset.x,this._focalOffsetEnd.x,this.restThreshold)&&ui(this._focalOffset.y,this._focalOffsetEnd.y,this.restThreshold)&&ui(this._focalOffset.z,this._focalOffsetEnd.z,this.restThreshold);return this._createOnRestPromise(s)}setOrbitPoint(e,n,r){this._camera.updateMatrixWorld(),oc.setFromMatrixColumn(this._camera.matrixWorldInverse,0),lc.setFromMatrixColumn(this._camera.matrixWorldInverse,1),Am.setFromMatrixColumn(this._camera.matrixWorldInverse,2);const i=zn.set(e,n,r),s=i.distanceTo(this._camera.position),a=i.sub(this._camera.position);oc.multiplyScalar(a.x),lc.multiplyScalar(a.y),Am.multiplyScalar(a.z),zn.copy(oc).add(lc).add(Am),zn.z=zn.z+s,this.dollyTo(s,!1),this.setFocalOffset(-zn.x,zn.y,-zn.z,!1),this.moveTo(e,n,r,!1)}setBoundary(e){if(!e){this._boundary.min.set(-1/0,-1/0,-1/0),this._boundary.max.set(1/0,1/0,1/0),this._needsUpdate=!0;return}this._boundary.copy(e),this._boundary.clampPoint(this._targetEnd,this._targetEnd),this._needsUpdate=!0}setViewport(e,n,r,i){if(e===null){this._viewport=null;return}this._viewport=this._viewport||new Wt.Vector4,typeof e=="number"?this._viewport.set(e,n,r,i):this._viewport.copy(e)}getDistanceToFitBox(e,n,r,i=!1){if(kI(this._camera,"getDistanceToFitBox"))return this._spherical.radius;const s=e/n,a=this._camera.getEffectiveFOV()*Wt.MathUtils.DEG2RAD,o=this._camera.aspect;return((i?s>o:sr.pointerId===e?(n=r,!0):!1),n}_encloseToBoundary(e,n,r){const i=n.lengthSq();if(i===0)return e;const s=kr.copy(n).add(e),o=this._boundary.clampPoint(s,Vg).sub(s),l=o.lengthSq();if(l===0)return e.add(n);if(l===i)return e;if(r===0)return e.add(n).add(o);{const u=1+r*l/n.dot(o);return e.add(kr.copy(n).multiplyScalar(u)).add(o.multiplyScalar(1-r))}}_updateNearPlaneCorners(){if(Wm(this._camera)){const e=this._camera,n=e.near,r=e.getEffectiveFOV()*Wt.MathUtils.DEG2RAD,i=Math.tan(r*.5)*n,s=i*e.aspect;this._nearPlaneCorners[0].set(-s,-i,0),this._nearPlaneCorners[1].set(s,-i,0),this._nearPlaneCorners[2].set(s,i,0),this._nearPlaneCorners[3].set(-s,i,0)}else if(Th(this._camera)){const e=this._camera,n=1/e.zoom,r=e.left*n,i=e.right*n,s=e.top*n,a=e.bottom*n;this._nearPlaneCorners[0].set(r,s,0),this._nearPlaneCorners[1].set(i,s,0),this._nearPlaneCorners[2].set(i,a,0),this._nearPlaneCorners[3].set(r,a,0)}}_collisionTest(){let e=1/0;if(!(this.colliderMeshes.length>=1)||kI(this._camera,"_collisionTest"))return e;const r=zn.setFromSpherical(this._spherical).divideScalar(this._spherical.radius);NI.lookAt(p_,r,this._camera.up);for(let i=0;i<4;i++){const s=kr.copy(this._nearPlaneCorners[i]);s.applyMatrix4(NI);const a=Vg.addVectors(this._target,s);J5.set(a,r),J5.far=this._spherical.radius+1;const o=J5.intersectObjects(this.colliderMeshes);o.length!==0&&o[0].distance{const r=()=>{this.removeEventListener("rest",r),n()};this.addEventListener("rest",r)}))}_addAllEventListeners(e){}_removeAllEventListeners(){}}function yht(t,e){const n=e,r=n.center;D1.makeEmpty(),t.traverseVisible(s=>{s.isMesh&&D1.expandByObject(s)}),D1.getCenter(r);let i=0;return t.traverseVisible(s=>{if(!s.isMesh)return;const a=s,o=a.geometry.clone();if(o.applyMatrix4(a.matrixWorld),o.isBufferGeometry){const u=o.attributes.position;for(let c=0,d=u.count;c{e.x+=n.clientX,e.y+=n.clientY}),e.x/=t.length,e.y/=t.length}function kI(t,e){return Th(t)?(console.warn(`${e} is not supported in OrthographicCamera`),!0):!1}function c_(t){return t.invert?t.invert():t.inverse(),t}let ght=class{constructor(){this._listeners={}}addEventListener(e,n){const r=this._listeners;r[e]===void 0&&(r[e]=[]),r[e].indexOf(n)===-1&&r[e].push(n)}hasEventListener(e,n){const r=this._listeners;return r[e]!==void 0&&r[e].indexOf(n)!==-1}removeEventListener(e,n){const i=this._listeners[e];if(i!==void 0){const s=i.indexOf(n);s!==-1&&i.splice(s,1)}}removeAllEventListeners(e){if(!e){this._listeners={};return}Array.isArray(this._listeners[e])&&(this._listeners[e].length=0)}dispatchEvent(e){const r=this._listeners[e.type];if(r!==void 0){e.target=this;const i=r.slice(0);for(let s=0,a=i.length;s{},this._enabled=!0,this._state=gt.NONE,this._viewport=null,this._affectOffset=!1,this._dollyControlAmount=0,this._hasRested=!0,this._boundaryEnclosesCamera=!1,this._needsUpdate=!0,this._updatedLastTime=!1,this._elementRect=new DOMRect,this._activePointers=[],this._truckInternal=(T,M,E)=>{if(Wm(this._camera)){const S=zn.copy(this._camera.position).sub(this._target),P=this._camera.getEffectiveFOV()*Wt.MathUtils.DEG2RAD,R=S.length()*Math.tan(P*.5),V=this.truckSpeed*T*R/this._elementRect.height,z=this.truckSpeed*M*R/this._elementRect.height;this.verticalDragToForward?(E?this.setFocalOffset(this._focalOffsetEnd.x+V,this._focalOffsetEnd.y,this._focalOffsetEnd.z,!0):this.truck(V,0,!0),this.forward(-z,!0)):E?this.setFocalOffset(this._focalOffsetEnd.x+V,this._focalOffsetEnd.y+z,this._focalOffsetEnd.z,!0):this.truck(V,z,!0)}else if(Th(this._camera)){const S=this._camera,P=T*(S.right-S.left)/S.zoom/this._elementRect.width,R=M*(S.top-S.bottom)/S.zoom/this._elementRect.height;E?this.setFocalOffset(this._focalOffsetEnd.x+P,this._focalOffsetEnd.y+R,this._focalOffsetEnd.z,!0):this.truck(P,R,!0)}},this._rotateInternal=(T,M)=>{const E=Rg*this.azimuthRotateSpeed*T/this._elementRect.height,S=Rg*this.polarRotateSpeed*M/this._elementRect.height;this.rotate(E,S,!0)},this._dollyInternal=(T,M,E)=>{const S=Math.pow(.95,-T*this.dollySpeed),P=this._sphericalEnd.radius*S,R=this._sphericalEnd.radius,V=R*(T>=0?-1:1);this.dollyTo(P),this.infinityDolly&&(P{const S=Math.pow(.95,T*this.dollySpeed),P=this._zoomEnd;this.zoomTo(this._zoom*S),this.dollyToCursor&&(this._dollyControlAmount+=this._zoomEnd-P,this._dollyControlCoord.set(M,E))},typeof Wt>"u"&&console.error("camera-controls: `THREE` is undefined. You must first run `CameraControls.install( { THREE: THREE } )`. Check the docs for further information."),this._camera=e,this._yAxisUpSpace=new Wt.Quaternion().setFromUnitVectors(this._camera.up,Z5),this._yAxisUpSpaceInverse=c_(this._yAxisUpSpace.clone()),this._state=gt.NONE,this._target=new Wt.Vector3,this._targetEnd=this._target.clone(),this._focalOffset=new Wt.Vector3,this._focalOffsetEnd=this._focalOffset.clone(),this._spherical=new Wt.Spherical().setFromVector3(zn.copy(this._camera.position).applyQuaternion(this._yAxisUpSpace)),this._sphericalEnd=this._spherical.clone(),this._zoom=this._camera.zoom,this._zoomEnd=this._zoom,this._nearPlaneCorners=[new Wt.Vector3,new Wt.Vector3,new Wt.Vector3,new Wt.Vector3],this._updateNearPlaneCorners(),this._boundary=new Wt.Box3(new Wt.Vector3(-1/0,-1/0,-1/0),new Wt.Vector3(1/0,1/0,1/0)),this._target0=this._target.clone(),this._position0=this._camera.position.clone(),this._zoom0=this._zoom,this._focalOffset0=this._focalOffset.clone(),this._dollyControlAmount=0,this._dollyControlCoord=new Wt.Vector2,this.mouseButtons={left:gt.ROTATE,middle:gt.DOLLY,right:gt.TRUCK,wheel:Wm(this._camera)?gt.DOLLY:Th(this._camera)?gt.ZOOM:gt.NONE},this.touches={one:gt.TOUCH_ROTATE,two:Wm(this._camera)?gt.TOUCH_DOLLY_TRUCK:Th(this._camera)?gt.TOUCH_ZOOM_TRUCK:gt.NONE,three:gt.TOUCH_TRUCK};const r=new Wt.Vector2,i=new Wt.Vector2,s=new Wt.Vector2,a=T=>{if(!this._enabled||!this._domElement)return;const M={pointerId:T.pointerId,clientX:T.clientX,clientY:T.clientY,deltaX:0,deltaY:0};this._activePointers.push(M),this._domElement.ownerDocument.removeEventListener("pointermove",u,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",f),this._domElement.ownerDocument.addEventListener("pointermove",u,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",f),b(T)},o=T=>{if(!this._enabled||!this._domElement)return;const M={pointerId:0,clientX:T.clientX,clientY:T.clientY,deltaX:0,deltaY:0};this._activePointers.push(M),this._domElement.ownerDocument.removeEventListener("mousemove",c),this._domElement.ownerDocument.removeEventListener("mouseup",h),this._domElement.ownerDocument.addEventListener("mousemove",c),this._domElement.ownerDocument.addEventListener("mouseup",h),b(T)},l=T=>{!this._enabled||!this._domElement||(T.preventDefault(),Array.prototype.forEach.call(T.changedTouches,M=>{const E={pointerId:M.identifier,clientX:M.clientX,clientY:M.clientY,deltaX:0,deltaY:0};this._activePointers.push(E)}),this._domElement.ownerDocument.removeEventListener("touchmove",d,{passive:!1}),this._domElement.ownerDocument.removeEventListener("touchend",p),this._domElement.ownerDocument.addEventListener("touchmove",d,{passive:!1}),this._domElement.ownerDocument.addEventListener("touchend",p),b(T))},u=T=>{T.cancelable&&T.preventDefault();const M=T.pointerId,E=this._findPointerById(M);if(E){if(E.clientX=T.clientX,E.clientY=T.clientY,E.deltaX=T.movementX,E.deltaY=T.movementY,T.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else this._state=0,(T.buttons&ks.LEFT)===ks.LEFT&&(this._state=this._state|this.mouseButtons.left),(T.buttons&ks.MIDDLE)===ks.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(T.buttons&ks.RIGHT)===ks.RIGHT&&(this._state=this._state|this.mouseButtons.right);y()}},c=T=>{const M=this._findPointerById(0);M&&(M.clientX=T.clientX,M.clientY=T.clientY,M.deltaX=T.movementX,M.deltaY=T.movementY,this._state=0,(T.buttons&ks.LEFT)===ks.LEFT&&(this._state=this._state|this.mouseButtons.left),(T.buttons&ks.MIDDLE)===ks.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(T.buttons&ks.RIGHT)===ks.RIGHT&&(this._state=this._state|this.mouseButtons.right),y())},d=T=>{T.cancelable&&T.preventDefault(),Array.prototype.forEach.call(T.changedTouches,M=>{const E=M.identifier,S=this._findPointerById(E);S&&(S.clientX=M.clientX,S.clientY=M.clientY)}),y()},f=T=>{const M=T.pointerId,E=this._findPointerById(M);if(E&&this._activePointers.splice(this._activePointers.indexOf(E),1),T.pointerType==="touch")switch(this._activePointers.length){case 0:this._state=gt.NONE;break;case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else this._state=gt.NONE;x()},h=()=>{const T=this._findPointerById(0);T&&this._activePointers.splice(this._activePointers.indexOf(T),1),this._state=gt.NONE,x()},p=T=>{switch(Array.prototype.forEach.call(T.changedTouches,M=>{const E=M.identifier,S=this._findPointerById(E);S&&this._activePointers.splice(this._activePointers.indexOf(S),1)}),this._activePointers.length){case 0:this._state=gt.NONE;break;case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}x()};let m=-1;const v=T=>{if(!this._enabled||this.mouseButtons.wheel===gt.NONE)return;if(T.preventDefault(),this.dollyToCursor||this.mouseButtons.wheel===gt.ROTATE||this.mouseButtons.wheel===gt.TRUCK){const R=performance.now();m-R<1e3&&this._getClientRect(this._elementRect),m=R}const M=yht?-1:-3,E=T.deltaMode===1?T.deltaY/M:T.deltaY/(M*10),S=this.dollyToCursor?(T.clientX-this._elementRect.x)/this._elementRect.width*2-1:0,P=this.dollyToCursor?(T.clientY-this._elementRect.y)/this._elementRect.height*-2+1:0;switch(this.mouseButtons.wheel){case gt.ROTATE:{this._rotateInternal(T.deltaX,T.deltaY);break}case gt.TRUCK:{this._truckInternal(T.deltaX,T.deltaY,!1);break}case gt.OFFSET:{this._truckInternal(T.deltaX,T.deltaY,!0);break}case gt.DOLLY:{this._dollyInternal(-E,S,P);break}case gt.ZOOM:{this._zoomInternal(-E,S,P);break}}this.dispatchEvent({type:"control"})},g=T=>{this._enabled&&T.preventDefault()},b=T=>{if(!this._enabled)return;if(zI(this._activePointers,So),this._getClientRect(this._elementRect),r.copy(So),i.copy(So),this._activePointers.length>=2){const E=So.x-this._activePointers[1].clientX,S=So.y-this._activePointers[1].clientY,P=Math.sqrt(E*E+S*S);s.set(0,P);const R=(this._activePointers[0].clientX+this._activePointers[1].clientX)*.5,V=(this._activePointers[0].clientY+this._activePointers[1].clientY)*.5;i.set(R,V)}if("touches"in T||"pointerType"in T&&T.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else this._state=0,(T.buttons&ks.LEFT)===ks.LEFT&&(this._state=this._state|this.mouseButtons.left),(T.buttons&ks.MIDDLE)===ks.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(T.buttons&ks.RIGHT)===ks.RIGHT&&(this._state=this._state|this.mouseButtons.right);this.dispatchEvent({type:"controlstart"})},y=()=>{if(!this._enabled)return;zI(this._activePointers,So);const T=this._domElement&&document.pointerLockElement===this._domElement,M=T?-this._activePointers[0].deltaX:i.x-So.x,E=T?-this._activePointers[0].deltaY:i.y-So.y;if(i.copy(So),((this._state>.ROTATE)===gt.ROTATE||(this._state>.TOUCH_ROTATE)===gt.TOUCH_ROTATE||(this._state>.TOUCH_DOLLY_ROTATE)===gt.TOUCH_DOLLY_ROTATE||(this._state>.TOUCH_ZOOM_ROTATE)===gt.TOUCH_ZOOM_ROTATE)&&this._rotateInternal(M,E),(this._state>.DOLLY)===gt.DOLLY||(this._state>.ZOOM)===gt.ZOOM){const S=this.dollyToCursor?(r.x-this._elementRect.x)/this._elementRect.width*2-1:0,P=this.dollyToCursor?(r.y-this._elementRect.y)/this._elementRect.height*-2+1:0;(this._state>.DOLLY)===gt.DOLLY?this._dollyInternal(E*j5,S,P):this._zoomInternal(E*j5,S,P)}if((this._state>.TOUCH_DOLLY)===gt.TOUCH_DOLLY||(this._state>.TOUCH_ZOOM)===gt.TOUCH_ZOOM||(this._state>.TOUCH_DOLLY_TRUCK)===gt.TOUCH_DOLLY_TRUCK||(this._state>.TOUCH_ZOOM_TRUCK)===gt.TOUCH_ZOOM_TRUCK||(this._state>.TOUCH_DOLLY_OFFSET)===gt.TOUCH_DOLLY_OFFSET||(this._state>.TOUCH_ZOOM_OFFSET)===gt.TOUCH_ZOOM_OFFSET||(this._state>.TOUCH_DOLLY_ROTATE)===gt.TOUCH_DOLLY_ROTATE||(this._state>.TOUCH_ZOOM_ROTATE)===gt.TOUCH_ZOOM_ROTATE){const S=So.x-this._activePointers[1].clientX,P=So.y-this._activePointers[1].clientY,R=Math.sqrt(S*S+P*P),V=s.y-R;s.set(0,R);const z=this.dollyToCursor?(i.x-this._elementRect.x)/this._elementRect.width*2-1:0,k=this.dollyToCursor?(i.y-this._elementRect.y)/this._elementRect.height*-2+1:0;(this._state>.TOUCH_DOLLY)===gt.TOUCH_DOLLY||(this._state>.TOUCH_DOLLY_ROTATE)===gt.TOUCH_DOLLY_ROTATE||(this._state>.TOUCH_DOLLY_TRUCK)===gt.TOUCH_DOLLY_TRUCK||(this._state>.TOUCH_DOLLY_OFFSET)===gt.TOUCH_DOLLY_OFFSET?this._dollyInternal(V*j5,z,k):this._zoomInternal(V*j5,z,k)}((this._state>.TRUCK)===gt.TRUCK||(this._state>.TOUCH_TRUCK)===gt.TOUCH_TRUCK||(this._state>.TOUCH_DOLLY_TRUCK)===gt.TOUCH_DOLLY_TRUCK||(this._state>.TOUCH_ZOOM_TRUCK)===gt.TOUCH_ZOOM_TRUCK)&&this._truckInternal(M,E,!1),((this._state>.OFFSET)===gt.OFFSET||(this._state>.TOUCH_OFFSET)===gt.TOUCH_OFFSET||(this._state>.TOUCH_DOLLY_OFFSET)===gt.TOUCH_DOLLY_OFFSET||(this._state>.TOUCH_ZOOM_OFFSET)===gt.TOUCH_ZOOM_OFFSET)&&this._truckInternal(M,E,!0),this.dispatchEvent({type:"control"})},x=()=>{zI(this._activePointers,So),i.copy(So),this._activePointers.length===0&&this._domElement&&(this._domElement.ownerDocument.removeEventListener("pointermove",u,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",f),this._domElement.ownerDocument.removeEventListener("touchmove",d,{passive:!1}),this._domElement.ownerDocument.removeEventListener("touchend",p),this.dispatchEvent({type:"controlend"}))};this._addAllEventListeners=T=>{this._domElement=T,this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none",this._domElement.addEventListener("pointerdown",a),d_&&this._domElement.addEventListener("mousedown",o),d_&&this._domElement.addEventListener("touchstart",l),this._domElement.addEventListener("pointercancel",f),this._domElement.addEventListener("wheel",v,{passive:!1}),this._domElement.addEventListener("contextmenu",g)},this._removeAllEventListeners=()=>{this._domElement&&(this._domElement.removeEventListener("pointerdown",a),this._domElement.removeEventListener("mousedown",o),this._domElement.removeEventListener("touchstart",l),this._domElement.removeEventListener("pointercancel",f),this._domElement.removeEventListener("wheel",v,{passive:!1}),this._domElement.removeEventListener("contextmenu",g),this._domElement.ownerDocument.removeEventListener("pointermove",u,{passive:!1}),this._domElement.ownerDocument.removeEventListener("mousemove",c),this._domElement.ownerDocument.removeEventListener("touchmove",d,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",f),this._domElement.ownerDocument.removeEventListener("mouseup",h),this._domElement.ownerDocument.removeEventListener("touchend",p))},this.cancel=()=>{this._state!==gt.NONE&&(this._state=gt.NONE,this._activePointers.length=0,x())},n&&this.connect(n),this.update(0)}get camera(){return this._camera}set camera(e){this._camera=e,this.updateCameraUp(),this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0}get enabled(){return this._enabled}set enabled(e){this._domElement&&(this._enabled=e,e?(this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none"):(this.cancel(),this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect=""))}get active(){return!this._hasRested}get currentAction(){return this._state}get distance(){return this._spherical.radius}set distance(e){this._spherical.radius===e&&this._sphericalEnd.radius===e||(this._spherical.radius=e,this._sphericalEnd.radius=e,this._needsUpdate=!0)}get azimuthAngle(){return this._spherical.theta}set azimuthAngle(e){this._spherical.theta===e&&this._sphericalEnd.theta===e||(this._spherical.theta=e,this._sphericalEnd.theta=e,this._needsUpdate=!0)}get polarAngle(){return this._spherical.phi}set polarAngle(e){this._spherical.phi===e&&this._sphericalEnd.phi===e||(this._spherical.phi=e,this._sphericalEnd.phi=e,this._needsUpdate=!0)}get boundaryEnclosesCamera(){return this._boundaryEnclosesCamera}set boundaryEnclosesCamera(e){this._boundaryEnclosesCamera=e,this._needsUpdate=!0}addEventListener(e,n){super.addEventListener(e,n)}removeEventListener(e,n){super.removeEventListener(e,n)}rotate(e,n,r=!1){return this.rotateTo(this._sphericalEnd.theta+e,this._sphericalEnd.phi+n,r)}rotateAzimuthTo(e,n=!1){return this.rotateTo(e,this._sphericalEnd.phi,n)}rotatePolarTo(e,n=!1){return this.rotateTo(this._sphericalEnd.theta,e,n)}rotateTo(e,n,r=!1){const i=Wt.MathUtils.clamp(e,this.minAzimuthAngle,this.maxAzimuthAngle),s=Wt.MathUtils.clamp(n,this.minPolarAngle,this.maxPolarAngle);this._sphericalEnd.theta=i,this._sphericalEnd.phi=s,this._sphericalEnd.makeSafe(),this._needsUpdate=!0,r||(this._spherical.theta=this._sphericalEnd.theta,this._spherical.phi=this._sphericalEnd.phi);const a=!r||ui(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&ui(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold);return this._createOnRestPromise(a)}dolly(e,n=!1){return this.dollyTo(this._sphericalEnd.radius-e,n)}dollyTo(e,n=!1){const r=this._sphericalEnd.radius,i=Wt.MathUtils.clamp(e,this.minDistance,this.maxDistance);if(this.colliderMeshes.length>=1){const o=this._collisionTest(),l=ui(o,this._spherical.radius);if(!(r>i)&&l)return Promise.resolve();this._sphericalEnd.radius=Math.min(i,o)}else this._sphericalEnd.radius=i;this._needsUpdate=!0,n||(this._spherical.radius=this._sphericalEnd.radius);const a=!n||ui(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(a)}zoom(e,n=!1){return this.zoomTo(this._zoomEnd+e,n)}zoomTo(e,n=!1){this._zoomEnd=Wt.MathUtils.clamp(e,this.minZoom,this.maxZoom),this._needsUpdate=!0,n||(this._zoom=this._zoomEnd);const r=!n||ui(this._zoom,this._zoomEnd,this.restThreshold);return this._createOnRestPromise(r)}pan(e,n,r=!1){return console.warn("`pan` has been renamed to `truck`"),this.truck(e,n,r)}truck(e,n,r=!1){this._camera.updateMatrix(),oc.setFromMatrixColumn(this._camera.matrix,0),lc.setFromMatrixColumn(this._camera.matrix,1),oc.multiplyScalar(e),lc.multiplyScalar(-n);const i=zn.copy(oc).add(lc),s=kr.copy(this._targetEnd).add(i);return this.moveTo(s.x,s.y,s.z,r)}forward(e,n=!1){zn.setFromMatrixColumn(this._camera.matrix,0),zn.crossVectors(this._camera.up,zn),zn.multiplyScalar(e);const r=kr.copy(this._targetEnd).add(zn);return this.moveTo(r.x,r.y,r.z,n)}moveTo(e,n,r,i=!1){const s=zn.set(e,n,r).sub(this._targetEnd);this._encloseToBoundary(this._targetEnd,s,this.boundaryFriction),this._needsUpdate=!0,i||this._target.copy(this._targetEnd);const a=!i||ui(this._target.x,this._targetEnd.x,this.restThreshold)&&ui(this._target.y,this._targetEnd.y,this.restThreshold)&&ui(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(a)}fitToBox(e,n,{cover:r=!1,paddingLeft:i=0,paddingRight:s=0,paddingBottom:a=0,paddingTop:o=0}={}){const l=[],u=e.isBox3?D1.copy(e):D1.setFromObject(e);u.isEmpty()&&(console.warn("camera-controls: fitTo() cannot be used with an empty box. Aborting"),Promise.resolve());const c=u_(this._sphericalEnd.theta,l_),d=u_(this._sphericalEnd.phi,l_);l.push(this.rotateTo(c,d,n));const f=zn.setFromSpherical(this._sphericalEnd).normalize(),h=v_.setFromUnitVectors(f,OI),p=ui(Math.abs(f.y),1);p&&h.multiply(UI.setFromAxisAngle(Z5,c)),h.multiply(this._yAxisUpSpaceInverse);const m=m_.makeEmpty();kr.copy(u.min).applyQuaternion(h),m.expandByPoint(kr),kr.copy(u.min).setX(u.max.x).applyQuaternion(h),m.expandByPoint(kr),kr.copy(u.min).setY(u.max.y).applyQuaternion(h),m.expandByPoint(kr),kr.copy(u.max).setZ(u.min.z).applyQuaternion(h),m.expandByPoint(kr),kr.copy(u.min).setZ(u.max.z).applyQuaternion(h),m.expandByPoint(kr),kr.copy(u.max).setY(u.min.y).applyQuaternion(h),m.expandByPoint(kr),kr.copy(u.max).setX(u.min.x).applyQuaternion(h),m.expandByPoint(kr),kr.copy(u.max).applyQuaternion(h),m.expandByPoint(kr),m.min.x-=i,m.min.y-=a,m.max.x+=s,m.max.y+=o,h.setFromUnitVectors(OI,f),p&&h.premultiply(UI.invert()),h.premultiply(this._yAxisUpSpace);const v=m.getSize(zn),g=m.getCenter(kr).applyQuaternion(h);if(Wm(this._camera)){const b=this.getDistanceToFitBox(v.x,v.y,v.z,r);l.push(this.moveTo(g.x,g.y,g.z,n)),l.push(this.dollyTo(b,n)),l.push(this.setFocalOffset(0,0,0,n))}else if(Th(this._camera)){const b=this._camera,y=b.right-b.left,x=b.top-b.bottom,T=r?Math.max(y/v.x,x/v.y):Math.min(y/v.x,x/v.y);l.push(this.moveTo(g.x,g.y,g.z,n)),l.push(this.zoomTo(T,n)),l.push(this.setFocalOffset(0,0,0,n))}return Promise.all(l)}fitToSphere(e,n){const r=[],s=e instanceof Wt.Sphere?II.copy(e):Sht(e,II);if(r.push(this.moveTo(s.center.x,s.center.y,s.center.z,n)),Wm(this._camera)){const a=this.getDistanceToFitSphere(s.radius);r.push(this.dollyTo(a,n))}else if(Th(this._camera)){const a=this._camera.right-this._camera.left,o=this._camera.top-this._camera.bottom,l=2*s.radius,u=Math.min(a/l,o/l);r.push(this.zoomTo(u,n))}return r.push(this.setFocalOffset(0,0,0,n)),Promise.all(r)}setLookAt(e,n,r,i,s,a,o=!1){const l=kr.set(i,s,a),u=zn.set(e,n,r);this._targetEnd.copy(l),this._sphericalEnd.setFromVector3(u.sub(l).applyQuaternion(this._yAxisUpSpace)),this.normalizeRotations(),this._needsUpdate=!0,o||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const c=!o||ui(this._target.x,this._targetEnd.x,this.restThreshold)&&ui(this._target.y,this._targetEnd.y,this.restThreshold)&&ui(this._target.z,this._targetEnd.z,this.restThreshold)&&ui(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&ui(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&ui(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(c)}lerpLookAt(e,n,r,i,s,a,o,l,u,c,d,f,h,p=!1){const m=zn.set(i,s,a),v=kr.set(e,n,r);cu.setFromVector3(v.sub(m).applyQuaternion(this._yAxisUpSpace));const g=Vg.set(c,d,f),b=kr.set(o,l,u);YS.setFromVector3(b.sub(g).applyQuaternion(this._yAxisUpSpace)),this._targetEnd.copy(m.lerp(g,h));const y=YS.theta-cu.theta,x=YS.phi-cu.phi,T=YS.radius-cu.radius;this._sphericalEnd.set(cu.radius+T*h,cu.phi+x*h,cu.theta+y*h),this.normalizeRotations(),this._needsUpdate=!0,p||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const M=!p||ui(this._target.x,this._targetEnd.x,this.restThreshold)&&ui(this._target.y,this._targetEnd.y,this.restThreshold)&&ui(this._target.z,this._targetEnd.z,this.restThreshold)&&ui(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&ui(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&ui(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(M)}setPosition(e,n,r,i=!1){return this.setLookAt(e,n,r,this._targetEnd.x,this._targetEnd.y,this._targetEnd.z,i)}setTarget(e,n,r,i=!1){const s=this.getPosition(zn),a=this.setLookAt(s.x,s.y,s.z,e,n,r,i);return this._sphericalEnd.phi=Wt.MathUtils.clamp(this.polarAngle,this.minPolarAngle,this.maxPolarAngle),a}setFocalOffset(e,n,r,i=!1){this._focalOffsetEnd.set(e,n,r),this._needsUpdate=!0,i||this._focalOffset.copy(this._focalOffsetEnd),this._affectOffset=!ci(e)||!ci(n)||!ci(r);const s=!i||ui(this._focalOffset.x,this._focalOffsetEnd.x,this.restThreshold)&&ui(this._focalOffset.y,this._focalOffsetEnd.y,this.restThreshold)&&ui(this._focalOffset.z,this._focalOffsetEnd.z,this.restThreshold);return this._createOnRestPromise(s)}setOrbitPoint(e,n,r){this._camera.updateMatrixWorld(),oc.setFromMatrixColumn(this._camera.matrixWorldInverse,0),lc.setFromMatrixColumn(this._camera.matrixWorldInverse,1),Am.setFromMatrixColumn(this._camera.matrixWorldInverse,2);const i=zn.set(e,n,r),s=i.distanceTo(this._camera.position),a=i.sub(this._camera.position);oc.multiplyScalar(a.x),lc.multiplyScalar(a.y),Am.multiplyScalar(a.z),zn.copy(oc).add(lc).add(Am),zn.z=zn.z+s,this.dollyTo(s,!1),this.setFocalOffset(-zn.x,zn.y,-zn.z,!1),this.moveTo(e,n,r,!1)}setBoundary(e){if(!e){this._boundary.min.set(-1/0,-1/0,-1/0),this._boundary.max.set(1/0,1/0,1/0),this._needsUpdate=!0;return}this._boundary.copy(e),this._boundary.clampPoint(this._targetEnd,this._targetEnd),this._needsUpdate=!0}setViewport(e,n,r,i){if(e===null){this._viewport=null;return}this._viewport=this._viewport||new Wt.Vector4,typeof e=="number"?this._viewport.set(e,n,r,i):this._viewport.copy(e)}getDistanceToFitBox(e,n,r,i=!1){if(kI(this._camera,"getDistanceToFitBox"))return this._spherical.radius;const s=e/n,a=this._camera.getEffectiveFOV()*Wt.MathUtils.DEG2RAD,o=this._camera.aspect;return((i?s>o:sr.pointerId===e?(n=r,!0):!1),n}_encloseToBoundary(e,n,r){const i=n.lengthSq();if(i===0)return e;const s=kr.copy(n).add(e),o=this._boundary.clampPoint(s,Vg).sub(s),l=o.lengthSq();if(l===0)return e.add(n);if(l===i)return e;if(r===0)return e.add(n).add(o);{const u=1+r*l/n.dot(o);return e.add(kr.copy(n).multiplyScalar(u)).add(o.multiplyScalar(1-r))}}_updateNearPlaneCorners(){if(Wm(this._camera)){const e=this._camera,n=e.near,r=e.getEffectiveFOV()*Wt.MathUtils.DEG2RAD,i=Math.tan(r*.5)*n,s=i*e.aspect;this._nearPlaneCorners[0].set(-s,-i,0),this._nearPlaneCorners[1].set(s,-i,0),this._nearPlaneCorners[2].set(s,i,0),this._nearPlaneCorners[3].set(-s,i,0)}else if(Th(this._camera)){const e=this._camera,n=1/e.zoom,r=e.left*n,i=e.right*n,s=e.top*n,a=e.bottom*n;this._nearPlaneCorners[0].set(r,s,0),this._nearPlaneCorners[1].set(i,s,0),this._nearPlaneCorners[2].set(i,a,0),this._nearPlaneCorners[3].set(r,a,0)}}_collisionTest(){let e=1/0;if(!(this.colliderMeshes.length>=1)||kI(this._camera,"_collisionTest"))return e;const r=zn.setFromSpherical(this._spherical).divideScalar(this._spherical.radius);NI.lookAt(f_,r,this._camera.up);for(let i=0;i<4;i++){const s=kr.copy(this._nearPlaneCorners[i]);s.applyMatrix4(NI);const a=Vg.addVectors(this._target,s);J5.set(a,r),J5.far=this._spherical.radius+1;const o=J5.intersectObjects(this.colliderMeshes);o.length!==0&&o[0].distance{const r=()=>{this.removeEventListener("rest",r),n()};this.addEventListener("rest",r)}))}_addAllEventListeners(e){}_removeAllEventListeners(){}}function Sht(t,e){const n=e,r=n.center;D1.makeEmpty(),t.traverseVisible(s=>{s.isMesh&&D1.expandByObject(s)}),D1.getCenter(r);let i=0;return t.traverseVisible(s=>{if(!s.isMesh)return;const a=s,o=a.geometry.clone();if(o.applyMatrix4(a.matrixWorld),o.isBufferGeometry){const u=o.attributes.position;for(let c=0,d=u.count;cn&&(n=i,e=r)}return e}function T_(t,e){e.set(t)}function w_(t,e,n){let r,i;for(let s=0;s<3;s++){const a=s+3;r=t[s],i=e[s],n[s]=ri?r:i}}function H5(t,e,n){for(let r=0;r<3;r++){const i=e[t+2*r],s=e[t+2*r+1],a=i-s,o=i+s;an[r+3]&&(n[r+3]=o)}}function HS(t){const e=t[3]-t[0],n=t[4]-t[1],r=t[5]-t[2];return 2*(e*n+n*r+r*e)}function Mht(t,e){if(!t.index){const n=t.attributes.position.count,r=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer;let i;n>65535?i=new Uint32Array(new r(4*n)):i=new Uint16Array(new r(2*n)),t.setIndex(new un(i,1));for(let s=0;si-s);for(let i=0;il&&(l=E),g&&xp&&(p=x);const S=t[b+2],P=t[b+3],R=S-P,V=S+P;Ru&&(u=V),g&&Sm&&(m=S);const z=t[b+4],k=t[b+5],N=z-k,q=z+k;Nc&&(c=q),g&&zv&&(v=z)}r[0]=s,r[1]=a,r[2]=o,r[3]=l,r[4]=u,r[5]=c,g&&(i[0]=d,i[1]=f,i[2]=h,i[3]=p,i[4]=m,i[5]=v)}function Rht(t,e,n,r){let i=1/0,s=1/0,a=1/0,o=-1/0,l=-1/0,u=-1/0;for(let c=e*6,d=(e+n)*6;co&&(o=f);const h=t[c+2];hl&&(l=h);const p=t[c+4];pu&&(u=p)}r[0]=i,r[1]=s,r[2]=a,r[3]=o,r[4]=l,r[5]=u}function Vht(t,e,n,r,i){let s=n,a=n+r-1;const o=i.pos,l=i.axis*2;for(;;){for(;s<=a&&e[s*6+l]=o;)a--;if(st.candidate-e.candidate,mh=new Array(Ld).fill().map(()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0})),Q5=new Float32Array(6);function kht(t,e,n,r,i,s){let a=-1,o=0;if(s===kD)a=x_(e),a!==-1&&(o=(e[a]+e[a+3])/2);else if(s===Tht)a=x_(t),a!==-1&&(o=Oht(n,r,i,a));else if(s===wht){const l=HS(t);let u=LI*i;const c=r*6,d=(r+i)*6;for(let f=0;f<3;f++){const h=e[f],v=(e[f+3]-h)/Ld;if(i=E.candidate?H5(x,n,E.rightCacheBounds):(H5(x,n,E.leftCacheBounds),E.count++)}}for(let x=0;x=Ld&&(M=Ld-1);const E=mh[M];E.count++,H5(y,n,E.bounds)}const g=mh[Ld-1];T_(g.bounds,g.rightCacheBounds);for(let y=Ld-2;y>=0;y--){const x=mh[y],T=mh[y+1];w_(x.bounds,T.rightCacheBounds,x.rightCacheBounds)}let b=0;for(let y=0;yM&&(M=y),x>M&&(M=x);const E=(M-T)/2,S=g*2;s[h+S+0]=T+E,s[h+S+1]=E+(Math.abs(T)+E)*Eht,Te[g+3]&&(e[g+3]=M)}}return s}function Uht(t,e){function n(g){f&&f(g/h)}function r(g,b,y,x=null,T=0){if(!p&&T>=l&&(p=!0,u&&(console.warn(`MeshBVH: Max depth of ${l} reached when generating BVH. Consider increasing maxDepth.`),console.warn(t))),y<=c||T>=l)return n(b+y),g.offset=b,g.count=y,g;const M=kht(g.boundingData,x,a,b,y,d);if(M.axis===-1)return n(b+y),g.offset=b,g.count=y,g;const E=Vht(o,a,b,y,M);if(E===b||E===b+y)n(b+y),g.offset=b,g.count=y;else{g.splitAxis=M.axis;const S=new B5,P=b,R=E-b;g.left=S,S.boundingData=new Float32Array(6),XI(a,P,R,S.boundingData,s),r(S,P,R,s,T+1);const V=new B5,z=E,k=y-R;g.right=V,V.boundingData=new Float32Array(6),XI(a,z,k,V.boundingData,s),r(V,z,k,s,T+1)}return g}Mht(t,e);const i=new Float32Array(6),s=new Float32Array(6),a=Iht(t,i),o=t.index.array,l=e.maxDepth,u=e.verbose,c=e.maxLeafTris,d=e.strategy,f=e.onProgress,h=t.index.count/3;let p=!1;const m=[],v=Pht(t);if(v.length===1){const g=v[0],b=new B5;b.boundingData=i,Rht(a,g.offset,g.count,s),r(b,g.offset,g.count,s),m.push(b)}else for(let g of v){const b=new B5;b.boundingData=new Float32Array(6),XI(a,g.offset,g.count,b.boundingData,s),r(b,g.offset,g.count,s),m.push(b)}return m}function Nht(t,e){const n=Uht(t,e);let r,i,s;const a=[],o=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer;for(let c=0;cMath.pow(2,32))throw new Error("MeshBVH: Cannot store child pointer greater than 32 bits.");return i[f+6]=y/4,y=u(y,g),i[f+7]=b,y}}}class Mf{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(e,n){let r=1/0,i=-1/0;for(let s=0,a=e.length;si?l:i}this.min=r,this.max=i}setFromPoints(e,n){let r=1/0,i=-1/0;for(let s=0,a=n.length;si?l:i}this.min=r,this.max=i}isSeparated(e){return this.min>e.max||e.min>this.max}}Mf.prototype.setFromBox=function(){const t=new U;return function(n,r){const i=r.min,s=r.max;let a=1/0,o=-1/0;for(let l=0;l<=1;l++)for(let u=0;u<=1;u++)for(let c=0;c<=1;c++){t.x=i.x*l+s.x*(1-l),t.y=i.y*u+s.y*(1-u),t.z=i.z*c+s.z*(1-c);const d=n.dot(t);a=Math.min(d,a),o=Math.max(d,o)}this.min=a,this.max=o}}();const Lht=function(){const t=new U,e=new U,n=new U;return function(i,s,a){const o=i.start,l=t,u=s.start,c=e;n.subVectors(o,u),t.subVectors(i.end,i.start),e.subVectors(s.end,s.start);const d=n.dot(c),f=c.dot(l),h=c.dot(c),p=n.dot(l),v=l.dot(l)*h-f*f;let g,b;v!==0?g=(d*f-p*h)/v:g=0,b=(d+g*f)/h,a.x=g,a.y=b}}(),OD=function(){const t=new Oe,e=new U,n=new U;return function(i,s,a,o){Lht(i,s,t);let l=t.x,u=t.y;if(l>=0&&l<=1&&u>=0&&u<=1){i.at(l,a),s.at(u,o);return}else if(l>=0&&l<=1){u<0?s.at(0,o):s.at(1,o),i.closestPointToPoint(o,!0,a);return}else if(u>=0&&u<=1){l<0?i.at(0,a):i.at(1,a),s.closestPointToPoint(a,!0,o);return}else{let c;l<0?c=i.start:c=i.end;let d;u<0?d=s.start:d=s.end;const f=e,h=n;if(i.closestPointToPoint(d,!0,e),s.closestPointToPoint(c,!0,n),f.distanceToSquared(d)<=h.distanceToSquared(c)){a.copy(f),o.copy(d);return}else{a.copy(c),o.copy(h);return}}}}(),Xht=function(){const t=new U,e=new U,n=new ri,r=new pl;return function(s,a){const{radius:o,center:l}=s,{a:u,b:c,c:d}=a;if(r.start=u,r.end=c,r.closestPointToPoint(l,!0,t).distanceTo(l)<=o||(r.start=u,r.end=d,r.closestPointToPoint(l,!0,t).distanceTo(l)<=o)||(r.start=c,r.end=d,r.closestPointToPoint(l,!0,t).distanceTo(l)<=o))return!0;const m=a.getPlane(n);if(Math.abs(m.distanceToPoint(l))<=o){const g=m.projectPoint(l,e);if(a.containsPoint(g))return!0}return!1}}(),Cht=1e-15;function zg(t){return Math.abs(t)new U),this.satBounds=new Array(4).fill().map(()=>new Mf),this.points=[this.a,this.b,this.c],this.sphere=new so,this.plane=new ri,this.needsUpdate=!0}intersectsSphere(e){return Xht(e,this)}update(){const e=this.a,n=this.b,r=this.c,i=this.points,s=this.satAxes,a=this.satBounds,o=s[0],l=a[0];this.getNormal(o),l.setFromPoints(o,i);const u=s[1],c=a[1];u.subVectors(e,n),c.setFromPoints(u,i);const d=s[2],f=a[2];d.subVectors(n,r),f.setFromPoints(d,i);const h=s[3],p=a[3];h.subVectors(r,e),p.setFromPoints(h,i),this.sphere.setFromPoints(this.points),this.plane.setFromNormalAndCoplanarPoint(o,e),this.needsUpdate=!1}}td.prototype.closestPointToSegment=function(){const t=new U,e=new U,n=new pl;return function(i,s=null,a=null){const{start:o,end:l}=i,u=this.points;let c,d=1/0;for(let f=0;f<3;f++){const h=(f+1)%3;n.start.copy(u[f]),n.end.copy(u[h]),OD(n,i,t,e),c=t.distanceToSquared(e),c1-1e-10){const g=this.satBounds,b=this.satAxes;n[0]=h.a,n[1]=h.b,n[2]=h.c;for(let T=0;T<4;T++){const M=g[T],E=b[T];if(r.setFromPoints(E,n),M.isSeparated(r))return!1}const y=h.satBounds,x=h.satAxes;e[0]=this.a,e[1]=this.b,e[2]=this.c;for(let T=0;T<4;T++){const M=y[T],E=x[T];if(r.setFromPoints(E,e),M.isSeparated(r))return!1}for(let T=0;T<4;T++){const M=b[T];for(let E=0;E<4;E++){const S=x[E];if(s.crossVectors(M,S),r.setFromPoints(s,e),i.setFromPoints(s,n),r.isSeparated(i))return!1}}return p&&(console.warn("ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0."),p.start.set(0,0,0),p.end.set(0,0,0)),!0}else{const g=this.points;let b=!1,y=0;for(let k=0;k<3;k++){const N=g[k],q=g[(k+1)%3];u.start.copy(N),u.end.copy(q),u.delta(a);const L=b?c.start:c.end,A=zg(v.distanceToPoint(N));if(zg(v.normal.dot(a))&&A){c.copy(u),y=2;break}if((v.intersectLine(u,L)||A)&&!zg(L.distanceTo(q))){if(y++,b)break;b=!0}}if(y===1&&this.containsPoint(c.end))return p&&(p.start.copy(c.end),p.end.copy(c.end)),!0;if(y!==2)return!1;const x=h.points;let T=!1,M=0;for(let k=0;k<3;k++){const N=x[k],q=x[(k+1)%3];u.start.copy(N),u.end.copy(q),u.delta(o);const L=T?d.start:d.end,A=zg(m.distanceToPoint(N));if(zg(m.normal.dot(o))&&A){d.copy(u),M=2;break}if((m.intersectLine(u,L)||A)&&!zg(L.distanceTo(q))){if(M++,T)break;T=!0}}if(M===1&&this.containsPoint(d.end))return p&&(p.start.copy(d.end),p.end.copy(d.end)),!0;if(M!==2)return!1;if(c.delta(a),d.delta(o),a.dot(o)<0){let k=d.start;d.start=d.end,d.end=k}const E=c.start.dot(a),S=c.end.dot(a),P=d.start.dot(a),R=d.end.dot(a),V=S0?p.start.copy(c.start):p.start.copy(d.start),l.subVectors(c.end,d.end),l.dot(a)<0?p.end.copy(c.end):p.end.copy(d.end)),!0)}}}();td.prototype.distanceToPoint=function(){const t=new U;return function(n){return this.closestPointToPoint(n,t),n.distanceTo(t)}}();td.prototype.distanceToTriangle=function(){const t=new U,e=new U,n=["a","b","c"],r=new pl,i=new pl;return function(a,o=null,l=null){const u=o||l?r:null;if(this.intersectsTriangle(a,u))return(o||l)&&(o&&u.getCenter(o),l&&u.getCenter(l)),0;let c=1/0;for(let d=0;d<3;d++){let f;const h=n[d],p=a[h];this.closestPointToPoint(p,t),f=p.distanceToSquared(t),fnew U),this.satAxes=new Array(3).fill().map(()=>new U),this.satBounds=new Array(3).fill().map(()=>new Mf),this.alignedSatBounds=new Array(3).fill().map(()=>new Mf),this.needsUpdate=!1,e&&this.min.copy(e),n&&this.max.copy(n),r&&this.matrix.copy(r)}set(e,n,r){this.min.copy(e),this.max.copy(n),this.matrix.copy(r),this.needsUpdate=!0}copy(e){this.min.copy(e.min),this.max.copy(e.max),this.matrix.copy(e.matrix),this.needsUpdate=!0}}nd.prototype.update=function(){return function(){const e=this.matrix,n=this.min,r=this.max,i=this.points;for(let u=0;u<=1;u++)for(let c=0;c<=1;c++)for(let d=0;d<=1;d++){const f=1*u|2*c|4*d,h=i[f];h.x=u?r.x:n.x,h.y=c?r.y:n.y,h.z=d?r.z:n.z,h.applyMatrix4(e)}const s=this.satBounds,a=this.satAxes,o=i[0];for(let u=0;u<3;u++){const c=a[u],d=s[u],f=1<new pl),n=new Array(12).fill().map(()=>new pl),r=new U,i=new U;return function(a,o=0,l=null,u=null){if(this.needsUpdate&&this.update(),this.intersectsBox(a))return(l||u)&&(a.getCenter(i),this.closestPointToPoint(i,r),a.closestPointToPoint(r,i),l&&l.copy(r),u&&u.copy(i)),0;const c=o*o,d=a.min,f=a.max,h=this.points;let p=1/0;for(let v=0;v<8;v++){const g=h[v];i.copy(g).clamp(d,f);const b=g.distanceToSquared(i);if(b=0;let h,p;f?(h=P6(t),p=R6(t,o)):(h=R6(t,o),p=P6(t));const v=LP(h,s,r,NP)?Z8(h,e,n,r):null;if(v){const y=v.point[c];if(f?y<=s[p+u]:y>=s[p+u+3])return v}const b=LP(p,s,r,NP)?Z8(p,e,n,r):null;return v&&b?v.distance<=b.distance?v:b:v||b||null}}const Fht=function(){let t,e;const n=[],r=new Ame(()=>new Jt);return function(...a){t=r.getPrimitive(),e=r.getPrimitive(),n.push(t,e);const o=i(...a);r.releasePrimitive(t),r.releasePrimitive(e),n.pop(),n.pop();const l=n.length;return l>0&&(e=n[l-1],t=n[l-2]),o};function i(s,a,o,l,u=null,c=0,d=0){function f(y){let x=y*2,T=vp,M=gp;for(;!qh(x,T);)y=P6(y),x=y*2;return W1(y,M)}function h(y){let x=y*2,T=vp,M=gp;for(;!qh(x,T);)y=R6(y,M),x=y*2;return W1(y,M)+M6(x,T)}let p=s*2,m=Ly,v=vp,g=gp;if(qh(p,v)){const y=W1(s,g),x=M6(p,v);return Ru(s,m,t),l(y,x,!1,d,c+s,t)}else{const y=P6(s),x=R6(s,g);let T=y,M=x,E,S,P,R;if(u&&(P=t,R=e,Ru(T,m,P),Ru(M,m,R),E=u(P),S=u(R),Si.intersectsBox(S),intersectsTriangle:S=>{S.a.applyMatrix4(u),S.b.applyMatrix4(u),S.c.applyMatrix4(u),S.needsUpdate=!0;for(let P=T*3,R=(M+T)*3;Pnew td);class mx{static serialize(e,n={}){if(n.isBufferGeometry)return console.warn("MeshBVH.serialize: The arguments for the function have changed. See documentation for new signature."),mx.serialize(arguments[0],{cloneBuffers:arguments[2]===void 0?!0:arguments[2]});n={cloneBuffers:!0,...n};const r=e.geometry,i=e._roots,s=r.getIndex();let a;return n.cloneBuffers?a={roots:i.map(o=>o.slice()),index:s.array.slice()}:a={roots:i,index:s.array},a}static deserialize(e,n,r={}){if(typeof r=="boolean")return console.warn("MeshBVH.deserialize: The arguments for the function have changed. See documentation for new signature."),mx.deserialize(arguments[0],arguments[1],{setIndex:arguments[2]===void 0?!0:arguments[2]});r={setIndex:!0,...r};const{index:i,roots:s}=e,a=new mx(n,{...r,[CI]:!0});if(a._roots=s,r.setIndex){const o=n.getIndex();if(o===null){const l=new un(e.index,1,!1);n.setIndex(l)}else o.array!==i&&(o.array.set(i),o.needsUpdate=!0)}return a}constructor(e,n={}){if(e.isBufferGeometry){if(e.index&&e.index.isInterleavedBufferAttribute)throw new Error("MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.")}else throw new Error("MeshBVH: Only BufferGeometries are supported.");if(n=Object.assign({strategy:kD,maxDepth:40,maxLeafTris:10,verbose:!0,useSharedArrayBuffer:!1,setBoundingBox:!0,onProgress:null,[CI]:!1},n),n.useSharedArrayBuffer&&typeof SharedArrayBuffer>"u")throw new Error("MeshBVH: SharedArrayBuffer is not available.");this._roots=null,n[CI]||(this._roots=Nht(e,n),!e.boundingBox&&n.setBoundingBox&&(e.boundingBox=this.getBoundingBox(new Jt))),this.geometry=e}refit(e=null){e&&Array.isArray(e)&&(e=new Set(e));const n=this.geometry,r=n.index.array,i=n.attributes.position;let s,a,o,l,u=0;const c=this._roots;for(let f=0,h=c.length;fM&&(M=z),kE&&(E=k),NS&&(S=N)}return l[f+0]!==y||l[f+1]!==x||l[f+2]!==T||l[f+3]!==M||l[f+4]!==E||l[f+5]!==S?(l[f+0]=y,l[f+1]=x,l[f+2]=T,l[f+3]=M,l[f+4]=E,l[f+5]=S,!0):!1}else{const g=f+8,b=a[f+6],y=g+h,x=b+h;let T=p,M=!1,E=!1;e?T||(M=e.has(y),E=e.has(x),T=!M&&!E):(M=!0,E=!0);const S=T||M,P=T||E;let R=!1;S&&(R=d(g,h,T));let V=!1;P&&(V=d(b,h,T));const z=R||V;if(z)for(let k=0;k<3;k++){const N=g+k,q=b+k,L=l[N],A=l[N+3],Z=l[q],j=l[q+3];l[f+k]=Lj?A:j}return z}}}traverse(e,n=0){const r=this._roots[n],i=new Uint32Array(r),s=new Uint16Array(r);a(0);function a(o,l=0){const u=o*2,c=s[u+15]===F8;if(c){const d=i[o+6],f=s[u+14];e(l,c,new Float32Array(r,o*4,6),d,f)}else{const d=o+W7/4,f=i[o+6],h=i[o+7];e(l,c,new Float32Array(r,o*4,6),h)||(a(d,l+1),a(f,l+1))}}}raycast(e,n=Ki){const r=this._roots,i=this.geometry,s=[],a=n.isMaterial,o=Array.isArray(n),l=i.groups,u=a?n.side:n;for(let c=0,d=r.length;c{const g=p*3;return f(h,g,g+1,g+2,m,v)}}e={boundsTraverseOrder:r,intersectsBounds:e,intersectsTriangle:n,intersectsRange:null},console.warn("MeshBVH: Shapecast function signature has changed and now takes an object of callbacks as a second argument. See docs for new signature.")}const s=uc.getPrimitive();let{boundsTraverseOrder:a,intersectsBounds:o,intersectsRange:l,intersectsTriangle:u}=e;if(l&&u){const f=l;l=(h,p,m,v,g)=>f(h,p,m,v,g)?!0:V_(h,p,i,u,m,v,s)}else l||(u?l=(f,h,p,m)=>V_(f,h,i,u,p,m,s):l=(f,h,p)=>p);let c=!1,d=0;for(const f of this._roots){if(x3(f),c=Fht(0,i,o,l,a,d),tE(),c)break;d+=f.byteLength}return uc.releasePrimitive(s),c}bvhcast(e,n,r){let{intersectsRanges:i,intersectsTriangles:s}=r;const a=this.geometry.index,o=this.geometry.attributes.position,l=e.geometry.index,u=e.geometry.attributes.position;kg.copy(n).invert();const c=uc.getPrimitive(),d=uc.getPrimitive();if(s){let p=function(m,v,g,b,y,x,T,M){for(let E=g,S=g+b;EqI.intersectsBox(p),intersectsRange:(p,m,v,g,b,y)=>(KI.copy(y),KI.applyMatrix4(kg),e.shapecast({intersectsBounds:x=>KI.intersectsBox(x),intersectsRange:(x,T,M,E,S)=>i(p,m,x,T,g,b,E,S)}))});return uc.releasePrimitive(c),uc.releasePrimitive(d),f}intersectsBox(e,n){return Gm.set(e.min,e.max,n),Gm.needsUpdate=!0,this.shapecast({intersectsBounds:r=>Gm.intersectsBox(r),intersectsTriangle:r=>Gm.intersectsTriangle(r)})}intersectsSphere(e){return this.shapecast({intersectsBounds:n=>e.intersectsBox(n),intersectsTriangle:n=>n.intersectsSphere(e)})}closestPointToGeometry(e,n,r={},i={},s=0,a=1/0){e.boundingBox||e.computeBoundingBox(),Gm.set(e.boundingBox.min,e.boundingBox.max,n),Gm.needsUpdate=!0;const o=this.geometry,l=o.attributes.position,u=o.index,c=e.attributes.position,d=e.index,f=uc.getPrimitive(),h=uc.getPrimitive();let p=nE,m=Zht,v=null,g=null;i&&(v=Jht,g=Yht);let b=1/0,y=null,x=null;return kg.copy(n).invert(),QS.matrix.copy(kg),this.shapecast({boundsTraverseOrder:T=>Gm.distanceToBox(T),intersectsBounds:(T,M,E)=>E{if(e.boundsTree)return e.boundsTree.shapecast({boundsTraverseOrder:E=>QS.distanceToBox(E),intersectsBounds:(E,S,P)=>P{for(let P=E*3,R=(E+S)*3;P(_S.copy(e).clamp(c.min,c.max),_S.distanceToSquared(e)),intersectsBounds:(c,d,f)=>f{c.closestPointToPoint(e,_S);const f=e.distanceToSquared(_S);return f{Ru(0,new Float32Array(r),z_),e.union(z_)}),e}}const k_=new Jt;class Bht extends cn{get isMesh(){return!this.displayEdges}get isLineSegments(){return this.displayEdges}get isLine(){return this.displayEdges}constructor(e,n,r=10,i=0){super(),this.material=n,this.geometry=new Lt,this.name="MeshBVHRootVisualizer",this.depth=r,this.displayParents=!1,this.mesh=e,this.displayEdges=!0,this._group=i}raycast(){}update(){const e=this.geometry,n=this.mesh.geometry.boundsTree,r=this._group;if(e.dispose(),this.visible=!1,n){const i=this.depth-1,s=this.displayParents;let a=0;n.traverse((f,h)=>{if(f===i||h)return a++,!0;s&&a++},r);let o=0;const l=new Float32Array(8*3*a);n.traverse((f,h,p)=>{const m=f===i||h;if(m||s){Ru(0,p,k_);const{min:v,max:g}=k_;for(let b=-1;b<=1;b+=2){const y=b<0?v.x:g.x;for(let x=-1;x<=1;x+=2){const T=x<0?v.y:g.y;for(let M=-1;M<=1;M+=2){const E=M<0?v.z:g.z;l[o+0]=y,l[o+1]=T,l[o+2]=E,o+=3}}}return m}},r);let u,c;this.displayEdges?c=new Uint8Array([0,4,1,5,2,6,3,7,0,2,1,3,4,6,5,7,0,1,2,3,4,5,6,7]):c=new Uint8Array([0,1,2,2,1,3,4,6,5,6,7,5,1,4,5,0,4,1,2,3,6,3,7,6,0,2,4,2,6,4,1,5,3,3,5,7]),l.length>65535?u=new Uint32Array(c.length*a):u=new Uint16Array(c.length*a);const d=c.length;for(let f=0;fn;){const r=this._roots.pop();r.geometry.dispose(),this.remove(r)}for(let r=0;r=this._roots.length){const s=new Bht(this.mesh,this.edgeMaterial,this.depth,r);this.add(s),this._roots.push(s)}const i=this._roots[r];i.depth=this.depth,i.mesh=this.mesh,i.displayParents=this.displayParents,i.displayEdges=this.displayEdges,i.material=this.displayEdges?this.edgeMaterial:this.meshMaterial,i.update()}}updateMatrixWorld(...e){this.position.copy(this.mesh.position),this.rotation.copy(this.mesh.rotation),this.scale.copy(this.mesh.scale),super.updateMatrixWorld(...e)}copy(e){this.depth=e.depth,this.mesh=e.mesh}clone(){return new ID(this.mesh,this.depth)}dispose(){this.edgeMaterial.dispose(),this.meshMaterial.dispose();const e=this.children;for(let n=0,r=e.length;nn&&(n=i,e=r)}return e}function S_(t,e){e.set(t)}function x_(t,e,n){let r,i;for(let s=0;s<3;s++){const a=s+3;r=t[s],i=e[s],n[s]=ri?r:i}}function H5(t,e,n){for(let r=0;r<3;r++){const i=e[t+2*r],s=e[t+2*r+1],a=i-s,o=i+s;an[r+3]&&(n[r+3]=o)}}function BS(t){const e=t[3]-t[0],n=t[4]-t[1],r=t[5]-t[2];return 2*(e*n+n*r+r*e)}function Pht(t,e){if(!t.index){const n=t.attributes.position.count,r=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer;let i;n>65535?i=new Uint32Array(new r(4*n)):i=new Uint16Array(new r(2*n)),t.setIndex(new un(i,1));for(let s=0;si-s);for(let i=0;il&&(l=E),g&&xp&&(p=x);const S=t[b+2],P=t[b+3],R=S-P,V=S+P;Ru&&(u=V),g&&Sm&&(m=S);const z=t[b+4],k=t[b+5],N=z-k,q=z+k;Nc&&(c=q),g&&zv&&(v=z)}r[0]=s,r[1]=a,r[2]=o,r[3]=l,r[4]=u,r[5]=c,g&&(i[0]=d,i[1]=f,i[2]=h,i[3]=p,i[4]=m,i[5]=v)}function Vht(t,e,n,r){let i=1/0,s=1/0,a=1/0,o=-1/0,l=-1/0,u=-1/0;for(let c=e*6,d=(e+n)*6;co&&(o=f);const h=t[c+2];hl&&(l=h);const p=t[c+4];pu&&(u=p)}r[0]=i,r[1]=s,r[2]=a,r[3]=o,r[4]=l,r[5]=u}function zht(t,e,n,r,i){let s=n,a=n+r-1;const o=i.pos,l=i.axis*2;for(;;){for(;s<=a&&e[s*6+l]=o;)a--;if(st.candidate-e.candidate,mh=new Array(Ld).fill().map(()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0})),Q5=new Float32Array(6);function Oht(t,e,n,r,i,s){let a=-1,o=0;if(s===OD)a=y_(e),a!==-1&&(o=(e[a]+e[a+3])/2);else if(s===wht)a=y_(t),a!==-1&&(o=Iht(n,r,i,a));else if(s===Eht){const l=BS(t);let u=LI*i;const c=r*6,d=(r+i)*6;for(let f=0;f<3;f++){const h=e[f],v=(e[f+3]-h)/Ld;if(i=E.candidate?H5(x,n,E.rightCacheBounds):(H5(x,n,E.leftCacheBounds),E.count++)}}for(let x=0;x=Ld&&(M=Ld-1);const E=mh[M];E.count++,H5(y,n,E.bounds)}const g=mh[Ld-1];S_(g.bounds,g.rightCacheBounds);for(let y=Ld-2;y>=0;y--){const x=mh[y],T=mh[y+1];x_(x.bounds,T.rightCacheBounds,x.rightCacheBounds)}let b=0;for(let y=0;yM&&(M=y),x>M&&(M=x);const E=(M-T)/2,S=g*2;s[h+S+0]=T+E,s[h+S+1]=E+(Math.abs(T)+E)*Mht,Te[g+3]&&(e[g+3]=M)}}return s}function Nht(t,e){function n(g){f&&f(g/h)}function r(g,b,y,x=null,T=0){if(!p&&T>=l&&(p=!0,u&&(console.warn(`MeshBVH: Max depth of ${l} reached when generating BVH. Consider increasing maxDepth.`),console.warn(t))),y<=c||T>=l)return n(b+y),g.offset=b,g.count=y,g;const M=Oht(g.boundingData,x,a,b,y,d);if(M.axis===-1)return n(b+y),g.offset=b,g.count=y,g;const E=zht(o,a,b,y,M);if(E===b||E===b+y)n(b+y),g.offset=b,g.count=y;else{g.splitAxis=M.axis;const S=new B5,P=b,R=E-b;g.left=S,S.boundingData=new Float32Array(6),XI(a,P,R,S.boundingData,s),r(S,P,R,s,T+1);const V=new B5,z=E,k=y-R;g.right=V,V.boundingData=new Float32Array(6),XI(a,z,k,V.boundingData,s),r(V,z,k,s,T+1)}return g}Pht(t,e);const i=new Float32Array(6),s=new Float32Array(6),a=Uht(t,i),o=t.index.array,l=e.maxDepth,u=e.verbose,c=e.maxLeafTris,d=e.strategy,f=e.onProgress,h=t.index.count/3;let p=!1;const m=[],v=Rht(t);if(v.length===1){const g=v[0],b=new B5;b.boundingData=i,Vht(a,g.offset,g.count,s),r(b,g.offset,g.count,s),m.push(b)}else for(let g of v){const b=new B5;b.boundingData=new Float32Array(6),XI(a,g.offset,g.count,b.boundingData,s),r(b,g.offset,g.count,s),m.push(b)}return m}function Lht(t,e){const n=Nht(t,e);let r,i,s;const a=[],o=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer;for(let c=0;cMath.pow(2,32))throw new Error("MeshBVH: Cannot store child pointer greater than 32 bits.");return i[f+6]=y/4,y=u(y,g),i[f+7]=b,y}}}class Mf{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(e,n){let r=1/0,i=-1/0;for(let s=0,a=e.length;si?l:i}this.min=r,this.max=i}setFromPoints(e,n){let r=1/0,i=-1/0;for(let s=0,a=n.length;si?l:i}this.min=r,this.max=i}isSeparated(e){return this.min>e.max||e.min>this.max}}Mf.prototype.setFromBox=function(){const t=new U;return function(n,r){const i=r.min,s=r.max;let a=1/0,o=-1/0;for(let l=0;l<=1;l++)for(let u=0;u<=1;u++)for(let c=0;c<=1;c++){t.x=i.x*l+s.x*(1-l),t.y=i.y*u+s.y*(1-u),t.z=i.z*c+s.z*(1-c);const d=n.dot(t);a=Math.min(d,a),o=Math.max(d,o)}this.min=a,this.max=o}}();const Xht=function(){const t=new U,e=new U,n=new U;return function(i,s,a){const o=i.start,l=t,u=s.start,c=e;n.subVectors(o,u),t.subVectors(i.end,i.start),e.subVectors(s.end,s.start);const d=n.dot(c),f=c.dot(l),h=c.dot(c),p=n.dot(l),v=l.dot(l)*h-f*f;let g,b;v!==0?g=(d*f-p*h)/v:g=0,b=(d+g*f)/h,a.x=g,a.y=b}}(),ID=function(){const t=new Oe,e=new U,n=new U;return function(i,s,a,o){Xht(i,s,t);let l=t.x,u=t.y;if(l>=0&&l<=1&&u>=0&&u<=1){i.at(l,a),s.at(u,o);return}else if(l>=0&&l<=1){u<0?s.at(0,o):s.at(1,o),i.closestPointToPoint(o,!0,a);return}else if(u>=0&&u<=1){l<0?i.at(0,a):i.at(1,a),s.closestPointToPoint(a,!0,o);return}else{let c;l<0?c=i.start:c=i.end;let d;u<0?d=s.start:d=s.end;const f=e,h=n;if(i.closestPointToPoint(d,!0,e),s.closestPointToPoint(c,!0,n),f.distanceToSquared(d)<=h.distanceToSquared(c)){a.copy(f),o.copy(d);return}else{a.copy(c),o.copy(h);return}}}}(),Cht=function(){const t=new U,e=new U,n=new ri,r=new hl;return function(s,a){const{radius:o,center:l}=s,{a:u,b:c,c:d}=a;if(r.start=u,r.end=c,r.closestPointToPoint(l,!0,t).distanceTo(l)<=o||(r.start=u,r.end=d,r.closestPointToPoint(l,!0,t).distanceTo(l)<=o)||(r.start=c,r.end=d,r.closestPointToPoint(l,!0,t).distanceTo(l)<=o))return!0;const m=a.getPlane(n);if(Math.abs(m.distanceToPoint(l))<=o){const g=m.projectPoint(l,e);if(a.containsPoint(g))return!0}return!1}}(),Kht=1e-15;function zg(t){return Math.abs(t)new U),this.satBounds=new Array(4).fill().map(()=>new Mf),this.points=[this.a,this.b,this.c],this.sphere=new so,this.plane=new ri,this.needsUpdate=!0}intersectsSphere(e){return Cht(e,this)}update(){const e=this.a,n=this.b,r=this.c,i=this.points,s=this.satAxes,a=this.satBounds,o=s[0],l=a[0];this.getNormal(o),l.setFromPoints(o,i);const u=s[1],c=a[1];u.subVectors(e,n),c.setFromPoints(u,i);const d=s[2],f=a[2];d.subVectors(n,r),f.setFromPoints(d,i);const h=s[3],p=a[3];h.subVectors(r,e),p.setFromPoints(h,i),this.sphere.setFromPoints(this.points),this.plane.setFromNormalAndCoplanarPoint(o,e),this.needsUpdate=!1}}td.prototype.closestPointToSegment=function(){const t=new U,e=new U,n=new hl;return function(i,s=null,a=null){const{start:o,end:l}=i,u=this.points;let c,d=1/0;for(let f=0;f<3;f++){const h=(f+1)%3;n.start.copy(u[f]),n.end.copy(u[h]),ID(n,i,t,e),c=t.distanceToSquared(e),c1-1e-10){const g=this.satBounds,b=this.satAxes;n[0]=h.a,n[1]=h.b,n[2]=h.c;for(let T=0;T<4;T++){const M=g[T],E=b[T];if(r.setFromPoints(E,n),M.isSeparated(r))return!1}const y=h.satBounds,x=h.satAxes;e[0]=this.a,e[1]=this.b,e[2]=this.c;for(let T=0;T<4;T++){const M=y[T],E=x[T];if(r.setFromPoints(E,e),M.isSeparated(r))return!1}for(let T=0;T<4;T++){const M=b[T];for(let E=0;E<4;E++){const S=x[E];if(s.crossVectors(M,S),r.setFromPoints(s,e),i.setFromPoints(s,n),r.isSeparated(i))return!1}}return p&&(console.warn("ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0."),p.start.set(0,0,0),p.end.set(0,0,0)),!0}else{const g=this.points;let b=!1,y=0;for(let k=0;k<3;k++){const N=g[k],q=g[(k+1)%3];u.start.copy(N),u.end.copy(q),u.delta(a);const L=b?c.start:c.end,A=zg(v.distanceToPoint(N));if(zg(v.normal.dot(a))&&A){c.copy(u),y=2;break}if((v.intersectLine(u,L)||A)&&!zg(L.distanceTo(q))){if(y++,b)break;b=!0}}if(y===1&&this.containsPoint(c.end))return p&&(p.start.copy(c.end),p.end.copy(c.end)),!0;if(y!==2)return!1;const x=h.points;let T=!1,M=0;for(let k=0;k<3;k++){const N=x[k],q=x[(k+1)%3];u.start.copy(N),u.end.copy(q),u.delta(o);const L=T?d.start:d.end,A=zg(m.distanceToPoint(N));if(zg(m.normal.dot(o))&&A){d.copy(u),M=2;break}if((m.intersectLine(u,L)||A)&&!zg(L.distanceTo(q))){if(M++,T)break;T=!0}}if(M===1&&this.containsPoint(d.end))return p&&(p.start.copy(d.end),p.end.copy(d.end)),!0;if(M!==2)return!1;if(c.delta(a),d.delta(o),a.dot(o)<0){let k=d.start;d.start=d.end,d.end=k}const E=c.start.dot(a),S=c.end.dot(a),P=d.start.dot(a),R=d.end.dot(a),V=S0?p.start.copy(c.start):p.start.copy(d.start),l.subVectors(c.end,d.end),l.dot(a)<0?p.end.copy(c.end):p.end.copy(d.end)),!0)}}}();td.prototype.distanceToPoint=function(){const t=new U;return function(n){return this.closestPointToPoint(n,t),n.distanceTo(t)}}();td.prototype.distanceToTriangle=function(){const t=new U,e=new U,n=["a","b","c"],r=new hl,i=new hl;return function(a,o=null,l=null){const u=o||l?r:null;if(this.intersectsTriangle(a,u))return(o||l)&&(o&&u.getCenter(o),l&&u.getCenter(l)),0;let c=1/0;for(let d=0;d<3;d++){let f;const h=n[d],p=a[h];this.closestPointToPoint(p,t),f=p.distanceToSquared(t),fnew U),this.satAxes=new Array(3).fill().map(()=>new U),this.satBounds=new Array(3).fill().map(()=>new Mf),this.alignedSatBounds=new Array(3).fill().map(()=>new Mf),this.needsUpdate=!1,e&&this.min.copy(e),n&&this.max.copy(n),r&&this.matrix.copy(r)}set(e,n,r){this.min.copy(e),this.max.copy(n),this.matrix.copy(r),this.needsUpdate=!0}copy(e){this.min.copy(e.min),this.max.copy(e.max),this.matrix.copy(e.matrix),this.needsUpdate=!0}}nd.prototype.update=function(){return function(){const e=this.matrix,n=this.min,r=this.max,i=this.points;for(let u=0;u<=1;u++)for(let c=0;c<=1;c++)for(let d=0;d<=1;d++){const f=1*u|2*c|4*d,h=i[f];h.x=u?r.x:n.x,h.y=c?r.y:n.y,h.z=d?r.z:n.z,h.applyMatrix4(e)}const s=this.satBounds,a=this.satAxes,o=i[0];for(let u=0;u<3;u++){const c=a[u],d=s[u],f=1<new hl),n=new Array(12).fill().map(()=>new hl),r=new U,i=new U;return function(a,o=0,l=null,u=null){if(this.needsUpdate&&this.update(),this.intersectsBox(a))return(l||u)&&(a.getCenter(i),this.closestPointToPoint(i,r),a.closestPointToPoint(r,i),l&&l.copy(r),u&&u.copy(i)),0;const c=o*o,d=a.min,f=a.max,h=this.points;let p=1/0;for(let v=0;v<8;v++){const g=h[v];i.copy(g).clamp(d,f);const b=g.distanceToSquared(i);if(b=0;let h,p;f?(h=M6(t),p=P6(t,o)):(h=P6(t,o),p=M6(t));const v=NP(h,s,r,UP)?Z8(h,e,n,r):null;if(v){const y=v.point[c];if(f?y<=s[p+u]:y>=s[p+u+3])return v}const b=NP(p,s,r,UP)?Z8(p,e,n,r):null;return v&&b?v.distance<=b.distance?v:b:v||b||null}}const jht=function(){let t,e;const n=[],r=new Wme(()=>new Jt);return function(...a){t=r.getPrimitive(),e=r.getPrimitive(),n.push(t,e);const o=i(...a);r.releasePrimitive(t),r.releasePrimitive(e),n.pop(),n.pop();const l=n.length;return l>0&&(e=n[l-1],t=n[l-2]),o};function i(s,a,o,l,u=null,c=0,d=0){function f(y){let x=y*2,T=vp,M=gp;for(;!qh(x,T);)y=M6(y),x=y*2;return W1(y,M)}function h(y){let x=y*2,T=vp,M=gp;for(;!qh(x,T);)y=P6(y,M),x=y*2;return W1(y,M)+E6(x,T)}let p=s*2,m=Ny,v=vp,g=gp;if(qh(p,v)){const y=W1(s,g),x=E6(p,v);return Ru(s,m,t),l(y,x,!1,d,c+s,t)}else{const y=M6(s),x=P6(s,g);let T=y,M=x,E,S,P,R;if(u&&(P=t,R=e,Ru(T,m,P),Ru(M,m,R),E=u(P),S=u(R),Si.intersectsBox(S),intersectsTriangle:S=>{S.a.applyMatrix4(u),S.b.applyMatrix4(u),S.c.applyMatrix4(u),S.needsUpdate=!0;for(let P=T*3,R=(M+T)*3;Pnew td);class px{static serialize(e,n={}){if(n.isBufferGeometry)return console.warn("MeshBVH.serialize: The arguments for the function have changed. See documentation for new signature."),px.serialize(arguments[0],{cloneBuffers:arguments[2]===void 0?!0:arguments[2]});n={cloneBuffers:!0,...n};const r=e.geometry,i=e._roots,s=r.getIndex();let a;return n.cloneBuffers?a={roots:i.map(o=>o.slice()),index:s.array.slice()}:a={roots:i,index:s.array},a}static deserialize(e,n,r={}){if(typeof r=="boolean")return console.warn("MeshBVH.deserialize: The arguments for the function have changed. See documentation for new signature."),px.deserialize(arguments[0],arguments[1],{setIndex:arguments[2]===void 0?!0:arguments[2]});r={setIndex:!0,...r};const{index:i,roots:s}=e,a=new px(n,{...r,[CI]:!0});if(a._roots=s,r.setIndex){const o=n.getIndex();if(o===null){const l=new un(e.index,1,!1);n.setIndex(l)}else o.array!==i&&(o.array.set(i),o.needsUpdate=!0)}return a}constructor(e,n={}){if(e.isBufferGeometry){if(e.index&&e.index.isInterleavedBufferAttribute)throw new Error("MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.")}else throw new Error("MeshBVH: Only BufferGeometries are supported.");if(n=Object.assign({strategy:OD,maxDepth:40,maxLeafTris:10,verbose:!0,useSharedArrayBuffer:!1,setBoundingBox:!0,onProgress:null,[CI]:!1},n),n.useSharedArrayBuffer&&typeof SharedArrayBuffer>"u")throw new Error("MeshBVH: SharedArrayBuffer is not available.");this._roots=null,n[CI]||(this._roots=Lht(e,n),!e.boundingBox&&n.setBoundingBox&&(e.boundingBox=this.getBoundingBox(new Jt))),this.geometry=e}refit(e=null){e&&Array.isArray(e)&&(e=new Set(e));const n=this.geometry,r=n.index.array,i=n.attributes.position;let s,a,o,l,u=0;const c=this._roots;for(let f=0,h=c.length;fM&&(M=z),kE&&(E=k),NS&&(S=N)}return l[f+0]!==y||l[f+1]!==x||l[f+2]!==T||l[f+3]!==M||l[f+4]!==E||l[f+5]!==S?(l[f+0]=y,l[f+1]=x,l[f+2]=T,l[f+3]=M,l[f+4]=E,l[f+5]=S,!0):!1}else{const g=f+8,b=a[f+6],y=g+h,x=b+h;let T=p,M=!1,E=!1;e?T||(M=e.has(y),E=e.has(x),T=!M&&!E):(M=!0,E=!0);const S=T||M,P=T||E;let R=!1;S&&(R=d(g,h,T));let V=!1;P&&(V=d(b,h,T));const z=R||V;if(z)for(let k=0;k<3;k++){const N=g+k,q=b+k,L=l[N],A=l[N+3],J=l[q],F=l[q+3];l[f+k]=LF?A:F}return z}}}traverse(e,n=0){const r=this._roots[n],i=new Uint32Array(r),s=new Uint16Array(r);a(0);function a(o,l=0){const u=o*2,c=s[u+15]===F8;if(c){const d=i[o+6],f=s[u+14];e(l,c,new Float32Array(r,o*4,6),d,f)}else{const d=o+W7/4,f=i[o+6],h=i[o+7];e(l,c,new Float32Array(r,o*4,6),h)||(a(d,l+1),a(f,l+1))}}}raycast(e,n=Ki){const r=this._roots,i=this.geometry,s=[],a=n.isMaterial,o=Array.isArray(n),l=i.groups,u=a?n.side:n;for(let c=0,d=r.length;c{const g=p*3;return f(h,g,g+1,g+2,m,v)}}e={boundsTraverseOrder:r,intersectsBounds:e,intersectsTriangle:n,intersectsRange:null},console.warn("MeshBVH: Shapecast function signature has changed and now takes an object of callbacks as a second argument. See docs for new signature.")}const s=uc.getPrimitive();let{boundsTraverseOrder:a,intersectsBounds:o,intersectsRange:l,intersectsTriangle:u}=e;if(l&&u){const f=l;l=(h,p,m,v,g)=>f(h,p,m,v,g)?!0:P_(h,p,i,u,m,v,s)}else l||(u?l=(f,h,p,m)=>P_(f,h,i,u,p,m,s):l=(f,h,p)=>p);let c=!1,d=0;for(const f of this._roots){if(S3(f),c=jht(0,i,o,l,a,d),tE(),c)break;d+=f.byteLength}return uc.releasePrimitive(s),c}bvhcast(e,n,r){let{intersectsRanges:i,intersectsTriangles:s}=r;const a=this.geometry.index,o=this.geometry.attributes.position,l=e.geometry.index,u=e.geometry.attributes.position;kg.copy(n).invert();const c=uc.getPrimitive(),d=uc.getPrimitive();if(s){let p=function(m,v,g,b,y,x,T,M){for(let E=g,S=g+b;EqI.intersectsBox(p),intersectsRange:(p,m,v,g,b,y)=>(KI.copy(y),KI.applyMatrix4(kg),e.shapecast({intersectsBounds:x=>KI.intersectsBox(x),intersectsRange:(x,T,M,E,S)=>i(p,m,x,T,g,b,E,S)}))});return uc.releasePrimitive(c),uc.releasePrimitive(d),f}intersectsBox(e,n){return Gm.set(e.min,e.max,n),Gm.needsUpdate=!0,this.shapecast({intersectsBounds:r=>Gm.intersectsBox(r),intersectsTriangle:r=>Gm.intersectsTriangle(r)})}intersectsSphere(e){return this.shapecast({intersectsBounds:n=>e.intersectsBox(n),intersectsTriangle:n=>n.intersectsSphere(e)})}closestPointToGeometry(e,n,r={},i={},s=0,a=1/0){e.boundingBox||e.computeBoundingBox(),Gm.set(e.boundingBox.min,e.boundingBox.max,n),Gm.needsUpdate=!0;const o=this.geometry,l=o.attributes.position,u=o.index,c=e.attributes.position,d=e.index,f=uc.getPrimitive(),h=uc.getPrimitive();let p=nE,m=Jht,v=null,g=null;i&&(v=Yht,g=Bht);let b=1/0,y=null,x=null;return kg.copy(n).invert(),HS.matrix.copy(kg),this.shapecast({boundsTraverseOrder:T=>Gm.distanceToBox(T),intersectsBounds:(T,M,E)=>E{if(e.boundsTree)return e.boundsTree.shapecast({boundsTraverseOrder:E=>HS.distanceToBox(E),intersectsBounds:(E,S,P)=>P{for(let P=E*3,R=(E+S)*3;P(QS.copy(e).clamp(c.min,c.max),QS.distanceToSquared(e)),intersectsBounds:(c,d,f)=>f{c.closestPointToPoint(e,QS);const f=e.distanceToSquared(QS);return f{Ru(0,new Float32Array(r),R_),e.union(R_)}),e}}const V_=new Jt;class Hht extends cn{get isMesh(){return!this.displayEdges}get isLineSegments(){return this.displayEdges}get isLine(){return this.displayEdges}constructor(e,n,r=10,i=0){super(),this.material=n,this.geometry=new Lt,this.name="MeshBVHRootVisualizer",this.depth=r,this.displayParents=!1,this.mesh=e,this.displayEdges=!0,this._group=i}raycast(){}update(){const e=this.geometry,n=this.mesh.geometry.boundsTree,r=this._group;if(e.dispose(),this.visible=!1,n){const i=this.depth-1,s=this.displayParents;let a=0;n.traverse((f,h)=>{if(f===i||h)return a++,!0;s&&a++},r);let o=0;const l=new Float32Array(8*3*a);n.traverse((f,h,p)=>{const m=f===i||h;if(m||s){Ru(0,p,V_);const{min:v,max:g}=V_;for(let b=-1;b<=1;b+=2){const y=b<0?v.x:g.x;for(let x=-1;x<=1;x+=2){const T=x<0?v.y:g.y;for(let M=-1;M<=1;M+=2){const E=M<0?v.z:g.z;l[o+0]=y,l[o+1]=T,l[o+2]=E,o+=3}}}return m}},r);let u,c;this.displayEdges?c=new Uint8Array([0,4,1,5,2,6,3,7,0,2,1,3,4,6,5,7,0,1,2,3,4,5,6,7]):c=new Uint8Array([0,1,2,2,1,3,4,6,5,6,7,5,1,4,5,0,4,1,2,3,6,3,7,6,0,2,4,2,6,4,1,5,3,3,5,7]),l.length>65535?u=new Uint32Array(c.length*a):u=new Uint16Array(c.length*a);const d=c.length;for(let f=0;fn;){const r=this._roots.pop();r.geometry.dispose(),this.remove(r)}for(let r=0;r=this._roots.length){const s=new Hht(this.mesh,this.edgeMaterial,this.depth,r);this.add(s),this._roots.push(s)}const i=this._roots[r];i.depth=this.depth,i.mesh=this.mesh,i.displayParents=this.displayParents,i.displayEdges=this.displayEdges,i.material=this.displayEdges?this.edgeMaterial:this.meshMaterial,i.update()}}updateMatrixWorld(...e){this.position.copy(this.mesh.position),this.rotation.copy(this.mesh.rotation),this.scale.copy(this.mesh.scale),super.updateMatrixWorld(...e)}copy(e){this.depth=e.depth,this.mesh=e.mesh}clone(){return new UD(this.mesh,this.depth)}dispose(){this.edgeMaterial.dispose(),this.meshMaterial.dispose();const e=this.children;for(let n=0,r=e.length;n #include #include @@ -3539,25 +3539,25 @@ PERFORMANCE OF THIS SOFTWARE. #include } - `};class UD extends bi{constructor(e){super({type:"LineMaterial",uniforms:Na.clone(wi.line.uniforms),vertexShader:wi.line.vertexShader,fragmentShader:wi.line.fragmentShader,clipping:!0}),Object.defineProperties(this,{color:{enumerable:!0,get:function(){return this.uniforms.diffuse.value},set:function(n){this.uniforms.diffuse.value=n}},worldUnits:{enumerable:!0,get:function(){return"WORLD_UNITS"in this.defines},set:function(n){n===!0?this.defines.WORLD_UNITS="":delete this.defines.WORLD_UNITS}},linewidth:{enumerable:!0,get:function(){return this.uniforms.linewidth.value},set:function(n){this.uniforms.linewidth.value=n}},dashed:{enumerable:!0,get:function(){return"USE_DASH"in this.defines},set(n){!!n!="USE_DASH"in this.defines&&(this.needsUpdate=!0),n===!0?this.defines.USE_DASH="":delete this.defines.USE_DASH}},dashScale:{enumerable:!0,get:function(){return this.uniforms.dashScale.value},set:function(n){this.uniforms.dashScale.value=n}},dashSize:{enumerable:!0,get:function(){return this.uniforms.dashSize.value},set:function(n){this.uniforms.dashSize.value=n}},dashOffset:{enumerable:!0,get:function(){return this.uniforms.dashOffset.value},set:function(n){this.uniforms.dashOffset.value=n}},gapSize:{enumerable:!0,get:function(){return this.uniforms.gapSize.value},set:function(n){this.uniforms.gapSize.value=n}},opacity:{enumerable:!0,get:function(){return this.uniforms.opacity.value},set:function(n){this.uniforms.opacity.value=n}},resolution:{enumerable:!0,get:function(){return this.uniforms.resolution.value},set:function(n){this.uniforms.resolution.value.copy(n)}},alphaToCoverage:{enumerable:!0,get:function(){return"USE_ALPHA_TO_COVERAGE"in this.defines},set:function(n){!!n!="USE_ALPHA_TO_COVERAGE"in this.defines&&(this.needsUpdate=!0),n===!0?(this.defines.USE_ALPHA_TO_COVERAGE="",this.extensions.derivatives=!0):(delete this.defines.USE_ALPHA_TO_COVERAGE,this.extensions.derivatives=!1)}}}),this.setValues(e)}}UD.prototype.isLineMaterial=!0;var Gme={exports:{}},Hht=[{value:"#B0171F",name:"indian red"},{value:"#DC143C",css:!0,name:"crimson"},{value:"#FFB6C1",css:!0,name:"lightpink"},{value:"#FFAEB9",name:"lightpink 1"},{value:"#EEA2AD",name:"lightpink 2"},{value:"#CD8C95",name:"lightpink 3"},{value:"#8B5F65",name:"lightpink 4"},{value:"#FFC0CB",css:!0,name:"pink"},{value:"#FFB5C5",name:"pink 1"},{value:"#EEA9B8",name:"pink 2"},{value:"#CD919E",name:"pink 3"},{value:"#8B636C",name:"pink 4"},{value:"#DB7093",css:!0,name:"palevioletred"},{value:"#FF82AB",name:"palevioletred 1"},{value:"#EE799F",name:"palevioletred 2"},{value:"#CD6889",name:"palevioletred 3"},{value:"#8B475D",name:"palevioletred 4"},{value:"#FFF0F5",name:"lavenderblush 1"},{value:"#FFF0F5",css:!0,name:"lavenderblush"},{value:"#EEE0E5",name:"lavenderblush 2"},{value:"#CDC1C5",name:"lavenderblush 3"},{value:"#8B8386",name:"lavenderblush 4"},{value:"#FF3E96",name:"violetred 1"},{value:"#EE3A8C",name:"violetred 2"},{value:"#CD3278",name:"violetred 3"},{value:"#8B2252",name:"violetred 4"},{value:"#FF69B4",css:!0,name:"hotpink"},{value:"#FF6EB4",name:"hotpink 1"},{value:"#EE6AA7",name:"hotpink 2"},{value:"#CD6090",name:"hotpink 3"},{value:"#8B3A62",name:"hotpink 4"},{value:"#872657",name:"raspberry"},{value:"#FF1493",name:"deeppink 1"},{value:"#FF1493",css:!0,name:"deeppink"},{value:"#EE1289",name:"deeppink 2"},{value:"#CD1076",name:"deeppink 3"},{value:"#8B0A50",name:"deeppink 4"},{value:"#FF34B3",name:"maroon 1"},{value:"#EE30A7",name:"maroon 2"},{value:"#CD2990",name:"maroon 3"},{value:"#8B1C62",name:"maroon 4"},{value:"#C71585",css:!0,name:"mediumvioletred"},{value:"#D02090",name:"violetred"},{value:"#DA70D6",css:!0,name:"orchid"},{value:"#FF83FA",name:"orchid 1"},{value:"#EE7AE9",name:"orchid 2"},{value:"#CD69C9",name:"orchid 3"},{value:"#8B4789",name:"orchid 4"},{value:"#D8BFD8",css:!0,name:"thistle"},{value:"#FFE1FF",name:"thistle 1"},{value:"#EED2EE",name:"thistle 2"},{value:"#CDB5CD",name:"thistle 3"},{value:"#8B7B8B",name:"thistle 4"},{value:"#FFBBFF",name:"plum 1"},{value:"#EEAEEE",name:"plum 2"},{value:"#CD96CD",name:"plum 3"},{value:"#8B668B",name:"plum 4"},{value:"#DDA0DD",css:!0,name:"plum"},{value:"#EE82EE",css:!0,name:"violet"},{value:"#FF00FF",vga:!0,name:"magenta"},{value:"#FF00FF",vga:!0,css:!0,name:"fuchsia"},{value:"#EE00EE",name:"magenta 2"},{value:"#CD00CD",name:"magenta 3"},{value:"#8B008B",name:"magenta 4"},{value:"#8B008B",css:!0,name:"darkmagenta"},{value:"#800080",vga:!0,css:!0,name:"purple"},{value:"#BA55D3",css:!0,name:"mediumorchid"},{value:"#E066FF",name:"mediumorchid 1"},{value:"#D15FEE",name:"mediumorchid 2"},{value:"#B452CD",name:"mediumorchid 3"},{value:"#7A378B",name:"mediumorchid 4"},{value:"#9400D3",css:!0,name:"darkviolet"},{value:"#9932CC",css:!0,name:"darkorchid"},{value:"#BF3EFF",name:"darkorchid 1"},{value:"#B23AEE",name:"darkorchid 2"},{value:"#9A32CD",name:"darkorchid 3"},{value:"#68228B",name:"darkorchid 4"},{value:"#4B0082",css:!0,name:"indigo"},{value:"#8A2BE2",css:!0,name:"blueviolet"},{value:"#9B30FF",name:"purple 1"},{value:"#912CEE",name:"purple 2"},{value:"#7D26CD",name:"purple 3"},{value:"#551A8B",name:"purple 4"},{value:"#9370DB",css:!0,name:"mediumpurple"},{value:"#AB82FF",name:"mediumpurple 1"},{value:"#9F79EE",name:"mediumpurple 2"},{value:"#8968CD",name:"mediumpurple 3"},{value:"#5D478B",name:"mediumpurple 4"},{value:"#483D8B",css:!0,name:"darkslateblue"},{value:"#8470FF",name:"lightslateblue"},{value:"#7B68EE",css:!0,name:"mediumslateblue"},{value:"#6A5ACD",css:!0,name:"slateblue"},{value:"#836FFF",name:"slateblue 1"},{value:"#7A67EE",name:"slateblue 2"},{value:"#6959CD",name:"slateblue 3"},{value:"#473C8B",name:"slateblue 4"},{value:"#F8F8FF",css:!0,name:"ghostwhite"},{value:"#E6E6FA",css:!0,name:"lavender"},{value:"#0000FF",vga:!0,css:!0,name:"blue"},{value:"#0000EE",name:"blue 2"},{value:"#0000CD",name:"blue 3"},{value:"#0000CD",css:!0,name:"mediumblue"},{value:"#00008B",name:"blue 4"},{value:"#00008B",css:!0,name:"darkblue"},{value:"#000080",vga:!0,css:!0,name:"navy"},{value:"#191970",css:!0,name:"midnightblue"},{value:"#3D59AB",name:"cobalt"},{value:"#4169E1",css:!0,name:"royalblue"},{value:"#4876FF",name:"royalblue 1"},{value:"#436EEE",name:"royalblue 2"},{value:"#3A5FCD",name:"royalblue 3"},{value:"#27408B",name:"royalblue 4"},{value:"#6495ED",css:!0,name:"cornflowerblue"},{value:"#B0C4DE",css:!0,name:"lightsteelblue"},{value:"#CAE1FF",name:"lightsteelblue 1"},{value:"#BCD2EE",name:"lightsteelblue 2"},{value:"#A2B5CD",name:"lightsteelblue 3"},{value:"#6E7B8B",name:"lightsteelblue 4"},{value:"#778899",css:!0,name:"lightslategray"},{value:"#708090",css:!0,name:"slategray"},{value:"#C6E2FF",name:"slategray 1"},{value:"#B9D3EE",name:"slategray 2"},{value:"#9FB6CD",name:"slategray 3"},{value:"#6C7B8B",name:"slategray 4"},{value:"#1E90FF",name:"dodgerblue 1"},{value:"#1E90FF",css:!0,name:"dodgerblue"},{value:"#1C86EE",name:"dodgerblue 2"},{value:"#1874CD",name:"dodgerblue 3"},{value:"#104E8B",name:"dodgerblue 4"},{value:"#F0F8FF",css:!0,name:"aliceblue"},{value:"#4682B4",css:!0,name:"steelblue"},{value:"#63B8FF",name:"steelblue 1"},{value:"#5CACEE",name:"steelblue 2"},{value:"#4F94CD",name:"steelblue 3"},{value:"#36648B",name:"steelblue 4"},{value:"#87CEFA",css:!0,name:"lightskyblue"},{value:"#B0E2FF",name:"lightskyblue 1"},{value:"#A4D3EE",name:"lightskyblue 2"},{value:"#8DB6CD",name:"lightskyblue 3"},{value:"#607B8B",name:"lightskyblue 4"},{value:"#87CEFF",name:"skyblue 1"},{value:"#7EC0EE",name:"skyblue 2"},{value:"#6CA6CD",name:"skyblue 3"},{value:"#4A708B",name:"skyblue 4"},{value:"#87CEEB",css:!0,name:"skyblue"},{value:"#00BFFF",name:"deepskyblue 1"},{value:"#00BFFF",css:!0,name:"deepskyblue"},{value:"#00B2EE",name:"deepskyblue 2"},{value:"#009ACD",name:"deepskyblue 3"},{value:"#00688B",name:"deepskyblue 4"},{value:"#33A1C9",name:"peacock"},{value:"#ADD8E6",css:!0,name:"lightblue"},{value:"#BFEFFF",name:"lightblue 1"},{value:"#B2DFEE",name:"lightblue 2"},{value:"#9AC0CD",name:"lightblue 3"},{value:"#68838B",name:"lightblue 4"},{value:"#B0E0E6",css:!0,name:"powderblue"},{value:"#98F5FF",name:"cadetblue 1"},{value:"#8EE5EE",name:"cadetblue 2"},{value:"#7AC5CD",name:"cadetblue 3"},{value:"#53868B",name:"cadetblue 4"},{value:"#00F5FF",name:"turquoise 1"},{value:"#00E5EE",name:"turquoise 2"},{value:"#00C5CD",name:"turquoise 3"},{value:"#00868B",name:"turquoise 4"},{value:"#5F9EA0",css:!0,name:"cadetblue"},{value:"#00CED1",css:!0,name:"darkturquoise"},{value:"#F0FFFF",name:"azure 1"},{value:"#F0FFFF",css:!0,name:"azure"},{value:"#E0EEEE",name:"azure 2"},{value:"#C1CDCD",name:"azure 3"},{value:"#838B8B",name:"azure 4"},{value:"#E0FFFF",name:"lightcyan 1"},{value:"#E0FFFF",css:!0,name:"lightcyan"},{value:"#D1EEEE",name:"lightcyan 2"},{value:"#B4CDCD",name:"lightcyan 3"},{value:"#7A8B8B",name:"lightcyan 4"},{value:"#BBFFFF",name:"paleturquoise 1"},{value:"#AEEEEE",name:"paleturquoise 2"},{value:"#AEEEEE",css:!0,name:"paleturquoise"},{value:"#96CDCD",name:"paleturquoise 3"},{value:"#668B8B",name:"paleturquoise 4"},{value:"#2F4F4F",css:!0,name:"darkslategray"},{value:"#97FFFF",name:"darkslategray 1"},{value:"#8DEEEE",name:"darkslategray 2"},{value:"#79CDCD",name:"darkslategray 3"},{value:"#528B8B",name:"darkslategray 4"},{value:"#00FFFF",name:"cyan"},{value:"#00FFFF",css:!0,name:"aqua"},{value:"#00EEEE",name:"cyan 2"},{value:"#00CDCD",name:"cyan 3"},{value:"#008B8B",name:"cyan 4"},{value:"#008B8B",css:!0,name:"darkcyan"},{value:"#008080",vga:!0,css:!0,name:"teal"},{value:"#48D1CC",css:!0,name:"mediumturquoise"},{value:"#20B2AA",css:!0,name:"lightseagreen"},{value:"#03A89E",name:"manganeseblue"},{value:"#40E0D0",css:!0,name:"turquoise"},{value:"#808A87",name:"coldgrey"},{value:"#00C78C",name:"turquoiseblue"},{value:"#7FFFD4",name:"aquamarine 1"},{value:"#7FFFD4",css:!0,name:"aquamarine"},{value:"#76EEC6",name:"aquamarine 2"},{value:"#66CDAA",name:"aquamarine 3"},{value:"#66CDAA",css:!0,name:"mediumaquamarine"},{value:"#458B74",name:"aquamarine 4"},{value:"#00FA9A",css:!0,name:"mediumspringgreen"},{value:"#F5FFFA",css:!0,name:"mintcream"},{value:"#00FF7F",css:!0,name:"springgreen"},{value:"#00EE76",name:"springgreen 1"},{value:"#00CD66",name:"springgreen 2"},{value:"#008B45",name:"springgreen 3"},{value:"#3CB371",css:!0,name:"mediumseagreen"},{value:"#54FF9F",name:"seagreen 1"},{value:"#4EEE94",name:"seagreen 2"},{value:"#43CD80",name:"seagreen 3"},{value:"#2E8B57",name:"seagreen 4"},{value:"#2E8B57",css:!0,name:"seagreen"},{value:"#00C957",name:"emeraldgreen"},{value:"#BDFCC9",name:"mint"},{value:"#3D9140",name:"cobaltgreen"},{value:"#F0FFF0",name:"honeydew 1"},{value:"#F0FFF0",css:!0,name:"honeydew"},{value:"#E0EEE0",name:"honeydew 2"},{value:"#C1CDC1",name:"honeydew 3"},{value:"#838B83",name:"honeydew 4"},{value:"#8FBC8F",css:!0,name:"darkseagreen"},{value:"#C1FFC1",name:"darkseagreen 1"},{value:"#B4EEB4",name:"darkseagreen 2"},{value:"#9BCD9B",name:"darkseagreen 3"},{value:"#698B69",name:"darkseagreen 4"},{value:"#98FB98",css:!0,name:"palegreen"},{value:"#9AFF9A",name:"palegreen 1"},{value:"#90EE90",name:"palegreen 2"},{value:"#90EE90",css:!0,name:"lightgreen"},{value:"#7CCD7C",name:"palegreen 3"},{value:"#548B54",name:"palegreen 4"},{value:"#32CD32",css:!0,name:"limegreen"},{value:"#228B22",css:!0,name:"forestgreen"},{value:"#00FF00",vga:!0,name:"green 1"},{value:"#00FF00",vga:!0,css:!0,name:"lime"},{value:"#00EE00",name:"green 2"},{value:"#00CD00",name:"green 3"},{value:"#008B00",name:"green 4"},{value:"#008000",vga:!0,css:!0,name:"green"},{value:"#006400",css:!0,name:"darkgreen"},{value:"#308014",name:"sapgreen"},{value:"#7CFC00",css:!0,name:"lawngreen"},{value:"#7FFF00",name:"chartreuse 1"},{value:"#7FFF00",css:!0,name:"chartreuse"},{value:"#76EE00",name:"chartreuse 2"},{value:"#66CD00",name:"chartreuse 3"},{value:"#458B00",name:"chartreuse 4"},{value:"#ADFF2F",css:!0,name:"greenyellow"},{value:"#CAFF70",name:"darkolivegreen 1"},{value:"#BCEE68",name:"darkolivegreen 2"},{value:"#A2CD5A",name:"darkolivegreen 3"},{value:"#6E8B3D",name:"darkolivegreen 4"},{value:"#556B2F",css:!0,name:"darkolivegreen"},{value:"#6B8E23",css:!0,name:"olivedrab"},{value:"#C0FF3E",name:"olivedrab 1"},{value:"#B3EE3A",name:"olivedrab 2"},{value:"#9ACD32",name:"olivedrab 3"},{value:"#9ACD32",css:!0,name:"yellowgreen"},{value:"#698B22",name:"olivedrab 4"},{value:"#FFFFF0",name:"ivory 1"},{value:"#FFFFF0",css:!0,name:"ivory"},{value:"#EEEEE0",name:"ivory 2"},{value:"#CDCDC1",name:"ivory 3"},{value:"#8B8B83",name:"ivory 4"},{value:"#F5F5DC",css:!0,name:"beige"},{value:"#FFFFE0",name:"lightyellow 1"},{value:"#FFFFE0",css:!0,name:"lightyellow"},{value:"#EEEED1",name:"lightyellow 2"},{value:"#CDCDB4",name:"lightyellow 3"},{value:"#8B8B7A",name:"lightyellow 4"},{value:"#FAFAD2",css:!0,name:"lightgoldenrodyellow"},{value:"#FFFF00",vga:!0,name:"yellow 1"},{value:"#FFFF00",vga:!0,css:!0,name:"yellow"},{value:"#EEEE00",name:"yellow 2"},{value:"#CDCD00",name:"yellow 3"},{value:"#8B8B00",name:"yellow 4"},{value:"#808069",name:"warmgrey"},{value:"#808000",vga:!0,css:!0,name:"olive"},{value:"#BDB76B",css:!0,name:"darkkhaki"},{value:"#FFF68F",name:"khaki 1"},{value:"#EEE685",name:"khaki 2"},{value:"#CDC673",name:"khaki 3"},{value:"#8B864E",name:"khaki 4"},{value:"#F0E68C",css:!0,name:"khaki"},{value:"#EEE8AA",css:!0,name:"palegoldenrod"},{value:"#FFFACD",name:"lemonchiffon 1"},{value:"#FFFACD",css:!0,name:"lemonchiffon"},{value:"#EEE9BF",name:"lemonchiffon 2"},{value:"#CDC9A5",name:"lemonchiffon 3"},{value:"#8B8970",name:"lemonchiffon 4"},{value:"#FFEC8B",name:"lightgoldenrod 1"},{value:"#EEDC82",name:"lightgoldenrod 2"},{value:"#CDBE70",name:"lightgoldenrod 3"},{value:"#8B814C",name:"lightgoldenrod 4"},{value:"#E3CF57",name:"banana"},{value:"#FFD700",name:"gold 1"},{value:"#FFD700",css:!0,name:"gold"},{value:"#EEC900",name:"gold 2"},{value:"#CDAD00",name:"gold 3"},{value:"#8B7500",name:"gold 4"},{value:"#FFF8DC",name:"cornsilk 1"},{value:"#FFF8DC",css:!0,name:"cornsilk"},{value:"#EEE8CD",name:"cornsilk 2"},{value:"#CDC8B1",name:"cornsilk 3"},{value:"#8B8878",name:"cornsilk 4"},{value:"#DAA520",css:!0,name:"goldenrod"},{value:"#FFC125",name:"goldenrod 1"},{value:"#EEB422",name:"goldenrod 2"},{value:"#CD9B1D",name:"goldenrod 3"},{value:"#8B6914",name:"goldenrod 4"},{value:"#B8860B",css:!0,name:"darkgoldenrod"},{value:"#FFB90F",name:"darkgoldenrod 1"},{value:"#EEAD0E",name:"darkgoldenrod 2"},{value:"#CD950C",name:"darkgoldenrod 3"},{value:"#8B6508",name:"darkgoldenrod 4"},{value:"#FFA500",name:"orange 1"},{value:"#FF8000",css:!0,name:"orange"},{value:"#EE9A00",name:"orange 2"},{value:"#CD8500",name:"orange 3"},{value:"#8B5A00",name:"orange 4"},{value:"#FFFAF0",css:!0,name:"floralwhite"},{value:"#FDF5E6",css:!0,name:"oldlace"},{value:"#F5DEB3",css:!0,name:"wheat"},{value:"#FFE7BA",name:"wheat 1"},{value:"#EED8AE",name:"wheat 2"},{value:"#CDBA96",name:"wheat 3"},{value:"#8B7E66",name:"wheat 4"},{value:"#FFE4B5",css:!0,name:"moccasin"},{value:"#FFEFD5",css:!0,name:"papayawhip"},{value:"#FFEBCD",css:!0,name:"blanchedalmond"},{value:"#FFDEAD",name:"navajowhite 1"},{value:"#FFDEAD",css:!0,name:"navajowhite"},{value:"#EECFA1",name:"navajowhite 2"},{value:"#CDB38B",name:"navajowhite 3"},{value:"#8B795E",name:"navajowhite 4"},{value:"#FCE6C9",name:"eggshell"},{value:"#D2B48C",css:!0,name:"tan"},{value:"#9C661F",name:"brick"},{value:"#FF9912",name:"cadmiumyellow"},{value:"#FAEBD7",css:!0,name:"antiquewhite"},{value:"#FFEFDB",name:"antiquewhite 1"},{value:"#EEDFCC",name:"antiquewhite 2"},{value:"#CDC0B0",name:"antiquewhite 3"},{value:"#8B8378",name:"antiquewhite 4"},{value:"#DEB887",css:!0,name:"burlywood"},{value:"#FFD39B",name:"burlywood 1"},{value:"#EEC591",name:"burlywood 2"},{value:"#CDAA7D",name:"burlywood 3"},{value:"#8B7355",name:"burlywood 4"},{value:"#FFE4C4",name:"bisque 1"},{value:"#FFE4C4",css:!0,name:"bisque"},{value:"#EED5B7",name:"bisque 2"},{value:"#CDB79E",name:"bisque 3"},{value:"#8B7D6B",name:"bisque 4"},{value:"#E3A869",name:"melon"},{value:"#ED9121",name:"carrot"},{value:"#FF8C00",css:!0,name:"darkorange"},{value:"#FF7F00",name:"darkorange 1"},{value:"#EE7600",name:"darkorange 2"},{value:"#CD6600",name:"darkorange 3"},{value:"#8B4500",name:"darkorange 4"},{value:"#FFA54F",name:"tan 1"},{value:"#EE9A49",name:"tan 2"},{value:"#CD853F",name:"tan 3"},{value:"#CD853F",css:!0,name:"peru"},{value:"#8B5A2B",name:"tan 4"},{value:"#FAF0E6",css:!0,name:"linen"},{value:"#FFDAB9",name:"peachpuff 1"},{value:"#FFDAB9",css:!0,name:"peachpuff"},{value:"#EECBAD",name:"peachpuff 2"},{value:"#CDAF95",name:"peachpuff 3"},{value:"#8B7765",name:"peachpuff 4"},{value:"#FFF5EE",name:"seashell 1"},{value:"#FFF5EE",css:!0,name:"seashell"},{value:"#EEE5DE",name:"seashell 2"},{value:"#CDC5BF",name:"seashell 3"},{value:"#8B8682",name:"seashell 4"},{value:"#F4A460",css:!0,name:"sandybrown"},{value:"#C76114",name:"rawsienna"},{value:"#D2691E",css:!0,name:"chocolate"},{value:"#FF7F24",name:"chocolate 1"},{value:"#EE7621",name:"chocolate 2"},{value:"#CD661D",name:"chocolate 3"},{value:"#8B4513",name:"chocolate 4"},{value:"#8B4513",css:!0,name:"saddlebrown"},{value:"#292421",name:"ivoryblack"},{value:"#FF7D40",name:"flesh"},{value:"#FF6103",name:"cadmiumorange"},{value:"#8A360F",name:"burntsienna"},{value:"#A0522D",css:!0,name:"sienna"},{value:"#FF8247",name:"sienna 1"},{value:"#EE7942",name:"sienna 2"},{value:"#CD6839",name:"sienna 3"},{value:"#8B4726",name:"sienna 4"},{value:"#FFA07A",name:"lightsalmon 1"},{value:"#FFA07A",css:!0,name:"lightsalmon"},{value:"#EE9572",name:"lightsalmon 2"},{value:"#CD8162",name:"lightsalmon 3"},{value:"#8B5742",name:"lightsalmon 4"},{value:"#FF7F50",css:!0,name:"coral"},{value:"#FF4500",name:"orangered 1"},{value:"#FF4500",css:!0,name:"orangered"},{value:"#EE4000",name:"orangered 2"},{value:"#CD3700",name:"orangered 3"},{value:"#8B2500",name:"orangered 4"},{value:"#5E2612",name:"sepia"},{value:"#E9967A",css:!0,name:"darksalmon"},{value:"#FF8C69",name:"salmon 1"},{value:"#EE8262",name:"salmon 2"},{value:"#CD7054",name:"salmon 3"},{value:"#8B4C39",name:"salmon 4"},{value:"#FF7256",name:"coral 1"},{value:"#EE6A50",name:"coral 2"},{value:"#CD5B45",name:"coral 3"},{value:"#8B3E2F",name:"coral 4"},{value:"#8A3324",name:"burntumber"},{value:"#FF6347",name:"tomato 1"},{value:"#FF6347",css:!0,name:"tomato"},{value:"#EE5C42",name:"tomato 2"},{value:"#CD4F39",name:"tomato 3"},{value:"#8B3626",name:"tomato 4"},{value:"#FA8072",css:!0,name:"salmon"},{value:"#FFE4E1",name:"mistyrose 1"},{value:"#FFE4E1",css:!0,name:"mistyrose"},{value:"#EED5D2",name:"mistyrose 2"},{value:"#CDB7B5",name:"mistyrose 3"},{value:"#8B7D7B",name:"mistyrose 4"},{value:"#FFFAFA",name:"snow 1"},{value:"#FFFAFA",css:!0,name:"snow"},{value:"#EEE9E9",name:"snow 2"},{value:"#CDC9C9",name:"snow 3"},{value:"#8B8989",name:"snow 4"},{value:"#BC8F8F",css:!0,name:"rosybrown"},{value:"#FFC1C1",name:"rosybrown 1"},{value:"#EEB4B4",name:"rosybrown 2"},{value:"#CD9B9B",name:"rosybrown 3"},{value:"#8B6969",name:"rosybrown 4"},{value:"#F08080",css:!0,name:"lightcoral"},{value:"#CD5C5C",css:!0,name:"indianred"},{value:"#FF6A6A",name:"indianred 1"},{value:"#EE6363",name:"indianred 2"},{value:"#8B3A3A",name:"indianred 4"},{value:"#CD5555",name:"indianred 3"},{value:"#A52A2A",css:!0,name:"brown"},{value:"#FF4040",name:"brown 1"},{value:"#EE3B3B",name:"brown 2"},{value:"#CD3333",name:"brown 3"},{value:"#8B2323",name:"brown 4"},{value:"#B22222",css:!0,name:"firebrick"},{value:"#FF3030",name:"firebrick 1"},{value:"#EE2C2C",name:"firebrick 2"},{value:"#CD2626",name:"firebrick 3"},{value:"#8B1A1A",name:"firebrick 4"},{value:"#FF0000",vga:!0,name:"red 1"},{value:"#FF0000",vga:!0,css:!0,name:"red"},{value:"#EE0000",name:"red 2"},{value:"#CD0000",name:"red 3"},{value:"#8B0000",name:"red 4"},{value:"#8B0000",css:!0,name:"darkred"},{value:"#800000",vga:!0,css:!0,name:"maroon"},{value:"#8E388E",name:"sgi beet"},{value:"#7171C6",name:"sgi slateblue"},{value:"#7D9EC0",name:"sgi lightblue"},{value:"#388E8E",name:"sgi teal"},{value:"#71C671",name:"sgi chartreuse"},{value:"#8E8E38",name:"sgi olivedrab"},{value:"#C5C1AA",name:"sgi brightgray"},{value:"#C67171",name:"sgi salmon"},{value:"#555555",name:"sgi darkgray"},{value:"#1E1E1E",name:"sgi gray 12"},{value:"#282828",name:"sgi gray 16"},{value:"#515151",name:"sgi gray 32"},{value:"#5B5B5B",name:"sgi gray 36"},{value:"#848484",name:"sgi gray 52"},{value:"#8E8E8E",name:"sgi gray 56"},{value:"#AAAAAA",name:"sgi lightgray"},{value:"#B7B7B7",name:"sgi gray 72"},{value:"#C1C1C1",name:"sgi gray 76"},{value:"#EAEAEA",name:"sgi gray 92"},{value:"#F4F4F4",name:"sgi gray 96"},{value:"#FFFFFF",vga:!0,css:!0,name:"white"},{value:"#F5F5F5",name:"white smoke"},{value:"#F5F5F5",name:"gray 96"},{value:"#DCDCDC",css:!0,name:"gainsboro"},{value:"#D3D3D3",css:!0,name:"lightgrey"},{value:"#C0C0C0",vga:!0,css:!0,name:"silver"},{value:"#A9A9A9",css:!0,name:"darkgray"},{value:"#808080",vga:!0,css:!0,name:"gray"},{value:"#696969",css:!0,name:"dimgray"},{value:"#696969",name:"gray 42"},{value:"#000000",vga:!0,css:!0,name:"black"},{value:"#FCFCFC",name:"gray 99"},{value:"#FAFAFA",name:"gray 98"},{value:"#F7F7F7",name:"gray 97"},{value:"#F2F2F2",name:"gray 95"},{value:"#F0F0F0",name:"gray 94"},{value:"#EDEDED",name:"gray 93"},{value:"#EBEBEB",name:"gray 92"},{value:"#E8E8E8",name:"gray 91"},{value:"#E5E5E5",name:"gray 90"},{value:"#E3E3E3",name:"gray 89"},{value:"#E0E0E0",name:"gray 88"},{value:"#DEDEDE",name:"gray 87"},{value:"#DBDBDB",name:"gray 86"},{value:"#D9D9D9",name:"gray 85"},{value:"#D6D6D6",name:"gray 84"},{value:"#D4D4D4",name:"gray 83"},{value:"#D1D1D1",name:"gray 82"},{value:"#CFCFCF",name:"gray 81"},{value:"#CCCCCC",name:"gray 80"},{value:"#C9C9C9",name:"gray 79"},{value:"#C7C7C7",name:"gray 78"},{value:"#C4C4C4",name:"gray 77"},{value:"#C2C2C2",name:"gray 76"},{value:"#BFBFBF",name:"gray 75"},{value:"#BDBDBD",name:"gray 74"},{value:"#BABABA",name:"gray 73"},{value:"#B8B8B8",name:"gray 72"},{value:"#B5B5B5",name:"gray 71"},{value:"#B3B3B3",name:"gray 70"},{value:"#B0B0B0",name:"gray 69"},{value:"#ADADAD",name:"gray 68"},{value:"#ABABAB",name:"gray 67"},{value:"#A8A8A8",name:"gray 66"},{value:"#A6A6A6",name:"gray 65"},{value:"#A3A3A3",name:"gray 64"},{value:"#A1A1A1",name:"gray 63"},{value:"#9E9E9E",name:"gray 62"},{value:"#9C9C9C",name:"gray 61"},{value:"#999999",name:"gray 60"},{value:"#969696",name:"gray 59"},{value:"#949494",name:"gray 58"},{value:"#919191",name:"gray 57"},{value:"#8F8F8F",name:"gray 56"},{value:"#8C8C8C",name:"gray 55"},{value:"#8A8A8A",name:"gray 54"},{value:"#878787",name:"gray 53"},{value:"#858585",name:"gray 52"},{value:"#828282",name:"gray 51"},{value:"#7F7F7F",name:"gray 50"},{value:"#7D7D7D",name:"gray 49"},{value:"#7A7A7A",name:"gray 48"},{value:"#787878",name:"gray 47"},{value:"#757575",name:"gray 46"},{value:"#737373",name:"gray 45"},{value:"#707070",name:"gray 44"},{value:"#6E6E6E",name:"gray 43"},{value:"#666666",name:"gray 40"},{value:"#636363",name:"gray 39"},{value:"#616161",name:"gray 38"},{value:"#5E5E5E",name:"gray 37"},{value:"#5C5C5C",name:"gray 36"},{value:"#595959",name:"gray 35"},{value:"#575757",name:"gray 34"},{value:"#545454",name:"gray 33"},{value:"#525252",name:"gray 32"},{value:"#4F4F4F",name:"gray 31"},{value:"#4D4D4D",name:"gray 30"},{value:"#4A4A4A",name:"gray 29"},{value:"#474747",name:"gray 28"},{value:"#454545",name:"gray 27"},{value:"#424242",name:"gray 26"},{value:"#404040",name:"gray 25"},{value:"#3D3D3D",name:"gray 24"},{value:"#3B3B3B",name:"gray 23"},{value:"#383838",name:"gray 22"},{value:"#363636",name:"gray 21"},{value:"#333333",name:"gray 20"},{value:"#303030",name:"gray 19"},{value:"#2E2E2E",name:"gray 18"},{value:"#2B2B2B",name:"gray 17"},{value:"#292929",name:"gray 16"},{value:"#262626",name:"gray 15"},{value:"#242424",name:"gray 14"},{value:"#212121",name:"gray 13"},{value:"#1F1F1F",name:"gray 12"},{value:"#1C1C1C",name:"gray 11"},{value:"#1A1A1A",name:"gray 10"},{value:"#171717",name:"gray 9"},{value:"#141414",name:"gray 8"},{value:"#121212",name:"gray 7"},{value:"#0F0F0F",name:"gray 6"},{value:"#0D0D0D",name:"gray 5"},{value:"#0A0A0A",name:"gray 4"},{value:"#080808",name:"gray 3"},{value:"#050505",name:"gray 2"},{value:"#030303",name:"gray 1"},{value:"#F5F5F5",css:!0,name:"whitesmoke"}];(function(t){var e=Hht,n=e.filter(function(i){return!!i.css}),r=e.filter(function(i){return!!i.vga});t.exports=function(i){var s=t.exports.get(i);return s&&s.value},t.exports.get=function(i){return i=i||"",i=i.trim().toLowerCase(),e.filter(function(s){return s.name.toLowerCase()===i}).pop()},t.exports.all=t.exports.get.all=function(){return e},t.exports.get.css=function(i){return i?(i=i||"",i=i.trim().toLowerCase(),n.filter(function(s){return s.name.toLowerCase()===i}).pop()):n},t.exports.get.vga=function(i){return i?(i=i||"",i=i.trim().toLowerCase(),r.filter(function(s){return s.name.toLowerCase()===i}).pop()):r}})(Gme);var Qht=Gme.exports,_ht=1/0,$ht="[object Symbol]",ept=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Fme="\\ud800-\\udfff",tpt="\\u0300-\\u036f\\ufe20-\\ufe23",npt="\\u20d0-\\u20f0",jme="\\u2700-\\u27bf",Zme="a-z\\xdf-\\xf6\\xf8-\\xff",rpt="\\xac\\xb1\\xd7\\xf7",ipt="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",spt="\\u2000-\\u206f",apt=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Jme="A-Z\\xc0-\\xd6\\xd8-\\xde",opt="\\ufe0e\\ufe0f",Yme=rpt+ipt+spt+apt,Bme="['’]",O_="["+Yme+"]",lpt="["+tpt+npt+"]",Hme="\\d+",upt="["+jme+"]",Qme="["+Zme+"]",_me="[^"+Fme+Yme+Hme+jme+Zme+Jme+"]",cpt="\\ud83c[\\udffb-\\udfff]",dpt="(?:"+lpt+"|"+cpt+")",fpt="[^"+Fme+"]",$me="(?:\\ud83c[\\udde6-\\uddff]){2}",eve="[\\ud800-\\udbff][\\udc00-\\udfff]",Qg="["+Jme+"]",hpt="\\u200d",I_="(?:"+Qme+"|"+_me+")",ppt="(?:"+Qg+"|"+_me+")",U_="(?:"+Bme+"(?:d|ll|m|re|s|t|ve))?",N_="(?:"+Bme+"(?:D|LL|M|RE|S|T|VE))?",tve=dpt+"?",nve="["+opt+"]?",mpt="(?:"+hpt+"(?:"+[fpt,$me,eve].join("|")+")"+nve+tve+")*",vpt=nve+tve+mpt,gpt="(?:"+[upt,$me,eve].join("|")+")"+vpt,bpt=RegExp([Qg+"?"+Qme+"+"+U_+"(?="+[O_,Qg,"$"].join("|")+")",ppt+"+"+N_+"(?="+[O_,Qg+I_,"$"].join("|")+")",Qg+"?"+I_+"+"+U_,Qg+"+"+N_,Hme,gpt].join("|"),"g"),ypt=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Spt=typeof Ks=="object"&&Ks&&Ks.Object===Object&&Ks,xpt=typeof self=="object"&&self&&self.Object===Object&&self,Tpt=Spt||xpt||Function("return this")();function wpt(t){return t.match(ept)||[]}function Ept(t){return ypt.test(t)}function Mpt(t){return t.match(bpt)||[]}var Ppt=Object.prototype,Rpt=Ppt.toString,L_=Tpt.Symbol,X_=L_?L_.prototype:void 0,C_=X_?X_.toString:void 0;function Vpt(t){if(typeof t=="string")return t;if(kpt(t))return C_?C_.call(t):"";var e=t+"";return e=="0"&&1/t==-_ht?"-0":e}function zpt(t){return!!t&&typeof t=="object"}function kpt(t){return typeof t=="symbol"||zpt(t)&&Rpt.call(t)==$ht}function Opt(t){return t==null?"":Vpt(t)}function Ipt(t,e,n){return t=Opt(t),e=n?void 0:e,e===void 0?Ept(t)?Mpt(t):wpt(t):t.match(e)||[]}var Upt=Ipt,Npt=1/0,Lpt="[object Symbol]",Xpt=/^\s+/,ND="\\ud800-\\udfff",rve="\\u0300-\\u036f\\ufe20-\\ufe23",ive="\\u20d0-\\u20f0",sve="\\ufe0e\\ufe0f",Cpt="["+ND+"]",Y8="["+rve+ive+"]",B8="\\ud83c[\\udffb-\\udfff]",Kpt="(?:"+Y8+"|"+B8+")",ave="[^"+ND+"]",ove="(?:\\ud83c[\\udde6-\\uddff]){2}",lve="[\\ud800-\\udbff][\\udc00-\\udfff]",uve="\\u200d",cve=Kpt+"?",dve="["+sve+"]?",qpt="(?:"+uve+"(?:"+[ave,ove,lve].join("|")+")"+dve+cve+")*",Dpt=dve+cve+qpt,Wpt="(?:"+[ave+Y8+"?",Y8,ove,lve,Cpt].join("|")+")",Apt=RegExp(B8+"(?="+B8+")|"+Wpt+Dpt,"g"),Gpt=RegExp("["+uve+ND+rve+ive+sve+"]"),Fpt=typeof Ks=="object"&&Ks&&Ks.Object===Object&&Ks,jpt=typeof self=="object"&&self&&self.Object===Object&&self,Zpt=Fpt||jpt||Function("return this")();function Jpt(t){return t.split("")}function Ypt(t,e,n,r){for(var i=t.length,s=n+(r?1:-1);r?s--:++s-1;);return n}function _pt(t){return Gpt.test(t)}function K_(t){return _pt(t)?$pt(t):Jpt(t)}function $pt(t){return t.match(Apt)||[]}var emt=Object.prototype,tmt=emt.toString,q_=Zpt.Symbol,D_=q_?q_.prototype:void 0,W_=D_?D_.toString:void 0;function nmt(t,e,n){var r=-1,i=t.length;e<0&&(e=-e>i?0:i+e),n=n>i?i:n,n<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var s=Array(i);++r=r?t:nmt(t,e,n)}function imt(t){return!!t&&typeof t=="object"}function smt(t){return typeof t=="symbol"||imt(t)&&tmt.call(t)==Lpt}function amt(t){return t==null?"":fve(t)}function omt(t,e,n){if(t=amt(t),t&&(n||e===void 0))return t.replace(Xpt,"");if(!t||!(e=fve(e)))return t;var r=K_(t),i=Qpt(r,K_(e));return rmt(r,i).join("")}var lmt=omt,H8=1/0,umt=9007199254740991,cmt=17976931348623157e292,A_=0/0,dmt="[object Symbol]",fmt=/^\s+|\s+$/g,hmt=/^[-+]0x[0-9a-f]+$/i,pmt=/^0b[01]+$/i,mmt=/^0o[0-7]+$/i,LD="\\ud800-\\udfff",hve="\\u0300-\\u036f\\ufe20-\\ufe23",pve="\\u20d0-\\u20f0",mve="\\ufe0e\\ufe0f",vmt="["+LD+"]",Q8="["+hve+pve+"]",_8="\\ud83c[\\udffb-\\udfff]",gmt="(?:"+Q8+"|"+_8+")",vve="[^"+LD+"]",gve="(?:\\ud83c[\\udde6-\\uddff]){2}",bve="[\\ud800-\\udbff][\\udc00-\\udfff]",yve="\\u200d",Sve=gmt+"?",xve="["+mve+"]?",bmt="(?:"+yve+"(?:"+[vve,gve,bve].join("|")+")"+xve+Sve+")*",ymt=xve+Sve+bmt,Smt="(?:"+[vve+Q8+"?",Q8,gve,bve,vmt].join("|")+")",$8=RegExp(_8+"(?="+_8+")|"+Smt+ymt,"g"),xmt=RegExp("["+yve+LD+hve+pve+mve+"]"),Tmt=parseInt,wmt=typeof Ks=="object"&&Ks&&Ks.Object===Object&&Ks,Emt=typeof self=="object"&&self&&self.Object===Object&&self,Mmt=wmt||Emt||Function("return this")(),Pmt=Vmt("length");function Rmt(t){return t.split("")}function Vmt(t){return function(e){return e==null?void 0:e[t]}}function XD(t){return xmt.test(t)}function Tve(t){return XD(t)?kmt(t):Pmt(t)}function zmt(t){return XD(t)?Omt(t):Rmt(t)}function kmt(t){for(var e=$8.lastIndex=0;$8.test(t);)e++;return e}function Omt(t){return t.match($8)||[]}var Imt=Object.prototype,Umt=Imt.toString,G_=Mmt.Symbol,Nmt=Math.ceil,Lmt=Math.floor,F_=G_?G_.prototype:void 0,j_=F_?F_.toString:void 0;function Z_(t,e){var n="";if(!t||e<1||e>umt)return n;do e%2&&(n+=t),e=Lmt(e/2),e&&(t+=t);while(e);return n}function Xmt(t,e,n){var r=-1,i=t.length;e<0&&(e=-e>i?0:i+e),n=n>i?i:n,n<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var s=Array(i);++r=r?t:Xmt(t,e,n)}function Kmt(t,e){e=e===void 0?" ":wve(e);var n=e.length;if(n<2)return n?Z_(e,t):e;var r=Z_(e,Nmt(t/Tve(e)));return XD(e)?Cmt(zmt(r),0,t).join(""):r.slice(0,t)}function J_(t){var e=typeof t;return!!t&&(e=="object"||e=="function")}function qmt(t){return!!t&&typeof t=="object"}function Eve(t){return typeof t=="symbol"||qmt(t)&&Umt.call(t)==dmt}function Dmt(t){if(!t)return t===0?t:0;if(t=Amt(t),t===H8||t===-H8){var e=t<0?-1:1;return e*cmt}return t===t?t:0}function Wmt(t){var e=Dmt(t),n=e%1;return e===e?n?e-n:e:0}function Amt(t){if(typeof t=="number")return t;if(Eve(t))return A_;if(J_(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=J_(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=t.replace(fmt,"");var n=pmt.test(t);return n||mmt.test(t)?Tmt(t.slice(2),n?2:8):hmt.test(t)?A_:+t}function Gmt(t){return t==null?"":wve(t)}function Fmt(t,e,n){t=Gmt(t),e=Wmt(e);var r=e?Tve(t):0;return e&&r{const i=(t+(r||"")).toString().includes("%");if(typeof t=="string"?[t,e,n,r]=t.match(/(0?\.?\d{1,3})%?\b/g).map(Number):r!==void 0&&(r=parseFloat(r)),typeof t!="number"||typeof e!="number"||typeof n!="number"||t>255||e>255||n>255)throw new TypeError("Expected three numbers below 256");if(typeof r=="number"){if(!i&&r>=0&&r<=1)r=Math.round(255*r);else if(i&&r>=0&&r<=100)r=Math.round(255*r/100);else throw new TypeError(`Expected alpha value (${r}) as a fraction or percentage`);r=(r|256).toString(16).slice(1)}else r="";return(n|e<<8|t<<16|1<<24).toString(16).slice(1)+r};const V6="a-f\\d",Jmt=`#?[${V6}]{3}[${V6}]?`,Ymt=`#?[${V6}]{6}([${V6}]{2})?`,Bmt=new RegExp(`[^#${V6}]`,"gi"),Hmt=new RegExp(`^${Jmt}$|^${Ymt}$`,"i");var Qmt=(t,e={})=>{if(typeof t!="string"||Bmt.test(t)||!Hmt.test(t))throw new TypeError("Expected a valid hex string");t=t.replace(/^#/,"");let n=1;t.length===8&&(n=Number.parseInt(t.slice(6,8),16)/255,t=t.slice(0,6)),t.length===4&&(n=Number.parseInt(t.slice(3,4).repeat(2),16)/255,t=t.slice(0,3)),t.length===3&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]);const r=Number.parseInt(t,16),i=r>>16,s=r>>8&255,a=r&255,o=typeof e.alpha=="number"?e.alpha:n;if(e.format==="array")return[i,s,a,o];if(e.format==="css"){const l=o===1?"":` / ${Number((o*100).toFixed(2))}%`;return`rgb(${i} ${s} ${a}${l})`}return{red:i,green:s,blue:a,alpha:o}},_mt=Qht,$mt=Upt,evt=lmt,tvt=jmt,nvt=Zmt,Mve=Qmt;const DI=.75,WI=.25,AI=16777215,rvt=49979693;var ivt=function(t){return"#"+ovt(String(JSON.stringify(t)))};function svt(t){var e=$mt(t),n=[];return e.forEach(function(r){var i=_mt(r);i&&n.push(Mve(evt(i,"#"),{format:"array"}))}),n}function avt(t){var e=[0,0,0];return t.forEach(function(n){for(var r=0;r<3;r++)e[r]+=n[r]}),[e[0]/t.length,e[1]/t.length,e[2]/t.length]}function ovt(t){var e,n=svt(t);n.length>0&&(e=avt(n));var r=1,i=0,s=1;if(t.length>0)for(var a=0;ai&&(i=t[a].charCodeAt(0)),s=parseInt(AI/i),r=(r+t[a].charCodeAt(0)*s*rvt)%AI;var o=(r*t.length%AI).toString(16);o=tvt(o,6,o);var l=Mve(o,{format:"array"});return e?nvt(WI*l[0]+DI*e[0],WI*l[1]+DI*e[1],WI*l[2]+DI*e[2]):o}const lvt=wV(ivt);/*! + `};class ND extends bi{constructor(e){super({type:"LineMaterial",uniforms:Na.clone(wi.line.uniforms),vertexShader:wi.line.vertexShader,fragmentShader:wi.line.fragmentShader,clipping:!0}),Object.defineProperties(this,{color:{enumerable:!0,get:function(){return this.uniforms.diffuse.value},set:function(n){this.uniforms.diffuse.value=n}},worldUnits:{enumerable:!0,get:function(){return"WORLD_UNITS"in this.defines},set:function(n){n===!0?this.defines.WORLD_UNITS="":delete this.defines.WORLD_UNITS}},linewidth:{enumerable:!0,get:function(){return this.uniforms.linewidth.value},set:function(n){this.uniforms.linewidth.value=n}},dashed:{enumerable:!0,get:function(){return"USE_DASH"in this.defines},set(n){!!n!="USE_DASH"in this.defines&&(this.needsUpdate=!0),n===!0?this.defines.USE_DASH="":delete this.defines.USE_DASH}},dashScale:{enumerable:!0,get:function(){return this.uniforms.dashScale.value},set:function(n){this.uniforms.dashScale.value=n}},dashSize:{enumerable:!0,get:function(){return this.uniforms.dashSize.value},set:function(n){this.uniforms.dashSize.value=n}},dashOffset:{enumerable:!0,get:function(){return this.uniforms.dashOffset.value},set:function(n){this.uniforms.dashOffset.value=n}},gapSize:{enumerable:!0,get:function(){return this.uniforms.gapSize.value},set:function(n){this.uniforms.gapSize.value=n}},opacity:{enumerable:!0,get:function(){return this.uniforms.opacity.value},set:function(n){this.uniforms.opacity.value=n}},resolution:{enumerable:!0,get:function(){return this.uniforms.resolution.value},set:function(n){this.uniforms.resolution.value.copy(n)}},alphaToCoverage:{enumerable:!0,get:function(){return"USE_ALPHA_TO_COVERAGE"in this.defines},set:function(n){!!n!="USE_ALPHA_TO_COVERAGE"in this.defines&&(this.needsUpdate=!0),n===!0?(this.defines.USE_ALPHA_TO_COVERAGE="",this.extensions.derivatives=!0):(delete this.defines.USE_ALPHA_TO_COVERAGE,this.extensions.derivatives=!1)}}}),this.setValues(e)}}ND.prototype.isLineMaterial=!0;var Ame={exports:{}},Qht=[{value:"#B0171F",name:"indian red"},{value:"#DC143C",css:!0,name:"crimson"},{value:"#FFB6C1",css:!0,name:"lightpink"},{value:"#FFAEB9",name:"lightpink 1"},{value:"#EEA2AD",name:"lightpink 2"},{value:"#CD8C95",name:"lightpink 3"},{value:"#8B5F65",name:"lightpink 4"},{value:"#FFC0CB",css:!0,name:"pink"},{value:"#FFB5C5",name:"pink 1"},{value:"#EEA9B8",name:"pink 2"},{value:"#CD919E",name:"pink 3"},{value:"#8B636C",name:"pink 4"},{value:"#DB7093",css:!0,name:"palevioletred"},{value:"#FF82AB",name:"palevioletred 1"},{value:"#EE799F",name:"palevioletred 2"},{value:"#CD6889",name:"palevioletred 3"},{value:"#8B475D",name:"palevioletred 4"},{value:"#FFF0F5",name:"lavenderblush 1"},{value:"#FFF0F5",css:!0,name:"lavenderblush"},{value:"#EEE0E5",name:"lavenderblush 2"},{value:"#CDC1C5",name:"lavenderblush 3"},{value:"#8B8386",name:"lavenderblush 4"},{value:"#FF3E96",name:"violetred 1"},{value:"#EE3A8C",name:"violetred 2"},{value:"#CD3278",name:"violetred 3"},{value:"#8B2252",name:"violetred 4"},{value:"#FF69B4",css:!0,name:"hotpink"},{value:"#FF6EB4",name:"hotpink 1"},{value:"#EE6AA7",name:"hotpink 2"},{value:"#CD6090",name:"hotpink 3"},{value:"#8B3A62",name:"hotpink 4"},{value:"#872657",name:"raspberry"},{value:"#FF1493",name:"deeppink 1"},{value:"#FF1493",css:!0,name:"deeppink"},{value:"#EE1289",name:"deeppink 2"},{value:"#CD1076",name:"deeppink 3"},{value:"#8B0A50",name:"deeppink 4"},{value:"#FF34B3",name:"maroon 1"},{value:"#EE30A7",name:"maroon 2"},{value:"#CD2990",name:"maroon 3"},{value:"#8B1C62",name:"maroon 4"},{value:"#C71585",css:!0,name:"mediumvioletred"},{value:"#D02090",name:"violetred"},{value:"#DA70D6",css:!0,name:"orchid"},{value:"#FF83FA",name:"orchid 1"},{value:"#EE7AE9",name:"orchid 2"},{value:"#CD69C9",name:"orchid 3"},{value:"#8B4789",name:"orchid 4"},{value:"#D8BFD8",css:!0,name:"thistle"},{value:"#FFE1FF",name:"thistle 1"},{value:"#EED2EE",name:"thistle 2"},{value:"#CDB5CD",name:"thistle 3"},{value:"#8B7B8B",name:"thistle 4"},{value:"#FFBBFF",name:"plum 1"},{value:"#EEAEEE",name:"plum 2"},{value:"#CD96CD",name:"plum 3"},{value:"#8B668B",name:"plum 4"},{value:"#DDA0DD",css:!0,name:"plum"},{value:"#EE82EE",css:!0,name:"violet"},{value:"#FF00FF",vga:!0,name:"magenta"},{value:"#FF00FF",vga:!0,css:!0,name:"fuchsia"},{value:"#EE00EE",name:"magenta 2"},{value:"#CD00CD",name:"magenta 3"},{value:"#8B008B",name:"magenta 4"},{value:"#8B008B",css:!0,name:"darkmagenta"},{value:"#800080",vga:!0,css:!0,name:"purple"},{value:"#BA55D3",css:!0,name:"mediumorchid"},{value:"#E066FF",name:"mediumorchid 1"},{value:"#D15FEE",name:"mediumorchid 2"},{value:"#B452CD",name:"mediumorchid 3"},{value:"#7A378B",name:"mediumorchid 4"},{value:"#9400D3",css:!0,name:"darkviolet"},{value:"#9932CC",css:!0,name:"darkorchid"},{value:"#BF3EFF",name:"darkorchid 1"},{value:"#B23AEE",name:"darkorchid 2"},{value:"#9A32CD",name:"darkorchid 3"},{value:"#68228B",name:"darkorchid 4"},{value:"#4B0082",css:!0,name:"indigo"},{value:"#8A2BE2",css:!0,name:"blueviolet"},{value:"#9B30FF",name:"purple 1"},{value:"#912CEE",name:"purple 2"},{value:"#7D26CD",name:"purple 3"},{value:"#551A8B",name:"purple 4"},{value:"#9370DB",css:!0,name:"mediumpurple"},{value:"#AB82FF",name:"mediumpurple 1"},{value:"#9F79EE",name:"mediumpurple 2"},{value:"#8968CD",name:"mediumpurple 3"},{value:"#5D478B",name:"mediumpurple 4"},{value:"#483D8B",css:!0,name:"darkslateblue"},{value:"#8470FF",name:"lightslateblue"},{value:"#7B68EE",css:!0,name:"mediumslateblue"},{value:"#6A5ACD",css:!0,name:"slateblue"},{value:"#836FFF",name:"slateblue 1"},{value:"#7A67EE",name:"slateblue 2"},{value:"#6959CD",name:"slateblue 3"},{value:"#473C8B",name:"slateblue 4"},{value:"#F8F8FF",css:!0,name:"ghostwhite"},{value:"#E6E6FA",css:!0,name:"lavender"},{value:"#0000FF",vga:!0,css:!0,name:"blue"},{value:"#0000EE",name:"blue 2"},{value:"#0000CD",name:"blue 3"},{value:"#0000CD",css:!0,name:"mediumblue"},{value:"#00008B",name:"blue 4"},{value:"#00008B",css:!0,name:"darkblue"},{value:"#000080",vga:!0,css:!0,name:"navy"},{value:"#191970",css:!0,name:"midnightblue"},{value:"#3D59AB",name:"cobalt"},{value:"#4169E1",css:!0,name:"royalblue"},{value:"#4876FF",name:"royalblue 1"},{value:"#436EEE",name:"royalblue 2"},{value:"#3A5FCD",name:"royalblue 3"},{value:"#27408B",name:"royalblue 4"},{value:"#6495ED",css:!0,name:"cornflowerblue"},{value:"#B0C4DE",css:!0,name:"lightsteelblue"},{value:"#CAE1FF",name:"lightsteelblue 1"},{value:"#BCD2EE",name:"lightsteelblue 2"},{value:"#A2B5CD",name:"lightsteelblue 3"},{value:"#6E7B8B",name:"lightsteelblue 4"},{value:"#778899",css:!0,name:"lightslategray"},{value:"#708090",css:!0,name:"slategray"},{value:"#C6E2FF",name:"slategray 1"},{value:"#B9D3EE",name:"slategray 2"},{value:"#9FB6CD",name:"slategray 3"},{value:"#6C7B8B",name:"slategray 4"},{value:"#1E90FF",name:"dodgerblue 1"},{value:"#1E90FF",css:!0,name:"dodgerblue"},{value:"#1C86EE",name:"dodgerblue 2"},{value:"#1874CD",name:"dodgerblue 3"},{value:"#104E8B",name:"dodgerblue 4"},{value:"#F0F8FF",css:!0,name:"aliceblue"},{value:"#4682B4",css:!0,name:"steelblue"},{value:"#63B8FF",name:"steelblue 1"},{value:"#5CACEE",name:"steelblue 2"},{value:"#4F94CD",name:"steelblue 3"},{value:"#36648B",name:"steelblue 4"},{value:"#87CEFA",css:!0,name:"lightskyblue"},{value:"#B0E2FF",name:"lightskyblue 1"},{value:"#A4D3EE",name:"lightskyblue 2"},{value:"#8DB6CD",name:"lightskyblue 3"},{value:"#607B8B",name:"lightskyblue 4"},{value:"#87CEFF",name:"skyblue 1"},{value:"#7EC0EE",name:"skyblue 2"},{value:"#6CA6CD",name:"skyblue 3"},{value:"#4A708B",name:"skyblue 4"},{value:"#87CEEB",css:!0,name:"skyblue"},{value:"#00BFFF",name:"deepskyblue 1"},{value:"#00BFFF",css:!0,name:"deepskyblue"},{value:"#00B2EE",name:"deepskyblue 2"},{value:"#009ACD",name:"deepskyblue 3"},{value:"#00688B",name:"deepskyblue 4"},{value:"#33A1C9",name:"peacock"},{value:"#ADD8E6",css:!0,name:"lightblue"},{value:"#BFEFFF",name:"lightblue 1"},{value:"#B2DFEE",name:"lightblue 2"},{value:"#9AC0CD",name:"lightblue 3"},{value:"#68838B",name:"lightblue 4"},{value:"#B0E0E6",css:!0,name:"powderblue"},{value:"#98F5FF",name:"cadetblue 1"},{value:"#8EE5EE",name:"cadetblue 2"},{value:"#7AC5CD",name:"cadetblue 3"},{value:"#53868B",name:"cadetblue 4"},{value:"#00F5FF",name:"turquoise 1"},{value:"#00E5EE",name:"turquoise 2"},{value:"#00C5CD",name:"turquoise 3"},{value:"#00868B",name:"turquoise 4"},{value:"#5F9EA0",css:!0,name:"cadetblue"},{value:"#00CED1",css:!0,name:"darkturquoise"},{value:"#F0FFFF",name:"azure 1"},{value:"#F0FFFF",css:!0,name:"azure"},{value:"#E0EEEE",name:"azure 2"},{value:"#C1CDCD",name:"azure 3"},{value:"#838B8B",name:"azure 4"},{value:"#E0FFFF",name:"lightcyan 1"},{value:"#E0FFFF",css:!0,name:"lightcyan"},{value:"#D1EEEE",name:"lightcyan 2"},{value:"#B4CDCD",name:"lightcyan 3"},{value:"#7A8B8B",name:"lightcyan 4"},{value:"#BBFFFF",name:"paleturquoise 1"},{value:"#AEEEEE",name:"paleturquoise 2"},{value:"#AEEEEE",css:!0,name:"paleturquoise"},{value:"#96CDCD",name:"paleturquoise 3"},{value:"#668B8B",name:"paleturquoise 4"},{value:"#2F4F4F",css:!0,name:"darkslategray"},{value:"#97FFFF",name:"darkslategray 1"},{value:"#8DEEEE",name:"darkslategray 2"},{value:"#79CDCD",name:"darkslategray 3"},{value:"#528B8B",name:"darkslategray 4"},{value:"#00FFFF",name:"cyan"},{value:"#00FFFF",css:!0,name:"aqua"},{value:"#00EEEE",name:"cyan 2"},{value:"#00CDCD",name:"cyan 3"},{value:"#008B8B",name:"cyan 4"},{value:"#008B8B",css:!0,name:"darkcyan"},{value:"#008080",vga:!0,css:!0,name:"teal"},{value:"#48D1CC",css:!0,name:"mediumturquoise"},{value:"#20B2AA",css:!0,name:"lightseagreen"},{value:"#03A89E",name:"manganeseblue"},{value:"#40E0D0",css:!0,name:"turquoise"},{value:"#808A87",name:"coldgrey"},{value:"#00C78C",name:"turquoiseblue"},{value:"#7FFFD4",name:"aquamarine 1"},{value:"#7FFFD4",css:!0,name:"aquamarine"},{value:"#76EEC6",name:"aquamarine 2"},{value:"#66CDAA",name:"aquamarine 3"},{value:"#66CDAA",css:!0,name:"mediumaquamarine"},{value:"#458B74",name:"aquamarine 4"},{value:"#00FA9A",css:!0,name:"mediumspringgreen"},{value:"#F5FFFA",css:!0,name:"mintcream"},{value:"#00FF7F",css:!0,name:"springgreen"},{value:"#00EE76",name:"springgreen 1"},{value:"#00CD66",name:"springgreen 2"},{value:"#008B45",name:"springgreen 3"},{value:"#3CB371",css:!0,name:"mediumseagreen"},{value:"#54FF9F",name:"seagreen 1"},{value:"#4EEE94",name:"seagreen 2"},{value:"#43CD80",name:"seagreen 3"},{value:"#2E8B57",name:"seagreen 4"},{value:"#2E8B57",css:!0,name:"seagreen"},{value:"#00C957",name:"emeraldgreen"},{value:"#BDFCC9",name:"mint"},{value:"#3D9140",name:"cobaltgreen"},{value:"#F0FFF0",name:"honeydew 1"},{value:"#F0FFF0",css:!0,name:"honeydew"},{value:"#E0EEE0",name:"honeydew 2"},{value:"#C1CDC1",name:"honeydew 3"},{value:"#838B83",name:"honeydew 4"},{value:"#8FBC8F",css:!0,name:"darkseagreen"},{value:"#C1FFC1",name:"darkseagreen 1"},{value:"#B4EEB4",name:"darkseagreen 2"},{value:"#9BCD9B",name:"darkseagreen 3"},{value:"#698B69",name:"darkseagreen 4"},{value:"#98FB98",css:!0,name:"palegreen"},{value:"#9AFF9A",name:"palegreen 1"},{value:"#90EE90",name:"palegreen 2"},{value:"#90EE90",css:!0,name:"lightgreen"},{value:"#7CCD7C",name:"palegreen 3"},{value:"#548B54",name:"palegreen 4"},{value:"#32CD32",css:!0,name:"limegreen"},{value:"#228B22",css:!0,name:"forestgreen"},{value:"#00FF00",vga:!0,name:"green 1"},{value:"#00FF00",vga:!0,css:!0,name:"lime"},{value:"#00EE00",name:"green 2"},{value:"#00CD00",name:"green 3"},{value:"#008B00",name:"green 4"},{value:"#008000",vga:!0,css:!0,name:"green"},{value:"#006400",css:!0,name:"darkgreen"},{value:"#308014",name:"sapgreen"},{value:"#7CFC00",css:!0,name:"lawngreen"},{value:"#7FFF00",name:"chartreuse 1"},{value:"#7FFF00",css:!0,name:"chartreuse"},{value:"#76EE00",name:"chartreuse 2"},{value:"#66CD00",name:"chartreuse 3"},{value:"#458B00",name:"chartreuse 4"},{value:"#ADFF2F",css:!0,name:"greenyellow"},{value:"#CAFF70",name:"darkolivegreen 1"},{value:"#BCEE68",name:"darkolivegreen 2"},{value:"#A2CD5A",name:"darkolivegreen 3"},{value:"#6E8B3D",name:"darkolivegreen 4"},{value:"#556B2F",css:!0,name:"darkolivegreen"},{value:"#6B8E23",css:!0,name:"olivedrab"},{value:"#C0FF3E",name:"olivedrab 1"},{value:"#B3EE3A",name:"olivedrab 2"},{value:"#9ACD32",name:"olivedrab 3"},{value:"#9ACD32",css:!0,name:"yellowgreen"},{value:"#698B22",name:"olivedrab 4"},{value:"#FFFFF0",name:"ivory 1"},{value:"#FFFFF0",css:!0,name:"ivory"},{value:"#EEEEE0",name:"ivory 2"},{value:"#CDCDC1",name:"ivory 3"},{value:"#8B8B83",name:"ivory 4"},{value:"#F5F5DC",css:!0,name:"beige"},{value:"#FFFFE0",name:"lightyellow 1"},{value:"#FFFFE0",css:!0,name:"lightyellow"},{value:"#EEEED1",name:"lightyellow 2"},{value:"#CDCDB4",name:"lightyellow 3"},{value:"#8B8B7A",name:"lightyellow 4"},{value:"#FAFAD2",css:!0,name:"lightgoldenrodyellow"},{value:"#FFFF00",vga:!0,name:"yellow 1"},{value:"#FFFF00",vga:!0,css:!0,name:"yellow"},{value:"#EEEE00",name:"yellow 2"},{value:"#CDCD00",name:"yellow 3"},{value:"#8B8B00",name:"yellow 4"},{value:"#808069",name:"warmgrey"},{value:"#808000",vga:!0,css:!0,name:"olive"},{value:"#BDB76B",css:!0,name:"darkkhaki"},{value:"#FFF68F",name:"khaki 1"},{value:"#EEE685",name:"khaki 2"},{value:"#CDC673",name:"khaki 3"},{value:"#8B864E",name:"khaki 4"},{value:"#F0E68C",css:!0,name:"khaki"},{value:"#EEE8AA",css:!0,name:"palegoldenrod"},{value:"#FFFACD",name:"lemonchiffon 1"},{value:"#FFFACD",css:!0,name:"lemonchiffon"},{value:"#EEE9BF",name:"lemonchiffon 2"},{value:"#CDC9A5",name:"lemonchiffon 3"},{value:"#8B8970",name:"lemonchiffon 4"},{value:"#FFEC8B",name:"lightgoldenrod 1"},{value:"#EEDC82",name:"lightgoldenrod 2"},{value:"#CDBE70",name:"lightgoldenrod 3"},{value:"#8B814C",name:"lightgoldenrod 4"},{value:"#E3CF57",name:"banana"},{value:"#FFD700",name:"gold 1"},{value:"#FFD700",css:!0,name:"gold"},{value:"#EEC900",name:"gold 2"},{value:"#CDAD00",name:"gold 3"},{value:"#8B7500",name:"gold 4"},{value:"#FFF8DC",name:"cornsilk 1"},{value:"#FFF8DC",css:!0,name:"cornsilk"},{value:"#EEE8CD",name:"cornsilk 2"},{value:"#CDC8B1",name:"cornsilk 3"},{value:"#8B8878",name:"cornsilk 4"},{value:"#DAA520",css:!0,name:"goldenrod"},{value:"#FFC125",name:"goldenrod 1"},{value:"#EEB422",name:"goldenrod 2"},{value:"#CD9B1D",name:"goldenrod 3"},{value:"#8B6914",name:"goldenrod 4"},{value:"#B8860B",css:!0,name:"darkgoldenrod"},{value:"#FFB90F",name:"darkgoldenrod 1"},{value:"#EEAD0E",name:"darkgoldenrod 2"},{value:"#CD950C",name:"darkgoldenrod 3"},{value:"#8B6508",name:"darkgoldenrod 4"},{value:"#FFA500",name:"orange 1"},{value:"#FF8000",css:!0,name:"orange"},{value:"#EE9A00",name:"orange 2"},{value:"#CD8500",name:"orange 3"},{value:"#8B5A00",name:"orange 4"},{value:"#FFFAF0",css:!0,name:"floralwhite"},{value:"#FDF5E6",css:!0,name:"oldlace"},{value:"#F5DEB3",css:!0,name:"wheat"},{value:"#FFE7BA",name:"wheat 1"},{value:"#EED8AE",name:"wheat 2"},{value:"#CDBA96",name:"wheat 3"},{value:"#8B7E66",name:"wheat 4"},{value:"#FFE4B5",css:!0,name:"moccasin"},{value:"#FFEFD5",css:!0,name:"papayawhip"},{value:"#FFEBCD",css:!0,name:"blanchedalmond"},{value:"#FFDEAD",name:"navajowhite 1"},{value:"#FFDEAD",css:!0,name:"navajowhite"},{value:"#EECFA1",name:"navajowhite 2"},{value:"#CDB38B",name:"navajowhite 3"},{value:"#8B795E",name:"navajowhite 4"},{value:"#FCE6C9",name:"eggshell"},{value:"#D2B48C",css:!0,name:"tan"},{value:"#9C661F",name:"brick"},{value:"#FF9912",name:"cadmiumyellow"},{value:"#FAEBD7",css:!0,name:"antiquewhite"},{value:"#FFEFDB",name:"antiquewhite 1"},{value:"#EEDFCC",name:"antiquewhite 2"},{value:"#CDC0B0",name:"antiquewhite 3"},{value:"#8B8378",name:"antiquewhite 4"},{value:"#DEB887",css:!0,name:"burlywood"},{value:"#FFD39B",name:"burlywood 1"},{value:"#EEC591",name:"burlywood 2"},{value:"#CDAA7D",name:"burlywood 3"},{value:"#8B7355",name:"burlywood 4"},{value:"#FFE4C4",name:"bisque 1"},{value:"#FFE4C4",css:!0,name:"bisque"},{value:"#EED5B7",name:"bisque 2"},{value:"#CDB79E",name:"bisque 3"},{value:"#8B7D6B",name:"bisque 4"},{value:"#E3A869",name:"melon"},{value:"#ED9121",name:"carrot"},{value:"#FF8C00",css:!0,name:"darkorange"},{value:"#FF7F00",name:"darkorange 1"},{value:"#EE7600",name:"darkorange 2"},{value:"#CD6600",name:"darkorange 3"},{value:"#8B4500",name:"darkorange 4"},{value:"#FFA54F",name:"tan 1"},{value:"#EE9A49",name:"tan 2"},{value:"#CD853F",name:"tan 3"},{value:"#CD853F",css:!0,name:"peru"},{value:"#8B5A2B",name:"tan 4"},{value:"#FAF0E6",css:!0,name:"linen"},{value:"#FFDAB9",name:"peachpuff 1"},{value:"#FFDAB9",css:!0,name:"peachpuff"},{value:"#EECBAD",name:"peachpuff 2"},{value:"#CDAF95",name:"peachpuff 3"},{value:"#8B7765",name:"peachpuff 4"},{value:"#FFF5EE",name:"seashell 1"},{value:"#FFF5EE",css:!0,name:"seashell"},{value:"#EEE5DE",name:"seashell 2"},{value:"#CDC5BF",name:"seashell 3"},{value:"#8B8682",name:"seashell 4"},{value:"#F4A460",css:!0,name:"sandybrown"},{value:"#C76114",name:"rawsienna"},{value:"#D2691E",css:!0,name:"chocolate"},{value:"#FF7F24",name:"chocolate 1"},{value:"#EE7621",name:"chocolate 2"},{value:"#CD661D",name:"chocolate 3"},{value:"#8B4513",name:"chocolate 4"},{value:"#8B4513",css:!0,name:"saddlebrown"},{value:"#292421",name:"ivoryblack"},{value:"#FF7D40",name:"flesh"},{value:"#FF6103",name:"cadmiumorange"},{value:"#8A360F",name:"burntsienna"},{value:"#A0522D",css:!0,name:"sienna"},{value:"#FF8247",name:"sienna 1"},{value:"#EE7942",name:"sienna 2"},{value:"#CD6839",name:"sienna 3"},{value:"#8B4726",name:"sienna 4"},{value:"#FFA07A",name:"lightsalmon 1"},{value:"#FFA07A",css:!0,name:"lightsalmon"},{value:"#EE9572",name:"lightsalmon 2"},{value:"#CD8162",name:"lightsalmon 3"},{value:"#8B5742",name:"lightsalmon 4"},{value:"#FF7F50",css:!0,name:"coral"},{value:"#FF4500",name:"orangered 1"},{value:"#FF4500",css:!0,name:"orangered"},{value:"#EE4000",name:"orangered 2"},{value:"#CD3700",name:"orangered 3"},{value:"#8B2500",name:"orangered 4"},{value:"#5E2612",name:"sepia"},{value:"#E9967A",css:!0,name:"darksalmon"},{value:"#FF8C69",name:"salmon 1"},{value:"#EE8262",name:"salmon 2"},{value:"#CD7054",name:"salmon 3"},{value:"#8B4C39",name:"salmon 4"},{value:"#FF7256",name:"coral 1"},{value:"#EE6A50",name:"coral 2"},{value:"#CD5B45",name:"coral 3"},{value:"#8B3E2F",name:"coral 4"},{value:"#8A3324",name:"burntumber"},{value:"#FF6347",name:"tomato 1"},{value:"#FF6347",css:!0,name:"tomato"},{value:"#EE5C42",name:"tomato 2"},{value:"#CD4F39",name:"tomato 3"},{value:"#8B3626",name:"tomato 4"},{value:"#FA8072",css:!0,name:"salmon"},{value:"#FFE4E1",name:"mistyrose 1"},{value:"#FFE4E1",css:!0,name:"mistyrose"},{value:"#EED5D2",name:"mistyrose 2"},{value:"#CDB7B5",name:"mistyrose 3"},{value:"#8B7D7B",name:"mistyrose 4"},{value:"#FFFAFA",name:"snow 1"},{value:"#FFFAFA",css:!0,name:"snow"},{value:"#EEE9E9",name:"snow 2"},{value:"#CDC9C9",name:"snow 3"},{value:"#8B8989",name:"snow 4"},{value:"#BC8F8F",css:!0,name:"rosybrown"},{value:"#FFC1C1",name:"rosybrown 1"},{value:"#EEB4B4",name:"rosybrown 2"},{value:"#CD9B9B",name:"rosybrown 3"},{value:"#8B6969",name:"rosybrown 4"},{value:"#F08080",css:!0,name:"lightcoral"},{value:"#CD5C5C",css:!0,name:"indianred"},{value:"#FF6A6A",name:"indianred 1"},{value:"#EE6363",name:"indianred 2"},{value:"#8B3A3A",name:"indianred 4"},{value:"#CD5555",name:"indianred 3"},{value:"#A52A2A",css:!0,name:"brown"},{value:"#FF4040",name:"brown 1"},{value:"#EE3B3B",name:"brown 2"},{value:"#CD3333",name:"brown 3"},{value:"#8B2323",name:"brown 4"},{value:"#B22222",css:!0,name:"firebrick"},{value:"#FF3030",name:"firebrick 1"},{value:"#EE2C2C",name:"firebrick 2"},{value:"#CD2626",name:"firebrick 3"},{value:"#8B1A1A",name:"firebrick 4"},{value:"#FF0000",vga:!0,name:"red 1"},{value:"#FF0000",vga:!0,css:!0,name:"red"},{value:"#EE0000",name:"red 2"},{value:"#CD0000",name:"red 3"},{value:"#8B0000",name:"red 4"},{value:"#8B0000",css:!0,name:"darkred"},{value:"#800000",vga:!0,css:!0,name:"maroon"},{value:"#8E388E",name:"sgi beet"},{value:"#7171C6",name:"sgi slateblue"},{value:"#7D9EC0",name:"sgi lightblue"},{value:"#388E8E",name:"sgi teal"},{value:"#71C671",name:"sgi chartreuse"},{value:"#8E8E38",name:"sgi olivedrab"},{value:"#C5C1AA",name:"sgi brightgray"},{value:"#C67171",name:"sgi salmon"},{value:"#555555",name:"sgi darkgray"},{value:"#1E1E1E",name:"sgi gray 12"},{value:"#282828",name:"sgi gray 16"},{value:"#515151",name:"sgi gray 32"},{value:"#5B5B5B",name:"sgi gray 36"},{value:"#848484",name:"sgi gray 52"},{value:"#8E8E8E",name:"sgi gray 56"},{value:"#AAAAAA",name:"sgi lightgray"},{value:"#B7B7B7",name:"sgi gray 72"},{value:"#C1C1C1",name:"sgi gray 76"},{value:"#EAEAEA",name:"sgi gray 92"},{value:"#F4F4F4",name:"sgi gray 96"},{value:"#FFFFFF",vga:!0,css:!0,name:"white"},{value:"#F5F5F5",name:"white smoke"},{value:"#F5F5F5",name:"gray 96"},{value:"#DCDCDC",css:!0,name:"gainsboro"},{value:"#D3D3D3",css:!0,name:"lightgrey"},{value:"#C0C0C0",vga:!0,css:!0,name:"silver"},{value:"#A9A9A9",css:!0,name:"darkgray"},{value:"#808080",vga:!0,css:!0,name:"gray"},{value:"#696969",css:!0,name:"dimgray"},{value:"#696969",name:"gray 42"},{value:"#000000",vga:!0,css:!0,name:"black"},{value:"#FCFCFC",name:"gray 99"},{value:"#FAFAFA",name:"gray 98"},{value:"#F7F7F7",name:"gray 97"},{value:"#F2F2F2",name:"gray 95"},{value:"#F0F0F0",name:"gray 94"},{value:"#EDEDED",name:"gray 93"},{value:"#EBEBEB",name:"gray 92"},{value:"#E8E8E8",name:"gray 91"},{value:"#E5E5E5",name:"gray 90"},{value:"#E3E3E3",name:"gray 89"},{value:"#E0E0E0",name:"gray 88"},{value:"#DEDEDE",name:"gray 87"},{value:"#DBDBDB",name:"gray 86"},{value:"#D9D9D9",name:"gray 85"},{value:"#D6D6D6",name:"gray 84"},{value:"#D4D4D4",name:"gray 83"},{value:"#D1D1D1",name:"gray 82"},{value:"#CFCFCF",name:"gray 81"},{value:"#CCCCCC",name:"gray 80"},{value:"#C9C9C9",name:"gray 79"},{value:"#C7C7C7",name:"gray 78"},{value:"#C4C4C4",name:"gray 77"},{value:"#C2C2C2",name:"gray 76"},{value:"#BFBFBF",name:"gray 75"},{value:"#BDBDBD",name:"gray 74"},{value:"#BABABA",name:"gray 73"},{value:"#B8B8B8",name:"gray 72"},{value:"#B5B5B5",name:"gray 71"},{value:"#B3B3B3",name:"gray 70"},{value:"#B0B0B0",name:"gray 69"},{value:"#ADADAD",name:"gray 68"},{value:"#ABABAB",name:"gray 67"},{value:"#A8A8A8",name:"gray 66"},{value:"#A6A6A6",name:"gray 65"},{value:"#A3A3A3",name:"gray 64"},{value:"#A1A1A1",name:"gray 63"},{value:"#9E9E9E",name:"gray 62"},{value:"#9C9C9C",name:"gray 61"},{value:"#999999",name:"gray 60"},{value:"#969696",name:"gray 59"},{value:"#949494",name:"gray 58"},{value:"#919191",name:"gray 57"},{value:"#8F8F8F",name:"gray 56"},{value:"#8C8C8C",name:"gray 55"},{value:"#8A8A8A",name:"gray 54"},{value:"#878787",name:"gray 53"},{value:"#858585",name:"gray 52"},{value:"#828282",name:"gray 51"},{value:"#7F7F7F",name:"gray 50"},{value:"#7D7D7D",name:"gray 49"},{value:"#7A7A7A",name:"gray 48"},{value:"#787878",name:"gray 47"},{value:"#757575",name:"gray 46"},{value:"#737373",name:"gray 45"},{value:"#707070",name:"gray 44"},{value:"#6E6E6E",name:"gray 43"},{value:"#666666",name:"gray 40"},{value:"#636363",name:"gray 39"},{value:"#616161",name:"gray 38"},{value:"#5E5E5E",name:"gray 37"},{value:"#5C5C5C",name:"gray 36"},{value:"#595959",name:"gray 35"},{value:"#575757",name:"gray 34"},{value:"#545454",name:"gray 33"},{value:"#525252",name:"gray 32"},{value:"#4F4F4F",name:"gray 31"},{value:"#4D4D4D",name:"gray 30"},{value:"#4A4A4A",name:"gray 29"},{value:"#474747",name:"gray 28"},{value:"#454545",name:"gray 27"},{value:"#424242",name:"gray 26"},{value:"#404040",name:"gray 25"},{value:"#3D3D3D",name:"gray 24"},{value:"#3B3B3B",name:"gray 23"},{value:"#383838",name:"gray 22"},{value:"#363636",name:"gray 21"},{value:"#333333",name:"gray 20"},{value:"#303030",name:"gray 19"},{value:"#2E2E2E",name:"gray 18"},{value:"#2B2B2B",name:"gray 17"},{value:"#292929",name:"gray 16"},{value:"#262626",name:"gray 15"},{value:"#242424",name:"gray 14"},{value:"#212121",name:"gray 13"},{value:"#1F1F1F",name:"gray 12"},{value:"#1C1C1C",name:"gray 11"},{value:"#1A1A1A",name:"gray 10"},{value:"#171717",name:"gray 9"},{value:"#141414",name:"gray 8"},{value:"#121212",name:"gray 7"},{value:"#0F0F0F",name:"gray 6"},{value:"#0D0D0D",name:"gray 5"},{value:"#0A0A0A",name:"gray 4"},{value:"#080808",name:"gray 3"},{value:"#050505",name:"gray 2"},{value:"#030303",name:"gray 1"},{value:"#F5F5F5",css:!0,name:"whitesmoke"}];(function(t){var e=Qht,n=e.filter(function(i){return!!i.css}),r=e.filter(function(i){return!!i.vga});t.exports=function(i){var s=t.exports.get(i);return s&&s.value},t.exports.get=function(i){return i=i||"",i=i.trim().toLowerCase(),e.filter(function(s){return s.name.toLowerCase()===i}).pop()},t.exports.all=t.exports.get.all=function(){return e},t.exports.get.css=function(i){return i?(i=i||"",i=i.trim().toLowerCase(),n.filter(function(s){return s.name.toLowerCase()===i}).pop()):n},t.exports.get.vga=function(i){return i?(i=i||"",i=i.trim().toLowerCase(),r.filter(function(s){return s.name.toLowerCase()===i}).pop()):r}})(Ame);var _ht=Ame.exports,$ht=1/0,ept="[object Symbol]",tpt=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Gme="\\ud800-\\udfff",npt="\\u0300-\\u036f\\ufe20-\\ufe23",rpt="\\u20d0-\\u20f0",Fme="\\u2700-\\u27bf",jme="a-z\\xdf-\\xf6\\xf8-\\xff",ipt="\\xac\\xb1\\xd7\\xf7",spt="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",apt="\\u2000-\\u206f",opt=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Zme="A-Z\\xc0-\\xd6\\xd8-\\xde",lpt="\\ufe0e\\ufe0f",Jme=ipt+spt+apt+opt,Yme="['’]",z_="["+Jme+"]",upt="["+npt+rpt+"]",Bme="\\d+",cpt="["+Fme+"]",Hme="["+jme+"]",Qme="[^"+Gme+Jme+Bme+Fme+jme+Zme+"]",dpt="\\ud83c[\\udffb-\\udfff]",fpt="(?:"+upt+"|"+dpt+")",hpt="[^"+Gme+"]",_me="(?:\\ud83c[\\udde6-\\uddff]){2}",$me="[\\ud800-\\udbff][\\udc00-\\udfff]",Qg="["+Zme+"]",ppt="\\u200d",k_="(?:"+Hme+"|"+Qme+")",mpt="(?:"+Qg+"|"+Qme+")",O_="(?:"+Yme+"(?:d|ll|m|re|s|t|ve))?",I_="(?:"+Yme+"(?:D|LL|M|RE|S|T|VE))?",eve=fpt+"?",tve="["+lpt+"]?",vpt="(?:"+ppt+"(?:"+[hpt,_me,$me].join("|")+")"+tve+eve+")*",gpt=tve+eve+vpt,bpt="(?:"+[cpt,_me,$me].join("|")+")"+gpt,ypt=RegExp([Qg+"?"+Hme+"+"+O_+"(?="+[z_,Qg,"$"].join("|")+")",mpt+"+"+I_+"(?="+[z_,Qg+k_,"$"].join("|")+")",Qg+"?"+k_+"+"+O_,Qg+"+"+I_,Bme,bpt].join("|"),"g"),Spt=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,xpt=typeof Ks=="object"&&Ks&&Ks.Object===Object&&Ks,Tpt=typeof self=="object"&&self&&self.Object===Object&&self,wpt=xpt||Tpt||Function("return this")();function Ept(t){return t.match(tpt)||[]}function Mpt(t){return Spt.test(t)}function Ppt(t){return t.match(ypt)||[]}var Rpt=Object.prototype,Vpt=Rpt.toString,U_=wpt.Symbol,N_=U_?U_.prototype:void 0,L_=N_?N_.toString:void 0;function zpt(t){if(typeof t=="string")return t;if(Opt(t))return L_?L_.call(t):"";var e=t+"";return e=="0"&&1/t==-$ht?"-0":e}function kpt(t){return!!t&&typeof t=="object"}function Opt(t){return typeof t=="symbol"||kpt(t)&&Vpt.call(t)==ept}function Ipt(t){return t==null?"":zpt(t)}function Upt(t,e,n){return t=Ipt(t),e=n?void 0:e,e===void 0?Mpt(t)?Ppt(t):Ept(t):t.match(e)||[]}var Npt=Upt,Lpt=1/0,Xpt="[object Symbol]",Cpt=/^\s+/,LD="\\ud800-\\udfff",nve="\\u0300-\\u036f\\ufe20-\\ufe23",rve="\\u20d0-\\u20f0",ive="\\ufe0e\\ufe0f",Kpt="["+LD+"]",Y8="["+nve+rve+"]",B8="\\ud83c[\\udffb-\\udfff]",qpt="(?:"+Y8+"|"+B8+")",sve="[^"+LD+"]",ave="(?:\\ud83c[\\udde6-\\uddff]){2}",ove="[\\ud800-\\udbff][\\udc00-\\udfff]",lve="\\u200d",uve=qpt+"?",cve="["+ive+"]?",Dpt="(?:"+lve+"(?:"+[sve,ave,ove].join("|")+")"+cve+uve+")*",Wpt=cve+uve+Dpt,Apt="(?:"+[sve+Y8+"?",Y8,ave,ove,Kpt].join("|")+")",Gpt=RegExp(B8+"(?="+B8+")|"+Apt+Wpt,"g"),Fpt=RegExp("["+lve+LD+nve+rve+ive+"]"),jpt=typeof Ks=="object"&&Ks&&Ks.Object===Object&&Ks,Zpt=typeof self=="object"&&self&&self.Object===Object&&self,Jpt=jpt||Zpt||Function("return this")();function Ypt(t){return t.split("")}function Bpt(t,e,n,r){for(var i=t.length,s=n+(r?1:-1);r?s--:++s-1;);return n}function $pt(t){return Fpt.test(t)}function X_(t){return $pt(t)?emt(t):Ypt(t)}function emt(t){return t.match(Gpt)||[]}var tmt=Object.prototype,nmt=tmt.toString,C_=Jpt.Symbol,K_=C_?C_.prototype:void 0,q_=K_?K_.toString:void 0;function rmt(t,e,n){var r=-1,i=t.length;e<0&&(e=-e>i?0:i+e),n=n>i?i:n,n<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var s=Array(i);++r=r?t:rmt(t,e,n)}function smt(t){return!!t&&typeof t=="object"}function amt(t){return typeof t=="symbol"||smt(t)&&nmt.call(t)==Xpt}function omt(t){return t==null?"":dve(t)}function lmt(t,e,n){if(t=omt(t),t&&(n||e===void 0))return t.replace(Cpt,"");if(!t||!(e=dve(e)))return t;var r=X_(t),i=_pt(r,X_(e));return imt(r,i).join("")}var umt=lmt,H8=1/0,cmt=9007199254740991,dmt=17976931348623157e292,D_=0/0,fmt="[object Symbol]",hmt=/^\s+|\s+$/g,pmt=/^[-+]0x[0-9a-f]+$/i,mmt=/^0b[01]+$/i,vmt=/^0o[0-7]+$/i,XD="\\ud800-\\udfff",fve="\\u0300-\\u036f\\ufe20-\\ufe23",hve="\\u20d0-\\u20f0",pve="\\ufe0e\\ufe0f",gmt="["+XD+"]",Q8="["+fve+hve+"]",_8="\\ud83c[\\udffb-\\udfff]",bmt="(?:"+Q8+"|"+_8+")",mve="[^"+XD+"]",vve="(?:\\ud83c[\\udde6-\\uddff]){2}",gve="[\\ud800-\\udbff][\\udc00-\\udfff]",bve="\\u200d",yve=bmt+"?",Sve="["+pve+"]?",ymt="(?:"+bve+"(?:"+[mve,vve,gve].join("|")+")"+Sve+yve+")*",Smt=Sve+yve+ymt,xmt="(?:"+[mve+Q8+"?",Q8,vve,gve,gmt].join("|")+")",$8=RegExp(_8+"(?="+_8+")|"+xmt+Smt,"g"),Tmt=RegExp("["+bve+XD+fve+hve+pve+"]"),wmt=parseInt,Emt=typeof Ks=="object"&&Ks&&Ks.Object===Object&&Ks,Mmt=typeof self=="object"&&self&&self.Object===Object&&self,Pmt=Emt||Mmt||Function("return this")(),Rmt=zmt("length");function Vmt(t){return t.split("")}function zmt(t){return function(e){return e==null?void 0:e[t]}}function CD(t){return Tmt.test(t)}function xve(t){return CD(t)?Omt(t):Rmt(t)}function kmt(t){return CD(t)?Imt(t):Vmt(t)}function Omt(t){for(var e=$8.lastIndex=0;$8.test(t);)e++;return e}function Imt(t){return t.match($8)||[]}var Umt=Object.prototype,Nmt=Umt.toString,W_=Pmt.Symbol,Lmt=Math.ceil,Xmt=Math.floor,A_=W_?W_.prototype:void 0,G_=A_?A_.toString:void 0;function F_(t,e){var n="";if(!t||e<1||e>cmt)return n;do e%2&&(n+=t),e=Xmt(e/2),e&&(t+=t);while(e);return n}function Cmt(t,e,n){var r=-1,i=t.length;e<0&&(e=-e>i?0:i+e),n=n>i?i:n,n<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var s=Array(i);++r=r?t:Cmt(t,e,n)}function qmt(t,e){e=e===void 0?" ":Tve(e);var n=e.length;if(n<2)return n?F_(e,t):e;var r=F_(e,Lmt(t/xve(e)));return CD(e)?Kmt(kmt(r),0,t).join(""):r.slice(0,t)}function j_(t){var e=typeof t;return!!t&&(e=="object"||e=="function")}function Dmt(t){return!!t&&typeof t=="object"}function wve(t){return typeof t=="symbol"||Dmt(t)&&Nmt.call(t)==fmt}function Wmt(t){if(!t)return t===0?t:0;if(t=Gmt(t),t===H8||t===-H8){var e=t<0?-1:1;return e*dmt}return t===t?t:0}function Amt(t){var e=Wmt(t),n=e%1;return e===e?n?e-n:e:0}function Gmt(t){if(typeof t=="number")return t;if(wve(t))return D_;if(j_(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=j_(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=t.replace(hmt,"");var n=mmt.test(t);return n||vmt.test(t)?wmt(t.slice(2),n?2:8):pmt.test(t)?D_:+t}function Fmt(t){return t==null?"":Tve(t)}function jmt(t,e,n){t=Fmt(t),e=Amt(e);var r=e?xve(t):0;return e&&r{const i=(t+(r||"")).toString().includes("%");if(typeof t=="string"?[t,e,n,r]=t.match(/(0?\.?\d{1,3})%?\b/g).map(Number):r!==void 0&&(r=parseFloat(r)),typeof t!="number"||typeof e!="number"||typeof n!="number"||t>255||e>255||n>255)throw new TypeError("Expected three numbers below 256");if(typeof r=="number"){if(!i&&r>=0&&r<=1)r=Math.round(255*r);else if(i&&r>=0&&r<=100)r=Math.round(255*r/100);else throw new TypeError(`Expected alpha value (${r}) as a fraction or percentage`);r=(r|256).toString(16).slice(1)}else r="";return(n|e<<8|t<<16|1<<24).toString(16).slice(1)+r};const R6="a-f\\d",Ymt=`#?[${R6}]{3}[${R6}]?`,Bmt=`#?[${R6}]{6}([${R6}]{2})?`,Hmt=new RegExp(`[^#${R6}]`,"gi"),Qmt=new RegExp(`^${Ymt}$|^${Bmt}$`,"i");var _mt=(t,e={})=>{if(typeof t!="string"||Hmt.test(t)||!Qmt.test(t))throw new TypeError("Expected a valid hex string");t=t.replace(/^#/,"");let n=1;t.length===8&&(n=Number.parseInt(t.slice(6,8),16)/255,t=t.slice(0,6)),t.length===4&&(n=Number.parseInt(t.slice(3,4).repeat(2),16)/255,t=t.slice(0,3)),t.length===3&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]);const r=Number.parseInt(t,16),i=r>>16,s=r>>8&255,a=r&255,o=typeof e.alpha=="number"?e.alpha:n;if(e.format==="array")return[i,s,a,o];if(e.format==="css"){const l=o===1?"":` / ${Number((o*100).toFixed(2))}%`;return`rgb(${i} ${s} ${a}${l})`}return{red:i,green:s,blue:a,alpha:o}},$mt=_ht,evt=Npt,tvt=umt,nvt=Zmt,rvt=Jmt,Eve=_mt;const DI=.75,WI=.25,AI=16777215,ivt=49979693;var svt=function(t){return"#"+lvt(String(JSON.stringify(t)))};function avt(t){var e=evt(t),n=[];return e.forEach(function(r){var i=$mt(r);i&&n.push(Eve(tvt(i,"#"),{format:"array"}))}),n}function ovt(t){var e=[0,0,0];return t.forEach(function(n){for(var r=0;r<3;r++)e[r]+=n[r]}),[e[0]/t.length,e[1]/t.length,e[2]/t.length]}function lvt(t){var e,n=avt(t);n.length>0&&(e=ovt(n));var r=1,i=0,s=1;if(t.length>0)for(var a=0;ai&&(i=t[a].charCodeAt(0)),s=parseInt(AI/i),r=(r+t[a].charCodeAt(0)*s*ivt)%AI;var o=(r*t.length%AI).toString(16);o=nvt(o,6,o);var l=Eve(o,{format:"array"});return e?rvt(WI*l[0]+DI*e[0],WI*l[1]+DI*e[1],WI*l[2]+DI*e[2]):o}const uvt=wV(svt);/*! fflate - fast JavaScript compression/decompression Licensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE version 0.6.9 -*/var Y_={},e4=function(t){return URL.createObjectURL(new Blob([t],{type:"text/javascript"}))},Pve=function(t){return new Worker(t)};try{URL.revokeObjectURL(e4(""))}catch{e4=function(e){return"data:application/javascript;charset=UTF-8,"+encodeURI(e)},Pve=function(e){return new Worker(e,{type:"module"})}}var uvt=function(t,e,n,r,i){var s=Pve(Y_[e]||(Y_[e]=e4(t)));return s.onerror=function(a){return i(a.error,null)},s.onmessage=function(a){return i(null,a.data)},s.postMessage(n,r),s},Xn=Uint8Array,Ds=Uint16Array,Pf=Uint32Array,Xy=new Xn([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Cy=new Xn([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),z6=new Xn([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Rve=function(t,e){for(var n=new Ds(31),r=0;r<31;++r)n[r]=e+=1<>>1|(si&21845)<<1;vh=(vh&52428)>>>2|(vh&13107)<<2,vh=(vh&61680)>>>4|(vh&3855)<<4,k6[si]=((vh&65280)>>>8|(vh&255)<<8)>>>1}var Zl=function(t,e,n){for(var r=t.length,i=0,s=new Ds(e);i>>l]=u}else for(o=new Ds(r),i=0;i>>15-t[i]);return o},Rf=new Xn(288);for(var si=0;si<144;++si)Rf[si]=8;for(var si=144;si<256;++si)Rf[si]=9;for(var si=256;si<280;++si)Rf[si]=7;for(var si=280;si<288;++si)Rf[si]=8;var Ob=new Xn(32);for(var si=0;si<32;++si)Ob[si]=5;var Ove=Zl(Rf,9,0),Ive=Zl(Rf,9,1),Uve=Zl(Ob,5,0),Nve=Zl(Ob,5,1),G7=function(t){for(var e=t[0],n=1;ne&&(e=t[n]);return e},Cl=function(t,e,n){var r=e/8|0;return(t[r]|t[r+1]<<8)>>(e&7)&n},F7=function(t,e){var n=e/8|0;return(t[n]|t[n+1]<<8|t[n+2]<<16)>>(e&7)},_T=function(t){return(t/8|0)+(t&7&&1)},Jl=function(t,e,n){(e==null||e<0)&&(e=0),(n==null||n>t.length)&&(n=t.length);var r=new(t instanceof Ds?Ds:t instanceof Pf?Pf:Xn)(n-e);return r.set(t.subarray(e,n)),r},$T=function(t,e,n){var r=t.length;if(!r||n&&!n.l&&r<5)return e||new Xn(0);var i=!e||n,s=!n||n.i;n||(n={}),e||(e=new Xn(r*3));var a=function(te){var _=e.length;if(te>_){var oe=new Xn(Math.max(_*2,te));oe.set(e),e=oe}},o=n.f||0,l=n.p||0,u=n.b||0,c=n.l,d=n.d,f=n.m,h=n.n,p=r*8;do{if(!c){n.f=o=Cl(t,l,1);var m=Cl(t,l+1,3);if(l+=3,m)if(m==1)c=Ive,d=Nve,f=9,h=5;else if(m==2){var y=Cl(t,l,31)+257,x=Cl(t,l+10,15)+4,T=y+Cl(t,l+5,31)+1;l+=14;for(var M=new Xn(T),E=new Xn(19),S=0;S>>4;if(v<16)M[S++]=v;else{var k=0,N=0;for(v==16?(N=3+Cl(t,l,3),l+=2,k=M[S-1]):v==17?(N=3+Cl(t,l,7),l+=3):v==18&&(N=11+Cl(t,l,127),l+=7);N--;)M[S++]=k}}var q=M.subarray(0,y),L=M.subarray(y);f=G7(q),h=G7(L),c=Zl(q,f,1),d=Zl(L,h,1)}else throw"invalid block type";else{var v=_T(l)+4,g=t[v-4]|t[v-3]<<8,b=v+g;if(b>r){if(s)throw"unexpected EOF";break}i&&a(u+g),e.set(t.subarray(v,b),u),n.b=u+=g,n.p=l=b*8;continue}if(l>p){if(s)throw"unexpected EOF";break}}i&&a(u+131072);for(var A=(1<>>4;if(l+=k&15,l>p){if(s)throw"unexpected EOF";break}if(!k)throw"invalid length/literal";if(ne<256)e[u++]=ne;else if(ne==256){j=l,c=null;break}else{var G=ne-254;if(ne>264){var S=ne-257,B=Xy[S];G=Cl(t,l,(1<>>4;if(!ee)throw"invalid distance";l+=ee&15;var L=kve[ce];if(ce>3){var B=Cy[ce];L+=F7(t,l)&(1<p){if(s)throw"unexpected EOF";break}i&&a(u+131072);for(var fe=u+G;u>>8},_g=function(t,e,n){n<<=e&7;var r=e/8|0;t[r]|=n,t[r+1]|=n>>>8,t[r+2]|=n>>>16},j7=function(t,e){for(var n=[],r=0;rf&&(f=s[r].s);var h=new Ds(f+1),p=CP(n[c-1],h,0);if(p>e){var r=0,m=0,v=p-e,g=1<e)m+=g-(1<>>=v;m>0;){var y=s[r].s;h[y]=0&&m;--r){var x=s[r].s;h[x]==e&&(--h[x],++m)}p=e}return[new Xn(h),p]},CP=function(t,e,n){return t.s==-1?Math.max(CP(t.l,e,n+1),CP(t.r,e,n+1)):e[t.s]=n},n4=function(t){for(var e=t.length;e&&!t[--e];);for(var n=new Ds(++e),r=0,i=t[0],s=1,a=function(l){n[r++]=l},o=1;o<=e;++o)if(t[o]==i&&o!=e)++s;else{if(!i&&s>2){for(;s>138;s-=138)a(32754);s>2&&(a(s>10?s-11<<5|28690:s-3<<5|12305),s=0)}else if(s>3){for(a(i),--s;s>6;s-=6)a(8304);s>2&&(a(s-3<<5|8208),s=0)}for(;s--;)a(i);s=1,i=t[o]}return[n.subarray(0,r),e]},$g=function(t,e){for(var n=0,r=0;r>>8,t[i+2]=t[i]^255,t[i+3]=t[i+1]^255;for(var s=0;s4&&!R[z6[z-1]];--z);var k=u+5<<3,N=$g(i,Rf)+$g(s,Ob)+a,q=$g(i,f)+$g(s,m)+a+14+3*z+$g(E,R)+(2*E[16]+3*E[17]+7*E[18]);if(k<=N&&k<=q)return vx(e,c,t.subarray(l,l+u));var L,A,Z,j;if(Sc(e,c,1+(q15&&(Sc(e,c,ee[S]>>>5&127),c+=ee[S]>>>12)}}else L=Ove,A=Rf,Z=Uve,j=Ob;for(var S=0;S255){var ce=r[S]>>>18&31;_g(e,c,L[ce+257]),c+=A[ce+257],ce>7&&(Sc(e,c,r[S]>>>23&31),c+=Xy[ce]);var fe=r[S]&31;_g(e,c,Z[fe]),c+=j[fe],fe>3&&(_g(e,c,r[S]>>>5&8191),c+=Cy[fe])}else _g(e,c,L[r[S]]),c+=A[r[S]];return _g(e,c,L[256]),c+A[256]},Lve=new Pf([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),tf=new Xn(0),Xve=function(t,e,n,r,i,s){var a=t.length,o=new Xn(r+a+5*(1+Math.ceil(a/7e3))+i),l=o.subarray(r,o.length-i),u=0;if(!e||a<8)for(var c=0;c<=a;c+=65535){var d=c+65535;d>>13,p=f&8191,m=(1<7e3||R>24576)&&L>423){u=r4(t,l,0,T,M,E,P,R,z,c-z,u),R=S=P=0,z=c;for(var A=0;A<286;++A)M[A]=0;for(var A=0;A<30;++A)E[A]=0}var Z=2,j=0,ne=p,G=N-q&32767;if(L>2&&k==x(c-G))for(var B=Math.min(h,L)-1,ee=Math.min(32767,c),ce=Math.min(258,L);G<=ee&&--ne&&N!=q;){if(t[c+Z]==t[c+Z-G]){for(var fe=0;feZ){if(Z=fe,j=G,fe>B)break;for(var te=Math.min(G,fe-2),_=0,A=0;A_&&(_=ve,q=oe)}}}N=q,q=v[N],G+=N-q+32768&32767}if(j){T[R++]=268435456|XP[Z]<<18|t4[j];var Ke=XP[Z]&31,le=t4[j]&31;P+=Xy[Ke]+Cy[le],++M[257+Ke],++E[le],V=c+Z,++S}else T[R++]=t[c],++M[t[c]]}}u=r4(t,l,s,T,M,E,P,R,z,c-z,u),!s&&u&7&&(u=vx(l,u+1,tf))}return Jl(o,0,r+_T(u)+i)},Cve=function(){for(var t=new Pf(256),e=0;e<256;++e){for(var n=e,r=9;--r;)n=(n&1&&3988292384)^n>>>1;t[e]=n}return t}(),Ky=function(){var t=-1;return{p:function(e){for(var n=t,r=0;r>>8;t=n},d:function(){return~t}}},KD=function(){var t=1,e=0;return{p:function(n){for(var r=t,i=e,s=n.length,a=0;a!=s;){for(var o=Math.min(a+2655,s);a>16),i=(i&65535)+15*(i>>16)}t=r,e=i},d:function(){return t%=65521,e%=65521,(t&255)<<24|t>>>8<<16|(e&255)<<8|e>>>8}}},k0=function(t,e,n,r,i){return Xve(t,e.level==null?6:e.level,e.mem==null?Math.ceil(Math.max(8,Math.min(13,Math.log(t.length)))*1.5):12+e.mem,n,r,!i)},ew=function(t,e){var n={};for(var r in t)n[r]=t[r];for(var r in e)n[r]=e[r];return n},B_=function(t,e,n){for(var r=t(),i=t.toString(),s=i.slice(i.indexOf("[")+1,i.lastIndexOf("]")).replace(/ /g,"").split(","),a=0;a>>0},GI=function(t,e){return ji(t,e)+ji(t,e+4)*4294967296},mr=function(t,e,n){for(;n;++e)t[e]=n,n>>>=8},DD=function(t,e){var n=e.filename;if(t[0]=31,t[1]=139,t[2]=8,t[8]=e.level<2?4:e.level==9?2:0,t[9]=3,e.mtime!=0&&mr(t,4,Math.floor(new Date(e.mtime||Date.now())/1e3)),n){t[3]=8;for(var r=0;r<=n.length;++r)t[r+10]=n.charCodeAt(r)}},WD=function(t){if(t[0]!=31||t[1]!=139||t[2]!=8)throw"invalid gzip data";var e=t[3],n=10;e&4&&(n+=t[10]|(t[11]<<8)+2);for(var r=(e>>3&1)+(e>>4&1);r>0;r-=!t[n++]);return n+(e&2)},Gve=function(t){var e=t.length;return(t[e-4]|t[e-3]<<8|t[e-2]<<16|t[e-1]<<24)>>>0},AD=function(t){return 10+(t.filename&&t.filename.length+1||0)},GD=function(t,e){var n=e.level,r=n==0?0:n<6?1:n==9?3:2;t[0]=120,t[1]=r<<6|(r?32-2*r:1)},Fve=function(t){if((t[0]&15)!=8||t[0]>>>4>7||(t[0]<<8|t[1])%31)throw"invalid zlib data";if(t[1]&32)throw"invalid zlib data: preset dictionaries not supported"};function FD(t,e){return!e&&typeof t=="function"&&(e=t,t={}),this.ondata=e,t}var rd=function(){function t(e,n){!n&&typeof e=="function"&&(n=e,e={}),this.ondata=n,this.o=e||{}}return t.prototype.p=function(e,n){this.ondata(k0(e,this.o,0,0,!n),n)},t.prototype.push=function(e,n){if(this.d)throw"stream finished";if(!this.ondata)throw"no stream handler";this.d=n,this.p(e,n||!1)},t}(),jve=function(){function t(e,n){Ay([Dy,function(){return[Hl,rd]}],this,FD.call(this,e,n),function(r){var i=new rd(r.data);onmessage=Hl(i)},6)}return t}();function Zve(t,e,n){if(n||(n=e,e={}),typeof n!="function")throw"no callback";return Wy(t,e,[Dy],function(r){return um(tw(r.data[0],r.data[1]))},0,n)}function tw(t,e){return k0(t,e||{},0,0)}var Ko=function(){function t(e){this.s={},this.p=new Xn(0),this.ondata=e}return t.prototype.e=function(e){if(this.d)throw"stream finished";if(!this.ondata)throw"no stream handler";var n=this.p.length,r=new Xn(n+e.length);r.set(this.p),r.set(e,n),this.p=r},t.prototype.c=function(e){this.d=this.s.i=e||!1;var n=this.s.b,r=$T(this.p,this.o,this.s);this.ondata(Jl(r,n,this.s.b),this.d),this.o=Jl(r,this.s.b-32768),this.s.b=this.o.length,this.p=Jl(this.p,this.s.p/8|0),this.s.p&=7},t.prototype.push=function(e,n){this.e(e),this.c(n)},t}(),jD=function(){function t(e){this.ondata=e,Ay([qy,function(){return[Hl,Ko]}],this,0,function(){var n=new Ko;onmessage=Hl(n)},7)}return t}();function ZD(t,e,n){if(n||(n=e,e={}),typeof n!="function")throw"no callback";return Wy(t,e,[qy],function(r){return um(Gy(r.data[0],qD(r.data[1])))},1,n)}function Gy(t,e){return $T(t,e)}var KP=function(){function t(e,n){this.c=Ky(),this.l=0,this.v=1,rd.call(this,e,n)}return t.prototype.push=function(e,n){rd.prototype.push.call(this,e,n)},t.prototype.p=function(e,n){this.c.p(e),this.l+=e.length;var r=k0(e,this.o,this.v&&AD(this.o),n&&8,!n);this.v&&(DD(r,this.o),this.v=0),n&&(mr(r,r.length-8,this.c.d()),mr(r,r.length-4,this.l)),this.ondata(r,n)},t}(),H_=function(){function t(e,n){Ay([Dy,qve,function(){return[Hl,rd,KP]}],this,FD.call(this,e,n),function(r){var i=new KP(r.data);onmessage=Hl(i)},8)}return t}();function Q_(t,e,n){if(n||(n=e,e={}),typeof n!="function")throw"no callback";return Wy(t,e,[Dy,qve,function(){return[qP]}],function(r){return um(qP(r.data[0],r.data[1]))},2,n)}function qP(t,e){e||(e={});var n=Ky(),r=t.length;n.p(t);var i=k0(t,e,AD(e),8),s=i.length;return DD(i,e),mr(i,s-8,n.d()),mr(i,s-4,r),i}var DP=function(){function t(e){this.v=1,Ko.call(this,e)}return t.prototype.push=function(e,n){if(Ko.prototype.e.call(this,e),this.v){var r=this.p.length>3?WD(this.p):4;if(r>=this.p.length&&!n)return;this.p=this.p.subarray(r),this.v=0}if(n){if(this.p.length<8)throw"invalid gzip stream";this.p=this.p.subarray(0,-8)}Ko.prototype.c.call(this,n)},t}(),Jve=function(){function t(e){this.ondata=e,Ay([qy,Dve,function(){return[Hl,Ko,DP]}],this,0,function(){var n=new DP;onmessage=Hl(n)},9)}return t}();function Yve(t,e,n){if(n||(n=e,e={}),typeof n!="function")throw"no callback";return Wy(t,e,[qy,Dve,function(){return[WP]}],function(r){return um(WP(r.data[0]))},3,n)}function WP(t,e){return $T(t.subarray(WD(t),-8),e||new Xn(Gve(t)))}var i4=function(){function t(e,n){this.c=KD(),this.v=1,rd.call(this,e,n)}return t.prototype.push=function(e,n){rd.prototype.push.call(this,e,n)},t.prototype.p=function(e,n){this.c.p(e);var r=k0(e,this.o,this.v&&2,n&&4,!n);this.v&&(GD(r,this.o),this.v=0),n&&mr(r,r.length-4,this.c.d()),this.ondata(r,n)},t}(),dvt=function(){function t(e,n){Ay([Dy,Wve,function(){return[Hl,rd,i4]}],this,FD.call(this,e,n),function(r){var i=new i4(r.data);onmessage=Hl(i)},10)}return t}();function fvt(t,e,n){if(n||(n=e,e={}),typeof n!="function")throw"no callback";return Wy(t,e,[Dy,Wve,function(){return[s4]}],function(r){return um(s4(r.data[0],r.data[1]))},4,n)}function s4(t,e){e||(e={});var n=KD();n.p(t);var r=k0(t,e,2,4);return GD(r,e),mr(r,r.length-4,n.d()),r}var AP=function(){function t(e){this.v=1,Ko.call(this,e)}return t.prototype.push=function(e,n){if(Ko.prototype.e.call(this,e),this.v){if(this.p.length<2&&!n)return;this.p=this.p.subarray(2),this.v=0}if(n){if(this.p.length<4)throw"invalid zlib stream";this.p=this.p.subarray(0,-4)}Ko.prototype.c.call(this,n)},t}(),Bve=function(){function t(e){this.ondata=e,Ay([qy,Ave,function(){return[Hl,Ko,AP]}],this,0,function(){var n=new AP;onmessage=Hl(n)},11)}return t}();function Hve(t,e,n){if(n||(n=e,e={}),typeof n!="function")throw"no callback";return Wy(t,e,[qy,Ave,function(){return[ep]}],function(r){return um(ep(r.data[0],qD(r.data[1])))},5,n)}function ep(t,e){return $T((Fve(t),t.subarray(2,-4)),e)}var Qve=function(){function t(e){this.G=DP,this.I=Ko,this.Z=AP,this.ondata=e}return t.prototype.push=function(e,n){if(!this.ondata)throw"no stream handler";if(this.s)this.s.push(e,n);else{if(this.p&&this.p.length){var r=new Xn(this.p.length+e.length);r.set(this.p),r.set(e,this.p.length)}else this.p=e;if(this.p.length>2){var i=this,s=function(){i.ondata.apply(i,arguments)};this.s=this.p[0]==31&&this.p[1]==139&&this.p[2]==8?new this.G(s):(this.p[0]&15)!=8||this.p[0]>>4>7||(this.p[0]<<8|this.p[1])%31?new this.I(s):new this.Z(s),this.s.push(this.p,n),this.p=null}}},t}(),hvt=function(){function t(e){this.G=Jve,this.I=jD,this.Z=Bve,this.ondata=e}return t.prototype.push=function(e,n){Qve.prototype.push.call(this,e,n)},t}();function pvt(t,e,n){if(n||(n=e,e={}),typeof n!="function")throw"no callback";return t[0]==31&&t[1]==139&&t[2]==8?Yve(t,e,n):(t[0]&15)!=8||t[0]>>4>7||(t[0]<<8|t[1])%31?ZD(t,e,n):Hve(t,e,n)}function mvt(t,e){return t[0]==31&&t[1]==139&&t[2]==8?WP(t,e):(t[0]&15)!=8||t[0]>>4>7||(t[0]<<8|t[1])%31?Gy(t,e):ep(t,e)}var JD=function(t,e,n,r){for(var i in t){var s=t[i],a=e+i;s instanceof Xn?n[a]=[s,r]:Array.isArray(s)?n[a]=[s[0],ew(r,s[1])]:JD(s,a+"/",n,r)}},__=typeof TextEncoder<"u"&&new TextEncoder,a4=typeof TextDecoder<"u"&&new TextDecoder,_ve=0;try{a4.decode(tf,{stream:!0}),_ve=1}catch{}var $ve=function(t){for(var e="",n=0;;){var r=t[n++],i=(r>127)+(r>223)+(r>239);if(n+i>t.length)return[e,Jl(t,n-1)];i?i==3?(r=((r&15)<<18|(t[n++]&63)<<12|(t[n++]&63)<<6|t[n++]&63)-65536,e+=String.fromCharCode(55296|r>>10,56320|r&1023)):i&1?e+=String.fromCharCode((r&31)<<6|t[n++]&63):e+=String.fromCharCode((r&15)<<12|(t[n++]&63)<<6|t[n++]&63):e+=String.fromCharCode(r)}},vvt=function(){function t(e){this.ondata=e,_ve?this.t=new TextDecoder:this.p=tf}return t.prototype.push=function(e,n){if(!this.ondata)throw"no callback";if(n=!!n,this.t){if(this.ondata(this.t.decode(e,{stream:!0}),n),n){if(this.t.decode().length)throw"invalid utf-8 data";this.t=null}return}if(!this.p)throw"stream finished";var r=new Xn(this.p.length+e.length);r.set(this.p),r.set(e,this.p.length);var i=$ve(r),s=i[0],a=i[1];if(n){if(a.length)throw"invalid utf-8 data";this.p=null}else this.p=a;this.ondata(s,n)},t}(),gvt=function(){function t(e){this.ondata=e}return t.prototype.push=function(e,n){if(!this.ondata)throw"no callback";if(this.d)throw"stream finished";this.ondata(Dp(e),this.d=n||!1)},t}();function Dp(t,e){if(e){for(var n=new Xn(t.length),r=0;r>1)),a=0,o=function(c){s[a++]=c},r=0;rs.length){var l=new Xn(a+8+(i-r<<1));l.set(s),s=l}var u=t.charCodeAt(r);u<128||e?o(u):u<2048?(o(192|u>>6),o(128|u&63)):u>55295&&u<57344?(u=65536+(u&1047552)|t.charCodeAt(++r)&1023,o(240|u>>18),o(128|u>>12&63),o(128|u>>6&63),o(128|u&63)):(o(224|u>>12),o(128|u>>6&63),o(128|u&63))}return Jl(s,0,a)}function YD(t,e){if(e){for(var n="",r=0;r65535)throw"extra field too long";e+=r+4}return e},Ib=function(t,e,n,r,i,s,a,o){var l=r.length,u=n.extra,c=o&&o.length,d=bp(u);mr(t,e,a!=null?33639248:67324752),e+=4,a!=null&&(t[e++]=20,t[e++]=n.os),t[e]=20,e+=2,t[e++]=n.flag<<1|(s==null&&8),t[e++]=i&&8,t[e++]=n.compression&255,t[e++]=n.compression>>8;var f=new Date(n.mtime==null?Date.now():n.mtime),h=f.getFullYear()-1980;if(h<0||h>119)throw"date not in range 1980-2099";if(mr(t,e,h<<25|f.getMonth()+1<<21|f.getDate()<<16|f.getHours()<<11|f.getMinutes()<<5|f.getSeconds()>>>1),e+=4,s!=null&&(mr(t,e,n.crc),mr(t,e+4,s),mr(t,e+8,n.size)),mr(t,e+12,l),mr(t,e+14,d),e+=16,a!=null&&(mr(t,e,c),mr(t,e+6,n.attrs),mr(t,e+10,a),e+=14),t.set(r,e),e+=l,d)for(var p in u){var m=u[p],v=m.length;mr(t,e,+p),mr(t,e+2,v),t.set(m,e+4),e+=4+v}return c&&(t.set(o,e),e+=c),e},BD=function(t,e,n,r,i){mr(t,e,101010256),mr(t,e+8,n),mr(t,e+10,n),mr(t,e+12,r),mr(t,e+16,i)},O6=function(){function t(e){this.filename=e,this.c=Ky(),this.size=0,this.compression=0}return t.prototype.process=function(e,n){this.ondata(null,e,n)},t.prototype.push=function(e,n){if(!this.ondata)throw"no callback - add to ZIP archive before pushing";this.c.p(e),this.size+=e.length,n&&(this.crc=this.c.d()),this.process(e,n||!1)},t}(),bvt=function(){function t(e,n){var r=this;n||(n={}),O6.call(this,e),this.d=new rd(n,function(i,s){r.ondata(null,i,s)}),this.compression=8,this.flag=e0e(n.level)}return t.prototype.process=function(e,n){try{this.d.push(e,n)}catch(r){this.ondata(r,null,n)}},t.prototype.push=function(e,n){O6.prototype.push.call(this,e,n)},t}(),yvt=function(){function t(e,n){var r=this;n||(n={}),O6.call(this,e),this.d=new jve(n,function(i,s,a){r.ondata(i,s,a)}),this.compression=8,this.flag=e0e(n.level),this.terminate=this.d.terminate}return t.prototype.process=function(e,n){this.d.push(e,n)},t.prototype.push=function(e,n){O6.prototype.push.call(this,e,n)},t}(),Svt=function(){function t(e){this.ondata=e,this.u=[],this.d=1}return t.prototype.add=function(e){var n=this;if(this.d&2)throw"stream finished";var r=Dp(e.filename),i=r.length,s=e.comment,a=s&&Dp(s),o=i!=e.filename.length||a&&s.length!=a.length,l=i+bp(e.extra)+30;if(i>65535)throw"filename too long";var u=new Xn(l);Ib(u,0,e,r,o);var c=[u],d=function(){for(var v=0,g=c;v65535&&k("filename too long",null),!z)k(null,b);else if(T<16e4)try{k(null,tw(b,y))}catch(N){k(N,null)}else c.push(Zve(b,y,k))},p=0;p65535)throw"filename too long";var g=c?tw(l,u):l,b=g.length,y=Ky();y.p(l),r.push(ew(u,{size:l.length,crc:y.d(),c:g,f:d,m:p,u:f!=a.length||p&&h.length!=m,o:i,compression:c})),i+=30+f+v+b,s+=76+2*(f+v)+(m||0)+b}for(var x=new Xn(s+22),T=i,M=s-i,E=0;E0){var i=Math.min(this.c,e.length),s=e.subarray(0,i);if(this.c-=i,this.d?this.d.push(s,!this.c):this.k[0].push(s),e=e.subarray(i),e.length)return this.push(e,n)}else{var a=0,o=0,l=void 0,u=void 0;this.p.length?e.length?(u=new Xn(this.p.length+e.length),u.set(this.p),u.set(e,this.p.length)):u=this.p:u=e;for(var c=u.length,d=this.c,f=d&&this.d,h=function(){var g,b=ji(u,o);if(b==67324752){a=1,l=o,p.d=null,p.c=0;var y=eo(u,o+6),x=eo(u,o+8),T=y&2048,M=y&8,E=eo(u,o+26),S=eo(u,o+28);if(c>o+30+E+S){var P=[];p.k.unshift(P),a=2;var R=ji(u,o+18),V=ji(u,o+22),z=YD(u.subarray(o+30,o+=30+E),!T);R==4294967295?(g=M?[-2]:r0e(u,o),R=g[0],V=g[1]):M&&(R=-1),o+=S,p.c=R;var k,N={name:z,compression:x,start:function(){if(!N.ondata)throw"no callback";if(!R)N.ondata(null,tf,!0);else{var q=r.o[x];if(!q)throw"unknown compression type "+x;k=R<0?new q(z):new q(z,R,V),k.ondata=function(j,ne,G){N.ondata(j,ne,G)};for(var L=0,A=P;L=0&&(N.size=R,N.originalSize=V),p.onfile(N)}return"break"}else if(d){if(b==134695760)return l=o+=12+(d==-2&&8),a=3,p.c=0,"break";if(b==33639248)return l=o-=4,a=3,p.c=0,"break"}},p=this;o65558){e("invalid zip file",null);return}var a=eo(t,s+8);a||e(null,{});var o=a,l=ji(t,s+16),u=l==4294967295;if(u){if(s=ji(t,s-12),ji(t,s)!=101075792){e("invalid zip file",null);return}o=a=ji(t,s+32),l=ji(t,s+48)}for(var c=function(f){var h=n0e(t,l,u),p=h[0],m=h[1],v=h[2],g=h[3],b=h[4],y=h[5],x=t0e(t,y);l=b;var T=function(E,S){E?(r(),e(E,null)):(i[g]=S,--a||e(null,i))};if(!p)T(null,Jl(t,x,x+m));else if(p==8){var M=t.subarray(x,x+m);if(m<32e4)try{T(null,Gy(M,new Xn(v)))}catch(E){T(E,null)}else n.push(ZD(M,{size:v},T))}else T("unknown compression type "+p,null)},d=0;d65558)throw"invalid zip file";var r=eo(t,n+8);if(!r)return{};var i=ji(t,n+16),s=i==4294967295;if(s){if(n=ji(t,n-12),ji(t,n)!=101075792)throw"invalid zip file";r=ji(t,n+32),i=ji(t,n+48)}for(var a=0;a>3]&1<<(Le&7))&&(Y[ae++]=Le);const Ee=ae-1;for(;ae<65536;)Y[ae++]=0;return Ee}function V(C){for(let Y=0;Y<16384;Y++)C[Y]={},C[Y].len=0,C[Y].lit=0,C[Y].p=null}const z={l:0,c:0,lc:0};function k(C,Y,ae,Ee,Le){for(;ae>ae&(1<0;--ae){const Ee=Y+N[ae]>>1;N[ae]=Y,Y=Ee}for(let ae=0;ae<65537;++ae){const Ee=C[ae];Ee>0&&(C[ae]=Ee|N[Ee]++<<6)}}function L(C,Y,ae,Ee,Le,De){const it=Y;let ot=0,ct=0;for(;Ee<=Le;Ee++){if(it.value-Y.value>ae)return!1;k(6,ot,ct,C,it);const $e=z.l;if(ot=z.c,ct=z.lc,De[Ee]=$e,$e==63){if(it.value-Y.value>ae)throw new Error("Something wrong with hufUnpackEncTable");k(8,ot,ct,C,it);let _e=z.l+6;if(ot=z.c,ct=z.lc,Ee+_e>Le+1)throw new Error("Something wrong with hufUnpackEncTable");for(;_e--;)De[Ee++]=0;Ee--}else if($e>=59){let _e=$e-59+2;if(Ee+_e>Le+1)throw new Error("Something wrong with hufUnpackEncTable");for(;_e--;)De[Ee++]=0;Ee--}}q(De)}function A(C){return C&63}function Z(C){return C>>6}function j(C,Y,ae,Ee){for(;Y<=ae;Y++){const Le=Z(C[Y]),De=A(C[Y]);if(Le>>De)throw new Error("Invalid table entry");if(De>14){const it=Ee[Le>>De-14];if(it.len)throw new Error("Invalid table entry");if(it.lit++,it.p){const ot=it.p;it.p=new Array(it.lit);for(let ct=0;ct0;ot--){const ct=Ee[(Le<<14-De)+it];if(ct.len||ct.p)throw new Error("Invalid table entry");ct.len=De,ct.lit=Y,it++}}}return!0}const ne={c:0,lc:0};function G(C,Y,ae,Ee){C=C<<8|Ve(ae,Ee),Y+=8,ne.c=C,ne.lc=Y}const B={c:0,lc:0};function ee(C,Y,ae,Ee,Le,De,it,ot,ct){if(C==Y){Ee<8&&(G(ae,Ee,Le,De),ae=ne.c,Ee=ne.lc),Ee-=8;let $e=ae>>Ee;if($e=new Uint8Array([$e])[0],ot.value+$e>ct)return!1;const _e=it[ot.value-1];for(;$e-- >0;)it[ot.value++]=_e}else if(ot.value32767?Y-65536:Y}const te={a:0,b:0};function _(C,Y){const ae=fe(C),Le=fe(Y),De=ae+(Le&1)+(Le>>1),it=De,ot=De-Le;te.a=it,te.b=ot}function oe(C,Y){const ae=ce(C),Ee=ce(Y),Le=ae-(Ee>>1)&65535,De=Ee+Le-32768&65535;te.a=De,te.b=Le}function ye(C,Y,ae,Ee,Le,De,it){const ot=it<16384,ct=ae>Le?Le:ae;let $e=1,_e,Qe;for(;$e<=ct;)$e<<=1;for($e>>=1,_e=$e,$e>>=1;$e>=1;){Qe=0;const dt=Qe+De*(Le-_e),zt=De*$e,Xt=De*_e,Tt=Ee*$e,wt=Ee*_e;let Ut,Cn,Zn,fr;for(;Qe<=dt;Qe+=Xt){let Jn=Qe;const vn=Qe+Ee*(ae-_e);for(;Jn<=vn;Jn+=wt){const Lr=Jn+Tt,Vs=Jn+zt,Xr=Vs+Tt;ot?(_(C[Jn+Y],C[Vs+Y]),Ut=te.a,Zn=te.b,_(C[Lr+Y],C[Xr+Y]),Cn=te.a,fr=te.b,_(Ut,Cn),C[Jn+Y]=te.a,C[Lr+Y]=te.b,_(Zn,fr),C[Vs+Y]=te.a,C[Xr+Y]=te.b):(oe(C[Jn+Y],C[Vs+Y]),Ut=te.a,Zn=te.b,oe(C[Lr+Y],C[Xr+Y]),Cn=te.a,fr=te.b,oe(Ut,Cn),C[Jn+Y]=te.a,C[Lr+Y]=te.b,oe(Zn,fr),C[Vs+Y]=te.a,C[Xr+Y]=te.b)}if(ae&$e){const Lr=Jn+zt;ot?_(C[Jn+Y],C[Lr+Y]):oe(C[Jn+Y],C[Lr+Y]),Ut=te.a,C[Lr+Y]=te.b,C[Jn+Y]=Ut}}if(Le&$e){let Jn=Qe;const vn=Qe+Ee*(ae-_e);for(;Jn<=vn;Jn+=wt){const Lr=Jn+Tt;ot?_(C[Jn+Y],C[Lr+Y]):oe(C[Jn+Y],C[Lr+Y]),Ut=te.a,C[Lr+Y]=te.b,C[Jn+Y]=Ut}}_e=$e,$e>>=1}return Qe}function ve(C,Y,ae,Ee,Le,De,it,ot,ct){let $e=0,_e=0;const Qe=it,dt=Math.trunc(Ee.value+(Le+7)/8);for(;Ee.value=14;){const Xt=$e>>_e-14&16383,Tt=Y[Xt];if(Tt.len)_e-=Tt.len,ee(Tt.lit,De,$e,_e,ae,Ee,ot,ct,Qe),$e=B.c,_e=B.lc;else{if(!Tt.p)throw new Error("hufDecode issues");let wt;for(wt=0;wt=Ut&&Z(C[Tt.p[wt]])==($e>>_e-Ut&(1<>=zt,_e-=zt;_e>0;){const Xt=Y[$e<<14-_e&16383];if(Xt.len)_e-=Xt.len,ee(Xt.lit,De,$e,_e,ae,Ee,ot,ct,Qe),$e=B.c,_e=B.lc;else throw new Error("hufDecode issues")}return!0}function Ke(C,Y,ae,Ee,Le,De){const it={value:0},ot=ae.value,ct=Pe(Y,ae),$e=Pe(Y,ae);ae.value+=4;const _e=Pe(Y,ae);if(ae.value+=4,ct<0||ct>=65537||$e<0||$e>=65537)throw new Error("Something wrong with HUF_ENCSIZE");const Qe=new Array(65537),dt=new Array(16384);V(dt);const zt=Ee-(ae.value-ot);if(L(C,ae,zt,ct,$e,Qe),_e>8*(Ee-(ae.value-ot)))throw new Error("Something wrong with hufUncompress");j(Qe,ct,$e,dt),ve(Qe,dt,C,ae,_e,$e,De,Le,it)}function le(C,Y,ae){for(let Ee=0;EeDe||(Y[Le++]=C[ae++],Le>De));)Y[Le++]=C[Ee++]}function re(C){let Y=C.byteLength;const ae=new Array;let Ee=0;const Le=new DataView(C);for(;Y>0;){const De=Le.getInt8(Ee++);if(De<0){const it=-De;Y-=it+1;for(let ot=0;ot>8==255?Le+=Ee&255:(ae[Le]=Ee,Le++),C.value++}function he(C,Y){Y[0]=Me(C[0]),Y[1]=Me(C[1]),Y[2]=Me(C[5]),Y[3]=Me(C[6]),Y[4]=Me(C[14]),Y[5]=Me(C[15]),Y[6]=Me(C[27]),Y[7]=Me(C[28]),Y[8]=Me(C[2]),Y[9]=Me(C[4]),Y[10]=Me(C[7]),Y[11]=Me(C[13]),Y[12]=Me(C[16]),Y[13]=Me(C[26]),Y[14]=Me(C[29]),Y[15]=Me(C[42]),Y[16]=Me(C[3]),Y[17]=Me(C[8]),Y[18]=Me(C[12]),Y[19]=Me(C[17]),Y[20]=Me(C[25]),Y[21]=Me(C[30]),Y[22]=Me(C[41]),Y[23]=Me(C[43]),Y[24]=Me(C[9]),Y[25]=Me(C[11]),Y[26]=Me(C[18]),Y[27]=Me(C[24]),Y[28]=Me(C[31]),Y[29]=Me(C[40]),Y[30]=Me(C[44]),Y[31]=Me(C[53]),Y[32]=Me(C[10]),Y[33]=Me(C[19]),Y[34]=Me(C[23]),Y[35]=Me(C[32]),Y[36]=Me(C[39]),Y[37]=Me(C[45]),Y[38]=Me(C[52]),Y[39]=Me(C[54]),Y[40]=Me(C[20]),Y[41]=Me(C[22]),Y[42]=Me(C[33]),Y[43]=Me(C[38]),Y[44]=Me(C[46]),Y[45]=Me(C[51]),Y[46]=Me(C[55]),Y[47]=Me(C[60]),Y[48]=Me(C[21]),Y[49]=Me(C[34]),Y[50]=Me(C[37]),Y[51]=Me(C[47]),Y[52]=Me(C[50]),Y[53]=Me(C[56]),Y[54]=Me(C[59]),Y[55]=Me(C[61]),Y[56]=Me(C[35]),Y[57]=Me(C[36]),Y[58]=Me(C[48]),Y[59]=Me(C[49]),Y[60]=Me(C[57]),Y[61]=Me(C[58]),Y[62]=Me(C[62]),Y[63]=Me(C[63])}function be(C){const Y=.5*Math.cos(.7853975),ae=.5*Math.cos(3.14159/16),Ee=.5*Math.cos(3.14159/8),Le=.5*Math.cos(3*3.14159/16),De=.5*Math.cos(5*3.14159/16),it=.5*Math.cos(3*3.14159/8),ot=.5*Math.cos(7*3.14159/16),ct=new Array(4),$e=new Array(4),_e=new Array(4),Qe=new Array(4);for(let dt=0;dt<8;++dt){const zt=dt*8;ct[0]=Ee*C[zt+2],ct[1]=it*C[zt+2],ct[2]=Ee*C[zt+6],ct[3]=it*C[zt+6],$e[0]=ae*C[zt+1]+Le*C[zt+3]+De*C[zt+5]+ot*C[zt+7],$e[1]=Le*C[zt+1]-ot*C[zt+3]-ae*C[zt+5]-De*C[zt+7],$e[2]=De*C[zt+1]-ae*C[zt+3]+ot*C[zt+5]+Le*C[zt+7],$e[3]=ot*C[zt+1]-De*C[zt+3]+Le*C[zt+5]-ae*C[zt+7],_e[0]=Y*(C[zt+0]+C[zt+4]),_e[3]=Y*(C[zt+0]-C[zt+4]),_e[1]=ct[0]+ct[3],_e[2]=ct[1]-ct[2],Qe[0]=_e[0]+_e[1],Qe[1]=_e[3]+_e[2],Qe[2]=_e[3]-_e[2],Qe[3]=_e[0]-_e[1],C[zt+0]=Qe[0]+$e[0],C[zt+1]=Qe[1]+$e[1],C[zt+2]=Qe[2]+$e[2],C[zt+3]=Qe[3]+$e[3],C[zt+4]=Qe[3]-$e[3],C[zt+5]=Qe[2]-$e[2],C[zt+6]=Qe[1]-$e[1],C[zt+7]=Qe[0]-$e[0]}for(let dt=0;dt<8;++dt)ct[0]=Ee*C[16+dt],ct[1]=it*C[16+dt],ct[2]=Ee*C[48+dt],ct[3]=it*C[48+dt],$e[0]=ae*C[8+dt]+Le*C[24+dt]+De*C[40+dt]+ot*C[56+dt],$e[1]=Le*C[8+dt]-ot*C[24+dt]-ae*C[40+dt]-De*C[56+dt],$e[2]=De*C[8+dt]-ae*C[24+dt]+ot*C[40+dt]+Le*C[56+dt],$e[3]=ot*C[8+dt]-De*C[24+dt]+Le*C[40+dt]-ae*C[56+dt],_e[0]=Y*(C[dt]+C[32+dt]),_e[3]=Y*(C[dt]-C[32+dt]),_e[1]=ct[0]+ct[3],_e[2]=ct[1]-ct[2],Qe[0]=_e[0]+_e[1],Qe[1]=_e[3]+_e[2],Qe[2]=_e[3]-_e[2],Qe[3]=_e[0]-_e[1],C[0+dt]=Qe[0]+$e[0],C[8+dt]=Qe[1]+$e[1],C[16+dt]=Qe[2]+$e[2],C[24+dt]=Qe[3]+$e[3],C[32+dt]=Qe[3]-$e[3],C[40+dt]=Qe[2]-$e[2],C[48+dt]=Qe[1]-$e[1],C[56+dt]=Qe[0]-$e[0]}function we(C){for(let Y=0;Y<64;++Y){const ae=C[0][Y],Ee=C[1][Y],Le=C[2][Y];C[0][Y]=ae+1.5747*Le,C[1][Y]=ae-.1873*Ee-.4682*Le,C[2][Y]=ae+1.8556*Ee}}function se(C,Y,ae){for(let Ee=0;Ee<64;++Ee)Y[ae+Ee]=hv.toHalfFloat(W(C[Ee]))}function W(C){return C<=1?Math.sign(C)*Math.pow(Math.abs(C),2.2):Math.sign(C)*Math.pow(P,Math.abs(C)-1)}function K(C){return new DataView(C.array.buffer,C.offset.value,C.size)}function ie(C){const Y=C.viewer.buffer.slice(C.offset.value,C.offset.value+C.size),ae=new Uint8Array(re(Y)),Ee=new Uint8Array(ae.length);return D(ae),F(ae,Ee),new DataView(Ee.buffer)}function me(C){const Y=C.array.slice(C.offset.value,C.offset.value+C.size);typeof $_>"u"&&console.error("THREE.EXRLoader: External library fflate.min.js required.");const ae=ep(Y),Ee=new Uint8Array(ae.length);return D(ae),F(ae,Ee),new DataView(Ee.buffer)}function We(C){const Y=C.viewer,ae={value:C.offset.value},Ee=new Uint16Array(C.width*C.scanlineBlockSize*(C.channels*C.type)),Le=new Uint8Array(8192);let De=0;const it=new Array(C.channels);for(let Xt=0;Xt=8192)throw new Error("Something is wrong with PIZ_COMPRESSION BITMAP_SIZE");if(ot<=ct)for(let Xt=0;Xt"u"&&console.error("THREE.EXRLoader: External library fflate.min.js required.");const ae=ep(Y),Ee=C.lines*C.channels*C.width,Le=C.type==1?new Uint16Array(Ee):new Uint32Array(Ee);let De=0,it=0;const ot=new Array(4);for(let ct=0;ct0;){const Tt=J(Y.buffer,ae),wt=Fe(Y,ae),Ut=wt>>2&3,Cn=(wt>>4)-1,Zn=new Int8Array([Cn])[0],fr=Fe(Y,ae);De.push({name:Tt,index:Zn,type:fr,compression:Ut}),it-=Tt.length+3}const ot=qe.channels,ct=new Array(C.channels);for(let Tt=0;Tt=0&&($e.idx[Cn.index]=Tt),wt.offset=Tt)}}let _e,Qe,dt;if(Le.acCompressedSize>0)switch(Le.acCompression){case 0:_e=new Uint16Array(Le.totalAcUncompressedCount),Ke(C.array,Y,ae,Le.acCompressedSize,_e,Le.totalAcUncompressedCount);break;case 1:const Tt=C.array.slice(ae.value,ae.value+Le.totalAcUncompressedCount),wt=ep(Tt);_e=new Uint16Array(wt.buffer),ae.value+=Le.totalAcUncompressedCount;break}if(Le.dcCompressedSize>0){const Tt={array:C.array,offset:ae,size:Le.dcCompressedSize};Qe=new Uint16Array(me(Tt).buffer),ae.value+=Le.dcCompressedSize}if(Le.rleRawSize>0){const Tt=C.array.slice(ae.value,ae.value+Le.rleCompressedSize),wt=ep(Tt);dt=re(wt.buffer),ae.value+=Le.rleCompressedSize}let zt=0;const Xt=new Array(ct.length);for(let Tt=0;Tt>10,ae=C&1023;return(C>>15?-1:1)*(Y?Y===31?ae?NaN:1/0:Math.pow(2,Y-15)*(1+ae/1024):6103515625e-14*(ae/1024))}function lt(C,Y){const ae=C.getUint16(Y.value,!0);return Y.value+=2,ae}function vt(C,Y){return Me(lt(C,Y))}function bn(C,Y,ae,Ee){const Le=ae.value,De=[];for(;ae.valueUe.height?Ue.height-Y:Ue.scanlineBlockSize;const Ee=Ue.size=Ue.height)break;for(let it=0;it>>1|(si&21845)<<1;vh=(vh&52428)>>>2|(vh&13107)<<2,vh=(vh&61680)>>>4|(vh&3855)<<4,z6[si]=((vh&65280)>>>8|(vh&255)<<8)>>>1}var Zl=function(t,e,n){for(var r=t.length,i=0,s=new Ds(e);i>>l]=u}else for(o=new Ds(r),i=0;i>>15-t[i]);return o},Rf=new Xn(288);for(var si=0;si<144;++si)Rf[si]=8;for(var si=144;si<256;++si)Rf[si]=9;for(var si=256;si<280;++si)Rf[si]=7;for(var si=280;si<288;++si)Rf[si]=8;var Ob=new Xn(32);for(var si=0;si<32;++si)Ob[si]=5;var kve=Zl(Rf,9,0),Ove=Zl(Rf,9,1),Ive=Zl(Ob,5,0),Uve=Zl(Ob,5,1),G7=function(t){for(var e=t[0],n=1;ne&&(e=t[n]);return e},Cl=function(t,e,n){var r=e/8|0;return(t[r]|t[r+1]<<8)>>(e&7)&n},F7=function(t,e){var n=e/8|0;return(t[n]|t[n+1]<<8|t[n+2]<<16)>>(e&7)},_T=function(t){return(t/8|0)+(t&7&&1)},Jl=function(t,e,n){(e==null||e<0)&&(e=0),(n==null||n>t.length)&&(n=t.length);var r=new(t instanceof Ds?Ds:t instanceof Pf?Pf:Xn)(n-e);return r.set(t.subarray(e,n)),r},$T=function(t,e,n){var r=t.length;if(!r||n&&!n.l&&r<5)return e||new Xn(0);var i=!e||n,s=!n||n.i;n||(n={}),e||(e=new Xn(r*3));var a=function(te){var $=e.length;if(te>$){var oe=new Xn(Math.max($*2,te));oe.set(e),e=oe}},o=n.f||0,l=n.p||0,u=n.b||0,c=n.l,d=n.d,f=n.m,h=n.n,p=r*8;do{if(!c){n.f=o=Cl(t,l,1);var m=Cl(t,l+1,3);if(l+=3,m)if(m==1)c=Ove,d=Uve,f=9,h=5;else if(m==2){var y=Cl(t,l,31)+257,x=Cl(t,l+10,15)+4,T=y+Cl(t,l+5,31)+1;l+=14;for(var M=new Xn(T),E=new Xn(19),S=0;S>>4;if(v<16)M[S++]=v;else{var k=0,N=0;for(v==16?(N=3+Cl(t,l,3),l+=2,k=M[S-1]):v==17?(N=3+Cl(t,l,7),l+=3):v==18&&(N=11+Cl(t,l,127),l+=7);N--;)M[S++]=k}}var q=M.subarray(0,y),L=M.subarray(y);f=G7(q),h=G7(L),c=Zl(q,f,1),d=Zl(L,h,1)}else throw"invalid block type";else{var v=_T(l)+4,g=t[v-4]|t[v-3]<<8,b=v+g;if(b>r){if(s)throw"unexpected EOF";break}i&&a(u+g),e.set(t.subarray(v,b),u),n.b=u+=g,n.p=l=b*8;continue}if(l>p){if(s)throw"unexpected EOF";break}}i&&a(u+131072);for(var A=(1<>>4;if(l+=k&15,l>p){if(s)throw"unexpected EOF";break}if(!k)throw"invalid length/literal";if(ne<256)e[u++]=ne;else if(ne==256){F=l,c=null;break}else{var j=ne-254;if(ne>264){var S=ne-257,Z=Ly[S];j=Cl(t,l,(1<>>4;if(!_)throw"invalid distance";l+=_&15;var L=zve[le];if(le>3){var Z=Xy[le];L+=F7(t,l)&(1<p){if(s)throw"unexpected EOF";break}i&&a(u+131072);for(var fe=u+j;u>>8},_g=function(t,e,n){n<<=e&7;var r=e/8|0;t[r]|=n,t[r+1]|=n>>>8,t[r+2]|=n>>>16},j7=function(t,e){for(var n=[],r=0;rf&&(f=s[r].s);var h=new Ds(f+1),p=XP(n[c-1],h,0);if(p>e){var r=0,m=0,v=p-e,g=1<e)m+=g-(1<>>=v;m>0;){var y=s[r].s;h[y]=0&&m;--r){var x=s[r].s;h[x]==e&&(--h[x],++m)}p=e}return[new Xn(h),p]},XP=function(t,e,n){return t.s==-1?Math.max(XP(t.l,e,n+1),XP(t.r,e,n+1)):e[t.s]=n},n4=function(t){for(var e=t.length;e&&!t[--e];);for(var n=new Ds(++e),r=0,i=t[0],s=1,a=function(l){n[r++]=l},o=1;o<=e;++o)if(t[o]==i&&o!=e)++s;else{if(!i&&s>2){for(;s>138;s-=138)a(32754);s>2&&(a(s>10?s-11<<5|28690:s-3<<5|12305),s=0)}else if(s>3){for(a(i),--s;s>6;s-=6)a(8304);s>2&&(a(s-3<<5|8208),s=0)}for(;s--;)a(i);s=1,i=t[o]}return[n.subarray(0,r),e]},$g=function(t,e){for(var n=0,r=0;r>>8,t[i+2]=t[i]^255,t[i+3]=t[i+1]^255;for(var s=0;s4&&!R[V6[z-1]];--z);var k=u+5<<3,N=$g(i,Rf)+$g(s,Ob)+a,q=$g(i,f)+$g(s,m)+a+14+3*z+$g(E,R)+(2*E[16]+3*E[17]+7*E[18]);if(k<=N&&k<=q)return mx(e,c,t.subarray(l,l+u));var L,A,J,F;if(Sc(e,c,1+(q15&&(Sc(e,c,_[S]>>>5&127),c+=_[S]>>>12)}}else L=kve,A=Rf,J=Ive,F=Ob;for(var S=0;S255){var le=r[S]>>>18&31;_g(e,c,L[le+257]),c+=A[le+257],le>7&&(Sc(e,c,r[S]>>>23&31),c+=Ly[le]);var fe=r[S]&31;_g(e,c,J[fe]),c+=F[fe],fe>3&&(_g(e,c,r[S]>>>5&8191),c+=Xy[fe])}else _g(e,c,L[r[S]]),c+=A[r[S]];return _g(e,c,L[256]),c+A[256]},Nve=new Pf([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),tf=new Xn(0),Lve=function(t,e,n,r,i,s){var a=t.length,o=new Xn(r+a+5*(1+Math.ceil(a/7e3))+i),l=o.subarray(r,o.length-i),u=0;if(!e||a<8)for(var c=0;c<=a;c+=65535){var d=c+65535;d>>13,p=f&8191,m=(1<7e3||R>24576)&&L>423){u=r4(t,l,0,T,M,E,P,R,z,c-z,u),R=S=P=0,z=c;for(var A=0;A<286;++A)M[A]=0;for(var A=0;A<30;++A)E[A]=0}var J=2,F=0,ne=p,j=N-q&32767;if(L>2&&k==x(c-j))for(var Z=Math.min(h,L)-1,_=Math.min(32767,c),le=Math.min(258,L);j<=_&&--ne&&N!=q;){if(t[c+J]==t[c+J-j]){for(var fe=0;feJ){if(J=fe,F=j,fe>Z)break;for(var te=Math.min(j,fe-2),$=0,A=0;A$&&($=ve,q=oe)}}}N=q,q=v[N],j+=N-q+32768&32767}if(F){T[R++]=268435456|LP[J]<<18|t4[F];var Ke=LP[J]&31,ue=t4[F]&31;P+=Ly[Ke]+Xy[ue],++M[257+Ke],++E[ue],V=c+J,++S}else T[R++]=t[c],++M[t[c]]}}u=r4(t,l,s,T,M,E,P,R,z,c-z,u),!s&&u&7&&(u=mx(l,u+1,tf))}return Jl(o,0,r+_T(u)+i)},Xve=function(){for(var t=new Pf(256),e=0;e<256;++e){for(var n=e,r=9;--r;)n=(n&1&&3988292384)^n>>>1;t[e]=n}return t}(),Cy=function(){var t=-1;return{p:function(e){for(var n=t,r=0;r>>8;t=n},d:function(){return~t}}},qD=function(){var t=1,e=0;return{p:function(n){for(var r=t,i=e,s=n.length,a=0;a!=s;){for(var o=Math.min(a+2655,s);a>16),i=(i&65535)+15*(i>>16)}t=r,e=i},d:function(){return t%=65521,e%=65521,(t&255)<<24|t>>>8<<16|(e&255)<<8|e>>>8}}},k0=function(t,e,n,r,i){return Lve(t,e.level==null?6:e.level,e.mem==null?Math.ceil(Math.max(8,Math.min(13,Math.log(t.length)))*1.5):12+e.mem,n,r,!i)},ew=function(t,e){var n={};for(var r in t)n[r]=t[r];for(var r in e)n[r]=e[r];return n},J_=function(t,e,n){for(var r=t(),i=t.toString(),s=i.slice(i.indexOf("[")+1,i.lastIndexOf("]")).replace(/ /g,"").split(","),a=0;a>>0},GI=function(t,e){return ji(t,e)+ji(t,e+4)*4294967296},mr=function(t,e,n){for(;n;++e)t[e]=n,n>>>=8},WD=function(t,e){var n=e.filename;if(t[0]=31,t[1]=139,t[2]=8,t[8]=e.level<2?4:e.level==9?2:0,t[9]=3,e.mtime!=0&&mr(t,4,Math.floor(new Date(e.mtime||Date.now())/1e3)),n){t[3]=8;for(var r=0;r<=n.length;++r)t[r+10]=n.charCodeAt(r)}},AD=function(t){if(t[0]!=31||t[1]!=139||t[2]!=8)throw"invalid gzip data";var e=t[3],n=10;e&4&&(n+=t[10]|(t[11]<<8)+2);for(var r=(e>>3&1)+(e>>4&1);r>0;r-=!t[n++]);return n+(e&2)},Ave=function(t){var e=t.length;return(t[e-4]|t[e-3]<<8|t[e-2]<<16|t[e-1]<<24)>>>0},GD=function(t){return 10+(t.filename&&t.filename.length+1||0)},FD=function(t,e){var n=e.level,r=n==0?0:n<6?1:n==9?3:2;t[0]=120,t[1]=r<<6|(r?32-2*r:1)},Gve=function(t){if((t[0]&15)!=8||t[0]>>>4>7||(t[0]<<8|t[1])%31)throw"invalid zlib data";if(t[1]&32)throw"invalid zlib data: preset dictionaries not supported"};function jD(t,e){return!e&&typeof t=="function"&&(e=t,t={}),this.ondata=e,t}var rd=function(){function t(e,n){!n&&typeof e=="function"&&(n=e,e={}),this.ondata=n,this.o=e||{}}return t.prototype.p=function(e,n){this.ondata(k0(e,this.o,0,0,!n),n)},t.prototype.push=function(e,n){if(this.d)throw"stream finished";if(!this.ondata)throw"no stream handler";this.d=n,this.p(e,n||!1)},t}(),Fve=function(){function t(e,n){Wy([qy,function(){return[Hl,rd]}],this,jD.call(this,e,n),function(r){var i=new rd(r.data);onmessage=Hl(i)},6)}return t}();function jve(t,e,n){if(n||(n=e,e={}),typeof n!="function")throw"no callback";return Dy(t,e,[qy],function(r){return um(tw(r.data[0],r.data[1]))},0,n)}function tw(t,e){return k0(t,e||{},0,0)}var Co=function(){function t(e){this.s={},this.p=new Xn(0),this.ondata=e}return t.prototype.e=function(e){if(this.d)throw"stream finished";if(!this.ondata)throw"no stream handler";var n=this.p.length,r=new Xn(n+e.length);r.set(this.p),r.set(e,n),this.p=r},t.prototype.c=function(e){this.d=this.s.i=e||!1;var n=this.s.b,r=$T(this.p,this.o,this.s);this.ondata(Jl(r,n,this.s.b),this.d),this.o=Jl(r,this.s.b-32768),this.s.b=this.o.length,this.p=Jl(this.p,this.s.p/8|0),this.s.p&=7},t.prototype.push=function(e,n){this.e(e),this.c(n)},t}(),ZD=function(){function t(e){this.ondata=e,Wy([Ky,function(){return[Hl,Co]}],this,0,function(){var n=new Co;onmessage=Hl(n)},7)}return t}();function JD(t,e,n){if(n||(n=e,e={}),typeof n!="function")throw"no callback";return Dy(t,e,[Ky],function(r){return um(Ay(r.data[0],DD(r.data[1])))},1,n)}function Ay(t,e){return $T(t,e)}var CP=function(){function t(e,n){this.c=Cy(),this.l=0,this.v=1,rd.call(this,e,n)}return t.prototype.push=function(e,n){rd.prototype.push.call(this,e,n)},t.prototype.p=function(e,n){this.c.p(e),this.l+=e.length;var r=k0(e,this.o,this.v&&GD(this.o),n&&8,!n);this.v&&(WD(r,this.o),this.v=0),n&&(mr(r,r.length-8,this.c.d()),mr(r,r.length-4,this.l)),this.ondata(r,n)},t}(),Y_=function(){function t(e,n){Wy([qy,Kve,function(){return[Hl,rd,CP]}],this,jD.call(this,e,n),function(r){var i=new CP(r.data);onmessage=Hl(i)},8)}return t}();function B_(t,e,n){if(n||(n=e,e={}),typeof n!="function")throw"no callback";return Dy(t,e,[qy,Kve,function(){return[KP]}],function(r){return um(KP(r.data[0],r.data[1]))},2,n)}function KP(t,e){e||(e={});var n=Cy(),r=t.length;n.p(t);var i=k0(t,e,GD(e),8),s=i.length;return WD(i,e),mr(i,s-8,n.d()),mr(i,s-4,r),i}var qP=function(){function t(e){this.v=1,Co.call(this,e)}return t.prototype.push=function(e,n){if(Co.prototype.e.call(this,e),this.v){var r=this.p.length>3?AD(this.p):4;if(r>=this.p.length&&!n)return;this.p=this.p.subarray(r),this.v=0}if(n){if(this.p.length<8)throw"invalid gzip stream";this.p=this.p.subarray(0,-8)}Co.prototype.c.call(this,n)},t}(),Zve=function(){function t(e){this.ondata=e,Wy([Ky,qve,function(){return[Hl,Co,qP]}],this,0,function(){var n=new qP;onmessage=Hl(n)},9)}return t}();function Jve(t,e,n){if(n||(n=e,e={}),typeof n!="function")throw"no callback";return Dy(t,e,[Ky,qve,function(){return[DP]}],function(r){return um(DP(r.data[0]))},3,n)}function DP(t,e){return $T(t.subarray(AD(t),-8),e||new Xn(Ave(t)))}var i4=function(){function t(e,n){this.c=qD(),this.v=1,rd.call(this,e,n)}return t.prototype.push=function(e,n){rd.prototype.push.call(this,e,n)},t.prototype.p=function(e,n){this.c.p(e);var r=k0(e,this.o,this.v&&2,n&&4,!n);this.v&&(FD(r,this.o),this.v=0),n&&mr(r,r.length-4,this.c.d()),this.ondata(r,n)},t}(),fvt=function(){function t(e,n){Wy([qy,Dve,function(){return[Hl,rd,i4]}],this,jD.call(this,e,n),function(r){var i=new i4(r.data);onmessage=Hl(i)},10)}return t}();function hvt(t,e,n){if(n||(n=e,e={}),typeof n!="function")throw"no callback";return Dy(t,e,[qy,Dve,function(){return[s4]}],function(r){return um(s4(r.data[0],r.data[1]))},4,n)}function s4(t,e){e||(e={});var n=qD();n.p(t);var r=k0(t,e,2,4);return FD(r,e),mr(r,r.length-4,n.d()),r}var WP=function(){function t(e){this.v=1,Co.call(this,e)}return t.prototype.push=function(e,n){if(Co.prototype.e.call(this,e),this.v){if(this.p.length<2&&!n)return;this.p=this.p.subarray(2),this.v=0}if(n){if(this.p.length<4)throw"invalid zlib stream";this.p=this.p.subarray(0,-4)}Co.prototype.c.call(this,n)},t}(),Yve=function(){function t(e){this.ondata=e,Wy([Ky,Wve,function(){return[Hl,Co,WP]}],this,0,function(){var n=new WP;onmessage=Hl(n)},11)}return t}();function Bve(t,e,n){if(n||(n=e,e={}),typeof n!="function")throw"no callback";return Dy(t,e,[Ky,Wve,function(){return[ep]}],function(r){return um(ep(r.data[0],DD(r.data[1])))},5,n)}function ep(t,e){return $T((Gve(t),t.subarray(2,-4)),e)}var Hve=function(){function t(e){this.G=qP,this.I=Co,this.Z=WP,this.ondata=e}return t.prototype.push=function(e,n){if(!this.ondata)throw"no stream handler";if(this.s)this.s.push(e,n);else{if(this.p&&this.p.length){var r=new Xn(this.p.length+e.length);r.set(this.p),r.set(e,this.p.length)}else this.p=e;if(this.p.length>2){var i=this,s=function(){i.ondata.apply(i,arguments)};this.s=this.p[0]==31&&this.p[1]==139&&this.p[2]==8?new this.G(s):(this.p[0]&15)!=8||this.p[0]>>4>7||(this.p[0]<<8|this.p[1])%31?new this.I(s):new this.Z(s),this.s.push(this.p,n),this.p=null}}},t}(),pvt=function(){function t(e){this.G=Zve,this.I=ZD,this.Z=Yve,this.ondata=e}return t.prototype.push=function(e,n){Hve.prototype.push.call(this,e,n)},t}();function mvt(t,e,n){if(n||(n=e,e={}),typeof n!="function")throw"no callback";return t[0]==31&&t[1]==139&&t[2]==8?Jve(t,e,n):(t[0]&15)!=8||t[0]>>4>7||(t[0]<<8|t[1])%31?JD(t,e,n):Bve(t,e,n)}function vvt(t,e){return t[0]==31&&t[1]==139&&t[2]==8?DP(t,e):(t[0]&15)!=8||t[0]>>4>7||(t[0]<<8|t[1])%31?Ay(t,e):ep(t,e)}var YD=function(t,e,n,r){for(var i in t){var s=t[i],a=e+i;s instanceof Xn?n[a]=[s,r]:Array.isArray(s)?n[a]=[s[0],ew(r,s[1])]:YD(s,a+"/",n,r)}},H_=typeof TextEncoder<"u"&&new TextEncoder,a4=typeof TextDecoder<"u"&&new TextDecoder,Qve=0;try{a4.decode(tf,{stream:!0}),Qve=1}catch{}var _ve=function(t){for(var e="",n=0;;){var r=t[n++],i=(r>127)+(r>223)+(r>239);if(n+i>t.length)return[e,Jl(t,n-1)];i?i==3?(r=((r&15)<<18|(t[n++]&63)<<12|(t[n++]&63)<<6|t[n++]&63)-65536,e+=String.fromCharCode(55296|r>>10,56320|r&1023)):i&1?e+=String.fromCharCode((r&31)<<6|t[n++]&63):e+=String.fromCharCode((r&15)<<12|(t[n++]&63)<<6|t[n++]&63):e+=String.fromCharCode(r)}},gvt=function(){function t(e){this.ondata=e,Qve?this.t=new TextDecoder:this.p=tf}return t.prototype.push=function(e,n){if(!this.ondata)throw"no callback";if(n=!!n,this.t){if(this.ondata(this.t.decode(e,{stream:!0}),n),n){if(this.t.decode().length)throw"invalid utf-8 data";this.t=null}return}if(!this.p)throw"stream finished";var r=new Xn(this.p.length+e.length);r.set(this.p),r.set(e,this.p.length);var i=_ve(r),s=i[0],a=i[1];if(n){if(a.length)throw"invalid utf-8 data";this.p=null}else this.p=a;this.ondata(s,n)},t}(),bvt=function(){function t(e){this.ondata=e}return t.prototype.push=function(e,n){if(!this.ondata)throw"no callback";if(this.d)throw"stream finished";this.ondata(Dp(e),this.d=n||!1)},t}();function Dp(t,e){if(e){for(var n=new Xn(t.length),r=0;r>1)),a=0,o=function(c){s[a++]=c},r=0;rs.length){var l=new Xn(a+8+(i-r<<1));l.set(s),s=l}var u=t.charCodeAt(r);u<128||e?o(u):u<2048?(o(192|u>>6),o(128|u&63)):u>55295&&u<57344?(u=65536+(u&1047552)|t.charCodeAt(++r)&1023,o(240|u>>18),o(128|u>>12&63),o(128|u>>6&63),o(128|u&63)):(o(224|u>>12),o(128|u>>6&63),o(128|u&63))}return Jl(s,0,a)}function BD(t,e){if(e){for(var n="",r=0;r65535)throw"extra field too long";e+=r+4}return e},Ib=function(t,e,n,r,i,s,a,o){var l=r.length,u=n.extra,c=o&&o.length,d=bp(u);mr(t,e,a!=null?33639248:67324752),e+=4,a!=null&&(t[e++]=20,t[e++]=n.os),t[e]=20,e+=2,t[e++]=n.flag<<1|(s==null&&8),t[e++]=i&&8,t[e++]=n.compression&255,t[e++]=n.compression>>8;var f=new Date(n.mtime==null?Date.now():n.mtime),h=f.getFullYear()-1980;if(h<0||h>119)throw"date not in range 1980-2099";if(mr(t,e,h<<25|f.getMonth()+1<<21|f.getDate()<<16|f.getHours()<<11|f.getMinutes()<<5|f.getSeconds()>>>1),e+=4,s!=null&&(mr(t,e,n.crc),mr(t,e+4,s),mr(t,e+8,n.size)),mr(t,e+12,l),mr(t,e+14,d),e+=16,a!=null&&(mr(t,e,c),mr(t,e+6,n.attrs),mr(t,e+10,a),e+=14),t.set(r,e),e+=l,d)for(var p in u){var m=u[p],v=m.length;mr(t,e,+p),mr(t,e+2,v),t.set(m,e+4),e+=4+v}return c&&(t.set(o,e),e+=c),e},HD=function(t,e,n,r,i){mr(t,e,101010256),mr(t,e+8,n),mr(t,e+10,n),mr(t,e+12,r),mr(t,e+16,i)},k6=function(){function t(e){this.filename=e,this.c=Cy(),this.size=0,this.compression=0}return t.prototype.process=function(e,n){this.ondata(null,e,n)},t.prototype.push=function(e,n){if(!this.ondata)throw"no callback - add to ZIP archive before pushing";this.c.p(e),this.size+=e.length,n&&(this.crc=this.c.d()),this.process(e,n||!1)},t}(),yvt=function(){function t(e,n){var r=this;n||(n={}),k6.call(this,e),this.d=new rd(n,function(i,s){r.ondata(null,i,s)}),this.compression=8,this.flag=$ve(n.level)}return t.prototype.process=function(e,n){try{this.d.push(e,n)}catch(r){this.ondata(r,null,n)}},t.prototype.push=function(e,n){k6.prototype.push.call(this,e,n)},t}(),Svt=function(){function t(e,n){var r=this;n||(n={}),k6.call(this,e),this.d=new Fve(n,function(i,s,a){r.ondata(i,s,a)}),this.compression=8,this.flag=$ve(n.level),this.terminate=this.d.terminate}return t.prototype.process=function(e,n){this.d.push(e,n)},t.prototype.push=function(e,n){k6.prototype.push.call(this,e,n)},t}(),xvt=function(){function t(e){this.ondata=e,this.u=[],this.d=1}return t.prototype.add=function(e){var n=this;if(this.d&2)throw"stream finished";var r=Dp(e.filename),i=r.length,s=e.comment,a=s&&Dp(s),o=i!=e.filename.length||a&&s.length!=a.length,l=i+bp(e.extra)+30;if(i>65535)throw"filename too long";var u=new Xn(l);Ib(u,0,e,r,o);var c=[u],d=function(){for(var v=0,g=c;v65535&&k("filename too long",null),!z)k(null,b);else if(T<16e4)try{k(null,tw(b,y))}catch(N){k(N,null)}else c.push(jve(b,y,k))},p=0;p65535)throw"filename too long";var g=c?tw(l,u):l,b=g.length,y=Cy();y.p(l),r.push(ew(u,{size:l.length,crc:y.d(),c:g,f:d,m:p,u:f!=a.length||p&&h.length!=m,o:i,compression:c})),i+=30+f+v+b,s+=76+2*(f+v)+(m||0)+b}for(var x=new Xn(s+22),T=i,M=s-i,E=0;E0){var i=Math.min(this.c,e.length),s=e.subarray(0,i);if(this.c-=i,this.d?this.d.push(s,!this.c):this.k[0].push(s),e=e.subarray(i),e.length)return this.push(e,n)}else{var a=0,o=0,l=void 0,u=void 0;this.p.length?e.length?(u=new Xn(this.p.length+e.length),u.set(this.p),u.set(e,this.p.length)):u=this.p:u=e;for(var c=u.length,d=this.c,f=d&&this.d,h=function(){var g,b=ji(u,o);if(b==67324752){a=1,l=o,p.d=null,p.c=0;var y=eo(u,o+6),x=eo(u,o+8),T=y&2048,M=y&8,E=eo(u,o+26),S=eo(u,o+28);if(c>o+30+E+S){var P=[];p.k.unshift(P),a=2;var R=ji(u,o+18),V=ji(u,o+22),z=BD(u.subarray(o+30,o+=30+E),!T);R==4294967295?(g=M?[-2]:n0e(u,o),R=g[0],V=g[1]):M&&(R=-1),o+=S,p.c=R;var k,N={name:z,compression:x,start:function(){if(!N.ondata)throw"no callback";if(!R)N.ondata(null,tf,!0);else{var q=r.o[x];if(!q)throw"unknown compression type "+x;k=R<0?new q(z):new q(z,R,V),k.ondata=function(F,ne,j){N.ondata(F,ne,j)};for(var L=0,A=P;L=0&&(N.size=R,N.originalSize=V),p.onfile(N)}return"break"}else if(d){if(b==134695760)return l=o+=12+(d==-2&&8),a=3,p.c=0,"break";if(b==33639248)return l=o-=4,a=3,p.c=0,"break"}},p=this;o65558){e("invalid zip file",null);return}var a=eo(t,s+8);a||e(null,{});var o=a,l=ji(t,s+16),u=l==4294967295;if(u){if(s=ji(t,s-12),ji(t,s)!=101075792){e("invalid zip file",null);return}o=a=ji(t,s+32),l=ji(t,s+48)}for(var c=function(f){var h=t0e(t,l,u),p=h[0],m=h[1],v=h[2],g=h[3],b=h[4],y=h[5],x=e0e(t,y);l=b;var T=function(E,S){E?(r(),e(E,null)):(i[g]=S,--a||e(null,i))};if(!p)T(null,Jl(t,x,x+m));else if(p==8){var M=t.subarray(x,x+m);if(m<32e4)try{T(null,Ay(M,new Xn(v)))}catch(E){T(E,null)}else n.push(JD(M,{size:v},T))}else T("unknown compression type "+p,null)},d=0;d65558)throw"invalid zip file";var r=eo(t,n+8);if(!r)return{};var i=ji(t,n+16),s=i==4294967295;if(s){if(n=ji(t,n-12),ji(t,n)!=101075792)throw"invalid zip file";r=ji(t,n+32),i=ji(t,n+48)}for(var a=0;a>3]&1<<(Le&7))&&(B[ae++]=Le);const Ee=ae-1;for(;ae<65536;)B[ae++]=0;return Ee}function V(C){for(let B=0;B<16384;B++)C[B]={},C[B].len=0,C[B].lit=0,C[B].p=null}const z={l:0,c:0,lc:0};function k(C,B,ae,Ee,Le){for(;ae>ae&(1<0;--ae){const Ee=B+N[ae]>>1;N[ae]=B,B=Ee}for(let ae=0;ae<65537;++ae){const Ee=C[ae];Ee>0&&(C[ae]=Ee|N[Ee]++<<6)}}function L(C,B,ae,Ee,Le,De){const it=B;let ot=0,ct=0;for(;Ee<=Le;Ee++){if(it.value-B.value>ae)return!1;k(6,ot,ct,C,it);const $e=z.l;if(ot=z.c,ct=z.lc,De[Ee]=$e,$e==63){if(it.value-B.value>ae)throw new Error("Something wrong with hufUnpackEncTable");k(8,ot,ct,C,it);let _e=z.l+6;if(ot=z.c,ct=z.lc,Ee+_e>Le+1)throw new Error("Something wrong with hufUnpackEncTable");for(;_e--;)De[Ee++]=0;Ee--}else if($e>=59){let _e=$e-59+2;if(Ee+_e>Le+1)throw new Error("Something wrong with hufUnpackEncTable");for(;_e--;)De[Ee++]=0;Ee--}}q(De)}function A(C){return C&63}function J(C){return C>>6}function F(C,B,ae,Ee){for(;B<=ae;B++){const Le=J(C[B]),De=A(C[B]);if(Le>>De)throw new Error("Invalid table entry");if(De>14){const it=Ee[Le>>De-14];if(it.len)throw new Error("Invalid table entry");if(it.lit++,it.p){const ot=it.p;it.p=new Array(it.lit);for(let ct=0;ct0;ot--){const ct=Ee[(Le<<14-De)+it];if(ct.len||ct.p)throw new Error("Invalid table entry");ct.len=De,ct.lit=B,it++}}}return!0}const ne={c:0,lc:0};function j(C,B,ae,Ee){C=C<<8|Ve(ae,Ee),B+=8,ne.c=C,ne.lc=B}const Z={c:0,lc:0};function _(C,B,ae,Ee,Le,De,it,ot,ct){if(C==B){Ee<8&&(j(ae,Ee,Le,De),ae=ne.c,Ee=ne.lc),Ee-=8;let $e=ae>>Ee;if($e=new Uint8Array([$e])[0],ot.value+$e>ct)return!1;const _e=it[ot.value-1];for(;$e-- >0;)it[ot.value++]=_e}else if(ot.value32767?B-65536:B}const te={a:0,b:0};function $(C,B){const ae=fe(C),Le=fe(B),De=ae+(Le&1)+(Le>>1),it=De,ot=De-Le;te.a=it,te.b=ot}function oe(C,B){const ae=le(C),Ee=le(B),Le=ae-(Ee>>1)&65535,De=Ee+Le-32768&65535;te.a=De,te.b=Le}function ge(C,B,ae,Ee,Le,De,it){const ot=it<16384,ct=ae>Le?Le:ae;let $e=1,_e,Qe;for(;$e<=ct;)$e<<=1;for($e>>=1,_e=$e,$e>>=1;$e>=1;){Qe=0;const dt=Qe+De*(Le-_e),zt=De*$e,Xt=De*_e,Tt=Ee*$e,wt=Ee*_e;let Ut,Cn,Zn,fr;for(;Qe<=dt;Qe+=Xt){let Jn=Qe;const vn=Qe+Ee*(ae-_e);for(;Jn<=vn;Jn+=wt){const Lr=Jn+Tt,Vs=Jn+zt,Xr=Vs+Tt;ot?($(C[Jn+B],C[Vs+B]),Ut=te.a,Zn=te.b,$(C[Lr+B],C[Xr+B]),Cn=te.a,fr=te.b,$(Ut,Cn),C[Jn+B]=te.a,C[Lr+B]=te.b,$(Zn,fr),C[Vs+B]=te.a,C[Xr+B]=te.b):(oe(C[Jn+B],C[Vs+B]),Ut=te.a,Zn=te.b,oe(C[Lr+B],C[Xr+B]),Cn=te.a,fr=te.b,oe(Ut,Cn),C[Jn+B]=te.a,C[Lr+B]=te.b,oe(Zn,fr),C[Vs+B]=te.a,C[Xr+B]=te.b)}if(ae&$e){const Lr=Jn+zt;ot?$(C[Jn+B],C[Lr+B]):oe(C[Jn+B],C[Lr+B]),Ut=te.a,C[Lr+B]=te.b,C[Jn+B]=Ut}}if(Le&$e){let Jn=Qe;const vn=Qe+Ee*(ae-_e);for(;Jn<=vn;Jn+=wt){const Lr=Jn+Tt;ot?$(C[Jn+B],C[Lr+B]):oe(C[Jn+B],C[Lr+B]),Ut=te.a,C[Lr+B]=te.b,C[Jn+B]=Ut}}_e=$e,$e>>=1}return Qe}function ve(C,B,ae,Ee,Le,De,it,ot,ct){let $e=0,_e=0;const Qe=it,dt=Math.trunc(Ee.value+(Le+7)/8);for(;Ee.value=14;){const Xt=$e>>_e-14&16383,Tt=B[Xt];if(Tt.len)_e-=Tt.len,_(Tt.lit,De,$e,_e,ae,Ee,ot,ct,Qe),$e=Z.c,_e=Z.lc;else{if(!Tt.p)throw new Error("hufDecode issues");let wt;for(wt=0;wt=Ut&&J(C[Tt.p[wt]])==($e>>_e-Ut&(1<>=zt,_e-=zt;_e>0;){const Xt=B[$e<<14-_e&16383];if(Xt.len)_e-=Xt.len,_(Xt.lit,De,$e,_e,ae,Ee,ot,ct,Qe),$e=Z.c,_e=Z.lc;else throw new Error("hufDecode issues")}return!0}function Ke(C,B,ae,Ee,Le,De){const it={value:0},ot=ae.value,ct=Pe(B,ae),$e=Pe(B,ae);ae.value+=4;const _e=Pe(B,ae);if(ae.value+=4,ct<0||ct>=65537||$e<0||$e>=65537)throw new Error("Something wrong with HUF_ENCSIZE");const Qe=new Array(65537),dt=new Array(16384);V(dt);const zt=Ee-(ae.value-ot);if(L(C,ae,zt,ct,$e,Qe),_e>8*(Ee-(ae.value-ot)))throw new Error("Something wrong with hufUncompress");F(Qe,ct,$e,dt),ve(Qe,dt,C,ae,_e,$e,De,Le,it)}function ue(C,B,ae){for(let Ee=0;EeDe||(B[Le++]=C[ae++],Le>De));)B[Le++]=C[Ee++]}function re(C){let B=C.byteLength;const ae=new Array;let Ee=0;const Le=new DataView(C);for(;B>0;){const De=Le.getInt8(Ee++);if(De<0){const it=-De;B-=it+1;for(let ot=0;ot>8==255?Le+=Ee&255:(ae[Le]=Ee,Le++),C.value++}function he(C,B){B[0]=Me(C[0]),B[1]=Me(C[1]),B[2]=Me(C[5]),B[3]=Me(C[6]),B[4]=Me(C[14]),B[5]=Me(C[15]),B[6]=Me(C[27]),B[7]=Me(C[28]),B[8]=Me(C[2]),B[9]=Me(C[4]),B[10]=Me(C[7]),B[11]=Me(C[13]),B[12]=Me(C[16]),B[13]=Me(C[26]),B[14]=Me(C[29]),B[15]=Me(C[42]),B[16]=Me(C[3]),B[17]=Me(C[8]),B[18]=Me(C[12]),B[19]=Me(C[17]),B[20]=Me(C[25]),B[21]=Me(C[30]),B[22]=Me(C[41]),B[23]=Me(C[43]),B[24]=Me(C[9]),B[25]=Me(C[11]),B[26]=Me(C[18]),B[27]=Me(C[24]),B[28]=Me(C[31]),B[29]=Me(C[40]),B[30]=Me(C[44]),B[31]=Me(C[53]),B[32]=Me(C[10]),B[33]=Me(C[19]),B[34]=Me(C[23]),B[35]=Me(C[32]),B[36]=Me(C[39]),B[37]=Me(C[45]),B[38]=Me(C[52]),B[39]=Me(C[54]),B[40]=Me(C[20]),B[41]=Me(C[22]),B[42]=Me(C[33]),B[43]=Me(C[38]),B[44]=Me(C[46]),B[45]=Me(C[51]),B[46]=Me(C[55]),B[47]=Me(C[60]),B[48]=Me(C[21]),B[49]=Me(C[34]),B[50]=Me(C[37]),B[51]=Me(C[47]),B[52]=Me(C[50]),B[53]=Me(C[56]),B[54]=Me(C[59]),B[55]=Me(C[61]),B[56]=Me(C[35]),B[57]=Me(C[36]),B[58]=Me(C[48]),B[59]=Me(C[49]),B[60]=Me(C[57]),B[61]=Me(C[58]),B[62]=Me(C[62]),B[63]=Me(C[63])}function ye(C){const B=.5*Math.cos(.7853975),ae=.5*Math.cos(3.14159/16),Ee=.5*Math.cos(3.14159/8),Le=.5*Math.cos(3*3.14159/16),De=.5*Math.cos(5*3.14159/16),it=.5*Math.cos(3*3.14159/8),ot=.5*Math.cos(7*3.14159/16),ct=new Array(4),$e=new Array(4),_e=new Array(4),Qe=new Array(4);for(let dt=0;dt<8;++dt){const zt=dt*8;ct[0]=Ee*C[zt+2],ct[1]=it*C[zt+2],ct[2]=Ee*C[zt+6],ct[3]=it*C[zt+6],$e[0]=ae*C[zt+1]+Le*C[zt+3]+De*C[zt+5]+ot*C[zt+7],$e[1]=Le*C[zt+1]-ot*C[zt+3]-ae*C[zt+5]-De*C[zt+7],$e[2]=De*C[zt+1]-ae*C[zt+3]+ot*C[zt+5]+Le*C[zt+7],$e[3]=ot*C[zt+1]-De*C[zt+3]+Le*C[zt+5]-ae*C[zt+7],_e[0]=B*(C[zt+0]+C[zt+4]),_e[3]=B*(C[zt+0]-C[zt+4]),_e[1]=ct[0]+ct[3],_e[2]=ct[1]-ct[2],Qe[0]=_e[0]+_e[1],Qe[1]=_e[3]+_e[2],Qe[2]=_e[3]-_e[2],Qe[3]=_e[0]-_e[1],C[zt+0]=Qe[0]+$e[0],C[zt+1]=Qe[1]+$e[1],C[zt+2]=Qe[2]+$e[2],C[zt+3]=Qe[3]+$e[3],C[zt+4]=Qe[3]-$e[3],C[zt+5]=Qe[2]-$e[2],C[zt+6]=Qe[1]-$e[1],C[zt+7]=Qe[0]-$e[0]}for(let dt=0;dt<8;++dt)ct[0]=Ee*C[16+dt],ct[1]=it*C[16+dt],ct[2]=Ee*C[48+dt],ct[3]=it*C[48+dt],$e[0]=ae*C[8+dt]+Le*C[24+dt]+De*C[40+dt]+ot*C[56+dt],$e[1]=Le*C[8+dt]-ot*C[24+dt]-ae*C[40+dt]-De*C[56+dt],$e[2]=De*C[8+dt]-ae*C[24+dt]+ot*C[40+dt]+Le*C[56+dt],$e[3]=ot*C[8+dt]-De*C[24+dt]+Le*C[40+dt]-ae*C[56+dt],_e[0]=B*(C[dt]+C[32+dt]),_e[3]=B*(C[dt]-C[32+dt]),_e[1]=ct[0]+ct[3],_e[2]=ct[1]-ct[2],Qe[0]=_e[0]+_e[1],Qe[1]=_e[3]+_e[2],Qe[2]=_e[3]-_e[2],Qe[3]=_e[0]-_e[1],C[0+dt]=Qe[0]+$e[0],C[8+dt]=Qe[1]+$e[1],C[16+dt]=Qe[2]+$e[2],C[24+dt]=Qe[3]+$e[3],C[32+dt]=Qe[3]-$e[3],C[40+dt]=Qe[2]-$e[2],C[48+dt]=Qe[1]-$e[1],C[56+dt]=Qe[0]-$e[0]}function we(C){for(let B=0;B<64;++B){const ae=C[0][B],Ee=C[1][B],Le=C[2][B];C[0][B]=ae+1.5747*Le,C[1][B]=ae-.1873*Ee-.4682*Le,C[2][B]=ae+1.8556*Ee}}function se(C,B,ae){for(let Ee=0;Ee<64;++Ee)B[ae+Ee]=hv.toHalfFloat(W(C[Ee]))}function W(C){return C<=1?Math.sign(C)*Math.pow(Math.abs(C),2.2):Math.sign(C)*Math.pow(P,Math.abs(C)-1)}function K(C){return new DataView(C.array.buffer,C.offset.value,C.size)}function ie(C){const B=C.viewer.buffer.slice(C.offset.value,C.offset.value+C.size),ae=new Uint8Array(re(B)),Ee=new Uint8Array(ae.length);return D(ae),G(ae,Ee),new DataView(Ee.buffer)}function me(C){const B=C.array.slice(C.offset.value,C.offset.value+C.size);typeof Q_>"u"&&console.error("THREE.EXRLoader: External library fflate.min.js required.");const ae=ep(B),Ee=new Uint8Array(ae.length);return D(ae),G(ae,Ee),new DataView(Ee.buffer)}function We(C){const B=C.viewer,ae={value:C.offset.value},Ee=new Uint16Array(C.width*C.scanlineBlockSize*(C.channels*C.type)),Le=new Uint8Array(8192);let De=0;const it=new Array(C.channels);for(let Xt=0;Xt=8192)throw new Error("Something is wrong with PIZ_COMPRESSION BITMAP_SIZE");if(ot<=ct)for(let Xt=0;Xt"u"&&console.error("THREE.EXRLoader: External library fflate.min.js required.");const ae=ep(B),Ee=C.lines*C.channels*C.width,Le=C.type==1?new Uint16Array(Ee):new Uint32Array(Ee);let De=0,it=0;const ot=new Array(4);for(let ct=0;ct0;){const Tt=Y(B.buffer,ae),wt=Fe(B,ae),Ut=wt>>2&3,Cn=(wt>>4)-1,Zn=new Int8Array([Cn])[0],fr=Fe(B,ae);De.push({name:Tt,index:Zn,type:fr,compression:Ut}),it-=Tt.length+3}const ot=qe.channels,ct=new Array(C.channels);for(let Tt=0;Tt=0&&($e.idx[Cn.index]=Tt),wt.offset=Tt)}}let _e,Qe,dt;if(Le.acCompressedSize>0)switch(Le.acCompression){case 0:_e=new Uint16Array(Le.totalAcUncompressedCount),Ke(C.array,B,ae,Le.acCompressedSize,_e,Le.totalAcUncompressedCount);break;case 1:const Tt=C.array.slice(ae.value,ae.value+Le.totalAcUncompressedCount),wt=ep(Tt);_e=new Uint16Array(wt.buffer),ae.value+=Le.totalAcUncompressedCount;break}if(Le.dcCompressedSize>0){const Tt={array:C.array,offset:ae,size:Le.dcCompressedSize};Qe=new Uint16Array(me(Tt).buffer),ae.value+=Le.dcCompressedSize}if(Le.rleRawSize>0){const Tt=C.array.slice(ae.value,ae.value+Le.rleCompressedSize),wt=ep(Tt);dt=re(wt.buffer),ae.value+=Le.rleCompressedSize}let zt=0;const Xt=new Array(ct.length);for(let Tt=0;Tt>10,ae=C&1023;return(C>>15?-1:1)*(B?B===31?ae?NaN:1/0:Math.pow(2,B-15)*(1+ae/1024):6103515625e-14*(ae/1024))}function lt(C,B){const ae=C.getUint16(B.value,!0);return B.value+=2,ae}function vt(C,B){return Me(lt(C,B))}function bn(C,B,ae,Ee){const Le=ae.value,De=[];for(;ae.valueUe.height?Ue.height-B:Ue.scanlineBlockSize;const Ee=Ue.size=Ue.height)break;for(let it=0;it(S=V.indexOf(d))&&P=y.byteLength||!(R=f(y)))return o(1,"no header found");if(!(V=R.match(x)))return o(3,"bad initial token");for(P.valid|=1,P.programtype=V[1],P.string+=R+` `;R=f(y),R!==!1;){if(P.string+=R+` `,R.charAt(0)==="#"){P.comments+=R+` -`;continue}if((V=R.match(T))&&(P.gamma=parseFloat(V[1])),(V=R.match(M))&&(P.exposure=parseFloat(V[1])),(V=R.match(E))&&(P.valid|=2,P.format=V[1]),(V=R.match(S))&&(P.valid|=4,P.height=parseInt(V[1],10),P.width=parseInt(V[2],10)),P.valid&2&&P.valid&4)break}return P.valid&2?P.valid&4?P:o(3,"missing image size specifier"):o(3,"missing format specifier")},p=function(y,x,T){const M=x;if(M<8||M>32767||y[0]!==2||y[1]!==2||y[2]&128)return new Uint8Array(y);if(M!==(y[2]<<8|y[3]))return o(3,"wrong scanline width");const E=new Uint8Array(4*x*T);if(!E.length)return o(4,"unable to allocate buffer space");let S=0,P=0;const R=4*M,V=new Uint8Array(4),z=new Uint8Array(R);let k=T;for(;k>0&&Py.byteLength)return o(1);if(V[0]=y[P++],V[1]=y[P++],V[2]=y[P++],V[3]=y[P++],V[0]!=2||V[1]!=2||(V[2]<<8|V[3])!=M)return o(3,"bad rgbe scanline format");let N=0,q;for(;N128;if(A&&(q-=128),q===0||N+q>R)return o(3,"bad scanline data");if(A){const Z=y[P++];for(let j=0;j.init",u),c&&(c=r("<"+o+">.getTransferables",c));var d=null;typeof u=="function"?d=u.apply(void 0,l):console.error("worker module init function failed to rehydrate"),t[a]={id:a,value:d,getTransferables:c},s(d)}catch(f){f&&f.noLog||console.error(f),s(f)}}function n(i,s){var a,o=i.id,l=i.args;(!t[o]||typeof t[o].value!="function")&&s(new Error("Worker module "+o+": not found or its 'init' did not return a function"));try{var u=(a=t[o]).value.apply(a,l);u&&typeof u.then=="function"?u.then(c,function(d){return s(d instanceof Error?d:new Error(""+d))}):c(u)}catch(d){s(d)}function c(d){try{var f=t[o].getTransferables&&t[o].getTransferables(d);(!f||!Array.isArray(f)||!f.length)&&(f=void 0),s(d,f)}catch(h){console.error(h),s(h)}}}function r(i,s){var a=void 0;self.troikaDefine=function(l){return a=l};var o=URL.createObjectURL(new Blob(["/** "+i.replace(/\*/g,"")+` **/ +`;continue}if((V=R.match(T))&&(P.gamma=parseFloat(V[1])),(V=R.match(M))&&(P.exposure=parseFloat(V[1])),(V=R.match(E))&&(P.valid|=2,P.format=V[1]),(V=R.match(S))&&(P.valid|=4,P.height=parseInt(V[1],10),P.width=parseInt(V[2],10)),P.valid&2&&P.valid&4)break}return P.valid&2?P.valid&4?P:o(3,"missing image size specifier"):o(3,"missing format specifier")},p=function(y,x,T){const M=x;if(M<8||M>32767||y[0]!==2||y[1]!==2||y[2]&128)return new Uint8Array(y);if(M!==(y[2]<<8|y[3]))return o(3,"wrong scanline width");const E=new Uint8Array(4*x*T);if(!E.length)return o(4,"unable to allocate buffer space");let S=0,P=0;const R=4*M,V=new Uint8Array(4),z=new Uint8Array(R);let k=T;for(;k>0&&Py.byteLength)return o(1);if(V[0]=y[P++],V[1]=y[P++],V[2]=y[P++],V[3]=y[P++],V[0]!=2||V[1]!=2||(V[2]<<8|V[3])!=M)return o(3,"bad rgbe scanline format");let N=0,q;for(;N128;if(A&&(q-=128),q===0||N+q>R)return o(3,"bad scanline data");if(A){const J=y[P++];for(let F=0;F.init",u),c&&(c=r("<"+o+">.getTransferables",c));var d=null;typeof u=="function"?d=u.apply(void 0,l):console.error("worker module init function failed to rehydrate"),t[a]={id:a,value:d,getTransferables:c},s(d)}catch(f){f&&f.noLog||console.error(f),s(f)}}function n(i,s){var a,o=i.id,l=i.args;(!t[o]||typeof t[o].value!="function")&&s(new Error("Worker module "+o+": not found or its 'init' did not return a function"));try{var u=(a=t[o]).value.apply(a,l);u&&typeof u.then=="function"?u.then(c,function(d){return s(d instanceof Error?d:new Error(""+d))}):c(u)}catch(d){s(d)}function c(d){try{var f=t[o].getTransferables&&t[o].getTransferables(d);(!f||!Array.isArray(f)||!f.length)&&(f=void 0),s(d,f)}catch(h){console.error(h),s(h)}}}function r(i,s){var a=void 0;self.troikaDefine=function(l){return a=l};var o=URL.createObjectURL(new Blob(["/** "+i.replace(/\*/g,"")+` **/ troikaDefine( `+s+` -)`],{type:"application/javascript"}));try{importScripts(o)}catch(l){console.error(l)}return URL.revokeObjectURL(o),delete self.troikaDefine,a}self.addEventListener("message",function(i){var s=i.data,a=s.messageId,o=s.action,l=s.data;try{o==="registerModule"&&e(l,function(u){u instanceof Error?postMessage({messageId:a,success:!1,error:u.message}):postMessage({messageId:a,success:!0,result:{isCallable:typeof u=="function"}})}),o==="callModule"&&n(l,function(u,c){u instanceof Error?postMessage({messageId:a,success:!1,error:u.message}):postMessage({messageId:a,success:!0,result:u},c||void 0)})}catch(u){postMessage({messageId:a,success:!1,error:u.stack})}})}function Nvt(t){var e=function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];return e._getInitResult().then(function(i){if(typeof i=="function")return i.apply(void 0,n);throw new Error("Worker module function was called but `init` did not return a callable function")})};return e._getInitResult=function(){var n=t.dependencies,r=t.init;n=Array.isArray(n)?n.map(function(s){return s&&s._getInitResult?s._getInitResult():s}):[];var i=Promise.all(n).then(function(s){return r.apply(null,s)});return e._getInitResult=function(){return i},i},e}var a0e=function(){var t=!1;if(typeof window<"u"&&typeof window.document<"u")try{var e=new Worker(URL.createObjectURL(new Blob([""],{type:"application/javascript"})));e.terminate(),t=!0}catch(n){typeof process<"u",console.log("Troika createWorkerModule: web workers not allowed; falling back to main thread execution. Cause: ["+n.message+"]")}return a0e=function(){return t},t},Lvt=0,Xvt=0,FI=!1,gx=Object.create(null),bx=Object.create(null),o4=Object.create(null);function nw(t){if((!t||typeof t.init!="function")&&!FI)throw new Error("requires `options.init` function");var e=t.dependencies,n=t.init,r=t.getTransferables,i=t.workerId;if(!a0e())return Nvt(t);i==null&&(i="#default");var s="workerModule"+ ++Lvt,a=t.name||s,o=null;e=e&&e.map(function(u){return typeof u=="function"&&!u.workerModuleData&&(FI=!0,u=nw({workerId:i,name:"<"+a+"> function dependency: "+u.name,init:`function(){return ( +)`],{type:"application/javascript"}));try{importScripts(o)}catch(l){console.error(l)}return URL.revokeObjectURL(o),delete self.troikaDefine,a}self.addEventListener("message",function(i){var s=i.data,a=s.messageId,o=s.action,l=s.data;try{o==="registerModule"&&e(l,function(u){u instanceof Error?postMessage({messageId:a,success:!1,error:u.message}):postMessage({messageId:a,success:!0,result:{isCallable:typeof u=="function"}})}),o==="callModule"&&n(l,function(u,c){u instanceof Error?postMessage({messageId:a,success:!1,error:u.message}):postMessage({messageId:a,success:!0,result:u},c||void 0)})}catch(u){postMessage({messageId:a,success:!1,error:u.stack})}})}function Lvt(t){var e=function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];return e._getInitResult().then(function(i){if(typeof i=="function")return i.apply(void 0,n);throw new Error("Worker module function was called but `init` did not return a callable function")})};return e._getInitResult=function(){var n=t.dependencies,r=t.init;n=Array.isArray(n)?n.map(function(s){return s&&s._getInitResult?s._getInitResult():s}):[];var i=Promise.all(n).then(function(s){return r.apply(null,s)});return e._getInitResult=function(){return i},i},e}var s0e=function(){var t=!1;if(typeof window<"u"&&typeof window.document<"u")try{var e=new Worker(URL.createObjectURL(new Blob([""],{type:"application/javascript"})));e.terminate(),t=!0}catch(n){typeof process<"u",console.log("Troika createWorkerModule: web workers not allowed; falling back to main thread execution. Cause: ["+n.message+"]")}return s0e=function(){return t},t},Xvt=0,Cvt=0,FI=!1,vx=Object.create(null),gx=Object.create(null),o4=Object.create(null);function nw(t){if((!t||typeof t.init!="function")&&!FI)throw new Error("requires `options.init` function");var e=t.dependencies,n=t.init,r=t.getTransferables,i=t.workerId;if(!s0e())return Lvt(t);i==null&&(i="#default");var s="workerModule"+ ++Xvt,a=t.name||s,o=null;e=e&&e.map(function(u){return typeof u=="function"&&!u.workerModuleData&&(FI=!0,u=nw({workerId:i,name:"<"+a+"> function dependency: "+u.name,init:`function(){return ( `+Z7(u)+` -)}`}),FI=!1),u&&u.workerModuleData&&(u=u.workerModuleData),u});function l(){for(var u=[],c=arguments.length;c--;)u[c]=arguments[c];if(!o){o=e$(i,"registerModule",l.workerModuleData);var d=function(){o=null,bx[i].delete(d)};(bx[i]||(bx[i]=new Set)).add(d)}return o.then(function(f){var h=f.isCallable;if(h)return e$(i,"callModule",{id:s,args:u});throw new Error("Worker module function was called but `init` did not return a callable function")})}return l.workerModuleData={isWorkerModule:!0,id:s,name:a,dependencies:e,init:Z7(n),getTransferables:r&&Z7(r)},l}function Cvt(t){bx[t]&&bx[t].forEach(function(e){e()}),gx[t]&&(gx[t].terminate(),delete gx[t])}function Z7(t){var e=t.toString();return!/^function/.test(e)&&/^\w+\s*\(/.test(e)&&(e="function "+e),e}function Kvt(t){var e=gx[t];if(!e){var n=Z7(Uvt);e=gx[t]=new Worker(URL.createObjectURL(new Blob(["/** Worker Module Bootstrap: "+t.replace(/\*/g,"")+` **/ +)}`}),FI=!1),u&&u.workerModuleData&&(u=u.workerModuleData),u});function l(){for(var u=[],c=arguments.length;c--;)u[c]=arguments[c];if(!o){o=__(i,"registerModule",l.workerModuleData);var d=function(){o=null,gx[i].delete(d)};(gx[i]||(gx[i]=new Set)).add(d)}return o.then(function(f){var h=f.isCallable;if(h)return __(i,"callModule",{id:s,args:u});throw new Error("Worker module function was called but `init` did not return a callable function")})}return l.workerModuleData={isWorkerModule:!0,id:s,name:a,dependencies:e,init:Z7(n),getTransferables:r&&Z7(r)},l}function Kvt(t){gx[t]&&gx[t].forEach(function(e){e()}),vx[t]&&(vx[t].terminate(),delete vx[t])}function Z7(t){var e=t.toString();return!/^function/.test(e)&&/^\w+\s*\(/.test(e)&&(e="function "+e),e}function qvt(t){var e=vx[t];if(!e){var n=Z7(Nvt);e=vx[t]=new Worker(URL.createObjectURL(new Blob(["/** Worker Module Bootstrap: "+t.replace(/\*/g,"")+` **/ -;(`+n+")()"],{type:"application/javascript"}))),e.onmessage=function(r){var i=r.data,s=i.messageId,a=o4[s];if(!a)throw new Error("WorkerModule response with empty or unknown messageId");delete o4[s],a(i)}}return e}function e$(t,e,n){return new Promise(function(r,i){var s=++Xvt;o4[s]=function(a){a.success?r(a.result):i(new Error("Error in worker "+e+" call: "+a.error))},Kvt(t).postMessage({messageId:s,action:e,data:n})})}function o0e(){var t=function(e){function n(j,ne,G,B,ee,ce,fe,te){var _=1-fe;te.x=_*_*j+2*_*fe*G+fe*fe*ee,te.y=_*_*ne+2*_*fe*B+fe*fe*ce}function r(j,ne,G,B,ee,ce,fe,te,_,oe){var ye=1-_;oe.x=ye*ye*ye*j+3*ye*ye*_*G+3*ye*_*_*ee+_*_*_*fe,oe.y=ye*ye*ye*ne+3*ye*ye*_*B+3*ye*_*_*ce+_*_*_*te}function i(j,ne){for(var G=/([MLQCZ])([^MLQCZ]*)/g,B,ee,ce,fe,te;B=G.exec(j);){var _=B[2].replace(/^\s*|\s*$/g,"").split(/[,\s]+/).map(function(oe){return parseFloat(oe)});switch(B[1]){case"M":fe=ee=_[0],te=ce=_[1];break;case"L":(_[0]!==fe||_[1]!==te)&&ne("L",fe,te,fe=_[0],te=_[1]);break;case"Q":{ne("Q",fe,te,fe=_[2],te=_[3],_[0],_[1]);break}case"C":{ne("C",fe,te,fe=_[4],te=_[5],_[0],_[1],_[2],_[3]);break}case"Z":(fe!==ee||te!==ce)&&ne("L",fe,te,ee,ce);break}}}function s(j,ne,G){G===void 0&&(G=16);var B={x:0,y:0};i(j,function(ee,ce,fe,te,_,oe,ye,ve,Ke){switch(ee){case"L":ne(ce,fe,te,_);break;case"Q":{for(var le=ce,D=fe,F=1;F0;)Q[Pe]=arguments[Pe+2];var Ve=We[Se]||(We[Se]=G.getUniformLocation(Ce,Se));G["uniform"+ge].apply(G,[Ve].concat(Q))},setAttribute:function(ge,Se,Q,Pe,Ve){var Fe=me[ge];Fe||(Fe=me[ge]={buf:G.createBuffer(),loc:G.getAttribLocation(Ce,ge),data:null}),G.bindBuffer(G.ARRAY_BUFFER,Fe.buf),G.vertexAttribPointer(Fe.loc,Se,G.FLOAT,!1,0,0),G.enableVertexAttribArray(Fe.loc),ee?G.vertexAttribDivisor(Fe.loc,Pe):re("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(Fe.loc,Pe),Ve!==Fe.data&&(G.bufferData(G.ARRAY_BUFFER,Ve,Q),Fe.data=Ve)}})}}}fe[se].transaction(ie)},he=function(se,W){_++;try{G.activeTexture(G.TEXTURE0+_);var K=te[se];K||(K=te[se]=G.createTexture(),G.bindTexture(G.TEXTURE_2D,K),G.texParameteri(G.TEXTURE_2D,G.TEXTURE_MIN_FILTER,G.NEAREST),G.texParameteri(G.TEXTURE_2D,G.TEXTURE_MAG_FILTER,G.NEAREST)),G.bindTexture(G.TEXTURE_2D,K),W(K,_)}finally{_--}},be=function(se,W,K){var ie=G.createFramebuffer();oe.push(ie),G.bindFramebuffer(G.FRAMEBUFFER,ie),G.activeTexture(G.TEXTURE0+W),G.bindTexture(G.TEXTURE_2D,se),G.framebufferTexture2D(G.FRAMEBUFFER,G.COLOR_ATTACHMENT0,G.TEXTURE_2D,se,0);try{K(ie)}finally{G.deleteFramebuffer(ie),G.bindFramebuffer(G.FRAMEBUFFER,oe[--oe.length-1]||null)}},we=function(){ce={},fe={},te={},_=-1,oe.length=0};var ye=re,ve=de,Ke=Te,le=he,D=be,F=we,ee=typeof WebGL2RenderingContext<"u"&&G instanceof WebGL2RenderingContext,ce={},fe={},te={},_=-1,oe=[];G.canvas.addEventListener("webglcontextlost",function(se){we(),se.preventDefault()},!1),l.set(G,B={gl:G,isWebGL2:ee,getExtension:re,withProgram:Te,withTexture:he,withTextureFramebuffer:be,handleContextLoss:we})}ne(B)}function d(j,ne,G,B,ee,ce,fe,te){fe===void 0&&(fe=15),te===void 0&&(te=null),c(j,function(_){var oe=_.gl,ye=_.withProgram,ve=_.withTexture;ve("copy",function(Ke,le){oe.texImage2D(oe.TEXTURE_2D,0,oe.RGBA,ee,ce,0,oe.RGBA,oe.UNSIGNED_BYTE,ne),ye("copy",a,o,function(D){var F=D.setUniform,re=D.setAttribute;re("aUV",2,oe.STATIC_DRAW,0,new Float32Array([0,0,2,0,0,2])),F("1i","image",le),oe.bindFramebuffer(oe.FRAMEBUFFER,te||null),oe.disable(oe.BLEND),oe.colorMask(fe&8,fe&4,fe&2,fe&1),oe.viewport(G,B,ee,ce),oe.scissor(G,B,ee,ce),oe.drawArrays(oe.TRIANGLES,0,3)})})})}function f(j,ne,G){var B=j.width,ee=j.height;c(j,function(ce){var fe=ce.gl,te=new Uint8Array(B*ee*4);fe.readPixels(0,0,B,ee,fe.RGBA,fe.UNSIGNED_BYTE,te),j.width=ne,j.height=G,d(fe,te,0,0,B,ee)})}var h=Object.freeze({__proto__:null,withWebGLContext:c,renderImageData:d,resizeWebGLCanvasWithoutClearing:f});function p(j,ne,G,B,ee,ce){ce===void 0&&(ce=1);var fe=new Uint8Array(j*ne),te=B[2]-B[0],_=B[3]-B[1],oe=[];s(G,function(re,de,Te,he){oe.push({x1:re,y1:de,x2:Te,y2:he,minX:Math.min(re,Te),minY:Math.min(de,he),maxX:Math.max(re,Te),maxY:Math.max(de,he)})}),oe.sort(function(re,de){return re.maxX-de.maxX});for(var ye=0;yewe.minX&&de-hewe.minY){var se=g(re,de,we.x1,we.y1,we.x2,we.y2);sede!=be.y2>de&&re<(be.x2-be.x1)*(de-be.y1)/(be.y2-be.y1)+be.x1;we&&(Te+=be.y1p.y!=seg.w>p.y)&&(p.x<(seg.z-seg.x)*(p.y-seg.y)/(seg.w-seg.y)+seg.x);bool crossingUp=crossing&&vLineSegment.y1,1e>2,u>2,2wt>1,1>1,1ge>1,1wp>1,1j>1,f>1,hm>1,1>1,u>1,u6>1,1>1,+5,28>1,w>1,1>1,+3,b8>1,1>1,+3,1>3,-1>-1,3>1,1>1,+2,1s>1,1>1,x>1,th>1,1>1,+2,db>1,1>1,+3,3>1,1>1,+2,14qm>1,1>1,+1,4q>1,1e>2,u>2,2>1,+1",canonical:"6f1>-6dx,6dy>-6dx,6ec>-6ed,6ee>-6ed,6ww>2jj,-2ji>2jj,14r4>-1e7l,1e7m>-1e7l,1e7m>-1e5c,1e5d>-1e5b,1e5c>-14qx,14qy>-14qx,14vn>-1ecg,1ech>-1ecg,1edu>-1ecg,1eci>-1ecg,1eda>-1ecg,1eci>-1ecg,1eci>-168q,168r>-168q,168s>-14ye,14yf>-14ye"};function m(he,be){var we=36,se=0,W=new Map,K=be&&new Map,ie;return he.split(",").forEach(function me(We){if(We.indexOf("+")!==-1)for(var Ce=+We;Ce--;)me(ie);else{ie=We;var Ae=We.split(">"),J=Ae[0],ue=Ae[1];J=String.fromCodePoint(se+=parseInt(J,we)),ue=String.fromCodePoint(se+=parseInt(ue,we)),W.set(J,ue),be&&K.set(ue,J)}}),{map:W,reverseMap:K}}var v,g,b;function y(){if(!v){var he=m(p.pairs,!0),be=he.map,we=he.reverseMap;v=be,g=we,b=m(p.canonical,!1).map}}function x(he){return y(),v.get(he)||null}function T(he){return y(),g.get(he)||null}function M(he){return y(),b.get(he)||null}var E=r.L,S=r.R,P=r.EN,R=r.ES,V=r.ET,z=r.AN,k=r.CS,N=r.B,q=r.S,L=r.ON,A=r.BN,Z=r.NSM,j=r.AL,ne=r.LRO,G=r.RLO,B=r.LRE,ee=r.RLE,ce=r.PDF,fe=r.LRI,te=r.RLI,_=r.FSI,oe=r.PDI;function ye(he,be){for(var we=125,se=new Uint32Array(he.length),W=0;W0)Fe--;else if(Ze>0){for(je=0;!Pe[Pe.length-1]._isolate;)Pe.pop();var Tr=Pe[Pe.length-1]._isolInitIndex;Tr!=null&&(We.set(Tr,Re),We.set(Re,Tr)),Pe.pop(),Ze--}Ve=Pe[Pe.length-1],me[Re]=Ve._level,Ve._override&&ie(Re,Ve._override)}else Me&ce?(Fe===0&&(je>0?je--:!Ve._isolate&&Pe.length>1&&(Pe.pop(),Ve=Pe[Pe.length-1])),me[Re]=Ve._level):Me&N&&(me[Re]=Ae.level);else me[Re]=Ve._level,Ve._override&&Me!==A&&ie(Re,Ve._override)}for(var Fr=[],zr=null,sr=Ae.start;sr<=Ae.end;sr++){var bo=se[sr];if(!(bo&l)){var $n=me[sr],wr=bo&s,ar=bo===oe;zr&&$n===zr._level?(zr._end=sr,zr._endsWithIsolInit=wr):Fr.push(zr={_start:sr,_end:sr,_level:$n,_startsWithPDI:ar,_endsWithIsolInit:wr})}}for(var Bi=[],$=0;$=0;Le--)if(!(se[Le]&l)){Ee=me[Le];break}var De=Pt[Pt.length-1],it=me[De],ot=Ae.level;if(!(se[De]&s)){for(var ct=De+1;ct<=Ae.end;ct++)if(!(se[ct]&l)){ot=me[ct];break}}Bi.push({_seqIndices:Pt,_sosType:Math.max(Ee,ae)%2?S:E,_eosType:Math.max(ot,it)%2?S:E})}}for(var $e=0;$e=0;Cn--)if(!(se[Qe[Cn]]&l)){Ut=se[Qe[Cn]];break}ie(wt,Ut&(s|oe)?L:Ut)}}if(K.get(P))for(var Zn=0;Zn=-1;Jn--){var vn=Jn===-1?dt:se[Qe[Jn]];if(vn&a){vn===j&&ie(fr,z);break}}}if(K.get(j))for(var Lr=0;Lr=0&&(qn=se[Qe[Rl]],!!(qn&l));Rl--);for(var ha=Xr+1;ha=0&&se[Qe[hd]]&(V|l);hd--)ie(Qe[hd],P);for(Si++;Si=0&&se[Qe[hr]]&l;hr--)ie(Qe[hr],L);for(var pd=$u+1;pd=0;Hf--){var D0=Bf[Hf].char;if(D0===sS||D0===T(M(yo))||x(M(D0))===yo){q0.push([Bf[Hf].seqIndex,Vl]),Bf.length=Hf;break}}}q0.sort(function(ds,So){return ds[0]-So[0]})}for(var ec=0;ec=0;A0--){var Qf=Qe[A0];if(se[Qf]&Lw){var _f=se[Qf]&ym?S:E;_f!==Xt?Bo=_f:Bo=Xt;break}}}if(Bo){if(se[Qe[W0]]=se[Qe[aS]]=Bo,Bo!==Xt){for(var $f=W0+1;$f=0;eh--)if(se[Qe[eh]]&l)Cw=eh;else{G0=se[Qe[eh]]&ym?S:E;break}for(var uS=zt,tc=or+1;tc=0&&f(he[nc])&u;nc--)me[nc]=Ae.level}}return{levels:me,paragraphs:Ce};function cS(ds,So){for(var fs=ds;fs=me&&f(he[Ae])&u;Ae--)Ce[Ae]=ie.level;for(var J=ie.level,ue=1/0,ge=0;geJ&&(J=Se),Se=ue;Q--)for(var Pe=0;Pe=Q){for(var Ve=Pe;Pe+1=Q;)Pe++;Pe>Ve&&K.push([Ve+me,Pe+me])}}}),K}function de(he,be,we,se){var W=Te(he,be,we,se),K=[].concat(he);return W.forEach(function(ie,me){K[me]=(be.levels[ie]&1?D(he[ie]):null)||he[ie]}),K.join("")}function Te(he,be,we,se){for(var W=re(he,be,we,se),K=[],ie=0;ie/gm;function n(r,i){let s=yn[i];return s?l4(s):r}return t.replace(e,n)}const Hs=[];for(let t=0;t<256;t++)Hs[t]=(t<16?"0":"")+t.toString(16);function Dvt(){const t=Math.random()*4294967295|0,e=Math.random()*4294967295|0,n=Math.random()*4294967295|0,r=Math.random()*4294967295|0;return(Hs[t&255]+Hs[t>>8&255]+Hs[t>>16&255]+Hs[t>>24&255]+"-"+Hs[e&255]+Hs[e>>8&255]+"-"+Hs[e>>16&15|64]+Hs[e>>24&255]+"-"+Hs[n&63|128]+Hs[n>>8&255]+"-"+Hs[n>>16&255]+Hs[n>>24&255]+Hs[r&255]+Hs[r>>8&255]+Hs[r>>16&255]+Hs[r>>24&255]).toUpperCase()}const Fm=Object.assign||function(){let t=arguments[0];for(let e=1,n=arguments.length;e/gm,` +;(`+n+")()"],{type:"application/javascript"}))),e.onmessage=function(r){var i=r.data,s=i.messageId,a=o4[s];if(!a)throw new Error("WorkerModule response with empty or unknown messageId");delete o4[s],a(i)}}return e}function __(t,e,n){return new Promise(function(r,i){var s=++Cvt;o4[s]=function(a){a.success?r(a.result):i(new Error("Error in worker "+e+" call: "+a.error))},qvt(t).postMessage({messageId:s,action:e,data:n})})}function a0e(){var t=function(e){function n(F,ne,j,Z,_,le,fe,te){var $=1-fe;te.x=$*$*F+2*$*fe*j+fe*fe*_,te.y=$*$*ne+2*$*fe*Z+fe*fe*le}function r(F,ne,j,Z,_,le,fe,te,$,oe){var ge=1-$;oe.x=ge*ge*ge*F+3*ge*ge*$*j+3*ge*$*$*_+$*$*$*fe,oe.y=ge*ge*ge*ne+3*ge*ge*$*Z+3*ge*$*$*le+$*$*$*te}function i(F,ne){for(var j=/([MLQCZ])([^MLQCZ]*)/g,Z,_,le,fe,te;Z=j.exec(F);){var $=Z[2].replace(/^\s*|\s*$/g,"").split(/[,\s]+/).map(function(oe){return parseFloat(oe)});switch(Z[1]){case"M":fe=_=$[0],te=le=$[1];break;case"L":($[0]!==fe||$[1]!==te)&&ne("L",fe,te,fe=$[0],te=$[1]);break;case"Q":{ne("Q",fe,te,fe=$[2],te=$[3],$[0],$[1]);break}case"C":{ne("C",fe,te,fe=$[4],te=$[5],$[0],$[1],$[2],$[3]);break}case"Z":(fe!==_||te!==le)&&ne("L",fe,te,_,le);break}}}function s(F,ne,j){j===void 0&&(j=16);var Z={x:0,y:0};i(F,function(_,le,fe,te,$,oe,ge,ve,Ke){switch(_){case"L":ne(le,fe,te,$);break;case"Q":{for(var ue=le,D=fe,G=1;G0;)Q[Pe]=arguments[Pe+2];var Ve=We[Se]||(We[Se]=j.getUniformLocation(Ce,Se));j["uniform"+be].apply(j,[Ve].concat(Q))},setAttribute:function(be,Se,Q,Pe,Ve){var Fe=me[be];Fe||(Fe=me[be]={buf:j.createBuffer(),loc:j.getAttribLocation(Ce,be),data:null}),j.bindBuffer(j.ARRAY_BUFFER,Fe.buf),j.vertexAttribPointer(Fe.loc,Se,j.FLOAT,!1,0,0),j.enableVertexAttribArray(Fe.loc),_?j.vertexAttribDivisor(Fe.loc,Pe):re("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(Fe.loc,Pe),Ve!==Fe.data&&(j.bufferData(j.ARRAY_BUFFER,Ve,Q),Fe.data=Ve)}})}}}fe[se].transaction(ie)},he=function(se,W){$++;try{j.activeTexture(j.TEXTURE0+$);var K=te[se];K||(K=te[se]=j.createTexture(),j.bindTexture(j.TEXTURE_2D,K),j.texParameteri(j.TEXTURE_2D,j.TEXTURE_MIN_FILTER,j.NEAREST),j.texParameteri(j.TEXTURE_2D,j.TEXTURE_MAG_FILTER,j.NEAREST)),j.bindTexture(j.TEXTURE_2D,K),W(K,$)}finally{$--}},ye=function(se,W,K){var ie=j.createFramebuffer();oe.push(ie),j.bindFramebuffer(j.FRAMEBUFFER,ie),j.activeTexture(j.TEXTURE0+W),j.bindTexture(j.TEXTURE_2D,se),j.framebufferTexture2D(j.FRAMEBUFFER,j.COLOR_ATTACHMENT0,j.TEXTURE_2D,se,0);try{K(ie)}finally{j.deleteFramebuffer(ie),j.bindFramebuffer(j.FRAMEBUFFER,oe[--oe.length-1]||null)}},we=function(){le={},fe={},te={},$=-1,oe.length=0};var ge=re,ve=de,Ke=Te,ue=he,D=ye,G=we,_=typeof WebGL2RenderingContext<"u"&&j instanceof WebGL2RenderingContext,le={},fe={},te={},$=-1,oe=[];j.canvas.addEventListener("webglcontextlost",function(se){we(),se.preventDefault()},!1),l.set(j,Z={gl:j,isWebGL2:_,getExtension:re,withProgram:Te,withTexture:he,withTextureFramebuffer:ye,handleContextLoss:we})}ne(Z)}function d(F,ne,j,Z,_,le,fe,te){fe===void 0&&(fe=15),te===void 0&&(te=null),c(F,function($){var oe=$.gl,ge=$.withProgram,ve=$.withTexture;ve("copy",function(Ke,ue){oe.texImage2D(oe.TEXTURE_2D,0,oe.RGBA,_,le,0,oe.RGBA,oe.UNSIGNED_BYTE,ne),ge("copy",a,o,function(D){var G=D.setUniform,re=D.setAttribute;re("aUV",2,oe.STATIC_DRAW,0,new Float32Array([0,0,2,0,0,2])),G("1i","image",ue),oe.bindFramebuffer(oe.FRAMEBUFFER,te||null),oe.disable(oe.BLEND),oe.colorMask(fe&8,fe&4,fe&2,fe&1),oe.viewport(j,Z,_,le),oe.scissor(j,Z,_,le),oe.drawArrays(oe.TRIANGLES,0,3)})})})}function f(F,ne,j){var Z=F.width,_=F.height;c(F,function(le){var fe=le.gl,te=new Uint8Array(Z*_*4);fe.readPixels(0,0,Z,_,fe.RGBA,fe.UNSIGNED_BYTE,te),F.width=ne,F.height=j,d(fe,te,0,0,Z,_)})}var h=Object.freeze({__proto__:null,withWebGLContext:c,renderImageData:d,resizeWebGLCanvasWithoutClearing:f});function p(F,ne,j,Z,_,le){le===void 0&&(le=1);var fe=new Uint8Array(F*ne),te=Z[2]-Z[0],$=Z[3]-Z[1],oe=[];s(j,function(re,de,Te,he){oe.push({x1:re,y1:de,x2:Te,y2:he,minX:Math.min(re,Te),minY:Math.min(de,he),maxX:Math.max(re,Te),maxY:Math.max(de,he)})}),oe.sort(function(re,de){return re.maxX-de.maxX});for(var ge=0;gewe.minX&&de-hewe.minY){var se=g(re,de,we.x1,we.y1,we.x2,we.y2);sede!=ye.y2>de&&re<(ye.x2-ye.x1)*(de-ye.y1)/(ye.y2-ye.y1)+ye.x1;we&&(Te+=ye.y1p.y!=seg.w>p.y)&&(p.x<(seg.z-seg.x)*(p.y-seg.y)/(seg.w-seg.y)+seg.x);bool crossingUp=crossing&&vLineSegment.y1,1e>2,u>2,2wt>1,1>1,1ge>1,1wp>1,1j>1,f>1,hm>1,1>1,u>1,u6>1,1>1,+5,28>1,w>1,1>1,+3,b8>1,1>1,+3,1>3,-1>-1,3>1,1>1,+2,1s>1,1>1,x>1,th>1,1>1,+2,db>1,1>1,+3,3>1,1>1,+2,14qm>1,1>1,+1,4q>1,1e>2,u>2,2>1,+1",canonical:"6f1>-6dx,6dy>-6dx,6ec>-6ed,6ee>-6ed,6ww>2jj,-2ji>2jj,14r4>-1e7l,1e7m>-1e7l,1e7m>-1e5c,1e5d>-1e5b,1e5c>-14qx,14qy>-14qx,14vn>-1ecg,1ech>-1ecg,1edu>-1ecg,1eci>-1ecg,1eda>-1ecg,1eci>-1ecg,1eci>-168q,168r>-168q,168s>-14ye,14yf>-14ye"};function m(he,ye){var we=36,se=0,W=new Map,K=ye&&new Map,ie;return he.split(",").forEach(function me(We){if(We.indexOf("+")!==-1)for(var Ce=+We;Ce--;)me(ie);else{ie=We;var Ae=We.split(">"),Y=Ae[0],ce=Ae[1];Y=String.fromCodePoint(se+=parseInt(Y,we)),ce=String.fromCodePoint(se+=parseInt(ce,we)),W.set(Y,ce),ye&&K.set(ce,Y)}}),{map:W,reverseMap:K}}var v,g,b;function y(){if(!v){var he=m(p.pairs,!0),ye=he.map,we=he.reverseMap;v=ye,g=we,b=m(p.canonical,!1).map}}function x(he){return y(),v.get(he)||null}function T(he){return y(),g.get(he)||null}function M(he){return y(),b.get(he)||null}var E=r.L,S=r.R,P=r.EN,R=r.ES,V=r.ET,z=r.AN,k=r.CS,N=r.B,q=r.S,L=r.ON,A=r.BN,J=r.NSM,F=r.AL,ne=r.LRO,j=r.RLO,Z=r.LRE,_=r.RLE,le=r.PDF,fe=r.LRI,te=r.RLI,$=r.FSI,oe=r.PDI;function ge(he,ye){for(var we=125,se=new Uint32Array(he.length),W=0;W0)Fe--;else if(Ze>0){for(je=0;!Pe[Pe.length-1]._isolate;)Pe.pop();var Tr=Pe[Pe.length-1]._isolInitIndex;Tr!=null&&(We.set(Tr,Re),We.set(Re,Tr)),Pe.pop(),Ze--}Ve=Pe[Pe.length-1],me[Re]=Ve._level,Ve._override&&ie(Re,Ve._override)}else Me&le?(Fe===0&&(je>0?je--:!Ve._isolate&&Pe.length>1&&(Pe.pop(),Ve=Pe[Pe.length-1])),me[Re]=Ve._level):Me&N&&(me[Re]=Ae.level);else me[Re]=Ve._level,Ve._override&&Me!==A&&ie(Re,Ve._override)}for(var Fr=[],zr=null,sr=Ae.start;sr<=Ae.end;sr++){var go=se[sr];if(!(go&l)){var $n=me[sr],wr=go&s,ar=go===oe;zr&&$n===zr._level?(zr._end=sr,zr._endsWithIsolInit=wr):Fr.push(zr={_start:sr,_end:sr,_level:$n,_startsWithPDI:ar,_endsWithIsolInit:wr})}}for(var Bi=[],ee=0;ee=0;Le--)if(!(se[Le]&l)){Ee=me[Le];break}var De=Pt[Pt.length-1],it=me[De],ot=Ae.level;if(!(se[De]&s)){for(var ct=De+1;ct<=Ae.end;ct++)if(!(se[ct]&l)){ot=me[ct];break}}Bi.push({_seqIndices:Pt,_sosType:Math.max(Ee,ae)%2?S:E,_eosType:Math.max(ot,it)%2?S:E})}}for(var $e=0;$e=0;Cn--)if(!(se[Qe[Cn]]&l)){Ut=se[Qe[Cn]];break}ie(wt,Ut&(s|oe)?L:Ut)}}if(K.get(P))for(var Zn=0;Zn=-1;Jn--){var vn=Jn===-1?dt:se[Qe[Jn]];if(vn&a){vn===F&&ie(fr,z);break}}}if(K.get(F))for(var Lr=0;Lr=0&&(qn=se[Qe[Rl]],!!(qn&l));Rl--);for(var ha=Xr+1;ha=0&&se[Qe[hd]]&(V|l);hd--)ie(Qe[hd],P);for(Si++;Si=0&&se[Qe[hr]]&l;hr--)ie(Qe[hr],L);for(var pd=$u+1;pd=0;Hf--){var D0=Bf[Hf].char;if(D0===iS||D0===T(M(bo))||x(M(D0))===bo){q0.push([Bf[Hf].seqIndex,Vl]),Bf.length=Hf;break}}}q0.sort(function(ds,yo){return ds[0]-yo[0]})}for(var ec=0;ec=0;A0--){var Qf=Qe[A0];if(se[Qf]&Lw){var _f=se[Qf]&ym?S:E;_f!==Xt?Yo=_f:Yo=Xt;break}}}if(Yo){if(se[Qe[W0]]=se[Qe[sS]]=Yo,Yo!==Xt){for(var $f=W0+1;$f=0;eh--)if(se[Qe[eh]]&l)Cw=eh;else{G0=se[Qe[eh]]&ym?S:E;break}for(var lS=zt,tc=or+1;tc=0&&f(he[nc])&u;nc--)me[nc]=Ae.level}}return{levels:me,paragraphs:Ce};function uS(ds,yo){for(var fs=ds;fs=me&&f(he[Ae])&u;Ae--)Ce[Ae]=ie.level;for(var Y=ie.level,ce=1/0,be=0;beY&&(Y=Se),Se=ce;Q--)for(var Pe=0;Pe=Q){for(var Ve=Pe;Pe+1=Q;)Pe++;Pe>Ve&&K.push([Ve+me,Pe+me])}}}),K}function de(he,ye,we,se){var W=Te(he,ye,we,se),K=[].concat(he);return W.forEach(function(ie,me){K[me]=(ye.levels[ie]&1?D(he[ie]):null)||he[ie]}),K.join("")}function Te(he,ye,we,se){for(var W=re(he,ye,we,se),K=[],ie=0;ie/gm;function n(r,i){let s=yn[i];return s?l4(s):r}return t.replace(e,n)}const Hs=[];for(let t=0;t<256;t++)Hs[t]=(t<16?"0":"")+t.toString(16);function Wvt(){const t=Math.random()*4294967295|0,e=Math.random()*4294967295|0,n=Math.random()*4294967295|0,r=Math.random()*4294967295|0;return(Hs[t&255]+Hs[t>>8&255]+Hs[t>>16&255]+Hs[t>>24&255]+"-"+Hs[e&255]+Hs[e>>8&255]+"-"+Hs[e>>16&15|64]+Hs[e>>24&255]+"-"+Hs[n&63|128]+Hs[n>>8&255]+"-"+Hs[n>>16&255]+Hs[n>>24&255]+Hs[r&255]+Hs[r>>8&255]+Hs[r>>16&255]+Hs[r>>24&255]).toUpperCase()}const Fm=Object.assign||function(){let t=arguments[0];for(let e=1,n=arguments.length;e/gm,` //!BEGIN_POST_CHUNK $1 $& //!END_POST_CHUNK @@ -3580,26 +3580,26 @@ troika_normal_${i} = vec3(normal); troika_uv_${i} = vec2(uv); troikaVertexTransform${i}(troika_position_${i}, troika_normal_${i}, troika_uv_${i}); ${a} -`,e=e.replace(/\b(position|normal|uv)\b/g,(m,v,g,b)=>/\battribute\s+vec[23]\s+$/.test(b.substr(0,g))?v:`troika_${v}_${i}`),t.map&&t.map.channel>0||(e=e.replace(/\bMAP_UV\b/g,`troika_uv_${i}`))),e=r$(e,i,s,a,o),n=r$(n,i,u,c,d),{vertexShader:e,fragmentShader:n}}function r$(t,e,n,r,i){return(r||i||n)&&(t=t.replace(l0e,` +`,e=e.replace(/\b(position|normal|uv)\b/g,(m,v,g,b)=>/\battribute\s+vec[23]\s+$/.test(b.substr(0,g))?v:`troika_${v}_${i}`),t.map&&t.map.channel>0||(e=e.replace(/\bMAP_UV\b/g,`troika_uv_${i}`))),e=t$(e,i,s,a,o),n=t$(n,i,u,c,d),{vertexShader:e,fragmentShader:n}}function t$(t,e,n,r,i){return(r||i||n)&&(t=t.replace(o0e,` ${n} void troikaOrigMain${e}() {`),t+=` void main() { ${r} troikaOrigMain${e}(); ${i} -}`),t}function Fvt(t,e){return t==="uniforms"?void 0:typeof e=="function"?e.toString():e}let jvt=0;const i$=new Map;function Zvt(t){const e=JSON.stringify(t,Fvt);let n=i$.get(e);return n==null&&i$.set(e,n=++jvt),n}function Jvt(t,e,n){const{defaultFontURL:r}=n,i=Object.create(null),s=1/0,a=/[\u00AD\u034F\u061C\u115F-\u1160\u17B4-\u17B5\u180B-\u180E\u200B-\u200F\u202A-\u202E\u2060-\u206F\u3164\uFE00-\uFE0F\uFEFF\uFFA0\uFFF0-\uFFF8]/,o="[^\\S\\u00A0]",l=new RegExp(`${o}|[\\-\\u007C\\u00AD\\u2010\\u2012-\\u2014\\u2027\\u2056\\u2E17\\u2E40]`);function u(b,y){function x(){const T=M=>{console.error(`Failure loading font ${b}${b===r?"":"; trying fallback"}`,M),b!==r&&(b=r,x())};try{const M=new XMLHttpRequest;M.open("get",b,!0),M.responseType="arraybuffer",M.onload=function(){if(M.status>=400)T(new Error(M.statusText));else if(M.status>0)try{const E=t(M.response);y(E)}catch(E){T(E)}},M.onerror=T,M.send()}catch(M){T(M)}}x()}function c(b,y){b||(b=r);let x=i[b];x?x.pending?x.pending.push(y):y(x):(i[b]={pending:[y]},u(b,T=>{let M=i[b].pending;i[b]=T,M.forEach(E=>E(T))}))}function d({text:b="",font:y=r,sdfGlyphSize:x=64,fontSize:T=1,letterSpacing:M=0,lineHeight:E="normal",maxWidth:S=s,direction:P,textAlign:R="left",textIndent:V=0,whiteSpace:z="normal",overflowWrap:k="normal",anchorX:N=0,anchorY:q=0,includeCaretPositions:L=!1,chunkedBoundsSize:A=8192,colorRanges:Z=null},j,ne=!1){const G=m(),B={fontLoad:0,typesetting:0};b.indexOf("\r")>-1&&(console.info("Typesetter: got text with \\r chars; normalizing to \\n"),b=b.replace(/\r\n/g,` +}`),t}function jvt(t,e){return t==="uniforms"?void 0:typeof e=="function"?e.toString():e}let Zvt=0;const n$=new Map;function Jvt(t){const e=JSON.stringify(t,jvt);let n=n$.get(e);return n==null&&n$.set(e,n=++Zvt),n}function Yvt(t,e,n){const{defaultFontURL:r}=n,i=Object.create(null),s=1/0,a=/[\u00AD\u034F\u061C\u115F-\u1160\u17B4-\u17B5\u180B-\u180E\u200B-\u200F\u202A-\u202E\u2060-\u206F\u3164\uFE00-\uFE0F\uFEFF\uFFA0\uFFF0-\uFFF8]/,o="[^\\S\\u00A0]",l=new RegExp(`${o}|[\\-\\u007C\\u00AD\\u2010\\u2012-\\u2014\\u2027\\u2056\\u2E17\\u2E40]`);function u(b,y){function x(){const T=M=>{console.error(`Failure loading font ${b}${b===r?"":"; trying fallback"}`,M),b!==r&&(b=r,x())};try{const M=new XMLHttpRequest;M.open("get",b,!0),M.responseType="arraybuffer",M.onload=function(){if(M.status>=400)T(new Error(M.statusText));else if(M.status>0)try{const E=t(M.response);y(E)}catch(E){T(E)}},M.onerror=T,M.send()}catch(M){T(M)}}x()}function c(b,y){b||(b=r);let x=i[b];x?x.pending?x.pending.push(y):y(x):(i[b]={pending:[y]},u(b,T=>{let M=i[b].pending;i[b]=T,M.forEach(E=>E(T))}))}function d({text:b="",font:y=r,sdfGlyphSize:x=64,fontSize:T=1,letterSpacing:M=0,lineHeight:E="normal",maxWidth:S=s,direction:P,textAlign:R="left",textIndent:V=0,whiteSpace:z="normal",overflowWrap:k="normal",anchorX:N=0,anchorY:q=0,includeCaretPositions:L=!1,chunkedBoundsSize:A=8192,colorRanges:J=null},F,ne=!1){const j=m(),Z={fontLoad:0,typesetting:0};b.indexOf("\r")>-1&&(console.info("Typesetter: got text with \\r chars; normalizing to \\n"),b=b.replace(/\r\n/g,` `).replace(/\r/g,` -`)),T=+T,M=+M,S=+S,E=E||"normal",V=+V,c(y,ee=>{const ce=isFinite(S);let fe=null,te=null,_=null,oe=null,ye=null,ve=null,Ke=null,le=0,D=0,F=z!=="nowrap";const{ascender:re,descender:de,unitsPerEm:Te,lineGap:he,capHeight:be,xHeight:we}=ee;B.fontLoad=m()-G;const se=m(),W=T/Te;E==="normal"&&(E=(re-de+he)/Te),E=E*T;const K=(E-(re-de)*W)/2,ie=-(re*W+K),me=Math.min(E,(re-de)*W),We=(re+de)/2*W-me/2;let Ce=V,Ae=new v;const J=[Ae];ee.forEachGlyph(b,T,M,(Se,Q,Pe)=>{const Ve=b.charAt(Pe),Fe=Se.advanceWidth*W,je=Ae.count;let Ze;if("isEmpty"in Se||(Se.isWhitespace=!!Ve&&new RegExp(o).test(Ve),Se.canBreakAfter=!!Ve&&l.test(Ve),Se.isEmpty=Se.xMin===Se.xMax||Se.yMin===Se.yMax||a.test(Ve)),!Se.isWhitespace&&!Se.isEmpty&&D++,F&&ce&&!Se.isWhitespace&&Q+Fe+Ce>S&&je){if(Ae.glyphAt(je-1).glyphObj.canBreakAfter)Ze=new v,Ce=-Q;else for(let Me=je;Me--;)if(Me===0&&k==="break-word"){Ze=new v,Ce=-Q;break}else if(Ae.glyphAt(Me).glyphObj.canBreakAfter){Ze=Ae.splitAt(Me+1);const lt=Ze.glyphAt(0).x;Ce-=lt;for(let vt=Ze.count;vt--;)Ze.glyphAt(vt).x-=lt;break}Ze&&(Ae.isSoftWrapped=!0,Ae=Ze,J.push(Ae),le=S)}let Re=Ae.glyphAt(Ae.count);Re.glyphObj=Se,Re.x=Q+Ce,Re.width=Fe,Re.charIndex=Pe,Ve===` -`&&(Ae=new v,J.push(Ae),Ce=-(Q+Fe+M*T)+V)}),J.forEach(Se=>{for(let Q=Se.count;Q--;){let{glyphObj:Pe,x:Ve,width:Fe}=Se.glyphAt(Q);if(!Pe.isWhitespace){Se.width=Ve+Fe,Se.width>le&&(le=Se.width);return}}});let ue=0,ge=0;if(N&&(typeof N=="number"?ue=-N:typeof N=="string"&&(ue=-le*(N==="left"?0:N==="center"?.5:N==="right"?1:h(N)))),q){if(typeof q=="number")ge=-q;else if(typeof q=="string"){let Se=J.length*E;ge=q==="top"?0:q==="top-baseline"?-ie:q==="top-cap"?-ie-be*W:q==="top-ex"?-ie-we*W:q==="middle"?Se/2:q==="bottom"?Se:q==="bottom-baseline"?Se-K+de*W:h(q)*Se}}if(!ne){const Se=e.getEmbeddingLevels(b,P);fe=new Uint16Array(D),te=new Float32Array(D*2),_={},ve=[s,s,-s,-s],Ke=[];let Q=ie;L&&(ye=new Float32Array(b.length*3)),Z&&(oe=new Uint8Array(D*3));let Pe=0,Ve=-1,Fe=-1,je,Ze;if(J.forEach((Re,Me)=>{let{count:lt,width:vt}=Re;if(lt>0){let bn=0;for(let $n=lt;$n--&&Re.glyphAt($n).glyphObj.isWhitespace;)bn++;let Tr=0,Fr=0;if(R==="center")Tr=(le-vt)/2;else if(R==="right")Tr=le-vt;else if(R==="justify"&&Re.isSoftWrapped){let $n=0;for(let wr=lt-bn;wr--;)Re.glyphAt(wr).glyphObj.isWhitespace&&$n++;Fr=(le-vt)/$n}if(Fr||Tr){let $n=0;for(let wr=0;wr=wr){let Ge=Ie,qe=Ie;for(;qear)break;qesr=$n;for(let $n=0;$n1&&p(ye,Ve,qe),Ve=$}if(Z){const{charIndex:$}=wr;for(;$>Fe;)Fe++,Z.hasOwnProperty(Fe)&&(Ze=Z[Fe])}if(!sr.isWhitespace&&!sr.isEmpty){const $=Pe++;_[ar]||(_[ar]={path:sr.path,pathBounds:[sr.xMin,sr.yMin,sr.xMax,sr.yMax]});const Ie=wr.x+ue,Ge=Q+ge;te[$*2]=Ie,te[$*2+1]=Ge;const qe=Ie+sr.xMin*W,Ue=Ge+sr.yMin*W,Pt=Ie+sr.xMax*W,Dt=Ge+sr.yMax*W;qeve[2]&&(ve[2]=Pt),Dt>ve[3]&&(ve[3]=Dt),$%A===0&&(je={start:$,end:$,rect:[s,s,-s,-s]},Ke.push(je)),je.end++;const C=je.rect;if(qeC[2]&&(C[2]=Pt),Dt>C[3]&&(C[3]=Dt),fe[$]=ar,Z){const Y=$*3;oe[Y]=Ze>>16&255,oe[Y+1]=Ze>>8&255,oe[Y+2]=Ze&255}}}}Q-=E}),ye){const Re=b.length-Ve;Re>1&&p(ye,Ve,Re)}}B.typesetting=m()-se,j({glyphIds:fe,glyphPositions:te,glyphData:_,caretPositions:ye,caretHeight:me,glyphColors:oe,chunkedBounds:Ke,fontSize:T,unitsPerEm:Te,ascender:re*W,descender:de*W,capHeight:be*W,xHeight:we*W,lineHeight:E,topBaseline:ie,blockBounds:[ue,ge-J.length*E,ue+le,ge],visibleBounds:ve,timings:B})})}function f(b,y){d(b,x=>{const[T,M,E,S]=x.blockBounds;y({width:E-T,height:S-M})},{metricsOnly:!0})}function h(b){let y=b.match(/^([\d.]+)%$/),x=y?parseFloat(y[1]):NaN;return isNaN(x)?0:x/100}function p(b,y,x){const T=b[y*3],M=b[y*3+1],E=b[y*3+2],S=(M-T)/x;for(let P=0;P(Object.defineProperty(b,y,{get(){return this.data[this.index*g.length+x]},set(M){this.data[this.index*g.length+x]=M}}),b),{data:null,index:0}),{typeset:d,measure:f,loadFont:c}}const kv=()=>(self.performance||Date).now(),k9=o0e();let s$;function Yvt(t,e,n,r,i,s,a,o,l,u,c=!0){return c?Hvt(t,e,n,r,i,s,a,o,l,u).then(null,d=>(s$||(console.warn("WebGL SDF generation failed, falling back to JS",d),s$=!0),o$(t,e,n,r,i,s,a,o,l,u))):o$(t,e,n,r,i,s,a,o,l,u)}const J7=[],Bvt=5;let c4=0;function u0e(){const t=kv();for(;J7.length&&kv()-tnew Promise((e,n)=>{J7.push(()=>{const r=kv();try{k9.webgl.generateIntoCanvas(...t),e({timing:kv()-r})}catch(i){n(i)}}),c4||(c4=setTimeout(u0e,0))}),Qvt=4,_vt=2e3,a$={};let $vt=0;function o$(t,e,n,r,i,s,a,o,l,u){const c="TroikaTextSDFGenerator_JS_"+$vt++%Qvt;let d=a$[c];return d||(d=a$[c]={workerModule:nw({name:c,workerId:c,dependencies:[o0e,kv],init(f,h){const p=f().javascript.generate;return function(...m){const v=h();return{textureData:p(...m),timing:h()-v}}},getTransferables(f){return[f.textureData.buffer]}}),requests:0,idleTimer:null}),d.requests++,clearTimeout(d.idleTimer),d.workerModule(t,e,n,r,i,s).then(({textureData:f,timing:h})=>{const p=kv(),m=new Uint8Array(f.length*4);for(let v=0;v{Cvt(c)},_vt)),{timing:h}})}function e0t(t){t._warm||(k9.webgl.isSupported(t),t._warm=!0)}const t0t=k9.webglUtils.resizeWebGLCanvasWithoutClearing;/*! +`)),T=+T,M=+M,S=+S,E=E||"normal",V=+V,c(y,_=>{const le=isFinite(S);let fe=null,te=null,$=null,oe=null,ge=null,ve=null,Ke=null,ue=0,D=0,G=z!=="nowrap";const{ascender:re,descender:de,unitsPerEm:Te,lineGap:he,capHeight:ye,xHeight:we}=_;Z.fontLoad=m()-j;const se=m(),W=T/Te;E==="normal"&&(E=(re-de+he)/Te),E=E*T;const K=(E-(re-de)*W)/2,ie=-(re*W+K),me=Math.min(E,(re-de)*W),We=(re+de)/2*W-me/2;let Ce=V,Ae=new v;const Y=[Ae];_.forEachGlyph(b,T,M,(Se,Q,Pe)=>{const Ve=b.charAt(Pe),Fe=Se.advanceWidth*W,je=Ae.count;let Ze;if("isEmpty"in Se||(Se.isWhitespace=!!Ve&&new RegExp(o).test(Ve),Se.canBreakAfter=!!Ve&&l.test(Ve),Se.isEmpty=Se.xMin===Se.xMax||Se.yMin===Se.yMax||a.test(Ve)),!Se.isWhitespace&&!Se.isEmpty&&D++,G&&le&&!Se.isWhitespace&&Q+Fe+Ce>S&&je){if(Ae.glyphAt(je-1).glyphObj.canBreakAfter)Ze=new v,Ce=-Q;else for(let Me=je;Me--;)if(Me===0&&k==="break-word"){Ze=new v,Ce=-Q;break}else if(Ae.glyphAt(Me).glyphObj.canBreakAfter){Ze=Ae.splitAt(Me+1);const lt=Ze.glyphAt(0).x;Ce-=lt;for(let vt=Ze.count;vt--;)Ze.glyphAt(vt).x-=lt;break}Ze&&(Ae.isSoftWrapped=!0,Ae=Ze,Y.push(Ae),ue=S)}let Re=Ae.glyphAt(Ae.count);Re.glyphObj=Se,Re.x=Q+Ce,Re.width=Fe,Re.charIndex=Pe,Ve===` +`&&(Ae=new v,Y.push(Ae),Ce=-(Q+Fe+M*T)+V)}),Y.forEach(Se=>{for(let Q=Se.count;Q--;){let{glyphObj:Pe,x:Ve,width:Fe}=Se.glyphAt(Q);if(!Pe.isWhitespace){Se.width=Ve+Fe,Se.width>ue&&(ue=Se.width);return}}});let ce=0,be=0;if(N&&(typeof N=="number"?ce=-N:typeof N=="string"&&(ce=-ue*(N==="left"?0:N==="center"?.5:N==="right"?1:h(N)))),q){if(typeof q=="number")be=-q;else if(typeof q=="string"){let Se=Y.length*E;be=q==="top"?0:q==="top-baseline"?-ie:q==="top-cap"?-ie-ye*W:q==="top-ex"?-ie-we*W:q==="middle"?Se/2:q==="bottom"?Se:q==="bottom-baseline"?Se-K+de*W:h(q)*Se}}if(!ne){const Se=e.getEmbeddingLevels(b,P);fe=new Uint16Array(D),te=new Float32Array(D*2),$={},ve=[s,s,-s,-s],Ke=[];let Q=ie;L&&(ge=new Float32Array(b.length*3)),J&&(oe=new Uint8Array(D*3));let Pe=0,Ve=-1,Fe=-1,je,Ze;if(Y.forEach((Re,Me)=>{let{count:lt,width:vt}=Re;if(lt>0){let bn=0;for(let $n=lt;$n--&&Re.glyphAt($n).glyphObj.isWhitespace;)bn++;let Tr=0,Fr=0;if(R==="center")Tr=(ue-vt)/2;else if(R==="right")Tr=ue-vt;else if(R==="justify"&&Re.isSoftWrapped){let $n=0;for(let wr=lt-bn;wr--;)Re.glyphAt(wr).glyphObj.isWhitespace&&$n++;Fr=(ue-vt)/$n}if(Fr||Tr){let $n=0;for(let wr=0;wr=wr){let Ge=Ie,qe=Ie;for(;qear)break;qesr=$n;for(let $n=0;$n1&&p(ge,Ve,qe),Ve=ee}if(J){const{charIndex:ee}=wr;for(;ee>Fe;)Fe++,J.hasOwnProperty(Fe)&&(Ze=J[Fe])}if(!sr.isWhitespace&&!sr.isEmpty){const ee=Pe++;$[ar]||($[ar]={path:sr.path,pathBounds:[sr.xMin,sr.yMin,sr.xMax,sr.yMax]});const Ie=wr.x+ce,Ge=Q+be;te[ee*2]=Ie,te[ee*2+1]=Ge;const qe=Ie+sr.xMin*W,Ue=Ge+sr.yMin*W,Pt=Ie+sr.xMax*W,Dt=Ge+sr.yMax*W;qeve[2]&&(ve[2]=Pt),Dt>ve[3]&&(ve[3]=Dt),ee%A===0&&(je={start:ee,end:ee,rect:[s,s,-s,-s]},Ke.push(je)),je.end++;const C=je.rect;if(qeC[2]&&(C[2]=Pt),Dt>C[3]&&(C[3]=Dt),fe[ee]=ar,J){const B=ee*3;oe[B]=Ze>>16&255,oe[B+1]=Ze>>8&255,oe[B+2]=Ze&255}}}}Q-=E}),ge){const Re=b.length-Ve;Re>1&&p(ge,Ve,Re)}}Z.typesetting=m()-se,F({glyphIds:fe,glyphPositions:te,glyphData:$,caretPositions:ge,caretHeight:me,glyphColors:oe,chunkedBounds:Ke,fontSize:T,unitsPerEm:Te,ascender:re*W,descender:de*W,capHeight:ye*W,xHeight:we*W,lineHeight:E,topBaseline:ie,blockBounds:[ce,be-Y.length*E,ce+ue,be],visibleBounds:ve,timings:Z})})}function f(b,y){d(b,x=>{const[T,M,E,S]=x.blockBounds;y({width:E-T,height:S-M})},{metricsOnly:!0})}function h(b){let y=b.match(/^([\d.]+)%$/),x=y?parseFloat(y[1]):NaN;return isNaN(x)?0:x/100}function p(b,y,x){const T=b[y*3],M=b[y*3+1],E=b[y*3+2],S=(M-T)/x;for(let P=0;P(Object.defineProperty(b,y,{get(){return this.data[this.index*g.length+x]},set(M){this.data[this.index*g.length+x]=M}}),b),{data:null,index:0}),{typeset:d,measure:f,loadFont:c}}const kv=()=>(self.performance||Date).now(),k9=a0e();let r$;function Bvt(t,e,n,r,i,s,a,o,l,u,c=!0){return c?Qvt(t,e,n,r,i,s,a,o,l,u).then(null,d=>(r$||(console.warn("WebGL SDF generation failed, falling back to JS",d),r$=!0),s$(t,e,n,r,i,s,a,o,l,u))):s$(t,e,n,r,i,s,a,o,l,u)}const J7=[],Hvt=5;let c4=0;function l0e(){const t=kv();for(;J7.length&&kv()-tnew Promise((e,n)=>{J7.push(()=>{const r=kv();try{k9.webgl.generateIntoCanvas(...t),e({timing:kv()-r})}catch(i){n(i)}}),c4||(c4=setTimeout(l0e,0))}),_vt=4,$vt=2e3,i$={};let e0t=0;function s$(t,e,n,r,i,s,a,o,l,u){const c="TroikaTextSDFGenerator_JS_"+e0t++%_vt;let d=i$[c];return d||(d=i$[c]={workerModule:nw({name:c,workerId:c,dependencies:[a0e,kv],init(f,h){const p=f().javascript.generate;return function(...m){const v=h();return{textureData:p(...m),timing:h()-v}}},getTransferables(f){return[f.textureData.buffer]}}),requests:0,idleTimer:null}),d.requests++,clearTimeout(d.idleTimer),d.workerModule(t,e,n,r,i,s).then(({textureData:f,timing:h})=>{const p=kv(),m=new Uint8Array(f.length*4);for(let v=0;v{Kvt(c)},$vt)),{timing:h}})}function t0t(t){t._warm||(k9.webgl.isSupported(t),t._warm=!0)}const n0t=k9.webglUtils.resizeWebGLCanvasWithoutClearing;/*! Custom build of Typr.ts (https://github.com/fredli74/Typr.ts) for use in Troika text rendering. Original MIT license applies: https://github.com/fredli74/Typr.ts/blob/master/LICENSE -*/function n0t(){return typeof window>"u"&&(self.window=self),function(t){var e={parse:function(i){var s=e._bin,a=new Uint8Array(i);if(s.readASCII(a,0,4)=="ttcf"){var o=4;s.readUshort(a,o),o+=2,s.readUshort(a,o),o+=2;var l=s.readUint(a,o);o+=4;for(var u=[],c=0;c>>a&1&&s++;return s},e._lctf.readClassDef=function(i,s){var a=e._bin,o=[],l=a.readUshort(i,s);if(s+=2,l==1){var u=a.readUshort(i,s);s+=2;var c=a.readUshort(i,s);s+=2;for(var d=0;d0&&(l.featureParams=o+u);var c=a.readUshort(i,s);s+=2,l.tab=[];for(var d=0;d255?-1:e.CFF.glyphByUnicode(i,e.CFF.tableSE[s])},e.CFF.readEncoding=function(i,s,a){e._bin;var o=[".notdef"],l=i[s];if(s++,l!=0)throw"error: unknown encoding format: "+l;var u=i[s];s++;for(var c=0;c>4,b=15&v;if(g!=15&&m.push(g),b!=15&&m.push(b),b==15)break}for(var y="",x=[0,1,2,3,4,5,6,7,8,9,".","e","e-","reserved","-","endOfNumber"],T=0;T=u.xMax||u.yMin>=u.yMax)return null;if(u.noc>0){u.endPts=[];for(var c=0;c=1&&c.fmt<=2){f=l.readUshort(i,a),a+=2;var p=l.readUshort(i,a);a+=2,h=e._lctf.numOfOnes(f);var m=e._lctf.numOfOnes(p);if(c.fmt==1){c.pairsets=[];var v=l.readUshort(i,a);a+=2;for(var g=0;g=1&&c.fmt<=2){if(c.fmt==1)c.delta=l.readShort(i,a),a+=2;else if(c.fmt==2){var f=l.readUshort(i,a);a+=2,c.newg=l.readUshorts(i,a,f),a+=2*c.newg.length}}else if(s==4){c.vals=[],f=l.readUshort(i,a),a+=2;for(var h=0;h>>8;if((p&=15)!=0)throw"unknown kern table format: "+p;s=e.kern.readFormat0(i,s,d)}return d},e.kern.parseV1=function(i,s,a,o){var l=e._bin;l.readFixed(i,s),s+=4;var u=l.readUint(i,s);s+=4;for(var c={glyph1:[],rval:[]},d=0;d>>8;if((h&=15)!=0)throw"unknown kern table format: "+h;s=e.kern.readFormat0(i,s,c)}return c},e.kern.readFormat0=function(i,s,a){var o=e._bin,l=-1,u=o.readUshort(i,s);s+=2,o.readUshort(i,s),s+=2,o.readUshort(i,s),s+=2,o.readUshort(i,s),s+=2;for(var c=0;c=l.map.length?0:l.map[s];if(l.format==4){for(var u=-1,c=0;cs?0:65535&(l.idRangeOffset[u]!=0?l.glyphIdArray[s-l.startCount[u]+(l.idRangeOffset[u]>>1)-(l.idRangeOffset.length-u)]:s+l.idDelta[u])}if(l.format==12){if(s>l.groups[l.groups.length-1][1])return 0;for(c=0;c-1?e.U._simpleGlyph(o,a):e.U._compoGlyph(o,s,a))},e.U._simpleGlyph=function(i,s){for(var a=0;al)){for(var v=!0,g=0,b=0;bl)){for(v=!0,b=0;b>1,u.length=0,d=!0;else if(z=="o3"||z=="o23")u.length%2!=0&&!d&&(f=u.shift()+o.nominalWidthX),c+=u.length>>1,u.length=0,d=!0;else if(z=="o4")u.length>1&&!d&&(f=u.shift()+o.nominalWidthX,d=!0),h&&e.U.P.closePath(l),v+=u.pop(),e.U.P.moveTo(l,m,v),h=!0;else if(z=="o5")for(;u.length>0;)m+=u.shift(),v+=u.shift(),e.U.P.lineTo(l,m,v);else if(z=="o6"||z=="o7")for(var k=u.length,N=z=="o6",q=0;qMath.abs(S-v)?m=E+u.shift():v=S+u.shift(),e.U.P.curveTo(l,g,b,y,x,P,R),e.U.P.curveTo(l,T,M,E,S,m,v));else if(z=="o14"){if(u.length>0&&!d&&(f=u.shift()+a.nominalWidthX,d=!0),u.length==4){var Z=u.shift(),j=u.shift(),ne=u.shift(),G=u.shift(),B=e.CFF.glyphBySE(a,ne),ee=e.CFF.glyphBySE(a,G);e.U._drawCFF(a.CharStrings[B],s,a,o,l),s.x=Z,s.y=j,e.U._drawCFF(a.CharStrings[ee],s,a,o,l)}h&&(e.U.P.closePath(l),h=!1)}else if(z=="o19"||z=="o20")u.length%2!=0&&!d&&(f=u.shift()+o.nominalWidthX),c+=u.length>>1,u.length=0,d=!0,p+=c+7>>3;else if(z=="o21")u.length>2&&!d&&(f=u.shift()+o.nominalWidthX,d=!0),v+=u.pop(),m+=u.pop(),h&&e.U.P.closePath(l),e.U.P.moveTo(l,m,v),h=!0;else if(z=="o22")u.length>1&&!d&&(f=u.shift()+o.nominalWidthX,d=!0),m+=u.pop(),h&&e.U.P.closePath(l),e.U.P.moveTo(l,m,v),h=!0;else if(z=="o25"){for(;u.length>6;)m+=u.shift(),v+=u.shift(),e.U.P.lineTo(l,m,v);g=m+u.shift(),b=v+u.shift(),y=g+u.shift(),x=b+u.shift(),m=y+u.shift(),v=x+u.shift(),e.U.P.curveTo(l,g,b,y,x,m,v)}else if(z=="o26")for(u.length%2&&(m+=u.shift());u.length>0;)g=m,b=v+u.shift(),m=y=g+u.shift(),v=(x=b+u.shift())+u.shift(),e.U.P.curveTo(l,g,b,y,x,m,v);else if(z=="o27")for(u.length%2&&(v+=u.shift());u.length>0;)b=v,y=(g=m+u.shift())+u.shift(),x=b+u.shift(),m=y+u.shift(),v=x,e.U.P.curveTo(l,g,b,y,x,m,v);else if(z=="o10"||z=="o29"){var ce=z=="o10"?o:a;if(u.length==0)console.debug("error: empty stack");else{var fe=u.pop(),te=ce.Subrs[fe+ce.Bias];s.x=m,s.y=v,s.nStems=c,s.haveWidth=d,s.width=f,s.open=h,e.U._drawCFF(te,s,a,o,l),m=s.x,v=s.y,c=s.nStems,d=s.haveWidth,f=s.width,h=s.open}}else if(z=="o30"||z=="o31"){var _=u.length,oe=(A=0,z=="o31");for(A+=_-(k=-3&_);A"u"&&(self.window=self),function(t){var e={parse:function(i){var s=e._bin,a=new Uint8Array(i);if(s.readASCII(a,0,4)=="ttcf"){var o=4;s.readUshort(a,o),o+=2,s.readUshort(a,o),o+=2;var l=s.readUint(a,o);o+=4;for(var u=[],c=0;c>>a&1&&s++;return s},e._lctf.readClassDef=function(i,s){var a=e._bin,o=[],l=a.readUshort(i,s);if(s+=2,l==1){var u=a.readUshort(i,s);s+=2;var c=a.readUshort(i,s);s+=2;for(var d=0;d0&&(l.featureParams=o+u);var c=a.readUshort(i,s);s+=2,l.tab=[];for(var d=0;d255?-1:e.CFF.glyphByUnicode(i,e.CFF.tableSE[s])},e.CFF.readEncoding=function(i,s,a){e._bin;var o=[".notdef"],l=i[s];if(s++,l!=0)throw"error: unknown encoding format: "+l;var u=i[s];s++;for(var c=0;c>4,b=15&v;if(g!=15&&m.push(g),b!=15&&m.push(b),b==15)break}for(var y="",x=[0,1,2,3,4,5,6,7,8,9,".","e","e-","reserved","-","endOfNumber"],T=0;T=u.xMax||u.yMin>=u.yMax)return null;if(u.noc>0){u.endPts=[];for(var c=0;c=1&&c.fmt<=2){f=l.readUshort(i,a),a+=2;var p=l.readUshort(i,a);a+=2,h=e._lctf.numOfOnes(f);var m=e._lctf.numOfOnes(p);if(c.fmt==1){c.pairsets=[];var v=l.readUshort(i,a);a+=2;for(var g=0;g=1&&c.fmt<=2){if(c.fmt==1)c.delta=l.readShort(i,a),a+=2;else if(c.fmt==2){var f=l.readUshort(i,a);a+=2,c.newg=l.readUshorts(i,a,f),a+=2*c.newg.length}}else if(s==4){c.vals=[],f=l.readUshort(i,a),a+=2;for(var h=0;h>>8;if((p&=15)!=0)throw"unknown kern table format: "+p;s=e.kern.readFormat0(i,s,d)}return d},e.kern.parseV1=function(i,s,a,o){var l=e._bin;l.readFixed(i,s),s+=4;var u=l.readUint(i,s);s+=4;for(var c={glyph1:[],rval:[]},d=0;d>>8;if((h&=15)!=0)throw"unknown kern table format: "+h;s=e.kern.readFormat0(i,s,c)}return c},e.kern.readFormat0=function(i,s,a){var o=e._bin,l=-1,u=o.readUshort(i,s);s+=2,o.readUshort(i,s),s+=2,o.readUshort(i,s),s+=2,o.readUshort(i,s),s+=2;for(var c=0;c=l.map.length?0:l.map[s];if(l.format==4){for(var u=-1,c=0;cs?0:65535&(l.idRangeOffset[u]!=0?l.glyphIdArray[s-l.startCount[u]+(l.idRangeOffset[u]>>1)-(l.idRangeOffset.length-u)]:s+l.idDelta[u])}if(l.format==12){if(s>l.groups[l.groups.length-1][1])return 0;for(c=0;c-1?e.U._simpleGlyph(o,a):e.U._compoGlyph(o,s,a))},e.U._simpleGlyph=function(i,s){for(var a=0;al)){for(var v=!0,g=0,b=0;bl)){for(v=!0,b=0;b>1,u.length=0,d=!0;else if(z=="o3"||z=="o23")u.length%2!=0&&!d&&(f=u.shift()+o.nominalWidthX),c+=u.length>>1,u.length=0,d=!0;else if(z=="o4")u.length>1&&!d&&(f=u.shift()+o.nominalWidthX,d=!0),h&&e.U.P.closePath(l),v+=u.pop(),e.U.P.moveTo(l,m,v),h=!0;else if(z=="o5")for(;u.length>0;)m+=u.shift(),v+=u.shift(),e.U.P.lineTo(l,m,v);else if(z=="o6"||z=="o7")for(var k=u.length,N=z=="o6",q=0;qMath.abs(S-v)?m=E+u.shift():v=S+u.shift(),e.U.P.curveTo(l,g,b,y,x,P,R),e.U.P.curveTo(l,T,M,E,S,m,v));else if(z=="o14"){if(u.length>0&&!d&&(f=u.shift()+a.nominalWidthX,d=!0),u.length==4){var J=u.shift(),F=u.shift(),ne=u.shift(),j=u.shift(),Z=e.CFF.glyphBySE(a,ne),_=e.CFF.glyphBySE(a,j);e.U._drawCFF(a.CharStrings[Z],s,a,o,l),s.x=J,s.y=F,e.U._drawCFF(a.CharStrings[_],s,a,o,l)}h&&(e.U.P.closePath(l),h=!1)}else if(z=="o19"||z=="o20")u.length%2!=0&&!d&&(f=u.shift()+o.nominalWidthX),c+=u.length>>1,u.length=0,d=!0,p+=c+7>>3;else if(z=="o21")u.length>2&&!d&&(f=u.shift()+o.nominalWidthX,d=!0),v+=u.pop(),m+=u.pop(),h&&e.U.P.closePath(l),e.U.P.moveTo(l,m,v),h=!0;else if(z=="o22")u.length>1&&!d&&(f=u.shift()+o.nominalWidthX,d=!0),m+=u.pop(),h&&e.U.P.closePath(l),e.U.P.moveTo(l,m,v),h=!0;else if(z=="o25"){for(;u.length>6;)m+=u.shift(),v+=u.shift(),e.U.P.lineTo(l,m,v);g=m+u.shift(),b=v+u.shift(),y=g+u.shift(),x=b+u.shift(),m=y+u.shift(),v=x+u.shift(),e.U.P.curveTo(l,g,b,y,x,m,v)}else if(z=="o26")for(u.length%2&&(m+=u.shift());u.length>0;)g=m,b=v+u.shift(),m=y=g+u.shift(),v=(x=b+u.shift())+u.shift(),e.U.P.curveTo(l,g,b,y,x,m,v);else if(z=="o27")for(u.length%2&&(v+=u.shift());u.length>0;)b=v,y=(g=m+u.shift())+u.shift(),x=b+u.shift(),m=y+u.shift(),v=x,e.U.P.curveTo(l,g,b,y,x,m,v);else if(z=="o10"||z=="o29"){var le=z=="o10"?o:a;if(u.length==0)console.debug("error: empty stack");else{var fe=u.pop(),te=le.Subrs[fe+le.Bias];s.x=m,s.y=v,s.nStems=c,s.haveWidth=d,s.width=f,s.open=h,e.U._drawCFF(te,s,a,o,l),m=s.x,v=s.y,c=s.nStems,d=s.haveWidth,f=s.width,h=s.open}}else if(z=="o30"||z=="o31"){var $=u.length,oe=(A=0,z=="o31");for(A+=$-(k=-3&$);A>>1|(21845&h)<<1;p=(61680&(p=(52428&p)>>>2|(13107&p)<<2))>>>4|(3855&p)<<4,f[h]=((65280&p)>>>8|(255&p)<<8)>>>1}var m=function(z,k,N){for(var q=z.length,L=0,A=new n(k);L>>ne]=G}else for(Z=new n(q),L=0;L>>15-z[L]);return Z},v=new e(288);for(h=0;h<144;++h)v[h]=8;for(h=144;h<256;++h)v[h]=9;for(h=256;h<280;++h)v[h]=7;for(h=280;h<288;++h)v[h]=8;var g=new e(32);for(h=0;h<32;++h)g[h]=5;var b=m(v,9,1),y=m(g,5,1),x=function(z){for(var k=z[0],N=1;Nk&&(k=z[N]);return k},T=function(z,k,N){var q=k/8|0;return(z[q]|z[q+1]<<8)>>(7&k)&N},M=function(z,k){var N=k/8|0;return(z[N]|z[N+1]<<8|z[N+2]<<16)>>(7&k)},E=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],S=function(z,k,N){var q=new Error(k||E[z]);if(q.code=z,Error.captureStackTrace&&Error.captureStackTrace(q,S),!N)throw q;return q},P=function(z,k,N){var q=z.length;if(!q||N&&!N.l&&q<5)return k||new e(0);var L=!k||N,A=!N||N.i;N||(N={}),k||(k=new e(3*q));var Z,j=function(Ve){var Fe=k.length;if(Ve>Fe){var je=new e(Math.max(2*Fe,Ve));je.set(k),k=je}},ne=N.f||0,G=N.p||0,B=N.b||0,ee=N.l,ce=N.d,fe=N.m,te=N.n,_=8*q;do{if(!ee){N.f=ne=T(z,G,1);var oe=T(z,G+1,3);if(G+=3,!oe){var ye=z[(we=((Z=G)/8|0)+(7&Z&&1)+4)-4]|z[we-3]<<8,ve=we+ye;if(ve>q){A&&S(0);break}L&&j(B+ye),k.set(z.subarray(we,ve),B),N.b=B+=ye,N.p=G=8*ve;continue}if(oe==1)ee=b,ce=y,fe=9,te=5;else if(oe==2){var Ke=T(z,G,31)+257,le=T(z,G+10,15)+4,D=Ke+T(z,G+5,31)+1;G+=14;for(var F=new e(D),re=new e(19),de=0;de>>4)<16)F[de++]=we;else{var W=0,K=0;for(we==16?(K=3+T(z,G,3),G+=2,W=F[de-1]):we==17?(K=3+T(z,G,7),G+=3):we==18&&(K=11+T(z,G,127),G+=7);K--;)F[de++]=W}}var ie=F.subarray(0,Ke),me=F.subarray(Ke);fe=x(ie),te=x(me),ee=m(ie,fe,1),ce=m(me,te,1)}else S(1);if(G>_){A&&S(0);break}}L&&j(B+131072);for(var We=(1<>>4;if((G+=15&W)>_){A&&S(0);break}if(W||S(2),J<256)k[B++]=J;else{if(J==256){Ae=G,ee=null;break}var ue=J-254;if(J>264){var ge=i[de=J-257];ue=T(z,G,(1<>>4;if(Se||S(3),G+=15&Se,me=d[Q],Q>3&&(ge=s[Q],me+=M(z,G)&(1<_){A&&S(0);break}L&&j(B+131072);for(var Pe=B+ue;BVe.length)&&(je=Ve.length);var Ze=new(Ve instanceof n?n:Ve instanceof r?r:e)(je-Fe);return Ze.set(Ve.subarray(Fe,je)),Ze}(k,0,B)},R=new e(0),V=typeof TextDecoder<"u"&&new TextDecoder;try{V.decode(R,{stream:!0})}catch{}return t.convert_streams=function(z){var k=new DataView(z),N=0;function q(){var Ke=k.getUint16(N);return N+=2,Ke}function L(){var Ke=k.getUint32(N);return N+=4,Ke}function A(Ke){ye.setUint16(ve,Ke),ve+=2}function Z(Ke){ye.setUint32(ve,Ke),ve+=4}for(var j={signature:L(),flavor:L(),length:L(),numTables:q(),reserved:q(),totalSfntSize:L(),majorVersion:q(),minorVersion:q(),metaOffset:L(),metaLength:L(),metaOrigLength:L(),privOffset:L(),privLength:L()},ne=0;Math.pow(2,ne)<=j.numTables;)ne++;ne--;for(var G=16*Math.pow(2,ne),B=16*j.numTables-G,ee=12,ce=[],fe=0;fe{let[R,V]=P.split("+");R=parseInt(R,36),V=V?parseInt(V,36):0,c.set(S+=R,M[E]);for(let z=V;z--;)c.set(++S,M[E])})}}return c.get(T)||u}const f=1,h=2,p=3,m=4,v=[null,"isol","init","fina","medi"];function g(T){const M=new Uint8Array(T.length);let E=u,S=f,P=-1;for(let R=0;R65535&&R++)}return M}function b(T,M){const E=[];for(let P=0;P65535&&P++,E.push(t.U.codeToGlyph(T,R))}const S=T.GSUB;if(S){const{lookupList:P,featureList:R}=S;let V;const z=/^(rlig|liga|mset|isol|init|fina|medi|half|pres|blws)$/,k=[];R.forEach(N=>{if(z.test(N.tag))for(let q=0;q{if(G!==-1){let ee=M[G];if(!ee){const{cmds:ce,crds:fe}=t.U.glyphToPath(T,G);let te="",_=0;for(let le=0,D=ce.length;le1?",":"")+fe[_++]}let oe,ye,ve,Ke;if(fe.length){oe=ye=1/0,ve=Ke=-1/0;for(let le=0,D=fe.length;leve&&(ve=F),re>Ke&&(Ke=re)}}else oe=ve=ye=Ke=0;ee=M[G]={index:G,advanceWidth:T.hmtx.aWidth[G],xMin:oe,yMin:ye,xMax:ve,yMax:Ke,path:te,pathCommandCount:ce.length}}ne!==-1&&(L+=t.U.getPairAdjustment(T,ne,G)*A),q.call(null,ee,L,j),ee.advanceWidth&&(L+=ee.advanceWidth*A),N&&(L+=N*k),ne=G}j+=z.codePointAt(j)>65535?2:1}),L}};return V}return function(M){const E=new Uint8Array(M,0,4),S=t._bin.readASCII(E,0,4);if(S==="wOFF")M=e(M);else if(S==="wOF2")throw new Error("woff2 fonts not supported");return x(t.parse(M)[0])}}const s0t=nw({name:"Typr Font Parser",dependencies:[n0t,r0t,i0t],init(t,e,n){const r=t(),i=e();return n(r,i)}}),y1={defaultFontURL:"https://fonts.gstatic.com/s/roboto/v18/KFOmCnqEu92Fr1Mu4mxM.woff",sdfGlyphSize:64,sdfMargin:1/16,sdfExponent:9,textureWidth:2048},a0t=new tt;function Og(){return(self.performance||Date).now()}const l$=Object.create(null);function o0t(t,e){t=u0t({},t);const n=Og();if(t.font=c0t(t.font||y1.defaultFontURL),t.text=""+t.text,t.sdfGlyphSize=t.sdfGlyphSize||y1.sdfGlyphSize,t.colorRanges!=null){let d={};for(let f in t.colorRanges)if(t.colorRanges.hasOwnProperty(f)){let h=t.colorRanges[f];typeof h!="number"&&(h=a0t.set(h).getHex()),d[f]=h}t.colorRanges=d}Object.freeze(t);const{textureWidth:r,sdfExponent:i}=y1,{sdfGlyphSize:s}=t,a=r/s*4;let o=l$[s];if(!o){const d=document.createElement("canvas");d.width=r,d.height=s*256/a,o=l$[s]={glyphCount:0,sdfGlyphSize:s,sdfCanvas:d,sdfTexture:new Di(d,void 0,void 0,void 0,Hn,Hn),contextLost:!1,glyphsByFont:new Map},o.sdfTexture.generateMipmaps=!1,l0t(o)}const{sdfTexture:l,sdfCanvas:u}=o;let c=o.glyphsByFont.get(t.font);c||o.glyphsByFont.set(t.font,c=new Map),f0t(t).then(d=>{const{glyphIds:f,glyphPositions:h,fontSize:p,unitsPerEm:m,timings:v}=d,g=[],b=new Float32Array(f.length*4),y=p/m;let x=0,T=0;const M=Og();f.forEach((V,z)=>{let k=c.get(V);if(!k){const{path:A,pathBounds:Z}=d.glyphData[V],j=Math.max(Z[2]-Z[0],Z[3]-Z[1])/s*(y1.sdfMargin*s+.5),ne=o.glyphCount++,G=[Z[0]-j,Z[1]-j,Z[2]+j,Z[3]+j];c.set(V,k={path:A,atlasIndex:ne,sdfViewBox:G}),g.push(k)}const{sdfViewBox:N}=k,q=h[T++],L=h[T++];b[x++]=q+N[0]*y,b[x++]=L+N[1]*y,b[x++]=q+N[2]*y,b[x++]=L+N[3]*y,f[z]=k.atlasIndex}),v.quads=(v.quads||0)+(Og()-M);const E=Og();v.sdf={};const S=u.height,P=Math.ceil(o.glyphCount/a),R=Math.pow(2,Math.ceil(Math.log2(P*s)));R>S&&(console.info(`Increasing SDF texture size ${S}->${R}`),t0t(u,r,R),l.dispose()),Promise.all(g.map(V=>c0e(V,o,t.gpuAccelerateSDF).then(({timing:z})=>{v.sdf[V.atlasIndex]=z}))).then(()=>{g.length&&!o.contextLost&&(d0e(o),l.needsUpdate=!0),v.sdfTotal=Og()-E,v.total=Og()-n,e(Object.freeze({parameters:t,sdfTexture:l,sdfGlyphSize:s,sdfExponent:i,glyphBounds:b,glyphAtlasIndices:f,glyphColors:d.glyphColors,caretPositions:d.caretPositions,caretHeight:d.caretHeight,chunkedBounds:d.chunkedBounds,ascender:d.ascender,descender:d.descender,lineHeight:d.lineHeight,capHeight:d.capHeight,xHeight:d.xHeight,topBaseline:d.topBaseline,blockBounds:d.blockBounds,visibleBounds:d.visibleBounds,timings:d.timings}))})}),Promise.resolve().then(()=>{o.contextLost||e0t(u)})}function c0e({path:t,atlasIndex:e,sdfViewBox:n},{sdfGlyphSize:r,sdfCanvas:i,contextLost:s},a){if(s)return Promise.resolve({timing:-1});const{textureWidth:o,sdfExponent:l}=y1,u=Math.max(n[2]-n[0],n[3]-n[1]),c=Math.floor(e/4),d=c%(o/r)*r,f=Math.floor(c/(o/r))*r,h=e%4;return Yvt(r,r,t,n,u,l,i,d,f,h,a)}function l0t(t){const e=t.sdfCanvas;e.addEventListener("webglcontextlost",n=>{console.log("Context Lost",n),n.preventDefault(),t.contextLost=!0}),e.addEventListener("webglcontextrestored",n=>{console.log("Context Restored",n),t.contextLost=!1;const r=[];t.glyphsByFont.forEach(i=>{i.forEach(s=>{r.push(c0e(s,t,!0))})}),Promise.all(r).then(()=>{d0e(t),t.sdfTexture.needsUpdate=!0})})}function u0t(t,e){for(let n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}let iE;function c0t(t){return iE||(iE=typeof document>"u"?{}:document.createElement("a")),iE.href=t,iE.href}function d0e(t){if(typeof createImageBitmap!="function"){console.info("Safari<15: applying SDF canvas workaround");const{sdfCanvas:e,sdfTexture:n}=t,{width:r,height:i}=e,s=t.sdfCanvas.getContext("webgl");let a=n.image.data;(!a||a.length!==r*i*4)&&(a=new Uint8Array(r*i*4),n.image={width:r,height:i,data:a},n.flipY=!1,n.isDataTexture=!0),s.readPixels(0,0,r,i,s.RGBA,s.UNSIGNED_BYTE,a)}}const d0t=nw({name:"Typesetter",dependencies:[y1,s0t,Jvt,qvt],init(t,e,n,r){const{defaultFontURL:i}=t;return n(e,r(),{defaultFontURL:i})}}),f0t=nw({name:"Typesetter",dependencies:[d0t],init(t){return function(e){return new Promise(n=>{t.typeset(e,n)})}},getTransferables(t){const e=[t.glyphPositions.buffer,t.glyphIds.buffer];return t.caretPositions&&e.push(t.caretPositions.buffer),t.glyphColors&&e.push(t.glyphColors.buffer),e}}),u$={};function h0t(t){let e=u$[t];if(!e){const n=new ao(1,1,t,t),r=n.clone(),i=n.attributes,s=r.attributes,a=new Lt,o=i.uv.count;for(let l=0;l{a.setAttribute(l,new xt([...i[l].array,...s[l].array],i[l].itemSize))}),a.setIndex([...n.index.array,...r.index.array.map(l=>l+o)]),a.translate(.5,.5,0),e=u$[t]=a}return e}const p0t="aTroikaGlyphBounds",c$="aTroikaGlyphIndex",m0t="aTroikaGlyphColor";class v0t extends kT{constructor(){super(),this.detail=1,this.curveRadius=0,this.groups=[{start:0,count:1/0,materialIndex:0},{start:0,count:1/0,materialIndex:1}],this.boundingSphere=new so,this.boundingBox=new Jt}computeBoundingSphere(){}computeBoundingBox(){}setSide(e){const n=this.getIndex().count;this.setDrawRange(e===Ua?n/2:0,e===rn?n:n/2)}set detail(e){if(e!==this._detail){this._detail=e,(typeof e!="number"||e<1)&&(e=1);let n=h0t(e);["position","normal","uv"].forEach(r=>{this.attributes[r]=n.attributes[r].clone()}),this.setIndex(n.getIndex().clone())}}get detail(){return this._detail}set curveRadius(e){e!==this._curveRadius&&(this._curveRadius=e,this._updateBounds())}get curveRadius(){return this._curveRadius}updateGlyphs(e,n,r,i,s){jI(this,p0t,e,4),jI(this,c$,n,1),jI(this,m0t,s,3),this._blockBounds=r,this._chunkedBounds=i,this.instanceCount=n.length,this._updateBounds()}_updateBounds(){const e=this._blockBounds;if(e){const{curveRadius:n,boundingBox:r}=this;if(n){const{PI:i,floor:s,min:a,max:o,sin:l,cos:u}=Math,c=i/2,d=i*2,f=Math.abs(n),h=e[0]/f,p=e[2]/f,m=s((h+c)/d)!==s((p+c)/d)?-f:a(l(h)*f,l(p)*f),v=s((h-c)/d)!==s((p-c)/d)?f:o(l(h)*f,l(p)*f),g=s((h+i)/d)!==s((p+i)/d)?f*2:o(f-u(h)*f,f-u(p)*f);r.min.set(m,e[1],n<0?-g:0),r.max.set(v,e[3],n<0?0:g)}else r.min.set(e[0],e[1],0),r.max.set(e[2],e[3],0);r.getBoundingSphere(this.boundingSphere)}}applyClipRect(e){let n=this.getAttribute(c$).count,r=this._chunkedBounds;if(r)for(let i=r.length;i--;){n=r[i].end;let s=r[i].rect;if(s[1]e.y&&s[0]e.x)break}this.instanceCount=n}}function jI(t,e,n,r){const i=t.getAttribute(e);n?i&&i.array.length===n.length?(i.array.set(n),i.needsUpdate=!0):(t.setAttribute(e,new Lp(n,r)),delete t._maxInstanceCount,t.dispose()):i&&t.deleteAttribute(e)}const g0t=` +*/function i0t(){return function(t){var e=Uint8Array,n=Uint16Array,r=Uint32Array,i=new e([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),s=new e([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),a=new e([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),o=function(z,k){for(var N=new n(31),q=0;q<31;++q)N[q]=k+=1<>>1|(21845&h)<<1;p=(61680&(p=(52428&p)>>>2|(13107&p)<<2))>>>4|(3855&p)<<4,f[h]=((65280&p)>>>8|(255&p)<<8)>>>1}var m=function(z,k,N){for(var q=z.length,L=0,A=new n(k);L>>ne]=j}else for(J=new n(q),L=0;L>>15-z[L]);return J},v=new e(288);for(h=0;h<144;++h)v[h]=8;for(h=144;h<256;++h)v[h]=9;for(h=256;h<280;++h)v[h]=7;for(h=280;h<288;++h)v[h]=8;var g=new e(32);for(h=0;h<32;++h)g[h]=5;var b=m(v,9,1),y=m(g,5,1),x=function(z){for(var k=z[0],N=1;Nk&&(k=z[N]);return k},T=function(z,k,N){var q=k/8|0;return(z[q]|z[q+1]<<8)>>(7&k)&N},M=function(z,k){var N=k/8|0;return(z[N]|z[N+1]<<8|z[N+2]<<16)>>(7&k)},E=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],S=function(z,k,N){var q=new Error(k||E[z]);if(q.code=z,Error.captureStackTrace&&Error.captureStackTrace(q,S),!N)throw q;return q},P=function(z,k,N){var q=z.length;if(!q||N&&!N.l&&q<5)return k||new e(0);var L=!k||N,A=!N||N.i;N||(N={}),k||(k=new e(3*q));var J,F=function(Ve){var Fe=k.length;if(Ve>Fe){var je=new e(Math.max(2*Fe,Ve));je.set(k),k=je}},ne=N.f||0,j=N.p||0,Z=N.b||0,_=N.l,le=N.d,fe=N.m,te=N.n,$=8*q;do{if(!_){N.f=ne=T(z,j,1);var oe=T(z,j+1,3);if(j+=3,!oe){var ge=z[(we=((J=j)/8|0)+(7&J&&1)+4)-4]|z[we-3]<<8,ve=we+ge;if(ve>q){A&&S(0);break}L&&F(Z+ge),k.set(z.subarray(we,ve),Z),N.b=Z+=ge,N.p=j=8*ve;continue}if(oe==1)_=b,le=y,fe=9,te=5;else if(oe==2){var Ke=T(z,j,31)+257,ue=T(z,j+10,15)+4,D=Ke+T(z,j+5,31)+1;j+=14;for(var G=new e(D),re=new e(19),de=0;de>>4)<16)G[de++]=we;else{var W=0,K=0;for(we==16?(K=3+T(z,j,3),j+=2,W=G[de-1]):we==17?(K=3+T(z,j,7),j+=3):we==18&&(K=11+T(z,j,127),j+=7);K--;)G[de++]=W}}var ie=G.subarray(0,Ke),me=G.subarray(Ke);fe=x(ie),te=x(me),_=m(ie,fe,1),le=m(me,te,1)}else S(1);if(j>$){A&&S(0);break}}L&&F(Z+131072);for(var We=(1<>>4;if((j+=15&W)>$){A&&S(0);break}if(W||S(2),Y<256)k[Z++]=Y;else{if(Y==256){Ae=j,_=null;break}var ce=Y-254;if(Y>264){var be=i[de=Y-257];ce=T(z,j,(1<>>4;if(Se||S(3),j+=15&Se,me=d[Q],Q>3&&(be=s[Q],me+=M(z,j)&(1<$){A&&S(0);break}L&&F(Z+131072);for(var Pe=Z+ce;ZVe.length)&&(je=Ve.length);var Ze=new(Ve instanceof n?n:Ve instanceof r?r:e)(je-Fe);return Ze.set(Ve.subarray(Fe,je)),Ze}(k,0,Z)},R=new e(0),V=typeof TextDecoder<"u"&&new TextDecoder;try{V.decode(R,{stream:!0})}catch{}return t.convert_streams=function(z){var k=new DataView(z),N=0;function q(){var Ke=k.getUint16(N);return N+=2,Ke}function L(){var Ke=k.getUint32(N);return N+=4,Ke}function A(Ke){ge.setUint16(ve,Ke),ve+=2}function J(Ke){ge.setUint32(ve,Ke),ve+=4}for(var F={signature:L(),flavor:L(),length:L(),numTables:q(),reserved:q(),totalSfntSize:L(),majorVersion:q(),minorVersion:q(),metaOffset:L(),metaLength:L(),metaOrigLength:L(),privOffset:L(),privLength:L()},ne=0;Math.pow(2,ne)<=F.numTables;)ne++;ne--;for(var j=16*Math.pow(2,ne),Z=16*F.numTables-j,_=12,le=[],fe=0;fe{let[R,V]=P.split("+");R=parseInt(R,36),V=V?parseInt(V,36):0,c.set(S+=R,M[E]);for(let z=V;z--;)c.set(++S,M[E])})}}return c.get(T)||u}const f=1,h=2,p=3,m=4,v=[null,"isol","init","fina","medi"];function g(T){const M=new Uint8Array(T.length);let E=u,S=f,P=-1;for(let R=0;R65535&&R++)}return M}function b(T,M){const E=[];for(let P=0;P65535&&P++,E.push(t.U.codeToGlyph(T,R))}const S=T.GSUB;if(S){const{lookupList:P,featureList:R}=S;let V;const z=/^(rlig|liga|mset|isol|init|fina|medi|half|pres|blws)$/,k=[];R.forEach(N=>{if(z.test(N.tag))for(let q=0;q{if(j!==-1){let _=M[j];if(!_){const{cmds:le,crds:fe}=t.U.glyphToPath(T,j);let te="",$=0;for(let ue=0,D=le.length;ue1?",":"")+fe[$++]}let oe,ge,ve,Ke;if(fe.length){oe=ge=1/0,ve=Ke=-1/0;for(let ue=0,D=fe.length;ueve&&(ve=G),re>Ke&&(Ke=re)}}else oe=ve=ge=Ke=0;_=M[j]={index:j,advanceWidth:T.hmtx.aWidth[j],xMin:oe,yMin:ge,xMax:ve,yMax:Ke,path:te,pathCommandCount:le.length}}ne!==-1&&(L+=t.U.getPairAdjustment(T,ne,j)*A),q.call(null,_,L,F),_.advanceWidth&&(L+=_.advanceWidth*A),N&&(L+=N*k),ne=j}F+=z.codePointAt(F)>65535?2:1}),L}};return V}return function(M){const E=new Uint8Array(M,0,4),S=t._bin.readASCII(E,0,4);if(S==="wOFF")M=e(M);else if(S==="wOF2")throw new Error("woff2 fonts not supported");return x(t.parse(M)[0])}}const a0t=nw({name:"Typr Font Parser",dependencies:[r0t,i0t,s0t],init(t,e,n){const r=t(),i=e();return n(r,i)}}),y1={defaultFontURL:"https://fonts.gstatic.com/s/roboto/v18/KFOmCnqEu92Fr1Mu4mxM.woff",sdfGlyphSize:64,sdfMargin:1/16,sdfExponent:9,textureWidth:2048},o0t=new tt;function Og(){return(self.performance||Date).now()}const a$=Object.create(null);function l0t(t,e){t=c0t({},t);const n=Og();if(t.font=d0t(t.font||y1.defaultFontURL),t.text=""+t.text,t.sdfGlyphSize=t.sdfGlyphSize||y1.sdfGlyphSize,t.colorRanges!=null){let d={};for(let f in t.colorRanges)if(t.colorRanges.hasOwnProperty(f)){let h=t.colorRanges[f];typeof h!="number"&&(h=o0t.set(h).getHex()),d[f]=h}t.colorRanges=d}Object.freeze(t);const{textureWidth:r,sdfExponent:i}=y1,{sdfGlyphSize:s}=t,a=r/s*4;let o=a$[s];if(!o){const d=document.createElement("canvas");d.width=r,d.height=s*256/a,o=a$[s]={glyphCount:0,sdfGlyphSize:s,sdfCanvas:d,sdfTexture:new Di(d,void 0,void 0,void 0,Hn,Hn),contextLost:!1,glyphsByFont:new Map},o.sdfTexture.generateMipmaps=!1,u0t(o)}const{sdfTexture:l,sdfCanvas:u}=o;let c=o.glyphsByFont.get(t.font);c||o.glyphsByFont.set(t.font,c=new Map),h0t(t).then(d=>{const{glyphIds:f,glyphPositions:h,fontSize:p,unitsPerEm:m,timings:v}=d,g=[],b=new Float32Array(f.length*4),y=p/m;let x=0,T=0;const M=Og();f.forEach((V,z)=>{let k=c.get(V);if(!k){const{path:A,pathBounds:J}=d.glyphData[V],F=Math.max(J[2]-J[0],J[3]-J[1])/s*(y1.sdfMargin*s+.5),ne=o.glyphCount++,j=[J[0]-F,J[1]-F,J[2]+F,J[3]+F];c.set(V,k={path:A,atlasIndex:ne,sdfViewBox:j}),g.push(k)}const{sdfViewBox:N}=k,q=h[T++],L=h[T++];b[x++]=q+N[0]*y,b[x++]=L+N[1]*y,b[x++]=q+N[2]*y,b[x++]=L+N[3]*y,f[z]=k.atlasIndex}),v.quads=(v.quads||0)+(Og()-M);const E=Og();v.sdf={};const S=u.height,P=Math.ceil(o.glyphCount/a),R=Math.pow(2,Math.ceil(Math.log2(P*s)));R>S&&(console.info(`Increasing SDF texture size ${S}->${R}`),n0t(u,r,R),l.dispose()),Promise.all(g.map(V=>u0e(V,o,t.gpuAccelerateSDF).then(({timing:z})=>{v.sdf[V.atlasIndex]=z}))).then(()=>{g.length&&!o.contextLost&&(c0e(o),l.needsUpdate=!0),v.sdfTotal=Og()-E,v.total=Og()-n,e(Object.freeze({parameters:t,sdfTexture:l,sdfGlyphSize:s,sdfExponent:i,glyphBounds:b,glyphAtlasIndices:f,glyphColors:d.glyphColors,caretPositions:d.caretPositions,caretHeight:d.caretHeight,chunkedBounds:d.chunkedBounds,ascender:d.ascender,descender:d.descender,lineHeight:d.lineHeight,capHeight:d.capHeight,xHeight:d.xHeight,topBaseline:d.topBaseline,blockBounds:d.blockBounds,visibleBounds:d.visibleBounds,timings:d.timings}))})}),Promise.resolve().then(()=>{o.contextLost||t0t(u)})}function u0e({path:t,atlasIndex:e,sdfViewBox:n},{sdfGlyphSize:r,sdfCanvas:i,contextLost:s},a){if(s)return Promise.resolve({timing:-1});const{textureWidth:o,sdfExponent:l}=y1,u=Math.max(n[2]-n[0],n[3]-n[1]),c=Math.floor(e/4),d=c%(o/r)*r,f=Math.floor(c/(o/r))*r,h=e%4;return Bvt(r,r,t,n,u,l,i,d,f,h,a)}function u0t(t){const e=t.sdfCanvas;e.addEventListener("webglcontextlost",n=>{console.log("Context Lost",n),n.preventDefault(),t.contextLost=!0}),e.addEventListener("webglcontextrestored",n=>{console.log("Context Restored",n),t.contextLost=!1;const r=[];t.glyphsByFont.forEach(i=>{i.forEach(s=>{r.push(u0e(s,t,!0))})}),Promise.all(r).then(()=>{c0e(t),t.sdfTexture.needsUpdate=!0})})}function c0t(t,e){for(let n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}let iE;function d0t(t){return iE||(iE=typeof document>"u"?{}:document.createElement("a")),iE.href=t,iE.href}function c0e(t){if(typeof createImageBitmap!="function"){console.info("Safari<15: applying SDF canvas workaround");const{sdfCanvas:e,sdfTexture:n}=t,{width:r,height:i}=e,s=t.sdfCanvas.getContext("webgl");let a=n.image.data;(!a||a.length!==r*i*4)&&(a=new Uint8Array(r*i*4),n.image={width:r,height:i,data:a},n.flipY=!1,n.isDataTexture=!0),s.readPixels(0,0,r,i,s.RGBA,s.UNSIGNED_BYTE,a)}}const f0t=nw({name:"Typesetter",dependencies:[y1,a0t,Yvt,Dvt],init(t,e,n,r){const{defaultFontURL:i}=t;return n(e,r(),{defaultFontURL:i})}}),h0t=nw({name:"Typesetter",dependencies:[f0t],init(t){return function(e){return new Promise(n=>{t.typeset(e,n)})}},getTransferables(t){const e=[t.glyphPositions.buffer,t.glyphIds.buffer];return t.caretPositions&&e.push(t.caretPositions.buffer),t.glyphColors&&e.push(t.glyphColors.buffer),e}}),o$={};function p0t(t){let e=o$[t];if(!e){const n=new ao(1,1,t,t),r=n.clone(),i=n.attributes,s=r.attributes,a=new Lt,o=i.uv.count;for(let l=0;l{a.setAttribute(l,new xt([...i[l].array,...s[l].array],i[l].itemSize))}),a.setIndex([...n.index.array,...r.index.array.map(l=>l+o)]),a.translate(.5,.5,0),e=o$[t]=a}return e}const m0t="aTroikaGlyphBounds",l$="aTroikaGlyphIndex",v0t="aTroikaGlyphColor";class g0t extends kT{constructor(){super(),this.detail=1,this.curveRadius=0,this.groups=[{start:0,count:1/0,materialIndex:0},{start:0,count:1/0,materialIndex:1}],this.boundingSphere=new so,this.boundingBox=new Jt}computeBoundingSphere(){}computeBoundingBox(){}setSide(e){const n=this.getIndex().count;this.setDrawRange(e===Ua?n/2:0,e===rn?n:n/2)}set detail(e){if(e!==this._detail){this._detail=e,(typeof e!="number"||e<1)&&(e=1);let n=p0t(e);["position","normal","uv"].forEach(r=>{this.attributes[r]=n.attributes[r].clone()}),this.setIndex(n.getIndex().clone())}}get detail(){return this._detail}set curveRadius(e){e!==this._curveRadius&&(this._curveRadius=e,this._updateBounds())}get curveRadius(){return this._curveRadius}updateGlyphs(e,n,r,i,s){jI(this,m0t,e,4),jI(this,l$,n,1),jI(this,v0t,s,3),this._blockBounds=r,this._chunkedBounds=i,this.instanceCount=n.length,this._updateBounds()}_updateBounds(){const e=this._blockBounds;if(e){const{curveRadius:n,boundingBox:r}=this;if(n){const{PI:i,floor:s,min:a,max:o,sin:l,cos:u}=Math,c=i/2,d=i*2,f=Math.abs(n),h=e[0]/f,p=e[2]/f,m=s((h+c)/d)!==s((p+c)/d)?-f:a(l(h)*f,l(p)*f),v=s((h-c)/d)!==s((p-c)/d)?f:o(l(h)*f,l(p)*f),g=s((h+i)/d)!==s((p+i)/d)?f*2:o(f-u(h)*f,f-u(p)*f);r.min.set(m,e[1],n<0?-g:0),r.max.set(v,e[3],n<0?0:g)}else r.min.set(e[0],e[1],0),r.max.set(e[2],e[3],0);r.getBoundingSphere(this.boundingSphere)}}applyClipRect(e){let n=this.getAttribute(l$).count,r=this._chunkedBounds;if(r)for(let i=r.length;i--;){n=r[i].end;let s=r[i].rect;if(s[1]e.y&&s[0]e.x)break}this.instanceCount=n}}function jI(t,e,n,r){const i=t.getAttribute(e);n?i&&i.array.length===n.length?(i.array.set(n),i.needsUpdate=!0):(t.setAttribute(e,new Lp(n,r)),delete t._maxInstanceCount,t.dispose()):i&&t.deleteAttribute(e)}const b0t=` uniform vec2 uTroikaSDFTextureSize; uniform float uTroikaSDFGlyphSize; uniform vec4 uTroikaTotalBounds; @@ -3618,7 +3618,7 @@ varying vec4 vTroikaTextureUVBounds; varying float vTroikaTextureChannel; varying vec3 vTroikaGlyphColor; varying vec2 vTroikaGlyphDimensions; -`,b0t=` +`,y0t=` vec4 bounds = aTroikaGlyphBounds; bounds.xz += uTroikaPositionOffset.x; bounds.yw -= uTroikaPositionOffset.y; @@ -3660,7 +3660,7 @@ vec2 txStartUV = txUvPerSquare * vec2( ); vTroikaTextureUVBounds = vec4(txStartUV, vec2(txStartUV) + txUvPerSquare); vTroikaTextureChannel = mod(aTroikaGlyphIndex, 4.0); -`,y0t=` +`,S0t=` uniform sampler2D uTroikaSDFTexture; uniform vec2 uTroikaSDFTextureSize; uniform float uTroikaSDFGlyphSize; @@ -3734,7 +3734,7 @@ float troikaGetEdgeAlpha(float distance, float distanceOffset, float aaDist) { return alpha; } -`,S0t=` +`,x0t=` float aaDist = troikaGetAADist(); float fragDistance = troikaGetFragDistValue(); float edgeAlpha = uTroikaSDFDebug ? @@ -3757,10 +3757,10 @@ gl_FragColor.a *= edgeAlpha; if (edgeAlpha == 0.0) { discard; } -`;function f0e(t){const e=u4(t,{chained:!0,extensions:{derivatives:!0},uniforms:{uTroikaSDFTexture:{value:null},uTroikaSDFTextureSize:{value:new Oe},uTroikaSDFGlyphSize:{value:0},uTroikaSDFExponent:{value:0},uTroikaTotalBounds:{value:new Qt(0,0,0,0)},uTroikaClipRect:{value:new Qt(0,0,0,0)},uTroikaDistanceOffset:{value:0},uTroikaOutlineOpacity:{value:0},uTroikaFillOpacity:{value:1},uTroikaPositionOffset:{value:new Oe},uTroikaCurveRadius:{value:0},uTroikaBlurRadius:{value:0},uTroikaStrokeWidth:{value:0},uTroikaStrokeColor:{value:new tt},uTroikaStrokeOpacity:{value:1},uTroikaOrient:{value:new as},uTroikaUseGlyphColors:{value:!0},uTroikaSDFDebug:{value:!1}},vertexDefs:g0t,vertexTransform:b0t,fragmentDefs:y0t,fragmentColorTransform:S0t,customRewriter({vertexShader:n,fragmentShader:r}){let i=/\buniform\s+vec3\s+diffuse\b/;return i.test(r)&&(r=r.replace(i,"varying vec3 vTroikaGlyphColor").replace(/\bdiffuse\b/g,"vTroikaGlyphColor"),i.test(n)||(n=n.replace(l0e,`uniform vec3 diffuse; +`;function d0e(t){const e=u4(t,{chained:!0,extensions:{derivatives:!0},uniforms:{uTroikaSDFTexture:{value:null},uTroikaSDFTextureSize:{value:new Oe},uTroikaSDFGlyphSize:{value:0},uTroikaSDFExponent:{value:0},uTroikaTotalBounds:{value:new Qt(0,0,0,0)},uTroikaClipRect:{value:new Qt(0,0,0,0)},uTroikaDistanceOffset:{value:0},uTroikaOutlineOpacity:{value:0},uTroikaFillOpacity:{value:1},uTroikaPositionOffset:{value:new Oe},uTroikaCurveRadius:{value:0},uTroikaBlurRadius:{value:0},uTroikaStrokeWidth:{value:0},uTroikaStrokeColor:{value:new tt},uTroikaStrokeOpacity:{value:1},uTroikaOrient:{value:new as},uTroikaUseGlyphColors:{value:!0},uTroikaSDFDebug:{value:!1}},vertexDefs:b0t,vertexTransform:y0t,fragmentDefs:S0t,fragmentColorTransform:x0t,customRewriter({vertexShader:n,fragmentShader:r}){let i=/\buniform\s+vec3\s+diffuse\b/;return i.test(r)&&(r=r.replace(i,"varying vec3 vTroikaGlyphColor").replace(/\bdiffuse\b/g,"vTroikaGlyphColor"),i.test(n)||(n=n.replace(o0e,`uniform vec3 diffuse; $& vTroikaGlyphColor = uTroikaUseGlyphColors ? aTroikaGlyphColor / 255.0 : diffuse; -`))),{vertexShader:n,fragmentShader:r}}});return e.transparent=!0,Object.defineProperties(e,{isTroikaTextMaterial:{value:!0},shadowSide:{get(){return this.side},set(){}}}),e}const HD=new ho({color:16777215,side:rn,transparent:!0}),d$=8421504,f$=new Be,sE=new U,ZI=new U,$S=[],x0t=new U,JI="+x+y";function h$(t){return Array.isArray(t)?t[0]:t}let h0e=()=>{const t=new ut(new ao(1,1),HD);return h0e=()=>t,t},p0e=()=>{const t=new ut(new ao(1,1,32,1),HD);return p0e=()=>t,t};const T0t={type:"syncstart"},w0t={type:"synccomplete"},m0e=["font","fontSize","letterSpacing","lineHeight","maxWidth","overflowWrap","text","direction","textAlign","textIndent","whiteSpace","anchorX","anchorY","colorRanges","sdfGlyphSize"],E0t=m0e.concat("material","color","depthOffset","clipRect","curveRadius","orientation","glyphGeometryDetail");class v0e extends ut{constructor(){const e=new v0t;super(e,null),this.text="",this.anchorX=0,this.anchorY=0,this.curveRadius=0,this.direction="auto",this.font=null,this.fontSize=.1,this.letterSpacing=0,this.lineHeight="normal",this.maxWidth=1/0,this.overflowWrap="normal",this.textAlign="left",this.textIndent=0,this.whiteSpace="normal",this.material=null,this.color=null,this.colorRanges=null,this.outlineWidth=0,this.outlineColor=0,this.outlineOpacity=1,this.outlineBlur=0,this.outlineOffsetX=0,this.outlineOffsetY=0,this.strokeWidth=0,this.strokeColor=d$,this.strokeOpacity=1,this.fillOpacity=1,this.depthOffset=0,this.clipRect=null,this.orientation=JI,this.glyphGeometryDetail=1,this.sdfGlyphSize=null,this.gpuAccelerateSDF=!0,this.debugSDF=!1}sync(e){this._needsSync&&(this._needsSync=!1,this._isSyncing?(this._queuedSyncs||(this._queuedSyncs=[])).push(e):(this._isSyncing=!0,this.dispatchEvent(T0t),o0t({text:this.text,font:this.font,fontSize:this.fontSize||.1,letterSpacing:this.letterSpacing||0,lineHeight:this.lineHeight||"normal",maxWidth:this.maxWidth,direction:this.direction||"auto",textAlign:this.textAlign,textIndent:this.textIndent,whiteSpace:this.whiteSpace,overflowWrap:this.overflowWrap,anchorX:this.anchorX,anchorY:this.anchorY,colorRanges:this.colorRanges,includeCaretPositions:!0,sdfGlyphSize:this.sdfGlyphSize,gpuAccelerateSDF:this.gpuAccelerateSDF},n=>{this._isSyncing=!1,this._textRenderInfo=n,this.geometry.updateGlyphs(n.glyphBounds,n.glyphAtlasIndices,n.blockBounds,n.chunkedBounds,n.glyphColors);const r=this._queuedSyncs;r&&(this._queuedSyncs=null,this._needsSync=!0,this.sync(()=>{r.forEach(i=>i&&i())})),this.dispatchEvent(w0t),e&&e()})))}onBeforeRender(e,n,r,i,s,a){this.sync(),s.isTroikaTextMaterial&&this._prepareForRender(s),s._hadOwnSide=s.hasOwnProperty("side"),this.geometry.setSide(s._actualSide=s.side),s.side=Ki}onAfterRender(e,n,r,i,s,a){s._hadOwnSide?s.side=s._actualSide:delete s.side}dispose(){this.geometry.dispose()}get textRenderInfo(){return this._textRenderInfo||null}get material(){let e=this._derivedMaterial;const n=this._baseMaterial||this._defaultMaterial||(this._defaultMaterial=HD.clone());if((!e||e.baseMaterial!==n)&&(e=this._derivedMaterial=f0e(n),n.addEventListener("dispose",function r(){n.removeEventListener("dispose",r),e.dispose()})),this.outlineWidth||this.outlineBlur||this.outlineOffsetX||this.outlineOffsetY){let r=e._outlineMtl;return r||(r=e._outlineMtl=Object.create(e,{id:{value:e.id+.1}}),r.isTextOutlineMaterial=!0,r.depthWrite=!1,r.map=null,e.addEventListener("dispose",function i(){e.removeEventListener("dispose",i),r.dispose()})),[r,e]}else return e}set material(e){e&&e.isTroikaTextMaterial?(this._derivedMaterial=e,this._baseMaterial=e.baseMaterial):this._baseMaterial=e}get glyphGeometryDetail(){return this.geometry.detail}set glyphGeometryDetail(e){this.geometry.detail=e}get curveRadius(){return this.geometry.curveRadius}set curveRadius(e){this.geometry.curveRadius=e}get customDepthMaterial(){return h$(this.material).getDepthMaterial()}get customDistanceMaterial(){return h$(this.material).getDistanceMaterial()}_prepareForRender(e){const n=e.isTextOutlineMaterial,r=e.uniforms,i=this.textRenderInfo;if(i){const{sdfTexture:o,blockBounds:l}=i;r.uTroikaSDFTexture.value=o,r.uTroikaSDFTextureSize.value.set(o.image.width,o.image.height),r.uTroikaSDFGlyphSize.value=i.sdfGlyphSize,r.uTroikaSDFExponent.value=i.sdfExponent,r.uTroikaTotalBounds.value.fromArray(l),r.uTroikaUseGlyphColors.value=!n&&!!i.glyphColors;let u=0,c=0,d=0,f,h,p,m=0,v=0;if(n){let{outlineWidth:b,outlineOffsetX:y,outlineOffsetY:x,outlineBlur:T,outlineOpacity:M}=this;u=this._parsePercent(b)||0,c=Math.max(0,this._parsePercent(T)||0),f=M,m=this._parsePercent(y)||0,v=this._parsePercent(x)||0}else d=Math.max(0,this._parsePercent(this.strokeWidth)||0),d&&(p=this.strokeColor,r.uTroikaStrokeColor.value.set(p??d$),h=this.strokeOpacity,h==null&&(h=1)),f=this.fillOpacity;r.uTroikaDistanceOffset.value=u,r.uTroikaPositionOffset.value.set(m,v),r.uTroikaBlurRadius.value=c,r.uTroikaStrokeWidth.value=d,r.uTroikaStrokeOpacity.value=h,r.uTroikaFillOpacity.value=f??1,r.uTroikaCurveRadius.value=this.curveRadius||0;let g=this.clipRect;if(g&&Array.isArray(g)&&g.length===4)r.uTroikaClipRect.value.fromArray(g);else{const b=(this.fontSize||.1)*100;r.uTroikaClipRect.value.set(l[0]-b,l[1]-b,l[2]+b,l[3]+b)}this.geometry.applyClipRect(r.uTroikaClipRect.value)}r.uTroikaSDFDebug.value=!!this.debugSDF,e.polygonOffset=!!this.depthOffset,e.polygonOffsetFactor=e.polygonOffsetUnits=this.depthOffset||0;const s=n?this.outlineColor||0:this.color;if(s==null)delete e.color;else{const o=e.hasOwnProperty("color")?e.color:e.color=new tt;(s!==o._input||typeof s=="object")&&o.set(o._input=s)}let a=this.orientation||JI;if(a!==e._orientation){let o=r.uTroikaOrient.value;a=a.replace(/[^-+xyz]/g,"");let l=a!==JI&&a.match(/^([-+])([xyz])([-+])([xyz])$/);if(l){let[,u,c,d,f]=l;sE.set(0,0,0)[c]=u==="-"?1:-1,ZI.set(0,0,0)[f]=d==="-"?-1:1,f$.lookAt(x0t,sE.cross(ZI),ZI),o.setFromMatrix4(f$)}else o.identity();e._orientation=a}}_parsePercent(e){if(typeof e=="string"){let n=e.match(/^(-?[\d.]+)%$/),r=n?parseFloat(n[1]):NaN;e=(isNaN(r)?0:r/100)*this.fontSize}return e}localPositionToTextCoords(e,n=new Oe){n.copy(e);const r=this.curveRadius;return r&&(n.x=Math.atan2(e.x,Math.abs(r)-Math.abs(e.z))*Math.abs(r)),n}worldPositionToTextCoords(e,n=new Oe){return sE.copy(e),this.localPositionToTextCoords(this.worldToLocal(sE),n)}raycast(e,n){const{textRenderInfo:r,curveRadius:i}=this;if(r){const s=r.blockBounds,a=i?p0e():h0e(),o=a.geometry,{position:l,uv:u}=o.attributes;for(let c=0;c{this[r]=e[r]}),this}clone(){return new this.constructor().copy(this)}}m0e.forEach(t=>{const e="_private_"+t;Object.defineProperty(v0e.prototype,t,{get(){return this[e]},set(n){n!==this[e]&&(this[e]=n,this._needsSync=!0)}})});const p$=new Jt,aE=new U;class Ub extends kT{constructor(){super(),this.type="LineSegmentsGeometry";const e=[-1,2,0,1,2,0,-1,1,0,1,1,0,-1,0,0,1,0,0,-1,-1,0,1,-1,0],n=[-1,2,1,2,-1,1,1,1,-1,-1,1,-1,-1,-2,1,-2],r=[0,2,1,2,3,1,2,4,3,4,5,3,4,6,5,6,7,5];this.setIndex(r),this.setAttribute("position",new xt(e,3)),this.setAttribute("uv",new xt(n,2))}applyMatrix4(e){const n=this.attributes.instanceStart,r=this.attributes.instanceEnd;return n!==void 0&&(n.applyMatrix4(e),r.applyMatrix4(e),n.needsUpdate=!0),this.boundingBox!==null&&this.computeBoundingBox(),this.boundingSphere!==null&&this.computeBoundingSphere(),this}setPositions(e){let n;e instanceof Float32Array?n=e:Array.isArray(e)&&(n=new Float32Array(e));const r=new Jv(n,6,1);return this.setAttribute("instanceStart",new qs(r,3,0)),this.setAttribute("instanceEnd",new qs(r,3,3)),this.computeBoundingBox(),this.computeBoundingSphere(),this}setColors(e){let n;e instanceof Float32Array?n=e:Array.isArray(e)&&(n=new Float32Array(e));const r=new Jv(n,6,1);return this.setAttribute("instanceColorStart",new qs(r,3,0)),this.setAttribute("instanceColorEnd",new qs(r,3,3)),this}fromWireframeGeometry(e){return this.setPositions(e.attributes.position.array),this}fromEdgesGeometry(e){return this.setPositions(e.attributes.position.array),this}fromMesh(e){return this.fromWireframeGeometry(new $V(e.geometry)),this}fromLineSegments(e){const n=e.geometry;if(n.isGeometry){console.error("THREE.LineSegmentsGeometry no longer supports Geometry. Use THREE.BufferGeometry instead.");return}else n.isBufferGeometry&&this.setPositions(n.attributes.position.array);return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new Jt);const e=this.attributes.instanceStart,n=this.attributes.instanceEnd;e!==void 0&&n!==void 0&&(this.boundingBox.setFromBufferAttribute(e),p$.setFromBufferAttribute(n),this.boundingBox.union(p$))}computeBoundingSphere(){this.boundingSphere===null&&(this.boundingSphere=new so),this.boundingBox===null&&this.computeBoundingBox();const e=this.attributes.instanceStart,n=this.attributes.instanceEnd;if(e!==void 0&&n!==void 0){const r=this.boundingSphere.center;this.boundingBox.getCenter(r);let i=0;for(let s=0,a=e.count;sc&&Js.z>c)continue;if(Zs.z>c){const b=Zs.z-Js.z,y=(Zs.z-c)/b;Zs.lerp(Js,y)}else if(Js.z>c){const b=Js.z-Zs.z,y=(Js.z-c)/b;Js.lerp(Zs,y)}Zs.applyMatrix4(r),Js.applyMatrix4(r),Zs.multiplyScalar(1/Zs.w),Js.multiplyScalar(1/Js.w),Zs.x*=s.x/2,Zs.y*=s.y/2,Js.x*=s.x/2,Js.y*=s.y/2,xa.start.copy(Zs),xa.start.z=0,xa.end.copy(Js),xa.end.z=0;const p=xa.closestPointToPointParameter(YI,!0);xa.at(p,g$);const m=fp.lerp(Zs.z,Js.z,p),v=m>=-1&&m<=1,g=YI.distanceTo(g$){const t=new ut(new ao(1,1),QD);return f0e=()=>t,t},h0e=()=>{const t=new ut(new ao(1,1,32,1),QD);return h0e=()=>t,t};const w0t={type:"syncstart"},E0t={type:"synccomplete"},p0e=["font","fontSize","letterSpacing","lineHeight","maxWidth","overflowWrap","text","direction","textAlign","textIndent","whiteSpace","anchorX","anchorY","colorRanges","sdfGlyphSize"],M0t=p0e.concat("material","color","depthOffset","clipRect","curveRadius","orientation","glyphGeometryDetail");class m0e extends ut{constructor(){const e=new g0t;super(e,null),this.text="",this.anchorX=0,this.anchorY=0,this.curveRadius=0,this.direction="auto",this.font=null,this.fontSize=.1,this.letterSpacing=0,this.lineHeight="normal",this.maxWidth=1/0,this.overflowWrap="normal",this.textAlign="left",this.textIndent=0,this.whiteSpace="normal",this.material=null,this.color=null,this.colorRanges=null,this.outlineWidth=0,this.outlineColor=0,this.outlineOpacity=1,this.outlineBlur=0,this.outlineOffsetX=0,this.outlineOffsetY=0,this.strokeWidth=0,this.strokeColor=u$,this.strokeOpacity=1,this.fillOpacity=1,this.depthOffset=0,this.clipRect=null,this.orientation=JI,this.glyphGeometryDetail=1,this.sdfGlyphSize=null,this.gpuAccelerateSDF=!0,this.debugSDF=!1}sync(e){this._needsSync&&(this._needsSync=!1,this._isSyncing?(this._queuedSyncs||(this._queuedSyncs=[])).push(e):(this._isSyncing=!0,this.dispatchEvent(w0t),l0t({text:this.text,font:this.font,fontSize:this.fontSize||.1,letterSpacing:this.letterSpacing||0,lineHeight:this.lineHeight||"normal",maxWidth:this.maxWidth,direction:this.direction||"auto",textAlign:this.textAlign,textIndent:this.textIndent,whiteSpace:this.whiteSpace,overflowWrap:this.overflowWrap,anchorX:this.anchorX,anchorY:this.anchorY,colorRanges:this.colorRanges,includeCaretPositions:!0,sdfGlyphSize:this.sdfGlyphSize,gpuAccelerateSDF:this.gpuAccelerateSDF},n=>{this._isSyncing=!1,this._textRenderInfo=n,this.geometry.updateGlyphs(n.glyphBounds,n.glyphAtlasIndices,n.blockBounds,n.chunkedBounds,n.glyphColors);const r=this._queuedSyncs;r&&(this._queuedSyncs=null,this._needsSync=!0,this.sync(()=>{r.forEach(i=>i&&i())})),this.dispatchEvent(E0t),e&&e()})))}onBeforeRender(e,n,r,i,s,a){this.sync(),s.isTroikaTextMaterial&&this._prepareForRender(s),s._hadOwnSide=s.hasOwnProperty("side"),this.geometry.setSide(s._actualSide=s.side),s.side=Ki}onAfterRender(e,n,r,i,s,a){s._hadOwnSide?s.side=s._actualSide:delete s.side}dispose(){this.geometry.dispose()}get textRenderInfo(){return this._textRenderInfo||null}get material(){let e=this._derivedMaterial;const n=this._baseMaterial||this._defaultMaterial||(this._defaultMaterial=QD.clone());if((!e||e.baseMaterial!==n)&&(e=this._derivedMaterial=d0e(n),n.addEventListener("dispose",function r(){n.removeEventListener("dispose",r),e.dispose()})),this.outlineWidth||this.outlineBlur||this.outlineOffsetX||this.outlineOffsetY){let r=e._outlineMtl;return r||(r=e._outlineMtl=Object.create(e,{id:{value:e.id+.1}}),r.isTextOutlineMaterial=!0,r.depthWrite=!1,r.map=null,e.addEventListener("dispose",function i(){e.removeEventListener("dispose",i),r.dispose()})),[r,e]}else return e}set material(e){e&&e.isTroikaTextMaterial?(this._derivedMaterial=e,this._baseMaterial=e.baseMaterial):this._baseMaterial=e}get glyphGeometryDetail(){return this.geometry.detail}set glyphGeometryDetail(e){this.geometry.detail=e}get curveRadius(){return this.geometry.curveRadius}set curveRadius(e){this.geometry.curveRadius=e}get customDepthMaterial(){return d$(this.material).getDepthMaterial()}get customDistanceMaterial(){return d$(this.material).getDistanceMaterial()}_prepareForRender(e){const n=e.isTextOutlineMaterial,r=e.uniforms,i=this.textRenderInfo;if(i){const{sdfTexture:o,blockBounds:l}=i;r.uTroikaSDFTexture.value=o,r.uTroikaSDFTextureSize.value.set(o.image.width,o.image.height),r.uTroikaSDFGlyphSize.value=i.sdfGlyphSize,r.uTroikaSDFExponent.value=i.sdfExponent,r.uTroikaTotalBounds.value.fromArray(l),r.uTroikaUseGlyphColors.value=!n&&!!i.glyphColors;let u=0,c=0,d=0,f,h,p,m=0,v=0;if(n){let{outlineWidth:b,outlineOffsetX:y,outlineOffsetY:x,outlineBlur:T,outlineOpacity:M}=this;u=this._parsePercent(b)||0,c=Math.max(0,this._parsePercent(T)||0),f=M,m=this._parsePercent(y)||0,v=this._parsePercent(x)||0}else d=Math.max(0,this._parsePercent(this.strokeWidth)||0),d&&(p=this.strokeColor,r.uTroikaStrokeColor.value.set(p??u$),h=this.strokeOpacity,h==null&&(h=1)),f=this.fillOpacity;r.uTroikaDistanceOffset.value=u,r.uTroikaPositionOffset.value.set(m,v),r.uTroikaBlurRadius.value=c,r.uTroikaStrokeWidth.value=d,r.uTroikaStrokeOpacity.value=h,r.uTroikaFillOpacity.value=f??1,r.uTroikaCurveRadius.value=this.curveRadius||0;let g=this.clipRect;if(g&&Array.isArray(g)&&g.length===4)r.uTroikaClipRect.value.fromArray(g);else{const b=(this.fontSize||.1)*100;r.uTroikaClipRect.value.set(l[0]-b,l[1]-b,l[2]+b,l[3]+b)}this.geometry.applyClipRect(r.uTroikaClipRect.value)}r.uTroikaSDFDebug.value=!!this.debugSDF,e.polygonOffset=!!this.depthOffset,e.polygonOffsetFactor=e.polygonOffsetUnits=this.depthOffset||0;const s=n?this.outlineColor||0:this.color;if(s==null)delete e.color;else{const o=e.hasOwnProperty("color")?e.color:e.color=new tt;(s!==o._input||typeof s=="object")&&o.set(o._input=s)}let a=this.orientation||JI;if(a!==e._orientation){let o=r.uTroikaOrient.value;a=a.replace(/[^-+xyz]/g,"");let l=a!==JI&&a.match(/^([-+])([xyz])([-+])([xyz])$/);if(l){let[,u,c,d,f]=l;sE.set(0,0,0)[c]=u==="-"?1:-1,ZI.set(0,0,0)[f]=d==="-"?-1:1,c$.lookAt(T0t,sE.cross(ZI),ZI),o.setFromMatrix4(c$)}else o.identity();e._orientation=a}}_parsePercent(e){if(typeof e=="string"){let n=e.match(/^(-?[\d.]+)%$/),r=n?parseFloat(n[1]):NaN;e=(isNaN(r)?0:r/100)*this.fontSize}return e}localPositionToTextCoords(e,n=new Oe){n.copy(e);const r=this.curveRadius;return r&&(n.x=Math.atan2(e.x,Math.abs(r)-Math.abs(e.z))*Math.abs(r)),n}worldPositionToTextCoords(e,n=new Oe){return sE.copy(e),this.localPositionToTextCoords(this.worldToLocal(sE),n)}raycast(e,n){const{textRenderInfo:r,curveRadius:i}=this;if(r){const s=r.blockBounds,a=i?h0e():f0e(),o=a.geometry,{position:l,uv:u}=o.attributes;for(let c=0;c{this[r]=e[r]}),this}clone(){return new this.constructor().copy(this)}}p0e.forEach(t=>{const e="_private_"+t;Object.defineProperty(m0e.prototype,t,{get(){return this[e]},set(n){n!==this[e]&&(this[e]=n,this._needsSync=!0)}})});const f$=new Jt,aE=new U;class Ub extends kT{constructor(){super(),this.type="LineSegmentsGeometry";const e=[-1,2,0,1,2,0,-1,1,0,1,1,0,-1,0,0,1,0,0,-1,-1,0,1,-1,0],n=[-1,2,1,2,-1,1,1,1,-1,-1,1,-1,-1,-2,1,-2],r=[0,2,1,2,3,1,2,4,3,4,5,3,4,6,5,6,7,5];this.setIndex(r),this.setAttribute("position",new xt(e,3)),this.setAttribute("uv",new xt(n,2))}applyMatrix4(e){const n=this.attributes.instanceStart,r=this.attributes.instanceEnd;return n!==void 0&&(n.applyMatrix4(e),r.applyMatrix4(e),n.needsUpdate=!0),this.boundingBox!==null&&this.computeBoundingBox(),this.boundingSphere!==null&&this.computeBoundingSphere(),this}setPositions(e){let n;e instanceof Float32Array?n=e:Array.isArray(e)&&(n=new Float32Array(e));const r=new Jv(n,6,1);return this.setAttribute("instanceStart",new qs(r,3,0)),this.setAttribute("instanceEnd",new qs(r,3,3)),this.computeBoundingBox(),this.computeBoundingSphere(),this}setColors(e){let n;e instanceof Float32Array?n=e:Array.isArray(e)&&(n=new Float32Array(e));const r=new Jv(n,6,1);return this.setAttribute("instanceColorStart",new qs(r,3,0)),this.setAttribute("instanceColorEnd",new qs(r,3,3)),this}fromWireframeGeometry(e){return this.setPositions(e.attributes.position.array),this}fromEdgesGeometry(e){return this.setPositions(e.attributes.position.array),this}fromMesh(e){return this.fromWireframeGeometry(new $V(e.geometry)),this}fromLineSegments(e){const n=e.geometry;if(n.isGeometry){console.error("THREE.LineSegmentsGeometry no longer supports Geometry. Use THREE.BufferGeometry instead.");return}else n.isBufferGeometry&&this.setPositions(n.attributes.position.array);return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new Jt);const e=this.attributes.instanceStart,n=this.attributes.instanceEnd;e!==void 0&&n!==void 0&&(this.boundingBox.setFromBufferAttribute(e),f$.setFromBufferAttribute(n),this.boundingBox.union(f$))}computeBoundingSphere(){this.boundingSphere===null&&(this.boundingSphere=new so),this.boundingBox===null&&this.computeBoundingBox();const e=this.attributes.instanceStart,n=this.attributes.instanceEnd;if(e!==void 0&&n!==void 0){const r=this.boundingSphere.center;this.boundingBox.getCenter(r);let i=0;for(let s=0,a=e.count;sc&&Js.z>c)continue;if(Zs.z>c){const b=Zs.z-Js.z,y=(Zs.z-c)/b;Zs.lerp(Js,y)}else if(Js.z>c){const b=Js.z-Zs.z,y=(Js.z-c)/b;Js.lerp(Zs,y)}Zs.applyMatrix4(r),Js.applyMatrix4(r),Zs.multiplyScalar(1/Zs.w),Js.multiplyScalar(1/Js.w),Zs.x*=s.x/2,Zs.y*=s.y/2,Js.x*=s.x/2,Js.y*=s.y/2,xa.start.copy(Zs),xa.start.z=0,xa.end.copy(Js),xa.end.z=0;const p=xa.closestPointToPointParameter(YI,!0);xa.at(p,m$);const m=fp.lerp(Zs.z,Js.z,p),v=m>=-1&&m<=1,g=YI.distanceTo(m$)m?(v=1,g=0):(v=0,g=1);const b=p-v+c,y=m-g+c,x=p-1+2*c,T=m-1+2*c,M=l&255,E=u&255,S=this.perm[M+this.perm[E]]%12,P=this.perm[M+v+this.perm[E+g]]%12,R=this.perm[M+1+this.perm[E+1]]%12;let V=.5-p*p-m*m;V<0?r=0:(V*=V,r=V*V*this.dot(this.grad3[S],p,m));let z=.5-b*b-y*y;z<0?i=0:(z*=z,i=z*z*this.dot(this.grad3[P],b,y));let k=.5-x*x-T*T;return k<0?s=0:(k*=k,s=k*k*this.dot(this.grad3[R],x,T)),70*(r+i+s)}noise3d(e,n,r){let i,s,a,o;const l=.3333333333333333,u=(e+n+r)*l,c=Math.floor(e+u),d=Math.floor(n+u),f=Math.floor(r+u),h=1/6,p=(c+d+f)*h,m=c-p,v=d-p,g=f-p,b=e-m,y=n-v,x=r-g;let T,M,E,S,P,R;b>=y?y>=x?(T=1,M=0,E=0,S=1,P=1,R=0):b>=x?(T=1,M=0,E=0,S=1,P=0,R=1):(T=0,M=0,E=1,S=1,P=0,R=1):yR?32:0,N=P>V?16:0,q=R>V?8:0,L=P>z?4:0,A=R>z?2:0,Z=V>z?1:0,j=k+N+q+L+A+Z,ne=a[j][0]>=3?1:0,G=a[j][1]>=3?1:0,B=a[j][2]>=3?1:0,ee=a[j][3]>=3?1:0,ce=a[j][0]>=2?1:0,fe=a[j][1]>=2?1:0,te=a[j][2]>=2?1:0,_=a[j][3]>=2?1:0,oe=a[j][0]>=1?1:0,ye=a[j][1]>=1?1:0,ve=a[j][2]>=1?1:0,Ke=a[j][3]>=1?1:0,le=P-ne+u,D=R-G+u,F=V-B+u,re=z-ee+u,de=P-ce+2*u,Te=R-fe+2*u,he=V-te+2*u,be=z-_+2*u,we=P-oe+3*u,se=R-ye+3*u,W=V-ve+3*u,K=z-Ke+3*u,ie=P-1+4*u,me=R-1+4*u,We=V-1+4*u,Ce=z-1+4*u,Ae=v&255,J=g&255,ue=b&255,ge=y&255,Se=o[Ae+o[J+o[ue+o[ge]]]]%32,Q=o[Ae+ne+o[J+G+o[ue+B+o[ge+ee]]]]%32,Pe=o[Ae+ce+o[J+fe+o[ue+te+o[ge+_]]]]%32,Ve=o[Ae+oe+o[J+ye+o[ue+ve+o[ge+Ke]]]]%32,Fe=o[Ae+1+o[J+1+o[ue+1+o[ge+1]]]]%32;let je=.6-P*P-R*R-V*V-z*z;je<0?c=0:(je*=je,c=je*je*this.dot4(s[Se],P,R,V,z));let Ze=.6-le*le-D*D-F*F-re*re;Ze<0?d=0:(Ze*=Ze,d=Ze*Ze*this.dot4(s[Q],le,D,F,re));let Re=.6-de*de-Te*Te-he*he-be*be;Re<0?f=0:(Re*=Re,f=Re*Re*this.dot4(s[Pe],de,Te,he,be));let Me=.6-we*we-se*se-W*W-K*K;Me<0?h=0:(Me*=Me,h=Me*Me*this.dot4(s[Ve],we,se,W,K));let lt=.6-ie*ie-me*me-We*We-Ce*Ce;return lt<0?p=0:(lt*=lt,p=lt*lt*this.dot4(s[Fe],ie,me,We,Ce)),27*(c+d+f+h+p)}}const jm=new Sy,Vo=new U,gh=new U,fi=new Or,T$={X:new U(1,0,0),Y:new U(0,1,0),Z:new U(0,0,1)},HI={type:"change"},w$={type:"mouseDown"},E$={type:"mouseUp",mode:null},M$={type:"objectChange"};class y0e extends cn{constructor(e,n){super(),n===void 0&&(console.warn('THREE.TransformControls: The second parameter "domElement" is now mandatory.'),n=document),this.visible=!1,this.domElement=n,this.domElement.style.touchAction="none";const r=new S0e;this._gizmo=r,this.add(r);const i=new x0e;this._plane=i,this.add(i);const s=this;function a(b,y){let x=y;Object.defineProperty(s,b,{get:function(){return x!==void 0?x:y},set:function(T){x!==T&&(x=T,i[b]=T,r[b]=T,s.dispatchEvent({type:b+"-changed",value:T}),s.dispatchEvent(HI))}}),s[b]=y,i[b]=y,r[b]=y}a("camera",e),a("object",void 0),a("enabled",!0),a("axis",null),a("mode","translate"),a("translationSnap",null),a("rotationSnap",null),a("scaleSnap",null),a("space","world"),a("size",1),a("dragging",!1),a("showX",!0),a("showY",!0),a("showZ",!0);const o=new U,l=new U,u=new Or,c=new Or,d=new U,f=new Or,h=new U,p=new U,m=new U,v=0,g=new U;a("worldPosition",o),a("worldPositionStart",l),a("worldQuaternion",u),a("worldQuaternionStart",c),a("cameraPosition",d),a("cameraQuaternion",f),a("pointStart",h),a("pointEnd",p),a("rotationAxis",m),a("rotationAngle",v),a("eye",g),this._offset=new U,this._startNorm=new U,this._endNorm=new U,this._cameraScale=new U,this._parentPosition=new U,this._parentQuaternion=new Or,this._parentQuaternionInv=new Or,this._parentScale=new U,this._worldScaleStart=new U,this._worldQuaternionInv=new Or,this._worldScale=new U,this._positionStart=new U,this._quaternionStart=new Or,this._scaleStart=new U,this._getPointer=I0t.bind(this),this._onPointerDown=N0t.bind(this),this._onPointerHover=U0t.bind(this),this._onPointerMove=L0t.bind(this),this._onPointerUp=X0t.bind(this),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointermove",this._onPointerHover),this.domElement.addEventListener("pointerup",this._onPointerUp)}updateMatrixWorld(){this.object!==void 0&&(this.object.updateMatrixWorld(),this.object.parent===null?console.error("TransformControls: The attached 3D object must be a part of the scene graph."):this.object.parent.matrixWorld.decompose(this._parentPosition,this._parentQuaternion,this._parentScale),this.object.matrixWorld.decompose(this.worldPosition,this.worldQuaternion,this._worldScale),this._parentQuaternionInv.copy(this._parentQuaternion).invert(),this._worldQuaternionInv.copy(this.worldQuaternion).invert()),this.camera.updateMatrixWorld(),this.camera.matrixWorld.decompose(this.cameraPosition,this.cameraQuaternion,this._cameraScale),this.eye.copy(this.cameraPosition).sub(this.worldPosition).normalize(),super.updateMatrixWorld(this)}pointerHover(e){if(this.object===void 0||this.dragging===!0)return;jm.setFromCamera(e,this.camera);const n=QI(this._gizmo.picker[this.mode],jm);n?this.axis=n.object.name:this.axis=null}pointerDown(e){if(!(this.object===void 0||this.dragging===!0||e.button!==0)&&this.axis!==null){jm.setFromCamera(e,this.camera);const n=QI(this._plane,jm,!0);n&&(this.object.updateMatrixWorld(),this.object.parent.updateMatrixWorld(),this._positionStart.copy(this.object.position),this._quaternionStart.copy(this.object.quaternion),this._scaleStart.copy(this.object.scale),this.object.matrixWorld.decompose(this.worldPositionStart,this.worldQuaternionStart,this._worldScaleStart),this.pointStart.copy(n.point).sub(this.worldPositionStart)),this.dragging=!0,w$.mode=this.mode,this.dispatchEvent(w$)}}pointerMove(e){const n=this.axis,r=this.mode,i=this.object;let s=this.space;if(r==="scale"?s="local":(n==="E"||n==="XYZE"||n==="XYZ")&&(s="world"),i===void 0||n===null||this.dragging===!1||e.button!==-1)return;jm.setFromCamera(e,this.camera);const a=QI(this._plane,jm,!0);if(a){if(this.pointEnd.copy(a.point).sub(this.worldPositionStart),r==="translate")this._offset.copy(this.pointEnd).sub(this.pointStart),s==="local"&&n!=="XYZ"&&this._offset.applyQuaternion(this._worldQuaternionInv),n.indexOf("X")===-1&&(this._offset.x=0),n.indexOf("Y")===-1&&(this._offset.y=0),n.indexOf("Z")===-1&&(this._offset.z=0),s==="local"&&n!=="XYZ"?this._offset.applyQuaternion(this._quaternionStart).divide(this._parentScale):this._offset.applyQuaternion(this._parentQuaternionInv).divide(this._parentScale),i.position.copy(this._offset).add(this._positionStart),this.translationSnap&&(s==="local"&&(i.position.applyQuaternion(fi.copy(this._quaternionStart).invert()),n.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),n.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),n.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.position.applyQuaternion(this._quaternionStart)),s==="world"&&(i.parent&&i.position.add(Vo.setFromMatrixPosition(i.parent.matrixWorld)),n.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),n.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),n.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.parent&&i.position.sub(Vo.setFromMatrixPosition(i.parent.matrixWorld))));else if(r==="scale"){if(n.search("XYZ")!==-1){let o=this.pointEnd.length()/this.pointStart.length();this.pointEnd.dot(this.pointStart)<0&&(o*=-1),gh.set(o,o,o)}else Vo.copy(this.pointStart),gh.copy(this.pointEnd),Vo.applyQuaternion(this._worldQuaternionInv),gh.applyQuaternion(this._worldQuaternionInv),gh.divide(Vo),n.search("X")===-1&&(gh.x=1),n.search("Y")===-1&&(gh.y=1),n.search("Z")===-1&&(gh.z=1);i.scale.copy(this._scaleStart).multiply(gh),this.scaleSnap&&(n.search("X")!==-1&&(i.scale.x=Math.round(i.scale.x/this.scaleSnap)*this.scaleSnap||this.scaleSnap),n.search("Y")!==-1&&(i.scale.y=Math.round(i.scale.y/this.scaleSnap)*this.scaleSnap||this.scaleSnap),n.search("Z")!==-1&&(i.scale.z=Math.round(i.scale.z/this.scaleSnap)*this.scaleSnap||this.scaleSnap))}else if(r==="rotate"){this._offset.copy(this.pointEnd).sub(this.pointStart);const o=20/this.worldPosition.distanceTo(Vo.setFromMatrixPosition(this.camera.matrixWorld));n==="E"?(this.rotationAxis.copy(this.eye),this.rotationAngle=this.pointEnd.angleTo(this.pointStart),this._startNorm.copy(this.pointStart).normalize(),this._endNorm.copy(this.pointEnd).normalize(),this.rotationAngle*=this._endNorm.cross(this._startNorm).dot(this.eye)<0?1:-1):n==="XYZE"?(this.rotationAxis.copy(this._offset).cross(this.eye).normalize(),this.rotationAngle=this._offset.dot(Vo.copy(this.rotationAxis).cross(this.eye))*o):(n==="X"||n==="Y"||n==="Z")&&(this.rotationAxis.copy(T$[n]),Vo.copy(T$[n]),s==="local"&&Vo.applyQuaternion(this.worldQuaternion),this.rotationAngle=this._offset.dot(Vo.cross(this.eye).normalize())*o),this.rotationSnap&&(this.rotationAngle=Math.round(this.rotationAngle/this.rotationSnap)*this.rotationSnap),s==="local"&&n!=="E"&&n!=="XYZE"?(i.quaternion.copy(this._quaternionStart),i.quaternion.multiply(fi.setFromAxisAngle(this.rotationAxis,this.rotationAngle)).normalize()):(this.rotationAxis.applyQuaternion(this._parentQuaternionInv),i.quaternion.copy(fi.setFromAxisAngle(this.rotationAxis,this.rotationAngle)),i.quaternion.multiply(this._quaternionStart).normalize())}this.dispatchEvent(HI),this.dispatchEvent(M$)}}pointerUp(e){e.button===0&&(this.dragging&&this.axis!==null&&(E$.mode=this.mode,this.dispatchEvent(E$)),this.dragging=!1,this.axis=null)}dispose(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerHover),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.traverse(function(e){e.geometry&&e.geometry.dispose(),e.material&&e.material.dispose()})}attach(e){return this.object=e,this.visible=!0,this}detach(){return this.object=void 0,this.visible=!1,this.axis=null,this}reset(){this.enabled&&this.dragging&&(this.object.position.copy(this._positionStart),this.object.quaternion.copy(this._quaternionStart),this.object.scale.copy(this._scaleStart),this.dispatchEvent(HI),this.dispatchEvent(M$),this.pointStart.copy(this.pointEnd))}getRaycaster(){return jm}getMode(){return this.mode}setMode(e){this.mode=e}setTranslationSnap(e){this.translationSnap=e}setRotationSnap(e){this.rotationSnap=e}setScaleSnap(e){this.scaleSnap=e}setSize(e){this.size=e}setSpace(e){this.space=e}update(){console.warn("THREE.TransformControls: update function has no more functionality and therefore has been deprecated.")}}y0e.prototype.isTransformControls=!0;function I0t(t){if(this.domElement.ownerDocument.pointerLockElement)return{x:0,y:0,button:t.button};{const e=this.domElement.getBoundingClientRect();return{x:(t.clientX-e.left)/e.width*2-1,y:-(t.clientY-e.top)/e.height*2+1,button:t.button}}}function U0t(t){if(this.enabled)switch(t.pointerType){case"mouse":case"pen":this.pointerHover(this._getPointer(t));break}}function N0t(t){this.enabled&&(document.pointerLockElement||this.domElement.setPointerCapture(t.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.pointerHover(this._getPointer(t)),this.pointerDown(this._getPointer(t)))}function L0t(t){this.enabled&&this.pointerMove(this._getPointer(t))}function X0t(t){this.enabled&&(this.domElement.releasePointerCapture(t.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.pointerUp(this._getPointer(t)))}function QI(t,e,n){const r=e.intersectObject(t,!0);for(let i=0;i.9&&(a.visible=!1)),this.axis==="Y"&&(fi.setFromEuler(uE.set(0,0,Math.PI/2)),a.quaternion.copy(r).multiply(fi),Math.abs(Kr.copy(ev).applyQuaternion(r).dot(this.eye))>.9&&(a.visible=!1)),this.axis==="Z"&&(fi.setFromEuler(uE.set(0,Math.PI/2,0)),a.quaternion.copy(r).multiply(fi),Math.abs(Kr.copy(w3).applyQuaternion(r).dot(this.eye))>.9&&(a.visible=!1)),this.axis==="XYZE"&&(fi.setFromEuler(uE.set(0,Math.PI/2,0)),Kr.copy(this.rotationAxis),a.quaternion.setFromRotationMatrix(R$.lookAt(P$,Kr,ev)),a.quaternion.multiply(fi),a.visible=this.dragging),this.axis==="E"&&(a.visible=!1)):a.name==="START"?(a.position.copy(this.worldPositionStart),a.visible=this.dragging):a.name==="END"?(a.position.copy(this.worldPosition),a.visible=this.dragging):a.name==="DELTA"?(a.position.copy(this.worldPositionStart),a.quaternion.copy(this.worldQuaternionStart),Vo.set(1e-10,1e-10,1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1),Vo.applyQuaternion(this.worldQuaternionStart.clone().invert()),a.scale.copy(Vo),a.visible=this.dragging):(a.quaternion.copy(r),this.dragging?a.position.copy(this.worldPositionStart):a.position.copy(this.worldPosition),this.axis&&(a.visible=this.axis.search(a.name)!==-1));continue}a.quaternion.copy(r),this.mode==="translate"||this.mode==="scale"?(a.name==="X"&&Math.abs(Kr.copy(T3).applyQuaternion(r).dot(this.eye))>.99&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="Y"&&Math.abs(Kr.copy(ev).applyQuaternion(r).dot(this.eye))>.99&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="Z"&&Math.abs(Kr.copy(w3).applyQuaternion(r).dot(this.eye))>.99&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="XY"&&Math.abs(Kr.copy(w3).applyQuaternion(r).dot(this.eye))<.2&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="YZ"&&Math.abs(Kr.copy(T3).applyQuaternion(r).dot(this.eye))<.2&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="XZ"&&Math.abs(Kr.copy(ev).applyQuaternion(r).dot(this.eye))<.2&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1)):this.mode==="rotate"&&(cE.copy(r),Kr.copy(this.eye).applyQuaternion(fi.copy(r).invert()),a.name.search("E")!==-1&&a.quaternion.setFromRotationMatrix(R$.lookAt(this.eye,P$,ev)),a.name==="X"&&(fi.setFromAxisAngle(T3,Math.atan2(-Kr.y,Kr.z)),fi.multiplyQuaternions(cE,fi),a.quaternion.copy(fi)),a.name==="Y"&&(fi.setFromAxisAngle(ev,Math.atan2(Kr.x,Kr.z)),fi.multiplyQuaternions(cE,fi),a.quaternion.copy(fi)),a.name==="Z"&&(fi.setFromAxisAngle(w3,Math.atan2(Kr.y,Kr.x)),fi.multiplyQuaternions(cE,fi),a.quaternion.copy(fi))),a.visible=a.visible&&(a.name.indexOf("X")===-1||this.showX),a.visible=a.visible&&(a.name.indexOf("Y")===-1||this.showY),a.visible=a.visible&&(a.name.indexOf("Z")===-1||this.showZ),a.visible=a.visible&&(a.name.indexOf("E")===-1||this.showX&&this.showY&&this.showZ),a.material._color=a.material._color||a.material.color.clone(),a.material._opacity=a.material._opacity||a.material.opacity,a.material.color.copy(a.material._color),a.material.opacity=a.material._opacity,this.enabled&&this.axis&&(a.name===this.axis||this.axis.split("").some(function(l){return a.name===l}))&&(a.material.color.setHex(16776960),a.material.opacity=1)}super.updateMatrixWorld(e)}}S0e.prototype.isTransformControlsGizmo=!0;class x0e extends ut{constructor(){super(new ao(1e5,1e5,2,2),new ho({visible:!1,wireframe:!0,side:rn,transparent:!0,opacity:.1,toneMapped:!1})),this.type="TransformControlsPlane"}updateMatrixWorld(e){let n=this.space;switch(this.position.copy(this.worldPosition),this.mode==="scale"&&(n="local"),dE.copy(T3).applyQuaternion(n==="local"?this.worldQuaternion:Y7),e3.copy(ev).applyQuaternion(n==="local"?this.worldQuaternion:Y7),t3.copy(w3).applyQuaternion(n==="local"?this.worldQuaternion:Y7),Kr.copy(e3),this.mode){case"translate":case"scale":switch(this.axis){case"X":Kr.copy(this.eye).cross(dE),fc.copy(dE).cross(Kr);break;case"Y":Kr.copy(this.eye).cross(e3),fc.copy(e3).cross(Kr);break;case"Z":Kr.copy(this.eye).cross(t3),fc.copy(t3).cross(Kr);break;case"XY":fc.copy(t3);break;case"YZ":fc.copy(dE);break;case"XZ":Kr.copy(t3),fc.copy(e3);break;case"XYZ":case"E":fc.set(0,0,0);break}break;case"rotate":default:fc.set(0,0,0)}fc.length()===0?this.quaternion.copy(this.cameraQuaternion):(V$.lookAt(Vo.set(0,0,0),fc,Kr),this.quaternion.setFromRotationMatrix(V$)),super.updateMatrixWorld(e)}}x0e.prototype.isTransformControlsPlane=!0;var C0t=function(){function t(n,r){var i=r.length,s,a;return i>=2?(s=r.slice(0,i/2),a=r.slice(i/2,i),e(n,t(n,s),t(n,a))):r.slice()}function e(n,r,i){for(var s=[],a=r.length,o=i.length;a>0&&o>0;)n(r[0],i[0])<=0?(s.push(r.shift()),a--):(s.push(i.shift()),o--);return a>0?s.push.apply(s,r):s.push.apply(s,i),s}return t}(),K0t=function(){function t(e,n,r){var i,s;for(i=0,s=n.length;i0);i++);return i}return t}(),T0e,w0e;T0e=C0t;w0e=K0t;var q0t=function(){var t;t={};function e(l){return function(){return l}}function n(l){l=l||{},this.config=l,this.config.childrenPropertyName=l.childrenPropertyName||"children",this.config.modelComparatorFn=l.modelComparatorFn}function r(l,u){return u.parent=l,l.children.push(u),u}function i(l,u){this.config=l,this.model=u,this.children=[]}n.prototype.parse=function(l){var u,c,d;if(!(l instanceof Object))throw new TypeError("Model must be of type object.");if(d=new i(this.config,l),l[this.config.childrenPropertyName]instanceof Array)for(this.config.modelComparatorFn&&(l[this.config.childrenPropertyName]=T0e(this.config.modelComparatorFn,l[this.config.childrenPropertyName])),u=0,c=l[this.config.childrenPropertyName].length;u0};function a(l,u,c){var d;if(!(u instanceof i))throw new TypeError("Child must be of type Node.");if(u.parent=l,l.model[l.config.childrenPropertyName]instanceof Array||(l.model[l.config.childrenPropertyName]=[]),s(l))d=w0e(l.config.modelComparatorFn,l.model[l.config.childrenPropertyName],u.model),l.model[l.config.childrenPropertyName].splice(d,0,u.model),l.children.splice(d,0,u);else if(c===void 0)l.model[l.config.childrenPropertyName].push(u.model),l.children.push(u);else{if(c<0||c>l.children.length)throw new Error("Invalid index.");l.model[l.config.childrenPropertyName].splice(c,0,u.model),l.children.splice(c,0,u)}return u}i.prototype.addChild=function(l){return a(this,l)},i.prototype.addChildAtIndex=function(l,u){if(s(this))throw new Error("Cannot add child at index when using a comparator function.");return a(this,l,u)},i.prototype.setIndex=function(l){if(s(this))throw new Error("Cannot set node index when using a comparator function.");if(this.isRoot()){if(l===0)return this;throw new Error("Invalid index.")}if(l<0||l>=this.parent.children.length)throw new Error("Invalid index.");var u=this.parent.children.indexOf(this);return this.parent.children.splice(l,0,this.parent.children.splice(u,1)[0]),this.parent.model[this.parent.config.childrenPropertyName].splice(l,0,this.parent.model[this.parent.config.childrenPropertyName].splice(u,1)[0]),this},i.prototype.getPath=function(){var l=[];return function u(c){l.unshift(c),c.isRoot()||u(c.parent)}(this),l},i.prototype.getIndex=function(){return this.isRoot()?0:this.parent.children.indexOf(this)};function o(){var l={};if(arguments.length===1?typeof arguments[0]=="function"?l.fn=arguments[0]:l.options=arguments[0]:arguments.length===2?typeof arguments[0]=="function"?(l.fn=arguments[0],l.ctx=arguments[1]):(l.options=arguments[0],l.fn=arguments[1]):(l.options=arguments[0],l.fn=arguments[1],l.ctx=arguments[2]),l.options=l.options||{},l.options.strategy||(l.options.strategy="pre"),!t[l.options.strategy])throw new Error("Unknown tree walk strategy. Valid strategies are 'pre' [default], 'post' and 'breadth'.");return l}return i.prototype.walk=function(){var l;l=o.apply(this,arguments),t[l.options.strategy].call(this,l.fn,l.ctx)},t.pre=function l(u,c){var d,f,h;for(h=u.call(c,this),d=0,f=this.children.length;d=0&&n<=Z0t}}function K0e(t){return function(e){return e==null?void 0:e[t]}}const FP=K0e("byteLength"),ngt=C0e(FP);var rgt=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;function igt(t){return U$?U$(t)&&!GP(t):ngt(t)&&rgt.test(I6.call(t))}const q0e=M0e?igt:X0e(!1),Ao=K0e("length");function sgt(t){for(var e={},n=t.length,r=0;r":">",'"':""","'":"'","`":"`"},wgt=ege(tge),Egt=Z0e(tge),Mgt=ege(Egt),Pgt=Sr.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var _I=/(.)^/,Rgt={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Vgt=/\\|'|\r|\n|\u2028|\u2029/g;function zgt(t){return"\\"+Rgt[t]}var kgt=/^\s*(\w|\$)+\s*$/;function Ogt(t,e,n){!e&&n&&(e=n),e=Y0e({},e,Sr.templateSettings);var r=RegExp([(e.escape||_I).source,(e.interpolate||_I).source,(e.evaluate||_I).source].join("|")+"|$","g"),i=0,s="__p+='";t.replace(r,function(u,c,d,f,h){return s+=t.slice(i,h).replace(Vgt,zgt),i=h+u.length,c?s+=`'+ + }`},Nb={createSampleWeights:function(t,e){const n=[];for(let r=0;r<=t;r++)n.push(I0t(r,e));return n},createSampleOffsets:function(t,e){const n=[];for(let r=0;r<=t;r++)n.push(e.clone().multiplyScalar(r));return n},configure:function(t,e,n,r){t.defines.KERNEL_RADIUS=e,t.uniforms.sampleUvOffsets.value=Nb.createSampleOffsets(e,r),t.uniforms.sampleWeights.value=Nb.createSampleWeights(e,n),t.needsUpdate=!0}};function I0t(t,e){return Math.exp(-(t*t)/(2*(e*e)))/(Math.sqrt(2*Math.PI)*e)}class y${constructor(e=Math){this.grad3=[[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0],[1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1],[0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]],this.grad4=[[0,1,1,1],[0,1,1,-1],[0,1,-1,1],[0,1,-1,-1],[0,-1,1,1],[0,-1,1,-1],[0,-1,-1,1],[0,-1,-1,-1],[1,0,1,1],[1,0,1,-1],[1,0,-1,1],[1,0,-1,-1],[-1,0,1,1],[-1,0,1,-1],[-1,0,-1,1],[-1,0,-1,-1],[1,1,0,1],[1,1,0,-1],[1,-1,0,1],[1,-1,0,-1],[-1,1,0,1],[-1,1,0,-1],[-1,-1,0,1],[-1,-1,0,-1],[1,1,1,0],[1,1,-1,0],[1,-1,1,0],[1,-1,-1,0],[-1,1,1,0],[-1,1,-1,0],[-1,-1,1,0],[-1,-1,-1,0]],this.p=[];for(let n=0;n<256;n++)this.p[n]=Math.floor(e.random()*256);this.perm=[];for(let n=0;n<512;n++)this.perm[n]=this.p[n&255];this.simplex=[[0,1,2,3],[0,1,3,2],[0,0,0,0],[0,2,3,1],[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,2,3,0],[0,2,1,3],[0,0,0,0],[0,3,1,2],[0,3,2,1],[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,3,2,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,2,0,3],[0,0,0,0],[1,3,0,2],[0,0,0,0],[0,0,0,0],[0,0,0,0],[2,3,0,1],[2,3,1,0],[1,0,2,3],[1,0,3,2],[0,0,0,0],[0,0,0,0],[0,0,0,0],[2,0,3,1],[0,0,0,0],[2,1,3,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],[2,0,1,3],[0,0,0,0],[0,0,0,0],[0,0,0,0],[3,0,1,2],[3,0,2,1],[0,0,0,0],[3,1,2,0],[2,1,0,3],[0,0,0,0],[0,0,0,0],[0,0,0,0],[3,1,0,2],[0,0,0,0],[3,2,0,1],[3,2,1,0]]}dot(e,n,r){return e[0]*n+e[1]*r}dot3(e,n,r,i){return e[0]*n+e[1]*r+e[2]*i}dot4(e,n,r,i,s){return e[0]*n+e[1]*r+e[2]*i+e[3]*s}noise(e,n){let r,i,s;const a=.5*(Math.sqrt(3)-1),o=(e+n)*a,l=Math.floor(e+o),u=Math.floor(n+o),c=(3-Math.sqrt(3))/6,d=(l+u)*c,f=l-d,h=u-d,p=e-f,m=n-h;let v,g;p>m?(v=1,g=0):(v=0,g=1);const b=p-v+c,y=m-g+c,x=p-1+2*c,T=m-1+2*c,M=l&255,E=u&255,S=this.perm[M+this.perm[E]]%12,P=this.perm[M+v+this.perm[E+g]]%12,R=this.perm[M+1+this.perm[E+1]]%12;let V=.5-p*p-m*m;V<0?r=0:(V*=V,r=V*V*this.dot(this.grad3[S],p,m));let z=.5-b*b-y*y;z<0?i=0:(z*=z,i=z*z*this.dot(this.grad3[P],b,y));let k=.5-x*x-T*T;return k<0?s=0:(k*=k,s=k*k*this.dot(this.grad3[R],x,T)),70*(r+i+s)}noise3d(e,n,r){let i,s,a,o;const l=.3333333333333333,u=(e+n+r)*l,c=Math.floor(e+u),d=Math.floor(n+u),f=Math.floor(r+u),h=1/6,p=(c+d+f)*h,m=c-p,v=d-p,g=f-p,b=e-m,y=n-v,x=r-g;let T,M,E,S,P,R;b>=y?y>=x?(T=1,M=0,E=0,S=1,P=1,R=0):b>=x?(T=1,M=0,E=0,S=1,P=0,R=1):(T=0,M=0,E=1,S=1,P=0,R=1):yR?32:0,N=P>V?16:0,q=R>V?8:0,L=P>z?4:0,A=R>z?2:0,J=V>z?1:0,F=k+N+q+L+A+J,ne=a[F][0]>=3?1:0,j=a[F][1]>=3?1:0,Z=a[F][2]>=3?1:0,_=a[F][3]>=3?1:0,le=a[F][0]>=2?1:0,fe=a[F][1]>=2?1:0,te=a[F][2]>=2?1:0,$=a[F][3]>=2?1:0,oe=a[F][0]>=1?1:0,ge=a[F][1]>=1?1:0,ve=a[F][2]>=1?1:0,Ke=a[F][3]>=1?1:0,ue=P-ne+u,D=R-j+u,G=V-Z+u,re=z-_+u,de=P-le+2*u,Te=R-fe+2*u,he=V-te+2*u,ye=z-$+2*u,we=P-oe+3*u,se=R-ge+3*u,W=V-ve+3*u,K=z-Ke+3*u,ie=P-1+4*u,me=R-1+4*u,We=V-1+4*u,Ce=z-1+4*u,Ae=v&255,Y=g&255,ce=b&255,be=y&255,Se=o[Ae+o[Y+o[ce+o[be]]]]%32,Q=o[Ae+ne+o[Y+j+o[ce+Z+o[be+_]]]]%32,Pe=o[Ae+le+o[Y+fe+o[ce+te+o[be+$]]]]%32,Ve=o[Ae+oe+o[Y+ge+o[ce+ve+o[be+Ke]]]]%32,Fe=o[Ae+1+o[Y+1+o[ce+1+o[be+1]]]]%32;let je=.6-P*P-R*R-V*V-z*z;je<0?c=0:(je*=je,c=je*je*this.dot4(s[Se],P,R,V,z));let Ze=.6-ue*ue-D*D-G*G-re*re;Ze<0?d=0:(Ze*=Ze,d=Ze*Ze*this.dot4(s[Q],ue,D,G,re));let Re=.6-de*de-Te*Te-he*he-ye*ye;Re<0?f=0:(Re*=Re,f=Re*Re*this.dot4(s[Pe],de,Te,he,ye));let Me=.6-we*we-se*se-W*W-K*K;Me<0?h=0:(Me*=Me,h=Me*Me*this.dot4(s[Ve],we,se,W,K));let lt=.6-ie*ie-me*me-We*We-Ce*Ce;return lt<0?p=0:(lt*=lt,p=lt*lt*this.dot4(s[Fe],ie,me,We,Ce)),27*(c+d+f+h+p)}}const jm=new yy,Ro=new U,gh=new U,fi=new Or,S$={X:new U(1,0,0),Y:new U(0,1,0),Z:new U(0,0,1)},HI={type:"change"},x$={type:"mouseDown"},T$={type:"mouseUp",mode:null},w$={type:"objectChange"};class b0e extends cn{constructor(e,n){super(),n===void 0&&(console.warn('THREE.TransformControls: The second parameter "domElement" is now mandatory.'),n=document),this.visible=!1,this.domElement=n,this.domElement.style.touchAction="none";const r=new y0e;this._gizmo=r,this.add(r);const i=new S0e;this._plane=i,this.add(i);const s=this;function a(b,y){let x=y;Object.defineProperty(s,b,{get:function(){return x!==void 0?x:y},set:function(T){x!==T&&(x=T,i[b]=T,r[b]=T,s.dispatchEvent({type:b+"-changed",value:T}),s.dispatchEvent(HI))}}),s[b]=y,i[b]=y,r[b]=y}a("camera",e),a("object",void 0),a("enabled",!0),a("axis",null),a("mode","translate"),a("translationSnap",null),a("rotationSnap",null),a("scaleSnap",null),a("space","world"),a("size",1),a("dragging",!1),a("showX",!0),a("showY",!0),a("showZ",!0);const o=new U,l=new U,u=new Or,c=new Or,d=new U,f=new Or,h=new U,p=new U,m=new U,v=0,g=new U;a("worldPosition",o),a("worldPositionStart",l),a("worldQuaternion",u),a("worldQuaternionStart",c),a("cameraPosition",d),a("cameraQuaternion",f),a("pointStart",h),a("pointEnd",p),a("rotationAxis",m),a("rotationAngle",v),a("eye",g),this._offset=new U,this._startNorm=new U,this._endNorm=new U,this._cameraScale=new U,this._parentPosition=new U,this._parentQuaternion=new Or,this._parentQuaternionInv=new Or,this._parentScale=new U,this._worldScaleStart=new U,this._worldQuaternionInv=new Or,this._worldScale=new U,this._positionStart=new U,this._quaternionStart=new Or,this._scaleStart=new U,this._getPointer=U0t.bind(this),this._onPointerDown=L0t.bind(this),this._onPointerHover=N0t.bind(this),this._onPointerMove=X0t.bind(this),this._onPointerUp=C0t.bind(this),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointermove",this._onPointerHover),this.domElement.addEventListener("pointerup",this._onPointerUp)}updateMatrixWorld(){this.object!==void 0&&(this.object.updateMatrixWorld(),this.object.parent===null?console.error("TransformControls: The attached 3D object must be a part of the scene graph."):this.object.parent.matrixWorld.decompose(this._parentPosition,this._parentQuaternion,this._parentScale),this.object.matrixWorld.decompose(this.worldPosition,this.worldQuaternion,this._worldScale),this._parentQuaternionInv.copy(this._parentQuaternion).invert(),this._worldQuaternionInv.copy(this.worldQuaternion).invert()),this.camera.updateMatrixWorld(),this.camera.matrixWorld.decompose(this.cameraPosition,this.cameraQuaternion,this._cameraScale),this.eye.copy(this.cameraPosition).sub(this.worldPosition).normalize(),super.updateMatrixWorld(this)}pointerHover(e){if(this.object===void 0||this.dragging===!0)return;jm.setFromCamera(e,this.camera);const n=QI(this._gizmo.picker[this.mode],jm);n?this.axis=n.object.name:this.axis=null}pointerDown(e){if(!(this.object===void 0||this.dragging===!0||e.button!==0)&&this.axis!==null){jm.setFromCamera(e,this.camera);const n=QI(this._plane,jm,!0);n&&(this.object.updateMatrixWorld(),this.object.parent.updateMatrixWorld(),this._positionStart.copy(this.object.position),this._quaternionStart.copy(this.object.quaternion),this._scaleStart.copy(this.object.scale),this.object.matrixWorld.decompose(this.worldPositionStart,this.worldQuaternionStart,this._worldScaleStart),this.pointStart.copy(n.point).sub(this.worldPositionStart)),this.dragging=!0,x$.mode=this.mode,this.dispatchEvent(x$)}}pointerMove(e){const n=this.axis,r=this.mode,i=this.object;let s=this.space;if(r==="scale"?s="local":(n==="E"||n==="XYZE"||n==="XYZ")&&(s="world"),i===void 0||n===null||this.dragging===!1||e.button!==-1)return;jm.setFromCamera(e,this.camera);const a=QI(this._plane,jm,!0);if(a){if(this.pointEnd.copy(a.point).sub(this.worldPositionStart),r==="translate")this._offset.copy(this.pointEnd).sub(this.pointStart),s==="local"&&n!=="XYZ"&&this._offset.applyQuaternion(this._worldQuaternionInv),n.indexOf("X")===-1&&(this._offset.x=0),n.indexOf("Y")===-1&&(this._offset.y=0),n.indexOf("Z")===-1&&(this._offset.z=0),s==="local"&&n!=="XYZ"?this._offset.applyQuaternion(this._quaternionStart).divide(this._parentScale):this._offset.applyQuaternion(this._parentQuaternionInv).divide(this._parentScale),i.position.copy(this._offset).add(this._positionStart),this.translationSnap&&(s==="local"&&(i.position.applyQuaternion(fi.copy(this._quaternionStart).invert()),n.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),n.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),n.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.position.applyQuaternion(this._quaternionStart)),s==="world"&&(i.parent&&i.position.add(Ro.setFromMatrixPosition(i.parent.matrixWorld)),n.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),n.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),n.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.parent&&i.position.sub(Ro.setFromMatrixPosition(i.parent.matrixWorld))));else if(r==="scale"){if(n.search("XYZ")!==-1){let o=this.pointEnd.length()/this.pointStart.length();this.pointEnd.dot(this.pointStart)<0&&(o*=-1),gh.set(o,o,o)}else Ro.copy(this.pointStart),gh.copy(this.pointEnd),Ro.applyQuaternion(this._worldQuaternionInv),gh.applyQuaternion(this._worldQuaternionInv),gh.divide(Ro),n.search("X")===-1&&(gh.x=1),n.search("Y")===-1&&(gh.y=1),n.search("Z")===-1&&(gh.z=1);i.scale.copy(this._scaleStart).multiply(gh),this.scaleSnap&&(n.search("X")!==-1&&(i.scale.x=Math.round(i.scale.x/this.scaleSnap)*this.scaleSnap||this.scaleSnap),n.search("Y")!==-1&&(i.scale.y=Math.round(i.scale.y/this.scaleSnap)*this.scaleSnap||this.scaleSnap),n.search("Z")!==-1&&(i.scale.z=Math.round(i.scale.z/this.scaleSnap)*this.scaleSnap||this.scaleSnap))}else if(r==="rotate"){this._offset.copy(this.pointEnd).sub(this.pointStart);const o=20/this.worldPosition.distanceTo(Ro.setFromMatrixPosition(this.camera.matrixWorld));n==="E"?(this.rotationAxis.copy(this.eye),this.rotationAngle=this.pointEnd.angleTo(this.pointStart),this._startNorm.copy(this.pointStart).normalize(),this._endNorm.copy(this.pointEnd).normalize(),this.rotationAngle*=this._endNorm.cross(this._startNorm).dot(this.eye)<0?1:-1):n==="XYZE"?(this.rotationAxis.copy(this._offset).cross(this.eye).normalize(),this.rotationAngle=this._offset.dot(Ro.copy(this.rotationAxis).cross(this.eye))*o):(n==="X"||n==="Y"||n==="Z")&&(this.rotationAxis.copy(S$[n]),Ro.copy(S$[n]),s==="local"&&Ro.applyQuaternion(this.worldQuaternion),this.rotationAngle=this._offset.dot(Ro.cross(this.eye).normalize())*o),this.rotationSnap&&(this.rotationAngle=Math.round(this.rotationAngle/this.rotationSnap)*this.rotationSnap),s==="local"&&n!=="E"&&n!=="XYZE"?(i.quaternion.copy(this._quaternionStart),i.quaternion.multiply(fi.setFromAxisAngle(this.rotationAxis,this.rotationAngle)).normalize()):(this.rotationAxis.applyQuaternion(this._parentQuaternionInv),i.quaternion.copy(fi.setFromAxisAngle(this.rotationAxis,this.rotationAngle)),i.quaternion.multiply(this._quaternionStart).normalize())}this.dispatchEvent(HI),this.dispatchEvent(w$)}}pointerUp(e){e.button===0&&(this.dragging&&this.axis!==null&&(T$.mode=this.mode,this.dispatchEvent(T$)),this.dragging=!1,this.axis=null)}dispose(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerHover),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.traverse(function(e){e.geometry&&e.geometry.dispose(),e.material&&e.material.dispose()})}attach(e){return this.object=e,this.visible=!0,this}detach(){return this.object=void 0,this.visible=!1,this.axis=null,this}reset(){this.enabled&&this.dragging&&(this.object.position.copy(this._positionStart),this.object.quaternion.copy(this._quaternionStart),this.object.scale.copy(this._scaleStart),this.dispatchEvent(HI),this.dispatchEvent(w$),this.pointStart.copy(this.pointEnd))}getRaycaster(){return jm}getMode(){return this.mode}setMode(e){this.mode=e}setTranslationSnap(e){this.translationSnap=e}setRotationSnap(e){this.rotationSnap=e}setScaleSnap(e){this.scaleSnap=e}setSize(e){this.size=e}setSpace(e){this.space=e}update(){console.warn("THREE.TransformControls: update function has no more functionality and therefore has been deprecated.")}}b0e.prototype.isTransformControls=!0;function U0t(t){if(this.domElement.ownerDocument.pointerLockElement)return{x:0,y:0,button:t.button};{const e=this.domElement.getBoundingClientRect();return{x:(t.clientX-e.left)/e.width*2-1,y:-(t.clientY-e.top)/e.height*2+1,button:t.button}}}function N0t(t){if(this.enabled)switch(t.pointerType){case"mouse":case"pen":this.pointerHover(this._getPointer(t));break}}function L0t(t){this.enabled&&(document.pointerLockElement||this.domElement.setPointerCapture(t.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.pointerHover(this._getPointer(t)),this.pointerDown(this._getPointer(t)))}function X0t(t){this.enabled&&this.pointerMove(this._getPointer(t))}function C0t(t){this.enabled&&(this.domElement.releasePointerCapture(t.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.pointerUp(this._getPointer(t)))}function QI(t,e,n){const r=e.intersectObject(t,!0);for(let i=0;i.9&&(a.visible=!1)),this.axis==="Y"&&(fi.setFromEuler(uE.set(0,0,Math.PI/2)),a.quaternion.copy(r).multiply(fi),Math.abs(Kr.copy(ev).applyQuaternion(r).dot(this.eye))>.9&&(a.visible=!1)),this.axis==="Z"&&(fi.setFromEuler(uE.set(0,Math.PI/2,0)),a.quaternion.copy(r).multiply(fi),Math.abs(Kr.copy(T3).applyQuaternion(r).dot(this.eye))>.9&&(a.visible=!1)),this.axis==="XYZE"&&(fi.setFromEuler(uE.set(0,Math.PI/2,0)),Kr.copy(this.rotationAxis),a.quaternion.setFromRotationMatrix(M$.lookAt(E$,Kr,ev)),a.quaternion.multiply(fi),a.visible=this.dragging),this.axis==="E"&&(a.visible=!1)):a.name==="START"?(a.position.copy(this.worldPositionStart),a.visible=this.dragging):a.name==="END"?(a.position.copy(this.worldPosition),a.visible=this.dragging):a.name==="DELTA"?(a.position.copy(this.worldPositionStart),a.quaternion.copy(this.worldQuaternionStart),Ro.set(1e-10,1e-10,1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1),Ro.applyQuaternion(this.worldQuaternionStart.clone().invert()),a.scale.copy(Ro),a.visible=this.dragging):(a.quaternion.copy(r),this.dragging?a.position.copy(this.worldPositionStart):a.position.copy(this.worldPosition),this.axis&&(a.visible=this.axis.search(a.name)!==-1));continue}a.quaternion.copy(r),this.mode==="translate"||this.mode==="scale"?(a.name==="X"&&Math.abs(Kr.copy(x3).applyQuaternion(r).dot(this.eye))>.99&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="Y"&&Math.abs(Kr.copy(ev).applyQuaternion(r).dot(this.eye))>.99&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="Z"&&Math.abs(Kr.copy(T3).applyQuaternion(r).dot(this.eye))>.99&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="XY"&&Math.abs(Kr.copy(T3).applyQuaternion(r).dot(this.eye))<.2&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="YZ"&&Math.abs(Kr.copy(x3).applyQuaternion(r).dot(this.eye))<.2&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="XZ"&&Math.abs(Kr.copy(ev).applyQuaternion(r).dot(this.eye))<.2&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1)):this.mode==="rotate"&&(cE.copy(r),Kr.copy(this.eye).applyQuaternion(fi.copy(r).invert()),a.name.search("E")!==-1&&a.quaternion.setFromRotationMatrix(M$.lookAt(this.eye,E$,ev)),a.name==="X"&&(fi.setFromAxisAngle(x3,Math.atan2(-Kr.y,Kr.z)),fi.multiplyQuaternions(cE,fi),a.quaternion.copy(fi)),a.name==="Y"&&(fi.setFromAxisAngle(ev,Math.atan2(Kr.x,Kr.z)),fi.multiplyQuaternions(cE,fi),a.quaternion.copy(fi)),a.name==="Z"&&(fi.setFromAxisAngle(T3,Math.atan2(Kr.y,Kr.x)),fi.multiplyQuaternions(cE,fi),a.quaternion.copy(fi))),a.visible=a.visible&&(a.name.indexOf("X")===-1||this.showX),a.visible=a.visible&&(a.name.indexOf("Y")===-1||this.showY),a.visible=a.visible&&(a.name.indexOf("Z")===-1||this.showZ),a.visible=a.visible&&(a.name.indexOf("E")===-1||this.showX&&this.showY&&this.showZ),a.material._color=a.material._color||a.material.color.clone(),a.material._opacity=a.material._opacity||a.material.opacity,a.material.color.copy(a.material._color),a.material.opacity=a.material._opacity,this.enabled&&this.axis&&(a.name===this.axis||this.axis.split("").some(function(l){return a.name===l}))&&(a.material.color.setHex(16776960),a.material.opacity=1)}super.updateMatrixWorld(e)}}y0e.prototype.isTransformControlsGizmo=!0;class S0e extends ut{constructor(){super(new ao(1e5,1e5,2,2),new fo({visible:!1,wireframe:!0,side:rn,transparent:!0,opacity:.1,toneMapped:!1})),this.type="TransformControlsPlane"}updateMatrixWorld(e){let n=this.space;switch(this.position.copy(this.worldPosition),this.mode==="scale"&&(n="local"),dE.copy(x3).applyQuaternion(n==="local"?this.worldQuaternion:Y7),$S.copy(ev).applyQuaternion(n==="local"?this.worldQuaternion:Y7),e3.copy(T3).applyQuaternion(n==="local"?this.worldQuaternion:Y7),Kr.copy($S),this.mode){case"translate":case"scale":switch(this.axis){case"X":Kr.copy(this.eye).cross(dE),fc.copy(dE).cross(Kr);break;case"Y":Kr.copy(this.eye).cross($S),fc.copy($S).cross(Kr);break;case"Z":Kr.copy(this.eye).cross(e3),fc.copy(e3).cross(Kr);break;case"XY":fc.copy(e3);break;case"YZ":fc.copy(dE);break;case"XZ":Kr.copy(e3),fc.copy($S);break;case"XYZ":case"E":fc.set(0,0,0);break}break;case"rotate":default:fc.set(0,0,0)}fc.length()===0?this.quaternion.copy(this.cameraQuaternion):(P$.lookAt(Ro.set(0,0,0),fc,Kr),this.quaternion.setFromRotationMatrix(P$)),super.updateMatrixWorld(e)}}S0e.prototype.isTransformControlsPlane=!0;var K0t=function(){function t(n,r){var i=r.length,s,a;return i>=2?(s=r.slice(0,i/2),a=r.slice(i/2,i),e(n,t(n,s),t(n,a))):r.slice()}function e(n,r,i){for(var s=[],a=r.length,o=i.length;a>0&&o>0;)n(r[0],i[0])<=0?(s.push(r.shift()),a--):(s.push(i.shift()),o--);return a>0?s.push.apply(s,r):s.push.apply(s,i),s}return t}(),q0t=function(){function t(e,n,r){var i,s;for(i=0,s=n.length;i0);i++);return i}return t}(),x0e,T0e;x0e=K0t;T0e=q0t;var D0t=function(){var t;t={};function e(l){return function(){return l}}function n(l){l=l||{},this.config=l,this.config.childrenPropertyName=l.childrenPropertyName||"children",this.config.modelComparatorFn=l.modelComparatorFn}function r(l,u){return u.parent=l,l.children.push(u),u}function i(l,u){this.config=l,this.model=u,this.children=[]}n.prototype.parse=function(l){var u,c,d;if(!(l instanceof Object))throw new TypeError("Model must be of type object.");if(d=new i(this.config,l),l[this.config.childrenPropertyName]instanceof Array)for(this.config.modelComparatorFn&&(l[this.config.childrenPropertyName]=x0e(this.config.modelComparatorFn,l[this.config.childrenPropertyName])),u=0,c=l[this.config.childrenPropertyName].length;u0};function a(l,u,c){var d;if(!(u instanceof i))throw new TypeError("Child must be of type Node.");if(u.parent=l,l.model[l.config.childrenPropertyName]instanceof Array||(l.model[l.config.childrenPropertyName]=[]),s(l))d=T0e(l.config.modelComparatorFn,l.model[l.config.childrenPropertyName],u.model),l.model[l.config.childrenPropertyName].splice(d,0,u.model),l.children.splice(d,0,u);else if(c===void 0)l.model[l.config.childrenPropertyName].push(u.model),l.children.push(u);else{if(c<0||c>l.children.length)throw new Error("Invalid index.");l.model[l.config.childrenPropertyName].splice(c,0,u.model),l.children.splice(c,0,u)}return u}i.prototype.addChild=function(l){return a(this,l)},i.prototype.addChildAtIndex=function(l,u){if(s(this))throw new Error("Cannot add child at index when using a comparator function.");return a(this,l,u)},i.prototype.setIndex=function(l){if(s(this))throw new Error("Cannot set node index when using a comparator function.");if(this.isRoot()){if(l===0)return this;throw new Error("Invalid index.")}if(l<0||l>=this.parent.children.length)throw new Error("Invalid index.");var u=this.parent.children.indexOf(this);return this.parent.children.splice(l,0,this.parent.children.splice(u,1)[0]),this.parent.model[this.parent.config.childrenPropertyName].splice(l,0,this.parent.model[this.parent.config.childrenPropertyName].splice(u,1)[0]),this},i.prototype.getPath=function(){var l=[];return function u(c){l.unshift(c),c.isRoot()||u(c.parent)}(this),l},i.prototype.getIndex=function(){return this.isRoot()?0:this.parent.children.indexOf(this)};function o(){var l={};if(arguments.length===1?typeof arguments[0]=="function"?l.fn=arguments[0]:l.options=arguments[0]:arguments.length===2?typeof arguments[0]=="function"?(l.fn=arguments[0],l.ctx=arguments[1]):(l.options=arguments[0],l.fn=arguments[1]):(l.options=arguments[0],l.fn=arguments[1],l.ctx=arguments[2]),l.options=l.options||{},l.options.strategy||(l.options.strategy="pre"),!t[l.options.strategy])throw new Error("Unknown tree walk strategy. Valid strategies are 'pre' [default], 'post' and 'breadth'.");return l}return i.prototype.walk=function(){var l;l=o.apply(this,arguments),t[l.options.strategy].call(this,l.fn,l.ctx)},t.pre=function l(u,c){var d,f,h;for(h=u.call(c,this),d=0,f=this.children.length;d=0&&n<=J0t}}function C0e(t){return function(e){return e==null?void 0:e[t]}}const GP=C0e("byteLength"),rgt=X0e(GP);var igt=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;function sgt(t){return O$?O$(t)&&!AP(t):rgt(t)&&igt.test(O6.call(t))}const K0e=E0e?sgt:L0e(!1),Wo=C0e("length");function agt(t){for(var e={},n=t.length,r=0;r":">",'"':""","'":"'","`":"`"},Egt=$0e(ege),Mgt=j0e(ege),Pgt=$0e(Mgt),Rgt=Sr.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var _I=/(.)^/,Vgt={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},zgt=/\\|'|\r|\n|\u2028|\u2029/g;function kgt(t){return"\\"+Vgt[t]}var Ogt=/^\s*(\w|\$)+\s*$/;function Igt(t,e,n){!e&&n&&(e=n),e=J0e({},e,Sr.templateSettings);var r=RegExp([(e.escape||_I).source,(e.interpolate||_I).source,(e.evaluate||_I).source].join("|")+"|$","g"),i=0,s="__p+='";t.replace(r,function(u,c,d,f,h){return s+=t.slice(i,h).replace(zgt,kgt),i=h+u.length,c?s+=`'+ ((__t=(`+c+`))==null?'':_.escape(__t))+ '`:d?s+=`'+ ((__t=(`+d+`))==null?'':__t)+ '`:f&&(s+=`'; `+f+` __p+='`),u}),s+=`'; -`;var a=e.variable;if(a){if(!kgt.test(a))throw new Error("variable is not a bare identifier: "+a)}else s=`with(obj||{}){ +`;var a=e.variable;if(a){if(!Ogt.test(a))throw new Error("variable is not a bare identifier: "+a)}else s=`with(obj||{}){ `+s+`} `,a="obj";s=`var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');}; `+s+`return __p; `;var o;try{o=new Function(a,"_",s)}catch(u){throw u.source=s,u}var l=function(u){return o.call(this,u,Sr)};return l.source="function("+a+`){ -`+s+"}",l}function Igt(t,e,n){e=aw(e);var r=e.length;if(!r)return co(n)?n.call(t):n;for(var i=0;i1)U0(o,e-1,n,r),i=r.length;else for(var l=0,u=o.length;le?(r&&(clearTimeout(r),r=null),o=c,a=t.apply(i,s),r||(i=s=null)):!r&&n.trailing!==!1&&(r=setTimeout(l,d)),a};return u.cancel=function(){clearTimeout(r),o=0,r=i=s=null},u}function Dgt(t,e,n){var r,i,s,a,o,l=function(){var c=N6()-i;e>c?r=setTimeout(l,e-c):(r=null,n||(a=t.apply(o,s)),r||(s=o=null))},u=Wo(function(c){return o=this,s=c,i=N6(),r||(r=setTimeout(l,e),n&&(a=t.apply(o,s))),a});return u.cancel=function(){clearTimeout(r),r=s=o=null},u}function Wgt(t,e){return Zy(e,t)}function cW(t){return function(){return!t.apply(this,arguments)}}function Agt(){var t=arguments,e=t.length-1;return function(){for(var n=e,r=t[e].apply(this,arguments);n--;)r=t[n].call(this,r);return r}}function Ggt(t,e){return function(){if(--t<1)return e.apply(this,arguments)}}function sge(t,e){var n;return function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=null),n}}const Fgt=Zy(sge,2);function age(t,e,n){e=Yo(e,n);for(var r=Gs(t),i,s=0,a=r.length;s0?0:i-1;s>=0&&s0?a=s>=0?s:Math.max(s+o,a):o=s>=0?Math.min(s+1,o):s+o+1;else if(n&&s&&o)return s=n(r,i),r[s]===i?s:-1;if(i!==i)return s=e(iw.call(r,a,o),L0e),s>=0?s+a:-1;for(s=t>0?a:o-1;s>=0&&s0?0:o-1;for(s||(i=n[a?a[l]:l],l+=t);l>=0&&l=3;return e(n,ow(r,s,4),i,a)}}const $I=fge(1),C$=fge(-1);function Lb(t,e,n){var r=[];return e=Yo(e,n),Vf(t,function(i,s,a){e(i,s,a)&&r.push(i)}),r}function Jgt(t,e,n){return Lb(t,cW(Yo(e)),n)}function K$(t,e,n){e=Yo(e,n);for(var r=!Pl(t)&&Gs(t),i=(r||t).length,s=0;s=0}const Ygt=Wo(function(t,e,n){var r,i;return co(e)?i=e:(e=aw(e),r=e.slice(0,-1),e=e[e.length-1]),Bv(t,function(s){var a=i;if(!a){if(r&&r.length&&(s=aW(s,r)),s==null)return;a=s[e]}return a==null?a:a.apply(s,n)})});function fW(t,e){return Bv(t,lW(e))}function Bgt(t,e){return Lb(t,U6(e))}function hge(t,e,n){var r=-1/0,i=-1/0,s,a;if(e==null||typeof e=="number"&&typeof t[0]!="object"&&t!=null){t=Pl(t)?t:jy(t);for(var o=0,l=t.length;or&&(r=s)}else e=Yo(e,n),Vf(t,function(u,c,d){a=e(u,c,d),(a>i||a===-1/0&&r===-1/0)&&(r=u,i=a)});return r}function Hgt(t,e,n){var r=1/0,i=1/0,s,a;if(e==null||typeof e=="number"&&typeof t[0]!="object"&&t!=null){t=Pl(t)?t:jy(t);for(var o=0,l=t.length;oo||a===void 0)return 1;if(a1&&(r=ow(r,e[1])),e=sw(t)):(r=s1t,e=U0(e,!1,!1),t=Object(t));for(var i=0,s=e.length;i1&&(r=e[1])):(e=Bv(U0(e,!1,!1),String),n=function(i,s){return!lf(e,s)}),vge(t,n,r)});function gge(t,e,n){return iw.call(t,0,Math.max(0,t.length-(e==null||n?1:e)))}function eU(t,e,n){return t==null||t.length<1?e==null||n?void 0:[]:e==null||n?t[0]:gge(t,t.length-e)}function B7(t,e,n){return iw.call(t,e==null||n?1:e)}function o1t(t,e,n){return t==null||t.length<1?e==null||n?void 0:[]:e==null||n?t[t.length-1]:B7(t,Math.max(0,t.length-e))}function l1t(t){return Lb(t,Boolean)}function u1t(t,e){return U0(t,e,!1)}const bge=Wo(function(t,e){return e=U0(e,!0,!0),Lb(t,function(n){return!lf(e,n)})}),c1t=Wo(function(t,e){return bge(t,e)});function y4(t,e,n,r){V0e(e)||(r=n,n=e,e=!1),n!=null&&(n=Yo(n,r));for(var i=[],s=[],a=0,o=Ao(t);a=100&&(this.lastAsyncPause=Date.now(),await new Promise(e=>setTimeout(e,0)))}async traverse(e,n,r,i=null){if(await this.asyncPause(),n===null||typeof n!="object")return;n.referencedId&&(n=await this.resolveReference(n));const s=[];if(Array.isArray(n)){for(const c of n){if(typeof c!="object")break;if(this.activePromises>=this.maxChildrenPromises)await this.traverse(e,c,r,i);else{const d=this.traverse(e,c,r,i);s.push(d)}}return this.activePromises+=s.length,await Promise.all(s),void(this.activePromises-=s.length)}const a=this.tree.parse({id:i?this.getNodeId(n):e,raw:Object.assign({},n),atomic:!0,children:[]});i===null?this.tree.addSubtree(a):this.tree.addNode(a,i);const o=this.getSpeckleType(n);if(this.directNodeConverterExists(n))try{return await this.convertToNode(n.data||n,a),void await r(null)}catch(c){Zt.warn(`(Traversing - direct) Failed to convert ${o} with id: ${n.id}`,c)}const l=n;let u=this.getDisplayValue(l);if(a.model.atomic=!!u,u){if(Array.isArray(u))for(const c of u){const d=await this.resolveReference(c);d.units||(d.units=n.units);const f=this.tree.parse({id:this.getNodeId(d),raw:Object.assign({},d),atomic:!1,children:[]});await this.convertToNode(d,f),this.tree.addNode(f,a),await r({})}else{u=await this.resolveReference(u),u.units||(u.units=n.units);try{const c=this.tree.parse({id:this.getNodeId(u),raw:Object.assign({},u),atomic:!1,children:[]});await this.convertToNode(u,c),this.tree.addNode(c,a),await r({})}catch(c){Zt.warn(`(Traversing) Failed to convert obj with id: ${n.id} — ${c.message}`)}}if(n.speckle_type.toLowerCase().includes("builtelements")){const c=this.getElementsValue(n);return void(c&&(s.push(this.traverse(e,c,r,a)),this.activePromises+=s.length,await Promise.all(s),this.activePromises-=s.length))}}for(const c in l)if(c!=="__parents"&&c!=="bbox"&&c!=="__closure"&&!["displayMesh","@displayMesh","displayValue","@displayValue"].includes(c)&&typeof l[c]=="object"&&l[c]!==null)if(this.activePromises>=this.maxChildrenPromises)await this.traverse(e,l[c],r,a);else{const d=this.traverse(e,l[c],r,a);s.push(d)}this.activePromises+=s.length,await Promise.all(s),this.activePromises-=s.length}getNodeId(e){return this.spoofIDs?A8():e.id}async dechunk(e){if(!e||e.length===0||!e[0].referencedId)return e;const n=[];for(const r of e){const i=await this.objectLoader.getObject(r.referencedId);n.push(i.data)}return[].concat(...n)}async resolveReference(e){return e.referencedId?await this.objectLoader.getObject(e.referencedId):e}getSpeckleType(e){const n=this.getSpeckleTypeChain(e);for(const r of n)if(r in this.NodeConverterMapping)return r;return"Base"}getSpeckleTypeChain(e){let n=["Base"];return n=e.data?e.data.speckle_type?e.data.speckle_type.split(":").reverse():n:e.speckle_type?e.speckle_type.split(":").reverse():n,n.map(r=>r.split(".").reverse()[0])}directNodeConverterExists(e){const n=this.getSpeckleTypeChain(e);for(const r of n){const i=r in this.NodeConverterMapping;if(i)return i}return!1}async convertToNode(e,n){e.referencedId&&(e=await this.resolveReference(e));try{return this.directNodeConverterExists(e)?await this.NodeConverterMapping[this.getSpeckleType(e)](e,n):null}catch(r){throw Zt.warn(`(Direct convert) Failed to convert object with id: ${e.id}`),r}}getDisplayValue(e){const n=e.displayValue||e["@displayValue"]||e.displayMesh||e["@displayMesh"];if(n){if(Array.isArray(n)){const r=n.filter(i=>i);return n.length!==r.length&&Zt.warn(`Object ${e.id} has null display values which will be ignored`),r}return n}return null}getElementsValue(e){return e.elements||e["@elements"]}getBlockDefinition(e){return e["@blockDefinition"]||e.blockDefinition||e.definition||e["@definition"]}getBlockDefinitionGeometry(e){return e["@geometry"]||e.geometry}async View3DToNode(e,n){e.origin.units=e.units,e.target.units=e.units}async displayableLookup(e,n){if(this.directNodeConverterExists(e))await this.convertToNode(e,n);else{const r=this.getDisplayValue(e),i=this.getElementsValue(e),s=[...r||[],...i||[]];for(const a of s){const o=await this.resolveReference(a),l=this.tree.parse({id:this.getNodeId(o),raw:Object.assign({},o),atomic:!1,children:[]});this.tree.addNode(l,n),await this.displayableLookup(o,l)}}}async BlockInstanceToNode(e,n){const r=await this.resolveReference(this.getBlockDefinition(e));n.model.raw.definition=r;for(const i of this.getBlockDefinitionGeometry(r)){const s=await this.resolveReference(i);s.id=s.id+n.model.raw.transform.id;const a=this.tree.parse({id:this.getNodeId(s),raw:Object.assign({},s),atomic:!1,children:[]});this.tree.addNode(a,n),await this.displayableLookup(s,a);const o=this.getElementsValue(e);if(o)for(const l of o){const u=await this.resolveReference(l),c=this.tree.parse({id:this.getNodeId(u),raw:Object.assign({},u),atomic:!1,children:[]});c.model.raw.host=e.id,this.tree.addNode(c,n),await this.displayableLookup(u,c)}}}async RevitInstanceToNode(e,n){const r=async(s,a)=>{if(s)for(const o of s){const l=await this.resolveReference(o),u=this.tree.parse({id:this.getNodeId(l),raw:Object.assign({},l),atomic:!1,children:[]});a&&(u.model.raw.host=a),this.tree.addNode(u,n),await this.convertToNode(l,u)}},i=await this.resolveReference(e.definition);n.model.raw.definition=i,await r(this.getElementsValue(i)),await r(this.getDisplayValue(i)),await r(this.getElementsValue(e),e.id)}async PointcloudToNode(e,n){n.model.raw.points=await this.dechunk(e.points),n.model.raw.colors=await this.dechunk(e.colors)}async BrepToNode(e,n){try{if(!e)return;let r=this.getDisplayValue(e);if(Array.isArray(r)&&(r=r[0]),!r)return;const i=await this.resolveReference(r),s=this.tree.parse({id:this.getNodeId(i),raw:Object.assign({},i),atomic:!1,children:[]});await this.convertToNode(i,s),this.tree.addNode(s,n),delete e.Edges,delete e.Faces,delete e.Loops,delete e.Trims,delete e.Curve2D,delete e.Curve3D,delete e.Surfaces,delete e.Vertices}catch(r){throw Zt.warn(`Failed to convert brep id: ${e.id}`),r}}async MeshToNode(e,n){e&&(e.vertices&&e.vertices.length!==0?e.faces&&e.faces.length!==0?(n.model.raw.vertices=await this.dechunk(e.vertices),n.model.raw.faces=await this.dechunk(e.faces),n.model.raw.colors=await this.dechunk(e.colors)):Zt.warn(`Object id ${e.id} of type ${e.speckle_type} has no face data and will be ignored`):Zt.warn(`Object id ${e.id} of type ${e.speckle_type} has no vertex position data and will be ignored`))}async TextToNode(e,n){}async DimensionToNode(e,n){const r=[...this.getDisplayValue(e)];for(const a of r){const o=this.tree.parse({id:this.getNodeId(a),raw:Object.assign({},a),atomic:!1,children:[]});this.tree.addNode(o,n),await this.convertToNode(a,o)}const i=JSON.parse(JSON.stringify(e));switch(i.plane=i.RhinoProps.plane,this.getSpeckleTypeChain(i)[0]){case"LengthDimension":i.plane.origin=i.position;break;case"DistanceDimension":case"AngleDimension":i.plane.origin=i.textPosition}i.speckle_type="Objects.Other.Text";const s=this.tree.parse({id:this.getNodeId(i),raw:i,atomic:!1,children:[]});this.tree.addNode(s,n),await this.convertToNode(i,s)}async PointToNode(e,n){}async LineToNode(e,n){n.model.raw.start=Object.assign({},e.start),n.model.raw.end=Object.assign({},e.end)}async PolylineToNode(e,n){n.model.raw.value=await this.dechunk(e.value)}async BoxToNode(e,n){}async PolycurveToNode(e,n){n.model.nestedNodes=[];for(let r=0;r{await this.converter.asyncPause(),s++}),n=!1,i=o.totalChildrenCount),r++,this.emiter.emit($t.LoadProgress,{progress:r/(i+1),id:this.objectId})}a&&await a,Zt.warn(`Finished downloading object ${this.objectId} in ${(performance.now()-e)/1e3} seconds`),this.emiter.emit($t.DownloadComplete,this.objectUrl),s===0&&(Zt.warn(`Viewer: no 3d objects found in object ${this.objectId}`),this.emiter.emit("load-warning",{message:`No displayable objects found in object ${this.objectId}.`}))}cancelLoad(){this.cancel=!0}dispose(){this.loader.dispose()}}class lw{constructor(){this._events={}}on(e,n){this._events[e]||(this._events[e]=[]),this._events[e].push(n)}removeListener(e,n){this._events[e]&&(this._events[e]=this._events[e].filter(r=>r!==n))}emit(e,...n){this._events[e]&&this._events[e].forEach(r=>{r(...n)})}dispose(){this._events=null}}let x4;function tU(t){return t.isOrthographicCamera}(function(t){t[t.NONE=0]="NONE",t[t.ROTATE=1]="ROTATE",t[t.TRUCK=2]="TRUCK",t[t.OFFSET=3]="OFFSET",t[t.DOLLY=4]="DOLLY",t[t.ZOOM=5]="ZOOM",t[t.TOUCH_ROTATE=6]="TOUCH_ROTATE",t[t.TOUCH_TRUCK=7]="TOUCH_TRUCK",t[t.TOUCH_OFFSET=8]="TOUCH_OFFSET",t[t.TOUCH_DOLLY=9]="TOUCH_DOLLY",t[t.TOUCH_ZOOM=10]="TOUCH_ZOOM",t[t.TOUCH_DOLLY_TRUCK=11]="TOUCH_DOLLY_TRUCK",t[t.TOUCH_DOLLY_OFFSET=12]="TOUCH_DOLLY_OFFSET",t[t.TOUCH_ZOOM_TRUCK=13]="TOUCH_ZOOM_TRUCK",t[t.TOUCH_ZOOM_OFFSET=14]="TOUCH_ZOOM_OFFSET"})(x4||(x4={}));function Yn(t,e=1e-5){return Math.abs(t){const i=Math.pow(.95,-e*this.dollySpeed),s=this._sphericalEnd.radius*i,a=this._sphericalEnd.radius,o=a*(e>=0?-1:1);this.dollyTo(s,!0,.9),this.infinityDolly&&(s{const i=Math.pow(.95,e*this.dollySpeed),s=Math.pow(.95,-e*this.dollySpeed),a=this._sphericalEnd.radius*s;this.dollyTo(a,!0,.9),this.zoomTo(this._zoom*i,!1,1),this._didDolly=!0,this.dispatchEvent({type:"controlstart"}),this.dollyToCursor&&(this._dollyControlAmount=this._zoomEnd,this._dollyControlCoord.set(n,r))}}static install(){hc=new U,rU=new U,iU=new U,fE=new U,hE=new U,pE=new U,D$=new U,W$=new U}get hasRested(){return this._hasRested}set isTrucking(e){this._isTrucking=e}zoomTo(e,n=!1,r){this._zoomEnd=fp.clamp(e,this.minZoom,this.maxZoom),this._needsUpdate=!0,this.overrideZoomLerpRatio=n?.05:r,n||(this._zoom=this._zoomEnd);const i=!n||nU(this._zoom,this._zoomEnd,this.restThreshold);return this._createOnRestPromise(i)}dollyTo(e,n=!0,r){const i=this._sphericalEnd.radius,s=fp.clamp(e,this.minDistance,this.maxDistance);if(this.colliderMeshes.length>=1){const o=this._collisionTest(),l=nU(o,this._spherical.radius);if(!(i>s)&&l)return Promise.resolve();this._sphericalEnd.radius=Math.min(s,o)}else this._sphericalEnd.radius=s;this._needsUpdate=!0,this.overrideDollyLerpRatio=r,n||(this._spherical.radius=this._sphericalEnd.radius,this._didDolly=!0,this.dispatchEvent({type:"controlstart"}));const a=!n||nU(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(a)}update(e){this._hasRestedLastFrame=this._hasRested;const n=this._state===x4.NONE?this.dampingFactor:this.draggingDampingFactor,r=Math.min(n*e*60,1),i=this._sphericalEnd.theta-this._spherical.theta,s=this._sphericalEnd.phi-this._spherical.phi,a=this._sphericalEnd.radius-this._spherical.radius,o=D$.subVectors(this._targetEnd,this._target),l=W$.subVectors(this._focalOffsetEnd,this._focalOffset);if(Yn(i)&&Yn(s)&&Yn(a)&&Yn(o.x)&&Yn(o.y)&&Yn(o.z)&&Yn(l.x)&&Yn(l.y)&&Yn(l.z)?(this._spherical.copy(this._sphericalEnd),this._target.copy(this._targetEnd),this._focalOffset.copy(this._focalOffsetEnd)):(this._spherical.set(this._spherical.radius+a*(this.overrideDollyLerpRatio?this.overrideDollyLerpRatio:r),this._spherical.phi+s*r,this._spherical.theta+i*r),this._target.add(o.multiplyScalar(r)),this._focalOffset.add(l.multiplyScalar(r)),this._needsUpdate=!0),this._dollyControlAmount!==0){if(this._camera.isPerspectiveCamera){const f=this._camera,h=hc.setFromSpherical(this._sphericalEnd).applyQuaternion(this._yAxisUpSpaceInverse).normalize().negate(),p=rU.copy(h).cross(f.up).normalize();p.lengthSq()===0&&(p.x=1);const m=iU.crossVectors(p,h),v=this._sphericalEnd.radius*Math.tan(f.getEffectiveFOV()*fp.DEG2RAD*.5),g=(this._sphericalEnd.radius-this._dollyControlAmount-this._sphericalEnd.radius)/this._sphericalEnd.radius,b=hc.copy(this._targetEnd).add(p.multiplyScalar(this._dollyControlCoord.x*v*f.aspect)).add(m.multiplyScalar(this._dollyControlCoord.y*v));this._targetEnd.lerp(b,g),this._target.copy(this._targetEnd)}else if(tU(this._camera)){const f=this._camera,h=hc.set(this._dollyControlCoord.x,this._dollyControlCoord.y,(f.near+f.far)/(f.near-f.far)).unproject(f),p=rU.set(0,0,-1).applyQuaternion(f.quaternion),m=p.dot(f.up),v=Yn(m)?-h.dot(f.up):-h.dot(f.up)/m,g=iU.copy(h).add(p.multiplyScalar(v));this._targetEnd.lerp(g,1-f.zoom/this._dollyControlAmount),this._target.copy(this._targetEnd)}this._dollyControlAmount=0}const u=this._collisionTest();this._spherical.radius=Math.min(this._spherical.radius,u),this._spherical.makeSafe(),this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target),this._camera.lookAt(this._target),(!Yn(this._focalOffset.x)||!Yn(this._focalOffset.y)||!Yn(this._focalOffset.z))&&(this._camera.updateMatrix(),fE.setFromMatrixColumn(this._camera.matrix,0),hE.setFromMatrixColumn(this._camera.matrix,1),pE.setFromMatrixColumn(this._camera.matrix,2),fE.multiplyScalar(this._focalOffset.x),hE.multiplyScalar(-this._focalOffset.y),pE.multiplyScalar(this._focalOffset.z),hc.copy(fE).add(hE).add(pE),this._camera.position.add(hc)),this._boundaryEnclosesCamera&&this._encloseToBoundary(this._camera.position.copy(this._target),hc.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse),1);const c=this._zoomEnd-this._zoom;this._zoom+=c*(this.overrideZoomLerpRatio?this.overrideZoomLerpRatio:r),this._camera.zoom!==this._zoom?(Yn(c)&&(this._zoom=this._zoomEnd),this._camera.zoom=this._zoom,this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0,this._didZoom=!0):this._didZoom=!1;const d=this._needsUpdate;return d&&!this._updatedLastTime?(this._hasRested=!1,this.dispatchEvent({type:"wake"}),this.dispatchEvent({type:"update"})):d?(this.dispatchEvent({type:"update"}),!(Yn(i,this.restThreshold)&&Yn(s,this.restThreshold)&&Yn(a,this.restThreshold)&&Yn(o.x,this.restThreshold)&&Yn(o.y,this.restThreshold)&&Yn(o.z,this.restThreshold)&&Yn(l.x,this.restThreshold)&&Yn(l.y,this.restThreshold)&&Yn(l.z,this.restThreshold))||this._hasRested||this._isTrucking||tU(this._camera)&&this._didZoom||(this._hasRested=!0,this.dispatchEvent({type:"rest"}))):!d&&this._updatedLastTime&&this.dispatchEvent({type:"sleep"}),this._didDollyLastFrame&&(!(Yn(i,this.restThreshold)&&Yn(s,this.restThreshold)&&Yn(a,this.restThreshold)&&Yn(o.x,this.restThreshold)&&Yn(o.y,this.restThreshold)&&Yn(o.z,this.restThreshold)&&Yn(l.x,this.restThreshold)&&Yn(l.y,this.restThreshold)&&Yn(l.z,this.restThreshold))||this._isTrucking||tU(this._camera)&&this._didZoom||(this.dispatchEvent({type:"rest"}),this._didDollyLastFrame=!1)),this._didDolly&&(this._didDolly=!1,this._didDollyLastFrame=!0),this._updatedLastTime=d,this._needsUpdate=!1,d&&!this._hasRested}}class x1t{constructor(e){this.viewer=e,this.camera=new ns(55,window.innerWidth/window.innerHeight),this.camera.up.set(0,0,1),this.camera.position.set(1,1,1),this.camera.updateProjectionMatrix();const n=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight;this.orthoCamera=new Kf(-50*n/2,50*n/2,25,-25,.001,1e4),this.orthoCamera.up.set(0,0,1),this.orthoCamera.position.set(100,100,100),this.orthoCamera.updateProjectionMatrix(),Hg.install({THREE:JKe}),A$.install(),this.controls=new A$(this.camera,this.viewer.container),this.controls.maxPolarAngle=Math.PI/2,this.setupWASDControls(),this.cameras=[{camera:this.camera,controls:this.controls,name:"perspective",active:!0},{camera:this.orthoCamera,controls:this.controls,name:"ortho",active:!1}],this.orbiting=!1,this.controls.addEventListener("transitionstart",()=>{this.orbiting=!0}),this.controls.addEventListener("controlend",()=>{}),this.controls.addEventListener("rest",()=>{setTimeout(()=>{this.orbiting=!1},400)}),window.addEventListener("resize",this.onWindowResize.bind(this),!1),this.onWindowResize()}get activeCam(){return this.cameras[0].active?this.cameras[0]:this.cameras[1]}set activeCam(e){if(e==="perspective")this.setPerspectiveCameraOn();else{if(e!=="ortho")throw new Error(`'${e}' projection mode is invalid. Try with 'perspective' or 'ortho'.`);this.setOrthoCameraOn()}}set enabled(e){this.controls.enabled=e}setPerspectiveCameraOn(){this.cameras[0].active||(this.cameras[0].active=!0,this.cameras[1].active=!1,this.setupPerspectiveCamera(),this.viewer.needsRender=!0)}setOrthoCameraOn(){this.cameras[1].active||(this.cameras[0].active=!1,this.cameras[1].active=!0,this.setupOrthoCamera(),this.viewer.needsRender=!0)}toggleCameras(){this.cameras[0].active?this.setOrthoCameraOn():this.setPerspectiveCameraOn()}setupOrthoCamera(){this.previousDistance=this.controls.distance,this.controls.mouseButtons.wheel=Hg.ACTION.ZOOM;const e=new U;this.camera.getWorldDirection(e);const n=new U().copy(this.viewer.World.worldOrigin).clone().sub(this.camera.position).length(),r=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight,i=this.camera.fov,s=2*n*Math.atan(i*(Math.PI/180)/2),a=s*r;this.orthoCamera.zoom=1,this.orthoCamera.left=a/-2,this.orthoCamera.right=a/2,this.orthoCamera.top=s/2,this.orthoCamera.bottom=s/-2,this.orthoCamera.far=this.camera.far,this.orthoCamera.near=1e-4,this.orthoCamera.updateProjectionMatrix(),this.orthoCamera.position.copy(this.camera.position),this.orthoCamera.quaternion.copy(this.camera.quaternion),this.orthoCamera.updateProjectionMatrix(),this.controls.camera=this.orthoCamera,this.viewer.emit("projection-change","ortho")}setupPerspectiveCamera(){this.controls.mouseButtons.wheel=Hg.ACTION.DOLLY,this.camera.position.copy(this.orthoCamera.position),this.camera.quaternion.copy(this.orthoCamera.quaternion),this.camera.updateProjectionMatrix(),this.controls.camera=this.camera,this.controls.zoomTo(1),this.enableRotations(),this.viewer.emit("projection-change","perspective")}disableRotations(){this.controls.mouseButtons.left=Hg.ACTION.TRUCK}enableRotations(){this.controls.mouseButtons.left=Hg.ACTION.ROTATE}setupWASDControls(){const i=new Y5(87,16.666),s=new Y5(65,16.666),a=new Y5(83,16.666),o=new Y5(68,16.666),l=new Array(4),u=(c,d)=>{l[c]=d,l.every(f=>f===!1)?(this.controls.isTrucking=!1,this.controls.dispatchEvent({type:"rest"})):this.controls.isTrucking=!0};s.addEventListener(il.HOLD_START,(function(){this.controls.dispatchEvent({type:"controlstart"})}).bind(this)),s.addEventListener("holding",(function(c){this.viewer.mouseOverRenderer!==!1&&(u(0,!0),this.controls.truck(-.01*c.deltaTime,0,!1))}).bind(this)),s.addEventListener(il.HOLD_END,(function(){u(0,!1)}).bind(this)),o.addEventListener(il.HOLD_START,(function(){this.controls.dispatchEvent({type:"controlstart"})}).bind(this)),o.addEventListener("holding",(function(c){this.viewer.mouseOverRenderer!==!1&&(u(1,!0),this.controls.truck(.01*c.deltaTime,0,!1))}).bind(this)),o.addEventListener(il.HOLD_END,(function(){u(1,!1)}).bind(this)),i.addEventListener(il.HOLD_START,(function(){this.controls.dispatchEvent({type:"controlstart"})}).bind(this)),i.addEventListener("holding",(function(c){this.viewer.mouseOverRenderer!==!1&&(u(2,!0),this.controls.forward(.01*c.deltaTime,!1))}).bind(this)),i.addEventListener(il.HOLD_END,(function(){u(2,!1)}).bind(this)),a.addEventListener(il.HOLD_START,(function(){this.controls.dispatchEvent({type:"controlstart"})}).bind(this)),a.addEventListener("holding",(function(c){this.viewer.mouseOverRenderer!==!1&&(u(3,!0),this.controls.forward(-.01*c.deltaTime,!1))}).bind(this)),a.addEventListener(il.HOLD_END,(function(){u(3,!1)}).bind(this))}onWindowResize(){this.camera.aspect=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight,this.camera.updateProjectionMatrix();const e=new U;this.camera.getWorldDirection(e);const n=new U;this.controls.getTarget(n);const r=n.clone().sub(this.camera.position).dot(e),i=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight,s=this.camera.fov,a=2*r*Math.atan(s*(Math.PI/180)/2),o=a*i;this.orthoCamera.zoom=1,this.orthoCamera.left=o/-2,this.orthoCamera.right=o/2,this.orthoCamera.top=a/2,this.orthoCamera.bottom=a/-2,this.orthoCamera.updateProjectionMatrix()}_setOrbitPoint(e,n){const r=this.viewer.container.getBoundingClientRect(),i=e-r.left,s=n-r.top,a=new Oe(i/r.width*2-1,(r.height-s)/r.height*2-1),o=new Sy;o.setFromCamera(a,this.camera);const l=o.intersectObjects(this.viewer.sceneManager.allObjects);l.length!==0&&this.controls.setOrbitPoint(l[0].point.x,l[0].point.y,l[0].point.z,!1)}}var st;(function(t){t[t.MESH=0]="MESH",t[t.LINE=1]="LINE",t[t.POINT=2]="POINT",t[t.POINT_CLOUD=3]="POINT_CLOUD",t[t.TEXT=4]="TEXT"})(st||(st={}));const L6={offset:0,count:0},Al={offset:0,count:1/0};var Nh;(function(t){t.POSITION="POSITION",t.COLOR="COLOR",t.NORMAL="NORMAL",t.UV="UV",t.TANGENT="TANGENT",t.INDEX="INDEX"})(Nh||(Nh={}));class ur{static updateRTEGeometry(e,n){if(e.type==="BufferGeometry"||e.type==="PlaneGeometry"||e.type==="CircleGeometry"){const r=new Float32Array(n.length),i=e.attributes.position.array;ur.DoubleToHighLowBuffer(n,r,i),e.setAttribute("position_low",new xt(r,3))}else if(e.type==="LineGeometry"||e.type==="LineSegmentsGeometry"){const r=new Float32Array(n.length),i=e.attributes.instanceStart.array;ur.DoubleToHighLowBuffer(n,r,i);const s=new Jv(new Float32Array(r),6,1);e.setAttribute("instanceStartLow",new qs(s,3,0)),e.setAttribute("instanceEndLow",new qs(s,3,3))}}static mergeGeometryAttribute(e,n){let r=0;for(let i=0;ia.attributes[Nh.INDEX]),s=e.map(a=>a.attributes[Nh.POSITION]);r.attributes[Nh.INDEX]=ur.mergeIndexAttribute(i,s)}for(const i in n)if(i!==Nh.INDEX){const s=e.map(a=>a.attributes[i]);r.attributes[i]=ur.mergeGeometryAttribute(s,i===Nh.POSITION?new Float64Array(s.reduce((a,o)=>a+o.length,0)):new Float32Array(s.reduce((a,o)=>a+o.length,0)))}return e.forEach(i=>{for(const s in i.attributes)delete i.attributes[s]}),r}static transformGeometryData(e,n){if(!e.attributes.POSITION)return;const r=n.elements;for(let i=0;i>16&255,a=i>>8&255,o=255&i;n[3*r]=s/255,n[3*r+1]=a/255,n[3*r+2]=o/255}return n}static DoubleToHighLowVector(e,n,r){let i=e.x;if(i>=0){this.floatArrayBuff[0]=i;const s=this.floatArrayBuff[0];r.x=s,n.x=i-s}else{this.floatArrayBuff[0]=-i;const s=this.floatArrayBuff[0];r.x=-s,n.x=i+s}if(i=e.y,i>=0){this.floatArrayBuff[0]=i;const s=this.floatArrayBuff[0];r.y=s,n.y=i-s}else{this.floatArrayBuff[0]=-i;const s=this.floatArrayBuff[0];r.y=-s,n.y=i+s}if(i=e.z,i>=0){this.floatArrayBuff[0]=i;const s=this.floatArrayBuff[0];r.z=s,n.z=i-s}else{this.floatArrayBuff[0]=-i;const s=this.floatArrayBuff[0];r.z=-s,n.z=i+s}}static DoubleToHighLowBuffer(e,n,r){for(let i=0;i=0){this.floatArrayBuff[0]=s;const a=this.floatArrayBuff[0];r[i]=a,n[i]=s-a}else{this.floatArrayBuff[0]=-s;const a=this.floatArrayBuff[0];r[i]=-a,n[i]=s+a}}}static computeVertexNormals(e,n){const r=e.index,i=e.getAttribute("position");if(i!==void 0){let s=e.getAttribute("normal");if(s===void 0)s=new un(new Float32Array(3*i.count),3),e.setAttribute("normal",s);else for(let p=0,m=s.count;p=65535||e.length>=65535?(s=new Uint32Array(e.length),s.set(e,0),i.setIndex(new Gv(s,1))):(s=new Uint16Array(e.length),s.set(e,0),i.setIndex(new Av(s,1))),i.setAttribute("position",new xt(n,3)),i.computeBoundingBox(),new Bd(i,r)}constructor(e,n={}){super(e,n)}raycast(e,n=Ki){const r=super.raycast(this.transformInput(e),n);return r.forEach(i=>{i.point=this.transformOutput(i.point)}),r}raycastFirst(e,n=Ki){const r=super.raycastFirst(this.transformInput(e),n);return r.point=this.transformOutput(r.point),r}shapecast(e){const n=new Jt,r=new td,i=Object.create(null);return e.intersectsBounds&&(i.intersectsBounds=(s,a,o,l,u)=>(n.copy(s),this.transformOutput(n),e.intersectsBounds(n,a,o,l,u))),e.intersectsTriangle&&(i.intersectsTriangle=(s,a,o,l)=>(r.copy(s),this.transformOutput(r.a),this.transformOutput(r.b),this.transformOutput(r.c),e.intersectsTriangle(r,a,o,l))),i.intersectsRange=e.intersectsRange,i.traverseBoundsOrder=e.traverseBoundsOrder,super.shapecast(i)}transformInput(e){return Bd.MatBuff.copy(this.inputOriginTransform).premultiply(this.inputTransform),e.applyMatrix4(Bd.MatBuff)}transformOutput(e){return Bd.MatBuff.copy(this.outputOriginTransfom).multiply(this.outputTransform),e.applyMatrix4(Bd.MatBuff)}getBoundingBox(e){return super.getBoundingBox(e),this.transformOutput(e)}getVertexAtIndex(e){const n=this.geometry.attributes.position.array;return this.transformOutput(new U(n[3*e],n[3*e+1],n[3*e+2]))}}Bd.MatBuff=new Be;class zo{constructor(e){this.batchObjects=[],this.bounds=new Jt(new U(0,0,0),new U(0,0,0)),this.boxHelpers=[],this.tas=null,this.lastRefitTime=0,this.batchObjects=e,this.buildTAS(),this.getBoundingBox(this.bounds)}buildTAS(){const e=[],n=new Float32Array(3*zo.CUBE_VERTS*this.batchObjects.length);let r=0;for(let i=0;ia+r/3)),this.batchObjects[i].tasVertIndexStart=r/3,this.batchObjects[i].tasVertIndexEnd=r/3+zo.CUBE_VERTS,r+=3*zo.CUBE_VERTS,zo.debugBoxes){const a=new OT(s);a.layers.set(kt.PROPS),this.boxHelpers.push(a)}}this.tas=Bd.buildBVH(e,n),this.tas.inputTransform=new Be,this.tas.outputTransform=new Be,this.tas.inputOriginTransform=new Be,this.tas.outputOriginTransfom=new Be}updateVertArray(e,n,r){r[n]=e.min.x,r[n+1]=e.min.y,r[n+2]=e.max.z,r[n+3]=e.max.x,r[n+4]=e.min.y,r[n+5]=e.max.z,r[n+6]=e.max.x,r[n+7]=e.max.y,r[n+8]=e.max.z,r[n+9]=e.min.x,r[n+10]=e.max.y,r[n+11]=e.max.z,r[n+12]=e.min.x,r[n+13]=e.min.y,r[n+14]=e.min.z,r[n+15]=e.max.x,r[n+16]=e.min.y,r[n+17]=e.min.z,r[n+18]=e.max.x,r[n+19]=e.max.y,r[n+20]=e.min.z,r[n+21]=e.min.x,r[n+22]=e.max.y,r[n+23]=e.min.z}refit(){const e=performance.now(),n=this.tas.geometry.attributes.position.array,r=new Jt;for(let i=0;i{const o=this.tas.geometry.index.array[3*a.faceIndex],l=Math.trunc(o/zo.CUBE_VERTS);i.copy(e);const u=this.batchObjects[l].bvh.raycast(i,n);u.forEach(c=>{c.batchObject=this.batchObjects[l]}),r.push(...u)}),r}raycastFirst(e,n=Ki){const r=new qo;r.copy(e);const i=this.tas.raycastFirst(r,Ki);if(!i)return null;const s=this.tas.geometry.index.array[3*i.faceIndex],a=Math.trunc(s/zo.CUBE_VERTS);r.copy(e);const o=this.batchObjects[a].bvh.raycast(r,n);o.forEach(l=>{l.batchObject=this.batchObjects[a]}),null.push(...o)}shapecast(e){let n=!1;return this.tas.shapecast({intersectsBounds:(r,i,s,a,o)=>e.intersectsTAS(r,i,s,a,o),intersectsRange:r=>{const i=this.tas.geometry.index.array[3*r],s=Math.trunc(i/zo.CUBE_VERTS);return n||(n=this.batchObjects[s].bvh.shapecast((a=>{const o=Object.create(null);return e.intersectsBounds&&(o.intersectsBounds=e.intersectsBounds),e.intersectsTriangle&&(o.intersectsTriangle=(l,u,c,d)=>e.intersectsTriangle(l,u,c,d,a)),o.intersectsRange=e.intersectsRange,o.traverseBoundsOrder=e.traverseBoundsOrder,o})(this.batchObjects[s]))),!1}}),n}getBoundingBox(e){return this.tas.getBoundingBox(e),e}}zo.debugBoxes=!1,zo.cubeIndices=[0,1,2,2,3,0,1,5,6,6,2,1,7,6,5,5,4,7,4,0,3,3,7,4,4,5,1,1,0,4,3,2,6,6,7,3],zo.CUBE_VERTS=8;class w1t{static triangulateFace(e,n,r){let i=n[e];function s(h){return e+h+1}function a(h){const p=3*n[s(h)];return new mv(r[p],r[p+1],r[p+2])}i<3&&(i+=3);const o=Array(3*(i-2)),l=new mv(0,0,0);for(let h=i-1,p=0;p=3;){let h=!0;if(i>3&&f0}}class mv{constructor(e,n,r){this.x=e,this.y=n,this.z=r}add(e){return new mv(this.x+e.x,this.y+e.y,this.z+e.z)}sub(e){return new mv(this.x-e.x,this.y-e.y,this.z-e.z)}mul(e){return new mv(this.x-e,this.y-e,this.z-e)}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}cross(e){const n=this.y*e.z-this.z*e.y,r=this.z*e.x-this.x*e.z,i=this.x*e.y-this.y*e.x;return new mv(n,r,i)}squareSum(){return this.x*this.x+this.y*this.y+this.z*this.z}normalize(){const e=1/Math.sqrt(this.squareSum());this.x*=e,this.y*=e,this.z*=e}}const Rt={Millimeters:"mm",Centimeters:"cm",Meters:"m",Kilometers:"km",Inches:"in",Feet:"ft",Yards:"yd",Miles:"mi"};function Os(t,e=Rt.Meters){switch(t=G$(t),e=G$(e),t){case Rt.Millimeters:switch(e){case Rt.Centimeters:return .1;case Rt.Meters:return .001;case Rt.Kilometers:return 1e-6;case Rt.Inches:return .0393701;case Rt.Feet:return .00328084;case Rt.Yards:return .00109361;case Rt.Miles:return 621371e-12}break;case Rt.Centimeters:switch(e){case Rt.Millimeters:return 10;case Rt.Meters:return .01;case Rt.Kilometers:return 1e-5;case Rt.Inches:return .393701;case Rt.Feet:return .0328084;case Rt.Yards:return .0109361;case Rt.Miles:return 621371e-11}break;case Rt.Meters:switch(e){case Rt.Millimeters:return 1e3;case Rt.Centimeters:return 100;case Rt.Kilometers:return .001;case Rt.Inches:return 39.3701;case Rt.Feet:return 3.28084;case Rt.Yards:return 1.09361;case Rt.Miles:return 621371e-9}break;case Rt.Kilometers:switch(e){case Rt.Millimeters:return 1e6;case Rt.Centimeters:return 1e5;case Rt.Meters:return 1e3;case Rt.Inches:return 39370.1;case Rt.Feet:return 3280.84;case Rt.Yards:return 1093.61;case Rt.Miles:return .621371}break;case Rt.Inches:switch(e){case Rt.Millimeters:return 25.4;case Rt.Centimeters:return 2.54;case Rt.Meters:return .0254;case Rt.Kilometers:return 254e-7;case Rt.Feet:return .0833333;case Rt.Yards:return .027777694;case Rt.Miles:return 157828e-10}break;case Rt.Feet:switch(e){case Rt.Millimeters:return 304.8;case Rt.Centimeters:return 30.48;case Rt.Meters:return .3048;case Rt.Kilometers:return 3048e-7;case Rt.Inches:return 12;case Rt.Yards:return .333332328;case Rt.Miles:return 189394e-9}break;case Rt.Miles:switch(e){case Rt.Millimeters:return 1609e3;case Rt.Centimeters:return 160934;case Rt.Meters:return 1609.34;case Rt.Kilometers:return 1.60934;case Rt.Inches:return 63360;case Rt.Feet:return 5280;case Rt.Yards:return 1759.99469184}}return 1}function G$(t){if(!t)return Rt.Meters;switch(t.toLowerCase()){case"mm":case"mil":case"millimeters":case"millimetres":return Rt.Millimeters;case"cm":case"centimetre":case"centimeter":case"centimetres":case"centimeters":return Rt.Centimeters;case"m":case"meter":case"metre":case"meters":case"metres":default:return Rt.Meters;case"inches":case"inch":case"in":return Rt.Inches;case"feet":case"foot":case"ft":return Rt.Feet;case"yard":case"yards":case"yd":return Rt.Yards;case"miles":case"mile":case"mi":return Rt.Miles;case"km":case"kilometers":return Rt.Kilometers}}var Kt;(function(t){t.View3D="View3D",t.BlockInstance="BlockInstance",t.Pointcloud="Pointcloud",t.Brep="Brep",t.Mesh="Mesh",t.Point="Point",t.Line="Line",t.Polyline="Polyline",t.Box="Box",t.Polycurve="Polycurve",t.Curve="Curve",t.Circle="Circle",t.Arc="Arc",t.Ellipse="Ellipse",t.RevitInstance="RevitInstance",t.Text="Text",t.Unknown="Unknown"})(Kt||(Kt={}));const S1=[Kt.Pointcloud,Kt.Brep,Kt.Mesh,Kt.Point,Kt.Line,Kt.Polyline,Kt.Box,Kt.Polycurve,Kt.Curve,Kt.Circle,Kt.Arc,Kt.Ellipse,Kt.Text];class Sn{static getSpeckleType(e){let n=["Base"];n=e.raw.data?e.raw.data.speckle_type?e.raw.data.speckle_type.split(":").reverse():n:e.raw.speckle_type?e.raw.speckle_type.split(":").reverse():n,n=n.map(r=>r.split(".").reverse()[0]);for(const r of n)if(r in Kt)return r;return Kt.Unknown}static convertNodeToGeometryData(e){switch(Sn.getSpeckleType(e)){case Kt.BlockInstance:return Sn.BlockInstanceToGeometryData(e);case Kt.Pointcloud:return Sn.PointcloudToGeometryData(e);case Kt.Brep:return Sn.BrepToGeometryData(e);case Kt.Mesh:return Sn.MeshToGeometryData(e);case Kt.Point:return Sn.PointToGeometryData(e);case Kt.Line:return Sn.LineToGeometryData(e);case Kt.Polyline:return Sn.PolylineToGeometryData(e);case Kt.Box:return Sn.BoxToGeometryData(e);case Kt.Polycurve:return Sn.PolycurveToGeometryData(e);case Kt.Curve:return Sn.CurveToGeometryData(e);case Kt.Circle:return Sn.CircleToGeometryData(e);case Kt.Arc:return Sn.ArcToGeometryData(e);case Kt.Ellipse:return Sn.EllipseToGeometryData(e);case Kt.View3D:return Sn.View3DToGeometryData(e);case Kt.RevitInstance:return Sn.RevitInstanceToGeometryData(e);case Kt.Text:return Sn.TextToGeometryData(e);case Kt.Unknown:return null}}static disposeNodeGeometryData(e){switch(Sn.getSpeckleType(e)){case Kt.Pointcloud:e.raw.vertices=[],e.raw.colors=[];break;case Kt.Mesh:e.raw.vertices=[],e.raw.faces=[],e.raw.colors=[];break;case Kt.Point:e.raw.value?e.raw.value=[]:(delete e.raw.x,delete e.raw.y,delete e.raw.z);break;case Kt.Line:e.raw.start.value?e.raw.start.value=[]:(delete e.raw.start.x,delete e.raw.start.y,delete e.raw.start.z),e.raw.end.value?e.raw.end.value=[]:(delete e.raw.end.x,delete e.raw.end.y,delete e.raw.end.z);break;case Kt.Polyline:e.raw.value=[]}}static View3DToGeometryData(e){const n=Sn.PointToVector3(e.raw.origin),r=Sn.PointToVector3(e.raw.target);return e.raw.origin=n,e.raw.target=r,{attributes:null,bakeTransform:null,transform:null}}static BlockInstanceToGeometryData(e){const n=Os(e.raw.units),r=Array.isArray(e.raw.transform)?e.raw.transform:e.raw.transform.value?e.raw.transform.value:e.raw.transform.matrix,i=new Be().fromArray(r).transpose();return{attributes:null,bakeTransform:null,transform:new Be().makeScale(n,n,n).multiply(i).multiply(new Be().makeScale(1/n,1/n,1/n))}}static RevitInstanceToGeometryData(e){const n=Os(e.raw.units),r=Array.isArray(e.raw.transform)?e.raw.transform:e.raw.transform.value?e.raw.transform.value:e.raw.transform.matrix,i=new Be().fromArray(r).transpose();return{attributes:null,bakeTransform:null,transform:new Be().makeScale(n,n,n).multiply(i).multiply(new Be().makeScale(1/n,1/n,1/n))}}static PointcloudToGeometryData(e){const n=Os(e.raw.units),r=e.raw.points,i=e.raw.colors;let s=null;return i&&i.length!==0&&(i.length!==r.length/3&&Zt.warn(`Mesh (id ${e.raw.id}) colours are mismatched with vertice counts. The number of colours must equal the number of vertices.`),s=Sn.unpackColors(i,!0)),{attributes:{POSITION:r,COLOR:s},bakeTransform:new Be().makeScale(n,n,n),transform:null}}static BrepToGeometryData(e){return null}static MeshToGeometryData(e){if(!e.raw)return;const n=Os(e.raw.units),r=[];if(!e.raw.vertices||!e.raw.faces)return;const i=e.raw.vertices,s=e.raw.faces,a=e.raw.colors;let o,l=0;for(;ld!==void 0))}l+=u+1}return a&&a.length!==0&&(a.length!==i.length/3&&Zt.warn(`Mesh (id ${e.raw.id}) colours are mismatched with vertice counts. The number of colours must equal the number of vertices.`),o=Sn.unpackColors(a)),{attributes:{POSITION:i,INDEX:r,...o&&{COLOR:o}},bakeTransform:new Be().makeScale(n,n,n),transform:null}}static TextToGeometryData(e){const n=Os(e.raw.units),r=e.raw.plane,i=new U(r.origin.x,r.origin.y,r.origin.z),s=new Be().makeScale(n,n,n),a=new Be().makeBasis(r.xdir,r.ydir,r.normal);return a.setPosition(i),a.premultiply(s),{attributes:null,bakeTransform:a,transform:null,metaData:e.raw}}static PointToGeometryData(e){const n=Os(e.raw.units);return{attributes:{POSITION:this.PointToFloatArray(e.raw)},bakeTransform:new Be().makeScale(n,n,n),transform:null}}static LineToGeometryData(e){const n=Os(e.raw.units);return{attributes:{POSITION:this.PointToFloatArray(e.raw.start).concat(this.PointToFloatArray(e.raw.end))},bakeTransform:new Be().makeScale(n,n,n),transform:null}}static PolylineToGeometryData(e){const n=Os(e.raw.units);return e.raw.closed&&e.raw.value.push(e.raw.value[0],e.raw.value[1],e.raw.value[2]),{attributes:{POSITION:e.raw.value.slice(0)},bakeTransform:new Be().makeScale(n,n,n),transform:null}}static BoxToGeometryData(e){const n=Os(e.raw.units),r=this.PointToVector3(e.raw.basePlane.origin),i=(e.raw.xSize.end-e.raw.xSize.start)*n,s=(e.raw.ySize.end-e.raw.ySize.start)*n,a=(e.raw.zSize.end-e.raw.zSize.start)*n,o=new Jt(new U(.5*-i,.5*-s,.5*-a),new U(.5*i,.5*s,.5*a));return{attributes:{POSITION:[o.min.x,o.min.y,o.min.z,o.min.x,o.max.y,o.min.z,o.min.x,o.min.y,o.max.z,o.min.x,o.max.y,o.max.z,o.min.x,o.min.y,o.min.z,o.min.x,o.min.y,o.max.z,o.min.x,o.max.y,o.min.z,o.min.x,o.max.y,o.max.z,o.max.x,o.min.y,o.min.z,o.max.x,o.max.y,o.min.z,o.max.x,o.min.y,o.max.z,o.max.x,o.max.y,o.max.z,o.max.x,o.min.y,o.min.z,o.max.x,o.min.y,o.max.z,o.max.x,o.max.y,o.min.z,o.max.x,o.max.y,o.max.z,o.max.x,o.min.y,o.max.z,o.min.x,o.min.y,o.max.z,o.max.x,o.min.y,o.min.z,o.min.x,o.min.y,o.min.z,o.max.x,o.max.y,o.max.z,o.min.x,o.max.y,o.max.z,o.max.x,o.max.y,o.min.z,o.min.x,o.max.y,o.min.z]},bakeTransform:new Be().setPosition(r),transform:null}}static PolycurveToGeometryData(e){const n=[];for(let r=0;r0,u=new U().subVectors(r,n);u.normalize();const c=new U().subVectors(i,n);c.normalize();const d=new U().crossVectors(u,c);if(d.normalize(),d.length()===0){const M=new U().subVectors(s,n);M.normalize(),d.copy(new U().crossVectors(u,M)),d.normalize()}const f=new U().crossVectors(d,u);f.normalize();const h=Math.min(Math.max(u.dot(c),-1),1),p=Math.acos(h),m=e.raw.radius,v=new by(0,0,m,m,0,p,l,0).getPoints(50),g=new Be,b=Os(e.raw.plane.units),y=new Be().makeBasis(u,f,d),x=new Be().setPosition(n.multiplyScalar(b));g.multiply(x).multiply(y);const T=new Be().scale(new U(b,b,b));return g.multiply(T),{attributes:{POSITION:this.FlattenVector3Array(v)},bakeTransform:g,transform:null}}static EllipseToGeometryData(e){const n=Os(e.raw.units),r=new U(e.raw.plane.origin.x,e.raw.plane.origin.y,e.raw.plane.origin.z).multiplyScalar(n),i=new U(e.raw.plane.xdir.x,e.raw.plane.xdir.y,e.raw.plane.xdir.z).normalize(),s=new U(e.raw.plane.ydir.x,e.raw.plane.ydir.y,e.raw.plane.ydir.z).normalize();let a=2*Math.PI*e.raw.firstRadius*n*10;a=parseInt(a.toString());const o=[];for(let l=0;l<=a;l++){const u=l*Math.PI*2/a,c=Math.cos(u)*e.raw.firstRadius*n,d=Math.sin(u)*e.raw.secondRadius*n,f=new U(i.x*c,i.y*c,i.z*c),h=new U(s.x*d,s.y*d,s.z*d),p=new U().addVectors(f,h).add(r);o.push(p)}return{attributes:{POSITION:this.FlattenVector3Array(o)},bakeTransform:null,transform:null}}static getCircularCurvePoints(e,n,r=0,i=2*Math.PI,s=.1){const a=this.PointToVector3(e.origin),o=this.PointToVector3(e.xdir),l=this.PointToVector3(e.ydir);o.normalize(),l.normalize();let u=(i-r)*n/s;u=parseInt(u.toString());const c=[];for(let d=0;d<=u;d++){const f=r+d*(i-r)/u,h=Math.cos(f)*n,p=Math.sin(f)*n,m=new U(o.x*h,o.y*h,o.z*h),v=new U(l.x*p,l.y*p,l.z*p),g=new U().addVectors(m,v).add(a);c.push(g)}return c}static PointToVector3(e,n=!0){const r=n?Os(e.units):1;let i=null;return i=e.value?new U(e.value[0]*r,e.value[1]*r,e.value[2]*r):new U(e.x*r,e.y*r,e.z*r),i}static PointToFloatArray(e){return e.value?[e.value[0],e.value[1],e.value[2]]:[e.x,e.y,e.z]}static FlattenVector3Array(e){const n=new Array(3*e.length),r=[];for(let i=0,s=0;i>16&255,o=s>>8&255,l=255&s;r[3*i]=a/255,r[3*i+1]=o/255,r[3*i+2]=l/255,n&&(r[3*i]=Sn.srgbToLinear(r[3*i]),r[3*i+1]=Sn.srgbToLinear(r[3*i+1]),r[3*i+2]=Sn.srgbToLinear(r[3*i+2]))}return r}static srgbToLinear(e){return e<=0?0:e>=1?1:e<.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}}var wh;Sn.keepGeometryData=!1;class Is{static hashCode(e){let n;for(let r=0;r0&&(this._geometryType!==st.MESH||this._renderData.geometry.attributes.INDEX&&this._renderData.geometry.attributes.INDEX.length>0)}constructor(e){this._aabb=null,this._renderData=e,this._geometryType=this.getGeometryType(),this._materialHash=this.getMaterialHash(),this._batchId,this._batchIndexCount,this._batchIndexStart,this._batchVertexStart,this._batchVertexEnd}setBatchData(e,n,r,i,s){this._batchId=e,this._batchIndexStart=n,this._batchIndexCount=r,i!==void 0&&(this._batchVertexStart=i),s!==void 0&&(this._batchVertexEnd=s)}computeAABB(){this._aabb=new Jt().setFromArray(this._renderData.geometry.attributes.POSITION)}getGeometryType(){switch(this._renderData.speckleType){case Kt.Mesh:case Kt.Brep:return st.MESH;case Kt.Point:return st.POINT;case Kt.Pointcloud:return st.POINT_CLOUD;case Kt.Text:return st.TEXT;default:return st.LINE}}disposeGeometry(){for(const e in this._renderData.geometry.attributes)this._renderData.geometry.attributes[e]=[]}renderMaterialToString(){return this.renderData.renderMaterial.color.toString()+"/"+this.renderData.renderMaterial.opacity.toString()+"/"+this.renderData.renderMaterial.roughness.toString()+"/"+this.renderData.renderMaterial.metalness.toString()}displayStyleToString(){var e;return((e=this.renderData.displayStyle.color)===null||e===void 0?void 0:e.toString())+"/"+this.renderData.displayStyle.lineWeight.toString()}getMaterialHash(){const e=!this.renderData.renderMaterial||this.geometryType!==st.MESH&&this.geometryType!==st.POINT&&this.geometryType!==st.TEXT?this.renderData.displayStyle&&this.geometryType!==st.MESH&&this.geometryType!==st.POINT?this.displayStyleToString():"":this.renderMaterialToString();let n="";this.renderData.geometry.attributes&&(n=this.renderData.geometry.attributes.COLOR?"vertexColors":"");const r=this.geometryType.toString()+n+e+(this.geometryType===st.TEXT?this._renderData.id:"");return wh.hashCode(r)}}wh=Is,Is.NullRenderMaterialHash=wh.hashCode(st.MESH.toString()),Is.NullRenderMaterialVertexColorsHash=wh.hashCode(st.MESH.toString()+"vertexColors"),Is.NullDisplayStyleHash=wh.hashCode(st.LINE.toString()),Is.NullPointMaterialHash=wh.hashCode(st.POINT.toString()),Is.NullPointCloudMaterialHash=wh.hashCode(st.POINT_CLOUD.toString()),Is.NullPointCloudVertexColorsMaterialHash=wh.hashCode(st.POINT_CLOUD.toString()+"vertexColors");class Qr extends UD{set pixelThreshold(e){this.userData.pixelThreshold.value=e,this.needsUpdate=!0}constructor(e,n=[]){super(e),this.userData.uViewer_high={value:new U},this.userData.uViewer_low={value:new U},this.userData.pixelThreshold={value:0},this.vertProgram=` +`+s+"}",l}function Ugt(t,e,n){e=aw(e);var r=e.length;if(!r)return co(n)?n.call(t):n;for(var i=0;i1)U0(o,e-1,n,r),i=r.length;else for(var l=0,u=o.length;le?(r&&(clearTimeout(r),r=null),o=c,a=t.apply(i,s),r||(i=s=null)):!r&&n.trailing!==!1&&(r=setTimeout(l,d)),a};return u.cancel=function(){clearTimeout(r),o=0,r=i=s=null},u}function Wgt(t,e,n){var r,i,s,a,o,l=function(){var c=U6()-i;e>c?r=setTimeout(l,e-c):(r=null,n||(a=t.apply(o,s)),r||(s=o=null))},u=Do(function(c){return o=this,s=c,i=U6(),r||(r=setTimeout(l,e),n&&(a=t.apply(o,s))),a});return u.cancel=function(){clearTimeout(r),r=s=o=null},u}function Agt(t,e){return jy(e,t)}function dW(t){return function(){return!t.apply(this,arguments)}}function Ggt(){var t=arguments,e=t.length-1;return function(){for(var n=e,r=t[e].apply(this,arguments);n--;)r=t[n].call(this,r);return r}}function Fgt(t,e){return function(){if(--t<1)return e.apply(this,arguments)}}function ige(t,e){var n;return function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=null),n}}const jgt=jy(ige,2);function sge(t,e,n){e=Jo(e,n);for(var r=Gs(t),i,s=0,a=r.length;s0?0:i-1;s>=0&&s0?a=s>=0?s:Math.max(s+o,a):o=s>=0?Math.min(s+1,o):s+o+1;else if(n&&s&&o)return s=n(r,i),r[s]===i?s:-1;if(i!==i)return s=e(iw.call(r,a,o),N0e),s>=0?s+a:-1;for(s=t>0?a:o-1;s>=0&&s0?0:o-1;for(s||(i=n[a?a[l]:l],l+=t);l>=0&&l=3;return e(n,ow(r,s,4),i,a)}}const $I=dge(1),L$=dge(-1);function Lb(t,e,n){var r=[];return e=Jo(e,n),Vf(t,function(i,s,a){e(i,s,a)&&r.push(i)}),r}function Ygt(t,e,n){return Lb(t,dW(Jo(e)),n)}function X$(t,e,n){e=Jo(e,n);for(var r=!Pl(t)&&Gs(t),i=(r||t).length,s=0;s=0}const Bgt=Do(function(t,e,n){var r,i;return co(e)?i=e:(e=aw(e),r=e.slice(0,-1),e=e[e.length-1]),Bv(t,function(s){var a=i;if(!a){if(r&&r.length&&(s=oW(s,r)),s==null)return;a=s[e]}return a==null?a:a.apply(s,n)})});function hW(t,e){return Bv(t,uW(e))}function Hgt(t,e){return Lb(t,I6(e))}function fge(t,e,n){var r=-1/0,i=-1/0,s,a;if(e==null||typeof e=="number"&&typeof t[0]!="object"&&t!=null){t=Pl(t)?t:Fy(t);for(var o=0,l=t.length;or&&(r=s)}else e=Jo(e,n),Vf(t,function(u,c,d){a=e(u,c,d),(a>i||a===-1/0&&r===-1/0)&&(r=u,i=a)});return r}function Qgt(t,e,n){var r=1/0,i=1/0,s,a;if(e==null||typeof e=="number"&&typeof t[0]!="object"&&t!=null){t=Pl(t)?t:Fy(t);for(var o=0,l=t.length;oo||a===void 0)return 1;if(a1&&(r=ow(r,e[1])),e=sw(t)):(r=a1t,e=U0(e,!1,!1),t=Object(t));for(var i=0,s=e.length;i1&&(r=e[1])):(e=Bv(U0(e,!1,!1),String),n=function(i,s){return!lf(e,s)}),mge(t,n,r)});function vge(t,e,n){return iw.call(t,0,Math.max(0,t.length-(e==null||n?1:e)))}function eU(t,e,n){return t==null||t.length<1?e==null||n?void 0:[]:e==null||n?t[0]:vge(t,t.length-e)}function B7(t,e,n){return iw.call(t,e==null||n?1:e)}function l1t(t,e,n){return t==null||t.length<1?e==null||n?void 0:[]:e==null||n?t[t.length-1]:B7(t,Math.max(0,t.length-e))}function u1t(t){return Lb(t,Boolean)}function c1t(t,e){return U0(t,e,!1)}const gge=Do(function(t,e){return e=U0(e,!0,!0),Lb(t,function(n){return!lf(e,n)})}),d1t=Do(function(t,e){return gge(t,e)});function y4(t,e,n,r){R0e(e)||(r=n,n=e,e=!1),n!=null&&(n=Jo(n,r));for(var i=[],s=[],a=0,o=Wo(t);a=100&&(this.lastAsyncPause=Date.now(),await new Promise(e=>setTimeout(e,0)))}async traverse(e,n,r,i=null){if(await this.asyncPause(),n===null||typeof n!="object")return;n.referencedId&&(n=await this.resolveReference(n));const s=[];if(Array.isArray(n)){for(const c of n){if(typeof c!="object")break;if(this.activePromises>=this.maxChildrenPromises)await this.traverse(e,c,r,i);else{const d=this.traverse(e,c,r,i);s.push(d)}}return this.activePromises+=s.length,await Promise.all(s),void(this.activePromises-=s.length)}const a=this.tree.parse({id:i?this.getNodeId(n):e,raw:Object.assign({},n),atomic:!0,children:[]});i===null?this.tree.addSubtree(a):this.tree.addNode(a,i);const o=this.getSpeckleType(n);if(this.directNodeConverterExists(n))try{return await this.convertToNode(n.data||n,a),void await r(null)}catch(c){Zt.warn(`(Traversing - direct) Failed to convert ${o} with id: ${n.id}`,c)}const l=n;let u=this.getDisplayValue(l);if(a.model.atomic=!!u,u){if(Array.isArray(u))for(const c of u){const d=await this.resolveReference(c);d.units||(d.units=n.units);const f=this.tree.parse({id:this.getNodeId(d),raw:Object.assign({},d),atomic:!1,children:[]});await this.convertToNode(d,f),this.tree.addNode(f,a),await r({})}else{u=await this.resolveReference(u),u.units||(u.units=n.units);try{const c=this.tree.parse({id:this.getNodeId(u),raw:Object.assign({},u),atomic:!1,children:[]});await this.convertToNode(u,c),this.tree.addNode(c,a),await r({})}catch(c){Zt.warn(`(Traversing) Failed to convert obj with id: ${n.id} — ${c.message}`)}}if(n.speckle_type.toLowerCase().includes("builtelements")){const c=this.getElementsValue(n);return void(c&&(s.push(this.traverse(e,c,r,a)),this.activePromises+=s.length,await Promise.all(s),this.activePromises-=s.length))}}for(const c in l)if(c!=="__parents"&&c!=="bbox"&&c!=="__closure"&&!["displayMesh","@displayMesh","displayValue","@displayValue"].includes(c)&&typeof l[c]=="object"&&l[c]!==null)if(this.activePromises>=this.maxChildrenPromises)await this.traverse(e,l[c],r,a);else{const d=this.traverse(e,l[c],r,a);s.push(d)}this.activePromises+=s.length,await Promise.all(s),this.activePromises-=s.length}getNodeId(e){return this.spoofIDs?A8():e.id}async dechunk(e){if(!e||e.length===0||!e[0].referencedId)return e;const n=[];for(const r of e){const i=await this.objectLoader.getObject(r.referencedId);n.push(i.data)}return[].concat(...n)}async resolveReference(e){return e.referencedId?await this.objectLoader.getObject(e.referencedId):e}getSpeckleType(e){const n=this.getSpeckleTypeChain(e);for(const r of n)if(r in this.NodeConverterMapping)return r;return"Base"}getSpeckleTypeChain(e){let n=["Base"];return n=e.data?e.data.speckle_type?e.data.speckle_type.split(":").reverse():n:e.speckle_type?e.speckle_type.split(":").reverse():n,n.map(r=>r.split(".").reverse()[0])}directNodeConverterExists(e){const n=this.getSpeckleTypeChain(e);for(const r of n){const i=r in this.NodeConverterMapping;if(i)return i}return!1}async convertToNode(e,n){e.referencedId&&(e=await this.resolveReference(e));try{return this.directNodeConverterExists(e)?await this.NodeConverterMapping[this.getSpeckleType(e)](e,n):null}catch(r){throw Zt.warn(`(Direct convert) Failed to convert object with id: ${e.id}`),r}}getDisplayValue(e){const n=e.displayValue||e["@displayValue"]||e.displayMesh||e["@displayMesh"];if(n){if(Array.isArray(n)){const r=n.filter(i=>i);return n.length!==r.length&&Zt.warn(`Object ${e.id} has null display values which will be ignored`),r}return n}return null}getElementsValue(e){return e.elements||e["@elements"]}getBlockDefinition(e){return e["@blockDefinition"]||e.blockDefinition||e.definition||e["@definition"]}getBlockDefinitionGeometry(e){return e["@geometry"]||e.geometry}async View3DToNode(e,n){e.origin.units=e.units,e.target.units=e.units}async displayableLookup(e,n){if(this.directNodeConverterExists(e))await this.convertToNode(e,n);else{const r=this.getDisplayValue(e),i=this.getElementsValue(e),s=[...r||[],...i||[]];for(const a of s){const o=await this.resolveReference(a),l=this.tree.parse({id:this.getNodeId(o),raw:Object.assign({},o),atomic:!1,children:[]});this.tree.addNode(l,n),await this.displayableLookup(o,l)}}}async BlockInstanceToNode(e,n){const r=await this.resolveReference(this.getBlockDefinition(e));n.model.raw.definition=r;for(const i of this.getBlockDefinitionGeometry(r)){const s=await this.resolveReference(i);s.id=s.id+n.model.raw.transform.id;const a=this.tree.parse({id:this.getNodeId(s),raw:Object.assign({},s),atomic:!1,children:[]});this.tree.addNode(a,n),await this.displayableLookup(s,a);const o=this.getElementsValue(e);if(o)for(const l of o){const u=await this.resolveReference(l),c=this.tree.parse({id:this.getNodeId(u),raw:Object.assign({},u),atomic:!1,children:[]});c.model.raw.host=e.id,this.tree.addNode(c,n),await this.displayableLookup(u,c)}}}async RevitInstanceToNode(e,n){const r=async(s,a)=>{if(s)for(const o of s){const l=await this.resolveReference(o),u=this.tree.parse({id:this.getNodeId(l),raw:Object.assign({},l),atomic:!1,children:[]});a&&(u.model.raw.host=a),this.tree.addNode(u,n),await this.convertToNode(l,u)}},i=await this.resolveReference(e.definition);n.model.raw.definition=i,await r(this.getElementsValue(i)),await r(this.getDisplayValue(i)),await r(this.getElementsValue(e),e.id)}async PointcloudToNode(e,n){n.model.raw.points=await this.dechunk(e.points),n.model.raw.colors=await this.dechunk(e.colors)}async BrepToNode(e,n){try{if(!e)return;let r=this.getDisplayValue(e);if(Array.isArray(r)&&(r=r[0]),!r)return;const i=await this.resolveReference(r),s=this.tree.parse({id:this.getNodeId(i),raw:Object.assign({},i),atomic:!1,children:[]});await this.convertToNode(i,s),this.tree.addNode(s,n),delete e.Edges,delete e.Faces,delete e.Loops,delete e.Trims,delete e.Curve2D,delete e.Curve3D,delete e.Surfaces,delete e.Vertices}catch(r){throw Zt.warn(`Failed to convert brep id: ${e.id}`),r}}async MeshToNode(e,n){e&&(e.vertices&&e.vertices.length!==0?e.faces&&e.faces.length!==0?(n.model.raw.vertices=await this.dechunk(e.vertices),n.model.raw.faces=await this.dechunk(e.faces),n.model.raw.colors=await this.dechunk(e.colors)):Zt.warn(`Object id ${e.id} of type ${e.speckle_type} has no face data and will be ignored`):Zt.warn(`Object id ${e.id} of type ${e.speckle_type} has no vertex position data and will be ignored`))}async TextToNode(e,n){}async DimensionToNode(e,n){const r=[...this.getDisplayValue(e)];for(const a of r){const o=this.tree.parse({id:this.getNodeId(a),raw:Object.assign({},a),atomic:!1,children:[]});this.tree.addNode(o,n),await this.convertToNode(a,o)}const i=JSON.parse(JSON.stringify(e));switch(i.plane=i.RhinoProps.plane,this.getSpeckleTypeChain(i)[0]){case"LengthDimension":i.plane.origin=i.position;break;case"DistanceDimension":case"AngleDimension":i.plane.origin=i.textPosition}i.speckle_type="Objects.Other.Text";const s=this.tree.parse({id:this.getNodeId(i),raw:i,atomic:!1,children:[]});this.tree.addNode(s,n),await this.convertToNode(i,s)}async PointToNode(e,n){}async LineToNode(e,n){n.model.raw.start=Object.assign({},e.start),n.model.raw.end=Object.assign({},e.end)}async PolylineToNode(e,n){n.model.raw.value=await this.dechunk(e.value)}async BoxToNode(e,n){}async PolycurveToNode(e,n){n.model.nestedNodes=[];for(let r=0;r{await this.converter.asyncPause(),s++}),n=!1,i=o.totalChildrenCount),r++,this.emiter.emit($t.LoadProgress,{progress:r/(i+1),id:this.objectId})}a&&await a,Zt.warn(`Finished downloading object ${this.objectId} in ${(performance.now()-e)/1e3} seconds`),this.emiter.emit($t.DownloadComplete,this.objectUrl),s===0&&(Zt.warn(`Viewer: no 3d objects found in object ${this.objectId}`),this.emiter.emit("load-warning",{message:`No displayable objects found in object ${this.objectId}.`}))}cancelLoad(){this.cancel=!0}dispose(){this.loader.dispose()}}class lw{constructor(){this._events={}}on(e,n){this._events[e]||(this._events[e]=[]),this._events[e].push(n)}removeListener(e,n){this._events[e]&&(this._events[e]=this._events[e].filter(r=>r!==n))}emit(e,...n){this._events[e]&&this._events[e].forEach(r=>{r(...n)})}dispose(){this._events=null}}let x4;function tU(t){return t.isOrthographicCamera}(function(t){t[t.NONE=0]="NONE",t[t.ROTATE=1]="ROTATE",t[t.TRUCK=2]="TRUCK",t[t.OFFSET=3]="OFFSET",t[t.DOLLY=4]="DOLLY",t[t.ZOOM=5]="ZOOM",t[t.TOUCH_ROTATE=6]="TOUCH_ROTATE",t[t.TOUCH_TRUCK=7]="TOUCH_TRUCK",t[t.TOUCH_OFFSET=8]="TOUCH_OFFSET",t[t.TOUCH_DOLLY=9]="TOUCH_DOLLY",t[t.TOUCH_ZOOM=10]="TOUCH_ZOOM",t[t.TOUCH_DOLLY_TRUCK=11]="TOUCH_DOLLY_TRUCK",t[t.TOUCH_DOLLY_OFFSET=12]="TOUCH_DOLLY_OFFSET",t[t.TOUCH_ZOOM_TRUCK=13]="TOUCH_ZOOM_TRUCK",t[t.TOUCH_ZOOM_OFFSET=14]="TOUCH_ZOOM_OFFSET"})(x4||(x4={}));function Yn(t,e=1e-5){return Math.abs(t){const i=Math.pow(.95,-e*this.dollySpeed),s=this._sphericalEnd.radius*i,a=this._sphericalEnd.radius,o=a*(e>=0?-1:1);this.dollyTo(s,!0,.9),this.infinityDolly&&(s{const i=Math.pow(.95,e*this.dollySpeed),s=Math.pow(.95,-e*this.dollySpeed),a=this._sphericalEnd.radius*s;this.dollyTo(a,!0,.9),this.zoomTo(this._zoom*i,!1,1),this._didDolly=!0,this.dispatchEvent({type:"controlstart"}),this.dollyToCursor&&(this._dollyControlAmount=this._zoomEnd,this._dollyControlCoord.set(n,r))}}static install(){hc=new U,rU=new U,iU=new U,fE=new U,hE=new U,pE=new U,K$=new U,q$=new U}get hasRested(){return this._hasRested}set isTrucking(e){this._isTrucking=e}zoomTo(e,n=!1,r){this._zoomEnd=fp.clamp(e,this.minZoom,this.maxZoom),this._needsUpdate=!0,this.overrideZoomLerpRatio=n?.05:r,n||(this._zoom=this._zoomEnd);const i=!n||nU(this._zoom,this._zoomEnd,this.restThreshold);return this._createOnRestPromise(i)}dollyTo(e,n=!0,r){const i=this._sphericalEnd.radius,s=fp.clamp(e,this.minDistance,this.maxDistance);if(this.colliderMeshes.length>=1){const o=this._collisionTest(),l=nU(o,this._spherical.radius);if(!(i>s)&&l)return Promise.resolve();this._sphericalEnd.radius=Math.min(s,o)}else this._sphericalEnd.radius=s;this._needsUpdate=!0,this.overrideDollyLerpRatio=r,n||(this._spherical.radius=this._sphericalEnd.radius,this._didDolly=!0,this.dispatchEvent({type:"controlstart"}));const a=!n||nU(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(a)}update(e){this._hasRestedLastFrame=this._hasRested;const n=this._state===x4.NONE?this.dampingFactor:this.draggingDampingFactor,r=Math.min(n*e*60,1),i=this._sphericalEnd.theta-this._spherical.theta,s=this._sphericalEnd.phi-this._spherical.phi,a=this._sphericalEnd.radius-this._spherical.radius,o=K$.subVectors(this._targetEnd,this._target),l=q$.subVectors(this._focalOffsetEnd,this._focalOffset);if(Yn(i)&&Yn(s)&&Yn(a)&&Yn(o.x)&&Yn(o.y)&&Yn(o.z)&&Yn(l.x)&&Yn(l.y)&&Yn(l.z)?(this._spherical.copy(this._sphericalEnd),this._target.copy(this._targetEnd),this._focalOffset.copy(this._focalOffsetEnd)):(this._spherical.set(this._spherical.radius+a*(this.overrideDollyLerpRatio?this.overrideDollyLerpRatio:r),this._spherical.phi+s*r,this._spherical.theta+i*r),this._target.add(o.multiplyScalar(r)),this._focalOffset.add(l.multiplyScalar(r)),this._needsUpdate=!0),this._dollyControlAmount!==0){if(this._camera.isPerspectiveCamera){const f=this._camera,h=hc.setFromSpherical(this._sphericalEnd).applyQuaternion(this._yAxisUpSpaceInverse).normalize().negate(),p=rU.copy(h).cross(f.up).normalize();p.lengthSq()===0&&(p.x=1);const m=iU.crossVectors(p,h),v=this._sphericalEnd.radius*Math.tan(f.getEffectiveFOV()*fp.DEG2RAD*.5),g=(this._sphericalEnd.radius-this._dollyControlAmount-this._sphericalEnd.radius)/this._sphericalEnd.radius,b=hc.copy(this._targetEnd).add(p.multiplyScalar(this._dollyControlCoord.x*v*f.aspect)).add(m.multiplyScalar(this._dollyControlCoord.y*v));this._targetEnd.lerp(b,g),this._target.copy(this._targetEnd)}else if(tU(this._camera)){const f=this._camera,h=hc.set(this._dollyControlCoord.x,this._dollyControlCoord.y,(f.near+f.far)/(f.near-f.far)).unproject(f),p=rU.set(0,0,-1).applyQuaternion(f.quaternion),m=p.dot(f.up),v=Yn(m)?-h.dot(f.up):-h.dot(f.up)/m,g=iU.copy(h).add(p.multiplyScalar(v));this._targetEnd.lerp(g,1-f.zoom/this._dollyControlAmount),this._target.copy(this._targetEnd)}this._dollyControlAmount=0}const u=this._collisionTest();this._spherical.radius=Math.min(this._spherical.radius,u),this._spherical.makeSafe(),this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target),this._camera.lookAt(this._target),(!Yn(this._focalOffset.x)||!Yn(this._focalOffset.y)||!Yn(this._focalOffset.z))&&(this._camera.updateMatrix(),fE.setFromMatrixColumn(this._camera.matrix,0),hE.setFromMatrixColumn(this._camera.matrix,1),pE.setFromMatrixColumn(this._camera.matrix,2),fE.multiplyScalar(this._focalOffset.x),hE.multiplyScalar(-this._focalOffset.y),pE.multiplyScalar(this._focalOffset.z),hc.copy(fE).add(hE).add(pE),this._camera.position.add(hc)),this._boundaryEnclosesCamera&&this._encloseToBoundary(this._camera.position.copy(this._target),hc.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse),1);const c=this._zoomEnd-this._zoom;this._zoom+=c*(this.overrideZoomLerpRatio?this.overrideZoomLerpRatio:r),this._camera.zoom!==this._zoom?(Yn(c)&&(this._zoom=this._zoomEnd),this._camera.zoom=this._zoom,this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0,this._didZoom=!0):this._didZoom=!1;const d=this._needsUpdate;return d&&!this._updatedLastTime?(this._hasRested=!1,this.dispatchEvent({type:"wake"}),this.dispatchEvent({type:"update"})):d?(this.dispatchEvent({type:"update"}),!(Yn(i,this.restThreshold)&&Yn(s,this.restThreshold)&&Yn(a,this.restThreshold)&&Yn(o.x,this.restThreshold)&&Yn(o.y,this.restThreshold)&&Yn(o.z,this.restThreshold)&&Yn(l.x,this.restThreshold)&&Yn(l.y,this.restThreshold)&&Yn(l.z,this.restThreshold))||this._hasRested||this._isTrucking||tU(this._camera)&&this._didZoom||(this._hasRested=!0,this.dispatchEvent({type:"rest"}))):!d&&this._updatedLastTime&&this.dispatchEvent({type:"sleep"}),this._didDollyLastFrame&&(!(Yn(i,this.restThreshold)&&Yn(s,this.restThreshold)&&Yn(a,this.restThreshold)&&Yn(o.x,this.restThreshold)&&Yn(o.y,this.restThreshold)&&Yn(o.z,this.restThreshold)&&Yn(l.x,this.restThreshold)&&Yn(l.y,this.restThreshold)&&Yn(l.z,this.restThreshold))||this._isTrucking||tU(this._camera)&&this._didZoom||(this.dispatchEvent({type:"rest"}),this._didDollyLastFrame=!1)),this._didDolly&&(this._didDolly=!1,this._didDollyLastFrame=!0),this._updatedLastTime=d,this._needsUpdate=!1,d&&!this._hasRested}}class T1t{constructor(e){this.viewer=e,this.camera=new ns(55,window.innerWidth/window.innerHeight),this.camera.up.set(0,0,1),this.camera.position.set(1,1,1),this.camera.updateProjectionMatrix();const n=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight;this.orthoCamera=new Kf(-50*n/2,50*n/2,25,-25,.001,1e4),this.orthoCamera.up.set(0,0,1),this.orthoCamera.position.set(100,100,100),this.orthoCamera.updateProjectionMatrix(),Hg.install({THREE:YKe}),D$.install(),this.controls=new D$(this.camera,this.viewer.container),this.controls.maxPolarAngle=Math.PI/2,this.setupWASDControls(),this.cameras=[{camera:this.camera,controls:this.controls,name:"perspective",active:!0},{camera:this.orthoCamera,controls:this.controls,name:"ortho",active:!1}],this.orbiting=!1,this.controls.addEventListener("transitionstart",()=>{this.orbiting=!0}),this.controls.addEventListener("controlend",()=>{}),this.controls.addEventListener("rest",()=>{setTimeout(()=>{this.orbiting=!1},400)}),window.addEventListener("resize",this.onWindowResize.bind(this),!1),this.onWindowResize()}get activeCam(){return this.cameras[0].active?this.cameras[0]:this.cameras[1]}set activeCam(e){if(e==="perspective")this.setPerspectiveCameraOn();else{if(e!=="ortho")throw new Error(`'${e}' projection mode is invalid. Try with 'perspective' or 'ortho'.`);this.setOrthoCameraOn()}}set enabled(e){this.controls.enabled=e}setPerspectiveCameraOn(){this.cameras[0].active||(this.cameras[0].active=!0,this.cameras[1].active=!1,this.setupPerspectiveCamera(),this.viewer.needsRender=!0)}setOrthoCameraOn(){this.cameras[1].active||(this.cameras[0].active=!1,this.cameras[1].active=!0,this.setupOrthoCamera(),this.viewer.needsRender=!0)}toggleCameras(){this.cameras[0].active?this.setOrthoCameraOn():this.setPerspectiveCameraOn()}setupOrthoCamera(){this.previousDistance=this.controls.distance,this.controls.mouseButtons.wheel=Hg.ACTION.ZOOM;const e=new U;this.camera.getWorldDirection(e);const n=new U().copy(this.viewer.World.worldOrigin).clone().sub(this.camera.position).length(),r=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight,i=this.camera.fov,s=2*n*Math.atan(i*(Math.PI/180)/2),a=s*r;this.orthoCamera.zoom=1,this.orthoCamera.left=a/-2,this.orthoCamera.right=a/2,this.orthoCamera.top=s/2,this.orthoCamera.bottom=s/-2,this.orthoCamera.far=this.camera.far,this.orthoCamera.near=1e-4,this.orthoCamera.updateProjectionMatrix(),this.orthoCamera.position.copy(this.camera.position),this.orthoCamera.quaternion.copy(this.camera.quaternion),this.orthoCamera.updateProjectionMatrix(),this.controls.camera=this.orthoCamera,this.viewer.emit("projection-change","ortho")}setupPerspectiveCamera(){this.controls.mouseButtons.wheel=Hg.ACTION.DOLLY,this.camera.position.copy(this.orthoCamera.position),this.camera.quaternion.copy(this.orthoCamera.quaternion),this.camera.updateProjectionMatrix(),this.controls.camera=this.camera,this.controls.zoomTo(1),this.enableRotations(),this.viewer.emit("projection-change","perspective")}disableRotations(){this.controls.mouseButtons.left=Hg.ACTION.TRUCK}enableRotations(){this.controls.mouseButtons.left=Hg.ACTION.ROTATE}setupWASDControls(){const i=new Y5(87,16.666),s=new Y5(65,16.666),a=new Y5(83,16.666),o=new Y5(68,16.666),l=new Array(4),u=(c,d)=>{l[c]=d,l.every(f=>f===!1)?(this.controls.isTrucking=!1,this.controls.dispatchEvent({type:"rest"})):this.controls.isTrucking=!0};s.addEventListener(rl.HOLD_START,(function(){this.controls.dispatchEvent({type:"controlstart"})}).bind(this)),s.addEventListener("holding",(function(c){this.viewer.mouseOverRenderer!==!1&&(u(0,!0),this.controls.truck(-.01*c.deltaTime,0,!1))}).bind(this)),s.addEventListener(rl.HOLD_END,(function(){u(0,!1)}).bind(this)),o.addEventListener(rl.HOLD_START,(function(){this.controls.dispatchEvent({type:"controlstart"})}).bind(this)),o.addEventListener("holding",(function(c){this.viewer.mouseOverRenderer!==!1&&(u(1,!0),this.controls.truck(.01*c.deltaTime,0,!1))}).bind(this)),o.addEventListener(rl.HOLD_END,(function(){u(1,!1)}).bind(this)),i.addEventListener(rl.HOLD_START,(function(){this.controls.dispatchEvent({type:"controlstart"})}).bind(this)),i.addEventListener("holding",(function(c){this.viewer.mouseOverRenderer!==!1&&(u(2,!0),this.controls.forward(.01*c.deltaTime,!1))}).bind(this)),i.addEventListener(rl.HOLD_END,(function(){u(2,!1)}).bind(this)),a.addEventListener(rl.HOLD_START,(function(){this.controls.dispatchEvent({type:"controlstart"})}).bind(this)),a.addEventListener("holding",(function(c){this.viewer.mouseOverRenderer!==!1&&(u(3,!0),this.controls.forward(-.01*c.deltaTime,!1))}).bind(this)),a.addEventListener(rl.HOLD_END,(function(){u(3,!1)}).bind(this))}onWindowResize(){this.camera.aspect=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight,this.camera.updateProjectionMatrix();const e=new U;this.camera.getWorldDirection(e);const n=new U;this.controls.getTarget(n);const r=n.clone().sub(this.camera.position).dot(e),i=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight,s=this.camera.fov,a=2*r*Math.atan(s*(Math.PI/180)/2),o=a*i;this.orthoCamera.zoom=1,this.orthoCamera.left=o/-2,this.orthoCamera.right=o/2,this.orthoCamera.top=a/2,this.orthoCamera.bottom=a/-2,this.orthoCamera.updateProjectionMatrix()}_setOrbitPoint(e,n){const r=this.viewer.container.getBoundingClientRect(),i=e-r.left,s=n-r.top,a=new Oe(i/r.width*2-1,(r.height-s)/r.height*2-1),o=new yy;o.setFromCamera(a,this.camera);const l=o.intersectObjects(this.viewer.sceneManager.allObjects);l.length!==0&&this.controls.setOrbitPoint(l[0].point.x,l[0].point.y,l[0].point.z,!1)}}var st;(function(t){t[t.MESH=0]="MESH",t[t.LINE=1]="LINE",t[t.POINT=2]="POINT",t[t.POINT_CLOUD=3]="POINT_CLOUD",t[t.TEXT=4]="TEXT"})(st||(st={}));const N6={offset:0,count:0},Al={offset:0,count:1/0};var Nh;(function(t){t.POSITION="POSITION",t.COLOR="COLOR",t.NORMAL="NORMAL",t.UV="UV",t.TANGENT="TANGENT",t.INDEX="INDEX"})(Nh||(Nh={}));class ur{static updateRTEGeometry(e,n){if(e.type==="BufferGeometry"||e.type==="PlaneGeometry"||e.type==="CircleGeometry"){const r=new Float32Array(n.length),i=e.attributes.position.array;ur.DoubleToHighLowBuffer(n,r,i),e.setAttribute("position_low",new xt(r,3))}else if(e.type==="LineGeometry"||e.type==="LineSegmentsGeometry"){const r=new Float32Array(n.length),i=e.attributes.instanceStart.array;ur.DoubleToHighLowBuffer(n,r,i);const s=new Jv(new Float32Array(r),6,1);e.setAttribute("instanceStartLow",new qs(s,3,0)),e.setAttribute("instanceEndLow",new qs(s,3,3))}}static mergeGeometryAttribute(e,n){let r=0;for(let i=0;ia.attributes[Nh.INDEX]),s=e.map(a=>a.attributes[Nh.POSITION]);r.attributes[Nh.INDEX]=ur.mergeIndexAttribute(i,s)}for(const i in n)if(i!==Nh.INDEX){const s=e.map(a=>a.attributes[i]);r.attributes[i]=ur.mergeGeometryAttribute(s,i===Nh.POSITION?new Float64Array(s.reduce((a,o)=>a+o.length,0)):new Float32Array(s.reduce((a,o)=>a+o.length,0)))}return e.forEach(i=>{for(const s in i.attributes)delete i.attributes[s]}),r}static transformGeometryData(e,n){if(!e.attributes.POSITION)return;const r=n.elements;for(let i=0;i>16&255,a=i>>8&255,o=255&i;n[3*r]=s/255,n[3*r+1]=a/255,n[3*r+2]=o/255}return n}static DoubleToHighLowVector(e,n,r){let i=e.x;if(i>=0){this.floatArrayBuff[0]=i;const s=this.floatArrayBuff[0];r.x=s,n.x=i-s}else{this.floatArrayBuff[0]=-i;const s=this.floatArrayBuff[0];r.x=-s,n.x=i+s}if(i=e.y,i>=0){this.floatArrayBuff[0]=i;const s=this.floatArrayBuff[0];r.y=s,n.y=i-s}else{this.floatArrayBuff[0]=-i;const s=this.floatArrayBuff[0];r.y=-s,n.y=i+s}if(i=e.z,i>=0){this.floatArrayBuff[0]=i;const s=this.floatArrayBuff[0];r.z=s,n.z=i-s}else{this.floatArrayBuff[0]=-i;const s=this.floatArrayBuff[0];r.z=-s,n.z=i+s}}static DoubleToHighLowBuffer(e,n,r){for(let i=0;i=0){this.floatArrayBuff[0]=s;const a=this.floatArrayBuff[0];r[i]=a,n[i]=s-a}else{this.floatArrayBuff[0]=-s;const a=this.floatArrayBuff[0];r[i]=-a,n[i]=s+a}}}static computeVertexNormals(e,n){const r=e.index,i=e.getAttribute("position");if(i!==void 0){let s=e.getAttribute("normal");if(s===void 0)s=new un(new Float32Array(3*i.count),3),e.setAttribute("normal",s);else for(let p=0,m=s.count;p=65535||e.length>=65535?(s=new Uint32Array(e.length),s.set(e,0),i.setIndex(new Gv(s,1))):(s=new Uint16Array(e.length),s.set(e,0),i.setIndex(new Av(s,1))),i.setAttribute("position",new xt(n,3)),i.computeBoundingBox(),new Bd(i,r)}constructor(e,n={}){super(e,n)}raycast(e,n=Ki){const r=super.raycast(this.transformInput(e),n);return r.forEach(i=>{i.point=this.transformOutput(i.point)}),r}raycastFirst(e,n=Ki){const r=super.raycastFirst(this.transformInput(e),n);return r.point=this.transformOutput(r.point),r}shapecast(e){const n=new Jt,r=new td,i=Object.create(null);return e.intersectsBounds&&(i.intersectsBounds=(s,a,o,l,u)=>(n.copy(s),this.transformOutput(n),e.intersectsBounds(n,a,o,l,u))),e.intersectsTriangle&&(i.intersectsTriangle=(s,a,o,l)=>(r.copy(s),this.transformOutput(r.a),this.transformOutput(r.b),this.transformOutput(r.c),e.intersectsTriangle(r,a,o,l))),i.intersectsRange=e.intersectsRange,i.traverseBoundsOrder=e.traverseBoundsOrder,super.shapecast(i)}transformInput(e){return Bd.MatBuff.copy(this.inputOriginTransform).premultiply(this.inputTransform),e.applyMatrix4(Bd.MatBuff)}transformOutput(e){return Bd.MatBuff.copy(this.outputOriginTransfom).multiply(this.outputTransform),e.applyMatrix4(Bd.MatBuff)}getBoundingBox(e){return super.getBoundingBox(e),this.transformOutput(e)}getVertexAtIndex(e){const n=this.geometry.attributes.position.array;return this.transformOutput(new U(n[3*e],n[3*e+1],n[3*e+2]))}}Bd.MatBuff=new Be;class Vo{constructor(e){this.batchObjects=[],this.bounds=new Jt(new U(0,0,0),new U(0,0,0)),this.boxHelpers=[],this.tas=null,this.lastRefitTime=0,this.batchObjects=e,this.buildTAS(),this.getBoundingBox(this.bounds)}buildTAS(){const e=[],n=new Float32Array(3*Vo.CUBE_VERTS*this.batchObjects.length);let r=0;for(let i=0;ia+r/3)),this.batchObjects[i].tasVertIndexStart=r/3,this.batchObjects[i].tasVertIndexEnd=r/3+Vo.CUBE_VERTS,r+=3*Vo.CUBE_VERTS,Vo.debugBoxes){const a=new OT(s);a.layers.set(kt.PROPS),this.boxHelpers.push(a)}}this.tas=Bd.buildBVH(e,n),this.tas.inputTransform=new Be,this.tas.outputTransform=new Be,this.tas.inputOriginTransform=new Be,this.tas.outputOriginTransfom=new Be}updateVertArray(e,n,r){r[n]=e.min.x,r[n+1]=e.min.y,r[n+2]=e.max.z,r[n+3]=e.max.x,r[n+4]=e.min.y,r[n+5]=e.max.z,r[n+6]=e.max.x,r[n+7]=e.max.y,r[n+8]=e.max.z,r[n+9]=e.min.x,r[n+10]=e.max.y,r[n+11]=e.max.z,r[n+12]=e.min.x,r[n+13]=e.min.y,r[n+14]=e.min.z,r[n+15]=e.max.x,r[n+16]=e.min.y,r[n+17]=e.min.z,r[n+18]=e.max.x,r[n+19]=e.max.y,r[n+20]=e.min.z,r[n+21]=e.min.x,r[n+22]=e.max.y,r[n+23]=e.min.z}refit(){const e=performance.now(),n=this.tas.geometry.attributes.position.array,r=new Jt;for(let i=0;i{const o=this.tas.geometry.index.array[3*a.faceIndex],l=Math.trunc(o/Vo.CUBE_VERTS);i.copy(e);const u=this.batchObjects[l].bvh.raycast(i,n);u.forEach(c=>{c.batchObject=this.batchObjects[l]}),r.push(...u)}),r}raycastFirst(e,n=Ki){const r=new Ko;r.copy(e);const i=this.tas.raycastFirst(r,Ki);if(!i)return null;const s=this.tas.geometry.index.array[3*i.faceIndex],a=Math.trunc(s/Vo.CUBE_VERTS);r.copy(e);const o=this.batchObjects[a].bvh.raycast(r,n);o.forEach(l=>{l.batchObject=this.batchObjects[a]}),null.push(...o)}shapecast(e){let n=!1;return this.tas.shapecast({intersectsBounds:(r,i,s,a,o)=>e.intersectsTAS(r,i,s,a,o),intersectsRange:r=>{const i=this.tas.geometry.index.array[3*r],s=Math.trunc(i/Vo.CUBE_VERTS);return n||(n=this.batchObjects[s].bvh.shapecast((a=>{const o=Object.create(null);return e.intersectsBounds&&(o.intersectsBounds=e.intersectsBounds),e.intersectsTriangle&&(o.intersectsTriangle=(l,u,c,d)=>e.intersectsTriangle(l,u,c,d,a)),o.intersectsRange=e.intersectsRange,o.traverseBoundsOrder=e.traverseBoundsOrder,o})(this.batchObjects[s]))),!1}}),n}getBoundingBox(e){return this.tas.getBoundingBox(e),e}}Vo.debugBoxes=!1,Vo.cubeIndices=[0,1,2,2,3,0,1,5,6,6,2,1,7,6,5,5,4,7,4,0,3,3,7,4,4,5,1,1,0,4,3,2,6,6,7,3],Vo.CUBE_VERTS=8;class E1t{static triangulateFace(e,n,r){let i=n[e];function s(h){return e+h+1}function a(h){const p=3*n[s(h)];return new mv(r[p],r[p+1],r[p+2])}i<3&&(i+=3);const o=Array(3*(i-2)),l=new mv(0,0,0);for(let h=i-1,p=0;p=3;){let h=!0;if(i>3&&f0}}class mv{constructor(e,n,r){this.x=e,this.y=n,this.z=r}add(e){return new mv(this.x+e.x,this.y+e.y,this.z+e.z)}sub(e){return new mv(this.x-e.x,this.y-e.y,this.z-e.z)}mul(e){return new mv(this.x-e,this.y-e,this.z-e)}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}cross(e){const n=this.y*e.z-this.z*e.y,r=this.z*e.x-this.x*e.z,i=this.x*e.y-this.y*e.x;return new mv(n,r,i)}squareSum(){return this.x*this.x+this.y*this.y+this.z*this.z}normalize(){const e=1/Math.sqrt(this.squareSum());this.x*=e,this.y*=e,this.z*=e}}const Rt={Millimeters:"mm",Centimeters:"cm",Meters:"m",Kilometers:"km",Inches:"in",Feet:"ft",Yards:"yd",Miles:"mi"};function Os(t,e=Rt.Meters){switch(t=W$(t),e=W$(e),t){case Rt.Millimeters:switch(e){case Rt.Centimeters:return .1;case Rt.Meters:return .001;case Rt.Kilometers:return 1e-6;case Rt.Inches:return .0393701;case Rt.Feet:return .00328084;case Rt.Yards:return .00109361;case Rt.Miles:return 621371e-12}break;case Rt.Centimeters:switch(e){case Rt.Millimeters:return 10;case Rt.Meters:return .01;case Rt.Kilometers:return 1e-5;case Rt.Inches:return .393701;case Rt.Feet:return .0328084;case Rt.Yards:return .0109361;case Rt.Miles:return 621371e-11}break;case Rt.Meters:switch(e){case Rt.Millimeters:return 1e3;case Rt.Centimeters:return 100;case Rt.Kilometers:return .001;case Rt.Inches:return 39.3701;case Rt.Feet:return 3.28084;case Rt.Yards:return 1.09361;case Rt.Miles:return 621371e-9}break;case Rt.Kilometers:switch(e){case Rt.Millimeters:return 1e6;case Rt.Centimeters:return 1e5;case Rt.Meters:return 1e3;case Rt.Inches:return 39370.1;case Rt.Feet:return 3280.84;case Rt.Yards:return 1093.61;case Rt.Miles:return .621371}break;case Rt.Inches:switch(e){case Rt.Millimeters:return 25.4;case Rt.Centimeters:return 2.54;case Rt.Meters:return .0254;case Rt.Kilometers:return 254e-7;case Rt.Feet:return .0833333;case Rt.Yards:return .027777694;case Rt.Miles:return 157828e-10}break;case Rt.Feet:switch(e){case Rt.Millimeters:return 304.8;case Rt.Centimeters:return 30.48;case Rt.Meters:return .3048;case Rt.Kilometers:return 3048e-7;case Rt.Inches:return 12;case Rt.Yards:return .333332328;case Rt.Miles:return 189394e-9}break;case Rt.Miles:switch(e){case Rt.Millimeters:return 1609e3;case Rt.Centimeters:return 160934;case Rt.Meters:return 1609.34;case Rt.Kilometers:return 1.60934;case Rt.Inches:return 63360;case Rt.Feet:return 5280;case Rt.Yards:return 1759.99469184}}return 1}function W$(t){if(!t)return Rt.Meters;switch(t.toLowerCase()){case"mm":case"mil":case"millimeters":case"millimetres":return Rt.Millimeters;case"cm":case"centimetre":case"centimeter":case"centimetres":case"centimeters":return Rt.Centimeters;case"m":case"meter":case"metre":case"meters":case"metres":default:return Rt.Meters;case"inches":case"inch":case"in":return Rt.Inches;case"feet":case"foot":case"ft":return Rt.Feet;case"yard":case"yards":case"yd":return Rt.Yards;case"miles":case"mile":case"mi":return Rt.Miles;case"km":case"kilometers":return Rt.Kilometers}}var Kt;(function(t){t.View3D="View3D",t.BlockInstance="BlockInstance",t.Pointcloud="Pointcloud",t.Brep="Brep",t.Mesh="Mesh",t.Point="Point",t.Line="Line",t.Polyline="Polyline",t.Box="Box",t.Polycurve="Polycurve",t.Curve="Curve",t.Circle="Circle",t.Arc="Arc",t.Ellipse="Ellipse",t.RevitInstance="RevitInstance",t.Text="Text",t.Unknown="Unknown"})(Kt||(Kt={}));const S1=[Kt.Pointcloud,Kt.Brep,Kt.Mesh,Kt.Point,Kt.Line,Kt.Polyline,Kt.Box,Kt.Polycurve,Kt.Curve,Kt.Circle,Kt.Arc,Kt.Ellipse,Kt.Text];class Sn{static getSpeckleType(e){let n=["Base"];n=e.raw.data?e.raw.data.speckle_type?e.raw.data.speckle_type.split(":").reverse():n:e.raw.speckle_type?e.raw.speckle_type.split(":").reverse():n,n=n.map(r=>r.split(".").reverse()[0]);for(const r of n)if(r in Kt)return r;return Kt.Unknown}static convertNodeToGeometryData(e){switch(Sn.getSpeckleType(e)){case Kt.BlockInstance:return Sn.BlockInstanceToGeometryData(e);case Kt.Pointcloud:return Sn.PointcloudToGeometryData(e);case Kt.Brep:return Sn.BrepToGeometryData(e);case Kt.Mesh:return Sn.MeshToGeometryData(e);case Kt.Point:return Sn.PointToGeometryData(e);case Kt.Line:return Sn.LineToGeometryData(e);case Kt.Polyline:return Sn.PolylineToGeometryData(e);case Kt.Box:return Sn.BoxToGeometryData(e);case Kt.Polycurve:return Sn.PolycurveToGeometryData(e);case Kt.Curve:return Sn.CurveToGeometryData(e);case Kt.Circle:return Sn.CircleToGeometryData(e);case Kt.Arc:return Sn.ArcToGeometryData(e);case Kt.Ellipse:return Sn.EllipseToGeometryData(e);case Kt.View3D:return Sn.View3DToGeometryData(e);case Kt.RevitInstance:return Sn.RevitInstanceToGeometryData(e);case Kt.Text:return Sn.TextToGeometryData(e);case Kt.Unknown:return null}}static disposeNodeGeometryData(e){switch(Sn.getSpeckleType(e)){case Kt.Pointcloud:e.raw.vertices=[],e.raw.colors=[];break;case Kt.Mesh:e.raw.vertices=[],e.raw.faces=[],e.raw.colors=[];break;case Kt.Point:e.raw.value?e.raw.value=[]:(delete e.raw.x,delete e.raw.y,delete e.raw.z);break;case Kt.Line:e.raw.start.value?e.raw.start.value=[]:(delete e.raw.start.x,delete e.raw.start.y,delete e.raw.start.z),e.raw.end.value?e.raw.end.value=[]:(delete e.raw.end.x,delete e.raw.end.y,delete e.raw.end.z);break;case Kt.Polyline:e.raw.value=[]}}static View3DToGeometryData(e){const n=Sn.PointToVector3(e.raw.origin),r=Sn.PointToVector3(e.raw.target);return e.raw.origin=n,e.raw.target=r,{attributes:null,bakeTransform:null,transform:null}}static BlockInstanceToGeometryData(e){const n=Os(e.raw.units),r=Array.isArray(e.raw.transform)?e.raw.transform:e.raw.transform.value?e.raw.transform.value:e.raw.transform.matrix,i=new Be().fromArray(r).transpose();return{attributes:null,bakeTransform:null,transform:new Be().makeScale(n,n,n).multiply(i).multiply(new Be().makeScale(1/n,1/n,1/n))}}static RevitInstanceToGeometryData(e){const n=Os(e.raw.units),r=Array.isArray(e.raw.transform)?e.raw.transform:e.raw.transform.value?e.raw.transform.value:e.raw.transform.matrix,i=new Be().fromArray(r).transpose();return{attributes:null,bakeTransform:null,transform:new Be().makeScale(n,n,n).multiply(i).multiply(new Be().makeScale(1/n,1/n,1/n))}}static PointcloudToGeometryData(e){const n=Os(e.raw.units),r=e.raw.points,i=e.raw.colors;let s=null;return i&&i.length!==0&&(i.length!==r.length/3&&Zt.warn(`Mesh (id ${e.raw.id}) colours are mismatched with vertice counts. The number of colours must equal the number of vertices.`),s=Sn.unpackColors(i,!0)),{attributes:{POSITION:r,COLOR:s},bakeTransform:new Be().makeScale(n,n,n),transform:null}}static BrepToGeometryData(e){return null}static MeshToGeometryData(e){if(!e.raw)return;const n=Os(e.raw.units),r=[];if(!e.raw.vertices||!e.raw.faces)return;const i=e.raw.vertices,s=e.raw.faces,a=e.raw.colors;let o,l=0;for(;ld!==void 0))}l+=u+1}return a&&a.length!==0&&(a.length!==i.length/3&&Zt.warn(`Mesh (id ${e.raw.id}) colours are mismatched with vertice counts. The number of colours must equal the number of vertices.`),o=Sn.unpackColors(a)),{attributes:{POSITION:i,INDEX:r,...o&&{COLOR:o}},bakeTransform:new Be().makeScale(n,n,n),transform:null}}static TextToGeometryData(e){const n=Os(e.raw.units),r=e.raw.plane,i=new U(r.origin.x,r.origin.y,r.origin.z),s=new Be().makeScale(n,n,n),a=new Be().makeBasis(r.xdir,r.ydir,r.normal);return a.setPosition(i),a.premultiply(s),{attributes:null,bakeTransform:a,transform:null,metaData:e.raw}}static PointToGeometryData(e){const n=Os(e.raw.units);return{attributes:{POSITION:this.PointToFloatArray(e.raw)},bakeTransform:new Be().makeScale(n,n,n),transform:null}}static LineToGeometryData(e){const n=Os(e.raw.units);return{attributes:{POSITION:this.PointToFloatArray(e.raw.start).concat(this.PointToFloatArray(e.raw.end))},bakeTransform:new Be().makeScale(n,n,n),transform:null}}static PolylineToGeometryData(e){const n=Os(e.raw.units);return e.raw.closed&&e.raw.value.push(e.raw.value[0],e.raw.value[1],e.raw.value[2]),{attributes:{POSITION:e.raw.value.slice(0)},bakeTransform:new Be().makeScale(n,n,n),transform:null}}static BoxToGeometryData(e){const n=Os(e.raw.units),r=this.PointToVector3(e.raw.basePlane.origin),i=(e.raw.xSize.end-e.raw.xSize.start)*n,s=(e.raw.ySize.end-e.raw.ySize.start)*n,a=(e.raw.zSize.end-e.raw.zSize.start)*n,o=new Jt(new U(.5*-i,.5*-s,.5*-a),new U(.5*i,.5*s,.5*a));return{attributes:{POSITION:[o.min.x,o.min.y,o.min.z,o.min.x,o.max.y,o.min.z,o.min.x,o.min.y,o.max.z,o.min.x,o.max.y,o.max.z,o.min.x,o.min.y,o.min.z,o.min.x,o.min.y,o.max.z,o.min.x,o.max.y,o.min.z,o.min.x,o.max.y,o.max.z,o.max.x,o.min.y,o.min.z,o.max.x,o.max.y,o.min.z,o.max.x,o.min.y,o.max.z,o.max.x,o.max.y,o.max.z,o.max.x,o.min.y,o.min.z,o.max.x,o.min.y,o.max.z,o.max.x,o.max.y,o.min.z,o.max.x,o.max.y,o.max.z,o.max.x,o.min.y,o.max.z,o.min.x,o.min.y,o.max.z,o.max.x,o.min.y,o.min.z,o.min.x,o.min.y,o.min.z,o.max.x,o.max.y,o.max.z,o.min.x,o.max.y,o.max.z,o.max.x,o.max.y,o.min.z,o.min.x,o.max.y,o.min.z]},bakeTransform:new Be().setPosition(r),transform:null}}static PolycurveToGeometryData(e){const n=[];for(let r=0;r0,u=new U().subVectors(r,n);u.normalize();const c=new U().subVectors(i,n);c.normalize();const d=new U().crossVectors(u,c);if(d.normalize(),d.length()===0){const M=new U().subVectors(s,n);M.normalize(),d.copy(new U().crossVectors(u,M)),d.normalize()}const f=new U().crossVectors(d,u);f.normalize();const h=Math.min(Math.max(u.dot(c),-1),1),p=Math.acos(h),m=e.raw.radius,v=new gy(0,0,m,m,0,p,l,0).getPoints(50),g=new Be,b=Os(e.raw.plane.units),y=new Be().makeBasis(u,f,d),x=new Be().setPosition(n.multiplyScalar(b));g.multiply(x).multiply(y);const T=new Be().scale(new U(b,b,b));return g.multiply(T),{attributes:{POSITION:this.FlattenVector3Array(v)},bakeTransform:g,transform:null}}static EllipseToGeometryData(e){const n=Os(e.raw.units),r=new U(e.raw.plane.origin.x,e.raw.plane.origin.y,e.raw.plane.origin.z).multiplyScalar(n),i=new U(e.raw.plane.xdir.x,e.raw.plane.xdir.y,e.raw.plane.xdir.z).normalize(),s=new U(e.raw.plane.ydir.x,e.raw.plane.ydir.y,e.raw.plane.ydir.z).normalize();let a=2*Math.PI*e.raw.firstRadius*n*10;a=parseInt(a.toString());const o=[];for(let l=0;l<=a;l++){const u=l*Math.PI*2/a,c=Math.cos(u)*e.raw.firstRadius*n,d=Math.sin(u)*e.raw.secondRadius*n,f=new U(i.x*c,i.y*c,i.z*c),h=new U(s.x*d,s.y*d,s.z*d),p=new U().addVectors(f,h).add(r);o.push(p)}return{attributes:{POSITION:this.FlattenVector3Array(o)},bakeTransform:null,transform:null}}static getCircularCurvePoints(e,n,r=0,i=2*Math.PI,s=.1){const a=this.PointToVector3(e.origin),o=this.PointToVector3(e.xdir),l=this.PointToVector3(e.ydir);o.normalize(),l.normalize();let u=(i-r)*n/s;u=parseInt(u.toString());const c=[];for(let d=0;d<=u;d++){const f=r+d*(i-r)/u,h=Math.cos(f)*n,p=Math.sin(f)*n,m=new U(o.x*h,o.y*h,o.z*h),v=new U(l.x*p,l.y*p,l.z*p),g=new U().addVectors(m,v).add(a);c.push(g)}return c}static PointToVector3(e,n=!0){const r=n?Os(e.units):1;let i=null;return i=e.value?new U(e.value[0]*r,e.value[1]*r,e.value[2]*r):new U(e.x*r,e.y*r,e.z*r),i}static PointToFloatArray(e){return e.value?[e.value[0],e.value[1],e.value[2]]:[e.x,e.y,e.z]}static FlattenVector3Array(e){const n=new Array(3*e.length),r=[];for(let i=0,s=0;i>16&255,o=s>>8&255,l=255&s;r[3*i]=a/255,r[3*i+1]=o/255,r[3*i+2]=l/255,n&&(r[3*i]=Sn.srgbToLinear(r[3*i]),r[3*i+1]=Sn.srgbToLinear(r[3*i+1]),r[3*i+2]=Sn.srgbToLinear(r[3*i+2]))}return r}static srgbToLinear(e){return e<=0?0:e>=1?1:e<.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}}var wh;Sn.keepGeometryData=!1;class Is{static hashCode(e){let n;for(let r=0;r0&&(this._geometryType!==st.MESH||this._renderData.geometry.attributes.INDEX&&this._renderData.geometry.attributes.INDEX.length>0)}constructor(e){this._aabb=null,this._renderData=e,this._geometryType=this.getGeometryType(),this._materialHash=this.getMaterialHash(),this._batchId,this._batchIndexCount,this._batchIndexStart,this._batchVertexStart,this._batchVertexEnd}setBatchData(e,n,r,i,s){this._batchId=e,this._batchIndexStart=n,this._batchIndexCount=r,i!==void 0&&(this._batchVertexStart=i),s!==void 0&&(this._batchVertexEnd=s)}computeAABB(){this._aabb=new Jt().setFromArray(this._renderData.geometry.attributes.POSITION)}getGeometryType(){switch(this._renderData.speckleType){case Kt.Mesh:case Kt.Brep:return st.MESH;case Kt.Point:return st.POINT;case Kt.Pointcloud:return st.POINT_CLOUD;case Kt.Text:return st.TEXT;default:return st.LINE}}disposeGeometry(){for(const e in this._renderData.geometry.attributes)this._renderData.geometry.attributes[e]=[]}renderMaterialToString(){return this.renderData.renderMaterial.color.toString()+"/"+this.renderData.renderMaterial.opacity.toString()+"/"+this.renderData.renderMaterial.roughness.toString()+"/"+this.renderData.renderMaterial.metalness.toString()}displayStyleToString(){var e;return((e=this.renderData.displayStyle.color)===null||e===void 0?void 0:e.toString())+"/"+this.renderData.displayStyle.lineWeight.toString()}getMaterialHash(){const e=!this.renderData.renderMaterial||this.geometryType!==st.MESH&&this.geometryType!==st.POINT&&this.geometryType!==st.TEXT?this.renderData.displayStyle&&this.geometryType!==st.MESH&&this.geometryType!==st.POINT?this.displayStyleToString():"":this.renderMaterialToString();let n="";this.renderData.geometry.attributes&&(n=this.renderData.geometry.attributes.COLOR?"vertexColors":"");const r=this.geometryType.toString()+n+e+(this.geometryType===st.TEXT?this._renderData.id:"");return wh.hashCode(r)}}wh=Is,Is.NullRenderMaterialHash=wh.hashCode(st.MESH.toString()),Is.NullRenderMaterialVertexColorsHash=wh.hashCode(st.MESH.toString()+"vertexColors"),Is.NullDisplayStyleHash=wh.hashCode(st.LINE.toString()),Is.NullPointMaterialHash=wh.hashCode(st.POINT.toString()),Is.NullPointCloudMaterialHash=wh.hashCode(st.POINT_CLOUD.toString()),Is.NullPointCloudVertexColorsMaterialHash=wh.hashCode(st.POINT_CLOUD.toString()+"vertexColors");class Qr extends ND{set pixelThreshold(e){this.userData.pixelThreshold.value=e,this.needsUpdate=!0}constructor(e,n=[]){super(e),this.userData.uViewer_high={value:new U},this.userData.uViewer_low={value:new U},this.userData.pixelThreshold={value:0},this.vertProgram=` #include #include #include @@ -4549,7 +4549,7 @@ __p+='`),u}),s+=`'; #include } - `,this.uniforms=Na.merge([wi.line.uniforms,{uViewer_high:{value:this.userData.uViewer_high.value},uViewer_low:{value:this.userData.uViewer_low.value},pixelThreshold:{value:this.userData.pixelThreshold}}]),this.onBeforeCompile=function(r){r.uniforms.uViewer_high=this.userData.uViewer_high,r.uniforms.uViewer_low=this.userData.uViewer_low,r.uniforms.pixelThreshold=this.userData.pixelThreshold,r.vertexShader=this.vertProgram,r.fragmentShader=this.fragProgram};for(let r=0;r{Object.getOwnPropertyNames(n.prototype).forEach(r=>{Object.defineProperty(t.prototype,r,Object.getOwnPropertyDescriptor(n.prototype,r)||Object.create(null))})})}vE(xge,[mE]),vE(pW,[mE]),vE(Tge,[mE]),vE(wge,[mE]);class mn extends xge{get vertexShader(){return` + `,this.uniforms=Na.merge([wi.line.uniforms,{uViewer_high:{value:this.userData.uViewer_high.value},uViewer_low:{value:this.userData.uViewer_low.value},pixelThreshold:{value:this.userData.pixelThreshold}}]),this.onBeforeCompile=function(r){r.uniforms.uViewer_high=this.userData.uViewer_high,r.uniforms.uViewer_low=this.userData.uViewer_low,r.uniforms.pixelThreshold=this.userData.pixelThreshold,r.vertexShader=this.vertProgram,r.fragmentShader=this.fragProgram};for(let r=0;r{Object.getOwnPropertyNames(n.prototype).forEach(r=>{Object.defineProperty(t.prototype,r,Object.getOwnPropertyDescriptor(n.prototype,r)||Object.create(null))})})}vE(Sge,[mE]),vE(mW,[mE]),vE(xge,[mE]),vE(Tge,[mE]);class mn extends Sge{get vertexShader(){return` #define STANDARD #ifdef USE_RTE // The high component is stored as the default 'position' attribute buffer @@ -4954,7 +4954,7 @@ void main() { #include } -`}get baseUniforms(){return wi.standard.uniforms}get uniformsDef(){return{uViewer_high:new U,uViewer_low:new U,rteShadowMatrix:new Be,uShadowViewer_high:new U,uShadowViewer_low:new U,uTransforms:[new Be],tTransforms:null,objCount:1}}constructor(e,n=[]){super(e),this.init(n)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}fastCopy(e,n){super.fastCopy(e,n);const r=n,i=e;r.color.copy(i.color),r.roughness=i.roughness,r.metalness=i.metalness,r.emissive.copy(i.emissive),r.emissiveIntensity=i.emissiveIntensity,r.envMap=i.envMap,r.envMapIntensity=i.envMapIntensity,r.refractionRatio=i.refractionRatio}onBeforeRender(e,n,r,i,s,a){mn.matBuff.copy(r.matrixWorldInverse),mn.matBuff.elements[12]=0,mn.matBuff.elements[13]=0,mn.matBuff.elements[14]=0,s.modelViewMatrix.copy(mn.matBuff),mn.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),ur.DoubleToHighLowVector(mn.vecBuff0,mn.vecBuff1,mn.vecBuff2),this.userData.uViewer_low.value.copy(mn.vecBuff1),this.userData.uViewer_high.value.copy(mn.vecBuff2),s instanceof N0&&s.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}mn.matBuff=new Be,mn.vecBuff0=new U,mn.vecBuff1=new U,mn.vecBuff2=new U;const Ege=` +`}get baseUniforms(){return wi.standard.uniforms}get uniformsDef(){return{uViewer_high:new U,uViewer_low:new U,rteShadowMatrix:new Be,uShadowViewer_high:new U,uShadowViewer_low:new U,uTransforms:[new Be],tTransforms:null,objCount:1}}constructor(e,n=[]){super(e),this.init(n)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}fastCopy(e,n){super.fastCopy(e,n);const r=n,i=e;r.color.copy(i.color),r.roughness=i.roughness,r.metalness=i.metalness,r.emissive.copy(i.emissive),r.emissiveIntensity=i.emissiveIntensity,r.envMap=i.envMap,r.envMapIntensity=i.envMapIntensity,r.refractionRatio=i.refractionRatio}onBeforeRender(e,n,r,i,s,a){mn.matBuff.copy(r.matrixWorldInverse),mn.matBuff.elements[12]=0,mn.matBuff.elements[13]=0,mn.matBuff.elements[14]=0,s.modelViewMatrix.copy(mn.matBuff),mn.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),ur.DoubleToHighLowVector(mn.vecBuff0,mn.vecBuff1,mn.vecBuff2),this.userData.uViewer_low.value.copy(mn.vecBuff1),this.userData.uViewer_high.value.copy(mn.vecBuff2),s instanceof N0&&s.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}mn.matBuff=new Be,mn.vecBuff0=new U,mn.vecBuff1=new U,mn.vecBuff2=new U;const wge=` uniform float size; uniform float scale; @@ -5067,7 +5067,7 @@ void main() { #include } -`,Mge=` +`,Ege=` uniform vec3 diffuse; uniform float opacity; @@ -5110,7 +5110,7 @@ void main() { #include } -`;class tr extends qf{constructor(e,n=[]){super(e),this.userData.uViewer_high={value:new U},this.userData.uViewer_low={value:new U},this.vertProgram=Ege,this.fragProgram=Mge,this.uniforms=Na.merge([wi.standard.uniforms,{uViewer_high:{value:this.userData.uViewer_high.value},uViewer_low:{value:this.userData.uViewer_low.value}}]),this.onBeforeCompile=function(r){r.uniforms.uViewer_high=this.userData.uViewer_high,r.uniforms.uViewer_low=this.userData.uViewer_low,r.vertexShader=this.vertProgram,r.fragmentShader=this.fragProgram},n&&(this.defines={});for(let r=0;r{const o=Gl.getLoader(i,r);o?o.load(i,l=>{const u=new lP(n);u.compileEquirectangularShader();const c=u.fromEquirectangular(l);this._cache[i]=c.texture,l.dispose(),u.dispose(),s(this._cache[i])},void 0,l=>{a(`Loading asset ${i} failed ${l.message}`)}):a(`Loading asset ${i} failed`)})}static getTexture(e){let n,r=null;return e.src?(r=e.src,n=e.type):r=e,this._cache[r]?Promise.resolve(this._cache[r]):new Promise((i,s)=>{if(r.includes("data:image")){const a=new Image;a.src=r,a.onload=()=>{const o=new Di(a);o.needsUpdate=!0,this._cache[r]=o,i(o)},a.onerror=o=>{s(`Loading asset ${r} failed with ${o.toString()}`)}}else{const a=Gl.getLoader(r,n);a?a.load(r,o=>{this._cache[r]=o,i(this._cache[r])},void 0,o=>{s(`Loading asset ${r} failed ${o.message}`)}):s(`Loading asset ${r} failed`)}})}static getFont(e){let n=null;return n=e.src?e.src:e,this._cache[n]?Promise.resolve(this._cache[n]):new Promise((r,i)=>{new kvt().load(n,s=>{r(s)},void 0,s=>{i(`Loading asset ${n} failed ${s.message}`)})})}static async getTextureData(e){const n=await Gl.getTexture(e),r=document.createElement("canvas");r.width=n.image.width,r.height=n.image.height;const i=r.getContext("2d");i.drawImage(n.image,0,0);const s=i.getImageData(0,0,r.width,r.height);return Promise.resolve(s)}static generateGradientRampTexture(e,n,r){}static generateDiscreetRampTexture(e){const n=e.length,r=new Uint8Array(4*(1*n));for(let s=0;s1)&&this.VisibilityState.reset(),this.StateKey=n,this.VisibilityState.rvs=[],this.VisibilityState.ghost=s,i&&(e=[...e,...this.getDescendantIds(e)]),r===_i.SHOW||r===_i.UNISOLATE)for(let o=0;o(o[l]=1,o),{})),Object.keys(this.VisibilityState.ids).length===0)return this.VisibilityState.command=_i.NONE,this.setFilters();let a;return this.VisibilityState.command=r,r!==_i.HIDE&&r!==_i.SHOW||(a=this.visibilityWalk),r!==_i.ISOLATE&&r!==_i.UNISOLATE||(a=this.isolationWalk),this.WTI.walk(a.bind(this)),this.setFilters()}visibilityWalk(e){return!e.model.atomic||(this.VisibilityState.ids[e.model.raw.id]&&this.VisibilityState.rvs.push(...this.WTI.getRenderTree().getRenderViewsForNode(e,e)),!0)}isolationWalk(e){if(!e.model.atomic||this.WTI.isRoot(e))return!0;const n=this.WTI.getRenderTree().getRenderViewsForNode(e,e);return this.VisibilityState.ids[e.model.raw.id]?this.VisibilityState.rvs=this.VisibilityState.rvs.filter(r=>!n.includes(r)):this.VisibilityState.rvs.push(...n),!0}setColorFilter(e,n=!0){return e.type==="number"?(this.ColorStringFilterState=null,this.ColorNumericFilterState=new P1t,this.setNumericColorFilter(e,n)):e.type==="string"?(this.ColorNumericFilterState=null,this.ColorStringFilterState=new M1t,this.setStringColorFilter(e,n)):void 0}setNumericColorFilter(e,n){this.ColorNumericFilterState.currentProp=e;const r=e.passMin||e.min,i=e.passMax||e.max,s={};for(let l=0;l=r&&e.valueGroups[l].value<=i&&(s[e.valueGroups[l].id]=e.valueGroups[l].value);const a=[],o=[];return this.WTI.walk(l=>{if(!l.model.atomic||this.WTI.isRoot(l))return!0;const u=this.WTI.getRenderTree().getRenderViewsForNode(l,l),c=s[l.model.raw.id];c?o.push({rvs:u,value:(c-r)/(i-r)}):a.push(...u)}),this.ColorNumericFilterState.colorGroups=o,this.ColorNumericFilterState.nonMatchingRvs=a,this.ColorNumericFilterState.ghost=n,this.ColorNumericFilterState.matchingIds=s,this.setFilters()}setStringColorFilter(e,n){this.ColorStringFilterState.currentProp=e;const r=[];for(const a of e.valueGroups){const o=lvt(a.value),l={...a,color:new tt(o),rvs:[]};l.idMap={};for(let u=0;ua.color.getHex())),s=[];this.WTI.walk(a=>{if(!a.model.atomic||this.WTI.isRoot(a))return!0;const o=r.find(c=>c.idMap[a.model.raw.id]),l=this.WTI.getRenderTree().getRenderViewNodesForNode(a,a);if(!o)return s.push(...l.map(c=>c.model.renderView)),!0;const u=[];return l.forEach(c=>{this.WTI.getRenderTree().getAtomicParent(c)===a&&u.push(c.model.renderView)}),o.rvs.push(...u),!0});for(const a of r)delete a.idMap;return this.ColorStringFilterState.colorGroups=r,this.ColorStringFilterState.rampTexture=i,this.ColorStringFilterState.nonMatchingRvs=s,this.ColorStringFilterState.ghost=n,this.setFilters()}removeColorFilter(){return this.ColorStringFilterState=null,this.ColorNumericFilterState=null,this.setFilters()}selectObjects(e){return this.resetSelection(),this.populateGenericState(e,this.SelectionState),this.SelectionState.rvs.length!==0&&(this.SelectionState.id=this.Renderer.applyDirectFilter(this.SelectionState.rvs,{filterType:mi.SELECT})),this.Renderer.updateClippingPlanes(),this.Renderer.viewer.requestRender(),this.emit($t.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}highlightObjects(e,n=!1){return this.resetHighlight(),this.HighlightState.ghost=n,this.populateGenericState(e,this.HighlightState),this.HighlightState.rvs.length!==0&&(this.HighlightState.id=this.Renderer.applyDirectFilter(this.HighlightState.rvs,{filterType:mi.OVERLAY})),this.Renderer.viewer.requestRender(),this.emit($t.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}setUserObjectColors(e){this.UserspaceColorState=new Z$,this.ColorNumericFilterState=null,this.ColorStringFilterState=null;const n=e.map(i=>({...i,nodes:[],rvs:[]}));this.WTI.walk(i=>{var s,a;if(!(!((a=(s=i.model)===null||s===void 0?void 0:s.raw)===null||a===void 0)&&a.id))return!0;for(const o of n)if(o.objectIds.includes(i.model.raw.id)){o.nodes.push(i);const l=this.WTI.getRenderTree().getRenderViewNodesForNode(i,i).map(u=>u.model.renderView);l&&o.rvs.push(...l)}return!0}),this.UserspaceColorState.groups=n;const r=Gl.generateDiscreetRampTexture(e.map(i=>new tt(i.color).getHex()));return this.UserspaceColorState.rampTexture=r,this.setFilters()}removeUserObjectColors(){return this.UserspaceColorState=null,this.setFilters()}setUserMaterials(e){this.UserMaterialState=new J$;const n=e.map(r=>({...r,nodes:[],rvs:r.rvs?r.rvs:[]}));return this.WTI.walk(r=>{var i,s;if(!(!((s=(i=r.model)===null||i===void 0?void 0:i.raw)===null||s===void 0)&&s.id))return!0;for(const a of n){if(a.rvs.length>0)return!0;if(a.objectIds.includes(r.model.raw.id)){a.nodes.push(r);const o=this.WTI.getRenderTree().getRenderViewNodesForNode(r,r).map(l=>l.model.renderView);o&&a.rvs.push(...o)}}return!0}),this.UserMaterialState.groups=n,this.setFilters()}removeUserMaterials(){return this.UserMaterialState=null,this.setFilters()}populateGenericState(e,n){let r=[...e];r=[...Array.from(new Set(r.map(s=>s)))],n.rvs=[],n.ids=[];const i=[];if(r.length!==0){this.WTI.walk(s=>(r.indexOf(s.model.raw.id)!==-1&&i.push(s),!0));for(let s=0;so.model.renderView)),n.ids.push(...a.map(o=>o.model.raw.id)))}}}resetSelection(){return this.SelectionState.rvs.length>0&&this.Renderer.removeDirectFilter(this.SelectionState.id),this.SelectionState=new Ig,this.Renderer.updateClippingPlanes(),this.Renderer.viewer.requestRender(),this.emit($t.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}resetHighlight(){return this.HighlightState.rvs.length>0&&this.Renderer.removeDirectFilter(this.HighlightState.id),this.HighlightState=new Ig,this.Renderer.viewer.requestRender(),this.emit($t.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}reset(){return this.Renderer.clearFilter(),this.VisibilityState=new j$,this.ColorStringFilterState=null,this.ColorNumericFilterState=null,this.SelectionState=new Ig,this.HighlightState=new Ig,this.UserspaceColorState=null,this.StateKey=null,null}setFilters(){var e,n;if(this.CurrentFilteringState={},this.Renderer.clearFilter(),this.Renderer.beginFilter(),this.UserMaterialState)for(const o of this.UserMaterialState.groups)this.Renderer.applyMaterial(o.rvs,o.material);if(this.ColorStringFilterState){this.CurrentFilteringState.colorGroups=[];let o=-1;for(const l of this.ColorStringFilterState.colorGroups)o++,this.Renderer.applyFilter(l.rvs,{filterType:mi.COLORED,rampIndex:o/this.ColorStringFilterState.colorGroups.length,rampIndexColor:l.color,rampTexture:this.ColorStringFilterState.rampTexture}),this.CurrentFilteringState.colorGroups.push({value:l.value,color:l.color.getHexString(),ids:l.ids}),this.CurrentFilteringState.activePropFilterKey=this.ColorStringFilterState.currentProp.key}if(this.ColorNumericFilterState){for(const o of this.ColorNumericFilterState.colorGroups)this.Renderer.applyFilter(o.rvs,{filterType:mi.GRADIENT,rampIndex:o.value});this.CurrentFilteringState.activePropFilterKey=this.ColorNumericFilterState.currentProp.key,this.CurrentFilteringState.passMin=this.ColorNumericFilterState.currentProp.passMin||this.ColorNumericFilterState.currentProp.min,this.CurrentFilteringState.passMax=this.ColorNumericFilterState.currentProp.passMax||this.ColorNumericFilterState.currentProp.max,this.CurrentFilteringState.isolatedObjects=Object.keys(this.ColorNumericFilterState.matchingIds)}const r=this.VisibilityState.command===_i.HIDE||this.VisibilityState.command===_i.SHOW,i=this.VisibilityState.command===_i.ISOLATE||this.VisibilityState.command===_i.UNISOLATE;(r||i)&&(this.Renderer.applyFilter(this.VisibilityState.rvs,{filterType:this.VisibilityState.ghost?mi.GHOST:mi.HIDDEN}),r&&(this.CurrentFilteringState.hiddenObjects=Object.keys(this.VisibilityState.ids)),i&&(this.CurrentFilteringState.isolatedObjects=Object.keys(this.VisibilityState.ids)));const s=((e=this.ColorStringFilterState)===null||e===void 0?void 0:e.nonMatchingRvs)||((n=this.ColorNumericFilterState)===null||n===void 0?void 0:n.nonMatchingRvs);let a=!1;if(this.ColorStringFilterState&&(a=this.ColorStringFilterState.ghost),this.ColorNumericFilterState&&(a=this.ColorNumericFilterState.ghost),s&&this.Renderer.applyFilter(s,{filterType:a?mi.GHOST:mi.HIDDEN}),this.UserspaceColorState){this.CurrentFilteringState.userColorGroups=[];let o=-1;for(const l of this.UserspaceColorState.groups)o++,this.Renderer.applyFilter(l.rvs,{filterType:mi.COLORED,rampIndex:o/this.UserspaceColorState.groups.length,rampIndexColor:new tt(l.color),rampTexture:this.UserspaceColorState.rampTexture}),this.CurrentFilteringState.userColorGroups.push({ids:l.objectIds,color:l.color})}return this.Renderer.endFilter(),this.HighlightState.rvs.length!==0&&(this.HighlightState.id=this.Renderer.applyDirectFilter(this.HighlightState.rvs,{filterType:this.HighlightState.ghost?mi.GHOST:mi.OVERLAY})),this.SelectionState.rvs.length!==0&&(this.SelectionState.id=this.Renderer.applyDirectFilter(this.SelectionState.rvs,{filterType:mi.SELECT})),this.Renderer.viewer.requestRender(),this.emit($t.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}getDescendantIds(e){const n=[],r=e.join(",");return this.idCache[r]&&this.idCache[r].length?this.idCache[r]:(this.WTI.walk(i=>{if(e.includes(i.model.raw.id)){const s=i.all(a=>a.model.raw!==void 0).map(a=>a.model.raw.id);n.push(...s),this.idCache[i.model.raw.id]=s}return!0}),this.idCache[r]=n,n)}}(function(t){t[t.HIDE=10]="HIDE",t[t.SHOW=11]="SHOW",t[t.ISOLATE=20]="ISOLATE",t[t.UNISOLATE=21]="UNISOLATE",t[t.NONE=30]="NONE"})(_i||(_i={}));class j${constructor(){this.command=_i.NONE,this.ghost=!0,this.ids={},this.rvs=[]}reset(){this.ghost=!0,this.ids={},this.rvs=[]}}class M1t{constructor(){this.ghost=!0}reset(){this.currentProp=null,this.colorGroups=[],this.nonMatchingRvs=[],this.rampTexture=null}}class P1t{constructor(){this.ghost=!0}}class Ig{constructor(){this.ids=[],this.rvs=[],this.ghost=!1}reset(){this.rvs=[],this.ids=[]}}class Z${constructor(){this.groups=[]}reset(){this.groups=[]}}class J${constructor(){this.groups=[]}reset(){this.groups=[]}}class gE extends mn{get vertexShader(){return` +`;class tr extends qf{constructor(e,n=[]){super(e),this.userData.uViewer_high={value:new U},this.userData.uViewer_low={value:new U},this.vertProgram=wge,this.fragProgram=Ege,this.uniforms=Na.merge([wi.standard.uniforms,{uViewer_high:{value:this.userData.uViewer_high.value},uViewer_low:{value:this.userData.uViewer_low.value}}]),this.onBeforeCompile=function(r){r.uniforms.uViewer_high=this.userData.uViewer_high,r.uniforms.uViewer_low=this.userData.uViewer_low,r.vertexShader=this.vertProgram,r.fragmentShader=this.fragProgram},n&&(this.defines={});for(let r=0;r{const o=Gl.getLoader(i,r);o?o.load(i,l=>{const u=new oP(n);u.compileEquirectangularShader();const c=u.fromEquirectangular(l);this._cache[i]=c.texture,l.dispose(),u.dispose(),s(this._cache[i])},void 0,l=>{a(`Loading asset ${i} failed ${l.message}`)}):a(`Loading asset ${i} failed`)})}static getTexture(e){let n,r=null;return e.src?(r=e.src,n=e.type):r=e,this._cache[r]?Promise.resolve(this._cache[r]):new Promise((i,s)=>{if(r.includes("data:image")){const a=new Image;a.src=r,a.onload=()=>{const o=new Di(a);o.needsUpdate=!0,this._cache[r]=o,i(o)},a.onerror=o=>{s(`Loading asset ${r} failed with ${o.toString()}`)}}else{const a=Gl.getLoader(r,n);a?a.load(r,o=>{this._cache[r]=o,i(this._cache[r])},void 0,o=>{s(`Loading asset ${r} failed ${o.message}`)}):s(`Loading asset ${r} failed`)}})}static getFont(e){let n=null;return n=e.src?e.src:e,this._cache[n]?Promise.resolve(this._cache[n]):new Promise((r,i)=>{new Ovt().load(n,s=>{r(s)},void 0,s=>{i(`Loading asset ${n} failed ${s.message}`)})})}static async getTextureData(e){const n=await Gl.getTexture(e),r=document.createElement("canvas");r.width=n.image.width,r.height=n.image.height;const i=r.getContext("2d");i.drawImage(n.image,0,0);const s=i.getImageData(0,0,r.width,r.height);return Promise.resolve(s)}static generateGradientRampTexture(e,n,r){}static generateDiscreetRampTexture(e){const n=e.length,r=new Uint8Array(4*(1*n));for(let s=0;s1)&&this.VisibilityState.reset(),this.StateKey=n,this.VisibilityState.rvs=[],this.VisibilityState.ghost=s,i&&(e=[...e,...this.getDescendantIds(e)]),r===_i.SHOW||r===_i.UNISOLATE)for(let o=0;o(o[l]=1,o),{})),Object.keys(this.VisibilityState.ids).length===0)return this.VisibilityState.command=_i.NONE,this.setFilters();let a;return this.VisibilityState.command=r,r!==_i.HIDE&&r!==_i.SHOW||(a=this.visibilityWalk),r!==_i.ISOLATE&&r!==_i.UNISOLATE||(a=this.isolationWalk),this.WTI.walk(a.bind(this)),this.setFilters()}visibilityWalk(e){return!e.model.atomic||(this.VisibilityState.ids[e.model.raw.id]&&this.VisibilityState.rvs.push(...this.WTI.getRenderTree().getRenderViewsForNode(e,e)),!0)}isolationWalk(e){if(!e.model.atomic||this.WTI.isRoot(e))return!0;const n=this.WTI.getRenderTree().getRenderViewsForNode(e,e);return this.VisibilityState.ids[e.model.raw.id]?this.VisibilityState.rvs=this.VisibilityState.rvs.filter(r=>!n.includes(r)):this.VisibilityState.rvs.push(...n),!0}setColorFilter(e,n=!0){return e.type==="number"?(this.ColorStringFilterState=null,this.ColorNumericFilterState=new R1t,this.setNumericColorFilter(e,n)):e.type==="string"?(this.ColorNumericFilterState=null,this.ColorStringFilterState=new P1t,this.setStringColorFilter(e,n)):void 0}setNumericColorFilter(e,n){this.ColorNumericFilterState.currentProp=e;const r=e.passMin||e.min,i=e.passMax||e.max,s={};for(let l=0;l=r&&e.valueGroups[l].value<=i&&(s[e.valueGroups[l].id]=e.valueGroups[l].value);const a=[],o=[];return this.WTI.walk(l=>{if(!l.model.atomic||this.WTI.isRoot(l))return!0;const u=this.WTI.getRenderTree().getRenderViewsForNode(l,l),c=s[l.model.raw.id];c?o.push({rvs:u,value:(c-r)/(i-r)}):a.push(...u)}),this.ColorNumericFilterState.colorGroups=o,this.ColorNumericFilterState.nonMatchingRvs=a,this.ColorNumericFilterState.ghost=n,this.ColorNumericFilterState.matchingIds=s,this.setFilters()}setStringColorFilter(e,n){this.ColorStringFilterState.currentProp=e;const r=[];for(const a of e.valueGroups){const o=uvt(a.value),l={...a,color:new tt(o),rvs:[]};l.idMap={};for(let u=0;ua.color.getHex())),s=[];this.WTI.walk(a=>{if(!a.model.atomic||this.WTI.isRoot(a))return!0;const o=r.find(c=>c.idMap[a.model.raw.id]),l=this.WTI.getRenderTree().getRenderViewNodesForNode(a,a);if(!o)return s.push(...l.map(c=>c.model.renderView)),!0;const u=[];return l.forEach(c=>{this.WTI.getRenderTree().getAtomicParent(c)===a&&u.push(c.model.renderView)}),o.rvs.push(...u),!0});for(const a of r)delete a.idMap;return this.ColorStringFilterState.colorGroups=r,this.ColorStringFilterState.rampTexture=i,this.ColorStringFilterState.nonMatchingRvs=s,this.ColorStringFilterState.ghost=n,this.setFilters()}removeColorFilter(){return this.ColorStringFilterState=null,this.ColorNumericFilterState=null,this.setFilters()}selectObjects(e){return this.resetSelection(),this.populateGenericState(e,this.SelectionState),this.SelectionState.rvs.length!==0&&(this.SelectionState.id=this.Renderer.applyDirectFilter(this.SelectionState.rvs,{filterType:mi.SELECT})),this.Renderer.updateClippingPlanes(),this.Renderer.viewer.requestRender(),this.emit($t.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}highlightObjects(e,n=!1){return this.resetHighlight(),this.HighlightState.ghost=n,this.populateGenericState(e,this.HighlightState),this.HighlightState.rvs.length!==0&&(this.HighlightState.id=this.Renderer.applyDirectFilter(this.HighlightState.rvs,{filterType:mi.OVERLAY})),this.Renderer.viewer.requestRender(),this.emit($t.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}setUserObjectColors(e){this.UserspaceColorState=new F$,this.ColorNumericFilterState=null,this.ColorStringFilterState=null;const n=e.map(i=>({...i,nodes:[],rvs:[]}));this.WTI.walk(i=>{var s,a;if(!(!((a=(s=i.model)===null||s===void 0?void 0:s.raw)===null||a===void 0)&&a.id))return!0;for(const o of n)if(o.objectIds.includes(i.model.raw.id)){o.nodes.push(i);const l=this.WTI.getRenderTree().getRenderViewNodesForNode(i,i).map(u=>u.model.renderView);l&&o.rvs.push(...l)}return!0}),this.UserspaceColorState.groups=n;const r=Gl.generateDiscreetRampTexture(e.map(i=>new tt(i.color).getHex()));return this.UserspaceColorState.rampTexture=r,this.setFilters()}removeUserObjectColors(){return this.UserspaceColorState=null,this.setFilters()}setUserMaterials(e){this.UserMaterialState=new j$;const n=e.map(r=>({...r,nodes:[],rvs:r.rvs?r.rvs:[]}));return this.WTI.walk(r=>{var i,s;if(!(!((s=(i=r.model)===null||i===void 0?void 0:i.raw)===null||s===void 0)&&s.id))return!0;for(const a of n){if(a.rvs.length>0)return!0;if(a.objectIds.includes(r.model.raw.id)){a.nodes.push(r);const o=this.WTI.getRenderTree().getRenderViewNodesForNode(r,r).map(l=>l.model.renderView);o&&a.rvs.push(...o)}}return!0}),this.UserMaterialState.groups=n,this.setFilters()}removeUserMaterials(){return this.UserMaterialState=null,this.setFilters()}populateGenericState(e,n){let r=[...e];r=[...Array.from(new Set(r.map(s=>s)))],n.rvs=[],n.ids=[];const i=[];if(r.length!==0){this.WTI.walk(s=>(r.indexOf(s.model.raw.id)!==-1&&i.push(s),!0));for(let s=0;so.model.renderView)),n.ids.push(...a.map(o=>o.model.raw.id)))}}}resetSelection(){return this.SelectionState.rvs.length>0&&this.Renderer.removeDirectFilter(this.SelectionState.id),this.SelectionState=new Ig,this.Renderer.updateClippingPlanes(),this.Renderer.viewer.requestRender(),this.emit($t.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}resetHighlight(){return this.HighlightState.rvs.length>0&&this.Renderer.removeDirectFilter(this.HighlightState.id),this.HighlightState=new Ig,this.Renderer.viewer.requestRender(),this.emit($t.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}reset(){return this.Renderer.clearFilter(),this.VisibilityState=new G$,this.ColorStringFilterState=null,this.ColorNumericFilterState=null,this.SelectionState=new Ig,this.HighlightState=new Ig,this.UserspaceColorState=null,this.StateKey=null,null}setFilters(){var e,n;if(this.CurrentFilteringState={},this.Renderer.clearFilter(),this.Renderer.beginFilter(),this.UserMaterialState)for(const o of this.UserMaterialState.groups)this.Renderer.applyMaterial(o.rvs,o.material);if(this.ColorStringFilterState){this.CurrentFilteringState.colorGroups=[];let o=-1;for(const l of this.ColorStringFilterState.colorGroups)o++,this.Renderer.applyFilter(l.rvs,{filterType:mi.COLORED,rampIndex:o/this.ColorStringFilterState.colorGroups.length,rampIndexColor:l.color,rampTexture:this.ColorStringFilterState.rampTexture}),this.CurrentFilteringState.colorGroups.push({value:l.value,color:l.color.getHexString(),ids:l.ids}),this.CurrentFilteringState.activePropFilterKey=this.ColorStringFilterState.currentProp.key}if(this.ColorNumericFilterState){for(const o of this.ColorNumericFilterState.colorGroups)this.Renderer.applyFilter(o.rvs,{filterType:mi.GRADIENT,rampIndex:o.value});this.CurrentFilteringState.activePropFilterKey=this.ColorNumericFilterState.currentProp.key,this.CurrentFilteringState.passMin=this.ColorNumericFilterState.currentProp.passMin||this.ColorNumericFilterState.currentProp.min,this.CurrentFilteringState.passMax=this.ColorNumericFilterState.currentProp.passMax||this.ColorNumericFilterState.currentProp.max,this.CurrentFilteringState.isolatedObjects=Object.keys(this.ColorNumericFilterState.matchingIds)}const r=this.VisibilityState.command===_i.HIDE||this.VisibilityState.command===_i.SHOW,i=this.VisibilityState.command===_i.ISOLATE||this.VisibilityState.command===_i.UNISOLATE;(r||i)&&(this.Renderer.applyFilter(this.VisibilityState.rvs,{filterType:this.VisibilityState.ghost?mi.GHOST:mi.HIDDEN}),r&&(this.CurrentFilteringState.hiddenObjects=Object.keys(this.VisibilityState.ids)),i&&(this.CurrentFilteringState.isolatedObjects=Object.keys(this.VisibilityState.ids)));const s=((e=this.ColorStringFilterState)===null||e===void 0?void 0:e.nonMatchingRvs)||((n=this.ColorNumericFilterState)===null||n===void 0?void 0:n.nonMatchingRvs);let a=!1;if(this.ColorStringFilterState&&(a=this.ColorStringFilterState.ghost),this.ColorNumericFilterState&&(a=this.ColorNumericFilterState.ghost),s&&this.Renderer.applyFilter(s,{filterType:a?mi.GHOST:mi.HIDDEN}),this.UserspaceColorState){this.CurrentFilteringState.userColorGroups=[];let o=-1;for(const l of this.UserspaceColorState.groups)o++,this.Renderer.applyFilter(l.rvs,{filterType:mi.COLORED,rampIndex:o/this.UserspaceColorState.groups.length,rampIndexColor:new tt(l.color),rampTexture:this.UserspaceColorState.rampTexture}),this.CurrentFilteringState.userColorGroups.push({ids:l.objectIds,color:l.color})}return this.Renderer.endFilter(),this.HighlightState.rvs.length!==0&&(this.HighlightState.id=this.Renderer.applyDirectFilter(this.HighlightState.rvs,{filterType:this.HighlightState.ghost?mi.GHOST:mi.OVERLAY})),this.SelectionState.rvs.length!==0&&(this.SelectionState.id=this.Renderer.applyDirectFilter(this.SelectionState.rvs,{filterType:mi.SELECT})),this.Renderer.viewer.requestRender(),this.emit($t.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}getDescendantIds(e){const n=[],r=e.join(",");return this.idCache[r]&&this.idCache[r].length?this.idCache[r]:(this.WTI.walk(i=>{if(e.includes(i.model.raw.id)){const s=i.all(a=>a.model.raw!==void 0).map(a=>a.model.raw.id);n.push(...s),this.idCache[i.model.raw.id]=s}return!0}),this.idCache[r]=n,n)}}(function(t){t[t.HIDE=10]="HIDE",t[t.SHOW=11]="SHOW",t[t.ISOLATE=20]="ISOLATE",t[t.UNISOLATE=21]="UNISOLATE",t[t.NONE=30]="NONE"})(_i||(_i={}));class G${constructor(){this.command=_i.NONE,this.ghost=!0,this.ids={},this.rvs=[]}reset(){this.ghost=!0,this.ids={},this.rvs=[]}}class P1t{constructor(){this.ghost=!0}reset(){this.currentProp=null,this.colorGroups=[],this.nonMatchingRvs=[],this.rampTexture=null}}class R1t{constructor(){this.ghost=!0}}class Ig{constructor(){this.ids=[],this.rvs=[],this.ghost=!1}reset(){this.rvs=[],this.ids=[]}}class F${constructor(){this.groups=[]}reset(){this.groups=[]}}class j${constructor(){this.groups=[]}reset(){this.groups=[]}}class gE extends mn{get vertexShader(){return` #define STANDARD #ifdef USE_RTE // The high component is stored as the default 'position' attribute buffer @@ -5516,7 +5516,7 @@ void main() { #include #include } -`}get uniformsDef(){return{...super.uniformsDef,gradientRamp:null}}constructor(e,n=[]){super(e,n)}setGradientTexture(e){this.userData.gradientRamp.value=e,this.userData.gradientRamp.value.generateMipmaps=!1,this.userData.gradientRamp.value.minFilter=Ir,this.userData.gradientRamp.value.magFilter=Ir,this.needsUpdate=!0}onBeforeRender(e,n,r,i,s,a){mn.matBuff.copy(r.matrixWorldInverse),mn.matBuff.elements[12]=0,mn.matBuff.elements[13]=0,mn.matBuff.elements[14]=0,s.modelViewMatrix.copy(mn.matBuff),mn.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),ur.DoubleToHighLowVector(mn.vecBuff0,mn.vecBuff1,mn.vecBuff2),this.userData.uViewer_low.value.copy(mn.vecBuff1),this.userData.uViewer_high.value.copy(mn.vecBuff2),s instanceof N0&&s.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}var bE="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAABCAIAAAAn2YEhAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHoSURBVDhPTZRRdoMwDAQx9//seaEzI5sXpwFptVqvMOm6/t7retd1Le8XAdF6+SMEYr03l2fF4GJprcfixl4+tyklG6ZvxeAKWGxBQsKDk9FIdD+pDUFiak9IDQEWMAM4dczEZmWSDOXPBuAQ1OCLYI4bc0S0bbnlFOR6Vgo2WwgraIvgbh8L2ZNxRH5T7QWKyKz9E7kNnUE+KTA3Oz6O3YIOkop+4juHoh1H+m3slByVm9vgOCOoXr7HvBJSjLdJRUHuSrbse+jDiZOPPt/jZIv8WPJeW+JVzYj2CIHc9GaEjmc/OhF3C+neQoBgW/KKZx2VuyxFKqDBNwfqA8NXa7p0781GBT6TPkSOozQPMPer4sBqTrvZUZgqSKP5oaCXXirJdZ4jqyRbtyE8amCkLLkzW9qik7Fx9mWE9pHEh9vMHsIawZSPcxut2DcDyjzeKinisypDwQoKnLU5WVLz7pGO/nbrIhC2MMOaGrj8PRLmfKpSJcT4NZn5wFgbKbVlCzia76HbQZMAjP72IyX94v189i7Ewfa2wcdMTfGOqekE2i/O9LZRi/T8qwFuuvknA3kW/YnLTMVO22OwUXg0OZ1IAdeqcEjXffH2jjEqNmSvRZbF43BLuUPsYsk5XPu3NqD3WKzr/QfN+6p+JpC7ZQAAAABJRU5ErkJggg==";class Mr extends pW{get vertexShader(){return` +`}get uniformsDef(){return{...super.uniformsDef,gradientRamp:null}}constructor(e,n=[]){super(e,n)}setGradientTexture(e){this.userData.gradientRamp.value=e,this.userData.gradientRamp.value.generateMipmaps=!1,this.userData.gradientRamp.value.minFilter=Ir,this.userData.gradientRamp.value.magFilter=Ir,this.needsUpdate=!0}onBeforeRender(e,n,r,i,s,a){mn.matBuff.copy(r.matrixWorldInverse),mn.matBuff.elements[12]=0,mn.matBuff.elements[13]=0,mn.matBuff.elements[14]=0,s.modelViewMatrix.copy(mn.matBuff),mn.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),ur.DoubleToHighLowVector(mn.vecBuff0,mn.vecBuff1,mn.vecBuff2),this.userData.uViewer_low.value.copy(mn.vecBuff1),this.userData.uViewer_high.value.copy(mn.vecBuff2),s instanceof N0&&s.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}var bE="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAABCAIAAAAn2YEhAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHoSURBVDhPTZRRdoMwDAQx9//seaEzI5sXpwFptVqvMOm6/t7retd1Le8XAdF6+SMEYr03l2fF4GJprcfixl4+tyklG6ZvxeAKWGxBQsKDk9FIdD+pDUFiak9IDQEWMAM4dczEZmWSDOXPBuAQ1OCLYI4bc0S0bbnlFOR6Vgo2WwgraIvgbh8L2ZNxRH5T7QWKyKz9E7kNnUE+KTA3Oz6O3YIOkop+4juHoh1H+m3slByVm9vgOCOoXr7HvBJSjLdJRUHuSrbse+jDiZOPPt/jZIv8WPJeW+JVzYj2CIHc9GaEjmc/OhF3C+neQoBgW/KKZx2VuyxFKqDBNwfqA8NXa7p0781GBT6TPkSOozQPMPer4sBqTrvZUZgqSKP5oaCXXirJdZ4jqyRbtyE8amCkLLkzW9qik7Fx9mWE9pHEh9vMHsIawZSPcxut2DcDyjzeKinisypDwQoKnLU5WVLz7pGO/nbrIhC2MMOaGrj8PRLmfKpSJcT4NZn5wFgbKbVlCzia76HbQZMAjP72IyX94v189i7Ewfa2wcdMTfGOqekE2i/O9LZRi/T8qwFuuvknA3kW/YnLTMVO22OwUXg0OZ1IAdeqcEjXffH2jjEqNmSvRZbF43BLuUPsYsk5XPu3NqD3WKzr/QfN+6p+JpC7ZQAAAABJRU5ErkJggg==";class Mr extends mW{get vertexShader(){return` #include #ifdef USE_RTE // The high component is stored as the default 'position' attribute buffer @@ -5776,7 +5776,7 @@ void main() { #include #include } -`}get baseUniforms(){return wi.basic.uniforms}get uniformsDef(){return{uViewer_high:new U,uViewer_low:new U,uTransforms:[new Be],tTransforms:null,billboardPos:new U,billboardSize:new Oe,invProjection:new Be,objCount:1}}set billboardPixelHeight(e){this._billboardPixelHeight=e}constructor(e,n=[]){super(e),this.init(n)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}fastCopy(e,n){super.fastCopy(e,n);const r=n,i=e;r.color.copy(i.color),r.refractionRatio=i.refractionRatio}onBeforeRender(e,n,r,i,s,a){if(this.defines.BILLBOARD_FIXED){const o=e.getDrawingBufferSize(Mr.vecBuff3);Mr.vecBuff3.set(this._billboardPixelHeight/o.x*2,this._billboardPixelHeight/o.y*2),this.userData.billboardSize.value.copy(Mr.vecBuff3),Mr.matBuff.copy(r.projectionMatrix).invert(),this.userData.invProjection.value.copy(Mr.matBuff)}this.defines.USE_RTE&&(Mr.matBuff.copy(r.matrixWorldInverse),Mr.matBuff.elements[12]=0,Mr.matBuff.elements[13]=0,Mr.matBuff.elements[14]=0,s.modelViewMatrix.copy(Mr.matBuff),Mr.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),ur.DoubleToHighLowVector(Mr.vecBuff0,Mr.vecBuff1,Mr.vecBuff2)),this.userData.uViewer_low.value.copy(Mr.vecBuff1),this.userData.uViewer_high.value.copy(Mr.vecBuff2),s instanceof N0&&s.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}Mr.matBuff=new Be,Mr.vecBuff0=new U,Mr.vecBuff1=new U,Mr.vecBuff2=new U,Mr.vecBuff3=new Oe;class yx extends Mr{get vertexShader(){return` +`}get baseUniforms(){return wi.basic.uniforms}get uniformsDef(){return{uViewer_high:new U,uViewer_low:new U,uTransforms:[new Be],tTransforms:null,billboardPos:new U,billboardSize:new Oe,invProjection:new Be,objCount:1}}set billboardPixelHeight(e){this._billboardPixelHeight=e}constructor(e,n=[]){super(e),this.init(n)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}fastCopy(e,n){super.fastCopy(e,n);const r=n,i=e;r.color.copy(i.color),r.refractionRatio=i.refractionRatio}onBeforeRender(e,n,r,i,s,a){if(this.defines.BILLBOARD_FIXED){const o=e.getDrawingBufferSize(Mr.vecBuff3);Mr.vecBuff3.set(this._billboardPixelHeight/o.x*2,this._billboardPixelHeight/o.y*2),this.userData.billboardSize.value.copy(Mr.vecBuff3),Mr.matBuff.copy(r.projectionMatrix).invert(),this.userData.invProjection.value.copy(Mr.matBuff)}this.defines.USE_RTE&&(Mr.matBuff.copy(r.matrixWorldInverse),Mr.matBuff.elements[12]=0,Mr.matBuff.elements[13]=0,Mr.matBuff.elements[14]=0,s.modelViewMatrix.copy(Mr.matBuff),Mr.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),ur.DoubleToHighLowVector(Mr.vecBuff0,Mr.vecBuff1,Mr.vecBuff2)),this.userData.uViewer_low.value.copy(Mr.vecBuff1),this.userData.uViewer_high.value.copy(Mr.vecBuff2),s instanceof N0&&s.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}Mr.matBuff=new Be,Mr.vecBuff0=new U,Mr.vecBuff1=new U,Mr.vecBuff2=new U,Mr.vecBuff3=new Oe;class bx extends Mr{get vertexShader(){return` #include #ifdef USE_RTE // The high component is stored as the default 'position' attribute buffer @@ -6009,7 +6009,7 @@ void main() { #include #include } -`}constructor(e,n=[]){super(e,n)}}class ts extends pW{get vertexShader(){return` +`}constructor(e,n=[]){super(e,n)}}class ts extends mW{get vertexShader(){return` #include #ifdef USE_RTE // The high component is stored as the default 'position' attribute buffer @@ -6267,7 +6267,7 @@ void main() { #include #include } -`}get baseUniforms(){return wi.basic.uniforms}get uniformsDef(){return{uViewer_high:new U,uViewer_low:new U,uTransforms:[new Be],tTransforms:null,objCount:1,billboardPos:new U,billboardSize:new Oe,invProjection:new Be}}set billboardPixelHeight(e){this._billboardPixelHeight=e}get billboardPixelHeight(){return this._billboardPixelHeight}constructor(e,n=[]){super(e),this.init(n)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}getDerivedMaterial(){const e=f0e(this);for(const n in this.userData)e.uniforms[n]=this.userData[n];return e}onBeforeRender(e,n,r,i,s,a){if(this.defines.BILLBOARD_FIXED){const o=e.getDrawingBufferSize(ts.vecBuff3);ts.vecBuff3.set(this._billboardPixelHeight/o.x*2,this._billboardPixelHeight/o.y*2),this.userData.billboardSize.value.copy(ts.vecBuff3),ts.matBuff.copy(r.projectionMatrix).invert(),this.userData.invProjection.value.copy(ts.matBuff)}}}ts.matBuff=new Be,ts.vecBuff0=new U,ts.vecBuff1=new U,ts.vecBuff2=new U,ts.vecBuff3=new Oe;class vs extends qf{constructor(e,n=[]){super(e),this.userData.uViewer_high={value:new U},this.userData.uViewer_low={value:new U},this.userData.gradientRamp={value:null},this.vertProgram=Ege,this.fragProgram=Mge,this.uniforms=Na.merge([wi.standard.uniforms,{uViewer_high:{value:this.userData.uViewer_high.value},uViewer_low:{value:this.userData.uViewer_low.value},gradientRamp:{value:this.userData.gradientRamp.value}}]),this.onBeforeCompile=function(r){r.uniforms.uViewer_high=this.userData.uViewer_high,r.uniforms.uViewer_low=this.userData.uViewer_low,r.uniforms.gradientRamp=this.userData.gradientRamp,r.vertexShader=this.vertProgram,r.fragmentShader=this.fragProgram},n&&(this.defines={USE_GRADIENT_RAMP:""});for(let r=0;r0}),r}static displayStyleFromNode(e){if(!e)return null;let n=null;if(e.model.raw.displayStyle){let r=e.model.raw.displayStyle.lineweight||0;const i=e.model.raw.displayStyle.units;r=i?r*Os(i):0,r=r<.001?0:r,n={id:e.model.raw.displayStyle.id,color:e.model.raw.displayStyle.diffuse||e.model.raw.displayStyle.color,lineWeight:r}}else e.model.raw.renderMaterial&&(n={id:e.model.raw.renderMaterial.id,color:e.model.raw.renderMaterial.diffuse,lineWeight:0});return n}static fastCopy(e,n){n.fastCopy(e,n)}static isTransparent(e){return e.transparent===!0&&e.opacity<1}static isOpaque(e){return e.transparent===!1||e.transparent===!0&&e.opacity>=1}async createDefaultMeshMaterials(){this.meshHighlightMaterial=new mn({color:294651,emissive:0,roughness:1,metalness:0,side:rn},["USE_RTE"]),this.meshHighlightMaterial.clipShadows=!0,this.meshHighlightMaterial.stencilWrite=!0,this.meshHighlightMaterial.stencilWriteMask=255,this.meshHighlightMaterial.stencilRef=0,this.meshHighlightMaterial.stencilFunc=d6,this.meshHighlightMaterial.stencilZFail=zc,this.meshHighlightMaterial.stencilZPass=zc,this.meshHighlightMaterial.stencilFail=zc,this.meshTransparentHighlightMaterial=new mn({color:294651,emissive:0,roughness:1,metalness:0,side:rn,transparent:!0,opacity:.5},["USE_RTE"]),this.meshTransparentHighlightMaterial.clipShadows=!0,this.meshTransparentHighlightMaterial.stencilWrite=!0,this.meshTransparentHighlightMaterial.stencilWriteMask=255,this.meshTransparentHighlightMaterial.stencilRef=0,this.meshTransparentHighlightMaterial.stencilFunc=d6,this.meshTransparentHighlightMaterial.stencilZFail=zc,this.meshTransparentHighlightMaterial.stencilZPass=zc,this.meshTransparentHighlightMaterial.stencilFail=zc,this.meshGhostMaterial=new yx({color:16777215,side:Ki,transparent:!0,opacity:.1},["USE_RTE"]),this.meshGhostMaterial.depthWrite=!1,this.meshGhostMaterial.alphaTest=1,this.meshGradientMaterial=new gE({side:rn,transparent:!1,opacity:1},["USE_RTE"]),this.meshGradientMaterial.setGradientTexture(await Gl.getTexture(bE)),this.meshGradientMaterial.clipShadows=!0,this.meshTransparentGradientMaterial=new gE({side:rn,transparent:!0,opacity:.5},["USE_RTE"]),this.meshTransparentGradientMaterial.setGradientTexture(await Gl.getTexture(bE)),this.meshTransparentGradientMaterial.clipShadows=!0,this.meshColoredMaterial=new gE({side:rn,transparent:!1,wireframe:!1},["USE_RTE"]),this.meshColoredMaterial.clipShadows=!0,this.meshTransparentColoredMaterial=new gE({side:rn,transparent:!0,opacity:.5},["USE_RTE"]),this.meshHiddenMaterial=new mn({side:rn,transparent:!1,opacity:1,wireframe:!1},["USE_RTE"]),this.meshHiddenMaterial.visible=!1,this.meshOverlayMaterial=new mn({color:314363,emissive:0,roughness:1,metalness:0,side:rn},["USE_RTE"]),this.meshOverlayMaterial.clipShadows=!0,this.meshTransparentOverlayMaterial=new mn({color:314363,emissive:0,roughness:1,metalness:0,side:rn,transparent:!0,opacity:.5},["USE_RTE"]),this.meshTransparentHighlightMaterial.color.convertSRGBToLinear(),this.meshHighlightMaterial.color.convertSRGBToLinear(),this.meshOverlayMaterial.color.convertSRGBToLinear(),this.meshTransparentOverlayMaterial.color.convertSRGBToLinear()}async createLineDefaultMaterials(){this.lineHighlightMaterial=new Qr({color:294651,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe},["USE_RTE"]),this.lineHighlightMaterial.color=new tt(294651),this.lineHighlightMaterial.linewidth=1,this.lineHighlightMaterial.worldUnits=!1,this.lineHighlightMaterial.vertexColors=!0,this.lineHighlightMaterial.pixelThreshold=.5,this.lineHighlightMaterial.resolution=new Oe,this.lineGhostMaterial=new Qr({color:16777215,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe},["USE_RTE"]),this.lineGhostMaterial.color=new tt(16777215),this.lineGhostMaterial.linewidth=1,this.lineGhostMaterial.worldUnits=!0,this.lineGhostMaterial.vertexColors=!0,this.lineGhostMaterial.pixelThreshold=.5,this.lineGhostMaterial.resolution=new Oe,this.lineColoredMaterial=new Qr({color:16777215,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe},["USE_RTE"]),this.lineColoredMaterial.color=new tt(16777215),this.lineColoredMaterial.linewidth=1,this.lineColoredMaterial.worldUnits=!1,this.lineColoredMaterial.vertexColors=!0,this.lineColoredMaterial.pixelThreshold=.5,this.lineColoredMaterial.resolution=new Oe,this.lineHiddenMaterial=new Qr({color:16777215,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe},["USE_RTE"]),this.lineHiddenMaterial.color=new tt(16711680),this.lineHiddenMaterial.linewidth=1,this.lineHiddenMaterial.worldUnits=!1,this.lineHiddenMaterial.vertexColors=!0,this.lineHiddenMaterial.pixelThreshold=.5,this.lineHiddenMaterial.resolution=new Oe,this.lineHiddenMaterial.visible=!1,this.lineOverlayMaterial=new Qr({color:314363,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe},["USE_RTE"]),this.lineHighlightMaterial.color=new tt(314363),this.lineHighlightMaterial.linewidth=1,this.lineHighlightMaterial.worldUnits=!1,this.lineHighlightMaterial.vertexColors=!0,this.lineHighlightMaterial.pixelThreshold=.5,this.lineHighlightMaterial.resolution=new Oe,this.lineHighlightMaterial.color.convertSRGBToLinear(),this.lineOverlayMaterial.color.convertSRGBToLinear()}async createDefaultPointMaterials(){this.pointCloudHighlightMaterial=new tr({color:294651,vertexColors:!0,size:2,sizeAttenuation:!1},["USE_RTE"]),this.pointHighlightMaterial=new tr({color:294651,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.pointGhostMaterial=new tr({color:16777215,vertexColors:!1,size:2,opacity:.01,sizeAttenuation:!1},["USE_RTE"]),this.pointCloudOverlayMaterial=new tr({color:314363,vertexColors:!0,size:2,sizeAttenuation:!1},["USE_RTE"]),this.pointOverlayMaterial=new tr({color:314363,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.pointCloudColouredMaterial=new vs({color:16777215,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.pointCloudGradientMaterial=new vs({color:16777215,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.pointCloudGradientMaterial.setGradientTexture(await Gl.getTexture(bE)),this.pointCloudHighlightMaterial.color.convertSRGBToLinear(),this.pointCloudHighlightMaterial.toneMapped=!1,this.pointHighlightMaterial.color.convertSRGBToLinear(),this.pointHighlightMaterial.toneMapped=!1,this.pointOverlayMaterial.color.convertSRGBToLinear(),this.pointOverlayMaterial.toneMapped=!1,this.pointCloudOverlayMaterial.color.convertSRGBToLinear(),this.pointCloudOverlayMaterial.toneMapped=!1,this.pointGhostMaterial.toneMapped=!1}async createDefaultTextMaterials(){this.textHighlightMaterial=new ts({color:294651,opacity:1,side:rn},["USE_RTE"]),this.textHighlightMaterial.transparent=this.textHighlightMaterial.opacity<1,this.textHighlightMaterial.depthWrite=!this.textHighlightMaterial.transparent,this.textHighlightMaterial.toneMapped=!1,this.textHighlightMaterial.color.convertSRGBToLinear(),this.textHighlightMaterial=this.textHighlightMaterial.getDerivedMaterial(),this.textGhostMaterial=new ts({color:16777215,opacity:.1,side:rn},["USE_RTE"]),this.textGhostMaterial.transparent=this.textGhostMaterial.opacity<1,this.textGhostMaterial.depthWrite=!this.textGhostMaterial.transparent,this.textGhostMaterial.toneMapped=!1,this.textGhostMaterial.color.convertSRGBToLinear(),this.textGhostMaterial=this.textGhostMaterial.getDerivedMaterial(),this.textColoredMaterial=new ts({color:16777215,opacity:1,side:rn},["USE_RTE"]),this.textColoredMaterial.transparent=this.textColoredMaterial.opacity<1,this.textColoredMaterial.depthWrite=!this.textColoredMaterial.transparent,this.textColoredMaterial.toneMapped=!1,this.textColoredMaterial.color.convertSRGBToLinear(),this.textColoredMaterial=this.textColoredMaterial.getDerivedMaterial(),this.textOverlayMaterial=new ts({color:314363,opacity:1,side:rn},["USE_RTE"]),this.textOverlayMaterial.transparent=this.textOverlayMaterial.opacity<1,this.textOverlayMaterial.depthWrite=!this.textOverlayMaterial.transparent,this.textOverlayMaterial.toneMapped=!1,this.textOverlayMaterial.color.convertSRGBToLinear(),this.textOverlayMaterial=this.textOverlayMaterial.getDerivedMaterial(),this.textHiddenMaterial=new ts({color:16777215,opacity:1,side:rn},["USE_RTE"]),this.textHiddenMaterial.visible=!1,this.textHiddenMaterial.toneMapped=!1,this.textHiddenMaterial.color.convertSRGBToLinear(),this.textHiddenMaterial=this.textHiddenMaterial.getDerivedMaterial()}async createDefaultNullMaterials(){this.materialMap[Is.NullRenderMaterialHash]=new mn({color:8355711,emissive:0,roughness:1,metalness:0,side:rn},["USE_RTE"]),this.materialMap[Is.NullRenderMaterialHash].color.convertSRGBToLinear(),this.materialMap[Is.NullRenderMaterialVertexColorsHash]=new mn({color:16777215,emissive:0,roughness:1,metalness:0,side:rn,vertexColors:!0},["USE_RTE"]),this.materialMap[Is.NullRenderMaterialVertexColorsHash].color.convertSRGBToLinear();const e=Is.NullDisplayStyleHash;this.materialMap[e]=new Qr({color:8355711,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe},["USE_RTE"]),this.materialMap[e].color=new tt(8355711),this.materialMap[e].color.convertSRGBToLinear(),this.materialMap[e].linewidth=1,this.materialMap[e].worldUnits=!1,this.materialMap[e].vertexColors=!0,this.materialMap[e].pixelThreshold=.5,this.materialMap[e].resolution=new Oe,this.materialMap[Is.NullPointMaterialHash]=new tr({color:8355711,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.materialMap[Is.NullPointMaterialHash].color.convertSRGBToLinear(),this.materialMap[Is.NullPointCloudVertexColorsMaterialHash]=new tr({color:16777215,vertexColors:!0,size:2,sizeAttenuation:!1},["USE_RTE"]),this.materialMap[Is.NullPointCloudMaterialHash]=new tr({color:16777215,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"])}async createDefaultMaterials(){await this.createDefaultMeshMaterials(),await this.createLineDefaultMaterials(),await this.createDefaultPointMaterials(),await this.createDefaultTextMaterials(),await this.createDefaultNullMaterials(),this.defaultGradientTextureData=await Gl.getTextureData(bE)}makeMeshMaterial(e){const n=new mn({color:e.color,emissive:0,roughness:e.roughness,metalness:e.metalness,opacity:e.opacity,side:rn},["USE_RTE"]);return n.vertexColors=e.vertexColors,n.transparent=n.opacity<1,n.depthWrite=!n.transparent,n.clipShadows=!0,n.color.convertSRGBToLinear(),n}makeLineMaterial(e){const n=new Qr({color:e.color,linewidth:e.lineWeight>0?e.lineWeight:1,worldUnits:e.lineWeight>0,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe},["USE_RTE"]);return n.color=new tt(e.color),n.color.convertSRGBToLinear(),n.linewidth=e.lineWeight>0?e.lineWeight:1,n.worldUnits=e.lineWeight>0,n.vertexColors=!0,n.pixelThreshold=.5,n.resolution=new Oe,n}makePointMaterial(e){const n=e.color===-16777216,r=e.vertexColors&&n?16777215:e.color,i=new tr({color:r,opacity:e.opacity,vertexColors:e.vertexColors,size:2,sizeAttenuation:!1},["USE_RTE"]);return i.transparent=i.opacity<1,i.depthWrite=!i.transparent,i.toneMapped=!1,i.color.convertSRGBToLinear(),i}makeTextMaterial(e){const n=new ts({color:e.color,opacity:1,side:rn},["USE_RTE"]);return n.transparent=n.opacity<1,n.depthWrite=!n.transparent,n.toneMapped=!1,n.color.convertSRGBToLinear(),n.getDerivedMaterial()}getMaterial(e,n,r){let i;switch(r){case st.MESH:i=this.getMeshMaterial(e,n);break;case st.LINE:i=this.getLineMaterial(e,n);break;case st.POINT:i=this.getPointMaterial(e,n);break;case st.POINT_CLOUD:i=this.getPointCloudMaterial(e,n);break;case st.TEXT:i=this.getTextMaterial(e,n)}return i.clippingPlanes=[],i}getMeshMaterial(e,n){return n?this.makeMeshMaterial(n):this.materialMap[e]?this.materialMap[e].clone():void Zt.warn(`Could not create mesh material hash ${e} for `,n)}getLineMaterial(e,n){return this.materialMap[e]?this.materialMap[e]:this.makeLineMaterial(n)}getPointMaterial(e,n){return this.materialMap[e]?this.materialMap[e]:this.makePointMaterial(n)}getPointCloudMaterial(e,n){return this.getPointMaterial(e,n)}getTextMaterial(e,n){return this.makeTextMaterial(n)}getHighlightMaterial(e){switch(e.geometryType){case st.MESH:return e.transparent?this.meshTransparentHighlightMaterial:this.meshHighlightMaterial;case st.LINE:return this.lineHighlightMaterial;case st.POINT:return this.pointHighlightMaterial;case st.POINT_CLOUD:return this.pointCloudHighlightMaterial;case st.TEXT:return this.textHighlightMaterial}}getGhostMaterial(e){switch(e.geometryType){case st.MESH:return this.meshGhostMaterial;case st.LINE:return this.lineGhostMaterial;case st.POINT:case st.POINT_CLOUD:return this.pointGhostMaterial;case st.TEXT:return this.textGhostMaterial}}getGradientMaterial(e){switch(e.geometryType){case st.MESH:return e.transparent?this.meshTransparentGradientMaterial:this.meshGradientMaterial;case st.LINE:return this.lineColoredMaterial;case st.POINT:case st.POINT_CLOUD:return this.pointCloudGradientMaterial;case st.TEXT:return this.textColoredMaterial}}getColoredMaterial(e){switch(e.geometryType){case st.MESH:return e.transparent?this.meshTransparentColoredMaterial:this.meshColoredMaterial;case st.LINE:return this.lineColoredMaterial;case st.POINT:case st.POINT_CLOUD:return this.pointCloudColouredMaterial;case st.TEXT:return this.textColoredMaterial}}getOverlayMaterial(e){switch(e.geometryType){case st.MESH:return e.transparent?this.meshTransparentOverlayMaterial:this.meshOverlayMaterial;case st.LINE:return this.lineOverlayMaterial;case st.POINT:return this.pointOverlayMaterial;case st.POINT_CLOUD:return this.pointCloudOverlayMaterial;case st.TEXT:return this.textOverlayMaterial}}getHiddenMaterial(e){switch(e.geometryType){case st.MESH:return this.meshHiddenMaterial;case st.LINE:return this.lineHiddenMaterial;case st.POINT:case st.POINT_CLOUD:return this.meshHiddenMaterial;case st.TEXT:return this.textHiddenMaterial}}getDebugBatchMaterial(e){const n=new tt(fp.randInt(0,16777215));switch(n.convertSRGBToLinear(),e.geometryType){case st.MESH:return new mn({color:n,emissive:0,roughness:1,metalness:0,opacity:1,side:rn},["USE_RTE"]);case st.LINE:{const r=new Qr({color:n,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe});return r.color=n,r.linewidth=1,r.worldUnits=!1,r.vertexColors=!0,r.pixelThreshold=.5,r.resolution=new Oe,r}case st.POINT:return new tr({color:n,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]);case st.POINT_CLOUD:return new tr({color:n,vertexColors:!0,size:2,sizeAttenuation:!1},["USE_RTE"]);case st.TEXT:{const r=new ts({color:n,opacity:1,side:rn},["USE_RTE"]);return r.toneMapped=!1,r.color.convertSRGBToLinear(),r.getDerivedMaterial()}}}getFilterMaterial(e,n){let r;switch(n){case mi.SELECT:r=this.getHighlightMaterial(e);break;case mi.GHOST:r=this.getGhostMaterial(e);break;case mi.GRADIENT:r=this.getGradientMaterial(e);break;case mi.COLORED:r=this.getColoredMaterial(e);break;case mi.OVERLAY:r=this.getOverlayMaterial(e);break;case mi.HIDDEN:r=this.getHiddenMaterial(e)}return r.clippingPlanes=[],r}getFilterMaterialOptions(e){switch(e.filterType){case mi.COLORED:return{rampIndex:e.rampIndex!==void 0?e.rampIndex:void 0,rampIndexColor:e.rampIndexColor,rampTexture:e.rampTexture?e.rampTexture:void 0,rampWidth:e.rampTexture?e.rampTexture.image.width:void 0};case mi.GRADIENT:return{rampIndex:e.rampIndex!==void 0?e.rampIndex:void 0,rampIndexColor:e.rampIndexColor!==void 0?e.rampIndexColor:new tt().setRGB(this.defaultGradientTextureData.data[4*Math.floor(e.rampIndex*(this.defaultGradientTextureData.width-1))]/255,this.defaultGradientTextureData.data[4*Math.floor(e.rampIndex*(this.defaultGradientTextureData.width-1))+1]/255,this.defaultGradientTextureData.data[4*Math.floor(e.rampIndex*(this.defaultGradientTextureData.width-1))+2]/255).convertSRGBToLinear(),rampTexture:e.rampTexture?e.rampTexture:this.meshGradientMaterial.userData.gradientRamp.value,rampWidth:e.rampTexture?e.rampTexture.image.width:this.meshGradientMaterial.userData.gradientRamp.value.image.width}}}purge(){}}Ic.UNIFORM_VECTORS_USED=33;const Y$=new Be,Ug=new qo,sU=new so,aU=new U,Rd=new U,Vd=new U,zd=new U,oU=new U,lU=new U,uU=new U,yE=new U,SE=new U,xE=new U,TE=new Oe,wE=new Oe,EE=new Oe,cU=new U,ME=new U,dU=new qo,B$=new Be;class N0 extends ut{get BVH(){return this.bvh}get batchObjects(){return this._batchObjects}constructor(e,n){super(e,n),this.bvh=null,this.batchMaterial=null,this.materialCache={},this.materialStack=[],this.transformsBuffer=null,this.transformsDirty=!0,this.transformsTextureUniform=null,this.transformsArrayUniforms=null,this.debugBatchBox=!1,this.batchMaterial=n}setBatchObjects(e,n){this._batchObjects=e,this.transformStorage=n,this.transformStorage===Hd.VERTEX_TEXTURE?(this.transformsBuffer=new Float32Array(4*this._batchObjects.length*4),this.transformsTextureUniform=new Ac(this.transformsBuffer,this.transformsBuffer.length/4,1,no,na)):this.transformStorage===Hd.UNIFORM_ARRAY&&(this.transformsArrayUniforms=this._batchObjects.map(()=>new Be)),this.updateTransformsUniform()}setOverrideMaterial(e){this.materialStack.push(this.material),this.materialCache[e.id]||(this.materialCache[e.id]=e.clone()),this.materialCache[e.id].copy(e),this.material=this.materialCache[e.id],this.material.needsUpdate=!0}getCachedMaterial(e,n=!1){return this.materialCache[e.id]?n&&Ic.fastCopy(e,this.materialCache[e.id]):this.materialCache[e.id]=e.clone(),this.materialCache[e.id]}restoreMaterial(){this.materialStack.length>0&&(this.material=this.materialStack.pop())}updateMaterialTransformsUniform(e){e.defines.TRANSFORM_STORAGE=this.transformStorage,this.transformStorage===Hd.VERTEX_TEXTURE?(e.userData.tTransforms.value=this.transformsTextureUniform,e.userData.objCount&&(e.userData.objCount.value=this._batchObjects.length)):this.transformStorage===Hd.UNIFORM_ARRAY&&(e.defines.OBJ_COUNT&&e.defines.OBJ_COUNT===this._batchObjects.length||(e.defines.OBJ_COUNT=this._batchObjects.length),e.userData.uTransforms.value=this.transformsArrayUniforms),e.needsUpdate=!0}updateTransformsUniform(){this.transformsDirty?(this.transformStorage===Hd.VERTEX_TEXTURE?(this._batchObjects.forEach(e=>{const n=16*e.batchIndex;this.transformsBuffer[n]=e.quaternion.x,this.transformsBuffer[n+1]=e.quaternion.y,this.transformsBuffer[n+2]=e.quaternion.z,this.transformsBuffer[n+3]=e.quaternion.w,this.transformsBuffer[n+4]=e.pivot_Low.x,this.transformsBuffer[n+5]=e.pivot_Low.y,this.transformsBuffer[n+6]=e.pivot_Low.z,this.transformsBuffer[n+7]=e.scale.x,this.transformsBuffer[n+8]=e.pivot_High.x,this.transformsBuffer[n+9]=e.pivot_High.y,this.transformsBuffer[n+10]=e.pivot_High.z,this.transformsBuffer[n+11]=e.scale.y,this.transformsBuffer[n+12]=e.translation.x,this.transformsBuffer[n+13]=e.translation.y,this.transformsBuffer[n+14]=e.translation.z,this.transformsBuffer[n+15]=e.scale.z}),this.transformsTextureUniform.needsUpdate=!0):this._batchObjects.forEach((e,n)=>{this.transformsArrayUniforms[n].set(e.quaternion.x,e.pivot_Low.x,e.pivot_High.x,e.translation.x,e.quaternion.y,e.pivot_Low.y,e.pivot_High.y,e.translation.y,e.quaternion.z,e.pivot_Low.z,e.pivot_High.z,e.translation.z,e.quaternion.w,e.scale.x,e.scale.y,e.scale.z)}),this.bvh&&(this.bvh.refit(),this.bvh.getBoundingBox(this.bvh.bounds),this.geometry.boundingBox.copy(this.bvh.bounds),this.geometry.boundingBox.getBoundingSphere(this.geometry.boundingSphere),!this.boxHelper&&this.debugBatchBox&&(this.boxHelper=new OT(this.bvh.bounds,new tt(16711680)),this.boxHelper.layers.set(kt.PROPS),this.parent.add(this.boxHelper))),this.transformsDirty=!1):this.bvh&&(this.bvh.lastRefitTime=0)}buildBVH(){this.bvh=new zo(this.batchObjects),this.bvh.tas.refit()}getBatchObjectMaterial(e){const n=e.renderView,r=this.geometry.groups.find(i=>n.batchStart>=i.start&&n.batchStart+n.batchCount<=i.count+i.start);return Array.isArray(this.material)?r?this.material[r.materialIndex]:(Zt.warn(`Could not get material for ${e.renderView.renderData.id}`),null):this.material}convertRaycastIntersect(e,n,r){return e===null?null:(e.point.applyMatrix4(n.matrixWorld),e.distance=e.point.distanceTo(r.ray.origin),e.object=n,e.distancer.far?null:e)}raycast(e,n){if(this.bvh){if(this.batchMaterial===void 0)return;B$.copy(this.matrixWorld).invert(),dU.copy(e.ray).applyMatrix4(B$);const r=this.bvh;if(e.firstHitOnly===!0){const i=this.convertRaycastIntersect(r.raycastFirst(dU,this.batchMaterial),this,e);i&&n.push(i)}else{const i=r.raycast(dU,this.batchMaterial);for(let s=0,a=i.length;sg.far?null:{distance:S,point:ME.clone(),object:m,uv:void 0,uv2:void 0,face:void 0}}(t,e,n,r,Rd,Vd,zd,cU);if(p){l&&(TE.fromBufferAttribute(l,c),wE.fromBufferAttribute(l,d),EE.fromBufferAttribute(l,f),p.uv=Wr.getUV(cU,Rd,Vd,zd,TE,wE,EE,new Oe)),u&&(TE.fromBufferAttribute(u,c),wE.fromBufferAttribute(u,d),EE.fromBufferAttribute(u,f),p.uv2=Wr.getUV(cU,Rd,Vd,zd,TE,wE,EE,new Oe));const m={a:c,b:d,c:f,normal:new U,materialIndex:0};Wr.getNormal(Rd,Vd,zd,m.normal),p.face=m}return p}N0.MeshBatchNumber=0;class Er{get renderView(){return this._renderView}get bvh(){return this._bvh}get batchIndex(){return this._batchIndex}get speckleId(){return this._renderView.renderData.id}constructor(e,n){this.quaternion=new Or,this.pivot_High=new U,this.pivot_Low=new U,this.translation=new U,this.scale=new U(1,1,1),this._renderView=e,this._batchIndex=n,this.transform=new Be().identity(),this.transformInv=new Be().identity(),this._localOrigin=this._renderView.aabb.getCenter(new U),ur.DoubleToHighLowVector(new U(this._localOrigin.x,this._localOrigin.y,this._localOrigin.z),this.pivot_Low,this.pivot_High)}buildBVH(){const e=new Be().makeTranslation(this._localOrigin.x,this._localOrigin.y,this._localOrigin.z);e.invert();const n=this._renderView.renderData.geometry.attributes.INDEX,r=this._renderView.renderData.geometry.attributes.POSITION,i=new Float32Array(r.length),s=new U;for(let a=0;a{n=Math.min(n,i.offset),r=Math.max(r,i.offset)}),this.geometry.setDrawRange(n,r-n+e.find(i=>i.offset===r).count),this.mesh.visible=!0}getVisibleRange(){return this.geometry.groups.length===0?Al:{offset:this.geometry.drawRange.start,count:this.geometry.drawRange.count}}setDrawRanges(...e){e.forEach(l=>{var u;l.material&&(l.material=this.mesh.getCachedMaterial(l.material,(u=l.materialOptions)===null||u===void 0?void 0:u.needsCopy))});const n=e.map(l=>l.material),r=[...Array.from(new Set(n.map(l=>l)))];Array.isArray(this.mesh.material)||(this.mesh.material=[this.mesh.material]);for(let l=0;ll.offset-u.offset),s=[];let a=1/0,o=0;for(let l=0;lo.material),r=[...Array.from(new Set(n.map(o=>o)))];Array.isArray(this.mesh.material)||(this.mesh.material=[this.mesh.material]);for(let o=0;oo.offset-l.offset);for(let o=0;o(o.indexOf(l.materialIndex)===-1&&o.push(l.materialIndex),o),s);const a=[];for(let o=0;ol.materialIndex===s[o]));this.geometry.groups=[];for(let o=0;os.id===e))===null||n===void 0?void 0:n.materialIndex;i&&(this.geometry.groups=this.geometry.groups.filter(s=>!(s.id&&s.id===e)),this.mesh.material.splice(i,1),i!==r-1&&this.geometry.groups.forEach(s=>{s.materialIndex>i&&s.materialIndex--}))}getDrawRangeCollision(e){if(this.geometry.groups.length>0){for(let n=0;nh.start===0&&h.count===this.getCount()&&h.materialIndex===0);e!==-1&&this.geometry.groups.splice(e,1);const n=this.geometry.groups.sort((h,p)=>h.start-p.start).slice(),r=n.map(h=>h.start);for(let h=0;h{const m=this.mesh.material[h.materialIndex],v=this.mesh.material[p.materialIndex],g=+v.visible-+m.visible,b=+m.transparent-+v.transparent;return g!==0?g:b});const i=[];n.reduce((h,p)=>(h.indexOf(p.materialIndex)===-1&&h.push(p.materialIndex),h),i);const s=[];for(let h=0;hp.materialIndex===i[h]));const a=this.getCurrentIndexBuffer(),o=this.getNextIndexBuffer(),l=[],u={};let c=0;for(let h=0;hthis.mesh.material[h.materialIndex].visible===!1);f&&this.setVisibleRange({offset:0,count:f.start})}createRenderViewMapping(){const e={};for(let n=0;nd.renderData.geometry.attributes.INDEX).length,n=this.renderViews.flatMap(d=>d.renderData.geometry.attributes.POSITION).length,r=this.renderViews[0].renderData.geometry.attributes.COLOR!==void 0,i=new Uint32Array(e),s=new Float64Array(n),a=new Float32Array(r?n:0);a.fill(1);const o=new Float32Array(n/3);let l=0,u=0;const c=[];for(let d=0;dp+l/3),u),s.set(f.attributes.POSITION,l),f.attributes.COLOR&&a.set(f.attributes.COLOR,l),o.fill(d,l/3,l/3+f.attributes.POSITION.length/3),this.renderViews[d].setBatchData(this.id,u,f.attributes.INDEX.length,l/3,l/3+f.attributes.POSITION.length/3);const h=new Er(this.renderViews[d],d);h.buildBVH(),c.push(h),l+=f.attributes.POSITION.length,u+=f.attributes.INDEX.length}this.makeMeshGeometry(i,s,o,r?a:null),this.mesh=new N0(this.geometry,this.batchMaterial),this.mesh.setBatchObjects(c,this.transformStorage),this.mesh.buildBVH(),this.mesh.uuid=this.id,this.mesh.layers.set(kt.STREAM_CONTENT_MESH),this.mesh.frustumCulled=!1,this.mesh.material=[this.batchMaterial],this.mesh.geometry.addGroup(0,this.getCount(),0),Sn.keepGeometryData||c.forEach(d=>{d.renderView.disposeGeometry()})}getRenderView(e){return console.warn("Deprecated! Do not call this anymore"),null}getMaterialAtIndex(e){return console.warn("Deprecated! Do not call this anymore"),null}makeMeshGeometry(e,n,r,i){this.geometry=new Lt,n.length>=65535||e.length>=65535?(this.indexBuffer0=new Gv(e,1),this.indexBuffer1=new Gv(new Uint32Array(e.length),1)):(this.indexBuffer0=new Av(e,1),this.indexBuffer1=new Av(new Uint16Array(e.length),1)),this.geometry.setIndex(this.indexBuffer0),n&&this.geometry.setAttribute("position",new xt(n,3)),r&&this.geometry.setAttribute("objIndex",new xt(r,1)),i&&this.geometry.setAttribute("color",new xt(i,3));const s=new Float32Array(n.length/3);return this.gradientIndexBuffer=new xt(s,1),this.gradientIndexBuffer.setUsage(Bl),this.geometry.setAttribute("gradientIndex",this.gradientIndexBuffer),this.updateGradientIndexBufferData(0,s.length,0),this.updateGradientIndexBuffer(),ur.computeVertexNormals(this.geometry,n),this.geometry.computeBoundingSphere(),this.geometry.computeBoundingBox(),ur.updateRTEGeometry(this.geometry,n),this.geometry}updateGradientIndexBufferData(e,n,r){const i=this.geometry.index.array,s=this.gradientIndexBuffer.array;let a=1/0,o=0;for(let l=e;lr.id===e);n.length&&(this.setDrawRanges(...n),this.insertedRanges=this.insertedRanges.filter(r=>!n.includes(r)))}autoFillDrawRanges(){}resetDrawRanges(){this.setDrawRanges({offset:0,count:1/0,material:this.batchMaterial}),this.mesh.material=this.batchMaterial,this.mesh.visible=!0,this.batchMaterial.transparent=!1}buildBatch(){let e=0;this.renderViews.forEach(i=>e+=i.needsSegmentConversion?2*(i.renderData.geometry.attributes.POSITION.length-3):i.renderData.geometry.attributes.POSITION.length);const n=new Float64Array(e);let r=0;for(let i=0;i=this.renderViews[n].batchStart&&e{n=Math.min(n,i.offset),r=Math.max(r,i.offset)}),this.geometry.setDrawRange(n,r-n+e.find(i=>i.offset===r).count),this.mesh.visible=!0}getVisibleRange(){return Al}setDrawRanges(...e){const n=e.map(l=>l.material),r=[...Array.from(new Set(n.map(l=>l)))];Array.isArray(this.mesh.material)?this.mesh.material=this.mesh.material.concat(r):this.mesh.material=[this.mesh.material,...r];const i=e.sort((l,u)=>l.offset-u.offset),s=[];let a=1/0,o=0;for(let l=0;ls.material),r=[...Array.from(new Set(n.map(s=>s)))];Array.isArray(this.mesh.material)||(this.mesh.material=[this.mesh.material]);for(let s=0;ss.offset-a.offset);for(let s=0;s!(n.id&&n.id===e))}getDrawRangeCollision(e){if(this.geometry.groups.length>0){for(let n=0;n1&&this.geometry.groups[0].start===0&&this.geometry.groups[0].count===this.getCount()&&this.geometry.groups.shift();const e=this.geometry.groups.sort((r,i)=>r.start-i.start).slice();for(let r=0;r0&&this.geometry.addGroup(0,e[r].start,0),e.length===1&&e[r].start+e[r].countr.start-i.start);let n=0;this.geometry.groups.forEach(r=>{n+=r.count}),n(r.indexOf(i.materialIndex)===-1&&r.push(i.materialIndex),r),e);const n=[];for(let r=0;ri.materialIndex===e[r]));this.geometry.groups=[];for(let r=0;rs.renderData.geometry.attributes.POSITION).length,n=new Float64Array(e),r=new Float32Array(e).fill(1);let i=0;for(let s=0;s=this.renderViews[n].batchStart&&e=this.renderViews[n].batchStart&&er.batchStart>=s.start&&r.batchStart+r.batchCount<=s.count+s.start);return Array.isArray(this.mesh.material)?i?this.mesh.material[i.materialIndex]:(Zt.warn("Malformed material index!"),null):this.mesh.material}}makePointGeometry(e,n){this.geometry=new Lt,this.geometry.setAttribute("position",new xt(e,3)),this.geometry.setAttribute("color",new xt(n,3));const r=new Float32Array(e.length/3);return this.gradientIndexBuffer=new xt(r,1),this.gradientIndexBuffer.setUsage(Bl),this.geometry.setAttribute("gradientIndex",this.gradientIndexBuffer),this.updateGradientIndexBufferData(0,r.length,0),this.updateGradientIndexBuffer(),this.geometry.computeVertexNormals(),this.geometry.computeBoundingSphere(),this.geometry.computeBoundingBox(),ur.updateRTEGeometry(this.geometry,e),this.geometry}updateGradientIndexBufferData(e,n,r){return this.gradientIndexBuffer.array.fill(r,e,n),this.gradientIndexBuffer.updateRange={offset:e,count:n-e},this.gradientIndexBuffer.needsUpdate=!0,this.geometry.attributes.gradientIndex.needsUpdate=!0,{minIndex:e,maxIndex:n}}updateGradientIndexBuffer(e,n){this.gradientIndexBuffer.updateRange={offset:e!==void 0?e:0,count:e!==void 0&&n!==void 0?n-e+1:-1},this.gradientIndexBuffer.needsUpdate=!0,this.geometry.attributes.gradientIndex.needsUpdate=!0}purge(){this.renderViews.length=0,this.geometry.dispose(),this.batchMaterial.dispose(),this.mesh=null}}class mW{constructor(){this.boxes=new Array,this.worldBox=new Jt,this._worldOrigin=new U}get worldSize(){this.worldBox.getCenter(this._worldOrigin);const e=new U().subVectors(this.worldBox.max,this.worldBox.min);return{x:e.x,y:e.y,z:e.z}}get worldOrigin(){return this._worldOrigin}expandWorld(e){this.boxes.push(e),this.updateWorld()}reduceWorld(e){this.boxes.splice(this.boxes.indexOf(e),1),this.updateWorld()}updateWorld(){this.worldBox.makeEmpty();for(let e=0;e{let s=0;return async()=>{Date.now()-s>=r&&(s=Date.now(),await new Promise(a=>setTimeout(a,i)))}})(e,n)}}const z1t={backgroundColor:null,backgroundCornerRadius:1,backgroundPixelHeight:50,textColor:new tt(16777215),billboard:!1};class T4 extends ut{static SpeckleTextParamsFromMetadata(e){return{textValue:e.value?e.value:"N/A",height:e.height}}get textMesh(){return this._text}get backgroundMesh(){return this._background}set style(e){Object.assign(this._style,e),this.updateStyle()}constructor(e){super(),this._text=null,this._background=null,this._backgroundSize=new U,this._style=Object.assign({},z1t),this._resolution=new Oe,this.defaultMaterial=new ho({color:16777215,side:rn,transparent:!0}),this.getFlatRaycastMesh=()=>{const n=new ut(new ao(1,1),this.defaultMaterial);return this.getFlatRaycastMesh=()=>n,n},this.getCurvedRaycastMesh=()=>{const n=new ut(new ao(1,1,32,1),this.defaultMaterial);return this.getCurvedRaycastMesh=()=>n,n},this.uuid=e,this._text=new v0e,this._text.depthOffset=-.1,this._text.raycast=()=>{},this.add(this._text),this.onBeforeRender=n=>{n.getDrawingBufferSize(this._resolution)}}async update(e,n){return new Promise(r=>{e.textValue&&(this._text.text=e.textValue),e.richTextValue,e.height&&(this._text.fontSize=e.height),this._text.anchorX=e.anchorX,this._text.anchorY=e.anchorY,this._text._needsSync?this._text.sync(()=>{r(),n&&n()}):(r(),n&&n())})}setTransform(e,n,r){e&&(this._style.billboard&&(this.textMesh.material.userData.billboardPos.value.copy(e),this._background.material.userData.billboardPos.value.copy(e)),this.position.copy(e)),n&&this.quaternion.copy(n),r&&this.scale.copy(r)}raycast(e,n){const{textRenderInfo:r,curveRadius:i}=this.textMesh;if(r){const s=r.blockBounds,a=i?this.getCurvedRaycastMesh():this.getFlatRaycastMesh(),o=a.geometry,{position:l,uv:u}=o.attributes;for(let d=0;d.1&&(i=this.RectangleRounded(1.2*n.x,1.2*n.y,.5,5),i.computeBoundingBox(),this._backgroundSize.copy(n),this._background&&(this._background.geometry=i)),this._background===null){const a=new Mr({},["BILLBOARD_FIXED"]);a.toneMapped=!1,a.side=rn,a.depthTest=!1,this._background=new ut(i,a),this._background.layers.set(kt.MEASUREMENTS),this._background.frustumCulled=!1,this._background.renderOrder=1,this.add(this._background)}const s=new tt(this._style.backgroundColor).convertSRGBToLinear();this._background.material.color=s,this._background.material.billboardPixelHeight=this._style.backgroundPixelHeight*window.devicePixelRatio}RectangleRounded(e,n,r,i){const s=2*Math.PI,a=4*(i+1),o=[],l=[],u=[];let c,d,f,h,p;for(let g=1;gr.id===e);n.length&&(this.setDrawRanges(...n),this.insertedRanges=this.insertedRanges.filter(r=>!n.includes(r)))}autoFillDrawRanges(){}resetDrawRanges(){this.mesh.textMesh.material=this.batchMaterial,this.mesh.textMesh.visible=!0}async buildBatch(){this.mesh=new T4(this.id),this.mesh.matrixAutoUpdate=!1,await this.mesh.update(T4.SpeckleTextParamsFromMetadata(this.renderViews[0].renderData.geometry.metaData)),this.mesh.matrix.copy(this.renderViews[0].renderData.geometry.bakeTransform),this.renderViews[0].setBatchData(this.id,0,this.mesh.textMesh.geometry.index.length/3),this.mesh.textMesh.material=this.batchMaterial,this.mesh.layers.set(kt.STREAM_CONTENT_TEXT),this.mesh.textMesh.layers.set(kt.STREAM_CONTENT_TEXT)}getRenderView(e){return this.renderViews[0]}getMaterialAtIndex(e){return this.batchMaterial}purge(){this.renderViews.length=0,this.batchMaterial.dispose(),this.mesh.geometry.dispose(),this.mesh=null}}var Hd;(function(t){t[t.VERTEX_TEXTURE=0]="VERTEX_TEXTURE",t[t.UNIFORM_ARRAY=1]="UNIFORM_ARRAY"})(Hd||(Hd={}));class O1t{constructor(e,n){this.maxHardwareUniformCount=0,this.floatTextures=!1,this.maxBatchObjects=0,this.maxBatchVertices=5e5,this.batches={},this.maxHardwareUniformCount=e,this.maxBatchObjects=Math.floor((this.maxHardwareUniformCount-Ic.UNIFORM_VECTORS_USED)/4),this.floatTextures=n,this.materials=new Ic,this.materials.createDefaultMaterials()}async makeBatches(e,n,r){const i=e.getRenderableRenderViews(...n).sort((a,o)=>a.renderMaterialHash===0?-1:o.renderMaterialHash===0?1:a.renderMaterialHash-o.renderMaterialHash),s=[...Array.from(new Set(i.map(a=>a.renderMaterialHash)))];Zt.warn(`Batch count: ${s}`);for(let a=0;ac.renderMaterialHash===s[a]);l=l.filter(c=>{const d=c.validGeometry;return d&&(o+=c.renderData.geometry.attributes.POSITION.length/3),d||c.hasMetadata});const u=this.splitBatch(l,o);for(let c=0;cf.renderMaterialHash===0?-1:h.renderMaterialHash===0?1:f.renderMaterialHash-h.renderMaterialHash),o=[...Array.from(new Set(a.map(f=>f.renderMaterialHash)))];let l=Number.MAX_SAFE_INTEGER,u=-1,c=0,d=0;for(let f=0;fv.renderMaterialHash===o[f]),p=0;if(h=h.filter(v=>{const g=v.validGeometry;return g&&(p+=v.renderData.geometry.attributes.POSITION.length/3),g||v.hasMetadata}),h.length===0)continue;const m=this.splitBatch(h,p);for(let v=0;v0){let i=0,s=0;r.push([]);for(let a=0;a=this.maxBatchVertices&&e[a+1]&&(r.push([]),s++,i=0)}else r.push(e);if(e[0].geometryType===st.MESH){const i=[];for(let s=0;s0&&i.push(r[s].slice(u,u+l))}return i}return r}async buildBatch(e,n,r,i){const s=n.filter(d=>d.renderMaterialHash===r);if(!s.length)return Zt.warn("All renderviews have invalid geometries. Skipping batch!",n),null;const a=i!==void 0?i:s[0].geometryType;let o=null;a===st.MESH?o=n[0].renderData.renderMaterial:a===st.LINE?o=n[0].renderData.displayStyle:a===st.POINT||a===st.POINT_CLOUD?o=n[0].renderData.renderMaterial:a===st.TEXT&&(o=n[0].renderData.displayStyle);const l=this.materials.getMaterial(r,o,a),u=A8();let c=null;switch(a){case st.MESH:c=new R1t(u,e.id,s,this.floatTextures?Hd.VERTEX_TEXTURE:Hd.UNIFORM_ARRAY);break;case st.LINE:c=new X6(u,e.id,s);break;case st.POINT:case st.POINT_CLOUD:c=new V1t(u,e.id,s);break;case st.TEXT:c=new k1t(u,e.id,s)}return c.setBatchMaterial(l),await c.buildBatch(),c}update(e){for(const n in this.batches)this.batches[n].onUpdate(e)}render(e){for(const n in this.batches)this.batches[n].onRender(e)}saveVisiblity(){const e={};for(const n in this.batches){const r=this.batches[n];e[n]=r.getVisibleRange()}return e}applyVisibility(e){for(const n in this.batches){const r=this.batches[n],i=e[n];i?r.setVisibleRange(i):r.setVisibleRange(L6)}}getTransparent(){const e={};for(const n in this.batches){const r=this.batches[n],i=r.renderObject;if(i.geometry.groups.length===0)Ic.isTransparent(i.material)&&(e[n]=Al);else{const s=i.geometry.groups.find(o=>Ic.isTransparent(i.material[o.materialIndex])),a=i.geometry.groups.find(o=>i.material[o.materialIndex].visible===!1);s&&(e[n]={offset:s.start,count:a!==void 0?a.start:r.getCount()-s.start})}}return e}getStencil(){const e={};for(const n in this.batches){const r=this.batches[n].renderObject;if(r.geometry.groups.length===0)r.material.stencilWrite===!0&&(e[n]=Al);else{const i=r.geometry.groups.find(s=>r.material[s.materialIndex].stencilWrite===!0);i&&(e[n]={offset:i.start,count:i.count})}}return e}getOpaque(){const e={};for(const n in this.batches){const r=this.batches[n],i=r.renderObject;if(i.geometry.groups.length===0)Ic.isOpaque(i.material)&&(e[n]=Al);else{const s=i.geometry.groups.find(a=>Ic.isTransparent(i.material[a.materialIndex])||i.material[a.materialIndex].visible===!1);e[n]={offset:0,count:s!==void 0?s.start:r.getCount()}}}return e}overrideMaterial(e,n){for(const r in e)this.batches[r].geometryType===st.MESH&&this.batches[r].renderObject.setOverrideMaterial(n)}restoreMaterial(e){for(const n in e)this.batches[n].geometryType===st.MESH&&this.batches[n].renderObject.restoreMaterial()}getByMaterialUUID(e){const n={};for(const r in this.batches){const i=this.batches[r],s=i.renderObject;if(s.geometry.groups.length===0)s.material.uuid===e&&(n[r]=Al);else{const a=s.geometry.groups.find(o=>s.material[o.materialIndex].uuid===e);n[r]={offset:0,count:a!==void 0?a.start:i.getCount()}}}return n}purgeBatches(e){for(const n in this.batches)this.batches[n].subtreeId===e&&(this.batches[n].purge(),delete this.batches[n])}getBatches(e,n){return Object.values(this.batches).filter(r=>{const i=e===void 0||r.subtreeId===e,s=n===void 0||r.geometryType===n;return i&&s})}getBatch(e){return Object.values(this.batches).find(n=>n.renderViews.includes(e))}getRenderView(e,n){return this.batches[e]?this.batches[e].getRenderView(n):(Zt.error("Invalid batch id!"),null)}getRenderViewMaterial(e,n){return this.batches[e]?this.batches[e].getMaterialAtIndex(n):(Zt.error("Invalid batch id!"),null)}resetBatchesDrawRanges(){for(const e in this.batches)this.batches[e].resetDrawRanges()}setObjectsFilterMaterial(e,n,r=!0){return this.setObjectsMaterial(e,i=>({offset:i.batchStart,count:i.batchCount,material:this.materials.getFilterMaterial(i,n.filterType),materialOptions:this.materials.getFilterMaterialOptions(n)}),r)}setObjectsMaterial(e,n,r=!0){let i=e;r&&(i=[...Array.from(new Set(e.map(a=>a)))]);const s=[...Array.from(new Set(i.map(a=>a.batchId)))];for(let a=0;au.batchId===s[a]).map(n);o.setDrawRanges(...l)}return s}insertObjectsFilterMaterial(e,n){let r=e;r=[...Array.from(new Set(e.map(a=>a)))];const i=[...Array.from(new Set(r.map(a=>a.batchId)))],s=A8();for(let a=0;ap.batchId===i[a]),u=l.filter(p=>!p.transparent),c=l.filter(p=>p.transparent);let d,f;u.length&&(d=this.materials.getFilterMaterial(u[0],n.filterType).clone()),c.length&&(f=this.materials.getFilterMaterial(c[0],n.filterType).clone());const h=l.map(p=>({offset:p.batchStart,count:p.batchCount,material:p.transparent?f:d,materialOptions:this.materials.getFilterMaterialOptions(n),id:s}));o.insertDrawRanges(...h)}return s}removeObjectsMaterial(e){for(const n in this.batches)this.batches[n]&&this.batches[n].removeDrawRanges(e)}autoFillDrawRanges(e){[...Array.from(new Set(e.map(n=>n)))].forEach(n=>{n&&this.batches[n].autoFillDrawRanges()})}async isolateRenderViewBatch(e,n){const r=n.getRenderViewForNodeId(e);for(const i in this.batches)i!==r.batchId&&this.batches[i].setDrawRanges({offset:0,count:this.batches[i].getCount(),material:this.materials.getFilterMaterial(this.batches[i].renderViews[0],mi.GHOST)})}async isolateBatch(e){for(const n in this.batches)n!==e&&this.batches[n].setDrawRanges({offset:0,count:this.batches[n].getCount(),material:this.materials.getFilterMaterial(this.batches[n].renderViews[0],mi.GHOST)})}}const I1t={hover:!1};class U9 extends lw{constructor(e,n){let r;super(),this.lastTap=0,this.lastClick=0,this.container=e,this.container.addEventListener("pointerdown",i=>{i.preventDefault(),r=new Date().getTime()}),this.container.addEventListener("pointerup",i=>{i.preventDefault();const s=new Date().getTime(),a=s-r,o=s-this.lastClick;if(a>250||o{this.touchLocation=i.targetTouches[0]}),this.container.addEventListener("touchend",i=>{if(i.targetTouches.length>0)return;const s=new Date().getTime(),a=s-this.lastTap;clearTimeout(this.tapTimeout),a<500&&a>0?this.emit($t.ObjectDoubleClicked,this._getNormalisedClickPosition(this.touchLocation)):this.tapTimeout=setTimeout(function(){clearTimeout(this.tapTimeout)},500),this.lastTap=s}),this.container.addEventListener("dblclick",i=>{const s=this._getNormalisedClickPosition(i);s.event=i,this.emit($t.ObjectDoubleClicked,s)}),this.container.addEventListener("pointermove",i=>{const s=this._getNormalisedClickPosition(i);s.event=i,this.emit("pointer-move",s)}),document.addEventListener("keyup",i=>{this.emit("key-up",i)})}_getNormalisedClickPosition(e){const n=this.container,r=this.container.getBoundingClientRect(),i=(e.clientX-r.left)*n.width/r.width,s=(e.clientY-r.top)*n.height/r.height;return new Oe(i/n.width*2-1,s/n.height*-2+1)}dispose(){super.dispose()}}U9.MAX_DOUBLE_CLICK_TIMING=500;class U1t extends Sy{constructor(e,n,r=0,i=1/0){super(e,n,r,i),this.onObjectIntersectionTest=null,this.layers.disableAll(),this.layers.enable(kt.STREAM_CONTENT),this.layers.enable(kt.STREAM_CONTENT_MESH),this.layers.enable(kt.STREAM_CONTENT_LINE),this.layers.enable(kt.STREAM_CONTENT_TEXT),this.layers.enable(kt.STREAM_CONTENT_POINT_CLOUD)}intersectObjects(e,n=!0,r=[]){for(let i=0,s=e.length;i{this.raycaster.layers.enable(l)}));const a=e.getObjectByName("ContentGroup");let o=[];return a&&(o=this.raycaster.intersectObjects(a.children)),this.raycaster.layers.mask=s,o.length===0?null:(n&&o.sort((l,u)=>l.distance-u.distance),r&&(o=o.filter(l=>r.containsPoint(l.point))),o)}}class bs extends Tge{get vertexShader(){return` +`}get baseUniforms(){return wi.basic.uniforms}get uniformsDef(){return{uViewer_high:new U,uViewer_low:new U,uTransforms:[new Be],tTransforms:null,objCount:1,billboardPos:new U,billboardSize:new Oe,invProjection:new Be}}set billboardPixelHeight(e){this._billboardPixelHeight=e}get billboardPixelHeight(){return this._billboardPixelHeight}constructor(e,n=[]){super(e),this.init(n)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}getDerivedMaterial(){const e=d0e(this);for(const n in this.userData)e.uniforms[n]=this.userData[n];return e}onBeforeRender(e,n,r,i,s,a){if(this.defines.BILLBOARD_FIXED){const o=e.getDrawingBufferSize(ts.vecBuff3);ts.vecBuff3.set(this._billboardPixelHeight/o.x*2,this._billboardPixelHeight/o.y*2),this.userData.billboardSize.value.copy(ts.vecBuff3),ts.matBuff.copy(r.projectionMatrix).invert(),this.userData.invProjection.value.copy(ts.matBuff)}}}ts.matBuff=new Be,ts.vecBuff0=new U,ts.vecBuff1=new U,ts.vecBuff2=new U,ts.vecBuff3=new Oe;class vs extends qf{constructor(e,n=[]){super(e),this.userData.uViewer_high={value:new U},this.userData.uViewer_low={value:new U},this.userData.gradientRamp={value:null},this.vertProgram=wge,this.fragProgram=Ege,this.uniforms=Na.merge([wi.standard.uniforms,{uViewer_high:{value:this.userData.uViewer_high.value},uViewer_low:{value:this.userData.uViewer_low.value},gradientRamp:{value:this.userData.gradientRamp.value}}]),this.onBeforeCompile=function(r){r.uniforms.uViewer_high=this.userData.uViewer_high,r.uniforms.uViewer_low=this.userData.uViewer_low,r.uniforms.gradientRamp=this.userData.gradientRamp,r.vertexShader=this.vertProgram,r.fragmentShader=this.fragProgram},n&&(this.defines={USE_GRADIENT_RAMP:""});for(let r=0;r0}),r}static displayStyleFromNode(e){if(!e)return null;let n=null;if(e.model.raw.displayStyle){let r=e.model.raw.displayStyle.lineweight||0;const i=e.model.raw.displayStyle.units;r=i?r*Os(i):0,r=r<.001?0:r,n={id:e.model.raw.displayStyle.id,color:e.model.raw.displayStyle.diffuse||e.model.raw.displayStyle.color,lineWeight:r}}else e.model.raw.renderMaterial&&(n={id:e.model.raw.renderMaterial.id,color:e.model.raw.renderMaterial.diffuse,lineWeight:0});return n}static fastCopy(e,n){n.fastCopy(e,n)}static isTransparent(e){return e.transparent===!0&&e.opacity<1}static isOpaque(e){return e.transparent===!1||e.transparent===!0&&e.opacity>=1}async createDefaultMeshMaterials(){this.meshHighlightMaterial=new mn({color:294651,emissive:0,roughness:1,metalness:0,side:rn},["USE_RTE"]),this.meshHighlightMaterial.clipShadows=!0,this.meshHighlightMaterial.stencilWrite=!0,this.meshHighlightMaterial.stencilWriteMask=255,this.meshHighlightMaterial.stencilRef=0,this.meshHighlightMaterial.stencilFunc=c6,this.meshHighlightMaterial.stencilZFail=zc,this.meshHighlightMaterial.stencilZPass=zc,this.meshHighlightMaterial.stencilFail=zc,this.meshTransparentHighlightMaterial=new mn({color:294651,emissive:0,roughness:1,metalness:0,side:rn,transparent:!0,opacity:.5},["USE_RTE"]),this.meshTransparentHighlightMaterial.clipShadows=!0,this.meshTransparentHighlightMaterial.stencilWrite=!0,this.meshTransparentHighlightMaterial.stencilWriteMask=255,this.meshTransparentHighlightMaterial.stencilRef=0,this.meshTransparentHighlightMaterial.stencilFunc=c6,this.meshTransparentHighlightMaterial.stencilZFail=zc,this.meshTransparentHighlightMaterial.stencilZPass=zc,this.meshTransparentHighlightMaterial.stencilFail=zc,this.meshGhostMaterial=new bx({color:16777215,side:Ki,transparent:!0,opacity:.1},["USE_RTE"]),this.meshGhostMaterial.depthWrite=!1,this.meshGhostMaterial.alphaTest=1,this.meshGradientMaterial=new gE({side:rn,transparent:!1,opacity:1},["USE_RTE"]),this.meshGradientMaterial.setGradientTexture(await Gl.getTexture(bE)),this.meshGradientMaterial.clipShadows=!0,this.meshTransparentGradientMaterial=new gE({side:rn,transparent:!0,opacity:.5},["USE_RTE"]),this.meshTransparentGradientMaterial.setGradientTexture(await Gl.getTexture(bE)),this.meshTransparentGradientMaterial.clipShadows=!0,this.meshColoredMaterial=new gE({side:rn,transparent:!1,wireframe:!1},["USE_RTE"]),this.meshColoredMaterial.clipShadows=!0,this.meshTransparentColoredMaterial=new gE({side:rn,transparent:!0,opacity:.5},["USE_RTE"]),this.meshHiddenMaterial=new mn({side:rn,transparent:!1,opacity:1,wireframe:!1},["USE_RTE"]),this.meshHiddenMaterial.visible=!1,this.meshOverlayMaterial=new mn({color:314363,emissive:0,roughness:1,metalness:0,side:rn},["USE_RTE"]),this.meshOverlayMaterial.clipShadows=!0,this.meshTransparentOverlayMaterial=new mn({color:314363,emissive:0,roughness:1,metalness:0,side:rn,transparent:!0,opacity:.5},["USE_RTE"]),this.meshTransparentHighlightMaterial.color.convertSRGBToLinear(),this.meshHighlightMaterial.color.convertSRGBToLinear(),this.meshOverlayMaterial.color.convertSRGBToLinear(),this.meshTransparentOverlayMaterial.color.convertSRGBToLinear()}async createLineDefaultMaterials(){this.lineHighlightMaterial=new Qr({color:294651,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe},["USE_RTE"]),this.lineHighlightMaterial.color=new tt(294651),this.lineHighlightMaterial.linewidth=1,this.lineHighlightMaterial.worldUnits=!1,this.lineHighlightMaterial.vertexColors=!0,this.lineHighlightMaterial.pixelThreshold=.5,this.lineHighlightMaterial.resolution=new Oe,this.lineGhostMaterial=new Qr({color:16777215,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe},["USE_RTE"]),this.lineGhostMaterial.color=new tt(16777215),this.lineGhostMaterial.linewidth=1,this.lineGhostMaterial.worldUnits=!0,this.lineGhostMaterial.vertexColors=!0,this.lineGhostMaterial.pixelThreshold=.5,this.lineGhostMaterial.resolution=new Oe,this.lineColoredMaterial=new Qr({color:16777215,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe},["USE_RTE"]),this.lineColoredMaterial.color=new tt(16777215),this.lineColoredMaterial.linewidth=1,this.lineColoredMaterial.worldUnits=!1,this.lineColoredMaterial.vertexColors=!0,this.lineColoredMaterial.pixelThreshold=.5,this.lineColoredMaterial.resolution=new Oe,this.lineHiddenMaterial=new Qr({color:16777215,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe},["USE_RTE"]),this.lineHiddenMaterial.color=new tt(16711680),this.lineHiddenMaterial.linewidth=1,this.lineHiddenMaterial.worldUnits=!1,this.lineHiddenMaterial.vertexColors=!0,this.lineHiddenMaterial.pixelThreshold=.5,this.lineHiddenMaterial.resolution=new Oe,this.lineHiddenMaterial.visible=!1,this.lineOverlayMaterial=new Qr({color:314363,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe},["USE_RTE"]),this.lineHighlightMaterial.color=new tt(314363),this.lineHighlightMaterial.linewidth=1,this.lineHighlightMaterial.worldUnits=!1,this.lineHighlightMaterial.vertexColors=!0,this.lineHighlightMaterial.pixelThreshold=.5,this.lineHighlightMaterial.resolution=new Oe,this.lineHighlightMaterial.color.convertSRGBToLinear(),this.lineOverlayMaterial.color.convertSRGBToLinear()}async createDefaultPointMaterials(){this.pointCloudHighlightMaterial=new tr({color:294651,vertexColors:!0,size:2,sizeAttenuation:!1},["USE_RTE"]),this.pointHighlightMaterial=new tr({color:294651,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.pointGhostMaterial=new tr({color:16777215,vertexColors:!1,size:2,opacity:.01,sizeAttenuation:!1},["USE_RTE"]),this.pointCloudOverlayMaterial=new tr({color:314363,vertexColors:!0,size:2,sizeAttenuation:!1},["USE_RTE"]),this.pointOverlayMaterial=new tr({color:314363,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.pointCloudColouredMaterial=new vs({color:16777215,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.pointCloudGradientMaterial=new vs({color:16777215,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.pointCloudGradientMaterial.setGradientTexture(await Gl.getTexture(bE)),this.pointCloudHighlightMaterial.color.convertSRGBToLinear(),this.pointCloudHighlightMaterial.toneMapped=!1,this.pointHighlightMaterial.color.convertSRGBToLinear(),this.pointHighlightMaterial.toneMapped=!1,this.pointOverlayMaterial.color.convertSRGBToLinear(),this.pointOverlayMaterial.toneMapped=!1,this.pointCloudOverlayMaterial.color.convertSRGBToLinear(),this.pointCloudOverlayMaterial.toneMapped=!1,this.pointGhostMaterial.toneMapped=!1}async createDefaultTextMaterials(){this.textHighlightMaterial=new ts({color:294651,opacity:1,side:rn},["USE_RTE"]),this.textHighlightMaterial.transparent=this.textHighlightMaterial.opacity<1,this.textHighlightMaterial.depthWrite=!this.textHighlightMaterial.transparent,this.textHighlightMaterial.toneMapped=!1,this.textHighlightMaterial.color.convertSRGBToLinear(),this.textHighlightMaterial=this.textHighlightMaterial.getDerivedMaterial(),this.textGhostMaterial=new ts({color:16777215,opacity:.1,side:rn},["USE_RTE"]),this.textGhostMaterial.transparent=this.textGhostMaterial.opacity<1,this.textGhostMaterial.depthWrite=!this.textGhostMaterial.transparent,this.textGhostMaterial.toneMapped=!1,this.textGhostMaterial.color.convertSRGBToLinear(),this.textGhostMaterial=this.textGhostMaterial.getDerivedMaterial(),this.textColoredMaterial=new ts({color:16777215,opacity:1,side:rn},["USE_RTE"]),this.textColoredMaterial.transparent=this.textColoredMaterial.opacity<1,this.textColoredMaterial.depthWrite=!this.textColoredMaterial.transparent,this.textColoredMaterial.toneMapped=!1,this.textColoredMaterial.color.convertSRGBToLinear(),this.textColoredMaterial=this.textColoredMaterial.getDerivedMaterial(),this.textOverlayMaterial=new ts({color:314363,opacity:1,side:rn},["USE_RTE"]),this.textOverlayMaterial.transparent=this.textOverlayMaterial.opacity<1,this.textOverlayMaterial.depthWrite=!this.textOverlayMaterial.transparent,this.textOverlayMaterial.toneMapped=!1,this.textOverlayMaterial.color.convertSRGBToLinear(),this.textOverlayMaterial=this.textOverlayMaterial.getDerivedMaterial(),this.textHiddenMaterial=new ts({color:16777215,opacity:1,side:rn},["USE_RTE"]),this.textHiddenMaterial.visible=!1,this.textHiddenMaterial.toneMapped=!1,this.textHiddenMaterial.color.convertSRGBToLinear(),this.textHiddenMaterial=this.textHiddenMaterial.getDerivedMaterial()}async createDefaultNullMaterials(){this.materialMap[Is.NullRenderMaterialHash]=new mn({color:8355711,emissive:0,roughness:1,metalness:0,side:rn},["USE_RTE"]),this.materialMap[Is.NullRenderMaterialHash].color.convertSRGBToLinear(),this.materialMap[Is.NullRenderMaterialVertexColorsHash]=new mn({color:16777215,emissive:0,roughness:1,metalness:0,side:rn,vertexColors:!0},["USE_RTE"]),this.materialMap[Is.NullRenderMaterialVertexColorsHash].color.convertSRGBToLinear();const e=Is.NullDisplayStyleHash;this.materialMap[e]=new Qr({color:8355711,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe},["USE_RTE"]),this.materialMap[e].color=new tt(8355711),this.materialMap[e].color.convertSRGBToLinear(),this.materialMap[e].linewidth=1,this.materialMap[e].worldUnits=!1,this.materialMap[e].vertexColors=!0,this.materialMap[e].pixelThreshold=.5,this.materialMap[e].resolution=new Oe,this.materialMap[Is.NullPointMaterialHash]=new tr({color:8355711,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.materialMap[Is.NullPointMaterialHash].color.convertSRGBToLinear(),this.materialMap[Is.NullPointCloudVertexColorsMaterialHash]=new tr({color:16777215,vertexColors:!0,size:2,sizeAttenuation:!1},["USE_RTE"]),this.materialMap[Is.NullPointCloudMaterialHash]=new tr({color:16777215,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"])}async createDefaultMaterials(){await this.createDefaultMeshMaterials(),await this.createLineDefaultMaterials(),await this.createDefaultPointMaterials(),await this.createDefaultTextMaterials(),await this.createDefaultNullMaterials(),this.defaultGradientTextureData=await Gl.getTextureData(bE)}makeMeshMaterial(e){const n=new mn({color:e.color,emissive:0,roughness:e.roughness,metalness:e.metalness,opacity:e.opacity,side:rn},["USE_RTE"]);return n.vertexColors=e.vertexColors,n.transparent=n.opacity<1,n.depthWrite=!n.transparent,n.clipShadows=!0,n.color.convertSRGBToLinear(),n}makeLineMaterial(e){const n=new Qr({color:e.color,linewidth:e.lineWeight>0?e.lineWeight:1,worldUnits:e.lineWeight>0,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe},["USE_RTE"]);return n.color=new tt(e.color),n.color.convertSRGBToLinear(),n.linewidth=e.lineWeight>0?e.lineWeight:1,n.worldUnits=e.lineWeight>0,n.vertexColors=!0,n.pixelThreshold=.5,n.resolution=new Oe,n}makePointMaterial(e){const n=e.color===-16777216,r=e.vertexColors&&n?16777215:e.color,i=new tr({color:r,opacity:e.opacity,vertexColors:e.vertexColors,size:2,sizeAttenuation:!1},["USE_RTE"]);return i.transparent=i.opacity<1,i.depthWrite=!i.transparent,i.toneMapped=!1,i.color.convertSRGBToLinear(),i}makeTextMaterial(e){const n=new ts({color:e.color,opacity:1,side:rn},["USE_RTE"]);return n.transparent=n.opacity<1,n.depthWrite=!n.transparent,n.toneMapped=!1,n.color.convertSRGBToLinear(),n.getDerivedMaterial()}getMaterial(e,n,r){let i;switch(r){case st.MESH:i=this.getMeshMaterial(e,n);break;case st.LINE:i=this.getLineMaterial(e,n);break;case st.POINT:i=this.getPointMaterial(e,n);break;case st.POINT_CLOUD:i=this.getPointCloudMaterial(e,n);break;case st.TEXT:i=this.getTextMaterial(e,n)}return i.clippingPlanes=[],i}getMeshMaterial(e,n){return n?this.makeMeshMaterial(n):this.materialMap[e]?this.materialMap[e].clone():void Zt.warn(`Could not create mesh material hash ${e} for `,n)}getLineMaterial(e,n){return this.materialMap[e]?this.materialMap[e]:this.makeLineMaterial(n)}getPointMaterial(e,n){return this.materialMap[e]?this.materialMap[e]:this.makePointMaterial(n)}getPointCloudMaterial(e,n){return this.getPointMaterial(e,n)}getTextMaterial(e,n){return this.makeTextMaterial(n)}getHighlightMaterial(e){switch(e.geometryType){case st.MESH:return e.transparent?this.meshTransparentHighlightMaterial:this.meshHighlightMaterial;case st.LINE:return this.lineHighlightMaterial;case st.POINT:return this.pointHighlightMaterial;case st.POINT_CLOUD:return this.pointCloudHighlightMaterial;case st.TEXT:return this.textHighlightMaterial}}getGhostMaterial(e){switch(e.geometryType){case st.MESH:return this.meshGhostMaterial;case st.LINE:return this.lineGhostMaterial;case st.POINT:case st.POINT_CLOUD:return this.pointGhostMaterial;case st.TEXT:return this.textGhostMaterial}}getGradientMaterial(e){switch(e.geometryType){case st.MESH:return e.transparent?this.meshTransparentGradientMaterial:this.meshGradientMaterial;case st.LINE:return this.lineColoredMaterial;case st.POINT:case st.POINT_CLOUD:return this.pointCloudGradientMaterial;case st.TEXT:return this.textColoredMaterial}}getColoredMaterial(e){switch(e.geometryType){case st.MESH:return e.transparent?this.meshTransparentColoredMaterial:this.meshColoredMaterial;case st.LINE:return this.lineColoredMaterial;case st.POINT:case st.POINT_CLOUD:return this.pointCloudColouredMaterial;case st.TEXT:return this.textColoredMaterial}}getOverlayMaterial(e){switch(e.geometryType){case st.MESH:return e.transparent?this.meshTransparentOverlayMaterial:this.meshOverlayMaterial;case st.LINE:return this.lineOverlayMaterial;case st.POINT:return this.pointOverlayMaterial;case st.POINT_CLOUD:return this.pointCloudOverlayMaterial;case st.TEXT:return this.textOverlayMaterial}}getHiddenMaterial(e){switch(e.geometryType){case st.MESH:return this.meshHiddenMaterial;case st.LINE:return this.lineHiddenMaterial;case st.POINT:case st.POINT_CLOUD:return this.meshHiddenMaterial;case st.TEXT:return this.textHiddenMaterial}}getDebugBatchMaterial(e){const n=new tt(fp.randInt(0,16777215));switch(n.convertSRGBToLinear(),e.geometryType){case st.MESH:return new mn({color:n,emissive:0,roughness:1,metalness:0,opacity:1,side:rn},["USE_RTE"]);case st.LINE:{const r=new Qr({color:n,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new Oe});return r.color=n,r.linewidth=1,r.worldUnits=!1,r.vertexColors=!0,r.pixelThreshold=.5,r.resolution=new Oe,r}case st.POINT:return new tr({color:n,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]);case st.POINT_CLOUD:return new tr({color:n,vertexColors:!0,size:2,sizeAttenuation:!1},["USE_RTE"]);case st.TEXT:{const r=new ts({color:n,opacity:1,side:rn},["USE_RTE"]);return r.toneMapped=!1,r.color.convertSRGBToLinear(),r.getDerivedMaterial()}}}getFilterMaterial(e,n){let r;switch(n){case mi.SELECT:r=this.getHighlightMaterial(e);break;case mi.GHOST:r=this.getGhostMaterial(e);break;case mi.GRADIENT:r=this.getGradientMaterial(e);break;case mi.COLORED:r=this.getColoredMaterial(e);break;case mi.OVERLAY:r=this.getOverlayMaterial(e);break;case mi.HIDDEN:r=this.getHiddenMaterial(e)}return r.clippingPlanes=[],r}getFilterMaterialOptions(e){switch(e.filterType){case mi.COLORED:return{rampIndex:e.rampIndex!==void 0?e.rampIndex:void 0,rampIndexColor:e.rampIndexColor,rampTexture:e.rampTexture?e.rampTexture:void 0,rampWidth:e.rampTexture?e.rampTexture.image.width:void 0};case mi.GRADIENT:return{rampIndex:e.rampIndex!==void 0?e.rampIndex:void 0,rampIndexColor:e.rampIndexColor!==void 0?e.rampIndexColor:new tt().setRGB(this.defaultGradientTextureData.data[4*Math.floor(e.rampIndex*(this.defaultGradientTextureData.width-1))]/255,this.defaultGradientTextureData.data[4*Math.floor(e.rampIndex*(this.defaultGradientTextureData.width-1))+1]/255,this.defaultGradientTextureData.data[4*Math.floor(e.rampIndex*(this.defaultGradientTextureData.width-1))+2]/255).convertSRGBToLinear(),rampTexture:e.rampTexture?e.rampTexture:this.meshGradientMaterial.userData.gradientRamp.value,rampWidth:e.rampTexture?e.rampTexture.image.width:this.meshGradientMaterial.userData.gradientRamp.value.image.width}}}purge(){}}Ic.UNIFORM_VECTORS_USED=33;const Z$=new Be,Ug=new Ko,sU=new so,aU=new U,Rd=new U,Vd=new U,zd=new U,oU=new U,lU=new U,uU=new U,yE=new U,SE=new U,xE=new U,TE=new Oe,wE=new Oe,EE=new Oe,cU=new U,ME=new U,dU=new Ko,J$=new Be;class N0 extends ut{get BVH(){return this.bvh}get batchObjects(){return this._batchObjects}constructor(e,n){super(e,n),this.bvh=null,this.batchMaterial=null,this.materialCache={},this.materialStack=[],this.transformsBuffer=null,this.transformsDirty=!0,this.transformsTextureUniform=null,this.transformsArrayUniforms=null,this.debugBatchBox=!1,this.batchMaterial=n}setBatchObjects(e,n){this._batchObjects=e,this.transformStorage=n,this.transformStorage===Hd.VERTEX_TEXTURE?(this.transformsBuffer=new Float32Array(4*this._batchObjects.length*4),this.transformsTextureUniform=new Ac(this.transformsBuffer,this.transformsBuffer.length/4,1,no,na)):this.transformStorage===Hd.UNIFORM_ARRAY&&(this.transformsArrayUniforms=this._batchObjects.map(()=>new Be)),this.updateTransformsUniform()}setOverrideMaterial(e){this.materialStack.push(this.material),this.materialCache[e.id]||(this.materialCache[e.id]=e.clone()),this.materialCache[e.id].copy(e),this.material=this.materialCache[e.id],this.material.needsUpdate=!0}getCachedMaterial(e,n=!1){return this.materialCache[e.id]?n&&Ic.fastCopy(e,this.materialCache[e.id]):this.materialCache[e.id]=e.clone(),this.materialCache[e.id]}restoreMaterial(){this.materialStack.length>0&&(this.material=this.materialStack.pop())}updateMaterialTransformsUniform(e){e.defines.TRANSFORM_STORAGE=this.transformStorage,this.transformStorage===Hd.VERTEX_TEXTURE?(e.userData.tTransforms.value=this.transformsTextureUniform,e.userData.objCount&&(e.userData.objCount.value=this._batchObjects.length)):this.transformStorage===Hd.UNIFORM_ARRAY&&(e.defines.OBJ_COUNT&&e.defines.OBJ_COUNT===this._batchObjects.length||(e.defines.OBJ_COUNT=this._batchObjects.length),e.userData.uTransforms.value=this.transformsArrayUniforms),e.needsUpdate=!0}updateTransformsUniform(){this.transformsDirty?(this.transformStorage===Hd.VERTEX_TEXTURE?(this._batchObjects.forEach(e=>{const n=16*e.batchIndex;this.transformsBuffer[n]=e.quaternion.x,this.transformsBuffer[n+1]=e.quaternion.y,this.transformsBuffer[n+2]=e.quaternion.z,this.transformsBuffer[n+3]=e.quaternion.w,this.transformsBuffer[n+4]=e.pivot_Low.x,this.transformsBuffer[n+5]=e.pivot_Low.y,this.transformsBuffer[n+6]=e.pivot_Low.z,this.transformsBuffer[n+7]=e.scale.x,this.transformsBuffer[n+8]=e.pivot_High.x,this.transformsBuffer[n+9]=e.pivot_High.y,this.transformsBuffer[n+10]=e.pivot_High.z,this.transformsBuffer[n+11]=e.scale.y,this.transformsBuffer[n+12]=e.translation.x,this.transformsBuffer[n+13]=e.translation.y,this.transformsBuffer[n+14]=e.translation.z,this.transformsBuffer[n+15]=e.scale.z}),this.transformsTextureUniform.needsUpdate=!0):this._batchObjects.forEach((e,n)=>{this.transformsArrayUniforms[n].set(e.quaternion.x,e.pivot_Low.x,e.pivot_High.x,e.translation.x,e.quaternion.y,e.pivot_Low.y,e.pivot_High.y,e.translation.y,e.quaternion.z,e.pivot_Low.z,e.pivot_High.z,e.translation.z,e.quaternion.w,e.scale.x,e.scale.y,e.scale.z)}),this.bvh&&(this.bvh.refit(),this.bvh.getBoundingBox(this.bvh.bounds),this.geometry.boundingBox.copy(this.bvh.bounds),this.geometry.boundingBox.getBoundingSphere(this.geometry.boundingSphere),!this.boxHelper&&this.debugBatchBox&&(this.boxHelper=new OT(this.bvh.bounds,new tt(16711680)),this.boxHelper.layers.set(kt.PROPS),this.parent.add(this.boxHelper))),this.transformsDirty=!1):this.bvh&&(this.bvh.lastRefitTime=0)}buildBVH(){this.bvh=new Vo(this.batchObjects),this.bvh.tas.refit()}getBatchObjectMaterial(e){const n=e.renderView,r=this.geometry.groups.find(i=>n.batchStart>=i.start&&n.batchStart+n.batchCount<=i.count+i.start);return Array.isArray(this.material)?r?this.material[r.materialIndex]:(Zt.warn(`Could not get material for ${e.renderView.renderData.id}`),null):this.material}convertRaycastIntersect(e,n,r){return e===null?null:(e.point.applyMatrix4(n.matrixWorld),e.distance=e.point.distanceTo(r.ray.origin),e.object=n,e.distancer.far?null:e)}raycast(e,n){if(this.bvh){if(this.batchMaterial===void 0)return;J$.copy(this.matrixWorld).invert(),dU.copy(e.ray).applyMatrix4(J$);const r=this.bvh;if(e.firstHitOnly===!0){const i=this.convertRaycastIntersect(r.raycastFirst(dU,this.batchMaterial),this,e);i&&n.push(i)}else{const i=r.raycast(dU,this.batchMaterial);for(let s=0,a=i.length;sg.far?null:{distance:S,point:ME.clone(),object:m,uv:void 0,uv2:void 0,face:void 0}}(t,e,n,r,Rd,Vd,zd,cU);if(p){l&&(TE.fromBufferAttribute(l,c),wE.fromBufferAttribute(l,d),EE.fromBufferAttribute(l,f),p.uv=Wr.getUV(cU,Rd,Vd,zd,TE,wE,EE,new Oe)),u&&(TE.fromBufferAttribute(u,c),wE.fromBufferAttribute(u,d),EE.fromBufferAttribute(u,f),p.uv2=Wr.getUV(cU,Rd,Vd,zd,TE,wE,EE,new Oe));const m={a:c,b:d,c:f,normal:new U,materialIndex:0};Wr.getNormal(Rd,Vd,zd,m.normal),p.face=m}return p}N0.MeshBatchNumber=0;class Er{get renderView(){return this._renderView}get bvh(){return this._bvh}get batchIndex(){return this._batchIndex}get speckleId(){return this._renderView.renderData.id}constructor(e,n){this.quaternion=new Or,this.pivot_High=new U,this.pivot_Low=new U,this.translation=new U,this.scale=new U(1,1,1),this._renderView=e,this._batchIndex=n,this.transform=new Be().identity(),this.transformInv=new Be().identity(),this._localOrigin=this._renderView.aabb.getCenter(new U),ur.DoubleToHighLowVector(new U(this._localOrigin.x,this._localOrigin.y,this._localOrigin.z),this.pivot_Low,this.pivot_High)}buildBVH(){const e=new Be().makeTranslation(this._localOrigin.x,this._localOrigin.y,this._localOrigin.z);e.invert();const n=this._renderView.renderData.geometry.attributes.INDEX,r=this._renderView.renderData.geometry.attributes.POSITION,i=new Float32Array(r.length),s=new U;for(let a=0;a{n=Math.min(n,i.offset),r=Math.max(r,i.offset)}),this.geometry.setDrawRange(n,r-n+e.find(i=>i.offset===r).count),this.mesh.visible=!0}getVisibleRange(){return this.geometry.groups.length===0?Al:{offset:this.geometry.drawRange.start,count:this.geometry.drawRange.count}}setDrawRanges(...e){e.forEach(l=>{var u;l.material&&(l.material=this.mesh.getCachedMaterial(l.material,(u=l.materialOptions)===null||u===void 0?void 0:u.needsCopy))});const n=e.map(l=>l.material),r=[...Array.from(new Set(n.map(l=>l)))];Array.isArray(this.mesh.material)||(this.mesh.material=[this.mesh.material]);for(let l=0;ll.offset-u.offset),s=[];let a=1/0,o=0;for(let l=0;lo.material),r=[...Array.from(new Set(n.map(o=>o)))];Array.isArray(this.mesh.material)||(this.mesh.material=[this.mesh.material]);for(let o=0;oo.offset-l.offset);for(let o=0;o(o.indexOf(l.materialIndex)===-1&&o.push(l.materialIndex),o),s);const a=[];for(let o=0;ol.materialIndex===s[o]));this.geometry.groups=[];for(let o=0;os.id===e))===null||n===void 0?void 0:n.materialIndex;i&&(this.geometry.groups=this.geometry.groups.filter(s=>!(s.id&&s.id===e)),this.mesh.material.splice(i,1),i!==r-1&&this.geometry.groups.forEach(s=>{s.materialIndex>i&&s.materialIndex--}))}getDrawRangeCollision(e){if(this.geometry.groups.length>0){for(let n=0;nh.start===0&&h.count===this.getCount()&&h.materialIndex===0);e!==-1&&this.geometry.groups.splice(e,1);const n=this.geometry.groups.sort((h,p)=>h.start-p.start).slice(),r=n.map(h=>h.start);for(let h=0;h{const m=this.mesh.material[h.materialIndex],v=this.mesh.material[p.materialIndex],g=+v.visible-+m.visible,b=+m.transparent-+v.transparent;return g!==0?g:b});const i=[];n.reduce((h,p)=>(h.indexOf(p.materialIndex)===-1&&h.push(p.materialIndex),h),i);const s=[];for(let h=0;hp.materialIndex===i[h]));const a=this.getCurrentIndexBuffer(),o=this.getNextIndexBuffer(),l=[],u={};let c=0;for(let h=0;hthis.mesh.material[h.materialIndex].visible===!1);f&&this.setVisibleRange({offset:0,count:f.start})}createRenderViewMapping(){const e={};for(let n=0;nd.renderData.geometry.attributes.INDEX).length,n=this.renderViews.flatMap(d=>d.renderData.geometry.attributes.POSITION).length,r=this.renderViews[0].renderData.geometry.attributes.COLOR!==void 0,i=new Uint32Array(e),s=new Float64Array(n),a=new Float32Array(r?n:0);a.fill(1);const o=new Float32Array(n/3);let l=0,u=0;const c=[];for(let d=0;dp+l/3),u),s.set(f.attributes.POSITION,l),f.attributes.COLOR&&a.set(f.attributes.COLOR,l),o.fill(d,l/3,l/3+f.attributes.POSITION.length/3),this.renderViews[d].setBatchData(this.id,u,f.attributes.INDEX.length,l/3,l/3+f.attributes.POSITION.length/3);const h=new Er(this.renderViews[d],d);h.buildBVH(),c.push(h),l+=f.attributes.POSITION.length,u+=f.attributes.INDEX.length}this.makeMeshGeometry(i,s,o,r?a:null),this.mesh=new N0(this.geometry,this.batchMaterial),this.mesh.setBatchObjects(c,this.transformStorage),this.mesh.buildBVH(),this.mesh.uuid=this.id,this.mesh.layers.set(kt.STREAM_CONTENT_MESH),this.mesh.frustumCulled=!1,this.mesh.material=[this.batchMaterial],this.mesh.geometry.addGroup(0,this.getCount(),0),Sn.keepGeometryData||c.forEach(d=>{d.renderView.disposeGeometry()})}getRenderView(e){return console.warn("Deprecated! Do not call this anymore"),null}getMaterialAtIndex(e){return console.warn("Deprecated! Do not call this anymore"),null}makeMeshGeometry(e,n,r,i){this.geometry=new Lt,n.length>=65535||e.length>=65535?(this.indexBuffer0=new Gv(e,1),this.indexBuffer1=new Gv(new Uint32Array(e.length),1)):(this.indexBuffer0=new Av(e,1),this.indexBuffer1=new Av(new Uint16Array(e.length),1)),this.geometry.setIndex(this.indexBuffer0),n&&this.geometry.setAttribute("position",new xt(n,3)),r&&this.geometry.setAttribute("objIndex",new xt(r,1)),i&&this.geometry.setAttribute("color",new xt(i,3));const s=new Float32Array(n.length/3);return this.gradientIndexBuffer=new xt(s,1),this.gradientIndexBuffer.setUsage(Bl),this.geometry.setAttribute("gradientIndex",this.gradientIndexBuffer),this.updateGradientIndexBufferData(0,s.length,0),this.updateGradientIndexBuffer(),ur.computeVertexNormals(this.geometry,n),this.geometry.computeBoundingSphere(),this.geometry.computeBoundingBox(),ur.updateRTEGeometry(this.geometry,n),this.geometry}updateGradientIndexBufferData(e,n,r){const i=this.geometry.index.array,s=this.gradientIndexBuffer.array;let a=1/0,o=0;for(let l=e;lr.id===e);n.length&&(this.setDrawRanges(...n),this.insertedRanges=this.insertedRanges.filter(r=>!n.includes(r)))}autoFillDrawRanges(){}resetDrawRanges(){this.setDrawRanges({offset:0,count:1/0,material:this.batchMaterial}),this.mesh.material=this.batchMaterial,this.mesh.visible=!0,this.batchMaterial.transparent=!1}buildBatch(){let e=0;this.renderViews.forEach(i=>e+=i.needsSegmentConversion?2*(i.renderData.geometry.attributes.POSITION.length-3):i.renderData.geometry.attributes.POSITION.length);const n=new Float64Array(e);let r=0;for(let i=0;i=this.renderViews[n].batchStart&&e{n=Math.min(n,i.offset),r=Math.max(r,i.offset)}),this.geometry.setDrawRange(n,r-n+e.find(i=>i.offset===r).count),this.mesh.visible=!0}getVisibleRange(){return Al}setDrawRanges(...e){const n=e.map(l=>l.material),r=[...Array.from(new Set(n.map(l=>l)))];Array.isArray(this.mesh.material)?this.mesh.material=this.mesh.material.concat(r):this.mesh.material=[this.mesh.material,...r];const i=e.sort((l,u)=>l.offset-u.offset),s=[];let a=1/0,o=0;for(let l=0;ls.material),r=[...Array.from(new Set(n.map(s=>s)))];Array.isArray(this.mesh.material)||(this.mesh.material=[this.mesh.material]);for(let s=0;ss.offset-a.offset);for(let s=0;s!(n.id&&n.id===e))}getDrawRangeCollision(e){if(this.geometry.groups.length>0){for(let n=0;n1&&this.geometry.groups[0].start===0&&this.geometry.groups[0].count===this.getCount()&&this.geometry.groups.shift();const e=this.geometry.groups.sort((r,i)=>r.start-i.start).slice();for(let r=0;r0&&this.geometry.addGroup(0,e[r].start,0),e.length===1&&e[r].start+e[r].countr.start-i.start);let n=0;this.geometry.groups.forEach(r=>{n+=r.count}),n(r.indexOf(i.materialIndex)===-1&&r.push(i.materialIndex),r),e);const n=[];for(let r=0;ri.materialIndex===e[r]));this.geometry.groups=[];for(let r=0;rs.renderData.geometry.attributes.POSITION).length,n=new Float64Array(e),r=new Float32Array(e).fill(1);let i=0;for(let s=0;s=this.renderViews[n].batchStart&&e=this.renderViews[n].batchStart&&er.batchStart>=s.start&&r.batchStart+r.batchCount<=s.count+s.start);return Array.isArray(this.mesh.material)?i?this.mesh.material[i.materialIndex]:(Zt.warn("Malformed material index!"),null):this.mesh.material}}makePointGeometry(e,n){this.geometry=new Lt,this.geometry.setAttribute("position",new xt(e,3)),this.geometry.setAttribute("color",new xt(n,3));const r=new Float32Array(e.length/3);return this.gradientIndexBuffer=new xt(r,1),this.gradientIndexBuffer.setUsage(Bl),this.geometry.setAttribute("gradientIndex",this.gradientIndexBuffer),this.updateGradientIndexBufferData(0,r.length,0),this.updateGradientIndexBuffer(),this.geometry.computeVertexNormals(),this.geometry.computeBoundingSphere(),this.geometry.computeBoundingBox(),ur.updateRTEGeometry(this.geometry,e),this.geometry}updateGradientIndexBufferData(e,n,r){return this.gradientIndexBuffer.array.fill(r,e,n),this.gradientIndexBuffer.updateRange={offset:e,count:n-e},this.gradientIndexBuffer.needsUpdate=!0,this.geometry.attributes.gradientIndex.needsUpdate=!0,{minIndex:e,maxIndex:n}}updateGradientIndexBuffer(e,n){this.gradientIndexBuffer.updateRange={offset:e!==void 0?e:0,count:e!==void 0&&n!==void 0?n-e+1:-1},this.gradientIndexBuffer.needsUpdate=!0,this.geometry.attributes.gradientIndex.needsUpdate=!0}purge(){this.renderViews.length=0,this.geometry.dispose(),this.batchMaterial.dispose(),this.mesh=null}}class vW{constructor(){this.boxes=new Array,this.worldBox=new Jt,this._worldOrigin=new U}get worldSize(){this.worldBox.getCenter(this._worldOrigin);const e=new U().subVectors(this.worldBox.max,this.worldBox.min);return{x:e.x,y:e.y,z:e.z}}get worldOrigin(){return this._worldOrigin}expandWorld(e){this.boxes.push(e),this.updateWorld()}reduceWorld(e){this.boxes.splice(this.boxes.indexOf(e),1),this.updateWorld()}updateWorld(){this.worldBox.makeEmpty();for(let e=0;e{let s=0;return async()=>{Date.now()-s>=r&&(s=Date.now(),await new Promise(a=>setTimeout(a,i)))}})(e,n)}}const k1t={backgroundColor:null,backgroundCornerRadius:1,backgroundPixelHeight:50,textColor:new tt(16777215),billboard:!1};class T4 extends ut{static SpeckleTextParamsFromMetadata(e){return{textValue:e.value?e.value:"N/A",height:e.height}}get textMesh(){return this._text}get backgroundMesh(){return this._background}set style(e){Object.assign(this._style,e),this.updateStyle()}constructor(e){super(),this._text=null,this._background=null,this._backgroundSize=new U,this._style=Object.assign({},k1t),this._resolution=new Oe,this.defaultMaterial=new fo({color:16777215,side:rn,transparent:!0}),this.getFlatRaycastMesh=()=>{const n=new ut(new ao(1,1),this.defaultMaterial);return this.getFlatRaycastMesh=()=>n,n},this.getCurvedRaycastMesh=()=>{const n=new ut(new ao(1,1,32,1),this.defaultMaterial);return this.getCurvedRaycastMesh=()=>n,n},this.uuid=e,this._text=new m0e,this._text.depthOffset=-.1,this._text.raycast=()=>{},this.add(this._text),this.onBeforeRender=n=>{n.getDrawingBufferSize(this._resolution)}}async update(e,n){return new Promise(r=>{e.textValue&&(this._text.text=e.textValue),e.richTextValue,e.height&&(this._text.fontSize=e.height),this._text.anchorX=e.anchorX,this._text.anchorY=e.anchorY,this._text._needsSync?this._text.sync(()=>{r(),n&&n()}):(r(),n&&n())})}setTransform(e,n,r){e&&(this._style.billboard&&(this.textMesh.material.userData.billboardPos.value.copy(e),this._background.material.userData.billboardPos.value.copy(e)),this.position.copy(e)),n&&this.quaternion.copy(n),r&&this.scale.copy(r)}raycast(e,n){const{textRenderInfo:r,curveRadius:i}=this.textMesh;if(r){const s=r.blockBounds,a=i?this.getCurvedRaycastMesh():this.getFlatRaycastMesh(),o=a.geometry,{position:l,uv:u}=o.attributes;for(let d=0;d.1&&(i=this.RectangleRounded(1.2*n.x,1.2*n.y,.5,5),i.computeBoundingBox(),this._backgroundSize.copy(n),this._background&&(this._background.geometry=i)),this._background===null){const a=new Mr({},["BILLBOARD_FIXED"]);a.toneMapped=!1,a.side=rn,a.depthTest=!1,this._background=new ut(i,a),this._background.layers.set(kt.MEASUREMENTS),this._background.frustumCulled=!1,this._background.renderOrder=1,this.add(this._background)}const s=new tt(this._style.backgroundColor).convertSRGBToLinear();this._background.material.color=s,this._background.material.billboardPixelHeight=this._style.backgroundPixelHeight*window.devicePixelRatio}RectangleRounded(e,n,r,i){const s=2*Math.PI,a=4*(i+1),o=[],l=[],u=[];let c,d,f,h,p;for(let g=1;gr.id===e);n.length&&(this.setDrawRanges(...n),this.insertedRanges=this.insertedRanges.filter(r=>!n.includes(r)))}autoFillDrawRanges(){}resetDrawRanges(){this.mesh.textMesh.material=this.batchMaterial,this.mesh.textMesh.visible=!0}async buildBatch(){this.mesh=new T4(this.id),this.mesh.matrixAutoUpdate=!1,await this.mesh.update(T4.SpeckleTextParamsFromMetadata(this.renderViews[0].renderData.geometry.metaData)),this.mesh.matrix.copy(this.renderViews[0].renderData.geometry.bakeTransform),this.renderViews[0].setBatchData(this.id,0,this.mesh.textMesh.geometry.index.length/3),this.mesh.textMesh.material=this.batchMaterial,this.mesh.layers.set(kt.STREAM_CONTENT_TEXT),this.mesh.textMesh.layers.set(kt.STREAM_CONTENT_TEXT)}getRenderView(e){return this.renderViews[0]}getMaterialAtIndex(e){return this.batchMaterial}purge(){this.renderViews.length=0,this.batchMaterial.dispose(),this.mesh.geometry.dispose(),this.mesh=null}}var Hd;(function(t){t[t.VERTEX_TEXTURE=0]="VERTEX_TEXTURE",t[t.UNIFORM_ARRAY=1]="UNIFORM_ARRAY"})(Hd||(Hd={}));class I1t{constructor(e,n){this.maxHardwareUniformCount=0,this.floatTextures=!1,this.maxBatchObjects=0,this.maxBatchVertices=5e5,this.batches={},this.maxHardwareUniformCount=e,this.maxBatchObjects=Math.floor((this.maxHardwareUniformCount-Ic.UNIFORM_VECTORS_USED)/4),this.floatTextures=n,this.materials=new Ic,this.materials.createDefaultMaterials()}async makeBatches(e,n,r){const i=e.getRenderableRenderViews(...n).sort((a,o)=>a.renderMaterialHash===0?-1:o.renderMaterialHash===0?1:a.renderMaterialHash-o.renderMaterialHash),s=[...Array.from(new Set(i.map(a=>a.renderMaterialHash)))];Zt.warn(`Batch count: ${s}`);for(let a=0;ac.renderMaterialHash===s[a]);l=l.filter(c=>{const d=c.validGeometry;return d&&(o+=c.renderData.geometry.attributes.POSITION.length/3),d||c.hasMetadata});const u=this.splitBatch(l,o);for(let c=0;cf.renderMaterialHash===0?-1:h.renderMaterialHash===0?1:f.renderMaterialHash-h.renderMaterialHash),o=[...Array.from(new Set(a.map(f=>f.renderMaterialHash)))];let l=Number.MAX_SAFE_INTEGER,u=-1,c=0,d=0;for(let f=0;fv.renderMaterialHash===o[f]),p=0;if(h=h.filter(v=>{const g=v.validGeometry;return g&&(p+=v.renderData.geometry.attributes.POSITION.length/3),g||v.hasMetadata}),h.length===0)continue;const m=this.splitBatch(h,p);for(let v=0;v0){let i=0,s=0;r.push([]);for(let a=0;a=this.maxBatchVertices&&e[a+1]&&(r.push([]),s++,i=0)}else r.push(e);if(e[0].geometryType===st.MESH){const i=[];for(let s=0;s0&&i.push(r[s].slice(u,u+l))}return i}return r}async buildBatch(e,n,r,i){const s=n.filter(d=>d.renderMaterialHash===r);if(!s.length)return Zt.warn("All renderviews have invalid geometries. Skipping batch!",n),null;const a=i!==void 0?i:s[0].geometryType;let o=null;a===st.MESH?o=n[0].renderData.renderMaterial:a===st.LINE?o=n[0].renderData.displayStyle:a===st.POINT||a===st.POINT_CLOUD?o=n[0].renderData.renderMaterial:a===st.TEXT&&(o=n[0].renderData.displayStyle);const l=this.materials.getMaterial(r,o,a),u=A8();let c=null;switch(a){case st.MESH:c=new V1t(u,e.id,s,this.floatTextures?Hd.VERTEX_TEXTURE:Hd.UNIFORM_ARRAY);break;case st.LINE:c=new L6(u,e.id,s);break;case st.POINT:case st.POINT_CLOUD:c=new z1t(u,e.id,s);break;case st.TEXT:c=new O1t(u,e.id,s)}return c.setBatchMaterial(l),await c.buildBatch(),c}update(e){for(const n in this.batches)this.batches[n].onUpdate(e)}render(e){for(const n in this.batches)this.batches[n].onRender(e)}saveVisiblity(){const e={};for(const n in this.batches){const r=this.batches[n];e[n]=r.getVisibleRange()}return e}applyVisibility(e){for(const n in this.batches){const r=this.batches[n],i=e[n];i?r.setVisibleRange(i):r.setVisibleRange(N6)}}getTransparent(){const e={};for(const n in this.batches){const r=this.batches[n],i=r.renderObject;if(i.geometry.groups.length===0)Ic.isTransparent(i.material)&&(e[n]=Al);else{const s=i.geometry.groups.find(o=>Ic.isTransparent(i.material[o.materialIndex])),a=i.geometry.groups.find(o=>i.material[o.materialIndex].visible===!1);s&&(e[n]={offset:s.start,count:a!==void 0?a.start:r.getCount()-s.start})}}return e}getStencil(){const e={};for(const n in this.batches){const r=this.batches[n].renderObject;if(r.geometry.groups.length===0)r.material.stencilWrite===!0&&(e[n]=Al);else{const i=r.geometry.groups.find(s=>r.material[s.materialIndex].stencilWrite===!0);i&&(e[n]={offset:i.start,count:i.count})}}return e}getOpaque(){const e={};for(const n in this.batches){const r=this.batches[n],i=r.renderObject;if(i.geometry.groups.length===0)Ic.isOpaque(i.material)&&(e[n]=Al);else{const s=i.geometry.groups.find(a=>Ic.isTransparent(i.material[a.materialIndex])||i.material[a.materialIndex].visible===!1);e[n]={offset:0,count:s!==void 0?s.start:r.getCount()}}}return e}overrideMaterial(e,n){for(const r in e)this.batches[r].geometryType===st.MESH&&this.batches[r].renderObject.setOverrideMaterial(n)}restoreMaterial(e){for(const n in e)this.batches[n].geometryType===st.MESH&&this.batches[n].renderObject.restoreMaterial()}getByMaterialUUID(e){const n={};for(const r in this.batches){const i=this.batches[r],s=i.renderObject;if(s.geometry.groups.length===0)s.material.uuid===e&&(n[r]=Al);else{const a=s.geometry.groups.find(o=>s.material[o.materialIndex].uuid===e);n[r]={offset:0,count:a!==void 0?a.start:i.getCount()}}}return n}purgeBatches(e){for(const n in this.batches)this.batches[n].subtreeId===e&&(this.batches[n].purge(),delete this.batches[n])}getBatches(e,n){return Object.values(this.batches).filter(r=>{const i=e===void 0||r.subtreeId===e,s=n===void 0||r.geometryType===n;return i&&s})}getBatch(e){return Object.values(this.batches).find(n=>n.renderViews.includes(e))}getRenderView(e,n){return this.batches[e]?this.batches[e].getRenderView(n):(Zt.error("Invalid batch id!"),null)}getRenderViewMaterial(e,n){return this.batches[e]?this.batches[e].getMaterialAtIndex(n):(Zt.error("Invalid batch id!"),null)}resetBatchesDrawRanges(){for(const e in this.batches)this.batches[e].resetDrawRanges()}setObjectsFilterMaterial(e,n,r=!0){return this.setObjectsMaterial(e,i=>({offset:i.batchStart,count:i.batchCount,material:this.materials.getFilterMaterial(i,n.filterType),materialOptions:this.materials.getFilterMaterialOptions(n)}),r)}setObjectsMaterial(e,n,r=!0){let i=e;r&&(i=[...Array.from(new Set(e.map(a=>a)))]);const s=[...Array.from(new Set(i.map(a=>a.batchId)))];for(let a=0;au.batchId===s[a]).map(n);o.setDrawRanges(...l)}return s}insertObjectsFilterMaterial(e,n){let r=e;r=[...Array.from(new Set(e.map(a=>a)))];const i=[...Array.from(new Set(r.map(a=>a.batchId)))],s=A8();for(let a=0;ap.batchId===i[a]),u=l.filter(p=>!p.transparent),c=l.filter(p=>p.transparent);let d,f;u.length&&(d=this.materials.getFilterMaterial(u[0],n.filterType).clone()),c.length&&(f=this.materials.getFilterMaterial(c[0],n.filterType).clone());const h=l.map(p=>({offset:p.batchStart,count:p.batchCount,material:p.transparent?f:d,materialOptions:this.materials.getFilterMaterialOptions(n),id:s}));o.insertDrawRanges(...h)}return s}removeObjectsMaterial(e){for(const n in this.batches)this.batches[n]&&this.batches[n].removeDrawRanges(e)}autoFillDrawRanges(e){[...Array.from(new Set(e.map(n=>n)))].forEach(n=>{n&&this.batches[n].autoFillDrawRanges()})}async isolateRenderViewBatch(e,n){const r=n.getRenderViewForNodeId(e);for(const i in this.batches)i!==r.batchId&&this.batches[i].setDrawRanges({offset:0,count:this.batches[i].getCount(),material:this.materials.getFilterMaterial(this.batches[i].renderViews[0],mi.GHOST)})}async isolateBatch(e){for(const n in this.batches)n!==e&&this.batches[n].setDrawRanges({offset:0,count:this.batches[n].getCount(),material:this.materials.getFilterMaterial(this.batches[n].renderViews[0],mi.GHOST)})}}const U1t={hover:!1};class U9 extends lw{constructor(e,n){let r;super(),this.lastTap=0,this.lastClick=0,this.container=e,this.container.addEventListener("pointerdown",i=>{i.preventDefault(),r=new Date().getTime()}),this.container.addEventListener("pointerup",i=>{i.preventDefault();const s=new Date().getTime(),a=s-r,o=s-this.lastClick;if(a>250||o{this.touchLocation=i.targetTouches[0]}),this.container.addEventListener("touchend",i=>{if(i.targetTouches.length>0)return;const s=new Date().getTime(),a=s-this.lastTap;clearTimeout(this.tapTimeout),a<500&&a>0?this.emit($t.ObjectDoubleClicked,this._getNormalisedClickPosition(this.touchLocation)):this.tapTimeout=setTimeout(function(){clearTimeout(this.tapTimeout)},500),this.lastTap=s}),this.container.addEventListener("dblclick",i=>{const s=this._getNormalisedClickPosition(i);s.event=i,this.emit($t.ObjectDoubleClicked,s)}),this.container.addEventListener("pointermove",i=>{const s=this._getNormalisedClickPosition(i);s.event=i,this.emit("pointer-move",s)}),document.addEventListener("keyup",i=>{this.emit("key-up",i)})}_getNormalisedClickPosition(e){const n=this.container,r=this.container.getBoundingClientRect(),i=(e.clientX-r.left)*n.width/r.width,s=(e.clientY-r.top)*n.height/r.height;return new Oe(i/n.width*2-1,s/n.height*-2+1)}dispose(){super.dispose()}}U9.MAX_DOUBLE_CLICK_TIMING=500;class N1t extends yy{constructor(e,n,r=0,i=1/0){super(e,n,r,i),this.onObjectIntersectionTest=null,this.layers.disableAll(),this.layers.enable(kt.STREAM_CONTENT),this.layers.enable(kt.STREAM_CONTENT_MESH),this.layers.enable(kt.STREAM_CONTENT_LINE),this.layers.enable(kt.STREAM_CONTENT_TEXT),this.layers.enable(kt.STREAM_CONTENT_POINT_CLOUD)}intersectObjects(e,n=!0,r=[]){for(let i=0,s=e.length;i{this.raycaster.layers.enable(l)}));const a=e.getObjectByName("ContentGroup");let o=[];return a&&(o=this.raycaster.intersectObjects(a.children)),this.raycaster.layers.mask=s,o.length===0?null:(n&&o.sort((l,u)=>l.distance-u.distance),r&&(o=o.filter(l=>r.containsPoint(l.point))),o)}}class bs extends xge{get vertexShader(){return` #include #ifdef USE_RTE // The high component is stored as the default 'position' attribute buffer @@ -6505,7 +6505,7 @@ void main() { #endif #endif } -`}get baseUniforms(){return wi.depth.uniforms}get uniformsDef(){return{uViewer_high:new U,uViewer_low:new U,rteModelViewMatrix:new Be,near:0,far:0,uTransforms:[new Be],tTransforms:null,objCount:1}}constructor(e,n=[]){super(e),this.init(n)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}onBeforeRender(e,n,r,i,s,a){bs.matBuff.copy(r.matrixWorldInverse),bs.matBuff.elements[12]=0,bs.matBuff.elements[13]=0,bs.matBuff.elements[14]=0,s.modelViewMatrix.copy(bs.matBuff),bs.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),ur.DoubleToHighLowVector(bs.vecBuff0,bs.vecBuff1,bs.vecBuff2),this.userData.uViewer_low.value.copy(bs.vecBuff1),this.userData.uViewer_high.value.copy(bs.vecBuff2),this.userData.rteModelViewMatrix.value.copy(s.modelViewMatrix),s instanceof N0&&s.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}bs.matBuff=new Be,bs.vecBuff0=new U,bs.vecBuff1=new U,bs.vecBuff2=new U;class X1t extends cm{constructor(){super(),this.frameIndex=0,this.materialCopy=new bi({defines:{ACCUMULATE:0},uniforms:{tDiffuse:{value:null},tDiffuseInterp:{value:null},frameIndex:{value:0}},vertexShader:` +`}get baseUniforms(){return wi.depth.uniforms}get uniformsDef(){return{uViewer_high:new U,uViewer_low:new U,rteModelViewMatrix:new Be,near:0,far:0,uTransforms:[new Be],tTransforms:null,objCount:1}}constructor(e,n=[]){super(e),this.init(n)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}onBeforeRender(e,n,r,i,s,a){bs.matBuff.copy(r.matrixWorldInverse),bs.matBuff.elements[12]=0,bs.matBuff.elements[13]=0,bs.matBuff.elements[14]=0,s.modelViewMatrix.copy(bs.matBuff),bs.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),ur.DoubleToHighLowVector(bs.vecBuff0,bs.vecBuff1,bs.vecBuff2),this.userData.uViewer_low.value.copy(bs.vecBuff1),this.userData.uViewer_high.value.copy(bs.vecBuff2),this.userData.rteModelViewMatrix.value.copy(s.modelViewMatrix),s instanceof N0&&s.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}bs.matBuff=new Be,bs.vecBuff0=new U,bs.vecBuff1=new U,bs.vecBuff2=new U;class C1t extends cm{constructor(){super(),this.frameIndex=0,this.materialCopy=new bi({defines:{ACCUMULATE:0},uniforms:{tDiffuse:{value:null},tDiffuseInterp:{value:null},frameIndex:{value:0}},vertexShader:` varying vec2 vUv; void main() { vUv = uv; @@ -6529,7 +6529,7 @@ void main() { gl_FragColor.rgb = currentSample; #endif gl_FragColor.a = 1.; - }`,blending:os}),this.materialCopy.transparent=!0,this.materialCopy.depthTest=!1,this.materialCopy.depthWrite=!1,this.materialCopy.blending=bT,this.materialCopy.blendSrc=vK,this.materialCopy.blendDst=i6,this.materialCopy.blendEquation=Eu,this.materialCopy.blendSrcAlpha=LV,this.materialCopy.blendDstAlpha=i6,this.materialCopy.blendEquationAlpha=Eu,this.materialCopy.needsUpdate=!0,this.fsQuad=new Fy(this.materialCopy)}setTexture(e,n){this.materialCopy.uniforms[e].value=n,this.materialCopy.needsUpdate=!0}get displayName(){return"APPLYSAO"}get outputTexture(){return null}setParams(e){}setFrameIndex(e){this.frameIndex=e}setRenderType(e){e===rl.NORMAL?this.materialCopy.defines.ACCUMULATE=0:(this.materialCopy.defines.ACCUMULATE=1,this.frameIndex=0),this.materialCopy.needsUpdate=!0}update(e,n){this.materialCopy.defines.NUM_FRAMES=Wp.ACCUMULATE_FRAMES,this.materialCopy.uniforms.frameIndex.value=this.frameIndex,this.materialCopy.needsUpdate=!0}render(e,n,r){e.setRenderTarget(null);const i=e.autoClear;e.autoClear=!1,this.fsQuad.render(e),e.autoClear=i}}class C1t extends cm{constructor(){super(),this.materialCopy=new bi({defines:{INPUT_TYPE:0},uniforms:Na.clone(f4.uniforms),vertexShader:` + }`,blending:os}),this.materialCopy.transparent=!0,this.materialCopy.depthTest=!1,this.materialCopy.depthWrite=!1,this.materialCopy.blending=bT,this.materialCopy.blendSrc=gK,this.materialCopy.blendDst=r6,this.materialCopy.blendEquation=Eu,this.materialCopy.blendSrcAlpha=LV,this.materialCopy.blendDstAlpha=r6,this.materialCopy.blendEquationAlpha=Eu,this.materialCopy.needsUpdate=!0,this.fsQuad=new Gy(this.materialCopy)}setTexture(e,n){this.materialCopy.uniforms[e].value=n,this.materialCopy.needsUpdate=!0}get displayName(){return"APPLYSAO"}get outputTexture(){return null}setParams(e){}setFrameIndex(e){this.frameIndex=e}setRenderType(e){e===nl.NORMAL?this.materialCopy.defines.ACCUMULATE=0:(this.materialCopy.defines.ACCUMULATE=1,this.frameIndex=0),this.materialCopy.needsUpdate=!0}update(e,n){this.materialCopy.defines.NUM_FRAMES=Wp.ACCUMULATE_FRAMES,this.materialCopy.uniforms.frameIndex.value=this.frameIndex,this.materialCopy.needsUpdate=!0}render(e,n,r){e.setRenderTarget(null);const i=e.autoClear;e.autoClear=!1,this.fsQuad.render(e),e.autoClear=i}}class K1t extends cm{constructor(){super(),this.materialCopy=new bi({defines:{INPUT_TYPE:0},uniforms:Na.clone(f4.uniforms),vertexShader:` varying vec2 vUv; void main() { vUv = uv; @@ -6563,7 +6563,7 @@ void main() { gl_FragColor.rgb = outSample; gl_FragColor.a = 1.; - }`,blending:os}),this.materialCopy.needsUpdate=!0,this.fsQuad=new Fy(this.materialCopy)}setOutputType(e){this.materialCopy.defines.OUTPUT_TYPE=e,this.materialCopy.needsUpdate=!0}setTexture(e,n){this.materialCopy.uniforms[e].value=n,this.materialCopy.needsUpdate=!0}get displayName(){return"COPY-OUTPUT"}get outputTexture(){return null}render(e,n,r){e.setRenderTarget(null);const i=e.autoClear;e.autoClear=!1,this.fsQuad.render(e),e.autoClear=i}}class fm extends cm{get enabledLayers(){return this._enabledLayers}constructor(){super(),this.layers=null,this._enabledLayers=[]}get displayName(){return"BASE"}get outputTexture(){return null}setLayers(e){this.layers=e,this._enabledLayers=e.slice()}enableLayer(e,n){this._enabledLayers.includes(e)?n||this._enabledLayers.splice(this._enabledLayers.indexOf(e),1):n&&this._enabledLayers.push(e)}applyLayers(e){this.layers!==null?(e.layers.disableAll(),this.layers.forEach(n=>{this._enabledLayers.includes(n)&&e.layers.enable(n)})):e.layers.enableAll()}}var Fd,ql;(function(t){t[t.PERSPECTIVE_DEPTH=0]="PERSPECTIVE_DEPTH",t[t.LINEAR_DEPTH=1]="LINEAR_DEPTH"})(Fd||(Fd={})),function(t){t[t.FULL=0]="FULL",t[t.HALF=1]="HALF"}(ql||(ql={}));class K1t extends fm{get displayName(){return"DEPTH"}get material(){return this.depthMaterial}get outputTexture(){return this.renderTarget.texture}get outputTextureHalf(){return this.renderTargetHalf.texture}set depthType(e){e===Fd.LINEAR_DEPTH?this.depthMaterial.defines.LINEAR_DEPTH=" ":delete this.depthMaterial.defines.LINEAR_DEPTH,this.depthMaterial.needsUpdate=!0}set depthSize(e){this.depthBufferSize=e}set depthSide(e){this.depthMaterial.side=e}constructor(){super(),this.depthMaterial=null,this.depthBufferSize=ql.FULL,this.colorBuffer=new tt,this.onBeforeRender=null,this.onAfterRender=null,this.renderTarget=new oi(256,256,{minFilter:Ir,magFilter:Ir}),this.renderTargetHalf=new oi(256,256,{minFilter:Ir,magFilter:Ir}),this.renderTarget.depthBuffer=!0,this.renderTarget.stencilBuffer=!0,this.renderTargetHalf.depthBuffer=!0,this.renderTargetHalf.stencilBuffer=!0,this.depthMaterial=new bs({depthPacking:ST},["USE_RTE","ALPHATEST_REJECTION"]),this.depthMaterial.blending=os,this.depthMaterial.side=rn}setClippingPlanes(e){this.depthMaterial.clippingPlanes=e}update(e,n){this.camera=n,this.scene=e,this.depthMaterial.userData.near.value=n.near,this.depthMaterial.userData.far.value=n.far,this.depthMaterial.needsUpdate=!0}render(e,n,r){this.onBeforeRender(),e.getClearColor(this.colorBuffer);const i=e.getClearAlpha(),s=e.autoClear;e.setRenderTarget(this.depthBufferSize===ql.FULL?this.renderTarget:this.renderTargetHalf),e.autoClear=!1,e.setClearColor(0),e.setClearAlpha(1),e.clear();const a=e.shadowMap.enabled,o=e.shadowMap.needsUpdate;e.shadowMap.enabled=!1,e.shadowMap.needsUpdate=!1,this.applyLayers(this.camera),e.render(this.scene,this.camera),e.shadowMap.enabled=a,e.shadowMap.needsUpdate=o,this.scene.overrideMaterial=null,e.autoClear=s,e.setClearColor(this.colorBuffer),e.setClearAlpha(i),this.onAfterRender()}setSize(e,n){this.renderTarget.setSize(e,n),this.renderTargetHalf.setSize(.5*e,.5*n)}}class _s extends wge{get vertexShader(){return` + }`,blending:os}),this.materialCopy.needsUpdate=!0,this.fsQuad=new Gy(this.materialCopy)}setOutputType(e){this.materialCopy.defines.OUTPUT_TYPE=e,this.materialCopy.needsUpdate=!0}setTexture(e,n){this.materialCopy.uniforms[e].value=n,this.materialCopy.needsUpdate=!0}get displayName(){return"COPY-OUTPUT"}get outputTexture(){return null}render(e,n,r){e.setRenderTarget(null);const i=e.autoClear;e.autoClear=!1,this.fsQuad.render(e),e.autoClear=i}}class fm extends cm{get enabledLayers(){return this._enabledLayers}constructor(){super(),this.layers=null,this._enabledLayers=[]}get displayName(){return"BASE"}get outputTexture(){return null}setLayers(e){this.layers=e,this._enabledLayers=e.slice()}enableLayer(e,n){this._enabledLayers.includes(e)?n||this._enabledLayers.splice(this._enabledLayers.indexOf(e),1):n&&this._enabledLayers.push(e)}applyLayers(e){this.layers!==null?(e.layers.disableAll(),this.layers.forEach(n=>{this._enabledLayers.includes(n)&&e.layers.enable(n)})):e.layers.enableAll()}}var Fd,ql;(function(t){t[t.PERSPECTIVE_DEPTH=0]="PERSPECTIVE_DEPTH",t[t.LINEAR_DEPTH=1]="LINEAR_DEPTH"})(Fd||(Fd={})),function(t){t[t.FULL=0]="FULL",t[t.HALF=1]="HALF"}(ql||(ql={}));class q1t extends fm{get displayName(){return"DEPTH"}get material(){return this.depthMaterial}get outputTexture(){return this.renderTarget.texture}get outputTextureHalf(){return this.renderTargetHalf.texture}set depthType(e){e===Fd.LINEAR_DEPTH?this.depthMaterial.defines.LINEAR_DEPTH=" ":delete this.depthMaterial.defines.LINEAR_DEPTH,this.depthMaterial.needsUpdate=!0}set depthSize(e){this.depthBufferSize=e}set depthSide(e){this.depthMaterial.side=e}constructor(){super(),this.depthMaterial=null,this.depthBufferSize=ql.FULL,this.colorBuffer=new tt,this.onBeforeRender=null,this.onAfterRender=null,this.renderTarget=new oi(256,256,{minFilter:Ir,magFilter:Ir}),this.renderTargetHalf=new oi(256,256,{minFilter:Ir,magFilter:Ir}),this.renderTarget.depthBuffer=!0,this.renderTarget.stencilBuffer=!0,this.renderTargetHalf.depthBuffer=!0,this.renderTargetHalf.stencilBuffer=!0,this.depthMaterial=new bs({depthPacking:ST},["USE_RTE","ALPHATEST_REJECTION"]),this.depthMaterial.blending=os,this.depthMaterial.side=rn}setClippingPlanes(e){this.depthMaterial.clippingPlanes=e}update(e,n){this.camera=n,this.scene=e,this.depthMaterial.userData.near.value=n.near,this.depthMaterial.userData.far.value=n.far,this.depthMaterial.needsUpdate=!0}render(e,n,r){this.onBeforeRender(),e.getClearColor(this.colorBuffer);const i=e.getClearAlpha(),s=e.autoClear;e.setRenderTarget(this.depthBufferSize===ql.FULL?this.renderTarget:this.renderTargetHalf),e.autoClear=!1,e.setClearColor(0),e.setClearAlpha(1),e.clear();const a=e.shadowMap.enabled,o=e.shadowMap.needsUpdate;e.shadowMap.enabled=!1,e.shadowMap.needsUpdate=!1,this.applyLayers(this.camera),e.render(this.scene,this.camera),e.shadowMap.enabled=a,e.shadowMap.needsUpdate=o,this.scene.overrideMaterial=null,e.autoClear=s,e.setClearColor(this.colorBuffer),e.setClearAlpha(i),this.onAfterRender()}setSize(e,n){this.renderTarget.setSize(e,n),this.renderTargetHalf.setSize(.5*e,.5*n)}}class _s extends Tge{get vertexShader(){return` #define NORMAL #ifdef USE_RTE // The high component is stored as the default 'position' attribute buffer @@ -6765,7 +6765,7 @@ void main() { gl_FragColor.a = 1.0; #endif } -`}get baseUniforms(){return wi.normal.uniforms}get uniformsDef(){return{uViewer_high:new U,uViewer_low:new U,uTransforms:[new Be],tTransforms:null}}constructor(e,n=[]){super(e),this.init(n)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}onBeforeRender(e,n,r,i,s,a){_s.matBuff.copy(r.matrixWorldInverse),_s.matBuff.elements[12]=0,_s.matBuff.elements[13]=0,_s.matBuff.elements[14]=0,s.modelViewMatrix.copy(_s.matBuff),_s.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),ur.DoubleToHighLowVector(_s.vecBuff0,_s.vecBuff1,_s.vecBuff2),this.userData.uViewer_low.value.copy(_s.vecBuff1),this.userData.uViewer_high.value.copy(_s.vecBuff2),s instanceof N0&&s.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}_s.matBuff=new Be,_s.vecBuff0=new U,_s.vecBuff1=new U,_s.vecBuff2=new U;class q1t extends fm{get displayName(){return"GEOMETRY-NORMALS"}get outputTexture(){return this.renderTarget.texture}get material(){return this.normalsMaterial}constructor(){super(),this.normalsMaterial=null,this.colorBuffer=new tt,this.onBeforeRender=null,this.onAfterRender=null,this.renderTarget=new oi(256,256),this.renderTarget.depthBuffer=!0,this.renderTarget.stencilBuffer=!0,this.normalsMaterial=new _s({},["USE_RTE"]),this.normalsMaterial.blending=os,this.normalsMaterial.side=rn}setClippingPlanes(e){this.normalsMaterial.clippingPlanes=e}update(e,n){this.camera=n,this.scene=e}render(e,n,r){this.onBeforeRender(),e.getClearColor(this.colorBuffer);const i=e.getClearAlpha(),s=e.autoClear;e.setRenderTarget(this.renderTarget),e.autoClear=!1,e.setClearColor(0),e.setClearAlpha(1),e.clear();const a=e.shadowMap.enabled,o=e.shadowMap.needsUpdate;e.shadowMap.enabled=!1,e.shadowMap.needsUpdate=!1,this.applyLayers(this.camera),e.render(this.scene,this.camera),e.shadowMap.enabled=a,e.shadowMap.needsUpdate=o,this.scene.overrideMaterial=null,e.autoClear=s,e.setClearColor(this.colorBuffer),e.setClearAlpha(i),this.onAfterRender()}setSize(e,n){this.renderTarget.setSize(e,n)}}var uf,Lc;(function(t){t[t.DEFAULT=0]="DEFAULT",t[t.IMPROVED=1]="IMPROVED",t[t.ACCURATE=2]="ACCURATE"})(uf||(uf={})),function(t){t[t.RECONSTRUCTED_NORMALS=0]="RECONSTRUCTED_NORMALS",t[t.AO=1]="AO",t[t.AO_BLURRED=2]="AO_BLURRED"}(Lc||(Lc={}));const Rge={intensity:1.5,scale:0,kernelRadius:5,bias:.2,normalsType:uf.ACCURATE,blurEnabled:!0,blurRadius:2,blurStdDev:4,blurDepthCutoff:.007};class D1t extends cm{get displayName(){return"SAO"}get outputTexture(){return this.saoRenderTarget.texture}constructor(){super(),this.params=Rge,this.colorBuffer=new tt,this.saoMaterial=null,this.vBlurMaterial=null,this.hBlurMaterial=null,this.saoRenderTarget=null,this.blurIntermediateRenderTarget=null,this.fsQuad=null,this._outputType=Lc.AO_BLURRED,this.outputScale=.5,this.saoRenderTarget=new oi(256,256),this.blurIntermediateRenderTarget=new oi(256,256),this.saoMaterial=new bi({defines:{NUM_SAMPLES:7,NUM_RINGS:4,NORMAL_TEXTURE:0,DIFFUSE_TEXTURE:0,DEPTH_PACKING:1,PERSPECTIVE_CAMERA:1},fragmentShader:` +`}get baseUniforms(){return wi.normal.uniforms}get uniformsDef(){return{uViewer_high:new U,uViewer_low:new U,uTransforms:[new Be],tTransforms:null}}constructor(e,n=[]){super(e),this.init(n)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}onBeforeRender(e,n,r,i,s,a){_s.matBuff.copy(r.matrixWorldInverse),_s.matBuff.elements[12]=0,_s.matBuff.elements[13]=0,_s.matBuff.elements[14]=0,s.modelViewMatrix.copy(_s.matBuff),_s.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),ur.DoubleToHighLowVector(_s.vecBuff0,_s.vecBuff1,_s.vecBuff2),this.userData.uViewer_low.value.copy(_s.vecBuff1),this.userData.uViewer_high.value.copy(_s.vecBuff2),s instanceof N0&&s.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}_s.matBuff=new Be,_s.vecBuff0=new U,_s.vecBuff1=new U,_s.vecBuff2=new U;class D1t extends fm{get displayName(){return"GEOMETRY-NORMALS"}get outputTexture(){return this.renderTarget.texture}get material(){return this.normalsMaterial}constructor(){super(),this.normalsMaterial=null,this.colorBuffer=new tt,this.onBeforeRender=null,this.onAfterRender=null,this.renderTarget=new oi(256,256),this.renderTarget.depthBuffer=!0,this.renderTarget.stencilBuffer=!0,this.normalsMaterial=new _s({},["USE_RTE"]),this.normalsMaterial.blending=os,this.normalsMaterial.side=rn}setClippingPlanes(e){this.normalsMaterial.clippingPlanes=e}update(e,n){this.camera=n,this.scene=e}render(e,n,r){this.onBeforeRender(),e.getClearColor(this.colorBuffer);const i=e.getClearAlpha(),s=e.autoClear;e.setRenderTarget(this.renderTarget),e.autoClear=!1,e.setClearColor(0),e.setClearAlpha(1),e.clear();const a=e.shadowMap.enabled,o=e.shadowMap.needsUpdate;e.shadowMap.enabled=!1,e.shadowMap.needsUpdate=!1,this.applyLayers(this.camera),e.render(this.scene,this.camera),e.shadowMap.enabled=a,e.shadowMap.needsUpdate=o,this.scene.overrideMaterial=null,e.autoClear=s,e.setClearColor(this.colorBuffer),e.setClearAlpha(i),this.onAfterRender()}setSize(e,n){this.renderTarget.setSize(e,n)}}var uf,Lc;(function(t){t[t.DEFAULT=0]="DEFAULT",t[t.IMPROVED=1]="IMPROVED",t[t.ACCURATE=2]="ACCURATE"})(uf||(uf={})),function(t){t[t.RECONSTRUCTED_NORMALS=0]="RECONSTRUCTED_NORMALS",t[t.AO=1]="AO",t[t.AO_BLURRED=2]="AO_BLURRED"}(Lc||(Lc={}));const Pge={intensity:1.5,scale:0,kernelRadius:5,bias:.2,normalsType:uf.ACCURATE,blurEnabled:!0,blurRadius:2,blurStdDev:4,blurDepthCutoff:.007};class W1t extends cm{get displayName(){return"SAO"}get outputTexture(){return this.saoRenderTarget.texture}constructor(){super(),this.params=Pge,this.colorBuffer=new tt,this.saoMaterial=null,this.vBlurMaterial=null,this.hBlurMaterial=null,this.saoRenderTarget=null,this.blurIntermediateRenderTarget=null,this.fsQuad=null,this._outputType=Lc.AO_BLURRED,this.outputScale=.5,this.saoRenderTarget=new oi(256,256),this.blurIntermediateRenderTarget=new oi(256,256),this.saoMaterial=new bi({defines:{NUM_SAMPLES:7,NUM_RINGS:4,NORMAL_TEXTURE:0,DIFFUSE_TEXTURE:0,DEPTH_PACKING:1,PERSPECTIVE_CAMERA:1},fragmentShader:` #include varying vec2 vUv; #if DIFFUSE_TEXTURE == 1 @@ -6999,7 +6999,7 @@ void main() { void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); - }`,uniforms:Na.clone(k0t.uniforms)}),this.saoMaterial.extensions.derivatives=!0,this.saoMaterial.defines.DEPTH_PACKING=1,this.saoMaterial.uniforms.tDepth.value=null,this.saoMaterial.uniforms.tNormal.value=null,this.saoMaterial.uniforms.size.value.set(256,256),this.saoMaterial.uniforms.minResolution.value=0,this.saoMaterial.blending=os,this.vBlurMaterial=new bi({uniforms:Na.clone(wa.uniforms),defines:Object.assign({},wa.defines),vertexShader:wa.vertexShader,fragmentShader:wa.fragmentShader}),this.vBlurMaterial.defines.DEPTH_PACKING=1,this.vBlurMaterial.uniforms.tDiffuse.value=this.saoRenderTarget.texture,this.vBlurMaterial.uniforms.tDepth.value=null,this.vBlurMaterial.uniforms.size.value.set(256,256),this.vBlurMaterial.blending=os,this.hBlurMaterial=new bi({uniforms:Na.clone(wa.uniforms),defines:Object.assign({},wa.defines),vertexShader:wa.vertexShader,fragmentShader:wa.fragmentShader}),this.hBlurMaterial.defines.DEPTH_PACKING=1,this.hBlurMaterial.uniforms.tDiffuse.value=this.blurIntermediateRenderTarget.texture,this.hBlurMaterial.uniforms.tDepth.value=null,this.hBlurMaterial.uniforms.size.value.set(256,256),this.hBlurMaterial.blending=os,this.fsQuad=new Fy(this.saoMaterial)}setParams(e){Object.assign(this.params,e)}setOutputType(e){this._outputType=e}setTexture(e,n){e==="tDepth"&&(this.saoMaterial.uniforms.tDepth.value=n,this.vBlurMaterial.uniforms.tDepth.value=n,this.hBlurMaterial.uniforms.tDepth.value=n),e==="tNormal"&&(this.saoMaterial.uniforms.tNormal.value=n),this.saoMaterial.needsUpdate=!0,this.vBlurMaterial.needsUpdate=!0,this.hBlurMaterial.needsUpdate=!0}update(e,n){this._outputType===Lc.RECONSTRUCTED_NORMALS?this.saoMaterial.defines.OUTPUT_RECONSTRUCTED_NORMALS="":delete this.saoMaterial.defines.OUTPUT_RECONSTRUCTED_NORMALS,this.params.scale=n.far,this.saoMaterial.defines.PERSPECTIVE_CAMERA=n.isPerspectiveCamera?1:0,this.saoMaterial.defines.NORMAL_TEXTURE=this.params.normalsType===uf.DEFAULT?1:0,this.saoMaterial.defines.IMPROVED_NORMAL_RECONSTRUCTION=this.params.normalsType===uf.IMPROVED?1:0,this.saoMaterial.defines.ACCURATE_NORMAL_RECONSTRUCTION=this.params.normalsType===uf.ACCURATE?1:0,this.saoMaterial.uniforms.cameraNear.value=n.near,this.saoMaterial.uniforms.cameraFar.value=n.far,this.saoMaterial.uniforms.cameraInverseProjectionMatrix.value.copy(n.projectionMatrixInverse),this.saoMaterial.uniforms.cameraProjectionMatrix.value=n.projectionMatrix,this.saoMaterial.uniforms.intensity.value=this.params.intensity,this.saoMaterial.uniforms.scale.value=this.params.scale,this.saoMaterial.uniforms.kernelRadius.value=this.params.kernelRadius,this.saoMaterial.uniforms.bias.value=this.params.bias,this.saoMaterial.needsUpdate=!0,this.vBlurMaterial.defines.PERSPECTIVE_CAMERA=n.isPerspectiveCamera?1:0,this.hBlurMaterial.defines.PERSPECTIVE_CAMERA=n.isPerspectiveCamera?1:0,this.vBlurMaterial.uniforms.cameraNear.value=n.near,this.vBlurMaterial.uniforms.cameraFar.value=n.far,this.hBlurMaterial.uniforms.cameraNear.value=n.near,this.hBlurMaterial.uniforms.cameraFar.value=n.far;const r=this.params.blurDepthCutoff*(n.far-n.near);this.vBlurMaterial.uniforms.depthCutoff.value=r,this.hBlurMaterial.uniforms.depthCutoff.value=r,this.params.blurRadius=Math.floor(this.params.blurRadius),this.prevStdDev===this.params.blurStdDev&&this.prevNumSamples===this.params.blurRadius||(Nb.configure(this.vBlurMaterial,this.params.blurRadius,this.params.blurStdDev,new Oe(0,1)),Nb.configure(this.hBlurMaterial,this.params.blurRadius,this.params.blurStdDev,new Oe(1,0)),this.prevStdDev=this.params.blurStdDev,this.prevNumSamples=this.params.blurRadius),this.vBlurMaterial.needsUpdate=!0,this.hBlurMaterial.needsUpdate=!0}render(e){e.getClearColor(this.colorBuffer);const n=e.getClearAlpha(),r=e.autoClear;e.setRenderTarget(this.saoRenderTarget),e.autoClear=!1,e.setClearColor(16777215),e.setClearAlpha(1),e.clear(),this.fsQuad.material=this.saoMaterial,this.fsQuad.render(e),this.params.blurEnabled&&this._outputType===Lc.AO_BLURRED&&(e.setRenderTarget(this.blurIntermediateRenderTarget),e.setClearColor(16777215),e.setClearAlpha(1),e.clear(),this.fsQuad.material=this.vBlurMaterial,this.fsQuad.render(e),e.setRenderTarget(this.saoRenderTarget),this.fsQuad.material=this.hBlurMaterial,this.fsQuad.render(e)),e.autoClear=r,e.setClearColor(this.colorBuffer),e.setClearAlpha(n)}setSize(e,n){const r=e*this.outputScale,i=n*this.outputScale;this.saoRenderTarget.setSize(r,i),this.blurIntermediateRenderTarget.setSize(r,i),this.saoMaterial.uniforms.size.value.set(r,i),this.vBlurMaterial.uniforms.size.value.set(r,i),this.hBlurMaterial.uniforms.size.value.set(r,i),this.saoMaterial.needsUpdate=!0}}const Vge={intensity:1,kernelRadius:30,kernelSize:16,bias:.01,minDistance:0,maxDistance:.008};class W1t extends cm{setTexture(e,n){e==="tDepth"&&(this.aoMaterial.uniforms.tDepth.value=n),e==="tNormal"&&(this.aoMaterial.uniforms.tNormal.value=n),this.aoMaterial.needsUpdate=!0}get outputTexture(){return this._accumulationBuffer.texture}get displayName(){return"STATIC-AO"}constructor(){super(),this.aoMaterial=null,this.accumulateMaterial=null,this.params=Vge,this.frameIndex=0,this.kernels=[],this.noiseTextures=[],this._generationBuffer=new oi(256,256),this._accumulationBuffer=new oi(256,256),this.aoMaterial=new bi({fragmentShader:` + }`,uniforms:Na.clone(O0t.uniforms)}),this.saoMaterial.extensions.derivatives=!0,this.saoMaterial.defines.DEPTH_PACKING=1,this.saoMaterial.uniforms.tDepth.value=null,this.saoMaterial.uniforms.tNormal.value=null,this.saoMaterial.uniforms.size.value.set(256,256),this.saoMaterial.uniforms.minResolution.value=0,this.saoMaterial.blending=os,this.vBlurMaterial=new bi({uniforms:Na.clone(wa.uniforms),defines:Object.assign({},wa.defines),vertexShader:wa.vertexShader,fragmentShader:wa.fragmentShader}),this.vBlurMaterial.defines.DEPTH_PACKING=1,this.vBlurMaterial.uniforms.tDiffuse.value=this.saoRenderTarget.texture,this.vBlurMaterial.uniforms.tDepth.value=null,this.vBlurMaterial.uniforms.size.value.set(256,256),this.vBlurMaterial.blending=os,this.hBlurMaterial=new bi({uniforms:Na.clone(wa.uniforms),defines:Object.assign({},wa.defines),vertexShader:wa.vertexShader,fragmentShader:wa.fragmentShader}),this.hBlurMaterial.defines.DEPTH_PACKING=1,this.hBlurMaterial.uniforms.tDiffuse.value=this.blurIntermediateRenderTarget.texture,this.hBlurMaterial.uniforms.tDepth.value=null,this.hBlurMaterial.uniforms.size.value.set(256,256),this.hBlurMaterial.blending=os,this.fsQuad=new Gy(this.saoMaterial)}setParams(e){Object.assign(this.params,e)}setOutputType(e){this._outputType=e}setTexture(e,n){e==="tDepth"&&(this.saoMaterial.uniforms.tDepth.value=n,this.vBlurMaterial.uniforms.tDepth.value=n,this.hBlurMaterial.uniforms.tDepth.value=n),e==="tNormal"&&(this.saoMaterial.uniforms.tNormal.value=n),this.saoMaterial.needsUpdate=!0,this.vBlurMaterial.needsUpdate=!0,this.hBlurMaterial.needsUpdate=!0}update(e,n){this._outputType===Lc.RECONSTRUCTED_NORMALS?this.saoMaterial.defines.OUTPUT_RECONSTRUCTED_NORMALS="":delete this.saoMaterial.defines.OUTPUT_RECONSTRUCTED_NORMALS,this.params.scale=n.far,this.saoMaterial.defines.PERSPECTIVE_CAMERA=n.isPerspectiveCamera?1:0,this.saoMaterial.defines.NORMAL_TEXTURE=this.params.normalsType===uf.DEFAULT?1:0,this.saoMaterial.defines.IMPROVED_NORMAL_RECONSTRUCTION=this.params.normalsType===uf.IMPROVED?1:0,this.saoMaterial.defines.ACCURATE_NORMAL_RECONSTRUCTION=this.params.normalsType===uf.ACCURATE?1:0,this.saoMaterial.uniforms.cameraNear.value=n.near,this.saoMaterial.uniforms.cameraFar.value=n.far,this.saoMaterial.uniforms.cameraInverseProjectionMatrix.value.copy(n.projectionMatrixInverse),this.saoMaterial.uniforms.cameraProjectionMatrix.value=n.projectionMatrix,this.saoMaterial.uniforms.intensity.value=this.params.intensity,this.saoMaterial.uniforms.scale.value=this.params.scale,this.saoMaterial.uniforms.kernelRadius.value=this.params.kernelRadius,this.saoMaterial.uniforms.bias.value=this.params.bias,this.saoMaterial.needsUpdate=!0,this.vBlurMaterial.defines.PERSPECTIVE_CAMERA=n.isPerspectiveCamera?1:0,this.hBlurMaterial.defines.PERSPECTIVE_CAMERA=n.isPerspectiveCamera?1:0,this.vBlurMaterial.uniforms.cameraNear.value=n.near,this.vBlurMaterial.uniforms.cameraFar.value=n.far,this.hBlurMaterial.uniforms.cameraNear.value=n.near,this.hBlurMaterial.uniforms.cameraFar.value=n.far;const r=this.params.blurDepthCutoff*(n.far-n.near);this.vBlurMaterial.uniforms.depthCutoff.value=r,this.hBlurMaterial.uniforms.depthCutoff.value=r,this.params.blurRadius=Math.floor(this.params.blurRadius),this.prevStdDev===this.params.blurStdDev&&this.prevNumSamples===this.params.blurRadius||(Nb.configure(this.vBlurMaterial,this.params.blurRadius,this.params.blurStdDev,new Oe(0,1)),Nb.configure(this.hBlurMaterial,this.params.blurRadius,this.params.blurStdDev,new Oe(1,0)),this.prevStdDev=this.params.blurStdDev,this.prevNumSamples=this.params.blurRadius),this.vBlurMaterial.needsUpdate=!0,this.hBlurMaterial.needsUpdate=!0}render(e){e.getClearColor(this.colorBuffer);const n=e.getClearAlpha(),r=e.autoClear;e.setRenderTarget(this.saoRenderTarget),e.autoClear=!1,e.setClearColor(16777215),e.setClearAlpha(1),e.clear(),this.fsQuad.material=this.saoMaterial,this.fsQuad.render(e),this.params.blurEnabled&&this._outputType===Lc.AO_BLURRED&&(e.setRenderTarget(this.blurIntermediateRenderTarget),e.setClearColor(16777215),e.setClearAlpha(1),e.clear(),this.fsQuad.material=this.vBlurMaterial,this.fsQuad.render(e),e.setRenderTarget(this.saoRenderTarget),this.fsQuad.material=this.hBlurMaterial,this.fsQuad.render(e)),e.autoClear=r,e.setClearColor(this.colorBuffer),e.setClearAlpha(n)}setSize(e,n){const r=e*this.outputScale,i=n*this.outputScale;this.saoRenderTarget.setSize(r,i),this.blurIntermediateRenderTarget.setSize(r,i),this.saoMaterial.uniforms.size.value.set(r,i),this.vBlurMaterial.uniforms.size.value.set(r,i),this.hBlurMaterial.uniforms.size.value.set(r,i),this.saoMaterial.needsUpdate=!0}}const Rge={intensity:1,kernelRadius:30,kernelSize:16,bias:.01,minDistance:0,maxDistance:.008};class A1t extends cm{setTexture(e,n){e==="tDepth"&&(this.aoMaterial.uniforms.tDepth.value=n),e==="tNormal"&&(this.aoMaterial.uniforms.tNormal.value=n),this.aoMaterial.needsUpdate=!0}get outputTexture(){return this._accumulationBuffer.texture}get displayName(){return"STATIC-AO"}constructor(){super(),this.aoMaterial=null,this.accumulateMaterial=null,this.params=Rge,this.frameIndex=0,this.kernels=[],this.noiseTextures=[],this._generationBuffer=new oi(256,256),this._accumulationBuffer=new oi(256,256),this.aoMaterial=new bi({fragmentShader:` #include varying vec2 vUv; uniform sampler2D tDepth; @@ -7316,7 +7316,7 @@ void main() { void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); - }`,uniforms:{tDiffuse:{value:null},opacity:{value:1}}}),this.accumulateMaterial.uniforms.tDiffuse.value=this._generationBuffer.texture,this.accumulateMaterial.blending=bT,this.accumulateMaterial.blendSrc=Jh,this.accumulateMaterial.blendDst=Jh,this.accumulateMaterial.blendEquation=hK,this.accumulateMaterial.blendSrcAlpha=Jh,this.accumulateMaterial.blendDstAlpha=Jh,this.accumulateMaterial.blendEquationAlpha=Eu,this.fsQuad=new Fy(this.aoMaterial)}setParams(e){Object.assign(this.params,e),this.kernels=[],this.noiseTextures=[]}setFrameIndex(e){this.frameIndex=e}update(e,n){this.aoMaterial.defines.PERSPECTIVE_CAMERA=n.isPerspectiveCamera?1:0,this.aoMaterial.defines.NUM_FRAMES=Wp.ACCUMULATE_FRAMES,this.aoMaterial.defines.KERNEL_SIZE=this.params.kernelSize,this.accumulateMaterial.defines.NUM_FRAMES=Wp.ACCUMULATE_FRAMES,this.aoMaterial.uniforms.cameraNear.value=n.near,this.aoMaterial.uniforms.cameraFar.value=n.far,this.aoMaterial.uniforms.cameraInverseProjectionMatrix.value.copy(n.projectionMatrixInverse),this.aoMaterial.uniforms.cameraProjectionMatrix.value.copy(n.projectionMatrix);const r=n.fov/2*Math.PI/180;this.aoMaterial.uniforms.tanFov.value=Math.tan(r),this.kernels[this.frameIndex]||this.generateSampleKernel(this.frameIndex),this.noiseTextures[this.frameIndex]||this.generateRandomKernelRotations(this.frameIndex),this.aoMaterial.uniforms.kernel.value=this.kernels[this.frameIndex],this.aoMaterial.uniforms.tNoise.value=this.noiseTextures[this.frameIndex],this.aoMaterial.uniforms.intensity.value=this.params.intensity,this.aoMaterial.uniforms.kernelRadius.value=this.params.kernelRadius,this.aoMaterial.uniforms.bias.value=this.params.bias,this.aoMaterial.uniforms.frameIndex.value=this.frameIndex,this.aoMaterial.uniforms.minDistance.value=this.params.minDistance,this.aoMaterial.uniforms.maxDistance.value=this.params.maxDistance,this.aoMaterial.needsUpdate=!0,this.accumulateMaterial.needsUpdate=!0}render(e,n,r){const i=new tt;e.getClearColor(i);const s=e.getClearAlpha(),a=e.autoClear;this.renderFrame(e),e.autoClear=a,e.setClearColor(i),e.setClearAlpha(s)}renderFrame(e){e.setRenderTarget(this._generationBuffer),e.autoClear=!1,e.setClearColor(0),e.setClearAlpha(1),e.clear(!0),this.fsQuad.material=this.aoMaterial,this.fsQuad.render(e),e.setRenderTarget(this._accumulationBuffer),this.frameIndex===0&&(e.setClearColor(16777215),e.setClearAlpha(1),e.clear(!0)),this.fsQuad.material=this.accumulateMaterial,this.fsQuad.render(e)}setSize(e,n){this._generationBuffer.setSize(e,n),this._accumulationBuffer.setSize(e,n),this.aoMaterial.uniforms.size.value.set(e,n),this.aoMaterial.needsUpdate=!0}generateSampleKernel(e){const n=this.params.kernelSize;this.kernels[e]=[];for(let r=0;r #ifdef USE_RTE // The high component is stored as the default 'position' attribute buffer @@ -7556,7 +7556,7 @@ void main() { #include #include } -`}get uniformsDef(){return{...super.uniformsDef,size:new Oe,displacement:0}}constructor(e,n=[]){super(e,n)}}class G1t extends fm{constructor(){super(),this.overrideMaterial=null,this._oldClearColor=new tt,this.clearColor=null,this.clearAlpha=0,this.clearDepth=!0,this.drawBufferSize=new Oe,this.onBeforeRender=null,this.onAfterRender=null,this.overrideMaterial=new zge({color:16711680},["USE_RTE"]),this.overrideMaterial.userData.displacement.value=2,this.overrideMaterial.colorWrite=!1,this.overrideMaterial.depthWrite=!1,this.overrideMaterial.stencilWrite=!0,this.overrideMaterial.stencilFunc=d6,this.overrideMaterial.stencilWriteMask=255,this.overrideMaterial.stencilRef=255,this.overrideMaterial.stencilZFail=zc,this.overrideMaterial.stencilZPass=zc,this.overrideMaterial.stencilFail=zc,this.overrideMaterial.side=rn}get displayName(){return"STENCIL"}get outputTexture(){return null}get material(){return this.overrideMaterial}update(e,n){this.camera=n,this.scene=e}setClippingPlanes(e){this.overrideMaterial.clippingPlanes=e}render(e,n,r){this.onBeforeRender&&this.onBeforeRender();const i=e.autoClear;let s,a;e.autoClear=!1,this.overrideMaterial!==void 0&&(a=this.scene.overrideMaterial),this.clearColor&&(e.getClearColor(this._oldClearColor),s=e.getClearAlpha(),e.setClearColor(this.clearColor,this.clearAlpha)),this.clearDepth&&e.clearDepth(),this.applyLayers(this.camera),e.setRenderTarget(this.renderToScreen?null:r),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),e.getDrawingBufferSize(this.drawBufferSize),this.overrideMaterial.userData.size.value.copy(this.drawBufferSize),e.clear(!1,!1,!0);const o=e.shadowMap.enabled;e.shadowMap.enabled=!1,e.render(this.scene,this.camera),e.shadowMap.enabled=o,this.clearColor&&e.setClearColor(this._oldClearColor,s),this.overrideMaterial!==void 0&&(this.scene.overrideMaterial=a),e.autoClear=i,this.onAfterRender&&this.onAfterRender()}}class F1t extends fm{constructor(){super(),this.overrideMaterial=null,this._oldClearColor=new tt,this.clearColor=null,this.clearAlpha=0,this.clearDepth=!0,this.drawBufferSize=new Oe,this.onBeforeRender=null,this.onAfterRender=null,this.overrideMaterial=new zge({color:304635},["USE_RTE"]),this.overrideMaterial.userData.displacement.value=2,this.overrideMaterial.colorWrite=!0,this.overrideMaterial.depthWrite=!1,this.overrideMaterial.stencilWrite=!0,this.overrideMaterial.stencilFunc=mce,this.overrideMaterial.stencilRef=255,this.overrideMaterial.side=rn}get displayName(){return"STENCIL"}get outputTexture(){return null}get material(){return this.overrideMaterial}update(e,n){this.camera=n,this.scene=e}setClippingPlanes(e){this.overrideMaterial.clippingPlanes=e}render(e,n,r){this.onBeforeRender&&this.onBeforeRender();const i=e.autoClear;let s,a;e.autoClear=!1,this.overrideMaterial!==void 0&&(a=this.scene.overrideMaterial),this.clearColor&&(e.getClearColor(this._oldClearColor),s=e.getClearAlpha(),e.setClearColor(this.clearColor,this.clearAlpha)),this.clearDepth&&e.clearDepth(),this.applyLayers(this.camera),e.setRenderTarget(this.renderToScreen?null:r),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),e.getDrawingBufferSize(this.drawBufferSize),this.overrideMaterial.userData.size.value.copy(this.drawBufferSize);const o=e.shadowMap.enabled;e.shadowMap.enabled=!1,e.render(this.scene,this.camera),e.shadowMap.enabled=o,this.clearColor&&e.setClearColor(this._oldClearColor,s),this.overrideMaterial!==void 0&&(this.scene.overrideMaterial=a),e.autoClear=i,this.onAfterRender&&this.onAfterRender()}}class j1t extends fm{constructor(){super(),this.onBeforeRender=null,this.onAfterRender=null}get displayName(){return"OVERLAY"}get outputTexture(){return null}update(e,n){this.camera=n,this.scene=e}render(e,n,r){const i=e.autoClear;e.autoClear=!1,this.applyLayers(this.camera),e.setRenderTarget(this.renderToScreen?null:r),this.onBeforeRender&&this.onBeforeRender(),e.render(this.scene,this.camera),this.onAfterRender&&this.onAfterRender(),e.autoClear=i}}var rl,ms;(function(t){t[t.NORMAL=0]="NORMAL",t[t.ACCUMULATION=1]="ACCUMULATION"})(rl||(rl={})),function(t){t[t.DEPTH_RGBA=0]="DEPTH_RGBA",t[t.DEPTH=1]="DEPTH",t[t.COLOR=2]="COLOR",t[t.GEOMETRY_NORMALS=3]="GEOMETRY_NORMALS",t[t.RECONSTRUCTED_NORMALS=4]="RECONSTRUCTED_NORMALS",t[t.DYNAMIC_AO=5]="DYNAMIC_AO",t[t.DYNAMIC_AO_BLURED=6]="DYNAMIC_AO_BLURED",t[t.PROGRESSIVE_AO=7]="PROGRESSIVE_AO",t[t.FINAL=8]="FINAL"}(ms||(ms={}));const kge={pipelineOutput:ms.FINAL,accumulationFrames:16,dynamicAoEnabled:!0,dynamicAoParams:Rge,staticAoEnabled:!0,staticAoParams:Vge,depthSide:rn};class Wp{set pipelineOptions(e){Object.assign(this._pipelineOptions,e),this.dynamicAoPass.setParams(e.dynamicAoParams),this.staticAoPass.setParams(e.staticAoParams),this.accumulationFrame=0,Wp.ACCUMULATE_FRAMES=e.accumulationFrames,this.depthPass.depthSide=e.depthSide,this.pipelineOutput=e.pipelineOutput}get pipelineOptions(){return JSON.parse(JSON.stringify(this._pipelineOptions))}set pipelineOutput(e){let n=[];switch(this.clearPipeline(),e){case ms.FINAL:n=this.getDefaultPipeline(),this.depthPass.depthSize=ql.FULL,this.applySaoPass.setTexture("tDiffuse",this.staticAoPass.outputTexture),this.applySaoPass.setTexture("tDiffuseInterp",this.dynamicAoPass.outputTexture),this.needsProgressive=!0;break;case ms.DEPTH_RGBA:n.push(this.depthPass),n.push(this.copyOutputPass),this.depthPass.depthSize=ql.FULL,this.copyOutputPass.setTexture("tDiffuse",this.depthPass.outputTexture),this.copyOutputPass.setOutputType(ms.DEPTH_RGBA),this.needsProgressive=!1;break;case ms.DEPTH:n.push(this.depthPass),n.push(this.copyOutputPass),this.depthPass.depthSize=ql.FULL,this.copyOutputPass.setTexture("tDiffuse",this.depthPass.outputTexture),this.copyOutputPass.setOutputType(ms.DEPTH),this.needsProgressive=!1;break;case ms.COLOR:n.push(this.renderPass);break;case ms.GEOMETRY_NORMALS:n.push(this.normalsPass),n.push(this.copyOutputPass),this.normalsPass.enabled=!0,this.copyOutputPass.setTexture("tDiffuse",this.normalsPass.outputTexture),this.copyOutputPass.setOutputType(ms.GEOMETRY_NORMALS),this.needsProgressive=!1;break;case ms.RECONSTRUCTED_NORMALS:n.push(this.depthPass),n.push(this.dynamicAoPass),n.push(this.copyOutputPass),this.dynamicAoPass.enabled=!0,this.depthPass.depthType=Fd.PERSPECTIVE_DEPTH,this.depthPass.depthSize=ql.HALF,this.dynamicAoPass.setOutputType(Lc.RECONSTRUCTED_NORMALS),this.copyOutputPass.setTexture("tDiffuse",this.dynamicAoPass.outputTexture),this.copyOutputPass.setOutputType(ms.GEOMETRY_NORMALS),this.needsProgressive=!1;break;case ms.DYNAMIC_AO:n.push(this.depthPass),n.push(this.normalsPass),n.push(this.dynamicAoPass),n.push(this.copyOutputPass),this.normalsPass.enabled=this._pipelineOptions.dynamicAoParams.normalsType===uf.DEFAULT,this.dynamicAoPass.enabled=!0,this.depthPass.depthType=Fd.PERSPECTIVE_DEPTH,this.copyOutputPass.setTexture("tDiffuse",this.dynamicAoPass.outputTexture),this.copyOutputPass.setOutputType(ms.COLOR),this.dynamicAoPass.setOutputType(Lc.AO),this.needsProgressive=!1;break;case ms.DYNAMIC_AO_BLURED:n.push(this.depthPass),n.push(this.normalsPass),n.push(this.dynamicAoPass),n.push(this.copyOutputPass),this.normalsPass.enabled=this._pipelineOptions.dynamicAoParams.normalsType===uf.DEFAULT,this.dynamicAoPass.enabled=!0,this.depthPass.depthType=Fd.PERSPECTIVE_DEPTH,this.depthPass.depthSize=ql.HALF,this.copyOutputPass.setTexture("tDiffuse",this.dynamicAoPass.outputTexture),this.copyOutputPass.setOutputType(ms.COLOR),this.dynamicAoPass.setOutputType(Lc.AO_BLURRED),this.needsProgressive=!1;break;case ms.PROGRESSIVE_AO:n.push(this.depthPass),n.push(this.dynamicAoPass),n.push(this.staticAoPass),n.push(this.copyOutputPass),this.depthPass.depthType=Fd.LINEAR_DEPTH,this.depthPass.depthSize=ql.FULL,this.copyOutputPass.setTexture("tDiffuse",this.staticAoPass.outputTexture),this.copyOutputPass.setOutputType(ms.COLOR),this.needsProgressive=!0}this.setPipeline(n)}set needsProgressive(e){this._needsProgressive=e,e||(this._renderType=rl.NORMAL),e&&this._renderType===rl.NORMAL&&(this._renderType=rl.ACCUMULATION),this.accumulationFrame=0}get renderType(){return this._renderType}get composer(){return this._composer}constructor(e,n){this._renderer=null,this._batcher=null,this._pipelineOptions=Object.assign({},kge),this._needsProgressive=!1,this._resetFrame=!1,this._composer=null,this.depthPass=null,this.normalsPass=null,this.stencilPass=null,this.renderPass=null,this.stencilMaskPass=null,this.dynamicAoPass=null,this.applySaoPass=null,this.copyOutputPass=null,this.staticAoPass=null,this.overlayPass=null,this.drawingSize=new Oe,this._renderType=rl.NORMAL,this.accumulationFrame=0,this.onBeforePipelineRender=null,this.onAfterPipelineRender=null,this._renderer=e,this._batcher=n,this._composer=new z0t(e),this._composer.readBuffer=null,this._composer.writeBuffer=null}configure(){let e,n,r;this.depthPass=new K1t,this.normalsPass=new q1t,this.dynamicAoPass=new D1t,this.stencilPass=new G1t,this.renderPass=new A1t,this.stencilMaskPass=new F1t,this.applySaoPass=new X1t,this.staticAoPass=new W1t,this.overlayPass=new j1t,this.copyOutputPass=new C1t,this.copyOutputPass.renderToScreen=!0,this.depthPass.setLayers([kt.STREAM_CONTENT_MESH]),this.normalsPass.setLayers([kt.STREAM_CONTENT_MESH]),this.stencilPass.setLayers([kt.STREAM_CONTENT_MESH]),this.renderPass.setLayers([kt.PROPS,kt.STREAM_CONTENT,kt.STREAM_CONTENT_MESH,kt.STREAM_CONTENT_LINE,kt.STREAM_CONTENT_POINT,kt.STREAM_CONTENT_POINT_CLOUD,kt.STREAM_CONTENT_TEXT,kt.SHADOWCATCHER]),this.stencilMaskPass.setLayers([kt.STREAM_CONTENT_MESH]),this.overlayPass.setLayers([kt.MEASUREMENTS]),this.onBeforePipelineRender=()=>{e=this._batcher.saveVisiblity(),n=this._batcher.getOpaque(),r=this._batcher.getStencil()},this.onAfterPipelineRender=()=>{this._batcher.applyVisibility(e)},this.depthPass.onBeforeRender=()=>{this._batcher.applyVisibility(n),this._batcher.overrideMaterial(n,this.depthPass.material)},this.depthPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(n)},this.normalsPass.onBeforeRender=()=>{this._batcher.applyVisibility(n),this._batcher.overrideMaterial(n,this.normalsPass.material)},this.normalsPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(e)},this.stencilPass.onBeforeRender=()=>{this._batcher.applyVisibility(r),this._batcher.overrideMaterial(r,this.stencilPass.material)},this.stencilPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(r)},this.stencilMaskPass.onBeforeRender=()=>{this._batcher.applyVisibility(r),this._batcher.overrideMaterial(r,this.stencilMaskPass.material)},this.stencilMaskPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(r)},this.renderPass.onBeforeRenderOpauqe=()=>{e=this._batcher.saveVisiblity();const i=this._batcher.getOpaque();this._batcher.applyVisibility(i)},this.renderPass.onBeforeRenderTransparent=()=>{const i=this._batcher.getTransparent();this._batcher.applyVisibility(i)},this.renderPass.onAfterRenderTransparent=()=>{this._batcher.applyVisibility(e)},this.setPipeline(this.getDefaultPipeline())}getDefaultPipeline(){this.renderPass.renderToScreen=!0,this.normalsPass.enabled=this._pipelineOptions.dynamicAoParams.normalsType===uf.DEFAULT,this.dynamicAoPass.setOutputType(this._pipelineOptions.dynamicAoParams.blurEnabled?Lc.AO_BLURRED:Lc.AO),this.applySaoPass.renderToScreen=!0,this.dynamicAoPass.setTexture("tDepth",this.depthPass.outputTextureHalf),this.dynamicAoPass.setTexture("tNormal",this.normalsPass.outputTexture),this.applySaoPass.setTexture("tDiffuse",this.dynamicAoPass.outputTexture),this.applySaoPass.setTexture("tDiffuseInterp",this.dynamicAoPass.outputTexture),this.staticAoPass.setTexture("tDepth",this.depthPass.outputTexture),this.staticAoPass.setTexture("tNormal",this.normalsPass.outputTexture);const e=[];return e.push(this.depthPass),e.push(this.normalsPass),e.push(this.dynamicAoPass),e.push(this.staticAoPass),e.push(this.stencilPass),e.push(this.renderPass),e.push(this.stencilMaskPass),e.push(this.applySaoPass),e.push(this.overlayPass),this.needsProgressive=!0,e}clearPipeline(){for(;this._composer.passes.length>0;)this._composer.removePass(this._composer.passes[0])}setPipeline(e){for(let n=0;nthis.getPlaneId(i)!==n);this.planeOutlines[n].renderable.material.clippingPlanes=r}}updatePlaneOutline(e,n){const r=new U,i=new U,s=new U,a=new U,o=new U,l=new pl,u=this.getPlaneId(n),c=this.planeOutlines[u].renderable;let d=0,f=c.geometry.attributes.instanceStart.data;const h=new Array;for(let m=0;mv.intersectsBox(g),intersectsBounds:g=>v.intersectsBox(g),intersectsTriangle(g,b,y,x,T){const M=e[m].mesh.getBatchObjectMaterial(T);if(M instanceof yx||M.visible===!1||M===null)return;const E=v;let S=0;l.start.copy(g.a),l.end.copy(g.b),E.intersectLine(l,r)&&(r.add(o.copy(v.normal).multiplyScalar(Qd.Z_OFFSET)),h[3*d]=r.x,h[3*d+1]=r.y,h[3*d+2]=r.z,d++,S++),l.start.copy(g.b),l.end.copy(g.c),E.intersectLine(l,r)&&(r.add(o.copy(v.normal).multiplyScalar(Qd.Z_OFFSET)),h[3*d]=r.x,h[3*d+1]=r.y,h[3*d+2]=r.z,S++,d++),l.start.copy(g.c),l.end.copy(g.a),E.intersectLine(l,r)&&(r.add(o.copy(v.normal).multiplyScalar(Qd.Z_OFFSET)),h[3*d]=r.x,h[3*d+1]=r.y,h[3*d+2]=r.z,S++,d++),S===3&&(i.set(h[3*(d-3)],h[3*(d-3)+1],h[3*(d-3)+2]),s.set(h[3*(d-2)],h[3*(d-2)+1],h[3*(d-2)+2]),a.set(h[3*(d-1)],h[3*(d-1)+1],h[3*(d-1)+2]),a.equals(i)||a.equals(s)?(S--,d--):i.equals(s)&&(a.set(r.x,r.y,r.z),a.add(o.copy(v.normal).multiplyScalar(Qd.Z_OFFSET)),h[3*(d-2)]=a.x,h[3*(d-2)+1]=a.y,h[3*(d-2)+2]=a.z,S--,d--)),S!==2&&(d-=S)}})}h.length>f.array.length&&(this.resizeGeometryBuffer(this.planeOutlines[u],h.length),console.warn(`Resized outline buffer from ${f.array.length} to ${h.length}. ${h.length/6} instance count`)),f=c.geometry.attributes.instanceStart.data;const p=c.geometry.attributes.instanceStartLow.data;ur.DoubleToHighLowBuffer(h,p.array,f.array),f.needsUpdate=!0,f.updateRange={offset:0,count:3*d},p.needsUpdate=!0,p.updateRange={offset:0,count:3*d},c.visible=!0,c.geometry.instanceCount=d/2,c.geometry.attributes.instanceStart.needsUpdate=!0,c.geometry.attributes.instanceEnd.needsUpdate=!0,c.geometry.attributes.instanceStartLow.needsUpdate=!0,c.geometry.attributes.instanceEndLow.needsUpdate=!0,c.geometry.computeBoundingBox(),c.geometry.computeBoundingSphere()}createPlaneOutline(e){const n=new Float64Array(Qd.INITIAL_BUFFER_SIZE),r=new Ub;r.setPositions(new Float32Array(n)),r.attributes.instanceStart.data.setUsage(Bl),ur.updateRTEGeometry(r,n);const i=new Qr({color:294651,linewidth:2,worldUnits:!1,vertexColors:!1,alphaToCoverage:!1,resolution:new Oe(919,848)},["USE_RTE"]);i.color=new tt(294651),i.color.convertSRGBToLinear(),i.linewidth=2,i.worldUnits=!1,i.resolution=new Oe(1513,1306);const s=new rw(r,i);return s.name=`${e}-outline`,s.frustumCulled=!1,s.renderOrder=1,s.layers.set(kt.PROPS),{renderable:s}}resizeGeometryBuffer(e,n){e.renderable.geometry.dispose();const r=new Float32Array(n);e.renderable.geometry=new Ub,e.renderable.geometry.setPositions(new Float32Array(r)),e.renderable.geometry.attributes.instanceStart.data.setUsage(Bl),ur.updateRTEGeometry(e.renderable.geometry,r)}getPlaneId(e){return this.tmpVec.set(Math.round(e.normal.x),Math.round(e.normal.y),Math.round(e.normal.z)),this.tmpVec.equals(this.right)?Yr.POSITIVE_X:this.tmpVec.equals(this.left)?Yr.NEGATIVE_X:this.tmpVec.equals(this.up)?Yr.POSITIVE_Y:this.tmpVec.equals(this.down)?Yr.NEGATIVE_Y:this.tmpVec.equals(this.back)?Yr.NEGATIVE_Z:this.tmpVec.equals(this.forward)?Yr.POSITIVE_Z:void 0}}Qd.INITIAL_BUFFER_SIZE=6e4,Qd.Z_OFFSET=-.001;class Z1t extends Mr{get vertexShader(){return` +`}get uniformsDef(){return{...super.uniformsDef,size:new Oe,displacement:0}}constructor(e,n=[]){super(e,n)}}class F1t extends fm{constructor(){super(),this.overrideMaterial=null,this._oldClearColor=new tt,this.clearColor=null,this.clearAlpha=0,this.clearDepth=!0,this.drawBufferSize=new Oe,this.onBeforeRender=null,this.onAfterRender=null,this.overrideMaterial=new Vge({color:16711680},["USE_RTE"]),this.overrideMaterial.userData.displacement.value=2,this.overrideMaterial.colorWrite=!1,this.overrideMaterial.depthWrite=!1,this.overrideMaterial.stencilWrite=!0,this.overrideMaterial.stencilFunc=c6,this.overrideMaterial.stencilWriteMask=255,this.overrideMaterial.stencilRef=255,this.overrideMaterial.stencilZFail=zc,this.overrideMaterial.stencilZPass=zc,this.overrideMaterial.stencilFail=zc,this.overrideMaterial.side=rn}get displayName(){return"STENCIL"}get outputTexture(){return null}get material(){return this.overrideMaterial}update(e,n){this.camera=n,this.scene=e}setClippingPlanes(e){this.overrideMaterial.clippingPlanes=e}render(e,n,r){this.onBeforeRender&&this.onBeforeRender();const i=e.autoClear;let s,a;e.autoClear=!1,this.overrideMaterial!==void 0&&(a=this.scene.overrideMaterial),this.clearColor&&(e.getClearColor(this._oldClearColor),s=e.getClearAlpha(),e.setClearColor(this.clearColor,this.clearAlpha)),this.clearDepth&&e.clearDepth(),this.applyLayers(this.camera),e.setRenderTarget(this.renderToScreen?null:r),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),e.getDrawingBufferSize(this.drawBufferSize),this.overrideMaterial.userData.size.value.copy(this.drawBufferSize),e.clear(!1,!1,!0);const o=e.shadowMap.enabled;e.shadowMap.enabled=!1,e.render(this.scene,this.camera),e.shadowMap.enabled=o,this.clearColor&&e.setClearColor(this._oldClearColor,s),this.overrideMaterial!==void 0&&(this.scene.overrideMaterial=a),e.autoClear=i,this.onAfterRender&&this.onAfterRender()}}class j1t extends fm{constructor(){super(),this.overrideMaterial=null,this._oldClearColor=new tt,this.clearColor=null,this.clearAlpha=0,this.clearDepth=!0,this.drawBufferSize=new Oe,this.onBeforeRender=null,this.onAfterRender=null,this.overrideMaterial=new Vge({color:304635},["USE_RTE"]),this.overrideMaterial.userData.displacement.value=2,this.overrideMaterial.colorWrite=!0,this.overrideMaterial.depthWrite=!1,this.overrideMaterial.stencilWrite=!0,this.overrideMaterial.stencilFunc=pce,this.overrideMaterial.stencilRef=255,this.overrideMaterial.side=rn}get displayName(){return"STENCIL"}get outputTexture(){return null}get material(){return this.overrideMaterial}update(e,n){this.camera=n,this.scene=e}setClippingPlanes(e){this.overrideMaterial.clippingPlanes=e}render(e,n,r){this.onBeforeRender&&this.onBeforeRender();const i=e.autoClear;let s,a;e.autoClear=!1,this.overrideMaterial!==void 0&&(a=this.scene.overrideMaterial),this.clearColor&&(e.getClearColor(this._oldClearColor),s=e.getClearAlpha(),e.setClearColor(this.clearColor,this.clearAlpha)),this.clearDepth&&e.clearDepth(),this.applyLayers(this.camera),e.setRenderTarget(this.renderToScreen?null:r),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),e.getDrawingBufferSize(this.drawBufferSize),this.overrideMaterial.userData.size.value.copy(this.drawBufferSize);const o=e.shadowMap.enabled;e.shadowMap.enabled=!1,e.render(this.scene,this.camera),e.shadowMap.enabled=o,this.clearColor&&e.setClearColor(this._oldClearColor,s),this.overrideMaterial!==void 0&&(this.scene.overrideMaterial=a),e.autoClear=i,this.onAfterRender&&this.onAfterRender()}}class Z1t extends fm{constructor(){super(),this.onBeforeRender=null,this.onAfterRender=null}get displayName(){return"OVERLAY"}get outputTexture(){return null}update(e,n){this.camera=n,this.scene=e}render(e,n,r){const i=e.autoClear;e.autoClear=!1,this.applyLayers(this.camera),e.setRenderTarget(this.renderToScreen?null:r),this.onBeforeRender&&this.onBeforeRender(),e.render(this.scene,this.camera),this.onAfterRender&&this.onAfterRender(),e.autoClear=i}}var nl,ms;(function(t){t[t.NORMAL=0]="NORMAL",t[t.ACCUMULATION=1]="ACCUMULATION"})(nl||(nl={})),function(t){t[t.DEPTH_RGBA=0]="DEPTH_RGBA",t[t.DEPTH=1]="DEPTH",t[t.COLOR=2]="COLOR",t[t.GEOMETRY_NORMALS=3]="GEOMETRY_NORMALS",t[t.RECONSTRUCTED_NORMALS=4]="RECONSTRUCTED_NORMALS",t[t.DYNAMIC_AO=5]="DYNAMIC_AO",t[t.DYNAMIC_AO_BLURED=6]="DYNAMIC_AO_BLURED",t[t.PROGRESSIVE_AO=7]="PROGRESSIVE_AO",t[t.FINAL=8]="FINAL"}(ms||(ms={}));const zge={pipelineOutput:ms.FINAL,accumulationFrames:16,dynamicAoEnabled:!0,dynamicAoParams:Pge,staticAoEnabled:!0,staticAoParams:Rge,depthSide:rn};class Wp{set pipelineOptions(e){Object.assign(this._pipelineOptions,e),this.dynamicAoPass.setParams(e.dynamicAoParams),this.staticAoPass.setParams(e.staticAoParams),this.accumulationFrame=0,Wp.ACCUMULATE_FRAMES=e.accumulationFrames,this.depthPass.depthSide=e.depthSide,this.pipelineOutput=e.pipelineOutput}get pipelineOptions(){return JSON.parse(JSON.stringify(this._pipelineOptions))}set pipelineOutput(e){let n=[];switch(this.clearPipeline(),e){case ms.FINAL:n=this.getDefaultPipeline(),this.depthPass.depthSize=ql.FULL,this.applySaoPass.setTexture("tDiffuse",this.staticAoPass.outputTexture),this.applySaoPass.setTexture("tDiffuseInterp",this.dynamicAoPass.outputTexture),this.needsProgressive=!0;break;case ms.DEPTH_RGBA:n.push(this.depthPass),n.push(this.copyOutputPass),this.depthPass.depthSize=ql.FULL,this.copyOutputPass.setTexture("tDiffuse",this.depthPass.outputTexture),this.copyOutputPass.setOutputType(ms.DEPTH_RGBA),this.needsProgressive=!1;break;case ms.DEPTH:n.push(this.depthPass),n.push(this.copyOutputPass),this.depthPass.depthSize=ql.FULL,this.copyOutputPass.setTexture("tDiffuse",this.depthPass.outputTexture),this.copyOutputPass.setOutputType(ms.DEPTH),this.needsProgressive=!1;break;case ms.COLOR:n.push(this.renderPass);break;case ms.GEOMETRY_NORMALS:n.push(this.normalsPass),n.push(this.copyOutputPass),this.normalsPass.enabled=!0,this.copyOutputPass.setTexture("tDiffuse",this.normalsPass.outputTexture),this.copyOutputPass.setOutputType(ms.GEOMETRY_NORMALS),this.needsProgressive=!1;break;case ms.RECONSTRUCTED_NORMALS:n.push(this.depthPass),n.push(this.dynamicAoPass),n.push(this.copyOutputPass),this.dynamicAoPass.enabled=!0,this.depthPass.depthType=Fd.PERSPECTIVE_DEPTH,this.depthPass.depthSize=ql.HALF,this.dynamicAoPass.setOutputType(Lc.RECONSTRUCTED_NORMALS),this.copyOutputPass.setTexture("tDiffuse",this.dynamicAoPass.outputTexture),this.copyOutputPass.setOutputType(ms.GEOMETRY_NORMALS),this.needsProgressive=!1;break;case ms.DYNAMIC_AO:n.push(this.depthPass),n.push(this.normalsPass),n.push(this.dynamicAoPass),n.push(this.copyOutputPass),this.normalsPass.enabled=this._pipelineOptions.dynamicAoParams.normalsType===uf.DEFAULT,this.dynamicAoPass.enabled=!0,this.depthPass.depthType=Fd.PERSPECTIVE_DEPTH,this.copyOutputPass.setTexture("tDiffuse",this.dynamicAoPass.outputTexture),this.copyOutputPass.setOutputType(ms.COLOR),this.dynamicAoPass.setOutputType(Lc.AO),this.needsProgressive=!1;break;case ms.DYNAMIC_AO_BLURED:n.push(this.depthPass),n.push(this.normalsPass),n.push(this.dynamicAoPass),n.push(this.copyOutputPass),this.normalsPass.enabled=this._pipelineOptions.dynamicAoParams.normalsType===uf.DEFAULT,this.dynamicAoPass.enabled=!0,this.depthPass.depthType=Fd.PERSPECTIVE_DEPTH,this.depthPass.depthSize=ql.HALF,this.copyOutputPass.setTexture("tDiffuse",this.dynamicAoPass.outputTexture),this.copyOutputPass.setOutputType(ms.COLOR),this.dynamicAoPass.setOutputType(Lc.AO_BLURRED),this.needsProgressive=!1;break;case ms.PROGRESSIVE_AO:n.push(this.depthPass),n.push(this.dynamicAoPass),n.push(this.staticAoPass),n.push(this.copyOutputPass),this.depthPass.depthType=Fd.LINEAR_DEPTH,this.depthPass.depthSize=ql.FULL,this.copyOutputPass.setTexture("tDiffuse",this.staticAoPass.outputTexture),this.copyOutputPass.setOutputType(ms.COLOR),this.needsProgressive=!0}this.setPipeline(n)}set needsProgressive(e){this._needsProgressive=e,e||(this._renderType=nl.NORMAL),e&&this._renderType===nl.NORMAL&&(this._renderType=nl.ACCUMULATION),this.accumulationFrame=0}get renderType(){return this._renderType}get composer(){return this._composer}constructor(e,n){this._renderer=null,this._batcher=null,this._pipelineOptions=Object.assign({},zge),this._needsProgressive=!1,this._resetFrame=!1,this._composer=null,this.depthPass=null,this.normalsPass=null,this.stencilPass=null,this.renderPass=null,this.stencilMaskPass=null,this.dynamicAoPass=null,this.applySaoPass=null,this.copyOutputPass=null,this.staticAoPass=null,this.overlayPass=null,this.drawingSize=new Oe,this._renderType=nl.NORMAL,this.accumulationFrame=0,this.onBeforePipelineRender=null,this.onAfterPipelineRender=null,this._renderer=e,this._batcher=n,this._composer=new k0t(e),this._composer.readBuffer=null,this._composer.writeBuffer=null}configure(){let e,n,r;this.depthPass=new q1t,this.normalsPass=new D1t,this.dynamicAoPass=new W1t,this.stencilPass=new F1t,this.renderPass=new G1t,this.stencilMaskPass=new j1t,this.applySaoPass=new C1t,this.staticAoPass=new A1t,this.overlayPass=new Z1t,this.copyOutputPass=new K1t,this.copyOutputPass.renderToScreen=!0,this.depthPass.setLayers([kt.STREAM_CONTENT_MESH]),this.normalsPass.setLayers([kt.STREAM_CONTENT_MESH]),this.stencilPass.setLayers([kt.STREAM_CONTENT_MESH]),this.renderPass.setLayers([kt.PROPS,kt.STREAM_CONTENT,kt.STREAM_CONTENT_MESH,kt.STREAM_CONTENT_LINE,kt.STREAM_CONTENT_POINT,kt.STREAM_CONTENT_POINT_CLOUD,kt.STREAM_CONTENT_TEXT,kt.SHADOWCATCHER]),this.stencilMaskPass.setLayers([kt.STREAM_CONTENT_MESH]),this.overlayPass.setLayers([kt.MEASUREMENTS]),this.onBeforePipelineRender=()=>{e=this._batcher.saveVisiblity(),n=this._batcher.getOpaque(),r=this._batcher.getStencil()},this.onAfterPipelineRender=()=>{this._batcher.applyVisibility(e)},this.depthPass.onBeforeRender=()=>{this._batcher.applyVisibility(n),this._batcher.overrideMaterial(n,this.depthPass.material)},this.depthPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(n)},this.normalsPass.onBeforeRender=()=>{this._batcher.applyVisibility(n),this._batcher.overrideMaterial(n,this.normalsPass.material)},this.normalsPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(e)},this.stencilPass.onBeforeRender=()=>{this._batcher.applyVisibility(r),this._batcher.overrideMaterial(r,this.stencilPass.material)},this.stencilPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(r)},this.stencilMaskPass.onBeforeRender=()=>{this._batcher.applyVisibility(r),this._batcher.overrideMaterial(r,this.stencilMaskPass.material)},this.stencilMaskPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(r)},this.renderPass.onBeforeRenderOpauqe=()=>{e=this._batcher.saveVisiblity();const i=this._batcher.getOpaque();this._batcher.applyVisibility(i)},this.renderPass.onBeforeRenderTransparent=()=>{const i=this._batcher.getTransparent();this._batcher.applyVisibility(i)},this.renderPass.onAfterRenderTransparent=()=>{this._batcher.applyVisibility(e)},this.setPipeline(this.getDefaultPipeline())}getDefaultPipeline(){this.renderPass.renderToScreen=!0,this.normalsPass.enabled=this._pipelineOptions.dynamicAoParams.normalsType===uf.DEFAULT,this.dynamicAoPass.setOutputType(this._pipelineOptions.dynamicAoParams.blurEnabled?Lc.AO_BLURRED:Lc.AO),this.applySaoPass.renderToScreen=!0,this.dynamicAoPass.setTexture("tDepth",this.depthPass.outputTextureHalf),this.dynamicAoPass.setTexture("tNormal",this.normalsPass.outputTexture),this.applySaoPass.setTexture("tDiffuse",this.dynamicAoPass.outputTexture),this.applySaoPass.setTexture("tDiffuseInterp",this.dynamicAoPass.outputTexture),this.staticAoPass.setTexture("tDepth",this.depthPass.outputTexture),this.staticAoPass.setTexture("tNormal",this.normalsPass.outputTexture);const e=[];return e.push(this.depthPass),e.push(this.normalsPass),e.push(this.dynamicAoPass),e.push(this.staticAoPass),e.push(this.stencilPass),e.push(this.renderPass),e.push(this.stencilMaskPass),e.push(this.applySaoPass),e.push(this.overlayPass),this.needsProgressive=!0,e}clearPipeline(){for(;this._composer.passes.length>0;)this._composer.removePass(this._composer.passes[0])}setPipeline(e){for(let n=0;nthis.getPlaneId(i)!==n);this.planeOutlines[n].renderable.material.clippingPlanes=r}}updatePlaneOutline(e,n){const r=new U,i=new U,s=new U,a=new U,o=new U,l=new hl,u=this.getPlaneId(n),c=this.planeOutlines[u].renderable;let d=0,f=c.geometry.attributes.instanceStart.data;const h=new Array;for(let m=0;mv.intersectsBox(g),intersectsBounds:g=>v.intersectsBox(g),intersectsTriangle(g,b,y,x,T){const M=e[m].mesh.getBatchObjectMaterial(T);if(M instanceof bx||M.visible===!1||M===null)return;const E=v;let S=0;l.start.copy(g.a),l.end.copy(g.b),E.intersectLine(l,r)&&(r.add(o.copy(v.normal).multiplyScalar(Qd.Z_OFFSET)),h[3*d]=r.x,h[3*d+1]=r.y,h[3*d+2]=r.z,d++,S++),l.start.copy(g.b),l.end.copy(g.c),E.intersectLine(l,r)&&(r.add(o.copy(v.normal).multiplyScalar(Qd.Z_OFFSET)),h[3*d]=r.x,h[3*d+1]=r.y,h[3*d+2]=r.z,S++,d++),l.start.copy(g.c),l.end.copy(g.a),E.intersectLine(l,r)&&(r.add(o.copy(v.normal).multiplyScalar(Qd.Z_OFFSET)),h[3*d]=r.x,h[3*d+1]=r.y,h[3*d+2]=r.z,S++,d++),S===3&&(i.set(h[3*(d-3)],h[3*(d-3)+1],h[3*(d-3)+2]),s.set(h[3*(d-2)],h[3*(d-2)+1],h[3*(d-2)+2]),a.set(h[3*(d-1)],h[3*(d-1)+1],h[3*(d-1)+2]),a.equals(i)||a.equals(s)?(S--,d--):i.equals(s)&&(a.set(r.x,r.y,r.z),a.add(o.copy(v.normal).multiplyScalar(Qd.Z_OFFSET)),h[3*(d-2)]=a.x,h[3*(d-2)+1]=a.y,h[3*(d-2)+2]=a.z,S--,d--)),S!==2&&(d-=S)}})}h.length>f.array.length&&(this.resizeGeometryBuffer(this.planeOutlines[u],h.length),console.warn(`Resized outline buffer from ${f.array.length} to ${h.length}. ${h.length/6} instance count`)),f=c.geometry.attributes.instanceStart.data;const p=c.geometry.attributes.instanceStartLow.data;ur.DoubleToHighLowBuffer(h,p.array,f.array),f.needsUpdate=!0,f.updateRange={offset:0,count:3*d},p.needsUpdate=!0,p.updateRange={offset:0,count:3*d},c.visible=!0,c.geometry.instanceCount=d/2,c.geometry.attributes.instanceStart.needsUpdate=!0,c.geometry.attributes.instanceEnd.needsUpdate=!0,c.geometry.attributes.instanceStartLow.needsUpdate=!0,c.geometry.attributes.instanceEndLow.needsUpdate=!0,c.geometry.computeBoundingBox(),c.geometry.computeBoundingSphere()}createPlaneOutline(e){const n=new Float64Array(Qd.INITIAL_BUFFER_SIZE),r=new Ub;r.setPositions(new Float32Array(n)),r.attributes.instanceStart.data.setUsage(Bl),ur.updateRTEGeometry(r,n);const i=new Qr({color:294651,linewidth:2,worldUnits:!1,vertexColors:!1,alphaToCoverage:!1,resolution:new Oe(919,848)},["USE_RTE"]);i.color=new tt(294651),i.color.convertSRGBToLinear(),i.linewidth=2,i.worldUnits=!1,i.resolution=new Oe(1513,1306);const s=new rw(r,i);return s.name=`${e}-outline`,s.frustumCulled=!1,s.renderOrder=1,s.layers.set(kt.PROPS),{renderable:s}}resizeGeometryBuffer(e,n){e.renderable.geometry.dispose();const r=new Float32Array(n);e.renderable.geometry=new Ub,e.renderable.geometry.setPositions(new Float32Array(r)),e.renderable.geometry.attributes.instanceStart.data.setUsage(Bl),ur.updateRTEGeometry(e.renderable.geometry,r)}getPlaneId(e){return this.tmpVec.set(Math.round(e.normal.x),Math.round(e.normal.y),Math.round(e.normal.z)),this.tmpVec.equals(this.right)?Yr.POSITIVE_X:this.tmpVec.equals(this.left)?Yr.NEGATIVE_X:this.tmpVec.equals(this.up)?Yr.POSITIVE_Y:this.tmpVec.equals(this.down)?Yr.NEGATIVE_Y:this.tmpVec.equals(this.back)?Yr.NEGATIVE_Z:this.tmpVec.equals(this.forward)?Yr.POSITIVE_Z:void 0}}Qd.INITIAL_BUFFER_SIZE=6e4,Qd.Z_OFFSET=-.001;class J1t extends Mr{get vertexShader(){return` varying vec2 vUv; void main() { vUv = vec2(1. - uv.x, uv.y); @@ -7599,7 +7599,7 @@ void main() { gl_FragColor = vec4( vec3(sum), sum ); } -`}get uniformsDef(){return{...super.uniformsDef,tex0:null,tex1:null,tex2:null,tex3:null,weights:new Qt,sigmoidRange:0,sigmoidStrength:0}}constructor(e,n=[]){super(e,n)}}class J1t extends fm{get displayName(){return"Shadowcatcher"}get outputTexture(){return this.outputTarget.texture}set needsUpdate(e){this._needsUpdate=e}constructor(){super(),this.levels=4,this.debugCamera=!1,this.renderTargets=[],this.tempTargets=[],this.camera=null,this.scene=null,this._needsUpdate=!1,this.fsQuad=null,this.blendMaterial=null,this.depthMaterial=null,this.vBlurMaterial=null,this.hBlurMaterial=null,this.blurStdDev=w4.stdDeviation,this.blurRadius=w4.blurRadius,this.prevBlurStdDev=0,this.prevBlurRadius=0,this.cameraHelper=null,this.onBeforeRender=null,this.onAfterRender=null;for(let e=0;ee*Xc.MAX_TEXTURE_SIZE_SCALE&&(r.y=e*Xc.MAX_TEXTURE_SIZE_SCALE,r.x=n*r.y),r}updatePlaneMesh(e,n){const r=e.getSize(new U),i=e.getCenter(new U);(new Oe(r.x,r.y).distanceTo(this.planeSize)>.001||n)&&this.updatePlaneMeshGeometry(new Oe(2*r.x,2*r.y),new U(i.x,i.y,i.z-.5*r.z-.001)),this.planeSize.set(r.x,r.y)}updatePlaneMeshGeometry(e,n){this.planeMesh.geometry&&this.planeMesh.geometry.dispose();const r=new ao(e.x,e.y,Xc.PLANE_SUBD,Xc.PLANE_SUBD),i=new Be().makeTranslation(n.x,n.y,n.z);r.applyMatrix4(i);const s=new Float64Array(r.attributes.position.array);ur.updateRTEGeometry(r,s),this.planeMesh.geometry=r,this.planeMesh.geometry.computeBoundingBox()}}Xc.MESH_NAME="Shadowcatcher",Xc.PLANE_SUBD=2,Xc.MAX_TEXTURE_SIZE_SCALE=.5;const Y1t={fixedSize:!0,dashedLine:!1,discColor:294651,discOpacity:1,lineColor:294651,lineOpacity:1,pointColor:294651,pointOpacity:1,textColor:16777215,textOpacity:1,textPixelHeight:17,pointPixelHeight:5};class Ap extends $a{set style(e){Object.assign(this._style,e),this.updateStyle()}set highlight(e){e?(this.disc.material.color=new tt(16711680),this.line.material.color=new tt(16711680),this.point.material.color=new tt(16711680),this.text.textMesh.material.color.copy(new tt(16711680))):this.updateStyle()}getDiscMaterial(){const e=new Mr({color:this._style.discColor});return e.color.convertSRGBToLinear(),e.toneMapped=!1,e.polygonOffset=!0,e.polygonOffsetFactor=-5,e.polygonOffsetUnits=5,e.opacity=this._style.discOpacity,e.transparent=e.opacity<1,e}getLineMaterial(){const e=new Qr({color:294651,linewidth:1,worldUnits:!1,vertexColors:!1,alphaToCoverage:!1,resolution:new Oe(1,1)},["USE_RTE","UNIFORM_OPACITY"].concat(this._style.dashedLine?["USE_DASH"]:[]));return e.color=new tt(this._style.lineColor),e.color.convertSRGBToLinear(),e.toneMapped=!1,this._style.dashedLine&&(e.dashSize=1,e.gapSize=1,e.dashScale=10),e.linewidth=2,e.worldUnits=!1,e.resolution=new Oe(1513,1306),e.opacity=this._style.lineOpacity,e.transparent=e.opacity<1,e.depthTest=!1,e}getPointMaterial(e){const n=new Mr({color:e||this._style.pointColor},["BILLBOARD_FIXED"]);return n.opacity=this._style.pointOpacity,n.transparent=n.opacity<1,n.color.convertSRGBToLinear(),n.toneMapped=!1,n.depthTest=!1,n.billboardPixelHeight=this._style.pointPixelHeight*window.devicePixelRatio,n.userData.billboardPos.value.copy(this.point.position),n}getTextMaterial(){const e=new ts({color:this._style.textColor,opacity:1,side:rn},["USE_RTE","BILLBOARD_FIXED"]);return e.toneMapped=!1,e.color.convertSRGBToLinear(),e.opacity=this._style.textOpacity,e.transparent=e.opacity<1,e.depthTest=!1,e.billboardPixelHeight=this._style.textPixelHeight*window.devicePixelRatio,e.userData.billboardPos.value.copy(this.text.position),e.getDerivedMaterial()}constructor(e){super(),this._style=Object.assign({},Y1t),this.layers.set(kt.MEASUREMENTS);const n=new Xp(1,16),r=new Float64Array(n.attributes.position.array);ur.updateRTEGeometry(n,r),this.disc=new ut(n,null),this.disc.layers.set(kt.MEASUREMENTS);const i=new Float64Array(18),s=new Ub;s.setPositions(new Float32Array(i)),s.attributes.instanceStart.data.setUsage(Bl),ur.updateRTEGeometry(s,i),this.line=new rw(s,null),this.line.computeLineDistances(),this.line.name="test-mesurements-line",this.line.frustumCulled=!1,this.line.renderOrder=0,this.line.layers.set(kt.MEASUREMENTS);const a=new Xp(1,16);this.point=new ut(a,null),this.point.layers.set(kt.MEASUREMENTS),this.point.visible=!1,this.point.renderOrder=1;const o=new ut(a,this.getPointMaterial(16777215));o.renderOrder=2,o.material.billboardPixelHeight=this._style.pointPixelHeight*window.devicePixelRatio-2*window.devicePixelRatio,o.layers.set(kt.MEASUREMENTS),this.point.add(o),this.text=new T4("test-text"),this.text.textMesh.material=null,this.text.layers.set(kt.MEASUREMENTS),this.text.textMesh.layers.set(kt.MEASUREMENTS),this.text.backgroundMesh,this.add(this.point),this.add(this.disc),this.add(this.line),this.add(this.text),this.style=e}enable(e,n,r,i){this.disc.visible=e,this.line.visible=n,this.point.visible=r,this.text.visible=i,this.text.textMesh.visible=i,this.line.material.visible=n}frameUpdate(e,n){if(e.type==="PerspectiveCamera"&&+this._style.fixedSize>0){const r=e,i=r.position.distanceTo(this.disc.position),s=Math.abs(2*Math.tan(r.fov/2)*i),a=2*n.min.distanceTo(n.max),o=.0035*Math.min(s,a);this.disc.scale.set(o,o,o),this.disc.matrixWorldNeedsUpdate=!0}if(e.type==="OrthographicCamera"&&+this._style.fixedSize>0){const r=e,i=(r.top-r.bottom)/r.zoom*.0075;this.disc.scale.set(i,i,i),this.disc.matrixWorldNeedsUpdate=!0}}updateDisc(e,n){this.disc.position.copy(e),Ap.vecBuff0.set(0,0,1),this.disc.quaternion.setFromUnitVectors(Ap.vecBuff0,n)}updatePoint(e){this.point.position.copy(e),this.point.material.userData.billboardPos.value.copy(this.point.position),this.point.children[0].material.userData.billboardPos.value.copy(this.point.position)}updateLine(e){const n=new Float64Array(3*e.length);e.forEach((s,a)=>{s.toArray(n,3*a)});const r=this.line.geometry.attributes.instanceStart.data,i=this.line.geometry.attributes.instanceStartLow.data;ur.DoubleToHighLowBuffer(n,i.array,r.array),r.needsUpdate=!0,r.updateRange={offset:0,count:3*e.length},i.needsUpdate=!0,i.updateRange={offset:0,count:3*e.length},this.line.visible=!0,this.line.geometry.instanceCount=e.length/2,this.line.geometry.attributes.instanceStart.needsUpdate=!0,this.line.geometry.attributes.instanceEnd.needsUpdate=!0,this.line.geometry.attributes.instanceStartLow.needsUpdate=!0,this.line.geometry.attributes.instanceEndLow.needsUpdate=!0,this.line.geometry.computeBoundingBox(),this.line.geometry.computeBoundingSphere(),this.line.computeLineDistances()}updateText(e,n,r,i){this.text.update({textValue:e,height:1,anchorX:"50%",anchorY:"43%"}).then(()=>{this.text.style={backgroundColor:new tt(294651),billboard:!0,backgroundPixelHeight:20},this.text.setTransform(n,r,i),this.text.backgroundMesh.renderOrder=3,this.text.textMesh.renderOrder=4})}updateStyle(){this.disc.material=this.getDiscMaterial(),this.line.material=this.getLineMaterial(),this.point.material=this.getPointMaterial(),this.text.textMesh.material=this.getTextMaterial()}raycast(e,n){this.line.raycast(e,n),this.text.raycast(e,n)}updateClippingPlanes(e){var n;this.disc.material.clippingPlanes=e,this.point.material.clippingPlanes=e,this.point.children[0].material.clippingPlanes=e,this.line.material.clippingPlanes=e,this.text.backgroundMesh&&(this.text.backgroundMesh.material.clippingPlanes=e),this.text.textMesh&&(((n=this.text.textMesh)===null||n===void 0?void 0:n.material).clippingPlanes=e)}}var Li,A1;Ap.vecBuff0=new U,function(t){t[t.HIDDEN=0]="HIDDEN",t[t.DANGLING_START=1]="DANGLING_START",t[t.DANGLING_END=2]="DANGLING_END",t[t.COMPLETE=3]="COMPLETE"}(Li||(Li={}));class kn extends cn{constructor(){super(...arguments),this.startPoint=new U,this.endPoint=new U,this.startNormal=new U,this.endNormal=new U,this.value=0,this.units="m",this.precision=2,this._state=Li.HIDDEN,this.renderingSize=new Oe}set state(e){this._state=e}get state(){return this._state}set isVisible(e){}get bounds(){return new Jt().expandByPoint(this.startPoint).expandByPoint(this.endPoint)}frameUpdate(e,n,r){this.renderingCamera=e,this.renderingSize.copy(n)}update(){}raycast(e,n){}highlight(e){}updateClippingPlanes(e){}}kn.vec3Buff0=new U,kn.vec3Buff1=new U,kn.vec3Buff2=new U,kn.vec3Buff3=new U,kn.vec3Buff4=new U,kn.vec4Buff0=new Qt,kn.vec4Buff1=new Qt,kn.vec2Buff0=new Oe;class B1t extends kn{set isVisible(e){this.startGizmo.enable(e,e,e,e),this.endGizmo.enable(e,e,e,e)}get bounds(){return new Jt().expandByPoint(this.startPoint).expandByPoint(this.midPoint)}constructor(){super(),this.startGizmo=null,this.endGizmo=null,this.midPoint=new U,this.normalIndicatorPixelSize=15,this.type="PerpendicularMeasurement",this.startPoint.set(NaN,NaN,NaN),this.startGizmo=new Ap,this.endGizmo=new Ap({dashedLine:!0,lineOpacity:.25}),this.startLineLength=.25,this.add(this.startGizmo),this.add(this.endGizmo),this.layers.set(kt.MEASUREMENTS)}frameUpdate(e,n,r){super.frameUpdate(e,n,r),this.startGizmo.frameUpdate(e,r),this.endGizmo.frameUpdate(e,r),this._state===Li.DANGLING_START&&this.update()}update(){if(!isNaN(this.startPoint.length())){if(this.startGizmo.updateDisc(this.startPoint,this.startNormal),this.startGizmo.updatePoint(this.startPoint),this.endGizmo.updateDisc(this.endPoint,this.endNormal),this._state===Li.DANGLING_START){const e=kn.vec3Buff0.copy(this.startPoint),n=kn.vec4Buff0.set(this.startPoint.x,this.startPoint.y,this.startPoint.z,1).applyMatrix4(this.renderingCamera.matrixWorldInverse).applyMatrix4(this.renderingCamera.projectionMatrix),r=n.w;n.multiplyScalar(1/r);const i=kn.vec4Buff1.set(this.startNormal.x,this.startNormal.y,this.startNormal.z,0).applyMatrix4(this.renderingCamera.matrixWorldInverse).applyMatrix4(this.renderingCamera.projectionMatrix).normalize(),s=i.w===0?1:i.w;i.multiplyScalar(1/s).normalize(),this.renderingCamera instanceof ns&&i.negate();const a=kn.vec2Buff0.set(this.normalIndicatorPixelSize/this.renderingSize.x*2,this.normalIndicatorPixelSize/this.renderingSize.y*2),o=kn.vec4Buff0.set(n.x,n.y,n.z,1).add(kn.vec4Buff1.set(i.x*a.x,i.y*a.y,0,0));o.multiplyScalar(r),o.applyMatrix4(this.renderingCamera.projectionMatrixInverse).applyMatrix4(this.renderingCamera.matrixWorld),this.startGizmo.updateLine([e,kn.vec3Buff1.set(o.x,o.y,o.z)]),this.endGizmo.enable(!1,!1,!1,!1)}if(this._state===Li.DANGLING_END){const e=this.startPoint.distanceTo(this.endPoint),n=kn.vec3Buff0.copy(this.startPoint).sub(this.endPoint).normalize();let r=this.startNormal.dot(n);const i=Math.acos(Math.min(Math.max(r,-1),1));this.startLineLength=Math.abs(e*Math.cos(i)),this.midPoint.copy(kn.vec3Buff0.copy(this.startPoint).add(kn.vec3Buff1.copy(this.startNormal).multiplyScalar(this.startLineLength)));const s=kn.vec3Buff1.copy(this.midPoint).sub(this.endPoint).normalize();this.endLineLength=this.midPoint.distanceTo(this.endPoint),r=this.endNormal.dot(s);const a=Math.acos(Math.min(Math.max(r,-1),1)),o=this.endLineLength*Math.cos(a),l=kn.vec3Buff1.copy(this.endPoint).add(kn.vec3Buff2.copy(this.endNormal).multiplyScalar(o)),u=kn.vec3Buff2.copy(this.startPoint),c=kn.vec3Buff3.copy(this.startPoint).add(kn.vec3Buff4.copy(this.startNormal).multiplyScalar(this.startLineLength));this.startGizmo.updateLine([u,c]);const d=kn.vec3Buff3.copy(this.endPoint);this.endGizmo.updateLine([d,l,l,this.midPoint,this.midPoint,d]),this.endGizmo.updatePoint(this.midPoint);const f=kn.vec3Buff0.copy(this.startPoint).add(kn.vec3Buff1.copy(this.startNormal).multiplyScalar(.5*this.startLineLength));this.value=this.midPoint.distanceTo(this.startPoint),this.startGizmo.updateText(`${(this.value*Os("m",this.units)).toFixed(this.precision)} ${this.units}`,f),this.endGizmo.enable(!0,!0,!0,!0)}this._state===Li.COMPLETE&&(this.startGizmo.updateText(`${(this.value*Os("m",this.units)).toFixed(this.precision)} ${this.units}`),this.startGizmo.enable(!1,!0,!0,!0),this.endGizmo.enable(!1,!1,!0,!1))}}raycast(e,n){const r=[];this.startGizmo.raycast(e,r),this.endGizmo.raycast(e,r),r.length&&n.push({distance:r[0].distance,face:r[0].face,faceIndex:r[0].faceIndex,object:this,point:r[0].point,uv:r[0].uv})}highlight(e){this.startGizmo.highlight=e,this.endGizmo.highlight=e}updateClippingPlanes(e){this.startGizmo.updateClippingPlanes(e),this.endGizmo.updateClippingPlanes(e)}}class H$ extends kn{set isVisible(e){this.startGizmo.enable(e,e,e,e),this.endGizmo.enable(e,e,e,e)}constructor(){super(),this.startGizmo=null,this.endGizmo=null,this.type="PointToPointMeasurement",this.startGizmo=new Ap,this.endGizmo=new Ap({dashedLine:!0,lineOpacity:.25}),this.startLineLength=0,this.add(this.startGizmo),this.add(this.endGizmo),this.layers.set(kt.MEASUREMENTS)}frameUpdate(e,n,r){super.frameUpdate(e,n,r),this.startGizmo.frameUpdate(e,r),this.endGizmo.frameUpdate(e,r)}update(){if(this.startGizmo.updateDisc(this.startPoint,this.startNormal),this.startGizmo.updatePoint(this.startPoint),this.endGizmo.updateDisc(this.endPoint,this.endNormal),this._state===Li.DANGLING_START){const e=kn.vec3Buff0.copy(this.startPoint),n=kn.vec3Buff1.copy(this.startPoint).add(kn.vec3Buff2.copy(this.startNormal).multiplyScalar(this.startLineLength));this.startGizmo.updateLine([e,n]),this.endGizmo.enable(!1,!1,!1,!1)}if(this._state===Li.DANGLING_END){this.startLineLength=this.startPoint.distanceTo(this.endPoint),this.value=this.startLineLength;const e=kn.vec3Buff0.copy(this.endPoint).sub(this.startPoint).normalize(),n=kn.vec3Buff1.copy(this.startPoint).add(kn.vec3Buff2.copy(e).multiplyScalar(this.startLineLength)),r=kn.vec3Buff3.copy(this.startPoint).add(kn.vec3Buff4.copy(e).multiplyScalar(.5*this.startLineLength));this.startGizmo.updateLine([this.startPoint,n]),this.endGizmo.updatePoint(n),this.startGizmo.updateText(`${(this.value*Os("m",this.units)).toFixed(this.precision)} ${this.units}`,r),this.endGizmo.enable(!0,!0,!0,!0)}this._state===Li.COMPLETE&&(this.startGizmo.enable(!1,!0,!0,!0),this.endGizmo.enable(!1,!1,!0,!1),this.startGizmo.updateText(`${(this.value*Os("m",this.units)).toFixed(this.precision)} ${this.units}`))}raycast(e,n){const r=[];this.startGizmo.raycast(e,r),this.endGizmo.raycast(e,r),r.length&&n.push({distance:r[0].distance,face:r[0].face,faceIndex:r[0].faceIndex,object:this,point:r[0].point,uv:r[0].uv})}highlight(e){this.startGizmo.highlight=e,this.endGizmo.highlight=e}updateClippingPlanes(e){this.startGizmo.updateClippingPlanes(e),this.endGizmo.updateClippingPlanes(e)}}(function(t){t[t.PERPENDICULAR=0]="PERPENDICULAR",t[t.POINTTOPOINT=1]="POINTTOPOINT"})(A1||(A1={}));const H1t={visible:!0,type:A1.POINTTOPOINT,vertexSnap:!0,units:"m",precision:2};class Q1t{constructor(e){this.renderer=null,this.measurements=[],this.measurement=null,this.selectedMeasurement=null,this.raycaster=null,this._options=Object.assign({},H1t),this.frameLock=!1,this._enabled=!1,this._paused=!1,this.pointBuff=new U,this.normalBuff=new U,this.screenBuff0=new Oe,this.screenBuff1=new Oe,this.renderer=e,this.raycaster=new Sy,this.raycaster.layers.set(kt.MEASUREMENTS),this.renderer.input.on("pointer-move",this.onPointerMove.bind(this)),this.renderer.input.on($t.ObjectClicked,this.onPointerClick.bind(this)),this.renderer.input.on($t.ObjectDoubleClicked,this.onPointerDoubleClick.bind(this))}get enabled(){return this._enabled}get visible(){return this._options.visible}set enabled(e){this._enabled=e,this.measurement&&(this.measurement.isVisible=e,this.measurement.update()),this.renderer.needsRender=!0,this.renderer.resetPipeline()}set paused(e){this._paused=e}set options(e){const n=this._options.type!==e.type&&this.measurement&&this.measurement.state===Li.DANGLING_START;Object.assign(this._options,e),n&&(this.cancelMeasurement(),this.startMeasurement()),this.applyOptions()}update(){this._enabled&&(this.frameLock=!1,this.renderer.renderer.getDrawingBufferSize(this.screenBuff0),this.measurement&&this.measurement.frameUpdate(this.renderer.camera,this.screenBuff0,this.renderer.sceneBox),this.measurements.forEach(e=>{e.frameUpdate(this.renderer.camera,this.screenBuff0,this.renderer.sceneBox)}))}fromMeasurementData(e,n){const r=new H$;r.startPoint.copy(e),r.endPoint.copy(n),r.state=Li.DANGLING_END,r.update(),r.state=Li.COMPLETE,r.update(),this.measurements.push(this.measurement)}updateClippingPlanes(e){this.measurements.forEach(n=>{n.updateClippingPlanes(e)})}onPointerMove(e){if(!this._enabled||this._paused||this.frameLock)return;let n=this.renderer.intersections.intersect(this.renderer.scene,this.renderer.camera,e,!0,this.renderer.currentSectionBox,[kt.STREAM_CONTENT_MESH])||[];n=n.filter(r=>{const i=r.object.getBatchObjectMaterial(r.batchObject);return!(i instanceof yx)&&i.visible}),n.length&&(this.measurement||this.startMeasurement(),this.measurement.isVisible=!0,this.pointBuff.copy(n[0].point),this.normalBuff.copy(n[0].face.normal),this._options.vertexSnap&&this.snap(n[0],this.pointBuff,this.normalBuff),this.measurement.state===Li.DANGLING_START?(this.measurement.startPoint.copy(this.pointBuff),this.measurement.startNormal.copy(this.normalBuff)):this.measurement.state===Li.DANGLING_END&&(this.measurement.endPoint.copy(this.pointBuff),this.measurement.endNormal.copy(this.normalBuff)),this.measurement.update(),this.renderer.needsRender=!0,this.renderer.resetPipeline(this.renderer.camera.type==="OrthographicCamera"),this.frameLock=!0)}onPointerClick(e){this._enabled&&(e.event.button!==2?this.measurement&&(this.measurement.state===Li.DANGLING_START?this.measurement.state=Li.DANGLING_END:this.measurement.state===Li.DANGLING_END&&this.finishMeasurement()):this.cancelMeasurement())}onPointerDoubleClick(e){this._options.type!==A1.PERPENDICULAR||this.autoLazerMeasure(e)}autoLazerMeasure(e){if(!this.measurement)return;this.measurement.state=Li.DANGLING_START;let n=this.renderer.intersections.intersect(this.renderer.scene,this.renderer.camera,e,!0,this.renderer.currentSectionBox,[kt.STREAM_CONTENT_MESH])||[];if(n=n.filter(o=>{const l=o.object.getBatchObjectMaterial(o.batchObject);return!(l instanceof yx)&&l.visible}),!n.length)return;const r=new U().copy(n[0].point),i=new U().copy(n[0].face.normal),s=new U().copy(r).add(new U().copy(i).multiplyScalar(1e-6));let a=this.renderer.intersections.intersectRay(this.renderer.scene,this.renderer.camera,new qo(s,i),!0,this.renderer.currentSectionBox,[kt.STREAM_CONTENT_MESH])||[];a=a.filter(o=>{const l=o.object.getBatchObjectMaterial(o.batchObject);return!(l instanceof yx)&&l.visible}),a.length?(this.measurement.startPoint.copy(r),this.measurement.startNormal.copy(i),this.measurement.endPoint.copy(a[0].point),this.measurement.endNormal.copy(a[0].face.normal),this.measurement.state=Li.DANGLING_END,this.measurement.update(),this.finishMeasurement()):this.flashMeasurement()}startMeasurement(){this._options.type===A1.PERPENDICULAR?this.measurement=new B1t:this._options.type===A1.POINTTOPOINT&&(this.measurement=new H$),this.measurement.state=Li.DANGLING_START,this.measurement.frameUpdate(this.renderer.camera,this.screenBuff0,this.renderer.sceneBox),this.renderer.scene.add(this.measurement)}cancelMeasurement(){this.renderer.scene.remove(this.measurement),this.measurement=null,this.renderer.needsRender=!0,this.renderer.resetPipeline()}finishMeasurement(){this.measurement.state=Li.COMPLETE,this.measurement.update(),this.measurement.value>0?this.measurements.push(this.measurement):(this.renderer.scene.remove(this.measurement),Zt.error("Ignoring zero value measurement!")),this.measurement=null}snap(e,n,r){const i=e.batchObject.bvh.getVertexAtIndex(e.face.a).project(this.renderer.camera),s=e.batchObject.bvh.getVertexAtIndex(e.face.b).project(this.renderer.camera),a=e.batchObject.bvh.getVertexAtIndex(e.face.c).project(this.renderer.camera),o=e.point.project(this.renderer.camera),l=[i,s,a];l.sort((f,h)=>o.distanceTo(f)-o.distanceTo(h));const u=this.renderer.NDCToScreen(l[0].x,l[0].y),c=this.renderer.NDCToScreen(o.x,o.y);this.screenBuff0.set(u.x,u.y),this.screenBuff1.set(c.x,c.y);const d=l[0].unproject(this.renderer.camera);this.screenBuff0.distanceTo(this.screenBuff1)<10*window.devicePixelRatio&&(n.copy(d),r.copy(e.face.normal))}flashMeasurement(){let e=0;const n=setInterval(()=>{this.measurement.highlight(!!(e++%2)),e>=5&&clearInterval(n),this.renderer.needsRender=!0,this.renderer.resetPipeline()},100)}pickMeasurement(e){var n;return this.measurements.forEach(r=>{r.highlight(!1)}),this.raycaster.setFromCamera(e,this.renderer.camera),(n=this.raycaster.intersectObjects(this.measurements,!1)[0])===null||n===void 0?void 0:n.object}selectMeasurement(e,n){this.cancelMeasurement(),e.highlight(n),this.selectedMeasurement=e}removeMeasurement(){this.selectedMeasurement?(this.measurements.splice(this.measurements.indexOf(this.selectedMeasurement),1),this.renderer.scene.remove(this.selectedMeasurement),this.selectedMeasurement=null,this.renderer.needsRender=!0,this.renderer.resetPipeline()):this.cancelMeasurement()}applyOptions(){[this.measurement,...this.measurements].forEach(e=>{e&&(e.units=this._options.units,e.precision=this._options.precision,e.update())}),this.renderer.enableLayers([kt.MEASUREMENTS],this._options.visible),this.renderer.needsRender=!0,this.renderer.resetPipeline()}}var kt;(function(t){t[t.STREAM_CONTENT_MESH=10]="STREAM_CONTENT_MESH",t[t.STREAM_CONTENT_LINE=11]="STREAM_CONTENT_LINE",t[t.STREAM_CONTENT_POINT=12]="STREAM_CONTENT_POINT",t[t.STREAM_CONTENT_TEXT=13]="STREAM_CONTENT_TEXT",t[t.STREAM_CONTENT_POINT_CLOUD=14]="STREAM_CONTENT_POINT_CLOUD",t[t.STREAM_CONTENT=1]="STREAM_CONTENT",t[t.PROPS=2]="PROPS",t[t.SHADOWCATCHER=3]="SHADOWCATCHER",t[t.MEASUREMENTS=4]="MEASUREMENTS"})(kt||(kt={}));class _1t{get renderer(){return this._renderer}set needsRender(e){this._needsRender||(this._needsRender=e)}set indirectIBL(e){this._scene.environment=e}set indirectIBLIntensity(e){const n=this.batcher.getBatches(void 0,st.MESH);for(let r=0;r{n.name.includes("_bvh")&&(n.visible=this.SHOW_BVH)})}get shadowcatcher(){return this._shadowcatcher}get intersections(){return this._intersections}get currentSectionBox(){return this.viewer.sectionBox.getCurrentBox()}get measurements(){return this._measurements}constructor(e){this.SHOW_HELPERS=!1,this.IGNORE_ZERO_OPACITY_OBJECTS=!0,this.SHOW_BVH=!1,this.sunConfiguration=b1t,this.filterBatchRecording=[],this.lastSectionPlanes=[],this.sectionPlanesChanged=[],this.sectionBoxOutlines=null,this._shadowcatcher=null,this._measurements=null,this.cancel={},this.explodeTime=-1,this.explodeRange=0,this._scene=new RT,this.rootGroup=new $a,this.rootGroup.name="ContentGroup",this.rootGroup.layers.set(kt.STREAM_CONTENT),this._scene.add(this.rootGroup),this._intersections=new L1t,this.viewer=e,this.lastSectionPlanes.push(new ri,new ri,new ri,new ri,new ri,new ri)}create(e){this._renderer=new xr({antialias:!0,alpha:!0,preserveDrawingBuffer:!0,stencil:!0}),this._renderer.setClearColor(16777215,0),this._renderer.setPixelRatio(window.devicePixelRatio),this._renderer.outputEncoding=Jr,this._renderer.toneMapping=gK,this._renderer.toneMappingExposure=.5,this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=cv,this.renderer.shadowMap.autoUpdate=!1,this.renderer.shadowMap.needsUpdate=!0,this.renderer.physicallyCorrectLights=!0,this.renderer.autoClearStencil=!1,this.container=e,this._renderer.setSize(e.offsetWidth,e.offsetHeight),e.appendChild(this._renderer.domElement),this.batcher=new O1t(this.renderer.capabilities.maxVertexUniforms,this.renderer.capabilities.floatVertexTextures),this.pipeline=new Wp(this._renderer,this.batcher),this.pipeline.configure(),this.pipeline.pipelineOptions=kge,this.sectionBoxOutlines=new Qd;const n=new $a;if(n.name="SectionBoxOutlines",this.scene.add(n),n.add(this.sectionBoxOutlines.getPlaneOutline(Yr.NEGATIVE_Z).renderable),n.add(this.sectionBoxOutlines.getPlaneOutline(Yr.POSITIVE_Z).renderable),n.add(this.sectionBoxOutlines.getPlaneOutline(Yr.POSITIVE_X).renderable),n.add(this.sectionBoxOutlines.getPlaneOutline(Yr.NEGATIVE_X).renderable),n.add(this.sectionBoxOutlines.getPlaneOutline(Yr.POSITIVE_Y).renderable),n.add(this.sectionBoxOutlines.getPlaneOutline(Yr.NEGATIVE_Y).renderable),this.input=new U9(this._renderer.domElement,I1t),this.input.on($t.ObjectClicked,this.onObjectClick.bind(this)),this.input.on($t.ObjectDoubleClicked,this.onObjectDoubleClick.bind(this)),this.addDirectLights(),this.SHOW_HELPERS){const i=new $a;i.name="Helpers",this._scene.add(i);const s=new OT(this.sceneBox,new tt(255));s.name="SceneBoxHelper",s.layers.set(kt.PROPS),i.add(s);const a=new bde(this.sun,50,16711680);a.name="DirLightHelper",a.layers.set(kt.PROPS),i.add(a);const o=new rq(this.sun.shadow.camera);o.name="CamHelper",o.layers.set(kt.PROPS),i.add(o)}let r;this.viewer.cameraHandler.controls.restThreshold=.001,this.viewer.cameraHandler.controls.addEventListener("rest",()=>{this._needsRender=!0,this.pipeline.onStationaryBegin(),this._measurements.paused=!1}),this.viewer.cameraHandler.controls.addEventListener("controlstart",()=>{this._needsRender=!0,this.pipeline.onStationaryEnd()}),this.viewer.cameraHandler.controls.addEventListener("controlend",()=>{this._needsRender=!0,this.viewer.cameraHandler.controls.hasRested&&this.pipeline.onStationaryBegin(),this._measurements.paused=!1}),this.viewer.cameraHandler.controls.addEventListener("control",()=>{this._needsRender=!0,this.pipeline.onStationaryEnd(),this._measurements.paused=!0}),this.viewer.cameraHandler.controls.addEventListener("update",()=>{this.viewer.cameraHandler.controls.hasRested||this.pipeline.renderType!==rl.ACCUMULATION||(this._needsRender=!0,this.pipeline.onStationaryEnd())}),this._shadowcatcher=new Xc(kt.SHADOWCATCHER,[kt.STREAM_CONTENT_MESH]),this._shadowcatcher.shadowcatcherPass.onBeforeRender=()=>{r=this.batcher.saveVisiblity();const i=this.batcher.getOpaque();this.batcher.applyVisibility(i)},this._shadowcatcher.shadowcatcherPass.onAfterRender=()=>{this.batcher.applyVisibility(r)},this._scene.add(this._shadowcatcher.shadowcatcherMesh),this._measurements=new Q1t(this)}update(e){this.needsRender=this.viewer.cameraHandler.controls.update(e),this.batcher.update(e),this.updateRTEShadows(),this.updateTransforms(),this.updateFrustum(),this._measurements.update(),this.pipeline.update(this),this.sunConfiguration.shadowcatcher&&this._shadowcatcher.update(this._scene),this.explodeTime>-1&&(this.explode(this.explodeTime,this.explodeRange),this.explodeTime=-1)}updateRTEShadows(){if(!this._renderer.shadowMap.needsUpdate)return;const e=new U,n=new U,r=new U;e.set(this.sun.shadow.camera.matrixWorld.elements[12],this.sun.shadow.camera.matrixWorld.elements[13],this.sun.shadow.camera.matrixWorld.elements[14]),ur.DoubleToHighLowVector(e,n,r);const i=new Be;i.copy(this.sun.shadow.camera.matrixWorldInverse),i.elements[12]=0,i.elements[13]=0,i.elements[14]=0;const s=new Be;s.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),s.multiply(this.sun.shadow.camera.projectionMatrix),s.multiply(i);const a=new Be,o=this.batcher.getBatches(void 0,st.MESH);for(let l=0;l{this.addBatch(r,n)}),this.updateDirectLights(),this.updateHelpers(),this.viewer.sectionBox.display.visible&&this.viewer.setSectionBox(),this.updateShadowCatcher(),this._needsRender=!0}async addRenderTreeAsync(e,n=1,r=!0){this.cancel[e]=!1;const i=new $a;i.name=e,i.layers.set(kt.STREAM_CONTENT),this.rootGroup.add(i);const s=this.batcher.makeBatchesAsync(this.viewer.getWorldTree().getRenderTree(e),S1,void 0,n);for await(const a of s)if(a&&(this.addBatch(a,i),r&&this.zoom(),a.geometryType===st.MESH&&this.updateDirectLights(),this._needsRender=!0,this.cancel[e])){s.return(),this.removeRenderTree(e),delete this.cancel[e];break}this.updateHelpers(),this.updateShadowCatcher(),this.viewer.sectionBox.display.visible&&this.viewer.setSectionBox(),delete this.cancel[e]}addBatch(e,n){const r=e.renderObject;if(n.add(e.renderObject),e.geometryType===st.MESH){const i=r.material;if(r.castShadow=!i.transparent,r.receiveShadow=!i.transparent,r.customDepthMaterial=new bs({depthPacking:ST},["USE_RTE","ALPHATEST_REJECTION"]),this.SHOW_BVH){const s=new ID(r,10);s.name=e.renderObject.id+"_bvh",s.traverse(a=>{a.layers.set(kt.PROPS)}),s.displayParents=!0,s.visible=!1,s.update(),n.add(s)}r.BVH.boxHelpers.forEach(s=>{this.scene.add(s)})}this.viewer.World.expandWorld(e.bounds)}removeRenderTree(e){this.rootGroup.remove(this.rootGroup.getObjectByName(e)),this.updateShadowCatcher(),this.batcher.getBatches(e).forEach(n=>{this.viewer.World.reduceWorld(n.bounds)}),this.batcher.purgeBatches(e),this.updateDirectLights(),this.updateHelpers()}cancelRenderTree(e){this.cancel[e]!==void 0&&(this.cancel[e]=!0)}clearFilter(){this.batcher.resetBatchesDrawRanges(),this.filterBatchRecording=[]}applyFilter(e,n){this.filterBatchRecording.push(...this.batcher.setObjectsFilterMaterial(e,n))}applyDirectFilter(e,n){return this.batcher.insertObjectsFilterMaterial(e,n)}removeDirectFilter(e){this.batcher.removeObjectsMaterial(e)}applyMaterial(e,n){const r={needsCopy:!0};this.filterBatchRecording.push(...this.batcher.setObjectsMaterial(e,i=>({offset:i.batchStart,count:i.batchCount,material:n,materialOptions:r})))}beginFilter(){this.filterBatchRecording=[]}endFilter(){this.batcher.autoFillDrawRanges(this.filterBatchRecording),this.updateClippingPlanes(this.viewer.sectionBox.planes),this.viewer.sectionBox.display.visible&&this.updateSectionBoxCapper(),this.renderer.shadowMap.needsUpdate=!0,this.updateShadowCatcher()}getBatchMaterials(){return Object.keys(this.batcher.batches).reduce((e,n)=>({...e,[n]:this.batcher.batches[n].batchMaterial}),{})}updateClippingPlanes(e){this.allObjects&&(e||(e=this.viewer.sectionBox.planes),this.allObjects.traverse(n=>{const r=n.material;if(r)if(Array.isArray(r))for(let i=0;i1e-4&&this.sectionPlanesChanged.push(e[n]),this.lastSectionPlanes[n].copy(e[n])}onSectionBoxDragStart(){this.sectionBoxOutlines.enable(!1)}onSectionBoxDragEnd(){const e=()=>{this.setSectionPlaneChanged(this.viewer.sectionBox.planes),this.updateSectionBoxCapper(this.sectionPlanesChanged),this.updateShadowCatcher(),this.viewer.removeListener($t.SectionBoxUpdated,e)};this.viewer.on($t.SectionBoxUpdated,e)}updateSectionBoxCapper(e){const n=performance.now();e||(e=this.viewer.sectionBox.planes);for(let r=0;r{o.name.includes("_bvh")&&(o.visible=!0)}));let i=!1;e.multiSelect&&(i=!0);const s=this.queryHits(r);if(!s)return void this.viewer.emit($t.ObjectClicked,i?{multiple:!0,event:e.event}:null);const a={multiple:i,event:e.event,hits:s.map(o=>({guid:o.node.model.id,object:o.node.model.raw,point:o.point}))};this.viewer.emit($t.ObjectClicked,a)}onObjectDoubleClick(e){const n=this._measurements.pickMeasurement(e);if(n)return void this.zoomToBox(n.bounds);if(this._measurements.enabled)return;const r=this._intersections.intersect(this._scene,this.viewer.cameraHandler.activeCam.camera,e,!0,this.viewer.sectionBox.getCurrentBox());if(!r)return void this.viewer.emit($t.ObjectDoubleClicked,null);let i=!1;e.multiSelect&&(i=!0);const s=this.queryHits(r);if(!s)return void this.viewer.emit($t.ObjectClicked,null);const a={multiple:i,hits:s.map(o=>({guid:o.node.model.id,object:o.node.model.raw,point:o.point}))};this.viewer.emit($t.ObjectDoubleClicked,a)}boxFromObjects(e){let n=new Jt;const r=[];e.length>0?this.viewer.getWorldTree().walk(i=>!i.model.atomic||!i.model.raw||(e.indexOf(i.model.raw.id)!==-1&&r.push(...this.viewer.getWorldTree().getRenderTree().getRenderViewsForNode(i,i)),!0)):n=this.sceneBox;for(let i=0;ir.renderViews.length-i.renderViews.length);const n=[];for(let r=0;ri.mesh).flatMap(i=>i.batchObjects).filter(i=>r.includes(i.renderView))}markTransformsDirty(e){this.batcher.batches[e].mesh.transformsDirty=!0}enableLayers(e,n){this.pipeline.composer.passes.forEach(r=>{r instanceof fm&&e.forEach(i=>{r.enableLayer(i,n)})})}}class $1t extends lw{constructor(e,n){let r;super(),this.viewer=e,this.raycaster=new Sy,this.raycaster.params.Line.threshold=.1,this.raycaster.params.Line2={},this.raycaster.params.Line2.threshold=1,this.raycaster.layers.set(kt.PROPS),this.subset=n!==void 0&&n.subset!==void 0?n.subset:null,this.pointerDown=!1,this.checkForSectionBoxInclusion=!0,n!==void 0&&n.checkForSectionBoxInclusion&&(this.sectionBox=n.checkForSectionBoxInclusion),this.viewer.speckleRenderer.renderer.domElement.addEventListener("pointerdown",i=>{i.preventDefault(),r=new Date().getTime()}),this.viewer.speckleRenderer.renderer.domElement.addEventListener("pointerup",i=>{if(i.preventDefault(),this.viewer.cameraHandler.orbiting)return;const s=new Date().getTime()-r;if(this.pointerDown=!1,s>250)return;const a=this.getClickedObjects(i);this.emit("object-clicked",a)}),this.tapTimeout,this.lastTap=0,this.touchLocation,this.viewer.speckleRenderer.renderer.domElement.addEventListener("touchstart",i=>{this.touchLocation=i.targetTouches[0]}),this.viewer.speckleRenderer.renderer.domElement.addEventListener("touchend",i=>{if(i.targetTouches.length>0)return;const s=new Date().getTime(),a=s-this.lastTap;if(clearTimeout(this.tapTimeout),a<500&&a>0){const o=this.getClickedObjects(this.touchLocation);this.emit("object-doubleclicked",o)}else this.tapTimeout=setTimeout(function(){clearTimeout(this.tapTimeout)},500);this.lastTap=s}),this.viewer.speckleRenderer.renderer.domElement.addEventListener("dblclick",i=>{const s=this.getClickedObjects(i);this.emit("object-doubleclicked",s)}),this.multiSelect=!1,document.addEventListener("keydown",i=>{i.isComposing||i.keyCode===229||(i.key==="Shift"&&(this.multiSelect=!0),i.key==="Escape"&&this.unselect())}),document.addEventListener("keyup",i=>{i.isComposing||i.keyCode===229||i.key==="Shift"&&(this.multiSelect=!1)}),this.originalSelectionObjects=[]}unselect(){this.originalSelectionObjects=[]}getClickedObjects(e){const n=this._getNormalisedClickPosition(e);this.raycaster.setFromCamera(n,this.viewer.cameraHandler.activeCam.camera);let r=[];return this.viewer.sectionBox.display.visible&&this.checkForSectionBoxInclusion&&(r=this.raycaster.intersectObject(this.viewer.sectionBox.cube)),r}_getNormalisedClickPosition(e){const n=this.viewer.speckleRenderer.renderer.domElement,r=this.viewer.speckleRenderer.renderer.domElement.getBoundingClientRect(),i=(e.clientX-r.left)*n.width/r.width,s=(e.clientY-r.top)*n.height/r.height;return{x:i/n.width*2-1,y:s/n.height*-2+1}}dispose(){super.dispose(),this.unselect(),this.originalSelectionObjects=null}}const Oge="section-box-drag-start",Ige="section-box-drag-end";class ebt extends lw{constructor(e){super(),this.viewer=e,this.viewer.speckleRenderer.renderer.localClippingEnabled=!0,this.dragging=!1,this.display=new $a,this.display.name="SectionBox",this.display.layers.set(kt.PROPS),this.viewer.speckleRenderer.scene.add(this.display),this.boxGeometry=this._generateSimpleCube(5,5,5),this.material=new pp({color:65535,opacity:0,wireframe:!1,side:rn}),this.cube=new ut(this.boxGeometry,this.material),this.cube.visible=!1,this.cube.layers.set(kt.PROPS),this.display.add(this.cube),this.boxHelper=new OT(this.boxGeometry.boundingBox,681727),this.boxHelper.material.opacity=.4,this.boxHelper.layers.set(kt.PROPS),this.display.add(this.boxHelper);const n=new Sf(.01,10,10);this.sphere=new ut(n,new pp({color:65535})),this.sphere.layers.set(kt.PROPS),this.sphere.visible=!1,this.display.add(this.sphere),this.plane=new ao(1,1),this.hoverPlane=new ut(this.plane,new pp({transparent:!0,side:rn,opacity:.1,wireframe:!1,color:681727,metalness:.1,roughness:.75})),this.hoverPlane.visible=!1,this.hoverPlane.layers.set(kt.PROPS),this.display.add(this.hoverPlane),this.dragging=!1,this._setupControls(),this.sidesSimple={256:{verts:[1,2,5,6],axis:"x"},152:{verts:[1,2,5,6],axis:"x"},407:{verts:[0,3,4,7],axis:"x"},703:{verts:[0,3,4,7],axis:"x"},327:{verts:[2,3,6,7],axis:"y"},726:{verts:[2,3,6,7],axis:"y"},450:{verts:[0,1,4,5],axis:"y"},"051":{verts:[0,1,4,5],axis:"y"},312:{verts:[0,1,3,2],axis:"z"},"013":{verts:[0,1,3,2],axis:"z"},546:{verts:[4,5,7,6],axis:"z"},647:{verts:[4,5,7,6],axis:"z"}},this._generateOrUpdatePlanes(),this.currentRange=null,this.prevPosition=null,this.attachedToBox=!0,this.selectionHelper=new $1t(this.viewer,{subset:[this.cube],hover:!1,checkForSectionBoxInclusion:!1}),this.selectionHelper.on($t.ObjectClicked,this._clickHandler.bind(this)),this.selectionHelper.on("hovered",()=>{}),document.addEventListener("keydown",r=>{r.key==="Escape"&&this.viewer.mouseOverRenderer&&this._attachControlsToBox()}),this._attachControlsToBox(),this.viewer.on("projection-change",(function(){this._setupControls(),this._attachControlsToBox()}).bind(this))}_setupControls(){var e,n;(e=this.controls)===null||e===void 0||e.dispose(),(n=this.controls)===null||n===void 0||n.detach(),this.controls=new y0e(this.viewer.cameraHandler.activeCam.camera,this.viewer.speckleRenderer.renderer.domElement);for(let r=0;r{i.layers.set(kt.PROPS)});this.controls.getRaycaster().layers.set(kt.PROPS),this.controls.setSize(.75),this.display.add(this.controls),this.controls.addEventListener("change",this._draggingChangeHandler.bind(this)),this.controls.addEventListener("dragging-changed",r=>{if(!this.display.visible)return;const i=!!r.value;i?(this.emit(Oge),this.dragging=i,this.viewer.cameraHandler.enabled=!i):(this.emit(Ige),setTimeout(()=>{this.dragging=i,this.viewer.cameraHandler.enabled=!i},100))}),this.viewer.needsRender=!0}_draggingChangeHandler(){if(this.display.visible){if(this.boxGeometry.computeBoundingBox(),this.boxHelper.box.copy(this.boxGeometry.boundingBox),this.dragging&&this.currentRange){this._generateOrUpdatePlanes(),this.prevPosition===null&&(this.prevPosition=this.hoverPlane.position.clone()),this.prevPosition.sub(this.hoverPlane.position),this.prevPosition.negate();const e=this.boxGeometry.attributes.position.array;for(let n=0;n!!n.model.data&&e(n.model.guid,n.model.data)).map(n=>n.model.data)}findFirst(e){return this.root.first(n=>!!n.model.data&&e(n.model.guid,n.model.data)).model.data}walk(e){this.root.walk(n=>!n.model.data||e(n.model.guid,n.model.data))}}class nbt{static build(e){const n=new tbt;let r=null;return e.root.walk(i=>{if(!i.parent)return r=n.root,!0;r=n.root.first(a=>a.model.guid===i.parent.model.id);const s=e.parse({guid:i.model.id,data:i.model.raw,atomic:i.model.atomic,children:[]});return r.addChild(s),!0},e.root),n}}class rbt{get treeBounds(){return this._treeBounds}get id(){return this.root.model.id}constructor(e,n){this._treeBounds=new Jt,this.cancel=!1,this.tree=e,this.root=n}buildRenderTree(){this.root.walk(e=>{const n=this.buildRenderNode(e);return e.model.renderView=n?new Is(n):null,this.applyTransforms(e),!0})}buildRenderTreeAsync(e){return this.tree.walkAsync(n=>{const r=this.buildRenderNode(n);return n.model.renderView=r?new Is(r):null,this.applyTransforms(n),!this.cancel},this.root,e)}applyTransforms(e){if(e.model.renderView){const n=this.computeTransform(e);e.model.renderView.hasGeometry?(e.model.renderView.renderData.geometry.bakeTransform&&n.multiply(e.model.renderView.renderData.geometry.bakeTransform),ur.transformGeometryData(e.model.renderView.renderData.geometry,n),e.model.renderView.computeAABB(),this._treeBounds.union(e.model.renderView.aabb),Sn.keepGeometryData||Sn.disposeNodeGeometryData(e.model)):e.model.renderView.hasMetadata&&e.model.renderView.renderData.geometry.bakeTransform.premultiply(n)}}buildRenderNode(e){let n=null;const r=Sn.convertNodeToGeometryData(e.model);if(r){const i=this.getRenderMaterialNode(e),s=this.getDisplayStyleNode(e);n={id:e.model.id,speckleType:Sn.getSpeckleType(e.model),geometry:r,renderMaterial:Ic.renderMaterialFromNode(i||s,e),displayStyle:Ic.displayStyleFromNode(s||i)}}return n}getRenderMaterialNode(e){if(e.model.raw.renderMaterial)return e;const n=this.tree.getAncestors(e);for(let r=0;r0){const a=r[i].model.raw.id;if(r[i-1].model.raw.host===a)continue}n.premultiply(s.geometry.transform)}}return n}getRenderableRenderViews(...e){return this.root.all(n=>n.model.renderView!==null&&(n.model.renderView.hasGeometry||n.model.renderView.hasMetadata)&&e.includes(n.model.renderView.renderData.speckleType)).map(n=>n.model.renderView)}getRenderableNodes(...e){return this.root.all(n=>n.model.renderView!==null&&(n.model.renderView.hasGeometry||n.model.renderView.hasMetadata)&&e.includes(n.model.renderView.renderData.speckleType))}getRenderViewsForNode(e,n){return e.model.atomic&&e.model.renderView&&Sn.getSpeckleType(e.model)!==Kt.RevitInstance&&Sn.getSpeckleType(e.model)!==Kt.BlockInstance?[e.model.renderView]:(n||e.parent).all(r=>r.model.renderView&&(r.model.renderView.hasGeometry||r.model.renderView.hasMetadata)).map(r=>r.model.renderView)}getRenderViewNodesForNode(e,n){return e.model.atomic&&e.model.renderView&&Sn.getSpeckleType(e.model)!==Kt.RevitInstance&&Sn.getSpeckleType(e.model)!==Kt.BlockInstance?[e]:(n||e.parent).all(r=>r.model.renderView&&(r.model.renderView.hasGeometry||r.model.renderView.hasMetadata))}getAtomicParent(e){return e.model.atomic?e:this.tree.getAncestors(e).find(n=>n.model.atomic)}getRenderViewsForNodeId(e){const n=this.tree.findId(e);return n?this.getRenderViewsForNode(n):(Zt.warn(`Id ${e} does not exist`),null)}getRenderViewForNodeId(e){const n=this.tree.findId(e);return n?n.model.renderView:(Zt.warn(`Id ${e} does not exist`),null)}purge(){this.tree=null}cancelBuild(e){this.cancel=!0,this.tree.purge(e),this.purge()}}class Xb{constructor(){this.renderTreeInstances={},this.supressWarnings=!0,this.tree=new h4,this._root=this.parse({id:Xb.ROOT_ID,raw:{},atomic:!0,children:[],renderView:null})}getRenderTree(e){if(!this._root)return console.error("WorldTree not initialised"),null;const n=e||this.root.model.id;return this.renderTreeInstances[n]||(this.renderTreeInstances[n]=new rbt(this,this.findId(n))),this.renderTreeInstances[n]}getDataTree(){return nbt.build(this)}get root(){return this._root}isRoot(e){return e===this._root}parse(e){return this.tree.parse(e)}addSubtree(e){this._root.addChild(e)}addNode(e,n){n!==null?n.addChild(e):Zt.error("Invalid parent node!")}removeNode(e){e.drop()}findAll(e,n){return n||this.supressWarnings||Zt.warn("Root will be used for searching. You might not want that"),(n||this.root).all(e)}findId(e,n){return n||this.supressWarnings||Zt.warn("Root will be used for searching. You might not want that"),(n||this.root).first(r=>r.model.id===e)}getAncestors(e){return e.getPath().reverse().slice(1)}walk(e,n){n||this.supressWarnings||Zt.warn("Root will be used for searching. You might not want that"),this._root.walk(e,n)}async walkAsync(e,n,r){n||this.supressWarnings||Zt.warn("Root will be used for searching. You might not want that");const i=mW.getPause(r),s=async function*o(l,u){let c,d;for(yield l(u),c=0,d=u.children.length;cdelete this.renderTreeInstances[n]),this._root.drop(),this._root.children.length=0,this.tree=new h4,this._root=this.tree.parse({id:Xb.ROOT_ID,raw:{},atomic:!0,children:[]})}}Xb.ROOT_ID="ROOT";const Uge=function(t){const e={};for(const n in t){if(["id","__closure","__parents","bbox","totalChildrenCount"].includes(n))continue;const r=t[n];if(r!=null&&!Array.isArray(r))if(r.constructor!==Object)["string","number","boolean"].includes(typeof r)&&(e[n]=r);else{const i=Uge(r);for(const s in i)e[`${n}.${s}`]=i[s]}}return t.id&&(e.id=t.id),e};class ibt{constructor(){this.propCache={}}getProperties(e,n=null,r=!1){let i=e.root;if(!r&&this.propCache[n||i.model.id])return this.propCache[n||i.model.id];if(n){const o=i.children.find(l=>l.model.id===n);if(!o)throw new Error(`Could not find root node for ${n} - is it loaded?`);i=o}const s={};e.walk(o=>{if(!o.model.atomic)return!0;const l=Uge(o.model.raw);for(const u in l)Array.isArray(l[u])||(s[u]||(s[u]=[]),s[u].push({value:l[u],id:l.id}))},i);const a=[];for(const o in s){const l=s[o],u={};if(u.key=o,u.type=typeof l[0].value=="string"?"string":"number",u.objectCount=l.length,u.type==="string"){const c=u,d={};for(const{value:f,id:h}of l)d[f]||(d[f]=[]),d[f].push(h);c.valueGroups=[];for(const f in d)c.valueGroups.push({value:f,ids:d[f]});c.valueGroups=c.valueGroups.sort((f,h)=>f.value.localeCompare(h.value))}if(u.type==="number"){const c=u;c.min=Number.MAX_VALUE,c.max=Number.MIN_VALUE;for(const{value:d}of l)dc.max&&(c.max=d);c.valueGroups=l.sort((d,f)=>d.value-f.value)}a.push(u)}return this.propCache[i.model.id]=a,a}}class Lh{static isPointQuery(e){return e.operation==="Project"||e.operation==="Unproject"}static isIntersectionQuery(e){return e.operation==="Occlusion"||e.operation==="Pick"}}var ZP;Lh.DefaultPointQuerySolver=new class{setContext(t){this.renderer=t}solve(t){switch(t.operation){case"Project":return this.solveProjection(t);case"Unproject":return this.solveUnprojection(t);default:Zt.error("Malformed query")}}solveProjection(t){const e=new U(t.point.x,t.point.y,t.point.z);return e.project(this.renderer.camera),{x:e.x,y:e.y,z:e.z}}solveUnprojection(t){const e=new U(t.point.x,t.point.y,t.point.z);return e.unproject(this.renderer.camera),{x:e.x,y:e.y,z:e.z}}},Lh.DefaultIntersectionQuerySolver=new class{constructor(){this.vecBuff0=new U,this.vecBuff1=new U}setContext(t){this.renderer=t}solve(t){switch(t.operation){case"Occlusion":return this.solveOcclusion(t);case"Pick":return this.solvePick(t);default:Zt.error("Malformed query")}}solveOcclusion(t){const e=this.vecBuff0.set(t.point.x,t.point.y,t.point.z),n=this.vecBuff1.copy(e).sub(this.renderer.camera.position);n.normalize();const r=new qo(this.renderer.camera.position,n),i=this.renderer.intersections.intersectRay(this.renderer.scene,this.renderer.camera,r,!0,this.renderer.currentSectionBox,[kt.STREAM_CONTENT_MESH]);if(!i||i.length===0)return{objects:null};const s=this.renderer.queryHitIds(i);if(!s)return{objects:null};let a=this.renderer.camera.position.distanceTo(e);return a-=t.tolerance,a({guid:n.node.model.id,object:n.node.model.raw,point:n.point}))}:null}},function(t){t[t.PLAIN=0]="PLAIN",t[t.COLORED=1]="COLORED"}(ZP||(ZP={}));class sbt{get materialGroups(){return this._materialGroups}constructor(e){this.tree=null,this.addedMaterialMesh=null,this.changedNewMaterialMesh=null,this.changedOldMaterialMesh=null,this.removedMaterialMesh=null,this.addedMaterialPoint=null,this.changedNewMaterialPoint=null,this.changedOldMaterialPoint=null,this.removedMaterialPoint=null,this.addedMaterials=[],this.changedOldMaterials=[],this.changedNewMaterials=[],this.removedMaterials=[],this._materialGroups=null,this.tree=e,this.addedMaterialMesh=new mn({color:new tt("#00ff00"),emissive:0,roughness:1,metalness:0,opacity:1,side:Ki},["USE_RTE"]),this.addedMaterialMesh.vertexColors=!1,this.addedMaterialMesh.depthWrite=!0,this.addedMaterialMesh.transparent=!0,this.addedMaterialMesh.clipShadows=!0,this.addedMaterialMesh.color.convertSRGBToLinear(),this.changedNewMaterialMesh=new mn({color:new tt("#ffff00"),emissive:0,roughness:1,metalness:0,opacity:1,side:Ki},["USE_RTE"]),this.changedNewMaterialMesh.vertexColors=!1,this.changedNewMaterialMesh.transparent=!0,this.addedMaterialMesh.depthWrite=!0,this.changedNewMaterialMesh.clipShadows=!0,this.changedNewMaterialMesh.color.convertSRGBToLinear(),this.changedOldMaterialMesh=new mn({color:new tt("#ffff00"),emissive:0,roughness:1,metalness:0,opacity:1,side:Ki},["USE_RTE"]),this.changedOldMaterialMesh.vertexColors=!1,this.changedOldMaterialMesh.transparent=!0,this.addedMaterialMesh.depthWrite=!0,this.changedOldMaterialMesh.clipShadows=!0,this.changedOldMaterialMesh.color.convertSRGBToLinear(),this.removedMaterialMesh=new mn({color:new tt("#ff0000"),emissive:0,roughness:1,metalness:0,opacity:1,side:Ki},["USE_RTE"]),this.removedMaterialMesh.vertexColors=!1,this.removedMaterialMesh.transparent=!0,this.addedMaterialMesh.depthWrite=!0,this.removedMaterialMesh.clipShadows=!0,this.removedMaterialMesh.color.convertSRGBToLinear(),this.addedMaterialPoint=new tr({color:65280,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.addedMaterialPoint.transparent=!0,this.addedMaterialPoint.color.convertSRGBToLinear(),this.addedMaterialPoint.toneMapped=!1,this.changedNewMaterialPoint=new tr({color:16776960,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.changedNewMaterialPoint.transparent=!0,this.changedNewMaterialPoint.color.convertSRGBToLinear(),this.changedNewMaterialPoint.toneMapped=!1,this.changedOldMaterialPoint=new tr({color:16776960,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.changedOldMaterialPoint.transparent=!0,this.changedOldMaterialPoint.color.convertSRGBToLinear(),this.changedOldMaterialPoint.toneMapped=!1,this.removedMaterialPoint=new tr({color:16711680,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.removedMaterialPoint.transparent=!0,this.removedMaterialPoint.color.convertSRGBToLinear(),this.removedMaterialPoint.toneMapped=!1}intersection(e,n){const[r,i]=[Object.keys(e),Object.keys(n)],[s,a]=r.length>i.length?[i,e]:[r,n];return s.filter(o=>o in a)}buildIdMaps(e,n,r){var i;for(let s=0;sl.model.raw.applicationId))===null||i===void 0?void 0:i.model.raw.applicationId;n[a.model.raw.id]={node:a,applicationId:o},o&&(r[o]=1)}}diff(e,n){return this.diffIterative(e,n)}diffBoolean(e,n){const r=performance.now(),i={unchanged:[],added:[],removed:[],modified:[]},s=this.tree.getRenderTree(e),a=this.tree.getRenderTree(n);let o=s.getRenderableNodes(...S1),l=a.getRenderableNodes(...S1);o=o.map(M=>s.getAtomicParent(M)),l=l.map(M=>a.getAtomicParent(M)),o=[...Array.from(new Set(o))],l=[...Array.from(new Set(l))];const u={},c={};this.buildIdMaps(o,u,c);const d={},f={};this.buildIdMaps(l,d,f);const h=this.intersection(u,d),p=Uh.omit(d,h),m=Uh.omit(u,h),v=Uh.omit(p,function(M,E,S){return M.applicationId&&c[M.applicationId]!==void 0}),g=Uh.omit(m,function(M,E,S){return M.applicationId&&f[M.applicationId]!==void 0}),b=Uh.omit(m,Object.keys(g)),y=Uh.omit(p,Object.keys(v)),x=Object.values(b).map(M=>M.node),T=Object.values(y).map(M=>M.node);return i.unchanged.push(...h.map(M=>u[M].node)),i.unchanged.push(...h.map(M=>d[M].node)),i.removed.push(...Object.values(g).map(M=>M.node)),i.added.push(...Object.values(v).map(M=>M.node)),x.forEach((M,E)=>{i.modified.push([x[E],T[E]])}),console.warn("Boolean Time -> ",performance.now()-r),Promise.resolve(i)}diffIterative(e,n){var r,i;const s=performance.now(),a=[],o=[],l={unchanged:[],added:[],removed:[],modified:[]},u=this.tree.getRenderTree(e),c=this.tree.getRenderTree(n);let d=u.getRenderableNodes(...S1),f=c.getRenderableNodes(...S1);d=d.map(g=>u.getAtomicParent(g)),f=f.map(g=>c.getAtomicParent(g)),d=[...Array.from(new Set(d))],f=[...Array.from(new Set(f))];const h={},p={};this.buildIdMaps(d,h,p);const m={},v={};this.buildIdMaps(f,m,v);for(let g=0;g{l.modified.push([o[b],a[b]])}),console.warn("Interative Time -> ",performance.now()-s),Promise.resolve(l)}setDiffTime(e){const n=Math.min(Math.max(1-e,0),1),r=Math.min(Math.max(e,0),1);this.addedMaterials.forEach(i=>{i.opacity=i.clampOpacity!==void 0?Math.min(n,i.clampOpacity):n,i.depthWrite=!(n<.5),i.transparent=i.opacity<1}),this.changedOldMaterials.forEach(i=>{i.opacity=i.clampOpacity!==void 0?Math.min(r,i.clampOpacity):r,i.depthWrite=!(r<.5),i.transparent=i.opacity<1}),this.changedNewMaterials.forEach(i=>{i.opacity=i.clampOpacity!==void 0?Math.min(n,i.clampOpacity):n,i.depthWrite=!(n<.5),i.transparent=i.opacity<1}),this.removedMaterials.forEach(i=>{i.opacity=i.clampOpacity!==void 0?Math.min(r,i.clampOpacity):r,i.depthWrite=!(r<.5),i.transparent=i.opacity<1})}buildMaterialGroups(e,n,r){const i=performance.now();switch(e){case ZP.COLORED:this._materialGroups=this.getColoredMaterialGroups(this.getVisualDiffResult(n));break;case ZP.PLAIN:this._materialGroups=this.getPlainMaterialGroups(this.getVisualDiffResult(n),r);break;default:Zt.error(`Unsupported visual diff mode ${e}`)}return console.warn("Material groups -> ",performance.now()-i),this._materialGroups}resetMaterialGroups(){this._materialGroups=null,this.addedMaterials=[],this.changedOldMaterials=[],this.changedNewMaterials=[],this.removedMaterials=[]}getVisualDiffResult(e){const n=this.tree.getRenderTree(),r=e.added.flatMap(l=>n.getRenderViewsForNode(l,l)),i=e.removed.flatMap(l=>n.getRenderViewsForNode(l,l)),s=e.unchanged.flatMap(l=>n.getRenderViewsForNode(l,l)),a=e.modified.flatMap(l=>n.getRenderViewsForNode(l[0],l[0])).filter(l=>!s.includes(l)&&!i.includes(l)),o=e.modified.flatMap(l=>n.getRenderViewsForNode(l[1],l[1])).filter(l=>!s.includes(l)&&!r.includes(l));return{unchanged:s,added:r,removed:i,modifiedOld:a,modifiedNew:o}}getColoredMaterialGroups(e){const n=[{objectIds:[],rvs:e.added.filter(r=>r.geometryType===st.MESH||r.geometryType===st.LINE),material:this.addedMaterialMesh},{objectIds:[],rvs:e.modifiedNew.filter(r=>r.geometryType===st.MESH||r.geometryType===st.LINE),material:this.changedNewMaterialMesh},{objectIds:[],rvs:e.modifiedOld.filter(r=>r.geometryType===st.MESH||r.geometryType===st.LINE),material:this.changedOldMaterialMesh},{objectIds:[],rvs:e.removed.filter(r=>r.geometryType===st.MESH||r.geometryType===st.LINE),material:this.removedMaterialMesh},{objectIds:[],rvs:e.added.filter(r=>r.geometryType===st.POINT||r.geometryType===st.POINT_CLOUD),material:this.addedMaterialPoint},{objectIds:[],rvs:e.modifiedNew.filter(r=>r.geometryType===st.POINT||r.geometryType===st.POINT_CLOUD),material:this.changedNewMaterialPoint},{objectIds:[],rvs:e.modifiedOld.filter(r=>r.geometryType===st.POINT||r.geometryType===st.POINT_CLOUD),material:this.changedOldMaterialPoint},{objectIds:[],rvs:e.removed.filter(r=>r.geometryType===st.POINT||r.geometryType===st.POINT_CLOUD),material:this.removedMaterialPoint}];return this.addedMaterials.push(this.addedMaterialMesh,this.addedMaterialPoint),this.changedOldMaterials.push(this.changedOldMaterialMesh,this.changedOldMaterialPoint),this.changedNewMaterials.push(this.changedNewMaterialMesh,this.changedNewMaterialPoint),this.removedMaterials.push(this.removedMaterialMesh,this.removedMaterialPoint),n.filter(r=>r.rvs.length>0)}getPlainMaterialGroups(e,n){const r=this.getBatchesSubgroups(e.added,n),i=this.getBatchesSubgroups(e.modifiedOld,n),s=this.getBatchesSubgroups(e.modifiedNew,n),a=this.getBatchesSubgroups(e.removed,n);return this.addedMaterials=r.map(o=>o.material),this.changedOldMaterials=i.map(o=>o.material),this.changedNewMaterials=s.map(o=>o.material),this.removedMaterials=a.map(o=>o.material),[...r,...i,...s,...a]}getBatchesSubgroups(e,n){const r=[...Array.from(new Set(e.map(s=>s.batchId)))],i=[];for(let s=0;so.batchId===r[s]),material:a})}return i}}class abt extends lw{get World(){return this.world}get Utils(){return this.utils||(this.utils={screenToNDC:this.speckleRenderer.screenToNDC.bind(this.speckleRenderer),NDCToScreen:this.speckleRenderer.NDCToScreen.bind(this.speckleRenderer)}),this.utils}constructor(e,n=Sge){super(),this.tree=new Xb,this.world=new mW,this.loaders={},this.dynamicallyLoadedDiffResources=[],Zt.useDefaults(),Zt.setLevel(n.verbose?Zt.TRACE:Zt.ERROR),Sn.keepGeometryData=n.keepGeometryData,this.container=e||document.getElementById("renderer"),n.showStats&&(this.stats=YKe(),this.container.prepend(this.stats.dom),this.stats.dom.style.position="relative"),this.loaders={},this.startupParams=n,this.clock=new r9,this.inProgressOperations=0,this.cameraHandler=new x1t(this),this.speckleRenderer=new _1t(this),this.speckleRenderer.create(this.container),window.addEventListener("resize",this.resize.bind(this),!1),this.filteringManager=new E1t(this.speckleRenderer,this.tree),this.filteringManager.on($t.FilteringStateSet,r=>{this.emit($t.FilteringStateSet,r)}),this.propertyManager=new ibt,this.differ=new sbt(this.tree),window._V=this,this.sectionBox=new ebt(this),this.sectionBox.disable(),this.on($t.SectionBoxUpdated,()=>{this.speckleRenderer.updateClippingPlanes(this.sectionBox.planes)}),this.sectionBox.on(Oge,this.speckleRenderer.onSectionBoxDragStart.bind(this.speckleRenderer)),this.sectionBox.on(Ige,this.speckleRenderer.onSectionBoxDragEnd.bind(this.speckleRenderer)),this.frame(),this.resize(),this.on($t.LoadCancelled,r=>{Zt.warn(`Cancelled load for ${r}`)})}getObjects(e){return this.speckleRenderer.getObjects(e)}setSectionBox(e,n){e||(e=this.speckleRenderer.sceneBox),this.sectionBox.setBox(e,n),this.speckleRenderer.updateSectionBoxCapper()}getSectionBoxFromObjects(e){return this.speckleRenderer.boxFromObjects(e)}setSectionBoxFromObjects(e,n){this.setSectionBox(this.getSectionBoxFromObjects(e),n)}getCurrentSectionBox(){return this.sectionBox.getCurrentBox()}resize(){const e=this.container.offsetWidth,n=this.container.offsetHeight;this.speckleRenderer.resize(e,n)}requestRender(){this.speckleRenderer.needsRender=!0,this.speckleRenderer.resetPipeline()}frame(){this.update(),this.render()}update(){var e;const n=this.clock.getDelta();this.speckleRenderer.update(n),(e=this.stats)===null||e===void 0||e.update(),requestAnimationFrame(this.frame.bind(this))}render(){this.speckleRenderer.render()}async init(){this.startupParams.environmentSrc&&Gl.getEnvironment(this.startupParams.environmentSrc,this.speckleRenderer.renderer).then(e=>{this.speckleRenderer.indirectIBL=e}).catch(e=>{Zt.error(e),Zt.error("Fallback to null environment!")})}on(e,n){super.on(e,n)}getObjectProperties(e=null,n=!0){return this.propertyManager.getProperties(this.tree,e,n)}selectObjects(e){return new Promise(n=>{n(this.filteringManager.selectObjects(e))})}resetSelection(){return new Promise(e=>{e(this.filteringManager.resetSelection())})}hideObjects(e,n=null,r=!1,i=!1){return new Promise(s=>{s(this.filteringManager.hideObjects(e,n,r,i))})}showObjects(e,n=null,r=!1){return new Promise(i=>{i(this.filteringManager.showObjects(e,n,r))})}isolateObjects(e,n=null,r=!1,i=!0){return new Promise(s=>{s(this.filteringManager.isolateObjects(e,n,r,i))})}unIsolateObjects(e,n=null,r=!1){return new Promise(i=>{i(this.filteringManager.unIsolateObjects(e,n,r))})}highlightObjects(e,n=!1){return new Promise(r=>{r(this.filteringManager.highlightObjects(e,n))})}resetHighlight(){return new Promise(e=>{e(this.filteringManager.resetHighlight())})}setColorFilter(e,n=!0){return new Promise(r=>{r(this.filteringManager.setColorFilter(e,n))})}removeColorFilter(){return new Promise(e=>{e(this.filteringManager.removeColorFilter())})}setUserObjectColors(e){return new Promise(n=>{n(this.filteringManager.setUserObjectColors(e))})}resetFilters(){return new Promise(e=>{e(this.filteringManager.reset())})}async applyFilter(e){}getDataTree(){return this.tree.getDataTree()}getWorldTree(){return this.tree}query(e){return Lh.isPointQuery(e)?(Lh.DefaultPointQuerySolver.setContext(this.speckleRenderer),Lh.DefaultPointQuerySolver.solve(e)):Lh.isIntersectionQuery(e)?(Lh.DefaultIntersectionQuerySolver.setContext(this.speckleRenderer),Lh.DefaultIntersectionQuerySolver.solve(e)):void 0}queryAsync(e){return null}toggleSectionBox(){this.sectionBox.toggle(),this.speckleRenderer.updateSectionBoxCapper()}sectionBoxOff(){this.sectionBox.disable(),this.speckleRenderer.updateSectionBoxCapper()}sectionBoxOn(){this.sectionBox.enable(),this.speckleRenderer.updateSectionBoxCapper()}zoom(e,n,r){this.speckleRenderer.zoom(e,n,r)}setProjectionMode(e){this.cameraHandler.activeCam=e}setOrthoCameraOn(){this.cameraHandler.setOrthoCameraOn(),this.speckleRenderer.resetPipeline(!0)}setPerspectiveCameraOn(){this.cameraHandler.setPerspectiveCameraOn(),this.speckleRenderer.resetPipeline(!0)}toggleCameraProjection(){this.cameraHandler.toggleCameras(),this.speckleRenderer.resetPipeline(!0)}setLightConfiguration(e){this.speckleRenderer.setSunLightConfiguration(e)}getViews(){return this.tree.findAll(e=>{var n;return((n=e.model.renderView)===null||n===void 0?void 0:n.speckleType)===Kt.View3D}).map(e=>({name:e.model.raw.applicationId,id:e.model.id,view:e.model.raw}))}setView(e,n=!0){this.speckleRenderer.setView(e,n)}screenshot(){return new Promise(e=>{const n=this.sectionBox.display.visible;n&&this.sectionBox.displayOff();const r=this.speckleRenderer.renderer.domElement.toDataURL("image/png");n&&this.sectionBox.displayOn(),e(r)})}explode(e){const n=this.world.worldSize,r=Math.sqrt(n.x*n.x+n.y*n.y+n.z*n.z);this.speckleRenderer.setExplode(e,r)}async downloadObject(e,n=null,r=!0){const i=new S1t(this,e,n,r);this.loaders[e]=i,await i.load()}async loadObject(e,n=null,r=!0,i=!0){++this.inProgressOperations==1&&this.emit($t.Busy,!0),await this.downloadObject(e,n,r);let s=performance.now();this.tree.getRenderTree(e).buildRenderTree(),Zt.log("SYNC Tree build time -> ",performance.now()-s),s=performance.now(),await this.speckleRenderer.addRenderTree(e),Zt.log("SYNC batch build time -> ",performance.now()-s),i&&this.zoom(),this.speckleRenderer.resetPipeline(!0),this.emit($t.LoadComplete,e),this.loaders[e].dispose(),delete this.loaders[e],--this.inProgressOperations==0&&this.emit($t.Busy,!1)}async loadObjectAsync(e,n=null,r=!0,i=1,s=!0){++this.inProgressOperations==1&&this.emit($t.Busy,!0),await this.downloadObject(e,n,r);let a=performance.now();const o=await this.tree.getRenderTree(e).buildRenderTreeAsync(i);Zt.log("ASYNC Tree build time -> ",performance.now()-a),o&&(a=performance.now(),await this.speckleRenderer.addRenderTreeAsync(e,i,s),Zt.log("ASYNC batch build time -> ",performance.now()-a),this.speckleRenderer.resetPipeline(!0),this.emit($t.LoadComplete,e)),this.loaders[e].dispose(),delete this.loaders[e],--this.inProgressOperations==0&&this.emit($t.Busy,!1)}async cancelLoad(e,n=!1){this.loaders[e].cancelLoad(),this.tree.getRenderTree(e).cancelBuild(e),this.speckleRenderer.cancelRenderTree(e),n?await this.unloadObject(e):--this.inProgressOperations==0&&this.emit($t.Busy,!1)}async unloadObject(e){try{++this.inProgressOperations==1&&this.emit($t.Busy,!0),delete this.loaders[e],this.speckleRenderer.removeRenderTree(e),this.tree.getRenderTree(e).purge(),this.tree.purge(e)}finally{--this.inProgressOperations==0&&(this.emit($t.Busy,!1),Zt.warn(`Removed subtree ${e}`),this.emit($t.UnloadComplete,e))}}async unloadAll(){try{++this.inProgressOperations==1&&this.emit($t.Busy,!0);for(const e of Object.keys(this.loaders))delete this.loaders[e];this.filteringManager.reset(),this.tree.root.children.forEach(e=>{this.speckleRenderer.removeRenderTree(e.model.id),this.tree.getRenderTree().purge()}),this.tree.purge()}finally{--this.inProgressOperations==0&&(this.emit($t.Busy,!1),Zt.warn("Removed all subtrees"),this.emit($t.UnloadAllComplete))}}async diff(e,n,r,i){const s=[];this.dynamicallyLoadedDiffResources=[],this.tree.findId(e)||(s.push(this.loadObjectAsync(e,i,void 0,1)),this.dynamicallyLoadedDiffResources.push(e)),this.tree.findId(n)||(s.push(this.loadObjectAsync(n,i,void 0,1)),this.dynamicallyLoadedDiffResources.push(n)),await Promise.all(s);const a=await this.differ.diff(e,n),o=this.speckleRenderer.pipelineOptions;return o.depthSide=Ki,this.speckleRenderer.pipelineOptions=o,this.differ.resetMaterialGroups(),this.differ.buildMaterialGroups(r,a,this.speckleRenderer.getBatchMaterials()),this.differ.setDiffTime(0),this.filteringManager.setUserMaterials(this.differ.materialGroups),Promise.resolve(a)}async undiff(){const e=this.speckleRenderer.pipelineOptions;e.depthSide=rn,this.speckleRenderer.pipelineOptions=e,this.differ.resetMaterialGroups(),this.filteringManager.removeUserMaterials();const n=[];if(this.dynamicallyLoadedDiffResources.length!==0)for(const r of this.dynamicallyLoadedDiffResources)n.push(this.unloadObject(r));this.dynamicallyLoadedDiffResources=[],await Promise.all(n)}setDiffTime(e,n){this.differ.setDiffTime(n),this.filteringManager.setUserMaterials(this.differ.materialGroups)}setVisualDiffMode(e,n){this.differ.resetMaterialGroups(),this.differ.buildMaterialGroups(n,e,this.speckleRenderer.getBatchMaterials()),this.filteringManager.setUserMaterials(this.differ.materialGroups)}enableMeasurements(e){this.speckleRenderer.measurements.enabled=e}setMeasurementOptions(e){this.speckleRenderer.measurements.options=e}removeMeasurement(){this.speckleRenderer.measurements.removeMeasurement()}dispose(){}}const go=h0({id:"speckleStore",state:()=>({projectDetails:null,selectedVersion:null,selectedProject:null,allProjects:null,allVersions:null,allModels:null,modelsAndVersions:null,user:null,serverInfo:null,customParameters:null,viewer:null,selectedObjectIds:[],colorGroups:[],token:null,serverUrl:null,hiddenObjects:[],renderMode:!0,showHiddenObjects:!1}),actions:{async login(){pUe()},async logout(){this.$patch(t=>{t.user=null,t.serverInfo=null,t.projectDetails=null,t.selectedVersion=null}),mUe(),o0.push("/login")},async exchangeAccessCodes(t){return vUe(t)},async updateUser(){try{const e=(await gUe()).data;this.$patch(n=>{n.user=e.user,n.serverInfo=e.serverInfo})}catch(t){ef(t,"info")}},async updateProjects(){try{const e=(await yUe()).data,n=[];for(const r of e.streams.items){const i=await SUe(r.id),s={name:r.name,id:r.id,updatedAt:r.updatedAt,latestModelId:i.data.project.models.items[0].id};n.push(s)}this.allProjects=n}catch(t){ef(t,"info")}},async updateProjectVersions(t,e,n){var r,i,s,a,o,l;try{const d=(await bUe(t,e,n)).data,f={name:d.stream.name,id:d.stream.id,updatedAt:d.stream.updatedAt};let h;const p=[],m={};(r=d.stream.commits)!=null&&r.items&&((i=d.stream.commits)==null?void 0:i.items.length)>0&&((a=(s=d.stream.commits)==null?void 0:s.items)==null||a.forEach(v=>{p.push(v);const{branchName:g}=v;m[g]||(m[g]=[]),m[g].push(v)}),h=(l=(o=d.stream.commits)==null?void 0:o.items)==null?void 0:l.map(function(v){return v==null?void 0:v.branchName})),this.$patch(v=>{v.selectedProject=f,v.projectDetails=d,v.allVersions=p,v.allModels=h,v.modelsAndVersions=m})}catch(u){ef(u,"info")}},async getObjects(){try{return this.selectedProject&&this.selectedVersion?await xUe(this.selectedProject.id,this.selectedVersion.referencedObject,this.selectedVersion.sourceApplication):null}catch(t){ef(t,"info")}},setProjectDetails(t){this.projectDetails=t},setAllVersions(t){this.allVersions=t},setAllModels(t){this.allModels=t},setModelsAndVersions(t){this.modelsAndVersions=t},setSelectedVersion(t){this.selectedVersion=t},setViewerInstance(t){this.viewer=t},setCurrentlySelectedObject(t){this.selectedObjectIds.push(...t)},calculateGroupColors(t){Twt(t);const e=[];t.forEach(n=>{const r=/hsl\((\d+),\s*(\d+)%,\s*(\d+)%\)/;let i;if(!n.color)i=dZ(151,100,50);else{const a=n.color.match(r),[,o,l,u]=a.map(c=>parseInt(c));i=dZ(o,l,u)}const s={objectIds:n.objects.map(a=>a.URI),color:i};e.push(s)}),this.setColorGroups(e)},setColorGroups(t){var e;this.colorGroups=t,this.renderMode||(e=this.viewer)==null||e.setUserObjectColors(t)},setToken(t){this.token=t},setServerUrl(t){this.serverUrl=t},addCustomParameter(t){this.parameterNameCheck(t.name)?console.warn("Duplicate name found. Object not added."):this.customParameters?this.customParameters.push(t):this.customParameters=[t]},addHiddenObject(t){this.hiddenObjects.push(t)},setHiddenObjects(t){this.hiddenObjects=t},parameterNameCheck(t){return this.customParameters?this.customParameters.some(e=>e.name===t):!1},removeCustomParameter(t){var e;this.customParameters&&(this.customParameters=(e=this.customParameters)==null?void 0:e.filter(n=>n.name!==t))},isolateObjects(t){var e,n,r,i;if((e=this.viewer)==null||e.resetFilters(),(n=this.viewer)==null||n.isolateObjects(t,null,!0,!0),t.length>0&&!this.renderMode){const s=new Map;this.colorGroups.forEach(o=>{o.objectIds.forEach(l=>{s.set(l,o.color)})});const a=t.map(o=>({objectIds:[o],color:s.get(o)})).filter(o=>o.color!==void 0);(r=this.viewer)==null||r.setUserObjectColors(a)}else this.renderMode||(i=this.viewer)==null||i.setUserObjectColors(this.colorGroups)},hideUnusedObjects(t){var e;this.showHiddenObjects||(e=this.viewer)==null||e.hideObjects(t,null,!1,!1)},async resetUnusedObjects(){var t,e;(t=this.viewer)==null||t.resetFilters(),this.renderMode||(e=this.viewer)==null||e.setUserObjectColors(this.colorGroups)},toggleRenderMode(){var t;this.renderMode=!this.renderMode,this.resetUnusedObjects(),(t=this.viewer)==null||t.resize()},toggleHiddenObjects(){var t,e;this.showHiddenObjects=!this.showHiddenObjects,this.resetUnusedObjects(),this.showHiddenObjects||(t=this.viewer)==null||t.hideObjects(this.hiddenObjects.map(n=>n.id),null,!1,!1),(e=this.viewer)==null||e.resize()}},getters:{getProjectDetails:t=>t.projectDetails,getSelectedVersion:t=>t.selectedVersion,getAllVersions:t=>t.allVersions,getAllModels:t=>t.allModels,getModelsAndVersions:t=>t.modelsAndVersions,isAuthenticated:t=>t.user!==null,getUserInfo:t=>t.user,getProjectsInfo:t=>t.allProjects,getCustomParameters:t=>t.customParameters,getViewerInstance:t=>t.viewer,getCurrentSelectedObjectIDs:t=>t.selectedObjectIds,getColorGroups:t=>t.colorGroups}});/** +`}get uniformsDef(){return{...super.uniformsDef,tex0:null,tex1:null,tex2:null,tex3:null,weights:new Qt,sigmoidRange:0,sigmoidStrength:0}}constructor(e,n=[]){super(e,n)}}class Y1t extends fm{get displayName(){return"Shadowcatcher"}get outputTexture(){return this.outputTarget.texture}set needsUpdate(e){this._needsUpdate=e}constructor(){super(),this.levels=4,this.debugCamera=!1,this.renderTargets=[],this.tempTargets=[],this.camera=null,this.scene=null,this._needsUpdate=!1,this.fsQuad=null,this.blendMaterial=null,this.depthMaterial=null,this.vBlurMaterial=null,this.hBlurMaterial=null,this.blurStdDev=w4.stdDeviation,this.blurRadius=w4.blurRadius,this.prevBlurStdDev=0,this.prevBlurRadius=0,this.cameraHelper=null,this.onBeforeRender=null,this.onAfterRender=null;for(let e=0;ee*Xc.MAX_TEXTURE_SIZE_SCALE&&(r.y=e*Xc.MAX_TEXTURE_SIZE_SCALE,r.x=n*r.y),r}updatePlaneMesh(e,n){const r=e.getSize(new U),i=e.getCenter(new U);(new Oe(r.x,r.y).distanceTo(this.planeSize)>.001||n)&&this.updatePlaneMeshGeometry(new Oe(2*r.x,2*r.y),new U(i.x,i.y,i.z-.5*r.z-.001)),this.planeSize.set(r.x,r.y)}updatePlaneMeshGeometry(e,n){this.planeMesh.geometry&&this.planeMesh.geometry.dispose();const r=new ao(e.x,e.y,Xc.PLANE_SUBD,Xc.PLANE_SUBD),i=new Be().makeTranslation(n.x,n.y,n.z);r.applyMatrix4(i);const s=new Float64Array(r.attributes.position.array);ur.updateRTEGeometry(r,s),this.planeMesh.geometry=r,this.planeMesh.geometry.computeBoundingBox()}}Xc.MESH_NAME="Shadowcatcher",Xc.PLANE_SUBD=2,Xc.MAX_TEXTURE_SIZE_SCALE=.5;const B1t={fixedSize:!0,dashedLine:!1,discColor:294651,discOpacity:1,lineColor:294651,lineOpacity:1,pointColor:294651,pointOpacity:1,textColor:16777215,textOpacity:1,textPixelHeight:17,pointPixelHeight:5};class Ap extends $a{set style(e){Object.assign(this._style,e),this.updateStyle()}set highlight(e){e?(this.disc.material.color=new tt(16711680),this.line.material.color=new tt(16711680),this.point.material.color=new tt(16711680),this.text.textMesh.material.color.copy(new tt(16711680))):this.updateStyle()}getDiscMaterial(){const e=new Mr({color:this._style.discColor});return e.color.convertSRGBToLinear(),e.toneMapped=!1,e.polygonOffset=!0,e.polygonOffsetFactor=-5,e.polygonOffsetUnits=5,e.opacity=this._style.discOpacity,e.transparent=e.opacity<1,e}getLineMaterial(){const e=new Qr({color:294651,linewidth:1,worldUnits:!1,vertexColors:!1,alphaToCoverage:!1,resolution:new Oe(1,1)},["USE_RTE","UNIFORM_OPACITY"].concat(this._style.dashedLine?["USE_DASH"]:[]));return e.color=new tt(this._style.lineColor),e.color.convertSRGBToLinear(),e.toneMapped=!1,this._style.dashedLine&&(e.dashSize=1,e.gapSize=1,e.dashScale=10),e.linewidth=2,e.worldUnits=!1,e.resolution=new Oe(1513,1306),e.opacity=this._style.lineOpacity,e.transparent=e.opacity<1,e.depthTest=!1,e}getPointMaterial(e){const n=new Mr({color:e||this._style.pointColor},["BILLBOARD_FIXED"]);return n.opacity=this._style.pointOpacity,n.transparent=n.opacity<1,n.color.convertSRGBToLinear(),n.toneMapped=!1,n.depthTest=!1,n.billboardPixelHeight=this._style.pointPixelHeight*window.devicePixelRatio,n.userData.billboardPos.value.copy(this.point.position),n}getTextMaterial(){const e=new ts({color:this._style.textColor,opacity:1,side:rn},["USE_RTE","BILLBOARD_FIXED"]);return e.toneMapped=!1,e.color.convertSRGBToLinear(),e.opacity=this._style.textOpacity,e.transparent=e.opacity<1,e.depthTest=!1,e.billboardPixelHeight=this._style.textPixelHeight*window.devicePixelRatio,e.userData.billboardPos.value.copy(this.text.position),e.getDerivedMaterial()}constructor(e){super(),this._style=Object.assign({},B1t),this.layers.set(kt.MEASUREMENTS);const n=new Xp(1,16),r=new Float64Array(n.attributes.position.array);ur.updateRTEGeometry(n,r),this.disc=new ut(n,null),this.disc.layers.set(kt.MEASUREMENTS);const i=new Float64Array(18),s=new Ub;s.setPositions(new Float32Array(i)),s.attributes.instanceStart.data.setUsage(Bl),ur.updateRTEGeometry(s,i),this.line=new rw(s,null),this.line.computeLineDistances(),this.line.name="test-mesurements-line",this.line.frustumCulled=!1,this.line.renderOrder=0,this.line.layers.set(kt.MEASUREMENTS);const a=new Xp(1,16);this.point=new ut(a,null),this.point.layers.set(kt.MEASUREMENTS),this.point.visible=!1,this.point.renderOrder=1;const o=new ut(a,this.getPointMaterial(16777215));o.renderOrder=2,o.material.billboardPixelHeight=this._style.pointPixelHeight*window.devicePixelRatio-2*window.devicePixelRatio,o.layers.set(kt.MEASUREMENTS),this.point.add(o),this.text=new T4("test-text"),this.text.textMesh.material=null,this.text.layers.set(kt.MEASUREMENTS),this.text.textMesh.layers.set(kt.MEASUREMENTS),this.text.backgroundMesh,this.add(this.point),this.add(this.disc),this.add(this.line),this.add(this.text),this.style=e}enable(e,n,r,i){this.disc.visible=e,this.line.visible=n,this.point.visible=r,this.text.visible=i,this.text.textMesh.visible=i,this.line.material.visible=n}frameUpdate(e,n){if(e.type==="PerspectiveCamera"&&+this._style.fixedSize>0){const r=e,i=r.position.distanceTo(this.disc.position),s=Math.abs(2*Math.tan(r.fov/2)*i),a=2*n.min.distanceTo(n.max),o=.0035*Math.min(s,a);this.disc.scale.set(o,o,o),this.disc.matrixWorldNeedsUpdate=!0}if(e.type==="OrthographicCamera"&&+this._style.fixedSize>0){const r=e,i=(r.top-r.bottom)/r.zoom*.0075;this.disc.scale.set(i,i,i),this.disc.matrixWorldNeedsUpdate=!0}}updateDisc(e,n){this.disc.position.copy(e),Ap.vecBuff0.set(0,0,1),this.disc.quaternion.setFromUnitVectors(Ap.vecBuff0,n)}updatePoint(e){this.point.position.copy(e),this.point.material.userData.billboardPos.value.copy(this.point.position),this.point.children[0].material.userData.billboardPos.value.copy(this.point.position)}updateLine(e){const n=new Float64Array(3*e.length);e.forEach((s,a)=>{s.toArray(n,3*a)});const r=this.line.geometry.attributes.instanceStart.data,i=this.line.geometry.attributes.instanceStartLow.data;ur.DoubleToHighLowBuffer(n,i.array,r.array),r.needsUpdate=!0,r.updateRange={offset:0,count:3*e.length},i.needsUpdate=!0,i.updateRange={offset:0,count:3*e.length},this.line.visible=!0,this.line.geometry.instanceCount=e.length/2,this.line.geometry.attributes.instanceStart.needsUpdate=!0,this.line.geometry.attributes.instanceEnd.needsUpdate=!0,this.line.geometry.attributes.instanceStartLow.needsUpdate=!0,this.line.geometry.attributes.instanceEndLow.needsUpdate=!0,this.line.geometry.computeBoundingBox(),this.line.geometry.computeBoundingSphere(),this.line.computeLineDistances()}updateText(e,n,r,i){this.text.update({textValue:e,height:1,anchorX:"50%",anchorY:"43%"}).then(()=>{this.text.style={backgroundColor:new tt(294651),billboard:!0,backgroundPixelHeight:20},this.text.setTransform(n,r,i),this.text.backgroundMesh.renderOrder=3,this.text.textMesh.renderOrder=4})}updateStyle(){this.disc.material=this.getDiscMaterial(),this.line.material=this.getLineMaterial(),this.point.material=this.getPointMaterial(),this.text.textMesh.material=this.getTextMaterial()}raycast(e,n){this.line.raycast(e,n),this.text.raycast(e,n)}updateClippingPlanes(e){var n;this.disc.material.clippingPlanes=e,this.point.material.clippingPlanes=e,this.point.children[0].material.clippingPlanes=e,this.line.material.clippingPlanes=e,this.text.backgroundMesh&&(this.text.backgroundMesh.material.clippingPlanes=e),this.text.textMesh&&(((n=this.text.textMesh)===null||n===void 0?void 0:n.material).clippingPlanes=e)}}var Li,A1;Ap.vecBuff0=new U,function(t){t[t.HIDDEN=0]="HIDDEN",t[t.DANGLING_START=1]="DANGLING_START",t[t.DANGLING_END=2]="DANGLING_END",t[t.COMPLETE=3]="COMPLETE"}(Li||(Li={}));class kn extends cn{constructor(){super(...arguments),this.startPoint=new U,this.endPoint=new U,this.startNormal=new U,this.endNormal=new U,this.value=0,this.units="m",this.precision=2,this._state=Li.HIDDEN,this.renderingSize=new Oe}set state(e){this._state=e}get state(){return this._state}set isVisible(e){}get bounds(){return new Jt().expandByPoint(this.startPoint).expandByPoint(this.endPoint)}frameUpdate(e,n,r){this.renderingCamera=e,this.renderingSize.copy(n)}update(){}raycast(e,n){}highlight(e){}updateClippingPlanes(e){}}kn.vec3Buff0=new U,kn.vec3Buff1=new U,kn.vec3Buff2=new U,kn.vec3Buff3=new U,kn.vec3Buff4=new U,kn.vec4Buff0=new Qt,kn.vec4Buff1=new Qt,kn.vec2Buff0=new Oe;class H1t extends kn{set isVisible(e){this.startGizmo.enable(e,e,e,e),this.endGizmo.enable(e,e,e,e)}get bounds(){return new Jt().expandByPoint(this.startPoint).expandByPoint(this.midPoint)}constructor(){super(),this.startGizmo=null,this.endGizmo=null,this.midPoint=new U,this.normalIndicatorPixelSize=15,this.type="PerpendicularMeasurement",this.startPoint.set(NaN,NaN,NaN),this.startGizmo=new Ap,this.endGizmo=new Ap({dashedLine:!0,lineOpacity:.25}),this.startLineLength=.25,this.add(this.startGizmo),this.add(this.endGizmo),this.layers.set(kt.MEASUREMENTS)}frameUpdate(e,n,r){super.frameUpdate(e,n,r),this.startGizmo.frameUpdate(e,r),this.endGizmo.frameUpdate(e,r),this._state===Li.DANGLING_START&&this.update()}update(){if(!isNaN(this.startPoint.length())){if(this.startGizmo.updateDisc(this.startPoint,this.startNormal),this.startGizmo.updatePoint(this.startPoint),this.endGizmo.updateDisc(this.endPoint,this.endNormal),this._state===Li.DANGLING_START){const e=kn.vec3Buff0.copy(this.startPoint),n=kn.vec4Buff0.set(this.startPoint.x,this.startPoint.y,this.startPoint.z,1).applyMatrix4(this.renderingCamera.matrixWorldInverse).applyMatrix4(this.renderingCamera.projectionMatrix),r=n.w;n.multiplyScalar(1/r);const i=kn.vec4Buff1.set(this.startNormal.x,this.startNormal.y,this.startNormal.z,0).applyMatrix4(this.renderingCamera.matrixWorldInverse).applyMatrix4(this.renderingCamera.projectionMatrix).normalize(),s=i.w===0?1:i.w;i.multiplyScalar(1/s).normalize(),this.renderingCamera instanceof ns&&i.negate();const a=kn.vec2Buff0.set(this.normalIndicatorPixelSize/this.renderingSize.x*2,this.normalIndicatorPixelSize/this.renderingSize.y*2),o=kn.vec4Buff0.set(n.x,n.y,n.z,1).add(kn.vec4Buff1.set(i.x*a.x,i.y*a.y,0,0));o.multiplyScalar(r),o.applyMatrix4(this.renderingCamera.projectionMatrixInverse).applyMatrix4(this.renderingCamera.matrixWorld),this.startGizmo.updateLine([e,kn.vec3Buff1.set(o.x,o.y,o.z)]),this.endGizmo.enable(!1,!1,!1,!1)}if(this._state===Li.DANGLING_END){const e=this.startPoint.distanceTo(this.endPoint),n=kn.vec3Buff0.copy(this.startPoint).sub(this.endPoint).normalize();let r=this.startNormal.dot(n);const i=Math.acos(Math.min(Math.max(r,-1),1));this.startLineLength=Math.abs(e*Math.cos(i)),this.midPoint.copy(kn.vec3Buff0.copy(this.startPoint).add(kn.vec3Buff1.copy(this.startNormal).multiplyScalar(this.startLineLength)));const s=kn.vec3Buff1.copy(this.midPoint).sub(this.endPoint).normalize();this.endLineLength=this.midPoint.distanceTo(this.endPoint),r=this.endNormal.dot(s);const a=Math.acos(Math.min(Math.max(r,-1),1)),o=this.endLineLength*Math.cos(a),l=kn.vec3Buff1.copy(this.endPoint).add(kn.vec3Buff2.copy(this.endNormal).multiplyScalar(o)),u=kn.vec3Buff2.copy(this.startPoint),c=kn.vec3Buff3.copy(this.startPoint).add(kn.vec3Buff4.copy(this.startNormal).multiplyScalar(this.startLineLength));this.startGizmo.updateLine([u,c]);const d=kn.vec3Buff3.copy(this.endPoint);this.endGizmo.updateLine([d,l,l,this.midPoint,this.midPoint,d]),this.endGizmo.updatePoint(this.midPoint);const f=kn.vec3Buff0.copy(this.startPoint).add(kn.vec3Buff1.copy(this.startNormal).multiplyScalar(.5*this.startLineLength));this.value=this.midPoint.distanceTo(this.startPoint),this.startGizmo.updateText(`${(this.value*Os("m",this.units)).toFixed(this.precision)} ${this.units}`,f),this.endGizmo.enable(!0,!0,!0,!0)}this._state===Li.COMPLETE&&(this.startGizmo.updateText(`${(this.value*Os("m",this.units)).toFixed(this.precision)} ${this.units}`),this.startGizmo.enable(!1,!0,!0,!0),this.endGizmo.enable(!1,!1,!0,!1))}}raycast(e,n){const r=[];this.startGizmo.raycast(e,r),this.endGizmo.raycast(e,r),r.length&&n.push({distance:r[0].distance,face:r[0].face,faceIndex:r[0].faceIndex,object:this,point:r[0].point,uv:r[0].uv})}highlight(e){this.startGizmo.highlight=e,this.endGizmo.highlight=e}updateClippingPlanes(e){this.startGizmo.updateClippingPlanes(e),this.endGizmo.updateClippingPlanes(e)}}class Y$ extends kn{set isVisible(e){this.startGizmo.enable(e,e,e,e),this.endGizmo.enable(e,e,e,e)}constructor(){super(),this.startGizmo=null,this.endGizmo=null,this.type="PointToPointMeasurement",this.startGizmo=new Ap,this.endGizmo=new Ap({dashedLine:!0,lineOpacity:.25}),this.startLineLength=0,this.add(this.startGizmo),this.add(this.endGizmo),this.layers.set(kt.MEASUREMENTS)}frameUpdate(e,n,r){super.frameUpdate(e,n,r),this.startGizmo.frameUpdate(e,r),this.endGizmo.frameUpdate(e,r)}update(){if(this.startGizmo.updateDisc(this.startPoint,this.startNormal),this.startGizmo.updatePoint(this.startPoint),this.endGizmo.updateDisc(this.endPoint,this.endNormal),this._state===Li.DANGLING_START){const e=kn.vec3Buff0.copy(this.startPoint),n=kn.vec3Buff1.copy(this.startPoint).add(kn.vec3Buff2.copy(this.startNormal).multiplyScalar(this.startLineLength));this.startGizmo.updateLine([e,n]),this.endGizmo.enable(!1,!1,!1,!1)}if(this._state===Li.DANGLING_END){this.startLineLength=this.startPoint.distanceTo(this.endPoint),this.value=this.startLineLength;const e=kn.vec3Buff0.copy(this.endPoint).sub(this.startPoint).normalize(),n=kn.vec3Buff1.copy(this.startPoint).add(kn.vec3Buff2.copy(e).multiplyScalar(this.startLineLength)),r=kn.vec3Buff3.copy(this.startPoint).add(kn.vec3Buff4.copy(e).multiplyScalar(.5*this.startLineLength));this.startGizmo.updateLine([this.startPoint,n]),this.endGizmo.updatePoint(n),this.startGizmo.updateText(`${(this.value*Os("m",this.units)).toFixed(this.precision)} ${this.units}`,r),this.endGizmo.enable(!0,!0,!0,!0)}this._state===Li.COMPLETE&&(this.startGizmo.enable(!1,!0,!0,!0),this.endGizmo.enable(!1,!1,!0,!1),this.startGizmo.updateText(`${(this.value*Os("m",this.units)).toFixed(this.precision)} ${this.units}`))}raycast(e,n){const r=[];this.startGizmo.raycast(e,r),this.endGizmo.raycast(e,r),r.length&&n.push({distance:r[0].distance,face:r[0].face,faceIndex:r[0].faceIndex,object:this,point:r[0].point,uv:r[0].uv})}highlight(e){this.startGizmo.highlight=e,this.endGizmo.highlight=e}updateClippingPlanes(e){this.startGizmo.updateClippingPlanes(e),this.endGizmo.updateClippingPlanes(e)}}(function(t){t[t.PERPENDICULAR=0]="PERPENDICULAR",t[t.POINTTOPOINT=1]="POINTTOPOINT"})(A1||(A1={}));const Q1t={visible:!0,type:A1.POINTTOPOINT,vertexSnap:!0,units:"m",precision:2};class _1t{constructor(e){this.renderer=null,this.measurements=[],this.measurement=null,this.selectedMeasurement=null,this.raycaster=null,this._options=Object.assign({},Q1t),this.frameLock=!1,this._enabled=!1,this._paused=!1,this.pointBuff=new U,this.normalBuff=new U,this.screenBuff0=new Oe,this.screenBuff1=new Oe,this.renderer=e,this.raycaster=new yy,this.raycaster.layers.set(kt.MEASUREMENTS),this.renderer.input.on("pointer-move",this.onPointerMove.bind(this)),this.renderer.input.on($t.ObjectClicked,this.onPointerClick.bind(this)),this.renderer.input.on($t.ObjectDoubleClicked,this.onPointerDoubleClick.bind(this))}get enabled(){return this._enabled}get visible(){return this._options.visible}set enabled(e){this._enabled=e,this.measurement&&(this.measurement.isVisible=e,this.measurement.update()),this.renderer.needsRender=!0,this.renderer.resetPipeline()}set paused(e){this._paused=e}set options(e){const n=this._options.type!==e.type&&this.measurement&&this.measurement.state===Li.DANGLING_START;Object.assign(this._options,e),n&&(this.cancelMeasurement(),this.startMeasurement()),this.applyOptions()}update(){this._enabled&&(this.frameLock=!1,this.renderer.renderer.getDrawingBufferSize(this.screenBuff0),this.measurement&&this.measurement.frameUpdate(this.renderer.camera,this.screenBuff0,this.renderer.sceneBox),this.measurements.forEach(e=>{e.frameUpdate(this.renderer.camera,this.screenBuff0,this.renderer.sceneBox)}))}fromMeasurementData(e,n){const r=new Y$;r.startPoint.copy(e),r.endPoint.copy(n),r.state=Li.DANGLING_END,r.update(),r.state=Li.COMPLETE,r.update(),this.measurements.push(this.measurement)}updateClippingPlanes(e){this.measurements.forEach(n=>{n.updateClippingPlanes(e)})}onPointerMove(e){if(!this._enabled||this._paused||this.frameLock)return;let n=this.renderer.intersections.intersect(this.renderer.scene,this.renderer.camera,e,!0,this.renderer.currentSectionBox,[kt.STREAM_CONTENT_MESH])||[];n=n.filter(r=>{const i=r.object.getBatchObjectMaterial(r.batchObject);return!(i instanceof bx)&&i.visible}),n.length&&(this.measurement||this.startMeasurement(),this.measurement.isVisible=!0,this.pointBuff.copy(n[0].point),this.normalBuff.copy(n[0].face.normal),this._options.vertexSnap&&this.snap(n[0],this.pointBuff,this.normalBuff),this.measurement.state===Li.DANGLING_START?(this.measurement.startPoint.copy(this.pointBuff),this.measurement.startNormal.copy(this.normalBuff)):this.measurement.state===Li.DANGLING_END&&(this.measurement.endPoint.copy(this.pointBuff),this.measurement.endNormal.copy(this.normalBuff)),this.measurement.update(),this.renderer.needsRender=!0,this.renderer.resetPipeline(this.renderer.camera.type==="OrthographicCamera"),this.frameLock=!0)}onPointerClick(e){this._enabled&&(e.event.button!==2?this.measurement&&(this.measurement.state===Li.DANGLING_START?this.measurement.state=Li.DANGLING_END:this.measurement.state===Li.DANGLING_END&&this.finishMeasurement()):this.cancelMeasurement())}onPointerDoubleClick(e){this._options.type!==A1.PERPENDICULAR||this.autoLazerMeasure(e)}autoLazerMeasure(e){if(!this.measurement)return;this.measurement.state=Li.DANGLING_START;let n=this.renderer.intersections.intersect(this.renderer.scene,this.renderer.camera,e,!0,this.renderer.currentSectionBox,[kt.STREAM_CONTENT_MESH])||[];if(n=n.filter(o=>{const l=o.object.getBatchObjectMaterial(o.batchObject);return!(l instanceof bx)&&l.visible}),!n.length)return;const r=new U().copy(n[0].point),i=new U().copy(n[0].face.normal),s=new U().copy(r).add(new U().copy(i).multiplyScalar(1e-6));let a=this.renderer.intersections.intersectRay(this.renderer.scene,this.renderer.camera,new Ko(s,i),!0,this.renderer.currentSectionBox,[kt.STREAM_CONTENT_MESH])||[];a=a.filter(o=>{const l=o.object.getBatchObjectMaterial(o.batchObject);return!(l instanceof bx)&&l.visible}),a.length?(this.measurement.startPoint.copy(r),this.measurement.startNormal.copy(i),this.measurement.endPoint.copy(a[0].point),this.measurement.endNormal.copy(a[0].face.normal),this.measurement.state=Li.DANGLING_END,this.measurement.update(),this.finishMeasurement()):this.flashMeasurement()}startMeasurement(){this._options.type===A1.PERPENDICULAR?this.measurement=new H1t:this._options.type===A1.POINTTOPOINT&&(this.measurement=new Y$),this.measurement.state=Li.DANGLING_START,this.measurement.frameUpdate(this.renderer.camera,this.screenBuff0,this.renderer.sceneBox),this.renderer.scene.add(this.measurement)}cancelMeasurement(){this.renderer.scene.remove(this.measurement),this.measurement=null,this.renderer.needsRender=!0,this.renderer.resetPipeline()}finishMeasurement(){this.measurement.state=Li.COMPLETE,this.measurement.update(),this.measurement.value>0?this.measurements.push(this.measurement):(this.renderer.scene.remove(this.measurement),Zt.error("Ignoring zero value measurement!")),this.measurement=null}snap(e,n,r){const i=e.batchObject.bvh.getVertexAtIndex(e.face.a).project(this.renderer.camera),s=e.batchObject.bvh.getVertexAtIndex(e.face.b).project(this.renderer.camera),a=e.batchObject.bvh.getVertexAtIndex(e.face.c).project(this.renderer.camera),o=e.point.project(this.renderer.camera),l=[i,s,a];l.sort((f,h)=>o.distanceTo(f)-o.distanceTo(h));const u=this.renderer.NDCToScreen(l[0].x,l[0].y),c=this.renderer.NDCToScreen(o.x,o.y);this.screenBuff0.set(u.x,u.y),this.screenBuff1.set(c.x,c.y);const d=l[0].unproject(this.renderer.camera);this.screenBuff0.distanceTo(this.screenBuff1)<10*window.devicePixelRatio&&(n.copy(d),r.copy(e.face.normal))}flashMeasurement(){let e=0;const n=setInterval(()=>{this.measurement.highlight(!!(e++%2)),e>=5&&clearInterval(n),this.renderer.needsRender=!0,this.renderer.resetPipeline()},100)}pickMeasurement(e){var n;return this.measurements.forEach(r=>{r.highlight(!1)}),this.raycaster.setFromCamera(e,this.renderer.camera),(n=this.raycaster.intersectObjects(this.measurements,!1)[0])===null||n===void 0?void 0:n.object}selectMeasurement(e,n){this.cancelMeasurement(),e.highlight(n),this.selectedMeasurement=e}removeMeasurement(){this.selectedMeasurement?(this.measurements.splice(this.measurements.indexOf(this.selectedMeasurement),1),this.renderer.scene.remove(this.selectedMeasurement),this.selectedMeasurement=null,this.renderer.needsRender=!0,this.renderer.resetPipeline()):this.cancelMeasurement()}applyOptions(){[this.measurement,...this.measurements].forEach(e=>{e&&(e.units=this._options.units,e.precision=this._options.precision,e.update())}),this.renderer.enableLayers([kt.MEASUREMENTS],this._options.visible),this.renderer.needsRender=!0,this.renderer.resetPipeline()}}var kt;(function(t){t[t.STREAM_CONTENT_MESH=10]="STREAM_CONTENT_MESH",t[t.STREAM_CONTENT_LINE=11]="STREAM_CONTENT_LINE",t[t.STREAM_CONTENT_POINT=12]="STREAM_CONTENT_POINT",t[t.STREAM_CONTENT_TEXT=13]="STREAM_CONTENT_TEXT",t[t.STREAM_CONTENT_POINT_CLOUD=14]="STREAM_CONTENT_POINT_CLOUD",t[t.STREAM_CONTENT=1]="STREAM_CONTENT",t[t.PROPS=2]="PROPS",t[t.SHADOWCATCHER=3]="SHADOWCATCHER",t[t.MEASUREMENTS=4]="MEASUREMENTS"})(kt||(kt={}));class $1t{get renderer(){return this._renderer}set needsRender(e){this._needsRender||(this._needsRender=e)}set indirectIBL(e){this._scene.environment=e}set indirectIBLIntensity(e){const n=this.batcher.getBatches(void 0,st.MESH);for(let r=0;r{n.name.includes("_bvh")&&(n.visible=this.SHOW_BVH)})}get shadowcatcher(){return this._shadowcatcher}get intersections(){return this._intersections}get currentSectionBox(){return this.viewer.sectionBox.getCurrentBox()}get measurements(){return this._measurements}constructor(e){this.SHOW_HELPERS=!1,this.IGNORE_ZERO_OPACITY_OBJECTS=!0,this.SHOW_BVH=!1,this.sunConfiguration=y1t,this.filterBatchRecording=[],this.lastSectionPlanes=[],this.sectionPlanesChanged=[],this.sectionBoxOutlines=null,this._shadowcatcher=null,this._measurements=null,this.cancel={},this.explodeTime=-1,this.explodeRange=0,this._scene=new RT,this.rootGroup=new $a,this.rootGroup.name="ContentGroup",this.rootGroup.layers.set(kt.STREAM_CONTENT),this._scene.add(this.rootGroup),this._intersections=new X1t,this.viewer=e,this.lastSectionPlanes.push(new ri,new ri,new ri,new ri,new ri,new ri)}create(e){this._renderer=new xr({antialias:!0,alpha:!0,preserveDrawingBuffer:!0,stencil:!0}),this._renderer.setClearColor(16777215,0),this._renderer.setPixelRatio(window.devicePixelRatio),this._renderer.outputEncoding=Jr,this._renderer.toneMapping=bK,this._renderer.toneMappingExposure=.5,this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=cv,this.renderer.shadowMap.autoUpdate=!1,this.renderer.shadowMap.needsUpdate=!0,this.renderer.physicallyCorrectLights=!0,this.renderer.autoClearStencil=!1,this.container=e,this._renderer.setSize(e.offsetWidth,e.offsetHeight),e.appendChild(this._renderer.domElement),this.batcher=new I1t(this.renderer.capabilities.maxVertexUniforms,this.renderer.capabilities.floatVertexTextures),this.pipeline=new Wp(this._renderer,this.batcher),this.pipeline.configure(),this.pipeline.pipelineOptions=zge,this.sectionBoxOutlines=new Qd;const n=new $a;if(n.name="SectionBoxOutlines",this.scene.add(n),n.add(this.sectionBoxOutlines.getPlaneOutline(Yr.NEGATIVE_Z).renderable),n.add(this.sectionBoxOutlines.getPlaneOutline(Yr.POSITIVE_Z).renderable),n.add(this.sectionBoxOutlines.getPlaneOutline(Yr.POSITIVE_X).renderable),n.add(this.sectionBoxOutlines.getPlaneOutline(Yr.NEGATIVE_X).renderable),n.add(this.sectionBoxOutlines.getPlaneOutline(Yr.POSITIVE_Y).renderable),n.add(this.sectionBoxOutlines.getPlaneOutline(Yr.NEGATIVE_Y).renderable),this.input=new U9(this._renderer.domElement,U1t),this.input.on($t.ObjectClicked,this.onObjectClick.bind(this)),this.input.on($t.ObjectDoubleClicked,this.onObjectDoubleClick.bind(this)),this.addDirectLights(),this.SHOW_HELPERS){const i=new $a;i.name="Helpers",this._scene.add(i);const s=new OT(this.sceneBox,new tt(255));s.name="SceneBoxHelper",s.layers.set(kt.PROPS),i.add(s);const a=new gde(this.sun,50,16711680);a.name="DirLightHelper",a.layers.set(kt.PROPS),i.add(a);const o=new iq(this.sun.shadow.camera);o.name="CamHelper",o.layers.set(kt.PROPS),i.add(o)}let r;this.viewer.cameraHandler.controls.restThreshold=.001,this.viewer.cameraHandler.controls.addEventListener("rest",()=>{this._needsRender=!0,this.pipeline.onStationaryBegin(),this._measurements.paused=!1}),this.viewer.cameraHandler.controls.addEventListener("controlstart",()=>{this._needsRender=!0,this.pipeline.onStationaryEnd()}),this.viewer.cameraHandler.controls.addEventListener("controlend",()=>{this._needsRender=!0,this.viewer.cameraHandler.controls.hasRested&&this.pipeline.onStationaryBegin(),this._measurements.paused=!1}),this.viewer.cameraHandler.controls.addEventListener("control",()=>{this._needsRender=!0,this.pipeline.onStationaryEnd(),this._measurements.paused=!0}),this.viewer.cameraHandler.controls.addEventListener("update",()=>{this.viewer.cameraHandler.controls.hasRested||this.pipeline.renderType!==nl.ACCUMULATION||(this._needsRender=!0,this.pipeline.onStationaryEnd())}),this._shadowcatcher=new Xc(kt.SHADOWCATCHER,[kt.STREAM_CONTENT_MESH]),this._shadowcatcher.shadowcatcherPass.onBeforeRender=()=>{r=this.batcher.saveVisiblity();const i=this.batcher.getOpaque();this.batcher.applyVisibility(i)},this._shadowcatcher.shadowcatcherPass.onAfterRender=()=>{this.batcher.applyVisibility(r)},this._scene.add(this._shadowcatcher.shadowcatcherMesh),this._measurements=new _1t(this)}update(e){this.needsRender=this.viewer.cameraHandler.controls.update(e),this.batcher.update(e),this.updateRTEShadows(),this.updateTransforms(),this.updateFrustum(),this._measurements.update(),this.pipeline.update(this),this.sunConfiguration.shadowcatcher&&this._shadowcatcher.update(this._scene),this.explodeTime>-1&&(this.explode(this.explodeTime,this.explodeRange),this.explodeTime=-1)}updateRTEShadows(){if(!this._renderer.shadowMap.needsUpdate)return;const e=new U,n=new U,r=new U;e.set(this.sun.shadow.camera.matrixWorld.elements[12],this.sun.shadow.camera.matrixWorld.elements[13],this.sun.shadow.camera.matrixWorld.elements[14]),ur.DoubleToHighLowVector(e,n,r);const i=new Be;i.copy(this.sun.shadow.camera.matrixWorldInverse),i.elements[12]=0,i.elements[13]=0,i.elements[14]=0;const s=new Be;s.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),s.multiply(this.sun.shadow.camera.projectionMatrix),s.multiply(i);const a=new Be,o=this.batcher.getBatches(void 0,st.MESH);for(let l=0;l{this.addBatch(r,n)}),this.updateDirectLights(),this.updateHelpers(),this.viewer.sectionBox.display.visible&&this.viewer.setSectionBox(),this.updateShadowCatcher(),this._needsRender=!0}async addRenderTreeAsync(e,n=1,r=!0){this.cancel[e]=!1;const i=new $a;i.name=e,i.layers.set(kt.STREAM_CONTENT),this.rootGroup.add(i);const s=this.batcher.makeBatchesAsync(this.viewer.getWorldTree().getRenderTree(e),S1,void 0,n);for await(const a of s)if(a&&(this.addBatch(a,i),r&&this.zoom(),a.geometryType===st.MESH&&this.updateDirectLights(),this._needsRender=!0,this.cancel[e])){s.return(),this.removeRenderTree(e),delete this.cancel[e];break}this.updateHelpers(),this.updateShadowCatcher(),this.viewer.sectionBox.display.visible&&this.viewer.setSectionBox(),delete this.cancel[e]}addBatch(e,n){const r=e.renderObject;if(n.add(e.renderObject),e.geometryType===st.MESH){const i=r.material;if(r.castShadow=!i.transparent,r.receiveShadow=!i.transparent,r.customDepthMaterial=new bs({depthPacking:ST},["USE_RTE","ALPHATEST_REJECTION"]),this.SHOW_BVH){const s=new UD(r,10);s.name=e.renderObject.id+"_bvh",s.traverse(a=>{a.layers.set(kt.PROPS)}),s.displayParents=!0,s.visible=!1,s.update(),n.add(s)}r.BVH.boxHelpers.forEach(s=>{this.scene.add(s)})}this.viewer.World.expandWorld(e.bounds)}removeRenderTree(e){this.rootGroup.remove(this.rootGroup.getObjectByName(e)),this.updateShadowCatcher(),this.batcher.getBatches(e).forEach(n=>{this.viewer.World.reduceWorld(n.bounds)}),this.batcher.purgeBatches(e),this.updateDirectLights(),this.updateHelpers()}cancelRenderTree(e){this.cancel[e]!==void 0&&(this.cancel[e]=!0)}clearFilter(){this.batcher.resetBatchesDrawRanges(),this.filterBatchRecording=[]}applyFilter(e,n){this.filterBatchRecording.push(...this.batcher.setObjectsFilterMaterial(e,n))}applyDirectFilter(e,n){return this.batcher.insertObjectsFilterMaterial(e,n)}removeDirectFilter(e){this.batcher.removeObjectsMaterial(e)}applyMaterial(e,n){const r={needsCopy:!0};this.filterBatchRecording.push(...this.batcher.setObjectsMaterial(e,i=>({offset:i.batchStart,count:i.batchCount,material:n,materialOptions:r})))}beginFilter(){this.filterBatchRecording=[]}endFilter(){this.batcher.autoFillDrawRanges(this.filterBatchRecording),this.updateClippingPlanes(this.viewer.sectionBox.planes),this.viewer.sectionBox.display.visible&&this.updateSectionBoxCapper(),this.renderer.shadowMap.needsUpdate=!0,this.updateShadowCatcher()}getBatchMaterials(){return Object.keys(this.batcher.batches).reduce((e,n)=>({...e,[n]:this.batcher.batches[n].batchMaterial}),{})}updateClippingPlanes(e){this.allObjects&&(e||(e=this.viewer.sectionBox.planes),this.allObjects.traverse(n=>{const r=n.material;if(r)if(Array.isArray(r))for(let i=0;i1e-4&&this.sectionPlanesChanged.push(e[n]),this.lastSectionPlanes[n].copy(e[n])}onSectionBoxDragStart(){this.sectionBoxOutlines.enable(!1)}onSectionBoxDragEnd(){const e=()=>{this.setSectionPlaneChanged(this.viewer.sectionBox.planes),this.updateSectionBoxCapper(this.sectionPlanesChanged),this.updateShadowCatcher(),this.viewer.removeListener($t.SectionBoxUpdated,e)};this.viewer.on($t.SectionBoxUpdated,e)}updateSectionBoxCapper(e){const n=performance.now();e||(e=this.viewer.sectionBox.planes);for(let r=0;r{o.name.includes("_bvh")&&(o.visible=!0)}));let i=!1;e.multiSelect&&(i=!0);const s=this.queryHits(r);if(!s)return void this.viewer.emit($t.ObjectClicked,i?{multiple:!0,event:e.event}:null);const a={multiple:i,event:e.event,hits:s.map(o=>({guid:o.node.model.id,object:o.node.model.raw,point:o.point}))};this.viewer.emit($t.ObjectClicked,a)}onObjectDoubleClick(e){const n=this._measurements.pickMeasurement(e);if(n)return void this.zoomToBox(n.bounds);if(this._measurements.enabled)return;const r=this._intersections.intersect(this._scene,this.viewer.cameraHandler.activeCam.camera,e,!0,this.viewer.sectionBox.getCurrentBox());if(!r)return void this.viewer.emit($t.ObjectDoubleClicked,null);let i=!1;e.multiSelect&&(i=!0);const s=this.queryHits(r);if(!s)return void this.viewer.emit($t.ObjectClicked,null);const a={multiple:i,hits:s.map(o=>({guid:o.node.model.id,object:o.node.model.raw,point:o.point}))};this.viewer.emit($t.ObjectDoubleClicked,a)}boxFromObjects(e){let n=new Jt;const r=[];e.length>0?this.viewer.getWorldTree().walk(i=>!i.model.atomic||!i.model.raw||(e.indexOf(i.model.raw.id)!==-1&&r.push(...this.viewer.getWorldTree().getRenderTree().getRenderViewsForNode(i,i)),!0)):n=this.sceneBox;for(let i=0;ir.renderViews.length-i.renderViews.length);const n=[];for(let r=0;ri.mesh).flatMap(i=>i.batchObjects).filter(i=>r.includes(i.renderView))}markTransformsDirty(e){this.batcher.batches[e].mesh.transformsDirty=!0}enableLayers(e,n){this.pipeline.composer.passes.forEach(r=>{r instanceof fm&&e.forEach(i=>{r.enableLayer(i,n)})})}}class ebt extends lw{constructor(e,n){let r;super(),this.viewer=e,this.raycaster=new yy,this.raycaster.params.Line.threshold=.1,this.raycaster.params.Line2={},this.raycaster.params.Line2.threshold=1,this.raycaster.layers.set(kt.PROPS),this.subset=n!==void 0&&n.subset!==void 0?n.subset:null,this.pointerDown=!1,this.checkForSectionBoxInclusion=!0,n!==void 0&&n.checkForSectionBoxInclusion&&(this.sectionBox=n.checkForSectionBoxInclusion),this.viewer.speckleRenderer.renderer.domElement.addEventListener("pointerdown",i=>{i.preventDefault(),r=new Date().getTime()}),this.viewer.speckleRenderer.renderer.domElement.addEventListener("pointerup",i=>{if(i.preventDefault(),this.viewer.cameraHandler.orbiting)return;const s=new Date().getTime()-r;if(this.pointerDown=!1,s>250)return;const a=this.getClickedObjects(i);this.emit("object-clicked",a)}),this.tapTimeout,this.lastTap=0,this.touchLocation,this.viewer.speckleRenderer.renderer.domElement.addEventListener("touchstart",i=>{this.touchLocation=i.targetTouches[0]}),this.viewer.speckleRenderer.renderer.domElement.addEventListener("touchend",i=>{if(i.targetTouches.length>0)return;const s=new Date().getTime(),a=s-this.lastTap;if(clearTimeout(this.tapTimeout),a<500&&a>0){const o=this.getClickedObjects(this.touchLocation);this.emit("object-doubleclicked",o)}else this.tapTimeout=setTimeout(function(){clearTimeout(this.tapTimeout)},500);this.lastTap=s}),this.viewer.speckleRenderer.renderer.domElement.addEventListener("dblclick",i=>{const s=this.getClickedObjects(i);this.emit("object-doubleclicked",s)}),this.multiSelect=!1,document.addEventListener("keydown",i=>{i.isComposing||i.keyCode===229||(i.key==="Shift"&&(this.multiSelect=!0),i.key==="Escape"&&this.unselect())}),document.addEventListener("keyup",i=>{i.isComposing||i.keyCode===229||i.key==="Shift"&&(this.multiSelect=!1)}),this.originalSelectionObjects=[]}unselect(){this.originalSelectionObjects=[]}getClickedObjects(e){const n=this._getNormalisedClickPosition(e);this.raycaster.setFromCamera(n,this.viewer.cameraHandler.activeCam.camera);let r=[];return this.viewer.sectionBox.display.visible&&this.checkForSectionBoxInclusion&&(r=this.raycaster.intersectObject(this.viewer.sectionBox.cube)),r}_getNormalisedClickPosition(e){const n=this.viewer.speckleRenderer.renderer.domElement,r=this.viewer.speckleRenderer.renderer.domElement.getBoundingClientRect(),i=(e.clientX-r.left)*n.width/r.width,s=(e.clientY-r.top)*n.height/r.height;return{x:i/n.width*2-1,y:s/n.height*-2+1}}dispose(){super.dispose(),this.unselect(),this.originalSelectionObjects=null}}const kge="section-box-drag-start",Oge="section-box-drag-end";class tbt extends lw{constructor(e){super(),this.viewer=e,this.viewer.speckleRenderer.renderer.localClippingEnabled=!0,this.dragging=!1,this.display=new $a,this.display.name="SectionBox",this.display.layers.set(kt.PROPS),this.viewer.speckleRenderer.scene.add(this.display),this.boxGeometry=this._generateSimpleCube(5,5,5),this.material=new pp({color:65535,opacity:0,wireframe:!1,side:rn}),this.cube=new ut(this.boxGeometry,this.material),this.cube.visible=!1,this.cube.layers.set(kt.PROPS),this.display.add(this.cube),this.boxHelper=new OT(this.boxGeometry.boundingBox,681727),this.boxHelper.material.opacity=.4,this.boxHelper.layers.set(kt.PROPS),this.display.add(this.boxHelper);const n=new Sf(.01,10,10);this.sphere=new ut(n,new pp({color:65535})),this.sphere.layers.set(kt.PROPS),this.sphere.visible=!1,this.display.add(this.sphere),this.plane=new ao(1,1),this.hoverPlane=new ut(this.plane,new pp({transparent:!0,side:rn,opacity:.1,wireframe:!1,color:681727,metalness:.1,roughness:.75})),this.hoverPlane.visible=!1,this.hoverPlane.layers.set(kt.PROPS),this.display.add(this.hoverPlane),this.dragging=!1,this._setupControls(),this.sidesSimple={256:{verts:[1,2,5,6],axis:"x"},152:{verts:[1,2,5,6],axis:"x"},407:{verts:[0,3,4,7],axis:"x"},703:{verts:[0,3,4,7],axis:"x"},327:{verts:[2,3,6,7],axis:"y"},726:{verts:[2,3,6,7],axis:"y"},450:{verts:[0,1,4,5],axis:"y"},"051":{verts:[0,1,4,5],axis:"y"},312:{verts:[0,1,3,2],axis:"z"},"013":{verts:[0,1,3,2],axis:"z"},546:{verts:[4,5,7,6],axis:"z"},647:{verts:[4,5,7,6],axis:"z"}},this._generateOrUpdatePlanes(),this.currentRange=null,this.prevPosition=null,this.attachedToBox=!0,this.selectionHelper=new ebt(this.viewer,{subset:[this.cube],hover:!1,checkForSectionBoxInclusion:!1}),this.selectionHelper.on($t.ObjectClicked,this._clickHandler.bind(this)),this.selectionHelper.on("hovered",()=>{}),document.addEventListener("keydown",r=>{r.key==="Escape"&&this.viewer.mouseOverRenderer&&this._attachControlsToBox()}),this._attachControlsToBox(),this.viewer.on("projection-change",(function(){this._setupControls(),this._attachControlsToBox()}).bind(this))}_setupControls(){var e,n;(e=this.controls)===null||e===void 0||e.dispose(),(n=this.controls)===null||n===void 0||n.detach(),this.controls=new b0e(this.viewer.cameraHandler.activeCam.camera,this.viewer.speckleRenderer.renderer.domElement);for(let r=0;r{i.layers.set(kt.PROPS)});this.controls.getRaycaster().layers.set(kt.PROPS),this.controls.setSize(.75),this.display.add(this.controls),this.controls.addEventListener("change",this._draggingChangeHandler.bind(this)),this.controls.addEventListener("dragging-changed",r=>{if(!this.display.visible)return;const i=!!r.value;i?(this.emit(kge),this.dragging=i,this.viewer.cameraHandler.enabled=!i):(this.emit(Oge),setTimeout(()=>{this.dragging=i,this.viewer.cameraHandler.enabled=!i},100))}),this.viewer.needsRender=!0}_draggingChangeHandler(){if(this.display.visible){if(this.boxGeometry.computeBoundingBox(),this.boxHelper.box.copy(this.boxGeometry.boundingBox),this.dragging&&this.currentRange){this._generateOrUpdatePlanes(),this.prevPosition===null&&(this.prevPosition=this.hoverPlane.position.clone()),this.prevPosition.sub(this.hoverPlane.position),this.prevPosition.negate();const e=this.boxGeometry.attributes.position.array;for(let n=0;n!!n.model.data&&e(n.model.guid,n.model.data)).map(n=>n.model.data)}findFirst(e){return this.root.first(n=>!!n.model.data&&e(n.model.guid,n.model.data)).model.data}walk(e){this.root.walk(n=>!n.model.data||e(n.model.guid,n.model.data))}}class rbt{static build(e){const n=new nbt;let r=null;return e.root.walk(i=>{if(!i.parent)return r=n.root,!0;r=n.root.first(a=>a.model.guid===i.parent.model.id);const s=e.parse({guid:i.model.id,data:i.model.raw,atomic:i.model.atomic,children:[]});return r.addChild(s),!0},e.root),n}}class ibt{get treeBounds(){return this._treeBounds}get id(){return this.root.model.id}constructor(e,n){this._treeBounds=new Jt,this.cancel=!1,this.tree=e,this.root=n}buildRenderTree(){this.root.walk(e=>{const n=this.buildRenderNode(e);return e.model.renderView=n?new Is(n):null,this.applyTransforms(e),!0})}buildRenderTreeAsync(e){return this.tree.walkAsync(n=>{const r=this.buildRenderNode(n);return n.model.renderView=r?new Is(r):null,this.applyTransforms(n),!this.cancel},this.root,e)}applyTransforms(e){if(e.model.renderView){const n=this.computeTransform(e);e.model.renderView.hasGeometry?(e.model.renderView.renderData.geometry.bakeTransform&&n.multiply(e.model.renderView.renderData.geometry.bakeTransform),ur.transformGeometryData(e.model.renderView.renderData.geometry,n),e.model.renderView.computeAABB(),this._treeBounds.union(e.model.renderView.aabb),Sn.keepGeometryData||Sn.disposeNodeGeometryData(e.model)):e.model.renderView.hasMetadata&&e.model.renderView.renderData.geometry.bakeTransform.premultiply(n)}}buildRenderNode(e){let n=null;const r=Sn.convertNodeToGeometryData(e.model);if(r){const i=this.getRenderMaterialNode(e),s=this.getDisplayStyleNode(e);n={id:e.model.id,speckleType:Sn.getSpeckleType(e.model),geometry:r,renderMaterial:Ic.renderMaterialFromNode(i||s,e),displayStyle:Ic.displayStyleFromNode(s||i)}}return n}getRenderMaterialNode(e){if(e.model.raw.renderMaterial)return e;const n=this.tree.getAncestors(e);for(let r=0;r0){const a=r[i].model.raw.id;if(r[i-1].model.raw.host===a)continue}n.premultiply(s.geometry.transform)}}return n}getRenderableRenderViews(...e){return this.root.all(n=>n.model.renderView!==null&&(n.model.renderView.hasGeometry||n.model.renderView.hasMetadata)&&e.includes(n.model.renderView.renderData.speckleType)).map(n=>n.model.renderView)}getRenderableNodes(...e){return this.root.all(n=>n.model.renderView!==null&&(n.model.renderView.hasGeometry||n.model.renderView.hasMetadata)&&e.includes(n.model.renderView.renderData.speckleType))}getRenderViewsForNode(e,n){return e.model.atomic&&e.model.renderView&&Sn.getSpeckleType(e.model)!==Kt.RevitInstance&&Sn.getSpeckleType(e.model)!==Kt.BlockInstance?[e.model.renderView]:(n||e.parent).all(r=>r.model.renderView&&(r.model.renderView.hasGeometry||r.model.renderView.hasMetadata)).map(r=>r.model.renderView)}getRenderViewNodesForNode(e,n){return e.model.atomic&&e.model.renderView&&Sn.getSpeckleType(e.model)!==Kt.RevitInstance&&Sn.getSpeckleType(e.model)!==Kt.BlockInstance?[e]:(n||e.parent).all(r=>r.model.renderView&&(r.model.renderView.hasGeometry||r.model.renderView.hasMetadata))}getAtomicParent(e){return e.model.atomic?e:this.tree.getAncestors(e).find(n=>n.model.atomic)}getRenderViewsForNodeId(e){const n=this.tree.findId(e);return n?this.getRenderViewsForNode(n):(Zt.warn(`Id ${e} does not exist`),null)}getRenderViewForNodeId(e){const n=this.tree.findId(e);return n?n.model.renderView:(Zt.warn(`Id ${e} does not exist`),null)}purge(){this.tree=null}cancelBuild(e){this.cancel=!0,this.tree.purge(e),this.purge()}}class Xb{constructor(){this.renderTreeInstances={},this.supressWarnings=!0,this.tree=new h4,this._root=this.parse({id:Xb.ROOT_ID,raw:{},atomic:!0,children:[],renderView:null})}getRenderTree(e){if(!this._root)return console.error("WorldTree not initialised"),null;const n=e||this.root.model.id;return this.renderTreeInstances[n]||(this.renderTreeInstances[n]=new ibt(this,this.findId(n))),this.renderTreeInstances[n]}getDataTree(){return rbt.build(this)}get root(){return this._root}isRoot(e){return e===this._root}parse(e){return this.tree.parse(e)}addSubtree(e){this._root.addChild(e)}addNode(e,n){n!==null?n.addChild(e):Zt.error("Invalid parent node!")}removeNode(e){e.drop()}findAll(e,n){return n||this.supressWarnings||Zt.warn("Root will be used for searching. You might not want that"),(n||this.root).all(e)}findId(e,n){return n||this.supressWarnings||Zt.warn("Root will be used for searching. You might not want that"),(n||this.root).first(r=>r.model.id===e)}getAncestors(e){return e.getPath().reverse().slice(1)}walk(e,n){n||this.supressWarnings||Zt.warn("Root will be used for searching. You might not want that"),this._root.walk(e,n)}async walkAsync(e,n,r){n||this.supressWarnings||Zt.warn("Root will be used for searching. You might not want that");const i=vW.getPause(r),s=async function*o(l,u){let c,d;for(yield l(u),c=0,d=u.children.length;cdelete this.renderTreeInstances[n]),this._root.drop(),this._root.children.length=0,this.tree=new h4,this._root=this.tree.parse({id:Xb.ROOT_ID,raw:{},atomic:!0,children:[]})}}Xb.ROOT_ID="ROOT";const Ige=function(t){const e={};for(const n in t){if(["id","__closure","__parents","bbox","totalChildrenCount"].includes(n))continue;const r=t[n];if(r!=null&&!Array.isArray(r))if(r.constructor!==Object)["string","number","boolean"].includes(typeof r)&&(e[n]=r);else{const i=Ige(r);for(const s in i)e[`${n}.${s}`]=i[s]}}return t.id&&(e.id=t.id),e};class sbt{constructor(){this.propCache={}}getProperties(e,n=null,r=!1){let i=e.root;if(!r&&this.propCache[n||i.model.id])return this.propCache[n||i.model.id];if(n){const o=i.children.find(l=>l.model.id===n);if(!o)throw new Error(`Could not find root node for ${n} - is it loaded?`);i=o}const s={};e.walk(o=>{if(!o.model.atomic)return!0;const l=Ige(o.model.raw);for(const u in l)Array.isArray(l[u])||(s[u]||(s[u]=[]),s[u].push({value:l[u],id:l.id}))},i);const a=[];for(const o in s){const l=s[o],u={};if(u.key=o,u.type=typeof l[0].value=="string"?"string":"number",u.objectCount=l.length,u.type==="string"){const c=u,d={};for(const{value:f,id:h}of l)d[f]||(d[f]=[]),d[f].push(h);c.valueGroups=[];for(const f in d)c.valueGroups.push({value:f,ids:d[f]});c.valueGroups=c.valueGroups.sort((f,h)=>f.value.localeCompare(h.value))}if(u.type==="number"){const c=u;c.min=Number.MAX_VALUE,c.max=Number.MIN_VALUE;for(const{value:d}of l)dc.max&&(c.max=d);c.valueGroups=l.sort((d,f)=>d.value-f.value)}a.push(u)}return this.propCache[i.model.id]=a,a}}class Lh{static isPointQuery(e){return e.operation==="Project"||e.operation==="Unproject"}static isIntersectionQuery(e){return e.operation==="Occlusion"||e.operation==="Pick"}}var jP;Lh.DefaultPointQuerySolver=new class{setContext(t){this.renderer=t}solve(t){switch(t.operation){case"Project":return this.solveProjection(t);case"Unproject":return this.solveUnprojection(t);default:Zt.error("Malformed query")}}solveProjection(t){const e=new U(t.point.x,t.point.y,t.point.z);return e.project(this.renderer.camera),{x:e.x,y:e.y,z:e.z}}solveUnprojection(t){const e=new U(t.point.x,t.point.y,t.point.z);return e.unproject(this.renderer.camera),{x:e.x,y:e.y,z:e.z}}},Lh.DefaultIntersectionQuerySolver=new class{constructor(){this.vecBuff0=new U,this.vecBuff1=new U}setContext(t){this.renderer=t}solve(t){switch(t.operation){case"Occlusion":return this.solveOcclusion(t);case"Pick":return this.solvePick(t);default:Zt.error("Malformed query")}}solveOcclusion(t){const e=this.vecBuff0.set(t.point.x,t.point.y,t.point.z),n=this.vecBuff1.copy(e).sub(this.renderer.camera.position);n.normalize();const r=new Ko(this.renderer.camera.position,n),i=this.renderer.intersections.intersectRay(this.renderer.scene,this.renderer.camera,r,!0,this.renderer.currentSectionBox,[kt.STREAM_CONTENT_MESH]);if(!i||i.length===0)return{objects:null};const s=this.renderer.queryHitIds(i);if(!s)return{objects:null};let a=this.renderer.camera.position.distanceTo(e);return a-=t.tolerance,a({guid:n.node.model.id,object:n.node.model.raw,point:n.point}))}:null}},function(t){t[t.PLAIN=0]="PLAIN",t[t.COLORED=1]="COLORED"}(jP||(jP={}));class abt{get materialGroups(){return this._materialGroups}constructor(e){this.tree=null,this.addedMaterialMesh=null,this.changedNewMaterialMesh=null,this.changedOldMaterialMesh=null,this.removedMaterialMesh=null,this.addedMaterialPoint=null,this.changedNewMaterialPoint=null,this.changedOldMaterialPoint=null,this.removedMaterialPoint=null,this.addedMaterials=[],this.changedOldMaterials=[],this.changedNewMaterials=[],this.removedMaterials=[],this._materialGroups=null,this.tree=e,this.addedMaterialMesh=new mn({color:new tt("#00ff00"),emissive:0,roughness:1,metalness:0,opacity:1,side:Ki},["USE_RTE"]),this.addedMaterialMesh.vertexColors=!1,this.addedMaterialMesh.depthWrite=!0,this.addedMaterialMesh.transparent=!0,this.addedMaterialMesh.clipShadows=!0,this.addedMaterialMesh.color.convertSRGBToLinear(),this.changedNewMaterialMesh=new mn({color:new tt("#ffff00"),emissive:0,roughness:1,metalness:0,opacity:1,side:Ki},["USE_RTE"]),this.changedNewMaterialMesh.vertexColors=!1,this.changedNewMaterialMesh.transparent=!0,this.addedMaterialMesh.depthWrite=!0,this.changedNewMaterialMesh.clipShadows=!0,this.changedNewMaterialMesh.color.convertSRGBToLinear(),this.changedOldMaterialMesh=new mn({color:new tt("#ffff00"),emissive:0,roughness:1,metalness:0,opacity:1,side:Ki},["USE_RTE"]),this.changedOldMaterialMesh.vertexColors=!1,this.changedOldMaterialMesh.transparent=!0,this.addedMaterialMesh.depthWrite=!0,this.changedOldMaterialMesh.clipShadows=!0,this.changedOldMaterialMesh.color.convertSRGBToLinear(),this.removedMaterialMesh=new mn({color:new tt("#ff0000"),emissive:0,roughness:1,metalness:0,opacity:1,side:Ki},["USE_RTE"]),this.removedMaterialMesh.vertexColors=!1,this.removedMaterialMesh.transparent=!0,this.addedMaterialMesh.depthWrite=!0,this.removedMaterialMesh.clipShadows=!0,this.removedMaterialMesh.color.convertSRGBToLinear(),this.addedMaterialPoint=new tr({color:65280,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.addedMaterialPoint.transparent=!0,this.addedMaterialPoint.color.convertSRGBToLinear(),this.addedMaterialPoint.toneMapped=!1,this.changedNewMaterialPoint=new tr({color:16776960,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.changedNewMaterialPoint.transparent=!0,this.changedNewMaterialPoint.color.convertSRGBToLinear(),this.changedNewMaterialPoint.toneMapped=!1,this.changedOldMaterialPoint=new tr({color:16776960,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.changedOldMaterialPoint.transparent=!0,this.changedOldMaterialPoint.color.convertSRGBToLinear(),this.changedOldMaterialPoint.toneMapped=!1,this.removedMaterialPoint=new tr({color:16711680,vertexColors:!1,size:2,sizeAttenuation:!1},["USE_RTE"]),this.removedMaterialPoint.transparent=!0,this.removedMaterialPoint.color.convertSRGBToLinear(),this.removedMaterialPoint.toneMapped=!1}intersection(e,n){const[r,i]=[Object.keys(e),Object.keys(n)],[s,a]=r.length>i.length?[i,e]:[r,n];return s.filter(o=>o in a)}buildIdMaps(e,n,r){var i;for(let s=0;sl.model.raw.applicationId))===null||i===void 0?void 0:i.model.raw.applicationId;n[a.model.raw.id]={node:a,applicationId:o},o&&(r[o]=1)}}diff(e,n){return this.diffIterative(e,n)}diffBoolean(e,n){const r=performance.now(),i={unchanged:[],added:[],removed:[],modified:[]},s=this.tree.getRenderTree(e),a=this.tree.getRenderTree(n);let o=s.getRenderableNodes(...S1),l=a.getRenderableNodes(...S1);o=o.map(M=>s.getAtomicParent(M)),l=l.map(M=>a.getAtomicParent(M)),o=[...Array.from(new Set(o))],l=[...Array.from(new Set(l))];const u={},c={};this.buildIdMaps(o,u,c);const d={},f={};this.buildIdMaps(l,d,f);const h=this.intersection(u,d),p=Uh.omit(d,h),m=Uh.omit(u,h),v=Uh.omit(p,function(M,E,S){return M.applicationId&&c[M.applicationId]!==void 0}),g=Uh.omit(m,function(M,E,S){return M.applicationId&&f[M.applicationId]!==void 0}),b=Uh.omit(m,Object.keys(g)),y=Uh.omit(p,Object.keys(v)),x=Object.values(b).map(M=>M.node),T=Object.values(y).map(M=>M.node);return i.unchanged.push(...h.map(M=>u[M].node)),i.unchanged.push(...h.map(M=>d[M].node)),i.removed.push(...Object.values(g).map(M=>M.node)),i.added.push(...Object.values(v).map(M=>M.node)),x.forEach((M,E)=>{i.modified.push([x[E],T[E]])}),console.warn("Boolean Time -> ",performance.now()-r),Promise.resolve(i)}diffIterative(e,n){var r,i;const s=performance.now(),a=[],o=[],l={unchanged:[],added:[],removed:[],modified:[]},u=this.tree.getRenderTree(e),c=this.tree.getRenderTree(n);let d=u.getRenderableNodes(...S1),f=c.getRenderableNodes(...S1);d=d.map(g=>u.getAtomicParent(g)),f=f.map(g=>c.getAtomicParent(g)),d=[...Array.from(new Set(d))],f=[...Array.from(new Set(f))];const h={},p={};this.buildIdMaps(d,h,p);const m={},v={};this.buildIdMaps(f,m,v);for(let g=0;g{l.modified.push([o[b],a[b]])}),console.warn("Interative Time -> ",performance.now()-s),Promise.resolve(l)}setDiffTime(e){const n=Math.min(Math.max(1-e,0),1),r=Math.min(Math.max(e,0),1);this.addedMaterials.forEach(i=>{i.opacity=i.clampOpacity!==void 0?Math.min(n,i.clampOpacity):n,i.depthWrite=!(n<.5),i.transparent=i.opacity<1}),this.changedOldMaterials.forEach(i=>{i.opacity=i.clampOpacity!==void 0?Math.min(r,i.clampOpacity):r,i.depthWrite=!(r<.5),i.transparent=i.opacity<1}),this.changedNewMaterials.forEach(i=>{i.opacity=i.clampOpacity!==void 0?Math.min(n,i.clampOpacity):n,i.depthWrite=!(n<.5),i.transparent=i.opacity<1}),this.removedMaterials.forEach(i=>{i.opacity=i.clampOpacity!==void 0?Math.min(r,i.clampOpacity):r,i.depthWrite=!(r<.5),i.transparent=i.opacity<1})}buildMaterialGroups(e,n,r){const i=performance.now();switch(e){case jP.COLORED:this._materialGroups=this.getColoredMaterialGroups(this.getVisualDiffResult(n));break;case jP.PLAIN:this._materialGroups=this.getPlainMaterialGroups(this.getVisualDiffResult(n),r);break;default:Zt.error(`Unsupported visual diff mode ${e}`)}return console.warn("Material groups -> ",performance.now()-i),this._materialGroups}resetMaterialGroups(){this._materialGroups=null,this.addedMaterials=[],this.changedOldMaterials=[],this.changedNewMaterials=[],this.removedMaterials=[]}getVisualDiffResult(e){const n=this.tree.getRenderTree(),r=e.added.flatMap(l=>n.getRenderViewsForNode(l,l)),i=e.removed.flatMap(l=>n.getRenderViewsForNode(l,l)),s=e.unchanged.flatMap(l=>n.getRenderViewsForNode(l,l)),a=e.modified.flatMap(l=>n.getRenderViewsForNode(l[0],l[0])).filter(l=>!s.includes(l)&&!i.includes(l)),o=e.modified.flatMap(l=>n.getRenderViewsForNode(l[1],l[1])).filter(l=>!s.includes(l)&&!r.includes(l));return{unchanged:s,added:r,removed:i,modifiedOld:a,modifiedNew:o}}getColoredMaterialGroups(e){const n=[{objectIds:[],rvs:e.added.filter(r=>r.geometryType===st.MESH||r.geometryType===st.LINE),material:this.addedMaterialMesh},{objectIds:[],rvs:e.modifiedNew.filter(r=>r.geometryType===st.MESH||r.geometryType===st.LINE),material:this.changedNewMaterialMesh},{objectIds:[],rvs:e.modifiedOld.filter(r=>r.geometryType===st.MESH||r.geometryType===st.LINE),material:this.changedOldMaterialMesh},{objectIds:[],rvs:e.removed.filter(r=>r.geometryType===st.MESH||r.geometryType===st.LINE),material:this.removedMaterialMesh},{objectIds:[],rvs:e.added.filter(r=>r.geometryType===st.POINT||r.geometryType===st.POINT_CLOUD),material:this.addedMaterialPoint},{objectIds:[],rvs:e.modifiedNew.filter(r=>r.geometryType===st.POINT||r.geometryType===st.POINT_CLOUD),material:this.changedNewMaterialPoint},{objectIds:[],rvs:e.modifiedOld.filter(r=>r.geometryType===st.POINT||r.geometryType===st.POINT_CLOUD),material:this.changedOldMaterialPoint},{objectIds:[],rvs:e.removed.filter(r=>r.geometryType===st.POINT||r.geometryType===st.POINT_CLOUD),material:this.removedMaterialPoint}];return this.addedMaterials.push(this.addedMaterialMesh,this.addedMaterialPoint),this.changedOldMaterials.push(this.changedOldMaterialMesh,this.changedOldMaterialPoint),this.changedNewMaterials.push(this.changedNewMaterialMesh,this.changedNewMaterialPoint),this.removedMaterials.push(this.removedMaterialMesh,this.removedMaterialPoint),n.filter(r=>r.rvs.length>0)}getPlainMaterialGroups(e,n){const r=this.getBatchesSubgroups(e.added,n),i=this.getBatchesSubgroups(e.modifiedOld,n),s=this.getBatchesSubgroups(e.modifiedNew,n),a=this.getBatchesSubgroups(e.removed,n);return this.addedMaterials=r.map(o=>o.material),this.changedOldMaterials=i.map(o=>o.material),this.changedNewMaterials=s.map(o=>o.material),this.removedMaterials=a.map(o=>o.material),[...r,...i,...s,...a]}getBatchesSubgroups(e,n){const r=[...Array.from(new Set(e.map(s=>s.batchId)))],i=[];for(let s=0;so.batchId===r[s]),material:a})}return i}}class obt extends lw{get World(){return this.world}get Utils(){return this.utils||(this.utils={screenToNDC:this.speckleRenderer.screenToNDC.bind(this.speckleRenderer),NDCToScreen:this.speckleRenderer.NDCToScreen.bind(this.speckleRenderer)}),this.utils}constructor(e,n=yge){super(),this.tree=new Xb,this.world=new vW,this.loaders={},this.dynamicallyLoadedDiffResources=[],Zt.useDefaults(),Zt.setLevel(n.verbose?Zt.TRACE:Zt.ERROR),Sn.keepGeometryData=n.keepGeometryData,this.container=e||document.getElementById("renderer"),n.showStats&&(this.stats=BKe(),this.container.prepend(this.stats.dom),this.stats.dom.style.position="relative"),this.loaders={},this.startupParams=n,this.clock=new r9,this.inProgressOperations=0,this.cameraHandler=new T1t(this),this.speckleRenderer=new $1t(this),this.speckleRenderer.create(this.container),window.addEventListener("resize",this.resize.bind(this),!1),this.filteringManager=new M1t(this.speckleRenderer,this.tree),this.filteringManager.on($t.FilteringStateSet,r=>{this.emit($t.FilteringStateSet,r)}),this.propertyManager=new sbt,this.differ=new abt(this.tree),window._V=this,this.sectionBox=new tbt(this),this.sectionBox.disable(),this.on($t.SectionBoxUpdated,()=>{this.speckleRenderer.updateClippingPlanes(this.sectionBox.planes)}),this.sectionBox.on(kge,this.speckleRenderer.onSectionBoxDragStart.bind(this.speckleRenderer)),this.sectionBox.on(Oge,this.speckleRenderer.onSectionBoxDragEnd.bind(this.speckleRenderer)),this.frame(),this.resize(),this.on($t.LoadCancelled,r=>{Zt.warn(`Cancelled load for ${r}`)})}getObjects(e){return this.speckleRenderer.getObjects(e)}setSectionBox(e,n){e||(e=this.speckleRenderer.sceneBox),this.sectionBox.setBox(e,n),this.speckleRenderer.updateSectionBoxCapper()}getSectionBoxFromObjects(e){return this.speckleRenderer.boxFromObjects(e)}setSectionBoxFromObjects(e,n){this.setSectionBox(this.getSectionBoxFromObjects(e),n)}getCurrentSectionBox(){return this.sectionBox.getCurrentBox()}resize(){const e=this.container.offsetWidth,n=this.container.offsetHeight;this.speckleRenderer.resize(e,n)}requestRender(){this.speckleRenderer.needsRender=!0,this.speckleRenderer.resetPipeline()}frame(){this.update(),this.render()}update(){var e;const n=this.clock.getDelta();this.speckleRenderer.update(n),(e=this.stats)===null||e===void 0||e.update(),requestAnimationFrame(this.frame.bind(this))}render(){this.speckleRenderer.render()}async init(){this.startupParams.environmentSrc&&Gl.getEnvironment(this.startupParams.environmentSrc,this.speckleRenderer.renderer).then(e=>{this.speckleRenderer.indirectIBL=e}).catch(e=>{Zt.error(e),Zt.error("Fallback to null environment!")})}on(e,n){super.on(e,n)}getObjectProperties(e=null,n=!0){return this.propertyManager.getProperties(this.tree,e,n)}selectObjects(e){return new Promise(n=>{n(this.filteringManager.selectObjects(e))})}resetSelection(){return new Promise(e=>{e(this.filteringManager.resetSelection())})}hideObjects(e,n=null,r=!1,i=!1){return new Promise(s=>{s(this.filteringManager.hideObjects(e,n,r,i))})}showObjects(e,n=null,r=!1){return new Promise(i=>{i(this.filteringManager.showObjects(e,n,r))})}isolateObjects(e,n=null,r=!1,i=!0){return new Promise(s=>{s(this.filteringManager.isolateObjects(e,n,r,i))})}unIsolateObjects(e,n=null,r=!1){return new Promise(i=>{i(this.filteringManager.unIsolateObjects(e,n,r))})}highlightObjects(e,n=!1){return new Promise(r=>{r(this.filteringManager.highlightObjects(e,n))})}resetHighlight(){return new Promise(e=>{e(this.filteringManager.resetHighlight())})}setColorFilter(e,n=!0){return new Promise(r=>{r(this.filteringManager.setColorFilter(e,n))})}removeColorFilter(){return new Promise(e=>{e(this.filteringManager.removeColorFilter())})}setUserObjectColors(e){return new Promise(n=>{n(this.filteringManager.setUserObjectColors(e))})}resetFilters(){return new Promise(e=>{e(this.filteringManager.reset())})}async applyFilter(e){}getDataTree(){return this.tree.getDataTree()}getWorldTree(){return this.tree}query(e){return Lh.isPointQuery(e)?(Lh.DefaultPointQuerySolver.setContext(this.speckleRenderer),Lh.DefaultPointQuerySolver.solve(e)):Lh.isIntersectionQuery(e)?(Lh.DefaultIntersectionQuerySolver.setContext(this.speckleRenderer),Lh.DefaultIntersectionQuerySolver.solve(e)):void 0}queryAsync(e){return null}toggleSectionBox(){this.sectionBox.toggle(),this.speckleRenderer.updateSectionBoxCapper()}sectionBoxOff(){this.sectionBox.disable(),this.speckleRenderer.updateSectionBoxCapper()}sectionBoxOn(){this.sectionBox.enable(),this.speckleRenderer.updateSectionBoxCapper()}zoom(e,n,r){this.speckleRenderer.zoom(e,n,r)}setProjectionMode(e){this.cameraHandler.activeCam=e}setOrthoCameraOn(){this.cameraHandler.setOrthoCameraOn(),this.speckleRenderer.resetPipeline(!0)}setPerspectiveCameraOn(){this.cameraHandler.setPerspectiveCameraOn(),this.speckleRenderer.resetPipeline(!0)}toggleCameraProjection(){this.cameraHandler.toggleCameras(),this.speckleRenderer.resetPipeline(!0)}setLightConfiguration(e){this.speckleRenderer.setSunLightConfiguration(e)}getViews(){return this.tree.findAll(e=>{var n;return((n=e.model.renderView)===null||n===void 0?void 0:n.speckleType)===Kt.View3D}).map(e=>({name:e.model.raw.applicationId,id:e.model.id,view:e.model.raw}))}setView(e,n=!0){this.speckleRenderer.setView(e,n)}screenshot(){return new Promise(e=>{const n=this.sectionBox.display.visible;n&&this.sectionBox.displayOff();const r=this.speckleRenderer.renderer.domElement.toDataURL("image/png");n&&this.sectionBox.displayOn(),e(r)})}explode(e){const n=this.world.worldSize,r=Math.sqrt(n.x*n.x+n.y*n.y+n.z*n.z);this.speckleRenderer.setExplode(e,r)}async downloadObject(e,n=null,r=!0){const i=new x1t(this,e,n,r);this.loaders[e]=i,await i.load()}async loadObject(e,n=null,r=!0,i=!0){++this.inProgressOperations==1&&this.emit($t.Busy,!0),await this.downloadObject(e,n,r);let s=performance.now();this.tree.getRenderTree(e).buildRenderTree(),Zt.log("SYNC Tree build time -> ",performance.now()-s),s=performance.now(),await this.speckleRenderer.addRenderTree(e),Zt.log("SYNC batch build time -> ",performance.now()-s),i&&this.zoom(),this.speckleRenderer.resetPipeline(!0),this.emit($t.LoadComplete,e),this.loaders[e].dispose(),delete this.loaders[e],--this.inProgressOperations==0&&this.emit($t.Busy,!1)}async loadObjectAsync(e,n=null,r=!0,i=1,s=!0){++this.inProgressOperations==1&&this.emit($t.Busy,!0),await this.downloadObject(e,n,r);let a=performance.now();const o=await this.tree.getRenderTree(e).buildRenderTreeAsync(i);Zt.log("ASYNC Tree build time -> ",performance.now()-a),o&&(a=performance.now(),await this.speckleRenderer.addRenderTreeAsync(e,i,s),Zt.log("ASYNC batch build time -> ",performance.now()-a),this.speckleRenderer.resetPipeline(!0),this.emit($t.LoadComplete,e)),this.loaders[e].dispose(),delete this.loaders[e],--this.inProgressOperations==0&&this.emit($t.Busy,!1)}async cancelLoad(e,n=!1){this.loaders[e].cancelLoad(),this.tree.getRenderTree(e).cancelBuild(e),this.speckleRenderer.cancelRenderTree(e),n?await this.unloadObject(e):--this.inProgressOperations==0&&this.emit($t.Busy,!1)}async unloadObject(e){try{++this.inProgressOperations==1&&this.emit($t.Busy,!0),delete this.loaders[e],this.speckleRenderer.removeRenderTree(e),this.tree.getRenderTree(e).purge(),this.tree.purge(e)}finally{--this.inProgressOperations==0&&(this.emit($t.Busy,!1),Zt.warn(`Removed subtree ${e}`),this.emit($t.UnloadComplete,e))}}async unloadAll(){try{++this.inProgressOperations==1&&this.emit($t.Busy,!0);for(const e of Object.keys(this.loaders))delete this.loaders[e];this.filteringManager.reset(),this.tree.root.children.forEach(e=>{this.speckleRenderer.removeRenderTree(e.model.id),this.tree.getRenderTree().purge()}),this.tree.purge()}finally{--this.inProgressOperations==0&&(this.emit($t.Busy,!1),Zt.warn("Removed all subtrees"),this.emit($t.UnloadAllComplete))}}async diff(e,n,r,i){const s=[];this.dynamicallyLoadedDiffResources=[],this.tree.findId(e)||(s.push(this.loadObjectAsync(e,i,void 0,1)),this.dynamicallyLoadedDiffResources.push(e)),this.tree.findId(n)||(s.push(this.loadObjectAsync(n,i,void 0,1)),this.dynamicallyLoadedDiffResources.push(n)),await Promise.all(s);const a=await this.differ.diff(e,n),o=this.speckleRenderer.pipelineOptions;return o.depthSide=Ki,this.speckleRenderer.pipelineOptions=o,this.differ.resetMaterialGroups(),this.differ.buildMaterialGroups(r,a,this.speckleRenderer.getBatchMaterials()),this.differ.setDiffTime(0),this.filteringManager.setUserMaterials(this.differ.materialGroups),Promise.resolve(a)}async undiff(){const e=this.speckleRenderer.pipelineOptions;e.depthSide=rn,this.speckleRenderer.pipelineOptions=e,this.differ.resetMaterialGroups(),this.filteringManager.removeUserMaterials();const n=[];if(this.dynamicallyLoadedDiffResources.length!==0)for(const r of this.dynamicallyLoadedDiffResources)n.push(this.unloadObject(r));this.dynamicallyLoadedDiffResources=[],await Promise.all(n)}setDiffTime(e,n){this.differ.setDiffTime(n),this.filteringManager.setUserMaterials(this.differ.materialGroups)}setVisualDiffMode(e,n){this.differ.resetMaterialGroups(),this.differ.buildMaterialGroups(n,e,this.speckleRenderer.getBatchMaterials()),this.filteringManager.setUserMaterials(this.differ.materialGroups)}enableMeasurements(e){this.speckleRenderer.measurements.enabled=e}setMeasurementOptions(e){this.speckleRenderer.measurements.options=e}removeMeasurement(){this.speckleRenderer.measurements.removeMeasurement()}dispose(){}}const vo=h0({id:"speckleStore",state:()=>({projectDetails:null,selectedVersion:null,selectedProject:null,allProjects:null,allVersions:null,allModels:null,modelsAndVersions:null,user:null,serverInfo:null,customParameters:null,viewer:null,selectedObjectIds:[],colorGroups:[],token:null,serverUrl:null,hiddenObjects:[],renderMode:!0,showHiddenObjects:!1}),actions:{async login(){mUe()},async logout(){this.$patch(t=>{t.user=null,t.serverInfo=null,t.projectDetails=null,t.selectedVersion=null}),vUe(),o0.push("/login")},async exchangeAccessCodes(t){return gUe(t)},async updateUser(){try{const e=(await bUe()).data;this.$patch(n=>{n.user=e.user,n.serverInfo=e.serverInfo})}catch(t){ef(t,"info")}},async updateProjects(){try{const e=(await SUe()).data,n=[];for(const r of e.streams.items){const i=await xUe(r.id),s={name:r.name,id:r.id,updatedAt:r.updatedAt,latestModelId:i.data.project.models.items[0].id};n.push(s)}this.allProjects=n}catch(t){ef(t,"info")}},async updateProjectVersions(t,e,n){var r,i,s,a,o,l;try{const d=(await yUe(t,e,n)).data,f={name:d.stream.name,id:d.stream.id,updatedAt:d.stream.updatedAt};let h;const p=[],m={};(r=d.stream.commits)!=null&&r.items&&((i=d.stream.commits)==null?void 0:i.items.length)>0&&((a=(s=d.stream.commits)==null?void 0:s.items)==null||a.forEach(v=>{p.push(v);const{branchName:g}=v;m[g]||(m[g]=[]),m[g].push(v)}),h=(l=(o=d.stream.commits)==null?void 0:o.items)==null?void 0:l.map(function(v){return v==null?void 0:v.branchName})),this.$patch(v=>{v.selectedProject=f,v.projectDetails=d,v.allVersions=p,v.allModels=h,v.modelsAndVersions=m})}catch(u){ef(u,"info")}},async getObjects(){try{return this.selectedProject&&this.selectedVersion?await TUe(this.selectedProject.id,this.selectedVersion.referencedObject,this.selectedVersion.sourceApplication):null}catch(t){ef(t,"info")}},setProjectDetails(t){this.projectDetails=t},setAllVersions(t){this.allVersions=t},setAllModels(t){this.allModels=t},setModelsAndVersions(t){this.modelsAndVersions=t},setSelectedVersion(t){this.selectedVersion=t},setViewerInstance(t){this.viewer=t},setCurrentlySelectedObject(t){this.selectedObjectIds.push(...t)},calculateGroupColors(t){Twt(t);const e=[];t.forEach(n=>{const r=/hsl\((\d+),\s*(\d+)%,\s*(\d+)%\)/;let i;if(!n.color)i=uZ(151,100,50);else{const a=n.color.match(r),[,o,l,u]=a.map(c=>parseInt(c));i=uZ(o,l,u)}const s={objectIds:n.objects.map(a=>a.URI),color:i};e.push(s)}),this.setColorGroups(e)},setColorGroups(t){var e;this.colorGroups=t,this.renderMode||(e=this.viewer)==null||e.setUserObjectColors(t)},setToken(t){this.token=t},setServerUrl(t){this.serverUrl=t},addCustomParameter(t){this.parameterNameCheck(t.name)?console.warn("Duplicate name found. Object not added."):this.customParameters?this.customParameters.push(t):this.customParameters=[t]},addHiddenObject(t){this.hiddenObjects.push(t)},setHiddenObjects(t){this.hiddenObjects=t},parameterNameCheck(t){return this.customParameters?this.customParameters.some(e=>e.name===t):!1},removeCustomParameter(t){var e;this.customParameters&&(this.customParameters=(e=this.customParameters)==null?void 0:e.filter(n=>n.name!==t))},isolateObjects(t){var e,n,r,i;if((e=this.viewer)==null||e.resetFilters(),(n=this.viewer)==null||n.isolateObjects(t,null,!0,!0),t.length>0&&!this.renderMode){const s=new Map;this.colorGroups.forEach(o=>{o.objectIds.forEach(l=>{s.set(l,o.color)})});const a=t.map(o=>({objectIds:[o],color:s.get(o)})).filter(o=>o.color!==void 0);(r=this.viewer)==null||r.setUserObjectColors(a)}else this.renderMode||(i=this.viewer)==null||i.setUserObjectColors(this.colorGroups)},hideUnusedObjects(t){var e;this.showHiddenObjects||(e=this.viewer)==null||e.hideObjects(t,null,!1,!1)},async resetUnusedObjects(){var t,e;(t=this.viewer)==null||t.resetFilters(),this.renderMode||(e=this.viewer)==null||e.setUserObjectColors(this.colorGroups)},toggleRenderMode(){var t;this.renderMode=!this.renderMode,this.resetUnusedObjects(),(t=this.viewer)==null||t.resize()},toggleHiddenObjects(){var t,e;this.showHiddenObjects=!this.showHiddenObjects,this.resetUnusedObjects(),this.showHiddenObjects||(t=this.viewer)==null||t.hideObjects(this.hiddenObjects.map(n=>n.id),null,!1,!1),(e=this.viewer)==null||e.resize()}},getters:{getProjectDetails:t=>t.projectDetails,getSelectedVersion:t=>t.selectedVersion,getAllVersions:t=>t.allVersions,getAllModels:t=>t.allModels,getModelsAndVersions:t=>t.modelsAndVersions,isAuthenticated:t=>t.user!==null,getUserInfo:t=>t.user,getProjectsInfo:t=>t.allProjects,getCustomParameters:t=>t.customParameters,getViewerInstance:t=>t.viewer,getCurrentSelectedObjectIDs:t=>t.selectedObjectIds,getColorGroups:t=>t.colorGroups}});/** * @license * Copyright 2017 Google LLC * @@ -7629,7 +7629,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const Nge=function(t){const e=[];let n=0;for(let r=0;r>6|192,e[n++]=i&63|128):(i&64512)===55296&&r+1>18|240,e[n++]=i>>12&63|128,e[n++]=i>>6&63|128,e[n++]=i&63|128):(e[n++]=i>>12|224,e[n++]=i>>6&63|128,e[n++]=i&63|128)}return e},obt=function(t){const e=[];let n=0,r=0;for(;n191&&i<224){const s=t[n++];e[r++]=String.fromCharCode((i&31)<<6|s&63)}else if(i>239&&i<365){const s=t[n++],a=t[n++],o=t[n++],l=((i&7)<<18|(s&63)<<12|(a&63)<<6|o&63)-65536;e[r++]=String.fromCharCode(55296+(l>>10)),e[r++]=String.fromCharCode(56320+(l&1023))}else{const s=t[n++],a=t[n++];e[r++]=String.fromCharCode((i&15)<<12|(s&63)<<6|a&63)}}return e.join("")},Lge={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:typeof atob=="function",encodeByteArray(t,e){if(!Array.isArray(t))throw Error("encodeByteArray takes an array as a parameter");this.init_();const n=e?this.byteToCharMapWebSafe_:this.byteToCharMap_,r=[];for(let i=0;i>2,d=(s&3)<<4|o>>4;let f=(o&15)<<2|u>>6,h=u&63;l||(h=64,a||(f=64)),r.push(n[c],n[d],n[f],n[h])}return r.join("")},encodeString(t,e){return this.HAS_NATIVE_SUPPORT&&!e?btoa(t):this.encodeByteArray(Nge(t),e)},decodeString(t,e){return this.HAS_NATIVE_SUPPORT&&!e?atob(t):obt(this.decodeStringToByteArray(t,e))},decodeStringToByteArray(t,e){this.init_();const n=e?this.charToByteMapWebSafe_:this.charToByteMap_,r=[];for(let i=0;i>4;if(r.push(f),u!==64){const h=o<<4&240|u>>2;if(r.push(h),d!==64){const p=u<<6&192|d;r.push(p)}}}return r},init_(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(let t=0;t=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(t)]=t,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(t)]=t)}}};class lbt extends Error{constructor(){super(...arguments),this.name="DecodeBase64StringError"}}const ubt=function(t){const e=Nge(t);return Lge.encodeByteArray(e,!0)},JP=function(t){return ubt(t).replace(/\./g,"")},Xge=function(t){try{return Lge.decodeString(t,!0)}catch(e){console.error("base64Decode failed: ",e)}return null};/** + */const Uge=function(t){const e=[];let n=0;for(let r=0;r>6|192,e[n++]=i&63|128):(i&64512)===55296&&r+1>18|240,e[n++]=i>>12&63|128,e[n++]=i>>6&63|128,e[n++]=i&63|128):(e[n++]=i>>12|224,e[n++]=i>>6&63|128,e[n++]=i&63|128)}return e},lbt=function(t){const e=[];let n=0,r=0;for(;n191&&i<224){const s=t[n++];e[r++]=String.fromCharCode((i&31)<<6|s&63)}else if(i>239&&i<365){const s=t[n++],a=t[n++],o=t[n++],l=((i&7)<<18|(s&63)<<12|(a&63)<<6|o&63)-65536;e[r++]=String.fromCharCode(55296+(l>>10)),e[r++]=String.fromCharCode(56320+(l&1023))}else{const s=t[n++],a=t[n++];e[r++]=String.fromCharCode((i&15)<<12|(s&63)<<6|a&63)}}return e.join("")},Nge={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:typeof atob=="function",encodeByteArray(t,e){if(!Array.isArray(t))throw Error("encodeByteArray takes an array as a parameter");this.init_();const n=e?this.byteToCharMapWebSafe_:this.byteToCharMap_,r=[];for(let i=0;i>2,d=(s&3)<<4|o>>4;let f=(o&15)<<2|u>>6,h=u&63;l||(h=64,a||(f=64)),r.push(n[c],n[d],n[f],n[h])}return r.join("")},encodeString(t,e){return this.HAS_NATIVE_SUPPORT&&!e?btoa(t):this.encodeByteArray(Uge(t),e)},decodeString(t,e){return this.HAS_NATIVE_SUPPORT&&!e?atob(t):lbt(this.decodeStringToByteArray(t,e))},decodeStringToByteArray(t,e){this.init_();const n=e?this.charToByteMapWebSafe_:this.charToByteMap_,r=[];for(let i=0;i>4;if(r.push(f),u!==64){const h=o<<4&240|u>>2;if(r.push(h),d!==64){const p=u<<6&192|d;r.push(p)}}}return r},init_(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(let t=0;t=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(t)]=t,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(t)]=t)}}};class ubt extends Error{constructor(){super(...arguments),this.name="DecodeBase64StringError"}}const cbt=function(t){const e=Uge(t);return Nge.encodeByteArray(e,!0)},ZP=function(t){return cbt(t).replace(/\./g,"")},Lge=function(t){try{return Nge.decodeString(t,!0)}catch(e){console.error("base64Decode failed: ",e)}return null};/** * @license * Copyright 2022 Google LLC * @@ -7644,7 +7644,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function cbt(){if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global;throw new Error("Unable to locate global object.")}/** + */function dbt(){if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global;throw new Error("Unable to locate global object.")}/** * @license * Copyright 2022 Google LLC * @@ -7659,7 +7659,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const dbt=()=>cbt().__FIREBASE_DEFAULTS__,fbt=()=>{if(typeof process>"u"||typeof process.env>"u")return;const t={}.__FIREBASE_DEFAULTS__;if(t)return JSON.parse(t)},hbt=()=>{if(typeof document>"u")return;let t;try{t=document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/)}catch{return}const e=t&&Xge(t[1]);return e&&JSON.parse(e)},N9=()=>{try{return dbt()||fbt()||hbt()}catch(t){console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${t}`);return}},Cge=t=>{var e,n;return(n=(e=N9())===null||e===void 0?void 0:e.emulatorHosts)===null||n===void 0?void 0:n[t]},pbt=t=>{const e=Cge(t);if(!e)return;const n=e.lastIndexOf(":");if(n<=0||n+1===e.length)throw new Error(`Invalid host ${e} with no separate hostname and port!`);const r=parseInt(e.substring(n+1),10);return e[0]==="["?[e.substring(1,n-1),r]:[e.substring(0,n),r]},Kge=()=>{var t;return(t=N9())===null||t===void 0?void 0:t.config},qge=t=>{var e;return(e=N9())===null||e===void 0?void 0:e[`_${t}`]};/** + */const fbt=()=>dbt().__FIREBASE_DEFAULTS__,hbt=()=>{if(typeof process>"u"||typeof process.env>"u")return;const t={}.__FIREBASE_DEFAULTS__;if(t)return JSON.parse(t)},pbt=()=>{if(typeof document>"u")return;let t;try{t=document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/)}catch{return}const e=t&&Lge(t[1]);return e&&JSON.parse(e)},N9=()=>{try{return fbt()||hbt()||pbt()}catch(t){console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${t}`);return}},Xge=t=>{var e,n;return(n=(e=N9())===null||e===void 0?void 0:e.emulatorHosts)===null||n===void 0?void 0:n[t]},mbt=t=>{const e=Xge(t);if(!e)return;const n=e.lastIndexOf(":");if(n<=0||n+1===e.length)throw new Error(`Invalid host ${e} with no separate hostname and port!`);const r=parseInt(e.substring(n+1),10);return e[0]==="["?[e.substring(1,n-1),r]:[e.substring(0,n),r]},Cge=()=>{var t;return(t=N9())===null||t===void 0?void 0:t.config},Kge=t=>{var e;return(e=N9())===null||e===void 0?void 0:e[`_${t}`]};/** * @license * Copyright 2017 Google LLC * @@ -7674,7 +7674,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class mbt{constructor(){this.reject=()=>{},this.resolve=()=>{},this.promise=new Promise((e,n)=>{this.resolve=e,this.reject=n})}wrapCallback(e){return(n,r)=>{n?this.reject(n):this.resolve(r),typeof e=="function"&&(this.promise.catch(()=>{}),e.length===1?e(n):e(n,r))}}}/** + */class vbt{constructor(){this.reject=()=>{},this.resolve=()=>{},this.promise=new Promise((e,n)=>{this.resolve=e,this.reject=n})}wrapCallback(e){return(n,r)=>{n?this.reject(n):this.resolve(r),typeof e=="function"&&(this.promise.catch(()=>{}),e.length===1?e(n):e(n,r))}}}/** * @license * Copyright 2021 Google LLC * @@ -7689,7 +7689,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function vbt(t,e){if(t.uid)throw new Error('The "uid" field is no longer supported by mockUserToken. Please use "sub" instead for Firebase Auth User ID.');const n={alg:"none",type:"JWT"},r=e||"demo-project",i=t.iat||0,s=t.sub||t.user_id;if(!s)throw new Error("mockUserToken must contain 'sub' or 'user_id' field!");const a=Object.assign({iss:`https://securetoken.google.com/${r}`,aud:r,iat:i,exp:i+3600,auth_time:i,sub:s,user_id:s,firebase:{sign_in_provider:"custom",identities:{}}},t),o="";return[JP(JSON.stringify(n)),JP(JSON.stringify(a)),o].join(".")}/** + */function gbt(t,e){if(t.uid)throw new Error('The "uid" field is no longer supported by mockUserToken. Please use "sub" instead for Firebase Auth User ID.');const n={alg:"none",type:"JWT"},r=e||"demo-project",i=t.iat||0,s=t.sub||t.user_id;if(!s)throw new Error("mockUserToken must contain 'sub' or 'user_id' field!");const a=Object.assign({iss:`https://securetoken.google.com/${r}`,aud:r,iat:i,exp:i+3600,auth_time:i,sub:s,user_id:s,firebase:{sign_in_provider:"custom",identities:{}}},t),o="";return[ZP(JSON.stringify(n)),ZP(JSON.stringify(a)),o].join(".")}/** * @license * Copyright 2017 Google LLC * @@ -7704,7 +7704,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function La(){return typeof navigator<"u"&&typeof navigator.userAgent=="string"?navigator.userAgent:""}function gbt(){return typeof window<"u"&&!!(window.cordova||window.phonegap||window.PhoneGap)&&/ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(La())}function bbt(){var t;const e=(t=N9())===null||t===void 0?void 0:t.forceEnvironment;if(e==="node")return!0;if(e==="browser")return!1;try{return Object.prototype.toString.call(global.process)==="[object process]"}catch{return!1}}function ybt(){return typeof navigator<"u"&&navigator.userAgent==="Cloudflare-Workers"}function Sbt(){const t=typeof chrome=="object"?chrome.runtime:typeof browser=="object"?browser.runtime:void 0;return typeof t=="object"&&t.id!==void 0}function xbt(){return typeof navigator=="object"&&navigator.product==="ReactNative"}function Tbt(){const t=La();return t.indexOf("MSIE ")>=0||t.indexOf("Trident/")>=0}function wbt(){return!bbt()&&!!navigator.userAgent&&navigator.userAgent.includes("Safari")&&!navigator.userAgent.includes("Chrome")}function Ebt(){try{return typeof indexedDB=="object"}catch{return!1}}function Mbt(){return new Promise((t,e)=>{try{let n=!0;const r="validate-browser-context-for-indexeddb-analytics-module",i=self.indexedDB.open(r);i.onsuccess=()=>{i.result.close(),n||self.indexedDB.deleteDatabase(r),t(!0)},i.onupgradeneeded=()=>{n=!1},i.onerror=()=>{var s;e(((s=i.error)===null||s===void 0?void 0:s.message)||"")}}catch(n){e(n)}})}/** + */function La(){return typeof navigator<"u"&&typeof navigator.userAgent=="string"?navigator.userAgent:""}function bbt(){return typeof window<"u"&&!!(window.cordova||window.phonegap||window.PhoneGap)&&/ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(La())}function ybt(){var t;const e=(t=N9())===null||t===void 0?void 0:t.forceEnvironment;if(e==="node")return!0;if(e==="browser")return!1;try{return Object.prototype.toString.call(global.process)==="[object process]"}catch{return!1}}function Sbt(){return typeof navigator<"u"&&navigator.userAgent==="Cloudflare-Workers"}function xbt(){const t=typeof chrome=="object"?chrome.runtime:typeof browser=="object"?browser.runtime:void 0;return typeof t=="object"&&t.id!==void 0}function Tbt(){return typeof navigator=="object"&&navigator.product==="ReactNative"}function wbt(){const t=La();return t.indexOf("MSIE ")>=0||t.indexOf("Trident/")>=0}function Ebt(){return!ybt()&&!!navigator.userAgent&&navigator.userAgent.includes("Safari")&&!navigator.userAgent.includes("Chrome")}function Mbt(){try{return typeof indexedDB=="object"}catch{return!1}}function Pbt(){return new Promise((t,e)=>{try{let n=!0;const r="validate-browser-context-for-indexeddb-analytics-module",i=self.indexedDB.open(r);i.onsuccess=()=>{i.result.close(),n||self.indexedDB.deleteDatabase(r),t(!0)},i.onupgradeneeded=()=>{n=!1},i.onerror=()=>{var s;e(((s=i.error)===null||s===void 0?void 0:s.message)||"")}}catch(n){e(n)}})}/** * @license * Copyright 2017 Google LLC * @@ -7719,7 +7719,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const Pbt="FirebaseError";class Zf extends Error{constructor(e,n,r){super(n),this.code=e,this.customData=r,this.name=Pbt,Object.setPrototypeOf(this,Zf.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,uw.prototype.create)}}class uw{constructor(e,n,r){this.service=e,this.serviceName=n,this.errors=r}create(e,...n){const r=n[0]||{},i=`${this.service}/${e}`,s=this.errors[e],a=s?Rbt(s,r):"Error",o=`${this.serviceName}: ${a} (${i}).`;return new Zf(i,o,r)}}function Rbt(t,e){return t.replace(Vbt,(n,r)=>{const i=e[r];return i!=null?String(i):`<${r}?>`})}const Vbt=/\{\$([^}]+)}/g;function zbt(t){for(const e in t)if(Object.prototype.hasOwnProperty.call(t,e))return!1;return!0}function YP(t,e){if(t===e)return!0;const n=Object.keys(t),r=Object.keys(e);for(const i of n){if(!r.includes(i))return!1;const s=t[i],a=e[i];if(Q$(s)&&Q$(a)){if(!YP(s,a))return!1}else if(s!==a)return!1}for(const i of r)if(!n.includes(i))return!1;return!0}function Q$(t){return t!==null&&typeof t=="object"}/** + */const Rbt="FirebaseError";class Zf extends Error{constructor(e,n,r){super(n),this.code=e,this.customData=r,this.name=Rbt,Object.setPrototypeOf(this,Zf.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,uw.prototype.create)}}class uw{constructor(e,n,r){this.service=e,this.serviceName=n,this.errors=r}create(e,...n){const r=n[0]||{},i=`${this.service}/${e}`,s=this.errors[e],a=s?Vbt(s,r):"Error",o=`${this.serviceName}: ${a} (${i}).`;return new Zf(i,o,r)}}function Vbt(t,e){return t.replace(zbt,(n,r)=>{const i=e[r];return i!=null?String(i):`<${r}?>`})}const zbt=/\{\$([^}]+)}/g;function kbt(t){for(const e in t)if(Object.prototype.hasOwnProperty.call(t,e))return!1;return!0}function JP(t,e){if(t===e)return!0;const n=Object.keys(t),r=Object.keys(e);for(const i of n){if(!r.includes(i))return!1;const s=t[i],a=e[i];if(B$(s)&&B$(a)){if(!JP(s,a))return!1}else if(s!==a)return!1}for(const i of r)if(!n.includes(i))return!1;return!0}function B$(t){return t!==null&&typeof t=="object"}/** * @license * Copyright 2017 Google LLC * @@ -7734,7 +7734,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function cw(t){const e=[];for(const[n,r]of Object.entries(t))Array.isArray(r)?r.forEach(i=>{e.push(encodeURIComponent(n)+"="+encodeURIComponent(i))}):e.push(encodeURIComponent(n)+"="+encodeURIComponent(r));return e.length?"&"+e.join("&"):""}function E3(t){const e={};return t.replace(/^\?/,"").split("&").forEach(r=>{if(r){const[i,s]=r.split("=");e[decodeURIComponent(i)]=decodeURIComponent(s)}}),e}function M3(t){const e=t.indexOf("?");if(!e)return"";const n=t.indexOf("#",e);return t.substring(e,n>0?n:void 0)}function kbt(t,e){const n=new Obt(t,e);return n.subscribe.bind(n)}class Obt{constructor(e,n){this.observers=[],this.unsubscribes=[],this.observerCount=0,this.task=Promise.resolve(),this.finalized=!1,this.onNoObservers=n,this.task.then(()=>{e(this)}).catch(r=>{this.error(r)})}next(e){this.forEachObserver(n=>{n.next(e)})}error(e){this.forEachObserver(n=>{n.error(e)}),this.close(e)}complete(){this.forEachObserver(e=>{e.complete()}),this.close()}subscribe(e,n,r){let i;if(e===void 0&&n===void 0&&r===void 0)throw new Error("Missing Observer.");Ibt(e,["next","error","complete"])?i=e:i={next:e,error:n,complete:r},i.next===void 0&&(i.next=fU),i.error===void 0&&(i.error=fU),i.complete===void 0&&(i.complete=fU);const s=this.unsubscribeOne.bind(this,this.observers.length);return this.finalized&&this.task.then(()=>{try{this.finalError?i.error(this.finalError):i.complete()}catch{}}),this.observers.push(i),s}unsubscribeOne(e){this.observers===void 0||this.observers[e]===void 0||(delete this.observers[e],this.observerCount-=1,this.observerCount===0&&this.onNoObservers!==void 0&&this.onNoObservers(this))}forEachObserver(e){if(!this.finalized)for(let n=0;n{if(this.observers!==void 0&&this.observers[e]!==void 0)try{n(this.observers[e])}catch(r){typeof console<"u"&&console.error&&console.error(r)}})}close(e){this.finalized||(this.finalized=!0,e!==void 0&&(this.finalError=e),this.task.then(()=>{this.observers=void 0,this.onNoObservers=void 0}))}}function Ibt(t,e){if(typeof t!="object"||t===null)return!1;for(const n of e)if(n in t&&typeof t[n]=="function")return!0;return!1}function fU(){}/** + */function cw(t){const e=[];for(const[n,r]of Object.entries(t))Array.isArray(r)?r.forEach(i=>{e.push(encodeURIComponent(n)+"="+encodeURIComponent(i))}):e.push(encodeURIComponent(n)+"="+encodeURIComponent(r));return e.length?"&"+e.join("&"):""}function w3(t){const e={};return t.replace(/^\?/,"").split("&").forEach(r=>{if(r){const[i,s]=r.split("=");e[decodeURIComponent(i)]=decodeURIComponent(s)}}),e}function E3(t){const e=t.indexOf("?");if(!e)return"";const n=t.indexOf("#",e);return t.substring(e,n>0?n:void 0)}function Obt(t,e){const n=new Ibt(t,e);return n.subscribe.bind(n)}class Ibt{constructor(e,n){this.observers=[],this.unsubscribes=[],this.observerCount=0,this.task=Promise.resolve(),this.finalized=!1,this.onNoObservers=n,this.task.then(()=>{e(this)}).catch(r=>{this.error(r)})}next(e){this.forEachObserver(n=>{n.next(e)})}error(e){this.forEachObserver(n=>{n.error(e)}),this.close(e)}complete(){this.forEachObserver(e=>{e.complete()}),this.close()}subscribe(e,n,r){let i;if(e===void 0&&n===void 0&&r===void 0)throw new Error("Missing Observer.");Ubt(e,["next","error","complete"])?i=e:i={next:e,error:n,complete:r},i.next===void 0&&(i.next=fU),i.error===void 0&&(i.error=fU),i.complete===void 0&&(i.complete=fU);const s=this.unsubscribeOne.bind(this,this.observers.length);return this.finalized&&this.task.then(()=>{try{this.finalError?i.error(this.finalError):i.complete()}catch{}}),this.observers.push(i),s}unsubscribeOne(e){this.observers===void 0||this.observers[e]===void 0||(delete this.observers[e],this.observerCount-=1,this.observerCount===0&&this.onNoObservers!==void 0&&this.onNoObservers(this))}forEachObserver(e){if(!this.finalized)for(let n=0;n{if(this.observers!==void 0&&this.observers[e]!==void 0)try{n(this.observers[e])}catch(r){typeof console<"u"&&console.error&&console.error(r)}})}close(e){this.finalized||(this.finalized=!0,e!==void 0&&(this.finalError=e),this.task.then(()=>{this.observers=void 0,this.onNoObservers=void 0}))}}function Ubt(t,e){if(typeof t!="object"||t===null)return!1;for(const n of e)if(n in t&&typeof t[n]=="function")return!0;return!1}function fU(){}/** * @license * Copyright 2021 Google LLC * @@ -7779,7 +7779,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Ubt{constructor(e,n){this.name=e,this.container=n,this.component=null,this.instances=new Map,this.instancesDeferred=new Map,this.instancesOptions=new Map,this.onInitCallbacks=new Map}get(e){const n=this.normalizeInstanceIdentifier(e);if(!this.instancesDeferred.has(n)){const r=new mbt;if(this.instancesDeferred.set(n,r),this.isInitialized(n)||this.shouldAutoInitialize())try{const i=this.getOrInitializeService({instanceIdentifier:n});i&&r.resolve(i)}catch{}}return this.instancesDeferred.get(n).promise}getImmediate(e){var n;const r=this.normalizeInstanceIdentifier(e==null?void 0:e.identifier),i=(n=e==null?void 0:e.optional)!==null&&n!==void 0?n:!1;if(this.isInitialized(r)||this.shouldAutoInitialize())try{return this.getOrInitializeService({instanceIdentifier:r})}catch(s){if(i)return null;throw s}else{if(i)return null;throw Error(`Service ${this.name} is not available`)}}getComponent(){return this.component}setComponent(e){if(e.name!==this.name)throw Error(`Mismatching Component ${e.name} for Provider ${this.name}.`);if(this.component)throw Error(`Component for ${this.name} has already been provided`);if(this.component=e,!!this.shouldAutoInitialize()){if(Lbt(e))try{this.getOrInitializeService({instanceIdentifier:tv})}catch{}for(const[n,r]of this.instancesDeferred.entries()){const i=this.normalizeInstanceIdentifier(n);try{const s=this.getOrInitializeService({instanceIdentifier:i});r.resolve(s)}catch{}}}}clearInstance(e=tv){this.instancesDeferred.delete(e),this.instancesOptions.delete(e),this.instances.delete(e)}async delete(){const e=Array.from(this.instances.values());await Promise.all([...e.filter(n=>"INTERNAL"in n).map(n=>n.INTERNAL.delete()),...e.filter(n=>"_delete"in n).map(n=>n._delete())])}isComponentSet(){return this.component!=null}isInitialized(e=tv){return this.instances.has(e)}getOptions(e=tv){return this.instancesOptions.get(e)||{}}initialize(e={}){const{options:n={}}=e,r=this.normalizeInstanceIdentifier(e.instanceIdentifier);if(this.isInitialized(r))throw Error(`${this.name}(${r}) has already been initialized`);if(!this.isComponentSet())throw Error(`Component ${this.name} has not been registered yet`);const i=this.getOrInitializeService({instanceIdentifier:r,options:n});for(const[s,a]of this.instancesDeferred.entries()){const o=this.normalizeInstanceIdentifier(s);r===o&&a.resolve(i)}return i}onInit(e,n){var r;const i=this.normalizeInstanceIdentifier(n),s=(r=this.onInitCallbacks.get(i))!==null&&r!==void 0?r:new Set;s.add(e),this.onInitCallbacks.set(i,s);const a=this.instances.get(i);return a&&e(a,i),()=>{s.delete(e)}}invokeOnInitCallbacks(e,n){const r=this.onInitCallbacks.get(n);if(r)for(const i of r)try{i(e,n)}catch{}}getOrInitializeService({instanceIdentifier:e,options:n={}}){let r=this.instances.get(e);if(!r&&this.component&&(r=this.component.instanceFactory(this.container,{instanceIdentifier:Nbt(e),options:n}),this.instances.set(e,r),this.instancesOptions.set(e,n),this.invokeOnInitCallbacks(r,e),this.component.onInstanceCreated))try{this.component.onInstanceCreated(this.container,e,r)}catch{}return r||null}normalizeInstanceIdentifier(e=tv){return this.component?this.component.multipleInstances?e:tv:e}shouldAutoInitialize(){return!!this.component&&this.component.instantiationMode!=="EXPLICIT"}}function Nbt(t){return t===tv?void 0:t}function Lbt(t){return t.instantiationMode==="EAGER"}/** + */class Nbt{constructor(e,n){this.name=e,this.container=n,this.component=null,this.instances=new Map,this.instancesDeferred=new Map,this.instancesOptions=new Map,this.onInitCallbacks=new Map}get(e){const n=this.normalizeInstanceIdentifier(e);if(!this.instancesDeferred.has(n)){const r=new vbt;if(this.instancesDeferred.set(n,r),this.isInitialized(n)||this.shouldAutoInitialize())try{const i=this.getOrInitializeService({instanceIdentifier:n});i&&r.resolve(i)}catch{}}return this.instancesDeferred.get(n).promise}getImmediate(e){var n;const r=this.normalizeInstanceIdentifier(e==null?void 0:e.identifier),i=(n=e==null?void 0:e.optional)!==null&&n!==void 0?n:!1;if(this.isInitialized(r)||this.shouldAutoInitialize())try{return this.getOrInitializeService({instanceIdentifier:r})}catch(s){if(i)return null;throw s}else{if(i)return null;throw Error(`Service ${this.name} is not available`)}}getComponent(){return this.component}setComponent(e){if(e.name!==this.name)throw Error(`Mismatching Component ${e.name} for Provider ${this.name}.`);if(this.component)throw Error(`Component for ${this.name} has already been provided`);if(this.component=e,!!this.shouldAutoInitialize()){if(Xbt(e))try{this.getOrInitializeService({instanceIdentifier:tv})}catch{}for(const[n,r]of this.instancesDeferred.entries()){const i=this.normalizeInstanceIdentifier(n);try{const s=this.getOrInitializeService({instanceIdentifier:i});r.resolve(s)}catch{}}}}clearInstance(e=tv){this.instancesDeferred.delete(e),this.instancesOptions.delete(e),this.instances.delete(e)}async delete(){const e=Array.from(this.instances.values());await Promise.all([...e.filter(n=>"INTERNAL"in n).map(n=>n.INTERNAL.delete()),...e.filter(n=>"_delete"in n).map(n=>n._delete())])}isComponentSet(){return this.component!=null}isInitialized(e=tv){return this.instances.has(e)}getOptions(e=tv){return this.instancesOptions.get(e)||{}}initialize(e={}){const{options:n={}}=e,r=this.normalizeInstanceIdentifier(e.instanceIdentifier);if(this.isInitialized(r))throw Error(`${this.name}(${r}) has already been initialized`);if(!this.isComponentSet())throw Error(`Component ${this.name} has not been registered yet`);const i=this.getOrInitializeService({instanceIdentifier:r,options:n});for(const[s,a]of this.instancesDeferred.entries()){const o=this.normalizeInstanceIdentifier(s);r===o&&a.resolve(i)}return i}onInit(e,n){var r;const i=this.normalizeInstanceIdentifier(n),s=(r=this.onInitCallbacks.get(i))!==null&&r!==void 0?r:new Set;s.add(e),this.onInitCallbacks.set(i,s);const a=this.instances.get(i);return a&&e(a,i),()=>{s.delete(e)}}invokeOnInitCallbacks(e,n){const r=this.onInitCallbacks.get(n);if(r)for(const i of r)try{i(e,n)}catch{}}getOrInitializeService({instanceIdentifier:e,options:n={}}){let r=this.instances.get(e);if(!r&&this.component&&(r=this.component.instanceFactory(this.container,{instanceIdentifier:Lbt(e),options:n}),this.instances.set(e,r),this.instancesOptions.set(e,n),this.invokeOnInitCallbacks(r,e),this.component.onInstanceCreated))try{this.component.onInstanceCreated(this.container,e,r)}catch{}return r||null}normalizeInstanceIdentifier(e=tv){return this.component?this.component.multipleInstances?e:tv:e}shouldAutoInitialize(){return!!this.component&&this.component.instantiationMode!=="EXPLICIT"}}function Lbt(t){return t===tv?void 0:t}function Xbt(t){return t.instantiationMode==="EAGER"}/** * @license * Copyright 2019 Google LLC * @@ -7794,7 +7794,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Xbt{constructor(e){this.name=e,this.providers=new Map}addComponent(e){const n=this.getProvider(e.name);if(n.isComponentSet())throw new Error(`Component ${e.name} has already been registered with ${this.name}`);n.setComponent(e)}addOrOverwriteComponent(e){this.getProvider(e.name).isComponentSet()&&this.providers.delete(e.name),this.addComponent(e)}getProvider(e){if(this.providers.has(e))return this.providers.get(e);const n=new Ubt(e,this);return this.providers.set(e,n),n}getProviders(){return Array.from(this.providers.values())}}/** + */class Cbt{constructor(e){this.name=e,this.providers=new Map}addComponent(e){const n=this.getProvider(e.name);if(n.isComponentSet())throw new Error(`Component ${e.name} has already been registered with ${this.name}`);n.setComponent(e)}addOrOverwriteComponent(e){this.getProvider(e.name).isComponentSet()&&this.providers.delete(e.name),this.addComponent(e)}getProvider(e){if(this.providers.has(e))return this.providers.get(e);const n=new Nbt(e,this);return this.providers.set(e,n),n}getProviders(){return Array.from(this.providers.values())}}/** * @license * Copyright 2017 Google LLC * @@ -7809,7 +7809,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */var Dn;(function(t){t[t.DEBUG=0]="DEBUG",t[t.VERBOSE=1]="VERBOSE",t[t.INFO=2]="INFO",t[t.WARN=3]="WARN",t[t.ERROR=4]="ERROR",t[t.SILENT=5]="SILENT"})(Dn||(Dn={}));const Cbt={debug:Dn.DEBUG,verbose:Dn.VERBOSE,info:Dn.INFO,warn:Dn.WARN,error:Dn.ERROR,silent:Dn.SILENT},Kbt=Dn.INFO,qbt={[Dn.DEBUG]:"log",[Dn.VERBOSE]:"log",[Dn.INFO]:"info",[Dn.WARN]:"warn",[Dn.ERROR]:"error"},Dbt=(t,e,...n)=>{if(ee.some(n=>t instanceof n);let _$,$$;function Abt(){return _$||(_$=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function Gbt(){return $$||($$=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}const Dge=new WeakMap,E4=new WeakMap,Wge=new WeakMap,hU=new WeakMap,gW=new WeakMap;function Fbt(t){const e=new Promise((n,r)=>{const i=()=>{t.removeEventListener("success",s),t.removeEventListener("error",a)},s=()=>{n(yp(t.result)),i()},a=()=>{r(t.error),i()};t.addEventListener("success",s),t.addEventListener("error",a)});return e.then(n=>{n instanceof IDBCursor&&Dge.set(n,t)}).catch(()=>{}),gW.set(e,t),e}function jbt(t){if(E4.has(t))return;const e=new Promise((n,r)=>{const i=()=>{t.removeEventListener("complete",s),t.removeEventListener("error",a),t.removeEventListener("abort",a)},s=()=>{n(),i()},a=()=>{r(t.error||new DOMException("AbortError","AbortError")),i()};t.addEventListener("complete",s),t.addEventListener("error",a),t.addEventListener("abort",a)});E4.set(t,e)}let M4={get(t,e,n){if(t instanceof IDBTransaction){if(e==="done")return E4.get(t);if(e==="objectStoreNames")return t.objectStoreNames||Wge.get(t);if(e==="store")return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return yp(t[e])},set(t,e,n){return t[e]=n,!0},has(t,e){return t instanceof IDBTransaction&&(e==="done"||e==="store")?!0:e in t}};function Zbt(t){M4=t(M4)}function Jbt(t){return t===IDBDatabase.prototype.transaction&&!("objectStoreNames"in IDBTransaction.prototype)?function(e,...n){const r=t.call(pU(this),e,...n);return Wge.set(r,e.sort?e.sort():[e]),yp(r)}:Gbt().includes(t)?function(...e){return t.apply(pU(this),e),yp(Dge.get(this))}:function(...e){return yp(t.apply(pU(this),e))}}function Ybt(t){return typeof t=="function"?Jbt(t):(t instanceof IDBTransaction&&jbt(t),Wbt(t,Abt())?new Proxy(t,M4):t)}function yp(t){if(t instanceof IDBRequest)return Fbt(t);if(hU.has(t))return hU.get(t);const e=Ybt(t);return e!==t&&(hU.set(t,e),gW.set(e,t)),e}const pU=t=>gW.get(t);function Bbt(t,e,{blocked:n,upgrade:r,blocking:i,terminated:s}={}){const a=indexedDB.open(t,e),o=yp(a);return r&&a.addEventListener("upgradeneeded",l=>{r(yp(a.result),l.oldVersion,l.newVersion,yp(a.transaction),l)}),n&&a.addEventListener("blocked",l=>n(l.oldVersion,l.newVersion,l)),o.then(l=>{s&&l.addEventListener("close",()=>s()),i&&l.addEventListener("versionchange",u=>i(u.oldVersion,u.newVersion,u))}).catch(()=>{}),o}const Hbt=["get","getKey","getAll","getAllKeys","count"],Qbt=["put","add","delete","clear"],mU=new Map;function eee(t,e){if(!(t instanceof IDBDatabase&&!(e in t)&&typeof e=="string"))return;if(mU.get(e))return mU.get(e);const n=e.replace(/FromIndex$/,""),r=e!==n,i=Qbt.includes(n);if(!(n in(r?IDBIndex:IDBObjectStore).prototype)||!(i||Hbt.includes(n)))return;const s=async function(a,...o){const l=this.transaction(a,i?"readwrite":"readonly");let u=l.store;return r&&(u=u.index(o.shift())),(await Promise.all([u[n](...o),i&&l.done]))[0]};return mU.set(e,s),s}Zbt(t=>({...t,get:(e,n,r)=>eee(e,n)||t.get(e,n,r),has:(e,n)=>!!eee(e,n)||t.has(e,n)}));/** + */var Dn;(function(t){t[t.DEBUG=0]="DEBUG",t[t.VERBOSE=1]="VERBOSE",t[t.INFO=2]="INFO",t[t.WARN=3]="WARN",t[t.ERROR=4]="ERROR",t[t.SILENT=5]="SILENT"})(Dn||(Dn={}));const Kbt={debug:Dn.DEBUG,verbose:Dn.VERBOSE,info:Dn.INFO,warn:Dn.WARN,error:Dn.ERROR,silent:Dn.SILENT},qbt=Dn.INFO,Dbt={[Dn.DEBUG]:"log",[Dn.VERBOSE]:"log",[Dn.INFO]:"info",[Dn.WARN]:"warn",[Dn.ERROR]:"error"},Wbt=(t,e,...n)=>{if(ee.some(n=>t instanceof n);let H$,Q$;function Gbt(){return H$||(H$=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function Fbt(){return Q$||(Q$=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}const qge=new WeakMap,E4=new WeakMap,Dge=new WeakMap,hU=new WeakMap,bW=new WeakMap;function jbt(t){const e=new Promise((n,r)=>{const i=()=>{t.removeEventListener("success",s),t.removeEventListener("error",a)},s=()=>{n(yp(t.result)),i()},a=()=>{r(t.error),i()};t.addEventListener("success",s),t.addEventListener("error",a)});return e.then(n=>{n instanceof IDBCursor&&qge.set(n,t)}).catch(()=>{}),bW.set(e,t),e}function Zbt(t){if(E4.has(t))return;const e=new Promise((n,r)=>{const i=()=>{t.removeEventListener("complete",s),t.removeEventListener("error",a),t.removeEventListener("abort",a)},s=()=>{n(),i()},a=()=>{r(t.error||new DOMException("AbortError","AbortError")),i()};t.addEventListener("complete",s),t.addEventListener("error",a),t.addEventListener("abort",a)});E4.set(t,e)}let M4={get(t,e,n){if(t instanceof IDBTransaction){if(e==="done")return E4.get(t);if(e==="objectStoreNames")return t.objectStoreNames||Dge.get(t);if(e==="store")return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return yp(t[e])},set(t,e,n){return t[e]=n,!0},has(t,e){return t instanceof IDBTransaction&&(e==="done"||e==="store")?!0:e in t}};function Jbt(t){M4=t(M4)}function Ybt(t){return t===IDBDatabase.prototype.transaction&&!("objectStoreNames"in IDBTransaction.prototype)?function(e,...n){const r=t.call(pU(this),e,...n);return Dge.set(r,e.sort?e.sort():[e]),yp(r)}:Fbt().includes(t)?function(...e){return t.apply(pU(this),e),yp(qge.get(this))}:function(...e){return yp(t.apply(pU(this),e))}}function Bbt(t){return typeof t=="function"?Ybt(t):(t instanceof IDBTransaction&&Zbt(t),Abt(t,Gbt())?new Proxy(t,M4):t)}function yp(t){if(t instanceof IDBRequest)return jbt(t);if(hU.has(t))return hU.get(t);const e=Bbt(t);return e!==t&&(hU.set(t,e),bW.set(e,t)),e}const pU=t=>bW.get(t);function Hbt(t,e,{blocked:n,upgrade:r,blocking:i,terminated:s}={}){const a=indexedDB.open(t,e),o=yp(a);return r&&a.addEventListener("upgradeneeded",l=>{r(yp(a.result),l.oldVersion,l.newVersion,yp(a.transaction),l)}),n&&a.addEventListener("blocked",l=>n(l.oldVersion,l.newVersion,l)),o.then(l=>{s&&l.addEventListener("close",()=>s()),i&&l.addEventListener("versionchange",u=>i(u.oldVersion,u.newVersion,u))}).catch(()=>{}),o}const Qbt=["get","getKey","getAll","getAllKeys","count"],_bt=["put","add","delete","clear"],mU=new Map;function _$(t,e){if(!(t instanceof IDBDatabase&&!(e in t)&&typeof e=="string"))return;if(mU.get(e))return mU.get(e);const n=e.replace(/FromIndex$/,""),r=e!==n,i=_bt.includes(n);if(!(n in(r?IDBIndex:IDBObjectStore).prototype)||!(i||Qbt.includes(n)))return;const s=async function(a,...o){const l=this.transaction(a,i?"readwrite":"readonly");let u=l.store;return r&&(u=u.index(o.shift())),(await Promise.all([u[n](...o),i&&l.done]))[0]};return mU.set(e,s),s}Jbt(t=>({...t,get:(e,n,r)=>_$(e,n)||t.get(e,n,r),has:(e,n)=>!!_$(e,n)||t.has(e,n)}));/** * @license * Copyright 2019 Google LLC * @@ -7824,7 +7824,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class _bt{constructor(e){this.container=e}getPlatformInfoString(){return this.container.getProviders().map(n=>{if($bt(n)){const r=n.getImmediate();return`${r.library}/${r.version}`}else return null}).filter(n=>n).join(" ")}}function $bt(t){const e=t.getComponent();return(e==null?void 0:e.type)==="VERSION"}const P4="@firebase/app",tee="0.10.13";/** + */class $bt{constructor(e){this.container=e}getPlatformInfoString(){return this.container.getProviders().map(n=>{if(eyt(n)){const r=n.getImmediate();return`${r.library}/${r.version}`}else return null}).filter(n=>n).join(" ")}}function eyt(t){const e=t.getComponent();return(e==null?void 0:e.type)==="VERSION"}const P4="@firebase/app",$$="0.10.13";/** * @license * Copyright 2019 Google LLC * @@ -7839,7 +7839,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const zf=new vW("@firebase/app"),eyt="@firebase/app-compat",tyt="@firebase/analytics-compat",nyt="@firebase/analytics",ryt="@firebase/app-check-compat",iyt="@firebase/app-check",syt="@firebase/auth",ayt="@firebase/auth-compat",oyt="@firebase/database",lyt="@firebase/data-connect",uyt="@firebase/database-compat",cyt="@firebase/functions",dyt="@firebase/functions-compat",fyt="@firebase/installations",hyt="@firebase/installations-compat",pyt="@firebase/messaging",myt="@firebase/messaging-compat",vyt="@firebase/performance",gyt="@firebase/performance-compat",byt="@firebase/remote-config",yyt="@firebase/remote-config-compat",Syt="@firebase/storage",xyt="@firebase/storage-compat",Tyt="@firebase/firestore",wyt="@firebase/vertexai-preview",Eyt="@firebase/firestore-compat",Myt="firebase",Pyt="10.14.1";/** + */const zf=new gW("@firebase/app"),tyt="@firebase/app-compat",nyt="@firebase/analytics-compat",ryt="@firebase/analytics",iyt="@firebase/app-check-compat",syt="@firebase/app-check",ayt="@firebase/auth",oyt="@firebase/auth-compat",lyt="@firebase/database",uyt="@firebase/data-connect",cyt="@firebase/database-compat",dyt="@firebase/functions",fyt="@firebase/functions-compat",hyt="@firebase/installations",pyt="@firebase/installations-compat",myt="@firebase/messaging",vyt="@firebase/messaging-compat",gyt="@firebase/performance",byt="@firebase/performance-compat",yyt="@firebase/remote-config",Syt="@firebase/remote-config-compat",xyt="@firebase/storage",Tyt="@firebase/storage-compat",wyt="@firebase/firestore",Eyt="@firebase/vertexai-preview",Myt="@firebase/firestore-compat",Pyt="firebase",Ryt="10.14.1";/** * @license * Copyright 2019 Google LLC * @@ -7854,7 +7854,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const R4="[DEFAULT]",Ryt={[P4]:"fire-core",[eyt]:"fire-core-compat",[nyt]:"fire-analytics",[tyt]:"fire-analytics-compat",[iyt]:"fire-app-check",[ryt]:"fire-app-check-compat",[syt]:"fire-auth",[ayt]:"fire-auth-compat",[oyt]:"fire-rtdb",[lyt]:"fire-data-connect",[uyt]:"fire-rtdb-compat",[cyt]:"fire-fn",[dyt]:"fire-fn-compat",[fyt]:"fire-iid",[hyt]:"fire-iid-compat",[pyt]:"fire-fcm",[myt]:"fire-fcm-compat",[vyt]:"fire-perf",[gyt]:"fire-perf-compat",[byt]:"fire-rc",[yyt]:"fire-rc-compat",[Syt]:"fire-gcs",[xyt]:"fire-gcs-compat",[Tyt]:"fire-fst",[Eyt]:"fire-fst-compat",[wyt]:"fire-vertex","fire-js":"fire-js",[Myt]:"fire-js-all"};/** + */const R4="[DEFAULT]",Vyt={[P4]:"fire-core",[tyt]:"fire-core-compat",[ryt]:"fire-analytics",[nyt]:"fire-analytics-compat",[syt]:"fire-app-check",[iyt]:"fire-app-check-compat",[ayt]:"fire-auth",[oyt]:"fire-auth-compat",[lyt]:"fire-rtdb",[uyt]:"fire-data-connect",[cyt]:"fire-rtdb-compat",[dyt]:"fire-fn",[fyt]:"fire-fn-compat",[hyt]:"fire-iid",[pyt]:"fire-iid-compat",[myt]:"fire-fcm",[vyt]:"fire-fcm-compat",[gyt]:"fire-perf",[byt]:"fire-perf-compat",[yyt]:"fire-rc",[Syt]:"fire-rc-compat",[xyt]:"fire-gcs",[Tyt]:"fire-gcs-compat",[wyt]:"fire-fst",[Myt]:"fire-fst-compat",[Eyt]:"fire-vertex","fire-js":"fire-js",[Pyt]:"fire-js-all"};/** * @license * Copyright 2019 Google LLC * @@ -7869,7 +7869,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const BP=new Map,Vyt=new Map,V4=new Map;function nee(t,e){try{t.container.addComponent(e)}catch(n){zf.debug(`Component ${e.name} failed to register with FirebaseApp ${t.name}`,n)}}function Cb(t){const e=t.name;if(V4.has(e))return zf.debug(`There were multiple attempts to register component ${e}.`),!1;V4.set(e,t);for(const n of BP.values())nee(n,t);for(const n of Vyt.values())nee(n,t);return!0}function bW(t,e){const n=t.container.getProvider("heartbeat").getImmediate({optional:!0});return n&&n.triggerHeartbeat(),t.container.getProvider(e)}function qc(t){return t.settings!==void 0}/** + */const YP=new Map,zyt=new Map,V4=new Map;function eee(t,e){try{t.container.addComponent(e)}catch(n){zf.debug(`Component ${e.name} failed to register with FirebaseApp ${t.name}`,n)}}function Cb(t){const e=t.name;if(V4.has(e))return zf.debug(`There were multiple attempts to register component ${e}.`),!1;V4.set(e,t);for(const n of YP.values())eee(n,t);for(const n of zyt.values())eee(n,t);return!0}function yW(t,e){const n=t.container.getProvider("heartbeat").getImmediate({optional:!0});return n&&n.triggerHeartbeat(),t.container.getProvider(e)}function qc(t){return t.settings!==void 0}/** * @license * Copyright 2019 Google LLC * @@ -7884,7 +7884,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const zyt={"no-app":"No Firebase App '{$appName}' has been created - call initializeApp() first","bad-app-name":"Illegal App name: '{$appName}'","duplicate-app":"Firebase App named '{$appName}' already exists with different options or config","app-deleted":"Firebase App named '{$appName}' already deleted","server-app-deleted":"Firebase Server App has been deleted","no-options":"Need to provide options, when not being deployed to hosting via source.","invalid-app-argument":"firebase.{$appName}() takes either no argument or a Firebase App instance.","invalid-log-argument":"First argument to `onLog` must be null or a function.","idb-open":"Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.","idb-get":"Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.","idb-set":"Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.","idb-delete":"Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.","finalization-registry-not-supported":"FirebaseServerApp deleteOnDeref field defined but the JS runtime does not support FinalizationRegistry.","invalid-server-app-environment":"FirebaseServerApp is not for use in browser environments."},Sp=new uw("app","Firebase",zyt);/** + */const kyt={"no-app":"No Firebase App '{$appName}' has been created - call initializeApp() first","bad-app-name":"Illegal App name: '{$appName}'","duplicate-app":"Firebase App named '{$appName}' already exists with different options or config","app-deleted":"Firebase App named '{$appName}' already deleted","server-app-deleted":"Firebase Server App has been deleted","no-options":"Need to provide options, when not being deployed to hosting via source.","invalid-app-argument":"firebase.{$appName}() takes either no argument or a Firebase App instance.","invalid-log-argument":"First argument to `onLog` must be null or a function.","idb-open":"Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.","idb-get":"Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.","idb-set":"Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.","idb-delete":"Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.","finalization-registry-not-supported":"FirebaseServerApp deleteOnDeref field defined but the JS runtime does not support FinalizationRegistry.","invalid-server-app-environment":"FirebaseServerApp is not for use in browser environments."},Sp=new uw("app","Firebase",kyt);/** * @license * Copyright 2019 Google LLC * @@ -7899,7 +7899,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class kyt{constructor(e,n,r){this._isDeleted=!1,this._options=Object.assign({},e),this._config=Object.assign({},n),this._name=n.name,this._automaticDataCollectionEnabled=n.automaticDataCollectionEnabled,this._container=r,this.container.addComponent(new Hv("app",()=>this,"PUBLIC"))}get automaticDataCollectionEnabled(){return this.checkDestroyed(),this._automaticDataCollectionEnabled}set automaticDataCollectionEnabled(e){this.checkDestroyed(),this._automaticDataCollectionEnabled=e}get name(){return this.checkDestroyed(),this._name}get options(){return this.checkDestroyed(),this._options}get config(){return this.checkDestroyed(),this._config}get container(){return this._container}get isDeleted(){return this._isDeleted}set isDeleted(e){this._isDeleted=e}checkDestroyed(){if(this.isDeleted)throw Sp.create("app-deleted",{appName:this._name})}}/** + */class Oyt{constructor(e,n,r){this._isDeleted=!1,this._options=Object.assign({},e),this._config=Object.assign({},n),this._name=n.name,this._automaticDataCollectionEnabled=n.automaticDataCollectionEnabled,this._container=r,this.container.addComponent(new Hv("app",()=>this,"PUBLIC"))}get automaticDataCollectionEnabled(){return this.checkDestroyed(),this._automaticDataCollectionEnabled}set automaticDataCollectionEnabled(e){this.checkDestroyed(),this._automaticDataCollectionEnabled=e}get name(){return this.checkDestroyed(),this._name}get options(){return this.checkDestroyed(),this._options}get config(){return this.checkDestroyed(),this._config}get container(){return this._container}get isDeleted(){return this._isDeleted}set isDeleted(e){this._isDeleted=e}checkDestroyed(){if(this.isDeleted)throw Sp.create("app-deleted",{appName:this._name})}}/** * @license * Copyright 2019 Google LLC * @@ -7914,7 +7914,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const Jy=Pyt;function Age(t,e={}){let n=t;typeof e!="object"&&(e={name:e});const r=Object.assign({name:R4,automaticDataCollectionEnabled:!1},e),i=r.name;if(typeof i!="string"||!i)throw Sp.create("bad-app-name",{appName:String(i)});if(n||(n=Kge()),!n)throw Sp.create("no-options");const s=BP.get(i);if(s){if(YP(n,s.options)&&YP(r,s.config))return s;throw Sp.create("duplicate-app",{appName:i})}const a=new Xbt(i);for(const l of V4.values())a.addComponent(l);const o=new kyt(n,r,a);return BP.set(i,o),o}function Gge(t=R4){const e=BP.get(t);if(!e&&t===R4&&Kge())return Age();if(!e)throw Sp.create("no-app",{appName:t});return e}function xp(t,e,n){var r;let i=(r=Ryt[t])!==null&&r!==void 0?r:t;n&&(i+=`-${n}`);const s=i.match(/\s|\//),a=e.match(/\s|\//);if(s||a){const o=[`Unable to register library "${i}" with version "${e}":`];s&&o.push(`library name "${i}" contains illegal characters (whitespace or "/")`),s&&a&&o.push("and"),a&&o.push(`version name "${e}" contains illegal characters (whitespace or "/")`),zf.warn(o.join(" "));return}Cb(new Hv(`${i}-version`,()=>({library:i,version:e}),"VERSION"))}/** + */const Zy=Ryt;function Wge(t,e={}){let n=t;typeof e!="object"&&(e={name:e});const r=Object.assign({name:R4,automaticDataCollectionEnabled:!1},e),i=r.name;if(typeof i!="string"||!i)throw Sp.create("bad-app-name",{appName:String(i)});if(n||(n=Cge()),!n)throw Sp.create("no-options");const s=YP.get(i);if(s){if(JP(n,s.options)&&JP(r,s.config))return s;throw Sp.create("duplicate-app",{appName:i})}const a=new Cbt(i);for(const l of V4.values())a.addComponent(l);const o=new Oyt(n,r,a);return YP.set(i,o),o}function Age(t=R4){const e=YP.get(t);if(!e&&t===R4&&Cge())return Wge();if(!e)throw Sp.create("no-app",{appName:t});return e}function xp(t,e,n){var r;let i=(r=Vyt[t])!==null&&r!==void 0?r:t;n&&(i+=`-${n}`);const s=i.match(/\s|\//),a=e.match(/\s|\//);if(s||a){const o=[`Unable to register library "${i}" with version "${e}":`];s&&o.push(`library name "${i}" contains illegal characters (whitespace or "/")`),s&&a&&o.push("and"),a&&o.push(`version name "${e}" contains illegal characters (whitespace or "/")`),zf.warn(o.join(" "));return}Cb(new Hv(`${i}-version`,()=>({library:i,version:e}),"VERSION"))}/** * @license * Copyright 2021 Google LLC * @@ -7929,7 +7929,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const Oyt="firebase-heartbeat-database",Iyt=1,C6="firebase-heartbeat-store";let vU=null;function Fge(){return vU||(vU=Bbt(Oyt,Iyt,{upgrade:(t,e)=>{switch(e){case 0:try{t.createObjectStore(C6)}catch(n){console.warn(n)}}}}).catch(t=>{throw Sp.create("idb-open",{originalErrorMessage:t.message})})),vU}async function Uyt(t){try{const n=(await Fge()).transaction(C6),r=await n.objectStore(C6).get(jge(t));return await n.done,r}catch(e){if(e instanceof Zf)zf.warn(e.message);else{const n=Sp.create("idb-get",{originalErrorMessage:e==null?void 0:e.message});zf.warn(n.message)}}}async function ree(t,e){try{const r=(await Fge()).transaction(C6,"readwrite");await r.objectStore(C6).put(e,jge(t)),await r.done}catch(n){if(n instanceof Zf)zf.warn(n.message);else{const r=Sp.create("idb-set",{originalErrorMessage:n==null?void 0:n.message});zf.warn(r.message)}}}function jge(t){return`${t.name}!${t.options.appId}`}/** + */const Iyt="firebase-heartbeat-database",Uyt=1,X6="firebase-heartbeat-store";let vU=null;function Gge(){return vU||(vU=Hbt(Iyt,Uyt,{upgrade:(t,e)=>{switch(e){case 0:try{t.createObjectStore(X6)}catch(n){console.warn(n)}}}}).catch(t=>{throw Sp.create("idb-open",{originalErrorMessage:t.message})})),vU}async function Nyt(t){try{const n=(await Gge()).transaction(X6),r=await n.objectStore(X6).get(Fge(t));return await n.done,r}catch(e){if(e instanceof Zf)zf.warn(e.message);else{const n=Sp.create("idb-get",{originalErrorMessage:e==null?void 0:e.message});zf.warn(n.message)}}}async function tee(t,e){try{const r=(await Gge()).transaction(X6,"readwrite");await r.objectStore(X6).put(e,Fge(t)),await r.done}catch(n){if(n instanceof Zf)zf.warn(n.message);else{const r=Sp.create("idb-set",{originalErrorMessage:n==null?void 0:n.message});zf.warn(r.message)}}}function Fge(t){return`${t.name}!${t.options.appId}`}/** * @license * Copyright 2021 Google LLC * @@ -7944,7 +7944,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const Nyt=1024,Lyt=30*24*60*60*1e3;class Xyt{constructor(e){this.container=e,this._heartbeatsCache=null;const n=this.container.getProvider("app").getImmediate();this._storage=new Kyt(n),this._heartbeatsCachePromise=this._storage.read().then(r=>(this._heartbeatsCache=r,r))}async triggerHeartbeat(){var e,n;try{const i=this.container.getProvider("platform-logger").getImmediate().getPlatformInfoString(),s=iee();return((e=this._heartbeatsCache)===null||e===void 0?void 0:e.heartbeats)==null&&(this._heartbeatsCache=await this._heartbeatsCachePromise,((n=this._heartbeatsCache)===null||n===void 0?void 0:n.heartbeats)==null)||this._heartbeatsCache.lastSentHeartbeatDate===s||this._heartbeatsCache.heartbeats.some(a=>a.date===s)?void 0:(this._heartbeatsCache.heartbeats.push({date:s,agent:i}),this._heartbeatsCache.heartbeats=this._heartbeatsCache.heartbeats.filter(a=>{const o=new Date(a.date).valueOf();return Date.now()-o<=Lyt}),this._storage.overwrite(this._heartbeatsCache))}catch(r){zf.warn(r)}}async getHeartbeatsHeader(){var e;try{if(this._heartbeatsCache===null&&await this._heartbeatsCachePromise,((e=this._heartbeatsCache)===null||e===void 0?void 0:e.heartbeats)==null||this._heartbeatsCache.heartbeats.length===0)return"";const n=iee(),{heartbeatsToSend:r,unsentEntries:i}=Cyt(this._heartbeatsCache.heartbeats),s=JP(JSON.stringify({version:2,heartbeats:r}));return this._heartbeatsCache.lastSentHeartbeatDate=n,i.length>0?(this._heartbeatsCache.heartbeats=i,await this._storage.overwrite(this._heartbeatsCache)):(this._heartbeatsCache.heartbeats=[],this._storage.overwrite(this._heartbeatsCache)),s}catch(n){return zf.warn(n),""}}}function iee(){return new Date().toISOString().substring(0,10)}function Cyt(t,e=Nyt){const n=[];let r=t.slice();for(const i of t){const s=n.find(a=>a.agent===i.agent);if(s){if(s.dates.push(i.date),see(n)>e){s.dates.pop();break}}else if(n.push({agent:i.agent,dates:[i.date]}),see(n)>e){n.pop();break}r=r.slice(1)}return{heartbeatsToSend:n,unsentEntries:r}}class Kyt{constructor(e){this.app=e,this._canUseIndexedDBPromise=this.runIndexedDBEnvironmentCheck()}async runIndexedDBEnvironmentCheck(){return Ebt()?Mbt().then(()=>!0).catch(()=>!1):!1}async read(){if(await this._canUseIndexedDBPromise){const n=await Uyt(this.app);return n!=null&&n.heartbeats?n:{heartbeats:[]}}else return{heartbeats:[]}}async overwrite(e){var n;if(await this._canUseIndexedDBPromise){const i=await this.read();return ree(this.app,{lastSentHeartbeatDate:(n=e.lastSentHeartbeatDate)!==null&&n!==void 0?n:i.lastSentHeartbeatDate,heartbeats:e.heartbeats})}else return}async add(e){var n;if(await this._canUseIndexedDBPromise){const i=await this.read();return ree(this.app,{lastSentHeartbeatDate:(n=e.lastSentHeartbeatDate)!==null&&n!==void 0?n:i.lastSentHeartbeatDate,heartbeats:[...i.heartbeats,...e.heartbeats]})}else return}}function see(t){return JP(JSON.stringify({version:2,heartbeats:t})).length}/** + */const Lyt=1024,Xyt=30*24*60*60*1e3;class Cyt{constructor(e){this.container=e,this._heartbeatsCache=null;const n=this.container.getProvider("app").getImmediate();this._storage=new qyt(n),this._heartbeatsCachePromise=this._storage.read().then(r=>(this._heartbeatsCache=r,r))}async triggerHeartbeat(){var e,n;try{const i=this.container.getProvider("platform-logger").getImmediate().getPlatformInfoString(),s=nee();return((e=this._heartbeatsCache)===null||e===void 0?void 0:e.heartbeats)==null&&(this._heartbeatsCache=await this._heartbeatsCachePromise,((n=this._heartbeatsCache)===null||n===void 0?void 0:n.heartbeats)==null)||this._heartbeatsCache.lastSentHeartbeatDate===s||this._heartbeatsCache.heartbeats.some(a=>a.date===s)?void 0:(this._heartbeatsCache.heartbeats.push({date:s,agent:i}),this._heartbeatsCache.heartbeats=this._heartbeatsCache.heartbeats.filter(a=>{const o=new Date(a.date).valueOf();return Date.now()-o<=Xyt}),this._storage.overwrite(this._heartbeatsCache))}catch(r){zf.warn(r)}}async getHeartbeatsHeader(){var e;try{if(this._heartbeatsCache===null&&await this._heartbeatsCachePromise,((e=this._heartbeatsCache)===null||e===void 0?void 0:e.heartbeats)==null||this._heartbeatsCache.heartbeats.length===0)return"";const n=nee(),{heartbeatsToSend:r,unsentEntries:i}=Kyt(this._heartbeatsCache.heartbeats),s=ZP(JSON.stringify({version:2,heartbeats:r}));return this._heartbeatsCache.lastSentHeartbeatDate=n,i.length>0?(this._heartbeatsCache.heartbeats=i,await this._storage.overwrite(this._heartbeatsCache)):(this._heartbeatsCache.heartbeats=[],this._storage.overwrite(this._heartbeatsCache)),s}catch(n){return zf.warn(n),""}}}function nee(){return new Date().toISOString().substring(0,10)}function Kyt(t,e=Lyt){const n=[];let r=t.slice();for(const i of t){const s=n.find(a=>a.agent===i.agent);if(s){if(s.dates.push(i.date),ree(n)>e){s.dates.pop();break}}else if(n.push({agent:i.agent,dates:[i.date]}),ree(n)>e){n.pop();break}r=r.slice(1)}return{heartbeatsToSend:n,unsentEntries:r}}class qyt{constructor(e){this.app=e,this._canUseIndexedDBPromise=this.runIndexedDBEnvironmentCheck()}async runIndexedDBEnvironmentCheck(){return Mbt()?Pbt().then(()=>!0).catch(()=>!1):!1}async read(){if(await this._canUseIndexedDBPromise){const n=await Nyt(this.app);return n!=null&&n.heartbeats?n:{heartbeats:[]}}else return{heartbeats:[]}}async overwrite(e){var n;if(await this._canUseIndexedDBPromise){const i=await this.read();return tee(this.app,{lastSentHeartbeatDate:(n=e.lastSentHeartbeatDate)!==null&&n!==void 0?n:i.lastSentHeartbeatDate,heartbeats:e.heartbeats})}else return}async add(e){var n;if(await this._canUseIndexedDBPromise){const i=await this.read();return tee(this.app,{lastSentHeartbeatDate:(n=e.lastSentHeartbeatDate)!==null&&n!==void 0?n:i.lastSentHeartbeatDate,heartbeats:[...i.heartbeats,...e.heartbeats]})}else return}}function ree(t){return ZP(JSON.stringify({version:2,heartbeats:t})).length}/** * @license * Copyright 2019 Google LLC * @@ -7959,7 +7959,7 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function qyt(t){Cb(new Hv("platform-logger",e=>new _bt(e),"PRIVATE")),Cb(new Hv("heartbeat",e=>new Xyt(e),"PRIVATE")),xp(P4,tee,t),xp(P4,tee,"esm2017"),xp("fire-js","")}qyt("");var Dyt="firebase",Wyt="10.14.1";/** + */function Dyt(t){Cb(new Hv("platform-logger",e=>new $bt(e),"PRIVATE")),Cb(new Hv("heartbeat",e=>new Cyt(e),"PRIVATE")),xp(P4,$$,t),xp(P4,$$,"esm2017"),xp("fire-js","")}Dyt("");var Wyt="firebase",Ayt="10.14.1";/** * @license * Copyright 2020 Google LLC * @@ -7974,29 +7974,29 @@ void main() { * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */xp(Dyt,Wyt,"app");var aee=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};/** @license + */xp(Wyt,Ayt,"app");var iee=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};/** @license Copyright The Closure Library Authors. SPDX-License-Identifier: Apache-2.0 -*/var Iv,Zge;(function(){var t;/** @license +*/var Iv,jge;(function(){var t;/** @license Copyright The Closure Library Authors. SPDX-License-Identifier: Apache-2.0 -*/function e(E,S){function P(){}P.prototype=S.prototype,E.D=S.prototype,E.prototype=new P,E.prototype.constructor=E,E.C=function(R,V,z){for(var k=Array(arguments.length-2),N=2;NV;++V)R[V]=S.charCodeAt(P++)|S.charCodeAt(P++)<<8|S.charCodeAt(P++)<<16|S.charCodeAt(P++)<<24;else for(V=0;16>V;++V)R[V]=S[P++]|S[P++]<<8|S[P++]<<16|S[P++]<<24;S=E.g[0],P=E.g[1],V=E.g[2];var z=E.g[3],k=S+(z^P&(V^z))+R[0]+3614090360&4294967295;S=P+(k<<7&4294967295|k>>>25),k=z+(V^S&(P^V))+R[1]+3905402710&4294967295,z=S+(k<<12&4294967295|k>>>20),k=V+(P^z&(S^P))+R[2]+606105819&4294967295,V=z+(k<<17&4294967295|k>>>15),k=P+(S^V&(z^S))+R[3]+3250441966&4294967295,P=V+(k<<22&4294967295|k>>>10),k=S+(z^P&(V^z))+R[4]+4118548399&4294967295,S=P+(k<<7&4294967295|k>>>25),k=z+(V^S&(P^V))+R[5]+1200080426&4294967295,z=S+(k<<12&4294967295|k>>>20),k=V+(P^z&(S^P))+R[6]+2821735955&4294967295,V=z+(k<<17&4294967295|k>>>15),k=P+(S^V&(z^S))+R[7]+4249261313&4294967295,P=V+(k<<22&4294967295|k>>>10),k=S+(z^P&(V^z))+R[8]+1770035416&4294967295,S=P+(k<<7&4294967295|k>>>25),k=z+(V^S&(P^V))+R[9]+2336552879&4294967295,z=S+(k<<12&4294967295|k>>>20),k=V+(P^z&(S^P))+R[10]+4294925233&4294967295,V=z+(k<<17&4294967295|k>>>15),k=P+(S^V&(z^S))+R[11]+2304563134&4294967295,P=V+(k<<22&4294967295|k>>>10),k=S+(z^P&(V^z))+R[12]+1804603682&4294967295,S=P+(k<<7&4294967295|k>>>25),k=z+(V^S&(P^V))+R[13]+4254626195&4294967295,z=S+(k<<12&4294967295|k>>>20),k=V+(P^z&(S^P))+R[14]+2792965006&4294967295,V=z+(k<<17&4294967295|k>>>15),k=P+(S^V&(z^S))+R[15]+1236535329&4294967295,P=V+(k<<22&4294967295|k>>>10),k=S+(V^z&(P^V))+R[1]+4129170786&4294967295,S=P+(k<<5&4294967295|k>>>27),k=z+(P^V&(S^P))+R[6]+3225465664&4294967295,z=S+(k<<9&4294967295|k>>>23),k=V+(S^P&(z^S))+R[11]+643717713&4294967295,V=z+(k<<14&4294967295|k>>>18),k=P+(z^S&(V^z))+R[0]+3921069994&4294967295,P=V+(k<<20&4294967295|k>>>12),k=S+(V^z&(P^V))+R[5]+3593408605&4294967295,S=P+(k<<5&4294967295|k>>>27),k=z+(P^V&(S^P))+R[10]+38016083&4294967295,z=S+(k<<9&4294967295|k>>>23),k=V+(S^P&(z^S))+R[15]+3634488961&4294967295,V=z+(k<<14&4294967295|k>>>18),k=P+(z^S&(V^z))+R[4]+3889429448&4294967295,P=V+(k<<20&4294967295|k>>>12),k=S+(V^z&(P^V))+R[9]+568446438&4294967295,S=P+(k<<5&4294967295|k>>>27),k=z+(P^V&(S^P))+R[14]+3275163606&4294967295,z=S+(k<<9&4294967295|k>>>23),k=V+(S^P&(z^S))+R[3]+4107603335&4294967295,V=z+(k<<14&4294967295|k>>>18),k=P+(z^S&(V^z))+R[8]+1163531501&4294967295,P=V+(k<<20&4294967295|k>>>12),k=S+(V^z&(P^V))+R[13]+2850285829&4294967295,S=P+(k<<5&4294967295|k>>>27),k=z+(P^V&(S^P))+R[2]+4243563512&4294967295,z=S+(k<<9&4294967295|k>>>23),k=V+(S^P&(z^S))+R[7]+1735328473&4294967295,V=z+(k<<14&4294967295|k>>>18),k=P+(z^S&(V^z))+R[12]+2368359562&4294967295,P=V+(k<<20&4294967295|k>>>12),k=S+(P^V^z)+R[5]+4294588738&4294967295,S=P+(k<<4&4294967295|k>>>28),k=z+(S^P^V)+R[8]+2272392833&4294967295,z=S+(k<<11&4294967295|k>>>21),k=V+(z^S^P)+R[11]+1839030562&4294967295,V=z+(k<<16&4294967295|k>>>16),k=P+(V^z^S)+R[14]+4259657740&4294967295,P=V+(k<<23&4294967295|k>>>9),k=S+(P^V^z)+R[1]+2763975236&4294967295,S=P+(k<<4&4294967295|k>>>28),k=z+(S^P^V)+R[4]+1272893353&4294967295,z=S+(k<<11&4294967295|k>>>21),k=V+(z^S^P)+R[7]+4139469664&4294967295,V=z+(k<<16&4294967295|k>>>16),k=P+(V^z^S)+R[10]+3200236656&4294967295,P=V+(k<<23&4294967295|k>>>9),k=S+(P^V^z)+R[13]+681279174&4294967295,S=P+(k<<4&4294967295|k>>>28),k=z+(S^P^V)+R[0]+3936430074&4294967295,z=S+(k<<11&4294967295|k>>>21),k=V+(z^S^P)+R[3]+3572445317&4294967295,V=z+(k<<16&4294967295|k>>>16),k=P+(V^z^S)+R[6]+76029189&4294967295,P=V+(k<<23&4294967295|k>>>9),k=S+(P^V^z)+R[9]+3654602809&4294967295,S=P+(k<<4&4294967295|k>>>28),k=z+(S^P^V)+R[12]+3873151461&4294967295,z=S+(k<<11&4294967295|k>>>21),k=V+(z^S^P)+R[15]+530742520&4294967295,V=z+(k<<16&4294967295|k>>>16),k=P+(V^z^S)+R[2]+3299628645&4294967295,P=V+(k<<23&4294967295|k>>>9),k=S+(V^(P|~z))+R[0]+4096336452&4294967295,S=P+(k<<6&4294967295|k>>>26),k=z+(P^(S|~V))+R[7]+1126891415&4294967295,z=S+(k<<10&4294967295|k>>>22),k=V+(S^(z|~P))+R[14]+2878612391&4294967295,V=z+(k<<15&4294967295|k>>>17),k=P+(z^(V|~S))+R[5]+4237533241&4294967295,P=V+(k<<21&4294967295|k>>>11),k=S+(V^(P|~z))+R[12]+1700485571&4294967295,S=P+(k<<6&4294967295|k>>>26),k=z+(P^(S|~V))+R[3]+2399980690&4294967295,z=S+(k<<10&4294967295|k>>>22),k=V+(S^(z|~P))+R[10]+4293915773&4294967295,V=z+(k<<15&4294967295|k>>>17),k=P+(z^(V|~S))+R[1]+2240044497&4294967295,P=V+(k<<21&4294967295|k>>>11),k=S+(V^(P|~z))+R[8]+1873313359&4294967295,S=P+(k<<6&4294967295|k>>>26),k=z+(P^(S|~V))+R[15]+4264355552&4294967295,z=S+(k<<10&4294967295|k>>>22),k=V+(S^(z|~P))+R[6]+2734768916&4294967295,V=z+(k<<15&4294967295|k>>>17),k=P+(z^(V|~S))+R[13]+1309151649&4294967295,P=V+(k<<21&4294967295|k>>>11),k=S+(V^(P|~z))+R[4]+4149444226&4294967295,S=P+(k<<6&4294967295|k>>>26),k=z+(P^(S|~V))+R[11]+3174756917&4294967295,z=S+(k<<10&4294967295|k>>>22),k=V+(S^(z|~P))+R[2]+718787259&4294967295,V=z+(k<<15&4294967295|k>>>17),k=P+(z^(V|~S))+R[9]+3951481745&4294967295,E.g[0]=E.g[0]+S&4294967295,E.g[1]=E.g[1]+(V+(k<<21&4294967295|k>>>11))&4294967295,E.g[2]=E.g[2]+V&4294967295,E.g[3]=E.g[3]+z&4294967295}r.prototype.u=function(E,S){S===void 0&&(S=E.length);for(var P=S-this.blockSize,R=this.B,V=this.h,z=0;zthis.h?this.blockSize:2*this.blockSize)-this.h);E[0]=128;for(var S=1;SS;++S)for(var R=0;32>R;R+=8)E[P++]=this.g[S]>>>R&255;return E};function s(E,S){var P=o;return Object.prototype.hasOwnProperty.call(P,E)?P[E]:P[E]=S(E)}function a(E,S){this.h=S;for(var P=[],R=!0,V=E.length-1;0<=V;V--){var z=E[V]|0;R&&z==S||(P[V]=z,R=!1)}this.g=P}var o={};function l(E){return-128<=E&&128>E?s(E,function(S){return new a([S|0],0>S?-1:0)}):new a([E|0],0>E?-1:0)}function u(E){if(isNaN(E)||!isFinite(E))return d;if(0>E)return v(u(-E));for(var S=[],P=1,R=0;E>=P;R++)S[R]=E/P|0,P*=4294967296;return new a(S,0)}function c(E,S){if(E.length==0)throw Error("number format error: empty string");if(S=S||10,2>S||36z?(z=u(Math.pow(S,z)),R=R.j(z).add(u(k))):(R=R.j(P),R=R.add(u(k)))}return R}var d=l(0),f=l(1),h=l(16777216);t=a.prototype,t.m=function(){if(m(this))return-v(this).m();for(var E=0,S=1,P=0;PE||36>>0).toString(E);if(P=V,p(P))return z+R;for(;6>z.length;)z="0"+z;R=z+R}},t.i=function(E){return 0>E?0:E>>16)+(this.i(V)>>>16)+(E.i(V)>>>16);R=k>>>16,z&=65535,k&=65535,P[V]=k<<16|z}return new a(P,P[P.length-1]&-2147483648?-1:0)};function g(E,S){return E.add(v(S))}t.j=function(E){if(p(this)||p(E))return d;if(m(this))return m(E)?v(this).j(v(E)):v(v(this).j(E));if(m(E))return v(this.j(v(E)));if(0>this.l(h)&&0>E.l(h))return u(this.m()*E.m());for(var S=this.g.length+E.g.length,P=[],R=0;R<2*S;R++)P[R]=0;for(R=0;R>>16,k=this.i(R)&65535,N=E.i(V)>>>16,q=E.i(V)&65535;P[2*R+2*V]+=k*q,b(P,2*R+2*V),P[2*R+2*V+1]+=z*q,b(P,2*R+2*V+1),P[2*R+2*V+1]+=k*N,b(P,2*R+2*V+1),P[2*R+2*V+2]+=z*N,b(P,2*R+2*V+2)}for(R=0;R>>16,E[S]&=65535,S++}function y(E,S){this.g=E,this.h=S}function x(E,S){if(p(S))throw Error("division by zero");if(p(E))return new y(d,d);if(m(E))return S=x(v(E),S),new y(v(S.g),v(S.h));if(m(S))return S=x(E,v(S)),new y(v(S.g),S.h);if(30=R.l(E);)P=T(P),R=T(R);var V=M(P,1),z=M(R,1);for(R=M(R,2),P=M(P,2);!p(R);){var k=z.add(R);0>=k.l(E)&&(V=V.add(P),z=k),R=M(R,1),P=M(P,1)}return S=g(E,V.j(S)),new y(V,S)}for(V=d;0<=E.l(S);){for(P=Math.max(1,Math.floor(E.m()/S.m())),R=Math.ceil(Math.log(P)/Math.LN2),R=48>=R?1:Math.pow(2,R-48),z=u(P),k=z.j(S);m(k)||0>>31;return new a(P,E.h)}function M(E,S){var P=S>>5;S%=32;for(var R=E.g.length-P,V=[],z=0;z>>S|E.i(z+P+1)<<32-S:E.i(z+P);return new a(V,E.h)}r.prototype.digest=r.prototype.v,r.prototype.reset=r.prototype.s,r.prototype.update=r.prototype.u,Zge=r,a.prototype.add=a.prototype.add,a.prototype.multiply=a.prototype.j,a.prototype.modulo=a.prototype.A,a.prototype.compare=a.prototype.l,a.prototype.toNumber=a.prototype.m,a.prototype.toString=a.prototype.toString,a.prototype.getBits=a.prototype.i,a.fromNumber=u,a.fromString=c,Iv=a}).apply(typeof aee<"u"?aee:typeof self<"u"?self:typeof window<"u"?window:{});var RE=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};/** @license +*/function e(E,S){function P(){}P.prototype=S.prototype,E.D=S.prototype,E.prototype=new P,E.prototype.constructor=E,E.C=function(R,V,z){for(var k=Array(arguments.length-2),N=2;NV;++V)R[V]=S.charCodeAt(P++)|S.charCodeAt(P++)<<8|S.charCodeAt(P++)<<16|S.charCodeAt(P++)<<24;else for(V=0;16>V;++V)R[V]=S[P++]|S[P++]<<8|S[P++]<<16|S[P++]<<24;S=E.g[0],P=E.g[1],V=E.g[2];var z=E.g[3],k=S+(z^P&(V^z))+R[0]+3614090360&4294967295;S=P+(k<<7&4294967295|k>>>25),k=z+(V^S&(P^V))+R[1]+3905402710&4294967295,z=S+(k<<12&4294967295|k>>>20),k=V+(P^z&(S^P))+R[2]+606105819&4294967295,V=z+(k<<17&4294967295|k>>>15),k=P+(S^V&(z^S))+R[3]+3250441966&4294967295,P=V+(k<<22&4294967295|k>>>10),k=S+(z^P&(V^z))+R[4]+4118548399&4294967295,S=P+(k<<7&4294967295|k>>>25),k=z+(V^S&(P^V))+R[5]+1200080426&4294967295,z=S+(k<<12&4294967295|k>>>20),k=V+(P^z&(S^P))+R[6]+2821735955&4294967295,V=z+(k<<17&4294967295|k>>>15),k=P+(S^V&(z^S))+R[7]+4249261313&4294967295,P=V+(k<<22&4294967295|k>>>10),k=S+(z^P&(V^z))+R[8]+1770035416&4294967295,S=P+(k<<7&4294967295|k>>>25),k=z+(V^S&(P^V))+R[9]+2336552879&4294967295,z=S+(k<<12&4294967295|k>>>20),k=V+(P^z&(S^P))+R[10]+4294925233&4294967295,V=z+(k<<17&4294967295|k>>>15),k=P+(S^V&(z^S))+R[11]+2304563134&4294967295,P=V+(k<<22&4294967295|k>>>10),k=S+(z^P&(V^z))+R[12]+1804603682&4294967295,S=P+(k<<7&4294967295|k>>>25),k=z+(V^S&(P^V))+R[13]+4254626195&4294967295,z=S+(k<<12&4294967295|k>>>20),k=V+(P^z&(S^P))+R[14]+2792965006&4294967295,V=z+(k<<17&4294967295|k>>>15),k=P+(S^V&(z^S))+R[15]+1236535329&4294967295,P=V+(k<<22&4294967295|k>>>10),k=S+(V^z&(P^V))+R[1]+4129170786&4294967295,S=P+(k<<5&4294967295|k>>>27),k=z+(P^V&(S^P))+R[6]+3225465664&4294967295,z=S+(k<<9&4294967295|k>>>23),k=V+(S^P&(z^S))+R[11]+643717713&4294967295,V=z+(k<<14&4294967295|k>>>18),k=P+(z^S&(V^z))+R[0]+3921069994&4294967295,P=V+(k<<20&4294967295|k>>>12),k=S+(V^z&(P^V))+R[5]+3593408605&4294967295,S=P+(k<<5&4294967295|k>>>27),k=z+(P^V&(S^P))+R[10]+38016083&4294967295,z=S+(k<<9&4294967295|k>>>23),k=V+(S^P&(z^S))+R[15]+3634488961&4294967295,V=z+(k<<14&4294967295|k>>>18),k=P+(z^S&(V^z))+R[4]+3889429448&4294967295,P=V+(k<<20&4294967295|k>>>12),k=S+(V^z&(P^V))+R[9]+568446438&4294967295,S=P+(k<<5&4294967295|k>>>27),k=z+(P^V&(S^P))+R[14]+3275163606&4294967295,z=S+(k<<9&4294967295|k>>>23),k=V+(S^P&(z^S))+R[3]+4107603335&4294967295,V=z+(k<<14&4294967295|k>>>18),k=P+(z^S&(V^z))+R[8]+1163531501&4294967295,P=V+(k<<20&4294967295|k>>>12),k=S+(V^z&(P^V))+R[13]+2850285829&4294967295,S=P+(k<<5&4294967295|k>>>27),k=z+(P^V&(S^P))+R[2]+4243563512&4294967295,z=S+(k<<9&4294967295|k>>>23),k=V+(S^P&(z^S))+R[7]+1735328473&4294967295,V=z+(k<<14&4294967295|k>>>18),k=P+(z^S&(V^z))+R[12]+2368359562&4294967295,P=V+(k<<20&4294967295|k>>>12),k=S+(P^V^z)+R[5]+4294588738&4294967295,S=P+(k<<4&4294967295|k>>>28),k=z+(S^P^V)+R[8]+2272392833&4294967295,z=S+(k<<11&4294967295|k>>>21),k=V+(z^S^P)+R[11]+1839030562&4294967295,V=z+(k<<16&4294967295|k>>>16),k=P+(V^z^S)+R[14]+4259657740&4294967295,P=V+(k<<23&4294967295|k>>>9),k=S+(P^V^z)+R[1]+2763975236&4294967295,S=P+(k<<4&4294967295|k>>>28),k=z+(S^P^V)+R[4]+1272893353&4294967295,z=S+(k<<11&4294967295|k>>>21),k=V+(z^S^P)+R[7]+4139469664&4294967295,V=z+(k<<16&4294967295|k>>>16),k=P+(V^z^S)+R[10]+3200236656&4294967295,P=V+(k<<23&4294967295|k>>>9),k=S+(P^V^z)+R[13]+681279174&4294967295,S=P+(k<<4&4294967295|k>>>28),k=z+(S^P^V)+R[0]+3936430074&4294967295,z=S+(k<<11&4294967295|k>>>21),k=V+(z^S^P)+R[3]+3572445317&4294967295,V=z+(k<<16&4294967295|k>>>16),k=P+(V^z^S)+R[6]+76029189&4294967295,P=V+(k<<23&4294967295|k>>>9),k=S+(P^V^z)+R[9]+3654602809&4294967295,S=P+(k<<4&4294967295|k>>>28),k=z+(S^P^V)+R[12]+3873151461&4294967295,z=S+(k<<11&4294967295|k>>>21),k=V+(z^S^P)+R[15]+530742520&4294967295,V=z+(k<<16&4294967295|k>>>16),k=P+(V^z^S)+R[2]+3299628645&4294967295,P=V+(k<<23&4294967295|k>>>9),k=S+(V^(P|~z))+R[0]+4096336452&4294967295,S=P+(k<<6&4294967295|k>>>26),k=z+(P^(S|~V))+R[7]+1126891415&4294967295,z=S+(k<<10&4294967295|k>>>22),k=V+(S^(z|~P))+R[14]+2878612391&4294967295,V=z+(k<<15&4294967295|k>>>17),k=P+(z^(V|~S))+R[5]+4237533241&4294967295,P=V+(k<<21&4294967295|k>>>11),k=S+(V^(P|~z))+R[12]+1700485571&4294967295,S=P+(k<<6&4294967295|k>>>26),k=z+(P^(S|~V))+R[3]+2399980690&4294967295,z=S+(k<<10&4294967295|k>>>22),k=V+(S^(z|~P))+R[10]+4293915773&4294967295,V=z+(k<<15&4294967295|k>>>17),k=P+(z^(V|~S))+R[1]+2240044497&4294967295,P=V+(k<<21&4294967295|k>>>11),k=S+(V^(P|~z))+R[8]+1873313359&4294967295,S=P+(k<<6&4294967295|k>>>26),k=z+(P^(S|~V))+R[15]+4264355552&4294967295,z=S+(k<<10&4294967295|k>>>22),k=V+(S^(z|~P))+R[6]+2734768916&4294967295,V=z+(k<<15&4294967295|k>>>17),k=P+(z^(V|~S))+R[13]+1309151649&4294967295,P=V+(k<<21&4294967295|k>>>11),k=S+(V^(P|~z))+R[4]+4149444226&4294967295,S=P+(k<<6&4294967295|k>>>26),k=z+(P^(S|~V))+R[11]+3174756917&4294967295,z=S+(k<<10&4294967295|k>>>22),k=V+(S^(z|~P))+R[2]+718787259&4294967295,V=z+(k<<15&4294967295|k>>>17),k=P+(z^(V|~S))+R[9]+3951481745&4294967295,E.g[0]=E.g[0]+S&4294967295,E.g[1]=E.g[1]+(V+(k<<21&4294967295|k>>>11))&4294967295,E.g[2]=E.g[2]+V&4294967295,E.g[3]=E.g[3]+z&4294967295}r.prototype.u=function(E,S){S===void 0&&(S=E.length);for(var P=S-this.blockSize,R=this.B,V=this.h,z=0;zthis.h?this.blockSize:2*this.blockSize)-this.h);E[0]=128;for(var S=1;SS;++S)for(var R=0;32>R;R+=8)E[P++]=this.g[S]>>>R&255;return E};function s(E,S){var P=o;return Object.prototype.hasOwnProperty.call(P,E)?P[E]:P[E]=S(E)}function a(E,S){this.h=S;for(var P=[],R=!0,V=E.length-1;0<=V;V--){var z=E[V]|0;R&&z==S||(P[V]=z,R=!1)}this.g=P}var o={};function l(E){return-128<=E&&128>E?s(E,function(S){return new a([S|0],0>S?-1:0)}):new a([E|0],0>E?-1:0)}function u(E){if(isNaN(E)||!isFinite(E))return d;if(0>E)return v(u(-E));for(var S=[],P=1,R=0;E>=P;R++)S[R]=E/P|0,P*=4294967296;return new a(S,0)}function c(E,S){if(E.length==0)throw Error("number format error: empty string");if(S=S||10,2>S||36z?(z=u(Math.pow(S,z)),R=R.j(z).add(u(k))):(R=R.j(P),R=R.add(u(k)))}return R}var d=l(0),f=l(1),h=l(16777216);t=a.prototype,t.m=function(){if(m(this))return-v(this).m();for(var E=0,S=1,P=0;PE||36>>0).toString(E);if(P=V,p(P))return z+R;for(;6>z.length;)z="0"+z;R=z+R}},t.i=function(E){return 0>E?0:E>>16)+(this.i(V)>>>16)+(E.i(V)>>>16);R=k>>>16,z&=65535,k&=65535,P[V]=k<<16|z}return new a(P,P[P.length-1]&-2147483648?-1:0)};function g(E,S){return E.add(v(S))}t.j=function(E){if(p(this)||p(E))return d;if(m(this))return m(E)?v(this).j(v(E)):v(v(this).j(E));if(m(E))return v(this.j(v(E)));if(0>this.l(h)&&0>E.l(h))return u(this.m()*E.m());for(var S=this.g.length+E.g.length,P=[],R=0;R<2*S;R++)P[R]=0;for(R=0;R>>16,k=this.i(R)&65535,N=E.i(V)>>>16,q=E.i(V)&65535;P[2*R+2*V]+=k*q,b(P,2*R+2*V),P[2*R+2*V+1]+=z*q,b(P,2*R+2*V+1),P[2*R+2*V+1]+=k*N,b(P,2*R+2*V+1),P[2*R+2*V+2]+=z*N,b(P,2*R+2*V+2)}for(R=0;R>>16,E[S]&=65535,S++}function y(E,S){this.g=E,this.h=S}function x(E,S){if(p(S))throw Error("division by zero");if(p(E))return new y(d,d);if(m(E))return S=x(v(E),S),new y(v(S.g),v(S.h));if(m(S))return S=x(E,v(S)),new y(v(S.g),S.h);if(30=R.l(E);)P=T(P),R=T(R);var V=M(P,1),z=M(R,1);for(R=M(R,2),P=M(P,2);!p(R);){var k=z.add(R);0>=k.l(E)&&(V=V.add(P),z=k),R=M(R,1),P=M(P,1)}return S=g(E,V.j(S)),new y(V,S)}for(V=d;0<=E.l(S);){for(P=Math.max(1,Math.floor(E.m()/S.m())),R=Math.ceil(Math.log(P)/Math.LN2),R=48>=R?1:Math.pow(2,R-48),z=u(P),k=z.j(S);m(k)||0>>31;return new a(P,E.h)}function M(E,S){var P=S>>5;S%=32;for(var R=E.g.length-P,V=[],z=0;z>>S|E.i(z+P+1)<<32-S:E.i(z+P);return new a(V,E.h)}r.prototype.digest=r.prototype.v,r.prototype.reset=r.prototype.s,r.prototype.update=r.prototype.u,jge=r,a.prototype.add=a.prototype.add,a.prototype.multiply=a.prototype.j,a.prototype.modulo=a.prototype.A,a.prototype.compare=a.prototype.l,a.prototype.toNumber=a.prototype.m,a.prototype.toString=a.prototype.toString,a.prototype.getBits=a.prototype.i,a.fromNumber=u,a.fromString=c,Iv=a}).apply(typeof iee<"u"?iee:typeof self<"u"?self:typeof window<"u"?window:{});var RE=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};/** @license Copyright The Closure Library Authors. SPDX-License-Identifier: Apache-2.0 -*/var Jge,P3,Yge,H7,z4,Bge,Hge,Qge;(function(){var t,e=typeof Object.defineProperties=="function"?Object.defineProperty:function(w,I,X){return w==Array.prototype||w==Object.prototype||(w[I]=X.value),w};function n(w){w=[typeof globalThis=="object"&&globalThis,w,typeof window=="object"&&window,typeof self=="object"&&self,typeof RE=="object"&&RE];for(var I=0;I{throw w},0)}function k(){var w=j;let I=null;return w.g&&(I=w.g,w.g=w.g.next,w.g||(w.h=null),I.next=null),I}class N{constructor(){this.h=this.g=null}add(I,X){const H=q.get();H.set(I,X),this.h?this.h.next=H:this.g=H,this.h=H}}var q=new g(()=>new L,w=>w.reset());class L{constructor(){this.next=this.g=this.h=null}set(I,X){this.h=I,this.g=X,this.next=null}reset(){this.next=this.g=this.h=null}}let A,Z=!1,j=new N,ne=()=>{const w=o.Promise.resolve(void 0);A=()=>{w.then(G)}};var G=()=>{for(var w;w=k();){try{w.h.call(w.g)}catch(X){z(X)}var I=q;I.j(w),100>I.h&&(I.h++,w.next=I.g,I.g=w)}Z=!1};function B(){this.s=this.s,this.C=this.C}B.prototype.s=!1,B.prototype.ma=function(){this.s||(this.s=!0,this.N())},B.prototype.N=function(){if(this.C)for(;this.C.length;)this.C.shift()()};function ee(w,I){this.type=w,this.g=this.target=I,this.defaultPrevented=!1}ee.prototype.h=function(){this.defaultPrevented=!0};var ce=function(){if(!o.addEventListener||!Object.defineProperty)return!1;var w=!1,I=Object.defineProperty({},"passive",{get:function(){w=!0}});try{const X=()=>{};o.addEventListener("test",X,I),o.removeEventListener("test",X,I)}catch{}return w}();function fe(w,I){if(ee.call(this,w?w.type:""),this.relatedTarget=this.g=this.target=null,this.button=this.screenY=this.screenX=this.clientY=this.clientX=0,this.key="",this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1,this.state=null,this.pointerId=0,this.pointerType="",this.i=null,w){var X=this.type=w.type,H=w.changedTouches&&w.changedTouches.length?w.changedTouches[0]:null;if(this.target=w.target||w.srcElement,this.g=I,I=w.relatedTarget){if(T){e:{try{x(I.nodeName);var Ne=!0;break e}catch{}Ne=!1}Ne||(I=null)}}else X=="mouseover"?I=w.fromElement:X=="mouseout"&&(I=w.toElement);this.relatedTarget=I,H?(this.clientX=H.clientX!==void 0?H.clientX:H.pageX,this.clientY=H.clientY!==void 0?H.clientY:H.pageY,this.screenX=H.screenX||0,this.screenY=H.screenY||0):(this.clientX=w.clientX!==void 0?w.clientX:w.pageX,this.clientY=w.clientY!==void 0?w.clientY:w.pageY,this.screenX=w.screenX||0,this.screenY=w.screenY||0),this.button=w.button,this.key=w.key||"",this.ctrlKey=w.ctrlKey,this.altKey=w.altKey,this.shiftKey=w.shiftKey,this.metaKey=w.metaKey,this.pointerId=w.pointerId||0,this.pointerType=typeof w.pointerType=="string"?w.pointerType:te[w.pointerType]||"",this.state=w.state,this.i=w,w.defaultPrevented&&fe.aa.h.call(this)}}p(fe,ee);var te={2:"touch",3:"pen",4:"mouse"};fe.prototype.h=function(){fe.aa.h.call(this);var w=this.i;w.preventDefault?w.preventDefault():w.returnValue=!1};var _="closure_listenable_"+(1e6*Math.random()|0),oe=0;function ye(w,I,X,H,Ne){this.listener=w,this.proxy=null,this.src=I,this.type=X,this.capture=!!H,this.ha=Ne,this.key=++oe,this.da=this.fa=!1}function ve(w){w.da=!0,w.listener=null,w.proxy=null,w.src=null,w.ha=null}function Ke(w){this.src=w,this.g={},this.h=0}Ke.prototype.add=function(w,I,X,H,Ne){var Je=w.toString();w=this.g[Je],w||(w=this.g[Je]=[],this.h++);var bt=D(w,I,H,Ne);return-1>>0);function We(w){return typeof w=="function"?w:(w[me]||(w[me]=function(I){return w.handleEvent(I)}),w[me])}function Ce(){B.call(this),this.i=new Ke(this),this.M=this,this.F=null}p(Ce,B),Ce.prototype[_]=!0,Ce.prototype.removeEventListener=function(w,I,X,H){we(this,w,I,X,H)};function Ae(w,I){var X,H=w.F;if(H)for(X=[];H;H=H.F)X.push(H);if(w=w.M,H=I.type||I,typeof I=="string")I=new ee(I,w);else if(I instanceof ee)I.target=I.target||w;else{var Ne=I;I=new ee(H,w),R(I,Ne)}if(Ne=!0,X)for(var Je=X.length-1;0<=Je;Je--){var bt=I.g=X[Je];Ne=J(bt,H,!0,I)&&Ne}if(bt=I.g=w,Ne=J(bt,H,!0,I)&&Ne,Ne=J(bt,H,!1,I)&&Ne,X)for(Je=0;Je{w.g=null,w.i&&(w.i=!1,ge(w))},w.l);const I=w.h;w.h=null,w.m.apply(null,I)}class Se extends B{constructor(I,X){super(),this.m=I,this.l=X,this.h=null,this.i=!1,this.g=null}j(I){this.h=arguments,this.g?this.i=!0:ge(this)}N(){super.N(),this.g&&(o.clearTimeout(this.g),this.g=null,this.i=!1,this.h=null)}}function Q(w){B.call(this),this.h=w,this.g={}}p(Q,B);var Pe=[];function Ve(w){M(w.g,function(I,X){this.g.hasOwnProperty(X)&&se(I)},w),w.g={}}Q.prototype.N=function(){Q.aa.N.call(this),Ve(this)},Q.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented")};var Fe=o.JSON.stringify,je=o.JSON.parse,Ze=class{stringify(w){return o.JSON.stringify(w,void 0)}parse(w){return o.JSON.parse(w,void 0)}};function Re(){}Re.prototype.h=null;function Me(w){return w.h||(w.h=w.i())}function lt(){}var vt={OPEN:"a",kb:"b",Ja:"c",wb:"d"};function bn(){ee.call(this,"d")}p(bn,ee);function Tr(){ee.call(this,"c")}p(Tr,ee);var Fr={},zr=null;function sr(){return zr=zr||new Ce}Fr.La="serverreachability";function bo(w){ee.call(this,Fr.La,w)}p(bo,ee);function $n(w){const I=sr();Ae(I,new bo(I))}Fr.STAT_EVENT="statevent";function wr(w,I){ee.call(this,Fr.STAT_EVENT,w),this.stat=I}p(wr,ee);function ar(w){const I=sr();Ae(I,new wr(I,w))}Fr.Ma="timingevent";function Bi(w,I){ee.call(this,Fr.Ma,w),this.size=I}p(Bi,ee);function $(w,I){if(typeof w!="function")throw Error("Fn must not be null and must be a function");return o.setTimeout(function(){w()},I)}function Ie(){this.g=!0}Ie.prototype.xa=function(){this.g=!1};function Ge(w,I,X,H,Ne,Je){w.info(function(){if(w.g)if(Je)for(var bt="",Cr=Je.split("&"),js=0;js{throw w},0)}function k(){var w=F;let I=null;return w.g&&(I=w.g,w.g=w.g.next,w.g||(w.h=null),I.next=null),I}class N{constructor(){this.h=this.g=null}add(I,X){const H=q.get();H.set(I,X),this.h?this.h.next=H:this.g=H,this.h=H}}var q=new g(()=>new L,w=>w.reset());class L{constructor(){this.next=this.g=this.h=null}set(I,X){this.h=I,this.g=X,this.next=null}reset(){this.next=this.g=this.h=null}}let A,J=!1,F=new N,ne=()=>{const w=o.Promise.resolve(void 0);A=()=>{w.then(j)}};var j=()=>{for(var w;w=k();){try{w.h.call(w.g)}catch(X){z(X)}var I=q;I.j(w),100>I.h&&(I.h++,w.next=I.g,I.g=w)}J=!1};function Z(){this.s=this.s,this.C=this.C}Z.prototype.s=!1,Z.prototype.ma=function(){this.s||(this.s=!0,this.N())},Z.prototype.N=function(){if(this.C)for(;this.C.length;)this.C.shift()()};function _(w,I){this.type=w,this.g=this.target=I,this.defaultPrevented=!1}_.prototype.h=function(){this.defaultPrevented=!0};var le=function(){if(!o.addEventListener||!Object.defineProperty)return!1;var w=!1,I=Object.defineProperty({},"passive",{get:function(){w=!0}});try{const X=()=>{};o.addEventListener("test",X,I),o.removeEventListener("test",X,I)}catch{}return w}();function fe(w,I){if(_.call(this,w?w.type:""),this.relatedTarget=this.g=this.target=null,this.button=this.screenY=this.screenX=this.clientY=this.clientX=0,this.key="",this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1,this.state=null,this.pointerId=0,this.pointerType="",this.i=null,w){var X=this.type=w.type,H=w.changedTouches&&w.changedTouches.length?w.changedTouches[0]:null;if(this.target=w.target||w.srcElement,this.g=I,I=w.relatedTarget){if(T){e:{try{x(I.nodeName);var Ne=!0;break e}catch{}Ne=!1}Ne||(I=null)}}else X=="mouseover"?I=w.fromElement:X=="mouseout"&&(I=w.toElement);this.relatedTarget=I,H?(this.clientX=H.clientX!==void 0?H.clientX:H.pageX,this.clientY=H.clientY!==void 0?H.clientY:H.pageY,this.screenX=H.screenX||0,this.screenY=H.screenY||0):(this.clientX=w.clientX!==void 0?w.clientX:w.pageX,this.clientY=w.clientY!==void 0?w.clientY:w.pageY,this.screenX=w.screenX||0,this.screenY=w.screenY||0),this.button=w.button,this.key=w.key||"",this.ctrlKey=w.ctrlKey,this.altKey=w.altKey,this.shiftKey=w.shiftKey,this.metaKey=w.metaKey,this.pointerId=w.pointerId||0,this.pointerType=typeof w.pointerType=="string"?w.pointerType:te[w.pointerType]||"",this.state=w.state,this.i=w,w.defaultPrevented&&fe.aa.h.call(this)}}p(fe,_);var te={2:"touch",3:"pen",4:"mouse"};fe.prototype.h=function(){fe.aa.h.call(this);var w=this.i;w.preventDefault?w.preventDefault():w.returnValue=!1};var $="closure_listenable_"+(1e6*Math.random()|0),oe=0;function ge(w,I,X,H,Ne){this.listener=w,this.proxy=null,this.src=I,this.type=X,this.capture=!!H,this.ha=Ne,this.key=++oe,this.da=this.fa=!1}function ve(w){w.da=!0,w.listener=null,w.proxy=null,w.src=null,w.ha=null}function Ke(w){this.src=w,this.g={},this.h=0}Ke.prototype.add=function(w,I,X,H,Ne){var Je=w.toString();w=this.g[Je],w||(w=this.g[Je]=[],this.h++);var bt=D(w,I,H,Ne);return-1>>0);function We(w){return typeof w=="function"?w:(w[me]||(w[me]=function(I){return w.handleEvent(I)}),w[me])}function Ce(){Z.call(this),this.i=new Ke(this),this.M=this,this.F=null}p(Ce,Z),Ce.prototype[$]=!0,Ce.prototype.removeEventListener=function(w,I,X,H){we(this,w,I,X,H)};function Ae(w,I){var X,H=w.F;if(H)for(X=[];H;H=H.F)X.push(H);if(w=w.M,H=I.type||I,typeof I=="string")I=new _(I,w);else if(I instanceof _)I.target=I.target||w;else{var Ne=I;I=new _(H,w),R(I,Ne)}if(Ne=!0,X)for(var Je=X.length-1;0<=Je;Je--){var bt=I.g=X[Je];Ne=Y(bt,H,!0,I)&&Ne}if(bt=I.g=w,Ne=Y(bt,H,!0,I)&&Ne,Ne=Y(bt,H,!1,I)&&Ne,X)for(Je=0;Je{w.g=null,w.i&&(w.i=!1,be(w))},w.l);const I=w.h;w.h=null,w.m.apply(null,I)}class Se extends Z{constructor(I,X){super(),this.m=I,this.l=X,this.h=null,this.i=!1,this.g=null}j(I){this.h=arguments,this.g?this.i=!0:be(this)}N(){super.N(),this.g&&(o.clearTimeout(this.g),this.g=null,this.i=!1,this.h=null)}}function Q(w){Z.call(this),this.h=w,this.g={}}p(Q,Z);var Pe=[];function Ve(w){M(w.g,function(I,X){this.g.hasOwnProperty(X)&&se(I)},w),w.g={}}Q.prototype.N=function(){Q.aa.N.call(this),Ve(this)},Q.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented")};var Fe=o.JSON.stringify,je=o.JSON.parse,Ze=class{stringify(w){return o.JSON.stringify(w,void 0)}parse(w){return o.JSON.parse(w,void 0)}};function Re(){}Re.prototype.h=null;function Me(w){return w.h||(w.h=w.i())}function lt(){}var vt={OPEN:"a",kb:"b",Ja:"c",wb:"d"};function bn(){_.call(this,"d")}p(bn,_);function Tr(){_.call(this,"c")}p(Tr,_);var Fr={},zr=null;function sr(){return zr=zr||new Ce}Fr.La="serverreachability";function go(w){_.call(this,Fr.La,w)}p(go,_);function $n(w){const I=sr();Ae(I,new go(I))}Fr.STAT_EVENT="statevent";function wr(w,I){_.call(this,Fr.STAT_EVENT,w),this.stat=I}p(wr,_);function ar(w){const I=sr();Ae(I,new wr(I,w))}Fr.Ma="timingevent";function Bi(w,I){_.call(this,Fr.Ma,w),this.size=I}p(Bi,_);function ee(w,I){if(typeof w!="function")throw Error("Fn must not be null and must be a function");return o.setTimeout(function(){w()},I)}function Ie(){this.g=!0}Ie.prototype.xa=function(){this.g=!1};function Ge(w,I,X,H,Ne,Je){w.info(function(){if(w.g)if(Je)for(var bt="",Cr=Je.split("&"),js=0;jsH.length)){var Ne=H[1];if(Array.isArray(Ne)&&!(1>Ne.length)){var Je=Ne[0];if(Je!="noop"&&Je!="stop"&&Je!="close")for(var bt=1;btma)&&(ma!=3||this.g&&(this.h.h||this.g.oa()||Kw(this.g)))){this.J||ma!=4||I==7||(I==8||0>=J0?$n(3):$n(2)),Xt(this);var X=this.g.Z();this.X=X;t:if(_e(this)){var H=Kw(this.g);w="";var Ne=H.length,Je=xi(this.g)==4;if(!this.h.i){if(typeof TextDecoder>"u"){wt(this),Tt(this);var bt="";break t}this.h.i=new o.TextDecoder}for(I=0;II.length?ot:(I=I.slice(H,H+X),w.C=H+X,I)))}Le.prototype.cancel=function(){this.J=!0,wt(this)};function dt(w){w.S=Date.now()+w.I,zt(w,w.I)}function zt(w,I){if(w.B!=null)throw Error("WatchDog timer not null");w.B=$(f(w.ba,w),I)}function Xt(w){w.B&&(o.clearTimeout(w.B),w.B=null)}Le.prototype.ba=function(){this.B=null;const w=Date.now();0<=w-this.S?(Pt(this.i,this.A),this.L!=2&&($n(),ar(17)),wt(this),this.s=2,Tt(this)):zt(this,this.S-w)};function Tt(w){w.j.G==0||w.J||uG(w.j,w)}function wt(w){Xt(w);var I=w.M;I&&typeof I.ma=="function"&&I.ma(),w.M=null,Ve(w.U),w.g&&(I=w.g,w.g=null,I.abort(),I.ma())}function Ut(w,I){try{var X=w.j;if(X.G!=0&&(X.g==w||vn(X.h,w))){if(!w.K&&vn(X.h,w)&&X.G==3){try{var H=X.Da.g.parse(I)}catch{H=null}if(Array.isArray(H)&&H.length==3){var Ne=H;if(Ne[0]==0){e:if(!X.u){if(X.g)if(X.g.F+3e3Ne[2]&&X.F&&X.v==0&&!X.C&&(X.C=$(f(X.Za,X),6e3));if(1>=Jn(X.h)&&X.ca){try{X.ca()}catch{}X.ca=void 0}}else Tm(X,11)}else if((w.K||X.g==w)&&qw(X),!b(I))for(Ne=X.Da.g.parse(I),I=0;I=w.j:!1}function Jn(w){return w.h?1:w.g?w.g.size:0}function vn(w,I){return w.h?w.h==I:w.g?w.g.has(I):!1}function Lr(w,I){w.g?w.g.add(I):w.h=I}function Vs(w,I){w.h&&w.h==I?w.h=null:w.g&&w.g.has(I)&&w.g.delete(I)}Zn.prototype.cancel=function(){if(this.i=Xr(this),this.h)this.h.cancel(),this.h=null;else if(this.g&&this.g.size!==0){for(const w of this.g.values())w.cancel();this.g.clear()}};function Xr(w){if(w.h!=null)return w.i.concat(w.h.D);if(w.g!=null&&w.g.size!==0){let I=w.i;for(const X of w.g.values())I=I.concat(X.D);return I}return m(w.i)}function Kn(w){if(w.V&&typeof w.V=="function")return w.V();if(typeof Map<"u"&&w instanceof Map||typeof Set<"u"&&w instanceof Set)return Array.from(w.values());if(typeof w=="string")return w.split("");if(l(w)){for(var I=[],X=w.length,H=0;HI)throw Error("Bad port number "+I);w.s=I}else w.s=null}function iS(w,I,X){I instanceof Vl?(w.i=I,Xw(w.i,w.h)):(X||(I=Yf(I,q0)),w.i=new Vl(I,w.h))}function hr(w,I,X){w.i.set(I,X)}function pd(w){return hr(w,"zx",Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^Date.now()).toString(36)),w}function md(w,I){return w?I?decodeURI(w.replace(/%25/g,"%2525")):decodeURIComponent(w):""}function Yf(w,I,X){return typeof w=="string"?(w=encodeURI(w).replace(I,Nw),X&&(w=w.replace(/%25([0-9a-fA-F]{2})/g,"%$1")),w):null}function Nw(w){return w=w.charCodeAt(0),"%"+(w>>4&15).toString(16)+(w&15).toString(16)}var K0=/[#\/\?@]/g,ym=/[#\?:]/g,Lw=/[#\?]/g,q0=/[#\?@]/g,Bf=/#/g;function Vl(w,I){this.h=this.g=null,this.i=w||null,this.j=!!I}function yo(w){w.g||(w.g=new Map,w.h=0,w.i&&ha(w.i,function(I,X){w.add(decodeURIComponent(I.replace(/\+/g," ")),X)}))}t=Vl.prototype,t.add=function(w,I){yo(this),this.i=null,w=ec(this,w);var X=this.g.get(w);return X||this.g.set(w,X=[]),X.push(I),this.h+=1,this};function sS(w,I){yo(w),I=ec(w,I),w.g.has(I)&&(w.i=null,w.h-=w.g.get(I).length,w.g.delete(I))}function Hf(w,I){return yo(w),I=ec(w,I),w.g.has(I)}t.forEach=function(w,I){yo(this),this.g.forEach(function(X,H){X.forEach(function(Ne){w.call(I,Ne,H,this)},this)},this)},t.na=function(){yo(this);const w=Array.from(this.g.values()),I=Array.from(this.g.keys()),X=[];for(let H=0;H{H.abort(),iu(X,"TestPingServer: timeout",!1,I)},1e4);fetch(w,{signal:H.signal}).then(Je=>{clearTimeout(Ne),Je.ok?iu(X,"TestPingServer: ok",!0,I):iu(X,"TestPingServer: server error",!1,I)}).catch(()=>{clearTimeout(Ne),iu(X,"TestPingServer: error",!1,I)})}function iu(w,I,X,H,Ne){try{Ne&&(Ne.onload=null,Ne.onerror=null,Ne.onabort=null,Ne.ontimeout=null),H(X)}catch{}}function Bo(){this.g=new Ze}function oS(w,I,X){const H=X||"";try{fa(w,function(Ne,Je){let bt=Ne;u(Ne)&&(bt=Fe(Ne)),I.push(H+Je+"="+encodeURIComponent(bt))})}catch(Ne){throw I.push(H+"type="+encodeURIComponent("_badmap")),Ne}}function Sm(w){this.l=w.Ub||null,this.j=w.eb||!1}p(Sm,Re),Sm.prototype.g=function(){return new xm(this.l,this.j)},Sm.prototype.i=function(w){return function(){return w}}({});function xm(w,I){Ce.call(this),this.D=w,this.o=I,this.m=void 0,this.status=this.readyState=0,this.responseType=this.responseText=this.response=this.statusText="",this.onreadystatechange=null,this.u=new Headers,this.h=null,this.B="GET",this.A="",this.g=!1,this.v=this.j=this.l=null}p(xm,Ce),t=xm.prototype,t.open=function(w,I){if(this.readyState!=0)throw this.abort(),Error("Error reopening a connection");this.B=w,this.A=I,this.readyState=1,_f(this)},t.send=function(w){if(this.readyState!=1)throw this.abort(),Error("need to call open() first. ");this.g=!0;const I={headers:this.u,method:this.B,credentials:this.m,cache:void 0};w&&(I.body=w),(this.D||o).fetch(new Request(this.A,I)).then(this.Sa.bind(this),this.ga.bind(this))},t.abort=function(){this.response=this.responseText="",this.u=new Headers,this.status=0,this.j&&this.j.cancel("Request was aborted.").catch(()=>{}),1<=this.readyState&&this.g&&this.readyState!=4&&(this.g=!1,Qf(this)),this.readyState=0},t.Sa=function(w){if(this.g&&(this.l=w,this.h||(this.status=this.l.status,this.statusText=this.l.statusText,this.h=w.headers,this.readyState=2,_f(this)),this.g&&(this.readyState=3,_f(this),this.g)))if(this.responseType==="arraybuffer")w.arrayBuffer().then(this.Qa.bind(this),this.ga.bind(this));else if(typeof o.ReadableStream<"u"&&"body"in w){if(this.j=w.body.getReader(),this.o){if(this.responseType)throw Error('responseType must be empty for "streamBinaryChunks" mode responses.');this.response=[]}else this.response=this.responseText="",this.v=new TextDecoder;A0(this)}else w.text().then(this.Ra.bind(this),this.ga.bind(this))};function A0(w){w.j.read().then(w.Pa.bind(w)).catch(w.ga.bind(w))}t.Pa=function(w){if(this.g){if(this.o&&w.value)this.response.push(w.value);else if(!this.o){var I=w.value?w.value:new Uint8Array(0);(I=this.v.decode(I,{stream:!w.done}))&&(this.response=this.responseText+=I)}w.done?Qf(this):_f(this),this.readyState==3&&A0(this)}},t.Ra=function(w){this.g&&(this.response=this.responseText=w,Qf(this))},t.Qa=function(w){this.g&&(this.response=w,Qf(this))},t.ga=function(){this.g&&Qf(this)};function Qf(w){w.readyState=4,w.l=null,w.j=null,w.v=null,_f(w)}t.setRequestHeader=function(w,I){this.u.append(w,I)},t.getResponseHeader=function(w){return this.h&&this.h.get(w.toLowerCase())||""},t.getAllResponseHeaders=function(){if(!this.h)return"";const w=[],I=this.h.entries();for(var X=I.next();!X.done;)X=X.value,w.push(X[0]+": "+X[1]),X=I.next();return w.join(`\r +`+Je+" "+bt})}function Ue(w,I,X,H){w.info(function(){return"XMLHTTP TEXT ("+I+"): "+Dt(w,X)+(H?" "+H:"")})}function Pt(w,I){w.info(function(){return"TIMEOUT: "+I})}Ie.prototype.info=function(){};function Dt(w,I){if(!w.g)return I;if(!I)return null;try{var X=JSON.parse(I);if(X){for(w=0;wH.length)){var Ne=H[1];if(Array.isArray(Ne)&&!(1>Ne.length)){var Je=Ne[0];if(Je!="noop"&&Je!="stop"&&Je!="close")for(var bt=1;btma)&&(ma!=3||this.g&&(this.h.h||this.g.oa()||Kw(this.g)))){this.J||ma!=4||I==7||(I==8||0>=J0?$n(3):$n(2)),Xt(this);var X=this.g.Z();this.X=X;t:if(_e(this)){var H=Kw(this.g);w="";var Ne=H.length,Je=xi(this.g)==4;if(!this.h.i){if(typeof TextDecoder>"u"){wt(this),Tt(this);var bt="";break t}this.h.i=new o.TextDecoder}for(I=0;II.length?ot:(I=I.slice(H,H+X),w.C=H+X,I)))}Le.prototype.cancel=function(){this.J=!0,wt(this)};function dt(w){w.S=Date.now()+w.I,zt(w,w.I)}function zt(w,I){if(w.B!=null)throw Error("WatchDog timer not null");w.B=ee(f(w.ba,w),I)}function Xt(w){w.B&&(o.clearTimeout(w.B),w.B=null)}Le.prototype.ba=function(){this.B=null;const w=Date.now();0<=w-this.S?(Pt(this.i,this.A),this.L!=2&&($n(),ar(17)),wt(this),this.s=2,Tt(this)):zt(this,this.S-w)};function Tt(w){w.j.G==0||w.J||oG(w.j,w)}function wt(w){Xt(w);var I=w.M;I&&typeof I.ma=="function"&&I.ma(),w.M=null,Ve(w.U),w.g&&(I=w.g,w.g=null,I.abort(),I.ma())}function Ut(w,I){try{var X=w.j;if(X.G!=0&&(X.g==w||vn(X.h,w))){if(!w.K&&vn(X.h,w)&&X.G==3){try{var H=X.Da.g.parse(I)}catch{H=null}if(Array.isArray(H)&&H.length==3){var Ne=H;if(Ne[0]==0){e:if(!X.u){if(X.g)if(X.g.F+3e3Ne[2]&&X.F&&X.v==0&&!X.C&&(X.C=ee(f(X.Za,X),6e3));if(1>=Jn(X.h)&&X.ca){try{X.ca()}catch{}X.ca=void 0}}else Tm(X,11)}else if((w.K||X.g==w)&&qw(X),!b(I))for(Ne=X.Da.g.parse(I),I=0;I=w.j:!1}function Jn(w){return w.h?1:w.g?w.g.size:0}function vn(w,I){return w.h?w.h==I:w.g?w.g.has(I):!1}function Lr(w,I){w.g?w.g.add(I):w.h=I}function Vs(w,I){w.h&&w.h==I?w.h=null:w.g&&w.g.has(I)&&w.g.delete(I)}Zn.prototype.cancel=function(){if(this.i=Xr(this),this.h)this.h.cancel(),this.h=null;else if(this.g&&this.g.size!==0){for(const w of this.g.values())w.cancel();this.g.clear()}};function Xr(w){if(w.h!=null)return w.i.concat(w.h.D);if(w.g!=null&&w.g.size!==0){let I=w.i;for(const X of w.g.values())I=I.concat(X.D);return I}return m(w.i)}function Kn(w){if(w.V&&typeof w.V=="function")return w.V();if(typeof Map<"u"&&w instanceof Map||typeof Set<"u"&&w instanceof Set)return Array.from(w.values());if(typeof w=="string")return w.split("");if(l(w)){for(var I=[],X=w.length,H=0;HI)throw Error("Bad port number "+I);w.s=I}else w.s=null}function rS(w,I,X){I instanceof Vl?(w.i=I,Xw(w.i,w.h)):(X||(I=Yf(I,q0)),w.i=new Vl(I,w.h))}function hr(w,I,X){w.i.set(I,X)}function pd(w){return hr(w,"zx",Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^Date.now()).toString(36)),w}function md(w,I){return w?I?decodeURI(w.replace(/%25/g,"%2525")):decodeURIComponent(w):""}function Yf(w,I,X){return typeof w=="string"?(w=encodeURI(w).replace(I,Nw),X&&(w=w.replace(/%25([0-9a-fA-F]{2})/g,"%$1")),w):null}function Nw(w){return w=w.charCodeAt(0),"%"+(w>>4&15).toString(16)+(w&15).toString(16)}var K0=/[#\/\?@]/g,ym=/[#\?:]/g,Lw=/[#\?]/g,q0=/[#\?@]/g,Bf=/#/g;function Vl(w,I){this.h=this.g=null,this.i=w||null,this.j=!!I}function bo(w){w.g||(w.g=new Map,w.h=0,w.i&&ha(w.i,function(I,X){w.add(decodeURIComponent(I.replace(/\+/g," ")),X)}))}t=Vl.prototype,t.add=function(w,I){bo(this),this.i=null,w=ec(this,w);var X=this.g.get(w);return X||this.g.set(w,X=[]),X.push(I),this.h+=1,this};function iS(w,I){bo(w),I=ec(w,I),w.g.has(I)&&(w.i=null,w.h-=w.g.get(I).length,w.g.delete(I))}function Hf(w,I){return bo(w),I=ec(w,I),w.g.has(I)}t.forEach=function(w,I){bo(this),this.g.forEach(function(X,H){X.forEach(function(Ne){w.call(I,Ne,H,this)},this)},this)},t.na=function(){bo(this);const w=Array.from(this.g.values()),I=Array.from(this.g.keys()),X=[];for(let H=0;H{H.abort(),iu(X,"TestPingServer: timeout",!1,I)},1e4);fetch(w,{signal:H.signal}).then(Je=>{clearTimeout(Ne),Je.ok?iu(X,"TestPingServer: ok",!0,I):iu(X,"TestPingServer: server error",!1,I)}).catch(()=>{clearTimeout(Ne),iu(X,"TestPingServer: error",!1,I)})}function iu(w,I,X,H,Ne){try{Ne&&(Ne.onload=null,Ne.onerror=null,Ne.onabort=null,Ne.ontimeout=null),H(X)}catch{}}function Yo(){this.g=new Ze}function aS(w,I,X){const H=X||"";try{fa(w,function(Ne,Je){let bt=Ne;u(Ne)&&(bt=Fe(Ne)),I.push(H+Je+"="+encodeURIComponent(bt))})}catch(Ne){throw I.push(H+"type="+encodeURIComponent("_badmap")),Ne}}function Sm(w){this.l=w.Ub||null,this.j=w.eb||!1}p(Sm,Re),Sm.prototype.g=function(){return new xm(this.l,this.j)},Sm.prototype.i=function(w){return function(){return w}}({});function xm(w,I){Ce.call(this),this.D=w,this.o=I,this.m=void 0,this.status=this.readyState=0,this.responseType=this.responseText=this.response=this.statusText="",this.onreadystatechange=null,this.u=new Headers,this.h=null,this.B="GET",this.A="",this.g=!1,this.v=this.j=this.l=null}p(xm,Ce),t=xm.prototype,t.open=function(w,I){if(this.readyState!=0)throw this.abort(),Error("Error reopening a connection");this.B=w,this.A=I,this.readyState=1,_f(this)},t.send=function(w){if(this.readyState!=1)throw this.abort(),Error("need to call open() first. ");this.g=!0;const I={headers:this.u,method:this.B,credentials:this.m,cache:void 0};w&&(I.body=w),(this.D||o).fetch(new Request(this.A,I)).then(this.Sa.bind(this),this.ga.bind(this))},t.abort=function(){this.response=this.responseText="",this.u=new Headers,this.status=0,this.j&&this.j.cancel("Request was aborted.").catch(()=>{}),1<=this.readyState&&this.g&&this.readyState!=4&&(this.g=!1,Qf(this)),this.readyState=0},t.Sa=function(w){if(this.g&&(this.l=w,this.h||(this.status=this.l.status,this.statusText=this.l.statusText,this.h=w.headers,this.readyState=2,_f(this)),this.g&&(this.readyState=3,_f(this),this.g)))if(this.responseType==="arraybuffer")w.arrayBuffer().then(this.Qa.bind(this),this.ga.bind(this));else if(typeof o.ReadableStream<"u"&&"body"in w){if(this.j=w.body.getReader(),this.o){if(this.responseType)throw Error('responseType must be empty for "streamBinaryChunks" mode responses.');this.response=[]}else this.response=this.responseText="",this.v=new TextDecoder;A0(this)}else w.text().then(this.Ra.bind(this),this.ga.bind(this))};function A0(w){w.j.read().then(w.Pa.bind(w)).catch(w.ga.bind(w))}t.Pa=function(w){if(this.g){if(this.o&&w.value)this.response.push(w.value);else if(!this.o){var I=w.value?w.value:new Uint8Array(0);(I=this.v.decode(I,{stream:!w.done}))&&(this.response=this.responseText+=I)}w.done?Qf(this):_f(this),this.readyState==3&&A0(this)}},t.Ra=function(w){this.g&&(this.response=this.responseText=w,Qf(this))},t.Qa=function(w){this.g&&(this.response=w,Qf(this))},t.ga=function(){this.g&&Qf(this)};function Qf(w){w.readyState=4,w.l=null,w.j=null,w.v=null,_f(w)}t.setRequestHeader=function(w,I){this.u.append(w,I)},t.getResponseHeader=function(w){return this.h&&this.h.get(w.toLowerCase())||""},t.getAllResponseHeaders=function(){if(!this.h)return"";const w=[],I=this.h.entries();for(var X=I.next();!X.done;)X=X.value,w.push(X[0]+": "+X[1]),X=I.next();return w.join(`\r `)};function _f(w){w.onreadystatechange&&w.onreadystatechange.call(w)}Object.defineProperty(xm.prototype,"withCredentials",{get:function(){return this.m==="include"},set:function(w){this.m=w?"include":"same-origin"}});function $f(w){let I="";return M(w,function(X,H){I+=H,I+=":",I+=X,I+=`\r -`}),I}function vd(w,I,X){e:{for(H in X){var H=!1;break e}H=!0}H||(X=$f(X),typeof w=="string"?X!=null&&encodeURIComponent(String(X)):hr(w,I,X))}function or(w){Ce.call(this),this.headers=new Map,this.o=w||null,this.h=!1,this.v=this.g=null,this.D="",this.m=0,this.l="",this.j=this.B=this.u=this.A=!1,this.I=null,this.H="",this.J=!1}p(or,Ce);var Cw=/^https?$/i,lS=["POST","PUT"];t=or.prototype,t.Ha=function(w){this.J=w},t.ea=function(w,I,X,H){if(this.g)throw Error("[goog.net.XhrIo] Object is active with another request="+this.D+"; newUri="+w);I=I?I.toUpperCase():"GET",this.D=w,this.l="",this.m=0,this.A=!1,this.h=!0,this.g=this.o?this.o.g():ae.g(),this.v=this.o?Me(this.o):Me(ae),this.g.onreadystatechange=f(this.Ea,this);try{this.B=!0,this.g.open(I,String(w),!0),this.B=!1}catch(Je){G0(this,Je);return}if(w=X||"",X=new Map(this.headers),H)if(Object.getPrototypeOf(H)===Object.prototype)for(var Ne in H)X.set(Ne,H[Ne]);else if(typeof H.keys=="function"&&typeof H.get=="function")for(const Je of H.keys())X.set(Je,H.get(Je));else throw Error("Unknown input type for opt_headers: "+String(H));H=Array.from(X.keys()).find(Je=>Je.toLowerCase()=="content-type"),Ne=o.FormData&&w instanceof o.FormData,!(0<=Array.prototype.indexOf.call(lS,I,void 0))||H||Ne||X.set("Content-Type","application/x-www-form-urlencoded;charset=utf-8");for(const[Je,bt]of X)this.g.setRequestHeader(Je,bt);this.H&&(this.g.responseType=this.H),"withCredentials"in this.g&&this.g.withCredentials!==this.J&&(this.g.withCredentials=this.J);try{F0(this),this.u=!0,this.g.send(w),this.u=!1}catch(Je){G0(this,Je)}};function G0(w,I){w.h=!1,w.g&&(w.j=!0,w.g.abort(),w.j=!1),w.l=I,w.m=5,eh(w),tc(w)}function eh(w){w.A||(w.A=!0,Ae(w,"complete"),Ae(w,"error"))}t.abort=function(w){this.g&&this.h&&(this.h=!1,this.j=!0,this.g.abort(),this.j=!1,this.m=w||7,Ae(this,"complete"),Ae(this,"abort"),tc(this))},t.N=function(){this.g&&(this.h&&(this.h=!1,this.j=!0,this.g.abort(),this.j=!1),tc(this,!0)),or.aa.N.call(this)},t.Ea=function(){this.s||(this.B||this.u||this.j?uS(this):this.bb())},t.bb=function(){uS(this)};function uS(w){if(w.h&&typeof a<"u"&&(!w.v[1]||xi(w)!=4||w.Z()!=2)){if(w.u&&xi(w)==4)ue(w.Ea,0,w);else if(Ae(w,"readystatechange"),xi(w)==4){w.h=!1;try{const bt=w.Z();e:switch(bt){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var I=!0;break e;default:I=!1}var X;if(!(X=I)){var H;if(H=bt===0){var Ne=String(w.D).match(Rl)[1]||null;!Ne&&o.self&&o.self.location&&(Ne=o.self.location.protocol.slice(0,-1)),H=!Cw.test(Ne?Ne.toLowerCase():"")}X=H}if(X)Ae(w,"complete"),Ae(w,"success");else{w.m=6;try{var Je=2{}:null;w.g=null,w.v=null,I||Ae(w,"ready");try{X.onreadystatechange=H}catch{}}}function F0(w){w.I&&(o.clearTimeout(w.I),w.I=null)}t.isActive=function(){return!!this.g};function xi(w){return w.g?w.g.readyState:0}t.Z=function(){try{return 2=w.h.j-(w.s?1:0)?!1:w.s?(w.i=I.D.concat(w.i),!0):w.G==1||w.G==2||w.B>=(w.Va?0:w.Wa)?!1:(w.s=$(f(w.Ga,w,I),cG(w,w.B)),w.B++,!0)}t.Ga=function(w){if(this.s)if(this.s=null,this.G==1){if(!w){this.U=Math.floor(1e5*Math.random()),w=this.U++;const Ne=new Le(this,this.j,w);let Je=this.o;if(this.S&&(Je?(Je=S(Je),R(Je,this.S)):Je=this.S),this.m!==null||this.O||(Ne.H=Je,Je=null),this.P)e:{for(var I=0,X=0;Xer)Je=Math.max(0,Ne[js].g-100),Cr=!1;else try{oS(pa,bt,"req"+er+"_")}catch{H&&H(pa)}}if(Cr){H=bt.join("&");break e}}}return w=w.i.splice(0,X),I.D=w,H}function oG(w){if(!w.g&&!w.u){w.Y=1;var I=w.Fa;A||ne(),Z||(A(),Z=!0),j.add(I,w),w.v=0}}function Ez(w){return w.g||w.u||3<=w.v?!1:(w.Y++,w.u=$(f(w.Fa,w),cG(w,w.v)),w.v++,!0)}t.Fa=function(){if(this.u=null,lG(this),this.ba&&!(this.M||this.g==null||0>=this.R)){var w=2*this.R;this.j.info("BP detection timer enabled: "+w),this.A=$(f(this.ab,this),w)}},t.ab=function(){this.A&&(this.A=null,this.j.info("BP detection timeout reached."),this.j.info("Buffering proxy detected and switch to long-polling!"),this.F=!1,this.M=!0,ar(10),ds(this),lG(this))};function Mz(w){w.A!=null&&(o.clearTimeout(w.A),w.A=null)}function lG(w){w.g=new Le(w,w.j,"rpc",w.Y),w.m===null&&(w.g.H=w.o),w.g.O=0;var I=ru(w.qa);hr(I,"RID","rpc"),hr(I,"SID",w.K),hr(I,"AID",w.T),hr(I,"CI",w.F?"0":"1"),!w.F&&w.ja&&hr(I,"TO",w.ja),hr(I,"TYPE","xmlhttp"),hS(w,I),w.m&&w.o&&vd(I,w.m,w.o),w.L&&(w.g.I=w.L);var X=w.g;w=w.ia,X.L=1,X.v=pd(ru(I)),X.m=null,X.P=!0,$e(X,w)}t.Za=function(){this.C!=null&&(this.C=null,ds(this),Ez(this),ar(19))};function qw(w){w.C!=null&&(o.clearTimeout(w.C),w.C=null)}function uG(w,I){var X=null;if(w.g==I){qw(w),Mz(w),w.g=null;var H=2}else if(vn(w.h,I))X=I.D,Vs(w.h,I),H=1;else return;if(w.G!=0){if(I.o)if(H==1){X=I.m?I.m.length:0,I=Date.now()-I.F;var Ne=w.B;H=sr(),Ae(H,new Bi(H,X)),fs(w)}else oG(w);else if(Ne=I.s,Ne==3||Ne==0&&0Je.toLowerCase()=="content-type"),Ne=o.FormData&&w instanceof o.FormData,!(0<=Array.prototype.indexOf.call(oS,I,void 0))||H||Ne||X.set("Content-Type","application/x-www-form-urlencoded;charset=utf-8");for(const[Je,bt]of X)this.g.setRequestHeader(Je,bt);this.H&&(this.g.responseType=this.H),"withCredentials"in this.g&&this.g.withCredentials!==this.J&&(this.g.withCredentials=this.J);try{F0(this),this.u=!0,this.g.send(w),this.u=!1}catch(Je){G0(this,Je)}};function G0(w,I){w.h=!1,w.g&&(w.j=!0,w.g.abort(),w.j=!1),w.l=I,w.m=5,eh(w),tc(w)}function eh(w){w.A||(w.A=!0,Ae(w,"complete"),Ae(w,"error"))}t.abort=function(w){this.g&&this.h&&(this.h=!1,this.j=!0,this.g.abort(),this.j=!1,this.m=w||7,Ae(this,"complete"),Ae(this,"abort"),tc(this))},t.N=function(){this.g&&(this.h&&(this.h=!1,this.j=!0,this.g.abort(),this.j=!1),tc(this,!0)),or.aa.N.call(this)},t.Ea=function(){this.s||(this.B||this.u||this.j?lS(this):this.bb())},t.bb=function(){lS(this)};function lS(w){if(w.h&&typeof a<"u"&&(!w.v[1]||xi(w)!=4||w.Z()!=2)){if(w.u&&xi(w)==4)ce(w.Ea,0,w);else if(Ae(w,"readystatechange"),xi(w)==4){w.h=!1;try{const bt=w.Z();e:switch(bt){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var I=!0;break e;default:I=!1}var X;if(!(X=I)){var H;if(H=bt===0){var Ne=String(w.D).match(Rl)[1]||null;!Ne&&o.self&&o.self.location&&(Ne=o.self.location.protocol.slice(0,-1)),H=!Cw.test(Ne?Ne.toLowerCase():"")}X=H}if(X)Ae(w,"complete"),Ae(w,"success");else{w.m=6;try{var Je=2{}:null;w.g=null,w.v=null,I||Ae(w,"ready");try{X.onreadystatechange=H}catch{}}}function F0(w){w.I&&(o.clearTimeout(w.I),w.I=null)}t.isActive=function(){return!!this.g};function xi(w){return w.g?w.g.readyState:0}t.Z=function(){try{return 2=w.h.j-(w.s?1:0)?!1:w.s?(w.i=I.D.concat(w.i),!0):w.G==1||w.G==2||w.B>=(w.Va?0:w.Wa)?!1:(w.s=ee(f(w.Ga,w,I),lG(w,w.B)),w.B++,!0)}t.Ga=function(w){if(this.s)if(this.s=null,this.G==1){if(!w){this.U=Math.floor(1e5*Math.random()),w=this.U++;const Ne=new Le(this,this.j,w);let Je=this.o;if(this.S&&(Je?(Je=S(Je),R(Je,this.S)):Je=this.S),this.m!==null||this.O||(Ne.H=Je,Je=null),this.P)e:{for(var I=0,X=0;Xer)Je=Math.max(0,Ne[js].g-100),Cr=!1;else try{aS(pa,bt,"req"+er+"_")}catch{H&&H(pa)}}if(Cr){H=bt.join("&");break e}}}return w=w.i.splice(0,X),I.D=w,H}function sG(w){if(!w.g&&!w.u){w.Y=1;var I=w.Fa;A||ne(),J||(A(),J=!0),F.add(I,w),w.v=0}}function Ez(w){return w.g||w.u||3<=w.v?!1:(w.Y++,w.u=ee(f(w.Fa,w),lG(w,w.v)),w.v++,!0)}t.Fa=function(){if(this.u=null,aG(this),this.ba&&!(this.M||this.g==null||0>=this.R)){var w=2*this.R;this.j.info("BP detection timer enabled: "+w),this.A=ee(f(this.ab,this),w)}},t.ab=function(){this.A&&(this.A=null,this.j.info("BP detection timeout reached."),this.j.info("Buffering proxy detected and switch to long-polling!"),this.F=!1,this.M=!0,ar(10),ds(this),aG(this))};function Mz(w){w.A!=null&&(o.clearTimeout(w.A),w.A=null)}function aG(w){w.g=new Le(w,w.j,"rpc",w.Y),w.m===null&&(w.g.H=w.o),w.g.O=0;var I=ru(w.qa);hr(I,"RID","rpc"),hr(I,"SID",w.K),hr(I,"AID",w.T),hr(I,"CI",w.F?"0":"1"),!w.F&&w.ja&&hr(I,"TO",w.ja),hr(I,"TYPE","xmlhttp"),fS(w,I),w.m&&w.o&&vd(I,w.m,w.o),w.L&&(w.g.I=w.L);var X=w.g;w=w.ia,X.L=1,X.v=pd(ru(I)),X.m=null,X.P=!0,$e(X,w)}t.Za=function(){this.C!=null&&(this.C=null,ds(this),Ez(this),ar(19))};function qw(w){w.C!=null&&(o.clearTimeout(w.C),w.C=null)}function oG(w,I){var X=null;if(w.g==I){qw(w),Mz(w),w.g=null;var H=2}else if(vn(w.h,I))X=I.D,Vs(w.h,I),H=1;else return;if(w.G!=0){if(I.o)if(H==1){X=I.m?I.m.length:0,I=Date.now()-I.F;var Ne=w.B;H=sr(),Ae(H,new Bi(H,X)),fs(w)}else sG(w);else if(Ne=I.s,Ne==3||Ne==0&&0n(Ea.UNAUTHENTICATED))}shutdown(){}}class Gyt{constructor(e){this.token=e,this.changeListener=null}getToken(){return Promise.resolve(this.token)}invalidateToken(){}start(e,n){this.changeListener=n,e.enqueueRetryable(()=>n(this.token.user))}shutdown(){this.changeListener=null}}class Fyt{constructor(e){this.t=e,this.currentUser=Ea.UNAUTHENTICATED,this.i=0,this.forceRefresh=!1,this.auth=null}start(e,n){Pr(this.o===void 0);let r=this.i;const i=l=>this.i!==r?(r=this.i,n(l)):Promise.resolve();let s=new Tp;this.o=()=>{this.i++,this.currentUser=this.u(),s.resolve(),s=new Tp,e.enqueueRetryable(()=>i(this.currentUser))};const a=()=>{const l=s;e.enqueueRetryable(async()=>{await l.promise,await i(this.currentUser)})},o=l=>{It("FirebaseAuthCredentialsProvider","Auth detected"),this.auth=l,this.o&&(this.auth.addAuthTokenListener(this.o),a())};this.t.onInit(l=>o(l)),setTimeout(()=>{if(!this.auth){const l=this.t.getImmediate({optional:!0});l?o(l):(It("FirebaseAuthCredentialsProvider","Auth not yet detected"),s.resolve(),s=new Tp)}},0),a()}getToken(){const e=this.i,n=this.forceRefresh;return this.forceRefresh=!1,this.auth?this.auth.getToken(n).then(r=>this.i!==e?(It("FirebaseAuthCredentialsProvider","getToken aborted due to token change."),this.getToken()):r?(Pr(typeof r.accessToken=="string"),new _ge(r.accessToken,this.currentUser)):null):Promise.resolve(null)}invalidateToken(){this.forceRefresh=!0}shutdown(){this.auth&&this.o&&this.auth.removeAuthTokenListener(this.o),this.o=void 0}u(){const e=this.auth&&this.auth.getUid();return Pr(e===null||typeof e=="string"),new Ea(e)}}class jyt{constructor(e,n,r){this.l=e,this.h=n,this.P=r,this.type="FirstParty",this.user=Ea.FIRST_PARTY,this.I=new Map}T(){return this.P?this.P():null}get headers(){this.I.set("X-Goog-AuthUser",this.l);const e=this.T();return e&&this.I.set("Authorization",e),this.h&&this.I.set("X-Goog-Iam-Authorization-Token",this.h),this.I}}class Zyt{constructor(e,n,r){this.l=e,this.h=n,this.P=r}getToken(){return Promise.resolve(new jyt(this.l,this.h,this.P))}start(e,n){e.enqueueRetryable(()=>n(Ea.FIRST_PARTY))}shutdown(){}invalidateToken(){}}class Jyt{constructor(e){this.value=e,this.type="AppCheck",this.headers=new Map,e&&e.length>0&&this.headers.set("x-firebase-appcheck",this.value)}}class Yyt{constructor(e){this.A=e,this.forceRefresh=!1,this.appCheck=null,this.R=null}start(e,n){Pr(this.o===void 0);const r=s=>{s.error!=null&&It("FirebaseAppCheckTokenProvider",`Error getting App Check token; using placeholder token instead. Error: ${s.error.message}`);const a=s.token!==this.R;return this.R=s.token,It("FirebaseAppCheckTokenProvider",`Received ${a?"new":"existing"} token.`),a?n(s.token):Promise.resolve()};this.o=s=>{e.enqueueRetryable(()=>r(s))};const i=s=>{It("FirebaseAppCheckTokenProvider","AppCheck detected"),this.appCheck=s,this.o&&this.appCheck.addTokenListener(this.o)};this.A.onInit(s=>i(s)),setTimeout(()=>{if(!this.appCheck){const s=this.A.getImmediate({optional:!0});s?i(s):It("FirebaseAppCheckTokenProvider","AppCheck not yet detected")}},0)}getToken(){const e=this.forceRefresh;return this.forceRefresh=!1,this.appCheck?this.appCheck.getToken(e).then(n=>n?(Pr(typeof n.token=="string"),this.R=n.token,new Jyt(n.token)):null):Promise.resolve(null)}invalidateToken(){this.forceRefresh=!0}shutdown(){this.appCheck&&this.o&&this.appCheck.removeTokenListener(this.o),this.o=void 0}}/** + */class Qge{constructor(e,n){this.user=n,this.type="OAuth",this.headers=new Map,this.headers.set("Authorization",`Bearer ${e}`)}}class Gyt{getToken(){return Promise.resolve(null)}invalidateToken(){}start(e,n){e.enqueueRetryable(()=>n(Ea.UNAUTHENTICATED))}shutdown(){}}class Fyt{constructor(e){this.token=e,this.changeListener=null}getToken(){return Promise.resolve(this.token)}invalidateToken(){}start(e,n){this.changeListener=n,e.enqueueRetryable(()=>n(this.token.user))}shutdown(){this.changeListener=null}}class jyt{constructor(e){this.t=e,this.currentUser=Ea.UNAUTHENTICATED,this.i=0,this.forceRefresh=!1,this.auth=null}start(e,n){Pr(this.o===void 0);let r=this.i;const i=l=>this.i!==r?(r=this.i,n(l)):Promise.resolve();let s=new Tp;this.o=()=>{this.i++,this.currentUser=this.u(),s.resolve(),s=new Tp,e.enqueueRetryable(()=>i(this.currentUser))};const a=()=>{const l=s;e.enqueueRetryable(async()=>{await l.promise,await i(this.currentUser)})},o=l=>{It("FirebaseAuthCredentialsProvider","Auth detected"),this.auth=l,this.o&&(this.auth.addAuthTokenListener(this.o),a())};this.t.onInit(l=>o(l)),setTimeout(()=>{if(!this.auth){const l=this.t.getImmediate({optional:!0});l?o(l):(It("FirebaseAuthCredentialsProvider","Auth not yet detected"),s.resolve(),s=new Tp)}},0),a()}getToken(){const e=this.i,n=this.forceRefresh;return this.forceRefresh=!1,this.auth?this.auth.getToken(n).then(r=>this.i!==e?(It("FirebaseAuthCredentialsProvider","getToken aborted due to token change."),this.getToken()):r?(Pr(typeof r.accessToken=="string"),new Qge(r.accessToken,this.currentUser)):null):Promise.resolve(null)}invalidateToken(){this.forceRefresh=!0}shutdown(){this.auth&&this.o&&this.auth.removeAuthTokenListener(this.o),this.o=void 0}u(){const e=this.auth&&this.auth.getUid();return Pr(e===null||typeof e=="string"),new Ea(e)}}class Zyt{constructor(e,n,r){this.l=e,this.h=n,this.P=r,this.type="FirstParty",this.user=Ea.FIRST_PARTY,this.I=new Map}T(){return this.P?this.P():null}get headers(){this.I.set("X-Goog-AuthUser",this.l);const e=this.T();return e&&this.I.set("Authorization",e),this.h&&this.I.set("X-Goog-Iam-Authorization-Token",this.h),this.I}}class Jyt{constructor(e,n,r){this.l=e,this.h=n,this.P=r}getToken(){return Promise.resolve(new Zyt(this.l,this.h,this.P))}start(e,n){e.enqueueRetryable(()=>n(Ea.FIRST_PARTY))}shutdown(){}invalidateToken(){}}class Yyt{constructor(e){this.value=e,this.type="AppCheck",this.headers=new Map,e&&e.length>0&&this.headers.set("x-firebase-appcheck",this.value)}}class Byt{constructor(e){this.A=e,this.forceRefresh=!1,this.appCheck=null,this.R=null}start(e,n){Pr(this.o===void 0);const r=s=>{s.error!=null&&It("FirebaseAppCheckTokenProvider",`Error getting App Check token; using placeholder token instead. Error: ${s.error.message}`);const a=s.token!==this.R;return this.R=s.token,It("FirebaseAppCheckTokenProvider",`Received ${a?"new":"existing"} token.`),a?n(s.token):Promise.resolve()};this.o=s=>{e.enqueueRetryable(()=>r(s))};const i=s=>{It("FirebaseAppCheckTokenProvider","AppCheck detected"),this.appCheck=s,this.o&&this.appCheck.addTokenListener(this.o)};this.A.onInit(s=>i(s)),setTimeout(()=>{if(!this.appCheck){const s=this.A.getImmediate({optional:!0});s?i(s):It("FirebaseAppCheckTokenProvider","AppCheck not yet detected")}},0)}getToken(){const e=this.forceRefresh;return this.forceRefresh=!1,this.appCheck?this.appCheck.getToken(e).then(n=>n?(Pr(typeof n.token=="string"),this.R=n.token,new Yyt(n.token)):null):Promise.resolve(null)}invalidateToken(){this.forceRefresh=!0}shutdown(){this.appCheck&&this.o&&this.appCheck.removeTokenListener(this.o),this.o=void 0}}/** * @license * Copyright 2020 Google LLC * @@ -8131,7 +8131,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Byt(t){const e=typeof self<"u"&&(self.crypto||self.msCrypto),n=new Uint8Array(t);if(e&&typeof e.getRandomValues=="function")e.getRandomValues(n);else for(let r=0;re?1:0}function qb(t,e,n){return t.length===e.length&&t.every((r,i)=>n(r,e[i]))}/** + */class _ge{static newId(){const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=Math.floor(256/e.length)*e.length;let r="";for(;r.length<20;){const i=Hyt(40);for(let s=0;se?1:0}function qb(t,e,n){return t.length===e.length&&t.every((r,i)=>n(r,e[i]))}/** * @license * Copyright 2017 Google LLC * @@ -8191,7 +8191,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class K6{constructor(e,n,r){n===void 0?n=0:n>e.length&&_t(),r===void 0?r=e.length-n:r>e.length-n&&_t(),this.segments=e,this.offset=n,this.len=r}get length(){return this.len}isEqual(e){return K6.comparator(this,e)===0}child(e){const n=this.segments.slice(this.offset,this.limit());return e instanceof K6?e.forEach(r=>{n.push(r)}):n.push(e),this.construct(n)}limit(){return this.offset+this.length}popFirst(e){return e=e===void 0?1:e,this.construct(this.segments,this.offset+e,this.length-e)}popLast(){return this.construct(this.segments,this.offset,this.length-1)}firstSegment(){return this.segments[this.offset]}lastSegment(){return this.get(this.length-1)}get(e){return this.segments[this.offset+e]}isEmpty(){return this.length===0}isPrefixOf(e){if(e.lengtha)return 1}return e.lengthn.length?1:0}}class ii extends K6{construct(e,n,r){return new ii(e,n,r)}canonicalString(){return this.toArray().join("/")}toString(){return this.canonicalString()}toUriEncodedString(){return this.toArray().map(encodeURIComponent).join("/")}static fromString(...e){const n=[];for(const r of e){if(r.indexOf("//")>=0)throw new Et(nt.INVALID_ARGUMENT,`Invalid segment (${r}). Paths must not contain // in them.`);n.push(...r.split("/").filter(i=>i.length>0))}return new ii(n)}static emptyPath(){return new ii([])}}const Hyt=/^[_a-zA-Z][_a-zA-Z0-9]*$/;class ta extends K6{construct(e,n,r){return new ta(e,n,r)}static isValidIdentifier(e){return Hyt.test(e)}canonicalString(){return this.toArray().map(e=>(e=e.replace(/\\/g,"\\\\").replace(/`/g,"\\`"),ta.isValidIdentifier(e)||(e="`"+e+"`"),e)).join(".")}toString(){return this.canonicalString()}isKeyField(){return this.length===1&&this.get(0)==="__name__"}static keyField(){return new ta(["__name__"])}static fromServerFormat(e){const n=[];let r="",i=0;const s=()=>{if(r.length===0)throw new Et(nt.INVALID_ARGUMENT,`Invalid field path (${e}). Paths must not be empty, begin with '.', end with '.', or contain '..'`);n.push(r),r=""};let a=!1;for(;ie.length&&_t(),r===void 0?r=e.length-n:r>e.length-n&&_t(),this.segments=e,this.offset=n,this.len=r}get length(){return this.len}isEqual(e){return C6.comparator(this,e)===0}child(e){const n=this.segments.slice(this.offset,this.limit());return e instanceof C6?e.forEach(r=>{n.push(r)}):n.push(e),this.construct(n)}limit(){return this.offset+this.length}popFirst(e){return e=e===void 0?1:e,this.construct(this.segments,this.offset+e,this.length-e)}popLast(){return this.construct(this.segments,this.offset,this.length-1)}firstSegment(){return this.segments[this.offset]}lastSegment(){return this.get(this.length-1)}get(e){return this.segments[this.offset+e]}isEmpty(){return this.length===0}isPrefixOf(e){if(e.lengtha)return 1}return e.lengthn.length?1:0}}class ii extends C6{construct(e,n,r){return new ii(e,n,r)}canonicalString(){return this.toArray().join("/")}toString(){return this.canonicalString()}toUriEncodedString(){return this.toArray().map(encodeURIComponent).join("/")}static fromString(...e){const n=[];for(const r of e){if(r.indexOf("//")>=0)throw new Et(nt.INVALID_ARGUMENT,`Invalid segment (${r}). Paths must not contain // in them.`);n.push(...r.split("/").filter(i=>i.length>0))}return new ii(n)}static emptyPath(){return new ii([])}}const Qyt=/^[_a-zA-Z][_a-zA-Z0-9]*$/;class ta extends C6{construct(e,n,r){return new ta(e,n,r)}static isValidIdentifier(e){return Qyt.test(e)}canonicalString(){return this.toArray().map(e=>(e=e.replace(/\\/g,"\\\\").replace(/`/g,"\\`"),ta.isValidIdentifier(e)||(e="`"+e+"`"),e)).join(".")}toString(){return this.canonicalString()}isKeyField(){return this.length===1&&this.get(0)==="__name__"}static keyField(){return new ta(["__name__"])}static fromServerFormat(e){const n=[];let r="",i=0;const s=()=>{if(r.length===0)throw new Et(nt.INVALID_ARGUMENT,`Invalid field path (${e}). Paths must not be empty, begin with '.', end with '.', or contain '..'`);n.push(r),r=""};let a=!1;for(;i=2&&this.path.get(this.path.length-2)===e}getCollectionGroup(){return this.path.get(this.path.length-2)}getCollectionPath(){return this.path.popLast()}isEqual(e){return e!==null&&ii.comparator(this.path,e.path)===0}toString(){return this.path.toString()}static comparator(e,n){return ii.comparator(e.path,n.path)}static isDocumentKey(e){return e.length%2==0}static fromSegments(e){return new Ft(new ii(e.slice()))}}function Qyt(t,e){const n=t.toTimestamp().seconds,r=t.toTimestamp().nanoseconds+1,i=sn.fromTimestamp(r===1e9?new Es(n+1,0):new Es(n,r));return new Gp(i,Ft.empty(),e)}function _yt(t){return new Gp(t.readTime,t.key,-1)}class Gp{constructor(e,n,r){this.readTime=e,this.documentKey=n,this.largestBatchId=r}static min(){return new Gp(sn.min(),Ft.empty(),-1)}static max(){return new Gp(sn.max(),Ft.empty(),-1)}}function $yt(t,e){let n=t.readTime.compareTo(e.readTime);return n!==0?n:(n=Ft.comparator(t.documentKey,e.documentKey),n!==0?n:rr(t.largestBatchId,e.largestBatchId))}/** + */class Ft{constructor(e){this.path=e}static fromPath(e){return new Ft(ii.fromString(e))}static fromName(e){return new Ft(ii.fromString(e).popFirst(5))}static empty(){return new Ft(ii.emptyPath())}get collectionGroup(){return this.path.popLast().lastSegment()}hasCollectionId(e){return this.path.length>=2&&this.path.get(this.path.length-2)===e}getCollectionGroup(){return this.path.get(this.path.length-2)}getCollectionPath(){return this.path.popLast()}isEqual(e){return e!==null&&ii.comparator(this.path,e.path)===0}toString(){return this.path.toString()}static comparator(e,n){return ii.comparator(e.path,n.path)}static isDocumentKey(e){return e.length%2==0}static fromSegments(e){return new Ft(new ii(e.slice()))}}function _yt(t,e){const n=t.toTimestamp().seconds,r=t.toTimestamp().nanoseconds+1,i=sn.fromTimestamp(r===1e9?new Es(n+1,0):new Es(n,r));return new Gp(i,Ft.empty(),e)}function $yt(t){return new Gp(t.readTime,t.key,-1)}class Gp{constructor(e,n,r){this.readTime=e,this.documentKey=n,this.largestBatchId=r}static min(){return new Gp(sn.min(),Ft.empty(),-1)}static max(){return new Gp(sn.max(),Ft.empty(),-1)}}function eSt(t,e){let n=t.readTime.compareTo(e.readTime);return n!==0?n:(n=Ft.comparator(t.documentKey,e.documentKey),n!==0?n:rr(t.largestBatchId,e.largestBatchId))}/** * @license * Copyright 2020 Google LLC * @@ -8221,7 +8221,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const eSt="The current tab is not in the required state to perform this operation. It might be necessary to refresh the browser tab.";class tSt{constructor(){this.onCommittedListeners=[]}addOnCommittedListener(e){this.onCommittedListeners.push(e)}raiseOnCommittedEvent(){this.onCommittedListeners.forEach(e=>e())}}/** + */const tSt="The current tab is not in the required state to perform this operation. It might be necessary to refresh the browser tab.";class nSt{constructor(){this.onCommittedListeners=[]}addOnCommittedListener(e){this.onCommittedListeners.push(e)}raiseOnCommittedEvent(){this.onCommittedListeners.forEach(e=>e())}}/** * @license * Copyright 2017 Google LLC * @@ -8236,7 +8236,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function dw(t){if(t.code!==nt.FAILED_PRECONDITION||t.message!==eSt)throw t;It("LocalStore","Unexpectedly lost primary lease")}/** + */async function dw(t){if(t.code!==nt.FAILED_PRECONDITION||t.message!==tSt)throw t;It("LocalStore","Unexpectedly lost primary lease")}/** * @license * Copyright 2017 Google LLC * @@ -8251,7 +8251,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class at{constructor(e){this.nextCallback=null,this.catchCallback=null,this.result=void 0,this.error=void 0,this.isDone=!1,this.callbackAttached=!1,e(n=>{this.isDone=!0,this.result=n,this.nextCallback&&this.nextCallback(n)},n=>{this.isDone=!0,this.error=n,this.catchCallback&&this.catchCallback(n)})}catch(e){return this.next(void 0,e)}next(e,n){return this.callbackAttached&&_t(),this.callbackAttached=!0,this.isDone?this.error?this.wrapFailure(n,this.error):this.wrapSuccess(e,this.result):new at((r,i)=>{this.nextCallback=s=>{this.wrapSuccess(e,s).next(r,i)},this.catchCallback=s=>{this.wrapFailure(n,s).next(r,i)}})}toPromise(){return new Promise((e,n)=>{this.next(e,n)})}wrapUserFunction(e){try{const n=e();return n instanceof at?n:at.resolve(n)}catch(n){return at.reject(n)}}wrapSuccess(e,n){return e?this.wrapUserFunction(()=>e(n)):at.resolve(n)}wrapFailure(e,n){return e?this.wrapUserFunction(()=>e(n)):at.reject(n)}static resolve(e){return new at((n,r)=>{n(e)})}static reject(e){return new at((n,r)=>{r(e)})}static waitFor(e){return new at((n,r)=>{let i=0,s=0,a=!1;e.forEach(o=>{++i,o.next(()=>{++s,a&&s===i&&n()},l=>r(l))}),a=!0,s===i&&n()})}static or(e){let n=at.resolve(!1);for(const r of e)n=n.next(i=>i?at.resolve(i):r());return n}static forEach(e,n){const r=[];return e.forEach((i,s)=>{r.push(n.call(this,i,s))}),this.waitFor(r)}static mapArray(e,n){return new at((r,i)=>{const s=e.length,a=new Array(s);let o=0;for(let l=0;l{a[u]=c,++o,o===s&&r(a)},c=>i(c))}})}static doWhile(e,n){return new at((r,i)=>{const s=()=>{e()===!0?n().next(()=>{s()},i):r()};s()})}}function nSt(t){const e=t.match(/Android ([\d.]+)/i),n=e?e[1].split(".").slice(0,2).join("."):"-1";return Number(n)}function fw(t){return t.name==="IndexedDbTransactionError"}/** + */class at{constructor(e){this.nextCallback=null,this.catchCallback=null,this.result=void 0,this.error=void 0,this.isDone=!1,this.callbackAttached=!1,e(n=>{this.isDone=!0,this.result=n,this.nextCallback&&this.nextCallback(n)},n=>{this.isDone=!0,this.error=n,this.catchCallback&&this.catchCallback(n)})}catch(e){return this.next(void 0,e)}next(e,n){return this.callbackAttached&&_t(),this.callbackAttached=!0,this.isDone?this.error?this.wrapFailure(n,this.error):this.wrapSuccess(e,this.result):new at((r,i)=>{this.nextCallback=s=>{this.wrapSuccess(e,s).next(r,i)},this.catchCallback=s=>{this.wrapFailure(n,s).next(r,i)}})}toPromise(){return new Promise((e,n)=>{this.next(e,n)})}wrapUserFunction(e){try{const n=e();return n instanceof at?n:at.resolve(n)}catch(n){return at.reject(n)}}wrapSuccess(e,n){return e?this.wrapUserFunction(()=>e(n)):at.resolve(n)}wrapFailure(e,n){return e?this.wrapUserFunction(()=>e(n)):at.reject(n)}static resolve(e){return new at((n,r)=>{n(e)})}static reject(e){return new at((n,r)=>{r(e)})}static waitFor(e){return new at((n,r)=>{let i=0,s=0,a=!1;e.forEach(o=>{++i,o.next(()=>{++s,a&&s===i&&n()},l=>r(l))}),a=!0,s===i&&n()})}static or(e){let n=at.resolve(!1);for(const r of e)n=n.next(i=>i?at.resolve(i):r());return n}static forEach(e,n){const r=[];return e.forEach((i,s)=>{r.push(n.call(this,i,s))}),this.waitFor(r)}static mapArray(e,n){return new at((r,i)=>{const s=e.length,a=new Array(s);let o=0;for(let l=0;l{a[u]=c,++o,o===s&&r(a)},c=>i(c))}})}static doWhile(e,n){return new at((r,i)=>{const s=()=>{e()===!0?n().next(()=>{s()},i):r()};s()})}}function rSt(t){const e=t.match(/Android ([\d.]+)/i),n=e?e[1].split(".").slice(0,2).join("."):"-1";return Number(n)}function fw(t){return t.name==="IndexedDbTransactionError"}/** * @license * Copyright 2018 Google LLC * @@ -8266,7 +8266,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class SW{constructor(e,n){this.previousValue=e,n&&(n.sequenceNumberHandler=r=>this.ie(r),this.se=r=>n.writeSequenceNumber(r))}ie(e){return this.previousValue=Math.max(e,this.previousValue),this.previousValue}next(){const e=++this.previousValue;return this.se&&this.se(e),e}}SW.oe=-1;function L9(t){return t==null}function HP(t){return t===0&&1/t==-1/0}function rSt(t){return typeof t=="number"&&Number.isInteger(t)&&!HP(t)&&t<=Number.MAX_SAFE_INTEGER&&t>=Number.MIN_SAFE_INTEGER}/** + */class xW{constructor(e,n){this.previousValue=e,n&&(n.sequenceNumberHandler=r=>this.ie(r),this.se=r=>n.writeSequenceNumber(r))}ie(e){return this.previousValue=Math.max(e,this.previousValue),this.previousValue}next(){const e=++this.previousValue;return this.se&&this.se(e),e}}xW.oe=-1;function L9(t){return t==null}function BP(t){return t===0&&1/t==-1/0}function iSt(t){return typeof t=="number"&&Number.isInteger(t)&&!BP(t)&&t<=Number.MAX_SAFE_INTEGER&&t>=Number.MIN_SAFE_INTEGER}/** * @license * Copyright 2017 Google LLC * @@ -8281,7 +8281,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function lee(t){let e=0;for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&e++;return e}function L0(t,e){for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&e(n,t[n])}function e1e(t){for(const e in t)if(Object.prototype.hasOwnProperty.call(t,e))return!1;return!0}/** + */function aee(t){let e=0;for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&e++;return e}function L0(t,e){for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&e(n,t[n])}function $ge(t){for(const e in t)if(Object.prototype.hasOwnProperty.call(t,e))return!1;return!0}/** * @license * Copyright 2017 Google LLC * @@ -8311,7 +8311,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class aa{constructor(e){this.comparator=e,this.data=new Ri(this.comparator)}has(e){return this.data.get(e)!==null}first(){return this.data.minKey()}last(){return this.data.maxKey()}get size(){return this.data.size}indexOf(e){return this.data.indexOf(e)}forEach(e){this.data.inorderTraversal((n,r)=>(e(n),!1))}forEachInRange(e,n){const r=this.data.getIteratorFrom(e[0]);for(;r.hasNext();){const i=r.getNext();if(this.comparator(i.key,e[1])>=0)return;n(i.key)}}forEachWhile(e,n){let r;for(r=n!==void 0?this.data.getIteratorFrom(n):this.data.getIterator();r.hasNext();)if(!e(r.getNext().key))return}firstAfterOrEqual(e){const n=this.data.getIteratorFrom(e);return n.hasNext()?n.getNext().key:null}getIterator(){return new uee(this.data.getIterator())}getIteratorFrom(e){return new uee(this.data.getIteratorFrom(e))}add(e){return this.copy(this.data.remove(e).insert(e,!0))}delete(e){return this.has(e)?this.copy(this.data.remove(e)):this}isEmpty(){return this.data.isEmpty()}unionWith(e){let n=this;return n.size{n=n.add(r)}),n}isEqual(e){if(!(e instanceof aa)||this.size!==e.size)return!1;const n=this.data.getIterator(),r=e.data.getIterator();for(;n.hasNext();){const i=n.getNext().key,s=r.getNext().key;if(this.comparator(i,s)!==0)return!1}return!0}toArray(){const e=[];return this.forEach(n=>{e.push(n)}),e}toString(){const e=[];return this.forEach(n=>e.push(n)),"SortedSet("+e.toString()+")"}copy(e){const n=new aa(this.comparator);return n.data=e,n}}class uee{constructor(e){this.iter=e}getNext(){return this.iter.getNext().key}hasNext(){return this.iter.hasNext()}}/** + */class aa{constructor(e){this.comparator=e,this.data=new Ri(this.comparator)}has(e){return this.data.get(e)!==null}first(){return this.data.minKey()}last(){return this.data.maxKey()}get size(){return this.data.size}indexOf(e){return this.data.indexOf(e)}forEach(e){this.data.inorderTraversal((n,r)=>(e(n),!1))}forEachInRange(e,n){const r=this.data.getIteratorFrom(e[0]);for(;r.hasNext();){const i=r.getNext();if(this.comparator(i.key,e[1])>=0)return;n(i.key)}}forEachWhile(e,n){let r;for(r=n!==void 0?this.data.getIteratorFrom(n):this.data.getIterator();r.hasNext();)if(!e(r.getNext().key))return}firstAfterOrEqual(e){const n=this.data.getIteratorFrom(e);return n.hasNext()?n.getNext().key:null}getIterator(){return new oee(this.data.getIterator())}getIteratorFrom(e){return new oee(this.data.getIteratorFrom(e))}add(e){return this.copy(this.data.remove(e).insert(e,!0))}delete(e){return this.has(e)?this.copy(this.data.remove(e)):this}isEmpty(){return this.data.isEmpty()}unionWith(e){let n=this;return n.size{n=n.add(r)}),n}isEqual(e){if(!(e instanceof aa)||this.size!==e.size)return!1;const n=this.data.getIterator(),r=e.data.getIterator();for(;n.hasNext();){const i=n.getNext().key,s=r.getNext().key;if(this.comparator(i,s)!==0)return!1}return!0}toArray(){const e=[];return this.forEach(n=>{e.push(n)}),e}toString(){const e=[];return this.forEach(n=>e.push(n)),"SortedSet("+e.toString()+")"}copy(e){const n=new aa(this.comparator);return n.data=e,n}}class oee{constructor(e){this.iter=e}getNext(){return this.iter.getNext().key}hasNext(){return this.iter.hasNext()}}/** * @license * Copyright 2020 Google LLC * @@ -8326,7 +8326,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class ul{constructor(e){this.fields=e,e.sort(ta.comparator)}static empty(){return new ul([])}unionWith(e){let n=new aa(ta.comparator);for(const r of this.fields)n=n.add(r);for(const r of e)n=n.add(r);return new ul(n.toArray())}covers(e){for(const n of this.fields)if(n.isPrefixOf(e))return!0;return!1}isEqual(e){return qb(this.fields,e.fields,(n,r)=>n.isEqual(r))}}/** + */class ll{constructor(e){this.fields=e,e.sort(ta.comparator)}static empty(){return new ll([])}unionWith(e){let n=new aa(ta.comparator);for(const r of this.fields)n=n.add(r);for(const r of e)n=n.add(r);return new ll(n.toArray())}covers(e){for(const n of this.fields)if(n.isPrefixOf(e))return!0;return!1}isEqual(e){return qb(this.fields,e.fields,(n,r)=>n.isEqual(r))}}/** * @license * Copyright 2023 Google LLC * @@ -8341,7 +8341,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class t1e extends Error{constructor(){super(...arguments),this.name="Base64DecodeError"}}/** + */class e1e extends Error{constructor(){super(...arguments),this.name="Base64DecodeError"}}/** * @license * Copyright 2020 Google LLC * @@ -8356,7 +8356,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class ua{constructor(e){this.binaryString=e}static fromBase64String(e){const n=function(i){try{return atob(i)}catch(s){throw typeof DOMException<"u"&&s instanceof DOMException?new t1e("Invalid base64 string: "+s):s}}(e);return new ua(n)}static fromUint8Array(e){const n=function(i){let s="";for(let a=0;aeeid(n,e))!==void 0}function Db(t,e){if(t===e)return 0;const n=$v(t),r=$v(e);if(n!==r)return rr(n,r);switch(n){case 0:case 9007199254740991:return 0;case 1:return rr(t.booleanValue,e.booleanValue);case 2:return function(s,a){const o=Gi(s.integerValue||s.doubleValue),l=Gi(a.integerValue||a.doubleValue);return ol?1:o===l?0:isNaN(o)?isNaN(l)?0:-1:1}(t,e);case 3:return cee(t.timestampValue,e.timestampValue);case 4:return cee(q6(t),q6(e));case 5:return rr(t.stringValue,e.stringValue);case 6:return function(s,a){const o=_v(s),l=_v(a);return o.compareTo(l)}(t.bytesValue,e.bytesValue);case 7:return function(s,a){const o=s.split("/"),l=a.split("/");for(let u=0;ue.mapValue.fields[n]=Sx(r)),e}if(t.arrayValue){const e={arrayValue:{values:[]}};for(let n=0;n<(t.arrayValue.values||[]).length;++n)e.arrayValue.values[n]=Sx(t.arrayValue.values[n]);return e}return Object.assign({},t)}function oSt(t){return(((t.mapValue||{}).fields||{}).__type__||{}).stringValue==="__max__"}/** + */const zE={mapValue:{fields:{__type__:{stringValue:"__max__"}}}};function $v(t){return"nullValue"in t?0:"booleanValue"in t?1:"integerValue"in t||"doubleValue"in t?2:"timestampValue"in t?3:"stringValue"in t?5:"bytesValue"in t?6:"referenceValue"in t?7:"geoPointValue"in t?8:"arrayValue"in t?9:"mapValue"in t?TW(t)?4:lSt(t)?9007199254740991:oSt(t)?10:11:_t()}function id(t,e){if(t===e)return!0;const n=$v(t);if(n!==$v(e))return!1;switch(n){case 0:case 9007199254740991:return!0;case 1:return t.booleanValue===e.booleanValue;case 4:return K6(t).isEqual(K6(e));case 3:return function(i,s){if(typeof i.timestampValue=="string"&&typeof s.timestampValue=="string"&&i.timestampValue.length===s.timestampValue.length)return i.timestampValue===s.timestampValue;const a=Fp(i.timestampValue),o=Fp(s.timestampValue);return a.seconds===o.seconds&&a.nanos===o.nanos}(t,e);case 5:return t.stringValue===e.stringValue;case 6:return function(i,s){return _v(i.bytesValue).isEqual(_v(s.bytesValue))}(t,e);case 7:return t.referenceValue===e.referenceValue;case 8:return function(i,s){return Gi(i.geoPointValue.latitude)===Gi(s.geoPointValue.latitude)&&Gi(i.geoPointValue.longitude)===Gi(s.geoPointValue.longitude)}(t,e);case 2:return function(i,s){if("integerValue"in i&&"integerValue"in s)return Gi(i.integerValue)===Gi(s.integerValue);if("doubleValue"in i&&"doubleValue"in s){const a=Gi(i.doubleValue),o=Gi(s.doubleValue);return a===o?BP(a)===BP(o):isNaN(a)&&isNaN(o)}return!1}(t,e);case 9:return qb(t.arrayValue.values||[],e.arrayValue.values||[],id);case 10:case 11:return function(i,s){const a=i.mapValue.fields||{},o=s.mapValue.fields||{};if(aee(a)!==aee(o))return!1;for(const l in a)if(a.hasOwnProperty(l)&&(o[l]===void 0||!id(a[l],o[l])))return!1;return!0}(t,e);default:return _t()}}function D6(t,e){return(t.values||[]).find(n=>id(n,e))!==void 0}function Db(t,e){if(t===e)return 0;const n=$v(t),r=$v(e);if(n!==r)return rr(n,r);switch(n){case 0:case 9007199254740991:return 0;case 1:return rr(t.booleanValue,e.booleanValue);case 2:return function(s,a){const o=Gi(s.integerValue||s.doubleValue),l=Gi(a.integerValue||a.doubleValue);return ol?1:o===l?0:isNaN(o)?isNaN(l)?0:-1:1}(t,e);case 3:return lee(t.timestampValue,e.timestampValue);case 4:return lee(K6(t),K6(e));case 5:return rr(t.stringValue,e.stringValue);case 6:return function(s,a){const o=_v(s),l=_v(a);return o.compareTo(l)}(t.bytesValue,e.bytesValue);case 7:return function(s,a){const o=s.split("/"),l=a.split("/");for(let u=0;ue.mapValue.fields[n]=yx(r)),e}if(t.arrayValue){const e={arrayValue:{values:[]}};for(let n=0;n<(t.arrayValue.values||[]).length;++n)e.arrayValue.values[n]=yx(t.arrayValue.values[n]);return e}return Object.assign({},t)}function lSt(t){return(((t.mapValue||{}).fields||{}).__type__||{}).stringValue==="__max__"}/** * @license * Copyright 2017 Google LLC * @@ -8416,7 +8416,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Io{constructor(e){this.value=e}static empty(){return new Io({mapValue:{}})}field(e){if(e.isEmpty())return this.value;{let n=this.value;for(let r=0;r{if(!n.isImmediateParentOf(o)){const l=this.getFieldsMap(n);this.applyChanges(l,r,i),r={},i=[],n=o.popLast()}a?r[o.lastSegment()]=Sx(a):i.push(o.lastSegment())});const s=this.getFieldsMap(n);this.applyChanges(s,r,i)}delete(e){const n=this.field(e.popLast());Q7(n)&&n.mapValue.fields&&delete n.mapValue.fields[e.lastSegment()]}isEqual(e){return id(this.value,e.value)}getFieldsMap(e){let n=this.value;n.mapValue.fields||(n.mapValue={fields:{}});for(let r=0;re[i]=s);for(const i of r)delete e[i]}clone(){return new Io(Sx(this.value))}}function n1e(t){const e=[];return L0(t.fields,(n,r)=>{const i=new ta([n]);if(Q7(r)){const s=n1e(r.mapValue).fields;if(s.length===0)e.push(i);else for(const a of s)e.push(i.child(a))}else e.push(i)}),new ul(e)}/** + */class Oo{constructor(e){this.value=e}static empty(){return new Oo({mapValue:{}})}field(e){if(e.isEmpty())return this.value;{let n=this.value;for(let r=0;r{if(!n.isImmediateParentOf(o)){const l=this.getFieldsMap(n);this.applyChanges(l,r,i),r={},i=[],n=o.popLast()}a?r[o.lastSegment()]=yx(a):i.push(o.lastSegment())});const s=this.getFieldsMap(n);this.applyChanges(s,r,i)}delete(e){const n=this.field(e.popLast());Q7(n)&&n.mapValue.fields&&delete n.mapValue.fields[e.lastSegment()]}isEqual(e){return id(this.value,e.value)}getFieldsMap(e){let n=this.value;n.mapValue.fields||(n.mapValue={fields:{}});for(let r=0;re[i]=s);for(const i of r)delete e[i]}clone(){return new Oo(yx(this.value))}}function t1e(t){const e=[];return L0(t.fields,(n,r)=>{const i=new ta([n]);if(Q7(r)){const s=t1e(r.mapValue).fields;if(s.length===0)e.push(i);else for(const a of s)e.push(i.child(a))}else e.push(i)}),new ll(e)}/** * @license * Copyright 2017 Google LLC * @@ -8431,7 +8431,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Ra{constructor(e,n,r,i,s,a,o){this.key=e,this.documentType=n,this.version=r,this.readTime=i,this.createTime=s,this.data=a,this.documentState=o}static newInvalidDocument(e){return new Ra(e,0,sn.min(),sn.min(),sn.min(),Io.empty(),0)}static newFoundDocument(e,n,r,i){return new Ra(e,1,n,sn.min(),r,i,0)}static newNoDocument(e,n){return new Ra(e,2,n,sn.min(),sn.min(),Io.empty(),0)}static newUnknownDocument(e,n){return new Ra(e,3,n,sn.min(),sn.min(),Io.empty(),2)}convertToFoundDocument(e,n){return!this.createTime.isEqual(sn.min())||this.documentType!==2&&this.documentType!==0||(this.createTime=e),this.version=e,this.documentType=1,this.data=n,this.documentState=0,this}convertToNoDocument(e){return this.version=e,this.documentType=2,this.data=Io.empty(),this.documentState=0,this}convertToUnknownDocument(e){return this.version=e,this.documentType=3,this.data=Io.empty(),this.documentState=2,this}setHasCommittedMutations(){return this.documentState=2,this}setHasLocalMutations(){return this.documentState=1,this.version=sn.min(),this}setReadTime(e){return this.readTime=e,this}get hasLocalMutations(){return this.documentState===1}get hasCommittedMutations(){return this.documentState===2}get hasPendingWrites(){return this.hasLocalMutations||this.hasCommittedMutations}isValidDocument(){return this.documentType!==0}isFoundDocument(){return this.documentType===1}isNoDocument(){return this.documentType===2}isUnknownDocument(){return this.documentType===3}isEqual(e){return e instanceof Ra&&this.key.isEqual(e.key)&&this.version.isEqual(e.version)&&this.documentType===e.documentType&&this.documentState===e.documentState&&this.data.isEqual(e.data)}mutableCopy(){return new Ra(this.key,this.documentType,this.version,this.readTime,this.createTime,this.data.clone(),this.documentState)}toString(){return`Document(${this.key}, ${this.version}, ${JSON.stringify(this.data.value)}, {createTime: ${this.createTime}}), {documentType: ${this.documentType}}), {documentState: ${this.documentState}})`}}/** + */class Ra{constructor(e,n,r,i,s,a,o){this.key=e,this.documentType=n,this.version=r,this.readTime=i,this.createTime=s,this.data=a,this.documentState=o}static newInvalidDocument(e){return new Ra(e,0,sn.min(),sn.min(),sn.min(),Oo.empty(),0)}static newFoundDocument(e,n,r,i){return new Ra(e,1,n,sn.min(),r,i,0)}static newNoDocument(e,n){return new Ra(e,2,n,sn.min(),sn.min(),Oo.empty(),0)}static newUnknownDocument(e,n){return new Ra(e,3,n,sn.min(),sn.min(),Oo.empty(),2)}convertToFoundDocument(e,n){return!this.createTime.isEqual(sn.min())||this.documentType!==2&&this.documentType!==0||(this.createTime=e),this.version=e,this.documentType=1,this.data=n,this.documentState=0,this}convertToNoDocument(e){return this.version=e,this.documentType=2,this.data=Oo.empty(),this.documentState=0,this}convertToUnknownDocument(e){return this.version=e,this.documentType=3,this.data=Oo.empty(),this.documentState=2,this}setHasCommittedMutations(){return this.documentState=2,this}setHasLocalMutations(){return this.documentState=1,this.version=sn.min(),this}setReadTime(e){return this.readTime=e,this}get hasLocalMutations(){return this.documentState===1}get hasCommittedMutations(){return this.documentState===2}get hasPendingWrites(){return this.hasLocalMutations||this.hasCommittedMutations}isValidDocument(){return this.documentType!==0}isFoundDocument(){return this.documentType===1}isNoDocument(){return this.documentType===2}isUnknownDocument(){return this.documentType===3}isEqual(e){return e instanceof Ra&&this.key.isEqual(e.key)&&this.version.isEqual(e.version)&&this.documentType===e.documentType&&this.documentState===e.documentState&&this.data.isEqual(e.data)}mutableCopy(){return new Ra(this.key,this.documentType,this.version,this.readTime,this.createTime,this.data.clone(),this.documentState)}toString(){return`Document(${this.key}, ${this.version}, ${JSON.stringify(this.data.value)}, {createTime: ${this.createTime}}), {documentType: ${this.documentType}}), {documentState: ${this.documentState}})`}}/** * @license * Copyright 2022 Google LLC * @@ -8446,7 +8446,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class QP{constructor(e,n){this.position=e,this.inclusive=n}}function mee(t,e,n){let r=0;for(let i=0;i":return e>0;case">=":return e>=0;default:return _t()}}isInequality(){return["<","<=",">",">=","!=","not-in"].indexOf(this.op)>=0}getFlattenedFilters(){return[this]}getFilters(){return[this]}}class Gu extends r1e{constructor(e,n){super(),this.filters=e,this.op=n,this.ae=null}static create(e,n){return new Gu(e,n)}matches(e){return i1e(this)?this.filters.find(n=>!n.matches(e))===void 0:this.filters.find(n=>n.matches(e))!==void 0}getFlattenedFilters(){return this.ae!==null||(this.ae=this.filters.reduce((e,n)=>e.concat(n.getFlattenedFilters()),[])),this.ae}getFilters(){return Object.assign([],this.filters)}}function i1e(t){return t.op==="and"}function s1e(t){return uSt(t)&&i1e(t)}function uSt(t){for(const e of t.filters)if(e instanceof Gu)return!1;return!0}function I4(t){if(t instanceof is)return t.field.canonicalString()+t.op.toString()+Wb(t.value);if(s1e(t))return t.filters.map(e=>I4(e)).join(",");{const e=t.filters.map(n=>I4(n)).join(",");return`${t.op}(${e})`}}function a1e(t,e){return t instanceof is?function(r,i){return i instanceof is&&r.op===i.op&&r.field.isEqual(i.field)&&id(r.value,i.value)}(t,e):t instanceof Gu?function(r,i){return i instanceof Gu&&r.op===i.op&&r.filters.length===i.filters.length?r.filters.reduce((s,a,o)=>s&&a1e(a,i.filters[o]),!0):!1}(t,e):void _t()}function o1e(t){return t instanceof is?function(n){return`${n.field.canonicalString()} ${n.op} ${Wb(n.value)}`}(t):t instanceof Gu?function(n){return n.op.toString()+" {"+n.getFilters().map(o1e).join(" ,")+"}"}(t):"Filter"}class cSt extends is{constructor(e,n,r){super(e,n,r),this.key=Ft.fromName(r.referenceValue)}matches(e){const n=Ft.comparator(e.key,this.key);return this.matchesComparison(n)}}class dSt extends is{constructor(e,n){super(e,"in",n),this.keys=l1e("in",n)}matches(e){return this.keys.some(n=>n.isEqual(e.key))}}class fSt extends is{constructor(e,n){super(e,"not-in",n),this.keys=l1e("not-in",n)}matches(e){return!this.keys.some(n=>n.isEqual(e.key))}}function l1e(t,e){var n;return(((n=e.arrayValue)===null||n===void 0?void 0:n.values)||[]).map(r=>Ft.fromName(r.referenceValue))}class hSt extends is{constructor(e,n){super(e,"array-contains",n)}matches(e){const n=e.data.field(this.field);return wW(n)&&W6(n.arrayValue,this.value)}}class pSt extends is{constructor(e,n){super(e,"in",n)}matches(e){const n=e.data.field(this.field);return n!==null&&W6(this.value.arrayValue,n)}}class mSt extends is{constructor(e,n){super(e,"not-in",n)}matches(e){if(W6(this.value.arrayValue,{nullValue:"NULL_VALUE"}))return!1;const n=e.data.field(this.field);return n!==null&&!W6(this.value.arrayValue,n)}}class vSt extends is{constructor(e,n){super(e,"array-contains-any",n)}matches(e){const n=e.data.field(this.field);return!(!wW(n)||!n.arrayValue.values)&&n.arrayValue.values.some(r=>W6(this.value.arrayValue,r))}}/** + */class n1e{}class is extends n1e{constructor(e,n,r){super(),this.field=e,this.op=n,this.value=r}static create(e,n,r){return e.isKeyField()?n==="in"||n==="not-in"?this.createKeyFieldInFilter(e,n,r):new dSt(e,n,r):n==="array-contains"?new pSt(e,r):n==="in"?new mSt(e,r):n==="not-in"?new vSt(e,r):n==="array-contains-any"?new gSt(e,r):new is(e,n,r)}static createKeyFieldInFilter(e,n,r){return n==="in"?new fSt(e,r):new hSt(e,r)}matches(e){const n=e.data.field(this.field);return this.op==="!="?n!==null&&this.matchesComparison(Db(n,this.value)):n!==null&&$v(this.value)===$v(n)&&this.matchesComparison(Db(n,this.value))}matchesComparison(e){switch(this.op){case"<":return e<0;case"<=":return e<=0;case"==":return e===0;case"!=":return e!==0;case">":return e>0;case">=":return e>=0;default:return _t()}}isInequality(){return["<","<=",">",">=","!=","not-in"].indexOf(this.op)>=0}getFlattenedFilters(){return[this]}getFilters(){return[this]}}class Gu extends n1e{constructor(e,n){super(),this.filters=e,this.op=n,this.ae=null}static create(e,n){return new Gu(e,n)}matches(e){return r1e(this)?this.filters.find(n=>!n.matches(e))===void 0:this.filters.find(n=>n.matches(e))!==void 0}getFlattenedFilters(){return this.ae!==null||(this.ae=this.filters.reduce((e,n)=>e.concat(n.getFlattenedFilters()),[])),this.ae}getFilters(){return Object.assign([],this.filters)}}function r1e(t){return t.op==="and"}function i1e(t){return cSt(t)&&r1e(t)}function cSt(t){for(const e of t.filters)if(e instanceof Gu)return!1;return!0}function I4(t){if(t instanceof is)return t.field.canonicalString()+t.op.toString()+Wb(t.value);if(i1e(t))return t.filters.map(e=>I4(e)).join(",");{const e=t.filters.map(n=>I4(n)).join(",");return`${t.op}(${e})`}}function s1e(t,e){return t instanceof is?function(r,i){return i instanceof is&&r.op===i.op&&r.field.isEqual(i.field)&&id(r.value,i.value)}(t,e):t instanceof Gu?function(r,i){return i instanceof Gu&&r.op===i.op&&r.filters.length===i.filters.length?r.filters.reduce((s,a,o)=>s&&s1e(a,i.filters[o]),!0):!1}(t,e):void _t()}function a1e(t){return t instanceof is?function(n){return`${n.field.canonicalString()} ${n.op} ${Wb(n.value)}`}(t):t instanceof Gu?function(n){return n.op.toString()+" {"+n.getFilters().map(a1e).join(" ,")+"}"}(t):"Filter"}class dSt extends is{constructor(e,n,r){super(e,n,r),this.key=Ft.fromName(r.referenceValue)}matches(e){const n=Ft.comparator(e.key,this.key);return this.matchesComparison(n)}}class fSt extends is{constructor(e,n){super(e,"in",n),this.keys=o1e("in",n)}matches(e){return this.keys.some(n=>n.isEqual(e.key))}}class hSt extends is{constructor(e,n){super(e,"not-in",n),this.keys=o1e("not-in",n)}matches(e){return!this.keys.some(n=>n.isEqual(e.key))}}function o1e(t,e){var n;return(((n=e.arrayValue)===null||n===void 0?void 0:n.values)||[]).map(r=>Ft.fromName(r.referenceValue))}class pSt extends is{constructor(e,n){super(e,"array-contains",n)}matches(e){const n=e.data.field(this.field);return EW(n)&&D6(n.arrayValue,this.value)}}class mSt extends is{constructor(e,n){super(e,"in",n)}matches(e){const n=e.data.field(this.field);return n!==null&&D6(this.value.arrayValue,n)}}class vSt extends is{constructor(e,n){super(e,"not-in",n)}matches(e){if(D6(this.value.arrayValue,{nullValue:"NULL_VALUE"}))return!1;const n=e.data.field(this.field);return n!==null&&!D6(this.value.arrayValue,n)}}class gSt extends is{constructor(e,n){super(e,"array-contains-any",n)}matches(e){const n=e.data.field(this.field);return!(!EW(n)||!n.arrayValue.values)&&n.arrayValue.values.some(r=>D6(this.value.arrayValue,r))}}/** * @license * Copyright 2019 Google LLC * @@ -8491,7 +8491,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class gSt{constructor(e,n=null,r=[],i=[],s=null,a=null,o=null){this.path=e,this.collectionGroup=n,this.orderBy=r,this.filters=i,this.limit=s,this.startAt=a,this.endAt=o,this.ue=null}}function gee(t,e=null,n=[],r=[],i=null,s=null,a=null){return new gSt(t,e,n,r,i,s,a)}function EW(t){const e=an(t);if(e.ue===null){let n=e.path.canonicalString();e.collectionGroup!==null&&(n+="|cg:"+e.collectionGroup),n+="|f:",n+=e.filters.map(r=>I4(r)).join(","),n+="|ob:",n+=e.orderBy.map(r=>function(s){return s.field.canonicalString()+s.dir}(r)).join(","),L9(e.limit)||(n+="|l:",n+=e.limit),e.startAt&&(n+="|lb:",n+=e.startAt.inclusive?"b:":"a:",n+=e.startAt.position.map(r=>Wb(r)).join(",")),e.endAt&&(n+="|ub:",n+=e.endAt.inclusive?"a:":"b:",n+=e.endAt.position.map(r=>Wb(r)).join(",")),e.ue=n}return e.ue}function MW(t,e){if(t.limit!==e.limit||t.orderBy.length!==e.orderBy.length)return!1;for(let n=0;nI4(r)).join(","),n+="|ob:",n+=e.orderBy.map(r=>function(s){return s.field.canonicalString()+s.dir}(r)).join(","),L9(e.limit)||(n+="|l:",n+=e.limit),e.startAt&&(n+="|lb:",n+=e.startAt.inclusive?"b:":"a:",n+=e.startAt.position.map(r=>Wb(r)).join(",")),e.endAt&&(n+="|ub:",n+=e.endAt.inclusive?"a:":"b:",n+=e.endAt.position.map(r=>Wb(r)).join(",")),e.ue=n}return e.ue}function PW(t,e){if(t.limit!==e.limit||t.orderBy.length!==e.orderBy.length)return!1;for(let n=0;n0?e.explicitOrderBy[e.explicitOrderBy.length-1].dir:"asc";(function(a){let o=new aa(ta.comparator);return a.filters.forEach(l=>{l.getFlattenedFilters().forEach(u=>{u.isInequality()&&(o=o.add(u.field))})}),o})(e).forEach(s=>{n.has(s.canonicalString())||s.isKeyField()||e.ce.push(new A6(s,r))}),n.has(ta.keyField().canonicalString())||e.ce.push(new A6(ta.keyField(),r))}return e.ce}function jc(t){const e=an(t);return e.le||(e.le=ySt(e,xx(t))),e.le}function ySt(t,e){if(t.limitType==="F")return gee(t.path,t.collectionGroup,e,t.filters,t.limit,t.startAt,t.endAt);{e=e.map(i=>{const s=i.dir==="desc"?"asc":"desc";return new A6(i.field,s)});const n=t.endAt?new QP(t.endAt.position,t.endAt.inclusive):null,r=t.startAt?new QP(t.startAt.position,t.startAt.inclusive):null;return gee(t.path,t.collectionGroup,e,t.filters,t.limit,n,r)}}function N4(t,e){const n=t.filters.concat([e]);return new By(t.path,t.collectionGroup,t.explicitOrderBy.slice(),n,t.limit,t.limitType,t.startAt,t.endAt)}function _P(t,e,n){return new By(t.path,t.collectionGroup,t.explicitOrderBy.slice(),t.filters.slice(),e,n,t.startAt,t.endAt)}function X9(t,e){return MW(jc(t),jc(e))&&t.limitType===e.limitType}function d1e(t){return`${EW(jc(t))}|lt:${t.limitType}`}function e1(t){return`Query(target=${function(n){let r=n.path.canonicalString();return n.collectionGroup!==null&&(r+=" collectionGroup="+n.collectionGroup),n.filters.length>0&&(r+=`, filters: [${n.filters.map(i=>o1e(i)).join(", ")}]`),L9(n.limit)||(r+=", limit: "+n.limit),n.orderBy.length>0&&(r+=`, orderBy: [${n.orderBy.map(i=>function(a){return`${a.field.canonicalString()} (${a.dir})`}(i)).join(", ")}]`),n.startAt&&(r+=", startAt: ",r+=n.startAt.inclusive?"b:":"a:",r+=n.startAt.position.map(i=>Wb(i)).join(",")),n.endAt&&(r+=", endAt: ",r+=n.endAt.inclusive?"a:":"b:",r+=n.endAt.position.map(i=>Wb(i)).join(",")),`Target(${r})`}(jc(t))}; limitType=${t.limitType})`}function C9(t,e){return e.isFoundDocument()&&function(r,i){const s=i.key.path;return r.collectionGroup!==null?i.key.hasCollectionId(r.collectionGroup)&&r.path.isPrefixOf(s):Ft.isDocumentKey(r.path)?r.path.isEqual(s):r.path.isImmediateParentOf(s)}(t,e)&&function(r,i){for(const s of xx(r))if(!s.field.isKeyField()&&i.data.field(s.field)===null)return!1;return!0}(t,e)&&function(r,i){for(const s of r.filters)if(!s.matches(i))return!1;return!0}(t,e)&&function(r,i){return!(r.startAt&&!function(a,o,l){const u=mee(a,o,l);return a.inclusive?u<=0:u<0}(r.startAt,xx(r),i)||r.endAt&&!function(a,o,l){const u=mee(a,o,l);return a.inclusive?u>=0:u>0}(r.endAt,xx(r),i))}(t,e)}function SSt(t){return t.collectionGroup||(t.path.length%2==1?t.path.lastSegment():t.path.get(t.path.length-2))}function f1e(t){return(e,n)=>{let r=!1;for(const i of xx(t)){const s=xSt(i,e,n);if(s!==0)return s;r=r||i.field.isKeyField()}return 0}}function xSt(t,e,n){const r=t.field.isKeyField()?Ft.comparator(e.key,n.key):function(s,a,o){const l=a.data.field(s),u=o.data.field(s);return l!==null&&u!==null?Db(l,u):_t()}(t.field,e,n);switch(t.dir){case"asc":return r;case"desc":return-1*r;default:return _t()}}/** + */class Yy{constructor(e,n=null,r=[],i=[],s=null,a="F",o=null,l=null){this.path=e,this.collectionGroup=n,this.explicitOrderBy=r,this.filters=i,this.limit=s,this.limitType=a,this.startAt=o,this.endAt=l,this.ce=null,this.le=null,this.he=null,this.startAt,this.endAt}}function ySt(t,e,n,r,i,s,a,o){return new Yy(t,e,n,r,i,s,a,o)}function l1e(t){return new Yy(t)}function vee(t){return t.filters.length===0&&t.limit===null&&t.startAt==null&&t.endAt==null&&(t.explicitOrderBy.length===0||t.explicitOrderBy.length===1&&t.explicitOrderBy[0].field.isKeyField())}function u1e(t){return t.collectionGroup!==null}function Sx(t){const e=an(t);if(e.ce===null){e.ce=[];const n=new Set;for(const s of e.explicitOrderBy)e.ce.push(s),n.add(s.field.canonicalString());const r=e.explicitOrderBy.length>0?e.explicitOrderBy[e.explicitOrderBy.length-1].dir:"asc";(function(a){let o=new aa(ta.comparator);return a.filters.forEach(l=>{l.getFlattenedFilters().forEach(u=>{u.isInequality()&&(o=o.add(u.field))})}),o})(e).forEach(s=>{n.has(s.canonicalString())||s.isKeyField()||e.ce.push(new W6(s,r))}),n.has(ta.keyField().canonicalString())||e.ce.push(new W6(ta.keyField(),r))}return e.ce}function jc(t){const e=an(t);return e.le||(e.le=SSt(e,Sx(t))),e.le}function SSt(t,e){if(t.limitType==="F")return mee(t.path,t.collectionGroup,e,t.filters,t.limit,t.startAt,t.endAt);{e=e.map(i=>{const s=i.dir==="desc"?"asc":"desc";return new W6(i.field,s)});const n=t.endAt?new HP(t.endAt.position,t.endAt.inclusive):null,r=t.startAt?new HP(t.startAt.position,t.startAt.inclusive):null;return mee(t.path,t.collectionGroup,e,t.filters,t.limit,n,r)}}function N4(t,e){const n=t.filters.concat([e]);return new Yy(t.path,t.collectionGroup,t.explicitOrderBy.slice(),n,t.limit,t.limitType,t.startAt,t.endAt)}function QP(t,e,n){return new Yy(t.path,t.collectionGroup,t.explicitOrderBy.slice(),t.filters.slice(),e,n,t.startAt,t.endAt)}function X9(t,e){return PW(jc(t),jc(e))&&t.limitType===e.limitType}function c1e(t){return`${MW(jc(t))}|lt:${t.limitType}`}function e1(t){return`Query(target=${function(n){let r=n.path.canonicalString();return n.collectionGroup!==null&&(r+=" collectionGroup="+n.collectionGroup),n.filters.length>0&&(r+=`, filters: [${n.filters.map(i=>a1e(i)).join(", ")}]`),L9(n.limit)||(r+=", limit: "+n.limit),n.orderBy.length>0&&(r+=`, orderBy: [${n.orderBy.map(i=>function(a){return`${a.field.canonicalString()} (${a.dir})`}(i)).join(", ")}]`),n.startAt&&(r+=", startAt: ",r+=n.startAt.inclusive?"b:":"a:",r+=n.startAt.position.map(i=>Wb(i)).join(",")),n.endAt&&(r+=", endAt: ",r+=n.endAt.inclusive?"a:":"b:",r+=n.endAt.position.map(i=>Wb(i)).join(",")),`Target(${r})`}(jc(t))}; limitType=${t.limitType})`}function C9(t,e){return e.isFoundDocument()&&function(r,i){const s=i.key.path;return r.collectionGroup!==null?i.key.hasCollectionId(r.collectionGroup)&&r.path.isPrefixOf(s):Ft.isDocumentKey(r.path)?r.path.isEqual(s):r.path.isImmediateParentOf(s)}(t,e)&&function(r,i){for(const s of Sx(r))if(!s.field.isKeyField()&&i.data.field(s.field)===null)return!1;return!0}(t,e)&&function(r,i){for(const s of r.filters)if(!s.matches(i))return!1;return!0}(t,e)&&function(r,i){return!(r.startAt&&!function(a,o,l){const u=hee(a,o,l);return a.inclusive?u<=0:u<0}(r.startAt,Sx(r),i)||r.endAt&&!function(a,o,l){const u=hee(a,o,l);return a.inclusive?u>=0:u>0}(r.endAt,Sx(r),i))}(t,e)}function xSt(t){return t.collectionGroup||(t.path.length%2==1?t.path.lastSegment():t.path.get(t.path.length-2))}function d1e(t){return(e,n)=>{let r=!1;for(const i of Sx(t)){const s=TSt(i,e,n);if(s!==0)return s;r=r||i.field.isKeyField()}return 0}}function TSt(t,e,n){const r=t.field.isKeyField()?Ft.comparator(e.key,n.key):function(s,a,o){const l=a.data.field(s),u=o.data.field(s);return l!==null&&u!==null?Db(l,u):_t()}(t.field,e,n);switch(t.dir){case"asc":return r;case"desc":return-1*r;default:return _t()}}/** * @license * Copyright 2017 Google LLC * @@ -8521,7 +8521,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Hy{constructor(e,n){this.mapKeyFn=e,this.equalsFn=n,this.inner={},this.innerSize=0}get(e){const n=this.mapKeyFn(e),r=this.inner[n];if(r!==void 0){for(const[i,s]of r)if(this.equalsFn(i,e))return s}}has(e){return this.get(e)!==void 0}set(e,n){const r=this.mapKeyFn(e),i=this.inner[r];if(i===void 0)return this.inner[r]=[[e,n]],void this.innerSize++;for(let s=0;s{for(const[i,s]of r)e(i,s)})}isEmpty(){return e1e(this.inner)}size(){return this.innerSize}}/** + */class By{constructor(e,n){this.mapKeyFn=e,this.equalsFn=n,this.inner={},this.innerSize=0}get(e){const n=this.mapKeyFn(e),r=this.inner[n];if(r!==void 0){for(const[i,s]of r)if(this.equalsFn(i,e))return s}}has(e){return this.get(e)!==void 0}set(e,n){const r=this.mapKeyFn(e),i=this.inner[r];if(i===void 0)return this.inner[r]=[[e,n]],void this.innerSize++;for(let s=0;s{for(const[i,s]of r)e(i,s)})}isEmpty(){return $ge(this.inner)}size(){return this.innerSize}}/** * @license * Copyright 2017 Google LLC * @@ -8536,7 +8536,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const TSt=new Ri(Ft.comparator);function Of(){return TSt}const h1e=new Ri(Ft.comparator);function R3(...t){let e=h1e;for(const n of t)e=e.insert(n.key,n);return e}function p1e(t){let e=h1e;return t.forEach((n,r)=>e=e.insert(n,r.overlayedDocument)),e}function vv(){return Tx()}function m1e(){return Tx()}function Tx(){return new Hy(t=>t.toString(),(t,e)=>t.isEqual(e))}const wSt=new Ri(Ft.comparator),ESt=new aa(Ft.comparator);function Nn(...t){let e=ESt;for(const n of t)e=e.add(n);return e}const MSt=new aa(rr);function PSt(){return MSt}/** + */const wSt=new Ri(Ft.comparator);function Of(){return wSt}const f1e=new Ri(Ft.comparator);function P3(...t){let e=f1e;for(const n of t)e=e.insert(n.key,n);return e}function h1e(t){let e=f1e;return t.forEach((n,r)=>e=e.insert(n,r.overlayedDocument)),e}function vv(){return xx()}function p1e(){return xx()}function xx(){return new By(t=>t.toString(),(t,e)=>t.isEqual(e))}const ESt=new Ri(Ft.comparator),MSt=new aa(Ft.comparator);function Ln(...t){let e=MSt;for(const n of t)e=e.add(n);return e}const PSt=new aa(rr);function RSt(){return PSt}/** * @license * Copyright 2020 Google LLC * @@ -8551,7 +8551,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function PW(t,e){if(t.useProto3Json){if(isNaN(e))return{doubleValue:"NaN"};if(e===1/0)return{doubleValue:"Infinity"};if(e===-1/0)return{doubleValue:"-Infinity"}}return{doubleValue:HP(e)?"-0":e}}function v1e(t){return{integerValue:""+t}}function RSt(t,e){return rSt(e)?v1e(e):PW(t,e)}/** + */function RW(t,e){if(t.useProto3Json){if(isNaN(e))return{doubleValue:"NaN"};if(e===1/0)return{doubleValue:"Infinity"};if(e===-1/0)return{doubleValue:"-Infinity"}}return{doubleValue:BP(e)?"-0":e}}function m1e(t){return{integerValue:""+t}}function VSt(t,e){return iSt(e)?m1e(e):RW(t,e)}/** * @license * Copyright 2018 Google LLC * @@ -8566,7 +8566,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class K9{constructor(){this._=void 0}}function VSt(t,e,n){return t instanceof $P?function(i,s){const a={fields:{__type__:{stringValue:"server_timestamp"},__local_write_time__:{timestampValue:{seconds:i.seconds,nanos:i.nanoseconds}}}};return s&&xW(s)&&(s=TW(s)),s&&(a.fields.__previous_value__=s),{mapValue:a}}(n,e):t instanceof G6?b1e(t,e):t instanceof F6?y1e(t,e):function(i,s){const a=g1e(i,s),o=yee(a)+yee(i.Pe);return O4(a)&&O4(i.Pe)?v1e(o):PW(i.serializer,o)}(t,e)}function zSt(t,e,n){return t instanceof G6?b1e(t,e):t instanceof F6?y1e(t,e):n}function g1e(t,e){return t instanceof eR?function(r){return O4(r)||function(s){return!!s&&"doubleValue"in s}(r)}(e)?e:{integerValue:0}:null}class $P extends K9{}class G6 extends K9{constructor(e){super(),this.elements=e}}function b1e(t,e){const n=S1e(e);for(const r of t.elements)n.some(i=>id(i,r))||n.push(r);return{arrayValue:{values:n}}}class F6 extends K9{constructor(e){super(),this.elements=e}}function y1e(t,e){let n=S1e(e);for(const r of t.elements)n=n.filter(i=>!id(i,r));return{arrayValue:{values:n}}}class eR extends K9{constructor(e,n){super(),this.serializer=e,this.Pe=n}}function yee(t){return Gi(t.integerValue||t.doubleValue)}function S1e(t){return wW(t)&&t.arrayValue.values?t.arrayValue.values.slice():[]}function kSt(t,e){return t.field.isEqual(e.field)&&function(r,i){return r instanceof G6&&i instanceof G6||r instanceof F6&&i instanceof F6?qb(r.elements,i.elements,id):r instanceof eR&&i instanceof eR?id(r.Pe,i.Pe):r instanceof $P&&i instanceof $P}(t.transform,e.transform)}class OSt{constructor(e,n){this.version=e,this.transformResults=n}}class ml{constructor(e,n){this.updateTime=e,this.exists=n}static none(){return new ml}static exists(e){return new ml(void 0,e)}static updateTime(e){return new ml(e)}get isNone(){return this.updateTime===void 0&&this.exists===void 0}isEqual(e){return this.exists===e.exists&&(this.updateTime?!!e.updateTime&&this.updateTime.isEqual(e.updateTime):!e.updateTime)}}function _7(t,e){return t.updateTime!==void 0?e.isFoundDocument()&&e.version.isEqual(t.updateTime):t.exists===void 0||t.exists===e.isFoundDocument()}class q9{}function x1e(t,e){if(!t.hasLocalMutations||e&&e.fields.length===0)return null;if(e===null)return t.isNoDocument()?new RW(t.key,ml.none()):new hw(t.key,t.data,ml.none());{const n=t.data,r=Io.empty();let i=new aa(ta.comparator);for(let s of e.fields)if(!i.has(s)){let a=n.field(s);a===null&&s.length>1&&(s=s.popLast(),a=n.field(s)),a===null?r.delete(s):r.set(s,a),i=i.add(s)}return new hm(t.key,r,new ul(i.toArray()),ml.none())}}function ISt(t,e,n){t instanceof hw?function(i,s,a){const o=i.value.clone(),l=xee(i.fieldTransforms,s,a.transformResults);o.setAll(l),s.convertToFoundDocument(a.version,o).setHasCommittedMutations()}(t,e,n):t instanceof hm?function(i,s,a){if(!_7(i.precondition,s))return void s.convertToUnknownDocument(a.version);const o=xee(i.fieldTransforms,s,a.transformResults),l=s.data;l.setAll(T1e(i)),l.setAll(o),s.convertToFoundDocument(a.version,l).setHasCommittedMutations()}(t,e,n):function(i,s,a){s.convertToNoDocument(a.version).setHasCommittedMutations()}(0,e,n)}function wx(t,e,n,r){return t instanceof hw?function(s,a,o,l){if(!_7(s.precondition,a))return o;const u=s.value.clone(),c=Tee(s.fieldTransforms,l,a);return u.setAll(c),a.convertToFoundDocument(a.version,u).setHasLocalMutations(),null}(t,e,n,r):t instanceof hm?function(s,a,o,l){if(!_7(s.precondition,a))return o;const u=Tee(s.fieldTransforms,l,a),c=a.data;return c.setAll(T1e(s)),c.setAll(u),a.convertToFoundDocument(a.version,c).setHasLocalMutations(),o===null?null:o.unionWith(s.fieldMask.fields).unionWith(s.fieldTransforms.map(d=>d.field))}(t,e,n,r):function(s,a,o){return _7(s.precondition,a)?(a.convertToNoDocument(a.version).setHasLocalMutations(),null):o}(t,e,n)}function USt(t,e){let n=null;for(const r of t.fieldTransforms){const i=e.data.field(r.field),s=g1e(r.transform,i||null);s!=null&&(n===null&&(n=Io.empty()),n.set(r.field,s))}return n||null}function See(t,e){return t.type===e.type&&!!t.key.isEqual(e.key)&&!!t.precondition.isEqual(e.precondition)&&!!function(r,i){return r===void 0&&i===void 0||!(!r||!i)&&qb(r,i,(s,a)=>kSt(s,a))}(t.fieldTransforms,e.fieldTransforms)&&(t.type===0?t.value.isEqual(e.value):t.type!==1||t.data.isEqual(e.data)&&t.fieldMask.isEqual(e.fieldMask))}class hw extends q9{constructor(e,n,r,i=[]){super(),this.key=e,this.value=n,this.precondition=r,this.fieldTransforms=i,this.type=0}getFieldMask(){return null}}class hm extends q9{constructor(e,n,r,i,s=[]){super(),this.key=e,this.data=n,this.fieldMask=r,this.precondition=i,this.fieldTransforms=s,this.type=1}getFieldMask(){return this.fieldMask}}function T1e(t){const e=new Map;return t.fieldMask.fields.forEach(n=>{if(!n.isEmpty()){const r=t.data.field(n);e.set(n,r)}}),e}function xee(t,e,n){const r=new Map;Pr(t.length===n.length);for(let i=0;iid(i,r))||n.push(r);return{arrayValue:{values:n}}}class G6 extends K9{constructor(e){super(),this.elements=e}}function b1e(t,e){let n=y1e(e);for(const r of t.elements)n=n.filter(i=>!id(i,r));return{arrayValue:{values:n}}}class $P extends K9{constructor(e,n){super(),this.serializer=e,this.Pe=n}}function gee(t){return Gi(t.integerValue||t.doubleValue)}function y1e(t){return EW(t)&&t.arrayValue.values?t.arrayValue.values.slice():[]}function OSt(t,e){return t.field.isEqual(e.field)&&function(r,i){return r instanceof A6&&i instanceof A6||r instanceof G6&&i instanceof G6?qb(r.elements,i.elements,id):r instanceof $P&&i instanceof $P?id(r.Pe,i.Pe):r instanceof _P&&i instanceof _P}(t.transform,e.transform)}class ISt{constructor(e,n){this.version=e,this.transformResults=n}}class pl{constructor(e,n){this.updateTime=e,this.exists=n}static none(){return new pl}static exists(e){return new pl(void 0,e)}static updateTime(e){return new pl(e)}get isNone(){return this.updateTime===void 0&&this.exists===void 0}isEqual(e){return this.exists===e.exists&&(this.updateTime?!!e.updateTime&&this.updateTime.isEqual(e.updateTime):!e.updateTime)}}function _7(t,e){return t.updateTime!==void 0?e.isFoundDocument()&&e.version.isEqual(t.updateTime):t.exists===void 0||t.exists===e.isFoundDocument()}class q9{}function S1e(t,e){if(!t.hasLocalMutations||e&&e.fields.length===0)return null;if(e===null)return t.isNoDocument()?new VW(t.key,pl.none()):new hw(t.key,t.data,pl.none());{const n=t.data,r=Oo.empty();let i=new aa(ta.comparator);for(let s of e.fields)if(!i.has(s)){let a=n.field(s);a===null&&s.length>1&&(s=s.popLast(),a=n.field(s)),a===null?r.delete(s):r.set(s,a),i=i.add(s)}return new hm(t.key,r,new ll(i.toArray()),pl.none())}}function USt(t,e,n){t instanceof hw?function(i,s,a){const o=i.value.clone(),l=yee(i.fieldTransforms,s,a.transformResults);o.setAll(l),s.convertToFoundDocument(a.version,o).setHasCommittedMutations()}(t,e,n):t instanceof hm?function(i,s,a){if(!_7(i.precondition,s))return void s.convertToUnknownDocument(a.version);const o=yee(i.fieldTransforms,s,a.transformResults),l=s.data;l.setAll(x1e(i)),l.setAll(o),s.convertToFoundDocument(a.version,l).setHasCommittedMutations()}(t,e,n):function(i,s,a){s.convertToNoDocument(a.version).setHasCommittedMutations()}(0,e,n)}function Tx(t,e,n,r){return t instanceof hw?function(s,a,o,l){if(!_7(s.precondition,a))return o;const u=s.value.clone(),c=See(s.fieldTransforms,l,a);return u.setAll(c),a.convertToFoundDocument(a.version,u).setHasLocalMutations(),null}(t,e,n,r):t instanceof hm?function(s,a,o,l){if(!_7(s.precondition,a))return o;const u=See(s.fieldTransforms,l,a),c=a.data;return c.setAll(x1e(s)),c.setAll(u),a.convertToFoundDocument(a.version,c).setHasLocalMutations(),o===null?null:o.unionWith(s.fieldMask.fields).unionWith(s.fieldTransforms.map(d=>d.field))}(t,e,n,r):function(s,a,o){return _7(s.precondition,a)?(a.convertToNoDocument(a.version).setHasLocalMutations(),null):o}(t,e,n)}function NSt(t,e){let n=null;for(const r of t.fieldTransforms){const i=e.data.field(r.field),s=v1e(r.transform,i||null);s!=null&&(n===null&&(n=Oo.empty()),n.set(r.field,s))}return n||null}function bee(t,e){return t.type===e.type&&!!t.key.isEqual(e.key)&&!!t.precondition.isEqual(e.precondition)&&!!function(r,i){return r===void 0&&i===void 0||!(!r||!i)&&qb(r,i,(s,a)=>OSt(s,a))}(t.fieldTransforms,e.fieldTransforms)&&(t.type===0?t.value.isEqual(e.value):t.type!==1||t.data.isEqual(e.data)&&t.fieldMask.isEqual(e.fieldMask))}class hw extends q9{constructor(e,n,r,i=[]){super(),this.key=e,this.value=n,this.precondition=r,this.fieldTransforms=i,this.type=0}getFieldMask(){return null}}class hm extends q9{constructor(e,n,r,i,s=[]){super(),this.key=e,this.data=n,this.fieldMask=r,this.precondition=i,this.fieldTransforms=s,this.type=1}getFieldMask(){return this.fieldMask}}function x1e(t){const e=new Map;return t.fieldMask.fields.forEach(n=>{if(!n.isEmpty()){const r=t.data.field(n);e.set(n,r)}}),e}function yee(t,e,n){const r=new Map;Pr(t.length===n.length);for(let i=0;i{const s=e.get(i.key),a=s.overlayedDocument;let o=this.applyToLocalView(a,s.mutatedFields);o=n.has(i.key)?null:o;const l=x1e(a,o);l!==null&&r.set(i.key,l),a.isValidDocument()||a.convertToNoDocument(sn.min())}),r}keys(){return this.mutations.reduce((e,n)=>e.add(n.key),Nn())}isEqual(e){return this.batchId===e.batchId&&qb(this.mutations,e.mutations,(n,r)=>See(n,r))&&qb(this.baseMutations,e.baseMutations,(n,r)=>See(n,r))}}class VW{constructor(e,n,r,i){this.batch=e,this.commitVersion=n,this.mutationResults=r,this.docVersions=i}static from(e,n,r){Pr(e.mutations.length===r.length);let i=function(){return wSt}();const s=e.mutations;for(let a=0;a{const s=e.get(i.key),a=s.overlayedDocument;let o=this.applyToLocalView(a,s.mutatedFields);o=n.has(i.key)?null:o;const l=S1e(a,o);l!==null&&r.set(i.key,l),a.isValidDocument()||a.convertToNoDocument(sn.min())}),r}keys(){return this.mutations.reduce((e,n)=>e.add(n.key),Ln())}isEqual(e){return this.batchId===e.batchId&&qb(this.mutations,e.mutations,(n,r)=>bee(n,r))&&qb(this.baseMutations,e.baseMutations,(n,r)=>bee(n,r))}}class zW{constructor(e,n,r,i){this.batch=e,this.commitVersion=n,this.mutationResults=r,this.docVersions=i}static from(e,n,r){Pr(e.mutations.length===r.length);let i=function(){return ESt}();const s=e.mutations;for(let a=0;a=8)throw new V3(`Invalid padding: ${n}`);if(r<0)throw new V3(`Invalid hash count: ${r}`);if(e.length>0&&this.hashCount===0)throw new V3(`Invalid hash count: ${r}`);if(e.length===0&&n!==0)throw new V3(`Invalid padding when bitmap length is 0: ${n}`);this.Ie=8*e.length-n,this.Te=Iv.fromNumber(this.Ie)}Ee(e,n,r){let i=e.add(n.multiply(Iv.fromNumber(r)));return i.compare(DSt)===1&&(i=new Iv([i.getBits(0),i.getBits(1)],0)),i.modulo(this.Te).toNumber()}de(e){return(this.bitmap[Math.floor(e/8)]&1<a.insert(o)),a}insert(e){if(this.Ie===0)return;const n=wee(e),[r,i]=Eee(n);for(let s=0;s=8)throw new R3(`Invalid padding: ${n}`);if(r<0)throw new R3(`Invalid hash count: ${r}`);if(e.length>0&&this.hashCount===0)throw new R3(`Invalid hash count: ${r}`);if(e.length===0&&n!==0)throw new R3(`Invalid padding when bitmap length is 0: ${n}`);this.Ie=8*e.length-n,this.Te=Iv.fromNumber(this.Ie)}Ee(e,n,r){let i=e.add(n.multiply(Iv.fromNumber(r)));return i.compare(WSt)===1&&(i=new Iv([i.getBits(0),i.getBits(1)],0)),i.modulo(this.Te).toNumber()}de(e){return(this.bitmap[Math.floor(e/8)]&1<a.insert(o)),a}insert(e){if(this.Ie===0)return;const n=xee(e),[r,i]=Tee(n);for(let s=0;s0&&(this.we=!0,this.pe=e)}ve(){let e=Nn(),n=Nn(),r=Nn();return this.ge.forEach((i,s)=>{switch(s){case 0:e=e.add(i);break;case 2:n=n.add(i);break;case 1:r=r.add(i);break;default:_t()}}),new pw(this.pe,this.ye,e,n,r)}Ce(){this.we=!1,this.ge=Ree()}Fe(e,n){this.we=!0,this.ge=this.ge.insert(e,n)}Me(e){this.we=!0,this.ge=this.ge.remove(e)}xe(){this.fe+=1}Oe(){this.fe-=1,Pr(this.fe>=0)}Ne(){this.we=!0,this.ye=!0}}class WSt{constructor(e){this.Le=e,this.Be=new Map,this.ke=Of(),this.qe=Pee(),this.Qe=new Ri(rr)}Ke(e){for(const n of e.Re)e.Ve&&e.Ve.isFoundDocument()?this.$e(n,e.Ve):this.Ue(n,e.key,e.Ve);for(const n of e.removedTargetIds)this.Ue(n,e.key,e.Ve)}We(e){this.forEachTarget(e,n=>{const r=this.Ge(n);switch(e.state){case 0:this.ze(n)&&r.De(e.resumeToken);break;case 1:r.Oe(),r.Se||r.Ce(),r.De(e.resumeToken);break;case 2:r.Oe(),r.Se||this.removeTarget(n);break;case 3:this.ze(n)&&(r.Ne(),r.De(e.resumeToken));break;case 4:this.ze(n)&&(this.je(n),r.De(e.resumeToken));break;default:_t()}})}forEachTarget(e,n){e.targetIds.length>0?e.targetIds.forEach(n):this.Be.forEach((r,i)=>{this.ze(i)&&n(i)})}He(e){const n=e.targetId,r=e.me.count,i=this.Je(n);if(i){const s=i.target;if(U4(s))if(r===0){const a=new Ft(s.path);this.Ue(n,a,Ra.newNoDocument(a,sn.min()))}else Pr(r===1);else{const a=this.Ye(n);if(a!==r){const o=this.Ze(e),l=o?this.Xe(o,e,a):1;if(l!==0){this.je(n);const u=l===2?"TargetPurposeExistenceFilterMismatchBloom":"TargetPurposeExistenceFilterMismatch";this.Qe=this.Qe.insert(n,u)}}}}}Ze(e){const n=e.me.unchangedNames;if(!n||!n.bits)return null;const{bits:{bitmap:r="",padding:i=0},hashCount:s=0}=n;let a,o;try{a=_v(r).toUint8Array()}catch(l){if(l instanceof t1e)return Kb("Decoding the base64 bloom filter in existence filter failed ("+l.message+"); ignoring the bloom filter and falling back to full re-query."),null;throw l}try{o=new zW(a,i,s)}catch(l){return Kb(l instanceof V3?"BloomFilter error: ":"Applying bloom filter failed: ",l),null}return o.Ie===0?null:o}Xe(e,n,r){return n.me.count===r-this.nt(e,n.targetId)?0:2}nt(e,n){const r=this.Le.getRemoteKeysForTarget(n);let i=0;return r.forEach(s=>{const a=this.Le.tt(),o=`projects/${a.projectId}/databases/${a.database}/documents/${s.path.canonicalString()}`;e.mightContain(o)||(this.Ue(n,s,null),i++)}),i}rt(e){const n=new Map;this.Be.forEach((s,a)=>{const o=this.Je(a);if(o){if(s.current&&U4(o.target)){const l=new Ft(o.target.path);this.ke.get(l)!==null||this.it(a,l)||this.Ue(a,l,Ra.newNoDocument(l,e))}s.be&&(n.set(a,s.ve()),s.Ce())}});let r=Nn();this.qe.forEach((s,a)=>{let o=!0;a.forEachWhile(l=>{const u=this.Je(l);return!u||u.purpose==="TargetPurposeLimboResolution"||(o=!1,!1)}),o&&(r=r.add(s))}),this.ke.forEach((s,a)=>a.setReadTime(e));const i=new D9(e,n,this.Qe,this.ke,r);return this.ke=Of(),this.qe=Pee(),this.Qe=new Ri(rr),i}$e(e,n){if(!this.ze(e))return;const r=this.it(e,n.key)?2:0;this.Ge(e).Fe(n.key,r),this.ke=this.ke.insert(n.key,n),this.qe=this.qe.insert(n.key,this.st(n.key).add(e))}Ue(e,n,r){if(!this.ze(e))return;const i=this.Ge(e);this.it(e,n)?i.Fe(n,1):i.Me(n),this.qe=this.qe.insert(n,this.st(n).delete(e)),r&&(this.ke=this.ke.insert(n,r))}removeTarget(e){this.Be.delete(e)}Ye(e){const n=this.Ge(e).ve();return this.Le.getRemoteKeysForTarget(e).size+n.addedDocuments.size-n.removedDocuments.size}xe(e){this.Ge(e).xe()}Ge(e){let n=this.Be.get(e);return n||(n=new Mee,this.Be.set(e,n)),n}st(e){let n=this.qe.get(e);return n||(n=new aa(rr),this.qe=this.qe.insert(e,n)),n}ze(e){const n=this.Je(e)!==null;return n||It("WatchChangeAggregator","Detected inactive target",e),n}Je(e){const n=this.Be.get(e);return n&&n.Se?null:this.Le.ot(e)}je(e){this.Be.set(e,new Mee),this.Le.getRemoteKeysForTarget(e).forEach(n=>{this.Ue(e,n,null)})}it(e,n){return this.Le.getRemoteKeysForTarget(e).has(n)}}function Pee(){return new Ri(Ft.comparator)}function Ree(){return new Ri(Ft.comparator)}const ASt=(()=>({asc:"ASCENDING",desc:"DESCENDING"}))(),GSt=(()=>({"<":"LESS_THAN","<=":"LESS_THAN_OR_EQUAL",">":"GREATER_THAN",">=":"GREATER_THAN_OR_EQUAL","==":"EQUAL","!=":"NOT_EQUAL","array-contains":"ARRAY_CONTAINS",in:"IN","not-in":"NOT_IN","array-contains-any":"ARRAY_CONTAINS_ANY"}))(),FSt=(()=>({and:"AND",or:"OR"}))();class jSt{constructor(e,n){this.databaseId=e,this.useProto3Json=n}}function L4(t,e){return t.useProto3Json||L9(e)?e:{value:e}}function tR(t,e){return t.useProto3Json?`${new Date(1e3*e.seconds).toISOString().replace(/\.\d*/,"").replace("Z","")}.${("000000000"+e.nanoseconds).slice(-9)}Z`:{seconds:""+e.seconds,nanos:e.nanoseconds}}function P1e(t,e){return t.useProto3Json?e.toBase64():e.toUint8Array()}function ZSt(t,e){return tR(t,e.toTimestamp())}function Zc(t){return Pr(!!t),sn.fromTimestamp(function(n){const r=Fp(n);return new Es(r.seconds,r.nanos)}(t))}function kW(t,e){return X4(t,e).canonicalString()}function X4(t,e){const n=function(i){return new ii(["projects",i.projectId,"databases",i.database])}(t).child("documents");return e===void 0?n:n.child(e)}function R1e(t){const e=ii.fromString(t);return Pr(I1e(e)),e}function C4(t,e){return kW(t.databaseId,e.path)}function gU(t,e){const n=R1e(e);if(n.get(1)!==t.databaseId.projectId)throw new Et(nt.INVALID_ARGUMENT,"Tried to deserialize key from different project: "+n.get(1)+" vs "+t.databaseId.projectId);if(n.get(3)!==t.databaseId.database)throw new Et(nt.INVALID_ARGUMENT,"Tried to deserialize key from different database: "+n.get(3)+" vs "+t.databaseId.database);return new Ft(z1e(n))}function V1e(t,e){return kW(t.databaseId,e)}function JSt(t){const e=R1e(t);return e.length===4?ii.emptyPath():z1e(e)}function K4(t){return new ii(["projects",t.databaseId.projectId,"databases",t.databaseId.database]).canonicalString()}function z1e(t){return Pr(t.length>4&&t.get(4)==="documents"),t.popFirst(5)}function Vee(t,e,n){return{name:C4(t,e),fields:n.value.mapValue.fields}}function YSt(t,e){let n;if("targetChange"in e){e.targetChange;const r=function(u){return u==="NO_CHANGE"?0:u==="ADD"?1:u==="REMOVE"?2:u==="CURRENT"?3:u==="RESET"?4:_t()}(e.targetChange.targetChangeType||"NO_CHANGE"),i=e.targetChange.targetIds||[],s=function(u,c){return u.useProto3Json?(Pr(c===void 0||typeof c=="string"),ua.fromBase64String(c||"")):(Pr(c===void 0||c instanceof Buffer||c instanceof Uint8Array),ua.fromUint8Array(c||new Uint8Array))}(t,e.targetChange.resumeToken),a=e.targetChange.cause,o=a&&function(u){const c=u.code===void 0?nt.UNKNOWN:w1e(u.code);return new Et(c,u.message||"")}(a);n=new M1e(r,i,s,o||null)}else if("documentChange"in e){e.documentChange;const r=e.documentChange;r.document,r.document.name,r.document.updateTime;const i=gU(t,r.document.name),s=Zc(r.document.updateTime),a=r.document.createTime?Zc(r.document.createTime):sn.min(),o=new Io({mapValue:{fields:r.document.fields}}),l=Ra.newFoundDocument(i,s,a,o),u=r.targetIds||[],c=r.removedTargetIds||[];n=new $7(u,c,l.key,l)}else if("documentDelete"in e){e.documentDelete;const r=e.documentDelete;r.document;const i=gU(t,r.document),s=r.readTime?Zc(r.readTime):sn.min(),a=Ra.newNoDocument(i,s),o=r.removedTargetIds||[];n=new $7([],o,a.key,a)}else if("documentRemove"in e){e.documentRemove;const r=e.documentRemove;r.document;const i=gU(t,r.document),s=r.removedTargetIds||[];n=new $7([],s,i,null)}else{if(!("filter"in e))return _t();{e.filter;const r=e.filter;r.targetId;const{count:i=0,unchangedNames:s}=r,a=new CSt(i,s),o=r.targetId;n=new E1e(o,a)}}return n}function BSt(t,e){let n;if(e instanceof hw)n={update:Vee(t,e.key,e.value)};else if(e instanceof RW)n={delete:C4(t,e.key)};else if(e instanceof hm)n={update:Vee(t,e.key,e.data),updateMask:i3t(e.fieldMask)};else{if(!(e instanceof NSt))return _t();n={verify:C4(t,e.key)}}return e.fieldTransforms.length>0&&(n.updateTransforms=e.fieldTransforms.map(r=>function(s,a){const o=a.transform;if(o instanceof $P)return{fieldPath:a.field.canonicalString(),setToServerValue:"REQUEST_TIME"};if(o instanceof G6)return{fieldPath:a.field.canonicalString(),appendMissingElements:{values:o.elements}};if(o instanceof F6)return{fieldPath:a.field.canonicalString(),removeAllFromArray:{values:o.elements}};if(o instanceof eR)return{fieldPath:a.field.canonicalString(),increment:o.Pe};throw _t()}(0,r))),e.precondition.isNone||(n.currentDocument=function(i,s){return s.updateTime!==void 0?{updateTime:ZSt(i,s.updateTime)}:s.exists!==void 0?{exists:s.exists}:_t()}(t,e.precondition)),n}function HSt(t,e){return t&&t.length>0?(Pr(e!==void 0),t.map(n=>function(i,s){let a=i.updateTime?Zc(i.updateTime):Zc(s);return a.isEqual(sn.min())&&(a=Zc(s)),new OSt(a,i.transformResults||[])}(n,e))):[]}function QSt(t,e){return{documents:[V1e(t,e.path)]}}function _St(t,e){const n={structuredQuery:{}},r=e.path;let i;e.collectionGroup!==null?(i=r,n.structuredQuery.from=[{collectionId:e.collectionGroup,allDescendants:!0}]):(i=r.popLast(),n.structuredQuery.from=[{collectionId:r.lastSegment()}]),n.parent=V1e(t,i);const s=function(u){if(u.length!==0)return O1e(Gu.create(u,"and"))}(e.filters);s&&(n.structuredQuery.where=s);const a=function(u){if(u.length!==0)return u.map(c=>function(f){return{field:t1(f.field),direction:t3t(f.dir)}}(c))}(e.orderBy);a&&(n.structuredQuery.orderBy=a);const o=L4(t,e.limit);return o!==null&&(n.structuredQuery.limit=o),e.startAt&&(n.structuredQuery.startAt=function(u){return{before:u.inclusive,values:u.position}}(e.startAt)),e.endAt&&(n.structuredQuery.endAt=function(u){return{before:!u.inclusive,values:u.position}}(e.endAt)),{_t:n,parent:i}}function $St(t){let e=JSt(t.parent);const n=t.structuredQuery,r=n.from?n.from.length:0;let i=null;if(r>0){Pr(r===1);const c=n.from[0];c.allDescendants?i=c.collectionId:e=e.child(c.collectionId)}let s=[];n.where&&(s=function(d){const f=k1e(d);return f instanceof Gu&&s1e(f)?f.getFilters():[f]}(n.where));let a=[];n.orderBy&&(a=function(d){return d.map(f=>function(p){return new A6(n1(p.field),function(v){switch(v){case"ASCENDING":return"asc";case"DESCENDING":return"desc";default:return}}(p.direction))}(f))}(n.orderBy));let o=null;n.limit&&(o=function(d){let f;return f=typeof d=="object"?d.value:d,L9(f)?null:f}(n.limit));let l=null;n.startAt&&(l=function(d){const f=!!d.before,h=d.values||[];return new QP(h,f)}(n.startAt));let u=null;return n.endAt&&(u=function(d){const f=!d.before,h=d.values||[];return new QP(h,f)}(n.endAt)),bSt(e,i,a,s,o,"F",l,u)}function e3t(t,e){const n=function(i){switch(i){case"TargetPurposeListen":return null;case"TargetPurposeExistenceFilterMismatch":return"existence-filter-mismatch";case"TargetPurposeExistenceFilterMismatchBloom":return"existence-filter-mismatch-bloom";case"TargetPurposeLimboResolution":return"limbo-document";default:return _t()}}(e.purpose);return n==null?null:{"goog-listen-tags":n}}function k1e(t){return t.unaryFilter!==void 0?function(n){switch(n.unaryFilter.op){case"IS_NAN":const r=n1(n.unaryFilter.field);return is.create(r,"==",{doubleValue:NaN});case"IS_NULL":const i=n1(n.unaryFilter.field);return is.create(i,"==",{nullValue:"NULL_VALUE"});case"IS_NOT_NAN":const s=n1(n.unaryFilter.field);return is.create(s,"!=",{doubleValue:NaN});case"IS_NOT_NULL":const a=n1(n.unaryFilter.field);return is.create(a,"!=",{nullValue:"NULL_VALUE"});default:return _t()}}(t):t.fieldFilter!==void 0?function(n){return is.create(n1(n.fieldFilter.field),function(i){switch(i){case"EQUAL":return"==";case"NOT_EQUAL":return"!=";case"GREATER_THAN":return">";case"GREATER_THAN_OR_EQUAL":return">=";case"LESS_THAN":return"<";case"LESS_THAN_OR_EQUAL":return"<=";case"ARRAY_CONTAINS":return"array-contains";case"IN":return"in";case"NOT_IN":return"not-in";case"ARRAY_CONTAINS_ANY":return"array-contains-any";default:return _t()}}(n.fieldFilter.op),n.fieldFilter.value)}(t):t.compositeFilter!==void 0?function(n){return Gu.create(n.compositeFilter.filters.map(r=>k1e(r)),function(i){switch(i){case"AND":return"and";case"OR":return"or";default:return _t()}}(n.compositeFilter.op))}(t):_t()}function t3t(t){return ASt[t]}function n3t(t){return GSt[t]}function r3t(t){return FSt[t]}function t1(t){return{fieldPath:t.canonicalString()}}function n1(t){return ta.fromServerFormat(t.fieldPath)}function O1e(t){return t instanceof is?function(n){if(n.op==="=="){if(pee(n.value))return{unaryFilter:{field:t1(n.field),op:"IS_NAN"}};if(hee(n.value))return{unaryFilter:{field:t1(n.field),op:"IS_NULL"}}}else if(n.op==="!="){if(pee(n.value))return{unaryFilter:{field:t1(n.field),op:"IS_NOT_NAN"}};if(hee(n.value))return{unaryFilter:{field:t1(n.field),op:"IS_NOT_NULL"}}}return{fieldFilter:{field:t1(n.field),op:n3t(n.op),value:n.value}}}(t):t instanceof Gu?function(n){const r=n.getFilters().map(i=>O1e(i));return r.length===1?r[0]:{compositeFilter:{op:r3t(n.op),filters:r}}}(t):_t()}function i3t(t){const e=[];return t.fields.forEach(n=>e.push(n.canonicalString())),{fieldPaths:e}}function I1e(t){return t.length>=4&&t.get(0)==="projects"&&t.get(2)==="databases"}/** + */class $7{constructor(e,n,r,i){this.Re=e,this.removedTargetIds=n,this.key=r,this.Ve=i}}class w1e{constructor(e,n){this.targetId=e,this.me=n}}class E1e{constructor(e,n,r=ua.EMPTY_BYTE_STRING,i=null){this.state=e,this.targetIds=n,this.resumeToken=r,this.cause=i}}class wee{constructor(){this.fe=0,this.ge=Mee(),this.pe=ua.EMPTY_BYTE_STRING,this.ye=!1,this.we=!0}get current(){return this.ye}get resumeToken(){return this.pe}get Se(){return this.fe!==0}get be(){return this.we}De(e){e.approximateByteSize()>0&&(this.we=!0,this.pe=e)}ve(){let e=Ln(),n=Ln(),r=Ln();return this.ge.forEach((i,s)=>{switch(s){case 0:e=e.add(i);break;case 2:n=n.add(i);break;case 1:r=r.add(i);break;default:_t()}}),new pw(this.pe,this.ye,e,n,r)}Ce(){this.we=!1,this.ge=Mee()}Fe(e,n){this.we=!0,this.ge=this.ge.insert(e,n)}Me(e){this.we=!0,this.ge=this.ge.remove(e)}xe(){this.fe+=1}Oe(){this.fe-=1,Pr(this.fe>=0)}Ne(){this.we=!0,this.ye=!0}}class ASt{constructor(e){this.Le=e,this.Be=new Map,this.ke=Of(),this.qe=Eee(),this.Qe=new Ri(rr)}Ke(e){for(const n of e.Re)e.Ve&&e.Ve.isFoundDocument()?this.$e(n,e.Ve):this.Ue(n,e.key,e.Ve);for(const n of e.removedTargetIds)this.Ue(n,e.key,e.Ve)}We(e){this.forEachTarget(e,n=>{const r=this.Ge(n);switch(e.state){case 0:this.ze(n)&&r.De(e.resumeToken);break;case 1:r.Oe(),r.Se||r.Ce(),r.De(e.resumeToken);break;case 2:r.Oe(),r.Se||this.removeTarget(n);break;case 3:this.ze(n)&&(r.Ne(),r.De(e.resumeToken));break;case 4:this.ze(n)&&(this.je(n),r.De(e.resumeToken));break;default:_t()}})}forEachTarget(e,n){e.targetIds.length>0?e.targetIds.forEach(n):this.Be.forEach((r,i)=>{this.ze(i)&&n(i)})}He(e){const n=e.targetId,r=e.me.count,i=this.Je(n);if(i){const s=i.target;if(U4(s))if(r===0){const a=new Ft(s.path);this.Ue(n,a,Ra.newNoDocument(a,sn.min()))}else Pr(r===1);else{const a=this.Ye(n);if(a!==r){const o=this.Ze(e),l=o?this.Xe(o,e,a):1;if(l!==0){this.je(n);const u=l===2?"TargetPurposeExistenceFilterMismatchBloom":"TargetPurposeExistenceFilterMismatch";this.Qe=this.Qe.insert(n,u)}}}}}Ze(e){const n=e.me.unchangedNames;if(!n||!n.bits)return null;const{bits:{bitmap:r="",padding:i=0},hashCount:s=0}=n;let a,o;try{a=_v(r).toUint8Array()}catch(l){if(l instanceof e1e)return Kb("Decoding the base64 bloom filter in existence filter failed ("+l.message+"); ignoring the bloom filter and falling back to full re-query."),null;throw l}try{o=new kW(a,i,s)}catch(l){return Kb(l instanceof R3?"BloomFilter error: ":"Applying bloom filter failed: ",l),null}return o.Ie===0?null:o}Xe(e,n,r){return n.me.count===r-this.nt(e,n.targetId)?0:2}nt(e,n){const r=this.Le.getRemoteKeysForTarget(n);let i=0;return r.forEach(s=>{const a=this.Le.tt(),o=`projects/${a.projectId}/databases/${a.database}/documents/${s.path.canonicalString()}`;e.mightContain(o)||(this.Ue(n,s,null),i++)}),i}rt(e){const n=new Map;this.Be.forEach((s,a)=>{const o=this.Je(a);if(o){if(s.current&&U4(o.target)){const l=new Ft(o.target.path);this.ke.get(l)!==null||this.it(a,l)||this.Ue(a,l,Ra.newNoDocument(l,e))}s.be&&(n.set(a,s.ve()),s.Ce())}});let r=Ln();this.qe.forEach((s,a)=>{let o=!0;a.forEachWhile(l=>{const u=this.Je(l);return!u||u.purpose==="TargetPurposeLimboResolution"||(o=!1,!1)}),o&&(r=r.add(s))}),this.ke.forEach((s,a)=>a.setReadTime(e));const i=new D9(e,n,this.Qe,this.ke,r);return this.ke=Of(),this.qe=Eee(),this.Qe=new Ri(rr),i}$e(e,n){if(!this.ze(e))return;const r=this.it(e,n.key)?2:0;this.Ge(e).Fe(n.key,r),this.ke=this.ke.insert(n.key,n),this.qe=this.qe.insert(n.key,this.st(n.key).add(e))}Ue(e,n,r){if(!this.ze(e))return;const i=this.Ge(e);this.it(e,n)?i.Fe(n,1):i.Me(n),this.qe=this.qe.insert(n,this.st(n).delete(e)),r&&(this.ke=this.ke.insert(n,r))}removeTarget(e){this.Be.delete(e)}Ye(e){const n=this.Ge(e).ve();return this.Le.getRemoteKeysForTarget(e).size+n.addedDocuments.size-n.removedDocuments.size}xe(e){this.Ge(e).xe()}Ge(e){let n=this.Be.get(e);return n||(n=new wee,this.Be.set(e,n)),n}st(e){let n=this.qe.get(e);return n||(n=new aa(rr),this.qe=this.qe.insert(e,n)),n}ze(e){const n=this.Je(e)!==null;return n||It("WatchChangeAggregator","Detected inactive target",e),n}Je(e){const n=this.Be.get(e);return n&&n.Se?null:this.Le.ot(e)}je(e){this.Be.set(e,new wee),this.Le.getRemoteKeysForTarget(e).forEach(n=>{this.Ue(e,n,null)})}it(e,n){return this.Le.getRemoteKeysForTarget(e).has(n)}}function Eee(){return new Ri(Ft.comparator)}function Mee(){return new Ri(Ft.comparator)}const GSt=(()=>({asc:"ASCENDING",desc:"DESCENDING"}))(),FSt=(()=>({"<":"LESS_THAN","<=":"LESS_THAN_OR_EQUAL",">":"GREATER_THAN",">=":"GREATER_THAN_OR_EQUAL","==":"EQUAL","!=":"NOT_EQUAL","array-contains":"ARRAY_CONTAINS",in:"IN","not-in":"NOT_IN","array-contains-any":"ARRAY_CONTAINS_ANY"}))(),jSt=(()=>({and:"AND",or:"OR"}))();class ZSt{constructor(e,n){this.databaseId=e,this.useProto3Json=n}}function L4(t,e){return t.useProto3Json||L9(e)?e:{value:e}}function eR(t,e){return t.useProto3Json?`${new Date(1e3*e.seconds).toISOString().replace(/\.\d*/,"").replace("Z","")}.${("000000000"+e.nanoseconds).slice(-9)}Z`:{seconds:""+e.seconds,nanos:e.nanoseconds}}function M1e(t,e){return t.useProto3Json?e.toBase64():e.toUint8Array()}function JSt(t,e){return eR(t,e.toTimestamp())}function Zc(t){return Pr(!!t),sn.fromTimestamp(function(n){const r=Fp(n);return new Es(r.seconds,r.nanos)}(t))}function OW(t,e){return X4(t,e).canonicalString()}function X4(t,e){const n=function(i){return new ii(["projects",i.projectId,"databases",i.database])}(t).child("documents");return e===void 0?n:n.child(e)}function P1e(t){const e=ii.fromString(t);return Pr(O1e(e)),e}function C4(t,e){return OW(t.databaseId,e.path)}function gU(t,e){const n=P1e(e);if(n.get(1)!==t.databaseId.projectId)throw new Et(nt.INVALID_ARGUMENT,"Tried to deserialize key from different project: "+n.get(1)+" vs "+t.databaseId.projectId);if(n.get(3)!==t.databaseId.database)throw new Et(nt.INVALID_ARGUMENT,"Tried to deserialize key from different database: "+n.get(3)+" vs "+t.databaseId.database);return new Ft(V1e(n))}function R1e(t,e){return OW(t.databaseId,e)}function YSt(t){const e=P1e(t);return e.length===4?ii.emptyPath():V1e(e)}function K4(t){return new ii(["projects",t.databaseId.projectId,"databases",t.databaseId.database]).canonicalString()}function V1e(t){return Pr(t.length>4&&t.get(4)==="documents"),t.popFirst(5)}function Pee(t,e,n){return{name:C4(t,e),fields:n.value.mapValue.fields}}function BSt(t,e){let n;if("targetChange"in e){e.targetChange;const r=function(u){return u==="NO_CHANGE"?0:u==="ADD"?1:u==="REMOVE"?2:u==="CURRENT"?3:u==="RESET"?4:_t()}(e.targetChange.targetChangeType||"NO_CHANGE"),i=e.targetChange.targetIds||[],s=function(u,c){return u.useProto3Json?(Pr(c===void 0||typeof c=="string"),ua.fromBase64String(c||"")):(Pr(c===void 0||c instanceof Buffer||c instanceof Uint8Array),ua.fromUint8Array(c||new Uint8Array))}(t,e.targetChange.resumeToken),a=e.targetChange.cause,o=a&&function(u){const c=u.code===void 0?nt.UNKNOWN:T1e(u.code);return new Et(c,u.message||"")}(a);n=new E1e(r,i,s,o||null)}else if("documentChange"in e){e.documentChange;const r=e.documentChange;r.document,r.document.name,r.document.updateTime;const i=gU(t,r.document.name),s=Zc(r.document.updateTime),a=r.document.createTime?Zc(r.document.createTime):sn.min(),o=new Oo({mapValue:{fields:r.document.fields}}),l=Ra.newFoundDocument(i,s,a,o),u=r.targetIds||[],c=r.removedTargetIds||[];n=new $7(u,c,l.key,l)}else if("documentDelete"in e){e.documentDelete;const r=e.documentDelete;r.document;const i=gU(t,r.document),s=r.readTime?Zc(r.readTime):sn.min(),a=Ra.newNoDocument(i,s),o=r.removedTargetIds||[];n=new $7([],o,a.key,a)}else if("documentRemove"in e){e.documentRemove;const r=e.documentRemove;r.document;const i=gU(t,r.document),s=r.removedTargetIds||[];n=new $7([],s,i,null)}else{if(!("filter"in e))return _t();{e.filter;const r=e.filter;r.targetId;const{count:i=0,unchangedNames:s}=r,a=new KSt(i,s),o=r.targetId;n=new w1e(o,a)}}return n}function HSt(t,e){let n;if(e instanceof hw)n={update:Pee(t,e.key,e.value)};else if(e instanceof VW)n={delete:C4(t,e.key)};else if(e instanceof hm)n={update:Pee(t,e.key,e.data),updateMask:s3t(e.fieldMask)};else{if(!(e instanceof LSt))return _t();n={verify:C4(t,e.key)}}return e.fieldTransforms.length>0&&(n.updateTransforms=e.fieldTransforms.map(r=>function(s,a){const o=a.transform;if(o instanceof _P)return{fieldPath:a.field.canonicalString(),setToServerValue:"REQUEST_TIME"};if(o instanceof A6)return{fieldPath:a.field.canonicalString(),appendMissingElements:{values:o.elements}};if(o instanceof G6)return{fieldPath:a.field.canonicalString(),removeAllFromArray:{values:o.elements}};if(o instanceof $P)return{fieldPath:a.field.canonicalString(),increment:o.Pe};throw _t()}(0,r))),e.precondition.isNone||(n.currentDocument=function(i,s){return s.updateTime!==void 0?{updateTime:JSt(i,s.updateTime)}:s.exists!==void 0?{exists:s.exists}:_t()}(t,e.precondition)),n}function QSt(t,e){return t&&t.length>0?(Pr(e!==void 0),t.map(n=>function(i,s){let a=i.updateTime?Zc(i.updateTime):Zc(s);return a.isEqual(sn.min())&&(a=Zc(s)),new ISt(a,i.transformResults||[])}(n,e))):[]}function _St(t,e){return{documents:[R1e(t,e.path)]}}function $St(t,e){const n={structuredQuery:{}},r=e.path;let i;e.collectionGroup!==null?(i=r,n.structuredQuery.from=[{collectionId:e.collectionGroup,allDescendants:!0}]):(i=r.popLast(),n.structuredQuery.from=[{collectionId:r.lastSegment()}]),n.parent=R1e(t,i);const s=function(u){if(u.length!==0)return k1e(Gu.create(u,"and"))}(e.filters);s&&(n.structuredQuery.where=s);const a=function(u){if(u.length!==0)return u.map(c=>function(f){return{field:t1(f.field),direction:n3t(f.dir)}}(c))}(e.orderBy);a&&(n.structuredQuery.orderBy=a);const o=L4(t,e.limit);return o!==null&&(n.structuredQuery.limit=o),e.startAt&&(n.structuredQuery.startAt=function(u){return{before:u.inclusive,values:u.position}}(e.startAt)),e.endAt&&(n.structuredQuery.endAt=function(u){return{before:!u.inclusive,values:u.position}}(e.endAt)),{_t:n,parent:i}}function e3t(t){let e=YSt(t.parent);const n=t.structuredQuery,r=n.from?n.from.length:0;let i=null;if(r>0){Pr(r===1);const c=n.from[0];c.allDescendants?i=c.collectionId:e=e.child(c.collectionId)}let s=[];n.where&&(s=function(d){const f=z1e(d);return f instanceof Gu&&i1e(f)?f.getFilters():[f]}(n.where));let a=[];n.orderBy&&(a=function(d){return d.map(f=>function(p){return new W6(n1(p.field),function(v){switch(v){case"ASCENDING":return"asc";case"DESCENDING":return"desc";default:return}}(p.direction))}(f))}(n.orderBy));let o=null;n.limit&&(o=function(d){let f;return f=typeof d=="object"?d.value:d,L9(f)?null:f}(n.limit));let l=null;n.startAt&&(l=function(d){const f=!!d.before,h=d.values||[];return new HP(h,f)}(n.startAt));let u=null;return n.endAt&&(u=function(d){const f=!d.before,h=d.values||[];return new HP(h,f)}(n.endAt)),ySt(e,i,a,s,o,"F",l,u)}function t3t(t,e){const n=function(i){switch(i){case"TargetPurposeListen":return null;case"TargetPurposeExistenceFilterMismatch":return"existence-filter-mismatch";case"TargetPurposeExistenceFilterMismatchBloom":return"existence-filter-mismatch-bloom";case"TargetPurposeLimboResolution":return"limbo-document";default:return _t()}}(e.purpose);return n==null?null:{"goog-listen-tags":n}}function z1e(t){return t.unaryFilter!==void 0?function(n){switch(n.unaryFilter.op){case"IS_NAN":const r=n1(n.unaryFilter.field);return is.create(r,"==",{doubleValue:NaN});case"IS_NULL":const i=n1(n.unaryFilter.field);return is.create(i,"==",{nullValue:"NULL_VALUE"});case"IS_NOT_NAN":const s=n1(n.unaryFilter.field);return is.create(s,"!=",{doubleValue:NaN});case"IS_NOT_NULL":const a=n1(n.unaryFilter.field);return is.create(a,"!=",{nullValue:"NULL_VALUE"});default:return _t()}}(t):t.fieldFilter!==void 0?function(n){return is.create(n1(n.fieldFilter.field),function(i){switch(i){case"EQUAL":return"==";case"NOT_EQUAL":return"!=";case"GREATER_THAN":return">";case"GREATER_THAN_OR_EQUAL":return">=";case"LESS_THAN":return"<";case"LESS_THAN_OR_EQUAL":return"<=";case"ARRAY_CONTAINS":return"array-contains";case"IN":return"in";case"NOT_IN":return"not-in";case"ARRAY_CONTAINS_ANY":return"array-contains-any";default:return _t()}}(n.fieldFilter.op),n.fieldFilter.value)}(t):t.compositeFilter!==void 0?function(n){return Gu.create(n.compositeFilter.filters.map(r=>z1e(r)),function(i){switch(i){case"AND":return"and";case"OR":return"or";default:return _t()}}(n.compositeFilter.op))}(t):_t()}function n3t(t){return GSt[t]}function r3t(t){return FSt[t]}function i3t(t){return jSt[t]}function t1(t){return{fieldPath:t.canonicalString()}}function n1(t){return ta.fromServerFormat(t.fieldPath)}function k1e(t){return t instanceof is?function(n){if(n.op==="=="){if(fee(n.value))return{unaryFilter:{field:t1(n.field),op:"IS_NAN"}};if(dee(n.value))return{unaryFilter:{field:t1(n.field),op:"IS_NULL"}}}else if(n.op==="!="){if(fee(n.value))return{unaryFilter:{field:t1(n.field),op:"IS_NOT_NAN"}};if(dee(n.value))return{unaryFilter:{field:t1(n.field),op:"IS_NOT_NULL"}}}return{fieldFilter:{field:t1(n.field),op:r3t(n.op),value:n.value}}}(t):t instanceof Gu?function(n){const r=n.getFilters().map(i=>k1e(i));return r.length===1?r[0]:{compositeFilter:{op:i3t(n.op),filters:r}}}(t):_t()}function s3t(t){const e=[];return t.fields.forEach(n=>e.push(n.canonicalString())),{fieldPaths:e}}function O1e(t){return t.length>=4&&t.get(0)==="projects"&&t.get(2)==="databases"}/** * @license * Copyright 2017 Google LLC * @@ -8719,7 +8719,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class s3t{constructor(e){this.ct=e}}function a3t(t){const e=$St({parent:t.parent,structuredQuery:t.structuredQuery});return t.limitType==="LAST"?_P(e,e.limit,"L"):e}/** + */class a3t{constructor(e){this.ct=e}}function o3t(t){const e=e3t({parent:t.parent,structuredQuery:t.structuredQuery});return t.limitType==="LAST"?QP(e,e.limit,"L"):e}/** * @license * Copyright 2019 Google LLC * @@ -8734,7 +8734,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class o3t{constructor(){this.un=new l3t}addToCollectionParentIndex(e,n){return this.un.add(n),at.resolve()}getCollectionParents(e,n){return at.resolve(this.un.getEntries(n))}addFieldIndex(e,n){return at.resolve()}deleteFieldIndex(e,n){return at.resolve()}deleteAllFieldIndexes(e){return at.resolve()}createTargetIndexes(e,n){return at.resolve()}getDocumentsMatchingTarget(e,n){return at.resolve(null)}getIndexType(e,n){return at.resolve(0)}getFieldIndexes(e,n){return at.resolve([])}getNextCollectionGroupToUpdate(e){return at.resolve(null)}getMinOffset(e,n){return at.resolve(Gp.min())}getMinOffsetFromCollectionGroup(e,n){return at.resolve(Gp.min())}updateCollectionGroup(e,n,r){return at.resolve()}updateIndexEntries(e,n){return at.resolve()}}class l3t{constructor(){this.index={}}add(e){const n=e.lastSegment(),r=e.popLast(),i=this.index[n]||new aa(ii.comparator),s=!i.has(r);return this.index[n]=i.add(r),s}has(e){const n=e.lastSegment(),r=e.popLast(),i=this.index[n];return i&&i.has(r)}getEntries(e){return(this.index[e]||new aa(ii.comparator)).toArray()}}/** + */class l3t{constructor(){this.un=new u3t}addToCollectionParentIndex(e,n){return this.un.add(n),at.resolve()}getCollectionParents(e,n){return at.resolve(this.un.getEntries(n))}addFieldIndex(e,n){return at.resolve()}deleteFieldIndex(e,n){return at.resolve()}deleteAllFieldIndexes(e){return at.resolve()}createTargetIndexes(e,n){return at.resolve()}getDocumentsMatchingTarget(e,n){return at.resolve(null)}getIndexType(e,n){return at.resolve(0)}getFieldIndexes(e,n){return at.resolve([])}getNextCollectionGroupToUpdate(e){return at.resolve(null)}getMinOffset(e,n){return at.resolve(Gp.min())}getMinOffsetFromCollectionGroup(e,n){return at.resolve(Gp.min())}updateCollectionGroup(e,n,r){return at.resolve()}updateIndexEntries(e,n){return at.resolve()}}class u3t{constructor(){this.index={}}add(e){const n=e.lastSegment(),r=e.popLast(),i=this.index[n]||new aa(ii.comparator),s=!i.has(r);return this.index[n]=i.add(r),s}has(e){const n=e.lastSegment(),r=e.popLast(),i=this.index[n];return i&&i.has(r)}getEntries(e){return(this.index[e]||new aa(ii.comparator)).toArray()}}/** * @license * Copyright 2017 Google LLC * @@ -8764,7 +8764,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class u3t{constructor(){this.changes=new Hy(e=>e.toString(),(e,n)=>e.isEqual(n)),this.changesApplied=!1}addEntry(e){this.assertNotApplied(),this.changes.set(e.key,e)}removeEntry(e,n){this.assertNotApplied(),this.changes.set(e,Ra.newInvalidDocument(e).setReadTime(n))}getEntry(e,n){this.assertNotApplied();const r=this.changes.get(n);return r!==void 0?at.resolve(r):this.getFromCache(e,n)}getEntries(e,n){return this.getAllFromCache(e,n)}apply(e){return this.assertNotApplied(),this.changesApplied=!0,this.applyChanges(e)}assertNotApplied(){}}/** + */class c3t{constructor(){this.changes=new By(e=>e.toString(),(e,n)=>e.isEqual(n)),this.changesApplied=!1}addEntry(e){this.assertNotApplied(),this.changes.set(e.key,e)}removeEntry(e,n){this.assertNotApplied(),this.changes.set(e,Ra.newInvalidDocument(e).setReadTime(n))}getEntry(e,n){this.assertNotApplied();const r=this.changes.get(n);return r!==void 0?at.resolve(r):this.getFromCache(e,n)}getEntries(e,n){return this.getAllFromCache(e,n)}apply(e){return this.assertNotApplied(),this.changesApplied=!0,this.applyChanges(e)}assertNotApplied(){}}/** * @license * Copyright 2017 Google LLC * @@ -8794,7 +8794,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class c3t{constructor(e,n){this.overlayedDocument=e,this.mutatedFields=n}}/** + */class d3t{constructor(e,n){this.overlayedDocument=e,this.mutatedFields=n}}/** * @license * Copyright 2017 Google LLC * @@ -8809,7 +8809,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class d3t{constructor(e,n,r,i){this.remoteDocumentCache=e,this.mutationQueue=n,this.documentOverlayCache=r,this.indexManager=i}getDocument(e,n){let r=null;return this.documentOverlayCache.getOverlay(e,n).next(i=>(r=i,this.remoteDocumentCache.getEntry(e,n))).next(i=>(r!==null&&wx(r.mutation,i,ul.empty(),Es.now()),i))}getDocuments(e,n){return this.remoteDocumentCache.getEntries(e,n).next(r=>this.getLocalViewOfDocuments(e,r,Nn()).next(()=>r))}getLocalViewOfDocuments(e,n,r=Nn()){const i=vv();return this.populateOverlays(e,i,n).next(()=>this.computeViews(e,n,i,r).next(s=>{let a=R3();return s.forEach((o,l)=>{a=a.insert(o,l.overlayedDocument)}),a}))}getOverlayedDocuments(e,n){const r=vv();return this.populateOverlays(e,r,n).next(()=>this.computeViews(e,n,r,Nn()))}populateOverlays(e,n,r){const i=[];return r.forEach(s=>{n.has(s)||i.push(s)}),this.documentOverlayCache.getOverlays(e,i).next(s=>{s.forEach((a,o)=>{n.set(a,o)})})}computeViews(e,n,r,i){let s=Of();const a=Tx(),o=function(){return Tx()}();return n.forEach((l,u)=>{const c=r.get(u.key);i.has(u.key)&&(c===void 0||c.mutation instanceof hm)?s=s.insert(u.key,u):c!==void 0?(a.set(u.key,c.mutation.getFieldMask()),wx(c.mutation,u,c.mutation.getFieldMask(),Es.now())):a.set(u.key,ul.empty())}),this.recalculateAndSaveOverlays(e,s).next(l=>(l.forEach((u,c)=>a.set(u,c)),n.forEach((u,c)=>{var d;return o.set(u,new c3t(c,(d=a.get(u))!==null&&d!==void 0?d:null))}),o))}recalculateAndSaveOverlays(e,n){const r=Tx();let i=new Ri((a,o)=>a-o),s=Nn();return this.mutationQueue.getAllMutationBatchesAffectingDocumentKeys(e,n).next(a=>{for(const o of a)o.keys().forEach(l=>{const u=n.get(l);if(u===null)return;let c=r.get(l)||ul.empty();c=o.applyToLocalView(u,c),r.set(l,c);const d=(i.get(o.batchId)||Nn()).add(l);i=i.insert(o.batchId,d)})}).next(()=>{const a=[],o=i.getReverseIterator();for(;o.hasNext();){const l=o.getNext(),u=l.key,c=l.value,d=m1e();c.forEach(f=>{if(!s.has(f)){const h=x1e(n.get(f),r.get(f));h!==null&&d.set(f,h),s=s.add(f)}}),a.push(this.documentOverlayCache.saveOverlays(e,u,d))}return at.waitFor(a)}).next(()=>r)}recalculateAndSaveOverlaysForDocumentKeys(e,n){return this.remoteDocumentCache.getEntries(e,n).next(r=>this.recalculateAndSaveOverlays(e,r))}getDocumentsMatchingQuery(e,n,r,i){return function(a){return Ft.isDocumentKey(a.path)&&a.collectionGroup===null&&a.filters.length===0}(n)?this.getDocumentsMatchingDocumentQuery(e,n.path):c1e(n)?this.getDocumentsMatchingCollectionGroupQuery(e,n,r,i):this.getDocumentsMatchingCollectionQuery(e,n,r,i)}getNextDocuments(e,n,r,i){return this.remoteDocumentCache.getAllFromCollectionGroup(e,n,r,i).next(s=>{const a=i-s.size>0?this.documentOverlayCache.getOverlaysForCollectionGroup(e,n,r.largestBatchId,i-s.size):at.resolve(vv());let o=-1,l=s;return a.next(u=>at.forEach(u,(c,d)=>(o{l=l.insert(c,f)}))).next(()=>this.populateOverlays(e,u,s)).next(()=>this.computeViews(e,l,u,Nn())).next(c=>({batchId:o,changes:p1e(c)})))})}getDocumentsMatchingDocumentQuery(e,n){return this.getDocument(e,new Ft(n)).next(r=>{let i=R3();return r.isFoundDocument()&&(i=i.insert(r.key,r)),i})}getDocumentsMatchingCollectionGroupQuery(e,n,r,i){const s=n.collectionGroup;let a=R3();return this.indexManager.getCollectionParents(e,s).next(o=>at.forEach(o,l=>{const u=function(d,f){return new By(f,null,d.explicitOrderBy.slice(),d.filters.slice(),d.limit,d.limitType,d.startAt,d.endAt)}(n,l.child(s));return this.getDocumentsMatchingCollectionQuery(e,u,r,i).next(c=>{c.forEach((d,f)=>{a=a.insert(d,f)})})}).next(()=>a))}getDocumentsMatchingCollectionQuery(e,n,r,i){let s;return this.documentOverlayCache.getOverlaysForCollection(e,n.path,r.largestBatchId).next(a=>(s=a,this.remoteDocumentCache.getDocumentsMatchingQuery(e,n,r,s,i))).next(a=>{s.forEach((l,u)=>{const c=u.getKey();a.get(c)===null&&(a=a.insert(c,Ra.newInvalidDocument(c)))});let o=R3();return a.forEach((l,u)=>{const c=s.get(l);c!==void 0&&wx(c.mutation,u,ul.empty(),Es.now()),C9(n,u)&&(o=o.insert(l,u))}),o})}}/** + */class f3t{constructor(e,n,r,i){this.remoteDocumentCache=e,this.mutationQueue=n,this.documentOverlayCache=r,this.indexManager=i}getDocument(e,n){let r=null;return this.documentOverlayCache.getOverlay(e,n).next(i=>(r=i,this.remoteDocumentCache.getEntry(e,n))).next(i=>(r!==null&&Tx(r.mutation,i,ll.empty(),Es.now()),i))}getDocuments(e,n){return this.remoteDocumentCache.getEntries(e,n).next(r=>this.getLocalViewOfDocuments(e,r,Ln()).next(()=>r))}getLocalViewOfDocuments(e,n,r=Ln()){const i=vv();return this.populateOverlays(e,i,n).next(()=>this.computeViews(e,n,i,r).next(s=>{let a=P3();return s.forEach((o,l)=>{a=a.insert(o,l.overlayedDocument)}),a}))}getOverlayedDocuments(e,n){const r=vv();return this.populateOverlays(e,r,n).next(()=>this.computeViews(e,n,r,Ln()))}populateOverlays(e,n,r){const i=[];return r.forEach(s=>{n.has(s)||i.push(s)}),this.documentOverlayCache.getOverlays(e,i).next(s=>{s.forEach((a,o)=>{n.set(a,o)})})}computeViews(e,n,r,i){let s=Of();const a=xx(),o=function(){return xx()}();return n.forEach((l,u)=>{const c=r.get(u.key);i.has(u.key)&&(c===void 0||c.mutation instanceof hm)?s=s.insert(u.key,u):c!==void 0?(a.set(u.key,c.mutation.getFieldMask()),Tx(c.mutation,u,c.mutation.getFieldMask(),Es.now())):a.set(u.key,ll.empty())}),this.recalculateAndSaveOverlays(e,s).next(l=>(l.forEach((u,c)=>a.set(u,c)),n.forEach((u,c)=>{var d;return o.set(u,new d3t(c,(d=a.get(u))!==null&&d!==void 0?d:null))}),o))}recalculateAndSaveOverlays(e,n){const r=xx();let i=new Ri((a,o)=>a-o),s=Ln();return this.mutationQueue.getAllMutationBatchesAffectingDocumentKeys(e,n).next(a=>{for(const o of a)o.keys().forEach(l=>{const u=n.get(l);if(u===null)return;let c=r.get(l)||ll.empty();c=o.applyToLocalView(u,c),r.set(l,c);const d=(i.get(o.batchId)||Ln()).add(l);i=i.insert(o.batchId,d)})}).next(()=>{const a=[],o=i.getReverseIterator();for(;o.hasNext();){const l=o.getNext(),u=l.key,c=l.value,d=p1e();c.forEach(f=>{if(!s.has(f)){const h=S1e(n.get(f),r.get(f));h!==null&&d.set(f,h),s=s.add(f)}}),a.push(this.documentOverlayCache.saveOverlays(e,u,d))}return at.waitFor(a)}).next(()=>r)}recalculateAndSaveOverlaysForDocumentKeys(e,n){return this.remoteDocumentCache.getEntries(e,n).next(r=>this.recalculateAndSaveOverlays(e,r))}getDocumentsMatchingQuery(e,n,r,i){return function(a){return Ft.isDocumentKey(a.path)&&a.collectionGroup===null&&a.filters.length===0}(n)?this.getDocumentsMatchingDocumentQuery(e,n.path):u1e(n)?this.getDocumentsMatchingCollectionGroupQuery(e,n,r,i):this.getDocumentsMatchingCollectionQuery(e,n,r,i)}getNextDocuments(e,n,r,i){return this.remoteDocumentCache.getAllFromCollectionGroup(e,n,r,i).next(s=>{const a=i-s.size>0?this.documentOverlayCache.getOverlaysForCollectionGroup(e,n,r.largestBatchId,i-s.size):at.resolve(vv());let o=-1,l=s;return a.next(u=>at.forEach(u,(c,d)=>(o{l=l.insert(c,f)}))).next(()=>this.populateOverlays(e,u,s)).next(()=>this.computeViews(e,l,u,Ln())).next(c=>({batchId:o,changes:h1e(c)})))})}getDocumentsMatchingDocumentQuery(e,n){return this.getDocument(e,new Ft(n)).next(r=>{let i=P3();return r.isFoundDocument()&&(i=i.insert(r.key,r)),i})}getDocumentsMatchingCollectionGroupQuery(e,n,r,i){const s=n.collectionGroup;let a=P3();return this.indexManager.getCollectionParents(e,s).next(o=>at.forEach(o,l=>{const u=function(d,f){return new Yy(f,null,d.explicitOrderBy.slice(),d.filters.slice(),d.limit,d.limitType,d.startAt,d.endAt)}(n,l.child(s));return this.getDocumentsMatchingCollectionQuery(e,u,r,i).next(c=>{c.forEach((d,f)=>{a=a.insert(d,f)})})}).next(()=>a))}getDocumentsMatchingCollectionQuery(e,n,r,i){let s;return this.documentOverlayCache.getOverlaysForCollection(e,n.path,r.largestBatchId).next(a=>(s=a,this.remoteDocumentCache.getDocumentsMatchingQuery(e,n,r,s,i))).next(a=>{s.forEach((l,u)=>{const c=u.getKey();a.get(c)===null&&(a=a.insert(c,Ra.newInvalidDocument(c)))});let o=P3();return a.forEach((l,u)=>{const c=s.get(l);c!==void 0&&Tx(c.mutation,u,ll.empty(),Es.now()),C9(n,u)&&(o=o.insert(l,u))}),o})}}/** * @license * Copyright 2020 Google LLC * @@ -8824,7 +8824,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class f3t{constructor(e){this.serializer=e,this.hr=new Map,this.Pr=new Map}getBundleMetadata(e,n){return at.resolve(this.hr.get(n))}saveBundleMetadata(e,n){return this.hr.set(n.id,function(i){return{id:i.id,version:i.version,createTime:Zc(i.createTime)}}(n)),at.resolve()}getNamedQuery(e,n){return at.resolve(this.Pr.get(n))}saveNamedQuery(e,n){return this.Pr.set(n.name,function(i){return{name:i.name,query:a3t(i.bundledQuery),readTime:Zc(i.readTime)}}(n)),at.resolve()}}/** + */class h3t{constructor(e){this.serializer=e,this.hr=new Map,this.Pr=new Map}getBundleMetadata(e,n){return at.resolve(this.hr.get(n))}saveBundleMetadata(e,n){return this.hr.set(n.id,function(i){return{id:i.id,version:i.version,createTime:Zc(i.createTime)}}(n)),at.resolve()}getNamedQuery(e,n){return at.resolve(this.Pr.get(n))}saveNamedQuery(e,n){return this.Pr.set(n.name,function(i){return{name:i.name,query:o3t(i.bundledQuery),readTime:Zc(i.readTime)}}(n)),at.resolve()}}/** * @license * Copyright 2022 Google LLC * @@ -8839,7 +8839,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class h3t{constructor(){this.overlays=new Ri(Ft.comparator),this.Ir=new Map}getOverlay(e,n){return at.resolve(this.overlays.get(n))}getOverlays(e,n){const r=vv();return at.forEach(n,i=>this.getOverlay(e,i).next(s=>{s!==null&&r.set(i,s)})).next(()=>r)}saveOverlays(e,n,r){return r.forEach((i,s)=>{this.ht(e,n,s)}),at.resolve()}removeOverlaysForBatchId(e,n,r){const i=this.Ir.get(r);return i!==void 0&&(i.forEach(s=>this.overlays=this.overlays.remove(s)),this.Ir.delete(r)),at.resolve()}getOverlaysForCollection(e,n,r){const i=vv(),s=n.length+1,a=new Ft(n.child("")),o=this.overlays.getIteratorFrom(a);for(;o.hasNext();){const l=o.getNext().value,u=l.getKey();if(!n.isPrefixOf(u.path))break;u.path.length===s&&l.largestBatchId>r&&i.set(l.getKey(),l)}return at.resolve(i)}getOverlaysForCollectionGroup(e,n,r,i){let s=new Ri((u,c)=>u-c);const a=this.overlays.getIterator();for(;a.hasNext();){const u=a.getNext().value;if(u.getKey().getCollectionGroup()===n&&u.largestBatchId>r){let c=s.get(u.largestBatchId);c===null&&(c=vv(),s=s.insert(u.largestBatchId,c)),c.set(u.getKey(),u)}}const o=vv(),l=s.getIterator();for(;l.hasNext()&&(l.getNext().value.forEach((u,c)=>o.set(u,c)),!(o.size()>=i)););return at.resolve(o)}ht(e,n,r){const i=this.overlays.get(r.key);if(i!==null){const a=this.Ir.get(i.largestBatchId).delete(r.key);this.Ir.set(i.largestBatchId,a)}this.overlays=this.overlays.insert(r.key,new XSt(n,r));let s=this.Ir.get(n);s===void 0&&(s=Nn(),this.Ir.set(n,s)),this.Ir.set(n,s.add(r.key))}}/** + */class p3t{constructor(){this.overlays=new Ri(Ft.comparator),this.Ir=new Map}getOverlay(e,n){return at.resolve(this.overlays.get(n))}getOverlays(e,n){const r=vv();return at.forEach(n,i=>this.getOverlay(e,i).next(s=>{s!==null&&r.set(i,s)})).next(()=>r)}saveOverlays(e,n,r){return r.forEach((i,s)=>{this.ht(e,n,s)}),at.resolve()}removeOverlaysForBatchId(e,n,r){const i=this.Ir.get(r);return i!==void 0&&(i.forEach(s=>this.overlays=this.overlays.remove(s)),this.Ir.delete(r)),at.resolve()}getOverlaysForCollection(e,n,r){const i=vv(),s=n.length+1,a=new Ft(n.child("")),o=this.overlays.getIteratorFrom(a);for(;o.hasNext();){const l=o.getNext().value,u=l.getKey();if(!n.isPrefixOf(u.path))break;u.path.length===s&&l.largestBatchId>r&&i.set(l.getKey(),l)}return at.resolve(i)}getOverlaysForCollectionGroup(e,n,r,i){let s=new Ri((u,c)=>u-c);const a=this.overlays.getIterator();for(;a.hasNext();){const u=a.getNext().value;if(u.getKey().getCollectionGroup()===n&&u.largestBatchId>r){let c=s.get(u.largestBatchId);c===null&&(c=vv(),s=s.insert(u.largestBatchId,c)),c.set(u.getKey(),u)}}const o=vv(),l=s.getIterator();for(;l.hasNext()&&(l.getNext().value.forEach((u,c)=>o.set(u,c)),!(o.size()>=i)););return at.resolve(o)}ht(e,n,r){const i=this.overlays.get(r.key);if(i!==null){const a=this.Ir.get(i.largestBatchId).delete(r.key);this.Ir.set(i.largestBatchId,a)}this.overlays=this.overlays.insert(r.key,new CSt(n,r));let s=this.Ir.get(n);s===void 0&&(s=Ln(),this.Ir.set(n,s)),this.Ir.set(n,s.add(r.key))}}/** * @license * Copyright 2024 Google LLC * @@ -8854,7 +8854,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class p3t{constructor(){this.sessionToken=ua.EMPTY_BYTE_STRING}getSessionToken(e){return at.resolve(this.sessionToken)}setSessionToken(e,n){return this.sessionToken=n,at.resolve()}}/** + */class m3t{constructor(){this.sessionToken=ua.EMPTY_BYTE_STRING}getSessionToken(e){return at.resolve(this.sessionToken)}setSessionToken(e,n){return this.sessionToken=n,at.resolve()}}/** * @license * Copyright 2017 Google LLC * @@ -8869,7 +8869,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class OW{constructor(){this.Tr=new aa(Us.Er),this.dr=new aa(Us.Ar)}isEmpty(){return this.Tr.isEmpty()}addReference(e,n){const r=new Us(e,n);this.Tr=this.Tr.add(r),this.dr=this.dr.add(r)}Rr(e,n){e.forEach(r=>this.addReference(r,n))}removeReference(e,n){this.Vr(new Us(e,n))}mr(e,n){e.forEach(r=>this.removeReference(r,n))}gr(e){const n=new Ft(new ii([])),r=new Us(n,e),i=new Us(n,e+1),s=[];return this.dr.forEachInRange([r,i],a=>{this.Vr(a),s.push(a.key)}),s}pr(){this.Tr.forEach(e=>this.Vr(e))}Vr(e){this.Tr=this.Tr.delete(e),this.dr=this.dr.delete(e)}yr(e){const n=new Ft(new ii([])),r=new Us(n,e),i=new Us(n,e+1);let s=Nn();return this.dr.forEachInRange([r,i],a=>{s=s.add(a.key)}),s}containsKey(e){const n=new Us(e,0),r=this.Tr.firstAfterOrEqual(n);return r!==null&&e.isEqual(r.key)}}class Us{constructor(e,n){this.key=e,this.wr=n}static Er(e,n){return Ft.comparator(e.key,n.key)||rr(e.wr,n.wr)}static Ar(e,n){return rr(e.wr,n.wr)||Ft.comparator(e.key,n.key)}}/** + */class IW{constructor(){this.Tr=new aa(Us.Er),this.dr=new aa(Us.Ar)}isEmpty(){return this.Tr.isEmpty()}addReference(e,n){const r=new Us(e,n);this.Tr=this.Tr.add(r),this.dr=this.dr.add(r)}Rr(e,n){e.forEach(r=>this.addReference(r,n))}removeReference(e,n){this.Vr(new Us(e,n))}mr(e,n){e.forEach(r=>this.removeReference(r,n))}gr(e){const n=new Ft(new ii([])),r=new Us(n,e),i=new Us(n,e+1),s=[];return this.dr.forEachInRange([r,i],a=>{this.Vr(a),s.push(a.key)}),s}pr(){this.Tr.forEach(e=>this.Vr(e))}Vr(e){this.Tr=this.Tr.delete(e),this.dr=this.dr.delete(e)}yr(e){const n=new Ft(new ii([])),r=new Us(n,e),i=new Us(n,e+1);let s=Ln();return this.dr.forEachInRange([r,i],a=>{s=s.add(a.key)}),s}containsKey(e){const n=new Us(e,0),r=this.Tr.firstAfterOrEqual(n);return r!==null&&e.isEqual(r.key)}}class Us{constructor(e,n){this.key=e,this.wr=n}static Er(e,n){return Ft.comparator(e.key,n.key)||rr(e.wr,n.wr)}static Ar(e,n){return rr(e.wr,n.wr)||Ft.comparator(e.key,n.key)}}/** * @license * Copyright 2017 Google LLC * @@ -8884,7 +8884,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class m3t{constructor(e,n){this.indexManager=e,this.referenceDelegate=n,this.mutationQueue=[],this.Sr=1,this.br=new aa(Us.Er)}checkEmpty(e){return at.resolve(this.mutationQueue.length===0)}addMutationBatch(e,n,r,i){const s=this.Sr;this.Sr++,this.mutationQueue.length>0&&this.mutationQueue[this.mutationQueue.length-1];const a=new LSt(s,n,r,i);this.mutationQueue.push(a);for(const o of i)this.br=this.br.add(new Us(o.key,s)),this.indexManager.addToCollectionParentIndex(e,o.key.path.popLast());return at.resolve(a)}lookupMutationBatch(e,n){return at.resolve(this.Dr(n))}getNextMutationBatchAfterBatchId(e,n){const r=n+1,i=this.vr(r),s=i<0?0:i;return at.resolve(this.mutationQueue.length>s?this.mutationQueue[s]:null)}getHighestUnacknowledgedBatchId(){return at.resolve(this.mutationQueue.length===0?-1:this.Sr-1)}getAllMutationBatches(e){return at.resolve(this.mutationQueue.slice())}getAllMutationBatchesAffectingDocumentKey(e,n){const r=new Us(n,0),i=new Us(n,Number.POSITIVE_INFINITY),s=[];return this.br.forEachInRange([r,i],a=>{const o=this.Dr(a.wr);s.push(o)}),at.resolve(s)}getAllMutationBatchesAffectingDocumentKeys(e,n){let r=new aa(rr);return n.forEach(i=>{const s=new Us(i,0),a=new Us(i,Number.POSITIVE_INFINITY);this.br.forEachInRange([s,a],o=>{r=r.add(o.wr)})}),at.resolve(this.Cr(r))}getAllMutationBatchesAffectingQuery(e,n){const r=n.path,i=r.length+1;let s=r;Ft.isDocumentKey(s)||(s=s.child(""));const a=new Us(new Ft(s),0);let o=new aa(rr);return this.br.forEachWhile(l=>{const u=l.key.path;return!!r.isPrefixOf(u)&&(u.length===i&&(o=o.add(l.wr)),!0)},a),at.resolve(this.Cr(o))}Cr(e){const n=[];return e.forEach(r=>{const i=this.Dr(r);i!==null&&n.push(i)}),n}removeMutationBatch(e,n){Pr(this.Fr(n.batchId,"removed")===0),this.mutationQueue.shift();let r=this.br;return at.forEach(n.mutations,i=>{const s=new Us(i.key,n.batchId);return r=r.delete(s),this.referenceDelegate.markPotentiallyOrphaned(e,i.key)}).next(()=>{this.br=r})}On(e){}containsKey(e,n){const r=new Us(n,0),i=this.br.firstAfterOrEqual(r);return at.resolve(n.isEqual(i&&i.key))}performConsistencyCheck(e){return this.mutationQueue.length,at.resolve()}Fr(e,n){return this.vr(e)}vr(e){return this.mutationQueue.length===0?0:e-this.mutationQueue[0].batchId}Dr(e){const n=this.vr(e);return n<0||n>=this.mutationQueue.length?null:this.mutationQueue[n]}}/** + */class v3t{constructor(e,n){this.indexManager=e,this.referenceDelegate=n,this.mutationQueue=[],this.Sr=1,this.br=new aa(Us.Er)}checkEmpty(e){return at.resolve(this.mutationQueue.length===0)}addMutationBatch(e,n,r,i){const s=this.Sr;this.Sr++,this.mutationQueue.length>0&&this.mutationQueue[this.mutationQueue.length-1];const a=new XSt(s,n,r,i);this.mutationQueue.push(a);for(const o of i)this.br=this.br.add(new Us(o.key,s)),this.indexManager.addToCollectionParentIndex(e,o.key.path.popLast());return at.resolve(a)}lookupMutationBatch(e,n){return at.resolve(this.Dr(n))}getNextMutationBatchAfterBatchId(e,n){const r=n+1,i=this.vr(r),s=i<0?0:i;return at.resolve(this.mutationQueue.length>s?this.mutationQueue[s]:null)}getHighestUnacknowledgedBatchId(){return at.resolve(this.mutationQueue.length===0?-1:this.Sr-1)}getAllMutationBatches(e){return at.resolve(this.mutationQueue.slice())}getAllMutationBatchesAffectingDocumentKey(e,n){const r=new Us(n,0),i=new Us(n,Number.POSITIVE_INFINITY),s=[];return this.br.forEachInRange([r,i],a=>{const o=this.Dr(a.wr);s.push(o)}),at.resolve(s)}getAllMutationBatchesAffectingDocumentKeys(e,n){let r=new aa(rr);return n.forEach(i=>{const s=new Us(i,0),a=new Us(i,Number.POSITIVE_INFINITY);this.br.forEachInRange([s,a],o=>{r=r.add(o.wr)})}),at.resolve(this.Cr(r))}getAllMutationBatchesAffectingQuery(e,n){const r=n.path,i=r.length+1;let s=r;Ft.isDocumentKey(s)||(s=s.child(""));const a=new Us(new Ft(s),0);let o=new aa(rr);return this.br.forEachWhile(l=>{const u=l.key.path;return!!r.isPrefixOf(u)&&(u.length===i&&(o=o.add(l.wr)),!0)},a),at.resolve(this.Cr(o))}Cr(e){const n=[];return e.forEach(r=>{const i=this.Dr(r);i!==null&&n.push(i)}),n}removeMutationBatch(e,n){Pr(this.Fr(n.batchId,"removed")===0),this.mutationQueue.shift();let r=this.br;return at.forEach(n.mutations,i=>{const s=new Us(i.key,n.batchId);return r=r.delete(s),this.referenceDelegate.markPotentiallyOrphaned(e,i.key)}).next(()=>{this.br=r})}On(e){}containsKey(e,n){const r=new Us(n,0),i=this.br.firstAfterOrEqual(r);return at.resolve(n.isEqual(i&&i.key))}performConsistencyCheck(e){return this.mutationQueue.length,at.resolve()}Fr(e,n){return this.vr(e)}vr(e){return this.mutationQueue.length===0?0:e-this.mutationQueue[0].batchId}Dr(e){const n=this.vr(e);return n<0||n>=this.mutationQueue.length?null:this.mutationQueue[n]}}/** * @license * Copyright 2017 Google LLC * @@ -8899,7 +8899,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class v3t{constructor(e){this.Mr=e,this.docs=function(){return new Ri(Ft.comparator)}(),this.size=0}setIndexManager(e){this.indexManager=e}addEntry(e,n){const r=n.key,i=this.docs.get(r),s=i?i.size:0,a=this.Mr(n);return this.docs=this.docs.insert(r,{document:n.mutableCopy(),size:a}),this.size+=a-s,this.indexManager.addToCollectionParentIndex(e,r.path.popLast())}removeEntry(e){const n=this.docs.get(e);n&&(this.docs=this.docs.remove(e),this.size-=n.size)}getEntry(e,n){const r=this.docs.get(n);return at.resolve(r?r.document.mutableCopy():Ra.newInvalidDocument(n))}getEntries(e,n){let r=Of();return n.forEach(i=>{const s=this.docs.get(i);r=r.insert(i,s?s.document.mutableCopy():Ra.newInvalidDocument(i))}),at.resolve(r)}getDocumentsMatchingQuery(e,n,r,i){let s=Of();const a=n.path,o=new Ft(a.child("")),l=this.docs.getIteratorFrom(o);for(;l.hasNext();){const{key:u,value:{document:c}}=l.getNext();if(!a.isPrefixOf(u.path))break;u.path.length>a.length+1||$yt(_yt(c),r)<=0||(i.has(c.key)||C9(n,c))&&(s=s.insert(c.key,c.mutableCopy()))}return at.resolve(s)}getAllFromCollectionGroup(e,n,r,i){_t()}Or(e,n){return at.forEach(this.docs,r=>n(r))}newChangeBuffer(e){return new g3t(this)}getSize(e){return at.resolve(this.size)}}class g3t extends u3t{constructor(e){super(),this.cr=e}applyChanges(e){const n=[];return this.changes.forEach((r,i)=>{i.isValidDocument()?n.push(this.cr.addEntry(e,i)):this.cr.removeEntry(r)}),at.waitFor(n)}getFromCache(e,n){return this.cr.getEntry(e,n)}getAllFromCache(e,n){return this.cr.getEntries(e,n)}}/** + */class g3t{constructor(e){this.Mr=e,this.docs=function(){return new Ri(Ft.comparator)}(),this.size=0}setIndexManager(e){this.indexManager=e}addEntry(e,n){const r=n.key,i=this.docs.get(r),s=i?i.size:0,a=this.Mr(n);return this.docs=this.docs.insert(r,{document:n.mutableCopy(),size:a}),this.size+=a-s,this.indexManager.addToCollectionParentIndex(e,r.path.popLast())}removeEntry(e){const n=this.docs.get(e);n&&(this.docs=this.docs.remove(e),this.size-=n.size)}getEntry(e,n){const r=this.docs.get(n);return at.resolve(r?r.document.mutableCopy():Ra.newInvalidDocument(n))}getEntries(e,n){let r=Of();return n.forEach(i=>{const s=this.docs.get(i);r=r.insert(i,s?s.document.mutableCopy():Ra.newInvalidDocument(i))}),at.resolve(r)}getDocumentsMatchingQuery(e,n,r,i){let s=Of();const a=n.path,o=new Ft(a.child("")),l=this.docs.getIteratorFrom(o);for(;l.hasNext();){const{key:u,value:{document:c}}=l.getNext();if(!a.isPrefixOf(u.path))break;u.path.length>a.length+1||eSt($yt(c),r)<=0||(i.has(c.key)||C9(n,c))&&(s=s.insert(c.key,c.mutableCopy()))}return at.resolve(s)}getAllFromCollectionGroup(e,n,r,i){_t()}Or(e,n){return at.forEach(this.docs,r=>n(r))}newChangeBuffer(e){return new b3t(this)}getSize(e){return at.resolve(this.size)}}class b3t extends c3t{constructor(e){super(),this.cr=e}applyChanges(e){const n=[];return this.changes.forEach((r,i)=>{i.isValidDocument()?n.push(this.cr.addEntry(e,i)):this.cr.removeEntry(r)}),at.waitFor(n)}getFromCache(e,n){return this.cr.getEntry(e,n)}getAllFromCache(e,n){return this.cr.getEntries(e,n)}}/** * @license * Copyright 2017 Google LLC * @@ -8914,7 +8914,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class b3t{constructor(e){this.persistence=e,this.Nr=new Hy(n=>EW(n),MW),this.lastRemoteSnapshotVersion=sn.min(),this.highestTargetId=0,this.Lr=0,this.Br=new OW,this.targetCount=0,this.kr=Ab.Bn()}forEachTarget(e,n){return this.Nr.forEach((r,i)=>n(i)),at.resolve()}getLastRemoteSnapshotVersion(e){return at.resolve(this.lastRemoteSnapshotVersion)}getHighestSequenceNumber(e){return at.resolve(this.Lr)}allocateTargetId(e){return this.highestTargetId=this.kr.next(),at.resolve(this.highestTargetId)}setTargetsMetadata(e,n,r){return r&&(this.lastRemoteSnapshotVersion=r),n>this.Lr&&(this.Lr=n),at.resolve()}Kn(e){this.Nr.set(e.target,e);const n=e.targetId;n>this.highestTargetId&&(this.kr=new Ab(n),this.highestTargetId=n),e.sequenceNumber>this.Lr&&(this.Lr=e.sequenceNumber)}addTargetData(e,n){return this.Kn(n),this.targetCount+=1,at.resolve()}updateTargetData(e,n){return this.Kn(n),at.resolve()}removeTargetData(e,n){return this.Nr.delete(n.target),this.Br.gr(n.targetId),this.targetCount-=1,at.resolve()}removeTargets(e,n,r){let i=0;const s=[];return this.Nr.forEach((a,o)=>{o.sequenceNumber<=n&&r.get(o.targetId)===null&&(this.Nr.delete(a),s.push(this.removeMatchingKeysForTargetId(e,o.targetId)),i++)}),at.waitFor(s).next(()=>i)}getTargetCount(e){return at.resolve(this.targetCount)}getTargetData(e,n){const r=this.Nr.get(n)||null;return at.resolve(r)}addMatchingKeys(e,n,r){return this.Br.Rr(n,r),at.resolve()}removeMatchingKeys(e,n,r){this.Br.mr(n,r);const i=this.persistence.referenceDelegate,s=[];return i&&n.forEach(a=>{s.push(i.markPotentiallyOrphaned(e,a))}),at.waitFor(s)}removeMatchingKeysForTargetId(e,n){return this.Br.gr(n),at.resolve()}getMatchingKeysForTargetId(e,n){const r=this.Br.yr(n);return at.resolve(r)}containsKey(e,n){return at.resolve(this.Br.containsKey(n))}}/** + */class y3t{constructor(e){this.persistence=e,this.Nr=new By(n=>MW(n),PW),this.lastRemoteSnapshotVersion=sn.min(),this.highestTargetId=0,this.Lr=0,this.Br=new IW,this.targetCount=0,this.kr=Ab.Bn()}forEachTarget(e,n){return this.Nr.forEach((r,i)=>n(i)),at.resolve()}getLastRemoteSnapshotVersion(e){return at.resolve(this.lastRemoteSnapshotVersion)}getHighestSequenceNumber(e){return at.resolve(this.Lr)}allocateTargetId(e){return this.highestTargetId=this.kr.next(),at.resolve(this.highestTargetId)}setTargetsMetadata(e,n,r){return r&&(this.lastRemoteSnapshotVersion=r),n>this.Lr&&(this.Lr=n),at.resolve()}Kn(e){this.Nr.set(e.target,e);const n=e.targetId;n>this.highestTargetId&&(this.kr=new Ab(n),this.highestTargetId=n),e.sequenceNumber>this.Lr&&(this.Lr=e.sequenceNumber)}addTargetData(e,n){return this.Kn(n),this.targetCount+=1,at.resolve()}updateTargetData(e,n){return this.Kn(n),at.resolve()}removeTargetData(e,n){return this.Nr.delete(n.target),this.Br.gr(n.targetId),this.targetCount-=1,at.resolve()}removeTargets(e,n,r){let i=0;const s=[];return this.Nr.forEach((a,o)=>{o.sequenceNumber<=n&&r.get(o.targetId)===null&&(this.Nr.delete(a),s.push(this.removeMatchingKeysForTargetId(e,o.targetId)),i++)}),at.waitFor(s).next(()=>i)}getTargetCount(e){return at.resolve(this.targetCount)}getTargetData(e,n){const r=this.Nr.get(n)||null;return at.resolve(r)}addMatchingKeys(e,n,r){return this.Br.Rr(n,r),at.resolve()}removeMatchingKeys(e,n,r){this.Br.mr(n,r);const i=this.persistence.referenceDelegate,s=[];return i&&n.forEach(a=>{s.push(i.markPotentiallyOrphaned(e,a))}),at.waitFor(s)}removeMatchingKeysForTargetId(e,n){return this.Br.gr(n),at.resolve()}getMatchingKeysForTargetId(e,n){const r=this.Br.yr(n);return at.resolve(r)}containsKey(e,n){return at.resolve(this.Br.containsKey(n))}}/** * @license * Copyright 2017 Google LLC * @@ -8929,7 +8929,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class y3t{constructor(e,n){this.qr={},this.overlays={},this.Qr=new SW(0),this.Kr=!1,this.Kr=!0,this.$r=new p3t,this.referenceDelegate=e(this),this.Ur=new b3t(this),this.indexManager=new o3t,this.remoteDocumentCache=function(i){return new v3t(i)}(r=>this.referenceDelegate.Wr(r)),this.serializer=new s3t(n),this.Gr=new f3t(this.serializer)}start(){return Promise.resolve()}shutdown(){return this.Kr=!1,Promise.resolve()}get started(){return this.Kr}setDatabaseDeletedListener(){}setNetworkEnabled(){}getIndexManager(e){return this.indexManager}getDocumentOverlayCache(e){let n=this.overlays[e.toKey()];return n||(n=new h3t,this.overlays[e.toKey()]=n),n}getMutationQueue(e,n){let r=this.qr[e.toKey()];return r||(r=new m3t(n,this.referenceDelegate),this.qr[e.toKey()]=r),r}getGlobalsCache(){return this.$r}getTargetCache(){return this.Ur}getRemoteDocumentCache(){return this.remoteDocumentCache}getBundleCache(){return this.Gr}runTransaction(e,n,r){It("MemoryPersistence","Starting transaction:",e);const i=new S3t(this.Qr.next());return this.referenceDelegate.zr(),r(i).next(s=>this.referenceDelegate.jr(i).next(()=>s)).toPromise().then(s=>(i.raiseOnCommittedEvent(),s))}Hr(e,n){return at.or(Object.values(this.qr).map(r=>()=>r.containsKey(e,n)))}}class S3t extends tSt{constructor(e){super(),this.currentSequenceNumber=e}}class IW{constructor(e){this.persistence=e,this.Jr=new OW,this.Yr=null}static Zr(e){return new IW(e)}get Xr(){if(this.Yr)return this.Yr;throw _t()}addReference(e,n,r){return this.Jr.addReference(r,n),this.Xr.delete(r.toString()),at.resolve()}removeReference(e,n,r){return this.Jr.removeReference(r,n),this.Xr.add(r.toString()),at.resolve()}markPotentiallyOrphaned(e,n){return this.Xr.add(n.toString()),at.resolve()}removeTarget(e,n){this.Jr.gr(n.targetId).forEach(i=>this.Xr.add(i.toString()));const r=this.persistence.getTargetCache();return r.getMatchingKeysForTargetId(e,n.targetId).next(i=>{i.forEach(s=>this.Xr.add(s.toString()))}).next(()=>r.removeTargetData(e,n))}zr(){this.Yr=new Set}jr(e){const n=this.persistence.getRemoteDocumentCache().newChangeBuffer();return at.forEach(this.Xr,r=>{const i=Ft.fromPath(r);return this.ei(e,i).next(s=>{s||n.removeEntry(i,sn.min())})}).next(()=>(this.Yr=null,n.apply(e)))}updateLimboDocument(e,n){return this.ei(e,n).next(r=>{r?this.Xr.delete(n.toString()):this.Xr.add(n.toString())})}Wr(e){return 0}ei(e,n){return at.or([()=>at.resolve(this.Jr.containsKey(n)),()=>this.persistence.getTargetCache().containsKey(e,n),()=>this.persistence.Hr(e,n)])}}/** + */class S3t{constructor(e,n){this.qr={},this.overlays={},this.Qr=new xW(0),this.Kr=!1,this.Kr=!0,this.$r=new m3t,this.referenceDelegate=e(this),this.Ur=new y3t(this),this.indexManager=new l3t,this.remoteDocumentCache=function(i){return new g3t(i)}(r=>this.referenceDelegate.Wr(r)),this.serializer=new a3t(n),this.Gr=new h3t(this.serializer)}start(){return Promise.resolve()}shutdown(){return this.Kr=!1,Promise.resolve()}get started(){return this.Kr}setDatabaseDeletedListener(){}setNetworkEnabled(){}getIndexManager(e){return this.indexManager}getDocumentOverlayCache(e){let n=this.overlays[e.toKey()];return n||(n=new p3t,this.overlays[e.toKey()]=n),n}getMutationQueue(e,n){let r=this.qr[e.toKey()];return r||(r=new v3t(n,this.referenceDelegate),this.qr[e.toKey()]=r),r}getGlobalsCache(){return this.$r}getTargetCache(){return this.Ur}getRemoteDocumentCache(){return this.remoteDocumentCache}getBundleCache(){return this.Gr}runTransaction(e,n,r){It("MemoryPersistence","Starting transaction:",e);const i=new x3t(this.Qr.next());return this.referenceDelegate.zr(),r(i).next(s=>this.referenceDelegate.jr(i).next(()=>s)).toPromise().then(s=>(i.raiseOnCommittedEvent(),s))}Hr(e,n){return at.or(Object.values(this.qr).map(r=>()=>r.containsKey(e,n)))}}class x3t extends nSt{constructor(e){super(),this.currentSequenceNumber=e}}class UW{constructor(e){this.persistence=e,this.Jr=new IW,this.Yr=null}static Zr(e){return new UW(e)}get Xr(){if(this.Yr)return this.Yr;throw _t()}addReference(e,n,r){return this.Jr.addReference(r,n),this.Xr.delete(r.toString()),at.resolve()}removeReference(e,n,r){return this.Jr.removeReference(r,n),this.Xr.add(r.toString()),at.resolve()}markPotentiallyOrphaned(e,n){return this.Xr.add(n.toString()),at.resolve()}removeTarget(e,n){this.Jr.gr(n.targetId).forEach(i=>this.Xr.add(i.toString()));const r=this.persistence.getTargetCache();return r.getMatchingKeysForTargetId(e,n.targetId).next(i=>{i.forEach(s=>this.Xr.add(s.toString()))}).next(()=>r.removeTargetData(e,n))}zr(){this.Yr=new Set}jr(e){const n=this.persistence.getRemoteDocumentCache().newChangeBuffer();return at.forEach(this.Xr,r=>{const i=Ft.fromPath(r);return this.ei(e,i).next(s=>{s||n.removeEntry(i,sn.min())})}).next(()=>(this.Yr=null,n.apply(e)))}updateLimboDocument(e,n){return this.ei(e,n).next(r=>{r?this.Xr.delete(n.toString()):this.Xr.add(n.toString())})}Wr(e){return 0}ei(e,n){return at.or([()=>at.resolve(this.Jr.containsKey(n)),()=>this.persistence.getTargetCache().containsKey(e,n),()=>this.persistence.Hr(e,n)])}}/** * @license * Copyright 2017 Google LLC * @@ -8944,7 +8944,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class UW{constructor(e,n,r,i){this.targetId=e,this.fromCache=n,this.$i=r,this.Ui=i}static Wi(e,n){let r=Nn(),i=Nn();for(const s of n.docChanges)switch(s.type){case 0:r=r.add(s.doc.key);break;case 1:i=i.add(s.doc.key)}return new UW(e,n.fromCache,r,i)}}/** + */class NW{constructor(e,n,r,i){this.targetId=e,this.fromCache=n,this.$i=r,this.Ui=i}static Wi(e,n){let r=Ln(),i=Ln();for(const s of n.docChanges)switch(s.type){case 0:r=r.add(s.doc.key);break;case 1:i=i.add(s.doc.key)}return new NW(e,n.fromCache,r,i)}}/** * @license * Copyright 2023 Google LLC * @@ -8959,7 +8959,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class x3t{constructor(){this._documentReadCount=0}get documentReadCount(){return this._documentReadCount}incrementDocumentReadCount(e){this._documentReadCount+=e}}/** + */class T3t{constructor(){this._documentReadCount=0}get documentReadCount(){return this._documentReadCount}incrementDocumentReadCount(e){this._documentReadCount+=e}}/** * @license * Copyright 2019 Google LLC * @@ -8974,7 +8974,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class T3t{constructor(){this.Gi=!1,this.zi=!1,this.ji=100,this.Hi=function(){return wbt()?8:nSt(La())>0?6:4}()}initialize(e,n){this.Ji=e,this.indexManager=n,this.Gi=!0}getDocumentsMatchingQuery(e,n,r,i){const s={result:null};return this.Yi(e,n).next(a=>{s.result=a}).next(()=>{if(!s.result)return this.Zi(e,n,i,r).next(a=>{s.result=a})}).next(()=>{if(s.result)return;const a=new x3t;return this.Xi(e,n,a).next(o=>{if(s.result=o,this.zi)return this.es(e,n,a,o.size)})}).next(()=>s.result)}es(e,n,r,i){return r.documentReadCountthis.Hi*i?(n3()<=Dn.DEBUG&&It("QueryEngine","The SDK decides to create cache indexes for query:",e1(n),"as using cache indexes may help improve performance."),this.indexManager.createTargetIndexes(e,jc(n))):at.resolve())}Yi(e,n){if(bee(n))return at.resolve(null);let r=jc(n);return this.indexManager.getIndexType(e,r).next(i=>i===0?null:(n.limit!==null&&i===1&&(n=_P(n,null,"F"),r=jc(n)),this.indexManager.getDocumentsMatchingTarget(e,r).next(s=>{const a=Nn(...s);return this.Ji.getDocuments(e,a).next(o=>this.indexManager.getMinOffset(e,r).next(l=>{const u=this.ts(n,o);return this.ns(n,u,a,l.readTime)?this.Yi(e,_P(n,null,"F")):this.rs(e,u,n,l)}))})))}Zi(e,n,r,i){return bee(n)||i.isEqual(sn.min())?at.resolve(null):this.Ji.getDocuments(e,r).next(s=>{const a=this.ts(n,s);return this.ns(n,a,r,i)?at.resolve(null):(n3()<=Dn.DEBUG&&It("QueryEngine","Re-using previous result from %s to execute query: %s",i.toString(),e1(n)),this.rs(e,a,n,Qyt(i,-1)).next(o=>o))})}ts(e,n){let r=new aa(f1e(e));return n.forEach((i,s)=>{C9(e,s)&&(r=r.add(s))}),r}ns(e,n,r,i){if(e.limit===null)return!1;if(r.size!==n.size)return!0;const s=e.limitType==="F"?n.last():n.first();return!!s&&(s.hasPendingWrites||s.version.compareTo(i)>0)}Xi(e,n,r){return n3()<=Dn.DEBUG&&It("QueryEngine","Using full collection scan to execute query:",e1(n)),this.Ji.getDocumentsMatchingQuery(e,n,Gp.min(),r)}rs(e,n,r,i){return this.Ji.getDocumentsMatchingQuery(e,r,i).next(s=>(n.forEach(a=>{s=s.insert(a.key,a)}),s))}}/** + */class w3t{constructor(){this.Gi=!1,this.zi=!1,this.ji=100,this.Hi=function(){return Ebt()?8:rSt(La())>0?6:4}()}initialize(e,n){this.Ji=e,this.indexManager=n,this.Gi=!0}getDocumentsMatchingQuery(e,n,r,i){const s={result:null};return this.Yi(e,n).next(a=>{s.result=a}).next(()=>{if(!s.result)return this.Zi(e,n,i,r).next(a=>{s.result=a})}).next(()=>{if(s.result)return;const a=new T3t;return this.Xi(e,n,a).next(o=>{if(s.result=o,this.zi)return this.es(e,n,a,o.size)})}).next(()=>s.result)}es(e,n,r,i){return r.documentReadCountthis.Hi*i?(t3()<=Dn.DEBUG&&It("QueryEngine","The SDK decides to create cache indexes for query:",e1(n),"as using cache indexes may help improve performance."),this.indexManager.createTargetIndexes(e,jc(n))):at.resolve())}Yi(e,n){if(vee(n))return at.resolve(null);let r=jc(n);return this.indexManager.getIndexType(e,r).next(i=>i===0?null:(n.limit!==null&&i===1&&(n=QP(n,null,"F"),r=jc(n)),this.indexManager.getDocumentsMatchingTarget(e,r).next(s=>{const a=Ln(...s);return this.Ji.getDocuments(e,a).next(o=>this.indexManager.getMinOffset(e,r).next(l=>{const u=this.ts(n,o);return this.ns(n,u,a,l.readTime)?this.Yi(e,QP(n,null,"F")):this.rs(e,u,n,l)}))})))}Zi(e,n,r,i){return vee(n)||i.isEqual(sn.min())?at.resolve(null):this.Ji.getDocuments(e,r).next(s=>{const a=this.ts(n,s);return this.ns(n,a,r,i)?at.resolve(null):(t3()<=Dn.DEBUG&&It("QueryEngine","Re-using previous result from %s to execute query: %s",i.toString(),e1(n)),this.rs(e,a,n,_yt(i,-1)).next(o=>o))})}ts(e,n){let r=new aa(d1e(e));return n.forEach((i,s)=>{C9(e,s)&&(r=r.add(s))}),r}ns(e,n,r,i){if(e.limit===null)return!1;if(r.size!==n.size)return!0;const s=e.limitType==="F"?n.last():n.first();return!!s&&(s.hasPendingWrites||s.version.compareTo(i)>0)}Xi(e,n,r){return t3()<=Dn.DEBUG&&It("QueryEngine","Using full collection scan to execute query:",e1(n)),this.Ji.getDocumentsMatchingQuery(e,n,Gp.min(),r)}rs(e,n,r,i){return this.Ji.getDocumentsMatchingQuery(e,r,i).next(s=>(n.forEach(a=>{s=s.insert(a.key,a)}),s))}}/** * @license * Copyright 2020 Google LLC * @@ -8989,7 +8989,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class w3t{constructor(e,n,r,i){this.persistence=e,this.ss=n,this.serializer=i,this.os=new Ri(rr),this._s=new Hy(s=>EW(s),MW),this.us=new Map,this.cs=e.getRemoteDocumentCache(),this.Ur=e.getTargetCache(),this.Gr=e.getBundleCache(),this.ls(r)}ls(e){this.documentOverlayCache=this.persistence.getDocumentOverlayCache(e),this.indexManager=this.persistence.getIndexManager(e),this.mutationQueue=this.persistence.getMutationQueue(e,this.indexManager),this.localDocuments=new d3t(this.cs,this.mutationQueue,this.documentOverlayCache,this.indexManager),this.cs.setIndexManager(this.indexManager),this.ss.initialize(this.localDocuments,this.indexManager)}collectGarbage(e){return this.persistence.runTransaction("Collect garbage","readwrite-primary",n=>e.collect(n,this.os))}}function E3t(t,e,n,r){return new w3t(t,e,n,r)}async function U1e(t,e){const n=an(t);return await n.persistence.runTransaction("Handle user change","readonly",r=>{let i;return n.mutationQueue.getAllMutationBatches(r).next(s=>(i=s,n.ls(e),n.mutationQueue.getAllMutationBatches(r))).next(s=>{const a=[],o=[];let l=Nn();for(const u of i){a.push(u.batchId);for(const c of u.mutations)l=l.add(c.key)}for(const u of s){o.push(u.batchId);for(const c of u.mutations)l=l.add(c.key)}return n.localDocuments.getDocuments(r,l).next(u=>({hs:u,removedBatchIds:a,addedBatchIds:o}))})})}function M3t(t,e){const n=an(t);return n.persistence.runTransaction("Acknowledge batch","readwrite-primary",r=>{const i=e.batch.keys(),s=n.cs.newChangeBuffer({trackRemovals:!0});return function(o,l,u,c){const d=u.batch,f=d.keys();let h=at.resolve();return f.forEach(p=>{h=h.next(()=>c.getEntry(l,p)).next(m=>{const v=u.docVersions.get(p);Pr(v!==null),m.version.compareTo(v)<0&&(d.applyToRemoteDocument(m,u),m.isValidDocument()&&(m.setReadTime(u.commitVersion),c.addEntry(m)))})}),h.next(()=>o.mutationQueue.removeMutationBatch(l,d))}(n,r,e,s).next(()=>s.apply(r)).next(()=>n.mutationQueue.performConsistencyCheck(r)).next(()=>n.documentOverlayCache.removeOverlaysForBatchId(r,i,e.batch.batchId)).next(()=>n.localDocuments.recalculateAndSaveOverlaysForDocumentKeys(r,function(o){let l=Nn();for(let u=0;u0&&(l=l.add(o.batch.mutations[u].key));return l}(e))).next(()=>n.localDocuments.getDocuments(r,i))})}function N1e(t){const e=an(t);return e.persistence.runTransaction("Get last remote snapshot version","readonly",n=>e.Ur.getLastRemoteSnapshotVersion(n))}function P3t(t,e){const n=an(t),r=e.snapshotVersion;let i=n.os;return n.persistence.runTransaction("Apply remote event","readwrite-primary",s=>{const a=n.cs.newChangeBuffer({trackRemovals:!0});i=n.os;const o=[];e.targetChanges.forEach((c,d)=>{const f=i.get(d);if(!f)return;o.push(n.Ur.removeMatchingKeys(s,c.removedDocuments,d).next(()=>n.Ur.addMatchingKeys(s,c.addedDocuments,d)));let h=f.withSequenceNumber(s.currentSequenceNumber);e.targetMismatches.get(d)!==null?h=h.withResumeToken(ua.EMPTY_BYTE_STRING,sn.min()).withLastLimboFreeSnapshotVersion(sn.min()):c.resumeToken.approximateByteSize()>0&&(h=h.withResumeToken(c.resumeToken,r)),i=i.insert(d,h),function(m,v,g){return m.resumeToken.approximateByteSize()===0||v.snapshotVersion.toMicroseconds()-m.snapshotVersion.toMicroseconds()>=3e8?!0:g.addedDocuments.size+g.modifiedDocuments.size+g.removedDocuments.size>0}(f,h,c)&&o.push(n.Ur.updateTargetData(s,h))});let l=Of(),u=Nn();if(e.documentUpdates.forEach(c=>{e.resolvedLimboDocuments.has(c)&&o.push(n.persistence.referenceDelegate.updateLimboDocument(s,c))}),o.push(R3t(s,a,e.documentUpdates).next(c=>{l=c.Ps,u=c.Is})),!r.isEqual(sn.min())){const c=n.Ur.getLastRemoteSnapshotVersion(s).next(d=>n.Ur.setTargetsMetadata(s,s.currentSequenceNumber,r));o.push(c)}return at.waitFor(o).next(()=>a.apply(s)).next(()=>n.localDocuments.getLocalViewOfDocuments(s,l,u)).next(()=>l)}).then(s=>(n.os=i,s))}function R3t(t,e,n){let r=Nn(),i=Nn();return n.forEach(s=>r=r.add(s)),e.getEntries(t,r).next(s=>{let a=Of();return n.forEach((o,l)=>{const u=s.get(o);l.isFoundDocument()!==u.isFoundDocument()&&(i=i.add(o)),l.isNoDocument()&&l.version.isEqual(sn.min())?(e.removeEntry(o,l.readTime),a=a.insert(o,l)):!u.isValidDocument()||l.version.compareTo(u.version)>0||l.version.compareTo(u.version)===0&&u.hasPendingWrites?(e.addEntry(l),a=a.insert(o,l)):It("LocalStore","Ignoring outdated watch update for ",o,". Current version:",u.version," Watch version:",l.version)}),{Ps:a,Is:i}})}function V3t(t,e){const n=an(t);return n.persistence.runTransaction("Get next mutation batch","readonly",r=>(e===void 0&&(e=-1),n.mutationQueue.getNextMutationBatchAfterBatchId(r,e)))}function z3t(t,e){const n=an(t);return n.persistence.runTransaction("Allocate target","readwrite",r=>{let i;return n.Ur.getTargetData(r,e).next(s=>s?(i=s,at.resolve(i)):n.Ur.allocateTargetId(r).next(a=>(i=new tp(e,a,"TargetPurposeListen",r.currentSequenceNumber),n.Ur.addTargetData(r,i).next(()=>i))))}).then(r=>{const i=n.os.get(r.targetId);return(i===null||r.snapshotVersion.compareTo(i.snapshotVersion)>0)&&(n.os=n.os.insert(r.targetId,r),n._s.set(e,r.targetId)),r})}async function q4(t,e,n){const r=an(t),i=r.os.get(e),s=n?"readwrite":"readwrite-primary";try{n||await r.persistence.runTransaction("Release target",s,a=>r.persistence.referenceDelegate.removeTarget(a,i))}catch(a){if(!fw(a))throw a;It("LocalStore",`Failed to update sequence numbers for target ${e}: ${a}`)}r.os=r.os.remove(e),r._s.delete(i.target)}function zee(t,e,n){const r=an(t);let i=sn.min(),s=Nn();return r.persistence.runTransaction("Execute query","readwrite",a=>function(l,u,c){const d=an(l),f=d._s.get(c);return f!==void 0?at.resolve(d.os.get(f)):d.Ur.getTargetData(u,c)}(r,a,jc(e)).next(o=>{if(o)return i=o.lastLimboFreeSnapshotVersion,r.Ur.getMatchingKeysForTargetId(a,o.targetId).next(l=>{s=l})}).next(()=>r.ss.getDocumentsMatchingQuery(a,e,n?i:sn.min(),n?s:Nn())).next(o=>(k3t(r,SSt(e),o),{documents:o,Ts:s})))}function k3t(t,e,n){let r=t.us.get(e)||sn.min();n.forEach((i,s)=>{s.readTime.compareTo(r)>0&&(r=s.readTime)}),t.us.set(e,r)}class kee{constructor(){this.activeTargetIds=PSt()}fs(e){this.activeTargetIds=this.activeTargetIds.add(e)}gs(e){this.activeTargetIds=this.activeTargetIds.delete(e)}Vs(){const e={activeTargetIds:this.activeTargetIds.toArray(),updateTimeMs:Date.now()};return JSON.stringify(e)}}class O3t{constructor(){this.so=new kee,this.oo={},this.onlineStateHandler=null,this.sequenceNumberHandler=null}addPendingMutation(e){}updateMutationState(e,n,r){}addLocalQueryTarget(e,n=!0){return n&&this.so.fs(e),this.oo[e]||"not-current"}updateQueryState(e,n,r){this.oo[e]=n}removeLocalQueryTarget(e){this.so.gs(e)}isLocalQueryTarget(e){return this.so.activeTargetIds.has(e)}clearQueryState(e){delete this.oo[e]}getAllActiveQueryTargets(){return this.so.activeTargetIds}isActiveQueryTarget(e){return this.so.activeTargetIds.has(e)}start(){return this.so=new kee,Promise.resolve()}handleUserChange(e,n,r){}setOnlineState(e){}shutdown(){}writeSequenceNumber(e){}notifyBundleLoaded(e){}}/** + */class E3t{constructor(e,n,r,i){this.persistence=e,this.ss=n,this.serializer=i,this.os=new Ri(rr),this._s=new By(s=>MW(s),PW),this.us=new Map,this.cs=e.getRemoteDocumentCache(),this.Ur=e.getTargetCache(),this.Gr=e.getBundleCache(),this.ls(r)}ls(e){this.documentOverlayCache=this.persistence.getDocumentOverlayCache(e),this.indexManager=this.persistence.getIndexManager(e),this.mutationQueue=this.persistence.getMutationQueue(e,this.indexManager),this.localDocuments=new f3t(this.cs,this.mutationQueue,this.documentOverlayCache,this.indexManager),this.cs.setIndexManager(this.indexManager),this.ss.initialize(this.localDocuments,this.indexManager)}collectGarbage(e){return this.persistence.runTransaction("Collect garbage","readwrite-primary",n=>e.collect(n,this.os))}}function M3t(t,e,n,r){return new E3t(t,e,n,r)}async function I1e(t,e){const n=an(t);return await n.persistence.runTransaction("Handle user change","readonly",r=>{let i;return n.mutationQueue.getAllMutationBatches(r).next(s=>(i=s,n.ls(e),n.mutationQueue.getAllMutationBatches(r))).next(s=>{const a=[],o=[];let l=Ln();for(const u of i){a.push(u.batchId);for(const c of u.mutations)l=l.add(c.key)}for(const u of s){o.push(u.batchId);for(const c of u.mutations)l=l.add(c.key)}return n.localDocuments.getDocuments(r,l).next(u=>({hs:u,removedBatchIds:a,addedBatchIds:o}))})})}function P3t(t,e){const n=an(t);return n.persistence.runTransaction("Acknowledge batch","readwrite-primary",r=>{const i=e.batch.keys(),s=n.cs.newChangeBuffer({trackRemovals:!0});return function(o,l,u,c){const d=u.batch,f=d.keys();let h=at.resolve();return f.forEach(p=>{h=h.next(()=>c.getEntry(l,p)).next(m=>{const v=u.docVersions.get(p);Pr(v!==null),m.version.compareTo(v)<0&&(d.applyToRemoteDocument(m,u),m.isValidDocument()&&(m.setReadTime(u.commitVersion),c.addEntry(m)))})}),h.next(()=>o.mutationQueue.removeMutationBatch(l,d))}(n,r,e,s).next(()=>s.apply(r)).next(()=>n.mutationQueue.performConsistencyCheck(r)).next(()=>n.documentOverlayCache.removeOverlaysForBatchId(r,i,e.batch.batchId)).next(()=>n.localDocuments.recalculateAndSaveOverlaysForDocumentKeys(r,function(o){let l=Ln();for(let u=0;u0&&(l=l.add(o.batch.mutations[u].key));return l}(e))).next(()=>n.localDocuments.getDocuments(r,i))})}function U1e(t){const e=an(t);return e.persistence.runTransaction("Get last remote snapshot version","readonly",n=>e.Ur.getLastRemoteSnapshotVersion(n))}function R3t(t,e){const n=an(t),r=e.snapshotVersion;let i=n.os;return n.persistence.runTransaction("Apply remote event","readwrite-primary",s=>{const a=n.cs.newChangeBuffer({trackRemovals:!0});i=n.os;const o=[];e.targetChanges.forEach((c,d)=>{const f=i.get(d);if(!f)return;o.push(n.Ur.removeMatchingKeys(s,c.removedDocuments,d).next(()=>n.Ur.addMatchingKeys(s,c.addedDocuments,d)));let h=f.withSequenceNumber(s.currentSequenceNumber);e.targetMismatches.get(d)!==null?h=h.withResumeToken(ua.EMPTY_BYTE_STRING,sn.min()).withLastLimboFreeSnapshotVersion(sn.min()):c.resumeToken.approximateByteSize()>0&&(h=h.withResumeToken(c.resumeToken,r)),i=i.insert(d,h),function(m,v,g){return m.resumeToken.approximateByteSize()===0||v.snapshotVersion.toMicroseconds()-m.snapshotVersion.toMicroseconds()>=3e8?!0:g.addedDocuments.size+g.modifiedDocuments.size+g.removedDocuments.size>0}(f,h,c)&&o.push(n.Ur.updateTargetData(s,h))});let l=Of(),u=Ln();if(e.documentUpdates.forEach(c=>{e.resolvedLimboDocuments.has(c)&&o.push(n.persistence.referenceDelegate.updateLimboDocument(s,c))}),o.push(V3t(s,a,e.documentUpdates).next(c=>{l=c.Ps,u=c.Is})),!r.isEqual(sn.min())){const c=n.Ur.getLastRemoteSnapshotVersion(s).next(d=>n.Ur.setTargetsMetadata(s,s.currentSequenceNumber,r));o.push(c)}return at.waitFor(o).next(()=>a.apply(s)).next(()=>n.localDocuments.getLocalViewOfDocuments(s,l,u)).next(()=>l)}).then(s=>(n.os=i,s))}function V3t(t,e,n){let r=Ln(),i=Ln();return n.forEach(s=>r=r.add(s)),e.getEntries(t,r).next(s=>{let a=Of();return n.forEach((o,l)=>{const u=s.get(o);l.isFoundDocument()!==u.isFoundDocument()&&(i=i.add(o)),l.isNoDocument()&&l.version.isEqual(sn.min())?(e.removeEntry(o,l.readTime),a=a.insert(o,l)):!u.isValidDocument()||l.version.compareTo(u.version)>0||l.version.compareTo(u.version)===0&&u.hasPendingWrites?(e.addEntry(l),a=a.insert(o,l)):It("LocalStore","Ignoring outdated watch update for ",o,". Current version:",u.version," Watch version:",l.version)}),{Ps:a,Is:i}})}function z3t(t,e){const n=an(t);return n.persistence.runTransaction("Get next mutation batch","readonly",r=>(e===void 0&&(e=-1),n.mutationQueue.getNextMutationBatchAfterBatchId(r,e)))}function k3t(t,e){const n=an(t);return n.persistence.runTransaction("Allocate target","readwrite",r=>{let i;return n.Ur.getTargetData(r,e).next(s=>s?(i=s,at.resolve(i)):n.Ur.allocateTargetId(r).next(a=>(i=new tp(e,a,"TargetPurposeListen",r.currentSequenceNumber),n.Ur.addTargetData(r,i).next(()=>i))))}).then(r=>{const i=n.os.get(r.targetId);return(i===null||r.snapshotVersion.compareTo(i.snapshotVersion)>0)&&(n.os=n.os.insert(r.targetId,r),n._s.set(e,r.targetId)),r})}async function q4(t,e,n){const r=an(t),i=r.os.get(e),s=n?"readwrite":"readwrite-primary";try{n||await r.persistence.runTransaction("Release target",s,a=>r.persistence.referenceDelegate.removeTarget(a,i))}catch(a){if(!fw(a))throw a;It("LocalStore",`Failed to update sequence numbers for target ${e}: ${a}`)}r.os=r.os.remove(e),r._s.delete(i.target)}function Ree(t,e,n){const r=an(t);let i=sn.min(),s=Ln();return r.persistence.runTransaction("Execute query","readwrite",a=>function(l,u,c){const d=an(l),f=d._s.get(c);return f!==void 0?at.resolve(d.os.get(f)):d.Ur.getTargetData(u,c)}(r,a,jc(e)).next(o=>{if(o)return i=o.lastLimboFreeSnapshotVersion,r.Ur.getMatchingKeysForTargetId(a,o.targetId).next(l=>{s=l})}).next(()=>r.ss.getDocumentsMatchingQuery(a,e,n?i:sn.min(),n?s:Ln())).next(o=>(O3t(r,xSt(e),o),{documents:o,Ts:s})))}function O3t(t,e,n){let r=t.us.get(e)||sn.min();n.forEach((i,s)=>{s.readTime.compareTo(r)>0&&(r=s.readTime)}),t.us.set(e,r)}class Vee{constructor(){this.activeTargetIds=RSt()}fs(e){this.activeTargetIds=this.activeTargetIds.add(e)}gs(e){this.activeTargetIds=this.activeTargetIds.delete(e)}Vs(){const e={activeTargetIds:this.activeTargetIds.toArray(),updateTimeMs:Date.now()};return JSON.stringify(e)}}class I3t{constructor(){this.so=new Vee,this.oo={},this.onlineStateHandler=null,this.sequenceNumberHandler=null}addPendingMutation(e){}updateMutationState(e,n,r){}addLocalQueryTarget(e,n=!0){return n&&this.so.fs(e),this.oo[e]||"not-current"}updateQueryState(e,n,r){this.oo[e]=n}removeLocalQueryTarget(e){this.so.gs(e)}isLocalQueryTarget(e){return this.so.activeTargetIds.has(e)}clearQueryState(e){delete this.oo[e]}getAllActiveQueryTargets(){return this.so.activeTargetIds}isActiveQueryTarget(e){return this.so.activeTargetIds.has(e)}start(){return this.so=new Vee,Promise.resolve()}handleUserChange(e,n,r){}setOnlineState(e){}shutdown(){}writeSequenceNumber(e){}notifyBundleLoaded(e){}}/** * @license * Copyright 2019 Google LLC * @@ -9004,7 +9004,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class I3t{_o(e){}shutdown(){}}/** + */class U3t{_o(e){}shutdown(){}}/** * @license * Copyright 2019 Google LLC * @@ -9019,7 +9019,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Oee{constructor(){this.ao=()=>this.uo(),this.co=()=>this.lo(),this.ho=[],this.Po()}_o(e){this.ho.push(e)}shutdown(){window.removeEventListener("online",this.ao),window.removeEventListener("offline",this.co)}Po(){window.addEventListener("online",this.ao),window.addEventListener("offline",this.co)}uo(){It("ConnectivityMonitor","Network connectivity changed: AVAILABLE");for(const e of this.ho)e(0)}lo(){It("ConnectivityMonitor","Network connectivity changed: UNAVAILABLE");for(const e of this.ho)e(1)}static D(){return typeof window<"u"&&window.addEventListener!==void 0&&window.removeEventListener!==void 0}}/** + */class zee{constructor(){this.ao=()=>this.uo(),this.co=()=>this.lo(),this.ho=[],this.Po()}_o(e){this.ho.push(e)}shutdown(){window.removeEventListener("online",this.ao),window.removeEventListener("offline",this.co)}Po(){window.addEventListener("online",this.ao),window.addEventListener("offline",this.co)}uo(){It("ConnectivityMonitor","Network connectivity changed: AVAILABLE");for(const e of this.ho)e(0)}lo(){It("ConnectivityMonitor","Network connectivity changed: UNAVAILABLE");for(const e of this.ho)e(1)}static D(){return typeof window<"u"&&window.addEventListener!==void 0&&window.removeEventListener!==void 0}}/** * @license * Copyright 2023 Google LLC * @@ -9049,7 +9049,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const U3t={BatchGetDocuments:"batchGet",Commit:"commit",RunQuery:"runQuery",RunAggregationQuery:"runAggregationQuery"};/** + */const N3t={BatchGetDocuments:"batchGet",Commit:"commit",RunQuery:"runQuery",RunAggregationQuery:"runAggregationQuery"};/** * @license * Copyright 2017 Google LLC * @@ -9064,7 +9064,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class N3t{constructor(e){this.Io=e.Io,this.To=e.To}Eo(e){this.Ao=e}Ro(e){this.Vo=e}mo(e){this.fo=e}onMessage(e){this.po=e}close(){this.To()}send(e){this.Io(e)}yo(){this.Ao()}wo(){this.Vo()}So(e){this.fo(e)}bo(e){this.po(e)}}/** + */class L3t{constructor(e){this.Io=e.Io,this.To=e.To}Eo(e){this.Ao=e}Ro(e){this.Vo=e}mo(e){this.fo=e}onMessage(e){this.po=e}close(){this.To()}send(e){this.Io(e)}yo(){this.Ao()}wo(){this.Vo()}So(e){this.fo(e)}bo(e){this.po(e)}}/** * @license * Copyright 2017 Google LLC * @@ -9079,7 +9079,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const va="WebChannelConnection";class L3t extends class{constructor(n){this.databaseInfo=n,this.databaseId=n.databaseId;const r=n.ssl?"https":"http",i=encodeURIComponent(this.databaseId.projectId),s=encodeURIComponent(this.databaseId.database);this.Do=r+"://"+n.host,this.vo=`projects/${i}/databases/${s}`,this.Co=this.databaseId.database==="(default)"?`project_id=${i}`:`project_id=${i}&database_id=${s}`}get Fo(){return!1}Mo(n,r,i,s,a){const o=bU(),l=this.xo(n,r.toUriEncodedString());It("RestConnection",`Sending RPC '${n}' ${o}:`,l,i);const u={"google-cloud-resource-prefix":this.vo,"x-goog-request-params":this.Co};return this.Oo(u,s,a),this.No(n,l,u,i).then(c=>(It("RestConnection",`Received RPC '${n}' ${o}: `,c),c),c=>{throw Kb("RestConnection",`RPC '${n}' ${o} failed with error: `,c,"url: ",l,"request:",i),c})}Lo(n,r,i,s,a,o){return this.Mo(n,r,i,s,a)}Oo(n,r,i){n["X-Goog-Api-Client"]=function(){return"gl-js/ fire/"+Yy}(),n["Content-Type"]="text/plain",this.databaseInfo.appId&&(n["X-Firebase-GMPID"]=this.databaseInfo.appId),r&&r.headers.forEach((s,a)=>n[a]=s),i&&i.headers.forEach((s,a)=>n[a]=s)}xo(n,r){const i=U3t[n];return`${this.Do}/v1/${r}:${i}`}terminate(){}}{constructor(e){super(e),this.forceLongPolling=e.forceLongPolling,this.autoDetectLongPolling=e.autoDetectLongPolling,this.useFetchStreams=e.useFetchStreams,this.longPollingOptions=e.longPollingOptions}No(e,n,r,i){const s=bU();return new Promise((a,o)=>{const l=new Jge;l.setWithCredentials(!0),l.listenOnce(Yge.COMPLETE,()=>{try{switch(l.getLastErrorCode()){case H7.NO_ERROR:const c=l.getResponseJson();It(va,`XHR for RPC '${e}' ${s} received:`,JSON.stringify(c)),a(c);break;case H7.TIMEOUT:It(va,`RPC '${e}' ${s} timed out`),o(new Et(nt.DEADLINE_EXCEEDED,"Request time out"));break;case H7.HTTP_ERROR:const d=l.getStatus();if(It(va,`RPC '${e}' ${s} failed with status:`,d,"response text:",l.getResponseText()),d>0){let f=l.getResponseJson();Array.isArray(f)&&(f=f[0]);const h=f==null?void 0:f.error;if(h&&h.status&&h.message){const p=function(v){const g=v.toLowerCase().replace(/_/g,"-");return Object.values(nt).indexOf(g)>=0?g:nt.UNKNOWN}(h.status);o(new Et(p,h.message))}else o(new Et(nt.UNKNOWN,"Server responded with status "+l.getStatus()))}else o(new Et(nt.UNAVAILABLE,"Connection failed."));break;default:_t()}}finally{It(va,`RPC '${e}' ${s} completed.`)}});const u=JSON.stringify(i);It(va,`RPC '${e}' ${s} sending request:`,i),l.send(n,"POST",u,r,15)})}Bo(e,n,r){const i=bU(),s=[this.Do,"/","google.firestore.v1.Firestore","/",e,"/channel"],a=Qge(),o=Hge(),l={httpSessionIdParam:"gsessionid",initMessageHeaders:{},messageUrlParams:{database:`projects/${this.databaseId.projectId}/databases/${this.databaseId.database}`},sendRawJson:!0,supportsCrossDomainXhr:!0,internalChannelParams:{forwardChannelRequestTimeoutMs:6e5},forceLongPolling:this.forceLongPolling,detectBufferingProxy:this.autoDetectLongPolling},u=this.longPollingOptions.timeoutSeconds;u!==void 0&&(l.longPollingTimeout=Math.round(1e3*u)),this.useFetchStreams&&(l.useFetchStreams=!0),this.Oo(l.initMessageHeaders,n,r),l.encodeInitMessageHeaders=!0;const c=s.join("");It(va,`Creating RPC '${e}' stream ${i}: ${c}`,l);const d=a.createWebChannel(c,l);let f=!1,h=!1;const p=new N3t({Io:v=>{h?It(va,`Not sending because RPC '${e}' stream ${i} is closed:`,v):(f||(It(va,`Opening RPC '${e}' stream ${i} transport.`),d.open(),f=!0),It(va,`RPC '${e}' stream ${i} sending:`,v),d.send(v))},To:()=>d.close()}),m=(v,g,b)=>{v.listen(g,y=>{try{b(y)}catch(x){setTimeout(()=>{throw x},0)}})};return m(d,P3.EventType.OPEN,()=>{h||(It(va,`RPC '${e}' stream ${i} transport opened.`),p.yo())}),m(d,P3.EventType.CLOSE,()=>{h||(h=!0,It(va,`RPC '${e}' stream ${i} transport closed`),p.So())}),m(d,P3.EventType.ERROR,v=>{h||(h=!0,Kb(va,`RPC '${e}' stream ${i} transport errored:`,v),p.So(new Et(nt.UNAVAILABLE,"The operation could not be completed")))}),m(d,P3.EventType.MESSAGE,v=>{var g;if(!h){const b=v.data[0];Pr(!!b);const y=b,x=y.error||((g=y[0])===null||g===void 0?void 0:g.error);if(x){It(va,`RPC '${e}' stream ${i} received error:`,x);const T=x.status;let M=function(P){const R=$i[P];if(R!==void 0)return w1e(R)}(T),E=x.message;M===void 0&&(M=nt.INTERNAL,E="Unknown error status: "+T+" with message "+x.message),h=!0,p.So(new Et(M,E)),d.close()}else It(va,`RPC '${e}' stream ${i} received:`,b),p.bo(b)}}),m(o,Bge.STAT_EVENT,v=>{v.stat===z4.PROXY?It(va,`RPC '${e}' stream ${i} detected buffering proxy`):v.stat===z4.NOPROXY&&It(va,`RPC '${e}' stream ${i} detected no buffering proxy`)}),setTimeout(()=>{p.wo()},0),p}}function yU(){return typeof document<"u"?document:null}/** + */const va="WebChannelConnection";class X3t extends class{constructor(n){this.databaseInfo=n,this.databaseId=n.databaseId;const r=n.ssl?"https":"http",i=encodeURIComponent(this.databaseId.projectId),s=encodeURIComponent(this.databaseId.database);this.Do=r+"://"+n.host,this.vo=`projects/${i}/databases/${s}`,this.Co=this.databaseId.database==="(default)"?`project_id=${i}`:`project_id=${i}&database_id=${s}`}get Fo(){return!1}Mo(n,r,i,s,a){const o=bU(),l=this.xo(n,r.toUriEncodedString());It("RestConnection",`Sending RPC '${n}' ${o}:`,l,i);const u={"google-cloud-resource-prefix":this.vo,"x-goog-request-params":this.Co};return this.Oo(u,s,a),this.No(n,l,u,i).then(c=>(It("RestConnection",`Received RPC '${n}' ${o}: `,c),c),c=>{throw Kb("RestConnection",`RPC '${n}' ${o} failed with error: `,c,"url: ",l,"request:",i),c})}Lo(n,r,i,s,a,o){return this.Mo(n,r,i,s,a)}Oo(n,r,i){n["X-Goog-Api-Client"]=function(){return"gl-js/ fire/"+Jy}(),n["Content-Type"]="text/plain",this.databaseInfo.appId&&(n["X-Firebase-GMPID"]=this.databaseInfo.appId),r&&r.headers.forEach((s,a)=>n[a]=s),i&&i.headers.forEach((s,a)=>n[a]=s)}xo(n,r){const i=N3t[n];return`${this.Do}/v1/${r}:${i}`}terminate(){}}{constructor(e){super(e),this.forceLongPolling=e.forceLongPolling,this.autoDetectLongPolling=e.autoDetectLongPolling,this.useFetchStreams=e.useFetchStreams,this.longPollingOptions=e.longPollingOptions}No(e,n,r,i){const s=bU();return new Promise((a,o)=>{const l=new Zge;l.setWithCredentials(!0),l.listenOnce(Jge.COMPLETE,()=>{try{switch(l.getLastErrorCode()){case H7.NO_ERROR:const c=l.getResponseJson();It(va,`XHR for RPC '${e}' ${s} received:`,JSON.stringify(c)),a(c);break;case H7.TIMEOUT:It(va,`RPC '${e}' ${s} timed out`),o(new Et(nt.DEADLINE_EXCEEDED,"Request time out"));break;case H7.HTTP_ERROR:const d=l.getStatus();if(It(va,`RPC '${e}' ${s} failed with status:`,d,"response text:",l.getResponseText()),d>0){let f=l.getResponseJson();Array.isArray(f)&&(f=f[0]);const h=f==null?void 0:f.error;if(h&&h.status&&h.message){const p=function(v){const g=v.toLowerCase().replace(/_/g,"-");return Object.values(nt).indexOf(g)>=0?g:nt.UNKNOWN}(h.status);o(new Et(p,h.message))}else o(new Et(nt.UNKNOWN,"Server responded with status "+l.getStatus()))}else o(new Et(nt.UNAVAILABLE,"Connection failed."));break;default:_t()}}finally{It(va,`RPC '${e}' ${s} completed.`)}});const u=JSON.stringify(i);It(va,`RPC '${e}' ${s} sending request:`,i),l.send(n,"POST",u,r,15)})}Bo(e,n,r){const i=bU(),s=[this.Do,"/","google.firestore.v1.Firestore","/",e,"/channel"],a=Hge(),o=Bge(),l={httpSessionIdParam:"gsessionid",initMessageHeaders:{},messageUrlParams:{database:`projects/${this.databaseId.projectId}/databases/${this.databaseId.database}`},sendRawJson:!0,supportsCrossDomainXhr:!0,internalChannelParams:{forwardChannelRequestTimeoutMs:6e5},forceLongPolling:this.forceLongPolling,detectBufferingProxy:this.autoDetectLongPolling},u=this.longPollingOptions.timeoutSeconds;u!==void 0&&(l.longPollingTimeout=Math.round(1e3*u)),this.useFetchStreams&&(l.useFetchStreams=!0),this.Oo(l.initMessageHeaders,n,r),l.encodeInitMessageHeaders=!0;const c=s.join("");It(va,`Creating RPC '${e}' stream ${i}: ${c}`,l);const d=a.createWebChannel(c,l);let f=!1,h=!1;const p=new L3t({Io:v=>{h?It(va,`Not sending because RPC '${e}' stream ${i} is closed:`,v):(f||(It(va,`Opening RPC '${e}' stream ${i} transport.`),d.open(),f=!0),It(va,`RPC '${e}' stream ${i} sending:`,v),d.send(v))},To:()=>d.close()}),m=(v,g,b)=>{v.listen(g,y=>{try{b(y)}catch(x){setTimeout(()=>{throw x},0)}})};return m(d,M3.EventType.OPEN,()=>{h||(It(va,`RPC '${e}' stream ${i} transport opened.`),p.yo())}),m(d,M3.EventType.CLOSE,()=>{h||(h=!0,It(va,`RPC '${e}' stream ${i} transport closed`),p.So())}),m(d,M3.EventType.ERROR,v=>{h||(h=!0,Kb(va,`RPC '${e}' stream ${i} transport errored:`,v),p.So(new Et(nt.UNAVAILABLE,"The operation could not be completed")))}),m(d,M3.EventType.MESSAGE,v=>{var g;if(!h){const b=v.data[0];Pr(!!b);const y=b,x=y.error||((g=y[0])===null||g===void 0?void 0:g.error);if(x){It(va,`RPC '${e}' stream ${i} received error:`,x);const T=x.status;let M=function(P){const R=$i[P];if(R!==void 0)return T1e(R)}(T),E=x.message;M===void 0&&(M=nt.INTERNAL,E="Unknown error status: "+T+" with message "+x.message),h=!0,p.So(new Et(M,E)),d.close()}else It(va,`RPC '${e}' stream ${i} received:`,b),p.bo(b)}}),m(o,Yge.STAT_EVENT,v=>{v.stat===z4.PROXY?It(va,`RPC '${e}' stream ${i} detected buffering proxy`):v.stat===z4.NOPROXY&&It(va,`RPC '${e}' stream ${i} detected no buffering proxy`)}),setTimeout(()=>{p.wo()},0),p}}function yU(){return typeof document<"u"?document:null}/** * @license * Copyright 2020 Google LLC * @@ -9094,7 +9094,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function W9(t){return new jSt(t,!0)}/** + */function W9(t){return new ZSt(t,!0)}/** * @license * Copyright 2017 Google LLC * @@ -9109,7 +9109,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class L1e{constructor(e,n,r=1e3,i=1.5,s=6e4){this.ui=e,this.timerId=n,this.ko=r,this.qo=i,this.Qo=s,this.Ko=0,this.$o=null,this.Uo=Date.now(),this.reset()}reset(){this.Ko=0}Wo(){this.Ko=this.Qo}Go(e){this.cancel();const n=Math.floor(this.Ko+this.zo()),r=Math.max(0,Date.now()-this.Uo),i=Math.max(0,n-r);i>0&&It("ExponentialBackoff",`Backing off for ${i} ms (base delay: ${this.Ko} ms, delay with jitter: ${n} ms, last attempt: ${r} ms ago)`),this.$o=this.ui.enqueueAfterDelay(this.timerId,i,()=>(this.Uo=Date.now(),e())),this.Ko*=this.qo,this.Kothis.Qo&&(this.Ko=this.Qo)}jo(){this.$o!==null&&(this.$o.skipDelay(),this.$o=null)}cancel(){this.$o!==null&&(this.$o.cancel(),this.$o=null)}zo(){return(Math.random()-.5)*this.Ko}}/** + */class N1e{constructor(e,n,r=1e3,i=1.5,s=6e4){this.ui=e,this.timerId=n,this.ko=r,this.qo=i,this.Qo=s,this.Ko=0,this.$o=null,this.Uo=Date.now(),this.reset()}reset(){this.Ko=0}Wo(){this.Ko=this.Qo}Go(e){this.cancel();const n=Math.floor(this.Ko+this.zo()),r=Math.max(0,Date.now()-this.Uo),i=Math.max(0,n-r);i>0&&It("ExponentialBackoff",`Backing off for ${i} ms (base delay: ${this.Ko} ms, delay with jitter: ${n} ms, last attempt: ${r} ms ago)`),this.$o=this.ui.enqueueAfterDelay(this.timerId,i,()=>(this.Uo=Date.now(),e())),this.Ko*=this.qo,this.Kothis.Qo&&(this.Ko=this.Qo)}jo(){this.$o!==null&&(this.$o.skipDelay(),this.$o=null)}cancel(){this.$o!==null&&(this.$o.cancel(),this.$o=null)}zo(){return(Math.random()-.5)*this.Ko}}/** * @license * Copyright 2017 Google LLC * @@ -9124,7 +9124,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class X1e{constructor(e,n,r,i,s,a,o,l){this.ui=e,this.Ho=r,this.Jo=i,this.connection=s,this.authCredentialsProvider=a,this.appCheckCredentialsProvider=o,this.listener=l,this.state=0,this.Yo=0,this.Zo=null,this.Xo=null,this.stream=null,this.e_=0,this.t_=new L1e(e,n)}n_(){return this.state===1||this.state===5||this.r_()}r_(){return this.state===2||this.state===3}start(){this.e_=0,this.state!==4?this.auth():this.i_()}async stop(){this.n_()&&await this.close(0)}s_(){this.state=0,this.t_.reset()}o_(){this.r_()&&this.Zo===null&&(this.Zo=this.ui.enqueueAfterDelay(this.Ho,6e4,()=>this.__()))}a_(e){this.u_(),this.stream.send(e)}async __(){if(this.r_())return this.close(0)}u_(){this.Zo&&(this.Zo.cancel(),this.Zo=null)}c_(){this.Xo&&(this.Xo.cancel(),this.Xo=null)}async close(e,n){this.u_(),this.c_(),this.t_.cancel(),this.Yo++,e!==4?this.t_.reset():n&&n.code===nt.RESOURCE_EXHAUSTED?(kf(n.toString()),kf("Using maximum backoff delay to prevent overloading the backend."),this.t_.Wo()):n&&n.code===nt.UNAUTHENTICATED&&this.state!==3&&(this.authCredentialsProvider.invalidateToken(),this.appCheckCredentialsProvider.invalidateToken()),this.stream!==null&&(this.l_(),this.stream.close(),this.stream=null),this.state=e,await this.listener.mo(n)}l_(){}auth(){this.state=1;const e=this.h_(this.Yo),n=this.Yo;Promise.all([this.authCredentialsProvider.getToken(),this.appCheckCredentialsProvider.getToken()]).then(([r,i])=>{this.Yo===n&&this.P_(r,i)},r=>{e(()=>{const i=new Et(nt.UNKNOWN,"Fetching auth token failed: "+r.message);return this.I_(i)})})}P_(e,n){const r=this.h_(this.Yo);this.stream=this.T_(e,n),this.stream.Eo(()=>{r(()=>this.listener.Eo())}),this.stream.Ro(()=>{r(()=>(this.state=2,this.Xo=this.ui.enqueueAfterDelay(this.Jo,1e4,()=>(this.r_()&&(this.state=3),Promise.resolve())),this.listener.Ro()))}),this.stream.mo(i=>{r(()=>this.I_(i))}),this.stream.onMessage(i=>{r(()=>++this.e_==1?this.E_(i):this.onNext(i))})}i_(){this.state=5,this.t_.Go(async()=>{this.state=0,this.start()})}I_(e){return It("PersistentStream",`close with error: ${e}`),this.stream=null,this.close(4,e)}h_(e){return n=>{this.ui.enqueueAndForget(()=>this.Yo===e?n():(It("PersistentStream","stream callback skipped by getCloseGuardedDispatcher."),Promise.resolve()))}}}class X3t extends X1e{constructor(e,n,r,i,s,a){super(e,"listen_stream_connection_backoff","listen_stream_idle","health_check_timeout",n,r,i,a),this.serializer=s}T_(e,n){return this.connection.Bo("Listen",e,n)}E_(e){return this.onNext(e)}onNext(e){this.t_.reset();const n=YSt(this.serializer,e),r=function(s){if(!("targetChange"in s))return sn.min();const a=s.targetChange;return a.targetIds&&a.targetIds.length?sn.min():a.readTime?Zc(a.readTime):sn.min()}(e);return this.listener.d_(n,r)}A_(e){const n={};n.database=K4(this.serializer),n.addTarget=function(s,a){let o;const l=a.target;if(o=U4(l)?{documents:QSt(s,l)}:{query:_St(s,l)._t},o.targetId=a.targetId,a.resumeToken.approximateByteSize()>0){o.resumeToken=P1e(s,a.resumeToken);const u=L4(s,a.expectedCount);u!==null&&(o.expectedCount=u)}else if(a.snapshotVersion.compareTo(sn.min())>0){o.readTime=tR(s,a.snapshotVersion.toTimestamp());const u=L4(s,a.expectedCount);u!==null&&(o.expectedCount=u)}return o}(this.serializer,e);const r=e3t(this.serializer,e);r&&(n.labels=r),this.a_(n)}R_(e){const n={};n.database=K4(this.serializer),n.removeTarget=e,this.a_(n)}}class C3t extends X1e{constructor(e,n,r,i,s,a){super(e,"write_stream_connection_backoff","write_stream_idle","health_check_timeout",n,r,i,a),this.serializer=s}get V_(){return this.e_>0}start(){this.lastStreamToken=void 0,super.start()}l_(){this.V_&&this.m_([])}T_(e,n){return this.connection.Bo("Write",e,n)}E_(e){return Pr(!!e.streamToken),this.lastStreamToken=e.streamToken,Pr(!e.writeResults||e.writeResults.length===0),this.listener.f_()}onNext(e){Pr(!!e.streamToken),this.lastStreamToken=e.streamToken,this.t_.reset();const n=HSt(e.writeResults,e.commitTime),r=Zc(e.commitTime);return this.listener.g_(r,n)}p_(){const e={};e.database=K4(this.serializer),this.a_(e)}m_(e){const n={streamToken:this.lastStreamToken,writes:e.map(r=>BSt(this.serializer,r))};this.a_(n)}}/** + */class L1e{constructor(e,n,r,i,s,a,o,l){this.ui=e,this.Ho=r,this.Jo=i,this.connection=s,this.authCredentialsProvider=a,this.appCheckCredentialsProvider=o,this.listener=l,this.state=0,this.Yo=0,this.Zo=null,this.Xo=null,this.stream=null,this.e_=0,this.t_=new N1e(e,n)}n_(){return this.state===1||this.state===5||this.r_()}r_(){return this.state===2||this.state===3}start(){this.e_=0,this.state!==4?this.auth():this.i_()}async stop(){this.n_()&&await this.close(0)}s_(){this.state=0,this.t_.reset()}o_(){this.r_()&&this.Zo===null&&(this.Zo=this.ui.enqueueAfterDelay(this.Ho,6e4,()=>this.__()))}a_(e){this.u_(),this.stream.send(e)}async __(){if(this.r_())return this.close(0)}u_(){this.Zo&&(this.Zo.cancel(),this.Zo=null)}c_(){this.Xo&&(this.Xo.cancel(),this.Xo=null)}async close(e,n){this.u_(),this.c_(),this.t_.cancel(),this.Yo++,e!==4?this.t_.reset():n&&n.code===nt.RESOURCE_EXHAUSTED?(kf(n.toString()),kf("Using maximum backoff delay to prevent overloading the backend."),this.t_.Wo()):n&&n.code===nt.UNAUTHENTICATED&&this.state!==3&&(this.authCredentialsProvider.invalidateToken(),this.appCheckCredentialsProvider.invalidateToken()),this.stream!==null&&(this.l_(),this.stream.close(),this.stream=null),this.state=e,await this.listener.mo(n)}l_(){}auth(){this.state=1;const e=this.h_(this.Yo),n=this.Yo;Promise.all([this.authCredentialsProvider.getToken(),this.appCheckCredentialsProvider.getToken()]).then(([r,i])=>{this.Yo===n&&this.P_(r,i)},r=>{e(()=>{const i=new Et(nt.UNKNOWN,"Fetching auth token failed: "+r.message);return this.I_(i)})})}P_(e,n){const r=this.h_(this.Yo);this.stream=this.T_(e,n),this.stream.Eo(()=>{r(()=>this.listener.Eo())}),this.stream.Ro(()=>{r(()=>(this.state=2,this.Xo=this.ui.enqueueAfterDelay(this.Jo,1e4,()=>(this.r_()&&(this.state=3),Promise.resolve())),this.listener.Ro()))}),this.stream.mo(i=>{r(()=>this.I_(i))}),this.stream.onMessage(i=>{r(()=>++this.e_==1?this.E_(i):this.onNext(i))})}i_(){this.state=5,this.t_.Go(async()=>{this.state=0,this.start()})}I_(e){return It("PersistentStream",`close with error: ${e}`),this.stream=null,this.close(4,e)}h_(e){return n=>{this.ui.enqueueAndForget(()=>this.Yo===e?n():(It("PersistentStream","stream callback skipped by getCloseGuardedDispatcher."),Promise.resolve()))}}}class C3t extends L1e{constructor(e,n,r,i,s,a){super(e,"listen_stream_connection_backoff","listen_stream_idle","health_check_timeout",n,r,i,a),this.serializer=s}T_(e,n){return this.connection.Bo("Listen",e,n)}E_(e){return this.onNext(e)}onNext(e){this.t_.reset();const n=BSt(this.serializer,e),r=function(s){if(!("targetChange"in s))return sn.min();const a=s.targetChange;return a.targetIds&&a.targetIds.length?sn.min():a.readTime?Zc(a.readTime):sn.min()}(e);return this.listener.d_(n,r)}A_(e){const n={};n.database=K4(this.serializer),n.addTarget=function(s,a){let o;const l=a.target;if(o=U4(l)?{documents:_St(s,l)}:{query:$St(s,l)._t},o.targetId=a.targetId,a.resumeToken.approximateByteSize()>0){o.resumeToken=M1e(s,a.resumeToken);const u=L4(s,a.expectedCount);u!==null&&(o.expectedCount=u)}else if(a.snapshotVersion.compareTo(sn.min())>0){o.readTime=eR(s,a.snapshotVersion.toTimestamp());const u=L4(s,a.expectedCount);u!==null&&(o.expectedCount=u)}return o}(this.serializer,e);const r=t3t(this.serializer,e);r&&(n.labels=r),this.a_(n)}R_(e){const n={};n.database=K4(this.serializer),n.removeTarget=e,this.a_(n)}}class K3t extends L1e{constructor(e,n,r,i,s,a){super(e,"write_stream_connection_backoff","write_stream_idle","health_check_timeout",n,r,i,a),this.serializer=s}get V_(){return this.e_>0}start(){this.lastStreamToken=void 0,super.start()}l_(){this.V_&&this.m_([])}T_(e,n){return this.connection.Bo("Write",e,n)}E_(e){return Pr(!!e.streamToken),this.lastStreamToken=e.streamToken,Pr(!e.writeResults||e.writeResults.length===0),this.listener.f_()}onNext(e){Pr(!!e.streamToken),this.lastStreamToken=e.streamToken,this.t_.reset();const n=QSt(e.writeResults,e.commitTime),r=Zc(e.commitTime);return this.listener.g_(r,n)}p_(){const e={};e.database=K4(this.serializer),this.a_(e)}m_(e){const n={streamToken:this.lastStreamToken,writes:e.map(r=>HSt(this.serializer,r))};this.a_(n)}}/** * @license * Copyright 2017 Google LLC * @@ -9139,7 +9139,7 @@ SPDX-License-Identifier: Apache-2.0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class K3t extends class{}{constructor(e,n,r,i){super(),this.authCredentials=e,this.appCheckCredentials=n,this.connection=r,this.serializer=i,this.y_=!1}w_(){if(this.y_)throw new Et(nt.FAILED_PRECONDITION,"The client has already been terminated.")}Mo(e,n,r,i){return this.w_(),Promise.all([this.authCredentials.getToken(),this.appCheckCredentials.getToken()]).then(([s,a])=>this.connection.Mo(e,X4(n,r),i,s,a)).catch(s=>{throw s.name==="FirebaseError"?(s.code===nt.UNAUTHENTICATED&&(this.authCredentials.invalidateToken(),this.appCheckCredentials.invalidateToken()),s):new Et(nt.UNKNOWN,s.toString())})}Lo(e,n,r,i,s){return this.w_(),Promise.all([this.authCredentials.getToken(),this.appCheckCredentials.getToken()]).then(([a,o])=>this.connection.Lo(e,X4(n,r),i,a,o,s)).catch(a=>{throw a.name==="FirebaseError"?(a.code===nt.UNAUTHENTICATED&&(this.authCredentials.invalidateToken(),this.appCheckCredentials.invalidateToken()),a):new Et(nt.UNKNOWN,a.toString())})}terminate(){this.y_=!0,this.connection.terminate()}}class q3t{constructor(e,n){this.asyncQueue=e,this.onlineStateHandler=n,this.state="Unknown",this.S_=0,this.b_=null,this.D_=!0}v_(){this.S_===0&&(this.C_("Unknown"),this.b_=this.asyncQueue.enqueueAfterDelay("online_state_timeout",1e4,()=>(this.b_=null,this.F_("Backend didn't respond within 10 seconds."),this.C_("Offline"),Promise.resolve())))}M_(e){this.state==="Online"?this.C_("Unknown"):(this.S_++,this.S_>=1&&(this.x_(),this.F_(`Connection failed 1 times. Most recent error: ${e.toString()}`),this.C_("Offline")))}set(e){this.x_(),this.S_=0,e==="Online"&&(this.D_=!1),this.C_(e)}C_(e){e!==this.state&&(this.state=e,this.onlineStateHandler(e))}F_(e){const n=`Could not reach Cloud Firestore backend. ${e} + */class q3t extends class{}{constructor(e,n,r,i){super(),this.authCredentials=e,this.appCheckCredentials=n,this.connection=r,this.serializer=i,this.y_=!1}w_(){if(this.y_)throw new Et(nt.FAILED_PRECONDITION,"The client has already been terminated.")}Mo(e,n,r,i){return this.w_(),Promise.all([this.authCredentials.getToken(),this.appCheckCredentials.getToken()]).then(([s,a])=>this.connection.Mo(e,X4(n,r),i,s,a)).catch(s=>{throw s.name==="FirebaseError"?(s.code===nt.UNAUTHENTICATED&&(this.authCredentials.invalidateToken(),this.appCheckCredentials.invalidateToken()),s):new Et(nt.UNKNOWN,s.toString())})}Lo(e,n,r,i,s){return this.w_(),Promise.all([this.authCredentials.getToken(),this.appCheckCredentials.getToken()]).then(([a,o])=>this.connection.Lo(e,X4(n,r),i,a,o,s)).catch(a=>{throw a.name==="FirebaseError"?(a.code===nt.UNAUTHENTICATED&&(this.authCredentials.invalidateToken(),this.appCheckCredentials.invalidateToken()),a):new Et(nt.UNKNOWN,a.toString())})}terminate(){this.y_=!0,this.connection.terminate()}}class D3t{constructor(e,n){this.asyncQueue=e,this.onlineStateHandler=n,this.state="Unknown",this.S_=0,this.b_=null,this.D_=!0}v_(){this.S_===0&&(this.C_("Unknown"),this.b_=this.asyncQueue.enqueueAfterDelay("online_state_timeout",1e4,()=>(this.b_=null,this.F_("Backend didn't respond within 10 seconds."),this.C_("Offline"),Promise.resolve())))}M_(e){this.state==="Online"?this.C_("Unknown"):(this.S_++,this.S_>=1&&(this.x_(),this.F_(`Connection failed 1 times. Most recent error: ${e.toString()}`),this.C_("Offline")))}set(e){this.x_(),this.S_=0,e==="Online"&&(this.D_=!1),this.C_(e)}C_(e){e!==this.state&&(this.state=e,this.onlineStateHandler(e))}F_(e){const n=`Could not reach Cloud Firestore backend. ${e} This typically indicates that your device does not have a healthy Internet connection at the moment. The client will operate in offline mode until it is able to successfully connect to the backend.`;this.D_?(kf(n),this.D_=!1):It("OnlineStateTracker",n)}x_(){this.b_!==null&&(this.b_.cancel(),this.b_=null)}}/** * @license * Copyright 2017 Google LLC @@ -9155,7 +9155,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class D3t{constructor(e,n,r,i,s){this.localStore=e,this.datastore=n,this.asyncQueue=r,this.remoteSyncer={},this.O_=[],this.N_=new Map,this.L_=new Set,this.B_=[],this.k_=s,this.k_._o(a=>{r.enqueueAndForget(async()=>{X0(this)&&(It("RemoteStore","Restarting streams for network reachability change."),await async function(l){const u=an(l);u.L_.add(4),await mw(u),u.q_.set("Unknown"),u.L_.delete(4),await A9(u)}(this))})}),this.q_=new q3t(r,i)}}async function A9(t){if(X0(t))for(const e of t.B_)await e(!0)}async function mw(t){for(const e of t.B_)await e(!1)}function C1e(t,e){const n=an(t);n.N_.has(e.targetId)||(n.N_.set(e.targetId,e),CW(n)?XW(n):Qy(n).r_()&&LW(n,e))}function NW(t,e){const n=an(t),r=Qy(n);n.N_.delete(e),r.r_()&&K1e(n,e),n.N_.size===0&&(r.r_()?r.o_():X0(n)&&n.q_.set("Unknown"))}function LW(t,e){if(t.Q_.xe(e.targetId),e.resumeToken.approximateByteSize()>0||e.snapshotVersion.compareTo(sn.min())>0){const n=t.remoteSyncer.getRemoteKeysForTarget(e.targetId).size;e=e.withExpectedCount(n)}Qy(t).A_(e)}function K1e(t,e){t.Q_.xe(e),Qy(t).R_(e)}function XW(t){t.Q_=new WSt({getRemoteKeysForTarget:e=>t.remoteSyncer.getRemoteKeysForTarget(e),ot:e=>t.N_.get(e)||null,tt:()=>t.datastore.serializer.databaseId}),Qy(t).start(),t.q_.v_()}function CW(t){return X0(t)&&!Qy(t).n_()&&t.N_.size>0}function X0(t){return an(t).L_.size===0}function q1e(t){t.Q_=void 0}async function W3t(t){t.q_.set("Online")}async function A3t(t){t.N_.forEach((e,n)=>{LW(t,e)})}async function G3t(t,e){q1e(t),CW(t)?(t.q_.M_(e),XW(t)):t.q_.set("Unknown")}async function F3t(t,e,n){if(t.q_.set("Online"),e instanceof M1e&&e.state===2&&e.cause)try{await async function(i,s){const a=s.cause;for(const o of s.targetIds)i.N_.has(o)&&(await i.remoteSyncer.rejectListen(o,a),i.N_.delete(o),i.Q_.removeTarget(o))}(t,e)}catch(r){It("RemoteStore","Failed to remove targets %s: %s ",e.targetIds.join(","),r),await nR(t,r)}else if(e instanceof $7?t.Q_.Ke(e):e instanceof E1e?t.Q_.He(e):t.Q_.We(e),!n.isEqual(sn.min()))try{const r=await N1e(t.localStore);n.compareTo(r)>=0&&await function(s,a){const o=s.Q_.rt(a);return o.targetChanges.forEach((l,u)=>{if(l.resumeToken.approximateByteSize()>0){const c=s.N_.get(u);c&&s.N_.set(u,c.withResumeToken(l.resumeToken,a))}}),o.targetMismatches.forEach((l,u)=>{const c=s.N_.get(l);if(!c)return;s.N_.set(l,c.withResumeToken(ua.EMPTY_BYTE_STRING,c.snapshotVersion)),K1e(s,l);const d=new tp(c.target,l,u,c.sequenceNumber);LW(s,d)}),s.remoteSyncer.applyRemoteEvent(o)}(t,n)}catch(r){It("RemoteStore","Failed to raise snapshot:",r),await nR(t,r)}}async function nR(t,e,n){if(!fw(e))throw e;t.L_.add(1),await mw(t),t.q_.set("Offline"),n||(n=()=>N1e(t.localStore)),t.asyncQueue.enqueueRetryable(async()=>{It("RemoteStore","Retrying IndexedDB access"),await n(),t.L_.delete(1),await A9(t)})}function D1e(t,e){return e().catch(n=>nR(t,n,e))}async function G9(t){const e=an(t),n=jp(e);let r=e.O_.length>0?e.O_[e.O_.length-1].batchId:-1;for(;j3t(e);)try{const i=await V3t(e.localStore,r);if(i===null){e.O_.length===0&&n.o_();break}r=i.batchId,Z3t(e,i)}catch(i){await nR(e,i)}W1e(e)&&A1e(e)}function j3t(t){return X0(t)&&t.O_.length<10}function Z3t(t,e){t.O_.push(e);const n=jp(t);n.r_()&&n.V_&&n.m_(e.mutations)}function W1e(t){return X0(t)&&!jp(t).n_()&&t.O_.length>0}function A1e(t){jp(t).start()}async function J3t(t){jp(t).p_()}async function Y3t(t){const e=jp(t);for(const n of t.O_)e.m_(n.mutations)}async function B3t(t,e,n){const r=t.O_.shift(),i=VW.from(r,e,n);await D1e(t,()=>t.remoteSyncer.applySuccessfulWrite(i)),await G9(t)}async function H3t(t,e){e&&jp(t).V_&&await async function(r,i){if(function(a){return KSt(a)&&a!==nt.ABORTED}(i.code)){const s=r.O_.shift();jp(r).s_(),await D1e(r,()=>r.remoteSyncer.rejectFailedWrite(s.batchId,i)),await G9(r)}}(t,e),W1e(t)&&A1e(t)}async function Iee(t,e){const n=an(t);n.asyncQueue.verifyOperationInProgress(),It("RemoteStore","RemoteStore received new credentials");const r=X0(n);n.L_.add(3),await mw(n),r&&n.q_.set("Unknown"),await n.remoteSyncer.handleCredentialChange(e),n.L_.delete(3),await A9(n)}async function Q3t(t,e){const n=an(t);e?(n.L_.delete(2),await A9(n)):e||(n.L_.add(2),await mw(n),n.q_.set("Unknown"))}function Qy(t){return t.K_||(t.K_=function(n,r,i){const s=an(n);return s.w_(),new X3t(r,s.connection,s.authCredentials,s.appCheckCredentials,s.serializer,i)}(t.datastore,t.asyncQueue,{Eo:W3t.bind(null,t),Ro:A3t.bind(null,t),mo:G3t.bind(null,t),d_:F3t.bind(null,t)}),t.B_.push(async e=>{e?(t.K_.s_(),CW(t)?XW(t):t.q_.set("Unknown")):(await t.K_.stop(),q1e(t))})),t.K_}function jp(t){return t.U_||(t.U_=function(n,r,i){const s=an(n);return s.w_(),new C3t(r,s.connection,s.authCredentials,s.appCheckCredentials,s.serializer,i)}(t.datastore,t.asyncQueue,{Eo:()=>Promise.resolve(),Ro:J3t.bind(null,t),mo:H3t.bind(null,t),f_:Y3t.bind(null,t),g_:B3t.bind(null,t)}),t.B_.push(async e=>{e?(t.U_.s_(),await G9(t)):(await t.U_.stop(),t.O_.length>0&&(It("RemoteStore",`Stopping write stream with ${t.O_.length} pending writes`),t.O_=[]))})),t.U_}/** + */class W3t{constructor(e,n,r,i,s){this.localStore=e,this.datastore=n,this.asyncQueue=r,this.remoteSyncer={},this.O_=[],this.N_=new Map,this.L_=new Set,this.B_=[],this.k_=s,this.k_._o(a=>{r.enqueueAndForget(async()=>{X0(this)&&(It("RemoteStore","Restarting streams for network reachability change."),await async function(l){const u=an(l);u.L_.add(4),await mw(u),u.q_.set("Unknown"),u.L_.delete(4),await A9(u)}(this))})}),this.q_=new D3t(r,i)}}async function A9(t){if(X0(t))for(const e of t.B_)await e(!0)}async function mw(t){for(const e of t.B_)await e(!1)}function X1e(t,e){const n=an(t);n.N_.has(e.targetId)||(n.N_.set(e.targetId,e),KW(n)?CW(n):Hy(n).r_()&&XW(n,e))}function LW(t,e){const n=an(t),r=Hy(n);n.N_.delete(e),r.r_()&&C1e(n,e),n.N_.size===0&&(r.r_()?r.o_():X0(n)&&n.q_.set("Unknown"))}function XW(t,e){if(t.Q_.xe(e.targetId),e.resumeToken.approximateByteSize()>0||e.snapshotVersion.compareTo(sn.min())>0){const n=t.remoteSyncer.getRemoteKeysForTarget(e.targetId).size;e=e.withExpectedCount(n)}Hy(t).A_(e)}function C1e(t,e){t.Q_.xe(e),Hy(t).R_(e)}function CW(t){t.Q_=new ASt({getRemoteKeysForTarget:e=>t.remoteSyncer.getRemoteKeysForTarget(e),ot:e=>t.N_.get(e)||null,tt:()=>t.datastore.serializer.databaseId}),Hy(t).start(),t.q_.v_()}function KW(t){return X0(t)&&!Hy(t).n_()&&t.N_.size>0}function X0(t){return an(t).L_.size===0}function K1e(t){t.Q_=void 0}async function A3t(t){t.q_.set("Online")}async function G3t(t){t.N_.forEach((e,n)=>{XW(t,e)})}async function F3t(t,e){K1e(t),KW(t)?(t.q_.M_(e),CW(t)):t.q_.set("Unknown")}async function j3t(t,e,n){if(t.q_.set("Online"),e instanceof E1e&&e.state===2&&e.cause)try{await async function(i,s){const a=s.cause;for(const o of s.targetIds)i.N_.has(o)&&(await i.remoteSyncer.rejectListen(o,a),i.N_.delete(o),i.Q_.removeTarget(o))}(t,e)}catch(r){It("RemoteStore","Failed to remove targets %s: %s ",e.targetIds.join(","),r),await tR(t,r)}else if(e instanceof $7?t.Q_.Ke(e):e instanceof w1e?t.Q_.He(e):t.Q_.We(e),!n.isEqual(sn.min()))try{const r=await U1e(t.localStore);n.compareTo(r)>=0&&await function(s,a){const o=s.Q_.rt(a);return o.targetChanges.forEach((l,u)=>{if(l.resumeToken.approximateByteSize()>0){const c=s.N_.get(u);c&&s.N_.set(u,c.withResumeToken(l.resumeToken,a))}}),o.targetMismatches.forEach((l,u)=>{const c=s.N_.get(l);if(!c)return;s.N_.set(l,c.withResumeToken(ua.EMPTY_BYTE_STRING,c.snapshotVersion)),C1e(s,l);const d=new tp(c.target,l,u,c.sequenceNumber);XW(s,d)}),s.remoteSyncer.applyRemoteEvent(o)}(t,n)}catch(r){It("RemoteStore","Failed to raise snapshot:",r),await tR(t,r)}}async function tR(t,e,n){if(!fw(e))throw e;t.L_.add(1),await mw(t),t.q_.set("Offline"),n||(n=()=>U1e(t.localStore)),t.asyncQueue.enqueueRetryable(async()=>{It("RemoteStore","Retrying IndexedDB access"),await n(),t.L_.delete(1),await A9(t)})}function q1e(t,e){return e().catch(n=>tR(t,n,e))}async function G9(t){const e=an(t),n=jp(e);let r=e.O_.length>0?e.O_[e.O_.length-1].batchId:-1;for(;Z3t(e);)try{const i=await z3t(e.localStore,r);if(i===null){e.O_.length===0&&n.o_();break}r=i.batchId,J3t(e,i)}catch(i){await tR(e,i)}D1e(e)&&W1e(e)}function Z3t(t){return X0(t)&&t.O_.length<10}function J3t(t,e){t.O_.push(e);const n=jp(t);n.r_()&&n.V_&&n.m_(e.mutations)}function D1e(t){return X0(t)&&!jp(t).n_()&&t.O_.length>0}function W1e(t){jp(t).start()}async function Y3t(t){jp(t).p_()}async function B3t(t){const e=jp(t);for(const n of t.O_)e.m_(n.mutations)}async function H3t(t,e,n){const r=t.O_.shift(),i=zW.from(r,e,n);await q1e(t,()=>t.remoteSyncer.applySuccessfulWrite(i)),await G9(t)}async function Q3t(t,e){e&&jp(t).V_&&await async function(r,i){if(function(a){return qSt(a)&&a!==nt.ABORTED}(i.code)){const s=r.O_.shift();jp(r).s_(),await q1e(r,()=>r.remoteSyncer.rejectFailedWrite(s.batchId,i)),await G9(r)}}(t,e),D1e(t)&&W1e(t)}async function kee(t,e){const n=an(t);n.asyncQueue.verifyOperationInProgress(),It("RemoteStore","RemoteStore received new credentials");const r=X0(n);n.L_.add(3),await mw(n),r&&n.q_.set("Unknown"),await n.remoteSyncer.handleCredentialChange(e),n.L_.delete(3),await A9(n)}async function _3t(t,e){const n=an(t);e?(n.L_.delete(2),await A9(n)):e||(n.L_.add(2),await mw(n),n.q_.set("Unknown"))}function Hy(t){return t.K_||(t.K_=function(n,r,i){const s=an(n);return s.w_(),new C3t(r,s.connection,s.authCredentials,s.appCheckCredentials,s.serializer,i)}(t.datastore,t.asyncQueue,{Eo:A3t.bind(null,t),Ro:G3t.bind(null,t),mo:F3t.bind(null,t),d_:j3t.bind(null,t)}),t.B_.push(async e=>{e?(t.K_.s_(),KW(t)?CW(t):t.q_.set("Unknown")):(await t.K_.stop(),K1e(t))})),t.K_}function jp(t){return t.U_||(t.U_=function(n,r,i){const s=an(n);return s.w_(),new K3t(r,s.connection,s.authCredentials,s.appCheckCredentials,s.serializer,i)}(t.datastore,t.asyncQueue,{Eo:()=>Promise.resolve(),Ro:Y3t.bind(null,t),mo:Q3t.bind(null,t),f_:B3t.bind(null,t),g_:H3t.bind(null,t)}),t.B_.push(async e=>{e?(t.U_.s_(),await G9(t)):(await t.U_.stop(),t.O_.length>0&&(It("RemoteStore",`Stopping write stream with ${t.O_.length} pending writes`),t.O_=[]))})),t.U_}/** * @license * Copyright 2017 Google LLC * @@ -9170,7 +9170,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class KW{constructor(e,n,r,i,s){this.asyncQueue=e,this.timerId=n,this.targetTimeMs=r,this.op=i,this.removalCallback=s,this.deferred=new Tp,this.then=this.deferred.promise.then.bind(this.deferred.promise),this.deferred.promise.catch(a=>{})}get promise(){return this.deferred.promise}static createAndSchedule(e,n,r,i,s){const a=Date.now()+r,o=new KW(e,n,a,i,s);return o.start(r),o}start(e){this.timerHandle=setTimeout(()=>this.handleDelayElapsed(),e)}skipDelay(){return this.handleDelayElapsed()}cancel(e){this.timerHandle!==null&&(this.clearTimeout(),this.deferred.reject(new Et(nt.CANCELLED,"Operation cancelled"+(e?": "+e:""))))}handleDelayElapsed(){this.asyncQueue.enqueueAndForget(()=>this.timerHandle!==null?(this.clearTimeout(),this.op().then(e=>this.deferred.resolve(e))):Promise.resolve())}clearTimeout(){this.timerHandle!==null&&(this.removalCallback(this),clearTimeout(this.timerHandle),this.timerHandle=null)}}function qW(t,e){if(kf("AsyncQueue",`${e}: ${t}`),fw(t))return new Et(nt.UNAVAILABLE,`${e}: ${t}`);throw t}/** + */class qW{constructor(e,n,r,i,s){this.asyncQueue=e,this.timerId=n,this.targetTimeMs=r,this.op=i,this.removalCallback=s,this.deferred=new Tp,this.then=this.deferred.promise.then.bind(this.deferred.promise),this.deferred.promise.catch(a=>{})}get promise(){return this.deferred.promise}static createAndSchedule(e,n,r,i,s){const a=Date.now()+r,o=new qW(e,n,a,i,s);return o.start(r),o}start(e){this.timerHandle=setTimeout(()=>this.handleDelayElapsed(),e)}skipDelay(){return this.handleDelayElapsed()}cancel(e){this.timerHandle!==null&&(this.clearTimeout(),this.deferred.reject(new Et(nt.CANCELLED,"Operation cancelled"+(e?": "+e:""))))}handleDelayElapsed(){this.asyncQueue.enqueueAndForget(()=>this.timerHandle!==null?(this.clearTimeout(),this.op().then(e=>this.deferred.resolve(e))):Promise.resolve())}clearTimeout(){this.timerHandle!==null&&(this.removalCallback(this),clearTimeout(this.timerHandle),this.timerHandle=null)}}function DW(t,e){if(kf("AsyncQueue",`${e}: ${t}`),fw(t))return new Et(nt.UNAVAILABLE,`${e}: ${t}`);throw t}/** * @license * Copyright 2017 Google LLC * @@ -9185,7 +9185,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class G1{constructor(e){this.comparator=e?(n,r)=>e(n,r)||Ft.comparator(n.key,r.key):(n,r)=>Ft.comparator(n.key,r.key),this.keyedMap=R3(),this.sortedSet=new Ri(this.comparator)}static emptySet(e){return new G1(e.comparator)}has(e){return this.keyedMap.get(e)!=null}get(e){return this.keyedMap.get(e)}first(){return this.sortedSet.minKey()}last(){return this.sortedSet.maxKey()}isEmpty(){return this.sortedSet.isEmpty()}indexOf(e){const n=this.keyedMap.get(e);return n?this.sortedSet.indexOf(n):-1}get size(){return this.sortedSet.size}forEach(e){this.sortedSet.inorderTraversal((n,r)=>(e(n),!1))}add(e){const n=this.delete(e.key);return n.copy(n.keyedMap.insert(e.key,e),n.sortedSet.insert(e,null))}delete(e){const n=this.get(e);return n?this.copy(this.keyedMap.remove(e),this.sortedSet.remove(n)):this}isEqual(e){if(!(e instanceof G1)||this.size!==e.size)return!1;const n=this.sortedSet.getIterator(),r=e.sortedSet.getIterator();for(;n.hasNext();){const i=n.getNext().key,s=r.getNext().key;if(!i.isEqual(s))return!1}return!0}toString(){const e=[];return this.forEach(n=>{e.push(n.toString())}),e.length===0?"DocumentSet ()":`DocumentSet ( + */class G1{constructor(e){this.comparator=e?(n,r)=>e(n,r)||Ft.comparator(n.key,r.key):(n,r)=>Ft.comparator(n.key,r.key),this.keyedMap=P3(),this.sortedSet=new Ri(this.comparator)}static emptySet(e){return new G1(e.comparator)}has(e){return this.keyedMap.get(e)!=null}get(e){return this.keyedMap.get(e)}first(){return this.sortedSet.minKey()}last(){return this.sortedSet.maxKey()}isEmpty(){return this.sortedSet.isEmpty()}indexOf(e){const n=this.keyedMap.get(e);return n?this.sortedSet.indexOf(n):-1}get size(){return this.sortedSet.size}forEach(e){this.sortedSet.inorderTraversal((n,r)=>(e(n),!1))}add(e){const n=this.delete(e.key);return n.copy(n.keyedMap.insert(e.key,e),n.sortedSet.insert(e,null))}delete(e){const n=this.get(e);return n?this.copy(this.keyedMap.remove(e),this.sortedSet.remove(n)):this}isEqual(e){if(!(e instanceof G1)||this.size!==e.size)return!1;const n=this.sortedSet.getIterator(),r=e.sortedSet.getIterator();for(;n.hasNext();){const i=n.getNext().key,s=r.getNext().key;if(!i.isEqual(s))return!1}return!0}toString(){const e=[];return this.forEach(n=>{e.push(n.toString())}),e.length===0?"DocumentSet ()":`DocumentSet ( `+e.join(` `)+` )`}copy(e,n){const r=new G1;return r.comparator=this.comparator,r.keyedMap=e,r.sortedSet=n,r}}/** @@ -9203,7 +9203,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Uee{constructor(){this.W_=new Ri(Ft.comparator)}track(e){const n=e.doc.key,r=this.W_.get(n);r?e.type!==0&&r.type===3?this.W_=this.W_.insert(n,e):e.type===3&&r.type!==1?this.W_=this.W_.insert(n,{type:r.type,doc:e.doc}):e.type===2&&r.type===2?this.W_=this.W_.insert(n,{type:2,doc:e.doc}):e.type===2&&r.type===0?this.W_=this.W_.insert(n,{type:0,doc:e.doc}):e.type===1&&r.type===0?this.W_=this.W_.remove(n):e.type===1&&r.type===2?this.W_=this.W_.insert(n,{type:1,doc:r.doc}):e.type===0&&r.type===1?this.W_=this.W_.insert(n,{type:2,doc:e.doc}):_t():this.W_=this.W_.insert(n,e)}G_(){const e=[];return this.W_.inorderTraversal((n,r)=>{e.push(r)}),e}}class Gb{constructor(e,n,r,i,s,a,o,l,u){this.query=e,this.docs=n,this.oldDocs=r,this.docChanges=i,this.mutatedKeys=s,this.fromCache=a,this.syncStateChanged=o,this.excludesMetadataChanges=l,this.hasCachedResults=u}static fromInitialDocuments(e,n,r,i,s){const a=[];return n.forEach(o=>{a.push({type:0,doc:o})}),new Gb(e,n,G1.emptySet(n),a,r,i,!0,!1,s)}get hasPendingWrites(){return!this.mutatedKeys.isEmpty()}isEqual(e){if(!(this.fromCache===e.fromCache&&this.hasCachedResults===e.hasCachedResults&&this.syncStateChanged===e.syncStateChanged&&this.mutatedKeys.isEqual(e.mutatedKeys)&&X9(this.query,e.query)&&this.docs.isEqual(e.docs)&&this.oldDocs.isEqual(e.oldDocs)))return!1;const n=this.docChanges,r=e.docChanges;if(n.length!==r.length)return!1;for(let i=0;i{e.push(r)}),e}}class Gb{constructor(e,n,r,i,s,a,o,l,u){this.query=e,this.docs=n,this.oldDocs=r,this.docChanges=i,this.mutatedKeys=s,this.fromCache=a,this.syncStateChanged=o,this.excludesMetadataChanges=l,this.hasCachedResults=u}static fromInitialDocuments(e,n,r,i,s){const a=[];return n.forEach(o=>{a.push({type:0,doc:o})}),new Gb(e,n,G1.emptySet(n),a,r,i,!0,!1,s)}get hasPendingWrites(){return!this.mutatedKeys.isEmpty()}isEqual(e){if(!(this.fromCache===e.fromCache&&this.hasCachedResults===e.hasCachedResults&&this.syncStateChanged===e.syncStateChanged&&this.mutatedKeys.isEqual(e.mutatedKeys)&&X9(this.query,e.query)&&this.docs.isEqual(e.docs)&&this.oldDocs.isEqual(e.oldDocs)))return!1;const n=this.docChanges,r=e.docChanges;if(n.length!==r.length)return!1;for(let i=0;ie.J_())}}class $3t{constructor(){this.queries=Nee(),this.onlineState="Unknown",this.Y_=new Set}terminate(){(function(n,r){const i=an(n),s=i.queries;i.queries=Nee(),s.forEach((a,o)=>{for(const l of o.j_)l.onError(r)})})(this,new Et(nt.ABORTED,"Firestore shutting down"))}}function Nee(){return new Hy(t=>d1e(t),X9)}async function ext(t,e){const n=an(t);let r=3;const i=e.query;let s=n.queries.get(i);s?!s.H_()&&e.J_()&&(r=2):(s=new _3t,r=e.J_()?0:1);try{switch(r){case 0:s.z_=await n.onListen(i,!0);break;case 1:s.z_=await n.onListen(i,!1);break;case 2:await n.onFirstRemoteStoreListen(i)}}catch(a){const o=qW(a,`Initialization of query '${e1(e.query)}' failed`);return void e.onError(o)}n.queries.set(i,s),s.j_.push(e),e.Z_(n.onlineState),s.z_&&e.X_(s.z_)&&DW(n)}async function txt(t,e){const n=an(t),r=e.query;let i=3;const s=n.queries.get(r);if(s){const a=s.j_.indexOf(e);a>=0&&(s.j_.splice(a,1),s.j_.length===0?i=e.J_()?0:1:!s.H_()&&e.J_()&&(i=2))}switch(i){case 0:return n.queries.delete(r),n.onUnlisten(r,!0);case 1:return n.queries.delete(r),n.onUnlisten(r,!1);case 2:return n.onLastRemoteStoreUnlisten(r);default:return}}function nxt(t,e){const n=an(t);let r=!1;for(const i of e){const s=i.query,a=n.queries.get(s);if(a){for(const o of a.j_)o.X_(i)&&(r=!0);a.z_=i}}r&&DW(n)}function rxt(t,e,n){const r=an(t),i=r.queries.get(e);if(i)for(const s of i.j_)s.onError(n);r.queries.delete(e)}function DW(t){t.Y_.forEach(e=>{e.next()})}var D4,Lee;(Lee=D4||(D4={})).ea="default",Lee.Cache="cache";class ixt{constructor(e,n,r){this.query=e,this.ta=n,this.na=!1,this.ra=null,this.onlineState="Unknown",this.options=r||{}}X_(e){if(!this.options.includeMetadataChanges){const r=[];for(const i of e.docChanges)i.type!==3&&r.push(i);e=new Gb(e.query,e.docs,e.oldDocs,r,e.mutatedKeys,e.fromCache,e.syncStateChanged,!0,e.hasCachedResults)}let n=!1;return this.na?this.ia(e)&&(this.ta.next(e),n=!0):this.sa(e,this.onlineState)&&(this.oa(e),n=!0),this.ra=e,n}onError(e){this.ta.error(e)}Z_(e){this.onlineState=e;let n=!1;return this.ra&&!this.na&&this.sa(this.ra,e)&&(this.oa(this.ra),n=!0),n}sa(e,n){if(!e.fromCache||!this.J_())return!0;const r=n!=="Offline";return(!this.options._a||!r)&&(!e.docs.isEmpty()||e.hasCachedResults||n==="Offline")}ia(e){if(e.docChanges.length>0)return!0;const n=this.ra&&this.ra.hasPendingWrites!==e.hasPendingWrites;return!(!e.syncStateChanged&&!n)&&this.options.includeMetadataChanges===!0}oa(e){e=Gb.fromInitialDocuments(e.query,e.docs,e.mutatedKeys,e.fromCache,e.hasCachedResults),this.na=!0,this.ta.next(e)}J_(){return this.options.source!==D4.Cache}}/** + */class $3t{constructor(){this.z_=void 0,this.j_=[]}H_(){return this.j_.some(e=>e.J_())}}class ext{constructor(){this.queries=Iee(),this.onlineState="Unknown",this.Y_=new Set}terminate(){(function(n,r){const i=an(n),s=i.queries;i.queries=Iee(),s.forEach((a,o)=>{for(const l of o.j_)l.onError(r)})})(this,new Et(nt.ABORTED,"Firestore shutting down"))}}function Iee(){return new By(t=>c1e(t),X9)}async function txt(t,e){const n=an(t);let r=3;const i=e.query;let s=n.queries.get(i);s?!s.H_()&&e.J_()&&(r=2):(s=new $3t,r=e.J_()?0:1);try{switch(r){case 0:s.z_=await n.onListen(i,!0);break;case 1:s.z_=await n.onListen(i,!1);break;case 2:await n.onFirstRemoteStoreListen(i)}}catch(a){const o=DW(a,`Initialization of query '${e1(e.query)}' failed`);return void e.onError(o)}n.queries.set(i,s),s.j_.push(e),e.Z_(n.onlineState),s.z_&&e.X_(s.z_)&&WW(n)}async function nxt(t,e){const n=an(t),r=e.query;let i=3;const s=n.queries.get(r);if(s){const a=s.j_.indexOf(e);a>=0&&(s.j_.splice(a,1),s.j_.length===0?i=e.J_()?0:1:!s.H_()&&e.J_()&&(i=2))}switch(i){case 0:return n.queries.delete(r),n.onUnlisten(r,!0);case 1:return n.queries.delete(r),n.onUnlisten(r,!1);case 2:return n.onLastRemoteStoreUnlisten(r);default:return}}function rxt(t,e){const n=an(t);let r=!1;for(const i of e){const s=i.query,a=n.queries.get(s);if(a){for(const o of a.j_)o.X_(i)&&(r=!0);a.z_=i}}r&&WW(n)}function ixt(t,e,n){const r=an(t),i=r.queries.get(e);if(i)for(const s of i.j_)s.onError(n);r.queries.delete(e)}function WW(t){t.Y_.forEach(e=>{e.next()})}var D4,Uee;(Uee=D4||(D4={})).ea="default",Uee.Cache="cache";class sxt{constructor(e,n,r){this.query=e,this.ta=n,this.na=!1,this.ra=null,this.onlineState="Unknown",this.options=r||{}}X_(e){if(!this.options.includeMetadataChanges){const r=[];for(const i of e.docChanges)i.type!==3&&r.push(i);e=new Gb(e.query,e.docs,e.oldDocs,r,e.mutatedKeys,e.fromCache,e.syncStateChanged,!0,e.hasCachedResults)}let n=!1;return this.na?this.ia(e)&&(this.ta.next(e),n=!0):this.sa(e,this.onlineState)&&(this.oa(e),n=!0),this.ra=e,n}onError(e){this.ta.error(e)}Z_(e){this.onlineState=e;let n=!1;return this.ra&&!this.na&&this.sa(this.ra,e)&&(this.oa(this.ra),n=!0),n}sa(e,n){if(!e.fromCache||!this.J_())return!0;const r=n!=="Offline";return(!this.options._a||!r)&&(!e.docs.isEmpty()||e.hasCachedResults||n==="Offline")}ia(e){if(e.docChanges.length>0)return!0;const n=this.ra&&this.ra.hasPendingWrites!==e.hasPendingWrites;return!(!e.syncStateChanged&&!n)&&this.options.includeMetadataChanges===!0}oa(e){e=Gb.fromInitialDocuments(e.query,e.docs,e.mutatedKeys,e.fromCache,e.hasCachedResults),this.na=!0,this.ta.next(e)}J_(){return this.options.source!==D4.Cache}}/** * @license * Copyright 2017 Google LLC * @@ -9233,7 +9233,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class G1e{constructor(e){this.key=e}}class F1e{constructor(e){this.key=e}}class sxt{constructor(e,n){this.query=e,this.Ta=n,this.Ea=null,this.hasCachedResults=!1,this.current=!1,this.da=Nn(),this.mutatedKeys=Nn(),this.Aa=f1e(e),this.Ra=new G1(this.Aa)}get Va(){return this.Ta}ma(e,n){const r=n?n.fa:new Uee,i=n?n.Ra:this.Ra;let s=n?n.mutatedKeys:this.mutatedKeys,a=i,o=!1;const l=this.query.limitType==="F"&&i.size===this.query.limit?i.last():null,u=this.query.limitType==="L"&&i.size===this.query.limit?i.first():null;if(e.inorderTraversal((c,d)=>{const f=i.get(c),h=C9(this.query,d)?d:null,p=!!f&&this.mutatedKeys.has(f.key),m=!!h&&(h.hasLocalMutations||this.mutatedKeys.has(h.key)&&h.hasCommittedMutations);let v=!1;f&&h?f.data.isEqual(h.data)?p!==m&&(r.track({type:3,doc:h}),v=!0):this.ga(f,h)||(r.track({type:2,doc:h}),v=!0,(l&&this.Aa(h,l)>0||u&&this.Aa(h,u)<0)&&(o=!0)):!f&&h?(r.track({type:0,doc:h}),v=!0):f&&!h&&(r.track({type:1,doc:f}),v=!0,(l||u)&&(o=!0)),v&&(h?(a=a.add(h),s=m?s.add(c):s.delete(c)):(a=a.delete(c),s=s.delete(c)))}),this.query.limit!==null)for(;a.size>this.query.limit;){const c=this.query.limitType==="F"?a.last():a.first();a=a.delete(c.key),s=s.delete(c.key),r.track({type:1,doc:c})}return{Ra:a,fa:r,ns:o,mutatedKeys:s}}ga(e,n){return e.hasLocalMutations&&n.hasCommittedMutations&&!n.hasLocalMutations}applyChanges(e,n,r,i){const s=this.Ra;this.Ra=e.Ra,this.mutatedKeys=e.mutatedKeys;const a=e.fa.G_();a.sort((c,d)=>function(h,p){const m=v=>{switch(v){case 0:return 1;case 2:case 3:return 2;case 1:return 0;default:return _t()}};return m(h)-m(p)}(c.type,d.type)||this.Aa(c.doc,d.doc)),this.pa(r),i=i!=null&&i;const o=n&&!i?this.ya():[],l=this.da.size===0&&this.current&&!i?1:0,u=l!==this.Ea;return this.Ea=l,a.length!==0||u?{snapshot:new Gb(this.query,e.Ra,s,a,e.mutatedKeys,l===0,u,!1,!!r&&r.resumeToken.approximateByteSize()>0),wa:o}:{wa:o}}Z_(e){return this.current&&e==="Offline"?(this.current=!1,this.applyChanges({Ra:this.Ra,fa:new Uee,mutatedKeys:this.mutatedKeys,ns:!1},!1)):{wa:[]}}Sa(e){return!this.Ta.has(e)&&!!this.Ra.has(e)&&!this.Ra.get(e).hasLocalMutations}pa(e){e&&(e.addedDocuments.forEach(n=>this.Ta=this.Ta.add(n)),e.modifiedDocuments.forEach(n=>{}),e.removedDocuments.forEach(n=>this.Ta=this.Ta.delete(n)),this.current=e.current)}ya(){if(!this.current)return[];const e=this.da;this.da=Nn(),this.Ra.forEach(r=>{this.Sa(r.key)&&(this.da=this.da.add(r.key))});const n=[];return e.forEach(r=>{this.da.has(r)||n.push(new F1e(r))}),this.da.forEach(r=>{e.has(r)||n.push(new G1e(r))}),n}ba(e){this.Ta=e.Ts,this.da=Nn();const n=this.ma(e.documents);return this.applyChanges(n,!0)}Da(){return Gb.fromInitialDocuments(this.query,this.Ra,this.mutatedKeys,this.Ea===0,this.hasCachedResults)}}class axt{constructor(e,n,r){this.query=e,this.targetId=n,this.view=r}}class oxt{constructor(e){this.key=e,this.va=!1}}class lxt{constructor(e,n,r,i,s,a){this.localStore=e,this.remoteStore=n,this.eventManager=r,this.sharedClientState=i,this.currentUser=s,this.maxConcurrentLimboResolutions=a,this.Ca={},this.Fa=new Hy(o=>d1e(o),X9),this.Ma=new Map,this.xa=new Set,this.Oa=new Ri(Ft.comparator),this.Na=new Map,this.La=new OW,this.Ba={},this.ka=new Map,this.qa=Ab.kn(),this.onlineState="Unknown",this.Qa=void 0}get isPrimaryClient(){return this.Qa===!0}}async function uxt(t,e,n=!0){const r=H1e(t);let i;const s=r.Fa.get(e);return s?(r.sharedClientState.addLocalQueryTarget(s.targetId),i=s.view.Da()):i=await j1e(r,e,n,!0),i}async function cxt(t,e){const n=H1e(t);await j1e(n,e,!0,!1)}async function j1e(t,e,n,r){const i=await z3t(t.localStore,jc(e)),s=i.targetId,a=t.sharedClientState.addLocalQueryTarget(s,n);let o;return r&&(o=await dxt(t,e,s,a==="current",i.resumeToken)),t.isPrimaryClient&&n&&C1e(t.remoteStore,i),o}async function dxt(t,e,n,r,i){t.Ka=(d,f,h)=>async function(m,v,g,b){let y=v.view.ma(g);y.ns&&(y=await zee(m.localStore,v.query,!1).then(({documents:E})=>v.view.ma(E,y)));const x=b&&b.targetChanges.get(v.targetId),T=b&&b.targetMismatches.get(v.targetId)!=null,M=v.view.applyChanges(y,m.isPrimaryClient,x,T);return Cee(m,v.targetId,M.wa),M.snapshot}(t,d,f,h);const s=await zee(t.localStore,e,!0),a=new sxt(e,s.Ts),o=a.ma(s.documents),l=pw.createSynthesizedTargetChangeForCurrentChange(n,r&&t.onlineState!=="Offline",i),u=a.applyChanges(o,t.isPrimaryClient,l);Cee(t,n,u.wa);const c=new axt(e,n,a);return t.Fa.set(e,c),t.Ma.has(n)?t.Ma.get(n).push(e):t.Ma.set(n,[e]),u.snapshot}async function fxt(t,e,n){const r=an(t),i=r.Fa.get(e),s=r.Ma.get(i.targetId);if(s.length>1)return r.Ma.set(i.targetId,s.filter(a=>!X9(a,e))),void r.Fa.delete(e);r.isPrimaryClient?(r.sharedClientState.removeLocalQueryTarget(i.targetId),r.sharedClientState.isActiveQueryTarget(i.targetId)||await q4(r.localStore,i.targetId,!1).then(()=>{r.sharedClientState.clearQueryState(i.targetId),n&&NW(r.remoteStore,i.targetId),W4(r,i.targetId)}).catch(dw)):(W4(r,i.targetId),await q4(r.localStore,i.targetId,!0))}async function hxt(t,e){const n=an(t),r=n.Fa.get(e),i=n.Ma.get(r.targetId);n.isPrimaryClient&&i.length===1&&(n.sharedClientState.removeLocalQueryTarget(r.targetId),NW(n.remoteStore,r.targetId))}async function pxt(t,e,n){const r=xxt(t);try{const i=await function(a,o){const l=an(a),u=Es.now(),c=o.reduce((h,p)=>h.add(p.key),Nn());let d,f;return l.persistence.runTransaction("Locally write mutations","readwrite",h=>{let p=Of(),m=Nn();return l.cs.getEntries(h,c).next(v=>{p=v,p.forEach((g,b)=>{b.isValidDocument()||(m=m.add(g))})}).next(()=>l.localDocuments.getOverlayedDocuments(h,p)).next(v=>{d=v;const g=[];for(const b of o){const y=USt(b,d.get(b.key).overlayedDocument);y!=null&&g.push(new hm(b.key,y,n1e(y.value.mapValue),ml.exists(!0)))}return l.mutationQueue.addMutationBatch(h,u,g,o)}).next(v=>{f=v;const g=v.applyToLocalDocumentSet(d,m);return l.documentOverlayCache.saveOverlays(h,v.batchId,g)})}).then(()=>({batchId:f.batchId,changes:p1e(d)}))}(r.localStore,e);r.sharedClientState.addPendingMutation(i.batchId),function(a,o,l){let u=a.Ba[a.currentUser.toKey()];u||(u=new Ri(rr)),u=u.insert(o,l),a.Ba[a.currentUser.toKey()]=u}(r,i.batchId,n),await vw(r,i.changes),await G9(r.remoteStore)}catch(i){const s=qW(i,"Failed to persist write");n.reject(s)}}async function Z1e(t,e){const n=an(t);try{const r=await P3t(n.localStore,e);e.targetChanges.forEach((i,s)=>{const a=n.Na.get(s);a&&(Pr(i.addedDocuments.size+i.modifiedDocuments.size+i.removedDocuments.size<=1),i.addedDocuments.size>0?a.va=!0:i.modifiedDocuments.size>0?Pr(a.va):i.removedDocuments.size>0&&(Pr(a.va),a.va=!1))}),await vw(n,r,e)}catch(r){await dw(r)}}function Xee(t,e,n){const r=an(t);if(r.isPrimaryClient&&n===0||!r.isPrimaryClient&&n===1){const i=[];r.Fa.forEach((s,a)=>{const o=a.view.Z_(e);o.snapshot&&i.push(o.snapshot)}),function(a,o){const l=an(a);l.onlineState=o;let u=!1;l.queries.forEach((c,d)=>{for(const f of d.j_)f.Z_(o)&&(u=!0)}),u&&DW(l)}(r.eventManager,e),i.length&&r.Ca.d_(i),r.onlineState=e,r.isPrimaryClient&&r.sharedClientState.setOnlineState(e)}}async function mxt(t,e,n){const r=an(t);r.sharedClientState.updateQueryState(e,"rejected",n);const i=r.Na.get(e),s=i&&i.key;if(s){let a=new Ri(Ft.comparator);a=a.insert(s,Ra.newNoDocument(s,sn.min()));const o=Nn().add(s),l=new D9(sn.min(),new Map,new Ri(rr),a,o);await Z1e(r,l),r.Oa=r.Oa.remove(s),r.Na.delete(e),WW(r)}else await q4(r.localStore,e,!1).then(()=>W4(r,e,n)).catch(dw)}async function vxt(t,e){const n=an(t),r=e.batch.batchId;try{const i=await M3t(n.localStore,e);Y1e(n,r,null),J1e(n,r),n.sharedClientState.updateMutationState(r,"acknowledged"),await vw(n,i)}catch(i){await dw(i)}}async function gxt(t,e,n){const r=an(t);try{const i=await function(a,o){const l=an(a);return l.persistence.runTransaction("Reject batch","readwrite-primary",u=>{let c;return l.mutationQueue.lookupMutationBatch(u,o).next(d=>(Pr(d!==null),c=d.keys(),l.mutationQueue.removeMutationBatch(u,d))).next(()=>l.mutationQueue.performConsistencyCheck(u)).next(()=>l.documentOverlayCache.removeOverlaysForBatchId(u,c,o)).next(()=>l.localDocuments.recalculateAndSaveOverlaysForDocumentKeys(u,c)).next(()=>l.localDocuments.getDocuments(u,c))})}(r.localStore,e);Y1e(r,e,n),J1e(r,e),r.sharedClientState.updateMutationState(e,"rejected",n),await vw(r,i)}catch(i){await dw(i)}}function J1e(t,e){(t.ka.get(e)||[]).forEach(n=>{n.resolve()}),t.ka.delete(e)}function Y1e(t,e,n){const r=an(t);let i=r.Ba[r.currentUser.toKey()];if(i){const s=i.get(e);s&&(n?s.reject(n):s.resolve(),i=i.remove(e)),r.Ba[r.currentUser.toKey()]=i}}function W4(t,e,n=null){t.sharedClientState.removeLocalQueryTarget(e);for(const r of t.Ma.get(e))t.Fa.delete(r),n&&t.Ca.$a(r,n);t.Ma.delete(e),t.isPrimaryClient&&t.La.gr(e).forEach(r=>{t.La.containsKey(r)||B1e(t,r)})}function B1e(t,e){t.xa.delete(e.path.canonicalString());const n=t.Oa.get(e);n!==null&&(NW(t.remoteStore,n),t.Oa=t.Oa.remove(e),t.Na.delete(n),WW(t))}function Cee(t,e,n){for(const r of n)r instanceof G1e?(t.La.addReference(r.key,e),bxt(t,r)):r instanceof F1e?(It("SyncEngine","Document no longer in limbo: "+r.key),t.La.removeReference(r.key,e),t.La.containsKey(r.key)||B1e(t,r.key)):_t()}function bxt(t,e){const n=e.key,r=n.path.canonicalString();t.Oa.get(n)||t.xa.has(r)||(It("SyncEngine","New document in limbo: "+n),t.xa.add(r),WW(t))}function WW(t){for(;t.xa.size>0&&t.Oa.size{a.push(r.Ka(l,e,n).then(u=>{var c;if((u||n)&&r.isPrimaryClient){const d=u?!u.fromCache:(c=n==null?void 0:n.targetChanges.get(l.targetId))===null||c===void 0?void 0:c.current;r.sharedClientState.updateQueryState(l.targetId,d?"current":"not-current")}if(u){i.push(u);const d=UW.Wi(l.targetId,u);s.push(d)}}))}),await Promise.all(a),r.Ca.d_(i),await async function(l,u){const c=an(l);try{await c.persistence.runTransaction("notifyLocalViewChanges","readwrite",d=>at.forEach(u,f=>at.forEach(f.$i,h=>c.persistence.referenceDelegate.addReference(d,f.targetId,h)).next(()=>at.forEach(f.Ui,h=>c.persistence.referenceDelegate.removeReference(d,f.targetId,h)))))}catch(d){if(!fw(d))throw d;It("LocalStore","Failed to update sequence numbers: "+d)}for(const d of u){const f=d.targetId;if(!d.fromCache){const h=c.os.get(f),p=h.snapshotVersion,m=h.withLastLimboFreeSnapshotVersion(p);c.os=c.os.insert(f,m)}}}(r.localStore,s))}async function yxt(t,e){const n=an(t);if(!n.currentUser.isEqual(e)){It("SyncEngine","User change. New user:",e.toKey());const r=await U1e(n.localStore,e);n.currentUser=e,function(s,a){s.ka.forEach(o=>{o.forEach(l=>{l.reject(new Et(nt.CANCELLED,a))})}),s.ka.clear()}(n,"'waitForPendingWrites' promise is rejected due to a user change."),n.sharedClientState.handleUserChange(e,r.removedBatchIds,r.addedBatchIds),await vw(n,r.hs)}}function Sxt(t,e){const n=an(t),r=n.Na.get(e);if(r&&r.va)return Nn().add(r.key);{let i=Nn();const s=n.Ma.get(e);if(!s)return i;for(const a of s){const o=n.Fa.get(a);i=i.unionWith(o.view.Va)}return i}}function H1e(t){const e=an(t);return e.remoteStore.remoteSyncer.applyRemoteEvent=Z1e.bind(null,e),e.remoteStore.remoteSyncer.getRemoteKeysForTarget=Sxt.bind(null,e),e.remoteStore.remoteSyncer.rejectListen=mxt.bind(null,e),e.Ca.d_=nxt.bind(null,e.eventManager),e.Ca.$a=rxt.bind(null,e.eventManager),e}function xxt(t){const e=an(t);return e.remoteStore.remoteSyncer.applySuccessfulWrite=vxt.bind(null,e),e.remoteStore.remoteSyncer.rejectFailedWrite=gxt.bind(null,e),e}class rR{constructor(){this.kind="memory",this.synchronizeTabs=!1}async initialize(e){this.serializer=W9(e.databaseInfo.databaseId),this.sharedClientState=this.Wa(e),this.persistence=this.Ga(e),await this.persistence.start(),this.localStore=this.za(e),this.gcScheduler=this.ja(e,this.localStore),this.indexBackfillerScheduler=this.Ha(e,this.localStore)}ja(e,n){return null}Ha(e,n){return null}za(e){return E3t(this.persistence,new T3t,e.initialUser,this.serializer)}Ga(e){return new y3t(IW.Zr,this.serializer)}Wa(e){return new O3t}async terminate(){var e,n;(e=this.gcScheduler)===null||e===void 0||e.stop(),(n=this.indexBackfillerScheduler)===null||n===void 0||n.stop(),this.sharedClientState.shutdown(),await this.persistence.shutdown()}}rR.provider={build:()=>new rR};class A4{async initialize(e,n){this.localStore||(this.localStore=e.localStore,this.sharedClientState=e.sharedClientState,this.datastore=this.createDatastore(n),this.remoteStore=this.createRemoteStore(n),this.eventManager=this.createEventManager(n),this.syncEngine=this.createSyncEngine(n,!e.synchronizeTabs),this.sharedClientState.onlineStateHandler=r=>Xee(this.syncEngine,r,1),this.remoteStore.remoteSyncer.handleCredentialChange=yxt.bind(null,this.syncEngine),await Q3t(this.remoteStore,this.syncEngine.isPrimaryClient))}createEventManager(e){return function(){return new $3t}()}createDatastore(e){const n=W9(e.databaseInfo.databaseId),r=function(s){return new L3t(s)}(e.databaseInfo);return function(s,a,o,l){return new K3t(s,a,o,l)}(e.authCredentials,e.appCheckCredentials,r,n)}createRemoteStore(e){return function(r,i,s,a,o){return new D3t(r,i,s,a,o)}(this.localStore,this.datastore,e.asyncQueue,n=>Xee(this.syncEngine,n,0),function(){return Oee.D()?new Oee:new I3t}())}createSyncEngine(e,n){return function(i,s,a,o,l,u,c){const d=new lxt(i,s,a,o,l,u);return c&&(d.Qa=!0),d}(this.localStore,this.remoteStore,this.eventManager,this.sharedClientState,e.initialUser,e.maxConcurrentLimboResolutions,n)}async terminate(){var e,n;await async function(i){const s=an(i);It("RemoteStore","RemoteStore shutting down."),s.L_.add(5),await mw(s),s.k_.shutdown(),s.q_.set("Unknown")}(this.remoteStore),(e=this.datastore)===null||e===void 0||e.terminate(),(n=this.eventManager)===null||n===void 0||n.terminate()}}A4.provider={build:()=>new A4};/** + */class A1e{constructor(e){this.key=e}}class G1e{constructor(e){this.key=e}}class axt{constructor(e,n){this.query=e,this.Ta=n,this.Ea=null,this.hasCachedResults=!1,this.current=!1,this.da=Ln(),this.mutatedKeys=Ln(),this.Aa=d1e(e),this.Ra=new G1(this.Aa)}get Va(){return this.Ta}ma(e,n){const r=n?n.fa:new Oee,i=n?n.Ra:this.Ra;let s=n?n.mutatedKeys:this.mutatedKeys,a=i,o=!1;const l=this.query.limitType==="F"&&i.size===this.query.limit?i.last():null,u=this.query.limitType==="L"&&i.size===this.query.limit?i.first():null;if(e.inorderTraversal((c,d)=>{const f=i.get(c),h=C9(this.query,d)?d:null,p=!!f&&this.mutatedKeys.has(f.key),m=!!h&&(h.hasLocalMutations||this.mutatedKeys.has(h.key)&&h.hasCommittedMutations);let v=!1;f&&h?f.data.isEqual(h.data)?p!==m&&(r.track({type:3,doc:h}),v=!0):this.ga(f,h)||(r.track({type:2,doc:h}),v=!0,(l&&this.Aa(h,l)>0||u&&this.Aa(h,u)<0)&&(o=!0)):!f&&h?(r.track({type:0,doc:h}),v=!0):f&&!h&&(r.track({type:1,doc:f}),v=!0,(l||u)&&(o=!0)),v&&(h?(a=a.add(h),s=m?s.add(c):s.delete(c)):(a=a.delete(c),s=s.delete(c)))}),this.query.limit!==null)for(;a.size>this.query.limit;){const c=this.query.limitType==="F"?a.last():a.first();a=a.delete(c.key),s=s.delete(c.key),r.track({type:1,doc:c})}return{Ra:a,fa:r,ns:o,mutatedKeys:s}}ga(e,n){return e.hasLocalMutations&&n.hasCommittedMutations&&!n.hasLocalMutations}applyChanges(e,n,r,i){const s=this.Ra;this.Ra=e.Ra,this.mutatedKeys=e.mutatedKeys;const a=e.fa.G_();a.sort((c,d)=>function(h,p){const m=v=>{switch(v){case 0:return 1;case 2:case 3:return 2;case 1:return 0;default:return _t()}};return m(h)-m(p)}(c.type,d.type)||this.Aa(c.doc,d.doc)),this.pa(r),i=i!=null&&i;const o=n&&!i?this.ya():[],l=this.da.size===0&&this.current&&!i?1:0,u=l!==this.Ea;return this.Ea=l,a.length!==0||u?{snapshot:new Gb(this.query,e.Ra,s,a,e.mutatedKeys,l===0,u,!1,!!r&&r.resumeToken.approximateByteSize()>0),wa:o}:{wa:o}}Z_(e){return this.current&&e==="Offline"?(this.current=!1,this.applyChanges({Ra:this.Ra,fa:new Oee,mutatedKeys:this.mutatedKeys,ns:!1},!1)):{wa:[]}}Sa(e){return!this.Ta.has(e)&&!!this.Ra.has(e)&&!this.Ra.get(e).hasLocalMutations}pa(e){e&&(e.addedDocuments.forEach(n=>this.Ta=this.Ta.add(n)),e.modifiedDocuments.forEach(n=>{}),e.removedDocuments.forEach(n=>this.Ta=this.Ta.delete(n)),this.current=e.current)}ya(){if(!this.current)return[];const e=this.da;this.da=Ln(),this.Ra.forEach(r=>{this.Sa(r.key)&&(this.da=this.da.add(r.key))});const n=[];return e.forEach(r=>{this.da.has(r)||n.push(new G1e(r))}),this.da.forEach(r=>{e.has(r)||n.push(new A1e(r))}),n}ba(e){this.Ta=e.Ts,this.da=Ln();const n=this.ma(e.documents);return this.applyChanges(n,!0)}Da(){return Gb.fromInitialDocuments(this.query,this.Ra,this.mutatedKeys,this.Ea===0,this.hasCachedResults)}}class oxt{constructor(e,n,r){this.query=e,this.targetId=n,this.view=r}}class lxt{constructor(e){this.key=e,this.va=!1}}class uxt{constructor(e,n,r,i,s,a){this.localStore=e,this.remoteStore=n,this.eventManager=r,this.sharedClientState=i,this.currentUser=s,this.maxConcurrentLimboResolutions=a,this.Ca={},this.Fa=new By(o=>c1e(o),X9),this.Ma=new Map,this.xa=new Set,this.Oa=new Ri(Ft.comparator),this.Na=new Map,this.La=new IW,this.Ba={},this.ka=new Map,this.qa=Ab.kn(),this.onlineState="Unknown",this.Qa=void 0}get isPrimaryClient(){return this.Qa===!0}}async function cxt(t,e,n=!0){const r=B1e(t);let i;const s=r.Fa.get(e);return s?(r.sharedClientState.addLocalQueryTarget(s.targetId),i=s.view.Da()):i=await F1e(r,e,n,!0),i}async function dxt(t,e){const n=B1e(t);await F1e(n,e,!0,!1)}async function F1e(t,e,n,r){const i=await k3t(t.localStore,jc(e)),s=i.targetId,a=t.sharedClientState.addLocalQueryTarget(s,n);let o;return r&&(o=await fxt(t,e,s,a==="current",i.resumeToken)),t.isPrimaryClient&&n&&X1e(t.remoteStore,i),o}async function fxt(t,e,n,r,i){t.Ka=(d,f,h)=>async function(m,v,g,b){let y=v.view.ma(g);y.ns&&(y=await Ree(m.localStore,v.query,!1).then(({documents:E})=>v.view.ma(E,y)));const x=b&&b.targetChanges.get(v.targetId),T=b&&b.targetMismatches.get(v.targetId)!=null,M=v.view.applyChanges(y,m.isPrimaryClient,x,T);return Lee(m,v.targetId,M.wa),M.snapshot}(t,d,f,h);const s=await Ree(t.localStore,e,!0),a=new axt(e,s.Ts),o=a.ma(s.documents),l=pw.createSynthesizedTargetChangeForCurrentChange(n,r&&t.onlineState!=="Offline",i),u=a.applyChanges(o,t.isPrimaryClient,l);Lee(t,n,u.wa);const c=new oxt(e,n,a);return t.Fa.set(e,c),t.Ma.has(n)?t.Ma.get(n).push(e):t.Ma.set(n,[e]),u.snapshot}async function hxt(t,e,n){const r=an(t),i=r.Fa.get(e),s=r.Ma.get(i.targetId);if(s.length>1)return r.Ma.set(i.targetId,s.filter(a=>!X9(a,e))),void r.Fa.delete(e);r.isPrimaryClient?(r.sharedClientState.removeLocalQueryTarget(i.targetId),r.sharedClientState.isActiveQueryTarget(i.targetId)||await q4(r.localStore,i.targetId,!1).then(()=>{r.sharedClientState.clearQueryState(i.targetId),n&&LW(r.remoteStore,i.targetId),W4(r,i.targetId)}).catch(dw)):(W4(r,i.targetId),await q4(r.localStore,i.targetId,!0))}async function pxt(t,e){const n=an(t),r=n.Fa.get(e),i=n.Ma.get(r.targetId);n.isPrimaryClient&&i.length===1&&(n.sharedClientState.removeLocalQueryTarget(r.targetId),LW(n.remoteStore,r.targetId))}async function mxt(t,e,n){const r=Txt(t);try{const i=await function(a,o){const l=an(a),u=Es.now(),c=o.reduce((h,p)=>h.add(p.key),Ln());let d,f;return l.persistence.runTransaction("Locally write mutations","readwrite",h=>{let p=Of(),m=Ln();return l.cs.getEntries(h,c).next(v=>{p=v,p.forEach((g,b)=>{b.isValidDocument()||(m=m.add(g))})}).next(()=>l.localDocuments.getOverlayedDocuments(h,p)).next(v=>{d=v;const g=[];for(const b of o){const y=NSt(b,d.get(b.key).overlayedDocument);y!=null&&g.push(new hm(b.key,y,t1e(y.value.mapValue),pl.exists(!0)))}return l.mutationQueue.addMutationBatch(h,u,g,o)}).next(v=>{f=v;const g=v.applyToLocalDocumentSet(d,m);return l.documentOverlayCache.saveOverlays(h,v.batchId,g)})}).then(()=>({batchId:f.batchId,changes:h1e(d)}))}(r.localStore,e);r.sharedClientState.addPendingMutation(i.batchId),function(a,o,l){let u=a.Ba[a.currentUser.toKey()];u||(u=new Ri(rr)),u=u.insert(o,l),a.Ba[a.currentUser.toKey()]=u}(r,i.batchId,n),await vw(r,i.changes),await G9(r.remoteStore)}catch(i){const s=DW(i,"Failed to persist write");n.reject(s)}}async function j1e(t,e){const n=an(t);try{const r=await R3t(n.localStore,e);e.targetChanges.forEach((i,s)=>{const a=n.Na.get(s);a&&(Pr(i.addedDocuments.size+i.modifiedDocuments.size+i.removedDocuments.size<=1),i.addedDocuments.size>0?a.va=!0:i.modifiedDocuments.size>0?Pr(a.va):i.removedDocuments.size>0&&(Pr(a.va),a.va=!1))}),await vw(n,r,e)}catch(r){await dw(r)}}function Nee(t,e,n){const r=an(t);if(r.isPrimaryClient&&n===0||!r.isPrimaryClient&&n===1){const i=[];r.Fa.forEach((s,a)=>{const o=a.view.Z_(e);o.snapshot&&i.push(o.snapshot)}),function(a,o){const l=an(a);l.onlineState=o;let u=!1;l.queries.forEach((c,d)=>{for(const f of d.j_)f.Z_(o)&&(u=!0)}),u&&WW(l)}(r.eventManager,e),i.length&&r.Ca.d_(i),r.onlineState=e,r.isPrimaryClient&&r.sharedClientState.setOnlineState(e)}}async function vxt(t,e,n){const r=an(t);r.sharedClientState.updateQueryState(e,"rejected",n);const i=r.Na.get(e),s=i&&i.key;if(s){let a=new Ri(Ft.comparator);a=a.insert(s,Ra.newNoDocument(s,sn.min()));const o=Ln().add(s),l=new D9(sn.min(),new Map,new Ri(rr),a,o);await j1e(r,l),r.Oa=r.Oa.remove(s),r.Na.delete(e),AW(r)}else await q4(r.localStore,e,!1).then(()=>W4(r,e,n)).catch(dw)}async function gxt(t,e){const n=an(t),r=e.batch.batchId;try{const i=await P3t(n.localStore,e);J1e(n,r,null),Z1e(n,r),n.sharedClientState.updateMutationState(r,"acknowledged"),await vw(n,i)}catch(i){await dw(i)}}async function bxt(t,e,n){const r=an(t);try{const i=await function(a,o){const l=an(a);return l.persistence.runTransaction("Reject batch","readwrite-primary",u=>{let c;return l.mutationQueue.lookupMutationBatch(u,o).next(d=>(Pr(d!==null),c=d.keys(),l.mutationQueue.removeMutationBatch(u,d))).next(()=>l.mutationQueue.performConsistencyCheck(u)).next(()=>l.documentOverlayCache.removeOverlaysForBatchId(u,c,o)).next(()=>l.localDocuments.recalculateAndSaveOverlaysForDocumentKeys(u,c)).next(()=>l.localDocuments.getDocuments(u,c))})}(r.localStore,e);J1e(r,e,n),Z1e(r,e),r.sharedClientState.updateMutationState(e,"rejected",n),await vw(r,i)}catch(i){await dw(i)}}function Z1e(t,e){(t.ka.get(e)||[]).forEach(n=>{n.resolve()}),t.ka.delete(e)}function J1e(t,e,n){const r=an(t);let i=r.Ba[r.currentUser.toKey()];if(i){const s=i.get(e);s&&(n?s.reject(n):s.resolve(),i=i.remove(e)),r.Ba[r.currentUser.toKey()]=i}}function W4(t,e,n=null){t.sharedClientState.removeLocalQueryTarget(e);for(const r of t.Ma.get(e))t.Fa.delete(r),n&&t.Ca.$a(r,n);t.Ma.delete(e),t.isPrimaryClient&&t.La.gr(e).forEach(r=>{t.La.containsKey(r)||Y1e(t,r)})}function Y1e(t,e){t.xa.delete(e.path.canonicalString());const n=t.Oa.get(e);n!==null&&(LW(t.remoteStore,n),t.Oa=t.Oa.remove(e),t.Na.delete(n),AW(t))}function Lee(t,e,n){for(const r of n)r instanceof A1e?(t.La.addReference(r.key,e),yxt(t,r)):r instanceof G1e?(It("SyncEngine","Document no longer in limbo: "+r.key),t.La.removeReference(r.key,e),t.La.containsKey(r.key)||Y1e(t,r.key)):_t()}function yxt(t,e){const n=e.key,r=n.path.canonicalString();t.Oa.get(n)||t.xa.has(r)||(It("SyncEngine","New document in limbo: "+n),t.xa.add(r),AW(t))}function AW(t){for(;t.xa.size>0&&t.Oa.size{a.push(r.Ka(l,e,n).then(u=>{var c;if((u||n)&&r.isPrimaryClient){const d=u?!u.fromCache:(c=n==null?void 0:n.targetChanges.get(l.targetId))===null||c===void 0?void 0:c.current;r.sharedClientState.updateQueryState(l.targetId,d?"current":"not-current")}if(u){i.push(u);const d=NW.Wi(l.targetId,u);s.push(d)}}))}),await Promise.all(a),r.Ca.d_(i),await async function(l,u){const c=an(l);try{await c.persistence.runTransaction("notifyLocalViewChanges","readwrite",d=>at.forEach(u,f=>at.forEach(f.$i,h=>c.persistence.referenceDelegate.addReference(d,f.targetId,h)).next(()=>at.forEach(f.Ui,h=>c.persistence.referenceDelegate.removeReference(d,f.targetId,h)))))}catch(d){if(!fw(d))throw d;It("LocalStore","Failed to update sequence numbers: "+d)}for(const d of u){const f=d.targetId;if(!d.fromCache){const h=c.os.get(f),p=h.snapshotVersion,m=h.withLastLimboFreeSnapshotVersion(p);c.os=c.os.insert(f,m)}}}(r.localStore,s))}async function Sxt(t,e){const n=an(t);if(!n.currentUser.isEqual(e)){It("SyncEngine","User change. New user:",e.toKey());const r=await I1e(n.localStore,e);n.currentUser=e,function(s,a){s.ka.forEach(o=>{o.forEach(l=>{l.reject(new Et(nt.CANCELLED,a))})}),s.ka.clear()}(n,"'waitForPendingWrites' promise is rejected due to a user change."),n.sharedClientState.handleUserChange(e,r.removedBatchIds,r.addedBatchIds),await vw(n,r.hs)}}function xxt(t,e){const n=an(t),r=n.Na.get(e);if(r&&r.va)return Ln().add(r.key);{let i=Ln();const s=n.Ma.get(e);if(!s)return i;for(const a of s){const o=n.Fa.get(a);i=i.unionWith(o.view.Va)}return i}}function B1e(t){const e=an(t);return e.remoteStore.remoteSyncer.applyRemoteEvent=j1e.bind(null,e),e.remoteStore.remoteSyncer.getRemoteKeysForTarget=xxt.bind(null,e),e.remoteStore.remoteSyncer.rejectListen=vxt.bind(null,e),e.Ca.d_=rxt.bind(null,e.eventManager),e.Ca.$a=ixt.bind(null,e.eventManager),e}function Txt(t){const e=an(t);return e.remoteStore.remoteSyncer.applySuccessfulWrite=gxt.bind(null,e),e.remoteStore.remoteSyncer.rejectFailedWrite=bxt.bind(null,e),e}class nR{constructor(){this.kind="memory",this.synchronizeTabs=!1}async initialize(e){this.serializer=W9(e.databaseInfo.databaseId),this.sharedClientState=this.Wa(e),this.persistence=this.Ga(e),await this.persistence.start(),this.localStore=this.za(e),this.gcScheduler=this.ja(e,this.localStore),this.indexBackfillerScheduler=this.Ha(e,this.localStore)}ja(e,n){return null}Ha(e,n){return null}za(e){return M3t(this.persistence,new w3t,e.initialUser,this.serializer)}Ga(e){return new S3t(UW.Zr,this.serializer)}Wa(e){return new I3t}async terminate(){var e,n;(e=this.gcScheduler)===null||e===void 0||e.stop(),(n=this.indexBackfillerScheduler)===null||n===void 0||n.stop(),this.sharedClientState.shutdown(),await this.persistence.shutdown()}}nR.provider={build:()=>new nR};class A4{async initialize(e,n){this.localStore||(this.localStore=e.localStore,this.sharedClientState=e.sharedClientState,this.datastore=this.createDatastore(n),this.remoteStore=this.createRemoteStore(n),this.eventManager=this.createEventManager(n),this.syncEngine=this.createSyncEngine(n,!e.synchronizeTabs),this.sharedClientState.onlineStateHandler=r=>Nee(this.syncEngine,r,1),this.remoteStore.remoteSyncer.handleCredentialChange=Sxt.bind(null,this.syncEngine),await _3t(this.remoteStore,this.syncEngine.isPrimaryClient))}createEventManager(e){return function(){return new ext}()}createDatastore(e){const n=W9(e.databaseInfo.databaseId),r=function(s){return new X3t(s)}(e.databaseInfo);return function(s,a,o,l){return new q3t(s,a,o,l)}(e.authCredentials,e.appCheckCredentials,r,n)}createRemoteStore(e){return function(r,i,s,a,o){return new W3t(r,i,s,a,o)}(this.localStore,this.datastore,e.asyncQueue,n=>Nee(this.syncEngine,n,0),function(){return zee.D()?new zee:new U3t}())}createSyncEngine(e,n){return function(i,s,a,o,l,u,c){const d=new uxt(i,s,a,o,l,u);return c&&(d.Qa=!0),d}(this.localStore,this.remoteStore,this.eventManager,this.sharedClientState,e.initialUser,e.maxConcurrentLimboResolutions,n)}async terminate(){var e,n;await async function(i){const s=an(i);It("RemoteStore","RemoteStore shutting down."),s.L_.add(5),await mw(s),s.k_.shutdown(),s.q_.set("Unknown")}(this.remoteStore),(e=this.datastore)===null||e===void 0||e.terminate(),(n=this.eventManager)===null||n===void 0||n.terminate()}}A4.provider={build:()=>new A4};/** * @license * Copyright 2020 Google LLC * @@ -9263,7 +9263,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Txt{constructor(e){this.observer=e,this.muted=!1}next(e){this.muted||this.observer.next&&this.Ya(this.observer.next,e)}error(e){this.muted||(this.observer.error?this.Ya(this.observer.error,e):kf("Uncaught Error in snapshot listener:",e.toString()))}Za(){this.muted=!0}Ya(e,n){setTimeout(()=>{this.muted||e(n)},0)}}/** + */class wxt{constructor(e){this.observer=e,this.muted=!1}next(e){this.muted||this.observer.next&&this.Ya(this.observer.next,e)}error(e){this.muted||(this.observer.error?this.Ya(this.observer.error,e):kf("Uncaught Error in snapshot listener:",e.toString()))}Za(){this.muted=!0}Ya(e,n){setTimeout(()=>{this.muted||e(n)},0)}}/** * @license * Copyright 2017 Google LLC * @@ -9278,7 +9278,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class wxt{constructor(e,n,r,i,s){this.authCredentials=e,this.appCheckCredentials=n,this.asyncQueue=r,this.databaseInfo=i,this.user=Ea.UNAUTHENTICATED,this.clientId=$ge.newId(),this.authCredentialListener=()=>Promise.resolve(),this.appCheckCredentialListener=()=>Promise.resolve(),this._uninitializedComponentsProvider=s,this.authCredentials.start(r,async a=>{It("FirestoreClient","Received user=",a.uid),await this.authCredentialListener(a),this.user=a}),this.appCheckCredentials.start(r,a=>(It("FirestoreClient","Received new app check token=",a),this.appCheckCredentialListener(a,this.user)))}get configuration(){return{asyncQueue:this.asyncQueue,databaseInfo:this.databaseInfo,clientId:this.clientId,authCredentials:this.authCredentials,appCheckCredentials:this.appCheckCredentials,initialUser:this.user,maxConcurrentLimboResolutions:100}}setCredentialChangeListener(e){this.authCredentialListener=e}setAppCheckTokenChangeListener(e){this.appCheckCredentialListener=e}terminate(){this.asyncQueue.enterRestrictedMode();const e=new Tp;return this.asyncQueue.enqueueAndForgetEvenWhileRestricted(async()=>{try{this._onlineComponents&&await this._onlineComponents.terminate(),this._offlineComponents&&await this._offlineComponents.terminate(),this.authCredentials.shutdown(),this.appCheckCredentials.shutdown(),e.resolve()}catch(n){const r=qW(n,"Failed to shutdown persistence");e.reject(r)}}),e.promise}}async function SU(t,e){t.asyncQueue.verifyOperationInProgress(),It("FirestoreClient","Initializing OfflineComponentProvider");const n=t.configuration;await e.initialize(n);let r=n.initialUser;t.setCredentialChangeListener(async i=>{r.isEqual(i)||(await U1e(e.localStore,i),r=i)}),e.persistence.setDatabaseDeletedListener(()=>t.terminate()),t._offlineComponents=e}async function Kee(t,e){t.asyncQueue.verifyOperationInProgress();const n=await Ext(t);It("FirestoreClient","Initializing OnlineComponentProvider"),await e.initialize(n,t.configuration),t.setCredentialChangeListener(r=>Iee(e.remoteStore,r)),t.setAppCheckTokenChangeListener((r,i)=>Iee(e.remoteStore,i)),t._onlineComponents=e}async function Ext(t){if(!t._offlineComponents)if(t._uninitializedComponentsProvider){It("FirestoreClient","Using user provided OfflineComponentProvider");try{await SU(t,t._uninitializedComponentsProvider._offline)}catch(e){const n=e;if(!function(i){return i.name==="FirebaseError"?i.code===nt.FAILED_PRECONDITION||i.code===nt.UNIMPLEMENTED:!(typeof DOMException<"u"&&i instanceof DOMException)||i.code===22||i.code===20||i.code===11}(n))throw n;Kb("Error using user provided cache. Falling back to memory cache: "+n),await SU(t,new rR)}}else It("FirestoreClient","Using default OfflineComponentProvider"),await SU(t,new rR);return t._offlineComponents}async function Q1e(t){return t._onlineComponents||(t._uninitializedComponentsProvider?(It("FirestoreClient","Using user provided OnlineComponentProvider"),await Kee(t,t._uninitializedComponentsProvider._online)):(It("FirestoreClient","Using default OnlineComponentProvider"),await Kee(t,new A4))),t._onlineComponents}function Mxt(t){return Q1e(t).then(e=>e.syncEngine)}async function Pxt(t){const e=await Q1e(t),n=e.eventManager;return n.onListen=uxt.bind(null,e.syncEngine),n.onUnlisten=fxt.bind(null,e.syncEngine),n.onFirstRemoteStoreListen=cxt.bind(null,e.syncEngine),n.onLastRemoteStoreUnlisten=hxt.bind(null,e.syncEngine),n}function Rxt(t,e,n={}){const r=new Tp;return t.asyncQueue.enqueueAndForget(async()=>function(s,a,o,l,u){const c=new Txt({next:f=>{c.Za(),a.enqueueAndForget(()=>txt(s,d)),f.fromCache&&l.source==="server"?u.reject(new Et(nt.UNAVAILABLE,'Failed to get documents from server. (However, these documents may exist in the local cache. Run again without setting source to "server" to retrieve the cached documents.)')):u.resolve(f)},error:f=>u.reject(f)}),d=new ixt(o,c,{includeMetadataChanges:!0,_a:!0});return ext(s,d)}(await Pxt(t),t.asyncQueue,e,n,r)),r.promise}/** + */class Ext{constructor(e,n,r,i,s){this.authCredentials=e,this.appCheckCredentials=n,this.asyncQueue=r,this.databaseInfo=i,this.user=Ea.UNAUTHENTICATED,this.clientId=_ge.newId(),this.authCredentialListener=()=>Promise.resolve(),this.appCheckCredentialListener=()=>Promise.resolve(),this._uninitializedComponentsProvider=s,this.authCredentials.start(r,async a=>{It("FirestoreClient","Received user=",a.uid),await this.authCredentialListener(a),this.user=a}),this.appCheckCredentials.start(r,a=>(It("FirestoreClient","Received new app check token=",a),this.appCheckCredentialListener(a,this.user)))}get configuration(){return{asyncQueue:this.asyncQueue,databaseInfo:this.databaseInfo,clientId:this.clientId,authCredentials:this.authCredentials,appCheckCredentials:this.appCheckCredentials,initialUser:this.user,maxConcurrentLimboResolutions:100}}setCredentialChangeListener(e){this.authCredentialListener=e}setAppCheckTokenChangeListener(e){this.appCheckCredentialListener=e}terminate(){this.asyncQueue.enterRestrictedMode();const e=new Tp;return this.asyncQueue.enqueueAndForgetEvenWhileRestricted(async()=>{try{this._onlineComponents&&await this._onlineComponents.terminate(),this._offlineComponents&&await this._offlineComponents.terminate(),this.authCredentials.shutdown(),this.appCheckCredentials.shutdown(),e.resolve()}catch(n){const r=DW(n,"Failed to shutdown persistence");e.reject(r)}}),e.promise}}async function SU(t,e){t.asyncQueue.verifyOperationInProgress(),It("FirestoreClient","Initializing OfflineComponentProvider");const n=t.configuration;await e.initialize(n);let r=n.initialUser;t.setCredentialChangeListener(async i=>{r.isEqual(i)||(await I1e(e.localStore,i),r=i)}),e.persistence.setDatabaseDeletedListener(()=>t.terminate()),t._offlineComponents=e}async function Xee(t,e){t.asyncQueue.verifyOperationInProgress();const n=await Mxt(t);It("FirestoreClient","Initializing OnlineComponentProvider"),await e.initialize(n,t.configuration),t.setCredentialChangeListener(r=>kee(e.remoteStore,r)),t.setAppCheckTokenChangeListener((r,i)=>kee(e.remoteStore,i)),t._onlineComponents=e}async function Mxt(t){if(!t._offlineComponents)if(t._uninitializedComponentsProvider){It("FirestoreClient","Using user provided OfflineComponentProvider");try{await SU(t,t._uninitializedComponentsProvider._offline)}catch(e){const n=e;if(!function(i){return i.name==="FirebaseError"?i.code===nt.FAILED_PRECONDITION||i.code===nt.UNIMPLEMENTED:!(typeof DOMException<"u"&&i instanceof DOMException)||i.code===22||i.code===20||i.code===11}(n))throw n;Kb("Error using user provided cache. Falling back to memory cache: "+n),await SU(t,new nR)}}else It("FirestoreClient","Using default OfflineComponentProvider"),await SU(t,new nR);return t._offlineComponents}async function H1e(t){return t._onlineComponents||(t._uninitializedComponentsProvider?(It("FirestoreClient","Using user provided OnlineComponentProvider"),await Xee(t,t._uninitializedComponentsProvider._online)):(It("FirestoreClient","Using default OnlineComponentProvider"),await Xee(t,new A4))),t._onlineComponents}function Pxt(t){return H1e(t).then(e=>e.syncEngine)}async function Rxt(t){const e=await H1e(t),n=e.eventManager;return n.onListen=cxt.bind(null,e.syncEngine),n.onUnlisten=hxt.bind(null,e.syncEngine),n.onFirstRemoteStoreListen=dxt.bind(null,e.syncEngine),n.onLastRemoteStoreUnlisten=pxt.bind(null,e.syncEngine),n}function Vxt(t,e,n={}){const r=new Tp;return t.asyncQueue.enqueueAndForget(async()=>function(s,a,o,l,u){const c=new wxt({next:f=>{c.Za(),a.enqueueAndForget(()=>nxt(s,d)),f.fromCache&&l.source==="server"?u.reject(new Et(nt.UNAVAILABLE,'Failed to get documents from server. (However, these documents may exist in the local cache. Run again without setting source to "server" to retrieve the cached documents.)')):u.resolve(f)},error:f=>u.reject(f)}),d=new sxt(o,c,{includeMetadataChanges:!0,_a:!0});return txt(s,d)}(await Rxt(t),t.asyncQueue,e,n,r)),r.promise}/** * @license * Copyright 2023 Google LLC * @@ -9293,7 +9293,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function _1e(t){const e={};return t.timeoutSeconds!==void 0&&(e.timeoutSeconds=t.timeoutSeconds),e}/** + */function Q1e(t){const e={};return t.timeoutSeconds!==void 0&&(e.timeoutSeconds=t.timeoutSeconds),e}/** * @license * Copyright 2020 Google LLC * @@ -9308,7 +9308,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const qee=new Map;/** + */const Cee=new Map;/** * @license * Copyright 2017 Google LLC * @@ -9323,7 +9323,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function $1e(t,e,n){if(!n)throw new Et(nt.INVALID_ARGUMENT,`Function ${t}() cannot be called with an empty ${e}.`)}function Vxt(t,e,n,r){if(e===!0&&r===!0)throw new Et(nt.INVALID_ARGUMENT,`${t} and ${n} cannot be used together.`)}function Dee(t){if(!Ft.isDocumentKey(t))throw new Et(nt.INVALID_ARGUMENT,`Invalid document reference. Document references must have an even number of segments, but ${t} has ${t.length}.`)}function Wee(t){if(Ft.isDocumentKey(t))throw new Et(nt.INVALID_ARGUMENT,`Invalid collection reference. Collection references must have an odd number of segments, but ${t} has ${t.length}.`)}function F9(t){if(t===void 0)return"undefined";if(t===null)return"null";if(typeof t=="string")return t.length>20&&(t=`${t.substring(0,20)}...`),JSON.stringify(t);if(typeof t=="number"||typeof t=="boolean")return""+t;if(typeof t=="object"){if(t instanceof Array)return"an array";{const e=function(r){return r.constructor?r.constructor.name:null}(t);return e?`a custom ${e} object`:"an object"}}return typeof t=="function"?"a function":_t()}function e0(t,e){if("_delegate"in t&&(t=t._delegate),!(t instanceof e)){if(e.name===t.constructor.name)throw new Et(nt.INVALID_ARGUMENT,"Type does not match the expected instance. Did you pass a reference from a different Firestore SDK?");{const n=F9(t);throw new Et(nt.INVALID_ARGUMENT,`Expected type '${e.name}', but it was: ${n}`)}}return t}function zxt(t,e){if(e<=0)throw new Et(nt.INVALID_ARGUMENT,`Function ${t}() requires a positive number, but it was: ${e}.`)}/** + */function _1e(t,e,n){if(!n)throw new Et(nt.INVALID_ARGUMENT,`Function ${t}() cannot be called with an empty ${e}.`)}function zxt(t,e,n,r){if(e===!0&&r===!0)throw new Et(nt.INVALID_ARGUMENT,`${t} and ${n} cannot be used together.`)}function Kee(t){if(!Ft.isDocumentKey(t))throw new Et(nt.INVALID_ARGUMENT,`Invalid document reference. Document references must have an even number of segments, but ${t} has ${t.length}.`)}function qee(t){if(Ft.isDocumentKey(t))throw new Et(nt.INVALID_ARGUMENT,`Invalid collection reference. Collection references must have an odd number of segments, but ${t} has ${t.length}.`)}function F9(t){if(t===void 0)return"undefined";if(t===null)return"null";if(typeof t=="string")return t.length>20&&(t=`${t.substring(0,20)}...`),JSON.stringify(t);if(typeof t=="number"||typeof t=="boolean")return""+t;if(typeof t=="object"){if(t instanceof Array)return"an array";{const e=function(r){return r.constructor?r.constructor.name:null}(t);return e?`a custom ${e} object`:"an object"}}return typeof t=="function"?"a function":_t()}function e0(t,e){if("_delegate"in t&&(t=t._delegate),!(t instanceof e)){if(e.name===t.constructor.name)throw new Et(nt.INVALID_ARGUMENT,"Type does not match the expected instance. Did you pass a reference from a different Firestore SDK?");{const n=F9(t);throw new Et(nt.INVALID_ARGUMENT,`Expected type '${e.name}', but it was: ${n}`)}}return t}function kxt(t,e){if(e<=0)throw new Et(nt.INVALID_ARGUMENT,`Function ${t}() requires a positive number, but it was: ${e}.`)}/** * @license * Copyright 2020 Google LLC * @@ -9338,7 +9338,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Aee{constructor(e){var n,r;if(e.host===void 0){if(e.ssl!==void 0)throw new Et(nt.INVALID_ARGUMENT,"Can't provide ssl option if host option is not set");this.host="firestore.googleapis.com",this.ssl=!0}else this.host=e.host,this.ssl=(n=e.ssl)===null||n===void 0||n;if(this.credentials=e.credentials,this.ignoreUndefinedProperties=!!e.ignoreUndefinedProperties,this.localCache=e.localCache,e.cacheSizeBytes===void 0)this.cacheSizeBytes=41943040;else{if(e.cacheSizeBytes!==-1&&e.cacheSizeBytes<1048576)throw new Et(nt.INVALID_ARGUMENT,"cacheSizeBytes must be at least 1048576");this.cacheSizeBytes=e.cacheSizeBytes}Vxt("experimentalForceLongPolling",e.experimentalForceLongPolling,"experimentalAutoDetectLongPolling",e.experimentalAutoDetectLongPolling),this.experimentalForceLongPolling=!!e.experimentalForceLongPolling,this.experimentalForceLongPolling?this.experimentalAutoDetectLongPolling=!1:e.experimentalAutoDetectLongPolling===void 0?this.experimentalAutoDetectLongPolling=!0:this.experimentalAutoDetectLongPolling=!!e.experimentalAutoDetectLongPolling,this.experimentalLongPollingOptions=_1e((r=e.experimentalLongPollingOptions)!==null&&r!==void 0?r:{}),function(s){if(s.timeoutSeconds!==void 0){if(isNaN(s.timeoutSeconds))throw new Et(nt.INVALID_ARGUMENT,`invalid long polling timeout: ${s.timeoutSeconds} (must not be NaN)`);if(s.timeoutSeconds<5)throw new Et(nt.INVALID_ARGUMENT,`invalid long polling timeout: ${s.timeoutSeconds} (minimum allowed value is 5)`);if(s.timeoutSeconds>30)throw new Et(nt.INVALID_ARGUMENT,`invalid long polling timeout: ${s.timeoutSeconds} (maximum allowed value is 30)`)}}(this.experimentalLongPollingOptions),this.useFetchStreams=!!e.useFetchStreams}isEqual(e){return this.host===e.host&&this.ssl===e.ssl&&this.credentials===e.credentials&&this.cacheSizeBytes===e.cacheSizeBytes&&this.experimentalForceLongPolling===e.experimentalForceLongPolling&&this.experimentalAutoDetectLongPolling===e.experimentalAutoDetectLongPolling&&function(r,i){return r.timeoutSeconds===i.timeoutSeconds}(this.experimentalLongPollingOptions,e.experimentalLongPollingOptions)&&this.ignoreUndefinedProperties===e.ignoreUndefinedProperties&&this.useFetchStreams===e.useFetchStreams}}class j9{constructor(e,n,r,i){this._authCredentials=e,this._appCheckCredentials=n,this._databaseId=r,this._app=i,this.type="firestore-lite",this._persistenceKey="(lite)",this._settings=new Aee({}),this._settingsFrozen=!1,this._terminateTask="notTerminated"}get app(){if(!this._app)throw new Et(nt.FAILED_PRECONDITION,"Firestore was not initialized using the Firebase SDK. 'app' is not available");return this._app}get _initialized(){return this._settingsFrozen}get _terminated(){return this._terminateTask!=="notTerminated"}_setSettings(e){if(this._settingsFrozen)throw new Et(nt.FAILED_PRECONDITION,"Firestore has already been started and its settings can no longer be changed. You can only modify settings before calling any other methods on a Firestore object.");this._settings=new Aee(e),e.credentials!==void 0&&(this._authCredentials=function(r){if(!r)return new Ayt;switch(r.type){case"firstParty":return new Zyt(r.sessionIndex||"0",r.iamToken||null,r.authTokenFactory||null);case"provider":return r.client;default:throw new Et(nt.INVALID_ARGUMENT,"makeAuthCredentialsProvider failed due to invalid credential type")}}(e.credentials))}_getSettings(){return this._settings}_freezeSettings(){return this._settingsFrozen=!0,this._settings}_delete(){return this._terminateTask==="notTerminated"&&(this._terminateTask=this._terminate()),this._terminateTask}async _restart(){this._terminateTask==="notTerminated"?await this._terminate():this._terminateTask="notTerminated"}toJSON(){return{app:this._app,databaseId:this._databaseId,settings:this._settings}}_terminate(){return function(n){const r=qee.get(n);r&&(It("ComponentProvider","Removing Datastore"),qee.delete(n),r.terminate())}(this),Promise.resolve()}}function kxt(t,e,n,r={}){var i;const s=(t=e0(t,j9))._getSettings(),a=`${e}:${n}`;if(s.host!=="firestore.googleapis.com"&&s.host!==a&&Kb("Host has been set in both settings() and connectFirestoreEmulator(), emulator host will be used."),t._setSettings(Object.assign(Object.assign({},s),{host:a,ssl:!1})),r.mockUserToken){let o,l;if(typeof r.mockUserToken=="string")o=r.mockUserToken,l=Ea.MOCK_USER;else{o=vbt(r.mockUserToken,(i=t._app)===null||i===void 0?void 0:i.options.projectId);const u=r.mockUserToken.sub||r.mockUserToken.user_id;if(!u)throw new Et(nt.INVALID_ARGUMENT,"mockUserToken must contain 'sub' or 'user_id' field!");l=new Ea(u)}t._authCredentials=new Gyt(new _ge(o,l))}}/** + */class Dee{constructor(e){var n,r;if(e.host===void 0){if(e.ssl!==void 0)throw new Et(nt.INVALID_ARGUMENT,"Can't provide ssl option if host option is not set");this.host="firestore.googleapis.com",this.ssl=!0}else this.host=e.host,this.ssl=(n=e.ssl)===null||n===void 0||n;if(this.credentials=e.credentials,this.ignoreUndefinedProperties=!!e.ignoreUndefinedProperties,this.localCache=e.localCache,e.cacheSizeBytes===void 0)this.cacheSizeBytes=41943040;else{if(e.cacheSizeBytes!==-1&&e.cacheSizeBytes<1048576)throw new Et(nt.INVALID_ARGUMENT,"cacheSizeBytes must be at least 1048576");this.cacheSizeBytes=e.cacheSizeBytes}zxt("experimentalForceLongPolling",e.experimentalForceLongPolling,"experimentalAutoDetectLongPolling",e.experimentalAutoDetectLongPolling),this.experimentalForceLongPolling=!!e.experimentalForceLongPolling,this.experimentalForceLongPolling?this.experimentalAutoDetectLongPolling=!1:e.experimentalAutoDetectLongPolling===void 0?this.experimentalAutoDetectLongPolling=!0:this.experimentalAutoDetectLongPolling=!!e.experimentalAutoDetectLongPolling,this.experimentalLongPollingOptions=Q1e((r=e.experimentalLongPollingOptions)!==null&&r!==void 0?r:{}),function(s){if(s.timeoutSeconds!==void 0){if(isNaN(s.timeoutSeconds))throw new Et(nt.INVALID_ARGUMENT,`invalid long polling timeout: ${s.timeoutSeconds} (must not be NaN)`);if(s.timeoutSeconds<5)throw new Et(nt.INVALID_ARGUMENT,`invalid long polling timeout: ${s.timeoutSeconds} (minimum allowed value is 5)`);if(s.timeoutSeconds>30)throw new Et(nt.INVALID_ARGUMENT,`invalid long polling timeout: ${s.timeoutSeconds} (maximum allowed value is 30)`)}}(this.experimentalLongPollingOptions),this.useFetchStreams=!!e.useFetchStreams}isEqual(e){return this.host===e.host&&this.ssl===e.ssl&&this.credentials===e.credentials&&this.cacheSizeBytes===e.cacheSizeBytes&&this.experimentalForceLongPolling===e.experimentalForceLongPolling&&this.experimentalAutoDetectLongPolling===e.experimentalAutoDetectLongPolling&&function(r,i){return r.timeoutSeconds===i.timeoutSeconds}(this.experimentalLongPollingOptions,e.experimentalLongPollingOptions)&&this.ignoreUndefinedProperties===e.ignoreUndefinedProperties&&this.useFetchStreams===e.useFetchStreams}}class j9{constructor(e,n,r,i){this._authCredentials=e,this._appCheckCredentials=n,this._databaseId=r,this._app=i,this.type="firestore-lite",this._persistenceKey="(lite)",this._settings=new Dee({}),this._settingsFrozen=!1,this._terminateTask="notTerminated"}get app(){if(!this._app)throw new Et(nt.FAILED_PRECONDITION,"Firestore was not initialized using the Firebase SDK. 'app' is not available");return this._app}get _initialized(){return this._settingsFrozen}get _terminated(){return this._terminateTask!=="notTerminated"}_setSettings(e){if(this._settingsFrozen)throw new Et(nt.FAILED_PRECONDITION,"Firestore has already been started and its settings can no longer be changed. You can only modify settings before calling any other methods on a Firestore object.");this._settings=new Dee(e),e.credentials!==void 0&&(this._authCredentials=function(r){if(!r)return new Gyt;switch(r.type){case"firstParty":return new Jyt(r.sessionIndex||"0",r.iamToken||null,r.authTokenFactory||null);case"provider":return r.client;default:throw new Et(nt.INVALID_ARGUMENT,"makeAuthCredentialsProvider failed due to invalid credential type")}}(e.credentials))}_getSettings(){return this._settings}_freezeSettings(){return this._settingsFrozen=!0,this._settings}_delete(){return this._terminateTask==="notTerminated"&&(this._terminateTask=this._terminate()),this._terminateTask}async _restart(){this._terminateTask==="notTerminated"?await this._terminate():this._terminateTask="notTerminated"}toJSON(){return{app:this._app,databaseId:this._databaseId,settings:this._settings}}_terminate(){return function(n){const r=Cee.get(n);r&&(It("ComponentProvider","Removing Datastore"),Cee.delete(n),r.terminate())}(this),Promise.resolve()}}function Oxt(t,e,n,r={}){var i;const s=(t=e0(t,j9))._getSettings(),a=`${e}:${n}`;if(s.host!=="firestore.googleapis.com"&&s.host!==a&&Kb("Host has been set in both settings() and connectFirestoreEmulator(), emulator host will be used."),t._setSettings(Object.assign(Object.assign({},s),{host:a,ssl:!1})),r.mockUserToken){let o,l;if(typeof r.mockUserToken=="string")o=r.mockUserToken,l=Ea.MOCK_USER;else{o=gbt(r.mockUserToken,(i=t._app)===null||i===void 0?void 0:i.options.projectId);const u=r.mockUserToken.sub||r.mockUserToken.user_id;if(!u)throw new Et(nt.INVALID_ARGUMENT,"mockUserToken must contain 'sub' or 'user_id' field!");l=new Ea(u)}t._authCredentials=new Fyt(new Qge(o,l))}}/** * @license * Copyright 2020 Google LLC * @@ -9353,7 +9353,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class pm{constructor(e,n,r){this.converter=n,this._query=r,this.type="query",this.firestore=e}withConverter(e){return new pm(this.firestore,e,this._query)}}class vl{constructor(e,n,r){this.converter=n,this._key=r,this.type="document",this.firestore=e}get _path(){return this._key.path}get id(){return this._key.path.lastSegment()}get path(){return this._key.path.canonicalString()}get parent(){return new wp(this.firestore,this.converter,this._key.path.popLast())}withConverter(e){return new vl(this.firestore,e,this._key)}}class wp extends pm{constructor(e,n,r){super(e,n,u1e(r)),this._path=r,this.type="collection"}get id(){return this._query.path.lastSegment()}get path(){return this._query.path.canonicalString()}get parent(){const e=this._path.popLast();return e.isEmpty()?null:new vl(this.firestore,null,new Ft(e))}withConverter(e){return new wp(this.firestore,e,this._path)}}function ga(t,e,...n){if(t=la(t),$1e("collection","path",e),t instanceof j9){const r=ii.fromString(e,...n);return Wee(r),new wp(t,null,r)}{if(!(t instanceof vl||t instanceof wp))throw new Et(nt.INVALID_ARGUMENT,"Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore");const r=t._path.child(ii.fromString(e,...n));return Wee(r),new wp(t.firestore,null,r)}}function Oxt(t,e,...n){if(t=la(t),arguments.length===1&&(e=$ge.newId()),$1e("doc","path",e),t instanceof j9){const r=ii.fromString(e,...n);return Dee(r),new vl(t,null,new Ft(r))}{if(!(t instanceof vl||t instanceof wp))throw new Et(nt.INVALID_ARGUMENT,"Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore");const r=t._path.child(ii.fromString(e,...n));return Dee(r),new vl(t.firestore,t instanceof wp?t.converter:null,new Ft(r))}}/** + */class pm{constructor(e,n,r){this.converter=n,this._query=r,this.type="query",this.firestore=e}withConverter(e){return new pm(this.firestore,e,this._query)}}class ml{constructor(e,n,r){this.converter=n,this._key=r,this.type="document",this.firestore=e}get _path(){return this._key.path}get id(){return this._key.path.lastSegment()}get path(){return this._key.path.canonicalString()}get parent(){return new wp(this.firestore,this.converter,this._key.path.popLast())}withConverter(e){return new ml(this.firestore,e,this._key)}}class wp extends pm{constructor(e,n,r){super(e,n,l1e(r)),this._path=r,this.type="collection"}get id(){return this._query.path.lastSegment()}get path(){return this._query.path.canonicalString()}get parent(){const e=this._path.popLast();return e.isEmpty()?null:new ml(this.firestore,null,new Ft(e))}withConverter(e){return new wp(this.firestore,e,this._path)}}function ga(t,e,...n){if(t=la(t),_1e("collection","path",e),t instanceof j9){const r=ii.fromString(e,...n);return qee(r),new wp(t,null,r)}{if(!(t instanceof ml||t instanceof wp))throw new Et(nt.INVALID_ARGUMENT,"Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore");const r=t._path.child(ii.fromString(e,...n));return qee(r),new wp(t.firestore,null,r)}}function Ixt(t,e,...n){if(t=la(t),arguments.length===1&&(e=_ge.newId()),_1e("doc","path",e),t instanceof j9){const r=ii.fromString(e,...n);return Kee(r),new ml(t,null,new Ft(r))}{if(!(t instanceof ml||t instanceof wp))throw new Et(nt.INVALID_ARGUMENT,"Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore");const r=t._path.child(ii.fromString(e,...n));return Kee(r),new ml(t.firestore,t instanceof wp?t.converter:null,new Ft(r))}}/** * @license * Copyright 2020 Google LLC * @@ -9368,8 +9368,8 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Gee{constructor(e=Promise.resolve()){this.Pu=[],this.Iu=!1,this.Tu=[],this.Eu=null,this.du=!1,this.Au=!1,this.Ru=[],this.t_=new L1e(this,"async_queue_retry"),this.Vu=()=>{const r=yU();r&&It("AsyncQueue","Visibility state changed to "+r.visibilityState),this.t_.jo()},this.mu=e;const n=yU();n&&typeof n.addEventListener=="function"&&n.addEventListener("visibilitychange",this.Vu)}get isShuttingDown(){return this.Iu}enqueueAndForget(e){this.enqueue(e)}enqueueAndForgetEvenWhileRestricted(e){this.fu(),this.gu(e)}enterRestrictedMode(e){if(!this.Iu){this.Iu=!0,this.Au=e||!1;const n=yU();n&&typeof n.removeEventListener=="function"&&n.removeEventListener("visibilitychange",this.Vu)}}enqueue(e){if(this.fu(),this.Iu)return new Promise(()=>{});const n=new Tp;return this.gu(()=>this.Iu&&this.Au?Promise.resolve():(e().then(n.resolve,n.reject),n.promise)).then(()=>n.promise)}enqueueRetryable(e){this.enqueueAndForget(()=>(this.Pu.push(e),this.pu()))}async pu(){if(this.Pu.length!==0){try{await this.Pu[0](),this.Pu.shift(),this.t_.reset()}catch(e){if(!fw(e))throw e;It("AsyncQueue","Operation failed with retryable error: "+e)}this.Pu.length>0&&this.t_.Go(()=>this.pu())}}gu(e){const n=this.mu.then(()=>(this.du=!0,e().catch(r=>{this.Eu=r,this.du=!1;const i=function(a){let o=a.message||"";return a.stack&&(o=a.stack.includes(a.message)?a.stack:a.message+` -`+a.stack),o}(r);throw kf("INTERNAL UNHANDLED ERROR: ",i),r}).then(r=>(this.du=!1,r))));return this.mu=n,n}enqueueAfterDelay(e,n,r){this.fu(),this.Ru.indexOf(e)>-1&&(n=0);const i=KW.createAndSchedule(this,e,n,r,s=>this.yu(s));return this.Tu.push(i),i}fu(){this.Eu&&_t()}verifyOperationInProgress(){}async wu(){let e;do e=this.mu,await e;while(e!==this.mu)}Su(e){for(const n of this.Tu)if(n.timerId===e)return!0;return!1}bu(e){return this.wu().then(()=>{this.Tu.sort((n,r)=>n.targetTimeMs-r.targetTimeMs);for(const n of this.Tu)if(n.skipDelay(),e!=="all"&&n.timerId===e)break;return this.wu()})}Du(e){this.Ru.push(e)}yu(e){const n=this.Tu.indexOf(e);this.Tu.splice(n,1)}}class gw extends j9{constructor(e,n,r,i){super(e,n,r,i),this.type="firestore",this._queue=new Gee,this._persistenceKey=(i==null?void 0:i.name)||"[DEFAULT]"}async _terminate(){if(this._firestoreClient){const e=this._firestoreClient.terminate();this._queue=new Gee(e),this._firestoreClient=void 0,await e}}}function Ixt(t,e){const n=typeof t=="object"?t:Gge(),r=typeof t=="string"?t:e||"(default)",i=bW(n,"firestore").getImmediate({identifier:r});if(!i._initialized){const s=pbt("firestore");s&&kxt(i,...s)}return i}function AW(t){if(t._terminated)throw new Et(nt.FAILED_PRECONDITION,"The client has already been terminated.");return t._firestoreClient||Uxt(t),t._firestoreClient}function Uxt(t){var e,n,r;const i=t._freezeSettings(),s=function(o,l,u,c){return new sSt(o,l,u,c.host,c.ssl,c.experimentalForceLongPolling,c.experimentalAutoDetectLongPolling,_1e(c.experimentalLongPollingOptions),c.useFetchStreams)}(t._databaseId,((e=t._app)===null||e===void 0?void 0:e.options.appId)||"",t._persistenceKey,i);t._componentsProvider||!((n=i.localCache)===null||n===void 0)&&n._offlineComponentProvider&&(!((r=i.localCache)===null||r===void 0)&&r._onlineComponentProvider)&&(t._componentsProvider={_offline:i.localCache._offlineComponentProvider,_online:i.localCache._onlineComponentProvider}),t._firestoreClient=new wxt(t._authCredentials,t._appCheckCredentials,t._queue,s,t._componentsProvider&&function(o){const l=o==null?void 0:o._online.build();return{_offline:o==null?void 0:o._offline.build(l),_online:l}}(t._componentsProvider))}/** + */class Wee{constructor(e=Promise.resolve()){this.Pu=[],this.Iu=!1,this.Tu=[],this.Eu=null,this.du=!1,this.Au=!1,this.Ru=[],this.t_=new N1e(this,"async_queue_retry"),this.Vu=()=>{const r=yU();r&&It("AsyncQueue","Visibility state changed to "+r.visibilityState),this.t_.jo()},this.mu=e;const n=yU();n&&typeof n.addEventListener=="function"&&n.addEventListener("visibilitychange",this.Vu)}get isShuttingDown(){return this.Iu}enqueueAndForget(e){this.enqueue(e)}enqueueAndForgetEvenWhileRestricted(e){this.fu(),this.gu(e)}enterRestrictedMode(e){if(!this.Iu){this.Iu=!0,this.Au=e||!1;const n=yU();n&&typeof n.removeEventListener=="function"&&n.removeEventListener("visibilitychange",this.Vu)}}enqueue(e){if(this.fu(),this.Iu)return new Promise(()=>{});const n=new Tp;return this.gu(()=>this.Iu&&this.Au?Promise.resolve():(e().then(n.resolve,n.reject),n.promise)).then(()=>n.promise)}enqueueRetryable(e){this.enqueueAndForget(()=>(this.Pu.push(e),this.pu()))}async pu(){if(this.Pu.length!==0){try{await this.Pu[0](),this.Pu.shift(),this.t_.reset()}catch(e){if(!fw(e))throw e;It("AsyncQueue","Operation failed with retryable error: "+e)}this.Pu.length>0&&this.t_.Go(()=>this.pu())}}gu(e){const n=this.mu.then(()=>(this.du=!0,e().catch(r=>{this.Eu=r,this.du=!1;const i=function(a){let o=a.message||"";return a.stack&&(o=a.stack.includes(a.message)?a.stack:a.message+` +`+a.stack),o}(r);throw kf("INTERNAL UNHANDLED ERROR: ",i),r}).then(r=>(this.du=!1,r))));return this.mu=n,n}enqueueAfterDelay(e,n,r){this.fu(),this.Ru.indexOf(e)>-1&&(n=0);const i=qW.createAndSchedule(this,e,n,r,s=>this.yu(s));return this.Tu.push(i),i}fu(){this.Eu&&_t()}verifyOperationInProgress(){}async wu(){let e;do e=this.mu,await e;while(e!==this.mu)}Su(e){for(const n of this.Tu)if(n.timerId===e)return!0;return!1}bu(e){return this.wu().then(()=>{this.Tu.sort((n,r)=>n.targetTimeMs-r.targetTimeMs);for(const n of this.Tu)if(n.skipDelay(),e!=="all"&&n.timerId===e)break;return this.wu()})}Du(e){this.Ru.push(e)}yu(e){const n=this.Tu.indexOf(e);this.Tu.splice(n,1)}}class gw extends j9{constructor(e,n,r,i){super(e,n,r,i),this.type="firestore",this._queue=new Wee,this._persistenceKey=(i==null?void 0:i.name)||"[DEFAULT]"}async _terminate(){if(this._firestoreClient){const e=this._firestoreClient.terminate();this._queue=new Wee(e),this._firestoreClient=void 0,await e}}}function Uxt(t,e){const n=typeof t=="object"?t:Age(),r=typeof t=="string"?t:e||"(default)",i=yW(n,"firestore").getImmediate({identifier:r});if(!i._initialized){const s=mbt("firestore");s&&Oxt(i,...s)}return i}function GW(t){if(t._terminated)throw new Et(nt.FAILED_PRECONDITION,"The client has already been terminated.");return t._firestoreClient||Nxt(t),t._firestoreClient}function Nxt(t){var e,n,r;const i=t._freezeSettings(),s=function(o,l,u,c){return new aSt(o,l,u,c.host,c.ssl,c.experimentalForceLongPolling,c.experimentalAutoDetectLongPolling,Q1e(c.experimentalLongPollingOptions),c.useFetchStreams)}(t._databaseId,((e=t._app)===null||e===void 0?void 0:e.options.appId)||"",t._persistenceKey,i);t._componentsProvider||!((n=i.localCache)===null||n===void 0)&&n._offlineComponentProvider&&(!((r=i.localCache)===null||r===void 0)&&r._onlineComponentProvider)&&(t._componentsProvider={_offline:i.localCache._offlineComponentProvider,_online:i.localCache._onlineComponentProvider}),t._firestoreClient=new Ext(t._authCredentials,t._appCheckCredentials,t._queue,s,t._componentsProvider&&function(o){const l=o==null?void 0:o._online.build();return{_offline:o==null?void 0:o._offline.build(l),_online:l}}(t._componentsProvider))}/** * @license * Copyright 2020 Google LLC * @@ -9414,7 +9414,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class GW{constructor(e){this._methodName=e}}/** + */class FW{constructor(e){this._methodName=e}}/** * @license * Copyright 2017 Google LLC * @@ -9429,7 +9429,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class FW{constructor(e,n){if(!isFinite(e)||e<-90||e>90)throw new Et(nt.INVALID_ARGUMENT,"Latitude must be a number between -90 and 90, but was: "+e);if(!isFinite(n)||n<-180||n>180)throw new Et(nt.INVALID_ARGUMENT,"Longitude must be a number between -180 and 180, but was: "+n);this._lat=e,this._long=n}get latitude(){return this._lat}get longitude(){return this._long}isEqual(e){return this._lat===e._lat&&this._long===e._long}toJSON(){return{latitude:this._lat,longitude:this._long}}_compareTo(e){return rr(this._lat,e._lat)||rr(this._long,e._long)}}/** + */class jW{constructor(e,n){if(!isFinite(e)||e<-90||e>90)throw new Et(nt.INVALID_ARGUMENT,"Latitude must be a number between -90 and 90, but was: "+e);if(!isFinite(n)||n<-180||n>180)throw new Et(nt.INVALID_ARGUMENT,"Longitude must be a number between -180 and 180, but was: "+n);this._lat=e,this._long=n}get latitude(){return this._lat}get longitude(){return this._long}isEqual(e){return this._lat===e._lat&&this._long===e._long}toJSON(){return{latitude:this._lat,longitude:this._long}}_compareTo(e){return rr(this._lat,e._lat)||rr(this._long,e._long)}}/** * @license * Copyright 2024 Google LLC * @@ -9444,7 +9444,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class jW{constructor(e){this._values=(e||[]).map(n=>n)}toArray(){return this._values.map(e=>e)}isEqual(e){return function(r,i){if(r.length!==i.length)return!1;for(let s=0;sn)}toArray(){return this._values.map(e=>e)}isEqual(e){return function(r,i){if(r.length!==i.length)return!1;for(let s=0;se.isPrefixOf(n))!==void 0||this.fieldTransforms.find(n=>e.isPrefixOf(n.field))!==void 0}vu(){if(this.path)for(let e=0;el.covers(d.field))}else l=null,u=a.fieldTransforms;return new Lxt(new Io(o),l,u)}class Y9 extends GW{_toFieldTransform(e){if(e.Cu!==2)throw e.Cu===1?e.Bu(`${this._methodName}() can only appear at the top level of your update data`):e.Bu(`${this._methodName}() cannot be used with set() unless you pass {merge:true}`);return e.fieldMask.push(e.path),null}isEqual(e){return e instanceof Y9}}function Cxt(t,e,n,r){const i=t.Qu(1,e,n);YW("Data must be an object, but it was:",i,r);const s=[],a=Io.empty();L0(r,(l,u)=>{const c=BW(e,l,n);u=la(u);const d=i.Nu(c);if(u instanceof Y9)s.push(c);else{const f=bw(u,d);f!=null&&(s.push(c),a.set(c,f))}});const o=new ul(s);return new ebe(a,o,i.fieldTransforms)}function Kxt(t,e,n,r,i,s){const a=t.Qu(1,e,n),o=[G4(e,r,n)],l=[i];if(s.length%2!=0)throw new Et(nt.INVALID_ARGUMENT,`Function ${e}() needs to be called with an even number of arguments that alternate between field names and values.`);for(let f=0;f=0;--f)if(!ibe(u,o[f])){const h=o[f];let p=l[f];p=la(p);const m=a.Nu(h);if(p instanceof Y9)u.push(h);else{const v=bw(p,m);v!=null&&(u.push(h),c.set(h,v))}}const d=new ul(u);return new ebe(c,d,a.fieldTransforms)}function qxt(t,e,n,r=!1){return bw(n,t.Qu(r?4:3,e))}function bw(t,e){if(rbe(t=la(t)))return YW("Unsupported field value:",e,t),nbe(t,e);if(t instanceof GW)return function(r,i){if(!tbe(i.Cu))throw i.Bu(`${r._methodName}() can only be used with update() and set()`);if(!i.path)throw i.Bu(`${r._methodName}() is not currently supported inside arrays`);const s=r._toFieldTransform(i);s&&i.fieldTransforms.push(s)}(t,e),null;if(t===void 0&&e.ignoreUndefinedProperties)return null;if(e.path&&e.fieldMask.push(e.path),t instanceof Array){if(e.settings.xu&&e.Cu!==4)throw e.Bu("Nested arrays are not supported");return function(r,i){const s=[];let a=0;for(const o of r){let l=bw(o,i.Lu(a));l==null&&(l={nullValue:"NULL_VALUE"}),s.push(l),a++}return{arrayValue:{values:s}}}(t,e)}return function(r,i){if((r=la(r))===null)return{nullValue:"NULL_VALUE"};if(typeof r=="number")return RSt(i.serializer,r);if(typeof r=="boolean")return{booleanValue:r};if(typeof r=="string")return{stringValue:r};if(r instanceof Date){const s=Es.fromDate(r);return{timestampValue:tR(i.serializer,s)}}if(r instanceof Es){const s=new Es(r.seconds,1e3*Math.floor(r.nanoseconds/1e3));return{timestampValue:tR(i.serializer,s)}}if(r instanceof FW)return{geoPointValue:{latitude:r.latitude,longitude:r.longitude}};if(r instanceof Fb)return{bytesValue:P1e(i.serializer,r._byteString)};if(r instanceof vl){const s=i.databaseId,a=r.firestore._databaseId;if(!a.isEqual(s))throw i.Bu(`Document reference is for database ${a.projectId}/${a.database} but should be for database ${s.projectId}/${s.database}`);return{referenceValue:kW(r.firestore._databaseId||i.databaseId,r._key.path)}}if(r instanceof jW)return function(a,o){return{mapValue:{fields:{__type__:{stringValue:"__vector__"},value:{arrayValue:{values:a.toArray().map(l=>{if(typeof l!="number")throw o.Bu("VectorValues must only contain numeric values.");return PW(o.serializer,l)})}}}}}}(r,i);throw i.Bu(`Unsupported field value: ${F9(r)}`)}(t,e)}function nbe(t,e){const n={};return e1e(t)?e.path&&e.path.length>0&&e.fieldMask.push(e.path):L0(t,(r,i)=>{const s=bw(i,e.Mu(r));s!=null&&(n[r]=s)}),{mapValue:{fields:n}}}function rbe(t){return!(typeof t!="object"||t===null||t instanceof Array||t instanceof Date||t instanceof Es||t instanceof FW||t instanceof Fb||t instanceof vl||t instanceof GW||t instanceof jW)}function YW(t,e,n){if(!rbe(n)||!function(i){return typeof i=="object"&&i!==null&&(Object.getPrototypeOf(i)===Object.prototype||Object.getPrototypeOf(i)===null)}(n)){const r=F9(n);throw r==="an object"?e.Bu(t+" a custom object"):e.Bu(t+" "+r)}}function G4(t,e,n){if((e=la(e))instanceof Z9)return e._internalPath;if(typeof e=="string")return BW(t,e);throw iR("Field path arguments must be of type string or ",t,!1,void 0,n)}const Dxt=new RegExp("[~\\*/\\[\\]]");function BW(t,e,n){if(e.search(Dxt)>=0)throw iR(`Invalid field path (${e}). Paths must not contain '~', '*', '/', '[', or ']'`,t,!1,void 0,n);try{return new Z9(...e.split("."))._internalPath}catch{throw iR(`Invalid field path (${e}). Paths must not be empty, begin with '.', end with '.', or contain '..'`,t,!1,void 0,n)}}function iR(t,e,n,r,i){const s=r&&!r.isEmpty(),a=i!==void 0;let o=`Function ${e}() called with invalid data`;n&&(o+=" (via `toFirestore()`)"),o+=". ";let l="";return(s||a)&&(l+=" (found",s&&(l+=` in field ${r}`),a&&(l+=` in document ${i}`),l+=")"),new Et(nt.INVALID_ARGUMENT,o+t+l)}function ibe(t,e){return t.some(n=>n.isEqual(e))}/** + */const Lxt=/^__.*__$/;class Xxt{constructor(e,n,r){this.data=e,this.fieldMask=n,this.fieldTransforms=r}toMutation(e,n){return this.fieldMask!==null?new hm(e,this.data,this.fieldMask,n,this.fieldTransforms):new hw(e,this.data,n,this.fieldTransforms)}}class $1e{constructor(e,n,r){this.data=e,this.fieldMask=n,this.fieldTransforms=r}toMutation(e,n){return new hm(e,this.data,this.fieldMask,n,this.fieldTransforms)}}function ebe(t){switch(t){case 0:case 2:case 1:return!0;case 3:case 4:return!1;default:throw _t()}}class JW{constructor(e,n,r,i,s,a){this.settings=e,this.databaseId=n,this.serializer=r,this.ignoreUndefinedProperties=i,s===void 0&&this.vu(),this.fieldTransforms=s||[],this.fieldMask=a||[]}get path(){return this.settings.path}get Cu(){return this.settings.Cu}Fu(e){return new JW(Object.assign(Object.assign({},this.settings),e),this.databaseId,this.serializer,this.ignoreUndefinedProperties,this.fieldTransforms,this.fieldMask)}Mu(e){var n;const r=(n=this.path)===null||n===void 0?void 0:n.child(e),i=this.Fu({path:r,xu:!1});return i.Ou(e),i}Nu(e){var n;const r=(n=this.path)===null||n===void 0?void 0:n.child(e),i=this.Fu({path:r,xu:!1});return i.vu(),i}Lu(e){return this.Fu({path:void 0,xu:!0})}Bu(e){return rR(e,this.settings.methodName,this.settings.ku||!1,this.path,this.settings.qu)}contains(e){return this.fieldMask.find(n=>e.isPrefixOf(n))!==void 0||this.fieldTransforms.find(n=>e.isPrefixOf(n.field))!==void 0}vu(){if(this.path)for(let e=0;el.covers(d.field))}else l=null,u=a.fieldTransforms;return new Xxt(new Oo(o),l,u)}class Y9 extends FW{_toFieldTransform(e){if(e.Cu!==2)throw e.Cu===1?e.Bu(`${this._methodName}() can only appear at the top level of your update data`):e.Bu(`${this._methodName}() cannot be used with set() unless you pass {merge:true}`);return e.fieldMask.push(e.path),null}isEqual(e){return e instanceof Y9}}function Kxt(t,e,n,r){const i=t.Qu(1,e,n);BW("Data must be an object, but it was:",i,r);const s=[],a=Oo.empty();L0(r,(l,u)=>{const c=HW(e,l,n);u=la(u);const d=i.Nu(c);if(u instanceof Y9)s.push(c);else{const f=bw(u,d);f!=null&&(s.push(c),a.set(c,f))}});const o=new ll(s);return new $1e(a,o,i.fieldTransforms)}function qxt(t,e,n,r,i,s){const a=t.Qu(1,e,n),o=[G4(e,r,n)],l=[i];if(s.length%2!=0)throw new Et(nt.INVALID_ARGUMENT,`Function ${e}() needs to be called with an even number of arguments that alternate between field names and values.`);for(let f=0;f=0;--f)if(!rbe(u,o[f])){const h=o[f];let p=l[f];p=la(p);const m=a.Nu(h);if(p instanceof Y9)u.push(h);else{const v=bw(p,m);v!=null&&(u.push(h),c.set(h,v))}}const d=new ll(u);return new $1e(c,d,a.fieldTransforms)}function Dxt(t,e,n,r=!1){return bw(n,t.Qu(r?4:3,e))}function bw(t,e){if(nbe(t=la(t)))return BW("Unsupported field value:",e,t),tbe(t,e);if(t instanceof FW)return function(r,i){if(!ebe(i.Cu))throw i.Bu(`${r._methodName}() can only be used with update() and set()`);if(!i.path)throw i.Bu(`${r._methodName}() is not currently supported inside arrays`);const s=r._toFieldTransform(i);s&&i.fieldTransforms.push(s)}(t,e),null;if(t===void 0&&e.ignoreUndefinedProperties)return null;if(e.path&&e.fieldMask.push(e.path),t instanceof Array){if(e.settings.xu&&e.Cu!==4)throw e.Bu("Nested arrays are not supported");return function(r,i){const s=[];let a=0;for(const o of r){let l=bw(o,i.Lu(a));l==null&&(l={nullValue:"NULL_VALUE"}),s.push(l),a++}return{arrayValue:{values:s}}}(t,e)}return function(r,i){if((r=la(r))===null)return{nullValue:"NULL_VALUE"};if(typeof r=="number")return VSt(i.serializer,r);if(typeof r=="boolean")return{booleanValue:r};if(typeof r=="string")return{stringValue:r};if(r instanceof Date){const s=Es.fromDate(r);return{timestampValue:eR(i.serializer,s)}}if(r instanceof Es){const s=new Es(r.seconds,1e3*Math.floor(r.nanoseconds/1e3));return{timestampValue:eR(i.serializer,s)}}if(r instanceof jW)return{geoPointValue:{latitude:r.latitude,longitude:r.longitude}};if(r instanceof Fb)return{bytesValue:M1e(i.serializer,r._byteString)};if(r instanceof ml){const s=i.databaseId,a=r.firestore._databaseId;if(!a.isEqual(s))throw i.Bu(`Document reference is for database ${a.projectId}/${a.database} but should be for database ${s.projectId}/${s.database}`);return{referenceValue:OW(r.firestore._databaseId||i.databaseId,r._key.path)}}if(r instanceof ZW)return function(a,o){return{mapValue:{fields:{__type__:{stringValue:"__vector__"},value:{arrayValue:{values:a.toArray().map(l=>{if(typeof l!="number")throw o.Bu("VectorValues must only contain numeric values.");return RW(o.serializer,l)})}}}}}}(r,i);throw i.Bu(`Unsupported field value: ${F9(r)}`)}(t,e)}function tbe(t,e){const n={};return $ge(t)?e.path&&e.path.length>0&&e.fieldMask.push(e.path):L0(t,(r,i)=>{const s=bw(i,e.Mu(r));s!=null&&(n[r]=s)}),{mapValue:{fields:n}}}function nbe(t){return!(typeof t!="object"||t===null||t instanceof Array||t instanceof Date||t instanceof Es||t instanceof jW||t instanceof Fb||t instanceof ml||t instanceof FW||t instanceof ZW)}function BW(t,e,n){if(!nbe(n)||!function(i){return typeof i=="object"&&i!==null&&(Object.getPrototypeOf(i)===Object.prototype||Object.getPrototypeOf(i)===null)}(n)){const r=F9(n);throw r==="an object"?e.Bu(t+" a custom object"):e.Bu(t+" "+r)}}function G4(t,e,n){if((e=la(e))instanceof Z9)return e._internalPath;if(typeof e=="string")return HW(t,e);throw rR("Field path arguments must be of type string or ",t,!1,void 0,n)}const Wxt=new RegExp("[~\\*/\\[\\]]");function HW(t,e,n){if(e.search(Wxt)>=0)throw rR(`Invalid field path (${e}). Paths must not contain '~', '*', '/', '[', or ']'`,t,!1,void 0,n);try{return new Z9(...e.split("."))._internalPath}catch{throw rR(`Invalid field path (${e}). Paths must not be empty, begin with '.', end with '.', or contain '..'`,t,!1,void 0,n)}}function rR(t,e,n,r,i){const s=r&&!r.isEmpty(),a=i!==void 0;let o=`Function ${e}() called with invalid data`;n&&(o+=" (via `toFirestore()`)"),o+=". ";let l="";return(s||a)&&(l+=" (found",s&&(l+=` in field ${r}`),a&&(l+=` in document ${i}`),l+=")"),new Et(nt.INVALID_ARGUMENT,o+t+l)}function rbe(t,e){return t.some(n=>n.isEqual(e))}/** * @license * Copyright 2020 Google LLC * @@ -9474,7 +9474,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class sbe{constructor(e,n,r,i,s){this._firestore=e,this._userDataWriter=n,this._key=r,this._document=i,this._converter=s}get id(){return this._key.path.lastSegment()}get ref(){return new vl(this._firestore,this._converter,this._key)}exists(){return this._document!==null}data(){if(this._document){if(this._converter){const e=new Wxt(this._firestore,this._userDataWriter,this._key,this._document,null);return this._converter.fromFirestore(e)}return this._userDataWriter.convertValue(this._document.data.value)}}get(e){if(this._document){const n=this._document.data.field(B9("DocumentSnapshot.get",e));if(n!==null)return this._userDataWriter.convertValue(n)}}}class Wxt extends sbe{data(){return super.data()}}function B9(t,e){return typeof e=="string"?BW(t,e):e instanceof Z9?e._internalPath:e._delegate._internalPath}/** + */class ibe{constructor(e,n,r,i,s){this._firestore=e,this._userDataWriter=n,this._key=r,this._document=i,this._converter=s}get id(){return this._key.path.lastSegment()}get ref(){return new ml(this._firestore,this._converter,this._key)}exists(){return this._document!==null}data(){if(this._document){if(this._converter){const e=new Axt(this._firestore,this._userDataWriter,this._key,this._document,null);return this._converter.fromFirestore(e)}return this._userDataWriter.convertValue(this._document.data.value)}}get(e){if(this._document){const n=this._document.data.field(B9("DocumentSnapshot.get",e));if(n!==null)return this._userDataWriter.convertValue(n)}}}class Axt extends ibe{data(){return super.data()}}function B9(t,e){return typeof e=="string"?HW(t,e):e instanceof Z9?e._internalPath:e._delegate._internalPath}/** * @license * Copyright 2020 Google LLC * @@ -9489,7 +9489,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Axt(t){if(t.limitType==="L"&&t.explicitOrderBy.length===0)throw new Et(nt.UNIMPLEMENTED,"limitToLast() queries require specifying at least one orderBy() clause")}class HW{}class QW extends HW{}function pc(t,e,...n){let r=[];e instanceof HW&&r.push(e),r=r.concat(n),function(s){const a=s.filter(l=>l instanceof _W).length,o=s.filter(l=>l instanceof H9).length;if(a>1||a>0&&o>0)throw new Et(nt.INVALID_ARGUMENT,"InvalidQuery. When using composite filters, you cannot use more than one filter at the top level. Consider nesting the multiple filters within an `and(...)` statement. For example: change `query(query, where(...), or(...))` to `query(query, and(where(...), or(...)))`.")}(r);for(const i of r)t=i._apply(t);return t}class H9 extends QW{constructor(e,n,r){super(),this._field=e,this._op=n,this._value=r,this.type="where"}static _create(e,n,r){return new H9(e,n,r)}_apply(e){const n=this._parse(e);return abe(e._query,n),new pm(e.firestore,e.converter,N4(e._query,n))}_parse(e){const n=J9(e.firestore);return function(s,a,o,l,u,c,d){let f;if(u.isKeyField()){if(c==="array-contains"||c==="array-contains-any")throw new Et(nt.INVALID_ARGUMENT,`Invalid Query. You can't perform '${c}' queries on documentId().`);if(c==="in"||c==="not-in"){jee(d,c);const h=[];for(const p of d)h.push(Fee(l,s,p));f={arrayValue:{values:h}}}else f=Fee(l,s,d)}else c!=="in"&&c!=="not-in"&&c!=="array-contains-any"||jee(d,c),f=qxt(o,a,d,c==="in"||c==="not-in");return is.create(u,c,f)}(e._query,"where",n,e.firestore._databaseId,this._field,this._op,this._value)}}function du(t,e,n){const r=e,i=B9("where",t);return H9._create(i,r,n)}class _W extends HW{constructor(e,n){super(),this.type=e,this._queryConstraints=n}static _create(e,n){return new _W(e,n)}_parse(e){const n=this._queryConstraints.map(r=>r._parse(e)).filter(r=>r.getFilters().length>0);return n.length===1?n[0]:Gu.create(n,this._getOperator())}_apply(e){const n=this._parse(e);return n.getFilters().length===0?e:(function(i,s){let a=i;const o=s.getFlattenedFilters();for(const l of o)abe(a,l),a=N4(a,l)}(e._query,n),new pm(e.firestore,e.converter,N4(e._query,n)))}_getQueryConstraints(){return this._queryConstraints}_getOperator(){return this.type==="and"?"and":"or"}}class $W extends QW{constructor(e,n){super(),this._field=e,this._direction=n,this.type="orderBy"}static _create(e,n){return new $W(e,n)}_apply(e){const n=function(i,s,a){if(i.startAt!==null)throw new Et(nt.INVALID_ARGUMENT,"Invalid query. You must not call startAt() or startAfter() before calling orderBy().");if(i.endAt!==null)throw new Et(nt.INVALID_ARGUMENT,"Invalid query. You must not call endAt() or endBefore() before calling orderBy().");return new A6(s,a)}(e._query,this._field,this._direction);return new pm(e.firestore,e.converter,function(i,s){const a=i.explicitOrderBy.concat([s]);return new By(i.path,i.collectionGroup,a,i.filters.slice(),i.limit,i.limitType,i.startAt,i.endAt)}(e._query,n))}}function OE(t,e="asc"){const n=e,r=B9("orderBy",t);return $W._create(r,n)}class eA extends QW{constructor(e,n,r){super(),this.type=e,this._limit=n,this._limitType=r}static _create(e,n,r){return new eA(e,n,r)}_apply(e){return new pm(e.firestore,e.converter,_P(e._query,this._limit,this._limitType))}}function IE(t){return zxt("limit",t),eA._create("limit",t,"F")}function Fee(t,e,n){if(typeof(n=la(n))=="string"){if(n==="")throw new Et(nt.INVALID_ARGUMENT,"Invalid query. When querying with documentId(), you must provide a valid document ID, but it was an empty string.");if(!c1e(e)&&n.indexOf("/")!==-1)throw new Et(nt.INVALID_ARGUMENT,`Invalid query. When querying a collection by documentId(), you must provide a plain document ID, but '${n}' contains a '/' character.`);const r=e.path.child(ii.fromString(n));if(!Ft.isDocumentKey(r))throw new Et(nt.INVALID_ARGUMENT,`Invalid query. When querying a collection group by documentId(), the value provided must result in a valid document path, but '${r}' is not because it has an odd number of segments (${r.length}).`);return fee(t,new Ft(r))}if(n instanceof vl)return fee(t,n._key);throw new Et(nt.INVALID_ARGUMENT,`Invalid query. When querying with documentId(), you must provide a valid string or a DocumentReference, but it was: ${F9(n)}.`)}function jee(t,e){if(!Array.isArray(t)||t.length===0)throw new Et(nt.INVALID_ARGUMENT,`Invalid Query. A non-empty array is required for '${e.toString()}' filters.`)}function abe(t,e){const n=function(i,s){for(const a of i)for(const o of a.getFlattenedFilters())if(s.indexOf(o.op)>=0)return o.op;return null}(t.filters,function(i){switch(i){case"!=":return["!=","not-in"];case"array-contains-any":case"in":return["not-in"];case"not-in":return["array-contains-any","in","not-in","!="];default:return[]}}(e.op));if(n!==null)throw n===e.op?new Et(nt.INVALID_ARGUMENT,`Invalid query. You cannot use more than one '${e.op.toString()}' filter.`):new Et(nt.INVALID_ARGUMENT,`Invalid query. You cannot use '${e.op.toString()}' filters with '${n.toString()}' filters.`)}class Gxt{convertValue(e,n="none"){switch($v(e)){case 0:return null;case 1:return e.booleanValue;case 2:return Gi(e.integerValue||e.doubleValue);case 3:return this.convertTimestamp(e.timestampValue);case 4:return this.convertServerTimestamp(e,n);case 5:return e.stringValue;case 6:return this.convertBytes(_v(e.bytesValue));case 7:return this.convertReference(e.referenceValue);case 8:return this.convertGeoPoint(e.geoPointValue);case 9:return this.convertArray(e.arrayValue,n);case 11:return this.convertObject(e.mapValue,n);case 10:return this.convertVectorValue(e.mapValue);default:throw _t()}}convertObject(e,n){return this.convertObjectMap(e.fields,n)}convertObjectMap(e,n="none"){const r={};return L0(e,(i,s)=>{r[i]=this.convertValue(s,n)}),r}convertVectorValue(e){var n,r,i;const s=(i=(r=(n=e.fields)===null||n===void 0?void 0:n.value.arrayValue)===null||r===void 0?void 0:r.values)===null||i===void 0?void 0:i.map(a=>Gi(a.doubleValue));return new jW(s)}convertGeoPoint(e){return new FW(Gi(e.latitude),Gi(e.longitude))}convertArray(e,n){return(e.values||[]).map(r=>this.convertValue(r,n))}convertServerTimestamp(e,n){switch(n){case"previous":const r=TW(e);return r==null?null:this.convertValue(r,n);case"estimate":return this.convertTimestamp(q6(e));default:return null}}convertTimestamp(e){const n=Fp(e);return new Es(n.seconds,n.nanos)}convertDocumentKey(e,n){const r=ii.fromString(e);Pr(I1e(r));const i=new D6(r.get(1),r.get(3)),s=new Ft(r.popFirst(5));return i.isEqual(n)||kf(`Document ${s} contains a document reference within a different database (${i.projectId}/${i.database}) which is not supported. It will be treated as a reference in the current database (${n.projectId}/${n.database}) instead.`),s}}/** + */function Gxt(t){if(t.limitType==="L"&&t.explicitOrderBy.length===0)throw new Et(nt.UNIMPLEMENTED,"limitToLast() queries require specifying at least one orderBy() clause")}class QW{}class _W extends QW{}function pc(t,e,...n){let r=[];e instanceof QW&&r.push(e),r=r.concat(n),function(s){const a=s.filter(l=>l instanceof $W).length,o=s.filter(l=>l instanceof H9).length;if(a>1||a>0&&o>0)throw new Et(nt.INVALID_ARGUMENT,"InvalidQuery. When using composite filters, you cannot use more than one filter at the top level. Consider nesting the multiple filters within an `and(...)` statement. For example: change `query(query, where(...), or(...))` to `query(query, and(where(...), or(...)))`.")}(r);for(const i of r)t=i._apply(t);return t}class H9 extends _W{constructor(e,n,r){super(),this._field=e,this._op=n,this._value=r,this.type="where"}static _create(e,n,r){return new H9(e,n,r)}_apply(e){const n=this._parse(e);return sbe(e._query,n),new pm(e.firestore,e.converter,N4(e._query,n))}_parse(e){const n=J9(e.firestore);return function(s,a,o,l,u,c,d){let f;if(u.isKeyField()){if(c==="array-contains"||c==="array-contains-any")throw new Et(nt.INVALID_ARGUMENT,`Invalid Query. You can't perform '${c}' queries on documentId().`);if(c==="in"||c==="not-in"){Gee(d,c);const h=[];for(const p of d)h.push(Aee(l,s,p));f={arrayValue:{values:h}}}else f=Aee(l,s,d)}else c!=="in"&&c!=="not-in"&&c!=="array-contains-any"||Gee(d,c),f=Dxt(o,a,d,c==="in"||c==="not-in");return is.create(u,c,f)}(e._query,"where",n,e.firestore._databaseId,this._field,this._op,this._value)}}function du(t,e,n){const r=e,i=B9("where",t);return H9._create(i,r,n)}class $W extends QW{constructor(e,n){super(),this.type=e,this._queryConstraints=n}static _create(e,n){return new $W(e,n)}_parse(e){const n=this._queryConstraints.map(r=>r._parse(e)).filter(r=>r.getFilters().length>0);return n.length===1?n[0]:Gu.create(n,this._getOperator())}_apply(e){const n=this._parse(e);return n.getFilters().length===0?e:(function(i,s){let a=i;const o=s.getFlattenedFilters();for(const l of o)sbe(a,l),a=N4(a,l)}(e._query,n),new pm(e.firestore,e.converter,N4(e._query,n)))}_getQueryConstraints(){return this._queryConstraints}_getOperator(){return this.type==="and"?"and":"or"}}class eA extends _W{constructor(e,n){super(),this._field=e,this._direction=n,this.type="orderBy"}static _create(e,n){return new eA(e,n)}_apply(e){const n=function(i,s,a){if(i.startAt!==null)throw new Et(nt.INVALID_ARGUMENT,"Invalid query. You must not call startAt() or startAfter() before calling orderBy().");if(i.endAt!==null)throw new Et(nt.INVALID_ARGUMENT,"Invalid query. You must not call endAt() or endBefore() before calling orderBy().");return new W6(s,a)}(e._query,this._field,this._direction);return new pm(e.firestore,e.converter,function(i,s){const a=i.explicitOrderBy.concat([s]);return new Yy(i.path,i.collectionGroup,a,i.filters.slice(),i.limit,i.limitType,i.startAt,i.endAt)}(e._query,n))}}function OE(t,e="asc"){const n=e,r=B9("orderBy",t);return eA._create(r,n)}class tA extends _W{constructor(e,n,r){super(),this.type=e,this._limit=n,this._limitType=r}static _create(e,n,r){return new tA(e,n,r)}_apply(e){return new pm(e.firestore,e.converter,QP(e._query,this._limit,this._limitType))}}function IE(t){return kxt("limit",t),tA._create("limit",t,"F")}function Aee(t,e,n){if(typeof(n=la(n))=="string"){if(n==="")throw new Et(nt.INVALID_ARGUMENT,"Invalid query. When querying with documentId(), you must provide a valid document ID, but it was an empty string.");if(!u1e(e)&&n.indexOf("/")!==-1)throw new Et(nt.INVALID_ARGUMENT,`Invalid query. When querying a collection by documentId(), you must provide a plain document ID, but '${n}' contains a '/' character.`);const r=e.path.child(ii.fromString(n));if(!Ft.isDocumentKey(r))throw new Et(nt.INVALID_ARGUMENT,`Invalid query. When querying a collection group by documentId(), the value provided must result in a valid document path, but '${r}' is not because it has an odd number of segments (${r.length}).`);return cee(t,new Ft(r))}if(n instanceof ml)return cee(t,n._key);throw new Et(nt.INVALID_ARGUMENT,`Invalid query. When querying with documentId(), you must provide a valid string or a DocumentReference, but it was: ${F9(n)}.`)}function Gee(t,e){if(!Array.isArray(t)||t.length===0)throw new Et(nt.INVALID_ARGUMENT,`Invalid Query. A non-empty array is required for '${e.toString()}' filters.`)}function sbe(t,e){const n=function(i,s){for(const a of i)for(const o of a.getFlattenedFilters())if(s.indexOf(o.op)>=0)return o.op;return null}(t.filters,function(i){switch(i){case"!=":return["!=","not-in"];case"array-contains-any":case"in":return["not-in"];case"not-in":return["array-contains-any","in","not-in","!="];default:return[]}}(e.op));if(n!==null)throw n===e.op?new Et(nt.INVALID_ARGUMENT,`Invalid query. You cannot use more than one '${e.op.toString()}' filter.`):new Et(nt.INVALID_ARGUMENT,`Invalid query. You cannot use '${e.op.toString()}' filters with '${n.toString()}' filters.`)}class Fxt{convertValue(e,n="none"){switch($v(e)){case 0:return null;case 1:return e.booleanValue;case 2:return Gi(e.integerValue||e.doubleValue);case 3:return this.convertTimestamp(e.timestampValue);case 4:return this.convertServerTimestamp(e,n);case 5:return e.stringValue;case 6:return this.convertBytes(_v(e.bytesValue));case 7:return this.convertReference(e.referenceValue);case 8:return this.convertGeoPoint(e.geoPointValue);case 9:return this.convertArray(e.arrayValue,n);case 11:return this.convertObject(e.mapValue,n);case 10:return this.convertVectorValue(e.mapValue);default:throw _t()}}convertObject(e,n){return this.convertObjectMap(e.fields,n)}convertObjectMap(e,n="none"){const r={};return L0(e,(i,s)=>{r[i]=this.convertValue(s,n)}),r}convertVectorValue(e){var n,r,i;const s=(i=(r=(n=e.fields)===null||n===void 0?void 0:n.value.arrayValue)===null||r===void 0?void 0:r.values)===null||i===void 0?void 0:i.map(a=>Gi(a.doubleValue));return new ZW(s)}convertGeoPoint(e){return new jW(Gi(e.latitude),Gi(e.longitude))}convertArray(e,n){return(e.values||[]).map(r=>this.convertValue(r,n))}convertServerTimestamp(e,n){switch(n){case"previous":const r=wW(e);return r==null?null:this.convertValue(r,n);case"estimate":return this.convertTimestamp(K6(e));default:return null}}convertTimestamp(e){const n=Fp(e);return new Es(n.seconds,n.nanos)}convertDocumentKey(e,n){const r=ii.fromString(e);Pr(O1e(r));const i=new q6(r.get(1),r.get(3)),s=new Ft(r.popFirst(5));return i.isEqual(n)||kf(`Document ${s} contains a document reference within a different database (${i.projectId}/${i.database}) which is not supported. It will be treated as a reference in the current database (${n.projectId}/${n.database}) instead.`),s}}/** * @license * Copyright 2020 Google LLC * @@ -9504,7 +9504,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function tA(t,e,n){let r;return r=t?n&&(n.merge||n.mergeFields)?t.toFirestore(e,n):t.toFirestore(e):e,r}/** + */function nA(t,e,n){let r;return r=t?n&&(n.merge||n.mergeFields)?t.toFirestore(e,n):t.toFirestore(e):e,r}/** * @license * Copyright 2020 Google LLC * @@ -9519,7 +9519,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class UE{constructor(e,n){this.hasPendingWrites=e,this.fromCache=n}isEqual(e){return this.hasPendingWrites===e.hasPendingWrites&&this.fromCache===e.fromCache}}class Fxt extends sbe{constructor(e,n,r,i,s,a){super(e,n,r,i,a),this._firestore=e,this._firestoreImpl=e,this.metadata=s}exists(){return super.exists()}data(e={}){if(this._document){if(this._converter){const n=new eM(this._firestore,this._userDataWriter,this._key,this._document,this.metadata,null);return this._converter.fromFirestore(n,e)}return this._userDataWriter.convertValue(this._document.data.value,e.serverTimestamps)}}get(e,n={}){if(this._document){const r=this._document.data.field(B9("DocumentSnapshot.get",e));if(r!==null)return this._userDataWriter.convertValue(r,n.serverTimestamps)}}}class eM extends Fxt{data(e={}){return super.data(e)}}class jxt{constructor(e,n,r,i){this._firestore=e,this._userDataWriter=n,this._snapshot=i,this.metadata=new UE(i.hasPendingWrites,i.fromCache),this.query=r}get docs(){const e=[];return this.forEach(n=>e.push(n)),e}get size(){return this._snapshot.docs.size}get empty(){return this.size===0}forEach(e,n){this._snapshot.docs.forEach(r=>{e.call(n,new eM(this._firestore,this._userDataWriter,r.key,r,new UE(this._snapshot.mutatedKeys.has(r.key),this._snapshot.fromCache),this.query.converter))})}docChanges(e={}){const n=!!e.includeMetadataChanges;if(n&&this._snapshot.excludesMetadataChanges)throw new Et(nt.INVALID_ARGUMENT,"To include metadata changes with your document changes, you must also pass { includeMetadataChanges:true } to onSnapshot().");return this._cachedChanges&&this._cachedChangesIncludeMetadataChanges===n||(this._cachedChanges=function(i,s){if(i._snapshot.oldDocs.isEmpty()){let a=0;return i._snapshot.docChanges.map(o=>{const l=new eM(i._firestore,i._userDataWriter,o.doc.key,o.doc,new UE(i._snapshot.mutatedKeys.has(o.doc.key),i._snapshot.fromCache),i.query.converter);return o.doc,{type:"added",doc:l,oldIndex:-1,newIndex:a++}})}{let a=i._snapshot.oldDocs;return i._snapshot.docChanges.filter(o=>s||o.type!==3).map(o=>{const l=new eM(i._firestore,i._userDataWriter,o.doc.key,o.doc,new UE(i._snapshot.mutatedKeys.has(o.doc.key),i._snapshot.fromCache),i.query.converter);let u=-1,c=-1;return o.type!==0&&(u=a.indexOf(o.doc.key),a=a.delete(o.doc.key)),o.type!==1&&(a=a.add(o.doc),c=a.indexOf(o.doc.key)),{type:Zxt(o.type),doc:l,oldIndex:u,newIndex:c}})}}(this,n),this._cachedChangesIncludeMetadataChanges=n),this._cachedChanges}}function Zxt(t){switch(t){case 0:return"added";case 2:case 3:return"modified";case 1:return"removed";default:return _t()}}class Jxt extends Gxt{constructor(e){super(),this.firestore=e}convertBytes(e){return new Fb(e)}convertReference(e){const n=this.convertDocumentKey(e,this.firestore._databaseId);return new vl(this.firestore,null,n)}}function mc(t){t=e0(t,pm);const e=e0(t.firestore,gw),n=AW(e),r=new Jxt(e);return Axt(t._query),Rxt(n,t._query).then(i=>new jxt(e,r,t,i))}function Yxt(t,e,n){t=e0(t,vl);const r=e0(t.firestore,gw),i=tA(t.converter,e,n);return nA(r,[JW(J9(r),"setDoc",t._key,i,t.converter!==null,n).toMutation(t._key,ml.none())])}function Ng(t,e){const n=e0(t.firestore,gw),r=Oxt(t),i=tA(t.converter,e);return nA(n,[JW(J9(t.firestore),"addDoc",r._key,i,t.converter!==null,{}).toMutation(r._key,ml.exists(!1))]).then(()=>r)}function nA(t,e){return function(r,i){const s=new Tp;return r.asyncQueue.enqueueAndForget(async()=>pxt(await Mxt(r),i,s)),s.promise}(AW(t),e)}/** + */class UE{constructor(e,n){this.hasPendingWrites=e,this.fromCache=n}isEqual(e){return this.hasPendingWrites===e.hasPendingWrites&&this.fromCache===e.fromCache}}class jxt extends ibe{constructor(e,n,r,i,s,a){super(e,n,r,i,a),this._firestore=e,this._firestoreImpl=e,this.metadata=s}exists(){return super.exists()}data(e={}){if(this._document){if(this._converter){const n=new eM(this._firestore,this._userDataWriter,this._key,this._document,this.metadata,null);return this._converter.fromFirestore(n,e)}return this._userDataWriter.convertValue(this._document.data.value,e.serverTimestamps)}}get(e,n={}){if(this._document){const r=this._document.data.field(B9("DocumentSnapshot.get",e));if(r!==null)return this._userDataWriter.convertValue(r,n.serverTimestamps)}}}class eM extends jxt{data(e={}){return super.data(e)}}class Zxt{constructor(e,n,r,i){this._firestore=e,this._userDataWriter=n,this._snapshot=i,this.metadata=new UE(i.hasPendingWrites,i.fromCache),this.query=r}get docs(){const e=[];return this.forEach(n=>e.push(n)),e}get size(){return this._snapshot.docs.size}get empty(){return this.size===0}forEach(e,n){this._snapshot.docs.forEach(r=>{e.call(n,new eM(this._firestore,this._userDataWriter,r.key,r,new UE(this._snapshot.mutatedKeys.has(r.key),this._snapshot.fromCache),this.query.converter))})}docChanges(e={}){const n=!!e.includeMetadataChanges;if(n&&this._snapshot.excludesMetadataChanges)throw new Et(nt.INVALID_ARGUMENT,"To include metadata changes with your document changes, you must also pass { includeMetadataChanges:true } to onSnapshot().");return this._cachedChanges&&this._cachedChangesIncludeMetadataChanges===n||(this._cachedChanges=function(i,s){if(i._snapshot.oldDocs.isEmpty()){let a=0;return i._snapshot.docChanges.map(o=>{const l=new eM(i._firestore,i._userDataWriter,o.doc.key,o.doc,new UE(i._snapshot.mutatedKeys.has(o.doc.key),i._snapshot.fromCache),i.query.converter);return o.doc,{type:"added",doc:l,oldIndex:-1,newIndex:a++}})}{let a=i._snapshot.oldDocs;return i._snapshot.docChanges.filter(o=>s||o.type!==3).map(o=>{const l=new eM(i._firestore,i._userDataWriter,o.doc.key,o.doc,new UE(i._snapshot.mutatedKeys.has(o.doc.key),i._snapshot.fromCache),i.query.converter);let u=-1,c=-1;return o.type!==0&&(u=a.indexOf(o.doc.key),a=a.delete(o.doc.key)),o.type!==1&&(a=a.add(o.doc),c=a.indexOf(o.doc.key)),{type:Jxt(o.type),doc:l,oldIndex:u,newIndex:c}})}}(this,n),this._cachedChangesIncludeMetadataChanges=n),this._cachedChanges}}function Jxt(t){switch(t){case 0:return"added";case 2:case 3:return"modified";case 1:return"removed";default:return _t()}}class Yxt extends Fxt{constructor(e){super(),this.firestore=e}convertBytes(e){return new Fb(e)}convertReference(e){const n=this.convertDocumentKey(e,this.firestore._databaseId);return new ml(this.firestore,null,n)}}function mc(t){t=e0(t,pm);const e=e0(t.firestore,gw),n=GW(e),r=new Yxt(e);return Gxt(t._query),Vxt(n,t._query).then(i=>new Zxt(e,r,t,i))}function Bxt(t,e,n){t=e0(t,ml);const r=e0(t.firestore,gw),i=nA(t.converter,e,n);return rA(r,[YW(J9(r),"setDoc",t._key,i,t.converter!==null,n).toMutation(t._key,pl.none())])}function Ng(t,e){const n=e0(t.firestore,gw),r=Ixt(t),i=nA(t.converter,e);return rA(n,[YW(J9(t.firestore),"addDoc",r._key,i,t.converter!==null,{}).toMutation(r._key,pl.exists(!1))]).then(()=>r)}function rA(t,e){return function(r,i){const s=new Tp;return r.asyncQueue.enqueueAndForget(async()=>mxt(await Pxt(r),i,s)),s.promise}(GW(t),e)}/** * @license * Copyright 2020 Google LLC * @@ -9534,7 +9534,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Bxt{constructor(e,n){this._firestore=e,this._commitHandler=n,this._mutations=[],this._committed=!1,this._dataReader=J9(e)}set(e,n,r){this._verifyNotCommitted();const i=xU(e,this._firestore),s=tA(i.converter,n,r),a=JW(this._dataReader,"WriteBatch.set",i._key,s,i.converter!==null,r);return this._mutations.push(a.toMutation(i._key,ml.none())),this}update(e,n,r,...i){this._verifyNotCommitted();const s=xU(e,this._firestore);let a;return a=typeof(n=la(n))=="string"||n instanceof Z9?Kxt(this._dataReader,"WriteBatch.update",s._key,n,r,i):Cxt(this._dataReader,"WriteBatch.update",s._key,n),this._mutations.push(a.toMutation(s._key,ml.exists(!0))),this}delete(e){this._verifyNotCommitted();const n=xU(e,this._firestore);return this._mutations=this._mutations.concat(new RW(n._key,ml.none())),this}commit(){return this._verifyNotCommitted(),this._committed=!0,this._mutations.length>0?this._commitHandler(this._mutations):Promise.resolve()}_verifyNotCommitted(){if(this._committed)throw new Et(nt.FAILED_PRECONDITION,"A write batch can no longer be used after commit() has been called.")}}function xU(t,e){if((t=la(t)).firestore!==e)throw new Et(nt.INVALID_ARGUMENT,"Provided document reference is from a different Firestore instance.");return t}/** + */class Hxt{constructor(e,n){this._firestore=e,this._commitHandler=n,this._mutations=[],this._committed=!1,this._dataReader=J9(e)}set(e,n,r){this._verifyNotCommitted();const i=xU(e,this._firestore),s=nA(i.converter,n,r),a=YW(this._dataReader,"WriteBatch.set",i._key,s,i.converter!==null,r);return this._mutations.push(a.toMutation(i._key,pl.none())),this}update(e,n,r,...i){this._verifyNotCommitted();const s=xU(e,this._firestore);let a;return a=typeof(n=la(n))=="string"||n instanceof Z9?qxt(this._dataReader,"WriteBatch.update",s._key,n,r,i):Kxt(this._dataReader,"WriteBatch.update",s._key,n),this._mutations.push(a.toMutation(s._key,pl.exists(!0))),this}delete(e){this._verifyNotCommitted();const n=xU(e,this._firestore);return this._mutations=this._mutations.concat(new VW(n._key,pl.none())),this}commit(){return this._verifyNotCommitted(),this._committed=!0,this._mutations.length>0?this._commitHandler(this._mutations):Promise.resolve()}_verifyNotCommitted(){if(this._committed)throw new Et(nt.FAILED_PRECONDITION,"A write batch can no longer be used after commit() has been called.")}}function xU(t,e){if((t=la(t)).firestore!==e)throw new Et(nt.INVALID_ARGUMENT,"Provided document reference is from a different Firestore instance.");return t}/** * @license * Copyright 2020 Google LLC * @@ -9549,7 +9549,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Zee(t){return AW(t=e0(t,gw)),new Bxt(t,e=>nA(t,e))}(function(e,n=!0){(function(i){Yy=i})(Jy),Cb(new Hv("firestore",(r,{instanceIdentifier:i,options:s})=>{const a=r.getProvider("app").getImmediate(),o=new gw(new Fyt(r.getProvider("auth-internal")),new Yyt(r.getProvider("app-check-internal")),function(u,c){if(!Object.prototype.hasOwnProperty.apply(u.options,["projectId"]))throw new Et(nt.INVALID_ARGUMENT,'"projectId" not provided in firebase.initializeApp.');return new D6(u.options.projectId,c)}(a,i),a);return s=Object.assign({useFetchStreams:n},s),o._setSettings(s),o},"PUBLIC").setMultipleInstances(!0)),xp(oee,"4.7.3",e),xp(oee,"4.7.3","esm2017")})();function rA(t,e){var n={};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&e.indexOf(r)<0&&(n[r]=t[r]);if(t!=null&&typeof Object.getOwnPropertySymbols=="function")for(var i=0,r=Object.getOwnPropertySymbols(t);irA(t,e))}(function(e,n=!0){(function(i){Jy=i})(Zy),Cb(new Hv("firestore",(r,{instanceIdentifier:i,options:s})=>{const a=r.getProvider("app").getImmediate(),o=new gw(new jyt(r.getProvider("auth-internal")),new Byt(r.getProvider("app-check-internal")),function(u,c){if(!Object.prototype.hasOwnProperty.apply(u.options,["projectId"]))throw new Et(nt.INVALID_ARGUMENT,'"projectId" not provided in firebase.initializeApp.');return new q6(u.options.projectId,c)}(a,i),a);return s=Object.assign({useFetchStreams:n},s),o._setSettings(s),o},"PUBLIC").setMultipleInstances(!0)),xp(see,"4.7.3",e),xp(see,"4.7.3","esm2017")})();function iA(t,e){var n={};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&e.indexOf(r)<0&&(n[r]=t[r]);if(t!=null&&typeof Object.getOwnPropertySymbols=="function")for(var i=0,r=Object.getOwnPropertySymbols(t);i"u")return null;const t=navigator;return t.languages&&t.languages[0]||t.language||null}/** + */function e6t(){return typeof navigator<"u"&&navigator&&"onLine"in navigator&&typeof navigator.onLine=="boolean"&&($xt()||xbt()||"connection"in navigator)?navigator.onLine:!0}function t6t(){if(typeof navigator>"u")return null;const t=navigator;return t.languages&&t.languages[0]||t.language||null}/** * @license * Copyright 2020 Google LLC * @@ -9624,7 +9624,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class yw{constructor(e,n){this.shortDelay=e,this.longDelay=n,If(n>e,"Short delay should be less than long delay!"),this.isMobile=gbt()||xbt()}get(){return $xt()?this.isMobile?this.longDelay:this.shortDelay:Math.min(5e3,this.shortDelay)}}/** + */class yw{constructor(e,n){this.shortDelay=e,this.longDelay=n,If(n>e,"Short delay should be less than long delay!"),this.isMobile=bbt()||Tbt()}get(){return e6t()?this.isMobile?this.longDelay:this.shortDelay:Math.min(5e3,this.shortDelay)}}/** * @license * Copyright 2020 Google LLC * @@ -9639,7 +9639,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function sA(t,e){If(t.emulator,"Emulator should always be set here");const{url:n}=t.emulator;return e?`${n}${e.startsWith("/")?e.slice(1):e}`:n}/** + */function aA(t,e){If(t.emulator,"Emulator should always be set here");const{url:n}=t.emulator;return e?`${n}${e.startsWith("/")?e.slice(1):e}`:n}/** * @license * Copyright 2020 Google LLC * @@ -9654,7 +9654,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class cbe{static initialize(e,n,r){this.fetchImpl=e,n&&(this.headersImpl=n),r&&(this.responseImpl=r)}static fetch(){if(this.fetchImpl)return this.fetchImpl;if(typeof self<"u"&&"fetch"in self)return self.fetch;if(typeof globalThis<"u"&&globalThis.fetch)return globalThis.fetch;if(typeof fetch<"u")return fetch;nf("Could not find fetch implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}static headers(){if(this.headersImpl)return this.headersImpl;if(typeof self<"u"&&"Headers"in self)return self.Headers;if(typeof globalThis<"u"&&globalThis.Headers)return globalThis.Headers;if(typeof Headers<"u")return Headers;nf("Could not find Headers implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}static response(){if(this.responseImpl)return this.responseImpl;if(typeof self<"u"&&"Response"in self)return self.Response;if(typeof globalThis<"u"&&globalThis.Response)return globalThis.Response;if(typeof Response<"u")return Response;nf("Could not find Response implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}}/** + */class ube{static initialize(e,n,r){this.fetchImpl=e,n&&(this.headersImpl=n),r&&(this.responseImpl=r)}static fetch(){if(this.fetchImpl)return this.fetchImpl;if(typeof self<"u"&&"fetch"in self)return self.fetch;if(typeof globalThis<"u"&&globalThis.fetch)return globalThis.fetch;if(typeof fetch<"u")return fetch;nf("Could not find fetch implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}static headers(){if(this.headersImpl)return this.headersImpl;if(typeof self<"u"&&"Headers"in self)return self.Headers;if(typeof globalThis<"u"&&globalThis.Headers)return globalThis.Headers;if(typeof Headers<"u")return Headers;nf("Could not find Headers implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}static response(){if(this.responseImpl)return this.responseImpl;if(typeof self<"u"&&"Response"in self)return self.Response;if(typeof globalThis<"u"&&globalThis.Response)return globalThis.Response;if(typeof Response<"u")return Response;nf("Could not find Response implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}}/** * @license * Copyright 2020 Google LLC * @@ -9669,7 +9669,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const t6t={CREDENTIAL_MISMATCH:"custom-token-mismatch",MISSING_CUSTOM_TOKEN:"internal-error",INVALID_IDENTIFIER:"invalid-email",MISSING_CONTINUE_URI:"internal-error",INVALID_PASSWORD:"wrong-password",MISSING_PASSWORD:"missing-password",INVALID_LOGIN_CREDENTIALS:"invalid-credential",EMAIL_EXISTS:"email-already-in-use",PASSWORD_LOGIN_DISABLED:"operation-not-allowed",INVALID_IDP_RESPONSE:"invalid-credential",INVALID_PENDING_TOKEN:"invalid-credential",FEDERATED_USER_ID_ALREADY_LINKED:"credential-already-in-use",MISSING_REQ_TYPE:"internal-error",EMAIL_NOT_FOUND:"user-not-found",RESET_PASSWORD_EXCEED_LIMIT:"too-many-requests",EXPIRED_OOB_CODE:"expired-action-code",INVALID_OOB_CODE:"invalid-action-code",MISSING_OOB_CODE:"internal-error",CREDENTIAL_TOO_OLD_LOGIN_AGAIN:"requires-recent-login",INVALID_ID_TOKEN:"invalid-user-token",TOKEN_EXPIRED:"user-token-expired",USER_NOT_FOUND:"user-token-expired",TOO_MANY_ATTEMPTS_TRY_LATER:"too-many-requests",PASSWORD_DOES_NOT_MEET_REQUIREMENTS:"password-does-not-meet-requirements",INVALID_CODE:"invalid-verification-code",INVALID_SESSION_INFO:"invalid-verification-id",INVALID_TEMPORARY_PROOF:"invalid-credential",MISSING_SESSION_INFO:"missing-verification-id",SESSION_EXPIRED:"code-expired",MISSING_ANDROID_PACKAGE_NAME:"missing-android-pkg-name",UNAUTHORIZED_DOMAIN:"unauthorized-continue-uri",INVALID_OAUTH_CLIENT_ID:"invalid-oauth-client-id",ADMIN_ONLY_OPERATION:"admin-restricted-operation",INVALID_MFA_PENDING_CREDENTIAL:"invalid-multi-factor-session",MFA_ENROLLMENT_NOT_FOUND:"multi-factor-info-not-found",MISSING_MFA_ENROLLMENT_ID:"missing-multi-factor-info",MISSING_MFA_PENDING_CREDENTIAL:"missing-multi-factor-session",SECOND_FACTOR_EXISTS:"second-factor-already-in-use",SECOND_FACTOR_LIMIT_EXCEEDED:"maximum-second-factor-count-exceeded",BLOCKING_FUNCTION_ERROR_RESPONSE:"internal-error",RECAPTCHA_NOT_ENABLED:"recaptcha-not-enabled",MISSING_RECAPTCHA_TOKEN:"missing-recaptcha-token",INVALID_RECAPTCHA_TOKEN:"invalid-recaptcha-token",INVALID_RECAPTCHA_ACTION:"invalid-recaptcha-action",MISSING_CLIENT_TYPE:"missing-client-type",MISSING_RECAPTCHA_VERSION:"missing-recaptcha-version",INVALID_RECAPTCHA_VERSION:"invalid-recaptcha-version",INVALID_REQ_TYPE:"invalid-req-type"};/** + */const n6t={CREDENTIAL_MISMATCH:"custom-token-mismatch",MISSING_CUSTOM_TOKEN:"internal-error",INVALID_IDENTIFIER:"invalid-email",MISSING_CONTINUE_URI:"internal-error",INVALID_PASSWORD:"wrong-password",MISSING_PASSWORD:"missing-password",INVALID_LOGIN_CREDENTIALS:"invalid-credential",EMAIL_EXISTS:"email-already-in-use",PASSWORD_LOGIN_DISABLED:"operation-not-allowed",INVALID_IDP_RESPONSE:"invalid-credential",INVALID_PENDING_TOKEN:"invalid-credential",FEDERATED_USER_ID_ALREADY_LINKED:"credential-already-in-use",MISSING_REQ_TYPE:"internal-error",EMAIL_NOT_FOUND:"user-not-found",RESET_PASSWORD_EXCEED_LIMIT:"too-many-requests",EXPIRED_OOB_CODE:"expired-action-code",INVALID_OOB_CODE:"invalid-action-code",MISSING_OOB_CODE:"internal-error",CREDENTIAL_TOO_OLD_LOGIN_AGAIN:"requires-recent-login",INVALID_ID_TOKEN:"invalid-user-token",TOKEN_EXPIRED:"user-token-expired",USER_NOT_FOUND:"user-token-expired",TOO_MANY_ATTEMPTS_TRY_LATER:"too-many-requests",PASSWORD_DOES_NOT_MEET_REQUIREMENTS:"password-does-not-meet-requirements",INVALID_CODE:"invalid-verification-code",INVALID_SESSION_INFO:"invalid-verification-id",INVALID_TEMPORARY_PROOF:"invalid-credential",MISSING_SESSION_INFO:"missing-verification-id",SESSION_EXPIRED:"code-expired",MISSING_ANDROID_PACKAGE_NAME:"missing-android-pkg-name",UNAUTHORIZED_DOMAIN:"unauthorized-continue-uri",INVALID_OAUTH_CLIENT_ID:"invalid-oauth-client-id",ADMIN_ONLY_OPERATION:"admin-restricted-operation",INVALID_MFA_PENDING_CREDENTIAL:"invalid-multi-factor-session",MFA_ENROLLMENT_NOT_FOUND:"multi-factor-info-not-found",MISSING_MFA_ENROLLMENT_ID:"missing-multi-factor-info",MISSING_MFA_PENDING_CREDENTIAL:"missing-multi-factor-session",SECOND_FACTOR_EXISTS:"second-factor-already-in-use",SECOND_FACTOR_LIMIT_EXCEEDED:"maximum-second-factor-count-exceeded",BLOCKING_FUNCTION_ERROR_RESPONSE:"internal-error",RECAPTCHA_NOT_ENABLED:"recaptcha-not-enabled",MISSING_RECAPTCHA_TOKEN:"missing-recaptcha-token",INVALID_RECAPTCHA_TOKEN:"invalid-recaptcha-token",INVALID_RECAPTCHA_ACTION:"invalid-recaptcha-action",MISSING_CLIENT_TYPE:"missing-client-type",MISSING_RECAPTCHA_VERSION:"missing-recaptcha-version",INVALID_RECAPTCHA_VERSION:"invalid-recaptcha-version",INVALID_REQ_TYPE:"invalid-req-type"};/** * @license * Copyright 2020 Google LLC * @@ -9684,7 +9684,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const n6t=new yw(3e4,6e4);function mm(t,e){return t.tenantId&&!e.tenantId?Object.assign(Object.assign({},e),{tenantId:t.tenantId}):e}async function vm(t,e,n,r,i={}){return dbe(t,i,async()=>{let s={},a={};r&&(e==="GET"?a=r:s={body:JSON.stringify(r)});const o=cw(Object.assign({key:t.config.apiKey},a)).slice(1),l=await t._getAdditionalHeaders();l["Content-Type"]="application/json",t.languageCode&&(l["X-Firebase-Locale"]=t.languageCode);const u=Object.assign({method:e,headers:l},s);return ybt()||(u.referrerPolicy="no-referrer"),cbe.fetch()(fbe(t,t.config.apiHost,n,o),u)})}async function dbe(t,e,n){t._canInitEmulator=!1;const r=Object.assign(Object.assign({},t6t),e);try{const i=new i6t(t),s=await Promise.race([n(),i.promise]);i.clearNetworkTimeout();const a=await s.json();if("needConfirmation"in a)throw NE(t,"account-exists-with-different-credential",a);if(s.ok&&!("errorMessage"in a))return a;{const o=s.ok?a.errorMessage:a.error.message,[l,u]=o.split(" : ");if(l==="FEDERATED_USER_ID_ALREADY_LINKED")throw NE(t,"credential-already-in-use",a);if(l==="EMAIL_EXISTS")throw NE(t,"email-already-in-use",a);if(l==="USER_DISABLED")throw NE(t,"user-disabled",a);const c=r[l]||l.toLowerCase().replace(/[_\s]+/g,"-");if(u)throw ube(t,c,u);Fu(t,c)}}catch(i){if(i instanceof Zf)throw i;Fu(t,"network-request-failed",{message:String(i)})}}async function Sw(t,e,n,r,i={}){const s=await vm(t,e,n,r,i);return"mfaPendingCredential"in s&&Fu(t,"multi-factor-auth-required",{_serverResponse:s}),s}function fbe(t,e,n,r){const i=`${e}${n}?${r}`;return t.config.emulator?sA(t.config,i):`${t.config.apiScheme}://${i}`}function r6t(t){switch(t){case"ENFORCE":return"ENFORCE";case"AUDIT":return"AUDIT";case"OFF":return"OFF";default:return"ENFORCEMENT_STATE_UNSPECIFIED"}}class i6t{constructor(e){this.auth=e,this.timer=null,this.promise=new Promise((n,r)=>{this.timer=setTimeout(()=>r(Jc(this.auth,"network-request-failed")),n6t.get())})}clearNetworkTimeout(){clearTimeout(this.timer)}}function NE(t,e,n){const r={appName:t.name};n.email&&(r.email=n.email),n.phoneNumber&&(r.phoneNumber=n.phoneNumber);const i=Jc(t,e,r);return i.customData._tokenResponse=n,i}function Yee(t){return t!==void 0&&t.enterprise!==void 0}class s6t{constructor(e){if(this.siteKey="",this.recaptchaEnforcementState=[],e.recaptchaKey===void 0)throw new Error("recaptchaKey undefined");this.siteKey=e.recaptchaKey.split("/")[3],this.recaptchaEnforcementState=e.recaptchaEnforcementState}getProviderEnforcementState(e){if(!this.recaptchaEnforcementState||this.recaptchaEnforcementState.length===0)return null;for(const n of this.recaptchaEnforcementState)if(n.provider&&n.provider===e)return r6t(n.enforcementState);return null}isProviderEnabled(e){return this.getProviderEnforcementState(e)==="ENFORCE"||this.getProviderEnforcementState(e)==="AUDIT"}}async function a6t(t,e){return vm(t,"GET","/v2/recaptchaConfig",mm(t,e))}/** + */const r6t=new yw(3e4,6e4);function mm(t,e){return t.tenantId&&!e.tenantId?Object.assign(Object.assign({},e),{tenantId:t.tenantId}):e}async function vm(t,e,n,r,i={}){return cbe(t,i,async()=>{let s={},a={};r&&(e==="GET"?a=r:s={body:JSON.stringify(r)});const o=cw(Object.assign({key:t.config.apiKey},a)).slice(1),l=await t._getAdditionalHeaders();l["Content-Type"]="application/json",t.languageCode&&(l["X-Firebase-Locale"]=t.languageCode);const u=Object.assign({method:e,headers:l},s);return Sbt()||(u.referrerPolicy="no-referrer"),ube.fetch()(dbe(t,t.config.apiHost,n,o),u)})}async function cbe(t,e,n){t._canInitEmulator=!1;const r=Object.assign(Object.assign({},n6t),e);try{const i=new s6t(t),s=await Promise.race([n(),i.promise]);i.clearNetworkTimeout();const a=await s.json();if("needConfirmation"in a)throw NE(t,"account-exists-with-different-credential",a);if(s.ok&&!("errorMessage"in a))return a;{const o=s.ok?a.errorMessage:a.error.message,[l,u]=o.split(" : ");if(l==="FEDERATED_USER_ID_ALREADY_LINKED")throw NE(t,"credential-already-in-use",a);if(l==="EMAIL_EXISTS")throw NE(t,"email-already-in-use",a);if(l==="USER_DISABLED")throw NE(t,"user-disabled",a);const c=r[l]||l.toLowerCase().replace(/[_\s]+/g,"-");if(u)throw lbe(t,c,u);Fu(t,c)}}catch(i){if(i instanceof Zf)throw i;Fu(t,"network-request-failed",{message:String(i)})}}async function Sw(t,e,n,r,i={}){const s=await vm(t,e,n,r,i);return"mfaPendingCredential"in s&&Fu(t,"multi-factor-auth-required",{_serverResponse:s}),s}function dbe(t,e,n,r){const i=`${e}${n}?${r}`;return t.config.emulator?aA(t.config,i):`${t.config.apiScheme}://${i}`}function i6t(t){switch(t){case"ENFORCE":return"ENFORCE";case"AUDIT":return"AUDIT";case"OFF":return"OFF";default:return"ENFORCEMENT_STATE_UNSPECIFIED"}}class s6t{constructor(e){this.auth=e,this.timer=null,this.promise=new Promise((n,r)=>{this.timer=setTimeout(()=>r(Jc(this.auth,"network-request-failed")),r6t.get())})}clearNetworkTimeout(){clearTimeout(this.timer)}}function NE(t,e,n){const r={appName:t.name};n.email&&(r.email=n.email),n.phoneNumber&&(r.phoneNumber=n.phoneNumber);const i=Jc(t,e,r);return i.customData._tokenResponse=n,i}function Zee(t){return t!==void 0&&t.enterprise!==void 0}class a6t{constructor(e){if(this.siteKey="",this.recaptchaEnforcementState=[],e.recaptchaKey===void 0)throw new Error("recaptchaKey undefined");this.siteKey=e.recaptchaKey.split("/")[3],this.recaptchaEnforcementState=e.recaptchaEnforcementState}getProviderEnforcementState(e){if(!this.recaptchaEnforcementState||this.recaptchaEnforcementState.length===0)return null;for(const n of this.recaptchaEnforcementState)if(n.provider&&n.provider===e)return i6t(n.enforcementState);return null}isProviderEnabled(e){return this.getProviderEnforcementState(e)==="ENFORCE"||this.getProviderEnforcementState(e)==="AUDIT"}}async function o6t(t,e){return vm(t,"GET","/v2/recaptchaConfig",mm(t,e))}/** * @license * Copyright 2020 Google LLC * @@ -9699,7 +9699,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function o6t(t,e){return vm(t,"POST","/v1/accounts:delete",e)}async function hbe(t,e){return vm(t,"POST","/v1/accounts:lookup",e)}/** + */async function l6t(t,e){return vm(t,"POST","/v1/accounts:delete",e)}async function fbe(t,e){return vm(t,"POST","/v1/accounts:lookup",e)}/** * @license * Copyright 2020 Google LLC * @@ -9714,7 +9714,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Ex(t){if(t)try{const e=new Date(Number(t));if(!isNaN(e.getTime()))return e.toUTCString()}catch{}}async function l6t(t,e=!1){const n=la(t),r=await n.getIdToken(e),i=aA(r);Ht(i&&i.exp&&i.auth_time&&i.iat,n.auth,"internal-error");const s=typeof i.firebase=="object"?i.firebase:void 0,a=s==null?void 0:s.sign_in_provider;return{claims:i,token:r,authTime:Ex(TU(i.auth_time)),issuedAtTime:Ex(TU(i.iat)),expirationTime:Ex(TU(i.exp)),signInProvider:a||null,signInSecondFactor:(s==null?void 0:s.sign_in_second_factor)||null}}function TU(t){return Number(t)*1e3}function aA(t){const[e,n,r]=t.split(".");if(e===void 0||n===void 0||r===void 0)return tM("JWT malformed, contained fewer than 3 sections"),null;try{const i=Xge(n);return i?JSON.parse(i):(tM("Failed to decode base64 JWT payload"),null)}catch(i){return tM("Caught error parsing JWT payload as JSON",i==null?void 0:i.toString()),null}}function Bee(t){const e=aA(t);return Ht(e,"internal-error"),Ht(typeof e.exp<"u","internal-error"),Ht(typeof e.iat<"u","internal-error"),Number(e.exp)-Number(e.iat)}/** + */function wx(t){if(t)try{const e=new Date(Number(t));if(!isNaN(e.getTime()))return e.toUTCString()}catch{}}async function u6t(t,e=!1){const n=la(t),r=await n.getIdToken(e),i=oA(r);Ht(i&&i.exp&&i.auth_time&&i.iat,n.auth,"internal-error");const s=typeof i.firebase=="object"?i.firebase:void 0,a=s==null?void 0:s.sign_in_provider;return{claims:i,token:r,authTime:wx(TU(i.auth_time)),issuedAtTime:wx(TU(i.iat)),expirationTime:wx(TU(i.exp)),signInProvider:a||null,signInSecondFactor:(s==null?void 0:s.sign_in_second_factor)||null}}function TU(t){return Number(t)*1e3}function oA(t){const[e,n,r]=t.split(".");if(e===void 0||n===void 0||r===void 0)return tM("JWT malformed, contained fewer than 3 sections"),null;try{const i=Lge(n);return i?JSON.parse(i):(tM("Failed to decode base64 JWT payload"),null)}catch(i){return tM("Caught error parsing JWT payload as JSON",i==null?void 0:i.toString()),null}}function Jee(t){const e=oA(t);return Ht(e,"internal-error"),Ht(typeof e.exp<"u","internal-error"),Ht(typeof e.iat<"u","internal-error"),Number(e.exp)-Number(e.iat)}/** * @license * Copyright 2020 Google LLC * @@ -9729,7 +9729,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function j6(t,e,n=!1){if(n)return e;try{return await e}catch(r){throw r instanceof Zf&&u6t(r)&&t.auth.currentUser===t&&await t.auth.signOut(),r}}function u6t({code:t}){return t==="auth/user-disabled"||t==="auth/user-token-expired"}/** + */async function F6(t,e,n=!1){if(n)return e;try{return await e}catch(r){throw r instanceof Zf&&c6t(r)&&t.auth.currentUser===t&&await t.auth.signOut(),r}}function c6t({code:t}){return t==="auth/user-disabled"||t==="auth/user-token-expired"}/** * @license * Copyright 2020 Google LLC * @@ -9744,7 +9744,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class c6t{constructor(e){this.user=e,this.isRunning=!1,this.timerId=null,this.errorBackoff=3e4}_start(){this.isRunning||(this.isRunning=!0,this.schedule())}_stop(){this.isRunning&&(this.isRunning=!1,this.timerId!==null&&clearTimeout(this.timerId))}getInterval(e){var n;if(e){const r=this.errorBackoff;return this.errorBackoff=Math.min(this.errorBackoff*2,96e4),r}else{this.errorBackoff=3e4;const i=((n=this.user.stsTokenManager.expirationTime)!==null&&n!==void 0?n:0)-Date.now()-3e5;return Math.max(0,i)}}schedule(e=!1){if(!this.isRunning)return;const n=this.getInterval(e);this.timerId=setTimeout(async()=>{await this.iteration()},n)}async iteration(){try{await this.user.getIdToken(!0)}catch(e){(e==null?void 0:e.code)==="auth/network-request-failed"&&this.schedule(!0);return}this.schedule()}}/** + */class d6t{constructor(e){this.user=e,this.isRunning=!1,this.timerId=null,this.errorBackoff=3e4}_start(){this.isRunning||(this.isRunning=!0,this.schedule())}_stop(){this.isRunning&&(this.isRunning=!1,this.timerId!==null&&clearTimeout(this.timerId))}getInterval(e){var n;if(e){const r=this.errorBackoff;return this.errorBackoff=Math.min(this.errorBackoff*2,96e4),r}else{this.errorBackoff=3e4;const i=((n=this.user.stsTokenManager.expirationTime)!==null&&n!==void 0?n:0)-Date.now()-3e5;return Math.max(0,i)}}schedule(e=!1){if(!this.isRunning)return;const n=this.getInterval(e);this.timerId=setTimeout(async()=>{await this.iteration()},n)}async iteration(){try{await this.user.getIdToken(!0)}catch(e){(e==null?void 0:e.code)==="auth/network-request-failed"&&this.schedule(!0);return}this.schedule()}}/** * @license * Copyright 2020 Google LLC * @@ -9759,7 +9759,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class j4{constructor(e,n){this.createdAt=e,this.lastLoginAt=n,this._initializeTime()}_initializeTime(){this.lastSignInTime=Ex(this.lastLoginAt),this.creationTime=Ex(this.createdAt)}_copy(e){this.createdAt=e.createdAt,this.lastLoginAt=e.lastLoginAt,this._initializeTime()}toJSON(){return{createdAt:this.createdAt,lastLoginAt:this.lastLoginAt}}}/** + */class j4{constructor(e,n){this.createdAt=e,this.lastLoginAt=n,this._initializeTime()}_initializeTime(){this.lastSignInTime=wx(this.lastLoginAt),this.creationTime=wx(this.createdAt)}_copy(e){this.createdAt=e.createdAt,this.lastLoginAt=e.lastLoginAt,this._initializeTime()}toJSON(){return{createdAt:this.createdAt,lastLoginAt:this.lastLoginAt}}}/** * @license * Copyright 2019 Google LLC * @@ -9774,7 +9774,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function aR(t){var e;const n=t.auth,r=await t.getIdToken(),i=await j6(t,hbe(n,{idToken:r}));Ht(i==null?void 0:i.users.length,n,"internal-error");const s=i.users[0];t._notifyReloadListener(s);const a=!((e=s.providerUserInfo)===null||e===void 0)&&e.length?pbe(s.providerUserInfo):[],o=f6t(t.providerData,a),l=t.isAnonymous,u=!(t.email&&s.passwordHash)&&!(o!=null&&o.length),c=l?u:!1,d={uid:s.localId,displayName:s.displayName||null,photoURL:s.photoUrl||null,email:s.email||null,emailVerified:s.emailVerified||!1,phoneNumber:s.phoneNumber||null,tenantId:s.tenantId||null,providerData:o,metadata:new j4(s.createdAt,s.lastLoginAt),isAnonymous:c};Object.assign(t,d)}async function d6t(t){const e=la(t);await aR(e),await e.auth._persistUserIfCurrent(e),e.auth._notifyListenersIfCurrent(e)}function f6t(t,e){return[...t.filter(r=>!e.some(i=>i.providerId===r.providerId)),...e]}function pbe(t){return t.map(e=>{var{providerId:n}=e,r=rA(e,["providerId"]);return{providerId:n,uid:r.rawId||"",displayName:r.displayName||null,email:r.email||null,phoneNumber:r.phoneNumber||null,photoURL:r.photoUrl||null}})}/** + */async function sR(t){var e;const n=t.auth,r=await t.getIdToken(),i=await F6(t,fbe(n,{idToken:r}));Ht(i==null?void 0:i.users.length,n,"internal-error");const s=i.users[0];t._notifyReloadListener(s);const a=!((e=s.providerUserInfo)===null||e===void 0)&&e.length?hbe(s.providerUserInfo):[],o=h6t(t.providerData,a),l=t.isAnonymous,u=!(t.email&&s.passwordHash)&&!(o!=null&&o.length),c=l?u:!1,d={uid:s.localId,displayName:s.displayName||null,photoURL:s.photoUrl||null,email:s.email||null,emailVerified:s.emailVerified||!1,phoneNumber:s.phoneNumber||null,tenantId:s.tenantId||null,providerData:o,metadata:new j4(s.createdAt,s.lastLoginAt),isAnonymous:c};Object.assign(t,d)}async function f6t(t){const e=la(t);await sR(e),await e.auth._persistUserIfCurrent(e),e.auth._notifyListenersIfCurrent(e)}function h6t(t,e){return[...t.filter(r=>!e.some(i=>i.providerId===r.providerId)),...e]}function hbe(t){return t.map(e=>{var{providerId:n}=e,r=iA(e,["providerId"]);return{providerId:n,uid:r.rawId||"",displayName:r.displayName||null,email:r.email||null,phoneNumber:r.phoneNumber||null,photoURL:r.photoUrl||null}})}/** * @license * Copyright 2020 Google LLC * @@ -9789,7 +9789,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function h6t(t,e){const n=await dbe(t,{},async()=>{const r=cw({grant_type:"refresh_token",refresh_token:e}).slice(1),{tokenApiHost:i,apiKey:s}=t.config,a=fbe(t,i,"/v1/token",`key=${s}`),o=await t._getAdditionalHeaders();return o["Content-Type"]="application/x-www-form-urlencoded",cbe.fetch()(a,{method:"POST",headers:o,body:r})});return{accessToken:n.access_token,expiresIn:n.expires_in,refreshToken:n.refresh_token}}async function p6t(t,e){return vm(t,"POST","/v2/accounts:revokeToken",mm(t,e))}/** + */async function p6t(t,e){const n=await cbe(t,{},async()=>{const r=cw({grant_type:"refresh_token",refresh_token:e}).slice(1),{tokenApiHost:i,apiKey:s}=t.config,a=dbe(t,i,"/v1/token",`key=${s}`),o=await t._getAdditionalHeaders();return o["Content-Type"]="application/x-www-form-urlencoded",ube.fetch()(a,{method:"POST",headers:o,body:r})});return{accessToken:n.access_token,expiresIn:n.expires_in,refreshToken:n.refresh_token}}async function m6t(t,e){return vm(t,"POST","/v2/accounts:revokeToken",mm(t,e))}/** * @license * Copyright 2020 Google LLC * @@ -9804,7 +9804,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class F1{constructor(){this.refreshToken=null,this.accessToken=null,this.expirationTime=null}get isExpired(){return!this.expirationTime||Date.now()>this.expirationTime-3e4}updateFromServerResponse(e){Ht(e.idToken,"internal-error"),Ht(typeof e.idToken<"u","internal-error"),Ht(typeof e.refreshToken<"u","internal-error");const n="expiresIn"in e&&typeof e.expiresIn<"u"?Number(e.expiresIn):Bee(e.idToken);this.updateTokensAndExpiration(e.idToken,e.refreshToken,n)}updateFromIdToken(e){Ht(e.length!==0,"internal-error");const n=Bee(e);this.updateTokensAndExpiration(e,null,n)}async getToken(e,n=!1){return!n&&this.accessToken&&!this.isExpired?this.accessToken:(Ht(this.refreshToken,e,"user-token-expired"),this.refreshToken?(await this.refresh(e,this.refreshToken),this.accessToken):null)}clearRefreshToken(){this.refreshToken=null}async refresh(e,n){const{accessToken:r,refreshToken:i,expiresIn:s}=await h6t(e,n);this.updateTokensAndExpiration(r,i,Number(s))}updateTokensAndExpiration(e,n,r){this.refreshToken=n||null,this.accessToken=e||null,this.expirationTime=Date.now()+r*1e3}static fromJSON(e,n){const{refreshToken:r,accessToken:i,expirationTime:s}=n,a=new F1;return r&&(Ht(typeof r=="string","internal-error",{appName:e}),a.refreshToken=r),i&&(Ht(typeof i=="string","internal-error",{appName:e}),a.accessToken=i),s&&(Ht(typeof s=="number","internal-error",{appName:e}),a.expirationTime=s),a}toJSON(){return{refreshToken:this.refreshToken,accessToken:this.accessToken,expirationTime:this.expirationTime}}_assign(e){this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.expirationTime=e.expirationTime}_clone(){return Object.assign(new F1,this.toJSON())}_performRefresh(){return nf("not implemented")}}/** + */class F1{constructor(){this.refreshToken=null,this.accessToken=null,this.expirationTime=null}get isExpired(){return!this.expirationTime||Date.now()>this.expirationTime-3e4}updateFromServerResponse(e){Ht(e.idToken,"internal-error"),Ht(typeof e.idToken<"u","internal-error"),Ht(typeof e.refreshToken<"u","internal-error");const n="expiresIn"in e&&typeof e.expiresIn<"u"?Number(e.expiresIn):Jee(e.idToken);this.updateTokensAndExpiration(e.idToken,e.refreshToken,n)}updateFromIdToken(e){Ht(e.length!==0,"internal-error");const n=Jee(e);this.updateTokensAndExpiration(e,null,n)}async getToken(e,n=!1){return!n&&this.accessToken&&!this.isExpired?this.accessToken:(Ht(this.refreshToken,e,"user-token-expired"),this.refreshToken?(await this.refresh(e,this.refreshToken),this.accessToken):null)}clearRefreshToken(){this.refreshToken=null}async refresh(e,n){const{accessToken:r,refreshToken:i,expiresIn:s}=await p6t(e,n);this.updateTokensAndExpiration(r,i,Number(s))}updateTokensAndExpiration(e,n,r){this.refreshToken=n||null,this.accessToken=e||null,this.expirationTime=Date.now()+r*1e3}static fromJSON(e,n){const{refreshToken:r,accessToken:i,expirationTime:s}=n,a=new F1;return r&&(Ht(typeof r=="string","internal-error",{appName:e}),a.refreshToken=r),i&&(Ht(typeof i=="string","internal-error",{appName:e}),a.accessToken=i),s&&(Ht(typeof s=="number","internal-error",{appName:e}),a.expirationTime=s),a}toJSON(){return{refreshToken:this.refreshToken,accessToken:this.accessToken,expirationTime:this.expirationTime}}_assign(e){this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.expirationTime=e.expirationTime}_clone(){return Object.assign(new F1,this.toJSON())}_performRefresh(){return nf("not implemented")}}/** * @license * Copyright 2020 Google LLC * @@ -9819,7 +9819,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function bh(t,e){Ht(typeof t=="string"||typeof t>"u","internal-error",{appName:e})}class rf{constructor(e){var{uid:n,auth:r,stsTokenManager:i}=e,s=rA(e,["uid","auth","stsTokenManager"]);this.providerId="firebase",this.proactiveRefresh=new c6t(this),this.reloadUserInfo=null,this.reloadListener=null,this.uid=n,this.auth=r,this.stsTokenManager=i,this.accessToken=i.accessToken,this.displayName=s.displayName||null,this.email=s.email||null,this.emailVerified=s.emailVerified||!1,this.phoneNumber=s.phoneNumber||null,this.photoURL=s.photoURL||null,this.isAnonymous=s.isAnonymous||!1,this.tenantId=s.tenantId||null,this.providerData=s.providerData?[...s.providerData]:[],this.metadata=new j4(s.createdAt||void 0,s.lastLoginAt||void 0)}async getIdToken(e){const n=await j6(this,this.stsTokenManager.getToken(this.auth,e));return Ht(n,this.auth,"internal-error"),this.accessToken!==n&&(this.accessToken=n,await this.auth._persistUserIfCurrent(this),this.auth._notifyListenersIfCurrent(this)),n}getIdTokenResult(e){return l6t(this,e)}reload(){return d6t(this)}_assign(e){this!==e&&(Ht(this.uid===e.uid,this.auth,"internal-error"),this.displayName=e.displayName,this.photoURL=e.photoURL,this.email=e.email,this.emailVerified=e.emailVerified,this.phoneNumber=e.phoneNumber,this.isAnonymous=e.isAnonymous,this.tenantId=e.tenantId,this.providerData=e.providerData.map(n=>Object.assign({},n)),this.metadata._copy(e.metadata),this.stsTokenManager._assign(e.stsTokenManager))}_clone(e){const n=new rf(Object.assign(Object.assign({},this),{auth:e,stsTokenManager:this.stsTokenManager._clone()}));return n.metadata._copy(this.metadata),n}_onReload(e){Ht(!this.reloadListener,this.auth,"internal-error"),this.reloadListener=e,this.reloadUserInfo&&(this._notifyReloadListener(this.reloadUserInfo),this.reloadUserInfo=null)}_notifyReloadListener(e){this.reloadListener?this.reloadListener(e):this.reloadUserInfo=e}_startProactiveRefresh(){this.proactiveRefresh._start()}_stopProactiveRefresh(){this.proactiveRefresh._stop()}async _updateTokensIfNecessary(e,n=!1){let r=!1;e.idToken&&e.idToken!==this.stsTokenManager.accessToken&&(this.stsTokenManager.updateFromServerResponse(e),r=!0),n&&await aR(this),await this.auth._persistUserIfCurrent(this),r&&this.auth._notifyListenersIfCurrent(this)}async delete(){if(qc(this.auth.app))return Promise.reject(cf(this.auth));const e=await this.getIdToken();return await j6(this,o6t(this.auth,{idToken:e})),this.stsTokenManager.clearRefreshToken(),this.auth.signOut()}toJSON(){return Object.assign(Object.assign({uid:this.uid,email:this.email||void 0,emailVerified:this.emailVerified,displayName:this.displayName||void 0,isAnonymous:this.isAnonymous,photoURL:this.photoURL||void 0,phoneNumber:this.phoneNumber||void 0,tenantId:this.tenantId||void 0,providerData:this.providerData.map(e=>Object.assign({},e)),stsTokenManager:this.stsTokenManager.toJSON(),_redirectEventId:this._redirectEventId},this.metadata.toJSON()),{apiKey:this.auth.config.apiKey,appName:this.auth.name})}get refreshToken(){return this.stsTokenManager.refreshToken||""}static _fromJSON(e,n){var r,i,s,a,o,l,u,c;const d=(r=n.displayName)!==null&&r!==void 0?r:void 0,f=(i=n.email)!==null&&i!==void 0?i:void 0,h=(s=n.phoneNumber)!==null&&s!==void 0?s:void 0,p=(a=n.photoURL)!==null&&a!==void 0?a:void 0,m=(o=n.tenantId)!==null&&o!==void 0?o:void 0,v=(l=n._redirectEventId)!==null&&l!==void 0?l:void 0,g=(u=n.createdAt)!==null&&u!==void 0?u:void 0,b=(c=n.lastLoginAt)!==null&&c!==void 0?c:void 0,{uid:y,emailVerified:x,isAnonymous:T,providerData:M,stsTokenManager:E}=n;Ht(y&&E,e,"internal-error");const S=F1.fromJSON(this.name,E);Ht(typeof y=="string",e,"internal-error"),bh(d,e.name),bh(f,e.name),Ht(typeof x=="boolean",e,"internal-error"),Ht(typeof T=="boolean",e,"internal-error"),bh(h,e.name),bh(p,e.name),bh(m,e.name),bh(v,e.name),bh(g,e.name),bh(b,e.name);const P=new rf({uid:y,auth:e,email:f,emailVerified:x,displayName:d,isAnonymous:T,photoURL:p,phoneNumber:h,tenantId:m,stsTokenManager:S,createdAt:g,lastLoginAt:b});return M&&Array.isArray(M)&&(P.providerData=M.map(R=>Object.assign({},R))),v&&(P._redirectEventId=v),P}static async _fromIdTokenResponse(e,n,r=!1){const i=new F1;i.updateFromServerResponse(n);const s=new rf({uid:n.localId,auth:e,stsTokenManager:i,isAnonymous:r});return await aR(s),s}static async _fromGetAccountInfoResponse(e,n,r){const i=n.users[0];Ht(i.localId!==void 0,"internal-error");const s=i.providerUserInfo!==void 0?pbe(i.providerUserInfo):[],a=!(i.email&&i.passwordHash)&&!(s!=null&&s.length),o=new F1;o.updateFromIdToken(r);const l=new rf({uid:i.localId,auth:e,stsTokenManager:o,isAnonymous:a}),u={uid:i.localId,displayName:i.displayName||null,photoURL:i.photoUrl||null,email:i.email||null,emailVerified:i.emailVerified||!1,phoneNumber:i.phoneNumber||null,tenantId:i.tenantId||null,providerData:s,metadata:new j4(i.createdAt,i.lastLoginAt),isAnonymous:!(i.email&&i.passwordHash)&&!(s!=null&&s.length)};return Object.assign(l,u),l}}/** + */function bh(t,e){Ht(typeof t=="string"||typeof t>"u","internal-error",{appName:e})}class rf{constructor(e){var{uid:n,auth:r,stsTokenManager:i}=e,s=iA(e,["uid","auth","stsTokenManager"]);this.providerId="firebase",this.proactiveRefresh=new d6t(this),this.reloadUserInfo=null,this.reloadListener=null,this.uid=n,this.auth=r,this.stsTokenManager=i,this.accessToken=i.accessToken,this.displayName=s.displayName||null,this.email=s.email||null,this.emailVerified=s.emailVerified||!1,this.phoneNumber=s.phoneNumber||null,this.photoURL=s.photoURL||null,this.isAnonymous=s.isAnonymous||!1,this.tenantId=s.tenantId||null,this.providerData=s.providerData?[...s.providerData]:[],this.metadata=new j4(s.createdAt||void 0,s.lastLoginAt||void 0)}async getIdToken(e){const n=await F6(this,this.stsTokenManager.getToken(this.auth,e));return Ht(n,this.auth,"internal-error"),this.accessToken!==n&&(this.accessToken=n,await this.auth._persistUserIfCurrent(this),this.auth._notifyListenersIfCurrent(this)),n}getIdTokenResult(e){return u6t(this,e)}reload(){return f6t(this)}_assign(e){this!==e&&(Ht(this.uid===e.uid,this.auth,"internal-error"),this.displayName=e.displayName,this.photoURL=e.photoURL,this.email=e.email,this.emailVerified=e.emailVerified,this.phoneNumber=e.phoneNumber,this.isAnonymous=e.isAnonymous,this.tenantId=e.tenantId,this.providerData=e.providerData.map(n=>Object.assign({},n)),this.metadata._copy(e.metadata),this.stsTokenManager._assign(e.stsTokenManager))}_clone(e){const n=new rf(Object.assign(Object.assign({},this),{auth:e,stsTokenManager:this.stsTokenManager._clone()}));return n.metadata._copy(this.metadata),n}_onReload(e){Ht(!this.reloadListener,this.auth,"internal-error"),this.reloadListener=e,this.reloadUserInfo&&(this._notifyReloadListener(this.reloadUserInfo),this.reloadUserInfo=null)}_notifyReloadListener(e){this.reloadListener?this.reloadListener(e):this.reloadUserInfo=e}_startProactiveRefresh(){this.proactiveRefresh._start()}_stopProactiveRefresh(){this.proactiveRefresh._stop()}async _updateTokensIfNecessary(e,n=!1){let r=!1;e.idToken&&e.idToken!==this.stsTokenManager.accessToken&&(this.stsTokenManager.updateFromServerResponse(e),r=!0),n&&await sR(this),await this.auth._persistUserIfCurrent(this),r&&this.auth._notifyListenersIfCurrent(this)}async delete(){if(qc(this.auth.app))return Promise.reject(cf(this.auth));const e=await this.getIdToken();return await F6(this,l6t(this.auth,{idToken:e})),this.stsTokenManager.clearRefreshToken(),this.auth.signOut()}toJSON(){return Object.assign(Object.assign({uid:this.uid,email:this.email||void 0,emailVerified:this.emailVerified,displayName:this.displayName||void 0,isAnonymous:this.isAnonymous,photoURL:this.photoURL||void 0,phoneNumber:this.phoneNumber||void 0,tenantId:this.tenantId||void 0,providerData:this.providerData.map(e=>Object.assign({},e)),stsTokenManager:this.stsTokenManager.toJSON(),_redirectEventId:this._redirectEventId},this.metadata.toJSON()),{apiKey:this.auth.config.apiKey,appName:this.auth.name})}get refreshToken(){return this.stsTokenManager.refreshToken||""}static _fromJSON(e,n){var r,i,s,a,o,l,u,c;const d=(r=n.displayName)!==null&&r!==void 0?r:void 0,f=(i=n.email)!==null&&i!==void 0?i:void 0,h=(s=n.phoneNumber)!==null&&s!==void 0?s:void 0,p=(a=n.photoURL)!==null&&a!==void 0?a:void 0,m=(o=n.tenantId)!==null&&o!==void 0?o:void 0,v=(l=n._redirectEventId)!==null&&l!==void 0?l:void 0,g=(u=n.createdAt)!==null&&u!==void 0?u:void 0,b=(c=n.lastLoginAt)!==null&&c!==void 0?c:void 0,{uid:y,emailVerified:x,isAnonymous:T,providerData:M,stsTokenManager:E}=n;Ht(y&&E,e,"internal-error");const S=F1.fromJSON(this.name,E);Ht(typeof y=="string",e,"internal-error"),bh(d,e.name),bh(f,e.name),Ht(typeof x=="boolean",e,"internal-error"),Ht(typeof T=="boolean",e,"internal-error"),bh(h,e.name),bh(p,e.name),bh(m,e.name),bh(v,e.name),bh(g,e.name),bh(b,e.name);const P=new rf({uid:y,auth:e,email:f,emailVerified:x,displayName:d,isAnonymous:T,photoURL:p,phoneNumber:h,tenantId:m,stsTokenManager:S,createdAt:g,lastLoginAt:b});return M&&Array.isArray(M)&&(P.providerData=M.map(R=>Object.assign({},R))),v&&(P._redirectEventId=v),P}static async _fromIdTokenResponse(e,n,r=!1){const i=new F1;i.updateFromServerResponse(n);const s=new rf({uid:n.localId,auth:e,stsTokenManager:i,isAnonymous:r});return await sR(s),s}static async _fromGetAccountInfoResponse(e,n,r){const i=n.users[0];Ht(i.localId!==void 0,"internal-error");const s=i.providerUserInfo!==void 0?hbe(i.providerUserInfo):[],a=!(i.email&&i.passwordHash)&&!(s!=null&&s.length),o=new F1;o.updateFromIdToken(r);const l=new rf({uid:i.localId,auth:e,stsTokenManager:o,isAnonymous:a}),u={uid:i.localId,displayName:i.displayName||null,photoURL:i.photoUrl||null,email:i.email||null,emailVerified:i.emailVerified||!1,phoneNumber:i.phoneNumber||null,tenantId:i.tenantId||null,providerData:s,metadata:new j4(i.createdAt,i.lastLoginAt),isAnonymous:!(i.email&&i.passwordHash)&&!(s!=null&&s.length)};return Object.assign(l,u),l}}/** * @license * Copyright 2020 Google LLC * @@ -9834,7 +9834,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const Hee=new Map;function sf(t){If(t instanceof Function,"Expected a class definition");let e=Hee.get(t);return e?(If(e instanceof t,"Instance stored in cache mismatched with class"),e):(e=new t,Hee.set(t,e),e)}/** + */const Yee=new Map;function sf(t){If(t instanceof Function,"Expected a class definition");let e=Yee.get(t);return e?(If(e instanceof t,"Instance stored in cache mismatched with class"),e):(e=new t,Yee.set(t,e),e)}/** * @license * Copyright 2019 Google LLC * @@ -9849,7 +9849,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class mbe{constructor(){this.type="NONE",this.storage={}}async _isAvailable(){return!0}async _set(e,n){this.storage[e]=n}async _get(e){const n=this.storage[e];return n===void 0?null:n}async _remove(e){delete this.storage[e]}_addListener(e,n){}_removeListener(e,n){}}mbe.type="NONE";const Qee=mbe;/** + */class pbe{constructor(){this.type="NONE",this.storage={}}async _isAvailable(){return!0}async _set(e,n){this.storage[e]=n}async _get(e){const n=this.storage[e];return n===void 0?null:n}async _remove(e){delete this.storage[e]}_addListener(e,n){}_removeListener(e,n){}}pbe.type="NONE";const Bee=pbe;/** * @license * Copyright 2019 Google LLC * @@ -9864,7 +9864,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function nM(t,e,n){return`firebase:${t}:${e}:${n}`}class j1{constructor(e,n,r){this.persistence=e,this.auth=n,this.userKey=r;const{config:i,name:s}=this.auth;this.fullUserKey=nM(this.userKey,i.apiKey,s),this.fullPersistenceKey=nM("persistence",i.apiKey,s),this.boundEventHandler=n._onStorageEvent.bind(n),this.persistence._addListener(this.fullUserKey,this.boundEventHandler)}setCurrentUser(e){return this.persistence._set(this.fullUserKey,e.toJSON())}async getCurrentUser(){const e=await this.persistence._get(this.fullUserKey);return e?rf._fromJSON(this.auth,e):null}removeCurrentUser(){return this.persistence._remove(this.fullUserKey)}savePersistenceForRedirect(){return this.persistence._set(this.fullPersistenceKey,this.persistence.type)}async setPersistence(e){if(this.persistence===e)return;const n=await this.getCurrentUser();if(await this.removeCurrentUser(),this.persistence=e,n)return this.setCurrentUser(n)}delete(){this.persistence._removeListener(this.fullUserKey,this.boundEventHandler)}static async create(e,n,r="authUser"){if(!n.length)return new j1(sf(Qee),e,r);const i=(await Promise.all(n.map(async u=>{if(await u._isAvailable())return u}))).filter(u=>u);let s=i[0]||sf(Qee);const a=nM(r,e.config.apiKey,e.name);let o=null;for(const u of n)try{const c=await u._get(a);if(c){const d=rf._fromJSON(e,c);u!==s&&(o=d),s=u;break}}catch{}const l=i.filter(u=>u._shouldAllowMigration);return!s._shouldAllowMigration||!l.length?new j1(s,e,r):(s=l[0],o&&await s._set(a,o.toJSON()),await Promise.all(n.map(async u=>{if(u!==s)try{await u._remove(a)}catch{}})),new j1(s,e,r))}}/** + */function nM(t,e,n){return`firebase:${t}:${e}:${n}`}class j1{constructor(e,n,r){this.persistence=e,this.auth=n,this.userKey=r;const{config:i,name:s}=this.auth;this.fullUserKey=nM(this.userKey,i.apiKey,s),this.fullPersistenceKey=nM("persistence",i.apiKey,s),this.boundEventHandler=n._onStorageEvent.bind(n),this.persistence._addListener(this.fullUserKey,this.boundEventHandler)}setCurrentUser(e){return this.persistence._set(this.fullUserKey,e.toJSON())}async getCurrentUser(){const e=await this.persistence._get(this.fullUserKey);return e?rf._fromJSON(this.auth,e):null}removeCurrentUser(){return this.persistence._remove(this.fullUserKey)}savePersistenceForRedirect(){return this.persistence._set(this.fullPersistenceKey,this.persistence.type)}async setPersistence(e){if(this.persistence===e)return;const n=await this.getCurrentUser();if(await this.removeCurrentUser(),this.persistence=e,n)return this.setCurrentUser(n)}delete(){this.persistence._removeListener(this.fullUserKey,this.boundEventHandler)}static async create(e,n,r="authUser"){if(!n.length)return new j1(sf(Bee),e,r);const i=(await Promise.all(n.map(async u=>{if(await u._isAvailable())return u}))).filter(u=>u);let s=i[0]||sf(Bee);const a=nM(r,e.config.apiKey,e.name);let o=null;for(const u of n)try{const c=await u._get(a);if(c){const d=rf._fromJSON(e,c);u!==s&&(o=d),s=u;break}}catch{}const l=i.filter(u=>u._shouldAllowMigration);return!s._shouldAllowMigration||!l.length?new j1(s,e,r):(s=l[0],o&&await s._set(a,o.toJSON()),await Promise.all(n.map(async u=>{if(u!==s)try{await u._remove(a)}catch{}})),new j1(s,e,r))}}/** * @license * Copyright 2020 Google LLC * @@ -9879,7 +9879,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function _ee(t){const e=t.toLowerCase();if(e.includes("opera/")||e.includes("opr/")||e.includes("opios/"))return"Opera";if(ybe(e))return"IEMobile";if(e.includes("msie")||e.includes("trident/"))return"IE";if(e.includes("edge/"))return"Edge";if(vbe(e))return"Firefox";if(e.includes("silk/"))return"Silk";if(xbe(e))return"Blackberry";if(Tbe(e))return"Webos";if(gbe(e))return"Safari";if((e.includes("chrome/")||bbe(e))&&!e.includes("edge/"))return"Chrome";if(Sbe(e))return"Android";{const n=/([a-zA-Z\d\.]+)\/[a-zA-Z\d\.]*$/,r=t.match(n);if((r==null?void 0:r.length)===2)return r[1]}return"Other"}function vbe(t=La()){return/firefox\//i.test(t)}function gbe(t=La()){const e=t.toLowerCase();return e.includes("safari/")&&!e.includes("chrome/")&&!e.includes("crios/")&&!e.includes("android")}function bbe(t=La()){return/crios\//i.test(t)}function ybe(t=La()){return/iemobile/i.test(t)}function Sbe(t=La()){return/android/i.test(t)}function xbe(t=La()){return/blackberry/i.test(t)}function Tbe(t=La()){return/webos/i.test(t)}function oA(t=La()){return/iphone|ipad|ipod/i.test(t)||/macintosh/i.test(t)&&/mobile/i.test(t)}function m6t(t=La()){var e;return oA(t)&&!!(!((e=window.navigator)===null||e===void 0)&&e.standalone)}function v6t(){return Tbt()&&document.documentMode===10}function wbe(t=La()){return oA(t)||Sbe(t)||Tbe(t)||xbe(t)||/windows phone/i.test(t)||ybe(t)}/** + */function Hee(t){const e=t.toLowerCase();if(e.includes("opera/")||e.includes("opr/")||e.includes("opios/"))return"Opera";if(bbe(e))return"IEMobile";if(e.includes("msie")||e.includes("trident/"))return"IE";if(e.includes("edge/"))return"Edge";if(mbe(e))return"Firefox";if(e.includes("silk/"))return"Silk";if(Sbe(e))return"Blackberry";if(xbe(e))return"Webos";if(vbe(e))return"Safari";if((e.includes("chrome/")||gbe(e))&&!e.includes("edge/"))return"Chrome";if(ybe(e))return"Android";{const n=/([a-zA-Z\d\.]+)\/[a-zA-Z\d\.]*$/,r=t.match(n);if((r==null?void 0:r.length)===2)return r[1]}return"Other"}function mbe(t=La()){return/firefox\//i.test(t)}function vbe(t=La()){const e=t.toLowerCase();return e.includes("safari/")&&!e.includes("chrome/")&&!e.includes("crios/")&&!e.includes("android")}function gbe(t=La()){return/crios\//i.test(t)}function bbe(t=La()){return/iemobile/i.test(t)}function ybe(t=La()){return/android/i.test(t)}function Sbe(t=La()){return/blackberry/i.test(t)}function xbe(t=La()){return/webos/i.test(t)}function lA(t=La()){return/iphone|ipad|ipod/i.test(t)||/macintosh/i.test(t)&&/mobile/i.test(t)}function v6t(t=La()){var e;return lA(t)&&!!(!((e=window.navigator)===null||e===void 0)&&e.standalone)}function g6t(){return wbt()&&document.documentMode===10}function Tbe(t=La()){return lA(t)||ybe(t)||xbe(t)||Sbe(t)||/windows phone/i.test(t)||bbe(t)}/** * @license * Copyright 2020 Google LLC * @@ -9894,7 +9894,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Ebe(t,e=[]){let n;switch(t){case"Browser":n=_ee(La());break;case"Worker":n=`${_ee(La())}-${t}`;break;default:n=t}const r=e.length?e.join(","):"FirebaseCore-web";return`${n}/JsCore/${Jy}/${r}`}/** + */function wbe(t,e=[]){let n;switch(t){case"Browser":n=Hee(La());break;case"Worker":n=`${Hee(La())}-${t}`;break;default:n=t}const r=e.length?e.join(","):"FirebaseCore-web";return`${n}/JsCore/${Zy}/${r}`}/** * @license * Copyright 2022 Google LLC * @@ -9909,7 +9909,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class g6t{constructor(e){this.auth=e,this.queue=[]}pushCallback(e,n){const r=s=>new Promise((a,o)=>{try{const l=e(s);a(l)}catch(l){o(l)}});r.onAbort=n,this.queue.push(r);const i=this.queue.length-1;return()=>{this.queue[i]=()=>Promise.resolve()}}async runMiddleware(e){if(this.auth.currentUser===e)return;const n=[];try{for(const r of this.queue)await r(e),r.onAbort&&n.push(r.onAbort)}catch(r){n.reverse();for(const i of n)try{i()}catch{}throw this.auth._errorFactory.create("login-blocked",{originalMessage:r==null?void 0:r.message})}}}/** + */class b6t{constructor(e){this.auth=e,this.queue=[]}pushCallback(e,n){const r=s=>new Promise((a,o)=>{try{const l=e(s);a(l)}catch(l){o(l)}});r.onAbort=n,this.queue.push(r);const i=this.queue.length-1;return()=>{this.queue[i]=()=>Promise.resolve()}}async runMiddleware(e){if(this.auth.currentUser===e)return;const n=[];try{for(const r of this.queue)await r(e),r.onAbort&&n.push(r.onAbort)}catch(r){n.reverse();for(const i of n)try{i()}catch{}throw this.auth._errorFactory.create("login-blocked",{originalMessage:r==null?void 0:r.message})}}}/** * @license * Copyright 2023 Google LLC * @@ -9924,7 +9924,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function b6t(t,e={}){return vm(t,"GET","/v2/passwordPolicy",mm(t,e))}/** + */async function y6t(t,e={}){return vm(t,"GET","/v2/passwordPolicy",mm(t,e))}/** * @license * Copyright 2023 Google LLC * @@ -9939,7 +9939,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const y6t=6;class S6t{constructor(e){var n,r,i,s;const a=e.customStrengthOptions;this.customStrengthOptions={},this.customStrengthOptions.minPasswordLength=(n=a.minPasswordLength)!==null&&n!==void 0?n:y6t,a.maxPasswordLength&&(this.customStrengthOptions.maxPasswordLength=a.maxPasswordLength),a.containsLowercaseCharacter!==void 0&&(this.customStrengthOptions.containsLowercaseLetter=a.containsLowercaseCharacter),a.containsUppercaseCharacter!==void 0&&(this.customStrengthOptions.containsUppercaseLetter=a.containsUppercaseCharacter),a.containsNumericCharacter!==void 0&&(this.customStrengthOptions.containsNumericCharacter=a.containsNumericCharacter),a.containsNonAlphanumericCharacter!==void 0&&(this.customStrengthOptions.containsNonAlphanumericCharacter=a.containsNonAlphanumericCharacter),this.enforcementState=e.enforcementState,this.enforcementState==="ENFORCEMENT_STATE_UNSPECIFIED"&&(this.enforcementState="OFF"),this.allowedNonAlphanumericCharacters=(i=(r=e.allowedNonAlphanumericCharacters)===null||r===void 0?void 0:r.join(""))!==null&&i!==void 0?i:"",this.forceUpgradeOnSignin=(s=e.forceUpgradeOnSignin)!==null&&s!==void 0?s:!1,this.schemaVersion=e.schemaVersion}validatePassword(e){var n,r,i,s,a,o;const l={isValid:!0,passwordPolicy:this};return this.validatePasswordLengthOptions(e,l),this.validatePasswordCharacterOptions(e,l),l.isValid&&(l.isValid=(n=l.meetsMinPasswordLength)!==null&&n!==void 0?n:!0),l.isValid&&(l.isValid=(r=l.meetsMaxPasswordLength)!==null&&r!==void 0?r:!0),l.isValid&&(l.isValid=(i=l.containsLowercaseLetter)!==null&&i!==void 0?i:!0),l.isValid&&(l.isValid=(s=l.containsUppercaseLetter)!==null&&s!==void 0?s:!0),l.isValid&&(l.isValid=(a=l.containsNumericCharacter)!==null&&a!==void 0?a:!0),l.isValid&&(l.isValid=(o=l.containsNonAlphanumericCharacter)!==null&&o!==void 0?o:!0),l}validatePasswordLengthOptions(e,n){const r=this.customStrengthOptions.minPasswordLength,i=this.customStrengthOptions.maxPasswordLength;r&&(n.meetsMinPasswordLength=e.length>=r),i&&(n.meetsMaxPasswordLength=e.length<=i)}validatePasswordCharacterOptions(e,n){this.updatePasswordCharacterOptionsStatuses(n,!1,!1,!1,!1);let r;for(let i=0;i="a"&&r<="z",r>="A"&&r<="Z",r>="0"&&r<="9",this.allowedNonAlphanumericCharacters.includes(r))}updatePasswordCharacterOptionsStatuses(e,n,r,i,s){this.customStrengthOptions.containsLowercaseLetter&&(e.containsLowercaseLetter||(e.containsLowercaseLetter=n)),this.customStrengthOptions.containsUppercaseLetter&&(e.containsUppercaseLetter||(e.containsUppercaseLetter=r)),this.customStrengthOptions.containsNumericCharacter&&(e.containsNumericCharacter||(e.containsNumericCharacter=i)),this.customStrengthOptions.containsNonAlphanumericCharacter&&(e.containsNonAlphanumericCharacter||(e.containsNonAlphanumericCharacter=s))}}/** + */const S6t=6;class x6t{constructor(e){var n,r,i,s;const a=e.customStrengthOptions;this.customStrengthOptions={},this.customStrengthOptions.minPasswordLength=(n=a.minPasswordLength)!==null&&n!==void 0?n:S6t,a.maxPasswordLength&&(this.customStrengthOptions.maxPasswordLength=a.maxPasswordLength),a.containsLowercaseCharacter!==void 0&&(this.customStrengthOptions.containsLowercaseLetter=a.containsLowercaseCharacter),a.containsUppercaseCharacter!==void 0&&(this.customStrengthOptions.containsUppercaseLetter=a.containsUppercaseCharacter),a.containsNumericCharacter!==void 0&&(this.customStrengthOptions.containsNumericCharacter=a.containsNumericCharacter),a.containsNonAlphanumericCharacter!==void 0&&(this.customStrengthOptions.containsNonAlphanumericCharacter=a.containsNonAlphanumericCharacter),this.enforcementState=e.enforcementState,this.enforcementState==="ENFORCEMENT_STATE_UNSPECIFIED"&&(this.enforcementState="OFF"),this.allowedNonAlphanumericCharacters=(i=(r=e.allowedNonAlphanumericCharacters)===null||r===void 0?void 0:r.join(""))!==null&&i!==void 0?i:"",this.forceUpgradeOnSignin=(s=e.forceUpgradeOnSignin)!==null&&s!==void 0?s:!1,this.schemaVersion=e.schemaVersion}validatePassword(e){var n,r,i,s,a,o;const l={isValid:!0,passwordPolicy:this};return this.validatePasswordLengthOptions(e,l),this.validatePasswordCharacterOptions(e,l),l.isValid&&(l.isValid=(n=l.meetsMinPasswordLength)!==null&&n!==void 0?n:!0),l.isValid&&(l.isValid=(r=l.meetsMaxPasswordLength)!==null&&r!==void 0?r:!0),l.isValid&&(l.isValid=(i=l.containsLowercaseLetter)!==null&&i!==void 0?i:!0),l.isValid&&(l.isValid=(s=l.containsUppercaseLetter)!==null&&s!==void 0?s:!0),l.isValid&&(l.isValid=(a=l.containsNumericCharacter)!==null&&a!==void 0?a:!0),l.isValid&&(l.isValid=(o=l.containsNonAlphanumericCharacter)!==null&&o!==void 0?o:!0),l}validatePasswordLengthOptions(e,n){const r=this.customStrengthOptions.minPasswordLength,i=this.customStrengthOptions.maxPasswordLength;r&&(n.meetsMinPasswordLength=e.length>=r),i&&(n.meetsMaxPasswordLength=e.length<=i)}validatePasswordCharacterOptions(e,n){this.updatePasswordCharacterOptionsStatuses(n,!1,!1,!1,!1);let r;for(let i=0;i="a"&&r<="z",r>="A"&&r<="Z",r>="0"&&r<="9",this.allowedNonAlphanumericCharacters.includes(r))}updatePasswordCharacterOptionsStatuses(e,n,r,i,s){this.customStrengthOptions.containsLowercaseLetter&&(e.containsLowercaseLetter||(e.containsLowercaseLetter=n)),this.customStrengthOptions.containsUppercaseLetter&&(e.containsUppercaseLetter||(e.containsUppercaseLetter=r)),this.customStrengthOptions.containsNumericCharacter&&(e.containsNumericCharacter||(e.containsNumericCharacter=i)),this.customStrengthOptions.containsNonAlphanumericCharacter&&(e.containsNonAlphanumericCharacter||(e.containsNonAlphanumericCharacter=s))}}/** * @license * Copyright 2020 Google LLC * @@ -9954,7 +9954,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class x6t{constructor(e,n,r,i){this.app=e,this.heartbeatServiceProvider=n,this.appCheckServiceProvider=r,this.config=i,this.currentUser=null,this.emulatorConfig=null,this.operations=Promise.resolve(),this.authStateSubscription=new $ee(this),this.idTokenSubscription=new $ee(this),this.beforeStateQueue=new g6t(this),this.redirectUser=null,this.isProactiveRefreshEnabled=!1,this.EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION=1,this._canInitEmulator=!0,this._isInitialized=!1,this._deleted=!1,this._initializationPromise=null,this._popupRedirectResolver=null,this._errorFactory=lbe,this._agentRecaptchaConfig=null,this._tenantRecaptchaConfigs={},this._projectPasswordPolicy=null,this._tenantPasswordPolicies={},this.lastNotifiedUid=void 0,this.languageCode=null,this.tenantId=null,this.settings={appVerificationDisabledForTesting:!1},this.frameworks=[],this.name=e.name,this.clientVersion=i.sdkClientVersion}_initializeWithPersistence(e,n){return n&&(this._popupRedirectResolver=sf(n)),this._initializationPromise=this.queue(async()=>{var r,i;if(!this._deleted&&(this.persistenceManager=await j1.create(this,e),!this._deleted)){if(!((r=this._popupRedirectResolver)===null||r===void 0)&&r._shouldInitProactively)try{await this._popupRedirectResolver._initialize(this)}catch{}await this.initializeCurrentUser(n),this.lastNotifiedUid=((i=this.currentUser)===null||i===void 0?void 0:i.uid)||null,!this._deleted&&(this._isInitialized=!0)}}),this._initializationPromise}async _onStorageEvent(){if(this._deleted)return;const e=await this.assertedPersistence.getCurrentUser();if(!(!this.currentUser&&!e)){if(this.currentUser&&e&&this.currentUser.uid===e.uid){this._currentUser._assign(e),await this.currentUser.getIdToken();return}await this._updateCurrentUser(e,!0)}}async initializeCurrentUserFromIdToken(e){try{const n=await hbe(this,{idToken:e}),r=await rf._fromGetAccountInfoResponse(this,n,e);await this.directlySetCurrentUser(r)}catch(n){console.warn("FirebaseServerApp could not login user with provided authIdToken: ",n),await this.directlySetCurrentUser(null)}}async initializeCurrentUser(e){var n;if(qc(this.app)){const a=this.app.settings.authIdToken;return a?new Promise(o=>{setTimeout(()=>this.initializeCurrentUserFromIdToken(a).then(o,o))}):this.directlySetCurrentUser(null)}const r=await this.assertedPersistence.getCurrentUser();let i=r,s=!1;if(e&&this.config.authDomain){await this.getOrInitRedirectPersistenceManager();const a=(n=this.redirectUser)===null||n===void 0?void 0:n._redirectEventId,o=i==null?void 0:i._redirectEventId,l=await this.tryRedirectSignIn(e);(!a||a===o)&&(l!=null&&l.user)&&(i=l.user,s=!0)}if(!i)return this.directlySetCurrentUser(null);if(!i._redirectEventId){if(s)try{await this.beforeStateQueue.runMiddleware(i)}catch(a){i=r,this._popupRedirectResolver._overrideRedirectResult(this,()=>Promise.reject(a))}return i?this.reloadAndSetCurrentUserOrClear(i):this.directlySetCurrentUser(null)}return Ht(this._popupRedirectResolver,this,"argument-error"),await this.getOrInitRedirectPersistenceManager(),this.redirectUser&&this.redirectUser._redirectEventId===i._redirectEventId?this.directlySetCurrentUser(i):this.reloadAndSetCurrentUserOrClear(i)}async tryRedirectSignIn(e){let n=null;try{n=await this._popupRedirectResolver._completeRedirectFn(this,e,!0)}catch{await this._setRedirectUser(null)}return n}async reloadAndSetCurrentUserOrClear(e){try{await aR(e)}catch(n){if((n==null?void 0:n.code)!=="auth/network-request-failed")return this.directlySetCurrentUser(null)}return this.directlySetCurrentUser(e)}useDeviceLanguage(){this.languageCode=e6t()}async _delete(){this._deleted=!0}async updateCurrentUser(e){if(qc(this.app))return Promise.reject(cf(this));const n=e?la(e):null;return n&&Ht(n.auth.config.apiKey===this.config.apiKey,this,"invalid-user-token"),this._updateCurrentUser(n&&n._clone(this))}async _updateCurrentUser(e,n=!1){if(!this._deleted)return e&&Ht(this.tenantId===e.tenantId,this,"tenant-id-mismatch"),n||await this.beforeStateQueue.runMiddleware(e),this.queue(async()=>{await this.directlySetCurrentUser(e),this.notifyAuthListeners()})}async signOut(){return qc(this.app)?Promise.reject(cf(this)):(await this.beforeStateQueue.runMiddleware(null),(this.redirectPersistenceManager||this._popupRedirectResolver)&&await this._setRedirectUser(null),this._updateCurrentUser(null,!0))}setPersistence(e){return qc(this.app)?Promise.reject(cf(this)):this.queue(async()=>{await this.assertedPersistence.setPersistence(sf(e))})}_getRecaptchaConfig(){return this.tenantId==null?this._agentRecaptchaConfig:this._tenantRecaptchaConfigs[this.tenantId]}async validatePassword(e){this._getPasswordPolicyInternal()||await this._updatePasswordPolicy();const n=this._getPasswordPolicyInternal();return n.schemaVersion!==this.EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION?Promise.reject(this._errorFactory.create("unsupported-password-policy-schema-version",{})):n.validatePassword(e)}_getPasswordPolicyInternal(){return this.tenantId===null?this._projectPasswordPolicy:this._tenantPasswordPolicies[this.tenantId]}async _updatePasswordPolicy(){const e=await b6t(this),n=new S6t(e);this.tenantId===null?this._projectPasswordPolicy=n:this._tenantPasswordPolicies[this.tenantId]=n}_getPersistence(){return this.assertedPersistence.persistence.type}_updateErrorMap(e){this._errorFactory=new uw("auth","Firebase",e())}onAuthStateChanged(e,n,r){return this.registerStateListener(this.authStateSubscription,e,n,r)}beforeAuthStateChanged(e,n){return this.beforeStateQueue.pushCallback(e,n)}onIdTokenChanged(e,n,r){return this.registerStateListener(this.idTokenSubscription,e,n,r)}authStateReady(){return new Promise((e,n)=>{if(this.currentUser)e();else{const r=this.onAuthStateChanged(()=>{r(),e()},n)}})}async revokeAccessToken(e){if(this.currentUser){const n=await this.currentUser.getIdToken(),r={providerId:"apple.com",tokenType:"ACCESS_TOKEN",token:e,idToken:n};this.tenantId!=null&&(r.tenantId=this.tenantId),await p6t(this,r)}}toJSON(){var e;return{apiKey:this.config.apiKey,authDomain:this.config.authDomain,appName:this.name,currentUser:(e=this._currentUser)===null||e===void 0?void 0:e.toJSON()}}async _setRedirectUser(e,n){const r=await this.getOrInitRedirectPersistenceManager(n);return e===null?r.removeCurrentUser():r.setCurrentUser(e)}async getOrInitRedirectPersistenceManager(e){if(!this.redirectPersistenceManager){const n=e&&sf(e)||this._popupRedirectResolver;Ht(n,this,"argument-error"),this.redirectPersistenceManager=await j1.create(this,[sf(n._redirectPersistence)],"redirectUser"),this.redirectUser=await this.redirectPersistenceManager.getCurrentUser()}return this.redirectPersistenceManager}async _redirectUserForId(e){var n,r;return this._isInitialized&&await this.queue(async()=>{}),((n=this._currentUser)===null||n===void 0?void 0:n._redirectEventId)===e?this._currentUser:((r=this.redirectUser)===null||r===void 0?void 0:r._redirectEventId)===e?this.redirectUser:null}async _persistUserIfCurrent(e){if(e===this.currentUser)return this.queue(async()=>this.directlySetCurrentUser(e))}_notifyListenersIfCurrent(e){e===this.currentUser&&this.notifyAuthListeners()}_key(){return`${this.config.authDomain}:${this.config.apiKey}:${this.name}`}_startProactiveRefresh(){this.isProactiveRefreshEnabled=!0,this.currentUser&&this._currentUser._startProactiveRefresh()}_stopProactiveRefresh(){this.isProactiveRefreshEnabled=!1,this.currentUser&&this._currentUser._stopProactiveRefresh()}get _currentUser(){return this.currentUser}notifyAuthListeners(){var e,n;if(!this._isInitialized)return;this.idTokenSubscription.next(this.currentUser);const r=(n=(e=this.currentUser)===null||e===void 0?void 0:e.uid)!==null&&n!==void 0?n:null;this.lastNotifiedUid!==r&&(this.lastNotifiedUid=r,this.authStateSubscription.next(this.currentUser))}registerStateListener(e,n,r,i){if(this._deleted)return()=>{};const s=typeof n=="function"?n:n.next.bind(n);let a=!1;const o=this._isInitialized?Promise.resolve():this._initializationPromise;if(Ht(o,this,"internal-error"),o.then(()=>{a||s(this.currentUser)}),typeof n=="function"){const l=e.addObserver(n,r,i);return()=>{a=!0,l()}}else{const l=e.addObserver(n);return()=>{a=!0,l()}}}async directlySetCurrentUser(e){this.currentUser&&this.currentUser!==e&&this._currentUser._stopProactiveRefresh(),e&&this.isProactiveRefreshEnabled&&e._startProactiveRefresh(),this.currentUser=e,e?await this.assertedPersistence.setCurrentUser(e):await this.assertedPersistence.removeCurrentUser()}queue(e){return this.operations=this.operations.then(e,e),this.operations}get assertedPersistence(){return Ht(this.persistenceManager,this,"internal-error"),this.persistenceManager}_logFramework(e){!e||this.frameworks.includes(e)||(this.frameworks.push(e),this.frameworks.sort(),this.clientVersion=Ebe(this.config.clientPlatform,this._getFrameworks()))}_getFrameworks(){return this.frameworks}async _getAdditionalHeaders(){var e;const n={"X-Client-Version":this.clientVersion};this.app.options.appId&&(n["X-Firebase-gmpid"]=this.app.options.appId);const r=await((e=this.heartbeatServiceProvider.getImmediate({optional:!0}))===null||e===void 0?void 0:e.getHeartbeatsHeader());r&&(n["X-Firebase-Client"]=r);const i=await this._getAppCheckToken();return i&&(n["X-Firebase-AppCheck"]=i),n}async _getAppCheckToken(){var e;const n=await((e=this.appCheckServiceProvider.getImmediate({optional:!0}))===null||e===void 0?void 0:e.getToken());return n!=null&&n.error&&Qxt(`Error while retrieving App Check token: ${n.error}`),n==null?void 0:n.token}}function C0(t){return la(t)}class $ee{constructor(e){this.auth=e,this.observer=null,this.addObserver=kbt(n=>this.observer=n)}get next(){return Ht(this.observer,this.auth,"internal-error"),this.observer.next.bind(this.observer)}}/** + */class T6t{constructor(e,n,r,i){this.app=e,this.heartbeatServiceProvider=n,this.appCheckServiceProvider=r,this.config=i,this.currentUser=null,this.emulatorConfig=null,this.operations=Promise.resolve(),this.authStateSubscription=new Qee(this),this.idTokenSubscription=new Qee(this),this.beforeStateQueue=new b6t(this),this.redirectUser=null,this.isProactiveRefreshEnabled=!1,this.EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION=1,this._canInitEmulator=!0,this._isInitialized=!1,this._deleted=!1,this._initializationPromise=null,this._popupRedirectResolver=null,this._errorFactory=obe,this._agentRecaptchaConfig=null,this._tenantRecaptchaConfigs={},this._projectPasswordPolicy=null,this._tenantPasswordPolicies={},this.lastNotifiedUid=void 0,this.languageCode=null,this.tenantId=null,this.settings={appVerificationDisabledForTesting:!1},this.frameworks=[],this.name=e.name,this.clientVersion=i.sdkClientVersion}_initializeWithPersistence(e,n){return n&&(this._popupRedirectResolver=sf(n)),this._initializationPromise=this.queue(async()=>{var r,i;if(!this._deleted&&(this.persistenceManager=await j1.create(this,e),!this._deleted)){if(!((r=this._popupRedirectResolver)===null||r===void 0)&&r._shouldInitProactively)try{await this._popupRedirectResolver._initialize(this)}catch{}await this.initializeCurrentUser(n),this.lastNotifiedUid=((i=this.currentUser)===null||i===void 0?void 0:i.uid)||null,!this._deleted&&(this._isInitialized=!0)}}),this._initializationPromise}async _onStorageEvent(){if(this._deleted)return;const e=await this.assertedPersistence.getCurrentUser();if(!(!this.currentUser&&!e)){if(this.currentUser&&e&&this.currentUser.uid===e.uid){this._currentUser._assign(e),await this.currentUser.getIdToken();return}await this._updateCurrentUser(e,!0)}}async initializeCurrentUserFromIdToken(e){try{const n=await fbe(this,{idToken:e}),r=await rf._fromGetAccountInfoResponse(this,n,e);await this.directlySetCurrentUser(r)}catch(n){console.warn("FirebaseServerApp could not login user with provided authIdToken: ",n),await this.directlySetCurrentUser(null)}}async initializeCurrentUser(e){var n;if(qc(this.app)){const a=this.app.settings.authIdToken;return a?new Promise(o=>{setTimeout(()=>this.initializeCurrentUserFromIdToken(a).then(o,o))}):this.directlySetCurrentUser(null)}const r=await this.assertedPersistence.getCurrentUser();let i=r,s=!1;if(e&&this.config.authDomain){await this.getOrInitRedirectPersistenceManager();const a=(n=this.redirectUser)===null||n===void 0?void 0:n._redirectEventId,o=i==null?void 0:i._redirectEventId,l=await this.tryRedirectSignIn(e);(!a||a===o)&&(l!=null&&l.user)&&(i=l.user,s=!0)}if(!i)return this.directlySetCurrentUser(null);if(!i._redirectEventId){if(s)try{await this.beforeStateQueue.runMiddleware(i)}catch(a){i=r,this._popupRedirectResolver._overrideRedirectResult(this,()=>Promise.reject(a))}return i?this.reloadAndSetCurrentUserOrClear(i):this.directlySetCurrentUser(null)}return Ht(this._popupRedirectResolver,this,"argument-error"),await this.getOrInitRedirectPersistenceManager(),this.redirectUser&&this.redirectUser._redirectEventId===i._redirectEventId?this.directlySetCurrentUser(i):this.reloadAndSetCurrentUserOrClear(i)}async tryRedirectSignIn(e){let n=null;try{n=await this._popupRedirectResolver._completeRedirectFn(this,e,!0)}catch{await this._setRedirectUser(null)}return n}async reloadAndSetCurrentUserOrClear(e){try{await sR(e)}catch(n){if((n==null?void 0:n.code)!=="auth/network-request-failed")return this.directlySetCurrentUser(null)}return this.directlySetCurrentUser(e)}useDeviceLanguage(){this.languageCode=t6t()}async _delete(){this._deleted=!0}async updateCurrentUser(e){if(qc(this.app))return Promise.reject(cf(this));const n=e?la(e):null;return n&&Ht(n.auth.config.apiKey===this.config.apiKey,this,"invalid-user-token"),this._updateCurrentUser(n&&n._clone(this))}async _updateCurrentUser(e,n=!1){if(!this._deleted)return e&&Ht(this.tenantId===e.tenantId,this,"tenant-id-mismatch"),n||await this.beforeStateQueue.runMiddleware(e),this.queue(async()=>{await this.directlySetCurrentUser(e),this.notifyAuthListeners()})}async signOut(){return qc(this.app)?Promise.reject(cf(this)):(await this.beforeStateQueue.runMiddleware(null),(this.redirectPersistenceManager||this._popupRedirectResolver)&&await this._setRedirectUser(null),this._updateCurrentUser(null,!0))}setPersistence(e){return qc(this.app)?Promise.reject(cf(this)):this.queue(async()=>{await this.assertedPersistence.setPersistence(sf(e))})}_getRecaptchaConfig(){return this.tenantId==null?this._agentRecaptchaConfig:this._tenantRecaptchaConfigs[this.tenantId]}async validatePassword(e){this._getPasswordPolicyInternal()||await this._updatePasswordPolicy();const n=this._getPasswordPolicyInternal();return n.schemaVersion!==this.EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION?Promise.reject(this._errorFactory.create("unsupported-password-policy-schema-version",{})):n.validatePassword(e)}_getPasswordPolicyInternal(){return this.tenantId===null?this._projectPasswordPolicy:this._tenantPasswordPolicies[this.tenantId]}async _updatePasswordPolicy(){const e=await y6t(this),n=new x6t(e);this.tenantId===null?this._projectPasswordPolicy=n:this._tenantPasswordPolicies[this.tenantId]=n}_getPersistence(){return this.assertedPersistence.persistence.type}_updateErrorMap(e){this._errorFactory=new uw("auth","Firebase",e())}onAuthStateChanged(e,n,r){return this.registerStateListener(this.authStateSubscription,e,n,r)}beforeAuthStateChanged(e,n){return this.beforeStateQueue.pushCallback(e,n)}onIdTokenChanged(e,n,r){return this.registerStateListener(this.idTokenSubscription,e,n,r)}authStateReady(){return new Promise((e,n)=>{if(this.currentUser)e();else{const r=this.onAuthStateChanged(()=>{r(),e()},n)}})}async revokeAccessToken(e){if(this.currentUser){const n=await this.currentUser.getIdToken(),r={providerId:"apple.com",tokenType:"ACCESS_TOKEN",token:e,idToken:n};this.tenantId!=null&&(r.tenantId=this.tenantId),await m6t(this,r)}}toJSON(){var e;return{apiKey:this.config.apiKey,authDomain:this.config.authDomain,appName:this.name,currentUser:(e=this._currentUser)===null||e===void 0?void 0:e.toJSON()}}async _setRedirectUser(e,n){const r=await this.getOrInitRedirectPersistenceManager(n);return e===null?r.removeCurrentUser():r.setCurrentUser(e)}async getOrInitRedirectPersistenceManager(e){if(!this.redirectPersistenceManager){const n=e&&sf(e)||this._popupRedirectResolver;Ht(n,this,"argument-error"),this.redirectPersistenceManager=await j1.create(this,[sf(n._redirectPersistence)],"redirectUser"),this.redirectUser=await this.redirectPersistenceManager.getCurrentUser()}return this.redirectPersistenceManager}async _redirectUserForId(e){var n,r;return this._isInitialized&&await this.queue(async()=>{}),((n=this._currentUser)===null||n===void 0?void 0:n._redirectEventId)===e?this._currentUser:((r=this.redirectUser)===null||r===void 0?void 0:r._redirectEventId)===e?this.redirectUser:null}async _persistUserIfCurrent(e){if(e===this.currentUser)return this.queue(async()=>this.directlySetCurrentUser(e))}_notifyListenersIfCurrent(e){e===this.currentUser&&this.notifyAuthListeners()}_key(){return`${this.config.authDomain}:${this.config.apiKey}:${this.name}`}_startProactiveRefresh(){this.isProactiveRefreshEnabled=!0,this.currentUser&&this._currentUser._startProactiveRefresh()}_stopProactiveRefresh(){this.isProactiveRefreshEnabled=!1,this.currentUser&&this._currentUser._stopProactiveRefresh()}get _currentUser(){return this.currentUser}notifyAuthListeners(){var e,n;if(!this._isInitialized)return;this.idTokenSubscription.next(this.currentUser);const r=(n=(e=this.currentUser)===null||e===void 0?void 0:e.uid)!==null&&n!==void 0?n:null;this.lastNotifiedUid!==r&&(this.lastNotifiedUid=r,this.authStateSubscription.next(this.currentUser))}registerStateListener(e,n,r,i){if(this._deleted)return()=>{};const s=typeof n=="function"?n:n.next.bind(n);let a=!1;const o=this._isInitialized?Promise.resolve():this._initializationPromise;if(Ht(o,this,"internal-error"),o.then(()=>{a||s(this.currentUser)}),typeof n=="function"){const l=e.addObserver(n,r,i);return()=>{a=!0,l()}}else{const l=e.addObserver(n);return()=>{a=!0,l()}}}async directlySetCurrentUser(e){this.currentUser&&this.currentUser!==e&&this._currentUser._stopProactiveRefresh(),e&&this.isProactiveRefreshEnabled&&e._startProactiveRefresh(),this.currentUser=e,e?await this.assertedPersistence.setCurrentUser(e):await this.assertedPersistence.removeCurrentUser()}queue(e){return this.operations=this.operations.then(e,e),this.operations}get assertedPersistence(){return Ht(this.persistenceManager,this,"internal-error"),this.persistenceManager}_logFramework(e){!e||this.frameworks.includes(e)||(this.frameworks.push(e),this.frameworks.sort(),this.clientVersion=wbe(this.config.clientPlatform,this._getFrameworks()))}_getFrameworks(){return this.frameworks}async _getAdditionalHeaders(){var e;const n={"X-Client-Version":this.clientVersion};this.app.options.appId&&(n["X-Firebase-gmpid"]=this.app.options.appId);const r=await((e=this.heartbeatServiceProvider.getImmediate({optional:!0}))===null||e===void 0?void 0:e.getHeartbeatsHeader());r&&(n["X-Firebase-Client"]=r);const i=await this._getAppCheckToken();return i&&(n["X-Firebase-AppCheck"]=i),n}async _getAppCheckToken(){var e;const n=await((e=this.appCheckServiceProvider.getImmediate({optional:!0}))===null||e===void 0?void 0:e.getToken());return n!=null&&n.error&&_xt(`Error while retrieving App Check token: ${n.error}`),n==null?void 0:n.token}}function C0(t){return la(t)}class Qee{constructor(e){this.auth=e,this.observer=null,this.addObserver=Obt(n=>this.observer=n)}get next(){return Ht(this.observer,this.auth,"internal-error"),this.observer.next.bind(this.observer)}}/** * @license * Copyright 2020 Google LLC * @@ -9969,7 +9969,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */let Q9={async loadJS(){throw new Error("Unable to load external scripts")},recaptchaV2Script:"",recaptchaEnterpriseScript:"",gapiScript:""};function T6t(t){Q9=t}function Mbe(t){return Q9.loadJS(t)}function w6t(){return Q9.recaptchaEnterpriseScript}function E6t(){return Q9.gapiScript}function M6t(t){return`__${t}${Math.floor(Math.random()*1e6)}`}const P6t="recaptcha-enterprise",R6t="NO_RECAPTCHA";class V6t{constructor(e){this.type=P6t,this.auth=C0(e)}async verify(e="verify",n=!1){async function r(s){if(!n){if(s.tenantId==null&&s._agentRecaptchaConfig!=null)return s._agentRecaptchaConfig.siteKey;if(s.tenantId!=null&&s._tenantRecaptchaConfigs[s.tenantId]!==void 0)return s._tenantRecaptchaConfigs[s.tenantId].siteKey}return new Promise(async(a,o)=>{a6t(s,{clientType:"CLIENT_TYPE_WEB",version:"RECAPTCHA_ENTERPRISE"}).then(l=>{if(l.recaptchaKey===void 0)o(new Error("recaptcha Enterprise site key undefined"));else{const u=new s6t(l);return s.tenantId==null?s._agentRecaptchaConfig=u:s._tenantRecaptchaConfigs[s.tenantId]=u,a(u.siteKey)}}).catch(l=>{o(l)})})}function i(s,a,o){const l=window.grecaptcha;Yee(l)?l.enterprise.ready(()=>{l.enterprise.execute(s,{action:e}).then(u=>{a(u)}).catch(()=>{a(R6t)})}):o(Error("No reCAPTCHA enterprise script loaded."))}return new Promise((s,a)=>{r(this.auth).then(o=>{if(!n&&Yee(window.grecaptcha))i(o,s,a);else{if(typeof window>"u"){a(new Error("RecaptchaVerifier is only supported in browser"));return}let l=w6t();l.length!==0&&(l+=o),Mbe(l).then(()=>{i(o,s,a)}).catch(u=>{a(u)})}}).catch(o=>{a(o)})})}}async function ete(t,e,n,r=!1){const i=new V6t(t);let s;try{s=await i.verify(n)}catch{s=await i.verify(n,!0)}const a=Object.assign({},e);return r?Object.assign(a,{captchaResp:s}):Object.assign(a,{captchaResponse:s}),Object.assign(a,{clientType:"CLIENT_TYPE_WEB"}),Object.assign(a,{recaptchaVersion:"RECAPTCHA_ENTERPRISE"}),a}async function Z4(t,e,n,r){var i;if(!((i=t._getRecaptchaConfig())===null||i===void 0)&&i.isProviderEnabled("EMAIL_PASSWORD_PROVIDER")){const s=await ete(t,e,n,n==="getOobCode");return r(t,s)}else return r(t,e).catch(async s=>{if(s.code==="auth/missing-recaptcha-token"){console.log(`${n} is protected by reCAPTCHA Enterprise for this project. Automatically triggering the reCAPTCHA flow and restarting the flow.`);const a=await ete(t,e,n,n==="getOobCode");return r(t,a)}else return Promise.reject(s)})}/** + */let Q9={async loadJS(){throw new Error("Unable to load external scripts")},recaptchaV2Script:"",recaptchaEnterpriseScript:"",gapiScript:""};function w6t(t){Q9=t}function Ebe(t){return Q9.loadJS(t)}function E6t(){return Q9.recaptchaEnterpriseScript}function M6t(){return Q9.gapiScript}function P6t(t){return`__${t}${Math.floor(Math.random()*1e6)}`}const R6t="recaptcha-enterprise",V6t="NO_RECAPTCHA";class z6t{constructor(e){this.type=R6t,this.auth=C0(e)}async verify(e="verify",n=!1){async function r(s){if(!n){if(s.tenantId==null&&s._agentRecaptchaConfig!=null)return s._agentRecaptchaConfig.siteKey;if(s.tenantId!=null&&s._tenantRecaptchaConfigs[s.tenantId]!==void 0)return s._tenantRecaptchaConfigs[s.tenantId].siteKey}return new Promise(async(a,o)=>{o6t(s,{clientType:"CLIENT_TYPE_WEB",version:"RECAPTCHA_ENTERPRISE"}).then(l=>{if(l.recaptchaKey===void 0)o(new Error("recaptcha Enterprise site key undefined"));else{const u=new a6t(l);return s.tenantId==null?s._agentRecaptchaConfig=u:s._tenantRecaptchaConfigs[s.tenantId]=u,a(u.siteKey)}}).catch(l=>{o(l)})})}function i(s,a,o){const l=window.grecaptcha;Zee(l)?l.enterprise.ready(()=>{l.enterprise.execute(s,{action:e}).then(u=>{a(u)}).catch(()=>{a(V6t)})}):o(Error("No reCAPTCHA enterprise script loaded."))}return new Promise((s,a)=>{r(this.auth).then(o=>{if(!n&&Zee(window.grecaptcha))i(o,s,a);else{if(typeof window>"u"){a(new Error("RecaptchaVerifier is only supported in browser"));return}let l=E6t();l.length!==0&&(l+=o),Ebe(l).then(()=>{i(o,s,a)}).catch(u=>{a(u)})}}).catch(o=>{a(o)})})}}async function _ee(t,e,n,r=!1){const i=new z6t(t);let s;try{s=await i.verify(n)}catch{s=await i.verify(n,!0)}const a=Object.assign({},e);return r?Object.assign(a,{captchaResp:s}):Object.assign(a,{captchaResponse:s}),Object.assign(a,{clientType:"CLIENT_TYPE_WEB"}),Object.assign(a,{recaptchaVersion:"RECAPTCHA_ENTERPRISE"}),a}async function Z4(t,e,n,r){var i;if(!((i=t._getRecaptchaConfig())===null||i===void 0)&&i.isProviderEnabled("EMAIL_PASSWORD_PROVIDER")){const s=await _ee(t,e,n,n==="getOobCode");return r(t,s)}else return r(t,e).catch(async s=>{if(s.code==="auth/missing-recaptcha-token"){console.log(`${n} is protected by reCAPTCHA Enterprise for this project. Automatically triggering the reCAPTCHA flow and restarting the flow.`);const a=await _ee(t,e,n,n==="getOobCode");return r(t,a)}else return Promise.reject(s)})}/** * @license * Copyright 2020 Google LLC * @@ -9984,7 +9984,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function z6t(t,e){const n=bW(t,"auth");if(n.isInitialized()){const i=n.getImmediate(),s=n.getOptions();if(YP(s,e??{}))return i;Fu(i,"already-initialized")}return n.initialize({options:e})}function k6t(t,e){const n=(e==null?void 0:e.persistence)||[],r=(Array.isArray(n)?n:[n]).map(sf);e!=null&&e.errorMap&&t._updateErrorMap(e.errorMap),t._initializeWithPersistence(r,e==null?void 0:e.popupRedirectResolver)}function O6t(t,e,n){const r=C0(t);Ht(r._canInitEmulator,r,"emulator-config-failed"),Ht(/^https?:\/\//.test(e),r,"invalid-emulator-scheme");const i=!!(n!=null&&n.disableWarnings),s=Pbe(e),{host:a,port:o}=I6t(e),l=o===null?"":`:${o}`;r.config.emulator={url:`${s}//${a}${l}/`},r.settings.appVerificationDisabledForTesting=!0,r.emulatorConfig=Object.freeze({host:a,port:o,protocol:s.replace(":",""),options:Object.freeze({disableWarnings:i})}),i||U6t()}function Pbe(t){const e=t.indexOf(":");return e<0?"":t.substr(0,e+1)}function I6t(t){const e=Pbe(t),n=/(\/\/)?([^?#/]+)/.exec(t.substr(e.length));if(!n)return{host:"",port:null};const r=n[2].split("@").pop()||"",i=/^(\[[^\]]+\])(:|$)/.exec(r);if(i){const s=i[1];return{host:s,port:tte(r.substr(s.length+1))}}else{const[s,a]=r.split(":");return{host:s,port:tte(a)}}}function tte(t){if(!t)return null;const e=Number(t);return isNaN(e)?null:e}function U6t(){function t(){const e=document.createElement("p"),n=e.style;e.innerText="Running in emulator mode. Do not use with production credentials.",n.position="fixed",n.width="100%",n.backgroundColor="#ffffff",n.border=".1em solid #000000",n.color="#b50000",n.bottom="0px",n.left="0px",n.margin="0px",n.zIndex="10000",n.textAlign="center",e.classList.add("firebase-emulator-warning"),document.body.appendChild(e)}typeof console<"u"&&typeof console.info=="function"&&console.info("WARNING: You are using the Auth Emulator, which is intended for local testing only. Do not use with production credentials."),typeof window<"u"&&typeof document<"u"&&(document.readyState==="loading"?window.addEventListener("DOMContentLoaded",t):t())}/** + */function k6t(t,e){const n=yW(t,"auth");if(n.isInitialized()){const i=n.getImmediate(),s=n.getOptions();if(JP(s,e??{}))return i;Fu(i,"already-initialized")}return n.initialize({options:e})}function O6t(t,e){const n=(e==null?void 0:e.persistence)||[],r=(Array.isArray(n)?n:[n]).map(sf);e!=null&&e.errorMap&&t._updateErrorMap(e.errorMap),t._initializeWithPersistence(r,e==null?void 0:e.popupRedirectResolver)}function I6t(t,e,n){const r=C0(t);Ht(r._canInitEmulator,r,"emulator-config-failed"),Ht(/^https?:\/\//.test(e),r,"invalid-emulator-scheme");const i=!!(n!=null&&n.disableWarnings),s=Mbe(e),{host:a,port:o}=U6t(e),l=o===null?"":`:${o}`;r.config.emulator={url:`${s}//${a}${l}/`},r.settings.appVerificationDisabledForTesting=!0,r.emulatorConfig=Object.freeze({host:a,port:o,protocol:s.replace(":",""),options:Object.freeze({disableWarnings:i})}),i||N6t()}function Mbe(t){const e=t.indexOf(":");return e<0?"":t.substr(0,e+1)}function U6t(t){const e=Mbe(t),n=/(\/\/)?([^?#/]+)/.exec(t.substr(e.length));if(!n)return{host:"",port:null};const r=n[2].split("@").pop()||"",i=/^(\[[^\]]+\])(:|$)/.exec(r);if(i){const s=i[1];return{host:s,port:$ee(r.substr(s.length+1))}}else{const[s,a]=r.split(":");return{host:s,port:$ee(a)}}}function $ee(t){if(!t)return null;const e=Number(t);return isNaN(e)?null:e}function N6t(){function t(){const e=document.createElement("p"),n=e.style;e.innerText="Running in emulator mode. Do not use with production credentials.",n.position="fixed",n.width="100%",n.backgroundColor="#ffffff",n.border=".1em solid #000000",n.color="#b50000",n.bottom="0px",n.left="0px",n.margin="0px",n.zIndex="10000",n.textAlign="center",e.classList.add("firebase-emulator-warning"),document.body.appendChild(e)}typeof console<"u"&&typeof console.info=="function"&&console.info("WARNING: You are using the Auth Emulator, which is intended for local testing only. Do not use with production credentials."),typeof window<"u"&&typeof document<"u"&&(document.readyState==="loading"?window.addEventListener("DOMContentLoaded",t):t())}/** * @license * Copyright 2020 Google LLC * @@ -9999,7 +9999,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class lA{constructor(e,n){this.providerId=e,this.signInMethod=n}toJSON(){return nf("not implemented")}_getIdTokenResponse(e){return nf("not implemented")}_linkToIdToken(e,n){return nf("not implemented")}_getReauthenticationResolver(e){return nf("not implemented")}}async function N6t(t,e){return vm(t,"POST","/v1/accounts:signUp",e)}/** + */class uA{constructor(e,n){this.providerId=e,this.signInMethod=n}toJSON(){return nf("not implemented")}_getIdTokenResponse(e){return nf("not implemented")}_linkToIdToken(e,n){return nf("not implemented")}_getReauthenticationResolver(e){return nf("not implemented")}}async function L6t(t,e){return vm(t,"POST","/v1/accounts:signUp",e)}/** * @license * Copyright 2020 Google LLC * @@ -10014,7 +10014,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function L6t(t,e){return Sw(t,"POST","/v1/accounts:signInWithPassword",mm(t,e))}/** + */async function X6t(t,e){return Sw(t,"POST","/v1/accounts:signInWithPassword",mm(t,e))}/** * @license * Copyright 2020 Google LLC * @@ -10029,7 +10029,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function X6t(t,e){return Sw(t,"POST","/v1/accounts:signInWithEmailLink",mm(t,e))}async function C6t(t,e){return Sw(t,"POST","/v1/accounts:signInWithEmailLink",mm(t,e))}/** + */async function C6t(t,e){return Sw(t,"POST","/v1/accounts:signInWithEmailLink",mm(t,e))}async function K6t(t,e){return Sw(t,"POST","/v1/accounts:signInWithEmailLink",mm(t,e))}/** * @license * Copyright 2020 Google LLC * @@ -10044,7 +10044,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Z6 extends lA{constructor(e,n,r,i=null){super("password",r),this._email=e,this._password=n,this._tenantId=i}static _fromEmailAndPassword(e,n){return new Z6(e,n,"password")}static _fromEmailAndCode(e,n,r=null){return new Z6(e,n,"emailLink",r)}toJSON(){return{email:this._email,password:this._password,signInMethod:this.signInMethod,tenantId:this._tenantId}}static fromJSON(e){const n=typeof e=="string"?JSON.parse(e):e;if(n!=null&&n.email&&(n!=null&&n.password)){if(n.signInMethod==="password")return this._fromEmailAndPassword(n.email,n.password);if(n.signInMethod==="emailLink")return this._fromEmailAndCode(n.email,n.password,n.tenantId)}return null}async _getIdTokenResponse(e){switch(this.signInMethod){case"password":const n={returnSecureToken:!0,email:this._email,password:this._password,clientType:"CLIENT_TYPE_WEB"};return Z4(e,n,"signInWithPassword",L6t);case"emailLink":return X6t(e,{email:this._email,oobCode:this._password});default:Fu(e,"internal-error")}}async _linkToIdToken(e,n){switch(this.signInMethod){case"password":const r={idToken:n,returnSecureToken:!0,email:this._email,password:this._password,clientType:"CLIENT_TYPE_WEB"};return Z4(e,r,"signUpPassword",N6t);case"emailLink":return C6t(e,{idToken:n,email:this._email,oobCode:this._password});default:Fu(e,"internal-error")}}_getReauthenticationResolver(e){return this._getIdTokenResponse(e)}}/** + */class j6 extends uA{constructor(e,n,r,i=null){super("password",r),this._email=e,this._password=n,this._tenantId=i}static _fromEmailAndPassword(e,n){return new j6(e,n,"password")}static _fromEmailAndCode(e,n,r=null){return new j6(e,n,"emailLink",r)}toJSON(){return{email:this._email,password:this._password,signInMethod:this.signInMethod,tenantId:this._tenantId}}static fromJSON(e){const n=typeof e=="string"?JSON.parse(e):e;if(n!=null&&n.email&&(n!=null&&n.password)){if(n.signInMethod==="password")return this._fromEmailAndPassword(n.email,n.password);if(n.signInMethod==="emailLink")return this._fromEmailAndCode(n.email,n.password,n.tenantId)}return null}async _getIdTokenResponse(e){switch(this.signInMethod){case"password":const n={returnSecureToken:!0,email:this._email,password:this._password,clientType:"CLIENT_TYPE_WEB"};return Z4(e,n,"signInWithPassword",X6t);case"emailLink":return C6t(e,{email:this._email,oobCode:this._password});default:Fu(e,"internal-error")}}async _linkToIdToken(e,n){switch(this.signInMethod){case"password":const r={idToken:n,returnSecureToken:!0,email:this._email,password:this._password,clientType:"CLIENT_TYPE_WEB"};return Z4(e,r,"signUpPassword",L6t);case"emailLink":return K6t(e,{idToken:n,email:this._email,oobCode:this._password});default:Fu(e,"internal-error")}}_getReauthenticationResolver(e){return this._getIdTokenResponse(e)}}/** * @license * Copyright 2020 Google LLC * @@ -10074,7 +10074,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const K6t="http://localhost";class t0 extends lA{constructor(){super(...arguments),this.pendingToken=null}static _fromParams(e){const n=new t0(e.providerId,e.signInMethod);return e.idToken||e.accessToken?(e.idToken&&(n.idToken=e.idToken),e.accessToken&&(n.accessToken=e.accessToken),e.nonce&&!e.pendingToken&&(n.nonce=e.nonce),e.pendingToken&&(n.pendingToken=e.pendingToken)):e.oauthToken&&e.oauthTokenSecret?(n.accessToken=e.oauthToken,n.secret=e.oauthTokenSecret):Fu("argument-error"),n}toJSON(){return{idToken:this.idToken,accessToken:this.accessToken,secret:this.secret,nonce:this.nonce,pendingToken:this.pendingToken,providerId:this.providerId,signInMethod:this.signInMethod}}static fromJSON(e){const n=typeof e=="string"?JSON.parse(e):e,{providerId:r,signInMethod:i}=n,s=rA(n,["providerId","signInMethod"]);if(!r||!i)return null;const a=new t0(r,i);return a.idToken=s.idToken||void 0,a.accessToken=s.accessToken||void 0,a.secret=s.secret,a.nonce=s.nonce,a.pendingToken=s.pendingToken||null,a}_getIdTokenResponse(e){const n=this.buildRequest();return Z1(e,n)}_linkToIdToken(e,n){const r=this.buildRequest();return r.idToken=n,Z1(e,r)}_getReauthenticationResolver(e){const n=this.buildRequest();return n.autoCreate=!1,Z1(e,n)}buildRequest(){const e={requestUri:K6t,returnSecureToken:!0};if(this.pendingToken)e.pendingToken=this.pendingToken;else{const n={};this.idToken&&(n.id_token=this.idToken),this.accessToken&&(n.access_token=this.accessToken),this.secret&&(n.oauth_token_secret=this.secret),n.providerId=this.providerId,this.nonce&&!this.pendingToken&&(n.nonce=this.nonce),e.postBody=cw(n)}return e}}/** + */const q6t="http://localhost";class t0 extends uA{constructor(){super(...arguments),this.pendingToken=null}static _fromParams(e){const n=new t0(e.providerId,e.signInMethod);return e.idToken||e.accessToken?(e.idToken&&(n.idToken=e.idToken),e.accessToken&&(n.accessToken=e.accessToken),e.nonce&&!e.pendingToken&&(n.nonce=e.nonce),e.pendingToken&&(n.pendingToken=e.pendingToken)):e.oauthToken&&e.oauthTokenSecret?(n.accessToken=e.oauthToken,n.secret=e.oauthTokenSecret):Fu("argument-error"),n}toJSON(){return{idToken:this.idToken,accessToken:this.accessToken,secret:this.secret,nonce:this.nonce,pendingToken:this.pendingToken,providerId:this.providerId,signInMethod:this.signInMethod}}static fromJSON(e){const n=typeof e=="string"?JSON.parse(e):e,{providerId:r,signInMethod:i}=n,s=iA(n,["providerId","signInMethod"]);if(!r||!i)return null;const a=new t0(r,i);return a.idToken=s.idToken||void 0,a.accessToken=s.accessToken||void 0,a.secret=s.secret,a.nonce=s.nonce,a.pendingToken=s.pendingToken||null,a}_getIdTokenResponse(e){const n=this.buildRequest();return Z1(e,n)}_linkToIdToken(e,n){const r=this.buildRequest();return r.idToken=n,Z1(e,r)}_getReauthenticationResolver(e){const n=this.buildRequest();return n.autoCreate=!1,Z1(e,n)}buildRequest(){const e={requestUri:q6t,returnSecureToken:!0};if(this.pendingToken)e.pendingToken=this.pendingToken;else{const n={};this.idToken&&(n.id_token=this.idToken),this.accessToken&&(n.access_token=this.accessToken),this.secret&&(n.oauth_token_secret=this.secret),n.providerId=this.providerId,this.nonce&&!this.pendingToken&&(n.nonce=this.nonce),e.postBody=cw(n)}return e}}/** * @license * Copyright 2020 Google LLC * @@ -10089,7 +10089,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function q6t(t){switch(t){case"recoverEmail":return"RECOVER_EMAIL";case"resetPassword":return"PASSWORD_RESET";case"signIn":return"EMAIL_SIGNIN";case"verifyEmail":return"VERIFY_EMAIL";case"verifyAndChangeEmail":return"VERIFY_AND_CHANGE_EMAIL";case"revertSecondFactorAddition":return"REVERT_SECOND_FACTOR_ADDITION";default:return null}}function D6t(t){const e=E3(M3(t)).link,n=e?E3(M3(e)).deep_link_id:null,r=E3(M3(t)).deep_link_id;return(r?E3(M3(r)).link:null)||r||n||e||t}class uA{constructor(e){var n,r,i,s,a,o;const l=E3(M3(e)),u=(n=l.apiKey)!==null&&n!==void 0?n:null,c=(r=l.oobCode)!==null&&r!==void 0?r:null,d=q6t((i=l.mode)!==null&&i!==void 0?i:null);Ht(u&&c&&d,"argument-error"),this.apiKey=u,this.operation=d,this.code=c,this.continueUrl=(s=l.continueUrl)!==null&&s!==void 0?s:null,this.languageCode=(a=l.languageCode)!==null&&a!==void 0?a:null,this.tenantId=(o=l.tenantId)!==null&&o!==void 0?o:null}static parseLink(e){const n=D6t(e);try{return new uA(n)}catch{return null}}}/** + */function D6t(t){switch(t){case"recoverEmail":return"RECOVER_EMAIL";case"resetPassword":return"PASSWORD_RESET";case"signIn":return"EMAIL_SIGNIN";case"verifyEmail":return"VERIFY_EMAIL";case"verifyAndChangeEmail":return"VERIFY_AND_CHANGE_EMAIL";case"revertSecondFactorAddition":return"REVERT_SECOND_FACTOR_ADDITION";default:return null}}function W6t(t){const e=w3(E3(t)).link,n=e?w3(E3(e)).deep_link_id:null,r=w3(E3(t)).deep_link_id;return(r?w3(E3(r)).link:null)||r||n||e||t}class cA{constructor(e){var n,r,i,s,a,o;const l=w3(E3(e)),u=(n=l.apiKey)!==null&&n!==void 0?n:null,c=(r=l.oobCode)!==null&&r!==void 0?r:null,d=D6t((i=l.mode)!==null&&i!==void 0?i:null);Ht(u&&c&&d,"argument-error"),this.apiKey=u,this.operation=d,this.code=c,this.continueUrl=(s=l.continueUrl)!==null&&s!==void 0?s:null,this.languageCode=(a=l.languageCode)!==null&&a!==void 0?a:null,this.tenantId=(o=l.tenantId)!==null&&o!==void 0?o:null}static parseLink(e){const n=W6t(e);try{return new cA(n)}catch{return null}}}/** * @license * Copyright 2020 Google LLC * @@ -10104,7 +10104,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class _y{constructor(){this.providerId=_y.PROVIDER_ID}static credential(e,n){return Z6._fromEmailAndPassword(e,n)}static credentialWithLink(e,n){const r=uA.parseLink(n);return Ht(r,"argument-error"),Z6._fromEmailAndCode(e,r.code,r.tenantId)}}_y.PROVIDER_ID="password";_y.EMAIL_PASSWORD_SIGN_IN_METHOD="password";_y.EMAIL_LINK_SIGN_IN_METHOD="emailLink";/** + */class Qy{constructor(){this.providerId=Qy.PROVIDER_ID}static credential(e,n){return j6._fromEmailAndPassword(e,n)}static credentialWithLink(e,n){const r=cA.parseLink(n);return Ht(r,"argument-error"),j6._fromEmailAndCode(e,r.code,r.tenantId)}}Qy.PROVIDER_ID="password";Qy.EMAIL_PASSWORD_SIGN_IN_METHOD="password";Qy.EMAIL_LINK_SIGN_IN_METHOD="emailLink";/** * @license * Copyright 2020 Google LLC * @@ -10119,7 +10119,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Rbe{constructor(e){this.providerId=e,this.defaultLanguageCode=null,this.customParameters={}}setDefaultLanguage(e){this.defaultLanguageCode=e}setCustomParameters(e){return this.customParameters=e,this}getCustomParameters(){return this.customParameters}}/** + */class Pbe{constructor(e){this.providerId=e,this.defaultLanguageCode=null,this.customParameters={}}setDefaultLanguage(e){this.defaultLanguageCode=e}setCustomParameters(e){return this.customParameters=e,this}getCustomParameters(){return this.customParameters}}/** * @license * Copyright 2019 Google LLC * @@ -10134,7 +10134,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class xw extends Rbe{constructor(){super(...arguments),this.scopes=[]}addScope(e){return this.scopes.includes(e)||this.scopes.push(e),this}getScopes(){return[...this.scopes]}}/** + */class xw extends Pbe{constructor(){super(...arguments),this.scopes=[]}addScope(e){return this.scopes.includes(e)||this.scopes.push(e),this}getScopes(){return[...this.scopes]}}/** * @license * Copyright 2020 Google LLC * @@ -10209,7 +10209,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function W6t(t,e){return Sw(t,"POST","/v1/accounts:signUp",mm(t,e))}/** + */async function A6t(t,e){return Sw(t,"POST","/v1/accounts:signUp",mm(t,e))}/** * @license * Copyright 2020 Google LLC * @@ -10224,7 +10224,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class n0{constructor(e){this.user=e.user,this.providerId=e.providerId,this._tokenResponse=e._tokenResponse,this.operationType=e.operationType}static async _fromIdTokenResponse(e,n,r,i=!1){const s=await rf._fromIdTokenResponse(e,r,i),a=nte(r);return new n0({user:s,providerId:a,_tokenResponse:r,operationType:n})}static async _forOperation(e,n,r){await e._updateTokensIfNecessary(r,!0);const i=nte(r);return new n0({user:e,providerId:i,_tokenResponse:r,operationType:n})}}function nte(t){return t.providerId?t.providerId:"phoneNumber"in t?"phone":null}/** + */class n0{constructor(e){this.user=e.user,this.providerId=e.providerId,this._tokenResponse=e._tokenResponse,this.operationType=e.operationType}static async _fromIdTokenResponse(e,n,r,i=!1){const s=await rf._fromIdTokenResponse(e,r,i),a=ete(r);return new n0({user:s,providerId:a,_tokenResponse:r,operationType:n})}static async _forOperation(e,n,r){await e._updateTokensIfNecessary(r,!0);const i=ete(r);return new n0({user:e,providerId:i,_tokenResponse:r,operationType:n})}}function ete(t){return t.providerId?t.providerId:"phoneNumber"in t?"phone":null}/** * @license * Copyright 2020 Google LLC * @@ -10239,7 +10239,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class oR extends Zf{constructor(e,n,r,i){var s;super(n.code,n.message),this.operationType=r,this.user=i,Object.setPrototypeOf(this,oR.prototype),this.customData={appName:e.name,tenantId:(s=e.tenantId)!==null&&s!==void 0?s:void 0,_serverResponse:n.customData._serverResponse,operationType:r}}static _fromErrorAndOperation(e,n,r,i){return new oR(e,n,r,i)}}function Vbe(t,e,n,r){return(e==="reauthenticate"?n._getReauthenticationResolver(t):n._getIdTokenResponse(t)).catch(s=>{throw s.code==="auth/multi-factor-auth-required"?oR._fromErrorAndOperation(t,s,e,r):s})}async function A6t(t,e,n=!1){const r=await j6(t,e._linkToIdToken(t.auth,await t.getIdToken()),n);return n0._forOperation(t,"link",r)}/** + */class aR extends Zf{constructor(e,n,r,i){var s;super(n.code,n.message),this.operationType=r,this.user=i,Object.setPrototypeOf(this,aR.prototype),this.customData={appName:e.name,tenantId:(s=e.tenantId)!==null&&s!==void 0?s:void 0,_serverResponse:n.customData._serverResponse,operationType:r}}static _fromErrorAndOperation(e,n,r,i){return new aR(e,n,r,i)}}function Rbe(t,e,n,r){return(e==="reauthenticate"?n._getReauthenticationResolver(t):n._getIdTokenResponse(t)).catch(s=>{throw s.code==="auth/multi-factor-auth-required"?aR._fromErrorAndOperation(t,s,e,r):s})}async function G6t(t,e,n=!1){const r=await F6(t,e._linkToIdToken(t.auth,await t.getIdToken()),n);return n0._forOperation(t,"link",r)}/** * @license * Copyright 2019 Google LLC * @@ -10254,7 +10254,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function G6t(t,e,n=!1){const{auth:r}=t;if(qc(r.app))return Promise.reject(cf(r));const i="reauthenticate";try{const s=await j6(t,Vbe(r,i,e,t),n);Ht(s.idToken,r,"internal-error");const a=aA(s.idToken);Ht(a,r,"internal-error");const{sub:o}=a;return Ht(t.uid===o,r,"user-mismatch"),n0._forOperation(t,i,s)}catch(s){throw(s==null?void 0:s.code)==="auth/user-not-found"&&Fu(r,"user-mismatch"),s}}/** + */async function F6t(t,e,n=!1){const{auth:r}=t;if(qc(r.app))return Promise.reject(cf(r));const i="reauthenticate";try{const s=await F6(t,Rbe(r,i,e,t),n);Ht(s.idToken,r,"internal-error");const a=oA(s.idToken);Ht(a,r,"internal-error");const{sub:o}=a;return Ht(t.uid===o,r,"user-mismatch"),n0._forOperation(t,i,s)}catch(s){throw(s==null?void 0:s.code)==="auth/user-not-found"&&Fu(r,"user-mismatch"),s}}/** * @license * Copyright 2020 Google LLC * @@ -10269,7 +10269,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function zbe(t,e,n=!1){if(qc(t.app))return Promise.reject(cf(t));const r="signIn",i=await Vbe(t,r,e),s=await n0._fromIdTokenResponse(t,r,i);return n||await t._updateCurrentUser(s.user),s}async function F6t(t,e){return zbe(C0(t),e)}/** + */async function Vbe(t,e,n=!1){if(qc(t.app))return Promise.reject(cf(t));const r="signIn",i=await Rbe(t,r,e),s=await n0._fromIdTokenResponse(t,r,i);return n||await t._updateCurrentUser(s.user),s}async function j6t(t,e){return Vbe(C0(t),e)}/** * @license * Copyright 2020 Google LLC * @@ -10284,7 +10284,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function kbe(t){const e=C0(t);e._getPasswordPolicyInternal()&&await e._updatePasswordPolicy()}async function j6t(t,e,n){if(qc(t.app))return Promise.reject(cf(t));const r=C0(t),a=await Z4(r,{returnSecureToken:!0,email:e,password:n,clientType:"CLIENT_TYPE_WEB"},"signUpPassword",W6t).catch(l=>{throw l.code==="auth/password-does-not-meet-requirements"&&kbe(t),l}),o=await n0._fromIdTokenResponse(r,"signIn",a);return await r._updateCurrentUser(o.user),o}function rte(t,e,n){return qc(t.app)?Promise.reject(cf(t)):F6t(la(t),_y.credential(e,n)).catch(async r=>{throw r.code==="auth/password-does-not-meet-requirements"&&kbe(t),r})}function Z6t(t,e,n,r){return la(t).onIdTokenChanged(e,n,r)}function J6t(t,e,n){return la(t).beforeAuthStateChanged(e,n)}const lR="__sak";/** + */async function zbe(t){const e=C0(t);e._getPasswordPolicyInternal()&&await e._updatePasswordPolicy()}async function Z6t(t,e,n){if(qc(t.app))return Promise.reject(cf(t));const r=C0(t),a=await Z4(r,{returnSecureToken:!0,email:e,password:n,clientType:"CLIENT_TYPE_WEB"},"signUpPassword",A6t).catch(l=>{throw l.code==="auth/password-does-not-meet-requirements"&&zbe(t),l}),o=await n0._fromIdTokenResponse(r,"signIn",a);return await r._updateCurrentUser(o.user),o}function tte(t,e,n){return qc(t.app)?Promise.reject(cf(t)):j6t(la(t),Qy.credential(e,n)).catch(async r=>{throw r.code==="auth/password-does-not-meet-requirements"&&zbe(t),r})}function J6t(t,e,n,r){return la(t).onIdTokenChanged(e,n,r)}function Y6t(t,e,n){return la(t).beforeAuthStateChanged(e,n)}const oR="__sak";/** * @license * Copyright 2019 Google LLC * @@ -10299,7 +10299,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Obe{constructor(e,n){this.storageRetriever=e,this.type=n}_isAvailable(){try{return this.storage?(this.storage.setItem(lR,"1"),this.storage.removeItem(lR),Promise.resolve(!0)):Promise.resolve(!1)}catch{return Promise.resolve(!1)}}_set(e,n){return this.storage.setItem(e,JSON.stringify(n)),Promise.resolve()}_get(e){const n=this.storage.getItem(e);return Promise.resolve(n?JSON.parse(n):null)}_remove(e){return this.storage.removeItem(e),Promise.resolve()}get storage(){return this.storageRetriever()}}/** + */class kbe{constructor(e,n){this.storageRetriever=e,this.type=n}_isAvailable(){try{return this.storage?(this.storage.setItem(oR,"1"),this.storage.removeItem(oR),Promise.resolve(!0)):Promise.resolve(!1)}catch{return Promise.resolve(!1)}}_set(e,n){return this.storage.setItem(e,JSON.stringify(n)),Promise.resolve()}_get(e){const n=this.storage.getItem(e);return Promise.resolve(n?JSON.parse(n):null)}_remove(e){return this.storage.removeItem(e),Promise.resolve()}get storage(){return this.storageRetriever()}}/** * @license * Copyright 2020 Google LLC * @@ -10314,7 +10314,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const Y6t=1e3,B6t=10;class Ibe extends Obe{constructor(){super(()=>window.localStorage,"LOCAL"),this.boundEventHandler=(e,n)=>this.onStorageEvent(e,n),this.listeners={},this.localCache={},this.pollTimer=null,this.fallbackToPolling=wbe(),this._shouldAllowMigration=!0}forAllChangedKeys(e){for(const n of Object.keys(this.listeners)){const r=this.storage.getItem(n),i=this.localCache[n];r!==i&&e(n,i,r)}}onStorageEvent(e,n=!1){if(!e.key){this.forAllChangedKeys((a,o,l)=>{this.notifyListeners(a,l)});return}const r=e.key;n?this.detachListener():this.stopPolling();const i=()=>{const a=this.storage.getItem(r);!n&&this.localCache[r]===a||this.notifyListeners(r,a)},s=this.storage.getItem(r);v6t()&&s!==e.newValue&&e.newValue!==e.oldValue?setTimeout(i,B6t):i()}notifyListeners(e,n){this.localCache[e]=n;const r=this.listeners[e];if(r)for(const i of Array.from(r))i(n&&JSON.parse(n))}startPolling(){this.stopPolling(),this.pollTimer=setInterval(()=>{this.forAllChangedKeys((e,n,r)=>{this.onStorageEvent(new StorageEvent("storage",{key:e,oldValue:n,newValue:r}),!0)})},Y6t)}stopPolling(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null)}attachListener(){window.addEventListener("storage",this.boundEventHandler)}detachListener(){window.removeEventListener("storage",this.boundEventHandler)}_addListener(e,n){Object.keys(this.listeners).length===0&&(this.fallbackToPolling?this.startPolling():this.attachListener()),this.listeners[e]||(this.listeners[e]=new Set,this.localCache[e]=this.storage.getItem(e)),this.listeners[e].add(n)}_removeListener(e,n){this.listeners[e]&&(this.listeners[e].delete(n),this.listeners[e].size===0&&delete this.listeners[e]),Object.keys(this.listeners).length===0&&(this.detachListener(),this.stopPolling())}async _set(e,n){await super._set(e,n),this.localCache[e]=JSON.stringify(n)}async _get(e){const n=await super._get(e);return this.localCache[e]=JSON.stringify(n),n}async _remove(e){await super._remove(e),delete this.localCache[e]}}Ibe.type="LOCAL";const H6t=Ibe;/** + */const B6t=1e3,H6t=10;class Obe extends kbe{constructor(){super(()=>window.localStorage,"LOCAL"),this.boundEventHandler=(e,n)=>this.onStorageEvent(e,n),this.listeners={},this.localCache={},this.pollTimer=null,this.fallbackToPolling=Tbe(),this._shouldAllowMigration=!0}forAllChangedKeys(e){for(const n of Object.keys(this.listeners)){const r=this.storage.getItem(n),i=this.localCache[n];r!==i&&e(n,i,r)}}onStorageEvent(e,n=!1){if(!e.key){this.forAllChangedKeys((a,o,l)=>{this.notifyListeners(a,l)});return}const r=e.key;n?this.detachListener():this.stopPolling();const i=()=>{const a=this.storage.getItem(r);!n&&this.localCache[r]===a||this.notifyListeners(r,a)},s=this.storage.getItem(r);g6t()&&s!==e.newValue&&e.newValue!==e.oldValue?setTimeout(i,H6t):i()}notifyListeners(e,n){this.localCache[e]=n;const r=this.listeners[e];if(r)for(const i of Array.from(r))i(n&&JSON.parse(n))}startPolling(){this.stopPolling(),this.pollTimer=setInterval(()=>{this.forAllChangedKeys((e,n,r)=>{this.onStorageEvent(new StorageEvent("storage",{key:e,oldValue:n,newValue:r}),!0)})},B6t)}stopPolling(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null)}attachListener(){window.addEventListener("storage",this.boundEventHandler)}detachListener(){window.removeEventListener("storage",this.boundEventHandler)}_addListener(e,n){Object.keys(this.listeners).length===0&&(this.fallbackToPolling?this.startPolling():this.attachListener()),this.listeners[e]||(this.listeners[e]=new Set,this.localCache[e]=this.storage.getItem(e)),this.listeners[e].add(n)}_removeListener(e,n){this.listeners[e]&&(this.listeners[e].delete(n),this.listeners[e].size===0&&delete this.listeners[e]),Object.keys(this.listeners).length===0&&(this.detachListener(),this.stopPolling())}async _set(e,n){await super._set(e,n),this.localCache[e]=JSON.stringify(n)}async _get(e){const n=await super._get(e);return this.localCache[e]=JSON.stringify(n),n}async _remove(e){await super._remove(e),delete this.localCache[e]}}Obe.type="LOCAL";const Q6t=Obe;/** * @license * Copyright 2020 Google LLC * @@ -10329,7 +10329,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Ube extends Obe{constructor(){super(()=>window.sessionStorage,"SESSION")}_addListener(e,n){}_removeListener(e,n){}}Ube.type="SESSION";const Nbe=Ube;/** + */class Ibe extends kbe{constructor(){super(()=>window.sessionStorage,"SESSION")}_addListener(e,n){}_removeListener(e,n){}}Ibe.type="SESSION";const Ube=Ibe;/** * @license * Copyright 2019 Google LLC * @@ -10344,7 +10344,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Q6t(t){return Promise.all(t.map(async e=>{try{return{fulfilled:!0,value:await e}}catch(n){return{fulfilled:!1,reason:n}}}))}/** + */function _6t(t){return Promise.all(t.map(async e=>{try{return{fulfilled:!0,value:await e}}catch(n){return{fulfilled:!1,reason:n}}}))}/** * @license * Copyright 2019 Google LLC * @@ -10359,7 +10359,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class _9{constructor(e){this.eventTarget=e,this.handlersMap={},this.boundEventHandler=this.handleEvent.bind(this)}static _getInstance(e){const n=this.receivers.find(i=>i.isListeningto(e));if(n)return n;const r=new _9(e);return this.receivers.push(r),r}isListeningto(e){return this.eventTarget===e}async handleEvent(e){const n=e,{eventId:r,eventType:i,data:s}=n.data,a=this.handlersMap[i];if(!(a!=null&&a.size))return;n.ports[0].postMessage({status:"ack",eventId:r,eventType:i});const o=Array.from(a).map(async u=>u(n.origin,s)),l=await Q6t(o);n.ports[0].postMessage({status:"done",eventId:r,eventType:i,response:l})}_subscribe(e,n){Object.keys(this.handlersMap).length===0&&this.eventTarget.addEventListener("message",this.boundEventHandler),this.handlersMap[e]||(this.handlersMap[e]=new Set),this.handlersMap[e].add(n)}_unsubscribe(e,n){this.handlersMap[e]&&n&&this.handlersMap[e].delete(n),(!n||this.handlersMap[e].size===0)&&delete this.handlersMap[e],Object.keys(this.handlersMap).length===0&&this.eventTarget.removeEventListener("message",this.boundEventHandler)}}_9.receivers=[];/** + */class _9{constructor(e){this.eventTarget=e,this.handlersMap={},this.boundEventHandler=this.handleEvent.bind(this)}static _getInstance(e){const n=this.receivers.find(i=>i.isListeningto(e));if(n)return n;const r=new _9(e);return this.receivers.push(r),r}isListeningto(e){return this.eventTarget===e}async handleEvent(e){const n=e,{eventId:r,eventType:i,data:s}=n.data,a=this.handlersMap[i];if(!(a!=null&&a.size))return;n.ports[0].postMessage({status:"ack",eventId:r,eventType:i});const o=Array.from(a).map(async u=>u(n.origin,s)),l=await _6t(o);n.ports[0].postMessage({status:"done",eventId:r,eventType:i,response:l})}_subscribe(e,n){Object.keys(this.handlersMap).length===0&&this.eventTarget.addEventListener("message",this.boundEventHandler),this.handlersMap[e]||(this.handlersMap[e]=new Set),this.handlersMap[e].add(n)}_unsubscribe(e,n){this.handlersMap[e]&&n&&this.handlersMap[e].delete(n),(!n||this.handlersMap[e].size===0)&&delete this.handlersMap[e],Object.keys(this.handlersMap).length===0&&this.eventTarget.removeEventListener("message",this.boundEventHandler)}}_9.receivers=[];/** * @license * Copyright 2020 Google LLC * @@ -10374,7 +10374,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function cA(t="",e=10){let n="";for(let r=0;r{const u=cA("",20);i.port1.start();const c=setTimeout(()=>{l(new Error("unsupported_event"))},r);a={messageChannel:i,onMessage(d){const f=d;if(f.data.eventId===u)switch(f.data.status){case"ack":clearTimeout(c),s=setTimeout(()=>{l(new Error("timeout"))},3e3);break;case"done":clearTimeout(s),o(f.data.response);break;default:clearTimeout(c),clearTimeout(s),l(new Error("invalid_response"));break}}},this.handlers.add(a),i.port1.addEventListener("message",a.onMessage),this.target.postMessage({eventType:e,eventId:u,data:n},[i.port2])}).finally(()=>{a&&this.removeMessageHandler(a)})}}/** + */class $6t{constructor(e){this.target=e,this.handlers=new Set}removeMessageHandler(e){e.messageChannel&&(e.messageChannel.port1.removeEventListener("message",e.onMessage),e.messageChannel.port1.close()),this.handlers.delete(e)}async _send(e,n,r=50){const i=typeof MessageChannel<"u"?new MessageChannel:null;if(!i)throw new Error("connection_unavailable");let s,a;return new Promise((o,l)=>{const u=dA("",20);i.port1.start();const c=setTimeout(()=>{l(new Error("unsupported_event"))},r);a={messageChannel:i,onMessage(d){const f=d;if(f.data.eventId===u)switch(f.data.status){case"ack":clearTimeout(c),s=setTimeout(()=>{l(new Error("timeout"))},3e3);break;case"done":clearTimeout(s),o(f.data.response);break;default:clearTimeout(c),clearTimeout(s),l(new Error("invalid_response"));break}}},this.handlers.add(a),i.port1.addEventListener("message",a.onMessage),this.target.postMessage({eventType:e,eventId:u,data:n},[i.port2])}).finally(()=>{a&&this.removeMessageHandler(a)})}}/** * @license * Copyright 2020 Google LLC * @@ -10404,7 +10404,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Yc(){return window}function $6t(t){Yc().location.href=t}/** + */function Yc(){return window}function eTt(t){Yc().location.href=t}/** * @license * Copyright 2020 Google LLC. * @@ -10419,7 +10419,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Lbe(){return typeof Yc().WorkerGlobalScope<"u"&&typeof Yc().importScripts=="function"}async function eTt(){if(!(navigator!=null&&navigator.serviceWorker))return null;try{return(await navigator.serviceWorker.ready).active}catch{return null}}function tTt(){var t;return((t=navigator==null?void 0:navigator.serviceWorker)===null||t===void 0?void 0:t.controller)||null}function nTt(){return Lbe()?self:null}/** + */function Nbe(){return typeof Yc().WorkerGlobalScope<"u"&&typeof Yc().importScripts=="function"}async function tTt(){if(!(navigator!=null&&navigator.serviceWorker))return null;try{return(await navigator.serviceWorker.ready).active}catch{return null}}function nTt(){var t;return((t=navigator==null?void 0:navigator.serviceWorker)===null||t===void 0?void 0:t.controller)||null}function rTt(){return Nbe()?self:null}/** * @license * Copyright 2019 Google LLC * @@ -10434,7 +10434,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const Xbe="firebaseLocalStorageDb",rTt=1,uR="firebaseLocalStorage",Cbe="fbase_key";class Tw{constructor(e){this.request=e}toPromise(){return new Promise((e,n)=>{this.request.addEventListener("success",()=>{e(this.request.result)}),this.request.addEventListener("error",()=>{n(this.request.error)})})}}function $9(t,e){return t.transaction([uR],e?"readwrite":"readonly").objectStore(uR)}function iTt(){const t=indexedDB.deleteDatabase(Xbe);return new Tw(t).toPromise()}function J4(){const t=indexedDB.open(Xbe,rTt);return new Promise((e,n)=>{t.addEventListener("error",()=>{n(t.error)}),t.addEventListener("upgradeneeded",()=>{const r=t.result;try{r.createObjectStore(uR,{keyPath:Cbe})}catch(i){n(i)}}),t.addEventListener("success",async()=>{const r=t.result;r.objectStoreNames.contains(uR)?e(r):(r.close(),await iTt(),e(await J4()))})})}async function ite(t,e,n){const r=$9(t,!0).put({[Cbe]:e,value:n});return new Tw(r).toPromise()}async function sTt(t,e){const n=$9(t,!1).get(e),r=await new Tw(n).toPromise();return r===void 0?null:r.value}function ste(t,e){const n=$9(t,!0).delete(e);return new Tw(n).toPromise()}const aTt=800,oTt=3;class Kbe{constructor(){this.type="LOCAL",this._shouldAllowMigration=!0,this.listeners={},this.localCache={},this.pollTimer=null,this.pendingWrites=0,this.receiver=null,this.sender=null,this.serviceWorkerReceiverAvailable=!1,this.activeServiceWorker=null,this._workerInitializationPromise=this.initializeServiceWorkerMessaging().then(()=>{},()=>{})}async _openDb(){return this.db?this.db:(this.db=await J4(),this.db)}async _withRetries(e){let n=0;for(;;)try{const r=await this._openDb();return await e(r)}catch(r){if(n++>oTt)throw r;this.db&&(this.db.close(),this.db=void 0)}}async initializeServiceWorkerMessaging(){return Lbe()?this.initializeReceiver():this.initializeSender()}async initializeReceiver(){this.receiver=_9._getInstance(nTt()),this.receiver._subscribe("keyChanged",async(e,n)=>({keyProcessed:(await this._poll()).includes(n.key)})),this.receiver._subscribe("ping",async(e,n)=>["keyChanged"])}async initializeSender(){var e,n;if(this.activeServiceWorker=await eTt(),!this.activeServiceWorker)return;this.sender=new _6t(this.activeServiceWorker);const r=await this.sender._send("ping",{},800);r&&!((e=r[0])===null||e===void 0)&&e.fulfilled&&!((n=r[0])===null||n===void 0)&&n.value.includes("keyChanged")&&(this.serviceWorkerReceiverAvailable=!0)}async notifyServiceWorker(e){if(!(!this.sender||!this.activeServiceWorker||tTt()!==this.activeServiceWorker))try{await this.sender._send("keyChanged",{key:e},this.serviceWorkerReceiverAvailable?800:50)}catch{}}async _isAvailable(){try{if(!indexedDB)return!1;const e=await J4();return await ite(e,lR,"1"),await ste(e,lR),!0}catch{}return!1}async _withPendingWrite(e){this.pendingWrites++;try{await e()}finally{this.pendingWrites--}}async _set(e,n){return this._withPendingWrite(async()=>(await this._withRetries(r=>ite(r,e,n)),this.localCache[e]=n,this.notifyServiceWorker(e)))}async _get(e){const n=await this._withRetries(r=>sTt(r,e));return this.localCache[e]=n,n}async _remove(e){return this._withPendingWrite(async()=>(await this._withRetries(n=>ste(n,e)),delete this.localCache[e],this.notifyServiceWorker(e)))}async _poll(){const e=await this._withRetries(i=>{const s=$9(i,!1).getAll();return new Tw(s).toPromise()});if(!e)return[];if(this.pendingWrites!==0)return[];const n=[],r=new Set;if(e.length!==0)for(const{fbase_key:i,value:s}of e)r.add(i),JSON.stringify(this.localCache[i])!==JSON.stringify(s)&&(this.notifyListeners(i,s),n.push(i));for(const i of Object.keys(this.localCache))this.localCache[i]&&!r.has(i)&&(this.notifyListeners(i,null),n.push(i));return n}notifyListeners(e,n){this.localCache[e]=n;const r=this.listeners[e];if(r)for(const i of Array.from(r))i(n)}startPolling(){this.stopPolling(),this.pollTimer=setInterval(async()=>this._poll(),aTt)}stopPolling(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null)}_addListener(e,n){Object.keys(this.listeners).length===0&&this.startPolling(),this.listeners[e]||(this.listeners[e]=new Set,this._get(e)),this.listeners[e].add(n)}_removeListener(e,n){this.listeners[e]&&(this.listeners[e].delete(n),this.listeners[e].size===0&&delete this.listeners[e]),Object.keys(this.listeners).length===0&&this.stopPolling()}}Kbe.type="LOCAL";const lTt=Kbe;new yw(3e4,6e4);/** + */const Lbe="firebaseLocalStorageDb",iTt=1,lR="firebaseLocalStorage",Xbe="fbase_key";class Tw{constructor(e){this.request=e}toPromise(){return new Promise((e,n)=>{this.request.addEventListener("success",()=>{e(this.request.result)}),this.request.addEventListener("error",()=>{n(this.request.error)})})}}function $9(t,e){return t.transaction([lR],e?"readwrite":"readonly").objectStore(lR)}function sTt(){const t=indexedDB.deleteDatabase(Lbe);return new Tw(t).toPromise()}function J4(){const t=indexedDB.open(Lbe,iTt);return new Promise((e,n)=>{t.addEventListener("error",()=>{n(t.error)}),t.addEventListener("upgradeneeded",()=>{const r=t.result;try{r.createObjectStore(lR,{keyPath:Xbe})}catch(i){n(i)}}),t.addEventListener("success",async()=>{const r=t.result;r.objectStoreNames.contains(lR)?e(r):(r.close(),await sTt(),e(await J4()))})})}async function nte(t,e,n){const r=$9(t,!0).put({[Xbe]:e,value:n});return new Tw(r).toPromise()}async function aTt(t,e){const n=$9(t,!1).get(e),r=await new Tw(n).toPromise();return r===void 0?null:r.value}function rte(t,e){const n=$9(t,!0).delete(e);return new Tw(n).toPromise()}const oTt=800,lTt=3;class Cbe{constructor(){this.type="LOCAL",this._shouldAllowMigration=!0,this.listeners={},this.localCache={},this.pollTimer=null,this.pendingWrites=0,this.receiver=null,this.sender=null,this.serviceWorkerReceiverAvailable=!1,this.activeServiceWorker=null,this._workerInitializationPromise=this.initializeServiceWorkerMessaging().then(()=>{},()=>{})}async _openDb(){return this.db?this.db:(this.db=await J4(),this.db)}async _withRetries(e){let n=0;for(;;)try{const r=await this._openDb();return await e(r)}catch(r){if(n++>lTt)throw r;this.db&&(this.db.close(),this.db=void 0)}}async initializeServiceWorkerMessaging(){return Nbe()?this.initializeReceiver():this.initializeSender()}async initializeReceiver(){this.receiver=_9._getInstance(rTt()),this.receiver._subscribe("keyChanged",async(e,n)=>({keyProcessed:(await this._poll()).includes(n.key)})),this.receiver._subscribe("ping",async(e,n)=>["keyChanged"])}async initializeSender(){var e,n;if(this.activeServiceWorker=await tTt(),!this.activeServiceWorker)return;this.sender=new $6t(this.activeServiceWorker);const r=await this.sender._send("ping",{},800);r&&!((e=r[0])===null||e===void 0)&&e.fulfilled&&!((n=r[0])===null||n===void 0)&&n.value.includes("keyChanged")&&(this.serviceWorkerReceiverAvailable=!0)}async notifyServiceWorker(e){if(!(!this.sender||!this.activeServiceWorker||nTt()!==this.activeServiceWorker))try{await this.sender._send("keyChanged",{key:e},this.serviceWorkerReceiverAvailable?800:50)}catch{}}async _isAvailable(){try{if(!indexedDB)return!1;const e=await J4();return await nte(e,oR,"1"),await rte(e,oR),!0}catch{}return!1}async _withPendingWrite(e){this.pendingWrites++;try{await e()}finally{this.pendingWrites--}}async _set(e,n){return this._withPendingWrite(async()=>(await this._withRetries(r=>nte(r,e,n)),this.localCache[e]=n,this.notifyServiceWorker(e)))}async _get(e){const n=await this._withRetries(r=>aTt(r,e));return this.localCache[e]=n,n}async _remove(e){return this._withPendingWrite(async()=>(await this._withRetries(n=>rte(n,e)),delete this.localCache[e],this.notifyServiceWorker(e)))}async _poll(){const e=await this._withRetries(i=>{const s=$9(i,!1).getAll();return new Tw(s).toPromise()});if(!e)return[];if(this.pendingWrites!==0)return[];const n=[],r=new Set;if(e.length!==0)for(const{fbase_key:i,value:s}of e)r.add(i),JSON.stringify(this.localCache[i])!==JSON.stringify(s)&&(this.notifyListeners(i,s),n.push(i));for(const i of Object.keys(this.localCache))this.localCache[i]&&!r.has(i)&&(this.notifyListeners(i,null),n.push(i));return n}notifyListeners(e,n){this.localCache[e]=n;const r=this.listeners[e];if(r)for(const i of Array.from(r))i(n)}startPolling(){this.stopPolling(),this.pollTimer=setInterval(async()=>this._poll(),oTt)}stopPolling(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null)}_addListener(e,n){Object.keys(this.listeners).length===0&&this.startPolling(),this.listeners[e]||(this.listeners[e]=new Set,this._get(e)),this.listeners[e].add(n)}_removeListener(e,n){this.listeners[e]&&(this.listeners[e].delete(n),this.listeners[e].size===0&&delete this.listeners[e]),Object.keys(this.listeners).length===0&&this.stopPolling()}}Cbe.type="LOCAL";const uTt=Cbe;new yw(3e4,6e4);/** * @license * Copyright 2021 Google LLC * @@ -10449,7 +10449,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function uTt(t,e){return e?sf(e):(Ht(t._popupRedirectResolver,t,"argument-error"),t._popupRedirectResolver)}/** + */function cTt(t,e){return e?sf(e):(Ht(t._popupRedirectResolver,t,"argument-error"),t._popupRedirectResolver)}/** * @license * Copyright 2019 Google LLC * @@ -10464,7 +10464,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class dA extends lA{constructor(e){super("custom","custom"),this.params=e}_getIdTokenResponse(e){return Z1(e,this._buildIdpRequest())}_linkToIdToken(e,n){return Z1(e,this._buildIdpRequest(n))}_getReauthenticationResolver(e){return Z1(e,this._buildIdpRequest())}_buildIdpRequest(e){const n={requestUri:this.params.requestUri,sessionId:this.params.sessionId,postBody:this.params.postBody,tenantId:this.params.tenantId,pendingToken:this.params.pendingToken,returnSecureToken:!0,returnIdpCredential:!0};return e&&(n.idToken=e),n}}function cTt(t){return zbe(t.auth,new dA(t),t.bypassAuthState)}function dTt(t){const{auth:e,user:n}=t;return Ht(n,e,"internal-error"),G6t(n,new dA(t),t.bypassAuthState)}async function fTt(t){const{auth:e,user:n}=t;return Ht(n,e,"internal-error"),A6t(n,new dA(t),t.bypassAuthState)}/** + */class fA extends uA{constructor(e){super("custom","custom"),this.params=e}_getIdTokenResponse(e){return Z1(e,this._buildIdpRequest())}_linkToIdToken(e,n){return Z1(e,this._buildIdpRequest(n))}_getReauthenticationResolver(e){return Z1(e,this._buildIdpRequest())}_buildIdpRequest(e){const n={requestUri:this.params.requestUri,sessionId:this.params.sessionId,postBody:this.params.postBody,tenantId:this.params.tenantId,pendingToken:this.params.pendingToken,returnSecureToken:!0,returnIdpCredential:!0};return e&&(n.idToken=e),n}}function dTt(t){return Vbe(t.auth,new fA(t),t.bypassAuthState)}function fTt(t){const{auth:e,user:n}=t;return Ht(n,e,"internal-error"),F6t(n,new fA(t),t.bypassAuthState)}async function hTt(t){const{auth:e,user:n}=t;return Ht(n,e,"internal-error"),G6t(n,new fA(t),t.bypassAuthState)}/** * @license * Copyright 2020 Google LLC * @@ -10479,7 +10479,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class qbe{constructor(e,n,r,i,s=!1){this.auth=e,this.resolver=r,this.user=i,this.bypassAuthState=s,this.pendingPromise=null,this.eventManager=null,this.filter=Array.isArray(n)?n:[n]}execute(){return new Promise(async(e,n)=>{this.pendingPromise={resolve:e,reject:n};try{this.eventManager=await this.resolver._initialize(this.auth),await this.onExecution(),this.eventManager.registerConsumer(this)}catch(r){this.reject(r)}})}async onAuthEvent(e){const{urlResponse:n,sessionId:r,postBody:i,tenantId:s,error:a,type:o}=e;if(a){this.reject(a);return}const l={auth:this.auth,requestUri:n,sessionId:r,tenantId:s||void 0,postBody:i||void 0,user:this.user,bypassAuthState:this.bypassAuthState};try{this.resolve(await this.getIdpTask(o)(l))}catch(u){this.reject(u)}}onError(e){this.reject(e)}getIdpTask(e){switch(e){case"signInViaPopup":case"signInViaRedirect":return cTt;case"linkViaPopup":case"linkViaRedirect":return fTt;case"reauthViaPopup":case"reauthViaRedirect":return dTt;default:Fu(this.auth,"internal-error")}}resolve(e){If(this.pendingPromise,"Pending promise was never set"),this.pendingPromise.resolve(e),this.unregisterAndCleanUp()}reject(e){If(this.pendingPromise,"Pending promise was never set"),this.pendingPromise.reject(e),this.unregisterAndCleanUp()}unregisterAndCleanUp(){this.eventManager&&this.eventManager.unregisterConsumer(this),this.pendingPromise=null,this.cleanUp()}}/** + */class Kbe{constructor(e,n,r,i,s=!1){this.auth=e,this.resolver=r,this.user=i,this.bypassAuthState=s,this.pendingPromise=null,this.eventManager=null,this.filter=Array.isArray(n)?n:[n]}execute(){return new Promise(async(e,n)=>{this.pendingPromise={resolve:e,reject:n};try{this.eventManager=await this.resolver._initialize(this.auth),await this.onExecution(),this.eventManager.registerConsumer(this)}catch(r){this.reject(r)}})}async onAuthEvent(e){const{urlResponse:n,sessionId:r,postBody:i,tenantId:s,error:a,type:o}=e;if(a){this.reject(a);return}const l={auth:this.auth,requestUri:n,sessionId:r,tenantId:s||void 0,postBody:i||void 0,user:this.user,bypassAuthState:this.bypassAuthState};try{this.resolve(await this.getIdpTask(o)(l))}catch(u){this.reject(u)}}onError(e){this.reject(e)}getIdpTask(e){switch(e){case"signInViaPopup":case"signInViaRedirect":return dTt;case"linkViaPopup":case"linkViaRedirect":return hTt;case"reauthViaPopup":case"reauthViaRedirect":return fTt;default:Fu(this.auth,"internal-error")}}resolve(e){If(this.pendingPromise,"Pending promise was never set"),this.pendingPromise.resolve(e),this.unregisterAndCleanUp()}reject(e){If(this.pendingPromise,"Pending promise was never set"),this.pendingPromise.reject(e),this.unregisterAndCleanUp()}unregisterAndCleanUp(){this.eventManager&&this.eventManager.unregisterConsumer(this),this.pendingPromise=null,this.cleanUp()}}/** * @license * Copyright 2020 Google LLC * @@ -10494,7 +10494,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const hTt=new yw(2e3,1e4);class x1 extends qbe{constructor(e,n,r,i,s){super(e,n,i,s),this.provider=r,this.authWindow=null,this.pollId=null,x1.currentPopupAction&&x1.currentPopupAction.cancel(),x1.currentPopupAction=this}async executeNotNull(){const e=await this.execute();return Ht(e,this.auth,"internal-error"),e}async onExecution(){If(this.filter.length===1,"Popup operations only handle one event");const e=cA();this.authWindow=await this.resolver._openPopup(this.auth,this.provider,this.filter[0],e),this.authWindow.associatedEvent=e,this.resolver._originValidation(this.auth).catch(n=>{this.reject(n)}),this.resolver._isIframeWebStorageSupported(this.auth,n=>{n||this.reject(Jc(this.auth,"web-storage-unsupported"))}),this.pollUserCancellation()}get eventId(){var e;return((e=this.authWindow)===null||e===void 0?void 0:e.associatedEvent)||null}cancel(){this.reject(Jc(this.auth,"cancelled-popup-request"))}cleanUp(){this.authWindow&&this.authWindow.close(),this.pollId&&window.clearTimeout(this.pollId),this.authWindow=null,this.pollId=null,x1.currentPopupAction=null}pollUserCancellation(){const e=()=>{var n,r;if(!((r=(n=this.authWindow)===null||n===void 0?void 0:n.window)===null||r===void 0)&&r.closed){this.pollId=window.setTimeout(()=>{this.pollId=null,this.reject(Jc(this.auth,"popup-closed-by-user"))},8e3);return}this.pollId=window.setTimeout(e,hTt.get())};e()}}x1.currentPopupAction=null;/** + */const pTt=new yw(2e3,1e4);class x1 extends Kbe{constructor(e,n,r,i,s){super(e,n,i,s),this.provider=r,this.authWindow=null,this.pollId=null,x1.currentPopupAction&&x1.currentPopupAction.cancel(),x1.currentPopupAction=this}async executeNotNull(){const e=await this.execute();return Ht(e,this.auth,"internal-error"),e}async onExecution(){If(this.filter.length===1,"Popup operations only handle one event");const e=dA();this.authWindow=await this.resolver._openPopup(this.auth,this.provider,this.filter[0],e),this.authWindow.associatedEvent=e,this.resolver._originValidation(this.auth).catch(n=>{this.reject(n)}),this.resolver._isIframeWebStorageSupported(this.auth,n=>{n||this.reject(Jc(this.auth,"web-storage-unsupported"))}),this.pollUserCancellation()}get eventId(){var e;return((e=this.authWindow)===null||e===void 0?void 0:e.associatedEvent)||null}cancel(){this.reject(Jc(this.auth,"cancelled-popup-request"))}cleanUp(){this.authWindow&&this.authWindow.close(),this.pollId&&window.clearTimeout(this.pollId),this.authWindow=null,this.pollId=null,x1.currentPopupAction=null}pollUserCancellation(){const e=()=>{var n,r;if(!((r=(n=this.authWindow)===null||n===void 0?void 0:n.window)===null||r===void 0)&&r.closed){this.pollId=window.setTimeout(()=>{this.pollId=null,this.reject(Jc(this.auth,"popup-closed-by-user"))},8e3);return}this.pollId=window.setTimeout(e,pTt.get())};e()}}x1.currentPopupAction=null;/** * @license * Copyright 2020 Google LLC * @@ -10509,7 +10509,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const pTt="pendingRedirect",rM=new Map;class mTt extends qbe{constructor(e,n,r=!1){super(e,["signInViaRedirect","linkViaRedirect","reauthViaRedirect","unknown"],n,void 0,r),this.eventId=null}async execute(){let e=rM.get(this.auth._key());if(!e){try{const r=await vTt(this.resolver,this.auth)?await super.execute():null;e=()=>Promise.resolve(r)}catch(n){e=()=>Promise.reject(n)}rM.set(this.auth._key(),e)}return this.bypassAuthState||rM.set(this.auth._key(),()=>Promise.resolve(null)),e()}async onAuthEvent(e){if(e.type==="signInViaRedirect")return super.onAuthEvent(e);if(e.type==="unknown"){this.resolve(null);return}if(e.eventId){const n=await this.auth._redirectUserForId(e.eventId);if(n)return this.user=n,super.onAuthEvent(e);this.resolve(null)}}async onExecution(){}cleanUp(){}}async function vTt(t,e){const n=yTt(e),r=bTt(t);if(!await r._isAvailable())return!1;const i=await r._get(n)==="true";return await r._remove(n),i}function gTt(t,e){rM.set(t._key(),e)}function bTt(t){return sf(t._redirectPersistence)}function yTt(t){return nM(pTt,t.config.apiKey,t.name)}async function STt(t,e,n=!1){if(qc(t.app))return Promise.reject(cf(t));const r=C0(t),i=uTt(r,e),a=await new mTt(r,i,n).execute();return a&&!n&&(delete a.user._redirectEventId,await r._persistUserIfCurrent(a.user),await r._setRedirectUser(null,e)),a}/** + */const mTt="pendingRedirect",rM=new Map;class vTt extends Kbe{constructor(e,n,r=!1){super(e,["signInViaRedirect","linkViaRedirect","reauthViaRedirect","unknown"],n,void 0,r),this.eventId=null}async execute(){let e=rM.get(this.auth._key());if(!e){try{const r=await gTt(this.resolver,this.auth)?await super.execute():null;e=()=>Promise.resolve(r)}catch(n){e=()=>Promise.reject(n)}rM.set(this.auth._key(),e)}return this.bypassAuthState||rM.set(this.auth._key(),()=>Promise.resolve(null)),e()}async onAuthEvent(e){if(e.type==="signInViaRedirect")return super.onAuthEvent(e);if(e.type==="unknown"){this.resolve(null);return}if(e.eventId){const n=await this.auth._redirectUserForId(e.eventId);if(n)return this.user=n,super.onAuthEvent(e);this.resolve(null)}}async onExecution(){}cleanUp(){}}async function gTt(t,e){const n=STt(e),r=yTt(t);if(!await r._isAvailable())return!1;const i=await r._get(n)==="true";return await r._remove(n),i}function bTt(t,e){rM.set(t._key(),e)}function yTt(t){return sf(t._redirectPersistence)}function STt(t){return nM(mTt,t.config.apiKey,t.name)}async function xTt(t,e,n=!1){if(qc(t.app))return Promise.reject(cf(t));const r=C0(t),i=cTt(r,e),a=await new vTt(r,i,n).execute();return a&&!n&&(delete a.user._redirectEventId,await r._persistUserIfCurrent(a.user),await r._setRedirectUser(null,e)),a}/** * @license * Copyright 2020 Google LLC * @@ -10524,7 +10524,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const xTt=10*60*1e3;class TTt{constructor(e){this.auth=e,this.cachedEventUids=new Set,this.consumers=new Set,this.queuedRedirectEvent=null,this.hasHandledPotentialRedirect=!1,this.lastProcessedEventTime=Date.now()}registerConsumer(e){this.consumers.add(e),this.queuedRedirectEvent&&this.isEventForConsumer(this.queuedRedirectEvent,e)&&(this.sendToConsumer(this.queuedRedirectEvent,e),this.saveEventToCache(this.queuedRedirectEvent),this.queuedRedirectEvent=null)}unregisterConsumer(e){this.consumers.delete(e)}onEvent(e){if(this.hasEventBeenHandled(e))return!1;let n=!1;return this.consumers.forEach(r=>{this.isEventForConsumer(e,r)&&(n=!0,this.sendToConsumer(e,r),this.saveEventToCache(e))}),this.hasHandledPotentialRedirect||!wTt(e)||(this.hasHandledPotentialRedirect=!0,n||(this.queuedRedirectEvent=e,n=!0)),n}sendToConsumer(e,n){var r;if(e.error&&!Dbe(e)){const i=((r=e.error.code)===null||r===void 0?void 0:r.split("auth/")[1])||"internal-error";n.onError(Jc(this.auth,i))}else n.onAuthEvent(e)}isEventForConsumer(e,n){const r=n.eventId===null||!!e.eventId&&e.eventId===n.eventId;return n.filter.includes(e.type)&&r}hasEventBeenHandled(e){return Date.now()-this.lastProcessedEventTime>=xTt&&this.cachedEventUids.clear(),this.cachedEventUids.has(ate(e))}saveEventToCache(e){this.cachedEventUids.add(ate(e)),this.lastProcessedEventTime=Date.now()}}function ate(t){return[t.type,t.eventId,t.sessionId,t.tenantId].filter(e=>e).join("-")}function Dbe({type:t,error:e}){return t==="unknown"&&(e==null?void 0:e.code)==="auth/no-auth-event"}function wTt(t){switch(t.type){case"signInViaRedirect":case"linkViaRedirect":case"reauthViaRedirect":return!0;case"unknown":return Dbe(t);default:return!1}}/** + */const TTt=10*60*1e3;class wTt{constructor(e){this.auth=e,this.cachedEventUids=new Set,this.consumers=new Set,this.queuedRedirectEvent=null,this.hasHandledPotentialRedirect=!1,this.lastProcessedEventTime=Date.now()}registerConsumer(e){this.consumers.add(e),this.queuedRedirectEvent&&this.isEventForConsumer(this.queuedRedirectEvent,e)&&(this.sendToConsumer(this.queuedRedirectEvent,e),this.saveEventToCache(this.queuedRedirectEvent),this.queuedRedirectEvent=null)}unregisterConsumer(e){this.consumers.delete(e)}onEvent(e){if(this.hasEventBeenHandled(e))return!1;let n=!1;return this.consumers.forEach(r=>{this.isEventForConsumer(e,r)&&(n=!0,this.sendToConsumer(e,r),this.saveEventToCache(e))}),this.hasHandledPotentialRedirect||!ETt(e)||(this.hasHandledPotentialRedirect=!0,n||(this.queuedRedirectEvent=e,n=!0)),n}sendToConsumer(e,n){var r;if(e.error&&!qbe(e)){const i=((r=e.error.code)===null||r===void 0?void 0:r.split("auth/")[1])||"internal-error";n.onError(Jc(this.auth,i))}else n.onAuthEvent(e)}isEventForConsumer(e,n){const r=n.eventId===null||!!e.eventId&&e.eventId===n.eventId;return n.filter.includes(e.type)&&r}hasEventBeenHandled(e){return Date.now()-this.lastProcessedEventTime>=TTt&&this.cachedEventUids.clear(),this.cachedEventUids.has(ite(e))}saveEventToCache(e){this.cachedEventUids.add(ite(e)),this.lastProcessedEventTime=Date.now()}}function ite(t){return[t.type,t.eventId,t.sessionId,t.tenantId].filter(e=>e).join("-")}function qbe({type:t,error:e}){return t==="unknown"&&(e==null?void 0:e.code)==="auth/no-auth-event"}function ETt(t){switch(t.type){case"signInViaRedirect":case"linkViaRedirect":case"reauthViaRedirect":return!0;case"unknown":return qbe(t);default:return!1}}/** * @license * Copyright 2020 Google LLC * @@ -10539,7 +10539,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function ETt(t,e={}){return vm(t,"GET","/v1/projects",e)}/** + */async function MTt(t,e={}){return vm(t,"GET","/v1/projects",e)}/** * @license * Copyright 2020 Google LLC * @@ -10554,7 +10554,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const MTt=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,PTt=/^https?/;async function RTt(t){if(t.config.emulator)return;const{authorizedDomains:e}=await ETt(t);for(const n of e)try{if(VTt(n))return}catch{}Fu(t,"unauthorized-domain")}function VTt(t){const e=F4(),{protocol:n,hostname:r}=new URL(e);if(t.startsWith("chrome-extension://")){const a=new URL(t);return a.hostname===""&&r===""?n==="chrome-extension:"&&t.replace("chrome-extension://","")===e.replace("chrome-extension://",""):n==="chrome-extension:"&&a.hostname===r}if(!PTt.test(n))return!1;if(MTt.test(t))return r===t;const i=t.replace(/\./g,"\\.");return new RegExp("^(.+\\."+i+"|"+i+")$","i").test(r)}/** + */const PTt=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,RTt=/^https?/;async function VTt(t){if(t.config.emulator)return;const{authorizedDomains:e}=await MTt(t);for(const n of e)try{if(zTt(n))return}catch{}Fu(t,"unauthorized-domain")}function zTt(t){const e=F4(),{protocol:n,hostname:r}=new URL(e);if(t.startsWith("chrome-extension://")){const a=new URL(t);return a.hostname===""&&r===""?n==="chrome-extension:"&&t.replace("chrome-extension://","")===e.replace("chrome-extension://",""):n==="chrome-extension:"&&a.hostname===r}if(!RTt.test(n))return!1;if(PTt.test(t))return r===t;const i=t.replace(/\./g,"\\.");return new RegExp("^(.+\\."+i+"|"+i+")$","i").test(r)}/** * @license * Copyright 2020 Google LLC. * @@ -10569,7 +10569,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const zTt=new yw(3e4,6e4);function ote(){const t=Yc().___jsl;if(t!=null&&t.H){for(const e of Object.keys(t.H))if(t.H[e].r=t.H[e].r||[],t.H[e].L=t.H[e].L||[],t.H[e].r=[...t.H[e].L],t.CP)for(let n=0;n{var r,i,s;function a(){ote(),gapi.load("gapi.iframes",{callback:()=>{e(gapi.iframes.getContext())},ontimeout:()=>{ote(),n(Jc(t,"network-request-failed"))},timeout:zTt.get()})}if(!((i=(r=Yc().gapi)===null||r===void 0?void 0:r.iframes)===null||i===void 0)&&i.Iframe)e(gapi.iframes.getContext());else if(!((s=Yc().gapi)===null||s===void 0)&&s.load)a();else{const o=M6t("iframefcb");return Yc()[o]=()=>{gapi.load?a():n(Jc(t,"network-request-failed"))},Mbe(`${E6t()}?onload=${o}`).catch(l=>n(l))}}).catch(e=>{throw iM=null,e})}let iM=null;function OTt(t){return iM=iM||kTt(t),iM}/** + */const kTt=new yw(3e4,6e4);function ste(){const t=Yc().___jsl;if(t!=null&&t.H){for(const e of Object.keys(t.H))if(t.H[e].r=t.H[e].r||[],t.H[e].L=t.H[e].L||[],t.H[e].r=[...t.H[e].L],t.CP)for(let n=0;n{var r,i,s;function a(){ste(),gapi.load("gapi.iframes",{callback:()=>{e(gapi.iframes.getContext())},ontimeout:()=>{ste(),n(Jc(t,"network-request-failed"))},timeout:kTt.get()})}if(!((i=(r=Yc().gapi)===null||r===void 0?void 0:r.iframes)===null||i===void 0)&&i.Iframe)e(gapi.iframes.getContext());else if(!((s=Yc().gapi)===null||s===void 0)&&s.load)a();else{const o=P6t("iframefcb");return Yc()[o]=()=>{gapi.load?a():n(Jc(t,"network-request-failed"))},Ebe(`${M6t()}?onload=${o}`).catch(l=>n(l))}}).catch(e=>{throw iM=null,e})}let iM=null;function ITt(t){return iM=iM||OTt(t),iM}/** * @license * Copyright 2020 Google LLC. * @@ -10584,7 +10584,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const ITt=new yw(5e3,15e3),UTt="__/auth/iframe",NTt="emulator/auth/iframe",LTt={style:{position:"absolute",top:"-100px",width:"1px",height:"1px"},"aria-hidden":"true",tabindex:"-1"},XTt=new Map([["identitytoolkit.googleapis.com","p"],["staging-identitytoolkit.sandbox.googleapis.com","s"],["test-identitytoolkit.sandbox.googleapis.com","t"]]);function CTt(t){const e=t.config;Ht(e.authDomain,t,"auth-domain-config-required");const n=e.emulator?sA(e,NTt):`https://${t.config.authDomain}/${UTt}`,r={apiKey:e.apiKey,appName:t.name,v:Jy},i=XTt.get(t.config.apiHost);i&&(r.eid=i);const s=t._getFrameworks();return s.length&&(r.fw=s.join(",")),`${n}?${cw(r).slice(1)}`}async function KTt(t){const e=await OTt(t),n=Yc().gapi;return Ht(n,t,"internal-error"),e.open({where:document.body,url:CTt(t),messageHandlersFilter:n.iframes.CROSS_ORIGIN_IFRAMES_FILTER,attributes:LTt,dontclear:!0},r=>new Promise(async(i,s)=>{await r.restyle({setHideOnLeave:!1});const a=Jc(t,"network-request-failed"),o=Yc().setTimeout(()=>{s(a)},ITt.get());function l(){Yc().clearTimeout(o),i(r)}r.ping(l).then(l,()=>{s(a)})}))}/** + */const UTt=new yw(5e3,15e3),NTt="__/auth/iframe",LTt="emulator/auth/iframe",XTt={style:{position:"absolute",top:"-100px",width:"1px",height:"1px"},"aria-hidden":"true",tabindex:"-1"},CTt=new Map([["identitytoolkit.googleapis.com","p"],["staging-identitytoolkit.sandbox.googleapis.com","s"],["test-identitytoolkit.sandbox.googleapis.com","t"]]);function KTt(t){const e=t.config;Ht(e.authDomain,t,"auth-domain-config-required");const n=e.emulator?aA(e,LTt):`https://${t.config.authDomain}/${NTt}`,r={apiKey:e.apiKey,appName:t.name,v:Zy},i=CTt.get(t.config.apiHost);i&&(r.eid=i);const s=t._getFrameworks();return s.length&&(r.fw=s.join(",")),`${n}?${cw(r).slice(1)}`}async function qTt(t){const e=await ITt(t),n=Yc().gapi;return Ht(n,t,"internal-error"),e.open({where:document.body,url:KTt(t),messageHandlersFilter:n.iframes.CROSS_ORIGIN_IFRAMES_FILTER,attributes:XTt,dontclear:!0},r=>new Promise(async(i,s)=>{await r.restyle({setHideOnLeave:!1});const a=Jc(t,"network-request-failed"),o=Yc().setTimeout(()=>{s(a)},UTt.get());function l(){Yc().clearTimeout(o),i(r)}r.ping(l).then(l,()=>{s(a)})}))}/** * @license * Copyright 2020 Google LLC. * @@ -10599,7 +10599,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const qTt={location:"yes",resizable:"yes",statusbar:"yes",toolbar:"no"},DTt=500,WTt=600,ATt="_blank",GTt="http://localhost";class lte{constructor(e){this.window=e,this.associatedEvent=null}close(){if(this.window)try{this.window.close()}catch{}}}function FTt(t,e,n,r=DTt,i=WTt){const s=Math.max((window.screen.availHeight-i)/2,0).toString(),a=Math.max((window.screen.availWidth-r)/2,0).toString();let o="";const l=Object.assign(Object.assign({},qTt),{width:r.toString(),height:i.toString(),top:s,left:a}),u=La().toLowerCase();n&&(o=bbe(u)?ATt:n),vbe(u)&&(e=e||GTt,l.scrollbars="yes");const c=Object.entries(l).reduce((f,[h,p])=>`${f}${h}=${p},`,"");if(m6t(u)&&o!=="_self")return jTt(e||"",o),new lte(null);const d=window.open(e||"",o,c);Ht(d,t,"popup-blocked");try{d.focus()}catch{}return new lte(d)}function jTt(t,e){const n=document.createElement("a");n.href=t,n.target=e;const r=document.createEvent("MouseEvent");r.initMouseEvent("click",!0,!0,window,1,0,0,0,0,!1,!1,!1,!1,1,null),n.dispatchEvent(r)}/** + */const DTt={location:"yes",resizable:"yes",statusbar:"yes",toolbar:"no"},WTt=500,ATt=600,GTt="_blank",FTt="http://localhost";class ate{constructor(e){this.window=e,this.associatedEvent=null}close(){if(this.window)try{this.window.close()}catch{}}}function jTt(t,e,n,r=WTt,i=ATt){const s=Math.max((window.screen.availHeight-i)/2,0).toString(),a=Math.max((window.screen.availWidth-r)/2,0).toString();let o="";const l=Object.assign(Object.assign({},DTt),{width:r.toString(),height:i.toString(),top:s,left:a}),u=La().toLowerCase();n&&(o=gbe(u)?GTt:n),mbe(u)&&(e=e||FTt,l.scrollbars="yes");const c=Object.entries(l).reduce((f,[h,p])=>`${f}${h}=${p},`,"");if(v6t(u)&&o!=="_self")return ZTt(e||"",o),new ate(null);const d=window.open(e||"",o,c);Ht(d,t,"popup-blocked");try{d.focus()}catch{}return new ate(d)}function ZTt(t,e){const n=document.createElement("a");n.href=t,n.target=e;const r=document.createEvent("MouseEvent");r.initMouseEvent("click",!0,!0,window,1,0,0,0,0,!1,!1,!1,!1,1,null),n.dispatchEvent(r)}/** * @license * Copyright 2021 Google LLC * @@ -10614,7 +10614,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const ZTt="__/auth/handler",JTt="emulator/auth/handler",YTt=encodeURIComponent("fac");async function ute(t,e,n,r,i,s){Ht(t.config.authDomain,t,"auth-domain-config-required"),Ht(t.config.apiKey,t,"invalid-api-key");const a={apiKey:t.config.apiKey,appName:t.name,authType:n,redirectUrl:r,v:Jy,eventId:i};if(e instanceof Rbe){e.setDefaultLanguage(t.languageCode),a.providerId=e.providerId||"",zbt(e.getCustomParameters())||(a.customParameters=JSON.stringify(e.getCustomParameters()));for(const[c,d]of Object.entries(s||{}))a[c]=d}if(e instanceof xw){const c=e.getScopes().filter(d=>d!=="");c.length>0&&(a.scopes=c.join(","))}t.tenantId&&(a.tid=t.tenantId);const o=a;for(const c of Object.keys(o))o[c]===void 0&&delete o[c];const l=await t._getAppCheckToken(),u=l?`#${YTt}=${encodeURIComponent(l)}`:"";return`${BTt(t)}?${cw(o).slice(1)}${u}`}function BTt({config:t}){return t.emulator?sA(t,JTt):`https://${t.authDomain}/${ZTt}`}/** + */const JTt="__/auth/handler",YTt="emulator/auth/handler",BTt=encodeURIComponent("fac");async function ote(t,e,n,r,i,s){Ht(t.config.authDomain,t,"auth-domain-config-required"),Ht(t.config.apiKey,t,"invalid-api-key");const a={apiKey:t.config.apiKey,appName:t.name,authType:n,redirectUrl:r,v:Zy,eventId:i};if(e instanceof Pbe){e.setDefaultLanguage(t.languageCode),a.providerId=e.providerId||"",kbt(e.getCustomParameters())||(a.customParameters=JSON.stringify(e.getCustomParameters()));for(const[c,d]of Object.entries(s||{}))a[c]=d}if(e instanceof xw){const c=e.getScopes().filter(d=>d!=="");c.length>0&&(a.scopes=c.join(","))}t.tenantId&&(a.tid=t.tenantId);const o=a;for(const c of Object.keys(o))o[c]===void 0&&delete o[c];const l=await t._getAppCheckToken(),u=l?`#${BTt}=${encodeURIComponent(l)}`:"";return`${HTt(t)}?${cw(o).slice(1)}${u}`}function HTt({config:t}){return t.emulator?aA(t,YTt):`https://${t.authDomain}/${JTt}`}/** * @license * Copyright 2020 Google LLC * @@ -10629,7 +10629,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const wU="webStorageSupport";class HTt{constructor(){this.eventManagers={},this.iframes={},this.originValidationPromises={},this._redirectPersistence=Nbe,this._completeRedirectFn=STt,this._overrideRedirectResult=gTt}async _openPopup(e,n,r,i){var s;If((s=this.eventManagers[e._key()])===null||s===void 0?void 0:s.manager,"_initialize() not called before _openPopup()");const a=await ute(e,n,r,F4(),i);return FTt(e,a,cA())}async _openRedirect(e,n,r,i){await this._originValidation(e);const s=await ute(e,n,r,F4(),i);return $6t(s),new Promise(()=>{})}_initialize(e){const n=e._key();if(this.eventManagers[n]){const{manager:i,promise:s}=this.eventManagers[n];return i?Promise.resolve(i):(If(s,"If manager is not set, promise should be"),s)}const r=this.initAndGetManager(e);return this.eventManagers[n]={promise:r},r.catch(()=>{delete this.eventManagers[n]}),r}async initAndGetManager(e){const n=await KTt(e),r=new TTt(e);return n.register("authEvent",i=>(Ht(i==null?void 0:i.authEvent,e,"invalid-auth-event"),{status:r.onEvent(i.authEvent)?"ACK":"ERROR"}),gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER),this.eventManagers[e._key()]={manager:r},this.iframes[e._key()]=n,r}_isIframeWebStorageSupported(e,n){this.iframes[e._key()].send(wU,{type:wU},i=>{var s;const a=(s=i==null?void 0:i[0])===null||s===void 0?void 0:s[wU];a!==void 0&&n(!!a),Fu(e,"internal-error")},gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER)}_originValidation(e){const n=e._key();return this.originValidationPromises[n]||(this.originValidationPromises[n]=RTt(e)),this.originValidationPromises[n]}get _shouldInitProactively(){return wbe()||gbe()||oA()}}const QTt=HTt;var cte="@firebase/auth",dte="1.7.9";/** + */const wU="webStorageSupport";class QTt{constructor(){this.eventManagers={},this.iframes={},this.originValidationPromises={},this._redirectPersistence=Ube,this._completeRedirectFn=xTt,this._overrideRedirectResult=bTt}async _openPopup(e,n,r,i){var s;If((s=this.eventManagers[e._key()])===null||s===void 0?void 0:s.manager,"_initialize() not called before _openPopup()");const a=await ote(e,n,r,F4(),i);return jTt(e,a,dA())}async _openRedirect(e,n,r,i){await this._originValidation(e);const s=await ote(e,n,r,F4(),i);return eTt(s),new Promise(()=>{})}_initialize(e){const n=e._key();if(this.eventManagers[n]){const{manager:i,promise:s}=this.eventManagers[n];return i?Promise.resolve(i):(If(s,"If manager is not set, promise should be"),s)}const r=this.initAndGetManager(e);return this.eventManagers[n]={promise:r},r.catch(()=>{delete this.eventManagers[n]}),r}async initAndGetManager(e){const n=await qTt(e),r=new wTt(e);return n.register("authEvent",i=>(Ht(i==null?void 0:i.authEvent,e,"invalid-auth-event"),{status:r.onEvent(i.authEvent)?"ACK":"ERROR"}),gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER),this.eventManagers[e._key()]={manager:r},this.iframes[e._key()]=n,r}_isIframeWebStorageSupported(e,n){this.iframes[e._key()].send(wU,{type:wU},i=>{var s;const a=(s=i==null?void 0:i[0])===null||s===void 0?void 0:s[wU];a!==void 0&&n(!!a),Fu(e,"internal-error")},gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER)}_originValidation(e){const n=e._key();return this.originValidationPromises[n]||(this.originValidationPromises[n]=VTt(e)),this.originValidationPromises[n]}get _shouldInitProactively(){return Tbe()||vbe()||lA()}}const _Tt=QTt;var lte="@firebase/auth",ute="1.7.9";/** * @license * Copyright 2020 Google LLC * @@ -10644,7 +10644,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class _Tt{constructor(e){this.auth=e,this.internalListeners=new Map}getUid(){var e;return this.assertAuthConfigured(),((e=this.auth.currentUser)===null||e===void 0?void 0:e.uid)||null}async getToken(e){return this.assertAuthConfigured(),await this.auth._initializationPromise,this.auth.currentUser?{accessToken:await this.auth.currentUser.getIdToken(e)}:null}addAuthTokenListener(e){if(this.assertAuthConfigured(),this.internalListeners.has(e))return;const n=this.auth.onIdTokenChanged(r=>{e((r==null?void 0:r.stsTokenManager.accessToken)||null)});this.internalListeners.set(e,n),this.updateProactiveRefresh()}removeAuthTokenListener(e){this.assertAuthConfigured();const n=this.internalListeners.get(e);n&&(this.internalListeners.delete(e),n(),this.updateProactiveRefresh())}assertAuthConfigured(){Ht(this.auth._initializationPromise,"dependent-sdk-initialized-before-auth")}updateProactiveRefresh(){this.internalListeners.size>0?this.auth._startProactiveRefresh():this.auth._stopProactiveRefresh()}}/** + */class $Tt{constructor(e){this.auth=e,this.internalListeners=new Map}getUid(){var e;return this.assertAuthConfigured(),((e=this.auth.currentUser)===null||e===void 0?void 0:e.uid)||null}async getToken(e){return this.assertAuthConfigured(),await this.auth._initializationPromise,this.auth.currentUser?{accessToken:await this.auth.currentUser.getIdToken(e)}:null}addAuthTokenListener(e){if(this.assertAuthConfigured(),this.internalListeners.has(e))return;const n=this.auth.onIdTokenChanged(r=>{e((r==null?void 0:r.stsTokenManager.accessToken)||null)});this.internalListeners.set(e,n),this.updateProactiveRefresh()}removeAuthTokenListener(e){this.assertAuthConfigured();const n=this.internalListeners.get(e);n&&(this.internalListeners.delete(e),n(),this.updateProactiveRefresh())}assertAuthConfigured(){Ht(this.auth._initializationPromise,"dependent-sdk-initialized-before-auth")}updateProactiveRefresh(){this.internalListeners.size>0?this.auth._startProactiveRefresh():this.auth._stopProactiveRefresh()}}/** * @license * Copyright 2020 Google LLC * @@ -10659,7 +10659,7 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function $Tt(t){switch(t){case"Node":return"node";case"ReactNative":return"rn";case"Worker":return"webworker";case"Cordova":return"cordova";case"WebExtension":return"web-extension";default:return}}function ewt(t){Cb(new Hv("auth",(e,{options:n})=>{const r=e.getProvider("app").getImmediate(),i=e.getProvider("heartbeat"),s=e.getProvider("app-check-internal"),{apiKey:a,authDomain:o}=r.options;Ht(a&&!a.includes(":"),"invalid-api-key",{appName:r.name});const l={apiKey:a,authDomain:o,clientPlatform:t,apiHost:"identitytoolkit.googleapis.com",tokenApiHost:"securetoken.googleapis.com",apiScheme:"https",sdkClientVersion:Ebe(t)},u=new x6t(r,i,s,l);return k6t(u,n),u},"PUBLIC").setInstantiationMode("EXPLICIT").setInstanceCreatedCallback((e,n,r)=>{e.getProvider("auth-internal").initialize()})),Cb(new Hv("auth-internal",e=>{const n=C0(e.getProvider("auth").getImmediate());return(r=>new _Tt(r))(n)},"PRIVATE").setInstantiationMode("EXPLICIT")),xp(cte,dte,$Tt(t)),xp(cte,dte,"esm2017")}/** + */function ewt(t){switch(t){case"Node":return"node";case"ReactNative":return"rn";case"Worker":return"webworker";case"Cordova":return"cordova";case"WebExtension":return"web-extension";default:return}}function twt(t){Cb(new Hv("auth",(e,{options:n})=>{const r=e.getProvider("app").getImmediate(),i=e.getProvider("heartbeat"),s=e.getProvider("app-check-internal"),{apiKey:a,authDomain:o}=r.options;Ht(a&&!a.includes(":"),"invalid-api-key",{appName:r.name});const l={apiKey:a,authDomain:o,clientPlatform:t,apiHost:"identitytoolkit.googleapis.com",tokenApiHost:"securetoken.googleapis.com",apiScheme:"https",sdkClientVersion:wbe(t)},u=new T6t(r,i,s,l);return O6t(u,n),u},"PUBLIC").setInstantiationMode("EXPLICIT").setInstanceCreatedCallback((e,n,r)=>{e.getProvider("auth-internal").initialize()})),Cb(new Hv("auth-internal",e=>{const n=C0(e.getProvider("auth").getImmediate());return(r=>new $Tt(r))(n)},"PRIVATE").setInstantiationMode("EXPLICIT")),xp(lte,ute,ewt(t)),xp(lte,ute,"esm2017")}/** * @license * Copyright 2021 Google LLC * @@ -10674,8 +10674,8 @@ This typically indicates that your device does not have a healthy Internet conne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const twt=5*60,nwt=qge("authIdTokenMaxAge")||twt;let fte=null;const rwt=t=>async e=>{const n=e&&await e.getIdTokenResult(),r=n&&(new Date().getTime()-Date.parse(n.issuedAtTime))/1e3;if(r&&r>nwt)return;const i=n==null?void 0:n.token;fte!==i&&(fte=i,await fetch(t,{method:i?"POST":"DELETE",headers:i?{Authorization:`Bearer ${i}`}:{}}))};function iwt(t=Gge()){const e=bW(t,"auth");if(e.isInitialized())return e.getImmediate();const n=z6t(t,{popupRedirectResolver:QTt,persistence:[lTt,H6t,Nbe]}),r=qge("authTokenSyncURL");if(r&&typeof isSecureContext=="boolean"&&isSecureContext){const s=new URL(r,location.origin);if(location.origin===s.origin){const a=rwt(s.toString());J6t(n,a,()=>a(n.currentUser)),Z6t(n,o=>a(o))}}const i=Cge("auth");return i&&O6t(n,`http://${i}`),n}function swt(){var t,e;return(e=(t=document.getElementsByTagName("head"))===null||t===void 0?void 0:t[0])!==null&&e!==void 0?e:document}T6t({loadJS(t){return new Promise((e,n)=>{const r=document.createElement("script");r.setAttribute("src",t),r.onload=e,r.onerror=i=>{const s=Jc("internal-error");s.customData=i,n(s)},r.type="text/javascript",r.charset="UTF-8",swt().appendChild(r)})},gapiScript:"https://apis.google.com/js/api.js",recaptchaV2Script:"https://www.google.com/recaptcha/api.js",recaptchaEnterpriseScript:"https://www.google.com/recaptcha/enterprise.js?render="});ewt("Browser");let ps=null;function awt(){const t=Nr();(!t.keySettings.firebaseConfig||!t.keySettings.firebaseConfig.apiKey)&&console.error("Firebase configuration or API key not found in settings");const e=Age(t.keySettings.firebaseConfig),n=Ixt(e),r=iwt(e);return owt(r),ps=n,{tempDb:n,auth:r}}async function owt(t){const e="test@example.com",n="dummyPassword123";try{await j6t(t,e,n),console.log("User created successfully"),await rte(t,e,n),console.log("User signed in successfully");const r=t.currentUser;console.log("Current user:",r)}catch(r){if(r.code==="auth/email-already-in-use"){await rte(t,e,n),console.log("User signed in successfully");const i=t.currentUser;console.log("Current user:",i)}else console.error("Error:",r)}}function Y4(t){if(t===null||typeof t!="object")return t;if(Array.isArray(t))return t.map(n=>Y4(n));u0(t)&&(t=gn(t));const e={};for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=Y4(t[n]));return e}function B4(t){return t===null||typeof t!="object"?t:Array.isArray(t)?t.map(e=>B4(e)):Object.entries(t).filter(([e,n])=>n!==void 0).reduce((e,[n,r])=>(e[n]=B4(r),e),{})}const lwt=t=>Object.keys(t).filter(e=>isNaN(Number(e))).map(e=>({label:e,value:t[e]})),gm=h0("firebase",{state:()=>({loading:!1,error:null}),actions:{async addFilterRegistry(t,e,n){this.loading=!0,this.error=null;try{const r={projectId:t,stackName:n,filterCallStack:e.filterCallStack,date:new Date};await Ng(ga(ps,"projectFilters"),r)}catch(r){this.error=r.message}finally{this.loading=!1}},async addFilterList(t,e,n){this.loading=!0,this.error=null;try{const r={projectId:t,stackName:n,filterCallStack:e,date:new Date};await Ng(ga(ps,"projectFilters"),r)}catch(r){this.error=r.message}finally{this.loading=!1}},async fetchLatestFilters(t){this.loading=!0,this.error=null;try{const e=pc(ga(ps,"projectFilters"),du("projectId","==",t),OE("date","desc"),IE(5)),n=await mc(e);return n.empty?null:n.docs.map(i=>i.data())}catch(e){return this.error=e.message,null}finally{this.loading=!1}},async fetchGenericFilters(t=20){this.loading=!0,this.error=null;try{const e=pc(ga(ps,"genericFilters"),OE("date","desc"),IE(t)),n=await mc(e);return n.empty?[]:n.docs.map(i=>i.data())}catch(e){return this.error=e.message,null}finally{this.loading=!1}},async addMapping(t,e,n){this.loading=!0,this.error=null;const r=Y4(e),i=B4(r);try{const s={projectId:t,mapping:i,date:new Date,name:n};await Ng(ga(ps,"mappings"),s)}catch(s){this.error=s.message}finally{this.loading=!1}},async fetchMappings(t,e=25){this.loading=!0,this.error=null;try{const n=pc(ga(ps,"mappings"),du("projectId","==",t),OE("date","desc"),IE(e)),r=await mc(n);return r.empty?[]:r.docs.map(s=>s.data())}catch(n){return this.error=n.message,null}finally{this.loading=!1}},async deleteMapping(t,e){this.loading=!0,this.error=null;try{const n=pc(ga(ps,"mappings"),du("projectId","==",t),du("mappingId","==",e)),r=await mc(n);if(r.empty)this.error="No matching document found";else{const i=Zee(ps);r.forEach(s=>{i.delete(s.ref)}),await i.commit()}}catch(n){this.error=n.message}finally{this.loading=!1}},async addResultList(t,e,n){this.loading=!0,this.error=null;try{const r={name:n,projectId:t,resultList:e,date:new Date};await Ng(ga(ps,"resultLists"),r)}catch(r){this.error=r.message}finally{this.loading=!1}},async fetchResults(t,e=25){this.loading=!0,this.error=null;try{const n=pc(ga(ps,"resultLists"),du("projectId","==",t),OE("date","desc"),IE(e)),r=await mc(n);return r.empty?[]:r.docs.map(s=>s.data())}catch(n){return this.error=n.message,null}finally{this.loading=!1}},async deleteResults(t,e){this.loading=!0,this.error=null;try{const n=pc(ga(ps,"projectResults"),du("projectId","==",t),du("mappingId","==",e)),r=await mc(n);if(r.empty)this.error="No matching document found";else{const i=Zee(ps);r.forEach(s=>{i.delete(s.ref)}),await i.commit()}}catch(n){this.error=n.message}finally{this.loading=!1}},async fetchAssemblyList(t){this.loading=!0,this.error=null;try{const e=pc(ga(ps,"projectAssemblies"),du("projectId","==",t)),n=await mc(e);return n.empty?null:n.docs[0].data()}catch(e){return this.error=e.message,null}finally{this.loading=!1}},async addAssemblyList(t,e){this.loading=!0,this.error=null;try{const n=await mc(pc(ga(ps,"projectAssemblies"),du("projectId","==",t))),r={projectId:t,assemblies:e};if(n.empty)await Ng(ga(ps,"projectAssemblies"),r);else{const i=n.docs[0].ref;await Yxt(i,r)}}catch(n){this.error=n.message}finally{this.loading=!1}},async fetchCalculationSettings(t){this.loading=!0,this.error=null;try{const e=pc(ga(ps,"calculationSettings"),du("projectId","==",t)),n=pc(ga(ps,"calculationSettings"),du("projectId","==","generic")),[r,i]=await Promise.all([mc(e),mc(n)]);return!r.empty||!i.empty?[...r.docs,...i.docs].map(a=>({...a.data()})):null}catch(e){return this.error=e.message,null}finally{this.loading=!1}},async addCalculationSettings(t,e,n){this.loading=!0,this.error=null;try{if(!e)return null;const r={projectId:t,settings:e,date:new Date,name:n};await Ng(ga(ps,"calculationSettings"),r)}catch(r){this.error=r.message}finally{this.loading=!1}}}});function uwt(t){const e=In(),n=Tl();let r=null;cwt(),t.steps.forEach(i=>{if(r!=i.filterId){const a=t.filters.find(o=>o.id==i.filterId);e.updateRegistryStack(a.name,a.callStack),J1(!0),r=i.filterId}const s=e.getGroupById(i.nestedGroupId);s!=null&&(s.elements.forEach(a=>{a.material=i.material}),n.updateMappingMaterial(i.nestedGroupId,i.material))}),n.setMapping(t)}function cwt(){const t=In(),e=Tl();e.mapping=null,t.currProject.geometry.forEach(n=>{n.material=null}),J1(!0)}function dwt(t){const e=Tl(),n=In(),r=go(),i=n.filterRegistry.filterCallStack;if(e.mapping==null){const a={id:crypto.randomUUID(),name:"temp",filters:[i],steps:[]};e.mapping=a,e.addStep(t,e.currentMapping,i.id)}else e.mapping.filters.includes(i)||e.mapping.filters.push(i),e.addStep(t,e.currentMapping,i.id);t.objects.forEach(a=>{e.currentMapping!=null&&(a.material=e.currentMapping,e.updateMappingMaterial(a.URI,e.currentMapping))});const s=jbe();r.setColorGroups(s)}function hte(t,e){const n=t;return!e||e.length===0?n:t.filter(r=>r?e.some(i=>{if(!i.selected)return!1;const s=cR(r,i.filterParamter);return i.name.includes(s)}):!1)}function cR(t,e){return e.split(".").reduce((n,r)=>n&&n[r],t)}function Wbe(t){if(t){const e=t.map(i=>{var s;return(s=i.material)==null?void 0:s.name}),n=[...new Set(e)],r=t.filter(i=>i.material==null).length>0;return n.length===1?n[0]==null?{name:"No material mapped",color:"red-50"}:{name:n[0],color:"green-50"}:{name:"Mixed",color:r?"yellow-50":"green-50"}}else return{name:"No material mapped",color:"red-50"}}function fwt(t){const e={m:1,m2:1,m3:1,kg:1,pcs:1,tonnes:0,l:0};return t.metaData.thickness&&(e.m3=parseFloat(t.metaData.thickness)/1e3),{id:t.id,name:"type",quantity:e,material:t,parameters:{thickness:t.metaData.thickness?t.metaData.thickness:"0",color:t.metaData.color?t.metaData.color:"#ffffff"}}}async function hwt(){const t=Tl(),e=In(),n=gm();try{const r=await n.fetchAssemblyList(e.currProject.id);r&&(t.assemblies=r.assemblies)}catch(r){console.error("Error fetching assembly list:",r)}}function pwt(t,e){return t.length>e?t.substring(0,e)+"...":t}function Zp(t){if(typeof t!="string")return t;const e=t.lastIndexOf(".");return e!==-1?t.substring(e+1):t}function mwt(t){const n=Nr().calculationSettings.standardImpactCategory,r=new Map;if(!(t!=null&&t.data))return[];for(const s of t.data)gwt(s,r,n);return Array.from(r,([s,{value:a,ids:o}])=>({label:s,value:Math.round(a),ids:o}))}function H4(t){const n=Nr().calculationSettings.standardImpactCategory,r=new Map;if(!(t!=null&&t.data))return[];for(const s of t.data)Q4(s,r,n);return Array.from(r,([s,{value:a,ids:o}])=>({label:s,value:Math.round(a),ids:o}))}function vwt(t){const n=Nr().calculationSettings.standardImpactCategory;if(!(t!=null&&t.data))return[];const r=[];for(const i of t.data){const s=new Map;if(Q4(i,s,n),!i.nested||i.nested.length===0){const o=Array.from(s,([l,{value:u,ids:c}])=>({label:l,value:Math.round(u),ids:c}));r.push({label:Zp(i.parameter),value:o});continue}const a=[];for(const o of i.nested){const l=new Map;Q4(o,l,n);for(const[u,c]of l)a.push({label:u,value:Math.round(c.value),ids:c.ids})}r.push({label:Zp(i.parameter),value:a})}return r}function Q4(t,e,n){let r=t.parameter;const i=t.data.emission;if(!r||!i)return null;if(r.split(".").length-1>2&&(r=Zp(r)),!e.has(r)){const a={label:r,value:0,ids:[]};e.set(r,a)}const s=e.get(r);for(const a in t.data.emission[n])s.value+=t.data.emission[n][a];s.ids.push(...t.data.geoId)}function gwt(t,e,n){if(!t.data.emission)return null;for(const i in t.data.emission[n]){if(!e.has(i)){const a={label:i,value:0,ids:[]};e.set(i,a)}const s=e.get(i);s.value+=t.data.emission[n][i],s.ids.push(...t.data.geoId)}}function _4(t,e,n=!1){const r=new ww(t);r.aggregate(!1,!0);const i=r.resultList.find(s=>s.parameter===e);return n?mwt(i):H4(i)}function bwt(t,e){const n=new ww(t);n.aggregate(!1,!0);const r=n.resultList.find(i=>i.parameter===e);return vwt(r)}function fA(t){const e=Nr(),n=e.calculationSettings.standardImpactCategory,r=e.calculationSettings.includedStages;let i=0;for(const s in t[n]){const a=r.relevantStages.find(o=>o.stage===s);a&&a.included&&(i+=t[n][s])}return i}function ywt(t,e){const n=t.resultList.find(i=>i.parameter===e),r=Abe(n);return Gbe(r)}function Abe(t){return t.data.map(e=>e.data.emission)}function Gbe(t){return t.reduce((e,n)=>Fbe(e,n),{})}function Fbe(t,e){const n={},r=i=>{for(const s in i){n[s]||(n[s]={});for(const a in i[s])n[s][a]=(n[s][a]||0)+(i[s][a]||0)}};return r(t),r(e),n}function Swt(t,e){const n={},r=new Set([...Object.keys(t||{}),...Object.keys(e||{})]);for(const i of r)n[i]=(t[i]||0)+(e[i]||0);return n}class ww{constructor(e=[]){qt(this,"geos",[]);qt(this,"resultStore",od());qt(this,"totalEmission",{});qt(this,"resultList",nue.map(e=>({...e,data:[]})));if(this.geos=e,e.length===0){const n=In();n.currProject&&(this.geos=n.currProject.geometry)}}aggregate(e=!0,n=!0){this.geos.forEach(r=>{r.results&&(this.aggregateTotalEmissions(r.results[r.results.length-1].emission),n&&this.aggregateEmissionsForResultList(r))}),e&&this.saveResults()}aggregateTotalEmissions(e){for(const n in e){this.totalEmission[n]||(this.totalEmission[n]={});for(const r in e[n]){this.totalEmission[n][r]||(this.totalEmission[n][r]={amount:0});const i=e[n][r]||0,s=this.totalEmission[n][r]||0;this.totalEmission[n][r]=s+i}}}aggregateEmissionsForResultList(e){for(const n in this.resultList){const r=this.resultList[n].parameter,i=cR(e,r);if(i){const s=e.results[e.results.length-1].emission,a=e.quantity,o=this.resultList[n];o.data||(o.data=[]);let l=o.data.find(u=>u.parameter===i);l||(l={parameter:i,quantity:a,data:{emission:{},geoId:[]}},o.data.push(l)),l.data.emission=Fbe(l.data.emission,s),l.quantity=Swt(l.quantity,a),l.data.geoId.includes(e.id)||l.data.geoId.push(e.id),this.aggregateLifeCycleStages(l)}}}aggregateLifeCycleStages(e){e.nested||(e.nested=[]);const n=e.data.emission;for(const r in n){const i=n[r];if(i)for(const s in i){const a=i[s];let o=e.nested.find(l=>l.parameter===s);o||(o={parameter:s,quantity:{m:0},data:{emission:{},geoId:[]}},e.nested.push(o)),o.data.emission[r]||(o.data.emission[r]={}),o.data.emission[r][s]=(o.data.emission[r][s]??0)+a,e.data.geoId.length===0&&e.data.geoId.push(...e.data.geoId)}}}saveResults(){this.resultStore.setResultList(this.resultList)}}function xwt(t){const e={name:"root",objects:[],id:crypto.randomUUID(),children:[]};return t.forEach(n=>{let r=e;n.path.forEach(i=>{let s=r.children.find(a=>a.name===i);s||(s={color:n.color,name:i,objects:[],id:n.id,children:[]},r.children.push(s)),s.objects.push(...n.elements),r=s})}),e}function J1(t){var r;const e=In();let n=[];if(t){const i=[];(r=e.currProject)==null||r.geometry.forEach(a=>{i.push(a)}),n=[{id:"test",name:"root",path:["root"],elements:i,color:"hsl(151, 100%, 50%)"}];let s=[];e.filterRegistry&&(s=e.filterRegistry.filterCallStack.callStack),s.forEach(a=>{var o,l;a.value?n=(o=e.filterRegistry)==null?void 0:o.callFilter(`${a.name}`,n,`${a.field}`,`${a.value}`,a.remove):n=(l=e.filterRegistry)==null?void 0:l.callFilter(`${a.name}`,n,`${a.field}`),n.forEach(u=>{u.path[0]==="root"&&u.path.splice(0,1)})})}else e.projectGroups&&(n=e.projectGroups);n.sort((i,s)=>s.elements.length-i.elements.length),e.updateGroups(n)}function Twt(t,e=[],n=[]){const i=new _Ie().getMostDistinctColors(t.length>0?t.length:1);t.map((s,a)=>{e.includes(s.id)?t[a].color=n[e.indexOf(s.id)]:t[a].color=i[a]})}function wwt(t=null,e=10){const n=In(),r=[],i={objectIds:[],color:r6.primaryGrey};if(t)t.forEach(a=>{s(a)});else{const a=n.projectGroups;a&&a.forEach(o=>{o.elements.forEach(l=>{s(l)})})}return r.push(i),r;function s(a){if(Nr(),od(),a&&a.results){const o=new ww([a]);o.aggregate(!1);const l=o.resultList.find(p=>p.parameter==="material.name"),u=Abe(l),c=Gbe(u),d=a?Math.log10(a.quantity.m2+1):1,f=fA(c)/a.quantity.m2*d,h=UV(f,0,200);r.push({objectIds:[a.id],color:h})}else i.objectIds.push(a.id)}}function jbe(t=null){const e=In(),n={objectIds:[],color:r6.primaryGreen},r={objectIds:[],color:r6.primaryRed};if(t)t.forEach(s=>{i(s)});else{const s=e.projectGroups;s&&s.forEach(a=>{a.elements.forEach(o=>{i(o)})})}return[n,r];function i(s){s&&s.material?n.objectIds.push(s.id):r.objectIds.push(s.id)}}const In=h0({id:"projectStore",state:()=>({currProject:null,projectGroups:null,filterRegistry:null,selectedGroup:null,selectedObjects:[],highlightedLabel:null,hiddenObjects:[]}),actions:{createNewProject(t){this.currProject=t},updateGroups(t){this.projectGroups=t},updateGroupName(t,e){if(this.projectGroups){const n=this.projectGroups.find(r=>r.id===e);n?(n.name=t,n.path[0]=t):console.log("Object with the provided ID not found.")}},removeGroup(t){if(this.projectGroups){const e=this.projectGroups.findIndex(n=>n.id===t);e>-1?this.projectGroups=this.projectGroups.filter((n,r)=>r!=e):console.warn("Object with the provided ID not found.")}},addGroup(t){this.projectGroups&&this.projectGroups.push(t)},updateProject(t){this.currProject=t},setFilterRegistry(t){this.filterRegistry=t},updateRegistryStack(t,e){this.filterRegistry&&(this.filterRegistry.filterCallStack={id:crypto.randomUUID(),name:t,callStack:e})},getRegistryStack(){return this.filterRegistry!==null?this.filterRegistry.filterCallStack.callStack:[{name:"No filters founds",field:"No filters founds",value:"No filters founds"}]},getFilterNames(){return this.filterRegistry!==null?this.filterRegistry.getFilterNames():["No filters founds"]},getAvailableParameterList(){if(this.currProject){const t=new Set;return this.currProject.geometry.forEach(e=>{Object.keys(e.parameters).forEach(n=>{(typeof e.parameters[n]=="string"||typeof e.parameters[n]=="number")&&t.add(n)}),Object.keys(e.quantity).forEach(n=>{const r=n;e.quantity[r]!==0&&e.quantity[r]!==null&&(t.add(n),e.parameters[n]=e.quantity[n].toString())})}),Array.from(t)}else return["No parameters found"]},addGeometry(t){var e;(e=this.currProject)==null||e.geometry.push(t)},removeGeometry(t){var n;const e=this.findGeometryIndexById(t);e!==-1&&e!=null&&((n=this.currProject)==null||n.geometry.splice(e,1))},updateGeometry(t,e){if(!e||!t||this.currProject===null)return;const n=this.findGeometryIndexById(e);n!==-1&&n!=null&&(this.currProject.geometry[n]=t)},getGeometryObjectById(t){return this.currProject?this.currProject.geometry.find(e=>e.id===t):null},getGroupById(t){return this.projectGroups?this.projectGroups.find(e=>e.id===t):null},addResults(t){var e;((e=this.currProject)==null?void 0:e.results)!=null?this.currProject.results.push(t):this.currProject!=null&&(this.currProject.results=[t])},updateResults(t,e){var r;if(!e||!t||this.currProject===void 0)return;const n=this.findResultIndexById(e);n!==-1&&n!=null&&((r=this.currProject)==null?void 0:r.results)!=null&&(this.currProject.results[n]=t)},setHighlightedLabel(t){this.highlightedLabel=t},setSelectedGroup(t){this.selectedGroup=t,this.setObjectsFromGroup()},setObjectsFromGroup(){if(this.selectedObjects=[],this.selectedGroup===null)return;this.selectedGroup.objects.forEach(e=>{var n;(n=this.selectedObjects)==null||n.push(e)})},setSelectedObjects(t){this.selectedObjects=t},setObjectsByURI(t){const e=this.currProject.geometry,n=e==null?void 0:e.filter(r=>t.includes(r.URI));this.selectedObjects=n},setObjectsById(t){const e=this.currProject.geometry,n=e==null?void 0:e.filter(r=>t.includes(r.id));this.selectedObjects=n},clearSelectedObjects(){this.selectedObjects=[]},clearSelectedGroup(){this.selectedGroup=null,this.selectedObjects=[]},getSelectedObjectsURI(){return this.selectedObjects?this.selectedObjects.map(t=>t.URI):[]},getGroupTree(){if(this.projectGroups){const t=this.projectGroups,e=xwt(t);return e.children.sort((n,r)=>r.objects.length-n.objects.length),e}else{const t="No groups found to create tree structure in current project.";ef(t,"info"),console.log(t)}return null},findGeometryIndexById(t){var e;return(e=this.currProject)==null?void 0:e.geometry.findIndex(n=>n.id===t)},findResultIndexById(t){var e;return(e=this.currProject)==null?void 0:e.geometry.findIndex(n=>n.id===t)}}}),Ewt="modulepreload",Mwt=function(t){return"/SpeckleLCA/"+t},pte={},Pwt=function(e,n,r){if(!n||n.length===0)return e();const i=document.getElementsByTagName("link");return Promise.all(n.map(s=>{if(s=Mwt(s),s in pte)return;pte[s]=!0;const a=s.endsWith(".css"),o=a?'[rel="stylesheet"]':"";if(!!r)for(let c=i.length-1;c>=0;c--){const d=i[c];if(d.href===s&&(!a||d.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${s}"]${o}`))return;const u=document.createElement("link");if(u.rel=a?"stylesheet":Ewt,a||(u.as="script",u.crossOrigin=""),u.href=s,document.head.appendChild(u),a)return new Promise((c,d)=>{u.addEventListener("load",c),u.addEventListener("error",()=>d(new Error(`Unable to preload CSS for ${s}`)))})})).then(()=>e()).catch(s=>{const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=s,window.dispatchEvent(a),!a.defaultPrevented)throw s})},Rwt=pt({name:"DropdownMenuItem",components:{ChevronRightIcon:eue,DropdownMenuItem:()=>Pwt(()=>Promise.resolve().then(()=>kwt),void 0)},props:{item:{type:Object,required:!0},selectedItem:{type:String,required:!0}},setup(t,{emit:e}){const n=ze(!1),r=ze(!1),i=t.item.children&&t.item.children.length>0;return{isOpen:n,active:r,hasChildren:i,handleSelect:()=>{i?n.value=!n.value:e("select",t.item)}}}});const Vwt={key:0,class:"ml-4 pl-4 border-l border-gray-200"};function zwt(t,e,n,r,i,s){const a=Xe("ChevronRightIcon"),o=Xe("DropdownMenuItem",!0);return pe(),ke("div",null,[O("div",{class:En(["flex items-center justify-between px-4 py-2 text-sm cursor-pointer",t.selectedItem===t.item.name?"font-bold underline":"",t.active?"bg-gray-100 text-gray-900":"text-gray-700"]),onClick:e[0]||(e[0]=(...l)=>t.handleSelect&&t.handleSelect(...l)),onMouseenter:e[1]||(e[1]=l=>t.active=!0),onMouseleave:e[2]||(e[2]=l=>t.active=!1)},[O("span",null,Mt(t.item.name),1),t.hasChildren?(pe(),Gt(a,{key:0,class:"h-4 w-4 text-gray-400"})):Ln("",!0)],34),xe(Rp,{name:"fade"},{default:ft(()=>[t.isOpen?(pe(),ke("div",Vwt,[(pe(!0),ke(Ct,null,Pi(t.item.children,l=>(pe(),Gt(o,{key:l.name,item:l,selectedItem:t.selectedItem,onSelect:e[3]||(e[3]=u=>t.$emit("select",u))},null,8,["item","selectedItem"]))),128))])):Ln("",!0)]),_:1})])}const Zbe=Vt(Rwt,[["render",zwt],["__scopeId","data-v-77df4156"]]),kwt=Object.freeze(Object.defineProperty({__proto__:null,default:Zbe},Symbol.toStringTag,{value:"Module"})),Owt=pt({name:"DropDown",components:{ChevronDownIcon:$le,DropdownMenuItem:Zbe},props:{items:{type:Array,required:!0},dropdownName:{type:String,required:!1,default:"Options"}},setup(t,{emit:e}){const n=ze(t.dropdownName),r=ze(!1),i=a=>{n.value=a.name,r.value=!1,e("selectedItem",a)},s=()=>{r.value=!r.value};return jt(()=>t.dropdownName,a=>{n.value=a}),jt(()=>t.items,a=>{a.some(o=>o.name===n.value)||a.length>0||(n.value=t.dropdownName||"Options")},{immediate:!0}),{select:i,selectedItem:n,isOpen:r,toggleDropdown:s}}}),Iwt={class:"relative inline-block text-left w-min"},Uwt={class:"max-w-xs"},Nwt={class:"flex items-center space-x-2 truncate"},Lwt={key:0,class:"absolute z-[100] mt-2 w-full origin-top-right rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none"},Xwt={class:"py-1 max-h-60 overflow-y-auto"};function Cwt(t,e,n,r,i,s){const a=Xe("ChevronDownIcon"),o=Xe("DropdownMenuItem");return pe(),ke("div",Iwt,[O("div",Uwt,[O("button",{onClick:e[0]||(e[0]=(...l)=>t.toggleDropdown&&t.toggleDropdown(...l)),class:"inline-flex w-full justify-between gap-x-1.5 rounded-md bg-white px-6 py-2 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50 truncate"},[O("div",Nwt,Mt(t.selectedItem),1),xe(a,{class:"-mr-1 h-5 w-5 text-gray-400","aria-hidden":"true"})])]),xe(Rp,{"enter-active-class":"transition ease-out duration-100","enter-from-class":"transform opacity-0 scale-95","enter-to-class":"transform opacity-100 scale-100","leave-active-class":"transition ease-in duration-75","leave-from-class":"transform opacity-100 scale-100","leave-to-class":"transform opacity-0 scale-95"},{default:ft(()=>[t.isOpen?(pe(),ke("div",Lwt,[O("div",Xwt,[(pe(!0),ke(Ct,null,Pi(t.items,l=>(pe(),Gt(o,{key:l.name,item:l,selectedItem:t.selectedItem,onSelect:t.select},null,8,["item","selectedItem","onSelect"]))),128))])])):Ln("",!0)]),_:1})])}const ju=Vt(Owt,[["render",Cwt]]),Kwt=pt({name:"SettingsImpactCategory",components:{Dropdown:ju,UpdateButton:Cf},setup(){var f;const t=Nr(),e=In(),n=gm(),r=ze(t.calculationSettings.standardImpactCategory),i=ze(t.calculationSettings.includedStages),s=ze(t.calculationSettings.buildingCode),a=[];let o="generic";(f=e.currProject)!=null&&f.id&&(o=e.currProject.id);const l=Go({name:"Pick your settings",projectId:o,date:new Date,settings:{standardImpactCategory:r.value,includedStages:i.value,buildingCode:s.value}}),u=h=>{const p=JSON.parse(h.data);l.name=h.name,t.updateIncludedStages(p.includedStages),t.updateStandardImpactCategory(p.standardImpactCategory),t.updateBuildingCode(p.buildingCode)};return(async()=>{const h=await n.fetchCalculationSettings(l.projectId).finally();h&&h.map(p=>{a.push({name:p.name,data:JSON.stringify(p.settings)})})})(),{savedSettings:a,currentSetting:l,handleSelectedItem:u,saveSettings:()=>{const h={standardImpactCategory:r.value,includedStages:i.value,buildingCode:s.value};n.addCalculationSettings(l.projectId,h,l.name)}}}}),qwt={class:"mt-6 space-y-6 divide-y divide-gray-100 border-t border-gray-200 text-sm/6"},Dwt={class:"pt-6 sm:flex"},Wwt={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"};function Awt(t,e,n,r,i,s){const a=Xe("Dropdown"),o=Xe("UpdateButton");return pe(),ke("div",null,[e[3]||(e[3]=O("h2",{class:"text-base/7 font-semibold text-gray-900"},"Saved calculation settings",-1)),e[4]||(e[4]=O("p",{class:"mt-1 text-sm/6 text-gray-500"},"Saved settings for a certain certification, changes settings below.",-1)),O("dl",qwt,[O("div",Dwt,[e[2]||(e[2]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Saved settings/certification",-1)),O("dd",Wwt,[xe(a,{items:t.savedSettings,name:"calculationSettings",dropdownName:t.currentSetting.name,onSelectedItem:t.handleSelectedItem},null,8,["items","dropdownName","onSelectedItem"]),e[1]||(e[1]=O("p",{class:"font-medium text-gray-900"},"Name",-1)),hn(O("input",{type:"text","onUpdate:modelValue":e[0]||(e[0]=l=>t.currentSetting.name=l),class:"w-full border p-2 rounded-md"},null,512),[[On,t.currentSetting.name]]),xe(o,{label:"Save",onClick:t.saveSettings},null,8,["onClick"])])])])])}const mte=Vt(Kwt,[["render",Awt]]),Gwt=pt({name:"SettingsImpactCategory",components:{Dropdown:ju,UpdateButton:Cf},setup(){const t=Nr(),{calculationSettings:e}=ai(t),n=ze(t.calculationSettings.standardImpactCategory),r=[];eUe.map(a=>{r.push({name:a})});const i=()=>{t.updateStandardImpactCategory(n.value)},s=a=>{n.value=a.name};return jt(()=>e.value.standardImpactCategory,a=>{n.value=a}),{impactCategory:n,impactCategoryList:r,updateImpactCategory:i,handleSelectedItem:s}}}),Fwt={class:"mt-6 space-y-6 divide-y divide-gray-100 border-t border-gray-200 text-sm/6"},jwt={class:"pt-6 sm:flex"},Zwt={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"};function Jwt(t,e,n,r,i,s){const a=Xe("Dropdown"),o=Xe("UpdateButton");return pe(),ke("div",null,[e[1]||(e[1]=O("h2",{class:"text-base/7 font-semibold text-gray-900"},"Impact category",-1)),e[2]||(e[2]=O("p",{class:"mt-1 text-sm/6 text-gray-500"},"Set what impact category you want to calculate for.",-1)),O("dl",Fwt,[O("div",jwt,[e[0]||(e[0]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Standard impactCategory",-1)),O("dd",Zwt,[xe(a,{items:t.impactCategoryList,name:"codes",dropdownName:t.impactCategory,onSelectedItem:t.handleSelectedItem},null,8,["items","dropdownName","onSelectedItem"]),xe(o,{onClick:t.updateImpactCategory},null,8,["onClick"])])])])])}const Ywt=Vt(Gwt,[["render",Jwt]]),Bwt=pt({name:"SettingsLifecycleStages",components:{UpdateButton:Cf},setup(){const t=Nr(),{calculationSettings:e}=ai(t),n=ze(e.value.includedStages),r=Go(tUe.reduce((l,u)=>{const c=u.charAt(0).toUpperCase();let d=l.find(f=>f.label===c);return d||(d={label:c,selected:!1,stages:[]},l.push(d)),d.stages.push({name:u,selected:!1}),l},[])),i=()=>{e.value.includedStages.relevantStages.forEach(l=>{const u=r.find(c=>c.label===l.stage.charAt(0).toUpperCase());if(u){const c=u.stages.find(d=>d.name===l.stage);c&&(c.selected=l.included)}}),r.forEach(l=>{l.selected=l.stages.every(u=>u.selected)})};return jt(()=>e,()=>{i()},{immediate:!0,deep:!0}),{groupedStages:r,checkGroupSelection:l=>{l.selected=l.stages.every(u=>u.selected)},toggleGroup:l=>{l.stages.forEach(u=>{u.selected=l.selected})},updateStages:()=>{n.value.relevantStages=r.flatMap(l=>l.stages.map(u=>({included:u.selected,stage:u.name}))),t.updateIncludedStages(n.value)}}}}),Hwt={class:"grid grid-cols-5 gap-4 p-4 pr-0 mt-6 divide-x divide-gray-100 border-t border-gray-200"},Qwt={class:"flex items-center space-x-2 mb-2 pl-2"},_wt=["onUpdate:modelValue","onChange"],$wt={class:"font-bold text-lg"},e2t={class:"ml-2"},t2t=["onUpdate:modelValue","onChange"],n2t={class:"flex flex-col items-end"};function r2t(t,e,n,r,i,s){const a=Xe("UpdateButton");return pe(),ke("div",null,[e[0]||(e[0]=O("h2",{class:"text-base/7 font-semibold text-gray-900"},"Lifecycles stages",-1)),e[1]||(e[1]=O("p",{class:"mt-1 text-sm/6 text-gray-500"},"Set stages you want to include in the results, if no data exist in the EPD it will set the value as 0.",-1)),O("div",Hwt,[(pe(!0),ke(Ct,null,Pi(t.groupedStages,(o,l)=>(pe(),ke("div",{key:l,class:"flex flex-col items-start"},[O("label",Qwt,[hn(O("input",{type:"checkbox",class:"h-4 w-4 rounded border-gray-300 text-green-600 focus:ring-green-500","onUpdate:modelValue":u=>o.selected=u,onChange:u=>t.toggleGroup(o)},null,40,_wt),[[mf,o.selected]]),O("span",$wt,Mt(o.label),1)]),O("div",e2t,[(pe(!0),ke(Ct,null,Pi(o.stages,u=>(pe(),ke("label",{key:u,class:"flex items-center space-x-2"},[hn(O("input",{type:"checkbox",class:"h-4 w-4 pt-4 rounded border-gray-300 text-green-600 focus:ring-green-500","onUpdate:modelValue":c=>u.selected=c,onChange:c=>t.checkGroupSelection(o)},null,40,t2t),[[mf,u.selected]]),O("span",null,Mt(u.name),1)]))),128))])]))),128)),O("div",n2t,[xe(a,{onClick:t.updateStages},null,8,["onClick"])])])])}const vte=Vt(Bwt,[["render",r2t]]),i2t=pt({name:"SettingsBuildingCodes",components:{Dropdown:ju,UpdateButton:Cf},setup(){const t=Nr(),{calculationSettings:e}=ai(t),n=ze([]),r=ze(""),i=ze(e.value.buildingCode),s=Object.keys(eZ).map(d=>({name:d,data:JSON.stringify(eZ[d])})),a=()=>{n.value=JSON.parse(JSON.stringify(i.value.data))};return jt(()=>e,()=>{a()},{immediate:!0,deep:!0}),{groupedBuildingCodes:n,buildingCode:i,buildingCodeDropdown:s,checkGroupSelection:d=>{var f;d.selected=((f=d.children)==null?void 0:f.every(h=>h.selected))||!1},toggleGroup:d=>{var f;(f=d.children)==null||f.forEach(h=>{h.selected=d.selected})},updateBuildingCodes:()=>{t.updateBuildingCode({key:r.value,data:n.value})},handleSelectedItem:d=>{const f=JSON.parse(d.data);t.updateBuildingCode({key:d.name,data:f})}}}}),s2t={class:"flex flex-col"},a2t={class:"flex flex-col items-end"},o2t={class:"flex flex-col items-start"},l2t={class:"grid grid-cols-4 gap-4 p-4 mt-6 divide-x divide-gray-100 border-t border-gray-200"},u2t={class:"flex items-center space-x-2 mb-2"},c2t=["onUpdate:modelValue","onChange"],d2t={class:"font-bold text-lg"},f2t={class:"ml-2"},h2t=["onUpdate:modelValue","onChange"];function p2t(t,e,n,r,i,s){const a=Xe("UpdateButton"),o=Xe("Dropdown");return pe(),ke("div",null,[e[0]||(e[0]=O("h2",{class:"text-base/7 font-semibold text-gray-900"},"Buildingpart Codes",-1)),e[1]||(e[1]=O("p",{class:"mt-1 text-sm/6 text-gray-500"},"Set building codes to include, this will be used to segment results on building codes. Mostly used for certifications.",-1)),O("div",s2t,[O("div",a2t,[xe(a,{onClick:t.updateBuildingCodes},null,8,["onClick"])]),O("div",o2t,[xe(o,{items:t.buildingCodeDropdown,name:"calculationSettings",dropdownName:t.buildingCode.key,onSelectedItem:t.handleSelectedItem},null,8,["items","dropdownName","onSelectedItem"])])]),O("div",l2t,[(pe(!0),ke(Ct,null,Pi(t.groupedBuildingCodes,(l,u)=>(pe(),ke("div",{key:u,class:"flex flex-col items-start pl-2"},[O("label",u2t,[hn(O("input",{type:"checkbox",class:"h-4 w-4 rounded border-gray-300 text-green-600 focus:ring-green-500","onUpdate:modelValue":c=>l.selected=c,onChange:c=>t.toggleGroup(l)},null,40,c2t),[[mf,l.selected]]),O("span",d2t,Mt(l.name),1)]),O("div",f2t,[(pe(!0),ke(Ct,null,Pi(l.children,(c,d)=>(pe(),ke("label",{key:d,class:"flex items-start space-x-2"},[hn(O("input",{type:"checkbox",class:"h-4 w-4 pt-4 rounded border-gray-300 text-green-600 focus:ring-green-500","onUpdate:modelValue":f=>c.selected=f,onChange:f=>t.checkGroupSelection(l)},null,40,h2t),[[mf,c.selected]]),O("span",null,Mt(c.name),1)]))),128))])]))),128))])])}const m2t=Vt(i2t,[["render",p2t]]),v2t=pt({name:"SettingsFirebase",components:{UpdateButton:Cf},setup(){const t=Nr(),e=ze(t.keySettings.firebaseConfig);return{firebaseSettings:e,updateFirebaseSettings:()=>{t.updateFirebaseSettings(e.value)}}}}),g2t={class:"mt-6 space-y-6 divide-y divide-gray-100 border-t border-gray-200 text-sm/6"},b2t={class:"pt-6 sm:flex"},y2t={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"},S2t={class:"pt-6 sm:flex"},x2t={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"},T2t={class:"pt-6 sm:flex"},w2t={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"},E2t={class:"pt-6 sm:flex"},M2t={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"},P2t={class:"pt-6 sm:flex"},R2t={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"},V2t={class:"pt-6 sm:flex"},z2t={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"},k2t={class:"pt-6 sm:flex"},O2t={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"};function I2t(t,e,n,r,i,s){const a=Xe("UpdateButton");return pe(),ke("div",null,[e[14]||(e[14]=O("h2",{class:"text-base/7 font-semibold text-gray-900"},"Firebase",-1)),e[15]||(e[15]=O("p",{class:"mt-1 text-sm/6 text-gray-500"},"This is cached in your local storage, but always have caution in what you share.",-1)),O("dl",g2t,[O("div",b2t,[e[7]||(e[7]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Firebase Key",-1)),O("dd",y2t,[hn(O("input",{type:"text","onUpdate:modelValue":e[0]||(e[0]=o=>t.firebaseSettings.apiKey=o),placeholder:"Firebase Key",class:"w-full border p-2 rounded-md"},null,512),[[On,t.firebaseSettings.apiKey]]),xe(a,{onClick:t.updateFirebaseSettings},null,8,["onClick"])])]),O("div",S2t,[e[8]||(e[8]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"App id",-1)),O("dd",x2t,[hn(O("input",{type:"text","onUpdate:modelValue":e[1]||(e[1]=o=>t.firebaseSettings.appId=o),placeholder:"Firebase Key",class:"w-full border p-2 rounded-md"},null,512),[[On,t.firebaseSettings.appId]]),xe(a,{onClick:t.updateFirebaseSettings},null,8,["onClick"])])]),O("div",T2t,[e[9]||(e[9]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Authentication domain",-1)),O("dd",w2t,[hn(O("input",{type:"text","onUpdate:modelValue":e[2]||(e[2]=o=>t.firebaseSettings.authDomain=o),placeholder:"Firebase Key",class:"w-full border p-2 rounded-md"},null,512),[[On,t.firebaseSettings.authDomain]]),xe(a,{onClick:t.updateFirebaseSettings},null,8,["onClick"])])]),O("div",E2t,[e[10]||(e[10]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Measurement id",-1)),O("dd",M2t,[hn(O("input",{type:"text","onUpdate:modelValue":e[3]||(e[3]=o=>t.firebaseSettings.measurementId=o),placeholder:"Firebase Key",class:"w-full border p-2 rounded-md"},null,512),[[On,t.firebaseSettings.measurementId]]),xe(a,{onClick:t.updateFirebaseSettings},null,8,["onClick"])])]),O("div",P2t,[e[11]||(e[11]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Sender id",-1)),O("dd",R2t,[hn(O("input",{type:"text","onUpdate:modelValue":e[4]||(e[4]=o=>t.firebaseSettings.messagingSenderId=o),placeholder:"Firebase Key",class:"w-full border p-2 rounded-md"},null,512),[[On,t.firebaseSettings.messagingSenderId]]),xe(a,{onClick:t.updateFirebaseSettings},null,8,["onClick"])])]),O("div",V2t,[e[12]||(e[12]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Project id",-1)),O("dd",z2t,[hn(O("input",{type:"text","onUpdate:modelValue":e[5]||(e[5]=o=>t.firebaseSettings.projectId=o),placeholder:"Firebase Key",class:"w-full border p-2 rounded-md"},null,512),[[On,t.firebaseSettings.projectId]]),xe(a,{onClick:t.updateFirebaseSettings},null,8,["onClick"])])]),O("div",k2t,[e[13]||(e[13]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"StorageBucket id",-1)),O("dd",O2t,[hn(O("input",{type:"text","onUpdate:modelValue":e[6]||(e[6]=o=>t.firebaseSettings.storageBucket=o),placeholder:"Firebase Key",class:"w-full border p-2 rounded-md"},null,512),[[On,t.firebaseSettings.storageBucket]]),xe(a,{onClick:t.updateFirebaseSettings},null,8,["onClick"])])])])])}const gte=Vt(v2t,[["render",I2t]]),U2t=pt({name:"SettingsSpeckle",components:{UpdateButton:Cf},setup(){const t=Nr(),e=ze(t.keySettings.speckleConfig);return{speckleSettings:e,updateSpeckleSettings:()=>{t.updateSpeckleSettings(e.value)}}}}),N2t={class:"mt-6 space-y-6 divide-y divide-gray-100 border-t border-gray-200 text-sm/6"},L2t={class:"pt-6 sm:flex"},X2t={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"},C2t={class:"pt-6 sm:flex"},K2t={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"},q2t={class:"pt-6 sm:flex"},D2t={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"};function W2t(t,e,n,r,i,s){const a=Xe("UpdateButton");return pe(),ke("div",null,[e[6]||(e[6]=O("h2",{class:"text-base/7 font-semibold text-gray-900"},"Speckle",-1)),e[7]||(e[7]=O("p",{class:"mt-1 text-sm/6 text-gray-500"},"Add secret and app id from Speckle approved apps",-1)),O("dl",N2t,[O("div",L2t,[e[3]||(e[3]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Speckle Server",-1)),O("dd",X2t,[hn(O("input",{type:"text","onUpdate:modelValue":e[0]||(e[0]=o=>t.speckleSettings.serverUrl=o),placeholder:"Speckle Server",class:"w-full border p-2 rounded-md"},null,512),[[On,t.speckleSettings.serverUrl]]),xe(a,{onClick:t.updateSpeckleSettings},null,8,["onClick"])])]),O("div",C2t,[e[4]||(e[4]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Speckle Id",-1)),O("dd",K2t,[hn(O("input",{type:"text","onUpdate:modelValue":e[1]||(e[1]=o=>t.speckleSettings.id=o),placeholder:"Speckle id",class:"w-full border p-2 rounded-md"},null,512),[[On,t.speckleSettings.id]]),xe(a,{onClick:t.updateSpeckleSettings},null,8,["onClick"])])]),O("div",q2t,[e[5]||(e[5]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Speckle Secret",-1)),O("dd",D2t,[hn(O("input",{type:"text","onUpdate:modelValue":e[2]||(e[2]=o=>t.speckleSettings.secret=o),placeholder:"Speckle secret",class:"w-full border p-2 rounded-md"},null,512),[[On,t.speckleSettings.secret]]),xe(a,{onClick:t.updateSpeckleSettings},null,8,["onClick"])])])])])}const bte=Vt(U2t,[["render",W2t]]),A2t=pt({name:"SettingsMaterials",components:{UpdateButton:Cf},setup(){const t=Nr(),e=ze(t.keySettings.materialKeys);return{materialKeys:e,updateMaterialKeys:()=>{t.updateMaterialKeys(e.value)}}}}),G2t={class:"mt-6 space-y-6 divide-y divide-gray-100 border-t border-gray-200 text-sm/6"},F2t={class:"pt-6 sm:flex"},j2t={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"},Z2t={class:"pt-6 sm:flex"},J2t={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"};function Y2t(t,e,n,r,i,s){const a=Xe("UpdateButton");return pe(),ke("div",null,[e[4]||(e[4]=O("h2",{class:"text-base/7 font-semibold text-gray-900"},"Material Keys",-1)),e[5]||(e[5]=O("p",{class:"mt-1 text-sm/6 text-gray-500"},"Material API keys, saved in local storage.",-1)),O("dl",G2t,[O("div",F2t,[e[2]||(e[2]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Revalu key",-1)),O("dd",j2t,[hn(O("input",{type:"text","onUpdate:modelValue":e[0]||(e[0]=o=>t.materialKeys.revalu=o),placeholder:"Revalu key",class:"w-full border p-2 rounded-md"},null,512),[[On,t.materialKeys.revalu]]),xe(a,{onClick:t.updateMaterialKeys},null,8,["onClick"])])]),O("div",Z2t,[e[3]||(e[3]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"ECOPortal key",-1)),O("dd",J2t,[hn(O("input",{type:"text","onUpdate:modelValue":e[1]||(e[1]=o=>t.materialKeys.ecoPortal=o),placeholder:"Ecoportal key",class:"w-full border p-2 rounded-md"},null,512),[[On,t.materialKeys.ecoPortal]]),xe(a,{onClick:t.updateMaterialKeys},null,8,["onClick"])])])])])}const yte=Vt(A2t,[["render",Y2t]]),B2t=pt({name:"SettingsGithub",components:{UpdateButton:Cf},setup(){const t=Nr(),e=ze(t.keySettings.githubApiKey);return{githubKey:e,updateGithub:()=>{t.updateGithubApiKey(e.value)}}}}),H2t={class:"mt-6 space-y-6 divide-y divide-gray-100 border-t border-gray-200 text-sm/6"},Q2t={class:"pt-6 sm:flex"},_2t={class:"mt-1 flex justify-between gap-x-6 sm:mt-0 sm:flex-auto"};function $2t(t,e,n,r,i,s){const a=Xe("UpdateButton");return pe(),ke("div",null,[e[2]||(e[2]=O("h2",{class:"text-base/7 font-semibold text-gray-900"},"Github Token",-1)),e[3]||(e[3]=O("p",{class:"mt-1 text-sm/6 text-gray-500"},"Github API token, used to read the latest commit message at the header.",-1)),O("dl",H2t,[O("div",Q2t,[e[1]||(e[1]=O("dt",{class:"font-medium text-gray-900 sm:w-64 sm:flex-none sm:pr-6"},"Github Token",-1)),O("dd",_2t,[hn(O("input",{type:"text","onUpdate:modelValue":e[0]||(e[0]=o=>t.githubKey=o),placeholder:"Github token",class:"w-full border p-2 rounded-md"},null,512),[[On,t.githubKey]]),xe(a,{onClick:t.updateGithub},null,8,["onClick"])])])])])}const Ste=Vt(B2t,[["render",$2t]]),e5t=pt({name:"SettingsModal",components:{UserCircleIcon:$j,FingerPrintIcon:_j,CalculatorIcon:Qj,ProjectDialog:_p,DialogPanel:g0,TransitionChild:Zu,TransitionRoot:Ju,SettingsSidebar:sOe,SettingsFirebase:gte,SettingsSpeckle:bte,SettingsMaterials:yte,SettingsGithub:Ste,SettingsLifecycleStages:vte,SettingsCalculationCategory:mte},setup(){const t=li(),{settingsModalOpen:e}=ai(t),n=ze("General"),r=Go([{name:"General",icon:$j,current:!0},{name:"Calculation",icon:Qj,current:!1},{name:"Keys",icon:_j,current:!1}]),i={General:[gOe],Calculation:[mte,Ywt,vte,m2t],Keys:[gte,bte,yte,Ste]},s=et(()=>i[n.value]);return{settingsModalOpen:e,currentViewComponents:s,currentSettingView:n,settingViews:r,closeModal:()=>{t.toggleSettingsModal()},setView:l=>{n.value=l.name}}}}),t5t={class:"fixed justify-center items-center inset-0 left-[12.5%] z-50 p-10 w-screen h-screen"},n5t={class:"w-3/4 flex flex-col items-end justify-center p-4 text-center sm:items-center sm:p-0 h-full"},r5t={class:"flex pb-2 h-full justify-between"},i5t={class:"px-4 py-16 flex-auto h-full overflow-y-scroll"},s5t={class:"mx-auto max-w-2xl space-y-16 sm:space-y-20 lg:mx-0 lg:max-w-none"};function a5t(t,e,n,r,i,s){const a=Xe("TransitionChild"),o=Xe("SettingsSidebar"),l=Xe("DialogPanel"),u=Xe("ProjectDialog"),c=Xe("TransitionRoot");return pe(),Gt(c,{as:"template",show:t.settingsModalOpen},{default:ft(()=>[xe(u,{as:"div",class:"relative z-50",onClose:t.closeModal},{default:ft(()=>[xe(a,{as:"template",enter:"ease-out duration-300","enter-from":"opacity-0","enter-to":"opacity-100",leave:"ease-in duration-200","leave-from":"opacity-100","leave-to":"opacity-0"},{default:ft(()=>e[0]||(e[0]=[O("div",{class:"fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"},null,-1)])),_:1}),O("div",t5t,[O("div",n5t,[xe(a,{as:"template",enter:"ease-out duration-300","enter-from":"opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95","enter-to":"opacity-100 translate-y-0 sm:scale-100",leave:"ease-in duration-200","leave-from":"opacity-100 translate-y-0 sm:scale-100","leave-to":"opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"},{default:ft(()=>[xe(l,{class:"transform rounded-lg bg-white px-4 pb-4 pt-5 text-left shadow-xl transition-all min-w-full h-full sm:my-8 sm:max-w-sm sm:p-6"},{default:ft(()=>[O("div",r5t,[xe(o,{"setting-views":t.settingViews,onViewChanged:t.setView},null,8,["setting-views","onViewChanged"]),O("div",i5t,[O("div",s5t,[(pe(!0),ke(Ct,null,Pi(t.currentViewComponents,(d,f)=>(pe(),Gt(hf(d),{key:f}))),128))])])])]),_:1})]),_:1})])])]),_:1},8,["onClose"])]),_:1},8,["show"])}const ez=Vt(e5t,[["render",a5t]]),o5t=pt({name:"HeroComponent",components:{ChevronRightIcon:eue,SettingsModal:ez},setup(){const t=ze(null);return _n(async()=>{try{const r=Nr().keySettings.githubApiKey||!1,i={};r&&(i.Authorization=`Bearer ${r}`);const o=(await(await fetch("https://api.github.com/repos/linkarkitektur/SpeckleLCA/commits/main",{headers:i})).json()).commit.message.split(` -`)[0];t.value=o}catch(n){console.error("Error fetching latest commit:",n)}}),{latestCommit:t,iconUrl:tue,appScreenshotUrl:_ke}}}),l5t={class:"relative isolate select-none overflow-hidden bg-white"},u5t={class:"mx-auto max-w-7xl px-6 pb-24 pt-10 sm:pb-32 lg:flex lg:px-8 lg:py-20"},c5t={class:"mx-auto max-w-2xl lg:mx-0 lg:max-w-xl lg:flex-shrink-0 lg:pt-8"},d5t=["src"],f5t={class:"mt-10 flex items-center gap-x-6"},h5t={class:"object-bottom h-56 overflow-hidden"},p5t={class:"mt-12 sm:mt-10 lg:mt-12"},m5t={href:"https://github.com/linkarkitektur/SpeckleLCA",class:"ml-1 mt-1 inline-flex mr-6"},v5t={class:"items-center mr-6 text-sm font-medium leading-6 text-gray-400"},g5t={key:0,class:"flex items-center"},b5t={key:1},y5t={class:"mx-auto mt-16 flex max-w-2xl sm:mt-24 lg:ml-10 lg:mr-0 lg:mt-0 lg:max-w-7xl lg:flex-none xl:ml-32"},S5t={class:"max-w-3xl flex-none sm:max-w-5xl lg:max-w-none"},x5t={class:"-m-2 rounded-xl bg-gray-900/5 p-2 ring-1 ring-inset ring-gray-900/10 lg:-m-4 lg:rounded-2xl lg:p-4"},T5t=["src"];function w5t(t,e,n,r,i,s){const a=Xe("SettingsModal"),o=Xe("router-link"),l=Xe("ChevronRightIcon");return pe(),ke(Ct,null,[xe(a),O("div",l5t,[e[5]||(e[5]=O("svg",{class:"absolute inset-0 -z-10 h-full w-full stroke-green-200 [mask-image:radial-gradient(100%_100%_at_top_right,white,transparent)]","aria-hidden":"true"},[O("defs",null,[O("pattern",{id:"0787a7c5-978c-4f66-83c7-11c213f99cb7",width:"200",height:"200",x:"50%",y:"-1",patternUnits:"userSpaceOnUse"},[O("path",{d:"M.5 200V.5H200",fill:"none"})])]),O("rect",{width:"100%",height:"100%","stroke-width":"0",fill:"url(#0787a7c5-978c-4f66-83c7-11c213f99cb7)"})],-1)),O("div",u5t,[O("div",c5t,[O("img",{class:"h-20",src:t.iconUrl,alt:"SpeckLCA Logo"},null,8,d5t),e[3]||(e[3]=O("h1",{class:"mt-10 text-4xl font-semibold tracking-tight text-green-600 sm:text-6xl"}," SpeckLCA ",-1)),e[4]||(e[4]=O("p",{class:"ml-1 mt-6 mr-10 text-lg leading-8 text-gray-700"},[yr(" SpeckLCA enables cloud-based sustainability calculations across the AECO value chain. Leveraging the power of open data through the Speckle interoperability system, our vision is to make the LCA process accessible to all."),O("br"),O("br"),yr(" Start using the software today, or join us in making it better over on Github! ")],-1)),O("div",f5t,[xe(o,{to:"/projects",class:"rounded-md bg-green-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-green-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-green-600"},{default:ft(()=>e[0]||(e[0]=[yr(" Get Started ")])),_:1}),e[1]||(e[1]=O("a",{href:"#features",class:"text-sm font-semibold leading-6 text-gray-900"},[yr("Learn More "),O("span",{"aria-hidden":"true"},"→")],-1))]),O("div",h5t,[O("div",p5t,[e[2]||(e[2]=O("button",{type:"button",class:"rounded bg-green-100 px-2 py-1 text-sm font-semibold text-green-600 shadow-md"}," Latest Commits ",-1)),O("a",m5t,[O("span",v5t,[O("span",null,[t.latestCommit?(pe(),ke("span",g5t,[yr(Mt(t.latestCommit)+" ",1),xe(l,{class:"h-5 w-5 text-gray-400","aria-hidden":"true"})])):(pe(),ke("span",b5t,"Loading..."))])])])])])]),O("div",y5t,[O("div",S5t,[O("div",x5t,[O("img",{src:t.appScreenshotUrl,alt:"App screenshot",width:"2432",height:"1442",class:"w-[76rem] rounded-md shadow-2xl ring-1 ring-gray-900/10"},null,8,T5t)])])])])])],64)}const E5t=Vt(o5t,[["render",w5t]]),M5t="/SpeckleLCA/assets/AppPictureMapping-4ba39fea.png",P5t=pt({name:"FeaturesComponent",components:{},setup(){return{features:[{name:"3D models",description:"By simple integration with 3D software and cloud hosting you can connect your sustainability reports directly to your models.",icon:qke},{name:"Materials",description:"Mapping materials towards your models is at the core of LCA, so we made it as simple as possible with a vast array of filters.",icon:Kke},{name:"Modular",description:"SpeckLCA is built on a simple modular system made for you to expand and contribute towards a more sustainable future.",icon:jke}],appScreenshotUrl:M5t}}}),R5t={id:"features",class:"overflow-hidden bg-white py-16 sm:py-24"},V5t={class:"mx-auto max-w-7xl px-6 lg:px-8"},z5t={class:"mx-auto grid max-w-2xl grid-cols-1 gap-x-8 gap-y-16 sm:gap-y-20 lg:mx-0 lg:max-w-none lg:grid-cols-2"},k5t={class:"lg:ml-auto lg:pl-4 lg:pt-4"},O5t={class:"lg:max-w-lg"},I5t={class:"mt-10 max-w-xl space-y-8 text-base leading-7 text-gray-600 lg:max-w-none"},U5t={class:"inline font-semibold text-gray-900"},N5t={class:"inline"},L5t={class:"flex items-start justify-end lg:order-first"},X5t={class:"-m-2 rounded-xl bg-gray-900/10 p-2 ring-1 ring-inset ring-gray-900/10 lg:-m-4 lg:rounded-2xl lg:p-4"},C5t=["src"];function K5t(t,e,n,r,i,s){return pe(),ke("div",R5t,[O("div",V5t,[O("div",z5t,[O("div",k5t,[O("div",O5t,[e[1]||(e[1]=O("h2",{class:"text-base font-semibold leading-7 text-green-600"}," Sustainability in the cloud ",-1)),e[2]||(e[2]=O("p",{class:"mt-2 text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl"}," Go green through SpeckLCA ",-1)),e[3]||(e[3]=O("p",{class:"mt-6 text-lg leading-8 text-gray-600"}," SpeckLCA is using modern technology to provide precise and stable calculations directly from your uploaded 3D models. By developing in a modular way you can make your own extensions to improve the app for your specific needs. ",-1)),O("dl",I5t,[(pe(!0),ke(Ct,null,Pi(t.features,a=>(pe(),ke("div",{key:a.name,class:"relative pl-9"},[O("dt",U5t,[(pe(),Gt(hf(a.icon),{class:"absolute left-1 top-1 h-5 w-5 text-green-600","aria-hidden":"true"})),yr(" "+Mt(a.name),1)]),e[0]||(e[0]=yr(" "+Mt(" ")+" ")),O("dd",N5t,Mt(a.description),1)]))),128))])])]),O("div",L5t,[O("div",X5t,[O("img",{src:t.appScreenshotUrl,alt:"Product screenshot",class:"w-xl max-w-none rounded-xl shadow-xl ring-1 ring-gray-400/10 sm:w-[1200px]",width:"2432",height:"1442"},null,8,C5t)])])])])])}const q5t=Vt(P5t,[["render",K5t]]),D5t=pt({name:"ContributeComponent",components:{},setup(){}}),W5t={class:"bg-white py-8 sm:py-16"};function A5t(t,e,n,r,i,s){return pe(),ke("div",W5t,e[0]||(e[0]=[rV(`

Join our efforts to democratise sustainability and LCA calculations by contributing towards this project. Everything made in this project is open-sourced and will continue to be open for all.

https://github.com/linkarkitektur/SpeckleLCA
`,1)]))}const G5t=Vt(D5t,[["render",A5t]]),F5t=pt({name:"FooterComponent",components:{},setup(){const t=li();return{navigation:{main:[{name:"About",href:"#"},{name:"Blog",href:"#"},{name:"Jobs",href:"#"},{name:"Contact",href:"#"}],social:[{name:"LinkedIn",href:"#",icon:Ake},{name:"GitHub",href:"#",icon:Cke},{name:"Settings",href:"#",icon:Jke}]},toggleSettings:()=>t.toggleSettingsModal()}}}),j5t={class:"bg-white"},Z5t={class:"mx-auto max-w-7xl overflow-hidden px-6 py-20 sm:py-24 lg:px-8"},J5t={class:"mt-10 flex justify-center space-x-10"};function Y5t(t,e,n,r,i,s){return pe(),ke("footer",j5t,[O("div",Z5t,[e[1]||(e[1]=O("nav",{class:"-mb-6 columns-2 sm:flex sm:justify-center sm:space-x-12","aria-label":"Footer"},null,-1)),O("div",J5t,[O("a",{class:"text-gray-400 hover:text-gray-500",onClick:e[0]||(e[0]=(...a)=>t.toggleSettings&&t.toggleSettings(...a))}," Settings ")]),e[2]||(e[2]=O("p",{class:"mt-10 text-center text-xs leading-5 text-gray-500"}," © 2025 LINK Arkitekter, A/S. All rights reserved. ",-1))])])}const B5t=Vt(F5t,[["render",Y5t]]),H5t={name:"LandingView",components:{HeroComponent:E5t,FeaturesComponent:q5t,ContributeComponent:G5t,FooterComponent:B5t},setup(){}};function Q5t(t,e,n,r,i,s){const a=Xe("HeroComponent"),o=Xe("FeaturesComponent"),l=Xe("ContributeComponent"),u=Xe("FooterComponent");return pe(),ke(Ct,null,[xe(a),xe(o),xe(l),xe(u)],64)}const _5t=Vt(H5t,[["render",Q5t]]);function Zbe(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M6.32 2.577a49.255 49.255 0 0 1 11.36 0c1.497.174 2.57 1.46 2.57 2.93V21a.75.75 0 0 1-1.085.67L12 18.089l-7.165 3.583A.75.75 0 0 1 3.75 21V5.507c0-1.47 1.073-2.756 2.57-2.93Z","clip-rule":"evenodd"})])}function $5t(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{d:"m15 1.784-.796.795a1.125 1.125 0 1 0 1.591 0L15 1.784ZM12 1.784l-.796.795a1.125 1.125 0 1 0 1.591 0L12 1.784ZM9 1.784l-.796.795a1.125 1.125 0 1 0 1.591 0L9 1.784ZM9.75 7.547c.498-.021.998-.035 1.5-.042V6.75a.75.75 0 0 1 1.5 0v.755c.502.007 1.002.021 1.5.042V6.75a.75.75 0 0 1 1.5 0v.88l.307.022c1.55.117 2.693 1.427 2.693 2.946v1.018a62.182 62.182 0 0 0-13.5 0v-1.018c0-1.519 1.143-2.829 2.693-2.946l.307-.022v-.88a.75.75 0 0 1 1.5 0v.797ZM12 12.75c-2.472 0-4.9.184-7.274.54-1.454.217-2.476 1.482-2.476 2.916v.384a4.104 4.104 0 0 1 2.585.364 2.605 2.605 0 0 0 2.33 0 4.104 4.104 0 0 1 3.67 0 2.605 2.605 0 0 0 2.33 0 4.104 4.104 0 0 1 3.67 0 2.605 2.605 0 0 0 2.33 0 4.104 4.104 0 0 1 2.585-.364v-.384c0-1.434-1.022-2.7-2.476-2.917A49.138 49.138 0 0 0 12 12.75ZM21.75 18.131a2.604 2.604 0 0 0-1.915.165 4.104 4.104 0 0 1-3.67 0 2.605 2.605 0 0 0-2.33 0 4.104 4.104 0 0 1-3.67 0 2.605 2.605 0 0 0-2.33 0 4.104 4.104 0 0 1-3.67 0 2.604 2.604 0 0 0-1.915-.165v2.494c0 1.035.84 1.875 1.875 1.875h15.75c1.035 0 1.875-.84 1.875-1.875v-2.494Z"})])}function eEt(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M6.32 1.827a49.255 49.255 0 0 1 11.36 0c1.497.174 2.57 1.46 2.57 2.93V19.5a3 3 0 0 1-3 3H6.75a3 3 0 0 1-3-3V4.757c0-1.47 1.073-2.756 2.57-2.93ZM7.5 11.25a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75H8.25a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V13.5a.75.75 0 0 0-.75-.75H8.25Zm-.75 3a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75H8.25a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V18a.75.75 0 0 0-.75-.75H8.25Zm1.748-6a.75.75 0 0 1 .75-.75h.007a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.007a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.335.75.75.75h.007a.75.75 0 0 0 .75-.75V13.5a.75.75 0 0 0-.75-.75h-.007Zm-.75 3a.75.75 0 0 1 .75-.75h.007a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.007a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.335.75.75.75h.007a.75.75 0 0 0 .75-.75V18a.75.75 0 0 0-.75-.75h-.007Zm1.754-6a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.008a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V13.5a.75.75 0 0 0-.75-.75h-.008Zm-.75 3a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.008a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V18a.75.75 0 0 0-.75-.75h-.008Zm1.748-6a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.008a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V13.5a.75.75 0 0 0-.75-.75h-.008Zm-8.25-6A.75.75 0 0 1 8.25 6h7.5a.75.75 0 0 1 .75.75v.75a.75.75 0 0 1-.75.75h-7.5a.75.75 0 0 1-.75-.75v-.75Zm9 9a.75.75 0 0 0-1.5 0V18a.75.75 0 0 0 1.5 0v-2.25Z","clip-rule":"evenodd"})])}function hA(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M12.53 16.28a.75.75 0 0 1-1.06 0l-7.5-7.5a.75.75 0 0 1 1.06-1.06L12 14.69l6.97-6.97a.75.75 0 1 1 1.06 1.06l-7.5 7.5Z","clip-rule":"evenodd"})])}function Jbe(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M7.72 12.53a.75.75 0 0 1 0-1.06l7.5-7.5a.75.75 0 1 1 1.06 1.06L9.31 12l6.97 6.97a.75.75 0 1 1-1.06 1.06l-7.5-7.5Z","clip-rule":"evenodd"})])}function Ybe(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z","clip-rule":"evenodd"})])}function Bbe(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M11.47 7.72a.75.75 0 0 1 1.06 0l7.5 7.5a.75.75 0 1 1-1.06 1.06L12 9.31l-6.97 6.97a.75.75 0 0 1-1.06-1.06l7.5-7.5Z","clip-rule":"evenodd"})])}function tEt(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M8.161 2.58a1.875 1.875 0 0 1 1.678 0l4.993 2.498c.106.052.23.052.336 0l3.869-1.935A1.875 1.875 0 0 1 21.75 4.82v12.485c0 .71-.401 1.36-1.037 1.677l-4.875 2.437a1.875 1.875 0 0 1-1.676 0l-4.994-2.497a.375.375 0 0 0-.336 0l-3.868 1.935A1.875 1.875 0 0 1 2.25 19.18V6.695c0-.71.401-1.36 1.036-1.677l4.875-2.437ZM9 6a.75.75 0 0 1 .75.75V15a.75.75 0 0 1-1.5 0V6.75A.75.75 0 0 1 9 6Zm6.75 3a.75.75 0 0 0-1.5 0v8.25a.75.75 0 0 0 1.5 0V9Z","clip-rule":"evenodd"})])}function Hbe(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm3 10.5a.75.75 0 0 0 0-1.5H9a.75.75 0 0 0 0 1.5h6Z","clip-rule":"evenodd"})])}function tz(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{d:"M21.731 2.269a2.625 2.625 0 0 0-3.712 0l-1.157 1.157 3.712 3.712 1.157-1.157a2.625 2.625 0 0 0 0-3.712ZM19.513 8.199l-3.712-3.712-8.4 8.4a5.25 5.25 0 0 0-1.32 2.214l-.8 2.685a.75.75 0 0 0 .933.933l2.685-.8a5.25 5.25 0 0 0 2.214-1.32l8.4-8.4Z"}),O("path",{d:"M5.25 5.25a3 3 0 0 0-3 3v10.5a3 3 0 0 0 3 3h10.5a3 3 0 0 0 3-3V13.5a.75.75 0 0 0-1.5 0v5.25a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V8.25a1.5 1.5 0 0 1 1.5-1.5h5.25a.75.75 0 0 0 0-1.5H5.25Z"})])}function Qbe(t,e){return pe(),ke("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[O("path",{"fill-rule":"evenodd",d:"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25ZM12.75 9a.75.75 0 0 0-1.5 0v2.25H9a.75.75 0 0 0 0 1.5h2.25V15a.75.75 0 0 0 1.5 0v-2.25H15a.75.75 0 0 0 0-1.5h-2.25V9Z","clip-rule":"evenodd"})])}var _be={exports:{}};const nEt=yle(JTe);/**! * Sortable 1.14.0 * @author RubaXa * @author owenm * @license MIT - */function xte(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(t,i).enumerable})),n.push.apply(n,r)}return n}function sd(t){for(var e=1;e=0)&&(n[i]=t[i]);return n}function sEt(t,e){if(t==null)return{};var n=iEt(t,e),r,i;if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);for(i=0;i=0)&&Object.prototype.propertyIsEnumerable.call(t,r)&&(n[r]=t[r])}return n}function aEt(t){return oEt(t)||lEt(t)||uEt(t)||cEt()}function oEt(t){if(Array.isArray(t))return $4(t)}function lEt(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iterator"]!=null)return Array.from(t)}function uEt(t,e){if(t){if(typeof t=="string")return $4(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);if(n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set")return Array.from(t);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return $4(t,e)}}function $4(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n"&&(e=e.substring(1)),t)try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch{return!1}return!1}}function hEt(t){return t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode}function yu(t,e,n,r){if(t){n=n||document;do{if(e!=null&&(e[0]===">"?t.parentNode===n&&dR(t,e):dR(t,e))||r&&t===n)return t;if(t===n)break}while(t=hEt(t))}return null}var wte=/\s+/g;function Ti(t,e,n){if(t&&e)if(t.classList)t.classList[n?"add":"remove"](e);else{var r=(" "+t.className+" ").replace(wte," ").replace(" "+e+" "," ");t.className=(r+(n?" "+e:"")).replace(wte," ")}}function Nt(t,e,n){var r=t&&t.style;if(r){if(n===void 0)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),e===void 0?n:n[e];!(e in r)&&e.indexOf("webkit")===-1&&(e="-webkit-"+e),r[e]=n+(typeof n=="string"?"":"px")}}function Uv(t,e){var n="";if(typeof t=="string")n=t;else do{var r=Nt(t,"transform");r&&r!=="none"&&(n=r+" "+n)}while(!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function nye(t,e,n){if(t){var r=t.getElementsByTagName(e),i=0,s=r.length;if(n)for(;i=s:a=i<=s,!a)return r;if(r===Bc())break;r=np(r,!1)}return!1}function jb(t,e,n,r){for(var i=0,s=0,a=t.children;s2&&arguments[2]!==void 0?arguments[2]:{},i=r.evt,s=sEt(r,SEt);Mw.pluginEvent.bind(Bt)(e,n,sd({dragEl:yt,parentEl:Oi,ghostEl:dn,rootEl:di,nextEl:nv,lastDownEl:aM,cloneEl:Ii,cloneHidden:Fh,dragStarted:k3,putSortable:Qs,activeSortable:Bt.active,originalEvent:i,oldIndex:T1,oldDraggableIndex:Rx,newIndex:tl,newDraggableIndex:Xh,hideGhostForTarget:lye,unhideGhostForTarget:uye,cloneNowHidden:function(){Fh=!0},cloneNowShown:function(){Fh=!1},dispatchSortableEvent:function(o){Ga({sortable:n,name:o,originalEvent:i})}},s))};function Ga(t){z3(sd({putSortable:Qs,cloneEl:Ii,targetEl:yt,rootEl:di,oldIndex:T1,oldDraggableIndex:Rx,newIndex:tl,newDraggableIndex:Xh},t))}var yt,Oi,dn,di,nv,aM,Ii,Fh,T1,tl,Rx,Xh,LE,Qs,r1=!1,fR=!1,hR=[],Zm,fu,RU,VU,Rte,Vte,k3,Xg,Vx,zx=!1,XE=!1,oM,ba,zU=[],eX=!1,pR=[],nz=typeof document<"u",CE=eye,zte=Ew||Jf?"cssFloat":"float",xEt=nz&&!fEt&&!eye&&"draggable"in document.createElement("div"),sye=function(){if(nz){if(Jf)return!1;var t=document.createElement("x");return t.style.cssText="pointer-events:auto",t.style.pointerEvents==="auto"}}(),aye=function(e,n){var r=Nt(e),i=parseInt(r.width)-parseInt(r.paddingLeft)-parseInt(r.paddingRight)-parseInt(r.borderLeftWidth)-parseInt(r.borderRightWidth),s=jb(e,0,n),a=jb(e,1,n),o=s&&Nt(s),l=a&&Nt(a),u=o&&parseInt(o.marginLeft)+parseInt(o.marginRight)+vi(s).width,c=l&&parseInt(l.marginLeft)+parseInt(l.marginRight)+vi(a).width;if(r.display==="flex")return r.flexDirection==="column"||r.flexDirection==="column-reverse"?"vertical":"horizontal";if(r.display==="grid")return r.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(s&&o.float&&o.float!=="none"){var d=o.float==="left"?"left":"right";return a&&(l.clear==="both"||l.clear===d)?"vertical":"horizontal"}return s&&(o.display==="block"||o.display==="flex"||o.display==="table"||o.display==="grid"||u>=i&&r[zte]==="none"||a&&r[zte]==="none"&&u+c>i)?"vertical":"horizontal"},TEt=function(e,n,r){var i=r?e.left:e.top,s=r?e.right:e.bottom,a=r?e.width:e.height,o=r?n.left:n.top,l=r?n.right:n.bottom,u=r?n.width:n.height;return i===o||s===l||i+a/2===o+u/2},wEt=function(e,n){var r;return hR.some(function(i){var s=i[Va].options.emptyInsertThreshold;if(!(!s||pA(i))){var a=vi(i),o=e>=a.left-s&&e<=a.right+s,l=n>=a.top-s&&n<=a.bottom+s;if(o&&l)return r=i}}),r},oye=function(e){function n(s,a){return function(o,l,u,c){var d=o.options.group.name&&l.options.group.name&&o.options.group.name===l.options.group.name;if(s==null&&(a||d))return!0;if(s==null||s===!1)return!1;if(a&&s==="clone")return s;if(typeof s=="function")return n(s(o,l,u,c),a)(o,l,u,c);var f=(a?o:l).options.group.name;return s===!0||typeof s=="string"&&s===f||s.join&&s.indexOf(f)>-1}}var r={},i=e.group;(!i||sM(i)!="object")&&(i={name:i}),r.name=i.name,r.checkPull=n(i.pull,!0),r.checkPut=n(i.put),r.revertClone=i.revertClone,e.group=r},lye=function(){!sye&&dn&&Nt(dn,"display","none")},uye=function(){!sye&&dn&&Nt(dn,"display","")};nz&&document.addEventListener("click",function(t){if(fR)return t.preventDefault(),t.stopPropagation&&t.stopPropagation(),t.stopImmediatePropagation&&t.stopImmediatePropagation(),fR=!1,!1},!0);var Jm=function(e){if(yt){e=e.touches?e.touches[0]:e;var n=wEt(e.clientX,e.clientY);if(n){var r={};for(var i in e)e.hasOwnProperty(i)&&(r[i]=e[i]);r.target=r.rootEl=n,r.preventDefault=void 0,r.stopPropagation=void 0,n[Va]._onDragOver(r)}}},EEt=function(e){yt&&yt.parentNode[Va]._isOutsideThisEl(e.target)};function Bt(t,e){if(!(t&&t.nodeType&&t.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=Ql({},e),t[Va]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return aye(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(a,o){a.setData("Text",o.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:Bt.supportPointer!==!1&&"PointerEvent"in window&&!Mx,emptyInsertThreshold:5};Mw.initializePlugins(this,t,n);for(var r in n)!(r in e)&&(e[r]=n[r]);oye(e);for(var i in this)i.charAt(0)==="_"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this));this.nativeDraggable=e.forceFallback?!1:xEt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?Un(t,"pointerdown",this._onTapStart):(Un(t,"mousedown",this._onTapStart),Un(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(Un(t,"dragover",this),Un(t,"dragenter",this)),hR.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),Ql(this,gEt())}Bt.prototype={constructor:Bt,_isOutsideThisEl:function(e){!this.el.contains(e)&&e!==this.el&&(Xg=null)},_getDirection:function(e,n){return typeof this.options.direction=="function"?this.options.direction.call(this,e,n,yt):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,r=this.el,i=this.options,s=i.preventOnFilter,a=e.type,o=e.touches&&e.touches[0]||e.pointerType&&e.pointerType==="touch"&&e,l=(o||e).target,u=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=i.filter;if(IEt(r),!yt&&!(/mousedown|pointerdown/.test(a)&&e.button!==0||i.disabled)&&!u.isContentEditable&&!(!this.nativeDraggable&&Mx&&l&&l.tagName.toUpperCase()==="SELECT")&&(l=yu(l,i.draggable,r,!1),!(l&&l.animated)&&aM!==l)){if(T1=Xi(l),Rx=Xi(l,i.draggable),typeof c=="function"){if(c.call(this,e,l,this)){Ga({sortable:n,rootEl:u,name:"filter",targetEl:l,toEl:r,fromEl:r}),To("filter",n,{evt:e}),s&&e.cancelable&&e.preventDefault();return}}else if(c&&(c=c.split(",").some(function(d){if(d=yu(u,d.trim(),r,!1),d)return Ga({sortable:n,rootEl:d,name:"filter",targetEl:l,fromEl:r,toEl:r}),To("filter",n,{evt:e}),!0}),c)){s&&e.cancelable&&e.preventDefault();return}i.handle&&!yu(u,i.handle,r,!1)||this._prepareDragStart(e,o,l)}}},_prepareDragStart:function(e,n,r){var i=this,s=i.el,a=i.options,o=s.ownerDocument,l;if(r&&!yt&&r.parentNode===s){var u=vi(r);if(di=s,yt=r,Oi=yt.parentNode,nv=yt.nextSibling,aM=r,LE=a.group,Bt.dragged=yt,Zm={target:yt,clientX:(n||e).clientX,clientY:(n||e).clientY},Rte=Zm.clientX-u.left,Vte=Zm.clientY-u.top,this._lastX=(n||e).clientX,this._lastY=(n||e).clientY,yt.style["will-change"]="all",l=function(){if(To("delayEnded",i,{evt:e}),Bt.eventCanceled){i._onDrop();return}i._disableDelayedDragEvents(),!Tte&&i.nativeDraggable&&(yt.draggable=!0),i._triggerDragStart(e,n),Ga({sortable:i,name:"choose",originalEvent:e}),Ti(yt,a.chosenClass,!0)},a.ignore.split(",").forEach(function(c){nye(yt,c.trim(),kU)}),Un(o,"dragover",Jm),Un(o,"mousemove",Jm),Un(o,"touchmove",Jm),Un(o,"mouseup",i._onDrop),Un(o,"touchend",i._onDrop),Un(o,"touchcancel",i._onDrop),Tte&&this.nativeDraggable&&(this.options.touchStartThreshold=4,yt.draggable=!0),To("delayStart",this,{evt:e}),a.delay&&(!a.delayOnTouchOnly||n)&&(!this.nativeDraggable||!(Ew||Jf))){if(Bt.eventCanceled){this._onDrop();return}Un(o,"mouseup",i._disableDelayedDrag),Un(o,"touchend",i._disableDelayedDrag),Un(o,"touchcancel",i._disableDelayedDrag),Un(o,"mousemove",i._delayedDragTouchMoveHandler),Un(o,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&Un(o,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(l,a.delay)}else l()}},_delayedDragTouchMoveHandler:function(e){var n=e.touches?e.touches[0]:e;Math.max(Math.abs(n.clientX-this._lastX),Math.abs(n.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){yt&&kU(yt),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var e=this.el.ownerDocument;wn(e,"mouseup",this._disableDelayedDrag),wn(e,"touchend",this._disableDelayedDrag),wn(e,"touchcancel",this._disableDelayedDrag),wn(e,"mousemove",this._delayedDragTouchMoveHandler),wn(e,"touchmove",this._delayedDragTouchMoveHandler),wn(e,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(e,n){n=n||e.pointerType=="touch"&&e,!this.nativeDraggable||n?this.options.supportPointer?Un(document,"pointermove",this._onTouchMove):n?Un(document,"touchmove",this._onTouchMove):Un(document,"mousemove",this._onTouchMove):(Un(yt,"dragend",this),Un(di,"dragstart",this._onDragStart));try{document.selection?lM(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(e,n){if(r1=!1,di&&yt){To("dragStarted",this,{evt:n}),this.nativeDraggable&&Un(document,"dragover",EEt);var r=this.options;!e&&Ti(yt,r.dragClass,!1),Ti(yt,r.ghostClass,!0),Bt.active=this,e&&this._appendGhost(),Ga({sortable:this,name:"start",originalEvent:n})}else this._nulling()},_emulateDragOver:function(){if(fu){this._lastX=fu.clientX,this._lastY=fu.clientY,lye();for(var e=document.elementFromPoint(fu.clientX,fu.clientY),n=e;e&&e.shadowRoot&&(e=e.shadowRoot.elementFromPoint(fu.clientX,fu.clientY),e!==n);)n=e;if(yt.parentNode[Va]._isOutsideThisEl(e),n)do{if(n[Va]){var r=void 0;if(r=n[Va]._onDragOver({clientX:fu.clientX,clientY:fu.clientY,target:e,rootEl:n}),r&&!this.options.dragoverBubble)break}e=n}while(n=n.parentNode);uye()}},_onTouchMove:function(e){if(Zm){var n=this.options,r=n.fallbackTolerance,i=n.fallbackOffset,s=e.touches?e.touches[0]:e,a=dn&&Uv(dn,!0),o=dn&&a&&a.a,l=dn&&a&&a.d,u=CE&&ba&&Mte(ba),c=(s.clientX-Zm.clientX+i.x)/(o||1)+(u?u[0]-zU[0]:0)/(o||1),d=(s.clientY-Zm.clientY+i.y)/(l||1)+(u?u[1]-zU[1]:0)/(l||1);if(!Bt.active&&!r1){if(r&&Math.max(Math.abs(s.clientX-this._lastX),Math.abs(s.clientY-this._lastY))=0&&(Ga({rootEl:Oi,name:"add",toEl:Oi,fromEl:di,originalEvent:e}),Ga({sortable:this,name:"remove",toEl:Oi,originalEvent:e}),Ga({rootEl:Oi,name:"sort",toEl:Oi,fromEl:di,originalEvent:e}),Ga({sortable:this,name:"sort",toEl:Oi,originalEvent:e})),Qs&&Qs.save()):tl!==T1&&tl>=0&&(Ga({sortable:this,name:"update",toEl:Oi,originalEvent:e}),Ga({sortable:this,name:"sort",toEl:Oi,originalEvent:e})),Bt.active&&((tl==null||tl===-1)&&(tl=T1,Xh=Rx),Ga({sortable:this,name:"end",toEl:Oi,originalEvent:e}),this.save()))),this._nulling()},_nulling:function(){To("nulling",this),di=yt=Oi=dn=nv=Ii=aM=Fh=Zm=fu=k3=tl=Xh=T1=Rx=Xg=Vx=Qs=LE=Bt.dragged=Bt.ghost=Bt.clone=Bt.active=null,pR.forEach(function(e){e.checked=!0}),pR.length=RU=VU=0},handleEvent:function(e){switch(e.type){case"drop":case"dragend":this._onDrop(e);break;case"dragenter":case"dragover":yt&&(this._onDragOver(e),MEt(e));break;case"selectstart":e.preventDefault();break}},toArray:function(){for(var e=[],n,r=this.el.children,i=0,s=r.length,a=this.options;ir.right+i||t.clientX<=r.right&&t.clientY>r.bottom&&t.clientX>=r.left:t.clientX>r.right&&t.clientY>r.top||t.clientX<=r.right&&t.clientY>r.bottom+i}function zEt(t,e,n,r,i,s,a,o){var l=r?t.clientY:t.clientX,u=r?n.height:n.width,c=r?n.top:n.left,d=r?n.bottom:n.right,f=!1;if(!a){if(o&&oMc+u*s/2:ld-oM)return-Vx}else if(l>c+u*(1-i)/2&&ld-u*s/2)?l>c+u/2?1:-1:0}function kEt(t){return Xi(yt)1&&(nn.forEach(function(o){s.addAnimationState({target:o,rect:wo?vi(o):a}),MU(o),o.fromRect=a,r.removeAnimationState(o)}),wo=!1,CEt(!this.options.removeCloneOnHide,i))},dragOverCompleted:function(n){var r=n.sortable,i=n.isOwner,s=n.insertion,a=n.activeSortable,o=n.parentEl,l=n.putSortable,u=this.options;if(s){if(i&&a._hideClone(),i3=!1,u.animation&&nn.length>1&&(wo||!i&&!a.options.sort&&!l)){var c=vi(Zr,!1,!0,!0);nn.forEach(function(f){f!==Zr&&(Pte(f,c),o.appendChild(f))}),wo=!0}if(!i)if(wo||DE(),nn.length>1){var d=qE;a._showClone(r),a.options.animation&&!qE&&d&&$o.forEach(function(f){a.addAnimationState({target:f,rect:s3}),f.fromRect=s3,f.thisAnimationDuration=null})}else a._showClone(r)}},dragOverAnimationCapture:function(n){var r=n.dragRect,i=n.isOwner,s=n.activeSortable;if(nn.forEach(function(o){o.thisAnimationDuration=null}),s.options.animation&&!i&&s.multiDrag.isMultiDrag){s3=Ql({},r);var a=Uv(Zr,!0);s3.top-=a.f,s3.left-=a.e}},dragOverAnimationComplete:function(){wo&&(wo=!1,DE())},drop:function(n){var r=n.originalEvent,i=n.rootEl,s=n.parentEl,a=n.sortable,o=n.dispatchSortableEvent,l=n.oldIndex,u=n.putSortable,c=u||this.sortable;if(r){var d=this.options,f=s.children;if(!Cg)if(d.multiDragKey&&!this.multiDragKeyDown&&this._deselectMultiDrag(),Ti(Zr,d.selectedClass,!~nn.indexOf(Zr)),~nn.indexOf(Zr))nn.splice(nn.indexOf(Zr),1),r3=null,z3({sortable:a,rootEl:i,name:"deselect",targetEl:Zr,originalEvt:r});else{if(nn.push(Zr),z3({sortable:a,rootEl:i,name:"select",targetEl:Zr,originalEvt:r}),r.shiftKey&&r3&&a.el.contains(r3)){var h=Xi(r3),p=Xi(Zr);if(~h&&~p&&h!==p){var m,v;for(p>h?(v=h,m=p):(v=p,m=h+1);v1){var g=vi(Zr),b=Xi(Zr,":not(."+this.options.selectedClass+")");if(!i3&&d.animation&&(Zr.thisAnimationDuration=null),c.captureAnimationState(),!i3&&(d.animation&&(Zr.fromRect=g,nn.forEach(function(x){if(x.thisAnimationDuration=null,x!==Zr){var T=wo?vi(x):g;x.fromRect=T,c.addAnimationState({target:x,rect:T})}})),DE(),nn.forEach(function(x){f[b]?s.insertBefore(x,f[b]):s.appendChild(x),b++}),l===Xi(Zr))){var y=!1;nn.forEach(function(x){if(x.sortableIndex!==Xi(x)){y=!0;return}}),y&&o("update")}nn.forEach(function(x){MU(x)}),c.animateAll()}hu=c}(i===s||u&&u.lastPutMode!=="clone")&&$o.forEach(function(x){x.parentNode&&x.parentNode.removeChild(x)})}},nullingGlobal:function(){this.isMultiDrag=Cg=!1,$o.length=0},destroyGlobal:function(){this._deselectMultiDrag(),wn(document,"pointerup",this._deselectMultiDrag),wn(document,"mouseup",this._deselectMultiDrag),wn(document,"touchend",this._deselectMultiDrag),wn(document,"keydown",this._checkKeyDown),wn(document,"keyup",this._checkKeyUp)},_deselectMultiDrag:function(n){if(!(typeof Cg<"u"&&Cg)&&hu===this.sortable&&!(n&&yu(n.target,this.options.draggable,this.sortable.el,!1))&&!(n&&n.button!==0))for(;nn.length;){var r=nn[0];Ti(r,this.options.selectedClass,!1),nn.shift(),z3({sortable:this.sortable,rootEl:this.sortable.el,name:"deselect",targetEl:r,originalEvt:n})}},_checkKeyDown:function(n){n.key===this.options.multiDragKey&&(this.multiDragKeyDown=!0)},_checkKeyUp:function(n){n.key===this.options.multiDragKey&&(this.multiDragKeyDown=!1)}},Ql(t,{pluginName:"multiDrag",utils:{select:function(n){var r=n.parentNode[Va];!r||!r.options.multiDrag||~nn.indexOf(n)||(hu&&hu!==r&&(hu.multiDrag._deselectMultiDrag(),hu=r),Ti(n,r.options.selectedClass,!0),nn.push(n))},deselect:function(n){var r=n.parentNode[Va],i=nn.indexOf(n);!r||!r.options.multiDrag||!~i||(Ti(n,r.options.selectedClass,!1),nn.splice(i,1))}},eventProperties:function(){var n=this,r=[],i=[];return nn.forEach(function(s){r.push({multiDragElement:s,index:s.sortableIndex});var a;wo&&s!==Zr?a=-1:wo?a=Xi(s,":not(."+n.options.selectedClass+")"):a=Xi(s),i.push({multiDragElement:s,index:a})}),{items:aEt(nn),clones:[].concat($o),oldIndicies:r,newIndicies:i}},optionListeners:{multiDragKey:function(n){return n=n.toLowerCase(),n==="ctrl"?n="Control":n.length>1&&(n=n.charAt(0).toUpperCase()+n.substr(1)),n}}})}function CEt(t,e){nn.forEach(function(n,r){var i=e.children[n.sortableIndex+(t?Number(r):0)];i?e.insertBefore(n,i):e.appendChild(n)})}function Ote(t,e){$o.forEach(function(n,r){var i=e.children[n.sortableIndex+(t?Number(r):0)];i?e.insertBefore(n,i):e.appendChild(n)})}function DE(){nn.forEach(function(t){t!==Zr&&t.parentNode&&t.parentNode.removeChild(t)})}Bt.mount(new UEt);Bt.mount(gA,vA);const KEt=Object.freeze(Object.defineProperty({__proto__:null,MultiDrag:XEt,Sortable:Bt,Swap:NEt,default:Bt},Symbol.toStringTag,{value:"Module"})),qEt=Sle(KEt);(function(t,e){(function(r,i){t.exports=i(nEt,qEt)})(typeof self<"u"?self:Ks,function(n,r){return function(i){var s={};function a(o){if(s[o])return s[o].exports;var l=s[o]={i:o,l:!1,exports:{}};return i[o].call(l.exports,l,l.exports,a),l.l=!0,l.exports}return a.m=i,a.c=s,a.d=function(o,l,u){a.o(o,l)||Object.defineProperty(o,l,{enumerable:!0,get:u})},a.r=function(o){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(o,"__esModule",{value:!0})},a.t=function(o,l){if(l&1&&(o=a(o)),l&8||l&4&&typeof o=="object"&&o&&o.__esModule)return o;var u=Object.create(null);if(a.r(u),Object.defineProperty(u,"default",{enumerable:!0,value:o}),l&2&&typeof o!="string")for(var c in o)a.d(u,c,(function(d){return o[d]}).bind(null,c));return u},a.n=function(o){var l=o&&o.__esModule?function(){return o.default}:function(){return o};return a.d(l,"a",l),l},a.o=function(o,l){return Object.prototype.hasOwnProperty.call(o,l)},a.p="",a(a.s="fb15")}({"00ee":function(i,s,a){var o=a("b622"),l=o("toStringTag"),u={};u[l]="z",i.exports=String(u)==="[object z]"},"0366":function(i,s,a){var o=a("1c0b");i.exports=function(l,u,c){if(o(l),u===void 0)return l;switch(c){case 0:return function(){return l.call(u)};case 1:return function(d){return l.call(u,d)};case 2:return function(d,f){return l.call(u,d,f)};case 3:return function(d,f,h){return l.call(u,d,f,h)}}return function(){return l.apply(u,arguments)}}},"057f":function(i,s,a){var o=a("fc6a"),l=a("241c").f,u={}.toString,c=typeof window=="object"&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],d=function(f){try{return l(f)}catch{return c.slice()}};i.exports.f=function(h){return c&&u.call(h)=="[object Window]"?d(h):l(o(h))}},"06cf":function(i,s,a){var o=a("83ab"),l=a("d1e7"),u=a("5c6c"),c=a("fc6a"),d=a("c04e"),f=a("5135"),h=a("0cfb"),p=Object.getOwnPropertyDescriptor;s.f=o?p:function(v,g){if(v=c(v),g=d(g,!0),h)try{return p(v,g)}catch{}if(f(v,g))return u(!l.f.call(v,g),v[g])}},"0cfb":function(i,s,a){var o=a("83ab"),l=a("d039"),u=a("cc12");i.exports=!o&&!l(function(){return Object.defineProperty(u("div"),"a",{get:function(){return 7}}).a!=7})},"13d5":function(i,s,a){var o=a("23e7"),l=a("d58f").left,u=a("a640"),c=a("ae40"),d=u("reduce"),f=c("reduce",{1:0});o({target:"Array",proto:!0,forced:!d||!f},{reduce:function(p){return l(this,p,arguments.length,arguments.length>1?arguments[1]:void 0)}})},"14c3":function(i,s,a){var o=a("c6b6"),l=a("9263");i.exports=function(u,c){var d=u.exec;if(typeof d=="function"){var f=d.call(u,c);if(typeof f!="object")throw TypeError("RegExp exec method returned something other than an Object or null");return f}if(o(u)!=="RegExp")throw TypeError("RegExp#exec called on incompatible receiver");return l.call(u,c)}},"159b":function(i,s,a){var o=a("da84"),l=a("fdbc"),u=a("17c2"),c=a("9112");for(var d in l){var f=o[d],h=f&&f.prototype;if(h&&h.forEach!==u)try{c(h,"forEach",u)}catch{h.forEach=u}}},"17c2":function(i,s,a){var o=a("b727").forEach,l=a("a640"),u=a("ae40"),c=l("forEach"),d=u("forEach");i.exports=!c||!d?function(h){return o(this,h,arguments.length>1?arguments[1]:void 0)}:[].forEach},"1be4":function(i,s,a){var o=a("d066");i.exports=o("document","documentElement")},"1c0b":function(i,s){i.exports=function(a){if(typeof a!="function")throw TypeError(String(a)+" is not a function");return a}},"1c7e":function(i,s,a){var o=a("b622"),l=o("iterator"),u=!1;try{var c=0,d={next:function(){return{done:!!c++}},return:function(){u=!0}};d[l]=function(){return this},Array.from(d,function(){throw 2})}catch{}i.exports=function(f,h){if(!h&&!u)return!1;var p=!1;try{var m={};m[l]=function(){return{next:function(){return{done:p=!0}}}},f(m)}catch{}return p}},"1d80":function(i,s){i.exports=function(a){if(a==null)throw TypeError("Can't call method on "+a);return a}},"1dde":function(i,s,a){var o=a("d039"),l=a("b622"),u=a("2d00"),c=l("species");i.exports=function(d){return u>=51||!o(function(){var f=[],h=f.constructor={};return h[c]=function(){return{foo:1}},f[d](Boolean).foo!==1})}},"23cb":function(i,s,a){var o=a("a691"),l=Math.max,u=Math.min;i.exports=function(c,d){var f=o(c);return f<0?l(f+d,0):u(f,d)}},"23e7":function(i,s,a){var o=a("da84"),l=a("06cf").f,u=a("9112"),c=a("6eeb"),d=a("ce4e"),f=a("e893"),h=a("94ca");i.exports=function(p,m){var v=p.target,g=p.global,b=p.stat,y,x,T,M,E,S;if(g?x=o:b?x=o[v]||d(v,{}):x=(o[v]||{}).prototype,x)for(T in m){if(E=m[T],p.noTargetGet?(S=l(x,T),M=S&&S.value):M=x[T],y=h(g?T:v+(b?".":"#")+T,p.forced),!y&&M!==void 0){if(typeof E==typeof M)continue;f(E,M)}(p.sham||M&&M.sham)&&u(E,"sham",!0),c(x,T,E,p)}}},"241c":function(i,s,a){var o=a("ca84"),l=a("7839"),u=l.concat("length","prototype");s.f=Object.getOwnPropertyNames||function(d){return o(d,u)}},"25f0":function(i,s,a){var o=a("6eeb"),l=a("825a"),u=a("d039"),c=a("ad6d"),d="toString",f=RegExp.prototype,h=f[d],p=u(function(){return h.call({source:"a",flags:"b"})!="/a/b"}),m=h.name!=d;(p||m)&&o(RegExp.prototype,d,function(){var g=l(this),b=String(g.source),y=g.flags,x=String(y===void 0&&g instanceof RegExp&&!("flags"in f)?c.call(g):y);return"/"+b+"/"+x},{unsafe:!0})},"2ca0":function(i,s,a){var o=a("23e7"),l=a("06cf").f,u=a("50c4"),c=a("5a34"),d=a("1d80"),f=a("ab13"),h=a("c430"),p="".startsWith,m=Math.min,v=f("startsWith"),g=!h&&!v&&!!function(){var b=l(String.prototype,"startsWith");return b&&!b.writable}();o({target:"String",proto:!0,forced:!g&&!v},{startsWith:function(y){var x=String(d(this));c(y);var T=u(m(arguments.length>1?arguments[1]:void 0,x.length)),M=String(y);return p?p.call(x,M,T):x.slice(T,T+M.length)===M}})},"2d00":function(i,s,a){var o=a("da84"),l=a("342f"),u=o.process,c=u&&u.versions,d=c&&c.v8,f,h;d?(f=d.split("."),h=f[0]+f[1]):l&&(f=l.match(/Edge\/(\d+)/),(!f||f[1]>=74)&&(f=l.match(/Chrome\/(\d+)/),f&&(h=f[1]))),i.exports=h&&+h},"342f":function(i,s,a){var o=a("d066");i.exports=o("navigator","userAgent")||""},"35a1":function(i,s,a){var o=a("f5df"),l=a("3f8c"),u=a("b622"),c=u("iterator");i.exports=function(d){if(d!=null)return d[c]||d["@@iterator"]||l[o(d)]}},"37e8":function(i,s,a){var o=a("83ab"),l=a("9bf2"),u=a("825a"),c=a("df75");i.exports=o?Object.defineProperties:function(f,h){u(f);for(var p=c(h),m=p.length,v=0,g;m>v;)l.f(f,g=p[v++],h[g]);return f}},"3bbe":function(i,s,a){var o=a("861d");i.exports=function(l){if(!o(l)&&l!==null)throw TypeError("Can't set "+String(l)+" as a prototype");return l}},"3ca3":function(i,s,a){var o=a("6547").charAt,l=a("69f3"),u=a("7dd0"),c="String Iterator",d=l.set,f=l.getterFor(c);u(String,"String",function(h){d(this,{type:c,string:String(h),index:0})},function(){var p=f(this),m=p.string,v=p.index,g;return v>=m.length?{value:void 0,done:!0}:(g=o(m,v),p.index+=g.length,{value:g,done:!1})})},"3f8c":function(i,s){i.exports={}},4160:function(i,s,a){var o=a("23e7"),l=a("17c2");o({target:"Array",proto:!0,forced:[].forEach!=l},{forEach:l})},"428f":function(i,s,a){var o=a("da84");i.exports=o},"44ad":function(i,s,a){var o=a("d039"),l=a("c6b6"),u="".split;i.exports=o(function(){return!Object("z").propertyIsEnumerable(0)})?function(c){return l(c)=="String"?u.call(c,""):Object(c)}:Object},"44d2":function(i,s,a){var o=a("b622"),l=a("7c73"),u=a("9bf2"),c=o("unscopables"),d=Array.prototype;d[c]==null&&u.f(d,c,{configurable:!0,value:l(null)}),i.exports=function(f){d[c][f]=!0}},"44e7":function(i,s,a){var o=a("861d"),l=a("c6b6"),u=a("b622"),c=u("match");i.exports=function(d){var f;return o(d)&&((f=d[c])!==void 0?!!f:l(d)=="RegExp")}},4930:function(i,s,a){var o=a("d039");i.exports=!!Object.getOwnPropertySymbols&&!o(function(){return!String(Symbol())})},"4d64":function(i,s,a){var o=a("fc6a"),l=a("50c4"),u=a("23cb"),c=function(d){return function(f,h,p){var m=o(f),v=l(m.length),g=u(p,v),b;if(d&&h!=h){for(;v>g;)if(b=m[g++],b!=b)return!0}else for(;v>g;g++)if((d||g in m)&&m[g]===h)return d||g||0;return!d&&-1}};i.exports={includes:c(!0),indexOf:c(!1)}},"4de4":function(i,s,a){var o=a("23e7"),l=a("b727").filter,u=a("1dde"),c=a("ae40"),d=u("filter"),f=c("filter");o({target:"Array",proto:!0,forced:!d||!f},{filter:function(p){return l(this,p,arguments.length>1?arguments[1]:void 0)}})},"4df4":function(i,s,a){var o=a("0366"),l=a("7b0b"),u=a("9bdd"),c=a("e95a"),d=a("50c4"),f=a("8418"),h=a("35a1");i.exports=function(m){var v=l(m),g=typeof this=="function"?this:Array,b=arguments.length,y=b>1?arguments[1]:void 0,x=y!==void 0,T=h(v),M=0,E,S,P,R,V,z;if(x&&(y=o(y,b>2?arguments[2]:void 0,2)),T!=null&&!(g==Array&&c(T)))for(R=T.call(v),V=R.next,S=new g;!(P=V.call(R)).done;M++)z=x?u(R,y,[P.value,M],!0):P.value,f(S,M,z);else for(E=d(v.length),S=new g(E);E>M;M++)z=x?y(v[M],M):v[M],f(S,M,z);return S.length=M,S}},"4fad":function(i,s,a){var o=a("23e7"),l=a("6f53").entries;o({target:"Object",stat:!0},{entries:function(c){return l(c)}})},"50c4":function(i,s,a){var o=a("a691"),l=Math.min;i.exports=function(u){return u>0?l(o(u),9007199254740991):0}},5135:function(i,s){var a={}.hasOwnProperty;i.exports=function(o,l){return a.call(o,l)}},5319:function(i,s,a){var o=a("d784"),l=a("825a"),u=a("7b0b"),c=a("50c4"),d=a("a691"),f=a("1d80"),h=a("8aa5"),p=a("14c3"),m=Math.max,v=Math.min,g=Math.floor,b=/\$([$&'`]|\d\d?|<[^>]*>)/g,y=/\$([$&'`]|\d\d?)/g,x=function(T){return T===void 0?T:String(T)};o("replace",2,function(T,M,E,S){var P=S.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,R=S.REPLACE_KEEPS_$0,V=P?"$":"$0";return[function(N,q){var L=f(this),A=N==null?void 0:N[T];return A!==void 0?A.call(N,L,q):M.call(String(L),N,q)},function(k,N){if(!P&&R||typeof N=="string"&&N.indexOf(V)===-1){var q=E(M,k,this,N);if(q.done)return q.value}var L=l(k),A=String(this),Z=typeof N=="function";Z||(N=String(N));var j=L.global;if(j){var ne=L.unicode;L.lastIndex=0}for(var G=[];;){var B=p(L,A);if(B===null||(G.push(B),!j))break;var ee=String(B[0]);ee===""&&(L.lastIndex=h(A,c(L.lastIndex),ne))}for(var ce="",fe=0,te=0;te=fe&&(ce+=A.slice(fe,oe)+D,fe=oe+_.length)}return ce+A.slice(fe)}];function z(k,N,q,L,A,Z){var j=q+k.length,ne=L.length,G=y;return A!==void 0&&(A=u(A),G=b),M.call(Z,G,function(B,ee){var ce;switch(ee.charAt(0)){case"$":return"$";case"&":return k;case"`":return N.slice(0,q);case"'":return N.slice(j);case"<":ce=A[ee.slice(1,-1)];break;default:var fe=+ee;if(fe===0)return B;if(fe>ne){var te=g(fe/10);return te===0?B:te<=ne?L[te-1]===void 0?ee.charAt(1):L[te-1]+ee.charAt(1):B}ce=L[fe-1]}return ce===void 0?"":ce})}})},5692:function(i,s,a){var o=a("c430"),l=a("c6cd");(i.exports=function(u,c){return l[u]||(l[u]=c!==void 0?c:{})})("versions",[]).push({version:"3.6.5",mode:o?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},"56ef":function(i,s,a){var o=a("d066"),l=a("241c"),u=a("7418"),c=a("825a");i.exports=o("Reflect","ownKeys")||function(f){var h=l.f(c(f)),p=u.f;return p?h.concat(p(f)):h}},"5a34":function(i,s,a){var o=a("44e7");i.exports=function(l){if(o(l))throw TypeError("The method doesn't accept regular expressions");return l}},"5c6c":function(i,s){i.exports=function(a,o){return{enumerable:!(a&1),configurable:!(a&2),writable:!(a&4),value:o}}},"5db7":function(i,s,a){var o=a("23e7"),l=a("a2bf"),u=a("7b0b"),c=a("50c4"),d=a("1c0b"),f=a("65f0");o({target:"Array",proto:!0},{flatMap:function(p){var m=u(this),v=c(m.length),g;return d(p),g=f(m,0),g.length=l(g,m,m,v,0,1,p,arguments.length>1?arguments[1]:void 0),g}})},6547:function(i,s,a){var o=a("a691"),l=a("1d80"),u=function(c){return function(d,f){var h=String(l(d)),p=o(f),m=h.length,v,g;return p<0||p>=m?c?"":void 0:(v=h.charCodeAt(p),v<55296||v>56319||p+1===m||(g=h.charCodeAt(p+1))<56320||g>57343?c?h.charAt(p):v:c?h.slice(p,p+2):(v-55296<<10)+(g-56320)+65536)}};i.exports={codeAt:u(!1),charAt:u(!0)}},"65f0":function(i,s,a){var o=a("861d"),l=a("e8b5"),u=a("b622"),c=u("species");i.exports=function(d,f){var h;return l(d)&&(h=d.constructor,typeof h=="function"&&(h===Array||l(h.prototype))?h=void 0:o(h)&&(h=h[c],h===null&&(h=void 0))),new(h===void 0?Array:h)(f===0?0:f)}},"69f3":function(i,s,a){var o=a("7f9a"),l=a("da84"),u=a("861d"),c=a("9112"),d=a("5135"),f=a("f772"),h=a("d012"),p=l.WeakMap,m,v,g,b=function(P){return g(P)?v(P):m(P,{})},y=function(P){return function(R){var V;if(!u(R)||(V=v(R)).type!==P)throw TypeError("Incompatible receiver, "+P+" required");return V}};if(o){var x=new p,T=x.get,M=x.has,E=x.set;m=function(P,R){return E.call(x,P,R),R},v=function(P){return T.call(x,P)||{}},g=function(P){return M.call(x,P)}}else{var S=f("state");h[S]=!0,m=function(P,R){return c(P,S,R),R},v=function(P){return d(P,S)?P[S]:{}},g=function(P){return d(P,S)}}i.exports={set:m,get:v,has:g,enforce:b,getterFor:y}},"6eeb":function(i,s,a){var o=a("da84"),l=a("9112"),u=a("5135"),c=a("ce4e"),d=a("8925"),f=a("69f3"),h=f.get,p=f.enforce,m=String(String).split("String");(i.exports=function(v,g,b,y){var x=y?!!y.unsafe:!1,T=y?!!y.enumerable:!1,M=y?!!y.noTargetGet:!1;if(typeof b=="function"&&(typeof g=="string"&&!u(b,"name")&&l(b,"name",g),p(b).source=m.join(typeof g=="string"?g:"")),v===o){T?v[g]=b:c(g,b);return}else x?!M&&v[g]&&(T=!0):delete v[g];T?v[g]=b:l(v,g,b)})(Function.prototype,"toString",function(){return typeof this=="function"&&h(this).source||d(this)})},"6f53":function(i,s,a){var o=a("83ab"),l=a("df75"),u=a("fc6a"),c=a("d1e7").f,d=function(f){return function(h){for(var p=u(h),m=l(p),v=m.length,g=0,b=[],y;v>g;)y=m[g++],(!o||c.call(p,y))&&b.push(f?[y,p[y]]:p[y]);return b}};i.exports={entries:d(!0),values:d(!1)}},"73d9":function(i,s,a){var o=a("44d2");o("flatMap")},7418:function(i,s){s.f=Object.getOwnPropertySymbols},"746f":function(i,s,a){var o=a("428f"),l=a("5135"),u=a("e538"),c=a("9bf2").f;i.exports=function(d){var f=o.Symbol||(o.Symbol={});l(f,d)||c(f,d,{value:u.f(d)})}},7839:function(i,s){i.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},"7b0b":function(i,s,a){var o=a("1d80");i.exports=function(l){return Object(o(l))}},"7c73":function(i,s,a){var o=a("825a"),l=a("37e8"),u=a("7839"),c=a("d012"),d=a("1be4"),f=a("cc12"),h=a("f772"),p=">",m="<",v="prototype",g="script",b=h("IE_PROTO"),y=function(){},x=function(P){return m+g+p+P+m+"/"+g+p},T=function(P){P.write(x("")),P.close();var R=P.parentWindow.Object;return P=null,R},M=function(){var P=f("iframe"),R="java"+g+":",V;return P.style.display="none",d.appendChild(P),P.src=String(R),V=P.contentWindow.document,V.open(),V.write(x("document.F=Object")),V.close(),V.F},E,S=function(){try{E=document.domain&&new ActiveXObject("htmlfile")}catch{}S=E?T(E):M();for(var P=u.length;P--;)delete S[v][u[P]];return S()};c[b]=!0,i.exports=Object.create||function(R,V){var z;return R!==null?(y[v]=o(R),z=new y,y[v]=null,z[b]=R):z=S(),V===void 0?z:l(z,V)}},"7dd0":function(i,s,a){var o=a("23e7"),l=a("9ed3"),u=a("e163"),c=a("d2bb"),d=a("d44e"),f=a("9112"),h=a("6eeb"),p=a("b622"),m=a("c430"),v=a("3f8c"),g=a("ae93"),b=g.IteratorPrototype,y=g.BUGGY_SAFARI_ITERATORS,x=p("iterator"),T="keys",M="values",E="entries",S=function(){return this};i.exports=function(P,R,V,z,k,N,q){l(V,R,z);var L=function(te){if(te===k&&G)return G;if(!y&&te in j)return j[te];switch(te){case T:return function(){return new V(this,te)};case M:return function(){return new V(this,te)};case E:return function(){return new V(this,te)}}return function(){return new V(this)}},A=R+" Iterator",Z=!1,j=P.prototype,ne=j[x]||j["@@iterator"]||k&&j[k],G=!y&&ne||L(k),B=R=="Array"&&j.entries||ne,ee,ce,fe;if(B&&(ee=u(B.call(new P)),b!==Object.prototype&&ee.next&&(!m&&u(ee)!==b&&(c?c(ee,b):typeof ee[x]!="function"&&f(ee,x,S)),d(ee,A,!0,!0),m&&(v[A]=S))),k==M&&ne&&ne.name!==M&&(Z=!0,G=function(){return ne.call(this)}),(!m||q)&&j[x]!==G&&f(j,x,G),v[R]=G,k)if(ce={values:L(M),keys:N?G:L(T),entries:L(E)},q)for(fe in ce)(y||Z||!(fe in j))&&h(j,fe,ce[fe]);else o({target:R,proto:!0,forced:y||Z},ce);return ce}},"7f9a":function(i,s,a){var o=a("da84"),l=a("8925"),u=o.WeakMap;i.exports=typeof u=="function"&&/native code/.test(l(u))},"825a":function(i,s,a){var o=a("861d");i.exports=function(l){if(!o(l))throw TypeError(String(l)+" is not an object");return l}},"83ab":function(i,s,a){var o=a("d039");i.exports=!o(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!=7})},8418:function(i,s,a){var o=a("c04e"),l=a("9bf2"),u=a("5c6c");i.exports=function(c,d,f){var h=o(d);h in c?l.f(c,h,u(0,f)):c[h]=f}},"861d":function(i,s){i.exports=function(a){return typeof a=="object"?a!==null:typeof a=="function"}},8875:function(i,s,a){var o,l,u;(function(c,d){l=[],o=d,u=typeof o=="function"?o.apply(s,l):o,u!==void 0&&(i.exports=u)})(typeof self<"u"?self:this,function(){function c(){var d=Object.getOwnPropertyDescriptor(document,"currentScript");if(!d&&"currentScript"in document&&document.currentScript||d&&d.get!==c&&document.currentScript)return document.currentScript;try{throw new Error}catch(E){var f=/.*at [^(]*\((.*):(.+):(.+)\)$/ig,h=/@([^@]*):(\d+):(\d+)\s*$/ig,p=f.exec(E.stack)||h.exec(E.stack),m=p&&p[1]||!1,v=p&&p[2]||!1,g=document.location.href.replace(document.location.hash,""),b,y,x,T=document.getElementsByTagName("script");m===g&&(b=document.documentElement.outerHTML,y=new RegExp("(?:[^\\n]+?\\n){0,"+(v-2)+"}[^<]*\n\n\n","\n\n\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M10 1c-1.716 0-3.408.106-5.07.31C3.806 1.45 3 2.414 3 3.517V16.75A2.25 2.25 0 0 0 5.25 19h9.5A2.25 2.25 0 0 0 17 16.75V3.517c0-1.103-.806-2.068-1.93-2.207A41.403 41.403 0 0 0 10 1ZM5.99 8.75A.75.75 0 0 1 6.74 8h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm-.75 2.916a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm1.417-5.75a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm-.75 2.916a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm1.42-5.75a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm-.75 2.916a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01ZM12.5 8.75a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm0 2.166a.75.75 0 0 1 .75.75v2.167a.75.75 0 1 1-1.5 0v-2.167a.75.75 0 0 1 .75-.75ZM6.75 4a.75.75 0 0 0-.75.75v.5c0 .414.336.75.75.75h6.5a.75.75 0 0 0 .75-.75v-.5a.75.75 0 0 0-.75-.75h-6.5Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M9.47 6.47a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 1 1-1.06 1.06L10 8.06l-3.72 3.72a.75.75 0 0 1-1.06-1.06l4.25-4.25Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Zm7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06ZM11.377 2.011a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"M10 12.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z\" }),\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M.664 10.59a1.651 1.651 0 0 1 0-1.186A10.004 10.004 0 0 1 10 3c4.257 0 7.893 2.66 9.336 6.41.147.381.146.804 0 1.186A10.004 10.004 0 0 1 10 17c-4.257 0-7.893-2.66-9.336-6.41ZM14 10a4 4 0 1 1-8 0 4 4 0 0 1 8 0Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M10 2.5c-1.31 0-2.526.386-3.546 1.051a.75.75 0 0 1-.82-1.256A8 8 0 0 1 18 9a22.47 22.47 0 0 1-1.228 7.351.75.75 0 1 1-1.417-.49A20.97 20.97 0 0 0 16.5 9 6.5 6.5 0 0 0 10 2.5ZM4.333 4.416a.75.75 0 0 1 .218 1.038A6.466 6.466 0 0 0 3.5 9a7.966 7.966 0 0 1-1.293 4.362.75.75 0 0 1-1.257-.819A6.466 6.466 0 0 0 2 9c0-1.61.476-3.11 1.295-4.365a.75.75 0 0 1 1.038-.219ZM10 6.12a3 3 0 0 0-3.001 3.041 11.455 11.455 0 0 1-2.697 7.24.75.75 0 0 1-1.148-.965A9.957 9.957 0 0 0 5.5 9c0-.028.002-.055.004-.082a4.5 4.5 0 0 1 8.996.084V9.15l-.005.297a.75.75 0 1 1-1.5-.034c.003-.11.004-.219.005-.328a3 3 0 0 0-3-2.965Zm0 2.13a.75.75 0 0 1 .75.75c0 3.51-1.187 6.745-3.181 9.323a.75.75 0 1 1-1.186-.918A13.687 13.687 0 0 0 9.25 9a.75.75 0 0 1 .75-.75Zm3.529 3.698a.75.75 0 0 1 .584.885 18.883 18.883 0 0 1-2.257 5.84.75.75 0 1 1-1.29-.764 17.386 17.386 0 0 0 2.078-5.377.75.75 0 0 1 .885-.584Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M2.628 1.601C5.028 1.206 7.49 1 10 1s4.973.206 7.372.601a.75.75 0 0 1 .628.74v2.288a2.25 2.25 0 0 1-.659 1.59l-4.682 4.683a2.25 2.25 0 0 0-.659 1.59v3.037c0 .684-.31 1.33-.844 1.757l-1.937 1.55A.75.75 0 0 1 8 18.25v-5.757a2.25 2.25 0 0 0-.659-1.591L2.659 6.22A2.25 2.25 0 0 1 2 4.629V2.34a.75.75 0 0 1 .628-.74Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"M14.916 2.404a.75.75 0 0 1-.32 1.011l-.596.31V17a1 1 0 0 1-1 1h-2.26a.75.75 0 0 1-.75-.75v-3.5a.75.75 0 0 0-.75-.75H6.75a.75.75 0 0 0-.75.75v3.5a.75.75 0 0 1-.75.75h-3.5a.75.75 0 0 1 0-1.5H2V9.957a.75.75 0 0 1-.596-1.372L2 8.275V5.75a.75.75 0 0 1 1.5 0v1.745l10.404-5.41a.75.75 0 0 1 1.012.319ZM15.861 8.57a.75.75 0 0 1 .736-.025l1.999 1.04A.75.75 0 0 1 18 10.957V16.5h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1-.75-.75V9.21a.75.75 0 0 1 .361-.64Z\" })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M9.293 2.293a1 1 0 0 1 1.414 0l7 7A1 1 0 0 1 17 11h-1v6a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-3a1 1 0 0 0-1-1H9a1 1 0 0 0-1 1v3a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-6H3a1 1 0 0 1-.707-1.707l7-7Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z\" }),\n _createElementVNode(\"path\", { d: \"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z\" })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM6.75 9.25a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5h-6.5Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"M15.993 1.385a1.87 1.87 0 0 1 2.623 2.622l-4.03 5.27a12.749 12.749 0 0 1-4.237 3.562 4.508 4.508 0 0 0-3.188-3.188 12.75 12.75 0 0 1 3.562-4.236l5.27-4.03ZM6 11a3 3 0 0 0-3 3 .5.5 0 0 1-.72.45.75.75 0 0 0-1.035.931A4.001 4.001 0 0 0 9 14.004V14a3.01 3.01 0 0 0-1.66-2.685A2.99 2.99 0 0 0 6 11Z\" })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm.75-11.25a.75.75 0 0 0-1.5 0v2.5h-2.5a.75.75 0 0 0 0 1.5h2.5v2.5a.75.75 0 0 0 1.5 0v-2.5h2.5a.75.75 0 0 0 0-1.5h-2.5v-2.5Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"M4.464 3.162A2 2 0 0 1 6.28 2h7.44a2 2 0 0 1 1.816 1.162l1.154 2.5c.067.145.115.291.145.438A3.508 3.508 0 0 0 16 6H4c-.288 0-.568.035-.835.1.03-.147.078-.293.145-.438l1.154-2.5Z\" }),\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M2 9.5a2 2 0 0 1 2-2h12a2 2 0 1 1 0 4H4a2 2 0 0 1-2-2Zm13.24 0a.75.75 0 0 1 .75-.75H16a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75V9.5Zm-2.25-.75a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75H13a.75.75 0 0 0 .75-.75V9.5a.75.75 0 0 0-.75-.75h-.01ZM2 15a2 2 0 0 1 2-2h12a2 2 0 1 1 0 4H4a2 2 0 0 1-2-2Zm13.24 0a.75.75 0 0 1 .75-.75H16a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75V15Zm-2.25-.75a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75H13a.75.75 0 0 0 .75-.75V15a.75.75 0 0 0-.75-.75h-.01Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-5.5-2.5a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0ZM10 12a5.99 5.99 0 0 0-4.793 2.39A6.483 6.483 0 0 0 10 16.5a6.483 6.483 0 0 0 4.793-2.11A5.99 5.99 0 0 0 10 12Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"M3.25 4A2.25 2.25 0 0 0 1 6.25v7.5A2.25 2.25 0 0 0 3.25 16h7.5A2.25 2.25 0 0 0 13 13.75v-7.5A2.25 2.25 0 0 0 10.75 4h-7.5ZM19 4.75a.75.75 0 0 0-1.28-.53l-3 3a.75.75 0 0 0-.22.53v4.5c0 .199.079.39.22.53l3 3a.75.75 0 0 0 1.28-.53V4.75Z\" })\n ]))\n}","export interface BuildingCodeItem {\n name: string\n selected?: boolean\n children?: BuildingCodeItem[]\n}\n\n/**\n * BASAB codes for buildingParts\n */\nexport const BSAB96: BuildingCodeItem[] = [\n {\n name: '0 SANERING OCH RIVNING',\n children: [\n { name: '00 Sammansatta', selected: false },\n { name: '01 Demontoring', selected: false },\n { name: '02 Sanering och lätt rivning', selected: false },\n { name: '03 Tung rivning', selected: false },\n { name: '04 Efterlagning', selected: false },\n { name: '06 Håltagning', selected: false },\n { name: '07 Arbeten för installationer', selected: false },\n ],\n },\n {\n name: '1 MARK',\n children: [\n { name: '10 Sammansatta', selected: false },\n { name: '11 Röjning, rivning och flyttning', selected: false },\n { name: '12 Schakter, fyllning', selected: false },\n { name: '13 Markförstärkning, dränering', selected: false },\n { name: '15 Ledningar, kulvertar, tunnlar', selected: false },\n { name: '16 Vägar, planer', selected: false },\n { name: '17 Trädgård', selected: false },\n { name: '18 Markrutt, Stödmurar, komplementbyggnader', selected: false },\n { name: '19 Mark övrigt', selected: false },\n ],\n },\n {\n name: '2. HUSUNDERBYGGNAD',\n children: [\n { name: '20 Sammansatta', selected: false },\n\t\t\t{ name: '22 Schakt, fyllning', selected: false },\n { name: '23 Markförstärkning, dränering', selected: false },\n { name: '24 Grundkonstruktioner', selected: false },\n { name: '25 Kulvertar, tunnlar', selected: false },\n { name: '26 Garage', selected: false },\n { name: '27 Platta på mark', selected: false },\n { name: '28 Huskomplementering, husunderbyggnad', selected: false },\n { name: '29 Husunderbyggnad övrigt', selected: false },\n ],\n },\n {\n name: '3. STOMME',\n children: [\n { name: '30 Sammansatta', selected: false },\n { name: '31 Stomme - väggar', selected: false },\n { name: '32 Stomme - pelare', selected: false },\n { name: '33 Prefab', selected: false },\n { name: '34 Stomme bjälklag, balkar', selected: false },\n { name: '35 Smide', selected: false },\n { name: '36 Stomme, trappor, hisschakt', selected: false },\n { name: '37 Samverkande takstomme', selected: false },\n { name: '38 Huskomplementering, stomme', selected: false },\n { name: '39 Stomme övrigt', selected: false },\n ],\n },\n {\n name: '4. YTTERTAK',\n children: [\n { name: '40 Sammansatta', selected: false },\n { name: '41 Tak-stomme', selected: false },\n { name: '42 Taklagskomplettering', selected: false },\n { name: '43 Taktäckning', selected: false },\n { name: '44 Takfot och gavlar', selected: false },\n { name: '45 Öppningskompletteringar, yttertak', selected: false },\n { name: '46 Plåt', selected: false },\n { name: '47 Terasstak, altaner', selected: false },\n { name: '48 Huskomplettering, yttertak', selected: false },\n { name: '49 Yttertak övrigt', selected: false },\n ],\n },\n {\n name: '5. FASADER',\n children: [\n { name: '50 Sammansatta', selected: false },\n { name: '51 Stomkomplement, utfackning', selected: false },\n { name: '53 Fasadbeklädnad', selected: false },\n { name: '55 Fönster, dörrar, partier, portar', selected: false },\n { name: '58 Huskomplettering ytterväggar', selected: false },\n { name: '59 Ytterväggar övrigt', selected: false },\n ],\n },\n {\n name: '6. STOMKOMPL. RUMSBILDN.',\n children: [\n { name: '60 Sammansatta', selected: false },\n { name: '61 Insida yttervägg', selected: false },\n { name: '62 Undergolv', selected: false },\n { name: '63 Innerväggar', selected: false },\n { name: '64 Innertak', selected: false },\n { name: '65 Invändiga dörrar, glaspartier', selected: false },\n { name: '66 Invändiga trappor', selected: false },\n { name: '68 Huskomplettering, rumsbildning', selected: false },\n { name: '69 Rumsbildning övrigt', selected: false },\n ],\n },\n {\n name: '7. INVÄNDIGA YTSKIKT RUMSKOMPL.',\n children: [\n { name: '70 Sammansatta', selected: false },\n { name: '72 Ytskikt golv, sporer', selected: false },\n { name: '73 Ytskikt vägg', selected: false },\n { name: '74 Ytskikt tak, undertak', selected: false },\n { name: '75 Målning', selected: false },\n { name: '76 Vitvaror', selected: false },\n { name: '77 Skåpsinsikter', selected: false },\n { name: '78 Rumsinsikter', selected: false },\n { name: '79 Rumsinsikter övrigt', selected: false },\n ],\n },\n {\n name: '8 INSTALLATIONER',\n children: [\n { name: '80 Sammansatta', selected: false },\n { name: '82 Process', selected: false },\n { name: '83 Storkök', selected: false },\n { name: '84 Sanitet, värme', selected: false },\n { name: '85 Kyla, luft', selected: false },\n { name: '86 El', selected: false },\n { name: '87 Transport', selected: false },\n { name: '88 Styr och regler', selected: false },\n { name: '89 Installationer övrigt', selected: false },\n ],\n },\n {\n name: '9. GEMENSAMMA ARBETEN',\n children: [\n { name: '90 Gemensamma arbeten sammansatta', selected: false },\n { name: '91 Gemensamma arbeten', selected: false },\n ],\n },\n]\n\n/**\n * Generic building codes\n */\nexport const generic: BuildingCodeItem[] = [\n {\n name: \"1. Substructure\",\n children: [\n { name: \"1.1 Foundations\", selected: false },\n { name: \"1.2 Basement Construction\" }\n ]\n },\n {\n name: \"2. Superstructure\",\n children: [\n { name: \"2.1 Structural Frame\", selected: false },\n { name: \"2.2 External Walls\", selected: false },\n { name: \"2.3 Internal Walls\", selected: false },\n { name: \"2.4 Upper Floors\", selected: false },\n { name: \"2.5 Roof Structure\", selected: false }\n ]\n },\n {\n name: \"3. Finishes\",\n children: [\n { name: \"3.1 Wall Finishes\", selected: false },\n { name: \"3.2 Floor Finishes\", selected: false },\n { name: \"3.3 Ceiling Finishes\", selected: false }\n ]\n },\n {\n name: \"4. Fittings and Furnishings\",\n children: [\n { name: \"4.1 Fixed Furniture\", selected: false },\n { name: \"4.2 Movable Furniture\", selected: false }\n ]\n },\n {\n name: \"5. Building Services\",\n children: [\n { name: \"5.1 Heating, Ventilation, and Air Conditioning (HVAC)\", selected: false },\n { name: \"5.2 Electrical Installations\", selected: false },\n { name: \"5.3 Plumbing Installations\", selected: false },\n { name: \"5.4 Fire Protection Systems\", selected: false }\n ]\n },\n {\n name: \"6. External Works\",\n children: [\n { name: \"6.1 Landscaping\", selected: false },\n { name: \"6.2 Site Infrastructure\", selected: false }\n ]\n }\n]\n\n/**\n * List of building codes\n * Add new codes here\n */\nexport const buildingCodes: { [key:string]: BuildingCodeItem[] } = {\n BSAB96: BSAB96,\n generic: generic\n}","import type { LifeCycleStage } from \"lcax\"\nimport type { ExtendedImpactCategoryKey } from '@/models/material'\nimport type { BuildingCodeItem } from '@/models/buildingCode'\nimport { BSAB96 } from '@/models/buildingCode'\n\n/**\n * Settings for external connections such as API keys and configurations\n */\nexport interface KeySettings {\n materialKeys: MaterialKeys,\n githubApiKey: string\n firebaseConfig: FirebaseConfig\n speckleConfig: SpeckleConfig\n}\n\nexport interface CalculationSettings {\n includedStages: IncludedStages\n standardImpactCategory: ExtendedImpactCategoryKey\n buildingCode: {\n key: string,\n data: BuildingCodeItem[],\n },\n}\n\nexport interface MaterialSettings {\n epdSource: EPDSource\n}\n\nexport interface AppSettings {\n colorscheme: string\n area: number\n}\n\nexport enum EPDSource {\n EcoPortal,\n Revalu,\n LCAByg,\n Other\n}\n\nexport interface SettingView {\n name: string,\n icon: any,\n current: boolean\n}\n\n\ninterface SpeckleConfig {\n serverUrl: string\n id: string\n secret: string\n}\n\n/**\n * Configuration for firebase, this is using an auto creation of users to the project\n * TODO: Check if this is the best way or move to Speckle\n */\ninterface FirebaseConfig {\n apiKey: string\n authDomain: string\n projectId: string\n storageBucket: string\n messagingSenderId: string\n appId: string\n measurementId: string\n}\n\n/**\n * External API keys, add more here if needed\n */\ninterface MaterialKeys {\n revalu: string\n ecoPortal: string\n}\n\n/**\n * Simple interface for stage inclusion\n */\ninterface IncludedStages {\n relevantStages: Array<{\n included: boolean\n stage: LifeCycleStage\n }>\n}\n\n/**\n * Default settings for the application\n * TODO Move the project specific settings to a seperate interface?\n */\nexport const standardAppSettings: AppSettings = {\n colorscheme: 'light',\n area: 1000\n}\n\n/**\n * Default settings for the material settings\n */\nexport const standardKeySettings: KeySettings = {\n materialKeys: {\n revalu: null,\n ecoPortal: null\n },\n githubApiKey: null,\n firebaseConfig: {\n apiKey: null,\n authDomain: \"specklca.firebaseapp.com\",\n projectId: \"specklca\",\n storageBucket: \"specklca.appspot.com\",\n messagingSenderId: \"660785821928\",\n appId: \"1:660785821928:web:236a8b63b72bf6abcc715d\",\n measurementId: \"G-EKQGVJLEEG\"\n },\n speckleConfig: {\n serverUrl: \"https://app.speckle.systems\",\n id: \"25477842e5\",\n secret: \"c5a683ccc4\"\n }\n}\n\nexport const standardCalculationSettings: CalculationSettings = {\n includedStages: {\n relevantStages: [\n { included: true, stage: \"a1a3\" as LifeCycleStage }, // Manufacturing\n { included: true, stage: \"a4\" as LifeCycleStage }, // Transport\n { included: true, stage: \"a5\" as LifeCycleStage }, // Assembly\n { included: true, stage: \"b1\" as LifeCycleStage }, // Use\n { included: true, stage: \"c1\" as LifeCycleStage }, // End of life\n ]\n },\n standardImpactCategory: 'gwp',\n buildingCode: {\n key: 'BSAB96',\n data: BSAB96\n }\n}\n\nexport const standardMaterialSettings: MaterialSettings = {\n epdSource: EPDSource.Revalu\n}","import { defineStore } from 'pinia'\n\nimport { \n\tstandardAppSettings, \n\tstandardCalculationSettings, \n\tstandardKeySettings,\n\tstandardMaterialSettings,\n} from '@/models/settings'\nimport type { \n\tAppSettings,\n\tCalculationSettings,\n\tKeySettings,\n\tMaterialSettings,\n } from '@/models/settings'\n\nexport const useSettingsStore = defineStore({\n\tid: 'settingsStore',\n\tstate: () => {\n\t\treturn {\n\t\t\tappSettings: standardAppSettings as AppSettings, // Application settings\n\t\t\tcalculationSettings: standardCalculationSettings as CalculationSettings, // Calculation settings\n\t\t\tkeySettings: standardKeySettings as KeySettings, // Key settings\n\t\t\tmaterialSettings: standardMaterialSettings as MaterialSettings // Material settings\n\t\t}\n\t},\n\t// Save the store to local storage so we dont have to create new settings every time\n\tpersist: {\n storage: localStorage,\n\t\tafterHydrate: (ctx) => {\n console.log(`just hydrated '${ctx.store.$id}'`)\n }\n\t},\n\tactions: {\n\t\t\n\t\t/**\n\t\t * Updates the firebase configuration in the app settings.\n\t\t * @param firebaseConfig The new firebase configuration.\n\t\t */\n\t\tupdateFirebaseSettings(firebaseConfig: KeySettings['firebaseConfig']) {\n\t\t\tthis.keySettings.firebaseConfig = firebaseConfig\n\t\t},\n\n\t\t/**\n\t\t * Updates the speckle configuration in the app settings.\n\t\t * @param speckleConfig The new speckle configuration.\n\t\t */\n\t\tupdateSpeckleSettings(speckleConfig: KeySettings['speckleConfig']) {\n\t\t\tthis.keySettings.speckleConfig = speckleConfig\n\t\t},\n\n\t\t/**\n\t\t * Updates the material keys in the app settings.\n\t\t * @param materialKeys The new material keys.\n\t\t */\n\t\tupdateMaterialKeys(materialKeys: KeySettings['materialKeys']) {\n\t\t\tthis.keySettings.materialKeys = materialKeys\n\t\t},\n\n\t\t/**\n\t\t * Updates the EPD source in the app settings.\n\t\t * @param epdSource The new EPD source.\n\t\t */\n\t\tupdateEPDSource(epdSource: MaterialSettings['epdSource']) {\n\t\t\tthis.materialSettings.epdSource = epdSource\n\t\t},\n\n\t\t\n\t\tupdateGithubApiKey(githubApiKey: KeySettings['githubApiKey']) {\n\t\t\tthis.keySettings.githubApiKey = githubApiKey\n\t\t},\n\n\t\t/**\n\t\t * Updates the included stages in the app settings.\n\t\t * @param includedStages The new included stages.\n\t\t */\n\t\tupdateIncludedStages(includedStages: CalculationSettings['includedStages']) {\n\t\t\tthis.calculationSettings.includedStages = includedStages\n\t\t},\n\n\t\t/**\n\t\t * Updates the standard impact category in the app settings.\n\t\t * @param standardImpactCategory The new standard impact category.\n\t\t */\n\t\tupdateStandardImpactCategory(standardImpactCategory: CalculationSettings['standardImpactCategory']) {\n\t\t\tthis.calculationSettings.standardImpactCategory = standardImpactCategory\n\t\t},\n\n\t\t/**\n\t\t * Updates the building code in the app settings.\n\t\t * @param buildingCode The new building code.\n\t\t */\n\t\tupdateBuildingCode(buildingCode: CalculationSettings['buildingCode']) {\n\t\t\tthis.calculationSettings.buildingCode = buildingCode\n\t\t},\n\n\t\tupdateArea(area: AppSettings['area']) {\n\t\t\tthis.appSettings.area = area\n\t\t},\n\t}\n})","export default \"__VITE_ASSET__c2b3a5f0__\"","export default \"__VITE_ASSET__0919f98b__\"","\n\n","\n\n","\n\n","import type { Emission } from '@/models/material'\nimport type { Quantity } from '@/models/geometryObject'\n\n/**\n * Grouped results interface to store the results grouped by a parameter\n * These are for precalculated aggregated results.\n */\nexport interface GroupedResults{\n parameter: string\n data: GroupedEmission\n quantity?: Quantity\n nested?: GroupedResults[]\n}\n\n/**\n * Grouped emission interface to store the emission grouped by a parameter\n */\ninterface GroupedEmission {\n emission: Emission\n geoId: string[]\n}\n\n/**\n * Main interface for storing results, this is the main object that is stored in the database.\n * It contains the results for each parameter that is grouped on and the result with correlation to ids.\n */\nexport interface ResultItem {\n parameter: string\n displayName: string\n data: GroupedResults[]\n}\n\nexport type ResultList = ResultItem[]\n\n/**\n * Predefined list of ResultItem objects for default use\n */\nexport const DefaultResultList: ResultList = [\n { parameter: 'parameters.category', displayName: 'Category', data: [] },\n { parameter: 'material.name', displayName: 'Material', data: [] },\n { parameter: 'material.metaData.materialType', displayName: 'Material Type', data: [] },\n { parameter: 'BSABCodes', displayName: 'BSAB Codes', data: [] },\n { parameter: 'parameters.speckle_type', displayName: 'Speckle Type', data: [] },\n]\n\n/**\n * Results are stored as Impact Category, Life Cycle Stage then emission value.\n * Optional parameter for aggregated results and what parameter is grouped on.\n * ID and date is just for documentation.\n */\nexport interface Results {\n\tid: string // Run ID for results.\n\tdate: Date\n\temission: Emission\n}","import { defineStore } from 'pinia'\n\nimport type { \n ResultList,\n} from '@/models/result'\n\nimport { DefaultResultList } from '@/models/result'\n\nimport type { Results } from '@/models/result'\n\n/**\n * Defines the result store, which is used to store the results of the calculations\n * Aggregates and provides some chartdata for use\n */\nexport const useResultStore = defineStore({\n\tid: 'resultStore',\n\tstate: () => {\n\t\treturn {\n aggregatedResults: [] as Results[],\n resultList: DefaultResultList,\n activeParameter: 'parameters.category', // Default active parameter for result filtering in resultLists TODO: Is this needed?\n reloadChartData: true, // Boolean to reload the chart data\n\t\t}\n\t},\n actions: {\n /**\n * Updates resultList\n * @param resultList resultList to update with\n */\n setResultList(resultList: ResultList) {\n this.resultList = resultList\n },\n\n /**\n * Returns the grouped results for a specific id or all if empty\n * @param id \n * @returns \n */\n getGroupedResults(id: string = 'all') {\n if (id === 'all') {\n return this.resultList\n }\n if (this.resultList[id]) {\n return { [id]: this.resultList[id] }\n }\n return {}\n },\n\n /**\n * Toggle the reloadChartData boolean\n */\n toggleReloadData() {\n this.reloadChartData = !this.reloadChartData\n },\n\n /**\n * Set the reloadChartData boolean\n * @param reload \n */\n setReloadData(reload: boolean) {\n this.reloadChartData = reload\n },\n\n /**\n * Set the active parameter for result filtering\n * @param parameter \n */\n setActiveParameter(parameter: string) {\n this.activeParameter = parameter\n },\n }\n \n})","import { min, max } from './index.js';\n\nexport default (x, low = 0, high = 1) => {\n return min(max(low, x), high);\n};\n","import limit from './limit.js';\n\nexport default (rgb) => {\n rgb._clipped = false;\n rgb._unclipped = rgb.slice(0);\n for (let i = 0; i <= 3; i++) {\n if (i < 3) {\n if (rgb[i] < 0 || rgb[i] > 255) rgb._clipped = true;\n rgb[i] = limit(rgb[i], 0, 255);\n } else if (i === 3) {\n rgb[i] = limit(rgb[i], 0, 1);\n }\n }\n return rgb;\n};\n","// ported from jQuery's $.type\nconst classToType = {};\nfor (let name of [\n 'Boolean',\n 'Number',\n 'String',\n 'Function',\n 'Array',\n 'Date',\n 'RegExp',\n 'Undefined',\n 'Null'\n]) {\n classToType[`[object ${name}]`] = name.toLowerCase();\n}\nexport default function (obj) {\n return classToType[Object.prototype.toString.call(obj)] || 'object';\n}\n","import type from './type.js';\n\nexport default (args, keyOrder = null) => {\n // if called with more than 3 arguments, we return the arguments\n if (args.length >= 3) return Array.prototype.slice.call(args);\n // with less than 3 args we check if first arg is object\n // and use the keyOrder string to extract and sort properties\n if (type(args[0]) == 'object' && keyOrder) {\n return keyOrder\n .split('')\n .filter((k) => args[0][k] !== undefined)\n .map((k) => args[0][k]);\n }\n // otherwise we just return the first argument\n // (which we suppose is an array of args)\n return args[0];\n};\n","import type from './type.js';\n\nexport default (args) => {\n if (args.length < 2) return null;\n const l = args.length - 1;\n if (type(args[l]) == 'string') return args[l].toLowerCase();\n return null;\n};\n","const { PI, min, max } = Math;\n\nexport { default as clip_rgb } from './clip_rgb.js';\nexport { default as limit } from './limit.js';\nexport { default as type } from './type.js';\nexport { default as unpack } from './unpack.js';\nexport { default as last } from './last.js';\n\nconst TWOPI = PI * 2;\nconst PITHIRD = PI / 3;\nconst DEG2RAD = PI / 180;\nconst RAD2DEG = 180 / PI;\n\nexport { PI, TWOPI, PITHIRD, DEG2RAD, RAD2DEG, min, max };\n","export default {\n format: {},\n autodetect: []\n};\n","import { last, clip_rgb, type } from './utils/index.js';\nimport _input from './io/input.js';\n\nclass Color {\n constructor(...args) {\n const me = this;\n if (\n type(args[0]) === 'object' &&\n args[0].constructor &&\n args[0].constructor === this.constructor\n ) {\n // the argument is already a Color instance\n return args[0];\n }\n // last argument could be the mode\n let mode = last(args);\n let autodetect = false;\n if (!mode) {\n autodetect = true;\n if (!_input.sorted) {\n _input.autodetect = _input.autodetect.sort((a, b) => b.p - a.p);\n _input.sorted = true;\n }\n // auto-detect format\n for (let chk of _input.autodetect) {\n mode = chk.test(...args);\n if (mode) break;\n }\n }\n if (_input.format[mode]) {\n const rgb = _input.format[mode].apply(\n null,\n autodetect ? args : args.slice(0, -1)\n );\n me._rgb = clip_rgb(rgb);\n } else {\n throw new Error('unknown format: ' + args);\n }\n // add alpha channel\n if (me._rgb.length === 3) me._rgb.push(1);\n }\n toString() {\n if (type(this.hex) == 'function') return this.hex();\n return `[${this._rgb.join(',')}]`;\n }\n}\nexport default Color;\n","// this gets updated automatically\nexport const version = '2.6.0';\n","import Color from './Color.js';\nimport { version } from './version.js';\n\nconst chroma = (...args) => {\n return new chroma.Color(...args);\n};\n\nchroma.Color = Color;\nchroma.version = version;\n\nexport default chroma;\n","import { unpack } from '../../utils/index.js';\n\nconst cmyk2rgb = (...args) => {\n args = unpack(args, 'cmyk');\n const [c, m, y, k] = args;\n const alpha = args.length > 4 ? args[4] : 1;\n if (k === 1) return [0, 0, 0, alpha];\n return [\n c >= 1 ? 0 : 255 * (1 - c) * (1 - k), // r\n m >= 1 ? 0 : 255 * (1 - m) * (1 - k), // g\n y >= 1 ? 0 : 255 * (1 - y) * (1 - k), // b\n alpha\n ];\n};\n\nexport default cmyk2rgb;\n","import { unpack } from '../../utils/index.js';\nconst { max } = Math;\n\nconst rgb2cmyk = (...args) => {\n let [r, g, b] = unpack(args, 'rgb');\n r = r / 255;\n g = g / 255;\n b = b / 255;\n const k = 1 - max(r, max(g, b));\n const f = k < 1 ? 1 / (1 - k) : 0;\n const c = (1 - r - k) * f;\n const m = (1 - g - k) * f;\n const y = (1 - b - k) * f;\n return [c, m, y, k];\n};\n\nexport default rgb2cmyk;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { unpack, type } from '../../utils/index.js';\nimport cmyk2rgb from './cmyk2rgb.js';\nimport rgb2cmyk from './rgb2cmyk.js';\n\nColor.prototype.cmyk = function () {\n return rgb2cmyk(this._rgb);\n};\n\nchroma.cmyk = (...args) => new Color(...args, 'cmyk');\n\ninput.format.cmyk = cmyk2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'cmyk');\n if (type(args) === 'array' && args.length === 4) {\n return 'cmyk';\n }\n }\n});\n","import { unpack, last } from '../../utils/index.js';\nconst rnd = (a) => Math.round(a * 100) / 100;\n\n/*\n * supported arguments:\n * - hsl2css(h,s,l)\n * - hsl2css(h,s,l,a)\n * - hsl2css([h,s,l], mode)\n * - hsl2css([h,s,l,a], mode)\n * - hsl2css({h,s,l,a}, mode)\n */\nconst hsl2css = (...args) => {\n const hsla = unpack(args, 'hsla');\n let mode = last(args) || 'lsa';\n hsla[0] = rnd(hsla[0] || 0);\n hsla[1] = rnd(hsla[1] * 100) + '%';\n hsla[2] = rnd(hsla[2] * 100) + '%';\n if (mode === 'hsla' || (hsla.length > 3 && hsla[3] < 1)) {\n hsla[3] = hsla.length > 3 ? hsla[3] : 1;\n mode = 'hsla';\n } else {\n hsla.length = 3;\n }\n return `${mode}(${hsla.join(',')})`;\n};\n\nexport default hsl2css;\n","import { unpack, min, max } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - rgb2hsl(r,g,b)\n * - rgb2hsl(r,g,b,a)\n * - rgb2hsl([r,g,b])\n * - rgb2hsl([r,g,b,a])\n * - rgb2hsl({r,g,b,a})\n */\nconst rgb2hsl = (...args) => {\n args = unpack(args, 'rgba');\n let [r, g, b] = args;\n\n r /= 255;\n g /= 255;\n b /= 255;\n\n const minRgb = min(r, g, b);\n const maxRgb = max(r, g, b);\n\n const l = (maxRgb + minRgb) / 2;\n let s, h;\n\n if (maxRgb === minRgb) {\n s = 0;\n h = Number.NaN;\n } else {\n s =\n l < 0.5\n ? (maxRgb - minRgb) / (maxRgb + minRgb)\n : (maxRgb - minRgb) / (2 - maxRgb - minRgb);\n }\n\n if (r == maxRgb) h = (g - b) / (maxRgb - minRgb);\n else if (g == maxRgb) h = 2 + (b - r) / (maxRgb - minRgb);\n else if (b == maxRgb) h = 4 + (r - g) / (maxRgb - minRgb);\n\n h *= 60;\n if (h < 0) h += 360;\n if (args.length > 3 && args[3] !== undefined) return [h, s, l, args[3]];\n return [h, s, l];\n};\n\nexport default rgb2hsl;\n","import { unpack, last } from '../../utils/index.js';\nimport hsl2css from './hsl2css.js';\nimport rgb2hsl from '../hsl/rgb2hsl.js';\nconst { round } = Math;\n\n/*\n * supported arguments:\n * - rgb2css(r,g,b)\n * - rgb2css(r,g,b,a)\n * - rgb2css([r,g,b], mode)\n * - rgb2css([r,g,b,a], mode)\n * - rgb2css({r,g,b,a}, mode)\n */\nconst rgb2css = (...args) => {\n const rgba = unpack(args, 'rgba');\n let mode = last(args) || 'rgb';\n if (mode.substr(0, 3) == 'hsl') {\n return hsl2css(rgb2hsl(rgba), mode);\n }\n rgba[0] = round(rgba[0]);\n rgba[1] = round(rgba[1]);\n rgba[2] = round(rgba[2]);\n if (mode === 'rgba' || (rgba.length > 3 && rgba[3] < 1)) {\n rgba[3] = rgba.length > 3 ? rgba[3] : 1;\n mode = 'rgba';\n }\n return `${mode}(${rgba.slice(0, mode === 'rgb' ? 3 : 4).join(',')})`;\n};\n\nexport default rgb2css;\n","import { unpack } from '../../utils/index.js';\nconst { round } = Math;\n\nconst hsl2rgb = (...args) => {\n args = unpack(args, 'hsl');\n const [h, s, l] = args;\n let r, g, b;\n if (s === 0) {\n r = g = b = l * 255;\n } else {\n const t3 = [0, 0, 0];\n const c = [0, 0, 0];\n const t2 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const t1 = 2 * l - t2;\n const h_ = h / 360;\n t3[0] = h_ + 1 / 3;\n t3[1] = h_;\n t3[2] = h_ - 1 / 3;\n for (let i = 0; i < 3; i++) {\n if (t3[i] < 0) t3[i] += 1;\n if (t3[i] > 1) t3[i] -= 1;\n if (6 * t3[i] < 1) c[i] = t1 + (t2 - t1) * 6 * t3[i];\n else if (2 * t3[i] < 1) c[i] = t2;\n else if (3 * t3[i] < 2) c[i] = t1 + (t2 - t1) * (2 / 3 - t3[i]) * 6;\n else c[i] = t1;\n }\n [r, g, b] = [round(c[0] * 255), round(c[1] * 255), round(c[2] * 255)];\n }\n if (args.length > 3) {\n // keep alpha channel\n return [r, g, b, args[3]];\n }\n return [r, g, b, 1];\n};\n\nexport default hsl2rgb;\n","import hsl2rgb from '../hsl/hsl2rgb.js';\nimport input from '../input.js';\n\nconst RE_RGB = /^rgb\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*\\)$/;\nconst RE_RGBA =\n /^rgba\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\nconst RE_RGB_PCT =\n /^rgb\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/;\nconst RE_RGBA_PCT =\n /^rgba\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\nconst RE_HSL =\n /^hsl\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/;\nconst RE_HSLA =\n /^hsla\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n\nconst { round } = Math;\n\nconst css2rgb = (css) => {\n css = css.toLowerCase().trim();\n let m;\n\n if (input.format.named) {\n try {\n return input.format.named(css);\n // eslint-disable-next-line\n } catch (e) {}\n }\n\n // rgb(250,20,0)\n if ((m = css.match(RE_RGB))) {\n const rgb = m.slice(1, 4);\n for (let i = 0; i < 3; i++) {\n rgb[i] = +rgb[i];\n }\n rgb[3] = 1; // default alpha\n return rgb;\n }\n\n // rgba(250,20,0,0.4)\n if ((m = css.match(RE_RGBA))) {\n const rgb = m.slice(1, 5);\n for (let i = 0; i < 4; i++) {\n rgb[i] = +rgb[i];\n }\n return rgb;\n }\n\n // rgb(100%,0%,0%)\n if ((m = css.match(RE_RGB_PCT))) {\n const rgb = m.slice(1, 4);\n for (let i = 0; i < 3; i++) {\n rgb[i] = round(rgb[i] * 2.55);\n }\n rgb[3] = 1; // default alpha\n return rgb;\n }\n\n // rgba(100%,0%,0%,0.4)\n if ((m = css.match(RE_RGBA_PCT))) {\n const rgb = m.slice(1, 5);\n for (let i = 0; i < 3; i++) {\n rgb[i] = round(rgb[i] * 2.55);\n }\n rgb[3] = +rgb[3];\n return rgb;\n }\n\n // hsl(0,100%,50%)\n if ((m = css.match(RE_HSL))) {\n const hsl = m.slice(1, 4);\n hsl[1] *= 0.01;\n hsl[2] *= 0.01;\n const rgb = hsl2rgb(hsl);\n rgb[3] = 1;\n return rgb;\n }\n\n // hsla(0,100%,50%,0.5)\n if ((m = css.match(RE_HSLA))) {\n const hsl = m.slice(1, 4);\n hsl[1] *= 0.01;\n hsl[2] *= 0.01;\n const rgb = hsl2rgb(hsl);\n rgb[3] = +m[4]; // default alpha = 1\n return rgb;\n }\n};\n\ncss2rgb.test = (s) => {\n return (\n RE_RGB.test(s) ||\n RE_RGBA.test(s) ||\n RE_RGB_PCT.test(s) ||\n RE_RGBA_PCT.test(s) ||\n RE_HSL.test(s) ||\n RE_HSLA.test(s)\n );\n};\n\nexport default css2rgb;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\n\nimport rgb2css from './rgb2css.js';\nimport css2rgb from './css2rgb.js';\n\nColor.prototype.css = function (mode) {\n return rgb2css(this._rgb, mode);\n};\n\nchroma.css = (...args) => new Color(...args, 'css');\n\ninput.format.css = css2rgb;\n\ninput.autodetect.push({\n p: 5,\n test: (h, ...rest) => {\n if (!rest.length && type(h) === 'string' && css2rgb.test(h)) {\n return 'css';\n }\n }\n});\n","import Color from '../../Color.js';\nimport chroma from '../../chroma.js';\nimport input from '../input.js';\nimport { unpack } from '../../utils/index.js';\n\ninput.format.gl = (...args) => {\n const rgb = unpack(args, 'rgba');\n rgb[0] *= 255;\n rgb[1] *= 255;\n rgb[2] *= 255;\n return rgb;\n};\n\nchroma.gl = (...args) => new Color(...args, 'gl');\n\nColor.prototype.gl = function () {\n const rgb = this._rgb;\n return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, rgb[3]];\n};\n","import { unpack } from '../../utils/index.js';\nconst { floor } = Math;\n\n/*\n * this is basically just HSV with some minor tweaks\n *\n * hue.. [0..360]\n * chroma .. [0..1]\n * grayness .. [0..1]\n */\n\nconst hcg2rgb = (...args) => {\n args = unpack(args, 'hcg');\n let [h, c, _g] = args;\n let r, g, b;\n _g = _g * 255;\n const _c = c * 255;\n if (c === 0) {\n r = g = b = _g;\n } else {\n if (h === 360) h = 0;\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 60;\n const i = floor(h);\n const f = h - i;\n const p = _g * (1 - c);\n const q = p + _c * (1 - f);\n const t = p + _c * f;\n const v = p + _c;\n switch (i) {\n case 0:\n [r, g, b] = [v, t, p];\n break;\n case 1:\n [r, g, b] = [q, v, p];\n break;\n case 2:\n [r, g, b] = [p, v, t];\n break;\n case 3:\n [r, g, b] = [p, q, v];\n break;\n case 4:\n [r, g, b] = [t, p, v];\n break;\n case 5:\n [r, g, b] = [v, p, q];\n break;\n }\n }\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default hcg2rgb;\n","import { unpack, max, min } from '../../utils/index.js';\n\nconst rgb2hcg = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n const minRgb = min(r, g, b);\n const maxRgb = max(r, g, b);\n const delta = maxRgb - minRgb;\n const c = (delta * 100) / 255;\n const _g = (minRgb / (255 - delta)) * 100;\n let h;\n if (delta === 0) {\n h = Number.NaN;\n } else {\n if (r === maxRgb) h = (g - b) / delta;\n if (g === maxRgb) h = 2 + (b - r) / delta;\n if (b === maxRgb) h = 4 + (r - g) / delta;\n h *= 60;\n if (h < 0) h += 360;\n }\n return [h, c, _g];\n};\n\nexport default rgb2hcg;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hcg2rgb from './hcg2rgb.js';\nimport rgb2hcg from './rgb2hcg.js';\n\nColor.prototype.hcg = function () {\n return rgb2hcg(this._rgb);\n};\n\nchroma.hcg = (...args) => new Color(...args, 'hcg');\n\ninput.format.hcg = hcg2rgb;\n\ninput.autodetect.push({\n p: 1,\n test: (...args) => {\n args = unpack(args, 'hcg');\n if (type(args) === 'array' && args.length === 3) {\n return 'hcg';\n }\n }\n});\n","const RE_HEX = /^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\nconst RE_HEXA = /^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/;\n\nconst hex2rgb = (hex) => {\n if (hex.match(RE_HEX)) {\n // remove optional leading #\n if (hex.length === 4 || hex.length === 7) {\n hex = hex.substr(1);\n }\n // expand short-notation to full six-digit\n if (hex.length === 3) {\n hex = hex.split('');\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n const u = parseInt(hex, 16);\n const r = u >> 16;\n const g = (u >> 8) & 0xff;\n const b = u & 0xff;\n return [r, g, b, 1];\n }\n\n // match rgba hex format, eg #FF000077\n if (hex.match(RE_HEXA)) {\n if (hex.length === 5 || hex.length === 9) {\n // remove optional leading #\n hex = hex.substr(1);\n }\n // expand short-notation to full eight-digit\n if (hex.length === 4) {\n hex = hex.split('');\n hex =\n hex[0] +\n hex[0] +\n hex[1] +\n hex[1] +\n hex[2] +\n hex[2] +\n hex[3] +\n hex[3];\n }\n const u = parseInt(hex, 16);\n const r = (u >> 24) & 0xff;\n const g = (u >> 16) & 0xff;\n const b = (u >> 8) & 0xff;\n const a = Math.round(((u & 0xff) / 0xff) * 100) / 100;\n return [r, g, b, a];\n }\n\n // we used to check for css colors here\n // if _input.css? and rgb = _input.css hex\n // return rgb\n\n throw new Error(`unknown hex color: ${hex}`);\n};\n\nexport default hex2rgb;\n","import { unpack, last } from '../../utils/index.js';\nconst { round } = Math;\n\nconst rgb2hex = (...args) => {\n let [r, g, b, a] = unpack(args, 'rgba');\n let mode = last(args) || 'auto';\n if (a === undefined) a = 1;\n if (mode === 'auto') {\n mode = a < 1 ? 'rgba' : 'rgb';\n }\n r = round(r);\n g = round(g);\n b = round(b);\n const u = (r << 16) | (g << 8) | b;\n let str = '000000' + u.toString(16); //#.toUpperCase();\n str = str.substr(str.length - 6);\n let hxa = '0' + round(a * 255).toString(16);\n hxa = hxa.substr(hxa.length - 2);\n switch (mode.toLowerCase()) {\n case 'rgba':\n return `#${str}${hxa}`;\n case 'argb':\n return `#${hxa}${str}`;\n default:\n return `#${str}`;\n }\n};\n\nexport default rgb2hex;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport { type } from '../../utils/index.js';\nimport input from '../input.js';\nimport hex2rgb from './hex2rgb.js';\nimport rgb2hex from './rgb2hex.js';\n\nColor.prototype.hex = function (mode) {\n return rgb2hex(this._rgb, mode);\n};\n\nchroma.hex = (...args) => new Color(...args, 'hex');\n\ninput.format.hex = hex2rgb;\ninput.autodetect.push({\n p: 4,\n test: (h, ...rest) => {\n if (\n !rest.length &&\n type(h) === 'string' &&\n [3, 4, 5, 6, 7, 8, 9].indexOf(h.length) >= 0\n ) {\n return 'hex';\n }\n }\n});\n","import { unpack, limit, TWOPI, PITHIRD } from '../../utils/index.js';\nconst { cos } = Math;\n\n/*\n * hue [0..360]\n * saturation [0..1]\n * intensity [0..1]\n */\nconst hsi2rgb = (...args) => {\n /*\n borrowed from here:\n http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp\n */\n args = unpack(args, 'hsi');\n let [h, s, i] = args;\n let r, g, b;\n\n if (isNaN(h)) h = 0;\n if (isNaN(s)) s = 0;\n // normalize hue\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 360;\n if (h < 1 / 3) {\n b = (1 - s) / 3;\n r = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n g = 1 - (b + r);\n } else if (h < 2 / 3) {\n h -= 1 / 3;\n r = (1 - s) / 3;\n g = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n b = 1 - (r + g);\n } else {\n h -= 2 / 3;\n g = (1 - s) / 3;\n b = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n r = 1 - (g + b);\n }\n r = limit(i * r * 3);\n g = limit(i * g * 3);\n b = limit(i * b * 3);\n return [r * 255, g * 255, b * 255, args.length > 3 ? args[3] : 1];\n};\n\nexport default hsi2rgb;\n","import { unpack, TWOPI } from '../../utils/index.js';\nconst { min, sqrt, acos } = Math;\n\nconst rgb2hsi = (...args) => {\n /*\n borrowed from here:\n http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/rgb2hsi.cpp\n */\n let [r, g, b] = unpack(args, 'rgb');\n r /= 255;\n g /= 255;\n b /= 255;\n let h;\n const min_ = min(r, g, b);\n const i = (r + g + b) / 3;\n const s = i > 0 ? 1 - min_ / i : 0;\n if (s === 0) {\n h = NaN;\n } else {\n h = (r - g + (r - b)) / 2;\n h /= sqrt((r - g) * (r - g) + (r - b) * (g - b));\n h = acos(h);\n if (b > g) {\n h = TWOPI - h;\n }\n h /= TWOPI;\n }\n return [h * 360, s, i];\n};\n\nexport default rgb2hsi;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsi2rgb from './hsi2rgb.js';\nimport rgb2hsi from './rgb2hsi.js';\n\nColor.prototype.hsi = function () {\n return rgb2hsi(this._rgb);\n};\n\nchroma.hsi = (...args) => new Color(...args, 'hsi');\n\ninput.format.hsi = hsi2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsi');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsi';\n }\n }\n});\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsl2rgb from './hsl2rgb.js';\nimport rgb2hsl from './rgb2hsl.js';\n\nColor.prototype.hsl = function () {\n return rgb2hsl(this._rgb);\n};\n\nchroma.hsl = (...args) => new Color(...args, 'hsl');\n\ninput.format.hsl = hsl2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsl');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsl';\n }\n }\n});\n","import { unpack } from '../../utils/index.js';\nconst { floor } = Math;\n\nconst hsv2rgb = (...args) => {\n args = unpack(args, 'hsv');\n let [h, s, v] = args;\n let r, g, b;\n v *= 255;\n if (s === 0) {\n r = g = b = v;\n } else {\n if (h === 360) h = 0;\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 60;\n\n const i = floor(h);\n const f = h - i;\n const p = v * (1 - s);\n const q = v * (1 - s * f);\n const t = v * (1 - s * (1 - f));\n\n switch (i) {\n case 0:\n [r, g, b] = [v, t, p];\n break;\n case 1:\n [r, g, b] = [q, v, p];\n break;\n case 2:\n [r, g, b] = [p, v, t];\n break;\n case 3:\n [r, g, b] = [p, q, v];\n break;\n case 4:\n [r, g, b] = [t, p, v];\n break;\n case 5:\n [r, g, b] = [v, p, q];\n break;\n }\n }\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default hsv2rgb;\n","import { unpack } from '../../utils/index.js';\nconst { min, max } = Math;\n\n/*\n * supported arguments:\n * - rgb2hsv(r,g,b)\n * - rgb2hsv([r,g,b])\n * - rgb2hsv({r,g,b})\n */\nconst rgb2hsl = (...args) => {\n args = unpack(args, 'rgb');\n let [r, g, b] = args;\n const min_ = min(r, g, b);\n const max_ = max(r, g, b);\n const delta = max_ - min_;\n let h, s, v;\n v = max_ / 255.0;\n if (max_ === 0) {\n h = Number.NaN;\n s = 0;\n } else {\n s = delta / max_;\n if (r === max_) h = (g - b) / delta;\n if (g === max_) h = 2 + (b - r) / delta;\n if (b === max_) h = 4 + (r - g) / delta;\n h *= 60;\n if (h < 0) h += 360;\n }\n return [h, s, v];\n};\n\nexport default rgb2hsl;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsv2rgb from './hsv2rgb.js';\nimport rgb2hsv from './rgb2hsv.js';\n\nColor.prototype.hsv = function () {\n return rgb2hsv(this._rgb);\n};\n\nchroma.hsv = (...args) => new Color(...args, 'hsv');\n\ninput.format.hsv = hsv2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsv');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsv';\n }\n }\n});\n","export default {\n // Corresponds roughly to RGB brighter/darker\n Kn: 18,\n\n // D65 standard referent\n Xn: 0.95047,\n Yn: 1,\n Zn: 1.08883,\n\n t0: 0.137931034, // 4 / 29\n t1: 0.206896552, // 6 / 29\n t2: 0.12841855, // 3 * t1 * t1\n t3: 0.008856452 // t1 * t1 * t1\n};\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\nconst { pow } = Math;\n\n/*\n * L* [0..100]\n * a [-100..100]\n * b [-100..100]\n */\nconst lab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [l, a, b] = args;\n let x, y, z, r, g, b_;\n\n y = (l + 16) / 116;\n x = isNaN(a) ? y : y + a / 500;\n z = isNaN(b) ? y : y - b / 200;\n\n y = LAB_CONSTANTS.Yn * lab_xyz(y);\n x = LAB_CONSTANTS.Xn * lab_xyz(x);\n z = LAB_CONSTANTS.Zn * lab_xyz(z);\n\n r = xyz_rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z); // D65 -> sRGB\n g = xyz_rgb(-0.969266 * x + 1.8760108 * y + 0.041556 * z);\n b_ = xyz_rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z);\n\n return [r, g, b_, args.length > 3 ? args[3] : 1];\n};\n\nconst xyz_rgb = (r) => {\n return 255 * (r <= 0.00304 ? 12.92 * r : 1.055 * pow(r, 1 / 2.4) - 0.055);\n};\n\nconst lab_xyz = (t) => {\n return t > LAB_CONSTANTS.t1\n ? t * t * t\n : LAB_CONSTANTS.t2 * (t - LAB_CONSTANTS.t0);\n};\n\nexport default lab2rgb;\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\nconst { pow } = Math;\n\nconst rgb2lab = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n const [x, y, z] = rgb2xyz(r, g, b);\n const l = 116 * y - 16;\n return [l < 0 ? 0 : l, 500 * (x - y), 200 * (y - z)];\n};\n\nconst rgb_xyz = (r) => {\n if ((r /= 255) <= 0.04045) return r / 12.92;\n return pow((r + 0.055) / 1.055, 2.4);\n};\n\nconst xyz_lab = (t) => {\n if (t > LAB_CONSTANTS.t3) return pow(t, 1 / 3);\n return t / LAB_CONSTANTS.t2 + LAB_CONSTANTS.t0;\n};\n\nconst rgb2xyz = (r, g, b) => {\n r = rgb_xyz(r);\n g = rgb_xyz(g);\n b = rgb_xyz(b);\n const x = xyz_lab(\n (0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / LAB_CONSTANTS.Xn\n );\n const y = xyz_lab(\n (0.2126729 * r + 0.7151522 * g + 0.072175 * b) / LAB_CONSTANTS.Yn\n );\n const z = xyz_lab(\n (0.0193339 * r + 0.119192 * g + 0.9503041 * b) / LAB_CONSTANTS.Zn\n );\n return [x, y, z];\n};\n\nexport default rgb2lab;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport lab2rgb from './lab2rgb.js';\nimport rgb2lab from './rgb2lab.js';\n\nColor.prototype.lab = function () {\n return rgb2lab(this._rgb);\n};\n\nchroma.lab = (...args) => new Color(...args, 'lab');\n\ninput.format.lab = lab2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'lab');\n if (type(args) === 'array' && args.length === 3) {\n return 'lab';\n }\n }\n});\n","import { unpack, DEG2RAD } from '../../utils/index.js';\nconst { sin, cos } = Math;\n\nconst lch2lab = (...args) => {\n /*\n Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n These formulas were invented by David Dalrymple to obtain maximum contrast without going\n out of gamut if the parameters are in the range 0-1.\n\n A saturation multiplier was added by Gregor Aisch\n */\n let [l, c, h] = unpack(args, 'lch');\n if (isNaN(h)) h = 0;\n h = h * DEG2RAD;\n return [l, cos(h) * c, sin(h) * c];\n};\n\nexport default lch2lab;\n","import { unpack } from '../../utils/index.js';\nimport lch2lab from './lch2lab.js';\nimport lab2rgb from '../lab/lab2rgb.js';\n\nconst lch2rgb = (...args) => {\n args = unpack(args, 'lch');\n const [l, c, h] = args;\n const [L, a, b_] = lch2lab(l, c, h);\n const [r, g, b] = lab2rgb(L, a, b_);\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default lch2rgb;\n","import { unpack } from '../../utils/index.js';\nimport lch2rgb from './lch2rgb.js';\n\nconst hcl2rgb = (...args) => {\n const hcl = unpack(args, 'hcl').reverse();\n return lch2rgb(...hcl);\n};\n\nexport default hcl2rgb;\n","import { unpack, RAD2DEG } from '../../utils/index.js';\nconst { sqrt, atan2, round } = Math;\n\nconst lab2lch = (...args) => {\n const [l, a, b] = unpack(args, 'lab');\n const c = sqrt(a * a + b * b);\n let h = (atan2(b, a) * RAD2DEG + 360) % 360;\n if (round(c * 10000) === 0) h = Number.NaN;\n return [l, c, h];\n};\n\nexport default lab2lch;\n","import { unpack } from '../../utils/index.js';\nimport rgb2lab from '../lab/rgb2lab.js';\nimport lab2lch from './lab2lch.js';\n\nconst rgb2lch = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n const [l, a, b_] = rgb2lab(r, g, b);\n return lab2lch(l, a, b_);\n};\n\nexport default rgb2lch;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport lch2rgb from './lch2rgb.js';\nimport hcl2rgb from './hcl2rgb.js';\nimport rgb2lch from './rgb2lch.js';\n\nColor.prototype.lch = function () {\n return rgb2lch(this._rgb);\n};\nColor.prototype.hcl = function () {\n return rgb2lch(this._rgb).reverse();\n};\n\nchroma.lch = (...args) => new Color(...args, 'lch');\nchroma.hcl = (...args) => new Color(...args, 'hcl');\n\ninput.format.lch = lch2rgb;\ninput.format.hcl = hcl2rgb;\n['lch', 'hcl'].forEach((m) =>\n input.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, m);\n if (type(args) === 'array' && args.length === 3) {\n return m;\n }\n }\n })\n);\n","/**\n\tX11 color names\n\n\thttp://www.w3.org/TR/css3-color/#svg-color\n*/\n\nconst w3cx11 = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n laserlemon: '#ffff54',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrod: '#fafad2',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n maroon2: '#7f0000',\n maroon3: '#b03060',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n purple2: '#7f007f',\n purple3: '#a020f0',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32'\n};\n\nexport default w3cx11;\n","import Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\n\nimport w3cx11 from '../../colors/w3cx11.js';\nimport hex2rgb from '../hex/hex2rgb.js';\nimport rgb2hex from '../hex/rgb2hex.js';\n\nColor.prototype.name = function () {\n const hex = rgb2hex(this._rgb, 'rgb');\n for (let n of Object.keys(w3cx11)) {\n if (w3cx11[n] === hex) return n.toLowerCase();\n }\n return hex;\n};\n\ninput.format.named = (name) => {\n name = name.toLowerCase();\n if (w3cx11[name]) return hex2rgb(w3cx11[name]);\n throw new Error('unknown color name: ' + name);\n};\n\ninput.autodetect.push({\n p: 5,\n test: (h, ...rest) => {\n if (!rest.length && type(h) === 'string' && w3cx11[h.toLowerCase()]) {\n return 'named';\n }\n }\n});\n","import { type } from '../../utils/index.js';\n\nconst num2rgb = (num) => {\n if (type(num) == 'number' && num >= 0 && num <= 0xffffff) {\n const r = num >> 16;\n const g = (num >> 8) & 0xff;\n const b = num & 0xff;\n return [r, g, b, 1];\n }\n throw new Error('unknown num color: ' + num);\n};\n\nexport default num2rgb;\n","import { unpack } from '../../utils/index.js';\n\nconst rgb2num = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n return (r << 16) + (g << 8) + b;\n};\n\nexport default rgb2num;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\nimport num2rgb from './num2rgb.js';\nimport rgb2num from './rgb2num.js';\n\nColor.prototype.num = function () {\n return rgb2num(this._rgb);\n};\n\nchroma.num = (...args) => new Color(...args, 'num');\n\ninput.format.num = num2rgb;\n\ninput.autodetect.push({\n p: 5,\n test: (...args) => {\n if (\n args.length === 1 &&\n type(args[0]) === 'number' &&\n args[0] >= 0 &&\n args[0] <= 0xffffff\n ) {\n return 'num';\n }\n }\n});\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { unpack, type } from '../../utils/index.js';\nconst { round } = Math;\n\nColor.prototype.rgb = function (rnd = true) {\n if (rnd === false) return this._rgb.slice(0, 3);\n return this._rgb.slice(0, 3).map(round);\n};\n\nColor.prototype.rgba = function (rnd = true) {\n return this._rgb.slice(0, 4).map((v, i) => {\n return i < 3 ? (rnd === false ? v : round(v)) : v;\n });\n};\n\nchroma.rgb = (...args) => new Color(...args, 'rgb');\n\ninput.format.rgb = (...args) => {\n const rgba = unpack(args, 'rgba');\n if (rgba[3] === undefined) rgba[3] = 1;\n return rgba;\n};\n\ninput.autodetect.push({\n p: 3,\n test: (...args) => {\n args = unpack(args, 'rgba');\n if (\n type(args) === 'array' &&\n (args.length === 3 ||\n (args.length === 4 &&\n type(args[3]) == 'number' &&\n args[3] >= 0 &&\n args[3] <= 1))\n ) {\n return 'rgb';\n }\n }\n});\n","/*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n */\n\nconst { log } = Math;\n\nconst temperature2rgb = (kelvin) => {\n const temp = kelvin / 100;\n let r, g, b;\n if (temp < 66) {\n r = 255;\n g =\n temp < 6\n ? 0\n : -155.25485562709179 -\n 0.44596950469579133 * (g = temp - 2) +\n 104.49216199393888 * log(g);\n b =\n temp < 20\n ? 0\n : -254.76935184120902 +\n 0.8274096064007395 * (b = temp - 10) +\n 115.67994401066147 * log(b);\n } else {\n r =\n 351.97690566805693 +\n 0.114206453784165 * (r = temp - 55) -\n 40.25366309332127 * log(r);\n g =\n 325.4494125711974 +\n 0.07943456536662342 * (g = temp - 50) -\n 28.0852963507957 * log(g);\n b = 255;\n }\n return [r, g, b, 1];\n};\n\nexport default temperature2rgb;\n","/*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n **/\n\nimport temperature2rgb from './temperature2rgb.js';\nimport { unpack } from '../../utils/index.js';\nconst { round } = Math;\n\nconst rgb2temperature = (...args) => {\n const rgb = unpack(args, 'rgb');\n const r = rgb[0],\n b = rgb[2];\n let minTemp = 1000;\n let maxTemp = 40000;\n const eps = 0.4;\n let temp;\n while (maxTemp - minTemp > eps) {\n temp = (maxTemp + minTemp) * 0.5;\n const rgb = temperature2rgb(temp);\n if (rgb[2] / rgb[0] >= b / r) {\n maxTemp = temp;\n } else {\n minTemp = temp;\n }\n }\n return round(temp);\n};\n\nexport default rgb2temperature;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport temperature2rgb from './temperature2rgb.js';\nimport rgb2temperature from './rgb2temperature.js';\n\nColor.prototype.temp =\n Color.prototype.kelvin =\n Color.prototype.temperature =\n function () {\n return rgb2temperature(this._rgb);\n };\n\nchroma.temp =\n chroma.kelvin =\n chroma.temperature =\n (...args) => new Color(...args, 'temp');\n\ninput.format.temp =\n input.format.kelvin =\n input.format.temperature =\n temperature2rgb;\n","import { unpack } from '../../utils/index.js';\nconst { pow, sign } = Math;\n\n/*\n * L* [0..100]\n * a [-100..100]\n * b [-100..100]\n */\nconst oklab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [L, a, b] = args;\n\n const l = pow(L + 0.3963377774 * a + 0.2158037573 * b, 3);\n const m = pow(L - 0.1055613458 * a - 0.0638541728 * b, 3);\n const s = pow(L - 0.0894841775 * a - 1.291485548 * b, 3);\n\n return [\n 255 * lrgb2rgb(+4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),\n 255 * lrgb2rgb(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),\n 255 * lrgb2rgb(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s),\n args.length > 3 ? args[3] : 1\n ];\n};\n\nexport default oklab2rgb;\n\nfunction lrgb2rgb(c) {\n const abs = Math.abs(c);\n if (abs > 0.0031308) {\n return (sign(c) || 1) * (1.055 * pow(abs, 1 / 2.4) - 0.055);\n }\n return c * 12.92;\n}\n","import { unpack } from '../../utils/index.js';\nconst { cbrt, pow, sign } = Math;\n\nconst rgb2oklab = (...args) => {\n // OKLab color space implementation taken from\n // https://bottosson.github.io/posts/oklab/\n const [r, g, b] = unpack(args, 'rgb');\n const [lr, lg, lb] = [\n rgb2lrgb(r / 255),\n rgb2lrgb(g / 255),\n rgb2lrgb(b / 255)\n ];\n const l = cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);\n const m = cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);\n const s = cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);\n\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s\n ];\n};\n\nexport default rgb2oklab;\n\nfunction rgb2lrgb(c) {\n const abs = Math.abs(c);\n if (abs < 0.04045) {\n return c / 12.92;\n }\n return (sign(c) || 1) * pow((abs + 0.055) / 1.055, 2.4);\n}\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport oklab2rgb from './oklab2rgb.js';\nimport rgb2oklab from './rgb2oklab.js';\n\nColor.prototype.oklab = function () {\n return rgb2oklab(this._rgb);\n};\n\nchroma.oklab = (...args) => new Color(...args, 'oklab');\n\ninput.format.oklab = oklab2rgb;\n\ninput.autodetect.push({\n p: 3,\n test: (...args) => {\n args = unpack(args, 'oklab');\n if (type(args) === 'array' && args.length === 3) {\n return 'oklab';\n }\n }\n});\n","import { unpack } from '../../utils/index.js';\nimport lch2lab from '../lch/lch2lab.js';\nimport oklab2rgb from '../oklab/oklab2rgb.js';\n\nconst oklch2rgb = (...args) => {\n args = unpack(args, 'lch');\n const [l, c, h] = args;\n const [L, a, b_] = lch2lab(l, c, h);\n const [r, g, b] = oklab2rgb(L, a, b_);\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default oklch2rgb;\n","import { unpack } from '../../utils/index.js';\nimport rgb2oklab from '../oklab/rgb2oklab.js';\nimport lab2lch from '../lch/lab2lch.js';\n\nconst rgb2oklch = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n const [l, a, b_] = rgb2oklab(r, g, b);\n return lab2lch(l, a, b_);\n};\n\nexport default rgb2oklch;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport oklch2rgb from './oklch2rgb.js';\nimport rgb2oklch from './rgb2oklch.js';\n\nColor.prototype.oklch = function () {\n return rgb2oklch(this._rgb);\n};\n\nchroma.oklch = (...args) => new Color(...args, 'oklch');\n\ninput.format.oklch = oklch2rgb;\n\ninput.autodetect.push({\n p: 3,\n test: (...args) => {\n args = unpack(args, 'oklch');\n if (type(args) === 'array' && args.length === 3) {\n return 'oklch';\n }\n }\n});\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\n\nColor.prototype.alpha = function (a, mutate = false) {\n if (a !== undefined && type(a) === 'number') {\n if (mutate) {\n this._rgb[3] = a;\n return this;\n }\n return new Color([this._rgb[0], this._rgb[1], this._rgb[2], a], 'rgb');\n }\n return this._rgb[3];\n};\n","import Color from '../Color.js';\n\nColor.prototype.clipped = function () {\n return this._rgb._clipped || false;\n};\n","import '../io/lab/index.js';\nimport Color from '../Color.js';\nimport LAB_CONSTANTS from '../io/lab/lab-constants.js';\n\nColor.prototype.darken = function (amount = 1) {\n const me = this;\n const lab = me.lab();\n lab[0] -= LAB_CONSTANTS.Kn * amount;\n return new Color(lab, 'lab').alpha(me.alpha(), true);\n};\n\nColor.prototype.brighten = function (amount = 1) {\n return this.darken(-amount);\n};\n\nColor.prototype.darker = Color.prototype.darken;\nColor.prototype.brighter = Color.prototype.brighten;\n","import Color from '../Color.js';\n\nColor.prototype.get = function (mc) {\n const [mode, channel] = mc.split('.');\n const src = this[mode]();\n if (channel) {\n const i = mode.indexOf(channel) - (mode.substr(0, 2) === 'ok' ? 2 : 0);\n if (i > -1) return src[i];\n throw new Error(`unknown channel ${channel} in mode ${mode}`);\n } else {\n return src;\n }\n};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\nconst { pow } = Math;\n\nconst EPS = 1e-7;\nconst MAX_ITER = 20;\n\nColor.prototype.luminance = function (lum, mode = 'rgb') {\n if (lum !== undefined && type(lum) === 'number') {\n if (lum === 0) {\n // return pure black\n return new Color([0, 0, 0, this._rgb[3]], 'rgb');\n }\n if (lum === 1) {\n // return pure white\n return new Color([255, 255, 255, this._rgb[3]], 'rgb');\n }\n // compute new color using...\n let cur_lum = this.luminance();\n let max_iter = MAX_ITER;\n\n const test = (low, high) => {\n const mid = low.interpolate(high, 0.5, mode);\n const lm = mid.luminance();\n if (Math.abs(lum - lm) < EPS || !max_iter--) {\n // close enough\n return mid;\n }\n return lm > lum ? test(low, mid) : test(mid, high);\n };\n\n const rgb = (\n cur_lum > lum\n ? test(new Color([0, 0, 0]), this)\n : test(this, new Color([255, 255, 255]))\n ).rgb();\n return new Color([...rgb, this._rgb[3]]);\n }\n return rgb2luminance(...this._rgb.slice(0, 3));\n};\n\nconst rgb2luminance = (r, g, b) => {\n // relative luminance\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n r = luminance_x(r);\n g = luminance_x(g);\n b = luminance_x(b);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\nconst luminance_x = (x) => {\n x /= 255;\n return x <= 0.03928 ? x / 12.92 : pow((x + 0.055) / 1.055, 2.4);\n};\n","export default {};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\nimport interpolator from '../interpolator/index.js';\n\nexport default (col1, col2, f = 0.5, ...rest) => {\n let mode = rest[0] || 'lrgb';\n if (!interpolator[mode] && !rest.length) {\n // fall back to the first supported mode\n mode = Object.keys(interpolator)[0];\n }\n if (!interpolator[mode]) {\n throw new Error(`interpolation mode ${mode} is not defined`);\n }\n if (type(col1) !== 'object') col1 = new Color(col1);\n if (type(col2) !== 'object') col2 = new Color(col2);\n return interpolator[mode](col1, col2, f).alpha(\n col1.alpha() + f * (col2.alpha() - col1.alpha())\n );\n};\n","import Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\nColor.prototype.mix = Color.prototype.interpolate = function (\n col2,\n f = 0.5,\n ...rest\n) {\n return mix(this, col2, f, ...rest);\n};\n","import Color from '../Color.js';\n\nColor.prototype.premultiply = function (mutate = false) {\n const rgb = this._rgb;\n const a = rgb[3];\n if (mutate) {\n this._rgb = [rgb[0] * a, rgb[1] * a, rgb[2] * a, a];\n return this;\n } else {\n return new Color([rgb[0] * a, rgb[1] * a, rgb[2] * a, a], 'rgb');\n }\n};\n","import '../io/lch/index.js';\nimport Color from '../Color.js';\nimport LAB_CONSTANTS from '../io/lab/lab-constants.js';\n\nColor.prototype.saturate = function (amount = 1) {\n const me = this;\n const lch = me.lch();\n lch[1] += LAB_CONSTANTS.Kn * amount;\n if (lch[1] < 0) lch[1] = 0;\n return new Color(lch, 'lch').alpha(me.alpha(), true);\n};\n\nColor.prototype.desaturate = function (amount = 1) {\n return this.saturate(-amount);\n};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\n\nColor.prototype.set = function (mc, value, mutate = false) {\n const [mode, channel] = mc.split('.');\n const src = this[mode]();\n if (channel) {\n const i = mode.indexOf(channel) - (mode.substr(0, 2) === 'ok' ? 2 : 0);\n if (i > -1) {\n if (type(value) == 'string') {\n switch (value.charAt(0)) {\n case '+':\n src[i] += +value;\n break;\n case '-':\n src[i] += +value;\n break;\n case '*':\n src[i] *= +value.substr(1);\n break;\n case '/':\n src[i] /= +value.substr(1);\n break;\n default:\n src[i] = +value;\n }\n } else if (type(value) === 'number') {\n src[i] = value;\n } else {\n throw new Error(`unsupported value for Color.set`);\n }\n const out = new Color(src, mode);\n if (mutate) {\n this._rgb = out._rgb;\n return this;\n }\n return out;\n }\n throw new Error(`unknown channel ${channel} in mode ${mode}`);\n } else {\n return src;\n }\n};\n","import '../io/lab/index.js';\nimport Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\nColor.prototype.tint = function (f = 0.5, ...rest) {\n return mix(this, 'white', f, ...rest);\n};\n\nColor.prototype.shade = function (f = 0.5, ...rest) {\n return mix(this, 'black', f, ...rest);\n};\n","import Color from '../Color.js';\nimport index from './index.js';\n\nconst rgb = (col1, col2, f) => {\n const xyz0 = col1._rgb;\n const xyz1 = col2._rgb;\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'rgb'\n );\n};\n\n// register interpolator\nindex.rgb = rgb;\n\nexport default rgb;\n","import Color from '../Color.js';\nconst { sqrt, pow } = Math;\nimport index from './index.js';\n\nconst lrgb = (col1, col2, f) => {\n const [x1, y1, z1] = col1._rgb;\n const [x2, y2, z2] = col2._rgb;\n return new Color(\n sqrt(pow(x1, 2) * (1 - f) + pow(x2, 2) * f),\n sqrt(pow(y1, 2) * (1 - f) + pow(y2, 2) * f),\n sqrt(pow(z1, 2) * (1 - f) + pow(z2, 2) * f),\n 'rgb'\n );\n};\n\n// register interpolator\nindex.lrgb = lrgb;\n\nexport default lrgb;\n","import '../io/lab/index.js';\nimport index from './index.js';\nimport Color from '../Color.js';\n\nconst lab = (col1, col2, f) => {\n const xyz0 = col1.lab();\n const xyz1 = col2.lab();\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'lab'\n );\n};\n\n// register interpolator\nindex.lab = lab;\n\nexport default lab;\n","import Color from '../Color.js';\n\nexport default (col1, col2, f, m) => {\n let xyz0, xyz1;\n if (m === 'hsl') {\n xyz0 = col1.hsl();\n xyz1 = col2.hsl();\n } else if (m === 'hsv') {\n xyz0 = col1.hsv();\n xyz1 = col2.hsv();\n } else if (m === 'hcg') {\n xyz0 = col1.hcg();\n xyz1 = col2.hcg();\n } else if (m === 'hsi') {\n xyz0 = col1.hsi();\n xyz1 = col2.hsi();\n } else if (m === 'lch' || m === 'hcl') {\n m = 'hcl';\n xyz0 = col1.hcl();\n xyz1 = col2.hcl();\n } else if (m === 'oklch') {\n xyz0 = col1.oklch().reverse();\n xyz1 = col2.oklch().reverse();\n }\n\n let hue0, hue1, sat0, sat1, lbv0, lbv1;\n if (m.substr(0, 1) === 'h' || m === 'oklch') {\n [hue0, sat0, lbv0] = xyz0;\n [hue1, sat1, lbv1] = xyz1;\n }\n\n let sat, hue, lbv, dh;\n\n if (!isNaN(hue0) && !isNaN(hue1)) {\n // both colors have hue\n if (hue1 > hue0 && hue1 - hue0 > 180) {\n dh = hue1 - (hue0 + 360);\n } else if (hue1 < hue0 && hue0 - hue1 > 180) {\n dh = hue1 + 360 - hue0;\n } else {\n dh = hue1 - hue0;\n }\n hue = hue0 + f * dh;\n } else if (!isNaN(hue0)) {\n hue = hue0;\n if ((lbv1 == 1 || lbv1 == 0) && m != 'hsv') sat = sat0;\n } else if (!isNaN(hue1)) {\n hue = hue1;\n if ((lbv0 == 1 || lbv0 == 0) && m != 'hsv') sat = sat1;\n } else {\n hue = Number.NaN;\n }\n\n if (sat === undefined) sat = sat0 + f * (sat1 - sat0);\n lbv = lbv0 + f * (lbv1 - lbv0);\n return m === 'oklch'\n ? new Color([lbv, sat, hue], m)\n : new Color([hue, sat, lbv], m);\n};\n","import '../io/lch/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst lch = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'lch');\n};\n\n// register interpolator\nindex.lch = lch;\nindex.hcl = lch;\n\nexport default lch;\n","import '../io/num/index.js';\nimport index from './index.js';\n\nimport Color from '../Color.js';\n\nconst num = (col1, col2, f) => {\n const c1 = col1.num();\n const c2 = col2.num();\n return new Color(c1 + f * (c2 - c1), 'num');\n};\n\n// register interpolator\nindex.num = num;\n\nexport default num;\n","import '../io/hcg/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hcg = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hcg');\n};\n\n// register interpolator\nindex.hcg = hcg;\n\nexport default hcg;\n","import '../io/hsi/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsi = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsi');\n};\n\n// register interpolator\nindex.hsi = hsi;\n\nexport default hsi;\n","import '../io/hsl/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsl = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsl');\n};\n\n// register interpolator\nindex.hsl = hsl;\n\nexport default hsl;\n","import '../io/hsv/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsv = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsv');\n};\n\n// register interpolator\nindex.hsv = hsv;\n\nexport default hsv;\n","import '../io/oklab/index.js';\nimport index from './index.js';\nimport Color from '../Color.js';\n\nconst oklab = (col1, col2, f) => {\n const xyz0 = col1.oklab();\n const xyz1 = col2.oklab();\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'oklab'\n );\n};\n\n// register interpolator\nindex.oklab = oklab;\n\nexport default oklab;\n","import '../io/lch/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst oklch = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'oklch');\n};\n\n// register interpolator\nindex.oklch = oklch;\n\nexport default oklch;\n","import Color from '../Color.js';\nimport { clip_rgb } from '../utils/index.js';\n\nconst { pow, sqrt, PI, cos, sin, atan2 } = Math;\n\nexport default (colors, mode = 'lrgb', weights = null) => {\n const l = colors.length;\n if (!weights) weights = Array.from(new Array(l)).map(() => 1);\n // normalize weights\n const k =\n l /\n weights.reduce(function (a, b) {\n return a + b;\n });\n weights.forEach((w, i) => {\n weights[i] *= k;\n });\n // convert colors to Color objects\n colors = colors.map((c) => new Color(c));\n if (mode === 'lrgb') {\n return _average_lrgb(colors, weights);\n }\n const first = colors.shift();\n const xyz = first.get(mode);\n const cnt = [];\n let dx = 0;\n let dy = 0;\n // initial color\n for (let i = 0; i < xyz.length; i++) {\n xyz[i] = (xyz[i] || 0) * weights[0];\n cnt.push(isNaN(xyz[i]) ? 0 : weights[0]);\n if (mode.charAt(i) === 'h' && !isNaN(xyz[i])) {\n const A = (xyz[i] / 180) * PI;\n dx += cos(A) * weights[0];\n dy += sin(A) * weights[0];\n }\n }\n\n let alpha = first.alpha() * weights[0];\n colors.forEach((c, ci) => {\n const xyz2 = c.get(mode);\n alpha += c.alpha() * weights[ci + 1];\n for (let i = 0; i < xyz.length; i++) {\n if (!isNaN(xyz2[i])) {\n cnt[i] += weights[ci + 1];\n if (mode.charAt(i) === 'h') {\n const A = (xyz2[i] / 180) * PI;\n dx += cos(A) * weights[ci + 1];\n dy += sin(A) * weights[ci + 1];\n } else {\n xyz[i] += xyz2[i] * weights[ci + 1];\n }\n }\n }\n });\n\n for (let i = 0; i < xyz.length; i++) {\n if (mode.charAt(i) === 'h') {\n let A = (atan2(dy / cnt[i], dx / cnt[i]) / PI) * 180;\n while (A < 0) A += 360;\n while (A >= 360) A -= 360;\n xyz[i] = A;\n } else {\n xyz[i] = xyz[i] / cnt[i];\n }\n }\n alpha /= l;\n return new Color(xyz, mode).alpha(alpha > 0.99999 ? 1 : alpha, true);\n};\n\nconst _average_lrgb = (colors, weights) => {\n const l = colors.length;\n const xyz = [0, 0, 0, 0];\n for (let i = 0; i < colors.length; i++) {\n const col = colors[i];\n const f = weights[i] / l;\n const rgb = col._rgb;\n xyz[0] += pow(rgb[0], 2) * f;\n xyz[1] += pow(rgb[1], 2) * f;\n xyz[2] += pow(rgb[2], 2) * f;\n xyz[3] += rgb[3] * f;\n }\n xyz[0] = sqrt(xyz[0]);\n xyz[1] = sqrt(xyz[1]);\n xyz[2] = sqrt(xyz[2]);\n if (xyz[3] > 0.9999999) xyz[3] = 1;\n return new Color(clip_rgb(xyz));\n};\n","// minimal multi-purpose interface\n\n// @requires utils color analyze\nimport chroma from '../chroma.js';\nimport { limit, type } from '../utils/index.js';\n\nconst { pow } = Math;\n\nexport default function (colors) {\n // constructor\n let _mode = 'rgb';\n let _nacol = chroma('#ccc');\n let _spread = 0;\n // const _fixed = false;\n let _domain = [0, 1];\n let _pos = [];\n let _padding = [0, 0];\n let _classes = false;\n let _colors = [];\n let _out = false;\n let _min = 0;\n let _max = 1;\n let _correctLightness = false;\n let _colorCache = {};\n let _useCache = true;\n let _gamma = 1;\n\n // private methods\n\n const setColors = function (colors) {\n colors = colors || ['#fff', '#000'];\n if (\n colors &&\n type(colors) === 'string' &&\n chroma.brewer &&\n chroma.brewer[colors.toLowerCase()]\n ) {\n colors = chroma.brewer[colors.toLowerCase()];\n }\n if (type(colors) === 'array') {\n // handle single color\n if (colors.length === 1) {\n colors = [colors[0], colors[0]];\n }\n // make a copy of the colors\n colors = colors.slice(0);\n // convert to chroma classes\n for (let c = 0; c < colors.length; c++) {\n colors[c] = chroma(colors[c]);\n }\n // auto-fill color position\n _pos.length = 0;\n for (let c = 0; c < colors.length; c++) {\n _pos.push(c / (colors.length - 1));\n }\n }\n resetCache();\n return (_colors = colors);\n };\n\n const getClass = function (value) {\n if (_classes != null) {\n const n = _classes.length - 1;\n let i = 0;\n while (i < n && value >= _classes[i]) {\n i++;\n }\n return i - 1;\n }\n return 0;\n };\n\n let tMapLightness = (t) => t;\n let tMapDomain = (t) => t;\n\n // const classifyValue = function(value) {\n // let val = value;\n // if (_classes.length > 2) {\n // const n = _classes.length-1;\n // const i = getClass(value);\n // const minc = _classes[0] + ((_classes[1]-_classes[0]) * (0 + (_spread * 0.5))); // center of 1st class\n // const maxc = _classes[n-1] + ((_classes[n]-_classes[n-1]) * (1 - (_spread * 0.5))); // center of last class\n // val = _min + ((((_classes[i] + ((_classes[i+1] - _classes[i]) * 0.5)) - minc) / (maxc-minc)) * (_max - _min));\n // }\n // return val;\n // };\n\n const getColor = function (val, bypassMap) {\n let col, t;\n if (bypassMap == null) {\n bypassMap = false;\n }\n if (isNaN(val) || val === null) {\n return _nacol;\n }\n if (!bypassMap) {\n if (_classes && _classes.length > 2) {\n // find the class\n const c = getClass(val);\n t = c / (_classes.length - 2);\n } else if (_max !== _min) {\n // just interpolate between min/max\n t = (val - _min) / (_max - _min);\n } else {\n t = 1;\n }\n } else {\n t = val;\n }\n\n // domain map\n t = tMapDomain(t);\n\n if (!bypassMap) {\n t = tMapLightness(t); // lightness correction\n }\n\n if (_gamma !== 1) {\n t = pow(t, _gamma);\n }\n\n t = _padding[0] + t * (1 - _padding[0] - _padding[1]);\n\n t = limit(t, 0, 1);\n\n const k = Math.floor(t * 10000);\n\n if (_useCache && _colorCache[k]) {\n col = _colorCache[k];\n } else {\n if (type(_colors) === 'array') {\n //for i in [0.._pos.length-1]\n for (let i = 0; i < _pos.length; i++) {\n const p = _pos[i];\n if (t <= p) {\n col = _colors[i];\n break;\n }\n if (t >= p && i === _pos.length - 1) {\n col = _colors[i];\n break;\n }\n if (t > p && t < _pos[i + 1]) {\n t = (t - p) / (_pos[i + 1] - p);\n col = chroma.interpolate(\n _colors[i],\n _colors[i + 1],\n t,\n _mode\n );\n break;\n }\n }\n } else if (type(_colors) === 'function') {\n col = _colors(t);\n }\n if (_useCache) {\n _colorCache[k] = col;\n }\n }\n return col;\n };\n\n var resetCache = () => (_colorCache = {});\n\n setColors(colors);\n\n // public interface\n\n const f = function (v) {\n const c = chroma(getColor(v));\n if (_out && c[_out]) {\n return c[_out]();\n } else {\n return c;\n }\n };\n\n f.classes = function (classes) {\n if (classes != null) {\n if (type(classes) === 'array') {\n _classes = classes;\n _domain = [classes[0], classes[classes.length - 1]];\n } else {\n const d = chroma.analyze(_domain);\n if (classes === 0) {\n _classes = [d.min, d.max];\n } else {\n _classes = chroma.limits(d, 'e', classes);\n }\n }\n return f;\n }\n return _classes;\n };\n\n f.domain = function (domain) {\n if (!arguments.length) {\n return _domain;\n }\n _min = domain[0];\n _max = domain[domain.length - 1];\n _pos = [];\n const k = _colors.length;\n if (domain.length === k && _min !== _max) {\n // update positions\n for (let d of Array.from(domain)) {\n _pos.push((d - _min) / (_max - _min));\n }\n } else {\n for (let c = 0; c < k; c++) {\n _pos.push(c / (k - 1));\n }\n if (domain.length > 2) {\n // set domain map\n const tOut = domain.map((d, i) => i / (domain.length - 1));\n const tBreaks = domain.map((d) => (d - _min) / (_max - _min));\n if (!tBreaks.every((val, i) => tOut[i] === val)) {\n tMapDomain = (t) => {\n if (t <= 0 || t >= 1) return t;\n let i = 0;\n while (t >= tBreaks[i + 1]) i++;\n const f =\n (t - tBreaks[i]) / (tBreaks[i + 1] - tBreaks[i]);\n const out = tOut[i] + f * (tOut[i + 1] - tOut[i]);\n return out;\n };\n }\n }\n }\n _domain = [_min, _max];\n return f;\n };\n\n f.mode = function (_m) {\n if (!arguments.length) {\n return _mode;\n }\n _mode = _m;\n resetCache();\n return f;\n };\n\n f.range = function (colors, _pos) {\n setColors(colors, _pos);\n return f;\n };\n\n f.out = function (_o) {\n _out = _o;\n return f;\n };\n\n f.spread = function (val) {\n if (!arguments.length) {\n return _spread;\n }\n _spread = val;\n return f;\n };\n\n f.correctLightness = function (v) {\n if (v == null) {\n v = true;\n }\n _correctLightness = v;\n resetCache();\n if (_correctLightness) {\n tMapLightness = function (t) {\n const L0 = getColor(0, true).lab()[0];\n const L1 = getColor(1, true).lab()[0];\n const pol = L0 > L1;\n let L_actual = getColor(t, true).lab()[0];\n const L_ideal = L0 + (L1 - L0) * t;\n let L_diff = L_actual - L_ideal;\n let t0 = 0;\n let t1 = 1;\n let max_iter = 20;\n while (Math.abs(L_diff) > 1e-2 && max_iter-- > 0) {\n (function () {\n if (pol) {\n L_diff *= -1;\n }\n if (L_diff < 0) {\n t0 = t;\n t += (t1 - t) * 0.5;\n } else {\n t1 = t;\n t += (t0 - t) * 0.5;\n }\n L_actual = getColor(t, true).lab()[0];\n return (L_diff = L_actual - L_ideal);\n })();\n }\n return t;\n };\n } else {\n tMapLightness = (t) => t;\n }\n return f;\n };\n\n f.padding = function (p) {\n if (p != null) {\n if (type(p) === 'number') {\n p = [p, p];\n }\n _padding = p;\n return f;\n } else {\n return _padding;\n }\n };\n\n f.colors = function (numColors, out) {\n // If no arguments are given, return the original colors that were provided\n if (arguments.length < 2) {\n out = 'hex';\n }\n let result = [];\n\n if (arguments.length === 0) {\n result = _colors.slice(0);\n } else if (numColors === 1) {\n result = [f(0.5)];\n } else if (numColors > 1) {\n const dm = _domain[0];\n const dd = _domain[1] - dm;\n result = __range__(0, numColors, false).map((i) =>\n f(dm + (i / (numColors - 1)) * dd)\n );\n } else {\n // returns all colors based on the defined classes\n colors = [];\n let samples = [];\n if (_classes && _classes.length > 2) {\n for (\n let i = 1, end = _classes.length, asc = 1 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n samples.push((_classes[i - 1] + _classes[i]) * 0.5);\n }\n } else {\n samples = _domain;\n }\n result = samples.map((v) => f(v));\n }\n\n if (chroma[out]) {\n result = result.map((c) => c[out]());\n }\n return result;\n };\n\n f.cache = function (c) {\n if (c != null) {\n _useCache = c;\n return f;\n } else {\n return _useCache;\n }\n };\n\n f.gamma = function (g) {\n if (g != null) {\n _gamma = g;\n return f;\n } else {\n return _gamma;\n }\n };\n\n f.nodata = function (d) {\n if (d != null) {\n _nacol = chroma(d);\n return f;\n } else {\n return _nacol;\n }\n };\n\n return f;\n}\n\nfunction __range__(left, right, inclusive) {\n let range = [];\n let ascending = left < right;\n let end = !inclusive ? right : ascending ? right + 1 : right - 1;\n for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n return range;\n}\n","//\n// interpolates between a set of colors uzing a bezier spline\n//\n\n// @requires utils lab\nimport Color from '../Color.js';\nimport '../io/lab/index.js';\nimport scale from './scale.js';\n\n// nth row of the pascal triangle\nconst binom_row = function (n) {\n let row = [1, 1];\n for (let i = 1; i < n; i++) {\n let newrow = [1];\n for (let j = 1; j <= row.length; j++) {\n newrow[j] = (row[j] || 0) + row[j - 1];\n }\n row = newrow;\n }\n return row;\n};\n\nconst bezier = function (colors) {\n let I, lab0, lab1, lab2;\n colors = colors.map((c) => new Color(c));\n if (colors.length === 2) {\n // linear interpolation\n [lab0, lab1] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map((i) => lab0[i] + t * (lab1[i] - lab0[i]));\n return new Color(lab, 'lab');\n };\n } else if (colors.length === 3) {\n // quadratic bezier interpolation\n [lab0, lab1, lab2] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map(\n (i) =>\n (1 - t) * (1 - t) * lab0[i] +\n 2 * (1 - t) * t * lab1[i] +\n t * t * lab2[i]\n );\n return new Color(lab, 'lab');\n };\n } else if (colors.length === 4) {\n // cubic bezier interpolation\n let lab3;\n [lab0, lab1, lab2, lab3] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map(\n (i) =>\n (1 - t) * (1 - t) * (1 - t) * lab0[i] +\n 3 * (1 - t) * (1 - t) * t * lab1[i] +\n 3 * (1 - t) * t * t * lab2[i] +\n t * t * t * lab3[i]\n );\n return new Color(lab, 'lab');\n };\n } else if (colors.length >= 5) {\n // general case (degree n bezier)\n let labs, row, n;\n labs = colors.map((c) => c.lab());\n n = colors.length - 1;\n row = binom_row(n);\n I = function (t) {\n const u = 1 - t;\n const lab = [0, 1, 2].map((i) =>\n labs.reduce(\n (sum, el, j) =>\n sum + row[j] * u ** (n - j) * t ** j * el[i],\n 0\n )\n );\n return new Color(lab, 'lab');\n };\n } else {\n throw new RangeError('No point in running bezier with only one color.');\n }\n return I;\n};\n\nexport default (colors) => {\n const f = bezier(colors);\n f.scale = () => scale(f);\n return f;\n};\n","/*\n * interpolates between a set of colors uzing a bezier spline\n * blend mode formulas taken from https://web.archive.org/web/20180110014946/http://www.venture-ware.com/kevin/coding/lets-learn-math-photoshop-blend-modes/\n */\n\nimport '../io/rgb/index.js';\nimport chroma from '../chroma.js';\n\nconst blend = (bottom, top, mode) => {\n if (!blend[mode]) {\n throw new Error('unknown blend mode ' + mode);\n }\n return blend[mode](bottom, top);\n};\n\nconst blend_f = (f) => (bottom, top) => {\n const c0 = chroma(top).rgb();\n const c1 = chroma(bottom).rgb();\n return chroma.rgb(f(c0, c1));\n};\n\nconst each = (f) => (c0, c1) => {\n const out = [];\n out[0] = f(c0[0], c1[0]);\n out[1] = f(c0[1], c1[1]);\n out[2] = f(c0[2], c1[2]);\n return out;\n};\n\nconst normal = (a) => a;\nconst multiply = (a, b) => (a * b) / 255;\nconst darken = (a, b) => (a > b ? b : a);\nconst lighten = (a, b) => (a > b ? a : b);\nconst screen = (a, b) => 255 * (1 - (1 - a / 255) * (1 - b / 255));\nconst overlay = (a, b) =>\n b < 128 ? (2 * a * b) / 255 : 255 * (1 - 2 * (1 - a / 255) * (1 - b / 255));\nconst burn = (a, b) => 255 * (1 - (1 - b / 255) / (a / 255));\nconst dodge = (a, b) => {\n if (a === 255) return 255;\n a = (255 * (b / 255)) / (1 - a / 255);\n return a > 255 ? 255 : a;\n};\n\n// # add = (a,b) ->\n// # if (a + b > 255) then 255 else a + b\n\nblend.normal = blend_f(each(normal));\nblend.multiply = blend_f(each(multiply));\nblend.screen = blend_f(each(screen));\nblend.overlay = blend_f(each(overlay));\nblend.darken = blend_f(each(darken));\nblend.lighten = blend_f(each(lighten));\nblend.dodge = blend_f(each(dodge));\nblend.burn = blend_f(each(burn));\n// blend.add = blend_f(each(add));\n\nexport default blend;\n","// cubehelix interpolation\n// based on D.A. Green \"A colour scheme for the display of astronomical intensity images\"\n// http://astron-soc.in/bulletin/11June/289392011.pdf\nimport { type, clip_rgb, TWOPI } from '../utils/index.js';\nimport chroma from '../chroma.js';\nconst { pow, sin, cos } = Math;\n\nexport default function (\n start = 300,\n rotations = -1.5,\n hue = 1,\n gamma = 1,\n lightness = [0, 1]\n) {\n let dh = 0,\n dl;\n if (type(lightness) === 'array') {\n dl = lightness[1] - lightness[0];\n } else {\n dl = 0;\n lightness = [lightness, lightness];\n }\n const f = function (fract) {\n const a = TWOPI * ((start + 120) / 360 + rotations * fract);\n const l = pow(lightness[0] + dl * fract, gamma);\n const h = dh !== 0 ? hue[0] + fract * dh : hue;\n const amp = (h * l * (1 - l)) / 2;\n const cos_a = cos(a);\n const sin_a = sin(a);\n const r = l + amp * (-0.14861 * cos_a + 1.78277 * sin_a);\n const g = l + amp * (-0.29227 * cos_a - 0.90649 * sin_a);\n const b = l + amp * (+1.97294 * cos_a);\n return chroma(clip_rgb([r * 255, g * 255, b * 255, 1]));\n };\n f.start = function (s) {\n if (s == null) {\n return start;\n }\n start = s;\n return f;\n };\n f.rotations = function (r) {\n if (r == null) {\n return rotations;\n }\n rotations = r;\n return f;\n };\n f.gamma = function (g) {\n if (g == null) {\n return gamma;\n }\n gamma = g;\n return f;\n };\n f.hue = function (h) {\n if (h == null) {\n return hue;\n }\n hue = h;\n if (type(hue) === 'array') {\n dh = hue[1] - hue[0];\n if (dh === 0) {\n hue = hue[1];\n }\n } else {\n dh = 0;\n }\n return f;\n };\n f.lightness = function (h) {\n if (h == null) {\n return lightness;\n }\n if (type(h) === 'array') {\n lightness = h;\n dl = h[1] - h[0];\n } else {\n lightness = [h, h];\n dl = 0;\n }\n return f;\n };\n f.scale = () => chroma.scale(f);\n f.hue(hue);\n return f;\n}\n","import Color from '../Color.js';\nconst digits = '0123456789abcdef';\n\nconst { floor, random } = Math;\n\nexport default () => {\n let code = '#';\n for (let i = 0; i < 6; i++) {\n code += digits.charAt(floor(random() * 16));\n }\n return new Color(code, 'hex');\n};\n","import type from './type.js';\n\nconst { log, pow, floor, abs } = Math;\n\nexport function analyze(data, key = null) {\n const r = {\n min: Number.MAX_VALUE,\n max: Number.MAX_VALUE * -1,\n sum: 0,\n values: [],\n count: 0\n };\n if (type(data) === 'object') {\n data = Object.values(data);\n }\n data.forEach((val) => {\n if (key && type(val) === 'object') val = val[key];\n if (val !== undefined && val !== null && !isNaN(val)) {\n r.values.push(val);\n r.sum += val;\n if (val < r.min) r.min = val;\n if (val > r.max) r.max = val;\n r.count += 1;\n }\n });\n\n r.domain = [r.min, r.max];\n\n r.limits = (mode, num) => limits(r, mode, num);\n\n return r;\n}\n\nexport function limits(data, mode = 'equal', num = 7) {\n if (type(data) == 'array') {\n data = analyze(data);\n }\n const { min, max } = data;\n const values = data.values.sort((a, b) => a - b);\n\n if (num === 1) {\n return [min, max];\n }\n\n const limits = [];\n\n if (mode.substr(0, 1) === 'c') {\n // continuous\n limits.push(min);\n limits.push(max);\n }\n\n if (mode.substr(0, 1) === 'e') {\n // equal interval\n limits.push(min);\n for (let i = 1; i < num; i++) {\n limits.push(min + (i / num) * (max - min));\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'l') {\n // log scale\n if (min <= 0) {\n throw new Error(\n 'Logarithmic scales are only possible for values > 0'\n );\n }\n const min_log = Math.LOG10E * log(min);\n const max_log = Math.LOG10E * log(max);\n limits.push(min);\n for (let i = 1; i < num; i++) {\n limits.push(pow(10, min_log + (i / num) * (max_log - min_log)));\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'q') {\n // quantile scale\n limits.push(min);\n for (let i = 1; i < num; i++) {\n const p = ((values.length - 1) * i) / num;\n const pb = floor(p);\n if (pb === p) {\n limits.push(values[pb]);\n } else {\n // p > pb\n const pr = p - pb;\n limits.push(values[pb] * (1 - pr) + values[pb + 1] * pr);\n }\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'k') {\n // k-means clustering\n /*\n implementation based on\n http://code.google.com/p/figue/source/browse/trunk/figue.js#336\n simplified for 1-d input values\n */\n let cluster;\n const n = values.length;\n const assignments = new Array(n);\n const clusterSizes = new Array(num);\n let repeat = true;\n let nb_iters = 0;\n let centroids = null;\n\n // get seed values\n centroids = [];\n centroids.push(min);\n for (let i = 1; i < num; i++) {\n centroids.push(min + (i / num) * (max - min));\n }\n centroids.push(max);\n\n while (repeat) {\n // assignment step\n for (let j = 0; j < num; j++) {\n clusterSizes[j] = 0;\n }\n for (let i = 0; i < n; i++) {\n const value = values[i];\n let mindist = Number.MAX_VALUE;\n let best;\n for (let j = 0; j < num; j++) {\n const dist = abs(centroids[j] - value);\n if (dist < mindist) {\n mindist = dist;\n best = j;\n }\n clusterSizes[best]++;\n assignments[i] = best;\n }\n }\n\n // update centroids step\n const newCentroids = new Array(num);\n for (let j = 0; j < num; j++) {\n newCentroids[j] = null;\n }\n for (let i = 0; i < n; i++) {\n cluster = assignments[i];\n if (newCentroids[cluster] === null) {\n newCentroids[cluster] = values[i];\n } else {\n newCentroids[cluster] += values[i];\n }\n }\n for (let j = 0; j < num; j++) {\n newCentroids[j] *= 1 / clusterSizes[j];\n }\n\n // check convergence\n repeat = false;\n for (let j = 0; j < num; j++) {\n if (newCentroids[j] !== centroids[j]) {\n repeat = true;\n break;\n }\n }\n\n centroids = newCentroids;\n nb_iters++;\n\n if (nb_iters > 200) {\n repeat = false;\n }\n }\n\n // finished k-means clustering\n // the next part is borrowed from gabrielflor.it\n const kClusters = {};\n for (let j = 0; j < num; j++) {\n kClusters[j] = [];\n }\n for (let i = 0; i < n; i++) {\n cluster = assignments[i];\n kClusters[cluster].push(values[i]);\n }\n let tmpKMeansBreaks = [];\n for (let j = 0; j < num; j++) {\n tmpKMeansBreaks.push(kClusters[j][0]);\n tmpKMeansBreaks.push(kClusters[j][kClusters[j].length - 1]);\n }\n tmpKMeansBreaks = tmpKMeansBreaks.sort((a, b) => a - b);\n limits.push(tmpKMeansBreaks[0]);\n for (let i = 1; i < tmpKMeansBreaks.length; i += 2) {\n const v = tmpKMeansBreaks[i];\n if (!isNaN(v) && limits.indexOf(v) === -1) {\n limits.push(v);\n }\n }\n }\n return limits;\n}\n","import Color from '../Color.js';\nimport '../ops/luminance.js';\n\nexport default (a, b) => {\n // WCAG contrast ratio\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\n a = new Color(a);\n b = new Color(b);\n const l1 = a.luminance();\n const l2 = b.luminance();\n return l1 > l2 ? (l1 + 0.05) / (l2 + 0.05) : (l2 + 0.05) / (l1 + 0.05);\n};\n","import Color from '../Color.js';\nconst { sqrt, pow, min, max, atan2, abs, cos, sin, exp, PI } = Math;\n\nexport default function (a, b, Kl = 1, Kc = 1, Kh = 1) {\n // Delta E (CIE 2000)\n // see http://www.brucelindbloom.com/index.html?Eqn_DeltaE_CIE2000.html\n var rad2deg = function (rad) {\n return (360 * rad) / (2 * PI);\n };\n var deg2rad = function (deg) {\n return (2 * PI * deg) / 360;\n };\n a = new Color(a);\n b = new Color(b);\n const [L1, a1, b1] = Array.from(a.lab());\n const [L2, a2, b2] = Array.from(b.lab());\n const avgL = (L1 + L2) / 2;\n const C1 = sqrt(pow(a1, 2) + pow(b1, 2));\n const C2 = sqrt(pow(a2, 2) + pow(b2, 2));\n const avgC = (C1 + C2) / 2;\n const G = 0.5 * (1 - sqrt(pow(avgC, 7) / (pow(avgC, 7) + pow(25, 7))));\n const a1p = a1 * (1 + G);\n const a2p = a2 * (1 + G);\n const C1p = sqrt(pow(a1p, 2) + pow(b1, 2));\n const C2p = sqrt(pow(a2p, 2) + pow(b2, 2));\n const avgCp = (C1p + C2p) / 2;\n const arctan1 = rad2deg(atan2(b1, a1p));\n const arctan2 = rad2deg(atan2(b2, a2p));\n const h1p = arctan1 >= 0 ? arctan1 : arctan1 + 360;\n const h2p = arctan2 >= 0 ? arctan2 : arctan2 + 360;\n const avgHp =\n abs(h1p - h2p) > 180 ? (h1p + h2p + 360) / 2 : (h1p + h2p) / 2;\n const T =\n 1 -\n 0.17 * cos(deg2rad(avgHp - 30)) +\n 0.24 * cos(deg2rad(2 * avgHp)) +\n 0.32 * cos(deg2rad(3 * avgHp + 6)) -\n 0.2 * cos(deg2rad(4 * avgHp - 63));\n let deltaHp = h2p - h1p;\n deltaHp =\n abs(deltaHp) <= 180\n ? deltaHp\n : h2p <= h1p\n ? deltaHp + 360\n : deltaHp - 360;\n deltaHp = 2 * sqrt(C1p * C2p) * sin(deg2rad(deltaHp) / 2);\n const deltaL = L2 - L1;\n const deltaCp = C2p - C1p;\n const sl = 1 + (0.015 * pow(avgL - 50, 2)) / sqrt(20 + pow(avgL - 50, 2));\n const sc = 1 + 0.045 * avgCp;\n const sh = 1 + 0.015 * avgCp * T;\n const deltaTheta = 30 * exp(-pow((avgHp - 275) / 25, 2));\n const Rc = 2 * sqrt(pow(avgCp, 7) / (pow(avgCp, 7) + pow(25, 7)));\n const Rt = -Rc * sin(2 * deg2rad(deltaTheta));\n const result = sqrt(\n pow(deltaL / (Kl * sl), 2) +\n pow(deltaCp / (Kc * sc), 2) +\n pow(deltaHp / (Kh * sh), 2) +\n Rt * (deltaCp / (Kc * sc)) * (deltaHp / (Kh * sh))\n );\n return max(0, min(100, result));\n}\n","import Color from '../Color.js';\n\n// simple Euclidean distance\nexport default function (a, b, mode = 'lab') {\n // Delta E (CIE 1976)\n // see http://www.brucelindbloom.com/index.html?Equations.html\n a = new Color(a);\n b = new Color(b);\n const l1 = a.get(mode);\n const l2 = b.get(mode);\n let sum_sq = 0;\n for (let i in l1) {\n const d = (l1[i] || 0) - (l2[i] || 0);\n sum_sq += d * d;\n }\n return Math.sqrt(sum_sq);\n}\n","import Color from '../Color.js';\n\nexport default (...args) => {\n try {\n new Color(...args);\n return true;\n // eslint-disable-next-line\n } catch (e) {\n return false;\n }\n};\n","// some pre-defined color scales:\nimport chroma from '../chroma.js';\nimport '../io/hsl/index.js';\nimport scale from '../generator/scale.js';\n\nexport default {\n cool() {\n return scale([chroma.hsl(180, 1, 0.9), chroma.hsl(250, 0.7, 0.4)]);\n },\n hot() {\n return scale(['#000', '#f00', '#ff0', '#fff'], [0, 0.25, 0.75, 1]).mode(\n 'rgb'\n );\n }\n};\n","/**\n ColorBrewer colors for chroma.js\n\n Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The\n Pennsylvania State University.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software distributed\n under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n CONDITIONS OF ANY KIND, either express or implied. See the License for the\n specific language governing permissions and limitations under the License.\n*/\n\nconst colorbrewer = {\n // sequential\n OrRd: ['#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59', '#ef6548', '#d7301f', '#b30000', '#7f0000'],\n PuBu: ['#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858'],\n BuPu: ['#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb1', '#88419d', '#810f7c', '#4d004b'],\n Oranges: ['#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c', '#f16913', '#d94801', '#a63603', '#7f2704'],\n BuGn: ['#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4', '#41ae76', '#238b45', '#006d2c', '#00441b'],\n YlOrBr: ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506'],\n YlGn: ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529'],\n Reds: ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d'],\n RdPu: ['#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1', '#dd3497', '#ae017e', '#7a0177', '#49006a'],\n Greens: ['#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476', '#41ab5d', '#238b45', '#006d2c', '#00441b'],\n YlGnBu: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'],\n Purples: ['#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8', '#807dba', '#6a51a3', '#54278f', '#3f007d'],\n GnBu: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4', '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'],\n Greys: ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000'],\n YlOrRd: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'],\n PuRd: ['#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0', '#e7298a', '#ce1256', '#980043', '#67001f'],\n Blues: ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'],\n PuBuGn: ['#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf', '#3690c0', '#02818a', '#016c59', '#014636'],\n Viridis: ['#440154', '#482777', '#3f4a8a', '#31678e', '#26838f', '#1f9d8a', '#6cce5a', '#b6de2b', '#fee825'],\n\n // diverging\n Spectral: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'],\n RdYlGn: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850', '#006837'],\n RdBu: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'],\n PiYG: ['#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef', '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221', '#276419'],\n PRGn: ['#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8', '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837', '#00441b'],\n RdYlBu: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090', '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695'],\n BrBG: ['#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3', '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e', '#003c30'],\n RdGy: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d', '#1a1a1a'],\n PuOr: ['#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6', '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788', '#2d004b'],\n\n // qualitative\n Set2: ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f', '#e5c494', '#b3b3b3'],\n Accent: ['#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0', '#f0027f', '#bf5b17', '#666666'],\n Set1: ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf', '#999999'],\n Set3: ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462', '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'],\n Dark2: ['#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02', '#a6761d', '#666666'],\n Paired: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'],\n Pastel2: ['#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae', '#f1e2cc', '#cccccc'],\n Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2']\n};\n\n// add lowercase aliases for case-insensitive matches\nfor (let key of Object.keys(colorbrewer)) {\n colorbrewer[key.toLowerCase()] = colorbrewer[key];\n}\n\nexport default colorbrewer;\n","import chroma from './src/chroma.js';\n\n// feel free to comment out anything to rollup\n// a smaller chroma.js built\n\n// io --> convert colors\nimport './src/io/cmyk/index.js';\nimport './src/io/css/index.js';\nimport './src/io/gl/index.js';\nimport './src/io/hcg/index.js';\nimport './src/io/hex/index.js';\nimport './src/io/hsi/index.js';\nimport './src/io/hsl/index.js';\nimport './src/io/hsv/index.js';\nimport './src/io/lab/index.js';\nimport './src/io/lch/index.js';\nimport './src/io/named/index.js';\nimport './src/io/num/index.js';\nimport './src/io/rgb/index.js';\nimport './src/io/temp/index.js';\nimport './src/io/oklab/index.js';\nimport './src/io/oklch/index.js';\n\n// operators --> modify existing Colors\nimport './src/ops/alpha.js';\nimport './src/ops/clipped.js';\nimport './src/ops/darken.js';\nimport './src/ops/get.js';\nimport './src/ops/luminance.js';\nimport './src/ops/mix.js';\nimport './src/ops/premultiply.js';\nimport './src/ops/saturate.js';\nimport './src/ops/set.js';\nimport './src/ops/shade.js';\n\n// interpolators\nimport './src/interpolator/rgb.js';\nimport './src/interpolator/lrgb.js';\nimport './src/interpolator/lab.js';\nimport './src/interpolator/lch.js';\nimport './src/interpolator/num.js';\nimport './src/interpolator/hcg.js';\nimport './src/interpolator/hsi.js';\nimport './src/interpolator/hsl.js';\nimport './src/interpolator/hsv.js';\nimport './src/interpolator/oklab.js';\nimport './src/interpolator/oklch.js';\n\n// generators -- > create new colors\nimport average from './src/generator/average.js';\nimport bezier from './src/generator/bezier.js';\nimport blend from './src/generator/blend.js';\nimport cubehelix from './src/generator/cubehelix.js';\nimport mix from './src/generator/mix.js';\nimport random from './src/generator/random.js';\nimport scale from './src/generator/scale.js';\n\n// other utility methods\nimport { analyze } from './src/utils/analyze.js';\nimport contrast from './src/utils/contrast.js';\nimport deltaE from './src/utils/delta-e.js';\nimport distance from './src/utils/distance.js';\nimport { limits } from './src/utils/analyze.js';\nimport valid from './src/utils/valid.js';\nimport input from './src/io/input.js';\n\n// scale\nimport scales from './src/utils/scales.js';\n\n// colors\nimport colors from './src/colors/w3cx11.js';\nimport brewer from './src/colors/colorbrewer.js';\n\nObject.assign(chroma, {\n average,\n bezier,\n blend,\n cubehelix,\n mix,\n interpolate: mix,\n random,\n scale,\n analyze,\n contrast,\n deltaE,\n distance,\n limits,\n valid,\n scales,\n input,\n colors,\n brewer\n});\n\nexport default chroma;\n","import chroma from 'chroma-js'\n\nexport const baseColors = {\n primaryGreen: '#95C92C',\n secondaryGreen: '#B5E655',\n primaryRed: '#F06000',\n secondaryRed: '#FF8F00',\n primaryGrey: '#E0E0E0',\n}\n\nconst fontColors = {\n white: 'text-gray-200',\n black: 'text-gray-700',\n}\n\nexport class ColorManager {\n // List of Link colors\n private colors: string[] = [\n 'rgb(153,128,119)',\n 'rgb(199,151,129)',\n 'rgb(187,167,137)',\n 'rgb(205,197,177)',\n 'rgb(224,222,197)',\n 'rgb(194,207,179)',\n 'rgb(173,183,167)',\n 'rgb(160,167,159)',\n 'rgb(140,144,145)',\n 'rgb(62,85,100)',\n 'rgb(106,119,134)',\n 'rgb(150,151,170)',\n 'rgb(111,85,101)',\n 'rgb(128,106,109)'\n ]\n\n private colorIndex: number = 0\n\n // Converts 'rgb(r,g,b)' to an array [r, g, b]\n private rgbStringToArray(rgb: string): number[] {\n const result = rgb.match(/\\d+/g)\n return result ? result.map(Number) : [0, 0, 0]\n }\n\n // Convert RGB to HSL\n private rgbToHsl(rgb: string): number[] {\n const [r, g, b] = this.rgbStringToArray(rgb).map(v => v / 255)\n\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n // eslint-disable-next-line prefer-const\n let h: number = 0, s: number, l: number = (max + min) / 2\n\n if (max === min) {\n h = s = 0 // achromatic\n } else {\n const d = max - min\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n switch (max) {\n case r: \n h = (g - b) / d + (g < b ? 6 : 0) \n break\n case g: \n h = (b - r) / d + 2 \n break\n case b: \n h = (r - g) / d + 4 \n break\n }\n h /= 6\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100)]\n }\n\n // Convert HSL to string format\n private hslToString(hsl: number[]): string {\n return `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`\n }\n\n // Helper function to calculate Euclidean distance in HSL space\n private calculateColorDistanceHSL(color1: string, color2: string): number {\n const [h1, s1, l1] = this.rgbToHsl(color1)\n const [h2, s2, l2] = this.rgbToHsl(color2)\n\n return Math.sqrt(Math.pow(h1 - h2, 2) + Math.pow(s1 - s2, 2) + Math.pow(l1 - l2, 2))\n }\n\n // Get 'count' most distinct colors from the list based on distance in HSL space\n public getMostDistinctColors(count: number): string[] {\n if (count >= this.colors.length) return this.colors.map(c => this.hslToString(this.rgbToHsl(c))) // Return all in HSL if needed\n\n const distinctColors: string[] = [this.hslToString(this.rgbToHsl(this.colors[0]))] // Start with first color\n\n // Find most distinct colors by maximizing distance in HSL space\n for (let i = 1; i < count; i++) {\n let maxDistance = -1\n let nextColor = ''\n\n for (const color of this.colors) {\n if (!distinctColors.includes(this.hslToString(this.rgbToHsl(color)))) {\n const minDistanceToSet = Math.min(\n ...distinctColors.map(selectedColor => this.calculateColorDistanceHSL(this.hslToString(this.rgbToHsl(selectedColor)), color))\n )\n if (minDistanceToSet > maxDistance) {\n maxDistance = minDistanceToSet\n nextColor = color\n }\n }\n }\n\n distinctColors.push(this.hslToString(this.rgbToHsl(nextColor)))\n }\n\n return distinctColors\n }\n\n // Get next color in HSL format\n public getNextColor(): string {\n return this.hslToString(this.rgbToHsl(this.colors[this.colorIndex++ % this.colors.length]))\n }\n\n // Reset color index to start rotation again\n public resetColorIndex(index: number = 0): void {\n this.colorIndex = index\n }\n}\n\n/**\n * Checks the lightness of the color and returns the appropriate font color\n * @param hsl HSL color string\n * @returns \n */\nexport function getFontColorForHSL(hsl: string): string {\n // Extract the lightness value from the HSL string\n const hslValues = hsl.match(/\\d+/g)?.map(Number)\n \n if (!hslValues || hslValues.length !== 3) {\n throw new Error('Invalid HSL format')\n }\n\n const lightness = hslValues[2]\n\n // Return white font color if the background is dark,\n // otherwise return black font color\n return lightness < 50 ? fontColors.white : fontColors.black\n}\n\n\n/**\n * Create a list of colors based on the number of objects\n * Rainbow style for now, we can limit this range later\n * @param n number of colors\n * @returns list of HSL colors\n */\nexport function generateColors(n: number): string[] {\n const colors: string[] = []\n for (let i = 0; i < n; i++) {\n const hue = Math.round(360 * i / n)\n colors.push(`hsl(${hue}, 100%, 80%)`)\n }\n return colors\n}\n\n/**\n * Convert hsl to hex, https://stackoverflow.com/questions/36721830/convert-hsl-to-rgb-and-hex\n * @param h hue\n * @param s saturation\n * @param l lightness\n * @returns Hex color\n */\nexport function hslToHex(h: number, s: number, l: number) {\n l /= 100\n const a = s * Math.min(l, 1 - l) / 100\n const f = n => {\n const k = (n + h / 30) % 12\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\n return Math.round(255 * color).toString(16).padStart(2, '0') // convert to Hex and prefix \"0\" if needed\n }\n return `#${f(0)}${f(8)}${f(4)}`\n}\n\n/**\n * Get gradient color scale for custom color length\n * Only supports a start and an end color\n * @param numColors number of colors in the gradient\n * @param startColor optional otherwise it uses primaryGreen\n * @param endColor optional otherwise it uses primaryRed\n * @returns \n */\nexport function generateGradientColorScale(numColors: number, startColor: string = baseColors.primaryGreen, endColor: string = baseColors.primaryRed) {\n return chroma.scale([startColor, endColor]).mode('lab').colors(numColors)\n}\n\n/**\n * Get specific color from gradient based on a min and max value\n * @param startColor optional otherwise it uses primaryGreen\n * @param endColor optional otherwise it uses primaryRed\n * @param value number to get color for\n * @param min minimum value for interpolation\n * @param max maximum value for interpolation\n * @returns \n */\nexport function getValueColorFromGradient(value: number, min: number, max: number, startColor: string = baseColors.primaryGreen, endColor: string = baseColors.primaryRed) {\n const normalizedValue = (value - min) / (max - min)\n return chroma.scale([startColor, endColor])(normalizedValue).hex()\n}","import type { \n\tLifeCycleStage, \n\tImpactCategoryKey, \n\tAssembly as LcaxAssembly,\n\tProduct as LcaxProduct \n} from 'lcax'\nimport type { FilterList } from './filters'\n\n// Material and Assembly interfaces\n\nexport enum Source {\n LCAbyg,\n Organisation,\n Revalu,\n ECOPortal,\n}\n\n\nexport type Emission = Partial<{\n\t[impactCategory in ExtendedImpactCategoryKey]: \n\t\tLifeCycleStageEmission\n}>\n\nexport type LifeCycleStageEmission = {\n\t[lifecycleStage in LifeCycleStage]: number\n}\n\n/**\n * Product interface, extends LcaxProduct and adds emission data\n */\nexport interface Product extends LcaxProduct {\n emission: Emission\n source: Source\n}\n\n/**\n * Assembly interface, extends LcaxAssembly and adds emission data and replaces products with local one\n */\nexport interface Assembly extends Omit {\n\tproducts: Record\n\temission: Emission\n}\n\n/**\n * Mapping step used in saving and restoring mappings\n */\nexport interface MappingStep {\n\tfilterId: string\n\tnestedGroupId: string\n\tmaterial: Product | Assembly\n}\n\n/**\n * Mapping interface, stores all metadata of the mapping.\n * Keeps a list of all filters so we dont have to cross reference with relationships\n */\nexport interface Mapping {\n id: string\n name: string\n\tfilters: FilterList[] \n\tsteps: MappingStep[]\n}\n\n/**\n * Filter parameters for material and assembly list.\n */\nexport interface MaterialFilterParam {\n\tname: string,\n\tselected: boolean,\n\tfilterParamter: string\n}\n\n/**\n * Sorting option for material and assembly list.\n */\nexport interface MaterialSortingOption {\n\tparameter: string\n\tdirection: string\n}\n\n/**\n * Units for materials and assemblies.\n */\nexport type MetricUnits = \"m\" | \"m2\" | \"m3\" | \"pcs\" | \"kg\" | \"l\" | \"tonnes\"\n\n/**\n * Extended impact categories for application\n * Array of possible impact categories to use, increase as needed\n */\nexport type ExtendedImpactCategoryKey = 'gwp_total' | 'gwp_fossil' | 'gwp_biogenic' | 'gwp_LULUC' | ImpactCategoryKey\nexport const extendedImpactCategoryKeys: readonly ExtendedImpactCategoryKey[] = [\n 'gwp',\n 'gwp_total',\n 'gwp_fossil',\n 'gwp_biogenic',\n 'gwp_LULUC',\n 'odp',\n 'ap',\n 'pocp',\n] as const\n\nexport const LifeCycleStages: readonly LifeCycleStage[] = [\n 'a1a3',\n 'a4',\n 'a5',\n 'b1',\n 'b2',\n 'b3',\n 'b4',\n 'b5',\n 'b6',\n 'c1',\n 'c2',\n 'c3',\n 'c4',\n 'd',\n] as const","import { type Mapping, type MaterialFilterParam, type MaterialSortingOption, type Assembly, type Product, Source } from '@/models/material'\nimport { defineStore } from 'pinia'\nimport materialList from '@/tests/objects/materialList.json'\nimport type { NestedGroup } from \"@/models/filters\"\n\nimport { applyParamFilters } from '@/utils/material'\n\nexport const useMaterialStore = defineStore({\n id: 'materialStore',\n state: () => ({\n materials: [] as Product[],\n assemblies: [] as Assembly[],\n currentMapping: null as Product | Assembly | null,\n currentAssemby: null as Assembly | null,\n sorting: { parameter: 'name', direction: 'asc' } as MaterialSortingOption,\n EPDMode: true,\n EPDList: [] as Product[],\n assemblyList: [] as Assembly[],\n //Filters this could be dynamic?\n paramFilters: {\n matParam: [] as MaterialFilterParam[],\n subParam: [] as MaterialFilterParam[],\n unitParam: [] as MaterialFilterParam[],\n },\n sortingParameters: [\n { \"filterName\": 'name',\n \"displayName\": \"Name\",\n \"paramName\": null \n },\n { \"filterName\": 'subType',\n \"displayName\": \"EPD Type\",\n \"paramName\": \"subParam\"\n },\n { \"filterName\": 'materialType',\n \"displayName\": \"Material Type\",\n \"paramName\": \"matParam\"\n },\n { \"filterName\": 'declared_unit',\n \"displayName\": \"Declared Unit\",\n \"paramName\": \"unitParam\"\n }\n ],\n mapping: null as Mapping | null,\n }),\n actions: {\n /**\n * Add material to store\n * @param material \n */\n addMaterial(material: Product) {\n this.materials.push(material)\n this.updateParameters()\n },\n \n /**\n * Add material list to store\n * @param materials\n */\n addMaterialList(materials: Product[]) {\n this.materials = materials\n this.updateParameters()\n },\n\n /**\n * Remove material from store\n * @param material \n */\n removeMaterial(material: Product) {\n const index = this.materials.indexOf(material)\n if (index !== -1) {\n this.materials.splice(index, 1)\n }\n },\n\n /**\n * Add assembly to store\n * @param assembly\n */\n addAssembly(assembly: Assembly) {\n const index = this.assemblies.findIndex((el) => el.id === assembly.id)\n if (index !== -1) {\n this.assemblies[index] = assembly;\n } else {\n this.assemblies.push(assembly);\n }\n },\n\n /**\n * Remove assembly from store\n * @param assembly\n */\n removeAssembly(assembly: Assembly) {\n const index = this.assemblies.indexOf(assembly)\n if (index !== -1) {\n this.assemblies.splice(index, 1)\n }\n },\n\n /**\n * Set current mapping material which is being dragged\n * @param mapping either EPD or Assembly\n */\n setCurrentMapping(mapping: Product | Assembly) {\n this.currentMapping = mapping\n },\n\n /**\n * Set current assembly which is being dragged\n * @param assembly\n */\n setCurrentAssembly(assembly: Assembly) {\n this.currentAssemby = assembly\n },\n\n /**\n * set filtered EPD list\n */\n setFilteredMaterials(materials: Product[]) {\n this.EPDList = materials\n },\n\n /**\n * Returns the current mapping\n */\n getCurrentMapping() {\n return this.mapping\n },\n\n /**\n * Update EPD list from JSON path \n */\n async materialsFromJson() {\n try {\n this.materials = materialList.map((material: any) => ({\n ...material,\n metaData: {\n materialType: material[\"materialType\"],\n Collection: material?.metaData?.Collection ?? \"-\", // Check for metaData.Collection, set to \"-\" if it doesn't exist\n },\n source: Source.LCAbyg\n })) as any\n\n this.EPDList = this.materials\n this.updateParameters()\n } catch (error) {\n console.error('Error fetching JSON:', error)\n }\n },\n\n /**\n * Update filterable parameters from material list\n * DEPRICATED\n */\n updateParameters() {\n const uniqueMaterialTypes = Array.from(\n new Set(this.materials.map((mat) => mat.metaData?.materialType))\n ).filter(Boolean) as string[]\n const uniqueDeclaredUnits = Array.from(\n new Set(this.materials.map((mat) => mat.unit))\n ).filter(Boolean) as string[]\n\n this.paramFilters.matParam = uniqueMaterialTypes.map((name) => ({ \n name: name, \n selected: false,\n filterParamter: 'metaData.materialType'\n }))\n this.paramFilters.unitParam = uniqueDeclaredUnits.map((name) => ({ \n name: name, \n selected: false,\n filterParamter: 'unit'\n }))\n },\n\n /**\n * Set sorting option and sort the list\n * DEPRICATED\n */\n setSorting(parameter: string, direction: string) {\n const sorting = { parameter, direction }\n this.sorting = sorting\n this.sortList()\n },\n\n /**\n * Filter EPD list based on selected parameters\n * DEPRICATED\n */\n triggerParamSort() {\n if(this.EPDMode === true) {\n // Reset EPDList to all EPDs\n this.EPDList = this.materials\n this.sortList()\n // Go through each paramFilters and check if any are selected\n for (const key in this.paramFilters) {\n // If none of the filters are selected then take all EPDs\n if (!this.paramFilters[key].some((param) => param.selected)) {\n continue\n } else {\n // Update the filtered list\n this.EPDList = applyParamFilters(this.EPDList, this.paramFilters[key])\n }\n }\n } else {\n // Filter assembly list\n this.assemblyList = this.assemblyList.filter((assembly) => {\n // Check if at least one product in the assembly matches the filter\n return Object.values(assembly.products).some((product) => {\n for (const key in this.paramFilters) {\n // If none of the filters are selected, skip this filter\n if (!this.paramFilters[key].some((param) => param.selected)) {\n continue\n }\n // Apply filters to each product in the assembly\n const filteredProducts = applyParamFilters([product], this.paramFilters[key])\n // If any product matches the filters, include the assembly\n if (filteredProducts.length > 0) {\n return true\n }\n }\n return false\n })\n })\n }\n },\n\n /**\n * Reset sorting to default\n */\n resetSorting() {\n this.sorting = { parameter: 'name', direction: 'asc' }\n },\n\n /**\n * Sort filteredList by set sorting Option\n */\n sortList() {\n const { parameter, direction } = this.sorting\n this.EPDList.sort((a, b) => {\n if (a[parameter] < b[parameter]) {\n return direction === 'asc' ? -1 : 1\n }\n if (a[parameter] > b[parameter]) {\n return direction === 'asc' ? 1 : -1\n }\n return 0\n })\n },\n\n /**\n * Set Mapping for saving and reloading from firebase\n */\n setMapping(mapping: Mapping) {\n this.mapping = mapping\n },\n\n /**\n * Update Mapping material for specific nesterGroupId\n * @param nestedGroupId id for the group to update\n * @param material EPD or Assembly cannot be null\n */\n updateMappingMaterial(nestedGroupId: string, material: Product | Assembly) {\n if (!this.mapping) {\n this.mapping = {\n id: crypto.randomUUID(),\n name: 'temp',\n filters: [],\n steps: []\n }\n }\n const index = this.mapping.steps.findIndex((step) => step.nestedGroupId === nestedGroupId)\n if (index !== -1) {\n this.mapping.steps[index].material = material\n }\n },\n\n /**\n * Remove material for nested group\n * @param nestedGroupId nested Group Id\n */\n removeMappingMaterial(nestedGroupId: string) {\n const index = this.mapping.steps.findIndex((mat) => mat.nestedGroupId === nestedGroupId)\n if (index !== -1) {\n this.mapping.steps.splice(index, 1)\n }\n },\n\n /**\n * Add step to current mapping\n * @param filterId filter id from current filter list to add to mapping object\n * @param nestedGroup nested group to add mapping towards \n * @param material material to add to mapping\n */\n addStep(nestedGroup: NestedGroup, material: Product | Assembly, filterId: string) {\n this.mapping?.steps.push({\n filterId: filterId,\n nestedGroupId: nestedGroup.id,\n material\n })\n }\n }\n})","/**\n * @description GraphQL query to fetch user and server information.\n */\nexport const userInfoQuery = `\n query {\n user {\n name\n id\n avatar\n email\n },\n serverInfo {\n name\n company\n }\n }`\n\n/**\n * @description GraphQL query to fetch project versions.\n * @param id - The ID of the stream.\n */\nexport const projectVersionsQuery = `\n query($id: String!) {\n stream(id: $id){\n name\n updatedAt\n id\n commits{\n totalCount\n cursor\n items{\n id\n message\n branchName\n sourceApplication\n referencedObject\n authorName\n createdAt\n }\n }\n }\n }`\n\n/**\n * @description GraphQL query to search for streams.\n * @param searchText - The text to search for.\n */\nexport const streamSearchQuery = `\n query($searchText: String!) {\n streams(query: $searchText) {\n totalCount\n cursor\n items {\n id\n name\n updatedAt\n }\n }\n }`\n\n/**\n * @description GraphQL query to fetch the latest streams.\n */\nexport const latestStreamsQuery = `query {\n streams(limit: 10){\n cursor\n totalCount\n items {\n id\n name\n description\n createdAt\n updatedAt\n }\n }\n}`\n\nexport const modelIdQuery = `query($projectId: String!) {\n project(id: $projectId) {\n models {\n items {\n id\n }\n }\n }\n}\n`\n\n/**\n * @description GraphQL query to fetch children objects and their parameters based on selection.\n * @param streamId - The ID of the stream.\n * @param objectId - The ID of the object.\n * @param select - An array of parameters to include for each object\n */\nexport const selectedObjectsQuery = `query Stream($streamId: String!, $objectId: String!, $select: [String]) {\n stream(id: $streamId) {\n object(id: $objectId) {\n totalChildrenCount\n elements: children(select: $select limit:1000000){\n objects {\n id\n data\n }\n }\n }\n }\n}`\n\n/**\n * @description DEPRECATED GraphQL query to fetch a stream object use selectedObjectsQuery instead\n * @param streamId - The ID of the stream.\n * @param objectId - The ID of the object.\n */\nexport const streamObjectQuery = `query($streamId: String!, $objectId: String!) {\n stream(id: $streamId){\n object(id: $objectId){\n totalChildrenCount\n id\n speckleType\n data\n children(select:[\"speckle_type\",\"type\", \"family\", \"category\", \"level.name\", \"level.elevation\", \"level.id\", \"parameters.HOST_AREA_COMPUTED.value\", \"parameters.HOST_VOLUME_COMPUTED.value\",\"height\"] limit:1000000){\n totalCount\n cursor\n objects{\n id\n data\n }\n }\n }\n }\n}`\n","/**\n * Combines and gets the selection variable to get proper information from your speckle project\n * @param sourceApplication source application as string\n * @returns array of strings to be set as variables for graphQL queries\n */\nexport function speckleSelection(sourceApplication: string) {\n\tconst selection: string[] = []\n\tselection.push(...generalParameters)\n\n\tif (sourceApplication.includes('Archicad'))\n\t\tselection.push(...archicadParameters)\n\n\tif (sourceApplication.includes('Revit')) selection.push(...revitParameters)\n\n\tif (sourceApplication.includes('IFC')) selection.push(...ifcParameters)\n\n\tif (\n\t\tsourceApplication.includes('Rhino') &&\n\t\tsourceApplication.includes('Grasshopper')\n\t)\n\t\tselection.push(...rhinoParameters)\n\n\treturn selection\n}\n\n/**\n * General geometry information that speckle sets from all supported applications\n */\nconst generalParameters = ['name', 'speckleType', 'height', 'width', 'level']\n\n/**\n * Archicad building element information that speckle sets when sent from Archicad\n */\nconst archicadParameters = [\n\t'elementType',\n\t'area',\n\t'volume',\n\t'number',\n\t'sideMaterialName',\n\t'oppositeMaterialName',\n\t'referenceMaterialName',\n\t'botMat',\n\t'topMat',\n\t'sideMat',\n\t'buildingMaterialName',\n\t'classifications'\n]\n\n/**\n * Revit building element information that speckle sets when sent from Revit\n */\nconst revitParameters = [\n\t'type',\n\t'family',\n\t'category',\n\t'parameters.HOST_AREA_COMPUTED.value',\n\t'parameters.HOST_VOLUME_COMPUTED.value'\n]\n\n/**\n * IFC building element information that speckle sets when sent from IFC\n * THIS NEEDS TO BE EXPANDED\n */\nconst ifcParameters = ['Name', 'GlobalId', 'Type', 'BIP', 'Tag']\n\n/**\n * Rhino building element information that speckle sets when sent from Rhino\n */\nconst rhinoParameters = ['area', 'provenance', 'volume']\n","/**\n * This file contains utility functions for working with Speckle, including authentication, data fetching, and object conversion.\n *\n * @packageDocumentation\n */\nimport type { Project } from '@/models/project'\nimport type { ResponseObject, ResponseObjectStream } from '@/models/speckle'\nimport type { GeometryObject, Quantity } from '@/models/geometryObject'\nimport type { MetricUnits } from '@/models/material'\n\nimport { selectedObjectsQuery } from '@/graphql/speckleQueries'\nimport { speckleSelection } from '@/graphql/speckleVariables'\nimport {\n\tlatestStreamsQuery,\n\tprojectVersionsQuery,\n\tstreamObjectQuery,\n\tstreamSearchQuery,\n\tuserInfoQuery,\n\tmodelIdQuery\n} from '@/graphql/speckleQueries'\n\nimport { reportErrorToSentry } from './monitoring'\n\nimport { useSpeckleStore } from '@/stores/speckle'\nimport { useSettingsStore } from '@/stores/settings'\n\n\nexport const APP_NAME = 'SpeckLCA'\n\nexport const TOKEN = `${APP_NAME}.AuthToken`\nexport const REFRESH_TOKEN = `${APP_NAME}.RefreshToken`\nexport const CHALLENGE = `${APP_NAME}.Challenge`\n\n// TODO Update all these to Project, Model and Version terminology.\n\n/**\n * Redirects the user to the Speckle authentication page.\n * Generates a random challenge, saves it in localStorage, and redirects the user to the authentication page.\n */\nexport function navigateToAuthPage() {\n\tconst settingsStore = useSettingsStore()\n\t// Generate random challenge.\n\tconst challenge =\n\t\tMath.random().toString(36).substring(2, 15) +\n\t\tMath.random().toString(36).substring(2, 15)\n\n\t// Save challenge in localStorage.\n\tlocalStorage.setItem(CHALLENGE, challenge)\n\n\t// Send user to auth page.\n\twindow.location.href = `${settingsStore.keySettings.speckleConfig.serverUrl}/authn/verify/${\n\t\tsettingsStore.keySettings.speckleConfig.id\n\t}/${challenge}`\n}\n\n/**\n * Logs out the user by removing the token and refreshToken from localStorage.\n */\nexport function speckleLogOut() {\n\t// Remove both token and refreshToken from localStorage\n\tlocalStorage.removeItem(TOKEN)\n\tlocalStorage.removeItem(REFRESH_TOKEN)\n}\n\n/**\n * Exchanges the access code for a token and refresh token.\n * @param accessCode The access code to exchange.\n * @returns A promise that resolves to the response data.\n */\nexport async function exchangeAccessCode(accessCode: string) {\n\tconst settingsStore = useSettingsStore()\n\tconst res = await fetch(`${settingsStore.keySettings.speckleConfig.serverUrl}/auth/token/`, {\n\t\tmethod: 'POST',\n\t\theaders: {\n\t\t\t'Content-Type': 'application/json'\n\t\t},\n\t\tbody: JSON.stringify({\n\t\t\taccessCode: accessCode,\n\t\t\tappId: settingsStore.keySettings.speckleConfig.id,\n\t\t\tappSecret: settingsStore.keySettings.speckleConfig.secret,\n\t\t\tchallenge: localStorage.getItem(CHALLENGE)\n\t\t})\n\t})\n\n\t/**\n\t * Try retrieving the token.\n\t * If successful, remove challenge and set the new token and refresh token.\n\t * */\n\tconst data = await res.json()\n\tif (data.token) {\n\t\tlocalStorage.removeItem(CHALLENGE)\n\t\tlocalStorage.setItem(TOKEN, data.token)\n\t\tlocalStorage.setItem(REFRESH_TOKEN, data.refreshToken)\n\t}\n\treturn data\n}\n\n/**\n * Fetches data from the Speckle server using GraphQL.\n * @param query - The GraphQL query string.\n * @param vars - Optional variables to be passed with the query.\n * @returns A Promise that resolves to the fetched data.\n * @throws If the API call fails or the user is not logged in.\n */\nexport async function speckleFetch(\n\tquery: string,\n\tvars?: { [key: string]: any }\n) {\n\tconst settingsStore = useSettingsStore()\n\tconst token = localStorage.getItem(TOKEN)\n\tif (token)\n\t\ttry {\n\t\t\tconst res = await fetch(`${settingsStore.keySettings.speckleConfig.serverUrl}/graphql`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: 'Bearer ' + token,\n\t\t\t\t\t'Content-Type': 'application/json'\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tquery: query,\n\t\t\t\t\tvariables: vars || null\n\t\t\t\t})\n\t\t\t})\n\t\t\tconst data = await res.json()\n\t\t\treturn data\n\t\t} catch (err) {\n\t\t\tconst msg = 'API call failed!'\n\n\t\t\treportErrorToSentry(err as Error)\n\t\t\tconsole.error(msg, err)\n\n\t\t\treturn Promise.reject(msg)\n\t\t}\n\telse return Promise.reject('You are not logged in. (Token does not exist.)')\n}\n\n// Fetch the current user data using the userInfoQuery\nexport const getUserData = () => speckleFetch(userInfoQuery)\n\n// Fetch for streams matching the specified text using the streamSearchQuery\nexport function searchStreams(variables: string) {\n\tconst vars = { var: variables }\n\tspeckleFetch(streamSearchQuery, vars)\n}\n\n// Get versions related to a specific project, allows for pagination by passing a cursor\nexport function getProjectVersions(\n\tprojectId: string,\n\titemsPerPage: number,\n\tcursor: Date | null\n) {\n\treturn speckleFetch(projectVersionsQuery, {\n\t\tid: projectId,\n\t\tcursor,\n\t\tlimit: itemsPerPage\n\t})\n}\n\n// Get a specific object from a specific stream\nexport function getObject(streamId: string, objectId: string) {\n\treturn speckleFetch(streamObjectQuery, { streamId, objectId })\n}\n\n// Get the latest projects\nexport function getProjectsData() {\n\treturn speckleFetch(latestStreamsQuery)\n}\n\n// Get the latest model for a specific project\nexport function getLatestModel(projectId: string) {\n\treturn speckleFetch(modelIdQuery, { projectId })\n}\n\n/**\n * Get object parameters for a stream and specific referenced object.\n * The parameters will be dynamic for the sourceapplication that was used when sending to Speckle\n * @param streamId\n * @param objectId\n * @param sourceApplication\n */\nexport async function getObjectParameters(\n\tstreamId: string,\n\tobjectId: string,\n\tsourceApplication: string\n) {\n\tconst selection = speckleSelection(sourceApplication)\n\treturn await speckleFetch(selectedObjectsQuery, {\n\t\tstreamId: streamId,\n\t\tobjectId: objectId,\n\t\tselection: selection\n\t})\n}\n\nexport function convertObjects(input: ResponseObjectStream): Project | null {\n\tconst speckleStore = useSpeckleStore()\n\n\tconst objects: ResponseObject[] = input.data.stream.object.elements.objects\n\n\tconst modelObjects = objects.filter(\n\t\t(obj) => obj.data.speckle_type !== 'Speckle.Core.Models.DataChunk'\n\t)\n\tconst projectDetails = speckleStore.getProjectDetails\n\tconst version = speckleStore.getSelectedVersion\n\n\tif (projectDetails && version) {\n\t\tconst geoObjects: GeometryObject[] = []\n\n\t\tmodelObjects.forEach((el) => {\n\t\t\tconst quantity = calculateQuantity(el)\n\n\t\t\tconst name: string = el.data.name ? el.data.name : el.data.speckle_type\n\n\t\t\tconst obj: GeometryObject = {\n\t\t\t\tid: el.id,\n\t\t\t\tname: name,\n\t\t\t\tquantity: quantity,\n\t\t\t\tparameters: el.data,\n\t\t\t\tURI: el.id\n\t\t\t}\n\n\t\t\tgeoObjects.push(obj)\n\t\t})\n\n\t\tconst project: Project = {\n\t\t\tname: projectDetails.stream.name,\n\t\t\tid: projectDetails.stream.id,\n\t\t\tdescription: version.message,\n\t\t\tgeometry: geoObjects\n\t\t}\n\t\treturn project\n\t}\n\treturn null\n}\n\n/**\n * Calculates the quantity of different units in the given ResponseObject.\n *\n * @param obj The ResponseObject containing the data to calculate the quantity from.\n * @returns An object representing the quantity of different units.\n */\nexport function calculateQuantity(obj: ResponseObject) {\n\tconst quantity: Quantity = {\n\t\tm2: 0,\n\t}\n\n\t// Initial parameters we search for, can be added upon should maybe be moved from here to a model file instead\n\t// TODO create a populated interface for this\n\tconst searchObject = [\n\t\t{\n\t\t\tsearchValue: 'area',\n\t\t\tmetric: 'm2',\n\t\t\tmmConversion: 1000000\n\t\t},\n\t\t{\n\t\t\tsearchValue: 'volume',\n\t\t\tmetric: 'm3',\n\t\t\tmmConversion: 1000000000\n\t\t},\n\t\t{\n\t\t\tsearchValue: 'length',\n\t\t\tmetric: 'm',\n\t\t\tmmConversion: 1000\n\t\t}\n\t]\n\n\t// Recursive search for key values in object properties\n\tconst searchNested = (\n\t\tdata: { [key: string]: any },\n\t\tsObj: { searchValue: string; metric: string; mmConversion: number }\n\t) => {\n\t\tfor (const key in data) {\n\t\t\tif (Object.prototype.hasOwnProperty.call(data, key)) {\n\t\t\t\tif (typeof data[key] === 'object' && data[key] !== null) {\n\t\t\t\t\t// If the current property is an object, recursively search\n\t\t\t\t\tsearchNested(data[key], sObj)\n\t\t\t\t} else if (\n\t\t\t\t\ttypeof data[key] === 'string' &&\n\t\t\t\t\tdata[key].toLowerCase() == sObj.searchValue\n\t\t\t\t) {\n\t\t\t\t\t// If the property is a string and matches the search value, set the quantity\n\t\t\t\t\tlet value = data[key]\n\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\tvalue = data['value']\n\t\t\t\t\t}\n\t\t\t\t\tquantity[sObj.metric] = value\n\t\t\t\t} else if (key == sObj.searchValue) {\n\t\t\t\t\t// If the property is a string and matches the search value, set the quantity\n\t\t\t\t\tlet value = data[key]\n\n\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\tvalue = data['value']\n\t\t\t\t\t}\n\t\t\t\t\t//TODO Make more conversions\n\t\t\t\t\tif (data['units'] == 'mm') {\n\t\t\t\t\t\tvalue = value / sObj.mmConversion\n\t\t\t\t\t}\n\n\t\t\t\t\tquantity[sObj.metric] = value\n\t\t\t\t}\n\t\t\t}\t\n\t\t}\n\t}\n\n\t// Start recursive search on the object\n\t// TODO this should probably be optimized, could become slow on large projects or atleast add a loading bar\n\tif (obj.data) {\n\t\tsearchObject.forEach((sObj) => {\n\t\t\tsearchNested(obj.data, sObj)\n\t\t})\n\t}\n\treturn quantity\n}\n","/**\n * @license\n * Copyright 2010-2022 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '140';\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nconst CullFaceNone = 0;\nconst CullFaceBack = 1;\nconst CullFaceFront = 2;\nconst CullFaceFrontBack = 3;\nconst BasicShadowMap = 0;\nconst PCFShadowMap = 1;\nconst PCFSoftShadowMap = 2;\nconst VSMShadowMap = 3;\nconst FrontSide = 0;\nconst BackSide = 1;\nconst DoubleSide = 2;\nconst FlatShading = 1;\nconst SmoothShading = 2;\nconst NoBlending = 0;\nconst NormalBlending = 1;\nconst AdditiveBlending = 2;\nconst SubtractiveBlending = 3;\nconst MultiplyBlending = 4;\nconst CustomBlending = 5;\nconst AddEquation = 100;\nconst SubtractEquation = 101;\nconst ReverseSubtractEquation = 102;\nconst MinEquation = 103;\nconst MaxEquation = 104;\nconst ZeroFactor = 200;\nconst OneFactor = 201;\nconst SrcColorFactor = 202;\nconst OneMinusSrcColorFactor = 203;\nconst SrcAlphaFactor = 204;\nconst OneMinusSrcAlphaFactor = 205;\nconst DstAlphaFactor = 206;\nconst OneMinusDstAlphaFactor = 207;\nconst DstColorFactor = 208;\nconst OneMinusDstColorFactor = 209;\nconst SrcAlphaSaturateFactor = 210;\nconst NeverDepth = 0;\nconst AlwaysDepth = 1;\nconst LessDepth = 2;\nconst LessEqualDepth = 3;\nconst EqualDepth = 4;\nconst GreaterEqualDepth = 5;\nconst GreaterDepth = 6;\nconst NotEqualDepth = 7;\nconst MultiplyOperation = 0;\nconst MixOperation = 1;\nconst AddOperation = 2;\nconst NoToneMapping = 0;\nconst LinearToneMapping = 1;\nconst ReinhardToneMapping = 2;\nconst CineonToneMapping = 3;\nconst ACESFilmicToneMapping = 4;\nconst CustomToneMapping = 5;\n\nconst UVMapping = 300;\nconst CubeReflectionMapping = 301;\nconst CubeRefractionMapping = 302;\nconst EquirectangularReflectionMapping = 303;\nconst EquirectangularRefractionMapping = 304;\nconst CubeUVReflectionMapping = 306;\nconst RepeatWrapping = 1000;\nconst ClampToEdgeWrapping = 1001;\nconst MirroredRepeatWrapping = 1002;\nconst NearestFilter = 1003;\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004;\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005;\nconst LinearFilter = 1006;\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007;\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008;\nconst UnsignedByteType = 1009;\nconst ByteType = 1010;\nconst ShortType = 1011;\nconst UnsignedShortType = 1012;\nconst IntType = 1013;\nconst UnsignedIntType = 1014;\nconst FloatType = 1015;\nconst HalfFloatType = 1016;\nconst UnsignedShort4444Type = 1017;\nconst UnsignedShort5551Type = 1018;\nconst UnsignedInt248Type = 1020;\nconst AlphaFormat = 1021;\nconst RGBFormat = 1022;\nconst RGBAFormat = 1023;\nconst LuminanceFormat = 1024;\nconst LuminanceAlphaFormat = 1025;\nconst DepthFormat = 1026;\nconst DepthStencilFormat = 1027;\nconst RedFormat = 1028;\nconst RedIntegerFormat = 1029;\nconst RGFormat = 1030;\nconst RGIntegerFormat = 1031;\nconst RGBAIntegerFormat = 1033;\n\nconst RGB_S3TC_DXT1_Format = 33776;\nconst RGBA_S3TC_DXT1_Format = 33777;\nconst RGBA_S3TC_DXT3_Format = 33778;\nconst RGBA_S3TC_DXT5_Format = 33779;\nconst RGB_PVRTC_4BPPV1_Format = 35840;\nconst RGB_PVRTC_2BPPV1_Format = 35841;\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\nconst RGB_ETC1_Format = 36196;\nconst RGB_ETC2_Format = 37492;\nconst RGBA_ETC2_EAC_Format = 37496;\nconst RGBA_ASTC_4x4_Format = 37808;\nconst RGBA_ASTC_5x4_Format = 37809;\nconst RGBA_ASTC_5x5_Format = 37810;\nconst RGBA_ASTC_6x5_Format = 37811;\nconst RGBA_ASTC_6x6_Format = 37812;\nconst RGBA_ASTC_8x5_Format = 37813;\nconst RGBA_ASTC_8x6_Format = 37814;\nconst RGBA_ASTC_8x8_Format = 37815;\nconst RGBA_ASTC_10x5_Format = 37816;\nconst RGBA_ASTC_10x6_Format = 37817;\nconst RGBA_ASTC_10x8_Format = 37818;\nconst RGBA_ASTC_10x10_Format = 37819;\nconst RGBA_ASTC_12x10_Format = 37820;\nconst RGBA_ASTC_12x12_Format = 37821;\nconst RGBA_BPTC_Format = 36492;\nconst LoopOnce = 2200;\nconst LoopRepeat = 2201;\nconst LoopPingPong = 2202;\nconst InterpolateDiscrete = 2300;\nconst InterpolateLinear = 2301;\nconst InterpolateSmooth = 2302;\nconst ZeroCurvatureEnding = 2400;\nconst ZeroSlopeEnding = 2401;\nconst WrapAroundEnding = 2402;\nconst NormalAnimationBlendMode = 2500;\nconst AdditiveAnimationBlendMode = 2501;\nconst TrianglesDrawMode = 0;\nconst TriangleStripDrawMode = 1;\nconst TriangleFanDrawMode = 2;\nconst LinearEncoding = 3000;\nconst sRGBEncoding = 3001;\nconst BasicDepthPacking = 3200;\nconst RGBADepthPacking = 3201;\nconst TangentSpaceNormalMap = 0;\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\nconst NoColorSpace = '';\nconst SRGBColorSpace = 'srgb';\nconst LinearSRGBColorSpace = 'srgb-linear';\n\nconst ZeroStencilOp = 0;\nconst KeepStencilOp = 7680;\nconst ReplaceStencilOp = 7681;\nconst IncrementStencilOp = 7682;\nconst DecrementStencilOp = 7683;\nconst IncrementWrapStencilOp = 34055;\nconst DecrementWrapStencilOp = 34056;\nconst InvertStencilOp = 5386;\n\nconst NeverStencilFunc = 512;\nconst LessStencilFunc = 513;\nconst EqualStencilFunc = 514;\nconst LessEqualStencilFunc = 515;\nconst GreaterStencilFunc = 516;\nconst NotEqualStencilFunc = 517;\nconst GreaterEqualStencilFunc = 518;\nconst AlwaysStencilFunc = 519;\n\nconst StaticDrawUsage = 35044;\nconst DynamicDrawUsage = 35048;\nconst StreamDrawUsage = 35040;\nconst StaticReadUsage = 35045;\nconst DynamicReadUsage = 35049;\nconst StreamReadUsage = 35041;\nconst StaticCopyUsage = 35046;\nconst DynamicCopyUsage = 35050;\nconst StreamCopyUsage = 35042;\n\nconst GLSL1 = '100';\nconst GLSL3 = '300 es';\n\nconst _SRGBAFormat = 1035; // fallback for WebGL 1\n\n/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nclass EventDispatcher {\n\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\thasEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t}\n\n\tremoveEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [];\n\nfor ( let i = 0; i < 256; i ++ ) {\n\n\t_lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 );\n\n}\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range to range \nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\nfunction denormalize$1( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, - 1.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, - 1.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nvar MathUtils = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\tgenerateUUID: generateUUID,\n\tclamp: clamp,\n\teuclideanModulo: euclideanModulo,\n\tmapLinear: mapLinear,\n\tinverseLerp: inverseLerp,\n\tlerp: lerp,\n\tdamp: damp,\n\tpingpong: pingpong,\n\tsmoothstep: smoothstep,\n\tsmootherstep: smootherstep,\n\trandInt: randInt,\n\trandFloat: randFloat,\n\trandFloatSpread: randFloatSpread,\n\tseededRandom: seededRandom,\n\tdegToRad: degToRad,\n\tradToDeg: radToDeg,\n\tisPowerOfTwo: isPowerOfTwo,\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\tnormalize: normalize,\n\tdenormalize: denormalize$1\n});\n\nclass Vector2 {\n\n\tconstructor( x = 0, y = 0 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tangle() {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\nVector2.prototype.isVector2 = true;\n\nclass Matrix3 {\n\n\tconstructor() {\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tscale( sx, sy ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;\n\t\tte[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;\n\n\t\treturn this;\n\n\t}\n\n\trotate( theta ) {\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tconst te = this.elements;\n\n\t\tconst a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];\n\t\tconst a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];\n\n\t\tte[ 0 ] = c * a11 + s * a21;\n\t\tte[ 3 ] = c * a12 + s * a22;\n\t\tte[ 6 ] = c * a13 + s * a23;\n\n\t\tte[ 1 ] = - s * a11 + c * a21;\n\t\tte[ 4 ] = - s * a12 + c * a22;\n\t\tte[ 7 ] = - s * a13 + c * a23;\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( tx, ty ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];\n\t\tte[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nMatrix3.prototype.isMatrix3 = true;\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] > 65535 ) return true;\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\n// JavaScript RGB-to-RGB transforms, defined as\n// FN[InputColorSpace][OutputColorSpace] callback functions.\nconst FN = {\n\t[ SRGBColorSpace ]: { [ LinearSRGBColorSpace ]: SRGBToLinear },\n\t[ LinearSRGBColorSpace ]: { [ SRGBColorSpace ]: LinearToSRGB },\n};\n\nconst ColorManagement = {\n\n\tlegacyMode: true,\n\n\tget workingColorSpace() {\n\n\t\treturn LinearSRGBColorSpace;\n\n\t},\n\n\tset workingColorSpace( colorSpace ) {\n\n\t\tconsole.warn( 'THREE.ColorManagement: .workingColorSpace is readonly.' );\n\n\t},\n\n\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\tif ( this.legacyMode || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\treturn color;\n\n\t\t}\n\n\t\tif ( FN[ sourceColorSpace ] && FN[ sourceColorSpace ][ targetColorSpace ] !== undefined ) {\n\n\t\t\tconst fn = FN[ sourceColorSpace ][ targetColorSpace ];\n\n\t\t\tcolor.r = fn( color.r );\n\t\t\tcolor.g = fn( color.g );\n\t\t\tcolor.b = fn( color.b );\n\n\t\t\treturn color;\n\n\t\t}\n\n\t\tthrow new Error( 'Unsupported color space conversion.' );\n\n\t},\n\n\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\treturn this.convert( color, this.workingColorSpace, targetColorSpace );\n\n\t},\n\n\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\treturn this.convert( color, sourceColorSpace, this.workingColorSpace );\n\n\t},\n\n};\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _rgb = { r: 0, g: 0, b: 0 };\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\nfunction toComponents( source, target ) {\n\n\ttarget.r = source.r;\n\ttarget.g = source.g;\n\ttarget.b = source.b;\n\n\treturn target;\n\n}\n\nclass Color {\n\n\tconstructor( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tset( value ) {\n\n\t\tif ( value && value.isColor ) {\n\n\t\t\tthis.copy( value );\n\n\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\tthis.setHex( value );\n\n\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\tthis.setStyle( value );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetRGB( r, g, b, colorSpace = LinearSRGBColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetHSL( h, s, l, colorSpace = LinearSRGBColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^((?:rgb|hsl)a?)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\tconst h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\tconst s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\tconst l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL( h, s, l, colorSpace );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\treturn this;\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb ), colorSpace );\n\n\t\treturn clamp( _rgb.r * 255, 0, 255 ) << 16 ^ clamp( _rgb.g * 255, 0, 255 ) << 8 ^ clamp( _rgb.b * 255, 0, 255 ) << 0;\n\n\t}\n\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( - 6 );\n\n\t}\n\n\tgetHSL( target, colorSpace = LinearSRGBColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb ), colorSpace );\n\n\t\tconst r = _rgb.r, g = _rgb.g, b = _rgb.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\tgetRGB( target, colorSpace = LinearSRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb ), colorSpace );\n\n\t\ttarget.r = _rgb.r;\n\t\ttarget.g = _rgb.g;\n\t\ttarget.b = _rgb.b;\n\n\t\treturn target;\n\n\t}\n\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb ), colorSpace );\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ _rgb.r } ${ _rgb.g } ${ _rgb.b })`;\n\n\t\t}\n\n\t\treturn `rgb(${( _rgb.r * 255 ) | 0},${( _rgb.g * 255 ) | 0},${( _rgb.b * 255 ) | 0})`;\n\n\t}\n\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\t_hslA.h += h; _hslA.s += s; _hslA.l += l;\n\n\t\tthis.setHSL( _hslA.h, _hslA.s, _hslA.l );\n\n\t\treturn this;\n\n\t}\n\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\tif ( attribute.normalized === true ) {\n\n\t\t\t// assuming Uint8Array\n\n\t\t\tthis.r /= 255;\n\t\t\tthis.g /= 255;\n\t\t\tthis.b /= 255;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nColor.NAMES = _colorKeywords;\n\nColor.prototype.isColor = true;\nColor.prototype.r = 1;\nColor.prototype.g = 1;\nColor.prototype.b = 1;\n\nlet _canvas;\n\nclass ImageUtils {\n\n\tstatic getDataURL( image ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement == 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image );\n\n\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t} else {\n\n\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t}\n\n\t}\n\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nclass Source {\n\n\tconstructor( data = null ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.data = data;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.prototype.slice.call( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nSource.prototype.isSource = true;\n\nlet textureId = 0;\n\nclass Texture extends EventDispatcher {\n\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = 1, encoding = LinearEncoding ) {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.source = new Source( image );\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping;\n\n\t\tthis.wrapS = wrapS;\n\t\tthis.wrapT = wrapT;\n\n\t\tthis.magFilter = magFilter;\n\t\tthis.minFilter = minFilter;\n\n\t\tthis.anisotropy = anisotropy;\n\n\t\tthis.format = format;\n\t\tthis.internalFormat = null;\n\t\tthis.type = type;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\t\tthis.center = new Vector2( 0, 0 );\n\t\tthis.rotation = 0;\n\n\t\tthis.matrixAutoUpdate = true;\n\t\tthis.matrix = new Matrix3();\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t\tthis.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not\n\t\tthis.needsPMREMUpdate = false; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures)\n\n\t}\n\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.encoding = source.encoding;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\ttype: this.type,\n\t\t\tencoding: this.encoding,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nTexture.DEFAULT_IMAGE = null;\nTexture.DEFAULT_MAPPING = UVMapping;\n\nTexture.prototype.isTexture = true;\n\nclass Vector4 {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\t\tthis.w = Math.max( minVal, Math.min( maxVal, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\nVector4.prototype.isVector4 = true;\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nclass WebGLRenderTarget extends EventDispatcher {\n\n\tconstructor( width, height, options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.depth = 1;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: 1 };\n\n\t\tthis.texture = new Texture( image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.flipY = false;\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.internalFormat = options.internalFormat !== undefined ? options.internalFormat : null;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : false;\n\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t\tthis.samples = options.samples !== undefined ? options.samples : 0;\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tthis.texture.image.width = width;\n\t\t\tthis.texture.image.height = height;\n\t\t\tthis.texture.image.depth = depth;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.texture = source.texture.clone();\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\t// ensure image object is not shared, see #20328\n\n\t\tconst image = Object.assign( {}, source.texture.image );\n\t\tthis.texture.source = new Source( image );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nWebGLRenderTarget.prototype.isWebGLRenderTarget = true;\n\nclass DataArrayTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nDataArrayTexture.prototype.isDataArrayTexture = true;\n\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width, height, depth ) {\n\n\t\tsuper( width, height );\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nWebGLArrayRenderTarget.prototype.isWebGLArrayRenderTarget = true;\n\nclass Data3DTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in DataTexture3D directly.\n\t\t//\n\t\t//\tconst texture = new THREE.DataTexture3D( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nData3DTexture.prototype.isData3DTexture = true;\n\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width, height, depth ) {\n\n\t\tsuper( width, height );\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nWebGL3DRenderTarget.prototype.isWebGL3DRenderTarget = true;\n\nclass WebGLMultipleRenderTargets extends WebGLRenderTarget {\n\n\tconstructor( width, height, count, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tconst texture = this.texture;\n\n\t\tthis.texture = [];\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.texture[ i ] = texture.clone();\n\t\t\tthis.texture[ i ].isRenderTargetTexture = true;\n\n\t\t}\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.texture.length; i < il; i ++ ) {\n\n\t\t\t\tthis.texture[ i ].image.width = width;\n\t\t\t\tthis.texture[ i ].image.height = height;\n\t\t\t\tthis.texture[ i ].image.depth = depth;\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.dispose();\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.viewport.set( 0, 0, this.width, this.height );\n\t\tthis.scissor.set( 0, 0, this.width, this.height );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.texture.length = 0;\n\n\t\tfor ( let i = 0, il = source.texture.length; i < il; i ++ ) {\n\n\t\t\tthis.texture[ i ] = source.texture[ i ].clone();\n\t\t\tthis.texture[ i ].isRenderTargetTexture = true;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nWebGLMultipleRenderTargets.prototype.isWebGLMultipleRenderTargets = true;\n\nclass Quaternion {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\tstatic slerp( qa, qb, qm, t ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: Static .slerp() has been deprecated. Use qm.slerpQuaternions( qa, qb, t ) instead.' );\n\t\treturn qm.slerpQuaternions( qa, qb, t );\n\n\t}\n\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t === 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t === 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t;\n\t\t\tconst cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tconst sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tconst tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromEuler( euler, update ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update !== false ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < Number.EPSILON ) {\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), - 1, 1 ) ) );\n\n\t}\n\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\tinvert() {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t}\n\n\tconjugate() {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( q, p ) {\n\n\t\tif ( p !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t}\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerp( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tlet cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize();\n\t\t\tthis._onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\trandom() {\n\n\t\t// Derived from http://planning.cs.uiuc.edu/node198.html\n\t\t// Note, this source uses w, x, y, z ordering,\n\t\t// so we swap the order below.\n\n\t\tconst u1 = Math.random();\n\t\tconst sqrt1u1 = Math.sqrt( 1 - u1 );\n\t\tconst sqrtu1 = Math.sqrt( u1 );\n\n\t\tconst u2 = 2 * Math.PI * Math.random();\n\n\t\tconst u3 = 2 * Math.PI * Math.random();\n\n\t\treturn this.set(\n\t\t\tsqrt1u1 * Math.cos( u2 ),\n\t\t\tsqrtu1 * Math.sin( u3 ),\n\t\t\tsqrtu1 * Math.cos( u3 ),\n\t\t\tsqrt1u1 * Math.sin( u2 ),\n\t\t);\n\n\t}\n\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\nQuaternion.prototype.isQuaternion = true;\n\nclass Vector3 {\n\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t}\n\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t}\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyEuler( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// calculate quat * vector\n\n\t\tconst ix = qw * x + qy * z - qz * y;\n\t\tconst iy = qw * y + qz * x - qx * z;\n\t\tconst iz = qw * z + qx * y - qy * x;\n\t\tconst iw = - qx * x - qy * y - qz * z;\n\n\t\t// calculate result * inverse quat\n\n\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\treturn this;\n\n\t}\n\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tcross( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\treturn this.crossVectors( v, w );\n\n\t\t}\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\treflect( normal ) {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\trandomDirection() {\n\n\t\t// Derived from https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst u = ( Math.random() - 0.5 ) * 2;\n\t\tconst t = Math.random() * Math.PI * 2;\n\t\tconst f = Math.sqrt( 1 - u ** 2 );\n\n\t\tthis.x = f * Math.cos( t );\n\t\tthis.y = f * Math.sin( t );\n\t\tthis.z = u;\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nVector3.prototype.isVector3 = true;\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\nclass Box3 {\n\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromArray( array ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\tconst x = array[ i ];\n\t\t\tconst y = array[ i + 1 ];\n\t\t\tconst z = array[ i + 2 ];\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\tconst x = attribute.getX( i );\n\t\t\tconst y = attribute.getY( i );\n\t\t\tconst z = attribute.getZ( i );\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tif ( precise && geometry.attributes != undefined && geometry.attributes.position !== undefined ) {\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tfor ( let i = 0, l = position.count; i < l; i ++ ) {\n\n\t\t\t\t\t_vector$b.fromBufferAttribute( position, i ).applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t}\n\n\t\t\t\t_box$3.copy( geometry.boundingBox );\n\t\t\t\t_box$3.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$3 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$2.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$3.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$2 );\n\t\t_f1.subVectors( _v2$3, _v1$7 );\n\t\t_f2.subVectors( _v0$2, _v2$3 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$3, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$3, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$2, _v1$7, _v2$3, _extents );\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\tconst clampedPoint = _vector$b.copy( point ).clamp( this.min, this.max );\n\n\t\treturn clampedPoint.sub( point ).length();\n\n\t}\n\n\tgetBoundingSphere( target ) {\n\n\t\tthis.getCenter( target.center );\n\n\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\treturn target;\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nBox3.prototype.isBox3 = true;\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$3 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _toFarthestPoint = /*@__PURE__*/ new Vector3();\nconst _toPoint = /*@__PURE__*/ new Vector3();\n\nclass Sphere {\n\n\tconstructor( center = new Vector3(), radius = - 1 ) {\n\n\t\tthis.center = center;\n\t\tthis.radius = radius;\n\n\t}\n\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$2.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = - 1;\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\t// from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L649-L671\n\n\t\t_toPoint.subVectors( point, this.center );\n\n\t\tconst lengthSq = _toPoint.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\t\t\tconst missingRadiusHalf = ( length - this.radius ) * 0.5;\n\n\t\t\t// Nudge this sphere towards the target point. Add half the missing distance to radius,\n\t\t\t// and the other half to position. This gives a tighter enclosure, instead of if\n\t\t\t// the whole missing distance were just added to radius.\n\n\t\t\tthis.center.add( _toPoint.multiplyScalar( missingRadiusHalf / length ) );\n\t\t\tthis.radius += missingRadiusHalf;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunion( sphere ) {\n\n\t\t// from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L759-L769\n\n\t\t// To enclose another sphere into this sphere, we only need to enclose two points:\n\t\t// 1) Enclose the farthest point on the other sphere into this sphere.\n\t\t// 2) Enclose the opposite point of the farthest point into this sphere.\n\n\t\t if ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t _toFarthestPoint.set( 0, 0, 1 ).multiplyScalar( sphere.radius );\n\n\n\t\t} else {\n\n\t\t\t_toFarthestPoint.subVectors( sphere.center, this.center ).normalize().multiplyScalar( sphere.radius );\n\n\t\t}\n\n\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _toFarthestPoint ) );\n\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _toFarthestPoint ) );\n\n\t\treturn this;\n\n\t}\n\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\nclass Ray {\n\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, - 1 ) ) {\n\n\t\tthis.origin = origin;\n\t\tthis.direction = direction;\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn target.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t}\n\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = - 1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass Matrix4 {\n\n\tconstructor() {\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractRotation( m ) {\n\n\t\t// this method does not support reflection matrices\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromEuler( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m, n ) {\n\n\t\tif ( n !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t}\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\tmakeTranslation( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, x,\n\t\t\t0, 1, 0, y,\n\t\t\t0, 0, 1, z,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1$2.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$2.elements[ 0 ] *= invSX;\n\t\t_m1$2.elements[ 1 ] *= invSX;\n\t\t_m1$2.elements[ 2 ] *= invSX;\n\n\t\t_m1$2.elements[ 4 ] *= invSY;\n\t\t_m1$2.elements[ 5 ] *= invSY;\n\t\t_m1$2.elements[ 6 ] *= invSY;\n\n\t\t_m1$2.elements[ 8 ] *= invSZ;\n\t\t_m1$2.elements[ 9 ] *= invSZ;\n\t\t_m1$2.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$2 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tmakePerspective( left, right, top, bottom, near, far ) {\n\n\t\tif ( far === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t}\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\t\tconst c = - ( far + near ) / ( far - near );\n\t\tconst d = - 2 * far * near / ( far - near );\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\tmakeOrthographic( left, right, top, bottom, near, far ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\t\tconst z = ( far + near ) * p;\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nMatrix4.prototype.isMatrix4 = true;\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\nclass Euler {\n\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DefaultOrder ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$1.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$1, order, update );\n\n\t}\n\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\treorder( newOrder ) {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\nEuler.prototype.isEuler = true;\n\nEuler.DefaultOrder = 'XYZ';\nEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\nclass Layers {\n\n\tconstructor() {\n\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\tset( channel ) {\n\n\t\tthis.mask = ( 1 << channel | 0 ) >>> 0;\n\n\t}\n\n\tenable( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t}\n\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\ttoggle( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t}\n\n\tdisable( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t}\n\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\tisEnabled( channel ) {\n\n\t\treturn ( this.mask & ( 1 << channel | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\nconst _addedEvent = { type: 'added' };\nconst _removedEvent = { type: 'removed' };\n\nclass Object3D extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DefaultUp.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.animations = [];\n\n\t\tthis.userData = {};\n\n\t}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\tlocalToWorld( vector ) {\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\tworldToLocal( vector ) {\n\n\t\treturn vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\tobject.parent.remove( object );\n\n\t\t\t}\n\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclear() {\n\n\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\tconst object = this.children[ i ];\n\n\t\t\tobject.parent = null;\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\tthis.children.length = 0;\n\n\t\treturn this;\n\n\n\t}\n\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tthis.add( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\treturn this;\n\n\t}\n\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\traycast( /* raycaster, intersects */ ) {}\n\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// update children\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.parent === null ) {\n\n\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t} else {\n\n\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t}\n\n\t\t// update children\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nObject3D.DefaultUp = new Vector3( 0, 1, 0 );\nObject3D.DefaultMatrixAutoUpdate = true;\n\nObject3D.prototype.isObject3D = true;\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$1 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nclass Triangle {\n\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t}\n\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\t// arbitrary location outside of triangle?\n\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\treturn target.set( - 2, - 1, - 1 );\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\tthis.getBarycoord( point, a, b, c, _v3$1 );\n\n\t\treturn ( _v3$1.x >= 0 ) && ( _v3$1.y >= 0 ) && ( ( _v3$1.x + _v3$1.y ) <= 1 );\n\n\t}\n\n\tstatic getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) {\n\n\t\tthis.getBarycoord( point, p1, p2, p3, _v3$1 );\n\n\t\ttarget.set( 0, 0 );\n\t\ttarget.addScaledVector( uv1, _v3$1.x );\n\t\ttarget.addScaledVector( uv2, _v3$1.y );\n\t\ttarget.addScaledVector( uv3, _v3$1.z );\n\n\t\treturn target;\n\n\t}\n\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\tgetArea() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\tgetUV( point, uv1, uv2, uv3, target ) {\n\n\t\treturn Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, target );\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nlet materialId = 0;\n\nclass Material extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.vertexColors = false;\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.stencilWriteMask = 0xff;\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\t\tthis.stencilRef = 0;\n\t\tthis.stencilFuncMask = 0xff;\n\t\tthis.stencilFail = KeepStencilOp;\n\t\tthis.stencilZFail = KeepStencilOp;\n\t\tthis.stencilZPass = KeepStencilOp;\n\t\tthis.stencilWrite = false;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.shadowSide = null;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.dithering = false;\n\n\t\tthis.alphaToCoverage = false;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.visible = true;\n\n\t\tthis.toneMapped = true;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\tonBuild( /* shaderobject, renderer */ ) {}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Material: \\'' + key + '\\' parameter is undefined.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// for backward compatibility if shading is set in the constructor\n\t\t\tif ( key === 'shading' ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\t\tthis.flatShading = ( newValue === FlatShading ) ? true : false;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': \\'' + key + '\\' is not a property of this material.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\tdata.depthFunc = this.depthFunc;\n\t\tdata.depthTest = this.depthTest;\n\t\tdata.depthWrite = this.depthWrite;\n\t\tdata.colorWrite = this.colorWrite;\n\n\t\tdata.stencilWrite = this.stencilWrite;\n\t\tdata.stencilWriteMask = this.stencilWriteMask;\n\t\tdata.stencilFunc = this.stencilFunc;\n\t\tdata.stencilRef = this.stencilRef;\n\t\tdata.stencilFuncMask = this.stencilFuncMask;\n\t\tdata.stencilFail = this.stencilFail;\n\t\tdata.stencilZFail = this.stencilZFail;\n\t\tdata.stencilZPass = this.stencilZPass;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = this.alphaToCoverage;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\n\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = this.flatShading;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\nMaterial.prototype.isMaterial = true;\n\nMaterial.fromType = function ( /*type*/ ) {\n\n\t// TODO: Behavior added in Materials.js\n\n\treturn null;\n\n};\n\nclass MeshBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nclass BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.name = '';\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized === true;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\tcopyColorsArray( colors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\tlet color = colors[ i ];\n\n\t\t\tif ( color === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\tcolor = new Color();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = color.r;\n\t\t\tarray[ offset ++ ] = color.g;\n\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector2sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector2();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector3sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector3();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector4sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector4();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\treturn this.array[ index * this.itemSize ];\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.prototype.slice.call( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\t\tif ( this.updateRange.offset !== 0 || this.updateRange.count !== - 1 ) data.updateRange = this.updateRange;\n\n\t\treturn data;\n\n\t}\n\n}\n\nBufferAttribute.prototype.isBufferAttribute = true;\n\n//\n\nclass Int8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nFloat16BufferAttribute.prototype.isFloat16BufferAttribute = true;\n\nclass Float32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float64BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float64Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$1 = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\nclass BufferGeometry extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: _id$1 ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\t\tthis.morphTargetsRelative = false;\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\tthis.userData = {};\n\n\t}\n\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tconst position = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$1.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$1.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$1.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$1.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$1.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$1.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$1.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$1.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$1.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$1.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$1.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$1.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$1.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst indices = index.array;\n\t\tconst positions = attributes.position.array;\n\t\tconst normals = attributes.normal.array;\n\t\tconst uvs = attributes.uv.array;\n\n\t\tconst nVertices = positions.length / 3;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * nVertices ), 4 ) );\n\n\t\t}\n\n\t\tconst tangents = this.getAttribute( 'tangent' ).array;\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < nVertices; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromArray( positions, a * 3 );\n\t\t\tvB.fromArray( positions, b * 3 );\n\t\t\tvC.fromArray( positions, c * 3 );\n\n\t\t\tuvA.fromArray( uvs, a * 2 );\n\t\t\tuvB.fromArray( uvs, b * 2 );\n\t\t\tuvC.fromArray( uvs, c * 2 );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: indices.length\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindices[ j + 0 ],\n\t\t\t\t\tindices[ j + 1 ],\n\t\t\t\t\tindices[ j + 2 ]\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromArray( normals, v * 3 );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? - 1.0 : 1.0;\n\n\t\t\ttangents[ v * 4 ] = tmp.x;\n\t\t\ttangents[ v * 4 + 1 ] = tmp.y;\n\t\t\ttangents[ v * 4 + 2 ] = tmp.z;\n\t\t\ttangents[ v * 4 + 3 ] = w;\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( indices[ j + 0 ] );\n\t\t\t\thandleVertex( indices[ j + 1 ] );\n\t\t\t\thandleVertex( indices[ j + 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tmerge( geometry, offset ) {\n\n\t\tif ( ! ( geometry && geometry.isBufferGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( offset === undefined ) {\n\n\t\t\toffset = 0;\n\n\t\t\tconsole.warn(\n\t\t\t\t'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '\n\t\t\t\t+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'\n\t\t\t);\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\tconst attribute1 = attributes[ key ];\n\t\t\tconst attributeArray1 = attribute1.array;\n\n\t\t\tconst attribute2 = geometry.attributes[ key ];\n\t\t\tconst attributeArray2 = attribute2.array;\n\n\t\t\tconst attributeOffset = attribute2.itemSize * offset;\n\t\t\tconst length = Math.min( attributeArray2.length, attributeArray1.length - attributeOffset );\n\n\t\t\tfor ( let i = 0, j = attributeOffset; i < length; i ++, j ++ ) {\n\n\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\t return new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone( data ) );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\t// geometry generator parameters\n\n\t\tif ( source.parameters !== undefined ) this.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nBufferGeometry.prototype.isBufferGeometry = true;\n\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _tempB = /*@__PURE__*/ new Vector3();\nconst _tempC = /*@__PURE__*/ new Vector3();\n\nconst _morphA = /*@__PURE__*/ new Vector3();\nconst _morphB = /*@__PURE__*/ new Vector3();\nconst _morphC = /*@__PURE__*/ new Vector3();\n\nconst _uvA$1 = /*@__PURE__*/ new Vector2();\nconst _uvB$1 = /*@__PURE__*/ new Vector2();\nconst _uvC$1 = /*@__PURE__*/ new Vector2();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\nclass Mesh extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$3.copy( geometry.boundingSphere );\n\t\t_sphere$3.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$3 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// Check boundingBox before continuing\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\tlet intersection;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\t\t\tconst uv = geometry.attributes.uv;\n\t\t\tconst uv2 = geometry.attributes.uv2;\n\t\t\tconst groups = geometry.groups;\n\t\t\tconst drawRange = geometry.drawRange;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\t// indexed buffer geometry\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\tconst a = i;\n\t\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t}\n\n}\n\nMesh.prototype.isMesh = true;\n\nfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkBufferGeometryIntersection( object, material, raycaster, ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ) {\n\n\t_vA$1.fromBufferAttribute( position, a );\n\t_vB$1.fromBufferAttribute( position, b );\n\t_vC$1.fromBufferAttribute( position, c );\n\n\tconst morphInfluences = object.morphTargetInfluences;\n\n\tif ( morphPosition && morphInfluences ) {\n\n\t\t_morphA.set( 0, 0, 0 );\n\t\t_morphB.set( 0, 0, 0 );\n\t\t_morphC.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\tconst influence = morphInfluences[ i ];\n\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t_tempA.fromBufferAttribute( morphAttribute, a );\n\t\t\t_tempB.fromBufferAttribute( morphAttribute, b );\n\t\t\t_tempC.fromBufferAttribute( morphAttribute, c );\n\n\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t} else {\n\n\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA$1 ), influence );\n\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB$1 ), influence );\n\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC$1 ), influence );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_vA$1.add( _morphA );\n\t\t_vB$1.add( _morphB );\n\t\t_vC$1.add( _morphC );\n\n\t}\n\n\tif ( object.isSkinnedMesh ) {\n\n\t\tobject.boneTransform( a, _vA$1 );\n\t\tobject.boneTransform( b, _vB$1 );\n\t\tobject.boneTransform( c, _vC$1 );\n\n\t}\n\n\tconst intersection = checkIntersection( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA$1.fromBufferAttribute( uv, a );\n\t\t\t_uvB$1.fromBufferAttribute( uv, b );\n\t\t\t_uvC$1.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = Triangle.getUV( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv2 ) {\n\n\t\t\t_uvA$1.fromBufferAttribute( uv2, a );\n\t\t\t_uvB$1.fromBufferAttribute( uv2, b );\n\t\t\t_uvC$1.fromBufferAttribute( uv2, c );\n\n\t\t\tintersection.uv2 = Triangle.getUV( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() );\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\n\t}\n\n\treturn intersection;\n\n}\n\nclass BoxGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Uniform Utilities\n */\n\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\nclass ShaderMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = default_vertex;\n\t\tthis.fragmentShader = default_fragment;\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\nShaderMaterial.prototype.isShaderMaterial = true;\n\nclass Camera extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\tthis.projectionMatrix = new Matrix4();\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\treturn this;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nCamera.prototype.isCamera = true;\n\nclass PerspectiveCamera extends Camera {\n\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = - 0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nPerspectiveCamera.prototype.isPerspectiveCamera = true;\n\nconst fov = 90, aspect = 1;\n\nclass CubeCamera extends Object3D {\n\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget !== true ) {\n\n\t\t\tconsole.error( 'THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.renderTarget = renderTarget;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst renderTarget = this.renderTarget;\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst currentToneMapping = renderer.toneMapping;\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0 );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1 );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2 );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3 );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4 );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5 );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\trenderer.toneMapping = currentToneMapping;\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\nclass CubeTexture extends Texture {\n\n\tconstructor( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\nCubeTexture.prototype.isCubeTexture = true;\n\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( size, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\tthis.texture = new CubeTexture( images, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t}\n\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.encoding = texture.encoding;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\tclear( renderer, color, depth, stencil ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\nWebGLCubeRenderTarget.prototype.isWebGLCubeRenderTarget = true;\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\nclass Plane {\n\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\t// normal is assumed to be normalized\n\n\t\tthis.normal = normal;\n\t\tthis.constant = constant;\n\n\t}\n\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );\n\n\t}\n\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t}\n\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nPlane.prototype.isPlane = true;\n\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\nclass Frustum {\n\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromProjectionMatrix( m ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\tintersectsObject( object ) {\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$2.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$2 );\n\n\t}\n\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$2.center.set( 0, 0, 0 );\n\t\t_sphere$2.radius = 0.7071067811865476;\n\t\t_sphere$2.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$2 );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$7.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$7.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$7.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$7 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = 5126;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\ttype = 5131;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttype = 5123;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = 5122;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = 5125;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = 5124;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = 5120;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = 5121;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = 5121;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRange = attribute.updateRange;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRange.count === - 1 ) {\n\n\t\t\t// Not using update ranges\n\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, updateRange.offset, updateRange.count );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );\n\n\t\t\t}\n\n\t\t\tupdateRange.count = - 1; // reset range\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nclass PlaneGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"vec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( V * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\\n\\t\\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\tplane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\tif ( clipped ) discard;\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract( sin( sn ) * c );\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal;\\n#endif\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nmat3 transposeMat3( const in mat3 m ) {\\n\\tmat3 tmp;\\n\\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\\n\\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\\n\\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\\n\\treturn tmp;\\n}\\nfloat linearToRelativeLuminance( const in vec3 color ) {\\n\\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\\n\\treturn dot( weights, color.rgb );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\tvec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define r0 1.0\\n\\t#define v0 0.339\\n\\t#define m0 - 2.0\\n\\t#define r1 0.8\\n\\t#define v1 0.276\\n\\t#define m1 - 1.0\\n\\t#define r4 0.4\\n\\t#define v4 0.046\\n\\t#define m4 2.0\\n\\t#define r5 0.305\\n\\t#define v5 0.016\\n\\t#define m5 3.0\\n\\t#define r6 0.21\\n\\t#define v6 0.0038\\n\\t#define m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= r1 ) {\\n\\t\\t\\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\\n\\t\\t} else if ( roughness >= r4 ) {\\n\\t\\t\\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\\n\\t\\t} else if ( roughness >= r5 ) {\\n\\t\\t\\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\\n\\t\\t} else if ( roughness >= r6 ) {\\n\\t\\t\\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_INSTANCING\\n\\tmat3 m = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\\n\\ttransformedNormal = m * transformedNormal;\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar encodings_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar encodings_pars_fragment = \"vec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\t\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t#endif\\n}\";\n\nvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\treflectedLight.indirectDiffuse += lightMapIrradiance;\\n#endif\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\nvIndirectFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n\\tvIndirectBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry.normal );\\n#ifdef DOUBLE_SIDED\\n\\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\\n\\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry.normal );\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointLightInfo( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotLightInfo( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalLightInfo( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry.normal );\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\nuniform vec3 lightProbe[ 9 ];\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\t}\\n\\t\\treturn distanceFalloff;\\n\\t#else\\n\\t\\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\\n\\t\\t\\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n\\t\\t}\\n\\t\\treturn 1.0;\\n\\t#endif\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#if defined( USE_ENVMAP )\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#if defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#if defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\\n#define Material_LightProbeLOD( material )\\t(0)\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\t#ifdef SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULARINTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULARCOLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vUv ).rgb;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEENCOLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\\n\\t#ifdef USE_SHEENROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\\n\\t#endif\\n#endif\";\n\nvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat roughness;\\n\\tvec3 specularColor;\\n\\tfloat specularF90;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n};\\nvec3 clearcoatSpecular = vec3( 0.0 );\\nvec3 sheenSpecular = vec3( 0.0 );\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\\n\\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\\n\\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\\n\\treturn saturate( DG * RECIPROCAL_PI );\\n}\\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\\n\\treturn fab;\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\tvec3 FssEss = specularColor * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometry.normal;\\n\\t\\tvec3 viewDir = geometry.viewDir;\\n\\t\\tvec3 position = geometry.position;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.roughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\\n\\t#endif\\n\\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\\n\\t#endif\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\\n\\treflectedLight.indirectSpecular += radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\n#ifdef USE_CLEARCOAT\\n\\tgeometry.clearcoatNormal = clearcoatNormal;\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometry.normal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t\\tvarying float vIsPerspective;\\n\\t#else\\n\\t\\tuniform float logDepthBufFC;\\n\\t#endif\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n\\t#else\\n\\t\\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\\n\\t\\t\\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\\n\\t\\t\\tgl_Position.z *= gl_Position.w;\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\tuniform mat3 uvTransform;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t\\t}\\n\\t#else\\n\\t\\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\\n\\t\\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\\n\\t\\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\\n\\t\\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\\n\\t#endif\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\tuniform float morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t\\tuniform sampler2DArray morphTargetsTexture;\\n\\t\\tuniform ivec2 morphTargetsTextureSize;\\n\\t\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t\\t}\\n\\t#else\\n\\t\\t#ifndef USE_MORPHNORMALS\\n\\t\\t\\tuniform float morphTargetInfluences[ 8 ];\\n\\t\\t#else\\n\\t\\t\\tuniform float morphTargetInfluences[ 4 ];\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t\\t}\\n\\t#else\\n\\t\\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\\n\\t\\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\\n\\t\\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\\n\\t\\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\\n\\t\\t#ifndef USE_MORPHNORMALS\\n\\t\\t\\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\\n\\t\\t\\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\\n\\t\\t\\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\\n\\t\\t\\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\t#ifdef USE_TANGENT\\n\\t\\tvec3 tangent = normalize( vTangent );\\n\\t\\tvec3 bitangent = normalize( vBitangent );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\ttangent = tangent * faceDirection;\\n\\t\\t\\tbitangent = bitangent * faceDirection;\\n\\t\\t#endif\\n\\t\\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tmat3 vTBN = mat3( tangent, bitangent, normal );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\nvec3 geometryNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef OBJECTSPACE_NORMALMAP\\n\\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( TANGENTSPACE_NORMALMAP )\\n\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\t#ifdef USE_TANGENT\\n\\t\\tnormal = normalize( vTBN * mapN );\\n\\t#else\\n\\t\\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\\n\\t#endif\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef OBJECTSPACE_NORMALMAP\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\\n\\t\\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\\n\\t\\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tvec3 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\\n\\t\\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = geometryNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\t#ifdef USE_TANGENT\\n\\t\\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\\n\\t#else\\n\\t\\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\\n\\t#endif\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\";\n\nvar output_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= transmissionAlpha + 0.1;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nvec4 pack2HalfToRGBA( vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\tfloat hard_shadow = step( compare , distribution.x );\\n\\t\\tif (hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x ;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn shadow;\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\tdp += shadowBias;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\tvec4 shadowWorldPosition;\\n\\t#endif\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tuniform int boneTextureSize;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tfloat j = i * 4.0;\\n\\t\\tfloat x = mod( j, float( boneTextureSize ) );\\n\\t\\tfloat y = floor( j / float( boneTextureSize ) );\\n\\t\\tfloat dx = 1.0 / float( boneTextureSize );\\n\\t\\tfloat dy = 1.0 / float( boneTextureSize );\\n\\t\\ty = dy * ( y + 0.5 );\\n\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\treturn bone;\\n\\t}\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3( 1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108, 1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605, 1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tfloat transmissionAlpha = 1.0;\\n\\tfloat transmissionFactor = transmission;\\n\\tfloat thicknessFactor = thickness;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\ttransmissionFactor *= texture2D( transmissionMap, vUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmission = getIBLVolumeRefraction(\\n\\t\\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\\n\\t\\tattenuationColor, attenuationDistance );\\n\\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );\\n\\ttransmissionAlpha = mix( transmissionAlpha, transmission.a, transmissionFactor );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\t#ifdef texture2DLodEXT\\n\\t\\t\\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( attenuationDistance == 0.0 ) {\\n\\t\\t\\treturn radiance;\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance * radiance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\trefractionCoords += 1.0;\\n\\t\\trefractionCoords /= 2.0;\\n\\t\\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\\n\\tvarying vec2 vUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#ifdef USE_UV\\n\\t#ifdef UVS_VERTEX_ONLY\\n\\t\\tvec2 vUv;\\n\\t#else\\n\\t\\tvarying vec2 vUv;\\n\\t#endif\\n\\tuniform mat3 uvTransform;\\n#endif\";\n\nvar uv_vertex = \"#ifdef USE_UV\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n#endif\";\n\nvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\nvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n\\tuniform mat3 uv2Transform;\\n#endif\";\n\nvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$g = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$g = \"uniform sampler2D t2D;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tgl_FragColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tgl_FragColor = vec4( mix( pow( gl_FragColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), gl_FragColor.rgb * 0.0773993808, vec3( lessThanEqual( gl_FragColor.rgb, vec3( 0.04045 ) ) ) ), gl_FragColor.w );\\n\\t#endif\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"#include \\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 vReflect = vWorldDirection;\\n\\t#include \\n\\tgl_FragColor = envColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$e = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main () {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$b = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$a = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$a = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vLightFront;\\nvarying vec3 vIndirectFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n\\tvarying vec3 vIndirectBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$9 = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\nvarying vec3 vIndirectFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n\\tvarying vec3 vIndirectBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vIndirectFront;\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= BRDF_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$6 = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULARINTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULARCOLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEENCOLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEENROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include \\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\t\\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$2 = \"#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\tvec2 scale;\\n\\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\\n\\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst ShaderChunk = {\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tencodings_fragment: encodings_fragment,\n\tencodings_pars_fragment: encodings_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_fragment: lightmap_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_vertex: lights_lambert_vertex,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\toutput_fragment: output_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tuv2_pars_fragment: uv2_pars_fragment,\n\tuv2_pars_vertex: uv2_pars_vertex,\n\tuv2_vertex: uv2_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$g,\n\tbackground_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistanceRGBA_vert: vertex$d,\n\tdistanceRGBA_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tuvTransform: { value: new Matrix3() },\n\t\tuv2Transform: { value: new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tflipEnvMap: { value: - 1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 } // basic, lambert, phong\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotShadowMap: { value: [] },\n\t\tspotShadowMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\t/* -------------------------------------------------------------------------\n\t//\tCube map shader\n\t ------------------------------------------------------------------------- */\n\n\tcube: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.envmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatNormalScale: { value: new Vector2( 1, 1 ) },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionSamplerSize: { value: new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: new Color( 0x000000 ) },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularColor: { value: new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nfunction WebGLBackground( renderer, cubemaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction render( renderList, scene ) {\n\n\t\tlet forceClear = false;\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tbackground = cubemaps.get( background );\n\n\t\t}\n\n\t\t// Ignore background in AR\n\t\t// TODO: Reconsider this.\n\n\t\tconst xr = renderer.xr;\n\t\tconst session = xr.getSession && xr.getSession();\n\n\t\tif ( session && session.environmentBlendMode === 'additive' ) {\n\n\t\t\tbackground = null;\n\n\t\t}\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.cube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tstate.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, extensions, attributes, capabilities ) {\n\n\tconst maxVertexAttributes = gl.getParameter( 34921 );\n\n\tconst extension = capabilities.isWebGL2 ? null : extensions.get( 'OES_vertex_array_object' );\n\tconst vaoAvailable = capabilities.isWebGL2 || extension !== null;\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tif ( vaoAvailable ) {\n\n\t\t\tconst state = getBindingState( geometry, program, material );\n\n\t\t\tif ( currentState !== state ) {\n\n\t\t\t\tcurrentState = state;\n\t\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t\t}\n\n\t\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\t} else {\n\n\t\t\tconst wireframe = ( material.wireframe === true );\n\n\t\t\tif ( currentState.geometry !== geometry.id ||\n\t\t\t\tcurrentState.program !== program.id ||\n\t\t\t\tcurrentState.wireframe !== wireframe ) {\n\n\t\t\t\tcurrentState.geometry = geometry.id;\n\t\t\t\tcurrentState.program = program.id;\n\t\t\t\tcurrentState.wireframe = wireframe;\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, 34963 );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( 34963, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.createVertexArray();\n\n\t\treturn extension.createVertexArrayOES();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.bindVertexArray( vao );\n\n\t\treturn extension.bindVertexArrayOES( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.deleteVertexArray( vao );\n\n\t\treturn extension.deleteVertexArrayOES( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tconst extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset ) {\n\n\t\tif ( capabilities.isWebGL2 === true && ( type === 5124 || type === 5125 ) ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tif ( capabilities.isWebGL2 === false && ( object.isInstancedMesh || geometry.isInstancedBufferGeometry ) ) {\n\n\t\t\tif ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) return;\n\n\t\t}\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawArraysInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawArraysInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( 35633, 36338 ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( 35632, 36338 ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( 35633, 36337 ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( 35632, 36337 ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tconst isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext ) ||\n\t\t( typeof WebGL2ComputeRenderingContext !== 'undefined' && gl instanceof WebGL2ComputeRenderingContext );\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst drawBuffers = isWebGL2 || extensions.has( 'WEBGL_draw_buffers' );\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tconst maxTextures = gl.getParameter( 34930 );\n\tconst maxVertexTextures = gl.getParameter( 35660 );\n\tconst maxTextureSize = gl.getParameter( 3379 );\n\tconst maxCubemapSize = gl.getParameter( 34076 );\n\n\tconst maxAttributes = gl.getParameter( 34921 );\n\tconst maxVertexUniforms = gl.getParameter( 36347 );\n\tconst maxVaryings = gl.getParameter( 36348 );\n\tconst maxFragmentUniforms = gl.getParameter( 36349 );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\tconst floatFragmentTextures = isWebGL2 || extensions.has( 'OES_texture_float' );\n\tconst floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\tconst maxSamples = isWebGL2 ? gl.getParameter( 36183 ) : 0;\n\n\treturn {\n\n\t\tisWebGL2: isWebGL2,\n\n\t\tdrawBuffers: drawBuffers,\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\tfloatVertexTextures: floatVertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping, camera ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\t\tresetGlobalState();\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture && texture.isRenderTargetTexture === false ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height / 2 );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nclass OrthographicCamera extends Camera {\n\n\tconstructor( left = - 1, right = 1, top = 1, bottom = - 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\nOrthographicCamera.prototype.isOrthographicCamera = true;\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips. These are\n// chosen to approximate a Trowbridge-Reitz distribution function times the\n// geometric shadowing function. These sigma values squared must match the\n// variance #defines in cube_uv_reflection_fragment.glsl.js.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\n\n// Golden Ratio\nconst PHI = ( 1 + Math.sqrt( 5 ) ) / 2;\nconst INV_PHI = 1 / PHI;\n\n// Vertices of a dodecahedron (except the opposites, which represent the\n// same axis), used as axis directions evenly spread on a sphere.\nconst _axisDirections = [\n\t/*@__PURE__*/ new Vector3( 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),\n\t/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),\n\t/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ];\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * Paper: Fast, Accurate Image-Based Lighting\n * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view\n*/\n\nclass PMREMGenerator {\n\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._lodPlanes = [];\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\n\t\tthis._blurMaterial = null;\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._compileMaterial( this._blurMaterial );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety (the cubeCamera\n\t * is placed at the origin).\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100 ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\n\t\tthis._setSize( 256 );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodPlanes.length; i ++ ) {\n\n\t\t\tthis._lodPlanes[ i ].dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget );\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tencoding: LinearEncoding,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { sizeLods: this._sizeLods, lodPlanes: this._lodPlanes, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst tmpMesh = new Mesh( this._lodPlanes[ 0 ], material );\n\t\tthis._renderer.compile( tmpMesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, - 1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\tconst backgroundMaterial = new MeshBasicMaterial( {\n\t\t\tname: 'PMREM.Background',\n\t\t\tside: BackSide,\n\t\t\tdepthWrite: false,\n\t\t\tdepthTest: false,\n\t\t} );\n\n\t\tconst backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial );\n\n\t\tlet useSolidColor = false;\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( forwardSign[ i ], 0, 0 );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.lookAt( 0, forwardSign[ i ], 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( 0, 0, forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\tbackgroundBox.geometry.dispose();\n\t\tbackgroundBox.material.dispose();\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\t\tconst mesh = new Mesh( this._lodPlanes[ 0 ], material );\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tfor ( let i = 1; i < this._lodPlanes.length; i ++ ) {\n\n\t\t\tconst sigma = Math.sqrt( this._sigmas[ i ] * this._sigmas[ i ] - this._sigmas[ i - 1 ] * this._sigmas[ i - 1 ] );\n\n\t\t\tconst poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];\n\n\t\t\tthis._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\tconsole.error(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = new Mesh( this._lodPlanes[ lodOut ], blurMaterial );\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\tconsole.warn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst lodPlanes = [];\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : - 1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodPlanes.push( planes );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodPlanes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: - 1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.needsPMREMUpdate === true ) {\n\n\t\t\t\t\ttexture.needsPMREMUpdate = false;\n\n\t\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( cubeUVmaps.has( texture ) ) {\n\n\t\t\t\t\t\treturn cubeUVmaps.get( texture ).texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\tconst renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tlet extension;\n\n\t\tswitch ( name ) {\n\n\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\textension = gl.getExtension( name );\n\n\t\t}\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function ( capabilities ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\n\t\t\t} else {\n\n\t\t\t\tgetExtension( 'WEBGL_depth_texture' );\n\t\t\t\tgetExtension( 'OES_texture_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float_linear' );\n\t\t\t\tgetExtension( 'OES_standard_derivatives' );\n\t\t\t\tgetExtension( 'OES_element_index_uint' );\n\t\t\t\tgetExtension( 'OES_vertex_array_object' );\n\t\t\t\tgetExtension( 'ANGLE_instanced_arrays' );\n\n\t\t\t}\n\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], 34962 );\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = morphAttributes[ name ];\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.update( array[ i ], 34962 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawElementsInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawElementsInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase 4:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase 0:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.frame ++;\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction numericalSort( a, b ) {\n\n\treturn a[ 0 ] - b[ 0 ];\n\n}\n\nfunction absNumericalSort( a, b ) {\n\n\treturn Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );\n\n}\n\nfunction denormalize( morph, attribute ) {\n\n\tlet denominator = 1;\n\tconst array = attribute.isInterleavedBufferAttribute ? attribute.data.array : attribute.array;\n\n\tif ( array instanceof Int8Array ) denominator = 127;\n\telse if ( array instanceof Int16Array ) denominator = 32767;\n\telse if ( array instanceof Int32Array ) denominator = 2147483647;\n\telse console.error( 'THREE.WebGLMorphtargets: Unsupported morph attribute data type: ', array );\n\n\tmorph.divideScalar( denominator );\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst influencesList = {};\n\tconst morphInfluences = new Float32Array( 8 );\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tconst workInfluences = [];\n\n\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\tworkInfluences[ i ] = [ i, 0 ];\n\n\t}\n\n\tfunction update( object, geometry, material, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tif ( capabilities.isWebGL2 === true ) {\n\n\t\t\t// instead of using attributes, the WebGL 2 code path encodes morph targets\n\t\t\t// into an array of data textures. Each layer represents a single morph target.\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tlet entry = morphTextures.get( geometry );\n\n\t\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\t\tlet vertexDataCount = 0;\n\n\t\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\t\tlet height = 1;\n\n\t\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t\t}\n\n\t\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\t\ttexture.type = FloatType;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t// fill buffer\n\n\t\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\t\tif ( morphTarget.normalized === true ) denormalize( morph, morphTarget );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\t\tif ( morphNormal.normalized === true ) denormalize( morph, morphNormal );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\t\tif ( morphColor.normalized === true ) denormalize( morph, morphColor );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tentry = {\n\t\t\t\t\tcount: morphTargetsCount,\n\t\t\t\t\ttexture: texture,\n\t\t\t\t\tsize: new Vector2( width, height )\n\t\t\t\t};\n\n\t\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\t\tfunction disposeTexture() {\n\n\t\t\t\t\ttexture.dispose();\n\n\t\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\n\t\t} else {\n\n\t\t\t// When object doesn't have morph target influences defined, we treat it as a 0-length array\n\t\t\t// This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences\n\n\t\t\tconst length = objectInfluences === undefined ? 0 : objectInfluences.length;\n\n\t\t\tlet influences = influencesList[ geometry.id ];\n\n\t\t\tif ( influences === undefined || influences.length !== length ) {\n\n\t\t\t\t// initialise list\n\n\t\t\t\tinfluences = [];\n\n\t\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tinfluences[ i ] = [ i, 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tinfluencesList[ geometry.id ] = influences;\n\n\t\t\t}\n\n\t\t\t// Collect influences\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tconst influence = influences[ i ];\n\n\t\t\t\tinfluence[ 0 ] = i;\n\t\t\t\tinfluence[ 1 ] = objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tinfluences.sort( absNumericalSort );\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tif ( i < length && influences[ i ][ 1 ] ) {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = influences[ i ][ 0 ];\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = influences[ i ][ 1 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER;\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tworkInfluences.sort( numericalSort );\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position;\n\t\t\tconst morphNormals = geometry.morphAttributes.normal;\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tconst influence = workInfluences[ i ];\n\t\t\t\tconst index = influence[ 0 ];\n\t\t\t\tconst value = influence[ 1 ];\n\n\t\t\t\tif ( index !== Number.MAX_SAFE_INTEGER && value ) {\n\n\t\t\t\t\tif ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = value;\n\t\t\t\t\tmorphInfluencesSum += value;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphTarget' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// GLSL shader uses formula baseinfluence * base + sum(target * influence)\n\t\t\t// This allows us to switch between absolute morphs and relative morphs without changing shader code\n\t\t\t// When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence)\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tattributes.update( object.instanceMatrix, 34962 );\n\n\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\tattributes.update( object.instanceColor, 34962 );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\nconst emptyTexture = new Texture();\nconst emptyArrayTexture = new DataArrayTexture();\nconst empty3dTexture = new Data3DTexture();\nconst emptyCubeTexture = new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nfunction SingleUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.size = activeInfo.size;\n\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nfunction StructuredUniform( id ) {\n\n\tthis.id = id;\n\n\tthis.seq = [];\n\tthis.map = {};\n\n}\n\nStructuredUniform.prototype.setValue = function ( gl, value, textures ) {\n\n\tconst seq = this.seq;\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ];\n\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t}\n\n};\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nfunction WebGLUniforms( gl, program ) {\n\n\tthis.seq = [];\n\tthis.map = {};\n\n\tconst n = gl.getProgramParameter( program, 35718 );\n\n\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\tparseUniform( info, addr, this );\n\n\t}\n\n}\n\nWebGLUniforms.prototype.setValue = function ( gl, name, value, textures ) {\n\n\tconst u = this.map[ name ];\n\n\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n};\n\nWebGLUniforms.prototype.setOptional = function ( gl, object, name ) {\n\n\tconst v = object[ name ];\n\n\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n};\n\n\n// Static interface\n\nWebGLUniforms.upload = function ( gl, seq, values, textures ) {\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ],\n\t\t\tv = values[ u.id ];\n\n\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t}\n\n\t}\n\n};\n\nWebGLUniforms.seqWithValue = function ( seq, values ) {\n\n\tconst r = [];\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ];\n\t\tif ( u.id in values ) r.push( u );\n\n\t}\n\n\treturn r;\n\n};\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tlines2.push( ( i + 1 ) + ': ' + lines[ i ] );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nfunction getEncodingComponents( encoding ) {\n\n\tswitch ( encoding ) {\n\n\t\tcase LinearEncoding:\n\t\t\treturn [ 'Linear', '( value )' ];\n\t\tcase sRGBEncoding:\n\t\t\treturn [ 'sRGB', '( value )' ];\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported encoding:', encoding );\n\t\t\treturn [ 'Linear', '( value )' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, 35713 );\n\tconst errors = gl.getShaderInfoLog( shader ).trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 0 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\tconst components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nfunction generateExtensions( parameters ) {\n\n\tconst chunks = [\n\t\t( parameters.extensionDerivatives || !! parameters.envMapCubeUVHeight || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t( parameters.extensionShaderTextureLOD || parameters.envMap || parameters.transmission ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, 35721 );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === 35674 ) locationSize = 2;\n\t\tif ( info.type === 35675 ) locationSize = 3;\n\t\tif ( info.type === 35676 ) locationSize = 4;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nfunction includeReplacer( match, include ) {\n\n\tconst string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst deprecatedUnrollLoopPattern = /#pragma unroll_loop[\\s]+?for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string\n\t\t.replace( unrollLoopPattern, loopReplacer )\n\t\t.replace( deprecatedUnrollLoopPattern, deprecatedLoopReplacer );\n\n}\n\nfunction deprecatedLoopReplacer( match, start, end, snippet ) {\n\n\tconsole.warn( 'WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.' );\n\treturn loopReplacer( match, start, end, snippet );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = 'precision ' + parameters.precision + ' float;\\nprecision ' + parameters.precision + ' int;';\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// console.log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\n\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors && parameters.isWebGL2 ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE' : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )',\n\n\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t'\t#else',\n\n\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t'\t#endif',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'encodings_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\t'precision mediump sampler2DArray;',\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, 35633, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, 35632, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\t// check for link errors\n\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\tconst programLog = gl.getProgramInfoLog( program ).trim();\n\t\tconst vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\t\tconst fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\t\tlet runnable = true;\n\t\tlet haveDiagnostics = true;\n\n\t\tif ( gl.getProgramParameter( program, 35714 ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\tconsole.error(\n\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, 35715 ) + '\\n\\n' +\n\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\tfragmentErrors\n\t\t\t);\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t}\n\n\t// Clean up\n\n\t// Crashes in iOS9 and iOS10. #18402\n\t// gl.detachShader( program, glVertexShader );\n\t// gl.detachShader( program, glFragmentShader );\n\n\tgl.deleteShader( glVertexShader );\n\tgl.deleteShader( glFragmentShader );\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\n\t\tif ( cache.has( material ) === false ) {\n\n\t\t\tcache.set( material, new Set() );\n\n\t\t}\n\n\t\treturn cache.get( material );\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\n\t\tif ( cache.has( code ) === false ) {\n\n\t\t\tconst stage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn cache.get( code );\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst programs = [];\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst vertexTextures = capabilities.vertexTextures;\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst useAlphaTest = material.alphaTest > 0;\n\t\tconst useClearcoat = material.clearcoat > 0;\n\n\t\tconst parameters = {\n\n\t\t\tisWebGL2: isWebGL2,\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderName: material.type,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tinstancing: object.isInstancedMesh === true,\n\t\t\tinstancingColor: object.isInstancedMesh === true && object.instanceColor !== null,\n\n\t\t\tsupportsVertexTextures: vertexTextures,\n\t\t\toutputEncoding: ( currentRenderTarget === null ) ? renderer.outputEncoding : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.encoding : LinearEncoding ),\n\t\t\tmap: !! material.map,\n\t\t\tmatcap: !! material.matcap,\n\t\t\tenvMap: !! envMap,\n\t\t\tenvMapMode: envMap && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\tlightMap: !! material.lightMap,\n\t\t\taoMap: !! material.aoMap,\n\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\tbumpMap: !! material.bumpMap,\n\t\t\tnormalMap: !! material.normalMap,\n\t\t\tobjectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,\n\t\t\ttangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tdecodeVideoTexture: !! material.map && ( material.map.isVideoTexture === true ) && ( material.map.encoding === sRGBEncoding ),\n\n\t\t\tclearcoat: useClearcoat,\n\t\t\tclearcoatMap: useClearcoat && !! material.clearcoatMap,\n\t\t\tclearcoatRoughnessMap: useClearcoat && !! material.clearcoatRoughnessMap,\n\t\t\tclearcoatNormalMap: useClearcoat && !! material.clearcoatNormalMap,\n\n\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\tspecularMap: !! material.specularMap,\n\t\t\tspecularIntensityMap: !! material.specularIntensityMap,\n\t\t\tspecularColorMap: !! material.specularColorMap,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending,\n\n\t\t\talphaMap: !! material.alphaMap,\n\t\t\talphaTest: useAlphaTest,\n\n\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\tsheen: material.sheen > 0,\n\t\t\tsheenColorMap: !! material.sheenColorMap,\n\t\t\tsheenRoughnessMap: !! material.sheenRoughnessMap,\n\n\t\t\ttransmission: material.transmission > 0,\n\t\t\ttransmissionMap: !! material.transmissionMap,\n\t\t\tthicknessMap: !! material.thicknessMap,\n\n\t\t\tcombine: material.combine,\n\n\t\t\tvertexTangents: ( !! material.normalMap && !! geometry.attributes.tangent ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\t\t\tvertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.displacementMap || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || !! material.sheenColorMap || !! material.sheenRoughnessMap,\n\t\t\tuvsVertexOnly: ! ( !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatNormalMap || material.transmission > 0 || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || material.sheen > 0 || !! material.sheenColorMap || !! material.sheenRoughnessMap ) && !! material.displacementMap,\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: !! material.flatShading,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: material.toneMapped ? renderer.toneMapping : NoToneMapping,\n\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: !! material.depthPacking,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionDerivatives: material.extensions && material.extensions.derivatives,\n\t\t\textensionFragDepth: material.extensions && material.extensions.fragDepth,\n\t\t\textensionDrawBuffers: material.extensions && material.extensions.drawBuffers,\n\t\t\textensionShaderTextureLOD: material.extensions && material.extensions.shaderTextureLOD,\n\n\t\t\trendererExtensionFragDepth: isWebGL2 || extensions.has( 'EXT_frag_depth' ),\n\t\t\trendererExtensionDrawBuffers: isWebGL2 || extensions.has( 'WEBGL_draw_buffers' ),\n\t\t\trendererExtensionShaderTextureLod: isWebGL2 || extensions.has( 'EXT_shader_texture_lod' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputEncoding );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputEncoding );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.vertexUvs );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.isWebGL2 )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.map )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.lightMap )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.aoMap )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.emissiveMap )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.bumpMap )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.normalMap )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.objectSpaceNormalMap )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.tangentSpaceNormalMap )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.clearcoatMap )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.clearcoatRoughnessMap )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.clearcoatNormalMap )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.displacementMap )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.specularMap )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.roughnessMap )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.metalnessMap )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 22 );\n\t\tif ( parameters.alphaMap )\n\t\t\t_programLayers.enable( 23 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 24 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 25 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 26 );\n\t\tif ( parameters.vertexUvs )\n\t\t\t_programLayers.enable( 27 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 28 );\n\t\tif ( parameters.uvsVertexOnly )\n\t\t\t_programLayers.enable( 29 );\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 30 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.physicallyCorrectLights )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.specularIntensityMap )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.specularColorMap )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.transmissionMap )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.thicknessMap )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.sheenColorMap )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.sheenRoughnessMap )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 22 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 23 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tlet list;\n\n\t\tif ( lists.has( scene ) === false ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= lists.get( scene ).length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlists.get( scene ).push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = lists.get( scene )[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 1 : 0 ) - ( lightA.castShadow ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions, capabilities ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: - 1,\n\t\t\tpointLength: - 1,\n\t\t\tspotLength: - 1,\n\t\t\trectAreaLength: - 1,\n\t\t\themiLength: - 1,\n\n\t\t\tnumDirectionalShadows: - 1,\n\t\t\tnumPointShadows: - 1,\n\t\t\tnumSpotShadows: - 1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotShadowMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: []\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights, physicallyCorrectLights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\n\t\tlights.sort( shadowCastingLightsFirst );\n\n\t\t// artist-friendly light intensity scaling factor\n\t\tconst scaleFactor = ( physicallyCorrectLights !== true ) ? Math.PI : 1;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity * scaleFactor;\n\t\t\t\tg += color.g * intensity * scaleFactor;\n\t\t\t\tb += color.b * intensity * scaleFactor;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\tstate.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\t// (a) intensity is the total visible light emitted\n\t\t\t\t//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );\n\n\t\t\t\t// (b) intensity is the brightness of the light\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity * scaleFactor );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\t// WebGL 2\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\t// WebGL 1\n\n\t\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t\t} else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotShadowMatrix.length = numSpotShadows;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions, capabilities ) {\n\n\tconst lights = new WebGLLights( extensions, capabilities );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init() {\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights( physicallyCorrectLights ) {\n\n\t\tlights.setup( lightsArray, physicallyCorrectLights );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tlights: lights\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions, capabilities ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tlet renderState;\n\n\t\tif ( renderStates.has( scene ) === false ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStates.get( scene ).length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\t\trenderStates.get( scene ).push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStates.get( scene )[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nclass MeshDepthMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\nclass MeshDistanceMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\tthis.referencePosition = new Vector3();\n\t\tthis.nearDistance = 1;\n\t\tthis.farDistance = 1000;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.referencePosition.copy( source.referencePosition );\n\t\tthis.nearDistance = source.nearDistance;\n\t\tthis.farDistance = source.farDistance;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include \\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nfunction WebGLShadowMap( _renderer, _objects, _capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = _capabilities.maxTextureSize;\n\n\tconst shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = _renderer.getRenderTarget();\n\t\tconst activeCubeFace = _renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = _renderer.getActiveMipmapLevel();\n\n\t\tconst _state = _renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null && ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\tconst pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\t_renderer.setRenderTarget( shadow.map );\n\t\t\t_renderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\tscope.needsUpdate = false;\n\n\t\t_renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = _objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.mapPass );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.map );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, shadowCameraNear, shadowCameraFar, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t}\n\n\t\tif ( ( _renderer.localClippingEnabled && material.clipShadows === true && material.clippingPlanes.length !== 0 ) ||\n\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t( material.alphaMap && material.alphaTest > 0 ) ) {\n\n\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t// appropriate state\n\n\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t}\n\n\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult = cachedMaterial;\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = material.alphaTest;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tresult.referencePosition.setFromMatrixPosition( light.matrixWorld );\n\t\t\tresult.nearDistance = shadowCameraNear;\n\t\t\tresult.farDistance = shadowCameraFar;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = _objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n}\n\nfunction WebGLState( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( 2929 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( 2929 );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 512 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 519 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 513 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 515 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 514 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 518 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 516 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 517 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 515 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.depthFunc( 515 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( 2960 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( 2960 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef !== stencilRef ||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( 35661 );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( 7938 );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( 3088 );\n\tconst viewportParam = gl.getParameter( 2978 );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, 10241, 9728 );\n\t\tgl.texParameteri( type, 10240, 9728 );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tgl.texImage2D( target + i, 0, 6408, 1, 1, 0, 6408, 5121, data );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ 3553 ] = createTexture( 3553, 3553, 1 );\n\temptyTextures[ 34067 ] = createTexture( 34067, 34069, 6 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( 2929 );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( 2884 );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t// 36009 is equivalent to 36160\n\n\t\t\t\tif ( target === 36009 ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ 36160 ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t\tif ( target === 36160 ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ 36009 ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== 36064 ) {\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tdrawBuffers[ i ] = 36064 + i;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( drawBuffers[ 0 ] !== 36064 ) {\n\n\t\t\t\t\tdrawBuffers[ 0 ] = 36064;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== 1029 ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = 1029;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t\t} else {\n\n\t\t\t\textensions.get( 'WEBGL_draw_buffers' ).drawBuffersWEBGL( drawBuffers );\n\n\t\t\t}\n\n\t\t}\n\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: 32774,\n\t\t[ SubtractEquation ]: 32778,\n\t\t[ ReverseSubtractEquation ]: 32779\n\t};\n\n\tif ( isWebGL2 ) {\n\n\t\tequationToGL[ MinEquation ] = 32775;\n\t\tequationToGL[ MaxEquation ] = 32776;\n\n\t} else {\n\n\t\tconst extension = extensions.get( 'EXT_blend_minmax' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tequationToGL[ MinEquation ] = extension.MIN_EXT;\n\t\t\tequationToGL[ MaxEquation ] = extension.MAX_EXT;\n\n\t\t}\n\n\t}\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: 0,\n\t\t[ OneFactor ]: 1,\n\t\t[ SrcColorFactor ]: 768,\n\t\t[ SrcAlphaFactor ]: 770,\n\t\t[ SrcAlphaSaturateFactor ]: 776,\n\t\t[ DstColorFactor ]: 774,\n\t\t[ DstAlphaFactor ]: 772,\n\t\t[ OneMinusSrcColorFactor ]: 769,\n\t\t[ OneMinusSrcAlphaFactor ]: 771,\n\t\t[ OneMinusDstColorFactor ]: 775,\n\t\t[ OneMinusDstAlphaFactor ]: 773\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( 3042 );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( 3042 );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( 32774 );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 1, 771, 1, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 1, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 769, 0, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 768, 0, 770 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 770, 771, 1, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 770, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 769, 0, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 0, 768 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = null;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( 2884 )\n\t\t\t: enable( 2884 );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( 32926 )\n\t\t\t: disable( 32926 );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( 2304 );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( 2305 );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( 2884 );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( 1029 );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( 1028 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( 1032 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( 2884 );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( 32823 );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( 32823 );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( 3089 );\n\n\t\t} else {\n\n\t\t\tdisable( 3089 );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = 33984 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\tif ( currentTextureSlot === null ) {\n\n\t\t\tactiveTexture();\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( 3042 );\n\t\tgl.disable( 2884 );\n\t\tgl.disable( 2929 );\n\t\tgl.disable( 32823 );\n\t\tgl.disable( 3089 );\n\t\tgl.disable( 2960 );\n\t\tgl.disable( 32926 );\n\n\t\tgl.blendEquation( 32774 );\n\t\tgl.blendFunc( 1, 0 );\n\t\tgl.blendFuncSeparate( 1, 0, 1, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( 513 );\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( 519, 0, 0xffffffff );\n\t\tgl.stencilOp( 7680, 7680, 7680 );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( 1029 );\n\t\tgl.frontFace( 2305 );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( 33984 );\n\n\t\tgl.bindFramebuffer( 36160, null );\n\n\t\tif ( isWebGL2 === true ) {\n\n\t\t\tgl.bindFramebuffer( 36009, null );\n\t\t\tgl.bindFramebuffer( 36008, null );\n\n\t\t}\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst maxTextures = capabilities.maxTextures;\n\tconst maxCubemapSize = capabilities.maxCubemapSize;\n\tconst maxTextureSize = capabilities.maxTextureSize;\n\tconst maxSamples = capabilities.maxSamples;\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( image.width, image.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 || needsPowerOfTwo === true ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\t\tconst floor = needsPowerOfTwo ? floorPowerOfTwo : Math.floor;\n\n\t\t\t\tconst width = floor( scale * image.width );\n\t\t\t\tconst height = floor( scale * image.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction isPowerOfTwo$1( image ) {\n\n\t\treturn isPowerOfTwo( image.width ) && isPowerOfTwo( image.height );\n\n\t}\n\n\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\tif ( isWebGL2 ) return false;\n\n\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture, supportsMips ) {\n\n\t\treturn texture.generateMipmaps && supportsMips &&\n\t\t\ttexture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, encoding, isVideoTexture = false ) {\n\n\t\tif ( isWebGL2 === false ) return glFormat;\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === 6403 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 33326;\n\t\t\tif ( glType === 5131 ) internalFormat = 33325;\n\t\t\tif ( glType === 5121 ) internalFormat = 33321;\n\n\t\t}\n\n\t\tif ( glFormat === 33319 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 33328;\n\t\t\tif ( glType === 5131 ) internalFormat = 33327;\n\t\t\tif ( glType === 5121 ) internalFormat = 33323;\n\n\t\t}\n\n\t\tif ( glFormat === 6408 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 34836;\n\t\t\tif ( glType === 5131 ) internalFormat = 34842;\n\t\t\tif ( glType === 5121 ) internalFormat = ( encoding === sRGBEncoding && isVideoTexture === false ) ? 35907 : 32856;\n\t\t\tif ( glType === 32819 ) internalFormat = 32854;\n\t\t\tif ( glType === 32820 ) internalFormat = 32855;\n\n\t\t}\n\n\t\tif ( internalFormat === 33325 || internalFormat === 33326 ||\n\t\t\tinternalFormat === 33327 || internalFormat === 33328 ||\n\t\t\tinternalFormat === 34842 || internalFormat === 34836 ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image, supportsMips ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t// Fallback filters for non-power-of-2 textures\n\n\tfunction filterFallback( f ) {\n\n\t\tif ( f === NearestFilter || f === NearestMipmapNearestFilter || f === NearestMipmapLinearFilter ) {\n\n\t\t\treturn 9728;\n\n\t\t}\n\n\t\treturn 9729;\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\tinfo.memory.textures --;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = texture.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachmentProperties = properties.get( texture[ i ] );\n\n\t\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\t\tinfo.memory.textures --;\n\n\t\t\t\t}\n\n\t\t\t\tproperties.remove( texture[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.encoding );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 3553, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 35866, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 32879, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: 10497,\n\t\t[ ClampToEdgeWrapping ]: 33071,\n\t\t[ MirroredRepeatWrapping ]: 33648\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: 9728,\n\t\t[ NearestMipmapNearestFilter ]: 9984,\n\t\t[ NearestMipmapLinearFilter ]: 9986,\n\n\t\t[ LinearFilter ]: 9729,\n\t\t[ LinearMipmapNearestFilter ]: 9985,\n\t\t[ LinearMipmapLinearFilter ]: 9987\n\t};\n\n\tfunction setTextureParameters( textureType, texture, supportsMips ) {\n\n\t\tif ( supportsMips ) {\n\n\t\t\t_gl.texParameteri( textureType, 10242, wrappingToGL[ texture.wrapS ] );\n\t\t\t_gl.texParameteri( textureType, 10243, wrappingToGL[ texture.wrapT ] );\n\n\t\t\tif ( textureType === 32879 || textureType === 35866 ) {\n\n\t\t\t\t_gl.texParameteri( textureType, 32882, wrappingToGL[ texture.wrapR ] );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, 10240, filterToGL[ texture.magFilter ] );\n\t\t\t_gl.texParameteri( textureType, 10241, filterToGL[ texture.minFilter ] );\n\n\t\t} else {\n\n\t\t\t_gl.texParameteri( textureType, 10242, 33071 );\n\t\t\t_gl.texParameteri( textureType, 10243, 33071 );\n\n\t\t\tif ( textureType === 32879 || textureType === 35866 ) {\n\n\t\t\t\t_gl.texParameteri( textureType, 32882, 33071 );\n\n\t\t\t}\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, 10240, filterFallback( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, 10241, filterFallback( texture.minFilter ) );\n\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension for WebGL 1 and WebGL 2\n\t\t\tif ( isWebGL2 === false && ( texture.type === HalfFloatType && extensions.has( 'OES_texture_half_float_linear' ) === false ) ) return; // verify extension for WebGL 1 only\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = 3553;\n\n\t\tif ( texture.isDataArrayTexture ) textureType = 35866;\n\t\tif ( texture.isData3DTexture ) textureType = 32879;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture );\n\n\t\tif ( source.version !== source.__currentVersion || forceUpload === true ) {\n\n\t\t\t_gl.pixelStorei( 37440, texture.flipY );\n\t\t\t_gl.pixelStorei( 37441, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( 3317, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( 37443, 0 );\n\n\t\t\tconst needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo$1( texture.image ) === false;\n\t\t\tlet image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst supportsMips = isPowerOfTwo$1( image ) || isWebGL2,\n\t\t\t\tglFormat = utils.convert( texture.format, texture.encoding );\n\n\t\t\tlet glType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture, supportsMips );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( textureProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst levels = getMipLevels( texture, image, supportsMips );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tglInternalFormat = 6402;\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = 36012;\n\n\t\t\t\t\t} else if ( texture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = 33190;\n\n\t\t\t\t\t} else if ( texture.type === UnsignedInt248Type ) {\n\n\t\t\t\t\t\tglInternalFormat = 35056;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tglInternalFormat = 33189; // WebGL2 requires sized internalformat for glTexImage2D\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\t\tconsole.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// validation checks for WebGL 1\n\n\t\t\t\tif ( texture.format === DepthFormat && glInternalFormat === 6402 ) {\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.format === DepthStencilFormat && glInternalFormat === 6402 ) {\n\n\t\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tglInternalFormat = 34041;\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 3553, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstate.texSubImage2D( 3553, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( 3553, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.compressedTexImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 3553, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( 35866, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage3D( 35866, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( 35866, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( 32879, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage3D( 32879, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( 32879, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 3553, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstate.texSubImage2D( 3553, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsource.__currentVersion = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\n\t\tif ( source.version !== source.__currentVersion || forceUpload === true ) {\n\n\t\t\t_gl.pixelStorei( 37440, texture.flipY );\n\t\t\t_gl.pixelStorei( 37441, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( 3317, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( 37443, 0 );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tsupportsMips = isPowerOfTwo$1( image ) || isWebGL2,\n\t\t\t\tglFormat = utils.convert( texture.format, texture.encoding ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\n\t\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( textureProperties.__version === undefined );\n\t\t\tlet levels = getMipLevels( texture, image, supportsMips );\n\n\t\t\tsetTextureParameters( 34067, texture, supportsMips );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( 34067, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( 34069 + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tstate.texStorage2D( 34067, levels, glInternalFormat, cubeImage[ 0 ].width, cubeImage[ 0 ].height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( 34067 );\n\n\t\t\t}\n\n\t\t\tsource.__currentVersion = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tif ( textureTarget === 32879 || textureTarget === 35866 ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( 36160, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else {\n\n\t\t\t_gl.framebufferTexture2D( 36160, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( 36160, null );\n\n\t}\n\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( 36161, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\tlet glInternalFormat = 33189;\n\n\t\t\tif ( isMultisample || useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\n\t\t\t\tif ( depthTexture && depthTexture.isDepthTexture ) {\n\n\t\t\t\t\tif ( depthTexture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = 36012;\n\n\t\t\t\t\t} else if ( depthTexture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = 33190;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( 36160, 36096, 36161, renderbuffer );\n\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, 35056, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( 36161, samples, 35056, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, 34041, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\n\t\t\t_gl.framebufferRenderbuffer( 36160, 33306, 36161, renderbuffer );\n\n\t\t} else {\n\n\t\t\t// Use the first texture for MRT so far\n\t\t\tconst texture = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture[ 0 ] : renderTarget.texture;\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( 36161, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( 36160, 36096, 3553, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( 36160, 36096, 3553, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( 36160, 33306, 3553, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( 36160, 33306, 3553, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( 36160, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, 36064, 3553 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets !== true ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );\n\t\tconst supportsMips = isPowerOfTwo$1( renderTarget ) || isWebGL2;\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tif ( capabilities.drawBuffers ) {\n\n\t\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.' );\n\n\t\t\t\t}\n\n\t\t\t} else if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();\n\n\t\t\t\t_gl.bindRenderbuffer( 36161, renderTargetProperties.__webglColorRenderbuffer );\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t_gl.framebufferRenderbuffer( 36160, 36064, 36161, renderTargetProperties.__webglColorRenderbuffer );\n\t\t\t\t_gl.bindRenderbuffer( 36161, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( 36160, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( 34067, texture, supportsMips );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, 36064, 34069 + i );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( 34067 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tconst textures = renderTarget.texture;\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tstate.bindTexture( 3553, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( 3553, attachment, supportsMips );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, 36064 + i, 3553 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {\n\n\t\t\t\t\tgenerateMipmap( 3553 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = 3553;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? 32879 : 35866;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLTextures: THREE.Data3DTexture and THREE.DataArrayTexture only supported with WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture, supportsMips );\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, 36064, glTextureType );\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst supportsMips = isPowerOfTwo$1( renderTarget ) || isWebGL2;\n\n\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tconst target = renderTarget.isWebGLCubeRenderTarget ? 34067 : 3553;\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\tgenerateMipmap( target );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\tconst width = renderTarget.width;\n\t\t\tconst height = renderTarget.height;\n\t\t\tlet mask = 16384;\n\t\t\tconst invalidationArray = [ 36064 ];\n\t\t\tconst depthStyle = renderTarget.stencilBuffer ? 33306 : 36096;\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tinvalidationArray.push( depthStyle );\n\n\t\t\t}\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\tconst ignoreDepthValues = ( renderTargetProperties.__ignoreDepthValues !== undefined ) ? renderTargetProperties.__ignoreDepthValues : false;\n\n\t\t\tif ( ignoreDepthValues === false ) {\n\n\t\t\t\tif ( renderTarget.depthBuffer ) mask |= 256;\n\t\t\t\tif ( renderTarget.stencilBuffer ) mask |= 1024;\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( 36008, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\tstate.bindFramebuffer( 36009, renderTargetProperties.__webglFramebuffer );\n\n\t\t\tif ( ignoreDepthValues === true ) {\n\n\t\t\t\t_gl.invalidateFramebuffer( 36008, [ depthStyle ] );\n\t\t\t\t_gl.invalidateFramebuffer( 36009, [ depthStyle ] );\n\n\t\t\t}\n\n\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, 9728 );\n\n\t\t\tif ( supportsInvalidateFramebuffer ) {\n\n\t\t\t\t_gl.invalidateFramebuffer( 36008, invalidationArray );\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( 36008, null );\n\t\t\tstate.bindFramebuffer( 36009, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn isWebGL2 && renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst encoding = texture.encoding;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true || texture.format === _SRGBAFormat ) return image;\n\n\t\tif ( encoding !== LinearEncoding ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( encoding === sRGBEncoding ) {\n\n\t\t\t\tif ( isWebGL2 === false ) {\n\n\t\t\t\t\t// in WebGL 1, try to use EXT_sRGB extension and unsized formats\n\n\t\t\t\t\tif ( extensions.has( 'EXT_sRGB' ) === true && format === RGBAFormat ) {\n\n\t\t\t\t\t\ttexture.format = _SRGBAFormat;\n\n\t\t\t\t\t\t// it's not possible to generate mips in WebGL 1 with this extension\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// slow fallback (CPU decode)\n\n\t\t\t\t\t\timage = ImageUtils.sRGBToLinear( image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.WebGLTextures: Unsupported texture encoding:', encoding );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n}\n\nfunction WebGLUtils( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction convert( p, encoding = null ) {\n\n\t\tlet extension;\n\n\t\tif ( p === UnsignedByteType ) return 5121;\n\t\tif ( p === UnsignedShort4444Type ) return 32819;\n\t\tif ( p === UnsignedShort5551Type ) return 32820;\n\n\t\tif ( p === ByteType ) return 5120;\n\t\tif ( p === ShortType ) return 5122;\n\t\tif ( p === UnsignedShortType ) return 5123;\n\t\tif ( p === IntType ) return 5124;\n\t\tif ( p === UnsignedIntType ) return 5125;\n\t\tif ( p === FloatType ) return 5126;\n\n\t\tif ( p === HalfFloatType ) {\n\n\t\t\tif ( isWebGL2 ) return 5131;\n\n\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.HALF_FLOAT_OES;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === AlphaFormat ) return 6406;\n\t\tif ( p === RGBAFormat ) return 6408;\n\t\tif ( p === LuminanceFormat ) return 6409;\n\t\tif ( p === LuminanceAlphaFormat ) return 6410;\n\t\tif ( p === DepthFormat ) return 6402;\n\t\tif ( p === DepthStencilFormat ) return 34041;\n\t\tif ( p === RedFormat ) return 6403;\n\n\t\tif ( p === RGBFormat ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: THREE.RGBFormat has been removed. Use THREE.RGBAFormat instead. https://github.com/mrdoob/three.js/pull/23228' );\n\t\t\treturn 6408;\n\n\t\t}\n\n\t\t// WebGL 1 sRGB fallback\n\n\t\tif ( p === _SRGBAFormat ) {\n\n\t\t\textension = extensions.get( 'EXT_sRGB' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.SRGB_ALPHA_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedIntegerFormat ) return 36244;\n\t\tif ( p === RGFormat ) return 33319;\n\t\tif ( p === RGIntegerFormat ) return 33320;\n\t\tif ( p === RGBAIntegerFormat ) return 36249;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( encoding === sRGBEncoding ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC1\n\n\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC2\n\n\t\tif ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC2_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\tif ( isWebGL2 ) return 34042;\n\n\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nclass ArrayCamera extends PerspectiveCamera {\n\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\nArrayCamera.prototype.isArrayCamera = true;\n\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nGroup.prototype.isGroup = true;\n\nconst _moveEvent = { type: 'move' };\n\nclass WebXRController {\n\n\tconstructor() {\n\n\t\tthis._targetRay = null;\n\t\tthis._grip = null;\n\t\tthis._hand = null;\n\n\t}\n\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\t\tconst joint = new Group();\n\t\t\t\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\t\t\t\tjoint.visible = false;\n\t\t\t\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\t\t\t\t\t\t// ??\n\t\t\t\t\t\thand.add( joint );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst joint = hand.joints[ inputjoint.jointName ];\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass DepthTexture extends Texture {\n\n\tconstructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps\t= false;\n\n\t}\n\n\n}\n\nDepthTexture.prototype.isDepthTexture = true;\n\nclass WebXRManager extends EventDispatcher {\n\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\t\tconst attributes = gl.getContextAttributes();\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst inputSourcesMap = new Map();\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.layers.enable( 1 );\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.layers.enable( 2 );\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraVR = new ArrayCamera();\n\t\tcameraVR.layers.enable( 1 );\n\t\tcameraVR.layers.enable( 2 );\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\tthis.cameraAutoUpdate = true;\n\t\tthis.enabled = false;\n\n\t\tthis.isPresenting = false;\n\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controller = inputSourcesMap.get( event.inputSource );\n\n\t\t\tif ( controller ) {\n\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tinputSourcesMap.forEach( function ( controller, inputSource ) {\n\n\t\t\t\tcontroller.disconnect( inputSource );\n\n\t\t\t} );\n\n\t\t\tinputSourcesMap.clear();\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\tthis.getBinding = function () {\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tif ( ( session.renderState.layers === undefined ) || ( renderer.capabilities.isWebGL2 === false ) ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: ( session.renderState.layers === undefined ) ? attributes.antialias : true,\n\t\t\t\t\t\talpha: attributes.alpha,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tencoding: renderer.outputEncoding\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? 35056 : 33190;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedShortType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: ( renderer.outputEncoding === sRGBEncoding ) ? 35907 : 32856,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tencoding: renderer.outputEncoding,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0\n\t\t\t\t\t\t} );\n\n\t\t\t\t\tconst renderTargetProperties = renderer.properties.get( newRenderTarget );\n\t\t\t\t\trenderTargetProperties.__ignoreDepthValues = glProjLayer.ignoreDepthValues;\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\t// Set foveation to maximum.\n\t\t\t\tthis.setFoveation( 1.0 );\n\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\tconst inputSources = session.inputSources;\n\n\t\t\t// Assign controllers to available inputSources\n\n\t\t\tfor ( let i = 0; i < inputSources.length; i ++ ) {\n\n\t\t\t\tconst index = inputSources[ i ].handedness === 'right' ? 1 : 0;\n\t\t\t\tinputSourcesMap.set( inputSources[ i ], controllers[ index ] );\n\n\t\t\t}\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\t\t\t\t\tinputSourcesMap.delete( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\t\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t// although must now be relative to the new union camera.\n\t\t\tconst near2 = near + zOffset;\n\t\t\tconst far2 = far + zOffset;\n\t\t\tconst left2 = left - xOffset;\n\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tcameraVR.near = cameraR.near = cameraL.near = camera.near;\n\t\t\tcameraVR.far = cameraR.far = cameraL.far = camera.far;\n\n\t\t\tif ( _currentDepthNear !== cameraVR.near || _currentDepthFar !== cameraVR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraVR.near,\n\t\t\t\t\tdepthFar: cameraVR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraVR.near;\n\t\t\t\t_currentDepthFar = cameraVR.far;\n\n\t\t\t}\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraVR.cameras;\n\n\t\t\tupdateCamera( cameraVR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\tcameraVR.matrixWorld.decompose( cameraVR.position, cameraVR.quaternion, cameraVR.scale );\n\n\t\t\t// update user camera and its children\n\n\t\t\tcamera.position.copy( cameraVR.position );\n\t\t\tcamera.quaternion.copy( cameraVR.quaternion );\n\t\t\tcamera.scale.copy( cameraVR.scale );\n\t\t\tcamera.matrix.copy( cameraVR.matrix );\n\t\t\tcamera.matrixWorld.copy( cameraVR.matrixWorld );\n\n\t\t\tconst children = camera.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( true );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraVR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraVR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraVR;\n\n\t\t};\n\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\treturn glProjLayer.fixedFoveation;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\treturn glBaseLayer.fixedFoveation;\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t};\n\n\t\tthis.setFoveation = function ( foveation ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = foveation;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = foveation;\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraVRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraVR's camera list\n\n\t\t\t\tif ( views.length !== cameraVR.cameras.length ) {\n\n\t\t\t\t\tcameraVR.cameras.length = 0;\n\t\t\t\t\tcameraVRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst camera = cameras[ i ];\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraVR.matrix.copy( camera.matrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraVRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraVR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst inputSources = session.inputSources;\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = inputSources[ i ];\n\t\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tuniforms.fogColor.value.copy( fog.color );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\n\t\t\t// artist-friendly light intensity scaling factor\n\t\t\tconst scaleFactor = ( renderer.physicallyCorrectLights !== true ) ? Math.PI : 1;\n\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity * scaleFactor;\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. specular map\n\t\t// 3. displacementMap map\n\t\t// 4. normal map\n\t\t// 5. bump map\n\t\t// 6. roughnessMap map\n\t\t// 7. metalnessMap map\n\t\t// 8. alphaMap map\n\t\t// 9. emissiveMap map\n\t\t// 10. clearcoat map\n\t\t// 11. clearcoat normal map\n\t\t// 12. clearcoat roughnessMap map\n\t\t// 13. specular intensity map\n\t\t// 14. specular tint map\n\t\t// 15. transmission map\n\t\t// 16. thickness map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.specularMap ) {\n\n\t\t\tuvScaleMap = material.specularMap;\n\n\t\t} else if ( material.displacementMap ) {\n\n\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t} else if ( material.normalMap ) {\n\n\t\t\tuvScaleMap = material.normalMap;\n\n\t\t} else if ( material.bumpMap ) {\n\n\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t} else if ( material.roughnessMap ) {\n\n\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t} else if ( material.metalnessMap ) {\n\n\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t} else if ( material.emissiveMap ) {\n\n\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t} else if ( material.clearcoatMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatMap;\n\n\t\t} else if ( material.clearcoatNormalMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatNormalMap;\n\n\t\t} else if ( material.clearcoatRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatRoughnessMap;\n\n\t\t} else if ( material.specularIntensityMap ) {\n\n\t\t\tuvScaleMap = material.specularIntensityMap;\n\n\t\t} else if ( material.specularColorMap ) {\n\n\t\t\tuvScaleMap = material.specularColorMap;\n\n\t\t} else if ( material.transmissionMap ) {\n\n\t\t\tuvScaleMap = material.transmissionMap;\n\n\t\t} else if ( material.thicknessMap ) {\n\n\t\t\tuvScaleMap = material.thicknessMap;\n\n\t\t} else if ( material.sheenColorMap ) {\n\n\t\t\tuvScaleMap = material.sheenColorMap;\n\n\t\t} else if ( material.sheenRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.sheenRoughnessMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities for uv2\n\t\t// 1. ao map\n\t\t// 2. light map\n\n\t\tlet uv2ScaleMap;\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuv2ScaleMap = material.aoMap;\n\n\t\t} else if ( material.lightMap ) {\n\n\t\t\tuv2ScaleMap = material.lightMap;\n\n\t\t}\n\n\t\tif ( uv2ScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uv2ScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuv2ScaleMap = uv2ScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uv2ScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuv2ScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uv2Transform.value.copy( uv2ScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.roughness.value = material.roughness;\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t}\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t}\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tuniforms.referencePosition.value.copy( material.referencePosition );\n\t\tuniforms.nearDistance.value = material.nearDistance;\n\t\tuniforms.farDistance.value = material.farDistance;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nfunction WebGLRenderer( parameters = {} ) {\n\n\tconst _canvas = parameters.canvas !== undefined ? parameters.canvas : createCanvasElement(),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,\n\t\t_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default',\n\t\t_failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false;\n\n\tlet _alpha;\n\n\tif ( _context !== null ) {\n\n\t\t_alpha = _context.getContextAttributes().alpha;\n\n\t} else {\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false;\n\n\t}\n\n\tlet currentRenderList = null;\n\tlet currentRenderState = null;\n\n\t// render() can be called from within a callback triggered by another render.\n\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\tconst renderListStack = [];\n\tconst renderStateStack = [];\n\n\t// public properties\n\n\tthis.domElement = _canvas;\n\n\t// Debug configuration container\n\tthis.debug = {\n\n\t\t/**\n\t\t * Enables error checking and reporting when shader programs are being compiled\n\t\t * @type {boolean}\n\t\t */\n\t\tcheckShaderErrors: true\n\t};\n\n\t// clearing\n\n\tthis.autoClear = true;\n\tthis.autoClearColor = true;\n\tthis.autoClearDepth = true;\n\tthis.autoClearStencil = true;\n\n\t// scene graph\n\n\tthis.sortObjects = true;\n\n\t// user-defined clipping\n\n\tthis.clippingPlanes = [];\n\tthis.localClippingEnabled = false;\n\n\t// physically based shading\n\n\tthis.outputEncoding = LinearEncoding;\n\n\t// physical lights\n\n\tthis.physicallyCorrectLights = false;\n\n\t// tone mapping\n\n\tthis.toneMapping = NoToneMapping;\n\tthis.toneMappingExposure = 1.0;\n\n\t// internal properties\n\n\tconst _this = this;\n\n\tlet _isContextLost = false;\n\n\t// internal state cache\n\n\tlet _currentActiveCubeFace = 0;\n\tlet _currentActiveMipmapLevel = 0;\n\tlet _currentRenderTarget = null;\n\tlet _currentMaterialId = - 1;\n\n\tlet _currentCamera = null;\n\n\tconst _currentViewport = new Vector4();\n\tconst _currentScissor = new Vector4();\n\tlet _currentScissorTest = null;\n\n\t//\n\n\tlet _width = _canvas.width;\n\tlet _height = _canvas.height;\n\n\tlet _pixelRatio = 1;\n\tlet _opaqueSort = null;\n\tlet _transparentSort = null;\n\n\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\tlet _scissorTest = false;\n\n\t// frustum\n\n\tconst _frustum = new Frustum();\n\n\t// clipping\n\n\tlet _clippingEnabled = false;\n\tlet _localClippingEnabled = false;\n\n\t// transmission\n\n\tlet _transmissionRenderTarget = null;\n\n\t// camera matrices cache\n\n\tconst _projScreenMatrix = new Matrix4();\n\n\tconst _vector2 = new Vector2();\n\tconst _vector3 = new Vector3();\n\n\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\tfunction getTargetPixelRatio() {\n\n\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t}\n\n\t// initialize\n\n\tlet _gl = _context;\n\n\tfunction getContext( contextNames, contextAttributes ) {\n\n\t\tfor ( let i = 0; i < contextNames.length; i ++ ) {\n\n\t\t\tconst contextName = contextNames[ i ];\n\t\t\tconst context = _canvas.getContext( contextName, contextAttributes );\n\t\t\tif ( context !== null ) return context;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\ttry {\n\n\t\tconst contextAttributes = {\n\t\t\talpha: true,\n\t\t\tdepth: _depth,\n\t\t\tstencil: _stencil,\n\t\t\tantialias: _antialias,\n\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer,\n\t\t\tpowerPreference: _powerPreference,\n\t\t\tfailIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat\n\t\t};\n\n\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\tif ( 'setAttribute' in _canvas ) _canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\tif ( _gl === null ) {\n\n\t\t\tconst contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];\n\n\t\t\tif ( _this.isWebGL1Renderer === true ) {\n\n\t\t\t\tcontextNames.shift();\n\n\t\t\t}\n\n\t\t\t_gl = getContext( contextNames, contextAttributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( getContext( contextNames ) ) {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t};\n\n\t\t}\n\n\t} catch ( error ) {\n\n\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\t\tthrow error;\n\n\t}\n\n\tlet extensions, capabilities, state, info;\n\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\tlet utils, bindingStates;\n\n\tfunction initGLContext() {\n\n\t\textensions = new WebGLExtensions( _gl );\n\n\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\textensions.init( capabilities );\n\n\t\tutils = new WebGLUtils( _gl, extensions, capabilities );\n\n\t\tstate = new WebGLState( _gl, extensions, capabilities );\n\n\t\tinfo = new WebGLInfo( _gl );\n\t\tproperties = new WebGLProperties();\n\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\tattributes = new WebGLAttributes( _gl, capabilities );\n\t\tbindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities );\n\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\tclipping = new WebGLClipping( properties );\n\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\trenderLists = new WebGLRenderLists();\n\t\trenderStates = new WebGLRenderStates( extensions, capabilities );\n\t\tbackground = new WebGLBackground( _this, cubemaps, state, objects, _alpha, _premultipliedAlpha );\n\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\n\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );\n\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );\n\n\t\tinfo.programs = programCache.programs;\n\n\t\t_this.capabilities = capabilities;\n\t\t_this.extensions = extensions;\n\t\t_this.properties = properties;\n\t\t_this.renderLists = renderLists;\n\t\t_this.shadowMap = shadowMap;\n\t\t_this.state = state;\n\t\t_this.info = info;\n\n\t}\n\n\tinitGLContext();\n\n\t// xr\n\n\tconst xr = new WebXRManager( _this, _gl );\n\n\tthis.xr = xr;\n\n\t// API\n\n\tthis.getContext = function () {\n\n\t\treturn _gl;\n\n\t};\n\n\tthis.getContextAttributes = function () {\n\n\t\treturn _gl.getContextAttributes();\n\n\t};\n\n\tthis.forceContextLoss = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.loseContext();\n\n\t};\n\n\tthis.forceContextRestore = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.restoreContext();\n\n\t};\n\n\tthis.getPixelRatio = function () {\n\n\t\treturn _pixelRatio;\n\n\t};\n\n\tthis.setPixelRatio = function ( value ) {\n\n\t\tif ( value === undefined ) return;\n\n\t\t_pixelRatio = value;\n\n\t\tthis.setSize( _width, _height, false );\n\n\t};\n\n\tthis.getSize = function ( target ) {\n\n\t\treturn target.set( _width, _height );\n\n\t};\n\n\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\tif ( xr.isPresenting ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_canvas.width = Math.floor( width * _pixelRatio );\n\t\t_canvas.height = Math.floor( height * _pixelRatio );\n\n\t\tif ( updateStyle !== false ) {\n\n\t\t\t_canvas.style.width = width + 'px';\n\t\t\t_canvas.style.height = height + 'px';\n\n\t\t}\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t};\n\n\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_pixelRatio = pixelRatio;\n\n\t\t_canvas.width = Math.floor( width * pixelRatio );\n\t\t_canvas.height = Math.floor( height * pixelRatio );\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getCurrentViewport = function ( target ) {\n\n\t\treturn target.copy( _currentViewport );\n\n\t};\n\n\tthis.getViewport = function ( target ) {\n\n\t\treturn target.copy( _viewport );\n\n\t};\n\n\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_viewport.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissor = function ( target ) {\n\n\t\treturn target.copy( _scissor );\n\n\t};\n\n\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_scissor.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissorTest = function () {\n\n\t\treturn _scissorTest;\n\n\t};\n\n\tthis.setScissorTest = function ( boolean ) {\n\n\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t};\n\n\tthis.setOpaqueSort = function ( method ) {\n\n\t\t_opaqueSort = method;\n\n\t};\n\n\tthis.setTransparentSort = function ( method ) {\n\n\t\t_transparentSort = method;\n\n\t};\n\n\t// Clearing\n\n\tthis.getClearColor = function ( target ) {\n\n\t\treturn target.copy( background.getClearColor() );\n\n\t};\n\n\tthis.setClearColor = function () {\n\n\t\tbackground.setClearColor.apply( background, arguments );\n\n\t};\n\n\tthis.getClearAlpha = function () {\n\n\t\treturn background.getClearAlpha();\n\n\t};\n\n\tthis.setClearAlpha = function () {\n\n\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t};\n\n\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\tlet bits = 0;\n\n\t\tif ( color ) bits |= 16384;\n\t\tif ( depth ) bits |= 256;\n\t\tif ( stencil ) bits |= 1024;\n\n\t\t_gl.clear( bits );\n\n\t};\n\n\tthis.clearColor = function () {\n\n\t\tthis.clear( true, false, false );\n\n\t};\n\n\tthis.clearDepth = function () {\n\n\t\tthis.clear( false, true, false );\n\n\t};\n\n\tthis.clearStencil = function () {\n\n\t\tthis.clear( false, false, true );\n\n\t};\n\n\t//\n\n\tthis.dispose = function () {\n\n\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\trenderLists.dispose();\n\t\trenderStates.dispose();\n\t\tproperties.dispose();\n\t\tcubemaps.dispose();\n\t\tcubeuvmaps.dispose();\n\t\tobjects.dispose();\n\t\tbindingStates.dispose();\n\t\tprogramCache.dispose();\n\n\t\txr.dispose();\n\n\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\tif ( _transmissionRenderTarget ) {\n\n\t\t\t_transmissionRenderTarget.dispose();\n\t\t\t_transmissionRenderTarget = null;\n\n\t\t}\n\n\t\tanimation.stop();\n\n\t};\n\n\t// Events\n\n\tfunction onContextLost( event ) {\n\n\t\tevent.preventDefault();\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t_isContextLost = true;\n\n\t}\n\n\tfunction onContextRestore( /* event */ ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t_isContextLost = false;\n\n\t\tconst infoAutoReset = info.autoReset;\n\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\tconst shadowMapType = shadowMap.type;\n\n\t\tinitGLContext();\n\n\t\tinfo.autoReset = infoAutoReset;\n\t\tshadowMap.enabled = shadowMapEnabled;\n\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\tshadowMap.type = shadowMapType;\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\tdeallocateMaterial( material );\n\n\t}\n\n\t// Buffer deallocation\n\n\tfunction deallocateMaterial( material ) {\n\n\t\treleaseMaterialProgramReferences( material );\n\n\t\tproperties.remove( material );\n\n\t}\n\n\n\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\tconst programs = properties.get( material ).programs;\n\n\t\tif ( programs !== undefined ) {\n\n\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t} );\n\n\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Buffer rendering\n\n\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t//\n\n\t\tlet index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\n\t\t//\n\n\t\tif ( index === null ) {\n\n\t\t\tif ( position === undefined || position.count === 0 ) return;\n\n\t\t} else if ( index.count === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t//\n\n\t\tlet rangeFactor = 1;\n\n\t\tif ( material.wireframe === true ) {\n\n\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\t\t\trangeFactor = 2;\n\n\t\t}\n\n\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\tlet attribute;\n\t\tlet renderer = bufferRenderer;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattribute = attributes.get( index );\n\n\t\t\trenderer = indexedBufferRenderer;\n\t\t\trenderer.setIndex( attribute );\n\n\t\t}\n\n\t\t//\n\n\t\tconst dataCount = ( index !== null ) ? index.count : position.count;\n\n\t\tconst rangeStart = geometry.drawRange.start * rangeFactor;\n\t\tconst rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\tconst groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\tconst groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\tconst drawStart = Math.max( rangeStart, groupStart );\n\t\tconst drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\tconst drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\t//\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\trenderer.setMode( 1 );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( 4 );\n\n\t\t\t}\n\n\t\t} else if ( object.isLine ) {\n\n\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\trenderer.setMode( 1 );\n\n\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\trenderer.setMode( 2 );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( 3 );\n\n\t\t\t}\n\n\t\t} else if ( object.isPoints ) {\n\n\t\t\trenderer.setMode( 0 );\n\n\t\t} else if ( object.isSprite ) {\n\n\t\t\trenderer.setMode( 4 );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\tconst instanceCount = Math.min( geometry.instanceCount, geometry._maxInstanceCount );\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t} else {\n\n\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t}\n\n\t};\n\n\t// Compile\n\n\tthis.compile = function ( scene, camera ) {\n\n\t\tcurrentRenderState = renderStates.get( scene );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcurrentRenderState.setupLights( _this.physicallyCorrectLights );\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tconst material = object.material;\n\n\t\t\tif ( material ) {\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\tgetProgram( material2, scene, object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\trenderStateStack.pop();\n\t\tcurrentRenderState = null;\n\n\t};\n\n\t// Animation Loop\n\n\tlet onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame( time ) {\n\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t}\n\n\tfunction onXRSessionStart() {\n\n\t\tanimation.stop();\n\n\t}\n\n\tfunction onXRSessionEnd() {\n\n\t\tanimation.start();\n\n\t}\n\n\tconst animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\n\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\t\txr.setAnimationLoop( callback );\n\n\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t};\n\n\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t// Rendering\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( _isContextLost === true ) return;\n\n\t\t// update scene graph\n\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t// update camera matrices and frustum\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t}\n\n\t\t//\n\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\tcurrentRenderList.init();\n\n\t\trenderListStack.push( currentRenderList );\n\n\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\tcurrentRenderList.finish();\n\n\t\tif ( _this.sortObjects === true ) {\n\n\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t//\n\n\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t//\n\n\t\tbackground.render( currentRenderList, scene );\n\n\t\t// render scene\n\n\t\tcurrentRenderState.setupLights( _this.physicallyCorrectLights );\n\n\t\tif ( camera.isArrayCamera ) {\n\n\t\t\tconst cameras = camera.cameras;\n\n\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t// _gl.finish();\n\n\t\tbindingStates.resetDefaultState();\n\t\t_currentMaterialId = - 1;\n\t\t_currentCamera = null;\n\n\t\trenderStateStack.pop();\n\n\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderState = null;\n\n\t\t}\n\n\t\trenderListStack.pop();\n\n\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderList = null;\n\n\t\t}\n\n\t};\n\n\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible ) {\n\n\t\t\tif ( object.isGroup ) {\n\n\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t// update skeleton only once in a frame\n\n\t\t\t\t\tif ( object.skeleton.frame !== info.render.frame ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\t\t\t\t\t\tobject.skeleton.frame = info.render.frame;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t}\n\n\t}\n\n\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\t\tconst transparentObjects = currentRenderList.transparent;\n\n\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, scene, camera );\n\n\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\tstate.buffers.depth.setTest( true );\n\t\tstate.buffers.depth.setMask( true );\n\t\tstate.buffers.color.setMask( true );\n\n\t\tstate.setPolygonOffset( false );\n\n\t}\n\n\tfunction renderTransmissionPass( opaqueObjects, scene, camera ) {\n\n\t\tconst isWebGL2 = capabilities.isWebGL2;\n\n\t\tif ( _transmissionRenderTarget === null ) {\n\n\t\t\t_transmissionRenderTarget = new WebGLRenderTarget( 1, 1, {\n\t\t\t\tgenerateMipmaps: true,\n\t\t\t\ttype: extensions.has( 'EXT_color_buffer_half_float' ) ? HalfFloatType : UnsignedByteType,\n\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\tsamples: ( isWebGL2 && _antialias === true ) ? 4 : 0\n\t\t\t} );\n\n\t\t}\n\n\t\t_this.getDrawingBufferSize( _vector2 );\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\t_transmissionRenderTarget.setSize( _vector2.x, _vector2.y );\n\n\t\t} else {\n\n\t\t\t_transmissionRenderTarget.setSize( floorPowerOfTwo( _vector2.x ), floorPowerOfTwo( _vector2.y ) );\n\n\t\t}\n\n\t\t//\n\n\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t_this.setRenderTarget( _transmissionRenderTarget );\n\t\t_this.clear();\n\n\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\tconst currentToneMapping = _this.toneMapping;\n\t\t_this.toneMapping = NoToneMapping;\n\n\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t_this.toneMapping = currentToneMapping;\n\n\t\ttextures.updateMultisampleRenderTarget( _transmissionRenderTarget );\n\t\ttextures.updateRenderTargetMipmap( _transmissionRenderTarget );\n\n\t\t_this.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\tconst object = renderItem.object;\n\t\t\tconst geometry = renderItem.geometry;\n\t\t\tconst material = overrideMaterial === null ? renderItem.material : overrideMaterial;\n\t\t\tconst group = renderItem.group;\n\n\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\tif ( material.transparent === true && material.side === DoubleSide ) {\n\n\t\t\tmaterial.side = BackSide;\n\t\t\tmaterial.needsUpdate = true;\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\tmaterial.side = FrontSide;\n\t\t\tmaterial.needsUpdate = true;\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\tmaterial.side = DoubleSide;\n\n\t\t} else {\n\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t}\n\n\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t}\n\n\tfunction getProgram( material, scene, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst lights = currentRenderState.state.lights;\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tconst lightsStateVersion = lights.state.version;\n\n\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\tlet programs = materialProperties.programs;\n\n\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tmaterialProperties.fog = scene.fog;\n\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\n\t\tif ( programs === undefined ) {\n\n\t\t\t// new material\n\n\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tprograms = new Map();\n\t\t\tmaterialProperties.programs = programs;\n\n\t\t}\n\n\t\tlet program = programs.get( programCacheKey );\n\n\t\tif ( program !== undefined ) {\n\n\t\t\t// early out if program and light state is identical\n\n\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\treturn program;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\tmaterial.onBuild( object, parameters, _this );\n\n\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t}\n\n\t\tconst uniforms = materialProperties.uniforms;\n\n\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t}\n\n\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t// store the light setup it was created for\n\n\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\tuniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;\n\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t}\n\n\t\tconst progUniforms = program.getUniforms();\n\t\tconst uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\tmaterialProperties.currentProgram = program;\n\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\treturn program;\n\n\t}\n\n\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tmaterialProperties.outputEncoding = parameters.outputEncoding;\n\t\tmaterialProperties.instancing = parameters.instancing;\n\t\tmaterialProperties.skinning = parameters.skinning;\n\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t}\n\n\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\ttextures.resetTextureUnits();\n\n\t\tconst fog = scene.fog;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tconst encoding = ( _currentRenderTarget === null ) ? _this.outputEncoding : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.encoding : LinearEncoding );\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\tconst vertexTangents = !! material.normalMap && !! geometry.attributes.tangent;\n\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\tconst morphColors = !! geometry.morphAttributes.color;\n\t\tconst toneMapping = material.toneMapped ? _this.toneMapping : NoToneMapping;\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tconst materialProperties = properties.get( material );\n\t\tconst lights = currentRenderState.state.lights;\n\n\t\tif ( _clippingEnabled === true ) {\n\n\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\tconst useCache =\n\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t// (#8465, #8379)\n\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet needsProgramChange = false;\n\n\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.outputEncoding !== encoding ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( capabilities.isWebGL2 === true && materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tneedsProgramChange = true;\n\t\t\tmaterialProperties.__version = material.version;\n\n\t\t}\n\n\t\t//\n\n\t\tlet program = materialProperties.currentProgram;\n\n\t\tif ( needsProgramChange === true ) {\n\n\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t}\n\n\t\tlet refreshProgram = false;\n\t\tlet refreshMaterial = false;\n\t\tlet refreshLights = false;\n\n\t\tconst p_uniforms = program.getUniforms(),\n\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\trefreshProgram = true;\n\t\t\trefreshMaterial = true;\n\t\t\trefreshLights = true;\n\n\t\t}\n\n\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t_currentMaterialId = material.id;\n\n\t\t\trefreshMaterial = true;\n\n\t\t}\n\n\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t}\n\n\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t}\n\n\t\t\t// load material specific uniforms\n\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\tmaterial.isShadowMaterial ||\n\t\t\t\tobject.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( skeleton ) {\n\n\t\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: SkinnedMesh can only be used with WebGL 2. With WebGL 1 OES_texture_float and vertex textures support is required.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined && capabilities.isWebGL2 === true ) ) {\n\n\t\t\tmorphtargets.update( object, geometry, material, program );\n\n\t\t}\n\n\n\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t}\n\n\t\tif ( refreshMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t// values\n\t\t\t\t//\n\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t// the GL state when required\n\n\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t}\n\n\t\t\t// refresh uniforms common to several materials\n\n\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t}\n\n\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget );\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\n\t\t}\n\n\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t}\n\n\t\t// common matrices\n\n\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\treturn program;\n\n\t}\n\n\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\tuniforms.directionalLights.needsUpdate = value;\n\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\tuniforms.pointLights.needsUpdate = value;\n\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\tuniforms.spotLights.needsUpdate = value;\n\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t}\n\n\tfunction materialNeedsLights( material ) {\n\n\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t}\n\n\tthis.getActiveCubeFace = function () {\n\n\t\treturn _currentActiveCubeFace;\n\n\t};\n\n\tthis.getActiveMipmapLevel = function () {\n\n\t\treturn _currentActiveMipmapLevel;\n\n\t};\n\n\tthis.getRenderTarget = function () {\n\n\t\treturn _currentRenderTarget;\n\n\t};\n\n\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = depthTexture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\tif ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;\n\n\t\t\tif ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );\n\t\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t};\n\n\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t_currentRenderTarget = renderTarget;\n\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\tlet useDefaultFramebuffer = true;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\tstate.bindFramebuffer( 36160, null );\n\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet framebuffer = null;\n\t\tlet isCube = false;\n\t\tlet isRenderTarget3D = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst texture = renderTarget.texture;\n\n\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture ) {\n\n\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t}\n\n\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\t\t\t\tisCube = true;\n\n\t\t\t} else if ( ( capabilities.isWebGL2 && renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t}\n\n\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t} else {\n\n\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t}\n\n\t\tconst framebufferBound = state.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( framebufferBound && capabilities.drawBuffers && useDefaultFramebuffer ) {\n\n\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport );\n\t\tstate.scissor( _currentScissor );\n\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\tif ( isCube ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t_gl.framebufferTexture2D( 36160, 36064, 34069 + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\tconst layer = activeCubeFace || 0;\n\t\t\t_gl.framebufferTextureLayer( 36160, 36064, textureProperties.__webglTexture, activeMipmapLevel || 0, layer );\n\n\t\t}\n\n\t\t_currentMaterialId = - 1; // reset current material to ensure correct uniform bindings\n\n\t};\n\n\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t}\n\n\t\tif ( framebuffer ) {\n\n\t\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\t\ttry {\n\n\t\t\t\tconst texture = renderTarget.texture;\n\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( 35739 ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || ( capabilities.isWebGL2 && extensions.has( 'EXT_color_buffer_float' ) ) );\n\n\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( 35738 ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.has( 'OES_texture_float' ) || extensions.has( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t! halfFloatSupportedByExt ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t}\n\n\t\t\t} finally {\n\n\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.copyFramebufferToTexture = function ( position, texture, level = 0 ) {\n\n\t\tif ( texture.isFramebufferTexture !== true ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: copyFramebufferToTexture() can only be used with FramebufferTexture.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst levelScale = Math.pow( 2, - level );\n\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t_gl.copyTexSubImage2D( 3553, level, 0, 0, position.x, position.y, width, height );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tconst width = srcTexture.image.width;\n\t\tconst height = srcTexture.image.height;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\n\t\ttextures.setTexture2D( dstTexture, 0 );\n\n\t\t// As another texture upload may have changed pixelStorei\n\t\t// parameters, make sure they are correct for the dstTexture\n\t\t_gl.pixelStorei( 37440, dstTexture.flipY );\n\t\t_gl.pixelStorei( 37441, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( 3317, dstTexture.unpackAlignment );\n\n\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t_gl.texSubImage2D( 3553, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t_gl.compressedTexSubImage2D( 3553, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage2D( 3553, level, position.x, position.y, glFormat, glType, srcTexture.image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( 3553 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tif ( _this.isWebGL1Renderer ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst width = sourceBox.max.x - sourceBox.min.x + 1;\n\t\tconst height = sourceBox.max.y - sourceBox.min.y + 1;\n\t\tconst depth = sourceBox.max.z - sourceBox.min.z + 1;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\t\tlet glTarget;\n\n\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\tglTarget = 32879;\n\n\t\t} else if ( dstTexture.isDataArrayTexture ) {\n\n\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\tglTarget = 35866;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_gl.pixelStorei( 37440, dstTexture.flipY );\n\t\t_gl.pixelStorei( 37441, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( 3317, dstTexture.unpackAlignment );\n\n\t\tconst unpackRowLen = _gl.getParameter( 3314 );\n\t\tconst unpackImageHeight = _gl.getParameter( 32878 );\n\t\tconst unpackSkipPixels = _gl.getParameter( 3316 );\n\t\tconst unpackSkipRows = _gl.getParameter( 3315 );\n\t\tconst unpackSkipImages = _gl.getParameter( 32877 );\n\n\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ 0 ] : srcTexture.image;\n\n\t\t_gl.pixelStorei( 3314, image.width );\n\t\t_gl.pixelStorei( 32878, image.height );\n\t\t_gl.pixelStorei( 3316, sourceBox.min.x );\n\t\t_gl.pixelStorei( 3315, sourceBox.min.y );\n\t\t_gl.pixelStorei( 32877, sourceBox.min.z );\n\n\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.' );\n\t\t\t\t_gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.pixelStorei( 3314, unpackRowLen );\n\t\t_gl.pixelStorei( 32878, unpackImageHeight );\n\t\t_gl.pixelStorei( 3316, unpackSkipPixels );\n\t\t_gl.pixelStorei( 3315, unpackSkipRows );\n\t\t_gl.pixelStorei( 32877, unpackSkipImages );\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.initTexture = function ( texture ) {\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.resetState = function () {\n\n\t\t_currentActiveCubeFace = 0;\n\t\t_currentActiveMipmapLevel = 0;\n\t\t_currentRenderTarget = null;\n\n\t\tstate.reset();\n\t\tbindingStates.reset();\n\n\t};\n\n\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t}\n\n}\n\nWebGLRenderer.prototype.isWebGLRenderer = true;\n\nclass WebGL1Renderer extends WebGLRenderer {}\n\nWebGL1Renderer.prototype.isWebGL1Renderer = true;\n\nclass FogExp2 {\n\n\tconstructor( color, density = 0.00025 ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = density;\n\n\t}\n\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\nFogExp2.prototype.isFogExp2 = true;\n\nclass Fog {\n\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\nFog.prototype.isFog = true;\n\nclass Scene extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.environment = null;\n\t\tthis.fog = null;\n\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t}\n\n}\n\nScene.prototype.isScene = true;\n\nclass InterleavedBuffer {\n\n\tconstructor( array, stride ) {\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= attribute.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.prototype.slice.call( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nInterleavedBuffer.prototype.isInterleavedBuffer = true;\n\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\nclass InterleavedBufferAttribute {\n\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\tthis.name = '';\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t}\n\n\tgetY( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t}\n\n\tgetZ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t}\n\n\tgetW( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// deinterleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interlaved attribtue\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\nInterleavedBufferAttribute.prototype.isInterleavedBufferAttribute = true;\n\nclass SpriteMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nSpriteMaterial.prototype.isSpriteMaterial = true;\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\nclass Sprite extends Object3D {\n\n\tconstructor( material ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0, 0,\n\t\t\t\t0.5, - 0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\tthis.geometry = _geometry;\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\tconsole.error( 'THREE.Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( - 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( - 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getUV( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nSprite.prototype.isSprite = true;\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\nclass LOD extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t},\n\t\t\tisLOD: {\n\t\t\t\tvalue: true,\n\t\t\t}\n\t\t} );\n\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\taddLevel( object, distance = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\nclass SkinnedMesh extends Mesh {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = 'attached';\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\treturn this;\n\n\t}\n\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === 'attached' ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === 'detached' ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\tboneTransform( index, target ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( target ).applyMatrix4( this.bindMatrix );\n\n\t\ttarget.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\ttarget.addScaledVector( _vector$5.copy( _basePosition ).applyMatrix4( _matrix ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\nSkinnedMesh.prototype.isSkinnedMesh = true;\n\nclass Bone extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\nBone.prototype.isBone = true;\n\nclass DataTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, encoding ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nDataTexture.prototype.isDataTexture = true;\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\n\nclass Skeleton {\n\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.bones = bones.slice( 0 );\n\t\tthis.boneInverses = boneInverses;\n\t\tthis.boneMatrices = null;\n\n\t\tthis.boneTexture = null;\n\t\tthis.boneTextureSize = 0;\n\n\t\tthis.frame = - 1;\n\n\t\tthis.init();\n\n\t}\n\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = ceilPowerOfTwo( size );\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\t\tthis.boneTextureSize = size;\n\n\t\treturn this;\n\n\t}\n\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tif ( typeof normalized === 'number' ) {\n\n\t\t\tmeshPerAttribute = normalized;\n\n\t\t\tnormalized = false;\n\n\t\t\tconsole.error( 'THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.' );\n\n\t\t}\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _mesh = /*@__PURE__*/ new Mesh();\n\nclass InstancedMesh extends Mesh {\n\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\t\tthis.instanceColor = null;\n\n\t\tthis.count = count;\n\n\t\tthis.frustumCulled = false;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\treturn this;\n\n\t}\n\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh.geometry = this.geometry;\n\t\t_mesh.material = this.material;\n\n\t\tif ( _mesh.material === undefined ) return;\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nInstancedMesh.prototype.isInstancedMesh = true;\n\nclass LineBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\nconst _start$1 = /*@__PURE__*/ new Vector3();\nconst _end$1 = /*@__PURE__*/ new Vector3();\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nclass Line extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t// we assume non-indexed geometry\n\n\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t_start$1.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t\t_end$1.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\t\tlineDistances[ i ] += _start$1.distanceTo( _end$1 );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.Line.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst vStart = new Vector3();\n\t\tconst vEnd = new Vector3();\n\t\tconst interSegment = new Vector3();\n\t\tconst interRay = new Vector3();\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst attributes = geometry.attributes;\n\t\t\tconst positionAttribute = attributes.position;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\t\tvStart.fromBufferAttribute( positionAttribute, a );\n\t\t\t\t\tvEnd.fromBufferAttribute( positionAttribute, b );\n\n\t\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\t\tvStart.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t\tvEnd.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nLine.prototype.isLine = true;\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\nclass LineSegments extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t// we assume non-indexed geometry\n\n\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\t\tconst lineDistances = [];\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.LineSegments.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nLineSegments.prototype.isLineSegments = true;\n\nclass LineLoop extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\nLineLoop.prototype.isLineLoop = true;\n\nclass PointsMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nPointsMaterial.prototype.isPointsMaterial = true;\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\nclass Points extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst attributes = geometry.attributes;\n\t\t\tconst positionAttribute = attributes.position;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Points.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nPoints.prototype.isPoints = true;\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\nclass VideoTexture extends Texture {\n\n\tconstructor( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearFilter;\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nVideoTexture.prototype.isVideoTexture = true;\n\nclass FramebufferTexture extends Texture {\n\n\tconstructor( width, height, format ) {\n\n\t\tsuper( { width, height } );\n\n\t\tthis.format = format;\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nFramebufferTexture.prototype.isFramebufferTexture = true;\n\nclass CompressedTexture extends Texture {\n\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\nCompressedTexture.prototype.isCompressedTexture = true;\n\nclass CanvasTexture extends Texture {\n\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nCanvasTexture.prototype.isCanvasTexture = true;\n\n/**\n * Extensible curve object.\n *\n * Some common of curve methods:\n * .getPoint( t, optionalTarget ), .getTangent( t, optionalTarget )\n * .getPointAt( u, optionalTarget ), .getTangentAt( u, optionalTarget )\n * .getPoints(), .getSpacedPoints()\n * .getLength()\n * .updateArcLengths()\n *\n * This following curves inherit from THREE.Curve:\n *\n * -- 2D curves --\n * THREE.ArcCurve\n * THREE.CubicBezierCurve\n * THREE.EllipseCurve\n * THREE.LineCurve\n * THREE.QuadraticBezierCurve\n * THREE.SplineCurve\n *\n * -- 3D curves --\n * THREE.CatmullRomCurve3\n * THREE.CubicBezierCurve3\n * THREE.LineCurve3\n * THREE.QuadraticBezierCurve3\n *\n * A series of curves can be represented as a THREE.CurvePath.\n *\n **/\n\nclass Curve {\n\n\tconstructor() {\n\n\t\tthis.type = 'Curve';\n\n\t\tthis.arcLengthDivisions = 200;\n\n\t}\n\n\t// Virtual base class method to overwrite and implement in subclasses\n\t//\t- t [0 .. 1]\n\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\tconsole.warn( 'THREE.Curve: .getPoint() not implemented.' );\n\t\treturn null;\n\n\t}\n\n\t// Get point at relative position in curve according to arc length\n\t// - u [0 .. 1]\n\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t// Get sequence of points using getPoint( t )\n\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get total curve arc length\n\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t// Get list of cumulative segment lengths\n\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\tgetUtoTmapping( u, distance ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t// Returns a unit vector tangent at t\n\t// In case any sub curve does not implement its tangent derivation,\n\t// 2 points a small delta apart will be used to find its gradient\n\t// which seems to give a reasonable approximation\n\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\tcomputeFrenetFrames( segments, closed ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass EllipseCurve extends Curve {\n\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\tgetPoint( t, optionalTarget ) {\n\n\t\tconst point = optionalTarget || new Vector2();\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\nEllipseCurve.prototype.isEllipseCurve = true;\n\nclass ArcCurve extends EllipseCurve {\n\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\nArcCurve.prototype.isArcCurve = true;\n\n/**\n * Centripetal CatmullRom Curve - which is useful for avoiding\n * cusps and self-intersections in non-uniform catmull rom curves.\n * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n *\n * curve.type accepts centripetal(default), chordal and catmullrom\n * curve.tension is used for catmullrom which defaults to 0.5\n */\n\n\n/*\nBased on an optimized c++ solution in\n - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n - http://ideone.com/NoEbVM\n\nThis CubicPoly class could be used for reusing some variables and calculations,\nbut for three.js curve use, it could be possible inlined and flatten into a single function call\nwhich can be placed in CurveUtils.\n*/\n\nfunction CubicPoly() {\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = new Vector3();\nconst px = new CubicPoly(), py = new CubicPoly(), pz = new CubicPoly();\n\nclass CatmullRomCurve3 extends Curve {\n\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\tthis.points = points;\n\t\tthis.closed = closed;\n\t\tthis.curveType = curveType;\n\t\tthis.tension = tension;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\nCatmullRomCurve3.prototype.isCatmullRomCurve3 = true;\n\n/**\n * Bezier Curves formulas obtained from\n * https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n */\n\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\nclass CubicBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nCubicBezierCurve.prototype.isCubicBezierCurve = true;\n\nclass CubicBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nCubicBezierCurve3.prototype.isCubicBezierCurve3 = true;\n\nclass LineCurve extends Curve {\n\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LineCurve';\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst tangent = optionalTarget || new Vector2();\n\n\t\ttangent.copy( this.v2 ).sub( this.v1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nLineCurve.prototype.isLineCurve = true;\n\nclass LineCurve3 extends Curve {\n\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LineCurve3';\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass QuadraticBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nQuadraticBezierCurve.prototype.isQuadraticBezierCurve = true;\n\nclass QuadraticBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nQuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true;\n\nclass SplineCurve extends Curve {\n\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SplineCurve';\n\n\t\tthis.points = points;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nSplineCurve.prototype.isSplineCurve = true;\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**************************************************************\n *\tCurved Path - a curve path is simply a array of connected\n * curves, but retains the api of a curve\n **************************************************************/\n\nclass CurvePath extends Curve {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\tthis.curves = [];\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t}\n\n\t}\n\n\t// To get accurate point with reference to\n\t// entire path distance at time t,\n\t// following has to be done:\n\n\t// 1. Length of each sub path have to be known\n\t// 2. Locate and identify type of curve\n\t// 3. Get t for the curve\n\t// 4. Return curve.getPointAt(t')\n\n\tgetPoint( t, optionalTarget ) {\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Path extends CurvePath {\n\n\tconstructor( points ) {\n\n\t\tsuper();\n\t\tthis.type = 'Path';\n\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tsplineThru( pts /*Array of Vector*/ ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LatheGeometry extends BufferGeometry {\n\n\tconstructor( points = [ new Vector2( 0, 0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, - 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\nclass CapsuleGeometry extends LatheGeometry {\n\n\tconstructor( radius = 1, length = 1, capSegments = 4, radialSegments = 8 ) {\n\n\t\tconst path = new Path();\n\t\tpath.absarc( 0, - length / 2, radius, Math.PI * 1.5, 0 );\n\t\tpath.absarc( 0, length / 2, radius, 0, Math.PI * 0.5 );\n\n\t\tsuper( path.getPoints( capSegments ), radialSegments );\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: length,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments );\n\n\t}\n\n}\n\nclass CircleGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, segments = 8, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass CylinderGeometry extends BufferGeometry {\n\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass ConeGeometry extends CylinderGeometry {\n\n\tconstructor( radius = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass PolyhedronGeometry extends BufferGeometry {\n\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1,\t- 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t1, - 1, - 1, 1, - 1, 1,\n\t\t\t1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = new Vector3();\nconst _v1$1 = new Vector3();\nconst _normal = new Vector3();\nconst _triangle = new Triangle();\n\nclass EdgesGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n}\n\nclass Shape extends Path {\n\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\tthis.holes = [];\n\n\t}\n\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Port from https://github.com/mapbox/earcut (v2.2.2)\n */\n\nconst Earcut = {\n\n\ttriangulate: function ( data, holeIndices, dim = 2 ) {\n\n\t\tconst hasHoles = holeIndices && holeIndices.length;\n\t\tconst outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length;\n\t\tlet outerNode = linkedList( data, 0, outerLen, dim, true );\n\t\tconst triangles = [];\n\n\t\tif ( ! outerNode || outerNode.next === outerNode.prev ) return triangles;\n\n\t\tlet minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t\tif ( data.length > 80 * dim ) {\n\n\t\t\tminX = maxX = data[ 0 ];\n\t\t\tminY = maxY = data[ 1 ];\n\n\t\t\tfor ( let i = dim; i < outerLen; i += dim ) {\n\n\t\t\t\tx = data[ i ];\n\t\t\t\ty = data[ i + 1 ];\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 1 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize );\n\n\t\treturn triangles;\n\n\t}\n\n};\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tlet i, last;\n\n\tif ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {\n\n\t\tfor ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t} else {\n\n\t\tfor ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t}\n\n\tif ( last && equals( last, last.next ) ) {\n\n\t\tremoveNode( last );\n\t\tlast = last.next;\n\n\t}\n\n\treturn last;\n\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tlet p = start,\n\t\tagain;\n\tdo {\n\n\t\tagain = false;\n\n\t\tif ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {\n\n\t\t\tremoveNode( p );\n\t\t\tp = end = p.prev;\n\t\t\tif ( p === p.next ) break;\n\t\t\tagain = true;\n\n\t\t} else {\n\n\t\t\tp = p.next;\n\n\t\t}\n\n\t} while ( again || p !== end );\n\n\treturn end;\n\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tlet stop = ear,\n\t\tprev, next;\n\n\t// iterate through ears, slicing them one by one\n\twhile ( ear.prev !== ear.next ) {\n\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {\n\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push( prev.i / dim );\n\t\t\ttriangles.push( ear.i / dim );\n\t\t\ttriangles.push( next.i / dim );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertex leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\n\t\t\tif ( ! pass ) {\n\n\t\t\t\tearcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\n\t\t\t} else if ( pass === 1 ) {\n\n\t\t\t\tear = cureLocalIntersections( filterPoints( ear ), triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\t\t\t// as a last resort, try splitting the remaining polygon into two\n\n\t\t\t} else if ( pass === 2 ) {\n\n\t\t\t\tsplitEarcut( ear, triangles, dim, minX, minY, invSize );\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar( ear ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tlet p = ear.next.next;\n\n\twhile ( p !== ear.prev ) {\n\n\t\tif ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ),\n\t\tminTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ),\n\t\tmaxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ),\n\t\tmaxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y );\n\n\t// z-order range for the current triangle bbox;\n\tconst minZ = zOrder( minTX, minTY, minX, minY, invSize ),\n\t\tmaxZ = zOrder( maxTX, maxTY, minX, minY, invSize );\n\n\tlet p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile ( p && p.z >= minZ && n && n.z <= maxZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t\tif ( n !== ear.prev && n !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) &&\n\t\t\tarea( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile ( n && n.z <= maxZ ) {\n\n\t\tif ( n !== ear.prev && n !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) &&\n\t\t\tarea( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tconst a = p.prev,\n\t\t\tb = p.next.next;\n\n\t\tif ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {\n\n\t\t\ttriangles.push( a.i / dim );\n\t\t\ttriangles.push( p.i / dim );\n\t\t\ttriangles.push( b.i / dim );\n\n\t\t\t// remove two nodes involved\n\t\t\tremoveNode( p );\n\t\t\tremoveNode( p.next );\n\n\t\t\tp = start = b;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn filterPoints( p );\n\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\tlet a = start;\n\tdo {\n\n\t\tlet b = a.next.next;\n\t\twhile ( b !== a.prev ) {\n\n\t\t\tif ( a.i !== b.i && isValidDiagonal( a, b ) ) {\n\n\t\t\t\t// split the polygon in two by the diagonal\n\t\t\t\tlet c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\n\t\t\t\ta = filterPoints( a, a.next );\n\t\t\t\tc = filterPoints( c, c.next );\n\n\t\t\t\t// run earcut on each half\n\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tb = b.next;\n\n\t\t}\n\n\t\ta = a.next;\n\n\t} while ( a !== start );\n\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tconst queue = [];\n\tlet i, len, start, end, list;\n\n\tfor ( i = 0, len = holeIndices.length; i < len; i ++ ) {\n\n\t\tstart = holeIndices[ i ] * dim;\n\t\tend = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;\n\t\tlist = linkedList( data, start, end, dim, false );\n\t\tif ( list === list.next ) list.steiner = true;\n\t\tqueue.push( getLeftmost( list ) );\n\n\t}\n\n\tqueue.sort( compareX );\n\n\t// process holes from left to right\n\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\teliminateHole( queue[ i ], outerNode );\n\t\touterNode = filterPoints( outerNode, outerNode.next );\n\n\t}\n\n\treturn outerNode;\n\n}\n\nfunction compareX( a, b ) {\n\n\treturn a.x - b.x;\n\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole( hole, outerNode ) {\n\n\touterNode = findHoleBridge( hole, outerNode );\n\tif ( outerNode ) {\n\n\t\tconst b = splitPolygon( outerNode, hole );\n\n\t\t// filter collinear points around the cuts\n\t\tfilterPoints( outerNode, outerNode.next );\n\t\tfilterPoints( b, b.next );\n\n\t}\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge( hole, outerNode ) {\n\n\tlet p = outerNode;\n\tconst hx = hole.x;\n\tconst hy = hole.y;\n\tlet qx = - Infinity, m;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tconst x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\t\t\t\tif ( x === hx ) {\n\n\t\t\t\t\tif ( hy === p.y ) return p;\n\t\t\t\t\tif ( hy === p.next.y ) return p.next;\n\n\t\t\t\t}\n\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== outerNode );\n\n\tif ( ! m ) return null;\n\n\tif ( hx === qx ) return m; // hole touches outer segment; pick leftmost endpoint\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tconst stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y;\n\tlet tanMin = Infinity, tan;\n\n\tp = m;\n\n\tdo {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\tpointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {\n\n\t\t\ttan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential\n\n\t\t\tif ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) {\n\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== stop );\n\n\treturn m;\n\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector( m, p ) {\n\n\treturn area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0;\n\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tif ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize );\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked( p );\n\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked( list ) {\n\n\tlet i, p, q, e, tail, numMerges, pSize, qSize,\n\t\tinSize = 1;\n\n\tdo {\n\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile ( p ) {\n\n\t\t\tnumMerges ++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\t\t\tfor ( i = 0; i < inSize; i ++ ) {\n\n\t\t\t\tpSize ++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif ( ! q ) break;\n\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile ( pSize > 0 || ( qSize > 0 && q ) ) {\n\n\t\t\t\tif ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {\n\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize --;\n\n\t\t\t\t} else {\n\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize --;\n\n\t\t\t\t}\n\n\t\t\t\tif ( tail ) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\n\t\t\t}\n\n\t\t\tp = q;\n\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\n\t} while ( numMerges > 1 );\n\n\treturn list;\n\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = 32767 * ( x - minX ) * invSize;\n\ty = 32767 * ( y - minY ) * invSize;\n\n\tx = ( x | ( x << 8 ) ) & 0x00FF00FF;\n\tx = ( x | ( x << 4 ) ) & 0x0F0F0F0F;\n\tx = ( x | ( x << 2 ) ) & 0x33333333;\n\tx = ( x | ( x << 1 ) ) & 0x55555555;\n\n\ty = ( y | ( y << 8 ) ) & 0x00FF00FF;\n\ty = ( y | ( y << 4 ) ) & 0x0F0F0F0F;\n\ty = ( y | ( y << 2 ) ) & 0x33333333;\n\ty = ( y | ( y << 1 ) ) & 0x55555555;\n\n\treturn x | ( y << 1 );\n\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost( start ) {\n\n\tlet p = start,\n\t\tleftmost = start;\n\tdo {\n\n\t\tif ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn leftmost;\n\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 &&\n\t\t\t( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 &&\n\t\t\t( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0;\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // doesn't intersect other edges\n\t\t( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible\n\t\t( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors\n\t\tequals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case\n\n}\n\n// signed area of a triangle\nfunction area( p, q, r ) {\n\n\treturn ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );\n\n}\n\n// check if two points are equal\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tconst o1 = sign( area( p1, q1, p2 ) );\n\tconst o2 = sign( area( p1, q1, q2 ) );\n\tconst o3 = sign( area( p2, q2, p1 ) );\n\tconst o4 = sign( area( p2, q2, q1 ) );\n\n\tif ( o1 !== o2 && o3 !== o4 ) return true; // general case\n\n\tif ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n\tif ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n\tif ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n\tif ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n\treturn false;\n\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment( p, q, r ) {\n\n\treturn q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y );\n\n}\n\nfunction sign( num ) {\n\n\treturn num > 0 ? 1 : num < 0 ? - 1 : 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon( a, b ) {\n\n\tlet p = a;\n\tdo {\n\n\t\tif ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\t\tintersects( p, p.next, a, b ) ) return true;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn false;\n\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside( a, b ) {\n\n\treturn area( a.prev, a, a.next ) < 0 ?\n\t\tarea( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :\n\t\tarea( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;\n\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside( a, b ) {\n\n\tlet p = a,\n\t\tinside = false;\n\tconst px = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) )\n\t\t\tinside = ! inside;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn inside;\n\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon( a, b ) {\n\n\tconst a2 = new Node( a.i, a.x, a.y ),\n\t\tb2 = new Node( b.i, b.x, b.y ),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode( i, x, y, last ) {\n\n\tconst p = new Node( i, x, y );\n\n\tif ( ! last ) {\n\n\t\tp.prev = p;\n\t\tp.next = p;\n\n\t} else {\n\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\n\t}\n\n\treturn p;\n\n}\n\nfunction removeNode( p ) {\n\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif ( p.prevZ ) p.prevZ.nextZ = p.nextZ;\n\tif ( p.nextZ ) p.nextZ.prevZ = p.prevZ;\n\n}\n\nfunction Node( i, x, y ) {\n\n\t// vertex index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertex nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = null;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n\n}\n\nfunction signedArea( data, start, end, dim ) {\n\n\tlet sum = 0;\n\tfor ( let i = start, j = end - dim; i < end; i += dim ) {\n\n\t\tsum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );\n\t\tj = i;\n\n\t}\n\n\treturn sum;\n\n}\n\nclass ShapeUtils {\n\n\t// calculate area of the contour polygon\n\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n * curveSegments: , // number of points on the curves\n * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n * depth: , // Depth to extrude the shape\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into the original shape bevel goes\n * bevelSize: , // how far from shape outline (including bevelOffset) is bevel\n * bevelOffset: , // how far from shape outline does bevel start\n * bevelSegments: , // number of bevel layers\n *\n * extrudePath: // curve to extrude shape along\n *\n * UVGenerator: // object that provides UV generator functions\n *\n * }\n */\n\nclass ExtrudeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( - 0.5, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tlet depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t// deprecated options\n\n\t\t\tif ( options.amount !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ExtrudeBufferGeometry: amount has been renamed to depth.' );\n\t\t\t\tdepth = options.amount;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length, flen = faces.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t// but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\n\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t///// Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t- 1, t, 0, \t1, t, 0, \t- 1, - t, 0, \t1, - t, 0,\n\t\t\t0, - 1, t, \t0, 1, t,\t0, - 1, - t, \t0, 1, - t,\n\t\t\tt, 0, - 1, \tt, 0, 1, \t- t, 0, - 1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t- 1, 0, 0,\t0, 1, 0,\n\t\t\t0, - 1, 0, \t0, 0, 1,\t0, 0, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass RingGeometry extends BufferGeometry {\n\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 8, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass ShapeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// incides\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\nclass SphereGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy == 0 && thetaStart == 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy == heightSegments && thetaEnd == Math.PI ) {\n\n\t\t\t\tuOffset = - 0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t- 1, - 1, 1, \t- 1, 1, - 1, \t1, - 1, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass TorusGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 8, tubularSegments = 6, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\nclass TorusKnotGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\nclass TubeGeometry extends BufferGeometry {\n\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( - 1, - 1, 0 ), new Vector3( - 1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\nclass WireframeGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\t\tthis.type = 'WireframeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tBoxBufferGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCapsuleBufferGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tCircleBufferGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tConeBufferGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tCylinderBufferGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tDodecahedronBufferGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tExtrudeBufferGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tIcosahedronBufferGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tLatheBufferGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tOctahedronBufferGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPlaneBufferGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tPolyhedronBufferGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tRingBufferGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tShapeBufferGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tSphereBufferGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTetrahedronBufferGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusBufferGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTorusKnotBufferGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tTubeBufferGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\nclass ShadowMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\tthis.color = new Color( 0x000000 );\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nShadowMaterial.prototype.isShadowMaterial = true;\n\nclass RawShaderMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\nRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\nclass MeshStandardMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 1.0;\n\t\tthis.metalness = 0.0;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.clearcoatMap = null;\n\t\tthis.clearcoatRoughness = 0.0;\n\t\tthis.clearcoatRoughnessMap = null;\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\t\tthis.clearcoatNormalMap = null;\n\n\t\tthis.ior = 1.5;\n\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\tthis.sheenColor = new Color( 0x000000 );\n\t\tthis.sheenColorMap = null;\n\t\tthis.sheenRoughness = 1.0;\n\t\tthis.sheenRoughnessMap = null;\n\n\t\tthis.transmissionMap = null;\n\n\t\tthis.thickness = 0;\n\t\tthis.thicknessMap = null;\n\t\tthis.attenuationDistance = 0.0;\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\tthis.specularIntensity = 1.0;\n\t\tthis.specularIntensityMap = null;\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\t\tthis.specularColorMap = null;\n\n\t\tthis._sheen = 0.0;\n\t\tthis._clearcoat = 0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.ior = source.ior;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\nclass MeshPhongMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\nclass MeshToonMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\t\tthis.gradientMap = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\nclass MeshNormalMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\nclass MeshLambertMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\nclass MeshMatcapMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.matcap = null;\n\n\t\tthis.map = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshMatcapMaterial.prototype.isMeshMatcapMaterial = true;\n\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\nLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\nconst materialLib = {\n\tShadowMaterial,\n\tSpriteMaterial,\n\tRawShaderMaterial,\n\tShaderMaterial,\n\tPointsMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMeshPhongMaterial,\n\tMeshToonMaterial,\n\tMeshNormalMaterial,\n\tMeshLambertMaterial,\n\tMeshDepthMaterial,\n\tMeshDistanceMaterial,\n\tMeshBasicMaterial,\n\tMeshMatcapMaterial,\n\tLineDashedMaterial,\n\tLineBasicMaterial,\n\tMaterial\n};\n\nMaterial.fromType = function ( type ) {\n\n\treturn new materialLib[ type ]();\n\n};\n\nconst AnimationUtils = {\n\n\t// same as Array.prototype.slice, but also works on typed arrays\n\tarraySlice: function ( array, from, to ) {\n\n\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t// in ios9 array.subarray(from, undefined) will return empty array\n\t\t\t// but array.subarray(from) or array.subarray(from, len) is correct\n\t\t\treturn new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );\n\n\t\t}\n\n\t\treturn array.slice( from, to );\n\n\t},\n\n\t// converts an array to a specific type\n\tconvertArray: function ( array, type, forceClone ) {\n\n\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\treturn new type( array ); // create typed array\n\n\t\t}\n\n\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t},\n\n\tisTypedArray: function ( object ) {\n\n\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t! ( object instanceof DataView );\n\n\t},\n\n\t// returns an array by which times and values can be sorted\n\tgetKeyframeOrder: function ( times ) {\n\n\t\tfunction compareTime( i, j ) {\n\n\t\t\treturn times[ i ] - times[ j ];\n\n\t\t}\n\n\t\tconst n = times.length;\n\t\tconst result = new Array( n );\n\t\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\tresult.sort( compareTime );\n\n\t\treturn result;\n\n\t},\n\n\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\tsortedArray: function ( values, stride, order ) {\n\n\t\tconst nValues = values.length;\n\t\tconst result = new values.constructor( nValues );\n\n\t\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\tconst srcOffset = order[ i ] * stride;\n\n\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\t// function for parsing AOS keyframe formats\n\tflattenJSON: function ( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tlet i = 1, key = jsonKeys[ 0 ];\n\n\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t}\n\n\t\tif ( key === undefined ) return; // no data\n\n\t\tlet value = key[ valuePropertyName ];\n\t\tif ( value === undefined ) return; // no data\n\n\t\tif ( Array.isArray( value ) ) {\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t} else if ( value.toArray !== undefined ) {\n\n\t\t\t// ...assume THREE.Math-ish\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t} else {\n\n\t\t\t// otherwise push as-is\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t}\n\n\t},\n\n\tsubclip: function ( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\t\tconst clip = sourceClip.clone();\n\n\t\tclip.name = name;\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\t\tconst track = clip.tracks[ i ];\n\t\t\tconst valueSize = track.getValueSize();\n\n\t\t\tconst times = [];\n\t\t\tconst values = [];\n\n\t\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( times.length === 0 ) continue;\n\n\t\t\ttrack.times = AnimationUtils.convertArray( times, track.times.constructor );\n\t\t\ttrack.values = AnimationUtils.convertArray( values, track.values.constructor );\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\tclip.tracks = tracks;\n\n\t\t// find minimum .times value across all tracks in the trimmed clip\n\n\t\tlet minStartTime = Infinity;\n\n\t\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// shift all tracks such that clip begins at t=0\n\n\t\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\t\tclip.tracks[ i ].shift( - 1 * minStartTime );\n\n\t\t}\n\n\t\tclip.resetDuration();\n\n\t\treturn clip;\n\n\t},\n\n\tmakeClipAdditive: function ( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\t\tif ( fps <= 0 ) fps = 30;\n\n\t\tconst numTracks = referenceClip.tracks.length;\n\t\tconst referenceTime = referenceFrame / fps;\n\n\t\t// Make each track's values relative to the values at the reference frame\n\t\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t\t// Skip this track if it's non-numeric\n\t\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t\t} );\n\n\t\t\tif ( targetTrack === undefined ) continue;\n\n\t\t\tlet referenceOffset = 0;\n\t\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t\t}\n\n\t\t\tlet targetOffset = 0;\n\t\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t\t}\n\n\t\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\t\tlet referenceValue;\n\n\t\t\t// Find the value to subtract out of the track\n\t\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\t\tconst startIndex = referenceOffset;\n\t\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\t\treferenceValue = AnimationUtils.arraySlice( referenceTrack.values, startIndex, endIndex );\n\n\t\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\t\treferenceValue = AnimationUtils.arraySlice( referenceTrack.values, startIndex, endIndex );\n\n\t\t\t} else {\n\n\t\t\t\t// Interpolate to the reference value\n\t\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\t\tconst startIndex = referenceOffset;\n\t\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\t\treferenceValue = AnimationUtils.arraySlice( interpolant.resultBuffer, startIndex, endIndex );\n\n\t\t\t}\n\n\t\t\t// Conjugate the quaternion\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t\t}\n\n\t\t\t// Subtract the reference value from all of the track values\n\n\t\t\tconst numTimes = targetTrack.times.length;\n\t\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\t\tvalueStart,\n\t\t\t\t\t\treferenceValue,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\t\tvalueStart\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\t\treturn targetClip;\n\n\t}\n\n};\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References:\n *\n * \t\thttp://www.oodesign.com/template-method-pattern.html\n *\n */\n\nclass Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t\tthis.settings = null;\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t// Template methods for derived classes:\n\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n// ALIAS DEFINITIONS\n\nInterpolant.prototype.beforeStart_ = Interpolant.prototype.copySampleValue_;\nInterpolant.prototype.afterEnd_ = Interpolant.prototype.copySampleValue_;\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n */\n\nclass CubicInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = - 0;\n\t\tthis._offsetPrev = - 0;\n\t\tthis._weightNext = - 0;\n\t\tthis._offsetNext = - 0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1;\n\t\tconst s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nclass LinearInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n *\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n */\n\nclass DiscreteInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\nclass KeyframeTrack {\n\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t// Serialization (in static context, because of constructor invocation\n\t// and automatic invocation of .toJSON):\n\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t// move all keyframes either forwards or backwards in time\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== - 1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\tthis.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t// removes equivalent sequential keys as common in morph target sequences\n\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\toptimize() {\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = AnimationUtils.arraySlice( this.times ),\n\t\t\tvalues = AnimationUtils.arraySlice( this.values ),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst times = AnimationUtils.arraySlice( this.times, 0 );\n\t\tconst values = AnimationUtils.arraySlice( this.values, 0 );\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A Track of Boolean keyframe values.\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {}\n\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of keyframe values that represent color.\n */\nclass ColorKeyframeTrack extends KeyframeTrack {}\n\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A Track of numeric keyframe values.\n */\nclass NumberKeyframeTrack extends KeyframeTrack {}\n\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n */\n\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A Track of quaternion keyframe values.\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\nQuaternionKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track that interpolates Strings\n */\nclass StringKeyframeTrack extends KeyframeTrack {}\n\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\nStringKeyframeTrack.prototype.ValueBufferType = Array;\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of vectored keyframe values.\n */\nclass VectorKeyframeTrack extends KeyframeTrack {}\n\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\nclass AnimationClip {\n\n\tconstructor( name, duration = - 1, tracks, blendMode = NormalAnimationBlendMode ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = duration;\n\t\tthis.blendMode = blendMode;\n\n\t\tthis.uuid = generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\treturn clip;\n\n\t}\n\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = AnimationUtils.getKeyframeOrder( times );\n\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, - 1, tracks );\n\n\t}\n\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t// parse the animation.hierarchy format\n\tstatic parseAnimation( animation, bones ) {\n\n\t\tif ( ! animation ) {\n\n\t\t\tconsole.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || - 1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\treturn new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\nconst Cache = {\n\n\tenabled: false,\n\n\tfiles: {},\n\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\nclass LoadingManager {\n\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t}\n\n}\n\nconst DefaultLoadingManager = new LoadingManager();\n\nclass Loader {\n\n\tconstructor( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.crossOrigin = 'anonymous';\n\t\tthis.withCredentials = false;\n\t\tthis.path = '';\n\t\tthis.resourcePath = '';\n\t\tthis.requestHeader = {};\n\n\t}\n\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\tparse( /* data */ ) {}\n\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n}\n\nconst loading = {};\n\nclass FileLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\t// An abort controller could be added within a future PR\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\t\t\t\t\tconst contentLength = response.headers.get( 'Content-Length' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow Error( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}` );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === undefined ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( url, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n}\n\nclass AnimationLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract Base class to block based textures loader (dds, pvr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass CompressedTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass ImageLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tCache.add( url, this );\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n}\n\nclass CubeTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass DataTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tconst texData = scope.parse( buffer );\n\n\t\t\tif ( ! texData ) return;\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.encoding !== undefined ) {\n\n\t\t\t\ttexture.encoding = texData.encoding;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass TextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass Light extends Object3D {\n\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity;\n\n\t}\n\n\tdispose() {\n\n\t\t// Empty here in base class; some subclasses override.\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\treturn data;\n\n\t}\n\n}\n\nLight.prototype.isLight = true;\n\nclass HemisphereLight extends Light {\n\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n}\n\nHemisphereLight.prototype.isHemisphereLight = true;\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();\nconst _lookTarget$1 = /*@__PURE__*/ new Vector3();\n\nclass LightShadow {\n\n\tconstructor( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.normalBias = 0;\n\t\tthis.radius = 1;\n\t\tthis.blurSamples = 8;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.mapPass = null;\n\t\tthis.matrix = new Matrix4();\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld$1 );\n\n\t\t_lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget$1 );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix$1 );\n\n\t\tshadowMatrix.set(\n\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t);\n\n\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t}\n\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\nclass SpotLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\tthis.focus = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = this.mapSize.width / this.mapSize.height;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\nSpotLightShadow.prototype.isSpotLightShadow = true;\n\nclass SpotLight extends Light {\n\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 1 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.distance = distance;\n\t\tthis.angle = angle;\n\t\tthis.penumbra = penumbra;\n\t\tthis.decay = decay; // for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nSpotLight.prototype.isSpotLight = true;\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\nclass PointLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t// xzXZ\n\t\t\t// y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t\t];\n\n\t\tthis._cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t}\n\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t}\n\n}\n\nPointLightShadow.prototype.isPointLightShadow = true;\n\nclass PointLight extends Light {\n\n\tconstructor( color, intensity, distance = 0, decay = 1 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tthis.distance = distance;\n\t\tthis.decay = decay; // for physically correct lights, should be 2.\n\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nPointLight.prototype.isPointLight = true;\n\nclass DirectionalLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n}\n\nDirectionalLightShadow.prototype.isDirectionalLightShadow = true;\n\nclass DirectionalLight extends Light {\n\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nDirectionalLight.prototype.isDirectionalLight = true;\n\nclass AmbientLight extends Light {\n\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\nAmbientLight.prototype.isAmbientLight = true;\n\nclass RectAreaLight extends Light {\n\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\nRectAreaLight.prototype.isRectAreaLight = true;\n\n/**\n * Primary reference:\n * https://graphics.stanford.edu/papers/envmap/envmap.pdf\n *\n * Secondary reference:\n * https://www.ppsloan.org/publications/StupidSH36.pdf\n */\n\n// 3-band SH defined by 9 coefficients\n\nclass SphericalHarmonics3 {\n\n\tconstructor() {\n\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// get the radiance in the direction of the normal\n\t// target is a Vector3\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t// get the irradiance (radiance convolved with cosine lobe) in the direction of the normal\n\t// target is a Vector3\n\t// https://graphics.stanford.edu/papers/envmap/envmap.pdf\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t// evaluate the basis functions\n\t// shBasis is an Array[ 9 ]\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\nSphericalHarmonics3.prototype.isSphericalHarmonics3 = true;\n\nclass LightProbe extends Light {\n\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\nLightProbe.prototype.isLightProbe = true;\n\nclass MaterialLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\t\tthis.textures = {};\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = Material.fromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== 1 ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Deprecated\n\n\t\tif ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n}\n\nclass LoaderUtils {\n\n\tstatic decodeText( array ) {\n\n\t\tif ( typeof TextDecoder !== 'undefined' ) {\n\n\t\t\treturn new TextDecoder().decode( array );\n\n\t\t}\n\n\t\t// Avoid the String.fromCharCode.apply(null, array) shortcut, which\n\t\t// throws a \"maximum call stack size exceeded\" error for large arrays.\n\n\t\tlet s = '';\n\n\t\tfor ( let i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t// Implicitly assumes little-endian.\n\t\t\ts += String.fromCharCode( array[ i ] );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\t// merges multi-byte utf-8 characters.\n\n\t\t\treturn decodeURIComponent( escape( s ) );\n\n\t\t} catch ( e ) { // see #16358\n\n\t\t\treturn s;\n\n\t\t}\n\n\t}\n\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === - 1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON( this );\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\nclass BufferGeometryLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tif ( attribute.updateRange !== undefined ) {\n\n\t\t\t\tbufferAttribute.updateRange.offset = attribute.updateRange.offset;\n\t\t\t\tbufferAttribute.updateRange.count = attribute.updateRange.count;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tconst center = new Vector3();\n\n\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t}\n\n\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\nclass ObjectLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ] instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\n\t\treturn object;\n\n\t}\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\tconsole.error( 'THREE.ObjectLoader: The legacy Geometry type is no longer supported.' );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( `THREE.ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.type === 'MultiMaterial' ) {\n\n\t\t\t\t\t// Deprecated\n\n\t\t\t\t\tconst array = [];\n\n\t\t\t\t\tfor ( let j = 0; j < data.materials.length; j ++ ) {\n\n\t\t\t\t\t\tconst material = data.materials[ j ];\n\n\t\t\t\t\t\tif ( cache[ material.uuid ] === undefined ) {\n\n\t\t\t\t\t\t\tcache[ material.uuid ] = loader.parse( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tarray.push( cache[ material.uuid ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterials[ data.uuid ] = array;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.encoding !== undefined ) texture.encoding = data.encoding;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/* DEPRECATED */\n\n\tsetTexturePath( value ) {\n\n\t\tconsole.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' );\n\t\treturn this.setResourcePath( value );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nclass ImageBitmapLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t}\n\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\n\t\tfetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( url, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n}\n\nImageBitmapLoader.prototype.isImageBitmapLoader = true;\n\nlet _context;\n\nconst AudioContext = {\n\n\tgetContext: function () {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t},\n\n\tsetContext: function ( value ) {\n\n\t\t_context = value;\n\n\t}\n\n};\n\nclass AudioLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n}\n\nclass HemisphereLightProbe extends LightProbe {\n\n\tconstructor( skyColor, groundColor, intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tconst color1 = new Color().set( skyColor );\n\t\tconst color2 = new Color().set( groundColor );\n\n\t\tconst sky = new Vector3( color1.r, color1.g, color1.b );\n\t\tconst ground = new Vector3( color2.r, color2.g, color2.b );\n\n\t\t// without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI );\n\t\tconst c0 = Math.sqrt( Math.PI );\n\t\tconst c1 = c0 * Math.sqrt( 0.75 );\n\n\t\tthis.sh.coefficients[ 0 ].copy( sky ).add( ground ).multiplyScalar( c0 );\n\t\tthis.sh.coefficients[ 1 ].copy( sky ).sub( ground ).multiplyScalar( c1 );\n\n\t}\n\n}\n\nHemisphereLightProbe.prototype.isHemisphereLightProbe = true;\n\nclass AmbientLightProbe extends LightProbe {\n\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tconst color1 = new Color().set( color );\n\n\t\t// without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI );\n\t\tthis.sh.coefficients[ 0 ].set( color1.r, color1.g, color1.b ).multiplyScalar( 2 * Math.sqrt( Math.PI ) );\n\n\t}\n\n}\n\nAmbientLightProbe.prototype.isAmbientLightProbe = true;\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\nclass StereoCamera {\n\n\tconstructor() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\nclass Clock {\n\n\tconstructor( autoStart = true ) {\n\n\t\tthis.autoStart = autoStart;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tstart() {\n\n\t\tthis.startTime = now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nfunction now() {\n\n\treturn ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\nconst _orientation$1 = /*@__PURE__*/ new Vector3();\n\nclass AudioListener extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\t\tconst up = this.up;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t_orientation$1.set( 0, 0, - 1 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _orientation$1.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _orientation$1.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _orientation$1.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass Audio extends Object3D {\n\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.listener = listener;\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.detune = 0;\n\t\tthis.loop = false;\n\t\tthis.loopStart = 0;\n\t\tthis.loopEnd = 0;\n\t\tthis.offset = 0;\n\t\tthis.duration = undefined;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.source = null;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\tthis.filters = [];\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tthis.source.stop();\n\t\tthis.source.onended = null;\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.source.detune === undefined ) return; // only set detune when available\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\n\t}\n\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\nclass PositionalAudio extends Audio {\n\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass AudioAnalyser {\n\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\nclass PropertyMixer {\n\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'accu'\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'add'\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t// apply the state of 'accu' to the binding when accus differ\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// remember the state of the bound property and copy it to both accus\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t// apply the state previously taken via 'saveOriginalState' to the binding\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\nclass PropertyBinding {\n\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\tstatic create( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name Node name to be sanitized.\n\t * @return {string}\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== - 1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t// create getter / setter pair for a property in the scene graph\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\\'t found.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.geometry.isBufferGeometry ) {\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n *\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n *\n * - Instead pass this object as 'root'.\n *\n * - You can also add and remove objects later when the mixer\n * is running.\n *\n * Note:\n *\n * Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done\n * on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the\n * all objects in the group.\n *\n * - A single property can either be controlled through a\n * target group or directly, but not both.\n */\n\nclass AnimationObjectGroup {\n\n\tconstructor() {\n\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\tconsole.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// remove & forget\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\nAnimationObjectGroup.prototype.isAnimationObjectGroup = true;\n\nclass AnimationAction {\n\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = - 1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; // no. of repetitions when looping\n\n\t\tthis.paused = false; // true -> zero effective time scale\n\t\tthis.enabled = true; // false -> zero effective weight\n\n\t\tthis.clampWhenFinished = false;// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart = true;// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd = true;// clips for start, loop and end\n\n\t}\n\n\t// State & Scheduling\n\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = - 1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t// return true when play has been called\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t// Weight\n\n\t// set the weight stopping any scheduled fading\n\t// although .enabled = false yields an effective weight of zero, this\n\t// method does *not* change .enabled, because it would be confusing\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t// return the weight considering fading and .enabled\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\tcrossFadeFrom( fadeOutAction, duration, warp ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcrossFadeTo( fadeInAction, duration, warp ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Time Scale Control\n\n\t// set the time scale stopping any scheduled warping\n\t// although .paused = true yields an effective time scale of zero, this\n\t// method does *not* change .paused, because it would be confusing\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t// return the time scale considering warping and .paused\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Object Accessors\n\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t}\n\n\t\t\t// start\n\n\t\t\tthis._startTime = null; // unschedule\n\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === - 1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? - 1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : - 1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass AnimationMixer extends EventDispatcher {\n\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\t\tthis.time = 0;\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t// return an action for a clip optionally using a custom root target\n\t// object (this method allocates a lot of dynamic memory in case a\n\t// previously unknown clip/root combination is specified)\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t// get an existing action\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// deactivates all previously scheduled actions\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// advance the time and update apply the animation\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Allows you to seek to a specific time in an animation.\n\tsetTime( timeInSeconds ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( timeInSeconds ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t// return this mixer's root target object\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t// free all resources specific to a particular clip\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t// free all resources specific to a particular root target object\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// remove a targeted clip from the cache\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\nAnimationMixer.prototype._controlInterpolantsResultBuffer = new Float32Array( 1 );\n\nclass Uniform {\n\n\tconstructor( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\nInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\nclass GLBufferAttribute {\n\n\tconstructor( buffer, type, itemSize, elementSize, count ) {\n\n\t\tthis.buffer = buffer;\n\t\tthis.type = type;\n\t\tthis.itemSize = itemSize;\n\t\tthis.elementSize = elementSize;\n\t\tthis.count = count;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nGLBufferAttribute.prototype.isGLBufferAttribute = true;\n\nclass Raycaster {\n\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.camera = null;\n\t\tthis.layers = new Layers();\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersectObject( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t}\n\n\tif ( recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n *\n * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up.\n * The azimuthal angle (theta) is measured from the positive z-axis.\n */\n\nclass Spherical {\n\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi; // polar angle\n\t\tthis.theta = theta; // azimuthal angle\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t// restrict phi to be between EPS and PI-EPS\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, - 1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n */\n\nclass Cylindrical {\n\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\tthis.radius = radius; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = theta; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = y; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\nclass Box2 {\n\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\tconst clampedPoint = _vector$4.copy( point ).clamp( this.min, this.max );\n\t\treturn clampedPoint.sub( point ).length();\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nBox2.prototype.isBox2 = true;\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nclass Line3 {\n\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\tthis.start = start;\n\t\tthis.end = end;\n\n\t}\n\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\nclass SpotLightHelper extends Object3D {\n\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t- 1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, - 1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateMatrixWorld();\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n\nclass SkeletonHelper extends LineSegments {\n\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst color1 = new Color( 0, 0, 1 );\n\t\tconst color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'SkeletonHelper';\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.root = object;\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push.apply( boneList, getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\nclass PointLightHelper extends Mesh {\n\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\nclass HemisphereLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\nclass GridHelper extends LineSegments {\n\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n}\n\nclass PolarGridHelper extends LineSegments {\n\n\tconstructor( radius = 10, radials = 16, circles = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the radials\n\n\t\tfor ( let i = 0; i <= radials; i ++ ) {\n\n\t\t\tconst v = ( i / radials ) * ( Math.PI * 2 );\n\n\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( x, 0, z );\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t\t// create the circles\n\n\t\tfor ( let i = 0; i <= circles; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / circles * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\nclass DirectionalLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n *\t- shows frustum, line of sight and up of the camera\n *\t- suitable for fast updates\n * \t- based on frustum visualization in lightgl.js shadowmap example\n *\t\thttps://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html\n */\n\nclass CameraHelper extends LineSegments {\n\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2', colorFrustum );\n\t\taddLine( 'n2', 'n4', colorFrustum );\n\t\taddLine( 'n4', 'n3', colorFrustum );\n\t\taddLine( 'n3', 'n1', colorFrustum );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2', colorFrustum );\n\t\taddLine( 'f2', 'f4', colorFrustum );\n\t\taddLine( 'f4', 'f3', colorFrustum );\n\t\taddLine( 'f3', 'f1', colorFrustum );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1', colorFrustum );\n\t\taddLine( 'n2', 'f2', colorFrustum );\n\t\taddLine( 'n3', 'f3', colorFrustum );\n\t\taddLine( 'n4', 'f4', colorFrustum );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1', colorCone );\n\t\taddLine( 'p', 'n2', colorCone );\n\t\taddLine( 'p', 'n3', colorCone );\n\t\taddLine( 'p', 'n4', colorCone );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2', colorUp );\n\t\taddLine( 'u2', 'u3', colorUp );\n\t\taddLine( 'u3', 'u1', colorUp );\n\n\t\t// target\n\n\t\taddLine( 'c', 't', colorTarget );\n\t\taddLine( 'p', 'c', colorCross );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2', colorCross );\n\t\taddLine( 'cn3', 'cn4', colorCross );\n\n\t\taddLine( 'cf1', 'cf2', colorCross );\n\t\taddLine( 'cf3', 'cf4', colorCross );\n\n\t\tfunction addLine( a, b, color ) {\n\n\t\t\taddPoint( a, color );\n\t\t\taddPoint( b, color );\n\n\t\t}\n\n\t\tfunction addPoint( id, color ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t}\n\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// center / target\n\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, 1 );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, 1 );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\nclass BoxHelper extends LineSegments {\n\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tupdate( object ) {\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );\n\n\t\t}\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\n\t}\n\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tLineSegments.prototype.copy.call( this, source );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Box3Helper extends LineSegments {\n\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tconst positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nclass PlaneHelper extends Line {\n\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\tthis.plane = plane;\n\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tlet scale = - this.plane.constant;\n\n\t\tif ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, scale );\n\n\t\tthis.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\nclass ArrowHelper extends Object3D {\n\n\t// dir is assumed to be normalized\n\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new CylinderGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass AxesHelper extends LineSegments {\n\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass ShapePath {\n\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\tthis.color = new Color();\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\ttoShapes( isCCW, noHoles ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//console.log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//console.log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//console.log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nclass DataUtils {\n\n\t// float32 to float16\n\n\tstatic toHalfFloat( val ) {\n\n\t\tif ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' );\n\n\t\tval = clamp( val, - 65504, 65504 );\n\n\t\t_floatView[ 0 ] = val;\n\t\tconst f = _uint32View[ 0 ];\n\t\tconst e = ( f >> 23 ) & 0x1ff;\n\t\treturn _baseTable[ e ] + ( ( f & 0x007fffff ) >> _shiftTable[ e ] );\n\n\t}\n\n\t// float16 to float32\n\n\tstatic fromHalfFloat( val ) {\n\n\t\tconst m = val >> 10;\n\t\t_uint32View[ 0 ] = _mantissaTable[ _offsetTable[ m ] + ( val & 0x3ff ) ] + _exponentTable[ m ];\n\t\treturn _floatView[ 0 ];\n\n\t}\n\n}\n\n// float32 to float16 helpers\n\nconst _buffer = new ArrayBuffer( 4 );\nconst _floatView = new Float32Array( _buffer );\nconst _uint32View = new Uint32Array( _buffer );\n\nconst _baseTable = new Uint32Array( 512 );\nconst _shiftTable = new Uint32Array( 512 );\n\nfor ( let i = 0; i < 256; ++ i ) {\n\n\tconst e = i - 127;\n\n\t// very small number (0, -0)\n\n\tif ( e < - 27 ) {\n\n\t\t_baseTable[ i ] = 0x0000;\n\t\t_baseTable[ i | 0x100 ] = 0x8000;\n\t\t_shiftTable[ i ] = 24;\n\t\t_shiftTable[ i | 0x100 ] = 24;\n\n\t\t// small number (denorm)\n\n\t} else if ( e < - 14 ) {\n\n\t\t_baseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t_baseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t_shiftTable[ i ] = - e - 1;\n\t\t_shiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t// normal number\n\n\t} else if ( e <= 15 ) {\n\n\t\t_baseTable[ i ] = ( e + 15 ) << 10;\n\t\t_baseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t_shiftTable[ i ] = 13;\n\t\t_shiftTable[ i | 0x100 ] = 13;\n\n\t\t// large number (Infinity, -Infinity)\n\n\t} else if ( e < 128 ) {\n\n\t\t_baseTable[ i ] = 0x7c00;\n\t\t_baseTable[ i | 0x100 ] = 0xfc00;\n\t\t_shiftTable[ i ] = 24;\n\t\t_shiftTable[ i | 0x100 ] = 24;\n\n\t\t// stay (NaN, Infinity, -Infinity)\n\n\t} else {\n\n\t\t_baseTable[ i ] = 0x7c00;\n\t\t_baseTable[ i | 0x100 ] = 0xfc00;\n\t\t_shiftTable[ i ] = 13;\n\t\t_shiftTable[ i | 0x100 ] = 13;\n\n\t}\n\n}\n\n// float16 to float32 helpers\n\nconst _mantissaTable = new Uint32Array( 2048 );\nconst _exponentTable = new Uint32Array( 64 );\nconst _offsetTable = new Uint32Array( 64 );\n\nfor ( let i = 1; i < 1024; ++ i ) {\n\n\tlet m = i << 13; // zero pad mantissa bits\n\tlet e = 0; // zero exponent\n\n\t// normalized\n\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\tm <<= 1;\n\t\te -= 0x00800000; // decrement exponent\n\n\t}\n\n\tm &= ~ 0x00800000; // clear leading 1 bit\n\te += 0x38800000; // adjust bias\n\n\t_mantissaTable[ i ] = m | e;\n\n}\n\nfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t_mantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n}\n\nfor ( let i = 1; i < 31; ++ i ) {\n\n\t_exponentTable[ i ] = i << 23;\n\n}\n\n_exponentTable[ 31 ] = 0x47800000;\n_exponentTable[ 32 ] = 0x80000000;\nfor ( let i = 33; i < 63; ++ i ) {\n\n\t_exponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n}\n\n_exponentTable[ 63 ] = 0xc7800000;\n\nfor ( let i = 1; i < 64; ++ i ) {\n\n\tif ( i !== 32 ) {\n\n\t\t_offsetTable[ i ] = 1024;\n\n\t}\n\n}\n\nconst LineStrip = 0;\nconst LinePieces = 1;\nconst NoColors = 0;\nconst FaceColors = 1;\nconst VertexColors = 2;\n\nfunction MeshFaceMaterial( materials ) {\n\n\tconsole.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' );\n\treturn materials;\n\n}\n\nfunction MultiMaterial( materials = [] ) {\n\n\tconsole.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' );\n\tmaterials.isMultiMaterial = true;\n\tmaterials.materials = materials;\n\tmaterials.clone = function () {\n\n\t\treturn materials.slice();\n\n\t};\n\n\treturn materials;\n\n}\n\nclass PointCloud extends Points {\n\n\tconstructor( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\tsuper( geometry, material );\n\n\t}\n\n}\n\nclass Particle extends Sprite {\n\n\tconstructor( material ) {\n\n\t\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\t\tsuper( material );\n\n\t}\n\n}\n\nclass ParticleSystem extends Points {\n\n\tconstructor( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\tsuper( geometry, material );\n\n\t}\n\n}\n\nclass PointCloudMaterial extends PointsMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\tsuper( parameters );\n\n\t}\n\n}\n\nclass ParticleBasicMaterial extends PointsMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\tsuper( parameters );\n\n\t}\n\n}\n\nclass ParticleSystemMaterial extends PointsMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\tsuper( parameters );\n\n\t}\n\n}\n\nclass Vertex extends Vector3 {\n\n\tconstructor( x, y, z ) {\n\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\tsuper( x, y, z );\n\n\t}\n\n}\n\n//\n\nclass DynamicBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead.' );\n\t\tsuper( array, itemSize );\n\t\tthis.setUsage( DynamicDrawUsage );\n\n\t}\n\n}\n\nclass Int8Attribute extends Int8BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Uint8Attribute extends Uint8BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Uint8ClampedAttribute extends Uint8ClampedBufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Int16Attribute extends Int16BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Uint16Attribute extends Uint16BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Int32Attribute extends Int32BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Uint32Attribute extends Uint32BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Float32Attribute extends Float32BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Float64Attribute extends Float64BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\n//\n\nCurve.create = function ( construct, getPoint ) {\n\n\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\tconstruct.prototype = Object.create( Curve.prototype );\n\tconstruct.prototype.constructor = construct;\n\tconstruct.prototype.getPoint = getPoint;\n\n\treturn construct;\n\n};\n\n//\n\nPath.prototype.fromPoints = function ( points ) {\n\n\tconsole.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' );\n\treturn this.setFromPoints( points );\n\n};\n\n//\n\nclass AxisHelper extends AxesHelper {\n\n\tconstructor( size ) {\n\n\t\tconsole.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' );\n\t\tsuper( size );\n\n\t}\n\n}\n\nclass BoundingBoxHelper extends BoxHelper {\n\n\tconstructor( object, color ) {\n\n\t\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\t\tsuper( object, color );\n\n\t}\n\n}\n\nclass EdgesHelper extends LineSegments {\n\n\tconstructor( object, hex ) {\n\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\tsuper( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n}\n\nGridHelper.prototype.setColors = function () {\n\n\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n};\n\nSkeletonHelper.prototype.update = function () {\n\n\tconsole.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' );\n\n};\n\nclass WireframeHelper extends LineSegments {\n\n\tconstructor( object, hex ) {\n\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\tsuper( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n}\n\n//\n\nLoader.prototype.extractUrlBase = function ( url ) {\n\n\tconsole.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' );\n\treturn LoaderUtils.extractUrlBase( url );\n\n};\n\nLoader.Handlers = {\n\n\tadd: function ( /* regex, loader */ ) {\n\n\t\tconsole.error( 'THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.' );\n\n\t},\n\n\tget: function ( /* file */ ) {\n\n\t\tconsole.error( 'THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.' );\n\n\t}\n\n};\n\nclass XHRLoader extends FileLoader {\n\n\tconstructor( manager ) {\n\n\t\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\t\tsuper( manager );\n\n\t}\n\n}\n\nclass BinaryTextureLoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\t\tsuper( manager );\n\n\t}\n\n}\n\n//\n\nBox2.prototype.center = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\treturn this.getCenter( optionalTarget );\n\n};\n\nBox2.prototype.empty = function () {\n\n\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\treturn this.isEmpty();\n\n};\n\nBox2.prototype.isIntersectionBox = function ( box ) {\n\n\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\treturn this.intersectsBox( box );\n\n};\n\nBox2.prototype.size = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\treturn this.getSize( optionalTarget );\n\n};\n\n//\n\nBox3.prototype.center = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\treturn this.getCenter( optionalTarget );\n\n};\n\nBox3.prototype.empty = function () {\n\n\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\treturn this.isEmpty();\n\n};\n\nBox3.prototype.isIntersectionBox = function ( box ) {\n\n\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\treturn this.intersectsBox( box );\n\n};\n\nBox3.prototype.isIntersectionSphere = function ( sphere ) {\n\n\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\treturn this.intersectsSphere( sphere );\n\n};\n\nBox3.prototype.size = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\treturn this.getSize( optionalTarget );\n\n};\n\n//\n\nEuler.prototype.toVector3 = function () {\n\n\tconsole.error( 'THREE.Euler: .toVector3() has been removed. Use Vector3.setFromEuler() instead' );\n\n};\n\n\n//\n\nSphere.prototype.empty = function () {\n\n\tconsole.warn( 'THREE.Sphere: .empty() has been renamed to .isEmpty().' );\n\treturn this.isEmpty();\n\n};\n\n//\n\nFrustum.prototype.setFromMatrix = function ( m ) {\n\n\tconsole.warn( 'THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix().' );\n\treturn this.setFromProjectionMatrix( m );\n\n};\n\n//\n\nLine3.prototype.center = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\treturn this.getCenter( optionalTarget );\n\n};\n\n//\n\nMatrix3.prototype.flattenToArrayOffset = function ( array, offset ) {\n\n\tconsole.warn( 'THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' );\n\treturn this.toArray( array, offset );\n\n};\n\nMatrix3.prototype.multiplyVector3 = function ( vector ) {\n\n\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\treturn vector.applyMatrix3( this );\n\n};\n\nMatrix3.prototype.multiplyVector3Array = function ( /* a */ ) {\n\n\tconsole.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' );\n\n};\n\nMatrix3.prototype.applyToBufferAttribute = function ( attribute ) {\n\n\tconsole.warn( 'THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead.' );\n\treturn attribute.applyMatrix3( this );\n\n};\n\nMatrix3.prototype.applyToVector3Array = function ( /* array, offset, length */ ) {\n\n\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n};\n\nMatrix3.prototype.getInverse = function ( matrix ) {\n\n\tconsole.warn( 'THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' );\n\treturn this.copy( matrix ).invert();\n\n};\n\n//\n\nMatrix4.prototype.extractPosition = function ( m ) {\n\n\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\treturn this.copyPosition( m );\n\n};\n\nMatrix4.prototype.flattenToArrayOffset = function ( array, offset ) {\n\n\tconsole.warn( 'THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' );\n\treturn this.toArray( array, offset );\n\n};\n\nMatrix4.prototype.getPosition = function () {\n\n\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\treturn new Vector3().setFromMatrixColumn( this, 3 );\n\n};\n\nMatrix4.prototype.setRotationFromQuaternion = function ( q ) {\n\n\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\treturn this.makeRotationFromQuaternion( q );\n\n};\n\nMatrix4.prototype.multiplyToArray = function () {\n\n\tconsole.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' );\n\n};\n\nMatrix4.prototype.multiplyVector3 = function ( vector ) {\n\n\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\treturn vector.applyMatrix4( this );\n\n};\n\nMatrix4.prototype.multiplyVector4 = function ( vector ) {\n\n\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\treturn vector.applyMatrix4( this );\n\n};\n\nMatrix4.prototype.multiplyVector3Array = function ( /* a */ ) {\n\n\tconsole.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' );\n\n};\n\nMatrix4.prototype.rotateAxis = function ( v ) {\n\n\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\tv.transformDirection( this );\n\n};\n\nMatrix4.prototype.crossVector = function ( vector ) {\n\n\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\treturn vector.applyMatrix4( this );\n\n};\n\nMatrix4.prototype.translate = function () {\n\n\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n};\n\nMatrix4.prototype.rotateX = function () {\n\n\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n};\n\nMatrix4.prototype.rotateY = function () {\n\n\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n};\n\nMatrix4.prototype.rotateZ = function () {\n\n\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n};\n\nMatrix4.prototype.rotateByAxis = function () {\n\n\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n};\n\nMatrix4.prototype.applyToBufferAttribute = function ( attribute ) {\n\n\tconsole.warn( 'THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead.' );\n\treturn attribute.applyMatrix4( this );\n\n};\n\nMatrix4.prototype.applyToVector3Array = function ( /* array, offset, length */ ) {\n\n\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n};\n\nMatrix4.prototype.makeFrustum = function ( left, right, bottom, top, near, far ) {\n\n\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n};\n\nMatrix4.prototype.getInverse = function ( matrix ) {\n\n\tconsole.warn( 'THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' );\n\treturn this.copy( matrix ).invert();\n\n};\n\n//\n\nPlane.prototype.isIntersectionLine = function ( line ) {\n\n\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\treturn this.intersectsLine( line );\n\n};\n\n//\n\nQuaternion.prototype.multiplyVector3 = function ( vector ) {\n\n\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\treturn vector.applyQuaternion( this );\n\n};\n\nQuaternion.prototype.inverse = function ( ) {\n\n\tconsole.warn( 'THREE.Quaternion: .inverse() has been renamed to invert().' );\n\treturn this.invert();\n\n};\n\n//\n\nRay.prototype.isIntersectionBox = function ( box ) {\n\n\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\treturn this.intersectsBox( box );\n\n};\n\nRay.prototype.isIntersectionPlane = function ( plane ) {\n\n\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\treturn this.intersectsPlane( plane );\n\n};\n\nRay.prototype.isIntersectionSphere = function ( sphere ) {\n\n\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\treturn this.intersectsSphere( sphere );\n\n};\n\n//\n\nTriangle.prototype.area = function () {\n\n\tconsole.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' );\n\treturn this.getArea();\n\n};\n\nTriangle.prototype.barycoordFromPoint = function ( point, target ) {\n\n\tconsole.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );\n\treturn this.getBarycoord( point, target );\n\n};\n\nTriangle.prototype.midpoint = function ( target ) {\n\n\tconsole.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' );\n\treturn this.getMidpoint( target );\n\n};\n\nTriangle.prototypenormal = function ( target ) {\n\n\tconsole.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );\n\treturn this.getNormal( target );\n\n};\n\nTriangle.prototype.plane = function ( target ) {\n\n\tconsole.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' );\n\treturn this.getPlane( target );\n\n};\n\nTriangle.barycoordFromPoint = function ( point, a, b, c, target ) {\n\n\tconsole.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );\n\treturn Triangle.getBarycoord( point, a, b, c, target );\n\n};\n\nTriangle.normal = function ( a, b, c, target ) {\n\n\tconsole.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );\n\treturn Triangle.getNormal( a, b, c, target );\n\n};\n\n//\n\nShape.prototype.extractAllPoints = function ( divisions ) {\n\n\tconsole.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' );\n\treturn this.extractPoints( divisions );\n\n};\n\nShape.prototype.extrude = function ( options ) {\n\n\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\treturn new ExtrudeGeometry( this, options );\n\n};\n\nShape.prototype.makeGeometry = function ( options ) {\n\n\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\treturn new ShapeGeometry( this, options );\n\n};\n\n//\n\nVector2.prototype.fromAttribute = function ( attribute, index, offset ) {\n\n\tconsole.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\treturn this.fromBufferAttribute( attribute, index, offset );\n\n};\n\nVector2.prototype.distanceToManhattan = function ( v ) {\n\n\tconsole.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );\n\treturn this.manhattanDistanceTo( v );\n\n};\n\nVector2.prototype.lengthManhattan = function () {\n\n\tconsole.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' );\n\treturn this.manhattanLength();\n\n};\n\n//\n\nVector3.prototype.setEulerFromRotationMatrix = function () {\n\n\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n};\n\nVector3.prototype.setEulerFromQuaternion = function () {\n\n\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n};\n\nVector3.prototype.getPositionFromMatrix = function ( m ) {\n\n\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\treturn this.setFromMatrixPosition( m );\n\n};\n\nVector3.prototype.getScaleFromMatrix = function ( m ) {\n\n\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\treturn this.setFromMatrixScale( m );\n\n};\n\nVector3.prototype.getColumnFromMatrix = function ( index, matrix ) {\n\n\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\treturn this.setFromMatrixColumn( matrix, index );\n\n};\n\nVector3.prototype.applyProjection = function ( m ) {\n\n\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\treturn this.applyMatrix4( m );\n\n};\n\nVector3.prototype.fromAttribute = function ( attribute, index, offset ) {\n\n\tconsole.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\treturn this.fromBufferAttribute( attribute, index, offset );\n\n};\n\nVector3.prototype.distanceToManhattan = function ( v ) {\n\n\tconsole.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );\n\treturn this.manhattanDistanceTo( v );\n\n};\n\nVector3.prototype.lengthManhattan = function () {\n\n\tconsole.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' );\n\treturn this.manhattanLength();\n\n};\n\n//\n\nVector4.prototype.fromAttribute = function ( attribute, index, offset ) {\n\n\tconsole.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\treturn this.fromBufferAttribute( attribute, index, offset );\n\n};\n\nVector4.prototype.lengthManhattan = function () {\n\n\tconsole.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' );\n\treturn this.manhattanLength();\n\n};\n\n//\n\nObject3D.prototype.getChildByName = function ( name ) {\n\n\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\treturn this.getObjectByName( name );\n\n};\n\nObject3D.prototype.renderDepth = function () {\n\n\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n};\n\nObject3D.prototype.translate = function ( distance, axis ) {\n\n\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\treturn this.translateOnAxis( axis, distance );\n\n};\n\nObject3D.prototype.getWorldRotation = function () {\n\n\tconsole.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' );\n\n};\n\nObject3D.prototype.applyMatrix = function ( matrix ) {\n\n\tconsole.warn( 'THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4().' );\n\treturn this.applyMatrix4( matrix );\n\n};\n\nObject.defineProperties( Object3D.prototype, {\n\n\teulerOrder: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\treturn this.rotation.order;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\tthis.rotation.order = value;\n\n\t\t}\n\t},\n\tuseQuaternion: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t}\n\t}\n\n} );\n\nMesh.prototype.setDrawMode = function () {\n\n\tconsole.error( 'THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' );\n\n};\n\nObject.defineProperties( Mesh.prototype, {\n\n\tdrawMode: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode.' );\n\t\t\treturn TrianglesDrawMode;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' );\n\n\t\t}\n\t}\n\n} );\n\nSkinnedMesh.prototype.initBones = function () {\n\n\tconsole.error( 'THREE.SkinnedMesh: initBones() has been removed.' );\n\n};\n\n//\n\nPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\tconsole.warn( 'THREE.PerspectiveCamera.setLens is deprecated. ' +\n\t\t\t'Use .setFocalLength and .filmGauge for a photographic setup.' );\n\n\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\tthis.setFocalLength( focalLength );\n\n};\n\n//\n\nObject.defineProperties( Light.prototype, {\n\tonlyShadow: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t}\n\t},\n\tshadowCameraFov: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\tthis.shadow.camera.fov = value;\n\n\t\t}\n\t},\n\tshadowCameraLeft: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\tthis.shadow.camera.left = value;\n\n\t\t}\n\t},\n\tshadowCameraRight: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\tthis.shadow.camera.right = value;\n\n\t\t}\n\t},\n\tshadowCameraTop: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\tthis.shadow.camera.top = value;\n\n\t\t}\n\t},\n\tshadowCameraBottom: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t}\n\t},\n\tshadowCameraNear: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\tthis.shadow.camera.near = value;\n\n\t\t}\n\t},\n\tshadowCameraFar: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\tthis.shadow.camera.far = value;\n\n\t\t}\n\t},\n\tshadowCameraVisible: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t}\n\t},\n\tshadowBias: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\tthis.shadow.bias = value;\n\n\t\t}\n\t},\n\tshadowDarkness: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t}\n\t},\n\tshadowMapWidth: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t}\n\t},\n\tshadowMapHeight: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t}\n\t}\n} );\n\n//\n\nObject.defineProperties( BufferAttribute.prototype, {\n\n\tlength: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\treturn this.array.length;\n\n\t\t}\n\t},\n\tdynamic: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' );\n\t\t\treturn this.usage === DynamicDrawUsage;\n\n\t\t},\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' );\n\t\t\tthis.setUsage( DynamicDrawUsage );\n\n\t\t}\n\t}\n\n} );\n\nBufferAttribute.prototype.setDynamic = function ( value ) {\n\n\tconsole.warn( 'THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.' );\n\tthis.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage );\n\treturn this;\n\n};\n\nBufferAttribute.prototype.copyIndicesArray = function ( /* indices */ ) {\n\n\tconsole.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' );\n\n},\n\nBufferAttribute.prototype.setArray = function ( /* array */ ) {\n\n\tconsole.error( 'THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' );\n\n};\n\n//\n\nBufferGeometry.prototype.addIndex = function ( index ) {\n\n\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\tthis.setIndex( index );\n\n};\n\nBufferGeometry.prototype.addAttribute = function ( name, attribute ) {\n\n\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().' );\n\n\tif ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\treturn this.setAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t}\n\n\tif ( name === 'index' ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\tthis.setIndex( attribute );\n\n\t\treturn this;\n\n\t}\n\n\treturn this.setAttribute( name, attribute );\n\n};\n\nBufferGeometry.prototype.addDrawCall = function ( start, count, indexOffset ) {\n\n\tif ( indexOffset !== undefined ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t}\n\n\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\tthis.addGroup( start, count );\n\n};\n\nBufferGeometry.prototype.clearDrawCalls = function () {\n\n\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\tthis.clearGroups();\n\n};\n\nBufferGeometry.prototype.computeOffsets = function () {\n\n\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n};\n\nBufferGeometry.prototype.removeAttribute = function ( name ) {\n\n\tconsole.warn( 'THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().' );\n\n\treturn this.deleteAttribute( name );\n\n};\n\nBufferGeometry.prototype.applyMatrix = function ( matrix ) {\n\n\tconsole.warn( 'THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4().' );\n\treturn this.applyMatrix4( matrix );\n\n};\n\nObject.defineProperties( BufferGeometry.prototype, {\n\n\tdrawcalls: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\treturn this.groups;\n\n\t\t}\n\t},\n\toffsets: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\treturn this.groups;\n\n\t\t}\n\t}\n\n} );\n\nInterleavedBuffer.prototype.setDynamic = function ( value ) {\n\n\tconsole.warn( 'THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.' );\n\tthis.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage );\n\treturn this;\n\n};\n\nInterleavedBuffer.prototype.setArray = function ( /* array */ ) {\n\n\tconsole.error( 'THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' );\n\n};\n\n//\n\nExtrudeGeometry.prototype.getArrays = function () {\n\n\tconsole.error( 'THREE.ExtrudeGeometry: .getArrays() has been removed.' );\n\n};\n\nExtrudeGeometry.prototype.addShapeList = function () {\n\n\tconsole.error( 'THREE.ExtrudeGeometry: .addShapeList() has been removed.' );\n\n};\n\nExtrudeGeometry.prototype.addShape = function () {\n\n\tconsole.error( 'THREE.ExtrudeGeometry: .addShape() has been removed.' );\n\n};\n\n//\n\nScene.prototype.dispose = function () {\n\n\tconsole.error( 'THREE.Scene: .dispose() has been removed.' );\n\n};\n\n//\n\nUniform.prototype.onUpdate = function () {\n\n\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\treturn this;\n\n};\n\n//\n\nObject.defineProperties( Material.prototype, {\n\n\twrapAround: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t}\n\t},\n\n\toverdraw: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .overdraw has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .overdraw has been removed.' );\n\n\t\t}\n\t},\n\n\twrapRGB: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapRGB has been removed.' );\n\t\t\treturn new Color();\n\n\t\t}\n\t},\n\n\tshading: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\tthis.flatShading = ( value === FlatShading );\n\n\t\t}\n\t},\n\n\tstencilMask: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' );\n\t\t\treturn this.stencilFuncMask;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' );\n\t\t\tthis.stencilFuncMask = value;\n\n\t\t}\n\t},\n\n\tvertexTangents: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .vertexTangents has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .vertexTangents has been removed.' );\n\n\t\t}\n\t},\n\n} );\n\nObject.defineProperties( ShaderMaterial.prototype, {\n\n\tderivatives: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\treturn this.extensions.derivatives;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\tthis.extensions.derivatives = value;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nWebGLRenderer.prototype.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' );\n\tthis.setRenderTarget( renderTarget );\n\tthis.clear( color, depth, stencil );\n\n};\n\nWebGLRenderer.prototype.animate = function ( callback ) {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' );\n\tthis.setAnimationLoop( callback );\n\n};\n\nWebGLRenderer.prototype.getCurrentRenderTarget = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' );\n\treturn this.getRenderTarget();\n\n};\n\nWebGLRenderer.prototype.getMaxAnisotropy = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' );\n\treturn this.capabilities.getMaxAnisotropy();\n\n};\n\nWebGLRenderer.prototype.getPrecision = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' );\n\treturn this.capabilities.precision;\n\n};\n\nWebGLRenderer.prototype.resetGLState = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' );\n\treturn this.state.reset();\n\n};\n\nWebGLRenderer.prototype.supportsFloatTextures = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\treturn this.extensions.get( 'OES_texture_float' );\n\n};\n\nWebGLRenderer.prototype.supportsHalfFloatTextures = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\treturn this.extensions.get( 'OES_texture_half_float' );\n\n};\n\nWebGLRenderer.prototype.supportsStandardDerivatives = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n};\n\nWebGLRenderer.prototype.supportsCompressedTextureS3TC = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n};\n\nWebGLRenderer.prototype.supportsCompressedTexturePVRTC = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n};\n\nWebGLRenderer.prototype.supportsBlendMinMax = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n};\n\nWebGLRenderer.prototype.supportsVertexTextures = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\treturn this.capabilities.vertexTextures;\n\n};\n\nWebGLRenderer.prototype.supportsInstancedArrays = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n};\n\nWebGLRenderer.prototype.enableScissorTest = function ( boolean ) {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\tthis.setScissorTest( boolean );\n\n};\n\nWebGLRenderer.prototype.initMaterial = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.addPrePlugin = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.addPostPlugin = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.updateShadowMap = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.setFaceCulling = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.allocTextureUnit = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .allocTextureUnit() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.setTexture = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .setTexture() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.setTexture2D = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .setTexture2D() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.setTextureCube = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .setTextureCube() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.getActiveMipMapLevel = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().' );\n\treturn this.getActiveMipmapLevel();\n\n};\n\nObject.defineProperties( WebGLRenderer.prototype, {\n\n\tshadowMapEnabled: {\n\t\tget: function () {\n\n\t\t\treturn this.shadowMap.enabled;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\tthis.shadowMap.enabled = value;\n\n\t\t}\n\t},\n\tshadowMapType: {\n\t\tget: function () {\n\n\t\t\treturn this.shadowMap.type;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\tthis.shadowMap.type = value;\n\n\t\t}\n\t},\n\tshadowMapCullFace: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\tcontext: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.' );\n\t\t\treturn this.getContext();\n\n\t\t}\n\t},\n\tvr: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .vr has been renamed to .xr' );\n\t\t\treturn this.xr;\n\n\t\t}\n\t},\n\tgammaInput: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' );\n\t\t\treturn false;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' );\n\n\t\t}\n\t},\n\tgammaOutput: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' );\n\t\t\treturn false;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' );\n\t\t\tthis.outputEncoding = ( value === true ) ? sRGBEncoding : LinearEncoding;\n\n\t\t}\n\t},\n\ttoneMappingWhitePoint: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' );\n\t\t\treturn 1.0;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' );\n\n\t\t}\n\t},\n\tgammaFactor: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaFactor has been removed.' );\n\t\t\treturn 2;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaFactor has been removed.' );\n\n\t\t}\n\t}\n} );\n\nObject.defineProperties( WebGLShadowMap.prototype, {\n\n\tcullFace: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function ( /* cullFace */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\trenderReverseSided: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\trenderSingleSided: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t}\n\n} );\n\nclass WebGLRenderTargetCube extends WebGLCubeRenderTarget {\n\n\tconstructor( width, height, options ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options ).' );\n\t\tsuper( width, options );\n\n\t}\n\n}\n\n//\n\nObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\twrapS: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\treturn this.texture.wrapS;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\tthis.texture.wrapS = value;\n\n\t\t}\n\t},\n\twrapT: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\treturn this.texture.wrapT;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\tthis.texture.wrapT = value;\n\n\t\t}\n\t},\n\tmagFilter: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\treturn this.texture.magFilter;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\tthis.texture.magFilter = value;\n\n\t\t}\n\t},\n\tminFilter: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\treturn this.texture.minFilter;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\tthis.texture.minFilter = value;\n\n\t\t}\n\t},\n\tanisotropy: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\treturn this.texture.anisotropy;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\tthis.texture.anisotropy = value;\n\n\t\t}\n\t},\n\toffset: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\treturn this.texture.offset;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\tthis.texture.offset = value;\n\n\t\t}\n\t},\n\trepeat: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\treturn this.texture.repeat;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\tthis.texture.repeat = value;\n\n\t\t}\n\t},\n\tformat: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\treturn this.texture.format;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\tthis.texture.format = value;\n\n\t\t}\n\t},\n\ttype: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\treturn this.texture.type;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\tthis.texture.type = value;\n\n\t\t}\n\t},\n\tgenerateMipmaps: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\treturn this.texture.generateMipmaps;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nAudio.prototype.load = function ( file ) {\n\n\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\tconst scope = this;\n\tconst audioLoader = new AudioLoader();\n\taudioLoader.load( file, function ( buffer ) {\n\n\t\tscope.setBuffer( buffer );\n\n\t} );\n\treturn this;\n\n};\n\n\nAudioAnalyser.prototype.getData = function () {\n\n\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\treturn this.getFrequencyData();\n\n};\n\n//\n\nCubeCamera.prototype.updateCubeMap = function ( renderer, scene ) {\n\n\tconsole.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' );\n\treturn this.update( renderer, scene );\n\n};\n\nCubeCamera.prototype.clear = function ( renderer, color, depth, stencil ) {\n\n\tconsole.warn( 'THREE.CubeCamera: .clear() is now .renderTarget.clear().' );\n\treturn this.renderTarget.clear( renderer, color, depth, stencil );\n\n};\n\nImageUtils.crossOrigin = undefined;\n\nImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) {\n\n\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\tconst loader = new TextureLoader();\n\tloader.setCrossOrigin( this.crossOrigin );\n\n\tconst texture = loader.load( url, onLoad, undefined, onError );\n\n\tif ( mapping ) texture.mapping = mapping;\n\n\treturn texture;\n\n};\n\nImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) {\n\n\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\tconst loader = new CubeTextureLoader();\n\tloader.setCrossOrigin( this.crossOrigin );\n\n\tconst texture = loader.load( urls, onLoad, undefined, onError );\n\n\tif ( mapping ) texture.mapping = mapping;\n\n\treturn texture;\n\n};\n\nImageUtils.loadCompressedTexture = function () {\n\n\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n};\n\nImageUtils.loadCompressedTextureCube = function () {\n\n\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n};\n\n//\n\nfunction CanvasRenderer() {\n\n\tconsole.error( 'THREE.CanvasRenderer has been removed' );\n\n}\n\n//\n\nfunction JSONLoader() {\n\n\tconsole.error( 'THREE.JSONLoader has been removed.' );\n\n}\n\n//\n\nconst SceneUtils = {\n\n\tcreateMultiMaterialObject: function ( /* geometry, materials */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );\n\n\t},\n\n\tdetach: function ( /* child, parent, scene */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );\n\n\t},\n\n\tattach: function ( /* child, scene, parent */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );\n\n\t}\n\n};\n\n//\n\nfunction LensFlare() {\n\n\tconsole.error( 'THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js' );\n\n}\n\n//\n\nclass ParametricGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tconsole.error( 'THREE.ParametricGeometry has been moved to /examples/jsm/geometries/ParametricGeometry.js' );\n\t\tsuper();\n\n\t}\n\n}\n\nclass TextGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tconsole.error( 'THREE.TextGeometry has been moved to /examples/jsm/geometries/TextGeometry.js' );\n\t\tsuper();\n\n\t}\n\n}\n\nfunction FontLoader() {\n\n\tconsole.error( 'THREE.FontLoader has been moved to /examples/jsm/loaders/FontLoader.js' );\n\n}\n\nfunction Font() {\n\n\tconsole.error( 'THREE.Font has been moved to /examples/jsm/loaders/FontLoader.js' );\n\n}\n\nfunction ImmediateRenderObject() {\n\n\tconsole.error( 'THREE.ImmediateRenderObject has been removed.' );\n\n}\n\nclass WebGLMultisampleRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width, height, options ) {\n\n\t\tconsole.error( 'THREE.WebGLMultisampleRenderTarget has been removed. Use a normal render target and set the \"samples\" property to greater 0 to enable multisampling.' );\n\t\tsuper( width, height, options );\n\t\tthis.samples = 4;\n\n\t}\n\n}\n\nclass DataTexture2DArray extends DataArrayTexture {\n\n\tconstructor( data, width, height, depth ) {\n\n\t\tconsole.warn( 'THREE.DataTexture2DArray has been renamed to DataArrayTexture.' );\n\t\tsuper( data, width, height, depth );\n\n\t}\n\n}\n\nclass DataTexture3D extends Data3DTexture {\n\n\tconstructor( data, width, height, depth ) {\n\n\t\tconsole.warn( 'THREE.DataTexture3D has been renamed to Data3DTexture.' );\n\t\tsuper( data, width, height, depth );\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\tconsole.warn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AlphaFormat, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightProbe, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, AxisHelper, BackSide, BasicDepthPacking, BasicShadowMap, BinaryTextureLoader, Bone, BooleanKeyframeTrack, BoundingBoxHelper, Box2, Box3, Box3Helper, BoxGeometry as BoxBufferGeometry, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasRenderer, CanvasTexture, CapsuleGeometry as CapsuleBufferGeometry, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry as CircleBufferGeometry, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedTexture, CompressedTextureLoader, ConeGeometry as ConeBufferGeometry, ConeGeometry, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry as CylinderBufferGeometry, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTexture2DArray, DataTexture3D, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry as DodecahedronBufferGeometry, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicBufferAttribute, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EdgesHelper, EllipseCurve, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeGeometry as ExtrudeBufferGeometry, ExtrudeGeometry, FaceColors, FileLoader, FlatShading, Float16BufferAttribute, Float32Attribute, Float32BufferAttribute, Float64Attribute, Float64BufferAttribute, FloatType, Fog, FogExp2, Font, FontLoader, FramebufferTexture, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GreaterDepth, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, HemisphereLightProbe, IcosahedronGeometry as IcosahedronBufferGeometry, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, ImmediateRenderObject, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16Attribute, Int16BufferAttribute, Int32Attribute, Int32BufferAttribute, Int8Attribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, JSONLoader, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry as LatheBufferGeometry, LatheGeometry, Layers, LensFlare, LessDepth, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LinePieces, LineSegments, LineStrip, LinearEncoding, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils as Math, MathUtils, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshFaceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiMaterial, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoColors, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry as OctahedronBufferGeometry, OctahedronGeometry, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, ParametricGeometry, Particle, ParticleBasicMaterial, ParticleSystem, ParticleSystemMaterial, Path, PerspectiveCamera, Plane, PlaneGeometry as PlaneBufferGeometry, PlaneGeometry, PlaneHelper, PointCloud, PointCloudMaterial, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry as PolyhedronBufferGeometry, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry as RingBufferGeometry, RingGeometry, SRGBColorSpace, Scene, SceneUtils, ShaderChunk, ShaderLib, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry as ShapeBufferGeometry, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, SmoothShading, Source, Sphere, SphereGeometry as SphereBufferGeometry, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry as TetrahedronBufferGeometry, TetrahedronGeometry, TextGeometry, Texture, TextureLoader, TorusGeometry as TorusBufferGeometry, TorusGeometry, TorusKnotGeometry as TorusKnotBufferGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry as TubeBufferGeometry, TubeGeometry, UVMapping, Uint16Attribute, Uint16BufferAttribute, Uint32Attribute, Uint32BufferAttribute, Uint8Attribute, Uint8BufferAttribute, Uint8ClampedAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, Vertex, VertexColors, VideoTexture, WebGL1Renderer, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCubeRenderTarget, WebGLMultipleRenderTargets, WebGLMultisampleRenderTarget, WebGLRenderTarget, WebGLRenderTargetCube, WebGLRenderer, WebGLUtils, WireframeGeometry, WireframeHelper, WrapAroundEnding, XHRLoader, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, _SRGBAFormat, sRGBEncoding };\n","var Stats = function () {\n\n\tvar mode = 0;\n\n\tvar container = document.createElement( 'div' );\n\tcontainer.style.cssText = 'position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000';\n\tcontainer.addEventListener( 'click', function ( event ) {\n\n\t\tevent.preventDefault();\n\t\tshowPanel( ++ mode % container.children.length );\n\n\t}, false );\n\n\t//\n\n\tfunction addPanel( panel ) {\n\n\t\tcontainer.appendChild( panel.dom );\n\t\treturn panel;\n\n\t}\n\n\tfunction showPanel( id ) {\n\n\t\tfor ( var i = 0; i < container.children.length; i ++ ) {\n\n\t\t\tcontainer.children[ i ].style.display = i === id ? 'block' : 'none';\n\n\t\t}\n\n\t\tmode = id;\n\n\t}\n\n\t//\n\n\tvar beginTime = ( performance || Date ).now(), prevTime = beginTime, frames = 0;\n\n\tvar fpsPanel = addPanel( new Stats.Panel( 'FPS', '#0ff', '#002' ) );\n\tvar msPanel = addPanel( new Stats.Panel( 'MS', '#0f0', '#020' ) );\n\n\tif ( self.performance && self.performance.memory ) {\n\n\t\tvar memPanel = addPanel( new Stats.Panel( 'MB', '#f08', '#201' ) );\n\n\t}\n\n\tshowPanel( 0 );\n\n\treturn {\n\n\t\tREVISION: 16,\n\n\t\tdom: container,\n\n\t\taddPanel: addPanel,\n\t\tshowPanel: showPanel,\n\n\t\tbegin: function () {\n\n\t\t\tbeginTime = ( performance || Date ).now();\n\n\t\t},\n\n\t\tend: function () {\n\n\t\t\tframes ++;\n\n\t\t\tvar time = ( performance || Date ).now();\n\n\t\t\tmsPanel.update( time - beginTime, 200 );\n\n\t\t\tif ( time >= prevTime + 1000 ) {\n\n\t\t\t\tfpsPanel.update( ( frames * 1000 ) / ( time - prevTime ), 100 );\n\n\t\t\t\tprevTime = time;\n\t\t\t\tframes = 0;\n\n\t\t\t\tif ( memPanel ) {\n\n\t\t\t\t\tvar memory = performance.memory;\n\t\t\t\t\tmemPanel.update( memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn time;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tbeginTime = this.end();\n\n\t\t},\n\n\t\t// Backwards Compatibility\n\n\t\tdomElement: container,\n\t\tsetMode: showPanel\n\n\t};\n\n};\n\nStats.Panel = function ( name, fg, bg ) {\n\n\tvar min = Infinity, max = 0, round = Math.round;\n\tvar PR = round( window.devicePixelRatio || 1 );\n\n\tvar WIDTH = 80 * PR, HEIGHT = 48 * PR,\n\t\tTEXT_X = 3 * PR, TEXT_Y = 2 * PR,\n\t\tGRAPH_X = 3 * PR, GRAPH_Y = 15 * PR,\n\t\tGRAPH_WIDTH = 74 * PR, GRAPH_HEIGHT = 30 * PR;\n\n\tvar canvas = document.createElement( 'canvas' );\n\tcanvas.width = WIDTH;\n\tcanvas.height = HEIGHT;\n\tcanvas.style.cssText = 'width:80px;height:48px';\n\n\tvar context = canvas.getContext( '2d' );\n\tcontext.font = 'bold ' + ( 9 * PR ) + 'px Helvetica,Arial,sans-serif';\n\tcontext.textBaseline = 'top';\n\n\tcontext.fillStyle = bg;\n\tcontext.fillRect( 0, 0, WIDTH, HEIGHT );\n\n\tcontext.fillStyle = fg;\n\tcontext.fillText( name, TEXT_X, TEXT_Y );\n\tcontext.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\n\n\tcontext.fillStyle = bg;\n\tcontext.globalAlpha = 0.9;\n\tcontext.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\n\n\treturn {\n\n\t\tdom: canvas,\n\n\t\tupdate: function ( value, maxValue ) {\n\n\t\t\tmin = Math.min( min, value );\n\t\t\tmax = Math.max( max, value );\n\n\t\t\tcontext.fillStyle = bg;\n\t\t\tcontext.globalAlpha = 1;\n\t\t\tcontext.fillRect( 0, 0, WIDTH, GRAPH_Y );\n\t\t\tcontext.fillStyle = fg;\n\t\t\tcontext.fillText( round( value ) + ' ' + name + ' (' + round( min ) + '-' + round( max ) + ')', TEXT_X, TEXT_Y );\n\n\t\t\tcontext.drawImage( canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT );\n\n\t\t\tcontext.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT );\n\n\t\t\tcontext.fillStyle = bg;\n\t\t\tcontext.globalAlpha = 0.9;\n\t\t\tcontext.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round( ( 1 - ( value / maxValue ) ) * GRAPH_HEIGHT ) );\n\n\t\t}\n\n\t};\n\n};\n\nexport default Stats;\n","'use strict';\nvar check = function (it) {\n return it && it.Math === Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n check(typeof this == 'object' && this) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n","'use strict';\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7;\n});\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-function-prototype-bind -- safe\n var test = (function () { /* empty */ }).bind();\n // eslint-disable-next-line no-prototype-builtins -- safe\n return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar call = Function.prototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","'use strict';\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n return function () {\n return call.apply(fn, arguments);\n };\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) === 'String' ? split(it, '') : $Object(it);\n} : $Object;\n","'use strict';\n// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n return it === null || it === undefined;\n};\n","'use strict';\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) throw new $TypeError(\"Can't call method on \" + it);\n return it;\n};\n","'use strict';\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","'use strict';\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\nvar documentAll = typeof document == 'object' && document.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nmodule.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) {\n return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n return typeof argument == 'function';\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\n\nmodule.exports = function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method];\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nvar navigator = globalThis.navigator;\nvar userAgent = navigator && navigator.userAgent;\n\nmodule.exports = userAgent ? String(userAgent) : '';\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar userAgent = require('../internals/environment-user-agent');\n\nvar process = globalThis.process;\nvar Deno = globalThis.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/environment-v8-version');\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\nvar $String = globalThis.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol('symbol detection');\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n // of course, fail.\n return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nmodule.exports = NATIVE_SYMBOL &&\n !Symbol.sham &&\n typeof Symbol.iterator == 'symbol';\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n","'use strict';\nvar $String = String;\n\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw new $TypeError(tryToString(argument) + ' is not a function');\n};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw new $TypeError(\"Can't convert object to primitive value\");\n};\n","'use strict';\nmodule.exports = false;\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(globalThis, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n globalThis[key] = value;\n } return value;\n};\n","'use strict';\nvar IS_PURE = require('../internals/is-pure');\nvar globalThis = require('../internals/global-this');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nvar SHARED = '__core-js_shared__';\nvar store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {});\n\n(store.versions || (store.versions = [])).push({\n version: '3.40.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2014-2025 Denis Pushkarev (zloirock.ru)',\n license: 'https://github.com/zloirock/core-js/blob/v3.40.0/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n","'use strict';\nvar store = require('../internals/shared-store');\n\nmodule.exports = function (key, value) {\n return store[key] || (store[key] = value || {});\n};\n","'use strict';\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.0.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Symbol = globalThis.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name)) {\n WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n ? Symbol[name]\n : createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw new $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\n\nvar document = globalThis.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a !== 7;\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n value: 42,\n writable: false\n }).prototype !== 42;\n});\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw new $TypeError($String(argument) + ' is not an object');\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n var current = $getOwnPropertyDescriptor(O, P);\n if (current && current[WRITABLE]) {\n O[P] = Attributes.value;\n Attributes = {\n configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n writable: false\n };\n }\n } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar WeakMap = globalThis.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n","'use strict';\nvar shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","'use strict';\nmodule.exports = {};\n","'use strict';\nvar NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = globalThis.TypeError;\nvar WeakMap = globalThis.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw new TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n /* eslint-disable no-self-assign -- prototype methods protection */\n store.get = store.get;\n store.has = store.has;\n store.set = store.set;\n /* eslint-enable no-self-assign -- prototype methods protection */\n set = function (it, metadata) {\n if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n store.set(it, metadata);\n return metadata;\n };\n get = function (it) {\n return store.get(it) || {};\n };\n has = function (it) {\n return store.has(it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\).*$/, '$1') + ']';\n }\n if (options && options.getter) name = 'get ' + name;\n if (options && options.setter) name = 'set ' + name;\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n else value.name = name;\n }\n if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n defineProperty(value, 'length', { value: options.arity });\n }\n try {\n if (options && hasOwn(options, 'constructor') && options.constructor) {\n if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n } else if (value.prototype) value.prototype = undefined;\n } catch (error) { /* empty */ }\n var state = enforceInternalState(value);\n if (!hasOwn(state, 'source')) {\n state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar definePropertyModule = require('../internals/object-define-property');\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nmodule.exports = function (O, key, value, options) {\n if (!options) options = {};\n var simple = options.enumerable;\n var name = options.name !== undefined ? options.name : key;\n if (isCallable(value)) makeBuiltIn(value, name, options);\n if (options.global) {\n if (simple) O[key] = value;\n else defineGlobalProperty(key, value);\n } else {\n try {\n if (!options.unsafe) delete O[key];\n else if (O[key]) simple = true;\n } catch (error) { /* empty */ }\n if (simple) O[key] = value;\n else definePropertyModule.f(O, key, {\n value: value,\n enumerable: false,\n configurable: !options.nonConfigurable,\n writable: !options.nonWritable\n });\n } return O;\n};\n","'use strict';\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n var n = +x;\n return (n > 0 ? floor : ceil)(n);\n};\n","'use strict';\nvar trunc = require('../internals/math-trunc');\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- NaN check\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n var len = toIntegerOrInfinity(argument);\n return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","'use strict';\nvar toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n if (length === 0) return !IS_INCLUDES && -1;\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el !== el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value !== value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n","'use strict';\n// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","'use strict';\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source, exceptions) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value === POLYFILL ? true\n : value === NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.dontCallGetSet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = globalThis;\n } else if (STATIC) {\n target = globalThis[TARGET] || defineGlobalProperty(TARGET, {});\n } else {\n target = globalThis[TARGET] && globalThis[TARGET].prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.dontCallGetSet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n defineBuiltIn(target, key, sourceProperty, options);\n }\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","'use strict';\nvar classof = require('../internals/classof');\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string');\n return $String(argument);\n};\n","'use strict';\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineProperty = require('../internals/object-define-property');\n\nmodule.exports = function (target, name, descriptor) {\n if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true });\n if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true });\n return defineProperty.f(target, name, descriptor);\n};\n","// `Symbol.prototype.description` getter\n// https://tc39.es/ecma262/#sec-symbol.prototype.description\n'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar toString = require('../internals/to-string');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\n\nvar NativeSymbol = globalThis.Symbol;\nvar SymbolPrototype = NativeSymbol && NativeSymbol.prototype;\n\nif (DESCRIPTORS && isCallable(NativeSymbol) && (!('description' in SymbolPrototype) ||\n // Safari 12 bug\n NativeSymbol().description !== undefined\n)) {\n var EmptyStringDescriptionStore = {};\n // wrap Symbol constructor for correct work with undefined description\n var SymbolWrapper = function Symbol() {\n var description = arguments.length < 1 || arguments[0] === undefined ? undefined : toString(arguments[0]);\n var result = isPrototypeOf(SymbolPrototype, this)\n // eslint-disable-next-line sonarjs/inconsistent-function-call -- ok\n ? new NativeSymbol(description)\n // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n : description === undefined ? NativeSymbol() : NativeSymbol(description);\n if (description === '') EmptyStringDescriptionStore[result] = true;\n return result;\n };\n\n copyConstructorProperties(SymbolWrapper, NativeSymbol);\n SymbolWrapper.prototype = SymbolPrototype;\n SymbolPrototype.constructor = SymbolWrapper;\n\n var NATIVE_SYMBOL = String(NativeSymbol('description detection')) === 'Symbol(description detection)';\n var thisSymbolValue = uncurryThis(SymbolPrototype.valueOf);\n var symbolDescriptiveString = uncurryThis(SymbolPrototype.toString);\n var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n var replace = uncurryThis(''.replace);\n var stringSlice = uncurryThis(''.slice);\n\n defineBuiltInAccessor(SymbolPrototype, 'description', {\n configurable: true,\n get: function description() {\n var symbol = thisSymbolValue(this);\n if (hasOwn(EmptyStringDescriptionStore, symbol)) return '';\n var string = symbolDescriptiveString(symbol);\n var desc = NATIVE_SYMBOL ? stringSlice(string, 7, -1) : replace(string, regexp, '$1');\n return desc === '' ? undefined : desc;\n }\n });\n\n $({ global: true, constructor: true, forced: true }, {\n Symbol: SymbolWrapper\n });\n}\n","'use strict';\nvar classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n return classof(argument) === 'Array';\n};\n","'use strict';\nvar $TypeError = TypeError;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991\n\nmodule.exports = function (it) {\n if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded');\n return it;\n};\n","'use strict';\nvar classofRaw = require('../internals/classof-raw');\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = function (fn) {\n // Nashorn bug:\n // https://github.com/zloirock/core-js/issues/1128\n // https://github.com/zloirock/core-js/issues/1130\n if (classofRaw(fn) === 'Function') return uncurryThis(fn);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar aCallable = require('../internals/a-callable');\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n aCallable(fn);\n return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","'use strict';\nvar isArray = require('../internals/is-array');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer');\nvar bind = require('../internals/function-bind-context');\n\n// `FlattenIntoArray` abstract operation\n// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray\nvar flattenIntoArray = function (target, original, source, sourceLen, start, depth, mapper, thisArg) {\n var targetIndex = start;\n var sourceIndex = 0;\n var mapFn = mapper ? bind(mapper, thisArg) : false;\n var element, elementLen;\n\n while (sourceIndex < sourceLen) {\n if (sourceIndex in source) {\n element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];\n\n if (depth > 0 && isArray(element)) {\n elementLen = lengthOfArrayLike(element);\n targetIndex = flattenIntoArray(target, original, element, elementLen, targetIndex, depth - 1) - 1;\n } else {\n doesNotExceedSafeInteger(targetIndex + 1);\n target[targetIndex] = element;\n }\n\n targetIndex++;\n }\n sourceIndex++;\n }\n return targetIndex;\n};\n\nmodule.exports = flattenIntoArray;\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof');\nvar getBuiltIn = require('../internals/get-built-in');\nvar inspectSource = require('../internals/inspect-source');\n\nvar noop = function () { /* empty */ };\nvar construct = getBuiltIn('Reflect', 'construct');\nvar constructorRegExp = /^\\s*(?:class|function)\\b/;\nvar exec = uncurryThis(constructorRegExp.exec);\nvar INCORRECT_TO_STRING = !constructorRegExp.test(noop);\n\nvar isConstructorModern = function isConstructor(argument) {\n if (!isCallable(argument)) return false;\n try {\n construct(noop, [], argument);\n return true;\n } catch (error) {\n return false;\n }\n};\n\nvar isConstructorLegacy = function isConstructor(argument) {\n if (!isCallable(argument)) return false;\n switch (classof(argument)) {\n case 'AsyncFunction':\n case 'GeneratorFunction':\n case 'AsyncGeneratorFunction': return false;\n }\n try {\n // we can't check .prototype since constructors produced by .bind haven't it\n // `Function#toString` throws on some built-it function in some legacy engines\n // (for example, `DOMQuad` and similar in FF41-)\n return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument));\n } catch (error) {\n return true;\n }\n};\n\nisConstructorLegacy.sham = true;\n\n// `IsConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-isconstructor\nmodule.exports = !construct || fails(function () {\n var called;\n return isConstructorModern(isConstructorModern.call)\n || !isConstructorModern(Object)\n || !isConstructorModern(function () { called = true; })\n || called;\n}) ? isConstructorLegacy : isConstructorModern;\n","'use strict';\nvar isArray = require('../internals/is-array');\nvar isConstructor = require('../internals/is-constructor');\nvar isObject = require('../internals/is-object');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\nvar $Array = Array;\n\n// a part of `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (isConstructor(C) && (C === $Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? $Array : C;\n};\n","'use strict';\nvar arraySpeciesConstructor = require('../internals/array-species-constructor');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar flattenIntoArray = require('../internals/flatten-into-array');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\n// `Array.prototype.flat` method\n// https://tc39.es/ecma262/#sec-array.prototype.flat\n$({ target: 'Array', proto: true }, {\n flat: function flat(/* depthArg = 1 */) {\n var depthArg = arguments.length ? arguments[0] : undefined;\n var O = toObject(this);\n var sourceLen = lengthOfArrayLike(O);\n var A = arraySpeciesCreate(O, 0);\n A.length = flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toIntegerOrInfinity(depthArg));\n return A;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar flattenIntoArray = require('../internals/flatten-into-array');\nvar aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\n// `Array.prototype.flatMap` method\n// https://tc39.es/ecma262/#sec-array.prototype.flatmap\n$({ target: 'Array', proto: true }, {\n flatMap: function flatMap(callbackfn /* , thisArg */) {\n var O = toObject(this);\n var sourceLen = lengthOfArrayLike(O);\n var A;\n aCallable(callbackfn);\n A = arraySpeciesCreate(O, 0);\n A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return A;\n }\n});\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","'use strict';\n/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar definePropertiesModule = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n // eslint-disable-next-line no-useless-assignment -- avoid memory leak\n activeXDocument = null;\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = typeof document != 'undefined'\n ? document.domain && activeXDocument\n ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n : NullProtoObjectViaIFrame()\n : NullProtoObjectViaActiveX(activeXDocument); // WSH\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar defineProperty = require('../internals/object-define-property').f;\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] === undefined) {\n defineProperty(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar fails = require('../internals/fails');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// FF99+ bug\nvar BROKEN_ON_SPARSE = fails(function () {\n // eslint-disable-next-line es/no-array-prototype-includes -- detection\n return !Array(1).includes();\n});\n\n// `Array.prototype.includes` method\n// https://tc39.es/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\nvar $TypeError = TypeError;\n\nvar REDUCE_EMPTY = 'Reduce of empty array with no initial value';\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = lengthOfArrayLike(O);\n aCallable(callbackfn);\n if (length === 0 && argumentsLength < 2) throw new $TypeError(REDUCE_EMPTY);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw new $TypeError(REDUCE_EMPTY);\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call -- required for testing\n method.call(null, argument || function () { return 1; }, 1);\n });\n};\n","'use strict';\n/* global Bun, Deno -- detection */\nvar globalThis = require('../internals/global-this');\nvar userAgent = require('../internals/environment-user-agent');\nvar classof = require('../internals/classof-raw');\n\nvar userAgentStartsWith = function (string) {\n return userAgent.slice(0, string.length) === string;\n};\n\nmodule.exports = (function () {\n if (userAgentStartsWith('Bun/')) return 'BUN';\n if (userAgentStartsWith('Cloudflare-Workers')) return 'CLOUDFLARE';\n if (userAgentStartsWith('Deno/')) return 'DENO';\n if (userAgentStartsWith('Node.js/')) return 'NODE';\n if (globalThis.Bun && typeof Bun.version == 'string') return 'BUN';\n if (globalThis.Deno && typeof Deno.version == 'object') return 'DENO';\n if (classof(globalThis.process) === 'process') return 'NODE';\n if (globalThis.window && globalThis.document) return 'BROWSER';\n return 'REST';\n})();\n","'use strict';\nvar ENVIRONMENT = require('../internals/environment');\n\nmodule.exports = ENVIRONMENT === 'NODE';\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar CHROME_VERSION = require('../internals/environment-v8-version');\nvar IS_NODE = require('../internals/environment-is-node');\n\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\nvar FORCED = CHROME_BUG || !arrayMethodIsStrict('reduce');\n\n// `Array.prototype.reduce` method\n// https://tc39.es/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: FORCED }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n var length = arguments.length;\n return $reduce(this, callbackfn, length, length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduceRight = require('../internals/array-reduce').right;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar CHROME_VERSION = require('../internals/environment-v8-version');\nvar IS_NODE = require('../internals/environment-is-node');\n\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\nvar FORCED = CHROME_BUG || !arrayMethodIsStrict('reduceRight');\n\n// `Array.prototype.reduceRight` method\n// https://tc39.es/ecma262/#sec-array.prototype.reduceright\n$({ target: 'Array', proto: true, forced: FORCED }, {\n reduceRight: function reduceRight(callbackfn /* , initialValue */) {\n return $reduceRight(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (O, P) {\n if (!delete O[P]) throw new $TypeError('Cannot delete property ' + tryToString(P) + ' of ' + tryToString(O));\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis([].slice);\n","'use strict';\nvar arraySlice = require('../internals/array-slice');\n\nvar floor = Math.floor;\n\nvar sort = function (array, comparefn) {\n var length = array.length;\n\n if (length < 8) {\n // insertion sort\n var i = 1;\n var element, j;\n\n while (i < length) {\n j = i;\n element = array[i];\n while (j && comparefn(array[j - 1], element) > 0) {\n array[j] = array[--j];\n }\n if (j !== i++) array[j] = element;\n }\n } else {\n // merge sort\n var middle = floor(length / 2);\n var left = sort(arraySlice(array, 0, middle), comparefn);\n var right = sort(arraySlice(array, middle), comparefn);\n var llength = left.length;\n var rlength = right.length;\n var lindex = 0;\n var rindex = 0;\n\n while (lindex < llength || rindex < rlength) {\n array[lindex + rindex] = (lindex < llength && rindex < rlength)\n ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]\n : lindex < llength ? left[lindex++] : right[rindex++];\n }\n }\n\n return array;\n};\n\nmodule.exports = sort;\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\nvar firefox = userAgent.match(/firefox\\/(\\d+)/i);\n\nmodule.exports = !!firefox && +firefox[1];\n","'use strict';\nvar UA = require('../internals/environment-user-agent');\n\nmodule.exports = /MSIE|Trident/.test(UA);\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\nvar webkit = userAgent.match(/AppleWebKit\\/(\\d+)\\./);\n\nmodule.exports = !!webkit && +webkit[1];\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar deletePropertyOrThrow = require('../internals/delete-property-or-throw');\nvar toString = require('../internals/to-string');\nvar fails = require('../internals/fails');\nvar internalSort = require('../internals/array-sort');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar FF = require('../internals/environment-ff-version');\nvar IE_OR_EDGE = require('../internals/environment-is-ie-or-edge');\nvar V8 = require('../internals/environment-v8-version');\nvar WEBKIT = require('../internals/environment-webkit-version');\n\nvar test = [];\nvar nativeSort = uncurryThis(test.sort);\nvar push = uncurryThis(test.push);\n\n// IE8-\nvar FAILS_ON_UNDEFINED = fails(function () {\n test.sort(undefined);\n});\n// V8 bug\nvar FAILS_ON_NULL = fails(function () {\n test.sort(null);\n});\n// Old WebKit\nvar STRICT_METHOD = arrayMethodIsStrict('sort');\n\nvar STABLE_SORT = !fails(function () {\n // feature detection can be too slow, so check engines versions\n if (V8) return V8 < 70;\n if (FF && FF > 3) return;\n if (IE_OR_EDGE) return true;\n if (WEBKIT) return WEBKIT < 603;\n\n var result = '';\n var code, chr, value, index;\n\n // generate an array with more 512 elements (Chakra and old V8 fails only in this case)\n for (code = 65; code < 76; code++) {\n chr = String.fromCharCode(code);\n\n switch (code) {\n case 66: case 69: case 70: case 72: value = 3; break;\n case 68: case 71: value = 4; break;\n default: value = 2;\n }\n\n for (index = 0; index < 47; index++) {\n test.push({ k: chr + index, v: value });\n }\n }\n\n test.sort(function (a, b) { return b.v - a.v; });\n\n for (index = 0; index < test.length; index++) {\n chr = test[index].k.charAt(0);\n if (result.charAt(result.length - 1) !== chr) result += chr;\n }\n\n return result !== 'DGBEFHACIJK';\n});\n\nvar FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD || !STABLE_SORT;\n\nvar getSortCompare = function (comparefn) {\n return function (x, y) {\n if (y === undefined) return -1;\n if (x === undefined) return 1;\n if (comparefn !== undefined) return +comparefn(x, y) || 0;\n return toString(x) > toString(y) ? 1 : -1;\n };\n};\n\n// `Array.prototype.sort` method\n// https://tc39.es/ecma262/#sec-array.prototype.sort\n$({ target: 'Array', proto: true, forced: FORCED }, {\n sort: function sort(comparefn) {\n if (comparefn !== undefined) aCallable(comparefn);\n\n var array = toObject(this);\n\n if (STABLE_SORT) return comparefn === undefined ? nativeSort(array) : nativeSort(array, comparefn);\n\n var items = [];\n var arrayLength = lengthOfArrayLike(array);\n var itemsLength, index;\n\n for (index = 0; index < arrayLength; index++) {\n if (index in array) push(items, array[index]);\n }\n\n internalSort(items, getSortCompare(comparefn));\n\n itemsLength = lengthOfArrayLike(items);\n index = 0;\n\n while (index < itemsLength) array[index] = items[index++];\n while (index < arrayLength) deletePropertyOrThrow(array, index++);\n\n return array;\n }\n});\n","'use strict';\n// this method was added to unscopables after implementation\n// in popular engines, so it's moved to a separate module\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('flat');\n","'use strict';\n// this method was added to unscopables after implementation\n// in popular engines, so it's moved to a separate module\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('flatMap');\n","'use strict';\nvar $ = require('../internals/export');\n\n// eslint-disable-next-line es/no-math-hypot -- required for testing\nvar $hypot = Math.hypot;\nvar abs = Math.abs;\nvar sqrt = Math.sqrt;\n\n// Chrome 77 bug\n// https://bugs.chromium.org/p/v8/issues/detail?id=9546\nvar FORCED = !!$hypot && $hypot(Infinity, NaN) !== Infinity;\n\n// `Math.hypot` method\n// https://tc39.es/ecma262/#sec-math.hypot\n$({ target: 'Math', stat: true, arity: 2, forced: FORCED }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n hypot: function hypot(value1, value2) {\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * sqrt(sum);\n }\n});\n","'use strict';\nmodule.exports = {};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","'use strict';\nvar classof = require('../internals/classof');\nvar getMethod = require('../internals/get-method');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR)\n || getMethod(it, '@@iterator')\n || Iterators[classof(it)];\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument, usingIterator) {\n var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));\n throw new $TypeError(tryToString(argument) + ' is not iterable');\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar getMethod = require('../internals/get-method');\n\nmodule.exports = function (iterator, kind, value) {\n var innerResult, innerError;\n anObject(iterator);\n try {\n innerResult = getMethod(iterator, 'return');\n if (!innerResult) {\n if (kind === 'throw') throw value;\n return value;\n }\n innerResult = call(innerResult, iterator);\n } catch (error) {\n innerError = true;\n innerResult = error;\n }\n if (kind === 'throw') throw value;\n if (innerError) throw innerResult;\n anObject(innerResult);\n return value;\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar $TypeError = TypeError;\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar ResultPrototype = Result.prototype;\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_RECORD = !!(options && options.IS_RECORD);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator, 'normal', condition);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_RECORD) {\n iterator = iterable.iterator;\n } else if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n }\n iterator = getIterator(iterable, iterFn);\n }\n\n next = IS_RECORD ? iterable.next : iterator.next;\n while (!(step = call(next, iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor(0, value));\n else object[key] = value;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar iterate = require('../internals/iterate');\nvar createProperty = require('../internals/create-property');\n\n// `Object.fromEntries` method\n// https://tc39.es/ecma262/#sec-object.fromentries\n$({ target: 'Object', stat: true }, {\n fromEntries: function fromEntries(iterable) {\n var obj = {};\n iterate(iterable, function (k, v) {\n createProperty(obj, k, v);\n }, { AS_ENTRIES: true });\n return obj;\n }\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\n\nmodule.exports = function (object, key, method) {\n try {\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));\n } catch (error) { /* empty */ }\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nmodule.exports = function (argument) {\n return isObject(argument) || argument === null;\n};\n","'use strict';\nvar isPossiblePrototype = require('../internals/is-possible-prototype');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument) {\n if (isPossiblePrototype(argument)) return argument;\n throw new $TypeError(\"Can't set \" + $String(argument) + ' as a prototype');\n};\n","'use strict';\n/* eslint-disable no-proto -- safe */\nvar uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');\nvar isObject = require('../internals/is-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n// eslint-disable-next-line es/no-object-setprototypeof -- safe\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set');\n setter(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n requireObjectCoercible(O);\n aPossiblePrototype(proto);\n if (!isObject(O)) return O;\n if (CORRECT_SETTER) setter(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","'use strict';\nvar defineProperty = require('../internals/object-define-property').f;\nvar hasOwn = require('../internals/has-own-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (target, TAG, STATIC) {\n if (target && !STATIC) target = target.prototype;\n if (target && !hasOwn(target, TO_STRING_TAG)) {\n defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineBuiltInAccessor(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","'use strict';\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it, Prototype) {\n if (isPrototypeOf(Prototype, it)) return it;\n throw new $TypeError('Incorrect invocation');\n};\n","'use strict';\nvar isConstructor = require('../internals/is-constructor');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsConstructor(argument) is true`\nmodule.exports = function (argument) {\n if (isConstructor(argument)) return argument;\n throw new $TypeError(tryToString(argument) + ' is not a constructor');\n};\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar aConstructor = require('../internals/a-constructor');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || isNullOrUndefined(S = anObject(C)[SPECIES]) ? defaultConstructor : aConstructor(S);\n};\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar call = FunctionPrototype.call;\n\n// eslint-disable-next-line es/no-function-prototype-bind, es/no-reflect -- safe\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () {\n return call.apply(apply, arguments);\n});\n","'use strict';\nvar $TypeError = TypeError;\n\nmodule.exports = function (passed, required) {\n if (passed < required) throw new $TypeError('Not enough arguments');\n return passed;\n};\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\n// eslint-disable-next-line redos/no-vulnerable -- safe\nmodule.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent);\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar apply = require('../internals/function-apply');\nvar bind = require('../internals/function-bind-context');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar fails = require('../internals/fails');\nvar html = require('../internals/html');\nvar arraySlice = require('../internals/array-slice');\nvar createElement = require('../internals/document-create-element');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar IS_IOS = require('../internals/environment-is-ios');\nvar IS_NODE = require('../internals/environment-is-node');\n\nvar set = globalThis.setImmediate;\nvar clear = globalThis.clearImmediate;\nvar process = globalThis.process;\nvar Dispatch = globalThis.Dispatch;\nvar Function = globalThis.Function;\nvar MessageChannel = globalThis.MessageChannel;\nvar String = globalThis.String;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar $location, defer, channel, port;\n\nfails(function () {\n // Deno throws a ReferenceError on `location` access without `--location` flag\n $location = globalThis.location;\n});\n\nvar run = function (id) {\n if (hasOwn(queue, id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar eventListener = function (event) {\n run(event.data);\n};\n\nvar globalPostMessageDefer = function (id) {\n // old engines have not location.origin\n globalThis.postMessage(String(id), $location.protocol + '//' + $location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = function setImmediate(handler) {\n validateArgumentsLength(arguments.length, 1);\n var fn = isCallable(handler) ? handler : Function(handler);\n var args = arraySlice(arguments, 1);\n queue[++counter] = function () {\n apply(fn, undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (IS_NODE) {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = eventListener;\n defer = bind(port.postMessage, port);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (\n globalThis.addEventListener &&\n isCallable(globalThis.postMessage) &&\n !globalThis.importScripts &&\n $location && $location.protocol !== 'file:' &&\n !fails(globalPostMessageDefer)\n ) {\n defer = globalPostMessageDefer;\n globalThis.addEventListener('message', eventListener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar DESCRIPTORS = require('../internals/descriptors');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Avoid NodeJS experimental warning\nmodule.exports = function (name) {\n if (!DESCRIPTORS) return globalThis[name];\n var descriptor = getOwnPropertyDescriptor(globalThis, name);\n return descriptor && descriptor.value;\n};\n","'use strict';\nvar Queue = function () {\n this.head = null;\n this.tail = null;\n};\n\nQueue.prototype = {\n add: function (item) {\n var entry = { item: item, next: null };\n var tail = this.tail;\n if (tail) tail.next = entry;\n else this.head = entry;\n this.tail = entry;\n },\n get: function () {\n var entry = this.head;\n if (entry) {\n var next = this.head = entry.next;\n if (next === null) this.tail = null;\n return entry.item;\n }\n }\n};\n\nmodule.exports = Queue;\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\nmodule.exports = /ipad|iphone|ipod/i.test(userAgent) && typeof Pebble != 'undefined';\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\nmodule.exports = /web0s(?!.*chrome)/i.test(userAgent);\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar safeGetBuiltIn = require('../internals/safe-get-built-in');\nvar bind = require('../internals/function-bind-context');\nvar macrotask = require('../internals/task').set;\nvar Queue = require('../internals/queue');\nvar IS_IOS = require('../internals/environment-is-ios');\nvar IS_IOS_PEBBLE = require('../internals/environment-is-ios-pebble');\nvar IS_WEBOS_WEBKIT = require('../internals/environment-is-webos-webkit');\nvar IS_NODE = require('../internals/environment-is-node');\n\nvar MutationObserver = globalThis.MutationObserver || globalThis.WebKitMutationObserver;\nvar document = globalThis.document;\nvar process = globalThis.process;\nvar Promise = globalThis.Promise;\nvar microtask = safeGetBuiltIn('queueMicrotask');\nvar notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!microtask) {\n var queue = new Queue();\n\n var flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (fn = queue.get()) try {\n fn();\n } catch (error) {\n if (queue.head) notify();\n throw error;\n }\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898\n if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true });\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (!IS_IOS_PEBBLE && Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise.resolve(undefined);\n // workaround of WebKit ~ iOS Safari 10.1 bug\n promise.constructor = Promise;\n then = bind(promise.then, promise);\n notify = function () {\n then(flush);\n };\n // Node.js without promises\n } else if (IS_NODE) {\n notify = function () {\n process.nextTick(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessage\n // - onreadystatechange\n // - setTimeout\n } else {\n // `webpack` dev server bug on IE global methods - use bind(fn, global)\n macrotask = bind(macrotask, globalThis);\n notify = function () {\n macrotask(flush);\n };\n }\n\n microtask = function (fn) {\n if (!queue.head) notify();\n queue.add(fn);\n };\n}\n\nmodule.exports = microtask;\n","'use strict';\nmodule.exports = function (a, b) {\n try {\n // eslint-disable-next-line no-console -- safe\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n } catch (error) { /* empty */ }\n};\n","'use strict';\nmodule.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nmodule.exports = globalThis.Promise;\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar isCallable = require('../internals/is-callable');\nvar isForced = require('../internals/is-forced');\nvar inspectSource = require('../internals/inspect-source');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar ENVIRONMENT = require('../internals/environment');\nvar IS_PURE = require('../internals/is-pure');\nvar V8_VERSION = require('../internals/environment-v8-version');\n\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\nvar SPECIES = wellKnownSymbol('species');\nvar SUBCLASSING = false;\nvar NATIVE_PROMISE_REJECTION_EVENT = isCallable(globalThis.PromiseRejectionEvent);\n\nvar FORCED_PROMISE_CONSTRUCTOR = isForced('Promise', function () {\n var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(NativePromiseConstructor);\n var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(NativePromiseConstructor);\n // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // We can't detect it synchronously, so just check versions\n if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION === 66) return true;\n // We need Promise#{ catch, finally } in the pure version for preventing prototype pollution\n if (IS_PURE && !(NativePromisePrototype['catch'] && NativePromisePrototype['finally'])) return true;\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (!V8_VERSION || V8_VERSION < 51 || !/native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) {\n // Detect correctness of subclassing with @@species support\n var promise = new NativePromiseConstructor(function (resolve) { resolve(1); });\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES] = FakePromise;\n SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise;\n if (!SUBCLASSING) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n } return !GLOBAL_CORE_JS_PROMISE && (ENVIRONMENT === 'BROWSER' || ENVIRONMENT === 'DENO') && !NATIVE_PROMISE_REJECTION_EVENT;\n});\n\nmodule.exports = {\n CONSTRUCTOR: FORCED_PROMISE_CONSTRUCTOR,\n REJECTION_EVENT: NATIVE_PROMISE_REJECTION_EVENT,\n SUBCLASSING: SUBCLASSING\n};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\n\nvar $TypeError = TypeError;\n\nvar PromiseCapability = function (C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw new $TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aCallable(resolve);\n this.reject = aCallable(reject);\n};\n\n// `NewPromiseCapability` abstract operation\n// https://tc39.es/ecma262/#sec-newpromisecapability\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar IS_NODE = require('../internals/environment-is-node');\nvar globalThis = require('../internals/global-this');\nvar call = require('../internals/function-call');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar aCallable = require('../internals/a-callable');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar perform = require('../internals/perform');\nvar Queue = require('../internals/queue');\nvar InternalStateModule = require('../internals/internal-state');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar PromiseConstructorDetection = require('../internals/promise-constructor-detection');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\n\nvar PROMISE = 'Promise';\nvar FORCED_PROMISE_CONSTRUCTOR = PromiseConstructorDetection.CONSTRUCTOR;\nvar NATIVE_PROMISE_REJECTION_EVENT = PromiseConstructorDetection.REJECTION_EVENT;\nvar NATIVE_PROMISE_SUBCLASSING = PromiseConstructorDetection.SUBCLASSING;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar setInternalState = InternalStateModule.set;\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\nvar PromiseConstructor = NativePromiseConstructor;\nvar PromisePrototype = NativePromisePrototype;\nvar TypeError = globalThis.TypeError;\nvar document = globalThis.document;\nvar process = globalThis.process;\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\n\nvar DISPATCH_EVENT = !!(document && document.createEvent && globalThis.dispatchEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\n\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && isCallable(then = it.then) ? then : false;\n};\n\nvar callReaction = function (reaction, state) {\n var value = state.value;\n var ok = state.state === FULFILLED;\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(new TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n call(then, result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n};\n\nvar notify = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n microtask(function () {\n var reactions = state.reactions;\n var reaction;\n while (reaction = reactions.get()) {\n callReaction(reaction, state);\n }\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n globalThis.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_PROMISE_REJECTION_EVENT && (handler = globalThis['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n call(task, globalThis, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n call(task, globalThis, function () {\n var promise = state.facade;\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n};\n\nvar internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw new TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n call(then, value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED_PROMISE_CONSTRUCTOR) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromisePrototype);\n aCallable(executor);\n call(Internal, this);\n var state = getInternalPromiseState(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n\n PromisePrototype = PromiseConstructor.prototype;\n\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: new Queue(),\n rejection: false,\n state: PENDING,\n value: null\n });\n };\n\n // `Promise.prototype.then` method\n // https://tc39.es/ecma262/#sec-promise.prototype.then\n Internal.prototype = defineBuiltIn(PromisePrototype, 'then', function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n state.parent = true;\n reaction.ok = isCallable(onFulfilled) ? onFulfilled : true;\n reaction.fail = isCallable(onRejected) && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n if (state.state === PENDING) state.reactions.add(reaction);\n else microtask(function () {\n callReaction(reaction, state);\n });\n return reaction.promise;\n });\n\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalPromiseState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && isCallable(NativePromiseConstructor) && NativePromisePrototype !== Object.prototype) {\n nativeThen = NativePromisePrototype.then;\n\n if (!NATIVE_PROMISE_SUBCLASSING) {\n // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs\n defineBuiltIn(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n call(nativeThen, that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n }\n\n // make `.constructor === Promise` work for native promise-based APIs\n try {\n delete NativePromisePrototype.constructor;\n } catch (error) { /* empty */ }\n\n // make `instanceof Promise` work for native promise-based APIs\n if (setPrototypeOf) {\n setPrototypeOf(NativePromisePrototype, PromisePrototype);\n }\n }\n}\n\n// `Promise` constructor\n// https://tc39.es/ecma262/#sec-promise-executor\n$({ global: true, constructor: true, wrap: true, forced: FORCED_PROMISE_CONSTRUCTOR }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n try {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n } catch (error) { return false; } // workaround of old WebKit + `eval` bug\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","'use strict';\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\n\nmodule.exports = FORCED_PROMISE_CONSTRUCTOR || !checkCorrectnessOfIteration(function (iterable) {\n NativePromiseConstructor.all(iterable).then(undefined, function () { /* empty */ });\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\n// `Promise.all` method\n// https://tc39.es/ecma262/#sec-promise.all\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aCallable(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n remaining++;\n call($promiseResolve, C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar defineBuiltIn = require('../internals/define-built-in');\n\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\n\n// `Promise.prototype.catch` method\n// https://tc39.es/ecma262/#sec-promise.prototype.catch\n$({ target: 'Promise', proto: true, forced: FORCED_PROMISE_CONSTRUCTOR, real: true }, {\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n});\n\n// makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`\nif (!IS_PURE && isCallable(NativePromiseConstructor)) {\n var method = getBuiltIn('Promise').prototype['catch'];\n if (NativePromisePrototype['catch'] !== method) {\n defineBuiltIn(NativePromisePrototype, 'catch', method, { unsafe: true });\n }\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\n// `Promise.race` method\n// https://tc39.es/ecma262/#sec-promise.race\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aCallable(C.resolve);\n iterate(iterable, function (promise) {\n call($promiseResolve, C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\n\n// `Promise.reject` method\n// https://tc39.es/ecma262/#sec-promise.reject\n$({ target: 'Promise', stat: true, forced: FORCED_PROMISE_CONSTRUCTOR }, {\n reject: function reject(r) {\n var capability = newPromiseCapabilityModule.f(this);\n var capabilityReject = capability.reject;\n capabilityReject(r);\n return capability.promise;\n }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar IS_PURE = require('../internals/is-pure');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\nvar promiseResolve = require('../internals/promise-resolve');\n\nvar PromiseConstructorWrapper = getBuiltIn('Promise');\nvar CHECK_WRAPPER = IS_PURE && !FORCED_PROMISE_CONSTRUCTOR;\n\n// `Promise.resolve` method\n// https://tc39.es/ecma262/#sec-promise.resolve\n$({ target: 'Promise', stat: true, forced: IS_PURE || FORCED_PROMISE_CONSTRUCTOR }, {\n resolve: function resolve(x) {\n return promiseResolve(CHECK_WRAPPER && this === PromiseConstructorWrapper ? NativePromiseConstructor : this, x);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar fails = require('../internals/fails');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar speciesConstructor = require('../internals/species-constructor');\nvar promiseResolve = require('../internals/promise-resolve');\nvar defineBuiltIn = require('../internals/define-built-in');\n\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\n\n// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829\nvar NON_GENERIC = !!NativePromiseConstructor && fails(function () {\n // eslint-disable-next-line unicorn/no-thenable -- required for testing\n NativePromisePrototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });\n});\n\n// `Promise.prototype.finally` method\n// https://tc39.es/ecma262/#sec-promise.prototype.finally\n$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {\n 'finally': function (onFinally) {\n var C = speciesConstructor(this, getBuiltIn('Promise'));\n var isFunction = isCallable(onFinally);\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n }\n});\n\n// makes sure that native promise-based APIs `Promise#finally` properly works with patched `Promise#then`\nif (!IS_PURE && isCallable(NativePromiseConstructor)) {\n var method = getBuiltIn('Promise').prototype['finally'];\n if (NativePromisePrototype['finally'] !== method) {\n defineBuiltIn(NativePromisePrototype, 'finally', method, { unsafe: true });\n }\n}\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n isCallable(NewTarget = dummy.constructor) &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.es/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) === 'RegExp');\n};\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.hasIndices) result += 'd';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.unicodeSets) result += 'v';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar hasOwn = require('../internals/has-own-property');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar regExpFlags = require('../internals/regexp-flags');\n\nvar RegExpPrototype = RegExp.prototype;\n\nmodule.exports = function (R) {\n var flags = R.flags;\n return flags === undefined && !('flags' in RegExpPrototype) && !hasOwn(R, 'flags') && isPrototypeOf(RegExpPrototype, R)\n ? call(regExpFlags, R) : flags;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\n// babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\nvar $RegExp = globalThis.RegExp;\n\nvar UNSUPPORTED_Y = fails(function () {\n var re = $RegExp('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') !== null;\n});\n\n// UC Browser bug\n// https://github.com/zloirock/core-js/issues/1008\nvar MISSED_STICKY = UNSUPPORTED_Y || fails(function () {\n return !$RegExp('a', 'y').sticky;\n});\n\nvar BROKEN_CARET = UNSUPPORTED_Y || fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = $RegExp('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') !== null;\n});\n\nmodule.exports = {\n BROKEN_CARET: BROKEN_CARET,\n MISSED_STICKY: MISSED_STICKY,\n UNSUPPORTED_Y: UNSUPPORTED_Y\n};\n","'use strict';\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (Target, Source, key) {\n key in Target || defineProperty(Target, key, {\n configurable: true,\n get: function () { return Source[key]; },\n set: function (it) { Source[key] = it; }\n });\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\n// babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError\nvar $RegExp = globalThis.RegExp;\n\nmodule.exports = fails(function () {\n var re = $RegExp('.', 's');\n return !(re.dotAll && re.test('\\n') && re.flags === 's');\n});\n","'use strict';\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\n// babel-minify and Closure Compiler transpiles RegExp('(?b)', 'g') -> /(?b)/g and it causes SyntaxError\nvar $RegExp = globalThis.RegExp;\n\nmodule.exports = fails(function () {\n var re = $RegExp('(?b)', 'g');\n return re.exec('b').groups.a !== 'b' ||\n 'b'.replace(re, '$c') !== 'bc';\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar create = require('../internals/object-create');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar isRegExp = require('../internals/is-regexp');\nvar toString = require('../internals/to-string');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar proxyAccessor = require('../internals/proxy-accessor');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar fails = require('../internals/fails');\nvar hasOwn = require('../internals/has-own-property');\nvar enforceInternalState = require('../internals/internal-state').enforce;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = globalThis.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar SyntaxError = globalThis.SyntaxError;\nvar exec = uncurryThis(RegExpPrototype.exec);\nvar charAt = uncurryThis(''.charAt);\nvar replace = uncurryThis(''.replace);\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar stringSlice = uncurryThis(''.slice);\n// TODO: Use only proper RegExpIdentifierName\nvar IS_NCG = /^\\?<[^\\s\\d!#%&*+<=>@^][^\\s!#%&*+<=>@^]*>/;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar MISSED_STICKY = stickyHelpers.MISSED_STICKY;\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar BASE_FORCED = DESCRIPTORS &&\n (!CORRECT_NEW || MISSED_STICKY || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails(function () {\n re2[MATCH] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n // eslint-disable-next-line sonarjs/inconsistent-function-call -- required for testing\n return NativeRegExp(re1) !== re1 || NativeRegExp(re2) === re2 || String(NativeRegExp(re1, 'i')) !== '/a/i';\n }));\n\nvar handleDotAll = function (string) {\n var length = string.length;\n var index = 0;\n var result = '';\n var brackets = false;\n var chr;\n for (; index <= length; index++) {\n chr = charAt(string, index);\n if (chr === '\\\\') {\n result += chr + charAt(string, ++index);\n continue;\n }\n if (!brackets && chr === '.') {\n result += '[\\\\s\\\\S]';\n } else {\n if (chr === '[') {\n brackets = true;\n } else if (chr === ']') {\n brackets = false;\n } result += chr;\n }\n } return result;\n};\n\nvar handleNCG = function (string) {\n var length = string.length;\n var index = 0;\n var result = '';\n var named = [];\n var names = create(null);\n var brackets = false;\n var ncg = false;\n var groupid = 0;\n var groupname = '';\n var chr;\n for (; index <= length; index++) {\n chr = charAt(string, index);\n if (chr === '\\\\') {\n chr += charAt(string, ++index);\n } else if (chr === ']') {\n brackets = false;\n } else if (!brackets) switch (true) {\n case chr === '[':\n brackets = true;\n break;\n case chr === '(':\n result += chr;\n // ignore non-capturing groups\n if (stringSlice(string, index + 1, index + 3) === '?:') {\n continue;\n }\n if (exec(IS_NCG, stringSlice(string, index + 1))) {\n index += 2;\n ncg = true;\n }\n groupid++;\n continue;\n case chr === '>' && ncg:\n if (groupname === '' || hasOwn(names, groupname)) {\n throw new SyntaxError('Invalid capture group name');\n }\n names[groupname] = true;\n named[named.length] = [groupname, groupid];\n ncg = false;\n groupname = '';\n continue;\n }\n if (ncg) groupname += chr;\n else result += chr;\n } return [result, named];\n};\n\n// `RegExp` constructor\n// https://tc39.es/ecma262/#sec-regexp-constructor\nif (isForced('RegExp', BASE_FORCED)) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = isPrototypeOf(RegExpPrototype, this);\n var patternIsRegExp = isRegExp(pattern);\n var flagsAreUndefined = flags === undefined;\n var groups = [];\n var rawPattern = pattern;\n var rawFlags, dotAll, sticky, handled, result, state;\n\n if (!thisIsRegExp && patternIsRegExp && flagsAreUndefined && pattern.constructor === RegExpWrapper) {\n return pattern;\n }\n\n if (patternIsRegExp || isPrototypeOf(RegExpPrototype, pattern)) {\n pattern = pattern.source;\n if (flagsAreUndefined) flags = getRegExpFlags(rawPattern);\n }\n\n pattern = pattern === undefined ? '' : toString(pattern);\n flags = flags === undefined ? '' : toString(flags);\n rawPattern = pattern;\n\n if (UNSUPPORTED_DOT_ALL && 'dotAll' in re1) {\n dotAll = !!flags && stringIndexOf(flags, 's') > -1;\n if (dotAll) flags = replace(flags, /s/g, '');\n }\n\n rawFlags = flags;\n\n if (MISSED_STICKY && 'sticky' in re1) {\n sticky = !!flags && stringIndexOf(flags, 'y') > -1;\n if (sticky && UNSUPPORTED_Y) flags = replace(flags, /y/g, '');\n }\n\n if (UNSUPPORTED_NCG) {\n handled = handleNCG(pattern);\n pattern = handled[0];\n groups = handled[1];\n }\n\n result = inheritIfRequired(NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype, RegExpWrapper);\n\n if (dotAll || sticky || groups.length) {\n state = enforceInternalState(result);\n if (dotAll) {\n state.dotAll = true;\n state.raw = RegExpWrapper(handleDotAll(pattern), rawFlags);\n }\n if (sticky) state.sticky = true;\n if (groups.length) state.groups = groups;\n }\n\n if (pattern !== rawPattern) try {\n // fails in old engines, but we have no alternatives for unsupported regex syntax\n createNonEnumerableProperty(result, 'source', rawPattern === '' ? '(?:)' : rawPattern);\n } catch (error) { /* empty */ }\n\n return result;\n };\n\n for (var keys = getOwnPropertyNames(NativeRegExp), index = 0; keys.length > index;) {\n proxyAccessor(RegExpWrapper, NativeRegExp, keys[index++]);\n }\n\n RegExpPrototype.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype;\n defineBuiltIn(globalThis, 'RegExp', RegExpWrapper, { constructor: true });\n}\n\n// https://tc39.es/ecma262/#sec-get-regexp-@@species\nsetSpecies('RegExp');\n","'use strict';\n/* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */\n/* eslint-disable regexp/no-useless-quantifier -- testing */\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar regexpFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar shared = require('../internals/shared');\nvar create = require('../internals/object-create');\nvar getInternalState = require('../internals/internal-state').get;\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');\n\nvar nativeReplace = shared('native-string-replace', String.prototype.replace);\nvar nativeExec = RegExp.prototype.exec;\nvar patchedExec = nativeExec;\nvar charAt = uncurryThis(''.charAt);\nvar indexOf = uncurryThis(''.indexOf);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n call(nativeExec, re1, 'a');\n call(nativeExec, re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG;\n\nif (PATCH) {\n patchedExec = function exec(string) {\n var re = this;\n var state = getInternalState(re);\n var str = toString(string);\n var raw = state.raw;\n var result, reCopy, lastIndex, match, i, object, group;\n\n if (raw) {\n raw.lastIndex = re.lastIndex;\n result = call(patchedExec, raw, str);\n re.lastIndex = raw.lastIndex;\n return result;\n }\n\n var groups = state.groups;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = call(regexpFlags, re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = replace(flags, 'y', '');\n if (indexOf(flags, 'g') === -1) {\n flags += 'g';\n }\n\n strCopy = stringSlice(str, re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && charAt(str, re.lastIndex - 1) !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = call(nativeExec, sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = stringSlice(match.input, charsAdded);\n match[0] = stringSlice(match[0], charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn't work for /(.?)?/\n call(nativeReplace, match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n if (match && groups) {\n match.groups = object = create(null);\n for (i = 0; i < groups.length; i++) {\n group = groups[i];\n object[group[0]] = match[group[1]];\n }\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n// `RegExp.prototype.exec` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.exec\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar regExpFlags = require('../internals/regexp-flags');\nvar fails = require('../internals/fails');\n\n// babel-minify and Closure Compiler transpiles RegExp('.', 'd') -> /./d and it causes SyntaxError\nvar RegExp = globalThis.RegExp;\nvar RegExpPrototype = RegExp.prototype;\n\nvar FORCED = DESCRIPTORS && fails(function () {\n var INDICES_SUPPORT = true;\n try {\n RegExp('.', 'd');\n } catch (error) {\n INDICES_SUPPORT = false;\n }\n\n var O = {};\n // modern V8 bug\n var calls = '';\n var expected = INDICES_SUPPORT ? 'dgimsy' : 'gimsy';\n\n var addGetter = function (key, chr) {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty(O, key, { get: function () {\n calls += chr;\n return true;\n } });\n };\n\n var pairs = {\n dotAll: 's',\n global: 'g',\n ignoreCase: 'i',\n multiline: 'm',\n sticky: 'y'\n };\n\n if (INDICES_SUPPORT) pairs.hasIndices = 'd';\n\n for (var key in pairs) addGetter(key, pairs[key]);\n\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n var result = Object.getOwnPropertyDescriptor(RegExpPrototype, 'flags').get.call(O);\n\n return result !== expected || calls !== expected;\n});\n\n// `RegExp.prototype.flags` getter\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nif (FORCED) defineBuiltInAccessor(RegExpPrototype, 'flags', {\n configurable: true,\n get: regExpFlags\n});\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar call = require('../internals/function-call');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar SPECIES = wellKnownSymbol('species');\nvar RegExpPrototype = RegExp.prototype;\n\nmodule.exports = function (KEY, exec, FORCED, SHAM) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegExp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) !== 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () {\n execCalled = true;\n return null;\n };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n FORCED\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n var $exec = regexp.exec;\n if ($exec === regexpExec || $exec === RegExpPrototype.exec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: call(nativeRegExpMethod, regexp, str, arg2) };\n }\n return { done: true, value: call(nativeMethod, str, regexp, arg2) };\n }\n return { done: false };\n });\n\n defineBuiltIn(String.prototype, KEY, methods[0]);\n defineBuiltIn(RegExpPrototype, SYMBOL, methods[1]);\n }\n\n if (SHAM) createNonEnumerableProperty(RegExpPrototype[SYMBOL], 'sham', true);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar stringSlice = uncurryThis(''.slice);\n\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = toString(requireObjectCoercible($this));\n var position = toIntegerOrInfinity(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = charCodeAt(S, position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING\n ? charAt(S, position)\n : first\n : CONVERT_TO_STRING\n ? stringSlice(S, position, position + 2)\n : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.es/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.es/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar floor = Math.floor;\nvar charAt = uncurryThis(''.charAt);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\n// eslint-disable-next-line redos/no-vulnerable -- safe\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d{1,2}|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d{1,2})/g;\n\n// `GetSubstitution` abstract operation\n// https://tc39.es/ecma262/#sec-getsubstitution\nmodule.exports = function (matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return replace(replacement, symbols, function (match, ch) {\n var capture;\n switch (charAt(ch, 0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return stringSlice(str, 0, position);\n case \"'\": return stringSlice(str, tailPos);\n case '<':\n capture = namedCaptures[stringSlice(ch, 1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? charAt(ch, 1) : captures[f - 1] + charAt(ch, 1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof-raw');\nvar regexpExec = require('../internals/regexp-exec');\n\nvar $TypeError = TypeError;\n\n// `RegExpExec` abstract operation\n// https://tc39.es/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (isCallable(exec)) {\n var result = call(exec, R, S);\n if (result !== null) anObject(result);\n return result;\n }\n if (classof(R) === 'RegExp') return call(regexpExec, R, S);\n throw new $TypeError('RegExp#exec called on incompatible receiver');\n};\n","'use strict';\nvar apply = require('../internals/function-apply');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar fails = require('../internals/fails');\nvar anObject = require('../internals/an-object');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar getMethod = require('../internals/get-method');\nvar getSubstitution = require('../internals/get-substitution');\nvar regExpExec = require('../internals/regexp-exec-abstract');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar REPLACE = wellKnownSymbol('replace');\nvar max = Math.max;\nvar min = Math.min;\nvar concat = uncurryThis([].concat);\nvar push = uncurryThis([].push);\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar stringSlice = uncurryThis(''.slice);\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n // eslint-disable-next-line regexp/no-useless-dollar-replacements -- false positive\n return ''.replace(re, '$') !== '7';\n});\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNative) {\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.es/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = isNullOrUndefined(searchValue) ? undefined : getMethod(searchValue, REPLACE);\n return replacer\n ? call(replacer, searchValue, O, replaceValue)\n : call(nativeReplace, toString(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace\n function (string, replaceValue) {\n var rx = anObject(this);\n var S = toString(string);\n\n if (\n typeof replaceValue == 'string' &&\n stringIndexOf(replaceValue, UNSAFE_SUBSTITUTE) === -1 &&\n stringIndexOf(replaceValue, '$<') === -1\n ) {\n var res = maybeCallNative(nativeReplace, rx, S, replaceValue);\n if (res.done) return res.value;\n }\n\n var functionalReplace = isCallable(replaceValue);\n if (!functionalReplace) replaceValue = toString(replaceValue);\n\n var global = rx.global;\n var fullUnicode;\n if (global) {\n fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n\n var results = [];\n var result;\n while (true) {\n result = regExpExec(rx, S);\n if (result === null) break;\n\n push(results, result);\n if (!global) break;\n\n var matchStr = toString(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = toString(result[0]);\n var position = max(min(toIntegerOrInfinity(result.index), S.length), 0);\n var captures = [];\n var replacement;\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) push(captures, maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = concat([matched], captures, position, S);\n if (namedCaptures !== undefined) push(replacerArgs, namedCaptures);\n replacement = toString(apply(replaceValue, undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += stringSlice(S, nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n\n return accumulatedResult + stringSlice(S, nextSourcePosition);\n }\n ];\n}, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);\n","'use strict';\n// eslint-disable-next-line es/no-typed-arrays -- safe\nmodule.exports = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined';\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n // eslint-disable-next-line es/no-object-getprototypeof -- required for testing\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar $Object = Object;\nvar ObjectPrototype = $Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n// eslint-disable-next-line es/no-object-getprototypeof -- safe\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {\n var object = toObject(O);\n if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n var constructor = object.constructor;\n if (isCallable(constructor) && object instanceof constructor) {\n return constructor.prototype;\n } return object instanceof $Object ? ObjectPrototype : null;\n};\n","'use strict';\nvar NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-basic-detection');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar hasOwn = require('../internals/has-own-property');\nvar classof = require('../internals/classof');\nvar tryToString = require('../internals/try-to-string');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar uid = require('../internals/uid');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar Int8Array = globalThis.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar Uint8ClampedArray = globalThis.Uint8ClampedArray;\nvar Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;\nvar TypedArray = Int8Array && getPrototypeOf(Int8Array);\nvar TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);\nvar ObjectPrototype = Object.prototype;\nvar TypeError = globalThis.TypeError;\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');\nvar TYPED_ARRAY_CONSTRUCTOR = 'TypedArrayConstructor';\n// Fixing native typed arrays in Opera Presto crashes the browser, see #595\nvar NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(globalThis.opera) !== 'Opera';\nvar TYPED_ARRAY_TAG_REQUIRED = false;\nvar NAME, Constructor, Prototype;\n\nvar TypedArrayConstructorsList = {\n Int8Array: 1,\n Uint8Array: 1,\n Uint8ClampedArray: 1,\n Int16Array: 2,\n Uint16Array: 2,\n Int32Array: 4,\n Uint32Array: 4,\n Float32Array: 4,\n Float64Array: 8\n};\n\nvar BigIntArrayConstructorsList = {\n BigInt64Array: 8,\n BigUint64Array: 8\n};\n\nvar isView = function isView(it) {\n if (!isObject(it)) return false;\n var klass = classof(it);\n return klass === 'DataView'\n || hasOwn(TypedArrayConstructorsList, klass)\n || hasOwn(BigIntArrayConstructorsList, klass);\n};\n\nvar getTypedArrayConstructor = function (it) {\n var proto = getPrototypeOf(it);\n if (!isObject(proto)) return;\n var state = getInternalState(proto);\n return (state && hasOwn(state, TYPED_ARRAY_CONSTRUCTOR)) ? state[TYPED_ARRAY_CONSTRUCTOR] : getTypedArrayConstructor(proto);\n};\n\nvar isTypedArray = function (it) {\n if (!isObject(it)) return false;\n var klass = classof(it);\n return hasOwn(TypedArrayConstructorsList, klass)\n || hasOwn(BigIntArrayConstructorsList, klass);\n};\n\nvar aTypedArray = function (it) {\n if (isTypedArray(it)) return it;\n throw new TypeError('Target is not a typed array');\n};\n\nvar aTypedArrayConstructor = function (C) {\n if (isCallable(C) && (!setPrototypeOf || isPrototypeOf(TypedArray, C))) return C;\n throw new TypeError(tryToString(C) + ' is not a typed array constructor');\n};\n\nvar exportTypedArrayMethod = function (KEY, property, forced, options) {\n if (!DESCRIPTORS) return;\n if (forced) for (var ARRAY in TypedArrayConstructorsList) {\n var TypedArrayConstructor = globalThis[ARRAY];\n if (TypedArrayConstructor && hasOwn(TypedArrayConstructor.prototype, KEY)) try {\n delete TypedArrayConstructor.prototype[KEY];\n } catch (error) {\n // old WebKit bug - some methods are non-configurable\n try {\n TypedArrayConstructor.prototype[KEY] = property;\n } catch (error2) { /* empty */ }\n }\n }\n if (!TypedArrayPrototype[KEY] || forced) {\n defineBuiltIn(TypedArrayPrototype, KEY, forced ? property\n : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options);\n }\n};\n\nvar exportTypedArrayStaticMethod = function (KEY, property, forced) {\n var ARRAY, TypedArrayConstructor;\n if (!DESCRIPTORS) return;\n if (setPrototypeOf) {\n if (forced) for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = globalThis[ARRAY];\n if (TypedArrayConstructor && hasOwn(TypedArrayConstructor, KEY)) try {\n delete TypedArrayConstructor[KEY];\n } catch (error) { /* empty */ }\n }\n if (!TypedArray[KEY] || forced) {\n // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable\n try {\n return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property);\n } catch (error) { /* empty */ }\n } else return;\n }\n for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = globalThis[ARRAY];\n if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n defineBuiltIn(TypedArrayConstructor, KEY, property);\n }\n }\n};\n\nfor (NAME in TypedArrayConstructorsList) {\n Constructor = globalThis[NAME];\n Prototype = Constructor && Constructor.prototype;\n if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor;\n else NATIVE_ARRAY_BUFFER_VIEWS = false;\n}\n\nfor (NAME in BigIntArrayConstructorsList) {\n Constructor = globalThis[NAME];\n Prototype = Constructor && Constructor.prototype;\n if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor;\n}\n\n// WebKit bug - typed arrays constructors prototype is Object.prototype\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) {\n // eslint-disable-next-line no-shadow -- safe\n TypedArray = function TypedArray() {\n throw new TypeError('Incorrect invocation');\n };\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (globalThis[NAME]) setPrototypeOf(globalThis[NAME], TypedArray);\n }\n}\n\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {\n TypedArrayPrototype = TypedArray.prototype;\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (globalThis[NAME]) setPrototypeOf(globalThis[NAME].prototype, TypedArrayPrototype);\n }\n}\n\n// WebKit bug - one more object in Uint8ClampedArray prototype chain\nif (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n}\n\nif (DESCRIPTORS && !hasOwn(TypedArrayPrototype, TO_STRING_TAG)) {\n TYPED_ARRAY_TAG_REQUIRED = true;\n defineBuiltInAccessor(TypedArrayPrototype, TO_STRING_TAG, {\n configurable: true,\n get: function () {\n return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n }\n });\n for (NAME in TypedArrayConstructorsList) if (globalThis[NAME]) {\n createNonEnumerableProperty(globalThis[NAME], TYPED_ARRAY_TAG, NAME);\n }\n}\n\nmodule.exports = {\n NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG,\n aTypedArray: aTypedArray,\n aTypedArrayConstructor: aTypedArrayConstructor,\n exportTypedArrayMethod: exportTypedArrayMethod,\n exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n getTypedArrayConstructor: getTypedArrayConstructor,\n isView: isView,\n isTypedArray: isTypedArray,\n TypedArray: TypedArray,\n TypedArrayPrototype: TypedArrayPrototype\n};\n","'use strict';\n/* eslint-disable no-new, sonarjs/inconsistent-function-call -- required for testing */\nvar globalThis = require('../internals/global-this');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar NATIVE_ARRAY_BUFFER_VIEWS = require('../internals/array-buffer-view-core').NATIVE_ARRAY_BUFFER_VIEWS;\n\nvar ArrayBuffer = globalThis.ArrayBuffer;\nvar Int8Array = globalThis.Int8Array;\n\nmodule.exports = !NATIVE_ARRAY_BUFFER_VIEWS || !fails(function () {\n Int8Array(1);\n}) || !fails(function () {\n new Int8Array(-1);\n}) || !checkCorrectnessOfIteration(function (iterable) {\n new Int8Array();\n new Int8Array(null);\n new Int8Array(1.5);\n new Int8Array(iterable);\n}, true) || fails(function () {\n // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill\n return new Int8Array(new ArrayBuffer(2), 1, undefined).length !== 1;\n});\n","'use strict';\nvar defineBuiltIn = require('../internals/define-built-in');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) defineBuiltIn(target, key, src[key], options);\n return target;\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toLength = require('../internals/to-length');\n\nvar $RangeError = RangeError;\n\n// `ToIndex` abstract operation\n// https://tc39.es/ecma262/#sec-toindex\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toIntegerOrInfinity(it);\n var length = toLength(number);\n if (number !== length) throw new $RangeError('Wrong length or index');\n return length;\n};\n","'use strict';\n// `Math.sign` method implementation\n// https://tc39.es/ecma262/#sec-math.sign\n// eslint-disable-next-line es/no-math-sign -- safe\nmodule.exports = Math.sign || function sign(x) {\n var n = +x;\n // eslint-disable-next-line no-self-compare -- NaN check\n return n === 0 || n !== n ? n : n < 0 ? -1 : 1;\n};\n","'use strict';\nvar EPSILON = 2.220446049250313e-16; // Number.EPSILON\nvar INVERSE_EPSILON = 1 / EPSILON;\n\nmodule.exports = function (n) {\n return n + INVERSE_EPSILON - INVERSE_EPSILON;\n};\n","'use strict';\nvar sign = require('../internals/math-sign');\nvar roundTiesToEven = require('../internals/math-round-ties-to-even');\n\nvar abs = Math.abs;\n\nvar EPSILON = 2.220446049250313e-16; // Number.EPSILON\n\nmodule.exports = function (x, FLOAT_EPSILON, FLOAT_MAX_VALUE, FLOAT_MIN_VALUE) {\n var n = +x;\n var absolute = abs(n);\n var s = sign(n);\n if (absolute < FLOAT_MIN_VALUE) return s * roundTiesToEven(absolute / FLOAT_MIN_VALUE / FLOAT_EPSILON) * FLOAT_MIN_VALUE * FLOAT_EPSILON;\n var a = (1 + FLOAT_EPSILON / EPSILON) * absolute;\n var result = a - (a - absolute);\n // eslint-disable-next-line no-self-compare -- NaN check\n if (result > FLOAT_MAX_VALUE || result !== result) return s * Infinity;\n return s * result;\n};\n","'use strict';\nvar floatRound = require('../internals/math-float-round');\n\nvar FLOAT32_EPSILON = 1.1920928955078125e-7; // 2 ** -23;\nvar FLOAT32_MAX_VALUE = 3.4028234663852886e+38; // 2 ** 128 - 2 ** 104\nvar FLOAT32_MIN_VALUE = 1.1754943508222875e-38; // 2 ** -126;\n\n// `Math.fround` method implementation\n// https://tc39.es/ecma262/#sec-math.fround\n// eslint-disable-next-line es/no-math-fround -- safe\nmodule.exports = Math.fround || function fround(x) {\n return floatRound(x, FLOAT32_EPSILON, FLOAT32_MAX_VALUE, FLOAT32_MIN_VALUE);\n};\n","'use strict';\n// IEEE754 conversions based on https://github.com/feross/ieee754\nvar $Array = Array;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\n\nvar pack = function (number, mantissaLength, bytes) {\n var buffer = $Array(bytes);\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;\n var index = 0;\n var exponent, mantissa, c;\n number = abs(number);\n // eslint-disable-next-line no-self-compare -- NaN check\n if (number !== number || number === Infinity) {\n // eslint-disable-next-line no-self-compare -- NaN check\n mantissa = number !== number ? 1 : 0;\n exponent = eMax;\n } else {\n exponent = floor(log(number) / LN2);\n c = pow(2, -exponent);\n if (number * c < 1) {\n exponent--;\n c *= 2;\n }\n if (exponent + eBias >= 1) {\n number += rt / c;\n } else {\n number += rt * pow(2, 1 - eBias);\n }\n if (number * c >= 2) {\n exponent++;\n c /= 2;\n }\n if (exponent + eBias >= eMax) {\n mantissa = 0;\n exponent = eMax;\n } else if (exponent + eBias >= 1) {\n mantissa = (number * c - 1) * pow(2, mantissaLength);\n exponent += eBias;\n } else {\n mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength);\n exponent = 0;\n }\n }\n while (mantissaLength >= 8) {\n buffer[index++] = mantissa & 255;\n mantissa /= 256;\n mantissaLength -= 8;\n }\n exponent = exponent << mantissaLength | mantissa;\n exponentLength += mantissaLength;\n while (exponentLength > 0) {\n buffer[index++] = exponent & 255;\n exponent /= 256;\n exponentLength -= 8;\n }\n buffer[index - 1] |= sign * 128;\n return buffer;\n};\n\nvar unpack = function (buffer, mantissaLength) {\n var bytes = buffer.length;\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var nBits = exponentLength - 7;\n var index = bytes - 1;\n var sign = buffer[index--];\n var exponent = sign & 127;\n var mantissa;\n sign >>= 7;\n while (nBits > 0) {\n exponent = exponent * 256 + buffer[index--];\n nBits -= 8;\n }\n mantissa = exponent & (1 << -nBits) - 1;\n exponent >>= -nBits;\n nBits += mantissaLength;\n while (nBits > 0) {\n mantissa = mantissa * 256 + buffer[index--];\n nBits -= 8;\n }\n if (exponent === 0) {\n exponent = 1 - eBias;\n } else if (exponent === eMax) {\n return mantissa ? NaN : sign ? -Infinity : Infinity;\n } else {\n mantissa += pow(2, mantissaLength);\n exponent -= eBias;\n } return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength);\n};\n\nmodule.exports = {\n pack: pack,\n unpack: unpack\n};\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.fill` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.fill\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = lengthOfArrayLike(O);\n var argumentsLength = arguments.length;\n var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);\n var end = argumentsLength > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-basic-detection');\nvar FunctionName = require('../internals/function-name');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar fails = require('../internals/fails');\nvar anInstance = require('../internals/an-instance');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toLength = require('../internals/to-length');\nvar toIndex = require('../internals/to-index');\nvar fround = require('../internals/math-fround');\nvar IEEE754 = require('../internals/ieee754');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar arrayFill = require('../internals/array-fill');\nvar arraySlice = require('../internals/array-slice');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar PROPER_FUNCTION_NAME = FunctionName.PROPER;\nvar CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length';\nvar WRONG_INDEX = 'Wrong index';\nvar getInternalArrayBufferState = InternalStateModule.getterFor(ARRAY_BUFFER);\nvar getInternalDataViewState = InternalStateModule.getterFor(DATA_VIEW);\nvar setInternalState = InternalStateModule.set;\nvar NativeArrayBuffer = globalThis[ARRAY_BUFFER];\nvar $ArrayBuffer = NativeArrayBuffer;\nvar ArrayBufferPrototype = $ArrayBuffer && $ArrayBuffer[PROTOTYPE];\nvar $DataView = globalThis[DATA_VIEW];\nvar DataViewPrototype = $DataView && $DataView[PROTOTYPE];\nvar ObjectPrototype = Object.prototype;\nvar Array = globalThis.Array;\nvar RangeError = globalThis.RangeError;\nvar fill = uncurryThis(arrayFill);\nvar reverse = uncurryThis([].reverse);\n\nvar packIEEE754 = IEEE754.pack;\nvar unpackIEEE754 = IEEE754.unpack;\n\nvar packInt8 = function (number) {\n return [number & 0xFF];\n};\n\nvar packInt16 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF];\n};\n\nvar packInt32 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];\n};\n\nvar unpackInt32 = function (buffer) {\n return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];\n};\n\nvar packFloat32 = function (number) {\n return packIEEE754(fround(number), 23, 4);\n};\n\nvar packFloat64 = function (number) {\n return packIEEE754(number, 52, 8);\n};\n\nvar addGetter = function (Constructor, key, getInternalState) {\n defineBuiltInAccessor(Constructor[PROTOTYPE], key, {\n configurable: true,\n get: function () {\n return getInternalState(this)[key];\n }\n });\n};\n\nvar get = function (view, count, index, isLittleEndian) {\n var store = getInternalDataViewState(view);\n var intIndex = toIndex(index);\n var boolIsLittleEndian = !!isLittleEndian;\n if (intIndex + count > store.byteLength) throw new RangeError(WRONG_INDEX);\n var bytes = store.bytes;\n var start = intIndex + store.byteOffset;\n var pack = arraySlice(bytes, start, start + count);\n return boolIsLittleEndian ? pack : reverse(pack);\n};\n\nvar set = function (view, count, index, conversion, value, isLittleEndian) {\n var store = getInternalDataViewState(view);\n var intIndex = toIndex(index);\n var pack = conversion(+value);\n var boolIsLittleEndian = !!isLittleEndian;\n if (intIndex + count > store.byteLength) throw new RangeError(WRONG_INDEX);\n var bytes = store.bytes;\n var start = intIndex + store.byteOffset;\n for (var i = 0; i < count; i++) bytes[start + i] = pack[boolIsLittleEndian ? i : count - i - 1];\n};\n\nif (!NATIVE_ARRAY_BUFFER) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, ArrayBufferPrototype);\n var byteLength = toIndex(length);\n setInternalState(this, {\n type: ARRAY_BUFFER,\n bytes: fill(Array(byteLength), 0),\n byteLength: byteLength\n });\n if (!DESCRIPTORS) {\n this.byteLength = byteLength;\n this.detached = false;\n }\n };\n\n ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE];\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, DataViewPrototype);\n anInstance(buffer, ArrayBufferPrototype);\n var bufferState = getInternalArrayBufferState(buffer);\n var bufferLength = bufferState.byteLength;\n var offset = toIntegerOrInfinity(byteOffset);\n if (offset < 0 || offset > bufferLength) throw new RangeError('Wrong offset');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw new RangeError(WRONG_LENGTH);\n setInternalState(this, {\n type: DATA_VIEW,\n buffer: buffer,\n byteLength: byteLength,\n byteOffset: offset,\n bytes: bufferState.bytes\n });\n if (!DESCRIPTORS) {\n this.buffer = buffer;\n this.byteLength = byteLength;\n this.byteOffset = offset;\n }\n };\n\n DataViewPrototype = $DataView[PROTOTYPE];\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, 'byteLength', getInternalArrayBufferState);\n addGetter($DataView, 'buffer', getInternalDataViewState);\n addGetter($DataView, 'byteLength', getInternalDataViewState);\n addGetter($DataView, 'byteOffset', getInternalDataViewState);\n }\n\n defineBuiltIns(DataViewPrototype, {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : false);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : false);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : false));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : false)) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : false), 23);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : false), 52);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : false);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : false);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : false);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : false);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : false);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : false);\n }\n });\n} else {\n var INCORRECT_ARRAY_BUFFER_NAME = PROPER_FUNCTION_NAME && NativeArrayBuffer.name !== ARRAY_BUFFER;\n /* eslint-disable no-new, sonarjs/inconsistent-function-call -- required for testing */\n if (!fails(function () {\n NativeArrayBuffer(1);\n }) || !fails(function () {\n new NativeArrayBuffer(-1);\n }) || fails(function () {\n new NativeArrayBuffer();\n new NativeArrayBuffer(1.5);\n new NativeArrayBuffer(NaN);\n return NativeArrayBuffer.length !== 1 || INCORRECT_ARRAY_BUFFER_NAME && !CONFIGURABLE_FUNCTION_NAME;\n })) {\n /* eslint-enable no-new, sonarjs/inconsistent-function-call -- required for testing */\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, ArrayBufferPrototype);\n return inheritIfRequired(new NativeArrayBuffer(toIndex(length)), this, $ArrayBuffer);\n };\n\n $ArrayBuffer[PROTOTYPE] = ArrayBufferPrototype;\n\n ArrayBufferPrototype.constructor = $ArrayBuffer;\n\n copyConstructorProperties($ArrayBuffer, NativeArrayBuffer);\n } else if (INCORRECT_ARRAY_BUFFER_NAME && CONFIGURABLE_FUNCTION_NAME) {\n createNonEnumerableProperty(NativeArrayBuffer, 'name', ARRAY_BUFFER);\n }\n\n // WebKit bug - the same parent prototype for typed arrays and data view\n if (setPrototypeOf && getPrototypeOf(DataViewPrototype) !== ObjectPrototype) {\n setPrototypeOf(DataViewPrototype, ObjectPrototype);\n }\n\n // iOS Safari 7.x bug\n var testView = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = uncurryThis(DataViewPrototype.setInt8);\n testView.setInt8(0, 2147483648);\n testView.setInt8(1, 2147483649);\n if (testView.getInt8(0) || !testView.getInt8(1)) defineBuiltIns(DataViewPrototype, {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8(this, byteOffset, value << 24 >> 24);\n }\n }, { unsafe: true });\n}\n\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\n\nmodule.exports = {\n ArrayBuffer: $ArrayBuffer,\n DataView: $DataView\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nvar floor = Math.floor;\n\n// `IsIntegralNumber` abstract operation\n// https://tc39.es/ecma262/#sec-isintegralnumber\n// eslint-disable-next-line es/no-number-isinteger -- safe\nmodule.exports = Number.isInteger || function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar $RangeError = RangeError;\n\nmodule.exports = function (it) {\n var result = toIntegerOrInfinity(it);\n if (result < 0) throw new $RangeError(\"The argument can't be less than 0\");\n return result;\n};\n","'use strict';\nvar toPositiveInteger = require('../internals/to-positive-integer');\n\nvar $RangeError = RangeError;\n\nmodule.exports = function (it, BYTES) {\n var offset = toPositiveInteger(it);\n if (offset % BYTES) throw new $RangeError('Wrong offset');\n return offset;\n};\n","'use strict';\nvar round = Math.round;\n\nmodule.exports = function (it) {\n var value = round(it);\n return value < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;\n};\n","'use strict';\nvar classof = require('../internals/classof');\n\nmodule.exports = function (it) {\n var klass = classof(it);\n return klass === 'BigInt64Array' || klass === 'BigUint64Array';\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\n\nvar $TypeError = TypeError;\n\n// `ToBigInt` abstract operation\n// https://tc39.es/ecma262/#sec-tobigint\nmodule.exports = function (argument) {\n var prim = toPrimitive(argument, 'number');\n if (typeof prim == 'number') throw new $TypeError(\"Can't convert number to bigint\");\n // eslint-disable-next-line es/no-bigint -- safe\n return BigInt(prim);\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar aConstructor = require('../internals/a-constructor');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar isBigIntArray = require('../internals/is-big-int-array');\nvar aTypedArrayConstructor = require('../internals/array-buffer-view-core').aTypedArrayConstructor;\nvar toBigInt = require('../internals/to-big-int');\n\nmodule.exports = function from(source /* , mapfn, thisArg */) {\n var C = aConstructor(this);\n var O = toObject(source);\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var i, length, result, thisIsBigIntArray, value, step, iterator, next;\n if (iteratorMethod && !isArrayIteratorMethod(iteratorMethod)) {\n iterator = getIterator(O, iteratorMethod);\n next = iterator.next;\n O = [];\n while (!(step = call(next, iterator)).done) {\n O.push(step.value);\n }\n }\n if (mapping && argumentsLength > 2) {\n mapfn = bind(mapfn, arguments[2]);\n }\n length = lengthOfArrayLike(O);\n result = new (aTypedArrayConstructor(C))(length);\n thisIsBigIntArray = isBigIntArray(result);\n for (i = 0; length > i; i++) {\n value = mapping ? mapfn(O[i], i) : O[i];\n // FF30- typed arrays doesn't properly convert objects to typed array values\n result[i] = thisIsBigIntArray ? toBigInt(value) : +value;\n }\n return result;\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = uncurryThis([].push);\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation\nvar createMethod = function (TYPE) {\n var IS_MAP = TYPE === 1;\n var IS_FILTER = TYPE === 2;\n var IS_SOME = TYPE === 3;\n var IS_EVERY = TYPE === 4;\n var IS_FIND_INDEX = TYPE === 6;\n var IS_FILTER_REJECT = TYPE === 7;\n var NO_HOLES = TYPE === 5 || IS_FIND_INDEX;\n return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var length = lengthOfArrayLike(self);\n var boundFunction = bind(callbackfn, that);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push(target, value); // filter\n } else switch (TYPE) {\n case 4: return false; // every\n case 7: push(target, value); // filterReject\n }\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.es/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.es/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.es/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.es/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.es/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.es/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.es/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6),\n // `Array.prototype.filterReject` method\n // https://github.com/tc39/proposal-array-filtering\n filterReject: createMethod(7)\n};\n","'use strict';\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\nmodule.exports = function (Constructor, list, $length) {\n var index = 0;\n var length = arguments.length > 2 ? $length : lengthOfArrayLike(list);\n var result = new Constructor(length);\n while (length > index) result[index] = list[index++];\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar call = require('../internals/function-call');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = require('../internals/typed-array-constructors-require-wrappers');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar ArrayBufferModule = require('../internals/array-buffer');\nvar anInstance = require('../internals/an-instance');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar isIntegralNumber = require('../internals/is-integral-number');\nvar toLength = require('../internals/to-length');\nvar toIndex = require('../internals/to-index');\nvar toOffset = require('../internals/to-offset');\nvar toUint8Clamped = require('../internals/to-uint8-clamped');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar classof = require('../internals/classof');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar create = require('../internals/object-create');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar typedArrayFrom = require('../internals/typed-array-from');\nvar forEach = require('../internals/array-iteration').forEach;\nvar setSpecies = require('../internals/set-species');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar definePropertyModule = require('../internals/object-define-property');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar arrayFromConstructorAndList = require('../internals/array-from-constructor-and-list');\nvar InternalStateModule = require('../internals/internal-state');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar enforceInternalState = InternalStateModule.enforce;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar RangeError = globalThis.RangeError;\nvar ArrayBuffer = ArrayBufferModule.ArrayBuffer;\nvar ArrayBufferPrototype = ArrayBuffer.prototype;\nvar DataView = ArrayBufferModule.DataView;\nvar NATIVE_ARRAY_BUFFER_VIEWS = ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\nvar TYPED_ARRAY_TAG = ArrayBufferViewCore.TYPED_ARRAY_TAG;\nvar TypedArray = ArrayBufferViewCore.TypedArray;\nvar TypedArrayPrototype = ArrayBufferViewCore.TypedArrayPrototype;\nvar isTypedArray = ArrayBufferViewCore.isTypedArray;\nvar BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\nvar WRONG_LENGTH = 'Wrong length';\n\nvar addGetter = function (it, key) {\n defineBuiltInAccessor(it, key, {\n configurable: true,\n get: function () {\n return getInternalState(this)[key];\n }\n });\n};\n\nvar isArrayBuffer = function (it) {\n var klass;\n return isPrototypeOf(ArrayBufferPrototype, it) || (klass = classof(it)) === 'ArrayBuffer' || klass === 'SharedArrayBuffer';\n};\n\nvar isTypedArrayIndex = function (target, key) {\n return isTypedArray(target)\n && !isSymbol(key)\n && key in target\n && isIntegralNumber(+key)\n && key >= 0;\n};\n\nvar wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {\n key = toPropertyKey(key);\n return isTypedArrayIndex(target, key)\n ? createPropertyDescriptor(2, target[key])\n : nativeGetOwnPropertyDescriptor(target, key);\n};\n\nvar wrappedDefineProperty = function defineProperty(target, key, descriptor) {\n key = toPropertyKey(key);\n if (isTypedArrayIndex(target, key)\n && isObject(descriptor)\n && hasOwn(descriptor, 'value')\n && !hasOwn(descriptor, 'get')\n && !hasOwn(descriptor, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !descriptor.configurable\n && (!hasOwn(descriptor, 'writable') || descriptor.writable)\n && (!hasOwn(descriptor, 'enumerable') || descriptor.enumerable)\n ) {\n target[key] = descriptor.value;\n return target;\n } return nativeDefineProperty(target, key, descriptor);\n};\n\nif (DESCRIPTORS) {\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n getOwnPropertyDescriptorModule.f = wrappedGetOwnPropertyDescriptor;\n definePropertyModule.f = wrappedDefineProperty;\n addGetter(TypedArrayPrototype, 'buffer');\n addGetter(TypedArrayPrototype, 'byteOffset');\n addGetter(TypedArrayPrototype, 'byteLength');\n addGetter(TypedArrayPrototype, 'length');\n }\n\n $({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {\n getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,\n defineProperty: wrappedDefineProperty\n });\n\n module.exports = function (TYPE, wrapper, CLAMPED) {\n var BYTES = TYPE.match(/\\d+/)[0] / 8;\n var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + TYPE;\n var SETTER = 'set' + TYPE;\n var NativeTypedArrayConstructor = globalThis[CONSTRUCTOR_NAME];\n var TypedArrayConstructor = NativeTypedArrayConstructor;\n var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;\n var exported = {};\n\n var getter = function (that, index) {\n var data = getInternalState(that);\n return data.view[GETTER](index * BYTES + data.byteOffset, true);\n };\n\n var setter = function (that, index, value) {\n var data = getInternalState(that);\n data.view[SETTER](index * BYTES + data.byteOffset, CLAMPED ? toUint8Clamped(value) : value, true);\n };\n\n var addElement = function (that, index) {\n nativeDefineProperty(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n TypedArrayConstructor = wrapper(function (that, data, offset, $length) {\n anInstance(that, TypedArrayConstructorPrototype);\n var index = 0;\n var byteOffset = 0;\n var buffer, byteLength, length;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new ArrayBuffer(byteLength);\n } else if (isArrayBuffer(data)) {\n buffer = data;\n byteOffset = toOffset(offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw new RangeError(WRONG_LENGTH);\n byteLength = $len - byteOffset;\n if (byteLength < 0) throw new RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + byteOffset > $len) throw new RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (isTypedArray(data)) {\n return arrayFromConstructorAndList(TypedArrayConstructor, data);\n } else {\n return call(typedArrayFrom, TypedArrayConstructor, data);\n }\n setInternalState(that, {\n buffer: buffer,\n byteOffset: byteOffset,\n byteLength: byteLength,\n length: length,\n view: new DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = create(TypedArrayPrototype);\n } else if (TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS) {\n TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {\n anInstance(dummy, TypedArrayConstructorPrototype);\n return inheritIfRequired(function () {\n if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data));\n if (isArrayBuffer(data)) return $length !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length)\n : typedArrayOffset !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES))\n : new NativeTypedArrayConstructor(data);\n if (isTypedArray(data)) return arrayFromConstructorAndList(TypedArrayConstructor, data);\n return call(typedArrayFrom, TypedArrayConstructor, data);\n }(), dummy, TypedArrayConstructor);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {\n if (!(key in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);\n }\n });\n TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;\n }\n\n if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);\n }\n\n enforceInternalState(TypedArrayConstructorPrototype).TypedArrayConstructor = TypedArrayConstructor;\n\n if (TYPED_ARRAY_TAG) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);\n }\n\n var FORCED = TypedArrayConstructor !== NativeTypedArrayConstructor;\n\n exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;\n\n $({ global: true, constructor: true, forced: FORCED, sham: !NATIVE_ARRAY_BUFFER_VIEWS }, exported);\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);\n }\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);\n }\n\n setSpecies(CONSTRUCTOR_NAME);\n };\n} else module.exports = function () { /* empty */ };\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Float32Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Float32', function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Float64Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Float64', function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Int8Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Int8', function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Int16Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Int16', function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Int32Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Int32', function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Uint8Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint8', function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Uint8ClampedArray` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint8', function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Uint16Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint16', function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Uint32Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint32', function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = require('../internals/typed-array-constructors-require-wrappers');\nvar exportTypedArrayStaticMethod = require('../internals/array-buffer-view-core').exportTypedArrayStaticMethod;\nvar typedArrayFrom = require('../internals/typed-array-from');\n\n// `%TypedArray%.from` method\n// https://tc39.es/ecma262/#sec-%typedarray%.from\nexportTypedArrayStaticMethod('from', typedArrayFrom, TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS);\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = require('../internals/typed-array-constructors-require-wrappers');\n\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayStaticMethod = ArrayBufferViewCore.exportTypedArrayStaticMethod;\n\n// `%TypedArray%.of` method\n// https://tc39.es/ecma262/#sec-%typedarray%.of\nexportTypedArrayStaticMethod('of', function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = new (aTypedArrayConstructor(this))(length);\n while (length > index) result[index] = arguments[index++];\n return result;\n}, TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS);\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar call = require('../internals/function-call');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar toOffset = require('../internals/to-offset');\nvar toIndexedObject = require('../internals/to-object');\nvar fails = require('../internals/fails');\n\nvar RangeError = globalThis.RangeError;\nvar Int8Array = globalThis.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar $set = Int8ArrayPrototype && Int8ArrayPrototype.set;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\nvar WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS = !fails(function () {\n // eslint-disable-next-line es/no-typed-arrays -- required for testing\n var array = new Uint8ClampedArray(2);\n call($set, array, { length: 1, 0: 3 }, 1);\n return array[1] !== 3;\n});\n\n// https://bugs.chromium.org/p/v8/issues/detail?id=11294 and other\nvar TO_OBJECT_BUG = WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS && ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS && fails(function () {\n var array = new Int8Array(2);\n array.set(1);\n array.set('2', 1);\n return array[0] !== 0 || array[1] !== 2;\n});\n\n// `%TypedArray%.prototype.set` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.set\nexportTypedArrayMethod('set', function set(arrayLike /* , offset */) {\n aTypedArray(this);\n var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);\n var src = toIndexedObject(arrayLike);\n if (WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS) return call($set, this, src, offset);\n var length = this.length;\n var len = lengthOfArrayLike(src);\n var index = 0;\n if (len + offset > length) throw new RangeError('Wrong length');\n while (index < len) this[offset + index] = src[index++];\n}, !WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS || TO_OBJECT_BUG);\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar fails = require('../internals/fails');\nvar aCallable = require('../internals/a-callable');\nvar internalSort = require('../internals/array-sort');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar FF = require('../internals/environment-ff-version');\nvar IE_OR_EDGE = require('../internals/environment-is-ie-or-edge');\nvar V8 = require('../internals/environment-v8-version');\nvar WEBKIT = require('../internals/environment-webkit-version');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar Uint16Array = globalThis.Uint16Array;\nvar nativeSort = Uint16Array && uncurryThis(Uint16Array.prototype.sort);\n\n// WebKit\nvar ACCEPT_INCORRECT_ARGUMENTS = !!nativeSort && !(fails(function () {\n nativeSort(new Uint16Array(2), null);\n}) && fails(function () {\n nativeSort(new Uint16Array(2), {});\n}));\n\nvar STABLE_SORT = !!nativeSort && !fails(function () {\n // feature detection can be too slow, so check engines versions\n if (V8) return V8 < 74;\n if (FF) return FF < 67;\n if (IE_OR_EDGE) return true;\n if (WEBKIT) return WEBKIT < 602;\n\n var array = new Uint16Array(516);\n var expected = Array(516);\n var index, mod;\n\n for (index = 0; index < 516; index++) {\n mod = index % 4;\n array[index] = 515 - index;\n expected[index] = index - 2 * mod + 3;\n }\n\n nativeSort(array, function (a, b) {\n return (a / 4 | 0) - (b / 4 | 0);\n });\n\n for (index = 0; index < 516; index++) {\n if (array[index] !== expected[index]) return true;\n }\n});\n\nvar getSortCompare = function (comparefn) {\n return function (x, y) {\n if (comparefn !== undefined) return +comparefn(x, y) || 0;\n // eslint-disable-next-line no-self-compare -- NaN check\n if (y !== y) return -1;\n // eslint-disable-next-line no-self-compare -- NaN check\n if (x !== x) return 1;\n if (x === 0 && y === 0) return 1 / x > 0 && 1 / y < 0 ? 1 : -1;\n return x > y;\n };\n};\n\n// `%TypedArray%.prototype.sort` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.sort\nexportTypedArrayMethod('sort', function sort(comparefn) {\n if (comparefn !== undefined) aCallable(comparefn);\n if (STABLE_SORT) return nativeSort(this, comparefn);\n\n return internalSort(aTypedArray(this), getSortCompare(comparefn));\n}, !STABLE_SORT || ACCEPT_INCORRECT_ARGUMENTS);\n","'use strict';\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\n// `InstallErrorCause` abstract operation\n// https://tc39.es/proposal-error-cause/#sec-errorobjects-install-error-cause\nmodule.exports = function (O, options) {\n if (isObject(options) && 'cause' in options) {\n createNonEnumerableProperty(O, 'cause', options.cause);\n }\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar $Error = Error;\nvar replace = uncurryThis(''.replace);\n\nvar TEST = (function (arg) { return String(new $Error(arg).stack); })('zxcasd');\n// eslint-disable-next-line redos/no-vulnerable, sonarjs/slow-regex -- safe\nvar V8_OR_CHAKRA_STACK_ENTRY = /\\n\\s*at [^:]*:[^\\n]*/;\nvar IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST);\n\nmodule.exports = function (stack, dropEntries) {\n if (IS_V8_OR_CHAKRA_STACK && typeof stack == 'string' && !$Error.prepareStackTrace) {\n while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, '');\n } return stack;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = !fails(function () {\n var error = new Error('a');\n if (!('stack' in error)) return true;\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7));\n return error.stack !== 7;\n});\n","'use strict';\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar clearErrorStack = require('../internals/error-stack-clear');\nvar ERROR_STACK_INSTALLABLE = require('../internals/error-stack-installable');\n\n// non-standard V8\nvar captureStackTrace = Error.captureStackTrace;\n\nmodule.exports = function (error, C, stack, dropEntries) {\n if (ERROR_STACK_INSTALLABLE) {\n if (captureStackTrace) captureStackTrace(error, C);\n else createNonEnumerableProperty(error, 'stack', clearErrorStack(stack, dropEntries));\n }\n};\n","'use strict';\nvar toString = require('../internals/to-string');\n\nmodule.exports = function (argument, $default) {\n return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar create = require('../internals/object-create');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar installErrorCause = require('../internals/install-error-cause');\nvar installErrorStack = require('../internals/error-stack-install');\nvar iterate = require('../internals/iterate');\nvar normalizeStringArgument = require('../internals/normalize-string-argument');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Error = Error;\nvar push = [].push;\n\nvar $AggregateError = function AggregateError(errors, message /* , options */) {\n var isInstance = isPrototypeOf(AggregateErrorPrototype, this);\n var that;\n if (setPrototypeOf) {\n that = setPrototypeOf(new $Error(), isInstance ? getPrototypeOf(this) : AggregateErrorPrototype);\n } else {\n that = isInstance ? this : create(AggregateErrorPrototype);\n createNonEnumerableProperty(that, TO_STRING_TAG, 'Error');\n }\n if (message !== undefined) createNonEnumerableProperty(that, 'message', normalizeStringArgument(message));\n installErrorStack(that, $AggregateError, that.stack, 1);\n if (arguments.length > 2) installErrorCause(that, arguments[2]);\n var errorsArray = [];\n iterate(errors, push, { that: errorsArray });\n createNonEnumerableProperty(that, 'errors', errorsArray);\n return that;\n};\n\nif (setPrototypeOf) setPrototypeOf($AggregateError, $Error);\nelse copyConstructorProperties($AggregateError, $Error, { name: true });\n\nvar AggregateErrorPrototype = $AggregateError.prototype = create($Error.prototype, {\n constructor: createPropertyDescriptor(1, $AggregateError),\n message: createPropertyDescriptor(1, ''),\n name: createPropertyDescriptor(1, 'AggregateError')\n});\n\n// `AggregateError` constructor\n// https://tc39.es/ecma262/#sec-aggregate-error-constructor\n$({ global: true, constructor: true, arity: 2 }, {\n AggregateError: $AggregateError\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar DESCRIPTORS = require('../internals/descriptors');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\n\n// `Array.prototype.lastIndex` getter\n// https://github.com/keithamus/proposal-array-last\nif (DESCRIPTORS) {\n defineBuiltInAccessor(Array.prototype, 'lastIndex', {\n configurable: true,\n get: function lastIndex() {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n return len === 0 ? 0 : len - 1;\n }\n });\n\n addToUnscopables('lastIndex');\n}\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar DESCRIPTORS = require('../internals/descriptors');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\n\n// `Array.prototype.lastIndex` accessor\n// https://github.com/keithamus/proposal-array-last\nif (DESCRIPTORS) {\n defineBuiltInAccessor(Array.prototype, 'lastItem', {\n configurable: true,\n get: function lastItem() {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n return len === 0 ? undefined : O[len - 1];\n },\n set: function lastItem(value) {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n return O[len === 0 ? 0 : len - 1] = value;\n }\n });\n\n addToUnscopables('lastItem');\n}\n","'use strict';\n/* eslint-disable es/no-object-getownpropertynames -- safe */\nvar classof = require('../internals/classof-raw');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar $getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar arraySlice = require('../internals/array-slice');\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return $getOwnPropertyNames(it);\n } catch (error) {\n return arraySlice(windowNames);\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && classof(it) === 'Window'\n ? getWindowNames(it)\n : $getOwnPropertyNames(toIndexedObject(it));\n};\n","'use strict';\n// FF26- bug: ArrayBuffers are non-extensible, but Object.isExtensible does not report it\nvar fails = require('../internals/fails');\n\nmodule.exports = fails(function () {\n if (typeof ArrayBuffer == 'function') {\n var buffer = new ArrayBuffer(8);\n // eslint-disable-next-line es/no-object-isextensible, es/no-object-defineproperty -- safe\n if (Object.isExtensible(buffer)) Object.defineProperty(buffer, 'a', { value: 8 });\n }\n});\n","'use strict';\nvar fails = require('../internals/fails');\nvar isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar ARRAY_BUFFER_NON_EXTENSIBLE = require('../internals/array-buffer-non-extensible');\n\n// eslint-disable-next-line es/no-object-isextensible -- safe\nvar $isExtensible = Object.isExtensible;\nvar FAILS_ON_PRIMITIVES = fails(function () { $isExtensible(1); });\n\n// `Object.isExtensible` method\n// https://tc39.es/ecma262/#sec-object.isextensible\nmodule.exports = (FAILS_ON_PRIMITIVES || ARRAY_BUFFER_NON_EXTENSIBLE) ? function isExtensible(it) {\n if (!isObject(it)) return false;\n if (ARRAY_BUFFER_NON_EXTENSIBLE && classof(it) === 'ArrayBuffer') return false;\n return $isExtensible ? $isExtensible(it) : true;\n} : $isExtensible;\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar hasOwn = require('../internals/has-own-property');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternalModule = require('../internals/object-get-own-property-names-external');\nvar isExtensible = require('../internals/object-is-extensible');\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar REQUIRED = false;\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + id++, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!hasOwn(it, METADATA)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!hasOwn(it, METADATA)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar enable = function () {\n meta.enable = function () { /* empty */ };\n REQUIRED = true;\n var getOwnPropertyNames = getOwnPropertyNamesModule.f;\n var splice = uncurryThis([].splice);\n var test = {};\n test[METADATA] = 1;\n\n // prevent exposing of metadata key\n if (getOwnPropertyNames(test).length) {\n getOwnPropertyNamesModule.f = function (it) {\n var result = getOwnPropertyNames(it);\n for (var i = 0, length = result.length; i < length; i++) {\n if (result[i] === METADATA) {\n splice(result, i, 1);\n break;\n }\n } return result;\n };\n\n $({ target: 'Object', stat: true, forced: true }, {\n getOwnPropertyNames: getOwnPropertyNamesExternalModule.f\n });\n }\n};\n\nvar meta = module.exports = {\n enable: enable,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = globalThis[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var uncurriedNativeMethod = uncurryThis(NativePrototype[KEY]);\n defineBuiltIn(NativePrototype, KEY,\n KEY === 'add' ? function add(value) {\n uncurriedNativeMethod(this, value === 0 ? 0 : value);\n return this;\n } : KEY === 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : KEY === 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : KEY === 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n uncurriedNativeMethod(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n var REPLACE = isForced(\n CONSTRUCTOR_NAME,\n !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n }))\n );\n\n if (REPLACE) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.enable();\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) !== instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n // eslint-disable-next-line no-new -- required for testing\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, NativePrototype);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, constructor: true, forced: Constructor !== NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es/no-array-prototype-keys -- safe */\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () {\n var test = {};\n // FF44- legacy iterators case\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n defineBuiltIn(IteratorPrototype, ITERATOR, function () {\n return this;\n });\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar IS_PURE = require('../internals/is-pure');\nvar FunctionName = require('../internals/function-name');\nvar isCallable = require('../internals/is-callable');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar PROPER_FUNCTION_NAME = FunctionName.PROPER;\nvar CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND && KIND in IterablePrototype) return IterablePrototype[KIND];\n\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n }\n\n return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME === 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) {\n defineBuiltIn(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array.prototype.{ values, @@iterator }.name in V8 / FF\n if (PROPER_FUNCTION_NAME && DEFAULT === VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) {\n createNonEnumerableProperty(IterablePrototype, 'name', VALUES);\n } else {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return call(nativeIterator, this); };\n }\n }\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n defineBuiltIn(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n defineBuiltIn(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT });\n }\n Iterators[NAME] = defaultIterator;\n\n return methods;\n};\n","'use strict';\n// `CreateIterResultObject` abstract operation\n// https://tc39.es/ecma262/#sec-createiterresultobject\nmodule.exports = function (value, done) {\n return { value: value, done: done };\n};\n","'use strict';\nvar create = require('../internals/object-create');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar bind = require('../internals/function-bind-context');\nvar anInstance = require('../internals/an-instance');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar iterate = require('../internals/iterate');\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar setSpecies = require('../internals/set-species');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fastKey = require('../internals/internal-metadata').fastKey;\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var Constructor = wrapper(function (that, iterable) {\n anInstance(that, Prototype);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n index: create(null),\n first: null,\n last: null,\n size: 0\n });\n if (!DESCRIPTORS) that.size = 0;\n if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var Prototype = Constructor.prototype;\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var entry = getEntry(that, key);\n var previous, index;\n // change existing entry\n if (entry) {\n entry.value = value;\n // create new entry\n } else {\n state.last = entry = {\n index: index = fastKey(key, true),\n key: key,\n value: value,\n previous: previous = state.last,\n next: null,\n removed: false\n };\n if (!state.first) state.first = entry;\n if (previous) previous.next = entry;\n if (DESCRIPTORS) state.size++;\n else that.size++;\n // add to index\n if (index !== 'F') state.index[index] = entry;\n } return that;\n };\n\n var getEntry = function (that, key) {\n var state = getInternalState(that);\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return state.index[index];\n // frozen object case\n for (entry = state.first; entry; entry = entry.next) {\n if (entry.key === key) return entry;\n }\n };\n\n defineBuiltIns(Prototype, {\n // `{ Map, Set }.prototype.clear()` methods\n // https://tc39.es/ecma262/#sec-map.prototype.clear\n // https://tc39.es/ecma262/#sec-set.prototype.clear\n clear: function clear() {\n var that = this;\n var state = getInternalState(that);\n var entry = state.first;\n while (entry) {\n entry.removed = true;\n if (entry.previous) entry.previous = entry.previous.next = null;\n entry = entry.next;\n }\n state.first = state.last = null;\n state.index = create(null);\n if (DESCRIPTORS) state.size = 0;\n else that.size = 0;\n },\n // `{ Map, Set }.prototype.delete(key)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.delete\n // https://tc39.es/ecma262/#sec-set.prototype.delete\n 'delete': function (key) {\n var that = this;\n var state = getInternalState(that);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.next;\n var prev = entry.previous;\n delete state.index[entry.index];\n entry.removed = true;\n if (prev) prev.next = next;\n if (next) next.previous = prev;\n if (state.first === entry) state.first = next;\n if (state.last === entry) state.last = prev;\n if (DESCRIPTORS) state.size--;\n else that.size--;\n } return !!entry;\n },\n // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.foreach\n // https://tc39.es/ecma262/#sec-set.prototype.foreach\n forEach: function forEach(callbackfn /* , that = undefined */) {\n var state = getInternalState(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var entry;\n while (entry = entry ? entry.next : state.first) {\n boundFunction(entry.value, entry.key, this);\n // revert to the last existing entry\n while (entry && entry.removed) entry = entry.previous;\n }\n },\n // `{ Map, Set}.prototype.has(key)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.has\n // https://tc39.es/ecma262/#sec-set.prototype.has\n has: function has(key) {\n return !!getEntry(this, key);\n }\n });\n\n defineBuiltIns(Prototype, IS_MAP ? {\n // `Map.prototype.get(key)` method\n // https://tc39.es/ecma262/#sec-map.prototype.get\n get: function get(key) {\n var entry = getEntry(this, key);\n return entry && entry.value;\n },\n // `Map.prototype.set(key, value)` method\n // https://tc39.es/ecma262/#sec-map.prototype.set\n set: function set(key, value) {\n return define(this, key === 0 ? 0 : key, value);\n }\n } : {\n // `Set.prototype.add(value)` method\n // https://tc39.es/ecma262/#sec-set.prototype.add\n add: function add(value) {\n return define(this, value = value === 0 ? 0 : value, value);\n }\n });\n if (DESCRIPTORS) defineBuiltInAccessor(Prototype, 'size', {\n configurable: true,\n get: function () {\n return getInternalState(this).size;\n }\n });\n return Constructor;\n },\n setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) {\n var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';\n var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);\n var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);\n // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods\n // https://tc39.es/ecma262/#sec-map.prototype.entries\n // https://tc39.es/ecma262/#sec-map.prototype.keys\n // https://tc39.es/ecma262/#sec-map.prototype.values\n // https://tc39.es/ecma262/#sec-map.prototype-@@iterator\n // https://tc39.es/ecma262/#sec-set.prototype.entries\n // https://tc39.es/ecma262/#sec-set.prototype.keys\n // https://tc39.es/ecma262/#sec-set.prototype.values\n // https://tc39.es/ecma262/#sec-set.prototype-@@iterator\n defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) {\n setInternalState(this, {\n type: ITERATOR_NAME,\n target: iterated,\n state: getInternalCollectionState(iterated),\n kind: kind,\n last: null\n });\n }, function () {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var entry = state.last;\n // revert to the last existing entry\n while (entry && entry.removed) entry = entry.previous;\n // get next entry\n if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {\n // or finish the iteration\n state.target = null;\n return createIterResultObject(undefined, true);\n }\n // return step by kind\n if (kind === 'keys') return createIterResultObject(entry.key, false);\n if (kind === 'values') return createIterResultObject(entry.value, false);\n return createIterResultObject([entry.key, entry.value], false);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // `{ Map, Set }.prototype[@@species]` accessors\n // https://tc39.es/ecma262/#sec-get-map-@@species\n // https://tc39.es/ecma262/#sec-get-set-@@species\n setSpecies(CONSTRUCTOR_NAME);\n }\n};\n","'use strict';\nvar collection = require('../internals/collection');\nvar collectionStrong = require('../internals/collection-strong');\n\n// `Map` constructor\n// https://tc39.es/ecma262/#sec-map-objects\ncollection('Map', function (init) {\n return function Map() { return init(this, arguments.length ? arguments[0] : undefined); };\n}, collectionStrong);\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar getWeakData = require('../internals/internal-metadata').getWeakData;\nvar anInstance = require('../internals/an-instance');\nvar anObject = require('../internals/an-object');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isObject = require('../internals/is-object');\nvar iterate = require('../internals/iterate');\nvar ArrayIterationModule = require('../internals/array-iteration');\nvar hasOwn = require('../internals/has-own-property');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\nvar find = ArrayIterationModule.find;\nvar findIndex = ArrayIterationModule.findIndex;\nvar splice = uncurryThis([].splice);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (state) {\n return state.frozen || (state.frozen = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function () {\n this.entries = [];\n};\n\nvar findUncaughtFrozen = function (store, key) {\n return find(store.entries, function (it) {\n return it[0] === key;\n });\n};\n\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) splice(this.entries, index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var Constructor = wrapper(function (that, iterable) {\n anInstance(that, Prototype);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n id: id++,\n frozen: null\n });\n if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var Prototype = Constructor.prototype;\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\n\n defineBuiltIns(Prototype, {\n // `{ WeakMap, WeakSet }.prototype.delete(key)` methods\n // https://tc39.es/ecma262/#sec-weakmap.prototype.delete\n // https://tc39.es/ecma262/#sec-weakset.prototype.delete\n 'delete': function (key) {\n var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && hasOwn(data, state.id) && delete data[state.id];\n },\n // `{ WeakMap, WeakSet }.prototype.has(key)` methods\n // https://tc39.es/ecma262/#sec-weakmap.prototype.has\n // https://tc39.es/ecma262/#sec-weakset.prototype.has\n has: function has(key) {\n var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && hasOwn(data, state.id);\n }\n });\n\n defineBuiltIns(Prototype, IS_MAP ? {\n // `WeakMap.prototype.get(key)` method\n // https://tc39.es/ecma262/#sec-weakmap.prototype.get\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n if (data) return data[state.id];\n }\n },\n // `WeakMap.prototype.set(key, value)` method\n // https://tc39.es/ecma262/#sec-weakmap.prototype.set\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // `WeakSet.prototype.add(value)` method\n // https://tc39.es/ecma262/#sec-weakset.prototype.add\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return Constructor;\n }\n};\n","'use strict';\nvar FREEZING = require('../internals/freezing');\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\nvar isObject = require('../internals/is-object');\nvar enforceInternalState = require('../internals/internal-state').enforce;\nvar fails = require('../internals/fails');\nvar NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\n\nvar $Object = Object;\n// eslint-disable-next-line es/no-array-isarray -- safe\nvar isArray = Array.isArray;\n// eslint-disable-next-line es/no-object-isextensible -- safe\nvar isExtensible = $Object.isExtensible;\n// eslint-disable-next-line es/no-object-isfrozen -- safe\nvar isFrozen = $Object.isFrozen;\n// eslint-disable-next-line es/no-object-issealed -- safe\nvar isSealed = $Object.isSealed;\n// eslint-disable-next-line es/no-object-freeze -- safe\nvar freeze = $Object.freeze;\n// eslint-disable-next-line es/no-object-seal -- safe\nvar seal = $Object.seal;\n\nvar IS_IE11 = !globalThis.ActiveXObject && 'ActiveXObject' in globalThis;\nvar InternalWeakMap;\n\nvar wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n};\n\n// `WeakMap` constructor\n// https://tc39.es/ecma262/#sec-weakmap-constructor\nvar $WeakMap = collection('WeakMap', wrapper, collectionWeak);\nvar WeakMapPrototype = $WeakMap.prototype;\nvar nativeSet = uncurryThis(WeakMapPrototype.set);\n\n// Chakra Edge bug: adding frozen arrays to WeakMap unfreeze them\nvar hasMSEdgeFreezingBug = function () {\n return FREEZING && fails(function () {\n var frozenArray = freeze([]);\n nativeSet(new $WeakMap(), frozenArray, 1);\n return !isFrozen(frozenArray);\n });\n};\n\n// IE11 WeakMap frozen keys fix\n// We can't use feature detection because it crash some old IE builds\n// https://github.com/zloirock/core-js/issues/485\nif (NATIVE_WEAK_MAP) if (IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n InternalMetadataModule.enable();\n var nativeDelete = uncurryThis(WeakMapPrototype['delete']);\n var nativeHas = uncurryThis(WeakMapPrototype.has);\n var nativeGet = uncurryThis(WeakMapPrototype.get);\n defineBuiltIns(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceInternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete(this, key) || state.frozen['delete'](key);\n } return nativeDelete(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceInternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas(this, key) || state.frozen.has(key);\n } return nativeHas(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceInternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas(this, key) ? nativeGet(this, key) : state.frozen.get(key);\n } return nativeGet(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceInternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas(this, key) ? nativeSet(this, key, value) : state.frozen.set(key, value);\n } else nativeSet(this, key, value);\n return this;\n }\n });\n// Chakra Edge frozen keys fix\n} else if (hasMSEdgeFreezingBug()) {\n defineBuiltIns(WeakMapPrototype, {\n set: function set(key, value) {\n var arrayIntegrityLevel;\n if (isArray(key)) {\n if (isFrozen(key)) arrayIntegrityLevel = freeze;\n else if (isSealed(key)) arrayIntegrityLevel = seal;\n }\n nativeSet(this, key, value);\n if (arrayIntegrityLevel) arrayIntegrityLevel(key);\n return this;\n }\n });\n}\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.map');\nrequire('../modules/es.weak-map');\nvar getBuiltIn = require('../internals/get-built-in');\nvar create = require('../internals/object-create');\nvar isObject = require('../internals/is-object');\n\nvar $Object = Object;\nvar $TypeError = TypeError;\nvar Map = getBuiltIn('Map');\nvar WeakMap = getBuiltIn('WeakMap');\n\nvar Node = function () {\n // keys\n this.object = null;\n this.symbol = null;\n // child nodes\n this.primitives = null;\n this.objectsByIndex = create(null);\n};\n\nNode.prototype.get = function (key, initializer) {\n return this[key] || (this[key] = initializer());\n};\n\nNode.prototype.next = function (i, it, IS_OBJECT) {\n var store = IS_OBJECT\n ? this.objectsByIndex[i] || (this.objectsByIndex[i] = new WeakMap())\n : this.primitives || (this.primitives = new Map());\n var entry = store.get(it);\n if (!entry) store.set(it, entry = new Node());\n return entry;\n};\n\nvar root = new Node();\n\nmodule.exports = function () {\n var active = root;\n var length = arguments.length;\n var i, it;\n // for prevent leaking, start from objects\n for (i = 0; i < length; i++) {\n if (isObject(it = arguments[i])) active = active.next(i, it, true);\n }\n if (this === $Object && active === root) throw new $TypeError('Composite keys must contain a non-primitive component');\n for (i = 0; i < length; i++) {\n if (!isObject(it = arguments[i])) active = active.next(i, it, false);\n } return active;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar apply = require('../internals/function-apply');\nvar getCompositeKeyNode = require('../internals/composite-key');\nvar getBuiltIn = require('../internals/get-built-in');\nvar create = require('../internals/object-create');\n\nvar $Object = Object;\n\nvar initializer = function () {\n var freeze = getBuiltIn('Object', 'freeze');\n return freeze ? freeze(create(null)) : create(null);\n};\n\n// https://github.com/tc39/proposal-richer-keys/tree/master/compositeKey\n$({ global: true, forced: true }, {\n compositeKey: function compositeKey() {\n return apply(getCompositeKeyNode, $Object, arguments).get('object', initializer);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar getCompositeKeyNode = require('../internals/composite-key');\nvar getBuiltIn = require('../internals/get-built-in');\nvar apply = require('../internals/function-apply');\n\n// https://github.com/tc39/proposal-richer-keys/tree/master/compositeKey\n$({ global: true, forced: true }, {\n compositeSymbol: function compositeSymbol() {\n if (arguments.length === 1 && typeof arguments[0] == 'string') return getBuiltIn('Symbol')['for'](arguments[0]);\n return apply(getCompositeKeyNode, null, arguments).get('symbol', getBuiltIn('Symbol'));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\n\n// `globalThis` object\n// https://tc39.es/ecma262/#sec-globalthis\n$({ global: true, forced: globalThis.globalThis !== globalThis }, {\n globalThis: globalThis\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-map -- safe\nvar MapPrototype = Map.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-map -- safe\n Map: Map,\n set: uncurryThis(MapPrototype.set),\n get: uncurryThis(MapPrototype.get),\n has: uncurryThis(MapPrototype.has),\n remove: uncurryThis(MapPrototype['delete']),\n proto: MapPrototype\n};\n","'use strict';\nvar has = require('../internals/map-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[MapData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar aMap = require('../internals/a-map');\nvar remove = require('../internals/map-helpers').remove;\n\n// `Map.prototype.deleteAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n deleteAll: function deleteAll(/* ...elements */) {\n var collection = aMap(this);\n var allDeleted = true;\n var wasDeleted;\n for (var k = 0, len = arguments.length; k < len; k++) {\n wasDeleted = remove(collection, arguments[k]);\n allDeleted = allDeleted && wasDeleted;\n } return !!allDeleted;\n }\n});\n","'use strict';\nvar call = require('../internals/function-call');\n\nmodule.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) {\n var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator;\n var next = record.next;\n var step, result;\n while (!(step = call(next, iterator)).done) {\n result = fn(step.value);\n if (result !== undefined) return result;\n }\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar iterateSimple = require('../internals/iterate-simple');\nvar MapHelpers = require('../internals/map-helpers');\n\nvar Map = MapHelpers.Map;\nvar MapPrototype = MapHelpers.proto;\nvar forEach = uncurryThis(MapPrototype.forEach);\nvar entries = uncurryThis(MapPrototype.entries);\nvar next = entries(new Map()).next;\n\nmodule.exports = function (map, fn, interruptible) {\n return interruptible ? iterateSimple({ iterator: entries(map), next: next }, function (entry) {\n return fn(entry[1], entry[0]);\n }) : forEach(map, fn);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.every` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n every: function every(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return iterate(map, function (value, key) {\n if (!boundFunction(value, key, map)) return false;\n }, true) !== false;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar MapHelpers = require('../internals/map-helpers');\nvar iterate = require('../internals/map-iterate');\n\nvar Map = MapHelpers.Map;\nvar set = MapHelpers.set;\n\n// `Map.prototype.filter` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n filter: function filter(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newMap = new Map();\n iterate(map, function (value, key) {\n if (boundFunction(value, key, map)) set(newMap, key, value);\n });\n return newMap;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.find` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n find: function find(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var result = iterate(map, function (value, key) {\n if (boundFunction(value, key, map)) return { value: value };\n }, true);\n return result && result.value;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.findKey` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n findKey: function findKey(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var result = iterate(map, function (value, key) {\n if (boundFunction(value, key, map)) return { key: key };\n }, true);\n return result && result.key;\n }\n});\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar bind = require('../internals/function-bind-context');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar iterate = require('../internals/iterate');\n\nmodule.exports = function (C, adder, ENTRY) {\n return function from(source /* , mapFn, thisArg */) {\n var O = toObject(source);\n var length = arguments.length;\n var mapFn = length > 1 ? arguments[1] : undefined;\n var mapping = mapFn !== undefined;\n var boundFunction = mapping ? bind(mapFn, length > 2 ? arguments[2] : undefined) : undefined;\n var result = new C();\n var n = 0;\n iterate(O, function (nextItem) {\n var entry = mapping ? boundFunction(nextItem, n++) : nextItem;\n if (ENTRY) adder(result, anObject(entry)[0], entry[1]);\n else adder(result, entry);\n });\n return result;\n };\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar MapHelpers = require('../internals/map-helpers');\nvar createCollectionFrom = require('../internals/collection-from');\n\n// `Map.from` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from\n$({ target: 'Map', stat: true, forced: true }, {\n from: createCollectionFrom(MapHelpers.Map, MapHelpers.set, true)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar iterate = require('../internals/iterate');\nvar MapHelpers = require('../internals/map-helpers');\nvar IS_PURE = require('../internals/is-pure');\nvar fails = require('../internals/fails');\n\nvar Map = MapHelpers.Map;\nvar has = MapHelpers.has;\nvar get = MapHelpers.get;\nvar set = MapHelpers.set;\nvar push = uncurryThis([].push);\n\nvar DOES_NOT_WORK_WITH_PRIMITIVES = IS_PURE || fails(function () {\n return Map.groupBy('ab', function (it) {\n return it;\n }).get('a').length !== 1;\n});\n\n// `Map.groupBy` method\n// https://tc39.es/ecma262/#sec-map.groupby\n$({ target: 'Map', stat: true, forced: IS_PURE || DOES_NOT_WORK_WITH_PRIMITIVES }, {\n groupBy: function groupBy(items, callbackfn) {\n requireObjectCoercible(items);\n aCallable(callbackfn);\n var map = new Map();\n var k = 0;\n iterate(items, function (value) {\n var key = callbackfn(value, k++);\n if (!has(map, key)) set(map, key, [value]);\n else push(get(map, key), value);\n });\n return map;\n }\n});\n","'use strict';\n// `SameValueZero` abstract operation\n// https://tc39.es/ecma262/#sec-samevaluezero\nmodule.exports = function (x, y) {\n // eslint-disable-next-line no-self-compare -- NaN check\n return x === y || x !== x && y !== y;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar sameValueZero = require('../internals/same-value-zero');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.includes` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n includes: function includes(searchElement) {\n return iterate(aMap(this), function (value) {\n if (sameValueZero(value, searchElement)) return true;\n }, true) === true;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar iterate = require('../internals/iterate');\nvar isCallable = require('../internals/is-callable');\nvar aCallable = require('../internals/a-callable');\nvar Map = require('../internals/map-helpers').Map;\n\n// `Map.keyBy` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', stat: true, forced: true }, {\n keyBy: function keyBy(iterable, keyDerivative) {\n var C = isCallable(this) ? this : Map;\n var newMap = new C();\n aCallable(keyDerivative);\n var setter = aCallable(newMap.set);\n iterate(iterable, function (element) {\n call(setter, newMap, keyDerivative(element), element);\n });\n return newMap;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.keyOf` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n keyOf: function keyOf(searchElement) {\n var result = iterate(aMap(this), function (value, key) {\n if (value === searchElement) return { key: key };\n }, true);\n return result && result.key;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar MapHelpers = require('../internals/map-helpers');\nvar iterate = require('../internals/map-iterate');\n\nvar Map = MapHelpers.Map;\nvar set = MapHelpers.set;\n\n// `Map.prototype.mapKeys` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n mapKeys: function mapKeys(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newMap = new Map();\n iterate(map, function (value, key) {\n set(newMap, boundFunction(value, key, map), value);\n });\n return newMap;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar MapHelpers = require('../internals/map-helpers');\nvar iterate = require('../internals/map-iterate');\n\nvar Map = MapHelpers.Map;\nvar set = MapHelpers.set;\n\n// `Map.prototype.mapValues` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n mapValues: function mapValues(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newMap = new Map();\n iterate(map, function (value, key) {\n set(newMap, key, boundFunction(value, key, map));\n });\n return newMap;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/iterate');\nvar set = require('../internals/map-helpers').set;\n\n// `Map.prototype.merge` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, arity: 1, forced: true }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n merge: function merge(iterable /* ...iterables */) {\n var map = aMap(this);\n var argumentsLength = arguments.length;\n var i = 0;\n while (i < argumentsLength) {\n iterate(arguments[i++], function (key, value) {\n set(map, key, value);\n }, { AS_ENTRIES: true });\n }\n return map;\n }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// https://tc39.github.io/proposal-setmap-offrom/\nmodule.exports = function (C, adder, ENTRY) {\n return function of() {\n var result = new C();\n var length = arguments.length;\n for (var index = 0; index < length; index++) {\n var entry = arguments[index];\n if (ENTRY) adder(result, anObject(entry)[0], entry[1]);\n else adder(result, entry);\n } return result;\n };\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar MapHelpers = require('../internals/map-helpers');\nvar createCollectionOf = require('../internals/collection-of');\n\n// `Map.of` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of\n$({ target: 'Map', stat: true, forced: true }, {\n of: createCollectionOf(MapHelpers.Map, MapHelpers.set, true)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aCallable = require('../internals/a-callable');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\nvar $TypeError = TypeError;\n\n// `Map.prototype.reduce` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n var map = aMap(this);\n var noInitial = arguments.length < 2;\n var accumulator = noInitial ? undefined : arguments[1];\n aCallable(callbackfn);\n iterate(map, function (value, key) {\n if (noInitial) {\n noInitial = false;\n accumulator = value;\n } else {\n accumulator = callbackfn(accumulator, value, key, map);\n }\n });\n if (noInitial) throw new $TypeError('Reduce of empty map with no initial value');\n return accumulator;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.some` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n some: function some(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return iterate(map, function (value, key) {\n if (boundFunction(value, key, map)) return true;\n }, true) === true;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aCallable = require('../internals/a-callable');\nvar aMap = require('../internals/a-map');\nvar MapHelpers = require('../internals/map-helpers');\n\nvar $TypeError = TypeError;\nvar get = MapHelpers.get;\nvar has = MapHelpers.has;\nvar set = MapHelpers.set;\n\n// `Map.prototype.update` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n update: function update(key, callback /* , thunk */) {\n var map = aMap(this);\n var length = arguments.length;\n aCallable(callback);\n var isPresentInMap = has(map, key);\n if (!isPresentInMap && length < 3) {\n throw new $TypeError('Updating absent value');\n }\n var value = isPresentInMap ? get(map, key) : aCallable(length > 2 ? arguments[2] : undefined)(key, map);\n set(map, key, callback(value, key, map));\n return map;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\nvar min = Math.min;\nvar max = Math.max;\n\n// `Math.clamp` method\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, forced: true }, {\n clamp: function clamp(x, lower, upper) {\n return min(upper, max(lower, x));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.DEG_PER_RAD` constant\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, nonConfigurable: true, nonWritable: true }, {\n DEG_PER_RAD: Math.PI / 180\n});\n","'use strict';\nvar $ = require('../internals/export');\n\nvar RAD_PER_DEG = 180 / Math.PI;\n\n// `Math.degrees` method\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, forced: true }, {\n degrees: function degrees(radians) {\n return radians * RAD_PER_DEG;\n }\n});\n","'use strict';\n// `Math.scale` method implementation\n// https://rwaldron.github.io/proposal-math-extensions/\nmodule.exports = function scale(x, inLow, inHigh, outLow, outHigh) {\n var nx = +x;\n var nInLow = +inLow;\n var nInHigh = +inHigh;\n var nOutLow = +outLow;\n var nOutHigh = +outHigh;\n // eslint-disable-next-line no-self-compare -- NaN check\n if (nx !== nx || nInLow !== nInLow || nInHigh !== nInHigh || nOutLow !== nOutLow || nOutHigh !== nOutHigh) return NaN;\n if (nx === Infinity || nx === -Infinity) return nx;\n return (nx - nInLow) * (nOutHigh - nOutLow) / (nInHigh - nInLow) + nOutLow;\n};\n","'use strict';\nvar $ = require('../internals/export');\n\nvar scale = require('../internals/math-scale');\nvar fround = require('../internals/math-fround');\n\n// `Math.fscale` method\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, forced: true }, {\n fscale: function fscale(x, inLow, inHigh, outLow, outHigh) {\n return fround(scale(x, inLow, inHigh, outLow, outHigh));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.iaddh` method\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n// TODO: Remove from `core-js@4`\n$({ target: 'Math', stat: true, forced: true }, {\n iaddh: function iaddh(x0, x1, y0, y1) {\n var $x0 = x0 >>> 0;\n var $x1 = x1 >>> 0;\n var $y0 = y0 >>> 0;\n return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.imulh` method\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n// TODO: Remove from `core-js@4`\n$({ target: 'Math', stat: true, forced: true }, {\n imulh: function imulh(u, v) {\n var UINT16 = 0xFFFF;\n var $u = +u;\n var $v = +v;\n var u0 = $u & UINT16;\n var v0 = $v & UINT16;\n var u1 = $u >> 16;\n var v1 = $v >> 16;\n var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.isubh` method\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n// TODO: Remove from `core-js@4`\n$({ target: 'Math', stat: true, forced: true }, {\n isubh: function isubh(x0, x1, y0, y1) {\n var $x0 = x0 >>> 0;\n var $x1 = x1 >>> 0;\n var $y0 = y0 >>> 0;\n return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.RAD_PER_DEG` constant\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, nonConfigurable: true, nonWritable: true }, {\n RAD_PER_DEG: 180 / Math.PI\n});\n","'use strict';\nvar $ = require('../internals/export');\n\nvar DEG_PER_RAD = Math.PI / 180;\n\n// `Math.radians` method\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, forced: true }, {\n radians: function radians(degrees) {\n return degrees * DEG_PER_RAD;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar scale = require('../internals/math-scale');\n\n// `Math.scale` method\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, forced: true }, {\n scale: scale\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nvar globalIsFinite = globalThis.isFinite;\n\n// `Number.isFinite` method\n// https://tc39.es/ecma262/#sec-number.isfinite\n// eslint-disable-next-line es/no-number-isfinite -- safe\nmodule.exports = Number.isFinite || function isFinite(it) {\n return typeof it == 'number' && globalIsFinite(it);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar anObject = require('../internals/an-object');\nvar numberIsFinite = require('../internals/number-is-finite');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar SEEDED_RANDOM = 'Seeded Random';\nvar SEEDED_RANDOM_GENERATOR = SEEDED_RANDOM + ' Generator';\nvar SEED_TYPE_ERROR = 'Math.seededPRNG() argument should have a \"seed\" field with a finite value.';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SEEDED_RANDOM_GENERATOR);\nvar $TypeError = TypeError;\n\nvar $SeededRandomGenerator = createIteratorConstructor(function SeededRandomGenerator(seed) {\n setInternalState(this, {\n type: SEEDED_RANDOM_GENERATOR,\n seed: seed % 2147483647\n });\n}, SEEDED_RANDOM, function next() {\n var state = getInternalState(this);\n var seed = state.seed = (state.seed * 1103515245 + 12345) % 2147483647;\n return createIterResultObject((seed & 1073741823) / 1073741823, false);\n});\n\n// `Math.seededPRNG` method\n// https://github.com/tc39/proposal-seeded-random\n// based on https://github.com/tc39/proposal-seeded-random/blob/78b8258835b57fc2100d076151ab506bc3202ae6/demo.html\n$({ target: 'Math', stat: true, forced: true }, {\n seededPRNG: function seededPRNG(it) {\n var seed = anObject(it).seed;\n if (!numberIsFinite(seed)) throw new $TypeError(SEED_TYPE_ERROR);\n return new $SeededRandomGenerator(seed);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.signbit` method\n// https://github.com/tc39/proposal-Math.signbit\n$({ target: 'Math', stat: true, forced: true }, {\n signbit: function signbit(x) {\n var n = +x;\n // eslint-disable-next-line no-self-compare -- NaN check\n return n === n && n === 0 ? 1 / n === -Infinity : n < 0;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.umulh` method\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n// TODO: Remove from `core-js@4`\n$({ target: 'Math', stat: true, forced: true }, {\n umulh: function umulh(u, v) {\n var UINT16 = 0xFFFF;\n var $u = +u;\n var $v = +v;\n var u0 = $u & UINT16;\n var v0 = $v & UINT16;\n var u1 = $u >>> 16;\n var v1 = $v >>> 16;\n var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar INVALID_NUMBER_REPRESENTATION = 'Invalid number representation';\nvar INVALID_RADIX = 'Invalid radix';\nvar $RangeError = RangeError;\nvar $SyntaxError = SyntaxError;\nvar $TypeError = TypeError;\nvar $parseInt = parseInt;\nvar pow = Math.pow;\nvar valid = /^[\\d.a-z]+$/;\nvar charAt = uncurryThis(''.charAt);\nvar exec = uncurryThis(valid.exec);\nvar numberToString = uncurryThis(1.0.toString);\nvar stringSlice = uncurryThis(''.slice);\nvar split = uncurryThis(''.split);\n\n// `Number.fromString` method\n// https://github.com/tc39/proposal-number-fromstring\n$({ target: 'Number', stat: true, forced: true }, {\n fromString: function fromString(string, radix) {\n var sign = 1;\n if (typeof string != 'string') throw new $TypeError(INVALID_NUMBER_REPRESENTATION);\n if (!string.length) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);\n if (charAt(string, 0) === '-') {\n sign = -1;\n string = stringSlice(string, 1);\n if (!string.length) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);\n }\n var R = radix === undefined ? 10 : toIntegerOrInfinity(radix);\n if (R < 2 || R > 36) throw new $RangeError(INVALID_RADIX);\n if (!exec(valid, string)) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);\n var parts = split(string, '.');\n var mathNum = $parseInt(parts[0], R);\n if (parts.length > 1) mathNum += $parseInt(parts[1], R) / pow(R, parts[1].length);\n if (R === 10 && numberToString(mathNum, R) !== string) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);\n return sign * mathNum;\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-observable\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar setSpecies = require('../internals/set-species');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isObject = require('../internals/is-object');\nvar getMethod = require('../internals/get-method');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar $$OBSERVABLE = wellKnownSymbol('observable');\nvar OBSERVABLE = 'Observable';\nvar SUBSCRIPTION = 'Subscription';\nvar SUBSCRIPTION_OBSERVER = 'SubscriptionObserver';\nvar getterFor = InternalStateModule.getterFor;\nvar setInternalState = InternalStateModule.set;\nvar getObservableInternalState = getterFor(OBSERVABLE);\nvar getSubscriptionInternalState = getterFor(SUBSCRIPTION);\nvar getSubscriptionObserverInternalState = getterFor(SUBSCRIPTION_OBSERVER);\n\nvar SubscriptionState = function (observer) {\n this.observer = anObject(observer);\n this.cleanup = null;\n this.subscriptionObserver = null;\n};\n\nSubscriptionState.prototype = {\n type: SUBSCRIPTION,\n clean: function () {\n var cleanup = this.cleanup;\n if (cleanup) {\n this.cleanup = null;\n try {\n cleanup();\n } catch (error) {\n hostReportErrors(error);\n }\n }\n },\n close: function () {\n if (!DESCRIPTORS) {\n var subscription = this.facade;\n var subscriptionObserver = this.subscriptionObserver;\n subscription.closed = true;\n if (subscriptionObserver) subscriptionObserver.closed = true;\n } this.observer = null;\n },\n isClosed: function () {\n return this.observer === null;\n }\n};\n\nvar Subscription = function (observer, subscriber) {\n var subscriptionState = setInternalState(this, new SubscriptionState(observer));\n var start;\n if (!DESCRIPTORS) this.closed = false;\n try {\n if (start = getMethod(observer, 'start')) call(start, observer, this);\n } catch (error) {\n hostReportErrors(error);\n }\n if (subscriptionState.isClosed()) return;\n var subscriptionObserver = subscriptionState.subscriptionObserver = new SubscriptionObserver(subscriptionState);\n try {\n var cleanup = subscriber(subscriptionObserver);\n var subscription = cleanup;\n if (!isNullOrUndefined(cleanup)) subscriptionState.cleanup = isCallable(cleanup.unsubscribe)\n ? function () { subscription.unsubscribe(); }\n : aCallable(cleanup);\n } catch (error) {\n subscriptionObserver.error(error);\n return;\n } if (subscriptionState.isClosed()) subscriptionState.clean();\n};\n\nSubscription.prototype = defineBuiltIns({}, {\n unsubscribe: function unsubscribe() {\n var subscriptionState = getSubscriptionInternalState(this);\n if (!subscriptionState.isClosed()) {\n subscriptionState.close();\n subscriptionState.clean();\n }\n }\n});\n\nif (DESCRIPTORS) defineBuiltInAccessor(Subscription.prototype, 'closed', {\n configurable: true,\n get: function closed() {\n return getSubscriptionInternalState(this).isClosed();\n }\n});\n\nvar SubscriptionObserver = function (subscriptionState) {\n setInternalState(this, {\n type: SUBSCRIPTION_OBSERVER,\n subscriptionState: subscriptionState\n });\n if (!DESCRIPTORS) this.closed = false;\n};\n\nSubscriptionObserver.prototype = defineBuiltIns({}, {\n next: function next(value) {\n var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;\n if (!subscriptionState.isClosed()) {\n var observer = subscriptionState.observer;\n try {\n var nextMethod = getMethod(observer, 'next');\n if (nextMethod) call(nextMethod, observer, value);\n } catch (error) {\n hostReportErrors(error);\n }\n }\n },\n error: function error(value) {\n var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;\n if (!subscriptionState.isClosed()) {\n var observer = subscriptionState.observer;\n subscriptionState.close();\n try {\n var errorMethod = getMethod(observer, 'error');\n if (errorMethod) call(errorMethod, observer, value);\n else hostReportErrors(value);\n } catch (err) {\n hostReportErrors(err);\n } subscriptionState.clean();\n }\n },\n complete: function complete() {\n var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;\n if (!subscriptionState.isClosed()) {\n var observer = subscriptionState.observer;\n subscriptionState.close();\n try {\n var completeMethod = getMethod(observer, 'complete');\n if (completeMethod) call(completeMethod, observer);\n } catch (error) {\n hostReportErrors(error);\n } subscriptionState.clean();\n }\n }\n});\n\nif (DESCRIPTORS) defineBuiltInAccessor(SubscriptionObserver.prototype, 'closed', {\n configurable: true,\n get: function closed() {\n return getSubscriptionObserverInternalState(this).subscriptionState.isClosed();\n }\n});\n\nvar $Observable = function Observable(subscriber) {\n anInstance(this, ObservablePrototype);\n setInternalState(this, {\n type: OBSERVABLE,\n subscriber: aCallable(subscriber)\n });\n};\n\nvar ObservablePrototype = $Observable.prototype;\n\ndefineBuiltIns(ObservablePrototype, {\n subscribe: function subscribe(observer) {\n var length = arguments.length;\n return new Subscription(isCallable(observer) ? {\n next: observer,\n error: length > 1 ? arguments[1] : undefined,\n complete: length > 2 ? arguments[2] : undefined\n } : isObject(observer) ? observer : {}, getObservableInternalState(this).subscriber);\n }\n});\n\ndefineBuiltIn(ObservablePrototype, $$OBSERVABLE, function () { return this; });\n\n$({ global: true, constructor: true, forced: true }, {\n Observable: $Observable\n});\n\nsetSpecies(OBSERVABLE);\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar isConstructor = require('../internals/is-constructor');\nvar getIterator = require('../internals/get-iterator');\nvar getMethod = require('../internals/get-method');\nvar iterate = require('../internals/iterate');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $$OBSERVABLE = wellKnownSymbol('observable');\n\n// `Observable.from` method\n// https://github.com/tc39/proposal-observable\n$({ target: 'Observable', stat: true, forced: true }, {\n from: function from(x) {\n var C = isConstructor(this) ? this : getBuiltIn('Observable');\n var observableMethod = getMethod(anObject(x), $$OBSERVABLE);\n if (observableMethod) {\n var observable = anObject(call(observableMethod, x));\n return observable.constructor === C ? observable : new C(function (observer) {\n return observable.subscribe(observer);\n });\n }\n var iterator = getIterator(x);\n return new C(function (observer) {\n iterate(iterator, function (it, stop) {\n observer.next(it);\n if (observer.closed) return stop();\n }, { IS_ITERATOR: true, INTERRUPTED: true });\n observer.complete();\n });\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isConstructor = require('../internals/is-constructor');\n\nvar Array = getBuiltIn('Array');\n\n// `Observable.of` method\n// https://github.com/tc39/proposal-observable\n$({ target: 'Observable', stat: true, forced: true }, {\n of: function of() {\n var C = isConstructor(this) ? this : getBuiltIn('Observable');\n var length = arguments.length;\n var items = Array(length);\n var index = 0;\n while (index < length) items[index] = arguments[index++];\n return new C(function (observer) {\n for (var i = 0; i < length; i++) {\n observer.next(items[i]);\n if (observer.closed) return;\n } observer.complete();\n });\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\n// `Promise.allSettled` method\n// https://tc39.es/ecma262/#sec-promise.allsettled\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n allSettled: function allSettled(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var promiseResolve = aCallable(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n remaining++;\n call(promiseResolve, C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'fulfilled', value: value };\n --remaining || resolve(values);\n }, function (error) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'rejected', reason: error };\n --remaining || resolve(values);\n });\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar getBuiltIn = require('../internals/get-built-in');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\nvar PROMISE_ANY_ERROR = 'No one promise resolved';\n\n// `Promise.any` method\n// https://tc39.es/ecma262/#sec-promise.any\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n any: function any(iterable) {\n var C = this;\n var AggregateError = getBuiltIn('AggregateError');\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var promiseResolve = aCallable(C.resolve);\n var errors = [];\n var counter = 0;\n var remaining = 1;\n var alreadyResolved = false;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyRejected = false;\n remaining++;\n call(promiseResolve, C, promise).then(function (value) {\n if (alreadyRejected || alreadyResolved) return;\n alreadyResolved = true;\n resolve(value);\n }, function (error) {\n if (alreadyRejected || alreadyResolved) return;\n alreadyRejected = true;\n errors[index] = error;\n --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR));\n });\n });\n --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR));\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar apply = require('../internals/function-apply');\nvar slice = require('../internals/array-slice');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar aCallable = require('../internals/a-callable');\nvar perform = require('../internals/perform');\n\nvar Promise = globalThis.Promise;\n\nvar ACCEPT_ARGUMENTS = false;\n// Avoiding the use of polyfills of the previous iteration of this proposal\n// that does not accept arguments of the callback\nvar FORCED = !Promise || !Promise['try'] || perform(function () {\n Promise['try'](function (argument) {\n ACCEPT_ARGUMENTS = argument === 8;\n }, 8);\n}).error || !ACCEPT_ARGUMENTS;\n\n// `Promise.try` method\n// https://tc39.es/ecma262/#sec-promise.try\n$({ target: 'Promise', stat: true, forced: FORCED }, {\n 'try': function (callbackfn /* , ...args */) {\n var args = arguments.length > 1 ? slice(arguments, 1) : [];\n var promiseCapability = newPromiseCapabilityModule.f(this);\n var result = perform(function () {\n return apply(aCallable(callbackfn), undefined, args);\n });\n (result.error ? promiseCapability.reject : promiseCapability.resolve)(result.value);\n return promiseCapability.promise;\n }\n});\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.map');\nrequire('../modules/es.weak-map');\nvar getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar shared = require('../internals/shared');\n\nvar Map = getBuiltIn('Map');\nvar WeakMap = getBuiltIn('WeakMap');\nvar push = uncurryThis([].push);\n\nvar metadata = shared('metadata');\nvar store = metadata.store || (metadata.store = new WeakMap());\n\nvar getOrCreateMetadataMap = function (target, targetKey, create) {\n var targetMetadata = store.get(target);\n if (!targetMetadata) {\n if (!create) return;\n store.set(target, targetMetadata = new Map());\n }\n var keyMetadata = targetMetadata.get(targetKey);\n if (!keyMetadata) {\n if (!create) return;\n targetMetadata.set(targetKey, keyMetadata = new Map());\n } return keyMetadata;\n};\n\nvar ordinaryHasOwnMetadata = function (MetadataKey, O, P) {\n var metadataMap = getOrCreateMetadataMap(O, P, false);\n return metadataMap === undefined ? false : metadataMap.has(MetadataKey);\n};\n\nvar ordinaryGetOwnMetadata = function (MetadataKey, O, P) {\n var metadataMap = getOrCreateMetadataMap(O, P, false);\n return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey);\n};\n\nvar ordinaryDefineOwnMetadata = function (MetadataKey, MetadataValue, O, P) {\n getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue);\n};\n\nvar ordinaryOwnMetadataKeys = function (target, targetKey) {\n var metadataMap = getOrCreateMetadataMap(target, targetKey, false);\n var keys = [];\n if (metadataMap) metadataMap.forEach(function (_, key) { push(keys, key); });\n return keys;\n};\n\nvar toMetadataKey = function (it) {\n return it === undefined || typeof it == 'symbol' ? it : String(it);\n};\n\nmodule.exports = {\n store: store,\n getMap: getOrCreateMetadataMap,\n has: ordinaryHasOwnMetadata,\n get: ordinaryGetOwnMetadata,\n set: ordinaryDefineOwnMetadata,\n keys: ordinaryOwnMetadataKeys,\n toKey: toMetadataKey\n};\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar toMetadataKey = ReflectMetadataModule.toKey;\nvar ordinaryDefineOwnMetadata = ReflectMetadataModule.set;\n\n// `Reflect.defineMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n defineMetadata: function defineMetadata(metadataKey, metadataValue, target /* , targetKey */) {\n var targetKey = arguments.length < 4 ? undefined : toMetadataKey(arguments[3]);\n ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), targetKey);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar toMetadataKey = ReflectMetadataModule.toKey;\nvar getOrCreateMetadataMap = ReflectMetadataModule.getMap;\nvar store = ReflectMetadataModule.store;\n\n// `Reflect.deleteMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n deleteMetadata: function deleteMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false);\n if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false;\n if (metadataMap.size) return true;\n var targetMetadata = store.get(target);\n targetMetadata['delete'](targetKey);\n return !!targetMetadata.size || store['delete'](target);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\n\nvar ordinaryHasOwnMetadata = ReflectMetadataModule.has;\nvar ordinaryGetOwnMetadata = ReflectMetadataModule.get;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\nvar ordinaryGetMetadata = function (MetadataKey, O, P) {\n var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P);\n var parent = getPrototypeOf(O);\n return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined;\n};\n\n// `Reflect.getMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n getMetadata: function getMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n return ordinaryGetMetadata(metadataKey, anObject(target), targetKey);\n }\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar toObject = require('../internals/to-object');\nvar MapHelpers = require('../internals/map-helpers');\nvar iterate = require('../internals/map-iterate');\n\nvar Map = MapHelpers.Map;\nvar mapHas = MapHelpers.has;\nvar mapSet = MapHelpers.set;\nvar push = uncurryThis([].push);\n\n// `Array.prototype.uniqueBy` method\n// https://github.com/tc39/proposal-array-unique\nmodule.exports = function uniqueBy(resolver) {\n var that = toObject(this);\n var length = lengthOfArrayLike(that);\n var result = [];\n var map = new Map();\n var resolverFunction = !isNullOrUndefined(resolver) ? aCallable(resolver) : function (value) {\n return value;\n };\n var index, item, key;\n for (index = 0; index < length; index++) {\n item = that[index];\n key = resolverFunction(item);\n if (!mapHas(map, key)) mapSet(map, key, item);\n }\n iterate(map, function (value) {\n push(result, value);\n });\n return result;\n};\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar $arrayUniqueBy = require('../internals/array-unique-by');\n\nvar arrayUniqueBy = uncurryThis($arrayUniqueBy);\nvar concat = uncurryThis([].concat);\nvar ordinaryOwnMetadataKeys = ReflectMetadataModule.keys;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\nvar ordinaryMetadataKeys = function (O, P) {\n var oKeys = ordinaryOwnMetadataKeys(O, P);\n var parent = getPrototypeOf(O);\n if (parent === null) return oKeys;\n var pKeys = ordinaryMetadataKeys(parent, P);\n return pKeys.length ? oKeys.length ? arrayUniqueBy(concat(oKeys, pKeys)) : pKeys : oKeys;\n};\n\n// `Reflect.getMetadataKeys` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n getMetadataKeys: function getMetadataKeys(target /* , targetKey */) {\n var targetKey = arguments.length < 2 ? undefined : toMetadataKey(arguments[1]);\n return ordinaryMetadataKeys(anObject(target), targetKey);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar ordinaryGetOwnMetadata = ReflectMetadataModule.get;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\n// `Reflect.getOwnMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n getOwnMetadata: function getOwnMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n return ordinaryGetOwnMetadata(metadataKey, anObject(target), targetKey);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar ordinaryOwnMetadataKeys = ReflectMetadataModule.keys;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\n// `Reflect.getOwnMetadataKeys` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n getOwnMetadataKeys: function getOwnMetadataKeys(target /* , targetKey */) {\n var targetKey = arguments.length < 2 ? undefined : toMetadataKey(arguments[1]);\n return ordinaryOwnMetadataKeys(anObject(target), targetKey);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\n\nvar ordinaryHasOwnMetadata = ReflectMetadataModule.has;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\nvar ordinaryHasMetadata = function (MetadataKey, O, P) {\n var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n if (hasOwn) return true;\n var parent = getPrototypeOf(O);\n return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false;\n};\n\n// `Reflect.hasMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n hasMetadata: function hasMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n return ordinaryHasMetadata(metadataKey, anObject(target), targetKey);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar ordinaryHasOwnMetadata = ReflectMetadataModule.has;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\n// `Reflect.hasOwnMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n hasOwnMetadata: function hasOwnMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n return ordinaryHasOwnMetadata(metadataKey, anObject(target), targetKey);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar toMetadataKey = ReflectMetadataModule.toKey;\nvar ordinaryDefineOwnMetadata = ReflectMetadataModule.set;\n\n// `Reflect.metadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n metadata: function metadata(metadataKey, metadataValue) {\n return function decorator(target, key) {\n ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetadataKey(key));\n };\n }\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-set -- safe\nvar SetPrototype = Set.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-set -- safe\n Set: Set,\n add: uncurryThis(SetPrototype.add),\n has: uncurryThis(SetPrototype.has),\n remove: uncurryThis(SetPrototype['delete']),\n proto: SetPrototype\n};\n","'use strict';\nvar has = require('../internals/set-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[SetData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar aSet = require('../internals/a-set');\nvar add = require('../internals/set-helpers').add;\n\n// `Set.prototype.addAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n addAll: function addAll(/* ...elements */) {\n var set = aSet(this);\n for (var k = 0, len = arguments.length; k < len; k++) {\n add(set, arguments[k]);\n } return set;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aSet = require('../internals/a-set');\nvar remove = require('../internals/set-helpers').remove;\n\n// `Set.prototype.deleteAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n deleteAll: function deleteAll(/* ...elements */) {\n var collection = aSet(this);\n var allDeleted = true;\n var wasDeleted;\n for (var k = 0, len = arguments.length; k < len; k++) {\n wasDeleted = remove(collection, arguments[k]);\n allDeleted = allDeleted && wasDeleted;\n } return !!allDeleted;\n }\n});\n","'use strict';\nvar classof = require('../internals/classof');\nvar hasOwn = require('../internals/has-own-property');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar $Object = Object;\n\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) return false;\n var O = $Object(it);\n return O[ITERATOR] !== undefined\n || '@@iterator' in O\n || hasOwn(Iterators, classof(O));\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isIterable = require('../internals/is-iterable');\nvar isObject = require('../internals/is-object');\n\nvar Set = getBuiltIn('Set');\n\nvar isSetLike = function (it) {\n return isObject(it)\n && typeof it.size == 'number'\n && isCallable(it.has)\n && isCallable(it.keys);\n};\n\n// fallback old -> new set methods proposal arguments\nmodule.exports = function (it) {\n if (isSetLike(it)) return it;\n return isIterable(it) ? new Set(it) : it;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar iterateSimple = require('../internals/iterate-simple');\nvar SetHelpers = require('../internals/set-helpers');\n\nvar Set = SetHelpers.Set;\nvar SetPrototype = SetHelpers.proto;\nvar forEach = uncurryThis(SetPrototype.forEach);\nvar keys = uncurryThis(SetPrototype.keys);\nvar next = keys(new Set()).next;\n\nmodule.exports = function (set, fn, interruptible) {\n return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn);\n};\n","'use strict';\nvar SetHelpers = require('../internals/set-helpers');\nvar iterate = require('../internals/set-iterate');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\n\nmodule.exports = function (set) {\n var result = new Set();\n iterate(set, function (it) {\n add(result, it);\n });\n return result;\n};\n","'use strict';\nvar uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');\nvar SetHelpers = require('../internals/set-helpers');\n\nmodule.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) {\n return set.size;\n};\n","'use strict';\n// `GetIteratorDirect(obj)` abstract operation\n// https://tc39.es/proposal-iterator-helpers/#sec-getiteratordirect\nmodule.exports = function (obj) {\n return {\n iterator: obj,\n next: obj.next,\n done: false\n };\n};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar call = require('../internals/function-call');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar getIteratorDirect = require('../internals/get-iterator-direct');\n\nvar INVALID_SIZE = 'Invalid size';\nvar $RangeError = RangeError;\nvar $TypeError = TypeError;\nvar max = Math.max;\n\nvar SetRecord = function (set, intSize) {\n this.set = set;\n this.size = max(intSize, 0);\n this.has = aCallable(set.has);\n this.keys = aCallable(set.keys);\n};\n\nSetRecord.prototype = {\n getIterator: function () {\n return getIteratorDirect(anObject(call(this.keys, this.set)));\n },\n includes: function (it) {\n return call(this.has, this.set, it);\n }\n};\n\n// `GetSetRecord` abstract operation\n// https://tc39.es/proposal-set-methods/#sec-getsetrecord\nmodule.exports = function (obj) {\n anObject(obj);\n var numSize = +obj.size;\n // NOTE: If size is undefined, then numSize will be NaN\n // eslint-disable-next-line no-self-compare -- NaN check\n if (numSize !== numSize) throw new $TypeError(INVALID_SIZE);\n var intSize = toIntegerOrInfinity(numSize);\n if (intSize < 0) throw new $RangeError(INVALID_SIZE);\n return new SetRecord(obj, intSize);\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar clone = require('../internals/set-clone');\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.difference` method\n// https://github.com/tc39/proposal-set-methods\nmodule.exports = function difference(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n var result = clone(O);\n if (size(O) <= otherRec.size) iterateSet(O, function (e) {\n if (otherRec.includes(e)) remove(result, e);\n });\n else iterateSimple(otherRec.getIterator(), function (e) {\n if (has(O, e)) remove(result, e);\n });\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $difference = require('../internals/set-difference');\n\n// `Set.prototype.difference` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n difference: function difference(other) {\n return call($difference, this, toSetLike(other));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\n\n// `Set.prototype.every` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n every: function every(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return iterate(set, function (value) {\n if (!boundFunction(value, value, set)) return false;\n }, true) !== false;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar iterate = require('../internals/set-iterate');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\n\n// `Set.prototype.filter` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n filter: function filter(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newSet = new Set();\n iterate(set, function (value) {\n if (boundFunction(value, value, set)) add(newSet, value);\n });\n return newSet;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\n\n// `Set.prototype.find` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n find: function find(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var result = iterate(set, function (value) {\n if (boundFunction(value, value, set)) return { value: value };\n }, true);\n return result && result.value;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar SetHelpers = require('../internals/set-helpers');\nvar createCollectionFrom = require('../internals/collection-from');\n\n// `Set.from` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from\n$({ target: 'Set', stat: true, forced: true }, {\n from: createCollectionFrom(SetHelpers.Set, SetHelpers.add, false)\n});\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\n\n// `Set.prototype.intersection` method\n// https://github.com/tc39/proposal-set-methods\nmodule.exports = function intersection(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n var result = new Set();\n\n if (size(O) > otherRec.size) {\n iterateSimple(otherRec.getIterator(), function (e) {\n if (has(O, e)) add(result, e);\n });\n } else {\n iterateSet(O, function (e) {\n if (otherRec.includes(e)) add(result, e);\n });\n }\n\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $intersection = require('../internals/set-intersection');\n\n// `Set.prototype.intersection` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n intersection: function intersection(other) {\n return call($intersection, this, toSetLike(other));\n }\n});\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar has = require('../internals/set-helpers').has;\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\nvar iteratorClose = require('../internals/iterator-close');\n\n// `Set.prototype.isDisjointFrom` method\n// https://tc39.github.io/proposal-set-methods/#Set.prototype.isDisjointFrom\nmodule.exports = function isDisjointFrom(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) <= otherRec.size) return iterateSet(O, function (e) {\n if (otherRec.includes(e)) return false;\n }, true) !== false;\n var iterator = otherRec.getIterator();\n return iterateSimple(iterator, function (e) {\n if (has(O, e)) return iteratorClose(iterator, 'normal', false);\n }) !== false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $isDisjointFrom = require('../internals/set-is-disjoint-from');\n\n// `Set.prototype.isDisjointFrom` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n isDisjointFrom: function isDisjointFrom(other) {\n return call($isDisjointFrom, this, toSetLike(other));\n }\n});\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar size = require('../internals/set-size');\nvar iterate = require('../internals/set-iterate');\nvar getSetRecord = require('../internals/get-set-record');\n\n// `Set.prototype.isSubsetOf` method\n// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSubsetOf\nmodule.exports = function isSubsetOf(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) > otherRec.size) return false;\n return iterate(O, function (e) {\n if (!otherRec.includes(e)) return false;\n }, true) !== false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $isSubsetOf = require('../internals/set-is-subset-of');\n\n// `Set.prototype.isSubsetOf` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n isSubsetOf: function isSubsetOf(other) {\n return call($isSubsetOf, this, toSetLike(other));\n }\n});\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar has = require('../internals/set-helpers').has;\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\nvar iteratorClose = require('../internals/iterator-close');\n\n// `Set.prototype.isSupersetOf` method\n// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSupersetOf\nmodule.exports = function isSupersetOf(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) < otherRec.size) return false;\n var iterator = otherRec.getIterator();\n return iterateSimple(iterator, function (e) {\n if (!has(O, e)) return iteratorClose(iterator, 'normal', false);\n }) !== false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $isSupersetOf = require('../internals/set-is-superset-of');\n\n// `Set.prototype.isSupersetOf` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n isSupersetOf: function isSupersetOf(other) {\n return call($isSupersetOf, this, toSetLike(other));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\nvar toString = require('../internals/to-string');\n\nvar arrayJoin = uncurryThis([].join);\nvar push = uncurryThis([].push);\n\n// `Set.prototype.join` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n join: function join(separator) {\n var set = aSet(this);\n var sep = separator === undefined ? ',' : toString(separator);\n var array = [];\n iterate(set, function (value) {\n push(array, value);\n });\n return arrayJoin(array, sep);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar iterate = require('../internals/set-iterate');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\n\n// `Set.prototype.map` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n map: function map(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newSet = new Set();\n iterate(set, function (value) {\n add(newSet, boundFunction(value, value, set));\n });\n return newSet;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar SetHelpers = require('../internals/set-helpers');\nvar createCollectionOf = require('../internals/collection-of');\n\n// `Set.of` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of\n$({ target: 'Set', stat: true, forced: true }, {\n of: createCollectionOf(SetHelpers.Set, SetHelpers.add, false)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aCallable = require('../internals/a-callable');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\n\nvar $TypeError = TypeError;\n\n// `Set.prototype.reduce` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n var set = aSet(this);\n var noInitial = arguments.length < 2;\n var accumulator = noInitial ? undefined : arguments[1];\n aCallable(callbackfn);\n iterate(set, function (value) {\n if (noInitial) {\n noInitial = false;\n accumulator = value;\n } else {\n accumulator = callbackfn(accumulator, value, value, set);\n }\n });\n if (noInitial) throw new $TypeError('Reduce of empty set with no initial value');\n return accumulator;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\n\n// `Set.prototype.some` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n some: function some(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return iterate(set, function (value) {\n if (boundFunction(value, value, set)) return true;\n }, true) === true;\n }\n});\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar clone = require('../internals/set-clone');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.symmetricDifference` method\n// https://github.com/tc39/proposal-set-methods\nmodule.exports = function symmetricDifference(other) {\n var O = aSet(this);\n var keysIter = getSetRecord(other).getIterator();\n var result = clone(O);\n iterateSimple(keysIter, function (e) {\n if (has(O, e)) remove(result, e);\n else add(result, e);\n });\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $symmetricDifference = require('../internals/set-symmetric-difference');\n\n// `Set.prototype.symmetricDifference` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n symmetricDifference: function symmetricDifference(other) {\n return call($symmetricDifference, this, toSetLike(other));\n }\n});\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar add = require('../internals/set-helpers').add;\nvar clone = require('../internals/set-clone');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\n\n// `Set.prototype.union` method\n// https://github.com/tc39/proposal-set-methods\nmodule.exports = function union(other) {\n var O = aSet(this);\n var keysIter = getSetRecord(other).getIterator();\n var result = clone(O);\n iterateSimple(keysIter, function (it) {\n add(result, it);\n });\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $union = require('../internals/set-union');\n\n// `Set.prototype.union` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n union: function union(other) {\n return call($union, this, toSetLike(other));\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar charAt = require('../internals/string-multibyte').charAt;\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\n\n// `String.prototype.at` method\n// https://github.com/mathiasbynens/String.prototype.at\n$({ target: 'String', proto: true, forced: true }, {\n at: function at(index) {\n var S = toString(requireObjectCoercible(this));\n var len = S.length;\n var relativeIndex = toIntegerOrInfinity(index);\n var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex;\n return (k < 0 || k >= len) ? undefined : charAt(S, k);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toString = require('../internals/to-string');\nvar InternalStateModule = require('../internals/internal-state');\nvar StringMultibyteModule = require('../internals/string-multibyte');\n\nvar codeAt = StringMultibyteModule.codeAt;\nvar charAt = StringMultibyteModule.charAt;\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// TODO: unify with String#@@iterator\nvar $StringIterator = createIteratorConstructor(function StringIterator(string) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: string,\n index: 0\n });\n}, 'String', function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return createIterResultObject(undefined, true);\n point = charAt(string, index);\n state.index += point.length;\n return createIterResultObject({ codePoint: codeAt(point, 0), position: index }, false);\n});\n\n// `String.prototype.codePoints` method\n// https://github.com/tc39/proposal-string-prototype-codepoints\n$({ target: 'String', proto: true, forced: true }, {\n codePoints: function codePoints() {\n return new $StringIterator(toString(requireObjectCoercible(this)));\n }\n});\n","'use strict';\n/* eslint-disable es/no-string-prototype-matchall -- safe */\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar anObject = require('../internals/an-object');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar classof = require('../internals/classof-raw');\nvar isRegExp = require('../internals/is-regexp');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar getMethod = require('../internals/get-method');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\nvar InternalStateModule = require('../internals/internal-state');\nvar IS_PURE = require('../internals/is-pure');\n\nvar MATCH_ALL = wellKnownSymbol('matchAll');\nvar REGEXP_STRING = 'RegExp String';\nvar REGEXP_STRING_ITERATOR = REGEXP_STRING + ' Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(REGEXP_STRING_ITERATOR);\nvar RegExpPrototype = RegExp.prototype;\nvar $TypeError = TypeError;\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar nativeMatchAll = uncurryThis(''.matchAll);\n\nvar WORKS_WITH_NON_GLOBAL_REGEX = !!nativeMatchAll && !fails(function () {\n nativeMatchAll('a', /./);\n});\n\nvar $RegExpStringIterator = createIteratorConstructor(function RegExpStringIterator(regexp, string, $global, fullUnicode) {\n setInternalState(this, {\n type: REGEXP_STRING_ITERATOR,\n regexp: regexp,\n string: string,\n global: $global,\n unicode: fullUnicode,\n done: false\n });\n}, REGEXP_STRING, function next() {\n var state = getInternalState(this);\n if (state.done) return createIterResultObject(undefined, true);\n var R = state.regexp;\n var S = state.string;\n var match = regExpExec(R, S);\n if (match === null) {\n state.done = true;\n return createIterResultObject(undefined, true);\n }\n if (state.global) {\n if (toString(match[0]) === '') R.lastIndex = advanceStringIndex(S, toLength(R.lastIndex), state.unicode);\n return createIterResultObject(match, false);\n }\n state.done = true;\n return createIterResultObject(match, false);\n});\n\nvar $matchAll = function (string) {\n var R = anObject(this);\n var S = toString(string);\n var C = speciesConstructor(R, RegExp);\n var flags = toString(getRegExpFlags(R));\n var matcher, $global, fullUnicode;\n matcher = new C(C === RegExp ? R.source : R, flags);\n $global = !!~stringIndexOf(flags, 'g');\n fullUnicode = !!~stringIndexOf(flags, 'u');\n matcher.lastIndex = toLength(R.lastIndex);\n return new $RegExpStringIterator(matcher, S, $global, fullUnicode);\n};\n\n// `String.prototype.matchAll` method\n// https://tc39.es/ecma262/#sec-string.prototype.matchall\n$({ target: 'String', proto: true, forced: WORKS_WITH_NON_GLOBAL_REGEX }, {\n matchAll: function matchAll(regexp) {\n var O = requireObjectCoercible(this);\n var flags, S, matcher, rx;\n if (!isNullOrUndefined(regexp)) {\n if (isRegExp(regexp)) {\n flags = toString(requireObjectCoercible(getRegExpFlags(regexp)));\n if (!~stringIndexOf(flags, 'g')) throw new $TypeError('`.matchAll` does not allow non-global regexes');\n }\n if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll(O, regexp);\n matcher = getMethod(regexp, MATCH_ALL);\n if (matcher === undefined && IS_PURE && classof(regexp) === 'RegExp') matcher = $matchAll;\n if (matcher) return call(matcher, regexp, O);\n } else if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll(O, regexp);\n S = toString(O);\n rx = new RegExp(regexp, 'g');\n return IS_PURE ? call($matchAll, rx, S) : rx[MATCH_ALL](S);\n }\n});\n\nIS_PURE || MATCH_ALL in RegExpPrototype || defineBuiltIn(RegExpPrototype, MATCH_ALL, $matchAll);\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isRegExp = require('../internals/is-regexp');\nvar toString = require('../internals/to-string');\nvar getMethod = require('../internals/get-method');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar getSubstitution = require('../internals/get-substitution');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar REPLACE = wellKnownSymbol('replace');\nvar $TypeError = TypeError;\nvar indexOf = uncurryThis(''.indexOf);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\nvar max = Math.max;\n\n// `String.prototype.replaceAll` method\n// https://tc39.es/ecma262/#sec-string.prototype.replaceall\n$({ target: 'String', proto: true }, {\n replaceAll: function replaceAll(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var IS_REG_EXP, flags, replacer, string, searchString, functionalReplace, searchLength, advanceBy, position, replacement;\n var endOfLastMatch = 0;\n var result = '';\n if (!isNullOrUndefined(searchValue)) {\n IS_REG_EXP = isRegExp(searchValue);\n if (IS_REG_EXP) {\n flags = toString(requireObjectCoercible(getRegExpFlags(searchValue)));\n if (!~indexOf(flags, 'g')) throw new $TypeError('`.replaceAll` does not allow non-global regexes');\n }\n replacer = getMethod(searchValue, REPLACE);\n if (replacer) return call(replacer, searchValue, O, replaceValue);\n if (IS_PURE && IS_REG_EXP) return replace(toString(O), searchValue, replaceValue);\n }\n string = toString(O);\n searchString = toString(searchValue);\n functionalReplace = isCallable(replaceValue);\n if (!functionalReplace) replaceValue = toString(replaceValue);\n searchLength = searchString.length;\n advanceBy = max(1, searchLength);\n position = indexOf(string, searchString);\n while (position !== -1) {\n replacement = functionalReplace\n ? toString(replaceValue(searchString, position, string))\n : getSubstitution(searchString, string, position, [], undefined, replaceValue);\n result += stringSlice(string, endOfLastMatch, position) + replacement;\n endOfLastMatch = position + searchLength;\n position = position + advanceBy > string.length ? -1 : indexOf(string, searchString, position + advanceBy);\n }\n if (endOfLastMatch < string.length) {\n result += stringSlice(string, endOfLastMatch);\n }\n return result;\n }\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nmodule.exports = globalThis;\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nexports.f = wellKnownSymbol;\n","'use strict';\nvar path = require('../internals/path');\nvar hasOwn = require('../internals/has-own-property');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!hasOwn(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar defineWellKnownSymbol = require('../internals/well-known-symbol-define');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\n\nvar Symbol = globalThis.Symbol;\n\n// `Symbol.dispose` well-known symbol\n// https://github.com/tc39/proposal-explicit-resource-management\ndefineWellKnownSymbol('dispose');\n\nif (Symbol) {\n var descriptor = getOwnPropertyDescriptor(Symbol, 'dispose');\n // workaround of NodeJS 20.4 bug\n // https://github.com/nodejs/node/issues/48699\n // and incorrect descriptor from some transpilers and userland helpers\n if (descriptor.enumerable && descriptor.configurable && descriptor.writable) {\n defineProperty(Symbol, 'dispose', { value: descriptor.value, enumerable: false, configurable: false, writable: false });\n }\n}\n","'use strict';\nvar defineWellKnownSymbol = require('../internals/well-known-symbol-define');\n\n// `Symbol.observable` well-known symbol\n// https://github.com/tc39/proposal-observable\ndefineWellKnownSymbol('observable');\n","'use strict';\n// TODO: remove from `core-js@4`\nvar defineWellKnownSymbol = require('../internals/well-known-symbol-define');\n\n// `Symbol.patternMatch` well-known symbol\n// https://github.com/tc39/proposal-pattern-matching\ndefineWellKnownSymbol('patternMatch');\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-weak-map -- safe\nvar WeakMapPrototype = WeakMap.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-weak-map -- safe\n WeakMap: WeakMap,\n set: uncurryThis(WeakMapPrototype.set),\n get: uncurryThis(WeakMapPrototype.get),\n has: uncurryThis(WeakMapPrototype.has),\n remove: uncurryThis(WeakMapPrototype['delete'])\n};\n","'use strict';\nvar has = require('../internals/weak-map-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[WeakMapData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar aWeakMap = require('../internals/a-weak-map');\nvar remove = require('../internals/weak-map-helpers').remove;\n\n// `WeakMap.prototype.deleteAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'WeakMap', proto: true, real: true, forced: true }, {\n deleteAll: function deleteAll(/* ...elements */) {\n var collection = aWeakMap(this);\n var allDeleted = true;\n var wasDeleted;\n for (var k = 0, len = arguments.length; k < len; k++) {\n wasDeleted = remove(collection, arguments[k]);\n allDeleted = allDeleted && wasDeleted;\n } return !!allDeleted;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar WeakMapHelpers = require('../internals/weak-map-helpers');\nvar createCollectionFrom = require('../internals/collection-from');\n\n// `WeakMap.from` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from\n$({ target: 'WeakMap', stat: true, forced: true }, {\n from: createCollectionFrom(WeakMapHelpers.WeakMap, WeakMapHelpers.set, true)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar WeakMapHelpers = require('../internals/weak-map-helpers');\nvar createCollectionOf = require('../internals/collection-of');\n\n// `WeakMap.of` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of\n$({ target: 'WeakMap', stat: true, forced: true }, {\n of: createCollectionOf(WeakMapHelpers.WeakMap, WeakMapHelpers.set, true)\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-weak-set -- safe\nvar WeakSetPrototype = WeakSet.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-weak-set -- safe\n WeakSet: WeakSet,\n add: uncurryThis(WeakSetPrototype.add),\n has: uncurryThis(WeakSetPrototype.has),\n remove: uncurryThis(WeakSetPrototype['delete'])\n};\n","'use strict';\nvar has = require('../internals/weak-set-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[WeakSetData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar aWeakSet = require('../internals/a-weak-set');\nvar add = require('../internals/weak-set-helpers').add;\n\n// `WeakSet.prototype.addAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'WeakSet', proto: true, real: true, forced: true }, {\n addAll: function addAll(/* ...elements */) {\n var set = aWeakSet(this);\n for (var k = 0, len = arguments.length; k < len; k++) {\n add(set, arguments[k]);\n } return set;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aWeakSet = require('../internals/a-weak-set');\nvar remove = require('../internals/weak-set-helpers').remove;\n\n// `WeakSet.prototype.deleteAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'WeakSet', proto: true, real: true, forced: true }, {\n deleteAll: function deleteAll(/* ...elements */) {\n var collection = aWeakSet(this);\n var allDeleted = true;\n var wasDeleted;\n for (var k = 0, len = arguments.length; k < len; k++) {\n wasDeleted = remove(collection, arguments[k]);\n allDeleted = allDeleted && wasDeleted;\n } return !!allDeleted;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar WeakSetHelpers = require('../internals/weak-set-helpers');\nvar createCollectionFrom = require('../internals/collection-from');\n\n// `WeakSet.from` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from\n$({ target: 'WeakSet', stat: true, forced: true }, {\n from: createCollectionFrom(WeakSetHelpers.WeakSet, WeakSetHelpers.add, false)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar WeakSetHelpers = require('../internals/weak-set-helpers');\nvar createCollectionOf = require('../internals/collection-of');\n\n// `WeakSet.of` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of\n$({ target: 'WeakSet', stat: true, forced: true }, {\n of: createCollectionOf(WeakSetHelpers.WeakSet, WeakSetHelpers.add, false)\n});\n","'use strict';\n// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","'use strict';\n// in old WebKit versions, `element.classList` is not an instance of global `DOMTokenList`\nvar documentCreateElement = require('../internals/document-create-element');\n\nvar classList = documentCreateElement('span').classList;\nvar DOMTokenListPrototype = classList && classList.constructor && classList.constructor.prototype;\n\nmodule.exports = DOMTokenListPrototype === Object.prototype ? undefined : DOMTokenListPrototype;\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineProperty = require('../internals/object-define-property').f;\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.es/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.es/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.es/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.es/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = null;\n return createIterResultObject(undefined, true);\n }\n switch (state.kind) {\n case 'keys': return createIterResultObject(index, false);\n case 'values': return createIterResultObject(target[index], false);\n } return createIterResultObject([index, target[index]], false);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.es/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.es/ecma262/#sec-createmappedargumentsobject\nvar values = Iterators.Arguments = Iterators.Array;\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n// V8 ~ Chrome 45- bug\nif (!IS_PURE && DESCRIPTORS && values.name !== 'values') try {\n defineProperty(values, 'name', { value: 'values' });\n} catch (error) { /* empty */ }\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar DOMIterables = require('../internals/dom-iterables');\nvar DOMTokenListPrototype = require('../internals/dom-token-list-prototype');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nvar handlePrototype = function (CollectionPrototype, COLLECTION_NAME) {\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n setToStringTag(CollectionPrototype, COLLECTION_NAME, true);\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n};\n\nfor (var COLLECTION_NAME in DOMIterables) {\n handlePrototype(globalThis[COLLECTION_NAME] && globalThis[COLLECTION_NAME].prototype, COLLECTION_NAME);\n}\n\nhandlePrototype(DOMTokenListPrototype, 'DOMTokenList');\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar clearImmediate = require('../internals/task').clear;\n\n// `clearImmediate` method\n// http://w3c.github.io/setImmediate/#si-clearImmediate\n$({ global: true, bind: true, enumerable: true, forced: globalThis.clearImmediate !== clearImmediate }, {\n clearImmediate: clearImmediate\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar apply = require('../internals/function-apply');\nvar isCallable = require('../internals/is-callable');\nvar ENVIRONMENT = require('../internals/environment');\nvar USER_AGENT = require('../internals/environment-user-agent');\nvar arraySlice = require('../internals/array-slice');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\n\nvar Function = globalThis.Function;\n// dirty IE9- and Bun 0.3.0- checks\nvar WRAP = /MSIE .\\./.test(USER_AGENT) || ENVIRONMENT === 'BUN' && (function () {\n var version = globalThis.Bun.version.split('.');\n return version.length < 3 || version[0] === '0' && (version[1] < 3 || version[1] === '3' && version[2] === '0');\n})();\n\n// IE9- / Bun 0.3.0- setTimeout / setInterval / setImmediate additional parameters fix\n// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers\n// https://github.com/oven-sh/bun/issues/1633\nmodule.exports = function (scheduler, hasTimeArg) {\n var firstParamIndex = hasTimeArg ? 2 : 1;\n return WRAP ? function (handler, timeout /* , ...arguments */) {\n var boundArgs = validateArgumentsLength(arguments.length, 1) > firstParamIndex;\n var fn = isCallable(handler) ? handler : Function(handler);\n var params = boundArgs ? arraySlice(arguments, firstParamIndex) : [];\n var callback = boundArgs ? function () {\n apply(fn, this, params);\n } : fn;\n return hasTimeArg ? scheduler(callback, timeout) : scheduler(callback);\n } : scheduler;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar setTask = require('../internals/task').set;\nvar schedulersFix = require('../internals/schedulers-fix');\n\n// https://github.com/oven-sh/bun/issues/1633\nvar setImmediate = globalThis.setImmediate ? schedulersFix(setTask, false) : setTask;\n\n// `setImmediate` method\n// http://w3c.github.io/setImmediate/#si-setImmediate\n$({ global: true, bind: true, enumerable: true, forced: globalThis.setImmediate !== setImmediate }, {\n setImmediate: setImmediate\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar microtask = require('../internals/microtask');\nvar aCallable = require('../internals/a-callable');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar fails = require('../internals/fails');\nvar DESCRIPTORS = require('../internals/descriptors');\n\n// Bun ~ 1.0.30 bug\n// https://github.com/oven-sh/bun/issues/9249\nvar WRONG_ARITY = fails(function () {\n // getOwnPropertyDescriptor for prevent experimental warning in Node 11\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n return DESCRIPTORS && Object.getOwnPropertyDescriptor(globalThis, 'queueMicrotask').value.length !== 1;\n});\n\n// `queueMicrotask` method\n// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-queuemicrotask\n$({ global: true, enumerable: true, dontCallGetSet: true, forced: WRONG_ARITY }, {\n queueMicrotask: function queueMicrotask(fn) {\n validateArgumentsLength(arguments.length, 1);\n microtask(aCallable(fn));\n }\n});\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar toString = require('../internals/to-string');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: toString(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return createIterResultObject(undefined, true);\n point = charAt(string, index);\n state.index += point.length;\n return createIterResultObject(point, false);\n});\n","'use strict';\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line unicorn/relative-url-style -- required for testing\n var url = new URL('b?a=1&b=2&c=3', 'https://a');\n var params = url.searchParams;\n var params2 = new URLSearchParams('a=1&a=2&b=3');\n var result = '';\n url.pathname = 'c%20d';\n params.forEach(function (value, key) {\n params['delete']('b');\n result += key + value;\n });\n params2['delete']('a', 2);\n // `undefined` case is a Chromium 117 bug\n // https://bugs.chromium.org/p/v8/issues/detail?id=14222\n params2['delete']('b', undefined);\n return (IS_PURE && (!url.toJSON || !params2.has('a', 1) || params2.has('a', 2) || !params2.has('a', undefined) || params2.has('b')))\n || (!params.size && (IS_PURE || !DESCRIPTORS))\n || !params.sort\n || url.href !== 'https://a/c%20d?a=1&c=3'\n || params.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !params[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('https://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('https://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('https://x', undefined).host !== 'x';\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar call = require('../internals/function-call');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\n// eslint-disable-next-line es/no-object-assign -- safe\nvar $assign = Object.assign;\n// eslint-disable-next-line es/no-object-defineproperty -- required for testing\nvar defineProperty = Object.defineProperty;\nvar concat = uncurryThis([].concat);\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\nmodule.exports = !$assign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && $assign({ b: 1 }, $assign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line es/no-symbol -- safe\n var symbol = Symbol('assign detection');\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n // eslint-disable-next-line es/no-array-prototype-foreach -- safe\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return $assign({}, A)[symbol] !== 7 || objectKeys($assign({}, B)).join('') !== alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? concat(objectKeys(S), getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || call(propertyIsEnumerable, S, key)) T[key] = S[key];\n }\n } return T;\n} : $assign;\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar iteratorClose = require('../internals/iterator-close');\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar isConstructor = require('../internals/is-constructor');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar createProperty = require('../internals/create-property');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar $Array = Array;\n\n// `Array.from` method implementation\n// https://tc39.es/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var IS_CONSTRUCTOR = isConstructor(this);\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined);\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod && !(this === $Array && isArrayIteratorMethod(iteratorMethod))) {\n result = IS_CONSTRUCTOR ? new this() : [];\n iterator = getIterator(O, iteratorMethod);\n next = iterator.next;\n for (;!(step = call(next, iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = lengthOfArrayLike(O);\n result = IS_CONSTRUCTOR ? new this(length) : $Array(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\n\nvar $RangeError = RangeError;\nvar exec = uncurryThis(regexSeparators.exec);\nvar floor = Math.floor;\nvar fromCharCode = String.fromCharCode;\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar join = uncurryThis([].join);\nvar push = uncurryThis([].push);\nvar replace = uncurryThis(''.replace);\nvar split = uncurryThis(''.split);\nvar toLowerCase = uncurryThis(''.toLowerCase);\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = charCodeAt(string, counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = charCodeAt(string, counter++);\n if ((extra & 0xFC00) === 0xDC00) { // Low surrogate.\n push(output, ((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n push(output, value);\n counter--;\n }\n } else {\n push(output, value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n while (delta > baseMinusTMin * tMax >> 1) {\n delta = floor(delta / baseMinusTMin);\n k += base;\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n push(output, fromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n push(output, delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's state to , but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw new $RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw new $RangeError(OVERFLOW_ERROR);\n }\n if (currentValue === n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n var k = base;\n while (true) {\n var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n push(output, fromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n k += base;\n }\n\n push(output, fromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);\n delta = 0;\n handledCPCount++;\n }\n }\n\n delta++;\n n++;\n }\n return join(output, '');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = split(replace(toLowerCase(input), regexSeparators, '\\u002E'), '.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n push(encoded, exec(regexNonASCII, label) ? 'xn--' + encode(label) : label);\n }\n return join(encoded, '.');\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\nvar $RangeError = RangeError;\nvar fromCharCode = String.fromCharCode;\n// eslint-disable-next-line es/no-string-fromcodepoint -- required for testing\nvar $fromCodePoint = String.fromCodePoint;\nvar join = uncurryThis([].join);\n\n// length should be 1, old FF problem\nvar INCORRECT_LENGTH = !!$fromCodePoint && $fromCodePoint.length !== 1;\n\n// `String.fromCodePoint` method\n// https://tc39.es/ecma262/#sec-string.fromcodepoint\n$({ target: 'String', stat: true, arity: 1, forced: INCORRECT_LENGTH }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n fromCodePoint: function fromCodePoint(x) {\n var elements = [];\n var length = arguments.length;\n var i = 0;\n var code;\n while (length > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10FFFF) !== code) throw new $RangeError(code + ' is not a valid code point');\n elements[i] = code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xD800, code % 0x400 + 0xDC00);\n } return join(elements, '');\n }\n});\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nrequire('../modules/es.string.from-code-point');\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar safeGetBuiltIn = require('../internals/safe-get-built-in');\nvar getBuiltIn = require('../internals/get-built-in');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/url-constructor-detection');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar $toString = require('../internals/to-string');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arraySort = require('../internals/array-sort');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar nativeFetch = safeGetBuiltIn('fetch');\nvar NativeRequest = safeGetBuiltIn('Request');\nvar Headers = safeGetBuiltIn('Headers');\nvar RequestPrototype = NativeRequest && NativeRequest.prototype;\nvar HeadersPrototype = Headers && Headers.prototype;\nvar TypeError = globalThis.TypeError;\nvar encodeURIComponent = globalThis.encodeURIComponent;\nvar fromCharCode = String.fromCharCode;\nvar fromCodePoint = getBuiltIn('String', 'fromCodePoint');\nvar $parseInt = parseInt;\nvar charAt = uncurryThis(''.charAt);\nvar join = uncurryThis([].join);\nvar push = uncurryThis([].push);\nvar replace = uncurryThis(''.replace);\nvar shift = uncurryThis([].shift);\nvar splice = uncurryThis([].splice);\nvar split = uncurryThis(''.split);\nvar stringSlice = uncurryThis(''.slice);\nvar exec = uncurryThis(/./.exec);\n\nvar plus = /\\+/g;\nvar FALLBACK_REPLACER = '\\uFFFD';\nvar VALID_HEX = /^[0-9a-f]+$/i;\n\nvar parseHexOctet = function (string, start) {\n var substr = stringSlice(string, start, start + 2);\n if (!exec(VALID_HEX, substr)) return NaN;\n\n return $parseInt(substr, 16);\n};\n\nvar getLeadingOnes = function (octet) {\n var count = 0;\n for (var mask = 0x80; mask > 0 && (octet & mask) !== 0; mask >>= 1) {\n count++;\n }\n return count;\n};\n\nvar utf8Decode = function (octets) {\n var codePoint = null;\n\n switch (octets.length) {\n case 1:\n codePoint = octets[0];\n break;\n case 2:\n codePoint = (octets[0] & 0x1F) << 6 | (octets[1] & 0x3F);\n break;\n case 3:\n codePoint = (octets[0] & 0x0F) << 12 | (octets[1] & 0x3F) << 6 | (octets[2] & 0x3F);\n break;\n case 4:\n codePoint = (octets[0] & 0x07) << 18 | (octets[1] & 0x3F) << 12 | (octets[2] & 0x3F) << 6 | (octets[3] & 0x3F);\n break;\n }\n\n return codePoint > 0x10FFFF ? null : codePoint;\n};\n\nvar decode = function (input) {\n input = replace(input, plus, ' ');\n var length = input.length;\n var result = '';\n var i = 0;\n\n while (i < length) {\n var decodedChar = charAt(input, i);\n\n if (decodedChar === '%') {\n if (charAt(input, i + 1) === '%' || i + 3 > length) {\n result += '%';\n i++;\n continue;\n }\n\n var octet = parseHexOctet(input, i + 1);\n\n // eslint-disable-next-line no-self-compare -- NaN check\n if (octet !== octet) {\n result += decodedChar;\n i++;\n continue;\n }\n\n i += 2;\n var byteSequenceLength = getLeadingOnes(octet);\n\n if (byteSequenceLength === 0) {\n decodedChar = fromCharCode(octet);\n } else {\n if (byteSequenceLength === 1 || byteSequenceLength > 4) {\n result += FALLBACK_REPLACER;\n i++;\n continue;\n }\n\n var octets = [octet];\n var sequenceIndex = 1;\n\n while (sequenceIndex < byteSequenceLength) {\n i++;\n if (i + 3 > length || charAt(input, i) !== '%') break;\n\n var nextByte = parseHexOctet(input, i + 1);\n\n // eslint-disable-next-line no-self-compare -- NaN check\n if (nextByte !== nextByte) {\n i += 3;\n break;\n }\n if (nextByte > 191 || nextByte < 128) break;\n\n push(octets, nextByte);\n i += 2;\n sequenceIndex++;\n }\n\n if (octets.length !== byteSequenceLength) {\n result += FALLBACK_REPLACER;\n continue;\n }\n\n var codePoint = utf8Decode(octets);\n if (codePoint === null) {\n result += FALLBACK_REPLACER;\n } else {\n decodedChar = fromCodePoint(codePoint);\n }\n }\n }\n\n result += decodedChar;\n i++;\n }\n\n return result;\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replacements = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replacements[match];\n};\n\nvar serialize = function (it) {\n return replace(encodeURIComponent(it), find, replacer);\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n target: getInternalParamsState(params).entries,\n index: 0,\n kind: kind\n });\n}, URL_SEARCH_PARAMS, function next() {\n var state = getInternalIteratorState(this);\n var target = state.target;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = null;\n return createIterResultObject(undefined, true);\n }\n var entry = target[index];\n switch (state.kind) {\n case 'keys': return createIterResultObject(entry.key, false);\n case 'values': return createIterResultObject(entry.value, false);\n } return createIterResultObject([entry.key, entry.value], false);\n}, true);\n\nvar URLSearchParamsState = function (init) {\n this.entries = [];\n this.url = null;\n\n if (init !== undefined) {\n if (isObject(init)) this.parseObject(init);\n else this.parseQuery(typeof init == 'string' ? charAt(init, 0) === '?' ? stringSlice(init, 1) : init : $toString(init));\n }\n};\n\nURLSearchParamsState.prototype = {\n type: URL_SEARCH_PARAMS,\n bindURL: function (url) {\n this.url = url;\n this.update();\n },\n parseObject: function (object) {\n var entries = this.entries;\n var iteratorMethod = getIteratorMethod(object);\n var iterator, next, step, entryIterator, entryNext, first, second;\n\n if (iteratorMethod) {\n iterator = getIterator(object, iteratorMethod);\n next = iterator.next;\n while (!(step = call(next, iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = call(entryNext, entryIterator)).done ||\n (second = call(entryNext, entryIterator)).done ||\n !call(entryNext, entryIterator).done\n ) throw new TypeError('Expected sequence with length 2');\n push(entries, { key: $toString(first.value), value: $toString(second.value) });\n }\n } else for (var key in object) if (hasOwn(object, key)) {\n push(entries, { key: key, value: $toString(object[key]) });\n }\n },\n parseQuery: function (query) {\n if (query) {\n var entries = this.entries;\n var attributes = split(query, '&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = split(attribute, '=');\n push(entries, {\n key: decode(shift(entry)),\n value: decode(join(entry, '='))\n });\n }\n }\n }\n },\n serialize: function () {\n var entries = this.entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n push(result, serialize(entry.key) + '=' + serialize(entry.value));\n } return join(result, '&');\n },\n update: function () {\n this.entries.length = 0;\n this.parseQuery(this.url.query);\n },\n updateURL: function () {\n if (this.url) this.url.update();\n }\n};\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsPrototype);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var state = setInternalState(this, new URLSearchParamsState(init));\n if (!DESCRIPTORS) this.size = state.entries.length;\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\ndefineBuiltIns(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n var state = getInternalParamsState(this);\n validateArgumentsLength(arguments.length, 2);\n push(state.entries, { key: $toString(name), value: $toString(value) });\n if (!DESCRIPTORS) this.length++;\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name /* , value */) {\n var state = getInternalParamsState(this);\n var length = validateArgumentsLength(arguments.length, 1);\n var entries = state.entries;\n var key = $toString(name);\n var $value = length < 2 ? undefined : arguments[1];\n var value = $value === undefined ? $value : $toString($value);\n var index = 0;\n while (index < entries.length) {\n var entry = entries[index];\n if (entry.key === key && (value === undefined || entry.value === value)) {\n splice(entries, index, 1);\n if (value !== undefined) break;\n } else index++;\n }\n if (!DESCRIPTORS) this.size = entries.length;\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n var entries = getInternalParamsState(this).entries;\n validateArgumentsLength(arguments.length, 1);\n var key = $toString(name);\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n var entries = getInternalParamsState(this).entries;\n validateArgumentsLength(arguments.length, 1);\n var key = $toString(name);\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) push(result, entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name /* , value */) {\n var entries = getInternalParamsState(this).entries;\n var length = validateArgumentsLength(arguments.length, 1);\n var key = $toString(name);\n var $value = length < 2 ? undefined : arguments[1];\n var value = $value === undefined ? $value : $toString($value);\n var index = 0;\n while (index < entries.length) {\n var entry = entries[index++];\n if (entry.key === key && (value === undefined || entry.value === value)) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n var state = getInternalParamsState(this);\n validateArgumentsLength(arguments.length, 1);\n var entries = state.entries;\n var found = false;\n var key = $toString(name);\n var val = $toString(value);\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) splice(entries, index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) push(entries, { key: key, value: val });\n if (!DESCRIPTORS) this.size = entries.length;\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n arraySort(state.entries, function (a, b) {\n return a.key > b.key ? 1 : -1;\n });\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\ndefineBuiltIn(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries, { name: 'entries' });\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\ndefineBuiltIn(URLSearchParamsPrototype, 'toString', function toString() {\n return getInternalParamsState(this).serialize();\n}, { enumerable: true });\n\n// `URLSearchParams.prototype.size` getter\n// https://github.com/whatwg/url/pull/734\nif (DESCRIPTORS) defineBuiltInAccessor(URLSearchParamsPrototype, 'size', {\n get: function size() {\n return getInternalParamsState(this).entries.length;\n },\n configurable: true,\n enumerable: true\n});\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, constructor: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` and `Request` for correct work with polyfilled `URLSearchParams`\nif (!USE_NATIVE_URL && isCallable(Headers)) {\n var headersHas = uncurryThis(HeadersPrototype.has);\n var headersSet = uncurryThis(HeadersPrototype.set);\n\n var wrapRequestOptions = function (init) {\n if (isObject(init)) {\n var body = init.body;\n var headers;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headersHas(headers, 'content-type')) {\n headersSet(headers, 'content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n return create(init, {\n body: createPropertyDescriptor(0, $toString(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n } return init;\n };\n\n if (isCallable(nativeFetch)) {\n $({ global: true, enumerable: true, dontCallGetSet: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n return nativeFetch(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});\n }\n });\n }\n\n if (isCallable(NativeRequest)) {\n var RequestConstructor = function Request(input /* , init */) {\n anInstance(this, RequestPrototype);\n return new NativeRequest(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});\n };\n\n RequestPrototype.constructor = RequestConstructor;\n RequestConstructor.prototype = RequestPrototype;\n\n $({ global: true, constructor: true, dontCallGetSet: true, forced: true }, {\n Request: RequestConstructor\n });\n }\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/url-constructor-detection');\nvar globalThis = require('../internals/global-this');\nvar bind = require('../internals/function-bind-context');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has-own-property');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar arraySlice = require('../internals/array-slice');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/string-punycode-to-ascii');\nvar $toString = require('../internals/to-string');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar URLSearchParamsModule = require('../modules/web.url-search-params.constructor');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\n\nvar NativeURL = globalThis.URL;\nvar TypeError = globalThis.TypeError;\nvar parseInt = globalThis.parseInt;\nvar floor = Math.floor;\nvar pow = Math.pow;\nvar charAt = uncurryThis(''.charAt);\nvar exec = uncurryThis(/./.exec);\nvar join = uncurryThis([].join);\nvar numberToString = uncurryThis(1.0.toString);\nvar pop = uncurryThis([].pop);\nvar push = uncurryThis([].push);\nvar replace = uncurryThis(''.replace);\nvar shift = uncurryThis([].shift);\nvar split = uncurryThis(''.split);\nvar stringSlice = uncurryThis(''.slice);\nvar toLowerCase = uncurryThis(''.toLowerCase);\nvar unshift = uncurryThis([].unshift);\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[a-z]/i;\n// eslint-disable-next-line regexp/no-obscure-range -- safe\nvar ALPHANUMERIC = /[\\d+-.a-z]/i;\nvar DIGIT = /\\d/;\nvar HEX_START = /^0x/i;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\da-f]+$/i;\n/* eslint-disable regexp/no-control-character -- safe */\nvar FORBIDDEN_HOST_CODE_POINT = /[\\0\\t\\n\\r #%/:<>?@[\\\\\\]^|]/;\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\0\\t\\n\\r #/:<>?@[\\\\\\]^|]/;\nvar LEADING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u0020]+/;\nvar TRAILING_C0_CONTROL_OR_SPACE = /(^|[^\\u0000-\\u0020])[\\u0000-\\u0020]+$/;\nvar TAB_AND_NEW_LINE = /[\\t\\n\\r]/g;\n/* eslint-enable regexp/no-control-character -- safe */\nvar EOF;\n\n// https://url.spec.whatwg.org/#ipv4-number-parser\nvar parseIPv4 = function (input) {\n var parts = split(input, '.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] === '') {\n parts.length--;\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part === '') return input;\n radix = 10;\n if (part.length > 1 && charAt(part, 0) === '0') {\n radix = exec(HEX_START, part) ? 16 : 8;\n part = stringSlice(part, radix === 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!exec(radix === 10 ? DEC : radix === 8 ? OCT : HEX, part)) return input;\n number = parseInt(part, radix);\n }\n push(numbers, number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index === partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = pop(numbers);\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// https://url.spec.whatwg.org/#concept-ipv6-parser\n// eslint-disable-next-line max-statements -- TODO\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var chr = function () {\n return charAt(input, pointer);\n };\n\n if (chr() === ':') {\n if (charAt(input, 1) !== ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (chr()) {\n if (pieceIndex === 8) return;\n if (chr() === ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && exec(HEX, chr())) {\n value = value * 16 + parseInt(chr(), 16);\n pointer++;\n length++;\n }\n if (chr() === '.') {\n if (length === 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (chr()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (chr() === '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!exec(DIGIT, chr())) return;\n while (exec(DIGIT, chr())) {\n number = parseInt(chr(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece === 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen === 2 || numbersSeen === 4) pieceIndex++;\n }\n if (numbersSeen !== 4) return;\n break;\n } else if (chr() === ':') {\n pointer++;\n if (!chr()) return;\n } else if (chr()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex !== 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex !== 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n return currLength > maxLength ? currStart : maxIndex;\n};\n\n// https://url.spec.whatwg.org/#host-serializing\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n unshift(result, host % 256);\n host = floor(host / 256);\n }\n return join(result, '.');\n }\n\n // ipv6\n if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += numberToString(host[index], 16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n }\n\n return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (chr, set) {\n var code = codeAt(chr, 0);\n return code > 0x20 && code < 0x7F && !hasOwn(set, chr) ? chr : encodeURIComponent(chr);\n};\n\n// https://url.spec.whatwg.org/#special-scheme\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\n// https://url.spec.whatwg.org/#windows-drive-letter\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length === 2 && exec(ALPHA, charAt(string, 0))\n && ((second = charAt(string, 1)) === ':' || (!normalized && second === '|'));\n};\n\n// https://url.spec.whatwg.org/#start-with-a-windows-drive-letter\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(stringSlice(string, 0, 2)) && (\n string.length === 2 ||\n ((third = charAt(string, 2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\n// https://url.spec.whatwg.org/#single-dot-path-segment\nvar isSingleDot = function (segment) {\n return segment === '.' || toLowerCase(segment) === '%2e';\n};\n\n// https://url.spec.whatwg.org/#double-dot-path-segment\nvar isDoubleDot = function (segment) {\n segment = toLowerCase(segment);\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\nvar URLState = function (url, isBase, base) {\n var urlString = $toString(url);\n var baseState, failure, searchParams;\n if (isBase) {\n failure = this.parse(urlString);\n if (failure) throw new TypeError(failure);\n this.searchParams = null;\n } else {\n if (base !== undefined) baseState = new URLState(base, true);\n failure = this.parse(urlString, null, baseState);\n if (failure) throw new TypeError(failure);\n searchParams = getInternalSearchParamsState(new URLSearchParams());\n searchParams.bindURL(this);\n this.searchParams = searchParams;\n }\n};\n\nURLState.prototype = {\n type: 'URL',\n // https://url.spec.whatwg.org/#url-parsing\n // eslint-disable-next-line max-statements -- TODO\n parse: function (input, stateOverride, base) {\n var url = this;\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, chr, bufferCodePoints, failure;\n\n input = $toString(input);\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = replace(input, LEADING_C0_CONTROL_OR_SPACE, '');\n input = replace(input, TRAILING_C0_CONTROL_OR_SPACE, '$1');\n }\n\n input = replace(input, TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n chr = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (chr && exec(ALPHA, chr)) {\n buffer += toLowerCase(chr);\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (chr && (exec(ALPHANUMERIC, chr) || chr === '+' || chr === '-' || chr === '.')) {\n buffer += toLowerCase(chr);\n } else if (chr === ':') {\n if (stateOverride && (\n (url.isSpecial() !== hasOwn(specialSchemes, buffer)) ||\n (buffer === 'file' && (url.includesCredentials() || url.port !== null)) ||\n (url.scheme === 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (url.isSpecial() && specialSchemes[url.scheme] === url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme === 'file') {\n state = FILE;\n } else if (url.isSpecial() && base && base.scheme === url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (url.isSpecial()) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] === '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n push(url.path, '');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && chr !== '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && chr === '#') {\n url.scheme = base.scheme;\n url.path = arraySlice(base.path);\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme === 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (chr === '/' && codePoints[pointer + 1] === '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (chr === '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (chr === EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.query = base.query;\n } else if (chr === '/' || (chr === '\\\\' && url.isSpecial())) {\n state = RELATIVE_SLASH;\n } else if (chr === '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.query = '';\n state = QUERY;\n } else if (chr === '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.path.length--;\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (url.isSpecial() && (chr === '/' || chr === '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (chr === '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (chr !== '/' || charAt(buffer, pointer + 1) !== '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (chr !== '/' && chr !== '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (chr === '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint === ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n chr === EOF || chr === '/' || chr === '?' || chr === '#' ||\n (chr === '\\\\' && url.isSpecial())\n ) {\n if (seenAt && buffer === '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += chr;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme === 'file') {\n state = FILE_HOST;\n continue;\n } else if (chr === ':' && !seenBracket) {\n if (buffer === '') return INVALID_HOST;\n failure = url.parseHost(buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride === HOSTNAME) return;\n } else if (\n chr === EOF || chr === '/' || chr === '?' || chr === '#' ||\n (chr === '\\\\' && url.isSpecial())\n ) {\n if (url.isSpecial() && buffer === '') return INVALID_HOST;\n if (stateOverride && buffer === '' && (url.includesCredentials() || url.port !== null)) return;\n failure = url.parseHost(buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (chr === '[') seenBracket = true;\n else if (chr === ']') seenBracket = false;\n buffer += chr;\n } break;\n\n case PORT:\n if (exec(DIGIT, chr)) {\n buffer += chr;\n } else if (\n chr === EOF || chr === '/' || chr === '?' || chr === '#' ||\n (chr === '\\\\' && url.isSpecial()) ||\n stateOverride\n ) {\n if (buffer !== '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (url.isSpecial() && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (chr === '/' || chr === '\\\\') state = FILE_SLASH;\n else if (base && base.scheme === 'file') {\n switch (chr) {\n case EOF:\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.query = base.query;\n break;\n case '?':\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.query = '';\n state = QUERY;\n break;\n case '#':\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n break;\n default:\n if (!startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.shortenPath();\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (chr === '/' || chr === '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme === 'file' && !startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {\n if (isWindowsDriveLetter(base.path[0], true)) push(url.path, base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (chr === EOF || chr === '/' || chr === '\\\\' || chr === '?' || chr === '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer === '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = url.parseHost(buffer);\n if (failure) return failure;\n if (url.host === 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += chr;\n break;\n\n case PATH_START:\n if (url.isSpecial()) {\n state = PATH;\n if (chr !== '/' && chr !== '\\\\') continue;\n } else if (!stateOverride && chr === '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && chr === '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (chr !== EOF) {\n state = PATH;\n if (chr !== '/') continue;\n } break;\n\n case PATH:\n if (\n chr === EOF || chr === '/' ||\n (chr === '\\\\' && url.isSpecial()) ||\n (!stateOverride && (chr === '?' || chr === '#'))\n ) {\n if (isDoubleDot(buffer)) {\n url.shortenPath();\n if (chr !== '/' && !(chr === '\\\\' && url.isSpecial())) {\n push(url.path, '');\n }\n } else if (isSingleDot(buffer)) {\n if (chr !== '/' && !(chr === '\\\\' && url.isSpecial())) {\n push(url.path, '');\n }\n } else {\n if (url.scheme === 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = charAt(buffer, 0) + ':'; // normalize windows drive letter\n }\n push(url.path, buffer);\n }\n buffer = '';\n if (url.scheme === 'file' && (chr === EOF || chr === '?' || chr === '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n shift(url.path);\n }\n }\n if (chr === '?') {\n url.query = '';\n state = QUERY;\n } else if (chr === '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(chr, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (chr === '?') {\n url.query = '';\n state = QUERY;\n } else if (chr === '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (chr !== EOF) {\n url.path[0] += percentEncode(chr, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && chr === '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (chr !== EOF) {\n if (chr === \"'\" && url.isSpecial()) url.query += '%27';\n else if (chr === '#') url.query += '%23';\n else url.query += percentEncode(chr, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (chr !== EOF) url.fragment += percentEncode(chr, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n },\n // https://url.spec.whatwg.org/#host-parsing\n parseHost: function (input) {\n var result, codePoints, index;\n if (charAt(input, 0) === '[') {\n if (charAt(input, input.length - 1) !== ']') return INVALID_HOST;\n result = parseIPv6(stringSlice(input, 1, -1));\n if (!result) return INVALID_HOST;\n this.host = result;\n // opaque host\n } else if (!this.isSpecial()) {\n if (exec(FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT, input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n this.host = result;\n } else {\n input = toASCII(input);\n if (exec(FORBIDDEN_HOST_CODE_POINT, input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n this.host = result;\n }\n },\n // https://url.spec.whatwg.org/#cannot-have-a-username-password-port\n cannotHaveUsernamePasswordPort: function () {\n return !this.host || this.cannotBeABaseURL || this.scheme === 'file';\n },\n // https://url.spec.whatwg.org/#include-credentials\n includesCredentials: function () {\n return this.username !== '' || this.password !== '';\n },\n // https://url.spec.whatwg.org/#is-special\n isSpecial: function () {\n return hasOwn(specialSchemes, this.scheme);\n },\n // https://url.spec.whatwg.org/#shorten-a-urls-path\n shortenPath: function () {\n var path = this.path;\n var pathSize = path.length;\n if (pathSize && (this.scheme !== 'file' || pathSize !== 1 || !isWindowsDriveLetter(path[0], true))) {\n path.length--;\n }\n },\n // https://url.spec.whatwg.org/#concept-url-serializer\n serialize: function () {\n var url = this;\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (url.includesCredentials()) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme === 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n },\n // https://url.spec.whatwg.org/#dom-url-href\n setHref: function (href) {\n var failure = this.parse(href);\n if (failure) throw new TypeError(failure);\n this.searchParams.update();\n },\n // https://url.spec.whatwg.org/#dom-url-origin\n getOrigin: function () {\n var scheme = this.scheme;\n var port = this.port;\n if (scheme === 'blob') try {\n return new URLConstructor(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme === 'file' || !this.isSpecial()) return 'null';\n return scheme + '://' + serializeHost(this.host) + (port !== null ? ':' + port : '');\n },\n // https://url.spec.whatwg.org/#dom-url-protocol\n getProtocol: function () {\n return this.scheme + ':';\n },\n setProtocol: function (protocol) {\n this.parse($toString(protocol) + ':', SCHEME_START);\n },\n // https://url.spec.whatwg.org/#dom-url-username\n getUsername: function () {\n return this.username;\n },\n setUsername: function (username) {\n var codePoints = arrayFrom($toString(username));\n if (this.cannotHaveUsernamePasswordPort()) return;\n this.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n this.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n },\n // https://url.spec.whatwg.org/#dom-url-password\n getPassword: function () {\n return this.password;\n },\n setPassword: function (password) {\n var codePoints = arrayFrom($toString(password));\n if (this.cannotHaveUsernamePasswordPort()) return;\n this.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n this.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n },\n // https://url.spec.whatwg.org/#dom-url-host\n getHost: function () {\n var host = this.host;\n var port = this.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n },\n setHost: function (host) {\n if (this.cannotBeABaseURL) return;\n this.parse(host, HOST);\n },\n // https://url.spec.whatwg.org/#dom-url-hostname\n getHostname: function () {\n var host = this.host;\n return host === null ? '' : serializeHost(host);\n },\n setHostname: function (hostname) {\n if (this.cannotBeABaseURL) return;\n this.parse(hostname, HOSTNAME);\n },\n // https://url.spec.whatwg.org/#dom-url-port\n getPort: function () {\n var port = this.port;\n return port === null ? '' : $toString(port);\n },\n setPort: function (port) {\n if (this.cannotHaveUsernamePasswordPort()) return;\n port = $toString(port);\n if (port === '') this.port = null;\n else this.parse(port, PORT);\n },\n // https://url.spec.whatwg.org/#dom-url-pathname\n getPathname: function () {\n var path = this.path;\n return this.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';\n },\n setPathname: function (pathname) {\n if (this.cannotBeABaseURL) return;\n this.path = [];\n this.parse(pathname, PATH_START);\n },\n // https://url.spec.whatwg.org/#dom-url-search\n getSearch: function () {\n var query = this.query;\n return query ? '?' + query : '';\n },\n setSearch: function (search) {\n search = $toString(search);\n if (search === '') {\n this.query = null;\n } else {\n if (charAt(search, 0) === '?') search = stringSlice(search, 1);\n this.query = '';\n this.parse(search, QUERY);\n }\n this.searchParams.update();\n },\n // https://url.spec.whatwg.org/#dom-url-searchparams\n getSearchParams: function () {\n return this.searchParams.facade;\n },\n // https://url.spec.whatwg.org/#dom-url-hash\n getHash: function () {\n var fragment = this.fragment;\n return fragment ? '#' + fragment : '';\n },\n setHash: function (hash) {\n hash = $toString(hash);\n if (hash === '') {\n this.fragment = null;\n return;\n }\n if (charAt(hash, 0) === '#') hash = stringSlice(hash, 1);\n this.fragment = '';\n this.parse(hash, FRAGMENT);\n },\n update: function () {\n this.query = this.searchParams.serialize() || null;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLPrototype);\n var base = validateArgumentsLength(arguments.length, 1) > 1 ? arguments[1] : undefined;\n var state = setInternalState(that, new URLState(url, false, base));\n if (!DESCRIPTORS) {\n that.href = state.serialize();\n that.origin = state.getOrigin();\n that.protocol = state.getProtocol();\n that.username = state.getUsername();\n that.password = state.getPassword();\n that.host = state.getHost();\n that.hostname = state.getHostname();\n that.port = state.getPort();\n that.pathname = state.getPathname();\n that.search = state.getSearch();\n that.searchParams = state.getSearchParams();\n that.hash = state.getHash();\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar accessorDescriptor = function (getter, setter) {\n return {\n get: function () {\n return getInternalURLState(this)[getter]();\n },\n set: setter && function (value) {\n return getInternalURLState(this)[setter](value);\n },\n configurable: true,\n enumerable: true\n };\n};\n\nif (DESCRIPTORS) {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n defineBuiltInAccessor(URLPrototype, 'href', accessorDescriptor('serialize', 'setHref'));\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n defineBuiltInAccessor(URLPrototype, 'origin', accessorDescriptor('getOrigin'));\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n defineBuiltInAccessor(URLPrototype, 'protocol', accessorDescriptor('getProtocol', 'setProtocol'));\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n defineBuiltInAccessor(URLPrototype, 'username', accessorDescriptor('getUsername', 'setUsername'));\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n defineBuiltInAccessor(URLPrototype, 'password', accessorDescriptor('getPassword', 'setPassword'));\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n defineBuiltInAccessor(URLPrototype, 'host', accessorDescriptor('getHost', 'setHost'));\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n defineBuiltInAccessor(URLPrototype, 'hostname', accessorDescriptor('getHostname', 'setHostname'));\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n defineBuiltInAccessor(URLPrototype, 'port', accessorDescriptor('getPort', 'setPort'));\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n defineBuiltInAccessor(URLPrototype, 'pathname', accessorDescriptor('getPathname', 'setPathname'));\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n defineBuiltInAccessor(URLPrototype, 'search', accessorDescriptor('getSearch', 'setSearch'));\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n defineBuiltInAccessor(URLPrototype, 'searchParams', accessorDescriptor('getSearchParams'));\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n defineBuiltInAccessor(URLPrototype, 'hash', accessorDescriptor('getHash', 'setHash'));\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\ndefineBuiltIn(URLPrototype, 'toJSON', function toJSON() {\n return getInternalURLState(this).serialize();\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\ndefineBuiltIn(URLPrototype, 'toString', function toString() {\n return getInternalURLState(this).serialize();\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n if (nativeCreateObjectURL) defineBuiltIn(URLConstructor, 'createObjectURL', bind(nativeCreateObjectURL, NativeURL));\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n if (nativeRevokeObjectURL) defineBuiltIn(URLConstructor, 'revokeObjectURL', bind(nativeRevokeObjectURL, NativeURL));\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, constructor: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\n$({ target: 'URL', proto: true, enumerable: true }, {\n toJSON: function toJSON() {\n return call(URL.prototype.toString, this);\n }\n});\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import toNumber from './toNumber.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nexport default toFinite;\n","import toFinite from './toFinite.js';\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nexport default toInteger;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import eq from './eq.js';\nimport isArrayLike from './isArrayLike.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nexport default isIterateeCall;\n","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nexport default baseSlice;\n","import baseSlice from './_baseSlice.js';\nimport isIterateeCall from './_isIterateeCall.js';\nimport toInteger from './toInteger.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n nativeMax = Math.max;\n\n/**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\nfunction chunk(array, size, guard) {\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n size = 1;\n } else {\n size = nativeMax(toInteger(size), 0);\n }\n var length = array == null ? 0 : array.length;\n if (!length || size < 1) {\n return [];\n }\n var index = 0,\n resIndex = 0,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[resIndex++] = baseSlice(array, index, (index += size));\n }\n return result;\n}\n\nexport default chunk;\n","import baseGetTag from './_baseGetTag.js';\nimport isArray from './isArray.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nexport default isString;\n","import\"core-js/modules/es.symbol.description.js\";import\"core-js/modules/es.array.flat.js\";import\"core-js/modules/es.array.flat-map.js\";import\"core-js/modules/es.array.includes.js\";import\"core-js/modules/es.array.reduce.js\";import\"core-js/modules/es.array.reduce-right.js\";import\"core-js/modules/es.array.sort.js\";import\"core-js/modules/es.array.unscopables.flat.js\";import\"core-js/modules/es.array.unscopables.flat-map.js\";import\"core-js/modules/es.math.hypot.js\";import\"core-js/modules/es.object.from-entries.js\";import\"core-js/modules/es.promise.js\";import\"core-js/modules/es.promise.finally.js\";import\"core-js/modules/es.regexp.constructor.js\";import\"core-js/modules/es.regexp.exec.js\";import\"core-js/modules/es.regexp.flags.js\";import\"core-js/modules/es.string.replace.js\";import\"core-js/modules/es.typed-array.float32-array.js\";import\"core-js/modules/es.typed-array.float64-array.js\";import\"core-js/modules/es.typed-array.int8-array.js\";import\"core-js/modules/es.typed-array.int16-array.js\";import\"core-js/modules/es.typed-array.int32-array.js\";import\"core-js/modules/es.typed-array.uint8-array.js\";import\"core-js/modules/es.typed-array.uint8-clamped-array.js\";import\"core-js/modules/es.typed-array.uint16-array.js\";import\"core-js/modules/es.typed-array.uint32-array.js\";import\"core-js/modules/es.typed-array.from.js\";import\"core-js/modules/es.typed-array.of.js\";import\"core-js/modules/es.typed-array.set.js\";import\"core-js/modules/es.typed-array.sort.js\";import\"core-js/modules/esnext.aggregate-error.js\";import\"core-js/modules/esnext.array.last-index.js\";import\"core-js/modules/esnext.array.last-item.js\";import\"core-js/modules/esnext.composite-key.js\";import\"core-js/modules/esnext.composite-symbol.js\";import\"core-js/modules/esnext.global-this.js\";import\"core-js/modules/esnext.map.delete-all.js\";import\"core-js/modules/esnext.map.every.js\";import\"core-js/modules/esnext.map.filter.js\";import\"core-js/modules/esnext.map.find.js\";import\"core-js/modules/esnext.map.find-key.js\";import\"core-js/modules/esnext.map.from.js\";import\"core-js/modules/esnext.map.group-by.js\";import\"core-js/modules/esnext.map.includes.js\";import\"core-js/modules/esnext.map.key-by.js\";import\"core-js/modules/esnext.map.key-of.js\";import\"core-js/modules/esnext.map.map-keys.js\";import\"core-js/modules/esnext.map.map-values.js\";import\"core-js/modules/esnext.map.merge.js\";import\"core-js/modules/esnext.map.of.js\";import\"core-js/modules/esnext.map.reduce.js\";import\"core-js/modules/esnext.map.some.js\";import\"core-js/modules/esnext.map.update.js\";import\"core-js/modules/esnext.math.clamp.js\";import\"core-js/modules/esnext.math.deg-per-rad.js\";import\"core-js/modules/esnext.math.degrees.js\";import\"core-js/modules/esnext.math.fscale.js\";import\"core-js/modules/esnext.math.iaddh.js\";import\"core-js/modules/esnext.math.imulh.js\";import\"core-js/modules/esnext.math.isubh.js\";import\"core-js/modules/esnext.math.rad-per-deg.js\";import\"core-js/modules/esnext.math.radians.js\";import\"core-js/modules/esnext.math.scale.js\";import\"core-js/modules/esnext.math.seeded-prng.js\";import\"core-js/modules/esnext.math.signbit.js\";import\"core-js/modules/esnext.math.umulh.js\";import\"core-js/modules/esnext.number.from-string.js\";import\"core-js/modules/esnext.observable.js\";import\"core-js/modules/esnext.promise.all-settled.js\";import\"core-js/modules/esnext.promise.any.js\";import\"core-js/modules/esnext.promise.try.js\";import\"core-js/modules/esnext.reflect.define-metadata.js\";import\"core-js/modules/esnext.reflect.delete-metadata.js\";import\"core-js/modules/esnext.reflect.get-metadata.js\";import\"core-js/modules/esnext.reflect.get-metadata-keys.js\";import\"core-js/modules/esnext.reflect.get-own-metadata.js\";import\"core-js/modules/esnext.reflect.get-own-metadata-keys.js\";import\"core-js/modules/esnext.reflect.has-metadata.js\";import\"core-js/modules/esnext.reflect.has-own-metadata.js\";import\"core-js/modules/esnext.reflect.metadata.js\";import\"core-js/modules/esnext.set.add-all.js\";import\"core-js/modules/esnext.set.delete-all.js\";import\"core-js/modules/esnext.set.difference.js\";import\"core-js/modules/esnext.set.every.js\";import\"core-js/modules/esnext.set.filter.js\";import\"core-js/modules/esnext.set.find.js\";import\"core-js/modules/esnext.set.from.js\";import\"core-js/modules/esnext.set.intersection.js\";import\"core-js/modules/esnext.set.is-disjoint-from.js\";import\"core-js/modules/esnext.set.is-subset-of.js\";import\"core-js/modules/esnext.set.is-superset-of.js\";import\"core-js/modules/esnext.set.join.js\";import\"core-js/modules/esnext.set.map.js\";import\"core-js/modules/esnext.set.of.js\";import\"core-js/modules/esnext.set.reduce.js\";import\"core-js/modules/esnext.set.some.js\";import\"core-js/modules/esnext.set.symmetric-difference.js\";import\"core-js/modules/esnext.set.union.js\";import\"core-js/modules/esnext.string.at.js\";import\"core-js/modules/esnext.string.code-points.js\";import\"core-js/modules/esnext.string.match-all.js\";import\"core-js/modules/esnext.string.replace-all.js\";import\"core-js/modules/esnext.symbol.dispose.js\";import\"core-js/modules/esnext.symbol.observable.js\";import\"core-js/modules/esnext.symbol.pattern-match.js\";import\"core-js/modules/esnext.weak-map.delete-all.js\";import\"core-js/modules/esnext.weak-map.from.js\";import\"core-js/modules/esnext.weak-map.of.js\";import\"core-js/modules/esnext.weak-set.add-all.js\";import\"core-js/modules/esnext.weak-set.delete-all.js\";import\"core-js/modules/esnext.weak-set.from.js\";import\"core-js/modules/esnext.weak-set.of.js\";import\"core-js/modules/web.dom-collections.iterator.js\";import\"core-js/modules/web.immediate.js\";import\"core-js/modules/web.queue-microtask.js\";import\"core-js/modules/web.url.js\";import\"core-js/modules/web.url.to-json.js\";import\"core-js/modules/web.url-search-params.js\";import{chunk as e,isString as t}from\"#lodash\";function s(e,t,s){return t in e?Object.defineProperty(e,t,{value:s,enumerable:!0,configurable:!0,writable:!0}):e[t]=s,e}class o extends Error{constructor(e,t){e||(e=new.target.defaultMessage),super(e,t)}}s(o,\"defaultMessage\",\"Unexpected error occurred\");class r extends o{}s(r,\"defaultMessage\",\"Object loader configured incorrectly!\");class i extends o{}s(i,\"defaultMessage\",\"Object loader encountered a runtime problem!\");class a{constructor(e){var t;let{serverUrl:s,streamId:o,token:a,objectId:n,options:c={enableCaching:!0,fullyTraverseArrays:!1,excludeProps:[],fetch:null,customLogger:void 0,customWarner:void 0}}=e;if(this.logger=c.customLogger||console.log,this.warner=c.customWarner||console.warn,this.INTERVAL_MS=20,this.TIMEOUT_MS=18e4,this.serverUrl=s||(null===globalThis||void 0===globalThis||null===(t=globalThis.location)||void 0===t?void 0:t.origin),!this.serverUrl)throw new r(\"Invalid serverUrl specified!\");if(this.streamId=o,this.objectId=n,!this.streamId)throw new r(\"Invalid streamId specified!\");if(!this.objectId)throw new r(\"Invalid objectId specified!\");this.logger(\"Object loader constructor called!\"),this.token=a,this.headers={Accept:\"text/plain\"},this.token&&(this.headers.Authorization=\"Bearer \".concat(this.token)),this.requestUrlRootObj=\"\".concat(this.serverUrl,\"/objects/\").concat(this.streamId,\"/\").concat(this.objectId,\"/single\"),this.requestUrlChildren=\"\".concat(this.serverUrl,\"/api/getobjects/\").concat(this.streamId),this.promises=[],this.intervals={},this.buffer=[],this.isLoading=!1,this.totalChildrenCount=0,this.traversedReferencesCount=0,this.options=c,this.options.numConnections=this.options.numConnections||4,this.cacheDB=null,this.lastAsyncPause=Date.now(),this.existingAsyncPause=null,this.preferredFetch=c.fetch,this.fetch=function(){const e=this.preferredFetch||fetch;if(!e)throw new i(\"Couldn't find fetch implementation! If running in a node environment, make sure you pass it in through the constructor!\");return e(...arguments)}}static createFromJSON(e){const t=performance.now(),s=JSON.parse(e);console.warn(\"JSON Parse Time -> \",performance.now()-t);const o=s[0];return new class extends a{constructor(){super({serverUrl:\"dummy\",streamId:\"dummy\",undefined:void 0,objectId:o.id}),this.objectId=o.id}async getRootObject(){return o}async getTotalObjectCount(){return Object.keys((null==o?void 0:o.__closure)||{}).length}async*getObjectIterator(){const e=Date.now();let t=0;for await(const{id:e,obj:o}of this.getRawObjectIterator(s))this.buffer[e]=o,t+=1,yield o;this.logger(\"Loaded \".concat(t,\" objects in: \").concat((Date.now()-e)/1e3))}async*getRawObjectIterator(e){yield{id:e[0].id,obj:e[0]};if(e[0].__closure)for(const t of e)yield{id:t.id,obj:t}}}}async asyncPause(){Date.now()-this.lastAsyncPause>=100&&(this.lastAsyncPause=Date.now(),this.existingAsyncPause=new Promise((e=>setTimeout(e,0))),await this.existingAsyncPause,this.existingAsyncPause=null,Date.now()-this.lastAsyncPause>500&&this.logger(\"Loader Event loop lag: \",Date.now()-this.lastAsyncPause))}dispose(){this.buffer=[],this.promises=[],Object.values(this.intervals).forEach((e=>clearInterval(e.interval)))}async getTotalObjectCount(){const e=await this.getRawRootObject(),t=JSON.parse(e);return Object.keys((null==t?void 0:t.__closure)||{}).length}async getRootObject(){const e=await this.getRawRootObject();return JSON.parse(e)}async getAndConstructObject(e){await this.downloadObjectsInBuffer(e);const t=await this.getObject(this.objectId);return this.traverseAndConstruct(t,e)}async downloadObjectsInBuffer(e){let t=!0,s=0;for await(const o of this.getObjectIterator())t&&(this.totalChildrenCount=o.totalChildrenCount,t=!1,this.isLoading=!0),s++,e&&e({stage:\"download\",current:s,total:this.totalChildrenCount});this.isLoading=!1}async traverseAndConstruct(e,t){if(e){if(\"object\"!=typeof e)return e;if(Array.isArray(e)&&0!==e.length){var s,o;const r=[];for(const s of e){if(!s)continue;if(\"object\"!=typeof s&&!this.options.fullyTraverseArrays)return e;const o=s.referencedId?await this.getObject(s.referencedId):s;s.referencedId&&t&&t({stage:\"construction\",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount}),r.push(await this.traverseAndConstruct(o,t))}return null!==(s=r[0])&&void 0!==s&&null!==(o=s.speckle_type)&&void 0!==o&&o.toLowerCase().includes(\"datachunk\")?r.reduce(((e,t)=>e.concat(t.data)),[]):r}for(const t of this.options.excludeProps)delete e[t];for(const s in e)\"object\"==typeof e[s]&&null!==e[s]&&(e[s].referencedId&&(e[s]=await this.getObject(e[s].referencedId),t&&t({stage:\"construction\",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount})),e[s]=await this.traverseAndConstruct(e[s],t));return e}}async getObject(e){if(this.buffer[e])return this.buffer[e];return new Promise(((t,s)=>{if(this.promises.push({id:e,resolve:t,reject:s}),this.intervals[e])this.intervals[e].elapsed=0;else{const t=setInterval(this.tryResolvePromise.bind(this),this.INTERVAL_MS,e);this.intervals[e]={interval:t,elapsed:0}}}))}tryResolvePromise(e){if(this.intervals[e].elapsed+=this.INTERVAL_MS,this.buffer[e]){for(const t of this.promises.filter((t=>t.id===e)))t.resolve(this.buffer[e]);return clearInterval(this.intervals[e].interval),void delete this.intervals[e]}this.intervals[e].elapsed>this.TIMEOUT_MS&&(this.warner(\"Timeout resolving \".concat(e,\". HIC SVNT DRACONES.\")),clearInterval(this.intervals[e].interval),this.promises.filter((t=>t.id===e)).forEach((e=>e.reject())),this.promises=this.promises.filter((e=>e.id!=e.id)))}async*getObjectIterator(){const e=Date.now();let t=0;for await(const e of this.getRawObjectIterator()){const{id:s,obj:o}=this.processLine(e);this.buffer[s]=o,t+=1,yield o}this.logger(\"Loaded \".concat(t,\" objects in: \").concat((Date.now()-e)/1e3))}processLine(e){const t=e.split(\"\\t\"),[s,o]=t;let r;try{r=JSON.parse(o)}catch(e){throw new Error(\"Error parsing object \".concat(s,\": \").concat(e.message))}return{id:s,obj:r}}supportsCache(){return!(!this.options.enableCaching||!globalThis.indexedDB)}async setupCacheDb(){if(!this.supportsCache()||null!==this.cacheDB)return;await function(){if(navigator.userAgentData||!/Safari\\//.test(navigator.userAgent)||/Chrom(e|ium)\\//.test(navigator.userAgent)||!indexedDB.databases)return Promise.resolve();let e;return new Promise((t=>{const s=()=>indexedDB.databases().finally(t);e=setInterval(s,100),s()})).finally((()=>clearInterval(e)))}();const e=indexedDB.open(\"speckle-object-cache\",1);e.onupgradeneeded=()=>e.result.createObjectStore(\"objects\"),this.cacheDB=await this.promisifyIdbRequest(e)}async*getRawObjectIterator(){await this.setupCacheDb();const t=await this.getRawRootObject();yield\"\".concat(this.objectId,\"\\t\").concat(t);const s=JSON.parse(t);if(!s.__closure)return;let o=Object.keys(s.__closure).filter((e=>!e.includes(\"blob\"))).sort(((e,t)=>s.__closure[e]-s.__closure[t]));if(0===o.length)return;let r=[];if(o.length>50){const t=[[],[],[],[]];let i=0;for(;i<.05*o.length;i++)t[0].push(o[i]);for(;i<.2*o.length;i++)t[1].push(o[i]);for(;i<.6*o.length;i++)t[2].push(o[i]);for(;is.__closure[e]-s.__closure[t]));for(const e of i)yield\"\".concat(e,\"\\t\").concat(r[e]);const c=t[o].filter((e=>!(e in r))),l=e(c,500);for(let e=0;es.__closure[e]-s.__closure[t]));for(const s of t)yield\"\".concat(s,\"\\t\").concat(e[s]);if(o=o.filter((t=>!(t in e))),0===o.length)return;r.push(o)}const i=[],a=[],n=[],c=[],l=[];for(let e=0;e{t.body.getReader&&(t.body.iterator=async function*(){const e=this.getReader();for(;;){const t=await e.read();if(t.done)return t.value;yield t.value}});const s=t.body.iterator();a[e]=s;const o=s.next().then((t=>(t.reqId=e,t)));n[e]=o}));for(;;){const e=n.filter((e=>!!e));if(0===e.length){if(l.every((e=>e)))break;await new Promise((e=>{setTimeout(e,10)}));continue}const t=await Promise.any(e);let{value:s,done:o,reqId:r}=t;if(l[r]=o,o)c[r].length>0&&(yield c[r],c[r]=\"\"),n[r]=null;else{const e=a[r].next().then((e=>(e.reqId=r,e)));n[r]=e}if(!s)continue;s=i[r].decode(s);const m=(c[r]+s).split(/\\r\\n|\\n|\\r/),d=m.pop();c[r]=d;for(const e of m)yield e;this.cacheStoreObjects(m)}}async getRawRootObject(){const e=await this.cacheGetObjects([this.objectId]);if(e[this.objectId])return e[this.objectId];const t=await this.fetch(this.requestUrlRootObj,{headers:this.headers}),s=await t.text();if([401,403].includes(t.status))throw new i(\"You do not have access to the root object!\");return this.cacheStoreObjects([\"\".concat(this.objectId,\"\\t\").concat(s)]),s}promisifyIdbRequest(e){return new Promise(((t,s)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>s(e.error)}))}async cacheGetObjects(e){if(!this.supportsCache())return{};null===this.cacheDB&&await this.setupCacheDb();const s={};for(let o=0;othis.promisifyIdbRequest(i.get(e)).then((t=>({id:e,data:t}))))),n=await Promise.all(a);for(const e of n)!e.data||t(e.data)&&e.data.startsWith(\"> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range to range \nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, - 1.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, - 1.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n\n\nexport {\n\tDEG2RAD,\n\tRAD2DEG,\n\tgenerateUUID,\n\tclamp,\n\teuclideanModulo,\n\tmapLinear,\n\tinverseLerp,\n\tlerp,\n\tdamp,\n\tpingpong,\n\tsmoothstep,\n\tsmootherstep,\n\trandInt,\n\trandFloat,\n\trandFloatSpread,\n\tseededRandom,\n\tdegToRad,\n\tradToDeg,\n\tisPowerOfTwo,\n\tceilPowerOfTwo,\n\tfloorPowerOfTwo,\n\tsetQuaternionFromProperEuler,\n\tnormalize,\n\tdenormalize,\n};\n","/*!\r\n * js-logger - http://github.com/jonnyreeves/js-logger\r\n * Jonny Reeves, http://jonnyreeves.co.uk/\r\n * js-logger may be freely distributed under the MIT license.\r\n */\r\n(function (global) {\r\n\t\"use strict\";\r\n\r\n\t// Top level module for the global, static logger instance.\r\n\tvar Logger = { };\r\n\r\n\t// For those that are at home that are keeping score.\r\n\tLogger.VERSION = \"1.6.1\";\r\n\r\n\t// Function which handles all incoming log messages.\r\n\tvar logHandler;\r\n\r\n\t// Map of ContextualLogger instances by name; used by Logger.get() to return the same named instance.\r\n\tvar contextualLoggersByNameMap = {};\r\n\r\n\t// Polyfill for ES5's Function.bind.\r\n\tvar bind = function(scope, func) {\r\n\t\treturn function() {\r\n\t\t\treturn func.apply(scope, arguments);\r\n\t\t};\r\n\t};\r\n\r\n\t// Super exciting object merger-matron 9000 adding another 100 bytes to your download.\r\n\tvar merge = function () {\r\n\t\tvar args = arguments, target = args[0], key, i;\r\n\t\tfor (i = 1; i < args.length; i++) {\r\n\t\t\tfor (key in args[i]) {\r\n\t\t\t\tif (!(key in target) && args[i].hasOwnProperty(key)) {\r\n\t\t\t\t\ttarget[key] = args[i][key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn target;\r\n\t};\r\n\r\n\t// Helper to define a logging level object; helps with optimisation.\r\n\tvar defineLogLevel = function(value, name) {\r\n\t\treturn { value: value, name: name };\r\n\t};\r\n\r\n\t// Predefined logging levels.\r\n\tLogger.TRACE = defineLogLevel(1, 'TRACE');\r\n\tLogger.DEBUG = defineLogLevel(2, 'DEBUG');\r\n\tLogger.INFO = defineLogLevel(3, 'INFO');\r\n\tLogger.TIME = defineLogLevel(4, 'TIME');\r\n\tLogger.WARN = defineLogLevel(5, 'WARN');\r\n\tLogger.ERROR = defineLogLevel(8, 'ERROR');\r\n\tLogger.OFF = defineLogLevel(99, 'OFF');\r\n\r\n\t// Inner class which performs the bulk of the work; ContextualLogger instances can be configured independently\r\n\t// of each other.\r\n\tvar ContextualLogger = function(defaultContext) {\r\n\t\tthis.context = defaultContext;\r\n\t\tthis.setLevel(defaultContext.filterLevel);\r\n\t\tthis.log = this.info; // Convenience alias.\r\n\t};\r\n\r\n\tContextualLogger.prototype = {\r\n\t\t// Changes the current logging level for the logging instance.\r\n\t\tsetLevel: function (newLevel) {\r\n\t\t\t// Ensure the supplied Level object looks valid.\r\n\t\t\tif (newLevel && \"value\" in newLevel) {\r\n\t\t\t\tthis.context.filterLevel = newLevel;\r\n\t\t\t}\r\n\t\t},\r\n\t\t\r\n\t\t// Gets the current logging level for the logging instance\r\n\t\tgetLevel: function () {\r\n\t\t\treturn this.context.filterLevel;\r\n\t\t},\r\n\r\n\t\t// Is the logger configured to output messages at the supplied level?\r\n\t\tenabledFor: function (lvl) {\r\n\t\t\tvar filterLevel = this.context.filterLevel;\r\n\t\t\treturn lvl.value >= filterLevel.value;\r\n\t\t},\r\n\r\n\t\ttrace: function () {\r\n\t\t\tthis.invoke(Logger.TRACE, arguments);\r\n\t\t},\r\n\r\n\t\tdebug: function () {\r\n\t\t\tthis.invoke(Logger.DEBUG, arguments);\r\n\t\t},\r\n\r\n\t\tinfo: function () {\r\n\t\t\tthis.invoke(Logger.INFO, arguments);\r\n\t\t},\r\n\r\n\t\twarn: function () {\r\n\t\t\tthis.invoke(Logger.WARN, arguments);\r\n\t\t},\r\n\r\n\t\terror: function () {\r\n\t\t\tthis.invoke(Logger.ERROR, arguments);\r\n\t\t},\r\n\r\n\t\ttime: function (label) {\r\n\t\t\tif (typeof label === 'string' && label.length > 0) {\r\n\t\t\t\tthis.invoke(Logger.TIME, [ label, 'start' ]);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ttimeEnd: function (label) {\r\n\t\t\tif (typeof label === 'string' && label.length > 0) {\r\n\t\t\t\tthis.invoke(Logger.TIME, [ label, 'end' ]);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// Invokes the logger callback if it's not being filtered.\r\n\t\tinvoke: function (level, msgArgs) {\r\n\t\t\tif (logHandler && this.enabledFor(level)) {\r\n\t\t\t\tlogHandler(msgArgs, merge({ level: level }, this.context));\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t// Protected instance which all calls to the to level `Logger` module will be routed through.\r\n\tvar globalLogger = new ContextualLogger({ filterLevel: Logger.OFF });\r\n\r\n\t// Configure the global Logger instance.\r\n\t(function() {\r\n\t\t// Shortcut for optimisers.\r\n\t\tvar L = Logger;\r\n\r\n\t\tL.enabledFor = bind(globalLogger, globalLogger.enabledFor);\r\n\t\tL.trace = bind(globalLogger, globalLogger.trace);\r\n\t\tL.debug = bind(globalLogger, globalLogger.debug);\r\n\t\tL.time = bind(globalLogger, globalLogger.time);\r\n\t\tL.timeEnd = bind(globalLogger, globalLogger.timeEnd);\r\n\t\tL.info = bind(globalLogger, globalLogger.info);\r\n\t\tL.warn = bind(globalLogger, globalLogger.warn);\r\n\t\tL.error = bind(globalLogger, globalLogger.error);\r\n\r\n\t\t// Don't forget the convenience alias!\r\n\t\tL.log = L.info;\r\n\t}());\r\n\r\n\t// Set the global logging handler. The supplied function should expect two arguments, the first being an arguments\r\n\t// object with the supplied log messages and the second being a context object which contains a hash of stateful\r\n\t// parameters which the logging function can consume.\r\n\tLogger.setHandler = function (func) {\r\n\t\tlogHandler = func;\r\n\t};\r\n\r\n\t// Sets the global logging filter level which applies to *all* previously registered, and future Logger instances.\r\n\t// (note that named loggers (retrieved via `Logger.get`) can be configured independently if required).\r\n\tLogger.setLevel = function(level) {\r\n\t\t// Set the globalLogger's level.\r\n\t\tglobalLogger.setLevel(level);\r\n\r\n\t\t// Apply this level to all registered contextual loggers.\r\n\t\tfor (var key in contextualLoggersByNameMap) {\r\n\t\t\tif (contextualLoggersByNameMap.hasOwnProperty(key)) {\r\n\t\t\t\tcontextualLoggersByNameMap[key].setLevel(level);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t// Gets the global logging filter level\r\n\tLogger.getLevel = function() {\r\n\t\treturn globalLogger.getLevel();\r\n\t};\r\n\r\n\t// Retrieve a ContextualLogger instance. Note that named loggers automatically inherit the global logger's level,\r\n\t// default context and log handler.\r\n\tLogger.get = function (name) {\r\n\t\t// All logger instances are cached so they can be configured ahead of use.\r\n\t\treturn contextualLoggersByNameMap[name] ||\r\n\t\t\t(contextualLoggersByNameMap[name] = new ContextualLogger(merge({ name: name }, globalLogger.context)));\r\n\t};\r\n\r\n\t// CreateDefaultHandler returns a handler function which can be passed to `Logger.setHandler()` which will\r\n\t// write to the window's console object (if present); the optional options object can be used to customise the\r\n\t// formatter used to format each log message.\r\n\tLogger.createDefaultHandler = function (options) {\r\n\t\toptions = options || {};\r\n\r\n\t\toptions.formatter = options.formatter || function defaultMessageFormatter(messages, context) {\r\n\t\t\t// Prepend the logger's name to the log message for easy identification.\r\n\t\t\tif (context.name) {\r\n\t\t\t\tmessages.unshift(\"[\" + context.name + \"]\");\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Map of timestamps by timer labels used to track `#time` and `#timeEnd()` invocations in environments\r\n\t\t// that don't offer a native console method.\r\n\t\tvar timerStartTimeByLabelMap = {};\r\n\r\n\t\t// Support for IE8+ (and other, slightly more sane environments)\r\n\t\tvar invokeConsoleMethod = function (hdlr, messages) {\r\n\t\t\tFunction.prototype.apply.call(hdlr, console, messages);\r\n\t\t};\r\n\r\n\t\t// Check for the presence of a logger.\r\n\t\tif (typeof console === \"undefined\") {\r\n\t\t\treturn function () { /* no console */ };\r\n\t\t}\r\n\r\n\t\treturn function(messages, context) {\r\n\t\t\t// Convert arguments object to Array.\r\n\t\t\tmessages = Array.prototype.slice.call(messages);\r\n\r\n\t\t\tvar hdlr = console.log;\r\n\t\t\tvar timerLabel;\r\n\r\n\t\t\tif (context.level === Logger.TIME) {\r\n\t\t\t\ttimerLabel = (context.name ? '[' + context.name + '] ' : '') + messages[0];\r\n\r\n\t\t\t\tif (messages[1] === 'start') {\r\n\t\t\t\t\tif (console.time) {\r\n\t\t\t\t\t\tconsole.time(timerLabel);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\ttimerStartTimeByLabelMap[timerLabel] = new Date().getTime();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (console.timeEnd) {\r\n\t\t\t\t\t\tconsole.timeEnd(timerLabel);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tinvokeConsoleMethod(hdlr, [ timerLabel + ': ' +\r\n\t\t\t\t\t\t\t(new Date().getTime() - timerStartTimeByLabelMap[timerLabel]) + 'ms' ]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// Delegate through to custom warn/error loggers if present on the console.\r\n\t\t\t\tif (context.level === Logger.WARN && console.warn) {\r\n\t\t\t\t\thdlr = console.warn;\r\n\t\t\t\t} else if (context.level === Logger.ERROR && console.error) {\r\n\t\t\t\t\thdlr = console.error;\r\n\t\t\t\t} else if (context.level === Logger.INFO && console.info) {\r\n\t\t\t\t\thdlr = console.info;\r\n\t\t\t\t} else if (context.level === Logger.DEBUG && console.debug) {\r\n\t\t\t\t\thdlr = console.debug;\r\n\t\t\t\t} else if (context.level === Logger.TRACE && console.trace) {\r\n\t\t\t\t\thdlr = console.trace;\r\n\t\t\t\t}\r\n\r\n\t\t\t\toptions.formatter(messages, context);\r\n\t\t\t\tinvokeConsoleMethod(hdlr, messages);\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n\r\n\t// Configure and example a Default implementation which writes to the `window.console` (if present). The\r\n\t// `options` hash can be used to configure the default logLevel and provide a custom message formatter.\r\n\tLogger.useDefaults = function(options) {\r\n\t\tLogger.setLevel(options && options.defaultLevel || Logger.DEBUG);\r\n\t\tLogger.setHandler(Logger.createDefaultHandler(options));\r\n\t};\r\n\r\n\t// Createa an alias to useDefaults to avoid reaking a react-hooks rule.\r\n\tLogger.setDefaults = Logger.useDefaults;\r\n\r\n\t// Export to popular environments boilerplate.\r\n\tif (typeof define === 'function' && define.amd) {\r\n\t\tdefine(Logger);\r\n\t}\r\n\telse if (typeof module !== 'undefined' && module.exports) {\r\n\t\tmodule.exports = Logger;\r\n\t}\r\n\telse {\r\n\t\tLogger._prevLogger = global.Logger;\r\n\r\n\t\tLogger.noConflict = function () {\r\n\t\t\tglobal.Logger = Logger._prevLogger;\r\n\t\t\treturn Logger;\r\n\t\t};\r\n\r\n\t\tglobal.Logger = Logger;\r\n\t}\r\n}(this));\r\n","/*!\n * camera-controls\n * https://github.com/yomotsu/camera-controls\n * (c) 2017 @yomotsu\n * Released under the MIT License.\n */\n// see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#value\nconst MOUSE_BUTTON = {\n LEFT: 1,\n RIGHT: 2,\n MIDDLE: 4,\n};\nconst ACTION = Object.freeze({\n NONE: 0,\n ROTATE: 1,\n TRUCK: 2,\n OFFSET: 4,\n DOLLY: 8,\n ZOOM: 16,\n TOUCH_ROTATE: 32,\n TOUCH_TRUCK: 64,\n TOUCH_OFFSET: 128,\n TOUCH_DOLLY: 256,\n TOUCH_ZOOM: 512,\n TOUCH_DOLLY_TRUCK: 1024,\n TOUCH_DOLLY_OFFSET: 2048,\n TOUCH_DOLLY_ROTATE: 4096,\n TOUCH_ZOOM_TRUCK: 8192,\n TOUCH_ZOOM_OFFSET: 16384,\n TOUCH_ZOOM_ROTATE: 32768,\n});\nfunction isPerspectiveCamera(camera) {\n return camera.isPerspectiveCamera;\n}\nfunction isOrthographicCamera(camera) {\n return camera.isOrthographicCamera;\n}\n\nconst PI_2 = Math.PI * 2;\nconst PI_HALF = Math.PI / 2;\n\nconst EPSILON = 1e-5;\nfunction approxZero(number, error = EPSILON) {\n return Math.abs(number) < error;\n}\nfunction approxEquals(a, b, error = EPSILON) {\n return approxZero(a - b, error);\n}\nfunction roundToStep(value, step) {\n return Math.round(value / step) * step;\n}\nfunction infinityToMaxNumber(value) {\n if (isFinite(value))\n return value;\n if (value < 0)\n return -Number.MAX_VALUE;\n return Number.MAX_VALUE;\n}\nfunction maxNumberToInfinity(value) {\n if (Math.abs(value) < Number.MAX_VALUE)\n return value;\n return value * Infinity;\n}\n\nfunction extractClientCoordFromEvent(pointers, out) {\n out.set(0, 0);\n pointers.forEach((pointer) => {\n out.x += pointer.clientX;\n out.y += pointer.clientY;\n });\n out.x /= pointers.length;\n out.y /= pointers.length;\n}\n\nfunction notSupportedInOrthographicCamera(camera, message) {\n if (isOrthographicCamera(camera)) {\n console.warn(`${message} is not supported in OrthographicCamera`);\n return true;\n }\n return false;\n}\n\n/**\n * A compat function for `Quaternion.invert()` / `Quaternion.inverse()`.\n * `Quaternion.invert()` is introduced in r123 and `Quaternion.inverse()` emits a warning.\n * We are going to use this compat for a while.\n * @param target A target quaternion\n */\nfunction quatInvertCompat(target) {\n if (target.invert) {\n target.invert();\n }\n else {\n target.inverse();\n }\n return target;\n}\n\nclass EventDispatcher {\n constructor() {\n this._listeners = {};\n }\n /**\n * Adds the specified event listener.\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n addEventListener(type, listener) {\n const listeners = this._listeners;\n if (listeners[type] === undefined)\n listeners[type] = [];\n if (listeners[type].indexOf(listener) === -1)\n listeners[type].push(listener);\n }\n /**\n * Presence of the specified event listener.\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n hasEventListener(type, listener) {\n const listeners = this._listeners;\n return listeners[type] !== undefined && listeners[type].indexOf(listener) !== -1;\n }\n /**\n * Removes the specified event listener\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n removeEventListener(type, listener) {\n const listeners = this._listeners;\n const listenerArray = listeners[type];\n if (listenerArray !== undefined) {\n const index = listenerArray.indexOf(listener);\n if (index !== -1)\n listenerArray.splice(index, 1);\n }\n }\n /**\n * Removes all event listeners\n * @param type event name\n * @category Methods\n */\n removeAllEventListeners(type) {\n if (!type) {\n this._listeners = {};\n return;\n }\n if (Array.isArray(this._listeners[type]))\n this._listeners[type].length = 0;\n }\n /**\n * Fire an event type.\n * @param event DispatcherEvent\n * @category Methods\n */\n dispatchEvent(event) {\n const listeners = this._listeners;\n const listenerArray = listeners[event.type];\n if (listenerArray !== undefined) {\n event.target = this;\n const array = listenerArray.slice(0);\n for (let i = 0, l = array.length; i < l; i++) {\n array[i].call(this, event);\n }\n }\n }\n}\n\nconst VERSION = '1.38.1'; // will be replaced with `version` in package.json during the build process.\nconst TOUCH_DOLLY_FACTOR = 1 / 8;\nconst isBrowser = typeof window !== 'undefined';\nconst isMac = isBrowser && /Mac/.test(navigator.platform);\nconst isPointerEventsNotSupported = !(isBrowser && 'PointerEvent' in window); // Safari 12 does not support PointerEvents API\nlet THREE;\nlet _ORIGIN;\nlet _AXIS_Y;\nlet _AXIS_Z;\nlet _v2;\nlet _v3A;\nlet _v3B;\nlet _v3C;\nlet _xColumn;\nlet _yColumn;\nlet _zColumn;\nlet _deltaTarget;\nlet _deltaOffset;\nlet _sphericalA;\nlet _sphericalB;\nlet _box3A;\nlet _box3B;\nlet _sphere;\nlet _quaternionA;\nlet _quaternionB;\nlet _rotationMatrix;\nlet _raycaster;\nclass CameraControls extends EventDispatcher {\n /**\n * Injects THREE as the dependency. You can then proceed to use CameraControls.\n *\n * e.g\n * ```javascript\n * CameraControls.install( { THREE: THREE } );\n * ```\n *\n * Note: If you do not wish to use enter three.js to reduce file size(tree-shaking for example), make a subset to install.\n *\n * ```js\n * import {\n * \tVector2,\n * \tVector3,\n * \tVector4,\n * \tQuaternion,\n * \tMatrix4,\n * \tSpherical,\n * \tBox3,\n * \tSphere,\n * \tRaycaster,\n * \tMathUtils,\n * } from 'three';\n *\n * const subsetOfTHREE = {\n * \tVector2 : Vector2,\n * \tVector3 : Vector3,\n * \tVector4 : Vector4,\n * \tQuaternion: Quaternion,\n * \tMatrix4 : Matrix4,\n * \tSpherical : Spherical,\n * \tBox3 : Box3,\n * \tSphere : Sphere,\n * \tRaycaster : Raycaster,\n * \tMathUtils : {\n * \t\tDEG2RAD: MathUtils.DEG2RAD,\n * \t\tclamp: MathUtils.clamp,\n * \t},\n * };\n\n * CameraControls.install( { THREE: subsetOfTHREE } );\n * ```\n * @category Statics\n */\n static install(libs) {\n THREE = libs.THREE;\n _ORIGIN = Object.freeze(new THREE.Vector3(0, 0, 0));\n _AXIS_Y = Object.freeze(new THREE.Vector3(0, 1, 0));\n _AXIS_Z = Object.freeze(new THREE.Vector3(0, 0, 1));\n _v2 = new THREE.Vector2();\n _v3A = new THREE.Vector3();\n _v3B = new THREE.Vector3();\n _v3C = new THREE.Vector3();\n _xColumn = new THREE.Vector3();\n _yColumn = new THREE.Vector3();\n _zColumn = new THREE.Vector3();\n _deltaTarget = new THREE.Vector3();\n _deltaOffset = new THREE.Vector3();\n _sphericalA = new THREE.Spherical();\n _sphericalB = new THREE.Spherical();\n _box3A = new THREE.Box3();\n _box3B = new THREE.Box3();\n _sphere = new THREE.Sphere();\n _quaternionA = new THREE.Quaternion();\n _quaternionB = new THREE.Quaternion();\n _rotationMatrix = new THREE.Matrix4();\n _raycaster = new THREE.Raycaster();\n }\n /**\n * list all ACTIONs\n * @category Statics\n */\n static get ACTION() {\n return ACTION;\n }\n /**\n * Creates a `CameraControls` instance.\n *\n * Note:\n * You **must install** three.js before using camera-controls. see [#install](#install)\n * Not doing so will lead to runtime errors (`undefined` references to THREE).\n *\n * e.g.\n * ```\n * CameraControls.install( { THREE } );\n * const cameraControls = new CameraControls( camera, domElement );\n * ```\n *\n * @param camera A `THREE.PerspectiveCamera` or `THREE.OrthographicCamera` to be controlled.\n * @param domElement A `HTMLElement` for the draggable area, usually `renderer.domElement`.\n * @category Constructor\n */\n constructor(camera, domElement) {\n super();\n /**\n * Minimum vertical angle in radians.\n * The angle has to be between `0` and `.maxPolarAngle` inclusive.\n * The default value is `0`.\n *\n * e.g.\n * ```\n * cameraControls.maxPolarAngle = 0;\n * ```\n * @category Properties\n */\n this.minPolarAngle = 0; // radians\n /**\n * Maximum vertical angle in radians.\n * The angle has to be between `.maxPolarAngle` and `Math.PI` inclusive.\n * The default value is `Math.PI`.\n *\n * e.g.\n * ```\n * cameraControls.maxPolarAngle = Math.PI;\n * ```\n * @category Properties\n */\n this.maxPolarAngle = Math.PI; // radians\n /**\n * Minimum horizontal angle in radians.\n * The angle has to be less than `.maxAzimuthAngle`.\n * The default value is `- Infinity`.\n *\n * e.g.\n * ```\n * cameraControls.minAzimuthAngle = - Infinity;\n * ```\n * @category Properties\n */\n this.minAzimuthAngle = -Infinity; // radians\n /**\n * Maximum horizontal angle in radians.\n * The angle has to be greater than `.minAzimuthAngle`.\n * The default value is `Infinity`.\n *\n * e.g.\n * ```\n * cameraControls.maxAzimuthAngle = Infinity;\n * ```\n * @category Properties\n */\n this.maxAzimuthAngle = Infinity; // radians\n // How far you can dolly in and out ( PerspectiveCamera only )\n /**\n * Minimum distance for dolly. The value must be higher than `0`.\n * PerspectiveCamera only.\n * @category Properties\n */\n this.minDistance = 0;\n /**\n * Maximum distance for dolly. The value must be higher than `minDistance`.\n * PerspectiveCamera only.\n * @category Properties\n */\n this.maxDistance = Infinity;\n /**\n * `true` to enable Infinity Dolly.\n * When the Dolly distance is less than the `minDistance`, radius of the sphere will be set `minDistance` automatically.\n * @category Properties\n */\n this.infinityDolly = false;\n /**\n * Minimum camera zoom.\n * @category Properties\n */\n this.minZoom = 0.01;\n /**\n * Maximum camera zoom.\n * @category Properties\n */\n this.maxZoom = Infinity;\n /**\n * The damping inertia.\n * The value must be between `Math.EPSILON` to `1` inclusive.\n * Setting `1` to disable smooth transitions.\n * @category Properties\n */\n this.dampingFactor = 0.05;\n /**\n * The damping inertia while dragging.\n * The value must be between `Math.EPSILON` to `1` inclusive.\n * Setting `1` to disable smooth transitions.\n * @category Properties\n */\n this.draggingDampingFactor = 0.25;\n /**\n * Speed of azimuth (horizontal) rotation.\n * @category Properties\n */\n this.azimuthRotateSpeed = 1.0;\n /**\n * Speed of polar (vertical) rotation.\n * @category Properties\n */\n this.polarRotateSpeed = 1.0;\n /**\n * Speed of mouse-wheel dollying.\n * @category Properties\n */\n this.dollySpeed = 1.0;\n /**\n * Speed of drag for truck and pedestal.\n * @category Properties\n */\n this.truckSpeed = 2.0;\n /**\n * `true` to enable Dolly-in to the mouse cursor coords.\n * @category Properties\n */\n this.dollyToCursor = false;\n /**\n * @category Properties\n */\n this.dragToOffset = false;\n /**\n * The same as `.screenSpacePanning` in three.js's OrbitControls.\n * @category Properties\n */\n this.verticalDragToForward = false;\n /**\n * Friction ratio of the boundary.\n * @category Properties\n */\n this.boundaryFriction = 0.0;\n /**\n * Controls how soon the `rest` event fires as the camera slows.\n * @category Properties\n */\n this.restThreshold = 0.01;\n /**\n * An array of Meshes to collide with camera.\n * Be aware colliderMeshes may decrease performance. The collision test uses 4 raycasters from the camera since the near plane has 4 corners.\n * @category Properties\n */\n this.colliderMeshes = [];\n /**\n * Force cancel user dragging.\n * @category Methods\n */\n // cancel will be overwritten in the constructor.\n this.cancel = () => { };\n this._enabled = true;\n this._state = ACTION.NONE;\n this._viewport = null;\n this._affectOffset = false;\n this._dollyControlAmount = 0;\n this._hasRested = true;\n this._boundaryEnclosesCamera = false;\n this._needsUpdate = true;\n this._updatedLastTime = false;\n this._elementRect = new DOMRect();\n this._activePointers = [];\n this._truckInternal = (deltaX, deltaY, dragToOffset) => {\n if (isPerspectiveCamera(this._camera)) {\n const offset = _v3A.copy(this._camera.position).sub(this._target);\n // half of the fov is center to top of screen\n const fov = this._camera.getEffectiveFOV() * THREE.MathUtils.DEG2RAD;\n const targetDistance = offset.length() * Math.tan(fov * 0.5);\n const truckX = (this.truckSpeed * deltaX * targetDistance / this._elementRect.height);\n const pedestalY = (this.truckSpeed * deltaY * targetDistance / this._elementRect.height);\n if (this.verticalDragToForward) {\n dragToOffset ?\n this.setFocalOffset(this._focalOffsetEnd.x + truckX, this._focalOffsetEnd.y, this._focalOffsetEnd.z, true) :\n this.truck(truckX, 0, true);\n this.forward(-pedestalY, true);\n }\n else {\n dragToOffset ?\n this.setFocalOffset(this._focalOffsetEnd.x + truckX, this._focalOffsetEnd.y + pedestalY, this._focalOffsetEnd.z, true) :\n this.truck(truckX, pedestalY, true);\n }\n }\n else if (isOrthographicCamera(this._camera)) {\n // orthographic\n const camera = this._camera;\n const truckX = deltaX * (camera.right - camera.left) / camera.zoom / this._elementRect.width;\n const pedestalY = deltaY * (camera.top - camera.bottom) / camera.zoom / this._elementRect.height;\n dragToOffset ?\n this.setFocalOffset(this._focalOffsetEnd.x + truckX, this._focalOffsetEnd.y + pedestalY, this._focalOffsetEnd.z, true) :\n this.truck(truckX, pedestalY, true);\n }\n };\n this._rotateInternal = (deltaX, deltaY) => {\n const theta = PI_2 * this.azimuthRotateSpeed * deltaX / this._elementRect.height; // divide by *height* to refer the resolution\n const phi = PI_2 * this.polarRotateSpeed * deltaY / this._elementRect.height;\n this.rotate(theta, phi, true);\n };\n this._dollyInternal = (delta, x, y) => {\n const dollyScale = Math.pow(0.95, -delta * this.dollySpeed);\n const distance = this._sphericalEnd.radius * dollyScale;\n const prevRadius = this._sphericalEnd.radius;\n const signedPrevRadius = prevRadius * (delta >= 0 ? -1 : 1);\n this.dollyTo(distance);\n if (this.infinityDolly && (distance < this.minDistance || this.maxDistance === this.minDistance)) {\n this._camera.getWorldDirection(_v3A);\n this._targetEnd.add(_v3A.normalize().multiplyScalar(signedPrevRadius));\n this._target.add(_v3A.normalize().multiplyScalar(signedPrevRadius));\n }\n if (this.dollyToCursor) {\n this._dollyControlAmount += this._sphericalEnd.radius - prevRadius;\n if (this.infinityDolly && (distance < this.minDistance || this.maxDistance === this.minDistance)) {\n this._dollyControlAmount -= signedPrevRadius;\n }\n this._dollyControlCoord.set(x, y);\n }\n return;\n };\n this._zoomInternal = (delta, x, y) => {\n const zoomScale = Math.pow(0.95, delta * this.dollySpeed);\n const prevZoom = this._zoomEnd;\n // for both PerspectiveCamera and OrthographicCamera\n this.zoomTo(this._zoom * zoomScale);\n if (this.dollyToCursor) {\n this._dollyControlAmount += this._zoomEnd - prevZoom;\n this._dollyControlCoord.set(x, y);\n }\n return;\n };\n // Check if the user has installed THREE\n if (typeof THREE === 'undefined') {\n console.error('camera-controls: `THREE` is undefined. You must first run `CameraControls.install( { THREE: THREE } )`. Check the docs for further information.');\n }\n this._camera = camera;\n this._yAxisUpSpace = new THREE.Quaternion().setFromUnitVectors(this._camera.up, _AXIS_Y);\n this._yAxisUpSpaceInverse = quatInvertCompat(this._yAxisUpSpace.clone());\n this._state = ACTION.NONE;\n // the location\n this._target = new THREE.Vector3();\n this._targetEnd = this._target.clone();\n this._focalOffset = new THREE.Vector3();\n this._focalOffsetEnd = this._focalOffset.clone();\n // rotation\n this._spherical = new THREE.Spherical().setFromVector3(_v3A.copy(this._camera.position).applyQuaternion(this._yAxisUpSpace));\n this._sphericalEnd = this._spherical.clone();\n this._zoom = this._camera.zoom;\n this._zoomEnd = this._zoom;\n // collisionTest uses nearPlane.s\n this._nearPlaneCorners = [\n new THREE.Vector3(),\n new THREE.Vector3(),\n new THREE.Vector3(),\n new THREE.Vector3(),\n ];\n this._updateNearPlaneCorners();\n // Target cannot move outside of this box\n this._boundary = new THREE.Box3(new THREE.Vector3(-Infinity, -Infinity, -Infinity), new THREE.Vector3(Infinity, Infinity, Infinity));\n // reset\n this._target0 = this._target.clone();\n this._position0 = this._camera.position.clone();\n this._zoom0 = this._zoom;\n this._focalOffset0 = this._focalOffset.clone();\n this._dollyControlAmount = 0;\n this._dollyControlCoord = new THREE.Vector2();\n // configs\n this.mouseButtons = {\n left: ACTION.ROTATE,\n middle: ACTION.DOLLY,\n right: ACTION.TRUCK,\n wheel: isPerspectiveCamera(this._camera) ? ACTION.DOLLY :\n isOrthographicCamera(this._camera) ? ACTION.ZOOM :\n ACTION.NONE,\n };\n this.touches = {\n one: ACTION.TOUCH_ROTATE,\n two: isPerspectiveCamera(this._camera) ? ACTION.TOUCH_DOLLY_TRUCK :\n isOrthographicCamera(this._camera) ? ACTION.TOUCH_ZOOM_TRUCK :\n ACTION.NONE,\n three: ACTION.TOUCH_TRUCK,\n };\n const dragStartPosition = new THREE.Vector2();\n const lastDragPosition = new THREE.Vector2();\n const dollyStart = new THREE.Vector2();\n const onPointerDown = (event) => {\n if (!this._enabled || !this._domElement)\n return;\n // Don't call `event.preventDefault()` on the pointerdown event\n // to keep receiving pointermove evens outside dragging iframe\n // https://taye.me/blog/tips/2015/11/16/mouse-drag-outside-iframe/\n const pointer = {\n pointerId: event.pointerId,\n clientX: event.clientX,\n clientY: event.clientY,\n deltaX: 0,\n deltaY: 0,\n };\n this._activePointers.push(pointer);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n this._domElement.ownerDocument.addEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.addEventListener('pointerup', onPointerUp);\n startDragging(event);\n };\n const onMouseDown = (event) => {\n if (!this._enabled || !this._domElement)\n return;\n const pointer = {\n pointerId: 0,\n clientX: event.clientX,\n clientY: event.clientY,\n deltaX: 0,\n deltaY: 0,\n };\n this._activePointers.push(pointer);\n // see https://github.com/microsoft/TypeScript/issues/32912#issuecomment-522142969\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('mousemove', onMouseMove);\n this._domElement.ownerDocument.removeEventListener('mouseup', onMouseUp);\n this._domElement.ownerDocument.addEventListener('mousemove', onMouseMove);\n this._domElement.ownerDocument.addEventListener('mouseup', onMouseUp);\n startDragging(event);\n };\n const onTouchStart = (event) => {\n if (!this._enabled || !this._domElement)\n return;\n event.preventDefault();\n Array.prototype.forEach.call(event.changedTouches, (touch) => {\n const pointer = {\n pointerId: touch.identifier,\n clientX: touch.clientX,\n clientY: touch.clientY,\n deltaX: 0,\n deltaY: 0,\n };\n this._activePointers.push(pointer);\n });\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('touchmove', onTouchMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('touchend', onTouchEnd);\n this._domElement.ownerDocument.addEventListener('touchmove', onTouchMove, { passive: false });\n this._domElement.ownerDocument.addEventListener('touchend', onTouchEnd);\n startDragging(event);\n };\n const onPointerMove = (event) => {\n if (event.cancelable)\n event.preventDefault();\n const pointerId = event.pointerId;\n const pointer = this._findPointerById(pointerId);\n if (!pointer)\n return;\n pointer.clientX = event.clientX;\n pointer.clientY = event.clientY;\n pointer.deltaX = event.movementX;\n pointer.deltaY = event.movementY;\n if (event.pointerType === 'touch') {\n switch (this._activePointers.length) {\n case 1:\n this._state = this.touches.one;\n break;\n case 2:\n this._state = this.touches.two;\n break;\n case 3:\n this._state = this.touches.three;\n break;\n }\n }\n else {\n this._state = 0;\n if ((event.buttons & MOUSE_BUTTON.LEFT) === MOUSE_BUTTON.LEFT) {\n this._state = this._state | this.mouseButtons.left;\n }\n if ((event.buttons & MOUSE_BUTTON.MIDDLE) === MOUSE_BUTTON.MIDDLE) {\n this._state = this._state | this.mouseButtons.middle;\n }\n if ((event.buttons & MOUSE_BUTTON.RIGHT) === MOUSE_BUTTON.RIGHT) {\n this._state = this._state | this.mouseButtons.right;\n }\n }\n dragging();\n };\n const onMouseMove = (event) => {\n const pointer = this._findPointerById(0);\n if (!pointer)\n return;\n pointer.clientX = event.clientX;\n pointer.clientY = event.clientY;\n pointer.deltaX = event.movementX;\n pointer.deltaY = event.movementY;\n this._state = 0;\n if ((event.buttons & MOUSE_BUTTON.LEFT) === MOUSE_BUTTON.LEFT) {\n this._state = this._state | this.mouseButtons.left;\n }\n if ((event.buttons & MOUSE_BUTTON.MIDDLE) === MOUSE_BUTTON.MIDDLE) {\n this._state = this._state | this.mouseButtons.middle;\n }\n if ((event.buttons & MOUSE_BUTTON.RIGHT) === MOUSE_BUTTON.RIGHT) {\n this._state = this._state | this.mouseButtons.right;\n }\n dragging();\n };\n const onTouchMove = (event) => {\n if (event.cancelable)\n event.preventDefault();\n Array.prototype.forEach.call(event.changedTouches, (touch) => {\n const pointerId = touch.identifier;\n const pointer = this._findPointerById(pointerId);\n if (!pointer)\n return;\n pointer.clientX = touch.clientX;\n pointer.clientY = touch.clientY;\n // touch event does not have movementX and movementY.\n });\n dragging();\n };\n const onPointerUp = (event) => {\n const pointerId = event.pointerId;\n const pointer = this._findPointerById(pointerId);\n pointer && this._activePointers.splice(this._activePointers.indexOf(pointer), 1);\n if (event.pointerType === 'touch') {\n switch (this._activePointers.length) {\n case 0:\n this._state = ACTION.NONE;\n break;\n case 1:\n this._state = this.touches.one;\n break;\n case 2:\n this._state = this.touches.two;\n break;\n case 3:\n this._state = this.touches.three;\n break;\n }\n }\n else {\n this._state = ACTION.NONE;\n }\n endDragging();\n };\n const onMouseUp = () => {\n const pointer = this._findPointerById(0);\n pointer && this._activePointers.splice(this._activePointers.indexOf(pointer), 1);\n this._state = ACTION.NONE;\n endDragging();\n };\n const onTouchEnd = (event) => {\n Array.prototype.forEach.call(event.changedTouches, (touch) => {\n const pointerId = touch.identifier;\n const pointer = this._findPointerById(pointerId);\n pointer && this._activePointers.splice(this._activePointers.indexOf(pointer), 1);\n });\n switch (this._activePointers.length) {\n case 0:\n this._state = ACTION.NONE;\n break;\n case 1:\n this._state = this.touches.one;\n break;\n case 2:\n this._state = this.touches.two;\n break;\n case 3:\n this._state = this.touches.three;\n break;\n }\n endDragging();\n };\n let lastScrollTimeStamp = -1;\n const onMouseWheel = (event) => {\n if (!this._enabled || this.mouseButtons.wheel === ACTION.NONE)\n return;\n event.preventDefault();\n if (this.dollyToCursor ||\n this.mouseButtons.wheel === ACTION.ROTATE ||\n this.mouseButtons.wheel === ACTION.TRUCK) {\n const now = performance.now();\n // only need to fire this at scroll start.\n if (lastScrollTimeStamp - now < 1000)\n this._getClientRect(this._elementRect);\n lastScrollTimeStamp = now;\n }\n // Ref: https://github.com/cedricpinson/osgjs/blob/00e5a7e9d9206c06fdde0436e1d62ab7cb5ce853/sources/osgViewer/input/source/InputSourceMouse.js#L89-L103\n const deltaYFactor = isMac ? -1 : -3;\n const delta = (event.deltaMode === 1) ? event.deltaY / deltaYFactor : event.deltaY / (deltaYFactor * 10);\n const x = this.dollyToCursor ? (event.clientX - this._elementRect.x) / this._elementRect.width * 2 - 1 : 0;\n const y = this.dollyToCursor ? (event.clientY - this._elementRect.y) / this._elementRect.height * -2 + 1 : 0;\n switch (this.mouseButtons.wheel) {\n case ACTION.ROTATE: {\n this._rotateInternal(event.deltaX, event.deltaY);\n break;\n }\n case ACTION.TRUCK: {\n this._truckInternal(event.deltaX, event.deltaY, false);\n break;\n }\n case ACTION.OFFSET: {\n this._truckInternal(event.deltaX, event.deltaY, true);\n break;\n }\n case ACTION.DOLLY: {\n this._dollyInternal(-delta, x, y);\n break;\n }\n case ACTION.ZOOM: {\n this._zoomInternal(-delta, x, y);\n break;\n }\n }\n this.dispatchEvent({ type: 'control' });\n };\n const onContextMenu = (event) => {\n if (!this._enabled)\n return;\n event.preventDefault();\n };\n const startDragging = (event) => {\n if (!this._enabled)\n return;\n extractClientCoordFromEvent(this._activePointers, _v2);\n this._getClientRect(this._elementRect);\n dragStartPosition.copy(_v2);\n lastDragPosition.copy(_v2);\n const isMultiTouch = this._activePointers.length >= 2;\n if (isMultiTouch) {\n // 2 finger pinch\n const dx = _v2.x - this._activePointers[1].clientX;\n const dy = _v2.y - this._activePointers[1].clientY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n dollyStart.set(0, distance);\n // center coords of 2 finger truck\n const x = (this._activePointers[0].clientX + this._activePointers[1].clientX) * 0.5;\n const y = (this._activePointers[0].clientY + this._activePointers[1].clientY) * 0.5;\n lastDragPosition.set(x, y);\n }\n if ('touches' in event ||\n 'pointerType' in event && event.pointerType === 'touch') {\n switch (this._activePointers.length) {\n case 1:\n this._state = this.touches.one;\n break;\n case 2:\n this._state = this.touches.two;\n break;\n case 3:\n this._state = this.touches.three;\n break;\n }\n }\n else {\n this._state = 0;\n if ((event.buttons & MOUSE_BUTTON.LEFT) === MOUSE_BUTTON.LEFT) {\n this._state = this._state | this.mouseButtons.left;\n }\n if ((event.buttons & MOUSE_BUTTON.MIDDLE) === MOUSE_BUTTON.MIDDLE) {\n this._state = this._state | this.mouseButtons.middle;\n }\n if ((event.buttons & MOUSE_BUTTON.RIGHT) === MOUSE_BUTTON.RIGHT) {\n this._state = this._state | this.mouseButtons.right;\n }\n }\n this.dispatchEvent({ type: 'controlstart' });\n };\n const dragging = () => {\n if (!this._enabled)\n return;\n extractClientCoordFromEvent(this._activePointers, _v2);\n // When pointer lock is enabled clientX, clientY, screenX, and screenY remain 0.\n // If pointer lock is enabled, use the Delta directory, and assume active-pointer is not multiple.\n const isPointerLockActive = this._domElement && document.pointerLockElement === this._domElement;\n const deltaX = isPointerLockActive ? -this._activePointers[0].deltaX : lastDragPosition.x - _v2.x;\n const deltaY = isPointerLockActive ? -this._activePointers[0].deltaY : lastDragPosition.y - _v2.y;\n lastDragPosition.copy(_v2);\n if ((this._state & ACTION.ROTATE) === ACTION.ROTATE ||\n (this._state & ACTION.TOUCH_ROTATE) === ACTION.TOUCH_ROTATE ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE ||\n (this._state & ACTION.TOUCH_ZOOM_ROTATE) === ACTION.TOUCH_ZOOM_ROTATE) {\n this._rotateInternal(deltaX, deltaY);\n }\n if ((this._state & ACTION.DOLLY) === ACTION.DOLLY ||\n (this._state & ACTION.ZOOM) === ACTION.ZOOM) {\n const dollyX = this.dollyToCursor ? (dragStartPosition.x - this._elementRect.x) / this._elementRect.width * 2 - 1 : 0;\n const dollyY = this.dollyToCursor ? (dragStartPosition.y - this._elementRect.y) / this._elementRect.height * -2 + 1 : 0;\n (this._state & ACTION.DOLLY) === ACTION.DOLLY ?\n this._dollyInternal(deltaY * TOUCH_DOLLY_FACTOR, dollyX, dollyY) :\n this._zoomInternal(deltaY * TOUCH_DOLLY_FACTOR, dollyX, dollyY);\n }\n if ((this._state & ACTION.TOUCH_DOLLY) === ACTION.TOUCH_DOLLY ||\n (this._state & ACTION.TOUCH_ZOOM) === ACTION.TOUCH_ZOOM ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_ZOOM_TRUCK) === ACTION.TOUCH_ZOOM_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET ||\n (this._state & ACTION.TOUCH_ZOOM_OFFSET) === ACTION.TOUCH_ZOOM_OFFSET ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE ||\n (this._state & ACTION.TOUCH_ZOOM_ROTATE) === ACTION.TOUCH_ZOOM_ROTATE) {\n const dx = _v2.x - this._activePointers[1].clientX;\n const dy = _v2.y - this._activePointers[1].clientY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const dollyDelta = dollyStart.y - distance;\n dollyStart.set(0, distance);\n const dollyX = this.dollyToCursor ? (lastDragPosition.x - this._elementRect.x) / this._elementRect.width * 2 - 1 : 0;\n const dollyY = this.dollyToCursor ? (lastDragPosition.y - this._elementRect.y) / this._elementRect.height * -2 + 1 : 0;\n (this._state & ACTION.TOUCH_DOLLY) === ACTION.TOUCH_DOLLY ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET ?\n this._dollyInternal(dollyDelta * TOUCH_DOLLY_FACTOR, dollyX, dollyY) :\n this._zoomInternal(dollyDelta * TOUCH_DOLLY_FACTOR, dollyX, dollyY);\n }\n if ((this._state & ACTION.TRUCK) === ACTION.TRUCK ||\n (this._state & ACTION.TOUCH_TRUCK) === ACTION.TOUCH_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_ZOOM_TRUCK) === ACTION.TOUCH_ZOOM_TRUCK) {\n this._truckInternal(deltaX, deltaY, false);\n }\n if ((this._state & ACTION.OFFSET) === ACTION.OFFSET ||\n (this._state & ACTION.TOUCH_OFFSET) === ACTION.TOUCH_OFFSET ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET ||\n (this._state & ACTION.TOUCH_ZOOM_OFFSET) === ACTION.TOUCH_ZOOM_OFFSET) {\n this._truckInternal(deltaX, deltaY, true);\n }\n this.dispatchEvent({ type: 'control' });\n };\n const endDragging = () => {\n extractClientCoordFromEvent(this._activePointers, _v2);\n lastDragPosition.copy(_v2);\n if (this._activePointers.length === 0 && this._domElement) {\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('touchmove', onTouchMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('touchend', onTouchEnd);\n this.dispatchEvent({ type: 'controlend' });\n }\n };\n this._addAllEventListeners = (domElement) => {\n this._domElement = domElement;\n this._domElement.style.touchAction = 'none';\n this._domElement.style.userSelect = 'none';\n this._domElement.style.webkitUserSelect = 'none';\n this._domElement.addEventListener('pointerdown', onPointerDown);\n isPointerEventsNotSupported && this._domElement.addEventListener('mousedown', onMouseDown);\n isPointerEventsNotSupported && this._domElement.addEventListener('touchstart', onTouchStart);\n this._domElement.addEventListener('pointercancel', onPointerUp);\n this._domElement.addEventListener('wheel', onMouseWheel, { passive: false });\n this._domElement.addEventListener('contextmenu', onContextMenu);\n };\n this._removeAllEventListeners = () => {\n if (!this._domElement)\n return;\n this._domElement.removeEventListener('pointerdown', onPointerDown);\n this._domElement.removeEventListener('mousedown', onMouseDown);\n this._domElement.removeEventListener('touchstart', onTouchStart);\n this._domElement.removeEventListener('pointercancel', onPointerUp);\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener#matching_event_listeners_for_removal\n // > it's probably wise to use the same values used for the call to `addEventListener()` when calling `removeEventListener()`\n // see https://github.com/microsoft/TypeScript/issues/32912#issuecomment-522142969\n // eslint-disable-next-line no-undef\n this._domElement.removeEventListener('wheel', onMouseWheel, { passive: false });\n this._domElement.removeEventListener('contextmenu', onContextMenu);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('mousemove', onMouseMove);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('touchmove', onTouchMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n this._domElement.ownerDocument.removeEventListener('mouseup', onMouseUp);\n this._domElement.ownerDocument.removeEventListener('touchend', onTouchEnd);\n };\n this.cancel = () => {\n if (this._state === ACTION.NONE)\n return;\n this._state = ACTION.NONE;\n this._activePointers.length = 0;\n endDragging();\n };\n if (domElement)\n this.connect(domElement);\n this.update(0);\n }\n /**\n * The camera to be controlled\n * @category Properties\n */\n get camera() {\n return this._camera;\n }\n set camera(camera) {\n this._camera = camera;\n this.updateCameraUp();\n this._camera.updateProjectionMatrix();\n this._updateNearPlaneCorners();\n this._needsUpdate = true;\n }\n /**\n * Whether or not the controls are enabled.\n * `false` to disable user dragging/touch-move, but all methods works.\n * @category Properties\n */\n get enabled() {\n return this._enabled;\n }\n set enabled(enabled) {\n if (!this._domElement)\n return;\n this._enabled = enabled;\n if (enabled) {\n this._domElement.style.touchAction = 'none';\n this._domElement.style.userSelect = 'none';\n this._domElement.style.webkitUserSelect = 'none';\n }\n else {\n this.cancel();\n this._domElement.style.touchAction = '';\n this._domElement.style.userSelect = '';\n this._domElement.style.webkitUserSelect = '';\n }\n }\n /**\n * Returns `true` if the controls are active updating.\n * readonly value.\n * @category Properties\n */\n get active() {\n return !this._hasRested;\n }\n /**\n * Getter for the current `ACTION`.\n * readonly value.\n * @category Properties\n */\n get currentAction() {\n return this._state;\n }\n /**\n * get/set Current distance.\n * @category Properties\n */\n get distance() {\n return this._spherical.radius;\n }\n set distance(distance) {\n if (this._spherical.radius === distance &&\n this._sphericalEnd.radius === distance)\n return;\n this._spherical.radius = distance;\n this._sphericalEnd.radius = distance;\n this._needsUpdate = true;\n }\n // horizontal angle\n /**\n * get/set the azimuth angle (horizontal) in radians.\n * Every 360 degrees turn is added to `.azimuthAngle` value, which is accumulative.\n * @category Properties\n */\n get azimuthAngle() {\n return this._spherical.theta;\n }\n set azimuthAngle(azimuthAngle) {\n if (this._spherical.theta === azimuthAngle &&\n this._sphericalEnd.theta === azimuthAngle)\n return;\n this._spherical.theta = azimuthAngle;\n this._sphericalEnd.theta = azimuthAngle;\n this._needsUpdate = true;\n }\n // vertical angle\n /**\n * get/set the polar angle (vertical) in radians.\n * @category Properties\n */\n get polarAngle() {\n return this._spherical.phi;\n }\n set polarAngle(polarAngle) {\n if (this._spherical.phi === polarAngle &&\n this._sphericalEnd.phi === polarAngle)\n return;\n this._spherical.phi = polarAngle;\n this._sphericalEnd.phi = polarAngle;\n this._needsUpdate = true;\n }\n /**\n * Whether camera position should be enclosed in the boundary or not.\n * @category Properties\n */\n get boundaryEnclosesCamera() {\n return this._boundaryEnclosesCamera;\n }\n set boundaryEnclosesCamera(boundaryEnclosesCamera) {\n this._boundaryEnclosesCamera = boundaryEnclosesCamera;\n this._needsUpdate = true;\n }\n /**\n * Adds the specified event listener.\n * Applicable event types (which is `K`) are:\n * | Event name | Timing |\n * | ------------------- | ------ |\n * | `'controlstart'` | When the user starts to control the camera via mouse / touches. ¹ |\n * | `'control'` | When the user controls the camera (dragging). |\n * | `'controlend'` | When the user ends to control the camera. ¹ |\n * | `'transitionstart'` | When any kind of transition starts, either user control or using a method with `enableTransition = true` |\n * | `'update'` | When the camera position is updated. |\n * | `'wake'` | When the camera starts moving. |\n * | `'rest'` | When the camera movement is below `.restThreshold` ². |\n * | `'sleep'` | When the camera end moving. |\n *\n * 1. `mouseButtons.wheel` (Mouse wheel control) does not emit `'controlstart'` and `'controlend'`. `mouseButtons.wheel` uses scroll-event internally, and scroll-event happens intermittently. That means \"start\" and \"end\" cannot be detected.\n * 2. Due to damping, `sleep` will usually fire a few seconds after the camera _appears_ to have stopped moving. If you want to do something (e.g. enable UI, perform another transition) at the point when the camera has stopped, you probably want the `rest` event. This can be fine tuned using the `.restThreshold` parameter. See the [Rest and Sleep Example](https://yomotsu.github.io/camera-controls/examples/rest-and-sleep.html).\n *\n * e.g.\n * ```\n * cameraControl.addEventListener( 'controlstart', myCallbackFunction );\n * ```\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n addEventListener(type, listener) {\n super.addEventListener(type, listener);\n }\n /**\n * Removes the specified event listener\n * e.g.\n * ```\n * cameraControl.addEventListener( 'controlstart', myCallbackFunction );\n * ```\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n removeEventListener(type, listener) {\n super.removeEventListener(type, listener);\n }\n /**\n * Rotate azimuthal angle(horizontal) and polar angle(vertical).\n * Every value is added to the current value.\n * @param azimuthAngle Azimuth rotate angle. In radian.\n * @param polarAngle Polar rotate angle. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotate(azimuthAngle, polarAngle, enableTransition = false) {\n return this.rotateTo(this._sphericalEnd.theta + azimuthAngle, this._sphericalEnd.phi + polarAngle, enableTransition);\n }\n /**\n * Rotate azimuthal angle(horizontal) to the given angle and keep the same polar angle(vertical) target.\n *\n * e.g.\n * ```\n * cameraControls.rotateAzimuthTo( 30 * THREE.MathUtils.DEG2RAD, true );\n * ```\n * @param azimuthAngle Azimuth rotate angle. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotateAzimuthTo(azimuthAngle, enableTransition = false) {\n return this.rotateTo(azimuthAngle, this._sphericalEnd.phi, enableTransition);\n }\n /**\n * Rotate polar angle(vertical) to the given angle and keep the same azimuthal angle(horizontal) target.\n *\n * e.g.\n * ```\n * cameraControls.rotatePolarTo( 30 * THREE.MathUtils.DEG2RAD, true );\n * ```\n * @param polarAngle Polar rotate angle. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotatePolarTo(polarAngle, enableTransition = false) {\n return this.rotateTo(this._sphericalEnd.theta, polarAngle, enableTransition);\n }\n /**\n * Rotate azimuthal angle(horizontal) and polar angle(vertical) to the given angle.\n * Camera view will rotate over the orbit pivot absolutely:\n *\n * azimuthAngle\n * ```\n * 0º\n * \\\n * 90º -----+----- -90º\n * \\\n * 180º\n * ```\n * | direction | angle |\n * | --------- | ---------------------- |\n * | front | 0º |\n * | left | 90º (`Math.PI / 2`) |\n * | right | -90º (`- Math.PI / 2`) |\n * | back | 180º (`Math.PI`) |\n *\n * polarAngle\n * ```\n * 180º\n * |\n * 90º\n * |\n * 0º\n * ```\n * | direction | angle |\n * | -------------------- | ---------------------- |\n * | top/sky | 180º (`Math.PI`) |\n * | horizontal from view | 90º (`Math.PI / 2`) |\n * | bottom/floor | 0º |\n *\n * @param azimuthAngle Azimuth rotate angle to. In radian.\n * @param polarAngle Polar rotate angle to. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotateTo(azimuthAngle, polarAngle, enableTransition = false) {\n const theta = THREE.MathUtils.clamp(azimuthAngle, this.minAzimuthAngle, this.maxAzimuthAngle);\n const phi = THREE.MathUtils.clamp(polarAngle, this.minPolarAngle, this.maxPolarAngle);\n this._sphericalEnd.theta = theta;\n this._sphericalEnd.phi = phi;\n this._sphericalEnd.makeSafe();\n this._needsUpdate = true;\n if (!enableTransition) {\n this._spherical.theta = this._sphericalEnd.theta;\n this._spherical.phi = this._sphericalEnd.phi;\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._spherical.theta, this._sphericalEnd.theta, this.restThreshold) &&\n approxEquals(this._spherical.phi, this._sphericalEnd.phi, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Dolly in/out camera position.\n * @param distance Distance of dollyIn. Negative number for dollyOut.\n * @param enableTransition Whether to move smoothly or immediately.\n * @category Methods\n */\n dolly(distance, enableTransition = false) {\n return this.dollyTo(this._sphericalEnd.radius - distance, enableTransition);\n }\n /**\n * Dolly in/out camera position to given distance.\n * @param distance Distance of dolly.\n * @param enableTransition Whether to move smoothly or immediately.\n * @category Methods\n */\n dollyTo(distance, enableTransition = false) {\n const lastRadius = this._sphericalEnd.radius;\n const newRadius = THREE.MathUtils.clamp(distance, this.minDistance, this.maxDistance);\n const hasCollider = this.colliderMeshes.length >= 1;\n if (hasCollider) {\n const maxDistanceByCollisionTest = this._collisionTest();\n const isCollided = approxEquals(maxDistanceByCollisionTest, this._spherical.radius);\n const isDollyIn = lastRadius > newRadius;\n if (!isDollyIn && isCollided)\n return Promise.resolve();\n this._sphericalEnd.radius = Math.min(newRadius, maxDistanceByCollisionTest);\n }\n else {\n this._sphericalEnd.radius = newRadius;\n }\n this._needsUpdate = true;\n if (!enableTransition) {\n this._spherical.radius = this._sphericalEnd.radius;\n }\n const resolveImmediately = !enableTransition || approxEquals(this._spherical.radius, this._sphericalEnd.radius, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Zoom in/out camera. The value is added to camera zoom.\n * Limits set with `.minZoom` and `.maxZoom`\n * @param zoomStep zoom scale\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n zoom(zoomStep, enableTransition = false) {\n return this.zoomTo(this._zoomEnd + zoomStep, enableTransition);\n }\n /**\n * Zoom in/out camera to given scale. The value overwrites camera zoom.\n * Limits set with .minZoom and .maxZoom\n * @param zoom\n * @param enableTransition\n * @category Methods\n */\n zoomTo(zoom, enableTransition = false) {\n this._zoomEnd = THREE.MathUtils.clamp(zoom, this.minZoom, this.maxZoom);\n this._needsUpdate = true;\n if (!enableTransition) {\n this._zoom = this._zoomEnd;\n }\n const resolveImmediately = !enableTransition || approxEquals(this._zoom, this._zoomEnd, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * @deprecated `pan()` has been renamed to `truck()`\n * @category Methods\n */\n pan(x, y, enableTransition = false) {\n console.warn('`pan` has been renamed to `truck`');\n return this.truck(x, y, enableTransition);\n }\n /**\n * Truck and pedestal camera using current azimuthal angle\n * @param x Horizontal translate amount\n * @param y Vertical translate amount\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n truck(x, y, enableTransition = false) {\n this._camera.updateMatrix();\n _xColumn.setFromMatrixColumn(this._camera.matrix, 0);\n _yColumn.setFromMatrixColumn(this._camera.matrix, 1);\n _xColumn.multiplyScalar(x);\n _yColumn.multiplyScalar(-y);\n const offset = _v3A.copy(_xColumn).add(_yColumn);\n const to = _v3B.copy(this._targetEnd).add(offset);\n return this.moveTo(to.x, to.y, to.z, enableTransition);\n }\n /**\n * Move forward / backward.\n * @param distance Amount to move forward / backward. Negative value to move backward\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n forward(distance, enableTransition = false) {\n _v3A.setFromMatrixColumn(this._camera.matrix, 0);\n _v3A.crossVectors(this._camera.up, _v3A);\n _v3A.multiplyScalar(distance);\n const to = _v3B.copy(this._targetEnd).add(_v3A);\n return this.moveTo(to.x, to.y, to.z, enableTransition);\n }\n /**\n * Move target position to given point.\n * @param x x coord to move center position\n * @param y y coord to move center position\n * @param z z coord to move center position\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n moveTo(x, y, z, enableTransition = false) {\n const offset = _v3A.set(x, y, z).sub(this._targetEnd);\n this._encloseToBoundary(this._targetEnd, offset, this.boundaryFriction);\n this._needsUpdate = true;\n if (!enableTransition) {\n this._target.copy(this._targetEnd);\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._target.x, this._targetEnd.x, this.restThreshold) &&\n approxEquals(this._target.y, this._targetEnd.y, this.restThreshold) &&\n approxEquals(this._target.z, this._targetEnd.z, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Fit the viewport to the box or the bounding box of the object, using the nearest axis. paddings are in unit.\n * set `cover: true` to fill enter screen.\n * e.g.\n * ```\n * cameraControls.fitToBox( myMesh );\n * ```\n * @param box3OrObject Axis aligned bounding box to fit the view.\n * @param enableTransition Whether to move smoothly or immediately.\n * @param options | `` { cover: boolean, paddingTop: number, paddingLeft: number, paddingBottom: number, paddingRight: number }\n * @returns Transition end promise\n * @category Methods\n */\n fitToBox(box3OrObject, enableTransition, { cover = false, paddingLeft = 0, paddingRight = 0, paddingBottom = 0, paddingTop = 0 } = {}) {\n const promises = [];\n const aabb = box3OrObject.isBox3\n ? _box3A.copy(box3OrObject)\n : _box3A.setFromObject(box3OrObject);\n if (aabb.isEmpty()) {\n console.warn('camera-controls: fitTo() cannot be used with an empty box. Aborting');\n Promise.resolve();\n }\n // round to closest axis ( forward | backward | right | left | top | bottom )\n const theta = roundToStep(this._sphericalEnd.theta, PI_HALF);\n const phi = roundToStep(this._sphericalEnd.phi, PI_HALF);\n promises.push(this.rotateTo(theta, phi, enableTransition));\n const normal = _v3A.setFromSpherical(this._sphericalEnd).normalize();\n const rotation = _quaternionA.setFromUnitVectors(normal, _AXIS_Z);\n const viewFromPolar = approxEquals(Math.abs(normal.y), 1);\n if (viewFromPolar) {\n rotation.multiply(_quaternionB.setFromAxisAngle(_AXIS_Y, theta));\n }\n rotation.multiply(this._yAxisUpSpaceInverse);\n // make oriented bounding box\n const bb = _box3B.makeEmpty();\n // left bottom back corner\n _v3B.copy(aabb.min).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right bottom back corner\n _v3B.copy(aabb.min).setX(aabb.max.x).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // left top back corner\n _v3B.copy(aabb.min).setY(aabb.max.y).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right top back corner\n _v3B.copy(aabb.max).setZ(aabb.min.z).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // left bottom front corner\n _v3B.copy(aabb.min).setZ(aabb.max.z).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right bottom front corner\n _v3B.copy(aabb.max).setY(aabb.min.y).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // left top front corner\n _v3B.copy(aabb.max).setX(aabb.min.x).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right top front corner\n _v3B.copy(aabb.max).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // add padding\n bb.min.x -= paddingLeft;\n bb.min.y -= paddingBottom;\n bb.max.x += paddingRight;\n bb.max.y += paddingTop;\n rotation.setFromUnitVectors(_AXIS_Z, normal);\n if (viewFromPolar) {\n rotation.premultiply(_quaternionB.invert());\n }\n rotation.premultiply(this._yAxisUpSpace);\n const bbSize = bb.getSize(_v3A);\n const center = bb.getCenter(_v3B).applyQuaternion(rotation);\n if (isPerspectiveCamera(this._camera)) {\n const distance = this.getDistanceToFitBox(bbSize.x, bbSize.y, bbSize.z, cover);\n promises.push(this.moveTo(center.x, center.y, center.z, enableTransition));\n promises.push(this.dollyTo(distance, enableTransition));\n promises.push(this.setFocalOffset(0, 0, 0, enableTransition));\n }\n else if (isOrthographicCamera(this._camera)) {\n const camera = this._camera;\n const width = camera.right - camera.left;\n const height = camera.top - camera.bottom;\n const zoom = cover ? Math.max(width / bbSize.x, height / bbSize.y) : Math.min(width / bbSize.x, height / bbSize.y);\n promises.push(this.moveTo(center.x, center.y, center.z, enableTransition));\n promises.push(this.zoomTo(zoom, enableTransition));\n promises.push(this.setFocalOffset(0, 0, 0, enableTransition));\n }\n return Promise.all(promises);\n }\n /**\n * Fit the viewport to the sphere or the bounding sphere of the object.\n * @param sphereOrMesh\n * @param enableTransition\n * @category Methods\n */\n fitToSphere(sphereOrMesh, enableTransition) {\n const promises = [];\n const isSphere = sphereOrMesh instanceof THREE.Sphere;\n const boundingSphere = isSphere ?\n _sphere.copy(sphereOrMesh) :\n createBoundingSphere(sphereOrMesh, _sphere);\n promises.push(this.moveTo(boundingSphere.center.x, boundingSphere.center.y, boundingSphere.center.z, enableTransition));\n if (isPerspectiveCamera(this._camera)) {\n const distanceToFit = this.getDistanceToFitSphere(boundingSphere.radius);\n promises.push(this.dollyTo(distanceToFit, enableTransition));\n }\n else if (isOrthographicCamera(this._camera)) {\n const width = this._camera.right - this._camera.left;\n const height = this._camera.top - this._camera.bottom;\n const diameter = 2 * boundingSphere.radius;\n const zoom = Math.min(width / diameter, height / diameter);\n promises.push(this.zoomTo(zoom, enableTransition));\n }\n promises.push(this.setFocalOffset(0, 0, 0, enableTransition));\n return Promise.all(promises);\n }\n /**\n * Make an orbit with given points.\n * @param positionX\n * @param positionY\n * @param positionZ\n * @param targetX\n * @param targetY\n * @param targetZ\n * @param enableTransition\n * @category Methods\n */\n setLookAt(positionX, positionY, positionZ, targetX, targetY, targetZ, enableTransition = false) {\n const target = _v3B.set(targetX, targetY, targetZ);\n const position = _v3A.set(positionX, positionY, positionZ);\n this._targetEnd.copy(target);\n this._sphericalEnd.setFromVector3(position.sub(target).applyQuaternion(this._yAxisUpSpace));\n this.normalizeRotations();\n this._needsUpdate = true;\n if (!enableTransition) {\n this._target.copy(this._targetEnd);\n this._spherical.copy(this._sphericalEnd);\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._target.x, this._targetEnd.x, this.restThreshold) &&\n approxEquals(this._target.y, this._targetEnd.y, this.restThreshold) &&\n approxEquals(this._target.z, this._targetEnd.z, this.restThreshold) &&\n approxEquals(this._spherical.theta, this._sphericalEnd.theta, this.restThreshold) &&\n approxEquals(this._spherical.phi, this._sphericalEnd.phi, this.restThreshold) &&\n approxEquals(this._spherical.radius, this._sphericalEnd.radius, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Similar to setLookAt, but it interpolates between two states.\n * @param positionAX\n * @param positionAY\n * @param positionAZ\n * @param targetAX\n * @param targetAY\n * @param targetAZ\n * @param positionBX\n * @param positionBY\n * @param positionBZ\n * @param targetBX\n * @param targetBY\n * @param targetBZ\n * @param t\n * @param enableTransition\n * @category Methods\n */\n lerpLookAt(positionAX, positionAY, positionAZ, targetAX, targetAY, targetAZ, positionBX, positionBY, positionBZ, targetBX, targetBY, targetBZ, t, enableTransition = false) {\n const targetA = _v3A.set(targetAX, targetAY, targetAZ);\n const positionA = _v3B.set(positionAX, positionAY, positionAZ);\n _sphericalA.setFromVector3(positionA.sub(targetA).applyQuaternion(this._yAxisUpSpace));\n const targetB = _v3C.set(targetBX, targetBY, targetBZ);\n const positionB = _v3B.set(positionBX, positionBY, positionBZ);\n _sphericalB.setFromVector3(positionB.sub(targetB).applyQuaternion(this._yAxisUpSpace));\n this._targetEnd.copy(targetA.lerp(targetB, t)); // tricky\n const deltaTheta = _sphericalB.theta - _sphericalA.theta;\n const deltaPhi = _sphericalB.phi - _sphericalA.phi;\n const deltaRadius = _sphericalB.radius - _sphericalA.radius;\n this._sphericalEnd.set(_sphericalA.radius + deltaRadius * t, _sphericalA.phi + deltaPhi * t, _sphericalA.theta + deltaTheta * t);\n this.normalizeRotations();\n this._needsUpdate = true;\n if (!enableTransition) {\n this._target.copy(this._targetEnd);\n this._spherical.copy(this._sphericalEnd);\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._target.x, this._targetEnd.x, this.restThreshold) &&\n approxEquals(this._target.y, this._targetEnd.y, this.restThreshold) &&\n approxEquals(this._target.z, this._targetEnd.z, this.restThreshold) &&\n approxEquals(this._spherical.theta, this._sphericalEnd.theta, this.restThreshold) &&\n approxEquals(this._spherical.phi, this._sphericalEnd.phi, this.restThreshold) &&\n approxEquals(this._spherical.radius, this._sphericalEnd.radius, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * setLookAt without target, keep gazing at the current target\n * @param positionX\n * @param positionY\n * @param positionZ\n * @param enableTransition\n * @category Methods\n */\n setPosition(positionX, positionY, positionZ, enableTransition = false) {\n return this.setLookAt(positionX, positionY, positionZ, this._targetEnd.x, this._targetEnd.y, this._targetEnd.z, enableTransition);\n }\n /**\n * setLookAt without position, Stay still at the position.\n * @param targetX\n * @param targetY\n * @param targetZ\n * @param enableTransition\n * @category Methods\n */\n setTarget(targetX, targetY, targetZ, enableTransition = false) {\n const pos = this.getPosition(_v3A);\n const promise = this.setLookAt(pos.x, pos.y, pos.z, targetX, targetY, targetZ, enableTransition);\n // see https://github.com/yomotsu/camera-controls/issues/335\n this._sphericalEnd.phi = THREE.MathUtils.clamp(this.polarAngle, this.minPolarAngle, this.maxPolarAngle);\n return promise;\n }\n /**\n * Set focal offset using the screen parallel coordinates. z doesn't affect in Orthographic as with Dolly.\n * @param x\n * @param y\n * @param z\n * @param enableTransition\n * @category Methods\n */\n setFocalOffset(x, y, z, enableTransition = false) {\n this._focalOffsetEnd.set(x, y, z);\n this._needsUpdate = true;\n if (!enableTransition) {\n this._focalOffset.copy(this._focalOffsetEnd);\n }\n this._affectOffset =\n !approxZero(x) ||\n !approxZero(y) ||\n !approxZero(z);\n const resolveImmediately = !enableTransition ||\n approxEquals(this._focalOffset.x, this._focalOffsetEnd.x, this.restThreshold) &&\n approxEquals(this._focalOffset.y, this._focalOffsetEnd.y, this.restThreshold) &&\n approxEquals(this._focalOffset.z, this._focalOffsetEnd.z, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Set orbit point without moving the camera.\n * SHOULD NOT RUN DURING ANIMATIONS. `setOrbitPoint()` will immediately fix the positions.\n * @param targetX\n * @param targetY\n * @param targetZ\n * @category Methods\n */\n setOrbitPoint(targetX, targetY, targetZ) {\n this._camera.updateMatrixWorld();\n _xColumn.setFromMatrixColumn(this._camera.matrixWorldInverse, 0);\n _yColumn.setFromMatrixColumn(this._camera.matrixWorldInverse, 1);\n _zColumn.setFromMatrixColumn(this._camera.matrixWorldInverse, 2);\n const position = _v3A.set(targetX, targetY, targetZ);\n const distance = position.distanceTo(this._camera.position);\n const cameraToPoint = position.sub(this._camera.position);\n _xColumn.multiplyScalar(cameraToPoint.x);\n _yColumn.multiplyScalar(cameraToPoint.y);\n _zColumn.multiplyScalar(cameraToPoint.z);\n _v3A.copy(_xColumn).add(_yColumn).add(_zColumn);\n _v3A.z = _v3A.z + distance;\n this.dollyTo(distance, false);\n this.setFocalOffset(-_v3A.x, _v3A.y, -_v3A.z, false);\n this.moveTo(targetX, targetY, targetZ, false);\n }\n /**\n * Set the boundary box that encloses the target of the camera. box3 is in THREE.Box3\n * @param box3\n * @category Methods\n */\n setBoundary(box3) {\n if (!box3) {\n this._boundary.min.set(-Infinity, -Infinity, -Infinity);\n this._boundary.max.set(Infinity, Infinity, Infinity);\n this._needsUpdate = true;\n return;\n }\n this._boundary.copy(box3);\n this._boundary.clampPoint(this._targetEnd, this._targetEnd);\n this._needsUpdate = true;\n }\n /**\n * Set (or unset) the current viewport.\n * Set this when you want to use renderer viewport and .dollyToCursor feature at the same time.\n * @param viewportOrX\n * @param y\n * @param width\n * @param height\n * @category Methods\n */\n setViewport(viewportOrX, y, width, height) {\n if (viewportOrX === null) { // null\n this._viewport = null;\n return;\n }\n this._viewport = this._viewport || new THREE.Vector4();\n if (typeof viewportOrX === 'number') { // number\n this._viewport.set(viewportOrX, y, width, height);\n }\n else { // Vector4\n this._viewport.copy(viewportOrX);\n }\n }\n /**\n * Calculate the distance to fit the box.\n * @param width box width\n * @param height box height\n * @param depth box depth\n * @returns distance\n * @category Methods\n */\n getDistanceToFitBox(width, height, depth, cover = false) {\n if (notSupportedInOrthographicCamera(this._camera, 'getDistanceToFitBox'))\n return this._spherical.radius;\n const boundingRectAspect = width / height;\n const fov = this._camera.getEffectiveFOV() * THREE.MathUtils.DEG2RAD;\n const aspect = this._camera.aspect;\n const heightToFit = (cover ? boundingRectAspect > aspect : boundingRectAspect < aspect) ? height : width / aspect;\n return heightToFit * 0.5 / Math.tan(fov * 0.5) + depth * 0.5;\n }\n /**\n * Calculate the distance to fit the sphere.\n * @param radius sphere radius\n * @returns distance\n * @category Methods\n */\n getDistanceToFitSphere(radius) {\n if (notSupportedInOrthographicCamera(this._camera, 'getDistanceToFitSphere'))\n return this._spherical.radius;\n // https://stackoverflow.com/a/44849975\n const vFOV = this._camera.getEffectiveFOV() * THREE.MathUtils.DEG2RAD;\n const hFOV = Math.atan(Math.tan(vFOV * 0.5) * this._camera.aspect) * 2;\n const fov = 1 < this._camera.aspect ? vFOV : hFOV;\n return radius / (Math.sin(fov * 0.5));\n }\n /**\n * Returns its current gazing target, which is the center position of the orbit.\n * @param out current gazing target\n * @category Methods\n */\n getTarget(out) {\n const _out = !!out && out.isVector3 ? out : new THREE.Vector3();\n return _out.copy(this._targetEnd);\n }\n /**\n * Returns its current position.\n * @param out current position\n * @category Methods\n */\n getPosition(out) {\n const _out = !!out && out.isVector3 ? out : new THREE.Vector3();\n return _out.setFromSpherical(this._sphericalEnd).applyQuaternion(this._yAxisUpSpaceInverse).add(this._targetEnd);\n }\n /**\n * Returns its current focal offset, which is how much the camera appears to be translated in screen parallel coordinates.\n * @param out current focal offset\n * @category Methods\n */\n getFocalOffset(out) {\n const _out = !!out && out.isVector3 ? out : new THREE.Vector3();\n return _out.copy(this._focalOffsetEnd);\n }\n /**\n * Normalize camera azimuth angle rotation between 0 and 360 degrees.\n * @category Methods\n */\n normalizeRotations() {\n this._sphericalEnd.theta = this._sphericalEnd.theta % PI_2;\n if (this._sphericalEnd.theta < 0)\n this._sphericalEnd.theta += PI_2;\n this._spherical.theta += PI_2 * Math.round((this._sphericalEnd.theta - this._spherical.theta) / PI_2);\n }\n /**\n * Reset all rotation and position to defaults.\n * @param enableTransition\n * @category Methods\n */\n reset(enableTransition = false) {\n const promises = [\n this.setLookAt(this._position0.x, this._position0.y, this._position0.z, this._target0.x, this._target0.y, this._target0.z, enableTransition),\n this.setFocalOffset(this._focalOffset0.x, this._focalOffset0.y, this._focalOffset0.z, enableTransition),\n this.zoomTo(this._zoom0, enableTransition),\n ];\n return Promise.all(promises);\n }\n /**\n * Set current camera position as the default position.\n * @category Methods\n */\n saveState() {\n this.getTarget(this._target0);\n this.getPosition(this._position0);\n this._zoom0 = this._zoom;\n this._focalOffset0.copy(this._focalOffset);\n }\n /**\n * Sync camera-up direction.\n * When camera-up vector is changed, `.updateCameraUp()` must be called.\n * @category Methods\n */\n updateCameraUp() {\n this._yAxisUpSpace.setFromUnitVectors(this._camera.up, _AXIS_Y);\n quatInvertCompat(this._yAxisUpSpaceInverse.copy(this._yAxisUpSpace));\n }\n /**\n * Update camera position and directions.\n * This should be called in your tick loop every time, and returns true if re-rendering is needed.\n * @param delta\n * @returns updated\n * @category Methods\n */\n update(delta) {\n const dampingFactor = this._state === ACTION.NONE ? this.dampingFactor : this.draggingDampingFactor;\n // The original THREE.OrbitControls assume 60 FPS fixed and does NOT rely on delta time.\n // (that must be a problem of the original one though)\n // To to emulate the speed of the original one under 60 FPS, multiply `60` to delta,\n // but ours are more flexible to any FPS unlike the original.\n const lerpRatio = Math.min(dampingFactor * delta * 60, 1);\n const deltaTheta = this._sphericalEnd.theta - this._spherical.theta;\n const deltaPhi = this._sphericalEnd.phi - this._spherical.phi;\n const deltaRadius = this._sphericalEnd.radius - this._spherical.radius;\n const deltaTarget = _deltaTarget.subVectors(this._targetEnd, this._target);\n const deltaOffset = _deltaOffset.subVectors(this._focalOffsetEnd, this._focalOffset);\n if (!approxZero(deltaTheta) ||\n !approxZero(deltaPhi) ||\n !approxZero(deltaRadius) ||\n !approxZero(deltaTarget.x) ||\n !approxZero(deltaTarget.y) ||\n !approxZero(deltaTarget.z) ||\n !approxZero(deltaOffset.x) ||\n !approxZero(deltaOffset.y) ||\n !approxZero(deltaOffset.z)) {\n this._spherical.set(this._spherical.radius + deltaRadius * lerpRatio, this._spherical.phi + deltaPhi * lerpRatio, this._spherical.theta + deltaTheta * lerpRatio);\n this._target.add(deltaTarget.multiplyScalar(lerpRatio));\n this._focalOffset.add(deltaOffset.multiplyScalar(lerpRatio));\n this._needsUpdate = true;\n }\n else {\n this._spherical.copy(this._sphericalEnd);\n this._target.copy(this._targetEnd);\n this._focalOffset.copy(this._focalOffsetEnd);\n }\n if (this._dollyControlAmount !== 0) {\n if (isPerspectiveCamera(this._camera)) {\n const camera = this._camera;\n const cameraDirection = _v3A.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).normalize().negate();\n const planeX = _v3B.copy(cameraDirection).cross(camera.up).normalize();\n if (planeX.lengthSq() === 0)\n planeX.x = 1.0;\n const planeY = _v3C.crossVectors(planeX, cameraDirection);\n const worldToScreen = this._sphericalEnd.radius * Math.tan(camera.getEffectiveFOV() * THREE.MathUtils.DEG2RAD * 0.5);\n const prevRadius = this._sphericalEnd.radius - this._dollyControlAmount;\n const lerpRatio = (prevRadius - this._sphericalEnd.radius) / this._sphericalEnd.radius;\n const cursor = _v3A.copy(this._targetEnd)\n .add(planeX.multiplyScalar(this._dollyControlCoord.x * worldToScreen * camera.aspect))\n .add(planeY.multiplyScalar(this._dollyControlCoord.y * worldToScreen));\n this._targetEnd.lerp(cursor, lerpRatio);\n }\n else if (isOrthographicCamera(this._camera)) {\n const camera = this._camera;\n const worldCursorPosition = _v3A.set(this._dollyControlCoord.x, this._dollyControlCoord.y, (camera.near + camera.far) / (camera.near - camera.far)).unproject(camera); //.sub( _v3B.set( this._focalOffset.x, this._focalOffset.y, 0 ) );\n const quaternion = _v3B.set(0, 0, -1).applyQuaternion(camera.quaternion);\n const cursor = _v3C.copy(worldCursorPosition).add(quaternion.multiplyScalar(-worldCursorPosition.dot(camera.up)));\n const prevZoom = this._zoom - this._dollyControlAmount;\n const lerpRatio = -(prevZoom - this._zoomEnd) / this._zoom;\n // find the \"distance\" (aka plane constant in three.js) of Plane\n // from a given position (this._targetEnd) and normal vector (cameraDirection)\n // https://www.maplesoft.com/support/help/maple/view.aspx?path=MathApps%2FEquationOfAPlaneNormal#bkmrk0\n const cameraDirection = _v3A.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).normalize().negate();\n const prevPlaneConstant = this._targetEnd.dot(cameraDirection);\n this._targetEnd.lerp(cursor, lerpRatio);\n const newPlaneConstant = this._targetEnd.dot(cameraDirection);\n // Pull back the camera depth that has moved, to be the camera stationary as zoom\n const pullBack = cameraDirection.multiplyScalar(newPlaneConstant - prevPlaneConstant);\n this._targetEnd.sub(pullBack);\n }\n this._target.copy(this._targetEnd);\n // target position may be moved beyond boundary.\n this._boundary.clampPoint(this._targetEnd, this._targetEnd);\n this._dollyControlAmount = 0;\n }\n // zoom\n const deltaZoom = this._zoomEnd - this._zoom;\n this._zoom += deltaZoom * lerpRatio;\n if (this._camera.zoom !== this._zoom) {\n if (approxZero(deltaZoom))\n this._zoom = this._zoomEnd;\n this._camera.zoom = this._zoom;\n this._camera.updateProjectionMatrix();\n this._updateNearPlaneCorners();\n this._needsUpdate = true;\n }\n // collision detection\n const maxDistance = this._collisionTest();\n this._spherical.radius = Math.min(this._spherical.radius, maxDistance);\n // decompose spherical to the camera position\n this._spherical.makeSafe();\n this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target);\n this._camera.lookAt(this._target);\n // set offset after the orbit movement\n if (this._affectOffset) {\n this._camera.updateMatrixWorld();\n _xColumn.setFromMatrixColumn(this._camera.matrix, 0);\n _yColumn.setFromMatrixColumn(this._camera.matrix, 1);\n _zColumn.setFromMatrixColumn(this._camera.matrix, 2);\n _xColumn.multiplyScalar(this._focalOffset.x);\n _yColumn.multiplyScalar(-this._focalOffset.y);\n _zColumn.multiplyScalar(this._focalOffset.z); // notice: z-offset will not affect in Orthographic.\n _v3A.copy(_xColumn).add(_yColumn).add(_zColumn);\n this._camera.position.add(_v3A);\n }\n if (this._boundaryEnclosesCamera) {\n this._encloseToBoundary(this._camera.position.copy(this._target), _v3A.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse), 1.0);\n }\n const updated = this._needsUpdate;\n if (updated && !this._updatedLastTime) {\n this._hasRested = false;\n this.dispatchEvent({ type: 'wake' });\n this.dispatchEvent({ type: 'update' });\n }\n else if (updated) {\n this.dispatchEvent({ type: 'update' });\n if (approxZero(deltaTheta, this.restThreshold) &&\n approxZero(deltaPhi, this.restThreshold) &&\n approxZero(deltaRadius, this.restThreshold) &&\n approxZero(deltaTarget.x, this.restThreshold) &&\n approxZero(deltaTarget.y, this.restThreshold) &&\n approxZero(deltaTarget.z, this.restThreshold) &&\n approxZero(deltaOffset.x, this.restThreshold) &&\n approxZero(deltaOffset.y, this.restThreshold) &&\n approxZero(deltaOffset.z, this.restThreshold) &&\n approxZero(deltaZoom, this.restThreshold) &&\n !this._hasRested) {\n this._hasRested = true;\n this.dispatchEvent({ type: 'rest' });\n }\n }\n else if (!updated && this._updatedLastTime) {\n this.dispatchEvent({ type: 'sleep' });\n }\n this._updatedLastTime = updated;\n this._needsUpdate = false;\n return updated;\n }\n /**\n * Get all state in JSON string\n * @category Methods\n */\n toJSON() {\n return JSON.stringify({\n enabled: this._enabled,\n minDistance: this.minDistance,\n maxDistance: infinityToMaxNumber(this.maxDistance),\n minZoom: this.minZoom,\n maxZoom: infinityToMaxNumber(this.maxZoom),\n minPolarAngle: this.minPolarAngle,\n maxPolarAngle: infinityToMaxNumber(this.maxPolarAngle),\n minAzimuthAngle: infinityToMaxNumber(this.minAzimuthAngle),\n maxAzimuthAngle: infinityToMaxNumber(this.maxAzimuthAngle),\n dampingFactor: this.dampingFactor,\n draggingDampingFactor: this.draggingDampingFactor,\n dollySpeed: this.dollySpeed,\n truckSpeed: this.truckSpeed,\n dollyToCursor: this.dollyToCursor,\n verticalDragToForward: this.verticalDragToForward,\n target: this._targetEnd.toArray(),\n position: _v3A.setFromSpherical(this._sphericalEnd).add(this._targetEnd).toArray(),\n zoom: this._zoomEnd,\n focalOffset: this._focalOffsetEnd.toArray(),\n target0: this._target0.toArray(),\n position0: this._position0.toArray(),\n zoom0: this._zoom0,\n focalOffset0: this._focalOffset0.toArray(),\n });\n }\n /**\n * Reproduce the control state with JSON. enableTransition is where anim or not in a boolean.\n * @param json\n * @param enableTransition\n * @category Methods\n */\n fromJSON(json, enableTransition = false) {\n const obj = JSON.parse(json);\n const position = _v3A.fromArray(obj.position);\n this.enabled = obj.enabled;\n this.minDistance = obj.minDistance;\n this.maxDistance = maxNumberToInfinity(obj.maxDistance);\n this.minZoom = obj.minZoom;\n this.maxZoom = maxNumberToInfinity(obj.maxZoom);\n this.minPolarAngle = obj.minPolarAngle;\n this.maxPolarAngle = maxNumberToInfinity(obj.maxPolarAngle);\n this.minAzimuthAngle = maxNumberToInfinity(obj.minAzimuthAngle);\n this.maxAzimuthAngle = maxNumberToInfinity(obj.maxAzimuthAngle);\n this.dampingFactor = obj.dampingFactor;\n this.draggingDampingFactor = obj.draggingDampingFactor;\n this.dollySpeed = obj.dollySpeed;\n this.truckSpeed = obj.truckSpeed;\n this.dollyToCursor = obj.dollyToCursor;\n this.verticalDragToForward = obj.verticalDragToForward;\n this._target0.fromArray(obj.target0);\n this._position0.fromArray(obj.position0);\n this._zoom0 = obj.zoom0;\n this._focalOffset0.fromArray(obj.focalOffset0);\n this.moveTo(obj.target[0], obj.target[1], obj.target[2], enableTransition);\n _sphericalA.setFromVector3(position.sub(this._targetEnd).applyQuaternion(this._yAxisUpSpace));\n this.rotateTo(_sphericalA.theta, _sphericalA.phi, enableTransition);\n this.zoomTo(obj.zoom, enableTransition);\n this.setFocalOffset(obj.focalOffset[0], obj.focalOffset[1], obj.focalOffset[2], enableTransition);\n this._needsUpdate = true;\n }\n /**\n * Attach all internal event handlers to enable drag control.\n * @category Methods\n */\n connect(domElement) {\n if (this._domElement) {\n console.warn('camera-controls is already connected.');\n return;\n }\n domElement.setAttribute('data-camera-controls-version', VERSION);\n this._addAllEventListeners(domElement);\n }\n /**\n * Detach all internal event handlers to disable drag control.\n */\n disconnect() {\n this._removeAllEventListeners();\n this._domElement = undefined;\n }\n /**\n * Dispose the cameraControls instance itself, remove all eventListeners.\n * @category Methods\n */\n dispose() {\n this.disconnect();\n if (this._domElement && 'setAttribute' in this._domElement)\n this._domElement.removeAttribute('data-camera-controls-version');\n }\n _findPointerById(pointerId) {\n // to support IE11 use some instead of Array#find (will be removed when IE11 is deprecated)\n let pointer = null;\n this._activePointers.some((activePointer) => {\n if (activePointer.pointerId === pointerId) {\n pointer = activePointer;\n return true;\n }\n return false;\n });\n return pointer;\n }\n _encloseToBoundary(position, offset, friction) {\n const offsetLength2 = offset.lengthSq();\n if (offsetLength2 === 0.0) { // sanity check\n return position;\n }\n // See: https://twitter.com/FMS_Cat/status/1106508958640988161\n const newTarget = _v3B.copy(offset).add(position); // target\n const clampedTarget = this._boundary.clampPoint(newTarget, _v3C); // clamped target\n const deltaClampedTarget = clampedTarget.sub(newTarget); // newTarget -> clampedTarget\n const deltaClampedTargetLength2 = deltaClampedTarget.lengthSq(); // squared length of deltaClampedTarget\n if (deltaClampedTargetLength2 === 0.0) { // when the position doesn't have to be clamped\n return position.add(offset);\n }\n else if (deltaClampedTargetLength2 === offsetLength2) { // when the position is completely stuck\n return position;\n }\n else if (friction === 0.0) {\n return position.add(offset).add(deltaClampedTarget);\n }\n else {\n const offsetFactor = 1.0 + friction * deltaClampedTargetLength2 / offset.dot(deltaClampedTarget);\n return position\n .add(_v3B.copy(offset).multiplyScalar(offsetFactor))\n .add(deltaClampedTarget.multiplyScalar(1.0 - friction));\n }\n }\n _updateNearPlaneCorners() {\n if (isPerspectiveCamera(this._camera)) {\n const camera = this._camera;\n const near = camera.near;\n const fov = camera.getEffectiveFOV() * THREE.MathUtils.DEG2RAD;\n const heightHalf = Math.tan(fov * 0.5) * near; // near plain half height\n const widthHalf = heightHalf * camera.aspect; // near plain half width\n this._nearPlaneCorners[0].set(-widthHalf, -heightHalf, 0);\n this._nearPlaneCorners[1].set(widthHalf, -heightHalf, 0);\n this._nearPlaneCorners[2].set(widthHalf, heightHalf, 0);\n this._nearPlaneCorners[3].set(-widthHalf, heightHalf, 0);\n }\n else if (isOrthographicCamera(this._camera)) {\n const camera = this._camera;\n const zoomInv = 1 / camera.zoom;\n const left = camera.left * zoomInv;\n const right = camera.right * zoomInv;\n const top = camera.top * zoomInv;\n const bottom = camera.bottom * zoomInv;\n this._nearPlaneCorners[0].set(left, top, 0);\n this._nearPlaneCorners[1].set(right, top, 0);\n this._nearPlaneCorners[2].set(right, bottom, 0);\n this._nearPlaneCorners[3].set(left, bottom, 0);\n }\n }\n // lateUpdate\n _collisionTest() {\n let distance = Infinity;\n const hasCollider = this.colliderMeshes.length >= 1;\n if (!hasCollider)\n return distance;\n if (notSupportedInOrthographicCamera(this._camera, '_collisionTest'))\n return distance;\n // divide by distance to normalize, lighter than `Vector3.prototype.normalize()`\n const direction = _v3A.setFromSpherical(this._spherical).divideScalar(this._spherical.radius);\n _rotationMatrix.lookAt(_ORIGIN, direction, this._camera.up);\n for (let i = 0; i < 4; i++) {\n const nearPlaneCorner = _v3B.copy(this._nearPlaneCorners[i]);\n nearPlaneCorner.applyMatrix4(_rotationMatrix);\n const origin = _v3C.addVectors(this._target, nearPlaneCorner);\n _raycaster.set(origin, direction);\n _raycaster.far = this._spherical.radius + 1;\n const intersects = _raycaster.intersectObjects(this.colliderMeshes);\n if (intersects.length !== 0 && intersects[0].distance < distance) {\n distance = intersects[0].distance;\n }\n }\n return distance;\n }\n /**\n * Get its client rect and package into given `DOMRect` .\n */\n _getClientRect(target) {\n if (!this._domElement)\n return;\n const rect = this._domElement.getBoundingClientRect();\n target.x = rect.left;\n target.y = rect.top;\n if (this._viewport) {\n target.x += this._viewport.x;\n target.y += rect.height - this._viewport.w - this._viewport.y;\n target.width = this._viewport.z;\n target.height = this._viewport.w;\n }\n else {\n target.width = rect.width;\n target.height = rect.height;\n }\n return target;\n }\n _createOnRestPromise(resolveImmediately) {\n if (resolveImmediately)\n return Promise.resolve();\n this._hasRested = false;\n this.dispatchEvent({ type: 'transitionstart' });\n return new Promise((resolve) => {\n const onResolve = () => {\n this.removeEventListener('rest', onResolve);\n resolve();\n };\n this.addEventListener('rest', onResolve);\n });\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _addAllEventListeners(_domElement) { }\n _removeAllEventListeners() { }\n}\nfunction createBoundingSphere(object3d, out) {\n const boundingSphere = out;\n const center = boundingSphere.center;\n _box3A.makeEmpty();\n // find the center\n object3d.traverseVisible((object) => {\n if (!object.isMesh)\n return;\n _box3A.expandByObject(object);\n });\n _box3A.getCenter(center);\n // find the radius\n let maxRadiusSq = 0;\n object3d.traverseVisible((object) => {\n if (!object.isMesh)\n return;\n const mesh = object;\n const geometry = mesh.geometry.clone();\n geometry.applyMatrix4(mesh.matrixWorld);\n if (geometry.isBufferGeometry) {\n const bufferGeometry = geometry;\n const position = bufferGeometry.attributes.position;\n for (let i = 0, l = position.count; i < l; i++) {\n _v3A.fromBufferAttribute(position, i);\n maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_v3A));\n }\n }\n else {\n // for old three.js, which supports both BufferGeometry and Geometry\n // this condition block will be removed in the near future.\n const position = geometry.attributes.position;\n const vector = new THREE.Vector3();\n for (let i = 0, l = position.count; i < l; i++) {\n vector.fromBufferAttribute(position, i);\n maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(vector));\n }\n }\n });\n boundingSphere.radius = Math.sqrt(maxRadiusSq);\n return boundingSphere;\n}\n\nexport { CameraControls as default };\n","/*!\n * hold-event\n * https://github.com/yomotsu/hold-event\n * (c) 2020 @yomotsu\n * Released under the MIT License.\n */\nvar HOLD_EVENT_TYPE;\r\n(function (HOLD_EVENT_TYPE) {\r\n HOLD_EVENT_TYPE[\"HOLD_START\"] = \"holdStart\";\r\n HOLD_EVENT_TYPE[\"HOLD_END\"] = \"holdEnd\";\r\n HOLD_EVENT_TYPE[\"HOLDING\"] = \"holding\";\r\n})(HOLD_EVENT_TYPE || (HOLD_EVENT_TYPE = {}));\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nfunction __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\n\nvar EventDispatcher = (function () {\r\n function EventDispatcher() {\r\n this._listeners = {};\r\n }\r\n EventDispatcher.prototype.addEventListener = function (type, listener) {\r\n var listeners = this._listeners;\r\n if (listeners[type] === undefined)\r\n listeners[type] = [];\r\n if (listeners[type].indexOf(listener) === -1)\r\n listeners[type].push(listener);\r\n };\r\n EventDispatcher.prototype.removeEventListener = function (type, listener) {\r\n var listeners = this._listeners;\r\n var listenerArray = listeners[type];\r\n if (listenerArray !== undefined) {\r\n var index = listenerArray.indexOf(listener);\r\n if (index !== -1)\r\n listenerArray.splice(index, 1);\r\n }\r\n };\r\n EventDispatcher.prototype.dispatchEvent = function (event) {\r\n var listeners = this._listeners;\r\n var listenerArray = listeners[event.type];\r\n if (listenerArray !== undefined) {\r\n event.target = this;\r\n var array = listenerArray.slice(0);\r\n for (var i = 0, l = array.length; i < l; i++) {\r\n array[i].call(this, event);\r\n }\r\n }\r\n };\r\n return EventDispatcher;\r\n}());\n\nvar Hold = (function (_super) {\r\n __extends(Hold, _super);\r\n function Hold(holdIntervalDelay) {\r\n var _this = _super.call(this) || this;\r\n _this._enabled = true;\r\n _this._holding = false;\r\n _this._intervalId = -1;\r\n _this._deltaTime = 0;\r\n _this._elapsedTime = 0;\r\n _this._lastTime = 0;\r\n _this._holdStart = function (event) {\r\n if (!_this._enabled)\r\n return;\r\n if (_this._holding)\r\n return;\r\n _this._deltaTime = 0;\r\n _this._elapsedTime = 0;\r\n _this._lastTime = performance.now();\r\n _this.dispatchEvent({\r\n type: HOLD_EVENT_TYPE.HOLD_START,\r\n deltaTime: _this._deltaTime,\r\n elapsedTime: _this._elapsedTime,\r\n originalEvent: event,\r\n });\r\n _this._holding = true;\r\n var cb = function () {\r\n _this._intervalId = !!_this.holdIntervalDelay ?\r\n window.setTimeout(cb, _this.holdIntervalDelay) :\r\n window.requestAnimationFrame(cb);\r\n var now = performance.now();\r\n _this._deltaTime = now - _this._lastTime;\r\n _this._elapsedTime += _this._deltaTime;\r\n _this._lastTime = performance.now();\r\n _this.dispatchEvent({\r\n type: HOLD_EVENT_TYPE.HOLDING,\r\n deltaTime: _this._deltaTime,\r\n elapsedTime: _this._elapsedTime,\r\n });\r\n };\r\n _this._intervalId = !!_this.holdIntervalDelay ?\r\n window.setTimeout(cb, _this.holdIntervalDelay) :\r\n window.requestAnimationFrame(cb);\r\n };\r\n _this._holdEnd = function (event) {\r\n if (!_this._enabled)\r\n return;\r\n if (!_this._holding)\r\n return;\r\n var now = performance.now();\r\n _this._deltaTime = now - _this._lastTime;\r\n _this._elapsedTime += _this._deltaTime;\r\n _this._lastTime = performance.now();\r\n _this.dispatchEvent({\r\n type: HOLD_EVENT_TYPE.HOLD_END,\r\n deltaTime: _this._deltaTime,\r\n elapsedTime: _this._elapsedTime,\r\n originalEvent: event,\r\n });\r\n window.clearTimeout(_this._intervalId);\r\n window.cancelAnimationFrame(_this._intervalId);\r\n _this._holding = false;\r\n };\r\n _this.holdIntervalDelay = holdIntervalDelay;\r\n return _this;\r\n }\r\n Object.defineProperty(Hold.prototype, \"enabled\", {\r\n get: function () {\r\n return this._enabled;\r\n },\r\n set: function (enabled) {\r\n if (this._enabled === enabled)\r\n return;\r\n this._enabled = enabled;\r\n if (!this._enabled)\r\n this._holdEnd();\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n return Hold;\r\n}(EventDispatcher));\n\nvar ElementHold = (function (_super) {\r\n __extends(ElementHold, _super);\r\n function ElementHold(element, holdIntervalDelay) {\r\n var _this = _super.call(this, holdIntervalDelay) || this;\r\n _this._holdStart = _this._holdStart.bind(_this);\r\n _this._holdEnd = _this._holdEnd.bind(_this);\r\n var onPointerDown = _this._holdStart;\r\n var onPointerUp = _this._holdEnd;\r\n element.addEventListener('mousedown', onPointerDown);\r\n document.addEventListener('mouseup', onPointerUp);\r\n window.addEventListener('blur', _this._holdEnd);\r\n return _this;\r\n }\r\n return ElementHold;\r\n}(Hold));\n\nvar KeyboardKeyHold = (function (_super) {\r\n __extends(KeyboardKeyHold, _super);\r\n function KeyboardKeyHold(keyCode, holdIntervalDelay) {\r\n var _this = _super.call(this, holdIntervalDelay) || this;\r\n _this._holdStart = _this._holdStart.bind(_this);\r\n _this._holdEnd = _this._holdEnd.bind(_this);\r\n var onKeydown = function (event) {\r\n if (isInputEvent(event))\r\n return;\r\n if (event.keyCode !== keyCode)\r\n return;\r\n _this._holdStart(event);\r\n };\r\n var onKeyup = function (event) {\r\n if (event.keyCode !== keyCode)\r\n return;\r\n _this._holdEnd(event);\r\n };\r\n document.addEventListener('keydown', onKeydown);\r\n document.addEventListener('keyup', onKeyup);\r\n window.addEventListener('blur', _this._holdEnd);\r\n return _this;\r\n }\r\n return KeyboardKeyHold;\r\n}(Hold));\r\nfunction isInputEvent(event) {\r\n var target = event.target;\r\n return (target.tagName === 'INPUT' ||\r\n target.tagName === 'SELECT' ||\r\n target.tagName === 'TEXTAREA' ||\r\n target.isContentEditable);\r\n}\n\nexport { ElementHold, HOLD_EVENT_TYPE, KeyboardKeyHold };\n","// Split strategy constants\r\nexport const CENTER = 0;\r\nexport const AVERAGE = 1;\r\nexport const SAH = 2;\r\n\r\n// Traversal constants\r\nexport const NOT_INTERSECTED = 0;\r\nexport const INTERSECTED = 1;\r\nexport const CONTAINED = 2;\r\n\r\n// SAH cost constants\r\n// TODO: hone these costs more. The relative difference between them should be the\r\n// difference in measured time to perform a triangle intersection vs traversing\r\n// bounds.\r\nexport const TRIANGLE_INTERSECT_COST = 1.25;\r\nexport const TRAVERSAL_COST = 1;\r\n\r\n\r\n// Build constants\r\nexport const BYTES_PER_NODE = 6 * 4 + 4 + 4;\r\nexport const IS_LEAFNODE_FLAG = 0xFFFF;\r\n\r\n// EPSILON for computing floating point error during build\r\n// https://en.wikipedia.org/wiki/Machine_epsilon#Values_for_standard_hardware_floating_point_arithmetics\r\nexport const FLOAT32_EPSILON = Math.pow( 2, - 24 );\r\n\r\n","export class MeshBVHNode {\r\n\r\n\tconstructor() {\r\n\r\n\t\t// internal nodes have boundingData, left, right, and splitAxis\r\n\t\t// leaf nodes have offset and count (referring to primitives in the mesh geometry)\r\n\r\n\t}\r\n\r\n}\r\n","export function arrayToBox( nodeIndex32, array, target ) {\r\n\r\n\ttarget.min.x = array[ nodeIndex32 ];\r\n\ttarget.min.y = array[ nodeIndex32 + 1 ];\r\n\ttarget.min.z = array[ nodeIndex32 + 2 ];\r\n\r\n\ttarget.max.x = array[ nodeIndex32 + 3 ];\r\n\ttarget.max.y = array[ nodeIndex32 + 4 ];\r\n\ttarget.max.z = array[ nodeIndex32 + 5 ];\r\n\r\n\treturn target;\r\n\r\n}\r\n\r\nexport function getLongestEdgeIndex( bounds ) {\r\n\r\n\tlet splitDimIdx = - 1;\r\n\tlet splitDist = - Infinity;\r\n\r\n\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\tconst dist = bounds[ i + 3 ] - bounds[ i ];\r\n\t\tif ( dist > splitDist ) {\r\n\r\n\t\t\tsplitDist = dist;\r\n\t\t\tsplitDimIdx = i;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn splitDimIdx;\r\n\r\n}\r\n\r\n// copys bounds a into bounds b\r\nexport function copyBounds( source, target ) {\r\n\r\n\ttarget.set( source );\r\n\r\n}\r\n\r\n// sets bounds target to the union of bounds a and b\r\nexport function unionBounds( a, b, target ) {\r\n\r\n\tlet aVal, bVal;\r\n\tfor ( let d = 0; d < 3; d ++ ) {\r\n\r\n\t\tconst d3 = d + 3;\r\n\r\n\t\t// set the minimum values\r\n\t\taVal = a[ d ];\r\n\t\tbVal = b[ d ];\r\n\t\ttarget[ d ] = aVal < bVal ? aVal : bVal;\r\n\r\n\t\t// set the max values\r\n\t\taVal = a[ d3 ];\r\n\t\tbVal = b[ d3 ];\r\n\t\ttarget[ d3 ] = aVal > bVal ? aVal : bVal;\r\n\r\n\t}\r\n\r\n}\r\n\r\n// expands the given bounds by the provided triangle bounds\r\nexport function expandByTriangleBounds( startIndex, triangleBounds, bounds ) {\r\n\r\n\tfor ( let d = 0; d < 3; d ++ ) {\r\n\r\n\t\tconst tCenter = triangleBounds[ startIndex + 2 * d ];\r\n\t\tconst tHalf = triangleBounds[ startIndex + 2 * d + 1 ];\r\n\r\n\t\tconst tMin = tCenter - tHalf;\r\n\t\tconst tMax = tCenter + tHalf;\r\n\r\n\t\tif ( tMin < bounds[ d ] ) {\r\n\r\n\t\t\tbounds[ d ] = tMin;\r\n\r\n\t\t}\r\n\r\n\t\tif ( tMax > bounds[ d + 3 ] ) {\r\n\r\n\t\t\tbounds[ d + 3 ] = tMax;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\n// compute bounds surface area\r\nexport function computeSurfaceArea( bounds ) {\r\n\r\n\tconst d0 = bounds[ 3 ] - bounds[ 0 ];\r\n\tconst d1 = bounds[ 4 ] - bounds[ 1 ];\r\n\tconst d2 = bounds[ 5 ] - bounds[ 2 ];\r\n\r\n\treturn 2 * ( d0 * d1 + d1 * d2 + d2 * d0 );\r\n\r\n}\r\n","import { BufferAttribute } from 'three';\r\nimport { MeshBVHNode } from './MeshBVHNode.js';\r\nimport { getLongestEdgeIndex, computeSurfaceArea, copyBounds, unionBounds, expandByTriangleBounds } from '../utils/ArrayBoxUtilities.js';\r\nimport {\r\n\tCENTER, AVERAGE, SAH, TRIANGLE_INTERSECT_COST, TRAVERSAL_COST,\r\n\tBYTES_PER_NODE, FLOAT32_EPSILON, IS_LEAFNODE_FLAG,\r\n} from './Constants.js';\r\n\r\nfunction ensureIndex( geo, options ) {\r\n\r\n\tif ( ! geo.index ) {\r\n\r\n\t\tconst vertexCount = geo.attributes.position.count;\r\n\t\tconst BufferConstructor = options.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer;\r\n\t\tlet index;\r\n\t\tif ( vertexCount > 65535 ) {\r\n\r\n\t\t\tindex = new Uint32Array( new BufferConstructor( 4 * vertexCount ) );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tindex = new Uint16Array( new BufferConstructor( 2 * vertexCount ) );\r\n\r\n\t\t}\r\n\r\n\t\tgeo.setIndex( new BufferAttribute( index, 1 ) );\r\n\r\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\r\n\r\n\t\t\tindex[ i ] = i;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\n// Computes the set of { offset, count } ranges which need independent BVH roots. Each\r\n// region in the geometry index that belongs to a different set of material groups requires\r\n// a separate BVH root, so that triangles indices belonging to one group never get swapped\r\n// with triangle indices belongs to another group. For example, if the groups were like this:\r\n//\r\n// [-------------------------------------------------------------]\r\n// |__________________|\r\n// g0 = [0, 20] |______________________||_____________________|\r\n// g1 = [16, 40] g2 = [41, 60]\r\n//\r\n// we would need four BVH roots: [0, 15], [16, 20], [21, 40], [41, 60].\r\nfunction getRootIndexRanges( geo ) {\r\n\r\n\tif ( ! geo.groups || ! geo.groups.length ) {\r\n\r\n\t\treturn [ { offset: 0, count: geo.index.count / 3 } ];\r\n\r\n\t}\r\n\r\n\tconst ranges = [];\r\n\tconst rangeBoundaries = new Set();\r\n\tfor ( const group of geo.groups ) {\r\n\r\n\t\trangeBoundaries.add( group.start );\r\n\t\trangeBoundaries.add( group.start + group.count );\r\n\r\n\t}\r\n\r\n\t// note that if you don't pass in a comparator, it sorts them lexicographically as strings :-(\r\n\tconst sortedBoundaries = Array.from( rangeBoundaries.values() ).sort( ( a, b ) => a - b );\r\n\tfor ( let i = 0; i < sortedBoundaries.length - 1; i ++ ) {\r\n\r\n\t\tconst start = sortedBoundaries[ i ], end = sortedBoundaries[ i + 1 ];\r\n\t\tranges.push( { offset: ( start / 3 ), count: ( end - start ) / 3 } );\r\n\r\n\t}\r\n\r\n\treturn ranges;\r\n\r\n}\r\n\r\n// computes the union of the bounds of all of the given triangles and puts the resulting box in target. If\r\n// centroidTarget is provided then a bounding box is computed for the centroids of the triangles, as well.\r\n// These are computed together to avoid redundant accesses to bounds array.\r\nfunction getBounds( triangleBounds, offset, count, target, centroidTarget = null ) {\r\n\r\n\tlet minx = Infinity;\r\n\tlet miny = Infinity;\r\n\tlet minz = Infinity;\r\n\tlet maxx = - Infinity;\r\n\tlet maxy = - Infinity;\r\n\tlet maxz = - Infinity;\r\n\r\n\tlet cminx = Infinity;\r\n\tlet cminy = Infinity;\r\n\tlet cminz = Infinity;\r\n\tlet cmaxx = - Infinity;\r\n\tlet cmaxy = - Infinity;\r\n\tlet cmaxz = - Infinity;\r\n\r\n\tconst includeCentroid = centroidTarget !== null;\r\n\tfor ( let i = offset * 6, end = ( offset + count ) * 6; i < end; i += 6 ) {\r\n\r\n\t\tconst cx = triangleBounds[ i + 0 ];\r\n\t\tconst hx = triangleBounds[ i + 1 ];\r\n\t\tconst lx = cx - hx;\r\n\t\tconst rx = cx + hx;\r\n\t\tif ( lx < minx ) minx = lx;\r\n\t\tif ( rx > maxx ) maxx = rx;\r\n\t\tif ( includeCentroid && cx < cminx ) cminx = cx;\r\n\t\tif ( includeCentroid && cx > cmaxx ) cmaxx = cx;\r\n\r\n\t\tconst cy = triangleBounds[ i + 2 ];\r\n\t\tconst hy = triangleBounds[ i + 3 ];\r\n\t\tconst ly = cy - hy;\r\n\t\tconst ry = cy + hy;\r\n\t\tif ( ly < miny ) miny = ly;\r\n\t\tif ( ry > maxy ) maxy = ry;\r\n\t\tif ( includeCentroid && cy < cminy ) cminy = cy;\r\n\t\tif ( includeCentroid && cy > cmaxy ) cmaxy = cy;\r\n\r\n\t\tconst cz = triangleBounds[ i + 4 ];\r\n\t\tconst hz = triangleBounds[ i + 5 ];\r\n\t\tconst lz = cz - hz;\r\n\t\tconst rz = cz + hz;\r\n\t\tif ( lz < minz ) minz = lz;\r\n\t\tif ( rz > maxz ) maxz = rz;\r\n\t\tif ( includeCentroid && cz < cminz ) cminz = cz;\r\n\t\tif ( includeCentroid && cz > cmaxz ) cmaxz = cz;\r\n\r\n\t}\r\n\r\n\ttarget[ 0 ] = minx;\r\n\ttarget[ 1 ] = miny;\r\n\ttarget[ 2 ] = minz;\r\n\r\n\ttarget[ 3 ] = maxx;\r\n\ttarget[ 4 ] = maxy;\r\n\ttarget[ 5 ] = maxz;\r\n\r\n\tif ( includeCentroid ) {\r\n\r\n\t\tcentroidTarget[ 0 ] = cminx;\r\n\t\tcentroidTarget[ 1 ] = cminy;\r\n\t\tcentroidTarget[ 2 ] = cminz;\r\n\r\n\t\tcentroidTarget[ 3 ] = cmaxx;\r\n\t\tcentroidTarget[ 4 ] = cmaxy;\r\n\t\tcentroidTarget[ 5 ] = cmaxz;\r\n\r\n\t}\r\n\r\n}\r\n\r\n// A stand alone function for retrieving the centroid bounds.\r\nfunction getCentroidBounds( triangleBounds, offset, count, centroidTarget ) {\r\n\r\n\tlet cminx = Infinity;\r\n\tlet cminy = Infinity;\r\n\tlet cminz = Infinity;\r\n\tlet cmaxx = - Infinity;\r\n\tlet cmaxy = - Infinity;\r\n\tlet cmaxz = - Infinity;\r\n\r\n\tfor ( let i = offset * 6, end = ( offset + count ) * 6; i < end; i += 6 ) {\r\n\r\n\t\tconst cx = triangleBounds[ i + 0 ];\r\n\t\tif ( cx < cminx ) cminx = cx;\r\n\t\tif ( cx > cmaxx ) cmaxx = cx;\r\n\r\n\t\tconst cy = triangleBounds[ i + 2 ];\r\n\t\tif ( cy < cminy ) cminy = cy;\r\n\t\tif ( cy > cmaxy ) cmaxy = cy;\r\n\r\n\t\tconst cz = triangleBounds[ i + 4 ];\r\n\t\tif ( cz < cminz ) cminz = cz;\r\n\t\tif ( cz > cmaxz ) cmaxz = cz;\r\n\r\n\t}\r\n\r\n\tcentroidTarget[ 0 ] = cminx;\r\n\tcentroidTarget[ 1 ] = cminy;\r\n\tcentroidTarget[ 2 ] = cminz;\r\n\r\n\tcentroidTarget[ 3 ] = cmaxx;\r\n\tcentroidTarget[ 4 ] = cmaxy;\r\n\tcentroidTarget[ 5 ] = cmaxz;\r\n\r\n}\r\n\r\n\r\n// reorders `tris` such that for `count` elements after `offset`, elements on the left side of the split\r\n// will be on the left and elements on the right side of the split will be on the right. returns the index\r\n// of the first element on the right side, or offset + count if there are no elements on the right side.\r\nfunction partition( index, triangleBounds, offset, count, split ) {\r\n\r\n\tlet left = offset;\r\n\tlet right = offset + count - 1;\r\n\tconst pos = split.pos;\r\n\tconst axisOffset = split.axis * 2;\r\n\r\n\t// hoare partitioning, see e.g. https://en.wikipedia.org/wiki/Quicksort#Hoare_partition_scheme\r\n\twhile ( true ) {\r\n\r\n\t\twhile ( left <= right && triangleBounds[ left * 6 + axisOffset ] < pos ) {\r\n\r\n\t\t\tleft ++;\r\n\r\n\t\t}\r\n\r\n\r\n\t\t// if a triangle center lies on the partition plane it is considered to be on the right side\r\n\t\twhile ( left <= right && triangleBounds[ right * 6 + axisOffset ] >= pos ) {\r\n\r\n\t\t\tright --;\r\n\r\n\t\t}\r\n\r\n\t\tif ( left < right ) {\r\n\r\n\t\t\t// we need to swap all of the information associated with the triangles at index\r\n\t\t\t// left and right; that's the verts in the geometry index, the bounds,\r\n\t\t\t// and perhaps the SAH planes\r\n\r\n\t\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\tlet t0 = index[ left * 3 + i ];\r\n\t\t\t\tindex[ left * 3 + i ] = index[ right * 3 + i ];\r\n\t\t\t\tindex[ right * 3 + i ] = t0;\r\n\r\n\t\t\t\tlet t1 = triangleBounds[ left * 6 + i * 2 + 0 ];\r\n\t\t\t\ttriangleBounds[ left * 6 + i * 2 + 0 ] = triangleBounds[ right * 6 + i * 2 + 0 ];\r\n\t\t\t\ttriangleBounds[ right * 6 + i * 2 + 0 ] = t1;\r\n\r\n\t\t\t\tlet t2 = triangleBounds[ left * 6 + i * 2 + 1 ];\r\n\t\t\t\ttriangleBounds[ left * 6 + i * 2 + 1 ] = triangleBounds[ right * 6 + i * 2 + 1 ];\r\n\t\t\t\ttriangleBounds[ right * 6 + i * 2 + 1 ] = t2;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tleft ++;\r\n\t\t\tright --;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn left;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nconst BIN_COUNT = 32;\r\nconst binsSort = ( a, b ) => a.candidate - b.candidate;\r\nconst sahBins = new Array( BIN_COUNT ).fill().map( () => {\r\n\r\n\treturn {\r\n\r\n\t\tcount: 0,\r\n\t\tbounds: new Float32Array( 6 ),\r\n\t\trightCacheBounds: new Float32Array( 6 ),\r\n\t\tleftCacheBounds: new Float32Array( 6 ),\r\n\t\tcandidate: 0,\r\n\r\n\t};\r\n\r\n} );\r\nconst leftBounds = new Float32Array( 6 );\r\n\r\nfunction getOptimalSplit( nodeBoundingData, centroidBoundingData, triangleBounds, offset, count, strategy ) {\r\n\r\n\tlet axis = - 1;\r\n\tlet pos = 0;\r\n\r\n\t// Center\r\n\tif ( strategy === CENTER ) {\r\n\r\n\t\taxis = getLongestEdgeIndex( centroidBoundingData );\r\n\t\tif ( axis !== - 1 ) {\r\n\r\n\t\t\tpos = ( centroidBoundingData[ axis ] + centroidBoundingData[ axis + 3 ] ) / 2;\r\n\r\n\t\t}\r\n\r\n\t} else if ( strategy === AVERAGE ) {\r\n\r\n\t\taxis = getLongestEdgeIndex( nodeBoundingData );\r\n\t\tif ( axis !== - 1 ) {\r\n\r\n\t\t\tpos = getAverage( triangleBounds, offset, count, axis );\r\n\r\n\t\t}\r\n\r\n\t} else if ( strategy === SAH ) {\r\n\r\n\t\tconst rootSurfaceArea = computeSurfaceArea( nodeBoundingData );\r\n\t\tlet bestCost = TRIANGLE_INTERSECT_COST * count;\r\n\r\n\t\t// iterate over all axes\r\n\t\tconst cStart = offset * 6;\r\n\t\tconst cEnd = ( offset + count ) * 6;\r\n\t\tfor ( let a = 0; a < 3; a ++ ) {\r\n\r\n\t\t\tconst axisLeft = centroidBoundingData[ a ];\r\n\t\t\tconst axisRight = centroidBoundingData[ a + 3 ];\r\n\t\t\tconst axisLength = axisRight - axisLeft;\r\n\t\t\tconst binWidth = axisLength / BIN_COUNT;\r\n\r\n\t\t\t// If we have fewer triangles than we're planning to split then just check all\r\n\t\t\t// the triangle positions because it will be faster.\r\n\t\t\tif ( count < BIN_COUNT / 4 ) {\r\n\r\n\t\t\t\t// initialize the bin candidates\r\n\t\t\t\tconst truncatedBins = [ ...sahBins ];\r\n\t\t\t\ttruncatedBins.length = count;\r\n\r\n\t\t\t\t// set the candidates\r\n\t\t\t\tlet b = 0;\r\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6, b ++ ) {\r\n\r\n\t\t\t\t\tconst bin = truncatedBins[ b ];\r\n\t\t\t\t\tbin.candidate = triangleBounds[ c + 2 * a ];\r\n\t\t\t\t\tbin.count = 0;\r\n\r\n\t\t\t\t\tconst {\r\n\t\t\t\t\t\tbounds,\r\n\t\t\t\t\t\tleftCacheBounds,\r\n\t\t\t\t\t\trightCacheBounds,\r\n\t\t\t\t\t} = bin;\r\n\t\t\t\t\tfor ( let d = 0; d < 3; d ++ ) {\r\n\r\n\t\t\t\t\t\trightCacheBounds[ d ] = Infinity;\r\n\t\t\t\t\t\trightCacheBounds[ d + 3 ] = - Infinity;\r\n\r\n\t\t\t\t\t\tleftCacheBounds[ d ] = Infinity;\r\n\t\t\t\t\t\tleftCacheBounds[ d + 3 ] = - Infinity;\r\n\r\n\t\t\t\t\t\tbounds[ d ] = Infinity;\r\n\t\t\t\t\t\tbounds[ d + 3 ] = - Infinity;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\texpandByTriangleBounds( c, triangleBounds, bounds );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttruncatedBins.sort( binsSort );\r\n\r\n\t\t\t\t// remove redundant splits\r\n\t\t\t\tlet splitCount = count;\r\n\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\r\n\r\n\t\t\t\t\tconst bin = truncatedBins[ bi ];\r\n\t\t\t\t\twhile ( bi + 1 < splitCount && truncatedBins[ bi + 1 ].candidate === bin.candidate ) {\r\n\r\n\t\t\t\t\t\ttruncatedBins.splice( bi + 1, 1 );\r\n\t\t\t\t\t\tsplitCount --;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// find the appropriate bin for each triangle and expand the bounds.\r\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6 ) {\r\n\r\n\t\t\t\t\tconst center = triangleBounds[ c + 2 * a ];\r\n\t\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\r\n\r\n\t\t\t\t\t\tconst bin = truncatedBins[ bi ];\r\n\t\t\t\t\t\tif ( center >= bin.candidate ) {\r\n\r\n\t\t\t\t\t\t\texpandByTriangleBounds( c, triangleBounds, bin.rightCacheBounds );\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\texpandByTriangleBounds( c, triangleBounds, bin.leftCacheBounds );\r\n\t\t\t\t\t\t\tbin.count ++;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// expand all the bounds\r\n\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\r\n\r\n\t\t\t\t\tconst bin = truncatedBins[ bi ];\r\n\t\t\t\t\tconst leftCount = bin.count;\r\n\t\t\t\t\tconst rightCount = count - bin.count;\r\n\r\n\t\t\t\t\t// check the cost of this split\r\n\t\t\t\t\tconst leftBounds = bin.leftCacheBounds;\r\n\t\t\t\t\tconst rightBounds = bin.rightCacheBounds;\r\n\r\n\t\t\t\t\tlet leftProb = 0;\r\n\t\t\t\t\tif ( leftCount !== 0 ) {\r\n\r\n\t\t\t\t\t\tleftProb = computeSurfaceArea( leftBounds ) / rootSurfaceArea;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tlet rightProb = 0;\r\n\t\t\t\t\tif ( rightCount !== 0 ) {\r\n\r\n\t\t\t\t\t\trightProb = computeSurfaceArea( rightBounds ) / rootSurfaceArea;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst cost = TRAVERSAL_COST + TRIANGLE_INTERSECT_COST * (\r\n\t\t\t\t\t\tleftProb * leftCount + rightProb * rightCount\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tif ( cost < bestCost ) {\r\n\r\n\t\t\t\t\t\taxis = a;\r\n\t\t\t\t\t\tbestCost = cost;\r\n\t\t\t\t\t\tpos = bin.candidate;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// reset the bins\r\n\t\t\t\tfor ( let i = 0; i < BIN_COUNT; i ++ ) {\r\n\r\n\t\t\t\t\tconst bin = sahBins[ i ];\r\n\t\t\t\t\tbin.count = 0;\r\n\t\t\t\t\tbin.candidate = axisLeft + binWidth + i * binWidth;\r\n\r\n\t\t\t\t\tconst bounds = bin.bounds;\r\n\t\t\t\t\tfor ( let d = 0; d < 3; d ++ ) {\r\n\r\n\t\t\t\t\t\tbounds[ d ] = Infinity;\r\n\t\t\t\t\t\tbounds[ d + 3 ] = - Infinity;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// iterate over all center positions\r\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6 ) {\r\n\r\n\t\t\t\t\tconst triCenter = triangleBounds[ c + 2 * a ];\r\n\t\t\t\t\tconst relativeCenter = triCenter - axisLeft;\r\n\r\n\t\t\t\t\t// in the partition function if the centroid lies on the split plane then it is\r\n\t\t\t\t\t// considered to be on the right side of the split\r\n\t\t\t\t\tlet binIndex = ~ ~ ( relativeCenter / binWidth );\r\n\t\t\t\t\tif ( binIndex >= BIN_COUNT ) binIndex = BIN_COUNT - 1;\r\n\r\n\t\t\t\t\tconst bin = sahBins[ binIndex ];\r\n\t\t\t\t\tbin.count ++;\r\n\r\n\t\t\t\t\texpandByTriangleBounds( c, triangleBounds, bin.bounds );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// cache the unioned bounds from right to left so we don't have to regenerate them each time\r\n\t\t\t\tconst lastBin = sahBins[ BIN_COUNT - 1 ];\r\n\t\t\t\tcopyBounds( lastBin.bounds, lastBin.rightCacheBounds );\r\n\t\t\t\tfor ( let i = BIN_COUNT - 2; i >= 0; i -- ) {\r\n\r\n\t\t\t\t\tconst bin = sahBins[ i ];\r\n\t\t\t\t\tconst nextBin = sahBins[ i + 1 ];\r\n\t\t\t\t\tunionBounds( bin.bounds, nextBin.rightCacheBounds, bin.rightCacheBounds );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet leftCount = 0;\r\n\t\t\t\tfor ( let i = 0; i < BIN_COUNT - 1; i ++ ) {\r\n\r\n\t\t\t\t\tconst bin = sahBins[ i ];\r\n\t\t\t\t\tconst binCount = bin.count;\r\n\t\t\t\t\tconst bounds = bin.bounds;\r\n\r\n\t\t\t\t\tconst nextBin = sahBins[ i + 1 ];\r\n\t\t\t\t\tconst rightBounds = nextBin.rightCacheBounds;\r\n\r\n\t\t\t\t\t// dont do anything with the bounds if the new bounds have no triangles\r\n\t\t\t\t\tif ( binCount !== 0 ) {\r\n\r\n\t\t\t\t\t\tif ( leftCount === 0 ) {\r\n\r\n\t\t\t\t\t\t\tcopyBounds( bounds, leftBounds );\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tunionBounds( bounds, leftBounds, leftBounds );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tleftCount += binCount;\r\n\r\n\t\t\t\t\t// check the cost of this split\r\n\t\t\t\t\tlet leftProb = 0;\r\n\t\t\t\t\tlet rightProb = 0;\r\n\r\n\t\t\t\t\tif ( leftCount !== 0 ) {\r\n\r\n\t\t\t\t\t\tleftProb = computeSurfaceArea( leftBounds ) / rootSurfaceArea;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst rightCount = count - leftCount;\r\n\t\t\t\t\tif ( rightCount !== 0 ) {\r\n\r\n\t\t\t\t\t\trightProb = computeSurfaceArea( rightBounds ) / rootSurfaceArea;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst cost = TRAVERSAL_COST + TRIANGLE_INTERSECT_COST * (\r\n\t\t\t\t\t\tleftProb * leftCount + rightProb * rightCount\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tif ( cost < bestCost ) {\r\n\r\n\t\t\t\t\t\taxis = a;\r\n\t\t\t\t\t\tbestCost = cost;\r\n\t\t\t\t\t\tpos = bin.candidate;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t} else {\r\n\r\n\t\tconsole.warn( `MeshBVH: Invalid build strategy value ${ strategy } used.` );\r\n\r\n\t}\r\n\r\n\treturn { axis, pos };\r\n\r\n}\r\n\r\n// returns the average coordinate on the specified axis of the all the provided triangles\r\nfunction getAverage( triangleBounds, offset, count, axis ) {\r\n\r\n\tlet avg = 0;\r\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\r\n\r\n\t\tavg += triangleBounds[ i * 6 + axis * 2 ];\r\n\r\n\t}\r\n\r\n\treturn avg / count;\r\n\r\n}\r\n\r\n// precomputes the bounding box for each triangle; required for quickly calculating tree splits.\r\n// result is an array of size tris.length * 6 where triangle i maps to a\r\n// [x_center, x_delta, y_center, y_delta, z_center, z_delta] tuple starting at index i * 6,\r\n// representing the center and half-extent in each dimension of triangle i\r\nfunction computeTriangleBounds( geo, fullBounds ) {\r\n\r\n\tconst posAttr = geo.attributes.position;\r\n\tconst index = geo.index.array;\r\n\tconst triCount = index.length / 3;\r\n\tconst triangleBounds = new Float32Array( triCount * 6 );\r\n\tconst normalized = posAttr.normalized;\r\n\r\n\t// used for non-normalized positions\r\n\tconst posArr = posAttr.array;\r\n\r\n\t// support for an interleaved position buffer\r\n\tconst bufferOffset = posAttr.offset || 0;\r\n\tlet stride = 3;\r\n\tif ( posAttr.isInterleavedBufferAttribute ) {\r\n\r\n\t\tstride = posAttr.data.stride;\r\n\r\n\t}\r\n\r\n\t// used for normalized positions\r\n\tconst getters = [ 'getX', 'getY', 'getZ' ];\r\n\r\n\tfor ( let tri = 0; tri < triCount; tri ++ ) {\r\n\r\n\t\tconst tri3 = tri * 3;\r\n\t\tconst tri6 = tri * 6;\r\n\r\n\t\tlet ai, bi, ci;\r\n\r\n\t\tif ( normalized ) {\r\n\r\n\t\t\tai = index[ tri3 + 0 ];\r\n\t\t\tbi = index[ tri3 + 1 ];\r\n\t\t\tci = index[ tri3 + 2 ];\r\n\r\n\t\t} else {\r\n\r\n\t\t\tai = index[ tri3 + 0 ] * stride + bufferOffset;\r\n\t\t\tbi = index[ tri3 + 1 ] * stride + bufferOffset;\r\n\t\t\tci = index[ tri3 + 2 ] * stride + bufferOffset;\r\n\r\n\t\t}\r\n\r\n\t\tfor ( let el = 0; el < 3; el ++ ) {\r\n\r\n\t\t\tlet a, b, c;\r\n\r\n\t\t\tif ( normalized ) {\r\n\r\n\t\t\t\ta = posAttr[ getters[ el ] ]( ai );\r\n\t\t\t\tb = posAttr[ getters[ el ] ]( bi );\r\n\t\t\t\tc = posAttr[ getters[ el ] ]( ci );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\ta = posArr[ ai + el ];\r\n\t\t\t\tb = posArr[ bi + el ];\r\n\t\t\t\tc = posArr[ ci + el ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tlet min = a;\r\n\t\t\tif ( b < min ) min = b;\r\n\t\t\tif ( c < min ) min = c;\r\n\r\n\t\t\tlet max = a;\r\n\t\t\tif ( b > max ) max = b;\r\n\t\t\tif ( c > max ) max = c;\r\n\r\n\t\t\t// Increase the bounds size by float32 epsilon to avoid precision errors when\r\n\t\t\t// converting to 32 bit float. Scale the epsilon by the size of the numbers being\r\n\t\t\t// worked with.\r\n\t\t\tconst halfExtents = ( max - min ) / 2;\r\n\t\t\tconst el2 = el * 2;\r\n\t\t\ttriangleBounds[ tri6 + el2 + 0 ] = min + halfExtents;\r\n\t\t\ttriangleBounds[ tri6 + el2 + 1 ] = halfExtents + ( Math.abs( min ) + halfExtents ) * FLOAT32_EPSILON;\r\n\r\n\t\t\tif ( min < fullBounds[ el ] ) fullBounds[ el ] = min;\r\n\t\t\tif ( max > fullBounds[ el + 3 ] ) fullBounds[ el + 3 ] = max;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn triangleBounds;\r\n\r\n}\r\n\r\nexport function buildTree( geo, options ) {\r\n\r\n\tfunction triggerProgress( trianglesProcessed ) {\r\n\r\n\t\tif ( onProgress ) {\r\n\r\n\t\t\tonProgress( trianglesProcessed / totalTriangles );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// either recursively splits the given node, creating left and right subtrees for it, or makes it a leaf node,\r\n\t// recording the offset and count of its triangles and writing them into the reordered geometry index.\r\n\tfunction splitNode( node, offset, count, centroidBoundingData = null, depth = 0 ) {\r\n\r\n\t\tif ( ! reachedMaxDepth && depth >= maxDepth ) {\r\n\r\n\t\t\treachedMaxDepth = true;\r\n\t\t\tif ( verbose ) {\r\n\r\n\t\t\t\tconsole.warn( `MeshBVH: Max depth of ${ maxDepth } reached when generating BVH. Consider increasing maxDepth.` );\r\n\t\t\t\tconsole.warn( geo );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// early out if we've met our capacity\r\n\t\tif ( count <= maxLeafTris || depth >= maxDepth ) {\r\n\r\n\t\t\ttriggerProgress( offset + count );\r\n\t\t\tnode.offset = offset;\r\n\t\t\tnode.count = count;\r\n\t\t\treturn node;\r\n\r\n\t\t}\r\n\r\n\t\t// Find where to split the volume\r\n\t\tconst split = getOptimalSplit( node.boundingData, centroidBoundingData, triangleBounds, offset, count, strategy );\r\n\t\tif ( split.axis === - 1 ) {\r\n\r\n\t\t\ttriggerProgress( offset + count );\r\n\t\t\tnode.offset = offset;\r\n\t\t\tnode.count = count;\r\n\t\t\treturn node;\r\n\r\n\t\t}\r\n\r\n\t\tconst splitOffset = partition( indexArray, triangleBounds, offset, count, split );\r\n\r\n\t\t// create the two new child nodes\r\n\t\tif ( splitOffset === offset || splitOffset === offset + count ) {\r\n\r\n\t\t\ttriggerProgress( offset + count );\r\n\t\t\tnode.offset = offset;\r\n\t\t\tnode.count = count;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tnode.splitAxis = split.axis;\r\n\r\n\t\t\t// create the left child and compute its bounding box\r\n\t\t\tconst left = new MeshBVHNode();\r\n\t\t\tconst lstart = offset;\r\n\t\t\tconst lcount = splitOffset - offset;\r\n\t\t\tnode.left = left;\r\n\t\t\tleft.boundingData = new Float32Array( 6 );\r\n\r\n\t\t\tgetBounds( triangleBounds, lstart, lcount, left.boundingData, cacheCentroidBoundingData );\r\n\t\t\tsplitNode( left, lstart, lcount, cacheCentroidBoundingData, depth + 1 );\r\n\r\n\t\t\t// repeat for right\r\n\t\t\tconst right = new MeshBVHNode();\r\n\t\t\tconst rstart = splitOffset;\r\n\t\t\tconst rcount = count - lcount;\r\n\t\t\tnode.right = right;\r\n\t\t\tright.boundingData = new Float32Array( 6 );\r\n\r\n\t\t\tgetBounds( triangleBounds, rstart, rcount, right.boundingData, cacheCentroidBoundingData );\r\n\t\t\tsplitNode( right, rstart, rcount, cacheCentroidBoundingData, depth + 1 );\r\n\r\n\t\t}\r\n\r\n\t\treturn node;\r\n\r\n\t}\r\n\r\n\tensureIndex( geo, options );\r\n\r\n\t// Compute the full bounds of the geometry at the same time as triangle bounds because\r\n\t// we'll need it for the root bounds in the case with no groups and it should be fast here.\r\n\t// We can't use the geometrying bounding box if it's available because it may be out of date.\r\n\tconst fullBounds = new Float32Array( 6 );\r\n\tconst cacheCentroidBoundingData = new Float32Array( 6 );\r\n\tconst triangleBounds = computeTriangleBounds( geo, fullBounds );\r\n\tconst indexArray = geo.index.array;\r\n\tconst maxDepth = options.maxDepth;\r\n\tconst verbose = options.verbose;\r\n\tconst maxLeafTris = options.maxLeafTris;\r\n\tconst strategy = options.strategy;\r\n\tconst onProgress = options.onProgress;\r\n\tconst totalTriangles = geo.index.count / 3;\r\n\tlet reachedMaxDepth = false;\r\n\r\n\tconst roots = [];\r\n\tconst ranges = getRootIndexRanges( geo );\r\n\r\n\tif ( ranges.length === 1 ) {\r\n\r\n\t\tconst range = ranges[ 0 ];\r\n\t\tconst root = new MeshBVHNode();\r\n\t\troot.boundingData = fullBounds;\r\n\t\tgetCentroidBounds( triangleBounds, range.offset, range.count, cacheCentroidBoundingData );\r\n\r\n\t\tsplitNode( root, range.offset, range.count, cacheCentroidBoundingData );\r\n\t\troots.push( root );\r\n\r\n\t} else {\r\n\r\n\t\tfor ( let range of ranges ) {\r\n\r\n\t\t\tconst root = new MeshBVHNode();\r\n\t\t\troot.boundingData = new Float32Array( 6 );\r\n\t\t\tgetBounds( triangleBounds, range.offset, range.count, root.boundingData, cacheCentroidBoundingData );\r\n\r\n\t\t\tsplitNode( root, range.offset, range.count, cacheCentroidBoundingData );\r\n\t\t\troots.push( root );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn roots;\r\n\r\n}\r\n\r\nexport function buildPackedTree( geo, options ) {\r\n\r\n\t// boundingData \t\t\t\t: 6 float32\r\n\t// right / offset \t\t\t\t: 1 uint32\r\n\t// splitAxis / isLeaf + count \t: 1 uint32 / 2 uint16\r\n\tconst roots = buildTree( geo, options );\r\n\r\n\tlet float32Array;\r\n\tlet uint32Array;\r\n\tlet uint16Array;\r\n\tconst packedRoots = [];\r\n\tconst BufferConstructor = options.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer;\r\n\tfor ( let i = 0; i < roots.length; i ++ ) {\r\n\r\n\t\tconst root = roots[ i ];\r\n\t\tlet nodeCount = countNodes( root );\r\n\r\n\t\tconst buffer = new BufferConstructor( BYTES_PER_NODE * nodeCount );\r\n\t\tfloat32Array = new Float32Array( buffer );\r\n\t\tuint32Array = new Uint32Array( buffer );\r\n\t\tuint16Array = new Uint16Array( buffer );\r\n\t\tpopulateBuffer( 0, root );\r\n\t\tpackedRoots.push( buffer );\r\n\r\n\t}\r\n\r\n\treturn packedRoots;\r\n\r\n\tfunction countNodes( node ) {\r\n\r\n\t\tif ( node.count ) {\r\n\r\n\t\t\treturn 1;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn 1 + countNodes( node.left ) + countNodes( node.right );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction populateBuffer( byteOffset, node ) {\r\n\r\n\t\tconst stride4Offset = byteOffset / 4;\r\n\t\tconst stride2Offset = byteOffset / 2;\r\n\t\tconst isLeaf = ! ! node.count;\r\n\t\tconst boundingData = node.boundingData;\r\n\t\tfor ( let i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\tfloat32Array[ stride4Offset + i ] = boundingData[ i ];\r\n\r\n\t\t}\r\n\r\n\t\tif ( isLeaf ) {\r\n\r\n\t\t\tconst offset = node.offset;\r\n\t\t\tconst count = node.count;\r\n\t\t\tuint32Array[ stride4Offset + 6 ] = offset;\r\n\t\t\tuint16Array[ stride2Offset + 14 ] = count;\r\n\t\t\tuint16Array[ stride2Offset + 15 ] = IS_LEAFNODE_FLAG;\r\n\t\t\treturn byteOffset + BYTES_PER_NODE;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconst left = node.left;\r\n\t\t\tconst right = node.right;\r\n\t\t\tconst splitAxis = node.splitAxis;\r\n\r\n\t\t\tlet nextUnusedPointer;\r\n\t\t\tnextUnusedPointer = populateBuffer( byteOffset + BYTES_PER_NODE, left );\r\n\r\n\t\t\tif ( ( nextUnusedPointer / 4 ) > Math.pow( 2, 32 ) ) {\r\n\r\n\t\t\t\tthrow new Error( 'MeshBVH: Cannot store child pointer greater than 32 bits.' );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tuint32Array[ stride4Offset + 6 ] = nextUnusedPointer / 4;\r\n\t\t\tnextUnusedPointer = populateBuffer( nextUnusedPointer, right );\r\n\r\n\t\t\tuint32Array[ stride4Offset + 7 ] = splitAxis;\r\n\t\t\treturn nextUnusedPointer;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { Vector3 } from 'three';\r\n\r\nexport class SeparatingAxisBounds {\r\n\r\n\tconstructor() {\r\n\r\n\t\tthis.min = Infinity;\r\n\t\tthis.max = - Infinity;\r\n\r\n\t}\r\n\r\n\tsetFromPointsField( points, field ) {\r\n\r\n\t\tlet min = Infinity;\r\n\t\tlet max = - Infinity;\r\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\r\n\r\n\t\t\tconst p = points[ i ];\r\n\t\t\tconst val = p[ field ];\r\n\t\t\tmin = val < min ? val : min;\r\n\t\t\tmax = val > max ? val : max;\r\n\r\n\t\t}\r\n\r\n\t\tthis.min = min;\r\n\t\tthis.max = max;\r\n\r\n\t}\r\n\r\n\tsetFromPoints( axis, points ) {\r\n\r\n\t\tlet min = Infinity;\r\n\t\tlet max = - Infinity;\r\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\r\n\r\n\t\t\tconst p = points[ i ];\r\n\t\t\tconst val = axis.dot( p );\r\n\t\t\tmin = val < min ? val : min;\r\n\t\t\tmax = val > max ? val : max;\r\n\r\n\t\t}\r\n\r\n\t\tthis.min = min;\r\n\t\tthis.max = max;\r\n\r\n\t}\r\n\r\n\tisSeparated( other ) {\r\n\r\n\t\treturn this.min > other.max || other.min > this.max;\r\n\r\n\t}\r\n\r\n}\r\n\r\nSeparatingAxisBounds.prototype.setFromBox = ( function () {\r\n\r\n\tconst p = new Vector3();\r\n\treturn function setFromBox( axis, box ) {\r\n\r\n\t\tconst boxMin = box.min;\r\n\t\tconst boxMax = box.max;\r\n\t\tlet min = Infinity;\r\n\t\tlet max = - Infinity;\r\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\r\n\r\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\r\n\r\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\r\n\r\n\t\t\t\t\tp.x = boxMin.x * x + boxMax.x * ( 1 - x );\r\n\t\t\t\t\tp.y = boxMin.y * y + boxMax.y * ( 1 - y );\r\n\t\t\t\t\tp.z = boxMin.z * z + boxMax.z * ( 1 - z );\r\n\r\n\t\t\t\t\tconst val = axis.dot( p );\r\n\t\t\t\t\tmin = Math.min( val, min );\r\n\t\t\t\t\tmax = Math.max( val, max );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.min = min;\r\n\t\tthis.max = max;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nexport const areIntersecting = ( function () {\r\n\r\n\tconst cacheSatBounds = new SeparatingAxisBounds();\r\n\treturn function areIntersecting( shape1, shape2 ) {\r\n\r\n\t\tconst points1 = shape1.points;\r\n\t\tconst satAxes1 = shape1.satAxes;\r\n\t\tconst satBounds1 = shape1.satBounds;\r\n\r\n\t\tconst points2 = shape2.points;\r\n\t\tconst satAxes2 = shape2.satAxes;\r\n\t\tconst satBounds2 = shape2.satBounds;\r\n\r\n\t\t// check axes of the first shape\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sb = satBounds1[ i ];\r\n\t\t\tconst sa = satAxes1[ i ];\r\n\t\t\tcacheSatBounds.setFromPoints( sa, points2 );\r\n\t\t\tif ( sb.isSeparated( cacheSatBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\t// check axes of the second shape\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sb = satBounds2[ i ];\r\n\t\t\tconst sa = satAxes2[ i ];\r\n\t\t\tcacheSatBounds.setFromPoints( sa, points1 );\r\n\t\t\tif ( sb.isSeparated( cacheSatBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n} )();\r\n","import { Vector3, Vector2, Plane, Line3 } from 'three';\r\n\r\nexport const closestPointLineToLine = ( function () {\r\n\r\n\t// https://github.com/juj/MathGeoLib/blob/master/src/Geometry/Line.cpp#L56\r\n\tconst dir1 = new Vector3();\r\n\tconst dir2 = new Vector3();\r\n\tconst v02 = new Vector3();\r\n\treturn function closestPointLineToLine( l1, l2, result ) {\r\n\r\n\t\tconst v0 = l1.start;\r\n\t\tconst v10 = dir1;\r\n\t\tconst v2 = l2.start;\r\n\t\tconst v32 = dir2;\r\n\r\n\t\tv02.subVectors( v0, v2 );\r\n\t\tdir1.subVectors( l1.end, l1.start );\r\n\t\tdir2.subVectors( l2.end, l2.start );\r\n\r\n\t\t// float d0232 = v02.Dot(v32);\r\n\t\tconst d0232 = v02.dot( v32 );\r\n\r\n\t\t// float d3210 = v32.Dot(v10);\r\n\t\tconst d3210 = v32.dot( v10 );\r\n\r\n\t\t// float d3232 = v32.Dot(v32);\r\n\t\tconst d3232 = v32.dot( v32 );\r\n\r\n\t\t// float d0210 = v02.Dot(v10);\r\n\t\tconst d0210 = v02.dot( v10 );\r\n\r\n\t\t// float d1010 = v10.Dot(v10);\r\n\t\tconst d1010 = v10.dot( v10 );\r\n\r\n\t\t// float denom = d1010*d3232 - d3210*d3210;\r\n\t\tconst denom = d1010 * d3232 - d3210 * d3210;\r\n\r\n\t\tlet d, d2;\r\n\t\tif ( denom !== 0 ) {\r\n\r\n\t\t\td = ( d0232 * d3210 - d0210 * d3232 ) / denom;\r\n\r\n\t\t} else {\r\n\r\n\t\t\td = 0;\r\n\r\n\t\t}\r\n\r\n\t\td2 = ( d0232 + d * d3210 ) / d3232;\r\n\r\n\t\tresult.x = d;\r\n\t\tresult.y = d2;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nexport const closestPointsSegmentToSegment = ( function () {\r\n\r\n\t// https://github.com/juj/MathGeoLib/blob/master/src/Geometry/LineSegment.cpp#L187\r\n\tconst paramResult = new Vector2();\r\n\tconst temp1 = new Vector3();\r\n\tconst temp2 = new Vector3();\r\n\treturn function closestPointsSegmentToSegment( l1, l2, target1, target2 ) {\r\n\r\n\t\tclosestPointLineToLine( l1, l2, paramResult );\r\n\r\n\t\tlet d = paramResult.x;\r\n\t\tlet d2 = paramResult.y;\r\n\t\tif ( d >= 0 && d <= 1 && d2 >= 0 && d2 <= 1 ) {\r\n\r\n\t\t\tl1.at( d, target1 );\r\n\t\t\tl2.at( d2, target2 );\r\n\r\n\t\t\treturn;\r\n\r\n\t\t} else if ( d >= 0 && d <= 1 ) {\r\n\r\n\t\t\t// Only d2 is out of bounds.\r\n\t\t\tif ( d2 < 0 ) {\r\n\r\n\t\t\t\tl2.at( 0, target2 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tl2.at( 1, target2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tl1.closestPointToPoint( target2, true, target1 );\r\n\t\t\treturn;\r\n\r\n\t\t} else if ( d2 >= 0 && d2 <= 1 ) {\r\n\r\n\t\t\t// Only d is out of bounds.\r\n\t\t\tif ( d < 0 ) {\r\n\r\n\t\t\t\tl1.at( 0, target1 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tl1.at( 1, target1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tl2.closestPointToPoint( target1, true, target2 );\r\n\t\t\treturn;\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// Both u and u2 are out of bounds.\r\n\t\t\tlet p;\r\n\t\t\tif ( d < 0 ) {\r\n\r\n\t\t\t\tp = l1.start;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tp = l1.end;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tlet p2;\r\n\t\t\tif ( d2 < 0 ) {\r\n\r\n\t\t\t\tp2 = l2.start;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tp2 = l2.end;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tconst closestPoint = temp1;\r\n\t\t\tconst closestPoint2 = temp2;\r\n\t\t\tl1.closestPointToPoint( p2, true, temp1 );\r\n\t\t\tl2.closestPointToPoint( p, true, temp2 );\r\n\r\n\t\t\tif ( closestPoint.distanceToSquared( p2 ) <= closestPoint2.distanceToSquared( p ) ) {\r\n\r\n\t\t\t\ttarget1.copy( closestPoint );\r\n\t\t\t\ttarget2.copy( p2 );\r\n\t\t\t\treturn;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\ttarget1.copy( p );\r\n\t\t\t\ttarget2.copy( closestPoint2 );\r\n\t\t\t\treturn;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n\r\nexport const sphereIntersectTriangle = ( function () {\r\n\r\n\t// https://stackoverflow.com/questions/34043955/detect-collision-between-sphere-and-triangle-in-three-js\r\n\tconst closestPointTemp = new Vector3();\r\n\tconst projectedPointTemp = new Vector3();\r\n\tconst planeTemp = new Plane();\r\n\tconst lineTemp = new Line3();\r\n\treturn function sphereIntersectTriangle( sphere, triangle ) {\r\n\r\n\t\tconst { radius, center } = sphere;\r\n\t\tconst { a, b, c } = triangle;\r\n\r\n\t\t// phase 1\r\n\t\tlineTemp.start = a;\r\n\t\tlineTemp.end = b;\r\n\t\tconst closestPoint1 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\r\n\t\tif ( closestPoint1.distanceTo( center ) <= radius ) return true;\r\n\r\n\t\tlineTemp.start = a;\r\n\t\tlineTemp.end = c;\r\n\t\tconst closestPoint2 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\r\n\t\tif ( closestPoint2.distanceTo( center ) <= radius ) return true;\r\n\r\n\t\tlineTemp.start = b;\r\n\t\tlineTemp.end = c;\r\n\t\tconst closestPoint3 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\r\n\t\tif ( closestPoint3.distanceTo( center ) <= radius ) return true;\r\n\r\n\t\t// phase 2\r\n\t\tconst plane = triangle.getPlane( planeTemp );\r\n\t\tconst dp = Math.abs( plane.distanceToPoint( center ) );\r\n\t\tif ( dp <= radius ) {\r\n\r\n\t\t\tconst pp = plane.projectPoint( center, projectedPointTemp );\r\n\t\t\tconst cp = triangle.containsPoint( pp );\r\n\t\t\tif ( cp ) return true;\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t};\r\n\r\n} )();\r\n","import { Triangle, Vector3, Line3, Sphere, Plane } from 'three';\r\nimport { SeparatingAxisBounds } from './SeparatingAxisBounds.js';\r\nimport { closestPointsSegmentToSegment, sphereIntersectTriangle } from './MathUtilities.js';\r\n\r\nconst DIST_EPSILON = 1e-15;\r\nfunction isNearZero( value ) {\r\n\r\n\treturn Math.abs( value ) < DIST_EPSILON;\r\n\r\n}\r\n\r\nexport class ExtendedTriangle extends Triangle {\r\n\r\n\tconstructor( ...args ) {\r\n\r\n\t\tsuper( ...args );\r\n\r\n\t\tthis.isExtendedTriangle = true;\r\n\t\tthis.satAxes = new Array( 4 ).fill().map( () => new Vector3() );\r\n\t\tthis.satBounds = new Array( 4 ).fill().map( () => new SeparatingAxisBounds() );\r\n\t\tthis.points = [ this.a, this.b, this.c ];\r\n\t\tthis.sphere = new Sphere();\r\n\t\tthis.plane = new Plane();\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\tintersectsSphere( sphere ) {\r\n\r\n\t\treturn sphereIntersectTriangle( sphere, this );\r\n\r\n\t}\r\n\r\n\tupdate() {\r\n\r\n\t\tconst a = this.a;\r\n\t\tconst b = this.b;\r\n\t\tconst c = this.c;\r\n\t\tconst points = this.points;\r\n\r\n\t\tconst satAxes = this.satAxes;\r\n\t\tconst satBounds = this.satBounds;\r\n\r\n\t\tconst axis0 = satAxes[ 0 ];\r\n\t\tconst sab0 = satBounds[ 0 ];\r\n\t\tthis.getNormal( axis0 );\r\n\t\tsab0.setFromPoints( axis0, points );\r\n\r\n\t\tconst axis1 = satAxes[ 1 ];\r\n\t\tconst sab1 = satBounds[ 1 ];\r\n\t\taxis1.subVectors( a, b );\r\n\t\tsab1.setFromPoints( axis1, points );\r\n\r\n\t\tconst axis2 = satAxes[ 2 ];\r\n\t\tconst sab2 = satBounds[ 2 ];\r\n\t\taxis2.subVectors( b, c );\r\n\t\tsab2.setFromPoints( axis2, points );\r\n\r\n\t\tconst axis3 = satAxes[ 3 ];\r\n\t\tconst sab3 = satBounds[ 3 ];\r\n\t\taxis3.subVectors( c, a );\r\n\t\tsab3.setFromPoints( axis3, points );\r\n\r\n\t\tthis.sphere.setFromPoints( this.points );\r\n\t\tthis.plane.setFromNormalAndCoplanarPoint( axis0, a );\r\n\t\tthis.needsUpdate = false;\r\n\r\n\t}\r\n\r\n}\r\n\r\nExtendedTriangle.prototype.closestPointToSegment = ( function () {\r\n\r\n\tconst point1 = new Vector3();\r\n\tconst point2 = new Vector3();\r\n\tconst edge = new Line3();\r\n\r\n\treturn function distanceToSegment( segment, target1 = null, target2 = null ) {\r\n\r\n\t\tconst { start, end } = segment;\r\n\t\tconst points = this.points;\r\n\t\tlet distSq;\r\n\t\tlet closestDistanceSq = Infinity;\r\n\r\n\t\t// check the triangle edges\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst nexti = ( i + 1 ) % 3;\r\n\t\t\tedge.start.copy( points[ i ] );\r\n\t\t\tedge.end.copy( points[ nexti ] );\r\n\r\n\t\t\tclosestPointsSegmentToSegment( edge, segment, point1, point2 );\r\n\r\n\t\t\tdistSq = point1.distanceToSquared( point2 );\r\n\t\t\tif ( distSq < closestDistanceSq ) {\r\n\r\n\t\t\t\tclosestDistanceSq = distSq;\r\n\t\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// check end points\r\n\t\tthis.closestPointToPoint( start, point1 );\r\n\t\tdistSq = start.distanceToSquared( point1 );\r\n\t\tif ( distSq < closestDistanceSq ) {\r\n\r\n\t\t\tclosestDistanceSq = distSq;\r\n\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\tif ( target2 ) target2.copy( start );\r\n\r\n\t\t}\r\n\r\n\t\tthis.closestPointToPoint( end, point1 );\r\n\t\tdistSq = end.distanceToSquared( point1 );\r\n\t\tif ( distSq < closestDistanceSq ) {\r\n\r\n\t\t\tclosestDistanceSq = distSq;\r\n\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\tif ( target2 ) target2.copy( end );\r\n\r\n\t\t}\r\n\r\n\t\treturn Math.sqrt( closestDistanceSq );\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nExtendedTriangle.prototype.intersectsTriangle = ( function () {\r\n\r\n\tconst saTri2 = new ExtendedTriangle();\r\n\tconst arr1 = new Array( 3 );\r\n\tconst arr2 = new Array( 3 );\r\n\tconst cachedSatBounds = new SeparatingAxisBounds();\r\n\tconst cachedSatBounds2 = new SeparatingAxisBounds();\r\n\tconst cachedAxis = new Vector3();\r\n\tconst dir1 = new Vector3();\r\n\tconst dir2 = new Vector3();\r\n\tconst tempDir = new Vector3();\r\n\tconst edge = new Line3();\r\n\tconst edge1 = new Line3();\r\n\tconst edge2 = new Line3();\r\n\r\n\t// TODO: If the triangles are coplanar and intersecting the target is nonsensical. It should at least\r\n\t// be a line contained by both triangles if not a different special case somehow represented in the return result.\r\n\treturn function intersectsTriangle( other, target = null ) {\r\n\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\tif ( ! other.isExtendedTriangle ) {\r\n\r\n\t\t\tsaTri2.copy( other );\r\n\t\t\tsaTri2.update();\r\n\t\t\tother = saTri2;\r\n\r\n\t\t} else if ( other.needsUpdate ) {\r\n\r\n\t\t\tother.update();\r\n\r\n\t\t}\r\n\r\n\t\tconst plane1 = this.plane;\r\n\t\tconst plane2 = other.plane;\r\n\r\n\t\tif ( Math.abs( plane1.normal.dot( plane2.normal ) ) > 1.0 - 1e-10 ) {\r\n\r\n\t\t\t// perform separating axis intersection test only for coplanar triangles\r\n\t\t\tconst satBounds1 = this.satBounds;\r\n\t\t\tconst satAxes1 = this.satAxes;\r\n\t\t\tarr2[ 0 ] = other.a;\r\n\t\t\tarr2[ 1 ] = other.b;\r\n\t\t\tarr2[ 2 ] = other.c;\r\n\t\t\tfor ( let i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\t\tconst sb = satBounds1[ i ];\r\n\t\t\t\tconst sa = satAxes1[ i ];\r\n\t\t\t\tcachedSatBounds.setFromPoints( sa, arr2 );\r\n\t\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tconst satBounds2 = other.satBounds;\r\n\t\t\tconst satAxes2 = other.satAxes;\r\n\t\t\tarr1[ 0 ] = this.a;\r\n\t\t\tarr1[ 1 ] = this.b;\r\n\t\t\tarr1[ 2 ] = this.c;\r\n\t\t\tfor ( let i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\t\tconst sb = satBounds2[ i ];\r\n\t\t\t\tconst sa = satAxes2[ i ];\r\n\t\t\t\tcachedSatBounds.setFromPoints( sa, arr1 );\r\n\t\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// check crossed axes\r\n\t\t\tfor ( let i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\t\tconst sa1 = satAxes1[ i ];\r\n\t\t\t\tfor ( let i2 = 0; i2 < 4; i2 ++ ) {\r\n\r\n\t\t\t\t\tconst sa2 = satAxes2[ i2 ];\r\n\t\t\t\t\tcachedAxis.crossVectors( sa1, sa2 );\r\n\t\t\t\t\tcachedSatBounds.setFromPoints( cachedAxis, arr1 );\r\n\t\t\t\t\tcachedSatBounds2.setFromPoints( cachedAxis, arr2 );\r\n\t\t\t\t\tif ( cachedSatBounds.isSeparated( cachedSatBounds2 ) ) return false;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( target ) {\r\n\r\n\t\t\t\t// TODO find two points that intersect on the edges and make that the result\r\n\t\t\t\tconsole.warn( 'ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0.' );\r\n\r\n\t\t\t\ttarget.start.set( 0, 0, 0 );\r\n\t\t\t\ttarget.end.set( 0, 0, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// find the edge that intersects the other triangle plane\r\n\t\t\tconst points1 = this.points;\r\n\t\t\tlet found1 = false;\r\n\t\t\tlet count1 = 0;\r\n\t\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\tconst p = points1[ i ];\r\n\t\t\t\tconst pNext = points1[ ( i + 1 ) % 3 ];\r\n\r\n\t\t\t\tedge.start.copy( p );\r\n\t\t\t\tedge.end.copy( pNext );\r\n\t\t\t\tedge.delta( dir1 );\r\n\r\n\t\t\t\tconst targetPoint = found1 ? edge1.start : edge1.end;\r\n\t\t\t\tconst startIntersects = isNearZero( plane2.distanceToPoint( p ) );\r\n\t\t\t\tif ( isNearZero( plane2.normal.dot( dir1 ) ) && startIntersects ) {\r\n\r\n\t\t\t\t\t// if the edge lies on the plane then take the line\r\n\t\t\t\t\tedge1.copy( edge );\r\n\t\t\t\t\tcount1 = 2;\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// check if the start point is near the plane because \"intersectLine\" is not robust to that case\r\n\t\t\t\tconst doesIntersect = plane2.intersectLine( edge, targetPoint ) || startIntersects;\r\n\t\t\t\tif ( doesIntersect && ! isNearZero( targetPoint.distanceTo( pNext ) ) ) {\r\n\r\n\t\t\t\t\tcount1 ++;\r\n\t\t\t\t\tif ( found1 ) {\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfound1 = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( count1 === 1 && this.containsPoint( edge1.end ) ) {\r\n\r\n\t\t\t\tif ( target ) {\r\n\r\n\t\t\t\t\ttarget.start.copy( edge1.end );\r\n\t\t\t\t\ttarget.end.copy( edge1.end );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t} else if ( count1 !== 2 ) {\r\n\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// find the other triangles edge that intersects this plane\r\n\t\t\tconst points2 = other.points;\r\n\t\t\tlet found2 = false;\r\n\t\t\tlet count2 = 0;\r\n\t\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\tconst p = points2[ i ];\r\n\t\t\t\tconst pNext = points2[ ( i + 1 ) % 3 ];\r\n\r\n\t\t\t\tedge.start.copy( p );\r\n\t\t\t\tedge.end.copy( pNext );\r\n\t\t\t\tedge.delta( dir2 );\r\n\r\n\t\t\t\tconst targetPoint = found2 ? edge2.start : edge2.end;\r\n\t\t\t\tconst startIntersects = isNearZero( plane1.distanceToPoint( p ) );\r\n\t\t\t\tif ( isNearZero( plane1.normal.dot( dir2 ) ) && startIntersects ) {\r\n\r\n\t\t\t\t\t// if the edge lies on the plane then take the line\r\n\t\t\t\t\tedge2.copy( edge );\r\n\t\t\t\t\tcount2 = 2;\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// check if the start point is near the plane because \"intersectLine\" is not robust to that case\r\n\t\t\t\tconst doesIntersect = plane1.intersectLine( edge, targetPoint ) || startIntersects;\r\n\t\t\t\tif ( doesIntersect && ! isNearZero( targetPoint.distanceTo( pNext ) ) ) {\r\n\r\n\t\t\t\t\tcount2 ++;\r\n\t\t\t\t\tif ( found2 ) {\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfound2 = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( count2 === 1 && this.containsPoint( edge2.end ) ) {\r\n\r\n\t\t\t\tif ( target ) {\r\n\r\n\t\t\t\t\ttarget.start.copy( edge2.end );\r\n\t\t\t\t\ttarget.end.copy( edge2.end );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t} else if ( count2 !== 2 ) {\r\n\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// find swap the second edge so both lines are running the same direction\r\n\t\t\tedge1.delta( dir1 );\r\n\t\t\tedge2.delta( dir2 );\r\n\r\n\t\t\tif ( dir1.dot( dir2 ) < 0 ) {\r\n\r\n\t\t\t\tlet tmp = edge2.start;\r\n\t\t\t\tedge2.start = edge2.end;\r\n\t\t\t\tedge2.end = tmp;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// check if the edges are overlapping\r\n\t\t\tconst s1 = edge1.start.dot( dir1 );\r\n\t\t\tconst e1 = edge1.end.dot( dir1 );\r\n\t\t\tconst s2 = edge2.start.dot( dir1 );\r\n\t\t\tconst e2 = edge2.end.dot( dir1 );\r\n\t\t\tconst separated1 = e1 < s2;\r\n\t\t\tconst separated2 = s1 < e2;\r\n\r\n\t\t\tif ( s1 !== e2 && s2 !== e1 && separated1 === separated2 ) {\r\n\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// assign the target output\r\n\t\t\tif ( target ) {\r\n\r\n\t\t\t\ttempDir.subVectors( edge1.start, edge2.start );\r\n\t\t\t\tif ( tempDir.dot( dir1 ) > 0 ) {\r\n\r\n\t\t\t\t\ttarget.start.copy( edge1.start );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\ttarget.start.copy( edge2.start );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttempDir.subVectors( edge1.end, edge2.end );\r\n\t\t\t\tif ( tempDir.dot( dir1 ) < 0 ) {\r\n\r\n\t\t\t\t\ttarget.end.copy( edge1.end );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\ttarget.end.copy( edge2.end );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n\r\nExtendedTriangle.prototype.distanceToPoint = ( function () {\r\n\r\n\tconst target = new Vector3();\r\n\treturn function distanceToPoint( point ) {\r\n\r\n\t\tthis.closestPointToPoint( point, target );\r\n\t\treturn point.distanceTo( target );\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n\r\nExtendedTriangle.prototype.distanceToTriangle = ( function () {\r\n\r\n\tconst point = new Vector3();\r\n\tconst point2 = new Vector3();\r\n\tconst cornerFields = [ 'a', 'b', 'c' ];\r\n\tconst line1 = new Line3();\r\n\tconst line2 = new Line3();\r\n\r\n\treturn function distanceToTriangle( other, target1 = null, target2 = null ) {\r\n\r\n\t\tconst lineTarget = target1 || target2 ? line1 : null;\r\n\t\tif ( this.intersectsTriangle( other, lineTarget ) ) {\r\n\r\n\t\t\tif ( target1 || target2 ) {\r\n\r\n\t\t\t\tif ( target1 ) lineTarget.getCenter( target1 );\r\n\t\t\t\tif ( target2 ) lineTarget.getCenter( target2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn 0;\r\n\r\n\t\t}\r\n\r\n\t\tlet closestDistanceSq = Infinity;\r\n\r\n\t\t// check all point distances\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tlet dist;\r\n\t\t\tconst field = cornerFields[ i ];\r\n\t\t\tconst otherVec = other[ field ];\r\n\t\t\tthis.closestPointToPoint( otherVec, point );\r\n\r\n\t\t\tdist = otherVec.distanceToSquared( point );\r\n\r\n\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\tif ( target1 ) target1.copy( point );\r\n\t\t\t\tif ( target2 ) target2.copy( otherVec );\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t\tconst thisVec = this[ field ];\r\n\t\t\tother.closestPointToPoint( thisVec, point );\r\n\r\n\t\t\tdist = thisVec.distanceToSquared( point );\r\n\r\n\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\tif ( target1 ) target1.copy( thisVec );\r\n\t\t\t\tif ( target2 ) target2.copy( point );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst f11 = cornerFields[ i ];\r\n\t\t\tconst f12 = cornerFields[ ( i + 1 ) % 3 ];\r\n\t\t\tline1.set( this[ f11 ], this[ f12 ] );\r\n\t\t\tfor ( let i2 = 0; i2 < 3; i2 ++ ) {\r\n\r\n\t\t\t\tconst f21 = cornerFields[ i2 ];\r\n\t\t\t\tconst f22 = cornerFields[ ( i2 + 1 ) % 3 ];\r\n\t\t\t\tline2.set( other[ f21 ], other[ f22 ] );\r\n\r\n\t\t\t\tclosestPointsSegmentToSegment( line1, line2, point, point2 );\r\n\r\n\t\t\t\tconst dist = point.distanceToSquared( point2 );\r\n\t\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\t\tif ( target1 ) target1.copy( point );\r\n\t\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn Math.sqrt( closestDistanceSq );\r\n\r\n\t};\r\n\r\n} )();\r\n","import { Vector3, Matrix4, Line3 } from 'three';\r\nimport { SeparatingAxisBounds } from './SeparatingAxisBounds.js';\r\nimport { ExtendedTriangle } from './ExtendedTriangle.js';\r\nimport { closestPointsSegmentToSegment } from './MathUtilities.js';\r\n\r\nexport class OrientedBox {\r\n\r\n\tconstructor( min, max, matrix ) {\r\n\r\n\t\tthis.isOrientedBox = true;\r\n\t\tthis.min = new Vector3();\r\n\t\tthis.max = new Vector3();\r\n\t\tthis.matrix = new Matrix4();\r\n\t\tthis.invMatrix = new Matrix4();\r\n\t\tthis.points = new Array( 8 ).fill().map( () => new Vector3() );\r\n\t\tthis.satAxes = new Array( 3 ).fill().map( () => new Vector3() );\r\n\t\tthis.satBounds = new Array( 3 ).fill().map( () => new SeparatingAxisBounds() );\r\n\t\tthis.alignedSatBounds = new Array( 3 ).fill().map( () => new SeparatingAxisBounds() );\r\n\t\tthis.needsUpdate = false;\r\n\r\n\t\tif ( min ) this.min.copy( min );\r\n\t\tif ( max ) this.max.copy( max );\r\n\t\tif ( matrix ) this.matrix.copy( matrix );\r\n\r\n\t}\r\n\r\n\tset( min, max, matrix ) {\r\n\r\n\t\tthis.min.copy( min );\r\n\t\tthis.max.copy( max );\r\n\t\tthis.matrix.copy( matrix );\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\tcopy( other ) {\r\n\r\n\t\tthis.min.copy( other.min );\r\n\t\tthis.max.copy( other.max );\r\n\t\tthis.matrix.copy( other.matrix );\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n\r\nOrientedBox.prototype.update = ( function () {\r\n\r\n\treturn function update() {\r\n\r\n\t\tconst matrix = this.matrix;\r\n\t\tconst min = this.min;\r\n\t\tconst max = this.max;\r\n\r\n\t\tconst points = this.points;\r\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\r\n\r\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\r\n\r\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\r\n\r\n\t\t\t\t\tconst i = ( ( 1 << 0 ) * x ) | ( ( 1 << 1 ) * y ) | ( ( 1 << 2 ) * z );\r\n\t\t\t\t\tconst v = points[ i ];\r\n\t\t\t\t\tv.x = x ? max.x : min.x;\r\n\t\t\t\t\tv.y = y ? max.y : min.y;\r\n\t\t\t\t\tv.z = z ? max.z : min.z;\r\n\r\n\t\t\t\t\tv.applyMatrix4( matrix );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tconst satBounds = this.satBounds;\r\n\t\tconst satAxes = this.satAxes;\r\n\t\tconst minVec = points[ 0 ];\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst axis = satAxes[ i ];\r\n\t\t\tconst sb = satBounds[ i ];\r\n\t\t\tconst index = 1 << i;\r\n\t\t\tconst pi = points[ index ];\r\n\r\n\t\t\taxis.subVectors( minVec, pi );\r\n\t\t\tsb.setFromPoints( axis, points );\r\n\r\n\t\t}\r\n\r\n\t\tconst alignedSatBounds = this.alignedSatBounds;\r\n\t\talignedSatBounds[ 0 ].setFromPointsField( points, 'x' );\r\n\t\talignedSatBounds[ 1 ].setFromPointsField( points, 'y' );\r\n\t\talignedSatBounds[ 2 ].setFromPointsField( points, 'z' );\r\n\r\n\t\tthis.invMatrix.copy( this.matrix ).invert();\r\n\t\tthis.needsUpdate = false;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nOrientedBox.prototype.intersectsBox = ( function () {\r\n\r\n\tconst aabbBounds = new SeparatingAxisBounds();\r\n\treturn function intersectsBox( box ) {\r\n\r\n\t\t// TODO: should this be doing SAT against the AABB?\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\tconst min = box.min;\r\n\t\tconst max = box.max;\r\n\t\tconst satBounds = this.satBounds;\r\n\t\tconst satAxes = this.satAxes;\r\n\t\tconst alignedSatBounds = this.alignedSatBounds;\r\n\r\n\t\taabbBounds.min = min.x;\r\n\t\taabbBounds.max = max.x;\r\n\t\tif ( alignedSatBounds[ 0 ].isSeparated( aabbBounds ) ) return false;\r\n\r\n\t\taabbBounds.min = min.y;\r\n\t\taabbBounds.max = max.y;\r\n\t\tif ( alignedSatBounds[ 1 ].isSeparated( aabbBounds ) ) return false;\r\n\r\n\t\taabbBounds.min = min.z;\r\n\t\taabbBounds.max = max.z;\r\n\t\tif ( alignedSatBounds[ 2 ].isSeparated( aabbBounds ) ) return false;\r\n\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst axis = satAxes[ i ];\r\n\t\t\tconst sb = satBounds[ i ];\r\n\t\t\taabbBounds.setFromBox( axis, box );\r\n\t\t\tif ( sb.isSeparated( aabbBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nOrientedBox.prototype.intersectsTriangle = ( function () {\r\n\r\n\tconst saTri = new ExtendedTriangle();\r\n\tconst pointsArr = new Array( 3 );\r\n\tconst cachedSatBounds = new SeparatingAxisBounds();\r\n\tconst cachedSatBounds2 = new SeparatingAxisBounds();\r\n\tconst cachedAxis = new Vector3();\r\n\treturn function intersectsTriangle( triangle ) {\r\n\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\tif ( ! triangle.isExtendedTriangle ) {\r\n\r\n\t\t\tsaTri.copy( triangle );\r\n\t\t\tsaTri.update();\r\n\t\t\ttriangle = saTri;\r\n\r\n\t\t} else if ( triangle.needsUpdate ) {\r\n\r\n\t\t\ttriangle.update();\r\n\r\n\t\t}\r\n\r\n\t\tconst satBounds = this.satBounds;\r\n\t\tconst satAxes = this.satAxes;\r\n\r\n\t\tpointsArr[ 0 ] = triangle.a;\r\n\t\tpointsArr[ 1 ] = triangle.b;\r\n\t\tpointsArr[ 2 ] = triangle.c;\r\n\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sb = satBounds[ i ];\r\n\t\t\tconst sa = satAxes[ i ];\r\n\t\t\tcachedSatBounds.setFromPoints( sa, pointsArr );\r\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\tconst triSatBounds = triangle.satBounds;\r\n\t\tconst triSatAxes = triangle.satAxes;\r\n\t\tconst points = this.points;\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sb = triSatBounds[ i ];\r\n\t\t\tconst sa = triSatAxes[ i ];\r\n\t\t\tcachedSatBounds.setFromPoints( sa, points );\r\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\t// check crossed axes\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sa1 = satAxes[ i ];\r\n\t\t\tfor ( let i2 = 0; i2 < 4; i2 ++ ) {\r\n\r\n\t\t\t\tconst sa2 = triSatAxes[ i2 ];\r\n\t\t\t\tcachedAxis.crossVectors( sa1, sa2 );\r\n\t\t\t\tcachedSatBounds.setFromPoints( cachedAxis, pointsArr );\r\n\t\t\t\tcachedSatBounds2.setFromPoints( cachedAxis, points );\r\n\t\t\t\tif ( cachedSatBounds.isSeparated( cachedSatBounds2 ) ) return false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nOrientedBox.prototype.closestPointToPoint = ( function () {\r\n\r\n\treturn function closestPointToPoint( point, target1 ) {\r\n\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\ttarget1\r\n\t\t\t.copy( point )\r\n\t\t\t.applyMatrix4( this.invMatrix )\r\n\t\t\t.clamp( this.min, this.max )\r\n\t\t\t.applyMatrix4( this.matrix );\r\n\r\n\t\treturn target1;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nOrientedBox.prototype.distanceToPoint = ( function () {\r\n\r\n\tconst target = new Vector3();\r\n\treturn function distanceToPoint( point ) {\r\n\r\n\t\tthis.closestPointToPoint( point, target );\r\n\t\treturn point.distanceTo( target );\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nOrientedBox.prototype.distanceToBox = ( function () {\r\n\r\n\tconst xyzFields = [ 'x', 'y', 'z' ];\r\n\tconst segments1 = new Array( 12 ).fill().map( () => new Line3() );\r\n\tconst segments2 = new Array( 12 ).fill().map( () => new Line3() );\r\n\r\n\tconst point1 = new Vector3();\r\n\tconst point2 = new Vector3();\r\n\r\n\t// early out if we find a value below threshold\r\n\treturn function distanceToBox( box, threshold = 0, target1 = null, target2 = null ) {\r\n\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.intersectsBox( box ) ) {\r\n\r\n\t\t\tif ( target1 || target2 ) {\r\n\r\n\t\t\t\tbox.getCenter( point2 );\r\n\t\t\t\tthis.closestPointToPoint( point2, point1 );\r\n\t\t\t\tbox.closestPointToPoint( point1, point2 );\r\n\r\n\t\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn 0;\r\n\r\n\t\t}\r\n\r\n\t\tconst threshold2 = threshold * threshold;\r\n\t\tconst min = box.min;\r\n\t\tconst max = box.max;\r\n\t\tconst points = this.points;\r\n\r\n\r\n\t\t// iterate over every edge and compare distances\r\n\t\tlet closestDistanceSq = Infinity;\r\n\r\n\t\t// check over all these points\r\n\t\tfor ( let i = 0; i < 8; i ++ ) {\r\n\r\n\t\t\tconst p = points[ i ];\r\n\t\t\tpoint2.copy( p ).clamp( min, max );\r\n\r\n\t\t\tconst dist = p.distanceToSquared( point2 );\r\n\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\tif ( target1 ) target1.copy( p );\r\n\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// generate and check all line segment distances\r\n\t\tlet count = 0;\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tfor ( let i1 = 0; i1 <= 1; i1 ++ ) {\r\n\r\n\t\t\t\tfor ( let i2 = 0; i2 <= 1; i2 ++ ) {\r\n\r\n\t\t\t\t\tconst nextIndex = ( i + 1 ) % 3;\r\n\t\t\t\t\tconst nextIndex2 = ( i + 2 ) % 3;\r\n\r\n\t\t\t\t\t// get obb line segments\r\n\t\t\t\t\tconst index = i1 << nextIndex | i2 << nextIndex2;\r\n\t\t\t\t\tconst index2 = 1 << i | i1 << nextIndex | i2 << nextIndex2;\r\n\t\t\t\t\tconst p1 = points[ index ];\r\n\t\t\t\t\tconst p2 = points[ index2 ];\r\n\t\t\t\t\tconst line1 = segments1[ count ];\r\n\t\t\t\t\tline1.set( p1, p2 );\r\n\r\n\r\n\t\t\t\t\t// get aabb line segments\r\n\t\t\t\t\tconst f1 = xyzFields[ i ];\r\n\t\t\t\t\tconst f2 = xyzFields[ nextIndex ];\r\n\t\t\t\t\tconst f3 = xyzFields[ nextIndex2 ];\r\n\t\t\t\t\tconst line2 = segments2[ count ];\r\n\t\t\t\t\tconst start = line2.start;\r\n\t\t\t\t\tconst end = line2.end;\r\n\r\n\t\t\t\t\tstart[ f1 ] = min[ f1 ];\r\n\t\t\t\t\tstart[ f2 ] = i1 ? min[ f2 ] : max[ f2 ];\r\n\t\t\t\t\tstart[ f3 ] = i2 ? min[ f3 ] : max[ f2 ];\r\n\r\n\t\t\t\t\tend[ f1 ] = max[ f1 ];\r\n\t\t\t\t\tend[ f2 ] = i1 ? min[ f2 ] : max[ f2 ];\r\n\t\t\t\t\tend[ f3 ] = i2 ? min[ f3 ] : max[ f2 ];\r\n\r\n\t\t\t\t\tcount ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// check all the other boxes point\r\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\r\n\r\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\r\n\r\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\r\n\r\n\t\t\t\t\tpoint2.x = x ? max.x : min.x;\r\n\t\t\t\t\tpoint2.y = y ? max.y : min.y;\r\n\t\t\t\t\tpoint2.z = z ? max.z : min.z;\r\n\r\n\t\t\t\t\tthis.closestPointToPoint( point2, point1 );\r\n\t\t\t\t\tconst dist = point2.distanceToSquared( point1 );\r\n\t\t\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( let i = 0; i < 12; i ++ ) {\r\n\r\n\t\t\tconst l1 = segments1[ i ];\r\n\t\t\tfor ( let i2 = 0; i2 < 12; i2 ++ ) {\r\n\r\n\t\t\t\tconst l2 = segments2[ i2 ];\r\n\t\t\t\tclosestPointsSegmentToSegment( l1, l2, point1, point2 );\r\n\t\t\t\tconst dist = point1.distanceToSquared( point2 );\r\n\t\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn Math.sqrt( closestDistanceSq );\r\n\r\n\t};\r\n\r\n} )();\r\n","import { Vector3, Vector2, Triangle, DoubleSide, BackSide } from 'three';\r\n\r\n// Ripped and modified From THREE.js Mesh raycast\r\n// https://github.com/mrdoob/three.js/blob/0aa87c999fe61e216c1133fba7a95772b503eddf/src/objects/Mesh.js#L115\r\nconst vA = /* @__PURE__ */ new Vector3();\r\nconst vB = /* @__PURE__ */ new Vector3();\r\nconst vC = /* @__PURE__ */ new Vector3();\r\n\r\nconst uvA = /* @__PURE__ */ new Vector2();\r\nconst uvB = /* @__PURE__ */ new Vector2();\r\nconst uvC = /* @__PURE__ */ new Vector2();\r\n\r\nconst intersectionPoint = /* @__PURE__ */ new Vector3();\r\nfunction checkIntersection( ray, pA, pB, pC, point, side ) {\r\n\r\n\tlet intersect;\r\n\tif ( side === BackSide ) {\r\n\r\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\r\n\r\n\t} else {\r\n\r\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, side !== DoubleSide, point );\r\n\r\n\t}\r\n\r\n\tif ( intersect === null ) return null;\r\n\r\n\tconst distance = ray.origin.distanceTo( point );\r\n\r\n\treturn {\r\n\r\n\t\tdistance: distance,\r\n\t\tpoint: point.clone(),\r\n\r\n\t};\r\n\r\n}\r\n\r\nfunction checkBufferGeometryIntersection( ray, position, uv, a, b, c, side ) {\r\n\r\n\tvA.fromBufferAttribute( position, a );\r\n\tvB.fromBufferAttribute( position, b );\r\n\tvC.fromBufferAttribute( position, c );\r\n\r\n\tconst intersection = checkIntersection( ray, vA, vB, vC, intersectionPoint, side );\r\n\r\n\tif ( intersection ) {\r\n\r\n\t\tif ( uv ) {\r\n\r\n\t\t\tuvA.fromBufferAttribute( uv, a );\r\n\t\t\tuvB.fromBufferAttribute( uv, b );\r\n\t\t\tuvC.fromBufferAttribute( uv, c );\r\n\r\n\t\t\tintersection.uv = Triangle.getUV( intersectionPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2( ) );\r\n\r\n\t\t}\r\n\r\n\t\tconst face = {\r\n\t\t\ta: a,\r\n\t\t\tb: b,\r\n\t\t\tc: c,\r\n\t\t\tnormal: new Vector3(),\r\n\t\t\tmaterialIndex: 0\r\n\t\t};\r\n\r\n\t\tTriangle.getNormal( vA, vB, vC, face.normal );\r\n\r\n\t\tintersection.face = face;\r\n\t\tintersection.faceIndex = a;\r\n\r\n\t}\r\n\r\n\treturn intersection;\r\n\r\n}\r\n\r\n// https://github.com/mrdoob/three.js/blob/0aa87c999fe61e216c1133fba7a95772b503eddf/src/objects/Mesh.js#L258\r\nfunction intersectTri( geo, side, ray, tri, intersections ) {\r\n\r\n\tconst triOffset = tri * 3;\r\n\tconst a = geo.index.getX( triOffset );\r\n\tconst b = geo.index.getX( triOffset + 1 );\r\n\tconst c = geo.index.getX( triOffset + 2 );\r\n\r\n\tconst intersection = checkBufferGeometryIntersection( ray, geo.attributes.position, geo.attributes.uv, a, b, c, side );\r\n\r\n\tif ( intersection ) {\r\n\r\n\t\tintersection.faceIndex = tri;\r\n\t\tif ( intersections ) intersections.push( intersection );\r\n\t\treturn intersection;\r\n\r\n\t}\r\n\r\n\treturn null;\r\n\r\n}\r\n\r\nexport { intersectTri };\r\n","import { intersectTri } from './ThreeRayIntersectUtilities.js';\r\n\r\nexport function intersectTris( geo, side, ray, offset, count, intersections ) {\r\n\r\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\r\n\r\n\t\tintersectTri( geo, side, ray, i, intersections );\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport function intersectClosestTri( geo, side, ray, offset, count ) {\r\n\r\n\tlet dist = Infinity;\r\n\tlet res = null;\r\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\r\n\r\n\t\tconst intersection = intersectTri( geo, side, ray, i );\r\n\t\tif ( intersection && intersection.distance < dist ) {\r\n\r\n\t\t\tres = intersection;\r\n\t\t\tdist = intersection.distance;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn res;\r\n\r\n}\r\n\r\n// converts the given BVH raycast intersection to align with the three.js raycast\r\n// structure (include object, world space distance and point).\r\nexport function convertRaycastIntersect( hit, object, raycaster ) {\r\n\r\n\tif ( hit === null ) {\r\n\r\n\t\treturn null;\r\n\r\n\t}\r\n\r\n\thit.point.applyMatrix4( object.matrixWorld );\r\n\thit.distance = hit.point.distanceTo( raycaster.ray.origin );\r\n\thit.object = object;\r\n\r\n\tif ( hit.distance < raycaster.near || hit.distance > raycaster.far ) {\r\n\r\n\t\treturn null;\r\n\r\n\t} else {\r\n\r\n\t\treturn hit;\r\n\r\n\t}\r\n\r\n}\r\n","\r\nimport { Vector2, Vector3, Triangle } from 'three';\r\n\r\n// sets the vertices of triangle `tri` with the 3 vertices after i\r\nexport function setTriangle( tri, i, index, pos ) {\r\n\r\n\tconst ta = tri.a;\r\n\tconst tb = tri.b;\r\n\tconst tc = tri.c;\r\n\r\n\tlet i0 = i;\r\n\tlet i1 = i + 1;\r\n\tlet i2 = i + 2;\r\n\tif ( index ) {\r\n\r\n\t\ti0 = index.getX( i );\r\n\t\ti1 = index.getX( i + 1 );\r\n\t\ti2 = index.getX( i + 2 );\r\n\r\n\t}\r\n\r\n\tta.x = pos.getX( i0 );\r\n\tta.y = pos.getY( i0 );\r\n\tta.z = pos.getZ( i0 );\r\n\r\n\ttb.x = pos.getX( i1 );\r\n\ttb.y = pos.getY( i1 );\r\n\ttb.z = pos.getZ( i1 );\r\n\r\n\ttc.x = pos.getX( i2 );\r\n\ttc.y = pos.getY( i2 );\r\n\ttc.z = pos.getZ( i2 );\r\n\r\n}\r\n\r\nexport function iterateOverTriangles(\r\n\toffset,\r\n\tcount,\r\n\tgeometry,\r\n\tintersectsTriangleFunc,\r\n\tcontained,\r\n\tdepth,\r\n\ttriangle\r\n) {\r\n\r\n\tconst index = geometry.index;\r\n\tconst pos = geometry.attributes.position;\r\n\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\r\n\r\n\t\tsetTriangle( triangle, i * 3, index, pos );\r\n\t\ttriangle.needsUpdate = true;\r\n\r\n\t\tif ( intersectsTriangleFunc( triangle, i, contained, depth ) ) {\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn false;\r\n\r\n}\r\n\r\nconst tempV1 = /* @__PURE__ */ new Vector3();\r\nconst tempV2 = /* @__PURE__ */ new Vector3();\r\nconst tempV3 = /* @__PURE__ */ new Vector3();\r\nconst tempUV1 = /* @__PURE__ */ new Vector2();\r\nconst tempUV2 = /* @__PURE__ */ new Vector2();\r\nconst tempUV3 = /* @__PURE__ */ new Vector2();\r\n\r\nexport function getTriangleHitPointInfo( point, geometry, triangleIndex, target ) {\r\n\r\n\tconst indices = geometry.getIndex().array;\r\n\tconst positions = geometry.getAttribute( 'position' );\r\n\tconst uvs = geometry.getAttribute( 'uv' );\r\n\r\n\tconst a = indices[ triangleIndex * 3 ];\r\n\tconst b = indices[ triangleIndex * 3 + 1 ];\r\n\tconst c = indices[ triangleIndex * 3 + 2 ];\r\n\r\n\ttempV1.fromBufferAttribute( positions, a );\r\n\ttempV2.fromBufferAttribute( positions, b );\r\n\ttempV3.fromBufferAttribute( positions, c );\r\n\r\n\t// find the associated material index\r\n\tlet materialIndex = 0;\r\n\tconst groups = geometry.groups;\r\n\tconst firstVertexIndex = triangleIndex * 3;\r\n\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\r\n\r\n\t\tconst group = groups[ i ];\r\n\t\tconst { start, count } = group;\r\n\t\tif ( firstVertexIndex >= start && firstVertexIndex < start + count ) {\r\n\r\n\t\t\tmaterialIndex = group.materialIndex;\r\n\t\t\tbreak;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// extract uvs\r\n\tlet uv = null;\r\n\tif ( uvs ) {\r\n\r\n\t\ttempUV1.fromBufferAttribute( uvs, a );\r\n\t\ttempUV2.fromBufferAttribute( uvs, b );\r\n\t\ttempUV3.fromBufferAttribute( uvs, c );\r\n\r\n\t\tif ( target && target.uv ) uv = target.uv;\r\n\t\telse uv = new Vector2();\r\n\r\n\t\tTriangle.getUV( point, tempV1, tempV2, tempV3, tempUV1, tempUV2, tempUV3, uv );\r\n\r\n\t}\r\n\r\n\t// adjust the provided target or create a new one\r\n\tif ( target ) {\r\n\r\n\t\tif ( ! target.face ) target.face = { };\r\n\t\ttarget.face.a = a;\r\n\t\ttarget.face.b = b;\r\n\t\ttarget.face.c = c;\r\n\t\ttarget.face.materialIndex = materialIndex;\r\n\t\tif ( ! target.face.normal ) target.face.normal = new Vector3();\r\n\t\tTriangle.getNormal( tempV1, tempV2, tempV3, target.face.normal );\r\n\r\n\t\tif ( ! target.uv ) target.uv = new Vector2();\r\n\t\ttarget.uv.copy( uv );\r\n\r\n\t\treturn target;\r\n\r\n\t} else {\r\n\r\n\t\treturn {\r\n\t\t\tface: {\r\n\t\t\t\ta: a,\r\n\t\t\t\tb: b,\r\n\t\t\t\tc: c,\r\n\t\t\t\tmaterialIndex: materialIndex,\r\n\t\t\t\tnormal: Triangle.getNormal( tempV1, tempV2, tempV3, new Vector3() )\r\n\t\t\t},\r\n\t\t\tuv: uv\r\n\t\t};\r\n\r\n\t}\r\n\r\n}\r\n","export class PrimitivePool {\r\n\r\n\tconstructor( getNewPrimitive ) {\r\n\r\n\t\tthis._getNewPrimitive = getNewPrimitive;\r\n\t\tthis._primitives = [];\r\n\r\n\t}\r\n\r\n\tgetPrimitive() {\r\n\r\n\t\tconst primitives = this._primitives;\r\n\t\tif ( primitives.length === 0 ) {\r\n\r\n\t\t\treturn this._getNewPrimitive();\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn primitives.pop();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treleasePrimitive( primitive ) {\r\n\r\n\t\tthis._primitives.push( primitive );\r\n\r\n\t}\r\n\r\n}\r\n","export function IS_LEAF( n16, uint16Array ) {\r\n\r\n\treturn uint16Array[ n16 + 15 ] === 0xFFFF;\r\n\r\n}\r\n\r\nexport function OFFSET( n32, uint32Array ) {\r\n\r\n\treturn uint32Array[ n32 + 6 ];\r\n\r\n}\r\n\r\nexport function COUNT( n16, uint16Array ) {\r\n\r\n\treturn uint16Array[ n16 + 14 ];\r\n\r\n}\r\n\r\nexport function LEFT_NODE( n32 ) {\r\n\r\n\treturn n32 + 8;\r\n\r\n}\r\n\r\nexport function RIGHT_NODE( n32, uint32Array ) {\r\n\r\n\treturn uint32Array[ n32 + 6 ];\r\n\r\n}\r\n\r\nexport function SPLIT_AXIS( n32, uint32Array ) {\r\n\r\n\treturn uint32Array[ n32 + 7 ];\r\n\r\n}\r\n\r\nexport function BOUNDING_DATA_INDEX( n32 ) {\r\n\r\n\treturn n32;\r\n\r\n}\r\n","import { Box3, Vector3, Matrix4 } from 'three';\r\nimport { CONTAINED } from './Constants.js';\r\n\r\nimport { OrientedBox } from '../math/OrientedBox.js';\r\nimport { ExtendedTriangle } from '../math/ExtendedTriangle.js';\r\nimport { intersectTris, intersectClosestTri } from '../utils/GeometryRayIntersectUtilities.js';\r\nimport { setTriangle } from '../utils/TriangleUtilities.js';\r\nimport { arrayToBox } from '../utils/ArrayBoxUtilities.js';\r\nimport { PrimitivePool } from '../utils/PrimitivePool.js';\r\nimport { COUNT, OFFSET, LEFT_NODE, RIGHT_NODE, IS_LEAF, BOUNDING_DATA_INDEX, SPLIT_AXIS } from './nodeBufferFunctions.js';\r\n\r\nconst boundingBox = new Box3();\r\nconst boxIntersection = new Vector3();\r\nconst xyzFields = [ 'x', 'y', 'z' ];\r\n\r\nexport function raycast( nodeIndex32, geometry, side, ray, intersects ) {\r\n\r\n\tlet nodeIndex16 = nodeIndex32 * 2, float32Array = _float32Array, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\r\n\tif ( isLeaf ) {\r\n\r\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\r\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\r\n\r\n\t\tintersectTris( geometry, side, ray, offset, count, intersects );\r\n\r\n\t} else {\r\n\r\n\t\tconst leftIndex = LEFT_NODE( nodeIndex32 );\r\n\t\tif ( intersectRay( leftIndex, float32Array, ray, boxIntersection ) ) {\r\n\r\n\t\t\traycast( leftIndex, geometry, side, ray, intersects );\r\n\r\n\t\t}\r\n\r\n\t\tconst rightIndex = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\t\tif ( intersectRay( rightIndex, float32Array, ray, boxIntersection ) ) {\r\n\r\n\t\t\traycast( rightIndex, geometry, side, ray, intersects );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport function raycastFirst( nodeIndex32, geometry, side, ray ) {\r\n\r\n\tlet nodeIndex16 = nodeIndex32 * 2, float32Array = _float32Array, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\r\n\tif ( isLeaf ) {\r\n\r\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\r\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\r\n\t\treturn intersectClosestTri( geometry, side, ray, offset, count );\r\n\r\n\t} else {\r\n\r\n\t\t// consider the position of the split plane with respect to the oncoming ray; whichever direction\r\n\t\t// the ray is coming from, look for an intersection among that side of the tree first\r\n\t\tconst splitAxis = SPLIT_AXIS( nodeIndex32, uint32Array );\r\n\t\tconst xyzAxis = xyzFields[ splitAxis ];\r\n\t\tconst rayDir = ray.direction[ xyzAxis ];\r\n\t\tconst leftToRight = rayDir >= 0;\r\n\r\n\t\t// c1 is the child to check first\r\n\t\tlet c1, c2;\r\n\t\tif ( leftToRight ) {\r\n\r\n\t\t\tc1 = LEFT_NODE( nodeIndex32 );\r\n\t\t\tc2 = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tc1 = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\t\t\tc2 = LEFT_NODE( nodeIndex32 );\r\n\r\n\t\t}\r\n\r\n\t\tconst c1Intersection = intersectRay( c1, float32Array, ray, boxIntersection );\r\n\t\tconst c1Result = c1Intersection ? raycastFirst( c1, geometry, side, ray ) : null;\r\n\r\n\t\t// if we got an intersection in the first node and it's closer than the second node's bounding\r\n\t\t// box, we don't need to consider the second node because it couldn't possibly be a better result\r\n\t\tif ( c1Result ) {\r\n\r\n\t\t\t// check if the point is within the second bounds\r\n\t\t\t// \"point\" is in the local frame of the bvh\r\n\t\t\tconst point = c1Result.point[ xyzAxis ];\r\n\t\t\tconst isOutside = leftToRight ?\r\n\t\t\t\tpoint <= float32Array[ c2 + splitAxis ] : // min bounding data\r\n\t\t\t\tpoint >= float32Array[ c2 + splitAxis + 3 ]; // max bounding data\r\n\r\n\t\t\tif ( isOutside ) {\r\n\r\n\t\t\t\treturn c1Result;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// either there was no intersection in the first node, or there could still be a closer\r\n\t\t// intersection in the second, so check the second node and then take the better of the two\r\n\t\tconst c2Intersection = intersectRay( c2, float32Array, ray, boxIntersection );\r\n\t\tconst c2Result = c2Intersection ? raycastFirst( c2, geometry, side, ray ) : null;\r\n\r\n\t\tif ( c1Result && c2Result ) {\r\n\r\n\t\t\treturn c1Result.distance <= c2Result.distance ? c1Result : c2Result;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn c1Result || c2Result || null;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport const shapecast = ( function () {\r\n\r\n\tlet _box1, _box2;\r\n\tconst boxStack = [];\r\n\tconst boxPool = new PrimitivePool( () => new Box3() );\r\n\r\n\treturn function shapecast( ...args ) {\r\n\r\n\t\t_box1 = boxPool.getPrimitive();\r\n\t\t_box2 = boxPool.getPrimitive();\r\n\t\tboxStack.push( _box1, _box2 );\r\n\r\n\t\tconst result = shapecastTraverse( ...args );\r\n\r\n\t\tboxPool.releasePrimitive( _box1 );\r\n\t\tboxPool.releasePrimitive( _box2 );\r\n\t\tboxStack.pop();\r\n\t\tboxStack.pop();\r\n\r\n\t\tconst length = boxStack.length;\r\n\t\tif ( length > 0 ) {\r\n\r\n\t\t\t_box2 = boxStack[ length - 1 ];\r\n\t\t\t_box1 = boxStack[ length - 2 ];\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t};\r\n\r\n\tfunction shapecastTraverse(\r\n\t\tnodeIndex32,\r\n\t\tgeometry,\r\n\t\tintersectsBoundsFunc,\r\n\t\tintersectsRangeFunc,\r\n\t\tnodeScoreFunc = null,\r\n\t\tnodeIndexByteOffset = 0, // offset for unique node identifier\r\n\t\tdepth = 0\r\n\t) {\r\n\r\n\t\t// Define these inside the function so it has access to the local variables needed\r\n\t\t// when converting to the buffer equivalents\r\n\t\tfunction getLeftOffset( nodeIndex32 ) {\r\n\r\n\t\t\tlet nodeIndex16 = nodeIndex32 * 2, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\t\t\t// traverse until we find a leaf\r\n\t\t\twhile ( ! IS_LEAF( nodeIndex16, uint16Array ) ) {\r\n\r\n\t\t\t\tnodeIndex32 = LEFT_NODE( nodeIndex32 );\r\n\t\t\t\tnodeIndex16 = nodeIndex32 * 2;\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn OFFSET( nodeIndex32, uint32Array );\r\n\r\n\t\t}\r\n\r\n\t\tfunction getRightEndOffset( nodeIndex32 ) {\r\n\r\n\t\t\tlet nodeIndex16 = nodeIndex32 * 2, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\t\t\t// traverse until we find a leaf\r\n\t\t\twhile ( ! IS_LEAF( nodeIndex16, uint16Array ) ) {\r\n\r\n\t\t\t\t// adjust offset to point to the right node\r\n\t\t\t\tnodeIndex32 = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\t\t\t\tnodeIndex16 = nodeIndex32 * 2;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// return the end offset of the triangle range\r\n\t\t\treturn OFFSET( nodeIndex32, uint32Array ) + COUNT( nodeIndex16, uint16Array );\r\n\r\n\t\t}\r\n\r\n\t\tlet nodeIndex16 = nodeIndex32 * 2, float32Array = _float32Array, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\t\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\r\n\t\tif ( isLeaf ) {\r\n\r\n\t\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\r\n\t\t\tconst count = COUNT( nodeIndex16, uint16Array );\r\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( nodeIndex32 ), float32Array, _box1 );\r\n\t\t\treturn intersectsRangeFunc( offset, count, false, depth, nodeIndexByteOffset + nodeIndex32, _box1 );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconst left = LEFT_NODE( nodeIndex32 );\r\n\t\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\t\t\tlet c1 = left;\r\n\t\t\tlet c2 = right;\r\n\r\n\t\t\tlet score1, score2;\r\n\t\t\tlet box1, box2;\r\n\t\t\tif ( nodeScoreFunc ) {\r\n\r\n\t\t\t\tbox1 = _box1;\r\n\t\t\t\tbox2 = _box2;\r\n\r\n\t\t\t\t// bounding data is not offset\r\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c1 ), float32Array, box1 );\r\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c2 ), float32Array, box2 );\r\n\r\n\t\t\t\tscore1 = nodeScoreFunc( box1 );\r\n\t\t\t\tscore2 = nodeScoreFunc( box2 );\r\n\r\n\t\t\t\tif ( score2 < score1 ) {\r\n\r\n\t\t\t\t\tc1 = right;\r\n\t\t\t\t\tc2 = left;\r\n\r\n\t\t\t\t\tconst temp = score1;\r\n\t\t\t\t\tscore1 = score2;\r\n\t\t\t\t\tscore2 = temp;\r\n\r\n\t\t\t\t\tbox1 = box2;\r\n\t\t\t\t\t// box2 is always set before use below\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Check box 1 intersection\r\n\t\t\tif ( ! box1 ) {\r\n\r\n\t\t\t\tbox1 = _box1;\r\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c1 ), float32Array, box1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tconst isC1Leaf = IS_LEAF( c1 * 2, uint16Array );\r\n\t\t\tconst c1Intersection = intersectsBoundsFunc( box1, isC1Leaf, score1, depth + 1, nodeIndexByteOffset + c1 );\r\n\r\n\t\t\tlet c1StopTraversal;\r\n\t\t\tif ( c1Intersection === CONTAINED ) {\r\n\r\n\t\t\t\tconst offset = getLeftOffset( c1 );\r\n\t\t\t\tconst end = getRightEndOffset( c1 );\r\n\t\t\t\tconst count = end - offset;\r\n\r\n\t\t\t\tc1StopTraversal = intersectsRangeFunc( offset, count, true, depth + 1, nodeIndexByteOffset + c1, box1 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tc1StopTraversal =\r\n\t\t\t\t\tc1Intersection &&\r\n\t\t\t\t\tshapecastTraverse(\r\n\t\t\t\t\t\tc1,\r\n\t\t\t\t\t\tgeometry,\r\n\t\t\t\t\t\tintersectsBoundsFunc,\r\n\t\t\t\t\t\tintersectsRangeFunc,\r\n\t\t\t\t\t\tnodeScoreFunc,\r\n\t\t\t\t\t\tnodeIndexByteOffset,\r\n\t\t\t\t\t\tdepth + 1\r\n\t\t\t\t\t);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( c1StopTraversal ) return true;\r\n\r\n\t\t\t// Check box 2 intersection\r\n\t\t\t// cached box2 will have been overwritten by previous traversal\r\n\t\t\tbox2 = _box2;\r\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c2 ), float32Array, box2 );\r\n\r\n\t\t\tconst isC2Leaf = IS_LEAF( c2 * 2, uint16Array );\r\n\t\t\tconst c2Intersection = intersectsBoundsFunc( box2, isC2Leaf, score2, depth + 1, nodeIndexByteOffset + c2 );\r\n\r\n\t\t\tlet c2StopTraversal;\r\n\t\t\tif ( c2Intersection === CONTAINED ) {\r\n\r\n\t\t\t\tconst offset = getLeftOffset( c2 );\r\n\t\t\t\tconst end = getRightEndOffset( c2 );\r\n\t\t\t\tconst count = end - offset;\r\n\r\n\t\t\t\tc2StopTraversal = intersectsRangeFunc( offset, count, true, depth + 1, nodeIndexByteOffset + c2, box2 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tc2StopTraversal =\r\n\t\t\t\t\tc2Intersection &&\r\n\t\t\t\t\tshapecastTraverse(\r\n\t\t\t\t\t\tc2,\r\n\t\t\t\t\t\tgeometry,\r\n\t\t\t\t\t\tintersectsBoundsFunc,\r\n\t\t\t\t\t\tintersectsRangeFunc,\r\n\t\t\t\t\t\tnodeScoreFunc,\r\n\t\t\t\t\t\tnodeIndexByteOffset,\r\n\t\t\t\t\t\tdepth + 1\r\n\t\t\t\t\t);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( c2StopTraversal ) return true;\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n} )();\r\n\r\nexport const intersectsGeometry = ( function () {\r\n\r\n\tconst triangle = new ExtendedTriangle();\r\n\tconst triangle2 = new ExtendedTriangle();\r\n\tconst invertedMat = new Matrix4();\r\n\r\n\tconst obb = new OrientedBox();\r\n\tconst obb2 = new OrientedBox();\r\n\r\n\treturn function intersectsGeometry( nodeIndex32, geometry, otherGeometry, geometryToBvh, cachedObb = null ) {\r\n\r\n\t\tlet nodeIndex16 = nodeIndex32 * 2, float32Array = _float32Array, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\t\tif ( cachedObb === null ) {\r\n\r\n\t\t\tif ( ! otherGeometry.boundingBox ) {\r\n\r\n\t\t\t\totherGeometry.computeBoundingBox();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\r\n\t\t\tcachedObb = obb;\r\n\r\n\t\t}\r\n\r\n\t\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\r\n\t\tif ( isLeaf ) {\r\n\r\n\t\t\tconst thisGeometry = geometry;\r\n\t\t\tconst thisIndex = thisGeometry.index;\r\n\t\t\tconst thisPos = thisGeometry.attributes.position;\r\n\r\n\t\t\tconst index = otherGeometry.index;\r\n\t\t\tconst pos = otherGeometry.attributes.position;\r\n\r\n\t\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\r\n\t\t\tconst count = COUNT( nodeIndex16, uint16Array );\r\n\r\n\t\t\t// get the inverse of the geometry matrix so we can transform our triangles into the\r\n\t\t\t// geometry space we're trying to test. We assume there are fewer triangles being checked\r\n\t\t\t// here.\r\n\t\t\tinvertedMat.copy( geometryToBvh ).invert();\r\n\r\n\t\t\tif ( otherGeometry.boundsTree ) {\r\n\r\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( nodeIndex32 ), float32Array, obb2 );\r\n\t\t\t\tobb2.matrix.copy( invertedMat );\r\n\t\t\t\tobb2.needsUpdate = true;\r\n\r\n\t\t\t\tconst res = otherGeometry.boundsTree.shapecast( {\r\n\r\n\t\t\t\t\tintersectsBounds: box => obb2.intersectsBox( box ),\r\n\r\n\t\t\t\t\tintersectsTriangle: tri => {\r\n\r\n\t\t\t\t\t\ttri.a.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\ttri.b.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\ttri.c.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\ttri.needsUpdate = true;\r\n\r\n\t\t\t\t\t\tfor ( let i = offset * 3, l = ( count + offset ) * 3; i < l; i += 3 ) {\r\n\r\n\t\t\t\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\r\n\t\t\t\t\t\t\tsetTriangle( triangle2, i, thisIndex, thisPos );\r\n\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\r\n\t\t\t\t\t\t\tif ( tri.intersectsTriangle( triangle2 ) ) {\r\n\r\n\t\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} );\r\n\r\n\t\t\t\treturn res;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tfor ( let i = offset * 3, l = ( count + offset * 3 ); i < l; i += 3 ) {\r\n\r\n\t\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\r\n\t\t\t\t\tsetTriangle( triangle, i, thisIndex, thisPos );\r\n\t\t\t\t\ttriangle.a.applyMatrix4( invertedMat );\r\n\t\t\t\t\ttriangle.b.applyMatrix4( invertedMat );\r\n\t\t\t\t\ttriangle.c.applyMatrix4( invertedMat );\r\n\t\t\t\t\ttriangle.needsUpdate = true;\r\n\r\n\t\t\t\t\tfor ( let i2 = 0, l2 = index.count; i2 < l2; i2 += 3 ) {\r\n\r\n\t\t\t\t\t\tsetTriangle( triangle2, i2, index, pos );\r\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\r\n\r\n\t\t\t\t\t\tif ( triangle.intersectsTriangle( triangle2 ) ) {\r\n\r\n\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconst left = nodeIndex32 + 8;\r\n\t\t\tconst right = uint32Array[ nodeIndex32 + 6 ];\r\n\r\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( left ), float32Array, boundingBox );\r\n\t\t\tconst leftIntersection =\r\n\t\t\t\tcachedObb.intersectsBox( boundingBox ) &&\r\n\t\t\t\tintersectsGeometry( left, geometry, otherGeometry, geometryToBvh, cachedObb );\r\n\r\n\t\t\tif ( leftIntersection ) return true;\r\n\r\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( right ), float32Array, boundingBox );\r\n\t\t\tconst rightIntersection =\r\n\t\t\t\tcachedObb.intersectsBox( boundingBox ) &&\r\n\t\t\t\tintersectsGeometry( right, geometry, otherGeometry, geometryToBvh, cachedObb );\r\n\r\n\t\t\tif ( rightIntersection ) return true;\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nfunction intersectRay( nodeIndex32, array, ray, target ) {\r\n\r\n\tarrayToBox( nodeIndex32, array, boundingBox );\r\n\treturn ray.intersectBox( boundingBox, target );\r\n\r\n}\r\n\r\nconst bufferStack = [];\r\nlet _prevBuffer;\r\nlet _float32Array;\r\nlet _uint16Array;\r\nlet _uint32Array;\r\nexport function setBuffer( buffer ) {\r\n\r\n\tif ( _prevBuffer ) {\r\n\r\n\t\tbufferStack.push( _prevBuffer );\r\n\r\n\t}\r\n\r\n\t_prevBuffer = buffer;\r\n\t_float32Array = new Float32Array( buffer );\r\n\t_uint16Array = new Uint16Array( buffer );\r\n\t_uint32Array = new Uint32Array( buffer );\r\n\r\n}\r\n\r\nexport function clearBuffer() {\r\n\r\n\t_prevBuffer = null;\r\n\t_float32Array = null;\r\n\t_uint16Array = null;\r\n\t_uint32Array = null;\r\n\r\n\tif ( bufferStack.length ) {\r\n\r\n\t\tsetBuffer( bufferStack.pop() );\r\n\r\n\t}\r\n\r\n}\r\n","import { Vector3, BufferAttribute, Box3, FrontSide, Matrix4 } from 'three';\r\nimport { CENTER, BYTES_PER_NODE, IS_LEAFNODE_FLAG } from './Constants.js';\r\nimport { buildPackedTree } from './buildFunctions.js';\r\nimport {\r\n\traycast,\r\n\traycastFirst,\r\n\tshapecast,\r\n\tintersectsGeometry,\r\n\tsetBuffer,\r\n\tclearBuffer,\r\n} from './castFunctions.js';\r\nimport { OrientedBox } from '../math/OrientedBox.js';\r\nimport { ExtendedTriangle } from '../math/ExtendedTriangle.js';\r\nimport { PrimitivePool } from '../utils/PrimitivePool.js';\r\nimport { arrayToBox } from '../utils/ArrayBoxUtilities.js';\r\nimport { iterateOverTriangles, setTriangle } from '../utils/TriangleUtilities.js';\r\n\r\nconst SKIP_GENERATION = Symbol( 'skip tree generation' );\r\n\r\nconst aabb = /* @__PURE__ */ new Box3();\r\nconst aabb2 = /* @__PURE__ */ new Box3();\r\nconst tempMatrix = /* @__PURE__ */ new Matrix4();\r\nconst obb = /* @__PURE__ */ new OrientedBox();\r\nconst obb2 = /* @__PURE__ */ new OrientedBox();\r\nconst temp = /* @__PURE__ */ new Vector3();\r\nconst temp1 = /* @__PURE__ */ new Vector3();\r\nconst temp2 = /* @__PURE__ */ new Vector3();\r\nconst temp3 = /* @__PURE__ */ new Vector3();\r\nconst temp4 = /* @__PURE__ */ new Vector3();\r\nconst tempBox = /* @__PURE__ */ new Box3();\r\nconst trianglePool = /* @__PURE__ */ new PrimitivePool( () => new ExtendedTriangle() );\r\n\r\nexport class MeshBVH {\r\n\r\n\tstatic serialize( bvh, options = {} ) {\r\n\r\n\t\tif ( options.isBufferGeometry ) {\r\n\r\n\t\t\tconsole.warn( 'MeshBVH.serialize: The arguments for the function have changed. See documentation for new signature.' );\r\n\r\n\t\t\treturn MeshBVH.serialize(\r\n\t\t\t\targuments[ 0 ],\r\n\t\t\t\t{\r\n\t\t\t\t\tcloneBuffers: arguments[ 2 ] === undefined ? true : arguments[ 2 ],\r\n\t\t\t\t}\r\n\t\t\t);\r\n\r\n\t\t}\r\n\r\n\t\toptions = {\r\n\t\t\tcloneBuffers: true,\r\n\t\t\t...options,\r\n\t\t};\r\n\r\n\t\tconst geometry = bvh.geometry;\r\n\t\tconst rootData = bvh._roots;\r\n\t\tconst indexAttribute = geometry.getIndex();\r\n\t\tlet result;\r\n\t\tif ( options.cloneBuffers ) {\r\n\r\n\t\t\tresult = {\r\n\t\t\t\troots: rootData.map( root => root.slice() ),\r\n\t\t\t\tindex: indexAttribute.array.slice(),\r\n\t\t\t};\r\n\r\n\t\t} else {\r\n\r\n\t\t\tresult = {\r\n\t\t\t\troots: rootData,\r\n\t\t\t\tindex: indexAttribute.array,\r\n\t\t\t};\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n\tstatic deserialize( data, geometry, options = {} ) {\r\n\r\n\t\tif ( typeof options === 'boolean' ) {\r\n\r\n\t\t\tconsole.warn( 'MeshBVH.deserialize: The arguments for the function have changed. See documentation for new signature.' );\r\n\r\n\t\t\treturn MeshBVH.deserialize(\r\n\t\t\t\targuments[ 0 ],\r\n\t\t\t\targuments[ 1 ],\r\n\t\t\t\t{\r\n\t\t\t\t\tsetIndex: arguments[ 2 ] === undefined ? true : arguments[ 2 ],\r\n\t\t\t\t}\r\n\t\t\t);\r\n\r\n\t\t}\r\n\r\n\t\toptions = {\r\n\t\t\tsetIndex: true,\r\n\t\t\t...options,\r\n\t\t};\r\n\r\n\t\tconst { index, roots } = data;\r\n\t\tconst bvh = new MeshBVH( geometry, { ...options, [ SKIP_GENERATION ]: true } );\r\n\t\tbvh._roots = roots;\r\n\r\n\t\tif ( options.setIndex ) {\r\n\r\n\t\t\tconst indexAttribute = geometry.getIndex();\r\n\t\t\tif ( indexAttribute === null ) {\r\n\r\n\t\t\t\tconst newIndex = new BufferAttribute( data.index, 1, false );\r\n\t\t\t\tgeometry.setIndex( newIndex );\r\n\r\n\t\t\t} else if ( indexAttribute.array !== index ) {\r\n\r\n\t\t\t\tindexAttribute.array.set( index );\r\n\t\t\t\tindexAttribute.needsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn bvh;\r\n\r\n\t}\r\n\r\n\tconstructor( geometry, options = {} ) {\r\n\r\n\t\tif ( ! geometry.isBufferGeometry ) {\r\n\r\n\t\t\tthrow new Error( 'MeshBVH: Only BufferGeometries are supported.' );\r\n\r\n\t\t} else if ( geometry.index && geometry.index.isInterleavedBufferAttribute ) {\r\n\r\n\t\t\tthrow new Error( 'MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.' );\r\n\r\n\t\t}\r\n\r\n\t\t// default options\r\n\t\toptions = Object.assign( {\r\n\r\n\t\t\tstrategy: CENTER,\r\n\t\t\tmaxDepth: 40,\r\n\t\t\tmaxLeafTris: 10,\r\n\t\t\tverbose: true,\r\n\t\t\tuseSharedArrayBuffer: false,\r\n\t\t\tsetBoundingBox: true,\r\n\t\t\tonProgress: null,\r\n\r\n\t\t\t// undocumented options\r\n\r\n\t\t\t// Whether to skip generating the tree. Used for deserialization.\r\n\t\t\t[ SKIP_GENERATION ]: false,\r\n\r\n\t\t}, options );\r\n\r\n\t\tif ( options.useSharedArrayBuffer && typeof SharedArrayBuffer === 'undefined' ) {\r\n\r\n\t\t\tthrow new Error( 'MeshBVH: SharedArrayBuffer is not available.' );\r\n\r\n\t\t}\r\n\r\n\t\tthis._roots = null;\r\n\t\tif ( ! options[ SKIP_GENERATION ] ) {\r\n\r\n\t\t\tthis._roots = buildPackedTree( geometry, options );\r\n\r\n\t\t\tif ( ! geometry.boundingBox && options.setBoundingBox ) {\r\n\r\n\t\t\t\tgeometry.boundingBox = this.getBoundingBox( new Box3() );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// retain references to the geometry so we can use them it without having to\r\n\t\t// take a geometry reference in every function.\r\n\t\tthis.geometry = geometry;\r\n\r\n\t}\r\n\r\n\trefit( nodeIndices = null ) {\r\n\r\n\t\tif ( nodeIndices && Array.isArray( nodeIndices ) ) {\r\n\r\n\t\t\tnodeIndices = new Set( nodeIndices );\r\n\r\n\t\t}\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tconst indexArr = geometry.index.array;\r\n\t\tconst posAttr = geometry.attributes.position;\r\n\r\n\t\tlet buffer, uint32Array, uint16Array, float32Array;\r\n\t\tlet byteOffset = 0;\r\n\t\tconst roots = this._roots;\r\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\r\n\r\n\t\t\tbuffer = roots[ i ];\r\n\t\t\tuint32Array = new Uint32Array( buffer );\r\n\t\t\tuint16Array = new Uint16Array( buffer );\r\n\t\t\tfloat32Array = new Float32Array( buffer );\r\n\r\n\t\t\t_traverse( 0, byteOffset );\r\n\t\t\tbyteOffset += buffer.byteLength;\r\n\r\n\t\t}\r\n\r\n\t\tfunction _traverse( node32Index, byteOffset, force = false ) {\r\n\r\n\t\t\tconst node16Index = node32Index * 2;\r\n\t\t\tconst isLeaf = uint16Array[ node16Index + 15 ] === IS_LEAFNODE_FLAG;\r\n\t\t\tif ( isLeaf ) {\r\n\r\n\t\t\t\tconst offset = uint32Array[ node32Index + 6 ];\r\n\t\t\t\tconst count = uint16Array[ node16Index + 14 ];\r\n\r\n\t\t\t\tlet minx = Infinity;\r\n\t\t\t\tlet miny = Infinity;\r\n\t\t\t\tlet minz = Infinity;\r\n\t\t\t\tlet maxx = - Infinity;\r\n\t\t\t\tlet maxy = - Infinity;\r\n\t\t\t\tlet maxz = - Infinity;\r\n\r\n\t\t\t\tfor ( let i = 3 * offset, l = 3 * ( offset + count ); i < l; i ++ ) {\r\n\r\n\t\t\t\t\tconst index = indexArr[ i ];\r\n\t\t\t\t\tconst x = posAttr.getX( index );\r\n\t\t\t\t\tconst y = posAttr.getY( index );\r\n\t\t\t\t\tconst z = posAttr.getZ( index );\r\n\r\n\t\t\t\t\tif ( x < minx ) minx = x;\r\n\t\t\t\t\tif ( x > maxx ) maxx = x;\r\n\r\n\t\t\t\t\tif ( y < miny ) miny = y;\r\n\t\t\t\t\tif ( y > maxy ) maxy = y;\r\n\r\n\t\t\t\t\tif ( z < minz ) minz = z;\r\n\t\t\t\t\tif ( z > maxz ) maxz = z;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tfloat32Array[ node32Index + 0 ] !== minx ||\r\n\t\t\t\t\tfloat32Array[ node32Index + 1 ] !== miny ||\r\n\t\t\t\t\tfloat32Array[ node32Index + 2 ] !== minz ||\r\n\r\n\t\t\t\t\tfloat32Array[ node32Index + 3 ] !== maxx ||\r\n\t\t\t\t\tfloat32Array[ node32Index + 4 ] !== maxy ||\r\n\t\t\t\t\tfloat32Array[ node32Index + 5 ] !== maxz\r\n\t\t\t\t) {\r\n\r\n\t\t\t\t\tfloat32Array[ node32Index + 0 ] = minx;\r\n\t\t\t\t\tfloat32Array[ node32Index + 1 ] = miny;\r\n\t\t\t\t\tfloat32Array[ node32Index + 2 ] = minz;\r\n\r\n\t\t\t\t\tfloat32Array[ node32Index + 3 ] = maxx;\r\n\t\t\t\t\tfloat32Array[ node32Index + 4 ] = maxy;\r\n\t\t\t\t\tfloat32Array[ node32Index + 5 ] = maxz;\r\n\r\n\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tconst left = node32Index + 8;\r\n\t\t\t\tconst right = uint32Array[ node32Index + 6 ];\r\n\r\n\t\t\t\t// the identifying node indices provided by the shapecast function include offsets of all\r\n\t\t\t\t// root buffers to guarantee they're unique between roots so offset left and right indices here.\r\n\t\t\t\tconst offsetLeft = left + byteOffset;\r\n\t\t\t\tconst offsetRight = right + byteOffset;\r\n\t\t\t\tlet forceChildren = force;\r\n\t\t\t\tlet includesLeft = false;\r\n\t\t\t\tlet includesRight = false;\r\n\r\n\t\t\t\tif ( nodeIndices ) {\r\n\r\n\t\t\t\t\t// if we see that neither the left or right child are included in the set that need to be updated\r\n\t\t\t\t\t// then we assume that all children need to be updated.\r\n\t\t\t\t\tif ( ! forceChildren ) {\r\n\r\n\t\t\t\t\t\tincludesLeft = nodeIndices.has( offsetLeft );\r\n\t\t\t\t\t\tincludesRight = nodeIndices.has( offsetRight );\r\n\t\t\t\t\t\tforceChildren = ! includesLeft && ! includesRight;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tincludesLeft = true;\r\n\t\t\t\t\tincludesRight = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst traverseLeft = forceChildren || includesLeft;\r\n\t\t\t\tconst traverseRight = forceChildren || includesRight;\r\n\r\n\t\t\t\tlet leftChange = false;\r\n\t\t\t\tif ( traverseLeft ) {\r\n\r\n\t\t\t\t\tleftChange = _traverse( left, byteOffset, forceChildren );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet rightChange = false;\r\n\t\t\t\tif ( traverseRight ) {\r\n\r\n\t\t\t\t\trightChange = _traverse( right, byteOffset, forceChildren );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst didChange = leftChange || rightChange;\r\n\t\t\t\tif ( didChange ) {\r\n\r\n\t\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\t\t\tconst lefti = left + i;\r\n\t\t\t\t\t\tconst righti = right + i;\r\n\t\t\t\t\t\tconst minLeftValue = float32Array[ lefti ];\r\n\t\t\t\t\t\tconst maxLeftValue = float32Array[ lefti + 3 ];\r\n\t\t\t\t\t\tconst minRightValue = float32Array[ righti ];\r\n\t\t\t\t\t\tconst maxRightValue = float32Array[ righti + 3 ];\r\n\r\n\t\t\t\t\t\tfloat32Array[ node32Index + i ] = minLeftValue < minRightValue ? minLeftValue : minRightValue;\r\n\t\t\t\t\t\tfloat32Array[ node32Index + i + 3 ] = maxLeftValue > maxRightValue ? maxLeftValue : maxRightValue;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn didChange;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\ttraverse( callback, rootIndex = 0 ) {\r\n\r\n\t\tconst buffer = this._roots[ rootIndex ];\r\n\t\tconst uint32Array = new Uint32Array( buffer );\r\n\t\tconst uint16Array = new Uint16Array( buffer );\r\n\t\t_traverse( 0 );\r\n\r\n\t\tfunction _traverse( node32Index, depth = 0 ) {\r\n\r\n\t\t\tconst node16Index = node32Index * 2;\r\n\t\t\tconst isLeaf = uint16Array[ node16Index + 15 ] === IS_LEAFNODE_FLAG;\r\n\t\t\tif ( isLeaf ) {\r\n\r\n\t\t\t\tconst offset = uint32Array[ node32Index + 6 ];\r\n\t\t\t\tconst count = uint16Array[ node16Index + 14 ];\r\n\t\t\t\tcallback( depth, isLeaf, new Float32Array( buffer, node32Index * 4, 6 ), offset, count );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// TODO: use node functions here\r\n\t\t\t\tconst left = node32Index + BYTES_PER_NODE / 4;\r\n\t\t\t\tconst right = uint32Array[ node32Index + 6 ];\r\n\t\t\t\tconst splitAxis = uint32Array[ node32Index + 7 ];\r\n\t\t\t\tconst stopTraversal = callback( depth, isLeaf, new Float32Array( buffer, node32Index * 4, 6 ), splitAxis );\r\n\r\n\t\t\t\tif ( ! stopTraversal ) {\r\n\r\n\t\t\t\t\t_traverse( left, depth + 1 );\r\n\t\t\t\t\t_traverse( right, depth + 1 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/* Core Cast Functions */\r\n\traycast( ray, materialOrSide = FrontSide ) {\r\n\r\n\t\tconst roots = this._roots;\r\n\t\tconst geometry = this.geometry;\r\n\t\tconst intersects = [];\r\n\t\tconst isMaterial = materialOrSide.isMaterial;\r\n\t\tconst isArrayMaterial = Array.isArray( materialOrSide );\r\n\r\n\t\tconst groups = geometry.groups;\r\n\t\tconst side = isMaterial ? materialOrSide.side : materialOrSide;\r\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\r\n\r\n\t\t\tconst materialSide = isArrayMaterial ? materialOrSide[ groups[ i ].materialIndex ].side : side;\r\n\t\t\tconst startCount = intersects.length;\r\n\r\n\t\t\tsetBuffer( roots[ i ] );\r\n\t\t\traycast( 0, geometry, materialSide, ray, intersects );\r\n\t\t\tclearBuffer();\r\n\r\n\t\t\tif ( isArrayMaterial ) {\r\n\r\n\t\t\t\tconst materialIndex = groups[ i ].materialIndex;\r\n\t\t\t\tfor ( let j = startCount, jl = intersects.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\t\tintersects[ j ].face.materialIndex = materialIndex;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn intersects;\r\n\r\n\t}\r\n\r\n\traycastFirst( ray, materialOrSide = FrontSide ) {\r\n\r\n\t\tconst roots = this._roots;\r\n\t\tconst geometry = this.geometry;\r\n\t\tconst isMaterial = materialOrSide.isMaterial;\r\n\t\tconst isArrayMaterial = Array.isArray( materialOrSide );\r\n\r\n\t\tlet closestResult = null;\r\n\r\n\t\tconst groups = geometry.groups;\r\n\t\tconst side = isMaterial ? materialOrSide.side : materialOrSide;\r\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\r\n\r\n\t\t\tconst materialSide = isArrayMaterial ? materialOrSide[ groups[ i ].materialIndex ].side : side;\r\n\r\n\t\t\tsetBuffer( roots[ i ] );\r\n\t\t\tconst result = raycastFirst( 0, geometry, materialSide, ray );\r\n\t\t\tclearBuffer();\r\n\r\n\t\t\tif ( result != null && ( closestResult == null || result.distance < closestResult.distance ) ) {\r\n\r\n\t\t\t\tclosestResult = result;\r\n\t\t\t\tif ( isArrayMaterial ) {\r\n\r\n\t\t\t\t\tresult.face.materialIndex = groups[ i ].materialIndex;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn closestResult;\r\n\r\n\t}\r\n\r\n\tintersectsGeometry( otherGeometry, geomToMesh ) {\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tlet result = false;\r\n\t\tfor ( const root of this._roots ) {\r\n\r\n\t\t\tsetBuffer( root );\r\n\t\t\tresult = intersectsGeometry( 0, geometry, otherGeometry, geomToMesh );\r\n\t\t\tclearBuffer();\r\n\r\n\t\t\tif ( result ) {\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n\tshapecast( callbacks, _intersectsTriangleFunc, _orderNodesFunc ) {\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tif ( callbacks instanceof Function ) {\r\n\r\n\t\t\tif ( _intersectsTriangleFunc ) {\r\n\r\n\t\t\t\t// Support the previous function signature that provided three sequential index buffer\r\n\t\t\t\t// indices here.\r\n\t\t\t\tconst originalTriangleFunc = _intersectsTriangleFunc;\r\n\t\t\t\t_intersectsTriangleFunc = ( tri, index, contained, depth ) => {\r\n\r\n\t\t\t\t\tconst i3 = index * 3;\r\n\t\t\t\t\treturn originalTriangleFunc( tri, i3, i3 + 1, i3 + 2, contained, depth );\r\n\r\n\t\t\t\t};\r\n\r\n\r\n\t\t\t}\r\n\r\n\t\t\tcallbacks = {\r\n\r\n\t\t\t\tboundsTraverseOrder: _orderNodesFunc,\r\n\t\t\t\tintersectsBounds: callbacks,\r\n\t\t\t\tintersectsTriangle: _intersectsTriangleFunc,\r\n\t\t\t\tintersectsRange: null,\r\n\r\n\t\t\t};\r\n\r\n\t\t\tconsole.warn( 'MeshBVH: Shapecast function signature has changed and now takes an object of callbacks as a second argument. See docs for new signature.' );\r\n\r\n\t\t}\r\n\r\n\t\tconst triangle = trianglePool.getPrimitive();\r\n\t\tlet {\r\n\t\t\tboundsTraverseOrder,\r\n\t\t\tintersectsBounds,\r\n\t\t\tintersectsRange,\r\n\t\t\tintersectsTriangle,\r\n\t\t} = callbacks;\r\n\r\n\t\tif ( intersectsRange && intersectsTriangle ) {\r\n\r\n\t\t\tconst originalIntersectsRange = intersectsRange;\r\n\t\t\tintersectsRange = ( offset, count, contained, depth, nodeIndex ) => {\r\n\r\n\t\t\t\tif ( ! originalIntersectsRange( offset, count, contained, depth, nodeIndex ) ) {\r\n\r\n\t\t\t\t\treturn iterateOverTriangles( offset, count, geometry, intersectsTriangle, contained, depth, triangle );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t};\r\n\r\n\t\t} else if ( ! intersectsRange ) {\r\n\r\n\t\t\tif ( intersectsTriangle ) {\r\n\r\n\t\t\t\tintersectsRange = ( offset, count, contained, depth ) => {\r\n\r\n\t\t\t\t\treturn iterateOverTriangles( offset, count, geometry, intersectsTriangle, contained, depth, triangle );\r\n\r\n\t\t\t\t};\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tintersectsRange = ( offset, count, contained ) => {\r\n\r\n\t\t\t\t\treturn contained;\r\n\r\n\t\t\t\t};\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tlet result = false;\r\n\t\tlet byteOffset = 0;\r\n\t\tfor ( const root of this._roots ) {\r\n\r\n\t\t\tsetBuffer( root );\r\n\t\t\tresult = shapecast( 0, geometry, intersectsBounds, intersectsRange, boundsTraverseOrder, byteOffset );\r\n\t\t\tclearBuffer();\r\n\r\n\t\t\tif ( result ) {\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tbyteOffset += root.byteLength;\r\n\r\n\t\t}\r\n\r\n\t\ttrianglePool.releasePrimitive( triangle );\r\n\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n\tbvhcast( otherBvh, matrixToLocal, callbacks ) {\r\n\r\n\t\t// BVHCast function for intersecting two BVHs against each other. Ultimately just uses two recursive shapecast calls rather\r\n\t\t// than an approach that walks down the tree (see bvhcast.js file for more info).\r\n\r\n\t\tlet {\r\n\t\t\tintersectsRanges,\r\n\t\t\tintersectsTriangles,\r\n\t\t} = callbacks;\r\n\r\n\t\tconst indexAttr = this.geometry.index;\r\n\t\tconst positionAttr = this.geometry.attributes.position;\r\n\r\n\t\tconst otherIndexAttr = otherBvh.geometry.index;\r\n\t\tconst otherPositionAttr = otherBvh.geometry.attributes.position;\r\n\r\n\t\ttempMatrix.copy( matrixToLocal ).invert();\r\n\r\n\t\tconst triangle = trianglePool.getPrimitive();\r\n\t\tconst triangle2 = trianglePool.getPrimitive();\r\n\r\n\t\tif ( intersectsTriangles ) {\r\n\r\n\t\t\tfunction iterateOverDoubleTriangles( offset1, count1, offset2, count2, depth1, index1, depth2, index2 ) {\r\n\r\n\t\t\t\tfor ( let i2 = offset2, l2 = offset2 + count2; i2 < l2; i2 ++ ) {\r\n\r\n\t\t\t\t\tsetTriangle( triangle2, i2 * 3, otherIndexAttr, otherPositionAttr );\r\n\t\t\t\t\ttriangle2.a.applyMatrix4( matrixToLocal );\r\n\t\t\t\t\ttriangle2.b.applyMatrix4( matrixToLocal );\r\n\t\t\t\t\ttriangle2.c.applyMatrix4( matrixToLocal );\r\n\t\t\t\t\ttriangle2.needsUpdate = true;\r\n\r\n\t\t\t\t\tfor ( let i1 = offset1, l1 = offset1 + count1; i1 < l1; i1 ++ ) {\r\n\r\n\t\t\t\t\t\tsetTriangle( triangle, i1 * 3, indexAttr, positionAttr );\r\n\t\t\t\t\t\ttriangle.needsUpdate = true;\r\n\r\n\t\t\t\t\t\tif ( intersectsTriangles( triangle, triangle2, i1, i2, depth1, index1, depth2, index2 ) ) {\r\n\r\n\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( intersectsRanges ) {\r\n\r\n\t\t\t\tconst originalIntersectsRanges = intersectsRanges;\r\n\t\t\t\tintersectsRanges = function ( offset1, count1, offset2, count2, depth1, index1, depth2, index2 ) {\r\n\r\n\t\t\t\t\tif ( ! originalIntersectsRanges( offset1, count1, offset2, count2, depth1, index1, depth2, index2 ) ) {\r\n\r\n\t\t\t\t\t\treturn iterateOverDoubleTriangles( offset1, count1, offset2, count2, depth1, index1, depth2, index2 );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t};\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tintersectsRanges = iterateOverDoubleTriangles;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\totherBvh.getBoundingBox( aabb2 );\r\n\t\taabb2.applyMatrix4( matrixToLocal );\r\n\t\tconst result = this.shapecast( {\r\n\r\n\t\t\tintersectsBounds: box => aabb2.intersectsBox( box ),\r\n\r\n\t\t\tintersectsRange: ( offset1, count1, contained, depth1, nodeIndex1, box ) => {\r\n\r\n\t\t\t\taabb.copy( box );\r\n\t\t\t\taabb.applyMatrix4( tempMatrix );\r\n\t\t\t\treturn otherBvh.shapecast( {\r\n\r\n\t\t\t\t\tintersectsBounds: box => aabb.intersectsBox( box ),\r\n\r\n\t\t\t\t\tintersectsRange: ( offset2, count2, contained, depth2, nodeIndex2 ) => {\r\n\r\n\t\t\t\t\t\treturn intersectsRanges( offset1, count1, offset2, count2, depth1, nodeIndex1, depth2, nodeIndex2 );\r\n\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t} );\r\n\r\n\t\t\t}\r\n\r\n\t\t} );\r\n\r\n\t\ttrianglePool.releasePrimitive( triangle );\r\n\t\ttrianglePool.releasePrimitive( triangle2 );\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n\t/* Derived Cast Functions */\r\n\tintersectsBox( box, boxToMesh ) {\r\n\r\n\t\tobb.set( box.min, box.max, boxToMesh );\r\n\t\tobb.needsUpdate = true;\r\n\r\n\t\treturn this.shapecast(\r\n\t\t\t{\r\n\t\t\t\tintersectsBounds: box => obb.intersectsBox( box ),\r\n\t\t\t\tintersectsTriangle: tri => obb.intersectsTriangle( tri )\r\n\t\t\t}\r\n\t\t);\r\n\r\n\t}\r\n\r\n\tintersectsSphere( sphere ) {\r\n\r\n\t\treturn this.shapecast(\r\n\t\t\t{\r\n\t\t\t\tintersectsBounds: box => sphere.intersectsBox( box ),\r\n\t\t\t\tintersectsTriangle: tri => tri.intersectsSphere( sphere )\r\n\t\t\t}\r\n\t\t);\r\n\r\n\t}\r\n\r\n\tclosestPointToGeometry( otherGeometry, geometryToBvh, target1 = { }, target2 = { }, minThreshold = 0, maxThreshold = Infinity ) {\r\n\r\n\t\tif ( ! otherGeometry.boundingBox ) {\r\n\r\n\t\t\totherGeometry.computeBoundingBox();\r\n\r\n\t\t}\r\n\r\n\t\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\r\n\t\tobb.needsUpdate = true;\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tconst pos = geometry.attributes.position;\r\n\t\tconst index = geometry.index;\r\n\t\tconst otherPos = otherGeometry.attributes.position;\r\n\t\tconst otherIndex = otherGeometry.index;\r\n\t\tconst triangle = trianglePool.getPrimitive();\r\n\t\tconst triangle2 = trianglePool.getPrimitive();\r\n\r\n\t\tlet tempTarget1 = temp1;\r\n\t\tlet tempTargetDest1 = temp2;\r\n\t\tlet tempTarget2 = null;\r\n\t\tlet tempTargetDest2 = null;\r\n\r\n\t\tif ( target2 ) {\r\n\r\n\t\t\ttempTarget2 = temp3;\r\n\t\t\ttempTargetDest2 = temp4;\r\n\r\n\t\t}\r\n\r\n\t\tlet closestDistance = Infinity;\r\n\t\tlet closestDistanceTriIndex = null;\r\n\t\tlet closestDistanceOtherTriIndex = null;\r\n\t\ttempMatrix.copy( geometryToBvh ).invert();\r\n\t\tobb2.matrix.copy( tempMatrix );\r\n\t\tthis.shapecast(\r\n\t\t\t{\r\n\r\n\t\t\t\tboundsTraverseOrder: box => {\r\n\r\n\t\t\t\t\treturn obb.distanceToBox( box );\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\r\n\r\n\t\t\t\t\tif ( score < closestDistance && score < maxThreshold ) {\r\n\r\n\t\t\t\t\t\t// if we know the triangles of this bounds will be intersected next then\r\n\t\t\t\t\t\t// save the bounds to use during triangle checks.\r\n\t\t\t\t\t\tif ( isLeaf ) {\r\n\r\n\t\t\t\t\t\t\tobb2.min.copy( box.min );\r\n\t\t\t\t\t\t\tobb2.max.copy( box.max );\r\n\t\t\t\t\t\t\tobb2.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tintersectsRange: ( offset, count ) => {\r\n\r\n\t\t\t\t\tif ( otherGeometry.boundsTree ) {\r\n\r\n\t\t\t\t\t\t// if the other geometry has a bvh then use the accelerated path where we use shapecast to find\r\n\t\t\t\t\t\t// the closest bounds in the other geometry to check.\r\n\t\t\t\t\t\treturn otherGeometry.boundsTree.shapecast( {\r\n\t\t\t\t\t\t\tboundsTraverseOrder: box => {\r\n\r\n\t\t\t\t\t\t\t\treturn obb2.distanceToBox( box );\r\n\r\n\t\t\t\t\t\t\t},\r\n\r\n\t\t\t\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\r\n\r\n\t\t\t\t\t\t\t\treturn score < closestDistance && score < maxThreshold;\r\n\r\n\t\t\t\t\t\t\t},\r\n\r\n\t\t\t\t\t\t\tintersectsRange: ( otherOffset, otherCount ) => {\r\n\r\n\t\t\t\t\t\t\t\tfor ( let i2 = otherOffset * 3, l2 = ( otherOffset + otherCount ) * 3; i2 < l2; i2 += 3 ) {\r\n\r\n\t\t\t\t\t\t\t\t\tsetTriangle( triangle2, i2, otherIndex, otherPos );\r\n\t\t\t\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t\t\t\tfor ( let i = offset * 3, l = ( offset + count ) * 3; i < l; i += 3 ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\tsetTriangle( triangle, i, index, pos );\r\n\t\t\t\t\t\t\t\t\t\ttriangle.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\r\n\t\t\t\t\t\t\t\t\t\tif ( dist < closestDistance ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\r\n\r\n\t\t\t\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\t\tclosestDistance = dist;\r\n\t\t\t\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i / 3;\r\n\t\t\t\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2 / 3;\r\n\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\r\n\t\t\t\t\t\t\t\t\t\tif ( dist < minThreshold ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t} );\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t// If no bounds tree then we'll just check every triangle.\r\n\t\t\t\t\t\tconst triCount = otherIndex ? otherIndex.count : otherPos.count;\r\n\t\t\t\t\t\tfor ( let i2 = 0, l2 = triCount; i2 < l2; i2 += 3 ) {\r\n\r\n\t\t\t\t\t\t\tsetTriangle( triangle2, i2, otherIndex, otherPos );\r\n\t\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t\tfor ( let i = offset * 3, l = ( offset + count ) * 3; i < l; i += 3 ) {\r\n\r\n\t\t\t\t\t\t\t\tsetTriangle( triangle, i, index, pos );\r\n\t\t\t\t\t\t\t\ttriangle.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\r\n\t\t\t\t\t\t\t\tif ( dist < closestDistance ) {\r\n\r\n\t\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\r\n\r\n\t\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\r\n\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\tclosestDistance = dist;\r\n\t\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i / 3;\r\n\t\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2 / 3;\r\n\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\r\n\t\t\t\t\t\t\t\tif ( dist < minThreshold ) {\r\n\r\n\t\t\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t}\r\n\r\n\t\t);\r\n\r\n\t\ttrianglePool.releasePrimitive( triangle );\r\n\t\ttrianglePool.releasePrimitive( triangle2 );\r\n\r\n\t\tif ( closestDistance === Infinity ) return null;\r\n\r\n\t\tif ( ! target1.point ) target1.point = tempTargetDest1.clone();\r\n\t\telse target1.point.copy( tempTargetDest1 );\r\n\t\ttarget1.distance = closestDistance,\r\n\t\ttarget1.faceIndex = closestDistanceTriIndex;\r\n\r\n\t\tif ( target2 ) {\r\n\r\n\t\t\tif ( ! target2.point ) target2.point = tempTargetDest2.clone();\r\n\t\t\telse target2.point.copy( tempTargetDest2 );\r\n\t\t\ttarget2.point.applyMatrix4( tempMatrix );\r\n\t\t\ttempTargetDest1.applyMatrix4( tempMatrix );\r\n\t\t\ttarget2.distance = tempTargetDest1.sub( target2.point ).length();\r\n\t\t\ttarget2.faceIndex = closestDistanceOtherTriIndex;\r\n\r\n\t\t}\r\n\r\n\t\treturn target1;\r\n\r\n\t}\r\n\r\n\tclosestPointToPoint( point, target = { }, minThreshold = 0, maxThreshold = Infinity ) {\r\n\r\n\t\t// early out if under minThreshold\r\n\t\t// skip checking if over maxThreshold\r\n\t\t// set minThreshold = maxThreshold to quickly check if a point is within a threshold\r\n\t\t// returns Infinity if no value found\r\n\t\tconst minThresholdSq = minThreshold * minThreshold;\r\n\t\tconst maxThresholdSq = maxThreshold * maxThreshold;\r\n\t\tlet closestDistanceSq = Infinity;\r\n\t\tlet closestDistanceTriIndex = null;\r\n\t\tthis.shapecast(\r\n\r\n\t\t\t{\r\n\r\n\t\t\t\tboundsTraverseOrder: box => {\r\n\r\n\t\t\t\t\ttemp.copy( point ).clamp( box.min, box.max );\r\n\t\t\t\t\treturn temp.distanceToSquared( point );\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\r\n\r\n\t\t\t\t\treturn score < closestDistanceSq && score < maxThresholdSq;\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tintersectsTriangle: ( tri, triIndex ) => {\r\n\r\n\t\t\t\t\ttri.closestPointToPoint( point, temp );\r\n\t\t\t\t\tconst distSq = point.distanceToSquared( temp );\r\n\t\t\t\t\tif ( distSq < closestDistanceSq ) {\r\n\r\n\t\t\t\t\t\ttemp1.copy( temp );\r\n\t\t\t\t\t\tclosestDistanceSq = distSq;\r\n\t\t\t\t\t\tclosestDistanceTriIndex = triIndex;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( distSq < minThresholdSq ) {\r\n\r\n\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t}\r\n\r\n\t\t);\r\n\r\n\t\tif ( closestDistanceSq === Infinity ) return null;\r\n\r\n\t\tconst closestDistance = Math.sqrt( closestDistanceSq );\r\n\r\n\t\tif ( ! target.point ) target.point = temp1.clone();\r\n\t\telse target.point.copy( temp1 );\r\n\t\ttarget.distance = closestDistance,\r\n\t\ttarget.faceIndex = closestDistanceTriIndex;\r\n\r\n\t\treturn target;\r\n\r\n\t}\r\n\r\n\tgetBoundingBox( target ) {\r\n\r\n\t\ttarget.makeEmpty();\r\n\r\n\t\tconst roots = this._roots;\r\n\t\troots.forEach( buffer => {\r\n\r\n\t\t\tarrayToBox( 0, new Float32Array( buffer ), tempBox );\r\n\t\t\ttarget.union( tempBox );\r\n\r\n\t\t} );\r\n\r\n\t\treturn target;\r\n\r\n\t}\r\n\r\n}\r\n","import { LineBasicMaterial, BufferAttribute, Box3, Group, MeshBasicMaterial, Object3D, BufferGeometry } from 'three';\r\nimport { arrayToBox } from '../utils/ArrayBoxUtilities.js';\r\n\r\nconst boundingBox = /* @__PURE__ */ new Box3();\r\nclass MeshBVHRootVisualizer extends Object3D {\r\n\r\n\tget isMesh() {\r\n\r\n\t\treturn ! this.displayEdges;\r\n\r\n\t}\r\n\r\n\tget isLineSegments() {\r\n\r\n\t\treturn this.displayEdges;\r\n\r\n\t}\r\n\r\n\tget isLine() {\r\n\r\n\t\treturn this.displayEdges;\r\n\r\n\t}\r\n\r\n\tconstructor( mesh, material, depth = 10, group = 0 ) {\r\n\r\n\t\tsuper();\r\n\r\n\t\tthis.material = material;\r\n\t\tthis.geometry = new BufferGeometry();\r\n\t\tthis.name = 'MeshBVHRootVisualizer';\r\n\t\tthis.depth = depth;\r\n\t\tthis.displayParents = false;\r\n\t\tthis.mesh = mesh;\r\n\t\tthis.displayEdges = true;\r\n\t\tthis._group = group;\r\n\r\n\t}\r\n\r\n\traycast() {}\r\n\r\n\tupdate() {\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tconst boundsTree = this.mesh.geometry.boundsTree;\r\n\t\tconst group = this._group;\r\n\t\tgeometry.dispose();\r\n\t\tthis.visible = false;\r\n\t\tif ( boundsTree ) {\r\n\r\n\t\t\t// count the number of bounds required\r\n\t\t\tconst targetDepth = this.depth - 1;\r\n\t\t\tconst displayParents = this.displayParents;\r\n\t\t\tlet boundsCount = 0;\r\n\t\t\tboundsTree.traverse( ( depth, isLeaf ) => {\r\n\r\n\t\t\t\tif ( depth === targetDepth || isLeaf ) {\r\n\r\n\t\t\t\t\tboundsCount ++;\r\n\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t} else if ( displayParents ) {\r\n\r\n\t\t\t\t\tboundsCount ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}, group );\r\n\r\n\t\t\t// fill in the position buffer with the bounds corners\r\n\t\t\tlet posIndex = 0;\r\n\t\t\tconst positionArray = new Float32Array( 8 * 3 * boundsCount );\r\n\t\t\tboundsTree.traverse( ( depth, isLeaf, boundingData ) => {\r\n\r\n\t\t\t\tconst terminate = depth === targetDepth || isLeaf;\r\n\t\t\t\tif ( terminate || displayParents ) {\r\n\r\n\t\t\t\t\tarrayToBox( 0, boundingData, boundingBox );\r\n\r\n\t\t\t\t\tconst { min, max } = boundingBox;\r\n\t\t\t\t\tfor ( let x = - 1; x <= 1; x += 2 ) {\r\n\r\n\t\t\t\t\t\tconst xVal = x < 0 ? min.x : max.x;\r\n\t\t\t\t\t\tfor ( let y = - 1; y <= 1; y += 2 ) {\r\n\r\n\t\t\t\t\t\t\tconst yVal = y < 0 ? min.y : max.y;\r\n\t\t\t\t\t\t\tfor ( let z = - 1; z <= 1; z += 2 ) {\r\n\r\n\t\t\t\t\t\t\t\tconst zVal = z < 0 ? min.z : max.z;\r\n\t\t\t\t\t\t\t\tpositionArray[ posIndex + 0 ] = xVal;\r\n\t\t\t\t\t\t\t\tpositionArray[ posIndex + 1 ] = yVal;\r\n\t\t\t\t\t\t\t\tpositionArray[ posIndex + 2 ] = zVal;\r\n\r\n\t\t\t\t\t\t\t\tposIndex += 3;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn terminate;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}, group );\r\n\r\n\t\t\tlet indexArray;\r\n\t\t\tlet indices;\r\n\t\t\tif ( this.displayEdges ) {\r\n\r\n\t\t\t\t// fill in the index buffer to point to the corner points\r\n\t\t\t\tindices = new Uint8Array( [\r\n\t\t\t\t\t// x axis\r\n\t\t\t\t\t0, 4,\r\n\t\t\t\t\t1, 5,\r\n\t\t\t\t\t2, 6,\r\n\t\t\t\t\t3, 7,\r\n\r\n\t\t\t\t\t// y axis\r\n\t\t\t\t\t0, 2,\r\n\t\t\t\t\t1, 3,\r\n\t\t\t\t\t4, 6,\r\n\t\t\t\t\t5, 7,\r\n\r\n\t\t\t\t\t// z axis\r\n\t\t\t\t\t0, 1,\r\n\t\t\t\t\t2, 3,\r\n\t\t\t\t\t4, 5,\r\n\t\t\t\t\t6, 7,\r\n\t\t\t\t] );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tindices = new Uint8Array( [\r\n\r\n\t\t\t\t\t// X-, X+\r\n\t\t\t\t\t0, 1, 2,\r\n\t\t\t\t\t2, 1, 3,\r\n\r\n\t\t\t\t\t4, 6, 5,\r\n\t\t\t\t\t6, 7, 5,\r\n\r\n\t\t\t\t\t// Y-, Y+\r\n\t\t\t\t\t1, 4, 5,\r\n\t\t\t\t\t0, 4, 1,\r\n\r\n\t\t\t\t\t2, 3, 6,\r\n\t\t\t\t\t3, 7, 6,\r\n\r\n\t\t\t\t\t// Z-, Z+\r\n\t\t\t\t\t0, 2, 4,\r\n\t\t\t\t\t2, 6, 4,\r\n\r\n\t\t\t\t\t1, 5, 3,\r\n\t\t\t\t\t3, 5, 7,\r\n\r\n\t\t\t\t] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( positionArray.length > 65535 ) {\r\n\r\n\t\t\t\tindexArray = new Uint32Array( indices.length * boundsCount );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tindexArray = new Uint16Array( indices.length * boundsCount );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tconst indexLength = indices.length;\r\n\t\t\tfor ( let i = 0; i < boundsCount; i ++ ) {\r\n\r\n\t\t\t\tconst posOffset = i * 8;\r\n\t\t\t\tconst indexOffset = i * indexLength;\r\n\t\t\t\tfor ( let j = 0; j < indexLength; j ++ ) {\r\n\r\n\t\t\t\t\tindexArray[ indexOffset + j ] = posOffset + indices[ j ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// update the geometry\r\n\t\t\tgeometry.setIndex(\r\n\t\t\t\tnew BufferAttribute( indexArray, 1, false ),\r\n\t\t\t);\r\n\t\t\tgeometry.setAttribute(\r\n\t\t\t\t'position',\r\n\t\t\t\tnew BufferAttribute( positionArray, 3, false ),\r\n\t\t\t);\r\n\t\t\tthis.visible = true;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nclass MeshBVHVisualizer extends Group {\r\n\r\n\tget color() {\r\n\r\n\t\treturn this.edgeMaterial.color;\r\n\r\n\t}\r\n\r\n\tget opacity() {\r\n\r\n\t\treturn this.edgeMaterial.opacity;\r\n\r\n\t}\r\n\r\n\tset opacity( v ) {\r\n\r\n\t\tthis.edgeMaterial.opacity = v;\r\n\t\tthis.meshMaterial.opacity = v;\r\n\r\n\t}\r\n\r\n\tconstructor( mesh, depth = 10 ) {\r\n\r\n\t\tsuper();\r\n\r\n\t\tthis.name = 'MeshBVHVisualizer';\r\n\t\tthis.depth = depth;\r\n\t\tthis.mesh = mesh;\r\n\t\tthis.displayParents = false;\r\n\t\tthis.displayEdges = true;\r\n\t\tthis._roots = [];\r\n\r\n\t\tconst edgeMaterial = new LineBasicMaterial( {\r\n\t\t\tcolor: 0x00FF88,\r\n\t\t\ttransparent: true,\r\n\t\t\topacity: 0.3,\r\n\t\t\tdepthWrite: false,\r\n\t\t} );\r\n\r\n\t\tconst meshMaterial = new MeshBasicMaterial( {\r\n\t\t\tcolor: 0x00FF88,\r\n\t\t\ttransparent: true,\r\n\t\t\topacity: 0.3,\r\n\t\t\tdepthWrite: false,\r\n\t\t} );\r\n\r\n\t\tmeshMaterial.color = edgeMaterial.color;\r\n\r\n\t\tthis.edgeMaterial = edgeMaterial;\r\n\t\tthis.meshMaterial = meshMaterial;\r\n\r\n\t\tthis.update();\r\n\r\n\t}\r\n\r\n\tupdate() {\r\n\r\n\t\tconst bvh = this.mesh.geometry.boundsTree;\r\n\t\tconst totalRoots = bvh ? bvh._roots.length : 0;\r\n\t\twhile ( this._roots.length > totalRoots ) {\r\n\r\n\t\t\tconst root = this._roots.pop();\r\n\t\t\troot.geometry.dispose();\r\n\t\t\tthis.remove( root );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( let i = 0; i < totalRoots; i ++ ) {\r\n\r\n\t\t\tif ( i >= this._roots.length ) {\r\n\r\n\t\t\t\tconst root = new MeshBVHRootVisualizer( this.mesh, this.edgeMaterial, this.depth, i );\r\n\t\t\t\tthis.add( root );\r\n\t\t\t\tthis._roots.push( root );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tconst root = this._roots[ i ];\r\n\t\t\troot.depth = this.depth;\r\n\t\t\troot.mesh = this.mesh;\r\n\t\t\troot.displayParents = this.displayParents;\r\n\t\t\troot.displayEdges = this.displayEdges;\r\n\t\t\troot.material = this.displayEdges ? this.edgeMaterial : this.meshMaterial;\r\n\t\t\troot.update();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tupdateMatrixWorld( ...args ) {\r\n\r\n\t\tthis.position.copy( this.mesh.position );\r\n\t\tthis.rotation.copy( this.mesh.rotation );\r\n\t\tthis.scale.copy( this.mesh.scale );\r\n\r\n\t\tsuper.updateMatrixWorld( ...args );\r\n\r\n\t}\r\n\r\n\tcopy( source ) {\r\n\r\n\t\tthis.depth = source.depth;\r\n\t\tthis.mesh = source.mesh;\r\n\r\n\t}\r\n\r\n\tclone() {\r\n\r\n\t\treturn new MeshBVHVisualizer( this.mesh, this.depth );\r\n\r\n\t}\r\n\r\n\tdispose() {\r\n\r\n\t\tthis.edgeMaterial.dispose();\r\n\t\tthis.meshMaterial.dispose();\r\n\r\n\t\tconst children = this.children;\r\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\r\n\r\n\t\t\tchildren[ i ].geometry.dispose();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\n\r\nexport { MeshBVHVisualizer };\r\n","/**\n * parameters = {\n * color: ,\n * linewidth: ,\n * dashed: ,\n * dashScale: ,\n * dashSize: ,\n * dashOffset: ,\n * gapSize: ,\n * resolution: , // to be set by renderer\n * }\n */\n\nimport {\n\tShaderLib,\n\tShaderMaterial,\n\tUniformsLib,\n\tUniformsUtils,\n\tVector2\n} from 'three';\n\n\nUniformsLib.line = {\n\n\tworldUnits: { value: 1 },\n\tlinewidth: { value: 1 },\n\tresolution: { value: new Vector2( 1, 1 ) },\n\tdashOffset: { value: 0 },\n\tdashScale: { value: 1 },\n\tdashSize: { value: 1 },\n\tgapSize: { value: 1 } // todo FIX - maybe change to totalSize\n\n};\n\nShaderLib[ 'line' ] = {\n\n\tuniforms: UniformsUtils.merge( [\n\t\tUniformsLib.common,\n\t\tUniformsLib.fog,\n\t\tUniformsLib.line\n\t] ),\n\n\tvertexShader:\n\t/* glsl */`\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\n\t\tuniform float linewidth;\n\t\tuniform vec2 resolution;\n\n\t\tattribute vec3 instanceStart;\n\t\tattribute vec3 instanceEnd;\n\n\t\tattribute vec3 instanceColorStart;\n\t\tattribute vec3 instanceColorEnd;\n\n\t\t#ifdef WORLD_UNITS\n\n\t\t\tvarying vec4 worldPos;\n\t\t\tvarying vec3 worldStart;\n\t\t\tvarying vec3 worldEnd;\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t#endif\n\n\t\t#else\n\n\t\t\tvarying vec2 vUv;\n\n\t\t#endif\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashScale;\n\t\t\tattribute float instanceDistanceStart;\n\t\t\tattribute float instanceDistanceEnd;\n\t\t\tvarying float vLineDistance;\n\n\t\t#endif\n\n\t\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\n\n\t\t\t// trim end segment so it terminates between the camera plane and the near plane\n\n\t\t\t// conservative estimate of the near plane\n\t\t\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\n\t\t\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\n\t\t\tfloat nearEstimate = - 0.5 * b / a;\n\n\t\t\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\n\n\t\t\tend.xyz = mix( start.xyz, end.xyz, alpha );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#ifdef USE_COLOR\n\n\t\t\t\tvColor.xyz = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\n\n\t\t\t#endif\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\n\t\t\t\tvUv = uv;\n\n\t\t\t#endif\n\n\t\t\tfloat aspect = resolution.x / resolution.y;\n\n\t\t\t// camera space\n\t\t\tvec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\n\t\t\tvec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\tworldStart = start.xyz;\n\t\t\t\tworldEnd = end.xyz;\n\n\t\t\t#else\n\n\t\t\t\tvUv = uv;\n\n\t\t\t#endif\n\n\t\t\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\n\t\t\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\n\t\t\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\n\t\t\t// perhaps there is a more elegant solution -- WestLangley\n\n\t\t\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\n\n\t\t\tif ( perspective ) {\n\n\t\t\t\tif ( start.z < 0.0 && end.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( start, end );\n\n\t\t\t\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( end, start );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// clip space\n\t\t\tvec4 clipStart = projectionMatrix * start;\n\t\t\tvec4 clipEnd = projectionMatrix * end;\n\n\t\t\t// ndc space\n\t\t\tvec3 ndcStart = clipStart.xyz / clipStart.w;\n\t\t\tvec3 ndcEnd = clipEnd.xyz / clipEnd.w;\n\n\t\t\t// direction\n\t\t\tvec2 dir = ndcEnd.xy - ndcStart.xy;\n\n\t\t\t// account for clip-space aspect ratio\n\t\t\tdir.x *= aspect;\n\t\t\tdir = normalize( dir );\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t// get the offset direction as perpendicular to the view vector\n\t\t\t\tvec3 worldDir = normalize( end.xyz - start.xyz );\n\t\t\t\tvec3 offset;\n\t\t\t\tif ( position.y < 0.5 ) {\n\n\t\t\t\t\toffset = normalize( cross( start.xyz, worldDir ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\toffset = normalize( cross( end.xyz, worldDir ) );\n\n\t\t\t\t}\n\n\t\t\t\t// sign flip\n\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\tfloat forwardOffset = dot( worldDir, vec3( 0.0, 0.0, 1.0 ) );\n\n\t\t\t\t// don't extend the line if we're rendering dashes because we\n\t\t\t\t// won't be rendering the endcaps\n\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t// extend the line bounds to encompass endcaps\n\t\t\t\t\tstart.xyz += - worldDir * linewidth * 0.5;\n\t\t\t\t\tend.xyz += worldDir * linewidth * 0.5;\n\n\t\t\t\t\t// shift the position of the quad so it hugs the forward edge of the line\n\t\t\t\t\toffset.xy -= dir * forwardOffset;\n\t\t\t\t\toffset.z += 0.5;\n\n\t\t\t\t#endif\n\n\t\t\t\t// endcaps\n\t\t\t\tif ( position.y > 1.0 || position.y < 0.0 ) {\n\n\t\t\t\t\toffset.xy += dir * 2.0 * forwardOffset;\n\n\t\t\t\t}\n\n\t\t\t\t// adjust for linewidth\n\t\t\t\toffset *= linewidth * 0.5;\n\n\t\t\t\t// set the world position\n\t\t\t\tworldPos = ( position.y < 0.5 ) ? start : end;\n\t\t\t\tworldPos.xyz += offset;\n\n\t\t\t\t// project the worldpos\n\t\t\t\tvec4 clip = projectionMatrix * worldPos;\n\n\t\t\t\t// shift the depth of the projected points so the line\n\t\t\t\t// segments overlap neatly\n\t\t\t\tvec3 clipPose = ( position.y < 0.5 ) ? ndcStart : ndcEnd;\n\t\t\t\tclip.z = clipPose.z * clip.w;\n\n\t\t\t#else\n\n\t\t\t\tvec2 offset = vec2( dir.y, - dir.x );\n\t\t\t\t// undo aspect ratio adjustment\n\t\t\t\tdir.x /= aspect;\n\t\t\t\toffset.x /= aspect;\n\n\t\t\t\t// sign flip\n\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\t// endcaps\n\t\t\t\tif ( position.y < 0.0 ) {\n\n\t\t\t\t\toffset += - dir;\n\n\t\t\t\t} else if ( position.y > 1.0 ) {\n\n\t\t\t\t\toffset += dir;\n\n\t\t\t\t}\n\n\t\t\t\t// adjust for linewidth\n\t\t\t\toffset *= linewidth;\n\n\t\t\t\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\n\t\t\t\toffset /= resolution.y;\n\n\t\t\t\t// select end\n\t\t\t\tvec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;\n\n\t\t\t\t// back to clip space\n\t\t\t\toffset *= clip.w;\n\n\t\t\t\tclip.xy += offset;\n\n\t\t\t#endif\n\n\t\t\tgl_Position = clip;\n\n\t\t\tvec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation\n\n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\n\t\t}\n\t\t`,\n\n\tfragmentShader:\n\t/* glsl */`\n\t\tuniform vec3 diffuse;\n\t\tuniform float opacity;\n\t\tuniform float linewidth;\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashOffset;\n\t\t\tuniform float dashSize;\n\t\t\tuniform float gapSize;\n\n\t\t#endif\n\n\t\tvarying float vLineDistance;\n\n\t\t#ifdef WORLD_UNITS\n\n\t\t\tvarying vec4 worldPos;\n\t\t\tvarying vec3 worldStart;\n\t\t\tvarying vec3 worldEnd;\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t#endif\n\n\t\t#else\n\n\t\t\tvarying vec2 vUv;\n\n\t\t#endif\n\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\n\t\tvec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {\n\n\t\t\tfloat mua;\n\t\t\tfloat mub;\n\n\t\t\tvec3 p13 = p1 - p3;\n\t\t\tvec3 p43 = p4 - p3;\n\n\t\t\tvec3 p21 = p2 - p1;\n\n\t\t\tfloat d1343 = dot( p13, p43 );\n\t\t\tfloat d4321 = dot( p43, p21 );\n\t\t\tfloat d1321 = dot( p13, p21 );\n\t\t\tfloat d4343 = dot( p43, p43 );\n\t\t\tfloat d2121 = dot( p21, p21 );\n\n\t\t\tfloat denom = d2121 * d4343 - d4321 * d4321;\n\n\t\t\tfloat numer = d1343 * d4321 - d1321 * d4343;\n\n\t\t\tmua = numer / denom;\n\t\t\tmua = clamp( mua, 0.0, 1.0 );\n\t\t\tmub = ( d1343 + d4321 * ( mua ) ) / d4343;\n\t\t\tmub = clamp( mub, 0.0, 1.0 );\n\n\t\t\treturn vec2( mua, mub );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#include \n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\n\n\t\t\t\tif ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\n\n\t\t\t#endif\n\n\t\t\tfloat alpha = opacity;\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t// Find the closest points on the view ray and the line segment\n\t\t\t\tvec3 rayEnd = normalize( worldPos.xyz ) * 1e5;\n\t\t\t\tvec3 lineDir = worldEnd - worldStart;\n\t\t\t\tvec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );\n\n\t\t\t\tvec3 p1 = worldStart + lineDir * params.x;\n\t\t\t\tvec3 p2 = rayEnd * params.y;\n\t\t\t\tvec3 delta = p1 - p2;\n\t\t\t\tfloat len = length( delta );\n\t\t\t\tfloat norm = len / linewidth;\n\n\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t\tfloat dnorm = fwidth( norm );\n\t\t\t\t\t\talpha = 1.0 - smoothstep( 0.5 - dnorm, 0.5 + dnorm, norm );\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\tif ( norm > 0.5 ) {\n\n\t\t\t\t\t\t\tdiscard;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t#endif\n\n\t\t\t\t#endif\n\n\t\t\t#else\n\n\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t// artifacts appear on some hardware if a derivative is taken within a conditional\n\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\tfloat len2 = a * a + b * b;\n\t\t\t\t\tfloat dlen = fwidth( len2 );\n\n\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\talpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t#else\n\n\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\t\tfloat len2 = a * a + b * b;\n\n\t\t\t\t\t\tif ( len2 > 1.0 ) discard;\n\n\t\t\t\t\t}\n\n\t\t\t\t#endif\n\n\t\t\t#endif\n\n\t\t\tvec4 diffuseColor = vec4( diffuse, alpha );\n\n\t\t\t#include \n\t\t\t#include \n\n\t\t\tgl_FragColor = vec4( diffuseColor.rgb, alpha );\n\n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\n\t\t}\n\t\t`\n};\n\nclass LineMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( {\n\n\t\t\ttype: 'LineMaterial',\n\n\t\t\tuniforms: UniformsUtils.clone( ShaderLib[ 'line' ].uniforms ),\n\n\t\t\tvertexShader: ShaderLib[ 'line' ].vertexShader,\n\t\t\tfragmentShader: ShaderLib[ 'line' ].fragmentShader,\n\n\t\t\tclipping: true // required for clipping support\n\n\t\t} );\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tcolor: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.diffuse.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.diffuse.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tworldUnits: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn 'WORLD_UNITS' in this.defines;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tif ( value === true ) {\n\n\t\t\t\t\t\tthis.defines.WORLD_UNITS = '';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdelete this.defines.WORLD_UNITS;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tlinewidth: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.linewidth.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.linewidth.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashed: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn Boolean( 'USE_DASH' in this.defines );\n\n\t\t\t\t},\n\n\t\t\t\tset( value ) {\n\n\t\t\t\t\tif ( Boolean( value ) !== Boolean( 'USE_DASH' in this.defines ) ) {\n\n\t\t\t\t\t\tthis.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( value === true ) {\n\n\t\t\t\t\t\tthis.defines.USE_DASH = '';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdelete this.defines.USE_DASH;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashScale: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.dashScale.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.dashScale.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashSize: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.dashSize.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.dashSize.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashOffset: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.dashOffset.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.dashOffset.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tgapSize: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.gapSize.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.gapSize.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\topacity: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tresolution: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.resolution.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.resolution.value.copy( value );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\talphaToCoverage: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn Boolean( 'USE_ALPHA_TO_COVERAGE' in this.defines );\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tif ( Boolean( value ) !== Boolean( 'USE_ALPHA_TO_COVERAGE' in this.defines ) ) {\n\n\t\t\t\t\t\tthis.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( value === true ) {\n\n\t\t\t\t\t\tthis.defines.USE_ALPHA_TO_COVERAGE = '';\n\t\t\t\t\t\tthis.extensions.derivatives = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdelete this.defines.USE_ALPHA_TO_COVERAGE;\n\t\t\t\t\t\tthis.extensions.derivatives = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n}\n\nLineMaterial.prototype.isLineMaterial = true;\n\nexport { LineMaterial };\n","module.exports = [\n {\n \"value\":\"#B0171F\",\n \"name\":\"indian red\"\n },\n {\n \"value\":\"#DC143C\",\n \"css\":true,\n \"name\":\"crimson\"\n },\n {\n \"value\":\"#FFB6C1\",\n \"css\":true,\n \"name\":\"lightpink\"\n },\n {\n \"value\":\"#FFAEB9\",\n \"name\":\"lightpink 1\"\n },\n {\n \"value\":\"#EEA2AD\",\n \"name\":\"lightpink 2\"\n },\n {\n \"value\":\"#CD8C95\",\n \"name\":\"lightpink 3\"\n },\n {\n \"value\":\"#8B5F65\",\n \"name\":\"lightpink 4\"\n },\n {\n \"value\":\"#FFC0CB\",\n \"css\":true,\n \"name\":\"pink\"\n },\n {\n \"value\":\"#FFB5C5\",\n \"name\":\"pink 1\"\n },\n {\n \"value\":\"#EEA9B8\",\n \"name\":\"pink 2\"\n },\n {\n \"value\":\"#CD919E\",\n \"name\":\"pink 3\"\n },\n {\n \"value\":\"#8B636C\",\n \"name\":\"pink 4\"\n },\n {\n \"value\":\"#DB7093\",\n \"css\":true,\n \"name\":\"palevioletred\"\n },\n {\n \"value\":\"#FF82AB\",\n \"name\":\"palevioletred 1\"\n },\n {\n \"value\":\"#EE799F\",\n \"name\":\"palevioletred 2\"\n },\n {\n \"value\":\"#CD6889\",\n \"name\":\"palevioletred 3\"\n },\n {\n \"value\":\"#8B475D\",\n \"name\":\"palevioletred 4\"\n },\n {\n \"value\":\"#FFF0F5\",\n \"name\":\"lavenderblush 1\"\n },\n {\n \"value\":\"#FFF0F5\",\n \"css\":true,\n \"name\":\"lavenderblush\"\n },\n {\n \"value\":\"#EEE0E5\",\n \"name\":\"lavenderblush 2\"\n },\n {\n \"value\":\"#CDC1C5\",\n \"name\":\"lavenderblush 3\"\n },\n {\n \"value\":\"#8B8386\",\n \"name\":\"lavenderblush 4\"\n },\n {\n \"value\":\"#FF3E96\",\n \"name\":\"violetred 1\"\n },\n {\n \"value\":\"#EE3A8C\",\n \"name\":\"violetred 2\"\n },\n {\n \"value\":\"#CD3278\",\n \"name\":\"violetred 3\"\n },\n {\n \"value\":\"#8B2252\",\n \"name\":\"violetred 4\"\n },\n {\n \"value\":\"#FF69B4\",\n \"css\":true,\n \"name\":\"hotpink\"\n },\n {\n \"value\":\"#FF6EB4\",\n \"name\":\"hotpink 1\"\n },\n {\n \"value\":\"#EE6AA7\",\n \"name\":\"hotpink 2\"\n },\n {\n \"value\":\"#CD6090\",\n \"name\":\"hotpink 3\"\n },\n {\n \"value\":\"#8B3A62\",\n \"name\":\"hotpink 4\"\n },\n {\n \"value\":\"#872657\",\n \"name\":\"raspberry\"\n },\n {\n \"value\":\"#FF1493\",\n \"name\":\"deeppink 1\"\n },\n {\n \"value\":\"#FF1493\",\n \"css\":true,\n \"name\":\"deeppink\"\n },\n {\n \"value\":\"#EE1289\",\n \"name\":\"deeppink 2\"\n },\n {\n \"value\":\"#CD1076\",\n \"name\":\"deeppink 3\"\n },\n {\n \"value\":\"#8B0A50\",\n \"name\":\"deeppink 4\"\n },\n {\n \"value\":\"#FF34B3\",\n \"name\":\"maroon 1\"\n },\n {\n \"value\":\"#EE30A7\",\n \"name\":\"maroon 2\"\n },\n {\n \"value\":\"#CD2990\",\n \"name\":\"maroon 3\"\n },\n {\n \"value\":\"#8B1C62\",\n \"name\":\"maroon 4\"\n },\n {\n \"value\":\"#C71585\",\n \"css\":true,\n \"name\":\"mediumvioletred\"\n },\n {\n \"value\":\"#D02090\",\n \"name\":\"violetred\"\n },\n {\n \"value\":\"#DA70D6\",\n \"css\":true,\n \"name\":\"orchid\"\n },\n {\n \"value\":\"#FF83FA\",\n \"name\":\"orchid 1\"\n },\n {\n \"value\":\"#EE7AE9\",\n \"name\":\"orchid 2\"\n },\n {\n \"value\":\"#CD69C9\",\n \"name\":\"orchid 3\"\n },\n {\n \"value\":\"#8B4789\",\n \"name\":\"orchid 4\"\n },\n {\n \"value\":\"#D8BFD8\",\n \"css\":true,\n \"name\":\"thistle\"\n },\n {\n \"value\":\"#FFE1FF\",\n \"name\":\"thistle 1\"\n },\n {\n \"value\":\"#EED2EE\",\n \"name\":\"thistle 2\"\n },\n {\n \"value\":\"#CDB5CD\",\n \"name\":\"thistle 3\"\n },\n {\n \"value\":\"#8B7B8B\",\n \"name\":\"thistle 4\"\n },\n {\n \"value\":\"#FFBBFF\",\n \"name\":\"plum 1\"\n },\n {\n \"value\":\"#EEAEEE\",\n \"name\":\"plum 2\"\n },\n {\n \"value\":\"#CD96CD\",\n \"name\":\"plum 3\"\n },\n {\n \"value\":\"#8B668B\",\n \"name\":\"plum 4\"\n },\n {\n \"value\":\"#DDA0DD\",\n \"css\":true,\n \"name\":\"plum\"\n },\n {\n \"value\":\"#EE82EE\",\n \"css\":true,\n \"name\":\"violet\"\n },\n {\n \"value\":\"#FF00FF\",\n \"vga\":true,\n \"name\":\"magenta\"\n },\n {\n \"value\":\"#FF00FF\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"fuchsia\"\n },\n {\n \"value\":\"#EE00EE\",\n \"name\":\"magenta 2\"\n },\n {\n \"value\":\"#CD00CD\",\n \"name\":\"magenta 3\"\n },\n {\n \"value\":\"#8B008B\",\n \"name\":\"magenta 4\"\n },\n {\n \"value\":\"#8B008B\",\n \"css\":true,\n \"name\":\"darkmagenta\"\n },\n {\n \"value\":\"#800080\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"purple\"\n },\n {\n \"value\":\"#BA55D3\",\n \"css\":true,\n \"name\":\"mediumorchid\"\n },\n {\n \"value\":\"#E066FF\",\n \"name\":\"mediumorchid 1\"\n },\n {\n \"value\":\"#D15FEE\",\n \"name\":\"mediumorchid 2\"\n },\n {\n \"value\":\"#B452CD\",\n \"name\":\"mediumorchid 3\"\n },\n {\n \"value\":\"#7A378B\",\n \"name\":\"mediumorchid 4\"\n },\n {\n \"value\":\"#9400D3\",\n \"css\":true,\n \"name\":\"darkviolet\"\n },\n {\n \"value\":\"#9932CC\",\n \"css\":true,\n \"name\":\"darkorchid\"\n },\n {\n \"value\":\"#BF3EFF\",\n \"name\":\"darkorchid 1\"\n },\n {\n \"value\":\"#B23AEE\",\n \"name\":\"darkorchid 2\"\n },\n {\n \"value\":\"#9A32CD\",\n \"name\":\"darkorchid 3\"\n },\n {\n \"value\":\"#68228B\",\n \"name\":\"darkorchid 4\"\n },\n {\n \"value\":\"#4B0082\",\n \"css\":true,\n \"name\":\"indigo\"\n },\n {\n \"value\":\"#8A2BE2\",\n \"css\":true,\n \"name\":\"blueviolet\"\n },\n {\n \"value\":\"#9B30FF\",\n \"name\":\"purple 1\"\n },\n {\n \"value\":\"#912CEE\",\n \"name\":\"purple 2\"\n },\n {\n \"value\":\"#7D26CD\",\n \"name\":\"purple 3\"\n },\n {\n \"value\":\"#551A8B\",\n \"name\":\"purple 4\"\n },\n {\n \"value\":\"#9370DB\",\n \"css\":true,\n \"name\":\"mediumpurple\"\n },\n {\n \"value\":\"#AB82FF\",\n \"name\":\"mediumpurple 1\"\n },\n {\n \"value\":\"#9F79EE\",\n \"name\":\"mediumpurple 2\"\n },\n {\n \"value\":\"#8968CD\",\n \"name\":\"mediumpurple 3\"\n },\n {\n \"value\":\"#5D478B\",\n \"name\":\"mediumpurple 4\"\n },\n {\n \"value\":\"#483D8B\",\n \"css\":true,\n \"name\":\"darkslateblue\"\n },\n {\n \"value\":\"#8470FF\",\n \"name\":\"lightslateblue\"\n },\n {\n \"value\":\"#7B68EE\",\n \"css\":true,\n \"name\":\"mediumslateblue\"\n },\n {\n \"value\":\"#6A5ACD\",\n \"css\":true,\n \"name\":\"slateblue\"\n },\n {\n \"value\":\"#836FFF\",\n \"name\":\"slateblue 1\"\n },\n {\n \"value\":\"#7A67EE\",\n \"name\":\"slateblue 2\"\n },\n {\n \"value\":\"#6959CD\",\n \"name\":\"slateblue 3\"\n },\n {\n \"value\":\"#473C8B\",\n \"name\":\"slateblue 4\"\n },\n {\n \"value\":\"#F8F8FF\",\n \"css\":true,\n \"name\":\"ghostwhite\"\n },\n {\n \"value\":\"#E6E6FA\",\n \"css\":true,\n \"name\":\"lavender\"\n },\n {\n \"value\":\"#0000FF\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"blue\"\n },\n {\n \"value\":\"#0000EE\",\n \"name\":\"blue 2\"\n },\n {\n \"value\":\"#0000CD\",\n \"name\":\"blue 3\"\n },\n {\n \"value\":\"#0000CD\",\n \"css\":true,\n \"name\":\"mediumblue\"\n },\n {\n \"value\":\"#00008B\",\n \"name\":\"blue 4\"\n },\n {\n \"value\":\"#00008B\",\n \"css\":true,\n \"name\":\"darkblue\"\n },\n {\n \"value\":\"#000080\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"navy\"\n },\n {\n \"value\":\"#191970\",\n \"css\":true,\n \"name\":\"midnightblue\"\n },\n {\n \"value\":\"#3D59AB\",\n \"name\":\"cobalt\"\n },\n {\n \"value\":\"#4169E1\",\n \"css\":true,\n \"name\":\"royalblue\"\n },\n {\n \"value\":\"#4876FF\",\n \"name\":\"royalblue 1\"\n },\n {\n \"value\":\"#436EEE\",\n \"name\":\"royalblue 2\"\n },\n {\n \"value\":\"#3A5FCD\",\n \"name\":\"royalblue 3\"\n },\n {\n \"value\":\"#27408B\",\n \"name\":\"royalblue 4\"\n },\n {\n \"value\":\"#6495ED\",\n \"css\":true,\n \"name\":\"cornflowerblue\"\n },\n {\n \"value\":\"#B0C4DE\",\n \"css\":true,\n \"name\":\"lightsteelblue\"\n },\n {\n \"value\":\"#CAE1FF\",\n \"name\":\"lightsteelblue 1\"\n },\n {\n \"value\":\"#BCD2EE\",\n \"name\":\"lightsteelblue 2\"\n },\n {\n \"value\":\"#A2B5CD\",\n \"name\":\"lightsteelblue 3\"\n },\n {\n \"value\":\"#6E7B8B\",\n \"name\":\"lightsteelblue 4\"\n },\n {\n \"value\":\"#778899\",\n \"css\":true,\n \"name\":\"lightslategray\"\n },\n {\n \"value\":\"#708090\",\n \"css\":true,\n \"name\":\"slategray\"\n },\n {\n \"value\":\"#C6E2FF\",\n \"name\":\"slategray 1\"\n },\n {\n \"value\":\"#B9D3EE\",\n \"name\":\"slategray 2\"\n },\n {\n \"value\":\"#9FB6CD\",\n \"name\":\"slategray 3\"\n },\n {\n \"value\":\"#6C7B8B\",\n \"name\":\"slategray 4\"\n },\n {\n \"value\":\"#1E90FF\",\n \"name\":\"dodgerblue 1\"\n },\n {\n \"value\":\"#1E90FF\",\n \"css\":true,\n \"name\":\"dodgerblue\"\n },\n {\n \"value\":\"#1C86EE\",\n \"name\":\"dodgerblue 2\"\n },\n {\n \"value\":\"#1874CD\",\n \"name\":\"dodgerblue 3\"\n },\n {\n \"value\":\"#104E8B\",\n \"name\":\"dodgerblue 4\"\n },\n {\n \"value\":\"#F0F8FF\",\n \"css\":true,\n \"name\":\"aliceblue\"\n },\n {\n \"value\":\"#4682B4\",\n \"css\":true,\n \"name\":\"steelblue\"\n },\n {\n \"value\":\"#63B8FF\",\n \"name\":\"steelblue 1\"\n },\n {\n \"value\":\"#5CACEE\",\n \"name\":\"steelblue 2\"\n },\n {\n \"value\":\"#4F94CD\",\n \"name\":\"steelblue 3\"\n },\n {\n \"value\":\"#36648B\",\n \"name\":\"steelblue 4\"\n },\n {\n \"value\":\"#87CEFA\",\n \"css\":true,\n \"name\":\"lightskyblue\"\n },\n {\n \"value\":\"#B0E2FF\",\n \"name\":\"lightskyblue 1\"\n },\n {\n \"value\":\"#A4D3EE\",\n \"name\":\"lightskyblue 2\"\n },\n {\n \"value\":\"#8DB6CD\",\n \"name\":\"lightskyblue 3\"\n },\n {\n \"value\":\"#607B8B\",\n \"name\":\"lightskyblue 4\"\n },\n {\n \"value\":\"#87CEFF\",\n \"name\":\"skyblue 1\"\n },\n {\n \"value\":\"#7EC0EE\",\n \"name\":\"skyblue 2\"\n },\n {\n \"value\":\"#6CA6CD\",\n \"name\":\"skyblue 3\"\n },\n {\n \"value\":\"#4A708B\",\n \"name\":\"skyblue 4\"\n },\n {\n \"value\":\"#87CEEB\",\n \"css\":true,\n \"name\":\"skyblue\"\n },\n {\n \"value\":\"#00BFFF\",\n \"name\":\"deepskyblue 1\"\n },\n {\n \"value\":\"#00BFFF\",\n \"css\":true,\n \"name\":\"deepskyblue\"\n },\n {\n \"value\":\"#00B2EE\",\n \"name\":\"deepskyblue 2\"\n },\n {\n \"value\":\"#009ACD\",\n \"name\":\"deepskyblue 3\"\n },\n {\n \"value\":\"#00688B\",\n \"name\":\"deepskyblue 4\"\n },\n {\n \"value\":\"#33A1C9\",\n \"name\":\"peacock\"\n },\n {\n \"value\":\"#ADD8E6\",\n \"css\":true,\n \"name\":\"lightblue\"\n },\n {\n \"value\":\"#BFEFFF\",\n \"name\":\"lightblue 1\"\n },\n {\n \"value\":\"#B2DFEE\",\n \"name\":\"lightblue 2\"\n },\n {\n \"value\":\"#9AC0CD\",\n \"name\":\"lightblue 3\"\n },\n {\n \"value\":\"#68838B\",\n \"name\":\"lightblue 4\"\n },\n {\n \"value\":\"#B0E0E6\",\n \"css\":true,\n \"name\":\"powderblue\"\n },\n {\n \"value\":\"#98F5FF\",\n \"name\":\"cadetblue 1\"\n },\n {\n \"value\":\"#8EE5EE\",\n \"name\":\"cadetblue 2\"\n },\n {\n \"value\":\"#7AC5CD\",\n \"name\":\"cadetblue 3\"\n },\n {\n \"value\":\"#53868B\",\n \"name\":\"cadetblue 4\"\n },\n {\n \"value\":\"#00F5FF\",\n \"name\":\"turquoise 1\"\n },\n {\n \"value\":\"#00E5EE\",\n \"name\":\"turquoise 2\"\n },\n {\n \"value\":\"#00C5CD\",\n \"name\":\"turquoise 3\"\n },\n {\n \"value\":\"#00868B\",\n \"name\":\"turquoise 4\"\n },\n {\n \"value\":\"#5F9EA0\",\n \"css\":true,\n \"name\":\"cadetblue\"\n },\n {\n \"value\":\"#00CED1\",\n \"css\":true,\n \"name\":\"darkturquoise\"\n },\n {\n \"value\":\"#F0FFFF\",\n \"name\":\"azure 1\"\n },\n {\n \"value\":\"#F0FFFF\",\n \"css\":true,\n \"name\":\"azure\"\n },\n {\n \"value\":\"#E0EEEE\",\n \"name\":\"azure 2\"\n },\n {\n \"value\":\"#C1CDCD\",\n \"name\":\"azure 3\"\n },\n {\n \"value\":\"#838B8B\",\n \"name\":\"azure 4\"\n },\n {\n \"value\":\"#E0FFFF\",\n \"name\":\"lightcyan 1\"\n },\n {\n \"value\":\"#E0FFFF\",\n \"css\":true,\n \"name\":\"lightcyan\"\n },\n {\n \"value\":\"#D1EEEE\",\n \"name\":\"lightcyan 2\"\n },\n {\n \"value\":\"#B4CDCD\",\n \"name\":\"lightcyan 3\"\n },\n {\n \"value\":\"#7A8B8B\",\n \"name\":\"lightcyan 4\"\n },\n {\n \"value\":\"#BBFFFF\",\n \"name\":\"paleturquoise 1\"\n },\n {\n \"value\":\"#AEEEEE\",\n \"name\":\"paleturquoise 2\"\n },\n {\n \"value\":\"#AEEEEE\",\n \"css\":true,\n \"name\":\"paleturquoise\"\n },\n {\n \"value\":\"#96CDCD\",\n \"name\":\"paleturquoise 3\"\n },\n {\n \"value\":\"#668B8B\",\n \"name\":\"paleturquoise 4\"\n },\n {\n \"value\":\"#2F4F4F\",\n \"css\":true,\n \"name\":\"darkslategray\"\n },\n {\n \"value\":\"#97FFFF\",\n \"name\":\"darkslategray 1\"\n },\n {\n \"value\":\"#8DEEEE\",\n \"name\":\"darkslategray 2\"\n },\n {\n \"value\":\"#79CDCD\",\n \"name\":\"darkslategray 3\"\n },\n {\n \"value\":\"#528B8B\",\n \"name\":\"darkslategray 4\"\n },\n {\n \"value\":\"#00FFFF\",\n \"name\":\"cyan\"\n },\n {\n \"value\":\"#00FFFF\",\n \"css\":true,\n \"name\":\"aqua\"\n },\n {\n \"value\":\"#00EEEE\",\n \"name\":\"cyan 2\"\n },\n {\n \"value\":\"#00CDCD\",\n \"name\":\"cyan 3\"\n },\n {\n \"value\":\"#008B8B\",\n \"name\":\"cyan 4\"\n },\n {\n \"value\":\"#008B8B\",\n \"css\":true,\n \"name\":\"darkcyan\"\n },\n {\n \"value\":\"#008080\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"teal\"\n },\n {\n \"value\":\"#48D1CC\",\n \"css\":true,\n \"name\":\"mediumturquoise\"\n },\n {\n \"value\":\"#20B2AA\",\n \"css\":true,\n \"name\":\"lightseagreen\"\n },\n {\n \"value\":\"#03A89E\",\n \"name\":\"manganeseblue\"\n },\n {\n \"value\":\"#40E0D0\",\n \"css\":true,\n \"name\":\"turquoise\"\n },\n {\n \"value\":\"#808A87\",\n \"name\":\"coldgrey\"\n },\n {\n \"value\":\"#00C78C\",\n \"name\":\"turquoiseblue\"\n },\n {\n \"value\":\"#7FFFD4\",\n \"name\":\"aquamarine 1\"\n },\n {\n \"value\":\"#7FFFD4\",\n \"css\":true,\n \"name\":\"aquamarine\"\n },\n {\n \"value\":\"#76EEC6\",\n \"name\":\"aquamarine 2\"\n },\n {\n \"value\":\"#66CDAA\",\n \"name\":\"aquamarine 3\"\n },\n {\n \"value\":\"#66CDAA\",\n \"css\":true,\n \"name\":\"mediumaquamarine\"\n },\n {\n \"value\":\"#458B74\",\n \"name\":\"aquamarine 4\"\n },\n {\n \"value\":\"#00FA9A\",\n \"css\":true,\n \"name\":\"mediumspringgreen\"\n },\n {\n \"value\":\"#F5FFFA\",\n \"css\":true,\n \"name\":\"mintcream\"\n },\n {\n \"value\":\"#00FF7F\",\n \"css\":true,\n \"name\":\"springgreen\"\n },\n {\n \"value\":\"#00EE76\",\n \"name\":\"springgreen 1\"\n },\n {\n \"value\":\"#00CD66\",\n \"name\":\"springgreen 2\"\n },\n {\n \"value\":\"#008B45\",\n \"name\":\"springgreen 3\"\n },\n {\n \"value\":\"#3CB371\",\n \"css\":true,\n \"name\":\"mediumseagreen\"\n },\n {\n \"value\":\"#54FF9F\",\n \"name\":\"seagreen 1\"\n },\n {\n \"value\":\"#4EEE94\",\n \"name\":\"seagreen 2\"\n },\n {\n \"value\":\"#43CD80\",\n \"name\":\"seagreen 3\"\n },\n {\n \"value\":\"#2E8B57\",\n \"name\":\"seagreen 4\"\n },\n {\n \"value\":\"#2E8B57\",\n \"css\":true,\n \"name\":\"seagreen\"\n },\n {\n \"value\":\"#00C957\",\n \"name\":\"emeraldgreen\"\n },\n {\n \"value\":\"#BDFCC9\",\n \"name\":\"mint\"\n },\n {\n \"value\":\"#3D9140\",\n \"name\":\"cobaltgreen\"\n },\n {\n \"value\":\"#F0FFF0\",\n \"name\":\"honeydew 1\"\n },\n {\n \"value\":\"#F0FFF0\",\n \"css\":true,\n \"name\":\"honeydew\"\n },\n {\n \"value\":\"#E0EEE0\",\n \"name\":\"honeydew 2\"\n },\n {\n \"value\":\"#C1CDC1\",\n \"name\":\"honeydew 3\"\n },\n {\n \"value\":\"#838B83\",\n \"name\":\"honeydew 4\"\n },\n {\n \"value\":\"#8FBC8F\",\n \"css\":true,\n \"name\":\"darkseagreen\"\n },\n {\n \"value\":\"#C1FFC1\",\n \"name\":\"darkseagreen 1\"\n },\n {\n \"value\":\"#B4EEB4\",\n \"name\":\"darkseagreen 2\"\n },\n {\n \"value\":\"#9BCD9B\",\n \"name\":\"darkseagreen 3\"\n },\n {\n \"value\":\"#698B69\",\n \"name\":\"darkseagreen 4\"\n },\n {\n \"value\":\"#98FB98\",\n \"css\":true,\n \"name\":\"palegreen\"\n },\n {\n \"value\":\"#9AFF9A\",\n \"name\":\"palegreen 1\"\n },\n {\n \"value\":\"#90EE90\",\n \"name\":\"palegreen 2\"\n },\n {\n \"value\":\"#90EE90\",\n \"css\":true,\n \"name\":\"lightgreen\"\n },\n {\n \"value\":\"#7CCD7C\",\n \"name\":\"palegreen 3\"\n },\n {\n \"value\":\"#548B54\",\n \"name\":\"palegreen 4\"\n },\n {\n \"value\":\"#32CD32\",\n \"css\":true,\n \"name\":\"limegreen\"\n },\n {\n \"value\":\"#228B22\",\n \"css\":true,\n \"name\":\"forestgreen\"\n },\n {\n \"value\":\"#00FF00\",\n \"vga\":true,\n \"name\":\"green 1\"\n },\n {\n \"value\":\"#00FF00\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"lime\"\n },\n {\n \"value\":\"#00EE00\",\n \"name\":\"green 2\"\n },\n {\n \"value\":\"#00CD00\",\n \"name\":\"green 3\"\n },\n {\n \"value\":\"#008B00\",\n \"name\":\"green 4\"\n },\n {\n \"value\":\"#008000\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"green\"\n },\n {\n \"value\":\"#006400\",\n \"css\":true,\n \"name\":\"darkgreen\"\n },\n {\n \"value\":\"#308014\",\n \"name\":\"sapgreen\"\n },\n {\n \"value\":\"#7CFC00\",\n \"css\":true,\n \"name\":\"lawngreen\"\n },\n {\n \"value\":\"#7FFF00\",\n \"name\":\"chartreuse 1\"\n },\n {\n \"value\":\"#7FFF00\",\n \"css\":true,\n \"name\":\"chartreuse\"\n },\n {\n \"value\":\"#76EE00\",\n \"name\":\"chartreuse 2\"\n },\n {\n \"value\":\"#66CD00\",\n \"name\":\"chartreuse 3\"\n },\n {\n \"value\":\"#458B00\",\n \"name\":\"chartreuse 4\"\n },\n {\n \"value\":\"#ADFF2F\",\n \"css\":true,\n \"name\":\"greenyellow\"\n },\n {\n \"value\":\"#CAFF70\",\n \"name\":\"darkolivegreen 1\"\n },\n {\n \"value\":\"#BCEE68\",\n \"name\":\"darkolivegreen 2\"\n },\n {\n \"value\":\"#A2CD5A\",\n \"name\":\"darkolivegreen 3\"\n },\n {\n \"value\":\"#6E8B3D\",\n \"name\":\"darkolivegreen 4\"\n },\n {\n \"value\":\"#556B2F\",\n \"css\":true,\n \"name\":\"darkolivegreen\"\n },\n {\n \"value\":\"#6B8E23\",\n \"css\":true,\n \"name\":\"olivedrab\"\n },\n {\n \"value\":\"#C0FF3E\",\n \"name\":\"olivedrab 1\"\n },\n {\n \"value\":\"#B3EE3A\",\n \"name\":\"olivedrab 2\"\n },\n {\n \"value\":\"#9ACD32\",\n \"name\":\"olivedrab 3\"\n },\n {\n \"value\":\"#9ACD32\",\n \"css\":true,\n \"name\":\"yellowgreen\"\n },\n {\n \"value\":\"#698B22\",\n \"name\":\"olivedrab 4\"\n },\n {\n \"value\":\"#FFFFF0\",\n \"name\":\"ivory 1\"\n },\n {\n \"value\":\"#FFFFF0\",\n \"css\":true,\n \"name\":\"ivory\"\n },\n {\n \"value\":\"#EEEEE0\",\n \"name\":\"ivory 2\"\n },\n {\n \"value\":\"#CDCDC1\",\n \"name\":\"ivory 3\"\n },\n {\n \"value\":\"#8B8B83\",\n \"name\":\"ivory 4\"\n },\n {\n \"value\":\"#F5F5DC\",\n \"css\":true,\n \"name\":\"beige\"\n },\n {\n \"value\":\"#FFFFE0\",\n \"name\":\"lightyellow 1\"\n },\n {\n \"value\":\"#FFFFE0\",\n \"css\":true,\n \"name\":\"lightyellow\"\n },\n {\n \"value\":\"#EEEED1\",\n \"name\":\"lightyellow 2\"\n },\n {\n \"value\":\"#CDCDB4\",\n \"name\":\"lightyellow 3\"\n },\n {\n \"value\":\"#8B8B7A\",\n \"name\":\"lightyellow 4\"\n },\n {\n \"value\":\"#FAFAD2\",\n \"css\":true,\n \"name\":\"lightgoldenrodyellow\"\n },\n {\n \"value\":\"#FFFF00\",\n \"vga\":true,\n \"name\":\"yellow 1\"\n },\n {\n \"value\":\"#FFFF00\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"yellow\"\n },\n {\n \"value\":\"#EEEE00\",\n \"name\":\"yellow 2\"\n },\n {\n \"value\":\"#CDCD00\",\n \"name\":\"yellow 3\"\n },\n {\n \"value\":\"#8B8B00\",\n \"name\":\"yellow 4\"\n },\n {\n \"value\":\"#808069\",\n \"name\":\"warmgrey\"\n },\n {\n \"value\":\"#808000\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"olive\"\n },\n {\n \"value\":\"#BDB76B\",\n \"css\":true,\n \"name\":\"darkkhaki\"\n },\n {\n \"value\":\"#FFF68F\",\n \"name\":\"khaki 1\"\n },\n {\n \"value\":\"#EEE685\",\n \"name\":\"khaki 2\"\n },\n {\n \"value\":\"#CDC673\",\n \"name\":\"khaki 3\"\n },\n {\n \"value\":\"#8B864E\",\n \"name\":\"khaki 4\"\n },\n {\n \"value\":\"#F0E68C\",\n \"css\":true,\n \"name\":\"khaki\"\n },\n {\n \"value\":\"#EEE8AA\",\n \"css\":true,\n \"name\":\"palegoldenrod\"\n },\n {\n \"value\":\"#FFFACD\",\n \"name\":\"lemonchiffon 1\"\n },\n {\n \"value\":\"#FFFACD\",\n \"css\":true,\n \"name\":\"lemonchiffon\"\n },\n {\n \"value\":\"#EEE9BF\",\n \"name\":\"lemonchiffon 2\"\n },\n {\n \"value\":\"#CDC9A5\",\n \"name\":\"lemonchiffon 3\"\n },\n {\n \"value\":\"#8B8970\",\n \"name\":\"lemonchiffon 4\"\n },\n {\n \"value\":\"#FFEC8B\",\n \"name\":\"lightgoldenrod 1\"\n },\n {\n \"value\":\"#EEDC82\",\n \"name\":\"lightgoldenrod 2\"\n },\n {\n \"value\":\"#CDBE70\",\n \"name\":\"lightgoldenrod 3\"\n },\n {\n \"value\":\"#8B814C\",\n \"name\":\"lightgoldenrod 4\"\n },\n {\n \"value\":\"#E3CF57\",\n \"name\":\"banana\"\n },\n {\n \"value\":\"#FFD700\",\n \"name\":\"gold 1\"\n },\n {\n \"value\":\"#FFD700\",\n \"css\":true,\n \"name\":\"gold\"\n },\n {\n \"value\":\"#EEC900\",\n \"name\":\"gold 2\"\n },\n {\n \"value\":\"#CDAD00\",\n \"name\":\"gold 3\"\n },\n {\n \"value\":\"#8B7500\",\n \"name\":\"gold 4\"\n },\n {\n \"value\":\"#FFF8DC\",\n \"name\":\"cornsilk 1\"\n },\n {\n \"value\":\"#FFF8DC\",\n \"css\":true,\n \"name\":\"cornsilk\"\n },\n {\n \"value\":\"#EEE8CD\",\n \"name\":\"cornsilk 2\"\n },\n {\n \"value\":\"#CDC8B1\",\n \"name\":\"cornsilk 3\"\n },\n {\n \"value\":\"#8B8878\",\n \"name\":\"cornsilk 4\"\n },\n {\n \"value\":\"#DAA520\",\n \"css\":true,\n \"name\":\"goldenrod\"\n },\n {\n \"value\":\"#FFC125\",\n \"name\":\"goldenrod 1\"\n },\n {\n \"value\":\"#EEB422\",\n \"name\":\"goldenrod 2\"\n },\n {\n \"value\":\"#CD9B1D\",\n \"name\":\"goldenrod 3\"\n },\n {\n \"value\":\"#8B6914\",\n \"name\":\"goldenrod 4\"\n },\n {\n \"value\":\"#B8860B\",\n \"css\":true,\n \"name\":\"darkgoldenrod\"\n },\n {\n \"value\":\"#FFB90F\",\n \"name\":\"darkgoldenrod 1\"\n },\n {\n \"value\":\"#EEAD0E\",\n \"name\":\"darkgoldenrod 2\"\n },\n {\n \"value\":\"#CD950C\",\n \"name\":\"darkgoldenrod 3\"\n },\n {\n \"value\":\"#8B6508\",\n \"name\":\"darkgoldenrod 4\"\n },\n {\n \"value\":\"#FFA500\",\n \"name\":\"orange 1\"\n },\n {\n \"value\":\"#FF8000\",\n \"css\":true,\n \"name\":\"orange\"\n },\n {\n \"value\":\"#EE9A00\",\n \"name\":\"orange 2\"\n },\n {\n \"value\":\"#CD8500\",\n \"name\":\"orange 3\"\n },\n {\n \"value\":\"#8B5A00\",\n \"name\":\"orange 4\"\n },\n {\n \"value\":\"#FFFAF0\",\n \"css\":true,\n \"name\":\"floralwhite\"\n },\n {\n \"value\":\"#FDF5E6\",\n \"css\":true,\n \"name\":\"oldlace\"\n },\n {\n \"value\":\"#F5DEB3\",\n \"css\":true,\n \"name\":\"wheat\"\n },\n {\n \"value\":\"#FFE7BA\",\n \"name\":\"wheat 1\"\n },\n {\n \"value\":\"#EED8AE\",\n \"name\":\"wheat 2\"\n },\n {\n \"value\":\"#CDBA96\",\n \"name\":\"wheat 3\"\n },\n {\n \"value\":\"#8B7E66\",\n \"name\":\"wheat 4\"\n },\n {\n \"value\":\"#FFE4B5\",\n \"css\":true,\n \"name\":\"moccasin\"\n },\n {\n \"value\":\"#FFEFD5\",\n \"css\":true,\n \"name\":\"papayawhip\"\n },\n {\n \"value\":\"#FFEBCD\",\n \"css\":true,\n \"name\":\"blanchedalmond\"\n },\n {\n \"value\":\"#FFDEAD\",\n \"name\":\"navajowhite 1\"\n },\n {\n \"value\":\"#FFDEAD\",\n \"css\":true,\n \"name\":\"navajowhite\"\n },\n {\n \"value\":\"#EECFA1\",\n \"name\":\"navajowhite 2\"\n },\n {\n \"value\":\"#CDB38B\",\n \"name\":\"navajowhite 3\"\n },\n {\n \"value\":\"#8B795E\",\n \"name\":\"navajowhite 4\"\n },\n {\n \"value\":\"#FCE6C9\",\n \"name\":\"eggshell\"\n },\n {\n \"value\":\"#D2B48C\",\n \"css\":true,\n \"name\":\"tan\"\n },\n {\n \"value\":\"#9C661F\",\n \"name\":\"brick\"\n },\n {\n \"value\":\"#FF9912\",\n \"name\":\"cadmiumyellow\"\n },\n {\n \"value\":\"#FAEBD7\",\n \"css\":true,\n \"name\":\"antiquewhite\"\n },\n {\n \"value\":\"#FFEFDB\",\n \"name\":\"antiquewhite 1\"\n },\n {\n \"value\":\"#EEDFCC\",\n \"name\":\"antiquewhite 2\"\n },\n {\n \"value\":\"#CDC0B0\",\n \"name\":\"antiquewhite 3\"\n },\n {\n \"value\":\"#8B8378\",\n \"name\":\"antiquewhite 4\"\n },\n {\n \"value\":\"#DEB887\",\n \"css\":true,\n \"name\":\"burlywood\"\n },\n {\n \"value\":\"#FFD39B\",\n \"name\":\"burlywood 1\"\n },\n {\n \"value\":\"#EEC591\",\n \"name\":\"burlywood 2\"\n },\n {\n \"value\":\"#CDAA7D\",\n \"name\":\"burlywood 3\"\n },\n {\n \"value\":\"#8B7355\",\n \"name\":\"burlywood 4\"\n },\n {\n \"value\":\"#FFE4C4\",\n \"name\":\"bisque 1\"\n },\n {\n \"value\":\"#FFE4C4\",\n \"css\":true,\n \"name\":\"bisque\"\n },\n {\n \"value\":\"#EED5B7\",\n \"name\":\"bisque 2\"\n },\n {\n \"value\":\"#CDB79E\",\n \"name\":\"bisque 3\"\n },\n {\n \"value\":\"#8B7D6B\",\n \"name\":\"bisque 4\"\n },\n {\n \"value\":\"#E3A869\",\n \"name\":\"melon\"\n },\n {\n \"value\":\"#ED9121\",\n \"name\":\"carrot\"\n },\n {\n \"value\":\"#FF8C00\",\n \"css\":true,\n \"name\":\"darkorange\"\n },\n {\n \"value\":\"#FF7F00\",\n \"name\":\"darkorange 1\"\n },\n {\n \"value\":\"#EE7600\",\n \"name\":\"darkorange 2\"\n },\n {\n \"value\":\"#CD6600\",\n \"name\":\"darkorange 3\"\n },\n {\n \"value\":\"#8B4500\",\n \"name\":\"darkorange 4\"\n },\n {\n \"value\":\"#FFA54F\",\n \"name\":\"tan 1\"\n },\n {\n \"value\":\"#EE9A49\",\n \"name\":\"tan 2\"\n },\n {\n \"value\":\"#CD853F\",\n \"name\":\"tan 3\"\n },\n {\n \"value\":\"#CD853F\",\n \"css\":true,\n \"name\":\"peru\"\n },\n {\n \"value\":\"#8B5A2B\",\n \"name\":\"tan 4\"\n },\n {\n \"value\":\"#FAF0E6\",\n \"css\":true,\n \"name\":\"linen\"\n },\n {\n \"value\":\"#FFDAB9\",\n \"name\":\"peachpuff 1\"\n },\n {\n \"value\":\"#FFDAB9\",\n \"css\":true,\n \"name\":\"peachpuff\"\n },\n {\n \"value\":\"#EECBAD\",\n \"name\":\"peachpuff 2\"\n },\n {\n \"value\":\"#CDAF95\",\n \"name\":\"peachpuff 3\"\n },\n {\n \"value\":\"#8B7765\",\n \"name\":\"peachpuff 4\"\n },\n {\n \"value\":\"#FFF5EE\",\n \"name\":\"seashell 1\"\n },\n {\n \"value\":\"#FFF5EE\",\n \"css\":true,\n \"name\":\"seashell\"\n },\n {\n \"value\":\"#EEE5DE\",\n \"name\":\"seashell 2\"\n },\n {\n \"value\":\"#CDC5BF\",\n \"name\":\"seashell 3\"\n },\n {\n \"value\":\"#8B8682\",\n \"name\":\"seashell 4\"\n },\n {\n \"value\":\"#F4A460\",\n \"css\":true,\n \"name\":\"sandybrown\"\n },\n {\n \"value\":\"#C76114\",\n \"name\":\"rawsienna\"\n },\n {\n \"value\":\"#D2691E\",\n \"css\":true,\n \"name\":\"chocolate\"\n },\n {\n \"value\":\"#FF7F24\",\n \"name\":\"chocolate 1\"\n },\n {\n \"value\":\"#EE7621\",\n \"name\":\"chocolate 2\"\n },\n {\n \"value\":\"#CD661D\",\n \"name\":\"chocolate 3\"\n },\n {\n \"value\":\"#8B4513\",\n \"name\":\"chocolate 4\"\n },\n {\n \"value\":\"#8B4513\",\n \"css\":true,\n \"name\":\"saddlebrown\"\n },\n {\n \"value\":\"#292421\",\n \"name\":\"ivoryblack\"\n },\n {\n \"value\":\"#FF7D40\",\n \"name\":\"flesh\"\n },\n {\n \"value\":\"#FF6103\",\n \"name\":\"cadmiumorange\"\n },\n {\n \"value\":\"#8A360F\",\n \"name\":\"burntsienna\"\n },\n {\n \"value\":\"#A0522D\",\n \"css\":true,\n \"name\":\"sienna\"\n },\n {\n \"value\":\"#FF8247\",\n \"name\":\"sienna 1\"\n },\n {\n \"value\":\"#EE7942\",\n \"name\":\"sienna 2\"\n },\n {\n \"value\":\"#CD6839\",\n \"name\":\"sienna 3\"\n },\n {\n \"value\":\"#8B4726\",\n \"name\":\"sienna 4\"\n },\n {\n \"value\":\"#FFA07A\",\n \"name\":\"lightsalmon 1\"\n },\n {\n \"value\":\"#FFA07A\",\n \"css\":true,\n \"name\":\"lightsalmon\"\n },\n {\n \"value\":\"#EE9572\",\n \"name\":\"lightsalmon 2\"\n },\n {\n \"value\":\"#CD8162\",\n \"name\":\"lightsalmon 3\"\n },\n {\n \"value\":\"#8B5742\",\n \"name\":\"lightsalmon 4\"\n },\n {\n \"value\":\"#FF7F50\",\n \"css\":true,\n \"name\":\"coral\"\n },\n {\n \"value\":\"#FF4500\",\n \"name\":\"orangered 1\"\n },\n {\n \"value\":\"#FF4500\",\n \"css\":true,\n \"name\":\"orangered\"\n },\n {\n \"value\":\"#EE4000\",\n \"name\":\"orangered 2\"\n },\n {\n \"value\":\"#CD3700\",\n \"name\":\"orangered 3\"\n },\n {\n \"value\":\"#8B2500\",\n \"name\":\"orangered 4\"\n },\n {\n \"value\":\"#5E2612\",\n \"name\":\"sepia\"\n },\n {\n \"value\":\"#E9967A\",\n \"css\":true,\n \"name\":\"darksalmon\"\n },\n {\n \"value\":\"#FF8C69\",\n \"name\":\"salmon 1\"\n },\n {\n \"value\":\"#EE8262\",\n \"name\":\"salmon 2\"\n },\n {\n \"value\":\"#CD7054\",\n \"name\":\"salmon 3\"\n },\n {\n \"value\":\"#8B4C39\",\n \"name\":\"salmon 4\"\n },\n {\n \"value\":\"#FF7256\",\n \"name\":\"coral 1\"\n },\n {\n \"value\":\"#EE6A50\",\n \"name\":\"coral 2\"\n },\n {\n \"value\":\"#CD5B45\",\n \"name\":\"coral 3\"\n },\n {\n \"value\":\"#8B3E2F\",\n \"name\":\"coral 4\"\n },\n {\n \"value\":\"#8A3324\",\n \"name\":\"burntumber\"\n },\n {\n \"value\":\"#FF6347\",\n \"name\":\"tomato 1\"\n },\n {\n \"value\":\"#FF6347\",\n \"css\":true,\n \"name\":\"tomato\"\n },\n {\n \"value\":\"#EE5C42\",\n \"name\":\"tomato 2\"\n },\n {\n \"value\":\"#CD4F39\",\n \"name\":\"tomato 3\"\n },\n {\n \"value\":\"#8B3626\",\n \"name\":\"tomato 4\"\n },\n {\n \"value\":\"#FA8072\",\n \"css\":true,\n \"name\":\"salmon\"\n },\n {\n \"value\":\"#FFE4E1\",\n \"name\":\"mistyrose 1\"\n },\n {\n \"value\":\"#FFE4E1\",\n \"css\":true,\n \"name\":\"mistyrose\"\n },\n {\n \"value\":\"#EED5D2\",\n \"name\":\"mistyrose 2\"\n },\n {\n \"value\":\"#CDB7B5\",\n \"name\":\"mistyrose 3\"\n },\n {\n \"value\":\"#8B7D7B\",\n \"name\":\"mistyrose 4\"\n },\n {\n \"value\":\"#FFFAFA\",\n \"name\":\"snow 1\"\n },\n {\n \"value\":\"#FFFAFA\",\n \"css\":true,\n \"name\":\"snow\"\n },\n {\n \"value\":\"#EEE9E9\",\n \"name\":\"snow 2\"\n },\n {\n \"value\":\"#CDC9C9\",\n \"name\":\"snow 3\"\n },\n {\n \"value\":\"#8B8989\",\n \"name\":\"snow 4\"\n },\n {\n \"value\":\"#BC8F8F\",\n \"css\":true,\n \"name\":\"rosybrown\"\n },\n {\n \"value\":\"#FFC1C1\",\n \"name\":\"rosybrown 1\"\n },\n {\n \"value\":\"#EEB4B4\",\n \"name\":\"rosybrown 2\"\n },\n {\n \"value\":\"#CD9B9B\",\n \"name\":\"rosybrown 3\"\n },\n {\n \"value\":\"#8B6969\",\n \"name\":\"rosybrown 4\"\n },\n {\n \"value\":\"#F08080\",\n \"css\":true,\n \"name\":\"lightcoral\"\n },\n {\n \"value\":\"#CD5C5C\",\n \"css\":true,\n \"name\":\"indianred\"\n },\n {\n \"value\":\"#FF6A6A\",\n \"name\":\"indianred 1\"\n },\n {\n \"value\":\"#EE6363\",\n \"name\":\"indianred 2\"\n },\n {\n \"value\":\"#8B3A3A\",\n \"name\":\"indianred 4\"\n },\n {\n \"value\":\"#CD5555\",\n \"name\":\"indianred 3\"\n },\n {\n \"value\":\"#A52A2A\",\n \"css\":true,\n \"name\":\"brown\"\n },\n {\n \"value\":\"#FF4040\",\n \"name\":\"brown 1\"\n },\n {\n \"value\":\"#EE3B3B\",\n \"name\":\"brown 2\"\n },\n {\n \"value\":\"#CD3333\",\n \"name\":\"brown 3\"\n },\n {\n \"value\":\"#8B2323\",\n \"name\":\"brown 4\"\n },\n {\n \"value\":\"#B22222\",\n \"css\":true,\n \"name\":\"firebrick\"\n },\n {\n \"value\":\"#FF3030\",\n \"name\":\"firebrick 1\"\n },\n {\n \"value\":\"#EE2C2C\",\n \"name\":\"firebrick 2\"\n },\n {\n \"value\":\"#CD2626\",\n \"name\":\"firebrick 3\"\n },\n {\n \"value\":\"#8B1A1A\",\n \"name\":\"firebrick 4\"\n },\n {\n \"value\":\"#FF0000\",\n \"vga\":true,\n \"name\":\"red 1\"\n },\n {\n \"value\":\"#FF0000\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"red\"\n },\n {\n \"value\":\"#EE0000\",\n \"name\":\"red 2\"\n },\n {\n \"value\":\"#CD0000\",\n \"name\":\"red 3\"\n },\n {\n \"value\":\"#8B0000\",\n \"name\":\"red 4\"\n },\n {\n \"value\":\"#8B0000\",\n \"css\":true,\n \"name\":\"darkred\"\n },\n {\n \"value\":\"#800000\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"maroon\"\n },\n {\n \"value\":\"#8E388E\",\n \"name\":\"sgi beet\"\n },\n {\n \"value\":\"#7171C6\",\n \"name\":\"sgi slateblue\"\n },\n {\n \"value\":\"#7D9EC0\",\n \"name\":\"sgi lightblue\"\n },\n {\n \"value\":\"#388E8E\",\n \"name\":\"sgi teal\"\n },\n {\n \"value\":\"#71C671\",\n \"name\":\"sgi chartreuse\"\n },\n {\n \"value\":\"#8E8E38\",\n \"name\":\"sgi olivedrab\"\n },\n {\n \"value\":\"#C5C1AA\",\n \"name\":\"sgi brightgray\"\n },\n {\n \"value\":\"#C67171\",\n \"name\":\"sgi salmon\"\n },\n {\n \"value\":\"#555555\",\n \"name\":\"sgi darkgray\"\n },\n {\n \"value\":\"#1E1E1E\",\n \"name\":\"sgi gray 12\"\n },\n {\n \"value\":\"#282828\",\n \"name\":\"sgi gray 16\"\n },\n {\n \"value\":\"#515151\",\n \"name\":\"sgi gray 32\"\n },\n {\n \"value\":\"#5B5B5B\",\n \"name\":\"sgi gray 36\"\n },\n {\n \"value\":\"#848484\",\n \"name\":\"sgi gray 52\"\n },\n {\n \"value\":\"#8E8E8E\",\n \"name\":\"sgi gray 56\"\n },\n {\n \"value\":\"#AAAAAA\",\n \"name\":\"sgi lightgray\"\n },\n {\n \"value\":\"#B7B7B7\",\n \"name\":\"sgi gray 72\"\n },\n {\n \"value\":\"#C1C1C1\",\n \"name\":\"sgi gray 76\"\n },\n {\n \"value\":\"#EAEAEA\",\n \"name\":\"sgi gray 92\"\n },\n {\n \"value\":\"#F4F4F4\",\n \"name\":\"sgi gray 96\"\n },\n {\n \"value\":\"#FFFFFF\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"white\"\n },\n {\n \"value\":\"#F5F5F5\",\n \"name\":\"white smoke\"\n },\n {\n \"value\":\"#F5F5F5\",\n \"name\":\"gray 96\"\n },\n {\n \"value\":\"#DCDCDC\",\n \"css\":true,\n \"name\":\"gainsboro\"\n },\n {\n \"value\":\"#D3D3D3\",\n \"css\":true,\n \"name\":\"lightgrey\"\n },\n {\n \"value\":\"#C0C0C0\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"silver\"\n },\n {\n \"value\":\"#A9A9A9\",\n \"css\":true,\n \"name\":\"darkgray\"\n },\n {\n \"value\":\"#808080\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"gray\"\n },\n {\n \"value\":\"#696969\",\n \"css\":true,\n \"name\":\"dimgray\"\n },\n {\n \"value\":\"#696969\",\n \"name\":\"gray 42\"\n },\n {\n \"value\":\"#000000\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"black\"\n },\n {\n \"value\":\"#FCFCFC\",\n \"name\":\"gray 99\"\n },\n {\n \"value\":\"#FAFAFA\",\n \"name\":\"gray 98\"\n },\n {\n \"value\":\"#F7F7F7\",\n \"name\":\"gray 97\"\n },\n {\n \"value\":\"#F2F2F2\",\n \"name\":\"gray 95\"\n },\n {\n \"value\":\"#F0F0F0\",\n \"name\":\"gray 94\"\n },\n {\n \"value\":\"#EDEDED\",\n \"name\":\"gray 93\"\n },\n {\n \"value\":\"#EBEBEB\",\n \"name\":\"gray 92\"\n },\n {\n \"value\":\"#E8E8E8\",\n \"name\":\"gray 91\"\n },\n {\n \"value\":\"#E5E5E5\",\n \"name\":\"gray 90\"\n },\n {\n \"value\":\"#E3E3E3\",\n \"name\":\"gray 89\"\n },\n {\n \"value\":\"#E0E0E0\",\n \"name\":\"gray 88\"\n },\n {\n \"value\":\"#DEDEDE\",\n \"name\":\"gray 87\"\n },\n {\n \"value\":\"#DBDBDB\",\n \"name\":\"gray 86\"\n },\n {\n \"value\":\"#D9D9D9\",\n \"name\":\"gray 85\"\n },\n {\n \"value\":\"#D6D6D6\",\n \"name\":\"gray 84\"\n },\n {\n \"value\":\"#D4D4D4\",\n \"name\":\"gray 83\"\n },\n {\n \"value\":\"#D1D1D1\",\n \"name\":\"gray 82\"\n },\n {\n \"value\":\"#CFCFCF\",\n \"name\":\"gray 81\"\n },\n {\n \"value\":\"#CCCCCC\",\n \"name\":\"gray 80\"\n },\n {\n \"value\":\"#C9C9C9\",\n \"name\":\"gray 79\"\n },\n {\n \"value\":\"#C7C7C7\",\n \"name\":\"gray 78\"\n },\n {\n \"value\":\"#C4C4C4\",\n \"name\":\"gray 77\"\n },\n {\n \"value\":\"#C2C2C2\",\n \"name\":\"gray 76\"\n },\n {\n \"value\":\"#BFBFBF\",\n \"name\":\"gray 75\"\n },\n {\n \"value\":\"#BDBDBD\",\n \"name\":\"gray 74\"\n },\n {\n \"value\":\"#BABABA\",\n \"name\":\"gray 73\"\n },\n {\n \"value\":\"#B8B8B8\",\n \"name\":\"gray 72\"\n },\n {\n \"value\":\"#B5B5B5\",\n \"name\":\"gray 71\"\n },\n {\n \"value\":\"#B3B3B3\",\n \"name\":\"gray 70\"\n },\n {\n \"value\":\"#B0B0B0\",\n \"name\":\"gray 69\"\n },\n {\n \"value\":\"#ADADAD\",\n \"name\":\"gray 68\"\n },\n {\n \"value\":\"#ABABAB\",\n \"name\":\"gray 67\"\n },\n {\n \"value\":\"#A8A8A8\",\n \"name\":\"gray 66\"\n },\n {\n \"value\":\"#A6A6A6\",\n \"name\":\"gray 65\"\n },\n {\n \"value\":\"#A3A3A3\",\n \"name\":\"gray 64\"\n },\n {\n \"value\":\"#A1A1A1\",\n \"name\":\"gray 63\"\n },\n {\n \"value\":\"#9E9E9E\",\n \"name\":\"gray 62\"\n },\n {\n \"value\":\"#9C9C9C\",\n \"name\":\"gray 61\"\n },\n {\n \"value\":\"#999999\",\n \"name\":\"gray 60\"\n },\n {\n \"value\":\"#969696\",\n \"name\":\"gray 59\"\n },\n {\n \"value\":\"#949494\",\n \"name\":\"gray 58\"\n },\n {\n \"value\":\"#919191\",\n \"name\":\"gray 57\"\n },\n {\n \"value\":\"#8F8F8F\",\n \"name\":\"gray 56\"\n },\n {\n \"value\":\"#8C8C8C\",\n \"name\":\"gray 55\"\n },\n {\n \"value\":\"#8A8A8A\",\n \"name\":\"gray 54\"\n },\n {\n \"value\":\"#878787\",\n \"name\":\"gray 53\"\n },\n {\n \"value\":\"#858585\",\n \"name\":\"gray 52\"\n },\n {\n \"value\":\"#828282\",\n \"name\":\"gray 51\"\n },\n {\n \"value\":\"#7F7F7F\",\n \"name\":\"gray 50\"\n },\n {\n \"value\":\"#7D7D7D\",\n \"name\":\"gray 49\"\n },\n {\n \"value\":\"#7A7A7A\",\n \"name\":\"gray 48\"\n },\n {\n \"value\":\"#787878\",\n \"name\":\"gray 47\"\n },\n {\n \"value\":\"#757575\",\n \"name\":\"gray 46\"\n },\n {\n \"value\":\"#737373\",\n \"name\":\"gray 45\"\n },\n {\n \"value\":\"#707070\",\n \"name\":\"gray 44\"\n },\n {\n \"value\":\"#6E6E6E\",\n \"name\":\"gray 43\"\n },\n {\n \"value\":\"#666666\",\n \"name\":\"gray 40\"\n },\n {\n \"value\":\"#636363\",\n \"name\":\"gray 39\"\n },\n {\n \"value\":\"#616161\",\n \"name\":\"gray 38\"\n },\n {\n \"value\":\"#5E5E5E\",\n \"name\":\"gray 37\"\n },\n {\n \"value\":\"#5C5C5C\",\n \"name\":\"gray 36\"\n },\n {\n \"value\":\"#595959\",\n \"name\":\"gray 35\"\n },\n {\n \"value\":\"#575757\",\n \"name\":\"gray 34\"\n },\n {\n \"value\":\"#545454\",\n \"name\":\"gray 33\"\n },\n {\n \"value\":\"#525252\",\n \"name\":\"gray 32\"\n },\n {\n \"value\":\"#4F4F4F\",\n \"name\":\"gray 31\"\n },\n {\n \"value\":\"#4D4D4D\",\n \"name\":\"gray 30\"\n },\n {\n \"value\":\"#4A4A4A\",\n \"name\":\"gray 29\"\n },\n {\n \"value\":\"#474747\",\n \"name\":\"gray 28\"\n },\n {\n \"value\":\"#454545\",\n \"name\":\"gray 27\"\n },\n {\n \"value\":\"#424242\",\n \"name\":\"gray 26\"\n },\n {\n \"value\":\"#404040\",\n \"name\":\"gray 25\"\n },\n {\n \"value\":\"#3D3D3D\",\n \"name\":\"gray 24\"\n },\n {\n \"value\":\"#3B3B3B\",\n \"name\":\"gray 23\"\n },\n {\n \"value\":\"#383838\",\n \"name\":\"gray 22\"\n },\n {\n \"value\":\"#363636\",\n \"name\":\"gray 21\"\n },\n {\n \"value\":\"#333333\",\n \"name\":\"gray 20\"\n },\n {\n \"value\":\"#303030\",\n \"name\":\"gray 19\"\n },\n {\n \"value\":\"#2E2E2E\",\n \"name\":\"gray 18\"\n },\n {\n \"value\":\"#2B2B2B\",\n \"name\":\"gray 17\"\n },\n {\n \"value\":\"#292929\",\n \"name\":\"gray 16\"\n },\n {\n \"value\":\"#262626\",\n \"name\":\"gray 15\"\n },\n {\n \"value\":\"#242424\",\n \"name\":\"gray 14\"\n },\n {\n \"value\":\"#212121\",\n \"name\":\"gray 13\"\n },\n {\n \"value\":\"#1F1F1F\",\n \"name\":\"gray 12\"\n },\n {\n \"value\":\"#1C1C1C\",\n \"name\":\"gray 11\"\n },\n {\n \"value\":\"#1A1A1A\",\n \"name\":\"gray 10\"\n },\n {\n \"value\":\"#171717\",\n \"name\":\"gray 9\"\n },\n {\n \"value\":\"#141414\",\n \"name\":\"gray 8\"\n },\n {\n \"value\":\"#121212\",\n \"name\":\"gray 7\"\n },\n {\n \"value\":\"#0F0F0F\",\n \"name\":\"gray 6\"\n },\n {\n \"value\":\"#0D0D0D\",\n \"name\":\"gray 5\"\n },\n {\n \"value\":\"#0A0A0A\",\n \"name\":\"gray 4\"\n },\n {\n \"value\":\"#080808\",\n \"name\":\"gray 3\"\n },\n {\n \"value\":\"#050505\",\n \"name\":\"gray 2\"\n },\n {\n \"value\":\"#030303\",\n \"name\":\"gray 1\"\n },\n {\n \"value\":\"#F5F5F5\",\n \"css\":true,\n \"name\":\"whitesmoke\"\n }\n]\n","/**\n * Module dependencies\n */\nvar colors = require('./colors')\n\nvar cssColors = colors.filter(function(color){\n return !! color.css\n})\n\nvar vgaColors = colors.filter(function(color){\n return !! color.vga\n})\n\n\n/**\n * Get color value for a certain name.\n * @param name {String}\n * @return {String} Hex color value\n * @api public\n */\n\nmodule.exports = function(name) {\n var color = module.exports.get(name)\n return color && color.value\n}\n\n/**\n * Get color object.\n *\n * @param name {String}\n * @return {Object} Color object\n * @api public\n */\n\nmodule.exports.get = function(name) {\n name = name || ''\n name = name.trim().toLowerCase()\n return colors.filter(function(color){\n return color.name.toLowerCase() === name\n }).pop()\n}\n\n/**\n * Get all color object.\n *\n * @return {Array}\n * @api public\n */\n\nmodule.exports.all = module.exports.get.all = function() {\n return colors\n}\n\n/**\n * Get color object compatible with CSS.\n *\n * @return {Array}\n * @api public\n */\n\nmodule.exports.get.css = function(name) {\n if (!name) return cssColors\n name = name || ''\n name = name.trim().toLowerCase()\n return cssColors.filter(function(color){\n return color.name.toLowerCase() === name\n }).pop()\n}\n\n\n\nmodule.exports.get.vga = function(name) {\n if (!name) return vgaColors\n name = name || ''\n name = name.trim().toLowerCase()\n return vgaColors.filter(function(color){\n return color.name.toLowerCase() === name\n }).pop()\n}\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match words composed of alphanumeric characters. */\nvar reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20f0',\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\",\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar rsLowerMisc = '(?:' + rsLower + '|' + rsMisc + ')',\n rsUpperMisc = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptLowerContr = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptUpperContr = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq;\n\n/** Used to match complex or compound words. */\nvar reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptLowerContr + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsUpperMisc + '+' + rsOptUpperContr + '(?=' + [rsBreak, rsUpper + rsLowerMisc, '$'].join('|') + ')',\n rsUpper + '?' + rsLowerMisc + '+' + rsOptLowerContr,\n rsUpper + '+' + rsOptUpperContr,\n rsDigits,\n rsEmoji\n].join('|'), 'g');\n\n/** Used to detect strings that need a more robust regexp to match words. */\nvar reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction asciiWords(string) {\n return string.match(reAsciiWord) || [];\n}\n\n/**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\nfunction hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n}\n\n/**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\nfunction words(string, pattern, guard) {\n string = toString(string);\n pattern = guard ? undefined : pattern;\n\n if (pattern === undefined) {\n return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n }\n return string.match(pattern) || [];\n}\n\nmodule.exports = words;\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20f0',\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\n/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n if (value !== value) {\n return baseFindIndex(array, baseIsNaN, fromIndex);\n }\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\n/**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */\nfunction charsStartIndex(strSymbols, chrSymbols) {\n var index = -1,\n length = strSymbols.length;\n\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n}\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Removes leading whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimStart(' abc ');\n * // => 'abc '\n *\n * _.trimStart('-_-abc-_-', '_-');\n * // => 'abc-_-'\n */\nfunction trimStart(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return string.replace(reTrimStart, '');\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n start = charsStartIndex(strSymbols, stringToArray(chars));\n\n return castSlice(strSymbols, start).join('');\n}\n\nmodule.exports = trimStart;\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20f0',\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nvar asciiSize = baseProperty('length');\n\n/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\n/**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\nfunction stringSize(string) {\n return hasUnicode(string)\n ? unicodeSize(string)\n : asciiSize(string);\n}\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\n/**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nfunction unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n result++;\n }\n return result;\n}\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n nativeFloor = Math.floor;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.repeat` which doesn't coerce arguments.\n *\n * @private\n * @param {string} string The string to repeat.\n * @param {number} n The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n */\nfunction baseRepeat(string, n) {\n var result = '';\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n return result;\n }\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n do {\n if (n % 2) {\n result += string;\n }\n n = nativeFloor(n / 2);\n if (n) {\n string += string;\n }\n } while (n);\n\n return result;\n}\n\n/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\n/**\n * Creates the padding for `string` based on `length`. The `chars` string\n * is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {number} length The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padding for `string`.\n */\nfunction createPadding(length, chars) {\n chars = chars === undefined ? ' ' : baseToString(chars);\n\n var charsLength = chars.length;\n if (charsLength < 2) {\n return charsLength ? baseRepeat(chars, length) : chars;\n }\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n return hasUnicode(chars)\n ? castSlice(stringToArray(result), 0, length).join('')\n : result.slice(0, length);\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padEnd('abc', 6);\n * // => 'abc '\n *\n * _.padEnd('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padEnd('abc', 3);\n * // => 'abc'\n */\nfunction padEnd(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (string + createPadding(length - strLength, chars))\n : string;\n}\n\nmodule.exports = padEnd;\n","'use strict';\n/* eslint-disable no-mixed-operators */\nmodule.exports = (red, green, blue, alpha) => {\n\tconst isPercent = (red + (alpha || '')).toString().includes('%');\n\n\tif (typeof red === 'string') {\n\t\t[red, green, blue, alpha] = red.match(/(0?\\.?\\d{1,3})%?\\b/g).map(Number);\n\t} else if (alpha !== undefined) {\n\t\talpha = parseFloat(alpha);\n\t}\n\n\tif (typeof red !== 'number' ||\n\t\ttypeof green !== 'number' ||\n\t\ttypeof blue !== 'number' ||\n\t\tred > 255 ||\n\t\tgreen > 255 ||\n\t\tblue > 255\n\t) {\n\t\tthrow new TypeError('Expected three numbers below 256');\n\t}\n\n\tif (typeof alpha === 'number') {\n\t\tif (!isPercent && alpha >= 0 && alpha <= 1) {\n\t\t\talpha = Math.round(255 * alpha);\n\t\t} else if (isPercent && alpha >= 0 && alpha <= 100) {\n\t\t\talpha = Math.round(255 * alpha / 100);\n\t\t} else {\n\t\t\tthrow new TypeError(`Expected alpha value (${alpha}) as a fraction or percentage`);\n\t\t}\n\n\t\talpha = (alpha | 1 << 8).toString(16).slice(1);\n\t} else {\n\t\talpha = '';\n\t}\n\n\treturn ((blue | green << 8 | red << 16) | 1 << 24).toString(16).slice(1) + alpha;\n};\n/* eslint-enable no-mixed-operators */\n","'use strict';\n\nconst hexCharacters = 'a-f\\\\d';\nconst match3or4Hex = `#?[${hexCharacters}]{3}[${hexCharacters}]?`;\nconst match6or8Hex = `#?[${hexCharacters}]{6}([${hexCharacters}]{2})?`;\nconst nonHexChars = new RegExp(`[^#${hexCharacters}]`, 'gi');\nconst validHexSize = new RegExp(`^${match3or4Hex}$|^${match6or8Hex}$`, 'i');\n\nmodule.exports = (hex, options = {}) => {\n\tif (typeof hex !== 'string' || nonHexChars.test(hex) || !validHexSize.test(hex)) {\n\t\tthrow new TypeError('Expected a valid hex string');\n\t}\n\n\thex = hex.replace(/^#/, '');\n\tlet alphaFromHex = 1;\n\n\tif (hex.length === 8) {\n\t\talphaFromHex = Number.parseInt(hex.slice(6, 8), 16) / 255;\n\t\thex = hex.slice(0, 6);\n\t}\n\n\tif (hex.length === 4) {\n\t\talphaFromHex = Number.parseInt(hex.slice(3, 4).repeat(2), 16) / 255;\n\t\thex = hex.slice(0, 3);\n\t}\n\n\tif (hex.length === 3) {\n\t\thex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n\t}\n\n\tconst number = Number.parseInt(hex, 16);\n\tconst red = number >> 16;\n\tconst green = (number >> 8) & 255;\n\tconst blue = number & 255;\n\tconst alpha = typeof options.alpha === 'number' ? options.alpha : alphaFromHex;\n\n\tif (options.format === 'array') {\n\t\treturn [red, green, blue, alpha];\n\t}\n\n\tif (options.format === 'css') {\n\t\tconst alphaString = alpha === 1 ? '' : ` / ${Number((alpha * 100).toFixed(2))}%`;\n\t\treturn `rgb(${red} ${green} ${blue}${alphaString})`;\n\t}\n\n\treturn {red, green, blue, alpha};\n};\n","var toHex = require('colornames');\nvar _words = require('lodash.words');\nvar trimStart = require('lodash.trimstart');\nvar padEnd = require('lodash.padend');\nvar rgbHex = require('rgb-hex');\nvar hexRgb = require('hex-rgb');\n\nconst MIXED_WEIGHT = 0.75;\nconst TEXT_WEIGHT = 0.25;\nconst SEED = 16777215;\nconst FACTOR = 49979693;\n\nmodule.exports = function(object) {\n return '#' + generateColor(String(JSON.stringify(object)));\n};\n\nfunction getColors(text) {\n var words = _words(text);\n var colors = [];\n words.forEach(function(word) {\n var color = toHex(word);\n if (color) colors.push(hexRgb(trimStart(color, '#'), {format: 'array'}));\n });\n return colors;\n}\n\nfunction mixColors(colors) {\n var mixed = [0, 0, 0];\n colors.forEach(function(value) {\n for (var i = 0; i < 3; i++) mixed[i] += value[i];\n });\n return [mixed[0] / colors.length, mixed[1] / colors.length, mixed[2] / colors.length];\n}\n\nfunction generateColor(text) {\n var mixed;\n var colors = getColors(text);\n if (colors.length > 0) mixed = mixColors(colors);\n var b = 1;\n var d = 0;\n var f = 1;\n if (text.length > 0) {\n for (var i = 0; i < text.length; i++)\n text[i].charCodeAt(0) > d && (d = text[i].charCodeAt(0)),\n (f = parseInt(SEED / d)),\n (b = (b + text[i].charCodeAt(0) * f * FACTOR) % SEED);\n }\n var hex = ((b * text.length) % SEED).toString(16);\n hex = padEnd(hex, 6, hex);\n var rgb = hexRgb(hex, {format: 'array'});\n if (mixed)\n return rgbHex(\n TEXT_WEIGHT * rgb[0] + MIXED_WEIGHT * mixed[0],\n TEXT_WEIGHT * rgb[1] + MIXED_WEIGHT * mixed[1],\n TEXT_WEIGHT * rgb[2] + MIXED_WEIGHT * mixed[2]\n );\n return hex;\n}\n","/*!\nfflate - fast JavaScript compression/decompression\n\nLicensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE\nversion 0.6.9\n*/\n\n// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar durl = function (c) { return URL.createObjectURL(new Blob([c], { type: 'text/javascript' })); };\nvar cwk = function (u) { return new Worker(u); };\ntry {\n URL.revokeObjectURL(durl(''));\n}\ncatch (e) {\n // We're in Deno or a very old browser\n durl = function (c) { return 'data:application/javascript;charset=UTF-8,' + encodeURI(c); };\n // If Deno, this is necessary; if not, this changes nothing\n cwk = function (u) { return new Worker(u, { type: 'module' }); };\n}\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = cwk(ch2[id] || (ch2[id] = durl(c)));\n w.onerror = function (e) { return cb(e.error, null); };\n w.onmessage = function (e) { return cb(null, e.data); };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\n// see fleb note\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new u32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return [b, r];\n};\nvar _a = freb(fleb, 2), fl = _a[0], revfl = _a[1];\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i)\n ++l[cd[i] - 1];\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 0; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >>> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >>> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p / 8) | 0) + (p & 7 && 1); };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n var n = new (v instanceof u16 ? u16 : v instanceof u32 ? u32 : u8)(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, buf, st) {\n // source length\n var sl = dat.length;\n if (!sl || (st && !st.l && sl < 5))\n return buf || new u8(0);\n // have to estimate size\n var noBuf = !buf || st;\n // no state\n var noSt = !st || st.i;\n if (!st)\n st = {};\n // Assumes roughly 33% compression ratio average\n if (!buf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n st.f = final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n // ensure size\n if (noBuf)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >>> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n throw 'invalid block type';\n if (pos > tbts) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17;\n if (noBuf)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >>> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n if (!c)\n throw 'invalid length/literal';\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;\n if (!d)\n throw 'invalid distance';\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & ((1 << b) - 1), pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n if (noBuf)\n cbuf(bt + 131072);\n var end = bt + add;\n for (; bt < end; bt += 4) {\n buf[bt] = buf[bt - dt];\n buf[bt + 1] = buf[bt + 1 - dt];\n buf[bt + 2] = buf[bt + 2 - dt];\n buf[bt + 3] = buf[bt + 3 - dt];\n }\n bt = end;\n }\n }\n st.l = lm, st.p = lpos, st.b = bt;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n return bt == buf.length ? buf : slc(buf, 0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n d[o + 2] |= v >>> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return [et, 0];\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return [v, 1];\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return [new u8(tr), mbt];\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return [cl.subarray(0, cli), s];\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >>> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a[0], mlb = _a[1];\n var _b = hTree(df, 15), ddt = _b[0], mdb = _b[1];\n var _c = lc(dlt), lclt = _c[0], nlc = _c[1];\n var _d = lc(ddt), lcdt = _d[0], ndc = _d[1];\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n lcfreq[lclt[i] & 31]++;\n for (var i = 0; i < lcdt.length; ++i)\n lcfreq[lcdt[i] & 31]++;\n var _e = hTree(lcfreq, 7), lct = _e[0], mlcb = _e[1];\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + (2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]);\n if (flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >>> 5) & 127), p += clct[i] >>> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n if (syms[i] > 255) {\n var len = (syms[i] >>> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (syms[i] >>> 23) & 31), p += fleb[len];\n var dst = syms[i] & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (syms[i] >>> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[syms[i]]), p += ll[syms[i]];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, lst) {\n var s = dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var pos = 0;\n if (!lvl || s < 8) {\n for (var i = 0; i <= s; i += 65535) {\n // end\n var e = i + 65535;\n if (e < s) {\n // write full block\n pos = wfblk(w, pos, dat.subarray(i, e));\n }\n else {\n // write final block\n w[i] = lst;\n pos = wfblk(w, pos, dat.subarray(i, s));\n }\n }\n }\n else {\n var opt = deo[lvl - 1];\n var n = opt >>> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = new u16(32768), head = new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new u32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx bitpos\n var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n for (; i < s; ++i) {\n // hash value\n // deopt when i > s - 3 - at end, deopt acceptable\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && rem > 423) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = (imod - pimod) & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = (i - dif + j + 32768) & 32767;\n var pti = prev[ti];\n var cd = (ti - pti + 32768) & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += (imod - pimod + 32768) & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one Uint32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n // this is the easiest way to avoid needing to maintain state\n if (!lst && pos & 7)\n pos = wfblk(w, pos + 1, et);\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new u32(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && 0xEDB88320) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Alder32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a >>> 8) << 16 | (b & 255) << 8 | (b >>> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : (12 + opt.mem), pre, post, !st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/ /g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return [fnStr, td];\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k] instanceof u8 || v[k] instanceof u16 || v[k] instanceof u32)\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n var _a;\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n _a = wcln(fns[i], fnStr, td_1), fnStr = _a[0], td_1 = _a[1];\n ch[id] = wcln(fns[m], fnStr, td_1);\n }\n var td = mrg({}, ch[id][1]);\n return wk(ch[id][0] + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, u32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, hMap, max, bits, bits16, shft, slc, inflt, inflateSync, pbf, gu8]; };\nvar bDflt = function () { return [u8, u16, u32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zlv]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get u8\nvar gu8 = function (o) { return o && o.size && new u8(o.size); };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) { return strm.push(ev.data[0], ev.data[1]); };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.push = function (d, f) {\n if (t)\n throw 'stream finished';\n if (!strm.ondata)\n throw 'no stream handler';\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n throw 'invalid gzip data';\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += d[10] | (d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return ((d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16) | (d[l - 1] << 24)) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + ((o.filename && (o.filename.length + 1)) || 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (fl ? (32 - 2 * fl) : 1);\n};\n// zlib valid\nvar zlv = function (d) {\n if ((d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n throw 'invalid zlib data';\n if (d[1] & 32)\n throw 'invalid zlib data: preset dictionaries not supported';\n};\nfunction AsyncCmpStrm(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n// zlib footer: -4 to -0 is Adler32\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, !f), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n this.d = final;\n this.p(chunk, final || false);\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n /**\n * Creates an inflation stream\n * @param cb The callback to call whenever data is inflated\n */\n function Inflate(cb) {\n this.s = {};\n this.p = new u8(0);\n this.ondata = cb;\n }\n Inflate.prototype.e = function (c) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n var l = this.p.length;\n var n = new u8(l + c.length);\n n.set(this.p), n.set(c, l), this.p = n;\n };\n Inflate.prototype.c = function (final) {\n this.d = this.s.i = final || false;\n var bts = this.s.b;\n var dt = inflt(this.p, this.o, this.s);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous inflation stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncInflate(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, 0, function () {\n var strm = new Inflate();\n onmessage = astrm(strm);\n }, 7);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gu8(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, out) {\n return inflt(data, out);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n this.c.p(c);\n this.l += c.length;\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, !f);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n /**\n * Creates a GUNZIP stream\n * @param cb The callback to call whenever data is inflated\n */\n function Gunzip(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n var s = this.p.length > 3 ? gzs(this.p) : 4;\n if (s >= this.p.length && !final)\n return;\n this.p = this.p.subarray(s), this.v = 0;\n }\n if (final) {\n if (this.p.length < 8)\n throw 'invalid gzip stream';\n this.p = this.p.subarray(0, -8);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous GUNZIP stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncGunzip(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, 0, function () {\n var strm = new Gunzip();\n onmessage = astrm(strm);\n }, 9);\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param out Where to write the data. GZIP already encodes the output size, so providing this doesn't save memory.\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, out) {\n return inflt(data.subarray(gzs(data), -8), out || new u8(gzl(data)));\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n this.c.p(c);\n var raw = dopt(c, this.o, this.v && 2, f && 4, !f);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n /**\n * Creates a Zlib decompression stream\n * @param cb The callback to call whenever data is inflated\n */\n function Unzlib(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 2 && !final)\n return;\n this.p = this.p.subarray(2), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n throw 'invalid zlib stream';\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous Zlib decompression stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncUnzlib(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, 0, function () {\n var strm = new Unzlib();\n onmessage = astrm(strm);\n }, 11);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gu8(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, out) {\n return inflt((zlv(data), data.subarray(2, -4)), out);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function Decompress(cb) {\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no stream handler';\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n var _this_1 = this;\n var cb = function () { _this_1.ondata.apply(_this_1, arguments); };\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(cb)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(cb)\n : new this.Z(cb);\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function AsyncDecompress(cb) {\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, out) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, out)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, out)\n : unzlibSync(data, out);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k;\n if (val instanceof u8)\n t[n] = [val, o];\n else if (Array.isArray(val))\n t[n] = [val[0], mrg(o, val[1])];\n else\n fltn(val, n + '/', t, o);\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return [r, slc(d, i - 1)];\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no callback';\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n throw 'invalid utf-8 data';\n this.t = null;\n }\n return;\n }\n if (!this.p)\n throw 'stream finished';\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), ch = _a[0], np = _a[1];\n if (final) {\n if (np.length)\n throw 'invalid utf-8 data';\n this.p = null;\n }\n else\n this.p = np;\n this.ondata(ch, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no callback';\n if (this.d)\n throw 'stream finished';\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td)\n return td.decode(dat);\n else {\n var _a = dutf8(dat), out = _a[0], ext = _a[1];\n if (ext.length)\n throw 'invalid utf-8 data';\n return out;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n throw 'extra field too long';\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c == null && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n throw 'date not in range 1980-2099';\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >>> 1)), b += 4;\n if (c != null) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no callback - add to ZIP archive before pushing';\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this_1 = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this_1 = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this_1.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this_1 = this;\n if (this.d & 2)\n throw 'stream finished';\n var f = strToU8(file.filename), fl = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl != file.filename.length || (o && (com.length != o.length));\n var hl = fl + exfl(file.extra) + 30;\n if (fl > 65535)\n throw 'filename too long';\n var header = new u8(hl);\n wzh(header, 0, file, f, u);\n var chks = [header];\n var pAll = function () {\n for (var _i = 0, chks_1 = chks; _i < chks_1.length; _i++) {\n var chk = chks_1[_i];\n _this_1.ondata(null, chk, false);\n }\n chks = [];\n };\n var tr = this.d;\n this.d = 0;\n var ind = this.u.length;\n var uf = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll();\n if (tr) {\n var nxt = _this_1.u[ind + 1];\n if (nxt)\n nxt.r();\n else\n _this_1.d = 1;\n }\n tr = 1;\n }\n });\n var cl = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this_1.ondata(err, dat, final);\n _this_1.terminate();\n }\n else {\n cl += dat.length;\n chks.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl);\n wbytes(dd, 12, file.size);\n chks.push(dd);\n uf.c = cl, uf.b = hl + cl + 16, uf.crc = file.crc, uf.size = file.size;\n if (tr)\n uf.r();\n tr = 1;\n }\n else if (tr)\n pAll();\n }\n };\n this.u.push(uf);\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this_1 = this;\n if (this.d & 2) {\n if (this.d & 1)\n throw 'stream finishing';\n throw 'stream finished';\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this_1.d & 1))\n return;\n _this_1.u.splice(-1, 1);\n _this_1.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, f.c, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cb(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cb(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl('filename too long', null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n throw 'filename too long';\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (data, final) {\n this.ondata(null, data, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this_1 = this;\n this.i = new Inflate(function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (data, final) {\n try {\n this.i.push(data, final);\n }\n catch (e) {\n this.ondata(e, data, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this_1 = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this_1.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (data, final) {\n if (this.i.terminate)\n data = slc(data, 0);\n this.i.push(data, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this_1 = this;\n if (!this.onfile)\n throw 'no callback';\n if (!this.p)\n throw 'stream finished';\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var _a;\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_2 = [];\n this_1.k.unshift(chks_2);\n f = 2;\n var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n if (sc_1 == 4294967295) {\n _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n }\n else if (dd)\n sc_1 = -1;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n throw 'no callback';\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this_1.o[cmp_1];\n if (!ctr)\n throw 'unknown compression type ' + cmp_1;\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_3 = chks_2; _i < chks_3.length; _i++) {\n var dat = chks_3[_i];\n d_1.push(dat, false);\n }\n if (_this_1.k[0] == chks_2 && _this_1.c)\n _this_1.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n throw 'invalid zip file';\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\n/**\n * Asynchronously decompresses a ZIP archive\n * @param data The raw compressed ZIP file\n * @param cb The callback to call with the decompressed files\n * @returns A function that can be used to immediately terminate the unzipping\n */\nexport function unzip(data, cb) {\n if (typeof cb != 'function')\n throw 'no callback';\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cb('invalid zip file', null);\n return;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (!lft)\n cb(null, {});\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50) {\n cb('invalid zip file', null);\n return;\n }\n c = lft = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n files[fn] = d;\n if (!--lft)\n cb(null, files);\n }\n };\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n if (sc < 320000) {\n try {\n cbl(null, inflateSync(infl, new u8(su)));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl('unknown compression type ' + c_1, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @returns The decompressed files\n */\nexport function unzipSync(data) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n throw 'invalid zip file';\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n throw 'invalid zip file';\n c = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), new u8(su));\n else\n throw 'unknown compression type ' + c_2;\n }\n return files;\n}\n","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearEncoding,\n\tLinearFilter,\n\tRedFormat,\n\tRGBAFormat\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\n\n/**\n * OpenEXR loader currently supports uncompressed, ZIP(S), RLE, PIZ and DWA/B compression.\n * Supports reading as UnsignedByte, HalfFloat and Float type data texture.\n *\n * Referred to the original Industrial Light & Magic OpenEXR implementation and the TinyEXR / Syoyo Fujita\n * implementation, so I have preserved their copyright notices.\n */\n\n// /*\n// Copyright (c) 2014 - 2017, Syoyo Fujita\n// All rights reserved.\n\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above copyright\n// notice, this list of conditions and the following disclaimer in the\n// documentation and/or other materials provided with the distribution.\n// * Neither the name of the Syoyo Fujita nor the\n// names of its contributors may be used to endorse or promote products\n// derived from this software without specific prior written permission.\n\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n// DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY\n// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// */\n\n// // TinyEXR contains some OpenEXR code, which is licensed under ------------\n\n// ///////////////////////////////////////////////////////////////////////////\n// //\n// // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\n// // Digital Ltd. LLC\n// //\n// // All rights reserved.\n// //\n// // Redistribution and use in source and binary forms, with or without\n// // modification, are permitted provided that the following conditions are\n// // met:\n// // * Redistributions of source code must retain the above copyright\n// // notice, this list of conditions and the following disclaimer.\n// // * Redistributions in binary form must reproduce the above\n// // copyright notice, this list of conditions and the following disclaimer\n// // in the documentation and/or other materials provided with the\n// // distribution.\n// // * Neither the name of Industrial Light & Magic nor the names of\n// // its contributors may be used to endorse or promote products derived\n// // from this software without specific prior written permission.\n// //\n// // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// // \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// //\n// ///////////////////////////////////////////////////////////////////////////\n\n// // End of OpenEXR license -------------------------------------------------\n\nclass EXRLoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\tparse( buffer ) {\n\n\t\tconst USHORT_RANGE = ( 1 << 16 );\n\t\tconst BITMAP_SIZE = ( USHORT_RANGE >> 3 );\n\n\t\tconst HUF_ENCBITS = 16; // literal (value) bit length\n\t\tconst HUF_DECBITS = 14; // decoding bit size (>= 8)\n\n\t\tconst HUF_ENCSIZE = ( 1 << HUF_ENCBITS ) + 1; // encoding table size\n\t\tconst HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size\n\t\tconst HUF_DECMASK = HUF_DECSIZE - 1;\n\n\t\tconst NBITS = 16;\n\t\tconst A_OFFSET = 1 << ( NBITS - 1 );\n\t\tconst MOD_MASK = ( 1 << NBITS ) - 1;\n\n\t\tconst SHORT_ZEROCODE_RUN = 59;\n\t\tconst LONG_ZEROCODE_RUN = 63;\n\t\tconst SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN;\n\n\t\tconst ULONG_SIZE = 8;\n\t\tconst FLOAT32_SIZE = 4;\n\t\tconst INT32_SIZE = 4;\n\t\tconst INT16_SIZE = 2;\n\t\tconst INT8_SIZE = 1;\n\n\t\tconst STATIC_HUFFMAN = 0;\n\t\tconst DEFLATE = 1;\n\n\t\tconst UNKNOWN = 0;\n\t\tconst LOSSY_DCT = 1;\n\t\tconst RLE = 2;\n\n\t\tconst logBase = Math.pow( 2.7182818, 2.2 );\n\n\t\tfunction reverseLutFromBitmap( bitmap, lut ) {\n\n\t\t\tlet k = 0;\n\n\t\t\tfor ( let i = 0; i < USHORT_RANGE; ++ i ) {\n\n\t\t\t\tif ( ( i == 0 ) || ( bitmap[ i >> 3 ] & ( 1 << ( i & 7 ) ) ) ) {\n\n\t\t\t\t\tlut[ k ++ ] = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst n = k - 1;\n\n\t\t\twhile ( k < USHORT_RANGE ) lut[ k ++ ] = 0;\n\n\t\t\treturn n;\n\n\t\t}\n\n\t\tfunction hufClearDecTable( hdec ) {\n\n\t\t\tfor ( let i = 0; i < HUF_DECSIZE; i ++ ) {\n\n\t\t\t\thdec[ i ] = {};\n\t\t\t\thdec[ i ].len = 0;\n\t\t\t\thdec[ i ].lit = 0;\n\t\t\t\thdec[ i ].p = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst getBitsReturn = { l: 0, c: 0, lc: 0 };\n\n\t\tfunction getBits( nBits, c, lc, uInt8Array, inOffset ) {\n\n\t\t\twhile ( lc < nBits ) {\n\n\t\t\t\tc = ( c << 8 ) | parseUint8Array( uInt8Array, inOffset );\n\t\t\t\tlc += 8;\n\n\t\t\t}\n\n\t\t\tlc -= nBits;\n\n\t\t\tgetBitsReturn.l = ( c >> lc ) & ( ( 1 << nBits ) - 1 );\n\t\t\tgetBitsReturn.c = c;\n\t\t\tgetBitsReturn.lc = lc;\n\n\t\t}\n\n\t\tconst hufTableBuffer = new Array( 59 );\n\n\t\tfunction hufCanonicalCodeTable( hcode ) {\n\n\t\t\tfor ( let i = 0; i <= 58; ++ i ) hufTableBuffer[ i ] = 0;\n\t\t\tfor ( let i = 0; i < HUF_ENCSIZE; ++ i ) hufTableBuffer[ hcode[ i ] ] += 1;\n\n\t\t\tlet c = 0;\n\n\t\t\tfor ( let i = 58; i > 0; -- i ) {\n\n\t\t\t\tconst nc = ( ( c + hufTableBuffer[ i ] ) >> 1 );\n\t\t\t\thufTableBuffer[ i ] = c;\n\t\t\t\tc = nc;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < HUF_ENCSIZE; ++ i ) {\n\n\t\t\t\tconst l = hcode[ i ];\n\t\t\t\tif ( l > 0 ) hcode[ i ] = l | ( hufTableBuffer[ l ] ++ << 6 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction hufUnpackEncTable( uInt8Array, inOffset, ni, im, iM, hcode ) {\n\n\t\t\tconst p = inOffset;\n\t\t\tlet c = 0;\n\t\t\tlet lc = 0;\n\n\t\t\tfor ( ; im <= iM; im ++ ) {\n\n\t\t\t\tif ( p.value - inOffset.value > ni ) return false;\n\n\t\t\t\tgetBits( 6, c, lc, uInt8Array, p );\n\n\t\t\t\tconst l = getBitsReturn.l;\n\t\t\t\tc = getBitsReturn.c;\n\t\t\t\tlc = getBitsReturn.lc;\n\n\t\t\t\thcode[ im ] = l;\n\n\t\t\t\tif ( l == LONG_ZEROCODE_RUN ) {\n\n\t\t\t\t\tif ( p.value - inOffset.value > ni ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgetBits( 8, c, lc, uInt8Array, p );\n\n\t\t\t\t\tlet zerun = getBitsReturn.l + SHORTEST_LONG_RUN;\n\t\t\t\t\tc = getBitsReturn.c;\n\t\t\t\t\tlc = getBitsReturn.lc;\n\n\t\t\t\t\tif ( im + zerun > iM + 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( zerun -- ) hcode[ im ++ ] = 0;\n\n\t\t\t\t\tim --;\n\n\t\t\t\t} else if ( l >= SHORT_ZEROCODE_RUN ) {\n\n\t\t\t\t\tlet zerun = l - SHORT_ZEROCODE_RUN + 2;\n\n\t\t\t\t\tif ( im + zerun > iM + 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( zerun -- ) hcode[ im ++ ] = 0;\n\n\t\t\t\t\tim --;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thufCanonicalCodeTable( hcode );\n\n\t\t}\n\n\t\tfunction hufLength( code ) {\n\n\t\t\treturn code & 63;\n\n\t\t}\n\n\t\tfunction hufCode( code ) {\n\n\t\t\treturn code >> 6;\n\n\t\t}\n\n\t\tfunction hufBuildDecTable( hcode, im, iM, hdecod ) {\n\n\t\t\tfor ( ; im <= iM; im ++ ) {\n\n\t\t\t\tconst c = hufCode( hcode[ im ] );\n\t\t\t\tconst l = hufLength( hcode[ im ] );\n\n\t\t\t\tif ( c >> l ) {\n\n\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( l > HUF_DECBITS ) {\n\n\t\t\t\t\tconst pl = hdecod[ ( c >> ( l - HUF_DECBITS ) ) ];\n\n\t\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.lit ++;\n\n\t\t\t\t\tif ( pl.p ) {\n\n\t\t\t\t\t\tconst p = pl.p;\n\t\t\t\t\t\tpl.p = new Array( pl.lit );\n\n\t\t\t\t\t\tfor ( let i = 0; i < pl.lit - 1; ++ i ) {\n\n\t\t\t\t\t\t\tpl.p[ i ] = p[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpl.p = new Array( 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.p[ pl.lit - 1 ] = im;\n\n\t\t\t\t} else if ( l ) {\n\n\t\t\t\t\tlet plOffset = 0;\n\n\t\t\t\t\tfor ( let i = 1 << ( HUF_DECBITS - l ); i > 0; i -- ) {\n\n\t\t\t\t\t\tconst pl = hdecod[ ( c << ( HUF_DECBITS - l ) ) + plOffset ];\n\n\t\t\t\t\t\tif ( pl.len || pl.p ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpl.len = l;\n\t\t\t\t\t\tpl.lit = im;\n\n\t\t\t\t\t\tplOffset ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst getCharReturn = { c: 0, lc: 0 };\n\n\t\tfunction getChar( c, lc, uInt8Array, inOffset ) {\n\n\t\t\tc = ( c << 8 ) | parseUint8Array( uInt8Array, inOffset );\n\t\t\tlc += 8;\n\n\t\t\tgetCharReturn.c = c;\n\t\t\tgetCharReturn.lc = lc;\n\n\t\t}\n\n\t\tconst getCodeReturn = { c: 0, lc: 0 };\n\n\t\tfunction getCode( po, rlc, c, lc, uInt8Array, inOffset, outBuffer, outBufferOffset, outBufferEndOffset ) {\n\n\t\t\tif ( po == rlc ) {\n\n\t\t\t\tif ( lc < 8 ) {\n\n\t\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\t\t\t\t\tc = getCharReturn.c;\n\t\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\t}\n\n\t\t\t\tlc -= 8;\n\n\t\t\t\tlet cs = ( c >> lc );\n\t\t\t\tcs = new Uint8Array( [ cs ] )[ 0 ];\n\n\t\t\t\tif ( outBufferOffset.value + cs > outBufferEndOffset ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tconst s = outBuffer[ outBufferOffset.value - 1 ];\n\n\t\t\t\twhile ( cs -- > 0 ) {\n\n\t\t\t\t\toutBuffer[ outBufferOffset.value ++ ] = s;\n\n\t\t\t\t}\n\n\t\t\t} else if ( outBufferOffset.value < outBufferEndOffset ) {\n\n\t\t\t\toutBuffer[ outBufferOffset.value ++ ] = po;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tgetCodeReturn.c = c;\n\t\t\tgetCodeReturn.lc = lc;\n\n\t\t}\n\n\t\tfunction UInt16( value ) {\n\n\t\t\treturn ( value & 0xFFFF );\n\n\t\t}\n\n\t\tfunction Int16( value ) {\n\n\t\t\tconst ref = UInt16( value );\n\t\t\treturn ( ref > 0x7FFF ) ? ref - 0x10000 : ref;\n\n\t\t}\n\n\t\tconst wdec14Return = { a: 0, b: 0 };\n\n\t\tfunction wdec14( l, h ) {\n\n\t\t\tconst ls = Int16( l );\n\t\t\tconst hs = Int16( h );\n\n\t\t\tconst hi = hs;\n\t\t\tconst ai = ls + ( hi & 1 ) + ( hi >> 1 );\n\n\t\t\tconst as = ai;\n\t\t\tconst bs = ai - hi;\n\n\t\t\twdec14Return.a = as;\n\t\t\twdec14Return.b = bs;\n\n\t\t}\n\n\t\tfunction wdec16( l, h ) {\n\n\t\t\tconst m = UInt16( l );\n\t\t\tconst d = UInt16( h );\n\n\t\t\tconst bb = ( m - ( d >> 1 ) ) & MOD_MASK;\n\t\t\tconst aa = ( d + bb - A_OFFSET ) & MOD_MASK;\n\n\t\t\twdec14Return.a = aa;\n\t\t\twdec14Return.b = bb;\n\n\t\t}\n\n\t\tfunction wav2Decode( buffer, j, nx, ox, ny, oy, mx ) {\n\n\t\t\tconst w14 = mx < ( 1 << 14 );\n\t\t\tconst n = ( nx > ny ) ? ny : nx;\n\t\t\tlet p = 1;\n\t\t\tlet p2;\n\t\t\tlet py;\n\n\t\t\twhile ( p <= n ) p <<= 1;\n\n\t\t\tp >>= 1;\n\t\t\tp2 = p;\n\t\t\tp >>= 1;\n\n\t\t\twhile ( p >= 1 ) {\n\n\t\t\t\tpy = 0;\n\t\t\t\tconst ey = py + oy * ( ny - p2 );\n\t\t\t\tconst oy1 = oy * p;\n\t\t\t\tconst oy2 = oy * p2;\n\t\t\t\tconst ox1 = ox * p;\n\t\t\t\tconst ox2 = ox * p2;\n\t\t\t\tlet i00, i01, i10, i11;\n\n\t\t\t\tfor ( ; py <= ey; py += oy2 ) {\n\n\t\t\t\t\tlet px = py;\n\t\t\t\t\tconst ex = py + ox * ( nx - p2 );\n\n\t\t\t\t\tfor ( ; px <= ex; px += ox2 ) {\n\n\t\t\t\t\t\tconst p01 = px + ox1;\n\t\t\t\t\t\tconst p10 = px + oy1;\n\t\t\t\t\t\tconst p11 = p10 + ox1;\n\n\t\t\t\t\t\tif ( w14 ) {\n\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\t\ti10 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( buffer[ p01 + j ], buffer[ p11 + j ] );\n\n\t\t\t\t\t\t\ti01 = wdec14Return.a;\n\t\t\t\t\t\t\ti11 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( i00, i01 );\n\n\t\t\t\t\t\t\tbuffer[ px + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( i10, i11 );\n\n\t\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p11 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\t\ti10 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( buffer[ p01 + j ], buffer[ p11 + j ] );\n\n\t\t\t\t\t\t\ti01 = wdec14Return.a;\n\t\t\t\t\t\t\ti11 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( i00, i01 );\n\n\t\t\t\t\t\t\tbuffer[ px + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( i10, i11 );\n\n\t\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p11 + j ] = wdec14Return.b;\n\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( nx & p ) {\n\n\t\t\t\t\t\tconst p10 = px + oy1;\n\n\t\t\t\t\t\tif ( w14 )\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p10 + j ] );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\tbuffer[ px + j ] = i00;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ny & p ) {\n\n\t\t\t\t\tlet px = py;\n\t\t\t\t\tconst ex = py + ox * ( nx - p2 );\n\n\t\t\t\t\tfor ( ; px <= ex; px += ox2 ) {\n\n\t\t\t\t\t\tconst p01 = px + ox1;\n\n\t\t\t\t\t\tif ( w14 )\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p01 + j ] );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p01 + j ] );\n\n\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\tbuffer[ px + j ] = i00;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tp2 = p;\n\t\t\t\tp >>= 1;\n\n\t\t\t}\n\n\t\t\treturn py;\n\n\t\t}\n\n\t\tfunction hufDecode( encodingTable, decodingTable, uInt8Array, inOffset, ni, rlc, no, outBuffer, outOffset ) {\n\n\t\t\tlet c = 0;\n\t\t\tlet lc = 0;\n\t\t\tconst outBufferEndOffset = no;\n\t\t\tconst inOffsetEnd = Math.trunc( inOffset.value + ( ni + 7 ) / 8 );\n\n\t\t\twhile ( inOffset.value < inOffsetEnd ) {\n\n\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\n\t\t\t\tc = getCharReturn.c;\n\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\twhile ( lc >= HUF_DECBITS ) {\n\n\t\t\t\t\tconst index = ( c >> ( lc - HUF_DECBITS ) ) & HUF_DECMASK;\n\t\t\t\t\tconst pl = decodingTable[ index ];\n\n\t\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\t\tlc -= pl.len;\n\n\t\t\t\t\t\tgetCode( pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ! pl.p ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet j;\n\n\t\t\t\t\t\tfor ( j = 0; j < pl.lit; j ++ ) {\n\n\t\t\t\t\t\t\tconst l = hufLength( encodingTable[ pl.p[ j ] ] );\n\n\t\t\t\t\t\t\twhile ( lc < l && inOffset.value < inOffsetEnd ) {\n\n\t\t\t\t\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\n\t\t\t\t\t\t\t\tc = getCharReturn.c;\n\t\t\t\t\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( lc >= l ) {\n\n\t\t\t\t\t\t\t\tif ( hufCode( encodingTable[ pl.p[ j ] ] ) == ( ( c >> ( lc - l ) ) & ( ( 1 << l ) - 1 ) ) ) {\n\n\t\t\t\t\t\t\t\t\tlc -= l;\n\n\t\t\t\t\t\t\t\t\tgetCode( pl.p[ j ], rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( j == pl.lit ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst i = ( 8 - ni ) & 7;\n\n\t\t\tc >>= i;\n\t\t\tlc -= i;\n\n\t\t\twhile ( lc > 0 ) {\n\n\t\t\t\tconst pl = decodingTable[ ( c << ( HUF_DECBITS - lc ) ) & HUF_DECMASK ];\n\n\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\tlc -= pl.len;\n\n\t\t\t\t\tgetCode( pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction hufUncompress( uInt8Array, inDataView, inOffset, nCompressed, outBuffer, nRaw ) {\n\n\t\t\tconst outOffset = { value: 0 };\n\t\t\tconst initialInOffset = inOffset.value;\n\n\t\t\tconst im = parseUint32( inDataView, inOffset );\n\t\t\tconst iM = parseUint32( inDataView, inOffset );\n\n\t\t\tinOffset.value += 4;\n\n\t\t\tconst nBits = parseUint32( inDataView, inOffset );\n\n\t\t\tinOffset.value += 4;\n\n\t\t\tif ( im < 0 || im >= HUF_ENCSIZE || iM < 0 || iM >= HUF_ENCSIZE ) {\n\n\t\t\t\tthrow new Error( 'Something wrong with HUF_ENCSIZE' );\n\n\t\t\t}\n\n\t\t\tconst freq = new Array( HUF_ENCSIZE );\n\t\t\tconst hdec = new Array( HUF_DECSIZE );\n\n\t\t\thufClearDecTable( hdec );\n\n\t\t\tconst ni = nCompressed - ( inOffset.value - initialInOffset );\n\n\t\t\thufUnpackEncTable( uInt8Array, inOffset, ni, im, iM, freq );\n\n\t\t\tif ( nBits > 8 * ( nCompressed - ( inOffset.value - initialInOffset ) ) ) {\n\n\t\t\t\tthrow new Error( 'Something wrong with hufUncompress' );\n\n\t\t\t}\n\n\t\t\thufBuildDecTable( freq, im, iM, hdec );\n\n\t\t\thufDecode( freq, hdec, uInt8Array, inOffset, nBits, iM, nRaw, outBuffer, outOffset );\n\n\t\t}\n\n\t\tfunction applyLut( lut, data, nData ) {\n\n\t\t\tfor ( let i = 0; i < nData; ++ i ) {\n\n\t\t\t\tdata[ i ] = lut[ data[ i ] ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction predictor( source ) {\n\n\t\t\tfor ( let t = 1; t < source.length; t ++ ) {\n\n\t\t\t\tconst d = source[ t - 1 ] + source[ t ] - 128;\n\t\t\t\tsource[ t ] = d;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction interleaveScalar( source, out ) {\n\n\t\t\tlet t1 = 0;\n\t\t\tlet t2 = Math.floor( ( source.length + 1 ) / 2 );\n\t\t\tlet s = 0;\n\t\t\tconst stop = source.length - 1;\n\n\t\t\twhile ( true ) {\n\n\t\t\t\tif ( s > stop ) break;\n\t\t\t\tout[ s ++ ] = source[ t1 ++ ];\n\n\t\t\t\tif ( s > stop ) break;\n\t\t\t\tout[ s ++ ] = source[ t2 ++ ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction decodeRunLength( source ) {\n\n\t\t\tlet size = source.byteLength;\n\t\t\tconst out = new Array();\n\t\t\tlet p = 0;\n\n\t\t\tconst reader = new DataView( source );\n\n\t\t\twhile ( size > 0 ) {\n\n\t\t\t\tconst l = reader.getInt8( p ++ );\n\n\t\t\t\tif ( l < 0 ) {\n\n\t\t\t\t\tconst count = - l;\n\t\t\t\t\tsize -= count + 1;\n\n\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\tout.push( reader.getUint8( p ++ ) );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst count = l;\n\t\t\t\t\tsize -= 2;\n\n\t\t\t\t\tconst value = reader.getUint8( p ++ );\n\n\t\t\t\t\tfor ( let i = 0; i < count + 1; i ++ ) {\n\n\t\t\t\t\t\tout.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn out;\n\n\t\t}\n\n\t\tfunction lossyDctDecode( cscSet, rowPtrs, channelData, acBuffer, dcBuffer, outBuffer ) {\n\n\t\t\tlet dataView = new DataView( outBuffer.buffer );\n\n\t\t\tconst width = channelData[ cscSet.idx[ 0 ] ].width;\n\t\t\tconst height = channelData[ cscSet.idx[ 0 ] ].height;\n\n\t\t\tconst numComp = 3;\n\n\t\t\tconst numFullBlocksX = Math.floor( width / 8.0 );\n\t\t\tconst numBlocksX = Math.ceil( width / 8.0 );\n\t\t\tconst numBlocksY = Math.ceil( height / 8.0 );\n\t\t\tconst leftoverX = width - ( numBlocksX - 1 ) * 8;\n\t\t\tconst leftoverY = height - ( numBlocksY - 1 ) * 8;\n\n\t\t\tconst currAcComp = { value: 0 };\n\t\t\tconst currDcComp = new Array( numComp );\n\t\t\tconst dctData = new Array( numComp );\n\t\t\tconst halfZigBlock = new Array( numComp );\n\t\t\tconst rowBlock = new Array( numComp );\n\t\t\tconst rowOffsets = new Array( numComp );\n\n\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\trowOffsets[ comp ] = rowPtrs[ cscSet.idx[ comp ] ];\n\t\t\t\tcurrDcComp[ comp ] = ( comp < 1 ) ? 0 : currDcComp[ comp - 1 ] + numBlocksX * numBlocksY;\n\t\t\t\tdctData[ comp ] = new Float32Array( 64 );\n\t\t\t\thalfZigBlock[ comp ] = new Uint16Array( 64 );\n\t\t\t\trowBlock[ comp ] = new Uint16Array( numBlocksX * 64 );\n\n\t\t\t}\n\n\t\t\tfor ( let blocky = 0; blocky < numBlocksY; ++ blocky ) {\n\n\t\t\t\tlet maxY = 8;\n\n\t\t\t\tif ( blocky == numBlocksY - 1 )\n\t\t\t\t\tmaxY = leftoverY;\n\n\t\t\t\tlet maxX = 8;\n\n\t\t\t\tfor ( let blockx = 0; blockx < numBlocksX; ++ blockx ) {\n\n\t\t\t\t\tif ( blockx == numBlocksX - 1 )\n\t\t\t\t\t\tmaxX = leftoverX;\n\n\t\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\t\thalfZigBlock[ comp ].fill( 0 );\n\n\t\t\t\t\t\t// set block DC component\n\t\t\t\t\t\thalfZigBlock[ comp ][ 0 ] = dcBuffer[ currDcComp[ comp ] ++ ];\n\t\t\t\t\t\t// set block AC components\n\t\t\t\t\t\tunRleAC( currAcComp, acBuffer, halfZigBlock[ comp ] );\n\n\t\t\t\t\t\t// UnZigZag block to float\n\t\t\t\t\t\tunZigZag( halfZigBlock[ comp ], dctData[ comp ] );\n\t\t\t\t\t\t// decode float dct\n\t\t\t\t\t\tdctInverse( dctData[ comp ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( numComp == 3 ) {\n\n\t\t\t\t\t\tcsc709Inverse( dctData );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\t\tconvertToHalf( dctData[ comp ], rowBlock[ comp ], blockx * 64 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // blockx\n\n\t\t\t\tlet offset = 0;\n\n\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\tconst type = channelData[ cscSet.idx[ comp ] ].type;\n\n\t\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\t\toffset = rowOffsets[ comp ][ y ];\n\n\t\t\t\t\t\tfor ( let blockx = 0; blockx < numFullBlocksX; ++ blockx ) {\n\n\t\t\t\t\t\t\tconst src = blockx * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + 0 * INT16_SIZE * type, rowBlock[ comp ][ src + 0 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 1 * INT16_SIZE * type, rowBlock[ comp ][ src + 1 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 2 * INT16_SIZE * type, rowBlock[ comp ][ src + 2 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 3 * INT16_SIZE * type, rowBlock[ comp ][ src + 3 ], true );\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + 4 * INT16_SIZE * type, rowBlock[ comp ][ src + 4 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 5 * INT16_SIZE * type, rowBlock[ comp ][ src + 5 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 6 * INT16_SIZE * type, rowBlock[ comp ][ src + 6 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 7 * INT16_SIZE * type, rowBlock[ comp ][ src + 7 ], true );\n\n\t\t\t\t\t\t\toffset += 8 * INT16_SIZE * type;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// handle partial X blocks\n\t\t\t\t\tif ( numFullBlocksX != numBlocksX ) {\n\n\t\t\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\t\t\tconst offset = rowOffsets[ comp ][ y ] + 8 * numFullBlocksX * INT16_SIZE * type;\n\t\t\t\t\t\t\tconst src = numFullBlocksX * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\t\tfor ( let x = 0; x < maxX; ++ x ) {\n\n\t\t\t\t\t\t\t\tdataView.setUint16( offset + x * INT16_SIZE * type, rowBlock[ comp ][ src + x ], true );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} // comp\n\n\t\t\t} // blocky\n\n\t\t\tconst halfRow = new Uint16Array( width );\n\t\t\tdataView = new DataView( outBuffer.buffer );\n\n\t\t\t// convert channels back to float, if needed\n\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\tchannelData[ cscSet.idx[ comp ] ].decoded = true;\n\t\t\t\tconst type = channelData[ cscSet.idx[ comp ] ].type;\n\n\t\t\t\tif ( channelData[ comp ].type != 2 ) continue;\n\n\t\t\t\tfor ( let y = 0; y < height; ++ y ) {\n\n\t\t\t\t\tconst offset = rowOffsets[ comp ][ y ];\n\n\t\t\t\t\tfor ( let x = 0; x < width; ++ x ) {\n\n\t\t\t\t\t\thalfRow[ x ] = dataView.getUint16( offset + x * INT16_SIZE * type, true );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let x = 0; x < width; ++ x ) {\n\n\t\t\t\t\t\tdataView.setFloat32( offset + x * INT16_SIZE * type, decodeFloat16( halfRow[ x ] ), true );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction unRleAC( currAcComp, acBuffer, halfZigBlock ) {\n\n\t\t\tlet acValue;\n\t\t\tlet dctComp = 1;\n\n\t\t\twhile ( dctComp < 64 ) {\n\n\t\t\t\tacValue = acBuffer[ currAcComp.value ];\n\n\t\t\t\tif ( acValue == 0xff00 ) {\n\n\t\t\t\t\tdctComp = 64;\n\n\t\t\t\t} else if ( acValue >> 8 == 0xff ) {\n\n\t\t\t\t\tdctComp += acValue & 0xff;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thalfZigBlock[ dctComp ] = acValue;\n\t\t\t\t\tdctComp ++;\n\n\t\t\t\t}\n\n\t\t\t\tcurrAcComp.value ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction unZigZag( src, dst ) {\n\n\t\t\tdst[ 0 ] = decodeFloat16( src[ 0 ] );\n\t\t\tdst[ 1 ] = decodeFloat16( src[ 1 ] );\n\t\t\tdst[ 2 ] = decodeFloat16( src[ 5 ] );\n\t\t\tdst[ 3 ] = decodeFloat16( src[ 6 ] );\n\t\t\tdst[ 4 ] = decodeFloat16( src[ 14 ] );\n\t\t\tdst[ 5 ] = decodeFloat16( src[ 15 ] );\n\t\t\tdst[ 6 ] = decodeFloat16( src[ 27 ] );\n\t\t\tdst[ 7 ] = decodeFloat16( src[ 28 ] );\n\t\t\tdst[ 8 ] = decodeFloat16( src[ 2 ] );\n\t\t\tdst[ 9 ] = decodeFloat16( src[ 4 ] );\n\n\t\t\tdst[ 10 ] = decodeFloat16( src[ 7 ] );\n\t\t\tdst[ 11 ] = decodeFloat16( src[ 13 ] );\n\t\t\tdst[ 12 ] = decodeFloat16( src[ 16 ] );\n\t\t\tdst[ 13 ] = decodeFloat16( src[ 26 ] );\n\t\t\tdst[ 14 ] = decodeFloat16( src[ 29 ] );\n\t\t\tdst[ 15 ] = decodeFloat16( src[ 42 ] );\n\t\t\tdst[ 16 ] = decodeFloat16( src[ 3 ] );\n\t\t\tdst[ 17 ] = decodeFloat16( src[ 8 ] );\n\t\t\tdst[ 18 ] = decodeFloat16( src[ 12 ] );\n\t\t\tdst[ 19 ] = decodeFloat16( src[ 17 ] );\n\n\t\t\tdst[ 20 ] = decodeFloat16( src[ 25 ] );\n\t\t\tdst[ 21 ] = decodeFloat16( src[ 30 ] );\n\t\t\tdst[ 22 ] = decodeFloat16( src[ 41 ] );\n\t\t\tdst[ 23 ] = decodeFloat16( src[ 43 ] );\n\t\t\tdst[ 24 ] = decodeFloat16( src[ 9 ] );\n\t\t\tdst[ 25 ] = decodeFloat16( src[ 11 ] );\n\t\t\tdst[ 26 ] = decodeFloat16( src[ 18 ] );\n\t\t\tdst[ 27 ] = decodeFloat16( src[ 24 ] );\n\t\t\tdst[ 28 ] = decodeFloat16( src[ 31 ] );\n\t\t\tdst[ 29 ] = decodeFloat16( src[ 40 ] );\n\n\t\t\tdst[ 30 ] = decodeFloat16( src[ 44 ] );\n\t\t\tdst[ 31 ] = decodeFloat16( src[ 53 ] );\n\t\t\tdst[ 32 ] = decodeFloat16( src[ 10 ] );\n\t\t\tdst[ 33 ] = decodeFloat16( src[ 19 ] );\n\t\t\tdst[ 34 ] = decodeFloat16( src[ 23 ] );\n\t\t\tdst[ 35 ] = decodeFloat16( src[ 32 ] );\n\t\t\tdst[ 36 ] = decodeFloat16( src[ 39 ] );\n\t\t\tdst[ 37 ] = decodeFloat16( src[ 45 ] );\n\t\t\tdst[ 38 ] = decodeFloat16( src[ 52 ] );\n\t\t\tdst[ 39 ] = decodeFloat16( src[ 54 ] );\n\n\t\t\tdst[ 40 ] = decodeFloat16( src[ 20 ] );\n\t\t\tdst[ 41 ] = decodeFloat16( src[ 22 ] );\n\t\t\tdst[ 42 ] = decodeFloat16( src[ 33 ] );\n\t\t\tdst[ 43 ] = decodeFloat16( src[ 38 ] );\n\t\t\tdst[ 44 ] = decodeFloat16( src[ 46 ] );\n\t\t\tdst[ 45 ] = decodeFloat16( src[ 51 ] );\n\t\t\tdst[ 46 ] = decodeFloat16( src[ 55 ] );\n\t\t\tdst[ 47 ] = decodeFloat16( src[ 60 ] );\n\t\t\tdst[ 48 ] = decodeFloat16( src[ 21 ] );\n\t\t\tdst[ 49 ] = decodeFloat16( src[ 34 ] );\n\n\t\t\tdst[ 50 ] = decodeFloat16( src[ 37 ] );\n\t\t\tdst[ 51 ] = decodeFloat16( src[ 47 ] );\n\t\t\tdst[ 52 ] = decodeFloat16( src[ 50 ] );\n\t\t\tdst[ 53 ] = decodeFloat16( src[ 56 ] );\n\t\t\tdst[ 54 ] = decodeFloat16( src[ 59 ] );\n\t\t\tdst[ 55 ] = decodeFloat16( src[ 61 ] );\n\t\t\tdst[ 56 ] = decodeFloat16( src[ 35 ] );\n\t\t\tdst[ 57 ] = decodeFloat16( src[ 36 ] );\n\t\t\tdst[ 58 ] = decodeFloat16( src[ 48 ] );\n\t\t\tdst[ 59 ] = decodeFloat16( src[ 49 ] );\n\n\t\t\tdst[ 60 ] = decodeFloat16( src[ 57 ] );\n\t\t\tdst[ 61 ] = decodeFloat16( src[ 58 ] );\n\t\t\tdst[ 62 ] = decodeFloat16( src[ 62 ] );\n\t\t\tdst[ 63 ] = decodeFloat16( src[ 63 ] );\n\n\t\t}\n\n\t\tfunction dctInverse( data ) {\n\n\t\t\tconst a = 0.5 * Math.cos( 3.14159 / 4.0 );\n\t\t\tconst b = 0.5 * Math.cos( 3.14159 / 16.0 );\n\t\t\tconst c = 0.5 * Math.cos( 3.14159 / 8.0 );\n\t\t\tconst d = 0.5 * Math.cos( 3.0 * 3.14159 / 16.0 );\n\t\t\tconst e = 0.5 * Math.cos( 5.0 * 3.14159 / 16.0 );\n\t\t\tconst f = 0.5 * Math.cos( 3.0 * 3.14159 / 8.0 );\n\t\t\tconst g = 0.5 * Math.cos( 7.0 * 3.14159 / 16.0 );\n\n\t\t\tconst alpha = new Array( 4 );\n\t\t\tconst beta = new Array( 4 );\n\t\t\tconst theta = new Array( 4 );\n\t\t\tconst gamma = new Array( 4 );\n\n\t\t\tfor ( let row = 0; row < 8; ++ row ) {\n\n\t\t\t\tconst rowPtr = row * 8;\n\n\t\t\t\talpha[ 0 ] = c * data[ rowPtr + 2 ];\n\t\t\t\talpha[ 1 ] = f * data[ rowPtr + 2 ];\n\t\t\t\talpha[ 2 ] = c * data[ rowPtr + 6 ];\n\t\t\t\talpha[ 3 ] = f * data[ rowPtr + 6 ];\n\n\t\t\t\tbeta[ 0 ] = b * data[ rowPtr + 1 ] + d * data[ rowPtr + 3 ] + e * data[ rowPtr + 5 ] + g * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 1 ] = d * data[ rowPtr + 1 ] - g * data[ rowPtr + 3 ] - b * data[ rowPtr + 5 ] - e * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 2 ] = e * data[ rowPtr + 1 ] - b * data[ rowPtr + 3 ] + g * data[ rowPtr + 5 ] + d * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 3 ] = g * data[ rowPtr + 1 ] - e * data[ rowPtr + 3 ] + d * data[ rowPtr + 5 ] - b * data[ rowPtr + 7 ];\n\n\t\t\t\ttheta[ 0 ] = a * ( data[ rowPtr + 0 ] + data[ rowPtr + 4 ] );\n\t\t\t\ttheta[ 3 ] = a * ( data[ rowPtr + 0 ] - data[ rowPtr + 4 ] );\n\t\t\t\ttheta[ 1 ] = alpha[ 0 ] + alpha[ 3 ];\n\t\t\t\ttheta[ 2 ] = alpha[ 1 ] - alpha[ 2 ];\n\n\t\t\t\tgamma[ 0 ] = theta[ 0 ] + theta[ 1 ];\n\t\t\t\tgamma[ 1 ] = theta[ 3 ] + theta[ 2 ];\n\t\t\t\tgamma[ 2 ] = theta[ 3 ] - theta[ 2 ];\n\t\t\t\tgamma[ 3 ] = theta[ 0 ] - theta[ 1 ];\n\n\t\t\t\tdata[ rowPtr + 0 ] = gamma[ 0 ] + beta[ 0 ];\n\t\t\t\tdata[ rowPtr + 1 ] = gamma[ 1 ] + beta[ 1 ];\n\t\t\t\tdata[ rowPtr + 2 ] = gamma[ 2 ] + beta[ 2 ];\n\t\t\t\tdata[ rowPtr + 3 ] = gamma[ 3 ] + beta[ 3 ];\n\n\t\t\t\tdata[ rowPtr + 4 ] = gamma[ 3 ] - beta[ 3 ];\n\t\t\t\tdata[ rowPtr + 5 ] = gamma[ 2 ] - beta[ 2 ];\n\t\t\t\tdata[ rowPtr + 6 ] = gamma[ 1 ] - beta[ 1 ];\n\t\t\t\tdata[ rowPtr + 7 ] = gamma[ 0 ] - beta[ 0 ];\n\n\t\t\t}\n\n\t\t\tfor ( let column = 0; column < 8; ++ column ) {\n\n\t\t\t\talpha[ 0 ] = c * data[ 16 + column ];\n\t\t\t\talpha[ 1 ] = f * data[ 16 + column ];\n\t\t\t\talpha[ 2 ] = c * data[ 48 + column ];\n\t\t\t\talpha[ 3 ] = f * data[ 48 + column ];\n\n\t\t\t\tbeta[ 0 ] = b * data[ 8 + column ] + d * data[ 24 + column ] + e * data[ 40 + column ] + g * data[ 56 + column ];\n\t\t\t\tbeta[ 1 ] = d * data[ 8 + column ] - g * data[ 24 + column ] - b * data[ 40 + column ] - e * data[ 56 + column ];\n\t\t\t\tbeta[ 2 ] = e * data[ 8 + column ] - b * data[ 24 + column ] + g * data[ 40 + column ] + d * data[ 56 + column ];\n\t\t\t\tbeta[ 3 ] = g * data[ 8 + column ] - e * data[ 24 + column ] + d * data[ 40 + column ] - b * data[ 56 + column ];\n\n\t\t\t\ttheta[ 0 ] = a * ( data[ column ] + data[ 32 + column ] );\n\t\t\t\ttheta[ 3 ] = a * ( data[ column ] - data[ 32 + column ] );\n\n\t\t\t\ttheta[ 1 ] = alpha[ 0 ] + alpha[ 3 ];\n\t\t\t\ttheta[ 2 ] = alpha[ 1 ] - alpha[ 2 ];\n\n\t\t\t\tgamma[ 0 ] = theta[ 0 ] + theta[ 1 ];\n\t\t\t\tgamma[ 1 ] = theta[ 3 ] + theta[ 2 ];\n\t\t\t\tgamma[ 2 ] = theta[ 3 ] - theta[ 2 ];\n\t\t\t\tgamma[ 3 ] = theta[ 0 ] - theta[ 1 ];\n\n\t\t\t\tdata[ 0 + column ] = gamma[ 0 ] + beta[ 0 ];\n\t\t\t\tdata[ 8 + column ] = gamma[ 1 ] + beta[ 1 ];\n\t\t\t\tdata[ 16 + column ] = gamma[ 2 ] + beta[ 2 ];\n\t\t\t\tdata[ 24 + column ] = gamma[ 3 ] + beta[ 3 ];\n\n\t\t\t\tdata[ 32 + column ] = gamma[ 3 ] - beta[ 3 ];\n\t\t\t\tdata[ 40 + column ] = gamma[ 2 ] - beta[ 2 ];\n\t\t\t\tdata[ 48 + column ] = gamma[ 1 ] - beta[ 1 ];\n\t\t\t\tdata[ 56 + column ] = gamma[ 0 ] - beta[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction csc709Inverse( data ) {\n\n\t\t\tfor ( let i = 0; i < 64; ++ i ) {\n\n\t\t\t\tconst y = data[ 0 ][ i ];\n\t\t\t\tconst cb = data[ 1 ][ i ];\n\t\t\t\tconst cr = data[ 2 ][ i ];\n\n\t\t\t\tdata[ 0 ][ i ] = y + 1.5747 * cr;\n\t\t\t\tdata[ 1 ][ i ] = y - 0.1873 * cb - 0.4682 * cr;\n\t\t\t\tdata[ 2 ][ i ] = y + 1.8556 * cb;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction convertToHalf( src, dst, idx ) {\n\n\t\t\tfor ( let i = 0; i < 64; ++ i ) {\n\n\t\t\t\tdst[ idx + i ] = DataUtils.toHalfFloat( toLinear( src[ i ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction toLinear( float ) {\n\n\t\t\tif ( float <= 1 ) {\n\n\t\t\t\treturn Math.sign( float ) * Math.pow( Math.abs( float ), 2.2 );\n\n\t\t\t} else {\n\n\t\t\t\treturn Math.sign( float ) * Math.pow( logBase, Math.abs( float ) - 1.0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uncompressRAW( info ) {\n\n\t\t\treturn new DataView( info.array.buffer, info.offset.value, info.size );\n\n\t\t}\n\n\t\tfunction uncompressRLE( info ) {\n\n\t\t\tconst compressed = info.viewer.buffer.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = new Uint8Array( decodeRunLength( compressed ) );\n\t\t\tconst tmpBuffer = new Uint8Array( rawBuffer.length );\n\n\t\t\tpredictor( rawBuffer ); // revert predictor\n\n\t\t\tinterleaveScalar( rawBuffer, tmpBuffer ); // interleave pixels\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressZIP( info ) {\n\n\t\t\tconst compressed = info.array.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tif ( typeof fflate === 'undefined' ) {\n\n\t\t\t\tconsole.error( 'THREE.EXRLoader: External library fflate.min.js required.' );\n\n\t\t\t}\n\n\t\t\tconst rawBuffer = fflate.unzlibSync( compressed ); // eslint-disable-line no-undef\n\t\t\tconst tmpBuffer = new Uint8Array( rawBuffer.length );\n\n\t\t\tpredictor( rawBuffer ); // revert predictor\n\n\t\t\tinterleaveScalar( rawBuffer, tmpBuffer ); // interleave pixels\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressPIZ( info ) {\n\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\n\t\t\tconst outBuffer = new Uint16Array( info.width * info.scanlineBlockSize * ( info.channels * info.type ) );\n\t\t\tconst bitmap = new Uint8Array( BITMAP_SIZE );\n\n\t\t\t// Setup channel info\n\t\t\tlet outBufferEnd = 0;\n\t\t\tconst pizChannelData = new Array( info.channels );\n\t\t\tfor ( let i = 0; i < info.channels; i ++ ) {\n\n\t\t\t\tpizChannelData[ i ] = {};\n\t\t\t\tpizChannelData[ i ][ 'start' ] = outBufferEnd;\n\t\t\t\tpizChannelData[ i ][ 'end' ] = pizChannelData[ i ][ 'start' ];\n\t\t\t\tpizChannelData[ i ][ 'nx' ] = info.width;\n\t\t\t\tpizChannelData[ i ][ 'ny' ] = info.lines;\n\t\t\t\tpizChannelData[ i ][ 'size' ] = info.type;\n\n\t\t\t\toutBufferEnd += pizChannelData[ i ].nx * pizChannelData[ i ].ny * pizChannelData[ i ].size;\n\n\t\t\t}\n\n\t\t\t// Read range compression data\n\n\t\t\tconst minNonZero = parseUint16( inDataView, inOffset );\n\t\t\tconst maxNonZero = parseUint16( inDataView, inOffset );\n\n\t\t\tif ( maxNonZero >= BITMAP_SIZE ) {\n\n\t\t\t\tthrow new Error( 'Something is wrong with PIZ_COMPRESSION BITMAP_SIZE' );\n\n\t\t\t}\n\n\t\t\tif ( minNonZero <= maxNonZero ) {\n\n\t\t\t\tfor ( let i = 0; i < maxNonZero - minNonZero + 1; i ++ ) {\n\n\t\t\t\t\tbitmap[ i + minNonZero ] = parseUint8( inDataView, inOffset );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Reverse LUT\n\t\t\tconst lut = new Uint16Array( USHORT_RANGE );\n\t\t\tconst maxValue = reverseLutFromBitmap( bitmap, lut );\n\n\t\t\tconst length = parseUint32( inDataView, inOffset );\n\n\t\t\t// Huffman decoding\n\t\t\thufUncompress( info.array, inDataView, inOffset, length, outBuffer, outBufferEnd );\n\n\t\t\t// Wavelet decoding\n\t\t\tfor ( let i = 0; i < info.channels; ++ i ) {\n\n\t\t\t\tconst cd = pizChannelData[ i ];\n\n\t\t\t\tfor ( let j = 0; j < pizChannelData[ i ].size; ++ j ) {\n\n\t\t\t\t\twav2Decode(\n\t\t\t\t\t\toutBuffer,\n\t\t\t\t\t\tcd.start + j,\n\t\t\t\t\t\tcd.nx,\n\t\t\t\t\t\tcd.size,\n\t\t\t\t\t\tcd.ny,\n\t\t\t\t\t\tcd.nx * cd.size,\n\t\t\t\t\t\tmaxValue\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Expand the pixel data to their original range\n\t\t\tapplyLut( lut, outBuffer, outBufferEnd );\n\n\t\t\t// Rearrange the pixel data into the format expected by the caller.\n\t\t\tlet tmpOffset = 0;\n\t\t\tconst tmpBuffer = new Uint8Array( outBuffer.buffer.byteLength );\n\t\t\tfor ( let y = 0; y < info.lines; y ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < info.channels; c ++ ) {\n\n\t\t\t\t\tconst cd = pizChannelData[ c ];\n\n\t\t\t\t\tconst n = cd.nx * cd.size;\n\t\t\t\t\tconst cp = new Uint8Array( outBuffer.buffer, cd.end * INT16_SIZE, n * INT16_SIZE );\n\n\t\t\t\t\ttmpBuffer.set( cp, tmpOffset );\n\t\t\t\t\ttmpOffset += n * INT16_SIZE;\n\t\t\t\t\tcd.end += n;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressPXR( info ) {\n\n\t\t\tconst compressed = info.array.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tif ( typeof fflate === 'undefined' ) {\n\n\t\t\t\tconsole.error( 'THREE.EXRLoader: External library fflate.min.js required.' );\n\n\t\t\t}\n\n\t\t\tconst rawBuffer = fflate.unzlibSync( compressed ); // eslint-disable-line no-undef\n\n\t\t\tconst sz = info.lines * info.channels * info.width;\n\t\t\tconst tmpBuffer = ( info.type == 1 ) ? new Uint16Array( sz ) : new Uint32Array( sz );\n\n\t\t\tlet tmpBufferEnd = 0;\n\t\t\tlet writePtr = 0;\n\t\t\tconst ptr = new Array( 4 );\n\n\t\t\tfor ( let y = 0; y < info.lines; y ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < info.channels; c ++ ) {\n\n\t\t\t\t\tlet pixel = 0;\n\n\t\t\t\t\tswitch ( info.type ) {\n\n\t\t\t\t\t\tcase 1:\n\n\t\t\t\t\t\t\tptr[ 0 ] = tmpBufferEnd;\n\t\t\t\t\t\t\tptr[ 1 ] = ptr[ 0 ] + info.width;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[ 1 ] + info.width;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < info.width; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst diff = ( rawBuffer[ ptr[ 0 ] ++ ] << 8 ) | rawBuffer[ ptr[ 1 ] ++ ];\n\n\t\t\t\t\t\t\t\tpixel += diff;\n\n\t\t\t\t\t\t\t\ttmpBuffer[ writePtr ] = pixel;\n\t\t\t\t\t\t\t\twritePtr ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 2:\n\n\t\t\t\t\t\t\tptr[ 0 ] = tmpBufferEnd;\n\t\t\t\t\t\t\tptr[ 1 ] = ptr[ 0 ] + info.width;\n\t\t\t\t\t\t\tptr[ 2 ] = ptr[ 1 ] + info.width;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[ 2 ] + info.width;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < info.width; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst diff = ( rawBuffer[ ptr[ 0 ] ++ ] << 24 ) | ( rawBuffer[ ptr[ 1 ] ++ ] << 16 ) | ( rawBuffer[ ptr[ 2 ] ++ ] << 8 );\n\n\t\t\t\t\t\t\t\tpixel += diff;\n\n\t\t\t\t\t\t\t\ttmpBuffer[ writePtr ] = pixel;\n\t\t\t\t\t\t\t\twritePtr ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressDWA( info ) {\n\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\t\t\tconst outBuffer = new Uint8Array( info.width * info.lines * ( info.channels * info.type * INT16_SIZE ) );\n\n\t\t\t// Read compression header information\n\t\t\tconst dwaHeader = {\n\n\t\t\t\tversion: parseInt64( inDataView, inOffset ),\n\t\t\t\tunknownUncompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tunknownCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tacCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tdcCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleUncompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleRawSize: parseInt64( inDataView, inOffset ),\n\t\t\t\ttotalAcUncompressedCount: parseInt64( inDataView, inOffset ),\n\t\t\t\ttotalDcUncompressedCount: parseInt64( inDataView, inOffset ),\n\t\t\t\tacCompression: parseInt64( inDataView, inOffset )\n\n\t\t\t};\n\n\t\t\tif ( dwaHeader.version < 2 )\n\t\t\t\tthrow new Error( 'EXRLoader.parse: ' + EXRHeader.compression + ' version ' + dwaHeader.version + ' is unsupported' );\n\n\t\t\t// Read channel ruleset information\n\t\t\tconst channelRules = new Array();\n\t\t\tlet ruleSize = parseUint16( inDataView, inOffset ) - INT16_SIZE;\n\n\t\t\twhile ( ruleSize > 0 ) {\n\n\t\t\t\tconst name = parseNullTerminatedString( inDataView.buffer, inOffset );\n\t\t\t\tconst value = parseUint8( inDataView, inOffset );\n\t\t\t\tconst compression = ( value >> 2 ) & 3;\n\t\t\t\tconst csc = ( value >> 4 ) - 1;\n\t\t\t\tconst index = new Int8Array( [ csc ] )[ 0 ];\n\t\t\t\tconst type = parseUint8( inDataView, inOffset );\n\n\t\t\t\tchannelRules.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\tindex: index,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tcompression: compression,\n\t\t\t\t} );\n\n\t\t\t\truleSize -= name.length + 3;\n\n\t\t\t}\n\n\t\t\t// Classify channels\n\t\t\tconst channels = EXRHeader.channels;\n\t\t\tconst channelData = new Array( info.channels );\n\n\t\t\tfor ( let i = 0; i < info.channels; ++ i ) {\n\n\t\t\t\tconst cd = channelData[ i ] = {};\n\t\t\t\tconst channel = channels[ i ];\n\n\t\t\t\tcd.name = channel.name;\n\t\t\t\tcd.compression = UNKNOWN;\n\t\t\t\tcd.decoded = false;\n\t\t\t\tcd.type = channel.pixelType;\n\t\t\t\tcd.pLinear = channel.pLinear;\n\t\t\t\tcd.width = info.width;\n\t\t\t\tcd.height = info.lines;\n\n\t\t\t}\n\n\t\t\tconst cscSet = {\n\t\t\t\tidx: new Array( 3 )\n\t\t\t};\n\n\t\t\tfor ( let offset = 0; offset < info.channels; ++ offset ) {\n\n\t\t\t\tconst cd = channelData[ offset ];\n\n\t\t\t\tfor ( let i = 0; i < channelRules.length; ++ i ) {\n\n\t\t\t\t\tconst rule = channelRules[ i ];\n\n\t\t\t\t\tif ( cd.name == rule.name ) {\n\n\t\t\t\t\t\tcd.compression = rule.compression;\n\n\t\t\t\t\t\tif ( rule.index >= 0 ) {\n\n\t\t\t\t\t\t\tcscSet.idx[ rule.index ] = offset;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcd.offset = offset;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet acBuffer, dcBuffer, rleBuffer;\n\n\t\t\t// Read DCT - AC component data\n\t\t\tif ( dwaHeader.acCompressedSize > 0 ) {\n\n\t\t\t\tswitch ( dwaHeader.acCompression ) {\n\n\t\t\t\t\tcase STATIC_HUFFMAN:\n\n\t\t\t\t\t\tacBuffer = new Uint16Array( dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\thufUncompress( info.array, inDataView, inOffset, dwaHeader.acCompressedSize, acBuffer, dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase DEFLATE:\n\n\t\t\t\t\t\tconst compressed = info.array.slice( inOffset.value, inOffset.value + dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\tconst data = fflate.unzlibSync( compressed ); // eslint-disable-line no-undef\n\t\t\t\t\t\tacBuffer = new Uint16Array( data.buffer );\n\t\t\t\t\t\tinOffset.value += dwaHeader.totalAcUncompressedCount;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Read DCT - DC component data\n\t\t\tif ( dwaHeader.dcCompressedSize > 0 ) {\n\n\t\t\t\tconst zlibInfo = {\n\t\t\t\t\tarray: info.array,\n\t\t\t\t\toffset: inOffset,\n\t\t\t\t\tsize: dwaHeader.dcCompressedSize\n\t\t\t\t};\n\t\t\t\tdcBuffer = new Uint16Array( uncompressZIP( zlibInfo ).buffer );\n\t\t\t\tinOffset.value += dwaHeader.dcCompressedSize;\n\n\t\t\t}\n\n\t\t\t// Read RLE compressed data\n\t\t\tif ( dwaHeader.rleRawSize > 0 ) {\n\n\t\t\t\tconst compressed = info.array.slice( inOffset.value, inOffset.value + dwaHeader.rleCompressedSize );\n\t\t\t\tconst data = fflate.unzlibSync( compressed ); // eslint-disable-line no-undef\n\t\t\t\trleBuffer = decodeRunLength( data.buffer );\n\n\t\t\t\tinOffset.value += dwaHeader.rleCompressedSize;\n\n\t\t\t}\n\n\t\t\t// Prepare outbuffer data offset\n\t\t\tlet outBufferEnd = 0;\n\t\t\tconst rowOffsets = new Array( channelData.length );\n\t\t\tfor ( let i = 0; i < rowOffsets.length; ++ i ) {\n\n\t\t\t\trowOffsets[ i ] = new Array();\n\n\t\t\t}\n\n\t\t\tfor ( let y = 0; y < info.lines; ++ y ) {\n\n\t\t\t\tfor ( let chan = 0; chan < channelData.length; ++ chan ) {\n\n\t\t\t\t\trowOffsets[ chan ].push( outBufferEnd );\n\t\t\t\t\toutBufferEnd += channelData[ chan ].width * info.type * INT16_SIZE;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Lossy DCT decode RGB channels\n\t\t\tlossyDctDecode( cscSet, rowOffsets, channelData, acBuffer, dcBuffer, outBuffer );\n\n\t\t\t// Decode other channels\n\t\t\tfor ( let i = 0; i < channelData.length; ++ i ) {\n\n\t\t\t\tconst cd = channelData[ i ];\n\n\t\t\t\tif ( cd.decoded ) continue;\n\n\t\t\t\tswitch ( cd.compression ) {\n\n\t\t\t\t\tcase RLE:\n\n\t\t\t\t\t\tlet row = 0;\n\t\t\t\t\t\tlet rleOffset = 0;\n\n\t\t\t\t\t\tfor ( let y = 0; y < info.lines; ++ y ) {\n\n\t\t\t\t\t\t\tlet rowOffsetBytes = rowOffsets[ i ][ row ];\n\n\t\t\t\t\t\t\tfor ( let x = 0; x < cd.width; ++ x ) {\n\n\t\t\t\t\t\t\t\tfor ( let byte = 0; byte < INT16_SIZE * cd.type; ++ byte ) {\n\n\t\t\t\t\t\t\t\t\toutBuffer[ rowOffsetBytes ++ ] = rleBuffer[ rleOffset + byte * cd.width * cd.height ];\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\trleOffset ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\trow ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase LOSSY_DCT: // skip\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( 'EXRLoader.parse: unsupported channel compression' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( outBuffer.buffer );\n\n\t\t}\n\n\t\tfunction parseNullTerminatedString( buffer, offset ) {\n\n\t\t\tconst uintBuffer = new Uint8Array( buffer );\n\t\t\tlet endOffset = 0;\n\n\t\t\twhile ( uintBuffer[ offset.value + endOffset ] != 0 ) {\n\n\t\t\t\tendOffset += 1;\n\n\t\t\t}\n\n\t\t\tconst stringValue = new TextDecoder().decode(\n\t\t\t\tuintBuffer.slice( offset.value, offset.value + endOffset )\n\t\t\t);\n\n\t\t\toffset.value = offset.value + endOffset + 1;\n\n\t\t\treturn stringValue;\n\n\t\t}\n\n\t\tfunction parseFixedLengthString( buffer, offset, size ) {\n\n\t\t\tconst stringValue = new TextDecoder().decode(\n\t\t\t\tnew Uint8Array( buffer ).slice( offset.value, offset.value + size )\n\t\t\t);\n\n\t\t\toffset.value = offset.value + size;\n\n\t\t\treturn stringValue;\n\n\t\t}\n\n\t\tfunction parseRational( dataView, offset ) {\n\n\t\t\tconst x = parseInt32( dataView, offset );\n\t\t\tconst y = parseUint32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseTimecode( dataView, offset ) {\n\n\t\t\tconst x = parseUint32( dataView, offset );\n\t\t\tconst y = parseUint32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseInt32( dataView, offset ) {\n\n\t\t\tconst Int32 = dataView.getInt32( offset.value, true );\n\n\t\t\toffset.value = offset.value + INT32_SIZE;\n\n\t\t\treturn Int32;\n\n\t\t}\n\n\t\tfunction parseUint32( dataView, offset ) {\n\n\t\t\tconst Uint32 = dataView.getUint32( offset.value, true );\n\n\t\t\toffset.value = offset.value + INT32_SIZE;\n\n\t\t\treturn Uint32;\n\n\t\t}\n\n\t\tfunction parseUint8Array( uInt8Array, offset ) {\n\n\t\t\tconst Uint8 = uInt8Array[ offset.value ];\n\n\t\t\toffset.value = offset.value + INT8_SIZE;\n\n\t\t\treturn Uint8;\n\n\t\t}\n\n\t\tfunction parseUint8( dataView, offset ) {\n\n\t\t\tconst Uint8 = dataView.getUint8( offset.value );\n\n\t\t\toffset.value = offset.value + INT8_SIZE;\n\n\t\t\treturn Uint8;\n\n\t\t}\n\n\t\tconst parseInt64 = function ( dataView, offset ) {\n\n\t\t\tlet int;\n\n\t\t\tif ( 'getBigInt64' in DataView.prototype ) {\n\n\t\t\t\tint = Number( dataView.getBigInt64( offset.value, true ) );\n\n\t\t\t} else {\n\n\t\t\t\tint = dataView.getUint32( offset.value + 4, true ) + Number( dataView.getUint32( offset.value, true ) << 32 );\n\n\t\t\t}\n\n\t\t\toffset.value += ULONG_SIZE;\n\n\t\t\treturn int;\n\n\t\t};\n\n\t\tfunction parseFloat32( dataView, offset ) {\n\n\t\t\tconst float = dataView.getFloat32( offset.value, true );\n\n\t\t\toffset.value += FLOAT32_SIZE;\n\n\t\t\treturn float;\n\n\t\t}\n\n\t\tfunction decodeFloat32( dataView, offset ) {\n\n\t\t\treturn DataUtils.toHalfFloat( parseFloat32( dataView, offset ) );\n\n\t\t}\n\n\t\t// https://stackoverflow.com/questions/5678432/decompressing-half-precision-floats-in-javascript\n\t\tfunction decodeFloat16( binary ) {\n\n\t\t\tconst exponent = ( binary & 0x7C00 ) >> 10,\n\t\t\t\tfraction = binary & 0x03FF;\n\n\t\t\treturn ( binary >> 15 ? - 1 : 1 ) * (\n\t\t\t\texponent ?\n\t\t\t\t\t(\n\t\t\t\t\t\texponent === 0x1F ?\n\t\t\t\t\t\t\tfraction ? NaN : Infinity :\n\t\t\t\t\t\t\tMath.pow( 2, exponent - 15 ) * ( 1 + fraction / 0x400 )\n\t\t\t\t\t) :\n\t\t\t\t\t6.103515625e-5 * ( fraction / 0x400 )\n\t\t\t);\n\n\t\t}\n\n\t\tfunction parseUint16( dataView, offset ) {\n\n\t\t\tconst Uint16 = dataView.getUint16( offset.value, true );\n\n\t\t\toffset.value += INT16_SIZE;\n\n\t\t\treturn Uint16;\n\n\t\t}\n\n\t\tfunction parseFloat16( buffer, offset ) {\n\n\t\t\treturn decodeFloat16( parseUint16( buffer, offset ) );\n\n\t\t}\n\n\t\tfunction parseChlist( dataView, buffer, offset, size ) {\n\n\t\t\tconst startOffset = offset.value;\n\t\t\tconst channels = [];\n\n\t\t\twhile ( offset.value < ( startOffset + size - 1 ) ) {\n\n\t\t\t\tconst name = parseNullTerminatedString( buffer, offset );\n\t\t\t\tconst pixelType = parseInt32( dataView, offset );\n\t\t\t\tconst pLinear = parseUint8( dataView, offset );\n\t\t\t\toffset.value += 3; // reserved, three chars\n\t\t\t\tconst xSampling = parseInt32( dataView, offset );\n\t\t\t\tconst ySampling = parseInt32( dataView, offset );\n\n\t\t\t\tchannels.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\tpixelType: pixelType,\n\t\t\t\t\tpLinear: pLinear,\n\t\t\t\t\txSampling: xSampling,\n\t\t\t\t\tySampling: ySampling\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\toffset.value += 1;\n\n\t\t\treturn channels;\n\n\t\t}\n\n\t\tfunction parseChromaticities( dataView, offset ) {\n\n\t\t\tconst redX = parseFloat32( dataView, offset );\n\t\t\tconst redY = parseFloat32( dataView, offset );\n\t\t\tconst greenX = parseFloat32( dataView, offset );\n\t\t\tconst greenY = parseFloat32( dataView, offset );\n\t\t\tconst blueX = parseFloat32( dataView, offset );\n\t\t\tconst blueY = parseFloat32( dataView, offset );\n\t\t\tconst whiteX = parseFloat32( dataView, offset );\n\t\t\tconst whiteY = parseFloat32( dataView, offset );\n\n\t\t\treturn { redX: redX, redY: redY, greenX: greenX, greenY: greenY, blueX: blueX, blueY: blueY, whiteX: whiteX, whiteY: whiteY };\n\n\t\t}\n\n\t\tfunction parseCompression( dataView, offset ) {\n\n\t\t\tconst compressionCodes = [\n\t\t\t\t'NO_COMPRESSION',\n\t\t\t\t'RLE_COMPRESSION',\n\t\t\t\t'ZIPS_COMPRESSION',\n\t\t\t\t'ZIP_COMPRESSION',\n\t\t\t\t'PIZ_COMPRESSION',\n\t\t\t\t'PXR24_COMPRESSION',\n\t\t\t\t'B44_COMPRESSION',\n\t\t\t\t'B44A_COMPRESSION',\n\t\t\t\t'DWAA_COMPRESSION',\n\t\t\t\t'DWAB_COMPRESSION'\n\t\t\t];\n\n\t\t\tconst compression = parseUint8( dataView, offset );\n\n\t\t\treturn compressionCodes[ compression ];\n\n\t\t}\n\n\t\tfunction parseBox2i( dataView, offset ) {\n\n\t\t\tconst xMin = parseUint32( dataView, offset );\n\t\t\tconst yMin = parseUint32( dataView, offset );\n\t\t\tconst xMax = parseUint32( dataView, offset );\n\t\t\tconst yMax = parseUint32( dataView, offset );\n\n\t\t\treturn { xMin: xMin, yMin: yMin, xMax: xMax, yMax: yMax };\n\n\t\t}\n\n\t\tfunction parseLineOrder( dataView, offset ) {\n\n\t\t\tconst lineOrders = [\n\t\t\t\t'INCREASING_Y'\n\t\t\t];\n\n\t\t\tconst lineOrder = parseUint8( dataView, offset );\n\n\t\t\treturn lineOrders[ lineOrder ];\n\n\t\t}\n\n\t\tfunction parseV2f( dataView, offset ) {\n\n\t\t\tconst x = parseFloat32( dataView, offset );\n\t\t\tconst y = parseFloat32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseV3f( dataView, offset ) {\n\n\t\t\tconst x = parseFloat32( dataView, offset );\n\t\t\tconst y = parseFloat32( dataView, offset );\n\t\t\tconst z = parseFloat32( dataView, offset );\n\n\t\t\treturn [ x, y, z ];\n\n\t\t}\n\n\t\tfunction parseValue( dataView, buffer, offset, type, size ) {\n\n\t\t\tif ( type === 'string' || type === 'stringvector' || type === 'iccProfile' ) {\n\n\t\t\t\treturn parseFixedLengthString( buffer, offset, size );\n\n\t\t\t} else if ( type === 'chlist' ) {\n\n\t\t\t\treturn parseChlist( dataView, buffer, offset, size );\n\n\t\t\t} else if ( type === 'chromaticities' ) {\n\n\t\t\t\treturn parseChromaticities( dataView, offset );\n\n\t\t\t} else if ( type === 'compression' ) {\n\n\t\t\t\treturn parseCompression( dataView, offset );\n\n\t\t\t} else if ( type === 'box2i' ) {\n\n\t\t\t\treturn parseBox2i( dataView, offset );\n\n\t\t\t} else if ( type === 'lineOrder' ) {\n\n\t\t\t\treturn parseLineOrder( dataView, offset );\n\n\t\t\t} else if ( type === 'float' ) {\n\n\t\t\t\treturn parseFloat32( dataView, offset );\n\n\t\t\t} else if ( type === 'v2f' ) {\n\n\t\t\t\treturn parseV2f( dataView, offset );\n\n\t\t\t} else if ( type === 'v3f' ) {\n\n\t\t\t\treturn parseV3f( dataView, offset );\n\n\t\t\t} else if ( type === 'int' ) {\n\n\t\t\t\treturn parseInt32( dataView, offset );\n\n\t\t\t} else if ( type === 'rational' ) {\n\n\t\t\t\treturn parseRational( dataView, offset );\n\n\t\t\t} else if ( type === 'timecode' ) {\n\n\t\t\t\treturn parseTimecode( dataView, offset );\n\n\t\t\t} else if ( type === 'preview' ) {\n\n\t\t\t\toffset.value += size;\n\t\t\t\treturn 'skipped';\n\n\t\t\t} else {\n\n\t\t\t\toffset.value += size;\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseHeader( dataView, buffer, offset ) {\n\n\t\t\tconst EXRHeader = {};\n\n\t\t\tif ( dataView.getUint32( 0, true ) != 20000630 ) { // magic\n\n\t\t\t\tthrow new Error( 'THREE.EXRLoader: provided file doesn\\'t appear to be in OpenEXR format.' );\n\n\t\t\t}\n\n\t\t\tEXRHeader.version = dataView.getUint8( 4 );\n\n\t\t\tconst spec = dataView.getUint8( 5 ); // fullMask\n\n\t\t\tEXRHeader.spec = {\n\t\t\t\tsingleTile: !! ( spec & 2 ),\n\t\t\t\tlongName: !! ( spec & 4 ),\n\t\t\t\tdeepFormat: !! ( spec & 8 ),\n\t\t\t\tmultiPart: !! ( spec & 16 ),\n\t\t\t};\n\n\t\t\t// start of header\n\n\t\t\toffset.value = 8; // start at 8 - after pre-amble\n\n\t\t\tlet keepReading = true;\n\n\t\t\twhile ( keepReading ) {\n\n\t\t\t\tconst attributeName = parseNullTerminatedString( buffer, offset );\n\n\t\t\t\tif ( attributeName == 0 ) {\n\n\t\t\t\t\tkeepReading = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst attributeType = parseNullTerminatedString( buffer, offset );\n\t\t\t\t\tconst attributeSize = parseUint32( dataView, offset );\n\t\t\t\t\tconst attributeValue = parseValue( dataView, buffer, offset, attributeType, attributeSize );\n\n\t\t\t\t\tif ( attributeValue === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( `EXRLoader.parse: skipped unknown header attribute type \\'${attributeType}\\'.` );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tEXRHeader[ attributeName ] = attributeValue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( spec != 0 ) {\n\n\t\t\t\tconsole.error( 'EXRHeader:', EXRHeader );\n\t\t\t\tthrow new Error( 'THREE.EXRLoader: provided file is currently unsupported.' );\n\n\t\t\t}\n\n\t\t\treturn EXRHeader;\n\n\t\t}\n\n\t\tfunction setupDecoder( EXRHeader, dataView, uInt8Array, offset, outputType ) {\n\n\t\t\tconst EXRDecoder = {\n\t\t\t\tsize: 0,\n\t\t\t\tviewer: dataView,\n\t\t\t\tarray: uInt8Array,\n\t\t\t\toffset: offset,\n\t\t\t\twidth: EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1,\n\t\t\t\theight: EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1,\n\t\t\t\tchannels: EXRHeader.channels.length,\n\t\t\t\tbytesPerLine: null,\n\t\t\t\tlines: null,\n\t\t\t\tinputSize: null,\n\t\t\t\ttype: EXRHeader.channels[ 0 ].pixelType,\n\t\t\t\tuncompress: null,\n\t\t\t\tgetter: null,\n\t\t\t\tformat: null,\n\t\t\t\tencoding: null,\n\t\t\t};\n\n\t\t\tswitch ( EXRHeader.compression ) {\n\n\t\t\t\tcase 'NO_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressRAW;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RLE_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressRLE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZIPS_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressZIP;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZIP_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 16;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressZIP;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PIZ_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 32;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressPIZ;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PXR24_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 16;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressPXR;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DWAA_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 32;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressDWA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DWAB_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 256;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressDWA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'EXRLoader.parse: ' + EXRHeader.compression + ' is unsupported' );\n\n\t\t\t}\n\n\t\t\tEXRDecoder.scanlineBlockSize = EXRDecoder.lines;\n\n\t\t\tif ( EXRDecoder.type == 1 ) {\n\n\t\t\t\t// half\n\t\t\t\tswitch ( outputType ) {\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat16;\n\t\t\t\t\t\tEXRDecoder.inputSize = INT16_SIZE;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseUint16;\n\t\t\t\t\t\tEXRDecoder.inputSize = INT16_SIZE;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( EXRDecoder.type == 2 ) {\n\n\t\t\t\t// float\n\t\t\t\tswitch ( outputType ) {\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat32;\n\t\t\t\t\t\tEXRDecoder.inputSize = FLOAT32_SIZE;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tEXRDecoder.getter = decodeFloat32;\n\t\t\t\t\t\tEXRDecoder.inputSize = FLOAT32_SIZE;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'EXRLoader.parse: unsupported pixelType ' + EXRDecoder.type + ' for ' + EXRHeader.compression + '.' );\n\n\t\t\t}\n\n\t\t\tEXRDecoder.blockCount = ( EXRHeader.dataWindow.yMax + 1 ) / EXRDecoder.scanlineBlockSize;\n\n\t\t\tfor ( let i = 0; i < EXRDecoder.blockCount; i ++ )\n\t\t\t\tparseInt64( dataView, offset ); // scanlineOffset\n\n\t\t\t// we should be passed the scanline offset table, ready to start reading pixel data.\n\n\t\t\t// RGB images will be converted to RGBA format, preventing software emulation in select devices.\n\t\t\tEXRDecoder.outputChannels = ( ( EXRDecoder.channels == 3 ) ? 4 : EXRDecoder.channels );\n\t\t\tconst size = EXRDecoder.width * EXRDecoder.height * EXRDecoder.outputChannels;\n\n\t\t\tswitch ( outputType ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\t\tEXRDecoder.byteArray = new Float32Array( size );\n\n\t\t\t\t\t// Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten\n\t\t\t\t\tif ( EXRDecoder.channels < EXRDecoder.outputChannels )\n\t\t\t\t\t\tEXRDecoder.byteArray.fill( 1, 0, size );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase HalfFloatType:\n\t\t\t\t\tEXRDecoder.byteArray = new Uint16Array( size );\n\n\t\t\t\t\tif ( EXRDecoder.channels < EXRDecoder.outputChannels )\n\t\t\t\t\t\tEXRDecoder.byteArray.fill( 0x3C00, 0, size ); // Uint16Array holds half float data, 0x3C00 is 1\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error( 'THREE.EXRLoader: unsupported type: ', outputType );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tEXRDecoder.bytesPerLine = EXRDecoder.width * EXRDecoder.inputSize * EXRDecoder.channels;\n\n\t\t\tif ( EXRDecoder.outputChannels == 4 ) {\n\n\t\t\t\tEXRDecoder.format = RGBAFormat;\n\t\t\t\tEXRDecoder.encoding = LinearEncoding;\n\n\t\t\t} else {\n\n\t\t\t\tEXRDecoder.format = RedFormat;\n\t\t\t\tEXRDecoder.encoding = LinearEncoding;\n\n\t\t\t}\n\n\t\t\treturn EXRDecoder;\n\n\t\t}\n\n\t\t// start parsing file [START]\n\n\t\tconst bufferDataView = new DataView( buffer );\n\t\tconst uInt8Array = new Uint8Array( buffer );\n\t\tconst offset = { value: 0 };\n\n\t\t// get header information and validate format.\n\t\tconst EXRHeader = parseHeader( bufferDataView, buffer, offset );\n\n\t\t// get input compression information and prepare decoding.\n\t\tconst EXRDecoder = setupDecoder( EXRHeader, bufferDataView, uInt8Array, offset, this.type );\n\n\t\tconst tmpOffset = { value: 0 };\n\t\tconst channelOffsets = { R: 0, G: 1, B: 2, A: 3, Y: 0 };\n\n\t\tfor ( let scanlineBlockIdx = 0; scanlineBlockIdx < EXRDecoder.height / EXRDecoder.scanlineBlockSize; scanlineBlockIdx ++ ) {\n\n\t\t\tconst line = parseUint32( bufferDataView, offset ); // line_no\n\t\t\tEXRDecoder.size = parseUint32( bufferDataView, offset ); // data_len\n\t\t\tEXRDecoder.lines = ( ( line + EXRDecoder.scanlineBlockSize > EXRDecoder.height ) ? ( EXRDecoder.height - line ) : EXRDecoder.scanlineBlockSize );\n\n\t\t\tconst isCompressed = EXRDecoder.size < EXRDecoder.lines * EXRDecoder.bytesPerLine;\n\t\t\tconst viewer = isCompressed ? EXRDecoder.uncompress( EXRDecoder ) : uncompressRAW( EXRDecoder );\n\n\t\t\toffset.value += EXRDecoder.size;\n\n\t\t\tfor ( let line_y = 0; line_y < EXRDecoder.scanlineBlockSize; line_y ++ ) {\n\n\t\t\t\tconst true_y = line_y + scanlineBlockIdx * EXRDecoder.scanlineBlockSize;\n\t\t\t\tif ( true_y >= EXRDecoder.height ) break;\n\n\t\t\t\tfor ( let channelID = 0; channelID < EXRDecoder.channels; channelID ++ ) {\n\n\t\t\t\t\tconst cOff = channelOffsets[ EXRHeader.channels[ channelID ].name ];\n\n\t\t\t\t\tfor ( let x = 0; x < EXRDecoder.width; x ++ ) {\n\n\t\t\t\t\t\ttmpOffset.value = ( line_y * ( EXRDecoder.channels * EXRDecoder.width ) + channelID * EXRDecoder.width + x ) * EXRDecoder.inputSize;\n\t\t\t\t\t\tconst outIndex = ( EXRDecoder.height - 1 - true_y ) * ( EXRDecoder.width * EXRDecoder.outputChannels ) + x * EXRDecoder.outputChannels + cOff;\n\t\t\t\t\t\tEXRDecoder.byteArray[ outIndex ] = EXRDecoder.getter( viewer, tmpOffset );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\theader: EXRHeader,\n\t\t\twidth: EXRDecoder.width,\n\t\t\theight: EXRDecoder.height,\n\t\t\tdata: EXRDecoder.byteArray,\n\t\t\tformat: EXRDecoder.format,\n\t\t\tencoding: EXRDecoder.encoding,\n\t\t\ttype: this.type,\n\t\t};\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\ttexture.encoding = texData.encoding;\n\t\t\ttexture.minFilter = LinearFilter;\n\t\t\ttexture.magFilter = LinearFilter;\n\t\t\ttexture.generateMipmaps = false;\n\t\t\ttexture.flipY = false;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { EXRLoader };\n","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearEncoding,\n\tLinearFilter\n} from 'three';\n\n// https://github.com/mrdoob/three.js/issues/5552\n// http://en.wikipedia.org/wiki/RGBE_image_format\n\nclass RGBELoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\t// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n\tparse( buffer ) {\n\n\t\tconst\n\t\t\t/* return codes for rgbe routines */\n\t\t\t//RGBE_RETURN_SUCCESS = 0,\n\t\t\tRGBE_RETURN_FAILURE = - 1,\n\n\t\t\t/* default error routine. change this to change error handling */\n\t\t\trgbe_read_error = 1,\n\t\t\trgbe_write_error = 2,\n\t\t\trgbe_format_error = 3,\n\t\t\trgbe_memory_error = 4,\n\t\t\trgbe_error = function ( rgbe_error_code, msg ) {\n\n\t\t\t\tswitch ( rgbe_error_code ) {\n\n\t\t\t\t\tcase rgbe_read_error: console.error( 'THREE.RGBELoader Read Error: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase rgbe_write_error: console.error( 'THREE.RGBELoader Write Error: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase rgbe_format_error: console.error( 'THREE.RGBELoader Bad File Format: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase rgbe_memory_error: console.error( 'THREE.RGBELoader: Error: ' + ( msg || '' ) );\n\n\t\t\t\t}\n\n\t\t\t\treturn RGBE_RETURN_FAILURE;\n\n\t\t\t},\n\n\t\t\t/* offsets to red, green, and blue components in a data (float) pixel */\n\t\t\t//RGBE_DATA_RED = 0,\n\t\t\t//RGBE_DATA_GREEN = 1,\n\t\t\t//RGBE_DATA_BLUE = 2,\n\n\t\t\t/* number of floats per pixel, use 4 since stored in rgba image format */\n\t\t\t//RGBE_DATA_SIZE = 4,\n\n\t\t\t/* flags indicating which fields in an rgbe_header_info are valid */\n\t\t\tRGBE_VALID_PROGRAMTYPE = 1,\n\t\t\tRGBE_VALID_FORMAT = 2,\n\t\t\tRGBE_VALID_DIMENSIONS = 4,\n\n\t\t\tNEWLINE = '\\n',\n\n\t\t\tfgets = function ( buffer, lineLimit, consume ) {\n\n\t\t\t\tconst chunkSize = 128;\n\n\t\t\t\tlineLimit = ! lineLimit ? 1024 : lineLimit;\n\t\t\t\tlet p = buffer.pos,\n\t\t\t\t\ti = - 1, len = 0, s = '',\n\t\t\t\t\tchunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\twhile ( ( 0 > ( i = chunk.indexOf( NEWLINE ) ) ) && ( len < lineLimit ) && ( p < buffer.byteLength ) ) {\n\n\t\t\t\t\ts += chunk; len += chunk.length;\n\t\t\t\t\tp += chunkSize;\n\t\t\t\t\tchunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( - 1 < i ) {\n\n\t\t\t\t\t/*for (i=l-1; i>=0; i--) {\n\t\t\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t\t\t}*/\n\t\t\t\t\tif ( false !== consume ) buffer.pos += len + i + 1;\n\t\t\t\t\treturn s + chunk.slice( 0, i );\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\t/* minimal header reading. modify if you want to parse more information */\n\t\t\tRGBE_ReadHeader = function ( buffer ) {\n\n\n\t\t\t\t// regexes to parse header info fields\n\t\t\t\tconst magic_token_re = /^#\\?(\\S+)/,\n\t\t\t\t\tgamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\texposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\tformat_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n\t\t\t\t\tdimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n\n\t\t\t\t\t// RGBE format header struct\n\t\t\t\t\theader = {\n\n\t\t\t\t\t\tvalid: 0, /* indicate which fields are valid */\n\n\t\t\t\t\t\tstring: '', /* the actual header string */\n\n\t\t\t\t\t\tcomments: '', /* comments found in header */\n\n\t\t\t\t\t\tprogramtype: 'RGBE', /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */\n\n\t\t\t\t\t\tformat: '', /* RGBE format, default 32-bit_rle_rgbe */\n\n\t\t\t\t\t\tgamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */\n\n\t\t\t\t\t\texposure: 1.0, /* a value of 1.0 in an image corresponds to watts/steradian/m^2. defaults to 1.0 */\n\n\t\t\t\t\t\twidth: 0, height: 0 /* image dimensions, width/height */\n\n\t\t\t\t\t};\n\n\t\t\t\tlet line, match;\n\n\t\t\t\tif ( buffer.pos >= buffer.byteLength || ! ( line = fgets( buffer ) ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_read_error, 'no header found' );\n\n\t\t\t\t}\n\n\t\t\t\t/* if you want to require the magic token then uncomment the next line */\n\t\t\t\tif ( ! ( match = line.match( magic_token_re ) ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad initial token' );\n\n\t\t\t\t}\n\n\t\t\t\theader.valid |= RGBE_VALID_PROGRAMTYPE;\n\t\t\t\theader.programtype = match[ 1 ];\n\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\twhile ( true ) {\n\n\t\t\t\t\tline = fgets( buffer );\n\t\t\t\t\tif ( false === line ) break;\n\t\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\t\tif ( '#' === line.charAt( 0 ) ) {\n\n\t\t\t\t\t\theader.comments += line + '\\n';\n\t\t\t\t\t\tcontinue; // comment line\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( gamma_re ) ) {\n\n\t\t\t\t\t\theader.gamma = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( exposure_re ) ) {\n\n\t\t\t\t\t\theader.exposure = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( format_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_FORMAT;\n\t\t\t\t\t\theader.format = match[ 1 ];//'32-bit_rle_rgbe';\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( dimensions_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_DIMENSIONS;\n\t\t\t\t\t\theader.height = parseInt( match[ 1 ], 10 );\n\t\t\t\t\t\theader.width = parseInt( match[ 2 ], 10 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( header.valid & RGBE_VALID_FORMAT ) && ( header.valid & RGBE_VALID_DIMENSIONS ) ) break;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_FORMAT ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'missing format specifier' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_DIMENSIONS ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'missing image size specifier' );\n\n\t\t\t\t}\n\n\t\t\t\treturn header;\n\n\t\t\t},\n\n\t\t\tRGBE_ReadPixels_RLE = function ( buffer, w, h ) {\n\n\t\t\t\tconst scanline_width = w;\n\n\t\t\t\tif (\n\t\t\t\t\t// run length encoding is not allowed so read flat\n\t\t\t\t\t( ( scanline_width < 8 ) || ( scanline_width > 0x7fff ) ) ||\n\t\t\t\t\t// this file is not run length encoded\n\t\t\t\t\t( ( 2 !== buffer[ 0 ] ) || ( 2 !== buffer[ 1 ] ) || ( buffer[ 2 ] & 0x80 ) )\n\t\t\t\t) {\n\n\t\t\t\t\t// return the flat buffer\n\t\t\t\t\treturn new Uint8Array( buffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scanline_width !== ( ( buffer[ 2 ] << 8 ) | buffer[ 3 ] ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'wrong scanline width' );\n\n\t\t\t\t}\n\n\t\t\t\tconst data_rgba = new Uint8Array( 4 * w * h );\n\n\t\t\t\tif ( ! data_rgba.length ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_memory_error, 'unable to allocate buffer space' );\n\n\t\t\t\t}\n\n\t\t\t\tlet offset = 0, pos = 0;\n\n\t\t\t\tconst ptr_end = 4 * scanline_width;\n\t\t\t\tconst rgbeStart = new Uint8Array( 4 );\n\t\t\t\tconst scanline_buffer = new Uint8Array( ptr_end );\n\t\t\t\tlet num_scanlines = h;\n\n\t\t\t\t// read in each successive scanline\n\t\t\t\twhile ( ( num_scanlines > 0 ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\tif ( pos + 4 > buffer.byteLength ) {\n\n\t\t\t\t\t\treturn rgbe_error( rgbe_read_error );\n\n\t\t\t\t\t}\n\n\t\t\t\t\trgbeStart[ 0 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 1 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 2 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 3 ] = buffer[ pos ++ ];\n\n\t\t\t\t\tif ( ( 2 != rgbeStart[ 0 ] ) || ( 2 != rgbeStart[ 1 ] ) || ( ( ( rgbeStart[ 2 ] << 8 ) | rgbeStart[ 3 ] ) != scanline_width ) ) {\n\n\t\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad rgbe scanline format' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// read each of the four channels for the scanline into the buffer\n\t\t\t\t\t// first red, then green, then blue, then exponent\n\t\t\t\t\tlet ptr = 0, count;\n\n\t\t\t\t\twhile ( ( ptr < ptr_end ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\t\tcount = buffer[ pos ++ ];\n\t\t\t\t\t\tconst isEncodedRun = count > 128;\n\t\t\t\t\t\tif ( isEncodedRun ) count -= 128;\n\n\t\t\t\t\t\tif ( ( 0 === count ) || ( ptr + count > ptr_end ) ) {\n\n\t\t\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad scanline data' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( isEncodedRun ) {\n\n\t\t\t\t\t\t\t// a (encoded) run of the same value\n\t\t\t\t\t\t\tconst byteValue = buffer[ pos ++ ];\n\t\t\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\t\t\tscanline_buffer[ ptr ++ ] = byteValue;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//ptr += count;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// a literal-run\n\t\t\t\t\t\t\tscanline_buffer.set( buffer.subarray( pos, pos + count ), ptr );\n\t\t\t\t\t\t\tptr += count; pos += count;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\t// now convert data from buffer into rgba\n\t\t\t\t\t// first red, then green, then blue, then exponent (alpha)\n\t\t\t\t\tconst l = scanline_width; //scanline_buffer.byteLength;\n\t\t\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\t\t\tlet off = 0;\n\t\t\t\t\t\tdata_rgba[ offset ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 1 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 2 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 3 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnum_scanlines --;\n\n\t\t\t\t}\n\n\t\t\t\treturn data_rgba;\n\n\t\t\t};\n\n\t\tconst RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\tdestArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale;\n\t\t\tdestArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale;\n\t\t\tdestArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale;\n\t\t\tdestArray[ destOffset + 3 ] = 1;\n\n\t\t};\n\n\t\tconst RGBEByteToRGBHalf = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\t// clamping to 65504, the maximum representable value in float16\n\t\t\tdestArray[ destOffset + 0 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 1 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 2 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 3 ] = DataUtils.toHalfFloat( 1 );\n\n\t\t};\n\n\t\tconst byteArray = new Uint8Array( buffer );\n\t\tbyteArray.pos = 0;\n\t\tconst rgbe_header_info = RGBE_ReadHeader( byteArray );\n\n\t\tif ( RGBE_RETURN_FAILURE !== rgbe_header_info ) {\n\n\t\t\tconst w = rgbe_header_info.width,\n\t\t\t\th = rgbe_header_info.height,\n\t\t\t\timage_rgba_data = RGBE_ReadPixels_RLE( byteArray.subarray( byteArray.pos ), w, h );\n\n\t\t\tif ( RGBE_RETURN_FAILURE !== image_rgba_data ) {\n\n\t\t\t\tlet data, format, type;\n\t\t\t\tlet numElements;\n\n\t\t\t\tswitch ( this.type ) {\n\n\t\t\t\t\tcase FloatType:\n\n\t\t\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\t\t\tconst floatArray = new Float32Array( numElements * 4 );\n\n\t\t\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\t\t\tRGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 4 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = floatArray;\n\t\t\t\t\t\ttype = FloatType;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\t\t\tconst halfArray = new Uint16Array( numElements * 4 );\n\n\t\t\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\t\t\tRGBEByteToRGBHalf( image_rgba_data, j * 4, halfArray, j * 4 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = halfArray;\n\t\t\t\t\t\ttype = HalfFloatType;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tconsole.error( 'THREE.RGBELoader: unsupported type: ', this.type );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\twidth: w, height: h,\n\t\t\t\t\tdata: data,\n\t\t\t\t\theader: rgbe_header_info.string,\n\t\t\t\t\tgamma: rgbe_header_info.gamma,\n\t\t\t\t\texposure: rgbe_header_info.exposure,\n\t\t\t\t\tformat: format,\n\t\t\t\t\ttype: type\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\tswitch ( texture.type ) {\n\n\t\t\t\tcase FloatType:\n\n\t\t\t\t\ttexture.encoding = LinearEncoding;\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\ttexture.flipY = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\ttexture.encoding = LinearEncoding;\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\ttexture.flipY = true;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { RGBELoader };\n","import {\n\tFileLoader,\n\tLoader,\n\tShapePath\n} from 'three';\n\nclass FontLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t}\n\n\t\t\tconst font = scope.parse( json );\n\n\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\treturn new Font( json );\n\n\t}\n\n}\n\n//\n\nclass Font {\n\n\tconstructor( data ) {\n\n\t\tthis.type = 'Font';\n\n\t\tthis.data = data;\n\n\t}\n\n\tgenerateShapes( text, size = 100 ) {\n\n\t\tconst shapes = [];\n\t\tconst paths = createPaths( text, size, this.data );\n\n\t\tfor ( let p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n}\n\nfunction createPaths( text, size, data ) {\n\n\tconst chars = Array.from( text );\n\tconst scale = size / data.resolution;\n\tconst line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\tconst paths = [];\n\n\tlet offsetX = 0, offsetY = 0;\n\n\tfor ( let i = 0; i < chars.length; i ++ ) {\n\n\t\tconst char = chars[ i ];\n\n\t\tif ( char === '\\n' ) {\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY -= line_height;\n\n\t\t} else {\n\n\t\t\tconst ret = createPath( char, scale, offsetX, offsetY, data );\n\t\t\toffsetX += ret.offsetX;\n\t\t\tpaths.push( ret.path );\n\n\t\t}\n\n\t}\n\n\treturn paths;\n\n}\n\nfunction createPath( char, scale, offsetX, offsetY, data ) {\n\n\tconst glyph = data.glyphs[ char ] || data.glyphs[ '?' ];\n\n\tif ( ! glyph ) {\n\n\t\tconsole.error( 'THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.' );\n\n\t\treturn;\n\n\t}\n\n\tconst path = new ShapePath();\n\n\tlet x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;\n\n\tif ( glyph.o ) {\n\n\t\tconst outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\tfor ( let i = 0, l = outline.length; i < l; ) {\n\n\t\t\tconst action = outline[ i ++ ];\n\n\t\t\tswitch ( action ) {\n\n\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { offsetX: glyph.ha * scale, path: path };\n\n}\n\nFont.prototype.isFont = true;\n\nexport { FontLoader, Font };\n","/**\n * Main content for the worker that handles the loading and execution of\n * modules within it.\n */\nfunction workerBootstrap() {\n var modules = Object.create(null);\n\n // Handle messages for registering a module\n function registerModule(ref, callback) {\n var id = ref.id;\n var name = ref.name;\n var dependencies = ref.dependencies; if ( dependencies === void 0 ) dependencies = [];\n var init = ref.init; if ( init === void 0 ) init = function(){};\n var getTransferables = ref.getTransferables; if ( getTransferables === void 0 ) getTransferables = null;\n\n // Only register once\n if (modules[id]) { return }\n\n try {\n // If any dependencies are modules, ensure they're registered and grab their value\n dependencies = dependencies.map(function (dep) {\n if (dep && dep.isWorkerModule) {\n registerModule(dep, function (depResult) {\n if (depResult instanceof Error) { throw depResult }\n });\n dep = modules[dep.id].value;\n }\n return dep\n });\n\n // Rehydrate functions\n init = rehydrate((\"<\" + name + \">.init\"), init);\n if (getTransferables) {\n getTransferables = rehydrate((\"<\" + name + \">.getTransferables\"), getTransferables);\n }\n\n // Initialize the module and store its value\n var value = null;\n if (typeof init === 'function') {\n value = init.apply(void 0, dependencies);\n } else {\n console.error('worker module init function failed to rehydrate');\n }\n modules[id] = {\n id: id,\n value: value,\n getTransferables: getTransferables\n };\n callback(value);\n } catch(err) {\n if (!(err && err.noLog)) {\n console.error(err);\n }\n callback(err);\n }\n }\n\n // Handle messages for calling a registered module's result function\n function callModule(ref, callback) {\n var ref$1;\n\n var id = ref.id;\n var args = ref.args;\n if (!modules[id] || typeof modules[id].value !== 'function') {\n callback(new Error((\"Worker module \" + id + \": not found or its 'init' did not return a function\")));\n }\n try {\n var result = (ref$1 = modules[id]).value.apply(ref$1, args);\n if (result && typeof result.then === 'function') {\n result.then(handleResult, function (rej) { return callback(rej instanceof Error ? rej : new Error('' + rej)); });\n } else {\n handleResult(result);\n }\n } catch(err) {\n callback(err);\n }\n function handleResult(result) {\n try {\n var tx = modules[id].getTransferables && modules[id].getTransferables(result);\n if (!tx || !Array.isArray(tx) || !tx.length) {\n tx = undefined; //postMessage is very picky about not passing null or empty transferables\n }\n callback(result, tx);\n } catch(err) {\n console.error(err);\n callback(err);\n }\n }\n }\n\n function rehydrate(name, str) {\n var result = void 0;\n self.troikaDefine = function (r) { return result = r; };\n var url = URL.createObjectURL(\n new Blob(\n [(\"/** \" + (name.replace(/\\*/g, '')) + \" **/\\n\\ntroikaDefine(\\n\" + str + \"\\n)\")],\n {type: 'application/javascript'}\n )\n );\n try {\n importScripts(url);\n } catch(err) {\n console.error(err);\n }\n URL.revokeObjectURL(url);\n delete self.troikaDefine;\n return result\n }\n\n // Handler for all messages within the worker\n self.addEventListener('message', function (e) {\n var ref = e.data;\n var messageId = ref.messageId;\n var action = ref.action;\n var data = ref.data;\n try {\n // Module registration\n if (action === 'registerModule') {\n registerModule(data, function (result) {\n if (result instanceof Error) {\n postMessage({\n messageId: messageId,\n success: false,\n error: result.message\n });\n } else {\n postMessage({\n messageId: messageId,\n success: true,\n result: {isCallable: typeof result === 'function'}\n });\n }\n });\n }\n // Invocation\n if (action === 'callModule') {\n callModule(data, function (result, transferables) {\n if (result instanceof Error) {\n postMessage({\n messageId: messageId,\n success: false,\n error: result.message\n });\n } else {\n postMessage({\n messageId: messageId,\n success: true,\n result: result\n }, transferables || undefined);\n }\n });\n }\n } catch(err) {\n postMessage({\n messageId: messageId,\n success: false,\n error: err.stack\n });\n }\n });\n}\n\n/**\n * Fallback for `defineWorkerModule` that behaves identically but runs in the main\n * thread, for when the execution environment doesn't support web workers or they\n * are disallowed due to e.g. CSP security restrictions.\n */\nfunction defineMainThreadModule(options) {\n var moduleFunc = function() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n return moduleFunc._getInitResult().then(function (initResult) {\n if (typeof initResult === 'function') {\n return initResult.apply(void 0, args)\n } else {\n throw new Error('Worker module function was called but `init` did not return a callable function')\n }\n })\n };\n moduleFunc._getInitResult = function() {\n // We can ignore getTransferables in main thread. TODO workerId?\n var dependencies = options.dependencies;\n var init = options.init;\n\n // Resolve dependencies\n dependencies = Array.isArray(dependencies) ? dependencies.map(function (dep) { return dep && dep._getInitResult ? dep._getInitResult() : dep; }\n ) : [];\n\n // Invoke init with the resolved dependencies\n var initPromise = Promise.all(dependencies).then(function (deps) {\n return init.apply(null, deps)\n });\n\n // Cache the resolved promise for subsequent calls\n moduleFunc._getInitResult = function () { return initPromise; };\n\n return initPromise\n };\n return moduleFunc\n}\n\nvar supportsWorkers = function () {\n var supported = false;\n\n // Only attempt worker initialization in browsers; elsewhere it would just be\n // noise e.g. loading into a Node environment for SSR.\n if (typeof window !== 'undefined' && typeof window.document !== 'undefined') {\n try {\n // TODO additional checks for things like importScripts within the worker?\n // Would need to be an async check.\n var worker = new Worker(\n URL.createObjectURL(new Blob([''], { type: 'application/javascript' }))\n );\n worker.terminate();\n supported = true;\n } catch (err) {\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') ; else {\n console.log(\n (\"Troika createWorkerModule: web workers not allowed; falling back to main thread execution. Cause: [\" + (err.message) + \"]\")\n );\n }\n }\n }\n\n // Cached result\n supportsWorkers = function () { return supported; };\n return supported\n};\n\nvar _workerModuleId = 0;\nvar _messageId = 0;\nvar _allowInitAsString = false;\nvar workers = Object.create(null);\nvar registeredModules = Object.create(null); //workerId -> Set\nvar openRequests = Object.create(null);\n\n\n/**\n * Define a module of code that will be executed with a web worker. This provides a simple\n * interface for moving chunks of logic off the main thread, and managing their dependencies\n * among one another.\n *\n * @param {object} options\n * @param {function} options.init\n * @param {array} [options.dependencies]\n * @param {function} [options.getTransferables]\n * @param {string} [options.name]\n * @param {string} [options.workerId]\n * @return {function(...[*]): {then}}\n */\nfunction defineWorkerModule(options) {\n if ((!options || typeof options.init !== 'function') && !_allowInitAsString) {\n throw new Error('requires `options.init` function')\n }\n var dependencies = options.dependencies;\n var init = options.init;\n var getTransferables = options.getTransferables;\n var workerId = options.workerId;\n\n if (!supportsWorkers()) {\n return defineMainThreadModule(options)\n }\n\n if (workerId == null) {\n workerId = '#default';\n }\n var id = \"workerModule\" + (++_workerModuleId);\n var name = options.name || id;\n var registrationPromise = null;\n\n dependencies = dependencies && dependencies.map(function (dep) {\n // Wrap raw functions as worker modules with no dependencies\n if (typeof dep === 'function' && !dep.workerModuleData) {\n _allowInitAsString = true;\n dep = defineWorkerModule({\n workerId: workerId,\n name: (\"<\" + name + \"> function dependency: \" + (dep.name)),\n init: (\"function(){return (\\n\" + (stringifyFunction(dep)) + \"\\n)}\")\n });\n _allowInitAsString = false;\n }\n // Grab postable data for worker modules\n if (dep && dep.workerModuleData) {\n dep = dep.workerModuleData;\n }\n return dep\n });\n\n function moduleFunc() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n // Register this module if needed\n if (!registrationPromise) {\n registrationPromise = callWorker(workerId,'registerModule', moduleFunc.workerModuleData);\n var unregister = function () {\n registrationPromise = null;\n registeredModules[workerId].delete(unregister);\n }\n ;(registeredModules[workerId] || (registeredModules[workerId] = new Set())).add(unregister);\n }\n\n // Invoke the module, returning a promise\n return registrationPromise.then(function (ref) {\n var isCallable = ref.isCallable;\n\n if (isCallable) {\n return callWorker(workerId,'callModule', {id: id, args: args})\n } else {\n throw new Error('Worker module function was called but `init` did not return a callable function')\n }\n })\n }\n moduleFunc.workerModuleData = {\n isWorkerModule: true,\n id: id,\n name: name,\n dependencies: dependencies,\n init: stringifyFunction(init),\n getTransferables: getTransferables && stringifyFunction(getTransferables)\n };\n return moduleFunc\n}\n\n/**\n * Terminate an active Worker by a workerId that was passed to defineWorkerModule.\n * This only terminates the Worker itself; the worker module will remain available\n * and if you call it again its Worker will be respawned.\n * @param {string} workerId\n */\nfunction terminateWorker(workerId) {\n // Unregister all modules that were registered in that worker\n if (registeredModules[workerId]) {\n registeredModules[workerId].forEach(function (unregister) {\n unregister();\n });\n }\n // Terminate the Worker object\n if (workers[workerId]) {\n workers[workerId].terminate();\n delete workers[workerId];\n }\n}\n\n/**\n * Stringifies a function into a form that can be deserialized in the worker\n * @param fn\n */\nfunction stringifyFunction(fn) {\n var str = fn.toString();\n // If it was defined in object method/property format, it needs to be modified\n if (!/^function/.test(str) && /^\\w+\\s*\\(/.test(str)) {\n str = 'function ' + str;\n }\n return str\n}\n\n\nfunction getWorker(workerId) {\n var worker = workers[workerId];\n if (!worker) {\n // Bootstrap the worker's content\n var bootstrap = stringifyFunction(workerBootstrap);\n\n // Create the worker from the bootstrap function content\n worker = workers[workerId] = new Worker(\n URL.createObjectURL(\n new Blob(\n [(\"/** Worker Module Bootstrap: \" + (workerId.replace(/\\*/g, '')) + \" **/\\n\\n;(\" + bootstrap + \")()\")],\n {type: 'application/javascript'}\n )\n )\n );\n\n // Single handler for response messages from the worker\n worker.onmessage = function (e) {\n var response = e.data;\n var msgId = response.messageId;\n var callback = openRequests[msgId];\n if (!callback) {\n throw new Error('WorkerModule response with empty or unknown messageId')\n }\n delete openRequests[msgId];\n callback(response);\n };\n }\n return worker\n}\n\n// Issue a call to the worker with a callback to handle the response\nfunction callWorker(workerId, action, data) {\n return new Promise(function (resolve, reject) {\n var messageId = ++_messageId;\n openRequests[messageId] = function (response) {\n if (response.success) {\n resolve(response.result);\n } else {\n reject(new Error((\"Error in worker \" + action + \" call: \" + (response.error))));\n }\n };\n getWorker(workerId).postMessage({\n messageId: messageId,\n action: action,\n data: data\n });\n })\n}\n\nexport { defineWorkerModule, stringifyFunction, terminateWorker };\n","function SDFGenerator() {\nvar exports = (function (exports) {\n\n /**\n * Find the point on a quadratic bezier curve at t where t is in the range [0, 1]\n */\n function pointOnQuadraticBezier (x0, y0, x1, y1, x2, y2, t, pointOut) {\n var t2 = 1 - t;\n pointOut.x = t2 * t2 * x0 + 2 * t2 * t * x1 + t * t * x2;\n pointOut.y = t2 * t2 * y0 + 2 * t2 * t * y1 + t * t * y2;\n }\n\n /**\n * Find the point on a cubic bezier curve at t where t is in the range [0, 1]\n */\n function pointOnCubicBezier (x0, y0, x1, y1, x2, y2, x3, y3, t, pointOut) {\n var t2 = 1 - t;\n pointOut.x = t2 * t2 * t2 * x0 + 3 * t2 * t2 * t * x1 + 3 * t2 * t * t * x2 + t * t * t * x3;\n pointOut.y = t2 * t2 * t2 * y0 + 3 * t2 * t2 * t * y1 + 3 * t2 * t * t * y2 + t * t * t * y3;\n }\n\n /**\n * Parse a path string into its constituent line/curve commands, invoking a callback for each.\n * @param {string} pathString - An SVG-like path string to parse; should only contain commands: M/L/Q/C/Z\n * @param {function(\n * command: 'L'|'Q'|'C',\n * startX: number,\n * startY: number,\n * endX: number,\n * endY: number,\n * ctrl1X?: number,\n * ctrl1Y?: number,\n * ctrl2X?: number,\n * ctrl2Y?: number\n * )} commandCallback - A callback function that will be called once for each parsed path command, passing the\n * command identifier (only L/Q/C commands) and its numeric arguments.\n */\n function forEachPathCommand(pathString, commandCallback) {\n var segmentRE = /([MLQCZ])([^MLQCZ]*)/g;\n var match, firstX, firstY, prevX, prevY;\n while ((match = segmentRE.exec(pathString))) {\n var args = match[2]\n .replace(/^\\s*|\\s*$/g, '')\n .split(/[,\\s]+/)\n .map(function (v) { return parseFloat(v); });\n switch (match[1]) {\n case 'M':\n prevX = firstX = args[0];\n prevY = firstY = args[1];\n break\n case 'L':\n if (args[0] !== prevX || args[1] !== prevY) { // yup, some fonts have zero-length line commands\n commandCallback('L', prevX, prevY, (prevX = args[0]), (prevY = args[1]));\n }\n break\n case 'Q': {\n commandCallback('Q', prevX, prevY, (prevX = args[2]), (prevY = args[3]), args[0], args[1]);\n break\n }\n case 'C': {\n commandCallback('C', prevX, prevY, (prevX = args[4]), (prevY = args[5]), args[0], args[1], args[2], args[3]);\n break\n }\n case 'Z':\n if (prevX !== firstX || prevY !== firstY) {\n commandCallback('L', prevX, prevY, firstX, firstY);\n }\n break\n }\n }\n }\n\n /**\n * Convert a path string to a series of straight line segments\n * @param {string} pathString - An SVG-like path string to parse; should only contain commands: M/L/Q/C/Z\n * @param {function(x1:number, y1:number, x2:number, y2:number)} segmentCallback - A callback\n * function that will be called once for every line segment\n * @param {number} [curvePoints] - How many straight line segments to use when approximating a\n * bezier curve in the path. Defaults to 16.\n */\n function pathToLineSegments (pathString, segmentCallback, curvePoints) {\n if ( curvePoints === void 0 ) curvePoints = 16;\n\n var tempPoint = { x: 0, y: 0 };\n forEachPathCommand(pathString, function (command, startX, startY, endX, endY, ctrl1X, ctrl1Y, ctrl2X, ctrl2Y) {\n switch (command) {\n case 'L':\n segmentCallback(startX, startY, endX, endY);\n break\n case 'Q': {\n var prevCurveX = startX;\n var prevCurveY = startY;\n for (var i = 1; i < curvePoints; i++) {\n pointOnQuadraticBezier(\n startX, startY,\n ctrl1X, ctrl1Y,\n endX, endY,\n i / (curvePoints - 1),\n tempPoint\n );\n segmentCallback(prevCurveX, prevCurveY, tempPoint.x, tempPoint.y);\n prevCurveX = tempPoint.x;\n prevCurveY = tempPoint.y;\n }\n break\n }\n case 'C': {\n var prevCurveX$1 = startX;\n var prevCurveY$1 = startY;\n for (var i$1 = 1; i$1 < curvePoints; i$1++) {\n pointOnCubicBezier(\n startX, startY,\n ctrl1X, ctrl1Y,\n ctrl2X, ctrl2Y,\n endX, endY,\n i$1 / (curvePoints - 1),\n tempPoint\n );\n segmentCallback(prevCurveX$1, prevCurveY$1, tempPoint.x, tempPoint.y);\n prevCurveX$1 = tempPoint.x;\n prevCurveY$1 = tempPoint.y;\n }\n break\n }\n }\n });\n }\n\n var viewportQuadVertex = \"precision highp float;attribute vec2 aUV;varying vec2 vUV;void main(){vUV=aUV;gl_Position=vec4(mix(vec2(-1.0),vec2(1.0),aUV),0.0,1.0);}\";\n\n var copyTexFragment = \"precision highp float;uniform sampler2D tex;varying vec2 vUV;void main(){gl_FragColor=texture2D(tex,vUV);}\";\n\n var cache = new WeakMap();\n\n var glContextParams = {\n premultipliedAlpha: false,\n preserveDrawingBuffer: true,\n antialias: false,\n depth: false,\n };\n\n /**\n * This is a little helper library for WebGL. It assists with state management for a GL context.\n * It's pretty tightly wrapped to the needs of this package, not very general-purpose.\n *\n * @param { WebGLRenderingContext | HTMLCanvasElement | OffscreenCanvas } glOrCanvas - the GL context to wrap\n * @param { ({gl, getExtension, withProgram, withTexture, withTextureFramebuffer, handleContextLoss}) => void } callback\n */\n function withWebGLContext (glOrCanvas, callback) {\n var gl = glOrCanvas.getContext ? glOrCanvas.getContext('webgl', glContextParams) : glOrCanvas;\n var wrapper = cache.get(gl);\n if (!wrapper) {\n var isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext;\n var extensions = {};\n var programs = {};\n var textures = {};\n var textureUnit = -1;\n var framebufferStack = [];\n\n gl.canvas.addEventListener('webglcontextlost', function (e) {\n handleContextLoss();\n e.preventDefault();\n }, false);\n\n function getExtension (name) {\n var ext = extensions[name];\n if (!ext) {\n ext = extensions[name] = gl.getExtension(name);\n if (!ext) {\n throw new Error((name + \" not supported\"))\n }\n }\n return ext\n }\n\n function compileShader (src, type) {\n var shader = gl.createShader(type);\n gl.shaderSource(shader, src);\n gl.compileShader(shader);\n // const status = gl.getShaderParameter(shader, gl.COMPILE_STATUS)\n // if (!status && !gl.isContextLost()) {\n // throw new Error(gl.getShaderInfoLog(shader).trim())\n // }\n return shader\n }\n\n function withProgram (name, vert, frag, func) {\n if (!programs[name]) {\n var attributes = {};\n var uniforms = {};\n var program = gl.createProgram();\n gl.attachShader(program, compileShader(vert, gl.VERTEX_SHADER));\n gl.attachShader(program, compileShader(frag, gl.FRAGMENT_SHADER));\n gl.linkProgram(program);\n\n programs[name] = {\n program: program,\n transaction: function transaction (func) {\n gl.useProgram(program);\n func({\n setUniform: function setUniform (type, name) {\n var values = [], len = arguments.length - 2;\n while ( len-- > 0 ) values[ len ] = arguments[ len + 2 ];\n\n var uniformLoc = uniforms[name] || (uniforms[name] = gl.getUniformLocation(program, name));\n gl[(\"uniform\" + type)].apply(gl, [ uniformLoc ].concat( values ));\n },\n\n setAttribute: function setAttribute (name, size, usage, instancingDivisor, data) {\n var attr = attributes[name];\n if (!attr) {\n attr = attributes[name] = {\n buf: gl.createBuffer(), // TODO should we destroy our buffers?\n loc: gl.getAttribLocation(program, name),\n data: null\n };\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, attr.buf);\n gl.vertexAttribPointer(attr.loc, size, gl.FLOAT, false, 0, 0);\n gl.enableVertexAttribArray(attr.loc);\n if (isWebGL2) {\n gl.vertexAttribDivisor(attr.loc, instancingDivisor);\n } else {\n getExtension('ANGLE_instanced_arrays').vertexAttribDivisorANGLE(attr.loc, instancingDivisor);\n }\n if (data !== attr.data) {\n gl.bufferData(gl.ARRAY_BUFFER, data, usage);\n attr.data = data;\n }\n }\n });\n }\n };\n }\n\n programs[name].transaction(func);\n }\n\n function withTexture (name, func) {\n textureUnit++;\n try {\n gl.activeTexture(gl.TEXTURE0 + textureUnit);\n var texture = textures[name];\n if (!texture) {\n texture = textures[name] = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n }\n gl.bindTexture(gl.TEXTURE_2D, texture);\n func(texture, textureUnit);\n } finally {\n textureUnit--;\n }\n }\n\n function withTextureFramebuffer (texture, textureUnit, func) {\n var framebuffer = gl.createFramebuffer();\n framebufferStack.push(framebuffer);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.activeTexture(gl.TEXTURE0 + textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n try {\n func(framebuffer);\n } finally {\n gl.deleteFramebuffer(framebuffer);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferStack[--framebufferStack.length - 1] || null);\n }\n }\n\n function handleContextLoss () {\n extensions = {};\n programs = {};\n textures = {};\n textureUnit = -1;\n framebufferStack.length = 0;\n }\n\n cache.set(gl, wrapper = {\n gl: gl,\n isWebGL2: isWebGL2,\n getExtension: getExtension,\n withProgram: withProgram,\n withTexture: withTexture,\n withTextureFramebuffer: withTextureFramebuffer,\n handleContextLoss: handleContextLoss,\n });\n }\n callback(wrapper);\n }\n\n\n function renderImageData(glOrCanvas, imageData, x, y, width, height, channels, framebuffer) {\n if ( channels === void 0 ) channels = 15;\n if ( framebuffer === void 0 ) framebuffer = null;\n\n withWebGLContext(glOrCanvas, function (ref) {\n var gl = ref.gl;\n var withProgram = ref.withProgram;\n var withTexture = ref.withTexture;\n\n withTexture('copy', function (tex, texUnit) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, imageData);\n withProgram('copy', viewportQuadVertex, copyTexFragment, function (ref) {\n var setUniform = ref.setUniform;\n var setAttribute = ref.setAttribute;\n\n setAttribute('aUV', 2, gl.STATIC_DRAW, 0, new Float32Array([0, 0, 2, 0, 0, 2]));\n setUniform('1i', 'image', texUnit);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer || null);\n gl.disable(gl.BLEND);\n gl.colorMask(channels & 8, channels & 4, channels & 2, channels & 1);\n gl.viewport(x, y, width, height);\n gl.scissor(x, y, width, height);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n });\n });\n });\n }\n\n /**\n * Resizing a canvas clears its contents; this utility copies the previous contents over.\n * @param canvas\n * @param newWidth\n * @param newHeight\n */\n function resizeWebGLCanvasWithoutClearing(canvas, newWidth, newHeight) {\n var width = canvas.width;\n var height = canvas.height;\n withWebGLContext(canvas, function (ref) {\n var gl = ref.gl;\n\n var data = new Uint8Array(width * height * 4);\n gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);\n canvas.width = newWidth;\n canvas.height = newHeight;\n renderImageData(gl, data, 0, 0, width, height);\n });\n }\n\n var webglUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n withWebGLContext: withWebGLContext,\n renderImageData: renderImageData,\n resizeWebGLCanvasWithoutClearing: resizeWebGLCanvasWithoutClearing\n });\n\n function generate$2 (sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n\n var textureData = new Uint8Array(sdfWidth * sdfHeight);\n\n var viewBoxWidth = viewBox[2] - viewBox[0];\n var viewBoxHeight = viewBox[3] - viewBox[1];\n\n // Decompose all paths into straight line segments and add them to an index\n var segments = [];\n pathToLineSegments(path, function (x1, y1, x2, y2) {\n segments.push({\n x1: x1, y1: y1, x2: x2, y2: y2,\n minX: Math.min(x1, x2),\n minY: Math.min(y1, y2),\n maxX: Math.max(x1, x2),\n maxY: Math.max(y1, y2)\n });\n });\n\n // Sort segments by maxX, this will let us short-circuit some loops below\n segments.sort(function (a, b) { return a.maxX - b.maxX; });\n\n // For each target SDF texel, find the distance from its center to its nearest line segment,\n // map that distance to an alpha value, and write that alpha to the texel\n for (var sdfX = 0; sdfX < sdfWidth; sdfX++) {\n for (var sdfY = 0; sdfY < sdfHeight; sdfY++) {\n var signedDist = findNearestSignedDistance(\n viewBox[0] + viewBoxWidth * (sdfX + 0.5) / sdfWidth,\n viewBox[1] + viewBoxHeight * (sdfY + 0.5) / sdfHeight\n );\n\n // Use an exponential scale to ensure the texels very near the glyph path have adequate\n // precision, while allowing the distance field to cover the entire texture, given that\n // there are only 8 bits available. Formula visualized: https://www.desmos.com/calculator/uiaq5aqiam\n var alpha = Math.pow((1 - Math.abs(signedDist) / maxDistance), sdfExponent) / 2;\n if (signedDist < 0) {\n alpha = 1 - alpha;\n }\n\n alpha = Math.max(0, Math.min(255, Math.round(alpha * 255))); //clamp\n textureData[sdfY * sdfWidth + sdfX] = alpha;\n }\n }\n\n return textureData\n\n /**\n * For a given x/y, search the index for the closest line segment and return\n * its signed distance. Negative = inside, positive = outside, zero = on edge\n * @param x\n * @param y\n * @returns {number}\n */\n function findNearestSignedDistance (x, y) {\n var closestDistSq = Infinity;\n var closestDist = Infinity;\n\n for (var i = segments.length; i--;) {\n var seg = segments[i];\n if (seg.maxX + closestDist <= x) { break } //sorting by maxX means no more can be closer, so we can short-circuit\n if (x + closestDist > seg.minX && y - closestDist < seg.maxY && y + closestDist > seg.minY) {\n var distSq = absSquareDistanceToLineSegment(x, y, seg.x1, seg.y1, seg.x2, seg.y2);\n if (distSq < closestDistSq) {\n closestDistSq = distSq;\n closestDist = Math.sqrt(closestDistSq);\n }\n }\n }\n\n // Flip to negative distance if inside the poly\n if (isPointInPoly(x, y)) {\n closestDist = -closestDist;\n }\n return closestDist\n }\n\n /**\n * Determine whether the given point lies inside or outside the glyph. Uses a simple\n * winding-number ray casting algorithm using a ray pointing east from the point.\n */\n function isPointInPoly (x, y) {\n var winding = 0;\n for (var i = segments.length; i--;) {\n var seg = segments[i];\n if (seg.maxX <= x) { break } //sorting by maxX means no more can cross, so we can short-circuit\n var intersects = ((seg.y1 > y) !== (seg.y2 > y)) && (x < (seg.x2 - seg.x1) * (y - seg.y1) / (seg.y2 - seg.y1) + seg.x1);\n if (intersects) {\n winding += seg.y1 < seg.y2 ? 1 : -1;\n }\n }\n return winding !== 0\n }\n }\n\n function generateIntoCanvas$2(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, canvas, x, y, channel) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n generateIntoFramebuffer$1(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, canvas, null, x, y, channel);\n }\n\n function generateIntoFramebuffer$1 (sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, glOrCanvas, framebuffer, x, y, channel) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n var data = generate$2(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent);\n // Expand single-channel data to rbga\n var rgbaData = new Uint8Array(data.length * 4);\n for (var i = 0; i < data.length; i++) {\n rgbaData[i * 4 + channel] = data[i];\n }\n renderImageData(glOrCanvas, rgbaData, x, y, sdfWidth, sdfHeight, 1 << (3 - channel), framebuffer);\n }\n\n /**\n * Find the absolute distance from a point to a line segment at closest approach\n */\n function absSquareDistanceToLineSegment (x, y, lineX0, lineY0, lineX1, lineY1) {\n var ldx = lineX1 - lineX0;\n var ldy = lineY1 - lineY0;\n var lengthSq = ldx * ldx + ldy * ldy;\n var t = lengthSq ? Math.max(0, Math.min(1, ((x - lineX0) * ldx + (y - lineY0) * ldy) / lengthSq)) : 0;\n var dx = x - (lineX0 + t * ldx);\n var dy = y - (lineY0 + t * ldy);\n return dx * dx + dy * dy\n }\n\n var javascript = /*#__PURE__*/Object.freeze({\n __proto__: null,\n generate: generate$2,\n generateIntoCanvas: generateIntoCanvas$2,\n generateIntoFramebuffer: generateIntoFramebuffer$1\n });\n\n var mainVertex = \"precision highp float;uniform vec4 uGlyphBounds;attribute vec2 aUV;attribute vec4 aLineSegment;varying vec4 vLineSegment;varying vec2 vGlyphXY;void main(){vLineSegment=aLineSegment;vGlyphXY=mix(uGlyphBounds.xy,uGlyphBounds.zw,aUV);gl_Position=vec4(mix(vec2(-1.0),vec2(1.0),aUV),0.0,1.0);}\";\n\n var mainFragment = \"precision highp float;uniform vec4 uGlyphBounds;uniform float uMaxDistance;uniform float uExponent;varying vec4 vLineSegment;varying vec2 vGlyphXY;float absDistToSegment(vec2 point,vec2 lineA,vec2 lineB){vec2 lineDir=lineB-lineA;float lenSq=dot(lineDir,lineDir);float t=lenSq==0.0 ? 0.0 : clamp(dot(point-lineA,lineDir)/lenSq,0.0,1.0);vec2 linePt=lineA+t*lineDir;return distance(point,linePt);}void main(){vec4 seg=vLineSegment;vec2 p=vGlyphXY;float dist=absDistToSegment(p,seg.xy,seg.zw);float val=pow(1.0-clamp(dist/uMaxDistance,0.0,1.0),uExponent)*0.5;bool crossing=(seg.y>p.y!=seg.w>p.y)&&(p.x<(seg.z-seg.x)*(p.y-seg.y)/(seg.w-seg.y)+seg.x);bool crossingUp=crossing&&vLineSegment.y bool\n\n function validateSupport (glOrCanvas) {\n if (!isTestingSupport && !isSupported(glOrCanvas)) {\n throw new Error('WebGL generation not supported')\n }\n }\n\n function generate$1 (sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, glOrCanvas) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( glOrCanvas === void 0 ) glOrCanvas = null;\n\n if (!glOrCanvas) {\n glOrCanvas = implicitContext;\n if (!glOrCanvas) {\n var canvas = typeof OffscreenCanvas === 'function'\n ? new OffscreenCanvas(1, 1)\n : typeof document !== 'undefined'\n ? document.createElement('canvas')\n : null;\n if (!canvas) {\n throw new Error('OffscreenCanvas or DOM canvas not supported')\n }\n glOrCanvas = implicitContext = canvas.getContext('webgl', { depth: false });\n }\n }\n\n validateSupport(glOrCanvas);\n\n var rgbaData = new Uint8Array(sdfWidth * sdfHeight * 4); //not Uint8ClampedArray, cuz Safari\n\n // Render into a background texture framebuffer\n withWebGLContext(glOrCanvas, function (ref) {\n var gl = ref.gl;\n var withTexture = ref.withTexture;\n var withTextureFramebuffer = ref.withTextureFramebuffer;\n\n withTexture('readable', function (texture, textureUnit) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, sdfWidth, sdfHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n\n withTextureFramebuffer(texture, textureUnit, function (framebuffer) {\n generateIntoFramebuffer(\n sdfWidth,\n sdfHeight,\n path,\n viewBox,\n maxDistance,\n sdfExponent,\n gl,\n framebuffer,\n 0,\n 0,\n 0 // red channel\n );\n gl.readPixels(0, 0, sdfWidth, sdfHeight, gl.RGBA, gl.UNSIGNED_BYTE, rgbaData);\n });\n });\n });\n\n // Throw away all but the red channel\n var data = new Uint8Array(sdfWidth * sdfHeight);\n for (var i = 0, j = 0; i < rgbaData.length; i += 4) {\n data[j++] = rgbaData[i];\n }\n\n return data\n }\n\n function generateIntoCanvas$1(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, canvas, x, y, channel) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n generateIntoFramebuffer(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, canvas, null, x, y, channel);\n }\n\n function generateIntoFramebuffer (sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, glOrCanvas, framebuffer, x, y, channel) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n // Verify support\n validateSupport(glOrCanvas);\n\n // Compute path segments\n var lineSegmentCoords = [];\n pathToLineSegments(path, function (x1, y1, x2, y2) {\n lineSegmentCoords.push(x1, y1, x2, y2);\n });\n lineSegmentCoords = new Float32Array(lineSegmentCoords);\n\n withWebGLContext(glOrCanvas, function (ref) {\n var gl = ref.gl;\n var isWebGL2 = ref.isWebGL2;\n var getExtension = ref.getExtension;\n var withProgram = ref.withProgram;\n var withTexture = ref.withTexture;\n var withTextureFramebuffer = ref.withTextureFramebuffer;\n var handleContextLoss = ref.handleContextLoss;\n\n withTexture('rawDistances', function (intermediateTexture, intermediateTextureUnit) {\n if (sdfWidth !== intermediateTexture._lastWidth || sdfHeight !== intermediateTexture._lastHeight) {\n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.RGBA,\n intermediateTexture._lastWidth = sdfWidth,\n intermediateTexture._lastHeight = sdfHeight,\n 0, gl.RGBA, gl.UNSIGNED_BYTE, null\n );\n }\n\n // Unsigned distance pass\n withProgram('main', mainVertex, mainFragment, function (ref) {\n var setAttribute = ref.setAttribute;\n var setUniform = ref.setUniform;\n\n // Init extensions\n var instancingExtension = !isWebGL2 && getExtension('ANGLE_instanced_arrays');\n var blendMinMaxExtension = !isWebGL2 && getExtension('EXT_blend_minmax');\n\n // Init/update attributes\n setAttribute('aUV', 2, gl.STATIC_DRAW, 0, viewportUVs);\n setAttribute('aLineSegment', 4, gl.DYNAMIC_DRAW, 1, lineSegmentCoords);\n\n // Init/update uniforms\n setUniform.apply(void 0, [ '4f', 'uGlyphBounds' ].concat( viewBox ));\n setUniform('1f', 'uMaxDistance', maxDistance);\n setUniform('1f', 'uExponent', sdfExponent);\n\n // Render initial unsigned distance / winding number info to a texture\n withTextureFramebuffer(intermediateTexture, intermediateTextureUnit, function (framebuffer) {\n gl.enable(gl.BLEND);\n gl.colorMask(true, true, true, true);\n gl.viewport(0, 0, sdfWidth, sdfHeight);\n gl.scissor(0, 0, sdfWidth, sdfHeight);\n gl.blendFunc(gl.ONE, gl.ONE);\n // Red+Green channels are incremented (FUNC_ADD) for segment-ray crossings to give a \"winding number\".\n // Alpha holds the closest (MAX) unsigned distance.\n gl.blendEquationSeparate(gl.FUNC_ADD, isWebGL2 ? gl.MAX : blendMinMaxExtension.MAX_EXT);\n gl.clear(gl.COLOR_BUFFER_BIT);\n if (isWebGL2) {\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 3, lineSegmentCoords.length / 4);\n } else {\n instancingExtension.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 3, lineSegmentCoords.length / 4);\n }\n // Debug\n // const debug = new Uint8Array(sdfWidth * sdfHeight * 4)\n // gl.readPixels(0, 0, sdfWidth, sdfHeight, gl.RGBA, gl.UNSIGNED_BYTE, debug)\n // console.log('intermediate texture data: ', debug)\n });\n });\n\n // Use the data stored in the texture to apply inside/outside and write to the output framebuffer rect+channel.\n withProgram('post', viewportQuadVertex, postFragment, function (program) {\n program.setAttribute('aUV', 2, gl.STATIC_DRAW, 0, viewportUVs);\n program.setUniform('1i', 'tex', intermediateTextureUnit);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.disable(gl.BLEND);\n gl.colorMask(channel === 0, channel === 1, channel === 2, channel === 3);\n gl.viewport(x, y, sdfWidth, sdfHeight);\n gl.scissor(x, y, sdfWidth, sdfHeight);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n });\n });\n\n // Handle context loss occurring during any of the above calls\n if (gl.isContextLost()) {\n handleContextLoss();\n throw new Error('webgl context lost')\n }\n });\n }\n\n function isSupported (glOrCanvas) {\n var key = (!glOrCanvas || glOrCanvas === implicitContext) ? NULL_OBJECT : (glOrCanvas.canvas || glOrCanvas);\n var supported = supportByCanvas.get(key);\n if (supported === undefined) {\n isTestingSupport = true;\n var failReason = null;\n try {\n // Since we can't detect all failure modes up front, let's just do a trial run of a\n // simple path and compare what we get back to the correct expected result. This will\n // also serve to prime the shader compilation.\n var expectedResult = [\n 97, 106, 97, 61,\n 99, 137, 118, 80,\n 80, 118, 137, 99,\n 61, 97, 106, 97\n ];\n var testResult = generate$1(\n 4,\n 4,\n 'M8,8L16,8L24,24L16,24Z',\n [0, 0, 32, 32],\n 24,\n 1,\n glOrCanvas\n );\n supported = testResult && expectedResult.length === testResult.length &&\n testResult.every(function (val, i) { return val === expectedResult[i]; });\n if (!supported) {\n failReason = 'bad trial run results';\n console.info(expectedResult, testResult);\n }\n } catch (err) {\n // TODO if it threw due to webgl context loss, should we maybe leave isSupported as null and try again later?\n supported = false;\n failReason = err.message;\n }\n if (failReason) {\n console.warn('WebGL SDF generation not supported:', failReason);\n }\n isTestingSupport = false;\n supportByCanvas.set(key, supported);\n }\n return supported\n }\n\n var webgl = /*#__PURE__*/Object.freeze({\n __proto__: null,\n generate: generate$1,\n generateIntoCanvas: generateIntoCanvas$1,\n generateIntoFramebuffer: generateIntoFramebuffer,\n isSupported: isSupported\n });\n\n /**\n * Generate an SDF texture image for a 2D path.\n *\n * @param {number} sdfWidth - width of the SDF output image in pixels.\n * @param {number} sdfHeight - height of the SDF output image in pixels.\n * @param {string} path - an SVG-like path string describing the glyph; should only contain commands: M/L/Q/C/Z.\n * @param {number[]} viewBox - [minX, minY, maxX, maxY] in font units aligning with the texture's edges.\n * @param {number} maxDistance - the maximum distance from the glyph path in font units that will be encoded; defaults\n * to half the maximum viewBox dimension.\n * @param {number} [sdfExponent] - specifies an exponent for encoding the SDF's distance values; higher exponents\n * will give greater precision nearer the glyph's path.\n * @return {Uint8Array}\n */\n function generate(\n sdfWidth,\n sdfHeight,\n path,\n viewBox,\n maxDistance,\n sdfExponent\n ) {\n if ( maxDistance === void 0 ) maxDistance = Math.max(viewBox[2] - viewBox[0], viewBox[3] - viewBox[1]) / 2;\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n\n try {\n return generate$1.apply(webgl, arguments)\n } catch(e) {\n console.info('WebGL SDF generation failed, falling back to JS', e);\n return generate$2.apply(javascript, arguments)\n }\n }\n\n /**\n * Generate an SDF texture image for a 2D path, inserting the result into a WebGL `canvas` at a given x/y position\n * and color channel. This is generally much faster than calling `generate` because it does not require reading pixels\n * back from the GPU->CPU -- the `canvas` can be used directly as a WebGL texture image, so it all stays on the GPU.\n *\n * @param {number} sdfWidth - width of the SDF output image in pixels.\n * @param {number} sdfHeight - height of the SDF output image in pixels.\n * @param {string} path - an SVG-like path string describing the glyph; should only contain commands: M/L/Q/C/Z.\n * @param {number[]} viewBox - [minX, minY, maxX, maxY] in font units aligning with the texture's edges.\n * @param {number} maxDistance - the maximum distance from the glyph path in font units that will be encoded; defaults\n * to half the maximum viewBox dimension.\n * @param {number} [sdfExponent] - specifies an exponent for encoding the SDF's distance values; higher exponents\n * will give greater precision nearer the glyph's path.\n * @param {HTMLCanvasElement|OffscreenCanvas} canvas - a WebGL-enabled canvas into which the SDF will be rendered.\n * Only the relevant rect/channel will be modified, the rest will be preserved. To avoid unpredictable results\n * due to shared GL context state, this canvas should be dedicated to use by this library alone.\n * @param {number} x - the x position at which to render the SDF.\n * @param {number} y - the y position at which to render the SDF.\n * @param {number} channel - the color channel index (0-4) into which the SDF will be rendered.\n * @return {Uint8Array}\n */\n function generateIntoCanvas(\n sdfWidth,\n sdfHeight,\n path,\n viewBox,\n maxDistance,\n sdfExponent,\n canvas,\n x,\n y,\n channel\n ) {\n if ( maxDistance === void 0 ) maxDistance = Math.max(viewBox[2] - viewBox[0], viewBox[3] - viewBox[1]) / 2;\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n try {\n return generateIntoCanvas$1.apply(webgl, arguments)\n } catch(e) {\n console.info('WebGL SDF generation failed, falling back to JS', e);\n return generateIntoCanvas$2.apply(javascript, arguments)\n }\n }\n\n exports.forEachPathCommand = forEachPathCommand;\n exports.generate = generate;\n exports.generateIntoCanvas = generateIntoCanvas;\n exports.javascript = javascript;\n exports.pathToLineSegments = pathToLineSegments;\n exports.webgl = webgl;\n exports.webglUtils = webglUtils;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n return exports;\n\n}({}));\nreturn exports\n}\n\nexport { SDFGenerator as default };\n","function bidiFactory() {\nvar bidi = (function (exports) {\n\n // Bidi character types data, auto generated\n var DATA = {\n \"R\": \"13k,1a,2,3,3,2+1j,ch+16,a+1,5+2,2+n,5,a,4,6+16,4+3,h+1b,4mo,179q,2+9,2+11,2i9+7y,2+68,4,3+4,5+13,4+3,2+4k,3+29,8+cf,1t+7z,w+17,3+3m,1t+3z,16o1+5r,8+30,8+mc,29+1r,29+4v,75+73\",\n \"EN\": \"1c+9,3d+1,6,187+9,513,4+5,7+9,sf+j,175h+9,qw+q,161f+1d,4xt+a,25i+9\",\n \"ES\": \"17,2,6dp+1,f+1,av,16vr,mx+1,4o,2\",\n \"ET\": \"z+2,3h+3,b+1,ym,3e+1,2o,p4+1,8,6u,7c,g6,1wc,1n9+4,30+1b,2n,6d,qhx+1,h0m,a+1,49+2,63+1,4+1,6bb+3,12jj\",\n \"AN\": \"16o+5,2j+9,2+1,35,ed,1ff2+9,87+u\",\n \"CS\": \"18,2+1,b,2u,12k,55v,l,17v0,2,3,53,2+1,b\",\n \"B\": \"a,3,f+2,2v,690\",\n \"S\": \"9,2,k\",\n \"WS\": \"c,k,4f4,1vk+a,u,1j,335\",\n \"ON\": \"x+1,4+4,h+5,r+5,r+3,z,5+3,2+1,2+1,5,2+2,3+4,o,w,ci+1,8+d,3+d,6+8,2+g,39+1,9,6+1,2,33,b8,3+1,3c+1,7+1,5r,b,7h+3,sa+5,2,3i+6,jg+3,ur+9,2v,ij+1,9g+9,7+a,8m,4+1,49+x,14u,2+2,c+2,e+2,e+2,e+1,i+n,e+e,2+p,u+2,e+2,36+1,2+3,2+1,b,2+2,6+5,2,2,2,h+1,5+4,6+3,3+f,16+2,5+3l,3+81,1y+p,2+40,q+a,m+13,2r+ch,2+9e,75+hf,3+v,2+2w,6e+5,f+6,75+2a,1a+p,2+2g,d+5x,r+b,6+3,4+o,g,6+1,6+2,2k+1,4,2j,5h+z,1m+1,1e+f,t+2,1f+e,d+3,4o+3,2s+1,w,535+1r,h3l+1i,93+2,2s,b+1,3l+x,2v,4g+3,21+3,kz+1,g5v+1,5a,j+9,n+v,2,3,2+8,2+1,3+2,2,3,46+1,4+4,h+5,r+5,r+a,3h+2,4+6,b+4,78,1r+24,4+c,4,1hb,ey+6,103+j,16j+c,1ux+7,5+g,fsh,jdq+1t,4,57+2e,p1,1m,1m,1m,1m,4kt+1,7j+17,5+2r,d+e,3+e,2+e,2+10,m+4,w,1n+5,1q,4z+5,4b+rb,9+c,4+c,4+37,d+2g,8+b,l+b,5+1j,9+9,7+13,9+t,3+1,27+3c,2+29,2+3q,d+d,3+4,4+2,6+6,a+o,8+6,a+2,e+6,16+42,2+1i\",\n \"BN\": \"0+8,6+d,2s+5,2+p,e,4m9,1kt+2,2b+5,5+5,17q9+v,7k,6p+8,6+1,119d+3,440+7,96s+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+75,6p+2rz,1ben+1,1ekf+1,1ekf+1\",\n \"NSM\": \"lc+33,7o+6,7c+18,2,2+1,2+1,2,21+a,1d+k,h,2u+6,3+5,3+1,2+3,10,v+q,2k+a,1n+8,a,p+3,2+8,2+2,2+4,18+2,3c+e,2+v,1k,2,5+7,5,4+6,b+1,u,1n,5+3,9,l+1,r,3+1,1m,5+1,5+1,3+2,4,v+1,4,c+1,1m,5+4,2+1,5,l+1,n+5,2,1n,3,2+3,9,8+1,c+1,v,1q,d,1f,4,1m+2,6+2,2+3,8+1,c+1,u,1n,g+1,l+1,t+1,1m+1,5+3,9,l+1,u,21,8+2,2,2j,3+6,d+7,2r,3+8,c+5,23+1,s,2,2,1k+d,2+4,2+1,6+a,2+z,a,2v+3,2+5,2+1,3+1,q+1,5+2,h+3,e,3+1,7,g,jk+2,qb+2,u+2,u+1,v+1,1t+1,2+6,9,3+a,a,1a+2,3c+1,z,3b+2,5+1,a,7+2,64+1,3,1n,2+6,2,2,3+7,7+9,3,1d+g,1s+3,1d,2+4,2,6,15+8,d+1,x+3,3+1,2+2,1l,2+1,4,2+2,1n+7,3+1,49+2,2+c,2+6,5,7,4+1,5j+1l,2+4,k1+w,2db+2,3y,2p+v,ff+3,30+1,n9x+3,2+9,x+1,29+1,7l,4,5,q+1,6,48+1,r+h,e,13+7,q+a,1b+2,1d,3+3,3+1,14,1w+5,3+1,3+1,d,9,1c,1g,2+2,3+1,6+1,2,17+1,9,6n,3,5,fn5,ki+f,h+f,r2,6b,46+4,1af+2,2+1,6+3,15+2,5,4m+1,fy+3,as+1,4a+a,4x,1j+e,1l+2,1e+3,3+1,1y+2,11+4,2+7,1r,d+1,1h+8,b+3,3,2o+2,3,2+1,7,4h,4+7,m+1,1m+1,4,12+6,4+4,5g+7,3+2,2,o,2d+5,2,5+1,2+1,6n+3,7+1,2+1,s+1,2e+7,3,2+1,2z,2,3+5,2,2u+2,3+3,2+4,78+8,2+1,75+1,2,5,41+3,3+1,5,x+5,3+1,15+5,3+3,9,a+5,3+2,1b+c,2+1,bb+6,2+5,2d+l,3+6,2+1,2+1,3f+5,4,2+1,2+6,2,21+1,4,2,9o+1,f0c+4,1o+6,t5,1s+3,2a,f5l+1,43t+2,i+7,3+6,v+3,45+2,1j0+1i,5+1d,9,f,n+4,2+e,11t+6,2+g,3+6,2+1,2+4,7a+6,c6+3,15t+6,32+6,gzhy+6n\",\n \"AL\": \"16w,3,2,e+1b,z+2,2+2s,g+1,8+1,b+m,2+t,s+2i,c+e,4h+f,1d+1e,1bwe+dp,3+3z,x+c,2+1,35+3y,2rm+z,5+7,b+5,dt+l,c+u,17nl+27,1t+27,4x+6n,3+d\",\n \"LRO\": \"6ct\",\n \"RLO\": \"6cu\",\n \"LRE\": \"6cq\",\n \"RLE\": \"6cr\",\n \"PDF\": \"6cs\",\n \"LRI\": \"6ee\",\n \"RLI\": \"6ef\",\n \"FSI\": \"6eg\",\n \"PDI\": \"6eh\"\n };\n\n var TYPES = {};\n var TYPES_TO_NAMES = {};\n TYPES.L = 1; //L is the default\n TYPES_TO_NAMES[1] = 'L';\n Object.keys(DATA).forEach(function (type, i) {\n TYPES[type] = 1 << (i + 1);\n TYPES_TO_NAMES[TYPES[type]] = type;\n });\n Object.freeze(TYPES);\n\n var ISOLATE_INIT_TYPES = TYPES.LRI | TYPES.RLI | TYPES.FSI;\n var STRONG_TYPES = TYPES.L | TYPES.R | TYPES.AL;\n var NEUTRAL_ISOLATE_TYPES = TYPES.B | TYPES.S | TYPES.WS | TYPES.ON | TYPES.FSI | TYPES.LRI | TYPES.RLI | TYPES.PDI;\n var BN_LIKE_TYPES = TYPES.BN | TYPES.RLE | TYPES.LRE | TYPES.RLO | TYPES.LRO | TYPES.PDF;\n var TRAILING_TYPES = TYPES.S | TYPES.WS | TYPES.B | ISOLATE_INIT_TYPES | TYPES.PDI | BN_LIKE_TYPES;\n\n var map = null;\n\n function parseData () {\n if (!map) {\n //const start = performance.now()\n map = new Map();\n var loop = function ( type ) {\n if (DATA.hasOwnProperty(type)) {\n var lastCode = 0;\n DATA[type].split(',').forEach(function (range) {\n var ref = range.split('+');\n var skip = ref[0];\n var step = ref[1];\n skip = parseInt(skip, 36);\n step = step ? parseInt(step, 36) : 0;\n map.set(lastCode += skip, TYPES[type]);\n for (var i = 0; i < step; i++) {\n map.set(++lastCode, TYPES[type]);\n }\n });\n }\n };\n\n for (var type in DATA) loop( type );\n //console.log(`char types parsed in ${performance.now() - start}ms`)\n }\n }\n\n /**\n * @param {string} char\n * @return {number}\n */\n function getBidiCharType (char) {\n parseData();\n return map.get(char.codePointAt(0)) || TYPES.L\n }\n\n function getBidiCharTypeName(char) {\n return TYPES_TO_NAMES[getBidiCharType(char)]\n }\n\n // Bidi bracket pairs data, auto generated\n var data$1 = {\n \"pairs\": \"14>1,1e>2,u>2,2wt>1,1>1,1ge>1,1wp>1,1j>1,f>1,hm>1,1>1,u>1,u6>1,1>1,+5,28>1,w>1,1>1,+3,b8>1,1>1,+3,1>3,-1>-1,3>1,1>1,+2,1s>1,1>1,x>1,th>1,1>1,+2,db>1,1>1,+3,3>1,1>1,+2,14qm>1,1>1,+1,4q>1,1e>2,u>2,2>1,+1\",\n \"canonical\": \"6f1>-6dx,6dy>-6dx,6ec>-6ed,6ee>-6ed,6ww>2jj,-2ji>2jj,14r4>-1e7l,1e7m>-1e7l,1e7m>-1e5c,1e5d>-1e5b,1e5c>-14qx,14qy>-14qx,14vn>-1ecg,1ech>-1ecg,1edu>-1ecg,1eci>-1ecg,1eda>-1ecg,1eci>-1ecg,1eci>-168q,168r>-168q,168s>-14ye,14yf>-14ye\"\n };\n\n /**\n * Parses an string that holds encoded codepoint mappings, e.g. for bracket pairs or\n * mirroring characters, as encoded by scripts/generateBidiData.js. Returns an object\n * holding the `map`, and optionally a `reverseMap` if `includeReverse:true`.\n * @param {string} encodedString\n * @param {boolean} includeReverse - true if you want reverseMap in the output\n * @return {{map: Map, reverseMap?: Map}}\n */\n function parseCharacterMap (encodedString, includeReverse) {\n var radix = 36;\n var lastCode = 0;\n var map = new Map();\n var reverseMap = includeReverse && new Map();\n var prevPair;\n encodedString.split(',').forEach(function visit(entry) {\n if (entry.indexOf('+') !== -1) {\n for (var i = +entry; i--;) {\n visit(prevPair);\n }\n } else {\n prevPair = entry;\n var ref = entry.split('>');\n var a = ref[0];\n var b = ref[1];\n a = String.fromCodePoint(lastCode += parseInt(a, radix));\n b = String.fromCodePoint(lastCode += parseInt(b, radix));\n map.set(a, b);\n includeReverse && reverseMap.set(b, a);\n }\n });\n return { map: map, reverseMap: reverseMap }\n }\n\n var openToClose, closeToOpen, canonical;\n\n function parse$1 () {\n if (!openToClose) {\n //const start = performance.now()\n var ref = parseCharacterMap(data$1.pairs, true);\n var map = ref.map;\n var reverseMap = ref.reverseMap;\n openToClose = map;\n closeToOpen = reverseMap;\n canonical = parseCharacterMap(data$1.canonical, false).map;\n //console.log(`brackets parsed in ${performance.now() - start}ms`)\n }\n }\n\n function openingToClosingBracket (char) {\n parse$1();\n return openToClose.get(char) || null\n }\n\n function closingToOpeningBracket (char) {\n parse$1();\n return closeToOpen.get(char) || null\n }\n\n function getCanonicalBracket (char) {\n parse$1();\n return canonical.get(char) || null\n }\n\n // Local type aliases\n var TYPE_L = TYPES.L;\n var TYPE_R = TYPES.R;\n var TYPE_EN = TYPES.EN;\n var TYPE_ES = TYPES.ES;\n var TYPE_ET = TYPES.ET;\n var TYPE_AN = TYPES.AN;\n var TYPE_CS = TYPES.CS;\n var TYPE_B = TYPES.B;\n var TYPE_S = TYPES.S;\n var TYPE_ON = TYPES.ON;\n var TYPE_BN = TYPES.BN;\n var TYPE_NSM = TYPES.NSM;\n var TYPE_AL = TYPES.AL;\n var TYPE_LRO = TYPES.LRO;\n var TYPE_RLO = TYPES.RLO;\n var TYPE_LRE = TYPES.LRE;\n var TYPE_RLE = TYPES.RLE;\n var TYPE_PDF = TYPES.PDF;\n var TYPE_LRI = TYPES.LRI;\n var TYPE_RLI = TYPES.RLI;\n var TYPE_FSI = TYPES.FSI;\n var TYPE_PDI = TYPES.PDI;\n\n /**\n * @typedef {object} GetEmbeddingLevelsResult\n * @property {{start, end, level}[]} paragraphs\n * @property {Uint8Array} levels\n */\n\n /**\n * This function applies the Bidirectional Algorithm to a string, returning the resolved embedding levels\n * in a single Uint8Array plus a list of objects holding each paragraph's start and end indices and resolved\n * base embedding level.\n *\n * @param {string} string - The input string\n * @param {\"ltr\"|\"rtl\"|\"auto\"} [baseDirection] - Use \"ltr\" or \"rtl\" to force a base paragraph direction,\n * otherwise a direction will be chosen automatically from each paragraph's contents.\n * @return {GetEmbeddingLevelsResult}\n */\n function getEmbeddingLevels (string, baseDirection) {\n var MAX_DEPTH = 125;\n\n // Start by mapping all characters to their unicode type, as a bitmask integer\n var charTypes = new Uint32Array(string.length);\n for (var i = 0; i < string.length; i++) {\n charTypes[i] = getBidiCharType(string[i]);\n }\n\n var charTypeCounts = new Map(); //will be cleared at start of each paragraph\n function changeCharType(i, type) {\n var oldType = charTypes[i];\n charTypes[i] = type;\n charTypeCounts.set(oldType, charTypeCounts.get(oldType) - 1);\n if (oldType & NEUTRAL_ISOLATE_TYPES) {\n charTypeCounts.set(NEUTRAL_ISOLATE_TYPES, charTypeCounts.get(NEUTRAL_ISOLATE_TYPES) - 1);\n }\n charTypeCounts.set(type, (charTypeCounts.get(type) || 0) + 1);\n if (type & NEUTRAL_ISOLATE_TYPES) {\n charTypeCounts.set(NEUTRAL_ISOLATE_TYPES, (charTypeCounts.get(NEUTRAL_ISOLATE_TYPES) || 0) + 1);\n }\n }\n\n var embedLevels = new Uint8Array(string.length);\n var isolationPairs = new Map(); //init->pdi and pdi->init\n\n // === 3.3.1 The Paragraph Level ===\n // 3.3.1 P1: Split the text into paragraphs\n var paragraphs = []; // [{start, end, level}, ...]\n var paragraph = null;\n for (var i$1 = 0; i$1 < string.length; i$1++) {\n if (!paragraph) {\n paragraphs.push(paragraph = {\n start: i$1,\n end: string.length - 1,\n // 3.3.1 P2-P3: Determine the paragraph level\n level: baseDirection === 'rtl' ? 1 : baseDirection === 'ltr' ? 0 : determineAutoEmbedLevel(i$1, false)\n });\n }\n if (charTypes[i$1] & TYPE_B) {\n paragraph.end = i$1;\n paragraph = null;\n }\n }\n\n var FORMATTING_TYPES = TYPE_RLE | TYPE_LRE | TYPE_RLO | TYPE_LRO | ISOLATE_INIT_TYPES | TYPE_PDI | TYPE_PDF | TYPE_B;\n var nextEven = function (n) { return n + ((n & 1) ? 1 : 2); };\n var nextOdd = function (n) { return n + ((n & 1) ? 2 : 1); };\n\n // Everything from here on will operate per paragraph.\n for (var paraIdx = 0; paraIdx < paragraphs.length; paraIdx++) {\n paragraph = paragraphs[paraIdx];\n var statusStack = [{\n _level: paragraph.level,\n _override: 0, //0=neutral, 1=L, 2=R\n _isolate: 0 //bool\n }];\n var stackTop = (void 0);\n var overflowIsolateCount = 0;\n var overflowEmbeddingCount = 0;\n var validIsolateCount = 0;\n charTypeCounts.clear();\n\n // === 3.3.2 Explicit Levels and Directions ===\n for (var i$2 = paragraph.start; i$2 <= paragraph.end; i$2++) {\n var charType = charTypes[i$2];\n stackTop = statusStack[statusStack.length - 1];\n\n // Set initial counts\n charTypeCounts.set(charType, (charTypeCounts.get(charType) || 0) + 1);\n if (charType & NEUTRAL_ISOLATE_TYPES) {\n charTypeCounts.set(NEUTRAL_ISOLATE_TYPES, (charTypeCounts.get(NEUTRAL_ISOLATE_TYPES) || 0) + 1);\n }\n\n // Explicit Embeddings: 3.3.2 X2 - X3\n if (charType & FORMATTING_TYPES) { //prefilter all formatters\n if (charType & (TYPE_RLE | TYPE_LRE)) {\n embedLevels[i$2] = stackTop._level; // 5.2\n var level = (charType === TYPE_RLE ? nextOdd : nextEven)(stackTop._level);\n if (level <= MAX_DEPTH && !overflowIsolateCount && !overflowEmbeddingCount) {\n statusStack.push({\n _level: level,\n _override: 0,\n _isolate: 0\n });\n } else if (!overflowIsolateCount) {\n overflowEmbeddingCount++;\n }\n }\n\n // Explicit Overrides: 3.3.2 X4 - X5\n else if (charType & (TYPE_RLO | TYPE_LRO)) {\n embedLevels[i$2] = stackTop._level; // 5.2\n var level$1 = (charType === TYPE_RLO ? nextOdd : nextEven)(stackTop._level);\n if (level$1 <= MAX_DEPTH && !overflowIsolateCount && !overflowEmbeddingCount) {\n statusStack.push({\n _level: level$1,\n _override: (charType & TYPE_RLO) ? TYPE_R : TYPE_L,\n _isolate: 0\n });\n } else if (!overflowIsolateCount) {\n overflowEmbeddingCount++;\n }\n }\n\n // Isolates: 3.3.2 X5a - X5c\n else if (charType & ISOLATE_INIT_TYPES) {\n // X5c - FSI becomes either RLI or LRI\n if (charType & TYPE_FSI) {\n charType = determineAutoEmbedLevel(i$2 + 1, true) === 1 ? TYPE_RLI : TYPE_LRI;\n }\n\n embedLevels[i$2] = stackTop._level;\n if (stackTop._override) {\n changeCharType(i$2, stackTop._override);\n }\n var level$2 = (charType === TYPE_RLI ? nextOdd : nextEven)(stackTop._level);\n if (level$2 <= MAX_DEPTH && overflowIsolateCount === 0 && overflowEmbeddingCount === 0) {\n validIsolateCount++;\n statusStack.push({\n _level: level$2,\n _override: 0,\n _isolate: 1,\n _isolInitIndex: i$2\n });\n } else {\n overflowIsolateCount++;\n }\n }\n\n // Terminating Isolates: 3.3.2 X6a\n else if (charType & TYPE_PDI) {\n if (overflowIsolateCount > 0) {\n overflowIsolateCount--;\n } else if (validIsolateCount > 0) {\n overflowEmbeddingCount = 0;\n while (!statusStack[statusStack.length - 1]._isolate) {\n statusStack.pop();\n }\n // Add to isolation pairs bidirectional mapping:\n var isolInitIndex = statusStack[statusStack.length - 1]._isolInitIndex;\n if (isolInitIndex != null) {\n isolationPairs.set(isolInitIndex, i$2);\n isolationPairs.set(i$2, isolInitIndex);\n }\n statusStack.pop();\n validIsolateCount--;\n }\n stackTop = statusStack[statusStack.length - 1];\n embedLevels[i$2] = stackTop._level;\n if (stackTop._override) {\n changeCharType(i$2, stackTop._override);\n }\n }\n\n\n // Terminating Embeddings and Overrides: 3.3.2 X7\n else if (charType & TYPE_PDF) {\n if (overflowIsolateCount === 0) {\n if (overflowEmbeddingCount > 0) {\n overflowEmbeddingCount--;\n } else if (!stackTop._isolate && statusStack.length > 1) {\n statusStack.pop();\n stackTop = statusStack[statusStack.length - 1];\n }\n }\n embedLevels[i$2] = stackTop._level; // 5.2\n }\n\n // End of Paragraph: 3.3.2 X8\n else if (charType & TYPE_B) {\n embedLevels[i$2] = paragraph.level;\n }\n }\n\n // Non-formatting characters: 3.3.2 X6\n else {\n embedLevels[i$2] = stackTop._level;\n // NOTE: This exclusion of BN seems to go against what section 5.2 says, but is required for test passage\n if (stackTop._override && charType !== TYPE_BN) {\n changeCharType(i$2, stackTop._override);\n }\n }\n }\n\n // === 3.3.3 Preparations for Implicit Processing ===\n\n // Remove all RLE, LRE, RLO, LRO, PDF, and BN characters: 3.3.3 X9\n // Note: Due to section 5.2, we won't remove them, but we'll use the BN_LIKE_TYPES bitset to\n // easily ignore them all from here on out.\n\n // 3.3.3 X10\n // Compute the set of isolating run sequences as specified by BD13\n var levelRuns = [];\n var currentRun = null;\n for (var i$3 = paragraph.start; i$3 <= paragraph.end; i$3++) {\n var charType$1 = charTypes[i$3];\n if (!(charType$1 & BN_LIKE_TYPES)) {\n var lvl = embedLevels[i$3];\n var isIsolInit = charType$1 & ISOLATE_INIT_TYPES;\n var isPDI = charType$1 === TYPE_PDI;\n if (currentRun && lvl === currentRun._level) {\n currentRun._end = i$3;\n currentRun._endsWithIsolInit = isIsolInit;\n } else {\n levelRuns.push(currentRun = {\n _start: i$3,\n _end: i$3,\n _level: lvl,\n _startsWithPDI: isPDI,\n _endsWithIsolInit: isIsolInit\n });\n }\n }\n }\n var isolatingRunSeqs = []; // [{seqIndices: [], sosType: L|R, eosType: L|R}]\n for (var runIdx = 0; runIdx < levelRuns.length; runIdx++) {\n var run = levelRuns[runIdx];\n if (!run._startsWithPDI || (run._startsWithPDI && !isolationPairs.has(run._start))) {\n var seqRuns = [currentRun = run];\n for (var pdiIndex = (void 0); currentRun && currentRun._endsWithIsolInit && (pdiIndex = isolationPairs.get(currentRun._end)) != null;) {\n for (var i$4 = runIdx + 1; i$4 < levelRuns.length; i$4++) {\n if (levelRuns[i$4]._start === pdiIndex) {\n seqRuns.push(currentRun = levelRuns[i$4]);\n break\n }\n }\n }\n // build flat list of indices across all runs:\n var seqIndices = [];\n for (var i$5 = 0; i$5 < seqRuns.length; i$5++) {\n var run$1 = seqRuns[i$5];\n for (var j = run$1._start; j <= run$1._end; j++) {\n seqIndices.push(j);\n }\n }\n // determine the sos/eos types:\n var firstLevel = embedLevels[seqIndices[0]];\n var prevLevel = paragraph.level;\n for (var i$6 = seqIndices[0] - 1; i$6 >= 0; i$6--) {\n if (!(charTypes[i$6] & BN_LIKE_TYPES)) { //5.2\n prevLevel = embedLevels[i$6];\n break\n }\n }\n var lastIndex = seqIndices[seqIndices.length - 1];\n var lastLevel = embedLevels[lastIndex];\n var nextLevel = paragraph.level;\n if (!(charTypes[lastIndex] & ISOLATE_INIT_TYPES)) {\n for (var i$7 = lastIndex + 1; i$7 <= paragraph.end; i$7++) {\n if (!(charTypes[i$7] & BN_LIKE_TYPES)) { //5.2\n nextLevel = embedLevels[i$7];\n break\n }\n }\n }\n isolatingRunSeqs.push({\n _seqIndices: seqIndices,\n _sosType: Math.max(prevLevel, firstLevel) % 2 ? TYPE_R : TYPE_L,\n _eosType: Math.max(nextLevel, lastLevel) % 2 ? TYPE_R : TYPE_L\n });\n }\n }\n\n // The next steps are done per isolating run sequence\n for (var seqIdx = 0; seqIdx < isolatingRunSeqs.length; seqIdx++) {\n var ref = isolatingRunSeqs[seqIdx];\n var seqIndices$1 = ref._seqIndices;\n var sosType = ref._sosType;\n var eosType = ref._eosType;\n /**\n * All the level runs in an isolating run sequence have the same embedding level.\n * \n * DO NOT change any `embedLevels[i]` within the current scope.\n */\n var embedDirection = ((embedLevels[seqIndices$1[0]]) & 1) ? TYPE_R : TYPE_L;\n\n // === 3.3.4 Resolving Weak Types ===\n\n // W1 + 5.2. Search backward from each NSM to the first character in the isolating run sequence whose\n // bidirectional type is not BN, and set the NSM to ON if it is an isolate initiator or PDI, and to its\n // type otherwise. If the NSM is the first non-BN character, change the NSM to the type of sos.\n if (charTypeCounts.get(TYPE_NSM)) {\n for (var si = 0; si < seqIndices$1.length; si++) {\n var i$8 = seqIndices$1[si];\n if (charTypes[i$8] & TYPE_NSM) {\n var prevType = sosType;\n for (var sj = si - 1; sj >= 0; sj--) {\n if (!(charTypes[seqIndices$1[sj]] & BN_LIKE_TYPES)) { //5.2 scan back to first non-BN\n prevType = charTypes[seqIndices$1[sj]];\n break\n }\n }\n changeCharType(i$8, (prevType & (ISOLATE_INIT_TYPES | TYPE_PDI)) ? TYPE_ON : prevType);\n }\n }\n }\n\n // W2. Search backward from each instance of a European number until the first strong type (R, L, AL, or sos)\n // is found. If an AL is found, change the type of the European number to Arabic number.\n if (charTypeCounts.get(TYPE_EN)) {\n for (var si$1 = 0; si$1 < seqIndices$1.length; si$1++) {\n var i$9 = seqIndices$1[si$1];\n if (charTypes[i$9] & TYPE_EN) {\n for (var sj$1 = si$1 - 1; sj$1 >= -1; sj$1--) {\n var prevCharType = sj$1 === -1 ? sosType : charTypes[seqIndices$1[sj$1]];\n if (prevCharType & STRONG_TYPES) {\n if (prevCharType === TYPE_AL) {\n changeCharType(i$9, TYPE_AN);\n }\n break\n }\n }\n }\n }\n }\n\n // W3. Change all ALs to R\n if (charTypeCounts.get(TYPE_AL)) {\n for (var si$2 = 0; si$2 < seqIndices$1.length; si$2++) {\n var i$10 = seqIndices$1[si$2];\n if (charTypes[i$10] & TYPE_AL) {\n changeCharType(i$10, TYPE_R);\n }\n }\n }\n\n // W4. A single European separator between two European numbers changes to a European number. A single common\n // separator between two numbers of the same type changes to that type.\n if (charTypeCounts.get(TYPE_ES) || charTypeCounts.get(TYPE_CS)) {\n for (var si$3 = 1; si$3 < seqIndices$1.length - 1; si$3++) {\n var i$11 = seqIndices$1[si$3];\n if (charTypes[i$11] & (TYPE_ES | TYPE_CS)) {\n var prevType$1 = 0, nextType = 0;\n for (var sj$2 = si$3 - 1; sj$2 >= 0; sj$2--) {\n prevType$1 = charTypes[seqIndices$1[sj$2]];\n if (!(prevType$1 & BN_LIKE_TYPES)) { //5.2\n break\n }\n }\n for (var sj$3 = si$3 + 1; sj$3 < seqIndices$1.length; sj$3++) {\n nextType = charTypes[seqIndices$1[sj$3]];\n if (!(nextType & BN_LIKE_TYPES)) { //5.2\n break\n }\n }\n if (prevType$1 === nextType && (charTypes[i$11] === TYPE_ES ? prevType$1 === TYPE_EN : (prevType$1 & (TYPE_EN | TYPE_AN)))) {\n changeCharType(i$11, prevType$1);\n }\n }\n }\n }\n\n // W5. A sequence of European terminators adjacent to European numbers changes to all European numbers.\n if (charTypeCounts.get(TYPE_EN)) {\n for (var si$4 = 0; si$4 < seqIndices$1.length; si$4++) {\n var i$12 = seqIndices$1[si$4];\n if (charTypes[i$12] & TYPE_EN) {\n for (var sj$4 = si$4 - 1; sj$4 >= 0 && (charTypes[seqIndices$1[sj$4]] & (TYPE_ET | BN_LIKE_TYPES)); sj$4--) {\n changeCharType(seqIndices$1[sj$4], TYPE_EN);\n }\n for (si$4++; si$4 < seqIndices$1.length && (charTypes[seqIndices$1[si$4]] & (TYPE_ET | BN_LIKE_TYPES | TYPE_EN)); si$4++) {\n if (charTypes[seqIndices$1[si$4]] !== TYPE_EN) {\n changeCharType(seqIndices$1[si$4], TYPE_EN);\n }\n }\n }\n }\n }\n\n // W6. Otherwise, separators and terminators change to Other Neutral.\n if (charTypeCounts.get(TYPE_ET) || charTypeCounts.get(TYPE_ES) || charTypeCounts.get(TYPE_CS)) {\n for (var si$5 = 0; si$5 < seqIndices$1.length; si$5++) {\n var i$13 = seqIndices$1[si$5];\n if (charTypes[i$13] & (TYPE_ET | TYPE_ES | TYPE_CS)) {\n changeCharType(i$13, TYPE_ON);\n // 5.2 transform adjacent BNs too:\n for (var sj$5 = si$5 - 1; sj$5 >= 0 && (charTypes[seqIndices$1[sj$5]] & BN_LIKE_TYPES); sj$5--) {\n changeCharType(seqIndices$1[sj$5], TYPE_ON);\n }\n for (var sj$6 = si$5 + 1; sj$6 < seqIndices$1.length && (charTypes[seqIndices$1[sj$6]] & BN_LIKE_TYPES); sj$6++) {\n changeCharType(seqIndices$1[sj$6], TYPE_ON);\n }\n }\n }\n }\n\n // W7. Search backward from each instance of a European number until the first strong type (R, L, or sos)\n // is found. If an L is found, then change the type of the European number to L.\n // NOTE: implemented in single forward pass for efficiency\n if (charTypeCounts.get(TYPE_EN)) {\n for (var si$6 = 0, prevStrongType = sosType; si$6 < seqIndices$1.length; si$6++) {\n var i$14 = seqIndices$1[si$6];\n var type = charTypes[i$14];\n if (type & TYPE_EN) {\n if (prevStrongType === TYPE_L) {\n changeCharType(i$14, TYPE_L);\n }\n } else if (type & STRONG_TYPES) {\n prevStrongType = type;\n }\n }\n }\n\n // === 3.3.5 Resolving Neutral and Isolate Formatting Types ===\n\n if (charTypeCounts.get(NEUTRAL_ISOLATE_TYPES)) {\n // N0. Process bracket pairs in an isolating run sequence sequentially in the logical order of the text\n // positions of the opening paired brackets using the logic given below. Within this scope, bidirectional\n // types EN and AN are treated as R.\n var R_TYPES_FOR_N_STEPS = (TYPE_R | TYPE_EN | TYPE_AN);\n var STRONG_TYPES_FOR_N_STEPS = R_TYPES_FOR_N_STEPS | TYPE_L;\n\n // * Identify the bracket pairs in the current isolating run sequence according to BD16.\n var bracketPairs = [];\n {\n var openerStack = [];\n for (var si$7 = 0; si$7 < seqIndices$1.length; si$7++) {\n // NOTE: for any potential bracket character we also test that it still carries a NI\n // type, as that may have been changed earlier. This doesn't seem to be explicitly\n // called out in the spec, but is required for passage of certain tests.\n if (charTypes[seqIndices$1[si$7]] & NEUTRAL_ISOLATE_TYPES) {\n var char = string[seqIndices$1[si$7]];\n var oppositeBracket = (void 0);\n // Opening bracket\n if (openingToClosingBracket(char) !== null) {\n if (openerStack.length < 63) {\n openerStack.push({ char: char, seqIndex: si$7 });\n } else {\n break\n }\n }\n // Closing bracket\n else if ((oppositeBracket = closingToOpeningBracket(char)) !== null) {\n for (var stackIdx = openerStack.length - 1; stackIdx >= 0; stackIdx--) {\n var stackChar = openerStack[stackIdx].char;\n if (stackChar === oppositeBracket ||\n stackChar === closingToOpeningBracket(getCanonicalBracket(char)) ||\n openingToClosingBracket(getCanonicalBracket(stackChar)) === char\n ) {\n bracketPairs.push([openerStack[stackIdx].seqIndex, si$7]);\n openerStack.length = stackIdx; //pop the matching bracket and all following\n break\n }\n }\n }\n }\n }\n bracketPairs.sort(function (a, b) { return a[0] - b[0]; });\n }\n // * For each bracket-pair element in the list of pairs of text positions\n for (var pairIdx = 0; pairIdx < bracketPairs.length; pairIdx++) {\n var ref$1 = bracketPairs[pairIdx];\n var openSeqIdx = ref$1[0];\n var closeSeqIdx = ref$1[1];\n // a. Inspect the bidirectional types of the characters enclosed within the bracket pair.\n // b. If any strong type (either L or R) matching the embedding direction is found, set the type for both\n // brackets in the pair to match the embedding direction.\n var foundStrongType = false;\n var useStrongType = 0;\n for (var si$8 = openSeqIdx + 1; si$8 < closeSeqIdx; si$8++) {\n var i$15 = seqIndices$1[si$8];\n if (charTypes[i$15] & STRONG_TYPES_FOR_N_STEPS) {\n foundStrongType = true;\n var lr = (charTypes[i$15] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L;\n if (lr === embedDirection) {\n useStrongType = lr;\n break\n }\n }\n }\n // c. Otherwise, if there is a strong type it must be opposite the embedding direction. Therefore, test\n // for an established context with a preceding strong type by checking backwards before the opening paired\n // bracket until the first strong type (L, R, or sos) is found.\n // 1. If the preceding strong type is also opposite the embedding direction, context is established, so\n // set the type for both brackets in the pair to that direction.\n // 2. Otherwise set the type for both brackets in the pair to the embedding direction.\n if (foundStrongType && !useStrongType) {\n useStrongType = sosType;\n for (var si$9 = openSeqIdx - 1; si$9 >= 0; si$9--) {\n var i$16 = seqIndices$1[si$9];\n if (charTypes[i$16] & STRONG_TYPES_FOR_N_STEPS) {\n var lr$1 = (charTypes[i$16] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L;\n if (lr$1 !== embedDirection) {\n useStrongType = lr$1;\n } else {\n useStrongType = embedDirection;\n }\n break\n }\n }\n }\n if (useStrongType) {\n charTypes[seqIndices$1[openSeqIdx]] = charTypes[seqIndices$1[closeSeqIdx]] = useStrongType;\n // * Any number of characters that had original bidirectional character type NSM prior to the application\n // of W1 that immediately follow a paired bracket which changed to L or R under N0 should change to match\n // the type of their preceding bracket.\n if (useStrongType !== embedDirection) {\n for (var si$10 = openSeqIdx + 1; si$10 < seqIndices$1.length; si$10++) {\n if (!(charTypes[seqIndices$1[si$10]] & BN_LIKE_TYPES)) {\n if (getBidiCharType(string[seqIndices$1[si$10]]) & TYPE_NSM) {\n charTypes[seqIndices$1[si$10]] = useStrongType;\n }\n break\n }\n }\n }\n if (useStrongType !== embedDirection) {\n for (var si$11 = closeSeqIdx + 1; si$11 < seqIndices$1.length; si$11++) {\n if (!(charTypes[seqIndices$1[si$11]] & BN_LIKE_TYPES)) {\n if (getBidiCharType(string[seqIndices$1[si$11]]) & TYPE_NSM) {\n charTypes[seqIndices$1[si$11]] = useStrongType;\n }\n break\n }\n }\n }\n }\n }\n\n // N1. A sequence of NIs takes the direction of the surrounding strong text if the text on both sides has the\n // same direction.\n // N2. Any remaining NIs take the embedding direction.\n for (var si$12 = 0; si$12 < seqIndices$1.length; si$12++) {\n if (charTypes[seqIndices$1[si$12]] & NEUTRAL_ISOLATE_TYPES) {\n var niRunStart = si$12, niRunEnd = si$12;\n var prevType$2 = sosType; //si === 0 ? sosType : (charTypes[seqIndices[si - 1]] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L\n for (var si2 = si$12 - 1; si2 >= 0; si2--) {\n if (charTypes[seqIndices$1[si2]] & BN_LIKE_TYPES) {\n niRunStart = si2; //5.2 treat BNs adjacent to NIs as NIs\n } else {\n prevType$2 = (charTypes[seqIndices$1[si2]] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L;\n break\n }\n }\n var nextType$1 = eosType;\n for (var si2$1 = si$12 + 1; si2$1 < seqIndices$1.length; si2$1++) {\n if (charTypes[seqIndices$1[si2$1]] & (NEUTRAL_ISOLATE_TYPES | BN_LIKE_TYPES)) {\n niRunEnd = si2$1;\n } else {\n nextType$1 = (charTypes[seqIndices$1[si2$1]] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L;\n break\n }\n }\n for (var sj$7 = niRunStart; sj$7 <= niRunEnd; sj$7++) {\n charTypes[seqIndices$1[sj$7]] = prevType$2 === nextType$1 ? prevType$2 : embedDirection;\n }\n si$12 = niRunEnd;\n }\n }\n }\n }\n\n // === 3.3.6 Resolving Implicit Levels ===\n\n for (var i$17 = paragraph.start; i$17 <= paragraph.end; i$17++) {\n var level$3 = embedLevels[i$17];\n var type$1 = charTypes[i$17];\n // I2. For all characters with an odd (right-to-left) embedding level, those of type L, EN or AN go up one level.\n if (level$3 & 1) {\n if (type$1 & (TYPE_L | TYPE_EN | TYPE_AN)) {\n embedLevels[i$17]++;\n }\n }\n // I1. For all characters with an even (left-to-right) embedding level, those of type R go up one level\n // and those of type AN or EN go up two levels.\n else {\n if (type$1 & TYPE_R) {\n embedLevels[i$17]++;\n } else if (type$1 & (TYPE_AN | TYPE_EN)) {\n embedLevels[i$17] += 2;\n }\n }\n\n // 5.2: Resolve any LRE, RLE, LRO, RLO, PDF, or BN to the level of the preceding character if there is one,\n // and otherwise to the base level.\n if (type$1 & BN_LIKE_TYPES) {\n embedLevels[i$17] = i$17 === 0 ? paragraph.level : embedLevels[i$17 - 1];\n }\n\n // 3.4 L1.1-4: Reset the embedding level of segment/paragraph separators, and any sequence of whitespace or\n // isolate formatting characters preceding them or the end of the paragraph, to the paragraph level.\n // NOTE: this will also need to be applied to each individual line ending after line wrapping occurs.\n if (i$17 === paragraph.end || getBidiCharType(string[i$17]) & (TYPE_S | TYPE_B)) {\n for (var j$1 = i$17; j$1 >= 0 && (getBidiCharType(string[j$1]) & TRAILING_TYPES); j$1--) {\n embedLevels[j$1] = paragraph.level;\n }\n }\n }\n }\n\n // DONE! The resolved levels can then be used, after line wrapping, to flip runs of characters\n // according to section 3.4 Reordering Resolved Levels\n return {\n levels: embedLevels,\n paragraphs: paragraphs\n }\n\n function determineAutoEmbedLevel (start, isFSI) {\n // 3.3.1 P2 - P3\n for (var i = start; i < string.length; i++) {\n var charType = charTypes[i];\n if (charType & (TYPE_R | TYPE_AL)) {\n return 1\n }\n if ((charType & (TYPE_B | TYPE_L)) || (isFSI && charType === TYPE_PDI)) {\n return 0\n }\n if (charType & ISOLATE_INIT_TYPES) {\n var pdi = indexOfMatchingPDI(i);\n i = pdi === -1 ? string.length : pdi;\n }\n }\n return 0\n }\n\n function indexOfMatchingPDI (isolateStart) {\n // 3.1.2 BD9\n var isolationLevel = 1;\n for (var i = isolateStart + 1; i < string.length; i++) {\n var charType = charTypes[i];\n if (charType & TYPE_B) {\n break\n }\n if (charType & TYPE_PDI) {\n if (--isolationLevel === 0) {\n return i\n }\n } else if (charType & ISOLATE_INIT_TYPES) {\n isolationLevel++;\n }\n }\n return -1\n }\n }\n\n // Bidi mirrored chars data, auto generated\n var data = \"14>1,j>2,t>2,u>2,1a>g,2v3>1,1>1,1ge>1,1wd>1,b>1,1j>1,f>1,ai>3,-2>3,+1,8>1k0,-1jq>1y7,-1y6>1hf,-1he>1h6,-1h5>1ha,-1h8>1qi,-1pu>1,6>3u,-3s>7,6>1,1>1,f>1,1>1,+2,3>1,1>1,+13,4>1,1>1,6>1eo,-1ee>1,3>1mg,-1me>1mk,-1mj>1mi,-1mg>1mi,-1md>1,1>1,+2,1>10k,-103>1,1>1,4>1,5>1,1>1,+10,3>1,1>8,-7>8,+1,-6>7,+1,a>1,1>1,u>1,u6>1,1>1,+5,26>1,1>1,2>1,2>2,8>1,7>1,4>1,1>1,+5,b8>1,1>1,+3,1>3,-2>1,2>1,1>1,+2,c>1,3>1,1>1,+2,h>1,3>1,a>1,1>1,2>1,3>1,1>1,d>1,f>1,3>1,1a>1,1>1,6>1,7>1,13>1,k>1,1>1,+19,4>1,1>1,+2,2>1,1>1,+18,m>1,a>1,1>1,lk>1,1>1,4>1,2>1,f>1,3>1,1>1,+3,db>1,1>1,+3,3>1,1>1,+2,14qm>1,1>1,+1,6>1,4j>1,j>2,t>2,u>2,2>1,+1\";\n\n var mirrorMap;\n\n function parse () {\n if (!mirrorMap) {\n //const start = performance.now()\n var ref = parseCharacterMap(data, true);\n var map = ref.map;\n var reverseMap = ref.reverseMap;\n // Combine both maps into one\n reverseMap.forEach(function (value, key) {\n map.set(key, value);\n });\n mirrorMap = map;\n //console.log(`mirrored chars parsed in ${performance.now() - start}ms`)\n }\n }\n\n function getMirroredCharacter (char) {\n parse();\n return mirrorMap.get(char) || null\n }\n\n /**\n * Given a string and its resolved embedding levels, build a map of indices to replacement chars\n * for any characters in right-to-left segments that have defined mirrored characters.\n * @param string\n * @param embeddingLevels\n * @param [start]\n * @param [end]\n * @return {Map}\n */\n function getMirroredCharactersMap(string, embeddingLevels, start, end) {\n var strLen = string.length;\n start = Math.max(0, start == null ? 0 : +start);\n end = Math.min(strLen - 1, end == null ? strLen - 1 : +end);\n\n var map = new Map();\n for (var i = start; i <= end; i++) {\n if (embeddingLevels[i] & 1) { //only odd (rtl) levels\n var mirror = getMirroredCharacter(string[i]);\n if (mirror !== null) {\n map.set(i, mirror);\n }\n }\n }\n return map\n }\n\n /**\n * Given a start and end denoting a single line within a string, and a set of precalculated\n * bidi embedding levels, produce a list of segments whose ordering should be flipped, in sequence.\n * @param {string} string - the full input string\n * @param {GetEmbeddingLevelsResult} embeddingLevelsResult - the result object from getEmbeddingLevels\n * @param {number} [start] - first character in a subset of the full string\n * @param {number} [end] - last character in a subset of the full string\n * @return {number[][]} - the list of start/end segments that should be flipped, in order.\n */\n function getReorderSegments(string, embeddingLevelsResult, start, end) {\n var strLen = string.length;\n start = Math.max(0, start == null ? 0 : +start);\n end = Math.min(strLen - 1, end == null ? strLen - 1 : +end);\n\n var segments = [];\n embeddingLevelsResult.paragraphs.forEach(function (paragraph) {\n var lineStart = Math.max(start, paragraph.start);\n var lineEnd = Math.min(end, paragraph.end);\n if (lineStart < lineEnd) {\n // Local slice for mutation\n var lineLevels = embeddingLevelsResult.levels.slice(lineStart, lineEnd + 1);\n\n // 3.4 L1.4: Reset any sequence of whitespace characters and/or isolate formatting characters at the\n // end of the line to the paragraph level.\n for (var i = lineEnd; i >= lineStart && (getBidiCharType(string[i]) & TRAILING_TYPES); i--) {\n lineLevels[i] = paragraph.level;\n }\n\n // L2. From the highest level found in the text to the lowest odd level on each line, including intermediate levels\n // not actually present in the text, reverse any contiguous sequence of characters that are at that level or higher.\n var maxLevel = paragraph.level;\n var minOddLevel = Infinity;\n for (var i$1 = 0; i$1 < lineLevels.length; i$1++) {\n var level = lineLevels[i$1];\n if (level > maxLevel) { maxLevel = level; }\n if (level < minOddLevel) { minOddLevel = level | 1; }\n }\n for (var lvl = maxLevel; lvl >= minOddLevel; lvl--) {\n for (var i$2 = 0; i$2 < lineLevels.length; i$2++) {\n if (lineLevels[i$2] >= lvl) {\n var segStart = i$2;\n while (i$2 + 1 < lineLevels.length && lineLevels[i$2 + 1] >= lvl) {\n i$2++;\n }\n if (i$2 > segStart) {\n segments.push([segStart + lineStart, i$2 + lineStart]);\n }\n }\n }\n }\n }\n });\n return segments\n }\n\n /**\n * @param {string} string\n * @param {GetEmbeddingLevelsResult} embedLevelsResult\n * @param {number} [start]\n * @param {number} [end]\n * @return {string} the new string with bidi segments reordered\n */\n function getReorderedString(string, embedLevelsResult, start, end) {\n var indices = getReorderedIndices(string, embedLevelsResult, start, end);\n var chars = [].concat( string );\n indices.forEach(function (charIndex, i) {\n chars[i] = (\n (embedLevelsResult.levels[charIndex] & 1) ? getMirroredCharacter(string[charIndex]) : null\n ) || string[charIndex];\n });\n return chars.join('')\n }\n\n /**\n * @param {string} string\n * @param {GetEmbeddingLevelsResult} embedLevelsResult\n * @param {number} [start]\n * @param {number} [end]\n * @return {number[]} an array with character indices in their new bidi order\n */\n function getReorderedIndices(string, embedLevelsResult, start, end) {\n var segments = getReorderSegments(string, embedLevelsResult, start, end);\n // Fill an array with indices\n var indices = [];\n for (var i = 0; i < string.length; i++) {\n indices[i] = i;\n }\n // Reverse each segment in order\n segments.forEach(function (ref) {\n var start = ref[0];\n var end = ref[1];\n\n var slice = indices.slice(start, end + 1);\n for (var i = slice.length; i--;) {\n indices[end - i] = slice[i];\n }\n });\n return indices\n }\n\n exports.closingToOpeningBracket = closingToOpeningBracket;\n exports.getBidiCharType = getBidiCharType;\n exports.getBidiCharTypeName = getBidiCharTypeName;\n exports.getCanonicalBracket = getCanonicalBracket;\n exports.getEmbeddingLevels = getEmbeddingLevels;\n exports.getMirroredCharacter = getMirroredCharacter;\n exports.getMirroredCharactersMap = getMirroredCharactersMap;\n exports.getReorderSegments = getReorderSegments;\n exports.getReorderedIndices = getReorderedIndices;\n exports.getReorderedString = getReorderedString;\n exports.openingToClosingBracket = openingToClosingBracket;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n return exports;\n\n}({}));\nreturn bidi}\n\nexport default bidiFactory;\n","import { ShaderChunk, UniformsUtils, MeshDepthMaterial, RGBADepthPacking, MeshDistanceMaterial, ShaderLib, Matrix4, Vector3, Mesh, CylinderGeometry, Vector2, MeshStandardMaterial, DoubleSide } from 'three';\n\n/**\n * Regular expression for matching the `void main() {` opener line in GLSL.\n * @type {RegExp}\n */\nconst voidMainRegExp = /\\bvoid\\s+main\\s*\\(\\s*\\)\\s*{/g;\n\n/**\n * Recursively expands all `#include ` statements within string of shader code.\n * Copied from three's WebGLProgram#parseIncludes for external use.\n *\n * @param {string} source - The GLSL source code to evaluate\n * @return {string} The GLSL code with all includes expanded\n */\nfunction expandShaderIncludes( source ) {\n const pattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n function replace(match, include) {\n let chunk = ShaderChunk[include];\n return chunk ? expandShaderIncludes(chunk) : match\n }\n return source.replace( pattern, replace )\n}\n\n/*\n * This is a direct copy of MathUtils.generateUUID from Three.js, to preserve compatibility with three\n * versions before 0.113.0 as it was changed from Math to MathUtils in that version.\n * https://github.com/mrdoob/three.js/blob/dd8b5aa3b270c17096b90945cd2d6d1b13aaec53/src/math/MathUtils.js#L16\n */\n\nconst _lut = [];\n\nfor (let i = 0; i < 256; i++) {\n _lut[i] = (i < 16 ? '0' : '') + (i).toString(16);\n}\n\nfunction generateUUID() {\n\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n const d0 = Math.random() * 0xffffffff | 0;\n const d1 = Math.random() * 0xffffffff | 0;\n const d2 = Math.random() * 0xffffffff | 0;\n const d3 = Math.random() * 0xffffffff | 0;\n const uuid = _lut[d0 & 0xff] + _lut[d0 >> 8 & 0xff] + _lut[d0 >> 16 & 0xff] + _lut[d0 >> 24 & 0xff] + '-' +\n _lut[d1 & 0xff] + _lut[d1 >> 8 & 0xff] + '-' + _lut[d1 >> 16 & 0x0f | 0x40] + _lut[d1 >> 24 & 0xff] + '-' +\n _lut[d2 & 0x3f | 0x80] + _lut[d2 >> 8 & 0xff] + '-' + _lut[d2 >> 16 & 0xff] + _lut[d2 >> 24 & 0xff] +\n _lut[d3 & 0xff] + _lut[d3 >> 8 & 0xff] + _lut[d3 >> 16 & 0xff] + _lut[d3 >> 24 & 0xff];\n\n // .toUpperCase() here flattens concatenated strings to save heap memory space.\n return uuid.toUpperCase()\n\n}\n\n// Local assign polyfill to avoid importing troika-core\nconst assign = Object.assign || function(/*target, ...sources*/) {\n let target = arguments[0];\n for (let i = 1, len = arguments.length; i < len; i++) {\n let source = arguments[i];\n if (source) {\n for (let prop in source) {\n if (Object.prototype.hasOwnProperty.call(source, prop)) {\n target[prop] = source[prop];\n }\n }\n }\n }\n return target\n};\n\n\nconst epoch = Date.now();\nconst CONSTRUCTOR_CACHE = new WeakMap();\nconst SHADER_UPGRADE_CACHE = new Map();\n\n// Material ids must be integers, but we can't access the increment from Three's `Material` module,\n// so let's choose a sufficiently large starting value that should theoretically never collide.\nlet materialInstanceId = 1e10;\n\n/**\n * A utility for creating a custom shader material derived from another material's\n * shaders. This allows you to inject custom shader logic and transforms into the\n * builtin ThreeJS materials without having to recreate them from scratch.\n *\n * @param {THREE.Material} baseMaterial - the original material to derive from\n *\n * @param {Object} options - How the base material should be modified.\n * @param {Object} options.defines - Custom `defines` for the material\n * @param {Object} options.extensions - Custom `extensions` for the material, e.g. `{derivatives: true}`\n * @param {Object} options.uniforms - Custom `uniforms` for use in the modified shader. These can\n * be accessed and manipulated via the resulting material's `uniforms` property, just like\n * in a ShaderMaterial. You do not need to repeat the base material's own uniforms here.\n * @param {String} options.timeUniform - If specified, a uniform of this name will be injected into\n * both shaders, and it will automatically be updated on each render frame with a number of\n * elapsed milliseconds. The \"zero\" epoch time is not significant so don't rely on this as a\n * true calendar time.\n * @param {String} options.vertexDefs - Custom GLSL code to inject into the vertex shader's top-level\n * definitions, above the `void main()` function.\n * @param {String} options.vertexMainIntro - Custom GLSL code to inject at the top of the vertex\n * shader's `void main` function.\n * @param {String} options.vertexMainOutro - Custom GLSL code to inject at the end of the vertex\n * shader's `void main` function.\n * @param {String} options.vertexTransform - Custom GLSL code to manipulate the `position`, `normal`,\n * and/or `uv` vertex attributes. This code will be wrapped within a standalone function with\n * those attributes exposed by their normal names as read/write values.\n * @param {String} options.fragmentDefs - Custom GLSL code to inject into the fragment shader's top-level\n * definitions, above the `void main()` function.\n * @param {String} options.fragmentMainIntro - Custom GLSL code to inject at the top of the fragment\n * shader's `void main` function.\n * @param {String} options.fragmentMainOutro - Custom GLSL code to inject at the end of the fragment\n * shader's `void main` function. You can manipulate `gl_FragColor` here but keep in mind it goes\n * after any of ThreeJS's color postprocessing shader chunks (tonemapping, fog, etc.), so if you\n * want those to apply to your changes use `fragmentColorTransform` instead.\n * @param {String} options.fragmentColorTransform - Custom GLSL code to manipulate the `gl_FragColor`\n * output value. Will be injected near the end of the `void main` function, but before any\n * of ThreeJS's color postprocessing shader chunks (tonemapping, fog, etc.), and before the\n * `fragmentMainOutro`.\n * @param {function<{vertexShader,fragmentShader}>:{vertexShader,fragmentShader}} options.customRewriter - A function\n * for performing custom rewrites of the full shader code. Useful if you need to do something\n * special that's not covered by the other builtin options. This function will be executed before\n * any other transforms are applied.\n * @param {boolean} options.chained - Set to `true` to prototype-chain the derived material to the base\n * material, rather than the default behavior of copying it. This allows the derived material to\n * automatically pick up changes made to the base material and its properties. This can be useful\n * where the derived material is hidden from the user as an implementation detail, allowing them\n * to work with the original material like normal. But it can result in unexpected behavior if not\n * handled carefully.\n *\n * @return {THREE.Material}\n *\n * The returned material will also have two new methods, `getDepthMaterial()` and `getDistanceMaterial()`,\n * which can be called to get a variant of the derived material for use in shadow casting. If the\n * target mesh is expected to cast shadows, then you can assign these to the mesh's `customDepthMaterial`\n * (for directional and spot lights) and/or `customDistanceMaterial` (for point lights) properties to\n * allow the cast shadow to honor your derived shader's vertex transforms and discarded fragments. These\n * will also set a custom `#define IS_DEPTH_MATERIAL` or `#define IS_DISTANCE_MATERIAL` that you can look\n * for in your derived shaders with `#ifdef` to customize their behavior for the depth or distance\n * scenarios, e.g. skipping antialiasing or expensive shader logic.\n */\nfunction createDerivedMaterial(baseMaterial, options) {\n // Generate a key that is unique to the content of these `options`. We'll use this\n // throughout for caching and for generating the upgraded shader code. This increases\n // the likelihood that the resulting shaders will line up across multiple calls so\n // their GL programs can be shared and cached.\n const optionsKey = getKeyForOptions(options);\n\n // First check to see if we've already derived from this baseMaterial using this\n // unique set of options, and if so reuse the constructor to avoid some allocations.\n let ctorsByDerivation = CONSTRUCTOR_CACHE.get(baseMaterial);\n if (!ctorsByDerivation) {\n CONSTRUCTOR_CACHE.set(baseMaterial, (ctorsByDerivation = Object.create(null)));\n }\n if (ctorsByDerivation[optionsKey]) {\n return new ctorsByDerivation[optionsKey]()\n }\n\n const privateBeforeCompileProp = `_onBeforeCompile${optionsKey}`;\n\n // Private onBeforeCompile handler that injects the modified shaders and uniforms when\n // the renderer switches to this material's program\n const onBeforeCompile = function (shaderInfo, renderer) {\n baseMaterial.onBeforeCompile.call(this, shaderInfo, renderer);\n\n // Upgrade the shaders, caching the result by incoming source code\n const cacheKey = this.customProgramCacheKey() + '|' + shaderInfo.vertexShader + '|' + shaderInfo.fragmentShader;\n let upgradedShaders = SHADER_UPGRADE_CACHE[cacheKey];\n if (!upgradedShaders) {\n const upgraded = upgradeShaders(this, shaderInfo, options, optionsKey);\n upgradedShaders = SHADER_UPGRADE_CACHE[cacheKey] = upgraded;\n }\n\n // Inject upgraded shaders and uniforms into the program\n shaderInfo.vertexShader = upgradedShaders.vertexShader;\n shaderInfo.fragmentShader = upgradedShaders.fragmentShader;\n assign(shaderInfo.uniforms, this.uniforms);\n\n // Inject auto-updating time uniform if requested\n if (options.timeUniform) {\n shaderInfo.uniforms[options.timeUniform] = {\n get value() {return Date.now() - epoch}\n };\n }\n\n // Users can still add their own handlers on top of ours\n if (this[privateBeforeCompileProp]) {\n this[privateBeforeCompileProp](shaderInfo);\n }\n };\n\n const DerivedMaterial = function DerivedMaterial() {\n return derive(options.chained ? baseMaterial : baseMaterial.clone())\n };\n\n const derive = function(base) {\n // Prototype chain to the base material\n const derived = Object.create(base, descriptor);\n\n // Store the baseMaterial for reference; this is always the original even when cloning\n Object.defineProperty(derived, 'baseMaterial', { value: baseMaterial });\n\n // Needs its own ids\n Object.defineProperty(derived, 'id', { value: materialInstanceId++ });\n derived.uuid = generateUUID();\n\n // Merge uniforms, defines, and extensions\n derived.uniforms = assign({}, base.uniforms, options.uniforms);\n derived.defines = assign({}, base.defines, options.defines);\n derived.defines[`TROIKA_DERIVED_MATERIAL_${optionsKey}`] = ''; //force a program change from the base material\n derived.extensions = assign({}, base.extensions, options.extensions);\n\n // Don't inherit EventDispatcher listeners\n derived._listeners = undefined;\n\n return derived\n };\n\n const descriptor = {\n constructor: {value: DerivedMaterial},\n isDerivedMaterial: {value: true},\n\n customProgramCacheKey: {\n writable: true,\n configurable: true,\n value: function () {\n return baseMaterial.customProgramCacheKey() + '|' + optionsKey\n }\n },\n\n onBeforeCompile: {\n get() {\n return onBeforeCompile\n },\n set(fn) {\n this[privateBeforeCompileProp] = fn;\n }\n },\n\n copy: {\n writable: true,\n configurable: true,\n value: function (source) {\n baseMaterial.copy.call(this, source);\n if (!baseMaterial.isShaderMaterial && !baseMaterial.isDerivedMaterial) {\n assign(this.extensions, source.extensions);\n assign(this.defines, source.defines);\n assign(this.uniforms, UniformsUtils.clone(source.uniforms));\n }\n return this\n }\n },\n\n clone: {\n writable: true,\n configurable: true,\n value: function () {\n const newBase = new baseMaterial.constructor();\n return derive(newBase).copy(this)\n }\n },\n\n /**\n * Utility to get a MeshDepthMaterial that will honor this derived material's vertex\n * transformations and discarded fragments.\n */\n getDepthMaterial: {\n writable: true,\n configurable: true,\n value: function() {\n let depthMaterial = this._depthMaterial;\n if (!depthMaterial) {\n depthMaterial = this._depthMaterial = createDerivedMaterial(\n baseMaterial.isDerivedMaterial\n ? baseMaterial.getDepthMaterial()\n : new MeshDepthMaterial({ depthPacking: RGBADepthPacking }),\n options\n );\n depthMaterial.defines.IS_DEPTH_MATERIAL = '';\n depthMaterial.uniforms = this.uniforms; //automatically recieve same uniform values\n }\n return depthMaterial\n }\n },\n\n /**\n * Utility to get a MeshDistanceMaterial that will honor this derived material's vertex\n * transformations and discarded fragments.\n */\n getDistanceMaterial: {\n writable: true,\n configurable: true,\n value: function() {\n let distanceMaterial = this._distanceMaterial;\n if (!distanceMaterial) {\n distanceMaterial = this._distanceMaterial = createDerivedMaterial(\n baseMaterial.isDerivedMaterial\n ? baseMaterial.getDistanceMaterial()\n : new MeshDistanceMaterial(),\n options\n );\n distanceMaterial.defines.IS_DISTANCE_MATERIAL = '';\n distanceMaterial.uniforms = this.uniforms; //automatically recieve same uniform values\n }\n return distanceMaterial\n }\n },\n\n dispose: {\n writable: true,\n configurable: true,\n value() {\n const {_depthMaterial, _distanceMaterial} = this;\n if (_depthMaterial) _depthMaterial.dispose();\n if (_distanceMaterial) _distanceMaterial.dispose();\n baseMaterial.dispose.call(this);\n }\n }\n };\n\n ctorsByDerivation[optionsKey] = DerivedMaterial;\n return new DerivedMaterial()\n}\n\n\nfunction upgradeShaders(material, {vertexShader, fragmentShader}, options, key) {\n let {\n vertexDefs,\n vertexMainIntro,\n vertexMainOutro,\n vertexTransform,\n fragmentDefs,\n fragmentMainIntro,\n fragmentMainOutro,\n fragmentColorTransform,\n customRewriter,\n timeUniform\n } = options;\n\n vertexDefs = vertexDefs || '';\n vertexMainIntro = vertexMainIntro || '';\n vertexMainOutro = vertexMainOutro || '';\n fragmentDefs = fragmentDefs || '';\n fragmentMainIntro = fragmentMainIntro || '';\n fragmentMainOutro = fragmentMainOutro || '';\n\n // Expand includes if needed\n if (vertexTransform || customRewriter) {\n vertexShader = expandShaderIncludes(vertexShader);\n }\n if (fragmentColorTransform || customRewriter) {\n // We need to be able to find postprocessing chunks after include expansion in order to\n // put them after the fragmentColorTransform, so mark them with comments first. Even if\n // this particular derivation doesn't have a fragmentColorTransform, other derivations may,\n // so we still mark them.\n fragmentShader = fragmentShader.replace(\n /^[ \\t]*#include <((?:tonemapping|encodings|fog|premultiplied_alpha|dithering)_fragment)>/gm,\n '\\n//!BEGIN_POST_CHUNK $1\\n$&\\n//!END_POST_CHUNK\\n'\n );\n fragmentShader = expandShaderIncludes(fragmentShader);\n }\n\n // Apply custom rewriter function\n if (customRewriter) {\n let res = customRewriter({vertexShader, fragmentShader});\n vertexShader = res.vertexShader;\n fragmentShader = res.fragmentShader;\n }\n\n // The fragmentColorTransform needs to go before any postprocessing chunks, so extract\n // those and re-insert them into the outro in the correct place:\n if (fragmentColorTransform) {\n let postChunks = [];\n fragmentShader = fragmentShader.replace(\n /^\\/\\/!BEGIN_POST_CHUNK[^]+?^\\/\\/!END_POST_CHUNK/gm, // [^]+? = non-greedy match of any chars including newlines\n match => {\n postChunks.push(match);\n return ''\n }\n );\n fragmentMainOutro = `${fragmentColorTransform}\\n${postChunks.join('\\n')}\\n${fragmentMainOutro}`;\n }\n\n // Inject auto-updating time uniform if requested\n if (timeUniform) {\n const code = `\\nuniform float ${timeUniform};\\n`;\n vertexDefs = code + vertexDefs;\n fragmentDefs = code + fragmentDefs;\n }\n\n // Inject a function for the vertexTransform and rename all usages of position/normal/uv\n if (vertexTransform) {\n // Hoist these defs to the very top so they work in other function defs\n vertexShader = `vec3 troika_position_${key};\nvec3 troika_normal_${key};\nvec2 troika_uv_${key};\n${vertexShader}\n`;\n vertexDefs = `${vertexDefs}\nvoid troikaVertexTransform${key}(inout vec3 position, inout vec3 normal, inout vec2 uv) {\n ${vertexTransform}\n}\n`;\n vertexMainIntro = `\ntroika_position_${key} = vec3(position);\ntroika_normal_${key} = vec3(normal);\ntroika_uv_${key} = vec2(uv);\ntroikaVertexTransform${key}(troika_position_${key}, troika_normal_${key}, troika_uv_${key});\n${vertexMainIntro}\n`;\n vertexShader = vertexShader.replace(/\\b(position|normal|uv)\\b/g, (match, match1, index, fullStr) => {\n return /\\battribute\\s+vec[23]\\s+$/.test(fullStr.substr(0, index)) ? match1 : `troika_${match1}_${key}`\n });\n\n // Three r152 introduced the MAP_UV token, replace it too if it's pointing to the main 'uv'\n // Perhaps the other textures too going forward?\n if (!(material.map && material.map.channel > 0)) {\n vertexShader = vertexShader.replace(/\\bMAP_UV\\b/g, `troika_uv_${key}`);\n }\n }\n\n // Inject defs and intro/outro snippets\n vertexShader = injectIntoShaderCode(vertexShader, key, vertexDefs, vertexMainIntro, vertexMainOutro);\n fragmentShader = injectIntoShaderCode(fragmentShader, key, fragmentDefs, fragmentMainIntro, fragmentMainOutro);\n\n return {\n vertexShader,\n fragmentShader\n }\n}\n\nfunction injectIntoShaderCode(shaderCode, id, defs, intro, outro) {\n if (intro || outro || defs) {\n shaderCode = shaderCode.replace(voidMainRegExp, `\n${defs}\nvoid troikaOrigMain${id}() {`\n );\n shaderCode += `\nvoid main() {\n ${intro}\n troikaOrigMain${id}();\n ${outro}\n}`;\n }\n return shaderCode\n}\n\n\nfunction optionsJsonReplacer(key, value) {\n return key === 'uniforms' ? undefined : typeof value === 'function' ? value.toString() : value\n}\n\nlet _idCtr = 0;\nconst optionsHashesToIds = new Map();\nfunction getKeyForOptions(options) {\n const optionsHash = JSON.stringify(options, optionsJsonReplacer);\n let id = optionsHashesToIds.get(optionsHash);\n if (id == null) {\n optionsHashesToIds.set(optionsHash, (id = ++_idCtr));\n }\n return id\n}\n\n// Copied from threejs WebGLPrograms.js so we can resolve builtin materials to their shaders\n// TODO how can we keep this from getting stale?\nconst MATERIAL_TYPES_TO_SHADERS = {\n MeshDepthMaterial: 'depth',\n MeshDistanceMaterial: 'distanceRGBA',\n MeshNormalMaterial: 'normal',\n MeshBasicMaterial: 'basic',\n MeshLambertMaterial: 'lambert',\n MeshPhongMaterial: 'phong',\n MeshToonMaterial: 'toon',\n MeshStandardMaterial: 'physical',\n MeshPhysicalMaterial: 'physical',\n MeshMatcapMaterial: 'matcap',\n LineBasicMaterial: 'basic',\n LineDashedMaterial: 'dashed',\n PointsMaterial: 'points',\n ShadowMaterial: 'shadow',\n SpriteMaterial: 'sprite'\n};\n\n/**\n * Given a Three.js `Material` instance, find the shaders/uniforms that will be\n * used to render that material.\n *\n * @param material - the Material instance\n * @return {object} - the material's shader info: `{uniforms:{}, fragmentShader:'', vertexShader:''}`\n */\nfunction getShadersForMaterial(material) {\n let builtinType = MATERIAL_TYPES_TO_SHADERS[material.type];\n return builtinType ? ShaderLib[builtinType] : material //TODO fallback for unknown type?\n}\n\n/**\n * Find all uniforms and their types within a shader code string.\n *\n * @param {string} shader - The shader code to parse\n * @return {object} mapping of uniform names to their glsl type\n */\nfunction getShaderUniformTypes(shader) {\n let uniformRE = /\\buniform\\s+(int|float|vec[234]|mat[34])\\s+([A-Za-z_][\\w]*)/g;\n let uniforms = Object.create(null);\n let match;\n while ((match = uniformRE.exec(shader)) !== null) {\n uniforms[match[2]] = match[1];\n }\n return uniforms\n}\n\n/**\n * Helper for smoothing out the `m.getInverse(x)` --> `m.copy(x).invert()` conversion\n * that happened in ThreeJS r123.\n * @param {Matrix4} srcMatrix\n * @param {Matrix4} [tgtMatrix]\n */\nfunction invertMatrix4(srcMatrix, tgtMatrix = new Matrix4()) {\n if (typeof tgtMatrix.invert === 'function') {\n tgtMatrix.copy(srcMatrix).invert();\n } else {\n tgtMatrix.getInverse(srcMatrix);\n }\n return tgtMatrix\n}\n\n/*\nInput geometry is a cylinder with r=1, height in y dimension from 0 to 1,\ndivided into a reasonable number of height segments.\n*/\n\nconst vertexDefs = `\nuniform vec3 pointA;\nuniform vec3 controlA;\nuniform vec3 controlB;\nuniform vec3 pointB;\nuniform float radius;\nvarying float bezierT;\n\nvec3 cubicBezier(vec3 p1, vec3 c1, vec3 c2, vec3 p2, float t) {\n float t2 = 1.0 - t;\n float b0 = t2 * t2 * t2;\n float b1 = 3.0 * t * t2 * t2;\n float b2 = 3.0 * t * t * t2;\n float b3 = t * t * t;\n return b0 * p1 + b1 * c1 + b2 * c2 + b3 * p2;\n}\n\nvec3 cubicBezierDerivative(vec3 p1, vec3 c1, vec3 c2, vec3 p2, float t) {\n float t2 = 1.0 - t;\n return -3.0 * p1 * t2 * t2 +\n c1 * (3.0 * t2 * t2 - 6.0 * t2 * t) +\n c2 * (6.0 * t2 * t - 3.0 * t * t) +\n 3.0 * p2 * t * t;\n}\n`;\n\nconst vertexTransform = `\nfloat t = position.y;\nbezierT = t;\nvec3 bezierCenterPos = cubicBezier(pointA, controlA, controlB, pointB, t);\nvec3 bezierDir = normalize(cubicBezierDerivative(pointA, controlA, controlB, pointB, t));\n\n// Make \"sideways\" always perpendicular to the camera ray; this ensures that any twists\n// in the cylinder occur where you won't see them: \nvec3 viewDirection = normalMatrix * vec3(0.0, 0.0, 1.0);\nif (bezierDir == viewDirection) {\n bezierDir = normalize(cubicBezierDerivative(pointA, controlA, controlB, pointB, t == 1.0 ? t - 0.0001 : t + 0.0001));\n}\nvec3 sideways = normalize(cross(bezierDir, viewDirection));\nvec3 upish = normalize(cross(sideways, bezierDir));\n\n// Build a matrix for transforming this disc in the cylinder:\nmat4 discTx;\ndiscTx[0].xyz = sideways * radius;\ndiscTx[1].xyz = bezierDir * radius;\ndiscTx[2].xyz = upish * radius;\ndiscTx[3].xyz = bezierCenterPos;\ndiscTx[3][3] = 1.0;\n\n// Apply transform, ignoring original y\nposition = (discTx * vec4(position.x, 0.0, position.z, 1.0)).xyz;\nnormal = normalize(mat3(discTx) * normal);\n`;\n\nconst fragmentDefs = `\nuniform vec3 dashing;\nvarying float bezierT;\n`;\n\nconst fragmentMainIntro = `\nif (dashing.x + dashing.y > 0.0) {\n float dashFrac = mod(bezierT - dashing.z, dashing.x + dashing.y);\n if (dashFrac > dashing.x) {\n discard;\n }\n}\n`;\n\n// Debugging: separate color for each of the 6 sides:\n// const fragmentColorTransform = `\n// float sideNum = floor(vUV.x * 6.0);\n// vec3 mixColor = sideNum < 1.0 ? vec3(1.0, 0.0, 0.0) :\n// sideNum < 2.0 ? vec3(0.0, 1.0, 1.0) :\n// sideNum < 3.0 ? vec3(1.0, 1.0, 0.0) :\n// sideNum < 4.0 ? vec3(0.0, 0.0, 1.0) :\n// sideNum < 5.0 ? vec3(0.0, 1.0, 0.0) :\n// vec3(1.0, 0.0, 1.0);\n// gl_FragColor.xyz = mix(gl_FragColor.xyz, mixColor, 0.5);\n// `\n\n\n\nfunction createBezierMeshMaterial(baseMaterial) {\n return createDerivedMaterial(\n baseMaterial,\n {\n chained: true,\n uniforms: {\n pointA: {value: new Vector3()},\n controlA: {value: new Vector3()},\n controlB: {value: new Vector3()},\n pointB: {value: new Vector3()},\n radius: {value: 0.01},\n dashing: {value: new Vector3()} //on, off, offset\n },\n vertexDefs,\n vertexTransform,\n fragmentDefs,\n fragmentMainIntro\n }\n )\n}\n\nlet geometry = null;\n\nconst defaultBaseMaterial = /*#__PURE__*/new MeshStandardMaterial({color: 0xffffff, side: DoubleSide});\n\n\n/**\n * A ThreeJS `Mesh` that bends a tube shape along a 3D cubic bezier path. The bending is done\n * by deforming a straight cylindrical geometry in the vertex shader based on a set of four\n * control point uniforms. It patches the necessary GLSL into the mesh's assigned `material`\n * automatically.\n *\n * The cubiz bezier path is determined by its four `Vector3` properties:\n * - `pointA`\n * - `controlA`\n * - `controlB`\n * - `pointB`\n *\n * The tube's radius is controlled by its `radius` property, which defaults to `0.01`.\n *\n * You can also give the tube a dashed appearance with two properties:\n *\n * - `dashArray` - an array of two numbers, defining the length of \"on\" and \"off\" parts of\n * the dash. Each is a 0-1 ratio of the entire path's length. (Actually this is the `t` length\n * used as input to the cubic bezier function, not its visible length.)\n * - `dashOffset` - offset of where the dash starts. You can animate this to make the dashes move.\n *\n * Note that the dashes will appear like a hollow tube, not solid. This will be more apparent on\n * thicker tubes.\n *\n * TODO: proper geometry bounding sphere and raycasting\n * TODO: allow control of the geometry's segment counts\n */\nclass BezierMesh extends Mesh {\n static getGeometry() {\n return geometry || (geometry =\n new CylinderGeometry(1, 1, 1, 6, 64).translate(0, 0.5, 0)\n )\n }\n\n constructor() {\n super(\n BezierMesh.getGeometry(),\n defaultBaseMaterial\n );\n\n this.pointA = new Vector3();\n this.controlA = new Vector3();\n this.controlB = new Vector3();\n this.pointB = new Vector3();\n this.radius = 0.01;\n this.dashArray = new Vector2();\n this.dashOffset = 0;\n\n // TODO - disabling frustum culling until I figure out how to customize the\n // geometry's bounding sphere that gets used\n this.frustumCulled = false;\n }\n\n // Handler for automatically wrapping the base material with our upgrades. We do the wrapping\n // lazily on _read_ rather than write to avoid unnecessary wrapping on transient values.\n get material() {\n let derivedMaterial = this._derivedMaterial;\n const baseMaterial = this._baseMaterial || this._defaultMaterial || (this._defaultMaterial = defaultBaseMaterial.clone());\n if (!derivedMaterial || derivedMaterial.baseMaterial !== baseMaterial) {\n derivedMaterial = this._derivedMaterial = createBezierMeshMaterial(baseMaterial);\n // dispose the derived material when its base material is disposed:\n baseMaterial.addEventListener('dispose', function onDispose() {\n baseMaterial.removeEventListener('dispose', onDispose);\n derivedMaterial.dispose();\n });\n }\n return derivedMaterial\n }\n set material(baseMaterial) {\n this._baseMaterial = baseMaterial;\n }\n\n // Create and update material for shadows upon request:\n get customDepthMaterial() {\n return this.material.getDepthMaterial()\n }\n get customDistanceMaterial() {\n return this.material.getDistanceMaterial()\n }\n\n onBeforeRender() {\n const {uniforms} = this.material;\n const {pointA, controlA, controlB, pointB, radius, dashArray, dashOffset} = this;\n uniforms.pointA.value.copy(pointA);\n uniforms.controlA.value.copy(controlA);\n uniforms.controlB.value.copy(controlB);\n uniforms.pointB.value.copy(pointB);\n uniforms.radius.value = radius;\n uniforms.dashing.value.set(dashArray.x, dashArray.y, dashOffset || 0);\n }\n\n raycast(/*raycaster, intersects*/) {\n // TODO - just fail for now\n }\n}\n\nexport { BezierMesh, createDerivedMaterial, expandShaderIncludes, getShaderUniformTypes, getShadersForMaterial, invertMatrix4, voidMainRegExp };\n","import { Texture, LinearFilter, Color, InstancedBufferGeometry, Sphere, Box3, BackSide, DoubleSide, InstancedBufferAttribute, PlaneGeometry, BufferGeometry, Float32BufferAttribute, Vector2, Vector4, Matrix3, Mesh, FrontSide, MeshBasicMaterial, Matrix4, Vector3 } from 'three';\nimport { terminateWorker, defineWorkerModule } from 'troika-worker-utils';\nimport createSDFGenerator from 'webgl-sdf-generator';\nimport bidiFactory from 'bidi-js';\nimport { createDerivedMaterial, voidMainRegExp } from 'troika-three-utils';\n\n/**\n * Factory function that creates a self-contained environment for processing text typesetting requests.\n *\n * It is important that this function has no closure dependencies, so that it can be easily injected\n * into the source for a Worker without requiring a build step or complex dependency loading. All its\n * dependencies must be passed in at initialization.\n *\n * @param {function} fontParser - a function that accepts an ArrayBuffer of the font data and returns\n * a standardized structure giving access to the font and its glyphs:\n * {\n * unitsPerEm: number,\n * ascender: number,\n * descender: number,\n * capHeight: number,\n * xHeight: number,\n * lineGap: number,\n * forEachGlyph(string, fontSize, letterSpacing, callback) {\n * //invokes callback for each glyph to render, passing it an object:\n * callback({\n * index: number,\n * advanceWidth: number,\n * xMin: number,\n * yMin: number,\n * xMax: number,\n * yMax: number,\n * path: string,\n * pathCommandCount: number\n * })\n * }\n * }\n * @param {object} bidi - the bidi.js implementation object\n * @param {Object} config\n * @return {Object}\n */\nfunction createTypesetter(fontParser, bidi, config) {\n\n const {\n defaultFontURL\n } = config;\n\n /**\n * Holds parsed font objects by url\n */\n const fonts = Object.create(null);\n\n const INF = Infinity;\n\n // Set of Unicode Default_Ignorable_Code_Point characters, these will not produce visible glyphs\n // eslint-disable-next-line no-misleading-character-class\n const DEFAULT_IGNORABLE_CHARS = /[\\u00AD\\u034F\\u061C\\u115F-\\u1160\\u17B4-\\u17B5\\u180B-\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u3164\\uFE00-\\uFE0F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8]/;\n\n // This regex (instead of /\\s/) allows us to select all whitespace EXCEPT for non-breaking white spaces\n const lineBreakingWhiteSpace = `[^\\\\S\\\\u00A0]`;\n\n // Incomplete set of characters that allow line breaking after them\n // In the future we may consider a full Unicode line breaking algorithm impl: https://www.unicode.org/reports/tr14\n const BREAK_AFTER_CHARS = new RegExp(`${lineBreakingWhiteSpace}|[\\\\-\\\\u007C\\\\u00AD\\\\u2010\\\\u2012-\\\\u2014\\\\u2027\\\\u2056\\\\u2E17\\\\u2E40]`);\n\n /**\n * Load a given font url\n */\n function doLoadFont(url, callback) {\n function tryLoad() {\n const onError = err => {\n console.error(`Failure loading font ${url}${url === defaultFontURL ? '' : '; trying fallback'}`, err);\n if (url !== defaultFontURL) {\n url = defaultFontURL;\n tryLoad();\n }\n };\n try {\n const request = new XMLHttpRequest();\n request.open('get', url, true);\n request.responseType = 'arraybuffer';\n request.onload = function () {\n if (request.status >= 400) {\n onError(new Error(request.statusText));\n }\n else if (request.status > 0) {\n try {\n const fontObj = fontParser(request.response);\n callback(fontObj);\n } catch (e) {\n onError(e);\n }\n }\n };\n request.onerror = onError;\n request.send();\n } catch(err) {\n onError(err);\n }\n }\n tryLoad();\n }\n\n\n /**\n * Load a given font url if needed, invoking a callback when it's loaded. If already\n * loaded, the callback will be called synchronously.\n */\n function loadFont(fontUrl, callback) {\n if (!fontUrl) fontUrl = defaultFontURL;\n let font = fonts[fontUrl];\n if (font) {\n // if currently loading font, add to callbacks, otherwise execute immediately\n if (font.pending) {\n font.pending.push(callback);\n } else {\n callback(font);\n }\n } else {\n fonts[fontUrl] = {pending: [callback]};\n doLoadFont(fontUrl, fontObj => {\n let callbacks = fonts[fontUrl].pending;\n fonts[fontUrl] = fontObj;\n callbacks.forEach(cb => cb(fontObj));\n });\n }\n }\n\n\n /**\n * Main entry point.\n * Process a text string with given font and formatting parameters, and return all info\n * necessary to render all its glyphs.\n */\n function typeset(\n {\n text='',\n font=defaultFontURL,\n sdfGlyphSize=64,\n fontSize=1,\n letterSpacing=0,\n lineHeight='normal',\n maxWidth=INF,\n direction,\n textAlign='left',\n textIndent=0,\n whiteSpace='normal',\n overflowWrap='normal',\n anchorX = 0,\n anchorY = 0,\n includeCaretPositions=false,\n chunkedBoundsSize=8192,\n colorRanges=null\n },\n callback,\n metricsOnly=false\n ) {\n const mainStart = now();\n const timings = {fontLoad: 0, typesetting: 0};\n\n // Ensure newlines are normalized\n if (text.indexOf('\\r') > -1) {\n console.info('Typesetter: got text with \\\\r chars; normalizing to \\\\n');\n text = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n }\n\n // Ensure we've got numbers not strings\n fontSize = +fontSize;\n letterSpacing = +letterSpacing;\n maxWidth = +maxWidth;\n lineHeight = lineHeight || 'normal';\n textIndent = +textIndent;\n\n loadFont(font, fontObj => {\n const hasMaxWidth = isFinite(maxWidth);\n let glyphIds = null;\n let glyphPositions = null;\n let glyphData = null;\n let glyphColors = null;\n let caretPositions = null;\n let visibleBounds = null;\n let chunkedBounds = null;\n let maxLineWidth = 0;\n let renderableGlyphCount = 0;\n let canWrap = whiteSpace !== 'nowrap';\n const {ascender, descender, unitsPerEm, lineGap, capHeight, xHeight} = fontObj;\n timings.fontLoad = now() - mainStart;\n const typesetStart = now();\n\n // Find conversion between native font units and fontSize units; this will already be done\n // for the gx/gy values below but everything else we'll need to convert\n const fontSizeMult = fontSize / unitsPerEm;\n\n // Determine appropriate value for 'normal' line height based on the font's actual metrics\n // TODO this does not guarantee individual glyphs won't exceed the line height, e.g. Roboto; should we use yMin/Max instead?\n if (lineHeight === 'normal') {\n lineHeight = (ascender - descender + lineGap) / unitsPerEm;\n }\n\n // Determine line height and leading adjustments\n lineHeight = lineHeight * fontSize;\n const halfLeading = (lineHeight - (ascender - descender) * fontSizeMult) / 2;\n const topBaseline = -(ascender * fontSizeMult + halfLeading);\n const caretHeight = Math.min(lineHeight, (ascender - descender) * fontSizeMult);\n const caretBottomOffset = (ascender + descender) / 2 * fontSizeMult - caretHeight / 2;\n\n // Distribute glyphs into lines based on wrapping\n let lineXOffset = textIndent;\n let currentLine = new TextLine();\n const lines = [currentLine];\n\n fontObj.forEachGlyph(text, fontSize, letterSpacing, (glyphObj, glyphX, charIndex) => {\n const char = text.charAt(charIndex);\n const glyphWidth = glyphObj.advanceWidth * fontSizeMult;\n const curLineCount = currentLine.count;\n let nextLine;\n\n // Calc isWhitespace and isEmpty once per glyphObj\n if (!('isEmpty' in glyphObj)) {\n glyphObj.isWhitespace = !!char && new RegExp(lineBreakingWhiteSpace).test(char);\n glyphObj.canBreakAfter = !!char && BREAK_AFTER_CHARS.test(char);\n glyphObj.isEmpty = glyphObj.xMin === glyphObj.xMax || glyphObj.yMin === glyphObj.yMax || DEFAULT_IGNORABLE_CHARS.test(char);\n }\n if (!glyphObj.isWhitespace && !glyphObj.isEmpty) {\n renderableGlyphCount++;\n }\n\n // If a non-whitespace character overflows the max width, we need to soft-wrap\n if (canWrap && hasMaxWidth && !glyphObj.isWhitespace && glyphX + glyphWidth + lineXOffset > maxWidth && curLineCount) {\n // If it's the first char after a whitespace, start a new line\n if (currentLine.glyphAt(curLineCount - 1).glyphObj.canBreakAfter) {\n nextLine = new TextLine();\n lineXOffset = -glyphX;\n } else {\n // Back up looking for a whitespace character to wrap at\n for (let i = curLineCount; i--;) {\n // If we got the start of the line there's no soft break point; make hard break if overflowWrap='break-word'\n if (i === 0 && overflowWrap === 'break-word') {\n nextLine = new TextLine();\n lineXOffset = -glyphX;\n break\n }\n // Found a soft break point; move all chars since it to a new line\n else if (currentLine.glyphAt(i).glyphObj.canBreakAfter) {\n nextLine = currentLine.splitAt(i + 1);\n const adjustX = nextLine.glyphAt(0).x;\n lineXOffset -= adjustX;\n for (let j = nextLine.count; j--;) {\n nextLine.glyphAt(j).x -= adjustX;\n }\n break\n }\n }\n }\n if (nextLine) {\n currentLine.isSoftWrapped = true;\n currentLine = nextLine;\n lines.push(currentLine);\n maxLineWidth = maxWidth; //after soft wrapping use maxWidth as calculated width\n }\n }\n\n let fly = currentLine.glyphAt(currentLine.count);\n fly.glyphObj = glyphObj;\n fly.x = glyphX + lineXOffset;\n fly.width = glyphWidth;\n fly.charIndex = charIndex;\n\n // Handle hard line breaks\n if (char === '\\n') {\n currentLine = new TextLine();\n lines.push(currentLine);\n lineXOffset = -(glyphX + glyphWidth + (letterSpacing * fontSize)) + textIndent;\n }\n });\n\n // Calculate width of each line (excluding trailing whitespace) and maximum block width\n lines.forEach(line => {\n for (let i = line.count; i--;) {\n let {glyphObj, x, width} = line.glyphAt(i);\n if (!glyphObj.isWhitespace) {\n line.width = x + width;\n if (line.width > maxLineWidth) {\n maxLineWidth = line.width;\n }\n return\n }\n }\n });\n\n // Find overall position adjustments for anchoring\n let anchorXOffset = 0;\n let anchorYOffset = 0;\n if (anchorX) {\n if (typeof anchorX === 'number') {\n anchorXOffset = -anchorX;\n }\n else if (typeof anchorX === 'string') {\n anchorXOffset = -maxLineWidth * (\n anchorX === 'left' ? 0 :\n anchorX === 'center' ? 0.5 :\n anchorX === 'right' ? 1 :\n parsePercent(anchorX)\n );\n }\n }\n if (anchorY) {\n if (typeof anchorY === 'number') {\n anchorYOffset = -anchorY;\n }\n else if (typeof anchorY === 'string') {\n let height = lines.length * lineHeight;\n anchorYOffset = anchorY === 'top' ? 0 :\n anchorY === 'top-baseline' ? -topBaseline :\n anchorY === 'top-cap' ? -topBaseline - capHeight * fontSizeMult :\n anchorY === 'top-ex' ? -topBaseline - xHeight * fontSizeMult :\n anchorY === 'middle' ? height / 2 :\n anchorY === 'bottom' ? height :\n anchorY === 'bottom-baseline' ? height - halfLeading + descender * fontSizeMult :\n parsePercent(anchorY) * height;\n }\n }\n\n if (!metricsOnly) {\n // Resolve bidi levels\n const bidiLevelsResult = bidi.getEmbeddingLevels(text, direction);\n\n // Process each line, applying alignment offsets, adding each glyph to the atlas, and\n // collecting all renderable glyphs into a single collection.\n glyphIds = new Uint16Array(renderableGlyphCount);\n glyphPositions = new Float32Array(renderableGlyphCount * 2);\n glyphData = {};\n visibleBounds = [INF, INF, -INF, -INF];\n chunkedBounds = [];\n let lineYOffset = topBaseline;\n if (includeCaretPositions) {\n caretPositions = new Float32Array(text.length * 3);\n }\n if (colorRanges) {\n glyphColors = new Uint8Array(renderableGlyphCount * 3);\n }\n let renderableGlyphIndex = 0;\n let prevCharIndex = -1;\n let colorCharIndex = -1;\n let chunk;\n let currentColor;\n lines.forEach((line, lineIndex) => {\n let {count:lineGlyphCount, width:lineWidth} = line;\n\n // Ignore empty lines\n if (lineGlyphCount > 0) {\n // Count trailing whitespaces, we want to ignore these for certain things\n let trailingWhitespaceCount = 0;\n for (let i = lineGlyphCount; i-- && line.glyphAt(i).glyphObj.isWhitespace;) {\n trailingWhitespaceCount++;\n }\n\n // Apply horizontal alignment adjustments\n let lineXOffset = 0;\n let justifyAdjust = 0;\n if (textAlign === 'center') {\n lineXOffset = (maxLineWidth - lineWidth) / 2;\n } else if (textAlign === 'right') {\n lineXOffset = maxLineWidth - lineWidth;\n } else if (textAlign === 'justify' && line.isSoftWrapped) {\n // count non-trailing whitespace characters, and we'll adjust the offsets per character in the next loop\n let whitespaceCount = 0;\n for (let i = lineGlyphCount - trailingWhitespaceCount; i--;) {\n if (line.glyphAt(i).glyphObj.isWhitespace) {\n whitespaceCount++;\n }\n }\n justifyAdjust = (maxLineWidth - lineWidth) / whitespaceCount;\n }\n if (justifyAdjust || lineXOffset) {\n let justifyOffset = 0;\n for (let i = 0; i < lineGlyphCount; i++) {\n let glyphInfo = line.glyphAt(i);\n const glyphObj = glyphInfo.glyphObj;\n glyphInfo.x += lineXOffset + justifyOffset;\n // Expand non-trailing whitespaces for justify alignment\n if (justifyAdjust !== 0 && glyphObj.isWhitespace && i < lineGlyphCount - trailingWhitespaceCount) {\n justifyOffset += justifyAdjust;\n glyphInfo.width += justifyAdjust;\n }\n }\n }\n\n // Perform bidi range flipping\n const flips = bidi.getReorderSegments(\n text, bidiLevelsResult, line.glyphAt(0).charIndex, line.glyphAt(line.count - 1).charIndex\n );\n for (let fi = 0; fi < flips.length; fi++) {\n const [start, end] = flips[fi];\n // Map start/end string indices to indices in the line\n let left = Infinity, right = -Infinity;\n for (let i = 0; i < lineGlyphCount; i++) {\n if (line.glyphAt(i).charIndex >= start) { // gte to handle removed characters\n let startInLine = i, endInLine = i;\n for (; endInLine < lineGlyphCount; endInLine++) {\n let info = line.glyphAt(endInLine);\n if (info.charIndex > end) {\n break\n }\n if (endInLine < lineGlyphCount - trailingWhitespaceCount) { //don't include trailing ws in flip width\n left = Math.min(left, info.x);\n right = Math.max(right, info.x + info.width);\n }\n }\n for (let j = startInLine; j < endInLine; j++) {\n const glyphInfo = line.glyphAt(j);\n glyphInfo.x = right - (glyphInfo.x + glyphInfo.width - left);\n }\n break\n }\n }\n }\n\n // Assemble final data arrays\n let glyphObj;\n const setGlyphObj = g => glyphObj = g;\n for (let i = 0; i < lineGlyphCount; i++) {\n let glyphInfo = line.glyphAt(i);\n glyphObj = glyphInfo.glyphObj;\n const glyphId = glyphObj.index;\n\n // Replace mirrored characters in rtl\n const rtl = bidiLevelsResult.levels[glyphInfo.charIndex] & 1; //odd level means rtl\n if (rtl) {\n const mirrored = bidi.getMirroredCharacter(text[glyphInfo.charIndex]);\n if (mirrored) {\n fontObj.forEachGlyph(mirrored, 0, 0, setGlyphObj);\n }\n }\n\n // Add caret positions\n if (includeCaretPositions) {\n const {charIndex} = glyphInfo;\n const caretLeft = glyphInfo.x + anchorXOffset;\n const caretRight = glyphInfo.x + glyphInfo.width + anchorXOffset;\n caretPositions[charIndex * 3] = rtl ? caretRight : caretLeft; //start edge x\n caretPositions[charIndex * 3 + 1] = rtl ? caretLeft : caretRight; //end edge x\n caretPositions[charIndex * 3 + 2] = lineYOffset + caretBottomOffset + anchorYOffset; //common bottom y\n\n // If we skipped any chars from the previous glyph (due to ligature subs), fill in caret\n // positions for those missing char indices; currently this uses a best-guess by dividing\n // the ligature's width evenly. In the future we may try to use the font's LigatureCaretList\n // table to get better interior caret positions.\n const ligCount = charIndex - prevCharIndex;\n if (ligCount > 1) {\n fillLigatureCaretPositions(caretPositions, prevCharIndex, ligCount);\n }\n prevCharIndex = charIndex;\n }\n\n // Track current color range\n if (colorRanges) {\n const {charIndex} = glyphInfo;\n while(charIndex > colorCharIndex) {\n colorCharIndex++;\n if (colorRanges.hasOwnProperty(colorCharIndex)) {\n currentColor = colorRanges[colorCharIndex];\n }\n }\n }\n\n // Get atlas data for renderable glyphs\n if (!glyphObj.isWhitespace && !glyphObj.isEmpty) {\n const idx = renderableGlyphIndex++;\n\n // Add this glyph's path data\n if (!glyphData[glyphId]) {\n glyphData[glyphId] = {\n path: glyphObj.path,\n pathBounds: [glyphObj.xMin, glyphObj.yMin, glyphObj.xMax, glyphObj.yMax]\n };\n }\n\n // Determine final glyph position and add to glyphPositions array\n const glyphX = glyphInfo.x + anchorXOffset;\n const glyphY = lineYOffset + anchorYOffset;\n glyphPositions[idx * 2] = glyphX;\n glyphPositions[idx * 2 + 1] = glyphY;\n\n // Track total visible bounds\n const visX0 = glyphX + glyphObj.xMin * fontSizeMult;\n const visY0 = glyphY + glyphObj.yMin * fontSizeMult;\n const visX1 = glyphX + glyphObj.xMax * fontSizeMult;\n const visY1 = glyphY + glyphObj.yMax * fontSizeMult;\n if (visX0 < visibleBounds[0]) visibleBounds[0] = visX0;\n if (visY0 < visibleBounds[1]) visibleBounds[1] = visY0;\n if (visX1 > visibleBounds[2]) visibleBounds[2] = visX1;\n if (visY1 > visibleBounds[3]) visibleBounds[3] = visY1;\n\n // Track bounding rects for each chunk of N glyphs\n if (idx % chunkedBoundsSize === 0) {\n chunk = {start: idx, end: idx, rect: [INF, INF, -INF, -INF]};\n chunkedBounds.push(chunk);\n }\n chunk.end++;\n const chunkRect = chunk.rect;\n if (visX0 < chunkRect[0]) chunkRect[0] = visX0;\n if (visY0 < chunkRect[1]) chunkRect[1] = visY0;\n if (visX1 > chunkRect[2]) chunkRect[2] = visX1;\n if (visY1 > chunkRect[3]) chunkRect[3] = visY1;\n\n // Add to glyph ids array\n glyphIds[idx] = glyphId;\n\n // Add colors\n if (colorRanges) {\n const start = idx * 3;\n glyphColors[start] = currentColor >> 16 & 255;\n glyphColors[start + 1] = currentColor >> 8 & 255;\n glyphColors[start + 2] = currentColor & 255;\n }\n }\n }\n }\n\n // Increment y offset for next line\n lineYOffset -= lineHeight;\n });\n\n // Fill in remaining caret positions in case the final character was a ligature\n if (caretPositions) {\n const ligCount = text.length - prevCharIndex;\n if (ligCount > 1) {\n fillLigatureCaretPositions(caretPositions, prevCharIndex, ligCount);\n }\n }\n }\n\n // Timing stats\n timings.typesetting = now() - typesetStart;\n\n callback({\n glyphIds, //font indices for each glyph\n glyphPositions, //x,y of each glyph's origin in layout\n glyphData, //dict holding data about each glyph appearing in the text\n caretPositions, //startX,endX,bottomY caret positions for each char\n caretHeight, //height of cursor from bottom to top\n glyphColors, //color for each glyph, if color ranges supplied\n chunkedBounds, //total rects per (n=chunkedBoundsSize) consecutive glyphs\n fontSize, //calculated em height\n unitsPerEm, //font units per em\n ascender: ascender * fontSizeMult, //font ascender\n descender: descender * fontSizeMult, //font descender\n capHeight: capHeight * fontSizeMult, //font cap-height\n xHeight: xHeight * fontSizeMult, //font x-height\n lineHeight, //computed line height\n topBaseline, //y coordinate of the top line's baseline\n blockBounds: [ //bounds for the whole block of text, including vertical padding for lineHeight\n anchorXOffset,\n anchorYOffset - lines.length * lineHeight,\n anchorXOffset + maxLineWidth,\n anchorYOffset\n ],\n visibleBounds, //total bounds of visible text paths, may be larger or smaller than blockBounds\n timings\n });\n });\n }\n\n\n /**\n * For a given text string and font parameters, determine the resulting block dimensions\n * after wrapping for the given maxWidth.\n * @param args\n * @param callback\n */\n function measure(args, callback) {\n typeset(args, (result) => {\n const [x0, y0, x1, y1] = result.blockBounds;\n callback({\n width: x1 - x0,\n height: y1 - y0\n });\n }, {metricsOnly: true});\n }\n\n function parsePercent(str) {\n let match = str.match(/^([\\d.]+)%$/);\n let pct = match ? parseFloat(match[1]) : NaN;\n return isNaN(pct) ? 0 : pct / 100\n }\n\n function fillLigatureCaretPositions(caretPositions, ligStartIndex, ligCount) {\n const ligStartX = caretPositions[ligStartIndex * 3];\n const ligEndX = caretPositions[ligStartIndex * 3 + 1];\n const ligY = caretPositions[ligStartIndex * 3 + 2];\n const guessedAdvanceX = (ligEndX - ligStartX) / ligCount;\n for (let i = 0; i < ligCount; i++) {\n const startIndex = (ligStartIndex + i) * 3;\n caretPositions[startIndex] = ligStartX + guessedAdvanceX * i;\n caretPositions[startIndex + 1] = ligStartX + guessedAdvanceX * (i + 1);\n caretPositions[startIndex + 2] = ligY;\n }\n }\n\n function now() {\n return (self.performance || Date).now()\n }\n\n // Array-backed structure for a single line's glyphs data\n function TextLine() {\n this.data = [];\n }\n const textLineProps = ['glyphObj', 'x', 'width', 'charIndex'];\n TextLine.prototype = {\n width: 0,\n isSoftWrapped: false,\n get count() {\n return Math.ceil(this.data.length / textLineProps.length)\n },\n glyphAt(i) {\n let fly = TextLine.flyweight;\n fly.data = this.data;\n fly.index = i;\n return fly\n },\n splitAt(i) {\n let newLine = new TextLine();\n newLine.data = this.data.splice(i * textLineProps.length);\n return newLine\n }\n };\n TextLine.flyweight = textLineProps.reduce((obj, prop, i, all) => {\n Object.defineProperty(obj, prop, {\n get() {\n return this.data[this.index * textLineProps.length + i]\n },\n set(val) {\n this.data[this.index * textLineProps.length + i] = val;\n }\n });\n return obj\n }, {data: null, index: 0});\n\n\n return {\n typeset,\n measure,\n loadFont\n }\n}\n\nconst now = () => (self.performance || Date).now();\n\nconst mainThreadGenerator = /*#__PURE__*/ createSDFGenerator();\n\nlet warned;\n\n/**\n * Generate an SDF texture image for a single glyph path, placing the result into a webgl canvas at a\n * given location and channel. Utilizes the webgl-sdf-generator external package for GPU-accelerated SDF\n * generation when supported.\n */\nfunction generateSDF(width, height, path, viewBox, distance, exponent, canvas, x, y, channel, useWebGL = true) {\n // Allow opt-out\n if (!useWebGL) {\n return generateSDF_JS_Worker(width, height, path, viewBox, distance, exponent, canvas, x, y, channel)\n }\n\n // Attempt GPU-accelerated generation first\n return generateSDF_GL(width, height, path, viewBox, distance, exponent, canvas, x, y, channel).then(\n null,\n err => {\n // WebGL failed either due to a hard error or unexpected results; fall back to JS in workers\n if (!warned) {\n console.warn(`WebGL SDF generation failed, falling back to JS`, err);\n warned = true;\n }\n return generateSDF_JS_Worker(width, height, path, viewBox, distance, exponent, canvas, x, y, channel)\n }\n )\n}\n\nconst queue = [];\nconst chunkTimeBudget = 5; // ms\nlet timer = 0;\n\nfunction nextChunk() {\n const start = now();\n while (queue.length && now() - start < chunkTimeBudget) {\n queue.shift()();\n }\n timer = queue.length ? setTimeout(nextChunk, 0) : 0;\n}\n\n/**\n * WebGL-based implementation executed on the main thread. Requests are executed in time-bounded\n * macrotask chunks to allow render frames to execute in between.\n */\nconst generateSDF_GL = (...args) => {\n return new Promise((resolve, reject) => {\n queue.push(() => {\n const start = now();\n try {\n mainThreadGenerator.webgl.generateIntoCanvas(...args);\n resolve({ timing: now() - start });\n } catch (err) {\n reject(err);\n }\n });\n if (!timer) {\n timer = setTimeout(nextChunk, 0);\n }\n })\n};\n\nconst threadCount = 4; // how many workers to spawn\nconst idleTimeout = 2000; // workers will be terminated after being idle this many milliseconds\nconst threads = {};\nlet callNum = 0;\n\n/**\n * Fallback JS-based implementation, fanned out to a number of worker threads for parallelism\n */\nfunction generateSDF_JS_Worker(width, height, path, viewBox, distance, exponent, canvas, x, y, channel) {\n const workerId = 'TroikaTextSDFGenerator_JS_' + ((callNum++) % threadCount);\n let thread = threads[workerId];\n if (!thread) {\n thread = threads[workerId] = {\n workerModule: defineWorkerModule({\n name: workerId,\n workerId,\n dependencies: [\n createSDFGenerator,\n now\n ],\n init(_createSDFGenerator, now) {\n const generate = _createSDFGenerator().javascript.generate;\n return function (...args) {\n const start = now();\n const textureData = generate(...args);\n return {\n textureData,\n timing: now() - start\n }\n }\n },\n getTransferables(result) {\n return [result.textureData.buffer]\n }\n }),\n requests: 0,\n idleTimer: null\n };\n }\n\n thread.requests++;\n clearTimeout(thread.idleTimer);\n return thread.workerModule(width, height, path, viewBox, distance, exponent)\n .then(({ textureData, timing }) => {\n // copy result data into the canvas\n const start = now();\n // expand single-channel data into rgba\n const imageData = new Uint8Array(textureData.length * 4);\n for (let i = 0; i < textureData.length; i++) {\n imageData[i * 4 + channel] = textureData[i];\n }\n mainThreadGenerator.webglUtils.renderImageData(canvas, imageData, x, y, width, height, 1 << (3 - channel));\n timing += now() - start;\n\n // clean up workers after a while\n if (--thread.requests === 0) {\n thread.idleTimer = setTimeout(() => { terminateWorker(workerId); }, idleTimeout);\n }\n return { timing }\n })\n}\n\nfunction warmUpSDFCanvas(canvas) {\n if (!canvas._warm) {\n mainThreadGenerator.webgl.isSupported(canvas);\n canvas._warm = true;\n }\n}\n\nconst resizeWebGLCanvasWithoutClearing = mainThreadGenerator.webglUtils.resizeWebGLCanvasWithoutClearing;\n\n/*!\nCustom build of Typr.ts (https://github.com/fredli74/Typr.ts) for use in Troika text rendering.\nOriginal MIT license applies: https://github.com/fredli74/Typr.ts/blob/master/LICENSE\n*/\nfunction typrFactory(){return \"undefined\"==typeof window&&(self.window=self),function(r){var e={parse:function(r){var t=e._bin,a=new Uint8Array(r);if(\"ttcf\"==t.readASCII(a,0,4)){var n=4;t.readUshort(a,n),n+=2,t.readUshort(a,n),n+=2;var o=t.readUint(a,n);n+=4;for(var s=[],i=0;i>>t&1)&&e++;return e},e._lctf.readClassDef=function(r,t){var a=e._bin,n=[],o=a.readUshort(r,t);if(t+=2,1==o){var s=a.readUshort(r,t);t+=2;var i=a.readUshort(r,t);t+=2;for(var h=0;h0&&(o.featureParams=n+s);var i=a.readUshort(r,t);t+=2,o.tab=[];for(var h=0;h255?-1:e.CFF.glyphByUnicode(r,e.CFF.tableSE[t])},e.CFF.readEncoding=function(r,t,a){e._bin;var n=[\".notdef\"],o=r[t];if(t++,0!=o)throw \"error: unknown encoding format: \"+o;var s=r[t];t++;for(var i=0;i>4,p=15&v;if(15!=c&&l.push(c),15!=p&&l.push(p),15==p)break}for(var U=\"\",g=[0,1,2,3,4,5,6,7,8,9,\".\",\"e\",\"e-\",\"reserved\",\"-\",\"endOfNumber\"],S=0;S=s.xMax||s.yMin>=s.yMax)return null;if(s.noc>0){s.endPts=[];for(var i=0;i=1&&i.fmt<=2){f=o.readUshort(r,a);a+=2;var u=o.readUshort(r,a);a+=2;d=e._lctf.numOfOnes(f);var l=e._lctf.numOfOnes(u);if(1==i.fmt){i.pairsets=[];var v=o.readUshort(r,a);a+=2;for(var c=0;c=1&&i.fmt<=2){if(1==i.fmt)i.delta=o.readShort(r,a),a+=2;else if(2==i.fmt){var f=o.readUshort(r,a);a+=2,i.newg=o.readUshorts(r,a,f),a+=2*i.newg.length;}}else if(4==t){i.vals=[];f=o.readUshort(r,a);a+=2;for(var d=0;d>>8;if(0!=(u&=15))throw \"unknown kern table format: \"+u;t=e.kern.readFormat0(r,t,h);}return h},e.kern.parseV1=function(r,t,a,n){var o=e._bin;o.readFixed(r,t),t+=4;var s=o.readUint(r,t);t+=4;for(var i={glyph1:[],rval:[]},h=0;h>>8;if(0!=(d&=15))throw \"unknown kern table format: \"+d;t=e.kern.readFormat0(r,t,i);}return i},e.kern.readFormat0=function(r,t,a){var n=e._bin,o=-1,s=n.readUshort(r,t);t+=2,n.readUshort(r,t),t+=2,n.readUshort(r,t),t+=2,n.readUshort(r,t),t+=2;for(var i=0;i=n.map.length?0:n.map[e];if(4==n.format){for(var o=-1,s=0;se)return 0;return 65535&(0!=n.idRangeOffset[o]?n.glyphIdArray[e-n.startCount[o]+(n.idRangeOffset[o]>>1)-(n.idRangeOffset.length-o)]:e+n.idDelta[o])}if(12==n.format){if(e>n.groups[n.groups.length-1][1])return 0;for(s=0;s-1?e.U._simpleGlyph(n,a):e.U._compoGlyph(n,t,a));},e.U._simpleGlyph=function(r,t){for(var a=0;ao)){for(var v=!0,c=0,p=0;po)){for(v=!0,p=0;p>1,s.length=0,h=!0;else if(\"o3\"==x||\"o23\"==x){s.length%2!=0&&!h&&(f=s.shift()+n.nominalWidthX),i+=s.length>>1,s.length=0,h=!0;}else if(\"o4\"==x)s.length>1&&!h&&(f=s.shift()+n.nominalWidthX,h=!0),d&&e.U.P.closePath(o),v+=s.pop(),e.U.P.moveTo(o,l,v),d=!0;else if(\"o5\"==x)for(;s.length>0;)l+=s.shift(),v+=s.shift(),e.U.P.lineTo(o,l,v);else if(\"o6\"==x||\"o7\"==x)for(var P=s.length,I=\"o6\"==x,w=0;wMath.abs(y-v)?l=b+s.shift():v=y+s.shift(),e.U.P.curveTo(o,c,p,U,g,F,_),e.U.P.curveTo(o,S,m,b,y,l,v));else if(\"o14\"==x){if(s.length>0&&!h&&(f=s.shift()+a.nominalWidthX,h=!0),4==s.length){var k=s.shift(),G=s.shift(),D=s.shift(),B=s.shift(),L=e.CFF.glyphBySE(a,D),R=e.CFF.glyphBySE(a,B);e.U._drawCFF(a.CharStrings[L],t,a,n,o),t.x=k,t.y=G,e.U._drawCFF(a.CharStrings[R],t,a,n,o);}d&&(e.U.P.closePath(o),d=!1);}else if(\"o19\"==x||\"o20\"==x){s.length%2!=0&&!h&&(f=s.shift()+n.nominalWidthX),i+=s.length>>1,s.length=0,h=!0,u+=i+7>>3;}else if(\"o21\"==x)s.length>2&&!h&&(f=s.shift()+n.nominalWidthX,h=!0),v+=s.pop(),l+=s.pop(),d&&e.U.P.closePath(o),e.U.P.moveTo(o,l,v),d=!0;else if(\"o22\"==x)s.length>1&&!h&&(f=s.shift()+n.nominalWidthX,h=!0),l+=s.pop(),d&&e.U.P.closePath(o),e.U.P.moveTo(o,l,v),d=!0;else if(\"o25\"==x){for(;s.length>6;)l+=s.shift(),v+=s.shift(),e.U.P.lineTo(o,l,v);c=l+s.shift(),p=v+s.shift(),U=c+s.shift(),g=p+s.shift(),l=U+s.shift(),v=g+s.shift(),e.U.P.curveTo(o,c,p,U,g,l,v);}else if(\"o26\"==x)for(s.length%2&&(l+=s.shift());s.length>0;)c=l,p=v+s.shift(),l=U=c+s.shift(),v=(g=p+s.shift())+s.shift(),e.U.P.curveTo(o,c,p,U,g,l,v);else if(\"o27\"==x)for(s.length%2&&(v+=s.shift());s.length>0;)p=v,U=(c=l+s.shift())+s.shift(),g=p+s.shift(),l=U+s.shift(),v=g,e.U.P.curveTo(o,c,p,U,g,l,v);else if(\"o10\"==x||\"o29\"==x){var A=\"o10\"==x?n:a;if(0==s.length)console.debug(\"error: empty stack\");else {var W=s.pop(),M=A.Subrs[W+A.Bias];t.x=l,t.y=v,t.nStems=i,t.haveWidth=h,t.width=f,t.open=d,e.U._drawCFF(M,t,a,n,o),l=t.x,v=t.y,i=t.nStems,h=t.haveWidth,f=t.width,d=t.open;}}else if(\"o30\"==x||\"o31\"==x){var V=s.length,N=(T=0,\"o31\"==x);for(T+=V-(P=-3&V);T>>1|(21845&g)<<1;h=(61680&(h=(52428&h)>>>2|(13107&h)<<2))>>>4|(3855&h)<<4,c[g]=((65280&h)>>>8|(255&h)<<8)>>>1;}var w=function(r,e,t){for(var a=r.length,i=0,o=new n(e);i>>v]=s;}else for(f=new n(a),i=0;i>>15-r[i]);return f},d=new e(288);for(g=0;g<144;++g)d[g]=8;for(g=144;g<256;++g)d[g]=9;for(g=256;g<280;++g)d[g]=7;for(g=280;g<288;++g)d[g]=8;var m=new e(32);for(g=0;g<32;++g)m[g]=5;var b=w(d,9,1),p=w(m,5,1),y=function(r){for(var e=r[0],n=1;ne&&(e=r[n]);return e},L=function(r,e,n){var t=e/8|0;return (r[t]|r[t+1]<<8)>>(7&e)&n},U=function(r,e){var n=e/8|0;return (r[n]|r[n+1]<<8|r[n+2]<<16)>>(7&e)},k=[\"unexpected EOF\",\"invalid block type\",\"invalid length/literal\",\"invalid distance\",\"stream finished\",\"no stream handler\",,\"no callback\",\"invalid UTF-8 data\",\"extra field too long\",\"date not in range 1980-2099\",\"filename too long\",\"stream finishing\",\"invalid zip data\"],T=function(r,e,n){var t=new Error(e||k[r]);if(t.code=r,Error.captureStackTrace&&Error.captureStackTrace(t,T),!n)throw t;return t},O=function(r,f,u){var s=r.length;if(!s||u&&!u.l&&s<5)return f||new e(0);var c=!f||u,g=!u||u.i;u||(u={}),f||(f=new e(3*s));var h,d=function(r){var n=f.length;if(r>n){var t=new e(Math.max(2*n,r));t.set(f),f=t;}},m=u.f||0,k=u.p||0,O=u.b||0,A=u.l,x=u.d,E=u.m,D=u.n,M=8*s;do{if(!A){u.f=m=L(r,k,1);var S=L(r,k+1,3);if(k+=3,!S){var V=r[(I=((h=k)/8|0)+(7&h&&1)+4)-4]|r[I-3]<<8,_=I+V;if(_>s){g&&T(0);break}c&&d(O+V),f.set(r.subarray(I,_),O),u.b=O+=V,u.p=k=8*_;continue}if(1==S)A=b,x=p,E=9,D=5;else if(2==S){var j=L(r,k,31)+257,z=L(r,k+10,15)+4,C=j+L(r,k+5,31)+1;k+=14;for(var F=new e(C),P=new e(19),q=0;q>>4)<16)F[q++]=I;else {var K=0,N=0;for(16==I?(N=3+L(r,k,3),k+=2,K=F[q-1]):17==I?(N=3+L(r,k,7),k+=3):18==I&&(N=11+L(r,k,127),k+=7);N--;)F[q++]=K;}}var Q=F.subarray(0,j),R=F.subarray(j);E=y(Q),D=y(R),A=w(Q,E,1),x=w(R,D,1);}else T(1);if(k>M){g&&T(0);break}}c&&d(O+131072);for(var W=(1<>>4;if((k+=15&K)>M){g&&T(0);break}if(K||T(2),Z<256)f[O++]=Z;else {if(256==Z){Y=k,A=null;break}var $=Z-254;if(Z>264){var rr=a[q=Z-257];$=L(r,k,(1<>>4;er||T(3),k+=15&er;R=l[nr];if(nr>3){rr=i[nr];R+=U(r,k)&(1<M){g&&T(0);break}c&&d(O+131072);for(var tr=O+$;Or.length)&&(i=r.length);var o=new(r instanceof n?n:r instanceof t?t:e)(i-a);return o.set(r.subarray(a,i)),o}(f,0,O)},A=new e(0);var x=\"undefined\"!=typeof TextDecoder&&new TextDecoder;try{x.decode(A,{stream:!0}),1;}catch(r){}return r.convert_streams=function(r){var e=new DataView(r),n=0;function t(){var r=e.getUint16(n);return n+=2,r}function a(){var r=e.getUint32(n);return n+=4,r}function i(r){m.setUint16(b,r),b+=2;}function o(r){m.setUint32(b,r),b+=4;}for(var f={signature:a(),flavor:a(),length:a(),numTables:t(),reserved:t(),totalSfntSize:a(),majorVersion:t(),minorVersion:t(),metaOffset:a(),metaLength:a(),metaOrigLength:a(),privOffset:a(),privLength:a()},u=0;Math.pow(2,u)<=f.numTables;)u++;u--;for(var v=16*Math.pow(2,u),s=16*f.numTables-v,l=12,c=[],g=0;g {\n let [skip, step] = range.split('+');\n skip = parseInt(skip,36);\n step = step ? parseInt(step, 36) : 0;\n joiningTypeMap.set(lastCode += skip, m[type]);\n for (let i = step; i--;) {\n joiningTypeMap.set(++lastCode, m[type]);\n }\n });\n }\n }\n return joiningTypeMap.get(ch) || JT_NON_JOINING\n }\n\n const ISOL = 1, INIT = 2, FINA = 3, MEDI = 4;\n const formsToFeatures = [null, 'isol', 'init', 'fina', 'medi'];\n\n function detectJoiningForms(str) {\n // This implements the algorithm described here:\n // https://github.com/n8willis/opentype-shaping-documents/blob/master/opentype-shaping-arabic-general.md\n const joiningForms = new Uint8Array(str.length);\n let prevJoiningType = JT_NON_JOINING;\n let prevForm = ISOL;\n let prevIndex = -1;\n for (let i = 0; i < str.length; i++) {\n const code = str.codePointAt(i);\n let joiningType = getCharJoiningType(code) | 0;\n let form = ISOL;\n if (joiningType & JT_TRANSPARENT) {\n continue\n }\n if (prevJoiningType & (JT_LEFT | JT_DUAL | JT_JOIN_CAUSING)) {\n if (joiningType & (JT_RIGHT | JT_DUAL | JT_JOIN_CAUSING)) {\n form = FINA;\n // isol->init, fina->medi\n if (prevForm === ISOL || prevForm === FINA) {\n joiningForms[prevIndex]++;\n }\n }\n else if (joiningType & (JT_LEFT | JT_NON_JOINING)) {\n // medi->fina, init->isol\n if (prevForm === INIT || prevForm === MEDI) {\n joiningForms[prevIndex]--;\n }\n }\n }\n else if (prevJoiningType & (JT_RIGHT | JT_NON_JOINING)) {\n // medi->fina, init->isol\n if (prevForm === INIT || prevForm === MEDI) {\n joiningForms[prevIndex]--;\n }\n }\n prevForm = joiningForms[i] = form;\n prevJoiningType = joiningType;\n prevIndex = i;\n if (code > 0xffff) i++;\n }\n // console.log(str.split('').map(ch => ch.codePointAt(0).toString(16)))\n // console.log(str.split('').map(ch => getCharJoiningType(ch.codePointAt(0))))\n // console.log(Array.from(joiningForms).map(f => formsToFeatures[f] || 'none'))\n return joiningForms\n }\n\n function stringToGlyphs (font, str) {\n const glyphIds = [];\n for (let i = 0; i < str.length; i++) {\n const cc = str.codePointAt(i);\n if (cc > 0xffff) i++;\n glyphIds.push(Typr.U.codeToGlyph(font, cc));\n }\n\n const gsub = font['GSUB'];\n if (gsub) {\n const {lookupList, featureList} = gsub;\n let joiningForms;\n const supportedFeatures = /^(rlig|liga|mset|isol|init|fina|medi|half|pres|blws)$/;\n const usedLookups = [];\n featureList.forEach(feature => {\n if (supportedFeatures.test(feature.tag)) {\n for (let ti = 0; ti < feature.tab.length; ti++) {\n if (usedLookups[feature.tab[ti]]) continue\n usedLookups[feature.tab[ti]] = true;\n const tab = lookupList[feature.tab[ti]];\n const isJoiningFeature = /^(isol|init|fina|medi)$/.test(feature.tag);\n if (isJoiningFeature && !joiningForms) { //lazy\n joiningForms = detectJoiningForms(str);\n }\n for (let ci = 0; ci < glyphIds.length; ci++) {\n if (!joiningForms || !isJoiningFeature || formsToFeatures[joiningForms[ci]] === feature.tag) {\n Typr.U._applySubs(glyphIds, ci, tab, lookupList);\n }\n }\n }\n }\n });\n }\n\n return glyphIds\n }\n\n function firstNum(...args) {\n for (let i = 0; i < args.length; i++) {\n if (typeof args[i] === 'number') {\n return args[i]\n }\n }\n }\n\n function wrapFontObj(typrFont) {\n const glyphMap = Object.create(null);\n\n const os2 = typrFont['OS/2'];\n const hhea = typrFont.hhea;\n const unitsPerEm = typrFont.head.unitsPerEm;\n const ascender = firstNum(os2 && os2.sTypoAscender, hhea && hhea.ascender, unitsPerEm);\n\n const fontObj = {\n unitsPerEm,\n ascender,\n descender: firstNum(os2 && os2.sTypoDescender, hhea && hhea.descender, 0),\n capHeight: firstNum(os2 && os2.sCapHeight, ascender),\n xHeight: firstNum(os2 && os2.sxHeight, ascender),\n lineGap: firstNum(os2 && os2.sTypoLineGap, hhea && hhea.lineGap),\n forEachGlyph(text, fontSize, letterSpacing, callback) {\n let glyphX = 0;\n const fontScale = 1 / fontObj.unitsPerEm * fontSize;\n\n const glyphIndices = stringToGlyphs(typrFont, text);\n let charIndex = 0;\n let prevGlyphIndex = -1;\n glyphIndices.forEach((glyphIndex, i) => {\n // Typr returns a glyph index per string codepoint, with -1s in place of those that\n // were omitted due to ligature substitution. So we can track original index in the\n // string via simple increment, and skip everything else when seeing a -1.\n if (glyphIndex !== -1) {\n let glyphObj = glyphMap[glyphIndex];\n if (!glyphObj) {\n const {cmds, crds} = Typr.U.glyphToPath(typrFont, glyphIndex);\n\n // Build path string\n let path = '';\n let crdsIdx = 0;\n for (let i = 0, len = cmds.length; i < len; i++) {\n const numArgs = cmdArgLengths[cmds[i]];\n path += cmds[i];\n for (let j = 1; j <= numArgs; j++) {\n path += (j > 1 ? ',' : '') + crds[crdsIdx++];\n }\n }\n\n // Find extents - Glyf gives this in metadata but not CFF, and Typr doesn't\n // normalize the two, so it's simplest just to iterate ourselves.\n let xMin, yMin, xMax, yMax;\n if (crds.length) {\n xMin = yMin = Infinity;\n xMax = yMax = -Infinity;\n for (let i = 0, len = crds.length; i < len; i += 2) {\n let x = crds[i];\n let y = crds[i + 1];\n if (x < xMin) xMin = x;\n if (y < yMin) yMin = y;\n if (x > xMax) xMax = x;\n if (y > yMax) yMax = y;\n }\n } else {\n xMin = xMax = yMin = yMax = 0;\n }\n\n glyphObj = glyphMap[glyphIndex] = {\n index: glyphIndex,\n advanceWidth: typrFont.hmtx.aWidth[glyphIndex],\n xMin,\n yMin,\n xMax,\n yMax,\n path,\n pathCommandCount: cmds.length,\n // forEachPathCommand(callback) {\n // let argsIndex = 0\n // const argsArray = []\n // for (let i = 0, len = cmds.length; i < len; i++) {\n // const numArgs = cmdArgLengths[cmds[i]]\n // argsArray.length = 1 + numArgs\n // argsArray[0] = cmds[i]\n // for (let j = 1; j <= numArgs; j++) {\n // argsArray[j] = crds[argsIndex++]\n // }\n // callback.apply(null, argsArray)\n // }\n // }\n };\n }\n\n // Kerning\n if (prevGlyphIndex !== -1) {\n glyphX += Typr.U.getPairAdjustment(typrFont, prevGlyphIndex, glyphIndex) * fontScale;\n }\n\n callback.call(null, glyphObj, glyphX, charIndex);\n\n if (glyphObj.advanceWidth) {\n glyphX += glyphObj.advanceWidth * fontScale;\n }\n if (letterSpacing) {\n glyphX += letterSpacing * fontSize;\n }\n\n prevGlyphIndex = glyphIndex;\n }\n charIndex += (text.codePointAt(charIndex) > 0xffff ? 2 : 1);\n });\n return glyphX\n }\n };\n\n return fontObj\n }\n\n return function parse(buffer) {\n // Look to see if we have a WOFF file and convert it if so:\n const peek = new Uint8Array(buffer, 0, 4);\n const tag = Typr._bin.readASCII(peek, 0, 4);\n if (tag === 'wOFF') {\n buffer = woff2otf(buffer);\n } else if (tag === 'wOF2') {\n throw new Error('woff2 fonts not supported')\n }\n return wrapFontObj(Typr.parse(buffer)[0])\n }\n}\n\n\nconst workerModule = /*#__PURE__*/defineWorkerModule({\n name: 'Typr Font Parser',\n dependencies: [typrFactory, woff2otfFactory, parserFactory],\n init(typrFactory, woff2otfFactory, parserFactory) {\n const Typr = typrFactory();\n const woff2otf = woff2otfFactory();\n return parserFactory(Typr, woff2otf)\n }\n});\n\nconst CONFIG = {\n defaultFontURL: 'https://fonts.gstatic.com/s/roboto/v18/KFOmCnqEu92Fr1Mu4mxM.woff', //Roboto Regular\n sdfGlyphSize: 64,\n sdfMargin: 1 / 16,\n sdfExponent: 9,\n textureWidth: 2048\n};\nconst tempColor = /*#__PURE__*/new Color();\nlet hasRequested = false;\n\nfunction now$1() {\n return (self.performance || Date).now()\n}\n\n/**\n * Customizes the text builder configuration. This must be called prior to the first font processing\n * request, and applies to all fonts.\n *\n * @param {String} config.defaultFontURL - The URL of the default font to use for text processing\n * requests, in case none is specified or the specifiede font fails to load or parse.\n * Defaults to \"Roboto Regular\" from Google Fonts.\n * @param {Number} config.sdfGlyphSize - The default size of each glyph's SDF (signed distance field)\n * texture used for rendering. Must be a power-of-two number, and applies to all fonts,\n * but note that this can also be overridden per call to `getTextRenderInfo()`.\n * Larger sizes can improve the quality of glyph rendering by increasing the sharpness\n * of corners and preventing loss of very thin lines, at the expense of memory. Defaults\n * to 64 which is generally a good balance of size and quality.\n * @param {Number} config.sdfExponent - The exponent used when encoding the SDF values. A higher exponent\n * shifts the encoded 8-bit values to achieve higher precision/accuracy at texels nearer\n * the glyph's path, with lower precision further away. Defaults to 9.\n * @param {Number} config.sdfMargin - How much space to reserve in the SDF as margin outside the glyph's\n * path, as a percentage of the SDF width. A larger margin increases the quality of\n * extruded glyph outlines, but decreases the precision available for the glyph itself.\n * Defaults to 1/16th of the glyph size.\n * @param {Number} config.textureWidth - The width of the SDF texture; must be a power of 2. Defaults to\n * 2048 which is a safe maximum texture dimension according to the stats at\n * https://webglstats.com/webgl/parameter/MAX_TEXTURE_SIZE and should allow for a\n * reasonably large number of glyphs (default glyph size of 64^2 and safe texture size of\n * 2048^2, times 4 channels, allows for 4096 glyphs.) This can be increased if you need to\n * increase the glyph size and/or have an extraordinary number of glyphs.\n */\nfunction configureTextBuilder(config) {\n if (hasRequested) {\n console.warn('configureTextBuilder called after first font request; will be ignored.');\n } else {\n assign(CONFIG, config);\n }\n}\n\n/**\n * Repository for all font SDF atlas textures and their glyph mappings. There is a separate atlas for\n * each sdfGlyphSize. Each atlas has a single Texture that holds all glyphs for all fonts.\n *\n * {\n * [sdfGlyphSize]: {\n * glyphCount: number,\n * sdfGlyphSize: number,\n * sdfTexture: Texture,\n * sdfCanvas: HTMLCanvasElement,\n * contextLost: boolean,\n * glyphsByFont: Map>\n * }\n * }\n */\nconst atlases = Object.create(null);\n\n/**\n * @typedef {object} TroikaTextRenderInfo - Format of the result from `getTextRenderInfo`.\n * @property {object} parameters - The normalized input arguments to the render call.\n * @property {Texture} sdfTexture - The SDF atlas texture.\n * @property {number} sdfGlyphSize - The size of each glyph's SDF; see `configureTextBuilder`.\n * @property {number} sdfExponent - The exponent used in encoding the SDF's values; see `configureTextBuilder`.\n * @property {Float32Array} glyphBounds - List of [minX, minY, maxX, maxY] quad bounds for each glyph.\n * @property {Float32Array} glyphAtlasIndices - List holding each glyph's index in the SDF atlas.\n * @property {Uint8Array} [glyphColors] - List holding each glyph's [r, g, b] color, if `colorRanges` was supplied.\n * @property {Float32Array} [caretPositions] - A list of caret positions for all characters in the string; each is\n * three elements: the starting X, the ending X, and the bottom Y for the caret.\n * @property {number} [caretHeight] - An appropriate height for all selection carets.\n * @property {number} ascender - The font's ascender metric.\n * @property {number} descender - The font's descender metric.\n * @property {number} capHeight - The font's cap height metric, based on the height of Latin capital letters.\n * @property {number} xHeight - The font's x height metric, based on the height of Latin lowercase letters.\n * @property {number} lineHeight - The final computed lineHeight measurement.\n * @property {number} topBaseline - The y position of the top line's baseline.\n * @property {Array} blockBounds - The total [minX, minY, maxX, maxY] rect of the whole text block;\n * this can include extra vertical space beyond the visible glyphs due to lineHeight, and is\n * equivalent to the dimensions of a block-level text element in CSS.\n * @property {Array} visibleBounds - The total [minX, minY, maxX, maxY] rect of the whole text block;\n * unlike `blockBounds` this is tightly wrapped to the visible glyph paths.\n * @property {Array} chunkedBounds - List of bounding rects for each consecutive set of N glyphs,\n * in the format `{start:N, end:N, rect:[minX, minY, maxX, maxY]}`.\n * @property {object} timings - Timing info for various parts of the rendering logic including SDF\n * generation, typesetting, etc.\n * @frozen\n */\n\n/**\n * @callback getTextRenderInfo~callback\n * @param {TroikaTextRenderInfo} textRenderInfo\n */\n\n/**\n * Main entry point for requesting the data needed to render a text string with given font parameters.\n * This is an asynchronous call, performing most of the logic in a web worker thread.\n * @param {object} args\n * @param {getTextRenderInfo~callback} callback\n */\nfunction getTextRenderInfo(args, callback) {\n hasRequested = true;\n args = assign({}, args);\n const totalStart = now$1();\n\n // Apply default font here to avoid a 'null' atlas, and convert relative\n // URLs to absolute so they can be resolved in the worker\n args.font = toAbsoluteURL(args.font || CONFIG.defaultFontURL);\n\n // Normalize text to a string\n args.text = '' + args.text;\n\n args.sdfGlyphSize = args.sdfGlyphSize || CONFIG.sdfGlyphSize;\n\n // Normalize colors\n if (args.colorRanges != null) {\n let colors = {};\n for (let key in args.colorRanges) {\n if (args.colorRanges.hasOwnProperty(key)) {\n let val = args.colorRanges[key];\n if (typeof val !== 'number') {\n val = tempColor.set(val).getHex();\n }\n colors[key] = val;\n }\n }\n args.colorRanges = colors;\n }\n\n Object.freeze(args);\n\n // Init the atlas if needed\n const {textureWidth, sdfExponent} = CONFIG;\n const {sdfGlyphSize} = args;\n const glyphsPerRow = (textureWidth / sdfGlyphSize * 4);\n let atlas = atlases[sdfGlyphSize];\n if (!atlas) {\n const canvas = document.createElement('canvas');\n canvas.width = textureWidth;\n canvas.height = sdfGlyphSize * 256 / glyphsPerRow; // start tall enough to fit 256 glyphs\n atlas = atlases[sdfGlyphSize] = {\n glyphCount: 0,\n sdfGlyphSize,\n sdfCanvas: canvas,\n sdfTexture: new Texture(\n canvas,\n undefined,\n undefined,\n undefined,\n LinearFilter,\n LinearFilter\n ),\n contextLost: false,\n glyphsByFont: new Map()\n };\n atlas.sdfTexture.generateMipmaps = false;\n initContextLossHandling(atlas);\n }\n\n const {sdfTexture, sdfCanvas} = atlas;\n let fontGlyphs = atlas.glyphsByFont.get(args.font);\n if (!fontGlyphs) {\n atlas.glyphsByFont.set(args.font, fontGlyphs = new Map());\n }\n\n // Issue request to the typesetting engine in the worker\n typesetInWorker(args).then(result => {\n const {glyphIds, glyphPositions, fontSize, unitsPerEm, timings} = result;\n const neededSDFs = [];\n const glyphBounds = new Float32Array(glyphIds.length * 4);\n const fontSizeMult = fontSize / unitsPerEm;\n let boundsIdx = 0;\n let positionsIdx = 0;\n const quadsStart = now$1();\n glyphIds.forEach((glyphId, i) => {\n let glyphInfo = fontGlyphs.get(glyphId);\n\n // If this is a glyphId not seen before, add it to the atlas\n if (!glyphInfo) {\n const {path, pathBounds} = result.glyphData[glyphId];\n\n // Margin around path edges in SDF, based on a percentage of the glyph's max dimension.\n // Note we add an extra 0.5 px over the configured value because the outer 0.5 doesn't contain\n // useful interpolated values and will be ignored anyway.\n const fontUnitsMargin = Math.max(pathBounds[2] - pathBounds[0], pathBounds[3] - pathBounds[1])\n / sdfGlyphSize * (CONFIG.sdfMargin * sdfGlyphSize + 0.5);\n\n const atlasIndex = atlas.glyphCount++;\n const sdfViewBox = [\n pathBounds[0] - fontUnitsMargin,\n pathBounds[1] - fontUnitsMargin,\n pathBounds[2] + fontUnitsMargin,\n pathBounds[3] + fontUnitsMargin,\n ];\n fontGlyphs.set(glyphId, (glyphInfo = { path, atlasIndex, sdfViewBox }));\n\n // Collect those that need SDF generation\n neededSDFs.push(glyphInfo);\n }\n\n // Calculate bounds for renderable quads\n // TODO can we get this back off the main thread?\n const {sdfViewBox} = glyphInfo;\n const posX = glyphPositions[positionsIdx++];\n const posY = glyphPositions[positionsIdx++];\n glyphBounds[boundsIdx++] = posX + sdfViewBox[0] * fontSizeMult;\n glyphBounds[boundsIdx++] = posY + sdfViewBox[1] * fontSizeMult;\n glyphBounds[boundsIdx++] = posX + sdfViewBox[2] * fontSizeMult;\n glyphBounds[boundsIdx++] = posY + sdfViewBox[3] * fontSizeMult;\n\n // Convert glyphId to SDF index for the shader\n glyphIds[i] = glyphInfo.atlasIndex;\n });\n timings.quads = (timings.quads || 0) + (now$1() - quadsStart);\n\n const sdfStart = now$1();\n timings.sdf = {};\n\n // Grow the texture height by power of 2 if needed\n const currentHeight = sdfCanvas.height;\n const neededRows = Math.ceil(atlas.glyphCount / glyphsPerRow);\n const neededHeight = Math.pow(2, Math.ceil(Math.log2(neededRows * sdfGlyphSize)));\n if (neededHeight > currentHeight) {\n // Since resizing the canvas clears its render buffer, it needs special handling to copy the old contents over\n console.info(`Increasing SDF texture size ${currentHeight}->${neededHeight}`);\n resizeWebGLCanvasWithoutClearing(sdfCanvas, textureWidth, neededHeight);\n // As of Three r136 textures cannot be resized once they're allocated on the GPU, we must dispose to reallocate it\n sdfTexture.dispose();\n }\n\n Promise.all(neededSDFs.map(glyphInfo =>\n generateGlyphSDF(glyphInfo, atlas, args.gpuAccelerateSDF).then(({timing}) => {\n timings.sdf[glyphInfo.atlasIndex] = timing;\n })\n )).then(() => {\n if (neededSDFs.length && !atlas.contextLost) {\n safariPre15Workaround(atlas);\n sdfTexture.needsUpdate = true;\n }\n timings.sdfTotal = now$1() - sdfStart;\n timings.total = now$1() - totalStart;\n // console.log(`SDF - ${timings.sdfTotal}, Total - ${timings.total - timings.fontLoad}`)\n\n // Invoke callback with the text layout arrays and updated texture\n callback(Object.freeze({\n parameters: args,\n sdfTexture,\n sdfGlyphSize,\n sdfExponent,\n glyphBounds,\n glyphAtlasIndices: glyphIds,\n glyphColors: result.glyphColors,\n caretPositions: result.caretPositions,\n caretHeight: result.caretHeight,\n chunkedBounds: result.chunkedBounds,\n ascender: result.ascender,\n descender: result.descender,\n lineHeight: result.lineHeight,\n capHeight: result.capHeight,\n xHeight: result.xHeight,\n topBaseline: result.topBaseline,\n blockBounds: result.blockBounds,\n visibleBounds: result.visibleBounds,\n timings: result.timings,\n }));\n });\n });\n\n // While the typesetting request is being handled, go ahead and make sure the atlas canvas context is\n // \"warmed up\"; the first request will be the longest due to shader program compilation so this gets\n // a head start on that process before SDFs actually start getting processed.\n Promise.resolve().then(() => {\n if (!atlas.contextLost) {\n warmUpSDFCanvas(sdfCanvas);\n }\n });\n}\n\nfunction generateGlyphSDF({path, atlasIndex, sdfViewBox}, {sdfGlyphSize, sdfCanvas, contextLost}, useGPU) {\n if (contextLost) {\n // If the context is lost there's nothing we can do, just quit silently and let it\n // get regenerated when the context is restored\n return Promise.resolve({timing: -1})\n }\n const {textureWidth, sdfExponent} = CONFIG;\n const maxDist = Math.max(sdfViewBox[2] - sdfViewBox[0], sdfViewBox[3] - sdfViewBox[1]);\n const squareIndex = Math.floor(atlasIndex / 4);\n const x = squareIndex % (textureWidth / sdfGlyphSize) * sdfGlyphSize;\n const y = Math.floor(squareIndex / (textureWidth / sdfGlyphSize)) * sdfGlyphSize;\n const channel = atlasIndex % 4;\n return generateSDF(sdfGlyphSize, sdfGlyphSize, path, sdfViewBox, maxDist, sdfExponent, sdfCanvas, x, y, channel, useGPU)\n}\n\nfunction initContextLossHandling(atlas) {\n const canvas = atlas.sdfCanvas;\n\n /*\n // Begin context loss simulation\n if (!window.WebGLDebugUtils) {\n let script = document.getElementById('WebGLDebugUtilsScript')\n if (!script) {\n script = document.createElement('script')\n script.id = 'WebGLDebugUtils'\n document.head.appendChild(script)\n script.src = 'https://cdn.jsdelivr.net/gh/KhronosGroup/WebGLDeveloperTools@b42e702/src/debug/webgl-debug.js'\n }\n script.addEventListener('load', () => {\n initContextLossHandling(atlas)\n })\n return\n }\n window.WebGLDebugUtils.makeLostContextSimulatingCanvas(canvas)\n canvas.loseContextInNCalls(500)\n canvas.addEventListener('webglcontextrestored', (event) => {\n canvas.loseContextInNCalls(5000)\n })\n // End context loss simulation\n */\n\n canvas.addEventListener('webglcontextlost', (event) => {\n console.log('Context Lost', event);\n event.preventDefault();\n atlas.contextLost = true;\n });\n canvas.addEventListener('webglcontextrestored', (event) => {\n console.log('Context Restored', event);\n atlas.contextLost = false;\n // Regenerate all glyphs into the restored canvas:\n const promises = [];\n atlas.glyphsByFont.forEach(glyphMap => {\n glyphMap.forEach(glyph => {\n promises.push(generateGlyphSDF(glyph, atlas, true));\n });\n });\n Promise.all(promises).then(() => {\n safariPre15Workaround(atlas);\n atlas.sdfTexture.needsUpdate = true;\n });\n });\n}\n\n/**\n * Preload a given font and optionally pre-generate glyph SDFs for one or more character sequences.\n * This can be useful to avoid long pauses when first showing text in a scene, by preloading the\n * needed fonts and glyphs up front along with other assets.\n *\n * @param {object} options\n * @param {string} options.font - URL of the font file to preload. If not given, the default font will\n * be loaded.\n * @param {string|string[]} options.characters - One or more character sequences for which to pre-\n * generate glyph SDFs. Note that this will honor ligature substitution, so you may need\n * to specify ligature sequences in addition to their individual characters to get all\n * possible glyphs, e.g. `[\"t\", \"h\", \"th\"]` to get the \"t\" and \"h\" glyphs plus the \"th\" ligature.\n * @param {number} options.sdfGlyphSize - The size at which to prerender the SDF textures for the\n * specified `characters`.\n * @param {function} callback - A function that will be called when the preloading is complete.\n */\nfunction preloadFont({font, characters, sdfGlyphSize}, callback) {\n let text = Array.isArray(characters) ? characters.join('\\n') : '' + characters;\n getTextRenderInfo({ font, sdfGlyphSize, text }, callback);\n}\n\n\n// Local assign impl so we don't have to import troika-core\nfunction assign(toObj, fromObj) {\n for (let key in fromObj) {\n if (fromObj.hasOwnProperty(key)) {\n toObj[key] = fromObj[key];\n }\n }\n return toObj\n}\n\n// Utility for making URLs absolute\nlet linkEl;\nfunction toAbsoluteURL(path) {\n if (!linkEl) {\n linkEl = typeof document === 'undefined' ? {} : document.createElement('a');\n }\n linkEl.href = path;\n return linkEl.href\n}\n\n/**\n * Safari < v15 seems unable to use the SDF webgl canvas as a texture. This applies a workaround\n * where it reads the pixels out of that canvas and uploads them as a data texture instead, at\n * a slight performance cost.\n */\nfunction safariPre15Workaround(atlas) {\n // Use createImageBitmap support as a proxy for Safari<15, all other mainstream browsers\n // have supported it for a long while so any false positives should be minimal.\n if (typeof createImageBitmap !== 'function') {\n console.info('Safari<15: applying SDF canvas workaround');\n const {sdfCanvas, sdfTexture} = atlas;\n const {width, height} = sdfCanvas;\n const gl = atlas.sdfCanvas.getContext('webgl');\n let pixels = sdfTexture.image.data;\n if (!pixels || pixels.length !== width * height * 4) {\n pixels = new Uint8Array(width * height * 4);\n sdfTexture.image = {width, height, data: pixels};\n sdfTexture.flipY = false;\n sdfTexture.isDataTexture = true;\n }\n gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\n }\n}\n\n\nconst typesetterWorkerModule = /*#__PURE__*/defineWorkerModule({\n name: 'Typesetter',\n dependencies: [\n CONFIG,\n workerModule,\n createTypesetter,\n bidiFactory\n ],\n init(config, fontParser, createTypesetter, bidiFactory) {\n const {defaultFontURL} = config;\n return createTypesetter(fontParser, bidiFactory(), { defaultFontURL })\n }\n});\n\nconst typesetInWorker = /*#__PURE__*/defineWorkerModule({\n name: 'Typesetter',\n dependencies: [\n typesetterWorkerModule,\n ],\n init(typesetter) {\n return function(args) {\n return new Promise(resolve => {\n typesetter.typeset(args, resolve);\n })\n }\n },\n getTransferables(result) {\n // Mark array buffers as transferable to avoid cloning during postMessage\n const transferables = [\n result.glyphPositions.buffer,\n result.glyphIds.buffer\n ];\n if (result.caretPositions) {\n transferables.push(result.caretPositions.buffer);\n }\n if (result.glyphColors) {\n transferables.push(result.glyphColors.buffer);\n }\n return transferables\n }\n});\n\nfunction dumpSDFTextures() {\n Object.keys(atlases).forEach(size => {\n const canvas = atlases[size].sdfCanvas;\n const {width, height} = canvas;\n console.log(\"%c.\", `\n background: url(${canvas.toDataURL()});\n background-size: ${width}px ${height}px;\n color: transparent;\n font-size: 0;\n line-height: ${height}px;\n padding-left: ${width}px;\n `);\n });\n}\n\nconst templateGeometries = {};\n\nfunction getTemplateGeometry(detail) {\n let geom = templateGeometries[detail];\n if (!geom) {\n // Geometry is two planes back-to-back, which will always be rendered FrontSide only but\n // appear as DoubleSide by default. FrontSide/BackSide are emulated using drawRange.\n // We do it this way to avoid the performance hit of two draw calls for DoubleSide materials\n // introduced by Three.js in r130 - see https://github.com/mrdoob/three.js/pull/21967\n const front = new PlaneGeometry(1, 1, detail, detail);\n const back = front.clone();\n const frontAttrs = front.attributes;\n const backAttrs = back.attributes;\n const combined = new BufferGeometry();\n const vertCount = frontAttrs.uv.count;\n for (let i = 0; i < vertCount; i++) {\n backAttrs.position.array[i * 3] *= -1; // flip position x\n backAttrs.normal.array[i * 3 + 2] *= -1; // flip normal z\n }\n ['position', 'normal', 'uv'].forEach(name => {\n combined.setAttribute(name, new Float32BufferAttribute(\n [...frontAttrs[name].array, ...backAttrs[name].array],\n frontAttrs[name].itemSize)\n );\n });\n combined.setIndex([...front.index.array, ...back.index.array.map(n => n + vertCount)]);\n combined.translate(0.5, 0.5, 0);\n geom = templateGeometries[detail] = combined;\n }\n return geom\n}\n\nconst glyphBoundsAttrName = 'aTroikaGlyphBounds';\nconst glyphIndexAttrName = 'aTroikaGlyphIndex';\nconst glyphColorAttrName = 'aTroikaGlyphColor';\n\n/**\n@class GlyphsGeometry\n\nA specialized Geometry for rendering a set of text glyphs. Uses InstancedBufferGeometry to\nrender the glyphs using GPU instancing of a single quad, rather than constructing a whole\ngeometry with vertices, for much smaller attribute arraybuffers according to this math:\n\n Where N = number of glyphs...\n\n Instanced:\n - position: 4 * 3\n - index: 2 * 3\n - normal: 4 * 3\n - uv: 4 * 2\n - glyph x/y bounds: N * 4\n - glyph indices: N * 1\n = 5N + 38\n\n Non-instanced:\n - position: N * 4 * 3\n - index: N * 2 * 3\n - normal: N * 4 * 3\n - uv: N * 4 * 2\n - glyph indices: N * 1\n = 39N\n\nA downside of this is the rare-but-possible lack of the instanced arrays extension,\nwhich we could potentially work around with a fallback non-instanced implementation.\n\n*/\nclass GlyphsGeometry extends InstancedBufferGeometry {\n constructor() {\n super();\n\n this.detail = 1;\n this.curveRadius = 0;\n\n // Define groups for rendering text outline as a separate pass; these will only\n // be used when the `material` getter returns an array, i.e. outlineWidth > 0.\n this.groups = [\n {start: 0, count: Infinity, materialIndex: 0},\n {start: 0, count: Infinity, materialIndex: 1}\n ];\n\n // Preallocate empty bounding objects\n this.boundingSphere = new Sphere();\n this.boundingBox = new Box3();\n }\n\n computeBoundingSphere () {\n // No-op; we'll sync the boundingSphere proactively when needed.\n }\n\n computeBoundingBox() {\n // No-op; we'll sync the boundingBox proactively when needed.\n }\n\n // Since our base geometry contains triangles for both front and back sides, we can emulate\n // the \"side\" by restricting the draw range.\n setSide(side) {\n const verts = this.getIndex().count;\n this.setDrawRange(side === BackSide ? verts / 2 : 0, side === DoubleSide ? verts : verts / 2);\n }\n\n set detail(detail) {\n if (detail !== this._detail) {\n this._detail = detail;\n if (typeof detail !== 'number' || detail < 1) {\n detail = 1;\n }\n let tpl = getTemplateGeometry(detail)\n ;['position', 'normal', 'uv'].forEach(attr => {\n this.attributes[attr] = tpl.attributes[attr].clone();\n });\n this.setIndex(tpl.getIndex().clone());\n }\n }\n get detail() {\n return this._detail\n }\n\n set curveRadius(r) {\n if (r !== this._curveRadius) {\n this._curveRadius = r;\n this._updateBounds();\n }\n }\n get curveRadius() {\n return this._curveRadius\n }\n\n /**\n * Update the geometry for a new set of glyphs.\n * @param {Float32Array} glyphBounds - An array holding the planar bounds for all glyphs\n * to be rendered, 4 entries for each glyph: x1,x2,y1,y1\n * @param {Float32Array} glyphAtlasIndices - An array holding the index of each glyph within\n * the SDF atlas texture.\n * @param {Array} blockBounds - An array holding the [minX, minY, maxX, maxY] across all glyphs\n * @param {Array} [chunkedBounds] - An array of objects describing bounds for each chunk of N\n * consecutive glyphs: `{start:N, end:N, rect:[minX, minY, maxX, maxY]}`. This can be\n * used with `applyClipRect` to choose an optimized `instanceCount`.\n * @param {Uint8Array} [glyphColors] - An array holding r,g,b values for each glyph.\n */\n updateGlyphs(glyphBounds, glyphAtlasIndices, blockBounds, chunkedBounds, glyphColors) {\n // Update the instance attributes\n updateBufferAttr(this, glyphBoundsAttrName, glyphBounds, 4);\n updateBufferAttr(this, glyphIndexAttrName, glyphAtlasIndices, 1);\n updateBufferAttr(this, glyphColorAttrName, glyphColors, 3);\n this._blockBounds = blockBounds;\n this._chunkedBounds = chunkedBounds;\n this.instanceCount = glyphAtlasIndices.length;\n this._updateBounds();\n }\n\n _updateBounds() {\n const bounds = this._blockBounds;\n if (bounds) {\n const { curveRadius, boundingBox: bbox } = this;\n if (curveRadius) {\n const { PI, floor, min, max, sin, cos } = Math;\n const halfPi = PI / 2;\n const twoPi = PI * 2;\n const absR = Math.abs(curveRadius);\n const leftAngle = bounds[0] / absR;\n const rightAngle = bounds[2] / absR;\n const minX = floor((leftAngle + halfPi) / twoPi) !== floor((rightAngle + halfPi) / twoPi)\n ? -absR : min(sin(leftAngle) * absR, sin(rightAngle) * absR);\n const maxX = floor((leftAngle - halfPi) / twoPi) !== floor((rightAngle - halfPi) / twoPi)\n ? absR : max(sin(leftAngle) * absR, sin(rightAngle) * absR);\n const maxZ = floor((leftAngle + PI) / twoPi) !== floor((rightAngle + PI) / twoPi)\n ? absR * 2 : max(absR - cos(leftAngle) * absR, absR - cos(rightAngle) * absR);\n bbox.min.set(minX, bounds[1], curveRadius < 0 ? -maxZ : 0);\n bbox.max.set(maxX, bounds[3], curveRadius < 0 ? 0 : maxZ);\n } else {\n bbox.min.set(bounds[0], bounds[1], 0);\n bbox.max.set(bounds[2], bounds[3], 0);\n }\n bbox.getBoundingSphere(this.boundingSphere);\n }\n }\n\n /**\n * Given a clipping rect, and the chunkedBounds from the last updateGlyphs call, choose the lowest\n * `instanceCount` that will show all glyphs within the clipped view. This is an optimization\n * for long blocks of text that are clipped, to skip vertex shader evaluation for glyphs that would\n * be clipped anyway.\n *\n * Note that since `drawElementsInstanced[ANGLE]` only accepts an instance count and not a starting\n * offset, this optimization becomes less effective as the clipRect moves closer to the end of the\n * text block. We could fix that by switching from instancing to a full geometry with a drawRange,\n * but at the expense of much larger attribute buffers (see classdoc above.)\n *\n * @param {Vector4} clipRect\n */\n applyClipRect(clipRect) {\n let count = this.getAttribute(glyphIndexAttrName).count;\n let chunks = this._chunkedBounds;\n if (chunks) {\n for (let i = chunks.length; i--;) {\n count = chunks[i].end;\n let rect = chunks[i].rect;\n // note: both rects are l-b-r-t\n if (rect[1] < clipRect.w && rect[3] > clipRect.y && rect[0] < clipRect.z && rect[2] > clipRect.x) {\n break\n }\n }\n }\n this.instanceCount = count;\n }\n}\n\n\nfunction updateBufferAttr(geom, attrName, newArray, itemSize) {\n const attr = geom.getAttribute(attrName);\n if (newArray) {\n // If length isn't changing, just update the attribute's array data\n if (attr && attr.array.length === newArray.length) {\n attr.array.set(newArray);\n attr.needsUpdate = true;\n } else {\n geom.setAttribute(attrName, new InstancedBufferAttribute(newArray, itemSize));\n // If the new attribute has a different size, we also have to (as of r117) manually clear the\n // internal cached max instance count. See https://github.com/mrdoob/three.js/issues/19706\n // It's unclear if this is a threejs bug or a truly unsupported scenario; discussion in\n // that ticket is ambiguous as to whether replacing a BufferAttribute with one of a\n // different size is supported, but https://github.com/mrdoob/three.js/pull/17418 strongly\n // implies it should be supported. It's possible we need to\n delete geom._maxInstanceCount; //for r117+, could be fragile\n geom.dispose(); //for r118+, more robust feeling, but more heavy-handed than I'd like\n }\n } else if (attr) {\n geom.deleteAttribute(attrName);\n }\n}\n\n// language=GLSL\nconst VERTEX_DEFS = `\nuniform vec2 uTroikaSDFTextureSize;\nuniform float uTroikaSDFGlyphSize;\nuniform vec4 uTroikaTotalBounds;\nuniform vec4 uTroikaClipRect;\nuniform mat3 uTroikaOrient;\nuniform bool uTroikaUseGlyphColors;\nuniform float uTroikaDistanceOffset;\nuniform float uTroikaBlurRadius;\nuniform vec2 uTroikaPositionOffset;\nuniform float uTroikaCurveRadius;\nattribute vec4 aTroikaGlyphBounds;\nattribute float aTroikaGlyphIndex;\nattribute vec3 aTroikaGlyphColor;\nvarying vec2 vTroikaGlyphUV;\nvarying vec4 vTroikaTextureUVBounds;\nvarying float vTroikaTextureChannel;\nvarying vec3 vTroikaGlyphColor;\nvarying vec2 vTroikaGlyphDimensions;\n`;\n\n// language=GLSL prefix=\"void main() {\" suffix=\"}\"\nconst VERTEX_TRANSFORM = `\nvec4 bounds = aTroikaGlyphBounds;\nbounds.xz += uTroikaPositionOffset.x;\nbounds.yw -= uTroikaPositionOffset.y;\n\nvec4 outlineBounds = vec4(\n bounds.xy - uTroikaDistanceOffset - uTroikaBlurRadius,\n bounds.zw + uTroikaDistanceOffset + uTroikaBlurRadius\n);\nvec4 clippedBounds = vec4(\n clamp(outlineBounds.xy, uTroikaClipRect.xy, uTroikaClipRect.zw),\n clamp(outlineBounds.zw, uTroikaClipRect.xy, uTroikaClipRect.zw)\n);\n\nvec2 clippedXY = (mix(clippedBounds.xy, clippedBounds.zw, position.xy) - bounds.xy) / (bounds.zw - bounds.xy);\n\nposition.xy = mix(bounds.xy, bounds.zw, clippedXY);\n\nuv = (position.xy - uTroikaTotalBounds.xy) / (uTroikaTotalBounds.zw - uTroikaTotalBounds.xy);\n\nfloat rad = uTroikaCurveRadius;\nif (rad != 0.0) {\n float angle = position.x / rad;\n position.xz = vec2(sin(angle) * rad, rad - cos(angle) * rad);\n normal.xz = vec2(sin(angle), cos(angle));\n}\n \nposition = uTroikaOrient * position;\nnormal = uTroikaOrient * normal;\n\nvTroikaGlyphUV = clippedXY.xy;\nvTroikaGlyphDimensions = vec2(bounds[2] - bounds[0], bounds[3] - bounds[1]);\n\n${''/* NOTE: it seems important to calculate the glyph's bounding texture UVs here in the\n vertex shader, rather than in the fragment shader, as the latter gives strange artifacts\n on some glyphs (those in the leftmost texture column) on some systems. The exact reason\n isn't understood but doing this here, then mix()-ing in the fragment shader, seems to work. */}\nfloat txCols = uTroikaSDFTextureSize.x / uTroikaSDFGlyphSize;\nvec2 txUvPerSquare = uTroikaSDFGlyphSize / uTroikaSDFTextureSize;\nvec2 txStartUV = txUvPerSquare * vec2(\n mod(floor(aTroikaGlyphIndex / 4.0), txCols),\n floor(floor(aTroikaGlyphIndex / 4.0) / txCols)\n);\nvTroikaTextureUVBounds = vec4(txStartUV, vec2(txStartUV) + txUvPerSquare);\nvTroikaTextureChannel = mod(aTroikaGlyphIndex, 4.0);\n`;\n\n// language=GLSL\nconst FRAGMENT_DEFS = `\nuniform sampler2D uTroikaSDFTexture;\nuniform vec2 uTroikaSDFTextureSize;\nuniform float uTroikaSDFGlyphSize;\nuniform float uTroikaSDFExponent;\nuniform float uTroikaDistanceOffset;\nuniform float uTroikaFillOpacity;\nuniform float uTroikaOutlineOpacity;\nuniform float uTroikaBlurRadius;\nuniform vec3 uTroikaStrokeColor;\nuniform float uTroikaStrokeWidth;\nuniform float uTroikaStrokeOpacity;\nuniform bool uTroikaSDFDebug;\nvarying vec2 vTroikaGlyphUV;\nvarying vec4 vTroikaTextureUVBounds;\nvarying float vTroikaTextureChannel;\nvarying vec2 vTroikaGlyphDimensions;\n\nfloat troikaSdfValueToSignedDistance(float alpha) {\n // Inverse of exponential encoding in webgl-sdf-generator\n ${''/* TODO - there's some slight inaccuracy here when dealing with interpolated alpha values; those\n are linearly interpolated where the encoding is exponential. Look into improving this by rounding\n to nearest 2 whole texels, decoding those exponential values, and linearly interpolating the result.\n */}\n float maxDimension = max(vTroikaGlyphDimensions.x, vTroikaGlyphDimensions.y);\n float absDist = (1.0 - pow(2.0 * (alpha > 0.5 ? 1.0 - alpha : alpha), 1.0 / uTroikaSDFExponent)) * maxDimension;\n float signedDist = absDist * (alpha > 0.5 ? -1.0 : 1.0);\n return signedDist;\n}\n\nfloat troikaGlyphUvToSdfValue(vec2 glyphUV) {\n vec2 textureUV = mix(vTroikaTextureUVBounds.xy, vTroikaTextureUVBounds.zw, glyphUV);\n vec4 rgba = texture2D(uTroikaSDFTexture, textureUV);\n float ch = floor(vTroikaTextureChannel + 0.5); //NOTE: can't use round() in WebGL1\n return ch == 0.0 ? rgba.r : ch == 1.0 ? rgba.g : ch == 2.0 ? rgba.b : rgba.a;\n}\n\nfloat troikaGlyphUvToDistance(vec2 uv) {\n return troikaSdfValueToSignedDistance(troikaGlyphUvToSdfValue(uv));\n}\n\nfloat troikaGetAADist() {\n ${''/*\n When the standard derivatives extension is available, we choose an antialiasing alpha threshold based\n on the potential change in the SDF's alpha from this fragment to its neighbor. This strategy maximizes \n readability and edge crispness at all sizes and screen resolutions.\n */}\n #if defined(GL_OES_standard_derivatives) || __VERSION__ >= 300\n return length(fwidth(vTroikaGlyphUV * vTroikaGlyphDimensions)) * 0.5;\n #else\n return vTroikaGlyphDimensions.x / 64.0;\n #endif\n}\n\nfloat troikaGetFragDistValue() {\n vec2 clampedGlyphUV = clamp(vTroikaGlyphUV, 0.5 / uTroikaSDFGlyphSize, 1.0 - 0.5 / uTroikaSDFGlyphSize);\n float distance = troikaGlyphUvToDistance(clampedGlyphUV);\n \n // Extrapolate distance when outside bounds:\n distance += clampedGlyphUV == vTroikaGlyphUV ? 0.0 : \n length((vTroikaGlyphUV - clampedGlyphUV) * vTroikaGlyphDimensions);\n\n ${''/* \n // TODO more refined extrapolated distance by adjusting for angle of gradient at edge...\n // This has potential but currently gives very jagged extensions, maybe due to precision issues?\n float uvStep = 1.0 / uTroikaSDFGlyphSize;\n vec2 neighbor1UV = clampedGlyphUV + (\n vTroikaGlyphUV.x != clampedGlyphUV.x ? vec2(0.0, uvStep * sign(0.5 - vTroikaGlyphUV.y)) :\n vTroikaGlyphUV.y != clampedGlyphUV.y ? vec2(uvStep * sign(0.5 - vTroikaGlyphUV.x), 0.0) :\n vec2(0.0)\n );\n vec2 neighbor2UV = clampedGlyphUV + (\n vTroikaGlyphUV.x != clampedGlyphUV.x ? vec2(0.0, uvStep * -sign(0.5 - vTroikaGlyphUV.y)) :\n vTroikaGlyphUV.y != clampedGlyphUV.y ? vec2(uvStep * -sign(0.5 - vTroikaGlyphUV.x), 0.0) :\n vec2(0.0)\n );\n float neighbor1Distance = troikaGlyphUvToDistance(neighbor1UV);\n float neighbor2Distance = troikaGlyphUvToDistance(neighbor2UV);\n float distToUnclamped = length((vTroikaGlyphUV - clampedGlyphUV) * vTroikaGlyphDimensions);\n float distToNeighbor = length((clampedGlyphUV - neighbor1UV) * vTroikaGlyphDimensions);\n float gradientAngle1 = min(asin(abs(neighbor1Distance - distance) / distToNeighbor), PI / 2.0);\n float gradientAngle2 = min(asin(abs(neighbor2Distance - distance) / distToNeighbor), PI / 2.0);\n distance += (cos(gradientAngle1) + cos(gradientAngle2)) / 2.0 * distToUnclamped;\n */}\n\n return distance;\n}\n\nfloat troikaGetEdgeAlpha(float distance, float distanceOffset, float aaDist) {\n #if defined(IS_DEPTH_MATERIAL) || defined(IS_DISTANCE_MATERIAL)\n float alpha = step(-distanceOffset, -distance);\n #else\n\n float alpha = smoothstep(\n distanceOffset + aaDist,\n distanceOffset - aaDist,\n distance\n );\n #endif\n\n return alpha;\n}\n`;\n\n// language=GLSL prefix=\"void main() {\" suffix=\"}\"\nconst FRAGMENT_TRANSFORM = `\nfloat aaDist = troikaGetAADist();\nfloat fragDistance = troikaGetFragDistValue();\nfloat edgeAlpha = uTroikaSDFDebug ?\n troikaGlyphUvToSdfValue(vTroikaGlyphUV) :\n troikaGetEdgeAlpha(fragDistance, uTroikaDistanceOffset, max(aaDist, uTroikaBlurRadius));\n\n#if !defined(IS_DEPTH_MATERIAL) && !defined(IS_DISTANCE_MATERIAL)\nvec4 fillRGBA = gl_FragColor;\nfillRGBA.a *= uTroikaFillOpacity;\nvec4 strokeRGBA = uTroikaStrokeWidth == 0.0 ? fillRGBA : vec4(uTroikaStrokeColor, uTroikaStrokeOpacity);\nif (fillRGBA.a == 0.0) fillRGBA.rgb = strokeRGBA.rgb;\ngl_FragColor = mix(fillRGBA, strokeRGBA, smoothstep(\n -uTroikaStrokeWidth - aaDist,\n -uTroikaStrokeWidth + aaDist,\n fragDistance\n));\ngl_FragColor.a *= edgeAlpha;\n#endif\n\nif (edgeAlpha == 0.0) {\n discard;\n}\n`;\n\n\n/**\n * Create a material for rendering text, derived from a baseMaterial\n */\nfunction createTextDerivedMaterial(baseMaterial) {\n const textMaterial = createDerivedMaterial(baseMaterial, {\n chained: true,\n extensions: {\n derivatives: true\n },\n uniforms: {\n uTroikaSDFTexture: {value: null},\n uTroikaSDFTextureSize: {value: new Vector2()},\n uTroikaSDFGlyphSize: {value: 0},\n uTroikaSDFExponent: {value: 0},\n uTroikaTotalBounds: {value: new Vector4(0,0,0,0)},\n uTroikaClipRect: {value: new Vector4(0,0,0,0)},\n uTroikaDistanceOffset: {value: 0},\n uTroikaOutlineOpacity: {value: 0},\n uTroikaFillOpacity: {value: 1},\n uTroikaPositionOffset: {value: new Vector2()},\n uTroikaCurveRadius: {value: 0},\n uTroikaBlurRadius: {value: 0},\n uTroikaStrokeWidth: {value: 0},\n uTroikaStrokeColor: {value: new Color()},\n uTroikaStrokeOpacity: {value: 1},\n uTroikaOrient: {value: new Matrix3()},\n uTroikaUseGlyphColors: {value: true},\n uTroikaSDFDebug: {value: false}\n },\n vertexDefs: VERTEX_DEFS,\n vertexTransform: VERTEX_TRANSFORM,\n fragmentDefs: FRAGMENT_DEFS,\n fragmentColorTransform: FRAGMENT_TRANSFORM,\n customRewriter({vertexShader, fragmentShader}) {\n let uDiffuseRE = /\\buniform\\s+vec3\\s+diffuse\\b/;\n if (uDiffuseRE.test(fragmentShader)) {\n // Replace all instances of `diffuse` with our varying\n fragmentShader = fragmentShader\n .replace(uDiffuseRE, 'varying vec3 vTroikaGlyphColor')\n .replace(/\\bdiffuse\\b/g, 'vTroikaGlyphColor');\n // Make sure the vertex shader declares the uniform so we can grab it as a fallback\n if (!uDiffuseRE.test(vertexShader)) {\n vertexShader = vertexShader.replace(\n voidMainRegExp,\n 'uniform vec3 diffuse;\\n$&\\nvTroikaGlyphColor = uTroikaUseGlyphColors ? aTroikaGlyphColor / 255.0 : diffuse;\\n'\n );\n }\n }\n return { vertexShader, fragmentShader }\n }\n });\n\n // Force transparency - TODO is this reasonable?\n textMaterial.transparent = true;\n\n Object.defineProperties(textMaterial, {\n isTroikaTextMaterial: {value: true},\n\n // WebGLShadowMap reverses the side of the shadow material by default, which fails\n // for planes, so here we force the `shadowSide` to always match the main side.\n shadowSide: {\n get() {\n return this.side\n },\n set() {\n //no-op\n }\n }\n });\n\n return textMaterial\n}\n\nconst defaultMaterial = /*#__PURE__*/ new MeshBasicMaterial({\n color: 0xffffff,\n side: DoubleSide,\n transparent: true\n});\nconst defaultStrokeColor = 0x808080;\n\nconst tempMat4 = /*#__PURE__*/ new Matrix4();\nconst tempVec3a = /*#__PURE__*/ new Vector3();\nconst tempVec3b = /*#__PURE__*/ new Vector3();\nconst tempArray = [];\nconst origin = /*#__PURE__*/ new Vector3();\nconst defaultOrient = '+x+y';\n\nfunction first(o) {\n return Array.isArray(o) ? o[0] : o\n}\n\nlet getFlatRaycastMesh = () => {\n const mesh = new Mesh(\n new PlaneGeometry(1, 1),\n defaultMaterial\n );\n getFlatRaycastMesh = () => mesh;\n return mesh\n};\nlet getCurvedRaycastMesh = () => {\n const mesh = new Mesh(\n new PlaneGeometry(1, 1, 32, 1),\n defaultMaterial\n );\n getCurvedRaycastMesh = () => mesh;\n return mesh\n};\n\nconst syncStartEvent = { type: 'syncstart' };\nconst syncCompleteEvent = { type: 'synccomplete' };\n\nconst SYNCABLE_PROPS = [\n 'font',\n 'fontSize',\n 'letterSpacing',\n 'lineHeight',\n 'maxWidth',\n 'overflowWrap',\n 'text',\n 'direction',\n 'textAlign',\n 'textIndent',\n 'whiteSpace',\n 'anchorX',\n 'anchorY',\n 'colorRanges',\n 'sdfGlyphSize'\n];\n\nconst COPYABLE_PROPS = SYNCABLE_PROPS.concat(\n 'material',\n 'color',\n 'depthOffset',\n 'clipRect',\n 'curveRadius',\n 'orientation',\n 'glyphGeometryDetail'\n);\n\n/**\n * @class Text\n *\n * A ThreeJS Mesh that renders a string of text on a plane in 3D space using signed distance\n * fields (SDF).\n */\nclass Text extends Mesh {\n constructor() {\n const geometry = new GlyphsGeometry();\n super(geometry, null);\n\n // === Text layout properties: === //\n\n /**\n * @member {string} text\n * The string of text to be rendered.\n */\n this.text = '';\n\n /**\n * @member {number|string} anchorX\n * Defines the horizontal position in the text block that should line up with the local origin.\n * Can be specified as a numeric x position in local units, a string percentage of the total\n * text block width e.g. `'25%'`, or one of the following keyword strings: 'left', 'center',\n * or 'right'.\n */\n this.anchorX = 0;\n\n /**\n * @member {number|string} anchorX\n * Defines the vertical position in the text block that should line up with the local origin.\n * Can be specified as a numeric y position in local units (note: down is negative y), a string\n * percentage of the total text block height e.g. `'25%'`, or one of the following keyword strings:\n * 'top', 'top-baseline', 'top-cap', 'top-ex', 'middle', 'bottom-baseline', or 'bottom'.\n */\n this.anchorY = 0;\n\n /**\n * @member {number} curveRadius\n * Defines a cylindrical radius along which the text's plane will be curved. Positive numbers put\n * the cylinder's centerline (oriented vertically) that distance in front of the text, for a concave\n * curvature, while negative numbers put it behind the text for a convex curvature. The centerline\n * will be aligned with the text's local origin; you can use `anchorX` to offset it.\n *\n * Since each glyph is by default rendered with a simple quad, each glyph remains a flat plane\n * internally. You can use `glyphGeometryDetail` to add more vertices for curvature inside glyphs.\n */\n this.curveRadius = 0;\n\n /**\n * @member {string} direction\n * Sets the base direction for the text. The default value of \"auto\" will choose a direction based\n * on the text's content according to the bidi spec. A value of \"ltr\" or \"rtl\" will force the direction.\n */\n this.direction = 'auto';\n\n /**\n * @member {string} font\n * URL of a custom font to be used. Font files can be in .ttf, .otf, or .woff (not .woff2) formats.\n * Defaults to the Roboto font loaded from Google Fonts.\n */\n this.font = null; //will use default from TextBuilder\n\n /**\n * @member {number} fontSize\n * The size at which to render the font in local units; corresponds to the em-box height\n * of the chosen `font`.\n */\n this.fontSize = 0.1;\n\n /**\n * @member {number} letterSpacing\n * Sets a uniform adjustment to spacing between letters after kerning is applied. Positive\n * numbers increase spacing and negative numbers decrease it.\n */\n this.letterSpacing = 0;\n\n /**\n * @member {number|string} lineHeight\n * Sets the height of each line of text, as a multiple of the `fontSize`. Defaults to 'normal'\n * which chooses a reasonable height based on the chosen font's ascender/descender metrics.\n */\n this.lineHeight = 'normal';\n\n /**\n * @member {number} maxWidth\n * The maximum width of the text block, above which text may start wrapping according to the\n * `whiteSpace` and `overflowWrap` properties.\n */\n this.maxWidth = Infinity;\n\n /**\n * @member {string} overflowWrap\n * Defines how text wraps if the `whiteSpace` property is `normal`. Can be either `'normal'`\n * to break at whitespace characters, or `'break-word'` to allow breaking within words.\n * Defaults to `'normal'`.\n */\n this.overflowWrap = 'normal';\n\n /**\n * @member {string} textAlign\n * The horizontal alignment of each line of text within the overall text bounding box.\n */\n this.textAlign = 'left';\n\n /**\n * @member {number} textIndent\n * Indentation for the first character of a line; see CSS `text-indent`.\n */\n this.textIndent = 0;\n\n /**\n * @member {string} whiteSpace\n * Defines whether text should wrap when a line reaches the `maxWidth`. Can\n * be either `'normal'` (the default), to allow wrapping according to the `overflowWrap` property,\n * or `'nowrap'` to prevent wrapping. Note that `'normal'` here honors newline characters to\n * manually break lines, making it behave more like `'pre-wrap'` does in CSS.\n */\n this.whiteSpace = 'normal';\n\n\n // === Presentation properties: === //\n\n /**\n * @member {THREE.Material} material\n * Defines a _base_ material to be used when rendering the text. This material will be\n * automatically replaced with a material derived from it, that adds shader code to\n * decrease the alpha for each fragment (pixel) outside the text glyphs, with antialiasing.\n * By default it will derive from a simple white MeshBasicMaterial, but you can use any\n * of the other mesh materials to gain other features like lighting, texture maps, etc.\n *\n * Also see the `color` shortcut property.\n */\n this.material = null;\n\n /**\n * @member {string|number|THREE.Color} color\n * This is a shortcut for setting the `color` of the text's material. You can use this\n * if you don't want to specify a whole custom `material`. Also, if you do use a custom\n * `material`, this color will only be used for this particuar Text instance, even if\n * that same material instance is shared across multiple Text objects.\n */\n this.color = null;\n\n /**\n * @member {object|null} colorRanges\n * WARNING: This API is experimental and may change.\n * This allows more fine-grained control of colors for individual or ranges of characters,\n * taking precedence over the material's `color`. Its format is an Object whose keys each\n * define a starting character index for a range, and whose values are the color for each\n * range. The color value can be a numeric hex color value, a `THREE.Color` object, or\n * any of the strings accepted by `THREE.Color`.\n */\n this.colorRanges = null;\n\n /**\n * @member {number|string} outlineWidth\n * WARNING: This API is experimental and may change.\n * The width of an outline/halo to be drawn around each text glyph using the `outlineColor` and `outlineOpacity`.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g.\n * `\"12%\"` which is treated as a percentage of the `fontSize`. Defaults to `0`, which means\n * no outline will be drawn unless an `outlineOffsetX/Y` or `outlineBlur` is set.\n */\n this.outlineWidth = 0;\n\n /**\n * @member {string|number|THREE.Color} outlineColor\n * WARNING: This API is experimental and may change.\n * The color of the text outline, if `outlineWidth`/`outlineBlur`/`outlineOffsetX/Y` are set.\n * Defaults to black.\n */\n this.outlineColor = 0x000000;\n\n /**\n * @member {number} outlineOpacity\n * WARNING: This API is experimental and may change.\n * The opacity of the outline, if `outlineWidth`/`outlineBlur`/`outlineOffsetX/Y` are set.\n * Defaults to `1`.\n */\n this.outlineOpacity = 1;\n\n /**\n * @member {number|string} outlineBlur\n * WARNING: This API is experimental and may change.\n * A blur radius applied to the outer edge of the text's outline. If the `outlineWidth` is\n * zero, the blur will be applied at the glyph edge, like CSS's `text-shadow` blur radius.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g.\n * `\"12%\"` which is treated as a percentage of the `fontSize`. Defaults to `0`.\n */\n this.outlineBlur = 0;\n\n /**\n * @member {number|string} outlineOffsetX\n * WARNING: This API is experimental and may change.\n * A horizontal offset for the text outline.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g. `\"12%\"`\n * which is treated as a percentage of the `fontSize`. Defaults to `0`.\n */\n this.outlineOffsetX = 0;\n\n /**\n * @member {number|string} outlineOffsetY\n * WARNING: This API is experimental and may change.\n * A vertical offset for the text outline.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g. `\"12%\"`\n * which is treated as a percentage of the `fontSize`. Defaults to `0`.\n */\n this.outlineOffsetY = 0;\n\n /**\n * @member {number|string} strokeWidth\n * WARNING: This API is experimental and may change.\n * The width of an inner stroke drawn inside each text glyph using the `strokeColor` and `strokeOpacity`.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g. `\"12%\"`\n * which is treated as a percentage of the `fontSize`. Defaults to `0`.\n */\n this.strokeWidth = 0;\n\n /**\n * @member {string|number|THREE.Color} strokeColor\n * WARNING: This API is experimental and may change.\n * The color of the text stroke, if `strokeWidth` is greater than zero. Defaults to gray.\n */\n this.strokeColor = defaultStrokeColor;\n\n /**\n * @member {number} strokeOpacity\n * WARNING: This API is experimental and may change.\n * The opacity of the stroke, if `strokeWidth` is greater than zero. Defaults to `1`.\n */\n this.strokeOpacity = 1;\n\n /**\n * @member {number} fillOpacity\n * WARNING: This API is experimental and may change.\n * The opacity of the glyph's fill from 0 to 1. This behaves like the material's `opacity` but allows\n * giving the fill a different opacity than the `strokeOpacity`. A fillOpacity of `0` makes the\n * interior of the glyph invisible, leaving just the `strokeWidth`. Defaults to `1`.\n */\n this.fillOpacity = 1;\n\n /**\n * @member {number} depthOffset\n * This is a shortcut for setting the material's `polygonOffset` and related properties,\n * which can be useful in preventing z-fighting when this text is laid on top of another\n * plane in the scene. Positive numbers are further from the camera, negatives closer.\n */\n this.depthOffset = 0;\n\n /**\n * @member {Array} clipRect\n * If specified, defines a `[minX, minY, maxX, maxY]` of a rectangle outside of which all\n * pixels will be discarded. This can be used for example to clip overflowing text when\n * `whiteSpace='nowrap'`.\n */\n this.clipRect = null;\n\n /**\n * @member {string} orientation\n * Defines the axis plane on which the text should be laid out when the mesh has no extra\n * rotation transform. It is specified as a string with two axes: the horizontal axis with\n * positive pointing right, and the vertical axis with positive pointing up. By default this\n * is '+x+y', meaning the text sits on the xy plane with the text's top toward positive y\n * and facing positive z. A value of '+x-z' would place it on the xz plane with the text's\n * top toward negative z and facing positive y.\n */\n this.orientation = defaultOrient;\n\n /**\n * @member {number} glyphGeometryDetail\n * Controls number of vertical/horizontal segments that make up each glyph's rectangular\n * plane. Defaults to 1. This can be increased to provide more geometrical detail for custom\n * vertex shader effects, for example.\n */\n this.glyphGeometryDetail = 1;\n\n /**\n * @member {number|null} sdfGlyphSize\n * The size of each glyph's SDF (signed distance field) used for rendering. This must be a\n * power-of-two number. Defaults to 64 which is generally a good balance of size and quality\n * for most fonts. Larger sizes can improve the quality of glyph rendering by increasing\n * the sharpness of corners and preventing loss of very thin lines, at the expense of\n * increased memory footprint and longer SDF generation time.\n */\n this.sdfGlyphSize = null;\n\n /**\n * @member {boolean} gpuAccelerateSDF\n * When `true`, the SDF generation process will be GPU-accelerated with WebGL when possible,\n * making it much faster especially for complex glyphs, and falling back to a JavaScript version\n * executed in web workers when support isn't available. It should automatically detect support,\n * but it's still somewhat experimental, so you can set it to `false` to force it to use the JS\n * version if you encounter issues with it.\n */\n this.gpuAccelerateSDF = true;\n\n this.debugSDF = false;\n }\n\n /**\n * Updates the text rendering according to the current text-related configuration properties.\n * This is an async process, so you can pass in a callback function to be executed when it\n * finishes.\n * @param {function} [callback]\n */\n sync(callback) {\n if (this._needsSync) {\n this._needsSync = false;\n\n // If there's another sync still in progress, queue\n if (this._isSyncing) {\n (this._queuedSyncs || (this._queuedSyncs = [])).push(callback);\n } else {\n this._isSyncing = true;\n this.dispatchEvent(syncStartEvent);\n\n getTextRenderInfo({\n text: this.text,\n font: this.font,\n fontSize: this.fontSize || 0.1,\n letterSpacing: this.letterSpacing || 0,\n lineHeight: this.lineHeight || 'normal',\n maxWidth: this.maxWidth,\n direction: this.direction || 'auto',\n textAlign: this.textAlign,\n textIndent: this.textIndent,\n whiteSpace: this.whiteSpace,\n overflowWrap: this.overflowWrap,\n anchorX: this.anchorX,\n anchorY: this.anchorY,\n colorRanges: this.colorRanges,\n includeCaretPositions: true, //TODO parameterize\n sdfGlyphSize: this.sdfGlyphSize,\n gpuAccelerateSDF: this.gpuAccelerateSDF,\n }, textRenderInfo => {\n this._isSyncing = false;\n\n // Save result for later use in onBeforeRender\n this._textRenderInfo = textRenderInfo;\n\n // Update the geometry attributes\n this.geometry.updateGlyphs(\n textRenderInfo.glyphBounds,\n textRenderInfo.glyphAtlasIndices,\n textRenderInfo.blockBounds,\n textRenderInfo.chunkedBounds,\n textRenderInfo.glyphColors\n );\n\n // If we had extra sync requests queued up, kick it off\n const queued = this._queuedSyncs;\n if (queued) {\n this._queuedSyncs = null;\n this._needsSync = true;\n this.sync(() => {\n queued.forEach(fn => fn && fn());\n });\n }\n\n this.dispatchEvent(syncCompleteEvent);\n if (callback) {\n callback();\n }\n });\n }\n }\n }\n\n /**\n * Initiate a sync if needed - note it won't complete until next frame at the\n * earliest so if possible it's a good idea to call sync() manually as soon as\n * all the properties have been set.\n * @override\n */\n onBeforeRender(renderer, scene, camera, geometry, material, group) {\n this.sync();\n\n // This may not always be a text material, e.g. if there's a scene.overrideMaterial present\n if (material.isTroikaTextMaterial) {\n this._prepareForRender(material);\n }\n\n // We need to force the material to FrontSide to avoid the double-draw-call performance hit\n // introduced in Three.js r130: https://github.com/mrdoob/three.js/pull/21967 - The sidedness\n // is instead applied via drawRange in the GlyphsGeometry.\n material._hadOwnSide = material.hasOwnProperty('side');\n this.geometry.setSide(material._actualSide = material.side);\n material.side = FrontSide;\n }\n\n onAfterRender(renderer, scene, camera, geometry, material, group) {\n // Restore original material side\n if (material._hadOwnSide) {\n material.side = material._actualSide;\n } else {\n delete material.side; // back to inheriting from base material\n }\n }\n\n /**\n * Shortcut to dispose the geometry specific to this instance.\n * Note: we don't also dispose the derived material here because if anything else is\n * sharing the same base material it will result in a pause next frame as the program\n * is recompiled. Instead users can dispose the base material manually, like normal,\n * and we'll also dispose the derived material at that time.\n */\n dispose() {\n this.geometry.dispose();\n }\n\n /**\n * @property {TroikaTextRenderInfo|null} textRenderInfo\n * @readonly\n * The current processed rendering data for this TextMesh, returned by the TextBuilder after\n * a `sync()` call. This will be `null` initially, and may be stale for a short period until\n * the asynchrous `sync()` process completes.\n */\n get textRenderInfo() {\n return this._textRenderInfo || null\n }\n\n // Handler for automatically wrapping the base material with our upgrades. We do the wrapping\n // lazily on _read_ rather than write to avoid unnecessary wrapping on transient values.\n get material() {\n let derivedMaterial = this._derivedMaterial;\n const baseMaterial = this._baseMaterial || this._defaultMaterial || (this._defaultMaterial = defaultMaterial.clone());\n if (!derivedMaterial || derivedMaterial.baseMaterial !== baseMaterial) {\n derivedMaterial = this._derivedMaterial = createTextDerivedMaterial(baseMaterial);\n // dispose the derived material when its base material is disposed:\n baseMaterial.addEventListener('dispose', function onDispose() {\n baseMaterial.removeEventListener('dispose', onDispose);\n derivedMaterial.dispose();\n });\n }\n // If text outline is configured, render it as a preliminary draw using Three's multi-material\n // feature (see GlyphsGeometry which sets up `groups` for this purpose) Doing it with multi\n // materials ensures the layers are always rendered consecutively in a consistent order.\n // Each layer will trigger onBeforeRender with the appropriate material.\n if (this.outlineWidth || this.outlineBlur || this.outlineOffsetX || this.outlineOffsetY) {\n let outlineMaterial = derivedMaterial._outlineMtl;\n if (!outlineMaterial) {\n outlineMaterial = derivedMaterial._outlineMtl = Object.create(derivedMaterial, {\n id: {value: derivedMaterial.id + 0.1}\n });\n outlineMaterial.isTextOutlineMaterial = true;\n outlineMaterial.depthWrite = false;\n outlineMaterial.map = null; //???\n derivedMaterial.addEventListener('dispose', function onDispose() {\n derivedMaterial.removeEventListener('dispose', onDispose);\n outlineMaterial.dispose();\n });\n }\n return [\n outlineMaterial,\n derivedMaterial\n ]\n } else {\n return derivedMaterial\n }\n }\n set material(baseMaterial) {\n if (baseMaterial && baseMaterial.isTroikaTextMaterial) { //prevent double-derivation\n this._derivedMaterial = baseMaterial;\n this._baseMaterial = baseMaterial.baseMaterial;\n } else {\n this._baseMaterial = baseMaterial;\n }\n }\n\n get glyphGeometryDetail() {\n return this.geometry.detail\n }\n set glyphGeometryDetail(detail) {\n this.geometry.detail = detail;\n }\n\n get curveRadius() {\n return this.geometry.curveRadius\n }\n set curveRadius(r) {\n this.geometry.curveRadius = r;\n }\n\n // Create and update material for shadows upon request:\n get customDepthMaterial() {\n return first(this.material).getDepthMaterial()\n }\n get customDistanceMaterial() {\n return first(this.material).getDistanceMaterial()\n }\n\n _prepareForRender(material) {\n const isOutline = material.isTextOutlineMaterial;\n const uniforms = material.uniforms;\n const textInfo = this.textRenderInfo;\n if (textInfo) {\n const {sdfTexture, blockBounds} = textInfo;\n uniforms.uTroikaSDFTexture.value = sdfTexture;\n uniforms.uTroikaSDFTextureSize.value.set(sdfTexture.image.width, sdfTexture.image.height);\n uniforms.uTroikaSDFGlyphSize.value = textInfo.sdfGlyphSize;\n uniforms.uTroikaSDFExponent.value = textInfo.sdfExponent;\n uniforms.uTroikaTotalBounds.value.fromArray(blockBounds);\n uniforms.uTroikaUseGlyphColors.value = !isOutline && !!textInfo.glyphColors;\n\n let distanceOffset = 0;\n let blurRadius = 0;\n let strokeWidth = 0;\n let fillOpacity;\n let strokeOpacity;\n let strokeColor;\n let offsetX = 0;\n let offsetY = 0;\n\n if (isOutline) {\n let {outlineWidth, outlineOffsetX, outlineOffsetY, outlineBlur, outlineOpacity} = this;\n distanceOffset = this._parsePercent(outlineWidth) || 0;\n blurRadius = Math.max(0, this._parsePercent(outlineBlur) || 0);\n fillOpacity = outlineOpacity;\n offsetX = this._parsePercent(outlineOffsetX) || 0;\n offsetY = this._parsePercent(outlineOffsetY) || 0;\n } else {\n strokeWidth = Math.max(0, this._parsePercent(this.strokeWidth) || 0);\n if (strokeWidth) {\n strokeColor = this.strokeColor;\n uniforms.uTroikaStrokeColor.value.set(strokeColor == null ? defaultStrokeColor : strokeColor);\n strokeOpacity = this.strokeOpacity;\n if (strokeOpacity == null) strokeOpacity = 1;\n }\n fillOpacity = this.fillOpacity;\n }\n\n uniforms.uTroikaDistanceOffset.value = distanceOffset;\n uniforms.uTroikaPositionOffset.value.set(offsetX, offsetY);\n uniforms.uTroikaBlurRadius.value = blurRadius;\n uniforms.uTroikaStrokeWidth.value = strokeWidth;\n uniforms.uTroikaStrokeOpacity.value = strokeOpacity;\n uniforms.uTroikaFillOpacity.value = fillOpacity == null ? 1 : fillOpacity;\n uniforms.uTroikaCurveRadius.value = this.curveRadius || 0;\n\n let clipRect = this.clipRect;\n if (clipRect && Array.isArray(clipRect) && clipRect.length === 4) {\n uniforms.uTroikaClipRect.value.fromArray(clipRect);\n } else {\n // no clipping - choose a finite rect that shouldn't ever be reached by overflowing glyphs or outlines\n const pad = (this.fontSize || 0.1) * 100;\n uniforms.uTroikaClipRect.value.set(\n blockBounds[0] - pad,\n blockBounds[1] - pad,\n blockBounds[2] + pad,\n blockBounds[3] + pad\n );\n }\n this.geometry.applyClipRect(uniforms.uTroikaClipRect.value);\n }\n uniforms.uTroikaSDFDebug.value = !!this.debugSDF;\n material.polygonOffset = !!this.depthOffset;\n material.polygonOffsetFactor = material.polygonOffsetUnits = this.depthOffset || 0;\n\n // Shortcut for setting material color via `color` prop on the mesh; this is\n // applied only to the derived material to avoid mutating a shared base material.\n const color = isOutline ? (this.outlineColor || 0) : this.color;\n\n if (color == null) {\n delete material.color; //inherit from base\n } else {\n const colorObj = material.hasOwnProperty('color') ? material.color : (material.color = new Color());\n if (color !== colorObj._input || typeof color === 'object') {\n colorObj.set(colorObj._input = color);\n }\n }\n\n // base orientation\n let orient = this.orientation || defaultOrient;\n if (orient !== material._orientation) {\n let rotMat = uniforms.uTroikaOrient.value;\n orient = orient.replace(/[^-+xyz]/g, '');\n let match = orient !== defaultOrient && orient.match(/^([-+])([xyz])([-+])([xyz])$/);\n if (match) {\n let [, hSign, hAxis, vSign, vAxis] = match;\n tempVec3a.set(0, 0, 0)[hAxis] = hSign === '-' ? 1 : -1;\n tempVec3b.set(0, 0, 0)[vAxis] = vSign === '-' ? -1 : 1;\n tempMat4.lookAt(origin, tempVec3a.cross(tempVec3b), tempVec3b);\n rotMat.setFromMatrix4(tempMat4);\n } else {\n rotMat.identity();\n }\n material._orientation = orient;\n }\n }\n\n _parsePercent(value) {\n if (typeof value === 'string') {\n let match = value.match(/^(-?[\\d.]+)%$/);\n let pct = match ? parseFloat(match[1]) : NaN;\n value = (isNaN(pct) ? 0 : pct / 100) * this.fontSize;\n }\n return value\n }\n\n /**\n * Translate a point in local space to an x/y in the text plane.\n */\n localPositionToTextCoords(position, target = new Vector2()) {\n target.copy(position); //simple non-curved case is 1:1\n const r = this.curveRadius;\n if (r) { //flatten the curve\n target.x = Math.atan2(position.x, Math.abs(r) - Math.abs(position.z)) * Math.abs(r);\n }\n return target\n }\n\n /**\n * Translate a point in world space to an x/y in the text plane.\n */\n worldPositionToTextCoords(position, target = new Vector2()) {\n tempVec3a.copy(position);\n return this.localPositionToTextCoords(this.worldToLocal(tempVec3a), target)\n }\n\n /**\n * @override Custom raycasting to test against the whole text block's max rectangular bounds\n * TODO is there any reason to make this more granular, like within individual line or glyph rects?\n */\n raycast(raycaster, intersects) {\n const {textRenderInfo, curveRadius} = this;\n if (textRenderInfo) {\n const bounds = textRenderInfo.blockBounds;\n const raycastMesh = curveRadius ? getCurvedRaycastMesh() : getFlatRaycastMesh();\n const geom = raycastMesh.geometry;\n const {position, uv} = geom.attributes;\n for (let i = 0; i < uv.count; i++) {\n let x = bounds[0] + (uv.getX(i) * (bounds[2] - bounds[0]));\n const y = bounds[1] + (uv.getY(i) * (bounds[3] - bounds[1]));\n let z = 0;\n if (curveRadius) {\n z = curveRadius - Math.cos(x / curveRadius) * curveRadius;\n x = Math.sin(x / curveRadius) * curveRadius;\n }\n position.setXYZ(i, x, y, z);\n }\n geom.boundingSphere = this.geometry.boundingSphere;\n geom.boundingBox = this.geometry.boundingBox;\n raycastMesh.matrixWorld = this.matrixWorld;\n raycastMesh.material.side = this.material.side;\n tempArray.length = 0;\n raycastMesh.raycast(raycaster, tempArray);\n for (let i = 0; i < tempArray.length; i++) {\n tempArray[i].object = this;\n intersects.push(tempArray[i]);\n }\n }\n }\n\n copy(source) {\n // Prevent copying the geometry reference so we don't end up sharing attributes between instances\n const geom = this.geometry;\n super.copy(source);\n this.geometry = geom;\n\n COPYABLE_PROPS.forEach(prop => {\n this[prop] = source[prop];\n });\n return this\n }\n\n clone() {\n return new this.constructor().copy(this)\n }\n}\n\n\n// Create setters for properties that affect text layout:\nSYNCABLE_PROPS.forEach(prop => {\n const privateKey = '_private_' + prop;\n Object.defineProperty(Text.prototype, prop, {\n get() {\n return this[privateKey]\n },\n set(value) {\n if (value !== this[privateKey]) {\n this[privateKey] = value;\n this._needsSync = true;\n }\n }\n });\n});\n\n//=== Utility functions for dealing with carets and selection ranges ===//\n\n/**\n * @typedef {object} TextCaret\n * @property {number} x - x position of the caret\n * @property {number} y - y position of the caret's bottom\n * @property {number} height - height of the caret\n * @property {number} charIndex - the index in the original input string of this caret's target\n * character; the caret will be for the position _before_ that character.\n */\n\n/**\n * Given a local x/y coordinate in the text block plane, find the nearest caret position.\n * @param {TroikaTextRenderInfo} textRenderInfo - a result object from TextBuilder#getTextRenderInfo\n * @param {number} x\n * @param {number} y\n * @return {TextCaret | null}\n */\nfunction getCaretAtPoint(textRenderInfo, x, y) {\n let closestCaret = null;\n const {caretHeight} = textRenderInfo;\n const caretsByRow = groupCaretsByRow(textRenderInfo);\n\n // Find nearest row by y first\n let closestRowY = Infinity;\n caretsByRow.forEach((carets, rowY) => {\n if (Math.abs(y - (rowY + caretHeight / 2)) < Math.abs(y - (closestRowY + caretHeight / 2))) {\n closestRowY = rowY;\n }\n });\n\n // Then find closest caret by x within that row\n caretsByRow.get(closestRowY).forEach(caret => {\n if (!closestCaret || Math.abs(x - caret.x) < Math.abs(x - closestCaret.x)) {\n closestCaret = caret;\n }\n });\n return closestCaret\n}\n\n\nconst _rectsCache = new WeakMap();\n\n/**\n * Given start and end character indexes, return a list of rectangles covering all the\n * characters within that selection.\n * @param {TroikaTextRenderInfo} textRenderInfo\n * @param {number} start - index of the first char in the selection\n * @param {number} end - index of the first char after the selection\n * @return {Array<{left, top, right, bottom}> | null}\n */\nfunction getSelectionRects(textRenderInfo, start, end) {\n let rects;\n if (textRenderInfo) {\n // Check cache - textRenderInfo is frozen so it's safe to cache based on it\n let prevResult = _rectsCache.get(textRenderInfo);\n if (prevResult && prevResult.start === start && prevResult.end === end) {\n return prevResult.rects\n }\n\n const {caretPositions, caretHeight} = textRenderInfo;\n\n // Normalize\n if (end < start) {\n const s = start;\n start = end;\n end = s;\n }\n start = Math.max(start, 0);\n end = Math.min(end, caretPositions.length + 1);\n\n // Build list of rects, expanding the current rect for all characters in a run and starting\n // a new rect whenever reaching a new line or a new bidi direction\n rects = [];\n let currentRect = null;\n for (let i = start; i < end; i++) {\n const x1 = caretPositions[i * 3];\n const x2 = caretPositions[i * 3 + 1];\n const left = Math.min(x1, x2);\n const right = Math.max(x1, x2);\n const bottom = caretPositions[i * 3 + 2];\n if (!currentRect || bottom !== currentRect.bottom || left > currentRect.right || right < currentRect.left) {\n currentRect = {\n left: Infinity,\n right: -Infinity,\n bottom: bottom,\n top: bottom + caretHeight\n };\n rects.push(currentRect);\n }\n currentRect.left = Math.min(left, currentRect.left);\n currentRect.right = Math.max(right, currentRect.right);\n }\n\n // Merge any overlapping rects, e.g. those formed by adjacent bidi runs\n rects.sort((a, b) => b.bottom - a.bottom || a.left - b.left);\n for (let i = rects.length - 1; i-- > 0;) {\n const rectA = rects[i];\n const rectB = rects[i + 1];\n if (rectA.bottom === rectB.bottom && rectA.left <= rectB.right && rectA.right >= rectB.left) {\n rectB.left = Math.min(rectB.left, rectA.left);\n rectB.right = Math.max(rectB.right, rectA.right);\n rects.splice(i, 1);\n }\n }\n\n _rectsCache.set(textRenderInfo, {start, end, rects});\n }\n return rects\n}\n\nconst _caretsByRowCache = new WeakMap();\n\nfunction groupCaretsByRow(textRenderInfo) {\n // textRenderInfo is frozen so it's safe to cache based on it\n let caretsByRow = _caretsByRowCache.get(textRenderInfo);\n if (!caretsByRow) {\n const {caretPositions, caretHeight} = textRenderInfo;\n caretsByRow = new Map();\n for (let i = 0; i < caretPositions.length; i += 3) {\n const rowY = caretPositions[i + 2];\n let rowCarets = caretsByRow.get(rowY);\n if (!rowCarets) {\n caretsByRow.set(rowY, rowCarets = []);\n }\n rowCarets.push({\n x: caretPositions[i],\n y: rowY,\n height: caretHeight,\n charIndex: i / 3\n });\n // Add one more caret after the final char\n if (i + 3 >= caretPositions.length) {\n rowCarets.push({\n x: caretPositions[i + 1],\n y: rowY,\n height: caretHeight,\n charIndex: i / 3 + 1\n });\n }\n }\n }\n _caretsByRowCache.set(textRenderInfo, caretsByRow);\n return caretsByRow\n}\n\nexport { GlyphsGeometry, Text, configureTextBuilder, createTextDerivedMaterial, dumpSDFTextures, getCaretAtPoint, getSelectionRects, preloadFont, typesetterWorkerModule };\n","import {\n\tBox3,\n\tFloat32BufferAttribute,\n\tInstancedBufferGeometry,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tSphere,\n\tVector3,\n\tWireframeGeometry\n} from 'three';\n\nconst _box = new Box3();\nconst _vector = new Vector3();\n\nclass LineSegmentsGeometry extends InstancedBufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'LineSegmentsGeometry';\n\n\t\tconst positions = [ - 1, 2, 0, 1, 2, 0, - 1, 1, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\t\tconst uvs = [ - 1, 2, 1, 2, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 2, 1, - 2 ];\n\t\tconst index = [ 0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5 ];\n\n\t\tthis.setIndex( index );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined ) {\n\n\t\t\tstart.applyMatrix4( matrix );\n\n\t\t\tend.applyMatrix4( matrix );\n\n\t\t\tstart.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetPositions( array ) {\n\n\t\tlet lineSegments;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\tlineSegments = array;\n\n\t\t} else if ( Array.isArray( array ) ) {\n\n\t\t\tlineSegments = new Float32Array( array );\n\n\t\t}\n\n\t\tconst instanceBuffer = new InstancedInterleavedBuffer( lineSegments, 6, 1 ); // xyz, xyz\n\n\t\tthis.setAttribute( 'instanceStart', new InterleavedBufferAttribute( instanceBuffer, 3, 0 ) ); // xyz\n\t\tthis.setAttribute( 'instanceEnd', new InterleavedBufferAttribute( instanceBuffer, 3, 3 ) ); // xyz\n\n\t\t//\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\n\t\treturn this;\n\n\t}\n\n\tsetColors( array ) {\n\n\t\tlet colors;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\tcolors = array;\n\n\t\t} else if ( Array.isArray( array ) ) {\n\n\t\t\tcolors = new Float32Array( array );\n\n\t\t}\n\n\t\tconst instanceColorBuffer = new InstancedInterleavedBuffer( colors, 6, 1 ); // rgb, rgb\n\n\t\tthis.setAttribute( 'instanceColorStart', new InterleavedBufferAttribute( instanceColorBuffer, 3, 0 ) ); // rgb\n\t\tthis.setAttribute( 'instanceColorEnd', new InterleavedBufferAttribute( instanceColorBuffer, 3, 3 ) ); // rgb\n\n\t\treturn this;\n\n\t}\n\n\tfromWireframeGeometry( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t}\n\n\tfromEdgesGeometry( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t}\n\n\tfromMesh( mesh ) {\n\n\t\tthis.fromWireframeGeometry( new WireframeGeometry( mesh.geometry ) );\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t}\n\n\tfromLineSegments( lineSegments ) {\n\n\t\tconst geometry = lineSegments.geometry;\n\n\t\tif ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.LineSegmentsGeometry no longer supports Geometry. Use THREE.BufferGeometry instead.' );\n\t\t\treturn;\n\n\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\tthis.setPositions( geometry.attributes.position.array ); // assumes non-indexed\n\n\t\t}\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( start );\n\n\t\t\t_box.setFromBufferAttribute( end );\n\n\t\t\tthis.boundingBox.union( _box );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\tthis.boundingBox.getCenter( center );\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = start.count; i < il; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( start, i );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t\t_vector.fromBufferAttribute( end, i );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\t// todo\n\n\t}\n\n\tapplyMatrix( matrix ) {\n\n\t\tconsole.warn( 'THREE.LineSegmentsGeometry: applyMatrix() has been renamed to applyMatrix4().' );\n\n\t\treturn this.applyMatrix4( matrix );\n\n\t}\n\n}\n\nLineSegmentsGeometry.prototype.isLineSegmentsGeometry = true;\n\nexport { LineSegmentsGeometry };\n","import {\n\tBox3,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tLine3,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tSphere,\n\tVector3,\n\tVector4\n} from 'three';\nimport { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry.js';\nimport { LineMaterial } from '../lines/LineMaterial.js';\n\nconst _start = new Vector3();\nconst _end = new Vector3();\n\nconst _start4 = new Vector4();\nconst _end4 = new Vector4();\n\nconst _ssOrigin = new Vector4();\nconst _ssOrigin3 = new Vector3();\nconst _mvMatrix = new Matrix4();\nconst _line = new Line3();\nconst _closestPoint = new Vector3();\n\nconst _box = new Box3();\nconst _sphere = new Sphere();\nconst _clipToWorldVector = new Vector4();\n\nlet _ray, _instanceStart, _instanceEnd, _lineWidth;\n\n// Returns the margin required to expand by in world space given the distance from the camera,\n// line width, resolution, and camera projection\nfunction getWorldSpaceHalfWidth( camera, distance, resolution ) {\n\n\t// transform into clip space, adjust the x and y values by the pixel width offset, then\n\t// transform back into world space to get world offset. Note clip space is [-1, 1] so full\n\t// width does not need to be halved.\n\t_clipToWorldVector.set( 0, 0, - distance, 1.0 ).applyMatrix4( camera.projectionMatrix );\n\t_clipToWorldVector.multiplyScalar( 1.0 / _clipToWorldVector.w );\n\t_clipToWorldVector.x = _lineWidth / resolution.width;\n\t_clipToWorldVector.y = _lineWidth / resolution.height;\n\t_clipToWorldVector.applyMatrix4( camera.projectionMatrixInverse );\n\t_clipToWorldVector.multiplyScalar( 1.0 / _clipToWorldVector.w );\n\n\treturn Math.abs( Math.max( _clipToWorldVector.x, _clipToWorldVector.y ) );\n\n}\n\nfunction raycastWorldUnits( lineSegments, intersects ) {\n\n\tfor ( let i = 0, l = _instanceStart.count; i < l; i ++ ) {\n\n\t\t_line.start.fromBufferAttribute( _instanceStart, i );\n\t\t_line.end.fromBufferAttribute( _instanceEnd, i );\n\n\t\tconst pointOnLine = new Vector3();\n\t\tconst point = new Vector3();\n\n\t\t_ray.distanceSqToSegment( _line.start, _line.end, point, pointOnLine );\n\t\tconst isInside = point.distanceTo( pointOnLine ) < _lineWidth * 0.5;\n\n\t\tif ( isInside ) {\n\n\t\t\tintersects.push( {\n\t\t\t\tpoint,\n\t\t\t\tpointOnLine,\n\t\t\t\tdistance: _ray.origin.distanceTo( point ),\n\t\t\t\tobject: lineSegments,\n\t\t\t\tface: null,\n\t\t\t\tfaceIndex: i,\n\t\t\t\tuv: null,\n\t\t\t\tuv2: null,\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n}\n\nfunction raycastScreenSpace( lineSegments, camera, intersects ) {\n\n\tconst projectionMatrix = camera.projectionMatrix;\n\tconst material = lineSegments.material;\n\tconst resolution = material.resolution;\n\tconst matrixWorld = lineSegments.matrixWorld;\n\n\tconst geometry = lineSegments.geometry;\n\tconst instanceStart = geometry.attributes.instanceStart;\n\tconst instanceEnd = geometry.attributes.instanceEnd;\n\n\tconst near = - camera.near;\n\n\t//\n\n\t// pick a point 1 unit out along the ray to avoid the ray origin\n\t// sitting at the camera origin which will cause \"w\" to be 0 when\n\t// applying the projection matrix.\n\t_ray.at( 1, _ssOrigin );\n\n\t// ndc space [ - 1.0, 1.0 ]\n\t_ssOrigin.w = 1;\n\t_ssOrigin.applyMatrix4( camera.matrixWorldInverse );\n\t_ssOrigin.applyMatrix4( projectionMatrix );\n\t_ssOrigin.multiplyScalar( 1 / _ssOrigin.w );\n\n\t// screen space\n\t_ssOrigin.x *= resolution.x / 2;\n\t_ssOrigin.y *= resolution.y / 2;\n\t_ssOrigin.z = 0;\n\n\t_ssOrigin3.copy( _ssOrigin );\n\n\t_mvMatrix.multiplyMatrices( camera.matrixWorldInverse, matrixWorld );\n\n\tfor ( let i = 0, l = instanceStart.count; i < l; i ++ ) {\n\n\t\t_start4.fromBufferAttribute( instanceStart, i );\n\t\t_end4.fromBufferAttribute( instanceEnd, i );\n\n\t\t_start4.w = 1;\n\t\t_end4.w = 1;\n\n\t\t// camera space\n\t\t_start4.applyMatrix4( _mvMatrix );\n\t\t_end4.applyMatrix4( _mvMatrix );\n\n\t\t// skip the segment if it's entirely behind the camera\n\t\tconst isBehindCameraNear = _start4.z > near && _end4.z > near;\n\t\tif ( isBehindCameraNear ) {\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\t// trim the segment if it extends behind camera near\n\t\tif ( _start4.z > near ) {\n\n\t\t\tconst deltaDist = _start4.z - _end4.z;\n\t\t\tconst t = ( _start4.z - near ) / deltaDist;\n\t\t\t_start4.lerp( _end4, t );\n\n\t\t} else if ( _end4.z > near ) {\n\n\t\t\tconst deltaDist = _end4.z - _start4.z;\n\t\t\tconst t = ( _end4.z - near ) / deltaDist;\n\t\t\t_end4.lerp( _start4, t );\n\n\t\t}\n\n\t\t// clip space\n\t\t_start4.applyMatrix4( projectionMatrix );\n\t\t_end4.applyMatrix4( projectionMatrix );\n\n\t\t// ndc space [ - 1.0, 1.0 ]\n\t\t_start4.multiplyScalar( 1 / _start4.w );\n\t\t_end4.multiplyScalar( 1 / _end4.w );\n\n\t\t// screen space\n\t\t_start4.x *= resolution.x / 2;\n\t\t_start4.y *= resolution.y / 2;\n\n\t\t_end4.x *= resolution.x / 2;\n\t\t_end4.y *= resolution.y / 2;\n\n\t\t// create 2d segment\n\t\t_line.start.copy( _start4 );\n\t\t_line.start.z = 0;\n\n\t\t_line.end.copy( _end4 );\n\t\t_line.end.z = 0;\n\n\t\t// get closest point on ray to segment\n\t\tconst param = _line.closestPointToPointParameter( _ssOrigin3, true );\n\t\t_line.at( param, _closestPoint );\n\n\t\t// check if the intersection point is within clip space\n\t\tconst zPos = MathUtils.lerp( _start4.z, _end4.z, param );\n\t\tconst isInClipSpace = zPos >= - 1 && zPos <= 1;\n\n\t\tconst isInside = _ssOrigin3.distanceTo( _closestPoint ) < _lineWidth * 0.5;\n\n\t\tif ( isInClipSpace && isInside ) {\n\n\t\t\t_line.start.fromBufferAttribute( instanceStart, i );\n\t\t\t_line.end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t_line.start.applyMatrix4( matrixWorld );\n\t\t\t_line.end.applyMatrix4( matrixWorld );\n\n\t\t\tconst pointOnLine = new Vector3();\n\t\t\tconst point = new Vector3();\n\n\t\t\t_ray.distanceSqToSegment( _line.start, _line.end, point, pointOnLine );\n\n\t\t\tintersects.push( {\n\t\t\t\tpoint: point,\n\t\t\t\tpointOnLine: pointOnLine,\n\t\t\t\tdistance: _ray.origin.distanceTo( point ),\n\t\t\t\tobject: lineSegments,\n\t\t\t\tface: null,\n\t\t\t\tfaceIndex: i,\n\t\t\t\tuv: null,\n\t\t\t\tuv2: null,\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n}\n\nclass LineSegments2 extends Mesh {\n\n\tconstructor( geometry = new LineSegmentsGeometry(), material = new LineMaterial( { color: Math.random() * 0xffffff } ) ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'LineSegments2';\n\n\t}\n\n\t// for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst instanceStart = geometry.attributes.instanceStart;\n\t\tconst instanceEnd = geometry.attributes.instanceEnd;\n\t\tconst lineDistances = new Float32Array( 2 * instanceStart.count );\n\n\t\tfor ( let i = 0, j = 0, l = instanceStart.count; i < l; i ++, j += 2 ) {\n\n\t\t\t_start.fromBufferAttribute( instanceStart, i );\n\t\t\t_end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\tlineDistances[ j ] = ( j === 0 ) ? 0 : lineDistances[ j - 1 ];\n\t\t\tlineDistances[ j + 1 ] = lineDistances[ j ] + _start.distanceTo( _end );\n\n\t\t}\n\n\t\tconst instanceDistanceBuffer = new InstancedInterleavedBuffer( lineDistances, 2, 1 ); // d0, d1\n\n\t\tgeometry.setAttribute( 'instanceDistanceStart', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 0 ) ); // d0\n\t\tgeometry.setAttribute( 'instanceDistanceEnd', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 1 ) ); // d1\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst worldUnits = this.material.worldUnits;\n\t\tconst camera = raycaster.camera;\n\n\t\tif ( camera === null && ! worldUnits ) {\n\n\t\t\tconsole.error( 'LineSegments2: \"Raycaster.camera\" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.' );\n\n\t\t}\n\n\t\tconst threshold = ( raycaster.params.Line2 !== undefined ) ? raycaster.params.Line2.threshold || 0 : 0;\n\n\t\t_ray = raycaster.ray;\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\t_lineWidth = material.linewidth + threshold;\n\n\t\t_instanceStart = geometry.attributes.instanceStart;\n\t\t_instanceEnd = geometry.attributes.instanceEnd;\n\n\t\t// check if we intersect the sphere bounds\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\t_sphere.copy( geometry.boundingSphere ).applyMatrix4( matrixWorld );\n\n\t\t// increase the sphere bounds by the worst case line screen space width\n\t\tlet sphereMargin;\n\t\tif ( worldUnits ) {\n\n\t\t\tsphereMargin = _lineWidth * 0.5;\n\n\t\t} else {\n\n\t\t\tconst distanceToSphere = Math.max( camera.near, _sphere.distanceToPoint( _ray.origin ) );\n\t\t\tsphereMargin = getWorldSpaceHalfWidth( camera, distanceToSphere, material.resolution );\n\n\t\t}\n\n\t\t_sphere.radius += sphereMargin;\n\n\t\tif ( _ray.intersectsSphere( _sphere ) === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// check if we intersect the box bounds\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\t_box.copy( geometry.boundingBox ).applyMatrix4( matrixWorld );\n\n\t\t// increase the box bounds by the worst case line width\n\t\tlet boxMargin;\n\t\tif ( worldUnits ) {\n\n\t\t\tboxMargin = _lineWidth * 0.5;\n\n\t\t} else {\n\n\t\t\tconst distanceToBox = Math.max( camera.near, _box.distanceToPoint( _ray.origin ) );\n\t\t\tboxMargin = getWorldSpaceHalfWidth( camera, distanceToBox, material.resolution );\n\n\t\t}\n\n\t\t_box.expandByScalar( boxMargin );\n\n\t\tif ( _ray.intersectsBox( _box ) === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( worldUnits ) {\n\n\t\t\traycastWorldUnits( this, intersects );\n\n\t\t} else {\n\n\t\t\traycastScreenSpace( this, camera, intersects );\n\n\t\t}\n\n\t}\n\n}\n\nLineSegments2.prototype.isLineSegments2 = true;\n\nexport { LineSegments2 };\n","/**\n * Full-screen textured quad shader\n */\n\nconst CopyShader = {\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor.a *= opacity;\n\n\n\t\t}`\n\n};\n\nexport { CopyShader };\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\nclass Pass {\n\n\tconstructor() {\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nconst _geometry = new BufferGeometry();\n_geometry.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n_geometry.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","import {\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\n\nclass ShaderPass extends Pass {\n\n\tconstructor( shader, textureID ) {\n\n\t\tsuper();\n\n\t\tthis.textureID = ( textureID !== undefined ) ? textureID : 'tDiffuse';\n\n\t\tif ( shader instanceof ShaderMaterial ) {\n\n\t\t\tthis.uniforms = shader.uniforms;\n\n\t\t\tthis.material = shader;\n\n\t\t} else if ( shader ) {\n\n\t\t\tthis.uniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t\tthis.material = new ShaderMaterial( {\n\n\t\t\t\tdefines: Object.assign( {}, shader.defines ),\n\t\t\t\tuniforms: this.uniforms,\n\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\tfragmentShader: shader.fragmentShader\n\n\t\t\t} );\n\n\t\t}\n\n\t\tthis.fsQuad = new FullScreenQuad( this.material );\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].value = readBuffer.texture;\n\n\t\t}\n\n\t\tthis.fsQuad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n}\n\nexport { ShaderPass };\n","import { Pass } from './Pass.js';\n\nclass MaskPass extends Pass {\n\n\tconstructor( scene, camera ) {\n\n\t\tsuper();\n\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.clear = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis.inverse = false;\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst context = renderer.getContext();\n\t\tconst state = renderer.state;\n\n\t\t// don't update color or depth\n\n\t\tstate.buffers.color.setMask( false );\n\t\tstate.buffers.depth.setMask( false );\n\n\t\t// lock buffers\n\n\t\tstate.buffers.color.setLocked( true );\n\t\tstate.buffers.depth.setLocked( true );\n\n\t\t// set up stencil\n\n\t\tlet writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tstate.buffers.stencil.setTest( true );\n\t\tstate.buffers.stencil.setOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tstate.buffers.stencil.setFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tstate.buffers.stencil.setClear( clearValue );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.setRenderTarget( readBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\trenderer.setRenderTarget( writeBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// unlock color and depth buffer for subsequent rendering\n\n\t\tstate.buffers.color.setLocked( false );\n\t\tstate.buffers.depth.setLocked( false );\n\n\t\t// only render where stencil is set to 1\n\n\t\tstate.buffers.stencil.setLocked( false );\n\t\tstate.buffers.stencil.setFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n\t\tstate.buffers.stencil.setOp( context.KEEP, context.KEEP, context.KEEP );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t}\n\n}\n\nclass ClearMaskPass extends Pass {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.needsSwap = false;\n\n\t}\n\n\trender( renderer /*, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\trenderer.state.buffers.stencil.setLocked( false );\n\t\trenderer.state.buffers.stencil.setTest( false );\n\n\t}\n\n}\n\nexport { MaskPass, ClearMaskPass };\n","import {\n\tBufferGeometry,\n\tClock,\n\tFloat32BufferAttribute,\n\tMesh,\n\tOrthographicCamera,\n\tVector2,\n\tWebGLRenderTarget\n} from 'three';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { ShaderPass } from './ShaderPass.js';\nimport { MaskPass } from './MaskPass.js';\nimport { ClearMaskPass } from './MaskPass.js';\n\nclass EffectComposer {\n\n\tconstructor( renderer, renderTarget ) {\n\n\t\tthis.renderer = renderer;\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = renderer.getSize( new Vector2() );\n\t\t\tthis._pixelRatio = renderer.getPixelRatio();\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = new WebGLRenderTarget( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\t\t\trenderTarget.texture.name = 'EffectComposer.rt1';\n\n\t\t} else {\n\n\t\t\tthis._pixelRatio = 1;\n\t\t\tthis._width = renderTarget.width;\n\t\t\tthis._height = renderTarget.height;\n\n\t\t}\n\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\t\tthis.renderTarget2.texture.name = 'EffectComposer.rt2';\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tthis.renderToScreen = true;\n\n\t\tthis.passes = [];\n\n\t\t// dependencies\n\n\t\tif ( CopyShader === undefined ) {\n\n\t\t\tconsole.error( 'THREE.EffectComposer relies on CopyShader' );\n\n\t\t}\n\n\t\tif ( ShaderPass === undefined ) {\n\n\t\t\tconsole.error( 'THREE.EffectComposer relies on ShaderPass' );\n\n\t\t}\n\n\t\tthis.copyPass = new ShaderPass( CopyShader );\n\n\t\tthis.clock = new Clock();\n\n\t}\n\n\tswapBuffers() {\n\n\t\tconst tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t}\n\n\taddPass( pass ) {\n\n\t\tthis.passes.push( pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tinsertPass( pass, index ) {\n\n\t\tthis.passes.splice( index, 0, pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tremovePass( pass ) {\n\n\t\tconst index = this.passes.indexOf( pass );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tthis.passes.splice( index, 1 );\n\n\t\t}\n\n\t}\n\n\tisLastEnabledPass( passIndex ) {\n\n\t\tfor ( let i = passIndex + 1; i < this.passes.length; i ++ ) {\n\n\t\t\tif ( this.passes[ i ].enabled ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\trender( deltaTime ) {\n\n\t\t// deltaTime value is in seconds\n\n\t\tif ( deltaTime === undefined ) {\n\n\t\t\tdeltaTime = this.clock.getDelta();\n\n\t\t}\n\n\t\tconst currentRenderTarget = this.renderer.getRenderTarget();\n\n\t\tlet maskActive = false;\n\n\t\tfor ( let i = 0, il = this.passes.length; i < il; i ++ ) {\n\n\t\t\tconst pass = this.passes[ i ];\n\n\t\t\tif ( pass.enabled === false ) continue;\n\n\t\t\tpass.renderToScreen = ( this.renderToScreen && this.isLastEnabledPass( i ) );\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tconst context = this.renderer.getContext();\n\t\t\t\t\tconst stencil = this.renderer.state.buffers.stencil;\n\n\t\t\t\t\t//context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime );\n\n\t\t\t\t\t//context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( MaskPass !== undefined ) {\n\n\t\t\t\tif ( pass instanceof MaskPass ) {\n\n\t\t\t\t\tmaskActive = true;\n\n\t\t\t\t} else if ( pass instanceof ClearMaskPass ) {\n\n\t\t\t\t\tmaskActive = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.renderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\treset( renderTarget ) {\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = this.renderer.getSize( new Vector2() );\n\t\t\tthis._pixelRatio = this.renderer.getPixelRatio();\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = this.renderTarget1.clone();\n\t\t\trenderTarget.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t\t}\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tthis._width = width;\n\t\tthis._height = height;\n\n\t\tconst effectiveWidth = this._width * this._pixelRatio;\n\t\tconst effectiveHeight = this._height * this._pixelRatio;\n\n\t\tthis.renderTarget1.setSize( effectiveWidth, effectiveHeight );\n\t\tthis.renderTarget2.setSize( effectiveWidth, effectiveHeight );\n\n\t\tfor ( let i = 0; i < this.passes.length; i ++ ) {\n\n\t\t\tthis.passes[ i ].setSize( effectiveWidth, effectiveHeight );\n\n\t\t}\n\n\t}\n\n\tsetPixelRatio( pixelRatio ) {\n\n\t\tthis._pixelRatio = pixelRatio;\n\n\t\tthis.setSize( this._width, this._height );\n\n\t}\n\n}\n\n\nclass Pass {\n\n\tconstructor() {\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nconst _geometry = new BufferGeometry();\n_geometry.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n_geometry.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { EffectComposer, Pass, FullScreenQuad };\n","import {\n\tMatrix4,\n\tVector2\n} from 'three';\n\n/**\n * TODO\n */\n\nconst SAOShader = {\n\tdefines: {\n\t\t'NUM_SAMPLES': 7,\n\t\t'NUM_RINGS': 4,\n\t\t'NORMAL_TEXTURE': 0,\n\t\t'DIFFUSE_TEXTURE': 0,\n\t\t'DEPTH_PACKING': 1,\n\t\t'PERSPECTIVE_CAMERA': 1\n\t},\n\tuniforms: {\n\n\t\t'tDepth': { value: null },\n\t\t'tDiffuse': { value: null },\n\t\t'tNormal': { value: null },\n\t\t'size': { value: new Vector2( 512, 512 ) },\n\n\t\t'cameraNear': { value: 1 },\n\t\t'cameraFar': { value: 100 },\n\t\t'cameraProjectionMatrix': { value: new Matrix4() },\n\t\t'cameraInverseProjectionMatrix': { value: new Matrix4() },\n\n\t\t'scale': { value: 1.0 },\n\t\t'intensity': { value: 0.1 },\n\t\t'bias': { value: 0.5 },\n\n\t\t'minResolution': { value: 0.0 },\n\t\t'kernelRadius': { value: 100.0 },\n\t\t'randomSeed': { value: 0.0 }\n\t},\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#include \n\n\t\tvarying vec2 vUv;\n\n\t\t#if DIFFUSE_TEXTURE == 1\n\t\tuniform sampler2D tDiffuse;\n\t\t#endif\n\n\t\tuniform sampler2D tDepth;\n\n\t\t#if NORMAL_TEXTURE == 1\n\t\tuniform sampler2D tNormal;\n\t\t#endif\n\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform mat4 cameraProjectionMatrix;\n\t\tuniform mat4 cameraInverseProjectionMatrix;\n\n\t\tuniform float scale;\n\t\tuniform float intensity;\n\t\tuniform float bias;\n\t\tuniform float kernelRadius;\n\t\tuniform float minResolution;\n\t\tuniform vec2 size;\n\t\tuniform float randomSeed;\n\n\t\t// RGBA depth\n\n\t\t#include \n\n\t\tvec4 getDefaultColor( const in vec2 screenPosition ) {\n\t\t\t#if DIFFUSE_TEXTURE == 1\n\t\t\treturn texture2D( tDiffuse, vUv );\n\t\t\t#else\n\t\t\treturn vec4( 1.0 );\n\t\t\t#endif\n\t\t}\n\n\t\tfloat getDepth( const in vec2 screenPosition ) {\n\t\t\t#if DEPTH_PACKING == 1\n\t\t\treturn unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );\n\t\t\t#else\n\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\t\t\t#endif\n\t\t}\n\n\t\tfloat getViewZ( const in float depth ) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\n\t\t\t#else\n\t\t\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 getViewPosition( const in vec2 screenPosition, const in float depth, const in float viewZ ) {\n\t\t\tfloat clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];\n\t\t\tvec4 clipPosition = vec4( ( vec3( screenPosition, depth ) - 0.5 ) * 2.0, 1.0 );\n\t\t\tclipPosition *= clipW; // unprojection.\n\n\t\t\treturn ( cameraInverseProjectionMatrix * clipPosition ).xyz;\n\t\t}\n\n\t\tvec3 getViewNormal( const in vec3 viewPosition, const in vec2 screenPosition ) {\n\t\t\t#if NORMAL_TEXTURE == 1\n\t\t\treturn unpackRGBToNormal( texture2D( tNormal, screenPosition ).xyz );\n\t\t\t#else\n\t\t\treturn normalize( cross( dFdx( viewPosition ), dFdy( viewPosition ) ) );\n\t\t\t#endif\n\t\t}\n\n\t\tfloat scaleDividedByCameraFar;\n\t\tfloat minResolutionMultipliedByCameraFar;\n\n\t\tfloat getOcclusion( const in vec3 centerViewPosition, const in vec3 centerViewNormal, const in vec3 sampleViewPosition ) {\n\t\t\tvec3 viewDelta = sampleViewPosition - centerViewPosition;\n\t\t\tfloat viewDistance = length( viewDelta );\n\t\t\tfloat scaledScreenDistance = scaleDividedByCameraFar * viewDistance;\n\n\t\t\treturn max(0.0, (dot(centerViewNormal, viewDelta) - minResolutionMultipliedByCameraFar) / scaledScreenDistance - bias) / (1.0 + pow2( scaledScreenDistance ) );\n\t\t}\n\n\t\t// moving costly divides into consts\n\t\tconst float ANGLE_STEP = PI2 * float( NUM_RINGS ) / float( NUM_SAMPLES );\n\t\tconst float INV_NUM_SAMPLES = 1.0 / float( NUM_SAMPLES );\n\n\t\tfloat getAmbientOcclusion( const in vec3 centerViewPosition ) {\n\t\t\t// precompute some variables require in getOcclusion.\n\t\t\tscaleDividedByCameraFar = scale / cameraFar;\n\t\t\tminResolutionMultipliedByCameraFar = minResolution * cameraFar;\n\t\t\tvec3 centerViewNormal = getViewNormal( centerViewPosition, vUv );\n\n\t\t\t// jsfiddle that shows sample pattern: https://jsfiddle.net/a16ff1p7/\n\t\t\tfloat angle = rand( vUv + randomSeed ) * PI2;\n\t\t\tvec2 radius = vec2( kernelRadius * INV_NUM_SAMPLES ) / size;\n\t\t\tvec2 radiusStep = radius;\n\n\t\t\tfloat occlusionSum = 0.0;\n\t\t\tfloat weightSum = 0.0;\n\n\t\t\tfor( int i = 0; i < NUM_SAMPLES; i ++ ) {\n\t\t\t\tvec2 sampleUv = vUv + vec2( cos( angle ), sin( angle ) ) * radius;\n\t\t\t\tradius += radiusStep;\n\t\t\t\tangle += ANGLE_STEP;\n\n\t\t\t\tfloat sampleDepth = getDepth( sampleUv );\n\t\t\t\tif( sampleDepth >= ( 1.0 - EPSILON ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfloat sampleViewZ = getViewZ( sampleDepth );\n\t\t\t\tvec3 sampleViewPosition = getViewPosition( sampleUv, sampleDepth, sampleViewZ );\n\t\t\t\tocclusionSum += getOcclusion( centerViewPosition, centerViewNormal, sampleViewPosition );\n\t\t\t\tweightSum += 1.0;\n\t\t\t}\n\n\t\t\tif( weightSum == 0.0 ) discard;\n\n\t\t\treturn occlusionSum * ( intensity / weightSum );\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat centerDepth = getDepth( vUv );\n\t\t\tif( centerDepth >= ( 1.0 - EPSILON ) ) {\n\t\t\t\tdiscard;\n\t\t\t}\n\n\t\t\tfloat centerViewZ = getViewZ( centerDepth );\n\t\t\tvec3 viewPosition = getViewPosition( vUv, centerDepth, centerViewZ );\n\n\t\t\tfloat ambientOcclusion = getAmbientOcclusion( viewPosition );\n\n\t\t\tgl_FragColor = getDefaultColor( vUv );\n\t\t\tgl_FragColor.xyz *= 1.0 - ambientOcclusion;\n\t\t}`\n\n};\n\nexport { SAOShader };\n","import {\n\tVector2\n} from 'three';\n\n/**\n * TODO\n */\n\nconst DepthLimitedBlurShader = {\n\tdefines: {\n\t\t'KERNEL_RADIUS': 4,\n\t\t'DEPTH_PACKING': 1,\n\t\t'PERSPECTIVE_CAMERA': 1\n\t},\n\tuniforms: {\n\t\t'tDiffuse': { value: null },\n\t\t'size': { value: new Vector2( 512, 512 ) },\n\t\t'sampleUvOffsets': { value: [ new Vector2( 0, 0 ) ] },\n\t\t'sampleWeights': { value: [ 1.0 ] },\n\t\t'tDepth': { value: null },\n\t\t'cameraNear': { value: 10 },\n\t\t'cameraFar': { value: 1000 },\n\t\t'depthCutoff': { value: 10 },\n\t},\n\tvertexShader: /* glsl */`\n\n\t\t#include \n\n\t\tuniform vec2 size;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec2 vInvSize;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tvInvSize = 1.0 / size;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#include \n\t\t#include \n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tDepth;\n\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform float depthCutoff;\n\n\t\tuniform vec2 sampleUvOffsets[ KERNEL_RADIUS + 1 ];\n\t\tuniform float sampleWeights[ KERNEL_RADIUS + 1 ];\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec2 vInvSize;\n\n\t\tfloat getDepth( const in vec2 screenPosition ) {\n\t\t\t#if DEPTH_PACKING == 1\n\t\t\treturn unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );\n\t\t\t#else\n\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\t\t\t#endif\n\t\t}\n\n\t\tfloat getViewZ( const in float depth ) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\n\t\t\t#else\n\t\t\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\n\t\t\t#endif\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getDepth( vUv );\n\t\t\tif( depth >= ( 1.0 - EPSILON ) ) {\n\t\t\t\tdiscard;\n\t\t\t}\n\n\t\t\tfloat centerViewZ = -getViewZ( depth );\n\t\t\tbool rBreak = false, lBreak = false;\n\n\t\t\tfloat weightSum = sampleWeights[0];\n\t\t\tvec4 diffuseSum = texture2D( tDiffuse, vUv ) * weightSum;\n\n\t\t\tfor( int i = 1; i <= KERNEL_RADIUS; i ++ ) {\n\n\t\t\t\tfloat sampleWeight = sampleWeights[i];\n\t\t\t\tvec2 sampleUvOffset = sampleUvOffsets[i] * vInvSize;\n\n\t\t\t\tvec2 sampleUv = vUv + sampleUvOffset;\n\t\t\t\tfloat viewZ = -getViewZ( getDepth( sampleUv ) );\n\n\t\t\t\tif( abs( viewZ - centerViewZ ) > depthCutoff ) rBreak = true;\n\n\t\t\t\tif( ! rBreak ) {\n\t\t\t\t\tdiffuseSum += texture2D( tDiffuse, sampleUv ) * sampleWeight;\n\t\t\t\t\tweightSum += sampleWeight;\n\t\t\t\t}\n\n\t\t\t\tsampleUv = vUv - sampleUvOffset;\n\t\t\t\tviewZ = -getViewZ( getDepth( sampleUv ) );\n\n\t\t\t\tif( abs( viewZ - centerViewZ ) > depthCutoff ) lBreak = true;\n\n\t\t\t\tif( ! lBreak ) {\n\t\t\t\t\tdiffuseSum += texture2D( tDiffuse, sampleUv ) * sampleWeight;\n\t\t\t\t\tweightSum += sampleWeight;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgl_FragColor = diffuseSum / weightSum;\n\t\t}`\n\n};\n\nconst BlurShaderUtils = {\n\n\tcreateSampleWeights: function ( kernelRadius, stdDev ) {\n\n\t\tconst weights = [];\n\n\t\tfor ( let i = 0; i <= kernelRadius; i ++ ) {\n\n\t\t\tweights.push( gaussian( i, stdDev ) );\n\n\t\t}\n\n\t\treturn weights;\n\n\t},\n\n\tcreateSampleOffsets: function ( kernelRadius, uvIncrement ) {\n\n\t\tconst offsets = [];\n\n\t\tfor ( let i = 0; i <= kernelRadius; i ++ ) {\n\n\t\t\toffsets.push( uvIncrement.clone().multiplyScalar( i ) );\n\n\t\t}\n\n\t\treturn offsets;\n\n\t},\n\n\tconfigure: function ( material, kernelRadius, stdDev, uvIncrement ) {\n\n\t\tmaterial.defines[ 'KERNEL_RADIUS' ] = kernelRadius;\n\t\tmaterial.uniforms[ 'sampleUvOffsets' ].value = BlurShaderUtils.createSampleOffsets( kernelRadius, uvIncrement );\n\t\tmaterial.uniforms[ 'sampleWeights' ].value = BlurShaderUtils.createSampleWeights( kernelRadius, stdDev );\n\t\tmaterial.needsUpdate = true;\n\n\t}\n\n};\n\nfunction gaussian( x, stdDev ) {\n\n\treturn Math.exp( - ( x * x ) / ( 2.0 * ( stdDev * stdDev ) ) ) / ( Math.sqrt( 2.0 * Math.PI ) * stdDev );\n\n}\n\nexport { DepthLimitedBlurShader, BlurShaderUtils };\n","// Ported from Stefan Gustavson's java implementation\n// http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf\n// Read Stefan's excellent paper for details on how this code works.\n//\n// Sean McCullough banksean@gmail.com\n//\n// Added 4D noise\n\n/**\n * You can pass in a random number generator object if you like.\n * It is assumed to have a random() method.\n */\nclass SimplexNoise {\n\n\tconstructor( r = Math ) {\n\n\t\tthis.grad3 = [[ 1, 1, 0 ], [ - 1, 1, 0 ], [ 1, - 1, 0 ], [ - 1, - 1, 0 ],\n\t\t\t[ 1, 0, 1 ], [ - 1, 0, 1 ], [ 1, 0, - 1 ], [ - 1, 0, - 1 ],\n\t\t\t[ 0, 1, 1 ], [ 0, - 1, 1 ], [ 0, 1, - 1 ], [ 0, - 1, - 1 ]];\n\n\t\tthis.grad4 = [[ 0, 1, 1, 1 ], [ 0, 1, 1, - 1 ], [ 0, 1, - 1, 1 ], [ 0, 1, - 1, - 1 ],\n\t\t\t[ 0, - 1, 1, 1 ], [ 0, - 1, 1, - 1 ], [ 0, - 1, - 1, 1 ], [ 0, - 1, - 1, - 1 ],\n\t\t\t[ 1, 0, 1, 1 ], [ 1, 0, 1, - 1 ], [ 1, 0, - 1, 1 ], [ 1, 0, - 1, - 1 ],\n\t\t\t[ - 1, 0, 1, 1 ], [ - 1, 0, 1, - 1 ], [ - 1, 0, - 1, 1 ], [ - 1, 0, - 1, - 1 ],\n\t\t\t[ 1, 1, 0, 1 ], [ 1, 1, 0, - 1 ], [ 1, - 1, 0, 1 ], [ 1, - 1, 0, - 1 ],\n\t\t\t[ - 1, 1, 0, 1 ], [ - 1, 1, 0, - 1 ], [ - 1, - 1, 0, 1 ], [ - 1, - 1, 0, - 1 ],\n\t\t\t[ 1, 1, 1, 0 ], [ 1, 1, - 1, 0 ], [ 1, - 1, 1, 0 ], [ 1, - 1, - 1, 0 ],\n\t\t\t[ - 1, 1, 1, 0 ], [ - 1, 1, - 1, 0 ], [ - 1, - 1, 1, 0 ], [ - 1, - 1, - 1, 0 ]];\n\n\t\tthis.p = [];\n\n\t\tfor ( let i = 0; i < 256; i ++ ) {\n\n\t\t\tthis.p[ i ] = Math.floor( r.random() * 256 );\n\n\t\t}\n\n\t\t// To remove the need for index wrapping, double the permutation table length\n\t\tthis.perm = [];\n\n\t\tfor ( let i = 0; i < 512; i ++ ) {\n\n\t\t\tthis.perm[ i ] = this.p[ i & 255 ];\n\n\t\t}\n\n\t\t// A lookup table to traverse the simplex around a given point in 4D.\n\t\t// Details can be found where this table is used, in the 4D noise method.\n\t\tthis.simplex = [\n\t\t\t[ 0, 1, 2, 3 ], [ 0, 1, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 2, 3, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 2, 3, 0 ],\n\t\t\t[ 0, 2, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 3, 1, 2 ], [ 0, 3, 2, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 3, 2, 0 ],\n\t\t\t[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ],\n\t\t\t[ 1, 2, 0, 3 ], [ 0, 0, 0, 0 ], [ 1, 3, 0, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 3, 0, 1 ], [ 2, 3, 1, 0 ],\n\t\t\t[ 1, 0, 2, 3 ], [ 1, 0, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 0, 3, 1 ], [ 0, 0, 0, 0 ], [ 2, 1, 3, 0 ],\n\t\t\t[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ],\n\t\t\t[ 2, 0, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 0, 1, 2 ], [ 3, 0, 2, 1 ], [ 0, 0, 0, 0 ], [ 3, 1, 2, 0 ],\n\t\t\t[ 2, 1, 0, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 1, 0, 2 ], [ 0, 0, 0, 0 ], [ 3, 2, 0, 1 ], [ 3, 2, 1, 0 ]];\n\n\t}\n\n\tdot( g, x, y ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y;\n\n\t}\n\n\tdot3( g, x, y, z ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z;\n\n\t}\n\n\tdot4( g, x, y, z, w ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z + g[ 3 ] * w;\n\n\t}\n\n\tnoise( xin, yin ) {\n\n\t\tlet n0; // Noise contributions from the three corners\n\t\tlet n1;\n\t\tlet n2;\n\t\t// Skew the input space to determine which simplex cell we're in\n\t\tconst F2 = 0.5 * ( Math.sqrt( 3.0 ) - 1.0 );\n\t\tconst s = ( xin + yin ) * F2; // Hairy factor for 2D\n\t\tconst i = Math.floor( xin + s );\n\t\tconst j = Math.floor( yin + s );\n\t\tconst G2 = ( 3.0 - Math.sqrt( 3.0 ) ) / 6.0;\n\t\tconst t = ( i + j ) * G2;\n\t\tconst X0 = i - t; // Unskew the cell origin back to (x,y) space\n\t\tconst Y0 = j - t;\n\t\tconst x0 = xin - X0; // The x,y distances from the cell origin\n\t\tconst y0 = yin - Y0;\n\n\t\t// For the 2D case, the simplex shape is an equilateral triangle.\n\t\t// Determine which simplex we are in.\n\t\tlet i1; // Offsets for second (middle) corner of simplex in (i,j) coords\n\n\t\tlet j1;\n\t\tif ( x0 > y0 ) {\n\n\t\t\ti1 = 1; j1 = 0;\n\n\t\t\t// lower triangle, XY order: (0,0)->(1,0)->(1,1)\n\n\t\t}\telse {\n\n\t\t\ti1 = 0; j1 = 1;\n\n\t\t} // upper triangle, YX order: (0,0)->(0,1)->(1,1)\n\n\t\t// A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and\n\t\t// a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where\n\t\t// c = (3-sqrt(3))/6\n\t\tconst x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords\n\t\tconst y1 = y0 - j1 + G2;\n\t\tconst x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords\n\t\tconst y2 = y0 - 1.0 + 2.0 * G2;\n\t\t// Work out the hashed gradient indices of the three simplex corners\n\t\tconst ii = i & 255;\n\t\tconst jj = j & 255;\n\t\tconst gi0 = this.perm[ ii + this.perm[ jj ] ] % 12;\n\t\tconst gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 ] ] % 12;\n\t\tconst gi2 = this.perm[ ii + 1 + this.perm[ jj + 1 ] ] % 12;\n\t\t// Calculate the contribution from the three corners\n\t\tlet t0 = 0.5 - x0 * x0 - y0 * y0;\n\t\tif ( t0 < 0 ) n0 = 0.0;\n\t\telse {\n\n\t\t\tt0 *= t0;\n\t\t\tn0 = t0 * t0 * this.dot( this.grad3[ gi0 ], x0, y0 ); // (x,y) of grad3 used for 2D gradient\n\n\t\t}\n\n\t\tlet t1 = 0.5 - x1 * x1 - y1 * y1;\n\t\tif ( t1 < 0 ) n1 = 0.0;\n\t\telse {\n\n\t\t\tt1 *= t1;\n\t\t\tn1 = t1 * t1 * this.dot( this.grad3[ gi1 ], x1, y1 );\n\n\t\t}\n\n\t\tlet t2 = 0.5 - x2 * x2 - y2 * y2;\n\t\tif ( t2 < 0 ) n2 = 0.0;\n\t\telse {\n\n\t\t\tt2 *= t2;\n\t\t\tn2 = t2 * t2 * this.dot( this.grad3[ gi2 ], x2, y2 );\n\n\t\t}\n\n\t\t// Add contributions from each corner to get the final noise value.\n\t\t// The result is scaled to return values in the interval [-1,1].\n\t\treturn 70.0 * ( n0 + n1 + n2 );\n\n\t}\n\n\t// 3D simplex noise\n\tnoise3d( xin, yin, zin ) {\n\n\t\tlet n0; // Noise contributions from the four corners\n\t\tlet n1;\n\t\tlet n2;\n\t\tlet n3;\n\t\t// Skew the input space to determine which simplex cell we're in\n\t\tconst F3 = 1.0 / 3.0;\n\t\tconst s = ( xin + yin + zin ) * F3; // Very nice and simple skew factor for 3D\n\t\tconst i = Math.floor( xin + s );\n\t\tconst j = Math.floor( yin + s );\n\t\tconst k = Math.floor( zin + s );\n\t\tconst G3 = 1.0 / 6.0; // Very nice and simple unskew factor, too\n\t\tconst t = ( i + j + k ) * G3;\n\t\tconst X0 = i - t; // Unskew the cell origin back to (x,y,z) space\n\t\tconst Y0 = j - t;\n\t\tconst Z0 = k - t;\n\t\tconst x0 = xin - X0; // The x,y,z distances from the cell origin\n\t\tconst y0 = yin - Y0;\n\t\tconst z0 = zin - Z0;\n\n\t\t// For the 3D case, the simplex shape is a slightly irregular tetrahedron.\n\t\t// Determine which simplex we are in.\n\t\tlet i1; // Offsets for second corner of simplex in (i,j,k) coords\n\n\t\tlet j1;\n\t\tlet k1;\n\t\tlet i2; // Offsets for third corner of simplex in (i,j,k) coords\n\t\tlet j2;\n\t\tlet k2;\n\t\tif ( x0 >= y0 ) {\n\n\t\t\tif ( y0 >= z0 ) {\n\n\t\t\t\ti1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 1; k2 = 0;\n\n\t\t\t\t// X Y Z order\n\n\t\t\t} else if ( x0 >= z0 ) {\n\n\t\t\t\ti1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1;\n\n\t\t\t\t// X Z Y order\n\n\t\t\t} else {\n\n\t\t\t\ti1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1;\n\n\t\t\t} // Z X Y order\n\n\t\t} else { // x0 y0 ) ? 32 : 0;\n\t\tconst c2 = ( x0 > z0 ) ? 16 : 0;\n\t\tconst c3 = ( y0 > z0 ) ? 8 : 0;\n\t\tconst c4 = ( x0 > w0 ) ? 4 : 0;\n\t\tconst c5 = ( y0 > w0 ) ? 2 : 0;\n\t\tconst c6 = ( z0 > w0 ) ? 1 : 0;\n\t\tconst c = c1 + c2 + c3 + c4 + c5 + c6;\n\n\t\t// simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.\n\t\t// Many values of c will never occur, since e.g. x>y>z>w makes x= 3 ? 1 : 0;\n\t\tconst j1 = simplex[ c ][ 1 ] >= 3 ? 1 : 0;\n\t\tconst k1 = simplex[ c ][ 2 ] >= 3 ? 1 : 0;\n\t\tconst l1 = simplex[ c ][ 3 ] >= 3 ? 1 : 0;\n\t\t// The number 2 in the \"simplex\" array is at the second largest coordinate.\n\t\tconst i2 = simplex[ c ][ 0 ] >= 2 ? 1 : 0;\n\t\tconst j2 = simplex[ c ][ 1 ] >= 2 ? 1 : 0;\n\t\tconst k2 = simplex[ c ][ 2 ] >= 2 ? 1 : 0;\n\t\tconst l2 = simplex[ c ][ 3 ] >= 2 ? 1 : 0;\n\t\t// The number 1 in the \"simplex\" array is at the second smallest coordinate.\n\t\tconst i3 = simplex[ c ][ 0 ] >= 1 ? 1 : 0;\n\t\tconst j3 = simplex[ c ][ 1 ] >= 1 ? 1 : 0;\n\t\tconst k3 = simplex[ c ][ 2 ] >= 1 ? 1 : 0;\n\t\tconst l3 = simplex[ c ][ 3 ] >= 1 ? 1 : 0;\n\t\t// The fifth corner has all coordinate offsets = 1, so no need to look that up.\n\t\tconst x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords\n\t\tconst y1 = y0 - j1 + G4;\n\t\tconst z1 = z0 - k1 + G4;\n\t\tconst w1 = w0 - l1 + G4;\n\t\tconst x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords\n\t\tconst y2 = y0 - j2 + 2.0 * G4;\n\t\tconst z2 = z0 - k2 + 2.0 * G4;\n\t\tconst w2 = w0 - l2 + 2.0 * G4;\n\t\tconst x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords\n\t\tconst y3 = y0 - j3 + 3.0 * G4;\n\t\tconst z3 = z0 - k3 + 3.0 * G4;\n\t\tconst w3 = w0 - l3 + 3.0 * G4;\n\t\tconst x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords\n\t\tconst y4 = y0 - 1.0 + 4.0 * G4;\n\t\tconst z4 = z0 - 1.0 + 4.0 * G4;\n\t\tconst w4 = w0 - 1.0 + 4.0 * G4;\n\t\t// Work out the hashed gradient indices of the five simplex corners\n\t\tconst ii = i & 255;\n\t\tconst jj = j & 255;\n\t\tconst kk = k & 255;\n\t\tconst ll = l & 255;\n\t\tconst gi0 = perm[ ii + perm[ jj + perm[ kk + perm[ ll ] ] ] ] % 32;\n\t\tconst gi1 = perm[ ii + i1 + perm[ jj + j1 + perm[ kk + k1 + perm[ ll + l1 ] ] ] ] % 32;\n\t\tconst gi2 = perm[ ii + i2 + perm[ jj + j2 + perm[ kk + k2 + perm[ ll + l2 ] ] ] ] % 32;\n\t\tconst gi3 = perm[ ii + i3 + perm[ jj + j3 + perm[ kk + k3 + perm[ ll + l3 ] ] ] ] % 32;\n\t\tconst gi4 = perm[ ii + 1 + perm[ jj + 1 + perm[ kk + 1 + perm[ ll + 1 ] ] ] ] % 32;\n\t\t// Calculate the contribution from the five corners\n\t\tlet t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;\n\t\tif ( t0 < 0 ) n0 = 0.0;\n\t\telse {\n\n\t\t\tt0 *= t0;\n\t\t\tn0 = t0 * t0 * this.dot4( grad4[ gi0 ], x0, y0, z0, w0 );\n\n\t\t}\n\n\t\tlet t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;\n\t\tif ( t1 < 0 ) n1 = 0.0;\n\t\telse {\n\n\t\t\tt1 *= t1;\n\t\t\tn1 = t1 * t1 * this.dot4( grad4[ gi1 ], x1, y1, z1, w1 );\n\n\t\t}\n\n\t\tlet t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;\n\t\tif ( t2 < 0 ) n2 = 0.0;\n\t\telse {\n\n\t\t\tt2 *= t2;\n\t\t\tn2 = t2 * t2 * this.dot4( grad4[ gi2 ], x2, y2, z2, w2 );\n\n\t\t}\n\n\t\tlet t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;\n\t\tif ( t3 < 0 ) n3 = 0.0;\n\t\telse {\n\n\t\t\tt3 *= t3;\n\t\t\tn3 = t3 * t3 * this.dot4( grad4[ gi3 ], x3, y3, z3, w3 );\n\n\t\t}\n\n\t\tlet t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;\n\t\tif ( t4 < 0 ) n4 = 0.0;\n\t\telse {\n\n\t\t\tt4 *= t4;\n\t\t\tn4 = t4 * t4 * this.dot4( grad4[ gi4 ], x4, y4, z4, w4 );\n\n\t\t}\n\n\t\t// Sum up and scale the result to cover the range [-1,1]\n\t\treturn 27.0 * ( n0 + n1 + n2 + n3 + n4 );\n\n\t}\n\n}\n\nexport { SimplexNoise };\n","import {\n\tBoxGeometry,\n\tBufferGeometry,\n\tCylinderGeometry,\n\tDoubleSide,\n\tEuler,\n\tFloat32BufferAttribute,\n\tLine,\n\tLineBasicMaterial,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tObject3D,\n\tOctahedronGeometry,\n\tPlaneGeometry,\n\tQuaternion,\n\tRaycaster,\n\tSphereGeometry,\n\tTorusGeometry,\n\tVector3\n} from 'three';\n\nconst _raycaster = new Raycaster();\n\nconst _tempVector = new Vector3();\nconst _tempVector2 = new Vector3();\nconst _tempQuaternion = new Quaternion();\nconst _unit = {\n\tX: new Vector3( 1, 0, 0 ),\n\tY: new Vector3( 0, 1, 0 ),\n\tZ: new Vector3( 0, 0, 1 )\n};\n\nconst _changeEvent = { type: 'change' };\nconst _mouseDownEvent = { type: 'mouseDown' };\nconst _mouseUpEvent = { type: 'mouseUp', mode: null };\nconst _objectChangeEvent = { type: 'objectChange' };\n\nclass TransformControls extends Object3D {\n\n\tconstructor( camera, domElement ) {\n\n\t\tsuper();\n\n\t\tif ( domElement === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.TransformControls: The second parameter \"domElement\" is now mandatory.' );\n\t\t\tdomElement = document;\n\n\t\t}\n\n\t\tthis.visible = false;\n\t\tthis.domElement = domElement;\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t\tconst _gizmo = new TransformControlsGizmo();\n\t\tthis._gizmo = _gizmo;\n\t\tthis.add( _gizmo );\n\n\t\tconst _plane = new TransformControlsPlane();\n\t\tthis._plane = _plane;\n\t\tthis.add( _plane );\n\n\t\tconst scope = this;\n\n\t\t// Defined getter, setter and store for a property\n\t\tfunction defineProperty( propName, defaultValue ) {\n\n\t\t\tlet propValue = defaultValue;\n\n\t\t\tObject.defineProperty( scope, propName, {\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn propValue !== undefined ? propValue : defaultValue;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tif ( propValue !== value ) {\n\n\t\t\t\t\t\tpropValue = value;\n\t\t\t\t\t\t_plane[ propName ] = value;\n\t\t\t\t\t\t_gizmo[ propName ] = value;\n\n\t\t\t\t\t\tscope.dispatchEvent( { type: propName + '-changed', value: value } );\n\t\t\t\t\t\tscope.dispatchEvent( _changeEvent );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tscope[ propName ] = defaultValue;\n\t\t\t_plane[ propName ] = defaultValue;\n\t\t\t_gizmo[ propName ] = defaultValue;\n\n\t\t}\n\n\t\t// Define properties with getters/setter\n\t\t// Setting the defined property will automatically trigger change event\n\t\t// Defined properties are passed down to gizmo and plane\n\n\t\tdefineProperty( 'camera', camera );\n\t\tdefineProperty( 'object', undefined );\n\t\tdefineProperty( 'enabled', true );\n\t\tdefineProperty( 'axis', null );\n\t\tdefineProperty( 'mode', 'translate' );\n\t\tdefineProperty( 'translationSnap', null );\n\t\tdefineProperty( 'rotationSnap', null );\n\t\tdefineProperty( 'scaleSnap', null );\n\t\tdefineProperty( 'space', 'world' );\n\t\tdefineProperty( 'size', 1 );\n\t\tdefineProperty( 'dragging', false );\n\t\tdefineProperty( 'showX', true );\n\t\tdefineProperty( 'showY', true );\n\t\tdefineProperty( 'showZ', true );\n\n\t\t// Reusable utility variables\n\n\t\tconst worldPosition = new Vector3();\n\t\tconst worldPositionStart = new Vector3();\n\t\tconst worldQuaternion = new Quaternion();\n\t\tconst worldQuaternionStart = new Quaternion();\n\t\tconst cameraPosition = new Vector3();\n\t\tconst cameraQuaternion = new Quaternion();\n\t\tconst pointStart = new Vector3();\n\t\tconst pointEnd = new Vector3();\n\t\tconst rotationAxis = new Vector3();\n\t\tconst rotationAngle = 0;\n\t\tconst eye = new Vector3();\n\n\t\t// TODO: remove properties unused in plane and gizmo\n\n\t\tdefineProperty( 'worldPosition', worldPosition );\n\t\tdefineProperty( 'worldPositionStart', worldPositionStart );\n\t\tdefineProperty( 'worldQuaternion', worldQuaternion );\n\t\tdefineProperty( 'worldQuaternionStart', worldQuaternionStart );\n\t\tdefineProperty( 'cameraPosition', cameraPosition );\n\t\tdefineProperty( 'cameraQuaternion', cameraQuaternion );\n\t\tdefineProperty( 'pointStart', pointStart );\n\t\tdefineProperty( 'pointEnd', pointEnd );\n\t\tdefineProperty( 'rotationAxis', rotationAxis );\n\t\tdefineProperty( 'rotationAngle', rotationAngle );\n\t\tdefineProperty( 'eye', eye );\n\n\t\tthis._offset = new Vector3();\n\t\tthis._startNorm = new Vector3();\n\t\tthis._endNorm = new Vector3();\n\t\tthis._cameraScale = new Vector3();\n\n\t\tthis._parentPosition = new Vector3();\n\t\tthis._parentQuaternion = new Quaternion();\n\t\tthis._parentQuaternionInv = new Quaternion();\n\t\tthis._parentScale = new Vector3();\n\n\t\tthis._worldScaleStart = new Vector3();\n\t\tthis._worldQuaternionInv = new Quaternion();\n\t\tthis._worldScale = new Vector3();\n\n\t\tthis._positionStart = new Vector3();\n\t\tthis._quaternionStart = new Quaternion();\n\t\tthis._scaleStart = new Vector3();\n\n\t\tthis._getPointer = getPointer.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerHover = onPointerHover.bind( this );\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerUp = onPointerUp.bind( this );\n\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointermove', this._onPointerHover );\n\t\tthis.domElement.addEventListener( 'pointerup', this._onPointerUp );\n\n\t}\n\n\t// updateMatrixWorld updates key transformation variables\n\tupdateMatrixWorld() {\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\tthis.object.updateMatrixWorld();\n\n\t\t\tif ( this.object.parent === null ) {\n\n\t\t\t\tconsole.error( 'TransformControls: The attached 3D object must be a part of the scene graph.' );\n\n\t\t\t} else {\n\n\t\t\t\tthis.object.parent.matrixWorld.decompose( this._parentPosition, this._parentQuaternion, this._parentScale );\n\n\t\t\t}\n\n\t\t\tthis.object.matrixWorld.decompose( this.worldPosition, this.worldQuaternion, this._worldScale );\n\n\t\t\tthis._parentQuaternionInv.copy( this._parentQuaternion ).invert();\n\t\t\tthis._worldQuaternionInv.copy( this.worldQuaternion ).invert();\n\n\t\t}\n\n\t\tthis.camera.updateMatrixWorld();\n\t\tthis.camera.matrixWorld.decompose( this.cameraPosition, this.cameraQuaternion, this._cameraScale );\n\n\t\tthis.eye.copy( this.cameraPosition ).sub( this.worldPosition ).normalize();\n\n\t\tsuper.updateMatrixWorld( this );\n\n\t}\n\n\tpointerHover( pointer ) {\n\n\t\tif ( this.object === undefined || this.dragging === true ) return;\n\n\t\t_raycaster.setFromCamera( pointer, this.camera );\n\n\t\tconst intersect = intersectObjectWithRay( this._gizmo.picker[ this.mode ], _raycaster );\n\n\t\tif ( intersect ) {\n\n\t\t\tthis.axis = intersect.object.name;\n\n\t\t} else {\n\n\t\t\tthis.axis = null;\n\n\t\t}\n\n\t}\n\n\tpointerDown( pointer ) {\n\n\t\tif ( this.object === undefined || this.dragging === true || pointer.button !== 0 ) return;\n\n\t\tif ( this.axis !== null ) {\n\n\t\t\t_raycaster.setFromCamera( pointer, this.camera );\n\n\t\t\tconst planeIntersect = intersectObjectWithRay( this._plane, _raycaster, true );\n\n\t\t\tif ( planeIntersect ) {\n\n\t\t\t\tthis.object.updateMatrixWorld();\n\t\t\t\tthis.object.parent.updateMatrixWorld();\n\n\t\t\t\tthis._positionStart.copy( this.object.position );\n\t\t\t\tthis._quaternionStart.copy( this.object.quaternion );\n\t\t\t\tthis._scaleStart.copy( this.object.scale );\n\n\t\t\t\tthis.object.matrixWorld.decompose( this.worldPositionStart, this.worldQuaternionStart, this._worldScaleStart );\n\n\t\t\t\tthis.pointStart.copy( planeIntersect.point ).sub( this.worldPositionStart );\n\n\t\t\t}\n\n\t\t\tthis.dragging = true;\n\t\t\t_mouseDownEvent.mode = this.mode;\n\t\t\tthis.dispatchEvent( _mouseDownEvent );\n\n\t\t}\n\n\t}\n\n\tpointerMove( pointer ) {\n\n\t\tconst axis = this.axis;\n\t\tconst mode = this.mode;\n\t\tconst object = this.object;\n\t\tlet space = this.space;\n\n\t\tif ( mode === 'scale' ) {\n\n\t\t\tspace = 'local';\n\n\t\t} else if ( axis === 'E' || axis === 'XYZE' || axis === 'XYZ' ) {\n\n\t\t\tspace = 'world';\n\n\t\t}\n\n\t\tif ( object === undefined || axis === null || this.dragging === false || pointer.button !== - 1 ) return;\n\n\t\t_raycaster.setFromCamera( pointer, this.camera );\n\n\t\tconst planeIntersect = intersectObjectWithRay( this._plane, _raycaster, true );\n\n\t\tif ( ! planeIntersect ) return;\n\n\t\tthis.pointEnd.copy( planeIntersect.point ).sub( this.worldPositionStart );\n\n\t\tif ( mode === 'translate' ) {\n\n\t\t\t// Apply translate\n\n\t\t\tthis._offset.copy( this.pointEnd ).sub( this.pointStart );\n\n\t\t\tif ( space === 'local' && axis !== 'XYZ' ) {\n\n\t\t\t\tthis._offset.applyQuaternion( this._worldQuaternionInv );\n\n\t\t\t}\n\n\t\t\tif ( axis.indexOf( 'X' ) === - 1 ) this._offset.x = 0;\n\t\t\tif ( axis.indexOf( 'Y' ) === - 1 ) this._offset.y = 0;\n\t\t\tif ( axis.indexOf( 'Z' ) === - 1 ) this._offset.z = 0;\n\n\t\t\tif ( space === 'local' && axis !== 'XYZ' ) {\n\n\t\t\t\tthis._offset.applyQuaternion( this._quaternionStart ).divide( this._parentScale );\n\n\t\t\t} else {\n\n\t\t\t\tthis._offset.applyQuaternion( this._parentQuaternionInv ).divide( this._parentScale );\n\n\t\t\t}\n\n\t\t\tobject.position.copy( this._offset ).add( this._positionStart );\n\n\t\t\t// Apply translation snap\n\n\t\t\tif ( this.translationSnap ) {\n\n\t\t\t\tif ( space === 'local' ) {\n\n\t\t\t\t\tobject.position.applyQuaternion( _tempQuaternion.copy( this._quaternionStart ).invert() );\n\n\t\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.position.applyQuaternion( this._quaternionStart );\n\n\t\t\t\t}\n\n\t\t\t\tif ( space === 'world' ) {\n\n\t\t\t\t\tif ( object.parent ) {\n\n\t\t\t\t\t\tobject.position.add( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.parent ) {\n\n\t\t\t\t\t\tobject.position.sub( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( mode === 'scale' ) {\n\n\t\t\tif ( axis.search( 'XYZ' ) !== - 1 ) {\n\n\t\t\t\tlet d = this.pointEnd.length() / this.pointStart.length();\n\n\t\t\t\tif ( this.pointEnd.dot( this.pointStart ) < 0 ) d *= - 1;\n\n\t\t\t\t_tempVector2.set( d, d, d );\n\n\t\t\t} else {\n\n\t\t\t\t_tempVector.copy( this.pointStart );\n\t\t\t\t_tempVector2.copy( this.pointEnd );\n\n\t\t\t\t_tempVector.applyQuaternion( this._worldQuaternionInv );\n\t\t\t\t_tempVector2.applyQuaternion( this._worldQuaternionInv );\n\n\t\t\t\t_tempVector2.divide( _tempVector );\n\n\t\t\t\tif ( axis.search( 'X' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.x = 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Y' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.y = 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Z' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.z = 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Apply scale\n\n\t\t\tobject.scale.copy( this._scaleStart ).multiply( _tempVector2 );\n\n\t\t\tif ( this.scaleSnap ) {\n\n\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.x = Math.round( object.scale.x / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.y = Math.round( object.scale.y / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.z = Math.round( object.scale.z / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( mode === 'rotate' ) {\n\n\t\t\tthis._offset.copy( this.pointEnd ).sub( this.pointStart );\n\n\t\t\tconst ROTATION_SPEED = 20 / this.worldPosition.distanceTo( _tempVector.setFromMatrixPosition( this.camera.matrixWorld ) );\n\n\t\t\tif ( axis === 'E' ) {\n\n\t\t\t\tthis.rotationAxis.copy( this.eye );\n\t\t\t\tthis.rotationAngle = this.pointEnd.angleTo( this.pointStart );\n\n\t\t\t\tthis._startNorm.copy( this.pointStart ).normalize();\n\t\t\t\tthis._endNorm.copy( this.pointEnd ).normalize();\n\n\t\t\t\tthis.rotationAngle *= ( this._endNorm.cross( this._startNorm ).dot( this.eye ) < 0 ? 1 : - 1 );\n\n\t\t\t} else if ( axis === 'XYZE' ) {\n\n\t\t\t\tthis.rotationAxis.copy( this._offset ).cross( this.eye ).normalize();\n\t\t\t\tthis.rotationAngle = this._offset.dot( _tempVector.copy( this.rotationAxis ).cross( this.eye ) ) * ROTATION_SPEED;\n\n\t\t\t} else if ( axis === 'X' || axis === 'Y' || axis === 'Z' ) {\n\n\t\t\t\tthis.rotationAxis.copy( _unit[ axis ] );\n\n\t\t\t\t_tempVector.copy( _unit[ axis ] );\n\n\t\t\t\tif ( space === 'local' ) {\n\n\t\t\t\t\t_tempVector.applyQuaternion( this.worldQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tthis.rotationAngle = this._offset.dot( _tempVector.cross( this.eye ).normalize() ) * ROTATION_SPEED;\n\n\t\t\t}\n\n\t\t\t// Apply rotation snap\n\n\t\t\tif ( this.rotationSnap ) this.rotationAngle = Math.round( this.rotationAngle / this.rotationSnap ) * this.rotationSnap;\n\n\t\t\t// Apply rotate\n\t\t\tif ( space === 'local' && axis !== 'E' && axis !== 'XYZE' ) {\n\n\t\t\t\tobject.quaternion.copy( this._quaternionStart );\n\t\t\t\tobject.quaternion.multiply( _tempQuaternion.setFromAxisAngle( this.rotationAxis, this.rotationAngle ) ).normalize();\n\n\t\t\t} else {\n\n\t\t\t\tthis.rotationAxis.applyQuaternion( this._parentQuaternionInv );\n\t\t\t\tobject.quaternion.copy( _tempQuaternion.setFromAxisAngle( this.rotationAxis, this.rotationAngle ) );\n\t\t\t\tobject.quaternion.multiply( this._quaternionStart ).normalize();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( _changeEvent );\n\t\tthis.dispatchEvent( _objectChangeEvent );\n\n\t}\n\n\tpointerUp( pointer ) {\n\n\t\tif ( pointer.button !== 0 ) return;\n\n\t\tif ( this.dragging && ( this.axis !== null ) ) {\n\n\t\t\t_mouseUpEvent.mode = this.mode;\n\t\t\tthis.dispatchEvent( _mouseUpEvent );\n\n\t\t}\n\n\t\tthis.dragging = false;\n\t\tthis.axis = null;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerHover );\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\tthis.traverse( function ( child ) {\n\n\t\t\tif ( child.geometry ) child.geometry.dispose();\n\t\t\tif ( child.material ) child.material.dispose();\n\n\t\t} );\n\n\t}\n\n\t// Set current object\n\tattach( object ) {\n\n\t\tthis.object = object;\n\t\tthis.visible = true;\n\n\t\treturn this;\n\n\t}\n\n\t// Detatch from object\n\tdetach() {\n\n\t\tthis.object = undefined;\n\t\tthis.visible = false;\n\t\tthis.axis = null;\n\n\t\treturn this;\n\n\t}\n\n\treset() {\n\n\t\tif ( ! this.enabled ) return;\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis.object.position.copy( this._positionStart );\n\t\t\tthis.object.quaternion.copy( this._quaternionStart );\n\t\t\tthis.object.scale.copy( this._scaleStart );\n\n\t\t\tthis.dispatchEvent( _changeEvent );\n\t\t\tthis.dispatchEvent( _objectChangeEvent );\n\n\t\t\tthis.pointStart.copy( this.pointEnd );\n\n\t\t}\n\n\t}\n\n\tgetRaycaster() {\n\n\t\treturn _raycaster;\n\n\t}\n\n\t// TODO: deprecate\n\n\tgetMode() {\n\n\t\treturn this.mode;\n\n\t}\n\n\tsetMode( mode ) {\n\n\t\tthis.mode = mode;\n\n\t}\n\n\tsetTranslationSnap( translationSnap ) {\n\n\t\tthis.translationSnap = translationSnap;\n\n\t}\n\n\tsetRotationSnap( rotationSnap ) {\n\n\t\tthis.rotationSnap = rotationSnap;\n\n\t}\n\n\tsetScaleSnap( scaleSnap ) {\n\n\t\tthis.scaleSnap = scaleSnap;\n\n\t}\n\n\tsetSize( size ) {\n\n\t\tthis.size = size;\n\n\t}\n\n\tsetSpace( space ) {\n\n\t\tthis.space = space;\n\n\t}\n\n\tupdate() {\n\n\t\tconsole.warn( 'THREE.TransformControls: update function has no more functionality and therefore has been deprecated.' );\n\n\t}\n\n}\n\nTransformControls.prototype.isTransformControls = true;\n\n// mouse / touch event handlers\n\nfunction getPointer( event ) {\n\n\tif ( this.domElement.ownerDocument.pointerLockElement ) {\n\n\t\treturn {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tbutton: event.button\n\t\t};\n\n\t} else {\n\n\t\tconst rect = this.domElement.getBoundingClientRect();\n\n\t\treturn {\n\t\t\tx: ( event.clientX - rect.left ) / rect.width * 2 - 1,\n\t\t\ty: - ( event.clientY - rect.top ) / rect.height * 2 + 1,\n\t\t\tbutton: event.button\n\t\t};\n\n\t}\n\n}\n\nfunction onPointerHover( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tswitch ( event.pointerType ) {\n\n\t\tcase 'mouse':\n\t\tcase 'pen':\n\t\t\tthis.pointerHover( this._getPointer( event ) );\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onPointerDown( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tif ( ! document.pointerLockElement ) {\n\n\t\tthis.domElement.setPointerCapture( event.pointerId );\n\n\t}\n\n\tthis.domElement.addEventListener( 'pointermove', this._onPointerMove );\n\n\tthis.pointerHover( this._getPointer( event ) );\n\tthis.pointerDown( this._getPointer( event ) );\n\n}\n\nfunction onPointerMove( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tthis.pointerMove( this._getPointer( event ) );\n\n}\n\nfunction onPointerUp( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tthis.domElement.releasePointerCapture( event.pointerId );\n\n\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\n\tthis.pointerUp( this._getPointer( event ) );\n\n}\n\nfunction intersectObjectWithRay( object, raycaster, includeInvisible ) {\n\n\tconst allIntersections = raycaster.intersectObject( object, true );\n\n\tfor ( let i = 0; i < allIntersections.length; i ++ ) {\n\n\t\tif ( allIntersections[ i ].object.visible || includeInvisible ) {\n\n\t\t\treturn allIntersections[ i ];\n\n\t\t}\n\n\t}\n\n\treturn false;\n\n}\n\n//\n\n// Reusable utility variables\n\nconst _tempEuler = new Euler();\nconst _alignVector = new Vector3( 0, 1, 0 );\nconst _zeroVector = new Vector3( 0, 0, 0 );\nconst _lookAtMatrix = new Matrix4();\nconst _tempQuaternion2 = new Quaternion();\nconst _identityQuaternion = new Quaternion();\nconst _dirVector = new Vector3();\nconst _tempMatrix = new Matrix4();\n\nconst _unitX = new Vector3( 1, 0, 0 );\nconst _unitY = new Vector3( 0, 1, 0 );\nconst _unitZ = new Vector3( 0, 0, 1 );\n\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\nconst _v3 = new Vector3();\n\nclass TransformControlsGizmo extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'TransformControlsGizmo';\n\n\t\t// shared materials\n\n\t\tconst gizmoMaterial = new MeshBasicMaterial( {\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tfog: false,\n\t\t\ttoneMapped: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\tconst gizmoLineMaterial = new LineBasicMaterial( {\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tfog: false,\n\t\t\ttoneMapped: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\t// Make unique material for each axis/color\n\n\t\tconst matInvisible = gizmoMaterial.clone();\n\t\tmatInvisible.opacity = 0.15;\n\n\t\tconst matHelper = gizmoLineMaterial.clone();\n\t\tmatHelper.opacity = 0.5;\n\n\t\tconst matRed = gizmoMaterial.clone();\n\t\tmatRed.color.setHex( 0xff0000 );\n\n\t\tconst matGreen = gizmoMaterial.clone();\n\t\tmatGreen.color.setHex( 0x00ff00 );\n\n\t\tconst matBlue = gizmoMaterial.clone();\n\t\tmatBlue.color.setHex( 0x0000ff );\n\n\t\tconst matRedTransparent = gizmoMaterial.clone();\n\t\tmatRedTransparent.color.setHex( 0xff0000 );\n\t\tmatRedTransparent.opacity = 0.5;\n\n\t\tconst matGreenTransparent = gizmoMaterial.clone();\n\t\tmatGreenTransparent.color.setHex( 0x00ff00 );\n\t\tmatGreenTransparent.opacity = 0.5;\n\n\t\tconst matBlueTransparent = gizmoMaterial.clone();\n\t\tmatBlueTransparent.color.setHex( 0x0000ff );\n\t\tmatBlueTransparent.opacity = 0.5;\n\n\t\tconst matWhiteTransparent = gizmoMaterial.clone();\n\t\tmatWhiteTransparent.opacity = 0.25;\n\n\t\tconst matYellowTransparent = gizmoMaterial.clone();\n\t\tmatYellowTransparent.color.setHex( 0xffff00 );\n\t\tmatYellowTransparent.opacity = 0.25;\n\n\t\tconst matYellow = gizmoMaterial.clone();\n\t\tmatYellow.color.setHex( 0xffff00 );\n\n\t\tconst matGray = gizmoMaterial.clone();\n\t\tmatGray.color.setHex( 0x787878 );\n\n\t\t// reusable geometry\n\n\t\tconst arrowGeometry = new CylinderGeometry( 0, 0.04, 0.1, 12 );\n\t\tarrowGeometry.translate( 0, 0.05, 0 );\n\n\t\tconst scaleHandleGeometry = new BoxGeometry( 0.08, 0.08, 0.08 );\n\t\tscaleHandleGeometry.translate( 0, 0.04, 0 );\n\n\t\tconst lineGeometry = new BufferGeometry();\n\t\tlineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0,\t1, 0, 0 ], 3 ) );\n\n\t\tconst lineGeometry2 = new CylinderGeometry( 0.0075, 0.0075, 0.5, 3 );\n\t\tlineGeometry2.translate( 0, 0.25, 0 );\n\n\t\tfunction CircleGeometry( radius, arc ) {\n\n\t\t\tconst geometry = new TorusGeometry( radius, 0.0075, 3, 64, arc * Math.PI * 2 );\n\t\t\tgeometry.rotateY( Math.PI / 2 );\n\t\t\tgeometry.rotateX( Math.PI / 2 );\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\t// Special geometry for transform helper. If scaled with position vector it spans from [0,0,0] to position\n\n\t\tfunction TranslateHelperGeometry() {\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 1, 1, 1 ], 3 ) );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\t// Gizmo definitions - custom hierarchy definitions for setupGizmo() function\n\n\t\tconst gizmoTranslate = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( arrowGeometry, matRed ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( arrowGeometry, matGreen ), [ 0, 0.5, 0 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matGreen ), [ 0, - 0.5, 0 ], [ Math.PI, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matGreen ) ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matBlue ), null, [ Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.1, 0 ), matWhiteTransparent.clone() ), [ 0, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent.clone() ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent.clone() ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent.clone() ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst pickerTranslate = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.2, 0 ), matInvisible ) ]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst helperTranslate = {\n\t\t\tSTART: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tEND: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tDELTA: [\n\t\t\t\t[ new Line( TranslateHelperGeometry(), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, - 1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\tconst gizmoRotate = {\n\t\t\tXYZE: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 1 ), matGray ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matRed ) ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matGreen ), null, [ 0, 0, - Math.PI / 2 ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matBlue ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tE: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.75, 1 ), matYellowTransparent ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst helperRotate = {\n\t\t\tAXIS: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\tconst pickerRotate = {\n\t\t\tXYZE: [\n\t\t\t\t[ new Mesh( new SphereGeometry( 0.25, 10, 8 ), matInvisible ) ]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, - Math.PI / 2, - Math.PI / 2 ]],\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t],\n\t\t\tE: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.75, 0.1, 2, 24 ), matInvisible ) ]\n\t\t\t]\n\t\t};\n\n\t\tconst gizmoScale = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matRed ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]],\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matGreen ), [ 0, 0.5, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matGreen ) ],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matGreen ), [ 0, - 0.5, 0 ], [ 0, 0, Math.PI ]],\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matBlue ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.1, 0.1, 0.1 ), matWhiteTransparent.clone() ) ],\n\t\t\t]\n\t\t};\n\n\t\tconst pickerScale = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]],\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]],\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]],\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 0 ]],\n\t\t\t]\n\t\t};\n\n\t\tconst helperScale = {\n\t\t\tX: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, - 1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\t// Creates an Object3D with gizmos described in custom hierarchy definition.\n\n\t\tfunction setupGizmo( gizmoMap ) {\n\n\t\t\tconst gizmo = new Object3D();\n\n\t\t\tfor ( const name in gizmoMap ) {\n\n\t\t\t\tfor ( let i = gizmoMap[ name ].length; i --; ) {\n\n\t\t\t\t\tconst object = gizmoMap[ name ][ i ][ 0 ].clone();\n\t\t\t\t\tconst position = gizmoMap[ name ][ i ][ 1 ];\n\t\t\t\t\tconst rotation = gizmoMap[ name ][ i ][ 2 ];\n\t\t\t\t\tconst scale = gizmoMap[ name ][ i ][ 3 ];\n\t\t\t\t\tconst tag = gizmoMap[ name ][ i ][ 4 ];\n\n\t\t\t\t\t// name and tag properties are essential for picking and updating logic.\n\t\t\t\t\tobject.name = name;\n\t\t\t\t\tobject.tag = tag;\n\n\t\t\t\t\tif ( position ) {\n\n\t\t\t\t\t\tobject.position.set( position[ 0 ], position[ 1 ], position[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( rotation ) {\n\n\t\t\t\t\t\tobject.rotation.set( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( scale ) {\n\n\t\t\t\t\t\tobject.scale.set( scale[ 0 ], scale[ 1 ], scale[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.updateMatrix();\n\n\t\t\t\t\tconst tempGeometry = object.geometry.clone();\n\t\t\t\t\ttempGeometry.applyMatrix4( object.matrix );\n\t\t\t\t\tobject.geometry = tempGeometry;\n\t\t\t\t\tobject.renderOrder = Infinity;\n\n\t\t\t\t\tobject.position.set( 0, 0, 0 );\n\t\t\t\t\tobject.rotation.set( 0, 0, 0 );\n\t\t\t\t\tobject.scale.set( 1, 1, 1 );\n\n\t\t\t\t\tgizmo.add( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn gizmo;\n\n\t\t}\n\n\t\t// Gizmo creation\n\n\t\tthis.gizmo = {};\n\t\tthis.picker = {};\n\t\tthis.helper = {};\n\n\t\tthis.add( this.gizmo[ 'translate' ] = setupGizmo( gizmoTranslate ) );\n\t\tthis.add( this.gizmo[ 'rotate' ] = setupGizmo( gizmoRotate ) );\n\t\tthis.add( this.gizmo[ 'scale' ] = setupGizmo( gizmoScale ) );\n\t\tthis.add( this.picker[ 'translate' ] = setupGizmo( pickerTranslate ) );\n\t\tthis.add( this.picker[ 'rotate' ] = setupGizmo( pickerRotate ) );\n\t\tthis.add( this.picker[ 'scale' ] = setupGizmo( pickerScale ) );\n\t\tthis.add( this.helper[ 'translate' ] = setupGizmo( helperTranslate ) );\n\t\tthis.add( this.helper[ 'rotate' ] = setupGizmo( helperRotate ) );\n\t\tthis.add( this.helper[ 'scale' ] = setupGizmo( helperScale ) );\n\n\t\t// Pickers should be hidden always\n\n\t\tthis.picker[ 'translate' ].visible = false;\n\t\tthis.picker[ 'rotate' ].visible = false;\n\t\tthis.picker[ 'scale' ].visible = false;\n\n\t}\n\n\t// updateMatrixWorld will update transformations and appearance of individual handles\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst space = ( this.mode === 'scale' ) ? 'local' : this.space; // scale always oriented to local rotation\n\n\t\tconst quaternion = ( space === 'local' ) ? this.worldQuaternion : _identityQuaternion;\n\n\t\t// Show only gizmos for current transform mode\n\n\t\tthis.gizmo[ 'translate' ].visible = this.mode === 'translate';\n\t\tthis.gizmo[ 'rotate' ].visible = this.mode === 'rotate';\n\t\tthis.gizmo[ 'scale' ].visible = this.mode === 'scale';\n\n\t\tthis.helper[ 'translate' ].visible = this.mode === 'translate';\n\t\tthis.helper[ 'rotate' ].visible = this.mode === 'rotate';\n\t\tthis.helper[ 'scale' ].visible = this.mode === 'scale';\n\n\n\t\tlet handles = [];\n\t\thandles = handles.concat( this.picker[ this.mode ].children );\n\t\thandles = handles.concat( this.gizmo[ this.mode ].children );\n\t\thandles = handles.concat( this.helper[ this.mode ].children );\n\n\t\tfor ( let i = 0; i < handles.length; i ++ ) {\n\n\t\t\tconst handle = handles[ i ];\n\n\t\t\t// hide aligned to camera\n\n\t\t\thandle.visible = true;\n\t\t\thandle.rotation.set( 0, 0, 0 );\n\t\t\thandle.position.copy( this.worldPosition );\n\n\t\t\tlet factor;\n\n\t\t\tif ( this.camera.isOrthographicCamera ) {\n\n\t\t\t\tfactor = ( this.camera.top - this.camera.bottom ) / this.camera.zoom;\n\n\t\t\t} else {\n\n\t\t\t\tfactor = this.worldPosition.distanceTo( this.cameraPosition ) * Math.min( 1.9 * Math.tan( Math.PI * this.camera.fov / 360 ) / this.camera.zoom, 7 );\n\n\t\t\t}\n\n\t\t\thandle.scale.set( 1, 1, 1 ).multiplyScalar( factor * this.size / 4 );\n\n\t\t\t// TODO: simplify helpers and consider decoupling from gizmo\n\n\t\t\tif ( handle.tag === 'helper' ) {\n\n\t\t\t\thandle.visible = false;\n\n\t\t\t\tif ( handle.name === 'AXIS' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.visible = !! this.axis;\n\n\t\t\t\t\tif ( this.axis === 'X' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, 0, 0 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'Y' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, 0, Math.PI / 2 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'Z' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, Math.PI / 2, 0 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'XYZE' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, Math.PI / 2, 0 ) );\n\t\t\t\t\t\t_alignVector.copy( this.rotationAxis );\n\t\t\t\t\t\thandle.quaternion.setFromRotationMatrix( _lookAtMatrix.lookAt( _zeroVector, _alignVector, _unitY ) );\n\t\t\t\t\t\thandle.quaternion.multiply( _tempQuaternion );\n\t\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'E' ) {\n\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else if ( handle.name === 'START' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else if ( handle.name === 'END' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPosition );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else if ( handle.name === 'DELTA' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.quaternion.copy( this.worldQuaternionStart );\n\t\t\t\t\t_tempVector.set( 1e-10, 1e-10, 1e-10 ).add( this.worldPositionStart ).sub( this.worldPosition ).multiplyScalar( - 1 );\n\t\t\t\t\t_tempVector.applyQuaternion( this.worldQuaternionStart.clone().invert() );\n\t\t\t\t\thandle.scale.copy( _tempVector );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thandle.quaternion.copy( quaternion );\n\n\t\t\t\t\tif ( this.dragging ) {\n\n\t\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\thandle.position.copy( this.worldPosition );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis ) {\n\n\t\t\t\t\t\thandle.visible = this.axis.search( handle.name ) !== - 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// If updating helper, skip rest of the loop\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// Align handles to current local or world rotation\n\n\t\t\thandle.quaternion.copy( quaternion );\n\n\t\t\tif ( this.mode === 'translate' || this.mode === 'scale' ) {\n\n\t\t\t\t// Hide translate and scale axis facing the camera\n\n\t\t\t\tconst AXIS_HIDE_TRESHOLD = 0.99;\n\t\t\t\tconst PLANE_HIDE_TRESHOLD = 0.2;\n\n\t\t\t\tif ( handle.name === 'X' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Y' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Z' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'XY' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_TRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'YZ' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_TRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'XZ' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_TRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( this.mode === 'rotate' ) {\n\n\t\t\t\t// Align handles to current local or world rotation\n\n\t\t\t\t_tempQuaternion2.copy( quaternion );\n\t\t\t\t_alignVector.copy( this.eye ).applyQuaternion( _tempQuaternion.copy( quaternion ).invert() );\n\n\t\t\t\tif ( handle.name.search( 'E' ) !== - 1 ) {\n\n\t\t\t\t\thandle.quaternion.setFromRotationMatrix( _lookAtMatrix.lookAt( this.eye, _zeroVector, _unitY ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'X' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitX, Math.atan2( - _alignVector.y, _alignVector.z ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Y' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitY, Math.atan2( _alignVector.x, _alignVector.z ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Z' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitZ, Math.atan2( _alignVector.y, _alignVector.x ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Hide disabled axes\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'X' ) === - 1 || this.showX );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'Y' ) === - 1 || this.showY );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'Z' ) === - 1 || this.showZ );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'E' ) === - 1 || ( this.showX && this.showY && this.showZ ) );\n\n\t\t\t// highlight selected axis\n\n\t\t\thandle.material._color = handle.material._color || handle.material.color.clone();\n\t\t\thandle.material._opacity = handle.material._opacity || handle.material.opacity;\n\n\t\t\thandle.material.color.copy( handle.material._color );\n\t\t\thandle.material.opacity = handle.material._opacity;\n\n\t\t\tif ( this.enabled && this.axis ) {\n\n\t\t\t\tif ( handle.name === this.axis ) {\n\n\t\t\t\t\thandle.material.color.setHex( 0xffff00 );\n\t\t\t\t\thandle.material.opacity = 1.0;\n\n\t\t\t\t} else if ( this.axis.split( '' ).some( function ( a ) {\n\n\t\t\t\t\treturn handle.name === a;\n\n\t\t\t\t} ) ) {\n\n\t\t\t\t\thandle.material.color.setHex( 0xffff00 );\n\t\t\t\t\thandle.material.opacity = 1.0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nTransformControlsGizmo.prototype.isTransformControlsGizmo = true;\n\n//\n\nclass TransformControlsPlane extends Mesh {\n\n\tconstructor() {\n\n\t\tsuper(\n\t\t\tnew PlaneGeometry( 100000, 100000, 2, 2 ),\n\t\t\tnew MeshBasicMaterial( { visible: false, wireframe: true, side: DoubleSide, transparent: true, opacity: 0.1, toneMapped: false } )\n\t\t);\n\n\t\tthis.type = 'TransformControlsPlane';\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tlet space = this.space;\n\n\t\tthis.position.copy( this.worldPosition );\n\n\t\tif ( this.mode === 'scale' ) space = 'local'; // scale always oriented to local rotation\n\n\t\t_v1.copy( _unitX ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\t\t_v2.copy( _unitY ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\t\t_v3.copy( _unitZ ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\n\t\t// Align the plane for current transform mode, axis and space.\n\n\t\t_alignVector.copy( _v2 );\n\n\t\tswitch ( this.mode ) {\n\n\t\t\tcase 'translate':\n\t\t\tcase 'scale':\n\t\t\t\tswitch ( this.axis ) {\n\n\t\t\t\t\tcase 'X':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v1 );\n\t\t\t\t\t\t_dirVector.copy( _v1 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Y':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v2 );\n\t\t\t\t\t\t_dirVector.copy( _v2 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v3 );\n\t\t\t\t\t\t_dirVector.copy( _v3 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XY':\n\t\t\t\t\t\t_dirVector.copy( _v3 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'YZ':\n\t\t\t\t\t\t_dirVector.copy( _v1 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XZ':\n\t\t\t\t\t\t_alignVector.copy( _v3 );\n\t\t\t\t\t\t_dirVector.copy( _v2 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XYZ':\n\t\t\t\t\tcase 'E':\n\t\t\t\t\t\t_dirVector.set( 0, 0, 0 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase 'rotate':\n\t\t\tdefault:\n\t\t\t\t// special case for rotate\n\t\t\t\t_dirVector.set( 0, 0, 0 );\n\n\t\t}\n\n\t\tif ( _dirVector.length() === 0 ) {\n\n\t\t\t// If in rotate mode, make the plane parallel to camera\n\t\t\tthis.quaternion.copy( this.cameraQuaternion );\n\n\t\t} else {\n\n\t\t\t_tempMatrix.lookAt( _tempVector.set( 0, 0, 0 ), _dirVector, _alignVector );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( _tempMatrix );\n\n\t\t}\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nTransformControlsPlane.prototype.isTransformControlsPlane = true;\n\nexport { TransformControls, TransformControlsGizmo, TransformControlsPlane };\n","module.exports = (function () {\n 'use strict';\n\n /**\n * Sort an array using the merge sort algorithm.\n *\n * @param {function} comparatorFn The comparator function.\n * @param {array} arr The array to sort.\n * @returns {array} The sorted array.\n */\n function mergeSort(comparatorFn, arr) {\n var len = arr.length, firstHalf, secondHalf;\n if (len >= 2) {\n firstHalf = arr.slice(0, len / 2);\n secondHalf = arr.slice(len / 2, len);\n return merge(comparatorFn, mergeSort(comparatorFn, firstHalf), mergeSort(comparatorFn, secondHalf));\n } else {\n return arr.slice();\n }\n }\n\n /**\n * The merge part of the merge sort algorithm.\n *\n * @param {function} comparatorFn The comparator function.\n * @param {array} arr1 The first sorted array.\n * @param {array} arr2 The second sorted array.\n * @returns {array} The merged and sorted array.\n */\n function merge(comparatorFn, arr1, arr2) {\n var result = [], left1 = arr1.length, left2 = arr2.length;\n while (left1 > 0 && left2 > 0) {\n if (comparatorFn(arr1[0], arr2[0]) <= 0) {\n result.push(arr1.shift());\n left1--;\n } else {\n result.push(arr2.shift());\n left2--;\n }\n }\n if (left1 > 0) {\n result.push.apply(result, arr1);\n } else {\n result.push.apply(result, arr2);\n }\n return result;\n }\n\n return mergeSort;\n})();\n","module.exports = (function () {\n 'use strict';\n\n /**\n * Find the index to insert an element in array keeping the sort order.\n *\n * @param {function} comparatorFn The comparator function which sorted the array.\n * @param {array} arr The sorted array.\n * @param {object} el The element to insert.\n */\n function findInsertIndex(comparatorFn, arr, el) {\n var i, len;\n for (i = 0, len = arr.length; i < len; i++) {\n if (comparatorFn(arr[i], el) > 0) {\n break;\n }\n }\n return i;\n }\n\n return findInsertIndex;\n})();\n","var mergeSort, findInsertIndex;\nmergeSort = require('mergesort');\nfindInsertIndex = require('find-insert-index');\n\nmodule.exports = (function () {\n 'use strict';\n\n var walkStrategies;\n\n walkStrategies = {};\n\n function k(result) {\n return function () {\n return result;\n };\n }\n\n function TreeModel(config) {\n config = config || {};\n this.config = config;\n this.config.childrenPropertyName = config.childrenPropertyName || 'children';\n this.config.modelComparatorFn = config.modelComparatorFn;\n }\n\n function addChildToNode(node, child) {\n child.parent = node;\n node.children.push(child);\n return child;\n }\n\n function Node(config, model) {\n this.config = config;\n this.model = model;\n this.children = [];\n }\n\n TreeModel.prototype.parse = function (model) {\n var i, childCount, node;\n\n if (!(model instanceof Object)) {\n throw new TypeError('Model must be of type object.');\n }\n\n node = new Node(this.config, model);\n if (model[this.config.childrenPropertyName] instanceof Array) {\n if (this.config.modelComparatorFn) {\n model[this.config.childrenPropertyName] = mergeSort(\n this.config.modelComparatorFn,\n model[this.config.childrenPropertyName]);\n }\n for (i = 0, childCount = model[this.config.childrenPropertyName].length; i < childCount; i++) {\n addChildToNode(node, this.parse(model[this.config.childrenPropertyName][i]));\n }\n }\n return node;\n };\n\n function hasComparatorFunction(node) {\n return typeof node.config.modelComparatorFn === 'function';\n }\n\n Node.prototype.isRoot = function () {\n return this.parent === undefined;\n };\n\n Node.prototype.hasChildren = function () {\n return this.children.length > 0;\n };\n\n function addChild(self, child, insertIndex) {\n var index;\n\n if (!(child instanceof Node)) {\n throw new TypeError('Child must be of type Node.');\n }\n\n child.parent = self;\n if (!(self.model[self.config.childrenPropertyName] instanceof Array)) {\n self.model[self.config.childrenPropertyName] = [];\n }\n\n if (hasComparatorFunction(self)) {\n // Find the index to insert the child\n index = findInsertIndex(\n self.config.modelComparatorFn,\n self.model[self.config.childrenPropertyName],\n child.model);\n\n // Add to the model children\n self.model[self.config.childrenPropertyName].splice(index, 0, child.model);\n\n // Add to the node children\n self.children.splice(index, 0, child);\n } else {\n if (insertIndex === undefined) {\n self.model[self.config.childrenPropertyName].push(child.model);\n self.children.push(child);\n } else {\n if (insertIndex < 0 || insertIndex > self.children.length) {\n throw new Error('Invalid index.');\n }\n self.model[self.config.childrenPropertyName].splice(insertIndex, 0, child.model);\n self.children.splice(insertIndex, 0, child);\n }\n }\n return child;\n }\n\n Node.prototype.addChild = function (child) {\n return addChild(this, child);\n };\n\n Node.prototype.addChildAtIndex = function (child, index) {\n if (hasComparatorFunction(this)) {\n throw new Error('Cannot add child at index when using a comparator function.');\n }\n\n return addChild(this, child, index);\n };\n\n Node.prototype.setIndex = function (index) {\n if (hasComparatorFunction(this)) {\n throw new Error('Cannot set node index when using a comparator function.');\n }\n\n if (this.isRoot()) {\n if (index === 0) {\n return this;\n }\n throw new Error('Invalid index.');\n }\n\n if (index < 0 || index >= this.parent.children.length) {\n throw new Error('Invalid index.');\n }\n\n var oldIndex = this.parent.children.indexOf(this);\n\n this.parent.children.splice(index, 0, this.parent.children.splice(oldIndex, 1)[0]);\n\n this.parent.model[this.parent.config.childrenPropertyName]\n .splice(index, 0, this.parent.model[this.parent.config.childrenPropertyName].splice(oldIndex, 1)[0]);\n\n return this;\n };\n\n Node.prototype.getPath = function () {\n var path = [];\n (function addToPath(node) {\n path.unshift(node);\n if (!node.isRoot()) {\n addToPath(node.parent);\n }\n })(this);\n return path;\n };\n\n Node.prototype.getIndex = function () {\n if (this.isRoot()) {\n return 0;\n }\n return this.parent.children.indexOf(this);\n };\n\n /**\n * Parse the arguments of traversal functions. These functions can take one optional\n * first argument which is an options object. If present, this object will be stored\n * in args.options. The only mandatory argument is the callback function which can\n * appear in the first or second position (if an options object is given). This\n * function will be saved to args.fn. The last optional argument is the context on\n * which the callback function will be called. It will be available in args.ctx.\n *\n * @returns Parsed arguments.\n */\n function parseArgs() {\n var args = {};\n if (arguments.length === 1) {\n if (typeof arguments[0] === 'function') {\n args.fn = arguments[0];\n } else {\n args.options = arguments[0];\n }\n } else if (arguments.length === 2) {\n if (typeof arguments[0] === 'function') {\n args.fn = arguments[0];\n args.ctx = arguments[1];\n } else {\n args.options = arguments[0];\n args.fn = arguments[1];\n }\n } else {\n args.options = arguments[0];\n args.fn = arguments[1];\n args.ctx = arguments[2];\n }\n args.options = args.options || {};\n if (!args.options.strategy) {\n args.options.strategy = 'pre';\n }\n if (!walkStrategies[args.options.strategy]) {\n throw new Error('Unknown tree walk strategy. Valid strategies are \\'pre\\' [default], \\'post\\' and \\'breadth\\'.');\n }\n return args;\n }\n\n Node.prototype.walk = function () {\n var args;\n args = parseArgs.apply(this, arguments);\n walkStrategies[args.options.strategy].call(this, args.fn, args.ctx);\n };\n\n walkStrategies.pre = function depthFirstPreOrder(callback, context) {\n var i, childCount, keepGoing;\n keepGoing = callback.call(context, this);\n for (i = 0, childCount = this.children.length; i < childCount; i++) {\n if (keepGoing === false) {\n return false;\n }\n keepGoing = depthFirstPreOrder.call(this.children[i], callback, context);\n }\n return keepGoing;\n };\n\n walkStrategies.post = function depthFirstPostOrder(callback, context) {\n var i, childCount, keepGoing;\n for (i = 0, childCount = this.children.length; i < childCount; i++) {\n keepGoing = depthFirstPostOrder.call(this.children[i], callback, context);\n if (keepGoing === false) {\n return false;\n }\n }\n keepGoing = callback.call(context, this);\n return keepGoing;\n };\n\n walkStrategies.breadth = function breadthFirst(callback, context) {\n var queue = [this];\n (function processQueue() {\n var i, childCount, node;\n if (queue.length === 0) {\n return;\n }\n node = queue.shift();\n for (i = 0, childCount = node.children.length; i < childCount; i++) {\n queue.push(node.children[i]);\n }\n if (callback.call(context, node) !== false) {\n processQueue();\n }\n })();\n };\n\n Node.prototype.all = function () {\n var args, all = [];\n args = parseArgs.apply(this, arguments);\n args.fn = args.fn || k(true);\n walkStrategies[args.options.strategy].call(this, function (node) {\n if (args.fn.call(args.ctx, node)) {\n all.push(node);\n }\n }, args.ctx);\n return all;\n };\n\n Node.prototype.first = function () {\n var args, first;\n args = parseArgs.apply(this, arguments);\n args.fn = args.fn || k(true);\n walkStrategies[args.options.strategy].call(this, function (node) {\n if (args.fn.call(args.ctx, node)) {\n first = node;\n return false;\n }\n }, args.ctx);\n return first;\n };\n\n Node.prototype.drop = function () {\n var indexOfChild;\n if (!this.isRoot()) {\n indexOfChild = this.parent.children.indexOf(this);\n this.parent.children.splice(indexOfChild, 1);\n this.parent.model[this.config.childrenPropertyName].splice(indexOfChild, 1);\n this.parent = undefined;\n delete this.parent;\n }\n return this;\n };\n\n return TreeModel;\n})();\n","// Current version.\nexport var VERSION = '1.13.6';\n\n// Establish the root object, `window` (`self`) in the browser, `global`\n// on the server, or `this` in some virtual machines. We use `self`\n// instead of `window` for `WebWorker` support.\nexport var root = (typeof self == 'object' && self.self === self && self) ||\n (typeof global == 'object' && global.global === global && global) ||\n Function('return this')() ||\n {};\n\n// Save bytes in the minified (but not gzipped) version:\nexport var ArrayProto = Array.prototype, ObjProto = Object.prototype;\nexport var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;\n\n// Create quick reference variables for speed access to core prototypes.\nexport var push = ArrayProto.push,\n slice = ArrayProto.slice,\n toString = ObjProto.toString,\n hasOwnProperty = ObjProto.hasOwnProperty;\n\n// Modern feature detection.\nexport var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',\n supportsDataView = typeof DataView !== 'undefined';\n\n// All **ECMAScript 5+** native function implementations that we hope to use\n// are declared here.\nexport var nativeIsArray = Array.isArray,\n nativeKeys = Object.keys,\n nativeCreate = Object.create,\n nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;\n\n// Create references to these builtin functions because we override them.\nexport var _isNaN = isNaN,\n _isFinite = isFinite;\n\n// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\nexport var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\nexport var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n// The largest integer that can be represented exactly.\nexport var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n","// Some functions take a variable number of arguments, or a few expected\n// arguments at the beginning and then a variable number of values to operate\n// on. This helper accumulates all remaining arguments past the function’s\n// argument length (or an explicit `startIndex`), into an array that becomes\n// the last argument. Similar to ES6’s \"rest parameter\".\nexport default function restArguments(func, startIndex) {\n startIndex = startIndex == null ? func.length - 1 : +startIndex;\n return function() {\n var length = Math.max(arguments.length - startIndex, 0),\n rest = Array(length),\n index = 0;\n for (; index < length; index++) {\n rest[index] = arguments[index + startIndex];\n }\n switch (startIndex) {\n case 0: return func.call(this, rest);\n case 1: return func.call(this, arguments[0], rest);\n case 2: return func.call(this, arguments[0], arguments[1], rest);\n }\n var args = Array(startIndex + 1);\n for (index = 0; index < startIndex; index++) {\n args[index] = arguments[index];\n }\n args[startIndex] = rest;\n return func.apply(this, args);\n };\n}\n","// Is a given variable an object?\nexport default function isObject(obj) {\n var type = typeof obj;\n return type === 'function' || (type === 'object' && !!obj);\n}\n","// Is a given value equal to null?\nexport default function isNull(obj) {\n return obj === null;\n}\n","// Is a given variable undefined?\nexport default function isUndefined(obj) {\n return obj === void 0;\n}\n","import { toString } from './_setup.js';\n\n// Is a given value a boolean?\nexport default function isBoolean(obj) {\n return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n}\n","// Is a given value a DOM element?\nexport default function isElement(obj) {\n return !!(obj && obj.nodeType === 1);\n}\n","import { toString } from './_setup.js';\n\n// Internal function for creating a `toString`-based type tester.\nexport default function tagTester(name) {\n var tag = '[object ' + name + ']';\n return function(obj) {\n return toString.call(obj) === tag;\n };\n}\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('String');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Number');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Date');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('RegExp');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Error');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Symbol');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('ArrayBuffer');\n","import tagTester from './_tagTester.js';\nimport { root } from './_setup.js';\n\nvar isFunction = tagTester('Function');\n\n// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old\n// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).\nvar nodelist = root.document && root.document.childNodes;\nif (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {\n isFunction = function(obj) {\n return typeof obj == 'function' || false;\n };\n}\n\nexport default isFunction;\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Object');\n","import { supportsDataView } from './_setup.js';\nimport hasObjectTag from './_hasObjectTag.js';\n\n// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.\n// In IE 11, the most common among them, this problem also applies to\n// `Map`, `WeakMap` and `Set`.\nexport var hasStringTagBug = (\n supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))\n ),\n isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));\n","import tagTester from './_tagTester.js';\nimport isFunction from './isFunction.js';\nimport isArrayBuffer from './isArrayBuffer.js';\nimport { hasStringTagBug } from './_stringTagBug.js';\n\nvar isDataView = tagTester('DataView');\n\n// In IE 10 - Edge 13, we need a different heuristic\n// to determine whether an object is a `DataView`.\nfunction ie10IsDataView(obj) {\n return obj != null && isFunction(obj.getInt8) && isArrayBuffer(obj.buffer);\n}\n\nexport default (hasStringTagBug ? ie10IsDataView : isDataView);\n","import { nativeIsArray } from './_setup.js';\nimport tagTester from './_tagTester.js';\n\n// Is a given value an array?\n// Delegates to ECMA5's native `Array.isArray`.\nexport default nativeIsArray || tagTester('Array');\n","import { hasOwnProperty } from './_setup.js';\n\n// Internal function to check whether `key` is an own property name of `obj`.\nexport default function has(obj, key) {\n return obj != null && hasOwnProperty.call(obj, key);\n}\n","import tagTester from './_tagTester.js';\nimport has from './_has.js';\n\nvar isArguments = tagTester('Arguments');\n\n// Define a fallback version of the method in browsers (ahem, IE < 9), where\n// there isn't any inspectable \"Arguments\" type.\n(function() {\n if (!isArguments(arguments)) {\n isArguments = function(obj) {\n return has(obj, 'callee');\n };\n }\n}());\n\nexport default isArguments;\n","import { _isFinite } from './_setup.js';\nimport isSymbol from './isSymbol.js';\n\n// Is a given object a finite number?\nexport default function isFinite(obj) {\n return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));\n}\n","import { _isNaN } from './_setup.js';\nimport isNumber from './isNumber.js';\n\n// Is the given value `NaN`?\nexport default function isNaN(obj) {\n return isNumber(obj) && _isNaN(obj);\n}\n","// Predicate-generating function. Often useful outside of Underscore.\nexport default function constant(value) {\n return function() {\n return value;\n };\n}\n","import { MAX_ARRAY_INDEX } from './_setup.js';\n\n// Common internal logic for `isArrayLike` and `isBufferLike`.\nexport default function createSizePropertyCheck(getSizeProperty) {\n return function(collection) {\n var sizeProperty = getSizeProperty(collection);\n return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;\n }\n}\n","// Internal helper to generate a function to obtain property `key` from `obj`.\nexport default function shallowProperty(key) {\n return function(obj) {\n return obj == null ? void 0 : obj[key];\n };\n}\n","import shallowProperty from './_shallowProperty.js';\n\n// Internal helper to obtain the `byteLength` property of an object.\nexport default shallowProperty('byteLength');\n","import createSizePropertyCheck from './_createSizePropertyCheck.js';\nimport getByteLength from './_getByteLength.js';\n\n// Internal helper to determine whether we should spend extensive checks against\n// `ArrayBuffer` et al.\nexport default createSizePropertyCheck(getByteLength);\n","import { supportsArrayBuffer, nativeIsView, toString } from './_setup.js';\nimport isDataView from './isDataView.js';\nimport constant from './constant.js';\nimport isBufferLike from './_isBufferLike.js';\n\n// Is a given value a typed array?\nvar typedArrayPattern = /\\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\\]/;\nfunction isTypedArray(obj) {\n // `ArrayBuffer.isView` is the most future-proof, so use it when available.\n // Otherwise, fall back on the above regular expression.\n return nativeIsView ? (nativeIsView(obj) && !isDataView(obj)) :\n isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));\n}\n\nexport default supportsArrayBuffer ? isTypedArray : constant(false);\n","import shallowProperty from './_shallowProperty.js';\n\n// Internal helper to obtain the `length` property of an object.\nexport default shallowProperty('length');\n","import { nonEnumerableProps, ObjProto } from './_setup.js';\nimport isFunction from './isFunction.js';\nimport has from './_has.js';\n\n// Internal helper to create a simple lookup structure.\n// `collectNonEnumProps` used to depend on `_.contains`, but this led to\n// circular imports. `emulatedSet` is a one-off solution that only works for\n// arrays of strings.\nfunction emulatedSet(keys) {\n var hash = {};\n for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;\n return {\n contains: function(key) { return hash[key] === true; },\n push: function(key) {\n hash[key] = true;\n return keys.push(key);\n }\n };\n}\n\n// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't\n// be iterated by `for key in ...` and thus missed. Extends `keys` in place if\n// needed.\nexport default function collectNonEnumProps(obj, keys) {\n keys = emulatedSet(keys);\n var nonEnumIdx = nonEnumerableProps.length;\n var constructor = obj.constructor;\n var proto = (isFunction(constructor) && constructor.prototype) || ObjProto;\n\n // Constructor is a special case.\n var prop = 'constructor';\n if (has(obj, prop) && !keys.contains(prop)) keys.push(prop);\n\n while (nonEnumIdx--) {\n prop = nonEnumerableProps[nonEnumIdx];\n if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {\n keys.push(prop);\n }\n }\n}\n","import isObject from './isObject.js';\nimport { nativeKeys, hasEnumBug } from './_setup.js';\nimport has from './_has.js';\nimport collectNonEnumProps from './_collectNonEnumProps.js';\n\n// Retrieve the names of an object's own properties.\n// Delegates to **ECMAScript 5**'s native `Object.keys`.\nexport default function keys(obj) {\n if (!isObject(obj)) return [];\n if (nativeKeys) return nativeKeys(obj);\n var keys = [];\n for (var key in obj) if (has(obj, key)) keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, keys);\n return keys;\n}\n","import getLength from './_getLength.js';\nimport isArray from './isArray.js';\nimport isString from './isString.js';\nimport isArguments from './isArguments.js';\nimport keys from './keys.js';\n\n// Is a given array, string, or object empty?\n// An \"empty\" object has no enumerable own-properties.\nexport default function isEmpty(obj) {\n if (obj == null) return true;\n // Skip the more expensive `toString`-based type checks if `obj` has no\n // `.length`.\n var length = getLength(obj);\n if (typeof length == 'number' && (\n isArray(obj) || isString(obj) || isArguments(obj)\n )) return length === 0;\n return getLength(keys(obj)) === 0;\n}\n","import keys from './keys.js';\n\n// Returns whether an object has a given set of `key:value` pairs.\nexport default function isMatch(object, attrs) {\n var _keys = keys(attrs), length = _keys.length;\n if (object == null) return !length;\n var obj = Object(object);\n for (var i = 0; i < length; i++) {\n var key = _keys[i];\n if (attrs[key] !== obj[key] || !(key in obj)) return false;\n }\n return true;\n}\n","import { VERSION } from './_setup.js';\n\n// If Underscore is called as a function, it returns a wrapped object that can\n// be used OO-style. This wrapper holds altered versions of all functions added\n// through `_.mixin`. Wrapped objects may be chained.\nexport default function _(obj) {\n if (obj instanceof _) return obj;\n if (!(this instanceof _)) return new _(obj);\n this._wrapped = obj;\n}\n\n_.VERSION = VERSION;\n\n// Extracts the result from a wrapped and chained object.\n_.prototype.value = function() {\n return this._wrapped;\n};\n\n// Provide unwrapping proxies for some methods used in engine operations\n// such as arithmetic and JSON stringification.\n_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n_.prototype.toString = function() {\n return String(this._wrapped);\n};\n","import getByteLength from './_getByteLength.js';\n\n// Internal function to wrap or shallow-copy an ArrayBuffer,\n// typed array or DataView to a new view, reusing the buffer.\nexport default function toBufferView(bufferSource) {\n return new Uint8Array(\n bufferSource.buffer || bufferSource,\n bufferSource.byteOffset || 0,\n getByteLength(bufferSource)\n );\n}\n","import _ from './underscore.js';\nimport { toString, SymbolProto } from './_setup.js';\nimport getByteLength from './_getByteLength.js';\nimport isTypedArray from './isTypedArray.js';\nimport isFunction from './isFunction.js';\nimport { hasStringTagBug } from './_stringTagBug.js';\nimport isDataView from './isDataView.js';\nimport keys from './keys.js';\nimport has from './_has.js';\nimport toBufferView from './_toBufferView.js';\n\n// We use this string twice, so give it a name for minification.\nvar tagDataView = '[object DataView]';\n\n// Internal recursive comparison function for `_.isEqual`.\nfunction eq(a, b, aStack, bStack) {\n // Identical objects are equal. `0 === -0`, but they aren't identical.\n // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n if (a === b) return a !== 0 || 1 / a === 1 / b;\n // `null` or `undefined` only equal to itself (strict comparison).\n if (a == null || b == null) return false;\n // `NaN`s are equivalent, but non-reflexive.\n if (a !== a) return b !== b;\n // Exhaust primitive checks\n var type = typeof a;\n if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;\n return deepEq(a, b, aStack, bStack);\n}\n\n// Internal recursive comparison function for `_.isEqual`.\nfunction deepEq(a, b, aStack, bStack) {\n // Unwrap any wrapped objects.\n if (a instanceof _) a = a._wrapped;\n if (b instanceof _) b = b._wrapped;\n // Compare `[[Class]]` names.\n var className = toString.call(a);\n if (className !== toString.call(b)) return false;\n // Work around a bug in IE 10 - Edge 13.\n if (hasStringTagBug && className == '[object Object]' && isDataView(a)) {\n if (!isDataView(b)) return false;\n className = tagDataView;\n }\n switch (className) {\n // These types are compared by value.\n case '[object RegExp]':\n // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n case '[object String]':\n // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n // equivalent to `new String(\"5\")`.\n return '' + a === '' + b;\n case '[object Number]':\n // `NaN`s are equivalent, but non-reflexive.\n // Object(NaN) is equivalent to NaN.\n if (+a !== +a) return +b !== +b;\n // An `egal` comparison is performed for other numeric values.\n return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n case '[object Date]':\n case '[object Boolean]':\n // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n // millisecond representations. Note that invalid dates with millisecond representations\n // of `NaN` are not equivalent.\n return +a === +b;\n case '[object Symbol]':\n return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);\n case '[object ArrayBuffer]':\n case tagDataView:\n // Coerce to typed array so we can fall through.\n return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);\n }\n\n var areArrays = className === '[object Array]';\n if (!areArrays && isTypedArray(a)) {\n var byteLength = getByteLength(a);\n if (byteLength !== getByteLength(b)) return false;\n if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;\n areArrays = true;\n }\n if (!areArrays) {\n if (typeof a != 'object' || typeof b != 'object') return false;\n\n // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n // from different frames are.\n var aCtor = a.constructor, bCtor = b.constructor;\n if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&\n isFunction(bCtor) && bCtor instanceof bCtor)\n && ('constructor' in a && 'constructor' in b)) {\n return false;\n }\n }\n // Assume equality for cyclic structures. The algorithm for detecting cyclic\n // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n // Initializing stack of traversed objects.\n // It's done here since we only need them for objects and arrays comparison.\n aStack = aStack || [];\n bStack = bStack || [];\n var length = aStack.length;\n while (length--) {\n // Linear search. Performance is inversely proportional to the number of\n // unique nested structures.\n if (aStack[length] === a) return bStack[length] === b;\n }\n\n // Add the first object to the stack of traversed objects.\n aStack.push(a);\n bStack.push(b);\n\n // Recursively compare objects and arrays.\n if (areArrays) {\n // Compare array lengths to determine if a deep comparison is necessary.\n length = a.length;\n if (length !== b.length) return false;\n // Deep compare the contents, ignoring non-numeric properties.\n while (length--) {\n if (!eq(a[length], b[length], aStack, bStack)) return false;\n }\n } else {\n // Deep compare objects.\n var _keys = keys(a), key;\n length = _keys.length;\n // Ensure that both objects contain the same number of properties before comparing deep equality.\n if (keys(b).length !== length) return false;\n while (length--) {\n // Deep compare each member\n key = _keys[length];\n if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n }\n }\n // Remove the first object from the stack of traversed objects.\n aStack.pop();\n bStack.pop();\n return true;\n}\n\n// Perform a deep comparison to check if two objects are equal.\nexport default function isEqual(a, b) {\n return eq(a, b);\n}\n","import isObject from './isObject.js';\nimport { hasEnumBug } from './_setup.js';\nimport collectNonEnumProps from './_collectNonEnumProps.js';\n\n// Retrieve all the enumerable property names of an object.\nexport default function allKeys(obj) {\n if (!isObject(obj)) return [];\n var keys = [];\n for (var key in obj) keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, keys);\n return keys;\n}\n","import getLength from './_getLength.js';\nimport isFunction from './isFunction.js';\nimport allKeys from './allKeys.js';\n\n// Since the regular `Object.prototype.toString` type tests don't work for\n// some types in IE 11, we use a fingerprinting heuristic instead, based\n// on the methods. It's not great, but it's the best we got.\n// The fingerprint method lists are defined below.\nexport function ie11fingerprint(methods) {\n var length = getLength(methods);\n return function(obj) {\n if (obj == null) return false;\n // `Map`, `WeakMap` and `Set` have no enumerable keys.\n var keys = allKeys(obj);\n if (getLength(keys)) return false;\n for (var i = 0; i < length; i++) {\n if (!isFunction(obj[methods[i]])) return false;\n }\n // If we are testing against `WeakMap`, we need to ensure that\n // `obj` doesn't have a `forEach` method in order to distinguish\n // it from a regular `Map`.\n return methods !== weakMapMethods || !isFunction(obj[forEachName]);\n };\n}\n\n// In the interest of compact minification, we write\n// each string in the fingerprints only once.\nvar forEachName = 'forEach',\n hasName = 'has',\n commonInit = ['clear', 'delete'],\n mapTail = ['get', hasName, 'set'];\n\n// `Map`, `WeakMap` and `Set` each have slightly different\n// combinations of the above sublists.\nexport var mapMethods = commonInit.concat(forEachName, mapTail),\n weakMapMethods = commonInit.concat(mapTail),\n setMethods = ['add'].concat(commonInit, forEachName, hasName);\n","import tagTester from './_tagTester.js';\nimport { isIE11 } from './_stringTagBug.js';\nimport { ie11fingerprint, mapMethods } from './_methodFingerprint.js';\n\nexport default isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');\n","import tagTester from './_tagTester.js';\nimport { isIE11 } from './_stringTagBug.js';\nimport { ie11fingerprint, weakMapMethods } from './_methodFingerprint.js';\n\nexport default isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');\n","import tagTester from './_tagTester.js';\nimport { isIE11 } from './_stringTagBug.js';\nimport { ie11fingerprint, setMethods } from './_methodFingerprint.js';\n\nexport default isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('WeakSet');\n","import keys from './keys.js';\n\n// Retrieve the values of an object's properties.\nexport default function values(obj) {\n var _keys = keys(obj);\n var length = _keys.length;\n var values = Array(length);\n for (var i = 0; i < length; i++) {\n values[i] = obj[_keys[i]];\n }\n return values;\n}\n","import keys from './keys.js';\n\n// Convert an object into a list of `[key, value]` pairs.\n// The opposite of `_.object` with one argument.\nexport default function pairs(obj) {\n var _keys = keys(obj);\n var length = _keys.length;\n var pairs = Array(length);\n for (var i = 0; i < length; i++) {\n pairs[i] = [_keys[i], obj[_keys[i]]];\n }\n return pairs;\n}\n","import keys from './keys.js';\n\n// Invert the keys and values of an object. The values must be serializable.\nexport default function invert(obj) {\n var result = {};\n var _keys = keys(obj);\n for (var i = 0, length = _keys.length; i < length; i++) {\n result[obj[_keys[i]]] = _keys[i];\n }\n return result;\n}\n","import isFunction from './isFunction.js';\n\n// Return a sorted list of the function names available on the object.\nexport default function functions(obj) {\n var names = [];\n for (var key in obj) {\n if (isFunction(obj[key])) names.push(key);\n }\n return names.sort();\n}\n","// An internal function for creating assigner functions.\nexport default function createAssigner(keysFunc, defaults) {\n return function(obj) {\n var length = arguments.length;\n if (defaults) obj = Object(obj);\n if (length < 2 || obj == null) return obj;\n for (var index = 1; index < length; index++) {\n var source = arguments[index],\n keys = keysFunc(source),\n l = keys.length;\n for (var i = 0; i < l; i++) {\n var key = keys[i];\n if (!defaults || obj[key] === void 0) obj[key] = source[key];\n }\n }\n return obj;\n };\n}\n","import createAssigner from './_createAssigner.js';\nimport allKeys from './allKeys.js';\n\n// Extend a given object with all the properties in passed-in object(s).\nexport default createAssigner(allKeys);\n","import createAssigner from './_createAssigner.js';\nimport keys from './keys.js';\n\n// Assigns a given object with all the own properties in the passed-in\n// object(s).\n// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\nexport default createAssigner(keys);\n","import createAssigner from './_createAssigner.js';\nimport allKeys from './allKeys.js';\n\n// Fill in a given object with default properties.\nexport default createAssigner(allKeys, true);\n","import isObject from './isObject.js';\nimport { nativeCreate } from './_setup.js';\n\n// Create a naked function reference for surrogate-prototype-swapping.\nfunction ctor() {\n return function(){};\n}\n\n// An internal function for creating a new object that inherits from another.\nexport default function baseCreate(prototype) {\n if (!isObject(prototype)) return {};\n if (nativeCreate) return nativeCreate(prototype);\n var Ctor = ctor();\n Ctor.prototype = prototype;\n var result = new Ctor;\n Ctor.prototype = null;\n return result;\n}\n","import baseCreate from './_baseCreate.js';\nimport extendOwn from './extendOwn.js';\n\n// Creates an object that inherits from the given prototype object.\n// If additional properties are provided then they will be added to the\n// created object.\nexport default function create(prototype, props) {\n var result = baseCreate(prototype);\n if (props) extendOwn(result, props);\n return result;\n}\n","import isObject from './isObject.js';\nimport isArray from './isArray.js';\nimport extend from './extend.js';\n\n// Create a (shallow-cloned) duplicate of an object.\nexport default function clone(obj) {\n if (!isObject(obj)) return obj;\n return isArray(obj) ? obj.slice() : extend({}, obj);\n}\n","// Invokes `interceptor` with the `obj` and then returns `obj`.\n// The primary purpose of this method is to \"tap into\" a method chain, in\n// order to perform operations on intermediate results within the chain.\nexport default function tap(obj, interceptor) {\n interceptor(obj);\n return obj;\n}\n","import _ from './underscore.js';\nimport isArray from './isArray.js';\n\n// Normalize a (deep) property `path` to array.\n// Like `_.iteratee`, this function can be customized.\nexport default function toPath(path) {\n return isArray(path) ? path : [path];\n}\n_.toPath = toPath;\n","import _ from './underscore.js';\nimport './toPath.js';\n\n// Internal wrapper for `_.toPath` to enable minification.\n// Similar to `cb` for `_.iteratee`.\nexport default function toPath(path) {\n return _.toPath(path);\n}\n","// Internal function to obtain a nested property in `obj` along `path`.\nexport default function deepGet(obj, path) {\n var length = path.length;\n for (var i = 0; i < length; i++) {\n if (obj == null) return void 0;\n obj = obj[path[i]];\n }\n return length ? obj : void 0;\n}\n","import toPath from './_toPath.js';\nimport deepGet from './_deepGet.js';\nimport isUndefined from './isUndefined.js';\n\n// Get the value of the (deep) property on `path` from `object`.\n// If any property in `path` does not exist or if the value is\n// `undefined`, return `defaultValue` instead.\n// The `path` is normalized through `_.toPath`.\nexport default function get(object, path, defaultValue) {\n var value = deepGet(object, toPath(path));\n return isUndefined(value) ? defaultValue : value;\n}\n","import _has from './_has.js';\nimport toPath from './_toPath.js';\n\n// Shortcut function for checking if an object has a given property directly on\n// itself (in other words, not on a prototype). Unlike the internal `has`\n// function, this public version can also traverse nested properties.\nexport default function has(obj, path) {\n path = toPath(path);\n var length = path.length;\n for (var i = 0; i < length; i++) {\n var key = path[i];\n if (!_has(obj, key)) return false;\n obj = obj[key];\n }\n return !!length;\n}\n","// Keep the identity function around for default iteratees.\nexport default function identity(value) {\n return value;\n}\n","import extendOwn from './extendOwn.js';\nimport isMatch from './isMatch.js';\n\n// Returns a predicate for checking whether an object has a given set of\n// `key:value` pairs.\nexport default function matcher(attrs) {\n attrs = extendOwn({}, attrs);\n return function(obj) {\n return isMatch(obj, attrs);\n };\n}\n","import deepGet from './_deepGet.js';\nimport toPath from './_toPath.js';\n\n// Creates a function that, when passed an object, will traverse that object’s\n// properties down the given `path`, specified as an array of keys or indices.\nexport default function property(path) {\n path = toPath(path);\n return function(obj) {\n return deepGet(obj, path);\n };\n}\n","// Internal function that returns an efficient (for current engines) version\n// of the passed-in callback, to be repeatedly applied in other Underscore\n// functions.\nexport default function optimizeCb(func, context, argCount) {\n if (context === void 0) return func;\n switch (argCount == null ? 3 : argCount) {\n case 1: return function(value) {\n return func.call(context, value);\n };\n // The 2-argument case is omitted because we’re not using it.\n case 3: return function(value, index, collection) {\n return func.call(context, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(context, accumulator, value, index, collection);\n };\n }\n return function() {\n return func.apply(context, arguments);\n };\n}\n","import identity from './identity.js';\nimport isFunction from './isFunction.js';\nimport isObject from './isObject.js';\nimport isArray from './isArray.js';\nimport matcher from './matcher.js';\nimport property from './property.js';\nimport optimizeCb from './_optimizeCb.js';\n\n// An internal function to generate callbacks that can be applied to each\n// element in a collection, returning the desired result — either `_.identity`,\n// an arbitrary callback, a property matcher, or a property accessor.\nexport default function baseIteratee(value, context, argCount) {\n if (value == null) return identity;\n if (isFunction(value)) return optimizeCb(value, context, argCount);\n if (isObject(value) && !isArray(value)) return matcher(value);\n return property(value);\n}\n","import _ from './underscore.js';\nimport baseIteratee from './_baseIteratee.js';\n\n// External wrapper for our callback generator. Users may customize\n// `_.iteratee` if they want additional predicate/iteratee shorthand styles.\n// This abstraction hides the internal-only `argCount` argument.\nexport default function iteratee(value, context) {\n return baseIteratee(value, context, Infinity);\n}\n_.iteratee = iteratee;\n","import _ from './underscore.js';\nimport baseIteratee from './_baseIteratee.js';\nimport iteratee from './iteratee.js';\n\n// The function we call internally to generate a callback. It invokes\n// `_.iteratee` if overridden, otherwise `baseIteratee`.\nexport default function cb(value, context, argCount) {\n if (_.iteratee !== iteratee) return _.iteratee(value, context);\n return baseIteratee(value, context, argCount);\n}\n","import cb from './_cb.js';\nimport keys from './keys.js';\n\n// Returns the results of applying the `iteratee` to each element of `obj`.\n// In contrast to `_.map` it returns an object.\nexport default function mapObject(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var _keys = keys(obj),\n length = _keys.length,\n results = {};\n for (var index = 0; index < length; index++) {\n var currentKey = _keys[index];\n results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n}\n","// Predicate-generating function. Often useful outside of Underscore.\nexport default function noop(){}\n","import noop from './noop.js';\nimport get from './get.js';\n\n// Generates a function for a given object that returns a given property.\nexport default function propertyOf(obj) {\n if (obj == null) return noop;\n return function(path) {\n return get(obj, path);\n };\n}\n","import optimizeCb from './_optimizeCb.js';\n\n// Run a function **n** times.\nexport default function times(n, iteratee, context) {\n var accum = Array(Math.max(0, n));\n iteratee = optimizeCb(iteratee, context, 1);\n for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n return accum;\n}\n","// Return a random integer between `min` and `max` (inclusive).\nexport default function random(min, max) {\n if (max == null) {\n max = min;\n min = 0;\n }\n return min + Math.floor(Math.random() * (max - min + 1));\n}\n","// A (possibly faster) way to get the current timestamp as an integer.\nexport default Date.now || function() {\n return new Date().getTime();\n};\n","import keys from './keys.js';\n\n// Internal helper to generate functions for escaping and unescaping strings\n// to/from HTML interpolation.\nexport default function createEscaper(map) {\n var escaper = function(match) {\n return map[match];\n };\n // Regexes for identifying a key that needs to be escaped.\n var source = '(?:' + keys(map).join('|') + ')';\n var testRegexp = RegExp(source);\n var replaceRegexp = RegExp(source, 'g');\n return function(string) {\n string = string == null ? '' : '' + string;\n return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n };\n}\n","// Internal list of HTML entities for escaping.\nexport default {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n};\n","import createEscaper from './_createEscaper.js';\nimport escapeMap from './_escapeMap.js';\n\n// Function for escaping strings to HTML interpolation.\nexport default createEscaper(escapeMap);\n","import invert from './invert.js';\nimport escapeMap from './_escapeMap.js';\n\n// Internal list of HTML entities for unescaping.\nexport default invert(escapeMap);\n","import createEscaper from './_createEscaper.js';\nimport unescapeMap from './_unescapeMap.js';\n\n// Function for unescaping strings from HTML interpolation.\nexport default createEscaper(unescapeMap);\n","import _ from './underscore.js';\n\n// By default, Underscore uses ERB-style template delimiters. Change the\n// following template settings to use alternative delimiters.\nexport default _.templateSettings = {\n evaluate: /<%([\\s\\S]+?)%>/g,\n interpolate: /<%=([\\s\\S]+?)%>/g,\n escape: /<%-([\\s\\S]+?)%>/g\n};\n","import defaults from './defaults.js';\nimport _ from './underscore.js';\nimport './templateSettings.js';\n\n// When customizing `_.templateSettings`, if you don't want to define an\n// interpolation, evaluation or escaping regex, we need one that is\n// guaranteed not to match.\nvar noMatch = /(.)^/;\n\n// Certain characters need to be escaped so that they can be put into a\n// string literal.\nvar escapes = {\n \"'\": \"'\",\n '\\\\': '\\\\',\n '\\r': 'r',\n '\\n': 'n',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n};\n\nvar escapeRegExp = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\nfunction escapeChar(match) {\n return '\\\\' + escapes[match];\n}\n\n// In order to prevent third-party code injection through\n// `_.templateSettings.variable`, we test it against the following regular\n// expression. It is intentionally a bit more liberal than just matching valid\n// identifiers, but still prevents possible loopholes through defaults or\n// destructuring assignment.\nvar bareIdentifier = /^\\s*(\\w|\\$)+\\s*$/;\n\n// JavaScript micro-templating, similar to John Resig's implementation.\n// Underscore templating handles arbitrary delimiters, preserves whitespace,\n// and correctly escapes quotes within interpolated code.\n// NB: `oldSettings` only exists for backwards compatibility.\nexport default function template(text, settings, oldSettings) {\n if (!settings && oldSettings) settings = oldSettings;\n settings = defaults({}, settings, _.templateSettings);\n\n // Combine delimiters into one regular expression via alternation.\n var matcher = RegExp([\n (settings.escape || noMatch).source,\n (settings.interpolate || noMatch).source,\n (settings.evaluate || noMatch).source\n ].join('|') + '|$', 'g');\n\n // Compile the template source, escaping string literals appropriately.\n var index = 0;\n var source = \"__p+='\";\n text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n source += text.slice(index, offset).replace(escapeRegExp, escapeChar);\n index = offset + match.length;\n\n if (escape) {\n source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n } else if (interpolate) {\n source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n } else if (evaluate) {\n source += \"';\\n\" + evaluate + \"\\n__p+='\";\n }\n\n // Adobe VMs need the match returned to produce the correct offset.\n return match;\n });\n source += \"';\\n\";\n\n var argument = settings.variable;\n if (argument) {\n // Insure against third-party code injection. (CVE-2021-23358)\n if (!bareIdentifier.test(argument)) throw new Error(\n 'variable is not a bare identifier: ' + argument\n );\n } else {\n // If a variable is not specified, place data values in local scope.\n source = 'with(obj||{}){\\n' + source + '}\\n';\n argument = 'obj';\n }\n\n source = \"var __t,__p='',__j=Array.prototype.join,\" +\n \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n source + 'return __p;\\n';\n\n var render;\n try {\n render = new Function(argument, '_', source);\n } catch (e) {\n e.source = source;\n throw e;\n }\n\n var template = function(data) {\n return render.call(this, data, _);\n };\n\n // Provide the compiled source as a convenience for precompilation.\n template.source = 'function(' + argument + '){\\n' + source + '}';\n\n return template;\n}\n","import isFunction from './isFunction.js';\nimport toPath from './_toPath.js';\n\n// Traverses the children of `obj` along `path`. If a child is a function, it\n// is invoked with its parent as context. Returns the value of the final\n// child, or `fallback` if any child is undefined.\nexport default function result(obj, path, fallback) {\n path = toPath(path);\n var length = path.length;\n if (!length) {\n return isFunction(fallback) ? fallback.call(obj) : fallback;\n }\n for (var i = 0; i < length; i++) {\n var prop = obj == null ? void 0 : obj[path[i]];\n if (prop === void 0) {\n prop = fallback;\n i = length; // Ensure we don't continue iterating.\n }\n obj = isFunction(prop) ? prop.call(obj) : prop;\n }\n return obj;\n}\n","// Generate a unique integer id (unique within the entire client session).\n// Useful for temporary DOM ids.\nvar idCounter = 0;\nexport default function uniqueId(prefix) {\n var id = ++idCounter + '';\n return prefix ? prefix + id : id;\n}\n","import _ from './underscore.js';\n\n// Start chaining a wrapped Underscore object.\nexport default function chain(obj) {\n var instance = _(obj);\n instance._chain = true;\n return instance;\n}\n","import baseCreate from './_baseCreate.js';\nimport isObject from './isObject.js';\n\n// Internal function to execute `sourceFunc` bound to `context` with optional\n// `args`. Determines whether to execute a function as a constructor or as a\n// normal function.\nexport default function executeBound(sourceFunc, boundFunc, context, callingContext, args) {\n if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n var self = baseCreate(sourceFunc.prototype);\n var result = sourceFunc.apply(self, args);\n if (isObject(result)) return result;\n return self;\n}\n","import restArguments from './restArguments.js';\nimport executeBound from './_executeBound.js';\nimport _ from './underscore.js';\n\n// Partially apply a function by creating a version that has had some of its\n// arguments pre-filled, without changing its dynamic `this` context. `_` acts\n// as a placeholder by default, allowing any combination of arguments to be\n// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.\nvar partial = restArguments(function(func, boundArgs) {\n var placeholder = partial.placeholder;\n var bound = function() {\n var position = 0, length = boundArgs.length;\n var args = Array(length);\n for (var i = 0; i < length; i++) {\n args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];\n }\n while (position < arguments.length) args.push(arguments[position++]);\n return executeBound(func, bound, this, this, args);\n };\n return bound;\n});\n\npartial.placeholder = _;\nexport default partial;\n","import restArguments from './restArguments.js';\nimport isFunction from './isFunction.js';\nimport executeBound from './_executeBound.js';\n\n// Create a function bound to a given object (assigning `this`, and arguments,\n// optionally).\nexport default restArguments(function(func, context, args) {\n if (!isFunction(func)) throw new TypeError('Bind must be called on a function');\n var bound = restArguments(function(callArgs) {\n return executeBound(func, bound, context, this, args.concat(callArgs));\n });\n return bound;\n});\n","import createSizePropertyCheck from './_createSizePropertyCheck.js';\nimport getLength from './_getLength.js';\n\n// Internal helper for collection methods to determine whether a collection\n// should be iterated as an array or as an object.\n// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\nexport default createSizePropertyCheck(getLength);\n","import getLength from './_getLength.js';\nimport isArrayLike from './_isArrayLike.js';\nimport isArray from './isArray.js';\nimport isArguments from './isArguments.js';\n\n// Internal implementation of a recursive `flatten` function.\nexport default function flatten(input, depth, strict, output) {\n output = output || [];\n if (!depth && depth !== 0) {\n depth = Infinity;\n } else if (depth <= 0) {\n return output.concat(input);\n }\n var idx = output.length;\n for (var i = 0, length = getLength(input); i < length; i++) {\n var value = input[i];\n if (isArrayLike(value) && (isArray(value) || isArguments(value))) {\n // Flatten current level of array or arguments object.\n if (depth > 1) {\n flatten(value, depth - 1, strict, output);\n idx = output.length;\n } else {\n var j = 0, len = value.length;\n while (j < len) output[idx++] = value[j++];\n }\n } else if (!strict) {\n output[idx++] = value;\n }\n }\n return output;\n}\n","import restArguments from './restArguments.js';\nimport flatten from './_flatten.js';\nimport bind from './bind.js';\n\n// Bind a number of an object's methods to that object. Remaining arguments\n// are the method names to be bound. Useful for ensuring that all callbacks\n// defined on an object belong to it.\nexport default restArguments(function(obj, keys) {\n keys = flatten(keys, false, false);\n var index = keys.length;\n if (index < 1) throw new Error('bindAll must be passed function names');\n while (index--) {\n var key = keys[index];\n obj[key] = bind(obj[key], obj);\n }\n return obj;\n});\n","import has from './_has.js';\n\n// Memoize an expensive function by storing its results.\nexport default function memoize(func, hasher) {\n var memoize = function(key) {\n var cache = memoize.cache;\n var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n if (!has(cache, address)) cache[address] = func.apply(this, arguments);\n return cache[address];\n };\n memoize.cache = {};\n return memoize;\n}\n","import restArguments from './restArguments.js';\n\n// Delays a function for the given number of milliseconds, and then calls\n// it with the arguments supplied.\nexport default restArguments(function(func, wait, args) {\n return setTimeout(function() {\n return func.apply(null, args);\n }, wait);\n});\n","import partial from './partial.js';\nimport delay from './delay.js';\nimport _ from './underscore.js';\n\n// Defers a function, scheduling it to run after the current call stack has\n// cleared.\nexport default partial(delay, _, 1);\n","import now from './now.js';\n\n// Returns a function, that, when invoked, will only be triggered at most once\n// during a given window of time. Normally, the throttled function will run\n// as much as it can, without ever going more than once per `wait` duration;\n// but if you'd like to disable the execution on the leading edge, pass\n// `{leading: false}`. To disable execution on the trailing edge, ditto.\nexport default function throttle(func, wait, options) {\n var timeout, context, args, result;\n var previous = 0;\n if (!options) options = {};\n\n var later = function() {\n previous = options.leading === false ? 0 : now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n\n var throttled = function() {\n var _now = now();\n if (!previous && options.leading === false) previous = _now;\n var remaining = wait - (_now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = _now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n\n throttled.cancel = function() {\n clearTimeout(timeout);\n previous = 0;\n timeout = context = args = null;\n };\n\n return throttled;\n}\n","import restArguments from './restArguments.js';\nimport now from './now.js';\n\n// When a sequence of calls of the returned function ends, the argument\n// function is triggered. The end of a sequence is defined by the `wait`\n// parameter. If `immediate` is passed, the argument function will be\n// triggered at the beginning of the sequence instead of at the end.\nexport default function debounce(func, wait, immediate) {\n var timeout, previous, args, result, context;\n\n var later = function() {\n var passed = now() - previous;\n if (wait > passed) {\n timeout = setTimeout(later, wait - passed);\n } else {\n timeout = null;\n if (!immediate) result = func.apply(context, args);\n // This check is needed because `func` can recursively invoke `debounced`.\n if (!timeout) args = context = null;\n }\n };\n\n var debounced = restArguments(function(_args) {\n context = this;\n args = _args;\n previous = now();\n if (!timeout) {\n timeout = setTimeout(later, wait);\n if (immediate) result = func.apply(context, args);\n }\n return result;\n });\n\n debounced.cancel = function() {\n clearTimeout(timeout);\n timeout = args = context = null;\n };\n\n return debounced;\n}\n","import partial from './partial.js';\n\n// Returns the first function passed as an argument to the second,\n// allowing you to adjust arguments, run code before and after, and\n// conditionally execute the original function.\nexport default function wrap(func, wrapper) {\n return partial(wrapper, func);\n}\n","// Returns a negated version of the passed-in predicate.\nexport default function negate(predicate) {\n return function() {\n return !predicate.apply(this, arguments);\n };\n}\n","// Returns a function that is the composition of a list of functions, each\n// consuming the return value of the function that follows.\nexport default function compose() {\n var args = arguments;\n var start = args.length - 1;\n return function() {\n var i = start;\n var result = args[start].apply(this, arguments);\n while (i--) result = args[i].call(this, result);\n return result;\n };\n}\n","// Returns a function that will only be executed on and after the Nth call.\nexport default function after(times, func) {\n return function() {\n if (--times < 1) {\n return func.apply(this, arguments);\n }\n };\n}\n","// Returns a function that will only be executed up to (but not including) the\n// Nth call.\nexport default function before(times, func) {\n var memo;\n return function() {\n if (--times > 0) {\n memo = func.apply(this, arguments);\n }\n if (times <= 1) func = null;\n return memo;\n };\n}\n","import partial from './partial.js';\nimport before from './before.js';\n\n// Returns a function that will be executed at most one time, no matter how\n// often you call it. Useful for lazy initialization.\nexport default partial(before, 2);\n","import cb from './_cb.js';\nimport keys from './keys.js';\n\n// Returns the first key on an object that passes a truth test.\nexport default function findKey(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = keys(obj), key;\n for (var i = 0, length = _keys.length; i < length; i++) {\n key = _keys[i];\n if (predicate(obj[key], key, obj)) return key;\n }\n}\n","import cb from './_cb.js';\nimport getLength from './_getLength.js';\n\n// Internal function to generate `_.findIndex` and `_.findLastIndex`.\nexport default function createPredicateIndexFinder(dir) {\n return function(array, predicate, context) {\n predicate = cb(predicate, context);\n var length = getLength(array);\n var index = dir > 0 ? 0 : length - 1;\n for (; index >= 0 && index < length; index += dir) {\n if (predicate(array[index], index, array)) return index;\n }\n return -1;\n };\n}\n","import createPredicateIndexFinder from './_createPredicateIndexFinder.js';\n\n// Returns the first index on an array-like that passes a truth test.\nexport default createPredicateIndexFinder(1);\n","import createPredicateIndexFinder from './_createPredicateIndexFinder.js';\n\n// Returns the last index on an array-like that passes a truth test.\nexport default createPredicateIndexFinder(-1);\n","import cb from './_cb.js';\nimport getLength from './_getLength.js';\n\n// Use a comparator function to figure out the smallest index at which\n// an object should be inserted so as to maintain order. Uses binary search.\nexport default function sortedIndex(array, obj, iteratee, context) {\n iteratee = cb(iteratee, context, 1);\n var value = iteratee(obj);\n var low = 0, high = getLength(array);\n while (low < high) {\n var mid = Math.floor((low + high) / 2);\n if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n }\n return low;\n}\n","import getLength from './_getLength.js';\nimport { slice } from './_setup.js';\nimport isNaN from './isNaN.js';\n\n// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.\nexport default function createIndexFinder(dir, predicateFind, sortedIndex) {\n return function(array, item, idx) {\n var i = 0, length = getLength(array);\n if (typeof idx == 'number') {\n if (dir > 0) {\n i = idx >= 0 ? idx : Math.max(idx + length, i);\n } else {\n length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n }\n } else if (sortedIndex && idx && length) {\n idx = sortedIndex(array, item);\n return array[idx] === item ? idx : -1;\n }\n if (item !== item) {\n idx = predicateFind(slice.call(array, i, length), isNaN);\n return idx >= 0 ? idx + i : -1;\n }\n for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n if (array[idx] === item) return idx;\n }\n return -1;\n };\n}\n","import sortedIndex from './sortedIndex.js';\nimport findIndex from './findIndex.js';\nimport createIndexFinder from './_createIndexFinder.js';\n\n// Return the position of the first occurrence of an item in an array,\n// or -1 if the item is not included in the array.\n// If the array is large and already in sort order, pass `true`\n// for **isSorted** to use binary search.\nexport default createIndexFinder(1, findIndex, sortedIndex);\n","import findLastIndex from './findLastIndex.js';\nimport createIndexFinder from './_createIndexFinder.js';\n\n// Return the position of the last occurrence of an item in an array,\n// or -1 if the item is not included in the array.\nexport default createIndexFinder(-1, findLastIndex);\n","import isArrayLike from './_isArrayLike.js';\nimport findIndex from './findIndex.js';\nimport findKey from './findKey.js';\n\n// Return the first value which passes a truth test.\nexport default function find(obj, predicate, context) {\n var keyFinder = isArrayLike(obj) ? findIndex : findKey;\n var key = keyFinder(obj, predicate, context);\n if (key !== void 0 && key !== -1) return obj[key];\n}\n","import find from './find.js';\nimport matcher from './matcher.js';\n\n// Convenience version of a common use case of `_.find`: getting the first\n// object containing specific `key:value` pairs.\nexport default function findWhere(obj, attrs) {\n return find(obj, matcher(attrs));\n}\n","import optimizeCb from './_optimizeCb.js';\nimport isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// The cornerstone for collection functions, an `each`\n// implementation, aka `forEach`.\n// Handles raw objects in addition to array-likes. Treats all\n// sparse array-likes as if they were dense.\nexport default function each(obj, iteratee, context) {\n iteratee = optimizeCb(iteratee, context);\n var i, length;\n if (isArrayLike(obj)) {\n for (i = 0, length = obj.length; i < length; i++) {\n iteratee(obj[i], i, obj);\n }\n } else {\n var _keys = keys(obj);\n for (i = 0, length = _keys.length; i < length; i++) {\n iteratee(obj[_keys[i]], _keys[i], obj);\n }\n }\n return obj;\n}\n","import cb from './_cb.js';\nimport isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// Return the results of applying the iteratee to each element.\nexport default function map(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length,\n results = Array(length);\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n results[index] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n}\n","import isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\nimport optimizeCb from './_optimizeCb.js';\n\n// Internal helper to create a reducing function, iterating left or right.\nexport default function createReduce(dir) {\n // Wrap code that reassigns argument variables in a separate function than\n // the one that accesses `arguments.length` to avoid a perf hit. (#1991)\n var reducer = function(obj, iteratee, memo, initial) {\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length,\n index = dir > 0 ? 0 : length - 1;\n if (!initial) {\n memo = obj[_keys ? _keys[index] : index];\n index += dir;\n }\n for (; index >= 0 && index < length; index += dir) {\n var currentKey = _keys ? _keys[index] : index;\n memo = iteratee(memo, obj[currentKey], currentKey, obj);\n }\n return memo;\n };\n\n return function(obj, iteratee, memo, context) {\n var initial = arguments.length >= 3;\n return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);\n };\n}\n","import createReduce from './_createReduce.js';\n\n// **Reduce** builds up a single result from a list of values, aka `inject`,\n// or `foldl`.\nexport default createReduce(1);\n","import createReduce from './_createReduce.js';\n\n// The right-associative version of reduce, also known as `foldr`.\nexport default createReduce(-1);\n","import cb from './_cb.js';\nimport each from './each.js';\n\n// Return all the elements that pass a truth test.\nexport default function filter(obj, predicate, context) {\n var results = [];\n predicate = cb(predicate, context);\n each(obj, function(value, index, list) {\n if (predicate(value, index, list)) results.push(value);\n });\n return results;\n}\n","import filter from './filter.js';\nimport negate from './negate.js';\nimport cb from './_cb.js';\n\n// Return all the elements for which a truth test fails.\nexport default function reject(obj, predicate, context) {\n return filter(obj, negate(cb(predicate)), context);\n}\n","import cb from './_cb.js';\nimport isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// Determine whether all of the elements pass a truth test.\nexport default function every(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n if (!predicate(obj[currentKey], currentKey, obj)) return false;\n }\n return true;\n}\n","import cb from './_cb.js';\nimport isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// Determine if at least one element in the object passes a truth test.\nexport default function some(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n if (predicate(obj[currentKey], currentKey, obj)) return true;\n }\n return false;\n}\n","import isArrayLike from './_isArrayLike.js';\nimport values from './values.js';\nimport indexOf from './indexOf.js';\n\n// Determine if the array or object contains a given item (using `===`).\nexport default function contains(obj, item, fromIndex, guard) {\n if (!isArrayLike(obj)) obj = values(obj);\n if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n return indexOf(obj, item, fromIndex) >= 0;\n}\n","import restArguments from './restArguments.js';\nimport isFunction from './isFunction.js';\nimport map from './map.js';\nimport deepGet from './_deepGet.js';\nimport toPath from './_toPath.js';\n\n// Invoke a method (with arguments) on every item in a collection.\nexport default restArguments(function(obj, path, args) {\n var contextPath, func;\n if (isFunction(path)) {\n func = path;\n } else {\n path = toPath(path);\n contextPath = path.slice(0, -1);\n path = path[path.length - 1];\n }\n return map(obj, function(context) {\n var method = func;\n if (!method) {\n if (contextPath && contextPath.length) {\n context = deepGet(context, contextPath);\n }\n if (context == null) return void 0;\n method = context[path];\n }\n return method == null ? method : method.apply(context, args);\n });\n});\n","import map from './map.js';\nimport property from './property.js';\n\n// Convenience version of a common use case of `_.map`: fetching a property.\nexport default function pluck(obj, key) {\n return map(obj, property(key));\n}\n","import filter from './filter.js';\nimport matcher from './matcher.js';\n\n// Convenience version of a common use case of `_.filter`: selecting only\n// objects containing specific `key:value` pairs.\nexport default function where(obj, attrs) {\n return filter(obj, matcher(attrs));\n}\n","import isArrayLike from './_isArrayLike.js';\nimport values from './values.js';\nimport cb from './_cb.js';\nimport each from './each.js';\n\n// Return the maximum element (or element-based computation).\nexport default function max(obj, iteratee, context) {\n var result = -Infinity, lastComputed = -Infinity,\n value, computed;\n if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {\n obj = isArrayLike(obj) ? obj : values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value != null && value > result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n each(obj, function(v, index, list) {\n computed = iteratee(v, index, list);\n if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) {\n result = v;\n lastComputed = computed;\n }\n });\n }\n return result;\n}\n","import isArrayLike from './_isArrayLike.js';\nimport values from './values.js';\nimport cb from './_cb.js';\nimport each from './each.js';\n\n// Return the minimum element (or element-based computation).\nexport default function min(obj, iteratee, context) {\n var result = Infinity, lastComputed = Infinity,\n value, computed;\n if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {\n obj = isArrayLike(obj) ? obj : values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value != null && value < result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n each(obj, function(v, index, list) {\n computed = iteratee(v, index, list);\n if (computed < lastComputed || (computed === Infinity && result === Infinity)) {\n result = v;\n lastComputed = computed;\n }\n });\n }\n return result;\n}\n","import isArray from './isArray.js';\nimport { slice } from './_setup.js';\nimport isString from './isString.js';\nimport isArrayLike from './_isArrayLike.js';\nimport map from './map.js';\nimport identity from './identity.js';\nimport values from './values.js';\n\n// Safely create a real, live array from anything iterable.\nvar reStrSymbol = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\nexport default function toArray(obj) {\n if (!obj) return [];\n if (isArray(obj)) return slice.call(obj);\n if (isString(obj)) {\n // Keep surrogate pair characters together.\n return obj.match(reStrSymbol);\n }\n if (isArrayLike(obj)) return map(obj, identity);\n return values(obj);\n}\n","import isArrayLike from './_isArrayLike.js';\nimport values from './values.js';\nimport getLength from './_getLength.js';\nimport random from './random.js';\nimport toArray from './toArray.js';\n\n// Sample **n** random values from a collection using the modern version of the\n// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n// If **n** is not specified, returns a single random element.\n// The internal `guard` argument allows it to work with `_.map`.\nexport default function sample(obj, n, guard) {\n if (n == null || guard) {\n if (!isArrayLike(obj)) obj = values(obj);\n return obj[random(obj.length - 1)];\n }\n var sample = toArray(obj);\n var length = getLength(sample);\n n = Math.max(Math.min(n, length), 0);\n var last = length - 1;\n for (var index = 0; index < n; index++) {\n var rand = random(index, last);\n var temp = sample[index];\n sample[index] = sample[rand];\n sample[rand] = temp;\n }\n return sample.slice(0, n);\n}\n","import sample from './sample.js';\n\n// Shuffle a collection.\nexport default function shuffle(obj) {\n return sample(obj, Infinity);\n}\n","import cb from './_cb.js';\nimport pluck from './pluck.js';\nimport map from './map.js';\n\n// Sort the object's values by a criterion produced by an iteratee.\nexport default function sortBy(obj, iteratee, context) {\n var index = 0;\n iteratee = cb(iteratee, context);\n return pluck(map(obj, function(value, key, list) {\n return {\n value: value,\n index: index++,\n criteria: iteratee(value, key, list)\n };\n }).sort(function(left, right) {\n var a = left.criteria;\n var b = right.criteria;\n if (a !== b) {\n if (a > b || a === void 0) return 1;\n if (a < b || b === void 0) return -1;\n }\n return left.index - right.index;\n }), 'value');\n}\n","import cb from './_cb.js';\nimport each from './each.js';\n\n// An internal function used for aggregate \"group by\" operations.\nexport default function group(behavior, partition) {\n return function(obj, iteratee, context) {\n var result = partition ? [[], []] : {};\n iteratee = cb(iteratee, context);\n each(obj, function(value, index) {\n var key = iteratee(value, index, obj);\n behavior(result, value, key);\n });\n return result;\n };\n}\n","import group from './_group.js';\nimport has from './_has.js';\n\n// Groups the object's values by a criterion. Pass either a string attribute\n// to group by, or a function that returns the criterion.\nexport default group(function(result, value, key) {\n if (has(result, key)) result[key].push(value); else result[key] = [value];\n});\n","import group from './_group.js';\n\n// Indexes the object's values by a criterion, similar to `_.groupBy`, but for\n// when you know that your index values will be unique.\nexport default group(function(result, value, key) {\n result[key] = value;\n});\n","import group from './_group.js';\nimport has from './_has.js';\n\n// Counts instances of an object that group by a certain criterion. Pass\n// either a string attribute to count by, or a function that returns the\n// criterion.\nexport default group(function(result, value, key) {\n if (has(result, key)) result[key]++; else result[key] = 1;\n});\n","import group from './_group.js';\n\n// Split a collection into two arrays: one whose elements all pass the given\n// truth test, and one whose elements all do not pass the truth test.\nexport default group(function(result, value, pass) {\n result[pass ? 0 : 1].push(value);\n}, true);\n","import isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// Return the number of elements in a collection.\nexport default function size(obj) {\n if (obj == null) return 0;\n return isArrayLike(obj) ? obj.length : keys(obj).length;\n}\n","// Internal `_.pick` helper function to determine whether `key` is an enumerable\n// property name of `obj`.\nexport default function keyInObj(value, key, obj) {\n return key in obj;\n}\n","import restArguments from './restArguments.js';\nimport isFunction from './isFunction.js';\nimport optimizeCb from './_optimizeCb.js';\nimport allKeys from './allKeys.js';\nimport keyInObj from './_keyInObj.js';\nimport flatten from './_flatten.js';\n\n// Return a copy of the object only containing the allowed properties.\nexport default restArguments(function(obj, keys) {\n var result = {}, iteratee = keys[0];\n if (obj == null) return result;\n if (isFunction(iteratee)) {\n if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);\n keys = allKeys(obj);\n } else {\n iteratee = keyInObj;\n keys = flatten(keys, false, false);\n obj = Object(obj);\n }\n for (var i = 0, length = keys.length; i < length; i++) {\n var key = keys[i];\n var value = obj[key];\n if (iteratee(value, key, obj)) result[key] = value;\n }\n return result;\n});\n","import restArguments from './restArguments.js';\nimport isFunction from './isFunction.js';\nimport negate from './negate.js';\nimport map from './map.js';\nimport flatten from './_flatten.js';\nimport contains from './contains.js';\nimport pick from './pick.js';\n\n// Return a copy of the object without the disallowed properties.\nexport default restArguments(function(obj, keys) {\n var iteratee = keys[0], context;\n if (isFunction(iteratee)) {\n iteratee = negate(iteratee);\n if (keys.length > 1) context = keys[1];\n } else {\n keys = map(flatten(keys, false, false), String);\n iteratee = function(value, key) {\n return !contains(keys, key);\n };\n }\n return pick(obj, iteratee, context);\n});\n","import { slice } from './_setup.js';\n\n// Returns everything but the last entry of the array. Especially useful on\n// the arguments object. Passing **n** will return all the values in\n// the array, excluding the last N.\nexport default function initial(array, n, guard) {\n return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n}\n","import initial from './initial.js';\n\n// Get the first element of an array. Passing **n** will return the first N\n// values in the array. The **guard** check allows it to work with `_.map`.\nexport default function first(array, n, guard) {\n if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n if (n == null || guard) return array[0];\n return initial(array, array.length - n);\n}\n","import { slice } from './_setup.js';\n\n// Returns everything but the first entry of the `array`. Especially useful on\n// the `arguments` object. Passing an **n** will return the rest N values in the\n// `array`.\nexport default function rest(array, n, guard) {\n return slice.call(array, n == null || guard ? 1 : n);\n}\n","import rest from './rest.js';\n\n// Get the last element of an array. Passing **n** will return the last N\n// values in the array.\nexport default function last(array, n, guard) {\n if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n if (n == null || guard) return array[array.length - 1];\n return rest(array, Math.max(0, array.length - n));\n}\n","import filter from './filter.js';\n\n// Trim out all falsy values from an array.\nexport default function compact(array) {\n return filter(array, Boolean);\n}\n","import _flatten from './_flatten.js';\n\n// Flatten out an array, either recursively (by default), or up to `depth`.\n// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.\nexport default function flatten(array, depth) {\n return _flatten(array, depth, false);\n}\n","import restArguments from './restArguments.js';\nimport flatten from './_flatten.js';\nimport filter from './filter.js';\nimport contains from './contains.js';\n\n// Take the difference between one array and a number of other arrays.\n// Only the elements present in just the first array will remain.\nexport default restArguments(function(array, rest) {\n rest = flatten(rest, true, true);\n return filter(array, function(value){\n return !contains(rest, value);\n });\n});\n","import restArguments from './restArguments.js';\nimport difference from './difference.js';\n\n// Return a version of the array that does not contain the specified value(s).\nexport default restArguments(function(array, otherArrays) {\n return difference(array, otherArrays);\n});\n","import isBoolean from './isBoolean.js';\nimport cb from './_cb.js';\nimport getLength from './_getLength.js';\nimport contains from './contains.js';\n\n// Produce a duplicate-free version of the array. If the array has already\n// been sorted, you have the option of using a faster algorithm.\n// The faster algorithm will not work with an iteratee if the iteratee\n// is not a one-to-one function, so providing an iteratee will disable\n// the faster algorithm.\nexport default function uniq(array, isSorted, iteratee, context) {\n if (!isBoolean(isSorted)) {\n context = iteratee;\n iteratee = isSorted;\n isSorted = false;\n }\n if (iteratee != null) iteratee = cb(iteratee, context);\n var result = [];\n var seen = [];\n for (var i = 0, length = getLength(array); i < length; i++) {\n var value = array[i],\n computed = iteratee ? iteratee(value, i, array) : value;\n if (isSorted && !iteratee) {\n if (!i || seen !== computed) result.push(value);\n seen = computed;\n } else if (iteratee) {\n if (!contains(seen, computed)) {\n seen.push(computed);\n result.push(value);\n }\n } else if (!contains(result, value)) {\n result.push(value);\n }\n }\n return result;\n}\n","import restArguments from './restArguments.js';\nimport uniq from './uniq.js';\nimport flatten from './_flatten.js';\n\n// Produce an array that contains the union: each distinct element from all of\n// the passed-in arrays.\nexport default restArguments(function(arrays) {\n return uniq(flatten(arrays, true, true));\n});\n","import getLength from './_getLength.js';\nimport contains from './contains.js';\n\n// Produce an array that contains every item shared between all the\n// passed-in arrays.\nexport default function intersection(array) {\n var result = [];\n var argsLength = arguments.length;\n for (var i = 0, length = getLength(array); i < length; i++) {\n var item = array[i];\n if (contains(result, item)) continue;\n var j;\n for (j = 1; j < argsLength; j++) {\n if (!contains(arguments[j], item)) break;\n }\n if (j === argsLength) result.push(item);\n }\n return result;\n}\n","import max from './max.js';\nimport getLength from './_getLength.js';\nimport pluck from './pluck.js';\n\n// Complement of zip. Unzip accepts an array of arrays and groups\n// each array's elements on shared indices.\nexport default function unzip(array) {\n var length = (array && max(array, getLength).length) || 0;\n var result = Array(length);\n\n for (var index = 0; index < length; index++) {\n result[index] = pluck(array, index);\n }\n return result;\n}\n","import restArguments from './restArguments.js';\nimport unzip from './unzip.js';\n\n// Zip together multiple lists into a single array -- elements that share\n// an index go together.\nexport default restArguments(unzip);\n","import getLength from './_getLength.js';\n\n// Converts lists into objects. Pass either a single array of `[key, value]`\n// pairs, or two parallel arrays of the same length -- one of keys, and one of\n// the corresponding values. Passing by pairs is the reverse of `_.pairs`.\nexport default function object(list, values) {\n var result = {};\n for (var i = 0, length = getLength(list); i < length; i++) {\n if (values) {\n result[list[i]] = values[i];\n } else {\n result[list[i][0]] = list[i][1];\n }\n }\n return result;\n}\n","// Generate an integer Array containing an arithmetic progression. A port of\n// the native Python `range()` function. See\n// [the Python documentation](https://docs.python.org/library/functions.html#range).\nexport default function range(start, stop, step) {\n if (stop == null) {\n stop = start || 0;\n start = 0;\n }\n if (!step) {\n step = stop < start ? -1 : 1;\n }\n\n var length = Math.max(Math.ceil((stop - start) / step), 0);\n var range = Array(length);\n\n for (var idx = 0; idx < length; idx++, start += step) {\n range[idx] = start;\n }\n\n return range;\n}\n","import { slice } from './_setup.js';\n\n// Chunk a single array into multiple arrays, each containing `count` or fewer\n// items.\nexport default function chunk(array, count) {\n if (count == null || count < 1) return [];\n var result = [];\n var i = 0, length = array.length;\n while (i < length) {\n result.push(slice.call(array, i, i += count));\n }\n return result;\n}\n","import _ from './underscore.js';\n\n// Helper function to continue chaining intermediate results.\nexport default function chainResult(instance, obj) {\n return instance._chain ? _(obj).chain() : obj;\n}\n","import _ from './underscore.js';\nimport each from './each.js';\nimport functions from './functions.js';\nimport { push } from './_setup.js';\nimport chainResult from './_chainResult.js';\n\n// Add your own custom functions to the Underscore object.\nexport default function mixin(obj) {\n each(functions(obj), function(name) {\n var func = _[name] = obj[name];\n _.prototype[name] = function() {\n var args = [this._wrapped];\n push.apply(args, arguments);\n return chainResult(this, func.apply(_, args));\n };\n });\n return _;\n}\n","import _ from './underscore.js';\nimport each from './each.js';\nimport { ArrayProto } from './_setup.js';\nimport chainResult from './_chainResult.js';\n\n// Add all mutator `Array` functions to the wrapper.\neach(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n var method = ArrayProto[name];\n _.prototype[name] = function() {\n var obj = this._wrapped;\n if (obj != null) {\n method.apply(obj, arguments);\n if ((name === 'shift' || name === 'splice') && obj.length === 0) {\n delete obj[0];\n }\n }\n return chainResult(this, obj);\n };\n});\n\n// Add all accessor `Array` functions to the wrapper.\neach(['concat', 'join', 'slice'], function(name) {\n var method = ArrayProto[name];\n _.prototype[name] = function() {\n var obj = this._wrapped;\n if (obj != null) obj = method.apply(obj, arguments);\n return chainResult(this, obj);\n };\n});\n\nexport default _;\n","// Default Export\n// ==============\n// In this module, we mix our bundled exports into the `_` object and export\n// the result. This is analogous to setting `module.exports = _` in CommonJS.\n// Hence, this module is also the entry point of our UMD bundle and the package\n// entry point for CommonJS and AMD users. In other words, this is (the source\n// of) the module you are interfacing with when you do any of the following:\n//\n// ```js\n// // CommonJS\n// var _ = require('underscore');\n//\n// // AMD\n// define(['underscore'], function(_) {...});\n//\n// // UMD in the browser\n// // _ is available as a global variable\n// ```\nimport * as allExports from './index.js';\nimport { mixin } from './index.js';\n\n// Add all of the Underscore functions to the wrapper object.\nvar _ = mixin(allExports);\n// Legacy Node.js API.\n_._ = _;\n// Export the Underscore API.\nexport default _;\n","import*as e from\"three\";import{Vector3 as t,MathUtils as r,Float32BufferAttribute as n,InstancedInterleavedBuffer as i,InterleavedBufferAttribute as l,BufferAttribute as a,Matrix4 as s,BufferGeometry as u,Uint32BufferAttribute as d,Uint16BufferAttribute as p,FrontSide as o,Box3 as c,Box3Helper as v,Ray as f,EllipseCurve as S,UniformsUtils as h,ShaderLib as V,MeshStandardMaterial as m,MeshBasicMaterial as z,MeshDepthMaterial as X,MeshNormalMaterial as b,PointsMaterial as q,TextureLoader as K,PMREMGenerator as U,Texture as T,Color as x,DataTexture as P,NearestFilter as W,Vector2 as y,DoubleSide as R,AlwaysStencilFunc as M,ReplaceStencilOp as N,Sphere as O,Mesh as L,RGBAFormat as Z,FloatType as k,Triangle as G,BackSide as j,Euler as I,Quaternion as E,DynamicDrawUsage as w,Vector4 as J,Points as Y,PlaneGeometry as F,Raycaster as D,ShaderMaterial as g,NoBlending as C,CustomBlending as H,DstColorFactor as Q,ZeroFactor as A,AddEquation as B,DstAlphaFactor as _,WebGLRenderTarget as $,RGBADepthPacking as ee,OneFactor as te,ReverseSubtractEquation as re,RedFormat as ne,RepeatWrapping as ie,EqualStencilFunc as le,Line3 as ae,Plane as se,LinearFilter as ue,OrthographicCamera as de,BasicDepthPacking as pe,CameraHelper as oe,MaxEquation as ce,Group as ve,CircleGeometry as fe,Object3D as Se,PerspectiveCamera as he,Scene as Ve,WebGLRenderer as me,sRGBEncoding as ze,ACESFilmicToneMapping as Xe,VSMShadowMap as be,DirectionalLightHelper as qe,DirectionalLight as Ke,Spherical as Ue}from\"three\";export{Box3,Vector3}from\"three\";import Te from\"three/examples/jsm/libs/stats.module.js\";import xe from\"@speckle/objectloader\";import{generateUUID as Pe}from\"three/src/math/MathUtils\";import We from\"js-logger\";import ye from\"camera-controls\";import{KeyboardKeyHold as Re,HOLD_EVENT_TYPE as Me}from\"hold-event\";import{MeshBVH as Ne,ExtendedTriangle as Oe,CENTER as Le,MeshBVHVisualizer as Ze}from\"three-mesh-bvh\";import{LineMaterial as ke}from\"three/examples/jsm/lines/LineMaterial.js\";import Ge from\"string-to-color\";import{EXRLoader as je}from\"three/examples/jsm/loaders/EXRLoader.js\";import{RGBELoader as Ie}from\"three/examples/jsm/loaders/RGBELoader.js\";import{FontLoader as Ee}from\"three/examples/jsm/loaders/FontLoader.js\";import{createTextDerivedMaterial as we,Text as Je}from\"troika-three-text\";import{LineSegments2 as Ye}from\"three/examples/jsm/lines/LineSegments2.js\";import{LineSegmentsGeometry as Fe}from\"three/examples/jsm/lines/LineSegmentsGeometry.js\";import{EffectComposer as De}from\"three/examples/jsm/postprocessing/EffectComposer.js\";import{Pass as ge,FullScreenQuad as Ce}from\"three/examples/jsm/postprocessing/Pass.js\";import{CopyShader as He}from\"three/examples/jsm/shaders/CopyShader.js\";import{SAOShader as Qe}from\"three/examples/jsm/shaders/SAOShader.js\";import{DepthLimitedBlurShader as Ae,BlurShaderUtils as Be}from\"three/examples/jsm/shaders/DepthLimitedBlurShader.js\";import{SimplexNoise as _e}from\"three/examples/jsm//math/SimplexNoise.js\";import{TransformControls as $e}from\"three/examples/jsm/controls/TransformControls.js\";import et from\"tree-model\";import tt from\"underscore\";var rt;!function(e){e.TEXTURE_8BPP=\"png\",e.TEXTURE_HDR=\"hdr\",e.TEXTURE_EXR=\"exr\",e.FONT_JSON=\"font-json\"}(rt||(rt={}));const nt={showStats:!1,verbose:!1,keepGeometryData:!1,environmentSrc:{src:\"data:image/png;base64,di8xAQIAAABFeGlmOkltYWdlSGlzdG9yeQBzdHJpbmcAvAAAAG9paW90b29sICJYOlxccGhjbG91ZFxcUG9seSBIYXZlbiBBc3NldHNcXEhEUklzXFxoZHJcXDFrXFxwaG90b19zdHVkaW9fMDFfMWsuaGRyIiAtLWNvbXByZXNzaW9uIHBpeiAtLW5vLWNsb2JiZXIgLW8gIlg6XFxwaGNsb3VkXFxQb2x5IEhhdmVuIEFzc2V0c1xcSERSSXNcXGV4clxcMWtcXHBob3RvX3N0dWRpb18wMV8xay5leHIiT3JpZW50YXRpb24AaW50AAQAAAABAAAAU29mdHdhcmUAc3RyaW5nANEAAABPcGVuSW1hZ2VJTyAyLjEuMTYgOiBvaWlvdG9vbCAiWDpcXHBoY2xvdWRcXFBvbHkgSGF2ZW4gQXNzZXRzXFxIRFJJc1xcaGRyXFwxa1xccGhvdG9fc3R1ZGlvXzAxXzFrLmhkciIgLS1jb21wcmVzc2lvbiBwaXogLS1uby1jbG9iYmVyIC1vICJYOlxccGhjbG91ZFxcUG9seSBIYXZlbiBBc3NldHNcXEhEUklzXFxleHJcXDFrXFxwaG90b19zdHVkaW9fMDFfMWsuZXhyImNhcERhdGUAc3RyaW5nABMAAAAyMDIxOjA1OjA4IDE0OjU3OjU5Y2hhbm5lbHMAY2hsaXN0ADcAAABCAAIAAAAAAAAAAQAAAAEAAABHAAIAAAAAAAAAAQAAAAEAAABSAAIAAAAAAAAAAQAAAAEAAAAAY29tcHJlc3Npb24AY29tcHJlc3Npb24AAQAAAARkYXRhV2luZG93AGJveDJpABAAAAAAAAAAAAAAAP8DAAD/AQAAZGlzcGxheVdpbmRvdwBib3gyaQAQAAAAAAAAAAAAAAD/AwAA/wEAAGxpbmVPcmRlcgBsaW5lT3JkZXIAAQAAAABwaXhlbEFzcGVjdFJhdGlvAGZsb2F0AAQAAAAAAIA/c2NyZWVuV2luZG93Q2VudGVyAHYyZgAIAAAAAAAAAAAAAABzY3JlZW5XaW5kb3dXaWR0aABmbG9hdAAEAAAAAACAPwC1AwAAAAAAAFKzAAAAAAAA5mMBAAAAAADJMQIAAAAAAG8VAwAAAAAAASkEAAAAAAA6PQUAAAAAAHVYBgAAAAAAEWMHAAAAAADkaQgAAAAAAFqxCQAAAAAAugULAAAAAAA8hwwAAAAAAAD6DQAAAAAAYnsPAAAAAACv8hAAAAAAAAAAAACVrwAA0gfdBwjAEQZDNPrv////f4GvAAAAAAAAAAABAOgBAAAmbAUAAAAAAAQxRyTDkkEkk0UU000/E+0wE0wEEUUUUUEE0EEEEEUED0U/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////STSAS9SSQQRROMKIGECSgAZ3nn7/bz3v3/v8ADO/b////29/7fgAZ/9/n/t+Z73/n4AAnm/9/t7bf+3v/YAG979n/7bf7b//eAB3//P9/v2/9vf4AHfe/9vP/f5vb/8ADvt5/ttj/P3mf/+AB9ttvf+eb3vzf/7ABD/7//Mz/b23v/wAQ7//e37b9723/4AI2/223v9m/2//bwAHfb3/v/2ee3//4ADu8zb///e/P979gAlbfntv9/v//beeAC/ntvf/+b2/e9t4AL+/b/z/eb2/M/3gAu3s/Nvbe//fvz9gAv7e/b22///37/ABd/+zz/fm9729/mACffnvftv/fvPN/4AJ9/ts///f/57ePABP78/b/f+zz9tv8AEv//vz3nv35737AAd9+979v9v3+ZnvABH//7f///v//eACP3+3+/f/t/+f4AH//f57Y8/ZtszP/wAN//7b3+G/8//P8ADbe//b/x/v95+3gAde3vf7//x+//2wAN57Y9+z/89/+234PAZgNgzBttmMb9/n7PzzeGZ/54bDGHmGeZnmZs8PDw88N5/m9jP//xjPebzH7222Y22/ez2b//PbwZg2DMGweANgPAeDYPB4PGx4PBhg8BmDYDYDwGwZgPAeA8AZgDMAHmAHwAfgA9gB8AbAHg2PGbMHg8Hg2MweDYPGYNg8bB4DYMb8f/mNsx48ePHjx4PB4DDB4DwZgPAeDYDxse9v95tvHg8HgPBttmzBmA8AZgB2AMYAxgPAGwHgDwB4AzAD4A2ANgMwB4Ng8Hj283vZjx4MwbAeDYzGwGYMwYx4PB48Hv/zwzPPPYbNmPB42Pe2w2Y94zBhg8B4DwHjbbxmNtsezMz2eeGw8N4YGzDPze9mPZ/5s8PNhmeeb88z/3sx4PAbAeA8AbAeAzBsbBseMx48GYPBmA2Dxt/mZ55mHgbDzYeBs8PPP97NmPY2H/s2Y9mA8B4DYPGx4zB7b37zf73vHjY8eMweA8B4DMAeA2AzAHgDwHgPAZgDYNgzAGwHgzG3tmwzDYHngbDzZh4e/b8bbHjx4Ng8B4DMAeAPBsB4DwHgPAeDweDMAZgDwB4A8B4DwGwGwB4DwA5gDYA8APgB2A8BsB4297Nv/88DYHgeAeB4HgbA8A2AZhmZmM/zeZ/s83jx4MwbAeDweDx48ZjweDxmDMGweNjDB4PB4948ZgzAeA8B4DweDweD9s2/Pze9mDweMx48eDN728MZg/Zt+f5m3h+ze/DbM8bPAe2A8PBn4PNjxn4Yxtn7Z5v/M/N5nvD9sYeMxm942eP9t/72eP/Z+/bNtnjz2/M8w8/f/n5s9n/v8Htg34294M9mx4bB54zBm95/mx4fs2bf/+bf5v/PeHtgbf5sb8Hng94297x7/8BsPB7wGzYD3veDYHgPPH+3482P8f723vee88f4A3sAe8Gbwb2A82A/YAz2A94D3szY/Y34Nng973s9j/8ebPH+DbP97D/fsPef/5mx7MG9vf/tng2eD3tm2bxsDfvebH+NhjAHvBs2DY2A34PeA2zHvAbeA8PAHng/YPNgPeA22zbH+P8H+N+2HmezZseeNmwfsHng97/8fvbYePNsx7z9nvNg2Pe9s/2ftg88H+D/G37Nt/+Z/7PD/P3v8zY9+fnnnvN+bPPPbP8/zY//3/7/Zv35/s9tmeeP89/7HnvZ+fvzPz29tn+2f/h5vfnntmezxs294/83/s94bN+9sP97zY3sHjMeNv2bPM/P2b/f//7PHnnh+z8z/N7bee8M/Z4z8Ns2f+YNt7YYMwZjGPB7G94zHgzG8Z+eY9se/xmN/5n+2fvw3mMDw8zwx4MMHsxmNjMGYMY3tv/Zs23jDG9vPP82w2YPB+MNgZh4eHhhhsDwPAzDYHgbAww8DwMwDMDwDMzfjeMx5sDwDMDYbP2GZh+eAbDMzMwz/3gzBjB4zB49j8MYHgHh5sYbe8eYbzwzMe9+2GDDezZgzAeAzHgzB4NmMDZmDDAB5gDGNjbbDGY8e9+/HjYM9veDYMwbG34/Zjf55vGweN7PPe28eDx7N4DMZjwZgDDBg/2HmZmZ+wxmzHsZ7DB4xt/+eY9tj2z/xmDweA2MGwx7xmDN5s/zbMBmDze9mzM888PD/9mMwGYMY8bexsweM2372eZs3tvHjNmNgzAD4APYMGN5vHjx7xt48Yxm2eeZmZs2fhjMG2zYYZmbGY8Z7MzMz948e3555555s/PPfhsPZjx4zfv29nn5g2N4w8DwzD2GMwbBseYw8z82eb882bzGYPebA2BsDwArAMMDzP88Z/v2eeHgYwAawAuB4HgeAeBnnj/2w2AZgBWBhmH5+Z5nhts35+bMzPZjPeGwDGAFwDwM89nmw/DBmAxgzY3tmbfns/PPNmZ554GZmwxm3mGMw89mzD972/88M/bDYeBh//n+835jZv8zbP8343mbeG37efn//t73+/z9jzP95n7f/m2/2eZh+3+Ht+x+8/z/e//M9n+Hth+bZ5sef4fs28z9tsPP9sP/bw9+bZ7efhtjP8M3t7D37bN5jewz/bGH4bfh7wN+bGbzYe35+xsP9me2NtvMzNv/bZtm2Y22bMx5ntjB+2bYPYzPYA/94YD/34/Z/j/2Zj28ze2b9tn7Y2/e3t79v/9gx5ntjee/e8D/Bts/wB7Zt4PN5vAbfn4DftjYDM97YA2Zm3gB/xvwA7/Y2AHxjb8AbzxvAHs9jYAd+z8Ae954P9+wbe/YD3m8wA7ef4A/Mf4P/8Y8/fg888bAebDbwf434Mzw94N/t4D/DbwH/szAH/tsAe2ZmY/b/Bv2Zsf4PeD9h+x5mNv/bZ7bZv23vbHv/f/7/3ntvM/37//9t7YZ+Nm83nm2z9nmb3mzfvN+DNsNvfsA28eZgbeG3gb2zbA/z3gb8/GH/nsNveeB+95m2PeZm3/nvb8PGzeYZnmMGz9m8z9n7DZ4/ZvM2N5/7f7ZjMxhmAZgeZh4H4f+GwPMxm2bDP3+Z+9jNmf+AYwDDwzZ5sPMP/Z7/xveeM2Hn7zD8Mbew/MzYbDMDzN+w2Znh/mMM2b/NgeHhmZveb8wYGwM8/9hts2G8bZgzb8MYHgeHsweDMY/Z+M3v82AFYZgZmzMe2zH4w8A2YBg8bNns3mDAMwxgbAzAMYBhgGwzNm88PGzHtmYwwHg8ZvezPAxgGHgGzZhjA2HnmYzMZh+wNjDebMeeZmzM8NgGwzN5vAZgxtnvG/zzze8bY29mYwwY8GZvNmYDMGMeN7fs2/2YDMGN4PBtvMGYMwZjbeG2357N4DDAYNm2DMB49jP8YGDwGYMbPMbHjMbBsbBmAzBgzYzAe2M2MGGDe8/wMGYA8B4Px57xtjDB4PBt7eYPBtv/AN4YM2/PeDNtmMweNjMGGAzAbAbH7HjwbHj2P83gzBvf/m9mbM/GYDMBvZ5nhjxnv3jDBhgxjMB42ewxsGYDxseYMDYGHn7bN7eex4zbGbG8HsZsDZ78xhjZnm8ZgzBsYwxmGMx5sM8Me3vfvBhg8G97Zj2bxs2GGMxvbbeeMPDN/m8MYw2Gfje/GGDf+3m8N5+GzPDe3tm2ewMHg3s2H/njA2Yfmww/eZ4wDBgBcAK8Db2Hn+37MBmNvbNmHnjPMYeGz9vZvHm2ZvfhsbPH4xmPeG2bbGwz2zf+G8x5sNnswP8DxmAb8PDwzHhjMw82GbGB48Nh4e2bDzYbDN4b8P8AzPNnh/h7M8PDZsDzYeHm22/e3795vf+/2837Hm/Z+ZjB5vMbDMxsZvMbDz/8P8Ns9h+2Pf/55jYwZhmb8Mzbz8w3s2H7DNs83s8N7fjDGP2eGN4MzGZ+G2xj/YzA2zBtsA3t+wDY9+ez37P82Ns/bfn4bZjYee23+ew8ez3/n7/Z42Hv/P3vf73jzY9vPb/eHt/s37bxjH5tv2Ht7Gzx4z2ZjZse2/2w/xsbA8e3/jw8G/Zj3h43hmw94zNvDw37Z7PYeD3g2eP9/v9/t7B/gPbGbbx4NnjzYPGbe3jeb/b/Y82PbHv88Z+/xsMxnsb8Hng/x+x7Nt482/29vD8237Hvz22ezb8e82bZjGbHj37zbe/xmMZ/hsft7/z/MGwPfmB5s/PwNmbHmbDMHnjz3hszD8zbw/MMYbAM2Yf4B+w9s35mBtvMDYHmxsMPbf7PbGYfmBsDGB79/jbM8zZ7Yf/+zAzeYw82/wNvbeMweDxg/G2M3m/GGMD8wZjbzGBsDw2zxnmwNmBtthjANh4BjACsAwzM8PD8M2ftjNn7DzYBjAww2HhsA2Zs23t+9tt4eGZ4Y89/4eeeGMDM2YGNmxmxh4bD829vbP97ZsDDDzGwMb972bbDbeNvZjPYz9m2w/f5+e/DN7bfjAwbH72e94xmPDzBjNjAwB5g2Hj948BmANjGDMG8eYbMxnmDe8/3mPDBhmz3jD2GYzP9mwMzMbN5j2M8DZnmw283jN5jDGw2Y82ZsDGM2YbMzPPDMwMGYDzGGYMMB49v94YHmYGwAuB4eAeYfvN5vzBm2/zw2GZ5sz2bD2GN+ZtmzDPNgeB4HnjAMGD3njw8/YwM2fgYwzN542BjGfhtvGYP295sPDNm82bzH4M/3s2Y8/P2fnsxmDZjDD//x5vMNmAzGAzbDeZ7zNnhvzBhmZmMDeGNvH+zZjefvew3sx72ZjANgGBm8MeezHsYwwB4MHmxnh5tmGDAwN7eYzB7GGeZ5jDMDYGw8zDeYeGfh5mH+eGMM/M2bMHsb3j2M/DB7YMwGx4DPAGHvGbbMYY8MBgYG/MGGGPMbxmbDx5t+/eMA8wMbDbDeeYbA8GGfmMDwwwMYZ+Zs8e2fvzAZjYzGw3m/xs94/BmGM3jzxmMHhjDAHjBhvP/f5nnvM3ns8eGe3h/+3sf+wDDb379veB/sbzf+GYAV7M3n/7MD/bG2ee/A23+bfjx4Ge9+f+2zeZtsM/GNvb2e8zeex7eZ+3+9+b2P/M/G822wzb88GY/9+/z3/sb8z342357G228H+Mbw8b82P35t49/g/97zY35g9tvP9mZtvM3sPe3sZ42eM/22x7b/3+fg/fv9+8YDP89j/MPYD3t/7eewZ+22Gbbx4Df4eNmHn7B72/f/7Ae3m/978Ab979v28Abb/M/B5mMB+22/9vwGPP897/wG23542GY/AHvPb3n/gN+237efgD/N5hvfngDY3nt7b3gDPZjeM/P8BjHv/f7eA//ebb/YA2/2z8zZmDHs83vP2wBt7e/z/MBjf/j/PMwbZ7/2exsHnsY9tn7GAz2x+fv/Hm8w9tm34Dz/bDPb/Afvx/5ttgBz/3m8zxjADhn/jwM3mMYAwzf5t4zD2A3nt7PHhm9nnn+/b//2ftt/tm8z29sbz342zMb2bY9jfv3+xn/tjft/+2Zje972xnszwb8Yx4wYeHmZ5ngMw8ZmzzGN7AZ/s2DDGB4GMMDD8xns8Nm8/888/NmGDMMPYwPMDf+MNgYYGwNgBTDDA2GH/m2ePDGwzBs/YZjxtmN5seH4zG8NvDeMwbGxmDwezGMZ7GGxvf5jMPGw8YeZn+/Zv/eD2z8ze8z957PYbezzw2BmzG2/MMGYxtmY/Bjx49tmD2MBmMYfhgA8DBgMP8zw2A9mGYPAwfjDPMz2/B54NgY3hg3+2Hthv8bPN/7bMGN54zx+eMNvGMDAYzGewwbAeAPG2YNt4Y8Btgz3jDBjY8zHh7zwYGH5mwxmAwwGDHjwYGAMbGY2YAwDBgMBmDf5jbwxh+e8/YGN4NgYwYwwGY2/GMMY2zzbA8eY3nsb88ezZjYwxvAGGGAzG2zDMzx+88YwMB4DY22/MZjbG9htjxs2zHjY8eMxjzAfjZjf7M2GPZtjMG2eDPbM/w2YxtjMGYDNg8xmDYwweDYPGxmAw2DPHtg97NjHj2YM8eG9tmMzZsze3hjwYxmMeYMweDwA5gweGDMweYxmewYYMfmMYBg2wMBsGYNjAwYxhgDwGwHgMMAbAeANj2GAMMAeAwbAMAHmAxgMwe8BgGAHwBjBmAD2DYxs2zDZjYxgMxjM22DAPDAx/v2GMMDxh4Yw3gYxmwPDw8zfjz3hm2GDwfv3gbMw2MA2M2GMMwArwzMbNme94YwxmAx5jftmwzH7Nhm882eMwPzANjYeeGzYG2w/fmz2YHgbDzZ/hvfjef5gMMDPwx+NgezBs288DM35jGZsD3g89j/w2zY/9ve83vD/88NjZ73jYfj/zMb95tmPGMGe8zMMH7fgxtmZs2NvfsbeP2Dx7f57ef5tmzbBmebf4349vMb/YzDYMZnhjGPA2DxsZhsZjYzNjx/tjNsbMxsbGP2xtnsHgP9sbGbGzbHtjxv823mbzG8Y37BmNs9vBm3v/Htjz/A2Nh7Gee282DNsH7Bn4NvfjeGxmNjbY97fth7x7ewb2N5swMZ72z9szwz2bZ7f/tvZ/v35j/Dbz3jHvZgZgzN+eeMPHtvDYzGx+2Hgx4Pwze28zbGPNm2/2z22Yb2/e8Hmx7YPNs/Bsez3549seGYNsxsGf57D2/eBjePMz2eNmDwYw2D/GG9szG8PZ49t/jYeNmGDHmDf7H+9seP9/72/Y2Mx7GA34A88BtmA22AP8APjYAw9gNvAbZgB9jADhvAe2A9sBm8Bs8AH54AfBhgDGHgNjDBjGwGbYAfDYwDG2YbGPzwZm8/PP882e2fh7xm2Zt4MZt+2wAuPbGbGDxn7xvMYw8bDA22bMAweb/b2b9t5+zzZnsxgGBnjM8AzDA/zYw2BsMAKYNtmGww/ZsMxgHgZhgzAwzDYZhgb37YZgwwPYYf5mDP8x4Y8wYGeGGMM8w82GbYGMDACgYwMDezDMZ794/3/h42ZsZthjzBmMeGxvGbGDNjYPAzGeGAbBgZmYGYPBmMBjGGYHmf54ZhgP9vzbACsbDGwYYxjPBh55jPGYebPDDxj8xjYBjBjMYzYzGPDYNhmPPZ4ePw/zwYYbbPxsDN+2YM2M2wNjDwZgN+DYzB7x7GwMYze2BsZ5mMMY8wGYMGwMAfjAz8bZmfsNg2AeAwDMDAYYGGwz37Nns8Df4beDMw/MM8MHgNt4eMA8zM9+2M34YMGYGZjwY/YYMBjPzeG2x4AVgNhsx4M2NjYex7/A/NhhtmB+bAPGf4M9mMzeDP/YYzBg2GNjMHgzYDYGDNtm2PZjx4N5sYzNs2weZ7NmGNs3j9j835jee89nmHjMzYZmGHntmGDDG89h/nm2ZjPNs8GzYbHv3sxnmfjDMwzAwxnh+bZ5hjDGPMZv/DYzNh7GGN48De2GMMwMDM2GwZhg2Mxm2294/MftsDzwZm8NgzNnthsHnmefnjYeAw8M2B4De88BgYPHgwxhsG82Bhnsb2ebB4fjbGHjMZgwxjGZj82H+Y2Bhg/w2Y2NmbMxv28BsePB/m8xt/n/h4/GB4Nn4GYZsDD8Z+w2ezMYfvbe3g/YbzbeAezbeB7PYbA9vPYHtmPzNgwz2YYbMMzNvMeYz9mPbz2e282zf4GPMefttnj9sYzPZ4xjZt4M8bG9n4z35t79//tvZ5t+Bt7/2NjN5jYwb//Ae2e8B789gDzzZhgN5m3gP/bYA/Z7YDzH+wZ+z2D2wPzH7Db35m2NhtmPMbf+MHv/MYxs8zBvHmeP228GMze9vbPxtjzNjNvPYPf54Pzz8f4M8eHjZtszbbbPZ/jz/2PYPzMefje349s2Zjbbw2Y3jY/9+xs3vft72xt5n4M2zD8xs9+befm234xmbYx+3vzZ7MbbP222Ztt7/f//vHhntn5njGee3/mPP3sMD2xth+bfjzMY2Z7e83+bM9t48w9jGe/Z79m/3nv8/ez89+b/2Zs/3s9hvNszfs3mBv8Yzwfm95th578zbzbee2bYbZmN5jPH7DP8bw37f+8P9/5tg9vPYwzf+PzMbMG3/4N/sMwZ/m8G3s9g37PwH7H+D/PbGeYxtjNv8xv8G8Y/f/7P/PYf5+Nn/7ezN5jbeB4AzDPzzxmYYHgZtmN7zM/eN4zM2zBh7DHs2AYBgeGMM2ee9h+zew2ee9vNjMeGGDAw8GYb82zNgzA2eA8AwGYDHjGGNsxjw2BsHjP2BsMAK2ZngPGM2z2w23+Z4zM2GezY2GPPAP2BjwZjHs2bYYwMYxmMDY3jDbGzGDDBm/2wHve9hgDAwGAPDYPxhs/GbYwweMweANsY9mPB+bDewbACgzMBgzBhgMeBsxmM3+wNg8AwYY2D37B+z2GMHnsMMwYwPYe8PM2bYw2MM8AxgDwN48Hv3/m/Mz2ZgGAx4Y2MDe37MwYwNtjZ+e83s9+9/gGxj/MDHhj8PA2G8DD2/ZjBve2GwwMxsN+M8MDAx5t+YzxsYY9hsBmzAMBgz/PYbDGAHYbB+wbMzzMGGBths88MH+e8PMbN7Z7DYYZgG83hjwzzBhsYPeGPDwGbPGbYYGYNhsGMzNh4x7GMxmMGw/zG97MwzB4zAYGwB5thsM/B78Pbzz/YY8Zj8YBmefswNjMYGBsZhvA/M8MeYeMDMYGMzPzMGZmH5mzNngYMAw2GbMBhgBTzwMYYGw8GGMMwx4ZsPDDD/Azxhsww2GYMz8zHgbD37PbGMxhh+MM8e/Dw82ZsD/GMxgwNszB+2DAeM82eDbDYGMYPHtsMeD2PBs3mA8MYPAxj3h+DDMHmYzwNgZnswDwwwwwzwwebMDe2wfsNtjGBmDzDZ/48eGzHm89j9vzDGNmZtvMNt5mwx5jzHjebZthvDDx4Zmz23gbGz2x+MP9vMbZhtszHvYw3v3jxs/w2DMDGPDMbGG2AbBt48G3s3m2ZvMYZjN7MMxmw8HmzPe3gfmPbN+be2zP8Gx5488G8MZ7Z+2/PY28bfmbNj83vGeGeGH/mZ/v8zGZts3/mfhj95s9mNjbDebDwNn7PGewz28DzZsNhjNt+bA22DDeG//x4fsNmw2B7Gwzex5sGMzZveH734bxhv/3v9s3j8zb/zbPDw3jNjxnsZ5mDz37zf+HtvGbDfj/Y2AYYPMxm2PB43+8N7bYPDZ4xmbw3+wzPxnvNhm9jZmGDZvDNmZsNnvDNj2fsbeH+DNs9mHh4bZ7M8H/+Zn542HsN7Yez3n4YPNv9n/nhs/Pe83njYf4BtmAfmB5sAzeG3mMNh5v/3n+x4DZvGN+x+N+3vM94w9n/vNjN5nnm/DYPA2MwPDBmw8MYDw95j8DYMZnvM8DzMN5gbZgfmGNhgY3n+ZjAYbbDNgz8NsDzP/PGe2Px4GDBmeDewYGZg8YwHm3jPDN+e2/Zs2P2HvD89me89s28MP8Z4zPbzx7PYeGzwwDHvG2B4NmY8A/YZjM2eNvBnnmBgYwDPDzDZhm/MzeM8DBm3hmNng29+97zBnmPGDbBs/MMbMGbYYz/9jwweYMPMDGbGGN543thgzzDAYYBhvA2NhjGYZtmfjDPYYZjAwwMHgGZt+GAwMMwwzb829hjZm88Nmw9gYDDe2GGbM2fsD9jDAwZmDBsYMw37A8PMMwxjGMwYeeBswfgZgGYHgGeebHjeMZ7DN4GGGYwzDGGHmY8x5gzMMPDG9t+D2xszMDYw2YGY89+2z882BgeGM8w/YxmDxmMzbMDGHm8wz35hmYPMPMBmAYZmb8/PNh48x7MZn7D9jNhmGZjeH5mPPAYYZ7MwBhngb83/gGDBmZgYwGHnnvzMGYBh4YBhjYexvBh+GbDAw372G9hsb88MwwY/DP2ZjAPMeH+zDA2YwwMYGeBjGzGeH7DGGZs8DZ+MzDPMMZ5h+Bs8efnh7zwArB49nh4GYbDwwGAYGeYZ5sDDz88/PHmMzM8zMD2ew2DM/Dft7wzbD2HsxnszMbPGxjMYeMbG3gx+NgwweDB5hh5s2N48BsYGAx4eGeeNgeGwMDDAD4e/DwzDZgbfj8YZsZsMNjw8DGPDZs2Z4wNgzA2zMz82f7DHjGPzZh+GMGMNsYYMwb/wf+8Db/Aw9jbMBmZhhgeMw3gxsH+eGBg2BmPPGAZhjAMwzDGH+N5jeMALh+MbMft+w28b/G8zYAEwzf+f/4f+8Ns8eG2Btt+2/YeMD23jfn5tmNje2/Nj8M9/vw97bPbY8ef+zbGe/22Pb8Pzb9+e3mzbbzfv97eZ5m2bPb2349vBt42PeN+2fvZ4Gew22De/2zYz2/Z7e/9+AzbzP29j8/2Mbe/MzB5v/Y8zzN7NvNjbZ+/bf/5hmDfsz2z2343vD9t/5h73+xs28wBjbbNs/M/DGD8ft7eNgD95mbz/Yw2/e3jfswA73szeP378DN5n7/GA/bf7PeMb2bzP8H5gwZs9//5sb8NvN7xvwf+28ee2bz//8ebwG/3t5+2f5sZ+ezewBnvbNntn+95veY/8B+/w/D95sebfvH/sB/5mez/Y88zb897eAHbb9+GZvw/bMe/b/AD72/2Z7PGbe8eZ+3gDM/P2/M8b2b8/Z42YAz/PG/f4eNvZn79sYA8z3s//b/Nns9h78bNtmZjMPHmN7PPNm9sx5h7ZsbG94Gb2zNsz3mP/z9/5hg3tv//zwzbZv9jHv9vMY88fm3mMMA8GBgeGHmxgPNgw2eGzDN54GHjBmBgYYYGBhgGwMB4ZgYB4GDAwDwzH54H7APA8wAuGGMPDGGzGZseeBm8DDDb3ge8ZhsDGGxvGDw2bPxmDN7BsNgMzHs83sDM3+wNm3jPZ7bD8DAYH7e22Yzxj3/vDY8ALngwzMBmbDeNgzGzG8YzMYeeYPAeAwYwYwzBjf4NngbHgeYMGw8NmDD8zYZvGw2Y2wxgGDBjAPx7Z+2wbxsx4Yx+GYAcM2w3h7wGHvMBgYDA/8YGfhs8bDDDBhsMzGz8ebAwww/GNhsZtmxjeZ7ebxjZmzDPzBnvGGbHhv/x72Ntm3gYwwYYx+MYDMHg2AzZjDGeb94f4BvBvHvwZ42YxjZ4zGYwwbYGGDAMAKAzxh4YeZ5+BgBzGeH+DGwZgw2YxgbY8MeNjMeAwDGNgw2zYPBvGbMGDG97PBse/2e8NhgwBg3/+w2YNtsxsGwf/7GGD9jYwwfswxsx73+bx7Y2z/MYGN7wwwwYGxnv9gwwYYBs28AZ4GBt5mPbDBhjMGDB4MwYxvDGMGMBsGDBjG2wZjA9jwBjAHgDYDGDN4MGP3mzbzYYMxjA8wDGMHjMY2DGBgMYMMHjYwwZjHs2AzGx4MYwGMMYGDwYHgPDHjH+GMZnmY2bZ4zBtgPAMY89seAFMGH4fg/PzA2B4x+MwMw22DZg2MZ+eb22ePHhvbMeBvMM34fhnj82e37B494zYDM35+bA9hnh4Ybw9mG2wzMwzeGzMNvMGHhmHm/N7w3mz2zGbZm8e9jYbZvzxv2eDYZhvGeZsx/nh+zb3nsbe37zGNjZtth+zw2fj/bbMxt/hnmzPHj/M2MAz3v/e/xgZtmG2bY2GxvGPzbx54Mzb2PeZ7Hj9n+Yz9v8PZh+x7zHgG3j2/bePbH57xtj/Z/4ZvDwx5/5t4e88//8MfnvDew2/G8z/GeeAFYPxvHv9ttv8w28M2Zttt4x5j823htjzYxsZtvNsw2PNj2wGzYM3gMZ4zeA2eA8bB4e8ezDY2G3jxmbB7Y/YP2zbYwNtj2w972zMb8Z4x/gxnvA8YzxmGx5see8e2Y3h7e3sMGMDbPMeMY222GMG/YbY9sfmDYePe37fj9+B4zHse3mYeAwwwYB+/Yf/t+Hs//fsbNt+DbGDM8B4zfsGxsBszAbPAbB4xngNmxn434DH43jGfg2HjD8GZsH7Af7wbG2YDZt4xs3jYbBj8B4eANvGxsBm2D2GDYbe9mNj/GzxsPBn7N4M3jebD94Mzxs8zz2HvD8YbPDZs28NhszD2w9434b/eY2YY88Mw2PYw3vZ5v9t7H/4Nsxv2P8wwYZ7DzGYYGMDZh4ZhsGZhmBgwzDGAYGGwMMMYAVhszPfgbZ4GeGYZ/4zP/8GBs2Gz2MA2PGwMYwwZhsNtgDDMw/PDeAzft/+M2/A/PY8YZhjMZh7NgYYGwweePA8YzezMYGBjDGDHjHngZvAZ+MZ7wZ4Zts2/3/jzeBmHs34M2N+Yw22wMDYbGbYbBsAwxhmYeDxhgf/4PHtszwx+eBjDMZjeHv2G2YZgeD8wDeDw3gH79jANsZjGZjB55sZjDDzNngzZth/mP2M37YBmBjzYDwNgNmZ4DbGNtmNnhgYwwePB4NmMDZjPMYbPxjMG8x72YzGY9mMPDZ57wN4wZvGDYYYzGGNvBmMGMNj2Zjxn+GYzA34Hse2NsbBt5jYNt7MeAbYeMDzMZgeb2e8DAeNht+fmM8ZjZgeeBhjzN5vMeDwz8/3jzYYzG/GMbwZ5vbYzNjNj/M3mPMbD2Dfs2D8NgYGeH7exn4P94eeAzDMDMeebZgGx7zYYMMebYbBjA3mHjYGfg3mzY3szNhjx48ftmMxme2GGw9h+G8AxgGM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geGbw8PP/wNnjDwzPYG2Hn4bGwHjNtvbxszGw/w8zDbbY28/G8N4ft42xhhmYMMbGDZjAweA8b2MA2Gxtsz8PHmzZg2x4GMYz2zYZvwwDNsPzBmHhh5hhsx4zMPMYeGwx5mBjA22f5jMwbGGB7NhjMeYzwH5gbBsN42bfmMPYMbYw/PPDGeDNh+29mwxmbGP8BgbGBs8eGwMNh4DPzDMePzDeDMwBswzNhmHmGB+AeDAPAww/8Me3sb8YzGbPBgPzAebMYMMMZ5jwHgxgNjBts/bP82M28YYZjDDPx5ts2Hj2B4z2ewwx5+3n4HmZjbPZ5th+82fs/2GPzf5vGxvzb34e/YP2Zn5m9/ve/237/b8ee8bb/b3tjf/t54Y83sxs/be2Ybeze9v8zzN4//fh/+2YzPb/bzPD82PebbzDGDb8NgAEWN7zw/MM294/28PZ4bft/+8/N+G3722Zn73g22wbM3n735n+D897GHn7Zntt4DbbPZn7zYN5tvNt4Zsbf7bftvb/DZn7fsfvzH7fm2D28bz3t7H+/x+zeMGM2fvN5vbM9tjzP9nhmf7b3vMZh7Zn7bebf+b3782Y2PMz37M3/5549sZh/4xm/9/n+YZ7Gzzb3hsGZ549vbYPzx/mwY/fmzY9nj288/zf4Ns//NmxvBm/z2HtjeA2b95/78G9+8/9mxn/5t//n7/e88bZ5nv2ee97Z42GfvH72/e2G835v2bfjbMzxje/8///3+eeGz//Z7/ewz/Bs2e9swDA/Nmf/vGH5tsz8xjeN+MbMP37YDHt+Z555mN/szZmw2Bmbzf4zbN5gb3s/bP94zZs9hjDYwwbN+MzM/MNs3n7DYDfgPA8MNjA9mMwNj/wM2DYx5sDDM23njMeDDezGGM3g8BgYDwY3+M2xsGNgYN4DGN+e2bMbx4xsYx4zY3mNgBcHgbGGNgeDPM3mxmPbYYwMGYzee837AC542zzBhjwPYYew3hsN+M3gZg9mBsDAewHs8MMGAFMH+/H+PMGbGGDBvYBjG8e9jH4Mw2Z7YYMMMx4Ac8z/MHjZjx7N+zZsA3jYzGwb2MB5/mPGxhjBs3jYDPBtmAb2MzYA8PMbA8Pz2GzBj2M2YG95gG28Hs22Dw8HsDYNtsDGbAeBhmwzYMNmx4PzAxjb2w2B+bM2Ht4NjZsPMD2AzH+Zn4eZv2M/DzPezDHs/GMM2wDH+G8bHgA3MxvMzGGP/GeM9jw/H4M8MZvNgP/MPYYNgM2/GZvN5jYG82YwZjD8xtmwM3j9vBnt/h+PHnmAbxtsY8Mfv2PMYwbMPBt+NtmMDGDNvPPPM/3t5tjG2DMeYYNjGD2AxtgzMbPZ79gbPMMB4bPNg2bBv23mbb82fsMw/bD8b2fjbYGzGAx+2G2zZmbAMbbxnv2/8xtmzwYNh7xsMZhmD3jxmD8PMGGB+Z48MPwDzwxn+NjeDGPBsGGDAe94/8Zm2PxmN4PzMbPYGGbN/jY2YZsDMNs/DB/gw8/M22zPZmw8zxtvbN7f5m2H5nhm2HjMN7PNh/h/vMzePw8PG3szGxnm3+35th73h42HjM/9+w9m/PMNmzMxtsMzDM2bNn5ge/3sbPY2b2z8bY3mH7ezMZtj97zbP3vZ4xm8Pw2f+N5/7Db2YbPP2x4YP8eeNtv2M37Bmze9+fjM2NjY3vzb/w28web2fg2zbebYNmN7zxmzBvYDG8BvwHmwGD8B+GM82zPM8z9sH/+zxttv3h7x+Zjz/YzxvMwHhsD89vDeYzGM22Pz94ZtgbZj2zNvx7b2GzM3vx7Nn4Y95nvHvY8zPPZj29sfm3jbDeNs9j/9jMwxmwx5vNmZvZvPGY8/bNmGY37zxvPe2bb8ex7GwftjPz357ezzYbf7GZvNjb8zBvPZsxjZ+Z/437Yz2943+83tm2/GeY//bPf4be9j2PDxvBtj3nmHvfhv/xs3gZ+Hn7H78xttjP9nn7YbM8z3+M8zPP3+bGzP3hh/hs8/w22GzwD3gH7A8bDf7YzZv34wMb3jHm8/DGMz8N7PAZ72/NjHmYebG9+bbPM/HmPYZmPzww/M288PAZhjeHgMwP8DGHm2zM8GxmAFxmPD/BmeMw2MMHg2bAZh4wMBmw8wZs97zA8GzNnn/swP2fm2bNhj3+YzPD8Y/8eYM2GAwDA88f4YYM2Z4MzGYMH5+ezPBmZgZmY88MYYbPbD8M8z9gGZ5mw3+8zeeDY28bMzfmbz/GwZvZhm2YzMNgGzYDw3mDfgbbGGAZvbPDNg8Z+GGzZmPDz/D2zDeYGBmfnmMMfmeGGY22zZsG8MZhtjMzMGDMYbBsxmDBjwbezB4wD8ew82G2YZmxhhjbebYbPMzzGGDMzGx+Y8eGf4GMzYe2Gfsxs9mZ7BjbYzxmZ/mZv8Hsw/wzDPZ78DZ7Pz8Axh+xhvNmwNgwwx+BjM/xhsZgNmzHt4BnvbYBsDbZ7DeBhjMM3hns2DbYBsYZsNgbYf4bDZj9jbzAexnt548zA9mZme8xmHvPN4zwbAPx4/3sw3mw29jHgZjMDYD3vMwwext4GYZsNmM8xnmG8wf4xj8NmGwBjA8ZgxmDePM3s2YzDweN7Y8wPDwDZsMwGGBnmGH4GMYYwPzfhsMMYZmDMGGDPw/PAPzwNmBmG8NtjwbBjYYGwM8w8MwBjAPG3sMZmzANmG8N7DAMMA2ZhswM2Bh+zAYeYBmP9hjfgN7zD8zz/PYfnveMe949jG88Yw2AD2ezBmeDMDwDMbHh7DN7bMzPx57eZ48ef+Y//zP9+Ztm9mNjDHhnmbbGez297bYeG3vxgf+fgY2/Hm22ew2zHmwNs3vNjYeNhmZjMeB4wHm2bbPzP9+wz3htvxn55v/Zs2zx7Zt+9vYz2e22ZvP/GMPMzP2HmzeMNvY9h/7f4zN4zfvxmP2z23+8x4zN422GPxjPDzzBmGY2e8/Nnt+2eP9s22Nnm9gN+zGwHnm9gDzY/YDZjb8HvN7Z+bez288eP/2294z2378zM28bYb2Pxs2x5nt/48zZ57PYxnh548zbf+9v343sDZ+237N5se288b/bGGbGP/zZ/vH/gb95hm3hvf7PfvNtvbDGb9t7b/fn5+b/b89/vezeZj9vD/eZtnszf7z8wZ79mbbN+bPDPbzPbZ+2/35j9m9+zz3/ve/z942GHm2Z5jZt+8zPezPPz/PbMe9vf5/t+eee8P2z8z2/z9veH+/MPbZvMPwbzPPZmP2zbZjY83mfn+YMbMGPM8zxjMPz/zzD/ez29+8zx+NvNt+BnszH555t5j2bGHmAYMPMDMPPGYHjNgYww82G8wbPBhnmz/AzPMMzB7N7xhmGPPxgYYwww35hm29mDAwYeGwNngbMMPMfmAzwM9h4bMYZh4fhhhnhgZjZvxgeZnvDHgzze943nvGYwBjGzNmZmG8DZ42BgxmxgbBsMzYHtmfh5ntjDw8GZ/hj3mB4Ngb8AGm8A2GY82B/tvzeGGMx+Z7DDNjzAGMwY8HsM9jHgezf4zDbNmD9/sewMPHh54D2YzZtszZnvYMN+YbGDbeez8AwYNmzwxmAxgzGYzAZs8BmBs8efvG2DezGAFYxmwYMNj/ebf48zY8YzMw8bDM83gwAoPGMGbPHjH/jM8f4bPDbxjw22zZ+bw2BmeZhhmZsAee8MNsPDPbz3h4eD8f/57fsZm/w37zA2HmBt+YB5mZtsxnv3mMPAeZhvxjb8MZ7GDwPYDDYxnh+Yz8xvGYeBszwwz8HnvAZgYGMxhvMDZmYwMGYBmMz8ebNmNgGZmM2ZmYzb/2ZvbDbx4ZmPZ+YBmfn48N+bxhs8Gf7b/Y2P28AxjM/GY9/j2PfsxjGf5sHjZsZs3thv/NgY/bAZgYweN4bw8eGeGNjDBhgZngw/bNmMxthnmz2bf78MMfg8DY2YPbxmAb8MZsMGNm2MMebZmDYYzAwzw/M/xjYwzGZ/vbbGbGNsN/t+2eHm2Z7ZmDzZ+w2Y/NjM/zYebMf+ee2bGwzbPeG/PHntt55jYPNgZhmNgeDwPA8MN4G8w2MYGewDHsDZszYzNsM/MzGBhthnsP8MeYHjwDzwD9mwDYe8PebMGb8MH5sN+M9hm29s/DD2wze2bDHtn/tjzzZ5+z8z8z8z9mMzGzMP22eG2b8fmz8/DzYefvZsfmB+fm3mzM2A8N5mzw22e2bbN7PzA3s8GzMxnjew2N+zZ7GxjD2fv/zbzx4B+N5+bN4PZ5nvM29+Dzf+M9795s355mYz/8PYM/Yz8xjzwG3jZ4MYGbPHsYf7Pf+3v28w9vbPxmZ54Z+ZtnmxmeMwPYwNsYbDfnm/DeMNgeZ4PG/Z434ZnmD83hgYYbx7MYM8MPY/P82Gew/xmfjM2Zv9vM2/DzG82xhn5+zxsxvN79s/w/PwP/3szezYZm/z28Zm/PA294zeMzbNtnvP/Yz29vfmbzNm9hvPZsbPPef/vz3t49jAwx7eGGPDbYN7N+82zYx4wZgZgNh4A9sHgD9jM9+ew9sDbMMzGbbMxt/sZ//7Nje/9+NjDMYw2MHsw9vbPx72e97zGHsxsYwGMZvMzN4B/vZ4YHgbACmGYGYPDeYPeBsGGx7N42wPDGMYDB5vGweG9vGzexjeG8fgN+BmzGeH4MbDHvP8M/YYMPDMMDA8AGmHgYwM8zAYYYbMYBgew2fsMYGBnhgYbMPYYw2YYfsMYGYYeAPGw2xgzf4YZs2ZgbbPAxgezMPGePDBm9jDYYMwNmw8MwzzBh4f4eZ5mAZj82YbZhthmYzeZ57xmHh5jA34YPMw95h+ZjMD2bDAzD8MZh/gbYw2BvPDMz3swZmeebPPYZsMDMzfh4YGfn+Pbxhvx4G9j9mYDMe/Z/jeMPGMAzBsDYNme/GfgwwYHgBRgZ7ZhsDMM/z9hsGbwb88GMMYYPbAZgMbxsY2bAZj8PAMwwwNn+Zt4zDDzPM2eGGbDD/Dx7ZsbzzzM35jMDwMPPYMw/MAzGGYGzAzxnvGZ7DDwM2GeMzw8DwMzzPYYbZmwMZmYzH+DDDwMNmDGzbwzDPwzMP8wwMxhgzYeGBn/gw/MxmBmZjxmYYGbPA3sweZgH5gwMzZhg348bMD83jPwYZn4eGzzMxjY2N5hmDwPzeBmzDxm/2GbfsMzMGGzNhs9mHvGeZsfmA95mAPDGGzYezHgbePe8A88DbzYYNgMwGYwGNjxt4xsMY834/wGAYGGZgYBsMGAZhhhgYGee8bzHh4D37bA28fn7D2Zh+2bGPBm95gAdxv///N+2//Mz3gAb3///v9/5v/fsADvnt+/zPe9/n7e8AD7P23/7bN/+3v/wAP///7f7//f7/wAQt///vz///3v8AEPs/e3v/f7P//2ACH22//beb//z834AI3+3v//f7///eAA7/sAA0kb/9gAj2Z//tsf73737/ABK3v/95+9/7b9vYAJ/P3+/9/vf7//ABPv/f+be///28/AAf//bf79/v9+3vAAf//37f7/fve/2AA/t//nmf+29vzf+AAK7xtvP//e372/9gAP/v3t7//z3vf/gAv/v9+9/v////ABffvfn7f7//f/4ALv/f/v/9/5n73gAv7/Z5+3v8/fv/wAX9/v35v/b2/f/gAn97/3//ttv88/wAS///v/f79///gAl3/v3v3//+z/8AEf5sf/m/P3tv/z8AEP/v97ez3nn+/9gAf/fv3+e////22AB9vb2/b/Pe/f5v8AD/+3s9/7/e/b/94zB4PHtjwbHt//+eeHh4ef54ZnmzzwzDwNgeBmHh4eH7Dw8zP//PM/ZmwPAzNmYbMPN7283/5/+9m94zHg8HjbMePHtvHjY2PePGY2DwePBmAxgMwHgPAZgNgDYA8APgPAHgPBsZg8ePHjNtmDY9+xmDxsHg8Hj95/mwwbHj2xm8e94zB4PB4PB4PBmMb8fhsPNgefhvBmDMGMfs3mzZjwYYPB4NgNg8eNjMHg8eDwZjxmPHm283+zB4PB4PHjx7MeDMGweMxttt/hs2YZ5///jx4zHveMx4zBmA8BsHg8e28eNve9/hs8z/Pzf5sxt48eNjMePbebDwzPDM8z8Nh54Z5+bYbbMZg8GxmDwGYNj2x48ZgPAeDx482//88PDwzPNnmw2f73jG9t+/zze9hjxseM28x48Hg2PePY2GPGx4zHjx48eDweDMAZgzAeDYDDAeA8B4PBmAzAeDYDMGY8bbPDzw2B4GYeGf/7/eNvGGPHg8HgzAGwHgDMGwbBseNgzB4PAHgDYAzAeDMAeA8BjAbAYYA8B4DwHgDwbAeDYNvft+8zzw2BsDYB4AVgBcAzA2B4GZsMzw88882f/vG83jx4294zBse2PG3veDMHj223/nmzGxmA8eNj23j22/8888/P3ve8bf+2/e/zz3nh4Z+B5s/wz8Dzw2bbD3vz/fnjzze/D2w35/n+e8PebNg2B4DxmPf7GP3m8PGw2f4eft+/Zt5/+w8z88N72ZszYf5/737M29+3nv9/hsBsPzB4fs/Z7w95vez9+f/nn7PeB7wDYbDYbbD3+/ez/Z+/z2w2DzwG/H+//Ng2Zv294/wb9//55v97/9tmwe9vY342ePPHng897/H/7exs97/e9/sw9+MP97e89+P3mfv/2H+e/2z3v/bYbB7x+wf7zb9v9+3mwbPB48ebB4Hjb3tv28bHnvPBsPBsNgP8Htjfs/eb89mf7z/DxsPNj22/b2P8bNg8Z5jMP3vbYe8f5/7G9gNvGfv/3t+NhsHvB/j/bb/9+ZtnjwPeHh+zY297zzZ55+ezzf+22e9/tj//e/b9sNve82373t+xvee3sfmP8b9mM/e889+2ZsN+8P2b89//5t54/Y9+fnnh7MNhsz2bNmf/sft7Nt/vP2Gfnmz/P88834GbwDzw/Yf4HvA2ft57Zh+M2zGeeYzw/3/mwwGYDwbe97b3sweP3/g28eNmbMe/GZnnjNtm3/+bDMP9m/P8MZg8B42xjM2Z4bZ55/jMbbPPPM8283mM2Hh4eAeAZgZgeB4bDMzDM2bNh4HgeB5nvNmDMG8YeGZ55+MzbDYZh5mefmbMx4PBmDMHgNg2NmzMDYB4HhmZ/5jDwzMPzMzww2Z73hn5gMwA7AGxjZg9jDGAeH5gM29+ez/PMzNh4GZ7Z55mZ5gzGxnj9n5s8PPewx+PZsM/DeY8Gxt//7DAZgPGMxmwzNhsPMNmw3s2/GBjb/P8zYY9vBhmef7xjBseAzB4zezfs83h5jDG9nmZszDzM2HgbMzPNmNj3//sxt+97M8zw2ftm/8/GYMMAZgDYNvHjxvN42Mx+NmN78xh5vwzNmYMwGMbNn4bMbZjZs8/N48BmNv8zzPPD8z8/Nnm8xhg8bfs2f+zPMHg8G29gZhmZvGYDMBsYzGB5meeZh5/7N5jMGNsNgeHgbA2HhmZ788M2YzbZ+bAxgBWAFwMwPANgGYYZ/vYezGB4BsDDPM9+eGbPf7/3ts3v3mYw2AeB55meeHh/gzAbB4MG9vPNm8bf+M/zw8PDMwxmD2zwxhm95sw3vbYY/Z4ZnmYbA8DZv/M8bPfgbeDN4b8Peb/3htvz9+bf/7f7/PN+Bt429+b3+89sP3vxnmb823t5+//3nnvee8/9+e8PPf+2/8z3/mbZtvz8eYeee8zPPb9/+bbN+e9+w8zPbN/+zN+/D37Mw9sP8Pe94bb89sYw/2Z+2x4Nh+b88eYPe28H42Ye2z/Y/b2wZ7z8G/zZg/23jz/eD3nmY37M2N5n7Bvz2wf4zeN79v9+bb/2/e2Zt5m/G2zbYPPP2A972wG3s3vM9j34/2PP94PPf/7ePHtm2x7/2D/bbbM89jb37zPbbbZ/7bw/Mf4bbB7Ns2/f78///w2PGZsNtg/e/f7/GNv8x/m2wHv34A/3+A23mzB/v8ee89572xn/7bPf4zYzzwbG/8b9vx7/2P9t+f+bG/Pe37PZ5/mZ73vNs9+b37YHmb3m2zbz3jNsP354Bv2ZmBjeH4wD35tgf7x4Bt+bYGzNn4bbZngbebzA8bZmYftvwPHm/DY2bzAz834fs//eP2f488/zxs/w29mP9+MPDYGYGYbA8z2zMYH5g/Z5sM2ZjA8zb/3t+BsM3mzPw2GH/5+zHt+zZ+ZvDfhh5gzG3tv22GDAzMNhj9/vGGYYwzMx7GGMPMw2ezH5szGBmeG/3mNvzBmMfsMGY8MYBsMzN48HjYNvzGbYz3sPAwzM/94YzGP9geYY2Nvx+2GMDw8Dw8DYYBhsz2fmDNjZ+ZvAYYA2A8AeDGNjPYeGeG/GHgbDP/zA2BmBthjGf4wwbYzw888NgHmZ7DHgzG3vGbbxmNvPM28xm/YMMB+82e8wGYNvbGHv8Mxn5gDwbeDAwbbMDGYMxtj8zf+PP/Bhj/9mPNn5tsMbAYbGGw/M/2bY8eDxgwzPz95/7DYZnhhsDeD8ez8zP2Y8GbZm978PM2GwArMMZt7Mxm2zZjxt7xmDYMY9n78xmNj9mzPb3vMP95v89mwweP9vZ/szebx4NjYPAexn5jweDx7Z4GzDGG/83ts9gzbGx7xmPGzYZn+fh7Mwzwx48HsGBjAzZsYeB5gGNjzGGebMHtvZ+zewfmbZmM3nmGZnmw8Pz/eezz82P/Zj8fv2bNmHsDwMz8/3hsz2Bg8eNhjD/2GwNmZ4fnmPbeBgMALgGYYf7M/8ePGYA8HjxjN+/zYbDZhmbbzb3m2ZtmbNth4M9s/efm9vNv223m/BnveewzHhs8DY8NmwzbxjMDzYZhjDx5t4ZvNnh+wz8Nh5szAM/Nh4Ztn5m/N7A8P8/xsbPH+Gf+e9v/N7b/NjZ+2bwzY8PBm2GbNsN5t/se8P88b2b9tj9n/4/f4e9nj9v97PDMbDxv2zYzNvZvDwe/Mxjwf+Zs34z828N+/wNvYew8b97bx/v97w/8bx7Ybfs2/zfmZsA29ns95t/ge82HhmbP34/H+3hs888M2/Z7Db2fm2b/b8Zm/N+/b3/mbMzGB7MN5m/bZ7eePPf4PDY/8wb3+x4b8/M/zzZ482D3gbeM//fv/ezNns2P8G2x73+88HnjbPYePG3tttj3j3t7e/zY/3+3m/Y9m2bB57xs8Z7PbA2942e8//8f+zPf7PH73/n+2B4zBn7PPZvw8HmwDzYGPN/jf5nmbZ7MeHvDYZnhsM8YZ+B48P828N+B7w2eHngbA2AeeBs8A8PP8NvDw22zDYZht4GHtvzzbZmHvNmMD2Zt5vz2ze9nvD8/D9n7/zYb83jZjxnjzZsYYz/2BmBh5gze2GwDwMz8NjzDYGbAxtsMGBhhsDwNgGZ5h79m9tm/ZgezwwGADcDAzBhmBsz9h79/+MZmebDDPAxmfsewzPNhsAzDZgbw3h7Dw2GZh5+9//j2BsDZge2GAx+MwGY228e2/bDH+/2Y8ZjMfszw/bMNvNvMYYxvN+YZthvMZhswe2MMAbxsN+YMx4MDAGxjfsDZ4BsMP8MHv972G88w3tthth5sxhsGHh7DxveDxsNmZ54wxjP29mbA2w2bGZ7wMYwzwxjZmPMPwMZg9s/Axts82f4YzMMGB4ZgbACnnszPBmPbYfmezwxgeGw8MM2Zhv9hvzZ/ntmMPAzDNhgxvHseG94xh+G8Pw2DMPxgYwf5g22wMGzZvDNh5h48zMNnsNjMPZ5/vMzGHhsz22MMbDBh7xtvYzxmbDB4wZ5n5meHhmGw3hhgwzPDwN4bGzzfmzGPZ7DfhvBm/bDDYB4Zhs9vxn7xmAPGDD3gbA2B+GYzMf5mwMBveGzbNnhjDMDzw2YYeH7DzzNmGMDw9vM9hgPY3sMHjGGMwMB7wZj3gw2DD28/Yb2GBgMDD2fmGz2ZjM2eDP2b9vGAFZhth4wNjPMzPz/MGB4YZvD2BsMz//82GDY9hth54zzGzN7zHhv282DNvMeDY2Y8MDPz23/gzMDebH7Zt/gH5n+Ns3tgBTbb/23+AY3veG2bN4B+Mz3tmezDH49sef54H4zPN5+3gZsfnntv2BvM9v/e8Pewze9vN7GPM822z3n72Pef7be/Hh7eZj3/+f5me2exs8zb/Nt/mN73s89j9t+2DzGN+e9t4M/bfmN78Hvbzf4Z7bZ7b9v9vN+b2Z7Hve35tvPx/t5m3tvB//vf4ex78f57z9/tv//e89mxmGbPPB7283/+x/+M//2xje9v/9sH/s89gzDNg2/28/b8BvNn+Nv8wH7zfjYe3j/z235+YMbN7GZt+eDZnjw9t5+P2Z79t7wfs2//M/BjZvee//H/jG/Y/8ef79+ee3n+9vzGwbf7ZvP/Btj9v342Y3/me3tj/M/Zt5+2w222wz3vYzx783nvwHm/3mb28Z723v2xsHvb8N5m2wH7exsDN5tgz22zb2Z/t/m2HjeefvZ4e3t57/zP234b//8ez2Y289v2zee3tmNjZ/mP2ez2228/fn+xts8eeZngz8eMMY/GebMeY89hn4wNj/Bgbw8zYGMA8AxhgYGzA3mzz9+eG8PZ4YbMDGYYG3gbDAxhj2MMYZhjDYHmGbMP2e2ePA28MGzeYeM22HvzZgG2zGPPbAx48H43jDBt49h483t7NhjDDx4Z5nhsx72P/89mMZh5hj8zD/G8bMZsZm/zGAFPxmYzzMeDYzYbbxhjx7eY/wYY2ZswBhgMAZs3mGY3thtsMG2zDz3ntseYPDN5+Ge88wbxh5sMwxmYY8D8HthszPeewxj9mDGYzD94DMAPjYzGb3swYeMMMZgwxj22HjDMGGHjAwM2YzA2xhgMY8YxmDew2wwGGMBjN+/ezMYbzNv2DDHjweDBgDAwGwYYMeMYG2P94zxmezDYwfs9vxmNjweMBmBgPGPeG9mD2NgGMYMMAbAbB48ezGMHjx72wGYwbYzGxt4z/8MB7GMNjzbzGY2zGPN4ezM8YH5h7x7G8Zg3szZve9vPGzeYPMZsweDPZ7ANtgYP2DN7G8fj2GZ5sw8b8MbMMGYwbMAeDBhm89hgweB+DMGNmYMGAYweBgNgwxgwYHg2Bg8bbwxmDwG8ZhgDDAeDBsMAOBgMBg9jeMwGYA2AwwGYA2MY9vN4NsYwMYNmbxgbAwMfm35jMPGeGwM8Ns2BsMMMYfhj8w3mZsMeDzHn4GwPMNnszDGGYB5hh7ez2zDMN7MB7Gz//Pf4bP82G/zD/AP8DZmBvwN7DN5ts88DzwPDGe2Y3+2Hm3gwwzPMHhswPeN7f4Z48M2MM8N5j3seZjM2bGx5j9795sDebwPNthh43+Hsb23t7ebeMxjH7DMzDG9jeDbYf+2YxvNtsx+Y8bfv97fn79tj/DeZ+23j2bGz2PNgwebNt4bzGx5szbZmP3+3m2MYHjN4xvbH+NvH7e2ebZse237Z57/NsNvb/Y82PNswf+/22NjZ/h42ZsYZ/seNjzGAzGx/jGeMxjG9jxtmD2xseeNgbZ5tjN/nmZmAY37e9s/ZnjNszbx5nseePbee/xs8fjZg23vAzGZtvM8Zt428AKMGY8GY9htvAZvDGN7eBsbbebB4z2D2/ZjzYbbbB73jY8372/zMY2Hjx7fjeexnvzzxs/zb2w//xjwG2zYzPHh7Y8GPA9mxsNv9szGzMb8bNnjHm2/Y97M3nt7Y2MMbwY2ZgzbBt4NmMbA8BtjAGbY28Y/AG2wA+bAGbYDM2AM2wBsMwBszAe8AbDwBvMBseAMweA89hj37Gz3s23vD/2Zgb/Z7M9tsYeD8fmbe2B55thsbwebebzYzbYYe3+BtmbPbxgex4PP/DGBsz2GYHh5s8Awww22GMYYMA/AzHjbPz/DHmMDYZmzMDw2GYGB7H/h4zMYw//NmezeGNmMAKZ54Zh4G/DPwMGBhgYwwM3sMwYbb/z97NmZsPxm2GMwwZ7MzZm3sG/HjPBmMMAG4MPDMMwZj2DG/A8wzZnhmYDD/z/YYNjNgxmMGYeDD8MzzBmGM8zMPbNmMGwDGNhj9jAxjYeDYZjD94w95+xn5nhsw/YBh+ezbNhsww2B7AwZ7BmMMHtv3gBWDMfvYw8zYbBhhjDBsZgPwYBn+bPZjYexngwMwDBhhgbMPHh7G9+Hts94zMN5mYzAeABGYwGwxgwDP8NtsYMeD8wYDw/exmeBsbN4bwN7GGAFwB5mG2MPGx55j2/DPB+Z4YGz2AbAYH5jNsxmftnmb/b9mNvAZ4NhjGb/fh5v9hnmMwwZh5/nsMzAxvDGx57MzefjMzPPzBn4zM/PN5vGGYM3t+fm28ZvbezbGBgMMY9sxmNvbPeBjzzMYeH54zwzw3//mY8YMwxs9mxmDMDGx54HnnsDGDDDGYPGbBtvHsZmwNtgwM8wG8xhgN+zZsDGzNmGf4bGM8BhmZjDYA2GxngM22YzGbHsDGAeBhs2N5ng8PMY8Yez2MN4w8eGZmG/GwMMbPPxseGeZj82ZjGMwGDB+zGzGxtv34Zt7Dx55hmG8MPDZ7w897GGbbbzY/HmGPNt57Nvw8Z7NnjYZt57YMzDNjM2/2wzzee9+Ns/2zMf/nj/fhjz3tmx5sZ7282MzbHhtsZ4289jzD29vNt57ebb2eZvwP/2Zveew3jbbbNgPeZ+D9mewbMzZmN5mMeD97GYN/nsHhv9s22bGzYw/2e2b957x5tnvbfng3jzzPbYZ/vef//vY3tvz2/9sZh+Mxj/ebbzxvDA8954DPBmZ4/Zntt7bz2b9m2xtvzMf4GNsZ5/t5m2357b9s3/m2GYNjNmbeN+M/D9gMPYZ+Y3hj837N+3+3m357f57M3je/P22Ztt55+8zNvePZ7DPZnje9sefmPzxvDD/G2bP3tnmb/fm8x/hv3+bMM2xjN+3sf+zf+9vNnnm/22bP35/+/Dxm/PP883mB/njNjZh+NnsP95mbY/3nvNvx+N7f/557GNm8zHm28M/95njBm2bYwGGbZ7Af+822beY/28MH/m8G35+D/Zng9jfsHnntg/23vbZhm28xsxjPZ5v3m/9m/eMbM3ns9n+2exgbAHn7NmMHmZ4ex795/n7HvDNjeB48bPGBgGeYM8YYzbb/Hge89m/PDNsx4YBgwMPGYbMZ7DA8eBt4A8AKAzBjbZtjMYzGYGxmMMw2B5gGxhmBht7PwzwZ4//N4YM8wxvxsPfh7YeGMN+MMYbM2bHmwzB7Z7w/Gbz/bB+MzGxsBgGAx7xmb8PYzYYMwbYYPGDMeeY8ezHgwxgMYANB5jZgzAY2H4w2G82w8GwDBhjGPbMwexhszxmGwZ5jGHjNvNmeGeMMYMNmB4AzD8YY/PH+Z5meH55g9tgxmx7M3hjYbBsHsPDDZ5jZjbMM2Y8AG72eYGMPB57Dz/w2/eDb9nmMMMxjDGNgPYYGBjz/zPb2G9hsAYYzACgMB/n4w2BjAGw/8Y2zPPGGAeDD8eeA/GbeZgHhn+P2YzA88YbDDB4ZvYeA3sw2YeAw2GHgbGGZgPAxg9/mYP83vGPDzNs97PDMBmPBhjGwwb8/89mB/jMPNmzBt7fhnmbPzG2DDNsz8Df+GPMPGZgwPMMM2bBszzDPYZ5sDGBgbD2YzACmMNgeBmw8ezwMbNmGzw35+wNmGbMDH55mzDwzZh5mNjYbDAz3m2x5+f+Z5hmNhjGBvw8wZtgzzYeHvYeGMY23mwxht4zBsDHmDwDBgPAMGMbe8YHjYe29mf5gYz8MM8MeY8A8G9gN7DxsHgBcbMw/N+MGze2bPNg82x+bGMzNseGfmzNgY8weY2Ns9/7zDx4Hmw2xmft/4/Bn57PbYZtsM2Y8xhvGH7bePeBjAZgbB5mN4YwYbAbeDwbzHm2NmbbZtnthmbNh4PNsPz/DbNsPeeGP23szxsbA8fmDebNsGfjx5m9/jf+89+GbHj2eYZmPzP9t7Db/b8Pb889ts89n+zZ+zzzzexnsPb8PxmZjNt+z2e9h+AbPeb8Nmz/DYb2MDDYbZt7Mz3n+exh5sMYBs9vZv22Y2zH4zYZ572BmbYwx7Gbb2G2fs2N7Z5gbe3nn42P2DYZg/Mfvx7e9mY954Mwx+N4fmzH42z/9+97GMwzHmPM2e2H+zzBjP897Ye2DM8PMM2GwMeY8M8ZmHht5mHmPM8MexhhsP35m35n7/835489vzDN7DPw3mH5gb2Bh+B+w8Nnt7Mw3mfvxsMYbbzbPY/37w/xmb/NszbDYw/DezzY8Nsw2GwxmZsGzY2G9hsbMzzNsPzDfnswzZhjYYY/D2ebBn7wxjPMxsNvxveM/be8MYz2M28zMGxsebe9mG2ZmNv2f+bwD37ZmN43ht+3mHnvxsPY/fj/AzD9mBttjeB4Nmbz/DDeBszZtjMMzDMMGBh4Hs/AzB+HhngzDDGb8DMZmMGP8NmMfmG/bYN4xsMMYHjzYG2GzNvNjMDBmGzfjxjDG88eNjMeZmMwMwZh48NgzAPbzPYHhmZmMMMMeB+NthgMAzzA8Zn7BmMxjzbDP8MPYGDDxmYYbHh4b2G8YzA2Bm22MM8MbDzeHhsHsMeGbMzPMDMA2eBmYfsGb2/eGGPMDDDGeBgww9mDeMPBmfts23swY9jMDGBh+GDDw2/b82f+8wPxn5vxjMeDN4bGGGwD2xhhmfmGBgYYMww8MBmAF3m9+ezzMeGDPMYZmHhhswYYMDwMzGzDH5jGzBmB+MMwGGeBjebxmwDAYDMzAMGAww/zGNmYDYZjDAwx4Yf5gzNh4zABrGZtjDG82MH7YeYxszN7DAxgZmMwNjxmGHmzDBnmGMYf+b2YwwM2ZgZ/jPM2zGfgGzD8xnvzAzGZ4AVgM2YwzDwzDwDGBsDMPDM8NgYeZ554bPDMYwzMYYZh+B5hmz9nn4wzzMeYeHhm/bMNsDxtjMGZtngPAxjNjYzYxjeH4eeP8wYxmDHmGZmGYxgbPMDwB4beM2bDDwPAZmx4zfmwP8MMwDY8Mx5+Bh4YxnjYze/PMZjNmDMGPbw28YNmbYYxsZmeP88wwYM/AMDDxj2PPDDDYDMNhjbGZv2bYfjbGAZhjAzA8MYGz2PMb2AZn7/Z5v2ftn/jNngBQw/357zZ/vz3t4YxgBRtttv9m89vweN5sxsMbG/bebzPPGf/h/5nt5vbfvzbHm/Ntvz8z8/2//PYe957zNn7fhs8b88bebeNt/vG2bG89j/8eww2MP8bP3t7fv9+89/vxm3n+3tvf+DZ/+fvP3njPM8x/7Mz3s/bZttj2/MYZ/ntn7zDbfsfv2zPY/P/z2ZsY22e8ZmZ5jHt+3t7GA/eG9/v2f+z/e/MAb2bM/zNts2G//8zxgD3j/bzeP//M/3+MB+e3v3ntvPeZ+ftgP9sY/M22Z5/+8b/xn+/z/bDGexs9/5+M2P95m2ft+Z/sx+9/42bzPx+P235je9jx/mHj28xn5t5v/bYP/P2Nn+/bbz2fvwB/sefnsZmZj37M2e8wZv83nvNjf/n5vY2YDM9+/Y/MzH7f5v22D3tm/Bj//PzebZn7Hm2P9/vw3vM3+9vHn42ezP89t/+/Pw2x+Z/57wxvHt572/PezH7Yxtm22z2/bGPzxhgHjAw8zNjwb8YGwzA2Z4zzDAxt4BhmZ4GZmAPDYYGYYwMPM28zDzYeH4B5hgwMwDzYY2GN54Hg8zA3j2Gx7DDYGDPeYxs22eMzG22NgbAYYGPezG8DPe9+f7P83h4Zhgw2/2bMMZmx7BmbebBmAFG9h5gPPDPBtvGGzGMYZszAweAzAHgMG2MMNvGeA2bN7DbBjGb3sN+b8H7MzeMMYYNsM2wzwNszGMH4wx4Y/ZmAPDbAMeHjMZvDxhgw9vbxs94N4eMN42x+Y8xgYeB4xt72Zh+2GYZjxhjYMHhmMwPexnj8w22xn5j9hsBgzzzGbDBmDHjbB4PAbAYG8YYP949mPGBg8BjMBn4YMNjZjMGN4MMGNmAzzDYYAUGHveG/HtgYAzGGMD3gN4wMe8Ywx5mYPY2eMGAbGZhtmwex7NhsBs8Zhht7zHnmxhh4BjAYx//s8wbbe8Hj89s83m8Zgb2Z7GBs3nvx/swbYY8Zgwxjf+YP/37weMwDf+A8MDfjM2wx4MweAxg8ZjYwPY2DGDwbAYMHsYMMGAeYPAYweDGMBj8DBgx+PA83tsMAZjPGMMYwHjDGxsGAYDBgwwZjY8e/zYMMbBmDYxgwwYY2DA2A8N4N+2DYz8xsA9m2YNsGYGDGPGxvM2YYzbAeMPMw2GY2PeB4e2xhsbGezM37H48eYzebYf4fsw9+YzMPMbfsZg2zZsBhgZmfns9mxhswx5mw9jwzzM8zZnt7ef7Nn79m9sPYzfgzN7Y3vMeY35j8b8bMM3sPPZnnn+bx+ezxttjzzDGzH7ezf+eZn/vf7Y/MPzGzGPf548DN/m348w2w9thmMxsbA9j2w/YPBsxsw2P3+Z4GPGPeePBmN435tj9+29sNve88HsxmPHn48f78Z/s94f5mb83t+zewN7DNvP3mwx+bBjfhnt+bDY3t+fveN73mH+PM9tj2234x72ZjY37Y8x7zbw22MbbYP8HvAbDwZswbNg22AzPHg8eAbAb97xmBsbfvGDPbNvYbbB42ZvHvM23vxsz2Pxs9/5htnt5n7bwxvDNt7YMNjNswZjMYx4D2wDGNvz2P8eYY373s2/Nvb2B7P9tv8AzBhgYMDbw8Zm3hsGZnsP943t+2MPY9jN4NvG9g2PBvxs8eA2MYePbeZsYeA82N7eDwf4w2bMPH+A9sePB48Hmx4xgw/Ab8GM8BmHg8Zj8YPxg9hjzY34zMGD/AbzB5sBmPGZsGGzbZs/ePGxtn5hsZv/G9//78Nm8zxs9/sZjz2Z7M2zw/YP2bNm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BmezZhnvM/NmZs2Hmw9sPZ+b9/h57YbGzGGzMMzw9+3v2PbGYwz/ezGHmHvHmYM3h/72/bN5737Pef7z9+z2f4fjBnv2wMAKYGDGeG2G882w2NsMGeZ4YYYw8YYbDBm8YYNsbYzGY2D/M94wzYHjPMMZjxm83hgwY2xjDZjZvD3mMzG9gzzYMYMMbMxhgMB54xgBQGNm3thsMBsYPzz8NmDe2wbDA97/HhsNhv2eDNjYMDAzPGYZgwPDA3sNhmY8GHsN5mbANmGGezAAmGAATAMAFYAPADjB7G2e2MA28B+zZhvGNhh72Z4zAYGGYwx+PYzPZmwzM9gH4bPDwwxmP8x7PMNt7Mb9j/bMM2fhh4PAx+AzMx7Z5jMGAFfs/AZh4HmzYHhv8zDMbYzA2N5+BsAKeY97DGG2zfmPbMx5nhgzDPGHgxmB/4PebGHmeYxt7B4wft4G2GYYZvGYGGM8MwNhgxhnmMxsZjAxmAew2Y2GZ5/jPwDMzeH5nn+G28wzP2AbBmeeYbYzB7e9sx+fmZhhh5nj8b2YeHsMPYB5tsbYMMAzweMYx+wMHgDMY2Nh57eNmHgezDzMMefm29jMDYePwwDPGBjPbA2e29htszzN7NmP8wYBj2BsB/gZjHh+DN7wex+PYYBm37Nh57Axh4NvYwzMz2GMzGef7b9hje2DexhjGB4HgPA2BhmGwZmwzDGYzGYbbDx+BhnhmfmH5thjDDPPM2bAGxt7YzBnmxgPMx4G8YMDDZv2zbbYMxmBh/n+ZjeeMMzZh7weH+BvwHmB79mHnvNmx/mbzwYP/M8f5vP9sz/3+82bxseft7Ngf/jPGbx7/29tns9t+P/zx+GPG/9t+b/23t/hv3j34/PPGe2zNt7/MzwPGx/+/b223jzY3s289n5sbbN/5sbeZmADW22Ztj2HvbNjbN57zxve3n7f/nnvb8bDD9+8GNjbebw9jx/nns288bD/xsz37Y3tns9t7wbM3th78Mxg/82zef7bMzDZmzb2xt/495s9jGfm2z3tmxtt7/b2bebPwzN57b29t/5+3/+/G9ns/G837HnjZv89+3tmPZ4f+2bzM2eftvbPfttv/957zf5meefhsb9tvP3g8fv/b/f4exv8G9t+fn/g2zf4Z54/fn72Gbb/e9tmb2Pb9tvNvf4z/PMfn73/7zb973n5n+e9vzPZ/+/M/9/m/zDY/ZsbwbZhh7G9/sP/Az9t7MzzGZ7HmzD37Zgf5jZve94Yf43hmZ43nt5/57Y94Zsee35/sY8zDfvP2zPzP9nm//P/f/m9vPN/vw2f57DZhsAxsDbMGeBt4YHmbz8w2A82A2GzMYw/Y8Axv82BjBsGPMYZ578PGewYbGzzwxmDwYGN7zPNsPYwbPZjY2Y/B4ebB43tjGzHjGA3g2Ab2GbNsDY8YZvePH48xhve8N+bMxgZh73mGMAweB+GB7DGYbD9g9+YDMww8DY8GGMDMwNgfvwG8Hts8AZ7MZvwDGPeDGbBvMGYeYebDw3tgDzZ4PDBm2e3vM3hs8NvGM3t7GPDzfmz8Y2bMY2B48PA3488HhsDGMzePbMeMG8ebAPDeYAUY8xthjbHmwHmHgzGNm9jMDDNh7BhsNsYwbZ4zw/DGbzGGGGZvfthsDMMA8GDf/n7A37wx+fmZvfgbeB4bYe2AYz2eNjBmAeZg3vYDDNv82MxsZnjHmDMw2GwzYDM2zPGGNgzbeMwPZvN4ew8xg3+zY/wM2bGbeAzxj3vMezx4HmNsYz8fnj8zGMH54A//Hj2G82eZvNh5m/b97G2zHmGM28PBsZgDDD3mPYDZsN54Y8888ebH5jPM8x+PBgbYbYYb2bPNszbez9jG9sP88wzYY9+MzZmD3n7GwzZgxjD234DMDxnm/DGz8xmG3+xhh+B+zee/B5gxvbGBsf5jbHsGbNgP3jDMHvxjN4Bmf/72A8PwPD8MMzeYwZmf5n7M8zxnnse2Hs/Y8282eZgfmbD8MNvDzZ+w37YGZ7fnmzG8YZts83+2ZmY889mG2ZtmZv3mPP8/fmbPMbxmeZ+f+fmbxtmbZn/vZ/g3tvDP8bP/3mzPDMZvew88GzPzzzfmPYb9jNvfv9njZmPDN72MNvPzeN5jMZjb2b2bbwGbG2eb8ZmbYZtm9meDPDe9ngDYbNv8eM9swbbAYwzfjGPMbMMZ+Mw8H/4eDxvPM/bx+w/z/DbzeYexjNj8z2eBtm2Nm3jDx7bHnvHsPzbxh7P2Hs3tvzz/e3n7w2bzMNsf7bP9728f7829vMePZ+348G8w35+Z5+ezHs9g95/vM897/MYPPbG9v97Z/v23mf7P2Pw282Pfv9h/vPDBsMD/8xjMPDwz8Nm95tmx7MNmM/PG9s2zHv9s2bPPPf7GbeH48e9/5h72PP83n7zNs/Zt+w2bb2zPDfvNsw8PPDe9mZn5vfn7PNvZhmebDz/MbYbDYY2w/YGYNh55482G9v3v94wZ+Bv2N/tmzMfv35sb9+G3m/Nmz82x+95mN55gGbz9nngMzbZ4A8PDwxgf4MwwwzfhgGYMMZmZ4z/MMwYYwwGGeAMwDGwwGeHmDNnsx5mYPw35s8/zZn+zbxt48/GGHmeNsfjzAYeAbAwNmGDzM8GGzDMBhvxgPZ4Z+YHszMD/f4bMDYfsPDA9mb2AeAbw2Gzz3mzN4wbZ/nvzM8PePZts8z2ZhmYeGwGezxsZgGzYzAMx42Hngxhs2wM3vPMAzMM8Dxth7MwNt5njMGZmB5n4P83ttmMw3sPNjGPDBg2/YNjHs3g8GAbNnge2GMMwzDeexvPbMZhhhhs8x5m82eNgMwzDGwwZ7A2xmfjNjA2wzPDbH7PHnvZ/jb9hh/hme/x+Yw8zx/hsPGxmM3hsNjDNvD8w3sNjDB/gY9nh+9hsA2H+BnnvD8A9vMPe/wPGYGzYew3s3jwf495jPGZ42bAeZgGx5+e9jYY3gfvYH7A23j9jPMx5jNng3sPzDGDbMYZhhse28MM9hvHmYzwzxm2eNj2bDxg8DxhgNmzzMzZ5+zzAZjb9swzzA2GMzAGGGYYbDzAPzYBmZvwNhhjNhvGb8w/MYBmwNh5gZm82xmwebzA2GGZgHmYDMDDew2GMzwwDZm82NmBhgfmGwww8MMx+NvAPYebPMzB/5ht4GebebPZv9sbe97Gz9g2eAN/mDMzHgHgH72ezP/wzftnhv97bzNv2ZveGf/4Ztm8wxt4zDzzN4/exvP2P8N/+w/3mZj2f/vf4Y2e9gYx5sbPb9jD/ZvA3jz8Dbz2YbNvNn7M2wzN54Znme/9v3tm2Z/njGZvfsee978Z5/+wN7DH4N5m9h+Zvz37xmP9nm2zZsNvG2Z7GPY97xmbH+8zeHjzG/Pxh+//xvbYbbb2Ntg372wb83mAPMZvYDZv2Y889jGe2/ZtjPzN5jxjbzPB+e8/eY9v/9t7bPb89t+Yz//YfvB/s/ebfn7Gxmf7ezb3/5s3mY9t54xn+zDMZj/ebP/37e/8zf5j2/3/7w/b2bbPG/eZ+w/eG822N7zbH+//z37bMz8Zm/zz//b8z2bw37A3mPPAw9m8MN7/8fn///t+/97fm/9vz3557PDDb83vzPN5+e2fm3sbe3s3nsx+Zv//M97zPfvPMb8zbezM/9tmebfn7Ht/+29sYZvAzNm3hj2GDHnmGbbP/fvzDYMYPZv9tvzDbYzebb8P34/P83mG9+MPMAwZnh55sGYeMNgbDMzw3mxh4Mzz8DMwwMDPAzDAfm9mMMwNnmDGBgbDDDzZhmZsxh4YPM2fmezzwbbBs89m8GYMMzDD2YZ7DPMZt4wzzDNhm9mMDew2Y/DM3hsGNtt+eYft+w2w97YzPw/ZmfmZ5mDAzzeBs2YwNswDMZmwNgGfhvDeGMD/e/8wzePMw2Yf42YDYYwe2w/GN4Bse22/Y9mNntmMBnh+DPzMAezHnvfsPebBm3sNt7bANnthmDDAzMwxgYDYMwbGY9hsBmbN4zeNj2AN42DA83sYzZ78zbw2PM9mN54Gx4Z5mzYbDe8ewb3s8f7/DbzbPGYfjzZ+b9hnmzM37AeG/zbD8/ZjPMMwzBmbzZ5m22Zsw3+Y3+Z4ZmBjBs8DzZht5s2PPeDA8fgYG/YNszxnjBgPAPwZjGzYb/97eMwxhnmMMM9jYY3jwwxmzZvbMxmDYHjz8eeHmPABuzzHswxn5vYwze2e8HhmebP2B+/xvAxvA9sNh4zNh/5n4z9+G3/jDGPB+zBswe3jYMA2NhsBt5sZs/H+ZmewDH/g8AKx7bDMz3hgZhgxswGGYbPN4/e97DMD2Gb2MzwZ5mw94HtmNjZgwwAaNmGMzMezeDAx4bM95+BgZmBmZh5sfvMZns2bHg37B+bbzex+DD95h5szf5s2fsMzYM3n+ef+z8zb9jZ7/8x//5m8Z49se8zzGzbZvwzMw2PPbDzYG3mzebH4PDPzMMYZg2Z+ez2zDMYwD/APbNgbA883vxj9/m9n+ex4fmeM/MPz3t5jxtmf+bb2ebPMzz2eZ7z/wZvGBhvMGZ+bZt4x5jPf/hvPD3vx+Zn/7zNhmePN///5vG235s35sbM/zMGe3v9vZvBtsHh4PeP9/veDM8b8//e29mH7/29vxj/P97zPZ4zbPN7Gbw8Yzz3mZsM3vNjZm2YfhjbYZmeZ+/9n5szPZ7/wZhnmw8D3+Zhtnt57Htj/M3+zzzGbP8Mezfm2Y88wxs//M/bxm3+exmef7z2Gwz8ebzGezN5tnvMM8eYe2Gfh4eZtmzePzDBjNmzPPzMPeftv/Mzz/Deb/82e8G/8Zv/Hmxsz3t/7Z/g3vzZts3s34Nm/f/j/Ztm3s/DNvGwwxsxsxsP3sZh72P28DxsPGe8wfjPPPzD/H7PM9veZjbz9hvZvZnje2/PwbYe8zYP8PNtmZ+e8PeHszZjNtjBgx+2H5jYH5/+BhhgZgHhmbAGYYzYPHhsZsZ5jY/NgbYwGDZtg8B/73jPzZnh4eMMGDA8DMezDDMxjYGMxnm82zzGYZmzMww8Zgw/PAGB4b8MD/HvZszMYYYGeBjYYw2ZmZ5jDzDwA+NhsbGG88z22ZgbG/ANgezDDbDeMMYeNgzzeGxmBnmeZjDw/MMP8DDMN+bwN+GPMzB5szzzfgbAzMYH7NvPPDDA3mbYbZ4YZgHjMB4b8P2HgewzA8MPZ5jeb8/ebDNhh4Z7DYZh/n+Pb8DxhjwN+MePGD/eDZ7DGZsM2wMMAeBts82zH+M34YDDNjYeMzPx/n4/BmM2BmBg2Bs37BhjGf7Ztjx+HgGzMPDZsMPGYwwMNmfmzwwzZgZvD2f+M8MwMYYbPzAeeGZ5g3gbzAzGGYH4Gfmb2GAbMMNh/hjGwNngY/PDDHmez8DGGB7MeeDPMP9jGYzMMMz3geZmYYYZ4YzwMzDMeMMGGGzNmBm/YMMzMxmwzxmzDwzPGHhsMD/2bMzPDZs2xh5thmGw8PMbxtvDA8G9hhjMDx+YP8Z/tjbPPGGzDYZ5vNt/mYwb8BvYeAPwZ/mZh+GbNn/gG9hjZs/Hhvxv//Y8N/jA22eAMAwwM8Az2MPMDwwz2/G2GD/G2z8Zt/szeGYw8Pzw8eYzZszAAq/9/+3+/P/fveABX/3/+/2P3+3v8ACv/78//f5vzZ7zwAK5/tve9+/P/P9vAAr/t/v/3797b9vAAT9me/Pf//tv9s2wAEz3/7e373+e/z/AAT9//+9//+/zNvAAV/3se973tv3/v8ABfM/N/73/79v3vwAFzeZm/e2xv/37ftsABn///f7e37/9t4ADe/P//9v3+/bfsABv/9v8/3/v9ve8AC+/ftv9v///e/wAL7fvfvebP2/3se8ADL/z2//e97f5v3gAZ9tt+ft////5/gAX/e9t/+/9+97Z4AGW///3v97be8/zAAu//zb/b//35veYAF97//z/2/zz9vbAAZ/e23v//ef/7/AAZ/9/+b//8/3v8ABv/eb/9t/t/v/PAAX3/7//M/9v37bYACv/7Nt/7be/9+ewAFfz972/z/23//4ACf//7x//5/+8/wAKt+/f//+/z8894AFf/973/t/7/zbwAK///+3v/9/tv8Zg8Hjxj/NnsMM/Nn7D35554eB4GYGwM8zZhmw2AbA8PDzzPzfmzz83jNvzw2AbAwzYbPN+DweDweP23/+Z//+zeze2zHjMeDwbH5vZv29vMZjY29mPBhg8HgMwB4DYNg8e9sfv2f5vbbf7xmPBmN+eZ/7zNve9nnmbN4wweNjwePHsx7D/zw8P3hs2YPB4PGNthjxmAMwB4DwbB4MwHgzAZgDwGweA8GwZj2bHnt73sweDwHgPGwZjx4PB4zB4zB4zB435s8MzzzeG97MeMweDMe/83jwYYPBmA8B4228ePHvzN/+zN//tm3m97MGYxs8/3s2BmbMM8zPPDwzDMz9mzGweDMB4DYPG3jNm948Gx42DwePbPPDwzMzPzwNmGfmezeMxsZg8HjGPH7ezHgwweA8HjxmPG2Y948bbHg8eDwZgPAeA8GwZgDMAOwB4AfAD4AzADmAHMAH4AfAB+AD2AHGAHMAPgDMB4DMB4PG37/8ZjMw82f7/e8bHg8Hg8BmA8HgMwA5gDYAzAeDYPB48bB4PAeAxjDG2Y8GweMwGYA8AeA8AbGYNts2e8/N+ebDwDYHgGwDYAUw8DwPA82bMwzMM2bDYeZ/7x4PGx4MweD/eMN7MePHjweDYNg2Dxt7x4PB4DwHjGPHjx4/Zm82eef55n5nnm/z/xmY8eb2e8P2Hsw35vw2Nh7zz2zxs97Pbz3nttnm9n+H+bMz8wM/A/ew/x+bw837w8bAC7YebPeHtnjw8/z9+Hnm3gbDzzwM2w/z9+b3t5482//eef+2z2Y8/9nnvP8/ZtsD3n+eee82eB/gHnh4GPZt+e//P/3/m3vf7fsfn5+f5737Pf48PHve8M3h42eeeGNvbZ+3/tt488e8b/xs/MPP/3h/vP8/zfh488Mbbz2YeHh54beB/nnht4H+eb9s3mf/7G83j/N7//Dbz9t5tmxm95se2DZ783tv3+x549mPGwbbHjY97P3ve2/23/548Nntn+f4e/xt4PPHvZnthsf789+PeNhsB/jNm9/+/xvbxm8/9//v88/ZmeBm88D9//7eH+fs8eH+G/8/bzw2e3vzPzZ/n73/n/795hve8/883/+8N7DzZm/zZ+2/zMz/N7D8w/Yb34b/9//7MzZ57w2bPGzezfn7ebHs3jf+f4Z4w2zDfnh+zzfgeDwNh55sPeB/h7GbNnvAzM3+Gwz8xhmfm3m2MMGGAzGN737f7DBhg2bDwM2Y3mNm3gzbbPPM2GPHvzZmzf+9hjN+ZmMwZg8GYPb8z/z/HjxvbGebzM/e8e3s8DYbDMMzMNgbDw8Mw8PzNnh4eBmZjMY9vGZsDGAFwMw3/mZm2zNnn5/7N4PBsHg8B4MezZsDwDwMDMz/xhhhmGw/w3hvxhnh7DYGzDGGA8G9/tsDGAZh7DAeMe/DM8/DbDYbA2ZmZsDMPDZ5+Y3s8PDzDNgeGYGZ/sZ4eAeB+Ybw3jNvGezY2YMMBtjDwPAxgYYZn5mbP378YGDbzz9579v/PDMw3jx48b3v95ngeB4ZmGZs2MDYGwzDYeGwDwMwMMzNh4ZvZjMePePZjMb2f5//79hn5szeDMBhgNt/nmPb2z3j9s3ns8Nnh4HhmYYwx+MNgeHnt5vNmMDzPN7b8bbYbDzw8DwMz2ew2AbD828P/Nn+bM2YzGYNszGB4bDzMYbY3sPAPDZ54bDwMwMzwzw2Y9jANgHgBTAwwDYGYGZhm/xme3//nhjAC4AVgGGAbA2BsDDDPM/2zGBsA2GGf5s2GYZsMe9tszP2f5vzwxgBTAMMM/88/YeZjAwBsG9s9+37x+M8M/PA8Mw2eZjNj8Nh5n+zGZnn4f4ZjA8MwMwz2HgeHn78DGxn7Dfj/Az2e/efvP2H5m/D3mZs/Z495mezM2Pfj/PNvee8P/fvPMf//tm2/b22f+bZt/n7H7f/sw29s9/+//828zM/ef+//w/f+Mzz2P9mft+G8/b3mP8zeH+e888NsYbPA2PM29vMz3jGHt4fm2/bzP/PY8e2//3meb9/s/PeDbZ/78b83mYxj///z/3sb3+3vb2Z/vfj23v/37fttn79s35jH5vYPbNvB7f+D/exg22z8HmZjeD9m2wB/n7AHnt7AZnhsZg8YzNjAfn7GD8xtsfnm2D3vP/MfsY2YbPHtm8xv37Bm9t7N7x55mzbeZm2YzNh73mY2fnm/Pez3/n7Y//DN+28zez8wN794H+34bzP3+/Yw34//GzwzNtmewPe/YbG2HsPz34eYz/Mef5h+973+MzMfmxs2Zv828exh5+3tvP837/A29/gGP3+B/h7YG3vYwPPNvAN5+2G8/8Nj35gH/vw9v2z9jZmB+95h7bZmB/hvwM9+8Pf+wNntthmfsGMM/2P9m2M9hsDwzDYeBvDxthsPwx+w2ef5sPNv97Z+wMYGHn554eZs28Pfs2M28eGMPMzGZmbMAZjweDxmNsYGMAzMDZvN+N7PNmGMDBsGzzzYZmbwbY/MYHhh/7xmPHvGeNmDDGPwxgeGfjxjGYPb3jZjb88YGw/H42NvAZg9j8MeBgDxjGbbMfjAzA2B4Zmzwxhh+YPNt4zB4xsMBmAHGAxg8Zg8bxhvMYYPG2w3nvDeYww/wN5+BgzG97A2bPA2AbDMNmGzexhjMPMbN+w/8zzx734zGM2YHs88GY23mzGzYeHnsMHjbxmNhvAwGweDxv2GMZsxmZm8BhgNsbwZj9mZmzBmDwewGeZ+bYY8HjGMwGYx5vfjZsx7Zs/ZmMMAeDYxjMYYNvHgzHjNt7Me/2e/A/AxmPfthg/fvB78MZgPBjG237B42zfjDwzM2zH5h/7fn5/+Y2Hmw2Gf7Nh+H722GDeMPDN7NvZ5sMzD29jzZ5sMeDMbY3jxmDwb8PzYzbNvGzePBhgxjYbAzzGzGBnmM288bDGGDxv2YzGbY29vHgYNg83h7888DDYbbMePMZn+exmNjYzGGMebw2b2ef7x+xtjMYMDAePYwPDM8zNgfnn/vY/bAMYAXAMMw/2YZ+G/2YDDBseN42b9vNhmeZ7bMz/Nsw3mbPYw22bz3s2Z+bPPPPbP2eP82Z5geeGbYBvwNh4GfmPDA2bDPYfvf/+z3t5vNjzeYZn7P9veYbA2/wzx/+9jbx/+MxjD/GbMP8xttn43vH5/t57DGwM3sYbZ+z9vfnnvbNg2ZjeMZjbPbxhngbHv9nvMxt+B4PMxjHt42eP2eMNveZhjeP3/7bH/sbA2MxvMM/Z+Gwb9vZ+/f/jz2zGze22Pef7f/m2Bjbz9nvbfmzP/PNsz89+Px/sD/3mbGzMbbbGZsNg9sbGb3ts3s3tjZm35+Hj8eb8/M35sebHtmbMb28/MeNng3m2bHh7Zt4bzbPHtnj3jb3t/m2Y9szw23sb8f7PMbzB54PHjbY97229s/eZ+HvGwebZvPNt+Nm2fjex/jbz/Mz9gbzAfvY2ezbZ/s3hmzw2f5nt+9jPYHjMHv95t49sGbYG3h4zb97/PM2w8e8N+bDM2GzNvzYHjwPeb/GZhszP8D/ANngZngbPDzZ78f5m3+G37eBmYxvz/3mB7MN+B/m3ht4e2bbbD/Nn+B7zYeY8zz/MYx+APGNj9hsYbD8DNhmB5mzHjYBgwDMDDPw///YbbwxmZjDYGww2eMzDPPP/8MGZh5sDwDYYZjDMMZmbzbz9t7zMYZgMDzw/A957DM2eYwPDzNjNsPBhjDYB5mG2bxnjYbH4bA/D2wMGZsZgxve9mPe9hg9sZ+zHjx49s/PN5m2zG9jA2Mz/zYYzDbDYeYY/YwMBvBsPeGPGYMwGzeewNmGBsMzNhgP3+2xmP/MHjwbbGGxsDBhjH5hsNvMZg8bA2H+bGHjMMZv2eGe88YeewMYzxmMbM2Zhj8ZgN7DMZgMxje2bbPPMYeeBsDPNt5sZj/zY8zGGw2BhmzzNs8DNmGDDzzw//MGBmB4GGfgY/x5s9+2w/zMDZgGYMMPYwMY3jAwY22GDY3mN4/zBttmNjY2x5j289h4YezGYee2YPGPGGeb3vYb/Hg8Y2GPGY9s2f5szbDPNj294zB49thgx7z8GYNjb97zMYB4eeYfn4b8YwMBgYDbY2GMDMPebAz8/bMGzGGHsMw8MzGB4Zn7Mf+eGYbPzYzGGez8wGBgDY8HvB48/Dftmx+M8AYYH+GbYb2YGAwMPeYzDGYf4w9mYzM9vNmwYBswMHhjGBjBmzP/D2eMDzDDGZ5n5mM/P9sMAZsbDGDDZh5tsZm9+373sPGHtmwweMZjwMM22/PZ4/DeezzzbbGB//5sbGbZn/n/t7w9+2ZsfmZh+z8w//zPbexsz9+b3nv9s2wM//b8z3hvM9v3v3tnmbMM3+PbeeeN7bNn7xg8/M/x5vYz9+Yb2/M2eP8zb9j/zb8e3s89je2/Pb3j/9/ve2P3tn+3+Ntmb/2z/Znvb/PDY2/x+2ew2fsbZ73ntvz/e2zD2222bee9557/9vNtn7ef7/29n55njM95tve/P9/jZ+8bPP94x7eN//vHvebD8Hhmx+e3+e2ZjHnn/7f4/ef7Ge2wf+e3/jYYMbxsbD22ZsBnv/N7z8b8w9+9/v822PzP2xv/PGzb9v/zeN/4/e3n+eZv3v8b3sb/f7zM//3+eb/9vN7zbP3je9s37zYxmxtt/t/s8e9m89+Df+eexvPZ+eP2e28e/bzftjYDPeePDNvYwYYbe3+zNsY2Z/jzHhhsft/n72Ye2/Zttt+G2e/bG82MPbzbPPbft+Nn7f7N5+23+/A/9/tv9h79/hjH7YwMGPbPezMMGZhsM83tj2z9jDbDYYYGwwMxsMGz//xhvG3vwwZg3gNmbHhnmDDG2YYMDwxgGZ+GYwze/HmMeG/DHmNmYYMxmPY2bGZtjDGMZsbMe8ftmDwfmDxnv8/8NgYzDN5hjA8w88we/GzZ+zYz9m/zDeG/BmGMNgDz/8YBgeY/GbAw3gxg/wbezGx4x5j9gwxsDNmAMNgA8AKYZmww2D3gZjMMb8PPDb2beeAzDxnt+Y823mMw3mw/9+eNjZtht/7NjNsDHgYwzM8MBmAM9s2zP9jzGBmzYYxt7D/DGYZjAwM8N4BsbDAbftmDD3sxgw2DZvPZveb/MPDz8PBnszGMDB49sMeHvwPDeGY8MwYYH4/Zm2Y83vGeAwwMAZjbBs88wbxhnsYYDMBsBjGNmDMeMx737GG82wweMeef4MMDBmbbH+2HsMY3+z89sM9ht+GNj82bYDMYDzBmD3njMexsx+DMPfg8f5+bexgeN7N5sGBsG3hv/2PeY3hgzG2wGGDBhnntgYwGYbYMxt5gxgGNsMBse9+DZg/YzGN48YM2YYMMB4wbDADmDGDNvxhg8GMGGABGYAdgxjPebxvYM9sw28DGYBgweeN4Y8DxhmGw/Ns8PMw2Gb3gzzZvHg8Htm8zz9jDMGHmwzA/PMZmwzN5h7bAwYPfmZ5sPB4bPA9mGw3+YGZ4B4PA/w/MDxsA9sN7A/MDw2AeYz3gbeG2z9+Mzw9jMx5mPebB7zxjPbGHs94NvbGf7B7H7373m3s834Ht+e37Zme/z8f+bezYwef5hhjPYzxj2ZmwNmYN+3t73ng2beeGezPZmf4xvPMeZ+/G22bbw2P8GMzwxsbMb2MGZtnsYZvN7ezN557xsYz8bz23/79vxj2P2z3/nj2fsMfvMzft+H5sNvz8ftmfhmH7AzNhmG//3782PA9tnmbb28bPbHg2zz2beP223sbDNmYMGbY3sbzfm2bZhjG/P/2Z+PM/Nts22Y8Db2GGGHjD3hszNm/beBse9+8PexmZgbfsw/e/9572MwNvDNsDYfjM37//3mzYzw8fvZt+w97M2z88x/+zwwf+H+e34DM372zPzZnszNmx+MfsYwzAbDwG3gxnjY2ze9sHn+9s8ZjYxsMfjB7xnttmNmx/jwbHm2xm2e9sHtjxsH+PHjw8Bs8HjMG/bGbH4MMYweBjGHsb2Df/mbZ7Pe34b23tm2Bg2YPYzwe9sMwYwD2Ztm2DN7ZmNmGxhtsMDN+eBjZnng2bD3sf5tmMDYGZs2AFwPMzw8DDeMMYwxgewDMZj2BsDDPMzMMYGYGGGMDDAzDYZgZhnh+YYYwwPwzDNmY8Mx54GDZgwMNh7P8DZsP8MGGBhgzANvMPGbbHtsPbPMz3hvDGzZ4w2DMP8Nng8w37AzBhsMAzYHmGAbYG8YxjMwPMMwYeZmBjf+ebYG83jZ4MM8YBszDYG2YGDDw8wPGzZsGwDBgxnvxh4NmYMYGbDA2bYePYbxmwGYY2MMwZ4Hs/95sMGGGGwMbDG/b8Ge294BsYbzGbAYZm8DYMDNhtsMBjMGBmze/D2M9jNgwMwMAYYYYzDbw/ZmZ4e/MwzZmBsPMDYY8AOxvzYGZ5gf+xj2Z4xmGZ789gY2DDZ42bbMYGMAYw8x4DAxjbGBjMHsfn5szHhh5ngezeYPGM/DeDDNnmfg22294w8HgBW/w/Mw8zwzGGZ7wN4fjbzZhhnsz/MDN5n5+wPDwzA8AxhhhjDMDMww8MzwNgYHv9mw/DNm8/8/M3hgzGDNh//mz94GbNgZ5+2bZsMMYYxtvePGY2YGN/mMeMwDe3jMzzPDbDMZjx42w3j3mYwN+DDzMeHsDGDPefhmM8NgZm2B42YbD82GNvPDDBm8ewxhjAfgbDwNszAZmGYYMw8xvMPZ+MDGwZ4MzMwzzMeYGM2zN72bww35572GMYDNvxgY8Y8wzY2BsGbMDYx+zMweBn4/eeZv2BnvbbY9vMx+3mZswb8PZnhsM2x/hn/+BmwYYZsNmPPw3mb/3vfsfvP223vebZv//Zt/vee/DY8/zPHv/bz2e2/zz3nmxsz8xswDbM/M95+wMeN/g/bPw3t+bNt/mww289jx/htmA22Zmwfs28fsZm82wzzbPPexvebYfm82xtnv2w3mG9mZm3je/fvZt+N7fs/NsY2H/sf7Pe2ZtvM/b/8eHj9vPbbb3tvbPzx/vZmbeYNv/Z7M82/3+MZ7Hs/M28N57zee2/8PbZ7PbNsz//83t79jzeG/b/PZ49vf+fvNsNvM/MzbbzxthmwzPz2Z+NvP8b823htht7fm/GH4Y/22H+zeGz/xh5mfsZthsZjGPe229+f7PPNsw3+9ve28/wZt+/z229mef+9jftt+M/xmft/m3mzMbbZsf7z95mfg2237Zt5n/v82MZsGPxjD3+MbP2z2z3t5+8x72f795nt73jPG8/M/xjzzG2zxtmZ/5g2eP2bMf5t4/H/vxmfs9vZt+PeDDYPPb/GDwz2AZ7Mbfh5jPbPB4ZgNthveMZjAwDD8Hnjwz8wz95gzYZmMzNh78HhhgwzxhgHvzwMPeGNmAzAMGYDGzGeMwx/s29h5sNgYB7PMMbweBsMze/zYwxjAxh4Yb2NsN4zA2bPbA8Z4eY2bPeYwzGY2b342bMwzHsHmzzDzAGBgxszZ/4exhjYzBjGYMwHsG2Z+Dwzw3mDMDeBg8xmMZhh+HhvMx+PAMGY2M8fjzGH4bBs9meMYbGe/YZjP2BjGbwDYA8PYzGbeD/Z5vM/AzMG9gxgw222YDeMZjYMY3542bY/Yz8N7A/Z/mD8bN5+35vZ+Df+efgeNm2YwzDAMDGbP83sbGbebAYYzDGAMP97AxgYAwBjDYPDGNgYfgZjDDbN7bwG8beeYHhh5sYbwxhmZj9jAwYz8xh4x7GHmGwbMN5jGZsYwxjH42GNjHseDDGA8NszGYb88MwGY8GBjAbAxvGZ+zGAzDw2zPMZgMwY/GBtgf5n+GMeMzYMzbPYfmPDPYGBsDGGZhtmNhn4eGMzZjA8DPDPMYYGY8w8M2Z5j8MGwx5vYYZs9jMwzDMzAZvz3hm8zPMxsYw2ZnjMN+/PN7wzYYZjz2BvYbAxnsGYwzANgGBgxmeHjbezZjNjwYYPA3hg8DBjMMY3mHjBhhg35j2z9sMNsMZ5jMGzZgGwf48x42wYwArGMPzbbGMGzHj9h7Yzx7ZmxvM9vM2M/2GNhjPGNv9/nv9+HvwGzMPbN+A3g/Z+ZsbDPx5nnjZvHme379h4zDeZ7Hns2N+8ebeHmP9j2bZ+wzx/4N7M/bzNs23gbZ489/7MHv/z8eH5482NjxmbB5sHjwf42DxnmDwYZmbMPe8M8e83sZtvDZ+8w8D2w2e2wzbZ7fs9vb29szBjBmZ7fs29v9vB4Mx5/t/+2M/zYbYxhmw2MzGDfs2/PP34b2b8P/23jPGDYP3+Zn55mbbP2P2/Nj8b23jzPPM95mYe37bwzG3+N+PNt7zfnt4bPbZ+bD9h7PGb/Zn+DGYGezHmG3hjDw95mMYHszZtvNtm37M2ebZt+88PPM/A/Hn4bNsM2f4N5jZ5t4w2w/PHmDw/YGZ55vM/x4e8P2Hjz3+G2/GwPPM9jw2Dw2GP34PPf7f4b8GGbf+zDeG89mzZ5/mzDDZg22Zsfsb2xhmN/vDGzzDNh57Mw8zHmbGZ/4bBh42YeMzPxmzD2GYzPD9vbAwbPf7zzbBjPeZ7MzGf+/2B5s9jA2/bMxsPxmezG8/9mbPGwZ/sGeMNgGzYYB79jMDY2bGw8xgZ5gYz3tjDDNhgYGMDDwD8PMMNjPwwNg2ZgPx542eP8zZgN7MMH43jeNjM8Mx55jYYzDeZjBmGzNgY2BjGeGwbNjbe3+GDAwMx5tvYzDNsM94bPMDxmBgYPDMxtjwBgZnhhjeZ4/Axsw9n5vPZgw2Pww2DM3g2DAxjG8AwYbGPGM/PGAeeZsDBg2wweGbPxthmBmGYHnhtswbNveHvMwzB+Y2Bj2MHgMDYNvPx+2PwbPGw8w2zGGZjfg3vYZ7GeGHhj/D/bDBmDDYZmww8DM9geB4YwwwMMNh4GYGAwwMzMPNh/nsNvMY/BmGzGzGYwMYeGBmPMA/MMeZgDMDzGGwZhsNjDP/YBgwGZhhsGHhszMzwNsDNmAe8MMbZs9h7DACmzYbwPHhmD2GMzDNjzM/zAMYAUMMZgbBnhhh4bDDGGB4bG8ZjDMPDBnmGeBgZj8zPHgYzPDYwNhtmGZvA/2MA2A/NmGAZh4eB5gzA/DDzxgZmYeBjD82/2HhsNmYx/+PD2bN5+wPBsNvbDeY/DG9g8x4zxvx5sYe2MNj/DDwwwzD/zGDGBgx5mB+YY2GzzANgNhtsZs8/ACsAfg9jNvNh/4eG2YZhnnhmGB+ZnsM8x57ZvwxsGM8ZhjGbB4ZtmMHsMzDGwPDwzYwxmBgZ7bPMzMMDMGzZgwYwf/mGPDx+PDzGBgZ4YzzeMMNjzAPN7fvf+9njZvGDZmwDDP2/M3+Bjbbz2e82wAo2P8fn57M9njbZ+2w229+8/zeY35tm37Pze9+fn7GMf7PeM2bwz//G/3h+eNvP/9+2/Zm3szbebG3t/tt5tv9ts/H4YezG8G22H7x/v2Pf72/2DA9v9tvG/Y/GP/f+D/N+x/+b2e82957G9t795+M//Debbzx/+2295mePYft4ezMGN+9+/zzbNve289g/Zmb3vZveext7fvfv8P3+bBnnvN7/GP3vPb9/55//49mP//2/zb3+35v/3m9t7z97eb/zb2/Gz3vzH+fn7f7/bz37Pz/M9ts/fje3+22e/zH7PNv9/vbbZmbb/xj8955///v/2//A/b229t7GYbNmbbwbPDN7ePN7bwe/M37ebe35n5/jZg/b9/v88bbf+zxtjMP3vx/7/2be2Bt/5tv9szebH/7P/bM3m2PxtjPN+Zv9/vM29/v3+bbHjf+28zNjZtvGP89vw95sf+YzZgGYDDDwM/Gxt4w2B5swzeeGBjGMYHh5mGBsMB4ZgYB4GMDDw/zNgGw8A2HmAZhgYMDDAxhhhjwNsM8DweGYfs2B7YzDMPPNhg2zYYzzePY8bA2ADwwMHjDAbGwYH72wZt7GM/ZvNh5gw3j8fsMZ7GbzNvwbwDYeMDPGM2fj2bZg/GzDeYYzB4AzAY2MYGGNjZ4DZsMbYBjxt+B+w/zBngwwZmzNsxmDHgbMZjB5sfjBmPDbDMbYeAHMxjDbDx7MwexmDMbPeew37zMDBh+PGzZjewzMNjH+9hvbBs/MewxjBthm8Nt4zG/w2N4z9sbZsGNth7DYBjG3tjbHjwYZ7DZnvGzMzYbBnhjDeGPDZgb2w2w3sDBmYGYwwDAYG3+bzGbDAwYBsNhhswH7DYb3hvzN4Ns/AYAVgzGAY8NvbbNgYwH5vDNjx5sYb9gYeAbB4wxhn/m97f48Y8eH7we2xjAwZjM8wZ42b2PeeYYM29vHt+zwxmz9/t4zA3mYYDYYGw3gG8Zjxhsxj/MbGzxjwG2zGNvGMMYBmx4MY8bY34YNvwYwNmDbbwBmDzHsbG2YweA2Bg2DNmxs2ZvMxgzbw2zAYZsMewzAGBgZ54ZmYxtnhjYZmG/BtjwP8N42w/PZg2D2G2wAozeMbBmHh7bGY3jPww2/Y3gP8x+zeHtgfnhmGZt5mzf54w3nsNgMz3v2MNveG/Bmez2PDDDYZmzfmx7GZ+b3+/YbzZ+8ftm97/bZvwMzGH72bM/bNn5nvD/3+/ftsfvPD3g/Bvb97D9ttje37xvD8zZ+2PYw94Ge/D37zDNn/mYzzbDbZts/e294e/Z7zMxmxvM/2f7/w35+9+PDb3sZtt7MBtv8ez2z/bN+DDNj/D/2N5jZtszD2e//9mP9j/YbY22PDMe2DeYN+PGx49hhjZ+/Y8bH4we2DPYM/BjZttjx48/P3tvbHm3swY88x7Z57Z4ebNme2PbbYzD23vG3g2Z42zbYzfm8eNnjbM8wee2xnme2ezNg2eN+PZjzBjfj9vZjGew8x7bwfvYe2GZvxm8M2z37Z43nt7eB+G2xtjw8MwGGGMD9gbZtvDYPZ734e/bw3+bGbeHtgzPY9jbGZvN+23meHmZvYeN7b282PNgM2YzDY88Bs28Gx42Pe9jGZsefvN4Gx4z2282N5/vfvxts2MPGw2DDGxhtsM2N5szbMHm9/+GMZs23jeZmbYbeGbYGYHm/N+fvzZmDYZ4w/w9s3sPeebN7Yzb9mwbfsMzYHswMGGe82PAwxhg/MMzY8PwMeGYMMALswPAZmGzM22Bm/z8PMP/efmZmAwDGB+w2xge9jNjDAZhjA9mAwDMMzzw3jfjPPDM88eZnhgbHjDDN48PbM8zMB5n5hg9n5mwzYGxj2zNgePAYGe3thgMMPMxs/NnhmzYZtmYfhmHj2PeG/H4YB7Nm8A2PACh5mYePzA8w22DYMwbZ4exhmMDGYGzZ4HjN5/h4B4zMMA8wYe2Bjx+NgbGDMYMM2PZv8ZmeGMMx7N7MYbZ43jePAzD2GwBsDwbwzwZ7BvYYMZs8YY8eMwZmPNvPGY/xjDBt4Nj2GMwe/DeGeH4eGZnj3jYZhje282MY2Y2eZjMbzM8GGAfmGez2YwwZvGZjYMb/YMwNjZjA2GbwM9sMM/DbHmD/NnjMbx+G8YGb8xs9mPBmGfmeGeP8PDGMzb2GDP/3vPYeM9h+Zs8eGYxmMxtj2GYYZhmDPzGzz8e8MzMGYeYfhn5mAfs/MMZjzfm2BmeB4PDM2PP29h5h7De223j8H7xsYB4zwZs8bAxh7M3n7Yb9+wPD37AMeMbH+ZvB4eYxvBgDbxvGDb9sAZg9g3sx4NsMGweM2Y2MeBg2x4MMM8PDMPMGGAFDGAYwPAzAMGBmGGeB554bNhsALgYzGGZhvPzMYGwwzHs/8Peb8BmzGDBttn48M/DzPz3t/5mxjN7zYz3n48NjDP8Z5/m2z8Y/zMzx+Pb22bbMNjx+fnm2G/GewD37wwPYM94G2z9h+GY3hmzbzMeMz3sZn7Me//bb8zbw2MfszZvz9szbezz9meM28Yez95sPPPY2f7N4AA8MABEACYA8AHgBzBvAwYMbD8fm9tsz3+N7PZj8Znm8xjGezbzPz95mPY34e8H7M3t+P8zbP2ef/m/D237ZsB57A9jZ7x4bG82eP2beM8z8Gz97bDbDH4MbePwf+bx7Y2e/Y22/D29tmezBvMebBhnnmY9v9jPbeMZ72/Pb9n55572Y3vwzb23/m8Pfm3m/2PeftvHt/mz82zHsfszxn/j9hn+PMDZswzGZsYZv/3sZt5+zZ5+DMzw8bYbYbbZ7fm22e/H7G2f+9n+/Pb2G82/PeN+2fs3tszN+Gxj2ex7GYbYM/f4x+xtjebPGPZjz2e3nt7M23nnn+PxmGG/e2/Zh+N5mYeDe9jNhmz8xvb2wezGGfnt+ZvPbP823n7PzPN/mG/D9+29g35gw2w9hvHmxm/PZhmPxjGwzPG/z/89vfswGZ4GPZ7DAZ+AzNgGw2Y3vzP2Hhh4ZsDx4bGNtmP9/sxnn7A2BsNhth4PAZ5m2YYw8YbGGYMwwNnmMwzYZs8AZ+MPwYG88zzbNvwzDwPM9mDD2ZmYzM9ge2BjM2HmAbN7zMDHhhngeGYPPPGBnm83geMwz8MwH+MwN/4DAxgAHgAQgAB7AACwAB4BjAMYGHhsA2PN42YeDGMGBm/82GYbw8zzNs/AMBtmw/e2NsNt7wGePeAMMwYY/PZjA2Ye2NtmbfmZhsPM8A3gGZsww8N5mwMw8MYBgZnmY8z2xjM8P2/N4xvwbGDZswww2PGDeB5+2bG83mwGGxh48PBn43jH57HgxgB2fmN+Yxm2PDMGBgfmGMN7DMGYbAzM8DwzM9me/DDz9tthnnsbGfvDfnm2fszxszMDeBv34GbNg8P2MwzeGYbw8xhgw8PMzeD/35jwwPA9mf7G9mGMG2B5mBs2G8PwG3hgwNm8weNvBnmz2w2eDYxnvMwGYw2eGG/PP2/PMwMYZh+2G3/mGxmPPxhsHje8YYwN7MGbGGYYeAbMN48MeZsDH5mZgG3gYPGPBhjNgZhnmMbDMee22exjxjGx49hh4YwbePwwb8bMZ5+M2Nm9jPGBt4xmPPDDwxn5jGeDZsYMbGbbxmbYPePMbAZsfj9+H794xmP2MPMGexmNjAC5jx/ts3jM/bM283vPb//zY3hjbMY8GPbBjNszYzw/22zY3mz/bPNnhm2/G2b2eY2z/BmeG97z/GZmxj/3h78GP8Pbxns8bM8bY9mM889mGzYZgzD/DzZ55/m29v9mYYxgeNgefjA/Z48bZsYANDABWBgARgDDAbGG8wY37f+Zs8b3mY2bbxv8MZjBhmN+89mN/nvwb8B7Me8eMYzMx579mbY8xg97/B5mMYfvMbef543sPwzM2eGz8Z/m/beG/8z8zMf7NjZsP9+e9mzM2GeH+w94ebPebfvHmAww8/83ntvzDeGN+B+94ZjeD2zPx//7/xseftt/+2/GP22Gb95j9mYweGwN5seZ73mZ/vP35s/w8PN549v/BvPZ+37e9mH+9/7GePe8bzPfmDwMYM2xsezxjxnsPPeeGfths2Bj888DbYb2B54bNmMMM97bef+G/PzbbHjZ7PzN5+/xmwePM8/3jxszPMNm2zP2Z+z8/Pz82z34fsA22B54fs8834e2fts9mZmzf7z/YzNj8wPzzHs2YHg/MezH+P8bzYzMGzY2D9h7Ns2zNt55sYfh/tmxvxmAeGMZ4GbDGHjDB5tmDDGGfmYBmMNgwzYb82GzGM2e8YxhjNmD2MPGG3h4YPbZv8YGAwH7YzeD2DzZjMGeP8HvxsZvw8PeGweAbe/28w28YeHnhgeY9+xjzx7bMYYZm/DxhmDPGxmHh48DDYbP8wPwM3gwDb97xgbAzAPewDAwACoANABSAHADjGDY2YbPYB7wGY82YH+DeAY2M2Yx4MAz2YxsGYMH+MwN+GZmB7N+ZhhjDHs2PGfhvHsx7978ZvH48MYDe/BhjMZhj8xgYwN/4bGzMDN4Gw8PPZmGzHgwwPDPzw8wPDz8zzbYYzzfvMbzZjPPGGNgzD2BseMzxgeGZm9jP9sPPwMYMDMMPHjMMxjPw2bYZ5swGM8ZjYbZ5jYGYbD3szGAbD2zYG/MZ+94eGYewPBgGZmeeMHmbHv82zPM3+YeY3mMG3mM2bNsPN5j2zA/bbG22Y2DMY9jA3jYPBhjMfvNh+zPMMYzbZ4YYHmMDDD8A3mDMDYYGM/GGDMZmGZgw82YNngYwN4zwebM2xhgeD83j2zx4YYB43n7DeDzYbBjH4zMzMDYYzDeZmb2P2Bj2YMAO2xh7ANnjMPAw2BsZh4GYGMNh4YGbYYYMPAMDDYYGGYZgH4ZsNgGZh+ezYPG2bYwwfmYDBjNgDYG8YzN4zY3+DeDN4ZnsMw2Ye8N5hmDw948M3hjDxngYYz3nnj/zf+bzxjbeZ42G9vH/n7GGzZ/sN+9gbf49h/7HmzezPH/h/n+/fs29+/Y9t+e35s2P9mbPP9tjY/z/8exvzZv9+D8Nj2/2zM/e/3mxjZ/nn/mx42ftswYD/MzABrY3me2ebG3ntv/f/7xt/73meeG223+Z+3vGPbGzN5/4/z3n+/wYf+2eY9vAY9vfn/+PDD22/8Pe3vYz3/788NnveZv//fv/2A/zfnjbzGPZvbPbzPHm3h57Mz288YxmeZ5t/nmbe237Pbeeeb/GzbzA3mwY28x7ef+//28Nm3tjD9m2x/55h/vfmbM/22zb/8exntg3mbH72PPMzPGMbNg2Mbz83t7B5nnszYZjwxt+/Z/sz2bP2efvzZ+3vzeYw/bz95+xvPzHhj9tvbP8/zfsPz2w3/v3ts3mw3t5mbN7fjbMMPb/9s89mfmNv88PDNsH7P8z/A2/H7NvGzDAz2PP88ezbbPM3vb3nsb/2e2P228/b3t5mZhs/Nn/n/sbz3428zz/83s3+e8zYG2G/AYZgZ+YZmZvN+xmbBjDZm8PGGMwArZ5mGGbYMZh4GGexthmPePx4YzYe2YMMY3mZ5tnsGDe2bAYP2Gx4bDY8eM2MGbzY2zGwPHhmz8xg94ePMZsbGzBhjNn57M/MGGZsbbzBmx4zDA3hsw8/wbeZgzDMzNvAGYzMw8M3+D2MzD3g8H7GbYHs8DHngMzAwGGGZm8MxmZswB7GePNngw/GbDMNmG/A37eDMbY2PAxm8HjYNgMGPeMYw8AeHhmeMPMGYGwxsDw2zxh+N7GPYGw/YGNswew8eP8B4YB7M3mPGAzDDMYexmzY/H4bAZjNsMe8MZh5mP22/8wD2DMfv8ZmHn7Yz2Y/Gw3hjPDYZsP2Bs/2NjHgZhmDbPMe2N+be8Zmb/GzMZjDDYM/8Nj2xmxhjHhjGZvb9hmYwfhtm3vDZsbb2DNg2bZsweA/BsDe97MzB4bDzNmwbGGHgMY3vG2MDB7YbM3hsNsNvY8D2xg2PbMDY9hsMB48AOYbM2PwZ4YBnh4GA8NmZ4Mze9h4wzPY9+Y8zYGYwx5nnv8bZnmYDGYbMzDbMzDYBvbNnvMf7N4//GxhnjZ4PD2/Bjw2b/GGZsMz8wMPAMzYG883gzM2GZmzwZ4GbZsNsM95mMN+Df4wYewDPezZt48zYGYH4f+9gzzMz82M9h/mz8beHs8MbYG2zeZmeZ7AzYYebD/Dfgf5sMzbGHmYbN+DM2f5/789jw9hszGzDxhnvbM3/mzMZnh5mbe/YZvNvzbPbf43mGbw37PYN7DbD22PzbBs2DZnh42M8/Ye37ZmHnhtt4Znh+M88N5h/t4b3n/gw2Hv9njzDMGZ48/MebHj2Meeb8Z4Y2GbM9jN42w8bHvAY8eY372eweMH42e/bGP3mf55meeGZt7/94bG2x/v/3+YzD8wYMzGeZjYGPeftns/bDbxmeP9mfv3tv2B4/Y/PPM95jGze/z8wzbZs34Zn/tj/2M82zNjDPGYefv3sf7DZ5nvZmZtmPew2MzxtnmeN+/YPPbxvfs37b/eY35g3sHjGD9vDbP2/2bebHsbMM2zNsM3jPw//PZmzx7bY28Ztj9/n/tmMNmwNv972PG8MzbHvfh4Z+bGZvYef/nm82MezNtmPfszzzPz/Nh55s9j8zzP95v9n78Dz9mZ7YbYz9h+w2bPHmx+22Pb3722zxs3m3se/83t+xm/PbzPexsxvMez/bbP8zweZnm2YbPM8wGZ/ngPDZ+zfgzAwDMMewDAMMYeGZsxnvwPBmMxnsAYYHsAwBhsDYYM//GwzDB+ezN78wPP2wzzzezZnmw88zbzbYeD8MYGbM29geD97B7GYNsZ4ZnmHsPAwMz22ZsM2H5gYwwzYGezDMA2YbDZ5mwMxvGbBvxmwMzPM/DZvYM/wz97DDDw8NgPDbx7MAxmMZgA0we8A2Z4M2HsM3jDwZhmZh4GY/M8zAN7M2Yzf4Gw2bHtgbe2zGH5s8NjBmMwe2wbBtjM2bHsDPYefj2YYGYGM8xj948x/hmzZjN7fng8ZhhgbwN5s3j9sZ49jDMwPY37PeHmbPz2xvw3+efv2ZsNmb/w3sbBm/9mxhg/DA8zAP88YGDP82ZhmH5jPA2G2z2HmYZsNvD2Gf/gf4eGwDbP3sx4Dft4zBvHmGD9jZsA2D9+/wbMbYfmGwPeHvbDZjNhm8Nv9jHgZsDA8AfnszDYNjbYGGZ4bfsxhmZ48/NsHmeYYwbD2GAMZjb/3mY9mHgzB+Y3hngZgbDYZgMMDMzzeBj2wPM35jAw3n7Hj2wNjNgZsNm8M94eNmYPGNn5hmYbMwbDNs9hv8wPw2Z42GHgb8NhmbDP/f4f7Dw22GD2ZmBvDM83mfmzG3vBt+fsbebGM8B5mzGGZg8AKwAptv9mb94YGe2/Df/jDeG94BjPAzef7/DMbDHmGNveGZnhtjDebY2H49mYe/8Z+e/DGe28M2829szw829tvb/b9v37MebMNs2bZv/Nn5mb3thm8fhj9m9+N+M9n7zNszb9t4bz2Nt5hmbNveMxnm222MNv3mNvN7Mb29m/3vb/8x4373+/37f4/2zN5v2beZ+8fttv9/vY8/23+G9vxm/fj2/PZsbzzP/9jD/2YY973+P2x/7zzb/Z+28bPeZh7ebx78P2H/jz83578zZvY88zDezftjf7bzAx+3mGDee3hmNjef/vD9/4G/2ee83jM3+2e822fnse28x4fm8/w/PbGxjM8f+3tvNv97zP88Pee9nmH5v2bz973nn5t7MMz2b9tv97bw8e/9+Nsx7/83vG2eZvNm2b2NmZts35n7zw/YY2zefj/e/2/3554//8/b8b3+8bzP3mzM3jbP3v3+M3+D28eGe8/NtmMZn54282/2fmGwbbZ+//Pw34PGzY88829nnmzHmYzMzGZmGw/DPz2ZmwzA2GB554w28wZmZnn5mGbA8MeGY97AzMZ+wYGGzAw8xhmebNmwweGY82f5hvbGwbMPbMzZgzMPPGBm/9sHv8PGBnsw23jDB7NgYPDD//Bt//n4Ywx7YwxszZ42eGw/Gw3szP8GBvGzM/AwYbbA2xhsNgHsYew8MDGB73tsbYbePMzbP8bwGPAYDMGNgZ7ew2DN7eZ434xsYx4wezNjw372Y8zbGbYbMbYMNvwNg3/mzDeB48DYZmwMGDM3gzGb8GGG2eef/4NmzYB7x72Z+ZsxjGY/zxmD/wNjYZgYwxmDAwbYxjYbHgN5mYMz8DMw88x5jZmbHn+zZ+eZ+B7MbBjAxvw2z8/GYzzPMx7Yzee22ZswwMYeZvN57NmGwfmeGGBnth4bGePxgePMw2eDGPeeZjYDMDxjDxv/MN55j8GGGw37DYbxvfjDAwNhsDGZhjMwwYbDAzzDPGHjNm2Ae9h/meefjx+NvN+MzMNmeG8AxmxmN+G3h5s2AbZmz2zw9vMxsM3mfnvDZ5vPHmwxsGYweHgDwZh4zZjxs3/7Awb9g8DG8Y8zzNmZ5jYwwGBmeYYeG89m8zDMDbMbxtvB4YezxsNt7beMMAK2YbA8wb22MPYeGGGPPwMMwMzzN48/DNsMD/Ng2Pbbb22zfjzYHm2YebMx5sNmzbH+wex+88xtm/M/ee3+z34/Db/3t7NsB/gfnj3+zZmzNvNsZnvBn/jePe8z2f4HjwPPD8Mx+GGNh/nm3h+95g23j9mbGNjPez/N5/j2YG9s95tseP/z8Yw94eHh5s355vMDzzHnjwP2Pz3me8b8YeP/w2M/b3t/+82bz/PxsPP8888PMZn55s3mG9/thmPbbZvY/xnts8DwzeebP3m9sNt+/P89jzzZ5/mz2zfvHnnnhmee/82zPw2Bsxjz3mZj/ex5v8ZmeAYx5m82Zg/zbe3+8Pf7PGzP89s8Hs/Z7eexm2w88PZ7AzNsYGzZs2fs837MPzMf7MwzDbeMxgMwz8xnmfh/7zPZ/szGe97eZ+eAZmPM/ZmZ7PzBtt+2z2//z/P9/5mPZs828/zx5s/M/bbwewN/jGz3m8M2z/DMebPN+bPxm/NgeNmwN+f49+Zj2P9jAPZseGbZg3jGbZnjYezbePMzebeb2A2G3nnnhvN/n5nv2Zt/mbD9v9hmMeb/zx4DMx4Z4DPMzDbf5nn57Z/mz3tsGDHvZ/g8D8NtjYYGYHgHh4GweGDMwB7wMGAzYzP8b/DY2A9+wbHmNt+Mxnj8wzN5gMGBsD3g8DfjGwwG2DPH+z8GZhmebA/wMGBs8NgYYG/MDe9+M3nswwMzD8xtsPP/3gHgDYMYY8YxvzPNmMzDz3geAZ+GY2ZswMZ7Y8zAeGzGG8MwzDGGGAZnhmfhmAZjfgzAPebzwwebDNhhsxmGww8ebYYPzDMGGwz2bMPGeGeAZjDAGGB+ZhhsPA2MPDDMNjbHveNse95h4Gfm2fgZgZn+YD3vA9m8M3vP2PHj3mbN55hjMDAwBgYZjwMDMww2HmzZsAx/jYbfmH789+Yw/ezB/n5jZsGfmP2x4N+GBjPA2bMwzx4zAw8w/Pzw8eG3nt4wxjHg2bw35mDN4ZsPY8MbMMxmwNmGZ/jDGGGeB5hnmGPYGPYGw2bM/DP8xgYwwzwN+YwwzD8wY2Y3hmZ4NmeYeGbMYY/PwzPHjDDYeA8NtjYN+G3vMebwwwzD2ZmDDDzD/8DDMMzxnsGGZvDA8w8Nm3g2zPMxjA3hjDwPDPHvGeGGYf4eGYwNhnmbx57ew2bHjMBm8wwGZsNvMDMN5+x79gbMz22ftnsMHn7/Y8NttnjfgMDww2Ae2MMMw8MMz/MZsMbPBtveMPH5jDD8DDGGGezw3gzB/5kIAAAAIywAAC9B94HAkQAAAFGAAUAAAAAACTAAgAAAEECAAAI0kDj8P//////f2KwAAAAAAAAAAABAP8BAAB4cgUAAAAAAAQxRySzDDTjzj0EEkT0UgEkgEkvwNL5JFFBBBJE9A889A9FJA9BAA9ABBFFH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////qUku0ku0vEgEUfEUgEEUUkkED0DjzTCyiRhAkiAEr/Mw35v3mZ7Ye9/mACP8zfjf+x7/f+fjwAR7Bj/B78fm2f7xtvZgAj9/5v2Nmf4bNmP82YADvvHvxm/2MZ/szP9jACMPfsZvPf5//73vYAStm/MbHveDe/fnm/GAFLbZ7Ge95jbN+2eebGAA/v8zP/BvH/nt7/2ACdtvzft5+/9j/N5mACkY/b/ezHj/zbbx7xgBf+8bebePGexjZg/N/gAvMz9/vY9v/Pf794AEL/eNm23497/f+PwAIzP23tvPHtn+37Z7AAlP/z/b3vz9vbNtsAF5m37DMPPGYe9vzPZ7YAXmbzZn+e2/8b3543gBf+22Y3mzPY/2bPe3gAt22e2Nn+2ee2ebG94ALTM82zMwZvbz/97f+AC029+2/DP/3tv3m8AL/9/55/79tmfj/wAVvPe955j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j3gzY/MwzP2/f+b8eGbbMbGf/hsw8YbYMYCgAHQMACsAGIwBeG8YNgbGGMBRgYYYGbMPPxmPAODMeBvP2YYYbBhjAOALAEwDjGzAUYCsAWBgFjYMMzDMZgYMzGGHjM8H5h4ZjPMPzMM/M22ZhmDPbZj2YNvzY82HvPz8zPD2ZsNjwwx7ZgOAGeM2f4GZhswe9sMYCsDbAJ9gHeb2GPA9mArGwPw2Gzz8NhthgewBZgYBJmbzYN5v83nhjDDAxmBtmMzPMPf+xjxvAxmzHs2xht4fQAAAANvNAAC/B3oIUAAAAEAIBhAmBRB1di1UW0f/////////////////////////////////////////f/+/RQWzbf/L7buHSoQYUQGcGQBghx+VAiTgbBYhBUbAWbohEAIgm7SIR2CETFgRBQv0Uaqrkz/5i0sTVNKAhAIIY2B78gChXYQUMMAVAVBVuj9Sj9rQ6u//f3fffn//d//f/bv//e/3P0b6FxCEYEWSY3ZGCwRCK3Q1IxATJFQUSPZt977/++//TRMXzQAAAAAAAAAAAQD0AgAAc1AGAAAAAAAEMQUcggkkooossssswwwwwwww00w00000404040444400084444804840484089A45A4844889BBA9A9A885E88848489BA885A9A48849E9BA9FBA88889BBE9A884845A89A9A9E9A49A89D1ABE89BA9FDtE8BFD8CR7RRARAR+RQRR/AEfwBH8ARRP8R/DUUQEfzJH8DR7R////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////DR7R7RAQAR/EEe0EQEQEfxtHxBH1FBD8JRAQARAR9R7Q7RRQPQQQRPRPQPPRRQQQAPPAQARAQQARRPRRARRRAPRQAPQPPAPPARAQPPPQPRQRPPAPRAOOQRPPOPPOOOQPPOOOPPOOPOPPPPRORQPPQROPPOPPPOPPOOOOQOOPOPOOOOONPOONPOPOONONMNNNMNMMMMMMMMMLLLLLLKKKJJIHFEDQCATbvrrhf3znd/XdVDddd1AJdzvq+v7u+p33P5X8r44AW9Xdx1HUJhMF4pThpQfCMNwfAvnAu4HUPFA5gbwCXBNBm4Q47n9/V1fU++q77vgE37r7h+7i64NX39c+O5zu4BQ/qqn87u593c6uvu76ncBi7jvrvur77q/7u7+53wGOu/67vuvnXd987nzu+AVf7+p1/fU/53Pn93d8Ar9333fO7nfH3ffd/99wC1XffUP3cffDyrlVz+fc/gBz3c+5z+u74e4+d33d3fdwC511/dd/85XO5zuf313ALv191f393P//q/lOdwAEVX99Xd1XcFXffdTv7uuABv59TuCr7v7gZXfdznOrv/gB7VXVVUVfVdwS9XX8J66quAWf5dVFV9zu4p8uv+7urqAWLq+fcq6qv6++7n993OAy1Xf8/v7u7/r+++/gFb+59393fO/v+6u/u6gFj/v+/q+rq5/1Hd39TgBvOqv+5Vf1P47u593d9VOAWLv++q/vh6lVVO77vuvgMt/9dz/767n9dff9wA26qqq+uqu6++/7nO7vuAV+f1/V/3dXV931V3d/ADW6qXVSvqufXy+5/313AKs7+7+qrhcdV9/9Srq5VAKlV33O+vqpSvvvlU/r+Ax/3f/V1PqXXd3yru/4AZd9X93dd9wnr++E/dX3Ku6jq6lfV1cviur4rlcrlcpdXP7ur7riu+dX3XUKnDRSqKpVUdyh4OgzcG6g1C44I+OCWB9AkQmDcBLgDWHgBFAGUF4F8qqF1XV1XOOVTl/z6h4qhrg64q5Xd1Ovu+qqOpRxRdXc6u5XUq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86n3OdXzuOKOc7/lyvnP+777u+dw9Q/Ph+H453f8U7nV1Oc5T53HV1dQ9x93ddT51/U67qdVd33H91z65/3df33c66u7qO5X853f11U511c6q5c+7ur4+d86uKf939911OK6u+uP7uur65RwucKhcL4eGu6v513FV3DVXd3O7n1d3XHwdO7l38+7jlHUc+rijqr5/3O+qr5z6qvuqnyvu7/75XH38pyhq7nK66qpVf93U47q+rnz76upd1yv6r+O5XzlznVx93fHV11/KPildfUq66lfVX/OUPFcruG7uLqquuvqpynHc6rnUd8+c446uUV/dXzqVxSr5w07q7lcJ4eqjq+O7/uG7+cUd91HK64rlFKqjq4uGhpVzqvruKFcoNQm4RqFQVQdKC8EkKgrgtB8G4OgR4JYIYHENKDMPCMIQMbg3wqUfDcCvOBlOB5HAhOCa4GVwbqF8De4Q4EBwQZQPI7hGEaj4NXOUDCD4IMF4CbCoXCEF4K7hUF5wYg18rvn9ylc/qvhNQ8oV1UHzrlOdx3Ou58PDz+59dfdVK+5d1fX3fK453Or6+ql1FHyu77l13Lvv7n877hpw9zq+59X1ffU+v7uVfX3Lq53K+7juV311XLjuXF/Pr/vuV8+v776q+dR3c7n1z7593dX/Xfcqq+r45331f853dVO7ufVT7+7uurnxXd1z7ud9dTquq753xdf1d3Xf/X1XcVzuuOuo+uPnKHnXD93Hfx38+dR9Th6inC7q4QudQj/cNPvhuHv4evh+dT5XOo/r7qu5TqfdVfXdc7lc+fd111f3y66/uq67qvvuuV3cVXcVRfXyu6qdX/f1/Dc/5znf3ddX9X8/59ffcupRxSuGq+7qoXOrq6r/53Hc513Xd/3Oddf138+7q+rnd8q7vur7+7qc53dy4/q67r7l3Vc+d33KXz+vuU53Xf3d1d3K587+r7r+7+++qurnf993dfdVd9XOuv+u6q/i/qupX8py5f/XX3X3119fdc7rnUrnx8f876+Hq6ud/d3yu/6lO45/dzudVOcLhMDGC8DOCfud1c+LncXzupS6n/Vc6vudxcKhCBfcHwRxcHwqBdA1qHgawLMEcDKdQagzA5gxArQKsFUoFWCuFwbnOKKoap/dXC4THDVFcVRTlKKpT4oHkKggwhHBRKqlA44KoTAgIJYDxBFARsE8D6C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Puc7uuvnxzv/u76qVzu66qX8u/v/++dy/n939zudx1L6+XXU64a745z46rnd8X3Oqu5z7ur7u+r45xznO+vv+/vu53O7++59939dffd33fzuruv4rudXc+u/vu77//7u6v51XKV3d33HcccPd8EG77nfD87h+c4GtzuEbjuBauHuAhYCLgHKBWgAehoJYCdAcYBwglgP0AEcCpAaIHE4EuANoAWQOIF0AiQdAD6BjOUAC0oTUC/i4HtSuEyqoGEpShuXA+uqhuuC0opQmpVXKoa64au/rh7rqupXf1Vw1dd3X3ddffzu7n//wn/+5VV/fd3X/X93fBjq7/huv7ndxVc/hGr6u7qv/q/nXFKGih4ecc7vu/u6/u/77u/u+/+7u7/huv/l133dVff3OO+75y7uVVxX8v++rufd/d3d993d9VUv7v7/n339993/f9dc75/dS6qr7++r/r7ruru/+qrr51P/6/u7+/u/6/76hHlU+7nc+/nDTu53HO7uq6n1VSv5coaXzhdVXU+oecdV8NLr7gzFBeC0Hzgfwh8UoeUqnL7+fyi4bqXV3V1ylOp3H3Hyu7nfc6uudVHXLqqqXVcX/y4qupVP+oR4Qh4RqH47rr7/vr+ruUpc6nx1ccdccvq6nKPupThVxQmruK7uofj+fVV1L4p1P5/UcVVdcq6+7nw0dS7r++pw3DXCbqKq5fUp1UcqlPr7753y5Rxw847jqc7q+7/5851P6/5dzh5cu647rjhrr58VXylL6jiuKuVX9Ryq6ndyuu7jrn3dzuO67vnd1xT7qOUd3U+Hij45TnO47nc7/udRw/VRf1/fVfF/876vrrvvl91d9Xd3d3df/3UN9T/7lco5Q851D1AeoAVQDZAfYDdAiQDFA3gzAFGBJgDaBBQE6A6wMIBugKEAwQSQIKB9A8hGB9BPBmcI3C+HqO591Puc4aH58+OULnPur5yuu+v6ur53P77qf/UffOr5Xcuu6nc/vq+7quVXK/rnX93O7q66l/3U7q6+Lvv++/qKoX1DQ8Kq4b+Koqlc7g6+vn1FC4Pjh4F3DQUQvvn933OXO6u+ffLldd86v7i+cquu/jq4a5VXXPuH+KEJSnK7nKHud3U753LnKvquVznV/9TldTqfPnX9cc67vn33U+458533fK6vq7q77u5VVXLvq6uXFd3f9/8fO7nV3V3V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/fy+vuu75XH3/Pu4u7vlOp9/K51FXff1VdXPl3X13f9c/n3/fd1U+Kquqq+/+fV3OXL+XPncfP++v/+XfzrlfyuVfXV91dXfU4orlzqdS44e5ynynL6vi5V3XV31V87iqrq+q5XVz65crqpThuKp8HVHwWlXDThM5VUqqu53cJnB8NCYRgtKoO7q4apVLq4r6qcuV1L5VKqqVc4urupznOrlVco5fcVRVK5XDXF1dSrl8rnd1X1fFOFQ8dyqrhfLuVRRwmo7qGucNHL/rl3fdyuKOLi5dcIxSu44VBidT58JhcNCeKp986lcdXy6jiv51FP7ij4uoo4pVL5VLuf/V1dd86j66lzqpTlFFOXKpdXUo7qccNDy7+D4XUXDzhVR1L+U6q6ucUco4e+VSuKKpd3FOv5d1K4p1OuPvjlcXcuPnDXKKVX1cp9VXfPjl13Kp1dcpVXyr7qr5187ur4u+v7qqriqXVXKqupyquXVS6qKUvh7l3Uuoql1cNOC04IYeBMgWIAZwKUBQgKcH8BcgGeAlwJkC3AoQHqCaCWAnwGqBLgNUBogphcGoed3HFcJnBiFwMIeBdB8UF4J4PgdSgcxwQIXBVOFzh5x3/LnKOVV1XdS+V11K6qOpd/U+66qpVV3U6+dcp9TqDcJggwfA7hMDi4K4K4I4JoEW4GMKhUFu7l1yuU64e/hGHgxA7gkg6B1B0CVAwgP0EUo4MQ8+pwqcIxcpVOXKVVK6l85XXHyr7vv5131L6qdXU53fd3OXf8/l/cr7q6vnO/u5d3f8r51cPyu+ruqu51Or6rvuo6u66u47511zv77u5XfL66/++6+pXX/1x3X9c5SlXX1cpVcp8Jv77u76uV1Uu5VcpyuK6qu5ddTvvuKuV1y5zq5TnO74oecVwupTq7hMcoT3ccN1FPu/nfFPq6hqirv+uqrq66nFXxXKOGq6r5AYAAAAJ7jAADCB3cIQAgIYglMGfcVcveffX//////////////////////////////////////////d///v+ccHm6eVzErEIFERRBBIDBZVwhDEMFB9AQIAwMEaqJcNSxniOIQvSAyAhUHQIHU3U/s3ppFYwLQxgRYAg3awpL2LCMkOqGWEEJPIDBQp3n/r/7X9///////////f//3//7//////5pToNy20hX39/2ZV1JT59e99uauccVV/////////y7g4gAAAAAAAAAAAQArAwAAAv0GAAAAAAAEMQYccggkkkoooosssssssswswwww000000000404040884008400040448400444448044449A844485A8880448444884489A448888A48A5BFA8889A448849BA8889ABA9BFA89BA8889BA9A5A45A8889E9A5A9BBBBBBBFEBFHtBABFBHtFH8AR+R8R8RRR8RARRQRAR8QRQARRRARRAQ8R9R9R7R9Q8R9RRQ7QARR9R7QARAR/C0fEfEfxxH8CR8R/NEfUUf///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////WEQEQEUe0fEfxtHxA9HtH8ERARARAQ8R/A0QEAEfUe0QEUEAEO0UT0EAET0EAEe0UEUUUEUEEET0UEEUDzzz0DwEDkD0AD0Tz0AEDzj0EED0T0ED0EDz0EDz0EEDzzzzzzzkDzzjjjzzjzzjjjzjkDjzjjjjjzjjjTTTTjjjjjTjjjzjzjjzjjTjTTTjjTTTjjTTDDDDDDDDDDCyyyyyiiiiiiiSSSSSBxxhA0QgFOVVV3UO5VXdRo/GuIjw+LvqIqpwAr7v7uGalcru4dfVf3UrnylAKf3dx5wt9/XDH/3d33d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5XVcq6vly5RH8/jTlUXKpdzqqq6n3Kq6l9/yuNUr7+rqNLlVdfcqq6uNcbhKcG4uAnwMUBhgVYuDUAlQCNA9gKUFsBFwImAoQEfAgIVh8fnzq/6+6r6nLqqq675Xzu51OVSquNPq7+VdS5cq6/6rn13d3VV8adyj33f93KNfceo99VyrlF333UMR48M/xquXF1cecpcq5V3UeUXzuLnHudx413OcLwpCGDGCWJqIurqPx+f31fO751fcr593OUfnU5RVxdRc49T59z5zvurup1d1O531fUaNU7jVL6ur/rufzlcuVVK511XX1c++7ud3GuqlXyrq59f139/y6l18pVfKfO4/Huc7ldSnUqr4uVx75VERUKVz6nV/zv6vqVxrvuru+o8uNcuqqr+ucuqqcuXKXd333XGuHXDYiE4uCqEcFPB6ARoIMD6BJQCdODcH4QxcHoWh0TC0Jwcgkg9BhCcIobDoqD04TgriZQ2JgzA/hHONGuUVFTqIiIUg1cTOHxURBqJgmhiEMECoTgohHKDcJwlFT4fD7hmcfi+PFQzxUaPFcTHiourldXOP1KInzhHwlUKxdz4mKqKiIbA8hi4iLlcNgzKDCD04dzqK4iJhKH3cGENuIjxMqg78OhWDURw6EoShmHx6uHXD+G87l313cv7+41z7/iO/nfE3XffKruV3d/zuc66765XfP7iL+/uErqoqoiUGavqr4mo/DuLjwvO+GznHg/d3V9weu7u53CDvj/wrV13VQrU7q7nCt3dfwivuu+Efd33cIr+rnwg+7+4RXfdSlcpShipXBqquH3zgnncfnOcG7ipxrj8NuPf/Dfu7+IudxE58v6nO6uffc40qjXd391V9wYcG4VgiziKr6u5zld31XEfVzncRzupzuN3fc7iLnfce4UuPOKi4fFwGqGYQQtACLBfAgIA2wLUBHQBqghwBIgR8CWgFSAE+FIBogAIgCtAoQB/BqLhSDkTDMaGyrjV9Sqo3Uo0r64i66uUouo1RF1yuPHq7+76v5/ddz7n/dyu7u6jXd3XVxfV8OioVjdX/VXd3d1K+4fB+BmgXIVgnhT53VV876q7jQ+c5xM484V53cedwtzuVzuGO6g/CcJREOhiPFwT8McX3zudxf8bvhiBPg/dfwx13/D6qo8o0ov++7iuur+Kqufdz5SvrnO+rur6q7vnd8euu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q77urq+NdVdz6u77u67u/5XLq5zq74qVcac++f3PlO6r7n/Gr7u7l9xEf6u6v+7nff1399TufLv5/P7/vnfXzq7v53f1P+IuVQVQLcCtBqEoPQN0F0VfOK53c593Odd993EXc7nO4Suc48eKnAqx4qKgScMwihaABCCLAd4A2wGCBGQEBBmBAQBigG2CmAI0BngMsEkA9wDJAEuAkwDXBNAoQnD4mDMRDEojvl3Vd1UqjRErqUuNEd8qlOc/qU5VV8+f/393d/33x+7qrqc7uLldV/x741V3K6v7+7jXVxdVxceLj11wzEwWVC19wt31/KomDcHanFQ6GbnEVFdffce7+rn9X9d3DNznEXOcMdzndzhid3H+4/918/vvu6lUepdX1Lu4/f/z5VOqj33ylfF/VXc4/X3fd/9zu75ylV3P7r/7/7u6/uVdXc487uV3cX//z7r6lf93fF3fKq4/993H+6u7jx7v+5VXyi4933O40aUe+Uu7r53yufV31G64vlKHdd11Derld3DarnUuEupSu7hvGjVfUT9Vd8auq/r6743cv7vnyuoSnGlGiKn1KcJx4J4RQO4fEQJkTBfxdyjwZhKcoZiYSupRcTODM40J3O6uNd1fX9XdV/XyvlXd//f9dd1df/XVdVK+r7n/39XVdd1OuVV1yqVynKq5VV8+VXzuV3/f/U7u7+5dSuNL+5dTldS5d/cr4u+d9dTquXO5VPndTuvianyq67+/qf13G7vuUX1F8apXy/u5T593U6nXHuVx7q7nK+585Tqq7+585991fXcuu/qpdXO76rr41y67qNfV11Lu+7nVX11dXc/uurrlVz7qfHrq7qo8DuCqGIHEHOUFfFXX86n9zqXP/r766rlUa665TiOG8GYuCqFoBM4FyAvziIBSgEeEUCvAjoEPFwLcA+wxBEh8LRcM3F3ynXd1Vyr7+48/++fOqu77+/rn9Sn1dXXfUeUq5XXLuuv6vu4qJi6i7u6up1X1H4mPd31U7jSiI/FcXGi4Yl9XEwxC3O5Xdyq7q40GEFkEaCDA8h8G4OVf1fddXKv5d1ddRqu4id3dx4uovnc+7nV1Op3d9/yur51d8+ufLu+6+q53zq6/6i40qq//59d393d9dxrrud3U5XPqLlOo853yq+Xd3c6vj3V33cfq7ur7u6urnfXz6uV3zv7nKfOo9Tqf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/r+A3d91O7q//v7+VXznfdwG67+u+77/+775VUqqr4AdV3d9Xd9//1z+u/5RoDb3d87+q/+vqu7u6nfUAv3Hu486q41VznDalVV8aquVVUAsSqcpSnG7vrqHV/fyl8r5wAu7ur+J6qNVVdVcrufKVxur5VKfKNKUadc4i5yip3U5TjVKXETrlV8ao0acqly6/6lddXxvlVVHj93XOUb7r+ddX9dcapV8r4393O5c5y5z4qU5TqUVG7hsXFxd3FXEcTOf91Prq753XOo9VfVXc65yuI5caNDMOh0XUr7l/PlUvq+o9VVV91ceIlcTcVE/G5zq53K4/KfUeJqIqu/i5VGr66uq75/XLuU5ziZxrqUri5/zuIqUJxfO4u5zu75zuc7lVXKvlc51Vf91XOrqIrqPGq6nOdRcp3U+r/qPG4jrvqpxu/u5d1131VVVyuVfVcr+r6qquV3K40pxqlcqr+r776+q/uX9S/quXXXVSuEpwbioHUI4BajwCBAUOIgLEA3wFqASYIcCzAeYI8EkBggOcCbAfoCGg/HhecMwbguh8I4uGY8e7r59zudynz5xrqd333VR666/lXd9Rrrupcqud8/6vuU6nc/n913/VV/8bufC0JQRIbBBnC0IYJYfBXUHISiKjRr6viKuFIZgpg5DM4Wg7cpx4fKH3HuK48e7rqu+u6qpy+5VVyuqvnV91d/1V1V1z59VdRuquffzqru53/P7nzj31V1dX3V/FT4851z5dXU6u51dXd//O7qfOp1Hq77vlKr65R+7uuuriLuffOU53313F3z58Xzqd/Pj1Fzi77vnKP9/11Hqcp3Pvn3yqX11dTnd3XfVy5VKdR653GlD51ce5VFxFxpRofESqqnVVKupzl/VVdXO74/UqvqcuurieNconqf9xquqqc6i5S5d3zlVxEouJuNcu5xE65/91c+IuPxFXdT6jX1EX8Rz41xuXXGq6qUpyq+XXV1/d1OfLl11f3dcrrvj8qiqucPnGudRd33U4q6ldX99V1XXV1dXdyuudVOqn9xuH8ad/1d8vvu/7j8+URUa+6qXK531d3x48rn3/XffXHuNUuI76jxE7/q/jVfLjXPnc7lz7r49Ro/dTlfd8qvlOV/cpXzldT5y65Vzu+5S7l/Lrq+f1c+uX39R51Lncrrrv+uV186ndf3X9d/V9VV3cqviPqN9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CCiEUFcOiY0o9zu591df3fHu+++5Xzrq66lUpcquu6667/q6q666lK+X3U+dR6j85x6nd1ddffdX91Kr7u51fcp331XVf/99dynKqnGqpXy+/+qnzuc7ld3Vz53/df/dxHdzu7uUvuU4urudznK7nz++vuU+/nVd9cac/6u58ePcR91OUe+uu6qUo8b43y53fOp1Uo1VXOXcvqPGnOc/7lcpVPq513L5x6uXVxNREuuNdQ6BHQlBq404/Kfxu43HqX8XUqvjRofcqnyjyr51L5yl8RK+I5cTKPUKVEQzVz764058vuXH433L+v676v+7uXfV1cu7l/Gu+NzuX9dffdc+V1xq+rq41R+uNP5XKqn8+V3dXO6q6jXVxrlyuc65cao99/Kr+q+p338apzibjXK53L5xuPxpy+pdc+p9VdTru+vvq4/F13XKo8o04i7i6uuV9z/l3V9X1UupXVynXV1ffVXfV9VOqnO++rn3fddcud1dc+ql/VzuXfdXx/vur7q6u//u7q++77q/nfdV9/1UarlLjT7j3U6nV1H7q65zlPuInc4mfHiZ3HgkjwxD4CnC0CDg9ADOAhoBUgPkBpi4AToD3AgYGyAXICrAfoJIBogD6A6wC/APcDqEUHIYhOLiZxo8up1dT41TlOVxuNfy7lKd339X9c/q6uu+pVdfOr6q6/u/7rn9zqVz5XV3cb7q7v/nGiJXLio04viKhBcbh8TCsaIlDoYgzHhOGbvq6n3/dyudR7nX3Xfc6rudXf1/Pqqvq6ur7+P1ynO4133cXPnF91Pq4858+Vzv/rrlfU6+Ln/19xr6lfdV8ar5XU6vuu+rq++4/XHv7r+Xd/dcfl/3d3X9/391Vx7r/66uXVx+u+pX1VVLndd31d1V/85Tud31c6qf9XfLqqvqr/uc6q76nUquq6q7q6uX3fH5c/6qVVUauo3XVyuGKgklx651H+d8u6+ca777jc64YlESuURO74/1fH5cp1yjXLi4mLg3HlDf4bO6jyr411HlHldcr6rrrlfOql8bj1/c6r5cuXUqlLjcbqo1ylKVddTrlOI5VKVVUaoqNG66r5/fKfKpynGrl9TlKr4jjXO5y7nd9y+5TlylHlx5X9TiJxMRDuUuru675d1fOuqj1111z6qqr6qU+VVd8+5cauGzj/UpVz41y75yjffKcRcapX85XPup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4mGIVufO7qUu5R5QXQVwRYIMDqKg1By++6+uU5Vcp139dS+413O+c40e53O493fz+7ucp3O7/n/Puru5XVz/6qp9fdTlO6i5S67777/vlfO/7nL+7n9859Tv+PcqjTlHvnGuuv77nd998p9/Oqlyvqq5/dXznf3//cu/u7lOP86n3fVR+o0XHu/urq7qud3Pu51fGj9/39y6lXG43UarldfV9XKca41yqXKpXUpwxxoi43KqupyqpVd3KdVV1fK/rqu/qGJQ2r4dLlBTDYRxoHdxcNlBbD4NwpceCmCuKgugcwahmUMRE7i4mU5RUMRMomL7jR6uV1dXV/dyvqrq5fdXfGv4i53XVxrncuX3d/fL+V1ddXK/l9yn3K641VOV85dXXdV/3f33dyurq/n/dRHH4Sruo/y53G53L7rjXfV31fd39zncvqLvqrlV1EyldfKrnVXzrnUb+rjfx+V1OX8riLqV3V19x+o1dT499XzvqU7ucRHudXXdd3fzuurr+rrjd3U6nXL6viKuquXUp3GuU+4051d19yu+NK+Iu7jR53EXVy5X3VyuHwpDoThioH8CWhOGau+p1dXU7up8e6jV8RdXGvuNfONH5xN3HgzFwvDMDDCsA/wQYDBAO0AOoIsBphaATYCBgZoCdAGWB1AcYCvBhAL8GEDqFYNQ+HR4i405X/xEquNGlONHqcrrqVTqNzuPV9Xdzu+uvuX3X3Xd3/8+v6rud1z5/d331U4bO+PV3KPXOJlKHTi5wzcq7heGINwJlfdVzrq4fUKcGEofUKQ6FriYfCcev+6nf31131c5TjzlxU6jw+64ur51c7v7uufXF877nf1cXdc7uvvvvu6uPz7rlzq+6u6n1d9V3X1XPr7rldVO6n3f3Xd/3G6uVS+67u/u7n9Tq6vu76+ufzv7677rr/6lOPcuK5ce4u7u6quIjzq7ufEdcqnXONdd3dzr/l11XyrqI741VcbvlfxNcom74nlUao99xupRUeJurjcuXVy/jSlKVxFXXG7qNKuo8ac/ibjREbipRo0M1OPFQihaEobFwnDYmEcFEESDkGeHyioiEupSvqKiYiUpXGqXKud39yuqldXO767rl111y5cRUapVLlxqr7lf/UpXXxqlUu518o8RcR/VyuqlVdXUupTquqvruo9fyuVylXUavi6iK5dVynX1dffco/K7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K5VVVOuXLjXKUrlVdcvj1xuNxHEXEVKcRKoiLjQtKEFwvFxcXO5/Hr++5X3UeU7+vqqqdfKp98rld1VdS/r5XK5VKUrr5cr6uuU5V1Vyj9VdXGqNcrvuc7jxEM8IY0HqhaKuLiZw3hs4jjcaoicbl1Urly66uNxqqqu6qrvnGnUuU5XONVSurld9TlBhByHwjjVVVP4icqjXLqVVVyuN1X9c/l1OUXEcurq6uNcpRHGqJ4SnBRC8BjqDcDiBagOkIoFmCFAOUCNgKECIgZYRQxD48fnP7n//O7vv7ldxdznO66lzuo/y6q6lXX9//X3c+pRu6lyr/io3L584iF4uNcXz51LlUf+dfdz5T7++VX87r5T7nHjQxcVU48PuL4uVzj3PnGqdxrlcaLlBFgc8DXBNBRcrnHlF8Xx51P5xEVKL4qoucM8P4fx5R53P6qLqPUfjzj/3fVzuUfupxo/31cud1x4nlXV3LlxuNffXca77/qXPjT51ddc/r5T++65X/Puq764333dR6v7lco/ynd1UeNKUTceURESl9dX3HupR5VKV/yupVcaU6/qo8aNKrrnUupTjXVVOupxrlcacOnHiYdFQ2DMGMVBfKBpgbYfUMQ+NEx4TuEoZg5CGHQ+DseFobwah3FVdQWwEuBeAgAAAAIoTAQC9B3UIEAAQAQiAIIxAoCiMAITXTEE+Fvv////////////////////////////////////////9////////////t39rVwJHQdNrv1m1q/yd8e//09znZ0T+XaGtW2nX2eTmHs+jq8RB5W/7+5d9s2NaSaa1mTtUc3/pb78/779UfJJPysVncVz/7////7v//////////391///v/9//ffv3/3/f/f5FHv/f3//+7Xf///3//n//3dX///9/bQXJEgEAAAAAAAAAAQA+BAAAtnMIAAAAAAAEQUUYccgggkkkkoooooosssssswwwwwwwww0w0w000000000004040404444444444084084488044848844404480885A48485A84444445E444884484448444844444844484888889FBBE9A8889A885E9FBA9A9BA9A9A88889E485A89A49A9A9BBBFBA9A9A9A9A9FBBA89ABBEA8BFBFBA9BA8BABFFBBFFFFFBDxBFBBFBHxFHtHtABFEBEBFEBFFBABFBHxHtFFFABBHtBABFHxABABABBBDxEBH09BFBFBFBEBBBFABFHtFFFFFHtHxFBBEBEBBHtBFEBABFHxFH8AR7R7R7RR7RQAR8RRAR/BUe0QEfw5FH8AR/BUUQEEUQEfUUQEUfUfwtFH5EBFEBFFFFEBH8CR/FUfkfw1H8JRAR/Akf//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1tH1EBH8rR8RR/CEUUUPxNH1HtH8JQARQAR/AUQEUe0UUe0QEUQEUUUUQEfxxEBFHtFFFFFH8ER9RQ7RARR8RAR8R7QQRRR7RRARR8RRR+QAQRRARAQ/AUQEfwRFFBEBABFBBEBFABBEBABBA9FBE9E889FE9BFE9A9E9BBBA9DtFHtFFHxEBBDxBHtEBEBDxFFABFBABBE9HtFFBFBBBE8BEBH5H1FEBBBBBFBABE9BBBA9A9FEBBABFBBBA9BBBBFA9BAA9BA8BA9BAA9A89A9E9A89A488448884884888888848844444484448849A8884889E9A444889A845A4888444488484489A44444444444440440440040840000w00wwwwwwwsssssssssoooookkkkkggggcccYU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JPr/VtD7Tz0LCAAAARIAgAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECABAAAAAAAAAAAAAAAAADAYBQAAAAAAAAAAAAAAAAAAAAAAAIAAAASkEwEAAAAAAAAAAQCfAgAAg4cIAAAAAAAEQUYYcccgggkkkkkkooooooosssswsswwwwwww00w00004008448404885BE489FA849FBBFBFBA48889A/tBA9BE9A9BBABBBFABAA9BFEBFA9EA8BE9EBBBFBFBA9FBFBBFFBABBBBBA9BFE9BBABFBBBBBABHtFBABH1H1FEBDxEA/xHtHtHtFH//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////MRQR/AkUQEfkfEUEAEQEEAEUQEe0QEEEUEEEEAEAEEEUED0UD0DzzwEEEDzzkDjjjzjjjjjkDzjjTTTTTTTTTDDTDDDDDCzDCyyyyyiiiiiiSSSSSCCCBxxxhhRA0QIAixcQkxGGZ6T1mpSkddJEPhTlyZEVCMueRNxsAOOKk3AmgcmhtJMiBeHwTh0FZ5UuvcqFojEoqJz3cAjROKpG1j5E8PgUXErh1x1I65VwZrS7v6cAPrm5E8ikif46a4/p80ib60np0pAI1YnB/LioVmkV5MZJh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W/++7v+/p39/S6Vu5v/pWl17vp0p3fdL++7u/n+6dOa5q3PW763d9efl891pPdeek9K3Wl3PSXc/Lml8/Kml0l1rNLuX1pWevXn4+RBGANa9eel0npPNL5dKzS5ol88i5qyKSOK5NxXIk1mnm4/+es1zUp9zcielOla1pS+6/N1mp306dL6dKU76TUu6V6dL+7mu+7rcjlci5p7nkTz8m7u55FZp6fc3c9Kyp5rnvrFzSOnf81b/5q/WtLmunNWLl0uKkwnAggjBeKpJpHw2CCMjoFcHzRki5NayJcIy4JS4J0kwhLut1pKmutyIlDoHIbByFes1Oavf99K8undJpqyJ61/rS5/vrSvcvmrWs09x9Y/l1nvuv0mu7rcqHRndK0rWeaMghnrPStJ5pdJXPcThsut9aVutzd06c09K9aVnu+enzUuk1O6d8vp/c199eblw+IwcgQx9yrvpT63dbmlzVuekq55o6I/Lj6S6xk8dD5F3WXLhKXPLpdJM0uTPfWKhGaevPS54DdaQzSTWtIqkukMSZUmEonSMghvu+nNGR8OnnlS4Uic9xGGYG4jzSYqLulJFKXFSojz0r3NWeT0iEIyJQMAAAAAzGwEAqQdlCEAAAEAAEAAAIAAIQUTW41x89V7/9vZ9937v/39//3/////7////3///////////////////////////////////////////////////////////////////////////AASAFEAAAQABQAAABQAIAQAAAAAGYQAgBAICEBAAEAQggAAACAAAAACAAEAAAEAAAICQoACABVRAMAAADFSCBALCGBBJBTBApIGwqQIqCRCVhTAIGCUQRd9+v3vAAm4aAQAAAAAAAAABAHMDAAA1twgAAAAAAARBRhhxyCCCCSSSSSiiiiiiyyyyyyyzDCyzDDDDDDTDTTTTTTTTTTTTjjjjTTjjzkTkDzjjjzzzzzzzjzzjj0Dzzzz0EEUUED0EDzz0Tz0AEEEEEEEEUEEEQDwEUEUAEEUAEe0UUEUUUT0UfEEEQEEe0D0e0EEEUe0AEEUUQEe0UEUUUUUEUQEUEe0O0Ue0UUQEUAEPEQEUPEEPEAEEAEEAEQEUe0UQEUAEEPEQEPEUEUQEO0UEUEO0AEUUAEUfEEUUUUUQEEEEUUUUe0e0fEUUQEUe0UAD0EEUAEEfEUAEEe0EEEEUEQEEPUUUQEQEUfEEUUfwhH8DRRR/AkQEQEfwFH5BH8BRQR/KEfwREBH///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xNH5FFHxH1HtHtEBFDtEBD5FEBBH1HtBHxEBHxHtH1H8AQ+QRQRARR/BUe0QEQEPwZFBFFHs8BEBABFHxFEBFFBBBEBEBABDtDtHtEBFFBBEBBBBFA9BBBBFABBBFFABBA9E9E889E8889A4A8884889A448880440044444444040000000000040000wwwwww0wwwwwwwwsssssssssooooookkkkkkgggcccYYUQNGAFTvkXNNdb6QncV6U+IxcVmvmk8dNAI+IQvBFDEGEO3CciE4fAvhSF4uCWEkG42FqQjhyDGHbh8M1+AEPmuRdZo+tI65ppUuR0lR9/ffTngBHl0lyJolFybuleRPPW5qTzyLu4fSvPAJCt0kUp0nulOlwxSevIp0l80mkmTAJOtLrd3SR89/NS7pyeR/EIUl3AChyOMiNwinrW5+tx1InWVzdOnI6UgElImm6Xf9388v7r1uXd1nrW4BLfcutay7u633FLrSXWtY2t9ay7gE7c9z3dY657r3cOdayrnnjbrWVc9YAYue5d14rPLrH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VwajofC8NQkrP3wvWITRWLjI2VWVBuGYrD4bisbNPzTzdwcj4nFIVkR/S60nkfcqMnmjofDsTjZMuMj4mOAAAACUCgEAswcGCCAAABAAAQQAABQAAQBBVF8Hmb3GZTf99f3FVZ/9/ef2////////////////////////////////////////////////////////////////////NzgKAQAAAAAAAAABAMsCAADFOggAAAAAAARBRRhxxyCCCSSSSSiiiiiyyyyyyyyzDDDDDDDDDDDDTDDDTTTTTTjTTjzzjzjjzzzzkDjz0D0D0UUT0UDz0UAEAEEEEUUe0PEEe0UUUUe0PzZH8AR8R9RQRAR7QARRARARAQAQRARRAR/A0EUAEUEUEUUPEUAEEQEUEUEUUQEUEEfwBBD8BR+RARAR9RRARR+RRR7R7RARARRRQRAR/AUQEfyxH8EQ/EEfwVEBH///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9lH8HRRR7R/BUUEQEUUO0Ee0QEO0UUUUAEUEAEEDz0EEEQEEEEUDzjzzzzzzzjjzzzzzjjjjjjjTjTjjTTTjTTTDDTTTTTDTTTDDDDDDDDCzDDDCyyyyyyyyiyiiiSiSSSSSCCBxxxhRA0SACSCG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1fz/fvf33335/d/3//////////////////////////////////////////////////8HRQYBAAAAAAAAAAEAgwMAAHAVCAAAAAAABEEGGHHIIIIJJJKKKKKKLLLLLMMMMMMMMMMNNNMNONNNNNNNOOONNONOOOQPOPOQOPPRPQPQQQPRPRPPRPQQQQQPPAPPPPQPQQPRQQR7QPRQQQQRQRQPQPPQRPRQQQRPRRQQQQRQ7RQPAQRQRAR7RARRRAR7RRQ8QRARRAR7Q7RQRAQ+QR7RAR8RR9Q7RRRRAR/AEEEO0EEAEQEEQETwD0UEEAEO0EPEAEO0QEQEUQEUfEAEUEEUfwBH5FHtFFH5FHtFH1H8ER+R7R/BEQEUfyZHxH5FDtBFEBH8DR8RRRARRRR/AUfEO0QEUUQEUAEQEe0UQEQEUUfD0AEEQEEQEET0UQEUAEUEUUAEUQEEO0fUe0UfwBEBH8ARRRRAR9Q7R+RRAR/AEe0fwVHxHtFH1D/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ZkfxpH8IR/Bkfw5FHtHtH8uR/CkUQEfkfwNHxEBFFFFFDxBH5DxD1HxH5FEBEBFEBBFBABHtEBHtBBBFBEBA9FABFBBA/tBABA9FBE9EBFBFBFABHs9BB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48Nu5MVE0kQ2kbw2lZw2KnFQ6WfCMD0LwVhkH4K/SWkIwy48OuROCaAwQNpYyteW+sbfcn7ja9xtZ3GdZy3dY275Z9y98X05NPk3c42fONnc426cmdzl/r331u77l6Tl6zuXuss6yZ333/985z7uk/58NufzgQKzn849JY87iMIYqsssvOPInInBaRFzgNYAEoDrhGHRnCc68Ay3AX4TgDnBWArQBHxMQpBWJioh0uDMmPC8mTInSNiYmsTIkzpywyREIyE42FJwvH76U4jDpHfWtJyIuk7kRtZaxUbXj8bBWHVg5celaRsiLhkPlhkOl5ZNLjxssLxVYmF42GwvCtZMKQyD8Iedye59ORH5NeGyJMP+7kx63DYhHhssmnOsid0rGxUQiomGUirh9YSnD+HSYTiMGoqGyISu6wyD8iJjxCEZxM4mPCMXBBLAqkQL4hAUYWgKsOrG3O5yziEIywpGXWDEiWRCGk+RcX0jbuNhWD0TXiaQynS5zgpgOJ850uP9Z3W617nS4/c+s425Fw2LiYdGzjaxvGSI2csmLuJhs6TkR+Px7kVjznznTj85zv5z7nf3Os/uffPn3c7p17++5/zud9z63dz6/dz++7vu7v53OXutet1pWt9/WW5Zbrd8iWt93dO/l6yznLda87+7p990rP53Od9fnPndzu+6z7+7ut8/jzu6X/OvHrcKRcVCdZ3W53OkvO7ule7u63LHk1r3Tut/Wc50uRSlz53InHkx6R586VkT7pOnO50/u7+fSfT586z++tOk/vnc77pLS6XHulaVnWRWRciRSdKRMbHnTnHk0uMpc6TnzutZ1rc+cesmJuMnPnHpyZzpc60nSdKUnfOceTD4HHPn9Prd99058+l3HnO6Tul0nH53Tj3IrHuktORx5xNKTieJuKjxU4mk48JXDImd3dbpLFTiYqdYJoEystevffWdZy9etedbrWvLy8s6zvud8tJeTOTcvLSNuvfXluW7nL3d07+s59zu+fOX++/rfzufcs7u+s77nOdZ3O7pOc/uTO7pSdK9LnHluEpYyPC0JXFTnOci4mTB+RArhGCCPcPnIh0NrDeGUgtxNIJoT4yJio8+JpEYmCKkKRNYqvIjIqTCUZCCcXXj0iobDomE58mRCNZ9x5zhek+txciRExdJZxU4ru6z5ER7/rCkNu4/DJHEOkVLLzn3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ddI8mkTOWEYQRUbOROIx4qIVjx4ZEY2F4PwduPF3DJEVDJbiYm5ZxMtZaRvW63OIQTQL4Ea4DPGQgjYX5MLRsbGUjaRlxtK9bi6yxU4ydZw7iMTcMrDrh3DaRUeJlnTu+fO585zrOc53O6/zvu539J9Ln15/y3/y87rS5znfO53fP+d8/nOfdzu586T485zpWPzjzrTkTpSde750+7+fScfnz7jzrPpdJx53Pudek+lz5znS7r39aVp0p0uXv5zufXr3OkIYbDoHr7rORWRfc5M5bluXkzlu7++tK1ul9KTpz7nOf984/c6z6c5z53O6c50uciPcedK8+tJ0pSs+dzuc+Njx+Wd3c+d90uRzuc6XSPOc+fOPO6c+csfj9KzjzunHnSke49Kc7nP6XHnSc6T5/O690nO53PkSYLwQT6dLnOdJzndOfS51pdKdyyJy0rO6SKXS5EsTFR5xXI4mcTHirkVipYqcNrEyZEeceD8NgZQdgHuEMAeoNQBxlgHOE4BqgJkDCkBKwF2WtZ8+/vud87ufLXudJZ3de6XO6XPn06T6z+l86XW539a9bu+7pWdet/LO6V7rfXlpdfkSJ158753dOTdPnP7uc59Ol/SvOfSXp0pw2EMAaYUgG6A7hKA5gJOA1gFnBFAFXcFMDWNjZMRhKceKipMfj1pIhsmB7jwXuBGgNYyA4kwlFQViEF4KxMsVTjYfSH1hs4dEw+48Q4NRcPuLhk4ZSMkQ+sF4mJgUwvBeEEsTLInceGQerC8TcMnSLhOsMie4She4KxMLw+UgAQAAbkcBAHgH9AcBAAAAAQAAAAEAAb7/////////////ff3/////////////36/331VX9///////////////391//f//////////////////////////////////////////////////////////////////////////////////////////P+lGAQAAAAAAAAABAO8EAAAsDwoAAAAAAARBRRhhxxxyCCCCSSSSSSSiiiiiiiiiiyiiyyyyyyyyyyyyyyyyyzDDDDDDDDDDDDCzDDDDDTDTTTTTDDDDTjTTTTTTTTTTTTTTTTTTTTTTTjjTjjTTTTTTTTjTTTTTjTjjjzTTjTTzjTjjjjjzzjzzjjjjjjzjzzjzjkTjjzjz0DkDzzjzzzzzzzjzjjjjjzzj0EDz0Dz0EDzj0D0Dj0D0ED0D0Dz0ED0EEED0Dz0UEUED0Dz0D0EEUO0ED0EEEEUEUTz0O0EEEEQEEEEUUQEDwEUTz0ETwEAEEPEAEUAEEEPEUEUEUQDkUEQEAEUEUUEUQEUEUEEUEEEUAEUEQEAEQEQEQEQEO0EUEUe0EQEQEUUe0EUUQEUfUUQEEQEAEEe0e0UQEUPUEfEQEe0e0UUfUe0UQEfEO0fEUUQEUUUfEUQEfUQEQEfwFH8FR8R9R+R7RARR9RAR7Q+RAQRARR9R7R/AEfUfw5H8ER8R/CEfEQEfwBH8AQ9R8RAR+R8R8R/AkUAEfEQEfEAEe0fwNFHxH5H8ARR7RRRARRARRRARR7RARQ/A0UfUfUfEQEfUUPEEEUfUUUfkQEO0UfwRH8AQ/AEfEUe0Efke0UQEfEfwNEBEBEBFEBH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6RHxHtHtFHxEBABFEBHxDtFH5HtH8ARRARRRRQAR/AEPEQEfEe0QEQEfwRH8ER7R9RARR/AEUQEUUfwFHxH8ARR9R/AD+0QEUUe0UEfEAEe0AEUPEQEEEUUAEQEQET0O0QEO0UUe0UUQEEQEUEQEEUPUEUO0AEUEe0EEEQEQEEUQEEEEAEO0QEUEUEUPEUUAEUEUEEUUAEUUUUUUUDwDwEEO0EAEO0EUEUEED0QD0EEADzwD0UUED0EED0EDzzzzwD0D0EEDzzz0ED0D0T0D0EDzzzzzkD0D0EEDzzjjzj0Dzz0EEDzzzkDzz0DzzzjzzkDz0DjzzjjzjjjzjjjjjzjjjjjjjzjjjjjjjjkDjjjjjjjjjTjjjjjjjTTjTjTTjTzTjTTTTTTjTjTTTjTTDTTTTTTDDTTDDDDDDDTDDDDDDDDDDDCzDCzCyyyyyyyyyyyiiiiiiiiiiiSSSSSSSCCCBxxxhhRREQIBuwgYtvK959oon13iquum9r2lb00SVc60vRRANqKZaJMtTKTYVpKG0ahYhWi2GOSjCQyUWxlF8Yys6KoUIriRGMOYAX4WIWYdRHiXDJRA/T5kTwDKgFxALmbAZVctL1S0twbpaQ8yuK5sAKsZRVDqAMmANmA8I/A/wZYAWKoBNx6MYlS0+Jc+F6VjOqAi8vHp8F3LQMyAj0APkvH6IcxyH8N4M0VQHFB9gPePx60HuXrv0TJ82i96OmZAEL2omV8lCpFkVcpeu8QZ0MsImEVaRvJQnQ/lIti6Lq4Ai41C1aIMSq47KxEnxBlrx2HErwZIOUP5e9MtLy86u9FEAMlobwYEJC86ZAMaFGFuD9AieCMgeIEhB9gvYYIDxlYSMtAcs6P1RFrqqgCBvVXEKuu8F9eu8Z11XgrL13qvXXIL1Vy967wBLXr5/e8tXXz667yC/eu9V51711d+Ab96r1XrqndddVdfK9u9711d+rqqgHBa3eqquf111ddcta970d6u9d+/AE/97V13r73nVVcvbvf+fXftfvAE39rW7f2vXe0T36KL25KibRI0WtAEj13gywQsHqIUSLTO3eqN3lr36bRR13p7WgB2vE06mjoiuiZTFk2UmQrxNLz5f653MpnzpauAHCiLJ0rKz5sjNqvL3n3gsKZtHRGctGVFry8temAIebTeuZK1zoqqtOnU0QtylpadXIOmVtRaurgB5riTOlpSSm950pJXolIL20hl7SUyWn941ROla4Ag43DiEfEmqde0nR9qq4MdXanpov3rrt8A2bTrSt5equmRqo78QK45D2FGBtwV94k01z5fveAa8ajdHzpDVRJ1x2EmqMo511xqRjdq+iimumKYAb50TS8T3n1RLkpGZDuMpfg+UyUlDaKormQ0S8+Px2qCagn4BvSCQ2hAWj9oMKRhBS8FnAu4LadB7nz65euq8rXXev+AKSuquu9V5/9fPqj3effot0V13oorgCl+9r110/zO1pK/aZ/MtRanpmQBQWt2ta821PT24mta1qK6713tVXe0ASVvo73ptRRbvwau3KWmyUJdMybBvgxQ+tADLa3bqlYCmtA8wtQuSCJMfgnIxnSsGedPmQmUQ8gSsAyYC9gT8+AGiHEERMgYfFPAana0A9oA1oByzIDsiaTvEGuWkEIWMoaJGJUYxlGEAR15/LysrePTbz67349XXRadNjvGVXPkZ0egCQt2rrqqrmU2vXX9q+02XvaqqWl7yUJMLED5M6aZs6Sm2rjKEq951583nRNKxNIz5kpGVNU69Ur3r/prmd78SonjCOw2lInmxqMofSGPWtemWkNNUyq8yfMkp9MvE8lDifCTTD2mHXDiQQ6hrXDiIMUwpwjY3FFEa5k2JcOaocw4krSNpOmbaZO5GbOvI9fR026+qfTPkETx+M4vmS8tH6qq66pK9pl6qarVSMavbrrvNnUTZlcybbnUykQYiw/guZGF2MI/aXple/e8radIJ15BK1WqvVauivrrrm8gvI2riuL4O8CPjV4TIZ4KGB4gloOMdkY7aS6bUdHRai9FrdrW7UXvRa1vtRe9rf2vf6L2vam17d/ov0W+1dr9v79drdu/e9701/bprtfvavve9drf1W+1F6Ojt0V2o5ne973r+v+1vt/Xe972tbtRe3f/+1vta9He/3tz+qu9XR012roqvEiK5SG9fzKqJ9VdE+9dNXVaq1d6rT67110V11dV+fMva9Ha1u30d6K6L0dN6OiZR0UUXotMvRa1Nq6K6KLXtXbovbtai1r2tRa1dH10XorpvMvTeq9FqKO9FqbU2tai9q6O39rUXtamujotR2opta1qrWtR09qK6arUW6K6LW6K7XvR9NM2qRimntRbopt03tb6KqaKO1ryXXM6aKJ/ftRVRXN5O8jzeRmTOTkabTa5GdDiJMJU+LLRqZKTYUJl66a5s2feQSkXRyA+YQdFdFNu1Ha/2r7V2+97Wvaui97V379N+ii3Rf6K5G8jeb02t/a3e970Wqp6L0/Re1u9Ha9q6/va3RVeivr712rv27W+iZ3otb6O/X96L3v13tI2vai1+1p0vaF6JEDIh3AzIhwX0QoY4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7RVKU8T0yVotvbjnJWhMtKSkbjUlaUt3jkOpe8WRTLT5euu8y8lMl4zl7Q+mxZII9IapGJUlK8ZVzp8UUTKaJkYyGZRz5eQUzY7RRXXyG143VadyPE0lXLy1chmXn9FrV1xPxnGUZTI7M50rKzZ9pGOyGPS143JS171RqZVH641HIcSCMbVVURqbei97xqfa1p9M286qqXmXtHZt7S15fvzK6KL8WURuHEKsFxBZWkFrX6r8JUapnTKa5eViRLxuH8doiRBS3iaiFmZBihxDeSlp8ajOJ43BNQ3g7RPCjA+wsUQa50gnwgp8gnwMCqETLwhqYRkIeBHQjIQ0McQpefaBkX73veuBn11Xn3ve9d7z6qqp/frv9FdfVXVXXe9+3eU6O33v2t3+U7W/vfta3RyP2ot9F/t2op/t2t/e33mTabWva86/brn1yPa3e17fa171w1tKUQ5hXi6EdDymTmQdIWYb3gRHa3auQQHVANCATkYwKSFCHkUQAKRRF8YQImKJGTgFtAOiANOCUg3w+gRUUQYUy3BZcrGECngYEC/gPGAhcMcI6NRdy8ZR6S7RHhkiHVGFU+daim9X112nS8gmSG/embXHpeZKwfYuq59V5OSn1TptXMvV2vNppk650vVVeiQXjslI2lZ8X0z5l+1VFUyuWkrxhDWMpGSmWrrkNdFpOXl659u/e9/oqk6p9EYzY1I1zKaa6I1Nimuu9cymViuI86Wj3MgQeAYkGBAeM2K4yrjkeiiZDWM41EaOVSV6LS8cl4/IxyqmnkapKJUc5k2mKIshnhQhWm8B7wJa8XyMtMptaiifGMaploa3rrvX0Xvb6LXvRbvPqvI9UrTIIzpqjVp8OZ8htI0XrvPmz5aVjGHMR67xZEKK4SZeS5G9Fq5kejc379d66q73ptVaQ0zZkyERBFRRDJDyBH1wIXIwiYRsD9IycPINMVRXKcpOgKSDXBIQY4EnC7BygTcEXESF+B/h7Bi+3267Xvbv13tX37112r73rv97f19/6L9+9rX79f973vV1du9dNdqq+r+/for672rtboote3e1F7X//p/vXMv13vTa96/va97/a/X1dXX1Vz7V1dN736/79Vd+u9XPtP59ohQozInv96r/I2myVfbt25tqbSUtCbGUOYpp7Ud5k+i821FqOjovMvT0yNHai16apS1uZemqm1qKei39Fr09FqKKL0V00Wvbt0Wpv2pvRai1u1qb02omW6KO1Hb72+r+959r2+1E+jtft9NqOjte1u9uijoota1umm3R0Udvte/F0KVNFPMvMtTaii16a6eRvbmWm1yN5K8nw8iFTM7T43XGUVQV0KsMUCPg2R+NxKtEaXqlZGuKpl5eXkYPsEjAR+G8DngvZ0rXMn3vXe1dq7dquvvX/emq3RT1Xte9d5/Vf73+32vXRXTRe1qO9u1Fvt966Ojota33ove9r12v9F7Wot/2ormXrtRXa3a3e1+fR/au1d67/e97UdduK5K1d/teijo+1FdM+FOQRPD2OQ3jDijh/DRFEP5OKIHiBrQfoJyH1UUQ/hMlYf8P+FiGiAYkBBYAMIFhFMKNEjw1hpmclL0Sseptem9M6WotJT6K5WOS1V5a06G0ZQ2imMZs+8GFA4ZWI8zjd4otJzI5IJBGUglpk2XqmyHrjk20neubH5WG8PIziVDifyt6bdE2PyNplcj1Vz6JK0vX3p6a4yo4cyMe5lpnG645VCpMr6pBHZGJdU6UrlYSa4ZZkP5kJ8yJEhiDG6rzp8bgILLwAOQKqGmBLwgIl2pqkY5eTj8nXeQ1T45EK8A8oylaYHaViyTtLy1ErMjVp0rXEKqAr4CEwNCQQGpIbR+VoolKIniaFTgwJSEumIdvpkeumben67103oorr5SuHEarkaJ/I3vB7rol5KfFF5t4k0RqSi6G9UnK0RJnxyViNVRPi28JMvVxGm3rve9czla5lEEFTHudEmAT8FRCDhnhFQrR2IknXDeFKC9gbMFPBIQY50K8FFBpgmYdQpQN2DJTA9QEdg9wI2CHgsYExA5bVWqvVbte1fX36+vv3797Xve17973va179dF71/9V+u9dddu9d6+9d710V19duu/b7d73v2qvbvfve9+9ddF679qq7Xn/aqujve3Xe167dU+/ed/O72n3var7z735/8+iu8ve/P79X94KWuETMmy9pTvefemmda9M68/iqNxfIwnSMnylEc7faZDubVIxVVPkaqK5HqomRjRebI2jGZH7xuSkaLSU+1Uyi1MyR5DT2rmSDpmUWqpqqomSNqJn2mSPOpn3kZtX026ptFUYUUXm0y1EepvRJTJBeQUyfLU/G5ld59EpRVTbrpjVqqOu9NV7U182ZOrn008jRMtemu/Ta1qe1qKbw4mQXc+0naq0lV3mRqbVJU3qk4lxubIxyqIkV0xKh1BEw5hDS14wieZCnGoiw1gk4bQNeLIWZaCQtGMtOlq6p1oRMWwQUMkBvwgYWIzgcfA3by972r67Xrr73rvX9673teu/Rejrro73veuuiu9/v96+jt37fei1+1q+i1ubRXejot3otfta32t/9r97dXX96Lz6ZlF6Jf+16b9dNF70V9Nr0V2vRydMgh1FPDyGLom0cLNd6P6e8tASWBRwMKBHQ/lYoh/CrxAlYUefFEEPCGgFDCFhCQC+gJbFEVz5eZFktysAvI9AQ2MIrgXsG6ZEuPxlF95tVErCQovOnS1Nd6O9cy1dc6i8SYstGNcjOkE214xkYY6o3yN5SbNq65LmSM37XieJElGpaMaY9IOiXpiDxVTPnXkMna3TMmzrSlUlRamW5e9dEn/PrtIxqvv2mfa167XnUzo5IYlTe1EUxGrlqKpKPd6OiqbRRyMvAsYFhAvoA+YWYxrjcX1ycgiiJorrpk5lcZwmT6rU2lrSfTRP5H6p1VXwH1AZMXQw1Xv3qvRTLx6HMjE8eh3MmTL0zpklTPmUWotTeuRpk6JKqZafJXj9HadRR/a1c+170SslH6Zl+uq9dVr87rlpaZPq5ld713673tfn2qovIxBg1yCWgsIGhDPDTHJkERAtJKDNBEQuw6gckJcDrCvRAwo5CrDDAjYqglYD5g9wAGwQkBWQ/g1Wt97/bt9+9qKb0d/va172t9q+9rX+3Xfte/3t2t2rt/9+979+966r12qrv9F70Wv19+uq/fve9qrV2qvXXXefeuiufbvVe1+vv1V1UV2rvXz+fevve/XRXau9673rtX1UT71d737364kwoUSU2VjlMpNmSMyqOS8jI3mc+u0VxlD+Uk45a1vo+iu1NFqeiqjptR00UzLWprorotMl6Zky8jTT03mfai1rW6a6KKb0fRbopo6enta3bp7dF6KLXorotRRR0WtamqZRRaZ0U2vbo6LU3ta16bUdrWvbo5lrdFrdrU3tMvPpoooo7WpooqoptXRa8lGMOKbUXprmcy0yiiqi0ydI182ZebKUyGFSGSCOhmgREHCUk4mpgzwuwJKEZAp5eOwn1T6p1ctb5KfREKDJAsoXIEFgbkXRHrrveiiiu3XRPqq5eiqf2vX3/ve9712te9rXtei1FqLUXtTau3e16KqLd7ddHai15lU3pmXro/teii1dr9dr0W+9rdrdXRX012rqrqtV10VWve1V7fai16LUf2tftw2hfpmUzJl7WvR1UdrUX6YBCIBdQD3gD4hxGEP4f/JxhD3hVhogfoG9CdBAQVsBDooh/MkqpX5WKJ8N+H9Ecr66oolr0V0WqrndfXTOokaZ/R0XqkofStNUvPk5SPSUjHJ02OyUZzbSVXLSM6NzpGUprnx2TiFambVF8jH4jS0bon2vIKZtqa+qvpmRuOT4lz5/e9qb19qLU273tFUYx6uZJ00xuLI7PhahlvafKz5KPRdRJcTwl3iFF8N4shRhSiTF0SI/CAg+c2ZAW9EreA3YKKAyIFfAGpCdBExlE8+fJS9URYj0y8hkMlAHdAgldMGWAFe0jaquMuqdCvNg9SsB0QCDwLGGWAg9M6Q3jKVmcnCTFFUOoFpBdRq0hkFNqLT70Wpqtfooponz6qrRyNXjkznUUdqIZIMKZMr4/E0WUzZamG0+JHLyCqZEiqTjsRapkyQzocQ250Q4lc6idRyNE+qZCTA9RdEWL64lwE5AChDqC8hvBjmRjEuEhNg2wtQqR+BVQWMS4CWwFhAuoGpLRuF+CchigSkDhgJnDNDuHUEFAvIgQyxJqvXPr+uuuuq1FdV596q7V1XqrrvXXXXXftaqrveurvXX/3ve973n0V1dd/v111duq9V673ot1869dV+1p16+i9fOvXXftafevo78697XvXy167/XeVrv2+8r9+97SG9/tXyG9u33nWp5W1HNtNjU6CjgwYXZK9uRqr4n41aMq5SOQmzY1G/ooijtxPRTyN7WoiuXrieJ6r3nVcc5SmZF8ZWjknFUZcZURVCvMhKvHJeEPOjlMpMvRF0ekbXq5BNpmTK6p8+WtJ0Vd7TLSM2qdTOlZGSq6Pqrk5ktGFN43NkpaPyGiZMmyUejOWokpOVku8avPkFUyTiy1dM+ubKTK6rWvNn3tRPvJSc75KmqbIyNFV6pfkrWov2tKWjcWVwYEFjxRTI0VTr2h9Njl5flaYVYzi2Xhjl4CegmoFVDeHkJkJ8/k4FdHomiBLz514Of1wT94YYogXEWwhp8EbCKhFQhoDriHH58Fne94h3veEZXO59V6Kr3v373vXe96q7dfa973vX96713vzL3v9HM+1+9cn970WvM667UUV0/2rt2ot2+1vtRXb7W/+1Nuq9FFf9P3o6Lz+16f6L36LU9708PY7CXDWEyuGSEhTRGqeFeHPRfta9c+AcsGiPQiYI2BKQFPAUMM3Am+A6YogyRZGqYCBwGhAClACZAMrgDtvA6K4CkgY0Dcg/wEZgQmCvhHQGhHqIeRhJVxnKyUbpvC9EauWnT67ytcy9q671TqJSM58+0jevvxuZOolIk1WlI7Hp9NdU6uN02+qbEmQz7/IKpsgn1T+mZamZDaSlpOLb1T5WNVxfTa95WOyMev0T5k6VhtOn1UXrovbt2rp41MmyMpNvReZXxlDimUtRPkZaLaJkelIvmRCkoY7w0cDAgFTAcsA64UIN0lG4aY5H4kXko1RRzOWj96rSkUQ0zo5PvI82VkrVRVAb8AC0NEFrXz+fL3t3qmy86uQ3olq7S9c2dz6Z9VrWtXRJR6XlJ8ftXMkqpk+uXmSvaQVzLTaqJ1MYxHqtXR0V1372vaimiqu16b2rrr73rrrrvy8dmSPVGMQIsgb8AjYX45DyLo3A6YJCA94DZgjYmgyQN+CFhRjcE1BWwwxdAz4L+DCgrIEnBUx6BrwXclAvYgQcLWt2ov9f19dNV6rz7VXq59qr3ve9V796Kq+1vrtR2+9F6u9qLX6L2vXeu16+96K7zKuvroqtPvVXXXe9719VdVVq67f3vftei9666u9r0T6J96+/VXPtXRXf+1Vp96rTqJ9dVFVd+feuiu1dvr6p0VRfXCnGcZUcvG7yCiUnVXveRmxbCfIYaw2ovbv2n02otR02p6L2oo6b09N5lEyqm0jRN6eRnTZky0lRTRa828jXRMpote1qK7dujotRRbp6a6aKLUWovTVa1rUWo5ldPbovMq72vRNotbo6Oi3a1qLc+3RPtRRe17Xovbkb26aplVqrTfovR26OjorpvR3kZBFNHM5nN5t6eRqmTZSqNTpGOQyw9hxAR+BMwpwsQcq5KJMnBJyCKoIiIUXyC9Vr8pVNnRqvmwIJBAwEsgsIhQiLXmVyfI0X+uqidevtR3te1q73v/f+1rUW7/XRXe1UzpvT09PRaiiRrpm2ootNnyN6Zl7UfVaZ3ve1q6Ld+1d7XvXbv9ddr9FNdHeij/6PvRe1u1/7Xoova9dF6bdUTRFiqEubfte1NVu33tR2kZ0+OxfECA1IDIgHPAb3w/4ohoiyHEyUgK+Az4CYwGPb/4D4gFlAOOFeANKAiUDShARHiXJwwQ9hmhohblefNopnzb9d515fropnzb1xRGUYxyVjcatVRaOxZGMjGM6uIkrKxBnTo9DeibKTJBMkZSPdcnVHJHhzL113mT6J8TT7250+mSvILRyOT5OMZ0jxVLzq51FVcy0fonUXhtOnWpopojV4nphW72ncneQWnS9c2J4nhfh3CTJQqy0NMpEGL5sDzI8jBxl41GcBpS8AIMEHCOgFFA3+E20cnURhVEq0tRLz4B72omwaJDFc6QVyUlTIeC+jGBNwEegJPCRgNG9F7T7Rh0VxqZE9cKkSoPdcZUzb1zb10T66Kar096L1RNRTVVFEjJ9o1RMqpqrg9VTLWnzaKYlytMjEOOQjq66rxdeRnRFpjVU6fDe1dUQplF6bTKpG3IKY3C1TDHKXkYHyDAiJA9TYKGKY7CAjGBkcELAc0OoExC3CzBZwuQ+h9BWQIaDxAw4BNREgOCE6L4ytAecBAeGOirq673rvau16qrXn19c+u1673vXXRev73vbr7137XvfvXX9Xev+9d6K6r3rrvbvfrt2vO7Xqr66+jrv3rrovXe/VbtX3ve9r1V0Xqrvz67XqvMrqt3rve0/65/e8+9ry/Mrl7/PorvVeuiUmVUSNo5VeAnZ8IaWt8vXPtJScXSkJ8cvXFcyO0UX7UWvabb5ne1MVVUSkdrvGp3aSptyUZzKZKSpjOTjCuHUEBCbBdRRBuhlgf4kSUyqZJzLRbT0TqI/XTLyGTiuZL/Mq6plrWppvL0S1pSi9HTbrmTLxlRXTJyNdpemU5kjGNp1NE6XmW43TVz6JKmbR3qtJWtRbvTPt0VWkZtddFMje1MjVVMqqomWtRNovaba8WSMHyrjVNcyOSG82E2TiRMhNhOh5GMPpkghlhcg7QeoNsKU+DVRGVMnVCbJQ8vHKKZ9q6a4R1cEDCCgNuD/BziFAg9cFZXGVcXV9dr3vbn1U1T7378+u31Xrov3veuui/19Peu16K+9+1dF7dVFr09u1VNr2pvT03vei3e/9Xe1Xe3e/e9rd67Xv2v2+i3bn9Hfova9rV/a15nMv3+1FfMvLxRD+G8KNq78JC8leZRCxfo6L2vz50GmTg+QB58AtYT4B2QQcAgUCUlIOcrMgm+A2oB3wGvC5A7wywBcwMuBRQuwBfx6BeRdASufAuqYhVxyuEhOk+JElK0VQwy1q58tXMqveuuuZeqRlpk2Qcje82ZRE1UYz5tMtMi2NSCfEaSmXlZsjOov1yMtGq66KJDII3eXkbVWkq5s2fJVScjXIyCZDWqKo5ESJ4Toj3qi+RvNkaLWjUgmXlrV2tf+1u159cgnxyXjK8yfTe0lEuumqmNSd5OJER4siXChKwn0Q5imuNwVUAi4CGQBnSsSKa5Hl6paQS1M+qqdXTePTZBeXvIZk6T4wh/AbUADMI+Cnve8jMnXp7dd+PRRT2teL6ZK1dF6K5stTa87mT5GfLz5GRlpsvI0Tq7dVq7V0XkHJc+E2ZDqJcGmDHR8y9d6Ldp9Nr0V10TK6r/e9fXXyCGsyR7xhCXESE+H0L0JUWxPBsjKBq3gQuJMG6TvBjgcUIiApYhwEZggIGtDJF8HiCdkEJk6MICmgKGGeD9e1ddfe9+/euvvaqiu1f197973t3v2t012tevrvX13rteuu312tXajte1+vrqrp+3XTVau/a/eiq17fVb7WqtXRVTX137Xote1qrV119dFfXe9u16J16p9Vp9VVqq711XrvXa/13pqopnQ2lo7HYwmSsZyknH4zlr1365GuZIIVoiw+hJ51NFui1r09HT2tR2taiZLyU2bzOZeZa1FM6ZeZXReZaSloH6D9AIWEmBPxPDiH8yvm1y0ymi9FqLUWkMNokwu0zKKLU02p6Oiii1HRVb7WvR2tRVajqmXproqotTaj7UUUV03ptRbve83m0010V0dr0UWta1qaL0dF6aLdr0dNdFdHMoppo7UT+bebyU+UkZSbECXhUiaB5gY8LUK0OI9CtC1BAQL6DFAj4zpkFUreuWqn9c3tKSMgpmVzYD/gnYDngqYR8IqVqqoqrrtPpn2nd6b19u/27U1dVV7/a1/+9q6aKPoteZ2t2qtXf66710VU02vemuu97V2mWq6Kr3t3r71/3ve1u3X127372v2/6+172ovTTR0/Nrv3mz6Jl72v96L8TQ0Q4hVn0T710VUT6LT6b2o72tLSlqZebL0RnEKA+oAEoAzYFtLweZsj0QRMBJoSECMgCpg4QGhAINAvIP0IqL4Q0gi+F6bVPhWjGKK658pIZkhlr25DeUkZKi1p0y9UnIbR+1pWZxuXjdE/lZDKTJtofR+8OZOPSkjNj8lG5WuWmSGq9pnyk+MqLy8veVvIy8fp7Ryi1FdH8y02NVT6pG02WvRTRTbnytEJUZy8vIzZkK0pDeKYT4WIR9qKqZKI0WxJrj1EcimOQfYiw3gNOE6FmI0rDTF0YxHkN45G6ufAB/eXrgyQZIC7gFRBF8VTqpaPyCAd8eiPaAk0A/YG9ROhcgAKkYNNUvMg0SsSovguIDqgWsJGGOq0yidXVMj0hpimTh7E0GOFaBbQg4FpF0Sozl5G3Nm0UTK6bXtLzpnJycT0RPFMLcam2kpluHk2GWDzCQqvRRxTMh1Iaos4tiXKxjPkoxpmQ2iLFUcm8UxVFF4kwzxCoiVTXRyMymDzMjkWQ1gv4XeDnD+AqIQ0EBAiYMUSoG1AWcCKgZEEXCtEmC4guIGXAb8H+BCYCMw7iTeDhAIWDZCBgZ0FxLQEwkMlCOiPPl58PKp9cvXe8gqn3lq6rxheq8+9Vct13v36719dU+uXvXXOvXeMb/VVP59qOuuvvPqvV3596+9+8X/VOv2lr1111372vXfvevvevveMLd73vz/vVXV1XvXL9d6b13tXe0V367ddcb6b3r+I9rUUScyiJrWvKX6YMlEybBvgS8H+EJPtG6I3GpOUjCSm1012tJ9NMy9FoEda1qei0HW1FoqiuXkYZ5S96p9N4bTZK0NY9VIwFDJQOshgdYToOEG+G8y1chnx6GaBOQ0wkIiwvTowi2BZ0QxToG3LQfoRUJURYrg7wc4zmXhbj8rVILS14KiZIJ0fl4YpSB3jGMIygEXCjFdcE/JyGMYaZ0lGqeH0+LY5HpkFBF0YS0Q7RTKwOSimO86Pz4O0lFcTTudeFaUpvR/A26q+153FVplEam1zoFBNkeJE6Q2iuZTRCfaRvEG1EN4UoRMIWUhWkofxqUj1MSYC0hrCtB1hQhzT2rlpBLQpRqXhXt/TTedTXXei1EHaq9ERJ8DGhBwi4viFGUL0ZRhGUPrRneGCuMbQ0V3tEqXqvAhvrkHe0Mt73j16+Lr1V1d+Id/+94V/ve964l3v1/TDWu/a1HV36LUXh5bv/a179rW5nRamijp/te94S+3R35K9uZa3GHam1q64p6L00WvBIWvVbvaEmiN1xVFcNY5EGuZRTTDLCOhXpjdMD9C1Da8B6/aUveVgZ0GaMIL6EZLzpGACyJ4LiqEmCJgUsIGJcIGGKLoaz4ZYY4Drlo7FMOp8ghJjURr1S8+UjCAdsvXeiiSmRLiLEmdEibNvTMqqvafXK36506udPv0XkqZldM+W5SK4h0y0el7xq1d6/rtXTxq8Z1XplaY1K2t00ysrKRdOlaP/ponxPXRRVXMnVz5nadLyHrm126K66+9+uuuXmXojc21M+SjKKeWtJyCmM4j2oj8blbR60+WvReiuqELBQQD1gHpC/IYY5BEqVj0X13kNE+XovVJwzRZCRiPEOmEJFEFdGoDZgAChIQMyqVon2vTPo7f2vLy0y/VJxPTIZWZHpSP8gpkM+udV2iFGpObaZVTJT6ufG70yM6L5tNX9+uf3oote9udfvPqrrn12q7UV2r79+9d+qTjsV9qo1AOeH8AcMB9QHBBmg8wEVpgxRDhfghICUxjEWBhxVEaBFQyQBzQEmglYcQOSGiGOP0x6uBzQOj/6L1379d66L13or7113vTVaq9XXaq1d73ve967V2qvX370V9dqr19X3rvXa/fv3tfvTXeu1XVRVVXefXOprvPrv3+1ddfXRe1dq+u9V+9d6667T+q868+uqrtXaq9dNd6670VdfefMnQ1jOHclIYri2uqfVzZ0jJRPEqPRFpmUzoTYiQoQ3kZOmm1dqKLWoo6LzLWrta17V0cyuiim1NMy821NVNHeb0zLy8D9BUwTME5GqJK8aqgxQe4C4hggeoNMOImjd5GRp6ZeC9gg4Y4Q0QYM1FrXtTbp7dNdHMr5kJCHUDXjkfiFM5t5Gii9ui8yu1dN6LWovRaijpvRei1Npk6mumZRei1H126L09Ey1dHN6ZGqi9dF7XotMqmVTbyNpnK1Q6jGFaQwryUTy0IqEyMIZoE5EGKoNUfmRlLxfXD+B1rtMnVScvedbnU11yNU6q1FcTzoviqEmGKCEjCDbDiOQ3ronWpvXfq72rve9rU1UXqtem1uii9v/o+1+i9f2v3t0UV2v2roteiqu/bt03mWo7XpvTem9HTV2opv/TeZfte9rWte1vtav7V0X6+nrvXRR3tRa3P72tai1d64TYgxqHN+15ne9d7VUUVX/o66KumbIY7JR+JpDAf0YwnwIFAUUAW8B+wHlBhQNa8M0F3DFKSGPcvG4cxTGoshbjUtI8am3my8hiafIxvlrRVHrR+8rLTptpW1q58naSkMdk6pSJctGcjTF8UzpSmXiaIkIquKIvrjGZLSC02ZPmyNclIIb1R6iMo/I2kb11zI/FEtOjKStRadb+3MpmXvPqr5veqmRvOtMiq0/taS5SuKq4U50nRNmz6IlUVzuZFcrCMl4nkMKNNchhmiuQy8hmRqq33n13gOG8AHEP4B8wR0I6SgIJe8rAHrGcVyCEjAw4Lu8BE4awAgT4AwJWGstAF9IJWPQLGiAOKu9p9PfvTIabUSlETXh1LQi5SQS0RZe0rNqmUT5k2XovIZOfHaKaZSi8USUyfJSVMjXHpaPQfKbS0y9dFPLWiuiL6ZDeuuVnU1RbH43TaMpkdr4j2tXTfvMvMl6ZORjkDijlEFbE8CogwICPwtQH/Kz4JOBtxnCIgUEDmgbkDGvEWBywHzC9Af8FrA4pOCpgGdAkoB4SGBmw0RfCtXVPrn11UVV19659q66q71T+/e1670Wr6+uum/a9Vd+uq/XVe/evvPvR11/eu9736r9+fai9XXz6qOWq71fy/X1Xtef3vPv8/7VX+df6qrVzr1Xlr2vLdVp33nd+fa9drS1EUTZ1EWWrvLS8cmStr0011f00ykCdi2F+FaNRhJRA4p5lEjei9dpnaiZau1NqO1vmWqtGoa0Skp1T4nqlo5I37Uysgpg3QlQNeFyCkjUE9VTVNtE1cS7wUlUFvwFzeLZDAABEqDpBWQe4LWDHLQy2iuTj8KERq5sYUy8hnRXGUIKLYmtBbQzQaIjwWPCLiaFCDlXIIprk4yplqJKDLDeC3hPhtDHCZIyMQps6mqqVpnz4sm1Xl7SVMTUUXnUxzqo7dE+3M+dMm1UxPVII/XOplJsRJKqNTa6YayctNhzTDaHEVwkYiRuFaNRdD6CNohhhrAnuCGvHrRXLxIrjtEcmxTOorm11zO97T6KK7TKr3tD+ShHQYEKURpeuCAvDTXA8xhD+MocRnD2PT7fe8vX3tR103v966+97z79dr/e172vfo7/eZe1+9H2vV/ei1Vr3rotf6LW6efen70dr26PvR97dvot2vRTa/a97dHX26LV2orp6efzL3ph9G4jRNDemE21fbvJyGETem8leFKTqnXr7UyCdTBikoPsVWmyMZwUkFlBUQEnkYC1h5AxJsFdPiVBDQhIHRa0fieVjUhh3GoziXJx2iW5khiiI15GQzKIzlozvTI0T5emmVtNn0WjGWmS9NcpadMlK5lpstOtaiGsdrjOidem1dN67zZem97UT5SuM41E8fhtamR5a06RjOOSld6pk7mVWlpKuZ27TqLV3pnUSlUgvftRVRb58jaZTNvajoveu0flqqr8jVEuR4viJeiife9N6O150yGeDXAGVBDQBeRAgCyogHFJwDitAFjJQMKAf16IXoNkC0i+BmRdBYRKhFxbXEKJ6Y9MnSslMtTaum9r2v08US8teRk51MbkpBE0vJUykna1E6TqlJkzjdcak6ImlY1LyC9cNMdnRJpkbTe970df11U3vadVeqXlpSLZkgiaLZDLRhfva9Fdr3r58jJxNaii0pIIth7CHgdEUwJGBtQJmCrgOuKYZo1RIYewMKDBjCAYUgpgv4NMEbB3gM6AtaY3P6urqvVeu9V73vRXa9/7Xn3673ve1dr0V3qvfv19d797Xote1F7T7VXrqoveirvVfv9r0X70XtX1XrovXeurqv2veuivqtXz7Xrvarn0z66rVVT71WqvVeqvrt9FddrVUd73lI/CTKw8lJaK4uvKytVEydJWl58znyMtLw3hmiyEFCfDWbHLdNVu16LWva1rUUUWte3aijovTeZMm18nJ3krSdcnE9F6uiNXhAQJKFSGsnKSNqL2rtPrpnylcpTFMXwO0QoT4CkgZEFZOl51EreGaD1a9FFFE6OQwQ3gb0KkDKmQL2EJDNDDeVkeDZBgwcYnh9DWU5lNFoshigKqC3g6wSNNpklauZTTzJ1pam1N7W6aLUUWoota1HRe3a9F+ujmzYnlpsbkYwjkWU1yPKVQ1j0JM6FadGcOIhw6hIwxwaIPkBZwwQKmK4JqFa9dd6q5svNieRlZGZVVRRR1dp9ujmdcjPrrtTXBQxyFmFabe1quFGGOCNiNB3hxDyHFdN6K72nWtRPoprtXe972vXe172vejov3vX96L0V2t3ptRau0+970XtRf+u9r103tbqtefa9HRb7Xtb73/t/R9H3tXai1d6b/frooortR27WotajtKwlxdDqHVNcyfMtPmxfIZGbai0+iSqtPtP65eOS9Fo1Gooi2Sri6HMQIN9NMfl5khvJR6K4qol5eZTKRKkpGQxJh7EjvIxqifaIcjJxLk4wjCmQzLXrkZ9omkHHrT6ZKJumm8nyPGqJGKYlVRfV2iHTK3kMgtTeumvmWovzKKbxydG5kXQqSUehxH7xTXVa8a51crantTTVOovytcpzbdFX1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m2qvR9vvTeu9P266L0X7Sl7VTaIU/tb+1MvLT45CfEGI97yGiMoxvx/loohxwXUGiIsg4sjKRm11UxqTloexjA0oX5slFMvKxRTK1UQ0w3o7xKtKXkbzbyM6qWrrk6ZaRkZ0lRTPkaIxvEe8rPj8zl6LTJnVJWnRqbVTP6a73vKxqUjOZNvTLxqMojWlrf8Ppklz7c2ff+L49XaR41emfMvVL0Wo7WtR11cpFMelqqZebPnys+DFBVTZ96+jr+95srMi6bedNprriidXHqo/FsKUQoEZCCgiYN0Tx2PRGmy9FVFp9qJBCtBkm0U9FUjTTw/5GG1qrUfbn0StEteZXM6Ovorqvarmz6Ku9uQ9FUveNRbFcgiRJR6SimuQS8tLyMrVOpkNEgvL2rkZ9dVFUvXRade8vRXVV1dXe9V6/iX36oNMDHgmoawKWBCoFVJQaYjQFPAloUISobw5lKJGmmmi1HTem1PTe32+i1rf36fov19Frfe972mWvau1u/Ra/a9v79F7VWtftfv3797V113rorqva/e396673ta96+u97X7WtVR127/96u1d+rvem170df/9+3btR2t3tP59Xe/2tentai3RXfv2iPDuUiyqidefTVXXauidXXXV13q79fIxuqbO51MhvXK97UU9FFFFFqOm1FqK6bUdFcy9r0dr0dPNr6KOm1r09HT02otbova9Fv72vRXT0dr0dHMrotRej7UV0Xpvan7XtRbte3btaj7fbt0VUW/vbt0Wtf+9q712v10d6fotRTRD+jo7du3Rem1FdNdqKK7TKa7dPNopvNpo5kjMtNvG5SZeRvMtJXieQQ9mxTHJeHMfpiXMkMH2DnBUQIyB8rny9crJTrQf4IyA458IOD7Pqv/R0dHRemu17UWvTXa9FH370d6K6LUX79r9+9u1d72qr70dq+m9rW7d79/rt/Xau32tTXam1dHTRX/aumi1dNdHTRzLV0TLXtR351F66q+vt0V0W79rVzLzKIzvJxAlZtcfkYrlZammuRj8jESEuPyUXxFhrF0JMpI3keZeM4sn0RuPxGhUrj9UlF0YVWnRudXKT58pJyCZKVWn1SkgiedKWtI86mdTNvTVGFMteWpm1XnTJeL5OXve0j1zZvyM+QSsghYj0Ra47blqJa9qZstavvTe1Uy3VPmUUdMva1+J5DGc+UjVrSkVxybCrEGLp/eR5BF8+ZyMlH4eyGHsnD6HsN45EqIXCdeZFEH6AY8A0pBBPSMlHIwn/AkY3RVE8jL3hSvXLwQEBowEtnxRBngGtHYjzpkjBnriPDDClOhllry8YS8QIngJTAPumbH7XjcNo1OlIHDCGjOXmytPX97Wo7UXt3v082WpkZsNo3VOku1FoZYQM20ybLRRFcURJhkiPGcZRTCjVKwwyGLJKGGM5aP3htCh8bhaiqXn8rLz5De15nLwnRPa0tPgLmAS0BiQkILmEmbEmBQQU0bgQuK5eI0FjDmJEL8ghvXLVQY4pjGWhXjKVjscriPXHK6ubXPrte9qK6q6K672vVe3XXfrrt1373t3v950/797V19797110XrvXa/f673v2rrtX2t1zq679p3fr712ve179+97Wv3713te3RXVX197Xv9+3eqv/veu8v13t/Va1r3vzrTKJldfPtXVOgxwj4lx7opte94/XVe/T19N5eRm00Xtam9NonojVp0PZGiNRXK1UfXJ10zaZedeTp41yGqRlJs69N5141TI2qpi+dJWtXaWtMkqKa6KJW8jE0/tenkZK869Uhokp9rdq7yXGUfok41TI3lqLdpslyGWtJSM6RvPkbTpWubGpktfnz5klT3665lX0XptTeuq1PRTau1+XrmzJk+178l2mXhEwjK5G171WvycnJ2tTeXkpWba0VTotjdd6J0cjkpGpKiu1rSkLVUKUyI0hh/RByiJeTiFDPCzGoJ6LZBxNJwoQuQPdUtwS9MNF4DnjOEHCFgioL6F+MIGfXPnwLfnzq65equuu966q+9d7Xv3vXejrr+/Mte9f2mX72t8y/bta1F+3aiim1um17Wtai9FFqb2+1PNtRXeiZyNFFF6+828/mVVXotbo5lH/b+mmRon2ieSm2kpGWhTht037dFUrE95GJoSMISL+DnKSXDLE0UxVB2kYV4eRAk5GTi2UlYxgeYX4ZIgQj58JkNYxgrIurl5vHoxom1XhliH3taiRrn3ptVLzbz49XTRaO1UXvVPv8vLz7TK6aqqpKf3n35fmX6Zaqmu8ch9E0FRC9HodTa6q49M5Hk5amZTGdqK6bX6L8jKUTLWva9EvIe1+ui8617T6qpsyXjdddF6abUQvQPcnIZOfHITqqumZXMlbRXLSGJo/ECG8QKoTq43DiPSstKR6mu8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a9rfb7Wot1UW796Oij/veu/Xant0Xo+9r3vV9667Xoq59ddFV79Vp3Prn3roqtVevq66ohQoTYsnWl65967V1Wp+Tl41MtXXauufTz5lMTxfCXJycpau1FNcj0dHR010yMymZPotTRRajo6aLdq5GfR00UX72va9um1NdHRVTenotR97V02pvbtRRa16a6LW7Wpvai3TRa1Fdqe1HR96LW6K6a+9u1rX7972t9r2ovTb7fe32ovRe33vNj8N6K5vMtTTM6LUU0dHTNovRTNtTVJXkpGRtIzqaar2tKQ/kErOgb8CWg4QeIiwcOArIQMUQrRIl50ho6K5GuXrgZkEVAcErBdwfp1U60+1ddU+fequqi973vRfte3R010XovR0WtXa3au3e9u9qL12vai1VqKKrWovTa1qei3a1fRX2vfr796v+1F5Gufauj6Ou9rzL10dq+fNoo73tVR3vai1u0jKyMT/Mop7Wtei1r0XkYzg3RFh1RDqHM+WrlIw5aVhvEKGSPwhpeF6LZ8vDmF6CZiFBvhTi+K4YogRhCFvOqkMOog3vOj3RebTaWkbyfNv0VzeTm2jU6bLVy0YQ26o78gkbRhaVvLz65WZOrtTVVNoprieRkb2r43Lx+mVkaoqhteWtPqrrved0cy1qKbRudPqovRTan70w5j0ZT5OSm8lFcdhMhUhkqmTOqJMfiTOovE0WRZDRRCdCJhtDefESI8JGqCekNEagkYC2gFpBFweLwmw2gFPMkqYF5IYyk4wj0L8Yw4riTEqALOAOeA++NQbIAYIdwAE3lpsFjOpmRLm1RfALuEfAvI9AakBGIEKnyUYRfVHY3DqOz6oHPCQgspSMIjzL2vauv7Uf35G1VcjJScdlYnjcZU1fzIYoQ0Iyi0jIykTzYnhinXhWiHOr4iSMvCEh7MiTDyiXiDJw44iwzxlLcKM6dVejqhOohTggokTpBXB5gAigWEggSEFrChJQFRDuHMF5B/i+D/CTIIP8IOQQeaoewxwP8S5KEyJ4EBgZklBzge4LGEPBX1z67VT6596u1665eqq96p96r13vXXequuvrv3teu9U+uf3rrvX1V/13vPvXeq9713v9drV1T713+rv3tequ31f13va3eu9vnV3ve17/RbvVXLXvevtebe9dXfjK/b79F79+94wt9NFFdui1NfeQXtVClBxhERG7zaab24qlKeJqJloldHHLyV4TqY1G41JyNom/jUOpW8OYqnz6q7Xp5GmWi6dRCTJS0UzYyqjUWyUveM58hl4qpkpGmmMI9J250tLWpia02u/IaLRyXtLcy8Tzbz5a8rM6u1uu8T2j0fjKmN02ny0tMrtNjkvIJ1cpIy9d6pK9Ugqk43Nl6rVVWkpl7ddcnXa1qqJlp1VU6Za0amdp1cv36a7W7xXa02HkMEI60fotXRX8JknRVJU86QxLlpOHcbriPBS8btC1TBjhxFclL1RyPRPGoJuGsHWNwmwd4VKYN0+QVQg58hl4F7VCKnQhqYRkIiBGwuwg4YIhzp14GPe3e9VcDT6qpauu9dV659dd5173n136K6+quuuq973t3k+1rX73v9/vJ9rW+9u1qLUWmf0Wt036KO3M70U8yivovTai82iZT1966qq72vyNqPrte32mfeK6JSiG8KMZwyw2tI0wuQqRXXDft9q5BEKEuHcrFMdkpsHaZVeK6KJkPokRHhvI0R2Ropjl4utG43BslYkQyQiqqo1GVM6MYykaLRfEGJN4zqnz+iZev6vny8rNle/TI1xnLzJDCAjCu0+uuSkp9UvNqtTzvvTRTJXny8+fVeVtHJKTtLVRjTPpvfqtXMqlo3VGMWR6bJzaK65Bfok5eXvPte9r136Jl5PqtGUjKSNcyZTe0TTYovXeZ1SsURDl5aM+TgQOAZEFzAdvFcZyGNx+OSMVRhHIlxNXE15tMvFUvOpkfpvJVSUXRNzZKiJoawxwrQbZt4FjBR1SsnK0zaOiZLRPM50Or3n3qrove179u1HXz6rzaKpDMkEZTJ8aol4dTo/RMteq9U28vPjGHcQ6uHENMOYUKpGRkplNN5KLY7E3RfrvXV3rp67y1E2ZMhfg7RyMIogoowgsKI9DFA6ykSYUINEdiaTrk7QUkHSDxD2BERlCdA+QQURoZoO8OYU7Wt/12+17d+32t19r2ve96O17fV/f7XtXbtXbt972rv113ve1u3bv19+3e/Xa16LUWv9H2/6P/+jve9dF679dFr9+17X/r6+rrrqon9d5/ero/tV12rvOtP6q6712n3qvESFCZE1f9Vdq5GmbN+3btabeZaSlYS4yhzE9FFrdqKrXkZkyfM6a5nR08jJ00UV0XmT5KZTRI9NU2iiZT0096JtujotR0dFdFu/0Wo7WtRR0Wo6L26aLU2ot0UUUUdv6Ld+33n2va/eiinte1vtRa1HRe17Xtai3ai3a3TTbo/72vRauZGUP6KaOZei0y1N/orp5K9HTzbTbSN41aHMQ6ZluuN8ZxXBUwrQzQI6DjIJOLa4kVVS8yuKJvLysnB8gj4DghxA54PMvK1TZ959p1E+0/qon96L197dHa1rdd7VWvXV1V2+/0dPR01TLWta1vvRT37X719dr2ot370Xv/9u9q6Om1H9q7UXo+vtbtb+1cyfejn0fft9r0Wt9oomUV3t0V2o6LdqbzJ8N64qieiOys6ZTJS8lNmUR2Mo/KR2uNUSk6Rk5fjcZwrwh4IqEmJofUUcO4ZKuTluWj9Ha15k+WptI1UVysbl67S9E+K49FUUxlTL2g+wVUrEebeNVRPRKTY5IZWMpDLyMyWvMlb8pM5K9UjIJWGsOYxiXDmfytdNu0jIJG0yfI2rvVRKXlr9dNplcetaHE2P82iZeTnRPeE+Z9UfiaSi68+Trlof8McjCXxXbkMMcdq+dJwEBlYBlwFlDFAoIPUSem82N1SUtHK58S658ahF3gHlIZebBxqhzI0S8+iWkZTql64gz4BGQGlAzpaAiEryshq5GmO8fkELsnCbRDTa3Mkb9E3mXvVaujtRXfjV4bRy8na/N7Qfb2qm1Slc2iIl4mjUWw6qjsteId4rkMRLUVxIkoTo/DRx617127zOVnzKYIGiP2nRHgMOC7hFwvxGhNhrGPVD6FKF2EDB5g7woxNFUEXC3C5DmFCCxhPnQO8BL4Y4JWDrBYwTkFr1Wqrqt2vavvXfrvX1Wv3o73rtRX36//r6r36K67X/qv1973n9dd673v9+9Fr3737d6679dXR3v0Xv3vVei9V/n3verteq/RevvXXRev66q+87tzr/LXo53fqtRefa/Ota87o5178+3a8Ha8NNqJfkqK+vm2ndqZ3VaLI3EuShQko3aU41a32ph1MrkYo6pGu3I3ookoxteRkaIrko/XG5KbXaUn0S8lNomTZs+PTOiXplr2kZvPpndFMna0z7zZO0+ZOvNmT78y1Nc2njK1NdNM7kNN6JGZLchpkbzqfkplfVRJ2l6aL1Uyd66O9dFfa17U0zr1UU8jRM70196e1rW+ijmUwxTrSNvkq6+mTm1zab3kotkpspHbwxx2mLYrghIdwgLUxfE82FeNRIiqCShrA3YqhXloInjKdyGq8vwiYlwQUMUBuQgIVoygcXA3Ly96+q1+qron3ornWorrrr+q/1966+973ve9F73v3vX13o/q7dr0d+3X0d7zOu9FqO97Wv9qPtb+3a3au1f9rTKqqJnXz+3P5tqK6KJ9pnajva9Nq7SdpWG8T1w1iNeibTaFKq9HRei9c6PxAhHw5iaPRRE0UXmz41eZzOH06TimPyMOpsSo5CxTzYH6QwiJOUhAwnzIlx+Mol8jVTLQx2tPnStFfb66bV1T6LRJirjCfJT5BMovGElDNVGqKeNTJlXyXMkpt6OqOxJmxydGNEfkNqZeZETiimufaWlLU2pmyNVpSfMt0ytp166JTovPrtNlK6+9Eje9qOdTedTPjkgiXMtamJ4kXnUT5KL+W5nVMvN41OgOqABeBAYB+QZIaOSkE+Sl4mlIqvNiaRnRjClermXr5nTRPvI96p8+uqiBZwCjkEMtdp8+ufXMtL1XmScghzMkqeZLzJOmfMtem9NVUjaTokubXVGq5Bb51Fu9FqK6r2rtPlJDTM+9V59dFfVXy06nnV13teu96q70d58pXa8jEaDFIJsL0FhGc+ViaDlAgF4gQbYRcVQW0KsKMGyGaBsxTChEOCShzA+QMqD/AKGB8glIeQZO1rWt2+j727dN7X7f/X37d+/Rf79d/v3ta33tRfta1qL9q7//e9+16726K73tX3v96r97/e1f2varnXn3/r/vVaq9712qrqtVaq9dqufeq1V671Wn2v1119d67VUVV1Wrqve/1xIhTvzJ0pTJSNMym8pPtI12tPvTFkXwmxuUjdqLdu3Re8la0ym16OZemunpptXM6Jem8jVMomXm0TOZam1HM5n9r0c2uZ3ot0WotTem1FVNFFNH9FqaaOmim1FFrUdFFr09Npl6KaOjovT0X+1rWotborta1qPvb726PovPoooppvami1q7Ud7dcnGUU09r0dPTRTRa9uZOkqOZIz6Y5XLQ8iPBCwuwT0G6ORRHZkGuF+BIQkYCwj8bhMn1Vy1peii8jPtEKDJAeUHCBdQU8XRGqvXVfor667Vzq+Wol596K79+1d7372t/aiu16aKK6LUX6b137X+9rX+17X6LXoqm2mU0VWv0fbovRa3a9Fu1u1FrWromfau1dfVafa/e9FdFd/6bTOi1FrV2ote1cV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Yv4jVxjGUyuiKpedVz667/f6qpkfmSCqXoqokpeJ58WXhxTDaiHFUOaIr47RKWk+S5SuUtMvG7xy8bnx2mSmyNuuii1qb2tbmXka5G8pxy8UT4by0JN4dSUOuLJslJR+NRbxbTEmqLp8hlrczlLylF5K1MpLSXMmzJl6Pn0VT67ddVdcyvieM4V4yg1ScP4spkb3teZaZb6LWrotRajp7dF7Xo6e1rVSsXWt9NE2Xk5lM21+umuZ08yfA8wVEE3AUklEGKY7GdcejKimiVqhzCVEOKY7Di8VSMjXN5OXjkctXNnRXVA/wvwHlAsIFlAPCiPRqZRPkZkjPmScnDRMjCJpkOOZw4k41HpGfDiVjUz5krMlZnIzJGN1w8oj1cyZEf5ePT+ufLzIymR6VriXJxhMk4rhpgUkBnSdFEpeSpmVUz4mtOrp7wV8CYjOMZ023z+Z12orvXRXJTJ8pPvXXTXau1NEnMqjk6ZXMolps+i1EyfXafIxqqKa5BI8tOokZGTo50jXPlaO02K5euV4kUx6P08UWlJsvIJSmNSkTylFo5Hom4slptry15a1MZTohxGqjsXw7lYvte8yfRTaTkqJs+N1WjcYwdoYIEpDPAWcQoBPxKgMWFGBNQpwRsOINc2E+OynI83k58b5SZI10U3vIJKPVxjaMKIkzYi8Q5kM0tEqmL7xKmRHriLMiVREquI9cS64zrjHjOXrqkZ0aptTFMXwrRKg7RnBTRLgU0XwF5PgMSOwK2IEFDC5BkiBFUUSsnF8giNXDLNhnlYZJ8Sq4ulZ0reuVjcSrRLkYkSCMpbnykZQTkHaRhxVRIZeQRzvTPi6G82L7SMS4eRNF06uWj0+G0hqlo9LcvPiLVProk7U1TZWRk6ZWqKYnotRRMj8jJ10cZUW4i0zZebMmzZ9qqpOQRNEuQRKi2uWnR+RtNqiqZI8ynpkpKI8RIgQ0QnVw3kQQAEAAFhUAQCKB+4HEAAAEAAAAAEAEQEREVEREVERUREVFX1XVX/XfXPb91f1V9V3/9///////////////////////////////////////////////////////////////////////////////////3/rUwEAAAAAAAAAAQAnBAAAfn0KAAAAAAAEQUUUYYcccggggggkkkkkoooooosossssssssssssswswwswwwwwwsw0wwwww0ww0w000000000000000004004400000000000004000040004444480440444884444444804444444444444445A4044844844449A84484885I84448444845A9I4844488889A888A889BE9A889E89BBA889FBEBBFE89FA89E9BFEBBE9BBA9BBE9BFFBBBABA8BBBBFBEBBA8BFBFFEBEBFFFDtFEBFBFFBABHtFBFHtH5FHxH8BRARR9Q9R7RAR+RRR+RRQ8RAPRAQRR7R8RR8RRARR/A0fEfEQEfEfwRHtH5FH1FEBFHtH8BRARRAR8R9R7QQ7RRAQRQRQAR8R+RARRARARRRAR8R8R7R9QRRRQ9RQARRRARRR7RRARARR/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yVD1H8IR/B0fw1FD5FABH8ARR/AEQEe0fwdHxEBHxHxFEBHtD5EBHtH8ARRARRR+Q7RR7RAR8RR8QAR7Q7RRQRRARQQRQRQQRARRRAQQARRQQARAQAR7RRQAQAQQPQP7QQQQPARRQAQRQQAPQQQQPPPQQRQPQAQPPRQQPPRAPPQPQQQPPPPPOQPPPQPPPPPPPRPPOPPPPPOPOAQOOOOPOPOQPPOO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pPi8OImqi8PIaUTZ8+bTza45Li0XkY1KSUXi8YhnTHIb1wOMDDhUgsIV5GbMqtvV2xe8XrndkuUonXrnU2WUyF7L0VVdHReZXTTTPon29d4/RZZ3ptpn2ytXOmTpGmi29vRe2ibTTZRMrsl022xe2dfjt7yd713vZ1T6LLK6o50SdtEbsvG5KuLX58udI2zLZGfIX65DopmzaZWuLR2TtpopkpG8lbHp8pTbFabaJW8rOkeQpkbKpCqbJVyX/NjE+XMjclVK2QjQMCDveFyPw8kK4rTGoxZVFMnH4/JVTJ8hEFcpKxPZEEhI3vFo9ZzJO2EyPxyfNvMtmWykjEkyyK0URiLza4zNjsyyKykuVmQxtpplz4fzrLY1DOF+bTGIprhRvTPkJODvVEdEN6YfTKJsPYphehhD+iqKx6GE+KYUoniaqF62deKapS9EuuZEltlUei8J0yfXE0pEsrClE3ZEFtdErLqi8bjM6qEmy9UrNjd5CqEaqJ5chOlJ02q286QnReJIkjEajUhKy5nZbMnV3iiNW1xa8PauL0RWfI2S6L2TeJPiSfVIS5sheKJ8lIUVS5kTWzpcRWTZtU+IuRvZIyUE7AcoBNw5iWBeQD5BdQERBI3gNEL0dj0heTl8RcVjXZVTeZOjM6mViaSisdmxqGMlNgzQX8A0QXsCUgPEyEeF+PxTH5tMpN67JDh1LkJG3l20TJSL8yXCNCxE0nbZR0zqpCuyEyFKEyKIYRimVGABAAB6gQEAiwfuB8z/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3284wBQOgQEAAAAAAAAAAQA3BAAAGOYLAAAAAAAEUUYYYYYccccccggggggkkkkkkkkkooooooooooosssssosssssssssssssssswswwwwwwww0wwwwwwwww000ww0000w0000000000000004004404400400440444444408440440044484844044444844444844444448444484848888444444445A5A8884448888048849A444884449A8488888849A89FI89E9A49BA49A8889BA885A9BFE89A9A88885I89A9A89BBJBI9BE9BJJJBJBBJEBFBFBFBBBFIBIBJFFFBBBFFBBBFFBJA89ABJIBJJBFFBFJJBBJABJEBFJJFJE9BIBFJFBI9BBJBJJFEBJFHtA9BBIBBJBJEBABBBBJJBBFJHtJI9BAA9FBFJFFEA9FBFFFBJJBJDtJABIBHtFFJABLtJFJLxJIBIBL1IBFH1FJJIBFEBIBJJIBIBLxIBLxEBFEBIBIBL1IBJLtHtL8CSASS9SRSSSAS8SAS7RASRSASAS7S/D0vwFIBIBL8BR+S+S9S/EUu0QEvUu0v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1L8QS/AEu0fwZL8lS7RS8SASAS/BUgEvEvUgEQEEvku0vEvEvUkAEUkkgEUQEUkEQEUUAEAEEQEAEfEUUQEUUUQD0AEUEAEEAEUAEAEe0UD0UUUUUDzz0D0AEEET0Dzz0Dzz0ADzwDz0D0UTzjkEDzzz0D0D0TzzzjjjjjzjjjzzjjzjjjjzjjzjzjzjjjjTjjjjTTTjjjTTTTTTTTTTTTTTTTDTTTDTDTDDDDTDDDDCyzDCyzCyyyyyyyyyyyyyiiiiiiiiiiSiSSSSSSCCCCCCCBxxxxhhhhhhUQIAK9mrYsz6v17o3PtkHEW2v30LbZSfXto3W2wAVJNOV5mViSXhQjUOolrQtSe6HViaqwuSadn17NiZhvD2MrMANsahEpxGhbiDUiHZl4kkl99OjdYsV77Fnv59m3nwAL++777o5bbbfbddElSxYuvvt7Fs+2tbQgEfKUaUHl0eiaM5PATsHKBXVYj1rFCtRlKttmFCnRiFXrykpADPfDaJYGa2hfBYs15uEOvDuJYCenzEK8C1vs2YGmGMBwowOVtC+AGO6jYjVKlfHKMVxJDOXjsUwyjkS0opjsOolsSCRzdexSvgBipXTVsmupQBKQCfgFFPgkOEiBxg7sQu1YVqsQ6kgsTt8Q7FWzAI2zZviJZr14g2LNmT9mzD+6/nbNjjO+6ff38ACy+/s2bN932aN1DhjPp0IklKc+HNKOU4roRyfAS9smqQHSEOAHujFUSQAZIJCAJG+B1gzQT9avfXn3ULpycrySxOV4CbqSetIa9atPs2L6V/fJb7+KLPbFV/bDH7oBD398MbYY2w54Z04PYrhlCPE0bhjB3H6F11erbQnbpubgEL9a3oS8rYs22yOf2brbFahO2YJiUrVoJChBOwvwCLsXR6ClLzsAp4JmpI7MDJq3UIe17rrpDIrEGqakUpJ7FmfABAvutvs3Ub7611SvYsQcO6zPun22L7e+63gAs2ezXs91ns22bevC9fdb2L6VSzVvqV610AF+6fbfP68+6f0K9ezNULatexZs2bNmzYoWbMAGC22h2LNns3WOjbX7Nm2+xYvtvr1rFt1sAF2xz77rr77p9i6xZthtfZvv69m+lP5/QpwAPq913Ys3RXPvqS0pFU5A/yOYpwOkUwboQqMDnBjvgr1o9XgEZPlLaPZqUbbN9s+2+S2Lr7uxbxqdnaFOUl4BHX0K8/rVq8+2fYsVuvQupWyafXsX9KxbYrwANKF8vVlb+rK0atWdn1YYYxlJ83PqysQ7bFeRUJqtADvYk98nqzk3DBO1ZyT0raMkrVOhYtoxRWo14lozFKAB7Zrz5aO2bMJF9OKYspy0pBlsV7MvWpysST6VGNRRSnwE3d9if9OnTq2y0/lbHLdmvYoUZ9ftvvgJmlQ593P69Wdtv+hP7bbren20JandwAHraPPvsWaErYkFezQtiStSvk1sDGhtMyCKYSocQgxZDyAFSMpqxdPp3y9stKWJ2tdfYr31L7HO2O6zYtpwCCr2LFa2TRDk8xZg6yCFqFKDZCpEGDfdBprwtWIN1m66FXuvgAf2J8+cuusQp2Y5CfWr174UrE+6zdRjcL0KMZTsfpRPPo3Ry66OUpWUmpaVk0tYmqFCrZ5ulQnL5SzfR5/f291vdfdX6k+JqvXtqXUq8ao1ZmYkdC+ldXpVK9iffffdZpV7Z9/PvtrWLPSqxy6OVYrrw3sQd8IN8Vy8pRvnySUkHEWZhgrRDsxCkVsjiSRQ1oUYk7E/+Zn2bZWXv761CpXoU5FPieKIK1C263q0LFilUqVpeRx+dnxRSo2zFTvtr3XylWNWad11e+zMSaKLomlIcxhCfdBSnILEYQWacO+PUqdGJ6dmNSKPQs0IVJ2I83TnIokt3dfZoSt1O+lQoXT+2+hz+776FmVvl+U5SzRuuu777bF1m++2377b7bbu67+27o30LNC+hdQsUb7qHR777FtmtDK2xylmvb2Za622+hZlakrStvtu7/7fsWf77bbre+3uut7b7eff3dv/bYo2zFWEyFuBDwScCoguwNkFWjfQsy9CnYlbNtS2cvn0JatdOXXUL4Z0aFWfXtsz7bpypfKV7Ni6NS07OwHOCXhLgdb6119efVt+ZlJeVu5W262hYoUZaxT58rdWs06dO6tPoW32aVG666zYrV+Vs1b7bNO+x32KV9fr91f5SvRvr3WZPKV5POy0gqT6lChfPvq1KVizQr2ZmxOyl9Chz6NGtSq22a8njk7JKNSjbY6E7PpULN9efZo0LaNG2+hXt68pbUlq03XqSliXvlaNiUm5yjNUKnPqxJQkl0njVSVn9KjNUqNCUr1LNmlzPNQ1gKqDNAuIBP1K3f0Y1GdKJZ8pbF1KaiijPoWbNGzbVn232K0mlbMbinklOnPvlLr4svjPkdCtWoylCbkk5G7EtfWuoT6NiS0LMnrVJ87Pp0raMtOWJDNxfHKFKxfJZPJrZq6fKVJ2xVjGpXnYmoW21rqU+rZqxVPlZ2c5WLq1KzdKSanKytOjF85JJ2NWIvpUKlmM5eR0ZPE1WYk9CduqTvdfOSsapzFKaujl1bp0LMkqy9SdqTdWdrdtCcumLNSfYs2a185Zv6Hdfbf1uzbfbfdQqSsjsT5uTz59ejbQsVI3N0KsglbaVerYlLr4J6BIwbIB0gxRqCChRsxHjGpNValGrbQunZaOU60rTq0JHfyLlq8auks+6dum47xChKmOQQYoFxAO8DjCfBTmJWNyerHZFdVn0Zu2zJ+TWbFS22+2FaB2r2z+tFcP7ozkEpXheglZuZjGS0ZJK1a1mNc1fFFmUuieEKGtLrz+pZtpSexXtrX2Ji6TX1rpW2N0JizDOfGPdRrzMlrya6+drVpWUi2Vq2JWzZsxCnZ2zZviaZusS0VdCtFHYviu2+xGrNt1PlLEmvlLMX2aFGH1ijQjCxJKdm++6ndRvmOtPn3z6F11iJ68jiSFWUiDG+hG5etKSklk81PsV6U7SozdefLTcrOTFejGdGBrhEhZjkxJbEP7bZ9itFVCnfP5SYn1p8TSk+fDKOUKdtiOy0QaMaowZ60MpaCivjCvCzKVr4W6VSzD6tHOOQFXE3L15qAzwImI0FeGGEKGCG0nmJqWr07N1ifZuvo2L7NPs3ynbZp239Kzb0L6Fm2+/t7b599ntvr20rb6EpPtoU6Vt1Cndd2207599S75efLTME138FufXvvt6Ns+zUr21Z9e2rfWs1p9m6+3t/t7593f29vbbbbQ7FCBlhtB0g9gG2LIU4dwKevBcsQYLYT7MmrzUp3V752Tz5epPrztatI5WfdOcxXjlOxz7ra0pMyWTRLVhXksJsFHBKyeCPgsQYYG+BfQAbZSpTqX2aN8Z0KN8S0pHORPNRRWp2LeWu52Wtur22J/17rNCjWt75bt5Sx/bf2b+fSvn31rq9a6zZoW3UbexfY7a99tmavoUKtvXnbrutdYr2ac+c7qts+vTus22bNnoc5Z58+zW7balilz591ShbTsVq19taz2aHYsW22batm22dryttC+zUtoULaFardO2JWhO3y83KRuZsWbFOVujsI90MEIEHkRI5CvBGwWYUrMPodw9t6lOUn22J9Kdvtvs99G2v0bNmtG6MvOzsgnY5bLdOlbWr0+nYo2bMtdXpWOlKUa91iVv6sktsylnr1JJdOx6hXrV52ViaQTttihEt9KjzleXukkipSsmklGPdCzZuodaZsyS7tjc5fG7+XjVOaun1LF9OW5WWrUJyUlZaST43dO3331qvVtpTMXU7brbbHRvoTVLsT52+JKtijXlp9tifPrxu2r30ba90+3tvqXdm2637b7braFG+jMX1panRr1qNGxJZDNRqXttoy30IM1iAr4eQDZDaEqMKtSBqksPqcMN9eWkVG2YoTvXsWL7FizXtq30e2jK9iz159mNUIzqQxnI7QgO8UwLCtAFWIMFSDbCPCxBikU+67mufWm6FafUvqyaML4bV6fPrc+UsSefHLEQp8Pp9O2tUtqXUZ9ijdb31YjwW7Nsnl4voSGQzs+Q3VJJXq9/3c/+6hQr0ZHJrbEitq0J9jq9mctqUJS/upW2J9/P+Yk8pHe2/r2yWnIb4xvkd8Y0Ii0oYZ8LlaFijD2SxfdfOTFiJ5uKJWZn8pVs1Z9bsV59i2+2xPtvsWK0ijCnZhpD+jdRnK0TxuQXUO+2vJuR22zU7SvnIdxDga4OEDNBipU59e++6xXoS9eK74cSeD+pCRdBVnILVWCpLwfWYeWw5jsNpuEyrCdHod0IeU4a1IsjnM1ZWxJ6tvJo1ZutoT5LDWAywdIEvMQPsJ8HsrH5mnPp2aV0+h399t/98++223u+2fZn30Z9ttt9t9t8++22663oV7rqFifddfdbdddbbZv/vt4ourUqFmp3z5W6+63urz7FezZvvtvtuoWLbbb/vt77e6+hVt7r7u7t598+zKzsGOFGBJQSUBDwjQG+CAiJyCd77N8boRq+Wjd0+MYovurSackVmpYlJ9mnWtnKUNLp9aL58pM0JPDSM52RQnQFhIIxg5wjQb4hwZIQoiT7rbrFte2+22XsRHlK8bqS8rQkctWpUe/r058+jfz7rZ2zMX1Z98+66fPutnaFi6xPuuofdbfV6H0r6d1CzZp3VpnlqVG2Xo3zNatW7HZvsWKl9arfQrUq9ihdbKV77b5/fYoW2KNTo159axRqSenUun2bbNK6dn2e3q0KfPq16VWh91SfUksvXlaFWN3z6FO26coSSlfPmZPRvmenffT52WnY/UhvBSgOUGCFKH0C7swcoYbafGpNXrSerO0LNmzWp2bbZ22xPtlqltO6J4qgz3Ur5yfN3UuZtq2Z/dRlqstYtpxNLTE3JrF1eR2ySffJLNepZimjFNialaFWPSkZ1on4aT59sksVZ8zZlqMzWhpIr5JJ6d9aly9a+pO0ZT7Yiz5irVmZ2pEla++hOSt1CzIputJ+xGMrEs7dMTk3GrFenTozVKPTErQvm5SZiqZmq9tsmoTUzFVWvSnb5J2PsxLHJSlQ7rFCz31Y9J7Ft9m677NvZpWK8ktjtelWrUbpijdX5eGMfma8+fHJHLyk5TgFeRyeAywcrMRou5uOW1JeNz6F91i6Un07bpPTn33S1ifQlp9mUo3WbFCtysak8tHJHfOxPDGnJoQIVIBzgWsCDgb5mGkmsSO2aoyLjOcs2bMpYo1aNCRSlOhWuqytmjL15mOSaJKtWvOS19Gv1K1WfPvs3TFs+zTn33UrNixSoT7rrFKXpTtWvXlImjVGXg8hzK1It7NtSbsSactl60ehpSjOQyWfEsJMll4fxEq17NGWoRy2rN3WavbZuktWxZv77ZJdb1rp903ddfZ7e++3q0J9ijdY6nKU4aWI3PhfnxZFFOSwBIQarNmINazTu7pehfOU7avJpngrUYSolgkI9CPGoApQNMFmDuUjsEpBNSsgj0Xy/ffB7E0CRjsL8vKXQWqEtKz7bqMHtCU4nn0adenRuiSnM05JWqSe+6+6MZqzzdefG4kgFDAB5qQj1Y7CXAOlOWvg0TsZxjApYjSCMoPJeQxbAaYxh9I4QbMYVoc2Yy49ztmXs1+UsVrM/7aN/fPn/Zs2b5Xn9a6hbL3Uad9KVuo0pa6fKRqhRukladhVgA3x6jdABjg0T+B0hEn9m+hYs33X1K3WnKt1aardepYmLPyXjnBiviS2FS+GN0A0TEMolg5w3h3HICMhtEsSy0elbEB6trV4MF1OxEtizWhrK0r+vN3T52T2Z2dsW2L7MxO0Zm6Mal1mfIpidrTlO2BhRfAxoUYGuLZeJoGeOQOUDPBHQS0rAtYHOCOgjJNAiL4iX1J9CtORqlVhpE8vGdGfZnJiUtqU6FPlKtjs21bNO2fZp2320qc+z9vfYr0PoXW39tvXsT7rbrFXtlate2c5/fYq2z7+xYtn2bbbp91ixZvtrVbNe62fQtvtlO+lZsX22L7r6E+tb9e/sUpWpX7bN9GUoUrNO+rffffPs99tO6fYnbq991WvdYuvsxuWnzknlrq8TzFKfMTt0dgt2YD5AYoZwFjAXcL8UwW4LsIsYw4i2hRpULpWfW7bEtSlqk7d0ad9SfP41ZnIZ99e23ujVmtXsX3Wbr6tirQun1radepdWryavbOz6Vf69i+xQr23ytaT2KczVklSU59a2R2I/XjKvylG2rPk8miPZqT43fJ+MJ8tKztCdk8kn1ZHJZWVr3VqNebsysao1ZW+Yj8SxVK2badm+3l6cxZvjkxVlLqFCzPutoXWJ2fZpWadOtOUZu6NzNC+ds0J9KhN2KdCfZs0PtpWbNtGxddbZtuuoUq3LUuldRrXWLNaWvlqFih1oaU+tBzuloPqc7WlIK9ixTsx+nRkdafTvu7p9joXWOhbWrULFitOXU7NOxdYnya2xfCRRlKMK8xfWgIGcrVYJejF8GqBFxGg6REgMElhRn2a8LFCLKNC+TdmxJqXUrxycrStHvp1bHD6ZhFnLojSKJJFORhLRjZnb7681Ss91iVtoyaJKd9OzYtr0KE/ttoXz7buzNULpqxXsTnO16E+jWv7NinIpSnz+zbfNRXGU7N3SSvbVpVZmhMWY/bE9mJZ8avmZ8xys+fQttn2bu+ffZ69tm226zdfPt+3t59spYo06VahXtjvWqU6sZVpaMJaMrEtNSOJLYy5e6XgFmBYwC5CFDu6FOA73WLavfPr2bpFLxqQQfxjCNQhCqwkXwkzsIEzH47M3xvhvbFEzSl6N0vzkzVoWaFaWmpulNx2Uj0ZUaVGfNQzlq0rXlK8Uw9gdpHApIUoEpEkB+hzBghnFEVRrlJ9Ofddbfbfd329mfPvuv7bf+3t7b59Cj0Ojz7qFWfdPun323T5ufR7ezShxdfdQts3c+lb3W233W3XWb7bN0+2+23/tv7ft/75/Prx2MIG+FyBQQa4ARYQIBkjcFaESLqkiiBK2JerKSlOYsXUa3WmrZqlJpSzOVqEck1PoztOORGhZnebjs7KRnK0JeVhglJBWgd4BPRhD2FGG85HpWOR+C/BaiqBZQIWC5KUOzXnzdCS2Ksil6UtMRNRpc+jPupU599OzY7rZarMUaN1s+zddYtoULZ9G+zXuvs16FS2tVs0K91mxWn1qk+nRtvnKPQuo0Z8tdWlaM+h1aNOhQrWZW6jdWq0Z91tSvbXoztS2fZn215a7pTE5HLE1Kz7adWds16d9KhbRrzlKpL2ylCfPodalJ6NmcpVZ985SmZ2W6EtOR7klKS06MxJpWGM7JJiTxuVo2bN0OoJaCRth7AXEDdB9AZYjwNEJUcl4pqU75ShdbYqSkxOz6t85Tq0Zyr16FWK4LtvZmr5HHooo2yk3Ykd8pYr3V5SbrylC2jNy8m691spJJ87Vrd9GtQrWLp2Jq0tYimavjktMxuOWZvm7qd8ijOvGcpWlbMknYymeTTcNoh14zksZTsnrSkeiqWnKt85Wjlt9mR0rrpq+VkfOUas3Tu6MpS6lttinbVqSW+cj1OjJrexH52/ttklKhXr05aXn1ompSl1tsvL2Z9G226zZrT6VvffbZvpT+zWpXS1m6Ur31p9mpO8URCjcNpFWk8in2K8bnKlaWmrNiYi6xXi62N0aF07M3c/r21rE52bN99W+nWrzttejUoWbE5SszdWTz4tiWKJeGdXpyGWmZilA0QRUCpg2QQsJkTQ0sdevLWJqlOde+fXlLE7H6MX2ykk76EzJqsfnLpDMx+TxujHK91GZulql3ZoS1mfdMV7M+Vs2OY6scoTc+tQpWY3Rla0H8rbJ7qV1ibpyWzQjvWhnXh7UkdCKKkZXww9W+zPoyttnjVazfG7NtmOX/Hb7HM3UrNO2hYtvn32/9v20bNm3oX0aN9GJJSMI3A3w3kkpKRycg3wxiqHMZV7e+aryeZjGclJWnTiBHYHCGsGyJIBqgvQRczAg5SB9nwv2wQcAGq2tOSOhPtsRRH4VpSECVuoQ7oy8+GNmfPjVspRoUehIrqPESlG7YXJqjdEClJq0ME3U4g0pzjsDJsRErVIqjl8WRjRjk3O0oHCTwUNmBJzsYRZApovtiBAMUYQ2iHBgh/DivDqxGpHG60pXpV7rFvd32be26ffP77NC3to23Wz7rFKjRuuoU6F98vYn2299OBcykUULpSDXPvtiWffbfdZr9te2vRs31aFW2tQqT7EpdXuhtLxDmYHmKYXqsA1RZCjDmAL8H0fugQk3BcrwWbMFmtbZoyebscvd2b5SxM2OndKX17NKVsSGhUmo7KSGajk3Io5Ox6+ctsUYks3UpFTry8L8nhVhzKUJ8M4QacJUOYFfBimIB7gMUMMCshnBLQk2brbPYnzVWWpRBrxVN2akfqWJalYpz6dWnbRqzNWhTts3WbefQs0rraF1CzK17rr5/bfSsVbZ9i+hb3V77rFixYvvuozlKzQ7bFC/uoXT7NmfWoX29s+xdf16191tKp216NG+xfbPn1rE+pYusytm22dtlLNCtQnyahLW0526j2a9tCxZvqUbqFtWlbWto0Z9m6xX47TkVSvQjU3Wuq3QNdsAnIA2QGWDlSjGBzmbESxqYmZ8tRoWbFmNy9OfZulq8xVr0atG7uvl75DdQszV0pWr161CvPsy3U/lLE+Wlr6tOOWfp2zk3ZnLutYsWbNte2jfWpxRP5SXp2ysltr3RNGUll5yfRrTtWahjGUYXVYziJZk0mkNmarRFnZiTxf2LZqN1J9alUlaNivHaV8ak9seiDLzEbvienJZWao2JmUpStCzRn3dKxYoT+dusz52vdQpyKh8alPsy132zlsrbfffPn2LbNmNTs+lZvn317eaktCvXnz5zryt3XoR2VmJ2ZvpX0J9s+Umo/Rk81VulKUln1baEtZo0LpNfdfXpWb6FmzXvnI1bZlJJffWo2zs12KdmzZmKMcvrWJiUl59G2GV0KktAoaUC6l4ApwsQZoWoUIUYHGvOz41YjOx2xjRo1pLFMvOSS6bvr2ztsO58DCnIzjcnjtKbpVKNtazMVoro0pSvM2LZ9ijZsSvWo222brbr59i3u6krO2zd87bOXzkxI4jyOR2ZmnHrra9e6z3X0KtefdPsXXT+6zbddddbQtn2z6HfZn3V5/fP7uzdfbbdd1uzfZn2KVeJIygqRHgFqIUDbBXi2FelXgcINsbhvXnZ2fJ5FfUmrbNmOSCEuIMEBVgSU5AMkbgp8ST5e2dpWJuf0e66/toRRTlqVGhWuq8mqySfOVKkxES6LaERKEP7ER68Q74OtiSTknujGzJ4wjK2M5JLTUanZmPz7HTjCDXXnJWNV5DElK2nIYwjdKGkEzBBwRsAuxAgGSNQQ0MYGm6CzQhBiuKaMdpS9CUuo3T7rbbb+h2bb7bFK2hbb2/bdbbfbbb9/YuutttsykNKFe6hfZts8tbbfbd0O7n32z768+7nz7FDp1pWrDKMIGmI0B/g6wKOGkA0y0EPCRG4MUmtoyKP1bZe+clLZWzbUsRhHqcbsWz68p1Z8crzfSk0TX2JyOXSablZBD6bhEjGH9i+2TRyJq87KxdbEkO4OsAvRTDGJrrEzJJihG4YKsK83KwREBZwPMCAoTt1C+zNWxlKxbLUYujtSPSCYiajGMeocrGqV0+hTn1LNXvoz7ZSzZn1Kdtt9Gr0KVWW6VOWnZW26jQsX0Kte/6dadsWbFtno2aMxYk9mzf3TlK+dlb52lddSvvpX0J9i2nRo21brM5bWrUqM3L0bExO2aM5dXtlpyjYto077a01KVLEtP69GVs0p9enJJq6tMVr5mzM0ZPMzfRm49VjkrNy1t1WrYs0a90CAgnYEZJ6UDvAs4smoj87Q5jq22zd0+dq8pSrxqSWasrSvn17a1irYn3T69iO1ak1QujCxUvr06daL5izZkVe6TREuj1arUo1aVSfNxXWnztOrZszt87Wi2jTq06USTsS1b6V8RY7NSGHcpRhlOS0XxdC7xjLwvytKMJFEKST41D2PyOTRyMqckjta2dl5yQVZNKy0+Ulp9CGGKJSNRPEknlpqUoSkUz5qGMasV59e+xZjL591eRzMtfNUrbr6c5LxJb3X0a118+clolts3WaE7Rv6Eijtado3d90+pEkpKTcUUq8nk87Vs1Je+6WlaFt1030ZSL7MRK0jsS9enYs2Zecp0L7papRkEcrRjXn1q9ipTneNzNWjz7qFSTxlUjsxN0ZSXklKVnzlGhfN0KEhksfiJMRFksRIYwmwX4GHAqogwJ+DLFVsxbVl5FbGV8mktHkUI1KpbMV5e2vIKU5fJpqzOVKdaRySV6FDla9exTv7rqF91WhbZoX0ZanWrWY7TiWOT5WEOEWST7E+nUk81CzJp2fSmIYw2jkMNaLYRYPoR5BZiFEGdjK+lMVrFaxAz2bPKWe6R217NmzbwQd9vHraV8RON3z75jgRsrGo1ElGJYnvmJiNyOWloZQP81JrYjUINMZwVb4hw1iqDRAV0ElAp5LGpWEGNQV6EC/iaE2D+ESEuEGDJAOUryaOysxQgNdKndCrbAsIAOEaqw3vgWVtjkUcgUkageb52zIujPjlCvWhLv+rbPtgWNKnRnLp9CGdm6zW6FSCOlOrI7ZylArIOkAoYM8E9bzMEJAf4HmzAYbFSTwLCtYr2LqUcgJGNdmrfI68MM7NxAktmxNQEHGcPq0im4thghlNzslkEni2rAo61S+xfddW7brexwJy6vPjlOjdM0Kdsel4ktgRNsinwGCAUMAk4axVGoAM0HCBh3wPNaAK18xfHOzfEK+nbQrykvAAPlJWGcfjUasRDnx2GMP76dKAKdK2+xPs3wWL77rE+tZgf7aliv3VIMExK0rNLn145Zk99ipfEsjvo1J9871JuNXVaNicujvK16dscoWa9mfZqVozqQTECzn0LMCUhEgxwewV4yhVhKgFJAzxRBpg5yWDhBvgf4OEE5VgmbZJTgMNinG4V5zjUNpFJp9Kcr2Zydm+tR52K7bqtifXpS9texXq33RLZtnbE+2fbZsWb77a0doWKs5ffPur2LNtGhYmal8+zUs2bNKl9mrdM29e2+/rWLM+zRs2KU+vYsVq9exdbPoVLqMtSsztifRsya27pW33RJUsffSpXz681Zpd8T0ulbYto3WbM5Xr2b4bULqFte6xDDdXsQYp8aswQUBvgGGAeaEBRRGh1AqoXYYYSr4S4QaEtWvrxy62fVtsTtifPrU6tahZqz69ezbP5uU599tixfPtoTNSYnz7rF9avJ777NWhdUkdWzXttsUY532Z9tm2hXts077FezJ6107G60ZyCH8PYvnYGHVhUswpQ9jGIETS18cmL5qpBLyCzIK0b47EeJI5wzsSC+RSGKo/FUciuGMLEgjGF2G8VxPLxXQs3U6M3IKUTXUaF99mYus0ZSffYu7bbadCvM0+p3T7Nt3QunLM3MW2Kc/us30Kdjuq30Y7QoX3XT7PRoyt1Cbl6VOrSlad991STWa1CzH++jK3UI1Gq3QoX0JSpbdy030rrp9enKXz+xfWus2fr1+vSsy8frW0K9ezYjK2+6zfXm4ImldTvq9iBcVJHC5QmqEWQEXOSKchThShWg6QN8HKGCpCzfDDKQVr5NYg3VulA5VZSlF9WYp2ZyhNX1r6U+d5abn1K9W26zbKWOnQtpSeWnZJPo32Z9i236E7O8RaMR601J6Fsdmo5IYbQd1rYuh/ZqXUr7PZus22adttGz2b618+T2buh1+2xX7/s2e3vpW0roqk0rLRVIIR6EDvFsB/k8BliuEOG8TzNOvOQl2Z2FuCzBQykEXA3UIyk0rHJuVkkSzMJ8hgPsPoBlhYgO0BnjcvQiyxO1IaWZJbfRs05qtToTv3XXXV6s1K3yan3S05O15Wa6t9fsV7ez9KxZryk3bJK1izIOLq0nrSebuksxEt9atKxEhXm5yzN3TkrIKdeKYcR+GcSR2JLZefH7YZVYKcGqEKVhIhggh4UYEtESBEzcBwh1BlloKcdhHj8N5WJJeNXTN8vPmJ8xfL2y10pQo0Z99ChdbffdbbZoX0LN0UStalXnzlK2lKStiZtjt8atjtSD6ahGswXotgOMR4EdClAN8pAOEbgTcegOcIUJNSJZeKZaWmK198rRkkvfZpS8PYrsystIqlS+jHaFizVrV6vLV6krOVZDDipJIjye2XnKc3fUk8tYhzHat0rKy1iXjOJZy6KZJGpH0JylO0r45KVZ9GDpWuk0do1piUgGmAuYLED3Sr0Z9WdlKU7LxjZi6nH5mYo0Ks7ZlItjV0tKS8zUulJLQoWa8+XqUL5yhRvlu+pfWr07qPRqUb7ZahWsUK199i6rWp2a1tCvU6VmhfXo9GhXo0rFGzWtoztKzQlp87Ruvn1b58+fXrW3VaFtmhXr05ShXnJW6MpazPr3xyfO0J9GzUpUohRqJKFtXukMbsys+TUKFWNVpijNx6SyGhTpSSVlJyYjOzUpztaB8gKGXuk0EvA/wpQgRZCpAaYNMC9tsW0p85KxjSun0rEzKS1tehXsW0pJffOWK/ZpT59OT1aM+RX1JND+dpz6t0rOR+tD++ffGd0ak0TytWhJ68blJJHqkT1OrxTxFto1pixQkEzHItp0aMP5NCZJYvozNaWsy0vBLw0hxZg/ui+fHYe2IYYRZBByhWtiBKRqpFMjhnVkk5HI3fdHpy2hWiufDGzH5eRTEvOySnE8biShLz68+lOz5PJ591iNdC26vN07bNmnPn3djuuoTEgrx6fWnZPbfPq8+3s3R2fH4d3XW1+vdbWvvlKsbl7NKvPn2J/1+ds87Ptnz52hORRUsy9KZjlCpdLVq9aYlJ9mtKV6cvyWlK9WUj1ebmrakgsWY3ZlJFGpfqULErZoUZWUvlbq0rG6EUUItpx2XiLChYhChnFlSLIeQGqBjQKiCigN8Bgl5fmpa222+UszktUlY1GuJJJJ49MWJbnYhRy+anzstOTtW6fbdYv+hbQtsU7ZuZtnZ9a+VnxufMcIk+WksvL2KEivk0vWjCnFcM5PC7KTtGEeSxbTiDPq3Wbpfr3V7FjvvoWK1GjPrUrrNilbZtjls3MQnS8RY/A/SsZ0YD5HYvmIEhLxLOQG6fDezBSqw5sQ2pREk0RIxjcG+CjnImrwZ4U4JefCHRiJLwHOGUDEhHgIqD+EOnBCUIMvSvqS0+hOytO6Uup2yaADtfJZqOW233zkzE0zFtnsxfSq07ETT5FIa99CSz7Nskv6Mgr0KsYz6nN222yGx14iWx2QTs5BNwK2tPp0ZDAREKN901XtmJavQmL6FKX6HO1Y3LxPJYwsQ3rySlA5WYVI7AkrEK10ConYh0ICApxZD+AbJJTkUATo3YnwJKxQmoEJUo3wG2IUSTkBjiWlYgMkU204HaGsnoQOnKU4HKAVEG2HMFeLIFvCpBC0a9SBJU4vloBurVpeBUR2pLwERKWZWAdL4ovgQF0Oa0BktimdimtFU+N3229eVsVutRr1ZPMXTlvHZixSlrFKjWnL6NGhQlutYuks+tbWkcdlqs3XmqE+pZv5aUl6UpStszHfbfZl4ukEE5HJSTW04ZzMOpFfC5DOQwj3QrQnXQL2SwKCbgrQpRLCnCJPjCclZazZtuoW0qszE8Z3RXSk0ZRuvI6cbnaErKVJSxbbbYn999KhJaMvfGrFCfbYp2yO+jXodCzbfb2K9t1WUrzlt1K6TW0b6NsvWp1aVtehQqyltOfUvlLNCtdZpVbaMmpW3y/K1631qHPoc5yla+nKffOTFCjYoVaNmM6czQtry1admI1bL16Fe+6O1Lr6Fe+vLys3bbbK8ctjCGcEFA5QD9AlIMkExAVcHGCtF0DPDDBFxqCghD52pYo0J9G6hVrX0q18tWsT7qstZuoW2Of207HZoVKl0+SfbXuoW2169K2bs2bM+dtkdGzK2zteWoX17F85fdRq21brrNt9OYvrytaOxlGMvCjy0ghThThVj8HWM6MxClWn2ZqKpLE1eSVrrMbmbEmjCJ5ND2hC7DmrPmoPIzk8TQv1bFONRycjdWNys7J5SzQqVr5zqRdUo0bHdQvsc+vYnz7r6nXs23Ua9i6xLzt0dm+ds2K10vfdStnbFKxKX23WZ9tizZtunJ9Cn0K9WXsTVmXutoXVqM3RpULFsaoVL+VtoXSO6hFNS+jLyeVnaFGfKzdaWs1alarXsd1anHrZJPoT7NnoW2J9mV7qFehYlLaNSQSsflIjSeKas+JIkqyWdgdJLBunYCJloWoXYD7CnA1wT1GIsdoSk3RtoWbunbdHo5Rpz5LEOUoW9tOTzs5bYoSarUnz7rFCt3322bvuttr9tazK1LpizTjUvIJehRq3TM+RUqtt9Wn2KNefKXT7q9azZuvs9s/oUY1JqdGjfRvpXy3M2IaSGCxJ4BXhfgRtSBHxTAdJSB9hjDOGcWRNElmJYlnI1WmpSFWDyG0gl4VJW2Cih3KwaYWYbTcch7CHF0EFCnAOtWCzA00qE+pdyt1CvTs2be62vK3Ruav7pqz22L+RzsZT4iT4jzkhm7M1JqEms3VrexRk8pZvpV60pI69ScnbZyxUpTnOUogwhwR0liyEG+6+2MoYLMpfPvmZqQ1ZujfM0bZWxVsT4X5PbSlasavl6dC+Rwsy1spXie+Zl4bySCBg3QIyhAL8QoEtEGAKEtAOMggHjgIWSQEFbAOcIcCej8AzxdAmKMETC/AM9aBCQuQDDPgRc+A+V4G2CZgTMS0J2BK1YE7NwJuTQKiYgT0MYEpXgQ8zAcY/AYIO4K8SQgRZDuzFMvTrUqEbi+NxzpyarPmpqjOXyK+tGpJTjd1sb6lKpLRPKytsmtuoS1izQma8XUZqjGqkXw1i22PySGcrDqch/VhjWguVZqbpStsdlq9anLUpyfH618+66T05a2zRm4uozMfrS0YUpDOxuajc1ApYJ2C7A/yl191aPSWS2ysjnbE7N1ZixLTE+PW90Xx2xM05a+Vtnzcr0Jm66l32adG6vRnacxTs0ZuhfQ5axRo0J9KvTtpU7br7N/To2LbNOxyk++UukdG+nbYn0r5WpPo0ZqjbRuttlZ8p2K8rYn1r5idm6NGnL1JixJZSdpWLETVrEvLU7MnlL4jR+ORqXul7MXTHGr7Y/dYiWtM1aE5J5S+zRsSk7LXw7heghIB9m47MwUMVy0cg1QVYQo5FkDHiLJZS++zVu6cpfRtlb6NGxQjVOTSlmjMWKEnkVmldVp2Z8luvoSlOJq/dMT752zL0batteVnasxHJ2Vg8o16tev3ULMdusSskqTcpGrpHGor5qRzNC2MLNiMYVIX58pGUKMYRlGFsYwowdxqHl0pCJKzsR4KkRZetJJJbMwcYTqkvMcpPoz4XpyIV8JFCCbvo3X2IlpTVnrRXPpx26VsRZElt1K+6U7bM+++6hbRnxjbPr2Lq1vZqVZLK06EvMwzqRl23WbraFefRo0LN90+jG68mn2Y7M3VJWzWmrMxbUtmp8jlo3TktSdqcpZn0LZvunIkmoV6MnmKcZw+nbM++ciWtbYnzlt1tGnfLRuPyGJ6tC6rRozUbq0p8enJyUkV101XpxRShpL3S8YRqHMSwzn9sXTktEGvFUL8DLAXECoiDAn4DdCZDyUlYi2JLN1L7FKxfVp2KtCtMV76c7Qun2alefZsXX1ujK3X2bqtmWiSfXr1rqcdjfHoPId0OhdMUKE3Zk8ms23RZDmZh7RnIMMIkB5ksGyMIvswQlOJO+SW0oD3V4nktmXloBivturyltmAbaMcjkXSkxSgTdCxGcPJqajKCEnzMah3XkVmHdGci+E6Wga5eCrJbElhfnLYXoEBHJNYpwZIawzgDFBThvGosvlp8D3R58DPRlKF9s+xGqFKXlZWZ5FYgjYBPWJNDuGM+2+2H8vAMMVx+vUnws2LZijHLFWCe5PWhnPk07AWt03ZiutGMRYAjpudqRqzUmoBJxEkEnjk3WnwaL6kWwK+6U4OMBHQKLgLWzfVn3We2xz6lWdnKt9O+fdXs2JaTxFg/qWaEGm+nOQHGzWoRfXu4BnqdmSSKldAO07dPk0apSsBDRPRmasSy9eAhuUs3VI3NwD3QlqcGaCVgioR4ExDiBfQcoF/bBhiHAPtS2zZlJaxApexKRJfYkUAwS81EkTS1KPwQcvBVgV0EFF0G2vKX161CzXs9mzfVrT6EtPus31Kt9ipbdYk0zL2aN11KS1ZSfL15u26nTla9eS9e2PSka5uX5StbOz77qtixB7F81Bwg1VYZQyhLhEhBjUPJmVk8I8OImi62NwdxFgU3IaMKVmFGDfA1Qa4N1WA12IU5STy8asTXM2Y7WoxNFtWtKQeRlOWLY5RqQy7ak+xZjUMb5yvGp8++P3217777Yquuna9e+dim+vPo1KNeXrztttm+zLS91SU758tZs1re3me2ffPn1Zidqde3szMpbPrfdMX15PPrVqEvPmLqlt1iO0q1WZvuoxJS5D158rE0vMTdC2pbH6VXtneYp2LF9K62tAy3UrMAqo/AOUCcgcIGDGMCMj9aDJAvIsjCIs1A7RFkFKag/hGiWH9fs0exfR7FttXuoV759izY59G6buoT7ezZsXT7FifPr3WJy6XlevQvoT76tnlaE7bKWY1PunyG2Vk9CzQn0anb1bFiRyONVpuQRGhRhRhYkUkjkP5HBMWJPdIJixG4KC2lUkk7JIawSs1EsxEOKJaZhbtj9WECXh1ZsTERZFUhzBWhMoSOS3RHimhdPmJSjbbYtlq0rQlrNetbY5i/qyS2+3sWLNGhPpVqtCfPlaVC+d6F9CUmb7Ntet/YlLE7MW1r7ZyXmL58+fdLVb5222zfYr0KNOvMWJa2tMUex3XT59GaulKF9spOVK1ehYrWKszSqRlWn1JipX59telXvq05iSzVSzN9ta26bo32Kk1ytOZksMYnvrySrE3JZDFs1PieBRVZJdBLxLGMKkA9y8G6FGAywsyCIMPLoXq0DLPklmSz4i2Jvk0ak98ioTde66jOzF8xPpy9W22vdbYo291s+xQoz776NiNV47RqRPVj8rE9aZsR2LJ2tQq3WYHqTwQUmgN0ngO0kgiJmCHlYIedgOkpAfYgwHunAj5uBFzMCOswIajALUfggo7BfhpFczE0khpMTkT33RnFMHGIkhkUSyCJYymI1JopgYMWzkRoS7YR4cWIph/II3LQPsEhAMsG+BQQnQOUB+sXRjRkEzF8hjOSVJ2vO3216VaxVkfZunzdG6IV1C22zbXvrT5SSyk+UujtiPSk5MVJNfGp2MpaPVLpqNxnNxHpQUcOYF1HYCrimATdOAIOOwFHCpBFRnCtD+coxEnxFhXrWe2CVgy0ZihWlZuNXT45dfN17E5PsSOO1Iz5JTrytOM4KUHGjDBHZLKTkhtlKEnl6tivXtnyWnEWN0+ZmLNsmrxqvE0etnYonww3205SJYviaQzE+LJNZmI1OynM2Y1bPpRyhLTEvbPqRupEkjg8sw0hlFMZQU52DLIIDhdA2Q1gNEDvFUHdCt2LFanI5WZnJSWulbpNOWzdGfbP6FafVq1KNaPSs3QpyeKJSnKxyPxbHYcV7ZmzfEWlCfWjs+KLYvsyWvNxqlVvr0KdavfUo3w7hpBvguQyozMVRlDytBUieGMPYYwboP4RvutjU7BEwMSCEgNseoynPmJuKOpOTNScp1pyfHadaOytiOT6chiSldbHJqJ6Mf4ln33XSaYny1C+vb3XysklKFGvHr49Zl5jtlKN0xLWKM+zSlKtG2vKVZPdRpUanKz6FSVo0bM+6j2KUrXlbb6c+vY7FGpdMT5exYlK85HKEtRoyt8Ropr20q0ctsTNGJK90dviHMy1OJ5HHKsXU7pa6nLTstdJKVspNTFKlJJelA5wSNWU4ol4jx6dl4lmqsJdLi+DrBgksLVKry991CUpVqdtWNVbb6NWO1r7MpdG5DE0mm7ql9efSo0ZWLad8+xVjkgksZRD5SdklmMrY1b1pHJZFJous1aFbpSsbrzVOKLpmzdPm7EQocQ7lrEghlZjCH8cjUKsnrTlKMIixdFsKkIMXQuxfN14tjGE+FOGkL8ZQswzi6FKJJDbCBCnJ4jxqchZnIQbEvLRyxK3xfdEK6OSsTWyC6NWbqE3PmetUpTtmXj119SOV69mvQoT7p9tvZsz59GZoyaZiNSum4b9t9bu77qF9iRVanZsX332e2z2a85TjtPrWb6NCvJrokoz+Zn1rq9aTVOzUvr3VpuJpu+RSsisWZNZuo0rE5MTtttCSz5SWhpZr31pFbPhxJZi6pLWJyJ581Ox2jYrRnPmY9DqxdZmqdmSTMMNWPSTiqSSKDuKYL8DDhNhpAkYFvALUFaCxBTpRqzWsUbN8djle6WkNOtO1+62rK17r691G66hS591Ltjd1mzYoS9iYvmZSKpyF2GNm+NWa/GMvUoT52JaUKcjgrQeQoQUMRYGaSWKsDbYi+VgMU5OykD9MS9CB3ulJSBylZSRQYaltmCxNw2nzEkiSKasYT7YizkxFdahF0cl5udnJm2zC5K2waYcwhTteNwQkeg1Q4gClJ4mjOA1WIHGNRVHYQZaXmJafTsTltti2zf1r5qjTnzkvOXxqxJoCooxEpR6x9sZU4liaIFi22FefPsQTNmxYgYk1FM5AV8liacgJ+pGpPATknk1iApr5JYgLa6QUYOtmF2+rXq8irT5qzRmqMBWUoygS9m++rZqSliSdGhJ599t/0p9ajRto17Mkh/LzFW6L+STtOhEacmK8j6ESTNmdjUes158VUqFsNLbHE9CVtmIl68foUKUzTi2JZiCajCEq+zEaFqj1YgQ3mZLRhJlJLPgZaF8mhKrzUbhGkEH8ihhrwd14Yb4JKA5woQMCDNGfUrykxzcmsVqdi6xLUK91mh3S8mkstZrU41dYsSeP222yaz2JNPsSSxTnZFGMrG60htpSalXl7o1bRsxqxZt69KxfGUBhiWFGJIKkfiqVg9n06EO+D6+D+GMEVHYGaL4R5FCRIIJelAp4lmoNEDhCvA5wdZJWlJeT30I1ZrxP8/oRLE0ZTsfukF8T17okiycj1aK49XqxNVqWy9s++Jp99WlXktmOWK1GPTszbMdipKySYszFGz28+lPqy9afzli2xfTpz59izQm61OvMzcpGpB2b6XMderzVSYjd0TTVCUnasdlZ26Zq2K0fmo3bYrVZiKr4mnb6EknxqhfVtup1penQvnbFLvsV6FO6rSgdYG+CXgsSSAva0GatDeGUGiYhThpWgqy8GynCLHoGuNUrrFifWuusTlLttvtsXWJPO3Uepf0bb6H3T6l9aalKlCWoXUal8pUs30bMpStsRqUp076lC6Xvup9WjbT+xSn15LNUY3ZjK2diLEOGkZQZ4Zw2m4VbFODpI5iGUgiSKJ2rFkRopj8TVY10Yjy0EdJ7EMYNdOJoxgoq8WwjTsQYQYX68NoziSbhciPXlasr077FGzZpyCvGpNZoWL76FezSts8+vbXrXdmbqT6l9ta6vM8rfK2y/HJyJqVmarz7anfPs2K/b22balmjQsd1azbTrz5q22nYrxVGPXmorhjZsz7exdRts231bEpOSKzLT7F1GdusVLZ/fZ6NCSX0pH2asrSp9aLaM+Xn16HQqUaczTsW3zk+H1tSrN8T3xGvhpLQwRuJ5DGcHcUWKMZQOdsBfRjAFWRwTshgF2LoGaFyDyTw8kU+Ox2LY3SmJqNSkdvjUhjkrZo2K99m26VvoWKc1Plbe2zdZuoW3WbpWJJ90+7odGjVqS8QogyKcj8E9SlYNkXQdbMKsrD6LZDEWjESCvGcIUzDWrH43KUo1J41KzVGdqT5eI9SGGOyKbnIqjtKpHYypRBg7jORQ5hdgbaErBThfg5xGhBhFgmYDjQggq0EHCDEkFOXsVYmiFTmo5Zkc5LV52NUI/O0Je6nWoSk3ZpV+rLTdi+22zQrRu6Uii3vvs2wsQ0goL4M8pBH3QMW+BbzMCsjkBVz4BRy0BXRbAuqsDDrQTMYQ9h/Qm5itH745SjfMX0rNC77NGrUv6FaSxJAUUC0k9e7r2LFedqVKtapfEl9GTUa0itlZDGMfmoTKkJcfl49Yvqx7qRLEKdiNO0ZLffbVtp1KU+fLT69/RrStanPj0WS8htlLat0rLSOnJYmlIXYGibnIf87MXyWNyWNcFaGGC5HIcx6fFELkHkErLQScgg4TcHCNwrXQaJBA5QNkTRJOUq0pYjClfKxFvjk72JNdQnb7NevTp9eS04snafRnZyvLXSlmNUasxTpS0tGMNLE+ZsQwy8ZS0no0qFO+bk8pZv6E+rHIiQGKGMdiuGsZRXH59GfbZuvtqzFOM4O4XIHyYiuEyc5NHoDDAW8A9QiwV4GmXsTFSWvtj9WXi++lC/G68pLRyKpBKx2GCJbqUdjctJ5NUi+O3xVQr0qdaUpxJJIkiq6hQksrbQjlWxPrUOnJqdO2jRkExYnxqxN07aN9i+UqSlW22nbTtuo32JirKTVmNz5PToylCzfL8rQrS9siluNzlserRlLStCWkEvG4vlZm2bkcco3xLIYYylmVoxEiSWujUkjkZxhQqTFCVvqUZN2Pm4SYJaG8GOpZkEOrFWIkRpa+UqWxNDaH8IkboxJ8+cusXTttKS2Z/ZrTVabsWZySRucjd8TS9StLXS91SfEeR1a9KXozFK6+nXrS1K+pLz5NNVLZW6vZp2avXo2LaFOdpT5PXl4iX2akvFEeh9EskpzcQ4kjGnfbH4Z0pLFcQ4aQiw9h1CLESLIYySnQg1zVaTVoNMahfla9CDbCTDDB5B7Mwb5iK4X4S5aEa+M5itZnL75WUvq0pudj1W/+/sXfStvny0++2UsySVrTts1Ztr3y9tax3X33y8ko1pSx1aNi2UrXR2vfUo90ivt+fTrS0jl52jP5S7rx6HV85G74phNt5SrK29teUtluvHL7ZyXk8vL15aOXy9i6zRttlKkU9CWmr63WnJqxM0IspRjJZ2aiS2rXjtitQ4WYqpR2PystDOjbKTkMFsjtnZyKYS6FWpFkxSiPCNGMZQjwowBchYgH6C9AK8vCTCNAqoV7EmhYg0wu2IusxAkUZV4j8F2xZsQwzlilBws9CFiUlYkgRF9njkaiWNQQczB/DWCrC/BvvgnKlS6EOIMYWwzl4lj0OIOPKQKaPw8j0HsTw3nInnJirFUbozsKMtQk0xRhjdTs0bpLLVL4B8oy81Zl4d9OzTul4bR2EmNU5PSpXRXKTMS0a9m2lHYBwlJDGr5Hy0+tZmqs7fbSoWbbbFv31Ze6Xj9KAw1aV1Dp0oopy8cl6MKcC5jOrEskgv31bYIGjDGMqN/fBautvmL7efbY5bvoWb5i2X47dFXDi6P2zNaA1WYeTEUR2KIdRqEmG8N4fwRsBayCBLQTUEhGoRYEpBE1YHifYsV7NWrAfrFs5Wsd9W22+3uqQp0752+Zn17Mgrx62jZlIImhN0J9OVvozdCWoRXTsxqfRnzNOhdGrNPp23T4ETy0H0H0RLoPYQZ2ChuhWswVYVYW75PXksmk8vI5NJJJXk9iTwH6hfVkdiRVJiYj0H0DPBbhtBKwhSGFihBKVqlGFyvOWbq8aoxJZnLNivVr2zVSYn1rEZwn1pyT1atmfOWZWOWIzjlGJejTjcpTpXd9itNXysG++vbMX2y8Mqsel4rl47MwBjn/Pupz4rsRCq2w1gdY7ABxn3WZWxVkMIcZyWQy9CS0ICago4NUWwb4ew9qwdJ8PrMFDHbZqAxUZ8SQvTc7HYOc5XqRHiWVnYB46NGxJ5y6F2fPk9SjRsQVZScutm6k7EOnQsztSpbAdJ2ds2KE+Zkc7NWbHdYiytOy8+6l2LezdYsVYIaXsWLNtti6nZr1KtmYr2Lp2dsWJi2jPk1ClKykA0V6VmpYklCOW99ipfKwcK87NTlbpwf3XTtetYsQJ+ldPgqX20YL/BdhtAfYEJCfE0Cdgn4yh5Jo5MUoJ6Ic5Uuk8aieLKM3L0rZ2+SWzstXs8+GdSrOV7N8+rZtrW0rr6FG2xYnbNizN3z6ErbJbbq1frWKt/Zvqz6nZn232LF1Sp2Z9mzSny9W6+tZv4WKUkmYjTVeIchhVgoogQbIohTvhViHLwe1oXL7ro7Ek7Uk8Qo5HJJFM+G8N4eRJHLEnjcpdBhhCgrRFhpHoGuK6EJc1J47Rla9ifG75WVo2KtiNUZ9tOj2bu+222zfbffP61aclImlrNKn0I3Rn3ULe+z3UOzXo99atZs1q11tG2nfbYiuUp1JSjRtjlmzRn8+fIqtKXlZ911C6zUm7p9W+tVj8/uszl9i6WoSlOpNX30Kt9ijKWK9af0ITpJQ7rq0Y1qMZ05qOX8EhRuksY04YYJ6OQexLYoTs7dAQ9S6Zkk5SgrWb/k9WQQhwMnh/ClOVaFtmGdeFKRwxjCHsCFiWALU5AeYGyEKahnOxNEteard0xVoSWtNVpHMRnXqTc3Z7Ft/3XT+jPjlS22ffPurW2L6laKrYc2Z2AYYOkYyeTRhJZyrNxnFs7Wi2cjU1yKP1JLNS0X8YQwxBoRBkE7EWECDrAL0YwXY1EkIcZT75qI8RasgjOAxQVIJeB3iaGMfs1rMLV0YSSrNSaEaQ2IaT4g2yGG9axDWTWK0aq2zs7J4qk8MNtevLzc+27lbqNmOXyl8+NSODjYg1wUPfb2Z8GeFqM6smsztevYn1pbl75jjU+Vry0+N0JSnQ7NtWjWs2LFm6PxFgbIfwJuCYgENBHQCJmIE7APMcmIK8EDGUWQFLAETSulaVaUsTt8tSrV5idhnVlpHJJSSSCVox6UmJ9ORRlYsw1iHEtC2pPtrSGbj9WUkt0hmLNiM5HO0pq6SVZJbIJiLZiIlmIseiDfDDLQrU4N8ZRVMQjQMGOQIeBbRJBHxZArpuAub4J+GCM4ZQ9moYYpmoziNFMKdKIFiI10Yx2SSkL0bhRgKKBlhCjkNLMxfOz5NSlpaalYZWK3Rsxqh0Y/GpNWrzUzNRZGdSxIq03bdNwzrxEmpHL1ZWUhrbFcIMpOWY3O9WvYvrXf0JLF8SREj0zFcmimZoT6F99m/n2LZSvF9stKdCtQthBhcge+EKHchpyOvAY4FnAQlmB7guRVH5mamL68NIjyshtm4Uo3SqwdxBukEgi6vddLR2ajOYs0I9KxnfDeM7ZWbma8bhvYtodWN07M5KyelPjCX6MzPm6d1KpfWlJ8tYn3Ss5Gp8anzFiVoRubsU43NR+6VjXGdKlTvnYpn15mSxqlUpV6d1WXkdGUmJ2fKxqXjKORySS8vXrSLlK8csx62vK2xlxqSysnsyOtO1b5y2bpUoaQ9gsQOdSnGEHOMpaMI3JZ2cktOnVmqs7M0qFjo2233z5a+z30qtaxViFDKYj0gj9eWp81dVrXTkllaE7Gq8+YiqYrcvZq30759CrQqStOhYszNevfP+6+xddPn160nr0afPkkdryTi2D6ORBhrGcIlWxZjGvEaML6MG+FSSRHi2NSkLcTQvysckEjswNkYRuRw6hWh5CJAw4LNaZhPiDZiJB1jsHWKYPZaF2QxnWiajYvvsX9OUq0Zi6lfXvoX3WbM+26+6x3VpSrffSl5NbO15q6l2bbrpq2zbddK1ZHPny9W23tvp3W0bp2Vk8hv7qN1epRvna91CjXtqVKs7PoXyOlKxEr3xRfUm5FRp9S+O0JqvHucr9GvWu7PKX0bNfn0pBK1ulKxbLy8mh5YjOXk0bklGTWKkmjkIcFSfVlL5q2alJ2TzMVRnBxmJqtYsTVCKL69SL5eDuGMOZNCnJIeQYIlgiII2AWYNEExYgVU1C5ZgVUkhjGMCWqwgwUMJkXQ8monsRqfSqT5WZmacT21ru6N2ZmUjk3DSG0bhMk8+rLV4TIzqQexJfEkfgrQZYzg6R6LJNCLYimrEkikEZXxuHk7ORVEKLoqhOj8KM+AxxuQV4LEQIUJeHEij0ZwfTkFOlA4xRGUigs0KUZwVpHMx+Bsvh3Xoy9Oct61tOdj19OjNzNGxdZjl9e6rYo9SVmrNi+fOSPi3s2yl/Qq0almXlZSWi6CThYla8Sz69Hkk+Gcpb2LaN9efMXV+Xs0K9CzRvl5SQTMFiZhghjAmoQ4J2OQBdjkZRyAQMHkE3DWAFqvCNfANFWC5HYDbDBAeIJKC3GMDrBxgKmHMBQQHW6+jVr15atO15P3UJedk9an15SdlrbpDYo0aFGJaFTr1KUbneldNylGlXp0b5BWj9KLpe2nGF1Pi2ffKxEpS90LlGJakBe0IJKDNfEWLoC+gzz5DAxIJmr2IYJ8WzsRL5SVk93YkE1KUYvktaL4iXxu6IUF6ASUN4PYJiDLOTU5Uj8hoTFKcl5DdWv52+tzlCrWoT6dacvvjsds1o9EeXjs3GdWjE0tTqSspPsSl0nqylGcusy8nlqd9eUqykNZapLxTRjs+3uq20rN8RuFCAvI9Bdj10pRn2I/RjChA2cLd0BknYojOCAiLD2RwDvdIIewHOI8JkK8SxjHo3ZksHvbOxyhTiuLZqhJ5NEs5ViS+G8+fIqd8R6l87Sia6cl6lKVjGdn2JixSsWLqc+QXT6EbsSterOW2ZJMS1eXsUaMY3U6tKfHKM7UutlKsep3dKzdPj9e6+fYjCXiWchnWpT4X5iJbMWWZS+H9mKpuVrxqVn0o1OR/mpyR0LqsNLMZTs3Ss3SO3un30p81RgvysC/gPsIspAY68Z1YiWOaiaJIWII+IleQ3VYPpWfGMOZeTxqvP7as+2xdKWLN8aszt0an0Ol0e+2ZoXVK1tmVlJ2fTrW1q18tZvr2OxPrT59W26hdVvs3XdDnKttWpXoTlS6UvnxnCtJbpPI4dy0KFGRxHmIUoRZHLQxpQqTsd4ziHB9Efk8xdXqQlRNIJ2DuLJWOw6jUXQZ7pibg40YhQUonhGkNOaqRnfVny0ScekFizNSszQvod1Ls2O+27od1CfbXmrpyjHrFenQv6la2VsT7Net3dt1TtrWLpWzdZp1eUtrz6FalZmJ9ifKTti2QT7rNShSsz7F9mWo2Z/KX0J/MUYqmp2d52pGrqlaT16V8zYp2Ja6xXo81WoWKNCrbHObnL7FCPUbPZlaNOpECH10W0Ibytabk8z30pPbVgi4OkH3XjdizO0ogyt0Q4jXSkTQ0uh1J5BBethctieaoWYm4/GoQYwgP0L8CYm4AqRyBAQjQNsOo5M15yJ5DGqEVxfFNa6jf32bbe2vFMJUElHosiiajUIkbkNaRXWItiNCHGMDTGUFSQwWoXYT5aC7FsNpFDWD2EyCjgwS0F6ahxGcDNH5aRz4ZyeIcxHYfQcYohSgxQZ4IOIcD5FcKENYli6nG5JFMci6blJqWnzcahtNxqJpipOSk3DmFSXj9OHtGKrZa6xYm6V1CarTFSSylLiDXk81LWbq01Wnak5ZsTUrXnJWRyGM69Cjdb2aHW6Vbsz5y6pPm7ZHYrV6lWzy0ihIiNA/RbAE2DjAHCCLgETDKAFSNwBwhlANcFaJ4TZBYiPKxErwsTMzAvYLMD3E0MEJ8Bni2HcBewBFytSnYlpPMSsniyarVpFfEkbkcpKS9WbsVKcZxJJYX+vZrUZe6OyalPm5BM0b7bE7YoT52NV6N1ixK15Nd1q1ipfVqUZ2tPk83N1pWIsHsUww1a1eYnKFmIvffPnZi+lf1Lq01ZlLo/Rk1aSRlKQboR4iwE5BbjU+hGHGU7EWT0Y5bTq0ZuzZk1mJqv38Z2xqhJqU5w04cUJPE90+SRJDGdhbsx22tWmJuhNSSU+T307r5LIJitEsxHONy1Sf2O+vG75DZn2LYtj8OYjUqE+UoVpWnKdK2VpQVoNcCRg4wG2C1LQgRhfB7BHwDRC3AL0FSBnjsUxyD6P0ImjGSR2I85FUNqkUxRPi+D+tDKGNsR5FCBD+tHIwjV90WTUmpXTcVSvZlqlKXqyteWjcvJo1QlbqtmndK3X1p91mzYlrMkvmKteT1o3TrxyR0q0X2xqdnYzl41Jacctumowhpys5FFGPxjLxqPz41FEgk0TUI1Yj8OZLQiuvRieS1IhXWaNOdp215ScrUa9K+VvmbpmbjVsBhgXcvHbF9GRUIml4xrT4xgMEZxbN0JJZklsSSGJujKU7rEalKM+jRrSti2Vo2ZShTo1+2vTqxqnPnJmXl4bVqt9C62+fbPnyClWrRufdKxucnaNO+PWZyvK2a10nl5StKzVSlJJaGt1CRUYh3QfQvyOD6FqGCHUQZDDKGMEtEsYQ8iWXiJDGZj0Q5JXtkszBVi2G0K8LtShHYPYXIiwgwhRlfGcI8nhYlqEMYMkZwa41bbFk7Wn0JDCtfYjCOyaHMmi7rdm6lfdXvus2aFmzfb9CaiSJrr+rPn0Y5OxhZr2KNe+do2altt01VlaHdTurUI7TnZe6WjtChKWacdjV0nhrQ7bbbM+zd0p2ldPvtlY5EsNIbRJCHJKk7Qq3XQiRHqV43z7pi2lZoWbpv5SaiPbHKNOnGru22Nwez7Favb2Y/EWjGEHKxUtoWa03EkzOz7p2ZieEPs2Jy+XjOC5KSOIEGGRRyI8Wx2CzPtvm5epAYoMUM7EHGBX0YM0AHsmrR2DlYvtgAE1bMtFcEzD+YgQ8GyFuRwG6NQr2LZ2c6MrFUegboawZIcQMGGUxAvoEJCJA40YC2sxyLYE9CPfHoYwxnJqCHimnKwNdtsMoHLpxurdbFUDrbbRiarYugrV7F8YUuvAzULbM+doT4RZP0okvk8Zw5l6EfryetLzNO+MpyJaXEle2+6tdWlJN1b7NC2ldXqzNW2hPvts0bFCfJZuzZpUeK7baHGUU1YN8Bl4aQ1gB5nLa8AYq8+Zs06MdgDjHY9G4xpSsvAS0pTlIxjUfhrAICOytaG01XpQAg0qFSD2cvksCKnatWCtdXrwZqlmxBMT7ME5DWGCBWQMeAhKkCSgIm6pfKVLFWtdPvq0prktKffL3Xd1etZl5910++27tutsUqtOhStrSapPn1o3bYksZy0pVnz5WjIJ9tC6Us3wu0JSfFfCHA3RlBthYg+rxfCBAvIj2KtOS0LFWbvqV69GjZoyedszsgkspCtWn2IHqZg8gyQnzcHCDVA8WIfW91CUpRNXsVLa0crUufPs17NGpbNylKzPm7NWxdEnN07p2zI5LQnzUrSqSStXnz76lSzWlL5HKRq6KJWY5mnQs3T+2hfP4pth7OQbYloWx66jfIrMb4IelFcdgmI3FErAHiJo3XgoofxHhUgJaIkRJPCBVhTh9AME1CjC9BgqSKrCPI5HTgpyeIt0r0LEauluOWKsxJ5FZsQxieWrSWSTl8O5uxbG5ahZh3Vkkp1aM3DuzXl7E5Qswyo3VpSvNUIZykpUnK9m2D6+lYpV6lKHNWtXjV0+ZhnbZqW2aEpEk5Xr0peXlpeTVJPbM2zs7Un1KVGcoV61mzJK1e2tO169izbRgb58IUxAuJSE2PwREGKBohCgHetZsUba9i2VmqsNYOsEjA1TUKMigtRVGo1DeRz522XiJJqMxTs2yttmhYoWZvsVa8rSoyttCtfN0OvSn2K0+nf2zt8+rLdifPv585322OrRnbPYszlafQrV6tiMLFWYrWJLEKMYiztCRSKC1Fc3GUKU1JYXYGqP1ogwfU7ZLCRYu6cWQ/jGE2PxRDDByhKhMloK8PImhSimINCCvE8vA2wM9SPUKF0vG5eVlJyQXwfzFavPoV74kiTnaViz1rb7Ns+6jfdQrUKN9P6s+6fdRkts+hY61Sl17qVCxQts0al1vRn17NGhRoU++nYttoS11bv7badK6jK320Y3233SGLoljGNySMo/fFd81JqlskqTlivbTrde226Q1K1SXs0ZWlZs16nWvoztmJKMhk0lhlJ4JuSRLIpHO07E5NRHunY1G76shrTErZpSSTzsjk/bGUZyeI9CPykeiyR3StslmqFm6boy8vFkejGJIexLJ4mny1CfIoICBdwRMNYDrA7wZoshDkEUw5s3229vZpySjG4UojQV6k3NwGKMYDNHYDnE8AsWwCzXhDhBhEhpBgg3QM0jgyQvQOnA5wa4BYjsDLQhLh1Ly9CNSCNSWvIuvGdeYkNCfO15epQrylKpbFFenUqTUZQfQ7nyGZhKqSGhI6NGhO0L7okoRupE1aMZ9ezddLWbpfrdKhTs315SciSffZvnJqSUavbPm+pRks3E1WF6BNUIE7bAn5WBSTUA+SSAkIhwB3h7ADDGcBMxqAQcbgBWjsBKxZAP8FKA5QWIZwlSGUhbiWIU7EOUiFPiFMQwRuMYyk9GzTm6s5VneM74K0AoIPoRJidqTM7O3RLdKW1KkvVqzF9CSRbEnEKJYkpWLNarLczJoXqUrRsUJuhPum45OytCNz5aSUZiXrTs3OT5qR2xnfPvrxylLTVGfPtklWrQvtla1mhGEEbH4opTFa6hWoUKNi+Ja8PZmQS3PjUxWjcW3zskuoRGjOYgjoTYkgEvCPGqlOhEWblbqcR4WYziLPiDJLqU7fWlrM3RqSk5bZrU5a+fPqcdq1LbEcl4ylpJGNmR07E5X7Fm2vNT6s11ZJNU69WxNS991OxbfY+7oXwjwYaMtbPvs0LrrMpKx2dh3NRVFVKzFEXQ2hfgGaDdAF2E+B6hQoRZOTkKEG2AXYgQIeE6E2GUNZaVsRyMIniblYiREh/HoiS8rBsjs7Kwezkkl7M5DOGcYzMU22YYy8enI/HopkkTT5ePUpBTmZavKRGiiN91aZiabjU+duujGUlZStffHZyWsxqO0eGkpEti+Xuh7B7QpwlQ/nzUHWzMSSTxCg+iPBQ2YZUZPJ4ZRhOylmhUuhpJ5PRlb59mrIqF1OZnZa2lMXXVatCvKy0DTBFQXIHSdlr59tKrTk0ZS8ghBg13wN8FeEmS30pJXmrZyhGEkhHkMPZ9CXp0Z8tKUef1I3Zo041yfr1IyvoWZyZtqRTUr2LrZyxdfQttuus2LMzUjk+zdIadWUn29eYrSe2FeXiuG8E9LQ1qUIPYyhnIpPE0YyaNVpWJoGaMoK98PJiVhjC/D+JIX5aDbdEsUQwWxnUh1CFWhrCZCdEkIMKkIUGqBtiHDaC9DuKIeRNLStsbqRnQm6sVw9hnDaCvQsdS2Uk0Rrr+2+2hLytivJ6M7fQsU+pT/t7qNt9mh1rr6F9aSyejJO6vWsTsjsUp9m66tXsz+vfToXdC6fdbdYuulOVpW1591OXlL41PhlJYhRqIsLkWxRNyC2lNxqdumZBWjtefbfOUrNW26OS8xLS1KlfWsc7RnLNmYkt1icsySDVUuvlIshnGMMpaLpPJo5ECNQzukEIsKsdianHLEYxfDKN2YvjcX3TVGCnCPKVaUrEeRSKOy8OqfCXfFk7GpHEeNx7jcSRJXoT4HydhRk0A21oW4vgswK+BvjOfESn8pbEsOobwdIGWA4QewSM5CFBwgmIENAlKUO5LAmpaYjCA7RyS1YHqclq8F2rEt8JkrQ4k7Z9/QpTVWnO2JSvfXq1qNeh9eanb6V3Ps8pEbhxGd0xWnbM+KJBO0Z26zdXr3T+fPvsyShS7bN19azb0L6Vipyt9t03VlpNbG7al9C22UhnORCiJGEIMVwB+hxIK0BL1ooqwBrrRXXgH2vDyvAk68S8ELYiWTQn2IPakKtfmYV5qOS8LErUlIjX9sW9itILbbpNz6lSZiNKQPEDHghYGJKzsVwEbPnylCvWs3VpqboS107Zl6FCfPsdmhOT683PoV5HdKVows3Sk7JK9e6xfXp2xurbJ7M5Jrp2xJ+vK33T5WpHqVK+2lbRpSWB8iNBOQ4gwxZBJw2gLOUuq1aNW6zQsWa1itZq9mbo0768rHKsQpm+Uh3FkQ4aQCkiiHMEbBVmrE5ElixySNRuxZnKcpZr2LZic59SzbQsV77Fsavm68+pVks3dfUr1p8xZnL5SxJZ26hXvktCTXye2Vtq16HTts2KXXr1KMI8+BgxqUnI/Pur2aEVysYzEJ0S1JmGUbmZaKo9dQgPspBKy0AZ45FsK0CljGKoOUCFhgoRFgTN1sYQH+SzEXwZYgQ8jGXqyCzNzUMZmXnzNaGcvC9J6cjhrMwjWa3CVG5PGcfqzESwjVI/IoqsQ/jsIF8NZNCBHYhzUHdaNz4PJ8akkMbZJLQgzsxdCTHpHMwoWY9Nwkyk1YhjJ4/bKVufUqxPJ5y6I9sg4c28zDBYqVYpq30Yv52dlaknlalKXsU7FepfRp1598KEMYJuCvAFuGsEdBegF/gTcj4zjttWzYv52XnzE7F9eBmvlZyK43FUalK8ltiubukkSXS3L2LbFKv/S6lepZtr05yvdSsTF3Qtt6NmzQ6Ve+Vn9tevPnL+jYnZ8vUs9idvjU+pdPjsxD+TTlazGcck8MZ2z0bZJYhFhhg/pxbGcFilKx+BsiNEWWgxwow8iWEiKohcSQrQ/hGgvwzkcbgpxqfDmB0hgjkXQh3SkIVKfH5ylKUbZWhGovpVo1fbKybsSWrQr9Kap15S6++auvnJ2jTpUq9CxXsz+h0r6fPuq3UrM5fXpS0tPtsW0LaNtDo1K9mfPtn1ZS6+xPv7pWVusUJShLXTFmclJerKSsep2YhUolpxlJaNChIK0JkRr4llYWZqUupSSxX5bm58rbdSury8lo32Z9tmjZh9Uj8LNsSzt0OK8ahImoX6MNYpoVrpW+6+JuG1ScvjkYU74zpRJIYVp8H91OjYvhHsxdFcN4ZQ2hMtu7EckVGJ5qH9mtG43L9mfMyaXoWystEkDTAc5WMI5DW+zPtoWZWYhDkUF6GUfiNCRAa4UYIuXoStmxVk0rfG6klmperGNibrVoznbMmkEam6HXn1exYimpWoTtCjRtnxu+lRm7EzL2aMpQtvmq0MHM0qlaOV5PRjCl3UZ9e+rPj1eTU7FtiVlrbrNmtWoV7rMpW+tSrWJ81XnJulbEa6nbz75WfXl5FE0HGDnEa2IlmI1sY0IvtiPSiHSiDWhgrRDjcQZSGGZiJGNXmpuM5WSySQWJ2OSe+QVJudnZS6jYrW3VqcijOMJiE6AIiKo3Hojy1jn0I7QqXWac7bXr3T5qbkt1iSzFPnb5LY++nUoWzUnl5HQnY7OStS+zLT5LG+UmpSR1KE3Ld9mnSrSsrWlpijQimdm7M1fVnLoxhxDOKY5E8tbbfZlKl8vG5mINW+OySlDK+MI9bdJYb14Q60JsWQfx2LI5AeYX5SEvh7JqspEtWndF8vNRucjUtTjVSl1L5fqWLM70LZShWmq0hksx2JmM5mzYhtNzde26Ulq85UsVLMtI5eXnYok10TVpebna9G2+pGrF1irEs5LR2zVoXV6FKxFMnj8tHaMT0oom49TsxGmaFOaimpCfAwYB+g0wAiwgwIKE2EyE3lIphbgN0LUCRowOMKEFWvCLHoPIjQ0jUmhBjKRzHNwjRRJKkSRDjcH1aEaLoaQlw3i+Clw0g7iqSXRZTmLoOUH/Ow3jGM4QqEH9S2Koqg5w1jkN4tpS0H9SPTUIMOYpkcFSPQUowiuD+J4VYcTEOpPFsciiIkSz47DeS0piS0K8hjsL0Ma8MN8TUp2TwzkvKXyk5TieTWzNShKXVK1KzUtrwyhegTkBZQApQiwHyA906cMowjUV1ZPPrS81PkM1E0ZwlR2Fq2vBV4qhjIZHdXnK10nn06dSjQtto2bNa+xYm6FichtSievGMaiDLRRYu5LGqNmxdRqWJWPztKdrVrPXr21Lb7M/umrqFWzE0xfZm7FtGWkEvfQnLMTyCSS8HCK58Zz4ZR+FGhCzIINUdpQL6BzjKB+hPjCB1iBCxKQtUIPoNMLcJMG6A1yaB1imG1aSQ0hFgj4G6K6cDvGUG6dkUpFU+fPtn0oaQc7MpKW1Ks+/6FWfZqx2nWut6ti6z2z7E5K1r7ufbfdf3T7Nmh0p8U31o/Kz4ks2J8vK3T6ffSm58+zO2behdXn2eTxuN0L5aUnzUrylGnWlKc+2fPjkhnwbYSYYIygNdaYox2KoLdCdh7BhkMcn14lkcT0JflLM/umKlKSRVWp9mfZkUxEaF26DrOxChFhfksI8YwuyKNyKDRPpXXXX2bb7FaldORhDyjE0zC9I4K98XT5ivXqyaSwdJDI5SMoHSWn9tezOwdK9CdoxNLWwJ6SULa9eTyaF63jkKkDEgKCFuBERHqVoqpwxhrRhtA4TMFeDuJKUCNgCXg3QNkPIqhpUpSlS3nJXgy0bZmvJpJSh5L05WnMX3w5n16NsrYsRq2rUn323wztvtoUp98vYsXT6FKzH4hWw5nxRHqscnbZNd3zsxfZsXS0+XlrFmvN1q/XsVb5qhYrT5yU6dspWk9avEehG5enQt6EUx+NVIElCpD+2AM0B7gy2YCxvrV61tirANVCxWrX/Fdta6pVqcBts1KUrdRrw6q9C+6xYg9rVqV9i6fDm/s1Lb58DjbC1AXEWx6EeCzAMtCtJatWvbQq20LEln0K1vOVpLb1bN9WpJ610tZ759iVr176F33UrZ9ta6zZoRdfbN07FKao0qHTma1iLZeNSKHFKE2AzUYGTBIRyjCpG4BRxPfKW175WSzVts5Ny1avG5SzSmpWlHoRJ2TU68TTdSLpWLrYuiLJ6sQrE7HJucsRXJYjykrWpWyladtvo9KvUt/vr331LqU5QlpBJKUtZvo0bqNardbXrxVJLEvYj0vGp8NrM3bRr1q1GVp3R2lM2wZ6MTw1hDh9C9SgMc+JaEJXDGOQbqENIqhrHZirACRzM+JJWXpwFRWq0I3Pnz4AIs3NzcZRhECLaEHCFaLoiREhYoQAwSWFqRwtyKFKIsGGnWk8MNSR2wABpNIpyIcS31IQ5PI4ni2pJYugT9stFM1XqWImj0rZq168xAipPZrxnSr141EepYpwyo0YEfIKk1QiudktSbk90xPvm4ExORlMTdi+pNV5PfEltC+Ah769scjd3C3UsVomnxudgBhrQVb4QOClMQLmG0I8FyHkM4PIK0AbKcY1YX7M1WgI6+xYjCaiFF0JE5JL4xtiFOQvQrQNMD5E87WoRXKSapZmPrzkluktns0r7Facszl1GzOy0+UlOjZnKtm3sXT+hXqWJ9tWzbYvlaNmpf17atKzYvr1qtaa607OcalKl91SvEaduqVq07HYexEiNJ4eSKzGEMFiQQ8iDFdaDpO2Z8XQGeC1DWItCZrWw/gyRZxLPnIX4MEbr0Y9VsUoecrMQ3sWzVKKYksRuhfdLWyliWs0ZS6rYlbaVbsT7FSxfPrz526+UpUevLW0aFKWvutts2Z2fTpS9SjTpUZ2UpXT7bavb2atCYoSaYoT59OldSk8mmJ8ak8alIptn16Ni2l1K0TUKVblbMji6vHa1sNIQ5eMZqJ5aOVIgzUUy0pHqUX330ujbfPus17r77F9irUqRbdDiZiSLYWp9SOQ5lpPRto07rE+zY691ezbZn/XnK8SRHvjlKNxqpQs8hpx2lDSSySbrVbpLH6MWykNIxhVozVmXr3ULY3Ee2blJaHkE9Kw4hzNytCfdFUajtWnbJZHGq0FeAtoQ4TpDF0zEOYrXQ2i6Ht0gmomryCVn0Kd9WKKleZjGcnYaTsjkk7YoWJ2Xq0pap3XzlC+Wsy1KrbQsW2KMSSOxClEeH1GhLXx+MrN1OS0r6d9a6Vmb5mfPvn1qNWtxNPnz+SStSSStC+2Zk011ZDG59epbRs152Qy8frUYWIKKT0atmd6l07K1ZPZo2aE3YkVebtnJ2nWoR6Wvk9mvJrZeRyaxPnevTrXzkiqSe+vVmatidnLqMELAD7AFiEeEiBETUnoWJ91/YmbZaWm69999SjUjtC2jTnOxM1ZyVrXUaNKYsyktSj8hiWdvv7F9mxfZsz6UljlWxG5ySWZy+zKSWWiaO2J8YzMtXiiRRZQgn41B/QqV6FO6Yl4rsQ6jGDyF+C/KxJHY9KTN0DfD6DLB3RiqBkwfwTsLkLMtBxqSeSxlYvrSOIskjchkleTTsvx+vPk3SkFWvX7ezUn0aVt0knzN03NxupC/PkN1i6xbO2JqUqRhUpWYlksNJanPm4Y1pypfEWbm6kloUbqFsmtiJJodx2ZnYnmIks8vDO6Ox2KJHDe+ZhvFMmlbEblKU5fNVLvnz7aE+M4EfBLQElCzACTCTAbIGeESEOTV4nhfghIWIElF0CNh3BehJhBkkN6MURyDuMocxypBSmohx+2L4LUlh9JYpnYkkUKsT3yeEKIchh3KQjSOjCHFMKMIcdg/j07Ow1jOHNm2EyTSCGMYx+XjKNxGi2OSke4hX04WokmI9LSSSwxpxuxEkN7F8eula9WKYix2lGdGP0KtWOyepK149J6cS1KEI8GeAL0CsgAZwfQBxgNUKEJczG49LxLzFmZujsjg8j90vV7pHPiyDnTg9hx0Z90t8btu5ad+lUts1qE5XoStiVpWy3EGNRPMysin0oezMTzktXjVmVjGVqxlKyXlKl1tChJOlbSrzknrW2Z2OWZWfXnxVZh7fL06FtKSw1iHMw4trxVI4cxElIki+P2wk2Z2ESDlEaH0JkBfxNF0BeQnTcIsK87A9TMDFgOcN74RpHGdGRwjwz5JBpl4jSkvB0iqPU5yUiPLW2baN/StrWZWUr1ZNdJK81fM3yOvZsS9m7r152vfQj13dQo3TVSzQvs32JevUksMMilLb741NzM+jL175yxZqRRRoTtKtSoWaU+hO2JS2vXiiI1Capz6FD7patPmIbdevToWasxTkMSQo0IKkN4X4VYDZAroOsF2DRIYYyetXnzs7J5qpO1KFWRX21p9W6avieQwwQlwxh7EsO6tOKYJeNQiR+IlOGM+Ysz61ixzklo0pqDVMRAjcvSiHfEkX04wiLOS0N4zuhrFsXySPyaWnyKcp1rNGzJ5a+JI1Wuo0K91s33SeTWIKklg2QFnBYjcKkhgv2w8hvEs+G0Jsbg7oV4KdSFqSwtwP0EzWkshpRJXvhrLykfnZeXk8R7MTx2vXj3bbG+rZs2x+ndRo20bEpZ593Yn176telOyaP/Fk+tLStCWulZ9Kdto17F11mxS7Z99axYs1aNaz05FO2aNOxTktafKUqkbuktSnXimlfQnK8luo2YQ4GNFdeH0CVi6fGVetdJLN9mT39s5Zuvk9m+zN3Uq1StbGrp9OfYpUKs7Zr3VK1CnZuuoTtS22pN0bbasLUR4K9eE2nUrz77rrM1fNTtWhOUL+pdffUoVr5bq9vxnOysrVoxbK0qdC62xTvk9tmnXqWLFifO05SUq1b761GblaV9ONRfLxTfMwP8cgmJJZi+GsRoFZE9eQy8FKZi2lBk7rEIVihUgtUYO5PEechAmoOchqU4IubjlGDPUloyk0ciDYuiNOXWZFUvoyeUnbN9KKKk10q1axdWmK981SsUqkxXun0Y1Xq1KUSVLE7bNU6U1UnYvsxq6QWbPFEaiNOw3nIgzEZzM5OXT+NxnTkNsHkpE8eiqaj8biDEsDdDWhfCXLw4oR+jRoytGUp2KdmfUvmK0523T+xGcEFThhnwEXSgXnAHbg7g5wEJIJipANUMExGcCajOLJ8CWsRTGcB2jOTWYHqdg8swNs7FEjhzYi+bhvOQlWy8pYm5HNy8foWYsnz6cHSvJohwUrYsiSHs5ECMoSr4rhvDDXiPGMzThvdTi6RWIixPFEjhpEWMLMijsrOR6xXq3S9OtXvqWY/PoykZWweS0XxqBQwU4C0hvAC5B7At4GiAGyZgc74FHfBlqwhWJmM49N07Mcq0bMUySI07HYxiWL68NILsDFhrAg4Ju+V7bateJZFKR6tL3SWPyWxZm6tt9C2tdK2KE3F0rWktttKxUn0q1S66+ZvpdGzbbbYr0LF919tCvNRqhVrS9WvRu618mpTkep07ujfEaFOatmJWvEOMJDGpNI7elFHCPEaDrECGcvI58EpB7BTmYKVeE+pD6K4hSOCCi6F+JoUocQxjGTwyhpO1Ino0IayK3mqdGfQn3Xyk3J7EmpULM++fdWlLrPGralerfXtlp9CtStqWaN1elSsUZ3uvsz5WzL8cs0pJ3SOrLW0L7eVo07pHdKUqFapWpV69tstKT7M+Ztn9C2zYl699tGzWttvp8xYiLw1nx2diSTQxk8OI3JY7bDKEGPRjVi6lO0ZNOztt9mxyslrfbR5S+JYZQc+M4wimJYrrxZPlalSj2aViz215ynGrZaXnbr4vi+6rKSWGkejkerw4kkYRLDeTR2rD6MJW6nWiSrUh1yWnDObkXK0KdWzbPmJutWimDfCHCJbXiSDrA2yKEuEGI0hgpRZH4pjGrBQx+FGTQqQ2oxnOwxlIjx3l4V4PIYxTEkYw5tiehMVqV1GxQsz7adspIrNazfOyeNSOcs9WxOTE7VlOtHo9LXxhffPsx+nWk99StH6s52aFmz9tGrZlb77NKzRsVZFEtSffI4dS9OpUmp2ZpcpYpWZDSsS18pTsS8TwiyCCtfKRJWqWas5RnbNXts8rXoV7Fa6pQrzUvG4qtiiK5qTVL6lvN30JJYr3yeas06k5Qkc+Vl687K0o5WrRTHrasSxPbS+T0pqQdStGp91iUnb6Umo1bM+dtr31pNShUiJF0KcTSWH1tOjK0Lq1KhdLTFOTW0JPN1a9eUszkt3V5eWnISIxi2TSGGcpTsxTEeESjBnguQdIGRKSkmsxdNw2gYkD9wZoZQewxvh5BGzMEhEWFaFWH8NZPGUPomkUVxhDGLZBEGUoUascowu8U2xhfEaPyCxfUkFSxbDijI58gnLZ9KtYqWJ2N0o1W5iTWYmj9GQxFkNWrOzUZTVKS0LNGlE03MTcvIpLIZiDnKySIsiiLXp1pycrSl1ta22nGFmrXkcbi2KbpepGp2hUqTtejXpTsVzUksUbY3GMck87N0rZypPrxTVks+MOrMySBDQMmANMRoASoYYB4gywPMOIRIomYmn1YdRfA/QtwH6I0CZmYDrFkGGPwnxuDLwi0IPKkUQ0lZuEG+D2rNQgWwqwzjUdiyLbE3EKKasQ4ZUZqhESJ4kh7EeblJqIsgg/iBEOIUSx+TSaELr2Iyjdsjh3C/IpaciuxG4kuqxRNxXbSjde7tiSI8DvC1ASECygBwjGASMJUA5QIOJ43HZ8VxPHq8xKxZZmbpehbbdXryk+rFcRI3J4aQhwdZyCrBJynytXs2YzrXysrIK0auhtxjPla9L7NGciHL3ds5FszNWJScnJmTWbrrZSxZo2ZylL90hla1DpWZyZnZaXto3xlffOxfT6FspF0TWOtNXVoO4YZDTkcRYR41JatOWvrR2PQ+loK83HoXYiRNFsDxBShGnI9DK6EGCRiNC/C/HIiUJyRw5nIN0apySM4shBhbhzC7M1JepPlK8+XsV6UYQ9j9eaoW3z77NCP2zUpDe2x168aktizWnxqhOdC2/5SnZttoW22yla66rEkQqET2Y5bfbRnzlOvPrULqkgo2ZPPqz7q1GrLVp9e6jRo3WLM51rqFDoX2bM+pQtn1JazGNKJoykdbhAmITIkhAjGxDmN06dOjfdLS1Kxz60bs20uvbRk0PIa23xbDGHMLF0RbZqGMllIkvqT6k/rV5qT0IfSePT5S2TQ1hxJojSkHGJocUa03Di2tI4nqSlCpPtoVakxdZvlo5df2LHbZqzd0JF0xdAtbM3CxAFCRR6K4umbrMDPDSZl4DNdJYYYlszVWC9GoZTFiMrEpJelSo06EpOzkgr0LZ9KpRs2Kc+Uvr9m6fbfQr159ihX7b77q9C+2/6d0zP6ctOVK9mzfdGq19fnz7bPdZq9mv9S+pdYtjsX2ytmTStm6hPuurUbNLsTchnaUvfHZW+NwbYwugxwI6BmsSGh21ba9aSXX2z77NeMrZ2bvpVqlWnK9WvdWqUbr7brM+rbUnbaPWk1tefdfVsQzo2ySGGjfGrZ2tZl5JN161azfbZr1Kl9ivz76k7WtnOxXsXzE+lPvnz68+6tRutsTtef1bNm2rQrVJPPtumr69WUsUaUXUqVt8bg+gyxAhgi+blInnyGVvqVImmrFiFeQSCTRyS0J8G6RSeU5eanIKOaq2br61eH8isy0Qacno0qlaTWZNYqVak7I6UcrzlarZklmUr3zU5YrV7qFSzXm5iSzHZr3SWrHJ2xMUYylI1IKd0pEeP8pFk3RnYVpWrWjCK5mZiB3WZWXlZWSR6KKMQ4RIonIPpWGUUS1GKZWYmKc7FUzLyGS2JJF98miefJ5yxE1eSylCKK99GDjJp9KBHS11OCdr3VIAC1mhbAxL6VOAGerF8K0OoxjGL4BDyWLYWIO4ujOdgAL1ZJJIP7EW2YAyTUZTkNr5NUgU8lktGJpScqwDNGc1J7MmrTcA43y8+QV+SQBSnZWZh/Wp3wAh1ZmVh/VjdWAAdRttmq83JYA/TEUQzg2RNDGGsAN8WRZRi2XlpaACfDuG0Hcgjd98Ajqd/A5c7XgStivYgg5LO2YTK9acryCIU5Dm2Tzkjl6knguWxhWr17qcIUWxFk8D7dO2aVi3kFtm2O1J9WhJowkc3XqSWfQk01PoUJWtK99K3s9tjtsV6ltG6vd9ifSo17atO6rWqS/Vrzl0tWn0a9CWk05bQuk0knZPdYnz6EkqS0RJJOx6ZjCpGMYyOOQdySYkkHWJpPE0xTk0giqvdLW2JWnI5WNVY9FcVyGfNXyeahCl7E7SumbHHac7TlKd0rTtqz7M1PlKVerStks+jSoVq1GpfVo1qNKfQo2z7HQur0Pvr2b76Vm6fT7+fP6V0tL3z6srfNW9mfddKT7aFKfRp1p2XmLp8+rfXttnLZSzXqUrbEfvnKkkoWJqNwv3xRD6K5aYjdWxXg7r1I3bbWsXz6tWzQvum7r7pmz14ztsSePQ2p0Z22fQ6VexLUOxXr15JOS8tLxqfP60tTrRTDenXimxKcerVJ9CfZqzk11pmfOSeUk9ihN17Z8nnx26369mbk8rYpwyg0QHeNQREOIGmMYDnGcDLBiiihQlYZREgxyGB0sQxhxB7EOJ6sUTUU2JeKK99iO216sHlmYm4ks9exUklKhdTo20aXSoUaU3Kd1OtTqWJTnJa2Id0e43ZnLFK+6jO17asS2b61e+2zdbYpWbrNm+vUp3zNGYiHWjO+fWm58fo3WaNtGhMRJD+M5ipF0liWpVtnaNG6h39K3v7HXq1baspPoV6VWnPl5PdNzlspWnadifJKFtnlLMpXrSl85MW0ZSxKSeXnZHfdEsPYYxqLJWVmo/ORTGc+K5FQqWyW6lNTcrVunZaxJK1i+XoTsVyWPQ0ks1I7FSjRlLMrLU7bqdaxG7Zq+zN1rFK+hVn2K1Gci2DyL7ZDUqz4fxVBNyk3D+C/QkUJEEbH4C+pQF5SgY8RoI+SQTcrBzjOFeK4wvhhnZFDKMI7Vk9iXoxutfdLSsZTE5ViidhWlbPQ7FSZvj0YRLxhNwe3SKpJqMlrTNazIpSVktCS3y1CzPma0pTnzMOqUaoRHtjkrUoQf060mmrETwwQ0i+pNzVmHdaGGtJ4zum5iMJ8xCXJ7Ni6dkcrG5JHoos3RqYimtSkkSyk3XiStKyOVqw+6deZmYmjKGktXk0vVj8nocbrTF1erSmpe+aoTMZ0pyMqfA2QMOBSQrwBjnYACEngACwZYBchHgcIrhEiiJ7pmzE07DatCDI4TboKk1A4xEgMVKAwSkDtWgg5LAboogpwfQzrwfQ9gaZiE+vCBbCVGUJkvCTJYbRVCTFsIsTQVpFCHG4SJWEaTwn0oLkQYH6bgPUPYB1hggD7BJQA3QwwAS+ACRPgEdBAQBkgaIIeDLEkbmKUrL05PTnyaPXSKrdLSWjDKnOy1sWVJW66pMUYosw1pw3i2EfiaHMcpRnbWl5u+2rXm4pqS0vVszMjn0Y/YumK1CQR2hOwyrykfl41Qjlti2fWr223z7FSzHJazRoUqVsT1618foSCvytWYpS9mZjGVlZSYjcLsWRNI5edk0+tGE+GkrI5PKQ1q0r5yMJqbg3we1Y/DGvEkR52H8WQc5aMYMVKIsiqy0LkdieMJPbJ6FmzJYRJBCdIo1CZLRdB9HpPHZLF/fKT77aN11mnKRLWrVa0tZq8vyG226pdSmKkpfKT60t3T7p9mfX6dCrbYtt+++2xZ7bq87ZrzkjnJHbbL3X230br7qV1KhRvlas+TRTSiPzU+ZsT/uvjUavn3TdtKzfDqxSr3y8E9DatAvuMpFF8ileDdKQdzfRts06VPvoTE5EahPsWaNirSutnY9E8tQjOYlJ9mTzc7fbVs0++jI4mmZaORupLySlDmR2I1G7rb+zxJF9OHEmjCdn0Lbq1K6+TW3Ss7IpJKxZ2JNZsV6MYxGimINCvIIX58EFLRq+DLKRhRiixCbLTFWMrEJtmIVmClWhtTpyaESYs04ixLMSenLylmLpJYpS1WxRjkmtus30bZ/Ss3WZ9CvY6Eao1LNCf3Ttt07Sp22brFKtYs3z7PXsSktX77bFv1rNCxP6ti+pQulJ8NJHJ5SL5yTV7FepdXlqdajGrpuGkUyS2OxuGcHKhOV4BdmJutRvvs2e+xd81VoSOTUaFiO9Kcmu2jfSnKF99KvU5uzOzdSzJZS6zI7NnktS+2XlZJXjlsclL5yfRmZ9azRkkarTvZqylWp98in2JLbQr3Xcgm+VkdS6+bpxndJ6leVsUZBPrVJavOTU3XnKlilO3W0aFiVnJNYunwcp8KErBHz4UrMDH6Ungm7puzClYr2xBkcRpPQl7FbrWalt11bvoyefWnKliXkFaV5iQV5iL43Tuvs05FJa1mzMWJScoUKliPULNOM+hZpfZ5q6hYsTNmIvK2I3TpxNNStsrM05uxE9aRVrpylbPqztOPWyGKKtGpzk1Iomkd8lj8KdGjGoriezMV41bf23Ubp8kmI3CtZiiKr75NDBOylirfWvrUL6t11izXryevZqzct3dtaxE3DBYgNlGHtmBR8KcbgDdYiFUgBRsSOagBGiHDuMYAuVJupAR07MSaAhrEtXgHGzFc3AO9aMZqAj74t4Azy1SjASlGIkdgD/20YBCSkX0YAF0tF8agAiTEKlOACbdTqQA68Y2YAdL4eT4AaboTboASpSEqxARNsNqsEFVgZ7ExVmKs+rPlaNivfQnKFjsztWNT6l8NpLORhG5ylUp1Y7J52TRNIoupQ3iDNSaMpLNX2xnZs1LMvMX1brac+YnK1GUna9efRqdCdp9s+6+xfd20K19K6r3VqHPrWLaVa+zfGrrNGrXrdslvrzUvVs2bpWhKdaPSsR61GM4/fWm6k1LRDiDbDKHsURhNVZaL4P52DnOR2bn0YVZuGNsRIaw6h7RiaIUahCiudjKDurCVEtmFuSWKMR4eRTdPnZiQQwSOX5erz6VmZtvm7Nsv29C+U599eUupW3XzFmvRsT+nVsT6FvPvvutq1rZNV607Zqy19CS2Z2Kpy+SwvTktz69tC+2+6hdQkUnup1493yCdjsOO+rSsTlm+xbPoS9mL69C2+zCFXlLFGTxLGV18YTs1VieVsSlt/Vo1J8+RUp8+UqWZ9Ctb1rEdtj8vZsR6drWb6tt8++zUk9GUtjVKnYur0aEmn0+J7FWLozs3cajK2rQvleZqU6MtNz6FOapyOTTUvN3T598ghzE0M5iGkcrTcnnysms2LZ2vToRZFcpfL3yflYfzMzfXqRZLWYcVb5LbPpyaajdafKQ8m4qoVImktGQ2z7E+2rRoVJWt0r6cnrR2zQoV6c73W1bNsrNUracn7FalfO9nsX17bNehWqdi6+fS5WrR611GR3TkZUKMih1I5mTxNfI7a1Wf2ZJMWbMnoQ8oQfUI3DKQxRJpJ0L7qk7dbdHJBfVlqkntnaUvFE3bUialO2OrUjOTSsX0pLM1qVSt0p2vNWanNX1r690pGUaq14ouiShD6lOzczH5HUqTU3Qjt85bNVpSzGpLDK2WoSe2xDKUhrGoznJHUieTytCJpDH5mT1a0coSShzsMoiS0jjk7JJyzYnZyUr0J2hWpV6lSXjObqV7FCzM31+hbdbbdN0KkeiSpLSS++IdtialaNfj07DW+fH59GQS9CnECYhpZmJeVpyOXi2fXr3RyxVlatOhGc3FEhjGtbQn2aVml15eOXV7pqrMcQeG1GVqxdMR+Nx3sU7EpKz7FiajtG2Gc1KxjIK0Mp8X052dtmJJfOVJDIJqIEQJy+R30OzxJO1rFeGsrILYZWItmqvEk+jXlbZDXjCdto33c3Lzk7Uk85MzUW1Z9ejVvktatB3NylavZkXJq99G6LJqB4gnYEzEaAgYYIAAkkgJSRwAFJLACxIYA9XwB1lIAzzEBJ3QEhH4CTvgDTbAGqQQAnyWAl52AArMwAnxJACPRgDRMQKqNQAfUIE3DSA4Qewdw0hnYiehG7EcsSl1OxRr06delxuffbKXUL7F1KvJKdWUo22O+xQtr2KM/pTdmXjk7E8nj0zdLVKUlkkR4pjK2xKSOOxqhbNyOvXk9ahII9fO3XXzU+Yr0qsP4QruO2ZFEtmco3TU+7q8pXqdmvYnzttCvToTttKUn2z7NinfbTsXWK0pVjUtRqQ6kkWTfNxqN2ySNUok61WRx6NRGii6FOOQsQvw2i2GUxB3VhQgmYLMOJFGMjmK0xEWJoYYzg53xnDDKTNWJoPIWJiVpwfwhRGhCg6SsVytmLJunFd8nvlI9YnKtmfOTU5IqFtnlpe6+2WoWJ9Hn0KFitY68UdfkNSp23SlahffbfXmLaleXqww1601GFjnKcbhBtvkUSzsmq/fRsUZ9Cbu5NG5JIbEpUlq10H0F6x161SrKVLFG2S20ufWutv7ZSlElWGsQoPqcciizESSSlaajs7XoX2y1m+6+tUme6XknQusWb7F8+O1L76k+MbF8+xVii6SXTNe6v1onj03Po16XbJJehdSmbpDbXp2YAK1irYsz61/XujtC2QcQ+v2aFvTur9C666ACrNVK8zKxLMwmxqG0dnIezXDuxO14YJNOdmzXmIdRAkNaABzPhNmYxhZh9ViNYmYmkvfKULrNmx2bN9m26xdbbAAxt7u3ujnfbfPn2xLUs2J/221+66xPowAKqdCfDe6PRJGUlgVcK0C6rxbVtpVaVOtbXhQpUoiVbFOUgEhZhrEsGO2hZgr2a01CFVhvE0BPUJeFiBbfZgww0gM10DTbQ4BGW0b41To2Y5TiyPwzl5mPQyiSJLYmjkOo/ZkElnbFafZgBfo3TdCTUKcASsBQQFHdBLcI8DbB7YhdrQr1Ihzsgs1L4iWK1mAm7Ne+IlivYiBXs2ZN33w+t752+vZjPuuv/gEff9mzY7u3pdC6LLqU+PykpPhvSjdOKp8boQAs2yadgNEJEAP0+Wl4ANkEtAKyzA1wYIOVaxfYttn3Ts7YktmcrwE3Wm6sgsTtW6zYvpd/V/iizfxVf2wy7bYAW7++GPDG6HVsNKMH8VwyhIieZhlB3EkrPtq1Lp87Qm5qAQdnqz7aUalrFezbI6U+do9erTqWYC+p1a8Be0YGDBRwAyRjfLwmS0rAW0FFOyGxBKV7qMRK8+2fIpFXg3TcjlJuzZnwA5X23WbNtG/r3Vq99mDd3WbrbrbH99vfADvZvs1rNm2xbfbfbbXhds3W9izPqWa3UrVboAMNtvbd2Z90+2fWr2ZylPr169i++zZs2Z9mzABiuto2bFi++zdX6Vtfs3222LPdZrV7Ft1sAF6xbQ7p9/Pur32LFsNrN/3X2b6V1mhbQowA41+7sWboon2asrTiypBmkkrSgvQ5h7CPbA7wXrMDNWhzWgBguluj2akvdZuuoW3yexPvn21++Nzk7RlZeNwAyWaFaffVqVZ90+zXrXV59spbIrq9m+2nXurVYAGFGzMVJburTFKrWm585D6LpejN3VZaIs++tJaM1YgAtWZLfJak1JoYJ2akkll+Vklit0bNs+J7NKtEtCNy0AN3UumIor2YR7NCKYrpyspBjsVLMtUlZePz6FGNwxlKEAi7rPWus30pSWqXTE++WrWZnr1rFKlRr23W8ACOnQ6FttG6pUnL7PdPod1tt1stbdTl6Vt0Afb6N8/sWLZWzIK9ehdG61GzGfAXcM5aQxXCbB9CJDeEuAFKQTdm66lfK3SlK+csT7rFbqWa9tS3us2LZaAmKtixU5HC/J49Zg2yGFqFKCghTiHBvoQaK8LViDbZoT4VbbrMADyxRoTk/swdLMchLsV7HBxrXT7N1CNQuQpRlUjtKJqFG2OT6EdlJWUk8tLSaVszVGjWs83Rozt8rX6HQtvtu7Z9tti2t1qETVb7PVn0bEepWJeXk0+tKXWJSpZs3WLN999KvbPsW0bFtezYto1o3xyvFVeHNSD62ES+GcvKyndJ5SQ0Ihy0MFmIPEKRcjiWQw3oUom7E/7ZmfZtlKX2KlCvWn04ynxPE0FKldQtuq0bFelN1KsvIokmp8T06Nsanbb7a0/pWJSzRn3Wb+VksTWxLLQ6i+CnQhL4KkYwXLoQacdlqVCKqV8bkMxCvTg6VItnKU7Ek529ixKSt1KxQpXT59m6+jbPttt76NmUvmLZblb6V0+ffZv7M+++zb2323X3Wz77brufddfQs0LE++j0LN1t13P+zY+6OW3z6V9m22+ldfPtoXytSUpd/dZtvs/9izbZttt7bu2222h/333d8++2++2+2zQ5evCRCzAiII+AgoMMGaCtSs0747SlbMzfPm7py6fRmK0+bnz59iHNChNXVuxQ6EmnbMtXvs045bXnwHGBgQgwZLa1t9efVuuvjUrLy13KX3W0LM+jKWafdKT6tmUo07q0+6fZtp0Z90+zXr1unfW7bNHs9tafZrdjtr23Ua9LsdiamK8nnJaRVLqlGffQ6tahZvoWL41Yqylm6lZtpUa1KtdfZm45Uk1GtRn2LM+rbRusW159mlQtpz7ejX+zTuqSlaar1afLXylGxKTs5KSenW6NSO0JHPmpmpSu6U+an0p8pYnL7NOfMT5NDWApIHCBZwCZqV+z047F1OKaErdFtGTQ1l6FGzZo2bqtGhZsTsjl7o5DGzGdOVoWJWffDXjG+R0alenKUpuQzUS2ZfqXUZ8+zI6NeTV52jNXStG66Xm60ZSSIkSUKda6RyWRT5NbQp1ZytXjCrYnYZUqHWulrqtmdii6Wm5y2nEetTsUZWRS0zLStGI81IJPHrERadGpfGcxIaEmimrHJqfO0qsn7bE1MTMrG5SRT4ktr206NmRTsbrTVSTVZupPn0p2fG7NShXsWJyzNVb+lz+f3VrbN1i2zQozctGdefJZNRtsUrNDqRuTU6kYylClWnL6NeUglYE1BRwBYgwxXAd4OlSMYxrTlSrTq9CjNTMelqktKTlsZ2eQXzFaN8goc7dI49wvwWI9YjGDHAtIB5gfYSoT5eUjcmqR2Q9SjQnLbMmuklmxU7rNsK8DjXun21Yrh9dGMhp14XYJOajUYSShJZWrWsxu+bvimzKXRPCHDWn16FmdsW0pPYr3V+zM3SbrXSl8aoTF8VUJFZupWI1J7Enn316laXlYjy9StYvn2IgTs7ZvsxRMW15eKLaNeJutfFdvZjVi62nyliS30LMX16N0PbFGfF1eSyla/oUru+Yts3T76F11teJ+M4ohZpRHl+fGpWtKSkkks1Qq2KM5ToyevPlpPKTstOUZFQgxQiwvRLGpqxD7uusVoqn0r598rM0KvE8pQnwyjlsvRrRqViLbG6UFBOw3loNtsXcLVGtfC7Sq8P749fMwKuP8xYksEFAh4iwVIfQ8hghvNS83KWKNm2xbYtvo2LNmUv75bts0ra99G/sz+6+6+/u7r7r/u77aF9ihKT+fTpd1Knddbz6PPszs+NXSl1CWgn7bNsFOhXsX3Xz7aFmtX60+tfXr1bNihY7N9tvbfdbfP7777b/u7uf2Z8FqG0HSD+BQxXB1g7gH+xBirQM1sJ1mSVZynfQnbZqSUZmrPqzk7VkMxPnzVmNWIklK90+62tRjchkETTsG+M4LEEbBGyCCKgrwXYMUEfAEDKztOpfZo3xlRn3RNQks3E0niexTsT+WuvqSnPr22KF99jvoT61t9mYvuup2Lr77e/vv6N93Wn2bF1m2jPto39m++6+tZtszV8+fWu7Na662zbZr2adCc59Tur07b7uzfbQ52vdPn2av21bNC26fdUutpV61f61ns0O+xd33VbNvWrSltK++pbRn9CvWoTleVuneXnZaZl699ijLWx2EO6IEOIskUWQrwLKDBC1JIOEJUFBdbUpytG2vPlJytbfZts0bavRs160doxqbm4xnY/fL8pTtqV5W+WsUb+ZtrSljpU6de2zL2eckffL1761aQ85EtKrVqTcvFcgnLrE+KrMrRvna8zRkkmlZeakNsT3UOrQpX1I1fJLbbZmd412ZmPykmuozda6Wjd8xM1rp2UlZeQ0I7PnLF/VnedtlY5EOV591tW+nZoyen1qE5Ziicq0a0xR7M+hVj/Utvn9SfQts3c5dbYtoXXX3Weh0JexTjdipKylOrVpUq8giPJIll7baEtz58DlZgKqDyBTweQfxfLVoHOSQ/lIe9aWkFC2YnznYs2LbFa+vbU6XRoyttizbYn145SiHUhzJonpQH+GcBa1oCDhhgtwboRYV4Mcinz7bZLfRqzdGrQnbNaTxjfDSvTtoVrZ8pYmro1ZiHdECfK21qnUn0KF9G3vsVYjwMtm6Ty0YT5DI5u2QXTklsVbe+fb3W/dPusUJJJra8itrUbqttSvZnZ9afKV7rqVti7vn23y81TiTtvur3SaVkHGXIbEY0Ih0YX58LNWFajDBJIwvsVJS+JpNFEtLz76VXrW2LbFm6xbfbfP599i+QxjTsQ1h/Ts3TtWJo5Gc+jf98kvkN183NUrE5DiIsDNBqgvwYKVGfUuvn21qUvWiSxDKSQ5nYQJ8KE1BZrwVZiD66EC+D6YhrXhNnYS4nhxZg+ow1nYZSnHqkryKvQ5NGufPn3TUMYDXCtAMkbgMMJ8HcvHZilbSs0J90+6zdb2O+7oX23dm37qF8/n3c+3vt+f2223W9CzbbdWnz7b6F8/uttvv++zdxJdYoSl9m6/p9i37rN1izZvv77/n2P7/7rb7b7ehV77b7rZ/bbPvn2ZSrBhg5QJOCRgImEWCFgMsRbMir99ixHp8fsy0eoUIuhjYuqyeTxlZm68xdWpVZ81Lw5upVYtulpmhI4dxFm4tgaYBRRBh/Bqg/hZiDA2QjxDoc+6zbXtvvumK8WylmOVJeVoySUr05/3V5SfPo9t0+2dry9mrPs23W91ttShXu7rrqF/P+dtodtDoXT7N9K6vL3ytOjdKz+Wr2K/f2ezYq316t9CzQs16M+6Vs2bbM+/voz7FCpbRr0KlmfVm6c3dPs22KF1Sffbd159CfbWr06tD587PnZPLWJS6pGraFKnPvq0JPTtoTM3QvmLMpZ6VmdlZ2PVYoh5A/QXoJ2MIBS04F7EDpXxuRztaaqTVC+z1ZSzdbOXX3Wy05dL3wxhnBJX07Eknye2U43fOWaF91OYqTNe6UieZj01JLE+vIr5BP5DfVrVoZUYsrSOXtqxPLRfWing8n3XSK+pSjtiYozFmDyQUJDJqXOzFsdrUp2clJW226IdCYr1Y1NTcUzndKzUtRpXxnNVJqfUi+XiiaujUlmo7WsU6NKboxNMy9DksvHoaxyarW8joyWOw2nbFObsyGzYvs2Yrj8rTpWz68+vffOxNIrF19ij3T7Ni6vL3zsXT4ksStecpz5mjdX41DmLJidoT47I5eWk8rAfIwsQHWDjUjCI1Gaj1GdjUdn0L7q11OhK90mp0bE+Xvn0ZifYladtixSq3TMSSOOR6QWJNFkOpSSQiQbYB6gWkCFgcJiGclryPmqEhvjGbs1rMrXpVaNCRStGlX60tYpy9iYj8miapWsTkr0bPOV60+hfZtmO6+ndfdRvsV6M+662zSlqNSvYrykTzN0vDqGMtYiP17a83Zk05bL1YkhtTkEikl0rCdUmIfxEqVrNKZox22dmp9ip990krWLNtm+fIbvs3UJ8ltu777exbb1aNtmjPs31r5SUhjXmbofT4qiiViPAUsHGVviFWry8/oS8+zJqd9SfJZe2E+hCRE0EdHYSI1AqIGuC1B/ZiWCUgmpaQx2Lpbs3wexTALkahfl5S2C1Rl5W622hCBRlLomnz6V1KlQjlKXpzVerN2brN8ZTdjr2J8ej0BPwBCVYQasfhPgHWnLcGidjGM4BviJIIzg/lpFEWAzyCIElg/sRhXhvYjG+JOcsy9mtfTs1bN19vPsfPuvvs338t0OvbPtl7qNHoyttKlLdClMz6N0lrVItgB+jdDgB6g10L4GuHVCzYv7Fm+6+rWurTle2tOVr607ZmbPybjl8DNfE1sKfDO2BOzMM4lg5Q4g7j0BHQ4iaJJaPStmA/dWtBcnyleKa1ixDeXo176snuozcjvnZyxdYs2JiboxyfEWpQsXSGYnbE3LcBbREgWME5A7Q9l4nguRXA2wZoJuCdl4GPA2wT0EtI4IizETq0aNabjVOtDWKJaM6c++dmKVtWjQp9OpYtt619O2fZp2320aU+zb9vXrULb591vbbPtsWLbufWrX2ylavdU7fs1rrvs3/Y+666zZsX9ev17bbp/fbTvvo17NvXsz7NChX/rWe+lKVK99t99GVoUuhfVv7759i+zbKXT7Fa6vfbUrW33diNS1s5Ny8+xE8xRumZ26PQl2IDhA6wgwFvAvIiRhCVCVDyH0WQjxZQlaF0vPrdtiNU5WpN3dKUvqT6N8csTcNp9mt330I3fVr2LF1mfZqWJ2fPuq9OvO3WKsjsXTlGnXu7Fi+vRr3cpUk1iVjs7IqktbQq2yGzElaMrHK0b5ynJpHEe+cozN81fIKEzL1bZuTSefWkU1HJWpSqU6sntpxynO07MciaPw0lrF9O2zffLSkas1o9M1Ja6hRsT/oz7EnoWadiWlKkmlZPQj8cpWZyzRoy1CRV5ehSs2aV/dKX17qVmfdfX6E+UlZzl6XKXUK/Zs1pirK0q9DrQ5la87BwtlIRIlnLEtAz2KsrxNK0pFUtlO2+fdffSn2ejPrWKd9ivO0qNWlYoV7pFbY4T6MtKQrRvrQBZmp2pBMUoug0QIyLoOkQYDDJYOM+xXhXpQxoz75N32Jql1asbna0rRtvoVK/EKXh5OXRFkUSyOajOVjKzUsX2ZqUsc++VupSaJaN9OxX6tChP7effdbdbYnKFs3YsWZvmrE+jRq93ZlJDRod1vbZk8MoxnJq2SV+tSrTFGVsx++KOJKUvZmJ8xylC2f8++6++hZsW1ex91v3W9/fbZo3xqfRoUqtCxPiSzYq0akgqSsR5eL61OTSKJrMZWJazKwCzAWkCPhEg9thVgFi6++tfZtrWaEmjcajOD6MoRaEItSEnhInIQZSJIkl+X4b1IYx6Wpy10zQmpirSsUasxJpqlNxJKxuS0KNC2ahnKTkrWp2Yoh7A8SGAcYU4EpHoDxB/BZimPxRL3yk+lPu++3n38+2+6hZvtvttv+2237bN1tG+hbRtoT59Whz7bre+hOT6P9mfHruh32Le2jbb33W3W3W3/fddbff33W/bbd3W/b8/n2Y9F8DbC7ANkFFAGqD2BNy8DLCLGN8hiFK2JmblZSWlb58rVtrSe+cpyWYsTU7KRLIZa6jUpxqIUHWpYk8UTUvGErQjUpCzKxdUgNEAlIgQuQT8IEQIaQyl5aCtCLKwL2A7QdzHb2J87SklepIJmhMRyJaNC+fSoT6NGffTs177rpWvK0Z/fdfbdfbQod1GzZr299efVtr1bFGtPr2KltipdSod87Qs3XUKF0tdWp0bqNtWhKz59e+l0LatWfdbbUq21ZSrW6Fmh2Ji7pS07G7E1KUelVqWa9LpULaVebo1Za2jQoW0La9Gboc7Sq0bZynLTkpZoys5H7MmoSWlQmZLLQxqSOYmo7TpX32w4gmYJGrD6BcQNEOYIKH8DhCVHZSLKtO+VoXXVpuWmJy6dvm6U3Tk9S2xRqQ0gabr7MnsRlEsMaNmWk1aM7MxWsT60tJ6srQtoyaOSCzXuulpJQm5ypdYlKs+vX5yKasxZhjJrMTRqNR2N15HYk1tC+M4yrRjK2JWxIZLFsTz5JOQ3iJVkEljOdk1enHormZPXvktiKqFexJaN0+culpDZnKNWblbrMpLUrNS6xZpW1Z2SWZuJ5WUkV1taKZv59sZ06VWxTlI1RqxXSlqXPiWNVaFGfPn3316FK7vs3V68xQsVZqWvl77pSxbXoXzlThjC9G4cRnVkkho168SzVSrRm7N8xEK+pFt8zQoz5qOW9Hr2168nu69exOctWrTt1ilVn9ealK8mqyK6IsVRZMQ2rW0JFLTExMQNMDCgIeCggN8KESQ0qz61SXsyelOWK1ijXlLM5HqMY305HbYul5NUiSanyCXj05GqUdr3UZm2XnZ/fRlrFC6Zr2bpSzYvmLasbnzd1ehSsxyjKVoc0qc1ddPrTk+ST6MctnYZV4gVpHRma8ivh/1O+6lL217Y3U747fbfHb7eP32L5i66vTuoV/t599t/bZuuoX2e+hfQo30Y3Ri+ZgyQ3k1KVmbMKcUxTDKQVaFCzJLE1MRHnJSldQiJEkDZFkGuJIE9Bggio1AjJaB+oQwXQGqADTbXmozn3W2IsiWFSlCHK0LoO6ErQhlYtujc+UoU6NmhJp9LiNQjd8Lcmp3Q9pSWtDBWnOIFKb45BG1og16sUxJxRGVOZmp2UgcZPBosQJediNDKAeYvoRDgGCLobxFguQ+hzUhtXjckma9KvRr22Le7tvttutn3z7brM+2+2jbbdPuto0ad11ClP7paxddb2J8FBZiShQl4N91m+N3Wb+ffZvtrz68+xfWn1bNahVs16d1m2G0xESZge4qhdnIE/FcHCDuAk4Po5PgRs3BerQXq8FyrdZpyabr2Y1QtrcxYjdWhKXSlta+Ul68ZUZqaj8vGMliSbjOPTsT2ZrsUYot6UZylitBR3QdYRI1Oz4qhlKwVYcwK+BrlYE9A/QdYFhDWCdhKrW3WOxPk9aWpRDviubs1I9OWytKxSoSlWU6FaYqz6XfbfbfPus0rraNs+xTrW3WbrNvSr17N1m+fd9m+6zYsWb77aNSjZn9ti3vttuts8+tPv7bZ9i2+2zU7baFXts0aN99991CvXunbFt8pf9S6UsUK8+fJ6ErbSnbaNt9fts39ehPoXVKV1S2jRoWbrFazHKchnbE+ZnK8+pPgwWwFBAR0DzCpKxfBhmZJFEclo/DKYo07NSzG5mVoXz5mrGq1SjUpW91mYsxjQo2JNPlK1SvWpV59eY52+22YsT43MWJ2nE1nvlOTyazJ6PWr2K1m6t0upKwyn8rGqfLyPrXxTGMmlpyfSnZNUmobRfGdGrGcR7Mlk0lrztaI9SZksY3diTR+xPryk1MylezMylmVmro/D2ZmI3fFVGQS0jurRyXpS9tinQ+WsVp9C2T3WKM1Yo0ZaM6PfHo1fbfG6Fm26ScausX2adCtd1Y/N0pezZpX1ruM4yo1ZqhPnLM5L3W2KMSSkdm433crRn8rJYmum5ypdGqUioV7ro10aF0ksUL60pWvo2bNXnY7dWpyS2+pRoTUkusSt9e+O0Y/bUrR2Vl7afDO+DpMQDhKwLaOQBWhWgboWIUIOMDpXk8+N2Ixs2LoxoU6sjiWWqSO6a6ts7wznwR05GUak0cpTlCdo21bEvYiu6nKWJixbbYo2LMr16VvZtutvn2O22+dlJu6S3zVs1Ym5aQxdJJFYjVKOT7bN91n+hYr0bp9e6+hPn3z+fdPn0OjfQoW391tif913bfP7be6+tZvvvn2KN8bkEJcXwQ0PoLkFeIsHKjwM0G2Nw1q1JufI4zr1JJPr3y8khEh9BATUCYqQDNLQV74pumaFSUsSW7lKFC/nz6MUysxQo0a0+pbJakknzU7VmIi0Ij3RbQiDZi2zEK2FK+Szc5RjGvUksjukE1MyaOVpePT7NiVkUGyvO043VjOJKFspIYujtKGkEtAbIIyBHxBgTkbghoaQZKUFSjB7FUS0I1SlZ9G6hPuu+++26++/7NC2623tvttutu7rrbNt99ifddbd2YpoVqHbZt7Za6/7uhbP59nn317r7Z9C+jbRrylSGUYQNkRYEHCrAo4bwDZTgO8JMSQY53pyCKalCNXzcrfK2bpri+KJWO320K0rbWox6pJ7ErIoqs2ZPH75HJqUXwuTUFKLoXa9vIY7DKrOS0RLoohxD+BBxbB3Di+zLTkxQjcP68Q5LHoIOBWwOkELK1raN9Wb4zlYtlqcYxJWj0imYmpSCN0bNGN0KFKfSoVutb0KHTs2bqtHtto1ufRryltGlKVJSzbRoWLp9axfbbSrTl9m+2zbPs0ZevNVrNmfdOU76srZnKM+2jfZp90+tbRo3W1br5u2vWp0a1OjWlZ2+fOdfpzdC+2lS7q81TnbErP6tKlYpT7FCSzltaXrWZizG6U1MznQmo7Ox6Uk8r2ztezbRrz4DtBsgPVOpA2wLuEKLYXLEnn3xu2t8noWzljjVOpH5HXqS1KxSrXVLE5Vo3UK9eJqk1JaE+IteauvlJWdiBG7FmMKt0ihhuiWrOzVGpKzdKahlWumpWrXsye2drxFo0q9OhEsniads07YiRqTyWDuNT4aTUvF0RYWrpDLw+l6cZSWH0noRqH8ekkmjUZS0giardOyk1IL5NKy11KWpXQwxRLxyKYlkktJqNGlDHk0N4/YsT6t9jjG62ldWkMdjlslmL59mnNTET0bNGzKTs+6jNxqLLbNCvKSeV+UjCJ5yRyk++66hUiuVlZHDenZk8nm52zUl69szKULaFs1fQlYjXw/rxlYl52Vs2bY3Oy1O2hLVKUZx2vEStPqWK81KzlsdjlehZn321ZFEOdj8anaMvHIzlJajN0ZWxJp9CM5JE8Qo3EORQ+hxBZgxwL2AMEQoBvgbYqulqM5LRlbGNmTSOlfJYQqM7zNaX68YUZuvF03Yna0rWkkjlL6FC+Vr1rNOz3T6F91Sh2aF9CWp169mPykTR26nB9B7IaVmhTqzU3C5JqlGnMxZDaPQ9rRFhEhlCXJOIUQp2Q30pipZq14KlevbRs9s1bZvsX28Dlf8duo3xF5fodK+A70piYj9KKYlsy0bjcnlaUSwPNSS14wowcpJCLViDEsSQwQLqCggHySTFOEGZgs0IF3HoT4QIR4TYRIGuAKMryGOyszRgN1OndB14FfAJKOVYcV4FndY4zj0CdloHPna8mvo0JmfYrQl33da2fbAtqVOfO3T6EM77r6/QqwSNK+rJOcoQCthRgKOChg022xuA3wH+B4sQGKzUk0Cxr2KlijSjsBIxzvq3yOxC/NzUPZJ3zcBBxnD6xJZqI8Posm52TxnJ4tsQKOrO32OfdWttt+xfAmrq8+N06N0xQp2x6YiS6BA2yPguQLGATUWRVGoAOUHKDZwNc5APd8vfM/fEPp3ULNOYgDfKysMY/MxuzEHjcVRh06cBASl1mxQs2wWK99G+hUswGbq16191WC/HJmVvlL7bEesSWzWnLMUxlZpzdKzOX1JqOz5ynZnLY/ZlLEpdKUa9a+jzlKFKDfC3AXVCjwJeG0DNB7BViDByg9gV0FmG0G6FGrCnClA9wowaqsExbJJSB6sU41C/O2ZeGskk8+jOV76tWcvq0LM7FXPq2bq9GVtsWK9W+2P2bZ2vbfPn2bFn7a0an2a9WzfPusWbFtChZl6nPvqWbNtGjfbZr3S1vYt77a9i+6+lfZpz69izWsV7E/tuq20JWjYqWJ9G+T23W0re2JKlfvs0qNafXk9ml3xNSvpdnoT7N87Yr2b4aUZ8++xPsRB69mC5Pjd8DTAY4IiBQ1ICpi+GMAH8L0LMI10JkDjDunO2K8O7rqEktsTlefPrUpyrQr1bq9ezdP5PK9vdZsWZ/Sjs5GqNGhZs1a0j7PVunzsgqV7E+6vRia2+zP7M+lXusy1tavfJ52hOxqtGcZRBh7F83Awp2FS2DnDDGUQo9L2Y5Gr5qtBNyGzIa0avjcXRLGr4ZV5DZksiiiOxTE0MoZQtSGLYWIZRZEktFk+xQoz5LGdKJ7ZSjZvsxq6xTlrr61t9vdKUqsSTNmb7pSxdbfStk1iSxu6tK3W22K9OWsW2znKRRSo2Lbp/0qMtbPk8xTlKtCVpdt03I761CzFXYpUraEblKt1CjbRla1t3KTVmhbPoVqcrz+zZqT77Nm2tXts0741Es70ati+vGVvPvs1pyAJ9K2U63WgW1SM4OtKaow0gI+ckU5Bxg4QqQowOkG6HtaFjhflYK18mvg217aMDlWlKMW1Jejzk+T31bNK2dvl5q6rXq23X8pY6dC2lJ5adkltHs3WZ9vfPr1LYjykY1ZupQsxJNR2SwzhzVvi+H9itfdf99t9tinddTsW2LNW++asd919f69m+z2ezbbbbQtocTyaUlIojOEa6DJGUENJIHqKYP4qieO9sghOm5ND2EuCjrwUUDvbIJHTjVSjJ47KQlSCCIhcgiYUYEDAaY7L04b15PWhzZkXfKWJWaq0Z9S2zdbdPq1pLTtkUrdTlKtSvTnL63Y7Fa22++2Us176NbklexXkV0YVJPYm5zk0rEvVqS0RYW5qaszc+alIzocUQeR6HEfjkeny1sdnwxm4K8E7CFKQiwvwCzBygCdEGAXasENDiBqmIKcchFj8M6cdlpi2X5S2X5a2VtlbaU+hQn8+623s29tmhz7FCLKdSlXn1qN1GUlLEvxu+Z43Vh3J4RasF+I0ENEaAX4U4FLLwDlHIBpj0B2hAhPqRVHIsmZiXrWbaUpIY115WWhahnXl5aQTk7ZpzNK+xUqWal8vWm5ebnYyg+nZHEKSXS03Tm7FSTzNmEKJpylKxqnYlYyiST2xXGcekkntkdGboWxJN28rByr2yOJ58+jTgRsC5gswOcp0Z9SpTpTstGV8Xz45Tl6NCcnL6cRpm6XlJaNTttOS3ULNajK1qN9SjR5TtrdixTo0OjO0rbZS6tXoV7N9m2pXpWbNt1WtfSs0bNmhfRoVqU++fZrXUqlGzPlbZ2jP6NaxPpT69jn1aHfPsWKFKhWnZW6M6VafXvjc+rdRoX1aNCIkaj9C6tbPkUary8+T0KFaZsS9GcjkmkU+nKySXpTkzILNaVm60DnAVkvWksEfA8QbIRYmhYgg4NkDFtnbZWfJpaLadC6Urx2nL2atOds205FZszdiv1pa6fKyapSoyCxOxnCxJqFCdul5uJKkMF9G+Lp8fkUVzE7RktaJJeRR+tFU3dX4q4gXUK0zZoRjG4/EaUoUoXpPCZJojUpitTvoykEtDaD+tDufEe6OQw2YfQiyCFGFqlEWjEk7FkhhzNSadjcbvoxJN0KM7DahDOzE0tIJiZnJDKxVHYnoxqfWn0puhJJJPtsTN8+26tJJelYqzErSo21e6hKx2LqkVz6skknz61mf9m6LKEUQjz7rq99W62tfZlJ2PzF9OvSn2KP2a07XunZ9KfSm+ciqdszNKNR+jVumKlSrG5SjYqy1aUmbZJKS/Wlokrzc1bOxjYrx+rMyCOxqfUo2JSzPpStLlJ9WWjs+KKMPZSKI1C/BcrwlQ4iqxFMPIIWBhQEJBsgOMBjl5a2dlL7++nzczUmJmOWYnkk3HJezL2zkQo5fJ6FaVm6k7ddbfYv7aPPtr07ZyXuqW17ZihMz5ng8oxqM5iNWKEivk8vVi6nDGGs1C/KTlOEGdjClEO2rdffMX17a9evbZsT69i2jbYoXV7NLt43PnZWESVjKNwNls5bAaI3F0rAeZiU4DFRivhCmossRJRiFNw/k9iFWDnUj85BRw/goqEH9KIstBDRZAvoS4AvQhwhUoDrSgbL5W+al6VCblJW2VnytsmgB8tk8miTtv5yOR6VjC+zZkFKvSsxJbJJHW6EmoV7ZLffQkde2tGdtfnJ91sirW1oi2x6QTc1BOQFzVulKEZwBag4901WnxuWrz5fpUpW2hfJ6kdjcTySI9eG1iTUoHSzBziaAJtaFihAQc5EShAFaWhlD+BQyalIoBljla2BJWJ8ngQliVsQGqIUdm4H2PStaB7iWxTgcYcTfA3cpdA1wLqCfhpBVimBcwtQQlKVm4ElSjCXgUVetTgCrEk5MwEZTvpwDtfFHAgp8NqsD5Ziy+GNiKJ8bvtuvqyt9atUpzs7JI1ZmufEsz05i+jSqzd/dRpRqxO1p8jnzd9aRRNL1pyzJLac52LMcpy9KZlOzG77F1e2hByrw9jcrJp8rFdKD+lTmpabh5XhdhDswR8ngS9WEWFWKIVYQ7ovnJWWvs290+jOzESxnxPQksjjVeSUZmpPlpSrKWJ91teh9mlQk9CXvl7FCfbYpckvo1qHPs/f2K191WWqztt1G6TdG+jbK16VahbWoT69K2lPnb6V9KtbfTrdCT07b5a+Vr2L768/n0LZyzKVb6VP76kzPoWKFejYkNKZo215etNy8cula0+vz45UutoVrNeXpzd3yvGrozhlA+QoQDZAg4McGmBWQowM0QYMcPYC9jcZQZrM7OWKVGlRupVK1iUnb5etVn2zsxYuoz699CzbKV59i2ck9CfGHYuqT6PQrVKd03Yvs0J2lIJWzMT52tMUa9ezZm+6nVtnLrrNt8vHLa8vfHYjRhLQo23SCFSDfBziiDnF0pH4UbFC+TRRJomsSOatvmZivNRnE87D6jC/DmvPkUHcgk8WQqVK0zMxubjc7GpWSSSVs052pZnL5yItSlRsXz6FmvfQr2KNGfZk907Ynz6VSz143J7Ynks+SWL6lsbrz5Tk9iUsS9/Psz+xYtn2zU+jTun1pyYrzdiYu6N1WjN0aNGtxujUt5a6lbGVtGGM7ZpzEllpqfRoS01UmOdnK05WsW21paJb5HToUa9i6Utqz75mzPur0K9K2fOxfLRLLQ/k0M7EpE0eqyapA8yKDdNQEfLwqQwQH6DlA3QTt0RI9SlKt19C+h0+6PRqjToySIcpSt+lNVJu2vRk1aduun2KNbvvtsXW23dteh1bNOdul68pGpmQTEpSnbZm6SUavfZn29GvbKW3T7NXsW32bNs/n0pibo20OhbT5W2XsxVI4TZuB6iDAdJaA2QygdroGqORXFMNo/Ek+JIpkUpUksvCnCdDiMaULEeswb4bSsKkXQzk0eh7CLF0EHCpAPk7Begb5SjQq28pbRnZTvvutoWJe6NztmxdO2b/s8mnZFRi+fIJuSzt8nmqMlvvq/YnzUt30rFejJLFSaqc1Ym6c1fOSkQIRYI2SxPB5ZtsWxnDDfKW0L5iajOvJ6fGqV0tfVrT4W5DbPlakbul6dC+MoU5SzTqxTYl5iGkmggYN0CLpQDDEKAY4ewDlLwDpGEA93QEPJYArT4B0hGgCfEsCcjKBIy8CYh/AMdWBBQtwI6UgRN8B7swXYGPAE6K6M3AlZPAoZNAk4zgICNQKCGUCWrwIenBDxyB8hDgpxLB7E8O74plKVWhSnyWrfy0lqXSaTU5FPjGxNRNIqEeunxXZm5SdmIqlpafNT7qMxXupRudiFSk1GOVIiw7iJPiWQw7l4eTUL0nhnOwM07JZLSmbo9MVatKYlJqfHrF9izPnJSlYtjUR4aRqJ4adOaq1rMvOTE7AmYJ6C3A9RulbdXj8kknKyerXm5upK305S6Od10R49ZmaUv059CblbaUvPoUvrylKfZpTtOYpX0JqffdbK1p9KhPpWKd1Gn332fo0rNt9Kzyl3KT5FR6VvbTtp1baFGaoc+76c+lfYsSlefV5ipOT6dGVqS9iR06lGvZiarXlpWnfN0+IkSRuNS8+V4vmbpntj11iJq8aqUKklp2LFCtTqSvDiHsEBANFiNR2DRDSJYqg2QVIcxPDKAtocxhWttszt19OUsULpazSoV6EalJFLWKMcrUZJGVmldOS190hn1qUpTimvbPmKNecqxqW6ltWYnbEzEsml4Q6VWrXrd0+zH768rI6knl43QkcehrzcgmKFGM7rMZQqQ9uujCDhGEWxlZjGDZCFMQfUJSEihOxfChEWNVZNIqUtBwhOsy8vdTo0roYZNESzCRdAx76PbXienJrNmrDWfTj8+UvhlFFs+jZtmLbrFGxZo0r6NCIM+WqTlCr215PNxnMTFGOR6Hk1EW2hPvuupVaFGnLWbM+fQjlaSULMfmZ85KWas3YjXUtk1CM5ePU5FWk1WfLV6FC2d6E3FMlhRoyWOS0ZQvTvQvm4nrW16MntuvoyvMx6KJBFdSfQm6VKSxqrSuiiSTdOMrp85UpQ1lobzNCOxbH4PImhtd3xdOTMMFeGUK0FmAVsAV4vgUUArwmwgUpaIlmRTk5bXpWL52Vq1qFiXsXyk7R59mpXoWbF3Xtoyt19m6rfLR6hXr2LpWPxq+OQ2hpQupz5mlRm7E1J7FtsTw1l4g052C7CBAdZNBwi+LbEEFRii2hJa0+Az1Z2KJqzGpSA6X3UbZS2xAhb58ajGfL2wC3GqUZQ1rSOM4H+hMRqG98jsRXdJYug/l4GqWgtyWzNQrzlOIECMmZL1YGyG0MoAQoKsOo3FdiVugfqVtGDLQp3W20a8zTpS0rTl75JWgjIBO15uDyGl3fdECYgRUTRJYqz4WLHKykzYrwTt81WhjRmp2BW2zd8VVpBEaAnZNOTsas1qkAP8RpFNTM3YowautEWBbXSlsKMBGQKK6AJi/qXXWLZ9i+6vWqTc5ZpdG2vYsRqSRAg8m+Ygz2aU3BDWa9GL6tvAM83ffIpBSnwKadtnzUcoysAIEU0o1OxNMVIAt8pZoTUak8A70KFiAwxHhThlAi4axDhfgjrYP4ugUM5X58pK14ExYr8TV75DAd58mloop041A2y8IkBZQPctGVaU69elfWsW17PJ6tGfGrrb7M7Uvs1Z8+zI43K2Z8+fPkNaYpzFaTT7aNOUrVZFdX4olpnmpW+Wq3TdDuq17MJMHCDpEWCgrQfRZA9QVYTImhzMXRFgwQdw1hbhrKQmxdAoLEXUIg2YVIU4MEKcHOpA/WIWpWal5ixN8zbHK0+OxdWrUYdySpZvjdGpDK62dn2LMxFl85XlZ91mJLNtezffdE99s7ZsXVYmvq20KtGxL2at1t9mvLS11Wlbz5a+zXt7rZjtu6FtSXnattX7MvStoVL77ZfsTU+tWnzFCYn1bbbMcp16svfdRiWjbIL7FstE0vLzU/rcfpVbbNTl5SzXsyl1taCnbRvgVsSQJuAXoGaCKkEB8l6sDRAyYaxEh7JIIWHsXS8RYQ4HmEKCXq32KPXvlOr31rrqNW+hX77NClbN20KE+6vZr3ULFi6jWn15yjGpi+vSvlKF85Zny1Gc5a+O0aFCQWy83Qs0qVOdn331bF8hkkdqTchiFByg4wryORxJD+QwStiT0JFL3xJBOX06k1OyKGUElUiiYiBE8tMwt2xLOwiTMOq9mYiJGFaG8FSFChI5HZiJFlC6fG5SnZur2y9SYpzNirWuq8csXzUY0Lrr61etLz58pVnLrqMpKUq810rNGYjl9i2zV7brEvWmo3PqfOS8zfQpULZacrzd0+/r1p9KVry9eU6kxStv7p9CfQk9srRs9OcqVK9OxWsTscpTcXV6M7G6lfodenVs1KUSSGSSevJu6pPtk9G+2rJrMxKxqRQ2iuzWkNWP2ySMouktCK4BxqyC6CViiI0GyBTzMGyDlAa4VZHEGHl0L1eC7Pkd8luiNZm75LGpLfIaM1YtuozkzfMU6cxVt68+6+66+626tPtutvoWI1XiShOxNUj8pE9iXvmYqqztGtPvgeJNAZa8EHJ4BXnYDjMQGqWgNNeCBpQG6H8EDQgPlWCDjcByqQP10D1GoL0SwewzpUZiMIplpHE8ioRGiSCjg4TsRYZTsM4iRLFEiieBkRCnYyhQkcJ0OqUMYtjCPzED/BFwJ6DXAOcJsDrAi69sXSsZRyLZBGMhqTtecs216VWtUkF998+ST+IFtCzRs22b61KjJac+jPlrMvTm5mdk1iOTUYy0enbZPG5DNxhQg2QeQLeJoCmimATMpAJaNQFJCpBGRdDDD++jGNOIcKlex2wTMDNSjVtaUnI7Puj11mcrWzcpWk0S1Iy5BL1peVjCC5BPUoWpiSys7GfLT5LLVK9etQukdGIUzK8amK1smrRqrE8ftm4qpQs32ykrE8WxVGEzQhjJOUjVefdGq8do0bMeumJiZn81Gqttt9CL4YwrTk5UieHsEPEKAWY7AdYEtZnJ9br31qcllY5OTExdLWyWTz5uhQ7ufXoTk7NUpyJJWT0ZWTxXKy0zH4niNHoPat0cr8QJaDHUiWfFd0RbMZ3yaPSlavXpSlWzWnY3WiaG0G6B9h3LRREsjhLh/A3z4eQao5DDCDCBbfPul7MCIgY0D/A7xNPl+hMTUUdScmatWUqztCYlLMvLWY7QnyeOz7ro5JolpRJfE919GfJ5e2Xn9e666+UktOfQsxuzHLMtL90pR5iVr0LrNGUqUra9OvN0KFKnWvlLqNWUo069C2lfZpSteVuvpUK1m7o1rpajK2bNK+cj1CVoz5SzEaKLN1KvHLbEzSj9e2OXxEmJilEskjdaL5S6Wupy85KWyWU6c3L0aUkmaEGaDZXjViYpxhHpNMR6xNwl074xg1QOkQIIyUqczfbRlKNSlbXjtSf06kTTtezKz49GMUSScnyezUoStKfLxClejZnIljGSxGh9fMVZHYi/mbbqkjkMZSSIV85Qr2ykrHq8nlYspRyvPnzdmH0OYPpWvF8N7EZRAjUzB1kskm58YxDiPF0KUIsXQtxbJrEXRHgpQcobQqyCFyGkWwqRLJLoSoVZHECJpuDpNwkXTMzEtmVvjG2GG2OysUWYxnxqzdSktGJrNSclJNYjUfn2ZyJas7fVlp9Ghd221rFChKR+nGUbh9LXyaETv690/vun32ZBZnJ9mx/Yv7N3UksxH5a6ds30qdiS2xLTuujdtbqzkinb7NS2zQrTcTztiRy8Z2bMksT6dOzJ45NT7qMlulpeG99azWjGhThAkEd5PLV5JDGfJZ2OUurEelHYlhArz6kllLMhjcK1ePSW+GUii6ECGsDbAtIKcO4EnAs4EFBggtQVaUxfXsULFmORyrdKSKnXnLHbfVlq9vYun2z6FLn3Urb43Pvvr0JjmL5iWjU3D+LLN8bsVbMZy87U74pnwryOCpDiEyDfESC7I7ZyDJWiHMQOEjvswXronowWOUj0F6jTkMJ9i2+EaSw3p2ySfFdeI8loRhOTMIErZi6JI9VrySYtoRdE1iCbg8gtzk1E0B9iSFKHUCpk0SxhAbLED7HopiSEKXmJmVn068ln0bFtif1K0lp06EnlpyzHLEjgFPQiNPiSzbbPjCnFMchds28KfSrQStfvgipqP1ICwkcTTcBPVo1NwE5UkPAKnkFmBa2yKnDDfC9z69i+TV6M70J2jAVlKIsCZsdmpYqzFeRW0aEno2J8+2zSla1CjdRvsSWGCNxurxFtkk1TpxEk8bqSGzRiiZs1I3HrNSfFlGlbDW2xxTSoWxuKJ9WJrZSnGqcXytOLpqHMkn04gxFs1IjRnSrV4ynyaXjlORVobcRYrgwSKK5uKrYc14mswS8EDDGCKhCn31bEtGuaklWrL17b5ajWu6Fm6Xm5LK2K1OO3VrEkjtG2zNX9iSdiSWac7GUXzEcqxnykjurxu2P3StiN177bqsHlaF+L4DnDWCfiqC5HYRpWD2fUnwncFThJloFvDWB5iDCXFsIkZQcLYBrmZFClBmhfgZ4V5LVl5WT90bs14n759m6JIkkE7G+RUI/VoRuKqkcviqN1asT1pzme7im22tKV5LZjt9ilElSYtjV9edlZLM3zFKx/dSoV5WtQtnK91ezTp3XWOhN1qdeYnJWNyG/vo8zfVnbZPUl41Pj81PlKk7HpWbumKlirHZyOW2K05MxRfE85fPkVCNULNW66hWjVOhfO16X2K90rdUpwZoGqChhOk0C7ugcroqjkHGPQqRTXgrz4VZWHcfgvQly8+tWpTVKhWk0rfYusW159iRzVCU5qxfKW3yl11ChO2ZySzE7Rl6E+nOcrN2LaVmNUrbEclpWUszlK6Zs2ynUpXUrezKz60kmqcc4xunYtiBFkYQT0M4byOFSvThRkMrDeQxNFNWtFkQ4sjsS15mxRi+NQRslrxZBslomjGChqRdB7Xi2D2FexDaMImk8LMW1ZirLcrYsU7FmUi6xHJFXo1rb6VWrLW17qFS6tOT7r5HOU5PZtnaFeP2Zm+Yujl8fmoY0rEjnad1bsUa9Sv23XX21bNChf0ate+Xr0ZufytitFkYXWZqLIY2bNC3sXUrbFtirYpzcgvmLrFtOboWJ22jfffZoykgsS0kvsVadOYtnYgUZ8vRsUOfO0ZaNU7Fm+TUIXJ85WmqMU3xCvhxThUj8UyCLoQIZV6MRYHihAXkRICBkEEhI4EhF0GSFuDubh5IaEajsXTFKWk8zSjtszIY7TsULFe+z2yt8+xSm7pe2xbffYun3W16dKNz7qVttHnylepGojxHkE3HoNFKnBxi2DjbCnMwvRFi+Lp2LYRqsO5eGUijUVccp141JrpWzfQj0nkkihrTktGD+KoqpQxktOI0H0XyaD6FyB1mZWCzFsLk3DSDBBLQIGfAb7YDbCPEsFeVvnYohglpPE1aSSaYqTcdoxRNU41PlK0+WnOVqUJyZm63ddXlKkauoxT9nr3wswygoL4JqVgi6MDAtgWsagK2PQFNQgKGjAq4iQL2bgjq8GuMIyiNMzsfrRRx+nH60dvjViUoT7r6FarfbTqSOKYCjgVslq221LFevNzs3VqzVsVW0JLRsyC6UjOMopkkFWzBViWNRNYs1Y/1Imh/NRFm6MisX9XlKlKjbK21bPPqys7KUolhrHIvtlbqtCUlZLWunJNEOCzBP3QMTg3RyDdOw/kEkk0J8G6AxWYHiWgyykHsJcQ4qgo5PCjwa5mFW2FuH0DbAeb4vm6VWVsRbKXzMMN8VTd1eS3XTdixXrykpbfI5SGc7T6VSTV43bLXxqnNzNOWlpmLYcX2xqtCtMRfMyOnK0KdmanKff0KUmgrxAgiIdxNDeGshiiO3UaHfPs9aUpxjCXBsgOMxDWEarYqRqBsgYEETDuCzBgjd8xWl+2JKsxF3SiJL8+UjUVSOVjkMMboUo7KzE5O14zmbMVW33SlSWlo/Jo/E91ClJJijRj1exRrUbZWRy1O6lSkczfbM2J2Uuo22LMpVlK98+l0p91GzZma0rOWI9PktOfKUbFiYny0+xM3SSU5mc47YkEzKUpmQSsbjGUmbZqRR2lYiSQxZK15ahEWPy10zJo7IIwnzsxRp2zs+TX2L7ZuEeCdieEmzdIocUJNGUgjlmjWpxqEGDpCJE9GKbbNOS3TlCTT5aQW3dmrJKknvsTUZxJJ49ZimNSadl+ZtqUogSCcr0pmjGqc+zMTliNU7NWOUZHNTltO6rXlLFa+tSrW0qc3SoSSpLw/+rLRRHoYI7IqM1ECPxfKW2xLDSfJoYxBhxCJD6HUJcP4cwzjClVg2SSzGVWDPHYWJa6nBvhNiDB3DGVhTmYnhagrTEJN8ZzM7ZnL75WVvq05ubiWpfd22ba9ChZl+vQl6NifGrEZS83J6EksT61mN31LHPs2bZeM6VeWmr52jXtlas+Ka19SjPoxnbQvt6dWXkUvO0aF1O62vEsPK9WOcMYKltmnWlrbN07LXy19iPX2ZyOSONTFeZiXl611alPtlZuGVtKYk3Vtrzcn5SnDmnFsZTUlii6tWj1irRug5xTSiWJ5eNw6oW05yFiUkFmcksMoK8+pOQ3jdCIEFmIkXwjwcoCTg6wBYguwHCUhLhIgI+FK2ahXgoIWLEW2YgSSMrEXcGKxZrwvTtanBrsW0YUZSWiSBB9jj8xE0aggo1DmKYS4XYN1CCenJ2fCVEOMeHFCPxuGcKt9GAd49B/MQ6j8NJHEsljk7FUasVIKOUj9SP2wzulJylHoyp1aUBAWZi+2nDe+VrTM+NQ3j8J8xMSefLWYay8biilXsT6MegHeWjKPWIzszFGrbN2Jyzx2hXtusT7/qS9szE9OAx1aN13KysUyktG5WjB0gXUX1ImksGPq8BmoRXGEp3XwZbbr5i+3n22eWu6Fi2XulbY7dFPDnj10zVghLMIUzFMeimHMbhOhxDaHsDGgLGMoE3BNQSMdhJgSMETOwO1CxWrWZ2rAgbFs3WsW2K10+/6E3B0lbM1fG7q9iMa8TW0K8rANdCT0J9OWvpSSlMz4sp2I1PpT5mUoWzFiVuo2baEAucpDWJYjV4axyxEKHMZWYdRbC7QnLZqdnI3JJFIpJXk18ngPV19WR2JFVlZmOwfQlwf2YKGEaxNT4W607RiFfOWZ9ePUIl5yxYrVLE+aqRynUsxhChWnJNUnLFObry8brxHj9GLOhTjspK0rvr15uxLwTnfdL17MvFVeOxqKpaOTMAI9198+6UnxNYhdnbEUwHKLIBJ0KFmnZnIiwfRfF0XUJ8Zz4CZhTg1xlBuh9EKpCjxCswaY7fNQGOfdHoeztSNwpTlevGETSs3AOtihRrzU7dC3RoTVWfQswV6M5SnztSdiHKULNSrVvgOVWrZrT58zJqk3ZsWz7EUV6ktdbStsW9m6xXqwHKXsV7+2+hKWK07VszNSvdUnLFiYn0p8no0pWlAna1GxVsSWjHbbb7FTlYKOxUm5yrfTh5PnztivWrwD3SunwWLN1GDFwXoaQHqCGhPhrAkIIyL4PZLDWvF0EfD2RyWhJ5aJ4aUoeQVIRaE1Xq2zUvXrW0IZTs7NV618+d75y2Vts06V1axJ769iTWaFGWukd0+tWtrWZ2/s3ztGd76FtmvYn1Jzs0L7NGfLVJ99i/4WackjcRpurECRQqwaIYINcWQc7MK8Q5mD2vC70Z8SR+cqyWIkdjskiulDiHcH8SxJWm41KUIGaEeFCIMNImga4ovhLmpLHKNKrVnzN8vL0q85WiSjRtl5XqUOfPn0bHfYvoWZydksrDSNVqcpfSiWnTuo232K1tCjfYqyk/q1b7NatdbStlO2tDKVlKspQn3xqxZoz758+RVaEtTn2223X1JNdbUs1Z2Jp91GxN2a8+YoSstOSazZo1OtKS1irXo30YT5FP7qFWIlSlEelJY93QR9GfJYtloV4GTH4QYps0pybnwEVOT45GckpQM9ez8jqxfCVAyOF+CdklWndZg8rwUMjh3IIfQImHUBIyWA/wOcIE1DKpEkS1pNVt5idnyKvJZ2RS8ZV52ak/Zv/vn33WaE+O2f7618316/OxPPhlVm4EZCrIJJJ4hSSbk1SMIws14wnaVW+zElCpUj8W1ojwoww2xBjGlCrCTBygSckgyx+NQoQu0K0QpJDBHovtgfoGiCXggIsiyO31q8HS2IkZzsikEFaLrEH18MFmM4dTXDuSVasbqXTc5I4aSSF22vOy8lpWz7Za2ndEnLX3TElg21oNMGfs/Xug1QrTdepffYusSteNWx+zHuJaEbqxqlHqEvM0p9/JpWT16te+fEsQ4GuIECbgnIBDQSUBNSsA2QBUj0zBVggYuhtAUsAl6dstRry1ibtlpWxVmZuHM5G4xkUrGMYy9GOzEzQmJDGNfhtD+O29ShZrRlJ4nqSsiujCO3WYzkNSjO2zVWTUJBMREjkP7MRYliDZhgl4XbEakcDXDqEuBfwnwPcGyJ4OsNoF/XgXUrBphhkcNofSSF+GU3F8XxXBzpQ/tiLbGcTSKVheuiHAEZCZAabqFeZsVKUkpS8xJ5aHFit0L43PunxPMyKcqyaOSSGkYTdWM6sl58jh3Wh9JpBMVZeXh1bDOEanN2I3NWalWzdXuus3U5FF0fiNHI5FMmiaZoXT777N/32ZWbiFRjktfRrUOC1BQQREvCJCRO0pyxBkgX8Cik0DtBUhpHZmpM38MYxoSKzOwrTE+xDaIVsikcY0J9srG5uM5arSj8pIr4rkN9GpMWxqGl8+h1Y5TszspN0aEYS9mhGp8mlbpSdvsy1stZoXS03HLo3Pl68rQjk3YpxqcjttOYtjKnSlerFU+rMSaZpVadmlQrS0loSsxOT6cbmZBHI5IpeXr1ZFbSsxyvH59mVtjLmJHLSezIqs7U526aoykMohQkwOdtWrEedjcci2nCHOyCNS9mavqyktRkleUs0L7NCYsVLbMtO1La0L0O47EsYRROzMxZkls7Uuk0gl6E7HLE+OQ1jk7bGrNS+nfTo1aE7Ly9KvXjlSp3W2232Lu6fYrSexRlLqMjjt8jtiLCBHIXodxnCRUsVoysxFjG6Vg4wdZLEeIsTSkLcUQvSsdkEirwOsYS0hg/g6QgwkwMCCvWmIT4gSaIUKMcg6RLCDLwuSOQVoon3/Ys3TEpWpTM+XtqWy1nrVad0p3VL7pyN1Z/KzMZXTdWR3U7a8+66TXWbbqEtNxjPtlq1199t8pPtpXTkrJJDZttp21alCzOV6E+nY52dqVZ918ipysQK10U2ZyTRjQo2zt8epSevE19SpfSrVbrbbZW2nZqdCUi+Vr305iHsamZFBSrxjMyCOyKfNVZ2QxJCbBgn1JWxJ+SS81II1DSI0E/GpNWsWJJPiW+xORbThHhnCBGcGiM4TIHKGkB+gYsB4glYJGxAADk0LF8BIyKGkYQJmtDyCghNiNB/NRJfG7bql0rTlJSJbq9vdHLEbpxyrE0Vx6CpZunad8JEgrQ6iWzE8SwiQX5uFqZiuRwkcSzcenZHGU+JYd0LEO4iwwQ1gzRTBntgPEdkk7CfClBamIQJ2WjKEyTQlykBpiuI0kgzUbowgyxnFkSQPNmEGvTmaU3Z61srNxRfLSkmjc+xdx6+vdVq0+bmZNfXs0pNGd8RLNi2YvvnzctYvlqcpLRdBJwrTFaKLq1Dks+J5SndY5e+rQiS6xbG7N1ah0a0zKSGYgpzEL8TQDLCDBNy8AXY7GcbgEFB9BLw3gJirCPfAnasFmPwCvC1AeYJKC1GEDzBwgKeDuAnYDrdZoVKtaZqzVWT220ZmcklWUr1ZSamKF0ZVZanQoxTSqW2ZyjHZ2xKT5uWo0+VpXyKbiSUjGYulIyny3F0+6ViBSjfC5KR2cg20IKCE6Px6MIGRC1QmoNkGydlbEQqER52I1mXmJyfdWkk3M0IjyKci+IlmXvnILcAG62jCvDK+STU5E0YUo7KSeYiPQq3z52zO3SbrVqN0rUk9mzEkSX1Ilh/LRPNRfOUonmZWcl5ejXlbZPXpUpzszEmmad9eUqysNZavLRPQjdC3uq20rPDDbBjgVcTwZJmhK0qFiKqcQJ8Br4NVsB4jOHEngMMMMlksCcuiNESA2xhCHC5FMhiWX5FDrn1Y7bKRNEecpSWdiWrVj9sOLp8llL4wrWzsrHqE7TqU6MZTtCxMWJSxZtp0ZJdPoRuxMVq05dXkkzK15exToxdbKVKdCO0p2pdylSP07enYn0IlrULNGvF0zE1SLKtGhDDKxJfFVmVviBfFMnla0amLaMbm47zc5Jp9tWGliMak3Rq2ya2xPuvp0JPTgxSsBewISByiaC7fDuMIX58O5qEGI0LUEpDBNzU+tDuUvjGB2jcllrFK2nOUrq1GXsd8fsyWnH6EtYleV7NCOULp2rdZlpeboytW6tV5mxdVsd8+pdQqXT6FCt2KF1mlbNzvUqVaE5UnyvdGUK0goSaQw5l4KstI4vjUHCEmRS8MqEKVSP3yKIMPIttmpm+xWhHiSMasO4rlI/B5HItgnaFKcg5UothNiiEaLqUmqRnYnbY3E98URdWsTUcjtK2ndQl+vW+lQvlLZ8+fbXkU+RSsT17ErPuvmqtmNX0K1ax0LZ91TvrdCWvoWadW2VusT6NelYmLq1CVnbHGE+6zOz6Ni6zYsTFGzRvpWadC+YlIZSadm+cnY7Pna01Vo8xXla8zdYrUuTVqVenTqce5LN22J8T0rF18tSpzkLcLdGIVGDyNV5PJpm2+lJrZ2BbQboSb68es2Z2UhelroXYgz5iGUO58Icli+Bouh9bFEgo2IlviSZhDi2BBwvQJmQwKmJIEJCZA3w7mZetNx6Qy8+OySOfR7+vP7brEchPgkZaHUTSaNQfx6R2ZH8QohQ0ownQuQnSKCxBxgu2YDDDDCVI4SYPoL8LUFmOQVoYIYxjA3xqYkE+G05D2DyPyaDXCLB0ggIJOBAQwwQsOIGiHMVRhRj0hhlHYiySXkkzdNRyHcmjUVxypOys1B9BsjcelYXqUMbo11601KX0JutM1JHL0KELleTTUvZuqyapOTclvrTVCrUlpBIYzrUJ8+3s3XVulO31qUj5q2bvkdepPm6lS6VkUIsRoH2MoBjhWgDjBHwAvw1gBVjkAc4aQDdBWiiE2Q2IvpxbXhcjkdgXcFiB8ieF+E2A0RFg7gXkAQ8tOyteZkczGpFDaRzlSM7MSR6MpWVmak5YnZWL4qkkLVtezO0pm2JJNKSskjKN07NCdna8pQnY7Wo22K8pUk119apYqWKk7Rm61CR1ZPy8Xw0iWG1itQozspdEC7vnzkavp33TlKpJa8rQiWUjOrJIwmYN8ItSAH+D2BlnJFEO2Is3DBJaUbtmatKS16slrxRU77bMW0I1KSaWm58OeD+hIYrpT5HE8NpqFOtH7a9WXk1CTxnLXci5W6+TRnG52J43M3RqVqz+tfbVjt8ZWaFnh/DKE2FenQny1KtLylK+lbL0YMsEpAOULcERA0RqDuR2IZwUECFhbgQEIUDTLQymIO4noRLIJHG4znIrhpfEsV3RdB5XimGU+I0mg+iJVjsYS9WfDGdk0pbWiWVsWZWdpy9WVrTEdlpPHKEvPrX07ZS2zXuusWa8xYkXM1bE1XjVOvMyOUqxHtmak7GczGpFKR66fNRfFdaVmoqoR6SSsvHbZiKpJJY/QjleOw4muJrNKJpJViH2KdGdp3V5WarUKtKzKXxq6NyeNUoDRAW8JEPOhEkLMbh5Gowlouk0DrJ4jWKUnpTfHZJFVWZlo9Psx6NUKctL1ZevysrOx6hLSs7fdOzEnjlChNR+YjUHlWdvoXT++6jdF8pWqxu6fLRybnaVK2JLE5Xlq9W6STEtOy83WpSGZhzbTkN0Rq8IMK8jhHhVhghzD6ModQxgkokjOEKK5iLoZxqORBkVfkMtBUiJDGFiFmvKR+HMLMQIRoeSKxGcJMnhZjViGUGSQwaI1bbDacrXXRdBtsXxGjsng/k0XWZ22zdMWaE7221qV/fP6FCQRRDW6xbVo3SkUyeI1e+tPr2ZyUsVKF1Caqxqf3SnVox2VqTPG4/bRp1pWPxu2Sw5off2brFttOdpz59i+WjkTw4hvFUJ0knJ2fVunwkREnZ2JL7rY30r59mfJ7b5mSxDnxyUlpSN3V7eOwg0r6lm2zXieIU+IUGeck3dfVmoqjUnn0ZPH4ZwVLbFmatl4vga5WL4fQNUjjUQ4jRNBgma983LzkBkgcodV4KOBX2wOMCnkc7FEKNntgDbUsS0MYJaHszAgYJ+FWMYIiXhXpXTs5z5aK49A1Qygtx6BgRVKwF/AgYT4H26AsbEbiLAoYTOKYmiqQyKA9QxlJeC/SpwdwQlaXiWS2L4ZwG266hDipYtgzV61iH1PsQGC62+Um590FaTdOK7Mji2HkvRifklWNTEpxdJoqp8UVu+6pbVlZJdV7NG2UurTsaqz6NK+2vSr0LpBJq9iUo3w0tuo2IuiitBxgM98NobwAZZy2+AMtefGq8rKR2AlY3H45GdGVl4CWlKctGcxHodwCAjkvVhzJ6spAGGVpTsOZy+SwIypWrwWJ9avBmmrNaCR68E1DeF+BWQR0CpnYEjARc+dvlJ2xO1LaPXpzV8gp0L5WfQ6F9SzGraE+f3XWz591eYqSlGVtryWtdPqxvrSORTMrUoz6VGMZ/Qnyli+ItCVuvuhtCfVq2xnHZ2D+CdkVirKzs+vWnb5uvfTp2KcjnbM7Gcjl4Os7UsQN0bhpAzQ0g6wUMYQUqEXXW3UpelFFStUoVo9VlefQr1r7q1GalqNefNWatm6J+TS3J7EiklOhJJelOSWrYuoXzlS+vKWZBTmbYllZW+Yp0bN0++2ffPvhrbClEaCRg7leJp9G+QWI5bAhKMVRuCMjkUSsAfInmasK0MMRIUoACMMEQJqEq+FWIkCGnIUoYYLFaSzkJEjkkpCVORddMWbuNz5S2NWJ2VmpFbYhjEktYkkmnbMO5u/mZWhfDutJJW2vTqQ7s2JWxVoV4YyltajWk9CGVOnUqVrFsH99GzRs1pSHVWrXl59CYhnbYnJ99ClEtSvYoy8tKy0nrSa2VtqVJy6pSpTtCrWsWZqtXtr1LFevfbRgeZ8IcxAXErCfH4EdAzwN0JMCgrWa8OurYlZeTTsJkEtBHwQEL0E/D6CnB5RhBgzUp83QjcMMkujcpfdHLbM+xSsST5qtMUqcvRlKt8lodeUpV61OWvtum759SOX2LqN/Qmrbba3O0JuzfXsTdXo1qk7XiLXnY1UryaIMZxGnKUhkMFuGM3F0HKck8L0DbElmIMH8pyKEu+hZow4h7GUFOPRNDDBqgpwUpaBlhAimFWK4Ya0J8SU4G6BmkcduutlY3LS8pJovswlxutWpUq3FMMZ83SrX2at3z6NtG+fPm5SnfL/VpWz7ZWTT59OxZrVKd9WhKUK9G2xQnZ93Sn1b6dKlPlezSr223TF1X77rZWlz5W+2jG+3nxhEOKIuj0ji+JbMNLZNJ5y2QTs1Wq2yla+vPtujCdrTsbvpy0pYs2Z3q2aE3fE9KLpDIYcyWCNjKKIvjOblbE3Jog0JqPRJfUjKvG5mvKSCSVIzkVtGMYzkMQ7YnjcehpIJ8coSKSz+2apyktFcSxHiaF2JJPEl0pdfIYIKBaQKCGsB5gd4HaHcI01FcNrNvbbPvs0ZqnRhVjGDFLSKTQQcYQGiK4DpE8AsTUB7rQnQdwNMMYH+DjA8SSB1hbgfZmCAgl4D9FcF2xBZhAmJWhMxlHZFXkFmrGdaNSG66rVmJyhXlJWbthjWlak7JIuhJhBoRjHYLU7GVKQSsvRqUL7omox2diitF1CvZuoTFi6XsVbEpPlrNtmZk8U0b6981JJFQnb7qUk6k+TTcT2IX4BpowKCvAo5aAcKsCnm4AwREgBRh/ADLI4CZjcAhY1AHuNQErDKAKsJ0EPBghjCTIZaFeKIgyaIspEShEKNQwRyL4um6NmlNV5qzJ7pBdBYgE/B7CDMzdWOTk7xNRlrZ2dmas7M9GQxAiu+F2KYlo1bNSdjlmVkkLFGWo2aM7QoXSeOzkxTiSfMySVjUzUnZPN0pNGNsZd1teOU5aST6N18irVKd/K22aE5BFT69ON1Z9CdpT6dmtFVSFeNxnL30Y3M1I9ESzUjOfdD+L5eCPhEhQgA5x2ClJq1CIk5Kz6cQ4Vojw9owvxl0Ju6xGr5NPqylSf1pSZsUOatjVmrRsR+NxGjcgjCzGMtOTdtmxYusTdOvJJ9WSTVOtO2ZuUvtp2Luxbz7aV8KEGaNxZQoWLFGfdfTlI5Ow6k0VQyo2YniNDeFmAdoKKAAVChBAQX6EVyatB/ClALEP4IiEWCnFcHsajlmOSGJo7y0RYixAj0WzEtBrjtehB9NSCXs1IshrIZiJ+xFExHK0cj8TyKJbZiJKUioyktfSjCJpbn1ZiPzcao1J9sZSlOUr2bY7OzFeOR6lwxoxRYvmLoYYPKMtCFEOhWhXvjUkk0RIO4wgorYspTU1Fcgm5S+hUnw2k8noy1iUqzcio2ykrOSvSmLp9arTrR2hA4QMODHAYZPLdC6lWlJJF0ai2CrIpNA0wOEDTNS9iSWz7atiI8XQVowhXo049KUqcbpU7FKnNRXZp047bILpqpF3QsyeO3zkNJutYtuktijWlL6VG6+vXmakeoWLpBKVJXtvqxqtJLoU5eKoRIGRMw5nLYeRjFkkmoqjGSRqtShjBkkMFmdh5HpWG0KsPY5C1LQcrYmiiGGjF9aHUIfDWEaE+GMHsKsIMG2BwhZh3BfhxDKD+KadOzMzsZz5uchpC1B/DyDNdXtk9spIYf3W3XWJ8pHY1XqRfLSSxPr0+Rytm27vuo9m7o2KPS6kgktOQVLbFSvOSKxSn2Z91WvYn31r6FK26hdRn9C+62Vsy9K6xQulJiUsxqhDOM4X5eIMK8Q4ZSeL7FGajUmnxqMqkS2LaF85K2altsUTMdjkzKUbZ2xyeUk9m+ZkN9mT2ZBBLzdG+6HEH8Ww4jcRJHJokhbjsOKMYQnQcInhjLxNfGERodRLxdG4tpTtCC7Bauk9OUi2L4yieYh5MXwm2YpnY3GUQY7H74kieJa9GfAYZyDjI4FNXg6RHguwCrgfJNbF8/vlr4/B3DSDjBbgFqD6CSksPINsEnAk4E5QhxJYBqlo9EeBBR6Ic5AaJuYqwM1WGU+CnLSlmJbZ2fX6FOS1JacrStizVna1GvTtvrSaasUbrM+tdKw/4eRGnx2tN17oZxhOUpuffdXr23Wbp9vIqVPn2LbNWzP6N9GxU5ezddN1ZiM7Yl5q+nf04rnIjxGjCEGGcAgYZSOvAH2tFdaANteGdaAfa0IlaBJ2InnwQtiJpHCfWhzVhWr2I9CrIoojcKcbnZeInQoRCtvrRGnz7ox585NRqIcrA9QMiCHgi5echlARt0+Uo16tifWk8nozE+bvjdGhdQrdilOT68noUK8ZXStaItt1OpJatehYvrS10fnJ8lsTklunLM1fYlbN1srUiWjKX3St90rJ4LE3IZiC1Tks+CVlJ9WpTnaFifWuq1KlirZ6kpT7MtZksY0IVbEIMUQco1AJuGkNIV4R5LZm4or2bYxjkSX15yWlb6tm2NTdsrO2efYqX2Lo7Xk9SfNTskktG2arWJ8zXnb5axIpynRrz5BRk1mT2aXVq3dK2zYp21q1WjAy3QFhHJmahlPn17E+K5WMpiE6JZ2NQzmJiZiqPT58CKpwSErAHWORDhSgHqMIPoUoIaF+NRjAhbasigO01KSCBpiPB7GEcqyKxOzcMZmXujdeK5iF6TU5HDGNQi32bMJUdk8ZxLVjkfhGqR+RRRXh/HoP+GclhAjkRJPDmxH58O6EakkWUJJKw8m5WfCRHJJGoT745Owi052vFc3Hbade+jUqxJN1LovsyLh3ffLwwWKlSKal9KLucnZSrJ5Sdoy9mnWrVbNGWs98FqGkE1BZgDBDqCNgvwJXgT0jtkEcvnb+zzUtQpQtTkNIIDl4ugpRLCLH5SxNWw0mrZFDGhK2xJZpVJmt22ynUqzlfsyklvp07MepXz58/lLFijfTrWxqjZtna1GbttpWal0aq2evOWI5Qq9CKZiFeSztSxGcdmobVKt0tyazCLC/CFTi6MYLNKXj8DfEOIEagaYUoPIlhOhjEG+JYU4iwjwX4bSGNQVI3Rh3A7QvxuIcH83MQlUKEdk9GUpWy9CORClKkes8vIrbEjqUql8vIZipLUK98gusyST0pejK17q1e+jbZvlL5S6lbXtpWZNfYlpeXoXVefdRn076c3Vsz6Ns+pToX2Lr758pLUKtCWoSt8asTsrMVpWVianOwv0oplozktK6fF9WCxEKxFUrCnJpafKySxXtmLMnny0+2UtrS0klLa8+2xKWIV52KoOE+LJPPhAnY3BYkMKNOHUWUK1svfbxXfB5Oye+PxDlLEXSkciNBzowjXS1GrfBUsQ+h1DeHMHcFm2fbWiWQ0Yrk0PbNWOR6ZvvnzEmlJ9iWl4/A6wIKUkcrEnfQto2yktCNI4GaGMTxEhKghYNkDGmJ8pfYqSKN8cnJNNTNaI985O14jzVmSRjMzVOzXoVL6teK5yvRmqNO2fdG+UoTdeOTNmjKUqHJa0LM+O052rH6snoxHpWZ9C6vYnJ8S15LK17bMvL8+zXq16Fe2+Wq/Up1bNCS2ZLNyk+Htsa+6+XvsykkiiFKDpEa2I1mI1sZUYyti2nESlEGtC/OxGjcRqcLcTxDh7O2yaQxdE0hksQK0liaS2IjTUjm5qWtlqtS7qzERojxEmYT4BKxTMx6Lpevz6EdpTdG+Xm7q9a6lJ5PIp9aRxuV6liTVf6VWlPkkjjkY0Z2PVJarfYmZ8mj18rNSkZzdGbl+tZlJSpLy9WXjUtQhpNyevNWa9mYkcTx2JY3Ky11mxYl6lmYj8ch9NT4njOjDWvEaJLPJo9G58zGMOovoykRoEVCpDOB7uhakU5LRPOy3EKYm49J49MU45UledvmL6levN30LZWhXklSMZBHrNePxbHa3B3NzlXnykzZnZPWk/KSKXlpyJpJdEtaXmqlWU752N2bq9eJZPLR+xWpX1qNKxFMniWVjlCKacUzcdo3xFjVGnNRZOwVYF3ARsE1ACdChAhYK8H8PK0vLw+gdIgwHidgywhQMsmhMj0IMRoaxyTQdxlIo5ZnYToqkdSJIiRJB5VhGi2GkJsOIuhNthjDiKpFPhlSmKEG2EGzUhzGEkhCoQ8rcVxXBwhpEsM4voSsIU5FE3CDDWKZJBUiSE+L4ZQ8iiFSHUbhvNRGlImi2OT41DOTUpWdn2YzjsL8S1ojWInpyeTQ0kltOzKzkpFE1bGqk+nPq2Kd03Sqw6hegiYCxgD1DyBEQC3HJiGsgl4nqSa2rGpPPjKSxXF8MYohSs1YHqI0FmDyQyKhXqVJ8ntmKU1SoXXStSxOWLNWRULM7B5MQ0rRHiSFaXh1Xoz4wiWWs159CrZlolmpWcq1bFmrVtq3WbF1s+T20atiJ5m+fNVZ9GXkEvYoTdiKJFI5WDfDShEejDmHEHCVhZi2CgiahAvYHOQQGeEmMYHGIMKtOF+hDuDRCtCXBsgN0mgdomg7qyGK4SYIuB3imlA/RHgnp2QSkM7bruhSg9gn7MxKz52dp2b7qVe7k8WS0nnz+rXn3291eclKt93Q7NCzbPoWef0KENutFEcoxPZs0ZiVoUKffKSa6jYnbFt8+6xdZumo5G6FmXl7ZNK2JSnSrUqdttC6JIxnwT8J0K0YQCzWmJ8ehlA0XSeFuBrjKP3TsVSGGNCYtleffQl52WkMV1qFt8+zF8ah/ClSg2TsLcFaFmMoLEWwqRhEsZQSVCndPtvsdtivTunIiQl0YpmYVItgbK0QrZavWqSaMoNMRYgykZQPExP+zYm4VLFCbnxXL2wKKQ0b69eTSKFm2+OwcYF3AJ6FWBEzd1WGcpDSGU7DaDNLwMsI0fpwI6Ap4C/gaYUIZwdztmVnLbatOxA7ylscrSWRysHczKS8rHb7MIV1WVtjVmxHL52doX32YPLefPpT7Ear1rZ9KlZieF62D6fFkS1IlmrZJQu5yN317F0tQmZizZrzdWv176tmT0q9afNylmlbKVpLVrQ/nxJLylK2+hFMcmbECUhUiBdAGiA8wZbMBY2bFivdfOwRNCxVr2bZ8MZ9afNzs5dAarNSVmLaNWHM70L6VivB3VqSnYuuhx231LufA48LcCxiPHISIKkCco15JXqV7Z9S6lyGjSqW83VjO7qX3zk7JKtGWvvs0KsvVsdG67updHq22LNKMbPNUq9GSUJSffRjVStIpiORfFcvB3AzT4XIWo7bAyJeCKo91tezQkk5ZnyWTV5qdlZS+jNU7o7E1mvMT4Pb7pLHIvpRjGE3VqV5uJpPJ68NJLESVma8tQlq03PupWytitbffZs1b76l0rJqMxGEkpzFmzQoXUa1S2fXrw2k1iYrxyVl7oZ3zXPs160vK0bY5KTNsErRiiG0IsQIYKMEDxJPhK4ZRuCfow0iyGkbma0BKWzE+JJWWpQFNWqXTM+26ACNJ5NNRdEGGCH0cgooWIxiDESFW6ARM3CvJ4WpNB0i6DDKVpuF2dm+AkJLIJ2IEfoVYRJqSxTEerJougGi2WimbsVbEejstYq1qstAh5q++RUq1WVi2rZlIaUKUCOi+dk9KK52TTU5J7o3PszUCZm4yl52vzk3Yk1sSXUb4CIvrXRqYoWYWqtitE9COzsAja0FXhAtgpTMBdw5hJguQhQ0g9gqwBzlpDVh9dO1oAuX2K8R5JD6L4MUnknEa2DrGUFFCjBBwHuDupWnweTEjq2Y3dfGpPJKEl7rMv168m5JPpzs7M0JWZ5WxJp2zYusUKdmUrTlWhdVs9mzLUb52+2rfO0rFnr16tWSz607NWxuWqXz6liIk5Pq321I/D2IkWzUIcjsxbC9WkkIEQIp4Os3Y4xgNMF6HEYUpmtQiBA3QzuiWhOQqwYo3XlY9Vs0IQKtKZhrfdJpSLIksxuhfbK3S9aYrysbnzliNcxUsWaFWar8pUnySfZmJWlzkvdQo05i+j3dmS0qdOZnJSlRpTkrK2z7+ctuvrztGN0pLM0J9CnRupyeTy8+NSWNS0U23Vrq3StqWImoUqvTsxnEWvH6tsOoTo5ESbiqNRROwvySGMblYqlYiX207qVtmlPvsT7b61mtOVJuIc+D+NxVEGFK6TR+EGNxhSnykxQsXdjrW1LFGzPvs1pPOxLD6+JZeJI/OUat8YykVy8OpFIJPXqWyCKqUQpSD+IkGyhJrMzVuoz49EKfJ5WXhJgZMtB9DaamJ9G6KJeOT6EYSeSxqpBfgLCjBZjCIEch9M1r4dRdC1TjOTxPVjGZ6VGvxTJ60biNNTcOpLGUhkfQsVJmpLS1WzQsTlC+XszNOrPn2LrEpFMirwaIiQwUaMrfFcRL7qclo2aV9S6VmbMxPod1ihVq3xVPun8YTE7Ipa6vdGpJIr5yLokp1qnRr2JqSy8fqykKsGeT0Zy+avmrp2XnZPZo30ZyrGVWSXSOTxqT0okmLMnsVJJPl4xk9SnOV7ErWszUinJJfZqRurXqTtGfBDwAeIAswiQiQI2SyWjYoW32145dLzEmq2b6s5KzcU0OfLSejXjk3JZirdK05eN3ysxTj8ZxTN339mzZr2330JSRxNOWY9OyG2pYsy0kl4pinoREjkpfHpFDG2SWxLQqVadG+XjUT0I9GVWQS0UwbYohXkUgm4HSCbghIkgvSkjgpxDh7DDFUFHfIJFF9W2rGcQJJEsYxnUks3HrMU1bpNdKyCrVr3T7POUKEtdPjOlHp8jk8TTcKt0X21bqts3Zk0vUi6SynEkjhjKyk+chtXm6leLZqcnZJSpXT7pLbECSQ6jcxORRMx+xZjUMqEzEkUSWHFeYhzE8np3xunTm75PUtt6E+2lbIoBngXEBKQcYA4QOEELBVhHhErcai2BziDBDRdAd4ZQXYQ4RpDB7ShpH4eSGDuNTsFeaiJE3GMFuSxAksUzkTSGFWJ7pLCDEKRQdysI0jpQixPCjCHHoeR+rOQ1kEOOfCfNRnDOMomlYyjsRItjcpGr4g2aULkalY1MSOTxRLRqtHoY17EeulbNWKojytGSUY7Qq1I5J6srXiSTy8SX0IS4J2AkoCvgAawewADIDRCXCXMysdjkfsS9eYuj8YQex+2Nzlm6M7MHsHOF2EiEKxTutlbrYkrTvG5ufbSqXWKs+brz5e6YlZ8T8LEUQ3iqXiHRpwtx+GcmmKsdqxNESlVi6XkvKzdvSukPRtpVpyT1bb5uOV5ihXuhpXhcszNOjbRk0OIgTEO5WxE0jg8iNLRPEWJL4R+tCNB1iND6EqBhRJESAtoS52EaIFaB2loIuCHhlwkSSRWyOE2HVaI8E5HIjUpmCjhpFEpOSkRZW2x0L+jPnK8zLWJyQ0Ii1pLXiexEetZqx6tTvrVZqpXpxT3XUKVGanK8/sX2xqam5DCzI5i2zbG5uN8tM2eb+ciylQk9KxSo2059Gcr0uxZiiIdCTytGhRs98tWumYb9WvTo2KsbpyKPQUEkgpQewtQbYEFAVMFDBlglYjwykNarzs5NSapVnKM7GVt1efOz5rhlIIVYKsO4OcUwh1qENIGFH4LEMoOsxDqhG68+tXr85JaNOSQSsahcjkxShbtiuIkxD+GCTxuD6LaUPIhyKMI9JZmjGMnl6lajYkcvxPHat1ChYn2yfuksmrQWpNBpgKqESJYWZNChHIbw0mZunBcj0HkrVhNtiBDDCrAeIIypIIvlYrnOD2JJeJ6kxMyOIlsMYks1ol7bY/bUvs8Uyl1GnytmnZutn9efVs1a0pOSWJbuG1CtLStGYny8+lN2ylWvbdYsUvoX17Nnqz69nl4zk1iVp2Kciq0JSVnI7dI52UqwzpdGarSOzL14RYIyKq8L0CSjC2L69WhILFmxILN9skvn8grz68lulatSvfG59GVn2KcrOzdmtPnatGVvoT6M5OW3VJqlb1IXYtgp3wj0ZyrQvnz7MmsyOTTs+cpdidus31aFW+Y63PttiPOy8zOU4fzFKnRodeVsyO2+WsTlevfQnKcvLzla2zZoTstRsy0biHGossRPBbm4UY1UhXn1oIyH3XujO6RUopl4xrw0sxlXgc41FdSDuvFU3xlKykE9NQeU4KCpHIxk0SQ/voQ/nb75DOcpJaMnvvpw1nZN06lWzPqTNfmpSxSqxyvbSpxytUqS8WTVeavk0xTkk7NRBvjVsZ2bN8SzEXTsOakRI3IY1Ozds+2ORnRkFsPKUTx+KZqJY1EGJoHGG8/hNl4d0YkoXUJWhLU61O+fU5itN33W0L74vgh5WFq6AMlGBe2wB84Q4N8BERdFdeBLQtRVF8B/kEWWID1fMSWAzyGS1oG2+GlsDVViWTQ7rxbOw6m4TOXlLM3JJyYj9KzFVtCUhTsSWIUKHFkSww1IgRjCfXiyHEL9eI8YzMrDahKRfIq8RIliiSQ2jCQ2JHH5acj1etWumJWtfZr2Y/QlpSMroQZWI8cgUsKEBaQ3gJmDuBcQM8ANkzA73wKS2BoqQgWZiQxuclLMvYoWYnkkWyWUjGJIhyCG8DrAsoSIBegmuXuvtnK0VxlQiidjVskj8jrWJqvbfQtnLo9UoySGCP1YzupU52apTNaT0aNmJb5S+nYutn1q1KvZn2baNaRx2jVrS1atTs9WxJJWbimnK29OzEWFGQWZiUsw/i+QRuTSC66jFV0I0ZQsQuQ1mZLwS8PIK8zCbNQoVYfxXEKM4DXF0LsSQc4cQyjOahjFk5xNTnwxkXzVOldSoXXyk1Iq0jp069Doz6sxRs3xznJybqztscoStWXtnb6FtihSrys3232Z8xy18TV5WMe+QzsauuvpXzNGUtjO2VlLq07Wla1e6hLSlGzdGrruff2JarfbTszt11mUvmbEQb4cXR2TwykMOJJDyKYyiWzDaEmJ4tqRAlZu6bnJz7N90tJK991tPmL4Yw7goeLohwxhlDWpDu6Zm5ylfYlrNm+2vOU47QmZirRsxAiDzVKQQgRPE8UVoeRlEKK4eSaKqsLkRo1PpTsVTVSEDkNOHUnjOzK0KVWzbPjclsWIqgo4SYSK9K6F2CtD6D6HkMMPoMENophrEaxBJUr5FCjFEpIJyGktFsapU4KCECHMWRRF0OeJqMtWlLZStdYoWytspGVtS+6SyWNRlO2LbFWdj07Oyl9WJ4klOLvoWYklKslszs5FE3NX16Fizd206tmWv76dmjYnYziycoWYyhBlZacnZPORqlyleVqxjL2I1fLS9iNxZCTIILNspH6tWzOzlKcvqXXV75erRqV6l83RqyeZj0WWxXDGTSOtYqULZPfRklivdI5LXpTk1RjO6VjVWclKcevqQ1hlzUURJQlbrZLKzcRepOx77MrO305FRqWLpy2rfVklKDhD2IEFFEshhc6dCWoW1qNCfGo7LyG2lJJJUr1pe+al759WNylaEyMojSOL4cS9CvYiaI0egWEO4GNF8HCSQbqkK87DKCRgiLoIeYgfIkgxQdxGiuFSQw+hZhchFmojRAiaTRPIYaxdIIgy9CjUjUrCpdDWxEezEaKItsXVYwrV7oQqcioRlOdGVq15yzNTNGNTlsak18MoslIvhfi6pOzkli2S0ZFdfTpRRNxqTy8jkkkloOlOSxCkUQq8pYm52vTuuqXWysY2KleSRyIsU8vOxqaoztadsUrFOdiyTSGvRujkYRqT1ZPK2zk7dYiedkk+MOvLyeBHwMKAN0MEAeIYYFTA2QGaD2EGGkxGu6PyGC7EOBzkUBytgfYqhKjkIMrBjthG4eTsVw0mJPCNfCBVmoQp8K0No3H4ri2+ciJFVWIcM58ntiHEkdhgiNJ5WaiHI4QIfxCiFHY1OSWHltezGMftk0OIfSSZm4Y145Es+diipFnLTE+6UuiiLoHqFqAkIFvADhF0ANMJsA6wIGKI5HqEWRPH6stMxRZl7pSj3dWpL3TsSxClpLDWESDRIIGeBfTFChLVZ9mzF07XjdGLakatg8viPPlbFG+6vQkUK8ep2KUkhfiWMbEfksmiaS1qXzFW+lZnJeZsU4zlq9K6WvkkesS0xdRvjG+zORFlrNK2ViNFle2tNT6sHsMEilZBD+E+PTU7PmLNeYiiF2XgtzkTwwRGiyLYHiCzCVIY/DuhCZAx4iQuwrRyH1CckMH01BzjctJIzhlB/C5DqF+Wqy9WhKWKExYvpxHhYiutJaNCzQvs04ZT4jysJNtW6drxJGVSxUpxNKSa2h398cmO6fdfPvlK0+hOxTC9PiW+P0LPToyeWs31reci6nWmqFSjbVn1JWvPs20qdG2+zUszt1CjfRs2e6pd0JyXsRGlYaRFktSUgpx6C1FEJ0R7MIEU05SVn30JWZo2LNtSPWbafWnykmhMg7tsw9g7g/hSnwv3SeG8glIpvnKE7Qn1q8nmqEK0jj1CY5FB5B5GMPZeCXhjCJQrSeEPnJFFE7LU6lC2lXnI1RrWZaO3WLbFe3sVpu6ClPmLMBb3zkKkCmjGYiWRRrswNsN41MwCvPkMLEOq83wOEVQ0lbERKsakvTlKcrQlp2bjG2h9Kco2bMpPletbYuoWbNOvXoVqVS+6/tr0bNt9t8pbG59srLzVSvZsWZ8erWa9s+fbZ7r6lmxW7qnN3V7oliJy98klrN1ChdSrULFHrzUjm6MzWj8pWjcG6MboGqBGwYa0Yylm6zbVqxnd3UOzYi2+ak18pVqVJeNc7VtrVad3bPsXVrZ2btp3VZq+vRtvq14Z07pJD+fZjlmcq2Y5IZyvVq/dYsVKnZrXz75yarWzfUrX2xq2nZ7Z9ihPq0KM+vUr221LF91ajUm5NPoT53qzspUp0pFKUrZPHIbQm3wtSGtORXSkcHltmxQm7uajKMZHG5HKUIxjCTy9mZmp2H8ns2x6+pWiDIb5eI9KSU6dWrIK8jszlipORlTiavJ6k3XkPLVb5LJq1apQoznYnJiQTPXr0JDORJJqsboxHmYkjCWoS8XxJbTimSylSFqNTk3GUMpmYiFZ7MxM0piSR6KKERIQImnIPpSGMTytGKpWYmKc5FEvLRlIq0ZxFsyCLKE1NV4lqSGlPhlXs0YKKST6cCYp204JyvPqwAr2LuBi2aVOAGqvEeFKEKLYxiNAISaiJCnCDESMpLASsmk83CJYiLwEXWkVSGd8nrwDrJ5PPiSUneBLxjJ5urNWZyBR2JefGVezJYB7m5SZh7Wl74AzV43Thdqx6pAChTttm6s5JYBAzMUQzgo4liyGkADuKosoRbMStOACjDqHEH0gjd/AJCVt4HTm6kCWs2bEBnk9W+EetWm7ZDESpDO2SzUhjU7JIL8+I98lrz6MKEXxfJ4DnQnLFOxbfGN3x2boV6MljGRyWpUkNCjIpFTpS0xWmbFeWn2333WLbqtWcsyl05R7bF0pK17qkpQrVJyYvmq03QjVifSqUY1I5u2nbJpJNSe2xRn3TViXiFJ6semYxrRlEWQRLB7I5iRwrQxkkM5iUmowiyvSlLZuXoyKUjdWORVDSSXTV8knIRpmvO0bZmxfGqU5Tl5m6nKT52jfIaMtLVaktxlTmZajUr0py6cpVJSlPoUraFezSn1qF3fUvv5SxddKX2O6fZpXSsxfPnZe+TUKHR7adC2hTuoUKs1MTM+66pZq22zdmVs2J2jbYiXm6sZ0rEnieFehFcL8NpWNR+rYvhGr1o73Vq111atZoX0JPPsz49ffVi/qyKJYQ5enN/Qup2L5ejbYrV6sgnZiXjccpT7akpSqQ0g+lrENK8xfFFWao0aF9Wam+rGuTyOUkVijN1+fNT4kn3fYvmpPL16cNoJyAXacAvwdwOUXQISMoL8DdFM+jLQ6hbgcozgNVsHkIUIMLcMZuLJuK60aiy+xx+fWrwiWY1J4otvr2KkklaVspRto0r5ShSpyaXsUJSvSnbErzcrdEC2J+P3zVenf0ZPXoTkV2LNav9ihdUpWLr7NmrOUb5ijHIfVYzvoTs3PiajPsUJ9ClGopheiPGqsRpNFM5fPnKNGjRoXz5Wl32a9mtUq31ZShRrU6krPjckvm6t0vVqUqs+RUrrPLV5WtYl75yNz6crXlpLMTkhsU4lhghnG4ZyktNR+bhnF8+LIzp1LpH0pPNylS6pLV5JOzvL0ZLDKQxJDqRySRWZulTlLMxMUp9stVvmbpNffNVbN1s+tRsVaU1EGEaI18ZySvdECKoVYYIKkHOA8UYTYLEMEVwao9BHxyCQjGBizUDIl4N8Q4V4aSKxC9Wk8NZDE18m41TjlezbLzMR45YqRTOwp0rHbbZmo7bFEXRRPi2SwiWySckdKaqRutXkEtLSPkVmZn2KEeqysrdHoRpiJJSIV0el69CEynWkk1ZimF2DuMZPNyaxCVVhbryaMqE3MRhQjsFeT32LaskpxyRx2Jr741LRVVpSKJ5WaqRROy8gjU3C3dSsTMzE0Yw3mbEjmZ2JpJP45Xp3WatKbmeT0pmQ21JFQpQNkC8gH6DbACbIICYk8AJcDfAkYTYDDDOEaK4opxq2WsxurDWbh3Pg9qQVojwYroMFKC7OQNtWB4iSEOHMMasHkQYMktCdXhBthNjCFCNwlSWHUUQUojwmRVBbkEJcagpysJ05BZpQYIhwQEngP8MEA8QvwB7gloAbYiQASroAc6UAM0BjgDLA0QHOBsiSZjdOZlZWapUJHE9sZVuYktOGUrNy1GLJyWun1pWnFF8Vy0M4fQoT4YwhR+VjOzOS8nvumq8nhlVjcvVtj0X0aUcsz5ipKRHianIYb20okiSJacMudny05OXULEtOyKzE0bnZWWlJa2GVapxNTjOpTmJyOU43RmYtmJiXmY/CpDWK5BG5yR0asXTEOKMgm6cOK9CzI4jVZJBPQh1Yog9szER6sRYqhRhjF0DdQhWjKfRh7E0NIjxdfNUrNaMIQpBCRJpeEqVi6D6JZNHZJGHYpW2ehdPqylOGU3NyWpGrM5Yj1eIl1ts1PlYkm43UmZerM20Z9C7n1r5WfUn17bre+zbfYvn22JyxWk8ik0hs3x2+zdz7b7aN1ClSumas+RxVSiLbJ6EvfdbZn2I7HbFDmraPfCDZpV+XgZMPLECunxjGcRpFLWYKCWhAnLqNt8rTp216Uek0Q59CvZp2asrdbNRNDOYoyCZmOzI5PO2aE7yt99CRxNMy8TxupMyKhDqMrMejlt3f2xXEWXhDksX1J9G6fWlbrEiuul5yM5FMw2s15F22J8giPDSGC6xF8LdCCGlKPA604toRXXgqRqN1YtrQV74YboK9iHNOVkcJ0arysQIomJLLTExZiLIa9OXqWaMfkt11i+hbdfKWKFa2hVs3z43Sq2KE/tnbbZ2hKW2bbFOpUsWZ9jrWJeN1+z2Le2vZoWburXvnJ9CNUIdyCTSkRJuSVa1ipbVmJWrSj9CTwdwzknHo1DOFGhO2IEZHZypTtvsVrbNif3SerSjOQUqFiKOWk8lvtpX0pqh9OtVtktipNTVmTSnZk1ivbJKlm6YlZNXjl0albMno0Y1Rr30ZBHK03bWrS9Wdv74xoVZFPpVb7rYvkt8ckU1bfN04woSSpYmK1GQz69SZrzc1J6k3Ur05222hTsU5ucr3UIV58IdODpQhZswbL41NQcrq1mDrXuuiJGcP5NG41XrU6lmrSn0K0++lNz52cnbMzFtaZ5mMKsai+Oyk+zZlZHIqlmzG68rN0aUnqRLS5eLefXlrb7N81Pn2bMe4X+NV47Ly8MZLL2y8flZy+JK0nrS05RupTdWlH7pLFNalYsTUkkkTSKzJIlhTpUJmGUUWZmtG77N1vR58jmI9Bx4Zwz7MhhbnJavWs2LFafbWoT77HWm69evOSv221LEU8L1mA7UYX74B6swc47ACnYh9OwCHryOTQB0iDCNFsBJWL52AjJyOTkAIFmnYgChVhlNwDbUjOtAqbYxugJKOTlKAEiUi6NwB5sW04AWpWI9GAR8tEaPwAQ5iDdKwATrpSbgB1tjHgAmXw8oQCRuhLugDZKQl1oCKthpUgg6sDRZl52XsUK90pSrVulOULF1ibrxu2rw2k1aMZmdoztGpEslqyaGUZRCloeQtyadjGTTfYjC2zN2ZmZ6tC6N2yk3fKUqkjnbaVW6jNy8+hRts1K8+6fLztsxSnO6doX0ZytbTq1b+JZ9WjOWa1/ILNmTTM7Ysz5ehKT60flojVaEZx++rJ5qbl4gxAnwzh/FcXSepKRHhCkcHSSzMnlKEHCTw04gQ6g7h9RiiH0SQjRVXjKHdWE6Jq8LMhr0ojwfxPbPnJaQw9k0vfLzt1OlWj9CxJLFKO3c+VsS9tO+vMXS3Psx2rWo1qFmUq2Z9Chff2Lr6ta2QTlmpNWa0ar0JFZnIZyXnIXJuXuoc+h230J99GRyWhKVolusSGcjsN7bM7SrzffY7qMasxbWo998JtiOWKcliuLp98RpyaqRVLWJW6zdWpVJ90ilLqFOpZnz613UsRPdDKYr2I/N1frXdHryeS0pbjtOnXn1aVKM6ErfDGxOxDi6xRtjsXXVKV8rzM7SozEmo0JaTykkkMil5NbQtvkcM4ZwgTMNYmmpqS3ykjs176taUoQ3htLcatkPLw+jccvsVIZxzh5Utkd9GWks1HaspLwlyWG11SJpuhILaNifdUlKNSZr2ZS2WklSJbN1CtKye2h1a9tObo3Sklts1qXOXWb7Nez2K9CtU7FCzQpcxVpXVp9KR0Z2LqNKM4QJFGpPFNsZ0atehbfIJizYm+EKfCDPjcVRlFUikd1LtnZPdPtj0Yc5LTsj5NKzMNZqhNwzpVa1GtWjOTS8X0ZNMVpSdq8pUrye+pfN9i+xQlZBHZ2xFFsTUoXKU5J5mJYym5PJJuhElmcvk1WWrxySQ2tlqEloWYdSsIMVxhNyGTwykMzSiuQx6NyOpORNRkFO2pDeH8vI49OSSas1p2TS1ihOUa9KtO1JiM5PXr91KXo320baF11OSSlSKIpnJiR2b4g3XyWWlLF8em4cW8UUqEYRynKQvRyDuzGpiXoyKUiBSrWbolvqS8nlZ8RZPDSLouqXUZ99Do21piP3Xz5PUmLoYbYPaUzORAjUTR6P9aVqysxdfVmo5SthrJ5iMYzqQ4oxGlqlW6NSK6T15HIJuGCF+a5B3di+JpyvZrwe052fDWxEKTTtmJqFteXujOzEecvp2KF87M1alacnZSdjCvdYoV+T1a8OZynWqz5JPklaxQnx+tA/QTcA3wuwEjEOAN8ZQAHYxgEHXgBdqQAt3wAGpWAN1OANXAGOXgDTfACXdACZEaAlpFAAhkkAgK8BMRLACnGoATpmAESYgI2fAOcHkERCFDuHUM68TUY3Vjt8pdTr061OlWn3xJPvvmLrr69ClXkVKpKXW2LrNilbYrT7elNWZaOTkfk8bl7perKSWMItiuLrNmWkMSR+fSm5DUryOrRkEdvrT7r5y6NVaE5C5CdbZiizEGLLEkn0Yj06VmT3RydkVtmTVrpHQoVKdCTT6cbn3T7FWXr0ZevPr16U7G5mjOQeyKHE1bVjcetkcbpR/nKslj8SRGiWhClLwrQsw4i2Gceg8rQmwScFmEGI8RIymK8xEaJogSKFKWkkRKUdnIshtCvTmaUHcH0XwhwcJWJ5atFEmlop5u2Ujtadq1ZSdmqkglbrbMfmKd9OOSt0pM20aVCvXrUKsNr6t0Y1K3z5WzRvvtsV5m+vNRychXnKsliDfzdOJYTZ9shiurJLHf3WLp907bySPSSM7MxOxqdnwewXrPYrTlWUrWKE+SW0baNef323StGJ6sO4fwh04/FfECSS9adiSbr0LNsxUuoX1J2X58xI+fdZs9exdHp2xfOz4j2a9C+bhrdGVserda2diuJZPPo2KN90ZTNC+UjdCMbbFG+AHazWsdCtZtsXRyhbIL4hXWOzQ+jbXvututgApzdSvHJWKY1CVHIZxuTQ+k10ObM5Vhhk9Sh2asxDiHsgrwAN74KsSSGFaH9WI9iZiiTfK0brNm/r2bF91tm3tgBqtuuu758c77b7bromqWLFDv7bFttte6fADNTunwyvjUfkMmgLiF6Bg1otnadKxSpVb68KFOhEarWpUoAFN8M4kgw2z7MFixWk8ItWG0TQE9QjcLkC277MGOHEBloQNN1HgEXPn2I1TpXx6jFkdhnMS8dhnEkSz4njsOI/fIZJO316dmABLRtqUJPPpQFDAT8ApboJPhGgbYPLELtaFetEOpILE7ZiDYrXwAvWa/ESxXsQ+r2b5LfffD/s31LNjjPtn2L7+ARt/bYs2O7tvpdC2KLqNCO0adGGlKNUonumaEAirpJOQXo7Aq7oxnYCyhRg03wnw4iNXsX2LrZ9tSrZk1mcrwCOqzlWRValehZsX0f5f+Kb/iqz8MrbboA/X28M+GN0O+GU+D2K4ZQkRTGoZwfxLRn3V6ts+pPnJuAQHfO3X0Y1LV7HdIqVsmoXV61GpYgWFKdrQLShAtoJyAm4fV45ChMR+Bbwo1JJZgna11CL68+fPkckswozkllJqzZnwAQb7rb7M+jfbWuq2LNiDj22brqFtm/t59t8AFuz2a9i+6xbf2brbELlm66+xZo1bNXrV690APFv329i667urV7E7Stq17F9m+zYs2aFmzADxbbQvs2LPZn2LaNte6+z9izfdYsWLN13ABcsW0O22z0Lq99mvdDi+++26+z0rufbQowA42O2+xYuiefZnZWnFc7Bbk9OjCbDmMIRZLA6QVuDNWhEsQAJp8rbRvszsaus3XULbM3YoXz7a3x6cm6cpLRyAF6xRqT7NWcnaF1GzYq21Z91O2Qz61ezbLVqFerADRQvl52Wv60zKVK03RqRBi+Ynzk+rKRGn9eTUJutABYsya+S1puTQwTsnkUkjV0pJLFa6jYo0Yps0asUUo9LQANrM7dMQxsWYR60+GUVU5WnBjrV+Xqy0tHp9GhG4ZSlCARE+++rPs2KUpLVbpihfL1LMzZsVbFOnRsXT7F8AB+UpW0Lb6ds7VnexfPoSltC2222Wn2ysxSu4A82aPP7FjlL5DXq0LpipRvi6zArYZysZRXBThAhEhxBSgAJRjNWbZ8ryvK0r52vbdYr31b7F9S222+vdKQAsV7FipbIYXJNE3BokEL8KUE/B0iFBvnwUFeFqxBrsz7oOts+zADfYoXTd3Zg52I1CPYr2eDhVtn33UY1C9B1kFSN0Yln0Lo7bPjspKys3Kysll7M1QoVbNs3So1L5WvfPto2323X3W2bbN1SfYnxNV7F9ehSsx2nYlI1IqVmVs2Jadsd1t/PvpWeffbPvus32bqdeOWxqrE9aHFSD26EKxFktKUr7ZPKSCfESXh9fEa+I0k5qOSWGNtCJbNm6xz45dfbTo/ZnadarPpxndFMfhOoz6M+2vQs1qU5O1ZmQxPNXRRMUb43U7PYt6deZsUqE+zfdMSWKrYmlocRhCZThLmoK8ZwW58HlOOykpRiq6+OyaWhclYVZyL6lGpE1a2/sV5SnfQvn3XXXX3X0OffP7ehYp3y/K8pfRuoz777Nmz39m3vvvuvu7u27ttvutn2aFehz+hXoXW3W0PsV77bad1/9m3uuus3Wz7NGtSo93QsW32O3vs9t/b9t39tt3239t33dvf2230uXvhDhdgQcDHgIOC/A3wVqdaU47TlbMr83zdvRl7E+cn3UbMO6F07Qr9ifPoTk5Zl61jpx+tZl4DfAx4QIGe+vbYsUK11t8alZaWt6d111CzdSlLFG+6UtrWJShSuqz6F198pQn20LFirVtp2a1ttmjbY+zR619m22xfbSsUexdZnJWxOTkrIqt1S6fXn2KlShYvoX3xqzWpX3Ub7qNCtTq232JuOVZNTrUZ9e+6pbSus32LrNGnZpz++fWt7NOfUp15yxVp3y9mUoWZScnacno17Z9aOT5LdNTNWjdfQoTk+jdTr1LFejbK3SaGcBTQNsBcwCdnav3ykbi+ViqhK3RFoTcM5WfQsV6NmfUpT7NeajKXvjsU2xhKzNDjVC+HfF1sY0qtWnK0JqSTUfvj1mR20rqNiSUa8mvnacjoy1t0+Zm6sZSSI0en0p26TyWQ0ZN0ac7N1q0X1LE1DGjbfUoTFGtZnYmoS03I6MrEWtTsUJWRTEbjkrPiJNyOaiWrD+lPq8ZxqSUJqKK0dk9GcpTsjtt5qZmJWOS0knxN17pejYkE5HJ2dqyScm5y26lN2xuzNStWtVmqsknL7MxWo3Uq9Cdtqz7NtmfSnJeRc+TSWjQrUr59mrMySYnYwp0KNiTW3X04GRAM8GuALkF2GUB8g5yOMpBVmq07KVrZ9KbmY5K1penOz4zvukFmXrxyfIqF03QkUauhZguzF8ZQM0CygH2AxwkwVJWlMSWdjsg6k+hO22JPdJLa8529sK8DhWnz7FeGMPaEYRnRrwvQTU3Gowkk+SytWvZjVsn4osS10TQhQzpdifzti6jJrFi6rZszM+btq2ynG6ExYimhIu6jZjUl5q2+zOzkzLRbLTlSrbQsxBk9Ts8Vys+xLRLfQsx+2xfE32JezbbQuo3zV9CxF1WldD6zPoRfYktOt8+jddfLX33W30Lrr60T0YzhrD2lF8tfPjUrWpUpLNTU+tYoztKhJq1CVkktOy83RjOjA0QjQtRJMzdmIHddZrQzn0b6FmUmKFTiSUo3QyjdCWoV43KRHujlOCimoaRqDffGVsPZSpfD+lX4iWI9dGoFXEl8xYk0EFAh4thQh9B9DDDealpynZpWbrE++2xRr32ad/fLdt9Ps2aVn5/dZvs32291i6+zbbfZtpfPlLrZ9OlbPuo2z++fSsz75uh3U7Z2fCpbZ4qn17Nm6+22fYr17611e+rWr9e6xbZ+/t7uxRt/uvvvtt7aHXoQWoawc4P4FHFcK0HcBA2IL9eBothQ5PXk8p0Kl85J6MbnaFWcnakjl7rpPzNiJKde6fQtry0ckMZRVOQa4jQWYC/gYEXQRkGGCzBhglIBOUp2lWvvochoULYkoSWciWaiaxTrXcrPtnJW26xfYn32LFtmfPrd9mY5/TsW9m3v/upXz+vPs17rN8+66hf2LFm22rfbZm+fdVu687db17a9izKT5y2fV7q1O6+2+++2hfOWJ90+zVvvuq2LrZ91tWfbSsVa9jsWezQtvs29m2pfb1K1LpX2altGf0K1ahOWJSfO8tO05iVr2bFGVujkH90RYZxJIIcQswKyC/EWM4M8GCCLoc7RlqNtehKTlfs2bbNHq20rNirHqMdnJqMa0fsy9aWlp85UmLZevSvtj11aWr30pelV68xZvqyO/mK99WpGVs3EkpUqVZyVhjGM5bfSiy+Vp3zleXpSWTzMxJYwthnz7p2fK9WOV5FPtujk1bG+tGonjUmoUpHUoTEfrzEvN0Z2UlZaRUI9QnLFm2pO3Tl0rHohyt9C22p07NKS0+tQnLETzk7QqTNDvn0KkTz52+xTtnJ9G6+6zOULa91K66+hYs0OjM8+OWZ2WlaVWrTpVYyiFI4omO6hL22z4HivAU8O4FTCHB5FsarQOMlh/Sh9fXl4zpXTM+dusX17bFe+vdV6XRpy11f61OvHqcRJqD2ciehAgorgVtWBUw9gvQboRIV4MMjun22ybo1pujUnzt9iajO+GVaVtn17rpavNT5i+Ik+Id0pbVnb6s+hQs0Le2vVi2C3ZtmpaMKEikU5dILp2S31Le263n223XT6NWfJpLbYkdta6zWuqX871aEpUo9K2xbffd2ZSboR+v2LqvJqUi4xvkFsX3REoQvz4W52FinDDJIw61SU49NRJSl59mlU611i2zYts9jvur0rNmzI4xl7MM4g0bM+cqRNGozuo3322JNbIbNibks+vOQ4iHBkgoYL8GWlSn2e+6zYoy9iJ7ENpJB3UhCtgpTkFWvChG4O+D++HctDmvBUnYKUMYPOD+lDaTQ3jVscqS18jvtuk0xPn2z6EnhjBCQsQDNLQGKFCHczGpihdSvoT7Z91t1ttm6262f229m6+26hZn20J9tDvtvutn228+62+jZoT59ifz7FG626f//bZtn0ruf32239G6+6+62+6zfZvs2bq9ts+zbZuvtv7v7bb6Unts3X3W2323W33WZacgvQc4EhBIQEZCLAdYH+It0gqXW2K8fnx+zLRyhQjCJ7+rJ5PIK85ZlZ9mjXumpWHPSm4h2y0anyOG8QpyIcDjATsHOIEHKHMKMR4GeEGIM+626xQrXX23y9eL6d8aqy0pdJJatSof1qc+fSs33Xc7YmL61G+fddbQt6lGvdfddbQvttvvq2z/odKfdfXp3VpblKU+2VpcvYr1rrHZvs2K1mtVvusUbNejPtlLN918+/voXV6FefTsUa1mjWm6VSfPs/Rn1Z9/bfXuodtevSrz+zbUnzsnlLMrbXmbZ9KlbdUoSaUtoTM5S5i+nfbRvqSlWPTkTwiwO0FyCSk8AQtGAroOtihfG5LWqzk7J6F999WUsz7Zy3ttl5yhK8MoaQSlmhVktGQUY1PiqfJb6d9KnLTkzXupQ1jkSSWMq1KxIb4zoWZBfVq1IaUIa1ZJLXVInlojVoqtg9pXXSGzWoR2vKUpavB3GVOMpJQtm47bE07zUjl41d2w/nxqtOR2+TxTOWLY1OSlKUsxlN1Zu2rGExFM1ZjUkmo9WqUpSlO0YmmZehbJI1HIaR2S16PI581HIaztmnVvjOvUvvrQ4iSUlZexSqUq99mTQ0kVS6zXuoW3WLN3M3TsRp8TVJWtNyl0vTn17o3B5DaYqz58dkUvLyeWgQ0ZcB8g5SWMownzUcoTsxHqNCvdVo058p3SalSsUJavRny11eWpT7NmhX5iPyOOxqRWJNDGDyUksI8G2AKkBdQIaBwmYZSSzI7M1SjPi+asV76VelUo0YzlqdGxdWlq9OZsTMdmomqVa85MX0b752tXoULNm2Xtuvp22bqdmvWnz7rrbNKVoVa9evKRXMcxDeLJexFvXn1pqvJ6l0xORJDaVjORSS2jChVlohRFqVq8pG6MdvnJqhZrWbr58mrV60+zfQkN330J9sk7b777rbPP6tC2xddZvrdKUimtMWw/uiuKZiIkBUwqRviFOVY1Qtoy1tmR0+dpSOWsQmUYSY5AyY9CRG4CBgzQW4Qq0SwScE5LSOJIjS/ffB7DGBFxuHsrKT4LVCXlp9ttGEClKWx6fQpU6dGhGqMxTq1qsntt7ZDJ7HO2aEbj8BPwCWnYRKsfhQgU0pK8GmdkEggUsRYzjGHkrIIhwGeRxAk0H9mMa0NLMX2Ym52+Vs1raFmvYn2330bPz7fs333yt9C2tbPtl7aNK+hTtpUZW22hM0aV0kqzkhgFTM3V4BVwq23wmzFG+x22L7599St16lahVnK1exUrxqzZvkl8c4GbiW2FThnPgiZeGUehRh1B5G4CQhzFETUo9L14EDbVrQX7adeKbFmxDmXo2OvOUKE1JbE7N1rq19mNTdOOXRbOz7HIZirfOyvAVsQ4FZBMQGCHspEkFaGkGaDFBpgookgmIGeCigzySA5XxG61tCxNzNGtDKJJWQ07rM7MU7atGhT6VWz/Ws07p9mnbbbRpT7Nttv17E+3n22338/s2b7r7a1bn061i2dtu+xWutvvs2e2zfbPu7FmzbbXrdi62662+2nZs0rFj6993QoVvtr39mjTqV75/fQpz6N9Drd998+++zbTtoWKt1ftqV7bbezGpa2cm5afYiWVo3StafHIQLEEHA3wkQK2AvojwcIawgQxhWhnA9we0JWldKz7Ft1eNU6c7NT7NKnfO0KFsfrzUOaFmvz76Ubtk1Xs22J9mpYqUKV01QmK85Przkgq0JqjKVOzXs316Nefy87NWZSPzshnZfoV7ZDZj1WQ38vPs1JSSSGItiSz45ye6Q0ZmWqc3IZNPqxlNxJLVKU1LTsmvpR6Wm5a+ORLHYaS9izTusX3y0rMX1Y9GqktbQo1p9vSn2JqhYp15iZnJHKySlE0S0rM1Zp0o7Ti+rMUZWzZlO2fK2K90pYoXW1ehQlJabtlqXK3Ua/ZsVZicl6VmhfVh1KXzsGm6nCJDKcsysGaxUmeJpSjIat0p3WaFCzZoT7NtK2vYo2bNecoUbEtZurz5FbWvgpSkrKQrzPVgIecq1YJWhF0GiBGxfClEGAySaDjQrV4V6MU0p/JrbNiT0urUjU7WlKFts+tXsxFmIO5yfESRxLI5yMJWM69SxbXnJWxfdXlp9CTRJRrylar1p9G6+7uttuuvsztC2T31685RktejbRs9vZl4yoW23W2e+ahjIpudoyav16VWXpSlmP2IpviaUl+Xny3Rn20Lrbb+zz77F1a6xd3XW2bbe+/7NC+OSlCjRnadmjFF9mrRqyGrKxhG4ttl5NGcTVpBVmLEvAeIBWQJCEKD2lCtAcrr7avfdWsT5FMS8ig9jKEK6ESrCPdCJOw8pRyPxy+N3w3sRZHacpK2zPORqtRsytWXmpPSm4ll4ki6jTn0JqGUpUlK9LiWH8D5IIFNCjAmY9AeYQ4KkUR2JZbpXUp99tn77e+22xdPvu7fv7b7be/vuuodt8+2fdRrT7Z/P7baE5QofbfPjVtm2+3utsU7bP333W3dm+3nz7r+37u22626227/u59eJIwgbIewJ2CegDRB5Am5aC9CLF9STRBl743Ny8tKRq+6Uq21ZNdJqUlpWJ2rSj8glLpSclY9EGFOdvkkTTkrGMpQmJSFqhGEmgOUAHSFWFyChhtD2ECHEtMQmQnysEjAbYmlbrexPqUZqxWkkxSlpeJaVLuoz6FChPvp32L590rXlaFDtus3W2LZ9Dn0L7Ni22xZoVutWsz7M+vYqW1qvSn9mbodG2hStlbq9OhPoXVp9O2fUsUp8+6rWun3W1Kt1alO1J8+xP68t20JabjdiTylG2lWq2LFG+jPtpWJ2jUlujQn3UetQm6XOUa1G+cpy87K30JWdj18noySnSmJPKRVOSaWm43Ro2e2GkFDBL14ewL2C1FkD/EOBvhNjktFdWjYlJ8+hWm5WZm7pzm5SbpSac7NGpDOBtu75NfGMVwyp2Y1I6kR68xWq0akvJZ2O0L58hiWQdihzMipzc3J7rMtUn16/NRXWl7ENJLdEsajcejdeS2Jy+nfIIwrxhTsTFWRyaIMWUIuqw2iLYkMii2RyKcox+K43JZy2S1Ya0K9iS0LrpyfKSS+pLVZyVtvlZaUs17bNif1Z2S2ZyJ6VGSW31Iok1m2fTiNMzFedlqcT0LEOJWWlbN0Vx6pKy1ChS7FWnLXdtm6vXjlLrTcxWmbZ8rY69Dna18M4V43DOQ1pJIJ9atEkmnalKbrWZmItStEfmKNCfJ45P6Fta2rXnOxYr3zt8tXqzs+rTnaFmxNyliT1pFbFsUQxl4ZVraMjlJmVmYGuBfwETBOwCvChHoZVbq1SWvk1Kcvr2Z9mjZqR66Mb6Mjn1r5iS1I/NXSCXj05MUY7Yn0Ji2UnJ9t8+VsT7ZixfdK2a98tzsdnzl1efKXxuhTqQ7oSsnoX215ylJ+6Z6sMrMQKkipS1aS8QbE72KUpL22LY5Vtvjls+xHb+2P31+Zto2KV1Cvbfbbdfd23Wbp8+++22hZ6FtGYoxjMwYIZyKWlpi6FaJoriqQ1aFKzI6s1MRbOUZazPiFEsDTFcFFE0A2wYIGFHYBgmIDJPh7bAbIAerq0ni2hPusRVFMHWfCFTunw4oS9CLL7Z8zbSoUqdifJqEpZiNKRq+Fmao0YgU5LVhenZu2IcvJ7MegY9eIFabiqJ7YljOjGpqdlIHOTwUNmAJ0niNDSAe4ulohQJCL4bRFguRAg8nIaV43JpaxTsULFti3t+zb3dvbbdYu7N1C22266+lPoULrqN190rXuut69GFilHrrboWbr599CxbfPvr33V7a9G+2vQq9ajYvrS11/DmNREmIDBFcL05AoIphSg7gJOHkanwC9OQXasGGxBerXXyknnbN8tP7PLWJaxQlbpS+tyktYjChOyaJZeM5HEs5GUek8U2Jq6tPie2+hGVKxJIJmUhThBjUhnxZDOPQV4aQLyDFMQJOB2hUgXMMYNUI1a26tbfPk9aVoxbWimpWqR2d5WlZoUKNaj0akxXn0Z9ns3c+fYpX20rqFmjYuu7r+2hWrdCvfPtvu77bNa+zfbdQqULNG/sUL7brrrrN9CxPs29tti7us1b7+jWv61Khf2b7ra9m6rZ+Us221rqVifXoT5qhTup1Oj32efYvsztGfQtq0battGhQvur17EaoyOrXny05Xur3QWrYBUQEDA4QuzEQIKtKH8ajkvFMIctSo2aliPTMpPr0JmrHKtWjWp/bZjdmL6VOpI6MvUqTlalWp1Ji+p22xyvRj8brzVKK61i+VsySTXyWhYq17FazdVvp31KcM7r6ccpcxIL69sVxnJpaTz5SpNTslh1FsYT6sYxdfI5NJKkmrRHqzEkjK66rIIksUakvNRylVsRyWsyknnx6IEvGo7fFdGRS0itqx2XozN9ijdbytmtPocntr0ZLWoSkvFtOfUiqJLN1mJKN91KM7Y7QsX2adGzbfVhjNU43WsUr6918XxdRrSWfQnepLULbM+PU45UjdmlZo0LrpWTRLdNVZ2fHaMgoV7aMx0aV0ks0rFaUs3z776187G7rNOTd9SfQk8lus07NjjdKPX1a8alZW6jfDKzClLQDnLQLaXgIODrA3QsQUoOMDnXmp8zZjGxfxdQpVpDHpSrIbpy2rdY4pnwS05GMak0dozdCpQurWJWtFU+jKV5a+22vQs3yvXpdtm2359i63vnKc1Qkl81bN15uYkUXyKRWY1Rj0/tu77b7redoz6VmfbTtodC2fPodC6hbQn3X3XXWaFtt1G262f323z7NezZvs22KFmXjOEiMIDTEGCxBSiJBuo2wW4KOUiyam5NQkUZVasitq2ZiSwhQvwQE1AmpLANcagZZ2K6McuqSl8musyk+77bZ8UysatlaFa2rdJqsloTdSvLxDpRbPiJRh7Yi6diJdBx5HIJy6MrFWM4w4ukUtJ43zMbodiWkkHGxOS8zVkEeo3U5BIJmhDOCYghIGNAkoYIFBHIDvDGBrloKdOHcVR2hL0qd1G2fdbb29/Pts919m6262623tvu7fu7ez1591t1tmjHJ9i2zbYn8+fbfb3c++ffPs3ULa91ts+h0badaUrwyi6BqiLAgYVYBvhtAoZSA8QkxPA1VOlIokqWzF9SnbKWbZri+JZWN2baFiUn1acesTV9ORRV1pqP3RjNRqLoVpuC9EeFexZtkcbimrOS0QbY/DaHsB/hZh5Du++VnJWxG4gVogySNwO0CugbYDNTrW0OvOXSCWjCUlJHHKsakUvH6MijVC+lMXT6F1O6xbUtvoz7admzPqULu2jX6FGvKdGjKVqV/Qusd1ivdbdKV52z2b7Ns++hMV5PYsfdO0r6krZnKF1tG+xS59CxbRoz7qs++bur2KdGpSo15SpZoTd1e2Um6Fm2jSttsTcpO8rQtrUqVilPs0ZLOXVZexZlbEboTUvN30ZqNzsblJuWsz6tix061CA1QqQHLmoH2BawzkERecoV45bVu5NQtm63EkxOx2SWKstSvoVqE1Wm5yUp06tSG8km5FTlYfWJ3s05epC/HpziHOzkkhetiurVknOy0moySHVW2Ty07YvknOVouoU6spTieTxVOWKV0Qo9JpuHUcuhvNS0RIfwq0ozlIfysrF8lhhk0+ORAj8knJeQTEYxVUpTUbkcXWZPKy0+nL0eIEUSsbimJZNLyalPpQy5JDiJbFihXvsWxfdbRtrRjH47fGcaoUbpaTxyGlCvQ5WrP5WM47Du2zQr05LLWeUiFFMli6Vuvs3UJqG8pKyCDylYk0lnatipL158pTutn810pWItiIVeMONVpa+/mKsrRvny1WnII3fEStdWsWJynOWY7M16Fifz5yRRbOx+OSenLTEkoyl03Ro8noU5DJooh9MxbIYfQ0gqQY4F1AGKGGBSQOEU2yt07MRnbGFiTyOUvnIP5SboS9SNdmI9GT1ojSWvO1pWtI5NTvn0L6daxZo390+fZtqT+zPs0JalXsWYkl4ojlGUh3B3GcrXoUKk3OQvzVWjSlorhtEkPakRoQoshNkl8RYtqSCzTjVWzUsQmWb7p9iz1LbN9exbbBlvv45bSsxDtlu6+6+A4U41KxLKQxjliVmY3JqU+OQOtSS2JDSg6zUHtWIUcj8hgioNsA+SWYpwgysFmhAXkfhQh5CPCbCJA3QAfS9mMYllJahAbZSUnwqWwK6AHuOVYc1IFlbYtkMTQJ6Vgc+dsSW+lRjdGxWhJ7b6ts+6Ba0qU+pdPowyvts2L6U1BHyt9SR2zlKAtIOUBQwT8FB8cgOECAgebEBhsVJPAr69mrZtox+AAFHL7NS+RWIXpyahfkvfNwEJGUPrMmksRofwyk87JozksRq8CjrVOvZt7Fts/vsWwJyfXnzFGfdK0JW2PS0ftgh+RX2waIC8iSHVOCRhcvswgyOBPXzPTv+I/KXUrMpGoCTlZSGUdjUbvh/dKxXO3yspAQVK6zYus2wV7HbfQqXwQfWsV+6rBgjkzS6fdfHK8js2atmKoxsyk7Tszl87NR+6dpValKJb5WtK8+lYr30bM7G4KCCQh/AsLpW2BLw0gwwfwV4zg6QgwMWFCK4WYN1aFeDnA5QqQcqsE3bJJSBvs0peH05zMNJJJp8+dq2KladvrT76kU3XVb7q9GWtsWLNa+6O2OpXn3UJ9mvXs3215i6+tVv6FtizYtoULEtO3z7NSzZs0aN9tmvQlruvPvs9axfPvo2bFGfWsV61exXn223VLaMrRvqWLqN8nt76N3dHalf76VGxdWmrFG+2JKXStsW0KVmzOWLFm+GNC2f2Z9eInXswVJ8xYgrwPEELBEySAJaIN0BCQ/hYhE4UIDdCdRm7FaEijdSjC2vN1Z903SqVqFirbUsV7aPI41dPnz69W2fdSj0njVClQrWatWQW9s3PunIvnK9ifdYpxRbZsT7b59CvdZlrbFezNTlCbjVWQRnEOH0YyeAv5yDpRhRhdkMQ49L8bjdiSVIJuM+RV5i+NRfEkxZhndI7MmjCKImiuKIZQ0hYkERoWYYxPEktFlGxPoUJLGFGKelRsdiPz69KXo2K9/dfy8pOxPHLEn6EtYn230r5FYkUetqxqfbdYsU5axbbNctDKWo2LbqF/Spytt0lmJSUnaEtQs33Tsmvq3V4ZX2KNG2hG59a6jR6EpVu7ZWbsUp8+hXpSlm7v61C+zZurWOzS5mJqltGcr168YXc/vrTUCfpcrZrX1oFtVkEHSlJaUNYAuzkiqQcYOUKkKUDpBvh7VhX4XpWCvya+DbXn0IHGtKUIjTsvRvqT5PZsWad1S+YmqFStV7rNtOzdTodGbla0mto9m6vb9s+zXuiPKRlVnJq6zHZqOSeGUOK18Xw/s9a+xdY7b7bNO62lYusWaltidr3WJ99j6/Zvs332Lu7pW0bY5NylGJozhD4MMZQQklgcYaQ5iWJY7fbIISqk7D6EyDfXg4wPtskkk+YnKE7GpSEmQwHyGCAbIOUCBghIllqUHleT1Ic2yLvlL6c3WpUJFbZuuu6laS07MilenLTk7XpztmtfYtr1+2zf0q1WxLTdsY1rFaMr4j2ZLWk0kvmpaJLMnr04thek05YnLpPKRnRsxNDmJYcxLHoknys+OXQxnYLEE3CFMwgwwQREHGCJiBAlrEB2hvBmj0KEehCiaLJSNS8pyt8pbL2yvK2ynTpT7rrM+66623tvvoc+zRlqXPqT76M+lTo3y98zbLWxqrDuTQiV4MMQYIaI0AwQpQDtSgU0cgGuNQHaECCrNxRGoolZaYrWenKSCN215WWhdhlYlpmQ1Z2zSjdKzfUr2a18vUnJWcnYyg/m4ziHJLZaTysjqzUimK8IcUzd9KPSlSYjGJpufFkgjslnLMinzk/j1spTpQw2LpqVtnz6EB6gX8J0DXKX0Lqs7KUqktGN8X04/MS1KjUnLZWL5i6WpS0zUnykmnz7NWhLVqNs7RoXyt/UvsWadChbRqULeVtrWKNaz17a1anZrW0a1a+lWo2a9C+jQrUqFmhYrW05yjfdLWzlCffQrWZ91CrZtn1Z91mhXrUaVCvOyk+MpaxPs2I1bWuoz7M7SoREmI7Qn1bqEimbErdJ6VCrM2JejNRuTSChSlJLLU52YkNmtKzleBqgK+XsSeDRA9wbYdwxhcgfoNcEZZnLZfksbiHKXUZexFMbjdirRnbNspIrNicrVLq0tQoRuMpLMSsQ605F8KMloT5ufHpHFknhW5W+IlKGskieYm6UkqRNLyCPVYZTt1e+KeH91CtGrFKMYliSIkrQpwvTUJEmiHSjU5LT6MvBJQ0h5Ug8nxbbHIfVogQiSGFKFm+IctHp2G8YQ7k8ikMS0bbolqUaM5Da+GlmPS0hmI3NSGVimOx2lG7pyhRmqUkk8+6rHLMpbdWkEcoVZ2PT5aUtm7Z8+WiWIEmhtbWkMX3W0KnR7a90NaEWQU7ruzfVutrW2JaciSNXU6s+2vR7bFicsXTlChRpzc+rDGpfM0o1HaNa2Yr1a8zKULFWWqykxyWnKdeUiStNSe+tGVmxH68tGUcjXUoV5e+lRlqHL0K8zHaEUUYf0oojsLEGGTQkQ7iitFMH8ENAw4CFgzwQ0D7GpfqSt9m6zS5qNVJeOxyvFEjqR2YrzF07EWNWZqhXpzVWdn3d9m+/oW3deldOy8+pbXtjVCZtl7Yd045I5WN2KEj5NMVYwpRPDiahepzlOD+tF9CId1a2/l7NWfXq2LrNW6tXsz59i22tfQtv5mfOysIMrIJeDFYscD7GoxpwHKN3UIHulFF8HsliezM8R60QJ2+FiDrXmZyFKIMHCjB7TiNKwHOKYF5CbAScI0IlKA704G+zK2ZqOStGclJa6UulL5PAB1vmpNEltt/Nx2JJSL777MY0KspVj90lkVi2hJZ9nkV9ilILFCrEe+tzU+7jKxbUh/xuRTs1BngWNWhKUpBAREKNm6aq2xqWr0JjpUZa6hfJ60bjUTSWI9eGtiS04He+DnFMAy14VroCFnIhz4AsysMofwKKSykggTkcqWwJOvTk8CGrU7MBtiFHpNA+R2VqwPMTVqUDjDic4HC2nfBfhZgk5WFCNQLuTQGqhE83AlZ8XTEA42K0rAFePzscgI2UoUoB2sxRZgQFCG87BkkcHcSwxrwxumfn215TrWK1GdqyONWztt0SzN9KWs0aVWasT6c+lL3160+Sz5PdUkkUTFSarye6VnK9ivHJWYpy1O2zGr7F1/wT9sPY5LSOlG4kvhCiilGqFaECpD6DyxBMSaBE2YPoWYlhYh5PjGcpy1ti62f0qsxEsgtimjJ4zjdeSUZirQlKNWlYn222KNt9ilPk9CX5axPutr0OTX0K9C26zdf3WatifUl6s7Qtuumr598+6VrSlWf1qNGtTtpz6l9GzQr3X0avRmpS2+Xvla1i+zWoW3UOdvpVrNKndbfOy9ChYoVaNmM6czPoV5SxUmI3dKV59ftjVS62hWsVpiVm7beVtmeQwxgdIRYAmwH6BngoICthZgyQ/gdIWIC5lacEDYsyavSlKMpbSm6lalJ7MbnZ2jPm43YtoUK1m6zdM1rq1GRSOnQiNZs85PlbFCrUjU+brX2aE5TjGV5nqVJihVrWb5vupVrpq6jZv5aPX1pexG4tiLKQcbqsZwdYOEHCJoU4toRJB0rylsnj8libks3P5eWrzUYRNNw+uhfhzXpyKHcYyaGkG+tZl5iNzkbnY3KSeSy9mfN1bMm5uIs7QlqltCnYnenOztKnPvmrpuvdbSr2La8ektsVyC6QVbE7x6tdLcgsS9mY7rr59ti+2hdJujTto1pyZqzViYtvoz52lNUKNKvxqnVsXy10/jOhRhrUs05aTSk5QpT5ebqy/WnK9Wvf22JaJLMmp0KNezbSusT75i+6jWo15W2hJ4zlImlYgSeGNijE0eqTU7A8SKDhNQBfl4OkL0B/g5QOEE7bEWPUKdWzPo2aF8tbxyZo06UniHK07b+nNzs5bVoyatOT7p9e2tbfd2brbe66xdfXs0py6YsSkzLyGXlKc1dM04zpVbrb7aFKlZtpz7p9itfXts2a911t1OUm59s+zR6dstbLVonk0JE5A5RGgNscgfIZwM9sF+ViWKoZxJElsdiyRdSS0IWIRIZRnbC1E9aDlDOUhbiPFcmj0MMI0XwGmFOBUTsF+B1p0aM7dbLUKU5KW2futsTFsaq9m2cs/Zvvk1SRUYtui+pI5q+ck8+T2L6/16MnlrFenXrUZHYqSarzVabpSetO04iQhwSk3FcIV91m6M4e8r0LMzJ4yrSelZjVO6Ws1a9CFqRXUJacj10zK0bMYwoy/KVonsS0xDOTQQcG2AXaMCTiBAmoYIAoy0A8xjAFPgVUjgC1dAPUIkCkimCJjGBKxuBMQ+gGatAhoW4BflYEZwH6hCJBNwJSEGjWgScPoByk0B/i+AhI5AoYZQBNswC3KQHGXgdoS4SYkg8j0Or4plKFefTi2Yg2Qu2ZWSVLpNJaElukFaaiaR0Y7dZj1irRqy0Uy0tdJrbaMtXvoxurEehJ6UbsRjB3ESfE0ZQ5loQZNC9ORVOwZZyrJKUxbH5evWpTEpOXR6v2a0pOStKxxPDBCbMwxh5Qp1/sU52Ym4EXBpgrQOcxSvn1o5J5JbTkNWrNzVWWsysvRj9t0+Lo5YjVCWtp905KdCYn3U7ezToT76NSlK0ufNz77uVsUaM+6fZo3XU777Pf0qNi6zSs2yk++V5DQvpXdtO2nW6FGcpXz7vp0KXYsSli6rzM7NUKdGVrS9iRy1WjXsxJXsS8rTszVO+IsSRyZmOWsxfL3TN9sfn3xJXl5yhOyWUvvoWKdWVvhtDDA6wJi+YiSChhlShvBygsQMspHoClgqxDkdtvO3WJaUs0bZWzKUq9GJpWMJerQjtS6M4iTsctkMfq8ZUZuZj8pFFS62PUq0lk0Sy983dJ5arYl4/OzEI9OzVsV7bp9iJOtLSOdksxHbpDEkNrp2Qy9CjIaVmIMLEP+UkEHGQRGkdsYwcoeRPDu6jCBRnYwgpRHmaknjKtKwc4Ta8xK0Y9Pp2w/k8RbEJNsEXbKdtWJaUnsWa0O7ZSJ6ErxZFM+WlO2PfYl+vRpX0qULlCUqTlCpbbZnZPEaZl6UUx2E+Sw+tn0K8+fSrUJ8pK9mhQoxyrJJ9iJI3Rm5evWnbEvdU5NdIZiO05JXk9W6Yqz6F07bdORVIIN9CSxqYjGH07fPvnIks22KUms3WaErykeimQRPVo0JynSksaqUZ8TTU5KRjbPk9WfDWWhnMcdi6PwexLDW6+2Lp2ZhfthnCjBYgVcCpi2BRwHCEyEKlLxFvkUnm7a9CxZqytWpdZl7HRm6fPvqV6Fexd1rqMrdfZtq2ZaOz69mxbKR6NWY5DGLLqNDlqNGbsTc19sTw0logSk3Bch5AdJJCnEWI1WAx04Yz+S1aMD5Ym4knbEzTgg7E+jSo3cAsX2ZmMr5m2A7x+VjCGNeRxnA90qcdhvZktaJrMhi2GktA104GabusQrVJWH8CQjcmnySBvhvDSANEFiHEaiqzKXQGSndPga6ErQttpVY1TpysrKTF8lrwMWATVebg/htd33RAjUCNiWPWKl0LNi2XpzFizBO3TdSGNGTTkCttnOKa0ZxGgFBNVK0ar1ZqAH2Icim43NVpSDTZnYiQLK6UthSgIqBRXQFp9ShQs222b7a1apOVbNC+jPsdiYksQYeTVszBP2KU1AdL7FGLq1vAnZ2+xI4zp0IAPZq2fORqjLQBbimjMSaJ5idgI2+Ys3SeZkkA2c3F8AtRNB5EWCEieByiuDXxAsQH6dnbokp214ICcq1ImkVmL4GWpJ6sM52nHIaRZDWAqoHCDHCRXlOxWo2K9/XvsyetRoS9tt9ipUvsVKFGxI43M16M+6jIa0xTl683QupykpO1pHbYsxLLxq+dleWnbpqh9atfBXgzwTkR4JqpCNDKA3wMsFKJoPZbh9A4QfQ3g6wg0YUIwgGWvESfI7MK8K8FmFmFarA6WIX5WalpezOcxxurRiaLp2pKQ5kNa++O0KkMb7a0+xZloqvnK0zdbfHbNtevYs3RNbbO2bNtSJL6ttCtRsy19T7NmxLSttal90tf2LPby9/d3XVpapV69998vRttrd9st2JuhXr0JifMXTtttmNUa1aZs2z4/S5DYr3S0flZebo3VePUa1tmd5inXr30LrasJNtG+BcRyBHQHyDBAyJBBEXTsFeCOg7iBDBJoBbhZh/ShhhNgOsFaBe1b6tO6rZmLqtt9W6hRrWylSzYsUZShNXU6d19avUoU61mfRqUKs5Tjkar1aNmVpWZrny1Kbtl7Eco0aEZ2zEnoWadGlO3fWsXyCTRJUnZHECDhClCxI5HH4fSCCVvk98glrolgm6tOvJqsjhvBJzcTS8Q4nlZeFufE87CTKw4qWZmIkRq8N4KUFmfIZFZiHDOfbPjcxK17a10dk8dmZmxO1KFS+JbF8ki2hbdfXr1Y1PnytWcutny8tKVpHZlL6caj19S6+t/Zl68mjs+rZ52YmbNKjQtmZ2tJ6E+3r1LqMvXlq0rbVmKc/vtoULqU106Vm2nO1atilWrWakbpTkY1qE7MVK/Q7EpUvqU4/IJDJas3d1J903PsWKkmvl5WNSKG0VWasgrRJbJZBFshuiuAdKshuglIsi2DXAPsxBRQcoDdB1ksQoQbYXK0F2hJeTWxfZm7ZNKzXI6U1Y+hOy1iYpUpepf1rrrNC7tttsXUZ/0rEbrxJdWiWdj1OJKszZl4rqSejVoWYHeRQPlGB9sQQMmgNktBA0YDNVgMnAa4iQP1OAWJyAwRqA0TsDbPgapaE6KYoimzSoxFieXkEVxbQiBHoNUG+bhehvViuIseiqQTMEtESxI4KkZQVYby0VSGLYmjUEDBFQKKCfgCjBTgdYEXVvi6lGUaiPGEZSSdnKs7WuqzFWpVkXbbPktDiD0e6zbYs1aMpJ5S6UnxrjcrOS9WcsxycjCWiSctk8bkE5F9GDfB3Auo9AVkTQBGykAmIogKKFKBhxnCtD+TykQbohQdK1i++CWgyUZnqysnj1KfHKF83W5ulWk0dqxjdIpivMy8ZQWYKCUhcmJNLTsgtlqEll52vZqz7pFSiFHKV8djVm6TV49ORVEls1E8+FizfLykSxbFERpejFM3f05W+fKSaN0KE5ElsrEkpYsTfSiDHIJuK4Cyh3AEnfAtoxhhhSgf4JyBNyCBCwD/Bvgi59bsV61OQyscmpiWtlaMlk8+co0LaN91e2tOzkpUj0rJ6NKTQ0pS1ONxLEaPQ4s8ds2YhSsFqtE8+KrojVZFXk0co1a1mfMV+rUjt8Sw5go4DbDaYhjE0jhPhageL4SoJuJIXoRYP7bu6nZgO0DIgeoGqJZ8vbQmZqJr6tSZnZ2nUmqUzK1Y9TrRq6UjOPUrrY3NxLRjt8en20LZqVtp3X17rZ9mWkspRoV41YjfLS306PLylafdZpStWldYp2JuhQpUq1mV6VSVn0rE+6hfXo07Epb0brFm+zRrXStGV69KxNx2hK0aMpYi6Ja/RqRu+zMXR2vfHOIcxL0YmkUzVjClbKWyktOSlsmpdKclaVCalboL8KteXrzEpGMzSjUbozsGKVunIJWCBhagLeOSe6LLPLRyWk8vPqxJN0+nJ4sk9ezHbooiNEsYVaEjsSWXjcrdMwuR6tLV5uPxFrxBhXsS87Ia0W2xq7ryKQRjI4g2JPPr9KWj1ialoroRyvQnzVmH0OYQpS+IsOa0Zw/pRyFiSSCdpRFhfi2IsHGEaLYWIjzViM4tgZYN8MoWIwhfhlF0KsSxldBYhRqQwRTNQdJqEyjH41M8zfGHC5dHpaKb4vnxPXlJaL5WGd8lk8rIbEdiefZm4lqzl9aWn0pSf3X2b6FstFMpF0SwuTF8ihNtu7Nttt/Ts1ourztvVvt7HdZtvqzUpH5e6pbYlaVic4kp90bus21Kkhq32Jy6zPrTkSTlmRy0hsXyOtfRn2ZqNzV1tCS3SstDexWs1YwoU4QJDG76kpOyeKbpLOR666di6hG4kg/sT68hp3yKXhWnxPIr4rjOMIQocQZoC5gqQ4gSsC0gQcF+C1BYpzFmxWoWLMbjVW2hI6Nebr222J2Vsd9ifPn9Chz7qPZjc/vrUJbl7MalpSbiHFdazGrFazIZmcmr7YrnwtSKClDiEqDjEODDJL52BqrxAjUDdI59mEy+GN0I9mhFMKF1OMYSL7+D6QQ5lq0lqQ1mogyS6I9WVhJlrEZRJElmam4ls3SGHFmCPh3A3zlSKIENHIOsHcBDyWPxjAcLED7E0TxJCHMzEvLUKVebun2Lq91s7fJJafPnJWcsxyvI4BTUojWYqr8+2MqcSxuHt9vCvbSsQTVa+zAxpyKKkBZSKKJNAUNmXm4BMzklvgKy2Q2YFjbJKcLlmFm++rW5HV5u+hOU4CrlYjQJmx2almrL15FbQoyejZtn31qUrXo0rqdWxJIexyOVLYt5LN0qcQ5LHKsg6MUxqzOxuO2a10VUaXDW2vxZQo3x6GNCrFHK05inGUgkcSTMihepQoUYJaxDBI4FlYlpuArbNCUgYErC7bUjcFFFcDxNyafAd41M2YDhwT8DLEGBfSOCl1a0tM3zUlqVJap3y1KxdYoW3TMlksvfXlI5RsVZLHp918ls315JQsyW+nOxhEaYjlaRdOTT68zPjlspYjtftvqwmTkKMQoEJDiCWhpBjjkKEpCBPnKEFngsXwVJ8Czg7gMsL8JkRIeRjCxbAMUakULEDND+CxC1JqspKzV9CZsVootsUL7okiSMasdtkFmJrFsdimpHq8WR2xWiSds3y1t3E11tWnXk18bs30I7WlLpm2+dlJPL2ZmjWtoW20KFeVr0L52zbX6dOfPsW0Z2tRrzE7LTEhvtvoWZm+xVtnKktMWxJOT5Sbqx2WnLpetZqxycmbrNedmIoviSpdQks+Wn9bn0qsxTuvnbFPvvr3U59WlBjgZoN8HsngYEpBkuimZg2RLCjE1eBtsQr2w8j8DVA0RunO1ZWblKNWM5evYn1p9WhXjOS0JW+T2LpW2+W59OjJbM5Io3OSsxQoy9W2Wk1m6nYmJa2vHJaWlrE1SoRy/lb6tK6nbbZlaFiSTVKN2YxunIviFDGI8E/DiHMhhUqykKUljsHchiiJ69mKoiQ2jcT0Jm+hEaPQRkiqwzg1U4ZSKCfm4xg9qxHhAg5WIcRdFE3CxFtaZnJjmK9aZs2JSIdePRhZlq9axKzdiNXVbqc5PrTd1vIJqVkdi2dusRJxq+NT41fE8mhvKWJJXlb5zvo2bFW+fbbZ5y+lQv6FWtfL16E3R6dizFMY2b5yK4Y2bNG22zdPtrX16lijOyG+Wts9Kctr1aFG++zZpSkZ8pJLbE7KU5ezNw9upTFKtRvoztOVjVKxffJr4WqE5VnZ8UcROHFKFOPxRIYjwfQys04jQPM+BbxDgIKM4JKQwJGL4MkLMOpPCHIaMzG4wp0KM1MU43ZjUijktYoWK9mzddK8+xSm7ZW7tsz7M+hPn1qdGYo9K2fQtny1irHIviPI5NHINU+UhSiPCtQhYmIgxfEeLpHGUO68VSkVxbLQznY5QsS8gmJW62nFFaRTcNI/J5SEeLIdysMqtGMIeSaLYS4WIDBHZaC9GMLk3DGBrgmYERQgOVKCEhBj0FmW5yKoX5SciezIpLLVJyOykUTtKZoU60+Xk1iWna85Hpuxfd2JSdmJ8rFnbZvr3wswygn74J2WgZFGBg8C6mYBVx2AqqUBPykBXRFgX1aCMswT0YxFiNK1I5ViriWlE1mJr5mzKULqF8+rO/KTUgiuAp4FpJp23nbFaxNTs1Ozsn4otoyejZkE+WjGLookkFivBZiuYiSvWqRRYnIlh/NxFm6Eitr2KnTqUp9sr1L7aM5G61OfFMH0biPbRn1aUpKTsgjkHCFuQwdwClgswBAXwLeLICfjOBXRCgnIewhQS8BqiLAhZFANMZQJKEWBshBl4lhdhlBooQvd8DDgzQDzBzgV85SsS1mLqfMQ/sxTNXVZLbdO39atKynXkcpDKclL6M7N1ZefK3x2nVjcxKS0ciHDe2fMWIWZmM5iTU5WhK2ZPJ5W+zdPlZFA1wwQI2GcUwhQxkUTxu6hQ7N1/YlKUWwW4JuBAxqHcIVi+biSC1BIQC9FkFaC1M2zFWW7Y7Vl4wtowvzHSlZmK4zpR+F6JLpSNTMtNTdSMI5xXQ7pWtLUo/JYkii6hSk0rPoRytZoVaHKSSUlLqVCRTNifL31KdtLr2ZSrK1r59LpXXUL7MzWlKliNz5NSn06NixLXSlCtK2ySUszM5bHa8hlqVKWkctG5BKzFtSSRulZiSRxXKWZWhEeOU7o3Jo3IIyn1I1dStnLpPZsd03CHBpiWHnQkEHlCckcRIlvur0qEJMGuEGPUIssXUIzoTtGQ0I5GF93fOyKrIqliTRhFUmj98WRNIpHElsVW1J8PouszszM0o7ytmN32Y5SszkSUpHNTvMT6teWsV760pXn06U3SoSWdl4fWbasvE0dhfjkioyaF+Joxla/H4Z2ZuKofQfQixBh3CDEGECGkRqVsGmRTsZ1YJ2PwpS1tKDdCdEKD2HUxCnMxPC5BYmIUL4zmJ2tJrNmUlbE1LSKTxPN0bu6vbN0KHHOvRiaVs0I3YjONyCQUpLfPrcds1LFttmxbMRnSqy85ZnKVTl60+LKlmdoW0Yx6HbbSrysmmKtKhdTtvsxJDS2pG+LIKlt9OtTtvtqyt8zZsxyzfORyRzMvXmYnvmK/Wp0Lac3De6fG5L1utNzV1GUh1KRbIZqRx+6drRJYr0bYOEWUYkimWjUH1C2UnYWaUjtm5NFkKE+pNw3jVGIEFiIMQoS4N8BJQdYCFgvwHGYhKhIgJCDlQmoWYJ6Fq+LbEPpNGVeLbYMdezXhfnK9OCisc+DfKy0fgQl1niSYiSZggZiGUSwkQvwb7oJ2bmqMJkWyG6HN0ejkM4Vr58A8x+D2YhxGoskkSyOO1Ypla1mDbSiriaxDOhKSenE8YUqtGAg6sxSuow3ulrEbnx2HcehQlo3NXS0+GsxHYno2LFtGPQAAJWL45YjC+N0ZyhN2ZyxdE1GzbdYuvvszszy8T0oICcpUJ9svMRVLSkalaUHSBdxhWieSwYr61sEHQhjGEp23wNE/ry991t1tjlu2j2y90rx+6K+G/Hp8bqwQliECYiiPRVDiNwUobw1h9BGwCtjOAY4JeCPjsJECRgiZ2B4oWK9ezO1YBbsT5qvY7Fa66+66jOQpytmTcbn168YVImto2JSAJ9KboT5SXvoyejMT4spWZm2jdMSlCfL16dtKxdPgQ1vKxEiLIJaFaJoogdYroRlKQ/lrZizXrTM1NSOR2JNbJoDpRn15NYkM7xqPQdy8YwTMLUJMHkKFCHFedo1r5u+hZj9CKL5yzZrVK9CTVI5QqXyCCnWnJPUqV6c5Xlo5Wi6PT4aT6MpHpWnSodevWnL5iCV7N0vfzEVTkdjUUy0dmIA33We66lPj1iFqdqR+A+Q3gEpQoX0q8mhhg7iHESL7Z8YT4AEkK8G2QQbohRFnIUrotsQaY7bOQP1C2PRCm6kcg6TdepIInpzkA4WZ9GtJ526Fu26dq0aFmCzKTs+2dq1IhU59mpVqcEJWq2a8+hMyepOX2e6xFFWrLz7aPZt7N1ivVgOErZsWbezSp2a1SrfLzli6rOWLEtQpT5PQpylKCJsU7NWxJaMe77Nmty0GutOzk5V6UIF11SxXr14FRSunwV7PQgvXwXYZQHaAzwnxPAf4JCL4bzUH03D+BjQvSCM6FSVieG1KCzA3QXKE3ZtnySO160+jDGTzc1Xr2LZu/m7pehy0xQna0jvr2JPYo05efFs+lO1LatadvuvtnKcnvvoW2a9efOzlt9C+xSozFWhfZs28LdKajcR52tEOSQowT0MEGqGcKNiFeLY5DuvC5Zn2xLEk7XnYtjUckEUUYcw5g+iuJpyalafA0QkwUoYIaxVBlimvCZJpJHLqVatPjteNxJKVZPOxNKSt0al7atDun3UK9999mhZnKsklYO43O0pTpRLToW0LbbNe+6jZs1ZSjfVqWbNSrbbTulbNteGcpKVaVC7mLNmfPvunyKrPlKd1vbQuqye62pYrzsTT7aFiavsXS1CUlJ2TX30Z2+tKS99ivQvownSO7uuqREqU4j05NE1s+CPo0JDEWVg6wRcfhDiizSnZu6AjJ26NxnJaMGWvf8iqxHhNgjbYXYJiS1pWfZg8rQaZHDiQwwQIqG8AYZJAg4HaESbhlZjkfrSSrP5maoxnWkdSQysZ1p2dk/Zr9e++6+62hdHbNm22zVsye6vXunInpQxnZuAXIVpHI5uGCdkE3JIyi/qSSTdenxyVr3xNF1eI0FHC/YiFGcbg3wVIVYExJ4G+Jo5AywsUKsL8lhZiaL6ED/A0wSkEHDKGMcr168HO+IchqyOQQWIi8IFCFzkkN5uvDmT1LEdqXTs1JYZyOF3qVZmTUbpSfHqEpxJyvPjkhg32YNEGfvt7F0GeFWM68ls1KvXlq0cvj9mJLYnox6xG6MelJWVo99snlJqzVsWKUSxBga4gwDRBMQCIglICapwDVAQEaloKsEBF8NoCkgExKT5alWlq81dLylapG5yG1SZkEhlpHGUtRjsvM0JeRRhY4bxAj0++dn21IxksUzdKRUIwjVtmMpDO0ZyfNVpDRi+YiDG4e2YixRFtiH8xEaLoIWMoETBlhJgL+A2SaEuKpmjIo1BQw2g3xAkcWRBm4exZdEeaimFmnF0+LZ8jiWRSkPbEVwAa4cQBQhggna0xWqUZHKxyYmpeLL77aFmOUKFGJY/JJ2rJY3NxVGNWvGVaS9KRQ4qRAkcXy1SXl4c8NYSqVSxMzd9SrZuq222bNKM4hxRD6JY/FE1EsxPtoX32bN9tnlJPD6UiSV6NWjQgaoJGBFR6EyEWtdO3wVYI6BLSCBxhMhrE0anJe+vDOI1KMr5uFSNU60HcP6EZRfGFW62YiWakMvUpRuVkVsN5BdLTszXjUMrZ9DrRuUszstN0J8ZytmhGqE1KXU6t99K2Vr3Wys5G58any98pQjU1ZpzM7HeUmLpBTpyt9aKKNiYksao1aHSn1ZWTT6crVtpzMxII1HJNLStatI58tfGq8dn2Ja6MuYkstN3yOvVnZ85bO0JSLIgQhQZKMmtkd9CK4exVBTnYyjkv1p9SWjXI69CzQsWbY9Ym7asbtnLZqFmD6KoriNFliP07ovoSeblJJFszRqRytTj8IMTW2YsnZDZjlilKTtGSx2Xo16sdnal9D7rbE+22hXrSaxRl7qUijl8jti2D6OQvweSaEiTWakhrxDjKxwcoVJNFsRIsl4OcUQsTEaksjvgeYjzEYwjwc4S4TYF7BUnI1BYh9NQ/goo7BwimEWZhakMZ14poV+vZv4kmJHQii6Yvm+Us0K1WUoU7p9WxdORycpXyseiLPq1JFPlLrF1tCRz690+hLTUYULZexbdZ75W2fKWakrJJJffbSurVaF9StdQo2OpUqVJ8+xIadKIle+K7M7Jovoz7Z22O0pPXia2cr2KNatP7+XvlK9To04xlLF9OWiBMzEghOrxfMyeOxlTkleckcSwUoMdCvK83fJpebkMtDWIcEzMSetYsySlFN9erEWUhOhtDyMoKKMYTYHGGcB/gYcB5glII+zAGOahWvgDDGcOYvgGSrCDBnhMi2D2bj9mO29W2lQlKcfusT/jliZpRupHopj8Fa+6dp2ISJBUhzE1eJokhBguzUMMzFcihLlY7Jo/Tk8jpQ1h3Q4RIiw+h1A8xRBM2IELHpPOQoQcYLcahIm5eLoKkkhGloDlFkWySByp3RhA3SGKokgfL4RK1KZoTdm+xdSnIprytOSx2jWoce611WtTtm5aas17NKTRlfELsWzFm+6Ty9a+ZlZSVjCCShYl7ETXV6HJZ8Vy9K2vdMWZ2hEltnjtmjWo30LMxKSCXgpy8MMUQDHCBBOTEBHxyM49AIGD+CVhrAH+vCNfAnasFqPwQkLEB6gkoLcXQPMHKAp4O4AkoDtdfSq160aqTdWT3XUZicktSU60pOTNG6LrErStpRZRnezOSkdq2yt05L0aXKSnIqsflowmOUjGfKcW3WysPqczdDBSlJLDujEaSQfQYYthZjVGNzMjnYsrSOlGdSSWZeYuupV5qbjs+MJNViJESzK8IsFiADRBPQbr4J6GklnJyJoypx6Uksbi+fWtsTnO2yejO16VKWqzdmzE8fr1ImiBLRLNRhUpRRMytSZmKFeXum69OhOXXzMmmZSvVlqkvDWVsS0TUI5QtvtqW0bHC9wZYCpiqBslaUxLW1IaS0Lt0ERwT9sCIi6HElgeoW68hgRk+LYjwGWQwdw+imRx6ZvkkOe+rH6FOKYtm6Enmo7OVY/fDa7k8pZi2rbUpx+jVlKlOUkE7RsStinXs3U6Ekn0KEasytetO215NMSteVs0aEZXU6lOhHKNWpd0asdo2207Fs+JK919CzGcrEk5FVajQh7LR+xFXLWIgXxPJpavGpe2jG5yPWzU7JZ9teLLMinZyjYukvZuodCfNUYMExAX0CCgMsTwmcJ8R4XJaEichIhZhggmoWpNY74Y0K0gghJmbmKlHuk8pQs0I3V+JLMmpRRTleNcxffQiefPqTd9mVjUnpTEjoVpuxHKt05f3ylSfPnefQn1L7HQ6V05OWztStRnatCUs3RlCrGdCSyCG0xBVjlSLo1BvhKksxDLg6TsfnyCH8H0R7ZqYq9WEaJ4ym4dQ1l43B3HIugl7qU5BwlIhwVYqhFiNRk1aQWZ22NRPdFERK9aSR+JaVCnbQl7bFX6M++V7bqFtaQ0Izl4qr15SjbfOWON3z7FivfQ6F05fbWsz5exPvlKt0rbYoUKtOxLz7FCnUsT4woXXzt1G+6+zYl6F9C2jZpUL5mnDSTzs31JyOXTtWarUeNWJWvL3WK1K2ar0bFCjUtj/JJPZsUorpWbeXo0p2F6FujD+nDqZrTckjdvSk103AtoNkJl9ePWLE7KQvTNsLUQZ8ahjCBPhFkkYQY+H/FkWz7ES8elYRIiQIqF+AaZJAB/EkCDhKgcYO41MV5uJJHLT41J5jtts/XoW/ZjsJ0EfKw7iWSRuEGPyW+T2LYhRAiqNwiwqQnyGC3Bqgx2YIOFuCtUgqQhQNMLkFyKoKsMENIugeZaPRdRhtOxBhEierBQwmQdYDbAyIEVC1Ad4dwNkHcVxhPjUhhnHIjyOZk0xPmo3DuajcUxyam5Sbg9g0RyJpaF2fDa6Xtr1pqUtoTdaXqyaXo0oXZ2TSaWsXVJFVnZNGdi+T3VqsvIZHILFGhdbdYnz5y2lN9mhJebnzVsir1L5qrV5SRwixbA9RhAmIU4ATIJGARUMoADMagDlDuBQwMsTQmSOxGEpEaxC9Mx6BdwWIHyKoWIS4IOIcHsC7gCGla0pZmJJMRqQQ0kc3WkNmJ47GMxTj1adszkrGMUSOFe6vfO05m6PyWhKSeQRqW6N87ZpUKkcs0599iUrzV1tatXqWas7Qk1efGVmMpSZqzEcgPNCtKVa9OUhhpd107MctfdUn1JHVjU+ZlIyqzcR49Bzh5BVgAz2IBghhgmoiXxbJ4gzdKN2ZiduktWxJLEV1L++2MKMeoyaWk90H1mD6fGcVUbpFFEN5uDpYia2xWl5LRk8hlvk1stQtkkijU7E8embpmVqz+vffWj18Z2KFi2F2HMJ8KktRoRyVm5mO0ely1OBxgY8A+wrQIKDNEsPJPxVBugN8PoDlDSDJKQyj8H8TUomjKTx6LZ2K4Z1omiihGUH1aGcMaEXSOD+H9SOxfG7N8M5PJ6M+diiVtsytSnL1ZavKxqVksanys+vfStlLbNWhdZsWJa+S8zVvk1aNS1eYk1KxGFsxOTkhmI1I5SOdCckMMb5SdiahHYwmY9G+XieMpPHbY1Xj0OJqfDG+lFEmrRGus0KU7K22JWbrUK9C+Usy90zJ45wGmAsIGWHlCnFUKUSwizMYxqIE1A9VIxvumpiTWY5GMUWJWVjtC2K45MSkxGpHH690clp2JacemZvnzcck8U0qM1FMejkJc5U6NKhbdbdQiNKTlSKqFGZiebk9OjPievN1ZaxVtk8xLVJaarUpFGod205DZi6rCHCpJYRYU4XocREi+EKKoI2JpLCLDeYiPDKPR6IEkq2yCXgpRBhvCtCvVlJiGkLURIRIdSG2M4S5qFmYvhjAzyCDTHLbYbTlafSiPBN2bERImkkIklh7fN9efM2aE5Zvvqylmx29tOMIqh1dVuq0rpWKZPEOvfUpTtmalLFSjbdN1ZeffdKXVqEdp1Za2Zj0+jKV5SPRu2Rw7o919tm6vbbTnaVtvZlo7FEN4cxVBTkk3Oz6l0+EOI1WpEnQujVtO+f2znfLSaIlscpylOOW2bbYnhIpXztfvsRJD6lECCYnZNPt6kniiYm7qE3HIawWba9icvmIjwNtKMoewNMhpRFi2J4MMbr81L1IH+B1h3Yg2wK+fA4QD9JKkfg5WL7oATatiXhlBIw9jcAtwTMKcXwHyZg60LqlS2hLxZHYM0WQWo9AwInlIF/AhIKUBknwFlYjkQ4FHCfwxiaKIyjKBBw0lZaCtLU4PoD1Xl4mktexDGA63W0YPatjgdq9axDDR68EBdbfMTc+fBakvThpZkURoQJmjEt0mqxyZlOMJPFNK+Kav9a6clZLPq22aVspbXnY1VuoUbNtenXn0ZBNV7EtS4Z23Ua8YxPVg3wGjhvDOAHmavswAB69CO16dOPwBzjsSy0goSkxAS1OnLxnLxJDaAP8zKVYcSWdlIAQZWUqQ3m7ElgRs7VrQWJ9arA3Td9aCQtswTUOIewFdBGQELOwDFARVCdsys5YqVbqFtelJ7MhpUb5a6ffd1eNX23T7ru3n3V5etKUpW2vJ68+fVmexJ5FLyk7QoUqEY29GhKV+zQpWwqUJyMImgvwOUBXwkwxmIpts1pWWo16tezN2b6dOxKySpXrxnI5iFSdi+zCbHZeC3IIC3gYMNpuK5ejb0ZWUiivWq3VY9Wp9CjYq2Z9ahNS1G+jO16l9CKL5PKT5uxIYzpy0jlKM7NVa8+jfUrX1pS+Qy0xbEspK8xTo2Z919s+zPvhzdBRw+gYcIsxdFE+lyCvMXwI+hFMcgYMciqYgJiJZeaiBC1EGDZAHKFqH01BV4V4jwHevCpD+E6xJ5yEGSySlCJNxjPluhYjd1PjdirMyWSX2IriWXqyaSzl8Oql9svK0LMO60jp9SjNw5vsTFepPsQxpUK0pWk0+LJSnUq17HB307FGvVpw4rVK0tPozMNLbE7Pn0KcSTletSmJaUlpPUmrpi2pUqXVadOpQqVbFmTV691epXr177aEDvPhCl4FpKwoRLAMUGOBvhKgGWtfXhFtqWJeZk87BZgi4I6A0QrwTcLcI8PL4KsEFEk+coRqGCT0Y7LdsSSl9GvK14xs15NOx2lKxyhLVLMZS985L0q1enGrF0+R30pqJ7NefKW2ys5bPurT6lCbs9exN1bqVatOV4hXyeZq15LEKQREm6EikMF+Gs5GEHCrJoX4G+Kq8RYeTF0hhLtoWaUOYfSCE+JIphfgoYKsFKXgtQ8imFOLIXqsKESS8DdBjkkeun2y0alpWXk0RrYK0dnKsrTm7MMoc3SenW7E1dYvo0qFO+jPm5anZmb+tTuuulpJbPp2L607R6tGVo16NtmnO2220ratmVpU6EpfZp33W0Je6t2f6dG2fSs20Y323z4yiLFEXR+RxfE1mGt0nk01yKrNVqt9Ot17rboxnataN30panZs1p3qWaE3ZiyjEeRRlDSRwMOMori6MpPKVpPJIjT5qPR2zVjKdjcvXlJDJZ2MpFdRkEgjGIF8TR6PQzkE+N0JFJaPdN0peWimJIviWFyPyeJaErddIYIOBXQDdDiA+wPUDvB5CTJYZQ3vn23W3dmnOU6UKsZQM8vIZJAbIxgNkWQCxFEB7moD5Vgpw7gcoZwQkHSB+k8D3C1A/RyCBgmYEBFcFyvBZg/l5WjGozjcjsSHqxlYmZBbPrVJibpVqcpOXRZXlas5JYuhKh5dGMegt1IzoSWVmaU5SvoRPQj07FNSItGtfPny1m2Ys175S2VvvsRqTRVK9fk8lkFGb+Ukd1i2TzcUV4ewDNbAoOBRTECkrwD1NQBfiBAATiBAIyagEVG4BCxyAPkzASsN4CBhOgOMFqK4QZDKwtRTEGTRGpxHtiNLw9iSMojztGzSmq05OzU+QXwWYAj4dwfzM7Ox2bmrYmoy9tSdl6lSY6EjiDFNsMEURRRs2K05HLMxJoXKUvRsz5ujbQm47Vl6Ufoy8jlZmZrVJNN0pPGU+Mr7uvHKcvNT6E+vJ685L990b7MrAuYuhRttrz6NalRp160WVoVo3GMz0Y1M1I9EPnZFPuiNEeZglYQoDZAJKH8Avwwwt0IiTcxQpxDhWjGIUrC3GNanN9iY5NRnaU5PsVpSXsUaEkpRNWqUK8fmYixLGcQr4zmKs3bdZsT685RsyS2pJZPKV5yzNyl9tOxPvs230LZSzBYgb4khxQlLFWjbb0pSOTkOZPFEV052K4yg7g6wD/BNQBzgqQQcDVThrJL4ZQpwQUQoDbB7CZE8O43M8ckUTRLykRohRBiWIsvLQco5OykHs7I5mzOQzhtGEdiy2zFctHZyPR+KJBE8+Vj9OMKczK9OLYnmLM+djUSzkxSnZ8+MqdOUr33x2clrEzHqFsMqUTWLMvPhZh5SlYRoiUqkK18zI5HEWD2L4Nt8NKE3JIaxjNSl9tS6GU1JqErZoVqkjpdKWm5a2lK3XWKtKvG5SBwgX8DPAYZPLWaFtKtKSSLY1FsFydkMDTAYIHyclakloSk+pbF0R4GWLoONKjFctMSkTy8zdToyOHFinKRJxfzs3EC+WqRjFXNQiyGtO0OL60pWp3UKUpYq1Y3ORNRsWyGVnZa662tGqkluhSmIrhHgZExDapfCNF0WSWSRXGMkmZyhDeBsjCC3NQe05WGMK8QImhXlIOHB/H4iXSCTQhw8owxhKhMiyHkKkIUKMDdB1hvBhhrDWEKG8vM3xuckFCbnIaQrwfQ8gbJ9W2Q3RyQRAtvtn9CYhjEs3UjOWk99tiWvjKUsW3XWZ9Hs3Wz6tDp2asik9KQzt1mdqzUgs0qNmfbVsWJ91Xo0vn3UrufXuuleWpXWJ9tOXlr47RhnJIX5WIMKsRIYyeM7F05MTl0ajOdiSxz75yUszt18Sx2Ox2YlqF9WtbJ5STWONyK6+TXSGCWkkzZmYcwixFh1LxGkchiaFyOQ0oRhChBtiaLJeJL4yi2HMU0Itl4vn1boLsF+6aoykR4wkETxqEKWswnXxRVjkgiLMx/jsTRJXoT4DFOwbpNAPVWDhF0F+ArYDFJL4vvu5a6PQdw1g3QXoBbg+gk5FCDBsgj4EtANM+HE1An5iJYugQ0diBOwG2cmK0DPVhrbChLU74lvnbrPRpSapLTliVsWZ2pXpVqV3Vk05XoXWJ9m2Uh/bCBEW6PVpPYthpGE3TnJ991evbbfbPvsSClSvusT7NWzQ6VmlWnbZizPunKkvIZ8U3SefK90pFVSI8WxHg/hrAIKJJuvAAcrRXWgDXWhnXgU9eEatAlbMS2wQ98TSSFCcg8rQsVL47CxIInjkHWOTUxEa+jPiJRszcRqFG6L7NCTzkdh9LQPEDHghoIqVqRVAR11GVo2KtifVkslpTN07ZjVCldQr32aM5QrTlCfWjPla0RrN0pOyKvXur9iWtjk7dJebk105WmutKWehLTUSStGvRlZ2+YrRFimDHCrCDF0DlCtDqUoVqtKpQs0K11WpN2K199WUp99KFuIcrOwKyTwY7YGFfAD5DiVhIlJJZnInsWbZBHo/YrzkrK2K1njc1bTnbF9CrY7FmP3zde2cqyWS0K8mrWbo1XrctYks5SoWbZBQk98msU+xUu6V1ixT69adowYrYCojcdm4dU59ixQiunGUtCbElSNQ1l5eNxXHe6BISkDIloCXj0QoN8A/REhHgo4IGF+PyKA53VpFAaZPQksGSMYdRnHLElrTc1DKXlro1XiuZhbk8pIYZRqEazY4SI5NSCPVo1EkIdSPSOJ7EMEeg9vhnNQgR2IUnh1Xj1GDyfMySLLpJKQ8m5a6EWPSKZhOsxqbhGp1K0WTcS8rUvuqVonmpy6LbMivhndfMw9rTtWKKt9GMecqS9WalJyjKWadatVsUpWxPvgsQ1gm4K8BIw2gZMF6BJ8A1Se+Qxq2csdm+clp8+DdXhBghLMzESBoiaCnElKxJ7Yazl0jhtRmL4ms0K0bq2bbo1ZktWasdeWjO6Xlq8V0q1K63l6tmlXpTlmO0ehOTtGSz7pWzNUo7J+6xOXx+jUtoRVMQqyWdrWZBHJNDerO9OtJLYToWIRJeLZBBYoTMSwNsL0QpaBqg6QfxLCdFEMFmPQoxAhGgww8jCWgrRvg8gMELcxEWHkmmIR6M+JJNSlKV8zQjsQqUmiSvfH4u6shk8pVszEZx6djVCzYjO2zI5NRlqcvXo1a193bbT5W2jbUnytia7EvGpmjdWtn9OfRvnzlWzdRtn16PfZts9CWp3WLpWfKWzN83KytSXlolpzsP6MUy0YSOUsWxdXgrRCsRNMwdJLKz5WRVq1szZnLpWfbStqy8kp21Z9tmlYhVqw0g2cNpNfCDOxqCzGUKUvB3FVKpPlr774q4Pak1fEkQJezEGlHIiwoykIvTozvBVswwQ6h3DuDyC3dP68ekdCK5qH9irGo1LX2bpeTy9C2Vl49A8wISUkVOOdehQu6NCEeQQM8NYpiFCXBCwaoGFGrpWzYnZFGuOzUlk8arxbZm61iLpyzJowjUno9afVvr1YrnK8+aupUJ8+N8pQm68dmbFKnRutktiFufG6c1Uj9aT0otpc+ldX52fFVeRzFS6zKy18+xYrVKNmffK1vqUqtilJb5PNSlGHtGP0OlfMW2JSQxLCnCzEa2I1iI1sZ0JBxhRiNTiLVh9Ui6PRFloXYri2IFSfJYyiPEslk0PqkmimTWYhTUZSKTRuhHKsnpdaViLEOIcrBTgErE8xG4vl61tChHqU7R5mTXVql1Cam5FdXkcclecsyepbZ5Sdp3yWRRuL585H52Vq2a8vdJo/fKzlORzk+al+zZlZWclpivKzMapQ0k0nrzdnvs0IzrwgTE7MT77NiWnb5iOR6Hs3SiaMqcNq0RI9fXqRBhHgXsOIClg+gWkRJFBtgSUGmCxAjZ8MEjmpiKKstfEGWmo7J47LSsdr075y+ZvqV7E70rZeVrSarGMiiS+vEsRo7O3w3mpyt0JSOV6klsVOVkExLVYlk3E9aXmpyrS75yN2OrZimRzEfrTdGzVpUa8VyeJZWOUYYy0UTkbpcRI1SpyOGc3AywLKAMsEbAAYgsQIOC5DqDuclKEQYL8WwGaTwXIdwVpNCbEkHsRYbxqbh5IJLG76sJETyarEsRJiHdaEGLYshMhpF0J/DKDuK5LdFdOZnwcIQLM7DaMJBB9KQfTtiKYog5Q1jsNIxulYPKkSTcIEOImk8J0chPjCK4PYohThtH4aySIcaiSIsdpRqGcnlJmdoWJBHYYYqrw/viWnOyeLJqfT6VShEs1fL1LqXVrUrZyjVhzC1AM8BZQB5g+gFuAWo5Mw0kEpH6sk7ExJ7YyksVxGhnDGDh1YDRD2Btg+kkmurztW6TWy1GcoUO6VqV699WrF9G+ag/jUHdmH0TQbY9B/YpUYiRXMV52lKVbZiGkipyerJ61mdnLE1QrV6HdGd0rOVopmfm7FGUl5BK1qNSvFchkFKDjDW2IlODyD2DVQg6xCgm4/G4F5A7xjAaYKUggyxChZlofWYcQT8KUJkLEBvjKAxRLCHYkcUQlwMCB9iWVghYjwZ6kglIZ23XWaUxDyCV5mOc1YpV611GtPsyOHUvJ6M++bsUO+2hYnZSd7r6Hz7PdPsc+2UoRZdViuJ6UUWb6MalaE+UvvpSa6jYnLPfQts3WLZPHI/Pvlqc+alr5SUp1qVO3oWx6QXQT0J0KsYQHutHbo9FcDnPk0LcGaM47bORZGUWXTF8pfd8zOysiiytStvoWIwjUMMHShBRSeFqCvClGMFmI0HKMIkjKCMoSt13fXt7NaldORBgpUIYzMHOLYHSdiJ07FSrJ4wgnohw+lJDA8S8/7NmchUsUJPPiyZtgHCQUba1eTSSFbtjkG6AvICchUgFyrSrQ0pwyhlJIawN0zBehIiSjAMEApoFlBlgrw1g8q3y05bdWlLMD7TujdWSSKXhzKy0vLRqxZhGoVpe6OX2I5fOztC+++HlvPo0qFiO2a0+6jRsxNC7bB9QiuJq0Tye2SXd85Gr7Ni2VumZizfYnati2tYq3yehXqz5qWvp3SteS1KkPbolmZmjRvoxTG5izAlYOkP+AEaA9QNdiAVV9exYtvqwRNCtVqWbboZXV6M5NzVsBorztOYtpTkOpq2hbRrVYdVKkvbUn8OL7rNS3nwOXC3ArojxuEmCnAm6NeR1p2tbPnaEryKfRnfm6sZT+tZ52tJa0+WsWe6vMVLFtGhb20uhdWur2Z8Y2L5qlXpSWfTusUY1OzvMR2ItKYkERLoMMJsdsQFRSg7iDbOXW2bZHXk9iIs3NV5JO2ZyTTs7dLxbG43FEch5MR6WiuQykikM7VhzWnYkk0nrw5k0PpeN3y90tWnLrqVmnXrdvbfXs3zk+VmqMxEeTS8avsSlKhSqzl0+vXhzJrEvUjUpL3Q0vk99CzWrTMrS5mlMXQSMpFMNYRIiQw0IDRbEtCEyvDONQS9sNoZw0jkxWgDpZlbollZeUgKWtOz5m7oQAR5LJpqLYfQtxDiqDPCtF0QYvg62wAuTsKs7CzNQdIvgZ5WvOQtVJyzARckkU7D2PUakIsmm4oi2pJ4ugTM+Viedr1LEbjkp1K1SVgQE18jo1qtOLalmVhjdSgRkXztSlFVSTSScmp8dusSeBMzUZxqpfbVk9eS8S3UeALfYtjczdbCzWvrRRPjdSARtaCxwg8J8vAXcOISILcIEM4PILEBK0IyqQv3TlaAAD2LEXSKH8YQNk3Jb4t4OMXwS0HKA5wC5CDUr0IQJaR1rMausxRNyahJ77bEats2JPZkVGnVnI/SlI1Ql68lnbN9tefL2y1edq0J8nqT698zK2zVifN3zkrXr9SvUqyWfVqTV0dmKtmfUsREqUZ2zbUj0PYiRGm4RZDXiJC5UksPIexLwb526+MoDXBbhrGVGN17ofwNsM6MUT6kKcGOPV6cSzl9OECT0pmGlm2TS0WRPOx6WvumJ8rOxqxLR26S1o/x+cr2Z9WTWLFOboxjQvmZWjfVl7aNClM3z+2zXklKVoxqdmZWlRm5SnbQttnbbbNWboRujJpefdPo0OlOTUtPmZqYlImturXVejfUrxPQo1ujZjOINeJ69sOoKcdiFJ4sjkUzkL8nieNSsTysRrF9O2jbZo0L7F3Zr2bE5OyeINsIEahjEGDnQkcfhBl4vp0JSXoWLr6/VtrWaV91a+tJ5uJYX7YnmY/Ek3RnOL5WKpiD6SyST1qnIYonxEowexCg10JNZl61tK2PRbdJpaWhPgYVOHkNpyWn0bYmmI5K3RfNyWNyaDFAWElgwxHhgjUQZerwdxdCzSjORxNVjGYto0OxFklrx2I0mk0H0njCQyPoV5yN1acanbZ9eboXy1mYp1bqFm6zTiiT14M8RIXqNCWsRVEa+fKyShfTsVbpaNWZi2fz7FKrWviufPoXxlK1JFMUrHGpHIr5yMomtmpLbTusTUllo9WpQqQSs3RqXzlmduqy9WS30ufNV4xnZJfIakbktKKpedmrM3GVGOxdJ5y6TV7Eam7pHEeTxlWqzkT1a03UlKEB3gA7wENCNCHAj5JJqNi6fYtrRu2YmZLVrX2KlOTQyoW0ZeTyleNzkkmK9GUpS8atpxqjHpFE85bfff2LF999GUkkSVb45OyG2c7EvJJiKYr58QpeOT7pHDSLIHCbrT5upSpctGqMVQc6UCz4FhDSAIqnAq4OMKML0BggL2AZK8AzTkBuguQl3yCEWDVPkEZRhUuqxjEKQRLFsXWJFNxziurQkFtOMa1SxddZvnbp9O62QT43PjGTRNJ4UaMZXV7q9s3Xk8pWiHGUrZieSQzlZSfUhpXm6teLpqdqSanQunz5HbEKRw4jktOxPLR+zVjkU2ysVRZNwd1ZiHETTUpYj0rKTV8nqfddddS5LAN8CwgBVhUgDpAY4DnBZhFg7vulozgwxfA+xlAZoogpwfQiRnDulDOOQfxlB3GqsFaTxHiW+M4Lk1EKRxXOR6RQrxLSkkIEQpDDqWhEjOjCLE8KMIMSQex2dnIaSCHV90JM1GcMYwiSWjONRbF8foxJPiLYpwtx6ZjkrIpDFktMWI5DGvZjfTsVYqi6YpyOjG6FWrGpyrLWI9J5iP2ZSE6CfgJKAr4AGUH0BKQQcI0I8zRj0bj98zZl6Efi6D2JbZmt0ZFWhAhShWhJhJrynfTttiWdk1iZmrbpWpQsVqE5WnzNsvLXRJShShtDiGkfhhoy0G2K4PYzjc1E3FEMExVhajckvlpPbPlqcRL49bKVpqSTffJYlrzFCtPhvUhZsTEpStoSWHUQZmHcxxNJIPYiRyJ4fxJOwkWa8IMLMRIgQkwMaUjGBdQk0oR4hSaB7lYGTAeIa3QiSSS0pBBShCrRHgm4/EHjUG2GcUy85LxbM21p9KxzFGS1Ykjc+SRbKQwVJDfDKzC3UsTkTVJazUnZqcq0YrttoUKVCbnbNC+x3R2Szkhg6SOYlbFeNzsxfTmLFmbs3TkWT6E1SsUZ/Rn0Z2xRur2ImiPdNSlGfRvvvl60+Yhx1q9OlXrRqjGcbgn5HBag9hVg0wIWAp4KKDJBJxbDSSVKt07Uk8lqVJ2jUjK22vSqT5PxZGcKkFuDyDlFcJFWlDmBfR+CtFULEbh1Qj1mfWr1rM3JaEtIoJCNwuxuXpwtVoYxCjcQoYZqZhAiNQhGiFGEXxuSRyfGMml6te6xJJfiiOV6FKjXu5y+6ak9eC5JoNEBSQgR+FuahMj8OIYxqT8GKPwfS9aE2+LYU4VYDzBGzsZxdKQ0qcHsSS8UzcxMSKItsMYkvrxLZ7Yktq390U07qFDlbMrY7u2xQnb6taVm5LHrr4cUK0tLUJifLT6Untp1a/bYsUu26+tYvs1Z9exysgmrNOnXpyGrQlZSdiS2M6lOpDanYlJHOSKpGq8IMDHievC/Al4i0IxrVaEis315BfdbI7FK+QV7q8iny85Uq3xy66WoV5eVnZNZnJ85Voy1e6fTmpPddOyWWn31IX4iwWL4SKE5Wn33XWZPYkknq0Zul85dZvqSlS+NX1+662MZuWmKktD6WoylGj15WzJLbMrXmqte+6apS8rO1p9mtRqSlKzLzMQo5FViGcLEHOGsFyTQSkHKJozgKeRx6rAKa6b4IqNQbJSxG4OMagh4kiHKQIiYunYHuMYdUZHOQU6MG+xFUXzUSxDsUYhztvIK1eWk8rN2bEvFk1J7adavYurRqvZk8rfRqRypdKSkdrVJunDabqTdskjdOQzk3D3jXGde/iWYi6rDepEWYkszOzd11sajOjILoQacTR6KpqPxqIcTwOsO++ClTg/nxJQp0ZS6Xp16V9CrbM1puzR6fXiPAfo1B1tgDbKQLzgEJdCZBrgJGI0O60AvQpw4i2A1yaKqkEFyklgeJLI60GDiq+DFWjs5DviNNw5m4SOXpXzkknJmOUbEU3T5WDpXksQ4UL4YxLDDORCjKEuzFkOIfV4ujGZlIbT5SMJHYiJHooksNYjxjZjOPSs5H7Fexy0rXsX2LEfoSspGV0IMpGMbgUsFOAVkHkBNQdwLmDLAA4jUDvwKW2BonIQasxIY7NytmXr0r4ok0XSSUjCPxEi2G8BjgLOE2BJQSlsxdYuq1YrkFGKb45fJY9JLNmT1e+jbOT4onaUihXiarEe6fLTc3MR2dklCUviyxLXU61C+fUqSl9m6xTlK0giWjUrS9StKWerYkstJYsoyt1spfEODlIr5WW4exfIIkjKL6dGnFd0JsZwswvQ2jkltgzwewWJeFCahQk8RIliBIYDfEeFiLIOMPIZyGpFUMZ22JJWjFcitvnKcpdQlKN8xJIxryKWlrEpZlJ9eOU63H75ydmqkmsx6jL15m6dtoT7FGnYlZrodi6YsxziazLRH75BOy3Svn206crbILadOjVnK1KvZ59OndZny9s/t7bErWsW0rNW66+Vtma8Qb4b0Imk8M5HDeTQgRLI4lrQ6hKiuI9aIUpOT5LN1LbNmzbLyOtz7qXLWYZwdwZ74viLDWG0N6kO+NTc1TusS1izZn1ZynHrpiN1KFaH8Q+TUowh5FEURRWhCjCIUVQhySK52FyIMcn052Kp2pCFyKUhxNSOzKUaVW+zPmJutYiWDfCdCdZlL4fQoQvwewewwwvwNEHcUw3iPWglKcUxHg4xNKSCahzLxEjlKnBRwgQdxXE0R4POKKExVpXU691ihbKcpGd07ZvkElmYzqV7atadjk7UlOdiePUeLb76HEtOpJrNSciudm7NihYsdvTrWZX7MpYp1qkZRVNUb4whElZWpOyWbmaN9OtSrRfM1I9fHpepG4YwkRnBY5aP1KtecnKM3YqULatsTTktUqzU+TT6kkmI9DKjDGGUlkdS+bmL5q+hIbFjksnr0ZqaoxhPlI3XnaMpHJ8mhpDO2biuKLpS+2TU5yI1tWpHbu+VnL6chpTlifN3VerI5WCjh9EaDRG5FC5dLUZehPrUKE+ZmZiM59GSyepYrytmbmL6FeZlK0JUZxbIYiQ5l7qsLkDnAKSGkAQUEtAVED/AUMLkC0iLBNREhAgL6BJxnAn6kA4WIFJDSB7g8h3MSSSwpwkxnECH8T1o7NwykkhiJL0KM7G6cKs+GNsX2xDimMbFtWQVJ2+HlCQXRlOdKnWsVbE3HKUcqT5mSWIrhtKRdCtF9WdnZFEOQRqL7q8pSiucmJuXkkmkspB0mJJESRRDsylebqWKM+2pPvlYyr1rEimYgRTdMTsbk1GrO1K9KtTm4aySSV7p8cjGYm6snlrpuds8NKkjoxFtqR2TQDHAvIA8QuwB9hegVUDvAbIQoQ4ljcdsz5WRQixbBZkcD1fA0xTB5LQ1nwYrEJNsPLEUwxmZNCLfB7Xk0PLYVoZxyORVEexViHFleIsNKE1bEaJ49D+LZuUnIhyWHkRIiRDj8bk8mg+ur2IxjlsjhzD2SS1aKrEbj0+vEs5DK6VmJ/McWRbA7wvQEhAXUAOUYQCRhPgU0CHimNxNdDeLIpk8biWKbMxPlKV9vVrSlCTRND+Vk8M4RIJeQQNkC8lp9spYn32Yuq2JaUi+djl8HfEejLVqd999GRwbYqjVehIIV4rjGvFEhjOGcYVaF90dm68pYkMdj0+Wi6JpynbGqsXRJfLzNtGzF19mbiNK2aU+Wi2LLFteauqwdwwyGUkML8FaNzUmujU5XjUUwty8FWdiyH0RYqiJA6wXYT5PFEIVGC9AxYfwtQsR+H9KQSCHcmhTjVGRySKIO4WodQ9lq0xO06diUiSxZloWoOkNKsZ07rNC+zLw4pxGmYK3XtqzkVRdJK03KRRKyW2h9/HY3fddQuvtlq0+6rFcK0+JbMfur9KjNTHfXoWzcZ0a0mnzs+6pQrSlW2zfSpULbNmdvqT6FG+j2L7Z26fRm5ezFspDOI8mm5aCzHYGWJ4Toj14PomlZaUn30piXp2O2pElm6UurT5SSQoQe3XxBhrDyDhdD6fJodRjLxTbO0J2hbZrTU1QhXkcdoy9shg9hBjCGCZgmoYwh0K0khFtnYzhjUladSjbTqzkaoVrMvHrbF1ivddZqzl0FOfM8BaWZyFaAeowmY/II7bbA4w6jUxBD3SGFWHlaavgMEM4a068Qq0akdiUp0pShLzs1GFajz6U5Qs2JSfKdjs3UL7EpXrz69Ktfb91ifZts3V5S6N0bZSWm6li+zZnx6rfWtn0LbPbZq2bNjuq2zl1e6PxE5e+RytihRoW0a1GzTvqzUZSejG6kT0qkag4xjPga4EfBjrRfTvn1Z9SajG6zdbdZrxF5qS2JipUqTEbtnal1edpXX9CxdYoVJ22UtqzXXo2etYhnRtksPp9iZvnK1mYkM3Wqztm+6vZq1brFS+jZnJupdN9er2zPStvtn1591SjQusTde3mrN9tejVm5LPun1OrOSs5TpVKVG2IUamJFCFF87PiDE9Odga5SlPiJQmJ8FiMYvkUfk0rThJjOalONzdSNTdfg/6lWLZFZmIylZPPlalWQ2JLfUrzdSMaUSWJ2dnbEhsy1fmpPYqzlOjN9eal5FM2168+MpNFEhqxLRiDHYli+UulYviblYokdOrC7LzsmjOGkxMRBs32ZeWoTMjjsT0IiQgRNOwfU4siyUpQxlJmNUZuK5eUi+Q14uiBXkEN6E3N14kqRjTuhtWs0oKCMp8rAnpi2Xglq8+pAAisXcC/vp0YAa60RoN8JsWxHhhgENJYgwcIS4iRdIIA2zklnIT7EPuAgq8krRPbV4BumpLPiWnOUIBfi+TTk5U5uBPXzE+Mq1mSQDtOU5eH9iXvgAEVo5ThaqxLVgDrRtunas7J4AEExE8WQbYphjDWAB1FUWUIvlpWVgApQeQ5g7jKOW8AkJW22B0vnKsCZts14DPJ6l8Jk5VmqEhiBUhpdJpqQxupI4MFCI9mM+fSgrxfGElgiJ87fK1++MqFvG5y6vSk8ZSOS160YUJSMozlJ8vG5uPXXxqfffPtq321J2a5WjO0e2pRmJipdOTM+dnJPHL5qtOUY7Zn0qkpG5HOdPkklnJrvpXXTdaXiHJasSysX1JBECQRPB5Io1I4W4YxnDaXpzUXwzvumb5uWmZDKzMlmYZQ3k1masyKbhKmK9SlbMWONS85MRuJLpiYnyahYi+lHZicqTPF1KYlaE3UlJ22cla9OjddRtn2LNKfWoW3317N/Ssz59O2+zdd07paNc+cl75NddfRn3Sl3dQuoUq87LTF1s+rZr3WzV8xZr1qFtiP83WkFG+TxPCpQhpC3DOWmYkq32YRa9SP3W1a9mfVq3z+fOW2J8SX9aLbqshiaEiYlJvto0KVazL0rrFivVkE5Ly8aj1KfzsrSnYbw8mLENLEaviurNz6VC+tJ5N1Y1bJJBKySzRmq1s+TUY7ddffYvmpPM2JSGUGiBIUYEvB7A7RlAiYzguwO8U0KEtDeFyB0jCA3WweQhw8hahnJYsk8MqkdhlfbfH7q03CLWjclirsWL6kklKfKULaVG6YoUqcmlehK1qdSzK3TcvPhguiu2PWJuxTsz6M1XnzsV2L61jvs0Lq1K+2+zZqTtG+YoRuGGdi6zRnJuhEtK2vSupUZiKoXYujdSIMmiedoT5unRoSk+zdL22bFmpZqzk3zsxRpV6E5LUJiTWZLOWy1WalK90ko21+VsRqdrytsnj8pKSliWkszOSLpRND2LI3DKVlJNEk1DGMbYZSClUukU+jNTVKpPq075LUqWJmjJ4ayOJIdSOTyGxN0pWVsy0xKz7adevHLpPfZm6tmf0KtCvVpTUQ4R4uvkMms0IgxVKwKuBSQ+gBClYBnhPgaoP4axZIYaQa7oIqbgjJeDhD+FqKq1eIdezDWbiWlN3RqUjdizdMS8ZS87ViqrCnK2O62+bjvE0RoZWxhNQfUJFWkVGcnI3VqxnMSsjnyC+ZodCO1ZelQj8JstH6cLt0eiShKQlylmSSHiiF2D+M5uckt8I9aFuvNxjPm5eMLo/AyyexYuqySlHZHHosq8USkUzspIoplZLWiucl4vjk3B1upWJmYiSLYP43XkkdqxPIr74/WmaNWpSm5i2apx2M59aQUqUDzAXUBHQaoA9SCAmpPAHeB6gTUJUD9B3CRHIqlpi2j0a0SVoruimtDyMoTaUIkpCLJYLdWDJHocw0iepDqIsDRKQn14QqcJMXwmzMJMkhxFMJ0RoSoogtSGEuNQUpSE+cgrykF6IcBjqQH2GCAeIXIA9wSkANcQoAJNsAOfADHAbIAywNEB0gaI5KxulMS0pOUaEjjt8YVrZaT0oZTEkjtsMakv0K8pTiezFMvDKHsFSfDKEaP05BVnZeat52tNQ0qTEdq3R2QUpSWttlK1KI0NZSRwfUqcNIniuWhzbVny03WvurS1SMbocxLNzExGpifCBVqXQeUog1KUSTkeuiSfGojxqVl5mPwc4bxXGcxNyWhWi2WhtRjGpKQ3sU7Elh/OTUE1CRWiuEC6NRfXi2KIOMVxFgeOFiMbZiFuK4bRBiFdIJacnYzhIi+ESRy8JMvFsPIkmo9JIw7NO6xPlLaE7LXw6qzklmo/YkNiJZyIFtm+TXUYrkkzXj8rXmLqM+hPvn1r5a6vfV7v7599e+7sTl9eakM1JL+O177ufPvn0rqV1G+Vq0JNE9OI/J58asW/PrxJHrNG+auo38H9tCtfMQMWEWagLOhIZFFsklb4KGWhCk19C++UlZa6zRj0miLdPr2admrKXc3FENpihII1K22ZJNTtmhO8pffQkUUTExE0erR2RUodxnfEkcn2/fbFkRZWD6SxfOULrp9eUtsSO66Wm4xkMvDe+zJb+xdIouhvD66tF8LU+A6S13A8SkXUIqrwU5mNVYj1oLHD3gq2IcSkpJIKcSVpWIUVTEkl5aNXxBkFaVjU5YpR+Sdti+hddyl8+vbQrWb58clK1ihP+dtunKEp2LrFOrUs3z7PWry0asW2Oz9tezSs3dWxfOz6EzShvIJqnEacklWtXqW15eUq0I/dJ4PoaSO2Ox6GkKNKpUgRsTTU3KXdav2LFC+6TTlKQyOlRrxTZlpqSc+nykmo99OvUtk1mpNzdmTStCvJr69smqWJ8zTktiZujdO+ctpxufW6UijVaatqVZSrO91mMqFeR0qda27i6T2xqRTt183SjCfJKliZq0JDbWrS9edmpPWm6tilOW20KdaVmpuvPnxDtjXDKlEGzSvj05Vo0OIFmJLozjOHsnieN31o5VtrTE+Uqz76U1QqzVWzTjOtMWzMZ1piI8fp0LPKRnGVatXjnKTU+jOVo/SszER+fZlPsWzlCfXviezCxx6tEszMwdyWWpy0flJzimrJaspNU7rNStSiXkcT3z6181JJFE0isyOJ4OdO6WhrFdmO2I32J9ttC2fJJiOwUc+G0OuzIYWpPL1qlmzYrz+pPus161WTValabjV9C62rYiuzC3YgQlOFazAQ18KMcgENYhaqwALbakjgANw/hQiDACJdSk0AXq0bm4AtcvYgG6tDOTwJ2bkFaAfqEZ3QKqNV6cAZpWL41AHevz4CXlYtlIAFEciLE0AEKXg2U4AKFCjNQA7WxnfADpZhAoQA0XQmT4A104Tq0BFXQ0qwQdeBosS9WWs0K9ClRsVOjO0bNtecrx+fOWw3kNCMo3O0akpViSS15qK4yiJHYRIVZLOxdJ5y6+MLrM1Yl5nrUrZa2lN3ytOtFs5PlJ2hSkcvPpUqFmpXuoXSlXmKUktozdtmnJ6tGVnKle+KaFalJeds8X1r5LKzV9mlMUZafViaNxFnKEZx7qzcnm5aGGGCjDWH0MYtnatGQQgyOFKRzMkl6EGuTxXZhhh1CHD2lE0LsdhLiyrGEHs5BUimxCvGVanF0IMS3T6krGcMMmjV8bkttKnYiefZjOvRiW22nMVpafTs143PjXQsRPVr0K93Tq2J9Dvt+3q1bpHOWas1fUmbM+RXzUN5JfJ4WZqYuusT6V8/o3X3SWSUpSvHexIJyOw47FWlYnbb69t9GNWIjVqNtm+E2vHbFKTRVF0+zEapNzkMo1XlLrFtajUoWyKVoUKdS+fSrz7aliK7YbTNm+Pzde+2rP6XXk0mpyt8SUpWxdVpz5DRlr4ZV5yIsR7FG+PxHtqSlmU5arSnzElo0peTS0gkkkl5u2jdySGUNYTZeLIqks5JuUktmvbUrys+GsNZW+ZvkViXh7HY7fZqw1jV0INizILM+XkU5HbEpGoT5NDm6diaRUZB0LN11WnRnZixdKcrJasfvoUa8pN33c5ZtpzlC6nJra9anYnexfWs2bbNifYqW2KV9Cly9WlbYn0pFRqRHo0YzhAkEzJoq5BPq1KN9iMI5WsSXhDl4P7piGkRIYxnGVCY6Emm5910SRddOS85JbpNKxuGc3QksM5edqz6leMZNKxhSksxYpVK9spUrzdmtzl1js0ZeLo5O14poRJRhdpTk1MRNI5ybkclox2zNcjrS1aOSaGfMUJNPsQ5jUIMM4xm5HJ4ZyGNUIrkUSRySVpuJbpNSvnYaRDlJFHJqSTVmrOTUzYnzlGvSrVZ2ZkEko1ZefG5aYvlaVCUun05HKVYrimcmJJfZiLPrzUvSv49Nw3uvimjQjKYn04YY3Dnj0amKMjlofz6ljiS2djU5KUIvk0UxbEapfRn2aViUvqy8dtr0JPWjVCH1CEWnGp2IszHo7ElteUsS0vQvrzsboT4bSeWkEiqw3oxdLSavPjUjoTViSyGchfhdklOQ2OfXsxPOVa1aEGVkspB9XiHJJ2xE8++rK2xlWiPN3ylajbJ5irJ5yTTUzJ4gWLa0+vfJqleEGSzE7XsxfbI7HK0YZTsBsgjYB/hegBJhfgBWiPAAnnIAZb4AFc1ADFXgEHLQAoSkAcqUAAuWgJWvAHa6AO0YQAryWARMlgBdk8AiIngBZloA9TEAA2ZgBD4ArwhQIKE2DuHkNJyJqMvVjdmnbTr0qtOVr0L4ous8vbdfWoStiRUq9K2fZts1qXXrULejOXy8SSWJJuNS1svXpSeQxHiqI1SxMxnHI7QnzcinLMmrSkgjd1m6hYnJ8xWoTkL0FerbFNeH0H1eRzFOI9KhZk90xVjO6vJak+RW0p2JJaM6UxH6V1OzOy85PjVWUqyeUnYkj8pOwjRdDuSz60Sx26RxLbFFOanZHHo/FsSXQcY1BzhZhnEOHMrCNXgqQR8DLCTEeIcQ41Ul4ujsP5FBthnGMQaEfqxXDmFylM0IdwfRlCJBqoxRKWxNJpSKOctlIlnZNdUlpqbk0RJShbYiaJaNmXiWVulJi2jToWK1efOwe31Lowq1rbZ8tXn32ezVl7M7Nx2bhZk85JIhds1RiqCxPtjGGk5J6/bfRsUbqM5Pvk0SSaMrMvVmZ2fCDBh7a9ecq061e62T20b6Fe637qdCJqkOYXoRaMfim2IUllalSOSatQqz5ectutnasa58vJ76F1ftr2aESTttidui2zZn2ZuGl0gtjte+xbUiqJZLQo16Nm6MI1RtlY3QjK2vSvgAEAALxyAQCLB9QHrP///////////////////////////////////////////////////////////////////////////////////////3/3/z8MBBBqcgEAAAAAAAAAAQAQAwAAL3oLAAAAAAAEUYYYYYYYccccccggggggkkkkkkkookoooooosssssssswwswwwwwww00w040040040044408484444888448889BA9A9BBJBABBBBFJJJBIBABEBIBJFJLtIBLtLxL8BS7R/AUu0vwBLtL8NS9S7S9R9SS/AUvkvkvwNL8AS/BkvkvwJL8sSSASSS7QSSASS7QSRAQARSSAQASSRSQASSSASSARSRSASR8SASSAS8SS7SASS8SSASAS/AEe0ku0u0u0vUgEgEku0u0u0vEkvwRL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1ZL8GSSASAS9SAS8SAS/DkvwNJH8ES/C0vwJFH8ASR/A0kgEgEfwFJFHxEBFBEBFFFBFEBBBBBAA9E9BBFA84888844885A48848840444440000000000000w0wwwwwwwwswsssssssssssssoooooooookkkkkkkkggggggggccccccYYYYYYYVEgAV3T7qU+6d33z61uxMzp1HtTdXnTpmanWOFIAbU6MnPvoVKE+jQnVZu3Ts0Lr6M6d1bM+xNzMpABvdMx6rEqV1ezIWL5SdQvvo25/Ovnfbrd10ACehatWac6fOnULp99mlSs0p1GL0Ld1rvv7U+AGtvt9ufS777diva7M1fzfNS1mLU7dK3fQgA4t1ZKjauqTrPQ50xGa0GpTtRefXt1b6k+ja4AOZ1mjYrWp1qhRm61mhUmrVqfYvoXWrdmz2uzAB1Tk759ujZsTUzPm7dulXsRToVLV3OoTFu1VowANb5q1LzU1bt3yVmxfYpW7M6x1bUlPnX39ChbgAc2/vr1qFq33T5CdfXtWbU6nd2pqzWqzclKQANKklPlLUlThinQtUJ903I26981LUe+daoUad9SAB5RtW7NizHI3JT50vfb4cvluxdQmo/fOiX1bEAESnXtW5edW6tOf0Lp8+1Yp3zrVi+vZn3WrV8AHtufPvoWZG1zpLr2r6U3Pk76NC1F+zZleSpwA3o0JSUo3RaL04rF4LyEWi8DMjKUoNwxDHAxEoUisF4rIyEAB6dCk+Gp8Ga8GpqStxe1S4M3UqcpQoz4YoULqVC3OgAMTqFCQkqdqLyVm3OinJRSvbvnWp19C1ffwiutwAbSshPvvl49ajkzdwrSjFKhISt9ChVpSN1uzJV58ABaWs0b7M6xbk5Sf0LNq+zNVZ1elXuunW7V198ABuxdI17768fjcbnQ/MTVaD8+bidm+/hB2LUP2I9bgBxbsWIjqzNWD8djEcqzEvYggmYxXgn7MSgKIjh+rCSjarwASbrNmbutROvY5S1Pm4/ZqTctWl6Fm+lat3XT7cAE6hffY7du1an0L7r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gNxHSiCBqYgmjkXhLMQkgcghjMXh+To911WjQsytWTtRFTjVqAPwpB2G4YqzcGISScC8MwGUDM+dH74pM325qtandmd1r6lufNWJCjQr1akvN1K9iKU4SzovwijUrTi1OnZkJuQhe3VhWZtT49My86at9mnMz47KRqar32ZGbrR+VmKctQtR2BVB2H7rEcmoaiKrEcRxKVq0YLIOwngK7FCnGZifUnyUL3wnhyGYS1ojjUfsxyNVYvVm6EASy8I5iRtxFOiVqRswguhLAxARxuSr04/Ha0LQfg7LRWYjUzbh2BibnXyUEMAtmp1iZmonTrVJ0JYZiOP0K9CGY1Ph+GoiqR6AHcDUVgIICrhWXkYNQMStiVo2J0ag1C0JLE+1blIZmYZtwI6kLx6DPQlYPxyA5H50zbjNKah+tEoGIzByThmhF4vKwxOowrOituJW+pTlY9N1oC+PQGoaqwS8vMxWYiUHIrUsRKE0vBVARx+NwSS11ilH7dSbhHJQ3QgvEEBVZk4FdmRq2ZiByA1E4YlIWiUrFZPq0YrD9OhJ0ZazMUZ0LRqxKycfpR6dzM1OmK8DVuTj8Qx+xWq2pu1HqVG+x1qVCP2LEEFCTh+BqZhJPkLEGa8JakjRjc3JcDkzYoQdvs1LrdunVh2BZalbdmpA3dKSEavoWZShDkHIRQhgvBiAFcxAAKhaKQngRTqcag9ThyGoX+rBJEoAZSkclID0nGJOlC8GZSUupTFvqw3BPxDISFq3SisIoJ69CxYm5SrBVEpG6tRt2pGpEFazYtW5063btU4flb4vEdSxJSsVi0zAkqwVxWGYKIAmuh+KS8DsM0b7p0Sow7B2CyCiEU6PwNzc+IpCdH4D0enRaCuhD0Ws07Vq6rYpVa6gAQAAWoEBALAH9AeA/////////////////////////////////////////////////////////////////////////////7/++hoSBwIgIIANgQEAAAAAAAAAAQDuAgAAVfALAAAAAAAEYYYYYYYYccccccggggggggkkkkkkkkkkooooooooososssssssssssssswwwwwwww0www000000000000000044004004444404444889BA4889BA9A889E9BI9BBFFBFFFJBBFBJJBLtBJLtJFHtJEBEBLtJLtJHtJJH1JFH8BS7SSAS/B0gEvwdL8ESS/BEfwlL/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8sS/BUUvEgEkvEvEu0Eu0QEkgEkgEUu0UUkgEkkkUkAEEkgEAEEgEgEkUUQEgEEEEkETwEgEUUkgEUEUUEUkEED0UEUDz0Dj0Dz0UTzzz0Tzjzz0DzjzzjjjjzjjjjjjjjTTTTTTTTTTTTTTTTTTTTDDDDDDDDDDDDDDCyyyyyyyyyyyyiiiiiiiiiiSiSSSSSSSCSCCCCCCBxxxxxxxhhhhhhhkSB+cqVZOl0J2Zn5O7xuvQuWbl2xSnqsnWsVJy7UgjsT0XvQ1Sks5ZtVqNi/HLtyfk+7Rv07tapSvT1eElSpfo0u5ck792ftyCEFKLylaxF7FnjN+vRpXbEJZy9duz92X6crbvyluSUZS3Ja9bp1qF6jeu37kEXdoXZmrS7turbjdyds2KMpUv3LtClSvXu7fgS37l+3fu3567dvXK9+jbr0Kdu3QvVL1O3ft2L8CaHqUrYoVaFG50a927b6Fa3Q71i9Vv8/Nz1WBZYkkXozlSvc701bqUKNmhfiqrO0qtOhP0ak7apwFFLsVL1+9ao2rtq1Q5qxTo2rXJ2KF+zap8kgElG7LUrtDoX7t+9353pUL96927v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gVw1BpATQ3AAagFkMImhFAjRmIYXwYQD8F8E0G8GUMLVqNTt2VhXMQKIDqBZAO4NYLo1ALoHsPwcwD8Wi0vRkErNQjgIoWQKZyLyCG4LIBRCuEV+QQSRPUjlCHZ+tCelBzDMnAAwgH5SPwVQ3CeBPBFAiQPI1AEUCeVhfCGJIDyUiKXgUQcxDB2RQQQM7E/FUljMBpAlgXxeMz8tNQw+Oxq/Oy0jqSlS3Xn5iORqvCujIYho3rlKcsVbUdp1IJZ23KzMKonimBJbuUK05eiKAdwF0NTMIItPx+BVH4ij8fvQnhfJa1a9UiaC+ahyNyd6KqVyNwkn4tdvW5uRT8Wj1Hj8aksnCirekViRyS3HZOxDM5M1JFXlKUpJJDYr2YQSC7MzFSZpUfr9qWmoas37lyzXv2+1Qq0KdChSo0rd6pfpR+BLcoDAAQAARXcBALEH8wfg/////////////////////////////////////////////////////////////////////////////397UJHKBo6B+nYBAAAAAAAAAAEA1QIAAIigCwAAAAAABFGGGGGHHHHHHHIIIIIIIIIJJJJJJJJKKKKKKKKKKKKKLLLLLMLLLLLLMMMMMMMMMMNMNMNNNNNNNNNNNNOOOOOOONOPNOPPPOOOPOOOPOPPQOPPPPPQQQRPQPSPRQPPPSRQPSSASQSSQQRSRSARASQRRSASSS7SASQS7QSQQSS7SSRSS7S/AEgEkvwBL8ASS/DUvwNLxL5IBL5L/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9TSS9SAS/A0kke0vEu0UvkkkgEkUvUkvwBD49JJFJEBFJFEA9JFJFABE9BFI9E889A89E889BA4A88888444444844044400440000000000000www0wwwwwwwwwwssssssssssssoooooooooookkkkkkkgggggggcccccccYYYYYUVECCahSoW0aPQoW20e2zdfVlruSvsUp+2vZk47BJB6Ws07q9ehPUZyfkc5N0bFGQWYRRSUvgbXwdtnrEjghlo3Tvs1+bm5qai0YqclfbfdffSsWK11Gt0ITUZuP2YJaEesxmasylCUvs2LN91KlSo0I7BXfBBGeEnZoSU9ynYn5m6Vl6Vet9ixVs2LaNeekuWghhXSmLbMekrrNaF9eMyV10W+fk61a+hdV6tGjAjrUO6SoXXc/Zvpdi+lRtttoUK9b699GhAnsUO2etkrN1ipX7ra05Wk75KlK30OrYr9aAgs21KEn1OrbQoUqN1iLUa1exdJ16N19ehIrEBNSr2bNizdYumYvRq8nfYrUadttCjQpW31aVGAnv7+lToWbrNGxdWts1KNbupUrq9DtuvtgEVtttaI7pez317b56R2aUlfZoW16VG+xRp2eAuk7qda+6hVlbrF0p1Z+hXsW306l1SRz18rGYvALZBPzFmdqXX3yk7Pz85UrXxiUqTcl2xWVhbSk6M9AEk/Ia0lJ/MylGlPz83NyK2Zgvn5OHrZ2+tG5udtqQAEKkhnKs/HpyQQxnYJpqORHKxDD81BfDUBTGJ2vQkUE87M33QAIo3SugxgZwMakDaZg5EEC2GM5F52ckFHpRLCWAklJOvJUJiXgAMQanoVWYmnaV8VvsxHAa2ysNQliCpThhUhLKweiCGYvIp+EcAUykvNy8Rw3II3GJmGpWJYtCCUsQMoD2XgI4PVLZ2UlJKjR4AHrFetP1raFvdVvk7aUlf0Kd1mxdbSr99tmAB6Yp2LrF189bZvs0aF07YsWa9KrM21brrFKxH4AIIG1G2J5HDUQWIM5yJehRg3WnJDMx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Q9FYjlq07JT0UsQksSGzPUYQwZ2wjhbNVefsTNKRz1WzYryt0nbF5+OdmVsUa909P2yUelZDM0rMtTo31uSm76linIpDfXtrzMOT8Xk4LKcWhVCWDGFUA3gJJmI60UgPqcF8UgcwLOABAADQUAEAswfPB/j//////////////////////////+9/fz0yDBMQq1ABAAAAAAAAAAEAfAIAANJwCgAAAAAABFFGGGGHHHHHIIIIIJJJJJJJJKKKKKKKKKLKLLLLLLLLLMLLMMMMMMMNMMNMMMNNNNNNNNOOOOOPOOPOPPPPSPPPPPQRRRPQRPSQSQQARSRQASAQASS7SAR7SS+RRRAQ/AEfkQEAEUf///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tEBFFDxHtFHxBFDxFFHtABFFBBA9A9BBBBBAA89A848888444444444440000040000wwww00wwwwwwwsswsssssssooooooookkkkkkkkgggggggccccccYYYUUREgQ1S94tE4+uuWvenOnyPIXmys7/pcTvFOA/eqbMwloQxZRn0qobn0b12XlrIxK2zMjFZ/bZAgsgniUSk4W4lSoys3rqnXtmbK6UaoxOQtl41HyEB/kps2qYmapG9c62v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\",type:rt.TEXTURE_EXR}};var it;!function(e){e.ObjectClicked=\"object-clicked\",e.ObjectDoubleClicked=\"object-doubleclicked\",e.DownloadComplete=\"download-complete\",e.LoadComplete=\"load-complete\",e.LoadProgress=\"load-progress\",e.UnloadComplete=\"unload-complete\",e.LoadCancelled=\"load-cancelled\",e.UnloadAllComplete=\"unload-all-complete\",e.Busy=\"busy\",e.SectionBoxChanged=\"section-box-changed\",e.SectionBoxUpdated=\"section-box-updated\",e.FilteringStateSet=\"filtering-state-set\",e.LightConfigUpdated=\"light-config-updated\"}(it||(it={}));const lt={enabled:!0,castShadow:!0,intensity:5,color:16777215,elevation:1.33,azimuth:.75,radius:0,indirectLightIntensity:1.2,shadowcatcher:!0};class at{constructor(e,t){this.spoofIDs=!0,this.NodeConverterMapping={View3D:this.View3DToNode.bind(this),BlockInstance:this.BlockInstanceToNode.bind(this),Pointcloud:this.PointcloudToNode.bind(this),Brep:this.BrepToNode.bind(this),Mesh:this.MeshToNode.bind(this),Point:this.PointToNode.bind(this),Line:this.LineToNode.bind(this),Polyline:this.PolylineToNode.bind(this),Box:this.BoxToNode.bind(this),Polycurve:this.PolycurveToNode.bind(this),Curve:this.CurveToNode.bind(this),Circle:this.CircleToNode.bind(this),Arc:this.ArcToNode.bind(this),Ellipse:this.EllipseToNode.bind(this),RevitInstance:this.RevitInstanceToNode.bind(this),Text:this.TextToNode.bind(this),Dimension:this.DimensionToNode.bind(this)},e||We.warn(\"Converter initialized without a corresponding object loader. Any objects that include references will throw errors.\"),this.objectLoader=e,this.lastAsyncPause=Date.now(),this.activePromises=0,this.maxChildrenPromises=200,this.tree=t}async asyncPause(){Date.now()-this.lastAsyncPause>=100&&(this.lastAsyncPause=Date.now(),await new Promise((e=>setTimeout(e,0))))}async traverse(e,t,r,n=null){if(await this.asyncPause(),null===t||\"object\"!=typeof t)return;t.referencedId&&(t=await this.resolveReference(t));const i=[];if(Array.isArray(t)){for(const l of t){if(\"object\"!=typeof l)break;if(this.activePromises>=this.maxChildrenPromises)await this.traverse(e,l,r,n);else{const t=this.traverse(e,l,r,n);i.push(t)}}return this.activePromises+=i.length,await Promise.all(i),void(this.activePromises-=i.length)}const l=this.tree.parse({id:n?this.getNodeId(t):e,raw:Object.assign({},t),atomic:!0,children:[]});null===n?this.tree.addSubtree(l):this.tree.addNode(l,n);const a=this.getSpeckleType(t);if(this.directNodeConverterExists(t))try{return await this.convertToNode(t.data||t,l),void await r(null)}catch(e){We.warn(`(Traversing - direct) Failed to convert ${a} with id: ${t.id}`,e)}const s=t;let u=this.getDisplayValue(s);if(l.model.atomic=!!u,u){if(Array.isArray(u))for(const e of u){const n=await this.resolveReference(e);n.units||(n.units=t.units);const i=this.tree.parse({id:this.getNodeId(n),raw:Object.assign({},n),atomic:!1,children:[]});await this.convertToNode(n,i),this.tree.addNode(i,l),await r({})}else{u=await this.resolveReference(u),u.units||(u.units=t.units);try{const e=this.tree.parse({id:this.getNodeId(u),raw:Object.assign({},u),atomic:!1,children:[]});await this.convertToNode(u,e),this.tree.addNode(e,l),await r({})}catch(e){We.warn(`(Traversing) Failed to convert obj with id: ${t.id} — ${e.message}`)}}if(t.speckle_type.toLowerCase().includes(\"builtelements\")){const n=this.getElementsValue(t);return void(n&&(i.push(this.traverse(e,n,r,l)),this.activePromises+=i.length,await Promise.all(i),this.activePromises-=i.length))}}for(const t in s)if(\"__parents\"!==t&&\"bbox\"!==t&&\"__closure\"!==t&&![\"displayMesh\",\"@displayMesh\",\"displayValue\",\"@displayValue\"].includes(t)&&\"object\"==typeof s[t]&&null!==s[t])if(this.activePromises>=this.maxChildrenPromises)await this.traverse(e,s[t],r,l);else{const n=this.traverse(e,s[t],r,l);i.push(n)}this.activePromises+=i.length,await Promise.all(i),this.activePromises-=i.length}getNodeId(e){return this.spoofIDs?Pe():e.id}async dechunk(e){if(!e||0===e.length)return e;if(!e[0].referencedId)return e;const t=[];for(const r of e){const e=await this.objectLoader.getObject(r.referencedId);t.push(e.data)}return[].concat(...t)}async resolveReference(e){if(e.referencedId){return await this.objectLoader.getObject(e.referencedId)}return e}getSpeckleType(e){const t=this.getSpeckleTypeChain(e);for(const e of t){if(e in this.NodeConverterMapping)return e}return\"Base\"}getSpeckleTypeChain(e){let t=[\"Base\"];return t=e.data?e.data.speckle_type?e.data.speckle_type.split(\":\").reverse():t:e.speckle_type?e.speckle_type.split(\":\").reverse():t,t.map((e=>e.split(\".\").reverse()[0]))}directNodeConverterExists(e){const t=this.getSpeckleTypeChain(e);for(const e of t){const t=e in this.NodeConverterMapping;if(t)return t}return!1}async convertToNode(e,t){e.referencedId&&(e=await this.resolveReference(e));try{return this.directNodeConverterExists(e)?await this.NodeConverterMapping[this.getSpeckleType(e)](e,t):null}catch(t){throw We.warn(`(Direct convert) Failed to convert object with id: ${e.id}`),t}}getDisplayValue(e){const t=e.displayValue||e[\"@displayValue\"]||e.displayMesh||e[\"@displayMesh\"];if(t){if(Array.isArray(t)){const r=t.filter((e=>e));return t.length!==r.length&&We.warn(`Object ${e.id} has null display values which will be ignored`),r}return t}return null}getElementsValue(e){return e.elements||e[\"@elements\"]}getBlockDefinition(e){return e[\"@blockDefinition\"]||e.blockDefinition||e.definition||e[\"@definition\"]}getBlockDefinitionGeometry(e){return e[\"@geometry\"]||e.geometry}async View3DToNode(e,t){e.origin.units=e.units,e.target.units=e.units}async displayableLookup(e,t){if(this.directNodeConverterExists(e))await this.convertToNode(e,t);else{const r=this.getDisplayValue(e),n=this.getElementsValue(e),i=[...r||[],...n||[]];for(const e of i){const r=await this.resolveReference(e),n=this.tree.parse({id:this.getNodeId(r),raw:Object.assign({},r),atomic:!1,children:[]});this.tree.addNode(n,t),await this.displayableLookup(r,n)}}}async BlockInstanceToNode(e,t){const r=await this.resolveReference(this.getBlockDefinition(e));t.model.raw.definition=r;for(const n of this.getBlockDefinitionGeometry(r)){const r=await this.resolveReference(n);r.id=r.id+t.model.raw.transform.id;const i=this.tree.parse({id:this.getNodeId(r),raw:Object.assign({},r),atomic:!1,children:[]});this.tree.addNode(i,t),await this.displayableLookup(r,i);const l=this.getElementsValue(e);if(l)for(const r of l){const n=await this.resolveReference(r),i=this.tree.parse({id:this.getNodeId(n),raw:Object.assign({},n),atomic:!1,children:[]});i.model.raw.host=e.id,this.tree.addNode(i,t),await this.displayableLookup(n,i)}}}async RevitInstanceToNode(e,t){const r=async(e,r)=>{if(e)for(const n of e){const e=await this.resolveReference(n),i=this.tree.parse({id:this.getNodeId(e),raw:Object.assign({},e),atomic:!1,children:[]});r&&(i.model.raw.host=r),this.tree.addNode(i,t),await this.convertToNode(e,i)}},n=await this.resolveReference(e.definition);t.model.raw.definition=n,await r(this.getElementsValue(n)),await r(this.getDisplayValue(n)),await r(this.getElementsValue(e),e.id)}async PointcloudToNode(e,t){t.model.raw.points=await this.dechunk(e.points),t.model.raw.colors=await this.dechunk(e.colors)}async BrepToNode(e,t){try{if(!e)return;let r=this.getDisplayValue(e);if(Array.isArray(r)&&(r=r[0]),!r)return;const n=await this.resolveReference(r),i=this.tree.parse({id:this.getNodeId(n),raw:Object.assign({},n),atomic:!1,children:[]});await this.convertToNode(n,i),this.tree.addNode(i,t),delete e.Edges,delete e.Faces,delete e.Loops,delete e.Trims,delete e.Curve2D,delete e.Curve3D,delete e.Surfaces,delete e.Vertices}catch(t){throw We.warn(`Failed to convert brep id: ${e.id}`),t}}async MeshToNode(e,t){e&&(e.vertices&&0!==e.vertices.length?e.faces&&0!==e.faces.length?(t.model.raw.vertices=await this.dechunk(e.vertices),t.model.raw.faces=await this.dechunk(e.faces),t.model.raw.colors=await this.dechunk(e.colors)):We.warn(`Object id ${e.id} of type ${e.speckle_type} has no face data and will be ignored`):We.warn(`Object id ${e.id} of type ${e.speckle_type} has no vertex position data and will be ignored`))}async TextToNode(e,t){}async DimensionToNode(e,t){const r=[...this.getDisplayValue(e)];for(const e of r){const r=this.tree.parse({id:this.getNodeId(e),raw:Object.assign({},e),atomic:!1,children:[]});this.tree.addNode(r,t),await this.convertToNode(e,r)}const n=JSON.parse(JSON.stringify(e));n.plane=n.RhinoProps.plane;switch(this.getSpeckleTypeChain(n)[0]){case\"LengthDimension\":n.plane.origin=n.position;break;case\"DistanceDimension\":case\"AngleDimension\":n.plane.origin=n.textPosition}n.speckle_type=\"Objects.Other.Text\";const i=this.tree.parse({id:this.getNodeId(n),raw:n,atomic:!1,children:[]});this.tree.addNode(i,t),await this.convertToNode(n,i)}async PointToNode(e,t){}async LineToNode(e,t){t.model.raw.start=Object.assign({},e.start),t.model.raw.end=Object.assign({},e.end)}async PolylineToNode(e,t){t.model.raw.value=await this.dechunk(e.value)}async BoxToNode(e,t){}async PolycurveToNode(e,t){t.model.nestedNodes=[];for(let r=0;r{await this.converter.asyncPause(),i++})),t=!1,n=e.totalChildrenCount),r++,this.emiter.emit(it.LoadProgress,{progress:r/(n+1),id:this.objectId})}l&&await l,We.warn(`Finished downloading object ${this.objectId} in ${(performance.now()-e)/1e3} seconds`),this.emiter.emit(it.DownloadComplete,this.objectUrl),0===i&&(We.warn(`Viewer: no 3d objects found in object ${this.objectId}`),this.emiter.emit(\"load-warning\",{message:`No displayable objects found in object ${this.objectId}.`}))}cancelLoad(){this.cancel=!0}dispose(){this.loader.dispose()}}class ut{constructor(){this._events={}}on(e,t){this._events[e]||(this._events[e]=[]),this._events[e].push(t)}removeListener(e,t){if(!this._events[e])return;this._events[e]=this._events[e].filter((e=>e!==t))}emit(e,...t){if(!this._events[e])return;this._events[e].forEach((e=>{e(...t)}))}dispose(){this._events=null}}let dt;function pt(e){return e.isOrthographicCamera}!function(e){e[e.NONE=0]=\"NONE\",e[e.ROTATE=1]=\"ROTATE\",e[e.TRUCK=2]=\"TRUCK\",e[e.OFFSET=3]=\"OFFSET\",e[e.DOLLY=4]=\"DOLLY\",e[e.ZOOM=5]=\"ZOOM\",e[e.TOUCH_ROTATE=6]=\"TOUCH_ROTATE\",e[e.TOUCH_TRUCK=7]=\"TOUCH_TRUCK\",e[e.TOUCH_OFFSET=8]=\"TOUCH_OFFSET\",e[e.TOUCH_DOLLY=9]=\"TOUCH_DOLLY\",e[e.TOUCH_ZOOM=10]=\"TOUCH_ZOOM\",e[e.TOUCH_DOLLY_TRUCK=11]=\"TOUCH_DOLLY_TRUCK\",e[e.TOUCH_DOLLY_OFFSET=12]=\"TOUCH_DOLLY_OFFSET\",e[e.TOUCH_ZOOM_TRUCK=13]=\"TOUCH_ZOOM_TRUCK\",e[e.TOUCH_ZOOM_OFFSET=14]=\"TOUCH_ZOOM_OFFSET\"}(dt||(dt={}));function ot(e,t=1e-5){return Math.abs(e){const n=Math.pow(.95,-e*this.dollySpeed),i=this._sphericalEnd.radius*n,l=this._sphericalEnd.radius,a=l*(e>=0?-1:1);this.dollyTo(i,!0,.9),this.infinityDolly&&(i{const n=Math.pow(.95,e*this.dollySpeed),i=Math.pow(.95,-e*this.dollySpeed),l=this._sphericalEnd.radius*i;this.dollyTo(l,!0,.9),this.zoomTo(this._zoom*n,!1,1),this._didDolly=!0,this.dispatchEvent({type:\"controlstart\"}),this.dollyToCursor&&(this._dollyControlAmount=this._zoomEnd,this._dollyControlCoord.set(t,r))}}static install(){St=new t,ht=new t,Vt=new t,mt=new t,zt=new t,Xt=new t,vt=new t,ft=new t}get hasRested(){return this._hasRested}set isTrucking(e){this._isTrucking=e}zoomTo(e,t=!1,n){this._zoomEnd=r.clamp(e,this.minZoom,this.maxZoom),this._needsUpdate=!0,this.overrideZoomLerpRatio=t?.05:n,t||(this._zoom=this._zoomEnd);const i=!t||ct(this._zoom,this._zoomEnd,this.restThreshold);return this._createOnRestPromise(i)}dollyTo(e,t=!0,n){const i=this._sphericalEnd.radius,l=r.clamp(e,this.minDistance,this.maxDistance);if(this.colliderMeshes.length>=1){const e=this._collisionTest(),t=ct(e,this._spherical.radius);if(!(i>l)&&t)return Promise.resolve();this._sphericalEnd.radius=Math.min(l,e)}else this._sphericalEnd.radius=l;this._needsUpdate=!0,this.overrideDollyLerpRatio=n,t||(this._spherical.radius=this._sphericalEnd.radius,this._didDolly=!0,this.dispatchEvent({type:\"controlstart\"}));const a=!t||ct(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(a)}update(e){this._hasRestedLastFrame=this._hasRested;const t=this._state===dt.NONE?this.dampingFactor:this.draggingDampingFactor,n=Math.min(t*e*60,1),i=this._sphericalEnd.theta-this._spherical.theta,l=this._sphericalEnd.phi-this._spherical.phi,a=this._sphericalEnd.radius-this._spherical.radius,s=vt.subVectors(this._targetEnd,this._target),u=ft.subVectors(this._focalOffsetEnd,this._focalOffset);if(ot(i)&&ot(l)&&ot(a)&&ot(s.x)&&ot(s.y)&&ot(s.z)&&ot(u.x)&&ot(u.y)&&ot(u.z)?(this._spherical.copy(this._sphericalEnd),this._target.copy(this._targetEnd),this._focalOffset.copy(this._focalOffsetEnd)):(this._spherical.set(this._spherical.radius+a*(this.overrideDollyLerpRatio?this.overrideDollyLerpRatio:n),this._spherical.phi+l*n,this._spherical.theta+i*n),this._target.add(s.multiplyScalar(n)),this._focalOffset.add(u.multiplyScalar(n)),this._needsUpdate=!0),0!==this._dollyControlAmount){if(this._camera.isPerspectiveCamera){const e=this._camera,t=St.setFromSpherical(this._sphericalEnd).applyQuaternion(this._yAxisUpSpaceInverse).normalize().negate(),n=ht.copy(t).cross(e.up).normalize();0===n.lengthSq()&&(n.x=1);const i=Vt.crossVectors(n,t),l=this._sphericalEnd.radius*Math.tan(e.getEffectiveFOV()*r.DEG2RAD*.5),a=(this._sphericalEnd.radius-this._dollyControlAmount-this._sphericalEnd.radius)/this._sphericalEnd.radius,s=St.copy(this._targetEnd).add(n.multiplyScalar(this._dollyControlCoord.x*l*e.aspect)).add(i.multiplyScalar(this._dollyControlCoord.y*l));this._targetEnd.lerp(s,a),this._target.copy(this._targetEnd)}else if(pt(this._camera)){const e=this._camera,t=St.set(this._dollyControlCoord.x,this._dollyControlCoord.y,(e.near+e.far)/(e.near-e.far)).unproject(e),r=ht.set(0,0,-1).applyQuaternion(e.quaternion),n=r.dot(e.up),i=ot(n)?-t.dot(e.up):-t.dot(e.up)/n,l=Vt.copy(t).add(r.multiplyScalar(i));this._targetEnd.lerp(l,1-e.zoom/this._dollyControlAmount),this._target.copy(this._targetEnd)}this._dollyControlAmount=0}const d=this._collisionTest();this._spherical.radius=Math.min(this._spherical.radius,d),this._spherical.makeSafe(),this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target),this._camera.lookAt(this._target);(!ot(this._focalOffset.x)||!ot(this._focalOffset.y)||!ot(this._focalOffset.z))&&(this._camera.updateMatrix(),mt.setFromMatrixColumn(this._camera.matrix,0),zt.setFromMatrixColumn(this._camera.matrix,1),Xt.setFromMatrixColumn(this._camera.matrix,2),mt.multiplyScalar(this._focalOffset.x),zt.multiplyScalar(-this._focalOffset.y),Xt.multiplyScalar(this._focalOffset.z),St.copy(mt).add(zt).add(Xt),this._camera.position.add(St)),this._boundaryEnclosesCamera&&this._encloseToBoundary(this._camera.position.copy(this._target),St.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse),1);const p=this._zoomEnd-this._zoom;this._zoom+=p*(this.overrideZoomLerpRatio?this.overrideZoomLerpRatio:n),this._camera.zoom!==this._zoom?(ot(p)&&(this._zoom=this._zoomEnd),this._camera.zoom=this._zoom,this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0,this._didZoom=!0):this._didZoom=!1;const o=this._needsUpdate;return o&&!this._updatedLastTime?(this._hasRested=!1,this.dispatchEvent({type:\"wake\"}),this.dispatchEvent({type:\"update\"})):o?(this.dispatchEvent({type:\"update\"}),!(ot(i,this.restThreshold)&&ot(l,this.restThreshold)&&ot(a,this.restThreshold)&&ot(s.x,this.restThreshold)&&ot(s.y,this.restThreshold)&&ot(s.z,this.restThreshold)&&ot(u.x,this.restThreshold)&&ot(u.y,this.restThreshold)&&ot(u.z,this.restThreshold))||this._hasRested||this._isTrucking||pt(this._camera)&&this._didZoom||(this._hasRested=!0,this.dispatchEvent({type:\"rest\"}))):!o&&this._updatedLastTime&&this.dispatchEvent({type:\"sleep\"}),this._didDollyLastFrame&&(!(ot(i,this.restThreshold)&&ot(l,this.restThreshold)&&ot(a,this.restThreshold)&&ot(s.x,this.restThreshold)&&ot(s.y,this.restThreshold)&&ot(s.z,this.restThreshold)&&ot(u.x,this.restThreshold)&&ot(u.y,this.restThreshold)&&ot(u.z,this.restThreshold))||this._isTrucking||pt(this._camera)&&this._didZoom||(this.dispatchEvent({type:\"rest\"}),this._didDollyLastFrame=!1)),this._didDolly&&(this._didDolly=!1,this._didDollyLastFrame=!0),this._updatedLastTime=o,this._needsUpdate=!1,o&&!this._hasRested}}class qt{constructor(t){this.viewer=t,this.camera=new e.PerspectiveCamera(55,window.innerWidth/window.innerHeight),this.camera.up.set(0,0,1),this.camera.position.set(1,1,1),this.camera.updateProjectionMatrix();const r=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight;this.orthoCamera=new e.OrthographicCamera(-50*r/2,50*r/2,25,-25,.001,1e4),this.orthoCamera.up.set(0,0,1),this.orthoCamera.position.set(100,100,100),this.orthoCamera.updateProjectionMatrix(),ye.install({THREE:e}),bt.install(),this.controls=new bt(this.camera,this.viewer.container),this.controls.maxPolarAngle=Math.PI/2,this.setupWASDControls(),this.cameras=[{camera:this.camera,controls:this.controls,name:\"perspective\",active:!0},{camera:this.orthoCamera,controls:this.controls,name:\"ortho\",active:!1}],this.orbiting=!1,this.controls.addEventListener(\"transitionstart\",(()=>{this.orbiting=!0})),this.controls.addEventListener(\"controlend\",(()=>{})),this.controls.addEventListener(\"rest\",(()=>{setTimeout((()=>{this.orbiting=!1}),400)})),window.addEventListener(\"resize\",this.onWindowResize.bind(this),!1),this.onWindowResize()}get activeCam(){return this.cameras[0].active?this.cameras[0]:this.cameras[1]}set activeCam(e){if(\"perspective\"===e)this.setPerspectiveCameraOn();else{if(\"ortho\"!==e)throw new Error(`'${e}' projection mode is invalid. Try with 'perspective' or 'ortho'.`);this.setOrthoCameraOn()}}set enabled(e){this.controls.enabled=e}setPerspectiveCameraOn(){this.cameras[0].active||(this.cameras[0].active=!0,this.cameras[1].active=!1,this.setupPerspectiveCamera(),this.viewer.needsRender=!0)}setOrthoCameraOn(){this.cameras[1].active||(this.cameras[0].active=!1,this.cameras[1].active=!0,this.setupOrthoCamera(),this.viewer.needsRender=!0)}toggleCameras(){this.cameras[0].active?this.setOrthoCameraOn():this.setPerspectiveCameraOn()}setupOrthoCamera(){this.previousDistance=this.controls.distance,this.controls.mouseButtons.wheel=ye.ACTION.ZOOM;const t=new e.Vector3;this.camera.getWorldDirection(t);const r=(new e.Vector3).copy(this.viewer.World.worldOrigin).clone().sub(this.camera.position).length(),n=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight,i=this.camera.fov,l=2*r*Math.atan(i*(Math.PI/180)/2),a=l*n;this.orthoCamera.zoom=1,this.orthoCamera.left=a/-2,this.orthoCamera.right=a/2,this.orthoCamera.top=l/2,this.orthoCamera.bottom=l/-2,this.orthoCamera.far=this.camera.far,this.orthoCamera.near=1e-4,this.orthoCamera.updateProjectionMatrix(),this.orthoCamera.position.copy(this.camera.position),this.orthoCamera.quaternion.copy(this.camera.quaternion),this.orthoCamera.updateProjectionMatrix(),this.controls.camera=this.orthoCamera,this.viewer.emit(\"projection-change\",\"ortho\")}setupPerspectiveCamera(){this.controls.mouseButtons.wheel=ye.ACTION.DOLLY,this.camera.position.copy(this.orthoCamera.position),this.camera.quaternion.copy(this.orthoCamera.quaternion),this.camera.updateProjectionMatrix(),this.controls.camera=this.camera,this.controls.zoomTo(1),this.enableRotations(),this.viewer.emit(\"projection-change\",\"perspective\")}disableRotations(){this.controls.mouseButtons.left=ye.ACTION.TRUCK}enableRotations(){this.controls.mouseButtons.left=ye.ACTION.ROTATE}setupWASDControls(){const e=65,t=83,r=68,n=new Re(87,16.666),i=new Re(e,16.666),l=new Re(t,16.666),a=new Re(r,16.666),s=new Array(4),u=(e,t)=>{s[e]=t,s.every((e=>!1===e))?(this.controls.isTrucking=!1,this.controls.dispatchEvent({type:\"rest\"})):this.controls.isTrucking=!0};i.addEventListener(Me.HOLD_START,function(){this.controls.dispatchEvent({type:\"controlstart\"})}.bind(this)),i.addEventListener(\"holding\",function(e){!1!==this.viewer.mouseOverRenderer&&(u(0,!0),this.controls.truck(-.01*e.deltaTime,0,!1))}.bind(this)),i.addEventListener(Me.HOLD_END,function(){u(0,!1)}.bind(this)),a.addEventListener(Me.HOLD_START,function(){this.controls.dispatchEvent({type:\"controlstart\"})}.bind(this)),a.addEventListener(\"holding\",function(e){!1!==this.viewer.mouseOverRenderer&&(u(1,!0),this.controls.truck(.01*e.deltaTime,0,!1))}.bind(this)),a.addEventListener(Me.HOLD_END,function(){u(1,!1)}.bind(this)),n.addEventListener(Me.HOLD_START,function(){this.controls.dispatchEvent({type:\"controlstart\"})}.bind(this)),n.addEventListener(\"holding\",function(e){!1!==this.viewer.mouseOverRenderer&&(u(2,!0),this.controls.forward(.01*e.deltaTime,!1))}.bind(this)),n.addEventListener(Me.HOLD_END,function(){u(2,!1)}.bind(this)),l.addEventListener(Me.HOLD_START,function(){this.controls.dispatchEvent({type:\"controlstart\"})}.bind(this)),l.addEventListener(\"holding\",function(e){!1!==this.viewer.mouseOverRenderer&&(u(3,!0),this.controls.forward(-.01*e.deltaTime,!1))}.bind(this)),l.addEventListener(Me.HOLD_END,function(){u(3,!1)}.bind(this))}onWindowResize(){this.camera.aspect=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight,this.camera.updateProjectionMatrix();const t=new e.Vector3;this.camera.getWorldDirection(t);const r=new e.Vector3;this.controls.getTarget(r);const n=r.clone().sub(this.camera.position).dot(t),i=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight,l=this.camera.fov,a=2*n*Math.atan(l*(Math.PI/180)/2),s=a*i;this.orthoCamera.zoom=1,this.orthoCamera.left=s/-2,this.orthoCamera.right=s/2,this.orthoCamera.top=a/2,this.orthoCamera.bottom=a/-2,this.orthoCamera.updateProjectionMatrix()}_setOrbitPoint(t,r){const n=this.viewer.container.getBoundingClientRect(),i=t-n.left,l=r-n.top,a=new e.Vector2(i/n.width*2-1,(n.height-l)/n.height*2-1),s=new e.Raycaster;s.setFromCamera(a,this.camera);const u=s.intersectObjects(this.viewer.sceneManager.allObjects);0!==u.length&&this.controls.setOrbitPoint(u[0].point.x,u[0].point.y,u[0].point.z,!1)}}var Kt;!function(e){e[e.MESH=0]=\"MESH\",e[e.LINE=1]=\"LINE\",e[e.POINT=2]=\"POINT\",e[e.POINT_CLOUD=3]=\"POINT_CLOUD\",e[e.TEXT=4]=\"TEXT\"}(Kt||(Kt={}));const Ut={offset:0,count:0},Tt={offset:0,count:1/0};var xt;!function(e){e.POSITION=\"POSITION\",e.COLOR=\"COLOR\",e.NORMAL=\"NORMAL\",e.UV=\"UV\",e.TANGENT=\"TANGENT\",e.INDEX=\"INDEX\"}(xt||(xt={}));class Pt{static updateRTEGeometry(e,t){if(\"BufferGeometry\"===e.type||\"PlaneGeometry\"===e.type||\"CircleGeometry\"===e.type){const r=new Float32Array(t.length),i=e.attributes.position.array;Pt.DoubleToHighLowBuffer(t,r,i),e.setAttribute(\"position_low\",new n(r,3))}else if(\"LineGeometry\"===e.type||\"LineSegmentsGeometry\"===e.type){const r=new Float32Array(t.length),n=e.attributes.instanceStart.array;Pt.DoubleToHighLowBuffer(t,r,n);const a=new i(new Float32Array(r),6,1);e.setAttribute(\"instanceStartLow\",new l(a,3,0)),e.setAttribute(\"instanceEndLow\",new l(a,3,3))}}static mergeGeometryAttribute(e,t){let r=0;for(let n=0;ne.attributes[xt.INDEX])),n=e.map((e=>e.attributes[xt.POSITION]));r.attributes[xt.INDEX]=Pt.mergeIndexAttribute(t,n)}for(const n in t)if(n!==xt.INDEX){const t=e.map((e=>e.attributes[n]));r.attributes[n]=Pt.mergeGeometryAttribute(t,n===xt.POSITION?new Float64Array(t.reduce(((e,t)=>e+t.length),0)):new Float32Array(t.reduce(((e,t)=>e+t.length),0)))}return e.forEach((e=>{for(const t in e.attributes)delete e.attributes[t]})),r}static transformGeometryData(e,t){if(!e.attributes.POSITION)return;const r=t.elements;for(let t=0;t>16&255,l=n>>8&255,a=255&n;t[3*r]=i/255,t[3*r+1]=l/255,t[3*r+2]=a/255}return t}static DoubleToHighLowVector(e,t,r){let n=e.x;if(n>=0){this.floatArrayBuff[0]=n;const e=this.floatArrayBuff[0];r.x=e,t.x=n-e}else{this.floatArrayBuff[0]=-n;const e=this.floatArrayBuff[0];r.x=-e,t.x=n+e}if(n=e.y,n>=0){this.floatArrayBuff[0]=n;const e=this.floatArrayBuff[0];r.y=e,t.y=n-e}else{this.floatArrayBuff[0]=-n;const e=this.floatArrayBuff[0];r.y=-e,t.y=n+e}if(n=e.z,n>=0){this.floatArrayBuff[0]=n;const e=this.floatArrayBuff[0];r.z=e,t.z=n-e}else{this.floatArrayBuff[0]=-n;const e=this.floatArrayBuff[0];r.z=-e,t.z=n+e}}static DoubleToHighLowBuffer(e,t,r){for(let n=0;n=0){this.floatArrayBuff[0]=i;const e=this.floatArrayBuff[0];r[n]=e,t[n]=i-e}else{this.floatArrayBuff[0]=-i;const e=this.floatArrayBuff[0];r[n]=-e,t[n]=i+e}}}static computeVertexNormals(e,r){const n=e.index,i=e.getAttribute(\"position\");if(void 0!==i){let l=e.getAttribute(\"normal\");if(void 0===l)l=new a(new Float32Array(3*i.count),3),e.setAttribute(\"normal\",l);else for(let e=0,t=l.count;e=65535||e.length>=65535?(l=new Uint32Array(e.length),l.set(e,0),i.setIndex(new d(l,1))):(l=new Uint16Array(e.length),l.set(e,0),i.setIndex(new p(l,1))),i.setAttribute(\"position\",new n(t,3)),i.computeBoundingBox();return new yt(i,r)}constructor(e,t={}){super(e,t)}raycast(e,t=o){const r=super.raycast(this.transformInput(e),t);return r.forEach((e=>{e.point=this.transformOutput(e.point)})),r}raycastFirst(e,t=o){const r=super.raycastFirst(this.transformInput(e),t);return r.point=this.transformOutput(r.point),r}shapecast(e){const t=new c,r=new Oe,n=Object.create(null);return e.intersectsBounds&&(n.intersectsBounds=(r,n,i,l,a)=>(t.copy(r),this.transformOutput(t),e.intersectsBounds(t,n,i,l,a))),e.intersectsTriangle&&(n.intersectsTriangle=(t,n,i,l)=>(r.copy(t),this.transformOutput(r.a),this.transformOutput(r.b),this.transformOutput(r.c),e.intersectsTriangle(r,n,i,l))),n.intersectsRange=e.intersectsRange,n.traverseBoundsOrder=e.traverseBoundsOrder,super.shapecast(n)}transformInput(e){return yt.MatBuff.copy(this.inputOriginTransform).premultiply(this.inputTransform),e.applyMatrix4(yt.MatBuff)}transformOutput(e){return yt.MatBuff.copy(this.outputOriginTransfom).multiply(this.outputTransform),e.applyMatrix4(yt.MatBuff)}getBoundingBox(e){return super.getBoundingBox(e),this.transformOutput(e)}getVertexAtIndex(e){const r=this.geometry.attributes.position.array;return this.transformOutput(new t(r[3*e],r[3*e+1],r[3*e+2]))}}yt.MatBuff=new s;class Rt{constructor(e){this.batchObjects=[],this.bounds=new c(new t(0,0,0),new t(0,0,0)),this.boxHelpers=[],this.tas=null,this.lastRefitTime=0,this.batchObjects=e,this.buildTAS(),this.getBoundingBox(this.bounds)}buildTAS(){const e=[],t=new Float32Array(3*Rt.CUBE_VERTS*this.batchObjects.length);let r=0;for(let n=0;ne+r/3))),this.batchObjects[n].tasVertIndexStart=r/3,this.batchObjects[n].tasVertIndexEnd=r/3+Rt.CUBE_VERTS,r+=3*Rt.CUBE_VERTS,Rt.debugBoxes){const e=new v(i);e.layers.set(En.PROPS),this.boxHelpers.push(e)}}this.tas=yt.buildBVH(e,t),this.tas.inputTransform=new s,this.tas.outputTransform=new s,this.tas.inputOriginTransform=new s,this.tas.outputOriginTransfom=new s}updateVertArray(e,t,r){r[t]=e.min.x,r[t+1]=e.min.y,r[t+2]=e.max.z,r[t+3]=e.max.x,r[t+4]=e.min.y,r[t+5]=e.max.z,r[t+6]=e.max.x,r[t+7]=e.max.y,r[t+8]=e.max.z,r[t+9]=e.min.x,r[t+10]=e.max.y,r[t+11]=e.max.z,r[t+12]=e.min.x,r[t+13]=e.min.y,r[t+14]=e.min.z,r[t+15]=e.max.x,r[t+16]=e.min.y,r[t+17]=e.min.z,r[t+18]=e.max.x,r[t+19]=e.max.y,r[t+20]=e.min.z,r[t+21]=e.min.x,r[t+22]=e.max.y,r[t+23]=e.min.z}refit(){const e=performance.now(),t=this.tas.geometry.attributes.position.array,r=new c;for(let e=0;e{const l=this.tas.geometry.index.array[3*i.faceIndex],a=Math.trunc(l/Rt.CUBE_VERTS);n.copy(e);const s=this.batchObjects[a].bvh.raycast(n,t);s.forEach((e=>{e.batchObject=this.batchObjects[a]})),r.push(...s)})),r):r}raycastFirst(e,t=o){const r=new f;r.copy(e);const n=this.tas.raycastFirst(r,o);if(!n)return null;const i=this.tas.geometry.index.array[3*n.faceIndex],l=Math.trunc(i/Rt.CUBE_VERTS);r.copy(e);const a=this.batchObjects[l].bvh.raycast(r,t);a.forEach((e=>{e.batchObject=this.batchObjects[l]})),null.push(...a)}shapecast(e){let t=!1;return this.tas.shapecast({intersectsBounds:(t,r,n,i,l)=>e.intersectsTAS(t,r,n,i,l),intersectsRange:r=>{const n=this.tas.geometry.index.array[3*r],i=Math.trunc(n/Rt.CUBE_VERTS);return t||(t=this.batchObjects[i].bvh.shapecast((t=>{const r=Object.create(null);return e.intersectsBounds&&(r.intersectsBounds=e.intersectsBounds),e.intersectsTriangle&&(r.intersectsTriangle=(r,n,i,l)=>e.intersectsTriangle(r,n,i,l,t)),r.intersectsRange=e.intersectsRange,r.traverseBoundsOrder=e.traverseBoundsOrder,r})(this.batchObjects[i]))),!1}}),t}getBoundingBox(e){return this.tas.getBoundingBox(e),e}}Rt.debugBoxes=!1,Rt.cubeIndices=[0,1,2,2,3,0,1,5,6,6,2,1,7,6,5,5,4,7,4,0,3,3,7,4,4,5,1,1,0,4,3,2,6,6,7,3],Rt.CUBE_VERTS=8;class Mt{static triangulateFace(e,t,r){let n=t[e];function i(t){return e+t+1}function l(e){const n=3*t[i(e)];return new Nt(r[n],r[n+1],r[n+2])}n<3&&(n+=3);const a=Array(3*(n-2)),s=new Nt(0,0,0);for(let e=n-1,t=0;t=3;){let e=!0;if(n>3&&o0}}class Nt{constructor(e,t,r){this.x=e,this.y=t,this.z=r}add(e){return new Nt(this.x+e.x,this.y+e.y,this.z+e.z)}sub(e){return new Nt(this.x-e.x,this.y-e.y,this.z-e.z)}mul(e){return new Nt(this.x-e,this.y-e,this.z-e)}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}cross(e){const t=this.y*e.z-this.z*e.y,r=this.z*e.x-this.x*e.z,n=this.x*e.y-this.y*e.x;return new Nt(t,r,n)}squareSum(){return this.x*this.x+this.y*this.y+this.z*this.z}normalize(){const e=1/Math.sqrt(this.squareSum());this.x*=e,this.y*=e,this.z*=e}}const Ot={Millimeters:\"mm\",Centimeters:\"cm\",Meters:\"m\",Kilometers:\"km\",Inches:\"in\",Feet:\"ft\",Yards:\"yd\",Miles:\"mi\"};function Lt(e,t=Ot.Meters){switch(e=Zt(e),t=Zt(t),e){case Ot.Millimeters:switch(t){case Ot.Centimeters:return.1;case Ot.Meters:return.001;case Ot.Kilometers:return 1e-6;case Ot.Inches:return.0393701;case Ot.Feet:return.00328084;case Ot.Yards:return.00109361;case Ot.Miles:return 6.21371e-7}break;case Ot.Centimeters:switch(t){case Ot.Millimeters:return 10;case Ot.Meters:return.01;case Ot.Kilometers:return 1e-5;case Ot.Inches:return.393701;case Ot.Feet:return.0328084;case Ot.Yards:return.0109361;case Ot.Miles:return 621371e-11}break;case Ot.Meters:switch(t){case Ot.Millimeters:return 1e3;case Ot.Centimeters:return 100;case Ot.Kilometers:return.001;case Ot.Inches:return 39.3701;case Ot.Feet:return 3.28084;case Ot.Yards:return 1.09361;case Ot.Miles:return 621371e-9}break;case Ot.Kilometers:switch(t){case Ot.Millimeters:return 1e6;case Ot.Centimeters:return 1e5;case Ot.Meters:return 1e3;case Ot.Inches:return 39370.1;case Ot.Feet:return 3280.84;case Ot.Yards:return 1093.61;case Ot.Miles:return.621371}break;case Ot.Inches:switch(t){case Ot.Millimeters:return 25.4;case Ot.Centimeters:return 2.54;case Ot.Meters:return.0254;case Ot.Kilometers:return 254e-7;case Ot.Feet:return.0833333;case Ot.Yards:return.027777694;case Ot.Miles:return 157828e-10}break;case Ot.Feet:switch(t){case Ot.Millimeters:return 304.8;case Ot.Centimeters:return 30.48;case Ot.Meters:return.3048;case Ot.Kilometers:return 3048e-7;case Ot.Inches:return 12;case Ot.Yards:return.333332328;case Ot.Miles:return 189394e-9}break;case Ot.Miles:switch(t){case Ot.Millimeters:return 1609e3;case Ot.Centimeters:return 160934;case Ot.Meters:return 1609.34;case Ot.Kilometers:return 1.60934;case Ot.Inches:return 63360;case Ot.Feet:return 5280;case Ot.Yards:return 1759.99469184}}return 1}function Zt(e){if(!e)return Ot.Meters;switch(e.toLowerCase()){case\"mm\":case\"mil\":case\"millimeters\":case\"millimetres\":return Ot.Millimeters;case\"cm\":case\"centimetre\":case\"centimeter\":case\"centimetres\":case\"centimeters\":return Ot.Centimeters;case\"m\":case\"meter\":case\"metre\":case\"meters\":case\"metres\":default:return Ot.Meters;case\"inches\":case\"inch\":case\"in\":return Ot.Inches;case\"feet\":case\"foot\":case\"ft\":return Ot.Feet;case\"yard\":case\"yards\":case\"yd\":return Ot.Yards;case\"miles\":case\"mile\":case\"mi\":return Ot.Miles;case\"km\":case\"kilometers\":return Ot.Kilometers}}var kt;!function(e){e.View3D=\"View3D\",e.BlockInstance=\"BlockInstance\",e.Pointcloud=\"Pointcloud\",e.Brep=\"Brep\",e.Mesh=\"Mesh\",e.Point=\"Point\",e.Line=\"Line\",e.Polyline=\"Polyline\",e.Box=\"Box\",e.Polycurve=\"Polycurve\",e.Curve=\"Curve\",e.Circle=\"Circle\",e.Arc=\"Arc\",e.Ellipse=\"Ellipse\",e.RevitInstance=\"RevitInstance\",e.Text=\"Text\",e.Unknown=\"Unknown\"}(kt||(kt={}));const Gt=[kt.Pointcloud,kt.Brep,kt.Mesh,kt.Point,kt.Line,kt.Polyline,kt.Box,kt.Polycurve,kt.Curve,kt.Circle,kt.Arc,kt.Ellipse,kt.Text];class jt{static getSpeckleType(e){let t=[\"Base\"];t=e.raw.data?e.raw.data.speckle_type?e.raw.data.speckle_type.split(\":\").reverse():t:e.raw.speckle_type?e.raw.speckle_type.split(\":\").reverse():t,t=t.map((e=>e.split(\".\").reverse()[0]));for(const e of t)if(e in kt)return e;return kt.Unknown}static convertNodeToGeometryData(e){switch(jt.getSpeckleType(e)){case kt.BlockInstance:return jt.BlockInstanceToGeometryData(e);case kt.Pointcloud:return jt.PointcloudToGeometryData(e);case kt.Brep:return jt.BrepToGeometryData(e);case kt.Mesh:return jt.MeshToGeometryData(e);case kt.Point:return jt.PointToGeometryData(e);case kt.Line:return jt.LineToGeometryData(e);case kt.Polyline:return jt.PolylineToGeometryData(e);case kt.Box:return jt.BoxToGeometryData(e);case kt.Polycurve:return jt.PolycurveToGeometryData(e);case kt.Curve:return jt.CurveToGeometryData(e);case kt.Circle:return jt.CircleToGeometryData(e);case kt.Arc:return jt.ArcToGeometryData(e);case kt.Ellipse:return jt.EllipseToGeometryData(e);case kt.View3D:return jt.View3DToGeometryData(e);case kt.RevitInstance:return jt.RevitInstanceToGeometryData(e);case kt.Text:return jt.TextToGeometryData(e);case kt.Unknown:return null}}static disposeNodeGeometryData(e){switch(jt.getSpeckleType(e)){case kt.Pointcloud:e.raw.vertices=[],e.raw.colors=[];break;case kt.Mesh:e.raw.vertices=[],e.raw.faces=[],e.raw.colors=[];break;case kt.Point:e.raw.value?e.raw.value=[]:(delete e.raw.x,delete e.raw.y,delete e.raw.z);break;case kt.Line:e.raw.start.value?e.raw.start.value=[]:(delete e.raw.start.x,delete e.raw.start.y,delete e.raw.start.z),e.raw.end.value?e.raw.end.value=[]:(delete e.raw.end.x,delete e.raw.end.y,delete e.raw.end.z);break;case kt.Polyline:e.raw.value=[]}}static View3DToGeometryData(e){const t=jt.PointToVector3(e.raw.origin),r=jt.PointToVector3(e.raw.target);return e.raw.origin=t,e.raw.target=r,{attributes:null,bakeTransform:null,transform:null}}static BlockInstanceToGeometryData(e){const t=Lt(e.raw.units),r=Array.isArray(e.raw.transform)?e.raw.transform:e.raw.transform.value?e.raw.transform.value:e.raw.transform.matrix,n=(new s).fromArray(r).transpose();return{attributes:null,bakeTransform:null,transform:(new s).makeScale(t,t,t).multiply(n).multiply((new s).makeScale(1/t,1/t,1/t))}}static RevitInstanceToGeometryData(e){const t=Lt(e.raw.units),r=Array.isArray(e.raw.transform)?e.raw.transform:e.raw.transform.value?e.raw.transform.value:e.raw.transform.matrix,n=(new s).fromArray(r).transpose();return{attributes:null,bakeTransform:null,transform:(new s).makeScale(t,t,t).multiply(n).multiply((new s).makeScale(1/t,1/t,1/t))}}static PointcloudToGeometryData(e){const t=Lt(e.raw.units),r=e.raw.points,n=e.raw.colors;let i=null;return n&&0!==n.length&&(n.length!==r.length/3&&We.warn(`Mesh (id ${e.raw.id}) colours are mismatched with vertice counts. The number of colours must equal the number of vertices.`),i=jt.unpackColors(n,!0)),{attributes:{POSITION:r,COLOR:i},bakeTransform:(new s).makeScale(t,t,t),transform:null}}static BrepToGeometryData(e){return null}static MeshToGeometryData(e){if(!e.raw)return;const t=Lt(e.raw.units),r=[];if(!e.raw.vertices)return;if(!e.raw.faces)return;const n=e.raw.vertices,i=e.raw.faces,l=e.raw.colors;let a,u=0;for(;uvoid 0!==e)))}u+=e+1}return l&&0!==l.length&&(l.length!==n.length/3&&We.warn(`Mesh (id ${e.raw.id}) colours are mismatched with vertice counts. The number of colours must equal the number of vertices.`),a=jt.unpackColors(l)),{attributes:{POSITION:n,INDEX:r,...a&&{COLOR:a}},bakeTransform:(new s).makeScale(t,t,t),transform:null}}static TextToGeometryData(e){const r=Lt(e.raw.units),n=e.raw.plane,i=new t(n.origin.x,n.origin.y,n.origin.z),l=(new s).makeScale(r,r,r),a=(new s).makeBasis(n.xdir,n.ydir,n.normal);return a.setPosition(i),a.premultiply(l),{attributes:null,bakeTransform:a,transform:null,metaData:e.raw}}static PointToGeometryData(e){const t=Lt(e.raw.units);return{attributes:{POSITION:this.PointToFloatArray(e.raw)},bakeTransform:(new s).makeScale(t,t,t),transform:null}}static LineToGeometryData(e){const t=Lt(e.raw.units);return{attributes:{POSITION:this.PointToFloatArray(e.raw.start).concat(this.PointToFloatArray(e.raw.end))},bakeTransform:(new s).makeScale(t,t,t),transform:null}}static PolylineToGeometryData(e){const t=Lt(e.raw.units);return e.raw.closed&&e.raw.value.push(e.raw.value[0],e.raw.value[1],e.raw.value[2]),{attributes:{POSITION:e.raw.value.slice(0)},bakeTransform:(new s).makeScale(t,t,t),transform:null}}static BoxToGeometryData(e){const r=Lt(e.raw.units),n=this.PointToVector3(e.raw.basePlane.origin),i=(e.raw.xSize.end-e.raw.xSize.start)*r,l=(e.raw.ySize.end-e.raw.ySize.start)*r,a=(e.raw.zSize.end-e.raw.zSize.start)*r,u=new c(new t(.5*-i,.5*-l,.5*-a),new t(.5*i,.5*l,.5*a));return{attributes:{POSITION:[u.min.x,u.min.y,u.min.z,u.min.x,u.max.y,u.min.z,u.min.x,u.min.y,u.max.z,u.min.x,u.max.y,u.max.z,u.min.x,u.min.y,u.min.z,u.min.x,u.min.y,u.max.z,u.min.x,u.max.y,u.min.z,u.min.x,u.max.y,u.max.z,u.max.x,u.min.y,u.min.z,u.max.x,u.max.y,u.min.z,u.max.x,u.min.y,u.max.z,u.max.x,u.max.y,u.max.z,u.max.x,u.min.y,u.min.z,u.max.x,u.min.y,u.max.z,u.max.x,u.max.y,u.min.z,u.max.x,u.max.y,u.max.z,u.max.x,u.min.y,u.max.z,u.min.x,u.min.y,u.max.z,u.max.x,u.min.y,u.min.z,u.min.x,u.min.y,u.min.z,u.max.x,u.max.y,u.max.z,u.min.x,u.max.y,u.max.z,u.max.x,u.max.y,u.min.z,u.min.x,u.max.y,u.min.z]},bakeTransform:(new s).setPosition(n),transform:null}}static PolycurveToGeometryData(e){const t=[];for(let r=0;r0,p=(new t).subVectors(n,r);p.normalize();const o=(new t).subVectors(i,r);o.normalize();const c=(new t).crossVectors(p,o);if(c.normalize(),0===c.length()){const e=(new t).subVectors(l,r);e.normalize(),c.copy((new t).crossVectors(p,e)),c.normalize()}const v=(new t).crossVectors(c,p);v.normalize();const f=Math.min(Math.max(p.dot(o),-1),1),h=Math.acos(f),V=e.raw.radius,m=new S(0,0,V,V,0,h,d,0).getPoints(50),z=new s,X=Lt(e.raw.plane.units),b=(new s).makeBasis(p,v,c),q=(new s).setPosition(r.multiplyScalar(X));z.multiply(q).multiply(b);const K=(new s).scale(new t(X,X,X));return z.multiply(K),{attributes:{POSITION:this.FlattenVector3Array(m)},bakeTransform:z,transform:null}}static EllipseToGeometryData(e){const r=Lt(e.raw.units),n=new t(e.raw.plane.origin.x,e.raw.plane.origin.y,e.raw.plane.origin.z).multiplyScalar(r),i=new t(e.raw.plane.xdir.x,e.raw.plane.xdir.y,e.raw.plane.xdir.z).normalize(),l=new t(e.raw.plane.ydir.x,e.raw.plane.ydir.y,e.raw.plane.ydir.z).normalize();let a=2*Math.PI*e.raw.firstRadius*r*10;a=parseInt(a.toString());const s=[];for(let u=0;u<=a;u++){const d=u*Math.PI*2/a,p=Math.cos(d)*e.raw.firstRadius*r,o=Math.sin(d)*e.raw.secondRadius*r,c=new t(i.x*p,i.y*p,i.z*p),v=new t(l.x*o,l.y*o,l.z*o),f=(new t).addVectors(c,v).add(n);s.push(f)}return{attributes:{POSITION:this.FlattenVector3Array(s)},bakeTransform:null,transform:null}}static getCircularCurvePoints(e,r,n=0,i=2*Math.PI,l=.1){const a=this.PointToVector3(e.origin),s=this.PointToVector3(e.xdir),u=this.PointToVector3(e.ydir);s.normalize(),u.normalize();let d=(i-n)*r/l;d=parseInt(d.toString());const p=[];for(let e=0;e<=d;e++){const l=n+e*(i-n)/d,o=Math.cos(l)*r,c=Math.sin(l)*r,v=new t(s.x*o,s.y*o,s.z*o),f=new t(u.x*c,u.y*c,u.z*c),S=(new t).addVectors(v,f).add(a);p.push(S)}return p}static PointToVector3(e,r=!0){const n=r?Lt(e.units):1;let i=null;return i=e.value?new t(e.value[0]*n,e.value[1]*n,e.value[2]*n):new t(e.x*n,e.y*n,e.z*n),i}static PointToFloatArray(e){return e.value?[e.value[0],e.value[1],e.value[2]]:[e.x,e.y,e.z]}static FlattenVector3Array(e){const t=new Array(3*e.length),r=[];for(let n=0,i=0;n>16&255,a=i>>8&255,s=255&i;r[3*n]=l/255,r[3*n+1]=a/255,r[3*n+2]=s/255,t&&(r[3*n]=jt.srgbToLinear(r[3*n]),r[3*n+1]=jt.srgbToLinear(r[3*n+1]),r[3*n+2]=jt.srgbToLinear(r[3*n+2]))}return r}static srgbToLinear(e){return e<=0?0:e>=1?1:e<.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}}var It;jt.keepGeometryData=!1;class Et{static hashCode(e){let t;for(let r=0;r0&&(this._geometryType!==Kt.MESH||this._renderData.geometry.attributes.INDEX&&this._renderData.geometry.attributes.INDEX.length>0)}constructor(e){this._aabb=null,this._renderData=e,this._geometryType=this.getGeometryType(),this._materialHash=this.getMaterialHash(),this._batchId,this._batchIndexCount,this._batchIndexStart,this._batchVertexStart,this._batchVertexEnd}setBatchData(e,t,r,n,i){this._batchId=e,this._batchIndexStart=t,this._batchIndexCount=r,void 0!==n&&(this._batchVertexStart=n),void 0!==i&&(this._batchVertexEnd=i)}computeAABB(){this._aabb=(new c).setFromArray(this._renderData.geometry.attributes.POSITION)}getGeometryType(){switch(this._renderData.speckleType){case kt.Mesh:case kt.Brep:return Kt.MESH;case kt.Point:return Kt.POINT;case kt.Pointcloud:return Kt.POINT_CLOUD;case kt.Text:return Kt.TEXT;default:return Kt.LINE}}disposeGeometry(){for(const e in this._renderData.geometry.attributes)this._renderData.geometry.attributes[e]=[]}renderMaterialToString(){return this.renderData.renderMaterial.color.toString()+\"/\"+this.renderData.renderMaterial.opacity.toString()+\"/\"+this.renderData.renderMaterial.roughness.toString()+\"/\"+this.renderData.renderMaterial.metalness.toString()}displayStyleToString(){var e;return(null===(e=this.renderData.displayStyle.color)||void 0===e?void 0:e.toString())+\"/\"+this.renderData.displayStyle.lineWeight.toString()}getMaterialHash(){const e=!this.renderData.renderMaterial||this.geometryType!==Kt.MESH&&this.geometryType!==Kt.POINT&&this.geometryType!==Kt.TEXT?this.renderData.displayStyle&&this.geometryType!==Kt.MESH&&this.geometryType!==Kt.POINT?this.displayStyleToString():\"\":this.renderMaterialToString();let t=\"\";this.renderData.geometry.attributes&&(t=this.renderData.geometry.attributes.COLOR?\"vertexColors\":\"\");const r=this.geometryType.toString()+t+e+(this.geometryType===Kt.TEXT?this._renderData.id:\"\");return It.hashCode(r)}}It=Et,Et.NullRenderMaterialHash=It.hashCode(Kt.MESH.toString()),Et.NullRenderMaterialVertexColorsHash=It.hashCode(Kt.MESH.toString()+\"vertexColors\"),Et.NullDisplayStyleHash=It.hashCode(Kt.LINE.toString()),Et.NullPointMaterialHash=It.hashCode(Kt.POINT.toString()),Et.NullPointCloudMaterialHash=It.hashCode(Kt.POINT_CLOUD.toString()),Et.NullPointCloudVertexColorsMaterialHash=It.hashCode(Kt.POINT_CLOUD.toString()+\"vertexColors\");class wt extends ke{set pixelThreshold(e){this.userData.pixelThreshold.value=e,this.needsUpdate=!0}constructor(e,r=[]){super(e),this.userData.uViewer_high={value:new t},this.userData.uViewer_low={value:new t},this.userData.pixelThreshold={value:0},this.vertProgram=\"\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\n\\t\\tuniform float linewidth;\\n\\t\\tuniform vec2 resolution;\\n\\t\\tuniform float pixelThreshold;\\n\\n\\t\\tvarying float vAlpha;\\n\\n\\t\\t#define SEARCH_STEPS 10\\n\\n\\t\\tattribute vec3 instanceStart;\\n\\t\\tattribute vec3 instanceEnd;\\n\\n\\t\\tattribute vec4 instanceColorStart;\\n\\t\\tattribute vec4 instanceColorEnd;\\n\\t\\t// varying vec3 debugColor;\\n\\n\\t\\t#ifdef WORLD_UNITS\\n\\n\\t\\t\\tvarying vec4 worldPos;\\n\\t\\t\\tvarying vec3 worldStart;\\n\\t\\t\\tvarying vec3 worldEnd;\\n\\t\\t\\tvarying float correctedLineWidth;\\n\\n\\t\\t\\t#ifdef USE_DASH\\n\\n\\t\\t\\t\\tvarying vec2 vUv;\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t#else\\n\\n\\t\\t\\tvarying vec2 vUv;\\n\\n\\t\\t#endif\\n\\n\\t\\t#ifdef USE_DASH\\n\\n\\t\\t\\tuniform float dashScale;\\n\\t\\t\\tattribute float instanceDistanceStart;\\n\\t\\t\\tattribute float instanceDistanceEnd;\\n\\t\\t\\tvarying float vLineDistance;\\n\\n\\t\\t#endif\\n\\n #ifdef USE_RTE\\n\\t\\t\\tattribute vec3 instanceStartLow;\\n\\t\\t\\tattribute vec3 instanceEndLow;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n #endif\\n\\n\\t\\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\\n\\n\\t\\t\\t// trim end segment so it terminates between the camera plane and the near plane\\n\\n\\t\\t\\t// conservative estimate of the near plane\\n\\t\\t\\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\\n\\t\\t\\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\\n\\t\\t\\tfloat nearEstimate = - 0.5 * b / a;\\n\\n\\t\\t\\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\\n\\n\\t\\t\\tend.xyz = mix( start.xyz, end.xyz, alpha );\\n\\n\\t\\t}\\n\\n\\t\\tfloat screenSpaceDistance(vec4 p0, vec4 p1) {\\n\\t\\t\\tp0 = projectionMatrix * p0;\\n\\t\\t\\tp0 /= p0.w;\\n\\t\\t\\tp1 = projectionMatrix * p1;\\n\\t\\t\\tp1 /= p1.w;\\n\\t\\t\\treturn length(p1.xy - p0.xy);\\n\\t\\t}\\n\\n\\t\\tvec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n\\t\\t\\t/* \\n\\t\\t\\tVector calculation for the high and low differences works on everything \\n\\t\\t\\t*BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n\\t\\t\\tIt would seem that when this code gets compiled, vector types get a lower precision(?)\\n\\t\\t\\twhich completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n\\t\\t\\tvector component using floats works fine.\\n\\t\\t\\t*/\\n\\t\\t\\tvec3 highDifference;\\n\\t\\t\\tvec3 lowDifference;\\n\\t\\t\\tfloat t1 = position_low.x - relativeTo_low.x;\\n\\t\\t\\tfloat e = t1 - position_low.x;\\n\\t\\t\\tfloat t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n\\t\\t\\thighDifference.x = t1 + t2;\\n\\t\\t\\tlowDifference.x = t2 - (highDifference.x - t1);\\n\\n\\t\\t\\tt1 = position_low.y - relativeTo_low.y;\\n\\t\\t\\te = t1 - position_low.y;\\n\\t\\t\\tt2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n\\t\\t\\thighDifference.y = t1 + t2;\\n\\t\\t\\tlowDifference.y = t2 - (highDifference.y - t1);\\n\\n\\t\\t\\tt1 = position_low.z - relativeTo_low.z;\\n\\t\\t\\te = t1 - position_low.z;\\n\\t\\t\\tt2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n\\t\\t\\thighDifference.z = t1 + t2;\\n\\t\\t\\tlowDifference.z = t2 - (highDifference.z - t1);\\n\\n\\t\\t\\tvec3 position = highDifference.xyz + lowDifference.xyz;\\n\\t\\t\\treturn vec4(position, 1.);\\n\\t\\t}\\n\\n\\t\\tvec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n\\t\\t\\t/* \\n\\t\\t\\tSource https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n\\t\\t\\tNote here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n\\t\\t\\t*/\\n\\t\\t\\tvec3 t1 = position_low.xyz - relativeTo_low;\\n\\t\\t\\tvec3 e = t1 - position_low.xyz;\\n\\t\\t\\tvec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n\\t\\t\\tvec3 highDifference = t1 + t2;\\n\\t\\t\\tvec3 lowDifference = t2 - (highDifference - t1);\\n\\t\\t\\t\\n\\t\\t\\tvec3 position = highDifference.xyz + lowDifference.xyz;\\n\\t\\t\\treturn vec4(position, 1.);\\n\\t\\t}\\n\\n\\t\\tvoid main() {\\n\\t\\t\\tif(instanceColorStart.w == 0.) {\\n\\t\\t\\t\\tgl_Position = vec4(0.);\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t\\t\\n\\t\\t\\tvAlpha = instanceColorStart.w;\\n\\n vec3 computedPosition = position;\\n\\t\\t\\t#ifdef USE_COLOR\\n\\n\\t\\t\\t\\tvColor.xyz = ( computedPosition.y < 0.5 ) ? instanceColorStart.xyz : instanceColorEnd.xyz;\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\t#ifdef USE_DASH\\n\\n\\t\\t\\t\\tvLineDistance = ( computedPosition.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\\n\\t\\t\\t\\tvUv = uv;\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\tfloat aspect = resolution.x / resolution.y;\\n\\n\\t\\t\\t// camera space\\n #ifdef USE_RTE\\n\\t\\t\\t/** Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl */\\n\\t\\t\\t\\t// vec3 t1 = instanceStartLow.xyz - uViewer_low;\\n\\t\\t\\t\\t// vec3 e = t1 - instanceStartLow.xyz;\\n\\t\\t\\t\\t// vec3 t2 = ((-uViewer_low - e) + (instanceStartLow.xyz - (t1 - e))) + instanceStart.xyz - uViewer_high;\\n\\t\\t\\t\\t// vec3 highDifference = t1 + t2;\\n\\t\\t\\t\\t// vec3 lowDifference = t2 - (highDifference - t1);\\n\\t\\t\\t\\t// vec4 start = modelViewMatrix * vec4(highDifference.xyz + lowDifference.xyz , 1.);\\n\\t\\t\\t\\tvec4 start = modelViewMatrix * computeRelativePositionSeparate(instanceStartLow.xyz, instanceStart.xyz, uViewer_low, uViewer_high);\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t// t1 = instanceEndLow.xyz - uViewer_low;\\n\\t\\t\\t\\t// e = t1 - instanceEndLow.xyz;\\n\\t\\t\\t\\t// t2 = ((-uViewer_low - e) + (instanceEndLow.xyz - (t1 - e))) + instanceEnd.xyz - uViewer_high;\\n\\t\\t\\t\\t// highDifference = t1 + t2;\\n\\t\\t\\t\\t// lowDifference = t2 - (highDifference - t1);\\n\\t\\t\\t\\t// vec4 end = modelViewMatrix * vec4(highDifference.xyz + lowDifference.xyz , 1.);\\n\\t\\t\\t\\tvec4 end = modelViewMatrix * computeRelativePositionSeparate(instanceEndLow.xyz, instanceEnd.xyz, uViewer_low, uViewer_high);\\n #else\\n vec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\\n vec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\\n #endif\\n\\n\\t\\t\\t#ifdef WORLD_UNITS\\n\\n\\t\\t\\t\\tworldStart = start.xyz;\\n\\t\\t\\t\\tworldEnd = end.xyz;\\n\\n\\t\\t\\t#else\\n\\n\\t\\t\\t\\tvUv = uv;\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\\n\\t\\t\\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\\n\\t\\t\\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\\n\\t\\t\\t// perhaps there is a more elegant solution -- WestLangley\\n\\n\\t\\t\\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\\n\\n\\t\\t\\tif ( perspective ) {\\n\\n\\t\\t\\t\\tif ( start.z < 0.0 && end.z >= 0.0 ) {\\n\\n\\t\\t\\t\\t\\ttrimSegment( start, end );\\n\\n\\t\\t\\t\\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\\n\\n\\t\\t\\t\\t\\ttrimSegment( end, start );\\n\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t}\\n\\n\\t\\t\\t// clip space\\n\\t\\t\\tvec4 clipStart = projectionMatrix * start;\\n\\t\\t\\tvec4 clipEnd = projectionMatrix * end;\\n\\n\\t\\t\\t// ndc space\\n\\t\\t\\tvec3 ndcStart = clipStart.xyz / clipStart.w;\\n\\t\\t\\tvec3 ndcEnd = clipEnd.xyz / clipEnd.w;\\n\\n\\t\\t\\t// direction\\n\\t\\t\\tvec2 dir = ndcEnd.xy - ndcStart.xy;\\n\\n\\t\\t\\t// account for clip-space aspect ratio\\n\\t\\t\\tdir.x *= aspect;\\n\\t\\t\\tdir = normalize( dir );\\n\\n\\t\\t\\t#ifdef WORLD_UNITS\\n\\n\\t\\t\\t\\t// get the offset direction as perpendicular to the view vector\\n\\t\\t\\t\\tvec3 worldDir = normalize( end.xyz - start.xyz );\\n\\t\\t\\t\\tvec3 offset;\\n\\t\\t\\t\\tif ( computedPosition.y < 0.5 ) {\\n\\n\\t\\t\\t\\t\\toffset = normalize( cross( start.xyz, worldDir ) );\\n\\n\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\toffset = normalize( cross( end.xyz, worldDir ) );\\n\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// sign flip\\n\\t\\t\\t\\tif ( computedPosition.x < 0.0 ) offset *= - 1.0;\\n\\n\\t\\t\\t\\tfloat forwardOffset = dot( worldDir, vec3( 0.0, 0.0, 1.0 ) );\\n\\n\\t\\t\\t\\t// don't extend the line if we're rendering dashes because we\\n\\t\\t\\t\\t// won't be rendering the endcaps\\n\\t\\t\\t\\t#ifndef USE_DASH\\n\\n\\t\\t\\t\\t\\t// extend the line bounds to encompass endcaps\\n\\t\\t\\t\\t\\tstart.xyz += - worldDir * linewidth * 0.5;\\n\\t\\t\\t\\t\\tend.xyz += worldDir * linewidth * 0.5;\\n\\n\\t\\t\\t\\t\\t// shift the position of the quad so it hugs the forward edge of the line\\n\\t\\t\\t\\t\\toffset.xy -= dir * forwardOffset;\\n\\t\\t\\t\\t\\toffset.z += 0.5;\\n\\n\\t\\t\\t\\t#endif\\n\\n\\t\\t\\t\\t// endcaps\\n\\t\\t\\t\\tif ( computedPosition.y > 1.0 || computedPosition.y < 0.0 ) {\\n\\n\\t\\t\\t\\t\\toffset.xy += dir * 2.0 * forwardOffset;\\n\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// debugColor = vec3(0., 0., 1.);\\n\\t\\t\\t\\tcorrectedLineWidth = linewidth;\\n\\t\\t\\t\\tvec3 cOffset = offset;\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t// adjust for linewidth\\n\\t\\t\\t\\toffset *= linewidth * 0.5;\\n\\n\\t\\t\\t\\t// set the world position\\n\\t\\t\\t\\tworldPos = ( computedPosition.y < 0.5 ) ? start : end;\\n\\n\\t\\t\\t\\t/*\\n\\t\\t\\t\\tNot great, not terrible\\n\\t\\t\\t\\t*/\\n\\t\\t\\t\\tfloat pixelSize = length(vec2(pixelThreshold/resolution.x + pixelThreshold/resolution.y));\\n\\t\\t\\t\\tfloat offsetStep = linewidth;\\n\\t\\t\\t\\tfloat d = screenSpaceDistance(worldPos, worldPos + vec4(cOffset * offsetStep, 0.));\\n\\t\\t\\t\\t/* We're trying to start off with a step closer to the initial difference between SS distance and the pixel size we want\\n\\t\\t\\t\\t*/\\n\\t\\t\\t\\t// offsetStep += pixelSize - d;\\n\\t\\t\\t\\tvec3 move = offset;\\n\\t\\t\\t\\t\\n\\t\\t\\t\\tfor(int i = 0; i < SEARCH_STEPS; i++){\\n\\t\\t\\t\\t\\tmove = cOffset * offsetStep;\\n\\t\\t\\t\\t\\td = screenSpaceDistance(worldPos, worldPos + vec4(move, 0.));\\n\\t\\t\\t\\t\\tif(d > pixelSize) {\\n\\t\\t\\t\\t\\t\\tcorrectedLineWidth = offsetStep;\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\toffsetStep += offsetStep;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tworldPos.xyz += move;\\n\\n\\t\\t\\t\\t// project the worldpos\\n\\t\\t\\t\\tvec4 clip = projectionMatrix * worldPos;\\n\\n\\t\\t\\t\\t// shift the depth of the projected points so the line\\n\\t\\t\\t\\t// segments overlap neatly\\n\\t\\t\\t\\tvec3 clipPose = ( computedPosition.y < 0.5 ) ? ndcStart : ndcEnd;\\n\\t\\t\\t\\tclip.z = clipPose.z * clip.w;\\n\\n\\t\\t\\t#else\\n\\n\\t\\t\\t\\tvec2 offset = vec2( dir.y, - dir.x );\\n\\t\\t\\t\\t// undo aspect ratio adjustment\\n\\t\\t\\t\\tdir.x /= aspect;\\n\\t\\t\\t\\toffset.x /= aspect;\\n\\n\\t\\t\\t\\t// sign flip\\n\\t\\t\\t\\tif ( computedPosition.x < 0.0 ) offset *= - 1.0;\\n\\n\\t\\t\\t\\t// endcaps\\n\\t\\t\\t\\tif ( computedPosition.y < 0.0 ) {\\n\\n\\t\\t\\t\\t\\toffset += - dir;\\n\\n\\t\\t\\t\\t} else if ( computedPosition.y > 1.0 ) {\\n\\n\\t\\t\\t\\t\\toffset += dir;\\n\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// adjust for linewidth\\n\\t\\t\\t\\toffset *= linewidth;\\n\\n\\t\\t\\t\\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\\n\\t\\t\\t\\toffset /= resolution.y;\\n\\n\\t\\t\\t\\t// select end\\n\\t\\t\\t\\tvec4 clip = ( computedPosition.y < 0.5 ) ? clipStart : clipEnd;\\n\\n\\t\\t\\t\\t// back to clip space\\n\\t\\t\\t\\toffset *= clip.w;\\n\\n\\t\\t\\t\\tclip.xy += offset;\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\tgl_Position = clip;\\n\\n\\t\\t\\tvec4 mvPosition = ( computedPosition.y < 0.5 ) ? start : end; // this is an approximation\\n\\n\\t\\t\\t#include \\n\\t\\t\\t#include \\n\\t\\t\\t#include \\n\\n\\t\\t}\\n\\t\\t\",this.fragProgram=\"\\n\\t\\tuniform vec3 diffuse;\\n\\t\\tuniform float opacity;\\n\\t\\tuniform float linewidth;\\n\\t\\tvarying float vAlpha;\\n\\t\\t// varying vec3 debugColor;\\n\\n\\t\\t#ifdef USE_DASH\\n\\n\\t\\t\\tuniform float dashOffset;\\n\\t\\t\\tuniform float dashSize;\\n\\t\\t\\tuniform float gapSize;\\n\\n\\t\\t#endif\\n\\n\\t\\tvarying float vLineDistance;\\n\\n\\t\\t#ifdef WORLD_UNITS\\n\\n\\t\\t\\tvarying vec4 worldPos;\\n\\t\\t\\tvarying vec3 worldStart;\\n\\t\\t\\tvarying vec3 worldEnd;\\n\\t\\t\\tvarying float correctedLineWidth;\\n\\n\\t\\t\\t#ifdef USE_DASH\\n\\n\\t\\t\\t\\tvarying vec2 vUv;\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t#else\\n\\n\\t\\t\\tvarying vec2 vUv;\\n\\n\\t\\t#endif\\n\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\n\\t\\tvec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {\\n\\n\\t\\t\\tfloat mua;\\n\\t\\t\\tfloat mub;\\n\\n\\t\\t\\tvec3 p13 = p1 - p3;\\n\\t\\t\\tvec3 p43 = p4 - p3;\\n\\n\\t\\t\\tvec3 p21 = p2 - p1;\\n\\n\\t\\t\\tfloat d1343 = dot( p13, p43 );\\n\\t\\t\\tfloat d4321 = dot( p43, p21 );\\n\\t\\t\\tfloat d1321 = dot( p13, p21 );\\n\\t\\t\\tfloat d4343 = dot( p43, p43 );\\n\\t\\t\\tfloat d2121 = dot( p21, p21 );\\n\\n\\t\\t\\tfloat denom = d2121 * d4343 - d4321 * d4321;\\n\\n\\t\\t\\tfloat numer = d1343 * d4321 - d1321 * d4343;\\n\\n\\t\\t\\tmua = numer / denom;\\n\\t\\t\\tmua = clamp( mua, 0.0, 1.0 );\\n\\t\\t\\tmub = ( d1343 + d4321 * ( mua ) ) / d4343;\\n\\t\\t\\tmub = clamp( mub, 0.0, 1.0 );\\n\\n\\t\\t\\treturn vec2( mua, mub );\\n\\n\\t\\t}\\n\\n\\t\\tvoid main() {\\n\\n\\t\\t\\t#include \\n\\n\\t\\t\\t#ifdef USE_DASH\\n\\n\\t\\t\\t\\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\\n\\n\\t\\t\\t\\tif ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\tfloat alpha;\\n\\t\\t\\t#ifdef UNIFORM_OPACITY\\n\\t\\t\\t\\talpha = opacity;\\n\\t\\t\\t#else\\n\\t\\t\\t\\talpha = vAlpha;\\n\\t\\t\\t#endif\\n\\n\\n\\t\\t\\t#ifdef WORLD_UNITS\\n\\n\\t\\t\\t\\t// Find the closest points on the view ray and the line segment\\n\\t\\t\\t\\tvec3 rayEnd = normalize( worldPos.xyz ) * 1e5;\\n\\t\\t\\t\\tvec3 lineDir = worldEnd - worldStart;\\n\\t\\t\\t\\tvec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );\\n\\n\\t\\t\\t\\tvec3 p1 = worldStart + lineDir * params.x;\\n\\t\\t\\t\\tvec3 p2 = rayEnd * params.y;\\n\\t\\t\\t\\tvec3 delta = p1 - p2;\\n\\t\\t\\t\\tfloat len = length( delta );\\n\\t\\t\\t\\tfloat norm = len / correctedLineWidth;\\n\\n\\t\\t\\t\\t#ifndef USE_DASH\\n\\n\\t\\t\\t\\t\\t#ifdef USE_ALPHA_TO_COVERAGE\\n\\n\\t\\t\\t\\t\\t\\tfloat dnorm = fwidth( norm );\\n\\t\\t\\t\\t\\t\\talpha = 1.0 - smoothstep( 0.5 - dnorm, 0.5 + dnorm, norm );\\n\\n\\t\\t\\t\\t\\t#else\\n\\n\\t\\t\\t\\t\\t\\tif ( norm > 0.5 ) {\\n\\n\\t\\t\\t\\t\\t\\t\\tdiscard;\\n\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t#endif\\n\\n\\t\\t\\t\\t#endif\\n\\n\\t\\t\\t#else\\n\\n\\t\\t\\t\\t#ifdef USE_ALPHA_TO_COVERAGE\\n\\n\\t\\t\\t\\t\\t// artifacts appear on some hardware if a derivative is taken within a conditional\\n\\t\\t\\t\\t\\tfloat a = vUv.x;\\n\\t\\t\\t\\t\\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\\n\\t\\t\\t\\t\\tfloat len2 = a * a + b * b;\\n\\t\\t\\t\\t\\tfloat dlen = fwidth( len2 );\\n\\n\\t\\t\\t\\t\\tif ( abs( vUv.y ) > 1.0 ) {\\n\\n\\t\\t\\t\\t\\t\\talpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );\\n\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t#else\\n\\n\\t\\t\\t\\t\\tif ( abs( vUv.y ) > 1.0 ) {\\n\\n\\t\\t\\t\\t\\t\\tfloat a = vUv.x;\\n\\t\\t\\t\\t\\t\\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\\n\\t\\t\\t\\t\\t\\tfloat len2 = a * a + b * b;\\n\\n\\t\\t\\t\\t\\t\\tif ( len2 > 1.0 ) discard;\\n\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t#endif\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\tvec4 diffuseColor = vec4( diffuse, alpha );\\n\\n\\t\\t\\t#include \\n\\t\\t\\t// #include COMMENTED CHUNK\\n\\t\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\t\\tdiffuseColor *= vColor;\\n\\t\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\t\\tdiffuseColor.rgb = vColor;\\n\\t\\t\\t#endif\\n\\n\\t\\t\\tgl_FragColor = vec4( diffuseColor.rgb, alpha );\\n\\n\\t\\t\\t#include \\n\\t\\t\\t#include \\n\\t\\t\\t#include \\n\\t\\t\\t#include \\n\\n\\t\\t}\\n\\t\\t\",this.uniforms=h.merge([V.line.uniforms,{uViewer_high:{value:this.userData.uViewer_high.value},uViewer_low:{value:this.userData.uViewer_low.value},pixelThreshold:{value:this.userData.pixelThreshold}}]),this.onBeforeCompile=function(e){e.uniforms.uViewer_high=this.userData.uViewer_high,e.uniforms.uViewer_low=this.userData.uViewer_low,e.uniforms.pixelThreshold=this.userData.pixelThreshold,e.vertexShader=this.vertProgram,e.fragmentShader=this.fragProgram};for(let e=0;e{Object.getOwnPropertyNames(t.prototype).forEach((r=>{Object.defineProperty(e.prototype,r,Object.getOwnPropertyDescriptor(t.prototype,r)||Object.create(null))}))}))}Ht(Ft,[Yt]),Ht(Dt,[Yt]),Ht(gt,[Yt]),Ht(Ct,[Yt]);class Qt extends Ft{get vertexShader(){return\"\\n#define STANDARD\\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n uniform mat4 rteShadowMatrix;\\n uniform vec3 uShadowViewer_high;\\n uniform vec3 uShadowViewer_low;\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\nvarying vec3 vViewPosition;\\n\\n#ifdef USE_TRANSMISSION\\n\\n varying vec3 vWorldPosition;\\n\\n#endif\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\n\\n\\nvoid main() {\\n\\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n\\n #include \\n #include \\n #include \\n #include \\n //#include // EDITED CHUNK\\n \\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n\\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n \\n mvPosition = modelViewMatrix * mvPosition;\\n\\n gl_Position = projectionMatrix * mvPosition;\\n\\n\\n #include \\n #include \\n\\n vViewPosition = - mvPosition.xyz;\\n\\n #include \\n // #include COMMENTED CHUNK!!!\\n #ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t// Offsetting the position used for querying occlusion along the world normal can be used to reduce shadow acne.\\n\\t\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\tvec4 shadowWorldPosition;\\n\\t#endif\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n vec4 shadowPosition = vec4(transformed, 1.0);\\n mat4 shadowMatrix = directionalShadowMatrix[ i ];\\n\\n #ifdef USE_RTE\\n shadowPosition = computeRelativePositionSeparate(position_low.xyz, position.xyz, uShadowViewer_low, uShadowViewer_high);\\n shadowMatrix = rteShadowMatrix;\\n #endif\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivotShadow = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uShadowViewer_low, uShadowViewer_high);\\n shadowPosition.xyz = rotate_vertex_position((shadowPosition - rtePivotShadow).xyz, tQuaternion) * tScale.xyz + rtePivotShadow.xyz + tTranslation.xyz;\\n #endif\\n shadowWorldPosition = modelMatrix * shadowPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n vDirectionalShadowCoord[ i ] = shadowMatrix * shadowWorldPosition;\\n\\t}\\n \\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t/*\\n\\t#if NUM_RECT_AREA_LIGHTS > 0\\n\\t\\t// TODO (abelnation): update vAreaShadowCoord with area light info\\n\\t#endif\\n\\t*/\\n #endif\\n\\n #include \\n\\n#ifdef USE_TRANSMISSION\\n\\n vWorldPosition = worldPosition.xyz;\\n\\n#endif\\n}\\n\"}get fragmentShader(){return\"\\n#define STANDARD\\n\\n#ifdef PHYSICAL\\n #define IOR\\n #define SPECULAR\\n#endif\\n\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n\\n#ifdef IOR\\n uniform float ior;\\n#endif\\n\\n#ifdef SPECULAR\\n uniform float specularIntensity;\\n uniform vec3 specularColor;\\n\\n #ifdef USE_SPECULARINTENSITYMAP\\n uniform sampler2D specularIntensityMap;\\n #endif\\n\\n #ifdef USE_SPECULARCOLORMAP\\n uniform sampler2D specularColorMap;\\n #endif\\n#endif\\n\\n#ifdef USE_CLEARCOAT\\n uniform float clearcoat;\\n uniform float clearcoatRoughness;\\n#endif\\n\\n#ifdef USE_SHEEN\\n uniform vec3 sheenColor;\\n uniform float sheenRoughness;\\n\\n #ifdef USE_SHEENCOLORMAP\\n uniform sampler2D sheenColorMap;\\n #endif\\n\\n #ifdef USE_SHEENROUGHNESSMAP\\n uniform sampler2D sheenRoughnessMap;\\n #endif\\n#endif\\n\\nvarying vec3 vViewPosition;\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\nvoid main() {\\n\\n #include \\n\\n vec4 diffuseColor = vec4( diffuse, opacity );\\n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n vec3 totalEmissiveRadiance = emissive;\\n\\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n\\n // accumulation\\n #include \\n #include \\n #include \\n #include \\n\\n // modulation\\n #include \\n\\n vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\n #include \\n\\n vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\n #ifdef USE_SHEEN\\n\\n // Sheen energy compensation approximation calculation can be found at the end of\\n // https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing\\n float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\n outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\\n\\n #endif\\n\\n #ifdef USE_CLEARCOAT\\n\\n float dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\\n\\n vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\n outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\\n\\n #endif\\n\\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n\\n}\\n\"}get baseUniforms(){return V.standard.uniforms}get uniformsDef(){return{uViewer_high:new t,uViewer_low:new t,rteShadowMatrix:new s,uShadowViewer_high:new t,uShadowViewer_low:new t,uTransforms:[new s],tTransforms:null,objCount:1}}constructor(e,t=[]){super(e),this.init(t)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}fastCopy(e,t){super.fastCopy(e,t);const r=t,n=e;r.color.copy(n.color),r.roughness=n.roughness,r.metalness=n.metalness,r.emissive.copy(n.emissive),r.emissiveIntensity=n.emissiveIntensity,r.envMap=n.envMap,r.envMapIntensity=n.envMapIntensity,r.refractionRatio=n.refractionRatio}onBeforeRender(e,t,r,n,i,l){Qt.matBuff.copy(r.matrixWorldInverse),Qt.matBuff.elements[12]=0,Qt.matBuff.elements[13]=0,Qt.matBuff.elements[14]=0,i.modelViewMatrix.copy(Qt.matBuff),Qt.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),Pt.DoubleToHighLowVector(Qt.vecBuff0,Qt.vecBuff1,Qt.vecBuff2),this.userData.uViewer_low.value.copy(Qt.vecBuff1),this.userData.uViewer_high.value.copy(Qt.vecBuff2),i instanceof kr&&i.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}Qt.matBuff=new s,Qt.vecBuff0=new t,Qt.vecBuff1=new t,Qt.vecBuff2=new t;const At=\"\\nuniform float size;\\nuniform float scale;\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n#endif\\n\\nvec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n}\\n\\nvec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n}\\n\\n#ifdef USE_GRADIENT_RAMP\\n attribute float gradientIndex;\\n varying float vGradientIndex;\\n#endif\\n\\nvoid main() {\\n\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t// #include COMMENTED CHUNK\\n\\t#ifdef USE_RTE\\n vec4 mvPosition = computeRelativePositionSeparate(position_low.xyz, position.xyz, uViewer_low, uViewer_high);\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n \\n #ifdef USE_INSTANCING\\n\\n mvPosition = instanceMatrix * mvPosition;\\n\\n #endif\\n mvPosition = modelViewMatrix * mvPosition;\\n\\n #ifdef USE_GRADIENT_RAMP\\n vGradientIndex = gradientIndex;\\n #endif\\n\\n gl_Position = projectionMatrix * mvPosition;\\n\\n\\tgl_PointSize = size;\\n\\n\\t#ifdef USE_SIZEATTENUATION\\n\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\n\\t#endif\\n\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\n}\\n\",Bt=\"\\nuniform vec3 diffuse;\\nuniform float opacity;\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef USE_GRADIENT_RAMP\\n\\tvarying float vGradientIndex;\\n\\tuniform sampler2D gradientRamp;\\n#endif\\n\\nvoid main() {\\n\\n\\t#include \\n\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\n\\t#ifdef USE_GRADIENT_RAMP\\n\\t\\tvec4 diffuseColor = vec4( texture2D(gradientRamp, vec2(vGradientIndex, 0.)).rgb, opacity );\\n\\t#else\\n\\t\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#endif\\n\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\n\\toutgoingLight = diffuseColor.rgb;\\n\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\n}\\n\";class _t extends q{constructor(e,r=[]){super(e),this.userData.uViewer_high={value:new t},this.userData.uViewer_low={value:new t},this.vertProgram=At,this.fragProgram=Bt,this.uniforms=h.merge([V.standard.uniforms,{uViewer_high:{value:this.userData.uViewer_high.value},uViewer_low:{value:this.userData.uViewer_low.value}}]),this.onBeforeCompile=function(e){e.uniforms.uViewer_high=this.userData.uViewer_high,e.uniforms.uViewer_low=this.userData.uViewer_low,e.vertexShader=this.vertProgram,e.fragmentShader=this.fragProgram},r&&(this.defines={});for(let e=0;e{const l=$t.getLoader(n,r);l?l.load(n,(r=>{const i=new U(t);i.compileEquirectangularShader();const l=i.fromEquirectangular(r);this._cache[n]=l.texture,r.dispose(),i.dispose(),e(this._cache[n])}),void 0,(e=>{i(`Loading asset ${n} failed ${e.message}`)})):i(`Loading asset ${n} failed`)}))}static getTexture(e){let t,r=null;return e.src?(r=e.src,t=e.type):r=e,this._cache[r]?Promise.resolve(this._cache[r]):new Promise(((e,n)=>{if(r.includes(\"data:image\")){const t=new Image;t.src=r,t.onload=()=>{const n=new T(t);n.needsUpdate=!0,this._cache[r]=n,e(n)},t.onerror=e=>{n(`Loading asset ${r} failed with ${e.toString()}`)}}else{const i=$t.getLoader(r,t);i?i.load(r,(t=>{this._cache[r]=t,e(this._cache[r])}),void 0,(e=>{n(`Loading asset ${r} failed ${e.message}`)})):n(`Loading asset ${r} failed`)}}))}static getFont(e){let t=null;return t=e.src?e.src:e,this._cache[t]?Promise.resolve(this._cache[t]):new Promise(((e,r)=>{(new Ee).load(t,(t=>{e(t)}),void 0,(e=>{r(`Loading asset ${t} failed ${e.message}`)}))}))}static async getTextureData(e){const t=await $t.getTexture(e),r=document.createElement(\"canvas\");r.width=t.image.width,r.height=t.image.height;const n=r.getContext(\"2d\");n.drawImage(t.image,0,0);const i=n.getImageData(0,0,r.width,r.height);return Promise.resolve(i)}static generateGradientRampTexture(e,t,r){}static generateDiscreetRampTexture(e){const t=e.length,r=new Uint8Array(4*(1*t));for(let t=0;t1)&&this.VisibilityState.reset(),this.StateKey=t,this.VisibilityState.rvs=[],this.VisibilityState.ghost=i,n&&(e=[...e,...this.getDescendantIds(e)]),r===tr.SHOW||r===tr.UNISOLATE)for(let t=0;t(e[t]=1,e)),{}));if(!(0!==Object.keys(this.VisibilityState.ids).length))return this.VisibilityState.command=tr.NONE,this.setFilters();let l;return this.VisibilityState.command=r,r!==tr.HIDE&&r!==tr.SHOW||(l=this.visibilityWalk),r!==tr.ISOLATE&&r!==tr.UNISOLATE||(l=this.isolationWalk),this.WTI.walk(l.bind(this)),this.setFilters()}visibilityWalk(e){return!e.model.atomic||(this.VisibilityState.ids[e.model.raw.id]&&this.VisibilityState.rvs.push(...this.WTI.getRenderTree().getRenderViewsForNode(e,e)),!0)}isolationWalk(e){if(!e.model.atomic||this.WTI.isRoot(e))return!0;const t=this.WTI.getRenderTree().getRenderViewsForNode(e,e);return this.VisibilityState.ids[e.model.raw.id]?this.VisibilityState.rvs=this.VisibilityState.rvs.filter((e=>!t.includes(e))):this.VisibilityState.rvs.push(...t),!0}setColorFilter(e,t=!0){return\"number\"===e.type?(this.ColorStringFilterState=null,this.ColorNumericFilterState=new lr,this.setNumericColorFilter(e,t)):\"string\"===e.type?(this.ColorNumericFilterState=null,this.ColorStringFilterState=new ir,this.setStringColorFilter(e,t)):void 0}setNumericColorFilter(e,t){this.ColorNumericFilterState.currentProp=e;const r=e.passMin||e.min,n=e.passMax||e.max,i={};for(let t=0;t=r&&e.valueGroups[t].value<=n&&(i[e.valueGroups[t].id]=e.valueGroups[t].value);const l=[],a=[];return this.WTI.walk((e=>{if(!e.model.atomic||this.WTI.isRoot(e))return!0;const t=this.WTI.getRenderTree().getRenderViewsForNode(e,e),s=i[e.model.raw.id];s?a.push({rvs:t,value:(s-r)/(n-r)}):l.push(...t)})),this.ColorNumericFilterState.colorGroups=a,this.ColorNumericFilterState.nonMatchingRvs=l,this.ColorNumericFilterState.ghost=t,this.ColorNumericFilterState.matchingIds=i,this.setFilters()}setStringColorFilter(e,t){this.ColorStringFilterState.currentProp=e;const r=[];for(const t of e.valueGroups){const e=Ge(t.value),n={...t,color:new x(e),rvs:[]};n.idMap={};for(let e=0;ee.color.getHex()))),i=[];this.WTI.walk((e=>{if(!e.model.atomic||this.WTI.isRoot(e))return!0;const t=r.find((t=>t.idMap[e.model.raw.id])),n=this.WTI.getRenderTree().getRenderViewNodesForNode(e,e);if(!t)return i.push(...n.map((e=>e.model.renderView))),!0;const l=[];return n.forEach((t=>{this.WTI.getRenderTree().getAtomicParent(t)===e&&l.push(t.model.renderView)})),t.rvs.push(...l),!0}));for(const e of r)delete e.idMap;return this.ColorStringFilterState.colorGroups=r,this.ColorStringFilterState.rampTexture=n,this.ColorStringFilterState.nonMatchingRvs=i,this.ColorStringFilterState.ghost=t,this.setFilters()}removeColorFilter(){return this.ColorStringFilterState=null,this.ColorNumericFilterState=null,this.setFilters()}selectObjects(e){return this.resetSelection(),this.populateGenericState(e,this.SelectionState),0!==this.SelectionState.rvs.length&&(this.SelectionState.id=this.Renderer.applyDirectFilter(this.SelectionState.rvs,{filterType:er.SELECT})),this.Renderer.updateClippingPlanes(),this.Renderer.viewer.requestRender(),this.emit(it.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}highlightObjects(e,t=!1){return this.resetHighlight(),this.HighlightState.ghost=t,this.populateGenericState(e,this.HighlightState),0!==this.HighlightState.rvs.length&&(this.HighlightState.id=this.Renderer.applyDirectFilter(this.HighlightState.rvs,{filterType:er.OVERLAY})),this.Renderer.viewer.requestRender(),this.emit(it.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}setUserObjectColors(e){this.UserspaceColorState=new sr,this.ColorNumericFilterState=null,this.ColorStringFilterState=null;const t=e.map((e=>({...e,nodes:[],rvs:[]})));this.WTI.walk((e=>{var r,n;if(!(null===(n=null===(r=e.model)||void 0===r?void 0:r.raw)||void 0===n?void 0:n.id))return!0;for(const r of t)if(r.objectIds.includes(e.model.raw.id)){r.nodes.push(e);const t=this.WTI.getRenderTree().getRenderViewNodesForNode(e,e).map((e=>e.model.renderView));t&&r.rvs.push(...t)}return!0})),this.UserspaceColorState.groups=t;const r=$t.generateDiscreetRampTexture(e.map((e=>new x(e.color).getHex())));return this.UserspaceColorState.rampTexture=r,this.setFilters()}removeUserObjectColors(){return this.UserspaceColorState=null,this.setFilters()}setUserMaterials(e){this.UserMaterialState=new ur;const t=e.map((e=>({...e,nodes:[],rvs:e.rvs?e.rvs:[]})));return this.WTI.walk((e=>{var r,n;if(!(null===(n=null===(r=e.model)||void 0===r?void 0:r.raw)||void 0===n?void 0:n.id))return!0;for(const r of t){if(r.rvs.length>0)return!0;if(r.objectIds.includes(e.model.raw.id)){r.nodes.push(e);const t=this.WTI.getRenderTree().getRenderViewNodesForNode(e,e).map((e=>e.model.renderView));t&&r.rvs.push(...t)}}return!0})),this.UserMaterialState.groups=t,this.setFilters()}removeUserMaterials(){return this.UserMaterialState=null,this.setFilters()}populateGenericState(e,t){let r=[...e];r=[...Array.from(new Set(r.map((e=>e))))],t.rvs=[],t.ids=[];const n=[];if(0!==r.length){this.WTI.walk((e=>(-1!==r.indexOf(e.model.raw.id)&&n.push(e),!0)));for(let e=0;ee.model.renderView))),t.ids.push(...r.map((e=>e.model.raw.id))))}}}resetSelection(){return this.SelectionState.rvs.length>0&&this.Renderer.removeDirectFilter(this.SelectionState.id),this.SelectionState=new ar,this.Renderer.updateClippingPlanes(),this.Renderer.viewer.requestRender(),this.emit(it.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}resetHighlight(){return this.HighlightState.rvs.length>0&&this.Renderer.removeDirectFilter(this.HighlightState.id),this.HighlightState=new ar,this.Renderer.viewer.requestRender(),this.emit(it.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}reset(){return this.Renderer.clearFilter(),this.VisibilityState=new nr,this.ColorStringFilterState=null,this.ColorNumericFilterState=null,this.SelectionState=new ar,this.HighlightState=new ar,this.UserspaceColorState=null,this.StateKey=null,null}setFilters(){var e,t;if(this.CurrentFilteringState={},this.Renderer.clearFilter(),this.Renderer.beginFilter(),this.UserMaterialState)for(const e of this.UserMaterialState.groups)this.Renderer.applyMaterial(e.rvs,e.material);if(this.ColorStringFilterState){this.CurrentFilteringState.colorGroups=[];let e=-1;for(const t of this.ColorStringFilterState.colorGroups)e++,this.Renderer.applyFilter(t.rvs,{filterType:er.COLORED,rampIndex:e/this.ColorStringFilterState.colorGroups.length,rampIndexColor:t.color,rampTexture:this.ColorStringFilterState.rampTexture}),this.CurrentFilteringState.colorGroups.push({value:t.value,color:t.color.getHexString(),ids:t.ids}),this.CurrentFilteringState.activePropFilterKey=this.ColorStringFilterState.currentProp.key}if(this.ColorNumericFilterState){for(const e of this.ColorNumericFilterState.colorGroups)this.Renderer.applyFilter(e.rvs,{filterType:er.GRADIENT,rampIndex:e.value});this.CurrentFilteringState.activePropFilterKey=this.ColorNumericFilterState.currentProp.key,this.CurrentFilteringState.passMin=this.ColorNumericFilterState.currentProp.passMin||this.ColorNumericFilterState.currentProp.min,this.CurrentFilteringState.passMax=this.ColorNumericFilterState.currentProp.passMax||this.ColorNumericFilterState.currentProp.max,this.CurrentFilteringState.isolatedObjects=Object.keys(this.ColorNumericFilterState.matchingIds)}const r=this.VisibilityState.command===tr.HIDE||this.VisibilityState.command===tr.SHOW,n=this.VisibilityState.command===tr.ISOLATE||this.VisibilityState.command===tr.UNISOLATE;(r||n)&&(this.Renderer.applyFilter(this.VisibilityState.rvs,{filterType:this.VisibilityState.ghost?er.GHOST:er.HIDDEN}),r&&(this.CurrentFilteringState.hiddenObjects=Object.keys(this.VisibilityState.ids)),n&&(this.CurrentFilteringState.isolatedObjects=Object.keys(this.VisibilityState.ids)));const i=(null===(e=this.ColorStringFilterState)||void 0===e?void 0:e.nonMatchingRvs)||(null===(t=this.ColorNumericFilterState)||void 0===t?void 0:t.nonMatchingRvs);let l=!1;if(this.ColorStringFilterState&&(l=this.ColorStringFilterState.ghost),this.ColorNumericFilterState&&(l=this.ColorNumericFilterState.ghost),i&&this.Renderer.applyFilter(i,{filterType:l?er.GHOST:er.HIDDEN}),this.UserspaceColorState){this.CurrentFilteringState.userColorGroups=[];let e=-1;for(const t of this.UserspaceColorState.groups)e++,this.Renderer.applyFilter(t.rvs,{filterType:er.COLORED,rampIndex:e/this.UserspaceColorState.groups.length,rampIndexColor:new x(t.color),rampTexture:this.UserspaceColorState.rampTexture}),this.CurrentFilteringState.userColorGroups.push({ids:t.objectIds,color:t.color})}return this.Renderer.endFilter(),0!==this.HighlightState.rvs.length&&(this.HighlightState.id=this.Renderer.applyDirectFilter(this.HighlightState.rvs,{filterType:this.HighlightState.ghost?er.GHOST:er.OVERLAY})),0!==this.SelectionState.rvs.length&&(this.SelectionState.id=this.Renderer.applyDirectFilter(this.SelectionState.rvs,{filterType:er.SELECT})),this.Renderer.viewer.requestRender(),this.emit(it.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}getDescendantIds(e){const t=[],r=e.join(\",\");return this.idCache[r]&&this.idCache[r].length?this.idCache[r]:(this.WTI.walk((r=>{if(e.includes(r.model.raw.id)){const e=r.all((e=>void 0!==e.model.raw)).map((e=>e.model.raw.id));t.push(...e),this.idCache[r.model.raw.id]=e}return!0})),this.idCache[r]=t,t)}}!function(e){e[e.HIDE=10]=\"HIDE\",e[e.SHOW=11]=\"SHOW\",e[e.ISOLATE=20]=\"ISOLATE\",e[e.UNISOLATE=21]=\"UNISOLATE\",e[e.NONE=30]=\"NONE\"}(tr||(tr={}));class nr{constructor(){this.command=tr.NONE,this.ghost=!0,this.ids={},this.rvs=[]}reset(){this.ghost=!0,this.ids={},this.rvs=[]}}class ir{constructor(){this.ghost=!0}reset(){this.currentProp=null,this.colorGroups=[],this.nonMatchingRvs=[],this.rampTexture=null}}class lr{constructor(){this.ghost=!0}}class ar{constructor(){this.ids=[],this.rvs=[],this.ghost=!1}reset(){this.rvs=[],this.ids=[]}}class sr{constructor(){this.groups=[]}reset(){this.groups=[]}}class ur{constructor(){this.groups=[]}reset(){this.groups=[]}}class dr extends Qt{get vertexShader(){return\"\\n#define STANDARD\\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n uniform mat4 rteShadowMatrix;\\n uniform vec3 uShadowViewer_high;\\n uniform vec3 uShadowViewer_low;\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\nvarying vec3 vViewPosition;\\n\\n#ifdef USE_TRANSMISSION\\n\\n varying vec3 vWorldPosition;\\n\\n#endif\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\nattribute float gradientIndex;\\nvarying float vGradientIndex;\\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\nvoid main() {\\n\\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n\\n #include \\n #include \\n #include \\n #include \\n //#include // EDITED CHUNK\\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n \\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n\\n\\n mvPosition = modelViewMatrix * mvPosition;\\n\\n vGradientIndex = gradientIndex;\\n gl_Position = projectionMatrix * mvPosition;\\n\\n #include \\n #include \\n\\n vViewPosition = - mvPosition.xyz;\\n\\n #include \\n // #include // EDITED CHUNK\\n #ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t// Offsetting the position used for querying occlusion along the world normal can be used to reduce shadow acne.\\n\\t\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\tvec4 shadowWorldPosition;\\n\\t#endif\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n vec4 shadowPosition = vec4(transformed, 1.0);\\n mat4 shadowMatrix = directionalShadowMatrix[ i ];\\n\\n #ifdef USE_RTE\\n shadowPosition = computeRelativePositionSeparate(position_low.xyz, position.xyz, uShadowViewer_low, uShadowViewer_high);\\n shadowMatrix = rteShadowMatrix;\\n #endif\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivotShadow = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uShadowViewer_low, uShadowViewer_high);\\n shadowPosition.xyz = rotate_vertex_position((shadowPosition - rtePivotShadow).xyz, tQuaternion) * tScale.xyz + rtePivotShadow.xyz + tTranslation.xyz;\\n #endif\\n shadowWorldPosition = modelMatrix * shadowPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n vDirectionalShadowCoord[ i ] = shadowMatrix * shadowWorldPosition;\\n \\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t/*\\n\\t#if NUM_RECT_AREA_LIGHTS > 0\\n\\t\\t// TODO (abelnation): update vAreaShadowCoord with area light info\\n\\t#endif\\n\\t*/\\n #endif\\n #include \\n\\n#ifdef USE_TRANSMISSION\\n\\n vWorldPosition = worldPosition.xyz;\\n\\n#endif\\n}\\n\"}get fragmentShader(){return\"\\n#define STANDARD\\n\\n#ifdef PHYSICAL\\n #define IOR\\n #define SPECULAR\\n#endif\\n\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n\\n#ifdef IOR\\n uniform float ior;\\n#endif\\n\\n#ifdef SPECULAR\\n uniform float specularIntensity;\\n uniform vec3 specularColor;\\n\\n #ifdef USE_SPECULARINTENSITYMAP\\n uniform sampler2D specularIntensityMap;\\n #endif\\n\\n #ifdef USE_SPECULARCOLORMAP\\n uniform sampler2D specularColorMap;\\n #endif\\n#endif\\n\\n#ifdef USE_CLEARCOAT\\n uniform float clearcoat;\\n uniform float clearcoatRoughness;\\n#endif\\n\\n#ifdef USE_SHEEN\\n uniform vec3 sheenColor;\\n uniform float sheenRoughness;\\n\\n #ifdef USE_SHEENCOLORMAP\\n uniform sampler2D sheenColorMap;\\n #endif\\n\\n #ifdef USE_SHEENROUGHNESSMAP\\n uniform sampler2D sheenRoughnessMap;\\n #endif\\n#endif\\n\\nvarying vec3 vViewPosition;\\n\\nvarying float vGradientIndex;\\nuniform sampler2D gradientRamp;\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\nvoid main() {\\n\\n #include \\n\\n vec4 diffuseColor = vec4( texture2D(gradientRamp, vec2(vGradientIndex, 0.)).rgb, opacity );\\n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n vec3 totalEmissiveRadiance = emissive;\\n\\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n\\n // accumulation\\n #include \\n #include \\n #include \\n #include \\n\\n // modulation\\n #include \\n\\n vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\n #include \\n\\n vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\n #ifdef USE_SHEEN\\n\\n // Sheen energy compensation approximation calculation can be found at the end of\\n // https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing\\n float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\n outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\\n\\n #endif\\n\\n #ifdef USE_CLEARCOAT\\n\\n float dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\\n\\n vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\n outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\\n\\n #endif\\n\\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n}\\n\"}get uniformsDef(){return{...super.uniformsDef,gradientRamp:null}}constructor(e,t=[]){super(e,t)}setGradientTexture(e){this.userData.gradientRamp.value=e,this.userData.gradientRamp.value.generateMipmaps=!1,this.userData.gradientRamp.value.minFilter=W,this.userData.gradientRamp.value.magFilter=W,this.needsUpdate=!0}onBeforeRender(e,t,r,n,i,l){Qt.matBuff.copy(r.matrixWorldInverse),Qt.matBuff.elements[12]=0,Qt.matBuff.elements[13]=0,Qt.matBuff.elements[14]=0,i.modelViewMatrix.copy(Qt.matBuff),Qt.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),Pt.DoubleToHighLowVector(Qt.vecBuff0,Qt.vecBuff1,Qt.vecBuff2),this.userData.uViewer_low.value.copy(Qt.vecBuff1),this.userData.uViewer_high.value.copy(Qt.vecBuff2),i instanceof kr&&i.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}var pr=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAABCAIAAAAn2YEhAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHoSURBVDhPTZRRdoMwDAQx9//seaEzI5sXpwFptVqvMOm6/t7retd1Le8XAdF6+SMEYr03l2fF4GJprcfixl4+tyklG6ZvxeAKWGxBQsKDk9FIdD+pDUFiak9IDQEWMAM4dczEZmWSDOXPBuAQ1OCLYI4bc0S0bbnlFOR6Vgo2WwgraIvgbh8L2ZNxRH5T7QWKyKz9E7kNnUE+KTA3Oz6O3YIOkop+4juHoh1H+m3slByVm9vgOCOoXr7HvBJSjLdJRUHuSrbse+jDiZOPPt/jZIv8WPJeW+JVzYj2CIHc9GaEjmc/OhF3C+neQoBgW/KKZx2VuyxFKqDBNwfqA8NXa7p0781GBT6TPkSOozQPMPer4sBqTrvZUZgqSKP5oaCXXirJdZ4jqyRbtyE8amCkLLkzW9qik7Fx9mWE9pHEh9vMHsIawZSPcxut2DcDyjzeKinisypDwQoKnLU5WVLz7pGO/nbrIhC2MMOaGrj8PRLmfKpSJcT4NZn5wFgbKbVlCzia76HbQZMAjP72IyX94v189i7Ewfa2wcdMTfGOqekE2i/O9LZRi/T8qwFuuvknA3kW/YnLTMVO22OwUXg0OZ1IAdeqcEjXffH2jjEqNmSvRZbF43BLuUPsYsk5XPu3NqD3WKzr/QfN+6p+JpC7ZQAAAABJRU5ErkJggg==\";class or extends Dt{get vertexShader(){return\"\\n#include \\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\n#if defined(BILLBOARD) || defined(BILLBOARD_FIXED)\\n uniform vec3 billboardPos;\\n uniform mat4 invProjection;\\n#endif\\n#ifdef BILLBOARD_FIXED\\n uniform vec2 billboardSize;\\n#endif\\n\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t// #include COMMENTED CHUNK\\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n\\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n \\n mvPosition = modelViewMatrix * mvPosition;\\n \\n #if defined(BILLBOARD)\\n float div = 1.;\\n gl_Position = projectionMatrix * (viewMatrix * vec4(billboardPos, 1.0) + vec4(position.x, position.y, 0., 0.0));\\n #elif defined(BILLBOARD_FIXED)\\n gl_Position = projectionMatrix * (viewMatrix * vec4(billboardPos, 1.0));\\n float div = gl_Position.w;\\n gl_Position /= gl_Position.w;\\n gl_Position.xy += position.xy * billboardSize;\\n #else\\n gl_Position = projectionMatrix * mvPosition;\\n #endif\\n\\n\\n\\t#include \\n\\t// #include COMMENTED CHUNK\\n #if NUM_CLIPPING_PLANES > 0\\n #if defined(BILLBOARD) || defined(BILLBOARD_FIXED)\\n vec4 movelViewProjection = gl_Position * div;\\n vClipPosition = - (invProjection * movelViewProjection).xyz;\\n #else\\n\\t vClipPosition = - mvPosition.xyz;\\n #endif\\n #endif\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}get fragmentShader(){return\"\\nuniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t// accumulation (baked indirect lighting only)\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t// modulation\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}get baseUniforms(){return V.basic.uniforms}get uniformsDef(){return{uViewer_high:new t,uViewer_low:new t,uTransforms:[new s],tTransforms:null,billboardPos:new t,billboardSize:new y,invProjection:new s,objCount:1}}set billboardPixelHeight(e){this._billboardPixelHeight=e}constructor(e,t=[]){super(e),this.init(t)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}fastCopy(e,t){super.fastCopy(e,t);const r=t,n=e;r.color.copy(n.color),r.refractionRatio=n.refractionRatio}onBeforeRender(e,t,r,n,i,l){if(this.defines.BILLBOARD_FIXED){const t=e.getDrawingBufferSize(or.vecBuff3);or.vecBuff3.set(this._billboardPixelHeight/t.x*2,this._billboardPixelHeight/t.y*2),this.userData.billboardSize.value.copy(or.vecBuff3),or.matBuff.copy(r.projectionMatrix).invert(),this.userData.invProjection.value.copy(or.matBuff)}this.defines.USE_RTE&&(or.matBuff.copy(r.matrixWorldInverse),or.matBuff.elements[12]=0,or.matBuff.elements[13]=0,or.matBuff.elements[14]=0,i.modelViewMatrix.copy(or.matBuff),or.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),Pt.DoubleToHighLowVector(or.vecBuff0,or.vecBuff1,or.vecBuff2)),this.userData.uViewer_low.value.copy(or.vecBuff1),this.userData.uViewer_high.value.copy(or.vecBuff2),i instanceof kr&&i.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}or.matBuff=new s,or.vecBuff0=new t,or.vecBuff1=new t,or.vecBuff2=new t,or.vecBuff3=new y;class cr extends or{get vertexShader(){return\"\\n#include \\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t// #include COMMENTED CHUNK\\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n \\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n \\n mvPosition = modelViewMatrix * mvPosition;\\n\\n gl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}get fragmentShader(){return\"\\nuniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n // We're disabling alpha testing because we need to use it for shadow rejection. Three.js gave me no choice\\n\\t// #include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t// accumulation (baked indirect lighting only)\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t// modulation\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}constructor(e,t=[]){super(e,t)}}class vr extends Dt{get vertexShader(){return\"\\n#include \\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\n#if defined(BILLBOARD) || defined(BILLBOARD_FIXED)\\n uniform vec3 billboardPos;\\n uniform mat4 invProjection;\\n#endif\\n#ifdef BILLBOARD_FIXED\\n uniform vec2 billboardSize;\\n#endif\\n\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t// #include COMMENTED CHUNK\\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n\\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n \\n mvPosition = modelViewMatrix * mvPosition;\\n \\n #if defined(BILLBOARD)\\n float div = 1.;\\n gl_Position = projectionMatrix * (viewMatrix * vec4(billboardPos, 1.0) + vec4(position.x, position.y, 0., 0.0));\\n #elif defined(BILLBOARD_FIXED)\\n gl_Position = projectionMatrix * (viewMatrix * vec4(billboardPos, 1.0));\\n float div = gl_Position.w;\\n gl_Position /= gl_Position.w;\\n gl_Position.xy += position.xy * billboardSize;\\n #else\\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.);\\n #endif\\n\\t#include \\n\\t// #include COMMENTED CHUNK\\n #if NUM_CLIPPING_PLANES > 0\\n #if defined(BILLBOARD) || defined(BILLBOARD_FIXED)\\n vec4 movelViewProjection = gl_Position * div;\\n vClipPosition = - (invProjection * movelViewProjection).xyz;\\n #else\\n\\t vClipPosition = - mvPosition.xyz;\\n #endif\\n #endif\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}get fragmentShader(){return\"\\nuniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t// accumulation (baked indirect lighting only)\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t// modulation\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}get baseUniforms(){return V.basic.uniforms}get uniformsDef(){return{uViewer_high:new t,uViewer_low:new t,uTransforms:[new s],tTransforms:null,objCount:1,billboardPos:new t,billboardSize:new y,invProjection:new s}}set billboardPixelHeight(e){this._billboardPixelHeight=e}get billboardPixelHeight(){return this._billboardPixelHeight}constructor(e,t=[]){super(e),this.init(t)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}getDerivedMaterial(){const e=we(this);for(const t in this.userData)e.uniforms[t]=this.userData[t];return e}onBeforeRender(e,t,r,n,i,l){if(this.defines.BILLBOARD_FIXED){const t=e.getDrawingBufferSize(vr.vecBuff3);vr.vecBuff3.set(this._billboardPixelHeight/t.x*2,this._billboardPixelHeight/t.y*2),this.userData.billboardSize.value.copy(vr.vecBuff3),vr.matBuff.copy(r.projectionMatrix).invert(),this.userData.invProjection.value.copy(vr.matBuff)}}}vr.matBuff=new s,vr.vecBuff0=new t,vr.vecBuff1=new t,vr.vecBuff2=new t,vr.vecBuff3=new y;class fr extends q{constructor(e,r=[]){super(e),this.userData.uViewer_high={value:new t},this.userData.uViewer_low={value:new t},this.userData.gradientRamp={value:null},this.vertProgram=At,this.fragProgram=Bt,this.uniforms=h.merge([V.standard.uniforms,{uViewer_high:{value:this.userData.uViewer_high.value},uViewer_low:{value:this.userData.uViewer_low.value},gradientRamp:{value:this.userData.gradientRamp.value}}]),this.onBeforeCompile=function(e){e.uniforms.uViewer_high=this.userData.uViewer_high,e.uniforms.uViewer_low=this.userData.uViewer_low,e.uniforms.gradientRamp=this.userData.gradientRamp,e.vertexShader=this.vertProgram,e.fragmentShader=this.fragProgram},r&&(this.defines={USE_GRADIENT_RAMP:\"\"});for(let e=0;e0}),r}static displayStyleFromNode(e){if(!e)return null;let t=null;if(e.model.raw.displayStyle){let r=e.model.raw.displayStyle.lineweight||0;const n=e.model.raw.displayStyle.units;r=n?r*Lt(n):0,r=r<.001?0:r,t={id:e.model.raw.displayStyle.id,color:e.model.raw.displayStyle.diffuse||e.model.raw.displayStyle.color,lineWeight:r}}else e.model.raw.renderMaterial&&(t={id:e.model.raw.renderMaterial.id,color:e.model.raw.renderMaterial.diffuse,lineWeight:0});return t}static fastCopy(e,t){t.fastCopy(e,t)}static isTransparent(e){return!0===e.transparent&&e.opacity<1}static isOpaque(e){return!1===e.transparent||!0===e.transparent&&e.opacity>=1}async createDefaultMeshMaterials(){this.meshHighlightMaterial=new Qt({color:294651,emissive:0,roughness:1,metalness:0,side:R},[\"USE_RTE\"]),this.meshHighlightMaterial.clipShadows=!0,this.meshHighlightMaterial.stencilWrite=!0,this.meshHighlightMaterial.stencilWriteMask=255,this.meshHighlightMaterial.stencilRef=0,this.meshHighlightMaterial.stencilFunc=M,this.meshHighlightMaterial.stencilZFail=N,this.meshHighlightMaterial.stencilZPass=N,this.meshHighlightMaterial.stencilFail=N,this.meshTransparentHighlightMaterial=new Qt({color:294651,emissive:0,roughness:1,metalness:0,side:R,transparent:!0,opacity:.5},[\"USE_RTE\"]),this.meshTransparentHighlightMaterial.clipShadows=!0,this.meshTransparentHighlightMaterial.stencilWrite=!0,this.meshTransparentHighlightMaterial.stencilWriteMask=255,this.meshTransparentHighlightMaterial.stencilRef=0,this.meshTransparentHighlightMaterial.stencilFunc=M,this.meshTransparentHighlightMaterial.stencilZFail=N,this.meshTransparentHighlightMaterial.stencilZPass=N,this.meshTransparentHighlightMaterial.stencilFail=N,this.meshGhostMaterial=new cr({color:16777215,side:o,transparent:!0,opacity:.1},[\"USE_RTE\"]),this.meshGhostMaterial.depthWrite=!1,this.meshGhostMaterial.alphaTest=1,this.meshGradientMaterial=new dr({side:R,transparent:!1,opacity:1},[\"USE_RTE\"]),this.meshGradientMaterial.setGradientTexture(await $t.getTexture(pr)),this.meshGradientMaterial.clipShadows=!0,this.meshTransparentGradientMaterial=new dr({side:R,transparent:!0,opacity:.5},[\"USE_RTE\"]),this.meshTransparentGradientMaterial.setGradientTexture(await $t.getTexture(pr)),this.meshTransparentGradientMaterial.clipShadows=!0,this.meshColoredMaterial=new dr({side:R,transparent:!1,wireframe:!1},[\"USE_RTE\"]),this.meshColoredMaterial.clipShadows=!0,this.meshTransparentColoredMaterial=new dr({side:R,transparent:!0,opacity:.5},[\"USE_RTE\"]),this.meshHiddenMaterial=new Qt({side:R,transparent:!1,opacity:1,wireframe:!1},[\"USE_RTE\"]),this.meshHiddenMaterial.visible=!1,this.meshOverlayMaterial=new Qt({color:314363,emissive:0,roughness:1,metalness:0,side:R},[\"USE_RTE\"]),this.meshOverlayMaterial.clipShadows=!0,this.meshTransparentOverlayMaterial=new Qt({color:314363,emissive:0,roughness:1,metalness:0,side:R,transparent:!0,opacity:.5},[\"USE_RTE\"]),this.meshTransparentHighlightMaterial.color.convertSRGBToLinear(),this.meshHighlightMaterial.color.convertSRGBToLinear(),this.meshOverlayMaterial.color.convertSRGBToLinear(),this.meshTransparentOverlayMaterial.color.convertSRGBToLinear()}async createLineDefaultMaterials(){this.lineHighlightMaterial=new wt({color:294651,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new y},[\"USE_RTE\"]),this.lineHighlightMaterial.color=new x(294651),this.lineHighlightMaterial.linewidth=1,this.lineHighlightMaterial.worldUnits=!1,this.lineHighlightMaterial.vertexColors=!0,this.lineHighlightMaterial.pixelThreshold=.5,this.lineHighlightMaterial.resolution=new y,this.lineGhostMaterial=new wt({color:16777215,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new y},[\"USE_RTE\"]),this.lineGhostMaterial.color=new x(16777215),this.lineGhostMaterial.linewidth=1,this.lineGhostMaterial.worldUnits=!0,this.lineGhostMaterial.vertexColors=!0,this.lineGhostMaterial.pixelThreshold=.5,this.lineGhostMaterial.resolution=new y,this.lineColoredMaterial=new wt({color:16777215,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new y},[\"USE_RTE\"]),this.lineColoredMaterial.color=new x(16777215),this.lineColoredMaterial.linewidth=1,this.lineColoredMaterial.worldUnits=!1,this.lineColoredMaterial.vertexColors=!0,this.lineColoredMaterial.pixelThreshold=.5,this.lineColoredMaterial.resolution=new y,this.lineHiddenMaterial=new wt({color:16777215,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new y},[\"USE_RTE\"]),this.lineHiddenMaterial.color=new x(16711680),this.lineHiddenMaterial.linewidth=1,this.lineHiddenMaterial.worldUnits=!1,this.lineHiddenMaterial.vertexColors=!0,this.lineHiddenMaterial.pixelThreshold=.5,this.lineHiddenMaterial.resolution=new y,this.lineHiddenMaterial.visible=!1,this.lineOverlayMaterial=new wt({color:314363,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new y},[\"USE_RTE\"]),this.lineHighlightMaterial.color=new x(314363),this.lineHighlightMaterial.linewidth=1,this.lineHighlightMaterial.worldUnits=!1,this.lineHighlightMaterial.vertexColors=!0,this.lineHighlightMaterial.pixelThreshold=.5,this.lineHighlightMaterial.resolution=new y,this.lineHighlightMaterial.color.convertSRGBToLinear(),this.lineOverlayMaterial.color.convertSRGBToLinear()}async createDefaultPointMaterials(){this.pointCloudHighlightMaterial=new _t({color:294651,vertexColors:!0,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.pointHighlightMaterial=new _t({color:294651,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.pointGhostMaterial=new _t({color:16777215,vertexColors:!1,size:2,opacity:.01,sizeAttenuation:!1},[\"USE_RTE\"]),this.pointCloudOverlayMaterial=new _t({color:314363,vertexColors:!0,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.pointOverlayMaterial=new _t({color:314363,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.pointCloudColouredMaterial=new fr({color:16777215,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.pointCloudGradientMaterial=new fr({color:16777215,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.pointCloudGradientMaterial.setGradientTexture(await $t.getTexture(pr)),this.pointCloudHighlightMaterial.color.convertSRGBToLinear(),this.pointCloudHighlightMaterial.toneMapped=!1,this.pointHighlightMaterial.color.convertSRGBToLinear(),this.pointHighlightMaterial.toneMapped=!1,this.pointOverlayMaterial.color.convertSRGBToLinear(),this.pointOverlayMaterial.toneMapped=!1,this.pointCloudOverlayMaterial.color.convertSRGBToLinear(),this.pointCloudOverlayMaterial.toneMapped=!1,this.pointGhostMaterial.toneMapped=!1}async createDefaultTextMaterials(){this.textHighlightMaterial=new vr({color:294651,opacity:1,side:R},[\"USE_RTE\"]),this.textHighlightMaterial.transparent=this.textHighlightMaterial.opacity<1,this.textHighlightMaterial.depthWrite=!this.textHighlightMaterial.transparent,this.textHighlightMaterial.toneMapped=!1,this.textHighlightMaterial.color.convertSRGBToLinear(),this.textHighlightMaterial=this.textHighlightMaterial.getDerivedMaterial(),this.textGhostMaterial=new vr({color:16777215,opacity:.1,side:R},[\"USE_RTE\"]),this.textGhostMaterial.transparent=this.textGhostMaterial.opacity<1,this.textGhostMaterial.depthWrite=!this.textGhostMaterial.transparent,this.textGhostMaterial.toneMapped=!1,this.textGhostMaterial.color.convertSRGBToLinear(),this.textGhostMaterial=this.textGhostMaterial.getDerivedMaterial(),this.textColoredMaterial=new vr({color:16777215,opacity:1,side:R},[\"USE_RTE\"]),this.textColoredMaterial.transparent=this.textColoredMaterial.opacity<1,this.textColoredMaterial.depthWrite=!this.textColoredMaterial.transparent,this.textColoredMaterial.toneMapped=!1,this.textColoredMaterial.color.convertSRGBToLinear(),this.textColoredMaterial=this.textColoredMaterial.getDerivedMaterial(),this.textOverlayMaterial=new vr({color:314363,opacity:1,side:R},[\"USE_RTE\"]),this.textOverlayMaterial.transparent=this.textOverlayMaterial.opacity<1,this.textOverlayMaterial.depthWrite=!this.textOverlayMaterial.transparent,this.textOverlayMaterial.toneMapped=!1,this.textOverlayMaterial.color.convertSRGBToLinear(),this.textOverlayMaterial=this.textOverlayMaterial.getDerivedMaterial(),this.textHiddenMaterial=new vr({color:16777215,opacity:1,side:R},[\"USE_RTE\"]),this.textHiddenMaterial.visible=!1,this.textHiddenMaterial.toneMapped=!1,this.textHiddenMaterial.color.convertSRGBToLinear(),this.textHiddenMaterial=this.textHiddenMaterial.getDerivedMaterial()}async createDefaultNullMaterials(){this.materialMap[Et.NullRenderMaterialHash]=new Qt({color:8355711,emissive:0,roughness:1,metalness:0,side:R},[\"USE_RTE\"]),this.materialMap[Et.NullRenderMaterialHash].color.convertSRGBToLinear(),this.materialMap[Et.NullRenderMaterialVertexColorsHash]=new Qt({color:16777215,emissive:0,roughness:1,metalness:0,side:R,vertexColors:!0},[\"USE_RTE\"]),this.materialMap[Et.NullRenderMaterialVertexColorsHash].color.convertSRGBToLinear();const e=Et.NullDisplayStyleHash;this.materialMap[e]=new wt({color:8355711,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new y},[\"USE_RTE\"]),this.materialMap[e].color=new x(8355711),this.materialMap[e].color.convertSRGBToLinear(),this.materialMap[e].linewidth=1,this.materialMap[e].worldUnits=!1,this.materialMap[e].vertexColors=!0,this.materialMap[e].pixelThreshold=.5,this.materialMap[e].resolution=new y,this.materialMap[Et.NullPointMaterialHash]=new _t({color:8355711,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.materialMap[Et.NullPointMaterialHash].color.convertSRGBToLinear(),this.materialMap[Et.NullPointCloudVertexColorsMaterialHash]=new _t({color:16777215,vertexColors:!0,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.materialMap[Et.NullPointCloudMaterialHash]=new _t({color:16777215,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"])}async createDefaultMaterials(){await this.createDefaultMeshMaterials(),await this.createLineDefaultMaterials(),await this.createDefaultPointMaterials(),await this.createDefaultTextMaterials(),await this.createDefaultNullMaterials(),this.defaultGradientTextureData=await $t.getTextureData(pr)}makeMeshMaterial(e){const t=new Qt({color:e.color,emissive:0,roughness:e.roughness,metalness:e.metalness,opacity:e.opacity,side:R},[\"USE_RTE\"]);return t.vertexColors=e.vertexColors,t.transparent=t.opacity<1,t.depthWrite=!t.transparent,t.clipShadows=!0,t.color.convertSRGBToLinear(),t}makeLineMaterial(e){const t=new wt({color:e.color,linewidth:e.lineWeight>0?e.lineWeight:1,worldUnits:e.lineWeight>0,vertexColors:!0,alphaToCoverage:!1,resolution:new y},[\"USE_RTE\"]);return t.color=new x(e.color),t.color.convertSRGBToLinear(),t.linewidth=e.lineWeight>0?e.lineWeight:1,t.worldUnits=e.lineWeight>0,t.vertexColors=!0,t.pixelThreshold=.5,t.resolution=new y,t}makePointMaterial(e){const t=-16777216===e.color,r=e.vertexColors&&t?16777215:e.color,n=new _t({color:r,opacity:e.opacity,vertexColors:e.vertexColors,size:2,sizeAttenuation:!1},[\"USE_RTE\"]);return n.transparent=n.opacity<1,n.depthWrite=!n.transparent,n.toneMapped=!1,n.color.convertSRGBToLinear(),n}makeTextMaterial(e){const t=new vr({color:e.color,opacity:1,side:R},[\"USE_RTE\"]);return t.transparent=t.opacity<1,t.depthWrite=!t.transparent,t.toneMapped=!1,t.color.convertSRGBToLinear(),t.getDerivedMaterial()}getMaterial(e,t,r){let n;switch(r){case Kt.MESH:n=this.getMeshMaterial(e,t);break;case Kt.LINE:n=this.getLineMaterial(e,t);break;case Kt.POINT:n=this.getPointMaterial(e,t);break;case Kt.POINT_CLOUD:n=this.getPointCloudMaterial(e,t);break;case Kt.TEXT:n=this.getTextMaterial(e,t)}return n.clippingPlanes=[],n}getMeshMaterial(e,t){return t?this.makeMeshMaterial(t):this.materialMap[e]?this.materialMap[e].clone():void We.warn(`Could not create mesh material hash ${e} for `,t)}getLineMaterial(e,t){return this.materialMap[e]?this.materialMap[e]:this.makeLineMaterial(t)}getPointMaterial(e,t){return this.materialMap[e]?this.materialMap[e]:this.makePointMaterial(t)}getPointCloudMaterial(e,t){return this.getPointMaterial(e,t)}getTextMaterial(e,t){return this.makeTextMaterial(t)}getHighlightMaterial(e){switch(e.geometryType){case Kt.MESH:return e.transparent?this.meshTransparentHighlightMaterial:this.meshHighlightMaterial;case Kt.LINE:return this.lineHighlightMaterial;case Kt.POINT:return this.pointHighlightMaterial;case Kt.POINT_CLOUD:return this.pointCloudHighlightMaterial;case Kt.TEXT:return this.textHighlightMaterial}}getGhostMaterial(e){switch(e.geometryType){case Kt.MESH:return this.meshGhostMaterial;case Kt.LINE:return this.lineGhostMaterial;case Kt.POINT:case Kt.POINT_CLOUD:return this.pointGhostMaterial;case Kt.TEXT:return this.textGhostMaterial}}getGradientMaterial(e){switch(e.geometryType){case Kt.MESH:return e.transparent?this.meshTransparentGradientMaterial:this.meshGradientMaterial;case Kt.LINE:return this.lineColoredMaterial;case Kt.POINT:case Kt.POINT_CLOUD:return this.pointCloudGradientMaterial;case Kt.TEXT:return this.textColoredMaterial}}getColoredMaterial(e){switch(e.geometryType){case Kt.MESH:return e.transparent?this.meshTransparentColoredMaterial:this.meshColoredMaterial;case Kt.LINE:return this.lineColoredMaterial;case Kt.POINT:case Kt.POINT_CLOUD:return this.pointCloudColouredMaterial;case Kt.TEXT:return this.textColoredMaterial}}getOverlayMaterial(e){switch(e.geometryType){case Kt.MESH:return e.transparent?this.meshTransparentOverlayMaterial:this.meshOverlayMaterial;case Kt.LINE:return this.lineOverlayMaterial;case Kt.POINT:return this.pointOverlayMaterial;case Kt.POINT_CLOUD:return this.pointCloudOverlayMaterial;case Kt.TEXT:return this.textOverlayMaterial}}getHiddenMaterial(e){switch(e.geometryType){case Kt.MESH:return this.meshHiddenMaterial;case Kt.LINE:return this.lineHiddenMaterial;case Kt.POINT:case Kt.POINT_CLOUD:return this.meshHiddenMaterial;case Kt.TEXT:return this.textHiddenMaterial}}getDebugBatchMaterial(e){const t=new x(r.randInt(0,16777215));switch(t.convertSRGBToLinear(),e.geometryType){case Kt.MESH:return new Qt({color:t,emissive:0,roughness:1,metalness:0,opacity:1,side:R},[\"USE_RTE\"]);case Kt.LINE:{const e=new wt({color:t,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new y});return e.color=t,e.linewidth=1,e.worldUnits=!1,e.vertexColors=!0,e.pixelThreshold=.5,e.resolution=new y,e}case Kt.POINT:return new _t({color:t,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]);case Kt.POINT_CLOUD:return new _t({color:t,vertexColors:!0,size:2,sizeAttenuation:!1},[\"USE_RTE\"]);case Kt.TEXT:{const e=new vr({color:t,opacity:1,side:R},[\"USE_RTE\"]);return e.toneMapped=!1,e.color.convertSRGBToLinear(),e.getDerivedMaterial()}}}getFilterMaterial(e,t){let r;switch(t){case er.SELECT:r=this.getHighlightMaterial(e);break;case er.GHOST:r=this.getGhostMaterial(e);break;case er.GRADIENT:r=this.getGradientMaterial(e);break;case er.COLORED:r=this.getColoredMaterial(e);break;case er.OVERLAY:r=this.getOverlayMaterial(e);break;case er.HIDDEN:r=this.getHiddenMaterial(e)}return r.clippingPlanes=[],r}getFilterMaterialOptions(e){switch(e.filterType){case er.COLORED:return{rampIndex:void 0!==e.rampIndex?e.rampIndex:void 0,rampIndexColor:e.rampIndexColor,rampTexture:e.rampTexture?e.rampTexture:void 0,rampWidth:e.rampTexture?e.rampTexture.image.width:void 0};case er.GRADIENT:return{rampIndex:void 0!==e.rampIndex?e.rampIndex:void 0,rampIndexColor:void 0!==e.rampIndexColor?e.rampIndexColor:(new x).setRGB(this.defaultGradientTextureData.data[4*Math.floor(e.rampIndex*(this.defaultGradientTextureData.width-1))]/255,this.defaultGradientTextureData.data[4*Math.floor(e.rampIndex*(this.defaultGradientTextureData.width-1))+1]/255,this.defaultGradientTextureData.data[4*Math.floor(e.rampIndex*(this.defaultGradientTextureData.width-1))+2]/255).convertSRGBToLinear(),rampTexture:e.rampTexture?e.rampTexture:this.meshGradientMaterial.userData.gradientRamp.value,rampWidth:e.rampTexture?e.rampTexture.image.width:this.meshGradientMaterial.userData.gradientRamp.value.image.width}}}purge(){}}Sr.UNIFORM_VECTORS_USED=33;const hr=new s,Vr=new f,mr=new O,zr=new t,Xr=new t,br=new t,qr=new t,Kr=new t,Ur=new t,Tr=new t,xr=new t,Pr=new t,Wr=new t,yr=new y,Rr=new y,Mr=new y,Nr=new t,Or=new t,Lr=new f,Zr=new s;class kr extends L{get BVH(){return this.bvh}get batchObjects(){return this._batchObjects}constructor(e,t){super(e,t),this.bvh=null,this.batchMaterial=null,this.materialCache={},this.materialStack=[],this.transformsBuffer=null,this.transformsDirty=!0,this.transformsTextureUniform=null,this.transformsArrayUniforms=null,this.debugBatchBox=!1,this.batchMaterial=t}setBatchObjects(e,t){this._batchObjects=e,this.transformStorage=t,this.transformStorage===gr.VERTEX_TEXTURE?(this.transformsBuffer=new Float32Array(4*this._batchObjects.length*4),this.transformsTextureUniform=new P(this.transformsBuffer,this.transformsBuffer.length/4,1,Z,k)):this.transformStorage===gr.UNIFORM_ARRAY&&(this.transformsArrayUniforms=this._batchObjects.map((()=>new s))),this.updateTransformsUniform()}setOverrideMaterial(e){this.materialStack.push(this.material),this.materialCache[e.id]||(this.materialCache[e.id]=e.clone()),this.materialCache[e.id].copy(e),this.material=this.materialCache[e.id],this.material.needsUpdate=!0}getCachedMaterial(e,t=!1){return this.materialCache[e.id]?t&&Sr.fastCopy(e,this.materialCache[e.id]):this.materialCache[e.id]=e.clone(),this.materialCache[e.id]}restoreMaterial(){this.materialStack.length>0&&(this.material=this.materialStack.pop())}updateMaterialTransformsUniform(e){e.defines.TRANSFORM_STORAGE=this.transformStorage,this.transformStorage===gr.VERTEX_TEXTURE?(e.userData.tTransforms.value=this.transformsTextureUniform,e.userData.objCount&&(e.userData.objCount.value=this._batchObjects.length)):this.transformStorage===gr.UNIFORM_ARRAY&&(e.defines.OBJ_COUNT&&e.defines.OBJ_COUNT===this._batchObjects.length||(e.defines.OBJ_COUNT=this._batchObjects.length),e.userData.uTransforms.value=this.transformsArrayUniforms),e.needsUpdate=!0}updateTransformsUniform(){this.transformsDirty?(this.transformStorage===gr.VERTEX_TEXTURE?(this._batchObjects.forEach((e=>{const t=16*e.batchIndex;this.transformsBuffer[t]=e.quaternion.x,this.transformsBuffer[t+1]=e.quaternion.y,this.transformsBuffer[t+2]=e.quaternion.z,this.transformsBuffer[t+3]=e.quaternion.w,this.transformsBuffer[t+4]=e.pivot_Low.x,this.transformsBuffer[t+5]=e.pivot_Low.y,this.transformsBuffer[t+6]=e.pivot_Low.z,this.transformsBuffer[t+7]=e.scale.x,this.transformsBuffer[t+8]=e.pivot_High.x,this.transformsBuffer[t+9]=e.pivot_High.y,this.transformsBuffer[t+10]=e.pivot_High.z,this.transformsBuffer[t+11]=e.scale.y,this.transformsBuffer[t+12]=e.translation.x,this.transformsBuffer[t+13]=e.translation.y,this.transformsBuffer[t+14]=e.translation.z,this.transformsBuffer[t+15]=e.scale.z})),this.transformsTextureUniform.needsUpdate=!0):this._batchObjects.forEach(((e,t)=>{this.transformsArrayUniforms[t].set(e.quaternion.x,e.pivot_Low.x,e.pivot_High.x,e.translation.x,e.quaternion.y,e.pivot_Low.y,e.pivot_High.y,e.translation.y,e.quaternion.z,e.pivot_Low.z,e.pivot_High.z,e.translation.z,e.quaternion.w,e.scale.x,e.scale.y,e.scale.z)})),this.bvh&&(this.bvh.refit(),this.bvh.getBoundingBox(this.bvh.bounds),this.geometry.boundingBox.copy(this.bvh.bounds),this.geometry.boundingBox.getBoundingSphere(this.geometry.boundingSphere),!this.boxHelper&&this.debugBatchBox&&(this.boxHelper=new v(this.bvh.bounds,new x(16711680)),this.boxHelper.layers.set(En.PROPS),this.parent.add(this.boxHelper))),this.transformsDirty=!1):this.bvh&&(this.bvh.lastRefitTime=0)}buildBVH(){this.bvh=new Rt(this.batchObjects),this.bvh.tas.refit()}getBatchObjectMaterial(e){const t=e.renderView,r=this.geometry.groups.find((e=>t.batchStart>=e.start&&t.batchStart+t.batchCount<=e.count+e.start));return Array.isArray(this.material)?r?this.material[r.materialIndex]:(We.warn(`Could not get material for ${e.renderView.renderData.id}`),null):this.material}convertRaycastIntersect(e,t,r){return null===e?null:(e.point.applyMatrix4(t.matrixWorld),e.distance=e.point.distanceTo(r.ray.origin),e.object=t,e.distancer.far?null:e)}raycast(e,t){if(this.bvh){if(void 0===this.batchMaterial)return;Zr.copy(this.matrixWorld).invert(),Lr.copy(e.ray).applyMatrix4(Zr);const r=this.bvh;if(!0===e.firstHitOnly){const n=this.convertRaycastIntersect(r.raycastFirst(Lr,this.batchMaterial),this,e);n&&t.push(n)}else{const n=r.raycast(Lr,this.batchMaterial);for(let r=0,i=n.length;rr.far?null:{distance:d,point:Or.clone(),object:e,uv:void 0,uv2:void 0,face:void 0}}(e,r,n,i,Xr,br,qr,Nr);if(S){d&&(yr.fromBufferAttribute(d,o),Rr.fromBufferAttribute(d,c),Mr.fromBufferAttribute(d,v),S.uv=G.getUV(Nr,Xr,br,qr,yr,Rr,Mr,new y)),p&&(yr.fromBufferAttribute(p,o),Rr.fromBufferAttribute(p,c),Mr.fromBufferAttribute(p,v),S.uv2=G.getUV(Nr,Xr,br,qr,yr,Rr,Mr,new y));const e={a:o,b:c,c:v,normal:new t,materialIndex:0};G.getNormal(Xr,br,qr,e.normal),S.face=e}return S}kr.MeshBatchNumber=0;class jr{get renderView(){return this._renderView}get bvh(){return this._bvh}get batchIndex(){return this._batchIndex}get speckleId(){return this._renderView.renderData.id}constructor(e,r){this.quaternion=new E,this.pivot_High=new t,this.pivot_Low=new t,this.translation=new t,this.scale=new t(1,1,1),this._renderView=e,this._batchIndex=r,this.transform=(new s).identity(),this.transformInv=(new s).identity(),this._localOrigin=this._renderView.aabb.getCenter(new t),Pt.DoubleToHighLowVector(new t(this._localOrigin.x,this._localOrigin.y,this._localOrigin.z),this.pivot_Low,this.pivot_High)}buildBVH(){const e=(new s).makeTranslation(this._localOrigin.x,this._localOrigin.y,this._localOrigin.z);e.invert();const r=this._renderView.renderData.geometry.attributes.INDEX,n=this._renderView.renderData.geometry.attributes.POSITION,i=new Float32Array(n.length),l=new t;for(let t=0;t{t=Math.min(t,e.offset),r=Math.max(r,e.offset)})),this.geometry.setDrawRange(t,r-t+e.find((e=>e.offset===r)).count),this.mesh.visible=!0}getVisibleRange(){return 0===this.geometry.groups.length?Tt:{offset:this.geometry.drawRange.start,count:this.geometry.drawRange.count}}setDrawRanges(...e){e.forEach((e=>{var t;e.material&&(e.material=this.mesh.getCachedMaterial(e.material,null===(t=e.materialOptions)||void 0===t?void 0:t.needsCopy))}));const t=e.map((e=>e.material)),r=[...Array.from(new Set(t.map((e=>e))))];Array.isArray(this.mesh.material)||(this.mesh.material=[this.mesh.material]);for(let e=0;ee.offset-t.offset)),i=[];let l=1/0,a=0;for(let e=0;ee.material)),r=[...Array.from(new Set(t.map((e=>e))))];Array.isArray(this.mesh.material)||(this.mesh.material=[this.mesh.material]);for(let e=0;ee.offset-t.offset));for(let e=0;e(-1===e.indexOf(t.materialIndex)&&e.push(t.materialIndex),e)),i);const l=[];for(let e=0;et.materialIndex===i[e])));this.geometry.groups=[];for(let e=0;et.id===e)))||void 0===t?void 0:t.materialIndex;n&&(this.geometry.groups=this.geometry.groups.filter((t=>!(t.id&&t.id===e))),this.mesh.material.splice(n,1),n!==r-1&&this.geometry.groups.forEach((e=>{e.materialIndex>n&&e.materialIndex--})))}getDrawRangeCollision(e){if(this.geometry.groups.length>0){for(let t=0;t0===e.start&&e.count===this.getCount()&&0===e.materialIndex));-1!==e&&this.geometry.groups.splice(e,1);const t=this.geometry.groups.sort(((e,t)=>e.start-t.start)).slice(),r=t.map((e=>e.start));for(let e=0;e{const r=this.mesh.material[e.materialIndex],n=this.mesh.material[t.materialIndex],i=+n.visible-+r.visible,l=+r.transparent-+n.transparent;return 0!==i?i:l}));const n=[];t.reduce(((e,t)=>(-1===e.indexOf(t.materialIndex)&&e.push(t.materialIndex),e)),n);const i=[];for(let e=0;et.materialIndex===n[e])));const l=this.getCurrentIndexBuffer(),a=this.getNextIndexBuffer(),s=[],u={};let d=0;for(let e=0;e!1===this.mesh.material[e.materialIndex].visible));o&&this.setVisibleRange({offset:0,count:o.start})}createRenderViewMapping(){const e={};for(let t=0;te.renderData.geometry.attributes.INDEX)).length,t=this.renderViews.flatMap((e=>e.renderData.geometry.attributes.POSITION)).length,r=void 0!==this.renderViews[0].renderData.geometry.attributes.COLOR,n=new Uint32Array(e),i=new Float64Array(t),l=new Float32Array(r?t:0);l.fill(1);const a=new Float32Array(t/3);let s=0,u=0;const d=[];for(let e=0;ee+s/3)),u),i.set(t.attributes.POSITION,s),t.attributes.COLOR&&l.set(t.attributes.COLOR,s),a.fill(e,s/3,s/3+t.attributes.POSITION.length/3),this.renderViews[e].setBatchData(this.id,u,t.attributes.INDEX.length,s/3,s/3+t.attributes.POSITION.length/3);const r=new jr(this.renderViews[e],e);r.buildBVH(),d.push(r),s+=t.attributes.POSITION.length,u+=t.attributes.INDEX.length}this.makeMeshGeometry(n,i,a,r?l:null),this.mesh=new kr(this.geometry,this.batchMaterial),this.mesh.setBatchObjects(d,this.transformStorage),this.mesh.buildBVH(),this.mesh.uuid=this.id,this.mesh.layers.set(En.STREAM_CONTENT_MESH),this.mesh.frustumCulled=!1,this.mesh.material=[this.batchMaterial],this.mesh.geometry.addGroup(0,this.getCount(),0),jt.keepGeometryData||d.forEach((e=>{e.renderView.disposeGeometry()}))}getRenderView(e){return console.warn(\"Deprecated! Do not call this anymore\"),null}getMaterialAtIndex(e){return console.warn(\"Deprecated! Do not call this anymore\"),null}makeMeshGeometry(e,t,r,i){this.geometry=new u,t.length>=65535||e.length>=65535?(this.indexBuffer0=new d(e,1),this.indexBuffer1=new d(new Uint32Array(e.length),1)):(this.indexBuffer0=new p(e,1),this.indexBuffer1=new p(new Uint16Array(e.length),1)),this.geometry.setIndex(this.indexBuffer0),t&&this.geometry.setAttribute(\"position\",new n(t,3)),r&&this.geometry.setAttribute(\"objIndex\",new n(r,1)),i&&this.geometry.setAttribute(\"color\",new n(i,3));const l=new Float32Array(t.length/3);return this.gradientIndexBuffer=new n(l,1),this.gradientIndexBuffer.setUsage(w),this.geometry.setAttribute(\"gradientIndex\",this.gradientIndexBuffer),this.updateGradientIndexBufferData(0,l.length,0),this.updateGradientIndexBuffer(),Pt.computeVertexNormals(this.geometry,t),this.geometry.computeBoundingSphere(),this.geometry.computeBoundingBox(),Pt.updateRTEGeometry(this.geometry,t),this.geometry}updateGradientIndexBufferData(e,t,r){const n=this.geometry.index.array,i=this.gradientIndexBuffer.array;let l=1/0,a=0;for(let s=e;st.id===e));t.length&&(this.setDrawRanges(...t),this.insertedRanges=this.insertedRanges.filter((e=>!t.includes(e))))}autoFillDrawRanges(){}resetDrawRanges(){this.setDrawRanges({offset:0,count:1/0,material:this.batchMaterial}),this.mesh.material=this.batchMaterial,this.mesh.visible=!0,this.batchMaterial.transparent=!1}buildBatch(){let e=0;this.renderViews.forEach((t=>e+=t.needsSegmentConversion?2*(t.renderData.geometry.attributes.POSITION.length-3):t.renderData.geometry.attributes.POSITION.length));const t=new Float64Array(e);let r=0;for(let e=0;e=this.renderViews[t].batchStart&&e{t=Math.min(t,e.offset),r=Math.max(r,e.offset)})),this.geometry.setDrawRange(t,r-t+e.find((e=>e.offset===r)).count),this.mesh.visible=!0}getVisibleRange(){return Tt}setDrawRanges(...e){const t=e.map((e=>e.material)),r=[...Array.from(new Set(t.map((e=>e))))];Array.isArray(this.mesh.material)?this.mesh.material=this.mesh.material.concat(r):this.mesh.material=[this.mesh.material,...r];const n=e.sort(((e,t)=>e.offset-t.offset)),i=[];let l=1/0,a=0;for(let e=0;ee.material)),r=[...Array.from(new Set(t.map((e=>e))))];Array.isArray(this.mesh.material)||(this.mesh.material=[this.mesh.material]);for(let e=0;ee.offset-t.offset));for(let e=0;e!(t.id&&t.id===e)))}getDrawRangeCollision(e){if(this.geometry.groups.length>0){for(let t=0;t1&&0===this.geometry.groups[0].start&&this.geometry.groups[0].count===this.getCount()&&this.geometry.groups.shift();const e=this.geometry.groups.sort(((e,t)=>e.start-t.start)).slice();for(let t=0;t0&&this.geometry.addGroup(0,e[t].start,0),1===e.length&&e[t].start+e[t].counte.start-t.start));let t=0;this.geometry.groups.forEach((e=>{t+=e.count})),t(-1===e.indexOf(t.materialIndex)&&e.push(t.materialIndex),e)),e);const t=[];for(let r=0;rt.materialIndex===e[r])));this.geometry.groups=[];for(let e=0;ee.renderData.geometry.attributes.POSITION)).length,t=new Float64Array(e),r=new Float32Array(e).fill(1);let n=0;for(let e=0;e=this.renderViews[t].batchStart&&e=this.renderViews[t].batchStart&&ee.batchStart>=t.start&&e.batchStart+e.batchCount<=t.count+t.start));return Array.isArray(this.mesh.material)?r?this.mesh.material[r.materialIndex]:(We.warn(\"Malformed material index!\"),null):this.mesh.material}}makePointGeometry(e,t){this.geometry=new u,this.geometry.setAttribute(\"position\",new n(e,3)),this.geometry.setAttribute(\"color\",new n(t,3));const r=new Float32Array(e.length/3);return this.gradientIndexBuffer=new n(r,1),this.gradientIndexBuffer.setUsage(w),this.geometry.setAttribute(\"gradientIndex\",this.gradientIndexBuffer),this.updateGradientIndexBufferData(0,r.length,0),this.updateGradientIndexBuffer(),this.geometry.computeVertexNormals(),this.geometry.computeBoundingSphere(),this.geometry.computeBoundingBox(),Pt.updateRTEGeometry(this.geometry,e),this.geometry}updateGradientIndexBufferData(e,t,r){return this.gradientIndexBuffer.array.fill(r,e,t),this.gradientIndexBuffer.updateRange={offset:e,count:t-e},this.gradientIndexBuffer.needsUpdate=!0,this.geometry.attributes.gradientIndex.needsUpdate=!0,{minIndex:e,maxIndex:t}}updateGradientIndexBuffer(e,t){this.gradientIndexBuffer.updateRange={offset:void 0!==e?e:0,count:void 0!==e&&void 0!==t?t-e+1:-1},this.gradientIndexBuffer.needsUpdate=!0,this.geometry.attributes.gradientIndex.needsUpdate=!0}purge(){this.renderViews.length=0,this.geometry.dispose(),this.batchMaterial.dispose(),this.mesh=null}}class Jr{constructor(){this.boxes=new Array,this.worldBox=new c,this._worldOrigin=new t}get worldSize(){this.worldBox.getCenter(this._worldOrigin);const e=(new t).subVectors(this.worldBox.max,this.worldBox.min);return{x:e.x,y:e.y,z:e.z}}get worldOrigin(){return this._worldOrigin}expandWorld(e){this.boxes.push(e),this.updateWorld()}reduceWorld(e){this.boxes.splice(this.boxes.indexOf(e),1),this.updateWorld()}updateWorld(){this.worldBox.makeEmpty();for(let e=0;e{let r=0;return async()=>{Date.now()-r>=e&&(r=Date.now(),await new Promise((e=>setTimeout(e,t))))}})(e,t)}}const Yr={backgroundColor:null,backgroundCornerRadius:1,backgroundPixelHeight:50,textColor:new x(16777215),billboard:!1};class Fr extends L{static SpeckleTextParamsFromMetadata(e){return{textValue:e.value?e.value:\"N/A\",height:e.height}}get textMesh(){return this._text}get backgroundMesh(){return this._background}set style(e){Object.assign(this._style,e),this.updateStyle()}constructor(e){super(),this._text=null,this._background=null,this._backgroundSize=new t,this._style=Object.assign({},Yr),this._resolution=new y,this.defaultMaterial=new z({color:16777215,side:R,transparent:!0}),this.getFlatRaycastMesh=()=>{const e=new L(new F(1,1),this.defaultMaterial);return this.getFlatRaycastMesh=()=>e,e},this.getCurvedRaycastMesh=()=>{const e=new L(new F(1,1,32,1),this.defaultMaterial);return this.getCurvedRaycastMesh=()=>e,e},this.uuid=e,this._text=new Je,this._text.depthOffset=-.1,this._text.raycast=()=>{},this.add(this._text),this.onBeforeRender=e=>{e.getDrawingBufferSize(this._resolution)}}async update(e,t){return new Promise((r=>{e.textValue&&(this._text.text=e.textValue),e.richTextValue,e.height&&(this._text.fontSize=e.height),this._text.anchorX=e.anchorX,this._text.anchorY=e.anchorY,this._text._needsSync?this._text.sync((()=>{r(),t&&t()})):(r(),t&&t())}))}setTransform(e,t,r){e&&(this._style.billboard&&(this.textMesh.material.userData.billboardPos.value.copy(e),this._background.material.userData.billboardPos.value.copy(e)),this.position.copy(e)),t&&this.quaternion.copy(t),r&&this.scale.copy(r)}raycast(e,t){const{textRenderInfo:r,curveRadius:n}=this.textMesh;if(r){const i=r.blockBounds,l=n?this.getCurvedRaycastMesh():this.getFlatRaycastMesh(),a=l.geometry,{position:u,uv:d}=a.attributes;for(let t=0;t.1&&(i=this.RectangleRounded(1.2*r.x,1.2*r.y,.5,5),i.computeBoundingBox(),this._backgroundSize.copy(r),this._background&&(this._background.geometry=i)),null===this._background){const e=new or({},[\"BILLBOARD_FIXED\"]);e.toneMapped=!1,e.side=R,e.depthTest=!1,this._background=new L(i,e),this._background.layers.set(En.MEASUREMENTS),this._background.frustumCulled=!1,this._background.renderOrder=1,this.add(this._background)}const l=new x(this._style.backgroundColor).convertSRGBToLinear();this._background.material.color=l,this._background.material.billboardPixelHeight=this._style.backgroundPixelHeight*window.devicePixelRatio}RectangleRounded(e,t,r,n){const i=2*Math.PI,l=4*(n+1),s=[],d=[],p=[];let o,c,v,f,S;for(let e=1;et.id===e));t.length&&(this.setDrawRanges(...t),this.insertedRanges=this.insertedRanges.filter((e=>!t.includes(e))))}autoFillDrawRanges(){}resetDrawRanges(){this.mesh.textMesh.material=this.batchMaterial,this.mesh.textMesh.visible=!0}async buildBatch(){this.mesh=new Fr(this.id),this.mesh.matrixAutoUpdate=!1,await this.mesh.update(Fr.SpeckleTextParamsFromMetadata(this.renderViews[0].renderData.geometry.metaData)),this.mesh.matrix.copy(this.renderViews[0].renderData.geometry.bakeTransform),this.renderViews[0].setBatchData(this.id,0,this.mesh.textMesh.geometry.index.length/3),this.mesh.textMesh.material=this.batchMaterial,this.mesh.layers.set(En.STREAM_CONTENT_TEXT),this.mesh.textMesh.layers.set(En.STREAM_CONTENT_TEXT)}getRenderView(e){return this.renderViews[0]}getMaterialAtIndex(e){return this.batchMaterial}purge(){this.renderViews.length=0,this.batchMaterial.dispose(),this.mesh.geometry.dispose(),this.mesh=null}}var gr;!function(e){e[e.VERTEX_TEXTURE=0]=\"VERTEX_TEXTURE\",e[e.UNIFORM_ARRAY=1]=\"UNIFORM_ARRAY\"}(gr||(gr={}));class Cr{constructor(e,t){this.maxHardwareUniformCount=0,this.floatTextures=!1,this.maxBatchObjects=0,this.maxBatchVertices=5e5,this.batches={},this.maxHardwareUniformCount=e,this.maxBatchObjects=Math.floor((this.maxHardwareUniformCount-Sr.UNIFORM_VECTORS_USED)/4),this.floatTextures=t,this.materials=new Sr,this.materials.createDefaultMaterials()}async makeBatches(e,t,r){const n=e.getRenderableRenderViews(...t).sort(((e,t)=>0===e.renderMaterialHash?-1:0===t.renderMaterialHash?1:e.renderMaterialHash-t.renderMaterialHash)),i=[...Array.from(new Set(n.map((e=>e.renderMaterialHash))))];We.warn(`Batch count: ${i}`);for(let t=0;te.renderMaterialHash===i[t]));a=a.filter((e=>{const t=e.validGeometry;return t&&(l+=e.renderData.geometry.attributes.POSITION.length/3),t||e.hasMetadata}));const s=this.splitBatch(a,l);for(let n=0;n0===e.renderMaterialHash?-1:0===t.renderMaterialHash?1:e.renderMaterialHash-t.renderMaterialHash)),a=[...Array.from(new Set(l.map((e=>e.renderMaterialHash))))];let s=Number.MAX_SAFE_INTEGER,u=-1,d=0,p=0;for(let t=0;te.renderMaterialHash===a[t])),o=0;if(n=n.filter((e=>{const t=e.validGeometry;return t&&(o+=e.renderData.geometry.attributes.POSITION.length/3),t||e.hasMetadata})),0===n.length)continue;const c=this.splitBatch(n,o);for(let n=0;n0){let t=0,n=0;r.push([]);for(let i=0;i=this.maxBatchVertices&&e[i+1]&&(r.push([]),n++,t=0)}}else r.push(e);if(e[0].geometryType===Kt.MESH){const e=[];for(let t=0;t0&&e.push(r[t].slice(a,a+l))}return e}return r}async buildBatch(e,t,r,n){const i=t.filter((e=>e.renderMaterialHash===r));if(!i.length)return We.warn(\"All renderviews have invalid geometries. Skipping batch!\",t),null;const l=void 0!==n?n:i[0].geometryType;let a=null;l===Kt.MESH?a=t[0].renderData.renderMaterial:l===Kt.LINE?a=t[0].renderData.displayStyle:l===Kt.POINT||l===Kt.POINT_CLOUD?a=t[0].renderData.renderMaterial:l===Kt.TEXT&&(a=t[0].renderData.displayStyle);const s=this.materials.getMaterial(r,a,l),u=Pe();let d=null;switch(l){case Kt.MESH:d=new Ir(u,e.id,i,this.floatTextures?gr.VERTEX_TEXTURE:gr.UNIFORM_ARRAY);break;case Kt.LINE:d=new Er(u,e.id,i);break;case Kt.POINT:case Kt.POINT_CLOUD:d=new wr(u,e.id,i);break;case Kt.TEXT:d=new Dr(u,e.id,i)}return d.setBatchMaterial(s),await d.buildBatch(),d}update(e){for(const t in this.batches)this.batches[t].onUpdate(e)}render(e){for(const t in this.batches)this.batches[t].onRender(e)}saveVisiblity(){const e={};for(const t in this.batches){const r=this.batches[t];e[t]=r.getVisibleRange()}return e}applyVisibility(e){for(const t in this.batches){const r=this.batches[t],n=e[t];n?r.setVisibleRange(n):r.setVisibleRange(Ut)}}getTransparent(){const e={};for(const t in this.batches){const r=this.batches[t],n=r.renderObject;if(0===n.geometry.groups.length)Sr.isTransparent(n.material)&&(e[t]=Tt);else{const i=n.geometry.groups.find((e=>Sr.isTransparent(n.material[e.materialIndex]))),l=n.geometry.groups.find((e=>!1===n.material[e.materialIndex].visible));i&&(e[t]={offset:i.start,count:void 0!==l?l.start:r.getCount()-i.start})}}return e}getStencil(){const e={};for(const t in this.batches){const r=this.batches[t].renderObject;if(0===r.geometry.groups.length)!0===r.material.stencilWrite&&(e[t]=Tt);else{const n=r.geometry.groups.find((e=>!0===r.material[e.materialIndex].stencilWrite));n&&(e[t]={offset:n.start,count:n.count})}}return e}getOpaque(){const e={};for(const t in this.batches){const r=this.batches[t],n=r.renderObject;if(0===n.geometry.groups.length)Sr.isOpaque(n.material)&&(e[t]=Tt);else{const i=n.geometry.groups.find((e=>Sr.isTransparent(n.material[e.materialIndex])||!1===n.material[e.materialIndex].visible));e[t]={offset:0,count:void 0!==i?i.start:r.getCount()}}}return e}overrideMaterial(e,t){for(const r in e){if(this.batches[r].geometryType!==Kt.MESH)continue;this.batches[r].renderObject.setOverrideMaterial(t)}}restoreMaterial(e){for(const t in e){if(this.batches[t].geometryType!==Kt.MESH)continue;this.batches[t].renderObject.restoreMaterial()}}getByMaterialUUID(e){const t={};for(const r in this.batches){const n=this.batches[r],i=n.renderObject;if(0===i.geometry.groups.length)i.material.uuid===e&&(t[r]=Tt);else{const l=i.geometry.groups.find((t=>i.material[t.materialIndex].uuid===e));t[r]={offset:0,count:void 0!==l?l.start:n.getCount()}}}return t}purgeBatches(e){for(const t in this.batches)this.batches[t].subtreeId===e&&(this.batches[t].purge(),delete this.batches[t])}getBatches(e,t){return Object.values(this.batches).filter((r=>{const n=void 0===e||r.subtreeId===e,i=void 0===t||r.geometryType===t;return n&&i}))}getBatch(e){return Object.values(this.batches).find((t=>t.renderViews.includes(e)))}getRenderView(e,t){return this.batches[e]?this.batches[e].getRenderView(t):(We.error(\"Invalid batch id!\"),null)}getRenderViewMaterial(e,t){return this.batches[e]?this.batches[e].getMaterialAtIndex(t):(We.error(\"Invalid batch id!\"),null)}resetBatchesDrawRanges(){for(const e in this.batches)this.batches[e].resetDrawRanges()}setObjectsFilterMaterial(e,t,r=!0){return this.setObjectsMaterial(e,(e=>({offset:e.batchStart,count:e.batchCount,material:this.materials.getFilterMaterial(e,t.filterType),materialOptions:this.materials.getFilterMaterialOptions(t)})),r)}setObjectsMaterial(e,t,r=!0){let n=e;r&&(n=[...Array.from(new Set(e.map((e=>e))))]);const i=[...Array.from(new Set(n.map((e=>e.batchId))))];for(let e=0;et.batchId===i[e])).map(t);r.setDrawRanges(...l)}return i}insertObjectsFilterMaterial(e,t){let r=e;r=[...Array.from(new Set(e.map((e=>e))))];const n=[...Array.from(new Set(r.map((e=>e.batchId))))],i=Pe();for(let e=0;et.batchId===n[e])),s=a.filter((e=>!e.transparent)),u=a.filter((e=>e.transparent));let d,p;s.length&&(d=this.materials.getFilterMaterial(s[0],t.filterType).clone()),u.length&&(p=this.materials.getFilterMaterial(u[0],t.filterType).clone());const o=a.map((e=>({offset:e.batchStart,count:e.batchCount,material:e.transparent?p:d,materialOptions:this.materials.getFilterMaterialOptions(t),id:i})));l.insertDrawRanges(...o)}return i}removeObjectsMaterial(e){for(const t in this.batches)this.batches[t]&&this.batches[t].removeDrawRanges(e)}autoFillDrawRanges(e){[...Array.from(new Set(e.map((e=>e))))].forEach((e=>{e&&this.batches[e].autoFillDrawRanges()}))}async isolateRenderViewBatch(e,t){const r=t.getRenderViewForNodeId(e);for(const e in this.batches)e!==r.batchId&&this.batches[e].setDrawRanges({offset:0,count:this.batches[e].getCount(),material:this.materials.getFilterMaterial(this.batches[e].renderViews[0],er.GHOST)})}async isolateBatch(e){for(const t in this.batches)t!==e&&this.batches[t].setDrawRanges({offset:0,count:this.batches[t].getCount(),material:this.materials.getFilterMaterial(this.batches[t].renderViews[0],er.GHOST)})}}const Hr={hover:!1};class Qr extends ut{constructor(e,t){let r;super(),this.lastTap=0,this.lastClick=0,this.container=e,this.container.addEventListener(\"pointerdown\",(e=>{e.preventDefault(),r=(new Date).getTime()})),this.container.addEventListener(\"pointerup\",(e=>{e.preventDefault();const t=(new Date).getTime(),n=t-r,i=t-this.lastClick;if(n>250||i{this.touchLocation=e.targetTouches[0]})),this.container.addEventListener(\"touchend\",(e=>{if(e.targetTouches.length>0)return;const t=(new Date).getTime(),r=t-this.lastTap;clearTimeout(this.tapTimeout),r<500&&r>0?this.emit(it.ObjectDoubleClicked,this._getNormalisedClickPosition(this.touchLocation)):this.tapTimeout=setTimeout((function(){clearTimeout(this.tapTimeout)}),500),this.lastTap=t})),this.container.addEventListener(\"dblclick\",(e=>{const t=this._getNormalisedClickPosition(e);t.event=e,this.emit(it.ObjectDoubleClicked,t)})),this.container.addEventListener(\"pointermove\",(e=>{const t=this._getNormalisedClickPosition(e);t.event=e,this.emit(\"pointer-move\",t)})),document.addEventListener(\"keyup\",(e=>{this.emit(\"key-up\",e)}))}_getNormalisedClickPosition(e){const t=this.container,r=this.container.getBoundingClientRect(),n=(e.clientX-r.left)*t.width/r.width,i=(e.clientY-r.top)*t.height/r.height;return new y(n/t.width*2-1,i/t.height*-2+1)}dispose(){super.dispose()}}Qr.MAX_DOUBLE_CLICK_TIMING=500;class Ar extends D{constructor(e,t,r=0,n=1/0){super(e,t,r,n),this.onObjectIntersectionTest=null,this.layers.disableAll(),this.layers.enable(En.STREAM_CONTENT),this.layers.enable(En.STREAM_CONTENT_MESH),this.layers.enable(En.STREAM_CONTENT_LINE),this.layers.enable(En.STREAM_CONTENT_TEXT),this.layers.enable(En.STREAM_CONTENT_POINT_CLOUD)}intersectObjects(e,t=!0,r=[]){for(let n=0,i=e.length;n{this.raycaster.layers.enable(e)})));const l=e.getObjectByName(\"ContentGroup\");let a=[];return l&&(a=this.raycaster.intersectObjects(l.children)),this.raycaster.layers.mask=i,0===a.length?null:(t&&a.sort(((e,t)=>e.distance-t.distance)),r&&(a=a.filter((e=>r.containsPoint(e.point)))),a)}}class en extends gt{get vertexShader(){return\"\\n#include \\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n uniform mat4 rteModelViewMatrix;\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\n#ifdef LINEAR_DEPTH\\n varying vec4 vViewPosition;\\n#endif\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n// This is used for computing an equivalent of gl_FragCoord.z that is as high precision as possible.\\n// Some platforms compute gl_FragCoord at a lower precision which makes the manually computed value better for\\n// depth-based postprocessing effects. Reproduced on iPad with A10 processor / iPadOS 13.3.1.\\nvarying vec2 vHighPrecisionZW;\\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\n\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t//#include // EDITED CHUNK\\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n\\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n \\n mvPosition = rteModelViewMatrix * mvPosition;\\n\\n #ifdef LINEAR_DEPTH\\n vViewPosition = mvPosition;\\n #endif \\n \\n gl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t// #include \\n #if NUM_CLIPPING_PLANES > 0\\n\\t vClipPosition = - mvPosition.xyz;\\n #endif\\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\\n\"}get fragmentShader(){return\"\\n#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#ifdef LINEAR_DEPTH\\n varying vec4 vViewPosition;\\n\\tuniform float near;\\n\\tuniform float far;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\n\\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t// #include \\n\\t#ifdef USE_ALPHATEST\\n\\t\\tif ( diffuseColor.a < alphaTest ) discard;\\n\\t\\t/** This is a workaround for rejecting shadows for certain materials, since three.js gave me no choice*/\\n\\t\\t#ifdef ALPHATEST_REJECTION\\n\\t\\t\\tif (alphaTest > 0. ) discard;\\n\\t\\t#endif\\n\\t#endif\\n\\t#include \\n\\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\\n\\t#ifdef LINEAR_DEPTH\\n\\t\\t/** View z is negative moving away from the camera */\\n\\t\\tgl_FragColor = packDepthToRGBA((vViewPosition.z + near) / (near - far));\\n\\t#else\\n\\t\\tfloat fragCoordZ = (0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5);\\n\\t\\t#if DEPTH_PACKING == 3200\\n\\t\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t\\t#elif DEPTH_PACKING == 3201\\n\\t\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t\\t#endif\\n\\t#endif\\n}\\n\"}get baseUniforms(){return V.depth.uniforms}get uniformsDef(){return{uViewer_high:new t,uViewer_low:new t,rteModelViewMatrix:new s,near:0,far:0,uTransforms:[new s],tTransforms:null,objCount:1}}constructor(e,t=[]){super(e),this.init(t)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}onBeforeRender(e,t,r,n,i,l){en.matBuff.copy(r.matrixWorldInverse),en.matBuff.elements[12]=0,en.matBuff.elements[13]=0,en.matBuff.elements[14]=0,i.modelViewMatrix.copy(en.matBuff),en.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),Pt.DoubleToHighLowVector(en.vecBuff0,en.vecBuff1,en.vecBuff2),this.userData.uViewer_low.value.copy(en.vecBuff1),this.userData.uViewer_high.value.copy(en.vecBuff2),this.userData.rteModelViewMatrix.value.copy(i.modelViewMatrix),i instanceof kr&&i.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}en.matBuff=new s,en.vecBuff0=new t,en.vecBuff1=new t,en.vecBuff2=new t;class tn extends ge{constructor(){super(),this.frameIndex=0,this.materialCopy=new g({defines:{ACCUMULATE:0},uniforms:{tDiffuse:{value:null},tDiffuseInterp:{value:null},frameIndex:{value:0}},vertexShader:\"\\n\\t\\tvarying vec2 vUv;\\n\\t\\tvoid main() {\\n\\t\\t\\tvUv = uv;\\n\\t\\t\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n\\t\\t}\",fragmentShader:\"\\n\\t\\tuniform float opacity;\\n\\t\\tuniform sampler2D tDiffuse;\\n uniform sampler2D tDiffuseInterp;\\n\\t\\tvarying vec2 vUv;\\n #if ACCUMULATE == 1\\n uniform float frameIndex;\\n #endif\\n\\n\\t\\tvoid main() {\\n vec3 currentSample = texture2D( tDiffuse, vUv ).rgb;\\n \\n #if ACCUMULATE == 1\\n vec3 interpSample = texture2D( tDiffuseInterp, vUv ).rgb;\\n\\t\\t\\t gl_FragColor.rgb = mix(interpSample, currentSample, frameIndex/float(NUM_FRAMES));\\n #else\\n gl_FragColor.rgb = currentSample;\\n #endif\\n\\t\\t\\tgl_FragColor.a = 1.;\\n\\t\\t}\",blending:C}),this.materialCopy.transparent=!0,this.materialCopy.depthTest=!1,this.materialCopy.depthWrite=!1,this.materialCopy.blending=H,this.materialCopy.blendSrc=Q,this.materialCopy.blendDst=A,this.materialCopy.blendEquation=B,this.materialCopy.blendSrcAlpha=_,this.materialCopy.blendDstAlpha=A,this.materialCopy.blendEquationAlpha=B,this.materialCopy.needsUpdate=!0,this.fsQuad=new Ce(this.materialCopy)}setTexture(e,t){this.materialCopy.uniforms[e].value=t,this.materialCopy.needsUpdate=!0}get displayName(){return\"APPLYSAO\"}get outputTexture(){return null}setParams(e){}setFrameIndex(e){this.frameIndex=e}setRenderType(e){e===bn.NORMAL?this.materialCopy.defines.ACCUMULATE=0:(this.materialCopy.defines.ACCUMULATE=1,this.frameIndex=0),this.materialCopy.needsUpdate=!0}update(e,t){this.materialCopy.defines.NUM_FRAMES=Un.ACCUMULATE_FRAMES,this.materialCopy.uniforms.frameIndex.value=this.frameIndex,this.materialCopy.needsUpdate=!0}render(e,t,r){e.setRenderTarget(null);const n=e.autoClear;e.autoClear=!1,this.fsQuad.render(e),e.autoClear=n}}class rn extends ge{constructor(){super(),this.materialCopy=new g({defines:{INPUT_TYPE:0},uniforms:h.clone(He.uniforms),vertexShader:\"\\n varying vec2 vUv;\\n void main() {\\n vUv = uv;\\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n }\",fragmentShader:\"\\n uniform float opacity;\\n uniform sampler2D tDiffuse;\\n varying vec2 vUv;\\n\\n const float UnpackDownscale = 255. / 256.;\\n const vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\n const vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\n\\n float unpackRGBAToDepth( const in vec4 v ) {\\n return dot( v, UnpackFactors );\\n }\\n\\n vec3 unpackRGBToNormal( const in vec3 rgb ) {\\n return 2.0 * rgb.xyz - 1.0;\\n }\\n\\n void main() {\\n vec4 inSample = texture2D( tDiffuse, vUv );\\n vec3 outSample = inSample.rgb;\\n #if OUTPUT_TYPE == 1\\n outSample.rgb = vec3(unpackRGBAToDepth(inSample));\\n #endif\\n // #if OUTPUT_TYPE == 3\\n // outSample.rgb = unpackRGBToNormal(inSample.rgb);\\n // #endif\\n\\n gl_FragColor.rgb = outSample;\\n gl_FragColor.a = 1.;\\n }\",blending:C}),this.materialCopy.needsUpdate=!0,this.fsQuad=new Ce(this.materialCopy)}setOutputType(e){this.materialCopy.defines.OUTPUT_TYPE=e,this.materialCopy.needsUpdate=!0}setTexture(e,t){this.materialCopy.uniforms[e].value=t,this.materialCopy.needsUpdate=!0}get displayName(){return\"COPY-OUTPUT\"}get outputTexture(){return null}render(e,t,r){e.setRenderTarget(null);const n=e.autoClear;e.autoClear=!1,this.fsQuad.render(e),e.autoClear=n}}class nn extends ge{get enabledLayers(){return this._enabledLayers}constructor(){super(),this.layers=null,this._enabledLayers=[]}get displayName(){return\"BASE\"}get outputTexture(){return null}setLayers(e){this.layers=e,this._enabledLayers=e.slice()}enableLayer(e,t){this._enabledLayers.includes(e)?t||this._enabledLayers.splice(this._enabledLayers.indexOf(e),1):t&&this._enabledLayers.push(e)}applyLayers(e){null!==this.layers?(e.layers.disableAll(),this.layers.forEach((t=>{this._enabledLayers.includes(t)&&e.layers.enable(t)}))):e.layers.enableAll()}}var ln,an;!function(e){e[e.PERSPECTIVE_DEPTH=0]=\"PERSPECTIVE_DEPTH\",e[e.LINEAR_DEPTH=1]=\"LINEAR_DEPTH\"}(ln||(ln={})),function(e){e[e.FULL=0]=\"FULL\",e[e.HALF=1]=\"HALF\"}(an||(an={}));class sn extends nn{get displayName(){return\"DEPTH\"}get material(){return this.depthMaterial}get outputTexture(){return this.renderTarget.texture}get outputTextureHalf(){return this.renderTargetHalf.texture}set depthType(e){e===ln.LINEAR_DEPTH?this.depthMaterial.defines.LINEAR_DEPTH=\" \":delete this.depthMaterial.defines.LINEAR_DEPTH,this.depthMaterial.needsUpdate=!0}set depthSize(e){this.depthBufferSize=e}set depthSide(e){this.depthMaterial.side=e}constructor(){super(),this.depthMaterial=null,this.depthBufferSize=an.FULL,this.colorBuffer=new x,this.onBeforeRender=null,this.onAfterRender=null,this.renderTarget=new $(256,256,{minFilter:W,magFilter:W}),this.renderTargetHalf=new $(256,256,{minFilter:W,magFilter:W}),this.renderTarget.depthBuffer=!0,this.renderTarget.stencilBuffer=!0,this.renderTargetHalf.depthBuffer=!0,this.renderTargetHalf.stencilBuffer=!0,this.depthMaterial=new en({depthPacking:ee},[\"USE_RTE\",\"ALPHATEST_REJECTION\"]),this.depthMaterial.blending=C,this.depthMaterial.side=R}setClippingPlanes(e){this.depthMaterial.clippingPlanes=e}update(e,t){this.camera=t,this.scene=e,this.depthMaterial.userData.near.value=t.near,this.depthMaterial.userData.far.value=t.far,this.depthMaterial.needsUpdate=!0}render(e,t,r){this.onBeforeRender(),e.getClearColor(this.colorBuffer);const n=e.getClearAlpha(),i=e.autoClear;e.setRenderTarget(this.depthBufferSize===an.FULL?this.renderTarget:this.renderTargetHalf),e.autoClear=!1,e.setClearColor(0),e.setClearAlpha(1),e.clear();const l=e.shadowMap.enabled,a=e.shadowMap.needsUpdate;e.shadowMap.enabled=!1,e.shadowMap.needsUpdate=!1,this.applyLayers(this.camera),e.render(this.scene,this.camera),e.shadowMap.enabled=l,e.shadowMap.needsUpdate=a,this.scene.overrideMaterial=null,e.autoClear=i,e.setClearColor(this.colorBuffer),e.setClearAlpha(n),this.onAfterRender()}setSize(e,t){this.renderTarget.setSize(e,t),this.renderTargetHalf.setSize(.5*e,.5*t)}}class un extends Ct{get vertexShader(){return\"\\n#define NORMAL\\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n //#include // EDITED CHUNK\\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n\\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n\\n mvPosition = modelViewMatrix * mvPosition;\\n\\n gl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\t vViewPosition = - mvPosition.xyz;\\n #endif\\n}\\n\"}get fragmentShader(){return\"\\n#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\\n\"}get baseUniforms(){return V.normal.uniforms}get uniformsDef(){return{uViewer_high:new t,uViewer_low:new t,uTransforms:[new s],tTransforms:null}}constructor(e,t=[]){super(e),this.init(t)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}onBeforeRender(e,t,r,n,i,l){un.matBuff.copy(r.matrixWorldInverse),un.matBuff.elements[12]=0,un.matBuff.elements[13]=0,un.matBuff.elements[14]=0,i.modelViewMatrix.copy(un.matBuff),un.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),Pt.DoubleToHighLowVector(un.vecBuff0,un.vecBuff1,un.vecBuff2),this.userData.uViewer_low.value.copy(un.vecBuff1),this.userData.uViewer_high.value.copy(un.vecBuff2),i instanceof kr&&i.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}un.matBuff=new s,un.vecBuff0=new t,un.vecBuff1=new t,un.vecBuff2=new t;class dn extends nn{get displayName(){return\"GEOMETRY-NORMALS\"}get outputTexture(){return this.renderTarget.texture}get material(){return this.normalsMaterial}constructor(){super(),this.normalsMaterial=null,this.colorBuffer=new x,this.onBeforeRender=null,this.onAfterRender=null,this.renderTarget=new $(256,256),this.renderTarget.depthBuffer=!0,this.renderTarget.stencilBuffer=!0,this.normalsMaterial=new un({},[\"USE_RTE\"]),this.normalsMaterial.blending=C,this.normalsMaterial.side=R}setClippingPlanes(e){this.normalsMaterial.clippingPlanes=e}update(e,t){this.camera=t,this.scene=e}render(e,t,r){this.onBeforeRender(),e.getClearColor(this.colorBuffer);const n=e.getClearAlpha(),i=e.autoClear;e.setRenderTarget(this.renderTarget),e.autoClear=!1,e.setClearColor(0),e.setClearAlpha(1),e.clear();const l=e.shadowMap.enabled,a=e.shadowMap.needsUpdate;e.shadowMap.enabled=!1,e.shadowMap.needsUpdate=!1,this.applyLayers(this.camera),e.render(this.scene,this.camera),e.shadowMap.enabled=l,e.shadowMap.needsUpdate=a,this.scene.overrideMaterial=null,e.autoClear=i,e.setClearColor(this.colorBuffer),e.setClearAlpha(n),this.onAfterRender()}setSize(e,t){this.renderTarget.setSize(e,t)}}var pn,on;!function(e){e[e.DEFAULT=0]=\"DEFAULT\",e[e.IMPROVED=1]=\"IMPROVED\",e[e.ACCURATE=2]=\"ACCURATE\"}(pn||(pn={})),function(e){e[e.RECONSTRUCTED_NORMALS=0]=\"RECONSTRUCTED_NORMALS\",e[e.AO=1]=\"AO\",e[e.AO_BLURRED=2]=\"AO_BLURRED\"}(on||(on={}));const cn={intensity:1.5,scale:0,kernelRadius:5,bias:.2,normalsType:pn.ACCURATE,blurEnabled:!0,blurRadius:2,blurStdDev:4,blurDepthCutoff:.007};class vn extends ge{get displayName(){return\"SAO\"}get outputTexture(){return this.saoRenderTarget.texture}constructor(){super(),this.params=cn,this.colorBuffer=new x,this.saoMaterial=null,this.vBlurMaterial=null,this.hBlurMaterial=null,this.saoRenderTarget=null,this.blurIntermediateRenderTarget=null,this.fsQuad=null,this._outputType=on.AO_BLURRED,this.outputScale=.5,this.saoRenderTarget=new $(256,256),this.blurIntermediateRenderTarget=new $(256,256),this.saoMaterial=new g({defines:{NUM_SAMPLES:7,NUM_RINGS:4,NORMAL_TEXTURE:0,DIFFUSE_TEXTURE:0,DEPTH_PACKING:1,PERSPECTIVE_CAMERA:1},fragmentShader:\"\\n\\t\\t#include \\n\\t\\tvarying vec2 vUv;\\n\\t\\t#if DIFFUSE_TEXTURE == 1\\n\\t\\tuniform sampler2D tDiffuse;\\n\\t\\t#endif\\n\\t\\tuniform sampler2D tDepth;\\n\\t\\t#if NORMAL_TEXTURE == 1\\n\\t\\tuniform sampler2D tNormal;\\n\\t\\t#endif\\n\\t\\tuniform float cameraNear;\\n\\t\\tuniform float cameraFar;\\n\\t\\tuniform mat4 cameraProjectionMatrix;\\n\\t\\tuniform mat4 cameraInverseProjectionMatrix;\\n\\t\\tuniform float scale;\\n\\t\\tuniform float intensity;\\n\\t\\tuniform float bias;\\n\\t\\tuniform float kernelRadius;\\n\\t\\tuniform float minResolution;\\n\\t\\tuniform vec2 size;\\n\\t\\tuniform float randomSeed;\\n\\t\\t// RGBA depth\\n\\t\\t#include \\n\\t\\tvec4 getDefaultColor( const in vec2 screenPosition ) {\\n\\t\\t\\t#if DIFFUSE_TEXTURE == 1\\n\\t\\t\\treturn texture2D( tDiffuse, vUv );\\n\\t\\t\\t#else\\n\\t\\t\\treturn vec4( 1.0 );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\tfloat getDepth( const in vec2 screenPosition ) {\\n\\t\\t\\t#if DEPTH_PACKING == 1\\n\\t\\t\\treturn unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );\\n\\t\\t\\t#else\\n\\t\\t\\treturn texture2D( tDepth, screenPosition ).x;\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\tfloat getViewZ( const in float depth ) {\\n\\t\\t\\t#if PERSPECTIVE_CAMERA == 1\\n\\t\\t\\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\\n\\t\\t\\t#else\\n\\t\\t\\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\tvec3 getViewPosition( const in vec2 screenPosition, const in float depth, const in float viewZ ) {\\n\\t\\t\\tfloat clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];\\n\\t\\t\\tvec4 clipPosition = vec4( ( vec3( screenPosition, depth ) - 0.5 ) * 2.0, 1.0 );\\n\\t\\t\\tclipPosition *= clipW; // unprojection.\\n\\t\\t\\treturn ( cameraInverseProjectionMatrix * clipPosition ).xyz;\\n\\t\\t}\\n\\n\\t\\t//https://wickedengine.net/2019/09/22/improved-normal-reconstruction-from-depth/\\n\\t\\tvec3 viewNormalImproved(in vec2 uv, in vec3 origin)\\n\\t\\t{\\t\\n\\t\\t\\thighp vec2 dd = abs(vec2(1./size.x, 1./size.y));\\n\\t\\t\\thighp vec2 ddx = vec2(dd.x, 0.);\\n\\t\\t\\thighp vec2 ddy = vec2(0., dd.y);\\n\\n\\t\\t\\tfloat sampleDepth = getDepth( uv - ddy );\\n\\t\\t\\tfloat sampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 top = getViewPosition( uv - ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getDepth( uv + ddy );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 bottom = getViewPosition( uv + ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\thighp vec3 center = origin;\\n\\t\\t\\t\\n\\t\\t\\tsampleDepth = getDepth( uv - ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 left = getViewPosition( uv - ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getDepth( uv + ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 right = getViewPosition( uv + ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\t // get the difference between the current and each offset position\\n\\t\\t\\tvec3 l = center - left;\\n\\t\\t\\tvec3 r = right - center;\\n\\t\\t\\tvec3 d = center - top;\\n\\t\\t\\tvec3 u = bottom - center;\\n\\n\\t\\t\\t// pick horizontal and vertical diff with the smallest z difference\\n\\t\\t\\tvec3 hDeriv = abs(l.z) < abs(r.z) ? l : r;\\n\\t\\t\\tvec3 vDeriv = abs(d.z) < abs(u.z) ? d : u;\\n\\n\\t\\t\\t// get view space normal from the cross product of the two smallest offsets\\n\\t\\t\\tvec3 viewNormal = normalize(cross(hDeriv, vDeriv));\\n\\n\\t\\t\\treturn viewNormal;\\n\\t\\t}\\n\\n\\t\\tvec3 viewNormalAccurate(in vec2 uv, in vec3 origin, in float centerDepth) {\\n\\t\\t\\thighp vec2 dd = abs(vec2(1./size.x, 1./size.y));\\n\\t\\t\\thighp vec2 ddx = vec2(dd.x, 0.);\\n\\t\\t\\thighp vec2 ddy = vec2(0., dd.y);\\n\\n\\t\\t\\tfloat sampleDepth = getDepth( uv - ddy );\\n\\t\\t\\tfloat sampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 top = getViewPosition( uv - ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getDepth( uv + ddy );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 bottom = getViewPosition( uv + ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\thighp vec3 center = origin;\\n\\t\\t\\t\\n\\t\\t\\tsampleDepth = getDepth( uv - ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 left = getViewPosition( uv - ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getDepth( uv + ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 right = getViewPosition( uv + ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\t // get the difference between the current and each offset position\\n\\t\\t\\tvec3 l = center - left;\\n\\t\\t\\tvec3 r = right - center;\\n\\t\\t\\tvec3 d = center - top;\\n\\t\\t\\tvec3 u = bottom - center;\\n\\n\\t\\t\\t// get depth values at 1 & 2 pixels offsets from current along the horizontal axis\\n\\t\\t\\tvec4 H = vec4(\\n\\t\\t\\t\\tgetDepth(uv - ddx),\\n\\t\\t\\t\\tgetDepth(uv + ddx),\\n\\t\\t\\t\\tgetDepth(uv - 2. * ddx),\\n\\t\\t\\t\\tgetDepth(uv + 2. * ddx)\\n\\t\\t\\t);\\n\\n\\t\\t\\t// get depth values at 1 & 2 pixels offsets from current along the vertical axis\\n\\t\\t\\tvec4 V = vec4(\\n\\t\\t\\t\\tgetDepth(uv - ddy),\\n\\t\\t\\t\\tgetDepth(uv + ddy),\\n\\t\\t\\t\\tgetDepth(uv - 2. * ddy),\\n\\t\\t\\t\\tgetDepth(uv + 2. * ddy)\\n\\t\\t\\t);\\n\\n\\t\\t\\t// current pixel's depth difference from slope of offset depth samples\\n\\t\\t\\t// differs from original article because we're using non-linear depth values\\n\\t\\t\\t// see article's comments\\n\\t\\t\\tvec2 he = abs((2. * H.xy - H.zw) - centerDepth);\\n\\t\\t\\tvec2 ve = abs((2. * V.xy - V.zw) - centerDepth);\\n\\n\\t\\t\\t// pick horizontal and vertical diff with the smallest depth difference from slopes\\n\\t\\t\\tvec3 hDeriv = he.x < he.y ? l : r;\\n\\t\\t\\tvec3 vDeriv = ve.x < ve.y ? d : u;\\n\\n\\t\\t\\t// get view space normal from the cross product of the best derivatives\\n\\t\\t\\tvec3 viewNormal = normalize(cross(hDeriv, vDeriv));\\n\\n\\t\\t\\treturn viewNormal;\\n\\n\\t\\t}\\n\\n\\t\\tvec3 getViewNormal( const in vec3 viewPosition, const in vec2 screenPosition, in float centerDepth ) {\\n\\t\\t\\t#if NORMAL_TEXTURE == 1\\n\\t\\t\\t\\treturn unpackRGBToNormal( texture2D( tNormal, screenPosition ).xyz );\\n\\t\\t\\t#elif IMPROVED_NORMAL_RECONSTRUCTION == 1\\n\\t\\t\\t\\treturn viewNormalImproved(screenPosition, viewPosition);\\n\\t\\t\\t#elif ACCURATE_NORMAL_RECONSTRUCTION == 1\\n\\t\\t\\t\\treturn viewNormalAccurate(screenPosition, viewPosition, centerDepth);\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn normalize( cross( dFdx( viewPosition ), dFdy( viewPosition ) ) );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\n\\t\\tfloat scaleDividedByCameraFar;\\n\\t\\tfloat minResolutionMultipliedByCameraFar;\\n\\t\\tfloat getOcclusion( const in vec3 centerViewPosition, const in vec3 centerViewNormal, const in vec3 sampleViewPosition ) {\\n\\t\\t\\tvec3 viewDelta = sampleViewPosition - centerViewPosition;\\n\\t\\t\\tfloat viewDistance = length( viewDelta );\\n\\t\\t\\tfloat scaledScreenDistance = scaleDividedByCameraFar * viewDistance;\\n\\t\\t\\treturn max(0.0, (dot(centerViewNormal, viewDelta) - minResolutionMultipliedByCameraFar) / scaledScreenDistance - bias) / (1.0 + pow2( scaledScreenDistance ) );\\n\\t\\t}\\n\\t\\t// moving costly divides into consts\\n\\t\\tconst float ANGLE_STEP = PI2 * float( NUM_RINGS ) / float( NUM_SAMPLES );\\n\\t\\tconst float INV_NUM_SAMPLES = 1.0 / float( NUM_SAMPLES );\\n\\t\\tfloat getAmbientOcclusion( const in vec3 centerViewPosition, in float centerDepth ) {\\n\\t\\t\\t// precompute some variables require in getOcclusion.\\n\\t\\t\\tscaleDividedByCameraFar = scale / cameraFar;\\n\\t\\t\\tminResolutionMultipliedByCameraFar = minResolution * cameraFar;\\n\\t\\t\\tvec3 centerViewNormal = getViewNormal( centerViewPosition, vUv, centerDepth );\\n\\t\\t\\t// jsfiddle that shows sample pattern: https://jsfiddle.net/a16ff1p7/\\n\\t\\t\\tfloat angle = rand( vUv + randomSeed ) * PI2;\\n\\t\\t\\tvec2 radius = vec2( kernelRadius * INV_NUM_SAMPLES ) / size;\\n\\t\\t\\tvec2 radiusStep = radius;\\n\\t\\t\\tfloat occlusionSum = 0.0;\\n\\t\\t\\tfloat weightSum = 0.0;\\n\\t\\t\\tfor( int i = 0; i < NUM_SAMPLES; i ++ ) {\\n\\t\\t\\t\\tvec2 sampleUv = vUv + vec2( cos( angle ), sin( angle ) ) * radius;\\n\\t\\t\\t\\tradius += radiusStep;\\n\\t\\t\\t\\tangle += ANGLE_STEP;\\n\\t\\t\\t\\tfloat sampleDepth = getDepth( sampleUv );\\n\\t\\t\\t\\tif( sampleDepth >= ( 1.0 - EPSILON ) ) {\\n\\t\\t\\t\\t\\tcontinue;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tfloat sampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\t\\tvec3 sampleViewPosition = getViewPosition( sampleUv, sampleDepth, sampleViewZ );\\n\\t\\t\\t\\tocclusionSum += getOcclusion( centerViewPosition, centerViewNormal, sampleViewPosition );\\n\\t\\t\\t\\tweightSum += 1.0;\\n\\t\\t\\t}\\n\\t\\t\\tif( weightSum == 0.0 ) discard;\\n\\t\\t\\treturn occlusionSum * ( intensity / weightSum );\\n\\t\\t}\\n\\t\\tvoid main() {\\n\\t\\t\\tfloat centerDepth = getDepth( vUv );\\n\\t\\t\\tif( centerDepth >= ( 1.0 - EPSILON ) ) {\\n\\t\\t\\t\\tdiscard;\\n\\t\\t\\t}\\n\\t\\t\\tfloat centerViewZ = getViewZ( centerDepth );\\n\\t\\t\\tvec3 viewPosition = getViewPosition( vUv, centerDepth, centerViewZ );\\n\\n\\t\\t\\t#ifdef OUTPUT_RECONSTRUCTED_NORMALS\\n\\t\\t\\t\\tvec3 normal;\\n\\t\\t\\t\\t#if IMPROVED_NORMAL_RECONSTRUCTION == 1\\n\\t\\t\\t\\t\\tnormal = viewNormalImproved(vUv, viewPosition);\\n\\t\\t\\t\\t#elif ACCURATE_NORMAL_RECONSTRUCTION == 1\\n\\t\\t\\t\\t\\tnormal = viewNormalAccurate(vUv, viewPosition, centerDepth);\\n\\t\\t\\t\\t#else\\n\\t\\t\\t\\t\\tnormal = normalize( cross( dFdx( viewPosition ), dFdy( viewPosition ) ) );\\n\\t\\t\\t\\t#endif\\n\\t\\t\\t\\tgl_FragColor.rgb = packNormalToRGB(normal);\\n\\t\\t\\t\\tgl_FragColor.a = 1.;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t#endif\\n\\t\\t\\t\\n\\t\\t\\tfloat ambientOcclusion = getAmbientOcclusion( viewPosition, centerDepth );\\n\\t\\t\\tgl_FragColor = getDefaultColor( vUv );\\n\\t\\t\\tgl_FragColor.xyz *= 1. - ambientOcclusion;\\n\\t\\t}\",vertexShader:\"\\n\\t\\tvarying vec2 vUv;\\n\\t\\tvoid main() {\\n\\t\\t\\tvUv = uv;\\n\\t\\t\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n\\t\\t}\",uniforms:h.clone(Qe.uniforms)}),this.saoMaterial.extensions.derivatives=!0,this.saoMaterial.defines.DEPTH_PACKING=1,this.saoMaterial.uniforms.tDepth.value=null,this.saoMaterial.uniforms.tNormal.value=null,this.saoMaterial.uniforms.size.value.set(256,256),this.saoMaterial.uniforms.minResolution.value=0,this.saoMaterial.blending=C,this.vBlurMaterial=new g({uniforms:h.clone(Ae.uniforms),defines:Object.assign({},Ae.defines),vertexShader:Ae.vertexShader,fragmentShader:Ae.fragmentShader}),this.vBlurMaterial.defines.DEPTH_PACKING=1,this.vBlurMaterial.uniforms.tDiffuse.value=this.saoRenderTarget.texture,this.vBlurMaterial.uniforms.tDepth.value=null,this.vBlurMaterial.uniforms.size.value.set(256,256),this.vBlurMaterial.blending=C,this.hBlurMaterial=new g({uniforms:h.clone(Ae.uniforms),defines:Object.assign({},Ae.defines),vertexShader:Ae.vertexShader,fragmentShader:Ae.fragmentShader}),this.hBlurMaterial.defines.DEPTH_PACKING=1,this.hBlurMaterial.uniforms.tDiffuse.value=this.blurIntermediateRenderTarget.texture,this.hBlurMaterial.uniforms.tDepth.value=null,this.hBlurMaterial.uniforms.size.value.set(256,256),this.hBlurMaterial.blending=C,this.fsQuad=new Ce(this.saoMaterial)}setParams(e){Object.assign(this.params,e)}setOutputType(e){this._outputType=e}setTexture(e,t){\"tDepth\"===e&&(this.saoMaterial.uniforms.tDepth.value=t,this.vBlurMaterial.uniforms.tDepth.value=t,this.hBlurMaterial.uniforms.tDepth.value=t),\"tNormal\"===e&&(this.saoMaterial.uniforms.tNormal.value=t),this.saoMaterial.needsUpdate=!0,this.vBlurMaterial.needsUpdate=!0,this.hBlurMaterial.needsUpdate=!0}update(e,t){this._outputType===on.RECONSTRUCTED_NORMALS?this.saoMaterial.defines.OUTPUT_RECONSTRUCTED_NORMALS=\"\":delete this.saoMaterial.defines.OUTPUT_RECONSTRUCTED_NORMALS,this.params.scale=t.far,this.saoMaterial.defines.PERSPECTIVE_CAMERA=t.isPerspectiveCamera?1:0,this.saoMaterial.defines.NORMAL_TEXTURE=this.params.normalsType===pn.DEFAULT?1:0,this.saoMaterial.defines.IMPROVED_NORMAL_RECONSTRUCTION=this.params.normalsType===pn.IMPROVED?1:0,this.saoMaterial.defines.ACCURATE_NORMAL_RECONSTRUCTION=this.params.normalsType===pn.ACCURATE?1:0,this.saoMaterial.uniforms.cameraNear.value=t.near,this.saoMaterial.uniforms.cameraFar.value=t.far,this.saoMaterial.uniforms.cameraInverseProjectionMatrix.value.copy(t.projectionMatrixInverse),this.saoMaterial.uniforms.cameraProjectionMatrix.value=t.projectionMatrix,this.saoMaterial.uniforms.intensity.value=this.params.intensity,this.saoMaterial.uniforms.scale.value=this.params.scale,this.saoMaterial.uniforms.kernelRadius.value=this.params.kernelRadius,this.saoMaterial.uniforms.bias.value=this.params.bias,this.saoMaterial.needsUpdate=!0,this.vBlurMaterial.defines.PERSPECTIVE_CAMERA=t.isPerspectiveCamera?1:0,this.hBlurMaterial.defines.PERSPECTIVE_CAMERA=t.isPerspectiveCamera?1:0,this.vBlurMaterial.uniforms.cameraNear.value=t.near,this.vBlurMaterial.uniforms.cameraFar.value=t.far,this.hBlurMaterial.uniforms.cameraNear.value=t.near,this.hBlurMaterial.uniforms.cameraFar.value=t.far;const r=this.params.blurDepthCutoff*(t.far-t.near);this.vBlurMaterial.uniforms.depthCutoff.value=r,this.hBlurMaterial.uniforms.depthCutoff.value=r,this.params.blurRadius=Math.floor(this.params.blurRadius),this.prevStdDev===this.params.blurStdDev&&this.prevNumSamples===this.params.blurRadius||(Be.configure(this.vBlurMaterial,this.params.blurRadius,this.params.blurStdDev,new y(0,1)),Be.configure(this.hBlurMaterial,this.params.blurRadius,this.params.blurStdDev,new y(1,0)),this.prevStdDev=this.params.blurStdDev,this.prevNumSamples=this.params.blurRadius),this.vBlurMaterial.needsUpdate=!0,this.hBlurMaterial.needsUpdate=!0}render(e){e.getClearColor(this.colorBuffer);const t=e.getClearAlpha(),r=e.autoClear;e.setRenderTarget(this.saoRenderTarget),e.autoClear=!1,e.setClearColor(16777215),e.setClearAlpha(1),e.clear(),this.fsQuad.material=this.saoMaterial,this.fsQuad.render(e),this.params.blurEnabled&&this._outputType===on.AO_BLURRED&&(e.setRenderTarget(this.blurIntermediateRenderTarget),e.setClearColor(16777215),e.setClearAlpha(1),e.clear(),this.fsQuad.material=this.vBlurMaterial,this.fsQuad.render(e),e.setRenderTarget(this.saoRenderTarget),this.fsQuad.material=this.hBlurMaterial,this.fsQuad.render(e)),e.autoClear=r,e.setClearColor(this.colorBuffer),e.setClearAlpha(t)}setSize(e,t){const r=e*this.outputScale,n=t*this.outputScale;this.saoRenderTarget.setSize(r,n),this.blurIntermediateRenderTarget.setSize(r,n),this.saoMaterial.uniforms.size.value.set(r,n),this.vBlurMaterial.uniforms.size.value.set(r,n),this.hBlurMaterial.uniforms.size.value.set(r,n),this.saoMaterial.needsUpdate=!0}}const fn={intensity:1,kernelRadius:30,kernelSize:16,bias:.01,minDistance:0,maxDistance:.008};class Sn extends ge{setTexture(e,t){\"tDepth\"===e&&(this.aoMaterial.uniforms.tDepth.value=t),\"tNormal\"===e&&(this.aoMaterial.uniforms.tNormal.value=t),this.aoMaterial.needsUpdate=!0}get outputTexture(){return this._accumulationBuffer.texture}get displayName(){return\"STATIC-AO\"}constructor(){super(),this.aoMaterial=null,this.accumulateMaterial=null,this.params=fn,this.frameIndex=0,this.kernels=[],this.noiseTextures=[],this._generationBuffer=new $(256,256),this._accumulationBuffer=new $(256,256),this.aoMaterial=new g({fragmentShader:\"\\n\\t\\t#include \\n\\t\\tvarying vec2 vUv;\\n\\t\\tuniform sampler2D tDepth;\\n\\t\\tuniform sampler2D tNormal;\\n uniform vec2 size;\\n\\n\\t\\tuniform float cameraNear;\\n\\t\\tuniform float cameraFar;\\n\\t\\tuniform mat4 cameraProjectionMatrix;\\n\\t\\tuniform mat4 cameraInverseProjectionMatrix;\\n\\n\\t\\tuniform float scale;\\n\\t\\tuniform float intensity;\\n\\t\\tuniform float bias;\\n\\t\\tuniform float kernelRadius;\\n\\t\\tuniform float minResolution;\\n uniform float frameIndex;\\n\\t\\tuniform float tanFov;\\n\\n\\t\\t#define AO_ESTIMATOR 1\\n\\t\\t// #define KERNEL_SIZE 16\\n\\t\\tuniform sampler2D tNoise;\\n\\t\\tuniform vec3 kernel[ KERNEL_SIZE ];\\n\\t\\tuniform float minDistance;\\n\\t\\tuniform float maxDistance;\\n\\n #define NUM_SAMPLES 16\\n #define SPIRAL_TURNS 2\\n\\t\\t\\n // #define NUM_FRAMES 16\\n\\n\\t\\t#define NORMAL_TEXTURE 0\\n\\t\\t#define IMPROVED_NORMAL_RECONSTRUCTION 0\\n\\t\\t#define ACCURATE_NORMAL_RECONSTRUCTION 1\\n\\t\\t\\n\\t\\t// RGBA depth\\n\\t\\t#include \\n\\t\\tvec4 getDefaultColor( const in vec2 screenPosition ) {\\n\\t\\t\\treturn vec4( 1.0 );\\n\\t\\t}\\n\\n\\n\\t\\tfloat getLinearDepth( const in vec2 screenPosition ) {\\n\\t\\t\\treturn unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );\\n\\t\\t}\\n\\n\\t\\tfloat getPerspectiveDepth(const in vec2 coords) {\\n\\t\\t\\tfloat linearDepth = unpackRGBAToDepth( texture2D( tDepth, coords ) );\\n\\t\\t\\t#if PERSPECTIVE_CAMERA == 1\\n\\t\\t\\t\\tfloat viewZ = orthographicDepthToViewZ(linearDepth, cameraNear, cameraFar);\\n\\t\\t\\t\\tfloat centerDepth = viewZToPerspectiveDepth(viewZ, cameraNear, cameraFar);\\n\\t\\t\\t\\treturn centerDepth;\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn linearDepth;\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\n\\t\\tfloat getViewDepth(const in float linearDepth) {\\n\\t\\t\\treturn orthographicDepthToViewZ(linearDepth, cameraNear, cameraFar);\\n\\t\\t}\\n\\n\\t\\tfloat getViewZ( const in float depth ) {\\n\\t\\t\\t#if PERSPECTIVE_CAMERA == 1\\n\\t\\t\\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\\n\\t\\t\\t#else\\n\\t\\t\\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\n\\t\\tvec3 getViewPosition( const in vec2 screenPosition, const in float depth, const in float viewZ ) {\\n\\t\\t\\tfloat clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];\\n\\t\\t\\tvec4 clipPosition = vec4( ( vec3( screenPosition, depth ) - 0.5 ) * 2.0, 1.0 );\\n\\t\\t\\tclipPosition *= clipW; // unprojection.\\n\\t\\t\\treturn ( cameraInverseProjectionMatrix * clipPosition ).xyz;\\n\\t\\t}\\n\\n\\t\\t//https://wickedengine.net/2019/09/22/improved-normal-reconstruction-from-depth/\\n\\t\\tvec3 viewNormalImproved(in vec2 uv, in vec3 origin)\\n\\t\\t{\\t\\n\\t\\t\\thighp vec2 dd = abs(vec2(1./size.x, 1./size.y));\\n\\t\\t\\thighp vec2 ddx = vec2(dd.x, 0.);\\n\\t\\t\\thighp vec2 ddy = vec2(0., dd.y);\\n\\n\\t\\t\\tfloat sampleDepth = getPerspectiveDepth( uv - ddy );\\n\\t\\t\\tfloat sampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 top = getViewPosition( uv - ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getPerspectiveDepth( uv + ddy );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 bottom = getViewPosition( uv + ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\thighp vec3 center = origin;\\n\\t\\t\\t\\n\\t\\t\\tsampleDepth = getPerspectiveDepth( uv - ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 left = getViewPosition( uv - ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getPerspectiveDepth( uv + ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 right = getViewPosition( uv + ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\t // get the difference between the current and each offset position\\n\\t\\t\\tvec3 l = center - left;\\n\\t\\t\\tvec3 r = right - center;\\n\\t\\t\\tvec3 d = center - top;\\n\\t\\t\\tvec3 u = bottom - center;\\n\\n\\t\\t\\t// pick horizontal and vertical diff with the smallest z difference\\n\\t\\t\\tvec3 hDeriv = abs(l.z) < abs(r.z) ? l : r;\\n\\t\\t\\tvec3 vDeriv = abs(d.z) < abs(u.z) ? d : u;\\n\\n\\t\\t\\t// get view space normal from the cross product of the two smallest offsets\\n\\t\\t\\tvec3 viewNormal = normalize(cross(hDeriv, vDeriv));\\n\\n\\t\\t\\treturn viewNormal;\\n\\t\\t}\\n\\n\\t\\tvec3 viewNormalAccurate(in vec2 uv, in vec3 origin, in float centerDepth) {\\n\\t\\t\\thighp vec2 dd = abs(vec2(1./size.x, 1./size.y));\\n\\t\\t\\thighp vec2 ddx = vec2(dd.x, 0.);\\n\\t\\t\\thighp vec2 ddy = vec2(0., dd.y);\\n\\n\\t\\t\\tfloat sampleDepth = getPerspectiveDepth( uv - ddy );\\n\\t\\t\\tfloat sampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 top = getViewPosition( uv - ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getPerspectiveDepth( uv + ddy );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 bottom = getViewPosition( uv + ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\thighp vec3 center = origin;\\n\\t\\t\\t\\n\\t\\t\\tsampleDepth = getPerspectiveDepth( uv - ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 left = getViewPosition( uv - ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getPerspectiveDepth( uv + ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 right = getViewPosition( uv + ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\t // get the difference between the current and each offset position\\n\\t\\t\\tvec3 l = center - left;\\n\\t\\t\\tvec3 r = right - center;\\n\\t\\t\\tvec3 d = center - top;\\n\\t\\t\\tvec3 u = bottom - center;\\n\\n\\t\\t\\t// get depth values at 1 & 2 pixels offsets from current along the horizontal axis\\n\\t\\t\\tvec4 H = vec4(\\n\\t\\t\\t\\tgetLinearDepth(uv - ddx),\\n\\t\\t\\t\\tgetLinearDepth(uv + ddx),\\n\\t\\t\\t\\tgetLinearDepth(uv - 2. * ddx),\\n\\t\\t\\t\\tgetLinearDepth(uv + 2. * ddx)\\n\\t\\t\\t);\\n\\n\\t\\t\\t// get depth values at 1 & 2 pixels offsets from current along the vertical axis\\n\\t\\t\\tvec4 V = vec4(\\n\\t\\t\\t\\tgetLinearDepth(uv - ddy),\\n\\t\\t\\t\\tgetLinearDepth(uv + ddy),\\n\\t\\t\\t\\tgetLinearDepth(uv - 2. * ddy),\\n\\t\\t\\t\\tgetLinearDepth(uv + 2. * ddy)\\n\\t\\t\\t);\\n\\n\\t\\t\\t// current pixel's depth difference from slope of offset depth samples\\n\\t\\t\\t// differs from original article because we're using non-linear depth values\\n\\t\\t\\t// see article's comments\\n\\t\\t\\tvec2 he = abs((2. * H.xy - H.zw) - centerDepth);\\n\\t\\t\\tvec2 ve = abs((2. * V.xy - V.zw) - centerDepth);\\n\\n\\t\\t\\t// pick horizontal and vertical diff with the smallest depth difference from slopes\\n\\t\\t\\tvec3 hDeriv = he.x < he.y ? l : r;\\n\\t\\t\\tvec3 vDeriv = ve.x < ve.y ? d : u;\\n\\n\\t\\t\\t// get view space normal from the cross product of the best derivatives\\n\\t\\t\\tvec3 viewNormal = normalize(cross(hDeriv, vDeriv));\\n\\n\\t\\t\\treturn viewNormal;\\n\\n\\t\\t}\\n\\n\\t\\tvec3 getViewNormal( const in vec3 viewPosition, const in vec2 screenPosition, in float centerDepth ) {\\n\\t\\t\\t#if NORMAL_TEXTURE == 1\\n\\t\\t\\t\\treturn unpackRGBToNormal( texture2D( tNormal, screenPosition ).xyz );\\n\\t\\t\\t#elif IMPROVED_NORMAL_RECONSTRUCTION == 1\\n\\t\\t\\t\\treturn viewNormalImproved(screenPosition, viewPosition);\\n\\t\\t\\t#elif ACCURATE_NORMAL_RECONSTRUCTION == 1\\n\\t\\t\\t\\treturn viewNormalAccurate(screenPosition, viewPosition, centerDepth);\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn normalize( cross( dFdx( viewPosition ), dFdy( viewPosition ) ) );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\n\\n\\t\\tfloat scaleDividedByCameraFar;\\n\\t\\tfloat minResolutionMultipliedByCameraFar;\\n // moving costly divides into consts\\n\\t\\tconst float INV_NUM_SAMPLES = 1.0 / float( NUM_SAMPLES );\\n const float offset = PI2 / float(NUM_FRAMES);\\n\\n\\t\\tfloat computeKernelSize(float d, float r) {\\n\\t\\t\\t#if PERSPECTIVE_CAMERA == 1\\n\\t\\t\\t\\t// Apparently this is wrong\\n\\t\\t\\t\\t// return (r * tan(fov) * d) / (size.y * 0.5);\\n\\t\\t\\t\\t// And this is correct\\n\\t\\t\\t\\tfloat rp = r / (size.y * 0.5);\\n\\t\\t\\t\\treturn sqrt((rp*rp*tanFov*tanFov*d*d)/(1. + rp*rp*tanFov*tanFov));\\n\\t\\t\\t#else\\n\\t\\t\\t\\tfloat twoOrthoSize = size.y / (2./ cameraProjectionMatrix[1][1]);\\n\\t\\t\\t\\treturn r / twoOrthoSize;\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\n\\t\\tfloat getAmbientOcclusion( const in vec3 centerViewPosition, in float centerDepth ) {\\n #if AO_ESTIMATOR == 0\\n // precompute some variables require in getOcclusion.\\n scaleDividedByCameraFar = scale / cameraFar;\\n minResolutionMultipliedByCameraFar = minResolution * cameraFar;\\n vec3 centerViewNormal = getViewNormal( centerViewPosition, vUv, centerDepth );\\n // jsfiddle that shows sample pattern: https://jsfiddle.net/TenHands/jun67k9y/7/\\n float occlusionSum = 0.0;\\n float weightSum = 0.0;\\n for( int i = 0; i < NUM_SAMPLES; i ++ ) {\\n float alpha = ( float(i) + 1. ) / float(NUM_SAMPLES);\\n float angle = float(SPIRAL_TURNS) * alpha;\\n vec2 radius = (kernelRadius / size) * pow( alpha, 1.1 );\\n vec2 sampleUv = vUv + vec2( cos( angle + frameIndex * offset ), sin( angle + frameIndex * offset ) ) * radius;\\n\\n float sampleDepth = getPerspectiveDepth( sampleUv );\\n if( sampleDepth >= ( 1.0 - EPSILON ) ) {\\n continue;\\n }\\n float sampleViewZ = getViewZ( sampleDepth );\\n vec3 sampleViewPosition = getViewPosition( sampleUv, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\t\\t\\t/** McGuire Estimator*/\\n\\t\\t\\t\\t\\tvec3 v = sampleViewPosition - centerViewPosition;\\n\\t\\t\\t\\t\\tfloat vv = dot(v, v);\\n\\t\\t\\t\\t\\tfloat vn = dot(v, centerViewNormal) - bias;\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t// Note large epsilon to avoid overdarkening within cracks\\n\\t\\t\\t\\t\\tfloat radius2 = 2.;//uSampleRadiusWS * uSampleRadiusWS\\n\\t\\t\\t\\t\\tfloat epsilon = 0.01;\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\tfloat f = max(radius2 - vv, 0.0) / radius2;\\n\\t\\t\\t\\t\\tocclusionSum += f * f * f * max(vn / (epsilon + vv), 0.0) / 4.;\\n\\n\\t\\t\\t\\t\\t/** Three.js SAO Estimator*/\\n // vec3 viewDelta = sampleViewPosition - centerViewPosition;\\n // float viewDistance = length( viewDelta );\\n // float scaledScreenDistance = scaleDividedByCameraFar * viewDistance;\\n // occlusionSum += max(0.0, (dot(centerViewNormal, viewDelta) - minResolutionMultipliedByCameraFar) / scaledScreenDistance - bias) / (1.0 + pow2( scaledScreenDistance ) );\\n weightSum += 1.0;\\n }\\n if( weightSum == 0.0 ) discard;\\n return occlusionSum * ( intensity / weightSum );\\n\\t\\t\\t#elif AO_ESTIMATOR == 1\\n\\t\\t\\t\\tvec3 viewPosition = centerViewPosition;\\n\\t\\t\\t\\tvec3 viewNormal = getViewNormal( centerViewPosition, vUv, centerDepth );\\n\\t\\t\\t\\tvec2 noiseScale = vec2( size.x / 4.0, size.y / 4.0 );\\n\\t\\t\\t\\tvec3 random = vec3( texture2D( tNoise, vUv * noiseScale ).r );\\n\\t\\t\\t\\t// compute matrix used to reorient a kernel vector\\n\\t\\t\\t\\tvec3 tangent = normalize( random - viewNormal * dot( random, viewNormal ) );\\n\\t\\t\\t\\tvec3 bitangent = cross( viewNormal, tangent );\\n\\t\\t\\t\\tmat3 kernelMatrix = mat3( tangent, bitangent, viewNormal );\\n\\t\\t\\t\\tfloat occlusion = 0.0;\\n\\t\\t\\t\\tfloat kernelSize_ws = computeKernelSize(-viewPosition.z, kernelRadius);\\n\\t\\t\\t\\tfloat div = float( KERNEL_SIZE);\\n\\t\\t\\t\\tfloat maxDist = kernelSize_ws / (cameraFar - cameraNear);\\n\\t\\t\\t\\tfor ( int i = 0; i < KERNEL_SIZE; i ++ ) {\\n\\t\\t\\t\\t\\tvec3 sampleVector = kernelMatrix * kernel[ i ]; // reorient sample vector in view space\\n\\t\\t\\t\\t\\tvec3 samplePoint = viewPosition + ( sampleVector * kernelSize_ws ); // calculate sample point\\n\\t\\t\\t\\t\\tvec4 samplePointNDC = cameraProjectionMatrix * vec4( samplePoint, 1.0 ); // project point and calculate NDC\\n\\t\\t\\t\\t\\tsamplePointNDC /= samplePointNDC.w;\\n\\t\\t\\t\\t\\tvec2 samplePointUv = samplePointNDC.xy * 0.5 + 0.5; // compute uv coordinates\\n\\t\\t\\t\\t\\tfloat realDepth = getLinearDepth( samplePointUv ); // get linear depth from depth texture\\n\\t\\t\\t\\t\\tfloat sampleDepth = viewZToOrthographicDepth( samplePoint.z + bias, cameraNear, cameraFar ); // compute linear depth of the sample view Z value\\n\\t\\t\\t\\t\\tfloat delta = sampleDepth - realDepth;\\n\\t\\t\\t\\t\\tif ( delta > 0. && delta < maxDist ) { // if fragment is before sample point, increase occlusion\\n\\t\\t\\t\\t\\t\\tocclusion += 1.0;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn clamp( occlusion * intensity / div, 0.0, 1.0 );\\n\\t\\t\\t#endif\\n\\t\\t\\t}\\n\\t\\tvoid main() {\\n\\t\\t\\tfloat linearDepth = unpackRGBAToDepth( texture2D( tDepth, vUv ) );\\n\\t\\t\\tfloat centerDepth = getPerspectiveDepth(vUv);\\n\\t\\t\\tif( centerDepth >= ( 1.0 - EPSILON ) ) {\\n\\t\\t\\t\\tdiscard;\\n\\t\\t\\t}\\n\\t\\t\\tfloat centerViewZ = getViewDepth(linearDepth);\\n\\t\\t\\tvec3 viewPosition = getViewPosition( vUv, centerDepth, centerViewZ );\\n\\t\\t\\tvec3 viewNormal = getViewNormal(viewPosition, vUv, linearDepth);\\n\\t\\t\\tfloat ambientOcclusion = getAmbientOcclusion( viewPosition, centerDepth );\\n\\t\\t\\tgl_FragColor = getDefaultColor( vUv );\\n\\t\\t\\tgl_FragColor.xyz *= ambientOcclusion;\\n\\t\\t\\tgl_FragColor.a = 1.;\\n\\t\\t}\",vertexShader:\"\\n\\t\\tvarying vec2 vUv;\\n\\t\\tvoid main() {\\n\\t\\t\\tvUv = uv;\\n\\t\\t\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n\\t\\t}\",uniforms:{tDepth:{value:null},tNormal:{value:null},size:{value:new y(512,512)},cameraNear:{value:1},cameraFar:{value:100},cameraProjectionMatrix:{value:new s},cameraInverseProjectionMatrix:{value:new s},tanFov:{value:0},scale:{value:1},intensity:{value:1},bias:{value:0},minResolution:{value:0},kernelRadius:{value:.5},frameIndex:{value:0},tNoise:{value:null},kernel:{value:null},minDistance:{value:.001},maxDistance:{value:1}}}),this.aoMaterial.extensions.derivatives=!0,this.aoMaterial.uniforms.size.value.set(256,256),this.aoMaterial.blending=C,this.accumulateMaterial=new g({defines:{},fragmentShader:\"\\n uniform float opacity;\\n uniform sampler2D tDiffuse;\\n varying vec2 vUv;\\n // #define NUM_FRAMES 16\\n\\n void main() {\\n vec4 frameSample = texture2D( tDiffuse, vUv );\\n gl_FragColor.xyz = frameSample.rgb * 1./float(NUM_FRAMES);\\n gl_FragColor.a = 1.;//*= opacity;\\n }\",vertexShader:\"\\n varying vec2 vUv;\\n void main() {\\n vUv = uv;\\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n }\",uniforms:{tDiffuse:{value:null},opacity:{value:1}}}),this.accumulateMaterial.uniforms.tDiffuse.value=this._generationBuffer.texture,this.accumulateMaterial.blending=H,this.accumulateMaterial.blendSrc=te,this.accumulateMaterial.blendDst=te,this.accumulateMaterial.blendEquation=re,this.accumulateMaterial.blendSrcAlpha=te,this.accumulateMaterial.blendDstAlpha=te,this.accumulateMaterial.blendEquationAlpha=B,this.fsQuad=new Ce(this.aoMaterial)}setParams(e){Object.assign(this.params,e),this.kernels=[],this.noiseTextures=[]}setFrameIndex(e){this.frameIndex=e}update(e,t){this.aoMaterial.defines.PERSPECTIVE_CAMERA=t.isPerspectiveCamera?1:0,this.aoMaterial.defines.NUM_FRAMES=Un.ACCUMULATE_FRAMES,this.aoMaterial.defines.KERNEL_SIZE=this.params.kernelSize,this.accumulateMaterial.defines.NUM_FRAMES=Un.ACCUMULATE_FRAMES,this.aoMaterial.uniforms.cameraNear.value=t.near,this.aoMaterial.uniforms.cameraFar.value=t.far,this.aoMaterial.uniforms.cameraInverseProjectionMatrix.value.copy(t.projectionMatrixInverse),this.aoMaterial.uniforms.cameraProjectionMatrix.value.copy(t.projectionMatrix);const r=t.fov/2*Math.PI/180;this.aoMaterial.uniforms.tanFov.value=Math.tan(r),this.kernels[this.frameIndex]||this.generateSampleKernel(this.frameIndex),this.noiseTextures[this.frameIndex]||this.generateRandomKernelRotations(this.frameIndex),this.aoMaterial.uniforms.kernel.value=this.kernels[this.frameIndex],this.aoMaterial.uniforms.tNoise.value=this.noiseTextures[this.frameIndex],this.aoMaterial.uniforms.intensity.value=this.params.intensity,this.aoMaterial.uniforms.kernelRadius.value=this.params.kernelRadius,this.aoMaterial.uniforms.bias.value=this.params.bias,this.aoMaterial.uniforms.frameIndex.value=this.frameIndex,this.aoMaterial.uniforms.minDistance.value=this.params.minDistance,this.aoMaterial.uniforms.maxDistance.value=this.params.maxDistance,this.aoMaterial.needsUpdate=!0,this.accumulateMaterial.needsUpdate=!0}render(e,t,r){const n=new x;e.getClearColor(n);const i=e.getClearAlpha(),l=e.autoClear;this.renderFrame(e),e.autoClear=l,e.setClearColor(n),e.setClearAlpha(i)}renderFrame(e){e.setRenderTarget(this._generationBuffer),e.autoClear=!1,e.setClearColor(0),e.setClearAlpha(1),e.clear(!0),this.fsQuad.material=this.aoMaterial,this.fsQuad.render(e),e.setRenderTarget(this._accumulationBuffer),0===this.frameIndex&&(e.setClearColor(16777215),e.setClearAlpha(1),e.clear(!0)),this.fsQuad.material=this.accumulateMaterial,this.fsQuad.render(e)}setSize(e,t){this._generationBuffer.setSize(e,t),this._accumulationBuffer.setSize(e,t),this.aoMaterial.uniforms.size.value.set(e,t),this.aoMaterial.needsUpdate=!0}generateSampleKernel(e){const n=this.params.kernelSize;this.kernels[e]=[];for(let i=0;i\\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n#endif\\nuniform vec2 size;\\nuniform float displacement;\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t// #include COMMENTED CHUNK\\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n \\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n \\n mvPosition = modelViewMatrix * mvPosition;\\n\\n gl_Position = projectionMatrix * mvPosition;\\n \\n // Transform normal vector from object space to clip space.\\n vec3 normalHCS = mat3(projectionMatrix) * normalMatrix * normal;\\n\\n // Move vertex along normal vector in clip space.\\n gl_Position.xy += normalize(normalHCS.xy) / size * gl_Position.w * displacement * 2.;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}get fragmentShader(){return\"\\nuniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t// accumulation (baked indirect lighting only)\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t// modulation\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}get uniformsDef(){return{...super.uniformsDef,size:new y,displacement:0}}constructor(e,t=[]){super(e,t)}}class mn extends nn{constructor(){super(),this.overrideMaterial=null,this._oldClearColor=new x,this.clearColor=null,this.clearAlpha=0,this.clearDepth=!0,this.drawBufferSize=new y,this.onBeforeRender=null,this.onAfterRender=null,this.overrideMaterial=new Vn({color:16711680},[\"USE_RTE\"]),this.overrideMaterial.userData.displacement.value=2,this.overrideMaterial.colorWrite=!1,this.overrideMaterial.depthWrite=!1,this.overrideMaterial.stencilWrite=!0,this.overrideMaterial.stencilFunc=M,this.overrideMaterial.stencilWriteMask=255,this.overrideMaterial.stencilRef=255,this.overrideMaterial.stencilZFail=N,this.overrideMaterial.stencilZPass=N,this.overrideMaterial.stencilFail=N,this.overrideMaterial.side=R}get displayName(){return\"STENCIL\"}get outputTexture(){return null}get material(){return this.overrideMaterial}update(e,t){this.camera=t,this.scene=e}setClippingPlanes(e){this.overrideMaterial.clippingPlanes=e}render(e,t,r){this.onBeforeRender&&this.onBeforeRender();const n=e.autoClear;let i,l;e.autoClear=!1,void 0!==this.overrideMaterial&&(l=this.scene.overrideMaterial),this.clearColor&&(e.getClearColor(this._oldClearColor),i=e.getClearAlpha(),e.setClearColor(this.clearColor,this.clearAlpha)),this.clearDepth&&e.clearDepth(),this.applyLayers(this.camera),e.setRenderTarget(this.renderToScreen?null:r),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),e.getDrawingBufferSize(this.drawBufferSize),this.overrideMaterial.userData.size.value.copy(this.drawBufferSize),e.clear(!1,!1,!0);const a=e.shadowMap.enabled;e.shadowMap.enabled=!1,e.render(this.scene,this.camera),e.shadowMap.enabled=a,this.clearColor&&e.setClearColor(this._oldClearColor,i),void 0!==this.overrideMaterial&&(this.scene.overrideMaterial=l),e.autoClear=n,this.onAfterRender&&this.onAfterRender()}}class zn extends nn{constructor(){super(),this.overrideMaterial=null,this._oldClearColor=new x,this.clearColor=null,this.clearAlpha=0,this.clearDepth=!0,this.drawBufferSize=new y,this.onBeforeRender=null,this.onAfterRender=null,this.overrideMaterial=new Vn({color:304635},[\"USE_RTE\"]),this.overrideMaterial.userData.displacement.value=2,this.overrideMaterial.colorWrite=!0,this.overrideMaterial.depthWrite=!1,this.overrideMaterial.stencilWrite=!0,this.overrideMaterial.stencilFunc=le,this.overrideMaterial.stencilRef=255,this.overrideMaterial.side=R}get displayName(){return\"STENCIL\"}get outputTexture(){return null}get material(){return this.overrideMaterial}update(e,t){this.camera=t,this.scene=e}setClippingPlanes(e){this.overrideMaterial.clippingPlanes=e}render(e,t,r){this.onBeforeRender&&this.onBeforeRender();const n=e.autoClear;let i,l;e.autoClear=!1,void 0!==this.overrideMaterial&&(l=this.scene.overrideMaterial),this.clearColor&&(e.getClearColor(this._oldClearColor),i=e.getClearAlpha(),e.setClearColor(this.clearColor,this.clearAlpha)),this.clearDepth&&e.clearDepth(),this.applyLayers(this.camera),e.setRenderTarget(this.renderToScreen?null:r),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),e.getDrawingBufferSize(this.drawBufferSize),this.overrideMaterial.userData.size.value.copy(this.drawBufferSize);const a=e.shadowMap.enabled;e.shadowMap.enabled=!1,e.render(this.scene,this.camera),e.shadowMap.enabled=a,this.clearColor&&e.setClearColor(this._oldClearColor,i),void 0!==this.overrideMaterial&&(this.scene.overrideMaterial=l),e.autoClear=n,this.onAfterRender&&this.onAfterRender()}}class Xn extends nn{constructor(){super(),this.onBeforeRender=null,this.onAfterRender=null}get displayName(){return\"OVERLAY\"}get outputTexture(){return null}update(e,t){this.camera=t,this.scene=e}render(e,t,r){const n=e.autoClear;e.autoClear=!1,this.applyLayers(this.camera),e.setRenderTarget(this.renderToScreen?null:r),this.onBeforeRender&&this.onBeforeRender(),e.render(this.scene,this.camera),this.onAfterRender&&this.onAfterRender(),e.autoClear=n}}var bn,qn;!function(e){e[e.NORMAL=0]=\"NORMAL\",e[e.ACCUMULATION=1]=\"ACCUMULATION\"}(bn||(bn={})),function(e){e[e.DEPTH_RGBA=0]=\"DEPTH_RGBA\",e[e.DEPTH=1]=\"DEPTH\",e[e.COLOR=2]=\"COLOR\",e[e.GEOMETRY_NORMALS=3]=\"GEOMETRY_NORMALS\",e[e.RECONSTRUCTED_NORMALS=4]=\"RECONSTRUCTED_NORMALS\",e[e.DYNAMIC_AO=5]=\"DYNAMIC_AO\",e[e.DYNAMIC_AO_BLURED=6]=\"DYNAMIC_AO_BLURED\",e[e.PROGRESSIVE_AO=7]=\"PROGRESSIVE_AO\",e[e.FINAL=8]=\"FINAL\"}(qn||(qn={}));const Kn={pipelineOutput:qn.FINAL,accumulationFrames:16,dynamicAoEnabled:!0,dynamicAoParams:cn,staticAoEnabled:!0,staticAoParams:fn,depthSide:R};class Un{set pipelineOptions(e){Object.assign(this._pipelineOptions,e),this.dynamicAoPass.setParams(e.dynamicAoParams),this.staticAoPass.setParams(e.staticAoParams),this.accumulationFrame=0,Un.ACCUMULATE_FRAMES=e.accumulationFrames,this.depthPass.depthSide=e.depthSide,this.pipelineOutput=e.pipelineOutput}get pipelineOptions(){return JSON.parse(JSON.stringify(this._pipelineOptions))}set pipelineOutput(e){let t=[];switch(this.clearPipeline(),e){case qn.FINAL:t=this.getDefaultPipeline(),this.depthPass.depthSize=an.FULL,this.applySaoPass.setTexture(\"tDiffuse\",this.staticAoPass.outputTexture),this.applySaoPass.setTexture(\"tDiffuseInterp\",this.dynamicAoPass.outputTexture),this.needsProgressive=!0;break;case qn.DEPTH_RGBA:t.push(this.depthPass),t.push(this.copyOutputPass),this.depthPass.depthSize=an.FULL,this.copyOutputPass.setTexture(\"tDiffuse\",this.depthPass.outputTexture),this.copyOutputPass.setOutputType(qn.DEPTH_RGBA),this.needsProgressive=!1;break;case qn.DEPTH:t.push(this.depthPass),t.push(this.copyOutputPass),this.depthPass.depthSize=an.FULL,this.copyOutputPass.setTexture(\"tDiffuse\",this.depthPass.outputTexture),this.copyOutputPass.setOutputType(qn.DEPTH),this.needsProgressive=!1;break;case qn.COLOR:t.push(this.renderPass);break;case qn.GEOMETRY_NORMALS:t.push(this.normalsPass),t.push(this.copyOutputPass),this.normalsPass.enabled=!0,this.copyOutputPass.setTexture(\"tDiffuse\",this.normalsPass.outputTexture),this.copyOutputPass.setOutputType(qn.GEOMETRY_NORMALS),this.needsProgressive=!1;break;case qn.RECONSTRUCTED_NORMALS:t.push(this.depthPass),t.push(this.dynamicAoPass),t.push(this.copyOutputPass),this.dynamicAoPass.enabled=!0,this.depthPass.depthType=ln.PERSPECTIVE_DEPTH,this.depthPass.depthSize=an.HALF,this.dynamicAoPass.setOutputType(on.RECONSTRUCTED_NORMALS),this.copyOutputPass.setTexture(\"tDiffuse\",this.dynamicAoPass.outputTexture),this.copyOutputPass.setOutputType(qn.GEOMETRY_NORMALS),this.needsProgressive=!1;break;case qn.DYNAMIC_AO:t.push(this.depthPass),t.push(this.normalsPass),t.push(this.dynamicAoPass),t.push(this.copyOutputPass),this.normalsPass.enabled=this._pipelineOptions.dynamicAoParams.normalsType===pn.DEFAULT,this.dynamicAoPass.enabled=!0,this.depthPass.depthType=ln.PERSPECTIVE_DEPTH,this.copyOutputPass.setTexture(\"tDiffuse\",this.dynamicAoPass.outputTexture),this.copyOutputPass.setOutputType(qn.COLOR),this.dynamicAoPass.setOutputType(on.AO),this.needsProgressive=!1;break;case qn.DYNAMIC_AO_BLURED:t.push(this.depthPass),t.push(this.normalsPass),t.push(this.dynamicAoPass),t.push(this.copyOutputPass),this.normalsPass.enabled=this._pipelineOptions.dynamicAoParams.normalsType===pn.DEFAULT,this.dynamicAoPass.enabled=!0,this.depthPass.depthType=ln.PERSPECTIVE_DEPTH,this.depthPass.depthSize=an.HALF,this.copyOutputPass.setTexture(\"tDiffuse\",this.dynamicAoPass.outputTexture),this.copyOutputPass.setOutputType(qn.COLOR),this.dynamicAoPass.setOutputType(on.AO_BLURRED),this.needsProgressive=!1;break;case qn.PROGRESSIVE_AO:t.push(this.depthPass),t.push(this.dynamicAoPass),t.push(this.staticAoPass),t.push(this.copyOutputPass),this.depthPass.depthType=ln.LINEAR_DEPTH,this.depthPass.depthSize=an.FULL,this.copyOutputPass.setTexture(\"tDiffuse\",this.staticAoPass.outputTexture),this.copyOutputPass.setOutputType(qn.COLOR),this.needsProgressive=!0}this.setPipeline(t)}set needsProgressive(e){this._needsProgressive=e,e||(this._renderType=bn.NORMAL),e&&this._renderType===bn.NORMAL&&(this._renderType=bn.ACCUMULATION),this.accumulationFrame=0}get renderType(){return this._renderType}get composer(){return this._composer}constructor(e,t){this._renderer=null,this._batcher=null,this._pipelineOptions=Object.assign({},Kn),this._needsProgressive=!1,this._resetFrame=!1,this._composer=null,this.depthPass=null,this.normalsPass=null,this.stencilPass=null,this.renderPass=null,this.stencilMaskPass=null,this.dynamicAoPass=null,this.applySaoPass=null,this.copyOutputPass=null,this.staticAoPass=null,this.overlayPass=null,this.drawingSize=new y,this._renderType=bn.NORMAL,this.accumulationFrame=0,this.onBeforePipelineRender=null,this.onAfterPipelineRender=null,this._renderer=e,this._batcher=t,this._composer=new De(e),this._composer.readBuffer=null,this._composer.writeBuffer=null}configure(){let e,t,r;this.depthPass=new sn,this.normalsPass=new dn,this.dynamicAoPass=new vn,this.stencilPass=new mn,this.renderPass=new hn,this.stencilMaskPass=new zn,this.applySaoPass=new tn,this.staticAoPass=new Sn,this.overlayPass=new Xn,this.copyOutputPass=new rn,this.copyOutputPass.renderToScreen=!0,this.depthPass.setLayers([En.STREAM_CONTENT_MESH]),this.normalsPass.setLayers([En.STREAM_CONTENT_MESH]),this.stencilPass.setLayers([En.STREAM_CONTENT_MESH]),this.renderPass.setLayers([En.PROPS,En.STREAM_CONTENT,En.STREAM_CONTENT_MESH,En.STREAM_CONTENT_LINE,En.STREAM_CONTENT_POINT,En.STREAM_CONTENT_POINT_CLOUD,En.STREAM_CONTENT_TEXT,En.SHADOWCATCHER]),this.stencilMaskPass.setLayers([En.STREAM_CONTENT_MESH]),this.overlayPass.setLayers([En.MEASUREMENTS]),this.onBeforePipelineRender=()=>{e=this._batcher.saveVisiblity(),t=this._batcher.getOpaque(),r=this._batcher.getStencil()},this.onAfterPipelineRender=()=>{this._batcher.applyVisibility(e)},this.depthPass.onBeforeRender=()=>{this._batcher.applyVisibility(t),this._batcher.overrideMaterial(t,this.depthPass.material)},this.depthPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(t)},this.normalsPass.onBeforeRender=()=>{this._batcher.applyVisibility(t),this._batcher.overrideMaterial(t,this.normalsPass.material)},this.normalsPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(e)},this.stencilPass.onBeforeRender=()=>{this._batcher.applyVisibility(r),this._batcher.overrideMaterial(r,this.stencilPass.material)},this.stencilPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(r)},this.stencilMaskPass.onBeforeRender=()=>{this._batcher.applyVisibility(r),this._batcher.overrideMaterial(r,this.stencilMaskPass.material)},this.stencilMaskPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(r)},this.renderPass.onBeforeRenderOpauqe=()=>{e=this._batcher.saveVisiblity();const t=this._batcher.getOpaque();this._batcher.applyVisibility(t)},this.renderPass.onBeforeRenderTransparent=()=>{const e=this._batcher.getTransparent();this._batcher.applyVisibility(e)},this.renderPass.onAfterRenderTransparent=()=>{this._batcher.applyVisibility(e)},this.setPipeline(this.getDefaultPipeline())}getDefaultPipeline(){this.renderPass.renderToScreen=!0,this.normalsPass.enabled=this._pipelineOptions.dynamicAoParams.normalsType===pn.DEFAULT,this.dynamicAoPass.setOutputType(this._pipelineOptions.dynamicAoParams.blurEnabled?on.AO_BLURRED:on.AO),this.applySaoPass.renderToScreen=!0,this.dynamicAoPass.setTexture(\"tDepth\",this.depthPass.outputTextureHalf),this.dynamicAoPass.setTexture(\"tNormal\",this.normalsPass.outputTexture),this.applySaoPass.setTexture(\"tDiffuse\",this.dynamicAoPass.outputTexture),this.applySaoPass.setTexture(\"tDiffuseInterp\",this.dynamicAoPass.outputTexture),this.staticAoPass.setTexture(\"tDepth\",this.depthPass.outputTexture),this.staticAoPass.setTexture(\"tNormal\",this.normalsPass.outputTexture);const e=[];return e.push(this.depthPass),e.push(this.normalsPass),e.push(this.dynamicAoPass),e.push(this.staticAoPass),e.push(this.stencilPass),e.push(this.renderPass),e.push(this.stencilMaskPass),e.push(this.applySaoPass),e.push(this.overlayPass),this.needsProgressive=!0,e}clearPipeline(){for(;this._composer.passes.length>0;)this._composer.removePass(this._composer.passes[0])}setPipeline(e){for(let t=0;tthis.getPlaneId(e)!==t));this.planeOutlines[t].renderable.material.clippingPlanes=r}}updatePlaneOutline(e,r){const n=new t,i=new t,l=new t,a=new t,s=new t,u=new ae,d=this.getPlaneId(r),p=this.planeOutlines[d].renderable;let o=0,c=p.geometry.attributes.instanceStart.data;const v=new Array;for(let t=0;td.intersectsBox(e),intersectsBounds:e=>d.intersectsBox(e),intersectsTriangle(r,p,c,f,S){const h=e[t].mesh.getBatchObjectMaterial(S);if(h instanceof cr||!1===h.visible||null===h)return;const V=d;let m=0;u.start.copy(r.a),u.end.copy(r.b),V.intersectLine(u,n)&&(n.add(s.copy(d.normal).multiplyScalar(xn.Z_OFFSET)),v[3*o]=n.x,v[3*o+1]=n.y,v[3*o+2]=n.z,o++,m++),u.start.copy(r.b),u.end.copy(r.c),V.intersectLine(u,n)&&(n.add(s.copy(d.normal).multiplyScalar(xn.Z_OFFSET)),v[3*o]=n.x,v[3*o+1]=n.y,v[3*o+2]=n.z,m++,o++),u.start.copy(r.c),u.end.copy(r.a),V.intersectLine(u,n)&&(n.add(s.copy(d.normal).multiplyScalar(xn.Z_OFFSET)),v[3*o]=n.x,v[3*o+1]=n.y,v[3*o+2]=n.z,m++,o++),3===m&&(i.set(v[3*(o-3)],v[3*(o-3)+1],v[3*(o-3)+2]),l.set(v[3*(o-2)],v[3*(o-2)+1],v[3*(o-2)+2]),a.set(v[3*(o-1)],v[3*(o-1)+1],v[3*(o-1)+2]),a.equals(i)||a.equals(l)?(m--,o--):i.equals(l)&&(a.set(n.x,n.y,n.z),a.add(s.copy(d.normal).multiplyScalar(xn.Z_OFFSET)),v[3*(o-2)]=a.x,v[3*(o-2)+1]=a.y,v[3*(o-2)+2]=a.z,m--,o--)),2!==m&&(o-=m)}})}v.length>c.array.length&&(this.resizeGeometryBuffer(this.planeOutlines[d],v.length),console.warn(`Resized outline buffer from ${c.array.length} to ${v.length}. ${v.length/6} instance count`)),c=p.geometry.attributes.instanceStart.data;const f=p.geometry.attributes.instanceStartLow.data;Pt.DoubleToHighLowBuffer(v,f.array,c.array),c.needsUpdate=!0,c.updateRange={offset:0,count:3*o},f.needsUpdate=!0,f.updateRange={offset:0,count:3*o},p.visible=!0,p.geometry.instanceCount=o/2,p.geometry.attributes.instanceStart.needsUpdate=!0,p.geometry.attributes.instanceEnd.needsUpdate=!0,p.geometry.attributes.instanceStartLow.needsUpdate=!0,p.geometry.attributes.instanceEndLow.needsUpdate=!0,p.geometry.computeBoundingBox(),p.geometry.computeBoundingSphere()}createPlaneOutline(e){const t=new Float64Array(xn.INITIAL_BUFFER_SIZE),r=new Fe;r.setPositions(new Float32Array(t)),r.attributes.instanceStart.data.setUsage(w),Pt.updateRTEGeometry(r,t);const n=new wt({color:294651,linewidth:2,worldUnits:!1,vertexColors:!1,alphaToCoverage:!1,resolution:new y(919,848)},[\"USE_RTE\"]);n.color=new x(294651),n.color.convertSRGBToLinear(),n.linewidth=2,n.worldUnits=!1,n.resolution=new y(1513,1306);const i=new Ye(r,n);return i.name=`${e}-outline`,i.frustumCulled=!1,i.renderOrder=1,i.layers.set(En.PROPS),{renderable:i}}resizeGeometryBuffer(e,t){e.renderable.geometry.dispose();const r=new Float32Array(t);e.renderable.geometry=new Fe,e.renderable.geometry.setPositions(new Float32Array(r)),e.renderable.geometry.attributes.instanceStart.data.setUsage(w),Pt.updateRTEGeometry(e.renderable.geometry,r)}getPlaneId(e){return this.tmpVec.set(Math.round(e.normal.x),Math.round(e.normal.y),Math.round(e.normal.z)),this.tmpVec.equals(this.right)?Tn.POSITIVE_X:this.tmpVec.equals(this.left)?Tn.NEGATIVE_X:this.tmpVec.equals(this.up)?Tn.POSITIVE_Y:this.tmpVec.equals(this.down)?Tn.NEGATIVE_Y:this.tmpVec.equals(this.back)?Tn.NEGATIVE_Z:this.tmpVec.equals(this.forward)?Tn.POSITIVE_Z:void 0}}xn.INITIAL_BUFFER_SIZE=6e4,xn.Z_OFFSET=-.001;class Pn extends or{get vertexShader(){return\"\\n\\tvarying vec2 vUv;\\n\\t\\tvoid main() {\\n\\t\\t\\tvUv = vec2(1. - uv.x, uv.y);\\n\\t\\t\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n\\t\\t}\\n\"}get fragmentShader(){return\"\\nvarying vec2 vUv;\\n\\nuniform sampler2D tex0;\\nuniform sampler2D tex1;\\nuniform sampler2D tex2;\\nuniform sampler2D tex3;\\nuniform vec4 weights;\\nuniform float sigmoidRange;\\nuniform float sigmoidStrength;\\n\\nvoid main() {\\n\\tfloat color0 = texture2D(tex0, vUv).r * weights.x;\\n\\tfloat color1 = texture2D(tex1, vUv).r * weights.y;\\n\\tfloat color2 = texture2D(tex2, vUv).r * weights.z;\\n\\tfloat color3 = texture2D(tex3, vUv).r * weights.w;\\n\\n\\t// float c0 = mix(color0, 0., color1);\\n\\t// float c1 = mix(color1, 0., color0);\\n\\t// float c2 = mix(color3, 0., color0 * 0.5 + color1 * 0.5);\\n\\t// float sum = c0 + c1 + c2;\\n\\n\\tfloat sum = color0 + color1 + color3 + color2;\\n\\n\\tfloat a = sigmoidRange;//2.;\\n\\tfloat b = 0.03;\\n\\tfloat c = sigmoidStrength;//2.43;\\n\\tfloat d = 0.59;\\n\\tfloat e = 0.14;\\n\\tsum = clamp((sum*(a*sum+b))/(sum*(c*sum+d)+e), 0., 1.);\\n\\n\\tvec2 sUv = vUv * 2. - 1.;\\n\\tsum *= 1. - pow(abs(sUv.x), 6.);\\n\\tsum *= 1. - pow(abs(sUv.y), 6.);\\n\\n\\tgl_FragColor = vec4( vec3(sum), sum );\\n}\\n\"}get uniformsDef(){return{...super.uniformsDef,tex0:null,tex1:null,tex2:null,tex3:null,weights:new J,sigmoidRange:0,sigmoidStrength:0}}constructor(e,t=[]){super(e,t)}}class Wn extends nn{get displayName(){return\"Shadowcatcher\"}get outputTexture(){return this.outputTarget.texture}set needsUpdate(e){this._needsUpdate=e}constructor(){super(),this.levels=4,this.debugCamera=!1,this.renderTargets=[],this.tempTargets=[],this.camera=null,this.scene=null,this._needsUpdate=!1,this.fsQuad=null,this.blendMaterial=null,this.depthMaterial=null,this.vBlurMaterial=null,this.hBlurMaterial=null,this.blurStdDev=yn.stdDeviation,this.blurRadius=yn.blurRadius,this.prevBlurStdDev=0,this.prevBlurRadius=0,this.cameraHelper=null,this.onBeforeRender=null,this.onAfterRender=null;for(let e=0;ee*Rn.MAX_TEXTURE_SIZE_SCALE&&(r.y=e*Rn.MAX_TEXTURE_SIZE_SCALE,r.x=t*r.y),r}updatePlaneMesh(e,r){const n=e.getSize(new t),i=e.getCenter(new t);(new y(n.x,n.y).distanceTo(this.planeSize)>.001||r)&&this.updatePlaneMeshGeometry(new y(2*n.x,2*n.y),new t(i.x,i.y,i.z-.5*n.z-.001)),this.planeSize.set(n.x,n.y)}updatePlaneMeshGeometry(e,t){this.planeMesh.geometry&&this.planeMesh.geometry.dispose();const r=new F(e.x,e.y,Rn.PLANE_SUBD,Rn.PLANE_SUBD),n=(new s).makeTranslation(t.x,t.y,t.z);r.applyMatrix4(n);const i=new Float64Array(r.attributes.position.array);Pt.updateRTEGeometry(r,i),this.planeMesh.geometry=r,this.planeMesh.geometry.computeBoundingBox()}}Rn.MESH_NAME=\"Shadowcatcher\",Rn.PLANE_SUBD=2,Rn.MAX_TEXTURE_SIZE_SCALE=.5;const Mn={fixedSize:!0,dashedLine:!1,discColor:294651,discOpacity:1,lineColor:294651,lineOpacity:1,pointColor:294651,pointOpacity:1,textColor:16777215,textOpacity:1,textPixelHeight:17,pointPixelHeight:5};class Nn extends ve{set style(e){Object.assign(this._style,e),this.updateStyle()}set highlight(e){e?(this.disc.material.color=new x(16711680),this.line.material.color=new x(16711680),this.point.material.color=new x(16711680),this.text.textMesh.material.color.copy(new x(16711680))):this.updateStyle()}getDiscMaterial(){const e=new or({color:this._style.discColor});return e.color.convertSRGBToLinear(),e.toneMapped=!1,e.polygonOffset=!0,e.polygonOffsetFactor=-5,e.polygonOffsetUnits=5,e.opacity=this._style.discOpacity,e.transparent=e.opacity<1,e}getLineMaterial(){const e=new wt({color:294651,linewidth:1,worldUnits:!1,vertexColors:!1,alphaToCoverage:!1,resolution:new y(1,1)},[\"USE_RTE\",\"UNIFORM_OPACITY\"].concat(this._style.dashedLine?[\"USE_DASH\"]:[]));return e.color=new x(this._style.lineColor),e.color.convertSRGBToLinear(),e.toneMapped=!1,this._style.dashedLine&&(e.dashSize=1,e.gapSize=1,e.dashScale=10),e.linewidth=2,e.worldUnits=!1,e.resolution=new y(1513,1306),e.opacity=this._style.lineOpacity,e.transparent=e.opacity<1,e.depthTest=!1,e}getPointMaterial(e){const t=new or({color:e||this._style.pointColor},[\"BILLBOARD_FIXED\"]);return t.opacity=this._style.pointOpacity,t.transparent=t.opacity<1,t.color.convertSRGBToLinear(),t.toneMapped=!1,t.depthTest=!1,t.billboardPixelHeight=this._style.pointPixelHeight*window.devicePixelRatio,t.userData.billboardPos.value.copy(this.point.position),t}getTextMaterial(){const e=new vr({color:this._style.textColor,opacity:1,side:R},[\"USE_RTE\",\"BILLBOARD_FIXED\"]);return e.toneMapped=!1,e.color.convertSRGBToLinear(),e.opacity=this._style.textOpacity,e.transparent=e.opacity<1,e.depthTest=!1,e.billboardPixelHeight=this._style.textPixelHeight*window.devicePixelRatio,e.userData.billboardPos.value.copy(this.text.position),e.getDerivedMaterial()}constructor(e){super(),this._style=Object.assign({},Mn),this.layers.set(En.MEASUREMENTS);const t=new fe(1,16),r=new Float64Array(t.attributes.position.array);Pt.updateRTEGeometry(t,r),this.disc=new L(t,null),this.disc.layers.set(En.MEASUREMENTS);const n=new Float64Array(18),i=new Fe;i.setPositions(new Float32Array(n)),i.attributes.instanceStart.data.setUsage(w),Pt.updateRTEGeometry(i,n),this.line=new Ye(i,null),this.line.computeLineDistances(),this.line.name=\"test-mesurements-line\",this.line.frustumCulled=!1,this.line.renderOrder=0,this.line.layers.set(En.MEASUREMENTS);const l=new fe(1,16);this.point=new L(l,null),this.point.layers.set(En.MEASUREMENTS),this.point.visible=!1,this.point.renderOrder=1;const a=new L(l,this.getPointMaterial(16777215));a.renderOrder=2,a.material.billboardPixelHeight=this._style.pointPixelHeight*window.devicePixelRatio-2*window.devicePixelRatio,a.layers.set(En.MEASUREMENTS),this.point.add(a),this.text=new Fr(\"test-text\"),this.text.textMesh.material=null,this.text.layers.set(En.MEASUREMENTS),this.text.textMesh.layers.set(En.MEASUREMENTS),this.text.backgroundMesh,this.add(this.point),this.add(this.disc),this.add(this.line),this.add(this.text),this.style=e}enable(e,t,r,n){this.disc.visible=e,this.line.visible=t,this.point.visible=r,this.text.visible=n,this.text.textMesh.visible=n,this.line.material.visible=t}frameUpdate(e,t){if(\"PerspectiveCamera\"===e.type&&+this._style.fixedSize>0){const r=e,n=r.position.distanceTo(this.disc.position),i=Math.abs(2*Math.tan(r.fov/2)*n),l=2*t.min.distanceTo(t.max),a=.0035*Math.min(i,l);this.disc.scale.set(a,a,a),this.disc.matrixWorldNeedsUpdate=!0}if(\"OrthographicCamera\"===e.type&&+this._style.fixedSize>0){const t=e,r=(t.top-t.bottom)/t.zoom*.0075;this.disc.scale.set(r,r,r),this.disc.matrixWorldNeedsUpdate=!0}}updateDisc(e,t){this.disc.position.copy(e),Nn.vecBuff0.set(0,0,1),this.disc.quaternion.setFromUnitVectors(Nn.vecBuff0,t)}updatePoint(e){this.point.position.copy(e),this.point.material.userData.billboardPos.value.copy(this.point.position),this.point.children[0].material.userData.billboardPos.value.copy(this.point.position)}updateLine(e){const t=new Float64Array(3*e.length);e.forEach(((e,r)=>{e.toArray(t,3*r)}));const r=this.line.geometry.attributes.instanceStart.data,n=this.line.geometry.attributes.instanceStartLow.data;Pt.DoubleToHighLowBuffer(t,n.array,r.array),r.needsUpdate=!0,r.updateRange={offset:0,count:3*e.length},n.needsUpdate=!0,n.updateRange={offset:0,count:3*e.length},this.line.visible=!0,this.line.geometry.instanceCount=e.length/2,this.line.geometry.attributes.instanceStart.needsUpdate=!0,this.line.geometry.attributes.instanceEnd.needsUpdate=!0,this.line.geometry.attributes.instanceStartLow.needsUpdate=!0,this.line.geometry.attributes.instanceEndLow.needsUpdate=!0,this.line.geometry.computeBoundingBox(),this.line.geometry.computeBoundingSphere(),this.line.computeLineDistances()}updateText(e,t,r,n){this.text.update({textValue:e,height:1,anchorX:\"50%\",anchorY:\"43%\"}).then((()=>{this.text.style={backgroundColor:new x(294651),billboard:!0,backgroundPixelHeight:20},this.text.setTransform(t,r,n),this.text.backgroundMesh.renderOrder=3,this.text.textMesh.renderOrder=4}))}updateStyle(){this.disc.material=this.getDiscMaterial(),this.line.material=this.getLineMaterial(),this.point.material=this.getPointMaterial(),this.text.textMesh.material=this.getTextMaterial()}raycast(e,t){this.line.raycast(e,t),this.text.raycast(e,t)}updateClippingPlanes(e){var t;this.disc.material.clippingPlanes=e,this.point.material.clippingPlanes=e,this.point.children[0].material.clippingPlanes=e,this.line.material.clippingPlanes=e,this.text.backgroundMesh&&(this.text.backgroundMesh.material.clippingPlanes=e),this.text.textMesh&&((null===(t=this.text.textMesh)||void 0===t?void 0:t.material).clippingPlanes=e)}}var On,Ln;Nn.vecBuff0=new t,function(e){e[e.HIDDEN=0]=\"HIDDEN\",e[e.DANGLING_START=1]=\"DANGLING_START\",e[e.DANGLING_END=2]=\"DANGLING_END\",e[e.COMPLETE=3]=\"COMPLETE\"}(On||(On={}));class Zn extends Se{constructor(){super(...arguments),this.startPoint=new t,this.endPoint=new t,this.startNormal=new t,this.endNormal=new t,this.value=0,this.units=\"m\",this.precision=2,this._state=On.HIDDEN,this.renderingSize=new y}set state(e){this._state=e}get state(){return this._state}set isVisible(e){}get bounds(){return(new c).expandByPoint(this.startPoint).expandByPoint(this.endPoint)}frameUpdate(e,t,r){this.renderingCamera=e,this.renderingSize.copy(t)}update(){}raycast(e,t){}highlight(e){}updateClippingPlanes(e){}}Zn.vec3Buff0=new t,Zn.vec3Buff1=new t,Zn.vec3Buff2=new t,Zn.vec3Buff3=new t,Zn.vec3Buff4=new t,Zn.vec4Buff0=new J,Zn.vec4Buff1=new J,Zn.vec2Buff0=new y;class kn extends Zn{set isVisible(e){this.startGizmo.enable(e,e,e,e),this.endGizmo.enable(e,e,e,e)}get bounds(){return(new c).expandByPoint(this.startPoint).expandByPoint(this.midPoint)}constructor(){super(),this.startGizmo=null,this.endGizmo=null,this.midPoint=new t,this.normalIndicatorPixelSize=15,this.type=\"PerpendicularMeasurement\",this.startPoint.set(NaN,NaN,NaN),this.startGizmo=new Nn,this.endGizmo=new Nn({dashedLine:!0,lineOpacity:.25}),this.startLineLength=.25,this.add(this.startGizmo),this.add(this.endGizmo),this.layers.set(En.MEASUREMENTS)}frameUpdate(e,t,r){super.frameUpdate(e,t,r),this.startGizmo.frameUpdate(e,r),this.endGizmo.frameUpdate(e,r),this._state===On.DANGLING_START&&this.update()}update(){if(!isNaN(this.startPoint.length())){if(this.startGizmo.updateDisc(this.startPoint,this.startNormal),this.startGizmo.updatePoint(this.startPoint),this.endGizmo.updateDisc(this.endPoint,this.endNormal),this._state===On.DANGLING_START){const e=Zn.vec3Buff0.copy(this.startPoint),t=Zn.vec4Buff0.set(this.startPoint.x,this.startPoint.y,this.startPoint.z,1).applyMatrix4(this.renderingCamera.matrixWorldInverse).applyMatrix4(this.renderingCamera.projectionMatrix),r=t.w;t.multiplyScalar(1/r);const n=Zn.vec4Buff1.set(this.startNormal.x,this.startNormal.y,this.startNormal.z,0).applyMatrix4(this.renderingCamera.matrixWorldInverse).applyMatrix4(this.renderingCamera.projectionMatrix).normalize(),i=0===n.w?1:n.w;n.multiplyScalar(1/i).normalize(),this.renderingCamera instanceof he&&n.negate();const l=Zn.vec2Buff0.set(this.normalIndicatorPixelSize/this.renderingSize.x*2,this.normalIndicatorPixelSize/this.renderingSize.y*2),a=Zn.vec4Buff0.set(t.x,t.y,t.z,1).add(Zn.vec4Buff1.set(n.x*l.x,n.y*l.y,0,0));a.multiplyScalar(r),a.applyMatrix4(this.renderingCamera.projectionMatrixInverse).applyMatrix4(this.renderingCamera.matrixWorld),this.startGizmo.updateLine([e,Zn.vec3Buff1.set(a.x,a.y,a.z)]),this.endGizmo.enable(!1,!1,!1,!1)}if(this._state===On.DANGLING_END){const e=this.startPoint.distanceTo(this.endPoint),t=Zn.vec3Buff0.copy(this.startPoint).sub(this.endPoint).normalize();let r=this.startNormal.dot(t);const n=Math.acos(Math.min(Math.max(r,-1),1));this.startLineLength=Math.abs(e*Math.cos(n)),this.midPoint.copy(Zn.vec3Buff0.copy(this.startPoint).add(Zn.vec3Buff1.copy(this.startNormal).multiplyScalar(this.startLineLength)));const i=Zn.vec3Buff1.copy(this.midPoint).sub(this.endPoint).normalize();this.endLineLength=this.midPoint.distanceTo(this.endPoint),r=this.endNormal.dot(i);const l=Math.acos(Math.min(Math.max(r,-1),1)),a=this.endLineLength*Math.cos(l),s=Zn.vec3Buff1.copy(this.endPoint).add(Zn.vec3Buff2.copy(this.endNormal).multiplyScalar(a)),u=Zn.vec3Buff2.copy(this.startPoint),d=Zn.vec3Buff3.copy(this.startPoint).add(Zn.vec3Buff4.copy(this.startNormal).multiplyScalar(this.startLineLength));this.startGizmo.updateLine([u,d]);const p=Zn.vec3Buff3.copy(this.endPoint);this.endGizmo.updateLine([p,s,s,this.midPoint,this.midPoint,p]),this.endGizmo.updatePoint(this.midPoint);const o=Zn.vec3Buff0.copy(this.startPoint).add(Zn.vec3Buff1.copy(this.startNormal).multiplyScalar(.5*this.startLineLength));this.value=this.midPoint.distanceTo(this.startPoint),this.startGizmo.updateText(`${(this.value*Lt(\"m\",this.units)).toFixed(this.precision)} ${this.units}`,o),this.endGizmo.enable(!0,!0,!0,!0)}this._state===On.COMPLETE&&(this.startGizmo.updateText(`${(this.value*Lt(\"m\",this.units)).toFixed(this.precision)} ${this.units}`),this.startGizmo.enable(!1,!0,!0,!0),this.endGizmo.enable(!1,!1,!0,!1))}}raycast(e,t){const r=[];this.startGizmo.raycast(e,r),this.endGizmo.raycast(e,r),r.length&&t.push({distance:r[0].distance,face:r[0].face,faceIndex:r[0].faceIndex,object:this,point:r[0].point,uv:r[0].uv})}highlight(e){this.startGizmo.highlight=e,this.endGizmo.highlight=e}updateClippingPlanes(e){this.startGizmo.updateClippingPlanes(e),this.endGizmo.updateClippingPlanes(e)}}class Gn extends Zn{set isVisible(e){this.startGizmo.enable(e,e,e,e),this.endGizmo.enable(e,e,e,e)}constructor(){super(),this.startGizmo=null,this.endGizmo=null,this.type=\"PointToPointMeasurement\",this.startGizmo=new Nn,this.endGizmo=new Nn({dashedLine:!0,lineOpacity:.25}),this.startLineLength=0,this.add(this.startGizmo),this.add(this.endGizmo),this.layers.set(En.MEASUREMENTS)}frameUpdate(e,t,r){super.frameUpdate(e,t,r),this.startGizmo.frameUpdate(e,r),this.endGizmo.frameUpdate(e,r)}update(){if(this.startGizmo.updateDisc(this.startPoint,this.startNormal),this.startGizmo.updatePoint(this.startPoint),this.endGizmo.updateDisc(this.endPoint,this.endNormal),this._state===On.DANGLING_START){const e=Zn.vec3Buff0.copy(this.startPoint),t=Zn.vec3Buff1.copy(this.startPoint).add(Zn.vec3Buff2.copy(this.startNormal).multiplyScalar(this.startLineLength));this.startGizmo.updateLine([e,t]),this.endGizmo.enable(!1,!1,!1,!1)}if(this._state===On.DANGLING_END){this.startLineLength=this.startPoint.distanceTo(this.endPoint),this.value=this.startLineLength;const e=Zn.vec3Buff0.copy(this.endPoint).sub(this.startPoint).normalize(),t=Zn.vec3Buff1.copy(this.startPoint).add(Zn.vec3Buff2.copy(e).multiplyScalar(this.startLineLength)),r=Zn.vec3Buff3.copy(this.startPoint).add(Zn.vec3Buff4.copy(e).multiplyScalar(.5*this.startLineLength));this.startGizmo.updateLine([this.startPoint,t]),this.endGizmo.updatePoint(t),this.startGizmo.updateText(`${(this.value*Lt(\"m\",this.units)).toFixed(this.precision)} ${this.units}`,r),this.endGizmo.enable(!0,!0,!0,!0)}this._state===On.COMPLETE&&(this.startGizmo.enable(!1,!0,!0,!0),this.endGizmo.enable(!1,!1,!0,!1),this.startGizmo.updateText(`${(this.value*Lt(\"m\",this.units)).toFixed(this.precision)} ${this.units}`))}raycast(e,t){const r=[];this.startGizmo.raycast(e,r),this.endGizmo.raycast(e,r),r.length&&t.push({distance:r[0].distance,face:r[0].face,faceIndex:r[0].faceIndex,object:this,point:r[0].point,uv:r[0].uv})}highlight(e){this.startGizmo.highlight=e,this.endGizmo.highlight=e}updateClippingPlanes(e){this.startGizmo.updateClippingPlanes(e),this.endGizmo.updateClippingPlanes(e)}}!function(e){e[e.PERPENDICULAR=0]=\"PERPENDICULAR\",e[e.POINTTOPOINT=1]=\"POINTTOPOINT\"}(Ln||(Ln={}));const jn={visible:!0,type:Ln.POINTTOPOINT,vertexSnap:!0,units:\"m\",precision:2};class In{constructor(e){this.renderer=null,this.measurements=[],this.measurement=null,this.selectedMeasurement=null,this.raycaster=null,this._options=Object.assign({},jn),this.frameLock=!1,this._enabled=!1,this._paused=!1,this.pointBuff=new t,this.normalBuff=new t,this.screenBuff0=new y,this.screenBuff1=new y,this.renderer=e,this.raycaster=new D,this.raycaster.layers.set(En.MEASUREMENTS),this.renderer.input.on(\"pointer-move\",this.onPointerMove.bind(this)),this.renderer.input.on(it.ObjectClicked,this.onPointerClick.bind(this)),this.renderer.input.on(it.ObjectDoubleClicked,this.onPointerDoubleClick.bind(this))}get enabled(){return this._enabled}get visible(){return this._options.visible}set enabled(e){this._enabled=e,this.measurement&&(this.measurement.isVisible=e,this.measurement.update()),this.renderer.needsRender=!0,this.renderer.resetPipeline()}set paused(e){this._paused=e}set options(e){const t=this._options.type!==e.type&&this.measurement&&this.measurement.state===On.DANGLING_START;Object.assign(this._options,e),t&&(this.cancelMeasurement(),this.startMeasurement()),this.applyOptions()}update(){this._enabled&&(this.frameLock=!1,this.renderer.renderer.getDrawingBufferSize(this.screenBuff0),this.measurement&&this.measurement.frameUpdate(this.renderer.camera,this.screenBuff0,this.renderer.sceneBox),this.measurements.forEach((e=>{e.frameUpdate(this.renderer.camera,this.screenBuff0,this.renderer.sceneBox)})))}fromMeasurementData(e,t){const r=new Gn;r.startPoint.copy(e),r.endPoint.copy(t),r.state=On.DANGLING_END,r.update(),r.state=On.COMPLETE,r.update(),this.measurements.push(this.measurement)}updateClippingPlanes(e){this.measurements.forEach((t=>{t.updateClippingPlanes(e)}))}onPointerMove(e){if(!this._enabled||this._paused)return;if(this.frameLock)return;let t=this.renderer.intersections.intersect(this.renderer.scene,this.renderer.camera,e,!0,this.renderer.currentSectionBox,[En.STREAM_CONTENT_MESH])||[];t=t.filter((e=>{const t=e.object.getBatchObjectMaterial(e.batchObject);return!(t instanceof cr)&&t.visible})),t.length&&(this.measurement||this.startMeasurement(),this.measurement.isVisible=!0,this.pointBuff.copy(t[0].point),this.normalBuff.copy(t[0].face.normal),this._options.vertexSnap&&this.snap(t[0],this.pointBuff,this.normalBuff),this.measurement.state===On.DANGLING_START?(this.measurement.startPoint.copy(this.pointBuff),this.measurement.startNormal.copy(this.normalBuff)):this.measurement.state===On.DANGLING_END&&(this.measurement.endPoint.copy(this.pointBuff),this.measurement.endNormal.copy(this.normalBuff)),this.measurement.update(),this.renderer.needsRender=!0,this.renderer.resetPipeline(\"OrthographicCamera\"===this.renderer.camera.type),this.frameLock=!0)}onPointerClick(e){this._enabled&&(2!==e.event.button?this.measurement&&(this.measurement.state===On.DANGLING_START?this.measurement.state=On.DANGLING_END:this.measurement.state===On.DANGLING_END&&this.finishMeasurement()):this.cancelMeasurement())}onPointerDoubleClick(e){this._options.type!==Ln.PERPENDICULAR||this.autoLazerMeasure(e)}autoLazerMeasure(e){if(!this.measurement)return;this.measurement.state=On.DANGLING_START;let r=this.renderer.intersections.intersect(this.renderer.scene,this.renderer.camera,e,!0,this.renderer.currentSectionBox,[En.STREAM_CONTENT_MESH])||[];if(r=r.filter((e=>{const t=e.object.getBatchObjectMaterial(e.batchObject);return!(t instanceof cr)&&t.visible})),!r.length)return;const n=(new t).copy(r[0].point),i=(new t).copy(r[0].face.normal),l=(new t).copy(n).add((new t).copy(i).multiplyScalar(1e-6));let a=this.renderer.intersections.intersectRay(this.renderer.scene,this.renderer.camera,new f(l,i),!0,this.renderer.currentSectionBox,[En.STREAM_CONTENT_MESH])||[];a=a.filter((e=>{const t=e.object.getBatchObjectMaterial(e.batchObject);return!(t instanceof cr)&&t.visible})),a.length?(this.measurement.startPoint.copy(n),this.measurement.startNormal.copy(i),this.measurement.endPoint.copy(a[0].point),this.measurement.endNormal.copy(a[0].face.normal),this.measurement.state=On.DANGLING_END,this.measurement.update(),this.finishMeasurement()):this.flashMeasurement()}startMeasurement(){this._options.type===Ln.PERPENDICULAR?this.measurement=new kn:this._options.type===Ln.POINTTOPOINT&&(this.measurement=new Gn),this.measurement.state=On.DANGLING_START,this.measurement.frameUpdate(this.renderer.camera,this.screenBuff0,this.renderer.sceneBox),this.renderer.scene.add(this.measurement)}cancelMeasurement(){this.renderer.scene.remove(this.measurement),this.measurement=null,this.renderer.needsRender=!0,this.renderer.resetPipeline()}finishMeasurement(){this.measurement.state=On.COMPLETE,this.measurement.update(),this.measurement.value>0?this.measurements.push(this.measurement):(this.renderer.scene.remove(this.measurement),We.error(\"Ignoring zero value measurement!\")),this.measurement=null}snap(e,t,r){const n=e.batchObject.bvh.getVertexAtIndex(e.face.a).project(this.renderer.camera),i=e.batchObject.bvh.getVertexAtIndex(e.face.b).project(this.renderer.camera),l=e.batchObject.bvh.getVertexAtIndex(e.face.c).project(this.renderer.camera),a=e.point.project(this.renderer.camera),s=[n,i,l];s.sort(((e,t)=>a.distanceTo(e)-a.distanceTo(t)));const u=this.renderer.NDCToScreen(s[0].x,s[0].y),d=this.renderer.NDCToScreen(a.x,a.y);this.screenBuff0.set(u.x,u.y),this.screenBuff1.set(d.x,d.y);const p=s[0].unproject(this.renderer.camera);this.screenBuff0.distanceTo(this.screenBuff1)<10*window.devicePixelRatio&&(t.copy(p),r.copy(e.face.normal))}flashMeasurement(){let e=0;const t=setInterval((()=>{this.measurement.highlight(Boolean(e++%2)),e>=5&&clearInterval(t),this.renderer.needsRender=!0,this.renderer.resetPipeline()}),100)}pickMeasurement(e){var t;this.measurements.forEach((e=>{e.highlight(!1)})),this.raycaster.setFromCamera(e,this.renderer.camera);return null===(t=this.raycaster.intersectObjects(this.measurements,!1)[0])||void 0===t?void 0:t.object}selectMeasurement(e,t){this.cancelMeasurement(),e.highlight(t),this.selectedMeasurement=e}removeMeasurement(){this.selectedMeasurement?(this.measurements.splice(this.measurements.indexOf(this.selectedMeasurement),1),this.renderer.scene.remove(this.selectedMeasurement),this.selectedMeasurement=null,this.renderer.needsRender=!0,this.renderer.resetPipeline()):this.cancelMeasurement()}applyOptions(){[this.measurement,...this.measurements].forEach((e=>{e&&(e.units=this._options.units,e.precision=this._options.precision,e.update())})),this.renderer.enableLayers([En.MEASUREMENTS],this._options.visible),this.renderer.needsRender=!0,this.renderer.resetPipeline()}}var En;!function(e){e[e.STREAM_CONTENT_MESH=10]=\"STREAM_CONTENT_MESH\",e[e.STREAM_CONTENT_LINE=11]=\"STREAM_CONTENT_LINE\",e[e.STREAM_CONTENT_POINT=12]=\"STREAM_CONTENT_POINT\",e[e.STREAM_CONTENT_TEXT=13]=\"STREAM_CONTENT_TEXT\",e[e.STREAM_CONTENT_POINT_CLOUD=14]=\"STREAM_CONTENT_POINT_CLOUD\",e[e.STREAM_CONTENT=1]=\"STREAM_CONTENT\",e[e.PROPS=2]=\"PROPS\",e[e.SHADOWCATCHER=3]=\"SHADOWCATCHER\",e[e.MEASUREMENTS=4]=\"MEASUREMENTS\"}(En||(En={}));class wn{get renderer(){return this._renderer}set needsRender(e){this._needsRender||(this._needsRender=e)}set indirectIBL(e){this._scene.environment=e}set indirectIBLIntensity(e){const t=this.batcher.getBatches(void 0,Kt.MESH);for(let r=0;r{e.name.includes(\"_bvh\")&&(e.visible=this.SHOW_BVH)}))}get shadowcatcher(){return this._shadowcatcher}get intersections(){return this._intersections}get currentSectionBox(){return this.viewer.sectionBox.getCurrentBox()}get measurements(){return this._measurements}constructor(e){this.SHOW_HELPERS=!1,this.IGNORE_ZERO_OPACITY_OBJECTS=!0,this.SHOW_BVH=!1,this.sunConfiguration=lt,this.filterBatchRecording=[],this.lastSectionPlanes=[],this.sectionPlanesChanged=[],this.sectionBoxOutlines=null,this._shadowcatcher=null,this._measurements=null,this.cancel={},this.explodeTime=-1,this.explodeRange=0,this._scene=new Ve,this.rootGroup=new ve,this.rootGroup.name=\"ContentGroup\",this.rootGroup.layers.set(En.STREAM_CONTENT),this._scene.add(this.rootGroup),this._intersections=new $r,this.viewer=e,this.lastSectionPlanes.push(new se,new se,new se,new se,new se,new se)}create(e){this._renderer=new me({antialias:!0,alpha:!0,preserveDrawingBuffer:!0,stencil:!0}),this._renderer.setClearColor(16777215,0),this._renderer.setPixelRatio(window.devicePixelRatio),this._renderer.outputEncoding=ze,this._renderer.toneMapping=Xe,this._renderer.toneMappingExposure=.5,this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=be,this.renderer.shadowMap.autoUpdate=!1,this.renderer.shadowMap.needsUpdate=!0,this.renderer.physicallyCorrectLights=!0,this.renderer.autoClearStencil=!1,this.container=e,this._renderer.setSize(e.offsetWidth,e.offsetHeight),e.appendChild(this._renderer.domElement),this.batcher=new Cr(this.renderer.capabilities.maxVertexUniforms,this.renderer.capabilities.floatVertexTextures),this.pipeline=new Un(this._renderer,this.batcher),this.pipeline.configure(),this.pipeline.pipelineOptions=Kn,this.sectionBoxOutlines=new xn;const t=new ve;if(t.name=\"SectionBoxOutlines\",this.scene.add(t),t.add(this.sectionBoxOutlines.getPlaneOutline(Tn.NEGATIVE_Z).renderable),t.add(this.sectionBoxOutlines.getPlaneOutline(Tn.POSITIVE_Z).renderable),t.add(this.sectionBoxOutlines.getPlaneOutline(Tn.POSITIVE_X).renderable),t.add(this.sectionBoxOutlines.getPlaneOutline(Tn.NEGATIVE_X).renderable),t.add(this.sectionBoxOutlines.getPlaneOutline(Tn.POSITIVE_Y).renderable),t.add(this.sectionBoxOutlines.getPlaneOutline(Tn.NEGATIVE_Y).renderable),this.input=new Qr(this._renderer.domElement,Hr),this.input.on(it.ObjectClicked,this.onObjectClick.bind(this)),this.input.on(it.ObjectDoubleClicked,this.onObjectDoubleClick.bind(this)),this.addDirectLights(),this.SHOW_HELPERS){const e=new ve;e.name=\"Helpers\",this._scene.add(e);const t=new v(this.sceneBox,new x(255));t.name=\"SceneBoxHelper\",t.layers.set(En.PROPS),e.add(t);const r=new qe(this.sun,50,16711680);r.name=\"DirLightHelper\",r.layers.set(En.PROPS),e.add(r);const n=new oe(this.sun.shadow.camera);n.name=\"CamHelper\",n.layers.set(En.PROPS),e.add(n)}let r;this.viewer.cameraHandler.controls.restThreshold=.001,this.viewer.cameraHandler.controls.addEventListener(\"rest\",(()=>{this._needsRender=!0,this.pipeline.onStationaryBegin(),this._measurements.paused=!1})),this.viewer.cameraHandler.controls.addEventListener(\"controlstart\",(()=>{this._needsRender=!0,this.pipeline.onStationaryEnd()})),this.viewer.cameraHandler.controls.addEventListener(\"controlend\",(()=>{this._needsRender=!0,this.viewer.cameraHandler.controls.hasRested&&this.pipeline.onStationaryBegin(),this._measurements.paused=!1})),this.viewer.cameraHandler.controls.addEventListener(\"control\",(()=>{this._needsRender=!0,this.pipeline.onStationaryEnd(),this._measurements.paused=!0})),this.viewer.cameraHandler.controls.addEventListener(\"update\",(()=>{this.viewer.cameraHandler.controls.hasRested||this.pipeline.renderType!==bn.ACCUMULATION||(this._needsRender=!0,this.pipeline.onStationaryEnd())})),this._shadowcatcher=new Rn(En.SHADOWCATCHER,[En.STREAM_CONTENT_MESH]),this._shadowcatcher.shadowcatcherPass.onBeforeRender=()=>{r=this.batcher.saveVisiblity();const e=this.batcher.getOpaque();this.batcher.applyVisibility(e)},this._shadowcatcher.shadowcatcherPass.onAfterRender=()=>{this.batcher.applyVisibility(r)},this._scene.add(this._shadowcatcher.shadowcatcherMesh),this._measurements=new In(this)}update(e){this.needsRender=this.viewer.cameraHandler.controls.update(e),this.batcher.update(e),this.updateRTEShadows(),this.updateTransforms(),this.updateFrustum(),this._measurements.update(),this.pipeline.update(this),this.sunConfiguration.shadowcatcher&&this._shadowcatcher.update(this._scene),this.explodeTime>-1&&(this.explode(this.explodeTime,this.explodeRange),this.explodeTime=-1)}updateRTEShadows(){if(!this._renderer.shadowMap.needsUpdate)return;const e=new t,r=new t,n=new t;e.set(this.sun.shadow.camera.matrixWorld.elements[12],this.sun.shadow.camera.matrixWorld.elements[13],this.sun.shadow.camera.matrixWorld.elements[14]),Pt.DoubleToHighLowVector(e,r,n);const i=new s;i.copy(this.sun.shadow.camera.matrixWorldInverse),i.elements[12]=0,i.elements[13]=0,i.elements[14]=0;const l=new s;l.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),l.multiply(this.sun.shadow.camera.projectionMatrix),l.multiply(i);const a=new s,u=this.batcher.getBatches(void 0,Kt.MESH);for(let e=0;e{this.addBatch(e,t)})),this.updateDirectLights(),this.updateHelpers(),this.viewer.sectionBox.display.visible&&this.viewer.setSectionBox(),this.updateShadowCatcher(),this._needsRender=!0}async addRenderTreeAsync(e,t=1,r=!0){this.cancel[e]=!1;const n=new ve;n.name=e,n.layers.set(En.STREAM_CONTENT),this.rootGroup.add(n);const i=this.batcher.makeBatchesAsync(this.viewer.getWorldTree().getRenderTree(e),Gt,void 0,t);for await(const t of i)if(t&&(this.addBatch(t,n),r&&this.zoom(),t.geometryType===Kt.MESH&&this.updateDirectLights(),this._needsRender=!0,this.cancel[e])){i.return(),this.removeRenderTree(e),delete this.cancel[e];break}this.updateHelpers(),this.updateShadowCatcher(),this.viewer.sectionBox.display.visible&&this.viewer.setSectionBox(),delete this.cancel[e]}addBatch(e,t){const r=e.renderObject;if(t.add(e.renderObject),e.geometryType===Kt.MESH){const n=r.material;if(r.castShadow=!n.transparent,r.receiveShadow=!n.transparent,r.customDepthMaterial=new en({depthPacking:ee},[\"USE_RTE\",\"ALPHATEST_REJECTION\"]),this.SHOW_BVH){const n=new Ze(r,10);n.name=e.renderObject.id+\"_bvh\",n.traverse((e=>{e.layers.set(En.PROPS)})),n.displayParents=!0,n.visible=!1,n.update(),t.add(n)}r.BVH.boxHelpers.forEach((e=>{this.scene.add(e)}))}this.viewer.World.expandWorld(e.bounds)}removeRenderTree(e){this.rootGroup.remove(this.rootGroup.getObjectByName(e)),this.updateShadowCatcher();this.batcher.getBatches(e).forEach((e=>{this.viewer.World.reduceWorld(e.bounds)})),this.batcher.purgeBatches(e),this.updateDirectLights(),this.updateHelpers()}cancelRenderTree(e){void 0!==this.cancel[e]&&(this.cancel[e]=!0)}clearFilter(){this.batcher.resetBatchesDrawRanges(),this.filterBatchRecording=[]}applyFilter(e,t){this.filterBatchRecording.push(...this.batcher.setObjectsFilterMaterial(e,t))}applyDirectFilter(e,t){return this.batcher.insertObjectsFilterMaterial(e,t)}removeDirectFilter(e){this.batcher.removeObjectsMaterial(e)}applyMaterial(e,t){const r={needsCopy:!0};this.filterBatchRecording.push(...this.batcher.setObjectsMaterial(e,(e=>({offset:e.batchStart,count:e.batchCount,material:t,materialOptions:r}))))}beginFilter(){this.filterBatchRecording=[]}endFilter(){this.batcher.autoFillDrawRanges(this.filterBatchRecording),this.updateClippingPlanes(this.viewer.sectionBox.planes),this.viewer.sectionBox.display.visible&&this.updateSectionBoxCapper(),this.renderer.shadowMap.needsUpdate=!0,this.updateShadowCatcher()}getBatchMaterials(){return Object.keys(this.batcher.batches).reduce(((e,t)=>({...e,[t]:this.batcher.batches[t].batchMaterial})),{})}updateClippingPlanes(e){this.allObjects&&(e||(e=this.viewer.sectionBox.planes),this.allObjects.traverse((t=>{const r=t.material;if(r)if(Array.isArray(r))for(let t=0;t1e-4&&this.sectionPlanesChanged.push(e[t]),this.lastSectionPlanes[t].copy(e[t])}onSectionBoxDragStart(){this.sectionBoxOutlines.enable(!1)}onSectionBoxDragEnd(){const e=()=>{this.setSectionPlaneChanged(this.viewer.sectionBox.planes),this.updateSectionBoxCapper(this.sectionPlanesChanged),this.updateShadowCatcher(),this.viewer.removeListener(it.SectionBoxUpdated,e)};this.viewer.on(it.SectionBoxUpdated,e)}updateSectionBoxCapper(e){const t=performance.now();e||(e=this.viewer.sectionBox.planes);for(let t=0;t{e.name.includes(\"_bvh\")&&(e.visible=!0)})));let n=!1;e.multiSelect&&(n=!0);const i=this.queryHits(r);if(!i)return void this.viewer.emit(it.ObjectClicked,n?{multiple:!0,event:e.event}:null);const l={multiple:n,event:e.event,hits:i.map((e=>({guid:e.node.model.id,object:e.node.model.raw,point:e.point})))};this.viewer.emit(it.ObjectClicked,l)}onObjectDoubleClick(e){const t=this._measurements.pickMeasurement(e);if(t)return void this.zoomToBox(t.bounds);if(this._measurements.enabled)return;const r=this._intersections.intersect(this._scene,this.viewer.cameraHandler.activeCam.camera,e,!0,this.viewer.sectionBox.getCurrentBox());if(!r)return void this.viewer.emit(it.ObjectDoubleClicked,null);let n=!1;e.multiSelect&&(n=!0);const i=this.queryHits(r);if(!i)return void this.viewer.emit(it.ObjectClicked,null);const l={multiple:n,hits:i.map((e=>({guid:e.node.model.id,object:e.node.model.raw,point:e.point})))};this.viewer.emit(it.ObjectDoubleClicked,l)}boxFromObjects(e){let r=new c;const n=[];e.length>0?this.viewer.getWorldTree().walk((t=>!t.model.atomic||(!t.model.raw||(-1!==e.indexOf(t.model.raw.id)&&n.push(...this.viewer.getWorldTree().getRenderTree().getRenderViewsForNode(t,t)),!0)))):r=this.sceneBox;for(let e=0;ee.renderViews.length-t.renderViews.length));const t=[];for(let r=0;re.mesh)).flatMap((e=>e.batchObjects)).filter((e=>r.includes(e.renderView)))}markTransformsDirty(e){this.batcher.batches[e].mesh.transformsDirty=!0}enableLayers(e,t){this.pipeline.composer.passes.forEach((r=>{r instanceof nn&&e.forEach((e=>{r.enableLayer(e,t)}))}))}}class Jn extends ut{constructor(t,r){let n;super(),this.viewer=t,this.raycaster=new e.Raycaster,this.raycaster.params.Line.threshold=.1,this.raycaster.params.Line2={},this.raycaster.params.Line2.threshold=1,this.raycaster.layers.set(En.PROPS),this.subset=void 0!==r&&void 0!==r.subset?r.subset:null,this.pointerDown=!1,this.checkForSectionBoxInclusion=!0,void 0!==r&&r.checkForSectionBoxInclusion&&(this.sectionBox=r.checkForSectionBoxInclusion),this.viewer.speckleRenderer.renderer.domElement.addEventListener(\"pointerdown\",(e=>{e.preventDefault(),n=(new Date).getTime()})),this.viewer.speckleRenderer.renderer.domElement.addEventListener(\"pointerup\",(e=>{if(e.preventDefault(),this.viewer.cameraHandler.orbiting)return;const t=(new Date).getTime()-n;if(this.pointerDown=!1,t>250)return;const r=this.getClickedObjects(e);this.emit(\"object-clicked\",r)})),this.tapTimeout,this.lastTap=0,this.touchLocation,this.viewer.speckleRenderer.renderer.domElement.addEventListener(\"touchstart\",(e=>{this.touchLocation=e.targetTouches[0]})),this.viewer.speckleRenderer.renderer.domElement.addEventListener(\"touchend\",(e=>{if(e.targetTouches.length>0)return;const t=(new Date).getTime(),r=t-this.lastTap;if(clearTimeout(this.tapTimeout),r<500&&r>0){const e=this.getClickedObjects(this.touchLocation);this.emit(\"object-doubleclicked\",e)}else this.tapTimeout=setTimeout((function(){clearTimeout(this.tapTimeout)}),500);this.lastTap=t})),this.viewer.speckleRenderer.renderer.domElement.addEventListener(\"dblclick\",(e=>{const t=this.getClickedObjects(e);this.emit(\"object-doubleclicked\",t)})),this.multiSelect=!1,document.addEventListener(\"keydown\",(e=>{e.isComposing||229===e.keyCode||(\"Shift\"===e.key&&(this.multiSelect=!0),\"Escape\"===e.key&&this.unselect())})),document.addEventListener(\"keyup\",(e=>{e.isComposing||229===e.keyCode||\"Shift\"===e.key&&(this.multiSelect=!1)})),this.originalSelectionObjects=[]}unselect(){this.originalSelectionObjects=[]}getClickedObjects(e){const t=this._getNormalisedClickPosition(e);this.raycaster.setFromCamera(t,this.viewer.cameraHandler.activeCam.camera);let r=[];return this.viewer.sectionBox.display.visible&&this.checkForSectionBoxInclusion&&(r=this.raycaster.intersectObject(this.viewer.sectionBox.cube)),r}_getNormalisedClickPosition(e){const t=this.viewer.speckleRenderer.renderer.domElement,r=this.viewer.speckleRenderer.renderer.domElement.getBoundingClientRect(),n=(e.clientX-r.left)*t.width/r.width,i=(e.clientY-r.top)*t.height/r.height;return{x:n/t.width*2-1,y:i/t.height*-2+1}}dispose(){super.dispose(),this.unselect(),this.originalSelectionObjects=null}}const Yn=\"section-box-drag-start\",Fn=\"section-box-drag-end\";class Dn extends ut{constructor(t){super(),this.viewer=t,this.viewer.speckleRenderer.renderer.localClippingEnabled=!0,this.dragging=!1,this.display=new e.Group,this.display.name=\"SectionBox\",this.display.layers.set(En.PROPS),this.viewer.speckleRenderer.scene.add(this.display),this.boxGeometry=this._generateSimpleCube(5,5,5),this.material=new e.MeshStandardMaterial({color:65535,opacity:0,wireframe:!1,side:e.DoubleSide}),this.cube=new e.Mesh(this.boxGeometry,this.material),this.cube.visible=!1,this.cube.layers.set(En.PROPS),this.display.add(this.cube),this.boxHelper=new e.Box3Helper(this.boxGeometry.boundingBox,681727),this.boxHelper.material.opacity=.4,this.boxHelper.layers.set(En.PROPS),this.display.add(this.boxHelper);const r=new e.SphereGeometry(.01,10,10);this.sphere=new e.Mesh(r,new e.MeshStandardMaterial({color:65535})),this.sphere.layers.set(En.PROPS),this.sphere.visible=!1,this.display.add(this.sphere),this.plane=new e.PlaneGeometry(1,1),this.hoverPlane=new e.Mesh(this.plane,new e.MeshStandardMaterial({transparent:!0,side:e.DoubleSide,opacity:.1,wireframe:!1,color:681727,metalness:.1,roughness:.75})),this.hoverPlane.visible=!1,this.hoverPlane.layers.set(En.PROPS),this.display.add(this.hoverPlane),this.dragging=!1,this._setupControls(),this.sidesSimple={256:{verts:[1,2,5,6],axis:\"x\"},152:{verts:[1,2,5,6],axis:\"x\"},407:{verts:[0,3,4,7],axis:\"x\"},703:{verts:[0,3,4,7],axis:\"x\"},327:{verts:[2,3,6,7],axis:\"y\"},726:{verts:[2,3,6,7],axis:\"y\"},450:{verts:[0,1,4,5],axis:\"y\"},\"051\":{verts:[0,1,4,5],axis:\"y\"},312:{verts:[0,1,3,2],axis:\"z\"},\"013\":{verts:[0,1,3,2],axis:\"z\"},546:{verts:[4,5,7,6],axis:\"z\"},647:{verts:[4,5,7,6],axis:\"z\"}},this._generateOrUpdatePlanes(),this.currentRange=null,this.prevPosition=null,this.attachedToBox=!0,this.selectionHelper=new Jn(this.viewer,{subset:[this.cube],hover:!1,checkForSectionBoxInclusion:!1}),this.selectionHelper.on(it.ObjectClicked,this._clickHandler.bind(this)),this.selectionHelper.on(\"hovered\",(()=>{})),document.addEventListener(\"keydown\",(e=>{\"Escape\"===e.key&&this.viewer.mouseOverRenderer&&this._attachControlsToBox()})),this._attachControlsToBox(),this.viewer.on(\"projection-change\",function(){this._setupControls(),this._attachControlsToBox()}.bind(this))}_setupControls(){var e,t;null===(e=this.controls)||void 0===e||e.dispose(),null===(t=this.controls)||void 0===t||t.detach(),this.controls=new $e(this.viewer.cameraHandler.activeCam.camera,this.viewer.speckleRenderer.renderer.domElement);for(let e=0;e{e.layers.set(En.PROPS)}));this.controls.getRaycaster().layers.set(En.PROPS),this.controls.setSize(.75),this.display.add(this.controls),this.controls.addEventListener(\"change\",this._draggingChangeHandler.bind(this)),this.controls.addEventListener(\"dragging-changed\",(e=>{if(!this.display.visible)return;const t=!!e.value;t?(this.emit(Yn),this.dragging=t,this.viewer.cameraHandler.enabled=!t):(this.emit(Fn),setTimeout((()=>{this.dragging=t,this.viewer.cameraHandler.enabled=!t}),100))})),this.viewer.needsRender=!0}_draggingChangeHandler(){if(this.display.visible){if(this.boxGeometry.computeBoundingBox(),this.boxHelper.box.copy(this.boxGeometry.boundingBox),this.dragging&&this.currentRange){this._generateOrUpdatePlanes(),null===this.prevPosition&&(this.prevPosition=this.hoverPlane.position.clone()),this.prevPosition.sub(this.hoverPlane.position),this.prevPosition.negate();const e=this.boxGeometry.attributes.position.array;for(let t=0;t!!t.model.data&&e(t.model.guid,t.model.data))).map((e=>e.model.data))}findFirst(e){return this.root.first((t=>!!t.model.data&&e(t.model.guid,t.model.data))).model.data}walk(e){this.root.walk((t=>!t.model.data||e(t.model.guid,t.model.data)))}}class Cn{static build(e){const t=new gn;let r=null;return e.root.walk((n=>{if(!n.parent)return r=t.root,!0;r=t.root.first((e=>e.model.guid===n.parent.model.id));const i=e.parse({guid:n.model.id,data:n.model.raw,atomic:n.model.atomic,children:[]});return r.addChild(i),!0}),e.root),t}}class Hn{get treeBounds(){return this._treeBounds}get id(){return this.root.model.id}constructor(e,t){this._treeBounds=new c,this.cancel=!1,this.tree=e,this.root=t}buildRenderTree(){this.root.walk((e=>{const t=this.buildRenderNode(e);return e.model.renderView=t?new Et(t):null,this.applyTransforms(e),!0}))}buildRenderTreeAsync(e){return this.tree.walkAsync((e=>{const t=this.buildRenderNode(e);return e.model.renderView=t?new Et(t):null,this.applyTransforms(e),!this.cancel}),this.root,e)}applyTransforms(e){if(e.model.renderView){const t=this.computeTransform(e);e.model.renderView.hasGeometry?(e.model.renderView.renderData.geometry.bakeTransform&&t.multiply(e.model.renderView.renderData.geometry.bakeTransform),Pt.transformGeometryData(e.model.renderView.renderData.geometry,t),e.model.renderView.computeAABB(),this._treeBounds.union(e.model.renderView.aabb),jt.keepGeometryData||jt.disposeNodeGeometryData(e.model)):e.model.renderView.hasMetadata&&e.model.renderView.renderData.geometry.bakeTransform.premultiply(t)}}buildRenderNode(e){let t=null;const r=jt.convertNodeToGeometryData(e.model);if(r){const n=this.getRenderMaterialNode(e),i=this.getDisplayStyleNode(e);t={id:e.model.id,speckleType:jt.getSpeckleType(e.model),geometry:r,renderMaterial:Sr.renderMaterialFromNode(n||i,e),displayStyle:Sr.displayStyleFromNode(i||n)}}return t}getRenderMaterialNode(e){if(e.model.raw.renderMaterial)return e;const t=this.tree.getAncestors(e);for(let e=0;e0){const t=r[e].model.raw.id;if(r[e-1].model.raw.host===t)continue}t.premultiply(n.geometry.transform)}}return t}getRenderableRenderViews(...e){return this.root.all((t=>null!==t.model.renderView&&(t.model.renderView.hasGeometry||t.model.renderView.hasMetadata)&&e.includes(t.model.renderView.renderData.speckleType))).map((e=>e.model.renderView))}getRenderableNodes(...e){return this.root.all((t=>null!==t.model.renderView&&(t.model.renderView.hasGeometry||t.model.renderView.hasMetadata)&&e.includes(t.model.renderView.renderData.speckleType)))}getRenderViewsForNode(e,t){return e.model.atomic&&e.model.renderView&&jt.getSpeckleType(e.model)!==kt.RevitInstance&&jt.getSpeckleType(e.model)!==kt.BlockInstance?[e.model.renderView]:(t||e.parent).all((e=>e.model.renderView&&(e.model.renderView.hasGeometry||e.model.renderView.hasMetadata))).map((e=>e.model.renderView))}getRenderViewNodesForNode(e,t){return e.model.atomic&&e.model.renderView&&jt.getSpeckleType(e.model)!==kt.RevitInstance&&jt.getSpeckleType(e.model)!==kt.BlockInstance?[e]:(t||e.parent).all((e=>e.model.renderView&&(e.model.renderView.hasGeometry||e.model.renderView.hasMetadata)))}getAtomicParent(e){return e.model.atomic?e:this.tree.getAncestors(e).find((e=>e.model.atomic))}getRenderViewsForNodeId(e){const t=this.tree.findId(e);return t?this.getRenderViewsForNode(t):(We.warn(`Id ${e} does not exist`),null)}getRenderViewForNodeId(e){const t=this.tree.findId(e);return t?t.model.renderView:(We.warn(`Id ${e} does not exist`),null)}purge(){this.tree=null}cancelBuild(e){this.cancel=!0,this.tree.purge(e),this.purge()}}class Qn{constructor(){this.renderTreeInstances={},this.supressWarnings=!0,this.tree=new et,this._root=this.parse({id:Qn.ROOT_ID,raw:{},atomic:!0,children:[],renderView:null})}getRenderTree(e){if(!this._root)return console.error(\"WorldTree not initialised\"),null;const t=e||this.root.model.id;return this.renderTreeInstances[t]||(this.renderTreeInstances[t]=new Hn(this,this.findId(t))),this.renderTreeInstances[t]}getDataTree(){return Cn.build(this)}get root(){return this._root}isRoot(e){return e===this._root}parse(e){return this.tree.parse(e)}addSubtree(e){this._root.addChild(e)}addNode(e,t){null!==t?t.addChild(e):We.error(\"Invalid parent node!\")}removeNode(e){e.drop()}findAll(e,t){return t||this.supressWarnings||We.warn(\"Root will be used for searching. You might not want that\"),(t||this.root).all(e)}findId(e,t){return t||this.supressWarnings||We.warn(\"Root will be used for searching. You might not want that\"),(t||this.root).first((t=>t.model.id===e))}getAncestors(e){return e.getPath().reverse().slice(1)}walk(e,t){t||this.supressWarnings||We.warn(\"Root will be used for searching. You might not want that\"),this._root.walk(e,t)}async walkAsync(e,t,r){t||this.supressWarnings||We.warn(\"Root will be used for searching. You might not want that\");const n=Jr.getPause(r);const i=async function*e(t,r){let n,i;for(yield t(r),n=0,i=r.children.length;ndelete this.renderTreeInstances[e])),this._root.drop(),this._root.children.length=0,this.tree=new et,this._root=this.tree.parse({id:Qn.ROOT_ID,raw:{},atomic:!0,children:[]})}}Qn.ROOT_ID=\"ROOT\";const An=function(e){const t={};for(const r in e){if([\"id\",\"__closure\",\"__parents\",\"bbox\",\"totalChildrenCount\"].includes(r))continue;const n=e[r];if(null!=n&&!Array.isArray(n))if(n.constructor!==Object)[\"string\",\"number\",\"boolean\"].includes(typeof n)&&(t[r]=n);else{const e=An(n);for(const n in e)t[`${r}.${n}`]=e[n]}}return e.id&&(t.id=e.id),t};class Bn{constructor(){this.propCache={}}getProperties(e,t=null,r=!1){let n=e.root;if(!r&&this.propCache[t||n.model.id])return this.propCache[t||n.model.id];if(t){const e=n.children.find((e=>e.model.id===t));if(!e)throw new Error(`Could not find root node for ${t} - is it loaded?`);n=e}const i={};e.walk((e=>{if(!e.model.atomic)return!0;const t=An(e.model.raw);for(const e in t)Array.isArray(t[e])||(i[e]||(i[e]=[]),i[e].push({value:t[e],id:t.id}))}),n);const l=[];for(const e in i){const t=i[e],r={};if(r.key=e,r.type=\"string\"==typeof t[0].value?\"string\":\"number\",r.objectCount=t.length,\"string\"===r.type){const e=r,n={};for(const{value:e,id:r}of t)n[e]||(n[e]=[]),n[e].push(r);e.valueGroups=[];for(const t in n)e.valueGroups.push({value:t,ids:n[t]});e.valueGroups=e.valueGroups.sort(((e,t)=>e.value.localeCompare(t.value)))}if(\"number\"===r.type){const e=r;e.min=Number.MAX_VALUE,e.max=Number.MIN_VALUE;for(const{value:r}of t)re.max&&(e.max=r);e.valueGroups=t.sort(((e,t)=>e.value-t.value))}l.push(r)}return this.propCache[n.model.id]=l,l}}class _n{static isPointQuery(e){return\"Project\"===e.operation||\"Unproject\"===e.operation}static isIntersectionQuery(e){return\"Occlusion\"===e.operation||\"Pick\"===e.operation}}var $n;_n.DefaultPointQuerySolver=new class{setContext(e){this.renderer=e}solve(e){switch(e.operation){case\"Project\":return this.solveProjection(e);case\"Unproject\":return this.solveUnprojection(e);default:We.error(\"Malformed query\")}}solveProjection(e){const r=new t(e.point.x,e.point.y,e.point.z);return r.project(this.renderer.camera),{x:r.x,y:r.y,z:r.z}}solveUnprojection(e){const r=new t(e.point.x,e.point.y,e.point.z);return r.unproject(this.renderer.camera),{x:r.x,y:r.y,z:r.z}}},_n.DefaultIntersectionQuerySolver=new class{constructor(){this.vecBuff0=new t,this.vecBuff1=new t}setContext(e){this.renderer=e}solve(e){switch(e.operation){case\"Occlusion\":return this.solveOcclusion(e);case\"Pick\":return this.solvePick(e);default:We.error(\"Malformed query\")}}solveOcclusion(e){const t=this.vecBuff0.set(e.point.x,e.point.y,e.point.z),r=this.vecBuff1.copy(t).sub(this.renderer.camera.position);r.normalize();const n=new f(this.renderer.camera.position,r),i=this.renderer.intersections.intersectRay(this.renderer.scene,this.renderer.camera,n,!0,this.renderer.currentSectionBox,[En.STREAM_CONTENT_MESH]);if(!i||0===i.length)return{objects:null};const l=this.renderer.queryHitIds(i);if(!l)return{objects:null};let a=this.renderer.camera.position.distanceTo(t);return a-=e.tolerance,a({guid:e.node.model.id,object:e.node.model.raw,point:e.point})))}}},function(e){e[e.PLAIN=0]=\"PLAIN\",e[e.COLORED=1]=\"COLORED\"}($n||($n={}));class ei{get materialGroups(){return this._materialGroups}constructor(e){this.tree=null,this.addedMaterialMesh=null,this.changedNewMaterialMesh=null,this.changedOldMaterialMesh=null,this.removedMaterialMesh=null,this.addedMaterialPoint=null,this.changedNewMaterialPoint=null,this.changedOldMaterialPoint=null,this.removedMaterialPoint=null,this.addedMaterials=[],this.changedOldMaterials=[],this.changedNewMaterials=[],this.removedMaterials=[],this._materialGroups=null,this.tree=e,this.addedMaterialMesh=new Qt({color:new x(\"#00ff00\"),emissive:0,roughness:1,metalness:0,opacity:1,side:o},[\"USE_RTE\"]),this.addedMaterialMesh.vertexColors=!1,this.addedMaterialMesh.depthWrite=!0,this.addedMaterialMesh.transparent=!0,this.addedMaterialMesh.clipShadows=!0,this.addedMaterialMesh.color.convertSRGBToLinear(),this.changedNewMaterialMesh=new Qt({color:new x(\"#ffff00\"),emissive:0,roughness:1,metalness:0,opacity:1,side:o},[\"USE_RTE\"]),this.changedNewMaterialMesh.vertexColors=!1,this.changedNewMaterialMesh.transparent=!0,this.addedMaterialMesh.depthWrite=!0,this.changedNewMaterialMesh.clipShadows=!0,this.changedNewMaterialMesh.color.convertSRGBToLinear(),this.changedOldMaterialMesh=new Qt({color:new x(\"#ffff00\"),emissive:0,roughness:1,metalness:0,opacity:1,side:o},[\"USE_RTE\"]),this.changedOldMaterialMesh.vertexColors=!1,this.changedOldMaterialMesh.transparent=!0,this.addedMaterialMesh.depthWrite=!0,this.changedOldMaterialMesh.clipShadows=!0,this.changedOldMaterialMesh.color.convertSRGBToLinear(),this.removedMaterialMesh=new Qt({color:new x(\"#ff0000\"),emissive:0,roughness:1,metalness:0,opacity:1,side:o},[\"USE_RTE\"]),this.removedMaterialMesh.vertexColors=!1,this.removedMaterialMesh.transparent=!0,this.addedMaterialMesh.depthWrite=!0,this.removedMaterialMesh.clipShadows=!0,this.removedMaterialMesh.color.convertSRGBToLinear(),this.addedMaterialPoint=new _t({color:65280,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.addedMaterialPoint.transparent=!0,this.addedMaterialPoint.color.convertSRGBToLinear(),this.addedMaterialPoint.toneMapped=!1,this.changedNewMaterialPoint=new _t({color:16776960,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.changedNewMaterialPoint.transparent=!0,this.changedNewMaterialPoint.color.convertSRGBToLinear(),this.changedNewMaterialPoint.toneMapped=!1,this.changedOldMaterialPoint=new _t({color:16776960,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.changedOldMaterialPoint.transparent=!0,this.changedOldMaterialPoint.color.convertSRGBToLinear(),this.changedOldMaterialPoint.toneMapped=!1,this.removedMaterialPoint=new _t({color:16711680,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.removedMaterialPoint.transparent=!0,this.removedMaterialPoint.color.convertSRGBToLinear(),this.removedMaterialPoint.toneMapped=!1}intersection(e,t){const[r,n]=[Object.keys(e),Object.keys(t)],[i,l]=r.length>n.length?[n,e]:[r,t];return i.filter((e=>e in l))}buildIdMaps(e,t,r){var n;for(let i=0;ie.model.raw.applicationId)))||void 0===n?void 0:n.model.raw.applicationId;t[l.model.raw.id]={node:l,applicationId:a},a&&(r[a]=1)}}diff(e,t){return this.diffIterative(e,t)}diffBoolean(e,t){const r=performance.now(),n={unchanged:[],added:[],removed:[],modified:[]},i=this.tree.getRenderTree(e),l=this.tree.getRenderTree(t);let a=i.getRenderableNodes(...Gt),s=l.getRenderableNodes(...Gt);a=a.map((e=>i.getAtomicParent(e))),s=s.map((e=>l.getAtomicParent(e))),a=[...Array.from(new Set(a))],s=[...Array.from(new Set(s))];const u={},d={};this.buildIdMaps(a,u,d);const p={},o={};this.buildIdMaps(s,p,o);const c=this.intersection(u,p),v=tt.omit(p,c),f=tt.omit(u,c),S=tt.omit(v,(function(e,t,r){return e.applicationId&&void 0!==d[e.applicationId]})),h=tt.omit(f,(function(e,t,r){return e.applicationId&&void 0!==o[e.applicationId]})),V=tt.omit(f,Object.keys(h)),m=tt.omit(v,Object.keys(S)),z=Object.values(V).map((e=>e.node)),X=Object.values(m).map((e=>e.node));return n.unchanged.push(...c.map((e=>u[e].node))),n.unchanged.push(...c.map((e=>p[e].node))),n.removed.push(...Object.values(h).map((e=>e.node))),n.added.push(...Object.values(S).map((e=>e.node))),z.forEach(((e,t)=>{n.modified.push([z[t],X[t]])})),console.warn(\"Boolean Time -> \",performance.now()-r),Promise.resolve(n)}diffIterative(e,t){var r,n;const i=performance.now(),l=[],a=[],s={unchanged:[],added:[],removed:[],modified:[]},u=this.tree.getRenderTree(e),d=this.tree.getRenderTree(t);let p=u.getRenderableNodes(...Gt),o=d.getRenderableNodes(...Gt);p=p.map((e=>u.getAtomicParent(e))),o=o.map((e=>d.getAtomicParent(e))),p=[...Array.from(new Set(p))],o=[...Array.from(new Set(o))];const c={},v={};this.buildIdMaps(p,c,v);const f={},S={};this.buildIdMaps(o,f,S);for(let e=0;e{s.modified.push([a[t],l[t]])})),console.warn(\"Interative Time -> \",performance.now()-i),Promise.resolve(s)}setDiffTime(e){const t=Math.min(Math.max(1-e,0),1),r=Math.min(Math.max(e,0),1);this.addedMaterials.forEach((e=>{e.opacity=void 0!==e.clampOpacity?Math.min(t,e.clampOpacity):t,e.depthWrite=!(t<.5),e.transparent=e.opacity<1})),this.changedOldMaterials.forEach((e=>{e.opacity=void 0!==e.clampOpacity?Math.min(r,e.clampOpacity):r,e.depthWrite=!(r<.5),e.transparent=e.opacity<1})),this.changedNewMaterials.forEach((e=>{e.opacity=void 0!==e.clampOpacity?Math.min(t,e.clampOpacity):t,e.depthWrite=!(t<.5),e.transparent=e.opacity<1})),this.removedMaterials.forEach((e=>{e.opacity=void 0!==e.clampOpacity?Math.min(r,e.clampOpacity):r,e.depthWrite=!(r<.5),e.transparent=e.opacity<1}))}buildMaterialGroups(e,t,r){const n=performance.now();switch(e){case $n.COLORED:this._materialGroups=this.getColoredMaterialGroups(this.getVisualDiffResult(t));break;case $n.PLAIN:this._materialGroups=this.getPlainMaterialGroups(this.getVisualDiffResult(t),r);break;default:We.error(`Unsupported visual diff mode ${e}`)}return console.warn(\"Material groups -> \",performance.now()-n),this._materialGroups}resetMaterialGroups(){this._materialGroups=null,this.addedMaterials=[],this.changedOldMaterials=[],this.changedNewMaterials=[],this.removedMaterials=[]}getVisualDiffResult(e){const t=this.tree.getRenderTree(),r=e.added.flatMap((e=>t.getRenderViewsForNode(e,e))),n=e.removed.flatMap((e=>t.getRenderViewsForNode(e,e))),i=e.unchanged.flatMap((e=>t.getRenderViewsForNode(e,e))),l=e.modified.flatMap((e=>t.getRenderViewsForNode(e[0],e[0]))).filter((e=>!i.includes(e)&&!n.includes(e))),a=e.modified.flatMap((e=>t.getRenderViewsForNode(e[1],e[1]))).filter((e=>!i.includes(e)&&!r.includes(e)));return{unchanged:i,added:r,removed:n,modifiedOld:l,modifiedNew:a}}getColoredMaterialGroups(e){const t=[{objectIds:[],rvs:e.added.filter((e=>e.geometryType===Kt.MESH||e.geometryType===Kt.LINE)),material:this.addedMaterialMesh},{objectIds:[],rvs:e.modifiedNew.filter((e=>e.geometryType===Kt.MESH||e.geometryType===Kt.LINE)),material:this.changedNewMaterialMesh},{objectIds:[],rvs:e.modifiedOld.filter((e=>e.geometryType===Kt.MESH||e.geometryType===Kt.LINE)),material:this.changedOldMaterialMesh},{objectIds:[],rvs:e.removed.filter((e=>e.geometryType===Kt.MESH||e.geometryType===Kt.LINE)),material:this.removedMaterialMesh},{objectIds:[],rvs:e.added.filter((e=>e.geometryType===Kt.POINT||e.geometryType===Kt.POINT_CLOUD)),material:this.addedMaterialPoint},{objectIds:[],rvs:e.modifiedNew.filter((e=>e.geometryType===Kt.POINT||e.geometryType===Kt.POINT_CLOUD)),material:this.changedNewMaterialPoint},{objectIds:[],rvs:e.modifiedOld.filter((e=>e.geometryType===Kt.POINT||e.geometryType===Kt.POINT_CLOUD)),material:this.changedOldMaterialPoint},{objectIds:[],rvs:e.removed.filter((e=>e.geometryType===Kt.POINT||e.geometryType===Kt.POINT_CLOUD)),material:this.removedMaterialPoint}];return this.addedMaterials.push(this.addedMaterialMesh,this.addedMaterialPoint),this.changedOldMaterials.push(this.changedOldMaterialMesh,this.changedOldMaterialPoint),this.changedNewMaterials.push(this.changedNewMaterialMesh,this.changedNewMaterialPoint),this.removedMaterials.push(this.removedMaterialMesh,this.removedMaterialPoint),t.filter((e=>e.rvs.length>0))}getPlainMaterialGroups(e,t){const r=this.getBatchesSubgroups(e.added,t),n=this.getBatchesSubgroups(e.modifiedOld,t),i=this.getBatchesSubgroups(e.modifiedNew,t),l=this.getBatchesSubgroups(e.removed,t);return this.addedMaterials=r.map((e=>e.material)),this.changedOldMaterials=n.map((e=>e.material)),this.changedNewMaterials=i.map((e=>e.material)),this.removedMaterials=l.map((e=>e.material)),[...r,...n,...i,...l]}getBatchesSubgroups(e,t){const r=[...Array.from(new Set(e.map((e=>e.batchId))))],n=[];for(let i=0;ie.batchId===r[i])),material:l})}return n}}class ti extends ut{get World(){return this.world}get Utils(){return this.utils||(this.utils={screenToNDC:this.speckleRenderer.screenToNDC.bind(this.speckleRenderer),NDCToScreen:this.speckleRenderer.NDCToScreen.bind(this.speckleRenderer)}),this.utils}constructor(t,r=nt){super(),this.tree=new Qn,this.world=new Jr,this.loaders={},this.dynamicallyLoadedDiffResources=[],We.useDefaults(),We.setLevel(r.verbose?We.TRACE:We.ERROR),jt.keepGeometryData=r.keepGeometryData,this.container=t||document.getElementById(\"renderer\"),r.showStats&&(this.stats=Te(),this.container.prepend(this.stats.dom),this.stats.dom.style.position=\"relative\"),this.loaders={},this.startupParams=r,this.clock=new e.Clock,this.inProgressOperations=0,this.cameraHandler=new qt(this),this.speckleRenderer=new wn(this),this.speckleRenderer.create(this.container),window.addEventListener(\"resize\",this.resize.bind(this),!1),this.filteringManager=new rr(this.speckleRenderer,this.tree),this.filteringManager.on(it.FilteringStateSet,(e=>{this.emit(it.FilteringStateSet,e)})),this.propertyManager=new Bn,this.differ=new ei(this.tree),window._V=this,this.sectionBox=new Dn(this),this.sectionBox.disable(),this.on(it.SectionBoxUpdated,(()=>{this.speckleRenderer.updateClippingPlanes(this.sectionBox.planes)})),this.sectionBox.on(Yn,this.speckleRenderer.onSectionBoxDragStart.bind(this.speckleRenderer)),this.sectionBox.on(Fn,this.speckleRenderer.onSectionBoxDragEnd.bind(this.speckleRenderer)),this.frame(),this.resize(),this.on(it.LoadCancelled,(e=>{We.warn(`Cancelled load for ${e}`)}))}getObjects(e){return this.speckleRenderer.getObjects(e)}setSectionBox(e,t){e||(e=this.speckleRenderer.sceneBox),this.sectionBox.setBox(e,t),this.speckleRenderer.updateSectionBoxCapper()}getSectionBoxFromObjects(e){return this.speckleRenderer.boxFromObjects(e)}setSectionBoxFromObjects(e,t){this.setSectionBox(this.getSectionBoxFromObjects(e),t)}getCurrentSectionBox(){return this.sectionBox.getCurrentBox()}resize(){const e=this.container.offsetWidth,t=this.container.offsetHeight;this.speckleRenderer.resize(e,t)}requestRender(){this.speckleRenderer.needsRender=!0,this.speckleRenderer.resetPipeline()}frame(){this.update(),this.render()}update(){var e;const t=this.clock.getDelta();this.speckleRenderer.update(t),null===(e=this.stats)||void 0===e||e.update(),requestAnimationFrame(this.frame.bind(this))}render(){this.speckleRenderer.render()}async init(){this.startupParams.environmentSrc&&$t.getEnvironment(this.startupParams.environmentSrc,this.speckleRenderer.renderer).then((e=>{this.speckleRenderer.indirectIBL=e})).catch((e=>{We.error(e),We.error(\"Fallback to null environment!\")}))}on(e,t){super.on(e,t)}getObjectProperties(e=null,t=!0){return this.propertyManager.getProperties(this.tree,e,t)}selectObjects(e){return new Promise((t=>{t(this.filteringManager.selectObjects(e))}))}resetSelection(){return new Promise((e=>{e(this.filteringManager.resetSelection())}))}hideObjects(e,t=null,r=!1,n=!1){return new Promise((i=>{i(this.filteringManager.hideObjects(e,t,r,n))}))}showObjects(e,t=null,r=!1){return new Promise((n=>{n(this.filteringManager.showObjects(e,t,r))}))}isolateObjects(e,t=null,r=!1,n=!0){return new Promise((i=>{i(this.filteringManager.isolateObjects(e,t,r,n))}))}unIsolateObjects(e,t=null,r=!1){return new Promise((n=>{n(this.filteringManager.unIsolateObjects(e,t,r))}))}highlightObjects(e,t=!1){return new Promise((r=>{r(this.filteringManager.highlightObjects(e,t))}))}resetHighlight(){return new Promise((e=>{e(this.filteringManager.resetHighlight())}))}setColorFilter(e,t=!0){return new Promise((r=>{r(this.filteringManager.setColorFilter(e,t))}))}removeColorFilter(){return new Promise((e=>{e(this.filteringManager.removeColorFilter())}))}setUserObjectColors(e){return new Promise((t=>{t(this.filteringManager.setUserObjectColors(e))}))}resetFilters(){return new Promise((e=>{e(this.filteringManager.reset())}))}async applyFilter(e){}getDataTree(){return this.tree.getDataTree()}getWorldTree(){return this.tree}query(e){return _n.isPointQuery(e)?(_n.DefaultPointQuerySolver.setContext(this.speckleRenderer),_n.DefaultPointQuerySolver.solve(e)):_n.isIntersectionQuery(e)?(_n.DefaultIntersectionQuerySolver.setContext(this.speckleRenderer),_n.DefaultIntersectionQuerySolver.solve(e)):void 0}queryAsync(e){return null}toggleSectionBox(){this.sectionBox.toggle(),this.speckleRenderer.updateSectionBoxCapper()}sectionBoxOff(){this.sectionBox.disable(),this.speckleRenderer.updateSectionBoxCapper()}sectionBoxOn(){this.sectionBox.enable(),this.speckleRenderer.updateSectionBoxCapper()}zoom(e,t,r){this.speckleRenderer.zoom(e,t,r)}setProjectionMode(e){this.cameraHandler.activeCam=e}setOrthoCameraOn(){this.cameraHandler.setOrthoCameraOn(),this.speckleRenderer.resetPipeline(!0)}setPerspectiveCameraOn(){this.cameraHandler.setPerspectiveCameraOn(),this.speckleRenderer.resetPipeline(!0)}toggleCameraProjection(){this.cameraHandler.toggleCameras(),this.speckleRenderer.resetPipeline(!0)}setLightConfiguration(e){this.speckleRenderer.setSunLightConfiguration(e)}getViews(){return this.tree.findAll((e=>{var t;return(null===(t=e.model.renderView)||void 0===t?void 0:t.speckleType)===kt.View3D})).map((e=>({name:e.model.raw.applicationId,id:e.model.id,view:e.model.raw})))}setView(e,t=!0){this.speckleRenderer.setView(e,t)}screenshot(){return new Promise((e=>{const t=this.sectionBox.display.visible;t&&this.sectionBox.displayOff();const r=this.speckleRenderer.renderer.domElement.toDataURL(\"image/png\");t&&this.sectionBox.displayOn(),e(r)}))}explode(e){const t=this.world.worldSize,r=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z);this.speckleRenderer.setExplode(e,r)}async downloadObject(e,t=null,r=!0){const n=new st(this,e,t,r);this.loaders[e]=n,await n.load()}async loadObject(e,t=null,r=!0,n=!0){1==++this.inProgressOperations&&this.emit(it.Busy,!0),await this.downloadObject(e,t,r);let i=performance.now();this.tree.getRenderTree(e).buildRenderTree(),We.log(\"SYNC Tree build time -> \",performance.now()-i),i=performance.now(),await this.speckleRenderer.addRenderTree(e),We.log(\"SYNC batch build time -> \",performance.now()-i),n&&this.zoom(),this.speckleRenderer.resetPipeline(!0),this.emit(it.LoadComplete,e),this.loaders[e].dispose(),delete this.loaders[e],0==--this.inProgressOperations&&this.emit(it.Busy,!1)}async loadObjectAsync(e,t=null,r=!0,n=1,i=!0){1==++this.inProgressOperations&&this.emit(it.Busy,!0),await this.downloadObject(e,t,r);let l=performance.now();const a=await this.tree.getRenderTree(e).buildRenderTreeAsync(n);We.log(\"ASYNC Tree build time -> \",performance.now()-l),a&&(l=performance.now(),await this.speckleRenderer.addRenderTreeAsync(e,n,i),We.log(\"ASYNC batch build time -> \",performance.now()-l),this.speckleRenderer.resetPipeline(!0),this.emit(it.LoadComplete,e)),this.loaders[e].dispose(),delete this.loaders[e],0==--this.inProgressOperations&&this.emit(it.Busy,!1)}async cancelLoad(e,t=!1){this.loaders[e].cancelLoad(),this.tree.getRenderTree(e).cancelBuild(e),this.speckleRenderer.cancelRenderTree(e),t?await this.unloadObject(e):0==--this.inProgressOperations&&this.emit(it.Busy,!1)}async unloadObject(e){try{1==++this.inProgressOperations&&this.emit(it.Busy,!0),delete this.loaders[e],this.speckleRenderer.removeRenderTree(e),this.tree.getRenderTree(e).purge(),this.tree.purge(e)}finally{0==--this.inProgressOperations&&(this.emit(it.Busy,!1),We.warn(`Removed subtree ${e}`),this.emit(it.UnloadComplete,e))}}async unloadAll(){try{1==++this.inProgressOperations&&this.emit(it.Busy,!0);for(const e of Object.keys(this.loaders))delete this.loaders[e];this.filteringManager.reset(),this.tree.root.children.forEach((e=>{this.speckleRenderer.removeRenderTree(e.model.id),this.tree.getRenderTree().purge()})),this.tree.purge()}finally{0==--this.inProgressOperations&&(this.emit(it.Busy,!1),We.warn(\"Removed all subtrees\"),this.emit(it.UnloadAllComplete))}}async diff(e,t,r,n){const i=[];this.dynamicallyLoadedDiffResources=[],this.tree.findId(e)||(i.push(this.loadObjectAsync(e,n,void 0,1)),this.dynamicallyLoadedDiffResources.push(e)),this.tree.findId(t)||(i.push(this.loadObjectAsync(t,n,void 0,1)),this.dynamicallyLoadedDiffResources.push(t)),await Promise.all(i);const l=await this.differ.diff(e,t),a=this.speckleRenderer.pipelineOptions;return a.depthSide=o,this.speckleRenderer.pipelineOptions=a,this.differ.resetMaterialGroups(),this.differ.buildMaterialGroups(r,l,this.speckleRenderer.getBatchMaterials()),this.differ.setDiffTime(0),this.filteringManager.setUserMaterials(this.differ.materialGroups),Promise.resolve(l)}async undiff(){const e=this.speckleRenderer.pipelineOptions;e.depthSide=R,this.speckleRenderer.pipelineOptions=e,this.differ.resetMaterialGroups(),this.filteringManager.removeUserMaterials();const t=[];if(0!==this.dynamicallyLoadedDiffResources.length)for(const e of this.dynamicallyLoadedDiffResources)t.push(this.unloadObject(e));this.dynamicallyLoadedDiffResources=[],await Promise.all(t)}setDiffTime(e,t){this.differ.setDiffTime(t),this.filteringManager.setUserMaterials(this.differ.materialGroups)}setVisualDiffMode(e,t){this.differ.resetMaterialGroups(),this.differ.buildMaterialGroups(t,e,this.speckleRenderer.getBatchMaterials()),this.filteringManager.setUserMaterials(this.differ.materialGroups)}enableMeasurements(e){this.speckleRenderer.measurements.enabled=e}setMeasurementOptions(e){this.speckleRenderer.measurements.options=e}removeMeasurement(){this.speckleRenderer.measurements.removeMeasurement()}dispose(){}}class ri extends ti{getRenderer(){return this.speckleRenderer}requestRenderShadowmap(){this.getRenderer().updateDirectLights()}}export{jr as BatchObject,ri as DebugViewer,lt as DefaultLightConfiguration,nt as DefaultViewerParams,Ln as MeasurementType,Ot as Units,ti as Viewer,it as ViewerEvent,$n as VisualDiffMode,Jr as World,Qn as WorldTree};\n","/**\n * @file This file defines the `useSpeckleStore` store, which is used to manage the state of the Speckle integration in the application.\n * It exports a Pinia store object that contains the state, actions, and getters for the Speckle integration.\n * The store is used to manage the user's authentication status, project details, versions, models, and versions of models.\n * The store also provides methods to interact with the Speckle API, such as logging in, logging out, exchanging access codes, and getting user data.\n * The store is defined using the `defineStore` function from the Pinia library.\n * @see https://pinia.esm.dev/api/define-store.html\n */\n\nimport type {\n\tModelsAndVersions,\n\tObjectParameter,\n\tProjectDetails,\n\tProjectId,\n\tServerInfo,\n\tUser,\n\tVersion,\n\tColorGroup,\n\tModelResponseObject\n} from '@/models/speckle'\nimport router from '@/router'\nimport { logMessageToSentry } from '@/utils/monitoring'\nimport { updateGroupColors } from '@/utils/projectUtils'\nimport { hslToHex } from '@/utils/colorUtils'\nimport {\n\texchangeAccessCode,\n\tgetObjectParameters,\n\tgetProjectVersions,\n\tgetProjectsData,\n\tgetUserData,\n\tnavigateToAuthPage,\n\tspeckleLogOut,\n\tgetLatestModel\n} from '@/utils/speckleUtils' // TODO Is this the right import in the wider structure?\nimport { Viewer } from '@speckle/viewer'\nimport { defineStore } from 'pinia'\nimport type { NestedGroup } from '@/models/filters'\nimport type { GeometryObject } from '@/models/geometryObject'\n\n/**\n * The `useSpeckleStore` is a store that manages the state and actions related to the Speckle integration.\n * It provides access to project details, versions, models, user information, and server information.\n * The store also includes actions for logging in, logging out, updating user data, updating projects,\n * updating project versions, getting objects for a project, and managing custom parameters.\n */\nexport const useSpeckleStore = defineStore({\n\tid: 'speckleStore',\n\tstate: () => {\n\t\treturn {\n\t\t\t/**\n\t\t\t * The project details for the currently selected project.\n\t\t\t * @type {ProjectDetails | null}\n\t\t\t */\n\t\t\tprojectDetails: null as ProjectDetails | null,\n\n\t\t\t/**\n\t\t\t * The currently selected version of the project.\n\t\t\t * @type {Version | null}\n\t\t\t */\n\t\t\tselectedVersion: null as Version | null,\n\n\t\t\t/**\n\t\t\t * The currently loaded project in the speckle store\n\t\t\t */\n\t\t\tselectedProject: null as ProjectId | null,\n\n\t\t\t/**\n\t\t\t * An array of all the projects available to the application on the server\n\t\t\t */\n\t\t\tallProjects: null as ProjectId[] | null,\n\n\t\t\t/**\n\t\t\t * An array of all the versions of the project.\n\t\t\t * @type {Version[] | null}\n\t\t\t */\n\t\t\tallVersions: null as Version[] | null,\n\n\t\t\t/**\n\t\t\t * An array of all the models in the project.\n\t\t\t * @type {string[] | null}\n\t\t\t */\n\t\t\tallModels: null as string[] | null,\n\n\t\t\t/**\n\t\t\t * An object that maps each model to an array of its versions.\n\t\t\t * @type {ModelsAndVersions | null}\n\t\t\t */\n\t\t\tmodelsAndVersions: null as ModelsAndVersions | null,\n\n\t\t\t/**\n\t\t\t * The user object for the currently authenticated user.\n\t\t\t * @type {User | null}\n\t\t\t */\n\t\t\tuser: null as User | null,\n\n\t\t\t/**\n\t\t\t * The server info object for the Speckle server.\n\t\t\t * @type {ServerInfo | null}\n\t\t\t */\n\t\t\tserverInfo: null as ServerInfo | null,\n\n\t\t\t/**\n\t\t\t * Array of specific parameters that are included in the project that the application\n\t\t\t * will get information for the objects from\n\t\t\t * @type {ObjectParameter[] | null}\n\t\t\t */\n\t\t\tcustomParameters: null as ObjectParameter[] | null,\n\n\t\t\t/**\n\t\t\t * The viewer instance for the Speckle viewer.\n\t\t\t * @type {Viewer | null}\n\t\t\t */\n\t\t\tviewer: null as Viewer | null,\n\n\t\t\t/**\n\t\t\t * The currently selected objects from the viewer.\n\t\t\t * @type {SpeckleObject[] | null}\n\t\t\t */\n\t\t\tselectedObjectIds: [] as string[],\n\n\t\t\t/**\n\t\t\t * Current Color groupings for the viewer\n\t\t\t */\n\t\t\tcolorGroups: [] as ColorGroup[],\n\n\t\t\t/**\n\t\t\t * Token for the current user\n\t\t\t */\n\t\t\ttoken: null as string | null,\n\n\t\t\t/**\n\t\t\t * Server URL for the current user\n\t\t\t */\n\t\t\tserverUrl: null as string | null,\n\n\t\t\t/**\n\t\t\t * Hidden objects in the viewer\n\t\t\t */\n\t\t\thiddenObjects: [] as GeometryObject[],\n\n\t\t\t/**\n\t\t\t * Render mode for the app, true for 3D with materials, false for diagram style \n\t\t\t */\n\t\t\trenderMode: true as boolean,\n\n\t\t\t/**\n\t\t\t * Show hidden objects or not, set to hide them as default\n\t\t\t */\n\t\t\tshowHiddenObjects: false as boolean\n\t\t}\n\t},\n\tactions: {\n\t\t/**\n\t\t * The `login` action logs the user into the Speckle integration and redirects them to the authorisation page.\n\t\t * @returns {Promise}\n\t\t */\n\t\tasync login(): Promise {\n\t\t\tnavigateToAuthPage()\n\t\t},\n\n\t\t/**\n\t\t * Logs out the user and clears the state and tokens.\n\t\t * @returns A promise that resolves when the logout process is complete.\n\t\t */\n\t\tasync logout(): Promise {\n\t\t\tthis.$patch((state) => {\n\t\t\t\tstate.user = null\n\t\t\t\tstate.serverInfo = null\n\t\t\t\tstate.projectDetails = null\n\t\t\t\tstate.selectedVersion = null\n\t\t\t})\n\t\t\t// Wipe the tokens\n\t\t\tspeckleLogOut()\n\t\t\trouter.push('/login')\n\t\t},\n\n\t\t/**\n\t\t * Exchanges the provided access code for tokens and saves them to the store if necessary.\n\t\t * @param accessCode The access code to exchange.\n\t\t * @returns A promise that resolves when the access code is exchanged and tokens are saved.\n\t\t */\n\t\tasync exchangeAccessCodes(accessCode: string): Promise {\n\t\t\t// Here, you can save the tokens to the store if necessary.\n\t\t\treturn exchangeAccessCode(accessCode)\n\t\t},\n\n\t\t/**\n\t\t * Updates the user data by fetching it from the server.\n\t\t * @returns A Promise that resolves to void.\n\t\t */\n\t\tasync updateUser(): Promise {\n\t\t\ttry {\n\t\t\t\tconst json = await getUserData()\n\t\t\t\tconst data = json.data\n\n\t\t\t\tthis.$patch((state) => {\n\t\t\t\t\tstate.user = data.user\n\t\t\t\t\tstate.serverInfo = data.serverInfo\n\t\t\t\t})\n\t\t\t} catch (err: any) {\n\t\t\t\tlogMessageToSentry(err as string, 'info')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Updates the projects by fetching the latest data from the server.\n\t\t * Clears the existing projects list and populates it with the updated data.\n\t\t * @returns A promise that resolves when the projects are successfully updated.\n\t\t */\n\t\tasync updateProjects(): Promise {\n\t\t\ttry {\n\t\t\t\tconst json = await getProjectsData()\n\t\t\t\tconst data = json.data\n\t\t\n\t\t\t\tconst projects: ProjectId[] = []\n\t\t\n\t\t\t\tfor (const el of data.streams.items) {\n\t\t\t\t\tconst model: ModelResponseObject = await getLatestModel(el.id)\n\n\t\t\n\t\t\t\t\tconst proj: ProjectId = {\n\t\t\t\t\t\tname: el.name,\n\t\t\t\t\t\tid: el.id,\n\t\t\t\t\t\tupdatedAt: el.updatedAt,\n\t\t\t\t\t\tlatestModelId: model.data.project.models.items[0].id\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\tprojects.push(proj)\n\t\t\t\t}\n\t\t\n\t\t\t\t// Directly assign the array to your state, no $patch needed\n\t\t\t\tthis.allProjects = projects\n\t\t\t} catch (err: any) {\n\t\t\t\tlogMessageToSentry(err as string, 'info')\n\t\t\t}\n\t\t},\n\t\t\n\n\t\t/**\n\t\t * The `updateProjectVersions` action updates the project versions for the specified project.\n\t\t * @param {string} projectId - The ID of the project to get versions for.\n\t\t * @param {number} limit - The maximum number of versions to get.\n\t\t * @param {Date | null} cursor - The cursor to use for pagination.\n\t\t * @returns {Promise}\n\t\t */\n\t\tasync updateProjectVersions(\n\t\t\tprojectId: string,\n\t\t\tlimit: number,\n\t\t\tcursor: Date | null\n\t\t): Promise {\n\t\t\ttry {\n\t\t\t\tconst response = await getProjectVersions(projectId, limit, cursor)\n\t\t\t\tconst data = response.data\n\t\t\t\tconst projDet: ProjectDetails = data\n\n\t\t\t\tconst selectedProj: ProjectId = {\n\t\t\t\t\tname: projDet.stream.name,\n\t\t\t\t\tid: projDet.stream.id,\n\t\t\t\t\tupdatedAt: projDet.stream.updatedAt\n\t\t\t\t}\n\n\t\t\t\tlet allModels: string[]\n\t\t\t\tconst allVers: Version[] = []\n\t\t\t\tconst modelVers: ModelsAndVersions = {}\n\n\t\t\t\t// Get versions for this project, and store them in an array.\n\t\t\t\tif (\n\t\t\t\t\tprojDet.stream.commits?.items &&\n\t\t\t\t\tprojDet.stream.commits?.items.length > 0\n\t\t\t\t) {\n\t\t\t\t\tprojDet.stream.commits?.items?.forEach((version) => {\n\t\t\t\t\t\tallVers.push(version)\n\n\t\t\t\t\t\tconst { branchName } = version\n\t\t\t\t\t\tif (!modelVers[branchName]) {\n\t\t\t\t\t\t\tmodelVers[branchName] = []\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmodelVers[branchName].push(version)\n\t\t\t\t\t})\n\n\t\t\t\t\t// Get the list of all models if available, returning the branch name.\n\t\t\t\t\tallModels = projDet.stream.commits?.items?.map(function (version) {\n\t\t\t\t\t\treturn version?.branchName\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\t// Use this.$patch instead of commit to update state\n\t\t\t\tthis.$patch((state) => {\n\t\t\t\t\tstate.selectedProject = selectedProj\n\t\t\t\t\tstate.projectDetails = projDet\n\t\t\t\t\tstate.allVersions = allVers\n\t\t\t\t\tstate.allModels = allModels\n\t\t\t\t\tstate.modelsAndVersions = modelVers\n\t\t\t\t})\n\t\t\t} catch (err: any) {\n\t\t\t\tlogMessageToSentry(err as string, 'info')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Get all objects for the currently loaded project and the selected version\n\t\t * @param projectId projectId to get objects for\n\t\t * @returns\n\t\t */\n\t\tasync getObjects(): Promise {\n\t\t\ttry {\n\t\t\t\tif (this.selectedProject && this.selectedVersion) {\n\t\t\t\t\tconst objs = await getObjectParameters(\n\t\t\t\t\t\tthis.selectedProject.id,\n\t\t\t\t\t\tthis.selectedVersion.referencedObject,\n\t\t\t\t\t\tthis.selectedVersion.sourceApplication\n\t\t\t\t\t)\n\t\t\t\t\treturn objs\n\t\t\t\t} else {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t} catch (err: any) {\n\t\t\t\tlogMessageToSentry(err as string, 'info')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The `setProjectDetails` action sets the project details for the currently selected project.\n\t\t * @param {ProjectDetails} project - The project details to set.\n\t\t * @returns {void}\n\t\t */\n\t\tsetProjectDetails(project: ProjectDetails): void {\n\t\t\tthis.projectDetails = project\n\t\t},\n\n\t\t/**\n\t\t * The `setAllVersions` action sets the array of all versions of the project.\n\t\t * @param {Version[]} allVer - The array of all versions to set.\n\t\t * @returns {void}\n\t\t */\n\t\tsetAllVersions(allVer: Version[]): void {\n\t\t\tthis.allVersions = allVer\n\t\t},\n\n\t\t/**\n\t\t * The `setAllModels` action sets the array of all models in the project.\n\t\t * @param {string[]} allModels - The array of all models to set.\n\t\t * @returns {void}\n\t\t */\n\t\tsetAllModels(allModels: string[]): void {\n\t\t\tthis.allModels = allModels\n\t\t},\n\n\t\t/**\n\t\t * The `setModelsAndVersions` action sets the object that maps each model to an array of its versions.\n\t\t * @param {ModelsAndVersions} modelVer - The object to set.\n\t\t * @returns {void}\n\t\t */\n\t\tsetModelsAndVersions(modelVer: ModelsAndVersions): void {\n\t\t\tthis.modelsAndVersions = modelVer\n\t\t},\n\n\t\t/**\n\t\t * Sets the currently selected version in the store\n\t\t * @param version\n\t\t */\n\t\tsetSelectedVersion(version: Version) {\n\t\t\tthis.selectedVersion = version\n\t\t},\n\n\t\t/**\n\t\t * Sets the viewer instance.\n\t\t * @param viewerInstance The viewer instance to set.\n\t\t */\n\t\tsetViewerInstance(viewerInstance: Viewer) {\n\t\t\tthis.viewer = viewerInstance\n\t\t},\n\n\t\t/**\n\t\t * Sets the currently selected objects.\n\t\t * @param objects - An array of object IDs to be added to the selectedObjectIds array.\n\t\t */\n\t\tsetCurrentlySelectedObject(objects: string[]) {\n\t\t\tthis.selectedObjectIds.push(...objects)\n\t\t},\n\n\t\t/**\n\t\t * Calculates the group colors for the viewer based on nested groups tree\n\t\t * @param refTree \n\t\t */\n\t\tcalculateGroupColors(tree: NestedGroup[]) {\n\t\t\tupdateGroupColors(tree)\n\t\t\tconst groups = []\n\t\t\ttree.forEach(element => {\n\t\t\t\t// Extract the hsl values from the color string using regex\n\t\t\t\tconst hslRegex = /hsl\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%\\)/\n\t\t\t\tlet color\n\t\t\t\tif (!element.color) {\n\t\t\t\t\tcolor = hslToHex(151, 100, 50)\n\t\t\t\t} else {\n\t\t\t\t\tconst match = element.color.match(hslRegex)\n\t\t\t\t\tconst [, hue, saturation, lightness] = match.map(str => parseInt(str))\n\t\t\t\t\tcolor = hslToHex(hue, saturation, lightness)\n\t\t\t\t}\n\t\t\t\t// Create group object with hex color\n\t\t\t\tconst group = {\n\t\t\t\t\tobjectIds: element.objects.map(obj => obj.URI),\n\t\t\t\t\tcolor: color\n\t\t\t\t}\n\t\t\t\tgroups.push(group)\n\t\t\t})\n\t\t\tthis.setColorGroups(groups)\n\t\t},\n\n\t\t/**\n\t\t * Set colorGroups overriding the last, used for coherent colors in graphics and setting the colors in the viewer\n\t\t * @param colorGroups \n\t\t */\n\t\tsetColorGroups(colorGroups: ColorGroup[]) {\n\t\t\tthis.colorGroups = colorGroups\n\t\t\tif (!this.renderMode)\n\t\t\t\tthis.viewer?.setUserObjectColors(colorGroups)\n\t\t},\n\n\t\t/**\n\t\t * Set token for the current user\n\t\t * @param token \n\t\t */\n\t\tsetToken(token: string) {\n\t\t\tthis.token = token\n\t\t},\n\n\t\t/**\n\t\t * Set serverUrl for the current user\n\t\t * @param serverUrl \n\t\t */\n\t\tsetServerUrl(serverUrl: string) {\n\t\t\tthis.serverUrl = serverUrl\n\t\t},\n\n\t\t/**\n\t\t * Add new parameter to list of parameters to include in fetching of speckle objects\n\t\t * @param parameter\n\t\t */\n\t\taddCustomParameter(parameter: ObjectParameter) {\n\t\t\tif (!this.parameterNameCheck(parameter.name)) {\n\t\t\t\tif (this.customParameters) this.customParameters.push(parameter)\n\t\t\t\telse this.customParameters = [parameter]\n\t\t\t} else {\n\t\t\t\tconsole.warn('Duplicate name found. Object not added.')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Adds a geometry object to the hidden objects in the project.\n\t\t * @param object \n\t\t */\n\t\taddHiddenObject(object: GeometryObject) {\n\t\t\tthis.hiddenObjects.push(object)\n\t\t},\n\n\t\t/**\n\t\t * Sets the hidden objects in the project, this is checked when rendering the objects\n\t\t * @param objects \n\t\t */\n\t\tsetHiddenObjects(objects: GeometryObject[]) {\n\t\t\tthis.hiddenObjects = objects\n\t\t},\n\n\t\t/**\n\t\t * Checks a if a name already exists within objects in parameters\n\t\t * @param newName name to check\n\t\t * @returns true if its already in parameters, false if not\n\t\t */\n\t\tparameterNameCheck(newName: string): boolean {\n\t\t\tif (this.customParameters)\n\t\t\t\treturn this.customParameters.some((obj) => obj.name === newName)\n\t\t\telse return false\n\t\t},\n\n\t\t/**\n\t\t * Removes a customParameter on its name\n\t\t * @param name name to remove, will never be duplicate since we check\n\t\t */\n\t\tremoveCustomParameter(name: string) {\n\t\t\tif (this.customParameters)\n\t\t\t\tthis.customParameters = this.customParameters?.filter(\n\t\t\t\t\t(item) => item.name !== name\n\t\t\t\t)\n\t\t},\n\n\t\tisolateObjects(objectIds: string[]) {\n\t\t\tthis.viewer?.resetFilters()\n\t\t\tthis.viewer?.isolateObjects(objectIds, null, true, true)\n\t\t\t\n\t\t\tif (objectIds.length > 0 && !this.renderMode) {\n\t\t\t\t//Find all color groups relevant for ids\n\t\t\t\tconst colorMap = new Map();\n\n\t\t\t\t// Create a map from object ID to color\n\t\t\t\tthis.colorGroups.forEach(group => {\n\t\t\t\t\tgroup.objectIds.forEach(id => {\n\t\t\t\t\t\tcolorMap.set(id, group.color)\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t\t\tconst relevantColorGroups = objectIds.map(id => ({\n\t\t\t\t\tobjectIds: [id],\n\t\t\t\t\tcolor: colorMap.get(id)\n\t\t\t\t})).filter(group => group.color !== undefined)\n\t\t\t\t\n\t\t\t\tthis.viewer?.setUserObjectColors(relevantColorGroups)\n\t\t\t} else {\n\t\t\t\tif (!this.renderMode)\n\t\t\t\t\tthis.viewer?.setUserObjectColors(this.colorGroups)\n\t\t\t\t//if (!this.showHiddenObjects)\n\t\t\t\t\t//this.viewer?.hideObjects(this.hiddenObjects.map(obj => obj.id), null, false, false)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Hides all unusedObjects in the viewer\n\t\t * @param objectUrls \n\t\t */\n\t\thideUnusedObjects(objectIds: string[]) {\n\t\t\tif (!this.showHiddenObjects)\n\t\t\t\tthis.viewer?.hideObjects(objectIds, null, false, false)\n\t\t},\n\n\t\t/**\n\t\t * Reset filters and colors to base state\n\t\t */\n\t\tasync resetUnusedObjects() {\n\t\t\tthis.viewer?.resetFilters()\n\t\t\tif (!this.renderMode)\n\t\t\t\tthis.viewer?.setUserObjectColors(this.colorGroups)\n\t\t},\n\n\t\t/**\n\t\t * Toggle rendering mode on the app\n\t\t */\n\t\ttoggleRenderMode() {\n\t\t\tthis.renderMode = !this.renderMode\n\t\t\tthis.resetUnusedObjects()\n\t\t\t//This is just to refresh the viewer\n\t\t\tthis.viewer?.resize()\n\t\t},\n\n\t\t/**\n\t\t * Toggle showing hidden objects in the viewer\n\t\t */\n\t\ttoggleHiddenObjects() {\n\t\t\tthis.showHiddenObjects = !this.showHiddenObjects\n\t\t\tthis.resetUnusedObjects()\n\t\t\tif (!this.showHiddenObjects)\n\t\t\t\tthis.viewer?.hideObjects(this.hiddenObjects.map(obj => obj.id), null, false, false)\n\t\t\t//This is just to refresh the viewer\n\t\t\tthis.viewer?.resize()\n\t\t}\n\t},\n\n\tgetters: {\n\t\t/**\n\t\t * The `projectDetails` getter returns the project details for the currently selected project.\n\t\t * @returns {ProjectDetails | null}\n\t\t */\n\t\tgetProjectDetails: (state): ProjectDetails | null => state.projectDetails,\n\n\t\t/**\n\t\t * The `selectedVersion` getter returns the currently selected version of the project.\n\t\t * @returns {Version | null}\n\t\t */\n\t\tgetSelectedVersion: (state): Version | null => state.selectedVersion,\n\n\t\t/**\n\t\t * The `allVersions` getter returns an array of all the versions of the project.\n\t\t * @returns {Version[] | null}\n\t\t */\n\t\tgetAllVersions: (state): Version[] | null => state.allVersions,\n\n\t\t/**\n\t\t * The `allModels` getter returns an array of all the models in the project.\n\t\t * @returns {string[] | null}\n\t\t */\n\t\tgetAllModels: (state): string[] | null => state.allModels,\n\n\t\t/**\n\t\t * The `modelsAndVersions` getter returns an object that maps each model to an array of its versions.\n\t\t * @returns {ModelsAndVersions | null}\n\t\t */\n\t\tgetModelsAndVersions: (state): ModelsAndVersions | null =>\n\t\t\tstate.modelsAndVersions,\n\n\t\t/**\n\t\t * The `isAuthenticated` getter returns a boolean indicating whether the user is authenticated.\n\t\t * @returns {boolean}\n\t\t */\n\t\tisAuthenticated: (state): boolean => state.user !== null,\n\n\t\t/**\n\t\t * The `getUserInfo` getter returns the user object for the currently authenticated user.\n\t\t * @returns {User | null}\n\t\t */\n\t\tgetUserInfo: (state): User | null => state.user,\n\n\t\t/**\n\t\t * The `getProjectsInfo` getter returns all projects available to the applications\n\t\t * @returns {ProjectId[] | null}\n\t\t */\n\t\tgetProjectsInfo: (state): ProjectId[] | null => state.allProjects,\n\n\t\t/**\n\t\t * Returns a list of all customParameters for this stream\n\t\t * @returns {ObjectParameter[] | null}\n\t\t */\n\t\tgetCustomParameters: (state): ObjectParameter[] | null =>\n\t\t\tstate.customParameters,\n\n\t\t/**\n\t\t * The `getViewerInstance` getter returns the viewer instance.\n\t\t * @returns {Viewer | null}\n\t\t */\n\t\tgetViewerInstance: (state): Viewer => state.viewer as Viewer,\n\n\t\t/**\n\t\t * Returns the currently selected object ids\n\t\t * @returns {string[]}\n\t\t */\n\t\tgetCurrentSelectedObjectIDs: (state): string[] => state.selectedObjectIds,\n\n\t\t/**\n\t\t * Returns the currently selected color groups\n\t\t * @returns {ColorGroup[]}\n\t\t */\n\t\tgetColorGroups: (state): ColorGroup[] => state.colorGroups\n\t}\n})\n","/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Firebase constants. Some of these (@defines) can be overridden at compile-time.\r\n */\r\nconst CONSTANTS = {\r\n /**\r\n * @define {boolean} Whether this is the client Node.js SDK.\r\n */\r\n NODE_CLIENT: false,\r\n /**\r\n * @define {boolean} Whether this is the Admin Node.js SDK.\r\n */\r\n NODE_ADMIN: false,\r\n /**\r\n * Firebase SDK Version\r\n */\r\n SDK_VERSION: '${JSCORE_VERSION}'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Throws an error if the provided assertion is falsy\r\n */\r\nconst assert = function (assertion, message) {\r\n if (!assertion) {\r\n throw assertionError(message);\r\n }\r\n};\r\n/**\r\n * Returns an Error object suitable for throwing.\r\n */\r\nconst assertionError = function (message) {\r\n return new Error('Firebase Database (' +\r\n CONSTANTS.SDK_VERSION +\r\n ') INTERNAL ASSERT FAILED: ' +\r\n message);\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst stringToByteArray$1 = function (str) {\r\n // TODO(user): Use native implementations if/when available\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if ((c & 0xfc00) === 0xd800 &&\r\n i + 1 < str.length &&\r\n (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00) {\r\n // Surrogate Pair\r\n c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Turns an array of numbers into the string given by the concatenation of the\r\n * characters to which the numbers correspond.\r\n * @param bytes Array of numbers representing characters.\r\n * @return Stringification of the array.\r\n */\r\nconst byteArrayToString = function (bytes) {\r\n // TODO(user): Use native implementations if/when available\r\n const out = [];\r\n let pos = 0, c = 0;\r\n while (pos < bytes.length) {\r\n const c1 = bytes[pos++];\r\n if (c1 < 128) {\r\n out[c++] = String.fromCharCode(c1);\r\n }\r\n else if (c1 > 191 && c1 < 224) {\r\n const c2 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));\r\n }\r\n else if (c1 > 239 && c1 < 365) {\r\n // Surrogate Pair\r\n const c2 = bytes[pos++];\r\n const c3 = bytes[pos++];\r\n const c4 = bytes[pos++];\r\n const u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -\r\n 0x10000;\r\n out[c++] = String.fromCharCode(0xd800 + (u >> 10));\r\n out[c++] = String.fromCharCode(0xdc00 + (u & 1023));\r\n }\r\n else {\r\n const c2 = bytes[pos++];\r\n const c3 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\r\n }\r\n }\r\n return out.join('');\r\n};\r\n// We define it as an object literal instead of a class because a class compiled down to es5 can't\r\n// be treeshaked. https://github.com/rollup/rollup/issues/1691\r\n// Static lookup maps, lazily populated by init_()\r\nconst base64 = {\r\n /**\r\n * Maps bytes to characters.\r\n */\r\n byteToCharMap_: null,\r\n /**\r\n * Maps characters to bytes.\r\n */\r\n charToByteMap_: null,\r\n /**\r\n * Maps bytes to websafe characters.\r\n * @private\r\n */\r\n byteToCharMapWebSafe_: null,\r\n /**\r\n * Maps websafe characters to bytes.\r\n * @private\r\n */\r\n charToByteMapWebSafe_: null,\r\n /**\r\n * Our default alphabet, shared between\r\n * ENCODED_VALS and ENCODED_VALS_WEBSAFE\r\n */\r\n ENCODED_VALS_BASE: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789',\r\n /**\r\n * Our default alphabet. Value 64 (=) is special; it means \"nothing.\"\r\n */\r\n get ENCODED_VALS() {\r\n return this.ENCODED_VALS_BASE + '+/=';\r\n },\r\n /**\r\n * Our websafe alphabet.\r\n */\r\n get ENCODED_VALS_WEBSAFE() {\r\n return this.ENCODED_VALS_BASE + '-_.';\r\n },\r\n /**\r\n * Whether this browser supports the atob and btoa functions. This extension\r\n * started at Mozilla but is now implemented by many browsers. We use the\r\n * ASSUME_* variables to avoid pulling in the full useragent detection library\r\n * but still allowing the standard per-browser compilations.\r\n *\r\n */\r\n HAS_NATIVE_SUPPORT: typeof atob === 'function',\r\n /**\r\n * Base64-encode an array of bytes.\r\n *\r\n * @param input An array of bytes (numbers with\r\n * value in [0, 255]) to encode.\r\n * @param webSafe Boolean indicating we should use the\r\n * alternative alphabet.\r\n * @return The base64 encoded string.\r\n */\r\n encodeByteArray(input, webSafe) {\r\n if (!Array.isArray(input)) {\r\n throw Error('encodeByteArray takes an array as a parameter');\r\n }\r\n this.init_();\r\n const byteToCharMap = webSafe\r\n ? this.byteToCharMapWebSafe_\r\n : this.byteToCharMap_;\r\n const output = [];\r\n for (let i = 0; i < input.length; i += 3) {\r\n const byte1 = input[i];\r\n const haveByte2 = i + 1 < input.length;\r\n const byte2 = haveByte2 ? input[i + 1] : 0;\r\n const haveByte3 = i + 2 < input.length;\r\n const byte3 = haveByte3 ? input[i + 2] : 0;\r\n const outByte1 = byte1 >> 2;\r\n const outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);\r\n let outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6);\r\n let outByte4 = byte3 & 0x3f;\r\n if (!haveByte3) {\r\n outByte4 = 64;\r\n if (!haveByte2) {\r\n outByte3 = 64;\r\n }\r\n }\r\n output.push(byteToCharMap[outByte1], byteToCharMap[outByte2], byteToCharMap[outByte3], byteToCharMap[outByte4]);\r\n }\r\n return output.join('');\r\n },\r\n /**\r\n * Base64-encode a string.\r\n *\r\n * @param input A string to encode.\r\n * @param webSafe If true, we should use the\r\n * alternative alphabet.\r\n * @return The base64 encoded string.\r\n */\r\n encodeString(input, webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\r\n return btoa(input);\r\n }\r\n return this.encodeByteArray(stringToByteArray$1(input), webSafe);\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * @param input to decode.\r\n * @param webSafe True if we should use the\r\n * alternative alphabet.\r\n * @return string representing the decoded value.\r\n */\r\n decodeString(input, webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\r\n return atob(input);\r\n }\r\n return byteArrayToString(this.decodeStringToByteArray(input, webSafe));\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * In base-64 decoding, groups of four characters are converted into three\r\n * bytes. If the encoder did not apply padding, the input length may not\r\n * be a multiple of 4.\r\n *\r\n * In this case, the last group will have fewer than 4 characters, and\r\n * padding will be inferred. If the group has one or two characters, it decodes\r\n * to one byte. If the group has three characters, it decodes to two bytes.\r\n *\r\n * @param input Input to decode.\r\n * @param webSafe True if we should use the web-safe alphabet.\r\n * @return bytes representing the decoded value.\r\n */\r\n decodeStringToByteArray(input, webSafe) {\r\n this.init_();\r\n const charToByteMap = webSafe\r\n ? this.charToByteMapWebSafe_\r\n : this.charToByteMap_;\r\n const output = [];\r\n for (let i = 0; i < input.length;) {\r\n const byte1 = charToByteMap[input.charAt(i++)];\r\n const haveByte2 = i < input.length;\r\n const byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0;\r\n ++i;\r\n const haveByte3 = i < input.length;\r\n const byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n const haveByte4 = i < input.length;\r\n const byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {\r\n throw new DecodeBase64StringError();\r\n }\r\n const outByte1 = (byte1 << 2) | (byte2 >> 4);\r\n output.push(outByte1);\r\n if (byte3 !== 64) {\r\n const outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2);\r\n output.push(outByte2);\r\n if (byte4 !== 64) {\r\n const outByte3 = ((byte3 << 6) & 0xc0) | byte4;\r\n output.push(outByte3);\r\n }\r\n }\r\n }\r\n return output;\r\n },\r\n /**\r\n * Lazy static initialization function. Called before\r\n * accessing any of the static map variables.\r\n * @private\r\n */\r\n init_() {\r\n if (!this.byteToCharMap_) {\r\n this.byteToCharMap_ = {};\r\n this.charToByteMap_ = {};\r\n this.byteToCharMapWebSafe_ = {};\r\n this.charToByteMapWebSafe_ = {};\r\n // We want quick mappings back and forth, so we precompute two maps.\r\n for (let i = 0; i < this.ENCODED_VALS.length; i++) {\r\n this.byteToCharMap_[i] = this.ENCODED_VALS.charAt(i);\r\n this.charToByteMap_[this.byteToCharMap_[i]] = i;\r\n this.byteToCharMapWebSafe_[i] = this.ENCODED_VALS_WEBSAFE.charAt(i);\r\n this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i]] = i;\r\n // Be forgiving when decoding and correctly decode both encodings.\r\n if (i >= this.ENCODED_VALS_BASE.length) {\r\n this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i)] = i;\r\n this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i)] = i;\r\n }\r\n }\r\n }\r\n }\r\n};\r\n/**\r\n * An error encountered while decoding base64 string.\r\n */\r\nclass DecodeBase64StringError extends Error {\r\n constructor() {\r\n super(...arguments);\r\n this.name = 'DecodeBase64StringError';\r\n }\r\n}\r\n/**\r\n * URL-safe base64 encoding\r\n */\r\nconst base64Encode = function (str) {\r\n const utf8Bytes = stringToByteArray$1(str);\r\n return base64.encodeByteArray(utf8Bytes, true);\r\n};\r\n/**\r\n * URL-safe base64 encoding (without \".\" padding in the end).\r\n * e.g. Used in JSON Web Token (JWT) parts.\r\n */\r\nconst base64urlEncodeWithoutPadding = function (str) {\r\n // Use base64url encoding and remove padding in the end (dot characters).\r\n return base64Encode(str).replace(/\\./g, '');\r\n};\r\n/**\r\n * URL-safe base64 decoding\r\n *\r\n * NOTE: DO NOT use the global atob() function - it does NOT support the\r\n * base64Url variant encoding.\r\n *\r\n * @param str To be decoded\r\n * @return Decoded result, if possible\r\n */\r\nconst base64Decode = function (str) {\r\n try {\r\n return base64.decodeString(str, true);\r\n }\r\n catch (e) {\r\n console.error('base64Decode failed: ', e);\r\n }\r\n return null;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Do a deep-copy of basic JavaScript Objects or Arrays.\r\n */\r\nfunction deepCopy(value) {\r\n return deepExtend(undefined, value);\r\n}\r\n/**\r\n * Copy properties from source to target (recursively allows extension\r\n * of Objects and Arrays). Scalar values in the target are over-written.\r\n * If target is undefined, an object of the appropriate type will be created\r\n * (and returned).\r\n *\r\n * We recursively copy all child properties of plain Objects in the source- so\r\n * that namespace- like dictionaries are merged.\r\n *\r\n * Note that the target can be a function, in which case the properties in\r\n * the source Object are copied onto it as static properties of the Function.\r\n *\r\n * Note: we don't merge __proto__ to prevent prototype pollution\r\n */\r\nfunction deepExtend(target, source) {\r\n if (!(source instanceof Object)) {\r\n return source;\r\n }\r\n switch (source.constructor) {\r\n case Date:\r\n // Treat Dates like scalars; if the target date object had any child\r\n // properties - they will be lost!\r\n const dateValue = source;\r\n return new Date(dateValue.getTime());\r\n case Object:\r\n if (target === undefined) {\r\n target = {};\r\n }\r\n break;\r\n case Array:\r\n // Always copy the array source and overwrite the target.\r\n target = [];\r\n break;\r\n default:\r\n // Not a plain Object - treat it as a scalar.\r\n return source;\r\n }\r\n for (const prop in source) {\r\n // use isValidKey to guard against prototype pollution. See https://snyk.io/vuln/SNYK-JS-LODASH-450202\r\n if (!source.hasOwnProperty(prop) || !isValidKey(prop)) {\r\n continue;\r\n }\r\n target[prop] = deepExtend(target[prop], source[prop]);\r\n }\r\n return target;\r\n}\r\nfunction isValidKey(key) {\r\n return key !== '__proto__';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Polyfill for `globalThis` object.\r\n * @returns the `globalThis` object for the given environment.\r\n * @public\r\n */\r\nfunction getGlobal() {\r\n if (typeof self !== 'undefined') {\r\n return self;\r\n }\r\n if (typeof window !== 'undefined') {\r\n return window;\r\n }\r\n if (typeof global !== 'undefined') {\r\n return global;\r\n }\r\n throw new Error('Unable to locate global object.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst getDefaultsFromGlobal = () => getGlobal().__FIREBASE_DEFAULTS__;\r\n/**\r\n * Attempt to read defaults from a JSON string provided to\r\n * process(.)env(.)__FIREBASE_DEFAULTS__ or a JSON file whose path is in\r\n * process(.)env(.)__FIREBASE_DEFAULTS_PATH__\r\n * The dots are in parens because certain compilers (Vite?) cannot\r\n * handle seeing that variable in comments.\r\n * See https://github.com/firebase/firebase-js-sdk/issues/6838\r\n */\r\nconst getDefaultsFromEnvVariable = () => {\r\n if (typeof process === 'undefined' || typeof process.env === 'undefined') {\r\n return;\r\n }\r\n const defaultsJsonString = process.env.__FIREBASE_DEFAULTS__;\r\n if (defaultsJsonString) {\r\n return JSON.parse(defaultsJsonString);\r\n }\r\n};\r\nconst getDefaultsFromCookie = () => {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n let match;\r\n try {\r\n match = document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/);\r\n }\r\n catch (e) {\r\n // Some environments such as Angular Universal SSR have a\r\n // `document` object but error on accessing `document.cookie`.\r\n return;\r\n }\r\n const decoded = match && base64Decode(match[1]);\r\n return decoded && JSON.parse(decoded);\r\n};\r\n/**\r\n * Get the __FIREBASE_DEFAULTS__ object. It checks in order:\r\n * (1) if such an object exists as a property of `globalThis`\r\n * (2) if such an object was provided on a shell environment variable\r\n * (3) if such an object exists in a cookie\r\n * @public\r\n */\r\nconst getDefaults = () => {\r\n try {\r\n return (getDefaultsFromGlobal() ||\r\n getDefaultsFromEnvVariable() ||\r\n getDefaultsFromCookie());\r\n }\r\n catch (e) {\r\n /**\r\n * Catch-all for being unable to get __FIREBASE_DEFAULTS__ due\r\n * to any environment case we have not accounted for. Log to\r\n * info instead of swallowing so we can find these unknown cases\r\n * and add paths for them if needed.\r\n */\r\n console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e}`);\r\n return;\r\n }\r\n};\r\n/**\r\n * Returns emulator host stored in the __FIREBASE_DEFAULTS__ object\r\n * for the given product.\r\n * @returns a URL host formatted like `127.0.0.1:9999` or `[::1]:4000` if available\r\n * @public\r\n */\r\nconst getDefaultEmulatorHost = (productName) => { var _a, _b; return (_b = (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.emulatorHosts) === null || _b === void 0 ? void 0 : _b[productName]; };\r\n/**\r\n * Returns emulator hostname and port stored in the __FIREBASE_DEFAULTS__ object\r\n * for the given product.\r\n * @returns a pair of hostname and port like `[\"::1\", 4000]` if available\r\n * @public\r\n */\r\nconst getDefaultEmulatorHostnameAndPort = (productName) => {\r\n const host = getDefaultEmulatorHost(productName);\r\n if (!host) {\r\n return undefined;\r\n }\r\n const separatorIndex = host.lastIndexOf(':'); // Finding the last since IPv6 addr also has colons.\r\n if (separatorIndex <= 0 || separatorIndex + 1 === host.length) {\r\n throw new Error(`Invalid host ${host} with no separate hostname and port!`);\r\n }\r\n // eslint-disable-next-line no-restricted-globals\r\n const port = parseInt(host.substring(separatorIndex + 1), 10);\r\n if (host[0] === '[') {\r\n // Bracket-quoted `[ipv6addr]:port` => return \"ipv6addr\" (without brackets).\r\n return [host.substring(1, separatorIndex - 1), port];\r\n }\r\n else {\r\n return [host.substring(0, separatorIndex), port];\r\n }\r\n};\r\n/**\r\n * Returns Firebase app config stored in the __FIREBASE_DEFAULTS__ object.\r\n * @public\r\n */\r\nconst getDefaultAppConfig = () => { var _a; return (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.config; };\r\n/**\r\n * Returns an experimental setting on the __FIREBASE_DEFAULTS__ object (properties\r\n * prefixed by \"_\")\r\n * @public\r\n */\r\nconst getExperimentalSetting = (name) => { var _a; return (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a[`_${name}`]; };\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass Deferred {\r\n constructor() {\r\n this.reject = () => { };\r\n this.resolve = () => { };\r\n this.promise = new Promise((resolve, reject) => {\r\n this.resolve = resolve;\r\n this.reject = reject;\r\n });\r\n }\r\n /**\r\n * Our API internals are not promisified and cannot because our callback APIs have subtle expectations around\r\n * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback\r\n * and returns a node-style callback which will resolve or reject the Deferred's promise.\r\n */\r\n wrapCallback(callback) {\r\n return (error, value) => {\r\n if (error) {\r\n this.reject(error);\r\n }\r\n else {\r\n this.resolve(value);\r\n }\r\n if (typeof callback === 'function') {\r\n // Attaching noop handler just in case developer wasn't expecting\r\n // promises\r\n this.promise.catch(() => { });\r\n // Some of our callbacks don't expect a value and our own tests\r\n // assert that the parameter length is 1\r\n if (callback.length === 1) {\r\n callback(error);\r\n }\r\n else {\r\n callback(error, value);\r\n }\r\n }\r\n };\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction createMockUserToken(token, projectId) {\r\n if (token.uid) {\r\n throw new Error('The \"uid\" field is no longer supported by mockUserToken. Please use \"sub\" instead for Firebase Auth User ID.');\r\n }\r\n // Unsecured JWTs use \"none\" as the algorithm.\r\n const header = {\r\n alg: 'none',\r\n type: 'JWT'\r\n };\r\n const project = projectId || 'demo-project';\r\n const iat = token.iat || 0;\r\n const sub = token.sub || token.user_id;\r\n if (!sub) {\r\n throw new Error(\"mockUserToken must contain 'sub' or 'user_id' field!\");\r\n }\r\n const payload = Object.assign({ \r\n // Set all required fields to decent defaults\r\n iss: `https://securetoken.google.com/${project}`, aud: project, iat, exp: iat + 3600, auth_time: iat, sub, user_id: sub, firebase: {\r\n sign_in_provider: 'custom',\r\n identities: {}\r\n } }, token);\r\n // Unsecured JWTs use the empty string as a signature.\r\n const signature = '';\r\n return [\r\n base64urlEncodeWithoutPadding(JSON.stringify(header)),\r\n base64urlEncodeWithoutPadding(JSON.stringify(payload)),\r\n signature\r\n ].join('.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns navigator.userAgent string or '' if it's not defined.\r\n * @return user agent string\r\n */\r\nfunction getUA() {\r\n if (typeof navigator !== 'undefined' &&\r\n typeof navigator['userAgent'] === 'string') {\r\n return navigator['userAgent'];\r\n }\r\n else {\r\n return '';\r\n }\r\n}\r\n/**\r\n * Detect Cordova / PhoneGap / Ionic frameworks on a mobile device.\r\n *\r\n * Deliberately does not rely on checking `file://` URLs (as this fails PhoneGap\r\n * in the Ripple emulator) nor Cordova `onDeviceReady`, which would normally\r\n * wait for a callback.\r\n */\r\nfunction isMobileCordova() {\r\n return (typeof window !== 'undefined' &&\r\n // @ts-ignore Setting up an broadly applicable index signature for Window\r\n // just to deal with this case would probably be a bad idea.\r\n !!(window['cordova'] || window['phonegap'] || window['PhoneGap']) &&\r\n /ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(getUA()));\r\n}\r\n/**\r\n * Detect Node.js.\r\n *\r\n * @return true if Node.js environment is detected or specified.\r\n */\r\n// Node detection logic from: https://github.com/iliakan/detect-node/\r\nfunction isNode() {\r\n var _a;\r\n const forceEnvironment = (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.forceEnvironment;\r\n if (forceEnvironment === 'node') {\r\n return true;\r\n }\r\n else if (forceEnvironment === 'browser') {\r\n return false;\r\n }\r\n try {\r\n return (Object.prototype.toString.call(global.process) === '[object process]');\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n}\r\n/**\r\n * Detect Browser Environment.\r\n * Note: This will return true for certain test frameworks that are incompletely\r\n * mimicking a browser, and should not lead to assuming all browser APIs are\r\n * available.\r\n */\r\nfunction isBrowser() {\r\n return typeof window !== 'undefined' || isWebWorker();\r\n}\r\n/**\r\n * Detect Web Worker context.\r\n */\r\nfunction isWebWorker() {\r\n return (typeof WorkerGlobalScope !== 'undefined' &&\r\n typeof self !== 'undefined' &&\r\n self instanceof WorkerGlobalScope);\r\n}\r\n/**\r\n * Detect Cloudflare Worker context.\r\n */\r\nfunction isCloudflareWorker() {\r\n return (typeof navigator !== 'undefined' &&\r\n navigator.userAgent === 'Cloudflare-Workers');\r\n}\r\nfunction isBrowserExtension() {\r\n const runtime = typeof chrome === 'object'\r\n ? chrome.runtime\r\n : typeof browser === 'object'\r\n ? browser.runtime\r\n : undefined;\r\n return typeof runtime === 'object' && runtime.id !== undefined;\r\n}\r\n/**\r\n * Detect React Native.\r\n *\r\n * @return true if ReactNative environment is detected.\r\n */\r\nfunction isReactNative() {\r\n return (typeof navigator === 'object' && navigator['product'] === 'ReactNative');\r\n}\r\n/** Detects Electron apps. */\r\nfunction isElectron() {\r\n return getUA().indexOf('Electron/') >= 0;\r\n}\r\n/** Detects Internet Explorer. */\r\nfunction isIE() {\r\n const ua = getUA();\r\n return ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;\r\n}\r\n/** Detects Universal Windows Platform apps. */\r\nfunction isUWP() {\r\n return getUA().indexOf('MSAppHost/') >= 0;\r\n}\r\n/**\r\n * Detect whether the current SDK build is the Node version.\r\n *\r\n * @return true if it's the Node SDK build.\r\n */\r\nfunction isNodeSdk() {\r\n return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true;\r\n}\r\n/** Returns true if we are running in Safari. */\r\nfunction isSafari() {\r\n return (!isNode() &&\r\n !!navigator.userAgent &&\r\n navigator.userAgent.includes('Safari') &&\r\n !navigator.userAgent.includes('Chrome'));\r\n}\r\n/**\r\n * This method checks if indexedDB is supported by current browser/service worker context\r\n * @return true if indexedDB is supported by current browser/service worker context\r\n */\r\nfunction isIndexedDBAvailable() {\r\n try {\r\n return typeof indexedDB === 'object';\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n}\r\n/**\r\n * This method validates browser/sw context for indexedDB by opening a dummy indexedDB database and reject\r\n * if errors occur during the database open operation.\r\n *\r\n * @throws exception if current browser/sw context can't run idb.open (ex: Safari iframe, Firefox\r\n * private browsing)\r\n */\r\nfunction validateIndexedDBOpenable() {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n let preExist = true;\r\n const DB_CHECK_NAME = 'validate-browser-context-for-indexeddb-analytics-module';\r\n const request = self.indexedDB.open(DB_CHECK_NAME);\r\n request.onsuccess = () => {\r\n request.result.close();\r\n // delete database only when it doesn't pre-exist\r\n if (!preExist) {\r\n self.indexedDB.deleteDatabase(DB_CHECK_NAME);\r\n }\r\n resolve(true);\r\n };\r\n request.onupgradeneeded = () => {\r\n preExist = false;\r\n };\r\n request.onerror = () => {\r\n var _a;\r\n reject(((_a = request.error) === null || _a === void 0 ? void 0 : _a.message) || '');\r\n };\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n/**\r\n *\r\n * This method checks whether cookie is enabled within current browser\r\n * @return true if cookie is enabled within current browser\r\n */\r\nfunction areCookiesEnabled() {\r\n if (typeof navigator === 'undefined' || !navigator.cookieEnabled) {\r\n return false;\r\n }\r\n return true;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Standardized Firebase Error.\r\n *\r\n * Usage:\r\n *\r\n * // TypeScript string literals for type-safe codes\r\n * type Err =\r\n * 'unknown' |\r\n * 'object-not-found'\r\n * ;\r\n *\r\n * // Closure enum for type-safe error codes\r\n * // at-enum {string}\r\n * var Err = {\r\n * UNKNOWN: 'unknown',\r\n * OBJECT_NOT_FOUND: 'object-not-found',\r\n * }\r\n *\r\n * let errors: Map = {\r\n * 'generic-error': \"Unknown error\",\r\n * 'file-not-found': \"Could not find file: {$file}\",\r\n * };\r\n *\r\n * // Type-safe function - must pass a valid error code as param.\r\n * let error = new ErrorFactory('service', 'Service', errors);\r\n *\r\n * ...\r\n * throw error.create(Err.GENERIC);\r\n * ...\r\n * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\r\n * ...\r\n * // Service: Could not file file: foo.txt (service/file-not-found).\r\n *\r\n * catch (e) {\r\n * assert(e.message === \"Could not find file: foo.txt.\");\r\n * if ((e as FirebaseError)?.code === 'service/file-not-found') {\r\n * console.log(\"Could not read file: \" + e['file']);\r\n * }\r\n * }\r\n */\r\nconst ERROR_NAME = 'FirebaseError';\r\n// Based on code from:\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\r\nclass FirebaseError extends Error {\r\n constructor(\r\n /** The error code for this error. */\r\n code, message, \r\n /** Custom data for this error. */\r\n customData) {\r\n super(message);\r\n this.code = code;\r\n this.customData = customData;\r\n /** The custom name for all FirebaseErrors. */\r\n this.name = ERROR_NAME;\r\n // Fix For ES5\r\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n Object.setPrototypeOf(this, FirebaseError.prototype);\r\n // Maintains proper stack trace for where our error was thrown.\r\n // Only available on V8.\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, ErrorFactory.prototype.create);\r\n }\r\n }\r\n}\r\nclass ErrorFactory {\r\n constructor(service, serviceName, errors) {\r\n this.service = service;\r\n this.serviceName = serviceName;\r\n this.errors = errors;\r\n }\r\n create(code, ...data) {\r\n const customData = data[0] || {};\r\n const fullCode = `${this.service}/${code}`;\r\n const template = this.errors[code];\r\n const message = template ? replaceTemplate(template, customData) : 'Error';\r\n // Service Name: Error message (service/code).\r\n const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\r\n const error = new FirebaseError(fullCode, fullMessage, customData);\r\n return error;\r\n }\r\n}\r\nfunction replaceTemplate(template, data) {\r\n return template.replace(PATTERN, (_, key) => {\r\n const value = data[key];\r\n return value != null ? String(value) : `<${key}?>`;\r\n });\r\n}\r\nconst PATTERN = /\\{\\$([^}]+)}/g;\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Evaluates a JSON string into a javascript object.\r\n *\r\n * @param {string} str A string containing JSON.\r\n * @return {*} The javascript object representing the specified JSON.\r\n */\r\nfunction jsonEval(str) {\r\n return JSON.parse(str);\r\n}\r\n/**\r\n * Returns JSON representing a javascript object.\r\n * @param {*} data JavaScript object to be stringified.\r\n * @return {string} The JSON contents of the object.\r\n */\r\nfunction stringify(data) {\r\n return JSON.stringify(data);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Decodes a Firebase auth. token into constituent parts.\r\n *\r\n * Notes:\r\n * - May return with invalid / incomplete claims if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst decode = function (token) {\r\n let header = {}, claims = {}, data = {}, signature = '';\r\n try {\r\n const parts = token.split('.');\r\n header = jsonEval(base64Decode(parts[0]) || '');\r\n claims = jsonEval(base64Decode(parts[1]) || '');\r\n signature = parts[2];\r\n data = claims['d'] || {};\r\n delete claims['d'];\r\n }\r\n catch (e) { }\r\n return {\r\n header,\r\n claims,\r\n data,\r\n signature\r\n };\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the\r\n * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidTimestamp = function (token) {\r\n const claims = decode(token).claims;\r\n const now = Math.floor(new Date().getTime() / 1000);\r\n let validSince = 0, validUntil = 0;\r\n if (typeof claims === 'object') {\r\n if (claims.hasOwnProperty('nbf')) {\r\n validSince = claims['nbf'];\r\n }\r\n else if (claims.hasOwnProperty('iat')) {\r\n validSince = claims['iat'];\r\n }\r\n if (claims.hasOwnProperty('exp')) {\r\n validUntil = claims['exp'];\r\n }\r\n else {\r\n // token will expire after 24h by default\r\n validUntil = validSince + 86400;\r\n }\r\n }\r\n return (!!now &&\r\n !!validSince &&\r\n !!validUntil &&\r\n now >= validSince &&\r\n now <= validUntil);\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise.\r\n *\r\n * Notes:\r\n * - May return null if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst issuedAtTime = function (token) {\r\n const claims = decode(token).claims;\r\n if (typeof claims === 'object' && claims.hasOwnProperty('iat')) {\r\n return claims['iat'];\r\n }\r\n return null;\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidFormat = function (token) {\r\n const decoded = decode(token), claims = decoded.claims;\r\n return !!claims && typeof claims === 'object' && claims.hasOwnProperty('iat');\r\n};\r\n/**\r\n * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isAdmin = function (token) {\r\n const claims = decode(token).claims;\r\n return typeof claims === 'object' && claims['admin'] === true;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction contains(obj, key) {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n}\r\nfunction safeGet(obj, key) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return obj[key];\r\n }\r\n else {\r\n return undefined;\r\n }\r\n}\r\nfunction isEmpty(obj) {\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction map(obj, fn, contextObj) {\r\n const res = {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n res[key] = fn.call(contextObj, obj[key], key, obj);\r\n }\r\n }\r\n return res;\r\n}\r\n/**\r\n * Deep equal two objects. Support Arrays and Objects.\r\n */\r\nfunction deepEqual(a, b) {\r\n if (a === b) {\r\n return true;\r\n }\r\n const aKeys = Object.keys(a);\r\n const bKeys = Object.keys(b);\r\n for (const k of aKeys) {\r\n if (!bKeys.includes(k)) {\r\n return false;\r\n }\r\n const aProp = a[k];\r\n const bProp = b[k];\r\n if (isObject(aProp) && isObject(bProp)) {\r\n if (!deepEqual(aProp, bProp)) {\r\n return false;\r\n }\r\n }\r\n else if (aProp !== bProp) {\r\n return false;\r\n }\r\n }\r\n for (const k of bKeys) {\r\n if (!aKeys.includes(k)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isObject(thing) {\r\n return thing !== null && typeof thing === 'object';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Rejects if the given promise doesn't resolve in timeInMS milliseconds.\r\n * @internal\r\n */\r\nfunction promiseWithTimeout(promise, timeInMS = 2000) {\r\n const deferredPromise = new Deferred();\r\n setTimeout(() => deferredPromise.reject('timeout!'), timeInMS);\r\n promise.then(deferredPromise.resolve, deferredPromise.reject);\r\n return deferredPromise.promise;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a\r\n * params object (e.g. {arg: 'val', arg2: 'val2'})\r\n * Note: You must prepend it with ? when adding it to a URL.\r\n */\r\nfunction querystring(querystringParams) {\r\n const params = [];\r\n for (const [key, value] of Object.entries(querystringParams)) {\r\n if (Array.isArray(value)) {\r\n value.forEach(arrayVal => {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal));\r\n });\r\n }\r\n else {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\r\n }\r\n }\r\n return params.length ? '&' + params.join('&') : '';\r\n}\r\n/**\r\n * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object\r\n * (e.g. {arg: 'val', arg2: 'val2'})\r\n */\r\nfunction querystringDecode(querystring) {\r\n const obj = {};\r\n const tokens = querystring.replace(/^\\?/, '').split('&');\r\n tokens.forEach(token => {\r\n if (token) {\r\n const [key, value] = token.split('=');\r\n obj[decodeURIComponent(key)] = decodeURIComponent(value);\r\n }\r\n });\r\n return obj;\r\n}\r\n/**\r\n * Extract the query string part of a URL, including the leading question mark (if present).\r\n */\r\nfunction extractQuerystring(url) {\r\n const queryStart = url.indexOf('?');\r\n if (!queryStart) {\r\n return '';\r\n }\r\n const fragmentStart = url.indexOf('#', queryStart);\r\n return url.substring(queryStart, fragmentStart > 0 ? fragmentStart : undefined);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview SHA-1 cryptographic hash.\r\n * Variable names follow the notation in FIPS PUB 180-3:\r\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\r\n *\r\n * Usage:\r\n * var sha1 = new sha1();\r\n * sha1.update(bytes);\r\n * var hash = sha1.digest();\r\n *\r\n * Performance:\r\n * Chrome 23: ~400 Mbit/s\r\n * Firefox 16: ~250 Mbit/s\r\n *\r\n */\r\n/**\r\n * SHA-1 cryptographic hash constructor.\r\n *\r\n * The properties declared here are discussed in the above algorithm document.\r\n * @constructor\r\n * @final\r\n * @struct\r\n */\r\nclass Sha1 {\r\n constructor() {\r\n /**\r\n * Holds the previous values of accumulated variables a-e in the compress_\r\n * function.\r\n * @private\r\n */\r\n this.chain_ = [];\r\n /**\r\n * A buffer holding the partially computed hash result.\r\n * @private\r\n */\r\n this.buf_ = [];\r\n /**\r\n * An array of 80 bytes, each a part of the message to be hashed. Referred to\r\n * as the message schedule in the docs.\r\n * @private\r\n */\r\n this.W_ = [];\r\n /**\r\n * Contains data needed to pad messages less than 64 bytes.\r\n * @private\r\n */\r\n this.pad_ = [];\r\n /**\r\n * @private {number}\r\n */\r\n this.inbuf_ = 0;\r\n /**\r\n * @private {number}\r\n */\r\n this.total_ = 0;\r\n this.blockSize = 512 / 8;\r\n this.pad_[0] = 128;\r\n for (let i = 1; i < this.blockSize; ++i) {\r\n this.pad_[i] = 0;\r\n }\r\n this.reset();\r\n }\r\n reset() {\r\n this.chain_[0] = 0x67452301;\r\n this.chain_[1] = 0xefcdab89;\r\n this.chain_[2] = 0x98badcfe;\r\n this.chain_[3] = 0x10325476;\r\n this.chain_[4] = 0xc3d2e1f0;\r\n this.inbuf_ = 0;\r\n this.total_ = 0;\r\n }\r\n /**\r\n * Internal compress helper function.\r\n * @param buf Block to compress.\r\n * @param offset Offset of the block in the buffer.\r\n * @private\r\n */\r\n compress_(buf, offset) {\r\n if (!offset) {\r\n offset = 0;\r\n }\r\n const W = this.W_;\r\n // get 16 big endian words\r\n if (typeof buf === 'string') {\r\n for (let i = 0; i < 16; i++) {\r\n // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS\r\n // have a bug that turns the post-increment ++ operator into pre-increment\r\n // during JIT compilation. We have code that depends heavily on SHA-1 for\r\n // correctness and which is affected by this bug, so I've removed all uses\r\n // of post-increment ++ in which the result value is used. We can revert\r\n // this change once the Safari bug\r\n // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and\r\n // most clients have been updated.\r\n W[i] =\r\n (buf.charCodeAt(offset) << 24) |\r\n (buf.charCodeAt(offset + 1) << 16) |\r\n (buf.charCodeAt(offset + 2) << 8) |\r\n buf.charCodeAt(offset + 3);\r\n offset += 4;\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < 16; i++) {\r\n W[i] =\r\n (buf[offset] << 24) |\r\n (buf[offset + 1] << 16) |\r\n (buf[offset + 2] << 8) |\r\n buf[offset + 3];\r\n offset += 4;\r\n }\r\n }\r\n // expand to 80 words\r\n for (let i = 16; i < 80; i++) {\r\n const t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\r\n W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff;\r\n }\r\n let a = this.chain_[0];\r\n let b = this.chain_[1];\r\n let c = this.chain_[2];\r\n let d = this.chain_[3];\r\n let e = this.chain_[4];\r\n let f, k;\r\n // TODO(user): Try to unroll this loop to speed up the computation.\r\n for (let i = 0; i < 80; i++) {\r\n if (i < 40) {\r\n if (i < 20) {\r\n f = d ^ (b & (c ^ d));\r\n k = 0x5a827999;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0x6ed9eba1;\r\n }\r\n }\r\n else {\r\n if (i < 60) {\r\n f = (b & c) | (d & (b | c));\r\n k = 0x8f1bbcdc;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0xca62c1d6;\r\n }\r\n }\r\n const t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff;\r\n e = d;\r\n d = c;\r\n c = ((b << 30) | (b >>> 2)) & 0xffffffff;\r\n b = a;\r\n a = t;\r\n }\r\n this.chain_[0] = (this.chain_[0] + a) & 0xffffffff;\r\n this.chain_[1] = (this.chain_[1] + b) & 0xffffffff;\r\n this.chain_[2] = (this.chain_[2] + c) & 0xffffffff;\r\n this.chain_[3] = (this.chain_[3] + d) & 0xffffffff;\r\n this.chain_[4] = (this.chain_[4] + e) & 0xffffffff;\r\n }\r\n update(bytes, length) {\r\n // TODO(johnlenz): tighten the function signature and remove this check\r\n if (bytes == null) {\r\n return;\r\n }\r\n if (length === undefined) {\r\n length = bytes.length;\r\n }\r\n const lengthMinusBlock = length - this.blockSize;\r\n let n = 0;\r\n // Using local instead of member variables gives ~5% speedup on Firefox 16.\r\n const buf = this.buf_;\r\n let inbuf = this.inbuf_;\r\n // The outer while loop should execute at most twice.\r\n while (n < length) {\r\n // When we have no data in the block to top up, we can directly process the\r\n // input buffer (assuming it contains sufficient data). This gives ~25%\r\n // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that\r\n // the data is provided in large chunks (or in multiples of 64 bytes).\r\n if (inbuf === 0) {\r\n while (n <= lengthMinusBlock) {\r\n this.compress_(bytes, n);\r\n n += this.blockSize;\r\n }\r\n }\r\n if (typeof bytes === 'string') {\r\n while (n < length) {\r\n buf[inbuf] = bytes.charCodeAt(n);\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n while (n < length) {\r\n buf[inbuf] = bytes[n];\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n this.inbuf_ = inbuf;\r\n this.total_ += length;\r\n }\r\n /** @override */\r\n digest() {\r\n const digest = [];\r\n let totalBits = this.total_ * 8;\r\n // Add pad 0x80 0x00*.\r\n if (this.inbuf_ < 56) {\r\n this.update(this.pad_, 56 - this.inbuf_);\r\n }\r\n else {\r\n this.update(this.pad_, this.blockSize - (this.inbuf_ - 56));\r\n }\r\n // Add # bits.\r\n for (let i = this.blockSize - 1; i >= 56; i--) {\r\n this.buf_[i] = totalBits & 255;\r\n totalBits /= 256; // Don't use bit-shifting here!\r\n }\r\n this.compress_(this.buf_);\r\n let n = 0;\r\n for (let i = 0; i < 5; i++) {\r\n for (let j = 24; j >= 0; j -= 8) {\r\n digest[n] = (this.chain_[i] >> j) & 255;\r\n ++n;\r\n }\r\n }\r\n return digest;\r\n }\r\n}\n\n/**\r\n * Helper to make a Subscribe function (just like Promise helps make a\r\n * Thenable).\r\n *\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\nfunction createSubscribe(executor, onNoObservers) {\r\n const proxy = new ObserverProxy(executor, onNoObservers);\r\n return proxy.subscribe.bind(proxy);\r\n}\r\n/**\r\n * Implement fan-out for any number of Observers attached via a subscribe\r\n * function.\r\n */\r\nclass ObserverProxy {\r\n /**\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\n constructor(executor, onNoObservers) {\r\n this.observers = [];\r\n this.unsubscribes = [];\r\n this.observerCount = 0;\r\n // Micro-task scheduling by calling task.then().\r\n this.task = Promise.resolve();\r\n this.finalized = false;\r\n this.onNoObservers = onNoObservers;\r\n // Call the executor asynchronously so subscribers that are called\r\n // synchronously after the creation of the subscribe function\r\n // can still receive the very first value generated in the executor.\r\n this.task\r\n .then(() => {\r\n executor(this);\r\n })\r\n .catch(e => {\r\n this.error(e);\r\n });\r\n }\r\n next(value) {\r\n this.forEachObserver((observer) => {\r\n observer.next(value);\r\n });\r\n }\r\n error(error) {\r\n this.forEachObserver((observer) => {\r\n observer.error(error);\r\n });\r\n this.close(error);\r\n }\r\n complete() {\r\n this.forEachObserver((observer) => {\r\n observer.complete();\r\n });\r\n this.close();\r\n }\r\n /**\r\n * Subscribe function that can be used to add an Observer to the fan-out list.\r\n *\r\n * - We require that no event is sent to a subscriber synchronously to their\r\n * call to subscribe().\r\n */\r\n subscribe(nextOrObserver, error, complete) {\r\n let observer;\r\n if (nextOrObserver === undefined &&\r\n error === undefined &&\r\n complete === undefined) {\r\n throw new Error('Missing Observer.');\r\n }\r\n // Assemble an Observer object when passed as callback functions.\r\n if (implementsAnyMethods(nextOrObserver, [\r\n 'next',\r\n 'error',\r\n 'complete'\r\n ])) {\r\n observer = nextOrObserver;\r\n }\r\n else {\r\n observer = {\r\n next: nextOrObserver,\r\n error,\r\n complete\r\n };\r\n }\r\n if (observer.next === undefined) {\r\n observer.next = noop;\r\n }\r\n if (observer.error === undefined) {\r\n observer.error = noop;\r\n }\r\n if (observer.complete === undefined) {\r\n observer.complete = noop;\r\n }\r\n const unsub = this.unsubscribeOne.bind(this, this.observers.length);\r\n // Attempt to subscribe to a terminated Observable - we\r\n // just respond to the Observer with the final error or complete\r\n // event.\r\n if (this.finalized) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n try {\r\n if (this.finalError) {\r\n observer.error(this.finalError);\r\n }\r\n else {\r\n observer.complete();\r\n }\r\n }\r\n catch (e) {\r\n // nothing\r\n }\r\n return;\r\n });\r\n }\r\n this.observers.push(observer);\r\n return unsub;\r\n }\r\n // Unsubscribe is synchronous - we guarantee that no events are sent to\r\n // any unsubscribed Observer.\r\n unsubscribeOne(i) {\r\n if (this.observers === undefined || this.observers[i] === undefined) {\r\n return;\r\n }\r\n delete this.observers[i];\r\n this.observerCount -= 1;\r\n if (this.observerCount === 0 && this.onNoObservers !== undefined) {\r\n this.onNoObservers(this);\r\n }\r\n }\r\n forEachObserver(fn) {\r\n if (this.finalized) {\r\n // Already closed by previous event....just eat the additional values.\r\n return;\r\n }\r\n // Since sendOne calls asynchronously - there is no chance that\r\n // this.observers will become undefined.\r\n for (let i = 0; i < this.observers.length; i++) {\r\n this.sendOne(i, fn);\r\n }\r\n }\r\n // Call the Observer via one of it's callback function. We are careful to\r\n // confirm that the observe has not been unsubscribed since this asynchronous\r\n // function had been queued.\r\n sendOne(i, fn) {\r\n // Execute the callback asynchronously\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n if (this.observers !== undefined && this.observers[i] !== undefined) {\r\n try {\r\n fn(this.observers[i]);\r\n }\r\n catch (e) {\r\n // Ignore exceptions raised in Observers or missing methods of an\r\n // Observer.\r\n // Log error to console. b/31404806\r\n if (typeof console !== 'undefined' && console.error) {\r\n console.error(e);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n close(err) {\r\n if (this.finalized) {\r\n return;\r\n }\r\n this.finalized = true;\r\n if (err !== undefined) {\r\n this.finalError = err;\r\n }\r\n // Proxy is no longer needed - garbage collect references\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n this.observers = undefined;\r\n this.onNoObservers = undefined;\r\n });\r\n }\r\n}\r\n/** Turn synchronous function into one called asynchronously. */\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\nfunction async(fn, onError) {\r\n return (...args) => {\r\n Promise.resolve(true)\r\n .then(() => {\r\n fn(...args);\r\n })\r\n .catch((error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n });\r\n };\r\n}\r\n/**\r\n * Return true if the object passed in implements any of the named methods.\r\n */\r\nfunction implementsAnyMethods(obj, methods) {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n for (const method of methods) {\r\n if (method in obj && typeof obj[method] === 'function') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\nfunction noop() {\r\n // do nothing\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Check to make sure the appropriate number of arguments are provided for a public function.\r\n * Throws an error if it fails.\r\n *\r\n * @param fnName The function name\r\n * @param minCount The minimum number of arguments to allow for the function call\r\n * @param maxCount The maximum number of argument to allow for the function call\r\n * @param argCount The actual number of arguments provided.\r\n */\r\nconst validateArgCount = function (fnName, minCount, maxCount, argCount) {\r\n let argError;\r\n if (argCount < minCount) {\r\n argError = 'at least ' + minCount;\r\n }\r\n else if (argCount > maxCount) {\r\n argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount;\r\n }\r\n if (argError) {\r\n const error = fnName +\r\n ' failed: Was called with ' +\r\n argCount +\r\n (argCount === 1 ? ' argument.' : ' arguments.') +\r\n ' Expects ' +\r\n argError +\r\n '.';\r\n throw new Error(error);\r\n }\r\n};\r\n/**\r\n * Generates a string to prefix an error message about failed argument validation\r\n *\r\n * @param fnName The function name\r\n * @param argName The name of the argument\r\n * @return The prefix to add to the error thrown for validation.\r\n */\r\nfunction errorPrefix(fnName, argName) {\r\n return `${fnName} failed: ${argName} argument `;\r\n}\r\n/**\r\n * @param fnName\r\n * @param argumentNumber\r\n * @param namespace\r\n * @param optional\r\n */\r\nfunction validateNamespace(fnName, namespace, optional) {\r\n if (optional && !namespace) {\r\n return;\r\n }\r\n if (typeof namespace !== 'string') {\r\n //TODO: I should do more validation here. We only allow certain chars in namespaces.\r\n throw new Error(errorPrefix(fnName, 'namespace') + 'must be a valid firebase namespace.');\r\n }\r\n}\r\nfunction validateCallback(fnName, argumentName, \r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\ncallback, optional) {\r\n if (optional && !callback) {\r\n return;\r\n }\r\n if (typeof callback !== 'function') {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid function.');\r\n }\r\n}\r\nfunction validateContextObject(fnName, argumentName, context, optional) {\r\n if (optional && !context) {\r\n return;\r\n }\r\n if (typeof context !== 'object' || context === null) {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid context object.');\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they\r\n// automatically replaced '\\r\\n' with '\\n', and they didn't handle surrogate pairs,\r\n// so it's been modified.\r\n// Note that not all Unicode characters appear as single characters in JavaScript strings.\r\n// fromCharCode returns the UTF-16 encoding of a character - so some Unicode characters\r\n// use 2 characters in JavaScript. All 4-byte UTF-8 characters begin with a first\r\n// character in the range 0xD800 - 0xDBFF (the first character of a so-called surrogate\r\n// pair).\r\n// See http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3\r\n/**\r\n * @param {string} str\r\n * @return {Array}\r\n */\r\nconst stringToByteArray = function (str) {\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n // Is this the lead surrogate in a surrogate pair?\r\n if (c >= 0xd800 && c <= 0xdbff) {\r\n const high = c - 0xd800; // the high 10 bits.\r\n i++;\r\n assert(i < str.length, 'Surrogate pair missing trail surrogate.');\r\n const low = str.charCodeAt(i) - 0xdc00; // the low 10 bits.\r\n c = 0x10000 + (high << 10) + low;\r\n }\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if (c < 65536) {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Calculate length without actually converting; useful for doing cheaper validation.\r\n * @param {string} str\r\n * @return {number}\r\n */\r\nconst stringLength = function (str) {\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const c = str.charCodeAt(i);\r\n if (c < 128) {\r\n p++;\r\n }\r\n else if (c < 2048) {\r\n p += 2;\r\n }\r\n else if (c >= 0xd800 && c <= 0xdbff) {\r\n // Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent.\r\n p += 4;\r\n i++; // skip trail surrogate.\r\n }\r\n else {\r\n p += 3;\r\n }\r\n }\r\n return p;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Copied from https://stackoverflow.com/a/2117523\r\n * Generates a new uuid.\r\n * @public\r\n */\r\nconst uuidv4 = function () {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\r\n const r = (Math.random() * 16) | 0, v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The amount of milliseconds to exponentially increase.\r\n */\r\nconst DEFAULT_INTERVAL_MILLIS = 1000;\r\n/**\r\n * The factor to backoff by.\r\n * Should be a number greater than 1.\r\n */\r\nconst DEFAULT_BACKOFF_FACTOR = 2;\r\n/**\r\n * The maximum milliseconds to increase to.\r\n *\r\n *

Visible for testing\r\n */\r\nconst MAX_VALUE_MILLIS = 4 * 60 * 60 * 1000; // Four hours, like iOS and Android.\r\n/**\r\n * The percentage of backoff time to randomize by.\r\n * See\r\n * http://go/safe-client-behavior#step-1-determine-the-appropriate-retry-interval-to-handle-spike-traffic\r\n * for context.\r\n *\r\n *

Visible for testing\r\n */\r\nconst RANDOM_FACTOR = 0.5;\r\n/**\r\n * Based on the backoff method from\r\n * https://github.com/google/closure-library/blob/master/closure/goog/math/exponentialbackoff.js.\r\n * Extracted here so we don't need to pass metadata and a stateful ExponentialBackoff object around.\r\n */\r\nfunction calculateBackoffMillis(backoffCount, intervalMillis = DEFAULT_INTERVAL_MILLIS, backoffFactor = DEFAULT_BACKOFF_FACTOR) {\r\n // Calculates an exponentially increasing value.\r\n // Deviation: calculates value from count and a constant interval, so we only need to save value\r\n // and count to restore state.\r\n const currBaseValue = intervalMillis * Math.pow(backoffFactor, backoffCount);\r\n // A random \"fuzz\" to avoid waves of retries.\r\n // Deviation: randomFactor is required.\r\n const randomWait = Math.round(\r\n // A fraction of the backoff value to add/subtract.\r\n // Deviation: changes multiplication order to improve readability.\r\n RANDOM_FACTOR *\r\n currBaseValue *\r\n // A random float (rounded to int by Math.round above) in the range [-1, 1]. Determines\r\n // if we add or subtract.\r\n (Math.random() - 0.5) *\r\n 2);\r\n // Limits backoff to max to avoid effectively permanent backoff.\r\n return Math.min(MAX_VALUE_MILLIS, currBaseValue + randomWait);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provide English ordinal letters after a number\r\n */\r\nfunction ordinal(i) {\r\n if (!Number.isFinite(i)) {\r\n return `${i}`;\r\n }\r\n return i + indicator(i);\r\n}\r\nfunction indicator(i) {\r\n i = Math.abs(i);\r\n const cent = i % 100;\r\n if (cent >= 10 && cent <= 20) {\r\n return 'th';\r\n }\r\n const dec = i % 10;\r\n if (dec === 1) {\r\n return 'st';\r\n }\r\n if (dec === 2) {\r\n return 'nd';\r\n }\r\n if (dec === 3) {\r\n return 'rd';\r\n }\r\n return 'th';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getModularInstance(service) {\r\n if (service && service._delegate) {\r\n return service._delegate;\r\n }\r\n else {\r\n return service;\r\n }\r\n}\n\nexport { CONSTANTS, DecodeBase64StringError, Deferred, ErrorFactory, FirebaseError, MAX_VALUE_MILLIS, RANDOM_FACTOR, Sha1, areCookiesEnabled, assert, assertionError, async, base64, base64Decode, base64Encode, base64urlEncodeWithoutPadding, calculateBackoffMillis, contains, createMockUserToken, createSubscribe, decode, deepCopy, deepEqual, deepExtend, errorPrefix, extractQuerystring, getDefaultAppConfig, getDefaultEmulatorHost, getDefaultEmulatorHostnameAndPort, getDefaults, getExperimentalSetting, getGlobal, getModularInstance, getUA, isAdmin, isBrowser, isBrowserExtension, isCloudflareWorker, isElectron, isEmpty, isIE, isIndexedDBAvailable, isMobileCordova, isNode, isNodeSdk, isReactNative, isSafari, isUWP, isValidFormat, isValidTimestamp, isWebWorker, issuedAtTime, jsonEval, map, ordinal, promiseWithTimeout, querystring, querystringDecode, safeGet, stringLength, stringToByteArray, stringify, uuidv4, validateArgCount, validateCallback, validateContextObject, validateIndexedDBOpenable, validateNamespace };\n//# sourceMappingURL=index.esm2017.js.map\n","import { Deferred } from '@firebase/util';\n\n/**\r\n * Component for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass Component {\r\n /**\r\n *\r\n * @param name The public service name, e.g. app, auth, firestore, database\r\n * @param instanceFactory Service factory responsible for creating the public interface\r\n * @param type whether the service provided by the component is public or private\r\n */\r\n constructor(name, instanceFactory, type) {\r\n this.name = name;\r\n this.instanceFactory = instanceFactory;\r\n this.type = type;\r\n this.multipleInstances = false;\r\n /**\r\n * Properties to be added to the service namespace\r\n */\r\n this.serviceProps = {};\r\n this.instantiationMode = \"LAZY\" /* InstantiationMode.LAZY */;\r\n this.onInstanceCreated = null;\r\n }\r\n setInstantiationMode(mode) {\r\n this.instantiationMode = mode;\r\n return this;\r\n }\r\n setMultipleInstances(multipleInstances) {\r\n this.multipleInstances = multipleInstances;\r\n return this;\r\n }\r\n setServiceProps(props) {\r\n this.serviceProps = props;\r\n return this;\r\n }\r\n setInstanceCreatedCallback(callback) {\r\n this.onInstanceCreated = callback;\r\n return this;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for instance for service name T, e.g. 'auth', 'auth-internal'\r\n * NameServiceMapping[T] is an alias for the type of the instance\r\n */\r\nclass Provider {\r\n constructor(name, container) {\r\n this.name = name;\r\n this.container = container;\r\n this.component = null;\r\n this.instances = new Map();\r\n this.instancesDeferred = new Map();\r\n this.instancesOptions = new Map();\r\n this.onInitCallbacks = new Map();\r\n }\r\n /**\r\n * @param identifier A provider can provide multiple instances of a service\r\n * if this.component.multipleInstances is true.\r\n */\r\n get(identifier) {\r\n // if multipleInstances is not supported, use the default name\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n if (!this.instancesDeferred.has(normalizedIdentifier)) {\r\n const deferred = new Deferred();\r\n this.instancesDeferred.set(normalizedIdentifier, deferred);\r\n if (this.isInitialized(normalizedIdentifier) ||\r\n this.shouldAutoInitialize()) {\r\n // initialize the service if it can be auto-initialized\r\n try {\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n if (instance) {\r\n deferred.resolve(instance);\r\n }\r\n }\r\n catch (e) {\r\n // when the instance factory throws an exception during get(), it should not cause\r\n // a fatal error. We just return the unresolved promise in this case.\r\n }\r\n }\r\n }\r\n return this.instancesDeferred.get(normalizedIdentifier).promise;\r\n }\r\n getImmediate(options) {\r\n var _a;\r\n // if multipleInstances is not supported, use the default name\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(options === null || options === void 0 ? void 0 : options.identifier);\r\n const optional = (_a = options === null || options === void 0 ? void 0 : options.optional) !== null && _a !== void 0 ? _a : false;\r\n if (this.isInitialized(normalizedIdentifier) ||\r\n this.shouldAutoInitialize()) {\r\n try {\r\n return this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n }\r\n catch (e) {\r\n if (optional) {\r\n return null;\r\n }\r\n else {\r\n throw e;\r\n }\r\n }\r\n }\r\n else {\r\n // In case a component is not initialized and should/cannot be auto-initialized at the moment, return null if the optional flag is set, or throw\r\n if (optional) {\r\n return null;\r\n }\r\n else {\r\n throw Error(`Service ${this.name} is not available`);\r\n }\r\n }\r\n }\r\n getComponent() {\r\n return this.component;\r\n }\r\n setComponent(component) {\r\n if (component.name !== this.name) {\r\n throw Error(`Mismatching Component ${component.name} for Provider ${this.name}.`);\r\n }\r\n if (this.component) {\r\n throw Error(`Component for ${this.name} has already been provided`);\r\n }\r\n this.component = component;\r\n // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)\r\n if (!this.shouldAutoInitialize()) {\r\n return;\r\n }\r\n // if the service is eager, initialize the default instance\r\n if (isComponentEager(component)) {\r\n try {\r\n this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });\r\n }\r\n catch (e) {\r\n // when the instance factory for an eager Component throws an exception during the eager\r\n // initialization, it should not cause a fatal error.\r\n // TODO: Investigate if we need to make it configurable, because some component may want to cause\r\n // a fatal error in this case?\r\n }\r\n }\r\n // Create service instances for the pending promises and resolve them\r\n // NOTE: if this.multipleInstances is false, only the default instance will be created\r\n // and all promises with resolve with it regardless of the identifier.\r\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n try {\r\n // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n instanceDeferred.resolve(instance);\r\n }\r\n catch (e) {\r\n // when the instance factory throws an exception, it should not cause\r\n // a fatal error. We just leave the promise unresolved.\r\n }\r\n }\r\n }\r\n clearInstance(identifier = DEFAULT_ENTRY_NAME) {\r\n this.instancesDeferred.delete(identifier);\r\n this.instancesOptions.delete(identifier);\r\n this.instances.delete(identifier);\r\n }\r\n // app.delete() will call this method on every provider to delete the services\r\n // TODO: should we mark the provider as deleted?\r\n async delete() {\r\n const services = Array.from(this.instances.values());\r\n await Promise.all([\r\n ...services\r\n .filter(service => 'INTERNAL' in service) // legacy services\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .map(service => service.INTERNAL.delete()),\r\n ...services\r\n .filter(service => '_delete' in service) // modularized services\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .map(service => service._delete())\r\n ]);\r\n }\r\n isComponentSet() {\r\n return this.component != null;\r\n }\r\n isInitialized(identifier = DEFAULT_ENTRY_NAME) {\r\n return this.instances.has(identifier);\r\n }\r\n getOptions(identifier = DEFAULT_ENTRY_NAME) {\r\n return this.instancesOptions.get(identifier) || {};\r\n }\r\n initialize(opts = {}) {\r\n const { options = {} } = opts;\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier);\r\n if (this.isInitialized(normalizedIdentifier)) {\r\n throw Error(`${this.name}(${normalizedIdentifier}) has already been initialized`);\r\n }\r\n if (!this.isComponentSet()) {\r\n throw Error(`Component ${this.name} has not been registered yet`);\r\n }\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier,\r\n options\r\n });\r\n // resolve any pending promise waiting for the service instance\r\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n if (normalizedIdentifier === normalizedDeferredIdentifier) {\r\n instanceDeferred.resolve(instance);\r\n }\r\n }\r\n return instance;\r\n }\r\n /**\r\n *\r\n * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().\r\n * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.\r\n *\r\n * @param identifier An optional instance identifier\r\n * @returns a function to unregister the callback\r\n */\r\n onInit(callback, identifier) {\r\n var _a;\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n const existingCallbacks = (_a = this.onInitCallbacks.get(normalizedIdentifier)) !== null && _a !== void 0 ? _a : new Set();\r\n existingCallbacks.add(callback);\r\n this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);\r\n const existingInstance = this.instances.get(normalizedIdentifier);\r\n if (existingInstance) {\r\n callback(existingInstance, normalizedIdentifier);\r\n }\r\n return () => {\r\n existingCallbacks.delete(callback);\r\n };\r\n }\r\n /**\r\n * Invoke onInit callbacks synchronously\r\n * @param instance the service instance`\r\n */\r\n invokeOnInitCallbacks(instance, identifier) {\r\n const callbacks = this.onInitCallbacks.get(identifier);\r\n if (!callbacks) {\r\n return;\r\n }\r\n for (const callback of callbacks) {\r\n try {\r\n callback(instance, identifier);\r\n }\r\n catch (_a) {\r\n // ignore errors in the onInit callback\r\n }\r\n }\r\n }\r\n getOrInitializeService({ instanceIdentifier, options = {} }) {\r\n let instance = this.instances.get(instanceIdentifier);\r\n if (!instance && this.component) {\r\n instance = this.component.instanceFactory(this.container, {\r\n instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),\r\n options\r\n });\r\n this.instances.set(instanceIdentifier, instance);\r\n this.instancesOptions.set(instanceIdentifier, options);\r\n /**\r\n * Invoke onInit listeners.\r\n * Note this.component.onInstanceCreated is different, which is used by the component creator,\r\n * while onInit listeners are registered by consumers of the provider.\r\n */\r\n this.invokeOnInitCallbacks(instance, instanceIdentifier);\r\n /**\r\n * Order is important\r\n * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which\r\n * makes `isInitialized()` return true.\r\n */\r\n if (this.component.onInstanceCreated) {\r\n try {\r\n this.component.onInstanceCreated(this.container, instanceIdentifier, instance);\r\n }\r\n catch (_a) {\r\n // ignore errors in the onInstanceCreatedCallback\r\n }\r\n }\r\n }\r\n return instance || null;\r\n }\r\n normalizeInstanceIdentifier(identifier = DEFAULT_ENTRY_NAME) {\r\n if (this.component) {\r\n return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;\r\n }\r\n else {\r\n return identifier; // assume multiple instances are supported before the component is provided.\r\n }\r\n }\r\n shouldAutoInitialize() {\r\n return (!!this.component &&\r\n this.component.instantiationMode !== \"EXPLICIT\" /* InstantiationMode.EXPLICIT */);\r\n }\r\n}\r\n// undefined should be passed to the service factory for the default instance\r\nfunction normalizeIdentifierForFactory(identifier) {\r\n return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;\r\n}\r\nfunction isComponentEager(component) {\r\n return component.instantiationMode === \"EAGER\" /* InstantiationMode.EAGER */;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass ComponentContainer {\r\n constructor(name) {\r\n this.name = name;\r\n this.providers = new Map();\r\n }\r\n /**\r\n *\r\n * @param component Component being added\r\n * @param overwrite When a component with the same name has already been registered,\r\n * if overwrite is true: overwrite the existing component with the new component and create a new\r\n * provider with the new component. It can be useful in tests where you want to use different mocks\r\n * for different tests.\r\n * if overwrite is false: throw an exception\r\n */\r\n addComponent(component) {\r\n const provider = this.getProvider(component.name);\r\n if (provider.isComponentSet()) {\r\n throw new Error(`Component ${component.name} has already been registered with ${this.name}`);\r\n }\r\n provider.setComponent(component);\r\n }\r\n addOrOverwriteComponent(component) {\r\n const provider = this.getProvider(component.name);\r\n if (provider.isComponentSet()) {\r\n // delete the existing provider from the container, so we can register the new component\r\n this.providers.delete(component.name);\r\n }\r\n this.addComponent(component);\r\n }\r\n /**\r\n * getProvider provides a type safe interface where it can only be called with a field name\r\n * present in NameServiceMapping interface.\r\n *\r\n * Firebase SDKs providing services should extend NameServiceMapping interface to register\r\n * themselves.\r\n */\r\n getProvider(name) {\r\n if (this.providers.has(name)) {\r\n return this.providers.get(name);\r\n }\r\n // create a Provider for a service that hasn't registered with Firebase\r\n const provider = new Provider(name, this);\r\n this.providers.set(name, provider);\r\n return provider;\r\n }\r\n getProviders() {\r\n return Array.from(this.providers.values());\r\n }\r\n}\n\nexport { Component, ComponentContainer, Provider };\n//# sourceMappingURL=index.esm2017.js.map\n","/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A container for all of the Logger instances\r\n */\r\nconst instances = [];\r\n/**\r\n * The JS SDK supports 5 log levels and also allows a user the ability to\r\n * silence the logs altogether.\r\n *\r\n * The order is a follows:\r\n * DEBUG < VERBOSE < INFO < WARN < ERROR\r\n *\r\n * All of the log types above the current log level will be captured (i.e. if\r\n * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and\r\n * `VERBOSE` logs will not)\r\n */\r\nvar LogLevel;\r\n(function (LogLevel) {\r\n LogLevel[LogLevel[\"DEBUG\"] = 0] = \"DEBUG\";\r\n LogLevel[LogLevel[\"VERBOSE\"] = 1] = \"VERBOSE\";\r\n LogLevel[LogLevel[\"INFO\"] = 2] = \"INFO\";\r\n LogLevel[LogLevel[\"WARN\"] = 3] = \"WARN\";\r\n LogLevel[LogLevel[\"ERROR\"] = 4] = \"ERROR\";\r\n LogLevel[LogLevel[\"SILENT\"] = 5] = \"SILENT\";\r\n})(LogLevel || (LogLevel = {}));\r\nconst levelStringToEnum = {\r\n 'debug': LogLevel.DEBUG,\r\n 'verbose': LogLevel.VERBOSE,\r\n 'info': LogLevel.INFO,\r\n 'warn': LogLevel.WARN,\r\n 'error': LogLevel.ERROR,\r\n 'silent': LogLevel.SILENT\r\n};\r\n/**\r\n * The default log level\r\n */\r\nconst defaultLogLevel = LogLevel.INFO;\r\n/**\r\n * By default, `console.debug` is not displayed in the developer console (in\r\n * chrome). To avoid forcing users to have to opt-in to these logs twice\r\n * (i.e. once for firebase, and once in the console), we are sending `DEBUG`\r\n * logs to the `console.log` function.\r\n */\r\nconst ConsoleMethod = {\r\n [LogLevel.DEBUG]: 'log',\r\n [LogLevel.VERBOSE]: 'log',\r\n [LogLevel.INFO]: 'info',\r\n [LogLevel.WARN]: 'warn',\r\n [LogLevel.ERROR]: 'error'\r\n};\r\n/**\r\n * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR\r\n * messages on to their corresponding console counterparts (if the log method\r\n * is supported by the current log level)\r\n */\r\nconst defaultLogHandler = (instance, logType, ...args) => {\r\n if (logType < instance.logLevel) {\r\n return;\r\n }\r\n const now = new Date().toISOString();\r\n const method = ConsoleMethod[logType];\r\n if (method) {\r\n console[method](`[${now}] ${instance.name}:`, ...args);\r\n }\r\n else {\r\n throw new Error(`Attempted to log a message with an invalid logType (value: ${logType})`);\r\n }\r\n};\r\nclass Logger {\r\n /**\r\n * Gives you an instance of a Logger to capture messages according to\r\n * Firebase's logging scheme.\r\n *\r\n * @param name The name that the logs will be associated with\r\n */\r\n constructor(name) {\r\n this.name = name;\r\n /**\r\n * The log level of the given Logger instance.\r\n */\r\n this._logLevel = defaultLogLevel;\r\n /**\r\n * The main (internal) log handler for the Logger instance.\r\n * Can be set to a new function in internal package code but not by user.\r\n */\r\n this._logHandler = defaultLogHandler;\r\n /**\r\n * The optional, additional, user-defined log handler for the Logger instance.\r\n */\r\n this._userLogHandler = null;\r\n /**\r\n * Capture the current instance for later use\r\n */\r\n instances.push(this);\r\n }\r\n get logLevel() {\r\n return this._logLevel;\r\n }\r\n set logLevel(val) {\r\n if (!(val in LogLevel)) {\r\n throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\r\n }\r\n this._logLevel = val;\r\n }\r\n // Workaround for setter/getter having to be the same type.\r\n setLogLevel(val) {\r\n this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val;\r\n }\r\n get logHandler() {\r\n return this._logHandler;\r\n }\r\n set logHandler(val) {\r\n if (typeof val !== 'function') {\r\n throw new TypeError('Value assigned to `logHandler` must be a function');\r\n }\r\n this._logHandler = val;\r\n }\r\n get userLogHandler() {\r\n return this._userLogHandler;\r\n }\r\n set userLogHandler(val) {\r\n this._userLogHandler = val;\r\n }\r\n /**\r\n * The functions below are all based on the `console` interface\r\n */\r\n debug(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args);\r\n this._logHandler(this, LogLevel.DEBUG, ...args);\r\n }\r\n log(...args) {\r\n this._userLogHandler &&\r\n this._userLogHandler(this, LogLevel.VERBOSE, ...args);\r\n this._logHandler(this, LogLevel.VERBOSE, ...args);\r\n }\r\n info(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args);\r\n this._logHandler(this, LogLevel.INFO, ...args);\r\n }\r\n warn(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args);\r\n this._logHandler(this, LogLevel.WARN, ...args);\r\n }\r\n error(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args);\r\n this._logHandler(this, LogLevel.ERROR, ...args);\r\n }\r\n}\r\nfunction setLogLevel(level) {\r\n instances.forEach(inst => {\r\n inst.setLogLevel(level);\r\n });\r\n}\r\nfunction setUserLogHandler(logCallback, options) {\r\n for (const instance of instances) {\r\n let customLogLevel = null;\r\n if (options && options.level) {\r\n customLogLevel = levelStringToEnum[options.level];\r\n }\r\n if (logCallback === null) {\r\n instance.userLogHandler = null;\r\n }\r\n else {\r\n instance.userLogHandler = (instance, level, ...args) => {\r\n const message = args\r\n .map(arg => {\r\n if (arg == null) {\r\n return null;\r\n }\r\n else if (typeof arg === 'string') {\r\n return arg;\r\n }\r\n else if (typeof arg === 'number' || typeof arg === 'boolean') {\r\n return arg.toString();\r\n }\r\n else if (arg instanceof Error) {\r\n return arg.message;\r\n }\r\n else {\r\n try {\r\n return JSON.stringify(arg);\r\n }\r\n catch (ignored) {\r\n return null;\r\n }\r\n }\r\n })\r\n .filter(arg => arg)\r\n .join(' ');\r\n if (level >= (customLogLevel !== null && customLogLevel !== void 0 ? customLogLevel : instance.logLevel)) {\r\n logCallback({\r\n level: LogLevel[level].toLowerCase(),\r\n message,\r\n args,\r\n type: instance.name\r\n });\r\n }\r\n };\r\n }\r\n }\r\n}\n\nexport { LogLevel, Logger, setLogLevel, setUserLogHandler };\n//# sourceMappingURL=index.esm2017.js.map\n","const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n return (idbProxyableTypes ||\n (idbProxyableTypes = [\n IDBDatabase,\n IDBObjectStore,\n IDBIndex,\n IDBCursor,\n IDBTransaction,\n ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n return (cursorAdvanceMethods ||\n (cursorAdvanceMethods = [\n IDBCursor.prototype.advance,\n IDBCursor.prototype.continue,\n IDBCursor.prototype.continuePrimaryKey,\n ]));\n}\nconst cursorRequestMap = new WeakMap();\nconst transactionDoneMap = new WeakMap();\nconst transactionStoreNamesMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n const promise = new Promise((resolve, reject) => {\n const unlisten = () => {\n request.removeEventListener('success', success);\n request.removeEventListener('error', error);\n };\n const success = () => {\n resolve(wrap(request.result));\n unlisten();\n };\n const error = () => {\n reject(request.error);\n unlisten();\n };\n request.addEventListener('success', success);\n request.addEventListener('error', error);\n });\n promise\n .then((value) => {\n // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval\n // (see wrapFunction).\n if (value instanceof IDBCursor) {\n cursorRequestMap.set(value, request);\n }\n // Catching to avoid \"Uncaught Promise exceptions\"\n })\n .catch(() => { });\n // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This\n // is because we create many promises from a single IDBRequest.\n reverseTransformCache.set(promise, request);\n return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n // Early bail if we've already created a done promise for this transaction.\n if (transactionDoneMap.has(tx))\n return;\n const done = new Promise((resolve, reject) => {\n const unlisten = () => {\n tx.removeEventListener('complete', complete);\n tx.removeEventListener('error', error);\n tx.removeEventListener('abort', error);\n };\n const complete = () => {\n resolve();\n unlisten();\n };\n const error = () => {\n reject(tx.error || new DOMException('AbortError', 'AbortError'));\n unlisten();\n };\n tx.addEventListener('complete', complete);\n tx.addEventListener('error', error);\n tx.addEventListener('abort', error);\n });\n // Cache it for later retrieval.\n transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n get(target, prop, receiver) {\n if (target instanceof IDBTransaction) {\n // Special handling for transaction.done.\n if (prop === 'done')\n return transactionDoneMap.get(target);\n // Polyfill for objectStoreNames because of Edge.\n if (prop === 'objectStoreNames') {\n return target.objectStoreNames || transactionStoreNamesMap.get(target);\n }\n // Make tx.store return the only store in the transaction, or undefined if there are many.\n if (prop === 'store') {\n return receiver.objectStoreNames[1]\n ? undefined\n : receiver.objectStore(receiver.objectStoreNames[0]);\n }\n }\n // Else transform whatever we get back.\n return wrap(target[prop]);\n },\n set(target, prop, value) {\n target[prop] = value;\n return true;\n },\n has(target, prop) {\n if (target instanceof IDBTransaction &&\n (prop === 'done' || prop === 'store')) {\n return true;\n }\n return prop in target;\n },\n};\nfunction replaceTraps(callback) {\n idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n // Due to expected object equality (which is enforced by the caching in `wrap`), we\n // only create one new func per func.\n // Edge doesn't support objectStoreNames (booo), so we polyfill it here.\n if (func === IDBDatabase.prototype.transaction &&\n !('objectStoreNames' in IDBTransaction.prototype)) {\n return function (storeNames, ...args) {\n const tx = func.call(unwrap(this), storeNames, ...args);\n transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);\n return wrap(tx);\n };\n }\n // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n // with real promises, so each advance methods returns a new promise for the cursor object, or\n // undefined if the end of the cursor has been reached.\n if (getCursorAdvanceMethods().includes(func)) {\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n func.apply(unwrap(this), args);\n return wrap(cursorRequestMap.get(this));\n };\n }\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n return wrap(func.apply(unwrap(this), args));\n };\n}\nfunction transformCachableValue(value) {\n if (typeof value === 'function')\n return wrapFunction(value);\n // This doesn't return, it just creates a 'done' promise for the transaction,\n // which is later returned for transaction.done (see idbObjectHandler).\n if (value instanceof IDBTransaction)\n cacheDonePromiseForTransaction(value);\n if (instanceOfAny(value, getIdbProxyableTypes()))\n return new Proxy(value, idbProxyTraps);\n // Return the same value back if we're not going to transform it.\n return value;\n}\nfunction wrap(value) {\n // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n if (value instanceof IDBRequest)\n return promisifyRequest(value);\n // If we've already transformed this value before, reuse the transformed value.\n // This is faster, but it also provides object equality.\n if (transformCache.has(value))\n return transformCache.get(value);\n const newValue = transformCachableValue(value);\n // Not all types are transformed.\n // These may be primitive types, so they can't be WeakMap keys.\n if (newValue !== value) {\n transformCache.set(value, newValue);\n reverseTransformCache.set(newValue, value);\n }\n return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\nexport { reverseTransformCache as a, instanceOfAny as i, replaceTraps as r, unwrap as u, wrap as w };\n","import { w as wrap, r as replaceTraps } from './wrap-idb-value.js';\nexport { u as unwrap, w as wrap } from './wrap-idb-value.js';\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n const request = indexedDB.open(name, version);\n const openPromise = wrap(request);\n if (upgrade) {\n request.addEventListener('upgradeneeded', (event) => {\n upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction), event);\n });\n }\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event.newVersion, event));\n }\n openPromise\n .then((db) => {\n if (terminated)\n db.addEventListener('close', () => terminated());\n if (blocking) {\n db.addEventListener('versionchange', (event) => blocking(event.oldVersion, event.newVersion, event));\n }\n })\n .catch(() => { });\n return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n const request = indexedDB.deleteDatabase(name);\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event));\n }\n return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = new Map();\nfunction getMethod(target, prop) {\n if (!(target instanceof IDBDatabase &&\n !(prop in target) &&\n typeof prop === 'string')) {\n return;\n }\n if (cachedMethods.get(prop))\n return cachedMethods.get(prop);\n const targetFuncName = prop.replace(/FromIndex$/, '');\n const useIndex = prop !== targetFuncName;\n const isWrite = writeMethods.includes(targetFuncName);\n if (\n // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n !(isWrite || readMethods.includes(targetFuncName))) {\n return;\n }\n const method = async function (storeName, ...args) {\n // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n let target = tx.store;\n if (useIndex)\n target = target.index(args.shift());\n // Must reject if op rejects.\n // If it's a write operation, must reject if tx.done rejects.\n // Must reject with op rejection first.\n // Must resolve with op value.\n // Must handle both promises (no unhandled rejections)\n return (await Promise.all([\n target[targetFuncName](...args),\n isWrite && tx.done,\n ]))[0];\n };\n cachedMethods.set(prop, method);\n return method;\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nexport { deleteDB, openDB };\n","import { Component, ComponentContainer } from '@firebase/component';\nimport { Logger, setUserLogHandler, setLogLevel as setLogLevel$1 } from '@firebase/logger';\nimport { ErrorFactory, getDefaultAppConfig, deepEqual, isBrowser, isWebWorker, FirebaseError, base64urlEncodeWithoutPadding, isIndexedDBAvailable, validateIndexedDBOpenable } from '@firebase/util';\nexport { FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass PlatformLoggerServiceImpl {\r\n constructor(container) {\r\n this.container = container;\r\n }\r\n // In initial implementation, this will be called by installations on\r\n // auth token refresh, and installations will send this string.\r\n getPlatformInfoString() {\r\n const providers = this.container.getProviders();\r\n // Loop through providers and get library/version pairs from any that are\r\n // version components.\r\n return providers\r\n .map(provider => {\r\n if (isVersionServiceProvider(provider)) {\r\n const service = provider.getImmediate();\r\n return `${service.library}/${service.version}`;\r\n }\r\n else {\r\n return null;\r\n }\r\n })\r\n .filter(logString => logString)\r\n .join(' ');\r\n }\r\n}\r\n/**\r\n *\r\n * @param provider check if this provider provides a VersionService\r\n *\r\n * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider\r\n * provides VersionService. The provider is not necessarily a 'app-version'\r\n * provider.\r\n */\r\nfunction isVersionServiceProvider(provider) {\r\n const component = provider.getComponent();\r\n return (component === null || component === void 0 ? void 0 : component.type) === \"VERSION\" /* ComponentType.VERSION */;\r\n}\n\nconst name$q = \"@firebase/app\";\nconst version$1 = \"0.10.13\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst logger = new Logger('@firebase/app');\n\nconst name$p = \"@firebase/app-compat\";\n\nconst name$o = \"@firebase/analytics-compat\";\n\nconst name$n = \"@firebase/analytics\";\n\nconst name$m = \"@firebase/app-check-compat\";\n\nconst name$l = \"@firebase/app-check\";\n\nconst name$k = \"@firebase/auth\";\n\nconst name$j = \"@firebase/auth-compat\";\n\nconst name$i = \"@firebase/database\";\n\nconst name$h = \"@firebase/data-connect\";\n\nconst name$g = \"@firebase/database-compat\";\n\nconst name$f = \"@firebase/functions\";\n\nconst name$e = \"@firebase/functions-compat\";\n\nconst name$d = \"@firebase/installations\";\n\nconst name$c = \"@firebase/installations-compat\";\n\nconst name$b = \"@firebase/messaging\";\n\nconst name$a = \"@firebase/messaging-compat\";\n\nconst name$9 = \"@firebase/performance\";\n\nconst name$8 = \"@firebase/performance-compat\";\n\nconst name$7 = \"@firebase/remote-config\";\n\nconst name$6 = \"@firebase/remote-config-compat\";\n\nconst name$5 = \"@firebase/storage\";\n\nconst name$4 = \"@firebase/storage-compat\";\n\nconst name$3 = \"@firebase/firestore\";\n\nconst name$2 = \"@firebase/vertexai-preview\";\n\nconst name$1 = \"@firebase/firestore-compat\";\n\nconst name = \"firebase\";\nconst version = \"10.14.1\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The default app name\r\n *\r\n * @internal\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\r\nconst PLATFORM_LOG_STRING = {\r\n [name$q]: 'fire-core',\r\n [name$p]: 'fire-core-compat',\r\n [name$n]: 'fire-analytics',\r\n [name$o]: 'fire-analytics-compat',\r\n [name$l]: 'fire-app-check',\r\n [name$m]: 'fire-app-check-compat',\r\n [name$k]: 'fire-auth',\r\n [name$j]: 'fire-auth-compat',\r\n [name$i]: 'fire-rtdb',\r\n [name$h]: 'fire-data-connect',\r\n [name$g]: 'fire-rtdb-compat',\r\n [name$f]: 'fire-fn',\r\n [name$e]: 'fire-fn-compat',\r\n [name$d]: 'fire-iid',\r\n [name$c]: 'fire-iid-compat',\r\n [name$b]: 'fire-fcm',\r\n [name$a]: 'fire-fcm-compat',\r\n [name$9]: 'fire-perf',\r\n [name$8]: 'fire-perf-compat',\r\n [name$7]: 'fire-rc',\r\n [name$6]: 'fire-rc-compat',\r\n [name$5]: 'fire-gcs',\r\n [name$4]: 'fire-gcs-compat',\r\n [name$3]: 'fire-fst',\r\n [name$1]: 'fire-fst-compat',\r\n [name$2]: 'fire-vertex',\r\n 'fire-js': 'fire-js',\r\n [name]: 'fire-js-all'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @internal\r\n */\r\nconst _apps = new Map();\r\n/**\r\n * @internal\r\n */\r\nconst _serverApps = new Map();\r\n/**\r\n * Registered components.\r\n *\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst _components = new Map();\r\n/**\r\n * @param component - the component being added to this app's container\r\n *\r\n * @internal\r\n */\r\nfunction _addComponent(app, component) {\r\n try {\r\n app.container.addComponent(component);\r\n }\r\n catch (e) {\r\n logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app.name}`, e);\r\n }\r\n}\r\n/**\r\n *\r\n * @internal\r\n */\r\nfunction _addOrOverwriteComponent(app, component) {\r\n app.container.addOrOverwriteComponent(component);\r\n}\r\n/**\r\n *\r\n * @param component - the component to register\r\n * @returns whether or not the component is registered successfully\r\n *\r\n * @internal\r\n */\r\nfunction _registerComponent(component) {\r\n const componentName = component.name;\r\n if (_components.has(componentName)) {\r\n logger.debug(`There were multiple attempts to register component ${componentName}.`);\r\n return false;\r\n }\r\n _components.set(componentName, component);\r\n // add the component to existing app instances\r\n for (const app of _apps.values()) {\r\n _addComponent(app, component);\r\n }\r\n for (const serverApp of _serverApps.values()) {\r\n _addComponent(serverApp, component);\r\n }\r\n return true;\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n *\r\n * @returns the provider for the service with the matching name\r\n *\r\n * @internal\r\n */\r\nfunction _getProvider(app, name) {\r\n const heartbeatController = app.container\r\n .getProvider('heartbeat')\r\n .getImmediate({ optional: true });\r\n if (heartbeatController) {\r\n void heartbeatController.triggerHeartbeat();\r\n }\r\n return app.container.getProvider(name);\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n * @param instanceIdentifier - service instance identifier in case the service supports multiple instances\r\n *\r\n * @internal\r\n */\r\nfunction _removeServiceInstance(app, name, instanceIdentifier = DEFAULT_ENTRY_NAME) {\r\n _getProvider(app, name).clearInstance(instanceIdentifier);\r\n}\r\n/**\r\n *\r\n * @param obj - an object of type FirebaseApp or FirebaseOptions.\r\n *\r\n * @returns true if the provide object is of type FirebaseApp.\r\n *\r\n * @internal\r\n */\r\nfunction _isFirebaseApp(obj) {\r\n return obj.options !== undefined;\r\n}\r\n/**\r\n *\r\n * @param obj - an object of type FirebaseApp.\r\n *\r\n * @returns true if the provided object is of type FirebaseServerAppImpl.\r\n *\r\n * @internal\r\n */\r\nfunction _isFirebaseServerApp(obj) {\r\n return obj.settings !== undefined;\r\n}\r\n/**\r\n * Test only\r\n *\r\n * @internal\r\n */\r\nfunction _clearComponents() {\r\n _components.clear();\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERRORS = {\r\n [\"no-app\" /* AppError.NO_APP */]: \"No Firebase App '{$appName}' has been created - \" +\r\n 'call initializeApp() first',\r\n [\"bad-app-name\" /* AppError.BAD_APP_NAME */]: \"Illegal App name: '{$appName}'\",\r\n [\"duplicate-app\" /* AppError.DUPLICATE_APP */]: \"Firebase App named '{$appName}' already exists with different options or config\",\r\n [\"app-deleted\" /* AppError.APP_DELETED */]: \"Firebase App named '{$appName}' already deleted\",\r\n [\"server-app-deleted\" /* AppError.SERVER_APP_DELETED */]: 'Firebase Server App has been deleted',\r\n [\"no-options\" /* AppError.NO_OPTIONS */]: 'Need to provide options, when not being deployed to hosting via source.',\r\n [\"invalid-app-argument\" /* AppError.INVALID_APP_ARGUMENT */]: 'firebase.{$appName}() takes either no argument or a ' +\r\n 'Firebase App instance.',\r\n [\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */]: 'First argument to `onLog` must be null or a function.',\r\n [\"idb-open\" /* AppError.IDB_OPEN */]: 'Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-get\" /* AppError.IDB_GET */]: 'Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-set\" /* AppError.IDB_WRITE */]: 'Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-delete\" /* AppError.IDB_DELETE */]: 'Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"finalization-registry-not-supported\" /* AppError.FINALIZATION_REGISTRY_NOT_SUPPORTED */]: 'FirebaseServerApp deleteOnDeref field defined but the JS runtime does not support FinalizationRegistry.',\r\n [\"invalid-server-app-environment\" /* AppError.INVALID_SERVER_APP_ENVIRONMENT */]: 'FirebaseServerApp is not for use in browser environments.'\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory('app', 'Firebase', ERRORS);\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass FirebaseAppImpl {\r\n constructor(options, config, container) {\r\n this._isDeleted = false;\r\n this._options = Object.assign({}, options);\r\n this._config = Object.assign({}, config);\r\n this._name = config.name;\r\n this._automaticDataCollectionEnabled =\r\n config.automaticDataCollectionEnabled;\r\n this._container = container;\r\n this.container.addComponent(new Component('app', () => this, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n }\r\n get automaticDataCollectionEnabled() {\r\n this.checkDestroyed();\r\n return this._automaticDataCollectionEnabled;\r\n }\r\n set automaticDataCollectionEnabled(val) {\r\n this.checkDestroyed();\r\n this._automaticDataCollectionEnabled = val;\r\n }\r\n get name() {\r\n this.checkDestroyed();\r\n return this._name;\r\n }\r\n get options() {\r\n this.checkDestroyed();\r\n return this._options;\r\n }\r\n get config() {\r\n this.checkDestroyed();\r\n return this._config;\r\n }\r\n get container() {\r\n return this._container;\r\n }\r\n get isDeleted() {\r\n return this._isDeleted;\r\n }\r\n set isDeleted(val) {\r\n this._isDeleted = val;\r\n }\r\n /**\r\n * This function will throw an Error if the App has already been deleted -\r\n * use before performing API actions on the App.\r\n */\r\n checkDestroyed() {\r\n if (this.isDeleted) {\r\n throw ERROR_FACTORY.create(\"app-deleted\" /* AppError.APP_DELETED */, { appName: this._name });\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2023 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass FirebaseServerAppImpl extends FirebaseAppImpl {\r\n constructor(options, serverConfig, name, container) {\r\n // Build configuration parameters for the FirebaseAppImpl base class.\r\n const automaticDataCollectionEnabled = serverConfig.automaticDataCollectionEnabled !== undefined\r\n ? serverConfig.automaticDataCollectionEnabled\r\n : false;\r\n // Create the FirebaseAppSettings object for the FirebaseAppImp constructor.\r\n const config = {\r\n name,\r\n automaticDataCollectionEnabled\r\n };\r\n if (options.apiKey !== undefined) {\r\n // Construct the parent FirebaseAppImp object.\r\n super(options, config, container);\r\n }\r\n else {\r\n const appImpl = options;\r\n super(appImpl.options, config, container);\r\n }\r\n // Now construct the data for the FirebaseServerAppImpl.\r\n this._serverConfig = Object.assign({ automaticDataCollectionEnabled }, serverConfig);\r\n this._finalizationRegistry = null;\r\n if (typeof FinalizationRegistry !== 'undefined') {\r\n this._finalizationRegistry = new FinalizationRegistry(() => {\r\n this.automaticCleanup();\r\n });\r\n }\r\n this._refCount = 0;\r\n this.incRefCount(this._serverConfig.releaseOnDeref);\r\n // Do not retain a hard reference to the dref object, otherwise the FinalizationRegistry\r\n // will never trigger.\r\n this._serverConfig.releaseOnDeref = undefined;\r\n serverConfig.releaseOnDeref = undefined;\r\n registerVersion(name$q, version$1, 'serverapp');\r\n }\r\n toJSON() {\r\n return undefined;\r\n }\r\n get refCount() {\r\n return this._refCount;\r\n }\r\n // Increment the reference count of this server app. If an object is provided, register it\r\n // with the finalization registry.\r\n incRefCount(obj) {\r\n if (this.isDeleted) {\r\n return;\r\n }\r\n this._refCount++;\r\n if (obj !== undefined && this._finalizationRegistry !== null) {\r\n this._finalizationRegistry.register(obj, this);\r\n }\r\n }\r\n // Decrement the reference count.\r\n decRefCount() {\r\n if (this.isDeleted) {\r\n return 0;\r\n }\r\n return --this._refCount;\r\n }\r\n // Invoked by the FinalizationRegistry callback to note that this app should go through its\r\n // reference counts and delete itself if no reference count remain. The coordinating logic that\r\n // handles this is in deleteApp(...).\r\n automaticCleanup() {\r\n void deleteApp(this);\r\n }\r\n get settings() {\r\n this.checkDestroyed();\r\n return this._serverConfig;\r\n }\r\n /**\r\n * This function will throw an Error if the App has already been deleted -\r\n * use before performing API actions on the App.\r\n */\r\n checkDestroyed() {\r\n if (this.isDeleted) {\r\n throw ERROR_FACTORY.create(\"server-app-deleted\" /* AppError.SERVER_APP_DELETED */);\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The current SDK version.\r\n *\r\n * @public\r\n */\r\nconst SDK_VERSION = version;\r\nfunction initializeApp(_options, rawConfig = {}) {\r\n let options = _options;\r\n if (typeof rawConfig !== 'object') {\r\n const name = rawConfig;\r\n rawConfig = { name };\r\n }\r\n const config = Object.assign({ name: DEFAULT_ENTRY_NAME, automaticDataCollectionEnabled: false }, rawConfig);\r\n const name = config.name;\r\n if (typeof name !== 'string' || !name) {\r\n throw ERROR_FACTORY.create(\"bad-app-name\" /* AppError.BAD_APP_NAME */, {\r\n appName: String(name)\r\n });\r\n }\r\n options || (options = getDefaultAppConfig());\r\n if (!options) {\r\n throw ERROR_FACTORY.create(\"no-options\" /* AppError.NO_OPTIONS */);\r\n }\r\n const existingApp = _apps.get(name);\r\n if (existingApp) {\r\n // return the existing app if options and config deep equal the ones in the existing app.\r\n if (deepEqual(options, existingApp.options) &&\r\n deepEqual(config, existingApp.config)) {\r\n return existingApp;\r\n }\r\n else {\r\n throw ERROR_FACTORY.create(\"duplicate-app\" /* AppError.DUPLICATE_APP */, { appName: name });\r\n }\r\n }\r\n const container = new ComponentContainer(name);\r\n for (const component of _components.values()) {\r\n container.addComponent(component);\r\n }\r\n const newApp = new FirebaseAppImpl(options, config, container);\r\n _apps.set(name, newApp);\r\n return newApp;\r\n}\r\nfunction initializeServerApp(_options, _serverAppConfig) {\r\n if (isBrowser() && !isWebWorker()) {\r\n // FirebaseServerApp isn't designed to be run in browsers.\r\n throw ERROR_FACTORY.create(\"invalid-server-app-environment\" /* AppError.INVALID_SERVER_APP_ENVIRONMENT */);\r\n }\r\n if (_serverAppConfig.automaticDataCollectionEnabled === undefined) {\r\n _serverAppConfig.automaticDataCollectionEnabled = false;\r\n }\r\n let appOptions;\r\n if (_isFirebaseApp(_options)) {\r\n appOptions = _options.options;\r\n }\r\n else {\r\n appOptions = _options;\r\n }\r\n // Build an app name based on a hash of the configuration options.\r\n const nameObj = Object.assign(Object.assign({}, _serverAppConfig), appOptions);\r\n // However, Do not mangle the name based on releaseOnDeref, since it will vary between the\r\n // construction of FirebaseServerApp instances. For example, if the object is the request headers.\r\n if (nameObj.releaseOnDeref !== undefined) {\r\n delete nameObj.releaseOnDeref;\r\n }\r\n const hashCode = (s) => {\r\n return [...s].reduce((hash, c) => (Math.imul(31, hash) + c.charCodeAt(0)) | 0, 0);\r\n };\r\n if (_serverAppConfig.releaseOnDeref !== undefined) {\r\n if (typeof FinalizationRegistry === 'undefined') {\r\n throw ERROR_FACTORY.create(\"finalization-registry-not-supported\" /* AppError.FINALIZATION_REGISTRY_NOT_SUPPORTED */, {});\r\n }\r\n }\r\n const nameString = '' + hashCode(JSON.stringify(nameObj));\r\n const existingApp = _serverApps.get(nameString);\r\n if (existingApp) {\r\n existingApp.incRefCount(_serverAppConfig.releaseOnDeref);\r\n return existingApp;\r\n }\r\n const container = new ComponentContainer(nameString);\r\n for (const component of _components.values()) {\r\n container.addComponent(component);\r\n }\r\n const newApp = new FirebaseServerAppImpl(appOptions, _serverAppConfig, nameString, container);\r\n _serverApps.set(nameString, newApp);\r\n return newApp;\r\n}\r\n/**\r\n * Retrieves a {@link @firebase/app#FirebaseApp} instance.\r\n *\r\n * When called with no arguments, the default app is returned. When an app name\r\n * is provided, the app corresponding to that name is returned.\r\n *\r\n * An exception is thrown if the app being retrieved has not yet been\r\n * initialized.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return the default app\r\n * const app = getApp();\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return a named app\r\n * const otherApp = getApp(\"otherApp\");\r\n * ```\r\n *\r\n * @param name - Optional name of the app to return. If no name is\r\n * provided, the default is `\"[DEFAULT]\"`.\r\n *\r\n * @returns The app corresponding to the provided app name.\r\n * If no app name is provided, the default app is returned.\r\n *\r\n * @public\r\n */\r\nfunction getApp(name = DEFAULT_ENTRY_NAME) {\r\n const app = _apps.get(name);\r\n if (!app && name === DEFAULT_ENTRY_NAME && getDefaultAppConfig()) {\r\n return initializeApp();\r\n }\r\n if (!app) {\r\n throw ERROR_FACTORY.create(\"no-app\" /* AppError.NO_APP */, { appName: name });\r\n }\r\n return app;\r\n}\r\n/**\r\n * A (read-only) array of all initialized apps.\r\n * @public\r\n */\r\nfunction getApps() {\r\n return Array.from(_apps.values());\r\n}\r\n/**\r\n * Renders this app unusable and frees the resources of all associated\r\n * services.\r\n *\r\n * @example\r\n * ```javascript\r\n * deleteApp(app)\r\n * .then(function() {\r\n * console.log(\"App deleted successfully\");\r\n * })\r\n * .catch(function(error) {\r\n * console.log(\"Error deleting app:\", error);\r\n * });\r\n * ```\r\n *\r\n * @public\r\n */\r\nasync function deleteApp(app) {\r\n let cleanupProviders = false;\r\n const name = app.name;\r\n if (_apps.has(name)) {\r\n cleanupProviders = true;\r\n _apps.delete(name);\r\n }\r\n else if (_serverApps.has(name)) {\r\n const firebaseServerApp = app;\r\n if (firebaseServerApp.decRefCount() <= 0) {\r\n _serverApps.delete(name);\r\n cleanupProviders = true;\r\n }\r\n }\r\n if (cleanupProviders) {\r\n await Promise.all(app.container\r\n .getProviders()\r\n .map(provider => provider.delete()));\r\n app.isDeleted = true;\r\n }\r\n}\r\n/**\r\n * Registers a library's name and version for platform logging purposes.\r\n * @param library - Name of 1p or 3p library (e.g. firestore, angularfire)\r\n * @param version - Current version of that library.\r\n * @param variant - Bundle variant, e.g., node, rn, etc.\r\n *\r\n * @public\r\n */\r\nfunction registerVersion(libraryKeyOrName, version, variant) {\r\n var _a;\r\n // TODO: We can use this check to whitelist strings when/if we set up\r\n // a good whitelist system.\r\n let library = (_a = PLATFORM_LOG_STRING[libraryKeyOrName]) !== null && _a !== void 0 ? _a : libraryKeyOrName;\r\n if (variant) {\r\n library += `-${variant}`;\r\n }\r\n const libraryMismatch = library.match(/\\s|\\//);\r\n const versionMismatch = version.match(/\\s|\\//);\r\n if (libraryMismatch || versionMismatch) {\r\n const warning = [\r\n `Unable to register library \"${library}\" with version \"${version}\":`\r\n ];\r\n if (libraryMismatch) {\r\n warning.push(`library name \"${library}\" contains illegal characters (whitespace or \"/\")`);\r\n }\r\n if (libraryMismatch && versionMismatch) {\r\n warning.push('and');\r\n }\r\n if (versionMismatch) {\r\n warning.push(`version name \"${version}\" contains illegal characters (whitespace or \"/\")`);\r\n }\r\n logger.warn(warning.join(' '));\r\n return;\r\n }\r\n _registerComponent(new Component(`${library}-version`, () => ({ library, version }), \"VERSION\" /* ComponentType.VERSION */));\r\n}\r\n/**\r\n * Sets log handler for all Firebase SDKs.\r\n * @param logCallback - An optional custom log handler that executes user code whenever\r\n * the Firebase SDK makes a logging call.\r\n *\r\n * @public\r\n */\r\nfunction onLog(logCallback, options) {\r\n if (logCallback !== null && typeof logCallback !== 'function') {\r\n throw ERROR_FACTORY.create(\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */);\r\n }\r\n setUserLogHandler(logCallback, options);\r\n}\r\n/**\r\n * Sets log level for all Firebase SDKs.\r\n *\r\n * All of the log types above the current log level are captured (i.e. if\r\n * you set the log level to `info`, errors are logged, but `debug` and\r\n * `verbose` logs are not).\r\n *\r\n * @public\r\n */\r\nfunction setLogLevel(logLevel) {\r\n setLogLevel$1(logLevel);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DB_NAME = 'firebase-heartbeat-database';\r\nconst DB_VERSION = 1;\r\nconst STORE_NAME = 'firebase-heartbeat-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DB_NAME, DB_VERSION, {\r\n upgrade: (db, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through\r\n // behavior is what we want, because if there are multiple versions between\r\n // the old version and the current version, we want ALL the migrations\r\n // that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n try {\r\n db.createObjectStore(STORE_NAME);\r\n }\r\n catch (e) {\r\n // Safari/iOS browsers throw occasional exceptions on\r\n // db.createObjectStore() that may be a bug. Avoid blocking\r\n // the rest of the app functionality.\r\n console.warn(e);\r\n }\r\n }\r\n }\r\n }).catch(e => {\r\n throw ERROR_FACTORY.create(\"idb-open\" /* AppError.IDB_OPEN */, {\r\n originalErrorMessage: e.message\r\n });\r\n });\r\n }\r\n return dbPromise;\r\n}\r\nasync function readHeartbeatsFromIndexedDB(app) {\r\n try {\r\n const db = await getDbPromise();\r\n const tx = db.transaction(STORE_NAME);\r\n const result = await tx.objectStore(STORE_NAME).get(computeKey(app));\r\n // We already have the value but tx.done can throw,\r\n // so we need to await it here to catch errors\r\n await tx.done;\r\n return result;\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError) {\r\n logger.warn(e.message);\r\n }\r\n else {\r\n const idbGetError = ERROR_FACTORY.create(\"idb-get\" /* AppError.IDB_GET */, {\r\n originalErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n logger.warn(idbGetError.message);\r\n }\r\n }\r\n}\r\nasync function writeHeartbeatsToIndexedDB(app, heartbeatObject) {\r\n try {\r\n const db = await getDbPromise();\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const objectStore = tx.objectStore(STORE_NAME);\r\n await objectStore.put(heartbeatObject, computeKey(app));\r\n await tx.done;\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError) {\r\n logger.warn(e.message);\r\n }\r\n else {\r\n const idbGetError = ERROR_FACTORY.create(\"idb-set\" /* AppError.IDB_WRITE */, {\r\n originalErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n logger.warn(idbGetError.message);\r\n }\r\n }\r\n}\r\nfunction computeKey(app) {\r\n return `${app.name}!${app.options.appId}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst MAX_HEADER_BYTES = 1024;\r\n// 30 days\r\nconst STORED_HEARTBEAT_RETENTION_MAX_MILLIS = 30 * 24 * 60 * 60 * 1000;\r\nclass HeartbeatServiceImpl {\r\n constructor(container) {\r\n this.container = container;\r\n /**\r\n * In-memory cache for heartbeats, used by getHeartbeatsHeader() to generate\r\n * the header string.\r\n * Stores one record per date. This will be consolidated into the standard\r\n * format of one record per user agent string before being sent as a header.\r\n * Populated from indexedDB when the controller is instantiated and should\r\n * be kept in sync with indexedDB.\r\n * Leave public for easier testing.\r\n */\r\n this._heartbeatsCache = null;\r\n const app = this.container.getProvider('app').getImmediate();\r\n this._storage = new HeartbeatStorageImpl(app);\r\n this._heartbeatsCachePromise = this._storage.read().then(result => {\r\n this._heartbeatsCache = result;\r\n return result;\r\n });\r\n }\r\n /**\r\n * Called to report a heartbeat. The function will generate\r\n * a HeartbeatsByUserAgent object, update heartbeatsCache, and persist it\r\n * to IndexedDB.\r\n * Note that we only store one heartbeat per day. So if a heartbeat for today is\r\n * already logged, subsequent calls to this function in the same day will be ignored.\r\n */\r\n async triggerHeartbeat() {\r\n var _a, _b;\r\n try {\r\n const platformLogger = this.container\r\n .getProvider('platform-logger')\r\n .getImmediate();\r\n // This is the \"Firebase user agent\" string from the platform logger\r\n // service, not the browser user agent.\r\n const agent = platformLogger.getPlatformInfoString();\r\n const date = getUTCDateString();\r\n if (((_a = this._heartbeatsCache) === null || _a === void 0 ? void 0 : _a.heartbeats) == null) {\r\n this._heartbeatsCache = await this._heartbeatsCachePromise;\r\n // If we failed to construct a heartbeats cache, then return immediately.\r\n if (((_b = this._heartbeatsCache) === null || _b === void 0 ? void 0 : _b.heartbeats) == null) {\r\n return;\r\n }\r\n }\r\n // Do not store a heartbeat if one is already stored for this day\r\n // or if a header has already been sent today.\r\n if (this._heartbeatsCache.lastSentHeartbeatDate === date ||\r\n this._heartbeatsCache.heartbeats.some(singleDateHeartbeat => singleDateHeartbeat.date === date)) {\r\n return;\r\n }\r\n else {\r\n // There is no entry for this date. Create one.\r\n this._heartbeatsCache.heartbeats.push({ date, agent });\r\n }\r\n // Remove entries older than 30 days.\r\n this._heartbeatsCache.heartbeats =\r\n this._heartbeatsCache.heartbeats.filter(singleDateHeartbeat => {\r\n const hbTimestamp = new Date(singleDateHeartbeat.date).valueOf();\r\n const now = Date.now();\r\n return now - hbTimestamp <= STORED_HEARTBEAT_RETENTION_MAX_MILLIS;\r\n });\r\n return this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n catch (e) {\r\n logger.warn(e);\r\n }\r\n }\r\n /**\r\n * Returns a base64 encoded string which can be attached to the heartbeat-specific header directly.\r\n * It also clears all heartbeats from memory as well as in IndexedDB.\r\n *\r\n * NOTE: Consuming product SDKs should not send the header if this method\r\n * returns an empty string.\r\n */\r\n async getHeartbeatsHeader() {\r\n var _a;\r\n try {\r\n if (this._heartbeatsCache === null) {\r\n await this._heartbeatsCachePromise;\r\n }\r\n // If it's still null or the array is empty, there is no data to send.\r\n if (((_a = this._heartbeatsCache) === null || _a === void 0 ? void 0 : _a.heartbeats) == null ||\r\n this._heartbeatsCache.heartbeats.length === 0) {\r\n return '';\r\n }\r\n const date = getUTCDateString();\r\n // Extract as many heartbeats from the cache as will fit under the size limit.\r\n const { heartbeatsToSend, unsentEntries } = extractHeartbeatsForHeader(this._heartbeatsCache.heartbeats);\r\n const headerString = base64urlEncodeWithoutPadding(JSON.stringify({ version: 2, heartbeats: heartbeatsToSend }));\r\n // Store last sent date to prevent another being logged/sent for the same day.\r\n this._heartbeatsCache.lastSentHeartbeatDate = date;\r\n if (unsentEntries.length > 0) {\r\n // Store any unsent entries if they exist.\r\n this._heartbeatsCache.heartbeats = unsentEntries;\r\n // This seems more likely than emptying the array (below) to lead to some odd state\r\n // since the cache isn't empty and this will be called again on the next request,\r\n // and is probably safest if we await it.\r\n await this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n else {\r\n this._heartbeatsCache.heartbeats = [];\r\n // Do not wait for this, to reduce latency.\r\n void this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n return headerString;\r\n }\r\n catch (e) {\r\n logger.warn(e);\r\n return '';\r\n }\r\n }\r\n}\r\nfunction getUTCDateString() {\r\n const today = new Date();\r\n // Returns date format 'YYYY-MM-DD'\r\n return today.toISOString().substring(0, 10);\r\n}\r\nfunction extractHeartbeatsForHeader(heartbeatsCache, maxSize = MAX_HEADER_BYTES) {\r\n // Heartbeats grouped by user agent in the standard format to be sent in\r\n // the header.\r\n const heartbeatsToSend = [];\r\n // Single date format heartbeats that are not sent.\r\n let unsentEntries = heartbeatsCache.slice();\r\n for (const singleDateHeartbeat of heartbeatsCache) {\r\n // Look for an existing entry with the same user agent.\r\n const heartbeatEntry = heartbeatsToSend.find(hb => hb.agent === singleDateHeartbeat.agent);\r\n if (!heartbeatEntry) {\r\n // If no entry for this user agent exists, create one.\r\n heartbeatsToSend.push({\r\n agent: singleDateHeartbeat.agent,\r\n dates: [singleDateHeartbeat.date]\r\n });\r\n if (countBytes(heartbeatsToSend) > maxSize) {\r\n // If the header would exceed max size, remove the added heartbeat\r\n // entry and stop adding to the header.\r\n heartbeatsToSend.pop();\r\n break;\r\n }\r\n }\r\n else {\r\n heartbeatEntry.dates.push(singleDateHeartbeat.date);\r\n // If the header would exceed max size, remove the added date\r\n // and stop adding to the header.\r\n if (countBytes(heartbeatsToSend) > maxSize) {\r\n heartbeatEntry.dates.pop();\r\n break;\r\n }\r\n }\r\n // Pop unsent entry from queue. (Skipped if adding the entry exceeded\r\n // quota and the loop breaks early.)\r\n unsentEntries = unsentEntries.slice(1);\r\n }\r\n return {\r\n heartbeatsToSend,\r\n unsentEntries\r\n };\r\n}\r\nclass HeartbeatStorageImpl {\r\n constructor(app) {\r\n this.app = app;\r\n this._canUseIndexedDBPromise = this.runIndexedDBEnvironmentCheck();\r\n }\r\n async runIndexedDBEnvironmentCheck() {\r\n if (!isIndexedDBAvailable()) {\r\n return false;\r\n }\r\n else {\r\n return validateIndexedDBOpenable()\r\n .then(() => true)\r\n .catch(() => false);\r\n }\r\n }\r\n /**\r\n * Read all heartbeats.\r\n */\r\n async read() {\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return { heartbeats: [] };\r\n }\r\n else {\r\n const idbHeartbeatObject = await readHeartbeatsFromIndexedDB(this.app);\r\n if (idbHeartbeatObject === null || idbHeartbeatObject === void 0 ? void 0 : idbHeartbeatObject.heartbeats) {\r\n return idbHeartbeatObject;\r\n }\r\n else {\r\n return { heartbeats: [] };\r\n }\r\n }\r\n }\r\n // overwrite the storage with the provided heartbeats\r\n async overwrite(heartbeatsObject) {\r\n var _a;\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return;\r\n }\r\n else {\r\n const existingHeartbeatsObject = await this.read();\r\n return writeHeartbeatsToIndexedDB(this.app, {\r\n lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n heartbeats: heartbeatsObject.heartbeats\r\n });\r\n }\r\n }\r\n // add heartbeats\r\n async add(heartbeatsObject) {\r\n var _a;\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return;\r\n }\r\n else {\r\n const existingHeartbeatsObject = await this.read();\r\n return writeHeartbeatsToIndexedDB(this.app, {\r\n lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n heartbeats: [\r\n ...existingHeartbeatsObject.heartbeats,\r\n ...heartbeatsObject.heartbeats\r\n ]\r\n });\r\n }\r\n }\r\n}\r\n/**\r\n * Calculate bytes of a HeartbeatsByUserAgent array after being wrapped\r\n * in a platform logging header JSON object, stringified, and converted\r\n * to base 64.\r\n */\r\nfunction countBytes(heartbeatsCache) {\r\n // base64 has a restricted set of characters, all of which should be 1 byte.\r\n return base64urlEncodeWithoutPadding(\r\n // heartbeatsCache wrapper properties\r\n JSON.stringify({ version: 2, heartbeats: heartbeatsCache })).length;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction registerCoreComponents(variant) {\r\n _registerComponent(new Component('platform-logger', container => new PlatformLoggerServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n _registerComponent(new Component('heartbeat', container => new HeartbeatServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n // Register `app` package.\r\n registerVersion(name$q, version$1, variant);\r\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n registerVersion(name$q, version$1, 'esm2017');\r\n // Register platform SDK identifier (no version).\r\n registerVersion('fire-js', '');\r\n}\n\n/**\r\n * Firebase App\r\n *\r\n * @remarks This package coordinates the communication between the different Firebase components\r\n * @packageDocumentation\r\n */\r\nregisterCoreComponents('');\n\nexport { SDK_VERSION, DEFAULT_ENTRY_NAME as _DEFAULT_ENTRY_NAME, _addComponent, _addOrOverwriteComponent, _apps, _clearComponents, _components, _getProvider, _isFirebaseApp, _isFirebaseServerApp, _registerComponent, _removeServiceInstance, _serverApps, deleteApp, getApp, getApps, initializeApp, initializeServerApp, onLog, registerVersion, setLogLevel };\n//# sourceMappingURL=index.esm2017.js.map\n","import { registerVersion } from '@firebase/app';\nexport * from '@firebase/app';\n\nvar name = \"firebase\";\nvar version = \"10.14.1\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nregisterVersion(name, version, 'app');\n//# sourceMappingURL=index.esm.js.map\n","var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nvar bloom_blob_es2018 = {};\n\n/** @license\nCopyright The Closure Library Authors.\nSPDX-License-Identifier: Apache-2.0\n*/\n\nvar Integer;\nvar Md5;\n(function() {var h;/** @license\n\n Copyright The Closure Library Authors.\n SPDX-License-Identifier: Apache-2.0\n*/\nfunction k(f,a){function c(){}c.prototype=a.prototype;f.D=a.prototype;f.prototype=new c;f.prototype.constructor=f;f.C=function(d,e,g){for(var b=Array(arguments.length-2),r=2;re;++e)d[e]=a.charCodeAt(c++)|a.charCodeAt(c++)<<8|a.charCodeAt(c++)<<16|a.charCodeAt(c++)<<24;else for(e=0;16>e;++e)d[e]=a[c++]|a[c++]<<8|a[c++]<<16|a[c++]<<24;a=f.g[0];c=f.g[1];e=f.g[2];var g=f.g[3];var b=a+(g^c&(e^g))+d[0]+3614090360&4294967295;a=c+(b<<7&4294967295|b>>>25);b=g+(e^a&(c^e))+d[1]+3905402710&4294967295;g=a+(b<<12&4294967295|b>>>20);b=e+(c^g&(a^c))+d[2]+606105819&4294967295;e=g+(b<<17&4294967295|b>>>15);\nb=c+(a^e&(g^a))+d[3]+3250441966&4294967295;c=e+(b<<22&4294967295|b>>>10);b=a+(g^c&(e^g))+d[4]+4118548399&4294967295;a=c+(b<<7&4294967295|b>>>25);b=g+(e^a&(c^e))+d[5]+1200080426&4294967295;g=a+(b<<12&4294967295|b>>>20);b=e+(c^g&(a^c))+d[6]+2821735955&4294967295;e=g+(b<<17&4294967295|b>>>15);b=c+(a^e&(g^a))+d[7]+4249261313&4294967295;c=e+(b<<22&4294967295|b>>>10);b=a+(g^c&(e^g))+d[8]+1770035416&4294967295;a=c+(b<<7&4294967295|b>>>25);b=g+(e^a&(c^e))+d[9]+2336552879&4294967295;g=a+(b<<12&4294967295|\nb>>>20);b=e+(c^g&(a^c))+d[10]+4294925233&4294967295;e=g+(b<<17&4294967295|b>>>15);b=c+(a^e&(g^a))+d[11]+2304563134&4294967295;c=e+(b<<22&4294967295|b>>>10);b=a+(g^c&(e^g))+d[12]+1804603682&4294967295;a=c+(b<<7&4294967295|b>>>25);b=g+(e^a&(c^e))+d[13]+4254626195&4294967295;g=a+(b<<12&4294967295|b>>>20);b=e+(c^g&(a^c))+d[14]+2792965006&4294967295;e=g+(b<<17&4294967295|b>>>15);b=c+(a^e&(g^a))+d[15]+1236535329&4294967295;c=e+(b<<22&4294967295|b>>>10);b=a+(e^g&(c^e))+d[1]+4129170786&4294967295;a=c+(b<<\n5&4294967295|b>>>27);b=g+(c^e&(a^c))+d[6]+3225465664&4294967295;g=a+(b<<9&4294967295|b>>>23);b=e+(a^c&(g^a))+d[11]+643717713&4294967295;e=g+(b<<14&4294967295|b>>>18);b=c+(g^a&(e^g))+d[0]+3921069994&4294967295;c=e+(b<<20&4294967295|b>>>12);b=a+(e^g&(c^e))+d[5]+3593408605&4294967295;a=c+(b<<5&4294967295|b>>>27);b=g+(c^e&(a^c))+d[10]+38016083&4294967295;g=a+(b<<9&4294967295|b>>>23);b=e+(a^c&(g^a))+d[15]+3634488961&4294967295;e=g+(b<<14&4294967295|b>>>18);b=c+(g^a&(e^g))+d[4]+3889429448&4294967295;c=\ne+(b<<20&4294967295|b>>>12);b=a+(e^g&(c^e))+d[9]+568446438&4294967295;a=c+(b<<5&4294967295|b>>>27);b=g+(c^e&(a^c))+d[14]+3275163606&4294967295;g=a+(b<<9&4294967295|b>>>23);b=e+(a^c&(g^a))+d[3]+4107603335&4294967295;e=g+(b<<14&4294967295|b>>>18);b=c+(g^a&(e^g))+d[8]+1163531501&4294967295;c=e+(b<<20&4294967295|b>>>12);b=a+(e^g&(c^e))+d[13]+2850285829&4294967295;a=c+(b<<5&4294967295|b>>>27);b=g+(c^e&(a^c))+d[2]+4243563512&4294967295;g=a+(b<<9&4294967295|b>>>23);b=e+(a^c&(g^a))+d[7]+1735328473&4294967295;\ne=g+(b<<14&4294967295|b>>>18);b=c+(g^a&(e^g))+d[12]+2368359562&4294967295;c=e+(b<<20&4294967295|b>>>12);b=a+(c^e^g)+d[5]+4294588738&4294967295;a=c+(b<<4&4294967295|b>>>28);b=g+(a^c^e)+d[8]+2272392833&4294967295;g=a+(b<<11&4294967295|b>>>21);b=e+(g^a^c)+d[11]+1839030562&4294967295;e=g+(b<<16&4294967295|b>>>16);b=c+(e^g^a)+d[14]+4259657740&4294967295;c=e+(b<<23&4294967295|b>>>9);b=a+(c^e^g)+d[1]+2763975236&4294967295;a=c+(b<<4&4294967295|b>>>28);b=g+(a^c^e)+d[4]+1272893353&4294967295;g=a+(b<<11&4294967295|\nb>>>21);b=e+(g^a^c)+d[7]+4139469664&4294967295;e=g+(b<<16&4294967295|b>>>16);b=c+(e^g^a)+d[10]+3200236656&4294967295;c=e+(b<<23&4294967295|b>>>9);b=a+(c^e^g)+d[13]+681279174&4294967295;a=c+(b<<4&4294967295|b>>>28);b=g+(a^c^e)+d[0]+3936430074&4294967295;g=a+(b<<11&4294967295|b>>>21);b=e+(g^a^c)+d[3]+3572445317&4294967295;e=g+(b<<16&4294967295|b>>>16);b=c+(e^g^a)+d[6]+76029189&4294967295;c=e+(b<<23&4294967295|b>>>9);b=a+(c^e^g)+d[9]+3654602809&4294967295;a=c+(b<<4&4294967295|b>>>28);b=g+(a^c^e)+d[12]+\n3873151461&4294967295;g=a+(b<<11&4294967295|b>>>21);b=e+(g^a^c)+d[15]+530742520&4294967295;e=g+(b<<16&4294967295|b>>>16);b=c+(e^g^a)+d[2]+3299628645&4294967295;c=e+(b<<23&4294967295|b>>>9);b=a+(e^(c|~g))+d[0]+4096336452&4294967295;a=c+(b<<6&4294967295|b>>>26);b=g+(c^(a|~e))+d[7]+1126891415&4294967295;g=a+(b<<10&4294967295|b>>>22);b=e+(a^(g|~c))+d[14]+2878612391&4294967295;e=g+(b<<15&4294967295|b>>>17);b=c+(g^(e|~a))+d[5]+4237533241&4294967295;c=e+(b<<21&4294967295|b>>>11);b=a+(e^(c|~g))+d[12]+1700485571&\n4294967295;a=c+(b<<6&4294967295|b>>>26);b=g+(c^(a|~e))+d[3]+2399980690&4294967295;g=a+(b<<10&4294967295|b>>>22);b=e+(a^(g|~c))+d[10]+4293915773&4294967295;e=g+(b<<15&4294967295|b>>>17);b=c+(g^(e|~a))+d[1]+2240044497&4294967295;c=e+(b<<21&4294967295|b>>>11);b=a+(e^(c|~g))+d[8]+1873313359&4294967295;a=c+(b<<6&4294967295|b>>>26);b=g+(c^(a|~e))+d[15]+4264355552&4294967295;g=a+(b<<10&4294967295|b>>>22);b=e+(a^(g|~c))+d[6]+2734768916&4294967295;e=g+(b<<15&4294967295|b>>>17);b=c+(g^(e|~a))+d[13]+1309151649&\n4294967295;c=e+(b<<21&4294967295|b>>>11);b=a+(e^(c|~g))+d[4]+4149444226&4294967295;a=c+(b<<6&4294967295|b>>>26);b=g+(c^(a|~e))+d[11]+3174756917&4294967295;g=a+(b<<10&4294967295|b>>>22);b=e+(a^(g|~c))+d[2]+718787259&4294967295;e=g+(b<<15&4294967295|b>>>17);b=c+(g^(e|~a))+d[9]+3951481745&4294967295;f.g[0]=f.g[0]+a&4294967295;f.g[1]=f.g[1]+(e+(b<<21&4294967295|b>>>11))&4294967295;f.g[2]=f.g[2]+e&4294967295;f.g[3]=f.g[3]+g&4294967295;}\nm.prototype.u=function(f,a){void 0===a&&(a=f.length);for(var c=a-this.blockSize,d=this.B,e=this.h,g=0;gthis.h?this.blockSize:2*this.blockSize)-this.h);f[0]=128;for(var a=1;aa;++a)for(var d=0;32>d;d+=8)f[c++]=this.g[a]>>>d&255;return f};function p(f,a){var c=q;return Object.prototype.hasOwnProperty.call(c,f)?c[f]:c[f]=a(f)}function t(f,a){this.h=a;for(var c=[],d=!0,e=f.length-1;0<=e;e--){var g=f[e]|0;d&&g==a||(c[e]=g,d=!1);}this.g=c;}var q={};function u(f){return -128<=f&&128>f?p(f,function(a){return new t([a|0],0>a?-1:0)}):new t([f|0],0>f?-1:0)}function v(f){if(isNaN(f)||!isFinite(f))return w;if(0>f)return x(v(-f));for(var a=[],c=1,d=0;f>=c;d++)a[d]=f/c|0,c*=4294967296;return new t(a,0)}\nfunction y(f,a){if(0==f.length)throw Error(\"number format error: empty string\");a=a||10;if(2>a||36g?(g=v(Math.pow(a,g)),d=d.j(g).add(v(b))):(d=d.j(c),d=d.add(v(b)));}return d}var w=u(0),z=u(1),A=u(16777216);h=t.prototype;\nh.m=function(){if(B(this))return -x(this).m();for(var f=0,a=1,c=0;cf||36>>0).toString(f);c=e;if(C(c))return g+d;for(;6>g.length;)g=\"0\"+g;d=g+d;}};\nh.i=function(f){return 0>f?0:f>>16)+(this.i(e)>>>16)+(f.i(e)>>>16);d=b>>>16;g&=65535;b&=65535;c[e]=b<<16|g;}return new t(c,c[c.length-1]&-2147483648?-1:0)};function F(f,a){return f.add(x(a))}\nh.j=function(f){if(C(this)||C(f))return w;if(B(this))return B(f)?x(this).j(x(f)):x(x(this).j(f));if(B(f))return x(this.j(x(f)));if(0>this.l(A)&&0>f.l(A))return v(this.m()*f.m());for(var a=this.g.length+f.g.length,c=[],d=0;d<2*a;d++)c[d]=0;for(d=0;d>>16,b=this.i(d)&65535,r=f.i(e)>>>16,E=f.i(e)&65535;c[2*d+2*e]+=b*E;G(c,2*d+2*e);c[2*d+2*e+1]+=g*E;G(c,2*d+2*e+1);c[2*d+2*e+1]+=b*r;G(c,2*d+2*e+1);c[2*d+2*e+2]+=g*r;G(c,2*d+2*e+2);}for(d=0;d<\na;d++)c[d]=c[2*d+1]<<16|c[2*d];for(d=a;d<2*a;d++)c[d]=0;return new t(c,0)};function G(f,a){for(;(f[a]&65535)!=f[a];)f[a+1]+=f[a]>>>16,f[a]&=65535,a++;}function H(f,a){this.g=f;this.h=a;}\nfunction D(f,a){if(C(a))throw Error(\"division by zero\");if(C(f))return new H(w,w);if(B(f))return a=D(x(f),a),new H(x(a.g),x(a.h));if(B(a))return a=D(f,x(a)),new H(x(a.g),a.h);if(30=d.l(f);)c=I(c),d=I(d);var e=J(c,1),g=J(d,1);d=J(d,2);for(c=J(c,2);!C(d);){var b=g.add(d);0>=b.l(f)&&(e=e.add(c),g=b);d=J(d,1);c=J(c,1);}a=F(f,e.j(a));return new H(e,a)}for(e=w;0<=f.l(a);){c=Math.max(1,Math.floor(f.m()/\na.m()));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);g=v(c);for(b=g.j(a);B(b)||0>>31;return new t(c,f.h)}function J(f,a){var c=a>>5;a%=32;for(var d=f.g.length-c,e=[],g=0;g>>a|f.i(g+c+1)<<32-a:f.i(g+c);return new t(e,f.h)}m.prototype.digest=m.prototype.v;m.prototype.reset=m.prototype.s;m.prototype.update=m.prototype.u;Md5 = bloom_blob_es2018.Md5=m;t.prototype.add=t.prototype.add;t.prototype.multiply=t.prototype.j;t.prototype.modulo=t.prototype.A;t.prototype.compare=t.prototype.l;t.prototype.toNumber=t.prototype.m;t.prototype.toString=t.prototype.toString;t.prototype.getBits=t.prototype.i;t.fromNumber=v;t.fromString=y;Integer = bloom_blob_es2018.Integer=t;}).apply( typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : {});\n\nexport { Integer, Md5, bloom_blob_es2018 as default };\n//# sourceMappingURL=bloom_blob_es2018.js.map\n","var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nvar webchannel_blob_es2018 = {};\n\n/** @license\nCopyright The Closure Library Authors.\nSPDX-License-Identifier: Apache-2.0\n*/\n\nvar XhrIo;\nvar FetchXmlHttpFactory;\nvar WebChannel;\nvar EventType;\nvar ErrorCode;\nvar Stat;\nvar Event;\nvar getStatEventTarget;\nvar createWebChannelTransport;\n(function() {var h,aa=\"function\"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=[\"object\"==typeof globalThis&&globalThis,a,\"object\"==typeof window&&window,\"object\"==typeof self&&self,\"object\"==typeof commonjsGlobal&&commonjsGlobal];for(var b=0;b{throw a;},0);}function xa(){var a=za;let b=null;a.g&&(b=a.g,a.g=a.g.next,a.g||(a.h=null),b.next=null);return b}class Aa{constructor(){this.h=this.g=null;}add(a,b){const c=Ba.get();c.set(a,b);this.h?this.h.next=c:this.g=c;this.h=c;}}var Ba=new na(()=>new Ca,a=>a.reset());class Ca{constructor(){this.next=this.g=this.h=null;}set(a,b){this.h=a;this.g=b;this.next=null;}reset(){this.next=this.g=this.h=null;}}let x,y=!1,za=new Aa,Ea=()=>{const a=k.Promise.resolve(void 0);x=()=>{a.then(Da);};};var Da=()=>{for(var a;a=xa();){try{a.h.call(a.g);}catch(c){wa(c);}var b=Ba;b.j(a);100>b.h&&(b.h++,a.next=b.g,b.g=a);}y=!1;};function z(){this.s=this.s;this.C=this.C;}z.prototype.s=!1;z.prototype.ma=function(){this.s||(this.s=!0,this.N());};z.prototype.N=function(){if(this.C)for(;this.C.length;)this.C.shift()();};function A(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1;}A.prototype.h=function(){this.defaultPrevented=!0;};var Fa=function(){if(!k.addEventListener||!Object.defineProperty)return !1;var a=!1,b=Object.defineProperty({},\"passive\",{get:function(){a=!0;}});try{const c=()=>{};k.addEventListener(\"test\",c,b);k.removeEventListener(\"test\",c,b);}catch(c){}return a}();function C(a,b){A.call(this,a?a.type:\"\");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key=\"\";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType=\"\";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(pa){a:{try{oa(b.nodeName);var e=!0;break a}catch(f){}e=\n!1;}e||(b=null);}}else \"mouseover\"==c?b=a.fromElement:\"mouseout\"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||\"\";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=\na.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType=\"string\"===typeof a.pointerType?a.pointerType:Ga[a.pointerType]||\"\";this.state=a.state;this.i=a;a.defaultPrevented&&C.aa.h.call(this);}}r(C,A);var Ga={2:\"touch\",3:\"pen\",4:\"mouse\"};C.prototype.h=function(){C.aa.h.call(this);var a=this.i;a.preventDefault?a.preventDefault():a.returnValue=!1;};var D=\"closure_listenable_\"+(1E6*Math.random()|0);var Ha=0;function Ia(a,b,c,d,e){this.listener=a;this.proxy=null;this.src=b;this.type=c;this.capture=!!d;this.ha=e;this.key=++Ha;this.da=this.fa=!1;}function Ja(a){a.da=!0;a.listener=null;a.proxy=null;a.src=null;a.ha=null;}function Ka(a){this.src=a;this.g={};this.h=0;}Ka.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g=La(a,b,d,e);-1>>0);function Sa(a){if(\"function\"===typeof a)return a;a[$a]||(a[$a]=function(b){return a.handleEvent(b)});return a[$a]}function E(){z.call(this);this.i=new Ka(this);this.M=this;this.F=null;}r(E,z);E.prototype[D]=!0;E.prototype.removeEventListener=function(a,b,c,d){Ya(this,a,b,c,d);};\nfunction F(a,b){var c,d=a.F;if(d)for(c=[];d;d=d.F)c.push(d);a=a.M;d=b.type||b;if(\"string\"===typeof b)b=new A(b,a);else if(b instanceof A)b.target=b.target||a;else {var e=b;b=new A(d,a);ua(b,e);}e=!0;if(c)for(var f=c.length-1;0<=f;f--){var g=b.g=c[f];e=ab(g,d,!0,b)&&e;}g=b.g=a;e=ab(g,d,!0,b)&&e;e=ab(g,d,!1,b)&&e;if(c)for(f=0;f{a.g=null;a.i&&(a.i=!1,cb(a));},a.l);const b=a.h;a.h=null;a.m.apply(null,b);}class eb extends z{constructor(a,b){super();this.m=a;this.l=b;this.h=null;this.i=!1;this.g=null;}j(a){this.h=arguments;this.g?this.i=!0:cb(this);}N(){super.N();this.g&&(k.clearTimeout(this.g),this.g=null,this.i=!1,this.h=null);}}function G(a){z.call(this);this.h=a;this.g={};}r(G,z);var fb=[];function gb(a){qa(a.g,function(b,c){this.g.hasOwnProperty(c)&&Za(b);},a);a.g={};}G.prototype.N=function(){G.aa.N.call(this);gb(this);};G.prototype.handleEvent=function(){throw Error(\"EventHandler.handleEvent not implemented\");};var hb=k.JSON.stringify;var ib=k.JSON.parse;var jb=class{stringify(a){return k.JSON.stringify(a,void 0)}parse(a){return k.JSON.parse(a,void 0)}};function kb(){}kb.prototype.h=null;function lb(a){return a.h||(a.h=a.i())}function mb(){}var H={OPEN:\"a\",kb:\"b\",Ja:\"c\",wb:\"d\"};function nb(){A.call(this,\"d\");}r(nb,A);function ob(){A.call(this,\"c\");}r(ob,A);var I={},pb=null;function qb(){return pb=pb||new E}I.La=\"serverreachability\";function rb(a){A.call(this,I.La,a);}r(rb,A);function J(a){const b=qb();F(b,new rb(b));}I.STAT_EVENT=\"statevent\";function sb(a,b){A.call(this,I.STAT_EVENT,a);this.stat=b;}r(sb,A);function K(a){const b=qb();F(b,new sb(b,a));}I.Ma=\"timingevent\";function tb(a,b){A.call(this,I.Ma,a);this.size=b;}r(tb,A);\nfunction ub(a,b){if(\"function\"!==typeof a)throw Error(\"Fn must not be null and must be a function\");return k.setTimeout(function(){a();},b)}function vb(){this.g=!0;}vb.prototype.xa=function(){this.g=!1;};function wb(a,b,c,d,e,f){a.info(function(){if(a.g)if(f){var g=\"\";for(var m=f.split(\"&\"),q=0;qd.length)){var e=d[1];if(Array.isArray(e)&&!(1>e.length)){var f=e[0];if(\"noop\"!=f&&\"stop\"!=f&&\"close\"!=f)for(var g=1;gw)&&(3!=w||this.g&&(this.h.h||this.g.oa()||Nb(this.g)))){this.J||4!=w||7==b||(8==b||0>=O?J(3):J(2));Ob(this);var c=this.g.Z();this.X=c;b:if(Pb(this)){var d=Nb(this.g);a=\"\";var e=d.length,f=4==P(this.g);if(!this.h.i){if(\"undefined\"===typeof TextDecoder){Q(this);Qb(this);var g=\"\";break b}this.h.i=new k.TextDecoder;}for(b=0;bb.length)return Gb;b=b.slice(d,d+c);a.C=d+c;return b}M.prototype.cancel=function(){this.J=!0;Q(this);};function Kb(a){a.S=Date.now()+a.I;Wb(a,a.I);}function Wb(a,b){if(null!=a.B)throw Error(\"WatchDog timer not null\");a.B=ub(p(a.ba,a),b);}function Ob(a){a.B&&(k.clearTimeout(a.B),a.B=null);}\nM.prototype.ba=function(){this.B=null;const a=Date.now();0<=a-this.S?(zb(this.i,this.A),2!=this.L&&(J(),K(17)),Q(this),this.s=2,Qb(this)):Wb(this,this.S-a);};function Qb(a){0==a.j.G||a.J||Ub(a.j,a);}function Q(a){Ob(a);var b=a.M;b&&\"function\"==typeof b.ma&&b.ma();a.M=null;gb(a.U);a.g&&(b=a.g,a.g=null,b.abort(),b.ma());}\nfunction Rb(a,b){try{var c=a.j;if(0!=c.G&&(c.g==a||Xb(c.h,a)))if(!a.K&&Xb(c.h,a)&&3==c.G){try{var d=c.Da.g.parse(b);}catch(l){d=null;}if(Array.isArray(d)&&3==d.length){var e=d;if(0==e[0])a:{if(!c.u){if(c.g)if(c.g.F+3E3e[2]&&c.F&&0==c.v&&!c.C&&(c.C=ub(p(c.Za,c),6E3));if(1>=ac(c.h)&&c.ca){try{c.ca();}catch(l){}c.ca=void 0;}}else R(c,11);}else if((a.K||c.g==a)&&Yb(c),!t(b))for(e=c.Da.g.parse(b),b=0;b=a.j:!1}function ac(a){return a.h?1:a.g?a.g.size:0}function Xb(a,b){return a.h?a.h==b:a.g?a.g.has(b):!1}\nfunction bc(a,b){a.g?a.g.add(b):a.h=b;}function dc(a,b){a.h&&a.h==b?a.h=null:a.g&&a.g.has(b)&&a.g.delete(b);}ic.prototype.cancel=function(){this.i=kc(this);if(this.h)this.h.cancel(),this.h=null;else if(this.g&&0!==this.g.size){for(const a of this.g.values())a.cancel();this.g.clear();}};function kc(a){if(null!=a.h)return a.i.concat(a.h.D);if(null!=a.g&&0!==a.g.size){let b=a.i;for(const c of a.g.values())b=b.concat(c.D);return b}return la(a.i)}function lc(a){if(a.V&&\"function\"==typeof a.V)return a.V();if(\"undefined\"!==typeof Map&&a instanceof Map||\"undefined\"!==typeof Set&&a instanceof Set)return Array.from(a.values());if(\"string\"===typeof a)return a.split(\"\");if(ha(a)){for(var b=[],c=a.length,d=0;db)throw Error(\"Bad port number \"+b);a.s=b;}else a.s=null;}function tc(a,b,c){b instanceof sc?(a.i=b,Ac(a.i,a.h)):(c||(b=vc(b,Bc)),a.i=new sc(b,a.h));}function S(a,b,c){a.i.set(b,c);}function Ib(a){S(a,\"zx\",Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^Date.now()).toString(36));return a}\nfunction uc(a,b){return a?b?decodeURI(a.replace(/%25/g,\"%2525\")):decodeURIComponent(a):\"\"}function vc(a,b,c){return \"string\"===typeof a?(a=encodeURI(a).replace(b,Cc),c&&(a=a.replace(/%25([0-9a-fA-F]{2})/g,\"%$1\")),a):null}function Cc(a){a=a.charCodeAt(0);return \"%\"+(a>>4&15).toString(16)+(a&15).toString(16)}var wc=/[#\\/\\?@]/g,yc=/[#\\?:]/g,xc=/[#\\?]/g,Bc=/[#\\?@]/g,zc=/#/g;function sc(a,b){this.h=this.g=null;this.i=a||null;this.j=!!b;}\nfunction U(a){a.g||(a.g=new Map,a.h=0,a.i&&pc(a.i,function(b,c){a.add(decodeURIComponent(b.replace(/\\+/g,\" \")),c);}));}h=sc.prototype;h.add=function(a,b){U(this);this.i=null;a=V(this,a);var c=this.g.get(a);c||this.g.set(a,c=[]);c.push(b);this.h+=1;return this};function Dc(a,b){U(a);b=V(a,b);a.g.has(b)&&(a.i=null,a.h-=a.g.get(b).length,a.g.delete(b));}function Ec(a,b){U(a);b=V(a,b);return a.g.has(b)}\nh.forEach=function(a,b){U(this);this.g.forEach(function(c,d){c.forEach(function(e){a.call(b,e,d,this);},this);},this);};h.na=function(){U(this);const a=Array.from(this.g.values()),b=Array.from(this.g.keys()),c=[];for(let d=0;d{d.abort();W(c,\"TestPingServer: timeout\",!1,b);},1E4);fetch(a,{signal:d.signal}).then(f=>{clearTimeout(e);f.ok?W(c,\"TestPingServer: ok\",!0,b):W(c,\"TestPingServer: server error\",!1,b);}).catch(()=>{clearTimeout(e);W(c,\"TestPingServer: error\",!1,b);});}function W(a,b,c,d,e){try{e&&(e.onload=null,e.onerror=null,e.onabort=null,e.ontimeout=null),d(c);}catch(f){}}function Hc(){this.g=new jb;}function Ic(a,b,c){const d=c||\"\";try{nc(a,function(e,f){let g=e;n(e)&&(g=hb(e));b.push(d+f+\"=\"+encodeURIComponent(g));});}catch(e){throw b.push(d+\"type=\"+encodeURIComponent(\"_badmap\")),e;}}function Jc(a){this.l=a.Ub||null;this.j=a.eb||!1;}r(Jc,kb);Jc.prototype.g=function(){return new Kc(this.l,this.j)};Jc.prototype.i=function(a){return function(){return a}}({});function Kc(a,b){E.call(this);this.D=a;this.o=b;this.m=void 0;this.status=this.readyState=0;this.responseType=this.responseText=this.response=this.statusText=\"\";this.onreadystatechange=null;this.u=new Headers;this.h=null;this.B=\"GET\";this.A=\"\";this.g=!1;this.v=this.j=this.l=null;}r(Kc,E);h=Kc.prototype;\nh.open=function(a,b){if(0!=this.readyState)throw this.abort(),Error(\"Error reopening a connection\");this.B=a;this.A=b;this.readyState=1;Lc(this);};h.send=function(a){if(1!=this.readyState)throw this.abort(),Error(\"need to call open() first. \");this.g=!0;const b={headers:this.u,method:this.B,credentials:this.m,cache:void 0};a&&(b.body=a);(this.D||k).fetch(new Request(this.A,b)).then(this.Sa.bind(this),this.ga.bind(this));};\nh.abort=function(){this.response=this.responseText=\"\";this.u=new Headers;this.status=0;this.j&&this.j.cancel(\"Request was aborted.\").catch(()=>{});1<=this.readyState&&this.g&&4!=this.readyState&&(this.g=!1,Mc(this));this.readyState=0;};\nh.Sa=function(a){if(this.g&&(this.l=a,this.h||(this.status=this.l.status,this.statusText=this.l.statusText,this.h=a.headers,this.readyState=2,Lc(this)),this.g&&(this.readyState=3,Lc(this),this.g)))if(\"arraybuffer\"===this.responseType)a.arrayBuffer().then(this.Qa.bind(this),this.ga.bind(this));else if(\"undefined\"!==typeof k.ReadableStream&&\"body\"in a){this.j=a.body.getReader();if(this.o){if(this.responseType)throw Error('responseType must be empty for \"streamBinaryChunks\" mode responses.');this.response=\n[];}else this.response=this.responseText=\"\",this.v=new TextDecoder;Nc(this);}else a.text().then(this.Ra.bind(this),this.ga.bind(this));};function Nc(a){a.j.read().then(a.Pa.bind(a)).catch(a.ga.bind(a));}h.Pa=function(a){if(this.g){if(this.o&&a.value)this.response.push(a.value);else if(!this.o){var b=a.value?a.value:new Uint8Array(0);if(b=this.v.decode(b,{stream:!a.done}))this.response=this.responseText+=b;}a.done?Mc(this):Lc(this);3==this.readyState&&Nc(this);}};\nh.Ra=function(a){this.g&&(this.response=this.responseText=a,Mc(this));};h.Qa=function(a){this.g&&(this.response=a,Mc(this));};h.ga=function(){this.g&&Mc(this);};function Mc(a){a.readyState=4;a.l=null;a.j=null;a.v=null;Lc(a);}h.setRequestHeader=function(a,b){this.u.append(a,b);};h.getResponseHeader=function(a){return this.h?this.h.get(a.toLowerCase())||\"\":\"\"};\nh.getAllResponseHeaders=function(){if(!this.h)return \"\";const a=[],b=this.h.entries();for(var c=b.next();!c.done;)c=c.value,a.push(c[0]+\": \"+c[1]),c=b.next();return a.join(\"\\r\\n\")};function Lc(a){a.onreadystatechange&&a.onreadystatechange.call(a);}Object.defineProperty(Kc.prototype,\"withCredentials\",{get:function(){return \"include\"===this.m},set:function(a){this.m=a?\"include\":\"same-origin\";}});function Oc(a){let b=\"\";qa(a,function(c,d){b+=d;b+=\":\";b+=c;b+=\"\\r\\n\";});return b}function Pc(a,b,c){a:{for(d in c){var d=!1;break a}d=!0;}d||(c=Oc(c),\"string\"===typeof a?(null!=c&&encodeURIComponent(String(c))):S(a,b,c));}function X(a){E.call(this);this.headers=new Map;this.o=a||null;this.h=!1;this.v=this.g=null;this.D=\"\";this.m=0;this.l=\"\";this.j=this.B=this.u=this.A=!1;this.I=null;this.H=\"\";this.J=!1;}r(X,E);var Qc=/^https?$/i,Rc=[\"POST\",\"PUT\"];h=X.prototype;h.Ha=function(a){this.J=a;};\nh.ea=function(a,b,c,d){if(this.g)throw Error(\"[goog.net.XhrIo] Object is active with another request=\"+this.D+\"; newUri=\"+a);b=b?b.toUpperCase():\"GET\";this.D=a;this.l=\"\";this.m=0;this.A=!1;this.h=!0;this.g=this.o?this.o.g():Cb.g();this.v=this.o?lb(this.o):lb(Cb);this.g.onreadystatechange=p(this.Ea,this);try{this.B=!0,this.g.open(b,String(a),!0),this.B=!1;}catch(f){Sc(this,f);return}a=c||\"\";c=new Map(this.headers);if(d)if(Object.getPrototypeOf(d)===Object.prototype)for(var e in d)c.set(e,d[e]);else if(\"function\"===\ntypeof d.keys&&\"function\"===typeof d.get)for(const f of d.keys())c.set(f,d.get(f));else throw Error(\"Unknown input type for opt_headers: \"+String(d));d=Array.from(c.keys()).find(f=>\"content-type\"==f.toLowerCase());e=k.FormData&&a instanceof k.FormData;!(0<=Array.prototype.indexOf.call(Rc,b,void 0))||d||e||c.set(\"Content-Type\",\"application/x-www-form-urlencoded;charset=utf-8\");for(const [f,g]of c)this.g.setRequestHeader(f,g);this.H&&(this.g.responseType=this.H);\"withCredentials\"in this.g&&this.g.withCredentials!==\nthis.J&&(this.g.withCredentials=this.J);try{Tc(this),this.u=!0,this.g.send(a),this.u=!1;}catch(f){Sc(this,f);}};function Sc(a,b){a.h=!1;a.g&&(a.j=!0,a.g.abort(),a.j=!1);a.l=b;a.m=5;Uc(a);Vc(a);}function Uc(a){a.A||(a.A=!0,F(a,\"complete\"),F(a,\"error\"));}h.abort=function(a){this.g&&this.h&&(this.h=!1,this.j=!0,this.g.abort(),this.j=!1,this.m=a||7,F(this,\"complete\"),F(this,\"abort\"),Vc(this));};h.N=function(){this.g&&(this.h&&(this.h=!1,this.j=!0,this.g.abort(),this.j=!1),Vc(this,!0));X.aa.N.call(this);};\nh.Ea=function(){this.s||(this.B||this.u||this.j?Wc(this):this.bb());};h.bb=function(){Wc(this);};\nfunction Wc(a){if(a.h&&\"undefined\"!=typeof fa&&(!a.v[1]||4!=P(a)||2!=a.Z()))if(a.u&&4==P(a))bb(a.Ea,0,a);else if(F(a,\"readystatechange\"),4==P(a)){a.h=!1;try{const g=a.Z();a:switch(g){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var b=!0;break a;default:b=!1;}var c;if(!(c=b)){var d;if(d=0===g){var e=String(a.D).match(oc)[1]||null;!e&&k.self&&k.self.location&&(e=k.self.location.protocol.slice(0,-1));d=!Qc.test(e?e.toLowerCase():\"\");}c=d;}if(c)F(a,\"complete\"),F(a,\"success\");else {a.m=\n6;try{var f=2{}:null;a.g=null;a.v=null;b||F(a,\"ready\");try{c.onreadystatechange=d;}catch(e){}}}function Tc(a){a.I&&(k.clearTimeout(a.I),a.I=null);}h.isActive=function(){return !!this.g};function P(a){return a.g?a.g.readyState:0}h.Z=function(){try{return 2=a.h.j-(a.s?1:0))return !1;if(a.s)return a.i=b.D.concat(a.i),!0;if(1==a.G||2==a.G||a.B>=(a.Va?0:a.Wa))return !1;a.s=ub(p(a.Ga,a,b),cd(a,a.B));a.B++;return !0}\nh.Ga=function(a){if(this.s)if(this.s=null,1==this.G){if(!a){this.U=Math.floor(1E5*Math.random());a=this.U++;const e=new M(this,this.j,a);let f=this.o;this.S&&(f?(f=sa(f),ua(f,this.S)):f=this.S);null!==this.m||this.O||(e.H=f,f=null);if(this.P)a:{var b=0;for(var c=0;cl)f=Math.max(0,e[q].g-100),m=!1;else try{Ic(v,g,\"req\"+l+\"_\");}catch(w){d&&d(v);}}if(m){d=g.join(\"&\");break a}}}a=a.i.splice(0,c);b.D=a;return d}function ec(a){if(!a.g&&!a.u){a.Y=1;var b=a.Fa;x||Ea();y||(x(),y=!0);za.add(b,a);a.v=0;}}\nfunction $b(a){if(a.g||a.u||3<=a.v)return !1;a.Y++;a.u=ub(p(a.Fa,a),cd(a,a.v));a.v++;return !0}h.Fa=function(){this.u=null;fd(this);if(this.ba&&!(this.M||null==this.g||0>=this.R)){var a=2*this.R;this.j.info(\"BP detection timer enabled: \"+a);this.A=ub(p(this.ab,this),a);}};h.ab=function(){this.A&&(this.A=null,this.j.info(\"BP detection timeout reached.\"),this.j.info(\"Buffering proxy detected and switch to long-polling!\"),this.F=!1,this.M=!0,K(10),Zb(this),fd(this));};\nfunction Tb(a){null!=a.A&&(k.clearTimeout(a.A),a.A=null);}function fd(a){a.g=new M(a,a.j,\"rpc\",a.Y);null===a.m&&(a.g.H=a.o);a.g.O=0;var b=N(a.qa);S(b,\"RID\",\"rpc\");S(b,\"SID\",a.K);S(b,\"AID\",a.T);S(b,\"CI\",a.F?\"0\":\"1\");!a.F&&a.ja&&S(b,\"TO\",a.ja);S(b,\"TYPE\",\"xmlhttp\");$c(a,b);a.m&&a.o&&Pc(b,a.m,a.o);a.L&&(a.g.I=a.L);var c=a.g;a=a.ia;c.L=1;c.v=Ib(N(b));c.m=null;c.P=!0;Jb(c,a);}h.Za=function(){null!=this.C&&(this.C=null,Zb(this),$b(this),K(19));};function Yb(a){null!=a.C&&(k.clearTimeout(a.C),a.C=null);}\nfunction Ub(a,b){var c=null;if(a.g==b){Yb(a);Tb(a);a.g=null;var d=2;}else if(Xb(a.h,b))c=b.D,dc(a.h,b),d=1;else return;if(0!=a.G)if(b.o)if(1==d){c=b.m?b.m.length:0;b=Date.now()-b.F;var e=a.B;d=qb();F(d,new tb(d,c));fc(a);}else ec(a);else if(e=b.s,3==e||0==e&&0\n *

  • `debug` for the most verbose logging level, primarily for\n * debugging.
  • \n *
  • `error` to log errors only.
  • \n *
  • `silent` to turn off logging.
  • \n * \n */ function setLogLevel(e) {\n b.setLogLevel(e);\n}\n\nfunction __PRIVATE_logDebug(e, ...t) {\n if (b.logLevel <= LogLevel.DEBUG) {\n const n = t.map(__PRIVATE_argToString);\n b.debug(`Firestore (${S}): ${e}`, ...n);\n }\n}\n\nfunction __PRIVATE_logError(e, ...t) {\n if (b.logLevel <= LogLevel.ERROR) {\n const n = t.map(__PRIVATE_argToString);\n b.error(`Firestore (${S}): ${e}`, ...n);\n }\n}\n\n/**\n * @internal\n */ function __PRIVATE_logWarn(e, ...t) {\n if (b.logLevel <= LogLevel.WARN) {\n const n = t.map(__PRIVATE_argToString);\n b.warn(`Firestore (${S}): ${e}`, ...n);\n }\n}\n\n/**\n * Converts an additional log parameter to a string representation.\n */ function __PRIVATE_argToString(e) {\n if (\"string\" == typeof e) return e;\n try {\n /**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /** Formats an object as a JSON string, suitable for logging. */\n return function __PRIVATE_formatJSON(e) {\n return JSON.stringify(e);\n }(e);\n } catch (t) {\n // Converting to JSON failed, just log the object directly\n return e;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Unconditionally fails, throwing an Error with the given message.\n * Messages are stripped in production builds.\n *\n * Returns `never` and can be used in expressions:\n * @example\n * let futureVar = fail('not implemented yet');\n */ function fail(e = \"Unexpected state\") {\n // Log the failure in addition to throw an exception, just in case the\n // exception is swallowed.\n const t = `FIRESTORE (${S}) INTERNAL ASSERTION FAILED: ` + e;\n // NOTE: We don't use FirestoreError here because these are internal failures\n // that cannot be handled by the user. (Also it would create a circular\n // dependency between the error and assert modules which doesn't work.)\n throw __PRIVATE_logError(t), new Error(t);\n}\n\n/**\n * Fails if the given assertion condition is false, throwing an Error with the\n * given message if it did.\n *\n * Messages are stripped in production builds.\n */ function __PRIVATE_hardAssert(e, t) {\n e || fail();\n}\n\n/**\n * Fails if the given assertion condition is false, throwing an Error with the\n * given message if it did.\n *\n * The code of callsites invoking this function are stripped out in production\n * builds. Any side-effects of code within the debugAssert() invocation will not\n * happen in this case.\n *\n * @internal\n */ function __PRIVATE_debugAssert(e, t) {\n e || fail();\n}\n\n/**\n * Casts `obj` to `T`. In non-production builds, verifies that `obj` is an\n * instance of `T` before casting.\n */ function __PRIVATE_debugCast(e, \n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nt) {\n return e;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const D = {\n // Causes are copied from:\n // https://github.com/grpc/grpc/blob/bceec94ea4fc5f0085d81235d8e1c06798dc341a/include/grpc%2B%2B/impl/codegen/status_code_enum.h\n /** Not an error; returned on success. */\n OK: \"ok\",\n /** The operation was cancelled (typically by the caller). */\n CANCELLED: \"cancelled\",\n /** Unknown error or an error from a different error domain. */\n UNKNOWN: \"unknown\",\n /**\n * Client specified an invalid argument. Note that this differs from\n * FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments that are\n * problematic regardless of the state of the system (e.g., a malformed file\n * name).\n */\n INVALID_ARGUMENT: \"invalid-argument\",\n /**\n * Deadline expired before operation could complete. For operations that\n * change the state of the system, this error may be returned even if the\n * operation has completed successfully. For example, a successful response\n * from a server could have been delayed long enough for the deadline to\n * expire.\n */\n DEADLINE_EXCEEDED: \"deadline-exceeded\",\n /** Some requested entity (e.g., file or directory) was not found. */\n NOT_FOUND: \"not-found\",\n /**\n * Some entity that we attempted to create (e.g., file or directory) already\n * exists.\n */\n ALREADY_EXISTS: \"already-exists\",\n /**\n * The caller does not have permission to execute the specified operation.\n * PERMISSION_DENIED must not be used for rejections caused by exhausting\n * some resource (use RESOURCE_EXHAUSTED instead for those errors).\n * PERMISSION_DENIED must not be used if the caller cannot be identified\n * (use UNAUTHENTICATED instead for those errors).\n */\n PERMISSION_DENIED: \"permission-denied\",\n /**\n * The request does not have valid authentication credentials for the\n * operation.\n */\n UNAUTHENTICATED: \"unauthenticated\",\n /**\n * Some resource has been exhausted, perhaps a per-user quota, or perhaps the\n * entire file system is out of space.\n */\n RESOURCE_EXHAUSTED: \"resource-exhausted\",\n /**\n * Operation was rejected because the system is not in a state required for\n * the operation's execution. For example, directory to be deleted may be\n * non-empty, an rmdir operation is applied to a non-directory, etc.\n *\n * A litmus test that may help a service implementor in deciding\n * between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE:\n * (a) Use UNAVAILABLE if the client can retry just the failing call.\n * (b) Use ABORTED if the client should retry at a higher-level\n * (e.g., restarting a read-modify-write sequence).\n * (c) Use FAILED_PRECONDITION if the client should not retry until\n * the system state has been explicitly fixed. E.g., if an \"rmdir\"\n * fails because the directory is non-empty, FAILED_PRECONDITION\n * should be returned since the client should not retry unless\n * they have first fixed up the directory by deleting files from it.\n * (d) Use FAILED_PRECONDITION if the client performs conditional\n * REST Get/Update/Delete on a resource and the resource on the\n * server does not match the condition. E.g., conflicting\n * read-modify-write on the same resource.\n */\n FAILED_PRECONDITION: \"failed-precondition\",\n /**\n * The operation was aborted, typically due to a concurrency issue like\n * sequencer check failures, transaction aborts, etc.\n *\n * See litmus test above for deciding between FAILED_PRECONDITION, ABORTED,\n * and UNAVAILABLE.\n */\n ABORTED: \"aborted\",\n /**\n * Operation was attempted past the valid range. E.g., seeking or reading\n * past end of file.\n *\n * Unlike INVALID_ARGUMENT, this error indicates a problem that may be fixed\n * if the system state changes. For example, a 32-bit file system will\n * generate INVALID_ARGUMENT if asked to read at an offset that is not in the\n * range [0,2^32-1], but it will generate OUT_OF_RANGE if asked to read from\n * an offset past the current file size.\n *\n * There is a fair bit of overlap between FAILED_PRECONDITION and\n * OUT_OF_RANGE. We recommend using OUT_OF_RANGE (the more specific error)\n * when it applies so that callers who are iterating through a space can\n * easily look for an OUT_OF_RANGE error to detect when they are done.\n */\n OUT_OF_RANGE: \"out-of-range\",\n /** Operation is not implemented or not supported/enabled in this service. */\n UNIMPLEMENTED: \"unimplemented\",\n /**\n * Internal errors. Means some invariants expected by underlying System has\n * been broken. If you see one of these errors, Something is very broken.\n */\n INTERNAL: \"internal\",\n /**\n * The service is currently unavailable. This is a most likely a transient\n * condition and may be corrected by retrying with a backoff.\n *\n * See litmus test above for deciding between FAILED_PRECONDITION, ABORTED,\n * and UNAVAILABLE.\n */\n UNAVAILABLE: \"unavailable\",\n /** Unrecoverable data loss or corruption. */\n DATA_LOSS: \"data-loss\"\n};\n\n/** An error returned by a Firestore operation. */ class FirestoreError extends FirebaseError {\n /** @hideconstructor */\n constructor(\n /**\n * The backend error code associated with this error.\n */\n e, \n /**\n * A custom error description.\n */\n t) {\n super(e, t), this.code = e, this.message = t, \n // HACK: We write a toString property directly because Error is not a real\n // class and so inheritance does not work correctly. We could alternatively\n // do the same \"back-door inheritance\" trick that FirebaseError does.\n this.toString = () => `${this.name}: [code=${this.code}]: ${this.message}`;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_Deferred {\n constructor() {\n this.promise = new Promise(((e, t) => {\n this.resolve = e, this.reject = t;\n }));\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_OAuthToken {\n constructor(e, t) {\n this.user = t, this.type = \"OAuth\", this.headers = new Map, this.headers.set(\"Authorization\", `Bearer ${e}`);\n }\n}\n\n/**\n * A CredentialsProvider that always yields an empty token.\n * @internal\n */ class __PRIVATE_EmptyAuthCredentialsProvider {\n getToken() {\n return Promise.resolve(null);\n }\n invalidateToken() {}\n start(e, t) {\n // Fire with initial user.\n e.enqueueRetryable((() => t(User.UNAUTHENTICATED)));\n }\n shutdown() {}\n}\n\n/**\n * A CredentialsProvider that always returns a constant token. Used for\n * emulator token mocking.\n */ class __PRIVATE_EmulatorAuthCredentialsProvider {\n constructor(e) {\n this.token = e, \n /**\n * Stores the listener registered with setChangeListener()\n * This isn't actually necessary since the UID never changes, but we use this\n * to verify the listen contract is adhered to in tests.\n */\n this.changeListener = null;\n }\n getToken() {\n return Promise.resolve(this.token);\n }\n invalidateToken() {}\n start(e, t) {\n this.changeListener = t, \n // Fire with initial user.\n e.enqueueRetryable((() => t(this.token.user)));\n }\n shutdown() {\n this.changeListener = null;\n }\n}\n\nclass __PRIVATE_FirebaseAuthCredentialsProvider {\n constructor(e) {\n this.t = e, \n /** Tracks the current User. */\n this.currentUser = User.UNAUTHENTICATED, \n /**\n * Counter used to detect if the token changed while a getToken request was\n * outstanding.\n */\n this.i = 0, this.forceRefresh = !1, this.auth = null;\n }\n start(e, t) {\n __PRIVATE_hardAssert(void 0 === this.o);\n let n = this.i;\n // A change listener that prevents double-firing for the same token change.\n const __PRIVATE_guardedChangeListener = e => this.i !== n ? (n = this.i, \n t(e)) : Promise.resolve();\n // A promise that can be waited on to block on the next token change.\n // This promise is re-created after each change.\n let r = new __PRIVATE_Deferred;\n this.o = () => {\n this.i++, this.currentUser = this.u(), r.resolve(), r = new __PRIVATE_Deferred, \n e.enqueueRetryable((() => __PRIVATE_guardedChangeListener(this.currentUser)));\n };\n const __PRIVATE_awaitNextToken = () => {\n const t = r;\n e.enqueueRetryable((async () => {\n await t.promise, await __PRIVATE_guardedChangeListener(this.currentUser);\n }));\n }, __PRIVATE_registerAuth = e => {\n __PRIVATE_logDebug(\"FirebaseAuthCredentialsProvider\", \"Auth detected\"), this.auth = e, \n this.o && (this.auth.addAuthTokenListener(this.o), __PRIVATE_awaitNextToken());\n };\n this.t.onInit((e => __PRIVATE_registerAuth(e))), \n // Our users can initialize Auth right after Firestore, so we give it\n // a chance to register itself with the component framework before we\n // determine whether to start up in unauthenticated mode.\n setTimeout((() => {\n if (!this.auth) {\n const e = this.t.getImmediate({\n optional: !0\n });\n e ? __PRIVATE_registerAuth(e) : (\n // If auth is still not available, proceed with `null` user\n __PRIVATE_logDebug(\"FirebaseAuthCredentialsProvider\", \"Auth not yet detected\"), \n r.resolve(), r = new __PRIVATE_Deferred);\n }\n }), 0), __PRIVATE_awaitNextToken();\n }\n getToken() {\n // Take note of the current value of the tokenCounter so that this method\n // can fail (with an ABORTED error) if there is a token change while the\n // request is outstanding.\n const e = this.i, t = this.forceRefresh;\n return this.forceRefresh = !1, this.auth ? this.auth.getToken(t).then((t => \n // Cancel the request since the token changed while the request was\n // outstanding so the response is potentially for a previous user (which\n // user, we can't be sure).\n this.i !== e ? (__PRIVATE_logDebug(\"FirebaseAuthCredentialsProvider\", \"getToken aborted due to token change.\"), \n this.getToken()) : t ? (__PRIVATE_hardAssert(\"string\" == typeof t.accessToken), \n new __PRIVATE_OAuthToken(t.accessToken, this.currentUser)) : null)) : Promise.resolve(null);\n }\n invalidateToken() {\n this.forceRefresh = !0;\n }\n shutdown() {\n this.auth && this.o && this.auth.removeAuthTokenListener(this.o), this.o = void 0;\n }\n // Auth.getUid() can return null even with a user logged in. It is because\n // getUid() is synchronous, but the auth code populating Uid is asynchronous.\n // This method should only be called in the AuthTokenListener callback\n // to guarantee to get the actual user.\n u() {\n const e = this.auth && this.auth.getUid();\n return __PRIVATE_hardAssert(null === e || \"string\" == typeof e), new User(e);\n }\n}\n\n/*\n * FirstPartyToken provides a fresh token each time its value\n * is requested, because if the token is too old, requests will be rejected.\n * Technically this may no longer be necessary since the SDK should gracefully\n * recover from unauthenticated errors (see b/33147818 for context), but it's\n * safer to keep the implementation as-is.\n */ class __PRIVATE_FirstPartyToken {\n constructor(e, t, n) {\n this.l = e, this.h = t, this.P = n, this.type = \"FirstParty\", this.user = User.FIRST_PARTY, \n this.I = new Map;\n }\n /**\n * Gets an authorization token, using a provided factory function, or return\n * null.\n */ T() {\n return this.P ? this.P() : null;\n }\n get headers() {\n this.I.set(\"X-Goog-AuthUser\", this.l);\n // Use array notation to prevent minification\n const e = this.T();\n return e && this.I.set(\"Authorization\", e), this.h && this.I.set(\"X-Goog-Iam-Authorization-Token\", this.h), \n this.I;\n }\n}\n\n/*\n * Provides user credentials required for the Firestore JavaScript SDK\n * to authenticate the user, using technique that is only available\n * to applications hosted by Google.\n */ class __PRIVATE_FirstPartyAuthCredentialsProvider {\n constructor(e, t, n) {\n this.l = e, this.h = t, this.P = n;\n }\n getToken() {\n return Promise.resolve(new __PRIVATE_FirstPartyToken(this.l, this.h, this.P));\n }\n start(e, t) {\n // Fire with initial uid.\n e.enqueueRetryable((() => t(User.FIRST_PARTY)));\n }\n shutdown() {}\n invalidateToken() {}\n}\n\nclass AppCheckToken {\n constructor(e) {\n this.value = e, this.type = \"AppCheck\", this.headers = new Map, e && e.length > 0 && this.headers.set(\"x-firebase-appcheck\", this.value);\n }\n}\n\nclass __PRIVATE_FirebaseAppCheckTokenProvider {\n constructor(e) {\n this.A = e, this.forceRefresh = !1, this.appCheck = null, this.R = null;\n }\n start(e, t) {\n __PRIVATE_hardAssert(void 0 === this.o);\n const onTokenChanged = e => {\n null != e.error && __PRIVATE_logDebug(\"FirebaseAppCheckTokenProvider\", `Error getting App Check token; using placeholder token instead. Error: ${e.error.message}`);\n const n = e.token !== this.R;\n return this.R = e.token, __PRIVATE_logDebug(\"FirebaseAppCheckTokenProvider\", `Received ${n ? \"new\" : \"existing\"} token.`), \n n ? t(e.token) : Promise.resolve();\n };\n this.o = t => {\n e.enqueueRetryable((() => onTokenChanged(t)));\n };\n const __PRIVATE_registerAppCheck = e => {\n __PRIVATE_logDebug(\"FirebaseAppCheckTokenProvider\", \"AppCheck detected\"), this.appCheck = e, \n this.o && this.appCheck.addTokenListener(this.o);\n };\n this.A.onInit((e => __PRIVATE_registerAppCheck(e))), \n // Our users can initialize AppCheck after Firestore, so we give it\n // a chance to register itself with the component framework.\n setTimeout((() => {\n if (!this.appCheck) {\n const e = this.A.getImmediate({\n optional: !0\n });\n e ? __PRIVATE_registerAppCheck(e) : \n // If AppCheck is still not available, proceed without it.\n __PRIVATE_logDebug(\"FirebaseAppCheckTokenProvider\", \"AppCheck not yet detected\");\n }\n }), 0);\n }\n getToken() {\n const e = this.forceRefresh;\n return this.forceRefresh = !1, this.appCheck ? this.appCheck.getToken(e).then((e => e ? (__PRIVATE_hardAssert(\"string\" == typeof e.token), \n this.R = e.token, new AppCheckToken(e.token)) : null)) : Promise.resolve(null);\n }\n invalidateToken() {\n this.forceRefresh = !0;\n }\n shutdown() {\n this.appCheck && this.o && this.appCheck.removeTokenListener(this.o), this.o = void 0;\n }\n}\n\n/**\n * An AppCheck token provider that always yields an empty token.\n * @internal\n */ class __PRIVATE_EmptyAppCheckTokenProvider {\n getToken() {\n return Promise.resolve(new AppCheckToken(\"\"));\n }\n invalidateToken() {}\n start(e, t) {}\n shutdown() {}\n}\n\n/**\n * Builds a CredentialsProvider depending on the type of\n * the credentials passed in.\n */\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Generates `nBytes` of random bytes.\n *\n * If `nBytes < 0` , an error will be thrown.\n */\nfunction __PRIVATE_randomBytes(e) {\n // Polyfills for IE and WebWorker by using `self` and `msCrypto` when `crypto` is not available.\n const t = \n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n \"undefined\" != typeof self && (self.crypto || self.msCrypto), n = new Uint8Array(e);\n if (t && \"function\" == typeof t.getRandomValues) t.getRandomValues(n); else \n // Falls back to Math.random\n for (let t = 0; t < e; t++) n[t] = Math.floor(256 * Math.random());\n return n;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A utility class for generating unique alphanumeric IDs of a specified length.\n *\n * @internal\n * Exported internally for testing purposes.\n */ class __PRIVATE_AutoId {\n static newId() {\n // Alphanumeric characters\n const e = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\", t = Math.floor(256 / e.length) * e.length;\n // The largest byte value that is a multiple of `char.length`.\n let n = \"\";\n for (;n.length < 20; ) {\n const r = __PRIVATE_randomBytes(40);\n for (let i = 0; i < r.length; ++i) \n // Only accept values that are [0, maxMultiple), this ensures they can\n // be evenly mapped to indices of `chars` via a modulo operation.\n n.length < 20 && r[i] < t && (n += e.charAt(r[i] % e.length));\n }\n return n;\n }\n}\n\nfunction __PRIVATE_primitiveComparator(e, t) {\n return e < t ? -1 : e > t ? 1 : 0;\n}\n\n/** Helper to compare arrays using isEqual(). */ function __PRIVATE_arrayEquals(e, t, n) {\n return e.length === t.length && e.every(((e, r) => n(e, t[r])));\n}\n\n/**\n * Returns the immediate lexicographically-following string. This is useful to\n * construct an inclusive range for indexeddb iterators.\n */ function __PRIVATE_immediateSuccessor(e) {\n // Return the input string, with an additional NUL byte appended.\n return e + \"\\0\";\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// The earliest date supported by Firestore timestamps (0001-01-01T00:00:00Z).\n/**\n * A `Timestamp` represents a point in time independent of any time zone or\n * calendar, represented as seconds and fractions of seconds at nanosecond\n * resolution in UTC Epoch time.\n *\n * It is encoded using the Proleptic Gregorian Calendar which extends the\n * Gregorian calendar backwards to year one. It is encoded assuming all minutes\n * are 60 seconds long, i.e. leap seconds are \"smeared\" so that no leap second\n * table is needed for interpretation. Range is from 0001-01-01T00:00:00Z to\n * 9999-12-31T23:59:59.999999999Z.\n *\n * For examples and further specifications, refer to the\n * {@link https://github.com/google/protobuf/blob/master/src/google/protobuf/timestamp.proto | Timestamp definition}.\n */\nclass Timestamp {\n /**\n * Creates a new timestamp.\n *\n * @param seconds - The number of seconds of UTC time since Unix epoch\n * 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to\n * 9999-12-31T23:59:59Z inclusive.\n * @param nanoseconds - The non-negative fractions of a second at nanosecond\n * resolution. Negative second values with fractions must still have\n * non-negative nanoseconds values that count forward in time. Must be\n * from 0 to 999,999,999 inclusive.\n */\n constructor(\n /**\n * The number of seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z.\n */\n e, \n /**\n * The fractions of a second at nanosecond resolution.*\n */\n t) {\n if (this.seconds = e, this.nanoseconds = t, t < 0) throw new FirestoreError(D.INVALID_ARGUMENT, \"Timestamp nanoseconds out of range: \" + t);\n if (t >= 1e9) throw new FirestoreError(D.INVALID_ARGUMENT, \"Timestamp nanoseconds out of range: \" + t);\n if (e < -62135596800) throw new FirestoreError(D.INVALID_ARGUMENT, \"Timestamp seconds out of range: \" + e);\n // This will break in the year 10,000.\n if (e >= 253402300800) throw new FirestoreError(D.INVALID_ARGUMENT, \"Timestamp seconds out of range: \" + e);\n }\n /**\n * Creates a new timestamp with the current date, with millisecond precision.\n *\n * @returns a new timestamp representing the current date.\n */ static now() {\n return Timestamp.fromMillis(Date.now());\n }\n /**\n * Creates a new timestamp from the given date.\n *\n * @param date - The date to initialize the `Timestamp` from.\n * @returns A new `Timestamp` representing the same point in time as the given\n * date.\n */ static fromDate(e) {\n return Timestamp.fromMillis(e.getTime());\n }\n /**\n * Creates a new timestamp from the given number of milliseconds.\n *\n * @param milliseconds - Number of milliseconds since Unix epoch\n * 1970-01-01T00:00:00Z.\n * @returns A new `Timestamp` representing the same point in time as the given\n * number of milliseconds.\n */ static fromMillis(e) {\n const t = Math.floor(e / 1e3), n = Math.floor(1e6 * (e - 1e3 * t));\n return new Timestamp(t, n);\n }\n /**\n * Converts a `Timestamp` to a JavaScript `Date` object. This conversion\n * causes a loss of precision since `Date` objects only support millisecond\n * precision.\n *\n * @returns JavaScript `Date` object representing the same point in time as\n * this `Timestamp`, with millisecond precision.\n */ toDate() {\n return new Date(this.toMillis());\n }\n /**\n * Converts a `Timestamp` to a numeric timestamp (in milliseconds since\n * epoch). This operation causes a loss of precision.\n *\n * @returns The point in time corresponding to this timestamp, represented as\n * the number of milliseconds since Unix epoch 1970-01-01T00:00:00Z.\n */ toMillis() {\n return 1e3 * this.seconds + this.nanoseconds / 1e6;\n }\n _compareTo(e) {\n return this.seconds === e.seconds ? __PRIVATE_primitiveComparator(this.nanoseconds, e.nanoseconds) : __PRIVATE_primitiveComparator(this.seconds, e.seconds);\n }\n /**\n * Returns true if this `Timestamp` is equal to the provided one.\n *\n * @param other - The `Timestamp` to compare against.\n * @returns true if this `Timestamp` is equal to the provided one.\n */ isEqual(e) {\n return e.seconds === this.seconds && e.nanoseconds === this.nanoseconds;\n }\n /** Returns a textual representation of this `Timestamp`. */ toString() {\n return \"Timestamp(seconds=\" + this.seconds + \", nanoseconds=\" + this.nanoseconds + \")\";\n }\n /** Returns a JSON-serializable representation of this `Timestamp`. */ toJSON() {\n return {\n seconds: this.seconds,\n nanoseconds: this.nanoseconds\n };\n }\n /**\n * Converts this object to a primitive string, which allows `Timestamp` objects\n * to be compared using the `>`, `<=`, `>=` and `>` operators.\n */ valueOf() {\n // This method returns a string of the form . where\n // is translated to have a non-negative value and both \n // and are left-padded with zeroes to be a consistent length.\n // Strings with this format then have a lexicographical ordering that matches\n // the expected ordering. The translation is done to avoid having\n // a leading negative sign (i.e. a leading '-' character) in its string\n // representation, which would affect its lexicographical ordering.\n const e = this.seconds - -62135596800;\n // Note: Up to 12 decimal digits are required to represent all valid\n // 'seconds' values.\n return String(e).padStart(12, \"0\") + \".\" + String(this.nanoseconds).padStart(9, \"0\");\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A version of a document in Firestore. This corresponds to the version\n * timestamp, such as update_time or read_time.\n */ class SnapshotVersion {\n constructor(e) {\n this.timestamp = e;\n }\n static fromTimestamp(e) {\n return new SnapshotVersion(e);\n }\n static min() {\n return new SnapshotVersion(new Timestamp(0, 0));\n }\n static max() {\n return new SnapshotVersion(new Timestamp(253402300799, 999999999));\n }\n compareTo(e) {\n return this.timestamp._compareTo(e.timestamp);\n }\n isEqual(e) {\n return this.timestamp.isEqual(e.timestamp);\n }\n /** Returns a number representation of the version for use in spec tests. */ toMicroseconds() {\n // Convert to microseconds.\n return 1e6 * this.timestamp.seconds + this.timestamp.nanoseconds / 1e3;\n }\n toString() {\n return \"SnapshotVersion(\" + this.timestamp.toString() + \")\";\n }\n toTimestamp() {\n return this.timestamp;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Path represents an ordered sequence of string segments.\n */\nclass BasePath {\n constructor(e, t, n) {\n void 0 === t ? t = 0 : t > e.length && fail(), void 0 === n ? n = e.length - t : n > e.length - t && fail(), \n this.segments = e, this.offset = t, this.len = n;\n }\n get length() {\n return this.len;\n }\n isEqual(e) {\n return 0 === BasePath.comparator(this, e);\n }\n child(e) {\n const t = this.segments.slice(this.offset, this.limit());\n return e instanceof BasePath ? e.forEach((e => {\n t.push(e);\n })) : t.push(e), this.construct(t);\n }\n /** The index of one past the last segment of the path. */ limit() {\n return this.offset + this.length;\n }\n popFirst(e) {\n return e = void 0 === e ? 1 : e, this.construct(this.segments, this.offset + e, this.length - e);\n }\n popLast() {\n return this.construct(this.segments, this.offset, this.length - 1);\n }\n firstSegment() {\n return this.segments[this.offset];\n }\n lastSegment() {\n return this.get(this.length - 1);\n }\n get(e) {\n return this.segments[this.offset + e];\n }\n isEmpty() {\n return 0 === this.length;\n }\n isPrefixOf(e) {\n if (e.length < this.length) return !1;\n for (let t = 0; t < this.length; t++) if (this.get(t) !== e.get(t)) return !1;\n return !0;\n }\n isImmediateParentOf(e) {\n if (this.length + 1 !== e.length) return !1;\n for (let t = 0; t < this.length; t++) if (this.get(t) !== e.get(t)) return !1;\n return !0;\n }\n forEach(e) {\n for (let t = this.offset, n = this.limit(); t < n; t++) e(this.segments[t]);\n }\n toArray() {\n return this.segments.slice(this.offset, this.limit());\n }\n static comparator(e, t) {\n const n = Math.min(e.length, t.length);\n for (let r = 0; r < n; r++) {\n const n = e.get(r), i = t.get(r);\n if (n < i) return -1;\n if (n > i) return 1;\n }\n return e.length < t.length ? -1 : e.length > t.length ? 1 : 0;\n }\n}\n\n/**\n * A slash-separated path for navigating resources (documents and collections)\n * within Firestore.\n *\n * @internal\n */ class ResourcePath extends BasePath {\n construct(e, t, n) {\n return new ResourcePath(e, t, n);\n }\n canonicalString() {\n // NOTE: The client is ignorant of any path segments containing escape\n // sequences (e.g. __id123__) and just passes them through raw (they exist\n // for legacy reasons and should not be used frequently).\n return this.toArray().join(\"/\");\n }\n toString() {\n return this.canonicalString();\n }\n /**\n * Returns a string representation of this path\n * where each path segment has been encoded with\n * `encodeURIComponent`.\n */ toUriEncodedString() {\n return this.toArray().map(encodeURIComponent).join(\"/\");\n }\n /**\n * Creates a resource path from the given slash-delimited string. If multiple\n * arguments are provided, all components are combined. Leading and trailing\n * slashes from all components are ignored.\n */ static fromString(...e) {\n // NOTE: The client is ignorant of any path segments containing escape\n // sequences (e.g. __id123__) and just passes them through raw (they exist\n // for legacy reasons and should not be used frequently).\n const t = [];\n for (const n of e) {\n if (n.indexOf(\"//\") >= 0) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid segment (${n}). Paths must not contain // in them.`);\n // Strip leading and trailing slashed.\n t.push(...n.split(\"/\").filter((e => e.length > 0)));\n }\n return new ResourcePath(t);\n }\n static emptyPath() {\n return new ResourcePath([]);\n }\n}\n\nconst v = /^[_a-zA-Z][_a-zA-Z0-9]*$/;\n\n/**\n * A dot-separated path for navigating sub-objects within a document.\n * @internal\n */ class FieldPath$1 extends BasePath {\n construct(e, t, n) {\n return new FieldPath$1(e, t, n);\n }\n /**\n * Returns true if the string could be used as a segment in a field path\n * without escaping.\n */ static isValidIdentifier(e) {\n return v.test(e);\n }\n canonicalString() {\n return this.toArray().map((e => (e = e.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\"), \n FieldPath$1.isValidIdentifier(e) || (e = \"`\" + e + \"`\"), e))).join(\".\");\n }\n toString() {\n return this.canonicalString();\n }\n /**\n * Returns true if this field references the key of a document.\n */ isKeyField() {\n return 1 === this.length && \"__name__\" === this.get(0);\n }\n /**\n * The field designating the key of a document.\n */ static keyField() {\n return new FieldPath$1([ \"__name__\" ]);\n }\n /**\n * Parses a field string from the given server-formatted string.\n *\n * - Splitting the empty string is not allowed (for now at least).\n * - Empty segments within the string (e.g. if there are two consecutive\n * separators) are not allowed.\n *\n * TODO(b/37244157): we should make this more strict. Right now, it allows\n * non-identifier path components, even if they aren't escaped.\n */ static fromServerFormat(e) {\n const t = [];\n let n = \"\", r = 0;\n const __PRIVATE_addCurrentSegment = () => {\n if (0 === n.length) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid field path (${e}). Paths must not be empty, begin with '.', end with '.', or contain '..'`);\n t.push(n), n = \"\";\n };\n let i = !1;\n for (;r < e.length; ) {\n const t = e[r];\n if (\"\\\\\" === t) {\n if (r + 1 === e.length) throw new FirestoreError(D.INVALID_ARGUMENT, \"Path has trailing escape character: \" + e);\n const t = e[r + 1];\n if (\"\\\\\" !== t && \".\" !== t && \"`\" !== t) throw new FirestoreError(D.INVALID_ARGUMENT, \"Path has invalid escape sequence: \" + e);\n n += t, r += 2;\n } else \"`\" === t ? (i = !i, r++) : \".\" !== t || i ? (n += t, r++) : (__PRIVATE_addCurrentSegment(), \n r++);\n }\n if (__PRIVATE_addCurrentSegment(), i) throw new FirestoreError(D.INVALID_ARGUMENT, \"Unterminated ` in path: \" + e);\n return new FieldPath$1(t);\n }\n static emptyPath() {\n return new FieldPath$1([]);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @internal\n */ class DocumentKey {\n constructor(e) {\n this.path = e;\n }\n static fromPath(e) {\n return new DocumentKey(ResourcePath.fromString(e));\n }\n static fromName(e) {\n return new DocumentKey(ResourcePath.fromString(e).popFirst(5));\n }\n static empty() {\n return new DocumentKey(ResourcePath.emptyPath());\n }\n get collectionGroup() {\n return this.path.popLast().lastSegment();\n }\n /** Returns true if the document is in the specified collectionId. */ hasCollectionId(e) {\n return this.path.length >= 2 && this.path.get(this.path.length - 2) === e;\n }\n /** Returns the collection group (i.e. the name of the parent collection) for this key. */ getCollectionGroup() {\n return this.path.get(this.path.length - 2);\n }\n /** Returns the fully qualified path to the parent collection. */ getCollectionPath() {\n return this.path.popLast();\n }\n isEqual(e) {\n return null !== e && 0 === ResourcePath.comparator(this.path, e.path);\n }\n toString() {\n return this.path.toString();\n }\n static comparator(e, t) {\n return ResourcePath.comparator(e.path, t.path);\n }\n static isDocumentKey(e) {\n return e.length % 2 == 0;\n }\n /**\n * Creates and returns a new document key with the given segments.\n *\n * @param segments - The segments of the path to the document\n * @returns A new instance of DocumentKey\n */ static fromSegments(e) {\n return new DocumentKey(new ResourcePath(e.slice()));\n }\n}\n\n/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The initial mutation batch id for each index. Gets updated during index\n * backfill.\n */\n/**\n * An index definition for field indexes in Firestore.\n *\n * Every index is associated with a collection. The definition contains a list\n * of fields and their index kind (which can be `ASCENDING`, `DESCENDING` or\n * `CONTAINS` for ArrayContains/ArrayContainsAny queries).\n *\n * Unlike the backend, the SDK does not differentiate between collection or\n * collection group-scoped indices. Every index can be used for both single\n * collection and collection group queries.\n */\nclass FieldIndex {\n constructor(\n /**\n * The index ID. Returns -1 if the index ID is not available (e.g. the index\n * has not yet been persisted).\n */\n e, \n /** The collection ID this index applies to. */\n t, \n /** The field segments for this index. */\n n, \n /** Shows how up-to-date the index is for the current user. */\n r) {\n this.indexId = e, this.collectionGroup = t, this.fields = n, this.indexState = r;\n }\n}\n\n/** An ID for an index that has not yet been added to persistence. */\n/** Returns the ArrayContains/ArrayContainsAny segment for this index. */\nfunction __PRIVATE_fieldIndexGetArraySegment(e) {\n return e.fields.find((e => 2 /* IndexKind.CONTAINS */ === e.kind));\n}\n\n/** Returns all directional (ascending/descending) segments for this index. */ function __PRIVATE_fieldIndexGetDirectionalSegments(e) {\n return e.fields.filter((e => 2 /* IndexKind.CONTAINS */ !== e.kind));\n}\n\n/**\n * Returns the order of the document key component for the given index.\n *\n * PORTING NOTE: This is only used in the Web IndexedDb implementation.\n */\n/**\n * Compares indexes by collection group and segments. Ignores update time and\n * index ID.\n */\nfunction __PRIVATE_fieldIndexSemanticComparator(e, t) {\n let n = __PRIVATE_primitiveComparator(e.collectionGroup, t.collectionGroup);\n if (0 !== n) return n;\n for (let r = 0; r < Math.min(e.fields.length, t.fields.length); ++r) if (n = __PRIVATE_indexSegmentComparator(e.fields[r], t.fields[r]), \n 0 !== n) return n;\n return __PRIVATE_primitiveComparator(e.fields.length, t.fields.length);\n}\n\n/** Returns a debug representation of the field index */ FieldIndex.UNKNOWN_ID = -1;\n\n/** An index component consisting of field path and index type. */\nclass IndexSegment {\n constructor(\n /** The field path of the component. */\n e, \n /** The fields sorting order. */\n t) {\n this.fieldPath = e, this.kind = t;\n }\n}\n\nfunction __PRIVATE_indexSegmentComparator(e, t) {\n const n = FieldPath$1.comparator(e.fieldPath, t.fieldPath);\n return 0 !== n ? n : __PRIVATE_primitiveComparator(e.kind, t.kind);\n}\n\n/**\n * Stores the \"high water mark\" that indicates how updated the Index is for the\n * current user.\n */ class IndexState {\n constructor(\n /**\n * Indicates when the index was last updated (relative to other indexes).\n */\n e, \n /** The the latest indexed read time, document and batch id. */\n t) {\n this.sequenceNumber = e, this.offset = t;\n }\n /** The state of an index that has not yet been backfilled. */ static empty() {\n return new IndexState(0, IndexOffset.min());\n }\n}\n\n/**\n * Creates an offset that matches all documents with a read time higher than\n * `readTime`.\n */ function __PRIVATE_newIndexOffsetSuccessorFromReadTime(e, t) {\n // We want to create an offset that matches all documents with a read time\n // greater than the provided read time. To do so, we technically need to\n // create an offset for `(readTime, MAX_DOCUMENT_KEY)`. While we could use\n // Unicode codepoints to generate MAX_DOCUMENT_KEY, it is much easier to use\n // `(readTime + 1, DocumentKey.empty())` since `> DocumentKey.empty()` matches\n // all valid document IDs.\n const n = e.toTimestamp().seconds, r = e.toTimestamp().nanoseconds + 1, i = SnapshotVersion.fromTimestamp(1e9 === r ? new Timestamp(n + 1, 0) : new Timestamp(n, r));\n return new IndexOffset(i, DocumentKey.empty(), t);\n}\n\n/** Creates a new offset based on the provided document. */ function __PRIVATE_newIndexOffsetFromDocument(e) {\n return new IndexOffset(e.readTime, e.key, -1);\n}\n\n/**\n * Stores the latest read time, document and batch ID that were processed for an\n * index.\n */ class IndexOffset {\n constructor(\n /**\n * The latest read time version that has been indexed by Firestore for this\n * field index.\n */\n e, \n /**\n * The key of the last document that was indexed for this query. Use\n * `DocumentKey.empty()` if no document has been indexed.\n */\n t, \n /*\n * The largest mutation batch id that's been processed by Firestore.\n */\n n) {\n this.readTime = e, this.documentKey = t, this.largestBatchId = n;\n }\n /** Returns an offset that sorts before all regular offsets. */ static min() {\n return new IndexOffset(SnapshotVersion.min(), DocumentKey.empty(), -1);\n }\n /** Returns an offset that sorts after all regular offsets. */ static max() {\n return new IndexOffset(SnapshotVersion.max(), DocumentKey.empty(), -1);\n }\n}\n\nfunction __PRIVATE_indexOffsetComparator(e, t) {\n let n = e.readTime.compareTo(t.readTime);\n return 0 !== n ? n : (n = DocumentKey.comparator(e.documentKey, t.documentKey), \n 0 !== n ? n : __PRIVATE_primitiveComparator(e.largestBatchId, t.largestBatchId));\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const C = \"The current tab is not in the required state to perform this operation. It might be necessary to refresh the browser tab.\";\n\n/**\n * A base class representing a persistence transaction, encapsulating both the\n * transaction's sequence numbers as well as a list of onCommitted listeners.\n *\n * When you call Persistence.runTransaction(), it will create a transaction and\n * pass it to your callback. You then pass it to any method that operates\n * on persistence.\n */ class PersistenceTransaction {\n constructor() {\n this.onCommittedListeners = [];\n }\n addOnCommittedListener(e) {\n this.onCommittedListeners.push(e);\n }\n raiseOnCommittedEvent() {\n this.onCommittedListeners.forEach((e => e()));\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Verifies the error thrown by a LocalStore operation. If a LocalStore\n * operation fails because the primary lease has been taken by another client,\n * we ignore the error (the persistence layer will immediately call\n * `applyPrimaryLease` to propagate the primary state change). All other errors\n * are re-thrown.\n *\n * @param err - An error returned by a LocalStore operation.\n * @returns A Promise that resolves after we recovered, or the original error.\n */ async function __PRIVATE_ignoreIfPrimaryLeaseLoss(e) {\n if (e.code !== D.FAILED_PRECONDITION || e.message !== C) throw e;\n __PRIVATE_logDebug(\"LocalStore\", \"Unexpectedly lost primary lease\");\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * PersistencePromise is essentially a re-implementation of Promise except\n * it has a .next() method instead of .then() and .next() and .catch() callbacks\n * are executed synchronously when a PersistencePromise resolves rather than\n * asynchronously (Promise implementations use setImmediate() or similar).\n *\n * This is necessary to interoperate with IndexedDB which will automatically\n * commit transactions if control is returned to the event loop without\n * synchronously initiating another operation on the transaction.\n *\n * NOTE: .then() and .catch() only allow a single consumer, unlike normal\n * Promises.\n */ class PersistencePromise {\n constructor(e) {\n // NOTE: next/catchCallback will always point to our own wrapper functions,\n // not the user's raw next() or catch() callbacks.\n this.nextCallback = null, this.catchCallback = null, \n // When the operation resolves, we'll set result or error and mark isDone.\n this.result = void 0, this.error = void 0, this.isDone = !1, \n // Set to true when .then() or .catch() are called and prevents additional\n // chaining.\n this.callbackAttached = !1, e((e => {\n this.isDone = !0, this.result = e, this.nextCallback && \n // value should be defined unless T is Void, but we can't express\n // that in the type system.\n this.nextCallback(e);\n }), (e => {\n this.isDone = !0, this.error = e, this.catchCallback && this.catchCallback(e);\n }));\n }\n catch(e) {\n return this.next(void 0, e);\n }\n next(e, t) {\n return this.callbackAttached && fail(), this.callbackAttached = !0, this.isDone ? this.error ? this.wrapFailure(t, this.error) : this.wrapSuccess(e, this.result) : new PersistencePromise(((n, r) => {\n this.nextCallback = t => {\n this.wrapSuccess(e, t).next(n, r);\n }, this.catchCallback = e => {\n this.wrapFailure(t, e).next(n, r);\n };\n }));\n }\n toPromise() {\n return new Promise(((e, t) => {\n this.next(e, t);\n }));\n }\n wrapUserFunction(e) {\n try {\n const t = e();\n return t instanceof PersistencePromise ? t : PersistencePromise.resolve(t);\n } catch (e) {\n return PersistencePromise.reject(e);\n }\n }\n wrapSuccess(e, t) {\n return e ? this.wrapUserFunction((() => e(t))) : PersistencePromise.resolve(t);\n }\n wrapFailure(e, t) {\n return e ? this.wrapUserFunction((() => e(t))) : PersistencePromise.reject(t);\n }\n static resolve(e) {\n return new PersistencePromise(((t, n) => {\n t(e);\n }));\n }\n static reject(e) {\n return new PersistencePromise(((t, n) => {\n n(e);\n }));\n }\n static waitFor(\n // Accept all Promise types in waitFor().\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n e) {\n return new PersistencePromise(((t, n) => {\n let r = 0, i = 0, s = !1;\n e.forEach((e => {\n ++r, e.next((() => {\n ++i, s && i === r && t();\n }), (e => n(e)));\n })), s = !0, i === r && t();\n }));\n }\n /**\n * Given an array of predicate functions that asynchronously evaluate to a\n * boolean, implements a short-circuiting `or` between the results. Predicates\n * will be evaluated until one of them returns `true`, then stop. The final\n * result will be whether any of them returned `true`.\n */ static or(e) {\n let t = PersistencePromise.resolve(!1);\n for (const n of e) t = t.next((e => e ? PersistencePromise.resolve(e) : n()));\n return t;\n }\n static forEach(e, t) {\n const n = [];\n return e.forEach(((e, r) => {\n n.push(t.call(this, e, r));\n })), this.waitFor(n);\n }\n /**\n * Concurrently map all array elements through asynchronous function.\n */ static mapArray(e, t) {\n return new PersistencePromise(((n, r) => {\n const i = e.length, s = new Array(i);\n let o = 0;\n for (let _ = 0; _ < i; _++) {\n const a = _;\n t(e[a]).next((e => {\n s[a] = e, ++o, o === i && n(s);\n }), (e => r(e)));\n }\n }));\n }\n /**\n * An alternative to recursive PersistencePromise calls, that avoids\n * potential memory problems from unbounded chains of promises.\n *\n * The `action` will be called repeatedly while `condition` is true.\n */ static doWhile(e, t) {\n return new PersistencePromise(((n, r) => {\n const process = () => {\n !0 === e() ? t().next((() => {\n process();\n }), r) : n();\n };\n process();\n }));\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// References to `window` are guarded by SimpleDb.isAvailable()\n/* eslint-disable no-restricted-globals */\n/**\n * Wraps an IDBTransaction and exposes a store() method to get a handle to a\n * specific object store.\n */\nclass __PRIVATE_SimpleDbTransaction {\n constructor(e, t) {\n this.action = e, this.transaction = t, this.aborted = !1, \n /**\n * A `Promise` that resolves with the result of the IndexedDb transaction.\n */\n this.V = new __PRIVATE_Deferred, this.transaction.oncomplete = () => {\n this.V.resolve();\n }, this.transaction.onabort = () => {\n t.error ? this.V.reject(new __PRIVATE_IndexedDbTransactionError(e, t.error)) : this.V.resolve();\n }, this.transaction.onerror = t => {\n const n = __PRIVATE_checkForAndReportiOSError(t.target.error);\n this.V.reject(new __PRIVATE_IndexedDbTransactionError(e, n));\n };\n }\n static open(e, t, n, r) {\n try {\n return new __PRIVATE_SimpleDbTransaction(t, e.transaction(r, n));\n } catch (e) {\n throw new __PRIVATE_IndexedDbTransactionError(t, e);\n }\n }\n get m() {\n return this.V.promise;\n }\n abort(e) {\n e && this.V.reject(e), this.aborted || (__PRIVATE_logDebug(\"SimpleDb\", \"Aborting transaction:\", e ? e.message : \"Client-initiated abort\"), \n this.aborted = !0, this.transaction.abort());\n }\n g() {\n // If the browser supports V3 IndexedDB, we invoke commit() explicitly to\n // speed up index DB processing if the event loop remains blocks.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const e = this.transaction;\n this.aborted || \"function\" != typeof e.commit || e.commit();\n }\n /**\n * Returns a SimpleDbStore for the specified store. All\n * operations performed on the SimpleDbStore happen within the context of this\n * transaction and it cannot be used anymore once the transaction is\n * completed.\n *\n * Note that we can't actually enforce that the KeyType and ValueType are\n * correct, but they allow type safety through the rest of the consuming code.\n */ store(e) {\n const t = this.transaction.objectStore(e);\n return new __PRIVATE_SimpleDbStore(t);\n }\n}\n\n/**\n * Provides a wrapper around IndexedDb with a simplified interface that uses\n * Promise-like return values to chain operations. Real promises cannot be used\n * since .then() continuations are executed asynchronously (e.g. via\n * .setImmediate), which would cause IndexedDB to end the transaction.\n * See PersistencePromise for more details.\n */ class __PRIVATE_SimpleDb {\n /*\n * Creates a new SimpleDb wrapper for IndexedDb database `name`.\n *\n * Note that `version` must not be a downgrade. IndexedDB does not support\n * downgrading the schema version. We currently do not support any way to do\n * versioning outside of IndexedDB's versioning mechanism, as only\n * version-upgrade transactions are allowed to do things like create\n * objectstores.\n */\n constructor(e, t, n) {\n this.name = e, this.version = t, this.p = n;\n // NOTE: According to https://bugs.webkit.org/show_bug.cgi?id=197050, the\n // bug we're checking for should exist in iOS >= 12.2 and < 13, but for\n // whatever reason it's much harder to hit after 12.2 so we only proactively\n // log on 12.2.\n 12.2 === __PRIVATE_SimpleDb.S(getUA()) && __PRIVATE_logError(\"Firestore persistence suffers from a bug in iOS 12.2 Safari that may cause your app to stop working. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround.\");\n }\n /** Deletes the specified database. */ static delete(e) {\n return __PRIVATE_logDebug(\"SimpleDb\", \"Removing database:\", e), __PRIVATE_wrapRequest(window.indexedDB.deleteDatabase(e)).toPromise();\n }\n /** Returns true if IndexedDB is available in the current environment. */ static D() {\n if (!isIndexedDBAvailable()) return !1;\n if (__PRIVATE_SimpleDb.v()) return !0;\n // We extensively use indexed array values and compound keys,\n // which IE and Edge do not support. However, they still have indexedDB\n // defined on the window, so we need to check for them here and make sure\n // to return that persistence is not enabled for those browsers.\n // For tracking support of this feature, see here:\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/status/indexeddbarraysandmultientrysupport/\n // Check the UA string to find out the browser.\n const e = getUA(), t = __PRIVATE_SimpleDb.S(e), n = 0 < t && t < 10, r = __PRIVATE_getAndroidVersion(e), i = 0 < r && r < 4.5;\n // IE 10\n // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';\n // IE 11\n // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';\n // Edge\n // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,\n // like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0';\n // iOS Safari: Disable for users running iOS version < 10.\n return !(e.indexOf(\"MSIE \") > 0 || e.indexOf(\"Trident/\") > 0 || e.indexOf(\"Edge/\") > 0 || n || i);\n }\n /**\n * Returns true if the backing IndexedDB store is the Node IndexedDBShim\n * (see https://github.com/axemclion/IndexedDBShim).\n */ static v() {\n var e;\n return \"undefined\" != typeof process && \"YES\" === (null === (e = process.__PRIVATE_env) || void 0 === e ? void 0 : e.C);\n }\n /** Helper to get a typed SimpleDbStore from a transaction. */ static F(e, t) {\n return e.store(t);\n }\n // visible for testing\n /** Parse User Agent to determine iOS version. Returns -1 if not found. */\n static S(e) {\n const t = e.match(/i(?:phone|pad|pod) os ([\\d_]+)/i), n = t ? t[1].split(\"_\").slice(0, 2).join(\".\") : \"-1\";\n return Number(n);\n }\n /**\n * Opens the specified database, creating or upgrading it if necessary.\n */ async M(e) {\n return this.db || (__PRIVATE_logDebug(\"SimpleDb\", \"Opening database:\", this.name), \n this.db = await new Promise(((t, n) => {\n // TODO(mikelehen): Investigate browser compatibility.\n // https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB\n // suggests IE9 and older WebKit browsers handle upgrade\n // differently. They expect setVersion, as described here:\n // https://developer.mozilla.org/en-US/docs/Web/API/IDBVersionChangeRequest/setVersion\n const r = indexedDB.open(this.name, this.version);\n r.onsuccess = e => {\n const n = e.target.result;\n t(n);\n }, r.onblocked = () => {\n n(new __PRIVATE_IndexedDbTransactionError(e, \"Cannot upgrade IndexedDB schema while another tab is open. Close all tabs that access Firestore and reload this page to proceed.\"));\n }, r.onerror = t => {\n const r = t.target.error;\n \"VersionError\" === r.name ? n(new FirestoreError(D.FAILED_PRECONDITION, \"A newer version of the Firestore SDK was previously used and so the persisted data is not compatible with the version of the SDK you are now using. The SDK will operate with persistence disabled. If you need persistence, please re-upgrade to a newer version of the SDK or else clear the persisted IndexedDB data for your app to start fresh.\")) : \"InvalidStateError\" === r.name ? n(new FirestoreError(D.FAILED_PRECONDITION, \"Unable to open an IndexedDB connection. This could be due to running in a private browsing session on a browser whose private browsing sessions do not support IndexedDB: \" + r)) : n(new __PRIVATE_IndexedDbTransactionError(e, r));\n }, r.onupgradeneeded = e => {\n __PRIVATE_logDebug(\"SimpleDb\", 'Database \"' + this.name + '\" requires upgrade from version:', e.oldVersion);\n const t = e.target.result;\n this.p.O(t, r.transaction, e.oldVersion, this.version).next((() => {\n __PRIVATE_logDebug(\"SimpleDb\", \"Database upgrade to version \" + this.version + \" complete\");\n }));\n };\n }))), this.N && (this.db.onversionchange = e => this.N(e)), this.db;\n }\n L(e) {\n this.N = e, this.db && (this.db.onversionchange = t => e(t));\n }\n async runTransaction(e, t, n, r) {\n const i = \"readonly\" === t;\n let s = 0;\n for (;;) {\n ++s;\n try {\n this.db = await this.M(e);\n const t = __PRIVATE_SimpleDbTransaction.open(this.db, e, i ? \"readonly\" : \"readwrite\", n), s = r(t).next((e => (t.g(), \n e))).catch((e => (\n // Abort the transaction if there was an error.\n t.abort(e), PersistencePromise.reject(e)))).toPromise();\n // As noted above, errors are propagated by aborting the transaction. So\n // we swallow any error here to avoid the browser logging it as unhandled.\n return s.catch((() => {})), \n // Wait for the transaction to complete (i.e. IndexedDb's onsuccess event to\n // fire), but still return the original transactionFnResult back to the\n // caller.\n await t.m, s;\n } catch (e) {\n const t = e, n = \"FirebaseError\" !== t.name && s < 3;\n // TODO(schmidt-sebastian): We could probably be smarter about this and\n // not retry exceptions that are likely unrecoverable (such as quota\n // exceeded errors).\n // Note: We cannot use an instanceof check for FirestoreException, since the\n // exception is wrapped in a generic error by our async/await handling.\n if (__PRIVATE_logDebug(\"SimpleDb\", \"Transaction failed with error:\", t.message, \"Retrying:\", n), \n this.close(), !n) return Promise.reject(t);\n }\n }\n }\n close() {\n this.db && this.db.close(), this.db = void 0;\n }\n}\n\n/** Parse User Agent to determine Android version. Returns -1 if not found. */ function __PRIVATE_getAndroidVersion(e) {\n const t = e.match(/Android ([\\d.]+)/i), n = t ? t[1].split(\".\").slice(0, 2).join(\".\") : \"-1\";\n return Number(n);\n}\n\n/**\n * A controller for iterating over a key range or index. It allows an iterate\n * callback to delete the currently-referenced object, or jump to a new key\n * within the key range or index.\n */ class __PRIVATE_IterationController {\n constructor(e) {\n this.B = e, this.k = !1, this.q = null;\n }\n get isDone() {\n return this.k;\n }\n get K() {\n return this.q;\n }\n set cursor(e) {\n this.B = e;\n }\n /**\n * This function can be called to stop iteration at any point.\n */ done() {\n this.k = !0;\n }\n /**\n * This function can be called to skip to that next key, which could be\n * an index or a primary key.\n */ $(e) {\n this.q = e;\n }\n /**\n * Delete the current cursor value from the object store.\n *\n * NOTE: You CANNOT do this with a keysOnly query.\n */ delete() {\n return __PRIVATE_wrapRequest(this.B.delete());\n }\n}\n\n/** An error that wraps exceptions that thrown during IndexedDB execution. */ class __PRIVATE_IndexedDbTransactionError extends FirestoreError {\n constructor(e, t) {\n super(D.UNAVAILABLE, `IndexedDB transaction '${e}' failed: ${t}`), this.name = \"IndexedDbTransactionError\";\n }\n}\n\n/** Verifies whether `e` is an IndexedDbTransactionError. */ function __PRIVATE_isIndexedDbTransactionError(e) {\n // Use name equality, as instanceof checks on errors don't work with errors\n // that wrap other errors.\n return \"IndexedDbTransactionError\" === e.name;\n}\n\n/**\n * A wrapper around an IDBObjectStore providing an API that:\n *\n * 1) Has generic KeyType / ValueType parameters to provide strongly-typed\n * methods for acting against the object store.\n * 2) Deals with IndexedDB's onsuccess / onerror event callbacks, making every\n * method return a PersistencePromise instead.\n * 3) Provides a higher-level API to avoid needing to do excessive wrapping of\n * intermediate IndexedDB types (IDBCursorWithValue, etc.)\n */ class __PRIVATE_SimpleDbStore {\n constructor(e) {\n this.store = e;\n }\n put(e, t) {\n let n;\n return void 0 !== t ? (__PRIVATE_logDebug(\"SimpleDb\", \"PUT\", this.store.name, e, t), \n n = this.store.put(t, e)) : (__PRIVATE_logDebug(\"SimpleDb\", \"PUT\", this.store.name, \"\", e), \n n = this.store.put(e)), __PRIVATE_wrapRequest(n);\n }\n /**\n * Adds a new value into an Object Store and returns the new key. Similar to\n * IndexedDb's `add()`, this method will fail on primary key collisions.\n *\n * @param value - The object to write.\n * @returns The key of the value to add.\n */ add(e) {\n __PRIVATE_logDebug(\"SimpleDb\", \"ADD\", this.store.name, e, e);\n return __PRIVATE_wrapRequest(this.store.add(e));\n }\n /**\n * Gets the object with the specified key from the specified store, or null\n * if no object exists with the specified key.\n *\n * @key The key of the object to get.\n * @returns The object with the specified key or null if no object exists.\n */ get(e) {\n // We're doing an unsafe cast to ValueType.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return __PRIVATE_wrapRequest(this.store.get(e)).next((t => (\n // Normalize nonexistence to null.\n void 0 === t && (t = null), __PRIVATE_logDebug(\"SimpleDb\", \"GET\", this.store.name, e, t), \n t)));\n }\n delete(e) {\n __PRIVATE_logDebug(\"SimpleDb\", \"DELETE\", this.store.name, e);\n return __PRIVATE_wrapRequest(this.store.delete(e));\n }\n /**\n * If we ever need more of the count variants, we can add overloads. For now,\n * all we need is to count everything in a store.\n *\n * Returns the number of rows in the store.\n */ count() {\n __PRIVATE_logDebug(\"SimpleDb\", \"COUNT\", this.store.name);\n return __PRIVATE_wrapRequest(this.store.count());\n }\n U(e, t) {\n const n = this.options(e, t), r = n.index ? this.store.index(n.index) : this.store;\n // Use `getAll()` if the browser supports IndexedDB v3, as it is roughly\n // 20% faster.\n if (\"function\" == typeof r.getAll) {\n const e = r.getAll(n.range);\n return new PersistencePromise(((t, n) => {\n e.onerror = e => {\n n(e.target.error);\n }, e.onsuccess = e => {\n t(e.target.result);\n };\n }));\n }\n {\n const e = this.cursor(n), t = [];\n return this.W(e, ((e, n) => {\n t.push(n);\n })).next((() => t));\n }\n }\n /**\n * Loads the first `count` elements from the provided index range. Loads all\n * elements if no limit is provided.\n */ G(e, t) {\n const n = this.store.getAll(e, null === t ? void 0 : t);\n return new PersistencePromise(((e, t) => {\n n.onerror = e => {\n t(e.target.error);\n }, n.onsuccess = t => {\n e(t.target.result);\n };\n }));\n }\n j(e, t) {\n __PRIVATE_logDebug(\"SimpleDb\", \"DELETE ALL\", this.store.name);\n const n = this.options(e, t);\n n.H = !1;\n const r = this.cursor(n);\n return this.W(r, ((e, t, n) => n.delete()));\n }\n J(e, t) {\n let n;\n t ? n = e : (n = {}, t = e);\n const r = this.cursor(n);\n return this.W(r, t);\n }\n /**\n * Iterates over a store, but waits for the given callback to complete for\n * each entry before iterating the next entry. This allows the callback to do\n * asynchronous work to determine if this iteration should continue.\n *\n * The provided callback should return `true` to continue iteration, and\n * `false` otherwise.\n */ Y(e) {\n const t = this.cursor({});\n return new PersistencePromise(((n, r) => {\n t.onerror = e => {\n const t = __PRIVATE_checkForAndReportiOSError(e.target.error);\n r(t);\n }, t.onsuccess = t => {\n const r = t.target.result;\n r ? e(r.primaryKey, r.value).next((e => {\n e ? r.continue() : n();\n })) : n();\n };\n }));\n }\n W(e, t) {\n const n = [];\n return new PersistencePromise(((r, i) => {\n e.onerror = e => {\n i(e.target.error);\n }, e.onsuccess = e => {\n const i = e.target.result;\n if (!i) return void r();\n const s = new __PRIVATE_IterationController(i), o = t(i.primaryKey, i.value, s);\n if (o instanceof PersistencePromise) {\n const e = o.catch((e => (s.done(), PersistencePromise.reject(e))));\n n.push(e);\n }\n s.isDone ? r() : null === s.K ? i.continue() : i.continue(s.K);\n };\n })).next((() => PersistencePromise.waitFor(n)));\n }\n options(e, t) {\n let n;\n return void 0 !== e && (\"string\" == typeof e ? n = e : t = e), {\n index: n,\n range: t\n };\n }\n cursor(e) {\n let t = \"next\";\n if (e.reverse && (t = \"prev\"), e.index) {\n const n = this.store.index(e.index);\n return e.H ? n.openKeyCursor(e.range, t) : n.openCursor(e.range, t);\n }\n return this.store.openCursor(e.range, t);\n }\n}\n\n/**\n * Wraps an IDBRequest in a PersistencePromise, using the onsuccess / onerror\n * handlers to resolve / reject the PersistencePromise as appropriate.\n */ function __PRIVATE_wrapRequest(e) {\n return new PersistencePromise(((t, n) => {\n e.onsuccess = e => {\n const n = e.target.result;\n t(n);\n }, e.onerror = e => {\n const t = __PRIVATE_checkForAndReportiOSError(e.target.error);\n n(t);\n };\n }));\n}\n\n// Guard so we only report the error once.\nlet F = !1;\n\nfunction __PRIVATE_checkForAndReportiOSError(e) {\n const t = __PRIVATE_SimpleDb.S(getUA());\n if (t >= 12.2 && t < 13) {\n const t = \"An internal error was encountered in the Indexed Database server\";\n if (e.message.indexOf(t) >= 0) {\n // Wrap error in a more descriptive one.\n const e = new FirestoreError(\"internal\", `IOS_INDEXEDDB_BUG1: IndexedDb has thrown '${t}'. This is likely due to an unavoidable bug in iOS. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround.`);\n return F || (F = !0, \n // Throw a global exception outside of this promise chain, for the user to\n // potentially catch.\n setTimeout((() => {\n throw e;\n }), 0)), e;\n }\n }\n return e;\n}\n\n/** This class is responsible for the scheduling of Index Backfiller. */\nclass __PRIVATE_IndexBackfillerScheduler {\n constructor(e, t) {\n this.asyncQueue = e, this.Z = t, this.task = null;\n }\n start() {\n this.X(15e3);\n }\n stop() {\n this.task && (this.task.cancel(), this.task = null);\n }\n get started() {\n return null !== this.task;\n }\n X(e) {\n __PRIVATE_logDebug(\"IndexBackfiller\", `Scheduled in ${e}ms`), this.task = this.asyncQueue.enqueueAfterDelay(\"index_backfill\" /* TimerId.IndexBackfill */ , e, (async () => {\n this.task = null;\n try {\n __PRIVATE_logDebug(\"IndexBackfiller\", `Documents written: ${await this.Z.ee()}`);\n } catch (e) {\n __PRIVATE_isIndexedDbTransactionError(e) ? __PRIVATE_logDebug(\"IndexBackfiller\", \"Ignoring IndexedDB error during index backfill: \", e) : await __PRIVATE_ignoreIfPrimaryLeaseLoss(e);\n }\n await this.X(6e4);\n }));\n }\n}\n\n/** Implements the steps for backfilling indexes. */ class __PRIVATE_IndexBackfiller {\n constructor(\n /**\n * LocalStore provides access to IndexManager and LocalDocumentView.\n * These properties will update when the user changes. Consequently,\n * making a local copy of IndexManager and LocalDocumentView will require\n * updates over time. The simpler solution is to rely on LocalStore to have\n * an up-to-date references to IndexManager and LocalDocumentStore.\n */\n e, t) {\n this.localStore = e, this.persistence = t;\n }\n async ee(e = 50) {\n return this.persistence.runTransaction(\"Backfill Indexes\", \"readwrite-primary\", (t => this.te(t, e)));\n }\n /** Writes index entries until the cap is reached. Returns the number of documents processed. */ te(e, t) {\n const n = new Set;\n let r = t, i = !0;\n return PersistencePromise.doWhile((() => !0 === i && r > 0), (() => this.localStore.indexManager.getNextCollectionGroupToUpdate(e).next((t => {\n if (null !== t && !n.has(t)) return __PRIVATE_logDebug(\"IndexBackfiller\", `Processing collection: ${t}`), \n this.ne(e, t, r).next((e => {\n r -= e, n.add(t);\n }));\n i = !1;\n })))).next((() => t - r));\n }\n /**\n * Writes entries for the provided collection group. Returns the number of documents processed.\n */ ne(e, t, n) {\n // Use the earliest offset of all field indexes to query the local cache.\n return this.localStore.indexManager.getMinOffsetFromCollectionGroup(e, t).next((r => this.localStore.localDocuments.getNextDocuments(e, t, r, n).next((n => {\n const i = n.changes;\n return this.localStore.indexManager.updateIndexEntries(e, i).next((() => this.re(r, n))).next((n => (__PRIVATE_logDebug(\"IndexBackfiller\", `Updating offset: ${n}`), \n this.localStore.indexManager.updateCollectionGroup(e, t, n)))).next((() => i.size));\n }))));\n }\n /** Returns the next offset based on the provided documents. */ re(e, t) {\n let n = e;\n return t.changes.forEach(((e, t) => {\n const r = __PRIVATE_newIndexOffsetFromDocument(t);\n __PRIVATE_indexOffsetComparator(r, n) > 0 && (n = r);\n })), new IndexOffset(n.readTime, n.documentKey, Math.max(t.batchId, e.largestBatchId));\n }\n}\n\n/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * `ListenSequence` is a monotonic sequence. It is initialized with a minimum value to\n * exceed. All subsequent calls to next will return increasing values. If provided with a\n * `SequenceNumberSyncer`, it will additionally bump its next value when told of a new value, as\n * well as write out sequence numbers that it produces via `next()`.\n */ class __PRIVATE_ListenSequence {\n constructor(e, t) {\n this.previousValue = e, t && (t.sequenceNumberHandler = e => this.ie(e), this.se = e => t.writeSequenceNumber(e));\n }\n ie(e) {\n return this.previousValue = Math.max(e, this.previousValue), this.previousValue;\n }\n next() {\n const e = ++this.previousValue;\n return this.se && this.se(e), e;\n }\n}\n\n__PRIVATE_ListenSequence.oe = -1;\n\n/**\n * Returns whether a variable is either undefined or null.\n */\nfunction __PRIVATE_isNullOrUndefined(e) {\n return null == e;\n}\n\n/** Returns whether the value represents -0. */ function __PRIVATE_isNegativeZero(e) {\n // Detect if the value is -0.0. Based on polyfill from\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n return 0 === e && 1 / e == -1 / 0;\n}\n\n/**\n * Returns whether a value is an integer and in the safe integer range\n * @param value - The value to test for being an integer and in the safe range\n */ function isSafeInteger(e) {\n return \"number\" == typeof e && Number.isInteger(e) && !__PRIVATE_isNegativeZero(e) && e <= Number.MAX_SAFE_INTEGER && e >= Number.MIN_SAFE_INTEGER;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Encodes a resource path into a IndexedDb-compatible string form.\n */\nfunction __PRIVATE_encodeResourcePath(e) {\n let t = \"\";\n for (let n = 0; n < e.length; n++) t.length > 0 && (t = __PRIVATE_encodeSeparator(t)), \n t = __PRIVATE_encodeSegment(e.get(n), t);\n return __PRIVATE_encodeSeparator(t);\n}\n\n/** Encodes a single segment of a resource path into the given result */ function __PRIVATE_encodeSegment(e, t) {\n let n = t;\n const r = e.length;\n for (let t = 0; t < r; t++) {\n const r = e.charAt(t);\n switch (r) {\n case \"\\0\":\n n += \"\u0001\u0010\";\n break;\n\n case \"\u0001\":\n n += \"\u0001\u0011\";\n break;\n\n default:\n n += r;\n }\n }\n return n;\n}\n\n/** Encodes a path separator into the given result */ function __PRIVATE_encodeSeparator(e) {\n return e + \"\u0001\u0001\";\n}\n\n/**\n * Decodes the given IndexedDb-compatible string form of a resource path into\n * a ResourcePath instance. Note that this method is not suitable for use with\n * decoding resource names from the server; those are One Platform format\n * strings.\n */ function __PRIVATE_decodeResourcePath(e) {\n // Event the empty path must encode as a path of at least length 2. A path\n // with exactly 2 must be the empty path.\n const t = e.length;\n if (__PRIVATE_hardAssert(t >= 2), 2 === t) return __PRIVATE_hardAssert(\"\u0001\" === e.charAt(0) && \"\u0001\" === e.charAt(1)), \n ResourcePath.emptyPath();\n // Escape characters cannot exist past the second-to-last position in the\n // source value.\n const __PRIVATE_lastReasonableEscapeIndex = t - 2, n = [];\n let r = \"\";\n for (let i = 0; i < t; ) {\n // The last two characters of a valid encoded path must be a separator, so\n // there must be an end to this segment.\n const t = e.indexOf(\"\u0001\", i);\n (t < 0 || t > __PRIVATE_lastReasonableEscapeIndex) && fail();\n switch (e.charAt(t + 1)) {\n case \"\u0001\":\n const s = e.substring(i, t);\n let o;\n 0 === r.length ? \n // Avoid copying for the common case of a segment that excludes \\0\n // and \\001\n o = s : (r += s, o = r, r = \"\"), n.push(o);\n break;\n\n case \"\u0010\":\n r += e.substring(i, t), r += \"\\0\";\n break;\n\n case \"\u0011\":\n // The escape character can be used in the output to encode itself.\n r += e.substring(i, t + 1);\n break;\n\n default:\n fail();\n }\n i = t + 2;\n }\n return new ResourcePath(n);\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const M = [ \"userId\", \"batchId\" ];\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Name of the IndexedDb object store.\n *\n * Note that the name 'owner' is chosen to ensure backwards compatibility with\n * older clients that only supported single locked access to the persistence\n * layer.\n */\n/**\n * Creates a [userId, encodedPath] key for use in the DbDocumentMutations\n * index to iterate over all at document mutations for a given path or lower.\n */\nfunction __PRIVATE_newDbDocumentMutationPrefixForPath(e, t) {\n return [ e, __PRIVATE_encodeResourcePath(t) ];\n}\n\n/**\n * Creates a full index key of [userId, encodedPath, batchId] for inserting\n * and deleting into the DbDocumentMutations index.\n */ function __PRIVATE_newDbDocumentMutationKey(e, t, n) {\n return [ e, __PRIVATE_encodeResourcePath(t), n ];\n}\n\n/**\n * Because we store all the useful information for this store in the key,\n * there is no useful information to store as the value. The raw (unencoded)\n * path cannot be stored because IndexedDb doesn't store prototype\n * information.\n */ const x = {}, O = [ \"prefixPath\", \"collectionGroup\", \"readTime\", \"documentId\" ], N = [ \"prefixPath\", \"collectionGroup\", \"documentId\" ], L = [ \"collectionGroup\", \"readTime\", \"prefixPath\", \"documentId\" ], B = [ \"canonicalId\", \"targetId\" ], k = [ \"targetId\", \"path\" ], q = [ \"path\", \"targetId\" ], Q = [ \"collectionId\", \"parent\" ], K = [ \"indexId\", \"uid\" ], $ = [ \"uid\", \"sequenceNumber\" ], U = [ \"indexId\", \"uid\", \"arrayValue\", \"directionalValue\", \"orderedDocumentKey\", \"documentKey\" ], W = [ \"indexId\", \"uid\", \"orderedDocumentKey\" ], G = [ \"userId\", \"collectionPath\", \"documentId\" ], z = [ \"userId\", \"collectionPath\", \"largestBatchId\" ], j = [ \"userId\", \"collectionGroup\", \"largestBatchId\" ], H = [ ...[ ...[ ...[ ...[ \"mutationQueues\", \"mutations\", \"documentMutations\", \"remoteDocuments\", \"targets\", \"owner\", \"targetGlobal\", \"targetDocuments\" ], \"clientMetadata\" ], \"remoteDocumentGlobal\" ], \"collectionParents\" ], \"bundles\", \"namedQueries\" ], J = [ ...H, \"documentOverlays\" ], Y = [ \"mutationQueues\", \"mutations\", \"documentMutations\", \"remoteDocumentsV14\", \"targets\", \"owner\", \"targetGlobal\", \"targetDocuments\", \"clientMetadata\", \"remoteDocumentGlobal\", \"collectionParents\", \"bundles\", \"namedQueries\", \"documentOverlays\" ], Z = Y, X = [ ...Z, \"indexConfiguration\", \"indexState\", \"indexEntries\" ], ee = X, te = [ ...X, \"globals\" ];\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass __PRIVATE_IndexedDbTransaction extends PersistenceTransaction {\n constructor(e, t) {\n super(), this._e = e, this.currentSequenceNumber = t;\n }\n}\n\nfunction __PRIVATE_getStore(e, t) {\n const n = __PRIVATE_debugCast(e);\n return __PRIVATE_SimpleDb.F(n._e, t);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ function __PRIVATE_objectSize(e) {\n let t = 0;\n for (const n in e) Object.prototype.hasOwnProperty.call(e, n) && t++;\n return t;\n}\n\nfunction forEach(e, t) {\n for (const n in e) Object.prototype.hasOwnProperty.call(e, n) && t(n, e[n]);\n}\n\nfunction __PRIVATE_mapToArray(e, t) {\n const n = [];\n for (const r in e) Object.prototype.hasOwnProperty.call(e, r) && n.push(t(e[r], r, e));\n return n;\n}\n\nfunction isEmpty(e) {\n for (const t in e) if (Object.prototype.hasOwnProperty.call(e, t)) return !1;\n return !0;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// An immutable sorted map implementation, based on a Left-leaning Red-Black\n// tree.\nclass SortedMap {\n constructor(e, t) {\n this.comparator = e, this.root = t || LLRBNode.EMPTY;\n }\n // Returns a copy of the map, with the specified key/value added or replaced.\n insert(e, t) {\n return new SortedMap(this.comparator, this.root.insert(e, t, this.comparator).copy(null, null, LLRBNode.BLACK, null, null));\n }\n // Returns a copy of the map, with the specified key removed.\n remove(e) {\n return new SortedMap(this.comparator, this.root.remove(e, this.comparator).copy(null, null, LLRBNode.BLACK, null, null));\n }\n // Returns the value of the node with the given key, or null.\n get(e) {\n let t = this.root;\n for (;!t.isEmpty(); ) {\n const n = this.comparator(e, t.key);\n if (0 === n) return t.value;\n n < 0 ? t = t.left : n > 0 && (t = t.right);\n }\n return null;\n }\n // Returns the index of the element in this sorted map, or -1 if it doesn't\n // exist.\n indexOf(e) {\n // Number of nodes that were pruned when descending right\n let t = 0, n = this.root;\n for (;!n.isEmpty(); ) {\n const r = this.comparator(e, n.key);\n if (0 === r) return t + n.left.size;\n r < 0 ? n = n.left : (\n // Count all nodes left of the node plus the node itself\n t += n.left.size + 1, n = n.right);\n }\n // Node not found\n return -1;\n }\n isEmpty() {\n return this.root.isEmpty();\n }\n // Returns the total number of nodes in the map.\n get size() {\n return this.root.size;\n }\n // Returns the minimum key in the map.\n minKey() {\n return this.root.minKey();\n }\n // Returns the maximum key in the map.\n maxKey() {\n return this.root.maxKey();\n }\n // Traverses the map in key order and calls the specified action function\n // for each key/value pair. If action returns true, traversal is aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n inorderTraversal(e) {\n return this.root.inorderTraversal(e);\n }\n forEach(e) {\n this.inorderTraversal(((t, n) => (e(t, n), !1)));\n }\n toString() {\n const e = [];\n return this.inorderTraversal(((t, n) => (e.push(`${t}:${n}`), !1))), `{${e.join(\", \")}}`;\n }\n // Traverses the map in reverse key order and calls the specified action\n // function for each key/value pair. If action returns true, traversal is\n // aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n reverseTraversal(e) {\n return this.root.reverseTraversal(e);\n }\n // Returns an iterator over the SortedMap.\n getIterator() {\n return new SortedMapIterator(this.root, null, this.comparator, !1);\n }\n getIteratorFrom(e) {\n return new SortedMapIterator(this.root, e, this.comparator, !1);\n }\n getReverseIterator() {\n return new SortedMapIterator(this.root, null, this.comparator, !0);\n }\n getReverseIteratorFrom(e) {\n return new SortedMapIterator(this.root, e, this.comparator, !0);\n }\n}\n\n // end SortedMap\n// An iterator over an LLRBNode.\nclass SortedMapIterator {\n constructor(e, t, n, r) {\n this.isReverse = r, this.nodeStack = [];\n let i = 1;\n for (;!e.isEmpty(); ) if (i = t ? n(e.key, t) : 1, \n // flip the comparison if we're going in reverse\n t && r && (i *= -1), i < 0) \n // This node is less than our start key. ignore it\n e = this.isReverse ? e.left : e.right; else {\n if (0 === i) {\n // This node is exactly equal to our start key. Push it on the stack,\n // but stop iterating;\n this.nodeStack.push(e);\n break;\n }\n // This node is greater than our start key, add it to the stack and move\n // to the next one\n this.nodeStack.push(e), e = this.isReverse ? e.right : e.left;\n }\n }\n getNext() {\n let e = this.nodeStack.pop();\n const t = {\n key: e.key,\n value: e.value\n };\n if (this.isReverse) for (e = e.left; !e.isEmpty(); ) this.nodeStack.push(e), e = e.right; else for (e = e.right; !e.isEmpty(); ) this.nodeStack.push(e), \n e = e.left;\n return t;\n }\n hasNext() {\n return this.nodeStack.length > 0;\n }\n peek() {\n if (0 === this.nodeStack.length) return null;\n const e = this.nodeStack[this.nodeStack.length - 1];\n return {\n key: e.key,\n value: e.value\n };\n }\n}\n\n // end SortedMapIterator\n// Represents a node in a Left-leaning Red-Black tree.\nclass LLRBNode {\n constructor(e, t, n, r, i) {\n this.key = e, this.value = t, this.color = null != n ? n : LLRBNode.RED, this.left = null != r ? r : LLRBNode.EMPTY, \n this.right = null != i ? i : LLRBNode.EMPTY, this.size = this.left.size + 1 + this.right.size;\n }\n // Returns a copy of the current node, optionally replacing pieces of it.\n copy(e, t, n, r, i) {\n return new LLRBNode(null != e ? e : this.key, null != t ? t : this.value, null != n ? n : this.color, null != r ? r : this.left, null != i ? i : this.right);\n }\n isEmpty() {\n return !1;\n }\n // Traverses the tree in key order and calls the specified action function\n // for each node. If action returns true, traversal is aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n inorderTraversal(e) {\n return this.left.inorderTraversal(e) || e(this.key, this.value) || this.right.inorderTraversal(e);\n }\n // Traverses the tree in reverse key order and calls the specified action\n // function for each node. If action returns true, traversal is aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n reverseTraversal(e) {\n return this.right.reverseTraversal(e) || e(this.key, this.value) || this.left.reverseTraversal(e);\n }\n // Returns the minimum node in the tree.\n min() {\n return this.left.isEmpty() ? this : this.left.min();\n }\n // Returns the maximum key in the tree.\n minKey() {\n return this.min().key;\n }\n // Returns the maximum key in the tree.\n maxKey() {\n return this.right.isEmpty() ? this.key : this.right.maxKey();\n }\n // Returns new tree, with the key/value added.\n insert(e, t, n) {\n let r = this;\n const i = n(e, r.key);\n return r = i < 0 ? r.copy(null, null, null, r.left.insert(e, t, n), null) : 0 === i ? r.copy(null, t, null, null, null) : r.copy(null, null, null, null, r.right.insert(e, t, n)), \n r.fixUp();\n }\n removeMin() {\n if (this.left.isEmpty()) return LLRBNode.EMPTY;\n let e = this;\n return e.left.isRed() || e.left.left.isRed() || (e = e.moveRedLeft()), e = e.copy(null, null, null, e.left.removeMin(), null), \n e.fixUp();\n }\n // Returns new tree, with the specified item removed.\n remove(e, t) {\n let n, r = this;\n if (t(e, r.key) < 0) r.left.isEmpty() || r.left.isRed() || r.left.left.isRed() || (r = r.moveRedLeft()), \n r = r.copy(null, null, null, r.left.remove(e, t), null); else {\n if (r.left.isRed() && (r = r.rotateRight()), r.right.isEmpty() || r.right.isRed() || r.right.left.isRed() || (r = r.moveRedRight()), \n 0 === t(e, r.key)) {\n if (r.right.isEmpty()) return LLRBNode.EMPTY;\n n = r.right.min(), r = r.copy(n.key, n.value, null, null, r.right.removeMin());\n }\n r = r.copy(null, null, null, null, r.right.remove(e, t));\n }\n return r.fixUp();\n }\n isRed() {\n return this.color;\n }\n // Returns new tree after performing any needed rotations.\n fixUp() {\n let e = this;\n return e.right.isRed() && !e.left.isRed() && (e = e.rotateLeft()), e.left.isRed() && e.left.left.isRed() && (e = e.rotateRight()), \n e.left.isRed() && e.right.isRed() && (e = e.colorFlip()), e;\n }\n moveRedLeft() {\n let e = this.colorFlip();\n return e.right.left.isRed() && (e = e.copy(null, null, null, null, e.right.rotateRight()), \n e = e.rotateLeft(), e = e.colorFlip()), e;\n }\n moveRedRight() {\n let e = this.colorFlip();\n return e.left.left.isRed() && (e = e.rotateRight(), e = e.colorFlip()), e;\n }\n rotateLeft() {\n const e = this.copy(null, null, LLRBNode.RED, null, this.right.left);\n return this.right.copy(null, null, this.color, e, null);\n }\n rotateRight() {\n const e = this.copy(null, null, LLRBNode.RED, this.left.right, null);\n return this.left.copy(null, null, this.color, null, e);\n }\n colorFlip() {\n const e = this.left.copy(null, null, !this.left.color, null, null), t = this.right.copy(null, null, !this.right.color, null, null);\n return this.copy(null, null, !this.color, e, t);\n }\n // For testing.\n checkMaxDepth() {\n const e = this.check();\n return Math.pow(2, e) <= this.size + 1;\n }\n // In a balanced RB tree, the black-depth (number of black nodes) from root to\n // leaves is equal on both sides. This function verifies that or asserts.\n check() {\n if (this.isRed() && this.left.isRed()) throw fail();\n if (this.right.isRed()) throw fail();\n const e = this.left.check();\n if (e !== this.right.check()) throw fail();\n return e + (this.isRed() ? 0 : 1);\n }\n}\n\n // end LLRBNode\n// Empty node is shared between all LLRB trees.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nLLRBNode.EMPTY = null, LLRBNode.RED = !0, LLRBNode.BLACK = !1;\n\n// end LLRBEmptyNode\nLLRBNode.EMPTY = new \n// Represents an empty node (a leaf node in the Red-Black Tree).\nclass LLRBEmptyNode {\n constructor() {\n this.size = 0;\n }\n get key() {\n throw fail();\n }\n get value() {\n throw fail();\n }\n get color() {\n throw fail();\n }\n get left() {\n throw fail();\n }\n get right() {\n throw fail();\n }\n // Returns a copy of the current node.\n copy(e, t, n, r, i) {\n return this;\n }\n // Returns a copy of the tree, with the specified key/value added.\n insert(e, t, n) {\n return new LLRBNode(e, t);\n }\n // Returns a copy of the tree, with the specified key removed.\n remove(e, t) {\n return this;\n }\n isEmpty() {\n return !0;\n }\n inorderTraversal(e) {\n return !1;\n }\n reverseTraversal(e) {\n return !1;\n }\n minKey() {\n return null;\n }\n maxKey() {\n return null;\n }\n isRed() {\n return !1;\n }\n // For testing.\n checkMaxDepth() {\n return !0;\n }\n check() {\n return 0;\n }\n};\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * SortedSet is an immutable (copy-on-write) collection that holds elements\n * in order specified by the provided comparator.\n *\n * NOTE: if provided comparator returns 0 for two elements, we consider them to\n * be equal!\n */\nclass SortedSet {\n constructor(e) {\n this.comparator = e, this.data = new SortedMap(this.comparator);\n }\n has(e) {\n return null !== this.data.get(e);\n }\n first() {\n return this.data.minKey();\n }\n last() {\n return this.data.maxKey();\n }\n get size() {\n return this.data.size;\n }\n indexOf(e) {\n return this.data.indexOf(e);\n }\n /** Iterates elements in order defined by \"comparator\" */ forEach(e) {\n this.data.inorderTraversal(((t, n) => (e(t), !1)));\n }\n /** Iterates over `elem`s such that: range[0] <= elem < range[1]. */ forEachInRange(e, t) {\n const n = this.data.getIteratorFrom(e[0]);\n for (;n.hasNext(); ) {\n const r = n.getNext();\n if (this.comparator(r.key, e[1]) >= 0) return;\n t(r.key);\n }\n }\n /**\n * Iterates over `elem`s such that: start <= elem until false is returned.\n */ forEachWhile(e, t) {\n let n;\n for (n = void 0 !== t ? this.data.getIteratorFrom(t) : this.data.getIterator(); n.hasNext(); ) {\n if (!e(n.getNext().key)) return;\n }\n }\n /** Finds the least element greater than or equal to `elem`. */ firstAfterOrEqual(e) {\n const t = this.data.getIteratorFrom(e);\n return t.hasNext() ? t.getNext().key : null;\n }\n getIterator() {\n return new SortedSetIterator(this.data.getIterator());\n }\n getIteratorFrom(e) {\n return new SortedSetIterator(this.data.getIteratorFrom(e));\n }\n /** Inserts or updates an element */ add(e) {\n return this.copy(this.data.remove(e).insert(e, !0));\n }\n /** Deletes an element */ delete(e) {\n return this.has(e) ? this.copy(this.data.remove(e)) : this;\n }\n isEmpty() {\n return this.data.isEmpty();\n }\n unionWith(e) {\n let t = this;\n // Make sure `result` always refers to the larger one of the two sets.\n return t.size < e.size && (t = e, e = this), e.forEach((e => {\n t = t.add(e);\n })), t;\n }\n isEqual(e) {\n if (!(e instanceof SortedSet)) return !1;\n if (this.size !== e.size) return !1;\n const t = this.data.getIterator(), n = e.data.getIterator();\n for (;t.hasNext(); ) {\n const e = t.getNext().key, r = n.getNext().key;\n if (0 !== this.comparator(e, r)) return !1;\n }\n return !0;\n }\n toArray() {\n const e = [];\n return this.forEach((t => {\n e.push(t);\n })), e;\n }\n toString() {\n const e = [];\n return this.forEach((t => e.push(t))), \"SortedSet(\" + e.toString() + \")\";\n }\n copy(e) {\n const t = new SortedSet(this.comparator);\n return t.data = e, t;\n }\n}\n\nclass SortedSetIterator {\n constructor(e) {\n this.iter = e;\n }\n getNext() {\n return this.iter.getNext().key;\n }\n hasNext() {\n return this.iter.hasNext();\n }\n}\n\n/**\n * Compares two sorted sets for equality using their natural ordering. The\n * method computes the intersection and invokes `onAdd` for every element that\n * is in `after` but not `before`. `onRemove` is invoked for every element in\n * `before` but missing from `after`.\n *\n * The method creates a copy of both `before` and `after` and runs in O(n log\n * n), where n is the size of the two lists.\n *\n * @param before - The elements that exist in the original set.\n * @param after - The elements to diff against the original set.\n * @param comparator - The comparator for the elements in before and after.\n * @param onAdd - A function to invoke for every element that is part of `\n * after` but not `before`.\n * @param onRemove - A function to invoke for every element that is part of\n * `before` but not `after`.\n */\n/**\n * Returns the next element from the iterator or `undefined` if none available.\n */\nfunction __PRIVATE_advanceIterator(e) {\n return e.hasNext() ? e.getNext() : void 0;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Provides a set of fields that can be used to partially patch a document.\n * FieldMask is used in conjunction with ObjectValue.\n * Examples:\n * foo - Overwrites foo entirely with the provided value. If foo is not\n * present in the companion ObjectValue, the field is deleted.\n * foo.bar - Overwrites only the field bar of the object foo.\n * If foo is not an object, foo is replaced with an object\n * containing foo\n */ class FieldMask {\n constructor(e) {\n this.fields = e, \n // TODO(dimond): validation of FieldMask\n // Sort the field mask to support `FieldMask.isEqual()` and assert below.\n e.sort(FieldPath$1.comparator);\n }\n static empty() {\n return new FieldMask([]);\n }\n /**\n * Returns a new FieldMask object that is the result of adding all the given\n * fields paths to this field mask.\n */ unionWith(e) {\n let t = new SortedSet(FieldPath$1.comparator);\n for (const e of this.fields) t = t.add(e);\n for (const n of e) t = t.add(n);\n return new FieldMask(t.toArray());\n }\n /**\n * Verifies that `fieldPath` is included by at least one field in this field\n * mask.\n *\n * This is an O(n) operation, where `n` is the size of the field mask.\n */ covers(e) {\n for (const t of this.fields) if (t.isPrefixOf(e)) return !0;\n return !1;\n }\n isEqual(e) {\n return __PRIVATE_arrayEquals(this.fields, e.fields, ((e, t) => e.isEqual(t)));\n }\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An error encountered while decoding base64 string.\n */ class __PRIVATE_Base64DecodeError extends Error {\n constructor() {\n super(...arguments), this.name = \"Base64DecodeError\";\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Converts a Base64 encoded string to a binary string. */\n/** True if and only if the Base64 conversion functions are available. */\nfunction __PRIVATE_isBase64Available() {\n return \"undefined\" != typeof atob;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Immutable class that represents a \"proto\" byte string.\n *\n * Proto byte strings can either be Base64-encoded strings or Uint8Arrays when\n * sent on the wire. This class abstracts away this differentiation by holding\n * the proto byte string in a common class that must be converted into a string\n * before being sent as a proto.\n * @internal\n */ class ByteString {\n constructor(e) {\n this.binaryString = e;\n }\n static fromBase64String(e) {\n const t = function __PRIVATE_decodeBase64(e) {\n try {\n return atob(e);\n } catch (e) {\n // Check that `DOMException` is defined before using it to avoid\n // \"ReferenceError: Property 'DOMException' doesn't exist\" in react-native.\n // (https://github.com/firebase/firebase-js-sdk/issues/7115)\n throw \"undefined\" != typeof DOMException && e instanceof DOMException ? new __PRIVATE_Base64DecodeError(\"Invalid base64 string: \" + e) : e;\n }\n }\n /** Converts a binary string to a Base64 encoded string. */ (e);\n return new ByteString(t);\n }\n static fromUint8Array(e) {\n // TODO(indexing); Remove the copy of the byte string here as this method\n // is frequently called during indexing.\n const t = \n /**\n * Helper function to convert an Uint8array to a binary string.\n */\n function __PRIVATE_binaryStringFromUint8Array(e) {\n let t = \"\";\n for (let n = 0; n < e.length; ++n) t += String.fromCharCode(e[n]);\n return t;\n }\n /**\n * Helper function to convert a binary string to an Uint8Array.\n */ (e);\n return new ByteString(t);\n }\n [Symbol.iterator]() {\n let e = 0;\n return {\n next: () => e < this.binaryString.length ? {\n value: this.binaryString.charCodeAt(e++),\n done: !1\n } : {\n value: void 0,\n done: !0\n }\n };\n }\n toBase64() {\n return function __PRIVATE_encodeBase64(e) {\n return btoa(e);\n }(this.binaryString);\n }\n toUint8Array() {\n return function __PRIVATE_uint8ArrayFromBinaryString(e) {\n const t = new Uint8Array(e.length);\n for (let n = 0; n < e.length; n++) t[n] = e.charCodeAt(n);\n return t;\n }\n /**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n // A RegExp matching ISO 8601 UTC timestamps with optional fraction.\n (this.binaryString);\n }\n approximateByteSize() {\n return 2 * this.binaryString.length;\n }\n compareTo(e) {\n return __PRIVATE_primitiveComparator(this.binaryString, e.binaryString);\n }\n isEqual(e) {\n return this.binaryString === e.binaryString;\n }\n}\n\nByteString.EMPTY_BYTE_STRING = new ByteString(\"\");\n\nconst ne = new RegExp(/^\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(?:\\.(\\d+))?Z$/);\n\n/**\n * Converts the possible Proto values for a timestamp value into a \"seconds and\n * nanos\" representation.\n */ function __PRIVATE_normalizeTimestamp(e) {\n // The json interface (for the browser) will return an iso timestamp string,\n // while the proto js library (for node) will return a\n // google.protobuf.Timestamp instance.\n if (__PRIVATE_hardAssert(!!e), \"string\" == typeof e) {\n // The date string can have higher precision (nanos) than the Date class\n // (millis), so we do some custom parsing here.\n // Parse the nanos right out of the string.\n let t = 0;\n const n = ne.exec(e);\n if (__PRIVATE_hardAssert(!!n), n[1]) {\n // Pad the fraction out to 9 digits (nanos).\n let e = n[1];\n e = (e + \"000000000\").substr(0, 9), t = Number(e);\n }\n // Parse the date to get the seconds.\n const r = new Date(e);\n return {\n seconds: Math.floor(r.getTime() / 1e3),\n nanos: t\n };\n }\n return {\n seconds: __PRIVATE_normalizeNumber(e.seconds),\n nanos: __PRIVATE_normalizeNumber(e.nanos)\n };\n}\n\n/**\n * Converts the possible Proto types for numbers into a JavaScript number.\n * Returns 0 if the value is not numeric.\n */ function __PRIVATE_normalizeNumber(e) {\n // TODO(bjornick): Handle int64 greater than 53 bits.\n return \"number\" == typeof e ? e : \"string\" == typeof e ? Number(e) : 0;\n}\n\n/** Converts the possible Proto types for Blobs into a ByteString. */ function __PRIVATE_normalizeByteString(e) {\n return \"string\" == typeof e ? ByteString.fromBase64String(e) : ByteString.fromUint8Array(e);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents a locally-applied ServerTimestamp.\n *\n * Server Timestamps are backed by MapValues that contain an internal field\n * `__type__` with a value of `server_timestamp`. The previous value and local\n * write time are stored in its `__previous_value__` and `__local_write_time__`\n * fields respectively.\n *\n * Notes:\n * - ServerTimestampValue instances are created as the result of applying a\n * transform. They can only exist in the local view of a document. Therefore\n * they do not need to be parsed or serialized.\n * - When evaluated locally (e.g. for snapshot.data()), they by default\n * evaluate to `null`. This behavior can be configured by passing custom\n * FieldValueOptions to value().\n * - With respect to other ServerTimestampValues, they sort by their\n * localWriteTime.\n */ function __PRIVATE_isServerTimestamp(e) {\n var t, n;\n return \"server_timestamp\" === (null === (n = ((null === (t = null == e ? void 0 : e.mapValue) || void 0 === t ? void 0 : t.fields) || {}).__type__) || void 0 === n ? void 0 : n.stringValue);\n}\n\n/**\n * Creates a new ServerTimestamp proto value (using the internal format).\n */\n/**\n * Returns the value of the field before this ServerTimestamp was set.\n *\n * Preserving the previous values allows the user to display the last resoled\n * value until the backend responds with the timestamp.\n */\nfunction __PRIVATE_getPreviousValue(e) {\n const t = e.mapValue.fields.__previous_value__;\n return __PRIVATE_isServerTimestamp(t) ? __PRIVATE_getPreviousValue(t) : t;\n}\n\n/**\n * Returns the local time at which this timestamp was first set.\n */ function __PRIVATE_getLocalWriteTime(e) {\n const t = __PRIVATE_normalizeTimestamp(e.mapValue.fields.__local_write_time__.timestampValue);\n return new Timestamp(t.seconds, t.nanos);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class DatabaseInfo {\n /**\n * Constructs a DatabaseInfo using the provided host, databaseId and\n * persistenceKey.\n *\n * @param databaseId - The database to use.\n * @param appId - The Firebase App Id.\n * @param persistenceKey - A unique identifier for this Firestore's local\n * storage (used in conjunction with the databaseId).\n * @param host - The Firestore backend host to connect to.\n * @param ssl - Whether to use SSL when connecting.\n * @param forceLongPolling - Whether to use the forceLongPolling option\n * when using WebChannel as the network transport.\n * @param autoDetectLongPolling - Whether to use the detectBufferingProxy\n * option when using WebChannel as the network transport.\n * @param longPollingOptions Options that configure long-polling.\n * @param useFetchStreams Whether to use the Fetch API instead of\n * XMLHTTPRequest\n */\n constructor(e, t, n, r, i, s, o, _, a) {\n this.databaseId = e, this.appId = t, this.persistenceKey = n, this.host = r, this.ssl = i, \n this.forceLongPolling = s, this.autoDetectLongPolling = o, this.longPollingOptions = _, \n this.useFetchStreams = a;\n }\n}\n\n/** The default database name for a project. */\n/**\n * Represents the database ID a Firestore client is associated with.\n * @internal\n */\nclass DatabaseId {\n constructor(e, t) {\n this.projectId = e, this.database = t || \"(default)\";\n }\n static empty() {\n return new DatabaseId(\"\", \"\");\n }\n get isDefaultDatabase() {\n return \"(default)\" === this.database;\n }\n isEqual(e) {\n return e instanceof DatabaseId && e.projectId === this.projectId && e.database === this.database;\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst re = {\n mapValue: {\n fields: {\n __type__: {\n stringValue: \"__max__\"\n }\n }\n }\n}, ie = {\n nullValue: \"NULL_VALUE\"\n};\n\n/** Extracts the backend's type order for the provided value. */\nfunction __PRIVATE_typeOrder(e) {\n return \"nullValue\" in e ? 0 /* TypeOrder.NullValue */ : \"booleanValue\" in e ? 1 /* TypeOrder.BooleanValue */ : \"integerValue\" in e || \"doubleValue\" in e ? 2 /* TypeOrder.NumberValue */ : \"timestampValue\" in e ? 3 /* TypeOrder.TimestampValue */ : \"stringValue\" in e ? 5 /* TypeOrder.StringValue */ : \"bytesValue\" in e ? 6 /* TypeOrder.BlobValue */ : \"referenceValue\" in e ? 7 /* TypeOrder.RefValue */ : \"geoPointValue\" in e ? 8 /* TypeOrder.GeoPointValue */ : \"arrayValue\" in e ? 9 /* TypeOrder.ArrayValue */ : \"mapValue\" in e ? __PRIVATE_isServerTimestamp(e) ? 4 /* TypeOrder.ServerTimestampValue */ : __PRIVATE_isMaxValue(e) ? 9007199254740991 /* TypeOrder.MaxValue */ : __PRIVATE_isVectorValue(e) ? 10 /* TypeOrder.VectorValue */ : 11 /* TypeOrder.ObjectValue */ : fail();\n}\n\n/** Tests `left` and `right` for equality based on the backend semantics. */ function __PRIVATE_valueEquals(e, t) {\n if (e === t) return !0;\n const n = __PRIVATE_typeOrder(e);\n if (n !== __PRIVATE_typeOrder(t)) return !1;\n switch (n) {\n case 0 /* TypeOrder.NullValue */ :\n case 9007199254740991 /* TypeOrder.MaxValue */ :\n return !0;\n\n case 1 /* TypeOrder.BooleanValue */ :\n return e.booleanValue === t.booleanValue;\n\n case 4 /* TypeOrder.ServerTimestampValue */ :\n return __PRIVATE_getLocalWriteTime(e).isEqual(__PRIVATE_getLocalWriteTime(t));\n\n case 3 /* TypeOrder.TimestampValue */ :\n return function __PRIVATE_timestampEquals(e, t) {\n if (\"string\" == typeof e.timestampValue && \"string\" == typeof t.timestampValue && e.timestampValue.length === t.timestampValue.length) \n // Use string equality for ISO 8601 timestamps\n return e.timestampValue === t.timestampValue;\n const n = __PRIVATE_normalizeTimestamp(e.timestampValue), r = __PRIVATE_normalizeTimestamp(t.timestampValue);\n return n.seconds === r.seconds && n.nanos === r.nanos;\n }(e, t);\n\n case 5 /* TypeOrder.StringValue */ :\n return e.stringValue === t.stringValue;\n\n case 6 /* TypeOrder.BlobValue */ :\n return function __PRIVATE_blobEquals(e, t) {\n return __PRIVATE_normalizeByteString(e.bytesValue).isEqual(__PRIVATE_normalizeByteString(t.bytesValue));\n }(e, t);\n\n case 7 /* TypeOrder.RefValue */ :\n return e.referenceValue === t.referenceValue;\n\n case 8 /* TypeOrder.GeoPointValue */ :\n return function __PRIVATE_geoPointEquals(e, t) {\n return __PRIVATE_normalizeNumber(e.geoPointValue.latitude) === __PRIVATE_normalizeNumber(t.geoPointValue.latitude) && __PRIVATE_normalizeNumber(e.geoPointValue.longitude) === __PRIVATE_normalizeNumber(t.geoPointValue.longitude);\n }(e, t);\n\n case 2 /* TypeOrder.NumberValue */ :\n return function __PRIVATE_numberEquals(e, t) {\n if (\"integerValue\" in e && \"integerValue\" in t) return __PRIVATE_normalizeNumber(e.integerValue) === __PRIVATE_normalizeNumber(t.integerValue);\n if (\"doubleValue\" in e && \"doubleValue\" in t) {\n const n = __PRIVATE_normalizeNumber(e.doubleValue), r = __PRIVATE_normalizeNumber(t.doubleValue);\n return n === r ? __PRIVATE_isNegativeZero(n) === __PRIVATE_isNegativeZero(r) : isNaN(n) && isNaN(r);\n }\n return !1;\n }(e, t);\n\n case 9 /* TypeOrder.ArrayValue */ :\n return __PRIVATE_arrayEquals(e.arrayValue.values || [], t.arrayValue.values || [], __PRIVATE_valueEquals);\n\n case 10 /* TypeOrder.VectorValue */ :\n case 11 /* TypeOrder.ObjectValue */ :\n return function __PRIVATE_objectEquals(e, t) {\n const n = e.mapValue.fields || {}, r = t.mapValue.fields || {};\n if (__PRIVATE_objectSize(n) !== __PRIVATE_objectSize(r)) return !1;\n for (const e in n) if (n.hasOwnProperty(e) && (void 0 === r[e] || !__PRIVATE_valueEquals(n[e], r[e]))) return !1;\n return !0;\n }\n /** Returns true if the ArrayValue contains the specified element. */ (e, t);\n\n default:\n return fail();\n }\n}\n\nfunction __PRIVATE_arrayValueContains(e, t) {\n return void 0 !== (e.values || []).find((e => __PRIVATE_valueEquals(e, t)));\n}\n\nfunction __PRIVATE_valueCompare(e, t) {\n if (e === t) return 0;\n const n = __PRIVATE_typeOrder(e), r = __PRIVATE_typeOrder(t);\n if (n !== r) return __PRIVATE_primitiveComparator(n, r);\n switch (n) {\n case 0 /* TypeOrder.NullValue */ :\n case 9007199254740991 /* TypeOrder.MaxValue */ :\n return 0;\n\n case 1 /* TypeOrder.BooleanValue */ :\n return __PRIVATE_primitiveComparator(e.booleanValue, t.booleanValue);\n\n case 2 /* TypeOrder.NumberValue */ :\n return function __PRIVATE_compareNumbers(e, t) {\n const n = __PRIVATE_normalizeNumber(e.integerValue || e.doubleValue), r = __PRIVATE_normalizeNumber(t.integerValue || t.doubleValue);\n return n < r ? -1 : n > r ? 1 : n === r ? 0 : \n // one or both are NaN.\n isNaN(n) ? isNaN(r) ? 0 : -1 : 1;\n }(e, t);\n\n case 3 /* TypeOrder.TimestampValue */ :\n return __PRIVATE_compareTimestamps(e.timestampValue, t.timestampValue);\n\n case 4 /* TypeOrder.ServerTimestampValue */ :\n return __PRIVATE_compareTimestamps(__PRIVATE_getLocalWriteTime(e), __PRIVATE_getLocalWriteTime(t));\n\n case 5 /* TypeOrder.StringValue */ :\n return __PRIVATE_primitiveComparator(e.stringValue, t.stringValue);\n\n case 6 /* TypeOrder.BlobValue */ :\n return function __PRIVATE_compareBlobs(e, t) {\n const n = __PRIVATE_normalizeByteString(e), r = __PRIVATE_normalizeByteString(t);\n return n.compareTo(r);\n }(e.bytesValue, t.bytesValue);\n\n case 7 /* TypeOrder.RefValue */ :\n return function __PRIVATE_compareReferences(e, t) {\n const n = e.split(\"/\"), r = t.split(\"/\");\n for (let e = 0; e < n.length && e < r.length; e++) {\n const t = __PRIVATE_primitiveComparator(n[e], r[e]);\n if (0 !== t) return t;\n }\n return __PRIVATE_primitiveComparator(n.length, r.length);\n }(e.referenceValue, t.referenceValue);\n\n case 8 /* TypeOrder.GeoPointValue */ :\n return function __PRIVATE_compareGeoPoints(e, t) {\n const n = __PRIVATE_primitiveComparator(__PRIVATE_normalizeNumber(e.latitude), __PRIVATE_normalizeNumber(t.latitude));\n if (0 !== n) return n;\n return __PRIVATE_primitiveComparator(__PRIVATE_normalizeNumber(e.longitude), __PRIVATE_normalizeNumber(t.longitude));\n }(e.geoPointValue, t.geoPointValue);\n\n case 9 /* TypeOrder.ArrayValue */ :\n return __PRIVATE_compareArrays(e.arrayValue, t.arrayValue);\n\n case 10 /* TypeOrder.VectorValue */ :\n return function __PRIVATE_compareVectors(e, t) {\n var n, r, i, s;\n const o = e.fields || {}, _ = t.fields || {}, a = null === (n = o.value) || void 0 === n ? void 0 : n.arrayValue, u = null === (r = _.value) || void 0 === r ? void 0 : r.arrayValue, c = __PRIVATE_primitiveComparator((null === (i = null == a ? void 0 : a.values) || void 0 === i ? void 0 : i.length) || 0, (null === (s = null == u ? void 0 : u.values) || void 0 === s ? void 0 : s.length) || 0);\n if (0 !== c) return c;\n return __PRIVATE_compareArrays(a, u);\n }(e.mapValue, t.mapValue);\n\n case 11 /* TypeOrder.ObjectValue */ :\n return function __PRIVATE_compareMaps(e, t) {\n if (e === re.mapValue && t === re.mapValue) return 0;\n if (e === re.mapValue) return 1;\n if (t === re.mapValue) return -1;\n const n = e.fields || {}, r = Object.keys(n), i = t.fields || {}, s = Object.keys(i);\n // Even though MapValues are likely sorted correctly based on their insertion\n // order (e.g. when received from the backend), local modifications can bring\n // elements out of order. We need to re-sort the elements to ensure that\n // canonical IDs are independent of insertion order.\n r.sort(), s.sort();\n for (let e = 0; e < r.length && e < s.length; ++e) {\n const t = __PRIVATE_primitiveComparator(r[e], s[e]);\n if (0 !== t) return t;\n const o = __PRIVATE_valueCompare(n[r[e]], i[s[e]]);\n if (0 !== o) return o;\n }\n return __PRIVATE_primitiveComparator(r.length, s.length);\n }\n /**\n * Generates the canonical ID for the provided field value (as used in Target\n * serialization).\n */ (e.mapValue, t.mapValue);\n\n default:\n throw fail();\n }\n}\n\nfunction __PRIVATE_compareTimestamps(e, t) {\n if (\"string\" == typeof e && \"string\" == typeof t && e.length === t.length) return __PRIVATE_primitiveComparator(e, t);\n const n = __PRIVATE_normalizeTimestamp(e), r = __PRIVATE_normalizeTimestamp(t), i = __PRIVATE_primitiveComparator(n.seconds, r.seconds);\n return 0 !== i ? i : __PRIVATE_primitiveComparator(n.nanos, r.nanos);\n}\n\nfunction __PRIVATE_compareArrays(e, t) {\n const n = e.values || [], r = t.values || [];\n for (let e = 0; e < n.length && e < r.length; ++e) {\n const t = __PRIVATE_valueCompare(n[e], r[e]);\n if (t) return t;\n }\n return __PRIVATE_primitiveComparator(n.length, r.length);\n}\n\nfunction canonicalId(e) {\n return __PRIVATE_canonifyValue(e);\n}\n\nfunction __PRIVATE_canonifyValue(e) {\n return \"nullValue\" in e ? \"null\" : \"booleanValue\" in e ? \"\" + e.booleanValue : \"integerValue\" in e ? \"\" + e.integerValue : \"doubleValue\" in e ? \"\" + e.doubleValue : \"timestampValue\" in e ? function __PRIVATE_canonifyTimestamp(e) {\n const t = __PRIVATE_normalizeTimestamp(e);\n return `time(${t.seconds},${t.nanos})`;\n }(e.timestampValue) : \"stringValue\" in e ? e.stringValue : \"bytesValue\" in e ? function __PRIVATE_canonifyByteString(e) {\n return __PRIVATE_normalizeByteString(e).toBase64();\n }(e.bytesValue) : \"referenceValue\" in e ? function __PRIVATE_canonifyReference(e) {\n return DocumentKey.fromName(e).toString();\n }(e.referenceValue) : \"geoPointValue\" in e ? function __PRIVATE_canonifyGeoPoint(e) {\n return `geo(${e.latitude},${e.longitude})`;\n }(e.geoPointValue) : \"arrayValue\" in e ? function __PRIVATE_canonifyArray(e) {\n let t = \"[\", n = !0;\n for (const r of e.values || []) n ? n = !1 : t += \",\", t += __PRIVATE_canonifyValue(r);\n return t + \"]\";\n }\n /**\n * Returns an approximate (and wildly inaccurate) in-memory size for the field\n * value.\n *\n * The memory size takes into account only the actual user data as it resides\n * in memory and ignores object overhead.\n */ (e.arrayValue) : \"mapValue\" in e ? function __PRIVATE_canonifyMap(e) {\n // Iteration order in JavaScript is not guaranteed. To ensure that we generate\n // matching canonical IDs for identical maps, we need to sort the keys.\n const t = Object.keys(e.fields || {}).sort();\n let n = \"{\", r = !0;\n for (const i of t) r ? r = !1 : n += \",\", n += `${i}:${__PRIVATE_canonifyValue(e.fields[i])}`;\n return n + \"}\";\n }(e.mapValue) : fail();\n}\n\nfunction __PRIVATE_estimateByteSize(e) {\n switch (__PRIVATE_typeOrder(e)) {\n case 0 /* TypeOrder.NullValue */ :\n case 1 /* TypeOrder.BooleanValue */ :\n return 4;\n\n case 2 /* TypeOrder.NumberValue */ :\n return 8;\n\n case 3 /* TypeOrder.TimestampValue */ :\n case 8 /* TypeOrder.GeoPointValue */ :\n // GeoPoints are made up of two distinct numbers (latitude + longitude)\n return 16;\n\n case 4 /* TypeOrder.ServerTimestampValue */ :\n const t = __PRIVATE_getPreviousValue(e);\n return t ? 16 + __PRIVATE_estimateByteSize(t) : 16;\n\n case 5 /* TypeOrder.StringValue */ :\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures:\n // \"JavaScript's String type is [...] a set of elements of 16-bit unsigned\n // integer values\"\n return 2 * e.stringValue.length;\n\n case 6 /* TypeOrder.BlobValue */ :\n return __PRIVATE_normalizeByteString(e.bytesValue).approximateByteSize();\n\n case 7 /* TypeOrder.RefValue */ :\n return e.referenceValue.length;\n\n case 9 /* TypeOrder.ArrayValue */ :\n return function __PRIVATE_estimateArrayByteSize(e) {\n return (e.values || []).reduce(((e, t) => e + __PRIVATE_estimateByteSize(t)), 0);\n }\n /** Returns a reference value for the provided database and key. */ (e.arrayValue);\n\n case 10 /* TypeOrder.VectorValue */ :\n case 11 /* TypeOrder.ObjectValue */ :\n return function __PRIVATE_estimateMapByteSize(e) {\n let t = 0;\n return forEach(e.fields, ((e, n) => {\n t += e.length + __PRIVATE_estimateByteSize(n);\n })), t;\n }(e.mapValue);\n\n default:\n throw fail();\n }\n}\n\nfunction __PRIVATE_refValue(e, t) {\n return {\n referenceValue: `projects/${e.projectId}/databases/${e.database}/documents/${t.path.canonicalString()}`\n };\n}\n\n/** Returns true if `value` is an IntegerValue . */ function isInteger(e) {\n return !!e && \"integerValue\" in e;\n}\n\n/** Returns true if `value` is a DoubleValue. */\n/** Returns true if `value` is an ArrayValue. */\nfunction isArray(e) {\n return !!e && \"arrayValue\" in e;\n}\n\n/** Returns true if `value` is a NullValue. */ function __PRIVATE_isNullValue(e) {\n return !!e && \"nullValue\" in e;\n}\n\n/** Returns true if `value` is NaN. */ function __PRIVATE_isNanValue(e) {\n return !!e && \"doubleValue\" in e && isNaN(Number(e.doubleValue));\n}\n\n/** Returns true if `value` is a MapValue. */ function __PRIVATE_isMapValue(e) {\n return !!e && \"mapValue\" in e;\n}\n\n/** Returns true if `value` is a VetorValue. */ function __PRIVATE_isVectorValue(e) {\n var t, n;\n return \"__vector__\" === (null === (n = ((null === (t = null == e ? void 0 : e.mapValue) || void 0 === t ? void 0 : t.fields) || {}).__type__) || void 0 === n ? void 0 : n.stringValue);\n}\n\n/** Creates a deep copy of `source`. */ function __PRIVATE_deepClone(e) {\n if (e.geoPointValue) return {\n geoPointValue: Object.assign({}, e.geoPointValue)\n };\n if (e.timestampValue && \"object\" == typeof e.timestampValue) return {\n timestampValue: Object.assign({}, e.timestampValue)\n };\n if (e.mapValue) {\n const t = {\n mapValue: {\n fields: {}\n }\n };\n return forEach(e.mapValue.fields, ((e, n) => t.mapValue.fields[e] = __PRIVATE_deepClone(n))), \n t;\n }\n if (e.arrayValue) {\n const t = {\n arrayValue: {\n values: []\n }\n };\n for (let n = 0; n < (e.arrayValue.values || []).length; ++n) t.arrayValue.values[n] = __PRIVATE_deepClone(e.arrayValue.values[n]);\n return t;\n }\n return Object.assign({}, e);\n}\n\n/** Returns true if the Value represents the canonical {@link #MAX_VALUE} . */ function __PRIVATE_isMaxValue(e) {\n return \"__max__\" === (((e.mapValue || {}).fields || {}).__type__ || {}).stringValue;\n}\n\nconst se = {\n mapValue: {\n fields: {\n __type__: {\n stringValue: \"__vector__\"\n },\n value: {\n arrayValue: {}\n }\n }\n }\n};\n\n/** Returns the lowest value for the given value type (inclusive). */ function __PRIVATE_valuesGetLowerBound(e) {\n return \"nullValue\" in e ? ie : \"booleanValue\" in e ? {\n booleanValue: !1\n } : \"integerValue\" in e || \"doubleValue\" in e ? {\n doubleValue: NaN\n } : \"timestampValue\" in e ? {\n timestampValue: {\n seconds: Number.MIN_SAFE_INTEGER\n }\n } : \"stringValue\" in e ? {\n stringValue: \"\"\n } : \"bytesValue\" in e ? {\n bytesValue: \"\"\n } : \"referenceValue\" in e ? __PRIVATE_refValue(DatabaseId.empty(), DocumentKey.empty()) : \"geoPointValue\" in e ? {\n geoPointValue: {\n latitude: -90,\n longitude: -180\n }\n } : \"arrayValue\" in e ? {\n arrayValue: {}\n } : \"mapValue\" in e ? __PRIVATE_isVectorValue(e) ? se : {\n mapValue: {}\n } : fail();\n}\n\n/** Returns the largest value for the given value type (exclusive). */ function __PRIVATE_valuesGetUpperBound(e) {\n return \"nullValue\" in e ? {\n booleanValue: !1\n } : \"booleanValue\" in e ? {\n doubleValue: NaN\n } : \"integerValue\" in e || \"doubleValue\" in e ? {\n timestampValue: {\n seconds: Number.MIN_SAFE_INTEGER\n }\n } : \"timestampValue\" in e ? {\n stringValue: \"\"\n } : \"stringValue\" in e ? {\n bytesValue: \"\"\n } : \"bytesValue\" in e ? __PRIVATE_refValue(DatabaseId.empty(), DocumentKey.empty()) : \"referenceValue\" in e ? {\n geoPointValue: {\n latitude: -90,\n longitude: -180\n }\n } : \"geoPointValue\" in e ? {\n arrayValue: {}\n } : \"arrayValue\" in e ? se : \"mapValue\" in e ? __PRIVATE_isVectorValue(e) ? {\n mapValue: {}\n } : re : fail();\n}\n\nfunction __PRIVATE_lowerBoundCompare(e, t) {\n const n = __PRIVATE_valueCompare(e.value, t.value);\n return 0 !== n ? n : e.inclusive && !t.inclusive ? -1 : !e.inclusive && t.inclusive ? 1 : 0;\n}\n\nfunction __PRIVATE_upperBoundCompare(e, t) {\n const n = __PRIVATE_valueCompare(e.value, t.value);\n return 0 !== n ? n : e.inclusive && !t.inclusive ? 1 : !e.inclusive && t.inclusive ? -1 : 0;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An ObjectValue represents a MapValue in the Firestore Proto and offers the\n * ability to add and remove fields (via the ObjectValueBuilder).\n */ class ObjectValue {\n constructor(e) {\n this.value = e;\n }\n static empty() {\n return new ObjectValue({\n mapValue: {}\n });\n }\n /**\n * Returns the value at the given path or null.\n *\n * @param path - the path to search\n * @returns The value at the path or null if the path is not set.\n */ field(e) {\n if (e.isEmpty()) return this.value;\n {\n let t = this.value;\n for (let n = 0; n < e.length - 1; ++n) if (t = (t.mapValue.fields || {})[e.get(n)], \n !__PRIVATE_isMapValue(t)) return null;\n return t = (t.mapValue.fields || {})[e.lastSegment()], t || null;\n }\n }\n /**\n * Sets the field to the provided value.\n *\n * @param path - The field path to set.\n * @param value - The value to set.\n */ set(e, t) {\n this.getFieldsMap(e.popLast())[e.lastSegment()] = __PRIVATE_deepClone(t);\n }\n /**\n * Sets the provided fields to the provided values.\n *\n * @param data - A map of fields to values (or null for deletes).\n */ setAll(e) {\n let t = FieldPath$1.emptyPath(), n = {}, r = [];\n e.forEach(((e, i) => {\n if (!t.isImmediateParentOf(i)) {\n // Insert the accumulated changes at this parent location\n const e = this.getFieldsMap(t);\n this.applyChanges(e, n, r), n = {}, r = [], t = i.popLast();\n }\n e ? n[i.lastSegment()] = __PRIVATE_deepClone(e) : r.push(i.lastSegment());\n }));\n const i = this.getFieldsMap(t);\n this.applyChanges(i, n, r);\n }\n /**\n * Removes the field at the specified path. If there is no field at the\n * specified path, nothing is changed.\n *\n * @param path - The field path to remove.\n */ delete(e) {\n const t = this.field(e.popLast());\n __PRIVATE_isMapValue(t) && t.mapValue.fields && delete t.mapValue.fields[e.lastSegment()];\n }\n isEqual(e) {\n return __PRIVATE_valueEquals(this.value, e.value);\n }\n /**\n * Returns the map that contains the leaf element of `path`. If the parent\n * entry does not yet exist, or if it is not a map, a new map will be created.\n */ getFieldsMap(e) {\n let t = this.value;\n t.mapValue.fields || (t.mapValue = {\n fields: {}\n });\n for (let n = 0; n < e.length; ++n) {\n let r = t.mapValue.fields[e.get(n)];\n __PRIVATE_isMapValue(r) && r.mapValue.fields || (r = {\n mapValue: {\n fields: {}\n }\n }, t.mapValue.fields[e.get(n)] = r), t = r;\n }\n return t.mapValue.fields;\n }\n /**\n * Modifies `fieldsMap` by adding, replacing or deleting the specified\n * entries.\n */ applyChanges(e, t, n) {\n forEach(t, ((t, n) => e[t] = n));\n for (const t of n) delete e[t];\n }\n clone() {\n return new ObjectValue(__PRIVATE_deepClone(this.value));\n }\n}\n\n/**\n * Returns a FieldMask built from all fields in a MapValue.\n */ function __PRIVATE_extractFieldMask(e) {\n const t = [];\n return forEach(e.fields, ((e, n) => {\n const r = new FieldPath$1([ e ]);\n if (__PRIVATE_isMapValue(n)) {\n const e = __PRIVATE_extractFieldMask(n.mapValue).fields;\n if (0 === e.length) \n // Preserve the empty map by adding it to the FieldMask.\n t.push(r); else \n // For nested and non-empty ObjectValues, add the FieldPath of the\n // leaf nodes.\n for (const n of e) t.push(r.child(n));\n } else \n // For nested and non-empty ObjectValues, add the FieldPath of the leaf\n // nodes.\n t.push(r);\n })), new FieldMask(t);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents a document in Firestore with a key, version, data and whether it\n * has local mutations applied to it.\n *\n * Documents can transition between states via `convertToFoundDocument()`,\n * `convertToNoDocument()` and `convertToUnknownDocument()`. If a document does\n * not transition to one of these states even after all mutations have been\n * applied, `isValidDocument()` returns false and the document should be removed\n * from all views.\n */ class MutableDocument {\n constructor(e, t, n, r, i, s, o) {\n this.key = e, this.documentType = t, this.version = n, this.readTime = r, this.createTime = i, \n this.data = s, this.documentState = o;\n }\n /**\n * Creates a document with no known version or data, but which can serve as\n * base document for mutations.\n */ static newInvalidDocument(e) {\n return new MutableDocument(e, 0 /* DocumentType.INVALID */ , \n /* version */ SnapshotVersion.min(), \n /* readTime */ SnapshotVersion.min(), \n /* createTime */ SnapshotVersion.min(), ObjectValue.empty(), 0 /* DocumentState.SYNCED */);\n }\n /**\n * Creates a new document that is known to exist with the given data at the\n * given version.\n */ static newFoundDocument(e, t, n, r) {\n return new MutableDocument(e, 1 /* DocumentType.FOUND_DOCUMENT */ , \n /* version */ t, \n /* readTime */ SnapshotVersion.min(), \n /* createTime */ n, r, 0 /* DocumentState.SYNCED */);\n }\n /** Creates a new document that is known to not exist at the given version. */ static newNoDocument(e, t) {\n return new MutableDocument(e, 2 /* DocumentType.NO_DOCUMENT */ , \n /* version */ t, \n /* readTime */ SnapshotVersion.min(), \n /* createTime */ SnapshotVersion.min(), ObjectValue.empty(), 0 /* DocumentState.SYNCED */);\n }\n /**\n * Creates a new document that is known to exist at the given version but\n * whose data is not known (e.g. a document that was updated without a known\n * base document).\n */ static newUnknownDocument(e, t) {\n return new MutableDocument(e, 3 /* DocumentType.UNKNOWN_DOCUMENT */ , \n /* version */ t, \n /* readTime */ SnapshotVersion.min(), \n /* createTime */ SnapshotVersion.min(), ObjectValue.empty(), 2 /* DocumentState.HAS_COMMITTED_MUTATIONS */);\n }\n /**\n * Changes the document type to indicate that it exists and that its version\n * and data are known.\n */ convertToFoundDocument(e, t) {\n // If a document is switching state from being an invalid or deleted\n // document to a valid (FOUND_DOCUMENT) document, either due to receiving an\n // update from Watch or due to applying a local set mutation on top\n // of a deleted document, our best guess about its createTime would be the\n // version at which the document transitioned to a FOUND_DOCUMENT.\n return !this.createTime.isEqual(SnapshotVersion.min()) || 2 /* DocumentType.NO_DOCUMENT */ !== this.documentType && 0 /* DocumentType.INVALID */ !== this.documentType || (this.createTime = e), \n this.version = e, this.documentType = 1 /* DocumentType.FOUND_DOCUMENT */ , this.data = t, \n this.documentState = 0 /* DocumentState.SYNCED */ , this;\n }\n /**\n * Changes the document type to indicate that it doesn't exist at the given\n * version.\n */ convertToNoDocument(e) {\n return this.version = e, this.documentType = 2 /* DocumentType.NO_DOCUMENT */ , \n this.data = ObjectValue.empty(), this.documentState = 0 /* DocumentState.SYNCED */ , \n this;\n }\n /**\n * Changes the document type to indicate that it exists at a given version but\n * that its data is not known (e.g. a document that was updated without a known\n * base document).\n */ convertToUnknownDocument(e) {\n return this.version = e, this.documentType = 3 /* DocumentType.UNKNOWN_DOCUMENT */ , \n this.data = ObjectValue.empty(), this.documentState = 2 /* DocumentState.HAS_COMMITTED_MUTATIONS */ , \n this;\n }\n setHasCommittedMutations() {\n return this.documentState = 2 /* DocumentState.HAS_COMMITTED_MUTATIONS */ , this;\n }\n setHasLocalMutations() {\n return this.documentState = 1 /* DocumentState.HAS_LOCAL_MUTATIONS */ , this.version = SnapshotVersion.min(), \n this;\n }\n setReadTime(e) {\n return this.readTime = e, this;\n }\n get hasLocalMutations() {\n return 1 /* DocumentState.HAS_LOCAL_MUTATIONS */ === this.documentState;\n }\n get hasCommittedMutations() {\n return 2 /* DocumentState.HAS_COMMITTED_MUTATIONS */ === this.documentState;\n }\n get hasPendingWrites() {\n return this.hasLocalMutations || this.hasCommittedMutations;\n }\n isValidDocument() {\n return 0 /* DocumentType.INVALID */ !== this.documentType;\n }\n isFoundDocument() {\n return 1 /* DocumentType.FOUND_DOCUMENT */ === this.documentType;\n }\n isNoDocument() {\n return 2 /* DocumentType.NO_DOCUMENT */ === this.documentType;\n }\n isUnknownDocument() {\n return 3 /* DocumentType.UNKNOWN_DOCUMENT */ === this.documentType;\n }\n isEqual(e) {\n return e instanceof MutableDocument && this.key.isEqual(e.key) && this.version.isEqual(e.version) && this.documentType === e.documentType && this.documentState === e.documentState && this.data.isEqual(e.data);\n }\n mutableCopy() {\n return new MutableDocument(this.key, this.documentType, this.version, this.readTime, this.createTime, this.data.clone(), this.documentState);\n }\n toString() {\n return `Document(${this.key}, ${this.version}, ${JSON.stringify(this.data.value)}, {createTime: ${this.createTime}}), {documentType: ${this.documentType}}), {documentState: ${this.documentState}})`;\n }\n}\n\n/**\n * Compares the value for field `field` in the provided documents. Throws if\n * the field does not exist in both documents.\n */\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents a bound of a query.\n *\n * The bound is specified with the given components representing a position and\n * whether it's just before or just after the position (relative to whatever the\n * query order is).\n *\n * The position represents a logical index position for a query. It's a prefix\n * of values for the (potentially implicit) order by clauses of a query.\n *\n * Bound provides a function to determine whether a document comes before or\n * after a bound. This is influenced by whether the position is just before or\n * just after the provided values.\n */\nclass Bound {\n constructor(e, t) {\n this.position = e, this.inclusive = t;\n }\n}\n\nfunction __PRIVATE_boundCompareToDocument(e, t, n) {\n let r = 0;\n for (let i = 0; i < e.position.length; i++) {\n const s = t[i], o = e.position[i];\n if (s.field.isKeyField()) r = DocumentKey.comparator(DocumentKey.fromName(o.referenceValue), n.key); else {\n r = __PRIVATE_valueCompare(o, n.data.field(s.field));\n }\n if (\"desc\" /* Direction.DESCENDING */ === s.dir && (r *= -1), 0 !== r) break;\n }\n return r;\n}\n\n/**\n * Returns true if a document sorts after a bound using the provided sort\n * order.\n */ function __PRIVATE_boundEquals(e, t) {\n if (null === e) return null === t;\n if (null === t) return !1;\n if (e.inclusive !== t.inclusive || e.position.length !== t.position.length) return !1;\n for (let n = 0; n < e.position.length; n++) {\n if (!__PRIVATE_valueEquals(e.position[n], t.position[n])) return !1;\n }\n return !0;\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An ordering on a field, in some Direction. Direction defaults to ASCENDING.\n */ class OrderBy {\n constructor(e, t = \"asc\" /* Direction.ASCENDING */) {\n this.field = e, this.dir = t;\n }\n}\n\nfunction __PRIVATE_orderByEquals(e, t) {\n return e.dir === t.dir && e.field.isEqual(t.field);\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class Filter {}\n\nclass FieldFilter extends Filter {\n constructor(e, t, n) {\n super(), this.field = e, this.op = t, this.value = n;\n }\n /**\n * Creates a filter based on the provided arguments.\n */ static create(e, t, n) {\n return e.isKeyField() ? \"in\" /* Operator.IN */ === t || \"not-in\" /* Operator.NOT_IN */ === t ? this.createKeyFieldInFilter(e, t, n) : new __PRIVATE_KeyFieldFilter(e, t, n) : \"array-contains\" /* Operator.ARRAY_CONTAINS */ === t ? new __PRIVATE_ArrayContainsFilter(e, n) : \"in\" /* Operator.IN */ === t ? new __PRIVATE_InFilter(e, n) : \"not-in\" /* Operator.NOT_IN */ === t ? new __PRIVATE_NotInFilter(e, n) : \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ === t ? new __PRIVATE_ArrayContainsAnyFilter(e, n) : new FieldFilter(e, t, n);\n }\n static createKeyFieldInFilter(e, t, n) {\n return \"in\" /* Operator.IN */ === t ? new __PRIVATE_KeyFieldInFilter(e, n) : new __PRIVATE_KeyFieldNotInFilter(e, n);\n }\n matches(e) {\n const t = e.data.field(this.field);\n // Types do not have to match in NOT_EQUAL filters.\n return \"!=\" /* Operator.NOT_EQUAL */ === this.op ? null !== t && this.matchesComparison(__PRIVATE_valueCompare(t, this.value)) : null !== t && __PRIVATE_typeOrder(this.value) === __PRIVATE_typeOrder(t) && this.matchesComparison(__PRIVATE_valueCompare(t, this.value));\n // Only compare types with matching backend order (such as double and int).\n }\n matchesComparison(e) {\n switch (this.op) {\n case \"<\" /* Operator.LESS_THAN */ :\n return e < 0;\n\n case \"<=\" /* Operator.LESS_THAN_OR_EQUAL */ :\n return e <= 0;\n\n case \"==\" /* Operator.EQUAL */ :\n return 0 === e;\n\n case \"!=\" /* Operator.NOT_EQUAL */ :\n return 0 !== e;\n\n case \">\" /* Operator.GREATER_THAN */ :\n return e > 0;\n\n case \">=\" /* Operator.GREATER_THAN_OR_EQUAL */ :\n return e >= 0;\n\n default:\n return fail();\n }\n }\n isInequality() {\n return [ \"<\" /* Operator.LESS_THAN */ , \"<=\" /* Operator.LESS_THAN_OR_EQUAL */ , \">\" /* Operator.GREATER_THAN */ , \">=\" /* Operator.GREATER_THAN_OR_EQUAL */ , \"!=\" /* Operator.NOT_EQUAL */ , \"not-in\" /* Operator.NOT_IN */ ].indexOf(this.op) >= 0;\n }\n getFlattenedFilters() {\n return [ this ];\n }\n getFilters() {\n return [ this ];\n }\n}\n\nclass CompositeFilter extends Filter {\n constructor(e, t) {\n super(), this.filters = e, this.op = t, this.ae = null;\n }\n /**\n * Creates a filter based on the provided arguments.\n */ static create(e, t) {\n return new CompositeFilter(e, t);\n }\n matches(e) {\n return __PRIVATE_compositeFilterIsConjunction(this) ? void 0 === this.filters.find((t => !t.matches(e))) : void 0 !== this.filters.find((t => t.matches(e)));\n }\n getFlattenedFilters() {\n return null !== this.ae || (this.ae = this.filters.reduce(((e, t) => e.concat(t.getFlattenedFilters())), [])), \n this.ae;\n }\n // Returns a mutable copy of `this.filters`\n getFilters() {\n return Object.assign([], this.filters);\n }\n}\n\nfunction __PRIVATE_compositeFilterIsConjunction(e) {\n return \"and\" /* CompositeOperator.AND */ === e.op;\n}\n\nfunction __PRIVATE_compositeFilterIsDisjunction(e) {\n return \"or\" /* CompositeOperator.OR */ === e.op;\n}\n\n/**\n * Returns true if this filter is a conjunction of field filters only. Returns false otherwise.\n */ function __PRIVATE_compositeFilterIsFlatConjunction(e) {\n return __PRIVATE_compositeFilterIsFlat(e) && __PRIVATE_compositeFilterIsConjunction(e);\n}\n\n/**\n * Returns true if this filter does not contain any composite filters. Returns false otherwise.\n */ function __PRIVATE_compositeFilterIsFlat(e) {\n for (const t of e.filters) if (t instanceof CompositeFilter) return !1;\n return !0;\n}\n\nfunction __PRIVATE_canonifyFilter(e) {\n if (e instanceof FieldFilter) \n // TODO(b/29183165): Technically, this won't be unique if two values have\n // the same description, such as the int 3 and the string \"3\". So we should\n // add the types in here somehow, too.\n return e.field.canonicalString() + e.op.toString() + canonicalId(e.value);\n if (__PRIVATE_compositeFilterIsFlatConjunction(e)) \n // Older SDK versions use an implicit AND operation between their filters.\n // In the new SDK versions, the developer may use an explicit AND filter.\n // To stay consistent with the old usages, we add a special case to ensure\n // the canonical ID for these two are the same. For example:\n // `col.whereEquals(\"a\", 1).whereEquals(\"b\", 2)` should have the same\n // canonical ID as `col.where(and(equals(\"a\",1), equals(\"b\",2)))`.\n return e.filters.map((e => __PRIVATE_canonifyFilter(e))).join(\",\");\n {\n // filter instanceof CompositeFilter\n const t = e.filters.map((e => __PRIVATE_canonifyFilter(e))).join(\",\");\n return `${e.op}(${t})`;\n }\n}\n\nfunction __PRIVATE_filterEquals(e, t) {\n return e instanceof FieldFilter ? function __PRIVATE_fieldFilterEquals(e, t) {\n return t instanceof FieldFilter && e.op === t.op && e.field.isEqual(t.field) && __PRIVATE_valueEquals(e.value, t.value);\n }(e, t) : e instanceof CompositeFilter ? function __PRIVATE_compositeFilterEquals(e, t) {\n if (t instanceof CompositeFilter && e.op === t.op && e.filters.length === t.filters.length) {\n return e.filters.reduce(((e, n, r) => e && __PRIVATE_filterEquals(n, t.filters[r])), !0);\n }\n return !1;\n }\n /**\n * Returns a new composite filter that contains all filter from\n * `compositeFilter` plus all the given filters in `otherFilters`.\n */ (e, t) : void fail();\n}\n\nfunction __PRIVATE_compositeFilterWithAddedFilters(e, t) {\n const n = e.filters.concat(t);\n return CompositeFilter.create(n, e.op);\n}\n\n/** Returns a debug description for `filter`. */ function __PRIVATE_stringifyFilter(e) {\n return e instanceof FieldFilter ? function __PRIVATE_stringifyFieldFilter(e) {\n return `${e.field.canonicalString()} ${e.op} ${canonicalId(e.value)}`;\n }\n /** Filter that matches on key fields (i.e. '__name__'). */ (e) : e instanceof CompositeFilter ? function __PRIVATE_stringifyCompositeFilter(e) {\n return e.op.toString() + \" {\" + e.getFilters().map(__PRIVATE_stringifyFilter).join(\" ,\") + \"}\";\n }(e) : \"Filter\";\n}\n\nclass __PRIVATE_KeyFieldFilter extends FieldFilter {\n constructor(e, t, n) {\n super(e, t, n), this.key = DocumentKey.fromName(n.referenceValue);\n }\n matches(e) {\n const t = DocumentKey.comparator(e.key, this.key);\n return this.matchesComparison(t);\n }\n}\n\n/** Filter that matches on key fields within an array. */ class __PRIVATE_KeyFieldInFilter extends FieldFilter {\n constructor(e, t) {\n super(e, \"in\" /* Operator.IN */ , t), this.keys = __PRIVATE_extractDocumentKeysFromArrayValue(\"in\" /* Operator.IN */ , t);\n }\n matches(e) {\n return this.keys.some((t => t.isEqual(e.key)));\n }\n}\n\n/** Filter that matches on key fields not present within an array. */ class __PRIVATE_KeyFieldNotInFilter extends FieldFilter {\n constructor(e, t) {\n super(e, \"not-in\" /* Operator.NOT_IN */ , t), this.keys = __PRIVATE_extractDocumentKeysFromArrayValue(\"not-in\" /* Operator.NOT_IN */ , t);\n }\n matches(e) {\n return !this.keys.some((t => t.isEqual(e.key)));\n }\n}\n\nfunction __PRIVATE_extractDocumentKeysFromArrayValue(e, t) {\n var n;\n return ((null === (n = t.arrayValue) || void 0 === n ? void 0 : n.values) || []).map((e => DocumentKey.fromName(e.referenceValue)));\n}\n\n/** A Filter that implements the array-contains operator. */ class __PRIVATE_ArrayContainsFilter extends FieldFilter {\n constructor(e, t) {\n super(e, \"array-contains\" /* Operator.ARRAY_CONTAINS */ , t);\n }\n matches(e) {\n const t = e.data.field(this.field);\n return isArray(t) && __PRIVATE_arrayValueContains(t.arrayValue, this.value);\n }\n}\n\n/** A Filter that implements the IN operator. */ class __PRIVATE_InFilter extends FieldFilter {\n constructor(e, t) {\n super(e, \"in\" /* Operator.IN */ , t);\n }\n matches(e) {\n const t = e.data.field(this.field);\n return null !== t && __PRIVATE_arrayValueContains(this.value.arrayValue, t);\n }\n}\n\n/** A Filter that implements the not-in operator. */ class __PRIVATE_NotInFilter extends FieldFilter {\n constructor(e, t) {\n super(e, \"not-in\" /* Operator.NOT_IN */ , t);\n }\n matches(e) {\n if (__PRIVATE_arrayValueContains(this.value.arrayValue, {\n nullValue: \"NULL_VALUE\"\n })) return !1;\n const t = e.data.field(this.field);\n return null !== t && !__PRIVATE_arrayValueContains(this.value.arrayValue, t);\n }\n}\n\n/** A Filter that implements the array-contains-any operator. */ class __PRIVATE_ArrayContainsAnyFilter extends FieldFilter {\n constructor(e, t) {\n super(e, \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ , t);\n }\n matches(e) {\n const t = e.data.field(this.field);\n return !(!isArray(t) || !t.arrayValue.values) && t.arrayValue.values.some((e => __PRIVATE_arrayValueContains(this.value.arrayValue, e)));\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// Visible for testing\nclass __PRIVATE_TargetImpl {\n constructor(e, t = null, n = [], r = [], i = null, s = null, o = null) {\n this.path = e, this.collectionGroup = t, this.orderBy = n, this.filters = r, this.limit = i, \n this.startAt = s, this.endAt = o, this.ue = null;\n }\n}\n\n/**\n * Initializes a Target with a path and optional additional query constraints.\n * Path must currently be empty if this is a collection group query.\n *\n * NOTE: you should always construct `Target` from `Query.toTarget` instead of\n * using this factory method, because `Query` provides an implicit `orderBy`\n * property.\n */ function __PRIVATE_newTarget(e, t = null, n = [], r = [], i = null, s = null, o = null) {\n return new __PRIVATE_TargetImpl(e, t, n, r, i, s, o);\n}\n\nfunction __PRIVATE_canonifyTarget(e) {\n const t = __PRIVATE_debugCast(e);\n if (null === t.ue) {\n let e = t.path.canonicalString();\n null !== t.collectionGroup && (e += \"|cg:\" + t.collectionGroup), e += \"|f:\", e += t.filters.map((e => __PRIVATE_canonifyFilter(e))).join(\",\"), \n e += \"|ob:\", e += t.orderBy.map((e => function __PRIVATE_canonifyOrderBy(e) {\n // TODO(b/29183165): Make this collision robust.\n return e.field.canonicalString() + e.dir;\n }(e))).join(\",\"), __PRIVATE_isNullOrUndefined(t.limit) || (e += \"|l:\", e += t.limit), \n t.startAt && (e += \"|lb:\", e += t.startAt.inclusive ? \"b:\" : \"a:\", e += t.startAt.position.map((e => canonicalId(e))).join(\",\")), \n t.endAt && (e += \"|ub:\", e += t.endAt.inclusive ? \"a:\" : \"b:\", e += t.endAt.position.map((e => canonicalId(e))).join(\",\")), \n t.ue = e;\n }\n return t.ue;\n}\n\nfunction __PRIVATE_targetEquals(e, t) {\n if (e.limit !== t.limit) return !1;\n if (e.orderBy.length !== t.orderBy.length) return !1;\n for (let n = 0; n < e.orderBy.length; n++) if (!__PRIVATE_orderByEquals(e.orderBy[n], t.orderBy[n])) return !1;\n if (e.filters.length !== t.filters.length) return !1;\n for (let n = 0; n < e.filters.length; n++) if (!__PRIVATE_filterEquals(e.filters[n], t.filters[n])) return !1;\n return e.collectionGroup === t.collectionGroup && (!!e.path.isEqual(t.path) && (!!__PRIVATE_boundEquals(e.startAt, t.startAt) && __PRIVATE_boundEquals(e.endAt, t.endAt)));\n}\n\nfunction __PRIVATE_targetIsDocumentTarget(e) {\n return DocumentKey.isDocumentKey(e.path) && null === e.collectionGroup && 0 === e.filters.length;\n}\n\n/** Returns the field filters that target the given field path. */ function __PRIVATE_targetGetFieldFiltersForPath(e, t) {\n return e.filters.filter((e => e instanceof FieldFilter && e.field.isEqual(t)));\n}\n\n/**\n * Returns the values that are used in ARRAY_CONTAINS or ARRAY_CONTAINS_ANY\n * filters. Returns `null` if there are no such filters.\n */\n/**\n * Returns the value to use as the lower bound for ascending index segment at\n * the provided `fieldPath` (or the upper bound for an descending segment).\n */\nfunction __PRIVATE_targetGetAscendingBound(e, t, n) {\n let r = ie, i = !0;\n // Process all filters to find a value for the current field segment\n for (const n of __PRIVATE_targetGetFieldFiltersForPath(e, t)) {\n let e = ie, t = !0;\n switch (n.op) {\n case \"<\" /* Operator.LESS_THAN */ :\n case \"<=\" /* Operator.LESS_THAN_OR_EQUAL */ :\n e = __PRIVATE_valuesGetLowerBound(n.value);\n break;\n\n case \"==\" /* Operator.EQUAL */ :\n case \"in\" /* Operator.IN */ :\n case \">=\" /* Operator.GREATER_THAN_OR_EQUAL */ :\n e = n.value;\n break;\n\n case \">\" /* Operator.GREATER_THAN */ :\n e = n.value, t = !1;\n break;\n\n case \"!=\" /* Operator.NOT_EQUAL */ :\n case \"not-in\" /* Operator.NOT_IN */ :\n e = ie;\n // Remaining filters cannot be used as lower bounds.\n }\n __PRIVATE_lowerBoundCompare({\n value: r,\n inclusive: i\n }, {\n value: e,\n inclusive: t\n }) < 0 && (r = e, i = t);\n }\n // If there is an additional bound, compare the values against the existing\n // range to see if we can narrow the scope.\n if (null !== n) for (let s = 0; s < e.orderBy.length; ++s) {\n if (e.orderBy[s].field.isEqual(t)) {\n const e = n.position[s];\n __PRIVATE_lowerBoundCompare({\n value: r,\n inclusive: i\n }, {\n value: e,\n inclusive: n.inclusive\n }) < 0 && (r = e, i = n.inclusive);\n break;\n }\n }\n return {\n value: r,\n inclusive: i\n };\n}\n\n/**\n * Returns the value to use as the upper bound for ascending index segment at\n * the provided `fieldPath` (or the lower bound for a descending segment).\n */ function __PRIVATE_targetGetDescendingBound(e, t, n) {\n let r = re, i = !0;\n // Process all filters to find a value for the current field segment\n for (const n of __PRIVATE_targetGetFieldFiltersForPath(e, t)) {\n let e = re, t = !0;\n switch (n.op) {\n case \">=\" /* Operator.GREATER_THAN_OR_EQUAL */ :\n case \">\" /* Operator.GREATER_THAN */ :\n e = __PRIVATE_valuesGetUpperBound(n.value), t = !1;\n break;\n\n case \"==\" /* Operator.EQUAL */ :\n case \"in\" /* Operator.IN */ :\n case \"<=\" /* Operator.LESS_THAN_OR_EQUAL */ :\n e = n.value;\n break;\n\n case \"<\" /* Operator.LESS_THAN */ :\n e = n.value, t = !1;\n break;\n\n case \"!=\" /* Operator.NOT_EQUAL */ :\n case \"not-in\" /* Operator.NOT_IN */ :\n e = re;\n // Remaining filters cannot be used as upper bounds.\n }\n __PRIVATE_upperBoundCompare({\n value: r,\n inclusive: i\n }, {\n value: e,\n inclusive: t\n }) > 0 && (r = e, i = t);\n }\n // If there is an additional bound, compare the values against the existing\n // range to see if we can narrow the scope.\n if (null !== n) for (let s = 0; s < e.orderBy.length; ++s) {\n if (e.orderBy[s].field.isEqual(t)) {\n const e = n.position[s];\n __PRIVATE_upperBoundCompare({\n value: r,\n inclusive: i\n }, {\n value: e,\n inclusive: n.inclusive\n }) > 0 && (r = e, i = n.inclusive);\n break;\n }\n }\n return {\n value: r,\n inclusive: i\n };\n}\n\n/** Returns the number of segments of a perfect index for this target. */\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Query encapsulates all the query attributes we support in the SDK. It can\n * be run against the LocalStore, as well as be converted to a `Target` to\n * query the RemoteStore results.\n *\n * Visible for testing.\n */\nclass __PRIVATE_QueryImpl {\n /**\n * Initializes a Query with a path and optional additional query constraints.\n * Path must currently be empty if this is a collection group query.\n */\n constructor(e, t = null, n = [], r = [], i = null, s = \"F\" /* LimitType.First */ , o = null, _ = null) {\n this.path = e, this.collectionGroup = t, this.explicitOrderBy = n, this.filters = r, \n this.limit = i, this.limitType = s, this.startAt = o, this.endAt = _, this.ce = null, \n // The corresponding `Target` of this `Query` instance, for use with\n // non-aggregate queries.\n this.le = null, \n // The corresponding `Target` of this `Query` instance, for use with\n // aggregate queries. Unlike targets for non-aggregate queries,\n // aggregate query targets do not contain normalized order-bys, they only\n // contain explicit order-bys.\n this.he = null, this.startAt, this.endAt;\n }\n}\n\n/** Creates a new Query instance with the options provided. */ function __PRIVATE_newQuery(e, t, n, r, i, s, o, _) {\n return new __PRIVATE_QueryImpl(e, t, n, r, i, s, o, _);\n}\n\n/** Creates a new Query for a query that matches all documents at `path` */ function __PRIVATE_newQueryForPath(e) {\n return new __PRIVATE_QueryImpl(e);\n}\n\n/**\n * Helper to convert a collection group query into a collection query at a\n * specific path. This is used when executing collection group queries, since\n * we have to split the query into a set of collection queries at multiple\n * paths.\n */\n/**\n * Returns true if this query does not specify any query constraints that\n * could remove results.\n */\nfunction __PRIVATE_queryMatchesAllDocuments(e) {\n return 0 === e.filters.length && null === e.limit && null == e.startAt && null == e.endAt && (0 === e.explicitOrderBy.length || 1 === e.explicitOrderBy.length && e.explicitOrderBy[0].field.isKeyField());\n}\n\n// Returns the sorted set of inequality filter fields used in this query.\n/**\n * Returns whether the query matches a collection group rather than a specific\n * collection.\n */\nfunction __PRIVATE_isCollectionGroupQuery(e) {\n return null !== e.collectionGroup;\n}\n\n/**\n * Returns the normalized order-by constraint that is used to execute the Query,\n * which can be different from the order-by constraints the user provided (e.g.\n * the SDK and backend always orders by `__name__`). The normalized order-by\n * includes implicit order-bys in addition to the explicit user provided\n * order-bys.\n */ function __PRIVATE_queryNormalizedOrderBy(e) {\n const t = __PRIVATE_debugCast(e);\n if (null === t.ce) {\n t.ce = [];\n const e = new Set;\n // Any explicit order by fields should be added as is.\n for (const n of t.explicitOrderBy) t.ce.push(n), e.add(n.field.canonicalString());\n // The order of the implicit ordering always matches the last explicit order by.\n const n = t.explicitOrderBy.length > 0 ? t.explicitOrderBy[t.explicitOrderBy.length - 1].dir : \"asc\" /* Direction.ASCENDING */ , r = function __PRIVATE_getInequalityFilterFields(e) {\n let t = new SortedSet(FieldPath$1.comparator);\n return e.filters.forEach((e => {\n e.getFlattenedFilters().forEach((e => {\n e.isInequality() && (t = t.add(e.field));\n }));\n })), t;\n }\n /**\n * Creates a new Query for a collection group query that matches all documents\n * within the provided collection group.\n */ (t);\n // Any inequality fields not explicitly ordered should be implicitly ordered in a lexicographical\n // order. When there are multiple inequality filters on the same field, the field should be added\n // only once.\n // Note: `SortedSet` sorts the key field before other fields. However, we want the key\n // field to be sorted last.\n r.forEach((r => {\n e.has(r.canonicalString()) || r.isKeyField() || t.ce.push(new OrderBy(r, n));\n })), \n // Add the document key field to the last if it is not explicitly ordered.\n e.has(FieldPath$1.keyField().canonicalString()) || t.ce.push(new OrderBy(FieldPath$1.keyField(), n));\n }\n return t.ce;\n}\n\n/**\n * Converts this `Query` instance to its corresponding `Target` representation.\n */ function __PRIVATE_queryToTarget(e) {\n const t = __PRIVATE_debugCast(e);\n return t.le || (t.le = __PRIVATE__queryToTarget(t, __PRIVATE_queryNormalizedOrderBy(e))), \n t.le;\n}\n\n/**\n * Converts this `Query` instance to its corresponding `Target` representation,\n * for use within an aggregate query. Unlike targets for non-aggregate queries,\n * aggregate query targets do not contain normalized order-bys, they only\n * contain explicit order-bys.\n */ function __PRIVATE_queryToAggregateTarget(e) {\n const t = __PRIVATE_debugCast(e);\n return t.he || (\n // Do not include implicit order-bys for aggregate queries.\n t.he = __PRIVATE__queryToTarget(t, e.explicitOrderBy)), t.he;\n}\n\nfunction __PRIVATE__queryToTarget(e, t) {\n if (\"F\" /* LimitType.First */ === e.limitType) return __PRIVATE_newTarget(e.path, e.collectionGroup, t, e.filters, e.limit, e.startAt, e.endAt);\n {\n // Flip the orderBy directions since we want the last results\n t = t.map((e => {\n const t = \"desc\" /* Direction.DESCENDING */ === e.dir ? \"asc\" /* Direction.ASCENDING */ : \"desc\" /* Direction.DESCENDING */;\n return new OrderBy(e.field, t);\n }));\n // We need to swap the cursors to match the now-flipped query ordering.\n const n = e.endAt ? new Bound(e.endAt.position, e.endAt.inclusive) : null, r = e.startAt ? new Bound(e.startAt.position, e.startAt.inclusive) : null;\n // Now return as a LimitType.First query.\n return __PRIVATE_newTarget(e.path, e.collectionGroup, t, e.filters, e.limit, n, r);\n }\n}\n\nfunction __PRIVATE_queryWithAddedFilter(e, t) {\n const n = e.filters.concat([ t ]);\n return new __PRIVATE_QueryImpl(e.path, e.collectionGroup, e.explicitOrderBy.slice(), n, e.limit, e.limitType, e.startAt, e.endAt);\n}\n\nfunction __PRIVATE_queryWithLimit(e, t, n) {\n return new __PRIVATE_QueryImpl(e.path, e.collectionGroup, e.explicitOrderBy.slice(), e.filters.slice(), t, n, e.startAt, e.endAt);\n}\n\nfunction __PRIVATE_queryEquals(e, t) {\n return __PRIVATE_targetEquals(__PRIVATE_queryToTarget(e), __PRIVATE_queryToTarget(t)) && e.limitType === t.limitType;\n}\n\n// TODO(b/29183165): This is used to get a unique string from a query to, for\n// example, use as a dictionary key, but the implementation is subject to\n// collisions. Make it collision-free.\nfunction __PRIVATE_canonifyQuery(e) {\n return `${__PRIVATE_canonifyTarget(__PRIVATE_queryToTarget(e))}|lt:${e.limitType}`;\n}\n\nfunction __PRIVATE_stringifyQuery(e) {\n return `Query(target=${function __PRIVATE_stringifyTarget(e) {\n let t = e.path.canonicalString();\n return null !== e.collectionGroup && (t += \" collectionGroup=\" + e.collectionGroup), \n e.filters.length > 0 && (t += `, filters: [${e.filters.map((e => __PRIVATE_stringifyFilter(e))).join(\", \")}]`), \n __PRIVATE_isNullOrUndefined(e.limit) || (t += \", limit: \" + e.limit), e.orderBy.length > 0 && (t += `, orderBy: [${e.orderBy.map((e => function __PRIVATE_stringifyOrderBy(e) {\n return `${e.field.canonicalString()} (${e.dir})`;\n }(e))).join(\", \")}]`), e.startAt && (t += \", startAt: \", t += e.startAt.inclusive ? \"b:\" : \"a:\", \n t += e.startAt.position.map((e => canonicalId(e))).join(\",\")), e.endAt && (t += \", endAt: \", \n t += e.endAt.inclusive ? \"a:\" : \"b:\", t += e.endAt.position.map((e => canonicalId(e))).join(\",\")), \n `Target(${t})`;\n }(__PRIVATE_queryToTarget(e))}; limitType=${e.limitType})`;\n}\n\n/** Returns whether `doc` matches the constraints of `query`. */ function __PRIVATE_queryMatches(e, t) {\n return t.isFoundDocument() && function __PRIVATE_queryMatchesPathAndCollectionGroup(e, t) {\n const n = t.key.path;\n return null !== e.collectionGroup ? t.key.hasCollectionId(e.collectionGroup) && e.path.isPrefixOf(n) : DocumentKey.isDocumentKey(e.path) ? e.path.isEqual(n) : e.path.isImmediateParentOf(n);\n }\n /**\n * A document must have a value for every ordering clause in order to show up\n * in the results.\n */ (e, t) && function __PRIVATE_queryMatchesOrderBy(e, t) {\n // We must use `queryNormalizedOrderBy()` to get the list of all orderBys (both implicit and explicit).\n // Note that for OR queries, orderBy applies to all disjunction terms and implicit orderBys must\n // be taken into account. For example, the query \"a > 1 || b==1\" has an implicit \"orderBy a\" due\n // to the inequality, and is evaluated as \"a > 1 orderBy a || b==1 orderBy a\".\n // A document with content of {b:1} matches the filters, but does not match the orderBy because\n // it's missing the field 'a'.\n for (const n of __PRIVATE_queryNormalizedOrderBy(e)) \n // order-by key always matches\n if (!n.field.isKeyField() && null === t.data.field(n.field)) return !1;\n return !0;\n }(e, t) && function __PRIVATE_queryMatchesFilters(e, t) {\n for (const n of e.filters) if (!n.matches(t)) return !1;\n return !0;\n }\n /** Makes sure a document is within the bounds, if provided. */ (e, t) && function __PRIVATE_queryMatchesBounds(e, t) {\n if (e.startAt && !\n /**\n * Returns true if a document sorts before a bound using the provided sort\n * order.\n */\n function __PRIVATE_boundSortsBeforeDocument(e, t, n) {\n const r = __PRIVATE_boundCompareToDocument(e, t, n);\n return e.inclusive ? r <= 0 : r < 0;\n }(e.startAt, __PRIVATE_queryNormalizedOrderBy(e), t)) return !1;\n if (e.endAt && !function __PRIVATE_boundSortsAfterDocument(e, t, n) {\n const r = __PRIVATE_boundCompareToDocument(e, t, n);\n return e.inclusive ? r >= 0 : r > 0;\n }(e.endAt, __PRIVATE_queryNormalizedOrderBy(e), t)) return !1;\n return !0;\n }\n /**\n * Returns the collection group that this query targets.\n *\n * PORTING NOTE: This is only used in the Web SDK to facilitate multi-tab\n * synchronization for query results.\n */ (e, t);\n}\n\nfunction __PRIVATE_queryCollectionGroup(e) {\n return e.collectionGroup || (e.path.length % 2 == 1 ? e.path.lastSegment() : e.path.get(e.path.length - 2));\n}\n\n/**\n * Returns a new comparator function that can be used to compare two documents\n * based on the Query's ordering constraint.\n */ function __PRIVATE_newQueryComparator(e) {\n return (t, n) => {\n let r = !1;\n for (const i of __PRIVATE_queryNormalizedOrderBy(e)) {\n const e = __PRIVATE_compareDocs(i, t, n);\n if (0 !== e) return e;\n r = r || i.field.isKeyField();\n }\n return 0;\n };\n}\n\nfunction __PRIVATE_compareDocs(e, t, n) {\n const r = e.field.isKeyField() ? DocumentKey.comparator(t.key, n.key) : function __PRIVATE_compareDocumentsByField(e, t, n) {\n const r = t.data.field(e), i = n.data.field(e);\n return null !== r && null !== i ? __PRIVATE_valueCompare(r, i) : fail();\n }(e.field, t, n);\n switch (e.dir) {\n case \"asc\" /* Direction.ASCENDING */ :\n return r;\n\n case \"desc\" /* Direction.DESCENDING */ :\n return -1 * r;\n\n default:\n return fail();\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A map implementation that uses objects as keys. Objects must have an\n * associated equals function and must be immutable. Entries in the map are\n * stored together with the key being produced from the mapKeyFn. This map\n * automatically handles collisions of keys.\n */ class ObjectMap {\n constructor(e, t) {\n this.mapKeyFn = e, this.equalsFn = t, \n /**\n * The inner map for a key/value pair. Due to the possibility of collisions we\n * keep a list of entries that we do a linear search through to find an actual\n * match. Note that collisions should be rare, so we still expect near\n * constant time lookups in practice.\n */\n this.inner = {}, \n /** The number of entries stored in the map */\n this.innerSize = 0;\n }\n /** Get a value for this key, or undefined if it does not exist. */ get(e) {\n const t = this.mapKeyFn(e), n = this.inner[t];\n if (void 0 !== n) for (const [t, r] of n) if (this.equalsFn(t, e)) return r;\n }\n has(e) {\n return void 0 !== this.get(e);\n }\n /** Put this key and value in the map. */ set(e, t) {\n const n = this.mapKeyFn(e), r = this.inner[n];\n if (void 0 === r) return this.inner[n] = [ [ e, t ] ], void this.innerSize++;\n for (let n = 0; n < r.length; n++) if (this.equalsFn(r[n][0], e)) \n // This is updating an existing entry and does not increase `innerSize`.\n return void (r[n] = [ e, t ]);\n r.push([ e, t ]), this.innerSize++;\n }\n /**\n * Remove this key from the map. Returns a boolean if anything was deleted.\n */ delete(e) {\n const t = this.mapKeyFn(e), n = this.inner[t];\n if (void 0 === n) return !1;\n for (let r = 0; r < n.length; r++) if (this.equalsFn(n[r][0], e)) return 1 === n.length ? delete this.inner[t] : n.splice(r, 1), \n this.innerSize--, !0;\n return !1;\n }\n forEach(e) {\n forEach(this.inner, ((t, n) => {\n for (const [t, r] of n) e(t, r);\n }));\n }\n isEmpty() {\n return isEmpty(this.inner);\n }\n size() {\n return this.innerSize;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const oe = new SortedMap(DocumentKey.comparator);\n\nfunction __PRIVATE_mutableDocumentMap() {\n return oe;\n}\n\nconst _e = new SortedMap(DocumentKey.comparator);\n\nfunction documentMap(...e) {\n let t = _e;\n for (const n of e) t = t.insert(n.key, n);\n return t;\n}\n\nfunction __PRIVATE_convertOverlayedDocumentMapToDocumentMap(e) {\n let t = _e;\n return e.forEach(((e, n) => t = t.insert(e, n.overlayedDocument))), t;\n}\n\nfunction __PRIVATE_newOverlayMap() {\n return __PRIVATE_newDocumentKeyMap();\n}\n\nfunction __PRIVATE_newMutationMap() {\n return __PRIVATE_newDocumentKeyMap();\n}\n\nfunction __PRIVATE_newDocumentKeyMap() {\n return new ObjectMap((e => e.toString()), ((e, t) => e.isEqual(t)));\n}\n\nconst ae = new SortedMap(DocumentKey.comparator);\n\nconst ue = new SortedSet(DocumentKey.comparator);\n\nfunction __PRIVATE_documentKeySet(...e) {\n let t = ue;\n for (const n of e) t = t.add(n);\n return t;\n}\n\nconst ce = new SortedSet(__PRIVATE_primitiveComparator);\n\nfunction __PRIVATE_targetIdSet() {\n return ce;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Returns an DoubleValue for `value` that is encoded based the serializer's\n * `useProto3Json` setting.\n */ function __PRIVATE_toDouble(e, t) {\n if (e.useProto3Json) {\n if (isNaN(t)) return {\n doubleValue: \"NaN\"\n };\n if (t === 1 / 0) return {\n doubleValue: \"Infinity\"\n };\n if (t === -1 / 0) return {\n doubleValue: \"-Infinity\"\n };\n }\n return {\n doubleValue: __PRIVATE_isNegativeZero(t) ? \"-0\" : t\n };\n}\n\n/**\n * Returns an IntegerValue for `value`.\n */ function __PRIVATE_toInteger(e) {\n return {\n integerValue: \"\" + e\n };\n}\n\n/**\n * Returns a value for a number that's appropriate to put into a proto.\n * The return value is an IntegerValue if it can safely represent the value,\n * otherwise a DoubleValue is returned.\n */ function toNumber(e, t) {\n return isSafeInteger(t) ? __PRIVATE_toInteger(t) : __PRIVATE_toDouble(e, t);\n}\n\n/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Used to represent a field transform on a mutation. */ class TransformOperation {\n constructor() {\n // Make sure that the structural type of `TransformOperation` is unique.\n // See https://github.com/microsoft/TypeScript/issues/5451\n this._ = void 0;\n }\n}\n\n/**\n * Computes the local transform result against the provided `previousValue`,\n * optionally using the provided localWriteTime.\n */ function __PRIVATE_applyTransformOperationToLocalView(e, t, n) {\n return e instanceof __PRIVATE_ServerTimestampTransform ? function serverTimestamp$1(e, t) {\n const n = {\n fields: {\n __type__: {\n stringValue: \"server_timestamp\"\n },\n __local_write_time__: {\n timestampValue: {\n seconds: e.seconds,\n nanos: e.nanoseconds\n }\n }\n }\n };\n // We should avoid storing deeply nested server timestamp map values\n // because we never use the intermediate \"previous values\".\n // For example:\n // previous: 42L, add: t1, result: t1 -> 42L\n // previous: t1, add: t2, result: t2 -> 42L (NOT t2 -> t1 -> 42L)\n // previous: t2, add: t3, result: t3 -> 42L (NOT t3 -> t2 -> t1 -> 42L)\n // `getPreviousValue` recursively traverses server timestamps to find the\n // least recent Value.\n return t && __PRIVATE_isServerTimestamp(t) && (t = __PRIVATE_getPreviousValue(t)), \n t && (n.fields.__previous_value__ = t), {\n mapValue: n\n };\n }(n, t) : e instanceof __PRIVATE_ArrayUnionTransformOperation ? __PRIVATE_applyArrayUnionTransformOperation(e, t) : e instanceof __PRIVATE_ArrayRemoveTransformOperation ? __PRIVATE_applyArrayRemoveTransformOperation(e, t) : function __PRIVATE_applyNumericIncrementTransformOperationToLocalView(e, t) {\n // PORTING NOTE: Since JavaScript's integer arithmetic is limited to 53 bit\n // precision and resolves overflows by reducing precision, we do not\n // manually cap overflows at 2^63.\n const n = __PRIVATE_computeTransformOperationBaseValue(e, t), r = asNumber(n) + asNumber(e.Pe);\n return isInteger(n) && isInteger(e.Pe) ? __PRIVATE_toInteger(r) : __PRIVATE_toDouble(e.serializer, r);\n }(e, t);\n}\n\n/**\n * Computes a final transform result after the transform has been acknowledged\n * by the server, potentially using the server-provided transformResult.\n */ function __PRIVATE_applyTransformOperationToRemoteDocument(e, t, n) {\n // The server just sends null as the transform result for array operations,\n // so we have to calculate a result the same as we do for local\n // applications.\n return e instanceof __PRIVATE_ArrayUnionTransformOperation ? __PRIVATE_applyArrayUnionTransformOperation(e, t) : e instanceof __PRIVATE_ArrayRemoveTransformOperation ? __PRIVATE_applyArrayRemoveTransformOperation(e, t) : n;\n}\n\n/**\n * If this transform operation is not idempotent, returns the base value to\n * persist for this transform. If a base value is returned, the transform\n * operation is always applied to this base value, even if document has\n * already been updated.\n *\n * Base values provide consistent behavior for non-idempotent transforms and\n * allow us to return the same latency-compensated value even if the backend\n * has already applied the transform operation. The base value is null for\n * idempotent transforms, as they can be re-played even if the backend has\n * already applied them.\n *\n * @returns a base value to store along with the mutation, or null for\n * idempotent transforms.\n */ function __PRIVATE_computeTransformOperationBaseValue(e, t) {\n return e instanceof __PRIVATE_NumericIncrementTransformOperation ? \n /** Returns true if `value` is either an IntegerValue or a DoubleValue. */\n function __PRIVATE_isNumber(e) {\n return isInteger(e) || function __PRIVATE_isDouble(e) {\n return !!e && \"doubleValue\" in e;\n }(e);\n }(t) ? t : {\n integerValue: 0\n } : null;\n}\n\n/** Transforms a value into a server-generated timestamp. */\nclass __PRIVATE_ServerTimestampTransform extends TransformOperation {}\n\n/** Transforms an array value via a union operation. */ class __PRIVATE_ArrayUnionTransformOperation extends TransformOperation {\n constructor(e) {\n super(), this.elements = e;\n }\n}\n\nfunction __PRIVATE_applyArrayUnionTransformOperation(e, t) {\n const n = __PRIVATE_coercedFieldValuesArray(t);\n for (const t of e.elements) n.some((e => __PRIVATE_valueEquals(e, t))) || n.push(t);\n return {\n arrayValue: {\n values: n\n }\n };\n}\n\n/** Transforms an array value via a remove operation. */ class __PRIVATE_ArrayRemoveTransformOperation extends TransformOperation {\n constructor(e) {\n super(), this.elements = e;\n }\n}\n\nfunction __PRIVATE_applyArrayRemoveTransformOperation(e, t) {\n let n = __PRIVATE_coercedFieldValuesArray(t);\n for (const t of e.elements) n = n.filter((e => !__PRIVATE_valueEquals(e, t)));\n return {\n arrayValue: {\n values: n\n }\n };\n}\n\n/**\n * Implements the backend semantics for locally computed NUMERIC_ADD (increment)\n * transforms. Converts all field values to integers or doubles, but unlike the\n * backend does not cap integer values at 2^63. Instead, JavaScript number\n * arithmetic is used and precision loss can occur for values greater than 2^53.\n */ class __PRIVATE_NumericIncrementTransformOperation extends TransformOperation {\n constructor(e, t) {\n super(), this.serializer = e, this.Pe = t;\n }\n}\n\nfunction asNumber(e) {\n return __PRIVATE_normalizeNumber(e.integerValue || e.doubleValue);\n}\n\nfunction __PRIVATE_coercedFieldValuesArray(e) {\n return isArray(e) && e.arrayValue.values ? e.arrayValue.values.slice() : [];\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** A field path and the TransformOperation to perform upon it. */ class FieldTransform {\n constructor(e, t) {\n this.field = e, this.transform = t;\n }\n}\n\nfunction __PRIVATE_fieldTransformEquals(e, t) {\n return e.field.isEqual(t.field) && function __PRIVATE_transformOperationEquals(e, t) {\n return e instanceof __PRIVATE_ArrayUnionTransformOperation && t instanceof __PRIVATE_ArrayUnionTransformOperation || e instanceof __PRIVATE_ArrayRemoveTransformOperation && t instanceof __PRIVATE_ArrayRemoveTransformOperation ? __PRIVATE_arrayEquals(e.elements, t.elements, __PRIVATE_valueEquals) : e instanceof __PRIVATE_NumericIncrementTransformOperation && t instanceof __PRIVATE_NumericIncrementTransformOperation ? __PRIVATE_valueEquals(e.Pe, t.Pe) : e instanceof __PRIVATE_ServerTimestampTransform && t instanceof __PRIVATE_ServerTimestampTransform;\n }(e.transform, t.transform);\n}\n\n/** The result of successfully applying a mutation to the backend. */\nclass MutationResult {\n constructor(\n /**\n * The version at which the mutation was committed:\n *\n * - For most operations, this is the updateTime in the WriteResult.\n * - For deletes, the commitTime of the WriteResponse (because deletes are\n * not stored and have no updateTime).\n *\n * Note that these versions can be different: No-op writes will not change\n * the updateTime even though the commitTime advances.\n */\n e, \n /**\n * The resulting fields returned from the backend after a mutation\n * containing field transforms has been committed. Contains one FieldValue\n * for each FieldTransform that was in the mutation.\n *\n * Will be empty if the mutation did not contain any field transforms.\n */\n t) {\n this.version = e, this.transformResults = t;\n }\n}\n\n/**\n * Encodes a precondition for a mutation. This follows the model that the\n * backend accepts with the special case of an explicit \"empty\" precondition\n * (meaning no precondition).\n */ class Precondition {\n constructor(e, t) {\n this.updateTime = e, this.exists = t;\n }\n /** Creates a new empty Precondition. */ static none() {\n return new Precondition;\n }\n /** Creates a new Precondition with an exists flag. */ static exists(e) {\n return new Precondition(void 0, e);\n }\n /** Creates a new Precondition based on a version a document exists at. */ static updateTime(e) {\n return new Precondition(e);\n }\n /** Returns whether this Precondition is empty. */ get isNone() {\n return void 0 === this.updateTime && void 0 === this.exists;\n }\n isEqual(e) {\n return this.exists === e.exists && (this.updateTime ? !!e.updateTime && this.updateTime.isEqual(e.updateTime) : !e.updateTime);\n }\n}\n\n/** Returns true if the preconditions is valid for the given document. */ function __PRIVATE_preconditionIsValidForDocument(e, t) {\n return void 0 !== e.updateTime ? t.isFoundDocument() && t.version.isEqual(e.updateTime) : void 0 === e.exists || e.exists === t.isFoundDocument();\n}\n\n/**\n * A mutation describes a self-contained change to a document. Mutations can\n * create, replace, delete, and update subsets of documents.\n *\n * Mutations not only act on the value of the document but also its version.\n *\n * For local mutations (mutations that haven't been committed yet), we preserve\n * the existing version for Set and Patch mutations. For Delete mutations, we\n * reset the version to 0.\n *\n * Here's the expected transition table.\n *\n * MUTATION APPLIED TO RESULTS IN\n *\n * SetMutation Document(v3) Document(v3)\n * SetMutation NoDocument(v3) Document(v0)\n * SetMutation InvalidDocument(v0) Document(v0)\n * PatchMutation Document(v3) Document(v3)\n * PatchMutation NoDocument(v3) NoDocument(v3)\n * PatchMutation InvalidDocument(v0) UnknownDocument(v3)\n * DeleteMutation Document(v3) NoDocument(v0)\n * DeleteMutation NoDocument(v3) NoDocument(v0)\n * DeleteMutation InvalidDocument(v0) NoDocument(v0)\n *\n * For acknowledged mutations, we use the updateTime of the WriteResponse as\n * the resulting version for Set and Patch mutations. As deletes have no\n * explicit update time, we use the commitTime of the WriteResponse for\n * Delete mutations.\n *\n * If a mutation is acknowledged by the backend but fails the precondition check\n * locally, we transition to an `UnknownDocument` and rely on Watch to send us\n * the updated version.\n *\n * Field transforms are used only with Patch and Set Mutations. We use the\n * `updateTransforms` message to store transforms, rather than the `transforms`s\n * messages.\n *\n * ## Subclassing Notes\n *\n * Every type of mutation needs to implement its own applyToRemoteDocument() and\n * applyToLocalView() to implement the actual behavior of applying the mutation\n * to some source document (see `setMutationApplyToRemoteDocument()` for an\n * example).\n */ class Mutation {}\n\n/**\n * A utility method to calculate a `Mutation` representing the overlay from the\n * final state of the document, and a `FieldMask` representing the fields that\n * are mutated by the local mutations.\n */ function __PRIVATE_calculateOverlayMutation(e, t) {\n if (!e.hasLocalMutations || t && 0 === t.fields.length) return null;\n // mask is null when sets or deletes are applied to the current document.\n if (null === t) return e.isNoDocument() ? new __PRIVATE_DeleteMutation(e.key, Precondition.none()) : new __PRIVATE_SetMutation(e.key, e.data, Precondition.none());\n {\n const n = e.data, r = ObjectValue.empty();\n let i = new SortedSet(FieldPath$1.comparator);\n for (let e of t.fields) if (!i.has(e)) {\n let t = n.field(e);\n // If we are deleting a nested field, we take the immediate parent as\n // the mask used to construct the resulting mutation.\n // Justification: Nested fields can create parent fields implicitly. If\n // only a leaf entry is deleted in later mutations, the parent field\n // should still remain, but we may have lost this information.\n // Consider mutation (foo.bar 1), then mutation (foo.bar delete()).\n // This leaves the final result (foo, {}). Despite the fact that `doc`\n // has the correct result, `foo` is not in `mask`, and the resulting\n // mutation would miss `foo`.\n null === t && e.length > 1 && (e = e.popLast(), t = n.field(e)), null === t ? r.delete(e) : r.set(e, t), \n i = i.add(e);\n }\n return new __PRIVATE_PatchMutation(e.key, r, new FieldMask(i.toArray()), Precondition.none());\n }\n}\n\n/**\n * Applies this mutation to the given document for the purposes of computing a\n * new remote document. If the input document doesn't match the expected state\n * (e.g. it is invalid or outdated), the document type may transition to\n * unknown.\n *\n * @param mutation - The mutation to apply.\n * @param document - The document to mutate. The input document can be an\n * invalid document if the client has no knowledge of the pre-mutation state\n * of the document.\n * @param mutationResult - The result of applying the mutation from the backend.\n */ function __PRIVATE_mutationApplyToRemoteDocument(e, t, n) {\n e instanceof __PRIVATE_SetMutation ? function __PRIVATE_setMutationApplyToRemoteDocument(e, t, n) {\n // Unlike setMutationApplyToLocalView, if we're applying a mutation to a\n // remote document the server has accepted the mutation so the precondition\n // must have held.\n const r = e.value.clone(), i = __PRIVATE_serverTransformResults(e.fieldTransforms, t, n.transformResults);\n r.setAll(i), t.convertToFoundDocument(n.version, r).setHasCommittedMutations();\n }(e, t, n) : e instanceof __PRIVATE_PatchMutation ? function __PRIVATE_patchMutationApplyToRemoteDocument(e, t, n) {\n if (!__PRIVATE_preconditionIsValidForDocument(e.precondition, t)) \n // Since the mutation was not rejected, we know that the precondition\n // matched on the backend. We therefore must not have the expected version\n // of the document in our cache and convert to an UnknownDocument with a\n // known updateTime.\n return void t.convertToUnknownDocument(n.version);\n const r = __PRIVATE_serverTransformResults(e.fieldTransforms, t, n.transformResults), i = t.data;\n i.setAll(__PRIVATE_getPatch(e)), i.setAll(r), t.convertToFoundDocument(n.version, i).setHasCommittedMutations();\n }(e, t, n) : function __PRIVATE_deleteMutationApplyToRemoteDocument(e, t, n) {\n // Unlike applyToLocalView, if we're applying a mutation to a remote\n // document the server has accepted the mutation so the precondition must\n // have held.\n t.convertToNoDocument(n.version).setHasCommittedMutations();\n }(0, t, n);\n}\n\n/**\n * Applies this mutation to the given document for the purposes of computing\n * the new local view of a document. If the input document doesn't match the\n * expected state, the document is not modified.\n *\n * @param mutation - The mutation to apply.\n * @param document - The document to mutate. The input document can be an\n * invalid document if the client has no knowledge of the pre-mutation state\n * of the document.\n * @param previousMask - The fields that have been updated before applying this mutation.\n * @param localWriteTime - A timestamp indicating the local write time of the\n * batch this mutation is a part of.\n * @returns A `FieldMask` representing the fields that are changed by applying this mutation.\n */ function __PRIVATE_mutationApplyToLocalView(e, t, n, r) {\n return e instanceof __PRIVATE_SetMutation ? function __PRIVATE_setMutationApplyToLocalView(e, t, n, r) {\n if (!__PRIVATE_preconditionIsValidForDocument(e.precondition, t)) \n // The mutation failed to apply (e.g. a document ID created with add()\n // caused a name collision).\n return n;\n const i = e.value.clone(), s = __PRIVATE_localTransformResults(e.fieldTransforms, r, t);\n return i.setAll(s), t.convertToFoundDocument(t.version, i).setHasLocalMutations(), \n null;\n // SetMutation overwrites all fields.\n }\n /**\n * A mutation that modifies fields of the document at the given key with the\n * given values. The values are applied through a field mask:\n *\n * * When a field is in both the mask and the values, the corresponding field\n * is updated.\n * * When a field is in neither the mask nor the values, the corresponding\n * field is unmodified.\n * * When a field is in the mask but not in the values, the corresponding field\n * is deleted.\n * * When a field is not in the mask but is in the values, the values map is\n * ignored.\n */ (e, t, n, r) : e instanceof __PRIVATE_PatchMutation ? function __PRIVATE_patchMutationApplyToLocalView(e, t, n, r) {\n if (!__PRIVATE_preconditionIsValidForDocument(e.precondition, t)) return n;\n const i = __PRIVATE_localTransformResults(e.fieldTransforms, r, t), s = t.data;\n if (s.setAll(__PRIVATE_getPatch(e)), s.setAll(i), t.convertToFoundDocument(t.version, s).setHasLocalMutations(), \n null === n) return null;\n return n.unionWith(e.fieldMask.fields).unionWith(e.fieldTransforms.map((e => e.field)));\n }\n /**\n * Returns a FieldPath/Value map with the content of the PatchMutation.\n */ (e, t, n, r) : function __PRIVATE_deleteMutationApplyToLocalView(e, t, n) {\n if (__PRIVATE_preconditionIsValidForDocument(e.precondition, t)) return t.convertToNoDocument(t.version).setHasLocalMutations(), \n null;\n return n;\n }\n /**\n * A mutation that verifies the existence of the document at the given key with\n * the provided precondition.\n *\n * The `verify` operation is only used in Transactions, and this class serves\n * primarily to facilitate serialization into protos.\n */ (e, t, n);\n}\n\n/**\n * If this mutation is not idempotent, returns the base value to persist with\n * this mutation. If a base value is returned, the mutation is always applied\n * to this base value, even if document has already been updated.\n *\n * The base value is a sparse object that consists of only the document\n * fields for which this mutation contains a non-idempotent transformation\n * (e.g. a numeric increment). The provided value guarantees consistent\n * behavior for non-idempotent transforms and allow us to return the same\n * latency-compensated value even if the backend has already applied the\n * mutation. The base value is null for idempotent mutations, as they can be\n * re-played even if the backend has already applied them.\n *\n * @returns a base value to store along with the mutation, or null for\n * idempotent mutations.\n */ function __PRIVATE_mutationExtractBaseValue(e, t) {\n let n = null;\n for (const r of e.fieldTransforms) {\n const e = t.data.field(r.field), i = __PRIVATE_computeTransformOperationBaseValue(r.transform, e || null);\n null != i && (null === n && (n = ObjectValue.empty()), n.set(r.field, i));\n }\n return n || null;\n}\n\nfunction __PRIVATE_mutationEquals(e, t) {\n return e.type === t.type && (!!e.key.isEqual(t.key) && (!!e.precondition.isEqual(t.precondition) && (!!function __PRIVATE_fieldTransformsAreEqual(e, t) {\n return void 0 === e && void 0 === t || !(!e || !t) && __PRIVATE_arrayEquals(e, t, ((e, t) => __PRIVATE_fieldTransformEquals(e, t)));\n }(e.fieldTransforms, t.fieldTransforms) && (0 /* MutationType.Set */ === e.type ? e.value.isEqual(t.value) : 1 /* MutationType.Patch */ !== e.type || e.data.isEqual(t.data) && e.fieldMask.isEqual(t.fieldMask)))));\n}\n\n/**\n * A mutation that creates or replaces the document at the given key with the\n * object value contents.\n */ class __PRIVATE_SetMutation extends Mutation {\n constructor(e, t, n, r = []) {\n super(), this.key = e, this.value = t, this.precondition = n, this.fieldTransforms = r, \n this.type = 0 /* MutationType.Set */;\n }\n getFieldMask() {\n return null;\n }\n}\n\nclass __PRIVATE_PatchMutation extends Mutation {\n constructor(e, t, n, r, i = []) {\n super(), this.key = e, this.data = t, this.fieldMask = n, this.precondition = r, \n this.fieldTransforms = i, this.type = 1 /* MutationType.Patch */;\n }\n getFieldMask() {\n return this.fieldMask;\n }\n}\n\nfunction __PRIVATE_getPatch(e) {\n const t = new Map;\n return e.fieldMask.fields.forEach((n => {\n if (!n.isEmpty()) {\n const r = e.data.field(n);\n t.set(n, r);\n }\n })), t;\n}\n\n/**\n * Creates a list of \"transform results\" (a transform result is a field value\n * representing the result of applying a transform) for use after a mutation\n * containing transforms has been acknowledged by the server.\n *\n * @param fieldTransforms - The field transforms to apply the result to.\n * @param mutableDocument - The current state of the document after applying all\n * previous mutations.\n * @param serverTransformResults - The transform results received by the server.\n * @returns The transform results list.\n */ function __PRIVATE_serverTransformResults(e, t, n) {\n const r = new Map;\n __PRIVATE_hardAssert(e.length === n.length);\n for (let i = 0; i < n.length; i++) {\n const s = e[i], o = s.transform, _ = t.data.field(s.field);\n r.set(s.field, __PRIVATE_applyTransformOperationToRemoteDocument(o, _, n[i]));\n }\n return r;\n}\n\n/**\n * Creates a list of \"transform results\" (a transform result is a field value\n * representing the result of applying a transform) for use when applying a\n * transform locally.\n *\n * @param fieldTransforms - The field transforms to apply the result to.\n * @param localWriteTime - The local time of the mutation (used to\n * generate ServerTimestampValues).\n * @param mutableDocument - The document to apply transforms on.\n * @returns The transform results list.\n */ function __PRIVATE_localTransformResults(e, t, n) {\n const r = new Map;\n for (const i of e) {\n const e = i.transform, s = n.data.field(i.field);\n r.set(i.field, __PRIVATE_applyTransformOperationToLocalView(e, s, t));\n }\n return r;\n}\n\n/** A mutation that deletes the document at the given key. */ class __PRIVATE_DeleteMutation extends Mutation {\n constructor(e, t) {\n super(), this.key = e, this.precondition = t, this.type = 2 /* MutationType.Delete */ , \n this.fieldTransforms = [];\n }\n getFieldMask() {\n return null;\n }\n}\n\nclass __PRIVATE_VerifyMutation extends Mutation {\n constructor(e, t) {\n super(), this.key = e, this.precondition = t, this.type = 3 /* MutationType.Verify */ , \n this.fieldTransforms = [];\n }\n getFieldMask() {\n return null;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A batch of mutations that will be sent as one unit to the backend.\n */ class MutationBatch {\n /**\n * @param batchId - The unique ID of this mutation batch.\n * @param localWriteTime - The original write time of this mutation.\n * @param baseMutations - Mutations that are used to populate the base\n * values when this mutation is applied locally. This can be used to locally\n * overwrite values that are persisted in the remote document cache. Base\n * mutations are never sent to the backend.\n * @param mutations - The user-provided mutations in this mutation batch.\n * User-provided mutations are applied both locally and remotely on the\n * backend.\n */\n constructor(e, t, n, r) {\n this.batchId = e, this.localWriteTime = t, this.baseMutations = n, this.mutations = r;\n }\n /**\n * Applies all the mutations in this MutationBatch to the specified document\n * to compute the state of the remote document\n *\n * @param document - The document to apply mutations to.\n * @param batchResult - The result of applying the MutationBatch to the\n * backend.\n */ applyToRemoteDocument(e, t) {\n const n = t.mutationResults;\n for (let t = 0; t < this.mutations.length; t++) {\n const r = this.mutations[t];\n if (r.key.isEqual(e.key)) {\n __PRIVATE_mutationApplyToRemoteDocument(r, e, n[t]);\n }\n }\n }\n /**\n * Computes the local view of a document given all the mutations in this\n * batch.\n *\n * @param document - The document to apply mutations to.\n * @param mutatedFields - Fields that have been updated before applying this mutation batch.\n * @returns A `FieldMask` representing all the fields that are mutated.\n */ applyToLocalView(e, t) {\n // First, apply the base state. This allows us to apply non-idempotent\n // transform against a consistent set of values.\n for (const n of this.baseMutations) n.key.isEqual(e.key) && (t = __PRIVATE_mutationApplyToLocalView(n, e, t, this.localWriteTime));\n // Second, apply all user-provided mutations.\n for (const n of this.mutations) n.key.isEqual(e.key) && (t = __PRIVATE_mutationApplyToLocalView(n, e, t, this.localWriteTime));\n return t;\n }\n /**\n * Computes the local view for all provided documents given the mutations in\n * this batch. Returns a `DocumentKey` to `Mutation` map which can be used to\n * replace all the mutation applications.\n */ applyToLocalDocumentSet(e, t) {\n // TODO(mrschmidt): This implementation is O(n^2). If we apply the mutations\n // directly (as done in `applyToLocalView()`), we can reduce the complexity\n // to O(n).\n const n = __PRIVATE_newMutationMap();\n return this.mutations.forEach((r => {\n const i = e.get(r.key), s = i.overlayedDocument;\n // TODO(mutabledocuments): This method should take a MutableDocumentMap\n // and we should remove this cast.\n let o = this.applyToLocalView(s, i.mutatedFields);\n // Set mutatedFields to null if the document is only from local mutations.\n // This creates a Set or Delete mutation, instead of trying to create a\n // patch mutation as the overlay.\n o = t.has(r.key) ? null : o;\n const _ = __PRIVATE_calculateOverlayMutation(s, o);\n null !== _ && n.set(r.key, _), s.isValidDocument() || s.convertToNoDocument(SnapshotVersion.min());\n })), n;\n }\n keys() {\n return this.mutations.reduce(((e, t) => e.add(t.key)), __PRIVATE_documentKeySet());\n }\n isEqual(e) {\n return this.batchId === e.batchId && __PRIVATE_arrayEquals(this.mutations, e.mutations, ((e, t) => __PRIVATE_mutationEquals(e, t))) && __PRIVATE_arrayEquals(this.baseMutations, e.baseMutations, ((e, t) => __PRIVATE_mutationEquals(e, t)));\n }\n}\n\n/** The result of applying a mutation batch to the backend. */ class MutationBatchResult {\n constructor(e, t, n, \n /**\n * A pre-computed mapping from each mutated document to the resulting\n * version.\n */\n r) {\n this.batch = e, this.commitVersion = t, this.mutationResults = n, this.docVersions = r;\n }\n /**\n * Creates a new MutationBatchResult for the given batch and results. There\n * must be one result for each mutation in the batch. This static factory\n * caches a document=>version mapping (docVersions).\n */ static from(e, t, n) {\n __PRIVATE_hardAssert(e.mutations.length === n.length);\n let r = function __PRIVATE_documentVersionMap() {\n return ae;\n }();\n const i = e.mutations;\n for (let e = 0; e < i.length; e++) r = r.insert(i[e].key, n[e].version);\n return new MutationBatchResult(e, t, n, r);\n }\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Representation of an overlay computed by Firestore.\n *\n * Holds information about a mutation and the largest batch id in Firestore when\n * the mutation was created.\n */ class Overlay {\n constructor(e, t) {\n this.largestBatchId = e, this.mutation = t;\n }\n getKey() {\n return this.mutation.key;\n }\n isEqual(e) {\n return null !== e && this.mutation === e.mutation;\n }\n toString() {\n return `Overlay{\\n largestBatchId: ${this.largestBatchId},\\n mutation: ${this.mutation.toString()}\\n }`;\n }\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Concrete implementation of the Aggregate type.\n */ class __PRIVATE_AggregateImpl {\n constructor(e, t, n) {\n this.alias = e, this.aggregateType = t, this.fieldPath = n;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class ExistenceFilter {\n constructor(e, t) {\n this.count = e, this.unchangedNames = t;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Error Codes describing the different ways GRPC can fail. These are copied\n * directly from GRPC's sources here:\n *\n * https://github.com/grpc/grpc/blob/bceec94ea4fc5f0085d81235d8e1c06798dc341a/include/grpc%2B%2B/impl/codegen/status_code_enum.h\n *\n * Important! The names of these identifiers matter because the string forms\n * are used for reverse lookups from the webchannel stream. Do NOT change the\n * names of these identifiers or change this into a const enum.\n */ var le, he;\n\n/**\n * Determines whether an error code represents a permanent error when received\n * in response to a non-write operation.\n *\n * See isPermanentWriteError for classifying write errors.\n */\nfunction __PRIVATE_isPermanentError(e) {\n switch (e) {\n default:\n return fail();\n\n case D.CANCELLED:\n case D.UNKNOWN:\n case D.DEADLINE_EXCEEDED:\n case D.RESOURCE_EXHAUSTED:\n case D.INTERNAL:\n case D.UNAVAILABLE:\n // Unauthenticated means something went wrong with our token and we need\n // to retry with new credentials which will happen automatically.\n case D.UNAUTHENTICATED:\n return !1;\n\n case D.INVALID_ARGUMENT:\n case D.NOT_FOUND:\n case D.ALREADY_EXISTS:\n case D.PERMISSION_DENIED:\n case D.FAILED_PRECONDITION:\n // Aborted might be retried in some scenarios, but that is dependent on\n // the context and should handled individually by the calling code.\n // See https://cloud.google.com/apis/design/errors.\n case D.ABORTED:\n case D.OUT_OF_RANGE:\n case D.UNIMPLEMENTED:\n case D.DATA_LOSS:\n return !0;\n }\n}\n\n/**\n * Determines whether an error code represents a permanent error when received\n * in response to a write operation.\n *\n * Write operations must be handled specially because as of b/119437764, ABORTED\n * errors on the write stream should be retried too (even though ABORTED errors\n * are not generally retryable).\n *\n * Note that during the initial handshake on the write stream an ABORTED error\n * signals that we should discard our stream token (i.e. it is permanent). This\n * means a handshake error should be classified with isPermanentError, above.\n */\n/**\n * Maps an error Code from GRPC status code number, like 0, 1, or 14. These\n * are not the same as HTTP status codes.\n *\n * @returns The Code equivalent to the given GRPC status code. Fails if there\n * is no match.\n */\nfunction __PRIVATE_mapCodeFromRpcCode(e) {\n if (void 0 === e) \n // This shouldn't normally happen, but in certain error cases (like trying\n // to send invalid proto messages) we may get an error with no GRPC code.\n return __PRIVATE_logError(\"GRPC error has no .code\"), D.UNKNOWN;\n switch (e) {\n case le.OK:\n return D.OK;\n\n case le.CANCELLED:\n return D.CANCELLED;\n\n case le.UNKNOWN:\n return D.UNKNOWN;\n\n case le.DEADLINE_EXCEEDED:\n return D.DEADLINE_EXCEEDED;\n\n case le.RESOURCE_EXHAUSTED:\n return D.RESOURCE_EXHAUSTED;\n\n case le.INTERNAL:\n return D.INTERNAL;\n\n case le.UNAVAILABLE:\n return D.UNAVAILABLE;\n\n case le.UNAUTHENTICATED:\n return D.UNAUTHENTICATED;\n\n case le.INVALID_ARGUMENT:\n return D.INVALID_ARGUMENT;\n\n case le.NOT_FOUND:\n return D.NOT_FOUND;\n\n case le.ALREADY_EXISTS:\n return D.ALREADY_EXISTS;\n\n case le.PERMISSION_DENIED:\n return D.PERMISSION_DENIED;\n\n case le.FAILED_PRECONDITION:\n return D.FAILED_PRECONDITION;\n\n case le.ABORTED:\n return D.ABORTED;\n\n case le.OUT_OF_RANGE:\n return D.OUT_OF_RANGE;\n\n case le.UNIMPLEMENTED:\n return D.UNIMPLEMENTED;\n\n case le.DATA_LOSS:\n return D.DATA_LOSS;\n\n default:\n return fail();\n }\n}\n\n/**\n * Converts an HTTP response's error status to the equivalent error code.\n *\n * @param status - An HTTP error response status (\"FAILED_PRECONDITION\",\n * \"UNKNOWN\", etc.)\n * @returns The equivalent Code. Non-matching responses are mapped to\n * Code.UNKNOWN.\n */ (he = le || (le = {}))[he.OK = 0] = \"OK\", he[he.CANCELLED = 1] = \"CANCELLED\", \nhe[he.UNKNOWN = 2] = \"UNKNOWN\", he[he.INVALID_ARGUMENT = 3] = \"INVALID_ARGUMENT\", \nhe[he.DEADLINE_EXCEEDED = 4] = \"DEADLINE_EXCEEDED\", he[he.NOT_FOUND = 5] = \"NOT_FOUND\", \nhe[he.ALREADY_EXISTS = 6] = \"ALREADY_EXISTS\", he[he.PERMISSION_DENIED = 7] = \"PERMISSION_DENIED\", \nhe[he.UNAUTHENTICATED = 16] = \"UNAUTHENTICATED\", he[he.RESOURCE_EXHAUSTED = 8] = \"RESOURCE_EXHAUSTED\", \nhe[he.FAILED_PRECONDITION = 9] = \"FAILED_PRECONDITION\", he[he.ABORTED = 10] = \"ABORTED\", \nhe[he.OUT_OF_RANGE = 11] = \"OUT_OF_RANGE\", he[he.UNIMPLEMENTED = 12] = \"UNIMPLEMENTED\", \nhe[he.INTERNAL = 13] = \"INTERNAL\", he[he.UNAVAILABLE = 14] = \"UNAVAILABLE\", he[he.DATA_LOSS = 15] = \"DATA_LOSS\";\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The global, singleton instance of TestingHooksSpi.\n *\n * This variable will be `null` in all cases _except_ when running from\n * integration tests that have registered callbacks to be notified of events\n * that happen during the test execution.\n */\nlet Pe = null;\n\n/**\n * Sets the value of the `testingHooksSpi` object.\n * @param instance the instance to set.\n */\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An instance of the Platform's 'TextEncoder' implementation.\n */\nfunction __PRIVATE_newTextEncoder() {\n return new TextEncoder;\n}\n\n/**\n * An instance of the Platform's 'TextDecoder' implementation.\n */\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst Ie = new Integer([ 4294967295, 4294967295 ], 0);\n\n// Hash a string using md5 hashing algorithm.\nfunction __PRIVATE_getMd5HashValue(e) {\n const t = __PRIVATE_newTextEncoder().encode(e), n = new Md5;\n return n.update(t), new Uint8Array(n.digest());\n}\n\n// Interpret the 16 bytes array as two 64-bit unsigned integers, encoded using\n// 2’s complement using little endian.\nfunction __PRIVATE_get64BitUints(e) {\n const t = new DataView(e.buffer), n = t.getUint32(0, /* littleEndian= */ !0), r = t.getUint32(4, /* littleEndian= */ !0), i = t.getUint32(8, /* littleEndian= */ !0), s = t.getUint32(12, /* littleEndian= */ !0);\n return [ new Integer([ n, r ], 0), new Integer([ i, s ], 0) ];\n}\n\nclass BloomFilter {\n constructor(e, t, n) {\n if (this.bitmap = e, this.padding = t, this.hashCount = n, t < 0 || t >= 8) throw new __PRIVATE_BloomFilterError(`Invalid padding: ${t}`);\n if (n < 0) throw new __PRIVATE_BloomFilterError(`Invalid hash count: ${n}`);\n if (e.length > 0 && 0 === this.hashCount) \n // Only empty bloom filter can have 0 hash count.\n throw new __PRIVATE_BloomFilterError(`Invalid hash count: ${n}`);\n if (0 === e.length && 0 !== t) \n // Empty bloom filter should have 0 padding.\n throw new __PRIVATE_BloomFilterError(`Invalid padding when bitmap length is 0: ${t}`);\n this.Ie = 8 * e.length - t, \n // Set the bit count in Integer to avoid repetition in mightContain().\n this.Te = Integer.fromNumber(this.Ie);\n }\n // Calculate the ith hash value based on the hashed 64bit integers,\n // and calculate its corresponding bit index in the bitmap to be checked.\n Ee(e, t, n) {\n // Calculate hashed value h(i) = h1 + (i * h2).\n let r = e.add(t.multiply(Integer.fromNumber(n)));\n // Wrap if hash value overflow 64bit.\n return 1 === r.compare(Ie) && (r = new Integer([ r.getBits(0), r.getBits(1) ], 0)), \n r.modulo(this.Te).toNumber();\n }\n // Return whether the bit on the given index in the bitmap is set to 1.\n de(e) {\n return 0 != (this.bitmap[Math.floor(e / 8)] & 1 << e % 8);\n }\n mightContain(e) {\n // Empty bitmap should always return false on membership check.\n if (0 === this.Ie) return !1;\n const t = __PRIVATE_getMd5HashValue(e), [n, r] = __PRIVATE_get64BitUints(t);\n for (let e = 0; e < this.hashCount; e++) {\n const t = this.Ee(n, r, e);\n if (!this.de(t)) return !1;\n }\n return !0;\n }\n /** Create bloom filter for testing purposes only. */ static create(e, t, n) {\n const r = e % 8 == 0 ? 0 : 8 - e % 8, i = new Uint8Array(Math.ceil(e / 8)), s = new BloomFilter(i, r, t);\n return n.forEach((e => s.insert(e))), s;\n }\n insert(e) {\n if (0 === this.Ie) return;\n const t = __PRIVATE_getMd5HashValue(e), [n, r] = __PRIVATE_get64BitUints(t);\n for (let e = 0; e < this.hashCount; e++) {\n const t = this.Ee(n, r, e);\n this.Ae(t);\n }\n }\n Ae(e) {\n const t = Math.floor(e / 8), n = e % 8;\n this.bitmap[t] |= 1 << n;\n }\n}\n\nclass __PRIVATE_BloomFilterError extends Error {\n constructor() {\n super(...arguments), this.name = \"BloomFilterError\";\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An event from the RemoteStore. It is split into targetChanges (changes to the\n * state or the set of documents in our watched targets) and documentUpdates\n * (changes to the actual documents).\n */ class RemoteEvent {\n constructor(\n /**\n * The snapshot version this event brings us up to, or MIN if not set.\n */\n e, \n /**\n * A map from target to changes to the target. See TargetChange.\n */\n t, \n /**\n * A map of targets that is known to be inconsistent, and the purpose for\n * re-listening. Listens for these targets should be re-established without\n * resume tokens.\n */\n n, \n /**\n * A set of which documents have changed or been deleted, along with the\n * doc's new values (if not deleted).\n */\n r, \n /**\n * A set of which document updates are due only to limbo resolution targets.\n */\n i) {\n this.snapshotVersion = e, this.targetChanges = t, this.targetMismatches = n, this.documentUpdates = r, \n this.resolvedLimboDocuments = i;\n }\n /**\n * HACK: Views require RemoteEvents in order to determine whether the view is\n * CURRENT, but secondary tabs don't receive remote events. So this method is\n * used to create a synthesized RemoteEvent that can be used to apply a\n * CURRENT status change to a View, for queries executed in a different tab.\n */\n // PORTING NOTE: Multi-tab only\n static createSynthesizedRemoteEventForCurrentChange(e, t, n) {\n const r = new Map;\n return r.set(e, TargetChange.createSynthesizedTargetChangeForCurrentChange(e, t, n)), \n new RemoteEvent(SnapshotVersion.min(), r, new SortedMap(__PRIVATE_primitiveComparator), __PRIVATE_mutableDocumentMap(), __PRIVATE_documentKeySet());\n }\n}\n\n/**\n * A TargetChange specifies the set of changes for a specific target as part of\n * a RemoteEvent. These changes track which documents are added, modified or\n * removed, as well as the target's resume token and whether the target is\n * marked CURRENT.\n * The actual changes *to* documents are not part of the TargetChange since\n * documents may be part of multiple targets.\n */ class TargetChange {\n constructor(\n /**\n * An opaque, server-assigned token that allows watching a query to be resumed\n * after disconnecting without retransmitting all the data that matches the\n * query. The resume token essentially identifies a point in time from which\n * the server should resume sending results.\n */\n e, \n /**\n * The \"current\" (synced) status of this target. Note that \"current\"\n * has special meaning in the RPC protocol that implies that a target is\n * both up-to-date and consistent with the rest of the watch stream.\n */\n t, \n /**\n * The set of documents that were newly assigned to this target as part of\n * this remote event.\n */\n n, \n /**\n * The set of documents that were already assigned to this target but received\n * an update during this remote event.\n */\n r, \n /**\n * The set of documents that were removed from this target as part of this\n * remote event.\n */\n i) {\n this.resumeToken = e, this.current = t, this.addedDocuments = n, this.modifiedDocuments = r, \n this.removedDocuments = i;\n }\n /**\n * This method is used to create a synthesized TargetChanges that can be used to\n * apply a CURRENT status change to a View (for queries executed in a different\n * tab) or for new queries (to raise snapshots with correct CURRENT status).\n */ static createSynthesizedTargetChangeForCurrentChange(e, t, n) {\n return new TargetChange(n, t, __PRIVATE_documentKeySet(), __PRIVATE_documentKeySet(), __PRIVATE_documentKeySet());\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents a changed document and a list of target ids to which this change\n * applies.\n *\n * If document has been deleted NoDocument will be provided.\n */ class __PRIVATE_DocumentWatchChange {\n constructor(\n /** The new document applies to all of these targets. */\n e, \n /** The new document is removed from all of these targets. */\n t, \n /** The key of the document for this change. */\n n, \n /**\n * The new document or NoDocument if it was deleted. Is null if the\n * document went out of view without the server sending a new document.\n */\n r) {\n this.Re = e, this.removedTargetIds = t, this.key = n, this.Ve = r;\n }\n}\n\nclass __PRIVATE_ExistenceFilterChange {\n constructor(e, t) {\n this.targetId = e, this.me = t;\n }\n}\n\nclass __PRIVATE_WatchTargetChange {\n constructor(\n /** What kind of change occurred to the watch target. */\n e, \n /** The target IDs that were added/removed/set. */\n t, \n /**\n * An opaque, server-assigned token that allows watching a target to be\n * resumed after disconnecting without retransmitting all the data that\n * matches the target. The resume token essentially identifies a point in\n * time from which the server should resume sending results.\n */\n n = ByteString.EMPTY_BYTE_STRING\n /** An RPC error indicating why the watch failed. */ , r = null) {\n this.state = e, this.targetIds = t, this.resumeToken = n, this.cause = r;\n }\n}\n\n/** Tracks the internal state of a Watch target. */ class __PRIVATE_TargetState {\n constructor() {\n /**\n * The number of pending responses (adds or removes) that we are waiting on.\n * We only consider targets active that have no pending responses.\n */\n this.fe = 0, \n /**\n * Keeps track of the document changes since the last raised snapshot.\n *\n * These changes are continuously updated as we receive document updates and\n * always reflect the current set of changes against the last issued snapshot.\n */\n this.ge = __PRIVATE_snapshotChangesMap(), \n /** See public getters for explanations of these fields. */\n this.pe = ByteString.EMPTY_BYTE_STRING, this.ye = !1, \n /**\n * Whether this target state should be included in the next snapshot. We\n * initialize to true so that newly-added targets are included in the next\n * RemoteEvent.\n */\n this.we = !0;\n }\n /**\n * Whether this target has been marked 'current'.\n *\n * 'Current' has special meaning in the RPC protocol: It implies that the\n * Watch backend has sent us all changes up to the point at which the target\n * was added and that the target is consistent with the rest of the watch\n * stream.\n */ get current() {\n return this.ye;\n }\n /** The last resume token sent to us for this target. */ get resumeToken() {\n return this.pe;\n }\n /** Whether this target has pending target adds or target removes. */ get Se() {\n return 0 !== this.fe;\n }\n /** Whether we have modified any state that should trigger a snapshot. */ get be() {\n return this.we;\n }\n /**\n * Applies the resume token to the TargetChange, but only when it has a new\n * value. Empty resumeTokens are discarded.\n */ De(e) {\n e.approximateByteSize() > 0 && (this.we = !0, this.pe = e);\n }\n /**\n * Creates a target change from the current set of changes.\n *\n * To reset the document changes after raising this snapshot, call\n * `clearPendingChanges()`.\n */ ve() {\n let e = __PRIVATE_documentKeySet(), t = __PRIVATE_documentKeySet(), n = __PRIVATE_documentKeySet();\n return this.ge.forEach(((r, i) => {\n switch (i) {\n case 0 /* ChangeType.Added */ :\n e = e.add(r);\n break;\n\n case 2 /* ChangeType.Modified */ :\n t = t.add(r);\n break;\n\n case 1 /* ChangeType.Removed */ :\n n = n.add(r);\n break;\n\n default:\n fail();\n }\n })), new TargetChange(this.pe, this.ye, e, t, n);\n }\n /**\n * Resets the document changes and sets `hasPendingChanges` to false.\n */ Ce() {\n this.we = !1, this.ge = __PRIVATE_snapshotChangesMap();\n }\n Fe(e, t) {\n this.we = !0, this.ge = this.ge.insert(e, t);\n }\n Me(e) {\n this.we = !0, this.ge = this.ge.remove(e);\n }\n xe() {\n this.fe += 1;\n }\n Oe() {\n this.fe -= 1, __PRIVATE_hardAssert(this.fe >= 0);\n }\n Ne() {\n this.we = !0, this.ye = !0;\n }\n}\n\n/**\n * A helper class to accumulate watch changes into a RemoteEvent.\n */\nclass __PRIVATE_WatchChangeAggregator {\n constructor(e) {\n this.Le = e, \n /** The internal state of all tracked targets. */\n this.Be = new Map, \n /** Keeps track of the documents to update since the last raised snapshot. */\n this.ke = __PRIVATE_mutableDocumentMap(), \n /** A mapping of document keys to their set of target IDs. */\n this.qe = __PRIVATE_documentTargetMap(), \n /**\n * A map of targets with existence filter mismatches. These targets are\n * known to be inconsistent and their listens needs to be re-established by\n * RemoteStore.\n */\n this.Qe = new SortedMap(__PRIVATE_primitiveComparator);\n }\n /**\n * Processes and adds the DocumentWatchChange to the current set of changes.\n */ Ke(e) {\n for (const t of e.Re) e.Ve && e.Ve.isFoundDocument() ? this.$e(t, e.Ve) : this.Ue(t, e.key, e.Ve);\n for (const t of e.removedTargetIds) this.Ue(t, e.key, e.Ve);\n }\n /** Processes and adds the WatchTargetChange to the current set of changes. */ We(e) {\n this.forEachTarget(e, (t => {\n const n = this.Ge(t);\n switch (e.state) {\n case 0 /* WatchTargetChangeState.NoChange */ :\n this.ze(t) && n.De(e.resumeToken);\n break;\n\n case 1 /* WatchTargetChangeState.Added */ :\n // We need to decrement the number of pending acks needed from watch\n // for this targetId.\n n.Oe(), n.Se || \n // We have a freshly added target, so we need to reset any state\n // that we had previously. This can happen e.g. when remove and add\n // back a target for existence filter mismatches.\n n.Ce(), n.De(e.resumeToken);\n break;\n\n case 2 /* WatchTargetChangeState.Removed */ :\n // We need to keep track of removed targets to we can post-filter and\n // remove any target changes.\n // We need to decrement the number of pending acks needed from watch\n // for this targetId.\n n.Oe(), n.Se || this.removeTarget(t);\n break;\n\n case 3 /* WatchTargetChangeState.Current */ :\n this.ze(t) && (n.Ne(), n.De(e.resumeToken));\n break;\n\n case 4 /* WatchTargetChangeState.Reset */ :\n this.ze(t) && (\n // Reset the target and synthesizes removes for all existing\n // documents. The backend will re-add any documents that still\n // match the target before it sends the next global snapshot.\n this.je(t), n.De(e.resumeToken));\n break;\n\n default:\n fail();\n }\n }));\n }\n /**\n * Iterates over all targetIds that the watch change applies to: either the\n * targetIds explicitly listed in the change or the targetIds of all currently\n * active targets.\n */ forEachTarget(e, t) {\n e.targetIds.length > 0 ? e.targetIds.forEach(t) : this.Be.forEach(((e, n) => {\n this.ze(n) && t(n);\n }));\n }\n /**\n * Handles existence filters and synthesizes deletes for filter mismatches.\n * Targets that are invalidated by filter mismatches are added to\n * `pendingTargetResets`.\n */ He(e) {\n const t = e.targetId, n = e.me.count, r = this.Je(t);\n if (r) {\n const i = r.target;\n if (__PRIVATE_targetIsDocumentTarget(i)) if (0 === n) {\n // The existence filter told us the document does not exist. We deduce\n // that this document does not exist and apply a deleted document to\n // our updates. Without applying this deleted document there might be\n // another query that will raise this document as part of a snapshot\n // until it is resolved, essentially exposing inconsistency between\n // queries.\n const e = new DocumentKey(i.path);\n this.Ue(t, e, MutableDocument.newNoDocument(e, SnapshotVersion.min()));\n } else __PRIVATE_hardAssert(1 === n); else {\n const r = this.Ye(t);\n // Existence filter mismatch. Mark the documents as being in limbo, and\n // raise a snapshot with `isFromCache:true`.\n if (r !== n) {\n // Apply bloom filter to identify and mark removed documents.\n const n = this.Ze(e), i = n ? this.Xe(n, e, r) : 1 /* BloomFilterApplicationStatus.Skipped */;\n if (0 /* BloomFilterApplicationStatus.Success */ !== i) {\n // If bloom filter application fails, we reset the mapping and\n // trigger re-run of the query.\n this.je(t);\n const e = 2 /* BloomFilterApplicationStatus.FalsePositive */ === i ? \"TargetPurposeExistenceFilterMismatchBloom\" /* TargetPurpose.ExistenceFilterMismatchBloom */ : \"TargetPurposeExistenceFilterMismatch\" /* TargetPurpose.ExistenceFilterMismatch */;\n this.Qe = this.Qe.insert(t, e);\n }\n null == Pe || Pe.et(function __PRIVATE_createExistenceFilterMismatchInfoForTestingHooks(e, t, n, r, i) {\n var s, o, _, a, u, c;\n const l = {\n localCacheCount: e,\n existenceFilterCount: t.count,\n databaseId: n.database,\n projectId: n.projectId\n }, h = t.unchangedNames;\n h && (l.bloomFilter = {\n applied: 0 /* BloomFilterApplicationStatus.Success */ === i,\n hashCount: null !== (s = null == h ? void 0 : h.hashCount) && void 0 !== s ? s : 0,\n bitmapLength: null !== (a = null === (_ = null === (o = null == h ? void 0 : h.bits) || void 0 === o ? void 0 : o.bitmap) || void 0 === _ ? void 0 : _.length) && void 0 !== a ? a : 0,\n padding: null !== (c = null === (u = null == h ? void 0 : h.bits) || void 0 === u ? void 0 : u.padding) && void 0 !== c ? c : 0,\n mightContain: e => {\n var t;\n return null !== (t = null == r ? void 0 : r.mightContain(e)) && void 0 !== t && t;\n }\n });\n return l;\n }\n /**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ (r, e.me, this.Le.tt(), n, i));\n }\n }\n }\n }\n /**\n * Parse the bloom filter from the \"unchanged_names\" field of an existence\n * filter.\n */ Ze(e) {\n const t = e.me.unchangedNames;\n if (!t || !t.bits) return null;\n const {bits: {bitmap: n = \"\", padding: r = 0}, hashCount: i = 0} = t;\n let s, o;\n try {\n s = __PRIVATE_normalizeByteString(n).toUint8Array();\n } catch (e) {\n if (e instanceof __PRIVATE_Base64DecodeError) return __PRIVATE_logWarn(\"Decoding the base64 bloom filter in existence filter failed (\" + e.message + \"); ignoring the bloom filter and falling back to full re-query.\"), \n null;\n throw e;\n }\n try {\n // BloomFilter throws error if the inputs are invalid.\n o = new BloomFilter(s, r, i);\n } catch (e) {\n return __PRIVATE_logWarn(e instanceof __PRIVATE_BloomFilterError ? \"BloomFilter error: \" : \"Applying bloom filter failed: \", e), \n null;\n }\n return 0 === o.Ie ? null : o;\n }\n /**\n * Apply bloom filter to remove the deleted documents, and return the\n * application status.\n */ Xe(e, t, n) {\n return t.me.count === n - this.nt(e, t.targetId) ? 0 /* BloomFilterApplicationStatus.Success */ : 2 /* BloomFilterApplicationStatus.FalsePositive */;\n }\n /**\n * Filter out removed documents based on bloom filter membership result and\n * return number of documents removed.\n */ nt(e, t) {\n const n = this.Le.getRemoteKeysForTarget(t);\n let r = 0;\n return n.forEach((n => {\n const i = this.Le.tt(), s = `projects/${i.projectId}/databases/${i.database}/documents/${n.path.canonicalString()}`;\n e.mightContain(s) || (this.Ue(t, n, /*updatedDocument=*/ null), r++);\n })), r;\n }\n /**\n * Converts the currently accumulated state into a remote event at the\n * provided snapshot version. Resets the accumulated changes before returning.\n */ rt(e) {\n const t = new Map;\n this.Be.forEach(((n, r) => {\n const i = this.Je(r);\n if (i) {\n if (n.current && __PRIVATE_targetIsDocumentTarget(i.target)) {\n // Document queries for document that don't exist can produce an empty\n // result set. To update our local cache, we synthesize a document\n // delete if we have not previously received the document. This\n // resolves the limbo state of the document, removing it from\n // limboDocumentRefs.\n // TODO(dimond): Ideally we would have an explicit lookup target\n // instead resulting in an explicit delete message and we could\n // remove this special logic.\n const t = new DocumentKey(i.target.path);\n null !== this.ke.get(t) || this.it(r, t) || this.Ue(r, t, MutableDocument.newNoDocument(t, e));\n }\n n.be && (t.set(r, n.ve()), n.Ce());\n }\n }));\n let n = __PRIVATE_documentKeySet();\n // We extract the set of limbo-only document updates as the GC logic\n // special-cases documents that do not appear in the target cache.\n \n // TODO(gsoltis): Expand on this comment once GC is available in the JS\n // client.\n this.qe.forEach(((e, t) => {\n let r = !0;\n t.forEachWhile((e => {\n const t = this.Je(e);\n return !t || \"TargetPurposeLimboResolution\" /* TargetPurpose.LimboResolution */ === t.purpose || (r = !1, \n !1);\n })), r && (n = n.add(e));\n })), this.ke.forEach(((t, n) => n.setReadTime(e)));\n const r = new RemoteEvent(e, t, this.Qe, this.ke, n);\n return this.ke = __PRIVATE_mutableDocumentMap(), this.qe = __PRIVATE_documentTargetMap(), \n this.Qe = new SortedMap(__PRIVATE_primitiveComparator), r;\n }\n /**\n * Adds the provided document to the internal list of document updates and\n * its document key to the given target's mapping.\n */\n // Visible for testing.\n $e(e, t) {\n if (!this.ze(e)) return;\n const n = this.it(e, t.key) ? 2 /* ChangeType.Modified */ : 0 /* ChangeType.Added */;\n this.Ge(e).Fe(t.key, n), this.ke = this.ke.insert(t.key, t), this.qe = this.qe.insert(t.key, this.st(t.key).add(e));\n }\n /**\n * Removes the provided document from the target mapping. If the\n * document no longer matches the target, but the document's state is still\n * known (e.g. we know that the document was deleted or we received the change\n * that caused the filter mismatch), the new document can be provided\n * to update the remote document cache.\n */\n // Visible for testing.\n Ue(e, t, n) {\n if (!this.ze(e)) return;\n const r = this.Ge(e);\n this.it(e, t) ? r.Fe(t, 1 /* ChangeType.Removed */) : \n // The document may have entered and left the target before we raised a\n // snapshot, so we can just ignore the change.\n r.Me(t), this.qe = this.qe.insert(t, this.st(t).delete(e)), n && (this.ke = this.ke.insert(t, n));\n }\n removeTarget(e) {\n this.Be.delete(e);\n }\n /**\n * Returns the current count of documents in the target. This includes both\n * the number of documents that the LocalStore considers to be part of the\n * target as well as any accumulated changes.\n */ Ye(e) {\n const t = this.Ge(e).ve();\n return this.Le.getRemoteKeysForTarget(e).size + t.addedDocuments.size - t.removedDocuments.size;\n }\n /**\n * Increment the number of acks needed from watch before we can consider the\n * server to be 'in-sync' with the client's active targets.\n */ xe(e) {\n this.Ge(e).xe();\n }\n Ge(e) {\n let t = this.Be.get(e);\n return t || (t = new __PRIVATE_TargetState, this.Be.set(e, t)), t;\n }\n st(e) {\n let t = this.qe.get(e);\n return t || (t = new SortedSet(__PRIVATE_primitiveComparator), this.qe = this.qe.insert(e, t)), \n t;\n }\n /**\n * Verifies that the user is still interested in this target (by calling\n * `getTargetDataForTarget()`) and that we are not waiting for pending ADDs\n * from watch.\n */ ze(e) {\n const t = null !== this.Je(e);\n return t || __PRIVATE_logDebug(\"WatchChangeAggregator\", \"Detected inactive target\", e), \n t;\n }\n /**\n * Returns the TargetData for an active target (i.e. a target that the user\n * is still interested in that has no outstanding target change requests).\n */ Je(e) {\n const t = this.Be.get(e);\n return t && t.Se ? null : this.Le.ot(e);\n }\n /**\n * Resets the state of a Watch target to its initial state (e.g. sets\n * 'current' to false, clears the resume token and removes its target mapping\n * from all documents).\n */ je(e) {\n this.Be.set(e, new __PRIVATE_TargetState);\n this.Le.getRemoteKeysForTarget(e).forEach((t => {\n this.Ue(e, t, /*updatedDocument=*/ null);\n }));\n }\n /**\n * Returns whether the LocalStore considers the document to be part of the\n * specified target.\n */ it(e, t) {\n return this.Le.getRemoteKeysForTarget(e).has(t);\n }\n}\n\nfunction __PRIVATE_documentTargetMap() {\n return new SortedMap(DocumentKey.comparator);\n}\n\nfunction __PRIVATE_snapshotChangesMap() {\n return new SortedMap(DocumentKey.comparator);\n}\n\nconst Te = (() => {\n const e = {\n asc: \"ASCENDING\",\n desc: \"DESCENDING\"\n };\n return e;\n})(), Ee = (() => {\n const e = {\n \"<\": \"LESS_THAN\",\n \"<=\": \"LESS_THAN_OR_EQUAL\",\n \">\": \"GREATER_THAN\",\n \">=\": \"GREATER_THAN_OR_EQUAL\",\n \"==\": \"EQUAL\",\n \"!=\": \"NOT_EQUAL\",\n \"array-contains\": \"ARRAY_CONTAINS\",\n in: \"IN\",\n \"not-in\": \"NOT_IN\",\n \"array-contains-any\": \"ARRAY_CONTAINS_ANY\"\n };\n return e;\n})(), de = (() => {\n const e = {\n and: \"AND\",\n or: \"OR\"\n };\n return e;\n})();\n\n/**\n * This class generates JsonObject values for the Datastore API suitable for\n * sending to either GRPC stub methods or via the JSON/HTTP REST API.\n *\n * The serializer supports both Protobuf.js and Proto3 JSON formats. By\n * setting `useProto3Json` to true, the serializer will use the Proto3 JSON\n * format.\n *\n * For a description of the Proto3 JSON format check\n * https://developers.google.com/protocol-buffers/docs/proto3#json\n *\n * TODO(klimt): We can remove the databaseId argument if we keep the full\n * resource name in documents.\n */\nclass JsonProtoSerializer {\n constructor(e, t) {\n this.databaseId = e, this.useProto3Json = t;\n }\n}\n\n/**\n * Returns a value for a number (or null) that's appropriate to put into\n * a google.protobuf.Int32Value proto.\n * DO NOT USE THIS FOR ANYTHING ELSE.\n * This method cheats. It's typed as returning \"number\" because that's what\n * our generated proto interfaces say Int32Value must be. But GRPC actually\n * expects a { value: } struct.\n */\nfunction __PRIVATE_toInt32Proto(e, t) {\n return e.useProto3Json || __PRIVATE_isNullOrUndefined(t) ? t : {\n value: t\n };\n}\n\n/**\n * Returns a number (or null) from a google.protobuf.Int32Value proto.\n */\n/**\n * Returns a value for a Date that's appropriate to put into a proto.\n */\nfunction toTimestamp(e, t) {\n if (e.useProto3Json) {\n return `${new Date(1e3 * t.seconds).toISOString().replace(/\\.\\d*/, \"\").replace(\"Z\", \"\")}.${(\"000000000\" + t.nanoseconds).slice(-9)}Z`;\n }\n return {\n seconds: \"\" + t.seconds,\n nanos: t.nanoseconds\n };\n}\n\n/**\n * Returns a value for bytes that's appropriate to put in a proto.\n *\n * Visible for testing.\n */\nfunction __PRIVATE_toBytes(e, t) {\n return e.useProto3Json ? t.toBase64() : t.toUint8Array();\n}\n\n/**\n * Returns a ByteString based on the proto string value.\n */ function __PRIVATE_toVersion(e, t) {\n return toTimestamp(e, t.toTimestamp());\n}\n\nfunction __PRIVATE_fromVersion(e) {\n return __PRIVATE_hardAssert(!!e), SnapshotVersion.fromTimestamp(function fromTimestamp(e) {\n const t = __PRIVATE_normalizeTimestamp(e);\n return new Timestamp(t.seconds, t.nanos);\n }(e));\n}\n\nfunction __PRIVATE_toResourceName(e, t) {\n return __PRIVATE_toResourcePath(e, t).canonicalString();\n}\n\nfunction __PRIVATE_toResourcePath(e, t) {\n const n = function __PRIVATE_fullyQualifiedPrefixPath(e) {\n return new ResourcePath([ \"projects\", e.projectId, \"databases\", e.database ]);\n }(e).child(\"documents\");\n return void 0 === t ? n : n.child(t);\n}\n\nfunction __PRIVATE_fromResourceName(e) {\n const t = ResourcePath.fromString(e);\n return __PRIVATE_hardAssert(__PRIVATE_isValidResourceName(t)), t;\n}\n\nfunction __PRIVATE_toName(e, t) {\n return __PRIVATE_toResourceName(e.databaseId, t.path);\n}\n\nfunction fromName(e, t) {\n const n = __PRIVATE_fromResourceName(t);\n if (n.get(1) !== e.databaseId.projectId) throw new FirestoreError(D.INVALID_ARGUMENT, \"Tried to deserialize key from different project: \" + n.get(1) + \" vs \" + e.databaseId.projectId);\n if (n.get(3) !== e.databaseId.database) throw new FirestoreError(D.INVALID_ARGUMENT, \"Tried to deserialize key from different database: \" + n.get(3) + \" vs \" + e.databaseId.database);\n return new DocumentKey(__PRIVATE_extractLocalPathFromResourceName(n));\n}\n\nfunction __PRIVATE_toQueryPath(e, t) {\n return __PRIVATE_toResourceName(e.databaseId, t);\n}\n\nfunction __PRIVATE_fromQueryPath(e) {\n const t = __PRIVATE_fromResourceName(e);\n // In v1beta1 queries for collections at the root did not have a trailing\n // \"/documents\". In v1 all resource paths contain \"/documents\". Preserve the\n // ability to read the v1beta1 form for compatibility with queries persisted\n // in the local target cache.\n return 4 === t.length ? ResourcePath.emptyPath() : __PRIVATE_extractLocalPathFromResourceName(t);\n}\n\nfunction __PRIVATE_getEncodedDatabaseId(e) {\n return new ResourcePath([ \"projects\", e.databaseId.projectId, \"databases\", e.databaseId.database ]).canonicalString();\n}\n\nfunction __PRIVATE_extractLocalPathFromResourceName(e) {\n return __PRIVATE_hardAssert(e.length > 4 && \"documents\" === e.get(4)), e.popFirst(5);\n}\n\n/** Creates a Document proto from key and fields (but no create/update time) */ function __PRIVATE_toMutationDocument(e, t, n) {\n return {\n name: __PRIVATE_toName(e, t),\n fields: n.value.mapValue.fields\n };\n}\n\nfunction __PRIVATE_fromDocument(e, t, n) {\n const r = fromName(e, t.name), i = __PRIVATE_fromVersion(t.updateTime), s = t.createTime ? __PRIVATE_fromVersion(t.createTime) : SnapshotVersion.min(), o = new ObjectValue({\n mapValue: {\n fields: t.fields\n }\n }), _ = MutableDocument.newFoundDocument(r, i, s, o);\n return n && _.setHasCommittedMutations(), n ? _.setHasCommittedMutations() : _;\n}\n\nfunction __PRIVATE_fromBatchGetDocumentsResponse(e, t) {\n return \"found\" in t ? function __PRIVATE_fromFound(e, t) {\n __PRIVATE_hardAssert(!!t.found), t.found.name, t.found.updateTime;\n const n = fromName(e, t.found.name), r = __PRIVATE_fromVersion(t.found.updateTime), i = t.found.createTime ? __PRIVATE_fromVersion(t.found.createTime) : SnapshotVersion.min(), s = new ObjectValue({\n mapValue: {\n fields: t.found.fields\n }\n });\n return MutableDocument.newFoundDocument(n, r, i, s);\n }(e, t) : \"missing\" in t ? function __PRIVATE_fromMissing(e, t) {\n __PRIVATE_hardAssert(!!t.missing), __PRIVATE_hardAssert(!!t.readTime);\n const n = fromName(e, t.missing), r = __PRIVATE_fromVersion(t.readTime);\n return MutableDocument.newNoDocument(n, r);\n }(e, t) : fail();\n}\n\nfunction __PRIVATE_fromWatchChange(e, t) {\n let n;\n if (\"targetChange\" in t) {\n t.targetChange;\n // proto3 default value is unset in JSON (undefined), so use 'NO_CHANGE'\n // if unset\n const r = function __PRIVATE_fromWatchTargetChangeState(e) {\n return \"NO_CHANGE\" === e ? 0 /* WatchTargetChangeState.NoChange */ : \"ADD\" === e ? 1 /* WatchTargetChangeState.Added */ : \"REMOVE\" === e ? 2 /* WatchTargetChangeState.Removed */ : \"CURRENT\" === e ? 3 /* WatchTargetChangeState.Current */ : \"RESET\" === e ? 4 /* WatchTargetChangeState.Reset */ : fail();\n }(t.targetChange.targetChangeType || \"NO_CHANGE\"), i = t.targetChange.targetIds || [], s = function __PRIVATE_fromBytes(e, t) {\n return e.useProto3Json ? (__PRIVATE_hardAssert(void 0 === t || \"string\" == typeof t), \n ByteString.fromBase64String(t || \"\")) : (__PRIVATE_hardAssert(void 0 === t || \n // Check if the value is an instance of both Buffer and Uint8Array,\n // despite the fact that Buffer extends Uint8Array. In some\n // environments, such as jsdom, the prototype chain of Buffer\n // does not indicate that it extends Uint8Array.\n t instanceof Buffer || t instanceof Uint8Array), ByteString.fromUint8Array(t || new Uint8Array));\n }(e, t.targetChange.resumeToken), o = t.targetChange.cause, _ = o && function __PRIVATE_fromRpcStatus(e) {\n const t = void 0 === e.code ? D.UNKNOWN : __PRIVATE_mapCodeFromRpcCode(e.code);\n return new FirestoreError(t, e.message || \"\");\n }(o);\n n = new __PRIVATE_WatchTargetChange(r, i, s, _ || null);\n } else if (\"documentChange\" in t) {\n t.documentChange;\n const r = t.documentChange;\n r.document, r.document.name, r.document.updateTime;\n const i = fromName(e, r.document.name), s = __PRIVATE_fromVersion(r.document.updateTime), o = r.document.createTime ? __PRIVATE_fromVersion(r.document.createTime) : SnapshotVersion.min(), _ = new ObjectValue({\n mapValue: {\n fields: r.document.fields\n }\n }), a = MutableDocument.newFoundDocument(i, s, o, _), u = r.targetIds || [], c = r.removedTargetIds || [];\n n = new __PRIVATE_DocumentWatchChange(u, c, a.key, a);\n } else if (\"documentDelete\" in t) {\n t.documentDelete;\n const r = t.documentDelete;\n r.document;\n const i = fromName(e, r.document), s = r.readTime ? __PRIVATE_fromVersion(r.readTime) : SnapshotVersion.min(), o = MutableDocument.newNoDocument(i, s), _ = r.removedTargetIds || [];\n n = new __PRIVATE_DocumentWatchChange([], _, o.key, o);\n } else if (\"documentRemove\" in t) {\n t.documentRemove;\n const r = t.documentRemove;\n r.document;\n const i = fromName(e, r.document), s = r.removedTargetIds || [];\n n = new __PRIVATE_DocumentWatchChange([], s, i, null);\n } else {\n if (!(\"filter\" in t)) return fail();\n {\n t.filter;\n const e = t.filter;\n e.targetId;\n const {count: r = 0, unchangedNames: i} = e, s = new ExistenceFilter(r, i), o = e.targetId;\n n = new __PRIVATE_ExistenceFilterChange(o, s);\n }\n }\n return n;\n}\n\nfunction toMutation(e, t) {\n let n;\n if (t instanceof __PRIVATE_SetMutation) n = {\n update: __PRIVATE_toMutationDocument(e, t.key, t.value)\n }; else if (t instanceof __PRIVATE_DeleteMutation) n = {\n delete: __PRIVATE_toName(e, t.key)\n }; else if (t instanceof __PRIVATE_PatchMutation) n = {\n update: __PRIVATE_toMutationDocument(e, t.key, t.data),\n updateMask: __PRIVATE_toDocumentMask(t.fieldMask)\n }; else {\n if (!(t instanceof __PRIVATE_VerifyMutation)) return fail();\n n = {\n verify: __PRIVATE_toName(e, t.key)\n };\n }\n return t.fieldTransforms.length > 0 && (n.updateTransforms = t.fieldTransforms.map((e => function __PRIVATE_toFieldTransform(e, t) {\n const n = t.transform;\n if (n instanceof __PRIVATE_ServerTimestampTransform) return {\n fieldPath: t.field.canonicalString(),\n setToServerValue: \"REQUEST_TIME\"\n };\n if (n instanceof __PRIVATE_ArrayUnionTransformOperation) return {\n fieldPath: t.field.canonicalString(),\n appendMissingElements: {\n values: n.elements\n }\n };\n if (n instanceof __PRIVATE_ArrayRemoveTransformOperation) return {\n fieldPath: t.field.canonicalString(),\n removeAllFromArray: {\n values: n.elements\n }\n };\n if (n instanceof __PRIVATE_NumericIncrementTransformOperation) return {\n fieldPath: t.field.canonicalString(),\n increment: n.Pe\n };\n throw fail();\n }(0, e)))), t.precondition.isNone || (n.currentDocument = function __PRIVATE_toPrecondition(e, t) {\n return void 0 !== t.updateTime ? {\n updateTime: __PRIVATE_toVersion(e, t.updateTime)\n } : void 0 !== t.exists ? {\n exists: t.exists\n } : fail();\n }(e, t.precondition)), n;\n}\n\nfunction __PRIVATE_fromMutation(e, t) {\n const n = t.currentDocument ? function __PRIVATE_fromPrecondition(e) {\n return void 0 !== e.updateTime ? Precondition.updateTime(__PRIVATE_fromVersion(e.updateTime)) : void 0 !== e.exists ? Precondition.exists(e.exists) : Precondition.none();\n }(t.currentDocument) : Precondition.none(), r = t.updateTransforms ? t.updateTransforms.map((t => function __PRIVATE_fromFieldTransform(e, t) {\n let n = null;\n if (\"setToServerValue\" in t) __PRIVATE_hardAssert(\"REQUEST_TIME\" === t.setToServerValue), \n n = new __PRIVATE_ServerTimestampTransform; else if (\"appendMissingElements\" in t) {\n const e = t.appendMissingElements.values || [];\n n = new __PRIVATE_ArrayUnionTransformOperation(e);\n } else if (\"removeAllFromArray\" in t) {\n const e = t.removeAllFromArray.values || [];\n n = new __PRIVATE_ArrayRemoveTransformOperation(e);\n } else \"increment\" in t ? n = new __PRIVATE_NumericIncrementTransformOperation(e, t.increment) : fail();\n const r = FieldPath$1.fromServerFormat(t.fieldPath);\n return new FieldTransform(r, n);\n }(e, t))) : [];\n if (t.update) {\n t.update.name;\n const i = fromName(e, t.update.name), s = new ObjectValue({\n mapValue: {\n fields: t.update.fields\n }\n });\n if (t.updateMask) {\n const e = function __PRIVATE_fromDocumentMask(e) {\n const t = e.fieldPaths || [];\n return new FieldMask(t.map((e => FieldPath$1.fromServerFormat(e))));\n }(t.updateMask);\n return new __PRIVATE_PatchMutation(i, s, e, n, r);\n }\n return new __PRIVATE_SetMutation(i, s, n, r);\n }\n if (t.delete) {\n const r = fromName(e, t.delete);\n return new __PRIVATE_DeleteMutation(r, n);\n }\n if (t.verify) {\n const r = fromName(e, t.verify);\n return new __PRIVATE_VerifyMutation(r, n);\n }\n return fail();\n}\n\nfunction __PRIVATE_fromWriteResults(e, t) {\n return e && e.length > 0 ? (__PRIVATE_hardAssert(void 0 !== t), e.map((e => function __PRIVATE_fromWriteResult(e, t) {\n // NOTE: Deletes don't have an updateTime.\n let n = e.updateTime ? __PRIVATE_fromVersion(e.updateTime) : __PRIVATE_fromVersion(t);\n return n.isEqual(SnapshotVersion.min()) && (\n // The Firestore Emulator currently returns an update time of 0 for\n // deletes of non-existing documents (rather than null). This breaks the\n // test \"get deleted doc while offline with source=cache\" as NoDocuments\n // with version 0 are filtered by IndexedDb's RemoteDocumentCache.\n // TODO(#2149): Remove this when Emulator is fixed\n n = __PRIVATE_fromVersion(t)), new MutationResult(n, e.transformResults || []);\n }(e, t)))) : [];\n}\n\nfunction __PRIVATE_toDocumentsTarget(e, t) {\n return {\n documents: [ __PRIVATE_toQueryPath(e, t.path) ]\n };\n}\n\nfunction __PRIVATE_toQueryTarget(e, t) {\n // Dissect the path into parent, collectionId, and optional key filter.\n const n = {\n structuredQuery: {}\n }, r = t.path;\n let i;\n null !== t.collectionGroup ? (i = r, n.structuredQuery.from = [ {\n collectionId: t.collectionGroup,\n allDescendants: !0\n } ]) : (i = r.popLast(), n.structuredQuery.from = [ {\n collectionId: r.lastSegment()\n } ]), n.parent = __PRIVATE_toQueryPath(e, i);\n const s = function __PRIVATE_toFilters(e) {\n if (0 === e.length) return;\n return __PRIVATE_toFilter(CompositeFilter.create(e, \"and\" /* CompositeOperator.AND */));\n }(t.filters);\n s && (n.structuredQuery.where = s);\n const o = function __PRIVATE_toOrder(e) {\n if (0 === e.length) return;\n return e.map((e => \n // visible for testing\n function __PRIVATE_toPropertyOrder(e) {\n return {\n field: __PRIVATE_toFieldPathReference(e.field),\n direction: __PRIVATE_toDirection(e.dir)\n };\n }(e)));\n }(t.orderBy);\n o && (n.structuredQuery.orderBy = o);\n const _ = __PRIVATE_toInt32Proto(e, t.limit);\n return null !== _ && (n.structuredQuery.limit = _), t.startAt && (n.structuredQuery.startAt = function __PRIVATE_toStartAtCursor(e) {\n return {\n before: e.inclusive,\n values: e.position\n };\n }(t.startAt)), t.endAt && (n.structuredQuery.endAt = function __PRIVATE_toEndAtCursor(e) {\n return {\n before: !e.inclusive,\n values: e.position\n };\n }(t.endAt)), {\n _t: n,\n parent: i\n };\n}\n\nfunction __PRIVATE_toRunAggregationQueryRequest(e, t, n, r) {\n const {_t: i, parent: s} = __PRIVATE_toQueryTarget(e, t), o = {}, _ = [];\n let a = 0;\n return n.forEach((e => {\n // Map all client-side aliases to a unique short-form\n // alias. This avoids issues with client-side aliases that\n // exceed the 1500-byte string size limit.\n const t = r ? e.alias : \"aggregate_\" + a++;\n o[t] = e.alias, \"count\" === e.aggregateType ? _.push({\n alias: t,\n count: {}\n }) : \"avg\" === e.aggregateType ? _.push({\n alias: t,\n avg: {\n field: __PRIVATE_toFieldPathReference(e.fieldPath)\n }\n }) : \"sum\" === e.aggregateType && _.push({\n alias: t,\n sum: {\n field: __PRIVATE_toFieldPathReference(e.fieldPath)\n }\n });\n })), {\n request: {\n structuredAggregationQuery: {\n aggregations: _,\n structuredQuery: i.structuredQuery\n },\n parent: i.parent\n },\n ut: o,\n parent: s\n };\n}\n\nfunction __PRIVATE_convertQueryTargetToQuery(e) {\n let t = __PRIVATE_fromQueryPath(e.parent);\n const n = e.structuredQuery, r = n.from ? n.from.length : 0;\n let i = null;\n if (r > 0) {\n __PRIVATE_hardAssert(1 === r);\n const e = n.from[0];\n e.allDescendants ? i = e.collectionId : t = t.child(e.collectionId);\n }\n let s = [];\n n.where && (s = function __PRIVATE_fromFilters(e) {\n const t = __PRIVATE_fromFilter(e);\n if (t instanceof CompositeFilter && __PRIVATE_compositeFilterIsFlatConjunction(t)) return t.getFilters();\n return [ t ];\n }(n.where));\n let o = [];\n n.orderBy && (o = function __PRIVATE_fromOrder(e) {\n return e.map((e => function __PRIVATE_fromPropertyOrder(e) {\n return new OrderBy(__PRIVATE_fromFieldPathReference(e.field), \n // visible for testing\n function __PRIVATE_fromDirection(e) {\n switch (e) {\n case \"ASCENDING\":\n return \"asc\" /* Direction.ASCENDING */;\n\n case \"DESCENDING\":\n return \"desc\" /* Direction.DESCENDING */;\n\n default:\n return;\n }\n }\n // visible for testing\n (e.direction));\n }\n // visible for testing\n (e)));\n }(n.orderBy));\n let _ = null;\n n.limit && (_ = function __PRIVATE_fromInt32Proto(e) {\n let t;\n return t = \"object\" == typeof e ? e.value : e, __PRIVATE_isNullOrUndefined(t) ? null : t;\n }(n.limit));\n let a = null;\n n.startAt && (a = function __PRIVATE_fromStartAtCursor(e) {\n const t = !!e.before, n = e.values || [];\n return new Bound(n, t);\n }(n.startAt));\n let u = null;\n return n.endAt && (u = function __PRIVATE_fromEndAtCursor(e) {\n const t = !e.before, n = e.values || [];\n return new Bound(n, t);\n }\n // visible for testing\n (n.endAt)), __PRIVATE_newQuery(t, i, o, s, _, \"F\" /* LimitType.First */ , a, u);\n}\n\nfunction __PRIVATE_toListenRequestLabels(e, t) {\n const n = function __PRIVATE_toLabel(e) {\n switch (e) {\n case \"TargetPurposeListen\" /* TargetPurpose.Listen */ :\n return null;\n\n case \"TargetPurposeExistenceFilterMismatch\" /* TargetPurpose.ExistenceFilterMismatch */ :\n return \"existence-filter-mismatch\";\n\n case \"TargetPurposeExistenceFilterMismatchBloom\" /* TargetPurpose.ExistenceFilterMismatchBloom */ :\n return \"existence-filter-mismatch-bloom\";\n\n case \"TargetPurposeLimboResolution\" /* TargetPurpose.LimboResolution */ :\n return \"limbo-document\";\n\n default:\n return fail();\n }\n }(t.purpose);\n return null == n ? null : {\n \"goog-listen-tags\": n\n };\n}\n\nfunction __PRIVATE_fromFilter(e) {\n return void 0 !== e.unaryFilter ? function __PRIVATE_fromUnaryFilter(e) {\n switch (e.unaryFilter.op) {\n case \"IS_NAN\":\n const t = __PRIVATE_fromFieldPathReference(e.unaryFilter.field);\n return FieldFilter.create(t, \"==\" /* Operator.EQUAL */ , {\n doubleValue: NaN\n });\n\n case \"IS_NULL\":\n const n = __PRIVATE_fromFieldPathReference(e.unaryFilter.field);\n return FieldFilter.create(n, \"==\" /* Operator.EQUAL */ , {\n nullValue: \"NULL_VALUE\"\n });\n\n case \"IS_NOT_NAN\":\n const r = __PRIVATE_fromFieldPathReference(e.unaryFilter.field);\n return FieldFilter.create(r, \"!=\" /* Operator.NOT_EQUAL */ , {\n doubleValue: NaN\n });\n\n case \"IS_NOT_NULL\":\n const i = __PRIVATE_fromFieldPathReference(e.unaryFilter.field);\n return FieldFilter.create(i, \"!=\" /* Operator.NOT_EQUAL */ , {\n nullValue: \"NULL_VALUE\"\n });\n\n default:\n return fail();\n }\n }(e) : void 0 !== e.fieldFilter ? function __PRIVATE_fromFieldFilter(e) {\n return FieldFilter.create(__PRIVATE_fromFieldPathReference(e.fieldFilter.field), function __PRIVATE_fromOperatorName(e) {\n switch (e) {\n case \"EQUAL\":\n return \"==\" /* Operator.EQUAL */;\n\n case \"NOT_EQUAL\":\n return \"!=\" /* Operator.NOT_EQUAL */;\n\n case \"GREATER_THAN\":\n return \">\" /* Operator.GREATER_THAN */;\n\n case \"GREATER_THAN_OR_EQUAL\":\n return \">=\" /* Operator.GREATER_THAN_OR_EQUAL */;\n\n case \"LESS_THAN\":\n return \"<\" /* Operator.LESS_THAN */;\n\n case \"LESS_THAN_OR_EQUAL\":\n return \"<=\" /* Operator.LESS_THAN_OR_EQUAL */;\n\n case \"ARRAY_CONTAINS\":\n return \"array-contains\" /* Operator.ARRAY_CONTAINS */;\n\n case \"IN\":\n return \"in\" /* Operator.IN */;\n\n case \"NOT_IN\":\n return \"not-in\" /* Operator.NOT_IN */;\n\n case \"ARRAY_CONTAINS_ANY\":\n return \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */;\n\n default:\n return fail();\n }\n }(e.fieldFilter.op), e.fieldFilter.value);\n }(e) : void 0 !== e.compositeFilter ? function __PRIVATE_fromCompositeFilter(e) {\n return CompositeFilter.create(e.compositeFilter.filters.map((e => __PRIVATE_fromFilter(e))), function __PRIVATE_fromCompositeOperatorName(e) {\n switch (e) {\n case \"AND\":\n return \"and\" /* CompositeOperator.AND */;\n\n case \"OR\":\n return \"or\" /* CompositeOperator.OR */;\n\n default:\n return fail();\n }\n }(e.compositeFilter.op));\n }(e) : fail();\n}\n\nfunction __PRIVATE_toDirection(e) {\n return Te[e];\n}\n\nfunction __PRIVATE_toOperatorName(e) {\n return Ee[e];\n}\n\nfunction __PRIVATE_toCompositeOperatorName(e) {\n return de[e];\n}\n\nfunction __PRIVATE_toFieldPathReference(e) {\n return {\n fieldPath: e.canonicalString()\n };\n}\n\nfunction __PRIVATE_fromFieldPathReference(e) {\n return FieldPath$1.fromServerFormat(e.fieldPath);\n}\n\nfunction __PRIVATE_toFilter(e) {\n return e instanceof FieldFilter ? function __PRIVATE_toUnaryOrFieldFilter(e) {\n if (\"==\" /* Operator.EQUAL */ === e.op) {\n if (__PRIVATE_isNanValue(e.value)) return {\n unaryFilter: {\n field: __PRIVATE_toFieldPathReference(e.field),\n op: \"IS_NAN\"\n }\n };\n if (__PRIVATE_isNullValue(e.value)) return {\n unaryFilter: {\n field: __PRIVATE_toFieldPathReference(e.field),\n op: \"IS_NULL\"\n }\n };\n } else if (\"!=\" /* Operator.NOT_EQUAL */ === e.op) {\n if (__PRIVATE_isNanValue(e.value)) return {\n unaryFilter: {\n field: __PRIVATE_toFieldPathReference(e.field),\n op: \"IS_NOT_NAN\"\n }\n };\n if (__PRIVATE_isNullValue(e.value)) return {\n unaryFilter: {\n field: __PRIVATE_toFieldPathReference(e.field),\n op: \"IS_NOT_NULL\"\n }\n };\n }\n return {\n fieldFilter: {\n field: __PRIVATE_toFieldPathReference(e.field),\n op: __PRIVATE_toOperatorName(e.op),\n value: e.value\n }\n };\n }(e) : e instanceof CompositeFilter ? function __PRIVATE_toCompositeFilter(e) {\n const t = e.getFilters().map((e => __PRIVATE_toFilter(e)));\n if (1 === t.length) return t[0];\n return {\n compositeFilter: {\n op: __PRIVATE_toCompositeOperatorName(e.op),\n filters: t\n }\n };\n }(e) : fail();\n}\n\nfunction __PRIVATE_toDocumentMask(e) {\n const t = [];\n return e.fields.forEach((e => t.push(e.canonicalString()))), {\n fieldPaths: t\n };\n}\n\nfunction __PRIVATE_isValidResourceName(e) {\n // Resource names have at least 4 components (project ID, database ID)\n return e.length >= 4 && \"projects\" === e.get(0) && \"databases\" === e.get(2);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An immutable set of metadata that the local store tracks for each target.\n */ class TargetData {\n constructor(\n /** The target being listened to. */\n e, \n /**\n * The target ID to which the target corresponds; Assigned by the\n * LocalStore for user listens and by the SyncEngine for limbo watches.\n */\n t, \n /** The purpose of the target. */\n n, \n /**\n * The sequence number of the last transaction during which this target data\n * was modified.\n */\n r, \n /** The latest snapshot version seen for this target. */\n i = SnapshotVersion.min()\n /**\n * The maximum snapshot version at which the associated view\n * contained no limbo documents.\n */ , s = SnapshotVersion.min()\n /**\n * An opaque, server-assigned token that allows watching a target to be\n * resumed after disconnecting without retransmitting all the data that\n * matches the target. The resume token essentially identifies a point in\n * time from which the server should resume sending results.\n */ , o = ByteString.EMPTY_BYTE_STRING\n /**\n * The number of documents that last matched the query at the resume token or\n * read time. Documents are counted only when making a listen request with\n * resume token or read time, otherwise, keep it null.\n */ , _ = null) {\n this.target = e, this.targetId = t, this.purpose = n, this.sequenceNumber = r, this.snapshotVersion = i, \n this.lastLimboFreeSnapshotVersion = s, this.resumeToken = o, this.expectedCount = _;\n }\n /** Creates a new target data instance with an updated sequence number. */ withSequenceNumber(e) {\n return new TargetData(this.target, this.targetId, this.purpose, e, this.snapshotVersion, this.lastLimboFreeSnapshotVersion, this.resumeToken, this.expectedCount);\n }\n /**\n * Creates a new target data instance with an updated resume token and\n * snapshot version.\n */ withResumeToken(e, t) {\n return new TargetData(this.target, this.targetId, this.purpose, this.sequenceNumber, t, this.lastLimboFreeSnapshotVersion, e, \n /* expectedCount= */ null);\n }\n /**\n * Creates a new target data instance with an updated expected count.\n */ withExpectedCount(e) {\n return new TargetData(this.target, this.targetId, this.purpose, this.sequenceNumber, this.snapshotVersion, this.lastLimboFreeSnapshotVersion, this.resumeToken, e);\n }\n /**\n * Creates a new target data instance with an updated last limbo free\n * snapshot version number.\n */ withLastLimboFreeSnapshotVersion(e) {\n return new TargetData(this.target, this.targetId, this.purpose, this.sequenceNumber, this.snapshotVersion, e, this.resumeToken, this.expectedCount);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Serializer for values stored in the LocalStore. */ class __PRIVATE_LocalSerializer {\n constructor(e) {\n this.ct = e;\n }\n}\n\n/** Decodes a remote document from storage locally to a Document. */ function __PRIVATE_fromDbRemoteDocument(e, t) {\n let n;\n if (t.document) n = __PRIVATE_fromDocument(e.ct, t.document, !!t.hasCommittedMutations); else if (t.noDocument) {\n const e = DocumentKey.fromSegments(t.noDocument.path), r = __PRIVATE_fromDbTimestamp(t.noDocument.readTime);\n n = MutableDocument.newNoDocument(e, r), t.hasCommittedMutations && n.setHasCommittedMutations();\n } else {\n if (!t.unknownDocument) return fail();\n {\n const e = DocumentKey.fromSegments(t.unknownDocument.path), r = __PRIVATE_fromDbTimestamp(t.unknownDocument.version);\n n = MutableDocument.newUnknownDocument(e, r);\n }\n }\n return t.readTime && n.setReadTime(function __PRIVATE_fromDbTimestampKey(e) {\n const t = new Timestamp(e[0], e[1]);\n return SnapshotVersion.fromTimestamp(t);\n }(t.readTime)), n;\n}\n\n/** Encodes a document for storage locally. */ function __PRIVATE_toDbRemoteDocument(e, t) {\n const n = t.key, r = {\n prefixPath: n.getCollectionPath().popLast().toArray(),\n collectionGroup: n.collectionGroup,\n documentId: n.path.lastSegment(),\n readTime: __PRIVATE_toDbTimestampKey(t.readTime),\n hasCommittedMutations: t.hasCommittedMutations\n };\n if (t.isFoundDocument()) r.document = function __PRIVATE_toDocument(e, t) {\n return {\n name: __PRIVATE_toName(e, t.key),\n fields: t.data.value.mapValue.fields,\n updateTime: toTimestamp(e, t.version.toTimestamp()),\n createTime: toTimestamp(e, t.createTime.toTimestamp())\n };\n }(e.ct, t); else if (t.isNoDocument()) r.noDocument = {\n path: n.path.toArray(),\n readTime: __PRIVATE_toDbTimestamp(t.version)\n }; else {\n if (!t.isUnknownDocument()) return fail();\n r.unknownDocument = {\n path: n.path.toArray(),\n version: __PRIVATE_toDbTimestamp(t.version)\n };\n }\n return r;\n}\n\nfunction __PRIVATE_toDbTimestampKey(e) {\n const t = e.toTimestamp();\n return [ t.seconds, t.nanoseconds ];\n}\n\nfunction __PRIVATE_toDbTimestamp(e) {\n const t = e.toTimestamp();\n return {\n seconds: t.seconds,\n nanoseconds: t.nanoseconds\n };\n}\n\nfunction __PRIVATE_fromDbTimestamp(e) {\n const t = new Timestamp(e.seconds, e.nanoseconds);\n return SnapshotVersion.fromTimestamp(t);\n}\n\n/** Encodes a batch of mutations into a DbMutationBatch for local storage. */\n/** Decodes a DbMutationBatch into a MutationBatch */\nfunction __PRIVATE_fromDbMutationBatch(e, t) {\n const n = (t.baseMutations || []).map((t => __PRIVATE_fromMutation(e.ct, t)));\n // Squash old transform mutations into existing patch or set mutations.\n // The replacement of representing `transforms` with `update_transforms`\n // on the SDK means that old `transform` mutations stored in IndexedDB need\n // to be updated to `update_transforms`.\n // TODO(b/174608374): Remove this code once we perform a schema migration.\n for (let e = 0; e < t.mutations.length - 1; ++e) {\n const n = t.mutations[e];\n if (e + 1 < t.mutations.length && void 0 !== t.mutations[e + 1].transform) {\n const r = t.mutations[e + 1];\n n.updateTransforms = r.transform.fieldTransforms, t.mutations.splice(e + 1, 1), \n ++e;\n }\n }\n const r = t.mutations.map((t => __PRIVATE_fromMutation(e.ct, t))), i = Timestamp.fromMillis(t.localWriteTimeMs);\n return new MutationBatch(t.batchId, i, n, r);\n}\n\n/** Decodes a DbTarget into TargetData */ function __PRIVATE_fromDbTarget(e) {\n const t = __PRIVATE_fromDbTimestamp(e.readTime), n = void 0 !== e.lastLimboFreeSnapshotVersion ? __PRIVATE_fromDbTimestamp(e.lastLimboFreeSnapshotVersion) : SnapshotVersion.min();\n let r;\n return r = \n /**\n * A helper function for figuring out what kind of query has been stored.\n */\n function __PRIVATE_isDocumentQuery(e) {\n return void 0 !== e.documents;\n }\n /** Encodes a DbBundle to a BundleMetadata object. */ (e.query) ? function __PRIVATE_fromDocumentsTarget(e) {\n return __PRIVATE_hardAssert(1 === e.documents.length), __PRIVATE_queryToTarget(__PRIVATE_newQueryForPath(__PRIVATE_fromQueryPath(e.documents[0])));\n }(e.query) : function __PRIVATE_fromQueryTarget(e) {\n return __PRIVATE_queryToTarget(__PRIVATE_convertQueryTargetToQuery(e));\n }(e.query), new TargetData(r, e.targetId, \"TargetPurposeListen\" /* TargetPurpose.Listen */ , e.lastListenSequenceNumber, t, n, ByteString.fromBase64String(e.resumeToken));\n}\n\n/** Encodes TargetData into a DbTarget for storage locally. */ function __PRIVATE_toDbTarget(e, t) {\n const n = __PRIVATE_toDbTimestamp(t.snapshotVersion), r = __PRIVATE_toDbTimestamp(t.lastLimboFreeSnapshotVersion);\n let i;\n i = __PRIVATE_targetIsDocumentTarget(t.target) ? __PRIVATE_toDocumentsTarget(e.ct, t.target) : __PRIVATE_toQueryTarget(e.ct, t.target)._t;\n // We can't store the resumeToken as a ByteString in IndexedDb, so we\n // convert it to a base64 string for storage.\n const s = t.resumeToken.toBase64();\n // lastListenSequenceNumber is always 0 until we do real GC.\n return {\n targetId: t.targetId,\n canonicalId: __PRIVATE_canonifyTarget(t.target),\n readTime: n,\n resumeToken: s,\n lastListenSequenceNumber: t.sequenceNumber,\n lastLimboFreeSnapshotVersion: r,\n query: i\n };\n}\n\n/**\n * Encodes a `BundledQuery` from bundle proto to a Query object.\n *\n * This reconstructs the original query used to build the bundle being loaded,\n * including features exists only in SDKs (for example: limit-to-last).\n */\nfunction __PRIVATE_fromBundledQuery(e) {\n const t = __PRIVATE_convertQueryTargetToQuery({\n parent: e.parent,\n structuredQuery: e.structuredQuery\n });\n return \"LAST\" === e.limitType ? __PRIVATE_queryWithLimit(t, t.limit, \"L\" /* LimitType.Last */) : t;\n}\n\n/** Encodes a NamedQuery proto object to a NamedQuery model object. */\n/** Encodes a DbDocumentOverlay object to an Overlay model object. */\nfunction __PRIVATE_fromDbDocumentOverlay(e, t) {\n return new Overlay(t.largestBatchId, __PRIVATE_fromMutation(e.ct, t.overlayMutation));\n}\n\n/** Decodes an Overlay model object into a DbDocumentOverlay object. */\n/**\n * Returns the DbDocumentOverlayKey corresponding to the given user and\n * document key.\n */\nfunction __PRIVATE_toDbDocumentOverlayKey(e, t) {\n const n = t.path.lastSegment();\n return [ e, __PRIVATE_encodeResourcePath(t.path.popLast()), n ];\n}\n\nfunction __PRIVATE_toDbIndexState(e, t, n, r) {\n return {\n indexId: e,\n uid: t,\n sequenceNumber: n,\n readTime: __PRIVATE_toDbTimestamp(r.readTime),\n documentKey: __PRIVATE_encodeResourcePath(r.documentKey.path),\n largestBatchId: r.largestBatchId\n };\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_IndexedDbBundleCache {\n getBundleMetadata(e, t) {\n return __PRIVATE_bundlesStore(e).get(t).next((e => {\n if (e) return function __PRIVATE_fromDbBundle(e) {\n return {\n id: e.bundleId,\n createTime: __PRIVATE_fromDbTimestamp(e.createTime),\n version: e.version\n };\n }\n /** Encodes a BundleMetadata to a DbBundle. */ (e);\n }));\n }\n saveBundleMetadata(e, t) {\n return __PRIVATE_bundlesStore(e).put(function __PRIVATE_toDbBundle(e) {\n return {\n bundleId: e.id,\n createTime: __PRIVATE_toDbTimestamp(__PRIVATE_fromVersion(e.createTime)),\n version: e.version\n };\n }\n /** Encodes a DbNamedQuery to a NamedQuery. */ (t));\n }\n getNamedQuery(e, t) {\n return __PRIVATE_namedQueriesStore(e).get(t).next((e => {\n if (e) return function __PRIVATE_fromDbNamedQuery(e) {\n return {\n name: e.name,\n query: __PRIVATE_fromBundledQuery(e.bundledQuery),\n readTime: __PRIVATE_fromDbTimestamp(e.readTime)\n };\n }\n /** Encodes a NamedQuery from a bundle proto to a DbNamedQuery. */ (e);\n }));\n }\n saveNamedQuery(e, t) {\n return __PRIVATE_namedQueriesStore(e).put(function __PRIVATE_toDbNamedQuery(e) {\n return {\n name: e.name,\n readTime: __PRIVATE_toDbTimestamp(__PRIVATE_fromVersion(e.readTime)),\n bundledQuery: e.bundledQuery\n };\n }(t));\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the bundles object store.\n */ function __PRIVATE_bundlesStore(e) {\n return __PRIVATE_getStore(e, \"bundles\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the namedQueries object store.\n */ function __PRIVATE_namedQueriesStore(e) {\n return __PRIVATE_getStore(e, \"namedQueries\");\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Implementation of DocumentOverlayCache using IndexedDb.\n */ class __PRIVATE_IndexedDbDocumentOverlayCache {\n /**\n * @param serializer - The document serializer.\n * @param userId - The userId for which we are accessing overlays.\n */\n constructor(e, t) {\n this.serializer = e, this.userId = t;\n }\n static lt(e, t) {\n const n = t.uid || \"\";\n return new __PRIVATE_IndexedDbDocumentOverlayCache(e, n);\n }\n getOverlay(e, t) {\n return __PRIVATE_documentOverlayStore(e).get(__PRIVATE_toDbDocumentOverlayKey(this.userId, t)).next((e => e ? __PRIVATE_fromDbDocumentOverlay(this.serializer, e) : null));\n }\n getOverlays(e, t) {\n const n = __PRIVATE_newOverlayMap();\n return PersistencePromise.forEach(t, (t => this.getOverlay(e, t).next((e => {\n null !== e && n.set(t, e);\n })))).next((() => n));\n }\n saveOverlays(e, t, n) {\n const r = [];\n return n.forEach(((n, i) => {\n const s = new Overlay(t, i);\n r.push(this.ht(e, s));\n })), PersistencePromise.waitFor(r);\n }\n removeOverlaysForBatchId(e, t, n) {\n const r = new Set;\n // Get the set of unique collection paths.\n t.forEach((e => r.add(__PRIVATE_encodeResourcePath(e.getCollectionPath()))));\n const i = [];\n return r.forEach((t => {\n const r = IDBKeyRange.bound([ this.userId, t, n ], [ this.userId, t, n + 1 ], \n /*lowerOpen=*/ !1, \n /*upperOpen=*/ !0);\n i.push(__PRIVATE_documentOverlayStore(e).j(\"collectionPathOverlayIndex\", r));\n })), PersistencePromise.waitFor(i);\n }\n getOverlaysForCollection(e, t, n) {\n const r = __PRIVATE_newOverlayMap(), i = __PRIVATE_encodeResourcePath(t), s = IDBKeyRange.bound([ this.userId, i, n ], [ this.userId, i, Number.POSITIVE_INFINITY ], \n /*lowerOpen=*/ !0);\n return __PRIVATE_documentOverlayStore(e).U(\"collectionPathOverlayIndex\", s).next((e => {\n for (const t of e) {\n const e = __PRIVATE_fromDbDocumentOverlay(this.serializer, t);\n r.set(e.getKey(), e);\n }\n return r;\n }));\n }\n getOverlaysForCollectionGroup(e, t, n, r) {\n const i = __PRIVATE_newOverlayMap();\n let s;\n // We want batch IDs larger than `sinceBatchId`, and so the lower bound\n // is not inclusive.\n const o = IDBKeyRange.bound([ this.userId, t, n ], [ this.userId, t, Number.POSITIVE_INFINITY ], \n /*lowerOpen=*/ !0);\n return __PRIVATE_documentOverlayStore(e).J({\n index: \"collectionGroupOverlayIndex\",\n range: o\n }, ((e, t, n) => {\n // We do not want to return partial batch overlays, even if the size\n // of the result set exceeds the given `count` argument. Therefore, we\n // continue to aggregate results even after the result size exceeds\n // `count` if there are more overlays from the `currentBatchId`.\n const o = __PRIVATE_fromDbDocumentOverlay(this.serializer, t);\n i.size() < r || o.largestBatchId === s ? (i.set(o.getKey(), o), s = o.largestBatchId) : n.done();\n })).next((() => i));\n }\n ht(e, t) {\n return __PRIVATE_documentOverlayStore(e).put(function __PRIVATE_toDbDocumentOverlay(e, t, n) {\n const [r, i, s] = __PRIVATE_toDbDocumentOverlayKey(t, n.mutation.key);\n return {\n userId: t,\n collectionPath: i,\n documentId: s,\n collectionGroup: n.mutation.key.getCollectionGroup(),\n largestBatchId: n.largestBatchId,\n overlayMutation: toMutation(e.ct, n.mutation)\n };\n }(this.serializer, this.userId, t));\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the document overlay object store.\n */ function __PRIVATE_documentOverlayStore(e) {\n return __PRIVATE_getStore(e, \"documentOverlays\");\n}\n\n/**\n * @license\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_IndexedDbGlobalsCache {\n Pt(e) {\n return __PRIVATE_getStore(e, \"globals\");\n }\n getSessionToken(e) {\n return this.Pt(e).get(\"sessionToken\").next((e => {\n const t = null == e ? void 0 : e.value;\n return t ? ByteString.fromUint8Array(t) : ByteString.EMPTY_BYTE_STRING;\n }));\n }\n setSessionToken(e, t) {\n return this.Pt(e).put({\n name: \"sessionToken\",\n value: t.toUint8Array()\n });\n }\n}\n\n/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// Note: This code is copied from the backend. Code that is not used by\n// Firestore was removed.\n/** Firestore index value writer. */\nclass __PRIVATE_FirestoreIndexValueWriter {\n constructor() {}\n // The write methods below short-circuit writing terminators for values\n // containing a (terminating) truncated value.\n // As an example, consider the resulting encoding for:\n // [\"bar\", [2, \"foo\"]] -> (STRING, \"bar\", TERM, ARRAY, NUMBER, 2, STRING, \"foo\", TERM, TERM, TERM)\n // [\"bar\", [2, truncated(\"foo\")]] -> (STRING, \"bar\", TERM, ARRAY, NUMBER, 2, STRING, \"foo\", TRUNC)\n // [\"bar\", truncated([\"foo\"])] -> (STRING, \"bar\", TERM, ARRAY. STRING, \"foo\", TERM, TRUNC)\n /** Writes an index value. */\n It(e, t) {\n this.Tt(e, t), \n // Write separator to split index values\n // (see go/firestore-storage-format#encodings).\n t.Et();\n }\n Tt(e, t) {\n if (\"nullValue\" in e) this.dt(t, 5); else if (\"booleanValue\" in e) this.dt(t, 10), \n t.At(e.booleanValue ? 1 : 0); else if (\"integerValue\" in e) this.dt(t, 15), t.At(__PRIVATE_normalizeNumber(e.integerValue)); else if (\"doubleValue\" in e) {\n const n = __PRIVATE_normalizeNumber(e.doubleValue);\n isNaN(n) ? this.dt(t, 13) : (this.dt(t, 15), __PRIVATE_isNegativeZero(n) ? \n // -0.0, 0 and 0.0 are all considered the same\n t.At(0) : t.At(n));\n } else if (\"timestampValue\" in e) {\n let n = e.timestampValue;\n this.dt(t, 20), \"string\" == typeof n && (n = __PRIVATE_normalizeTimestamp(n)), t.Rt(`${n.seconds || \"\"}`), \n t.At(n.nanos || 0);\n } else if (\"stringValue\" in e) this.Vt(e.stringValue, t), this.ft(t); else if (\"bytesValue\" in e) this.dt(t, 30), \n t.gt(__PRIVATE_normalizeByteString(e.bytesValue)), this.ft(t); else if (\"referenceValue\" in e) this.yt(e.referenceValue, t); else if (\"geoPointValue\" in e) {\n const n = e.geoPointValue;\n this.dt(t, 45), t.At(n.latitude || 0), t.At(n.longitude || 0);\n } else \"mapValue\" in e ? __PRIVATE_isMaxValue(e) ? this.dt(t, Number.MAX_SAFE_INTEGER) : __PRIVATE_isVectorValue(e) ? this.wt(e.mapValue, t) : (this.St(e.mapValue, t), \n this.ft(t)) : \"arrayValue\" in e ? (this.bt(e.arrayValue, t), this.ft(t)) : fail();\n }\n Vt(e, t) {\n this.dt(t, 25), this.Dt(e, t);\n }\n Dt(e, t) {\n t.Rt(e);\n }\n St(e, t) {\n const n = e.fields || {};\n this.dt(t, 55);\n for (const e of Object.keys(n)) this.Vt(e, t), this.Tt(n[e], t);\n }\n wt(e, t) {\n var n, r;\n const i = e.fields || {};\n this.dt(t, 53);\n // Vectors sort first by length\n const s = \"value\", o = (null === (r = null === (n = i[s].arrayValue) || void 0 === n ? void 0 : n.values) || void 0 === r ? void 0 : r.length) || 0;\n this.dt(t, 15), t.At(__PRIVATE_normalizeNumber(o)), \n // Vectors then sort by position value\n this.Vt(s, t), this.Tt(i[s], t);\n }\n bt(e, t) {\n const n = e.values || [];\n this.dt(t, 50);\n for (const e of n) this.Tt(e, t);\n }\n yt(e, t) {\n this.dt(t, 37);\n DocumentKey.fromName(e).path.forEach((e => {\n this.dt(t, 60), this.Dt(e, t);\n }));\n }\n dt(e, t) {\n e.At(t);\n }\n ft(e) {\n // While the SDK does not implement truncation, the truncation marker is\n // used to terminate all variable length values (which are strings, bytes,\n // references, arrays and maps).\n e.At(2);\n }\n}\n\n__PRIVATE_FirestoreIndexValueWriter.vt = new __PRIVATE_FirestoreIndexValueWriter;\n\n/**\n * Counts the number of zeros in a byte.\n *\n * Visible for testing.\n */\nfunction __PRIVATE_numberOfLeadingZerosInByte(e) {\n if (0 === e) return 8;\n let t = 0;\n return e >> 4 == 0 && (\n // Test if the first four bits are zero.\n t += 4, e <<= 4), e >> 6 == 0 && (\n // Test if the first two (or next two) bits are zero.\n t += 2, e <<= 2), e >> 7 == 0 && (\n // Test if the remaining bit is zero.\n t += 1), t;\n}\n\n/** Counts the number of leading zeros in the given byte array. */\n/**\n * Returns the number of bytes required to store \"value\". Leading zero bytes\n * are skipped.\n */\nfunction __PRIVATE_unsignedNumLength(e) {\n // This is just the number of bytes for the unsigned representation of the number.\n const t = 64 - function __PRIVATE_numberOfLeadingZeros(e) {\n let t = 0;\n for (let n = 0; n < 8; ++n) {\n const r = __PRIVATE_numberOfLeadingZerosInByte(255 & e[n]);\n if (t += r, 8 !== r) break;\n }\n return t;\n }(e);\n return Math.ceil(t / 8);\n}\n\n/**\n * OrderedCodeWriter is a minimal-allocation implementation of the writing\n * behavior defined by the backend.\n *\n * The code is ported from its Java counterpart.\n */ class __PRIVATE_OrderedCodeWriter {\n constructor() {\n this.buffer = new Uint8Array(1024), this.position = 0;\n }\n Ct(e) {\n const t = e[Symbol.iterator]();\n let n = t.next();\n for (;!n.done; ) this.Ft(n.value), n = t.next();\n this.Mt();\n }\n xt(e) {\n const t = e[Symbol.iterator]();\n let n = t.next();\n for (;!n.done; ) this.Ot(n.value), n = t.next();\n this.Nt();\n }\n /** Writes utf8 bytes into this byte sequence, ascending. */ Lt(e) {\n for (const t of e) {\n const e = t.charCodeAt(0);\n if (e < 128) this.Ft(e); else if (e < 2048) this.Ft(960 | e >>> 6), this.Ft(128 | 63 & e); else if (t < \"\\ud800\" || \"\\udbff\" < t) this.Ft(480 | e >>> 12), \n this.Ft(128 | 63 & e >>> 6), this.Ft(128 | 63 & e); else {\n const e = t.codePointAt(0);\n this.Ft(240 | e >>> 18), this.Ft(128 | 63 & e >>> 12), this.Ft(128 | 63 & e >>> 6), \n this.Ft(128 | 63 & e);\n }\n }\n this.Mt();\n }\n /** Writes utf8 bytes into this byte sequence, descending */ Bt(e) {\n for (const t of e) {\n const e = t.charCodeAt(0);\n if (e < 128) this.Ot(e); else if (e < 2048) this.Ot(960 | e >>> 6), this.Ot(128 | 63 & e); else if (t < \"\\ud800\" || \"\\udbff\" < t) this.Ot(480 | e >>> 12), \n this.Ot(128 | 63 & e >>> 6), this.Ot(128 | 63 & e); else {\n const e = t.codePointAt(0);\n this.Ot(240 | e >>> 18), this.Ot(128 | 63 & e >>> 12), this.Ot(128 | 63 & e >>> 6), \n this.Ot(128 | 63 & e);\n }\n }\n this.Nt();\n }\n kt(e) {\n // Values are encoded with a single byte length prefix, followed by the\n // actual value in big-endian format with leading 0 bytes dropped.\n const t = this.qt(e), n = __PRIVATE_unsignedNumLength(t);\n this.Qt(1 + n), this.buffer[this.position++] = 255 & n;\n // Write the length\n for (let e = t.length - n; e < t.length; ++e) this.buffer[this.position++] = 255 & t[e];\n }\n Kt(e) {\n // Values are encoded with a single byte length prefix, followed by the\n // inverted value in big-endian format with leading 0 bytes dropped.\n const t = this.qt(e), n = __PRIVATE_unsignedNumLength(t);\n this.Qt(1 + n), this.buffer[this.position++] = ~(255 & n);\n // Write the length\n for (let e = t.length - n; e < t.length; ++e) this.buffer[this.position++] = ~(255 & t[e]);\n }\n /**\n * Writes the \"infinity\" byte sequence that sorts after all other byte\n * sequences written in ascending order.\n */ $t() {\n this.Ut(255), this.Ut(255);\n }\n /**\n * Writes the \"infinity\" byte sequence that sorts before all other byte\n * sequences written in descending order.\n */ Wt() {\n this.Gt(255), this.Gt(255);\n }\n /**\n * Resets the buffer such that it is the same as when it was newly\n * constructed.\n */ reset() {\n this.position = 0;\n }\n seed(e) {\n this.Qt(e.length), this.buffer.set(e, this.position), this.position += e.length;\n }\n /** Makes a copy of the encoded bytes in this buffer. */ zt() {\n return this.buffer.slice(0, this.position);\n }\n /**\n * Encodes `val` into an encoding so that the order matches the IEEE 754\n * floating-point comparison results with the following exceptions:\n * -0.0 < 0.0\n * all non-NaN < NaN\n * NaN = NaN\n */ qt(e) {\n const t = \n /** Converts a JavaScript number to a byte array (using big endian encoding). */\n function __PRIVATE_doubleToLongBits(e) {\n const t = new DataView(new ArrayBuffer(8));\n return t.setFloat64(0, e, /* littleEndian= */ !1), new Uint8Array(t.buffer);\n }(e), n = 0 != (128 & t[0]);\n // Check if the first bit is set. We use a bit mask since value[0] is\n // encoded as a number from 0 to 255.\n // Revert the two complement to get natural ordering\n t[0] ^= n ? 255 : 128;\n for (let e = 1; e < t.length; ++e) t[e] ^= n ? 255 : 0;\n return t;\n }\n /** Writes a single byte ascending to the buffer. */ Ft(e) {\n const t = 255 & e;\n 0 === t ? (this.Ut(0), this.Ut(255)) : 255 === t ? (this.Ut(255), this.Ut(0)) : this.Ut(t);\n }\n /** Writes a single byte descending to the buffer. */ Ot(e) {\n const t = 255 & e;\n 0 === t ? (this.Gt(0), this.Gt(255)) : 255 === t ? (this.Gt(255), this.Gt(0)) : this.Gt(e);\n }\n Mt() {\n this.Ut(0), this.Ut(1);\n }\n Nt() {\n this.Gt(0), this.Gt(1);\n }\n Ut(e) {\n this.Qt(1), this.buffer[this.position++] = e;\n }\n Gt(e) {\n this.Qt(1), this.buffer[this.position++] = ~e;\n }\n Qt(e) {\n const t = e + this.position;\n if (t <= this.buffer.length) return;\n // Try doubling.\n let n = 2 * this.buffer.length;\n // Still not big enough? Just allocate the right size.\n n < t && (n = t);\n // Create the new buffer.\n const r = new Uint8Array(n);\n r.set(this.buffer), // copy old data\n this.buffer = r;\n }\n}\n\nclass __PRIVATE_AscendingIndexByteEncoder {\n constructor(e) {\n this.jt = e;\n }\n gt(e) {\n this.jt.Ct(e);\n }\n Rt(e) {\n this.jt.Lt(e);\n }\n At(e) {\n this.jt.kt(e);\n }\n Et() {\n this.jt.$t();\n }\n}\n\nclass __PRIVATE_DescendingIndexByteEncoder {\n constructor(e) {\n this.jt = e;\n }\n gt(e) {\n this.jt.xt(e);\n }\n Rt(e) {\n this.jt.Bt(e);\n }\n At(e) {\n this.jt.Kt(e);\n }\n Et() {\n this.jt.Wt();\n }\n}\n\n/**\n * Implements `DirectionalIndexByteEncoder` using `OrderedCodeWriter` for the\n * actual encoding.\n */ class __PRIVATE_IndexByteEncoder {\n constructor() {\n this.jt = new __PRIVATE_OrderedCodeWriter, this.Ht = new __PRIVATE_AscendingIndexByteEncoder(this.jt), \n this.Jt = new __PRIVATE_DescendingIndexByteEncoder(this.jt);\n }\n seed(e) {\n this.jt.seed(e);\n }\n Yt(e) {\n return 0 /* IndexKind.ASCENDING */ === e ? this.Ht : this.Jt;\n }\n zt() {\n return this.jt.zt();\n }\n reset() {\n this.jt.reset();\n }\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Represents an index entry saved by the SDK in persisted storage. */ class __PRIVATE_IndexEntry {\n constructor(e, t, n, r) {\n this.indexId = e, this.documentKey = t, this.arrayValue = n, this.directionalValue = r;\n }\n /**\n * Returns an IndexEntry entry that sorts immediately after the current\n * directional value.\n */ Zt() {\n const e = this.directionalValue.length, t = 0 === e || 255 === this.directionalValue[e - 1] ? e + 1 : e, n = new Uint8Array(t);\n return n.set(this.directionalValue, 0), t !== e ? n.set([ 0 ], this.directionalValue.length) : ++n[n.length - 1], \n new __PRIVATE_IndexEntry(this.indexId, this.documentKey, this.arrayValue, n);\n }\n}\n\nfunction __PRIVATE_indexEntryComparator(e, t) {\n let n = e.indexId - t.indexId;\n return 0 !== n ? n : (n = __PRIVATE_compareByteArrays(e.arrayValue, t.arrayValue), \n 0 !== n ? n : (n = __PRIVATE_compareByteArrays(e.directionalValue, t.directionalValue), \n 0 !== n ? n : DocumentKey.comparator(e.documentKey, t.documentKey)));\n}\n\nfunction __PRIVATE_compareByteArrays(e, t) {\n for (let n = 0; n < e.length && n < t.length; ++n) {\n const r = e[n] - t[n];\n if (0 !== r) return r;\n }\n return e.length - t.length;\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A light query planner for Firestore.\n *\n * This class matches a `FieldIndex` against a Firestore Query `Target`. It\n * determines whether a given index can be used to serve the specified target.\n *\n * The following table showcases some possible index configurations:\n *\n * Query | Index\n * -----------------------------------------------------------------------------\n * where('a', '==', 'a').where('b', '==', 'b') | a ASC, b DESC\n * where('a', '==', 'a').where('b', '==', 'b') | a ASC\n * where('a', '==', 'a').where('b', '==', 'b') | b DESC\n * where('a', '>=', 'a').orderBy('a') | a ASC\n * where('a', '>=', 'a').orderBy('a', 'desc') | a DESC\n * where('a', '>=', 'a').orderBy('a').orderBy('b') | a ASC, b ASC\n * where('a', '>=', 'a').orderBy('a').orderBy('b') | a ASC\n * where('a', 'array-contains', 'a').orderBy('b') | a CONTAINS, b ASCENDING\n * where('a', 'array-contains', 'a').orderBy('b') | a CONTAINS\n */ class __PRIVATE_TargetIndexMatcher {\n constructor(e) {\n // The inequality filters of the target (if it exists).\n // Note: The sort on FieldFilters is not required. Using SortedSet here just to utilize the custom\n // comparator.\n this.Xt = new SortedSet(((e, t) => FieldPath$1.comparator(e.field, t.field))), this.collectionId = null != e.collectionGroup ? e.collectionGroup : e.path.lastSegment(), \n this.en = e.orderBy, this.tn = [];\n for (const t of e.filters) {\n const e = t;\n e.isInequality() ? this.Xt = this.Xt.add(e) : this.tn.push(e);\n }\n }\n get nn() {\n return this.Xt.size > 1;\n }\n /**\n * Returns whether the index can be used to serve the TargetIndexMatcher's\n * target.\n *\n * An index is considered capable of serving the target when:\n * - The target uses all index segments for its filters and orderBy clauses.\n * The target can have additional filter and orderBy clauses, but not\n * fewer.\n * - If an ArrayContains/ArrayContainsAnyfilter is used, the index must also\n * have a corresponding `CONTAINS` segment.\n * - All directional index segments can be mapped to the target as a series of\n * equality filters, a single inequality filter and a series of orderBy\n * clauses.\n * - The segments that represent the equality filters may appear out of order.\n * - The optional segment for the inequality filter must appear after all\n * equality segments.\n * - The segments that represent that orderBy clause of the target must appear\n * in order after all equality and inequality segments. Single orderBy\n * clauses cannot be skipped, but a continuous orderBy suffix may be\n * omitted.\n */ rn(e) {\n if (__PRIVATE_hardAssert(e.collectionGroup === this.collectionId), this.nn) \n // Only single inequality is supported for now.\n // TODO(Add support for multiple inequality query): b/298441043\n return !1;\n // If there is an array element, find a matching filter.\n const t = __PRIVATE_fieldIndexGetArraySegment(e);\n if (void 0 !== t && !this.sn(t)) return !1;\n const n = __PRIVATE_fieldIndexGetDirectionalSegments(e);\n let r = new Set, i = 0, s = 0;\n // Process all equalities first. Equalities can appear out of order.\n for (;i < n.length && this.sn(n[i]); ++i) r = r.add(n[i].fieldPath.canonicalString());\n // If we already have processed all segments, all segments are used to serve\n // the equality filters and we do not need to map any segments to the\n // target's inequality and orderBy clauses.\n if (i === n.length) return !0;\n if (this.Xt.size > 0) {\n // Only a single inequality is currently supported. Get the only entry in the set.\n const e = this.Xt.getIterator().getNext();\n // If there is an inequality filter and the field was not in one of the\n // equality filters above, the next segment must match both the filter\n // and the first orderBy clause.\n if (!r.has(e.field.canonicalString())) {\n const t = n[i];\n if (!this.on(e, t) || !this._n(this.en[s++], t)) return !1;\n }\n ++i;\n }\n // All remaining segments need to represent the prefix of the target's\n // orderBy.\n for (;i < n.length; ++i) {\n const e = n[i];\n if (s >= this.en.length || !this._n(this.en[s++], e)) return !1;\n }\n return !0;\n }\n /**\n * Returns a full matched field index for this target. Currently multiple\n * inequality query is not supported so function returns null.\n */ an() {\n if (this.nn) return null;\n // We want to make sure only one segment created for one field. For example,\n // in case like a == 3 and a > 2, Index {a ASCENDING} will only be created\n // once.\n let e = new SortedSet(FieldPath$1.comparator);\n const t = [];\n for (const n of this.tn) {\n if (n.field.isKeyField()) continue;\n if (\"array-contains\" /* Operator.ARRAY_CONTAINS */ === n.op || \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ === n.op) t.push(new IndexSegment(n.field, 2 /* IndexKind.CONTAINS */)); else {\n if (e.has(n.field)) continue;\n e = e.add(n.field), t.push(new IndexSegment(n.field, 0 /* IndexKind.ASCENDING */));\n }\n }\n // Note: We do not explicitly check `this.inequalityFilter` but rather rely\n // on the target defining an appropriate \"order by\" to ensure that the\n // required index segment is added. The query engine would reject a query\n // with an inequality filter that lacks the required order-by clause.\n for (const n of this.en) \n // Stop adding more segments if we see a order-by on key. Typically this\n // is the default implicit order-by which is covered in the index_entry\n // table as a separate column. If it is not the default order-by, the\n // generated index will be missing some segments optimized for order-bys,\n // which is probably fine.\n n.field.isKeyField() || e.has(n.field) || (e = e.add(n.field), t.push(new IndexSegment(n.field, \"asc\" /* Direction.ASCENDING */ === n.dir ? 0 /* IndexKind.ASCENDING */ : 1 /* IndexKind.DESCENDING */)));\n return new FieldIndex(FieldIndex.UNKNOWN_ID, this.collectionId, t, IndexState.empty());\n }\n sn(e) {\n for (const t of this.tn) if (this.on(t, e)) return !0;\n return !1;\n }\n on(e, t) {\n if (void 0 === e || !e.field.isEqual(t.fieldPath)) return !1;\n const n = \"array-contains\" /* Operator.ARRAY_CONTAINS */ === e.op || \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ === e.op;\n return 2 /* IndexKind.CONTAINS */ === t.kind === n;\n }\n _n(e, t) {\n return !!e.field.isEqual(t.fieldPath) && (0 /* IndexKind.ASCENDING */ === t.kind && \"asc\" /* Direction.ASCENDING */ === e.dir || 1 /* IndexKind.DESCENDING */ === t.kind && \"desc\" /* Direction.DESCENDING */ === e.dir);\n }\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Provides utility functions that help with boolean logic transformations needed for handling\n * complex filters used in queries.\n */\n/**\n * The `in` filter is only a syntactic sugar over a disjunction of equalities. For instance: `a in\n * [1,2,3]` is in fact `a==1 || a==2 || a==3`. This method expands any `in` filter in the given\n * input into a disjunction of equality filters and returns the expanded filter.\n */ function __PRIVATE_computeInExpansion(e) {\n var t, n;\n if (__PRIVATE_hardAssert(e instanceof FieldFilter || e instanceof CompositeFilter), \n e instanceof FieldFilter) {\n if (e instanceof __PRIVATE_InFilter) {\n const r = (null === (n = null === (t = e.value.arrayValue) || void 0 === t ? void 0 : t.values) || void 0 === n ? void 0 : n.map((t => FieldFilter.create(e.field, \"==\" /* Operator.EQUAL */ , t)))) || [];\n return CompositeFilter.create(r, \"or\" /* CompositeOperator.OR */);\n }\n // We have reached other kinds of field filters.\n return e;\n }\n // We have a composite filter.\n const r = e.filters.map((e => __PRIVATE_computeInExpansion(e)));\n return CompositeFilter.create(r, e.op);\n}\n\n/**\n * Given a composite filter, returns the list of terms in its disjunctive normal form.\n *\n *

    Each element in the return value is one term of the resulting DNF. For instance: For the\n * input: (A || B) && C, the DNF form is: (A && C) || (B && C), and the return value is a list\n * with two elements: a composite filter that performs (A && C), and a composite filter that\n * performs (B && C).\n *\n * @param filter the composite filter to calculate DNF transform for.\n * @return the terms in the DNF transform.\n */ function __PRIVATE_getDnfTerms(e) {\n if (0 === e.getFilters().length) return [];\n const t = __PRIVATE_computeDistributedNormalForm(__PRIVATE_computeInExpansion(e));\n return __PRIVATE_hardAssert(__PRIVATE_isDisjunctiveNormalForm(t)), __PRIVATE_isSingleFieldFilter(t) || __PRIVATE_isFlatConjunction(t) ? [ t ] : t.getFilters();\n}\n\n/** Returns true if the given filter is a single field filter. e.g. (a == 10). */ function __PRIVATE_isSingleFieldFilter(e) {\n return e instanceof FieldFilter;\n}\n\n/**\n * Returns true if the given filter is the conjunction of one or more field filters. e.g. (a == 10\n * && b == 20)\n */ function __PRIVATE_isFlatConjunction(e) {\n return e instanceof CompositeFilter && __PRIVATE_compositeFilterIsFlatConjunction(e);\n}\n\n/**\n * Returns whether or not the given filter is in disjunctive normal form (DNF).\n *\n *

    In boolean logic, a disjunctive normal form (DNF) is a canonical normal form of a logical\n * formula consisting of a disjunction of conjunctions; it can also be described as an OR of ANDs.\n *\n *

    For more info, visit: https://en.wikipedia.org/wiki/Disjunctive_normal_form\n */ function __PRIVATE_isDisjunctiveNormalForm(e) {\n return __PRIVATE_isSingleFieldFilter(e) || __PRIVATE_isFlatConjunction(e) || \n /**\n * Returns true if the given filter is the disjunction of one or more \"flat conjunctions\" and\n * field filters. e.g. (a == 10) || (b==20 && c==30)\n */\n function __PRIVATE_isDisjunctionOfFieldFiltersAndFlatConjunctions(e) {\n if (e instanceof CompositeFilter && __PRIVATE_compositeFilterIsDisjunction(e)) {\n for (const t of e.getFilters()) if (!__PRIVATE_isSingleFieldFilter(t) && !__PRIVATE_isFlatConjunction(t)) return !1;\n return !0;\n }\n return !1;\n }(e);\n}\n\nfunction __PRIVATE_computeDistributedNormalForm(e) {\n if (__PRIVATE_hardAssert(e instanceof FieldFilter || e instanceof CompositeFilter), \n e instanceof FieldFilter) return e;\n if (1 === e.filters.length) return __PRIVATE_computeDistributedNormalForm(e.filters[0]);\n // Compute DNF for each of the subfilters first\n const t = e.filters.map((e => __PRIVATE_computeDistributedNormalForm(e)));\n let n = CompositeFilter.create(t, e.op);\n return n = __PRIVATE_applyAssociation(n), __PRIVATE_isDisjunctiveNormalForm(n) ? n : (__PRIVATE_hardAssert(n instanceof CompositeFilter), \n __PRIVATE_hardAssert(__PRIVATE_compositeFilterIsConjunction(n)), __PRIVATE_hardAssert(n.filters.length > 1), \n n.filters.reduce(((e, t) => __PRIVATE_applyDistribution(e, t))));\n}\n\nfunction __PRIVATE_applyDistribution(e, t) {\n let n;\n return __PRIVATE_hardAssert(e instanceof FieldFilter || e instanceof CompositeFilter), \n __PRIVATE_hardAssert(t instanceof FieldFilter || t instanceof CompositeFilter), \n // FieldFilter FieldFilter\n n = e instanceof FieldFilter ? t instanceof FieldFilter ? function __PRIVATE_applyDistributionFieldFilters(e, t) {\n // Conjunction distribution for two field filters is the conjunction of them.\n return CompositeFilter.create([ e, t ], \"and\" /* CompositeOperator.AND */);\n }(e, t) : __PRIVATE_applyDistributionFieldAndCompositeFilters(e, t) : t instanceof FieldFilter ? __PRIVATE_applyDistributionFieldAndCompositeFilters(t, e) : function __PRIVATE_applyDistributionCompositeFilters(e, t) {\n // There are four cases:\n // (A & B) & (C & D) --> (A & B & C & D)\n // (A & B) & (C | D) --> (A & B & C) | (A & B & D)\n // (A | B) & (C & D) --> (C & D & A) | (C & D & B)\n // (A | B) & (C | D) --> (A & C) | (A & D) | (B & C) | (B & D)\n // Case 1 is a merge.\n if (__PRIVATE_hardAssert(e.filters.length > 0 && t.filters.length > 0), __PRIVATE_compositeFilterIsConjunction(e) && __PRIVATE_compositeFilterIsConjunction(t)) return __PRIVATE_compositeFilterWithAddedFilters(e, t.getFilters());\n // Case 2,3,4 all have at least one side (lhs or rhs) that is a disjunction. In all three cases\n // we should take each element of the disjunction and distribute it over the other side, and\n // return the disjunction of the distribution results.\n const n = __PRIVATE_compositeFilterIsDisjunction(e) ? e : t, r = __PRIVATE_compositeFilterIsDisjunction(e) ? t : e, i = n.filters.map((e => __PRIVATE_applyDistribution(e, r)));\n return CompositeFilter.create(i, \"or\" /* CompositeOperator.OR */);\n }(e, t), __PRIVATE_applyAssociation(n);\n}\n\nfunction __PRIVATE_applyDistributionFieldAndCompositeFilters(e, t) {\n // There are two cases:\n // A & (B & C) --> (A & B & C)\n // A & (B | C) --> (A & B) | (A & C)\n if (__PRIVATE_compositeFilterIsConjunction(t)) \n // Case 1\n return __PRIVATE_compositeFilterWithAddedFilters(t, e.getFilters());\n {\n // Case 2\n const n = t.filters.map((t => __PRIVATE_applyDistribution(e, t)));\n return CompositeFilter.create(n, \"or\" /* CompositeOperator.OR */);\n }\n}\n\n/**\n * Applies the associativity property to the given filter and returns the resulting filter.\n *\n *

      \n *
    • A | (B | C) == (A | B) | C == (A | B | C)\n *
    • A & (B & C) == (A & B) & C == (A & B & C)\n *
    \n *\n *

    For more info, visit: https://en.wikipedia.org/wiki/Associative_property#Propositional_logic\n */ function __PRIVATE_applyAssociation(e) {\n if (__PRIVATE_hardAssert(e instanceof FieldFilter || e instanceof CompositeFilter), \n e instanceof FieldFilter) return e;\n const t = e.getFilters();\n // If the composite filter only contains 1 filter, apply associativity to it.\n if (1 === t.length) return __PRIVATE_applyAssociation(t[0]);\n // Associativity applied to a flat composite filter results is itself.\n if (__PRIVATE_compositeFilterIsFlat(e)) return e;\n // First apply associativity to all subfilters. This will in turn recursively apply\n // associativity to all nested composite filters and field filters.\n const n = t.map((e => __PRIVATE_applyAssociation(e))), r = [];\n // For composite subfilters that perform the same kind of logical operation as `compositeFilter`\n // take out their filters and add them to `compositeFilter`. For example:\n // compositeFilter = (A | (B | C | D))\n // compositeSubfilter = (B | C | D)\n // Result: (A | B | C | D)\n // Note that the `compositeSubfilter` has been eliminated, and its filters (B, C, D) have been\n // added to the top-level \"compositeFilter\".\n return n.forEach((t => {\n t instanceof FieldFilter ? r.push(t) : t instanceof CompositeFilter && (t.op === e.op ? \n // compositeFilter: (A | (B | C))\n // compositeSubfilter: (B | C)\n // Result: (A | B | C)\n r.push(...t.filters) : \n // compositeFilter: (A | (B & C))\n // compositeSubfilter: (B & C)\n // Result: (A | (B & C))\n r.push(t));\n })), 1 === r.length ? r[0] : CompositeFilter.create(r, e.op);\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An in-memory implementation of IndexManager.\n */ class __PRIVATE_MemoryIndexManager {\n constructor() {\n this.un = new __PRIVATE_MemoryCollectionParentIndex;\n }\n addToCollectionParentIndex(e, t) {\n return this.un.add(t), PersistencePromise.resolve();\n }\n getCollectionParents(e, t) {\n return PersistencePromise.resolve(this.un.getEntries(t));\n }\n addFieldIndex(e, t) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n deleteFieldIndex(e, t) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n deleteAllFieldIndexes(e) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n createTargetIndexes(e, t) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n getDocumentsMatchingTarget(e, t) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve(null);\n }\n getIndexType(e, t) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve(0 /* IndexType.NONE */);\n }\n getFieldIndexes(e, t) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve([]);\n }\n getNextCollectionGroupToUpdate(e) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve(null);\n }\n getMinOffset(e, t) {\n return PersistencePromise.resolve(IndexOffset.min());\n }\n getMinOffsetFromCollectionGroup(e, t) {\n return PersistencePromise.resolve(IndexOffset.min());\n }\n updateCollectionGroup(e, t, n) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n updateIndexEntries(e, t) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n}\n\n/**\n * Internal implementation of the collection-parent index exposed by MemoryIndexManager.\n * Also used for in-memory caching by IndexedDbIndexManager and initial index population\n * in indexeddb_schema.ts\n */ class __PRIVATE_MemoryCollectionParentIndex {\n constructor() {\n this.index = {};\n }\n // Returns false if the entry already existed.\n add(e) {\n const t = e.lastSegment(), n = e.popLast(), r = this.index[t] || new SortedSet(ResourcePath.comparator), i = !r.has(n);\n return this.index[t] = r.add(n), i;\n }\n has(e) {\n const t = e.lastSegment(), n = e.popLast(), r = this.index[t];\n return r && r.has(n);\n }\n getEntries(e) {\n return (this.index[e] || new SortedSet(ResourcePath.comparator)).toArray();\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const Ae = new Uint8Array(0);\n\n/**\n * A persisted implementation of IndexManager.\n *\n * PORTING NOTE: Unlike iOS and Android, the Web SDK does not memoize index\n * data as it supports multi-tab access.\n */\nclass __PRIVATE_IndexedDbIndexManager {\n constructor(e, t) {\n this.databaseId = t, \n /**\n * An in-memory copy of the index entries we've already written since the SDK\n * launched. Used to avoid re-writing the same entry repeatedly.\n *\n * This is *NOT* a complete cache of what's in persistence and so can never be\n * used to satisfy reads.\n */\n this.cn = new __PRIVATE_MemoryCollectionParentIndex, \n /**\n * Maps from a target to its equivalent list of sub-targets. Each sub-target\n * contains only one term from the target's disjunctive normal form (DNF).\n */\n this.ln = new ObjectMap((e => __PRIVATE_canonifyTarget(e)), ((e, t) => __PRIVATE_targetEquals(e, t))), \n this.uid = e.uid || \"\";\n }\n /**\n * Adds a new entry to the collection parent index.\n *\n * Repeated calls for the same collectionPath should be avoided within a\n * transaction as IndexedDbIndexManager only caches writes once a transaction\n * has been committed.\n */ addToCollectionParentIndex(e, t) {\n if (!this.cn.has(t)) {\n const n = t.lastSegment(), r = t.popLast();\n e.addOnCommittedListener((() => {\n // Add the collection to the in memory cache only if the transaction was\n // successfully committed.\n this.cn.add(t);\n }));\n const i = {\n collectionId: n,\n parent: __PRIVATE_encodeResourcePath(r)\n };\n return __PRIVATE_collectionParentsStore(e).put(i);\n }\n return PersistencePromise.resolve();\n }\n getCollectionParents(e, t) {\n const n = [], r = IDBKeyRange.bound([ t, \"\" ], [ __PRIVATE_immediateSuccessor(t), \"\" ], \n /*lowerOpen=*/ !1, \n /*upperOpen=*/ !0);\n return __PRIVATE_collectionParentsStore(e).U(r).next((e => {\n for (const r of e) {\n // This collectionId guard shouldn't be necessary (and isn't as long\n // as we're running in a real browser), but there's a bug in\n // indexeddbshim that breaks our range in our tests running in node:\n // https://github.com/axemclion/IndexedDBShim/issues/334\n if (r.collectionId !== t) break;\n n.push(__PRIVATE_decodeResourcePath(r.parent));\n }\n return n;\n }));\n }\n addFieldIndex(e, t) {\n // TODO(indexing): Verify that the auto-incrementing index ID works in\n // Safari & Firefox.\n const n = __PRIVATE_indexConfigurationStore(e), r = function __PRIVATE_toDbIndexConfiguration(e) {\n return {\n indexId: e.indexId,\n collectionGroup: e.collectionGroup,\n fields: e.fields.map((e => [ e.fieldPath.canonicalString(), e.kind ]))\n };\n }(t);\n delete r.indexId;\n // `indexId` is auto-populated by IndexedDb\n const i = n.add(r);\n if (t.indexState) {\n const n = __PRIVATE_indexStateStore(e);\n return i.next((e => {\n n.put(__PRIVATE_toDbIndexState(e, this.uid, t.indexState.sequenceNumber, t.indexState.offset));\n }));\n }\n return i.next();\n }\n deleteFieldIndex(e, t) {\n const n = __PRIVATE_indexConfigurationStore(e), r = __PRIVATE_indexStateStore(e), i = __PRIVATE_indexEntriesStore(e);\n return n.delete(t.indexId).next((() => r.delete(IDBKeyRange.bound([ t.indexId ], [ t.indexId + 1 ], \n /*lowerOpen=*/ !1, \n /*upperOpen=*/ !0)))).next((() => i.delete(IDBKeyRange.bound([ t.indexId ], [ t.indexId + 1 ], \n /*lowerOpen=*/ !1, \n /*upperOpen=*/ !0))));\n }\n deleteAllFieldIndexes(e) {\n const t = __PRIVATE_indexConfigurationStore(e), n = __PRIVATE_indexEntriesStore(e), r = __PRIVATE_indexStateStore(e);\n return t.j().next((() => n.j())).next((() => r.j()));\n }\n createTargetIndexes(e, t) {\n return PersistencePromise.forEach(this.hn(t), (t => this.getIndexType(e, t).next((n => {\n if (0 /* IndexType.NONE */ === n || 1 /* IndexType.PARTIAL */ === n) {\n const n = new __PRIVATE_TargetIndexMatcher(t).an();\n if (null != n) return this.addFieldIndex(e, n);\n }\n }))));\n }\n getDocumentsMatchingTarget(e, t) {\n const n = __PRIVATE_indexEntriesStore(e);\n let r = !0;\n const i = new Map;\n return PersistencePromise.forEach(this.hn(t), (t => this.Pn(e, t).next((e => {\n r && (r = !!e), i.set(t, e);\n })))).next((() => {\n if (r) {\n let e = __PRIVATE_documentKeySet();\n const r = [];\n return PersistencePromise.forEach(i, ((i, s) => {\n __PRIVATE_logDebug(\"IndexedDbIndexManager\", `Using index ${function __PRIVATE_fieldIndexToString(e) {\n return `id=${e.indexId}|cg=${e.collectionGroup}|f=${e.fields.map((e => `${e.fieldPath}:${e.kind}`)).join(\",\")}`;\n }(i)} to execute ${__PRIVATE_canonifyTarget(t)}`);\n const o = function __PRIVATE_targetGetArrayValues(e, t) {\n const n = __PRIVATE_fieldIndexGetArraySegment(t);\n if (void 0 === n) return null;\n for (const t of __PRIVATE_targetGetFieldFiltersForPath(e, n.fieldPath)) switch (t.op) {\n case \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ :\n return t.value.arrayValue.values || [];\n\n case \"array-contains\" /* Operator.ARRAY_CONTAINS */ :\n return [ t.value ];\n // Remaining filters are not array filters.\n }\n return null;\n }\n /**\n * Returns the list of values that are used in != or NOT_IN filters. Returns\n * `null` if there are no such filters.\n */ (s, i), _ = function __PRIVATE_targetGetNotInValues(e, t) {\n const n = new Map;\n for (const r of __PRIVATE_fieldIndexGetDirectionalSegments(t)) for (const t of __PRIVATE_targetGetFieldFiltersForPath(e, r.fieldPath)) switch (t.op) {\n case \"==\" /* Operator.EQUAL */ :\n case \"in\" /* Operator.IN */ :\n // Encode equality prefix, which is encoded in the index value before\n // the inequality (e.g. `a == 'a' && b != 'b'` is encoded to\n // `value != 'ab'`).\n n.set(r.fieldPath.canonicalString(), t.value);\n break;\n\n case \"not-in\" /* Operator.NOT_IN */ :\n case \"!=\" /* Operator.NOT_EQUAL */ :\n // NotIn/NotEqual is always a suffix. There cannot be any remaining\n // segments and hence we can return early here.\n return n.set(r.fieldPath.canonicalString(), t.value), Array.from(n.values());\n // Remaining filters cannot be used as notIn bounds.\n }\n return null;\n }\n /**\n * Returns a lower bound of field values that can be used as a starting point to\n * scan the index defined by `fieldIndex`. Returns `MIN_VALUE` if no lower bound\n * exists.\n */ (s, i), a = function __PRIVATE_targetGetLowerBound(e, t) {\n const n = [];\n let r = !0;\n // For each segment, retrieve a lower bound if there is a suitable filter or\n // startAt.\n for (const i of __PRIVATE_fieldIndexGetDirectionalSegments(t)) {\n const t = 0 /* IndexKind.ASCENDING */ === i.kind ? __PRIVATE_targetGetAscendingBound(e, i.fieldPath, e.startAt) : __PRIVATE_targetGetDescendingBound(e, i.fieldPath, e.startAt);\n n.push(t.value), r && (r = t.inclusive);\n }\n return new Bound(n, r);\n }\n /**\n * Returns an upper bound of field values that can be used as an ending point\n * when scanning the index defined by `fieldIndex`. Returns `MAX_VALUE` if no\n * upper bound exists.\n */ (s, i), u = function __PRIVATE_targetGetUpperBound(e, t) {\n const n = [];\n let r = !0;\n // For each segment, retrieve an upper bound if there is a suitable filter or\n // endAt.\n for (const i of __PRIVATE_fieldIndexGetDirectionalSegments(t)) {\n const t = 0 /* IndexKind.ASCENDING */ === i.kind ? __PRIVATE_targetGetDescendingBound(e, i.fieldPath, e.endAt) : __PRIVATE_targetGetAscendingBound(e, i.fieldPath, e.endAt);\n n.push(t.value), r && (r = t.inclusive);\n }\n return new Bound(n, r);\n }(s, i), c = this.In(i, s, a), l = this.In(i, s, u), h = this.Tn(i, s, _), P = this.En(i.indexId, o, c, a.inclusive, l, u.inclusive, h);\n return PersistencePromise.forEach(P, (i => n.G(i, t.limit).next((t => {\n t.forEach((t => {\n const n = DocumentKey.fromSegments(t.documentKey);\n e.has(n) || (e = e.add(n), r.push(n));\n }));\n }))));\n })).next((() => r));\n }\n return PersistencePromise.resolve(null);\n }));\n }\n hn(e) {\n let t = this.ln.get(e);\n if (t) return t;\n if (0 === e.filters.length) t = [ e ]; else {\n t = __PRIVATE_getDnfTerms(CompositeFilter.create(e.filters, \"and\" /* CompositeOperator.AND */)).map((t => __PRIVATE_newTarget(e.path, e.collectionGroup, e.orderBy, t.getFilters(), e.limit, e.startAt, e.endAt)));\n }\n return this.ln.set(e, t), t;\n }\n /**\n * Constructs a key range query on `DbIndexEntryStore` that unions all\n * bounds.\n */ En(e, t, n, r, i, s, o) {\n // The number of total index scans we union together. This is similar to a\n // distributed normal form, but adapted for array values. We create a single\n // index range per value in an ARRAY_CONTAINS or ARRAY_CONTAINS_ANY filter\n // combined with the values from the query bounds.\n const _ = (null != t ? t.length : 1) * Math.max(n.length, i.length), a = _ / (null != t ? t.length : 1), u = [];\n for (let c = 0; c < _; ++c) {\n const _ = t ? this.dn(t[c / a]) : Ae, l = this.An(e, _, n[c % a], r), h = this.Rn(e, _, i[c % a], s), P = o.map((t => this.An(e, _, t, \n /* inclusive= */ !0)));\n u.push(...this.createRange(l, h, P));\n }\n return u;\n }\n /** Generates the lower bound for `arrayValue` and `directionalValue`. */ An(e, t, n, r) {\n const i = new __PRIVATE_IndexEntry(e, DocumentKey.empty(), t, n);\n return r ? i : i.Zt();\n }\n /** Generates the upper bound for `arrayValue` and `directionalValue`. */ Rn(e, t, n, r) {\n const i = new __PRIVATE_IndexEntry(e, DocumentKey.empty(), t, n);\n return r ? i.Zt() : i;\n }\n Pn(e, t) {\n const n = new __PRIVATE_TargetIndexMatcher(t), r = null != t.collectionGroup ? t.collectionGroup : t.path.lastSegment();\n return this.getFieldIndexes(e, r).next((e => {\n // Return the index with the most number of segments.\n let t = null;\n for (const r of e) {\n n.rn(r) && (!t || r.fields.length > t.fields.length) && (t = r);\n }\n return t;\n }));\n }\n getIndexType(e, t) {\n let n = 2 /* IndexType.FULL */;\n const r = this.hn(t);\n return PersistencePromise.forEach(r, (t => this.Pn(e, t).next((e => {\n e ? 0 /* IndexType.NONE */ !== n && e.fields.length < function __PRIVATE_targetGetSegmentCount(e) {\n let t = new SortedSet(FieldPath$1.comparator), n = !1;\n for (const r of e.filters) for (const e of r.getFlattenedFilters()) \n // __name__ is not an explicit segment of any index, so we don't need to\n // count it.\n e.field.isKeyField() || (\n // ARRAY_CONTAINS or ARRAY_CONTAINS_ANY filters must be counted separately.\n // For instance, it is possible to have an index for \"a ARRAY a ASC\". Even\n // though these are on the same field, they should be counted as two\n // separate segments in an index.\n \"array-contains\" /* Operator.ARRAY_CONTAINS */ === e.op || \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ === e.op ? n = !0 : t = t.add(e.field));\n for (const n of e.orderBy) \n // __name__ is not an explicit segment of any index, so we don't need to\n // count it.\n n.field.isKeyField() || (t = t.add(n.field));\n return t.size + (n ? 1 : 0);\n }(t) && (n = 1 /* IndexType.PARTIAL */) : n = 0 /* IndexType.NONE */;\n })))).next((() => \n // OR queries have more than one sub-target (one sub-target per DNF term). We currently consider\n // OR queries that have a `limit` to have a partial index. For such queries we perform sorting\n // and apply the limit in memory as a post-processing step.\n function __PRIVATE_targetHasLimit(e) {\n return null !== e.limit;\n }(t) && r.length > 1 && 2 /* IndexType.FULL */ === n ? 1 /* IndexType.PARTIAL */ : n));\n }\n /**\n * Returns the byte encoded form of the directional values in the field index.\n * Returns `null` if the document does not have all fields specified in the\n * index.\n */ Vn(e, t) {\n const n = new __PRIVATE_IndexByteEncoder;\n for (const r of __PRIVATE_fieldIndexGetDirectionalSegments(e)) {\n const e = t.data.field(r.fieldPath);\n if (null == e) return null;\n const i = n.Yt(r.kind);\n __PRIVATE_FirestoreIndexValueWriter.vt.It(e, i);\n }\n return n.zt();\n }\n /** Encodes a single value to the ascending index format. */ dn(e) {\n const t = new __PRIVATE_IndexByteEncoder;\n return __PRIVATE_FirestoreIndexValueWriter.vt.It(e, t.Yt(0 /* IndexKind.ASCENDING */)), \n t.zt();\n }\n /**\n * Returns an encoded form of the document key that sorts based on the key\n * ordering of the field index.\n */ mn(e, t) {\n const n = new __PRIVATE_IndexByteEncoder;\n return __PRIVATE_FirestoreIndexValueWriter.vt.It(__PRIVATE_refValue(this.databaseId, t), n.Yt(function __PRIVATE_fieldIndexGetKeyOrder(e) {\n const t = __PRIVATE_fieldIndexGetDirectionalSegments(e);\n return 0 === t.length ? 0 /* IndexKind.ASCENDING */ : t[t.length - 1].kind;\n }(e))), n.zt();\n }\n /**\n * Encodes the given field values according to the specification in `target`.\n * For IN queries, a list of possible values is returned.\n */ Tn(e, t, n) {\n if (null === n) return [];\n let r = [];\n r.push(new __PRIVATE_IndexByteEncoder);\n let i = 0;\n for (const s of __PRIVATE_fieldIndexGetDirectionalSegments(e)) {\n const e = n[i++];\n for (const n of r) if (this.fn(t, s.fieldPath) && isArray(e)) r = this.gn(r, s, e); else {\n const t = n.Yt(s.kind);\n __PRIVATE_FirestoreIndexValueWriter.vt.It(e, t);\n }\n }\n return this.pn(r);\n }\n /**\n * Encodes the given bounds according to the specification in `target`. For IN\n * queries, a list of possible values is returned.\n */ In(e, t, n) {\n return this.Tn(e, t, n.position);\n }\n /** Returns the byte representation for the provided encoders. */ pn(e) {\n const t = [];\n for (let n = 0; n < e.length; ++n) t[n] = e[n].zt();\n return t;\n }\n /**\n * Creates a separate encoder for each element of an array.\n *\n * The method appends each value to all existing encoders (e.g. filter(\"a\",\n * \"==\", \"a1\").filter(\"b\", \"in\", [\"b1\", \"b2\"]) becomes [\"a1,b1\", \"a1,b2\"]). A\n * list of new encoders is returned.\n */ gn(e, t, n) {\n const r = [ ...e ], i = [];\n for (const e of n.arrayValue.values || []) for (const n of r) {\n const r = new __PRIVATE_IndexByteEncoder;\n r.seed(n.zt()), __PRIVATE_FirestoreIndexValueWriter.vt.It(e, r.Yt(t.kind)), i.push(r);\n }\n return i;\n }\n fn(e, t) {\n return !!e.filters.find((e => e instanceof FieldFilter && e.field.isEqual(t) && (\"in\" /* Operator.IN */ === e.op || \"not-in\" /* Operator.NOT_IN */ === e.op)));\n }\n getFieldIndexes(e, t) {\n const n = __PRIVATE_indexConfigurationStore(e), r = __PRIVATE_indexStateStore(e);\n return (t ? n.U(\"collectionGroupIndex\", IDBKeyRange.bound(t, t)) : n.U()).next((e => {\n const t = [];\n return PersistencePromise.forEach(e, (e => r.get([ e.indexId, this.uid ]).next((n => {\n t.push(function __PRIVATE_fromDbIndexConfiguration(e, t) {\n const n = t ? new IndexState(t.sequenceNumber, new IndexOffset(__PRIVATE_fromDbTimestamp(t.readTime), new DocumentKey(__PRIVATE_decodeResourcePath(t.documentKey)), t.largestBatchId)) : IndexState.empty(), r = e.fields.map((([e, t]) => new IndexSegment(FieldPath$1.fromServerFormat(e), t)));\n return new FieldIndex(e.indexId, e.collectionGroup, r, n);\n }(e, n));\n })))).next((() => t));\n }));\n }\n getNextCollectionGroupToUpdate(e) {\n return this.getFieldIndexes(e).next((e => 0 === e.length ? null : (e.sort(((e, t) => {\n const n = e.indexState.sequenceNumber - t.indexState.sequenceNumber;\n return 0 !== n ? n : __PRIVATE_primitiveComparator(e.collectionGroup, t.collectionGroup);\n })), e[0].collectionGroup)));\n }\n updateCollectionGroup(e, t, n) {\n const r = __PRIVATE_indexConfigurationStore(e), i = __PRIVATE_indexStateStore(e);\n return this.yn(e).next((e => r.U(\"collectionGroupIndex\", IDBKeyRange.bound(t, t)).next((t => PersistencePromise.forEach(t, (t => i.put(__PRIVATE_toDbIndexState(t.indexId, this.uid, e, n))))))));\n }\n updateIndexEntries(e, t) {\n // Porting Note: `getFieldIndexes()` on Web does not cache index lookups as\n // it could be used across different IndexedDB transactions. As any cached\n // data might be invalidated by other multi-tab clients, we can only trust\n // data within a single IndexedDB transaction. We therefore add a cache\n // here.\n const n = new Map;\n return PersistencePromise.forEach(t, ((t, r) => {\n const i = n.get(t.collectionGroup);\n return (i ? PersistencePromise.resolve(i) : this.getFieldIndexes(e, t.collectionGroup)).next((i => (n.set(t.collectionGroup, i), \n PersistencePromise.forEach(i, (n => this.wn(e, t, n).next((t => {\n const i = this.Sn(r, n);\n return t.isEqual(i) ? PersistencePromise.resolve() : this.bn(e, r, n, t, i);\n })))))));\n }));\n }\n Dn(e, t, n, r) {\n return __PRIVATE_indexEntriesStore(e).put({\n indexId: r.indexId,\n uid: this.uid,\n arrayValue: r.arrayValue,\n directionalValue: r.directionalValue,\n orderedDocumentKey: this.mn(n, t.key),\n documentKey: t.key.path.toArray()\n });\n }\n vn(e, t, n, r) {\n return __PRIVATE_indexEntriesStore(e).delete([ r.indexId, this.uid, r.arrayValue, r.directionalValue, this.mn(n, t.key), t.key.path.toArray() ]);\n }\n wn(e, t, n) {\n const r = __PRIVATE_indexEntriesStore(e);\n let i = new SortedSet(__PRIVATE_indexEntryComparator);\n return r.J({\n index: \"documentKeyIndex\",\n range: IDBKeyRange.only([ n.indexId, this.uid, this.mn(n, t) ])\n }, ((e, r) => {\n i = i.add(new __PRIVATE_IndexEntry(n.indexId, t, r.arrayValue, r.directionalValue));\n })).next((() => i));\n }\n /** Creates the index entries for the given document. */ Sn(e, t) {\n let n = new SortedSet(__PRIVATE_indexEntryComparator);\n const r = this.Vn(t, e);\n if (null == r) return n;\n const i = __PRIVATE_fieldIndexGetArraySegment(t);\n if (null != i) {\n const s = e.data.field(i.fieldPath);\n if (isArray(s)) for (const i of s.arrayValue.values || []) n = n.add(new __PRIVATE_IndexEntry(t.indexId, e.key, this.dn(i), r));\n } else n = n.add(new __PRIVATE_IndexEntry(t.indexId, e.key, Ae, r));\n return n;\n }\n /**\n * Updates the index entries for the provided document by deleting entries\n * that are no longer referenced in `newEntries` and adding all newly added\n * entries.\n */ bn(e, t, n, r, i) {\n __PRIVATE_logDebug(\"IndexedDbIndexManager\", \"Updating index entries for document '%s'\", t.key);\n const s = [];\n return function __PRIVATE_diffSortedSets(e, t, n, r, i) {\n const s = e.getIterator(), o = t.getIterator();\n let _ = __PRIVATE_advanceIterator(s), a = __PRIVATE_advanceIterator(o);\n // Walk through the two sets at the same time, using the ordering defined by\n // `comparator`.\n for (;_ || a; ) {\n let e = !1, t = !1;\n if (_ && a) {\n const r = n(_, a);\n r < 0 ? \n // The element was removed if the next element in our ordered\n // walkthrough is only in `before`.\n t = !0 : r > 0 && (\n // The element was added if the next element in our ordered walkthrough\n // is only in `after`.\n e = !0);\n } else null != _ ? t = !0 : e = !0;\n e ? (r(a), a = __PRIVATE_advanceIterator(o)) : t ? (i(_), _ = __PRIVATE_advanceIterator(s)) : (_ = __PRIVATE_advanceIterator(s), \n a = __PRIVATE_advanceIterator(o));\n }\n }(r, i, __PRIVATE_indexEntryComparator, (\n /* onAdd= */ r => {\n s.push(this.Dn(e, t, n, r));\n }), (\n /* onRemove= */ r => {\n s.push(this.vn(e, t, n, r));\n })), PersistencePromise.waitFor(s);\n }\n yn(e) {\n let t = 1;\n return __PRIVATE_indexStateStore(e).J({\n index: \"sequenceNumberIndex\",\n reverse: !0,\n range: IDBKeyRange.upperBound([ this.uid, Number.MAX_SAFE_INTEGER ])\n }, ((e, n, r) => {\n r.done(), t = n.sequenceNumber + 1;\n })).next((() => t));\n }\n /**\n * Returns a new set of IDB ranges that splits the existing range and excludes\n * any values that match the `notInValue` from these ranges. As an example,\n * '[foo > 2 && foo != 3]` becomes `[foo > 2 && < 3, foo > 3]`.\n */ createRange(e, t, n) {\n // The notIn values need to be sorted and unique so that we can return a\n // sorted set of non-overlapping ranges.\n n = n.sort(((e, t) => __PRIVATE_indexEntryComparator(e, t))).filter(((e, t, n) => !t || 0 !== __PRIVATE_indexEntryComparator(e, n[t - 1])));\n const r = [];\n r.push(e);\n for (const i of n) {\n const n = __PRIVATE_indexEntryComparator(i, e), s = __PRIVATE_indexEntryComparator(i, t);\n if (0 === n) \n // `notInValue` is the lower bound. We therefore need to raise the bound\n // to the next value.\n r[0] = e.Zt(); else if (n > 0 && s < 0) \n // `notInValue` is in the middle of the range\n r.push(i), r.push(i.Zt()); else if (s > 0) \n // `notInValue` (and all following values) are out of the range\n break;\n }\n r.push(t);\n const i = [];\n for (let e = 0; e < r.length; e += 2) {\n // If we encounter two bounds that will create an unmatchable key range,\n // then we return an empty set of key ranges.\n if (this.Cn(r[e], r[e + 1])) return [];\n const t = [ r[e].indexId, this.uid, r[e].arrayValue, r[e].directionalValue, Ae, [] ], n = [ r[e + 1].indexId, this.uid, r[e + 1].arrayValue, r[e + 1].directionalValue, Ae, [] ];\n i.push(IDBKeyRange.bound(t, n));\n }\n return i;\n }\n Cn(e, t) {\n // If lower bound is greater than the upper bound, then the key\n // range can never be matched.\n return __PRIVATE_indexEntryComparator(e, t) > 0;\n }\n getMinOffsetFromCollectionGroup(e, t) {\n return this.getFieldIndexes(e, t).next(__PRIVATE_getMinOffsetFromFieldIndexes);\n }\n getMinOffset(e, t) {\n return PersistencePromise.mapArray(this.hn(t), (t => this.Pn(e, t).next((e => e || fail())))).next(__PRIVATE_getMinOffsetFromFieldIndexes);\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the collectionParents\n * document store.\n */ function __PRIVATE_collectionParentsStore(e) {\n return __PRIVATE_getStore(e, \"collectionParents\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the index entry object store.\n */ function __PRIVATE_indexEntriesStore(e) {\n return __PRIVATE_getStore(e, \"indexEntries\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the index configuration object store.\n */ function __PRIVATE_indexConfigurationStore(e) {\n return __PRIVATE_getStore(e, \"indexConfiguration\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the index state object store.\n */ function __PRIVATE_indexStateStore(e) {\n return __PRIVATE_getStore(e, \"indexState\");\n}\n\nfunction __PRIVATE_getMinOffsetFromFieldIndexes(e) {\n __PRIVATE_hardAssert(0 !== e.length);\n let t = e[0].indexState.offset, n = t.largestBatchId;\n for (let r = 1; r < e.length; r++) {\n const i = e[r].indexState.offset;\n __PRIVATE_indexOffsetComparator(i, t) < 0 && (t = i), n < i.largestBatchId && (n = i.largestBatchId);\n }\n return new IndexOffset(t.readTime, t.documentKey, n);\n}\n\n/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const Re = {\n didRun: !1,\n sequenceNumbersCollected: 0,\n targetsRemoved: 0,\n documentsRemoved: 0\n};\n\nclass LruParams {\n constructor(\n // When we attempt to collect, we will only do so if the cache size is greater than this\n // threshold. Passing `COLLECTION_DISABLED` here will cause collection to always be skipped.\n e, \n // The percentage of sequence numbers that we will attempt to collect\n t, \n // A cap on the total number of sequence numbers that will be collected. This prevents\n // us from collecting a huge number of sequence numbers if the cache has grown very large.\n n) {\n this.cacheSizeCollectionThreshold = e, this.percentileToCollect = t, this.maximumSequenceNumbersToCollect = n;\n }\n static withCacheSize(e) {\n return new LruParams(e, LruParams.DEFAULT_COLLECTION_PERCENTILE, LruParams.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Delete a mutation batch and the associated document mutations.\n * @returns A PersistencePromise of the document mutations that were removed.\n */\nfunction removeMutationBatch(e, t, n) {\n const r = e.store(\"mutations\"), i = e.store(\"documentMutations\"), s = [], o = IDBKeyRange.only(n.batchId);\n let _ = 0;\n const a = r.J({\n range: o\n }, ((e, t, n) => (_++, n.delete())));\n s.push(a.next((() => {\n __PRIVATE_hardAssert(1 === _);\n })));\n const u = [];\n for (const e of n.mutations) {\n const r = __PRIVATE_newDbDocumentMutationKey(t, e.key.path, n.batchId);\n s.push(i.delete(r)), u.push(e.key);\n }\n return PersistencePromise.waitFor(s).next((() => u));\n}\n\n/**\n * Returns an approximate size for the given document.\n */ function __PRIVATE_dbDocumentSize(e) {\n if (!e) return 0;\n let t;\n if (e.document) t = e.document; else if (e.unknownDocument) t = e.unknownDocument; else {\n if (!e.noDocument) throw fail();\n t = e.noDocument;\n }\n return JSON.stringify(t).length;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** A mutation queue for a specific user, backed by IndexedDB. */ LruParams.DEFAULT_COLLECTION_PERCENTILE = 10, \nLruParams.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT = 1e3, LruParams.DEFAULT = new LruParams(41943040, LruParams.DEFAULT_COLLECTION_PERCENTILE, LruParams.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT), \nLruParams.DISABLED = new LruParams(-1, 0, 0);\n\nclass __PRIVATE_IndexedDbMutationQueue {\n constructor(\n /**\n * The normalized userId (e.g. null UID => \"\" userId) used to store /\n * retrieve mutations.\n */\n e, t, n, r) {\n this.userId = e, this.serializer = t, this.indexManager = n, this.referenceDelegate = r, \n /**\n * Caches the document keys for pending mutation batches. If the mutation\n * has been removed from IndexedDb, the cached value may continue to\n * be used to retrieve the batch's document keys. To remove a cached value\n * locally, `removeCachedMutationKeys()` should be invoked either directly\n * or through `removeMutationBatches()`.\n *\n * With multi-tab, when the primary client acknowledges or rejects a mutation,\n * this cache is used by secondary clients to invalidate the local\n * view of the documents that were previously affected by the mutation.\n */\n // PORTING NOTE: Multi-tab only.\n this.Fn = {};\n }\n /**\n * Creates a new mutation queue for the given user.\n * @param user - The user for which to create a mutation queue.\n * @param serializer - The serializer to use when persisting to IndexedDb.\n */ static lt(e, t, n, r) {\n // TODO(mcg): Figure out what constraints there are on userIDs\n // In particular, are there any reserved characters? are empty ids allowed?\n // For the moment store these together in the same mutations table assuming\n // that empty userIDs aren't allowed.\n __PRIVATE_hardAssert(\"\" !== e.uid);\n const i = e.isAuthenticated() ? e.uid : \"\";\n return new __PRIVATE_IndexedDbMutationQueue(i, t, n, r);\n }\n checkEmpty(e) {\n let t = !0;\n const n = IDBKeyRange.bound([ this.userId, Number.NEGATIVE_INFINITY ], [ this.userId, Number.POSITIVE_INFINITY ]);\n return __PRIVATE_mutationsStore(e).J({\n index: \"userMutationsIndex\",\n range: n\n }, ((e, n, r) => {\n t = !1, r.done();\n })).next((() => t));\n }\n addMutationBatch(e, t, n, r) {\n const i = __PRIVATE_documentMutationsStore(e), s = __PRIVATE_mutationsStore(e);\n // The IndexedDb implementation in Chrome (and Firefox) does not handle\n // compound indices that include auto-generated keys correctly. To ensure\n // that the index entry is added correctly in all browsers, we perform two\n // writes: The first write is used to retrieve the next auto-generated Batch\n // ID, and the second write populates the index and stores the actual\n // mutation batch.\n // See: https://bugs.chromium.org/p/chromium/issues/detail?id=701972\n // We write an empty object to obtain key\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return s.add({}).next((o => {\n __PRIVATE_hardAssert(\"number\" == typeof o);\n const _ = new MutationBatch(o, t, n, r), a = function __PRIVATE_toDbMutationBatch(e, t, n) {\n const r = n.baseMutations.map((t => toMutation(e.ct, t))), i = n.mutations.map((t => toMutation(e.ct, t)));\n return {\n userId: t,\n batchId: n.batchId,\n localWriteTimeMs: n.localWriteTime.toMillis(),\n baseMutations: r,\n mutations: i\n };\n }(this.serializer, this.userId, _), u = [];\n let c = new SortedSet(((e, t) => __PRIVATE_primitiveComparator(e.canonicalString(), t.canonicalString())));\n for (const e of r) {\n const t = __PRIVATE_newDbDocumentMutationKey(this.userId, e.key.path, o);\n c = c.add(e.key.path.popLast()), u.push(s.put(a)), u.push(i.put(t, x));\n }\n return c.forEach((t => {\n u.push(this.indexManager.addToCollectionParentIndex(e, t));\n })), e.addOnCommittedListener((() => {\n this.Fn[o] = _.keys();\n })), PersistencePromise.waitFor(u).next((() => _));\n }));\n }\n lookupMutationBatch(e, t) {\n return __PRIVATE_mutationsStore(e).get(t).next((e => e ? (__PRIVATE_hardAssert(e.userId === this.userId), \n __PRIVATE_fromDbMutationBatch(this.serializer, e)) : null));\n }\n /**\n * Returns the document keys for the mutation batch with the given batchId.\n * For primary clients, this method returns `null` after\n * `removeMutationBatches()` has been called. Secondary clients return a\n * cached result until `removeCachedMutationKeys()` is invoked.\n */\n // PORTING NOTE: Multi-tab only.\n Mn(e, t) {\n return this.Fn[t] ? PersistencePromise.resolve(this.Fn[t]) : this.lookupMutationBatch(e, t).next((e => {\n if (e) {\n const n = e.keys();\n return this.Fn[t] = n, n;\n }\n return null;\n }));\n }\n getNextMutationBatchAfterBatchId(e, t) {\n const n = t + 1, r = IDBKeyRange.lowerBound([ this.userId, n ]);\n let i = null;\n return __PRIVATE_mutationsStore(e).J({\n index: \"userMutationsIndex\",\n range: r\n }, ((e, t, r) => {\n t.userId === this.userId && (__PRIVATE_hardAssert(t.batchId >= n), i = __PRIVATE_fromDbMutationBatch(this.serializer, t)), \n r.done();\n })).next((() => i));\n }\n getHighestUnacknowledgedBatchId(e) {\n const t = IDBKeyRange.upperBound([ this.userId, Number.POSITIVE_INFINITY ]);\n let n = -1;\n return __PRIVATE_mutationsStore(e).J({\n index: \"userMutationsIndex\",\n range: t,\n reverse: !0\n }, ((e, t, r) => {\n n = t.batchId, r.done();\n })).next((() => n));\n }\n getAllMutationBatches(e) {\n const t = IDBKeyRange.bound([ this.userId, -1 ], [ this.userId, Number.POSITIVE_INFINITY ]);\n return __PRIVATE_mutationsStore(e).U(\"userMutationsIndex\", t).next((e => e.map((e => __PRIVATE_fromDbMutationBatch(this.serializer, e)))));\n }\n getAllMutationBatchesAffectingDocumentKey(e, t) {\n // Scan the document-mutation index starting with a prefix starting with\n // the given documentKey.\n const n = __PRIVATE_newDbDocumentMutationPrefixForPath(this.userId, t.path), r = IDBKeyRange.lowerBound(n), i = [];\n return __PRIVATE_documentMutationsStore(e).J({\n range: r\n }, ((n, r, s) => {\n const [o, _, a] = n, u = __PRIVATE_decodeResourcePath(_);\n // Only consider rows matching exactly the specific key of\n // interest. Note that because we order by path first, and we\n // order terminators before path separators, we'll encounter all\n // the index rows for documentKey contiguously. In particular, all\n // the rows for documentKey will occur before any rows for\n // documents nested in a subcollection beneath documentKey so we\n // can stop as soon as we hit any such row.\n if (o === this.userId && t.path.isEqual(u)) \n // Look up the mutation batch in the store.\n return __PRIVATE_mutationsStore(e).get(a).next((e => {\n if (!e) throw fail();\n __PRIVATE_hardAssert(e.userId === this.userId), i.push(__PRIVATE_fromDbMutationBatch(this.serializer, e));\n }));\n s.done();\n })).next((() => i));\n }\n getAllMutationBatchesAffectingDocumentKeys(e, t) {\n let n = new SortedSet(__PRIVATE_primitiveComparator);\n const r = [];\n return t.forEach((t => {\n const i = __PRIVATE_newDbDocumentMutationPrefixForPath(this.userId, t.path), s = IDBKeyRange.lowerBound(i), o = __PRIVATE_documentMutationsStore(e).J({\n range: s\n }, ((e, r, i) => {\n const [s, o, _] = e, a = __PRIVATE_decodeResourcePath(o);\n // Only consider rows matching exactly the specific key of\n // interest. Note that because we order by path first, and we\n // order terminators before path separators, we'll encounter all\n // the index rows for documentKey contiguously. In particular, all\n // the rows for documentKey will occur before any rows for\n // documents nested in a subcollection beneath documentKey so we\n // can stop as soon as we hit any such row.\n s === this.userId && t.path.isEqual(a) ? n = n.add(_) : i.done();\n }));\n r.push(o);\n })), PersistencePromise.waitFor(r).next((() => this.xn(e, n)));\n }\n getAllMutationBatchesAffectingQuery(e, t) {\n const n = t.path, r = n.length + 1, i = __PRIVATE_newDbDocumentMutationPrefixForPath(this.userId, n), s = IDBKeyRange.lowerBound(i);\n // Collect up unique batchIDs encountered during a scan of the index. Use a\n // SortedSet to accumulate batch IDs so they can be traversed in order in a\n // scan of the main table.\n let o = new SortedSet(__PRIVATE_primitiveComparator);\n return __PRIVATE_documentMutationsStore(e).J({\n range: s\n }, ((e, t, i) => {\n const [s, _, a] = e, u = __PRIVATE_decodeResourcePath(_);\n s === this.userId && n.isPrefixOf(u) ? \n // Rows with document keys more than one segment longer than the\n // query path can't be matches. For example, a query on 'rooms'\n // can't match the document /rooms/abc/messages/xyx.\n // TODO(mcg): we'll need a different scanner when we implement\n // ancestor queries.\n u.length === r && (o = o.add(a)) : i.done();\n })).next((() => this.xn(e, o)));\n }\n xn(e, t) {\n const n = [], r = [];\n // TODO(rockwood): Implement this using iterate.\n return t.forEach((t => {\n r.push(__PRIVATE_mutationsStore(e).get(t).next((e => {\n if (null === e) throw fail();\n __PRIVATE_hardAssert(e.userId === this.userId), n.push(__PRIVATE_fromDbMutationBatch(this.serializer, e));\n })));\n })), PersistencePromise.waitFor(r).next((() => n));\n }\n removeMutationBatch(e, t) {\n return removeMutationBatch(e._e, this.userId, t).next((n => (e.addOnCommittedListener((() => {\n this.On(t.batchId);\n })), PersistencePromise.forEach(n, (t => this.referenceDelegate.markPotentiallyOrphaned(e, t))))));\n }\n /**\n * Clears the cached keys for a mutation batch. This method should be\n * called by secondary clients after they process mutation updates.\n *\n * Note that this method does not have to be called from primary clients as\n * the corresponding cache entries are cleared when an acknowledged or\n * rejected batch is removed from the mutation queue.\n */\n // PORTING NOTE: Multi-tab only\n On(e) {\n delete this.Fn[e];\n }\n performConsistencyCheck(e) {\n return this.checkEmpty(e).next((t => {\n if (!t) return PersistencePromise.resolve();\n // Verify that there are no entries in the documentMutations index if\n // the queue is empty.\n const n = IDBKeyRange.lowerBound(\n /**\n * Creates a [userId] key for use in the DbDocumentMutations index to iterate\n * over all of a user's document mutations.\n */\n function __PRIVATE_newDbDocumentMutationPrefixForUser(e) {\n return [ e ];\n }(this.userId)), r = [];\n return __PRIVATE_documentMutationsStore(e).J({\n range: n\n }, ((e, t, n) => {\n if (e[0] === this.userId) {\n const t = __PRIVATE_decodeResourcePath(e[1]);\n r.push(t);\n } else n.done();\n })).next((() => {\n __PRIVATE_hardAssert(0 === r.length);\n }));\n }));\n }\n containsKey(e, t) {\n return __PRIVATE_mutationQueueContainsKey(e, this.userId, t);\n }\n // PORTING NOTE: Multi-tab only (state is held in memory in other clients).\n /** Returns the mutation queue's metadata from IndexedDb. */\n Nn(e) {\n return __PRIVATE_mutationQueuesStore(e).get(this.userId).next((e => e || {\n userId: this.userId,\n lastAcknowledgedBatchId: -1,\n lastStreamToken: \"\"\n }));\n }\n}\n\n/**\n * @returns true if the mutation queue for the given user contains a pending\n * mutation for the given key.\n */ function __PRIVATE_mutationQueueContainsKey(e, t, n) {\n const r = __PRIVATE_newDbDocumentMutationPrefixForPath(t, n.path), i = r[1], s = IDBKeyRange.lowerBound(r);\n let o = !1;\n return __PRIVATE_documentMutationsStore(e).J({\n range: s,\n H: !0\n }, ((e, n, r) => {\n const [s, _, /*batchID*/ a] = e;\n s === t && _ === i && (o = !0), r.done();\n })).next((() => o));\n}\n\n/** Returns true if any mutation queue contains the given document. */\n/**\n * Helper to get a typed SimpleDbStore for the mutations object store.\n */\nfunction __PRIVATE_mutationsStore(e) {\n return __PRIVATE_getStore(e, \"mutations\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the mutationQueues object store.\n */ function __PRIVATE_documentMutationsStore(e) {\n return __PRIVATE_getStore(e, \"documentMutations\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the mutationQueues object store.\n */ function __PRIVATE_mutationQueuesStore(e) {\n return __PRIVATE_getStore(e, \"mutationQueues\");\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Offset to ensure non-overlapping target ids. */\n/**\n * Generates monotonically increasing target IDs for sending targets to the\n * watch stream.\n *\n * The client constructs two generators, one for the target cache, and one for\n * for the sync engine (to generate limbo documents targets). These\n * generators produce non-overlapping IDs (by using even and odd IDs\n * respectively).\n *\n * By separating the target ID space, the query cache can generate target IDs\n * that persist across client restarts, while sync engine can independently\n * generate in-memory target IDs that are transient and can be reused after a\n * restart.\n */\nclass __PRIVATE_TargetIdGenerator {\n constructor(e) {\n this.Ln = e;\n }\n next() {\n return this.Ln += 2, this.Ln;\n }\n static Bn() {\n // The target cache generator must return '2' in its first call to `next()`\n // as there is no differentiation in the protocol layer between an unset\n // number and the number '0'. If we were to sent a target with target ID\n // '0', the backend would consider it unset and replace it with its own ID.\n return new __PRIVATE_TargetIdGenerator(0);\n }\n static kn() {\n // Sync engine assigns target IDs for limbo document detection.\n return new __PRIVATE_TargetIdGenerator(-1);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_IndexedDbTargetCache {\n constructor(e, t) {\n this.referenceDelegate = e, this.serializer = t;\n }\n // PORTING NOTE: We don't cache global metadata for the target cache, since\n // some of it (in particular `highestTargetId`) can be modified by secondary\n // tabs. We could perhaps be more granular (and e.g. still cache\n // `lastRemoteSnapshotVersion` in memory) but for simplicity we currently go\n // to IndexedDb whenever we need to read metadata. We can revisit if it turns\n // out to have a meaningful performance impact.\n allocateTargetId(e) {\n return this.qn(e).next((t => {\n const n = new __PRIVATE_TargetIdGenerator(t.highestTargetId);\n return t.highestTargetId = n.next(), this.Qn(e, t).next((() => t.highestTargetId));\n }));\n }\n getLastRemoteSnapshotVersion(e) {\n return this.qn(e).next((e => SnapshotVersion.fromTimestamp(new Timestamp(e.lastRemoteSnapshotVersion.seconds, e.lastRemoteSnapshotVersion.nanoseconds))));\n }\n getHighestSequenceNumber(e) {\n return this.qn(e).next((e => e.highestListenSequenceNumber));\n }\n setTargetsMetadata(e, t, n) {\n return this.qn(e).next((r => (r.highestListenSequenceNumber = t, n && (r.lastRemoteSnapshotVersion = n.toTimestamp()), \n t > r.highestListenSequenceNumber && (r.highestListenSequenceNumber = t), this.Qn(e, r))));\n }\n addTargetData(e, t) {\n return this.Kn(e, t).next((() => this.qn(e).next((n => (n.targetCount += 1, this.$n(t, n), \n this.Qn(e, n))))));\n }\n updateTargetData(e, t) {\n return this.Kn(e, t);\n }\n removeTargetData(e, t) {\n return this.removeMatchingKeysForTargetId(e, t.targetId).next((() => __PRIVATE_targetsStore(e).delete(t.targetId))).next((() => this.qn(e))).next((t => (__PRIVATE_hardAssert(t.targetCount > 0), \n t.targetCount -= 1, this.Qn(e, t))));\n }\n /**\n * Drops any targets with sequence number less than or equal to the upper bound, excepting those\n * present in `activeTargetIds`. Document associations for the removed targets are also removed.\n * Returns the number of targets removed.\n */ removeTargets(e, t, n) {\n let r = 0;\n const i = [];\n return __PRIVATE_targetsStore(e).J(((s, o) => {\n const _ = __PRIVATE_fromDbTarget(o);\n _.sequenceNumber <= t && null === n.get(_.targetId) && (r++, i.push(this.removeTargetData(e, _)));\n })).next((() => PersistencePromise.waitFor(i))).next((() => r));\n }\n /**\n * Call provided function with each `TargetData` that we have cached.\n */ forEachTarget(e, t) {\n return __PRIVATE_targetsStore(e).J(((e, n) => {\n const r = __PRIVATE_fromDbTarget(n);\n t(r);\n }));\n }\n qn(e) {\n return __PRIVATE_globalTargetStore(e).get(\"targetGlobalKey\").next((e => (__PRIVATE_hardAssert(null !== e), \n e)));\n }\n Qn(e, t) {\n return __PRIVATE_globalTargetStore(e).put(\"targetGlobalKey\", t);\n }\n Kn(e, t) {\n return __PRIVATE_targetsStore(e).put(__PRIVATE_toDbTarget(this.serializer, t));\n }\n /**\n * In-place updates the provided metadata to account for values in the given\n * TargetData. Saving is done separately. Returns true if there were any\n * changes to the metadata.\n */ $n(e, t) {\n let n = !1;\n return e.targetId > t.highestTargetId && (t.highestTargetId = e.targetId, n = !0), \n e.sequenceNumber > t.highestListenSequenceNumber && (t.highestListenSequenceNumber = e.sequenceNumber, \n n = !0), n;\n }\n getTargetCount(e) {\n return this.qn(e).next((e => e.targetCount));\n }\n getTargetData(e, t) {\n // Iterating by the canonicalId may yield more than one result because\n // canonicalId values are not required to be unique per target. This query\n // depends on the queryTargets index to be efficient.\n const n = __PRIVATE_canonifyTarget(t), r = IDBKeyRange.bound([ n, Number.NEGATIVE_INFINITY ], [ n, Number.POSITIVE_INFINITY ]);\n let i = null;\n return __PRIVATE_targetsStore(e).J({\n range: r,\n index: \"queryTargetsIndex\"\n }, ((e, n, r) => {\n const s = __PRIVATE_fromDbTarget(n);\n // After finding a potential match, check that the target is\n // actually equal to the requested target.\n __PRIVATE_targetEquals(t, s.target) && (i = s, r.done());\n })).next((() => i));\n }\n addMatchingKeys(e, t, n) {\n // PORTING NOTE: The reverse index (documentsTargets) is maintained by\n // IndexedDb.\n const r = [], i = __PRIVATE_documentTargetStore(e);\n return t.forEach((t => {\n const s = __PRIVATE_encodeResourcePath(t.path);\n r.push(i.put({\n targetId: n,\n path: s\n })), r.push(this.referenceDelegate.addReference(e, n, t));\n })), PersistencePromise.waitFor(r);\n }\n removeMatchingKeys(e, t, n) {\n // PORTING NOTE: The reverse index (documentsTargets) is maintained by\n // IndexedDb.\n const r = __PRIVATE_documentTargetStore(e);\n return PersistencePromise.forEach(t, (t => {\n const i = __PRIVATE_encodeResourcePath(t.path);\n return PersistencePromise.waitFor([ r.delete([ n, i ]), this.referenceDelegate.removeReference(e, n, t) ]);\n }));\n }\n removeMatchingKeysForTargetId(e, t) {\n const n = __PRIVATE_documentTargetStore(e), r = IDBKeyRange.bound([ t ], [ t + 1 ], \n /*lowerOpen=*/ !1, \n /*upperOpen=*/ !0);\n return n.delete(r);\n }\n getMatchingKeysForTargetId(e, t) {\n const n = IDBKeyRange.bound([ t ], [ t + 1 ], \n /*lowerOpen=*/ !1, \n /*upperOpen=*/ !0), r = __PRIVATE_documentTargetStore(e);\n let i = __PRIVATE_documentKeySet();\n return r.J({\n range: n,\n H: !0\n }, ((e, t, n) => {\n const r = __PRIVATE_decodeResourcePath(e[1]), s = new DocumentKey(r);\n i = i.add(s);\n })).next((() => i));\n }\n containsKey(e, t) {\n const n = __PRIVATE_encodeResourcePath(t.path), r = IDBKeyRange.bound([ n ], [ __PRIVATE_immediateSuccessor(n) ], \n /*lowerOpen=*/ !1, \n /*upperOpen=*/ !0);\n let i = 0;\n return __PRIVATE_documentTargetStore(e).J({\n index: \"documentTargetsIndex\",\n H: !0,\n range: r\n }, (([e, t], n, r) => {\n // Having a sentinel row for a document does not count as containing that document;\n // For the target cache, containing the document means the document is part of some\n // target.\n 0 !== e && (i++, r.done());\n })).next((() => i > 0));\n }\n /**\n * Looks up a TargetData entry by target ID.\n *\n * @param targetId - The target ID of the TargetData entry to look up.\n * @returns The cached TargetData entry, or null if the cache has no entry for\n * the target.\n */\n // PORTING NOTE: Multi-tab only.\n ot(e, t) {\n return __PRIVATE_targetsStore(e).get(t).next((e => e ? __PRIVATE_fromDbTarget(e) : null));\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the queries object store.\n */ function __PRIVATE_targetsStore(e) {\n return __PRIVATE_getStore(e, \"targets\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the target globals object store.\n */ function __PRIVATE_globalTargetStore(e) {\n return __PRIVATE_getStore(e, \"targetGlobal\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the document target object store.\n */ function __PRIVATE_documentTargetStore(e) {\n return __PRIVATE_getStore(e, \"targetDocuments\");\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ function __PRIVATE_bufferEntryComparator([e, t], [n, r]) {\n const i = __PRIVATE_primitiveComparator(e, n);\n return 0 === i ? __PRIVATE_primitiveComparator(t, r) : i;\n}\n\n/**\n * Used to calculate the nth sequence number. Keeps a rolling buffer of the\n * lowest n values passed to `addElement`, and finally reports the largest of\n * them in `maxValue`.\n */ class __PRIVATE_RollingSequenceNumberBuffer {\n constructor(e) {\n this.Un = e, this.buffer = new SortedSet(__PRIVATE_bufferEntryComparator), this.Wn = 0;\n }\n Gn() {\n return ++this.Wn;\n }\n zn(e) {\n const t = [ e, this.Gn() ];\n if (this.buffer.size < this.Un) this.buffer = this.buffer.add(t); else {\n const e = this.buffer.last();\n __PRIVATE_bufferEntryComparator(t, e) < 0 && (this.buffer = this.buffer.delete(e).add(t));\n }\n }\n get maxValue() {\n // Guaranteed to be non-empty. If we decide we are not collecting any\n // sequence numbers, nthSequenceNumber below short-circuits. If we have\n // decided that we are collecting n sequence numbers, it's because n is some\n // percentage of the existing sequence numbers. That means we should never\n // be in a situation where we are collecting sequence numbers but don't\n // actually have any.\n return this.buffer.last()[0];\n }\n}\n\n/**\n * This class is responsible for the scheduling of LRU garbage collection. It handles checking\n * whether or not GC is enabled, as well as which delay to use before the next run.\n */ class __PRIVATE_LruScheduler {\n constructor(e, t, n) {\n this.garbageCollector = e, this.asyncQueue = t, this.localStore = n, this.jn = null;\n }\n start() {\n -1 !== this.garbageCollector.params.cacheSizeCollectionThreshold && this.Hn(6e4);\n }\n stop() {\n this.jn && (this.jn.cancel(), this.jn = null);\n }\n get started() {\n return null !== this.jn;\n }\n Hn(e) {\n __PRIVATE_logDebug(\"LruGarbageCollector\", `Garbage collection scheduled in ${e}ms`), \n this.jn = this.asyncQueue.enqueueAfterDelay(\"lru_garbage_collection\" /* TimerId.LruGarbageCollection */ , e, (async () => {\n this.jn = null;\n try {\n await this.localStore.collectGarbage(this.garbageCollector);\n } catch (e) {\n __PRIVATE_isIndexedDbTransactionError(e) ? __PRIVATE_logDebug(\"LruGarbageCollector\", \"Ignoring IndexedDB error during garbage collection: \", e) : await __PRIVATE_ignoreIfPrimaryLeaseLoss(e);\n }\n await this.Hn(3e5);\n }));\n }\n}\n\n/**\n * Implements the steps for LRU garbage collection.\n */ class __PRIVATE_LruGarbageCollectorImpl {\n constructor(e, t) {\n this.Jn = e, this.params = t;\n }\n calculateTargetCount(e, t) {\n return this.Jn.Yn(e).next((e => Math.floor(t / 100 * e)));\n }\n nthSequenceNumber(e, t) {\n if (0 === t) return PersistencePromise.resolve(__PRIVATE_ListenSequence.oe);\n const n = new __PRIVATE_RollingSequenceNumberBuffer(t);\n return this.Jn.forEachTarget(e, (e => n.zn(e.sequenceNumber))).next((() => this.Jn.Zn(e, (e => n.zn(e))))).next((() => n.maxValue));\n }\n removeTargets(e, t, n) {\n return this.Jn.removeTargets(e, t, n);\n }\n removeOrphanedDocuments(e, t) {\n return this.Jn.removeOrphanedDocuments(e, t);\n }\n collect(e, t) {\n return -1 === this.params.cacheSizeCollectionThreshold ? (__PRIVATE_logDebug(\"LruGarbageCollector\", \"Garbage collection skipped; disabled\"), \n PersistencePromise.resolve(Re)) : this.getCacheSize(e).next((n => n < this.params.cacheSizeCollectionThreshold ? (__PRIVATE_logDebug(\"LruGarbageCollector\", `Garbage collection skipped; Cache size ${n} is lower than threshold ${this.params.cacheSizeCollectionThreshold}`), \n Re) : this.Xn(e, t)));\n }\n getCacheSize(e) {\n return this.Jn.getCacheSize(e);\n }\n Xn(e, t) {\n let n, r, i, s, o, a, u;\n const c = Date.now();\n return this.calculateTargetCount(e, this.params.percentileToCollect).next((t => (\n // Cap at the configured max\n t > this.params.maximumSequenceNumbersToCollect ? (__PRIVATE_logDebug(\"LruGarbageCollector\", `Capping sequence numbers to collect down to the maximum of ${this.params.maximumSequenceNumbersToCollect} from ${t}`), \n r = this.params.maximumSequenceNumbersToCollect) : r = t, s = Date.now(), this.nthSequenceNumber(e, r)))).next((r => (n = r, \n o = Date.now(), this.removeTargets(e, n, t)))).next((t => (i = t, a = Date.now(), \n this.removeOrphanedDocuments(e, n)))).next((e => {\n if (u = Date.now(), __PRIVATE_getLogLevel() <= LogLevel.DEBUG) {\n __PRIVATE_logDebug(\"LruGarbageCollector\", `LRU Garbage Collection\\n\\tCounted targets in ${s - c}ms\\n\\tDetermined least recently used ${r} in ` + (o - s) + \"ms\\n\" + `\\tRemoved ${i} targets in ` + (a - o) + \"ms\\n\" + `\\tRemoved ${e} documents in ` + (u - a) + \"ms\\n\" + `Total Duration: ${u - c}ms`);\n }\n return PersistencePromise.resolve({\n didRun: !0,\n sequenceNumbersCollected: r,\n targetsRemoved: i,\n documentsRemoved: e\n });\n }));\n }\n}\n\nfunction __PRIVATE_newLruGarbageCollector(e, t) {\n return new __PRIVATE_LruGarbageCollectorImpl(e, t);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Provides LRU functionality for IndexedDB persistence. */ class __PRIVATE_IndexedDbLruDelegateImpl {\n constructor(e, t) {\n this.db = e, this.garbageCollector = __PRIVATE_newLruGarbageCollector(this, t);\n }\n Yn(e) {\n const t = this.er(e);\n return this.db.getTargetCache().getTargetCount(e).next((e => t.next((t => e + t))));\n }\n er(e) {\n let t = 0;\n return this.Zn(e, (e => {\n t++;\n })).next((() => t));\n }\n forEachTarget(e, t) {\n return this.db.getTargetCache().forEachTarget(e, t);\n }\n Zn(e, t) {\n return this.tr(e, ((e, n) => t(n)));\n }\n addReference(e, t, n) {\n return __PRIVATE_writeSentinelKey(e, n);\n }\n removeReference(e, t, n) {\n return __PRIVATE_writeSentinelKey(e, n);\n }\n removeTargets(e, t, n) {\n return this.db.getTargetCache().removeTargets(e, t, n);\n }\n markPotentiallyOrphaned(e, t) {\n return __PRIVATE_writeSentinelKey(e, t);\n }\n /**\n * Returns true if anything would prevent this document from being garbage\n * collected, given that the document in question is not present in any\n * targets and has a sequence number less than or equal to the upper bound for\n * the collection run.\n */ nr(e, t) {\n return function __PRIVATE_mutationQueuesContainKey(e, t) {\n let n = !1;\n return __PRIVATE_mutationQueuesStore(e).Y((r => __PRIVATE_mutationQueueContainsKey(e, r, t).next((e => (e && (n = !0), \n PersistencePromise.resolve(!e)))))).next((() => n));\n }(e, t);\n }\n removeOrphanedDocuments(e, t) {\n const n = this.db.getRemoteDocumentCache().newChangeBuffer(), r = [];\n let i = 0;\n return this.tr(e, ((s, o) => {\n if (o <= t) {\n const t = this.nr(e, s).next((t => {\n if (!t) \n // Our size accounting requires us to read all documents before\n // removing them.\n return i++, n.getEntry(e, s).next((() => (n.removeEntry(s, SnapshotVersion.min()), \n __PRIVATE_documentTargetStore(e).delete(function __PRIVATE_sentinelKey$1(e) {\n return [ 0, __PRIVATE_encodeResourcePath(e.path) ];\n }\n /**\n * @returns A value suitable for writing a sentinel row in the target-document\n * store.\n */ (s)))));\n }));\n r.push(t);\n }\n })).next((() => PersistencePromise.waitFor(r))).next((() => n.apply(e))).next((() => i));\n }\n removeTarget(e, t) {\n const n = t.withSequenceNumber(e.currentSequenceNumber);\n return this.db.getTargetCache().updateTargetData(e, n);\n }\n updateLimboDocument(e, t) {\n return __PRIVATE_writeSentinelKey(e, t);\n }\n /**\n * Call provided function for each document in the cache that is 'orphaned'. Orphaned\n * means not a part of any target, so the only entry in the target-document index for\n * that document will be the sentinel row (targetId 0), which will also have the sequence\n * number for the last time the document was accessed.\n */ tr(e, t) {\n const n = __PRIVATE_documentTargetStore(e);\n let r, i = __PRIVATE_ListenSequence.oe;\n return n.J({\n index: \"documentTargetsIndex\"\n }, (([e, n], {path: s, sequenceNumber: o}) => {\n 0 === e ? (\n // if nextToReport is valid, report it, this is a new key so the\n // last one must not be a member of any targets.\n i !== __PRIVATE_ListenSequence.oe && t(new DocumentKey(__PRIVATE_decodeResourcePath(r)), i), \n // set nextToReport to be this sequence number. It's the next one we\n // might report, if we don't find any targets for this document.\n // Note that the sequence number must be defined when the targetId\n // is 0.\n i = o, r = s) : \n // set nextToReport to be invalid, we know we don't need to report\n // this one since we found a target for it.\n i = __PRIVATE_ListenSequence.oe;\n })).next((() => {\n // Since we report sequence numbers after getting to the next key, we\n // need to check if the last key we iterated over was an orphaned\n // document and report it.\n i !== __PRIVATE_ListenSequence.oe && t(new DocumentKey(__PRIVATE_decodeResourcePath(r)), i);\n }));\n }\n getCacheSize(e) {\n return this.db.getRemoteDocumentCache().getSize(e);\n }\n}\n\nfunction __PRIVATE_writeSentinelKey(e, t) {\n return __PRIVATE_documentTargetStore(e).put(function __PRIVATE_sentinelRow(e, t) {\n return {\n targetId: 0,\n path: __PRIVATE_encodeResourcePath(e.path),\n sequenceNumber: t\n };\n }(t, e.currentSequenceNumber));\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An in-memory buffer of entries to be written to a RemoteDocumentCache.\n * It can be used to batch up a set of changes to be written to the cache, but\n * additionally supports reading entries back with the `getEntry()` method,\n * falling back to the underlying RemoteDocumentCache if no entry is\n * buffered.\n *\n * Entries added to the cache *must* be read first. This is to facilitate\n * calculating the size delta of the pending changes.\n *\n * PORTING NOTE: This class was implemented then removed from other platforms.\n * If byte-counting ends up being needed on the other platforms, consider\n * porting this class as part of that implementation work.\n */ class RemoteDocumentChangeBuffer {\n constructor() {\n // A mapping of document key to the new cache entry that should be written.\n this.changes = new ObjectMap((e => e.toString()), ((e, t) => e.isEqual(t))), this.changesApplied = !1;\n }\n /**\n * Buffers a `RemoteDocumentCache.addEntry()` call.\n *\n * You can only modify documents that have already been retrieved via\n * `getEntry()/getEntries()` (enforced via IndexedDbs `apply()`).\n */ addEntry(e) {\n this.assertNotApplied(), this.changes.set(e.key, e);\n }\n /**\n * Buffers a `RemoteDocumentCache.removeEntry()` call.\n *\n * You can only remove documents that have already been retrieved via\n * `getEntry()/getEntries()` (enforced via IndexedDbs `apply()`).\n */ removeEntry(e, t) {\n this.assertNotApplied(), this.changes.set(e, MutableDocument.newInvalidDocument(e).setReadTime(t));\n }\n /**\n * Looks up an entry in the cache. The buffered changes will first be checked,\n * and if no buffered change applies, this will forward to\n * `RemoteDocumentCache.getEntry()`.\n *\n * @param transaction - The transaction in which to perform any persistence\n * operations.\n * @param documentKey - The key of the entry to look up.\n * @returns The cached document or an invalid document if we have nothing\n * cached.\n */ getEntry(e, t) {\n this.assertNotApplied();\n const n = this.changes.get(t);\n return void 0 !== n ? PersistencePromise.resolve(n) : this.getFromCache(e, t);\n }\n /**\n * Looks up several entries in the cache, forwarding to\n * `RemoteDocumentCache.getEntry()`.\n *\n * @param transaction - The transaction in which to perform any persistence\n * operations.\n * @param documentKeys - The keys of the entries to look up.\n * @returns A map of cached documents, indexed by key. If an entry cannot be\n * found, the corresponding key will be mapped to an invalid document.\n */ getEntries(e, t) {\n return this.getAllFromCache(e, t);\n }\n /**\n * Applies buffered changes to the underlying RemoteDocumentCache, using\n * the provided transaction.\n */ apply(e) {\n return this.assertNotApplied(), this.changesApplied = !0, this.applyChanges(e);\n }\n /** Helper to assert this.changes is not null */ assertNotApplied() {}\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The RemoteDocumentCache for IndexedDb. To construct, invoke\n * `newIndexedDbRemoteDocumentCache()`.\n */ class __PRIVATE_IndexedDbRemoteDocumentCacheImpl {\n constructor(e) {\n this.serializer = e;\n }\n setIndexManager(e) {\n this.indexManager = e;\n }\n /**\n * Adds the supplied entries to the cache.\n *\n * All calls of `addEntry` are required to go through the RemoteDocumentChangeBuffer\n * returned by `newChangeBuffer()` to ensure proper accounting of metadata.\n */ addEntry(e, t, n) {\n return __PRIVATE_remoteDocumentsStore(e).put(n);\n }\n /**\n * Removes a document from the cache.\n *\n * All calls of `removeEntry` are required to go through the RemoteDocumentChangeBuffer\n * returned by `newChangeBuffer()` to ensure proper accounting of metadata.\n */ removeEntry(e, t, n) {\n return __PRIVATE_remoteDocumentsStore(e).delete(\n /**\n * Returns a key that can be used for document lookups via the primary key of\n * the DbRemoteDocument object store.\n */\n function __PRIVATE_dbReadTimeKey(e, t) {\n const n = e.path.toArray();\n return [ \n /* prefix path */ n.slice(0, n.length - 2), \n /* collection id */ n[n.length - 2], __PRIVATE_toDbTimestampKey(t), \n /* document id */ n[n.length - 1] ];\n }\n /**\n * Returns a key that can be used for document lookups on the\n * `DbRemoteDocumentDocumentCollectionGroupIndex` index.\n */ (t, n));\n }\n /**\n * Updates the current cache size.\n *\n * Callers to `addEntry()` and `removeEntry()` *must* call this afterwards to update the\n * cache's metadata.\n */ updateMetadata(e, t) {\n return this.getMetadata(e).next((n => (n.byteSize += t, this.rr(e, n))));\n }\n getEntry(e, t) {\n let n = MutableDocument.newInvalidDocument(t);\n return __PRIVATE_remoteDocumentsStore(e).J({\n index: \"documentKeyIndex\",\n range: IDBKeyRange.only(__PRIVATE_dbKey(t))\n }, ((e, r) => {\n n = this.ir(t, r);\n })).next((() => n));\n }\n /**\n * Looks up an entry in the cache.\n *\n * @param documentKey - The key of the entry to look up.\n * @returns The cached document entry and its size.\n */ sr(e, t) {\n let n = {\n size: 0,\n document: MutableDocument.newInvalidDocument(t)\n };\n return __PRIVATE_remoteDocumentsStore(e).J({\n index: \"documentKeyIndex\",\n range: IDBKeyRange.only(__PRIVATE_dbKey(t))\n }, ((e, r) => {\n n = {\n document: this.ir(t, r),\n size: __PRIVATE_dbDocumentSize(r)\n };\n })).next((() => n));\n }\n getEntries(e, t) {\n let n = __PRIVATE_mutableDocumentMap();\n return this._r(e, t, ((e, t) => {\n const r = this.ir(e, t);\n n = n.insert(e, r);\n })).next((() => n));\n }\n /**\n * Looks up several entries in the cache.\n *\n * @param documentKeys - The set of keys entries to look up.\n * @returns A map of documents indexed by key and a map of sizes indexed by\n * key (zero if the document does not exist).\n */ ar(e, t) {\n let n = __PRIVATE_mutableDocumentMap(), r = new SortedMap(DocumentKey.comparator);\n return this._r(e, t, ((e, t) => {\n const i = this.ir(e, t);\n n = n.insert(e, i), r = r.insert(e, __PRIVATE_dbDocumentSize(t));\n })).next((() => ({\n documents: n,\n ur: r\n })));\n }\n _r(e, t, n) {\n if (t.isEmpty()) return PersistencePromise.resolve();\n let r = new SortedSet(__PRIVATE_dbKeyComparator);\n t.forEach((e => r = r.add(e)));\n const i = IDBKeyRange.bound(__PRIVATE_dbKey(r.first()), __PRIVATE_dbKey(r.last())), s = r.getIterator();\n let o = s.getNext();\n return __PRIVATE_remoteDocumentsStore(e).J({\n index: \"documentKeyIndex\",\n range: i\n }, ((e, t, r) => {\n const i = DocumentKey.fromSegments([ ...t.prefixPath, t.collectionGroup, t.documentId ]);\n // Go through keys not found in cache.\n for (;o && __PRIVATE_dbKeyComparator(o, i) < 0; ) n(o, null), o = s.getNext();\n o && o.isEqual(i) && (\n // Key found in cache.\n n(o, t), o = s.hasNext() ? s.getNext() : null), \n // Skip to the next key (if there is one).\n o ? r.$(__PRIVATE_dbKey(o)) : r.done();\n })).next((() => {\n // The rest of the keys are not in the cache. One case where `iterate`\n // above won't go through them is when the cache is empty.\n for (;o; ) n(o, null), o = s.hasNext() ? s.getNext() : null;\n }));\n }\n getDocumentsMatchingQuery(e, t, n, r, i) {\n const s = t.path, o = [ s.popLast().toArray(), s.lastSegment(), __PRIVATE_toDbTimestampKey(n.readTime), n.documentKey.path.isEmpty() ? \"\" : n.documentKey.path.lastSegment() ], _ = [ s.popLast().toArray(), s.lastSegment(), [ Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER ], \"\" ];\n return __PRIVATE_remoteDocumentsStore(e).U(IDBKeyRange.bound(o, _, !0)).next((e => {\n null == i || i.incrementDocumentReadCount(e.length);\n let n = __PRIVATE_mutableDocumentMap();\n for (const i of e) {\n const e = this.ir(DocumentKey.fromSegments(i.prefixPath.concat(i.collectionGroup, i.documentId)), i);\n e.isFoundDocument() && (__PRIVATE_queryMatches(t, e) || r.has(e.key)) && (\n // Either the document matches the given query, or it is mutated.\n n = n.insert(e.key, e));\n }\n return n;\n }));\n }\n getAllFromCollectionGroup(e, t, n, r) {\n let i = __PRIVATE_mutableDocumentMap();\n const s = __PRIVATE_dbCollectionGroupKey(t, n), o = __PRIVATE_dbCollectionGroupKey(t, IndexOffset.max());\n return __PRIVATE_remoteDocumentsStore(e).J({\n index: \"collectionGroupIndex\",\n range: IDBKeyRange.bound(s, o, !0)\n }, ((e, t, n) => {\n const s = this.ir(DocumentKey.fromSegments(t.prefixPath.concat(t.collectionGroup, t.documentId)), t);\n i = i.insert(s.key, s), i.size === r && n.done();\n })).next((() => i));\n }\n newChangeBuffer(e) {\n return new __PRIVATE_IndexedDbRemoteDocumentChangeBuffer(this, !!e && e.trackRemovals);\n }\n getSize(e) {\n return this.getMetadata(e).next((e => e.byteSize));\n }\n getMetadata(e) {\n return __PRIVATE_documentGlobalStore(e).get(\"remoteDocumentGlobalKey\").next((e => (__PRIVATE_hardAssert(!!e), \n e)));\n }\n rr(e, t) {\n return __PRIVATE_documentGlobalStore(e).put(\"remoteDocumentGlobalKey\", t);\n }\n /**\n * Decodes `dbRemoteDoc` and returns the document (or an invalid document if\n * the document corresponds to the format used for sentinel deletes).\n */ ir(e, t) {\n if (t) {\n const e = __PRIVATE_fromDbRemoteDocument(this.serializer, t);\n // Whether the document is a sentinel removal and should only be used in the\n // `getNewDocumentChanges()`\n if (!(e.isNoDocument() && e.version.isEqual(SnapshotVersion.min()))) return e;\n }\n return MutableDocument.newInvalidDocument(e);\n }\n}\n\n/** Creates a new IndexedDbRemoteDocumentCache. */ function __PRIVATE_newIndexedDbRemoteDocumentCache(e) {\n return new __PRIVATE_IndexedDbRemoteDocumentCacheImpl(e);\n}\n\n/**\n * Handles the details of adding and updating documents in the IndexedDbRemoteDocumentCache.\n *\n * Unlike the MemoryRemoteDocumentChangeBuffer, the IndexedDb implementation computes the size\n * delta for all submitted changes. This avoids having to re-read all documents from IndexedDb\n * when we apply the changes.\n */ class __PRIVATE_IndexedDbRemoteDocumentChangeBuffer extends RemoteDocumentChangeBuffer {\n /**\n * @param documentCache - The IndexedDbRemoteDocumentCache to apply the changes to.\n * @param trackRemovals - Whether to create sentinel deletes that can be tracked by\n * `getNewDocumentChanges()`.\n */\n constructor(e, t) {\n super(), this.cr = e, this.trackRemovals = t, \n // A map of document sizes and read times prior to applying the changes in\n // this buffer.\n this.lr = new ObjectMap((e => e.toString()), ((e, t) => e.isEqual(t)));\n }\n applyChanges(e) {\n const t = [];\n let n = 0, r = new SortedSet(((e, t) => __PRIVATE_primitiveComparator(e.canonicalString(), t.canonicalString())));\n return this.changes.forEach(((i, s) => {\n const o = this.lr.get(i);\n if (t.push(this.cr.removeEntry(e, i, o.readTime)), s.isValidDocument()) {\n const _ = __PRIVATE_toDbRemoteDocument(this.cr.serializer, s);\n r = r.add(i.path.popLast());\n const a = __PRIVATE_dbDocumentSize(_);\n n += a - o.size, t.push(this.cr.addEntry(e, i, _));\n } else if (n -= o.size, this.trackRemovals) {\n // In order to track removals, we store a \"sentinel delete\" in the\n // RemoteDocumentCache. This entry is represented by a NoDocument\n // with a version of 0 and ignored by `maybeDecodeDocument()` but\n // preserved in `getNewDocumentChanges()`.\n const n = __PRIVATE_toDbRemoteDocument(this.cr.serializer, s.convertToNoDocument(SnapshotVersion.min()));\n t.push(this.cr.addEntry(e, i, n));\n }\n })), r.forEach((n => {\n t.push(this.cr.indexManager.addToCollectionParentIndex(e, n));\n })), t.push(this.cr.updateMetadata(e, n)), PersistencePromise.waitFor(t);\n }\n getFromCache(e, t) {\n // Record the size of everything we load from the cache so we can compute a delta later.\n return this.cr.sr(e, t).next((e => (this.lr.set(t, {\n size: e.size,\n readTime: e.document.readTime\n }), e.document)));\n }\n getAllFromCache(e, t) {\n // Record the size of everything we load from the cache so we can compute\n // a delta later.\n return this.cr.ar(e, t).next((({documents: e, ur: t}) => (\n // Note: `getAllFromCache` returns two maps instead of a single map from\n // keys to `DocumentSizeEntry`s. This is to allow returning the\n // `MutableDocumentMap` directly, without a conversion.\n t.forEach(((t, n) => {\n this.lr.set(t, {\n size: n,\n readTime: e.get(t).readTime\n });\n })), e)));\n }\n}\n\nfunction __PRIVATE_documentGlobalStore(e) {\n return __PRIVATE_getStore(e, \"remoteDocumentGlobal\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the remoteDocuments object store.\n */ function __PRIVATE_remoteDocumentsStore(e) {\n return __PRIVATE_getStore(e, \"remoteDocumentsV14\");\n}\n\n/**\n * Returns a key that can be used for document lookups on the\n * `DbRemoteDocumentDocumentKeyIndex` index.\n */ function __PRIVATE_dbKey(e) {\n const t = e.path.toArray();\n return [ \n /* prefix path */ t.slice(0, t.length - 2), \n /* collection id */ t[t.length - 2], \n /* document id */ t[t.length - 1] ];\n}\n\nfunction __PRIVATE_dbCollectionGroupKey(e, t) {\n const n = t.documentKey.path.toArray();\n return [ \n /* collection id */ e, __PRIVATE_toDbTimestampKey(t.readTime), \n /* prefix path */ n.slice(0, n.length - 2), \n /* document id */ n.length > 0 ? n[n.length - 1] : \"\" ];\n}\n\n/**\n * Comparator that compares document keys according to the primary key sorting\n * used by the `DbRemoteDocumentDocument` store (by prefix path, collection id\n * and then document ID).\n *\n * Visible for testing.\n */ function __PRIVATE_dbKeyComparator(e, t) {\n const n = e.path.toArray(), r = t.path.toArray();\n // The ordering is based on https://chromium.googlesource.com/chromium/blink/+/fe5c21fef94dae71c1c3344775b8d8a7f7e6d9ec/Source/modules/indexeddb/IDBKey.cpp#74\n let i = 0;\n for (let e = 0; e < n.length - 2 && e < r.length - 2; ++e) if (i = __PRIVATE_primitiveComparator(n[e], r[e]), \n i) return i;\n return i = __PRIVATE_primitiveComparator(n.length, r.length), i || (i = __PRIVATE_primitiveComparator(n[n.length - 2], r[r.length - 2]), \n i || __PRIVATE_primitiveComparator(n[n.length - 1], r[r.length - 1]));\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Schema Version for the Web client:\n * 1. Initial version including Mutation Queue, Query Cache, and Remote\n * Document Cache\n * 2. Used to ensure a targetGlobal object exists and add targetCount to it. No\n * longer required because migration 3 unconditionally clears it.\n * 3. Dropped and re-created Query Cache to deal with cache corruption related\n * to limbo resolution. Addresses\n * https://github.com/firebase/firebase-ios-sdk/issues/1548\n * 4. Multi-Tab Support.\n * 5. Removal of held write acks.\n * 6. Create document global for tracking document cache size.\n * 7. Ensure every cached document has a sentinel row with a sequence number.\n * 8. Add collection-parent index for Collection Group queries.\n * 9. Change RemoteDocumentChanges store to be keyed by readTime rather than\n * an auto-incrementing ID. This is required for Index-Free queries.\n * 10. Rewrite the canonical IDs to the explicit Protobuf-based format.\n * 11. Add bundles and named_queries for bundle support.\n * 12. Add document overlays.\n * 13. Rewrite the keys of the remote document cache to allow for efficient\n * document lookup via `getAll()`.\n * 14. Add overlays.\n * 15. Add indexing support.\n * 16. Parse timestamp strings before creating index entries.\n */\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents a local view (overlay) of a document, and the fields that are\n * locally mutated.\n */\nclass OverlayedDocument {\n constructor(e, \n /**\n * The fields that are locally mutated by patch mutations.\n *\n * If the overlayed\tdocument is from set or delete mutations, this is `null`.\n * If there is no overlay (mutation) for the document, this is an empty `FieldMask`.\n */\n t) {\n this.overlayedDocument = e, this.mutatedFields = t;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A readonly view of the local state of all documents we're tracking (i.e. we\n * have a cached version in remoteDocumentCache or local mutations for the\n * document). The view is computed by applying the mutations in the\n * MutationQueue to the RemoteDocumentCache.\n */ class LocalDocumentsView {\n constructor(e, t, n, r) {\n this.remoteDocumentCache = e, this.mutationQueue = t, this.documentOverlayCache = n, \n this.indexManager = r;\n }\n /**\n * Get the local view of the document identified by `key`.\n *\n * @returns Local view of the document or null if we don't have any cached\n * state for it.\n */ getDocument(e, t) {\n let n = null;\n return this.documentOverlayCache.getOverlay(e, t).next((r => (n = r, this.remoteDocumentCache.getEntry(e, t)))).next((e => (null !== n && __PRIVATE_mutationApplyToLocalView(n.mutation, e, FieldMask.empty(), Timestamp.now()), \n e)));\n }\n /**\n * Gets the local view of the documents identified by `keys`.\n *\n * If we don't have cached state for a document in `keys`, a NoDocument will\n * be stored for that key in the resulting set.\n */ getDocuments(e, t) {\n return this.remoteDocumentCache.getEntries(e, t).next((t => this.getLocalViewOfDocuments(e, t, __PRIVATE_documentKeySet()).next((() => t))));\n }\n /**\n * Similar to `getDocuments`, but creates the local view from the given\n * `baseDocs` without retrieving documents from the local store.\n *\n * @param transaction - The transaction this operation is scoped to.\n * @param docs - The documents to apply local mutations to get the local views.\n * @param existenceStateChanged - The set of document keys whose existence state\n * is changed. This is useful to determine if some documents overlay needs\n * to be recalculated.\n */ getLocalViewOfDocuments(e, t, n = __PRIVATE_documentKeySet()) {\n const r = __PRIVATE_newOverlayMap();\n return this.populateOverlays(e, r, t).next((() => this.computeViews(e, t, r, n).next((e => {\n let t = documentMap();\n return e.forEach(((e, n) => {\n t = t.insert(e, n.overlayedDocument);\n })), t;\n }))));\n }\n /**\n * Gets the overlayed documents for the given document map, which will include\n * the local view of those documents and a `FieldMask` indicating which fields\n * are mutated locally, `null` if overlay is a Set or Delete mutation.\n */ getOverlayedDocuments(e, t) {\n const n = __PRIVATE_newOverlayMap();\n return this.populateOverlays(e, n, t).next((() => this.computeViews(e, t, n, __PRIVATE_documentKeySet())));\n }\n /**\n * Fetches the overlays for {@code docs} and adds them to provided overlay map\n * if the map does not already contain an entry for the given document key.\n */ populateOverlays(e, t, n) {\n const r = [];\n return n.forEach((e => {\n t.has(e) || r.push(e);\n })), this.documentOverlayCache.getOverlays(e, r).next((e => {\n e.forEach(((e, n) => {\n t.set(e, n);\n }));\n }));\n }\n /**\n * Computes the local view for the given documents.\n *\n * @param docs - The documents to compute views for. It also has the base\n * version of the documents.\n * @param overlays - The overlays that need to be applied to the given base\n * version of the documents.\n * @param existenceStateChanged - A set of documents whose existence states\n * might have changed. This is used to determine if we need to re-calculate\n * overlays from mutation queues.\n * @return A map represents the local documents view.\n */ computeViews(e, t, n, r) {\n let i = __PRIVATE_mutableDocumentMap();\n const s = __PRIVATE_newDocumentKeyMap(), o = function __PRIVATE_newOverlayedDocumentMap() {\n return __PRIVATE_newDocumentKeyMap();\n }();\n return t.forEach(((e, t) => {\n const o = n.get(t.key);\n // Recalculate an overlay if the document's existence state changed due to\n // a remote event *and* the overlay is a PatchMutation. This is because\n // document existence state can change if some patch mutation's\n // preconditions are met.\n // NOTE: we recalculate when `overlay` is undefined as well, because there\n // might be a patch mutation whose precondition does not match before the\n // change (hence overlay is undefined), but would now match.\n r.has(t.key) && (void 0 === o || o.mutation instanceof __PRIVATE_PatchMutation) ? i = i.insert(t.key, t) : void 0 !== o ? (s.set(t.key, o.mutation.getFieldMask()), \n __PRIVATE_mutationApplyToLocalView(o.mutation, t, o.mutation.getFieldMask(), Timestamp.now())) : \n // no overlay exists\n // Using EMPTY to indicate there is no overlay for the document.\n s.set(t.key, FieldMask.empty());\n })), this.recalculateAndSaveOverlays(e, i).next((e => (e.forEach(((e, t) => s.set(e, t))), \n t.forEach(((e, t) => {\n var n;\n return o.set(e, new OverlayedDocument(t, null !== (n = s.get(e)) && void 0 !== n ? n : null));\n })), o)));\n }\n recalculateAndSaveOverlays(e, t) {\n const n = __PRIVATE_newDocumentKeyMap();\n // A reverse lookup map from batch id to the documents within that batch.\n let r = new SortedMap(((e, t) => e - t)), i = __PRIVATE_documentKeySet();\n return this.mutationQueue.getAllMutationBatchesAffectingDocumentKeys(e, t).next((e => {\n for (const i of e) i.keys().forEach((e => {\n const s = t.get(e);\n if (null === s) return;\n let o = n.get(e) || FieldMask.empty();\n o = i.applyToLocalView(s, o), n.set(e, o);\n const _ = (r.get(i.batchId) || __PRIVATE_documentKeySet()).add(e);\n r = r.insert(i.batchId, _);\n }));\n })).next((() => {\n const s = [], o = r.getReverseIterator();\n // Iterate in descending order of batch IDs, and skip documents that are\n // already saved.\n for (;o.hasNext(); ) {\n const r = o.getNext(), _ = r.key, a = r.value, u = __PRIVATE_newMutationMap();\n a.forEach((e => {\n if (!i.has(e)) {\n const r = __PRIVATE_calculateOverlayMutation(t.get(e), n.get(e));\n null !== r && u.set(e, r), i = i.add(e);\n }\n })), s.push(this.documentOverlayCache.saveOverlays(e, _, u));\n }\n return PersistencePromise.waitFor(s);\n })).next((() => n));\n }\n /**\n * Recalculates overlays by reading the documents from remote document cache\n * first, and saves them after they are calculated.\n */ recalculateAndSaveOverlaysForDocumentKeys(e, t) {\n return this.remoteDocumentCache.getEntries(e, t).next((t => this.recalculateAndSaveOverlays(e, t)));\n }\n /**\n * Performs a query against the local view of all documents.\n *\n * @param transaction - The persistence transaction.\n * @param query - The query to match documents against.\n * @param offset - Read time and key to start scanning by (exclusive).\n * @param context - A optional tracker to keep a record of important details\n * during database local query execution.\n */ getDocumentsMatchingQuery(e, t, n, r) {\n /**\n * Returns whether the query matches a single document by path (rather than a\n * collection).\n */\n return function __PRIVATE_isDocumentQuery$1(e) {\n return DocumentKey.isDocumentKey(e.path) && null === e.collectionGroup && 0 === e.filters.length;\n }(t) ? this.getDocumentsMatchingDocumentQuery(e, t.path) : __PRIVATE_isCollectionGroupQuery(t) ? this.getDocumentsMatchingCollectionGroupQuery(e, t, n, r) : this.getDocumentsMatchingCollectionQuery(e, t, n, r);\n }\n /**\n * Given a collection group, returns the next documents that follow the provided offset, along\n * with an updated batch ID.\n *\n *

    The documents returned by this method are ordered by remote version from the provided\n * offset. If there are no more remote documents after the provided offset, documents with\n * mutations in order of batch id from the offset are returned. Since all documents in a batch are\n * returned together, the total number of documents returned can exceed {@code count}.\n *\n * @param transaction\n * @param collectionGroup The collection group for the documents.\n * @param offset The offset to index into.\n * @param count The number of documents to return\n * @return A LocalWriteResult with the documents that follow the provided offset and the last processed batch id.\n */ getNextDocuments(e, t, n, r) {\n return this.remoteDocumentCache.getAllFromCollectionGroup(e, t, n, r).next((i => {\n const s = r - i.size > 0 ? this.documentOverlayCache.getOverlaysForCollectionGroup(e, t, n.largestBatchId, r - i.size) : PersistencePromise.resolve(__PRIVATE_newOverlayMap());\n // The callsite will use the largest batch ID together with the latest read time to create\n // a new index offset. Since we only process batch IDs if all remote documents have been read,\n // no overlay will increase the overall read time. This is why we only need to special case\n // the batch id.\n let o = -1, _ = i;\n return s.next((t => PersistencePromise.forEach(t, ((t, n) => (o < n.largestBatchId && (o = n.largestBatchId), \n i.get(t) ? PersistencePromise.resolve() : this.remoteDocumentCache.getEntry(e, t).next((e => {\n _ = _.insert(t, e);\n }))))).next((() => this.populateOverlays(e, t, i))).next((() => this.computeViews(e, _, t, __PRIVATE_documentKeySet()))).next((e => ({\n batchId: o,\n changes: __PRIVATE_convertOverlayedDocumentMapToDocumentMap(e)\n })))));\n }));\n }\n getDocumentsMatchingDocumentQuery(e, t) {\n // Just do a simple document lookup.\n return this.getDocument(e, new DocumentKey(t)).next((e => {\n let t = documentMap();\n return e.isFoundDocument() && (t = t.insert(e.key, e)), t;\n }));\n }\n getDocumentsMatchingCollectionGroupQuery(e, t, n, r) {\n const i = t.collectionGroup;\n let s = documentMap();\n return this.indexManager.getCollectionParents(e, i).next((o => PersistencePromise.forEach(o, (o => {\n const _ = function __PRIVATE_asCollectionQueryAtPath(e, t) {\n return new __PRIVATE_QueryImpl(t, \n /*collectionGroup=*/ null, e.explicitOrderBy.slice(), e.filters.slice(), e.limit, e.limitType, e.startAt, e.endAt);\n }(t, o.child(i));\n return this.getDocumentsMatchingCollectionQuery(e, _, n, r).next((e => {\n e.forEach(((e, t) => {\n s = s.insert(e, t);\n }));\n }));\n })).next((() => s))));\n }\n getDocumentsMatchingCollectionQuery(e, t, n, r) {\n // Query the remote documents and overlay mutations.\n let i;\n return this.documentOverlayCache.getOverlaysForCollection(e, t.path, n.largestBatchId).next((s => (i = s, \n this.remoteDocumentCache.getDocumentsMatchingQuery(e, t, n, i, r)))).next((e => {\n // As documents might match the query because of their overlay we need to\n // include documents for all overlays in the initial document set.\n i.forEach(((t, n) => {\n const r = n.getKey();\n null === e.get(r) && (e = e.insert(r, MutableDocument.newInvalidDocument(r)));\n }));\n // Apply the overlays and match against the query.\n let n = documentMap();\n return e.forEach(((e, r) => {\n const s = i.get(e);\n void 0 !== s && __PRIVATE_mutationApplyToLocalView(s.mutation, r, FieldMask.empty(), Timestamp.now()), \n // Finally, insert the documents that still match the query\n __PRIVATE_queryMatches(t, r) && (n = n.insert(e, r));\n })), n;\n }));\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_MemoryBundleCache {\n constructor(e) {\n this.serializer = e, this.hr = new Map, this.Pr = new Map;\n }\n getBundleMetadata(e, t) {\n return PersistencePromise.resolve(this.hr.get(t));\n }\n saveBundleMetadata(e, t) {\n return this.hr.set(t.id, \n /** Decodes a BundleMetadata proto into a BundleMetadata object. */\n function __PRIVATE_fromBundleMetadata(e) {\n return {\n id: e.id,\n version: e.version,\n createTime: __PRIVATE_fromVersion(e.createTime)\n };\n }(t)), PersistencePromise.resolve();\n }\n getNamedQuery(e, t) {\n return PersistencePromise.resolve(this.Pr.get(t));\n }\n saveNamedQuery(e, t) {\n return this.Pr.set(t.name, function __PRIVATE_fromProtoNamedQuery(e) {\n return {\n name: e.name,\n query: __PRIVATE_fromBundledQuery(e.bundledQuery),\n readTime: __PRIVATE_fromVersion(e.readTime)\n };\n }(t)), PersistencePromise.resolve();\n }\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An in-memory implementation of DocumentOverlayCache.\n */ class __PRIVATE_MemoryDocumentOverlayCache {\n constructor() {\n // A map sorted by DocumentKey, whose value is a pair of the largest batch id\n // for the overlay and the overlay itself.\n this.overlays = new SortedMap(DocumentKey.comparator), this.Ir = new Map;\n }\n getOverlay(e, t) {\n return PersistencePromise.resolve(this.overlays.get(t));\n }\n getOverlays(e, t) {\n const n = __PRIVATE_newOverlayMap();\n return PersistencePromise.forEach(t, (t => this.getOverlay(e, t).next((e => {\n null !== e && n.set(t, e);\n })))).next((() => n));\n }\n saveOverlays(e, t, n) {\n return n.forEach(((n, r) => {\n this.ht(e, t, r);\n })), PersistencePromise.resolve();\n }\n removeOverlaysForBatchId(e, t, n) {\n const r = this.Ir.get(n);\n return void 0 !== r && (r.forEach((e => this.overlays = this.overlays.remove(e))), \n this.Ir.delete(n)), PersistencePromise.resolve();\n }\n getOverlaysForCollection(e, t, n) {\n const r = __PRIVATE_newOverlayMap(), i = t.length + 1, s = new DocumentKey(t.child(\"\")), o = this.overlays.getIteratorFrom(s);\n for (;o.hasNext(); ) {\n const e = o.getNext().value, s = e.getKey();\n if (!t.isPrefixOf(s.path)) break;\n // Documents from sub-collections\n s.path.length === i && (e.largestBatchId > n && r.set(e.getKey(), e));\n }\n return PersistencePromise.resolve(r);\n }\n getOverlaysForCollectionGroup(e, t, n, r) {\n let i = new SortedMap(((e, t) => e - t));\n const s = this.overlays.getIterator();\n for (;s.hasNext(); ) {\n const e = s.getNext().value;\n if (e.getKey().getCollectionGroup() === t && e.largestBatchId > n) {\n let t = i.get(e.largestBatchId);\n null === t && (t = __PRIVATE_newOverlayMap(), i = i.insert(e.largestBatchId, t)), \n t.set(e.getKey(), e);\n }\n }\n const o = __PRIVATE_newOverlayMap(), _ = i.getIterator();\n for (;_.hasNext(); ) {\n if (_.getNext().value.forEach(((e, t) => o.set(e, t))), o.size() >= r) break;\n }\n return PersistencePromise.resolve(o);\n }\n ht(e, t, n) {\n // Remove the association of the overlay to its batch id.\n const r = this.overlays.get(n.key);\n if (null !== r) {\n const e = this.Ir.get(r.largestBatchId).delete(n.key);\n this.Ir.set(r.largestBatchId, e);\n }\n this.overlays = this.overlays.insert(n.key, new Overlay(t, n));\n // Create the association of this overlay to the given largestBatchId.\n let i = this.Ir.get(t);\n void 0 === i && (i = __PRIVATE_documentKeySet(), this.Ir.set(t, i)), this.Ir.set(t, i.add(n.key));\n }\n}\n\n/**\n * @license\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_MemoryGlobalsCache {\n constructor() {\n this.sessionToken = ByteString.EMPTY_BYTE_STRING;\n }\n getSessionToken(e) {\n return PersistencePromise.resolve(this.sessionToken);\n }\n setSessionToken(e, t) {\n return this.sessionToken = t, PersistencePromise.resolve();\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A collection of references to a document from some kind of numbered entity\n * (either a target ID or batch ID). As references are added to or removed from\n * the set corresponding events are emitted to a registered garbage collector.\n *\n * Each reference is represented by a DocumentReference object. Each of them\n * contains enough information to uniquely identify the reference. They are all\n * stored primarily in a set sorted by key. A document is considered garbage if\n * there's no references in that set (this can be efficiently checked thanks to\n * sorting by key).\n *\n * ReferenceSet also keeps a secondary set that contains references sorted by\n * IDs. This one is used to efficiently implement removal of all references by\n * some target ID.\n */ class __PRIVATE_ReferenceSet {\n constructor() {\n // A set of outstanding references to a document sorted by key.\n this.Tr = new SortedSet(__PRIVATE_DocReference.Er), \n // A set of outstanding references to a document sorted by target id.\n this.dr = new SortedSet(__PRIVATE_DocReference.Ar);\n }\n /** Returns true if the reference set contains no references. */ isEmpty() {\n return this.Tr.isEmpty();\n }\n /** Adds a reference to the given document key for the given ID. */ addReference(e, t) {\n const n = new __PRIVATE_DocReference(e, t);\n this.Tr = this.Tr.add(n), this.dr = this.dr.add(n);\n }\n /** Add references to the given document keys for the given ID. */ Rr(e, t) {\n e.forEach((e => this.addReference(e, t)));\n }\n /**\n * Removes a reference to the given document key for the given\n * ID.\n */ removeReference(e, t) {\n this.Vr(new __PRIVATE_DocReference(e, t));\n }\n mr(e, t) {\n e.forEach((e => this.removeReference(e, t)));\n }\n /**\n * Clears all references with a given ID. Calls removeRef() for each key\n * removed.\n */ gr(e) {\n const t = new DocumentKey(new ResourcePath([])), n = new __PRIVATE_DocReference(t, e), r = new __PRIVATE_DocReference(t, e + 1), i = [];\n return this.dr.forEachInRange([ n, r ], (e => {\n this.Vr(e), i.push(e.key);\n })), i;\n }\n pr() {\n this.Tr.forEach((e => this.Vr(e)));\n }\n Vr(e) {\n this.Tr = this.Tr.delete(e), this.dr = this.dr.delete(e);\n }\n yr(e) {\n const t = new DocumentKey(new ResourcePath([])), n = new __PRIVATE_DocReference(t, e), r = new __PRIVATE_DocReference(t, e + 1);\n let i = __PRIVATE_documentKeySet();\n return this.dr.forEachInRange([ n, r ], (e => {\n i = i.add(e.key);\n })), i;\n }\n containsKey(e) {\n const t = new __PRIVATE_DocReference(e, 0), n = this.Tr.firstAfterOrEqual(t);\n return null !== n && e.isEqual(n.key);\n }\n}\n\nclass __PRIVATE_DocReference {\n constructor(e, t) {\n this.key = e, this.wr = t;\n }\n /** Compare by key then by ID */ static Er(e, t) {\n return DocumentKey.comparator(e.key, t.key) || __PRIVATE_primitiveComparator(e.wr, t.wr);\n }\n /** Compare by ID then by key */ static Ar(e, t) {\n return __PRIVATE_primitiveComparator(e.wr, t.wr) || DocumentKey.comparator(e.key, t.key);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_MemoryMutationQueue {\n constructor(e, t) {\n this.indexManager = e, this.referenceDelegate = t, \n /**\n * The set of all mutations that have been sent but not yet been applied to\n * the backend.\n */\n this.mutationQueue = [], \n /** Next value to use when assigning sequential IDs to each mutation batch. */\n this.Sr = 1, \n /** An ordered mapping between documents and the mutations batch IDs. */\n this.br = new SortedSet(__PRIVATE_DocReference.Er);\n }\n checkEmpty(e) {\n return PersistencePromise.resolve(0 === this.mutationQueue.length);\n }\n addMutationBatch(e, t, n, r) {\n const i = this.Sr;\n this.Sr++, this.mutationQueue.length > 0 && this.mutationQueue[this.mutationQueue.length - 1];\n const s = new MutationBatch(i, t, n, r);\n this.mutationQueue.push(s);\n // Track references by document key and index collection parents.\n for (const t of r) this.br = this.br.add(new __PRIVATE_DocReference(t.key, i)), \n this.indexManager.addToCollectionParentIndex(e, t.key.path.popLast());\n return PersistencePromise.resolve(s);\n }\n lookupMutationBatch(e, t) {\n return PersistencePromise.resolve(this.Dr(t));\n }\n getNextMutationBatchAfterBatchId(e, t) {\n const n = t + 1, r = this.vr(n), i = r < 0 ? 0 : r;\n // The requested batchId may still be out of range so normalize it to the\n // start of the queue.\n return PersistencePromise.resolve(this.mutationQueue.length > i ? this.mutationQueue[i] : null);\n }\n getHighestUnacknowledgedBatchId() {\n return PersistencePromise.resolve(0 === this.mutationQueue.length ? -1 : this.Sr - 1);\n }\n getAllMutationBatches(e) {\n return PersistencePromise.resolve(this.mutationQueue.slice());\n }\n getAllMutationBatchesAffectingDocumentKey(e, t) {\n const n = new __PRIVATE_DocReference(t, 0), r = new __PRIVATE_DocReference(t, Number.POSITIVE_INFINITY), i = [];\n return this.br.forEachInRange([ n, r ], (e => {\n const t = this.Dr(e.wr);\n i.push(t);\n })), PersistencePromise.resolve(i);\n }\n getAllMutationBatchesAffectingDocumentKeys(e, t) {\n let n = new SortedSet(__PRIVATE_primitiveComparator);\n return t.forEach((e => {\n const t = new __PRIVATE_DocReference(e, 0), r = new __PRIVATE_DocReference(e, Number.POSITIVE_INFINITY);\n this.br.forEachInRange([ t, r ], (e => {\n n = n.add(e.wr);\n }));\n })), PersistencePromise.resolve(this.Cr(n));\n }\n getAllMutationBatchesAffectingQuery(e, t) {\n // Use the query path as a prefix for testing if a document matches the\n // query.\n const n = t.path, r = n.length + 1;\n // Construct a document reference for actually scanning the index. Unlike\n // the prefix the document key in this reference must have an even number of\n // segments. The empty segment can be used a suffix of the query path\n // because it precedes all other segments in an ordered traversal.\n let i = n;\n DocumentKey.isDocumentKey(i) || (i = i.child(\"\"));\n const s = new __PRIVATE_DocReference(new DocumentKey(i), 0);\n // Find unique batchIDs referenced by all documents potentially matching the\n // query.\n let o = new SortedSet(__PRIVATE_primitiveComparator);\n return this.br.forEachWhile((e => {\n const t = e.key.path;\n return !!n.isPrefixOf(t) && (\n // Rows with document keys more than one segment longer than the query\n // path can't be matches. For example, a query on 'rooms' can't match\n // the document /rooms/abc/messages/xyx.\n // TODO(mcg): we'll need a different scanner when we implement\n // ancestor queries.\n t.length === r && (o = o.add(e.wr)), !0);\n }), s), PersistencePromise.resolve(this.Cr(o));\n }\n Cr(e) {\n // Construct an array of matching batches, sorted by batchID to ensure that\n // multiple mutations affecting the same document key are applied in order.\n const t = [];\n return e.forEach((e => {\n const n = this.Dr(e);\n null !== n && t.push(n);\n })), t;\n }\n removeMutationBatch(e, t) {\n __PRIVATE_hardAssert(0 === this.Fr(t.batchId, \"removed\")), this.mutationQueue.shift();\n let n = this.br;\n return PersistencePromise.forEach(t.mutations, (r => {\n const i = new __PRIVATE_DocReference(r.key, t.batchId);\n return n = n.delete(i), this.referenceDelegate.markPotentiallyOrphaned(e, r.key);\n })).next((() => {\n this.br = n;\n }));\n }\n On(e) {\n // No-op since the memory mutation queue does not maintain a separate cache.\n }\n containsKey(e, t) {\n const n = new __PRIVATE_DocReference(t, 0), r = this.br.firstAfterOrEqual(n);\n return PersistencePromise.resolve(t.isEqual(r && r.key));\n }\n performConsistencyCheck(e) {\n return this.mutationQueue.length, PersistencePromise.resolve();\n }\n /**\n * Finds the index of the given batchId in the mutation queue and asserts that\n * the resulting index is within the bounds of the queue.\n *\n * @param batchId - The batchId to search for\n * @param action - A description of what the caller is doing, phrased in passive\n * form (e.g. \"acknowledged\" in a routine that acknowledges batches).\n */ Fr(e, t) {\n return this.vr(e);\n }\n /**\n * Finds the index of the given batchId in the mutation queue. This operation\n * is O(1).\n *\n * @returns The computed index of the batch with the given batchId, based on\n * the state of the queue. Note this index can be negative if the requested\n * batchId has already been removed from the queue or past the end of the\n * queue if the batchId is larger than the last added batch.\n */ vr(e) {\n if (0 === this.mutationQueue.length) \n // As an index this is past the end of the queue\n return 0;\n // Examine the front of the queue to figure out the difference between the\n // batchId and indexes in the array. Note that since the queue is ordered\n // by batchId, if the first batch has a larger batchId then the requested\n // batchId doesn't exist in the queue.\n return e - this.mutationQueue[0].batchId;\n }\n /**\n * A version of lookupMutationBatch that doesn't return a promise, this makes\n * other functions that uses this code easier to read and more efficient.\n */ Dr(e) {\n const t = this.vr(e);\n if (t < 0 || t >= this.mutationQueue.length) return null;\n return this.mutationQueue[t];\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The memory-only RemoteDocumentCache for IndexedDb. To construct, invoke\n * `newMemoryRemoteDocumentCache()`.\n */\nclass __PRIVATE_MemoryRemoteDocumentCacheImpl {\n /**\n * @param sizer - Used to assess the size of a document. For eager GC, this is\n * expected to just return 0 to avoid unnecessarily doing the work of\n * calculating the size.\n */\n constructor(e) {\n this.Mr = e, \n /** Underlying cache of documents and their read times. */\n this.docs = function __PRIVATE_documentEntryMap() {\n return new SortedMap(DocumentKey.comparator);\n }(), \n /** Size of all cached documents. */\n this.size = 0;\n }\n setIndexManager(e) {\n this.indexManager = e;\n }\n /**\n * Adds the supplied entry to the cache and updates the cache size as appropriate.\n *\n * All calls of `addEntry` are required to go through the RemoteDocumentChangeBuffer\n * returned by `newChangeBuffer()`.\n */ addEntry(e, t) {\n const n = t.key, r = this.docs.get(n), i = r ? r.size : 0, s = this.Mr(t);\n return this.docs = this.docs.insert(n, {\n document: t.mutableCopy(),\n size: s\n }), this.size += s - i, this.indexManager.addToCollectionParentIndex(e, n.path.popLast());\n }\n /**\n * Removes the specified entry from the cache and updates the cache size as appropriate.\n *\n * All calls of `removeEntry` are required to go through the RemoteDocumentChangeBuffer\n * returned by `newChangeBuffer()`.\n */ removeEntry(e) {\n const t = this.docs.get(e);\n t && (this.docs = this.docs.remove(e), this.size -= t.size);\n }\n getEntry(e, t) {\n const n = this.docs.get(t);\n return PersistencePromise.resolve(n ? n.document.mutableCopy() : MutableDocument.newInvalidDocument(t));\n }\n getEntries(e, t) {\n let n = __PRIVATE_mutableDocumentMap();\n return t.forEach((e => {\n const t = this.docs.get(e);\n n = n.insert(e, t ? t.document.mutableCopy() : MutableDocument.newInvalidDocument(e));\n })), PersistencePromise.resolve(n);\n }\n getDocumentsMatchingQuery(e, t, n, r) {\n let i = __PRIVATE_mutableDocumentMap();\n // Documents are ordered by key, so we can use a prefix scan to narrow down\n // the documents we need to match the query against.\n const s = t.path, o = new DocumentKey(s.child(\"\")), _ = this.docs.getIteratorFrom(o);\n for (;_.hasNext(); ) {\n const {key: e, value: {document: o}} = _.getNext();\n if (!s.isPrefixOf(e.path)) break;\n e.path.length > s.length + 1 || (__PRIVATE_indexOffsetComparator(__PRIVATE_newIndexOffsetFromDocument(o), n) <= 0 || (r.has(o.key) || __PRIVATE_queryMatches(t, o)) && (i = i.insert(o.key, o.mutableCopy())));\n }\n return PersistencePromise.resolve(i);\n }\n getAllFromCollectionGroup(e, t, n, r) {\n // This method should only be called from the IndexBackfiller if persistence\n // is enabled.\n fail();\n }\n Or(e, t) {\n return PersistencePromise.forEach(this.docs, (e => t(e)));\n }\n newChangeBuffer(e) {\n // `trackRemovals` is ignores since the MemoryRemoteDocumentCache keeps\n // a separate changelog and does not need special handling for removals.\n return new __PRIVATE_MemoryRemoteDocumentChangeBuffer(this);\n }\n getSize(e) {\n return PersistencePromise.resolve(this.size);\n }\n}\n\n/**\n * Creates a new memory-only RemoteDocumentCache.\n *\n * @param sizer - Used to assess the size of a document. For eager GC, this is\n * expected to just return 0 to avoid unnecessarily doing the work of\n * calculating the size.\n */\n/**\n * Handles the details of adding and updating documents in the MemoryRemoteDocumentCache.\n */\nclass __PRIVATE_MemoryRemoteDocumentChangeBuffer extends RemoteDocumentChangeBuffer {\n constructor(e) {\n super(), this.cr = e;\n }\n applyChanges(e) {\n const t = [];\n return this.changes.forEach(((n, r) => {\n r.isValidDocument() ? t.push(this.cr.addEntry(e, r)) : this.cr.removeEntry(n);\n })), PersistencePromise.waitFor(t);\n }\n getFromCache(e, t) {\n return this.cr.getEntry(e, t);\n }\n getAllFromCache(e, t) {\n return this.cr.getEntries(e, t);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_MemoryTargetCache {\n constructor(e) {\n this.persistence = e, \n /**\n * Maps a target to the data about that target\n */\n this.Nr = new ObjectMap((e => __PRIVATE_canonifyTarget(e)), __PRIVATE_targetEquals), \n /** The last received snapshot version. */\n this.lastRemoteSnapshotVersion = SnapshotVersion.min(), \n /** The highest numbered target ID encountered. */\n this.highestTargetId = 0, \n /** The highest sequence number encountered. */\n this.Lr = 0, \n /**\n * A ordered bidirectional mapping between documents and the remote target\n * IDs.\n */\n this.Br = new __PRIVATE_ReferenceSet, this.targetCount = 0, this.kr = __PRIVATE_TargetIdGenerator.Bn();\n }\n forEachTarget(e, t) {\n return this.Nr.forEach(((e, n) => t(n))), PersistencePromise.resolve();\n }\n getLastRemoteSnapshotVersion(e) {\n return PersistencePromise.resolve(this.lastRemoteSnapshotVersion);\n }\n getHighestSequenceNumber(e) {\n return PersistencePromise.resolve(this.Lr);\n }\n allocateTargetId(e) {\n return this.highestTargetId = this.kr.next(), PersistencePromise.resolve(this.highestTargetId);\n }\n setTargetsMetadata(e, t, n) {\n return n && (this.lastRemoteSnapshotVersion = n), t > this.Lr && (this.Lr = t), \n PersistencePromise.resolve();\n }\n Kn(e) {\n this.Nr.set(e.target, e);\n const t = e.targetId;\n t > this.highestTargetId && (this.kr = new __PRIVATE_TargetIdGenerator(t), this.highestTargetId = t), \n e.sequenceNumber > this.Lr && (this.Lr = e.sequenceNumber);\n }\n addTargetData(e, t) {\n return this.Kn(t), this.targetCount += 1, PersistencePromise.resolve();\n }\n updateTargetData(e, t) {\n return this.Kn(t), PersistencePromise.resolve();\n }\n removeTargetData(e, t) {\n return this.Nr.delete(t.target), this.Br.gr(t.targetId), this.targetCount -= 1, \n PersistencePromise.resolve();\n }\n removeTargets(e, t, n) {\n let r = 0;\n const i = [];\n return this.Nr.forEach(((s, o) => {\n o.sequenceNumber <= t && null === n.get(o.targetId) && (this.Nr.delete(s), i.push(this.removeMatchingKeysForTargetId(e, o.targetId)), \n r++);\n })), PersistencePromise.waitFor(i).next((() => r));\n }\n getTargetCount(e) {\n return PersistencePromise.resolve(this.targetCount);\n }\n getTargetData(e, t) {\n const n = this.Nr.get(t) || null;\n return PersistencePromise.resolve(n);\n }\n addMatchingKeys(e, t, n) {\n return this.Br.Rr(t, n), PersistencePromise.resolve();\n }\n removeMatchingKeys(e, t, n) {\n this.Br.mr(t, n);\n const r = this.persistence.referenceDelegate, i = [];\n return r && t.forEach((t => {\n i.push(r.markPotentiallyOrphaned(e, t));\n })), PersistencePromise.waitFor(i);\n }\n removeMatchingKeysForTargetId(e, t) {\n return this.Br.gr(t), PersistencePromise.resolve();\n }\n getMatchingKeysForTargetId(e, t) {\n const n = this.Br.yr(t);\n return PersistencePromise.resolve(n);\n }\n containsKey(e, t) {\n return PersistencePromise.resolve(this.Br.containsKey(t));\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A memory-backed instance of Persistence. Data is stored only in RAM and\n * not persisted across sessions.\n */\nclass __PRIVATE_MemoryPersistence {\n /**\n * The constructor accepts a factory for creating a reference delegate. This\n * allows both the delegate and this instance to have strong references to\n * each other without having nullable fields that would then need to be\n * checked or asserted on every access.\n */\n constructor(e, t) {\n this.qr = {}, this.overlays = {}, this.Qr = new __PRIVATE_ListenSequence(0), this.Kr = !1, \n this.Kr = !0, this.$r = new __PRIVATE_MemoryGlobalsCache, this.referenceDelegate = e(this), \n this.Ur = new __PRIVATE_MemoryTargetCache(this);\n this.indexManager = new __PRIVATE_MemoryIndexManager, this.remoteDocumentCache = function __PRIVATE_newMemoryRemoteDocumentCache(e) {\n return new __PRIVATE_MemoryRemoteDocumentCacheImpl(e);\n }((e => this.referenceDelegate.Wr(e))), this.serializer = new __PRIVATE_LocalSerializer(t), \n this.Gr = new __PRIVATE_MemoryBundleCache(this.serializer);\n }\n start() {\n return Promise.resolve();\n }\n shutdown() {\n // No durable state to ensure is closed on shutdown.\n return this.Kr = !1, Promise.resolve();\n }\n get started() {\n return this.Kr;\n }\n setDatabaseDeletedListener() {\n // No op.\n }\n setNetworkEnabled() {\n // No op.\n }\n getIndexManager(e) {\n // We do not currently support indices for memory persistence, so we can\n // return the same shared instance of the memory index manager.\n return this.indexManager;\n }\n getDocumentOverlayCache(e) {\n let t = this.overlays[e.toKey()];\n return t || (t = new __PRIVATE_MemoryDocumentOverlayCache, this.overlays[e.toKey()] = t), \n t;\n }\n getMutationQueue(e, t) {\n let n = this.qr[e.toKey()];\n return n || (n = new __PRIVATE_MemoryMutationQueue(t, this.referenceDelegate), this.qr[e.toKey()] = n), \n n;\n }\n getGlobalsCache() {\n return this.$r;\n }\n getTargetCache() {\n return this.Ur;\n }\n getRemoteDocumentCache() {\n return this.remoteDocumentCache;\n }\n getBundleCache() {\n return this.Gr;\n }\n runTransaction(e, t, n) {\n __PRIVATE_logDebug(\"MemoryPersistence\", \"Starting transaction:\", e);\n const r = new __PRIVATE_MemoryTransaction(this.Qr.next());\n return this.referenceDelegate.zr(), n(r).next((e => this.referenceDelegate.jr(r).next((() => e)))).toPromise().then((e => (r.raiseOnCommittedEvent(), \n e)));\n }\n Hr(e, t) {\n return PersistencePromise.or(Object.values(this.qr).map((n => () => n.containsKey(e, t))));\n }\n}\n\n/**\n * Memory persistence is not actually transactional, but future implementations\n * may have transaction-scoped state.\n */ class __PRIVATE_MemoryTransaction extends PersistenceTransaction {\n constructor(e) {\n super(), this.currentSequenceNumber = e;\n }\n}\n\nclass __PRIVATE_MemoryEagerDelegate {\n constructor(e) {\n this.persistence = e, \n /** Tracks all documents that are active in Query views. */\n this.Jr = new __PRIVATE_ReferenceSet, \n /** The list of documents that are potentially GCed after each transaction. */\n this.Yr = null;\n }\n static Zr(e) {\n return new __PRIVATE_MemoryEagerDelegate(e);\n }\n get Xr() {\n if (this.Yr) return this.Yr;\n throw fail();\n }\n addReference(e, t, n) {\n return this.Jr.addReference(n, t), this.Xr.delete(n.toString()), PersistencePromise.resolve();\n }\n removeReference(e, t, n) {\n return this.Jr.removeReference(n, t), this.Xr.add(n.toString()), PersistencePromise.resolve();\n }\n markPotentiallyOrphaned(e, t) {\n return this.Xr.add(t.toString()), PersistencePromise.resolve();\n }\n removeTarget(e, t) {\n this.Jr.gr(t.targetId).forEach((e => this.Xr.add(e.toString())));\n const n = this.persistence.getTargetCache();\n return n.getMatchingKeysForTargetId(e, t.targetId).next((e => {\n e.forEach((e => this.Xr.add(e.toString())));\n })).next((() => n.removeTargetData(e, t)));\n }\n zr() {\n this.Yr = new Set;\n }\n jr(e) {\n // Remove newly orphaned documents.\n const t = this.persistence.getRemoteDocumentCache().newChangeBuffer();\n return PersistencePromise.forEach(this.Xr, (n => {\n const r = DocumentKey.fromPath(n);\n return this.ei(e, r).next((e => {\n e || t.removeEntry(r, SnapshotVersion.min());\n }));\n })).next((() => (this.Yr = null, t.apply(e))));\n }\n updateLimboDocument(e, t) {\n return this.ei(e, t).next((e => {\n e ? this.Xr.delete(t.toString()) : this.Xr.add(t.toString());\n }));\n }\n Wr(e) {\n // For eager GC, we don't care about the document size, there are no size thresholds.\n return 0;\n }\n ei(e, t) {\n return PersistencePromise.or([ () => PersistencePromise.resolve(this.Jr.containsKey(t)), () => this.persistence.getTargetCache().containsKey(e, t), () => this.persistence.Hr(e, t) ]);\n }\n}\n\nclass __PRIVATE_MemoryLruDelegate {\n constructor(e, t) {\n this.persistence = e, this.ti = new ObjectMap((e => __PRIVATE_encodeResourcePath(e.path)), ((e, t) => e.isEqual(t))), \n this.garbageCollector = __PRIVATE_newLruGarbageCollector(this, t);\n }\n static Zr(e, t) {\n return new __PRIVATE_MemoryLruDelegate(e, t);\n }\n // No-ops, present so memory persistence doesn't have to care which delegate\n // it has.\n zr() {}\n jr(e) {\n return PersistencePromise.resolve();\n }\n forEachTarget(e, t) {\n return this.persistence.getTargetCache().forEachTarget(e, t);\n }\n Yn(e) {\n const t = this.er(e);\n return this.persistence.getTargetCache().getTargetCount(e).next((e => t.next((t => e + t))));\n }\n er(e) {\n let t = 0;\n return this.Zn(e, (e => {\n t++;\n })).next((() => t));\n }\n Zn(e, t) {\n return PersistencePromise.forEach(this.ti, ((n, r) => this.nr(e, n, r).next((e => e ? PersistencePromise.resolve() : t(r)))));\n }\n removeTargets(e, t, n) {\n return this.persistence.getTargetCache().removeTargets(e, t, n);\n }\n removeOrphanedDocuments(e, t) {\n let n = 0;\n const r = this.persistence.getRemoteDocumentCache(), i = r.newChangeBuffer();\n return r.Or(e, (r => this.nr(e, r, t).next((e => {\n e || (n++, i.removeEntry(r, SnapshotVersion.min()));\n })))).next((() => i.apply(e))).next((() => n));\n }\n markPotentiallyOrphaned(e, t) {\n return this.ti.set(t, e.currentSequenceNumber), PersistencePromise.resolve();\n }\n removeTarget(e, t) {\n const n = t.withSequenceNumber(e.currentSequenceNumber);\n return this.persistence.getTargetCache().updateTargetData(e, n);\n }\n addReference(e, t, n) {\n return this.ti.set(n, e.currentSequenceNumber), PersistencePromise.resolve();\n }\n removeReference(e, t, n) {\n return this.ti.set(n, e.currentSequenceNumber), PersistencePromise.resolve();\n }\n updateLimboDocument(e, t) {\n return this.ti.set(t, e.currentSequenceNumber), PersistencePromise.resolve();\n }\n Wr(e) {\n let t = e.key.toString().length;\n return e.isFoundDocument() && (t += __PRIVATE_estimateByteSize(e.data.value)), t;\n }\n nr(e, t, n) {\n return PersistencePromise.or([ () => this.persistence.Hr(e, t), () => this.persistence.getTargetCache().containsKey(e, t), () => {\n const e = this.ti.get(t);\n return PersistencePromise.resolve(void 0 !== e && e > n);\n } ]);\n }\n getCacheSize(e) {\n return this.persistence.getRemoteDocumentCache().getSize(e);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Performs database creation and schema upgrades. */ class __PRIVATE_SchemaConverter {\n constructor(e) {\n this.serializer = e;\n }\n /**\n * Performs database creation and schema upgrades.\n *\n * Note that in production, this method is only ever used to upgrade the schema\n * to SCHEMA_VERSION. Different values of toVersion are only used for testing\n * and local feature development.\n */ O(e, t, n, r) {\n const i = new __PRIVATE_SimpleDbTransaction(\"createOrUpgrade\", t);\n n < 1 && r >= 1 && (!function __PRIVATE_createPrimaryClientStore(e) {\n e.createObjectStore(\"owner\");\n }(e), function __PRIVATE_createMutationQueue(e) {\n e.createObjectStore(\"mutationQueues\", {\n keyPath: \"userId\"\n });\n e.createObjectStore(\"mutations\", {\n keyPath: \"batchId\",\n autoIncrement: !0\n }).createIndex(\"userMutationsIndex\", M, {\n unique: !0\n }), e.createObjectStore(\"documentMutations\");\n }\n /**\n * Upgrade function to migrate the 'mutations' store from V1 to V3. Loads\n * and rewrites all data.\n */ (e), __PRIVATE_createQueryCache(e), function __PRIVATE_createLegacyRemoteDocumentCache(e) {\n e.createObjectStore(\"remoteDocuments\");\n }(e));\n // Migration 2 to populate the targetGlobal object no longer needed since\n // migration 3 unconditionally clears it.\n let s = PersistencePromise.resolve();\n return n < 3 && r >= 3 && (\n // Brand new clients don't need to drop and recreate--only clients that\n // potentially have corrupt data.\n 0 !== n && (!function __PRIVATE_dropQueryCache(e) {\n e.deleteObjectStore(\"targetDocuments\"), e.deleteObjectStore(\"targets\"), e.deleteObjectStore(\"targetGlobal\");\n }(e), __PRIVATE_createQueryCache(e)), s = s.next((() => \n /**\n * Creates the target global singleton row.\n *\n * @param txn - The version upgrade transaction for indexeddb\n */\n function __PRIVATE_writeEmptyTargetGlobalEntry(e) {\n const t = e.store(\"targetGlobal\"), n = {\n highestTargetId: 0,\n highestListenSequenceNumber: 0,\n lastRemoteSnapshotVersion: SnapshotVersion.min().toTimestamp(),\n targetCount: 0\n };\n return t.put(\"targetGlobalKey\", n);\n }(i)))), n < 4 && r >= 4 && (0 !== n && (\n // Schema version 3 uses auto-generated keys to generate globally unique\n // mutation batch IDs (this was previously ensured internally by the\n // client). To migrate to the new schema, we have to read all mutations\n // and write them back out. We preserve the existing batch IDs to guarantee\n // consistency with other object stores. Any further mutation batch IDs will\n // be auto-generated.\n s = s.next((() => function __PRIVATE_upgradeMutationBatchSchemaAndMigrateData(e, t) {\n return t.store(\"mutations\").U().next((n => {\n e.deleteObjectStore(\"mutations\");\n e.createObjectStore(\"mutations\", {\n keyPath: \"batchId\",\n autoIncrement: !0\n }).createIndex(\"userMutationsIndex\", M, {\n unique: !0\n });\n const r = t.store(\"mutations\"), i = n.map((e => r.put(e)));\n return PersistencePromise.waitFor(i);\n }));\n }(e, i)))), s = s.next((() => {\n !function __PRIVATE_createClientMetadataStore(e) {\n e.createObjectStore(\"clientMetadata\", {\n keyPath: \"clientId\"\n });\n }(e);\n }))), n < 5 && r >= 5 && (s = s.next((() => this.ni(i)))), n < 6 && r >= 6 && (s = s.next((() => (function __PRIVATE_createDocumentGlobalStore(e) {\n e.createObjectStore(\"remoteDocumentGlobal\");\n }(e), this.ri(i))))), n < 7 && r >= 7 && (s = s.next((() => this.ii(i)))), n < 8 && r >= 8 && (s = s.next((() => this.si(e, i)))), \n n < 9 && r >= 9 && (s = s.next((() => {\n // Multi-Tab used to manage its own changelog, but this has been moved\n // to the DbRemoteDocument object store itself. Since the previous change\n // log only contained transient data, we can drop its object store.\n !function __PRIVATE_dropRemoteDocumentChangesStore(e) {\n e.objectStoreNames.contains(\"remoteDocumentChanges\") && e.deleteObjectStore(\"remoteDocumentChanges\");\n }(e);\n // Note: Schema version 9 used to create a read time index for the\n // RemoteDocumentCache. This is now done with schema version 13.\n }))), n < 10 && r >= 10 && (s = s.next((() => this.oi(i)))), n < 11 && r >= 11 && (s = s.next((() => {\n !function __PRIVATE_createBundlesStore(e) {\n e.createObjectStore(\"bundles\", {\n keyPath: \"bundleId\"\n });\n }(e), function __PRIVATE_createNamedQueriesStore(e) {\n e.createObjectStore(\"namedQueries\", {\n keyPath: \"name\"\n });\n }(e);\n }))), n < 12 && r >= 12 && (s = s.next((() => {\n !function __PRIVATE_createDocumentOverlayStore(e) {\n const t = e.createObjectStore(\"documentOverlays\", {\n keyPath: G\n });\n t.createIndex(\"collectionPathOverlayIndex\", z, {\n unique: !1\n }), t.createIndex(\"collectionGroupOverlayIndex\", j, {\n unique: !1\n });\n }(e);\n }))), n < 13 && r >= 13 && (s = s.next((() => function __PRIVATE_createRemoteDocumentCache(e) {\n const t = e.createObjectStore(\"remoteDocumentsV14\", {\n keyPath: O\n });\n t.createIndex(\"documentKeyIndex\", N), t.createIndex(\"collectionGroupIndex\", L);\n }(e))).next((() => this._i(e, i))).next((() => e.deleteObjectStore(\"remoteDocuments\")))), \n n < 14 && r >= 14 && (s = s.next((() => this.ai(e, i)))), n < 15 && r >= 15 && (s = s.next((() => function __PRIVATE_createFieldIndex(e) {\n e.createObjectStore(\"indexConfiguration\", {\n keyPath: \"indexId\",\n autoIncrement: !0\n }).createIndex(\"collectionGroupIndex\", \"collectionGroup\", {\n unique: !1\n });\n e.createObjectStore(\"indexState\", {\n keyPath: K\n }).createIndex(\"sequenceNumberIndex\", $, {\n unique: !1\n });\n e.createObjectStore(\"indexEntries\", {\n keyPath: U\n }).createIndex(\"documentKeyIndex\", W, {\n unique: !1\n });\n }(e)))), n < 16 && r >= 16 && (\n // Clear the object stores to remove possibly corrupted index entries\n s = s.next((() => {\n t.objectStore(\"indexState\").clear();\n })).next((() => {\n t.objectStore(\"indexEntries\").clear();\n }))), n < 17 && r >= 17 && (s = s.next((() => {\n !function __PRIVATE_createGlobalsStore(e) {\n e.createObjectStore(\"globals\", {\n keyPath: \"name\"\n });\n }(e);\n }))), s;\n }\n ri(e) {\n let t = 0;\n return e.store(\"remoteDocuments\").J(((e, n) => {\n t += __PRIVATE_dbDocumentSize(n);\n })).next((() => {\n const n = {\n byteSize: t\n };\n return e.store(\"remoteDocumentGlobal\").put(\"remoteDocumentGlobalKey\", n);\n }));\n }\n ni(e) {\n const t = e.store(\"mutationQueues\"), n = e.store(\"mutations\");\n return t.U().next((t => PersistencePromise.forEach(t, (t => {\n const r = IDBKeyRange.bound([ t.userId, -1 ], [ t.userId, t.lastAcknowledgedBatchId ]);\n return n.U(\"userMutationsIndex\", r).next((n => PersistencePromise.forEach(n, (n => {\n __PRIVATE_hardAssert(n.userId === t.userId);\n const r = __PRIVATE_fromDbMutationBatch(this.serializer, n);\n return removeMutationBatch(e, t.userId, r).next((() => {}));\n }))));\n }))));\n }\n /**\n * Ensures that every document in the remote document cache has a corresponding sentinel row\n * with a sequence number. Missing rows are given the most recently used sequence number.\n */ ii(e) {\n const t = e.store(\"targetDocuments\"), n = e.store(\"remoteDocuments\");\n return e.store(\"targetGlobal\").get(\"targetGlobalKey\").next((e => {\n const r = [];\n return n.J(((n, i) => {\n const s = new ResourcePath(n), o = function __PRIVATE_sentinelKey(e) {\n return [ 0, __PRIVATE_encodeResourcePath(e) ];\n }(s);\n r.push(t.get(o).next((n => n ? PersistencePromise.resolve() : (n => t.put({\n targetId: 0,\n path: __PRIVATE_encodeResourcePath(n),\n sequenceNumber: e.highestListenSequenceNumber\n }))(s))));\n })).next((() => PersistencePromise.waitFor(r)));\n }));\n }\n si(e, t) {\n // Create the index.\n e.createObjectStore(\"collectionParents\", {\n keyPath: Q\n });\n const n = t.store(\"collectionParents\"), r = new __PRIVATE_MemoryCollectionParentIndex, addEntry = e => {\n if (r.add(e)) {\n const t = e.lastSegment(), r = e.popLast();\n return n.put({\n collectionId: t,\n parent: __PRIVATE_encodeResourcePath(r)\n });\n }\n };\n // Helper to add an index entry iff we haven't already written it.\n // Index existing remote documents.\n return t.store(\"remoteDocuments\").J({\n H: !0\n }, ((e, t) => {\n const n = new ResourcePath(e);\n return addEntry(n.popLast());\n })).next((() => t.store(\"documentMutations\").J({\n H: !0\n }, (([e, t, n], r) => {\n const i = __PRIVATE_decodeResourcePath(t);\n return addEntry(i.popLast());\n }))));\n }\n oi(e) {\n const t = e.store(\"targets\");\n return t.J(((e, n) => {\n const r = __PRIVATE_fromDbTarget(n), i = __PRIVATE_toDbTarget(this.serializer, r);\n return t.put(i);\n }));\n }\n _i(e, t) {\n const n = t.store(\"remoteDocuments\"), r = [];\n return n.J(((e, n) => {\n const i = t.store(\"remoteDocumentsV14\"), s = function __PRIVATE_extractKey(e) {\n return e.document ? new DocumentKey(ResourcePath.fromString(e.document.name).popFirst(5)) : e.noDocument ? DocumentKey.fromSegments(e.noDocument.path) : e.unknownDocument ? DocumentKey.fromSegments(e.unknownDocument.path) : fail();\n }\n /**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ (n).path.toArray(), o = {\n prefixPath: s.slice(0, s.length - 2),\n collectionGroup: s[s.length - 2],\n documentId: s[s.length - 1],\n readTime: n.readTime || [ 0, 0 ],\n unknownDocument: n.unknownDocument,\n noDocument: n.noDocument,\n document: n.document,\n hasCommittedMutations: !!n.hasCommittedMutations\n };\n r.push(i.put(o));\n })).next((() => PersistencePromise.waitFor(r)));\n }\n ai(e, t) {\n const n = t.store(\"mutations\"), r = __PRIVATE_newIndexedDbRemoteDocumentCache(this.serializer), i = new __PRIVATE_MemoryPersistence(__PRIVATE_MemoryEagerDelegate.Zr, this.serializer.ct);\n return n.U().next((e => {\n const n = new Map;\n return e.forEach((e => {\n var t;\n let r = null !== (t = n.get(e.userId)) && void 0 !== t ? t : __PRIVATE_documentKeySet();\n __PRIVATE_fromDbMutationBatch(this.serializer, e).keys().forEach((e => r = r.add(e))), \n n.set(e.userId, r);\n })), PersistencePromise.forEach(n, ((e, n) => {\n const s = new User(n), o = __PRIVATE_IndexedDbDocumentOverlayCache.lt(this.serializer, s), _ = i.getIndexManager(s), a = __PRIVATE_IndexedDbMutationQueue.lt(s, this.serializer, _, i.referenceDelegate);\n return new LocalDocumentsView(r, a, o, _).recalculateAndSaveOverlaysForDocumentKeys(new __PRIVATE_IndexedDbTransaction(t, __PRIVATE_ListenSequence.oe), e).next();\n }));\n }));\n }\n}\n\nfunction __PRIVATE_createQueryCache(e) {\n e.createObjectStore(\"targetDocuments\", {\n keyPath: k\n }).createIndex(\"documentTargetsIndex\", q, {\n unique: !0\n });\n // NOTE: This is unique only because the TargetId is the suffix.\n e.createObjectStore(\"targets\", {\n keyPath: \"targetId\"\n }).createIndex(\"queryTargetsIndex\", B, {\n unique: !0\n }), e.createObjectStore(\"targetGlobal\");\n}\n\nconst Ve = \"Failed to obtain exclusive access to the persistence layer. To allow shared access, multi-tab synchronization has to be enabled in all tabs. If you are using `experimentalForceOwningTab:true`, make sure that only one tab has persistence enabled at any given time.\";\n\n/**\n * Oldest acceptable age in milliseconds for client metadata before the client\n * is considered inactive and its associated data is garbage collected.\n */\n/**\n * An IndexedDB-backed instance of Persistence. Data is stored persistently\n * across sessions.\n *\n * On Web only, the Firestore SDKs support shared access to its persistence\n * layer. This allows multiple browser tabs to read and write to IndexedDb and\n * to synchronize state even without network connectivity. Shared access is\n * currently optional and not enabled unless all clients invoke\n * `enablePersistence()` with `{synchronizeTabs:true}`.\n *\n * In multi-tab mode, if multiple clients are active at the same time, the SDK\n * will designate one client as the “primary client”. An effort is made to pick\n * a visible, network-connected and active client, and this client is\n * responsible for letting other clients know about its presence. The primary\n * client writes a unique client-generated identifier (the client ID) to\n * IndexedDb’s “owner” store every 4 seconds. If the primary client fails to\n * update this entry, another client can acquire the lease and take over as\n * primary.\n *\n * Some persistence operations in the SDK are designated as primary-client only\n * operations. This includes the acknowledgment of mutations and all updates of\n * remote documents. The effects of these operations are written to persistence\n * and then broadcast to other tabs via LocalStorage (see\n * `WebStorageSharedClientState`), which then refresh their state from\n * persistence.\n *\n * Similarly, the primary client listens to notifications sent by secondary\n * clients to discover persistence changes written by secondary clients, such as\n * the addition of new mutations and query targets.\n *\n * If multi-tab is not enabled and another tab already obtained the primary\n * lease, IndexedDbPersistence enters a failed state and all subsequent\n * operations will automatically fail.\n *\n * Additionally, there is an optimization so that when a tab is closed, the\n * primary lease is released immediately (this is especially important to make\n * sure that a refreshed tab is able to immediately re-acquire the primary\n * lease). Unfortunately, IndexedDB cannot be reliably used in window.unload\n * since it is an asynchronous API. So in addition to attempting to give up the\n * lease, the leaseholder writes its client ID to a \"zombiedClient\" entry in\n * LocalStorage which acts as an indicator that another tab should go ahead and\n * take the primary lease immediately regardless of the current lease timestamp.\n *\n * TODO(b/114226234): Remove `synchronizeTabs` section when multi-tab is no\n * longer optional.\n */\nclass __PRIVATE_IndexedDbPersistence {\n constructor(\n /**\n * Whether to synchronize the in-memory state of multiple tabs and share\n * access to local persistence.\n */\n e, t, n, r, i, s, o, _, a, \n /**\n * If set to true, forcefully obtains database access. Existing tabs will\n * no longer be able to access IndexedDB.\n */\n u, c = 17) {\n if (this.allowTabSynchronization = e, this.persistenceKey = t, this.clientId = n, \n this.ui = i, this.window = s, this.document = o, this.ci = a, this.li = u, this.hi = c, \n this.Qr = null, this.Kr = !1, this.isPrimary = !1, this.networkEnabled = !0, \n /** Our window.unload handler, if registered. */\n this.Pi = null, this.inForeground = !1, \n /** Our 'visibilitychange' listener if registered. */\n this.Ii = null, \n /** The client metadata refresh task. */\n this.Ti = null, \n /** The last time we garbage collected the client metadata object store. */\n this.Ei = Number.NEGATIVE_INFINITY, \n /** A listener to notify on primary state changes. */\n this.di = e => Promise.resolve(), !__PRIVATE_IndexedDbPersistence.D()) throw new FirestoreError(D.UNIMPLEMENTED, \"This platform is either missing IndexedDB or is known to have an incomplete implementation. Offline persistence has been disabled.\");\n this.referenceDelegate = new __PRIVATE_IndexedDbLruDelegateImpl(this, r), this.Ai = t + \"main\", \n this.serializer = new __PRIVATE_LocalSerializer(_), this.Ri = new __PRIVATE_SimpleDb(this.Ai, this.hi, new __PRIVATE_SchemaConverter(this.serializer)), \n this.$r = new __PRIVATE_IndexedDbGlobalsCache, this.Ur = new __PRIVATE_IndexedDbTargetCache(this.referenceDelegate, this.serializer), \n this.remoteDocumentCache = __PRIVATE_newIndexedDbRemoteDocumentCache(this.serializer), \n this.Gr = new __PRIVATE_IndexedDbBundleCache, this.window && this.window.localStorage ? this.Vi = this.window.localStorage : (this.Vi = null, \n !1 === u && __PRIVATE_logError(\"IndexedDbPersistence\", \"LocalStorage is unavailable. As a result, persistence may not work reliably. In particular enablePersistence() could fail immediately after refreshing the page.\"));\n }\n /**\n * Attempt to start IndexedDb persistence.\n *\n * @returns Whether persistence was enabled.\n */ start() {\n // NOTE: This is expected to fail sometimes (in the case of another tab\n // already having the persistence lock), so it's the first thing we should\n // do.\n return this.mi().then((() => {\n if (!this.isPrimary && !this.allowTabSynchronization) \n // Fail `start()` if `synchronizeTabs` is disabled and we cannot\n // obtain the primary lease.\n throw new FirestoreError(D.FAILED_PRECONDITION, Ve);\n return this.fi(), this.gi(), this.pi(), this.runTransaction(\"getHighestListenSequenceNumber\", \"readonly\", (e => this.Ur.getHighestSequenceNumber(e)));\n })).then((e => {\n this.Qr = new __PRIVATE_ListenSequence(e, this.ci);\n })).then((() => {\n this.Kr = !0;\n })).catch((e => (this.Ri && this.Ri.close(), Promise.reject(e))));\n }\n /**\n * Registers a listener that gets called when the primary state of the\n * instance changes. Upon registering, this listener is invoked immediately\n * with the current primary state.\n *\n * PORTING NOTE: This is only used for Web multi-tab.\n */ yi(e) {\n return this.di = async t => {\n if (this.started) return e(t);\n }, e(this.isPrimary);\n }\n /**\n * Registers a listener that gets called when the database receives a\n * version change event indicating that it has deleted.\n *\n * PORTING NOTE: This is only used for Web multi-tab.\n */ setDatabaseDeletedListener(e) {\n this.Ri.L((async t => {\n // Check if an attempt is made to delete IndexedDB.\n null === t.newVersion && await e();\n }));\n }\n /**\n * Adjusts the current network state in the client's metadata, potentially\n * affecting the primary lease.\n *\n * PORTING NOTE: This is only used for Web multi-tab.\n */ setNetworkEnabled(e) {\n this.networkEnabled !== e && (this.networkEnabled = e, \n // Schedule a primary lease refresh for immediate execution. The eventual\n // lease update will be propagated via `primaryStateListener`.\n this.ui.enqueueAndForget((async () => {\n this.started && await this.mi();\n })));\n }\n /**\n * Updates the client metadata in IndexedDb and attempts to either obtain or\n * extend the primary lease for the local client. Asynchronously notifies the\n * primary state listener if the client either newly obtained or released its\n * primary lease.\n */ mi() {\n return this.runTransaction(\"updateClientMetadataAndTryBecomePrimary\", \"readwrite\", (e => __PRIVATE_clientMetadataStore(e).put({\n clientId: this.clientId,\n updateTimeMs: Date.now(),\n networkEnabled: this.networkEnabled,\n inForeground: this.inForeground\n }).next((() => {\n if (this.isPrimary) return this.wi(e).next((e => {\n e || (this.isPrimary = !1, this.ui.enqueueRetryable((() => this.di(!1))));\n }));\n })).next((() => this.Si(e))).next((t => this.isPrimary && !t ? this.bi(e).next((() => !1)) : !!t && this.Di(e).next((() => !0)))))).catch((e => {\n if (__PRIVATE_isIndexedDbTransactionError(e)) \n // Proceed with the existing state. Any subsequent access to\n // IndexedDB will verify the lease.\n return __PRIVATE_logDebug(\"IndexedDbPersistence\", \"Failed to extend owner lease: \", e), \n this.isPrimary;\n if (!this.allowTabSynchronization) throw e;\n return __PRIVATE_logDebug(\"IndexedDbPersistence\", \"Releasing owner lease after error during lease refresh\", e), \n /* isPrimary= */ !1;\n })).then((e => {\n this.isPrimary !== e && this.ui.enqueueRetryable((() => this.di(e))), this.isPrimary = e;\n }));\n }\n wi(e) {\n return __PRIVATE_primaryClientStore(e).get(\"owner\").next((e => PersistencePromise.resolve(this.vi(e))));\n }\n Ci(e) {\n return __PRIVATE_clientMetadataStore(e).delete(this.clientId);\n }\n /**\n * If the garbage collection threshold has passed, prunes the\n * RemoteDocumentChanges and the ClientMetadata store based on the last update\n * time of all clients.\n */ async Fi() {\n if (this.isPrimary && !this.Mi(this.Ei, 18e5)) {\n this.Ei = Date.now();\n const e = await this.runTransaction(\"maybeGarbageCollectMultiClientState\", \"readwrite-primary\", (e => {\n const t = __PRIVATE_getStore(e, \"clientMetadata\");\n return t.U().next((e => {\n const n = this.xi(e, 18e5), r = e.filter((e => -1 === n.indexOf(e)));\n // Delete metadata for clients that are no longer considered active.\n return PersistencePromise.forEach(r, (e => t.delete(e.clientId))).next((() => r));\n }));\n })).catch((() => []));\n // Delete potential leftover entries that may continue to mark the\n // inactive clients as zombied in LocalStorage.\n // Ideally we'd delete the IndexedDb and LocalStorage zombie entries for\n // the client atomically, but we can't. So we opt to delete the IndexedDb\n // entries first to avoid potentially reviving a zombied client.\n if (this.Vi) for (const t of e) this.Vi.removeItem(this.Oi(t.clientId));\n }\n }\n /**\n * Schedules a recurring timer to update the client metadata and to either\n * extend or acquire the primary lease if the client is eligible.\n */ pi() {\n this.Ti = this.ui.enqueueAfterDelay(\"client_metadata_refresh\" /* TimerId.ClientMetadataRefresh */ , 4e3, (() => this.mi().then((() => this.Fi())).then((() => this.pi()))));\n }\n /** Checks whether `client` is the local client. */ vi(e) {\n return !!e && e.ownerId === this.clientId;\n }\n /**\n * Evaluate the state of all active clients and determine whether the local\n * client is or can act as the holder of the primary lease. Returns whether\n * the client is eligible for the lease, but does not actually acquire it.\n * May return 'false' even if there is no active leaseholder and another\n * (foreground) client should become leaseholder instead.\n */ Si(e) {\n if (this.li) return PersistencePromise.resolve(!0);\n return __PRIVATE_primaryClientStore(e).get(\"owner\").next((t => {\n // A client is eligible for the primary lease if:\n // - its network is enabled and the client's tab is in the foreground.\n // - its network is enabled and no other client's tab is in the\n // foreground.\n // - every clients network is disabled and the client's tab is in the\n // foreground.\n // - every clients network is disabled and no other client's tab is in\n // the foreground.\n // - the `forceOwningTab` setting was passed in.\n if (null !== t && this.Mi(t.leaseTimestampMs, 5e3) && !this.Ni(t.ownerId)) {\n if (this.vi(t) && this.networkEnabled) return !0;\n if (!this.vi(t)) {\n if (!t.allowTabSynchronization) \n // Fail the `canActAsPrimary` check if the current leaseholder has\n // not opted into multi-tab synchronization. If this happens at\n // client startup, we reject the Promise returned by\n // `enablePersistence()` and the user can continue to use Firestore\n // with in-memory persistence.\n // If this fails during a lease refresh, we will instead block the\n // AsyncQueue from executing further operations. Note that this is\n // acceptable since mixing & matching different `synchronizeTabs`\n // settings is not supported.\n // TODO(b/114226234): Remove this check when `synchronizeTabs` can\n // no longer be turned off.\n throw new FirestoreError(D.FAILED_PRECONDITION, Ve);\n return !1;\n }\n }\n return !(!this.networkEnabled || !this.inForeground) || __PRIVATE_clientMetadataStore(e).U().next((e => void 0 === this.xi(e, 5e3).find((e => {\n if (this.clientId !== e.clientId) {\n const t = !this.networkEnabled && e.networkEnabled, n = !this.inForeground && e.inForeground, r = this.networkEnabled === e.networkEnabled;\n if (t || n && r) return !0;\n }\n return !1;\n }))));\n })).next((e => (this.isPrimary !== e && __PRIVATE_logDebug(\"IndexedDbPersistence\", `Client ${e ? \"is\" : \"is not\"} eligible for a primary lease.`), \n e)));\n }\n async shutdown() {\n // The shutdown() operations are idempotent and can be called even when\n // start() aborted (e.g. because it couldn't acquire the persistence lease).\n this.Kr = !1, this.Li(), this.Ti && (this.Ti.cancel(), this.Ti = null), this.Bi(), \n this.ki(), \n // Use `SimpleDb.runTransaction` directly to avoid failing if another tab\n // has obtained the primary lease.\n await this.Ri.runTransaction(\"shutdown\", \"readwrite\", [ \"owner\", \"clientMetadata\" ], (e => {\n const t = new __PRIVATE_IndexedDbTransaction(e, __PRIVATE_ListenSequence.oe);\n return this.bi(t).next((() => this.Ci(t)));\n })), this.Ri.close(), \n // Remove the entry marking the client as zombied from LocalStorage since\n // we successfully deleted its metadata from IndexedDb.\n this.qi();\n }\n /**\n * Returns clients that are not zombied and have an updateTime within the\n * provided threshold.\n */ xi(e, t) {\n return e.filter((e => this.Mi(e.updateTimeMs, t) && !this.Ni(e.clientId)));\n }\n /**\n * Returns the IDs of the clients that are currently active. If multi-tab\n * is not supported, returns an array that only contains the local client's\n * ID.\n *\n * PORTING NOTE: This is only used for Web multi-tab.\n */ Qi() {\n return this.runTransaction(\"getActiveClients\", \"readonly\", (e => __PRIVATE_clientMetadataStore(e).U().next((e => this.xi(e, 18e5).map((e => e.clientId))))));\n }\n get started() {\n return this.Kr;\n }\n getGlobalsCache() {\n return this.$r;\n }\n getMutationQueue(e, t) {\n return __PRIVATE_IndexedDbMutationQueue.lt(e, this.serializer, t, this.referenceDelegate);\n }\n getTargetCache() {\n return this.Ur;\n }\n getRemoteDocumentCache() {\n return this.remoteDocumentCache;\n }\n getIndexManager(e) {\n return new __PRIVATE_IndexedDbIndexManager(e, this.serializer.ct.databaseId);\n }\n getDocumentOverlayCache(e) {\n return __PRIVATE_IndexedDbDocumentOverlayCache.lt(this.serializer, e);\n }\n getBundleCache() {\n return this.Gr;\n }\n runTransaction(e, t, n) {\n __PRIVATE_logDebug(\"IndexedDbPersistence\", \"Starting transaction:\", e);\n const r = \"readonly\" === t ? \"readonly\" : \"readwrite\", i = \n /** Returns the object stores for the provided schema. */\n function __PRIVATE_getObjectStores(e) {\n return 17 === e ? te : 16 === e ? ee : 15 === e ? X : 14 === e ? Z : 13 === e ? Y : 12 === e ? J : 11 === e ? H : void fail();\n }(this.hi);\n let s;\n // Do all transactions as readwrite against all object stores, since we\n // are the only reader/writer.\n return this.Ri.runTransaction(e, r, i, (r => (s = new __PRIVATE_IndexedDbTransaction(r, this.Qr ? this.Qr.next() : __PRIVATE_ListenSequence.oe), \n \"readwrite-primary\" === t ? this.wi(s).next((e => !!e || this.Si(s))).next((t => {\n if (!t) throw __PRIVATE_logError(`Failed to obtain primary lease for action '${e}'.`), \n this.isPrimary = !1, this.ui.enqueueRetryable((() => this.di(!1))), new FirestoreError(D.FAILED_PRECONDITION, C);\n return n(s);\n })).next((e => this.Di(s).next((() => e)))) : this.Ki(s).next((() => n(s)))))).then((e => (s.raiseOnCommittedEvent(), \n e)));\n }\n /**\n * Verifies that the current tab is the primary leaseholder or alternatively\n * that the leaseholder has opted into multi-tab synchronization.\n */\n // TODO(b/114226234): Remove this check when `synchronizeTabs` can no longer\n // be turned off.\n Ki(e) {\n return __PRIVATE_primaryClientStore(e).get(\"owner\").next((e => {\n if (null !== e && this.Mi(e.leaseTimestampMs, 5e3) && !this.Ni(e.ownerId) && !this.vi(e) && !(this.li || this.allowTabSynchronization && e.allowTabSynchronization)) throw new FirestoreError(D.FAILED_PRECONDITION, Ve);\n }));\n }\n /**\n * Obtains or extends the new primary lease for the local client. This\n * method does not verify that the client is eligible for this lease.\n */ Di(e) {\n const t = {\n ownerId: this.clientId,\n allowTabSynchronization: this.allowTabSynchronization,\n leaseTimestampMs: Date.now()\n };\n return __PRIVATE_primaryClientStore(e).put(\"owner\", t);\n }\n static D() {\n return __PRIVATE_SimpleDb.D();\n }\n /** Checks the primary lease and removes it if we are the current primary. */ bi(e) {\n const t = __PRIVATE_primaryClientStore(e);\n return t.get(\"owner\").next((e => this.vi(e) ? (__PRIVATE_logDebug(\"IndexedDbPersistence\", \"Releasing primary lease.\"), \n t.delete(\"owner\")) : PersistencePromise.resolve()));\n }\n /** Verifies that `updateTimeMs` is within `maxAgeMs`. */ Mi(e, t) {\n const n = Date.now();\n return !(e < n - t) && (!(e > n) || (__PRIVATE_logError(`Detected an update time that is in the future: ${e} > ${n}`), \n !1));\n }\n fi() {\n null !== this.document && \"function\" == typeof this.document.addEventListener && (this.Ii = () => {\n this.ui.enqueueAndForget((() => (this.inForeground = \"visible\" === this.document.visibilityState, \n this.mi())));\n }, this.document.addEventListener(\"visibilitychange\", this.Ii), this.inForeground = \"visible\" === this.document.visibilityState);\n }\n Bi() {\n this.Ii && (this.document.removeEventListener(\"visibilitychange\", this.Ii), this.Ii = null);\n }\n /**\n * Attaches a window.unload handler that will synchronously write our\n * clientId to a \"zombie client id\" location in LocalStorage. This can be used\n * by tabs trying to acquire the primary lease to determine that the lease\n * is no longer valid even if the timestamp is recent. This is particularly\n * important for the refresh case (so the tab correctly re-acquires the\n * primary lease). LocalStorage is used for this rather than IndexedDb because\n * it is a synchronous API and so can be used reliably from an unload\n * handler.\n */ gi() {\n var e;\n \"function\" == typeof (null === (e = this.window) || void 0 === e ? void 0 : e.addEventListener) && (this.Pi = () => {\n // Note: In theory, this should be scheduled on the AsyncQueue since it\n // accesses internal state. We execute this code directly during shutdown\n // to make sure it gets a chance to run.\n this.Li();\n const e = /(?:Version|Mobile)\\/1[456]/;\n isSafari() && (navigator.appVersion.match(e) || navigator.userAgent.match(e)) && \n // On Safari 14, 15, and 16, we do not run any cleanup actions as it might\n // trigger a bug that prevents Safari from re-opening IndexedDB during\n // the next page load.\n // See https://bugs.webkit.org/show_bug.cgi?id=226547\n this.ui.enterRestrictedMode(/* purgeExistingTasks= */ !0), this.ui.enqueueAndForget((() => this.shutdown()));\n }, this.window.addEventListener(\"pagehide\", this.Pi));\n }\n ki() {\n this.Pi && (this.window.removeEventListener(\"pagehide\", this.Pi), this.Pi = null);\n }\n /**\n * Returns whether a client is \"zombied\" based on its LocalStorage entry.\n * Clients become zombied when their tab closes without running all of the\n * cleanup logic in `shutdown()`.\n */ Ni(e) {\n var t;\n try {\n const n = null !== (null === (t = this.Vi) || void 0 === t ? void 0 : t.getItem(this.Oi(e)));\n return __PRIVATE_logDebug(\"IndexedDbPersistence\", `Client '${e}' ${n ? \"is\" : \"is not\"} zombied in LocalStorage`), \n n;\n } catch (e) {\n // Gracefully handle if LocalStorage isn't working.\n return __PRIVATE_logError(\"IndexedDbPersistence\", \"Failed to get zombied client id.\", e), \n !1;\n }\n }\n /**\n * Record client as zombied (a client that had its tab closed). Zombied\n * clients are ignored during primary tab selection.\n */ Li() {\n if (this.Vi) try {\n this.Vi.setItem(this.Oi(this.clientId), String(Date.now()));\n } catch (e) {\n // Gracefully handle if LocalStorage isn't available / working.\n __PRIVATE_logError(\"Failed to set zombie client id.\", e);\n }\n }\n /** Removes the zombied client entry if it exists. */ qi() {\n if (this.Vi) try {\n this.Vi.removeItem(this.Oi(this.clientId));\n } catch (e) {\n // Ignore\n }\n }\n Oi(e) {\n return `firestore_zombie_${this.persistenceKey}_${e}`;\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the primary client object store.\n */ function __PRIVATE_primaryClientStore(e) {\n return __PRIVATE_getStore(e, \"owner\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the client metadata object store.\n */ function __PRIVATE_clientMetadataStore(e) {\n return __PRIVATE_getStore(e, \"clientMetadata\");\n}\n\n/**\n * Generates a string used as a prefix when storing data in IndexedDB and\n * LocalStorage.\n */ function __PRIVATE_indexedDbStoragePrefix(e, t) {\n // Use two different prefix formats:\n // * firestore / persistenceKey / projectID . databaseID / ...\n // * firestore / persistenceKey / projectID / ...\n // projectIDs are DNS-compatible names and cannot contain dots\n // so there's no danger of collisions.\n let n = e.projectId;\n return e.isDefaultDatabase || (n += \".\" + e.database), \"firestore/\" + t + \"/\" + n + \"/\";\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A set of changes to what documents are currently in view and out of view for\n * a given query. These changes are sent to the LocalStore by the View (via\n * the SyncEngine) and are used to pin / unpin documents as appropriate.\n */\nclass __PRIVATE_LocalViewChanges {\n constructor(e, t, n, r) {\n this.targetId = e, this.fromCache = t, this.$i = n, this.Ui = r;\n }\n static Wi(e, t) {\n let n = __PRIVATE_documentKeySet(), r = __PRIVATE_documentKeySet();\n for (const e of t.docChanges) switch (e.type) {\n case 0 /* ChangeType.Added */ :\n n = n.add(e.doc.key);\n break;\n\n case 1 /* ChangeType.Removed */ :\n r = r.add(e.doc.key);\n // do nothing\n }\n return new __PRIVATE_LocalViewChanges(e, t.fromCache, n, r);\n }\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A tracker to keep a record of important details during database local query\n * execution.\n */ class QueryContext {\n constructor() {\n /**\n * Counts the number of documents passed through during local query execution.\n */\n this._documentReadCount = 0;\n }\n get documentReadCount() {\n return this._documentReadCount;\n }\n incrementDocumentReadCount(e) {\n this._documentReadCount += e;\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The Firestore query engine.\n *\n * Firestore queries can be executed in three modes. The Query Engine determines\n * what mode to use based on what data is persisted. The mode only determines\n * the runtime complexity of the query - the result set is equivalent across all\n * implementations.\n *\n * The Query engine will use indexed-based execution if a user has configured\n * any index that can be used to execute query (via `setIndexConfiguration()`).\n * Otherwise, the engine will try to optimize the query by re-using a previously\n * persisted query result. If that is not possible, the query will be executed\n * via a full collection scan.\n *\n * Index-based execution is the default when available. The query engine\n * supports partial indexed execution and merges the result from the index\n * lookup with documents that have not yet been indexed. The index evaluation\n * matches the backend's format and as such, the SDK can use indexing for all\n * queries that the backend supports.\n *\n * If no index exists, the query engine tries to take advantage of the target\n * document mapping in the TargetCache. These mappings exists for all queries\n * that have been synced with the backend at least once and allow the query\n * engine to only read documents that previously matched a query plus any\n * documents that were edited after the query was last listened to.\n *\n * There are some cases when this optimization is not guaranteed to produce\n * the same results as full collection scans. In these cases, query\n * processing falls back to full scans. These cases are:\n *\n * - Limit queries where a document that matched the query previously no longer\n * matches the query.\n *\n * - Limit queries where a document edit may cause the document to sort below\n * another document that is in the local cache.\n *\n * - Queries that have never been CURRENT or free of limbo documents.\n */\nclass __PRIVATE_QueryEngine {\n constructor() {\n this.Gi = !1, this.zi = !1, \n /**\n * SDK only decides whether it should create index when collection size is\n * larger than this.\n */\n this.ji = 100, this.Hi = \n /**\n * This cost represents the evaluation result of\n * (([index, docKey] + [docKey, docContent]) per document in the result set)\n * / ([docKey, docContent] per documents in full collection scan) coming from\n * experiment [enter PR experiment URL here].\n */\n function __PRIVATE_getDefaultRelativeIndexReadCostPerDocument() {\n // These values were derived from an experiment where several members of the\n // Firestore SDK team ran a performance test in various environments.\n // Googlers can see b/299284287 for details.\n return isSafari() ? 8 : __PRIVATE_getAndroidVersion(getUA()) > 0 ? 6 : 4;\n }();\n }\n /** Sets the document view to query against. */ initialize(e, t) {\n this.Ji = e, this.indexManager = t, this.Gi = !0;\n }\n /** Returns all local documents matching the specified query. */ getDocumentsMatchingQuery(e, t, n, r) {\n // Stores the result from executing the query; using this object is more\n // convenient than passing the result between steps of the persistence\n // transaction and improves readability comparatively.\n const i = {\n result: null\n };\n return this.Yi(e, t).next((e => {\n i.result = e;\n })).next((() => {\n if (!i.result) return this.Zi(e, t, r, n).next((e => {\n i.result = e;\n }));\n })).next((() => {\n if (i.result) return;\n const n = new QueryContext;\n return this.Xi(e, t, n).next((r => {\n if (i.result = r, this.zi) return this.es(e, t, n, r.size);\n }));\n })).next((() => i.result));\n }\n es(e, t, n, r) {\n return n.documentReadCount < this.ji ? (__PRIVATE_getLogLevel() <= LogLevel.DEBUG && __PRIVATE_logDebug(\"QueryEngine\", \"SDK will not create cache indexes for query:\", __PRIVATE_stringifyQuery(t), \"since it only creates cache indexes for collection contains\", \"more than or equal to\", this.ji, \"documents\"), \n PersistencePromise.resolve()) : (__PRIVATE_getLogLevel() <= LogLevel.DEBUG && __PRIVATE_logDebug(\"QueryEngine\", \"Query:\", __PRIVATE_stringifyQuery(t), \"scans\", n.documentReadCount, \"local documents and returns\", r, \"documents as results.\"), \n n.documentReadCount > this.Hi * r ? (__PRIVATE_getLogLevel() <= LogLevel.DEBUG && __PRIVATE_logDebug(\"QueryEngine\", \"The SDK decides to create cache indexes for query:\", __PRIVATE_stringifyQuery(t), \"as using cache indexes may help improve performance.\"), \n this.indexManager.createTargetIndexes(e, __PRIVATE_queryToTarget(t))) : PersistencePromise.resolve());\n }\n /**\n * Performs an indexed query that evaluates the query based on a collection's\n * persisted index values. Returns `null` if an index is not available.\n */ Yi(e, t) {\n if (__PRIVATE_queryMatchesAllDocuments(t)) \n // Queries that match all documents don't benefit from using\n // key-based lookups. It is more efficient to scan all documents in a\n // collection, rather than to perform individual lookups.\n return PersistencePromise.resolve(null);\n let n = __PRIVATE_queryToTarget(t);\n return this.indexManager.getIndexType(e, n).next((r => 0 /* IndexType.NONE */ === r ? null : (null !== t.limit && 1 /* IndexType.PARTIAL */ === r && (\n // We cannot apply a limit for targets that are served using a partial\n // index. If a partial index will be used to serve the target, the\n // query may return a superset of documents that match the target\n // (e.g. if the index doesn't include all the target's filters), or\n // may return the correct set of documents in the wrong order (e.g. if\n // the index doesn't include a segment for one of the orderBys).\n // Therefore, a limit should not be applied in such cases.\n t = __PRIVATE_queryWithLimit(t, null, \"F\" /* LimitType.First */), n = __PRIVATE_queryToTarget(t)), \n this.indexManager.getDocumentsMatchingTarget(e, n).next((r => {\n const i = __PRIVATE_documentKeySet(...r);\n return this.Ji.getDocuments(e, i).next((r => this.indexManager.getMinOffset(e, n).next((n => {\n const s = this.ts(t, r);\n return this.ns(t, s, i, n.readTime) ? this.Yi(e, __PRIVATE_queryWithLimit(t, null, \"F\" /* LimitType.First */)) : this.rs(e, s, t, n);\n }))));\n })))));\n }\n /**\n * Performs a query based on the target's persisted query mapping. Returns\n * `null` if the mapping is not available or cannot be used.\n */ Zi(e, t, n, r) {\n return __PRIVATE_queryMatchesAllDocuments(t) || r.isEqual(SnapshotVersion.min()) ? PersistencePromise.resolve(null) : this.Ji.getDocuments(e, n).next((i => {\n const s = this.ts(t, i);\n return this.ns(t, s, n, r) ? PersistencePromise.resolve(null) : (__PRIVATE_getLogLevel() <= LogLevel.DEBUG && __PRIVATE_logDebug(\"QueryEngine\", \"Re-using previous result from %s to execute query: %s\", r.toString(), __PRIVATE_stringifyQuery(t)), \n this.rs(e, s, t, __PRIVATE_newIndexOffsetSuccessorFromReadTime(r, -1)).next((e => e)));\n }));\n // Queries that have never seen a snapshot without limbo free documents\n // should also be run as a full collection scan.\n }\n /** Applies the query filter and sorting to the provided documents. */ ts(e, t) {\n // Sort the documents and re-apply the query filter since previously\n // matching documents do not necessarily still match the query.\n let n = new SortedSet(__PRIVATE_newQueryComparator(e));\n return t.forEach(((t, r) => {\n __PRIVATE_queryMatches(e, r) && (n = n.add(r));\n })), n;\n }\n /**\n * Determines if a limit query needs to be refilled from cache, making it\n * ineligible for index-free execution.\n *\n * @param query - The query.\n * @param sortedPreviousResults - The documents that matched the query when it\n * was last synchronized, sorted by the query's comparator.\n * @param remoteKeys - The document keys that matched the query at the last\n * snapshot.\n * @param limboFreeSnapshotVersion - The version of the snapshot when the\n * query was last synchronized.\n */ ns(e, t, n, r) {\n if (null === e.limit) \n // Queries without limits do not need to be refilled.\n return !1;\n if (n.size !== t.size) \n // The query needs to be refilled if a previously matching document no\n // longer matches.\n return !0;\n // Limit queries are not eligible for index-free query execution if there is\n // a potential that an older document from cache now sorts before a document\n // that was previously part of the limit. This, however, can only happen if\n // the document at the edge of the limit goes out of limit.\n // If a document that is not the limit boundary sorts differently,\n // the boundary of the limit itself did not change and documents from cache\n // will continue to be \"rejected\" by this boundary. Therefore, we can ignore\n // any modifications that don't affect the last document.\n const i = \"F\" /* LimitType.First */ === e.limitType ? t.last() : t.first();\n return !!i && (i.hasPendingWrites || i.version.compareTo(r) > 0);\n }\n Xi(e, t, n) {\n return __PRIVATE_getLogLevel() <= LogLevel.DEBUG && __PRIVATE_logDebug(\"QueryEngine\", \"Using full collection scan to execute query:\", __PRIVATE_stringifyQuery(t)), \n this.Ji.getDocumentsMatchingQuery(e, t, IndexOffset.min(), n);\n }\n /**\n * Combines the results from an indexed execution with the remaining documents\n * that have not yet been indexed.\n */ rs(e, t, n, r) {\n // Retrieve all results for documents that were updated since the offset.\n return this.Ji.getDocumentsMatchingQuery(e, n, r).next((e => (\n // Merge with existing results\n t.forEach((t => {\n e = e.insert(t.key, t);\n })), e)));\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Implements `LocalStore` interface.\n *\n * Note: some field defined in this class might have public access level, but\n * the class is not exported so they are only accessible from this module.\n * This is useful to implement optional features (like bundles) in free\n * functions, such that they are tree-shakeable.\n */\nclass __PRIVATE_LocalStoreImpl {\n constructor(\n /** Manages our in-memory or durable persistence. */\n e, t, n, r) {\n this.persistence = e, this.ss = t, this.serializer = r, \n /**\n * Maps a targetID to data about its target.\n *\n * PORTING NOTE: We are using an immutable data structure on Web to make re-runs\n * of `applyRemoteEvent()` idempotent.\n */\n this.os = new SortedMap(__PRIVATE_primitiveComparator), \n /** Maps a target to its targetID. */\n // TODO(wuandy): Evaluate if TargetId can be part of Target.\n this._s = new ObjectMap((e => __PRIVATE_canonifyTarget(e)), __PRIVATE_targetEquals), \n /**\n * A per collection group index of the last read time processed by\n * `getNewDocumentChanges()`.\n *\n * PORTING NOTE: This is only used for multi-tab synchronization.\n */\n this.us = new Map, this.cs = e.getRemoteDocumentCache(), this.Ur = e.getTargetCache(), \n this.Gr = e.getBundleCache(), this.ls(n);\n }\n ls(e) {\n // TODO(indexing): Add spec tests that test these components change after a\n // user change\n this.documentOverlayCache = this.persistence.getDocumentOverlayCache(e), this.indexManager = this.persistence.getIndexManager(e), \n this.mutationQueue = this.persistence.getMutationQueue(e, this.indexManager), this.localDocuments = new LocalDocumentsView(this.cs, this.mutationQueue, this.documentOverlayCache, this.indexManager), \n this.cs.setIndexManager(this.indexManager), this.ss.initialize(this.localDocuments, this.indexManager);\n }\n collectGarbage(e) {\n return this.persistence.runTransaction(\"Collect garbage\", \"readwrite-primary\", (t => e.collect(t, this.os)));\n }\n}\n\nfunction __PRIVATE_newLocalStore(\n/** Manages our in-memory or durable persistence. */\ne, t, n, r) {\n return new __PRIVATE_LocalStoreImpl(e, t, n, r);\n}\n\n/**\n * Tells the LocalStore that the currently authenticated user has changed.\n *\n * In response the local store switches the mutation queue to the new user and\n * returns any resulting document changes.\n */\n// PORTING NOTE: Android and iOS only return the documents affected by the\n// change.\nasync function __PRIVATE_localStoreHandleUserChange(e, t) {\n const n = __PRIVATE_debugCast(e);\n return await n.persistence.runTransaction(\"Handle user change\", \"readonly\", (e => {\n // Swap out the mutation queue, grabbing the pending mutation batches\n // before and after.\n let r;\n return n.mutationQueue.getAllMutationBatches(e).next((i => (r = i, n.ls(t), n.mutationQueue.getAllMutationBatches(e)))).next((t => {\n const i = [], s = [];\n // Union the old/new changed keys.\n let o = __PRIVATE_documentKeySet();\n for (const e of r) {\n i.push(e.batchId);\n for (const t of e.mutations) o = o.add(t.key);\n }\n for (const e of t) {\n s.push(e.batchId);\n for (const t of e.mutations) o = o.add(t.key);\n }\n // Return the set of all (potentially) changed documents and the list\n // of mutation batch IDs that were affected by change.\n return n.localDocuments.getDocuments(e, o).next((e => ({\n hs: e,\n removedBatchIds: i,\n addedBatchIds: s\n })));\n }));\n }));\n}\n\n/* Accepts locally generated Mutations and commit them to storage. */\n/**\n * Acknowledges the given batch.\n *\n * On the happy path when a batch is acknowledged, the local store will\n *\n * + remove the batch from the mutation queue;\n * + apply the changes to the remote document cache;\n * + recalculate the latency compensated view implied by those changes (there\n * may be mutations in the queue that affect the documents but haven't been\n * acknowledged yet); and\n * + give the changed documents back the sync engine\n *\n * @returns The resulting (modified) documents.\n */\nfunction __PRIVATE_localStoreAcknowledgeBatch(e, t) {\n const n = __PRIVATE_debugCast(e);\n return n.persistence.runTransaction(\"Acknowledge batch\", \"readwrite-primary\", (e => {\n const r = t.batch.keys(), i = n.cs.newChangeBuffer({\n trackRemovals: !0\n });\n return function __PRIVATE_applyWriteToRemoteDocuments(e, t, n, r) {\n const i = n.batch, s = i.keys();\n let o = PersistencePromise.resolve();\n return s.forEach((e => {\n o = o.next((() => r.getEntry(t, e))).next((t => {\n const s = n.docVersions.get(e);\n __PRIVATE_hardAssert(null !== s), t.version.compareTo(s) < 0 && (i.applyToRemoteDocument(t, n), \n t.isValidDocument() && (\n // We use the commitVersion as the readTime rather than the\n // document's updateTime since the updateTime is not advanced\n // for updates that do not modify the underlying document.\n t.setReadTime(n.commitVersion), r.addEntry(t)));\n }));\n })), o.next((() => e.mutationQueue.removeMutationBatch(t, i)));\n }\n /** Returns the local view of the documents affected by a mutation batch. */\n // PORTING NOTE: Multi-Tab only.\n (n, e, t, i).next((() => i.apply(e))).next((() => n.mutationQueue.performConsistencyCheck(e))).next((() => n.documentOverlayCache.removeOverlaysForBatchId(e, r, t.batch.batchId))).next((() => n.localDocuments.recalculateAndSaveOverlaysForDocumentKeys(e, function __PRIVATE_getKeysWithTransformResults(e) {\n let t = __PRIVATE_documentKeySet();\n for (let n = 0; n < e.mutationResults.length; ++n) {\n e.mutationResults[n].transformResults.length > 0 && (t = t.add(e.batch.mutations[n].key));\n }\n return t;\n }\n /**\n * Removes mutations from the MutationQueue for the specified batch;\n * LocalDocuments will be recalculated.\n *\n * @returns The resulting modified documents.\n */ (t)))).next((() => n.localDocuments.getDocuments(e, r)));\n }));\n}\n\n/**\n * Returns the last consistent snapshot processed (used by the RemoteStore to\n * determine whether to buffer incoming snapshots from the backend).\n */\nfunction __PRIVATE_localStoreGetLastRemoteSnapshotVersion(e) {\n const t = __PRIVATE_debugCast(e);\n return t.persistence.runTransaction(\"Get last remote snapshot version\", \"readonly\", (e => t.Ur.getLastRemoteSnapshotVersion(e)));\n}\n\n/**\n * Updates the \"ground-state\" (remote) documents. We assume that the remote\n * event reflects any write batches that have been acknowledged or rejected\n * (i.e. we do not re-apply local mutations to updates from this event).\n *\n * LocalDocuments are re-calculated if there are remaining mutations in the\n * queue.\n */ function __PRIVATE_localStoreApplyRemoteEventToLocalCache(e, t) {\n const n = __PRIVATE_debugCast(e), r = t.snapshotVersion;\n let i = n.os;\n return n.persistence.runTransaction(\"Apply remote event\", \"readwrite-primary\", (e => {\n const s = n.cs.newChangeBuffer({\n trackRemovals: !0\n });\n // Reset newTargetDataByTargetMap in case this transaction gets re-run.\n i = n.os;\n const o = [];\n t.targetChanges.forEach(((s, _) => {\n const a = i.get(_);\n if (!a) return;\n // Only update the remote keys if the target is still active. This\n // ensures that we can persist the updated target data along with\n // the updated assignment.\n o.push(n.Ur.removeMatchingKeys(e, s.removedDocuments, _).next((() => n.Ur.addMatchingKeys(e, s.addedDocuments, _))));\n let u = a.withSequenceNumber(e.currentSequenceNumber);\n null !== t.targetMismatches.get(_) ? u = u.withResumeToken(ByteString.EMPTY_BYTE_STRING, SnapshotVersion.min()).withLastLimboFreeSnapshotVersion(SnapshotVersion.min()) : s.resumeToken.approximateByteSize() > 0 && (u = u.withResumeToken(s.resumeToken, r)), \n i = i.insert(_, u), \n // Update the target data if there are target changes (or if\n // sufficient time has passed since the last update).\n /**\n * Returns true if the newTargetData should be persisted during an update of\n * an active target. TargetData should always be persisted when a target is\n * being released and should not call this function.\n *\n * While the target is active, TargetData updates can be omitted when nothing\n * about the target has changed except metadata like the resume token or\n * snapshot version. Occasionally it's worth the extra write to prevent these\n * values from getting too stale after a crash, but this doesn't have to be\n * too frequent.\n */\n function __PRIVATE_shouldPersistTargetData(e, t, n) {\n // Always persist target data if we don't already have a resume token.\n if (0 === e.resumeToken.approximateByteSize()) return !0;\n // Don't allow resume token changes to be buffered indefinitely. This\n // allows us to be reasonably up-to-date after a crash and avoids needing\n // to loop over all active queries on shutdown. Especially in the browser\n // we may not get time to do anything interesting while the current tab is\n // closing.\n if (t.snapshotVersion.toMicroseconds() - e.snapshotVersion.toMicroseconds() >= 3e8) return !0;\n // Otherwise if the only thing that has changed about a target is its resume\n // token it's not worth persisting. Note that the RemoteStore keeps an\n // in-memory view of the currently active targets which includes the current\n // resume token, so stream failure or user changes will still use an\n // up-to-date resume token regardless of what we do here.\n return n.addedDocuments.size + n.modifiedDocuments.size + n.removedDocuments.size > 0;\n }\n /**\n * Notifies local store of the changed views to locally pin documents.\n */ (a, u, s) && o.push(n.Ur.updateTargetData(e, u));\n }));\n let _ = __PRIVATE_mutableDocumentMap(), a = __PRIVATE_documentKeySet();\n // HACK: The only reason we allow a null snapshot version is so that we\n // can synthesize remote events when we get permission denied errors while\n // trying to resolve the state of a locally cached document that is in\n // limbo.\n if (t.documentUpdates.forEach((r => {\n t.resolvedLimboDocuments.has(r) && o.push(n.persistence.referenceDelegate.updateLimboDocument(e, r));\n })), \n // Each loop iteration only affects its \"own\" doc, so it's safe to get all\n // the remote documents in advance in a single call.\n o.push(__PRIVATE_populateDocumentChangeBuffer(e, s, t.documentUpdates).next((e => {\n _ = e.Ps, a = e.Is;\n }))), !r.isEqual(SnapshotVersion.min())) {\n const t = n.Ur.getLastRemoteSnapshotVersion(e).next((t => n.Ur.setTargetsMetadata(e, e.currentSequenceNumber, r)));\n o.push(t);\n }\n return PersistencePromise.waitFor(o).next((() => s.apply(e))).next((() => n.localDocuments.getLocalViewOfDocuments(e, _, a))).next((() => _));\n })).then((e => (n.os = i, e)));\n}\n\n/**\n * Populates document change buffer with documents from backend or a bundle.\n * Returns the document changes resulting from applying those documents, and\n * also a set of documents whose existence state are changed as a result.\n *\n * @param txn - Transaction to use to read existing documents from storage.\n * @param documentBuffer - Document buffer to collect the resulted changes to be\n * applied to storage.\n * @param documents - Documents to be applied.\n */ function __PRIVATE_populateDocumentChangeBuffer(e, t, n) {\n let r = __PRIVATE_documentKeySet(), i = __PRIVATE_documentKeySet();\n return n.forEach((e => r = r.add(e))), t.getEntries(e, r).next((e => {\n let r = __PRIVATE_mutableDocumentMap();\n return n.forEach(((n, s) => {\n const o = e.get(n);\n // Check if see if there is a existence state change for this document.\n s.isFoundDocument() !== o.isFoundDocument() && (i = i.add(n)), \n // Note: The order of the steps below is important, since we want\n // to ensure that rejected limbo resolutions (which fabricate\n // NoDocuments with SnapshotVersion.min()) never add documents to\n // cache.\n s.isNoDocument() && s.version.isEqual(SnapshotVersion.min()) ? (\n // NoDocuments with SnapshotVersion.min() are used in manufactured\n // events. We remove these documents from cache since we lost\n // access.\n t.removeEntry(n, s.readTime), r = r.insert(n, s)) : !o.isValidDocument() || s.version.compareTo(o.version) > 0 || 0 === s.version.compareTo(o.version) && o.hasPendingWrites ? (t.addEntry(s), \n r = r.insert(n, s)) : __PRIVATE_logDebug(\"LocalStore\", \"Ignoring outdated watch update for \", n, \". Current version:\", o.version, \" Watch version:\", s.version);\n })), {\n Ps: r,\n Is: i\n };\n }));\n}\n\n/**\n * Gets the mutation batch after the passed in batchId in the mutation queue\n * or null if empty.\n * @param afterBatchId - If provided, the batch to search after.\n * @returns The next mutation or null if there wasn't one.\n */\nfunction __PRIVATE_localStoreGetNextMutationBatch(e, t) {\n const n = __PRIVATE_debugCast(e);\n return n.persistence.runTransaction(\"Get next mutation batch\", \"readonly\", (e => (void 0 === t && (t = -1), \n n.mutationQueue.getNextMutationBatchAfterBatchId(e, t))));\n}\n\n/**\n * Reads the current value of a Document with a given key or null if not\n * found - used for testing.\n */\n/**\n * Assigns the given target an internal ID so that its results can be pinned so\n * they don't get GC'd. A target must be allocated in the local store before\n * the store can be used to manage its view.\n *\n * Allocating an already allocated `Target` will return the existing `TargetData`\n * for that `Target`.\n */\nfunction __PRIVATE_localStoreAllocateTarget(e, t) {\n const n = __PRIVATE_debugCast(e);\n return n.persistence.runTransaction(\"Allocate target\", \"readwrite\", (e => {\n let r;\n return n.Ur.getTargetData(e, t).next((i => i ? (\n // This target has been listened to previously, so reuse the\n // previous targetID.\n // TODO(mcg): freshen last accessed date?\n r = i, PersistencePromise.resolve(r)) : n.Ur.allocateTargetId(e).next((i => (r = new TargetData(t, i, \"TargetPurposeListen\" /* TargetPurpose.Listen */ , e.currentSequenceNumber), \n n.Ur.addTargetData(e, r).next((() => r)))))));\n })).then((e => {\n // If Multi-Tab is enabled, the existing target data may be newer than\n // the in-memory data\n const r = n.os.get(e.targetId);\n return (null === r || e.snapshotVersion.compareTo(r.snapshotVersion) > 0) && (n.os = n.os.insert(e.targetId, e), \n n._s.set(t, e.targetId)), e;\n }));\n}\n\n/**\n * Returns the TargetData as seen by the LocalStore, including updates that may\n * have not yet been persisted to the TargetCache.\n */\n// Visible for testing.\n/**\n * Unpins all the documents associated with the given target. If\n * `keepPersistedTargetData` is set to false and Eager GC enabled, the method\n * directly removes the associated target data from the target cache.\n *\n * Releasing a non-existing `Target` is a no-op.\n */\n// PORTING NOTE: `keepPersistedTargetData` is multi-tab only.\nasync function __PRIVATE_localStoreReleaseTarget(e, t, n) {\n const r = __PRIVATE_debugCast(e), i = r.os.get(t), s = n ? \"readwrite\" : \"readwrite-primary\";\n try {\n n || await r.persistence.runTransaction(\"Release target\", s, (e => r.persistence.referenceDelegate.removeTarget(e, i)));\n } catch (e) {\n if (!__PRIVATE_isIndexedDbTransactionError(e)) throw e;\n // All `releaseTarget` does is record the final metadata state for the\n // target, but we've been recording this periodically during target\n // activity. If we lose this write this could cause a very slight\n // difference in the order of target deletion during GC, but we\n // don't define exact LRU semantics so this is acceptable.\n __PRIVATE_logDebug(\"LocalStore\", `Failed to update sequence numbers for target ${t}: ${e}`);\n }\n r.os = r.os.remove(t), r._s.delete(i.target);\n}\n\n/**\n * Runs the specified query against the local store and returns the results,\n * potentially taking advantage of query data from previous executions (such\n * as the set of remote keys).\n *\n * @param usePreviousResults - Whether results from previous executions can\n * be used to optimize this query execution.\n */ function __PRIVATE_localStoreExecuteQuery(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n let i = SnapshotVersion.min(), s = __PRIVATE_documentKeySet();\n return r.persistence.runTransaction(\"Execute query\", \"readwrite\", (// Use readwrite instead of readonly so indexes can be created\n // Use readwrite instead of readonly so indexes can be created\n e => function __PRIVATE_localStoreGetTargetData(e, t, n) {\n const r = __PRIVATE_debugCast(e), i = r._s.get(n);\n return void 0 !== i ? PersistencePromise.resolve(r.os.get(i)) : r.Ur.getTargetData(t, n);\n }(r, e, __PRIVATE_queryToTarget(t)).next((t => {\n if (t) return i = t.lastLimboFreeSnapshotVersion, r.Ur.getMatchingKeysForTargetId(e, t.targetId).next((e => {\n s = e;\n }));\n })).next((() => r.ss.getDocumentsMatchingQuery(e, t, n ? i : SnapshotVersion.min(), n ? s : __PRIVATE_documentKeySet()))).next((e => (__PRIVATE_setMaxReadTime(r, __PRIVATE_queryCollectionGroup(t), e), \n {\n documents: e,\n Ts: s\n })))));\n}\n\n// PORTING NOTE: Multi-Tab only.\nfunction __PRIVATE_localStoreGetCachedTarget(e, t) {\n const n = __PRIVATE_debugCast(e), r = __PRIVATE_debugCast(n.Ur), i = n.os.get(t);\n return i ? Promise.resolve(i.target) : n.persistence.runTransaction(\"Get target data\", \"readonly\", (e => r.ot(e, t).next((e => e ? e.target : null))));\n}\n\n/**\n * Returns the set of documents that have been updated since the last call.\n * If this is the first call, returns the set of changes since client\n * initialization. Further invocations will return document that have changed\n * since the prior call.\n */\n// PORTING NOTE: Multi-Tab only.\nfunction __PRIVATE_localStoreGetNewDocumentChanges(e, t) {\n const n = __PRIVATE_debugCast(e), r = n.us.get(t) || SnapshotVersion.min();\n // Get the current maximum read time for the collection. This should always\n // exist, but to reduce the chance for regressions we default to\n // SnapshotVersion.Min()\n // TODO(indexing): Consider removing the default value.\n return n.persistence.runTransaction(\"Get new document changes\", \"readonly\", (e => n.cs.getAllFromCollectionGroup(e, t, __PRIVATE_newIndexOffsetSuccessorFromReadTime(r, -1), \n /* limit= */ Number.MAX_SAFE_INTEGER))).then((e => (__PRIVATE_setMaxReadTime(n, t, e), \n e)));\n}\n\n/** Sets the collection group's maximum read time from the given documents. */\n// PORTING NOTE: Multi-Tab only.\nfunction __PRIVATE_setMaxReadTime(e, t, n) {\n let r = e.us.get(t) || SnapshotVersion.min();\n n.forEach(((e, t) => {\n t.readTime.compareTo(r) > 0 && (r = t.readTime);\n })), e.us.set(t, r);\n}\n\n/**\n * Creates a new target using the given bundle name, which will be used to\n * hold the keys of all documents from the bundle in query-document mappings.\n * This ensures that the loaded documents do not get garbage collected\n * right away.\n */\n/**\n * Applies the documents from a bundle to the \"ground-state\" (remote)\n * documents.\n *\n * LocalDocuments are re-calculated if there are remaining mutations in the\n * queue.\n */\nasync function __PRIVATE_localStoreApplyBundledDocuments(e, t, n, r) {\n const i = __PRIVATE_debugCast(e);\n let s = __PRIVATE_documentKeySet(), o = __PRIVATE_mutableDocumentMap();\n for (const e of n) {\n const n = t.Es(e.metadata.name);\n e.document && (s = s.add(n));\n const r = t.ds(e);\n r.setReadTime(t.As(e.metadata.readTime)), o = o.insert(n, r);\n }\n const _ = i.cs.newChangeBuffer({\n trackRemovals: !0\n }), a = await __PRIVATE_localStoreAllocateTarget(i, function __PRIVATE_umbrellaTarget(e) {\n // It is OK that the path used for the query is not valid, because this will\n // not be read and queried.\n return __PRIVATE_queryToTarget(__PRIVATE_newQueryForPath(ResourcePath.fromString(`__bundle__/docs/${e}`)));\n }(r));\n // Allocates a target to hold all document keys from the bundle, such that\n // they will not get garbage collected right away.\n return i.persistence.runTransaction(\"Apply bundle documents\", \"readwrite\", (e => __PRIVATE_populateDocumentChangeBuffer(e, _, o).next((t => (_.apply(e), \n t))).next((t => i.Ur.removeMatchingKeysForTargetId(e, a.targetId).next((() => i.Ur.addMatchingKeys(e, s, a.targetId))).next((() => i.localDocuments.getLocalViewOfDocuments(e, t.Ps, t.Is))).next((() => t.Ps))))));\n}\n\n/**\n * Returns a promise of a boolean to indicate if the given bundle has already\n * been loaded and the create time is newer than the current loading bundle.\n */\n/**\n * Saves the given `NamedQuery` to local persistence.\n */\nasync function __PRIVATE_localStoreSaveNamedQuery(e, t, n = __PRIVATE_documentKeySet()) {\n // Allocate a target for the named query such that it can be resumed\n // from associated read time if users use it to listen.\n // NOTE: this also means if no corresponding target exists, the new target\n // will remain active and will not get collected, unless users happen to\n // unlisten the query somehow.\n const r = await __PRIVATE_localStoreAllocateTarget(e, __PRIVATE_queryToTarget(__PRIVATE_fromBundledQuery(t.bundledQuery))), i = __PRIVATE_debugCast(e);\n return i.persistence.runTransaction(\"Save named query\", \"readwrite\", (e => {\n const s = __PRIVATE_fromVersion(t.readTime);\n // Simply save the query itself if it is older than what the SDK already\n // has.\n if (r.snapshotVersion.compareTo(s) >= 0) return i.Gr.saveNamedQuery(e, t);\n // Update existing target data because the query from the bundle is newer.\n const o = r.withResumeToken(ByteString.EMPTY_BYTE_STRING, s);\n return i.os = i.os.insert(o.targetId, o), i.Ur.updateTargetData(e, o).next((() => i.Ur.removeMatchingKeysForTargetId(e, r.targetId))).next((() => i.Ur.addMatchingKeys(e, n, r.targetId))).next((() => i.Gr.saveNamedQuery(e, t)));\n }));\n}\n\n/** Assembles the key for a client state in WebStorage */\nfunction createWebStorageClientStateKey(e, t) {\n return `firestore_clients_${e}_${t}`;\n}\n\n// The format of the WebStorage key that stores the mutation state is:\n// firestore_mutations__\n// (for unauthenticated users)\n// or: firestore_mutations___\n\n// 'user_uid' is last to avoid needing to escape '_' characters that it might\n// contain.\n/** Assembles the key for a mutation batch in WebStorage */\nfunction createWebStorageMutationBatchKey(e, t, n) {\n let r = `firestore_mutations_${e}_${n}`;\n return t.isAuthenticated() && (r += `_${t.uid}`), r;\n}\n\n// The format of the WebStorage key that stores a query target's metadata is:\n// firestore_targets__\n/** Assembles the key for a query state in WebStorage */\nfunction createWebStorageQueryTargetMetadataKey(e, t) {\n return `firestore_targets_${e}_${t}`;\n}\n\n// The WebStorage prefix that stores the primary tab's online state. The\n// format of the key is:\n// firestore_online_state_\n/**\n * Holds the state of a mutation batch, including its user ID, batch ID and\n * whether the batch is 'pending', 'acknowledged' or 'rejected'.\n */\n// Visible for testing\nclass __PRIVATE_MutationMetadata {\n constructor(e, t, n, r) {\n this.user = e, this.batchId = t, this.state = n, this.error = r;\n }\n /**\n * Parses a MutationMetadata from its JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */ static Rs(e, t, n) {\n const r = JSON.parse(n);\n let i, s = \"object\" == typeof r && -1 !== [ \"pending\", \"acknowledged\", \"rejected\" ].indexOf(r.state) && (void 0 === r.error || \"object\" == typeof r.error);\n return s && r.error && (s = \"string\" == typeof r.error.message && \"string\" == typeof r.error.code, \n s && (i = new FirestoreError(r.error.code, r.error.message))), s ? new __PRIVATE_MutationMetadata(e, t, r.state, i) : (__PRIVATE_logError(\"SharedClientState\", `Failed to parse mutation state for ID '${t}': ${n}`), \n null);\n }\n Vs() {\n const e = {\n state: this.state,\n updateTimeMs: Date.now()\n };\n return this.error && (e.error = {\n code: this.error.code,\n message: this.error.message\n }), JSON.stringify(e);\n }\n}\n\n/**\n * Holds the state of a query target, including its target ID and whether the\n * target is 'not-current', 'current' or 'rejected'.\n */\n// Visible for testing\nclass __PRIVATE_QueryTargetMetadata {\n constructor(e, t, n) {\n this.targetId = e, this.state = t, this.error = n;\n }\n /**\n * Parses a QueryTargetMetadata from its JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */ static Rs(e, t) {\n const n = JSON.parse(t);\n let r, i = \"object\" == typeof n && -1 !== [ \"not-current\", \"current\", \"rejected\" ].indexOf(n.state) && (void 0 === n.error || \"object\" == typeof n.error);\n return i && n.error && (i = \"string\" == typeof n.error.message && \"string\" == typeof n.error.code, \n i && (r = new FirestoreError(n.error.code, n.error.message))), i ? new __PRIVATE_QueryTargetMetadata(e, n.state, r) : (__PRIVATE_logError(\"SharedClientState\", `Failed to parse target state for ID '${e}': ${t}`), \n null);\n }\n Vs() {\n const e = {\n state: this.state,\n updateTimeMs: Date.now()\n };\n return this.error && (e.error = {\n code: this.error.code,\n message: this.error.message\n }), JSON.stringify(e);\n }\n}\n\n/**\n * This class represents the immutable ClientState for a client read from\n * WebStorage, containing the list of active query targets.\n */ class __PRIVATE_RemoteClientState {\n constructor(e, t) {\n this.clientId = e, this.activeTargetIds = t;\n }\n /**\n * Parses a RemoteClientState from the JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */ static Rs(e, t) {\n const n = JSON.parse(t);\n let r = \"object\" == typeof n && n.activeTargetIds instanceof Array, i = __PRIVATE_targetIdSet();\n for (let e = 0; r && e < n.activeTargetIds.length; ++e) r = isSafeInteger(n.activeTargetIds[e]), \n i = i.add(n.activeTargetIds[e]);\n return r ? new __PRIVATE_RemoteClientState(e, i) : (__PRIVATE_logError(\"SharedClientState\", `Failed to parse client data for instance '${e}': ${t}`), \n null);\n }\n}\n\n/**\n * This class represents the online state for all clients participating in\n * multi-tab. The online state is only written to by the primary client, and\n * used in secondary clients to update their query views.\n */ class __PRIVATE_SharedOnlineState {\n constructor(e, t) {\n this.clientId = e, this.onlineState = t;\n }\n /**\n * Parses a SharedOnlineState from its JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */ static Rs(e) {\n const t = JSON.parse(e);\n return \"object\" == typeof t && -1 !== [ \"Unknown\", \"Online\", \"Offline\" ].indexOf(t.onlineState) && \"string\" == typeof t.clientId ? new __PRIVATE_SharedOnlineState(t.clientId, t.onlineState) : (__PRIVATE_logError(\"SharedClientState\", `Failed to parse online state: ${e}`), \n null);\n }\n}\n\n/**\n * Metadata state of the local client. Unlike `RemoteClientState`, this class is\n * mutable and keeps track of all pending mutations, which allows us to\n * update the range of pending mutation batch IDs as new mutations are added or\n * removed.\n *\n * The data in `LocalClientState` is not read from WebStorage and instead\n * updated via its instance methods. The updated state can be serialized via\n * `toWebStorageJSON()`.\n */\n// Visible for testing.\nclass __PRIVATE_LocalClientState {\n constructor() {\n this.activeTargetIds = __PRIVATE_targetIdSet();\n }\n fs(e) {\n this.activeTargetIds = this.activeTargetIds.add(e);\n }\n gs(e) {\n this.activeTargetIds = this.activeTargetIds.delete(e);\n }\n /**\n * Converts this entry into a JSON-encoded format we can use for WebStorage.\n * Does not encode `clientId` as it is part of the key in WebStorage.\n */ Vs() {\n const e = {\n activeTargetIds: this.activeTargetIds.toArray(),\n updateTimeMs: Date.now()\n };\n return JSON.stringify(e);\n }\n}\n\n/**\n * `WebStorageSharedClientState` uses WebStorage (window.localStorage) as the\n * backing store for the SharedClientState. It keeps track of all active\n * clients and supports modifications of the local client's data.\n */ class __PRIVATE_WebStorageSharedClientState {\n constructor(e, t, n, r, i) {\n this.window = e, this.ui = t, this.persistenceKey = n, this.ps = r, this.syncEngine = null, \n this.onlineStateHandler = null, this.sequenceNumberHandler = null, this.ys = this.ws.bind(this), \n this.Ss = new SortedMap(__PRIVATE_primitiveComparator), this.started = !1, \n /**\n * Captures WebStorage events that occur before `start()` is called. These\n * events are replayed once `WebStorageSharedClientState` is started.\n */\n this.bs = [];\n // Escape the special characters mentioned here:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n const s = n.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n this.storage = this.window.localStorage, this.currentUser = i, this.Ds = createWebStorageClientStateKey(this.persistenceKey, this.ps), \n this.vs = \n /** Assembles the key for the current sequence number. */\n function createWebStorageSequenceNumberKey(e) {\n return `firestore_sequence_number_${e}`;\n }\n /**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ (this.persistenceKey), this.Ss = this.Ss.insert(this.ps, new __PRIVATE_LocalClientState), \n this.Cs = new RegExp(`^firestore_clients_${s}_([^_]*)$`), this.Fs = new RegExp(`^firestore_mutations_${s}_(\\\\d+)(?:_(.*))?$`), \n this.Ms = new RegExp(`^firestore_targets_${s}_(\\\\d+)$`), this.xs = \n /** Assembles the key for the online state of the primary tab. */\n function createWebStorageOnlineStateKey(e) {\n return `firestore_online_state_${e}`;\n }\n // The WebStorage prefix that plays as a event to indicate the remote documents\n // might have changed due to some secondary tabs loading a bundle.\n // format of the key is:\n // firestore_bundle_loaded_v2_\n // The version ending with \"v2\" stores the list of modified collection groups.\n (this.persistenceKey), this.Os = function createBundleLoadedKey(e) {\n return `firestore_bundle_loaded_v2_${e}`;\n }\n // The WebStorage key prefix for the key that stores the last sequence number allocated. The key\n // looks like 'firestore_sequence_number_'.\n (this.persistenceKey), \n // Rather than adding the storage observer during start(), we add the\n // storage observer during initialization. This ensures that we collect\n // events before other components populate their initial state (during their\n // respective start() calls). Otherwise, we might for example miss a\n // mutation that is added after LocalStore's start() processed the existing\n // mutations but before we observe WebStorage events.\n this.window.addEventListener(\"storage\", this.ys);\n }\n /** Returns 'true' if WebStorage is available in the current environment. */ static D(e) {\n return !(!e || !e.localStorage);\n }\n async start() {\n // Retrieve the list of existing clients to backfill the data in\n // SharedClientState.\n const e = await this.syncEngine.Qi();\n for (const t of e) {\n if (t === this.ps) continue;\n const e = this.getItem(createWebStorageClientStateKey(this.persistenceKey, t));\n if (e) {\n const n = __PRIVATE_RemoteClientState.Rs(t, e);\n n && (this.Ss = this.Ss.insert(n.clientId, n));\n }\n }\n this.Ns();\n // Check if there is an existing online state and call the callback handler\n // if applicable.\n const t = this.storage.getItem(this.xs);\n if (t) {\n const e = this.Ls(t);\n e && this.Bs(e);\n }\n for (const e of this.bs) this.ws(e);\n this.bs = [], \n // Register a window unload hook to remove the client metadata entry from\n // WebStorage even if `shutdown()` was not called.\n this.window.addEventListener(\"pagehide\", (() => this.shutdown())), this.started = !0;\n }\n writeSequenceNumber(e) {\n this.setItem(this.vs, JSON.stringify(e));\n }\n getAllActiveQueryTargets() {\n return this.ks(this.Ss);\n }\n isActiveQueryTarget(e) {\n let t = !1;\n return this.Ss.forEach(((n, r) => {\n r.activeTargetIds.has(e) && (t = !0);\n })), t;\n }\n addPendingMutation(e) {\n this.qs(e, \"pending\");\n }\n updateMutationState(e, t, n) {\n this.qs(e, t, n), \n // Once a final mutation result is observed by other clients, they no longer\n // access the mutation's metadata entry. Since WebStorage replays events\n // in order, it is safe to delete the entry right after updating it.\n this.Qs(e);\n }\n addLocalQueryTarget(e, t = !0) {\n let n = \"not-current\";\n // Lookup an existing query state if the target ID was already registered\n // by another tab\n if (this.isActiveQueryTarget(e)) {\n const t = this.storage.getItem(createWebStorageQueryTargetMetadataKey(this.persistenceKey, e));\n if (t) {\n const r = __PRIVATE_QueryTargetMetadata.Rs(e, t);\n r && (n = r.state);\n }\n }\n // If the query is listening to cache only, the target ID should not be registered with the\n // local Firestore client as an active watch target.\n return t && this.Ks.fs(e), this.Ns(), n;\n }\n removeLocalQueryTarget(e) {\n this.Ks.gs(e), this.Ns();\n }\n isLocalQueryTarget(e) {\n return this.Ks.activeTargetIds.has(e);\n }\n clearQueryState(e) {\n this.removeItem(createWebStorageQueryTargetMetadataKey(this.persistenceKey, e));\n }\n updateQueryState(e, t, n) {\n this.$s(e, t, n);\n }\n handleUserChange(e, t, n) {\n t.forEach((e => {\n this.Qs(e);\n })), this.currentUser = e, n.forEach((e => {\n this.addPendingMutation(e);\n }));\n }\n setOnlineState(e) {\n this.Us(e);\n }\n notifyBundleLoaded(e) {\n this.Ws(e);\n }\n shutdown() {\n this.started && (this.window.removeEventListener(\"storage\", this.ys), this.removeItem(this.Ds), \n this.started = !1);\n }\n getItem(e) {\n const t = this.storage.getItem(e);\n return __PRIVATE_logDebug(\"SharedClientState\", \"READ\", e, t), t;\n }\n setItem(e, t) {\n __PRIVATE_logDebug(\"SharedClientState\", \"SET\", e, t), this.storage.setItem(e, t);\n }\n removeItem(e) {\n __PRIVATE_logDebug(\"SharedClientState\", \"REMOVE\", e), this.storage.removeItem(e);\n }\n ws(e) {\n // Note: The function is typed to take Event to be interface-compatible with\n // `Window.addEventListener`.\n const t = e;\n if (t.storageArea === this.storage) {\n if (__PRIVATE_logDebug(\"SharedClientState\", \"EVENT\", t.key, t.newValue), t.key === this.Ds) return void __PRIVATE_logError(\"Received WebStorage notification for local change. Another client might have garbage-collected our state\");\n this.ui.enqueueRetryable((async () => {\n if (this.started) {\n if (null !== t.key) if (this.Cs.test(t.key)) {\n if (null == t.newValue) {\n const e = this.Gs(t.key);\n return this.zs(e, null);\n }\n {\n const e = this.js(t.key, t.newValue);\n if (e) return this.zs(e.clientId, e);\n }\n } else if (this.Fs.test(t.key)) {\n if (null !== t.newValue) {\n const e = this.Hs(t.key, t.newValue);\n if (e) return this.Js(e);\n }\n } else if (this.Ms.test(t.key)) {\n if (null !== t.newValue) {\n const e = this.Ys(t.key, t.newValue);\n if (e) return this.Zs(e);\n }\n } else if (t.key === this.xs) {\n if (null !== t.newValue) {\n const e = this.Ls(t.newValue);\n if (e) return this.Bs(e);\n }\n } else if (t.key === this.vs) {\n const e = function __PRIVATE_fromWebStorageSequenceNumber(e) {\n let t = __PRIVATE_ListenSequence.oe;\n if (null != e) try {\n const n = JSON.parse(e);\n __PRIVATE_hardAssert(\"number\" == typeof n), t = n;\n } catch (e) {\n __PRIVATE_logError(\"SharedClientState\", \"Failed to read sequence number from WebStorage\", e);\n }\n return t;\n }\n /**\n * `MemorySharedClientState` is a simple implementation of SharedClientState for\n * clients using memory persistence. The state in this class remains fully\n * isolated and no synchronization is performed.\n */ (t.newValue);\n e !== __PRIVATE_ListenSequence.oe && this.sequenceNumberHandler(e);\n } else if (t.key === this.Os) {\n const e = this.Xs(t.newValue);\n await Promise.all(e.map((e => this.syncEngine.eo(e))));\n }\n } else this.bs.push(t);\n }));\n }\n }\n get Ks() {\n return this.Ss.get(this.ps);\n }\n Ns() {\n this.setItem(this.Ds, this.Ks.Vs());\n }\n qs(e, t, n) {\n const r = new __PRIVATE_MutationMetadata(this.currentUser, e, t, n), i = createWebStorageMutationBatchKey(this.persistenceKey, this.currentUser, e);\n this.setItem(i, r.Vs());\n }\n Qs(e) {\n const t = createWebStorageMutationBatchKey(this.persistenceKey, this.currentUser, e);\n this.removeItem(t);\n }\n Us(e) {\n const t = {\n clientId: this.ps,\n onlineState: e\n };\n this.storage.setItem(this.xs, JSON.stringify(t));\n }\n $s(e, t, n) {\n const r = createWebStorageQueryTargetMetadataKey(this.persistenceKey, e), i = new __PRIVATE_QueryTargetMetadata(e, t, n);\n this.setItem(r, i.Vs());\n }\n Ws(e) {\n const t = JSON.stringify(Array.from(e));\n this.setItem(this.Os, t);\n }\n /**\n * Parses a client state key in WebStorage. Returns null if the key does not\n * match the expected key format.\n */ Gs(e) {\n const t = this.Cs.exec(e);\n return t ? t[1] : null;\n }\n /**\n * Parses a client state in WebStorage. Returns 'null' if the value could not\n * be parsed.\n */ js(e, t) {\n const n = this.Gs(e);\n return __PRIVATE_RemoteClientState.Rs(n, t);\n }\n /**\n * Parses a mutation batch state in WebStorage. Returns 'null' if the value\n * could not be parsed.\n */ Hs(e, t) {\n const n = this.Fs.exec(e), r = Number(n[1]), i = void 0 !== n[2] ? n[2] : null;\n return __PRIVATE_MutationMetadata.Rs(new User(i), r, t);\n }\n /**\n * Parses a query target state from WebStorage. Returns 'null' if the value\n * could not be parsed.\n */ Ys(e, t) {\n const n = this.Ms.exec(e), r = Number(n[1]);\n return __PRIVATE_QueryTargetMetadata.Rs(r, t);\n }\n /**\n * Parses an online state from WebStorage. Returns 'null' if the value\n * could not be parsed.\n */ Ls(e) {\n return __PRIVATE_SharedOnlineState.Rs(e);\n }\n Xs(e) {\n return JSON.parse(e);\n }\n async Js(e) {\n if (e.user.uid === this.currentUser.uid) return this.syncEngine.no(e.batchId, e.state, e.error);\n __PRIVATE_logDebug(\"SharedClientState\", `Ignoring mutation for non-active user ${e.user.uid}`);\n }\n Zs(e) {\n return this.syncEngine.ro(e.targetId, e.state, e.error);\n }\n zs(e, t) {\n const n = t ? this.Ss.insert(e, t) : this.Ss.remove(e), r = this.ks(this.Ss), i = this.ks(n), s = [], o = [];\n return i.forEach((e => {\n r.has(e) || s.push(e);\n })), r.forEach((e => {\n i.has(e) || o.push(e);\n })), this.syncEngine.io(s, o).then((() => {\n this.Ss = n;\n }));\n }\n Bs(e) {\n // We check whether the client that wrote this online state is still active\n // by comparing its client ID to the list of clients kept active in\n // IndexedDb. If a client does not update their IndexedDb client state\n // within 5 seconds, it is considered inactive and we don't emit an online\n // state event.\n this.Ss.get(e.clientId) && this.onlineStateHandler(e.onlineState);\n }\n ks(e) {\n let t = __PRIVATE_targetIdSet();\n return e.forEach(((e, n) => {\n t = t.unionWith(n.activeTargetIds);\n })), t;\n }\n}\n\nclass __PRIVATE_MemorySharedClientState {\n constructor() {\n this.so = new __PRIVATE_LocalClientState, this.oo = {}, this.onlineStateHandler = null, \n this.sequenceNumberHandler = null;\n }\n addPendingMutation(e) {\n // No op.\n }\n updateMutationState(e, t, n) {\n // No op.\n }\n addLocalQueryTarget(e, t = !0) {\n return t && this.so.fs(e), this.oo[e] || \"not-current\";\n }\n updateQueryState(e, t, n) {\n this.oo[e] = t;\n }\n removeLocalQueryTarget(e) {\n this.so.gs(e);\n }\n isLocalQueryTarget(e) {\n return this.so.activeTargetIds.has(e);\n }\n clearQueryState(e) {\n delete this.oo[e];\n }\n getAllActiveQueryTargets() {\n return this.so.activeTargetIds;\n }\n isActiveQueryTarget(e) {\n return this.so.activeTargetIds.has(e);\n }\n start() {\n return this.so = new __PRIVATE_LocalClientState, Promise.resolve();\n }\n handleUserChange(e, t, n) {\n // No op.\n }\n setOnlineState(e) {\n // No op.\n }\n shutdown() {}\n writeSequenceNumber(e) {}\n notifyBundleLoaded(e) {\n // No op.\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_NoopConnectivityMonitor {\n _o(e) {\n // No-op.\n }\n shutdown() {\n // No-op.\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// References to `window` are guarded by BrowserConnectivityMonitor.isAvailable()\n/* eslint-disable no-restricted-globals */\n/**\n * Browser implementation of ConnectivityMonitor.\n */\nclass __PRIVATE_BrowserConnectivityMonitor {\n constructor() {\n this.ao = () => this.uo(), this.co = () => this.lo(), this.ho = [], this.Po();\n }\n _o(e) {\n this.ho.push(e);\n }\n shutdown() {\n window.removeEventListener(\"online\", this.ao), window.removeEventListener(\"offline\", this.co);\n }\n Po() {\n window.addEventListener(\"online\", this.ao), window.addEventListener(\"offline\", this.co);\n }\n uo() {\n __PRIVATE_logDebug(\"ConnectivityMonitor\", \"Network connectivity changed: AVAILABLE\");\n for (const e of this.ho) e(0 /* NetworkStatus.AVAILABLE */);\n }\n lo() {\n __PRIVATE_logDebug(\"ConnectivityMonitor\", \"Network connectivity changed: UNAVAILABLE\");\n for (const e of this.ho) e(1 /* NetworkStatus.UNAVAILABLE */);\n }\n // TODO(chenbrian): Consider passing in window either into this component or\n // here for testing via FakeWindow.\n /** Checks that all used attributes of window are available. */\n static D() {\n return \"undefined\" != typeof window && void 0 !== window.addEventListener && void 0 !== window.removeEventListener;\n }\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The value returned from the most recent invocation of\n * `generateUniqueDebugId()`, or null if it has never been invoked.\n */ let me = null;\n\n/**\n * Generates and returns an initial value for `lastUniqueDebugId`.\n *\n * The returned value is randomly selected from a range of integers that are\n * represented as 8 hexadecimal digits. This means that (within reason) any\n * numbers generated by incrementing the returned number by 1 will also be\n * represented by 8 hexadecimal digits. This leads to all \"IDs\" having the same\n * length when converted to a hexadecimal string, making reading logs containing\n * these IDs easier to follow. And since the return value is randomly selected\n * it will help to differentiate between logs from different executions.\n */\n/**\n * Generates and returns a unique ID as a hexadecimal string.\n *\n * The returned ID is intended to be used in debug logging messages to help\n * correlate log messages that may be spatially separated in the logs, but\n * logically related. For example, a network connection could include the same\n * \"debug ID\" string in all of its log messages to help trace a specific\n * connection over time.\n *\n * @return the 10-character generated ID (e.g. \"0xa1b2c3d4\").\n */\nfunction __PRIVATE_generateUniqueDebugId() {\n return null === me ? me = function __PRIVATE_generateInitialUniqueDebugId() {\n return 268435456 + Math.round(2147483648 * Math.random());\n }() : me++, \"0x\" + me.toString(16);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const fe = {\n BatchGetDocuments: \"batchGet\",\n Commit: \"commit\",\n RunQuery: \"runQuery\",\n RunAggregationQuery: \"runAggregationQuery\"\n};\n\n/**\n * Maps RPC names to the corresponding REST endpoint name.\n *\n * We use array notation to avoid mangling.\n */\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Provides a simple helper class that implements the Stream interface to\n * bridge to other implementations that are streams but do not implement the\n * interface. The stream callbacks are invoked with the callOn... methods.\n */\nclass __PRIVATE_StreamBridge {\n constructor(e) {\n this.Io = e.Io, this.To = e.To;\n }\n Eo(e) {\n this.Ao = e;\n }\n Ro(e) {\n this.Vo = e;\n }\n mo(e) {\n this.fo = e;\n }\n onMessage(e) {\n this.po = e;\n }\n close() {\n this.To();\n }\n send(e) {\n this.Io(e);\n }\n yo() {\n this.Ao();\n }\n wo() {\n this.Vo();\n }\n So(e) {\n this.fo(e);\n }\n bo(e) {\n this.po(e);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const ge = \"WebChannelConnection\";\n\nclass __PRIVATE_WebChannelConnection extends \n/**\n * Base class for all Rest-based connections to the backend (WebChannel and\n * HTTP).\n */\nclass __PRIVATE_RestConnection {\n constructor(e) {\n this.databaseInfo = e, this.databaseId = e.databaseId;\n const t = e.ssl ? \"https\" : \"http\", n = encodeURIComponent(this.databaseId.projectId), r = encodeURIComponent(this.databaseId.database);\n this.Do = t + \"://\" + e.host, this.vo = `projects/${n}/databases/${r}`, this.Co = \"(default)\" === this.databaseId.database ? `project_id=${n}` : `project_id=${n}&database_id=${r}`;\n }\n get Fo() {\n // Both `invokeRPC()` and `invokeStreamingRPC()` use their `path` arguments to determine\n // where to run the query, and expect the `request` to NOT specify the \"path\".\n return !1;\n }\n Mo(e, t, n, r, i) {\n const s = __PRIVATE_generateUniqueDebugId(), o = this.xo(e, t.toUriEncodedString());\n __PRIVATE_logDebug(\"RestConnection\", `Sending RPC '${e}' ${s}:`, o, n);\n const _ = {\n \"google-cloud-resource-prefix\": this.vo,\n \"x-goog-request-params\": this.Co\n };\n return this.Oo(_, r, i), this.No(e, o, _, n).then((t => (__PRIVATE_logDebug(\"RestConnection\", `Received RPC '${e}' ${s}: `, t), \n t)), (t => {\n throw __PRIVATE_logWarn(\"RestConnection\", `RPC '${e}' ${s} failed with error: `, t, \"url: \", o, \"request:\", n), \n t;\n }));\n }\n Lo(e, t, n, r, i, s) {\n // The REST API automatically aggregates all of the streamed results, so we\n // can just use the normal invoke() method.\n return this.Mo(e, t, n, r, i);\n }\n /**\n * Modifies the headers for a request, adding any authorization token if\n * present and any additional headers for the request.\n */ Oo(e, t, n) {\n e[\"X-Goog-Api-Client\"] = \n // SDK_VERSION is updated to different value at runtime depending on the entry point,\n // so we need to get its value when we need it in a function.\n function __PRIVATE_getGoogApiClientValue() {\n return \"gl-js/ fire/\" + S;\n }(), \n // Content-Type: text/plain will avoid preflight requests which might\n // mess with CORS and redirects by proxies. If we add custom headers\n // we will need to change this code to potentially use the $httpOverwrite\n // parameter supported by ESF to avoid triggering preflight requests.\n e[\"Content-Type\"] = \"text/plain\", this.databaseInfo.appId && (e[\"X-Firebase-GMPID\"] = this.databaseInfo.appId), \n t && t.headers.forEach(((t, n) => e[n] = t)), n && n.headers.forEach(((t, n) => e[n] = t));\n }\n xo(e, t) {\n const n = fe[e];\n return `${this.Do}/v1/${t}:${n}`;\n }\n /**\n * Closes and cleans up any resources associated with the connection. This\n * implementation is a no-op because there are no resources associated\n * with the RestConnection that need to be cleaned up.\n */ terminate() {\n // No-op\n }\n} {\n constructor(e) {\n super(e), this.forceLongPolling = e.forceLongPolling, this.autoDetectLongPolling = e.autoDetectLongPolling, \n this.useFetchStreams = e.useFetchStreams, this.longPollingOptions = e.longPollingOptions;\n }\n No(e, t, n, r) {\n const i = __PRIVATE_generateUniqueDebugId();\n return new Promise(((s, o) => {\n const _ = new XhrIo;\n _.setWithCredentials(!0), _.listenOnce(EventType.COMPLETE, (() => {\n try {\n switch (_.getLastErrorCode()) {\n case ErrorCode.NO_ERROR:\n const t = _.getResponseJson();\n __PRIVATE_logDebug(ge, `XHR for RPC '${e}' ${i} received:`, JSON.stringify(t)), \n s(t);\n break;\n\n case ErrorCode.TIMEOUT:\n __PRIVATE_logDebug(ge, `RPC '${e}' ${i} timed out`), o(new FirestoreError(D.DEADLINE_EXCEEDED, \"Request time out\"));\n break;\n\n case ErrorCode.HTTP_ERROR:\n const n = _.getStatus();\n if (__PRIVATE_logDebug(ge, `RPC '${e}' ${i} failed with status:`, n, \"response text:\", _.getResponseText()), \n n > 0) {\n let e = _.getResponseJson();\n Array.isArray(e) && (e = e[0]);\n const t = null == e ? void 0 : e.error;\n if (t && t.status && t.message) {\n const e = function __PRIVATE_mapCodeFromHttpResponseErrorStatus(e) {\n const t = e.toLowerCase().replace(/_/g, \"-\");\n return Object.values(D).indexOf(t) >= 0 ? t : D.UNKNOWN;\n }(t.status);\n o(new FirestoreError(e, t.message));\n } else o(new FirestoreError(D.UNKNOWN, \"Server responded with status \" + _.getStatus()));\n } else \n // If we received an HTTP_ERROR but there's no status code,\n // it's most probably a connection issue\n o(new FirestoreError(D.UNAVAILABLE, \"Connection failed.\"));\n break;\n\n default:\n fail();\n }\n } finally {\n __PRIVATE_logDebug(ge, `RPC '${e}' ${i} completed.`);\n }\n }));\n const a = JSON.stringify(r);\n __PRIVATE_logDebug(ge, `RPC '${e}' ${i} sending request:`, r), _.send(t, \"POST\", a, n, 15);\n }));\n }\n Bo(e, t, n) {\n const r = __PRIVATE_generateUniqueDebugId(), i = [ this.Do, \"/\", \"google.firestore.v1.Firestore\", \"/\", e, \"/channel\" ], s = createWebChannelTransport(), o = getStatEventTarget(), _ = {\n // Required for backend stickiness, routing behavior is based on this\n // parameter.\n httpSessionIdParam: \"gsessionid\",\n initMessageHeaders: {},\n messageUrlParams: {\n // This param is used to improve routing and project isolation by the\n // backend and must be included in every request.\n database: `projects/${this.databaseId.projectId}/databases/${this.databaseId.database}`\n },\n sendRawJson: !0,\n supportsCrossDomainXhr: !0,\n internalChannelParams: {\n // Override the default timeout (randomized between 10-20 seconds) since\n // a large write batch on a slow internet connection may take a long\n // time to send to the backend. Rather than have WebChannel impose a\n // tight timeout which could lead to infinite timeouts and retries, we\n // set it very large (5-10 minutes) and rely on the browser's builtin\n // timeouts to kick in if the request isn't working.\n forwardChannelRequestTimeoutMs: 6e5\n },\n forceLongPolling: this.forceLongPolling,\n detectBufferingProxy: this.autoDetectLongPolling\n }, a = this.longPollingOptions.timeoutSeconds;\n void 0 !== a && (_.longPollingTimeout = Math.round(1e3 * a)), this.useFetchStreams && (_.useFetchStreams = !0), \n this.Oo(_.initMessageHeaders, t, n), \n // Sending the custom headers we just added to request.initMessageHeaders\n // (Authorization, etc.) will trigger the browser to make a CORS preflight\n // request because the XHR will no longer meet the criteria for a \"simple\"\n // CORS request:\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests\n // Therefore to avoid the CORS preflight request (an extra network\n // roundtrip), we use the encodeInitMessageHeaders option to specify that\n // the headers should instead be encoded in the request's POST payload,\n // which is recognized by the webchannel backend.\n _.encodeInitMessageHeaders = !0;\n const u = i.join(\"\");\n __PRIVATE_logDebug(ge, `Creating RPC '${e}' stream ${r}: ${u}`, _);\n const c = s.createWebChannel(u, _);\n // WebChannel supports sending the first message with the handshake - saving\n // a network round trip. However, it will have to call send in the same\n // JS event loop as open. In order to enforce this, we delay actually\n // opening the WebChannel until send is called. Whether we have called\n // open is tracked with this variable.\n let l = !1, h = !1;\n // A flag to determine whether the stream was closed (by us or through an\n // error/close event) to avoid delivering multiple close events or sending\n // on a closed stream\n const P = new __PRIVATE_StreamBridge({\n Io: t => {\n h ? __PRIVATE_logDebug(ge, `Not sending because RPC '${e}' stream ${r} is closed:`, t) : (l || (__PRIVATE_logDebug(ge, `Opening RPC '${e}' stream ${r} transport.`), \n c.open(), l = !0), __PRIVATE_logDebug(ge, `RPC '${e}' stream ${r} sending:`, t), \n c.send(t));\n },\n To: () => c.close()\n }), __PRIVATE_unguardedEventListen = (e, t, n) => {\n // TODO(dimond): closure typing seems broken because WebChannel does\n // not implement goog.events.Listenable\n e.listen(t, (e => {\n try {\n n(e);\n } catch (e) {\n setTimeout((() => {\n throw e;\n }), 0);\n }\n }));\n };\n // Closure events are guarded and exceptions are swallowed, so catch any\n // exception and rethrow using a setTimeout so they become visible again.\n // Note that eventually this function could go away if we are confident\n // enough the code is exception free.\n return __PRIVATE_unguardedEventListen(c, WebChannel.EventType.OPEN, (() => {\n h || (__PRIVATE_logDebug(ge, `RPC '${e}' stream ${r} transport opened.`), P.yo());\n })), __PRIVATE_unguardedEventListen(c, WebChannel.EventType.CLOSE, (() => {\n h || (h = !0, __PRIVATE_logDebug(ge, `RPC '${e}' stream ${r} transport closed`), \n P.So());\n })), __PRIVATE_unguardedEventListen(c, WebChannel.EventType.ERROR, (t => {\n h || (h = !0, __PRIVATE_logWarn(ge, `RPC '${e}' stream ${r} transport errored:`, t), \n P.So(new FirestoreError(D.UNAVAILABLE, \"The operation could not be completed\")));\n })), __PRIVATE_unguardedEventListen(c, WebChannel.EventType.MESSAGE, (t => {\n var n;\n if (!h) {\n const i = t.data[0];\n __PRIVATE_hardAssert(!!i);\n // TODO(b/35143891): There is a bug in One Platform that caused errors\n // (and only errors) to be wrapped in an extra array. To be forward\n // compatible with the bug we need to check either condition. The latter\n // can be removed once the fix has been rolled out.\n // Use any because msgData.error is not typed.\n const s = i, o = s.error || (null === (n = s[0]) || void 0 === n ? void 0 : n.error);\n if (o) {\n __PRIVATE_logDebug(ge, `RPC '${e}' stream ${r} received error:`, o);\n // error.status will be a string like 'OK' or 'NOT_FOUND'.\n const t = o.status;\n let n = \n /**\n * Maps an error Code from a GRPC status identifier like 'NOT_FOUND'.\n *\n * @returns The Code equivalent to the given status string or undefined if\n * there is no match.\n */\n function __PRIVATE_mapCodeFromRpcStatus(e) {\n // lookup by string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const t = le[e];\n if (void 0 !== t) return __PRIVATE_mapCodeFromRpcCode(t);\n }(t), i = o.message;\n void 0 === n && (n = D.INTERNAL, i = \"Unknown error status: \" + t + \" with message \" + o.message), \n // Mark closed so no further events are propagated\n h = !0, P.So(new FirestoreError(n, i)), c.close();\n } else __PRIVATE_logDebug(ge, `RPC '${e}' stream ${r} received:`, i), P.bo(i);\n }\n })), __PRIVATE_unguardedEventListen(o, Event.STAT_EVENT, (t => {\n t.stat === Stat.PROXY ? __PRIVATE_logDebug(ge, `RPC '${e}' stream ${r} detected buffering proxy`) : t.stat === Stat.NOPROXY && __PRIVATE_logDebug(ge, `RPC '${e}' stream ${r} detected no buffering proxy`);\n })), setTimeout((() => {\n // Technically we could/should wait for the WebChannel opened event,\n // but because we want to send the first message with the WebChannel\n // handshake we pretend the channel opened here (asynchronously), and\n // then delay the actual open until the first message is sent.\n P.wo();\n }), 0), P;\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Initializes the WebChannelConnection for the browser. */\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** The Platform's 'window' implementation or null if not available. */\nfunction __PRIVATE_getWindow() {\n // `window` is not always available, e.g. in ReactNative and WebWorkers.\n // eslint-disable-next-line no-restricted-globals\n return \"undefined\" != typeof window ? window : null;\n}\n\n/** The Platform's 'document' implementation or null if not available. */ function getDocument() {\n // `document` is not always available, e.g. in ReactNative and WebWorkers.\n // eslint-disable-next-line no-restricted-globals\n return \"undefined\" != typeof document ? document : null;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ function __PRIVATE_newSerializer(e) {\n return new JsonProtoSerializer(e, /* useProto3Json= */ !0);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A helper for running delayed tasks following an exponential backoff curve\n * between attempts.\n *\n * Each delay is made up of a \"base\" delay which follows the exponential\n * backoff curve, and a +/- 50% \"jitter\" that is calculated and added to the\n * base delay. This prevents clients from accidentally synchronizing their\n * delays causing spikes of load to the backend.\n */\nclass __PRIVATE_ExponentialBackoff {\n constructor(\n /**\n * The AsyncQueue to run backoff operations on.\n */\n e, \n /**\n * The ID to use when scheduling backoff operations on the AsyncQueue.\n */\n t, \n /**\n * The initial delay (used as the base delay on the first retry attempt).\n * Note that jitter will still be applied, so the actual delay could be as\n * little as 0.5*initialDelayMs.\n */\n n = 1e3\n /**\n * The multiplier to use to determine the extended base delay after each\n * attempt.\n */ , r = 1.5\n /**\n * The maximum base delay after which no further backoff is performed.\n * Note that jitter will still be applied, so the actual delay could be as\n * much as 1.5*maxDelayMs.\n */ , i = 6e4) {\n this.ui = e, this.timerId = t, this.ko = n, this.qo = r, this.Qo = i, this.Ko = 0, \n this.$o = null, \n /** The last backoff attempt, as epoch milliseconds. */\n this.Uo = Date.now(), this.reset();\n }\n /**\n * Resets the backoff delay.\n *\n * The very next backoffAndWait() will have no delay. If it is called again\n * (i.e. due to an error), initialDelayMs (plus jitter) will be used, and\n * subsequent ones will increase according to the backoffFactor.\n */ reset() {\n this.Ko = 0;\n }\n /**\n * Resets the backoff delay to the maximum delay (e.g. for use after a\n * RESOURCE_EXHAUSTED error).\n */ Wo() {\n this.Ko = this.Qo;\n }\n /**\n * Returns a promise that resolves after currentDelayMs, and increases the\n * delay for any subsequent attempts. If there was a pending backoff operation\n * already, it will be canceled.\n */ Go(e) {\n // Cancel any pending backoff operation.\n this.cancel();\n // First schedule using the current base (which may be 0 and should be\n // honored as such).\n const t = Math.floor(this.Ko + this.zo()), n = Math.max(0, Date.now() - this.Uo), r = Math.max(0, t - n);\n // Guard against lastAttemptTime being in the future due to a clock change.\n r > 0 && __PRIVATE_logDebug(\"ExponentialBackoff\", `Backing off for ${r} ms (base delay: ${this.Ko} ms, delay with jitter: ${t} ms, last attempt: ${n} ms ago)`), \n this.$o = this.ui.enqueueAfterDelay(this.timerId, r, (() => (this.Uo = Date.now(), \n e()))), \n // Apply backoff factor to determine next delay and ensure it is within\n // bounds.\n this.Ko *= this.qo, this.Ko < this.ko && (this.Ko = this.ko), this.Ko > this.Qo && (this.Ko = this.Qo);\n }\n jo() {\n null !== this.$o && (this.$o.skipDelay(), this.$o = null);\n }\n cancel() {\n null !== this.$o && (this.$o.cancel(), this.$o = null);\n }\n /** Returns a random value in the range [-currentBaseMs/2, currentBaseMs/2] */ zo() {\n return (Math.random() - .5) * this.Ko;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A PersistentStream is an abstract base class that represents a streaming RPC\n * to the Firestore backend. It's built on top of the connections own support\n * for streaming RPCs, and adds several critical features for our clients:\n *\n * - Exponential backoff on failure\n * - Authentication via CredentialsProvider\n * - Dispatching all callbacks into the shared worker queue\n * - Closing idle streams after 60 seconds of inactivity\n *\n * Subclasses of PersistentStream implement serialization of models to and\n * from the JSON representation of the protocol buffers for a specific\n * streaming RPC.\n *\n * ## Starting and Stopping\n *\n * Streaming RPCs are stateful and need to be start()ed before messages can\n * be sent and received. The PersistentStream will call the onOpen() function\n * of the listener once the stream is ready to accept requests.\n *\n * Should a start() fail, PersistentStream will call the registered onClose()\n * listener with a FirestoreError indicating what went wrong.\n *\n * A PersistentStream can be started and stopped repeatedly.\n *\n * Generic types:\n * SendType: The type of the outgoing message of the underlying\n * connection stream\n * ReceiveType: The type of the incoming message of the underlying\n * connection stream\n * ListenerType: The type of the listener that will be used for callbacks\n */\nclass __PRIVATE_PersistentStream {\n constructor(e, t, n, r, i, s, o, _) {\n this.ui = e, this.Ho = n, this.Jo = r, this.connection = i, this.authCredentialsProvider = s, \n this.appCheckCredentialsProvider = o, this.listener = _, this.state = 0 /* PersistentStreamState.Initial */ , \n /**\n * A close count that's incremented every time the stream is closed; used by\n * getCloseGuardedDispatcher() to invalidate callbacks that happen after\n * close.\n */\n this.Yo = 0, this.Zo = null, this.Xo = null, this.stream = null, \n /**\n * Count of response messages received.\n */\n this.e_ = 0, this.t_ = new __PRIVATE_ExponentialBackoff(e, t);\n }\n /**\n * Returns true if start() has been called and no error has occurred. True\n * indicates the stream is open or in the process of opening (which\n * encompasses respecting backoff, getting auth tokens, and starting the\n * actual RPC). Use isOpen() to determine if the stream is open and ready for\n * outbound requests.\n */ n_() {\n return 1 /* PersistentStreamState.Starting */ === this.state || 5 /* PersistentStreamState.Backoff */ === this.state || this.r_();\n }\n /**\n * Returns true if the underlying RPC is open (the onOpen() listener has been\n * called) and the stream is ready for outbound requests.\n */ r_() {\n return 2 /* PersistentStreamState.Open */ === this.state || 3 /* PersistentStreamState.Healthy */ === this.state;\n }\n /**\n * Starts the RPC. Only allowed if isStarted() returns false. The stream is\n * not immediately ready for use: onOpen() will be invoked when the RPC is\n * ready for outbound requests, at which point isOpen() will return true.\n *\n * When start returns, isStarted() will return true.\n */ start() {\n this.e_ = 0, 4 /* PersistentStreamState.Error */ !== this.state ? this.auth() : this.i_();\n }\n /**\n * Stops the RPC. This call is idempotent and allowed regardless of the\n * current isStarted() state.\n *\n * When stop returns, isStarted() and isOpen() will both return false.\n */ async stop() {\n this.n_() && await this.close(0 /* PersistentStreamState.Initial */);\n }\n /**\n * After an error the stream will usually back off on the next attempt to\n * start it. If the error warrants an immediate restart of the stream, the\n * sender can use this to indicate that the receiver should not back off.\n *\n * Each error will call the onClose() listener. That function can decide to\n * inhibit backoff if required.\n */ s_() {\n this.state = 0 /* PersistentStreamState.Initial */ , this.t_.reset();\n }\n /**\n * Marks this stream as idle. If no further actions are performed on the\n * stream for one minute, the stream will automatically close itself and\n * notify the stream's onClose() handler with Status.OK. The stream will then\n * be in a !isStarted() state, requiring the caller to start the stream again\n * before further use.\n *\n * Only streams that are in state 'Open' can be marked idle, as all other\n * states imply pending network operations.\n */ o_() {\n // Starts the idle time if we are in state 'Open' and are not yet already\n // running a timer (in which case the previous idle timeout still applies).\n this.r_() && null === this.Zo && (this.Zo = this.ui.enqueueAfterDelay(this.Ho, 6e4, (() => this.__())));\n }\n /** Sends a message to the underlying stream. */ a_(e) {\n this.u_(), this.stream.send(e);\n }\n /** Called by the idle timer when the stream should close due to inactivity. */ async __() {\n if (this.r_()) \n // When timing out an idle stream there's no reason to force the stream into backoff when\n // it restarts so set the stream state to Initial instead of Error.\n return this.close(0 /* PersistentStreamState.Initial */);\n }\n /** Marks the stream as active again. */ u_() {\n this.Zo && (this.Zo.cancel(), this.Zo = null);\n }\n /** Cancels the health check delayed operation. */ c_() {\n this.Xo && (this.Xo.cancel(), this.Xo = null);\n }\n /**\n * Closes the stream and cleans up as necessary:\n *\n * * closes the underlying GRPC stream;\n * * calls the onClose handler with the given 'error';\n * * sets internal stream state to 'finalState';\n * * adjusts the backoff timer based on the error\n *\n * A new stream can be opened by calling start().\n *\n * @param finalState - the intended state of the stream after closing.\n * @param error - the error the connection was closed with.\n */ async close(e, t) {\n // Cancel any outstanding timers (they're guaranteed not to execute).\n this.u_(), this.c_(), this.t_.cancel(), \n // Invalidates any stream-related callbacks (e.g. from auth or the\n // underlying stream), guaranteeing they won't execute.\n this.Yo++, 4 /* PersistentStreamState.Error */ !== e ? \n // If this is an intentional close ensure we don't delay our next connection attempt.\n this.t_.reset() : t && t.code === D.RESOURCE_EXHAUSTED ? (\n // Log the error. (Probably either 'quota exceeded' or 'max queue length reached'.)\n __PRIVATE_logError(t.toString()), __PRIVATE_logError(\"Using maximum backoff delay to prevent overloading the backend.\"), \n this.t_.Wo()) : t && t.code === D.UNAUTHENTICATED && 3 /* PersistentStreamState.Healthy */ !== this.state && (\n // \"unauthenticated\" error means the token was rejected. This should rarely\n // happen since both Auth and AppCheck ensure a sufficient TTL when we\n // request a token. If a user manually resets their system clock this can\n // fail, however. In this case, we should get a Code.UNAUTHENTICATED error\n // before we received the first message and we need to invalidate the token\n // to ensure that we fetch a new token.\n this.authCredentialsProvider.invalidateToken(), this.appCheckCredentialsProvider.invalidateToken()), \n // Clean up the underlying stream because we are no longer interested in events.\n null !== this.stream && (this.l_(), this.stream.close(), this.stream = null), \n // This state must be assigned before calling onClose() to allow the callback to\n // inhibit backoff or otherwise manipulate the state in its non-started state.\n this.state = e, \n // Notify the listener that the stream closed.\n await this.listener.mo(t);\n }\n /**\n * Can be overridden to perform additional cleanup before the stream is closed.\n * Calling super.tearDown() is not required.\n */ l_() {}\n auth() {\n this.state = 1 /* PersistentStreamState.Starting */;\n const e = this.h_(this.Yo), t = this.Yo;\n // TODO(mikelehen): Just use dispatchIfNotClosed, but see TODO below.\n Promise.all([ this.authCredentialsProvider.getToken(), this.appCheckCredentialsProvider.getToken() ]).then((([e, n]) => {\n // Stream can be stopped while waiting for authentication.\n // TODO(mikelehen): We really should just use dispatchIfNotClosed\n // and let this dispatch onto the queue, but that opened a spec test can\n // of worms that I don't want to deal with in this PR.\n this.Yo === t && \n // Normally we'd have to schedule the callback on the AsyncQueue.\n // However, the following calls are safe to be called outside the\n // AsyncQueue since they don't chain asynchronous calls\n this.P_(e, n);\n }), (t => {\n e((() => {\n const e = new FirestoreError(D.UNKNOWN, \"Fetching auth token failed: \" + t.message);\n return this.I_(e);\n }));\n }));\n }\n P_(e, t) {\n const n = this.h_(this.Yo);\n this.stream = this.T_(e, t), this.stream.Eo((() => {\n n((() => this.listener.Eo()));\n })), this.stream.Ro((() => {\n n((() => (this.state = 2 /* PersistentStreamState.Open */ , this.Xo = this.ui.enqueueAfterDelay(this.Jo, 1e4, (() => (this.r_() && (this.state = 3 /* PersistentStreamState.Healthy */), \n Promise.resolve()))), this.listener.Ro())));\n })), this.stream.mo((e => {\n n((() => this.I_(e)));\n })), this.stream.onMessage((e => {\n n((() => 1 == ++this.e_ ? this.E_(e) : this.onNext(e)));\n }));\n }\n i_() {\n this.state = 5 /* PersistentStreamState.Backoff */ , this.t_.Go((async () => {\n this.state = 0 /* PersistentStreamState.Initial */ , this.start();\n }));\n }\n // Visible for tests\n I_(e) {\n // In theory the stream could close cleanly, however, in our current model\n // we never expect this to happen because if we stop a stream ourselves,\n // this callback will never be called. To prevent cases where we retry\n // without a backoff accidentally, we set the stream to error in all cases.\n return __PRIVATE_logDebug(\"PersistentStream\", `close with error: ${e}`), this.stream = null, \n this.close(4 /* PersistentStreamState.Error */ , e);\n }\n /**\n * Returns a \"dispatcher\" function that dispatches operations onto the\n * AsyncQueue but only runs them if closeCount remains unchanged. This allows\n * us to turn auth / stream callbacks into no-ops if the stream is closed /\n * re-opened, etc.\n */ h_(e) {\n return t => {\n this.ui.enqueueAndForget((() => this.Yo === e ? t() : (__PRIVATE_logDebug(\"PersistentStream\", \"stream callback skipped by getCloseGuardedDispatcher.\"), \n Promise.resolve())));\n };\n }\n}\n\n/**\n * A PersistentStream that implements the Listen RPC.\n *\n * Once the Listen stream has called the onOpen() listener, any number of\n * listen() and unlisten() calls can be made to control what changes will be\n * sent from the server for ListenResponses.\n */ class __PRIVATE_PersistentListenStream extends __PRIVATE_PersistentStream {\n constructor(e, t, n, r, i, s) {\n super(e, \"listen_stream_connection_backoff\" /* TimerId.ListenStreamConnectionBackoff */ , \"listen_stream_idle\" /* TimerId.ListenStreamIdle */ , \"health_check_timeout\" /* TimerId.HealthCheckTimeout */ , t, n, r, s), \n this.serializer = i;\n }\n T_(e, t) {\n return this.connection.Bo(\"Listen\", e, t);\n }\n E_(e) {\n return this.onNext(e);\n }\n onNext(e) {\n // A successful response means the stream is healthy\n this.t_.reset();\n const t = __PRIVATE_fromWatchChange(this.serializer, e), n = function __PRIVATE_versionFromListenResponse(e) {\n // We have only reached a consistent snapshot for the entire stream if there\n // is a read_time set and it applies to all targets (i.e. the list of\n // targets is empty). The backend is guaranteed to send such responses.\n if (!(\"targetChange\" in e)) return SnapshotVersion.min();\n const t = e.targetChange;\n return t.targetIds && t.targetIds.length ? SnapshotVersion.min() : t.readTime ? __PRIVATE_fromVersion(t.readTime) : SnapshotVersion.min();\n }(e);\n return this.listener.d_(t, n);\n }\n /**\n * Registers interest in the results of the given target. If the target\n * includes a resumeToken it will be included in the request. Results that\n * affect the target will be streamed back as WatchChange messages that\n * reference the targetId.\n */ A_(e) {\n const t = {};\n t.database = __PRIVATE_getEncodedDatabaseId(this.serializer), t.addTarget = function __PRIVATE_toTarget(e, t) {\n let n;\n const r = t.target;\n if (n = __PRIVATE_targetIsDocumentTarget(r) ? {\n documents: __PRIVATE_toDocumentsTarget(e, r)\n } : {\n query: __PRIVATE_toQueryTarget(e, r)._t\n }, n.targetId = t.targetId, t.resumeToken.approximateByteSize() > 0) {\n n.resumeToken = __PRIVATE_toBytes(e, t.resumeToken);\n const r = __PRIVATE_toInt32Proto(e, t.expectedCount);\n null !== r && (n.expectedCount = r);\n } else if (t.snapshotVersion.compareTo(SnapshotVersion.min()) > 0) {\n // TODO(wuandy): Consider removing above check because it is most likely true.\n // Right now, many tests depend on this behaviour though (leaving min() out\n // of serialization).\n n.readTime = toTimestamp(e, t.snapshotVersion.toTimestamp());\n const r = __PRIVATE_toInt32Proto(e, t.expectedCount);\n null !== r && (n.expectedCount = r);\n }\n return n;\n }(this.serializer, e);\n const n = __PRIVATE_toListenRequestLabels(this.serializer, e);\n n && (t.labels = n), this.a_(t);\n }\n /**\n * Unregisters interest in the results of the target associated with the\n * given targetId.\n */ R_(e) {\n const t = {};\n t.database = __PRIVATE_getEncodedDatabaseId(this.serializer), t.removeTarget = e, \n this.a_(t);\n }\n}\n\n/**\n * A Stream that implements the Write RPC.\n *\n * The Write RPC requires the caller to maintain special streamToken\n * state in between calls, to help the server understand which responses the\n * client has processed by the time the next request is made. Every response\n * will contain a streamToken; this value must be passed to the next\n * request.\n *\n * After calling start() on this stream, the next request must be a handshake,\n * containing whatever streamToken is on hand. Once a response to this\n * request is received, all pending mutations may be submitted. When\n * submitting multiple batches of mutations at the same time, it's\n * okay to use the same streamToken for the calls to writeMutations.\n *\n * TODO(b/33271235): Use proto types\n */ class __PRIVATE_PersistentWriteStream extends __PRIVATE_PersistentStream {\n constructor(e, t, n, r, i, s) {\n super(e, \"write_stream_connection_backoff\" /* TimerId.WriteStreamConnectionBackoff */ , \"write_stream_idle\" /* TimerId.WriteStreamIdle */ , \"health_check_timeout\" /* TimerId.HealthCheckTimeout */ , t, n, r, s), \n this.serializer = i;\n }\n /**\n * Tracks whether or not a handshake has been successfully exchanged and\n * the stream is ready to accept mutations.\n */ get V_() {\n return this.e_ > 0;\n }\n // Override of PersistentStream.start\n start() {\n this.lastStreamToken = void 0, super.start();\n }\n l_() {\n this.V_ && this.m_([]);\n }\n T_(e, t) {\n return this.connection.Bo(\"Write\", e, t);\n }\n E_(e) {\n // Always capture the last stream token.\n return __PRIVATE_hardAssert(!!e.streamToken), this.lastStreamToken = e.streamToken, \n // The first response is always the handshake response\n __PRIVATE_hardAssert(!e.writeResults || 0 === e.writeResults.length), this.listener.f_();\n }\n onNext(e) {\n // Always capture the last stream token.\n __PRIVATE_hardAssert(!!e.streamToken), this.lastStreamToken = e.streamToken, \n // A successful first write response means the stream is healthy,\n // Note, that we could consider a successful handshake healthy, however,\n // the write itself might be causing an error we want to back off from.\n this.t_.reset();\n const t = __PRIVATE_fromWriteResults(e.writeResults, e.commitTime), n = __PRIVATE_fromVersion(e.commitTime);\n return this.listener.g_(n, t);\n }\n /**\n * Sends an initial streamToken to the server, performing the handshake\n * required to make the StreamingWrite RPC work. Subsequent\n * calls should wait until onHandshakeComplete was called.\n */ p_() {\n // TODO(dimond): Support stream resumption. We intentionally do not set the\n // stream token on the handshake, ignoring any stream token we might have.\n const e = {};\n e.database = __PRIVATE_getEncodedDatabaseId(this.serializer), this.a_(e);\n }\n /** Sends a group of mutations to the Firestore backend to apply. */ m_(e) {\n const t = {\n streamToken: this.lastStreamToken,\n writes: e.map((e => toMutation(this.serializer, e)))\n };\n this.a_(t);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Datastore and its related methods are a wrapper around the external Google\n * Cloud Datastore grpc API, which provides an interface that is more convenient\n * for the rest of the client SDK architecture to consume.\n */\n/**\n * An implementation of Datastore that exposes additional state for internal\n * consumption.\n */\nclass __PRIVATE_DatastoreImpl extends class Datastore {} {\n constructor(e, t, n, r) {\n super(), this.authCredentials = e, this.appCheckCredentials = t, this.connection = n, \n this.serializer = r, this.y_ = !1;\n }\n w_() {\n if (this.y_) throw new FirestoreError(D.FAILED_PRECONDITION, \"The client has already been terminated.\");\n }\n /** Invokes the provided RPC with auth and AppCheck tokens. */ Mo(e, t, n, r) {\n return this.w_(), Promise.all([ this.authCredentials.getToken(), this.appCheckCredentials.getToken() ]).then((([i, s]) => this.connection.Mo(e, __PRIVATE_toResourcePath(t, n), r, i, s))).catch((e => {\n throw \"FirebaseError\" === e.name ? (e.code === D.UNAUTHENTICATED && (this.authCredentials.invalidateToken(), \n this.appCheckCredentials.invalidateToken()), e) : new FirestoreError(D.UNKNOWN, e.toString());\n }));\n }\n /** Invokes the provided RPC with streamed results with auth and AppCheck tokens. */ Lo(e, t, n, r, i) {\n return this.w_(), Promise.all([ this.authCredentials.getToken(), this.appCheckCredentials.getToken() ]).then((([s, o]) => this.connection.Lo(e, __PRIVATE_toResourcePath(t, n), r, s, o, i))).catch((e => {\n throw \"FirebaseError\" === e.name ? (e.code === D.UNAUTHENTICATED && (this.authCredentials.invalidateToken(), \n this.appCheckCredentials.invalidateToken()), e) : new FirestoreError(D.UNKNOWN, e.toString());\n }));\n }\n terminate() {\n this.y_ = !0, this.connection.terminate();\n }\n}\n\n// TODO(firestorexp): Make sure there is only one Datastore instance per\n// firestore-exp client.\n/**\n * A component used by the RemoteStore to track the OnlineState (that is,\n * whether or not the client as a whole should be considered to be online or\n * offline), implementing the appropriate heuristics.\n *\n * In particular, when the client is trying to connect to the backend, we\n * allow up to MAX_WATCH_STREAM_FAILURES within ONLINE_STATE_TIMEOUT_MS for\n * a connection to succeed. If we have too many failures or the timeout elapses,\n * then we set the OnlineState to Offline, and the client will behave as if\n * it is offline (get()s will return cached data, etc.).\n */\nclass __PRIVATE_OnlineStateTracker {\n constructor(e, t) {\n this.asyncQueue = e, this.onlineStateHandler = t, \n /** The current OnlineState. */\n this.state = \"Unknown\" /* OnlineState.Unknown */ , \n /**\n * A count of consecutive failures to open the stream. If it reaches the\n * maximum defined by MAX_WATCH_STREAM_FAILURES, we'll set the OnlineState to\n * Offline.\n */\n this.S_ = 0, \n /**\n * A timer that elapses after ONLINE_STATE_TIMEOUT_MS, at which point we\n * transition from OnlineState.Unknown to OnlineState.Offline without waiting\n * for the stream to actually fail (MAX_WATCH_STREAM_FAILURES times).\n */\n this.b_ = null, \n /**\n * Whether the client should log a warning message if it fails to connect to\n * the backend (initially true, cleared after a successful stream, or if we've\n * logged the message already).\n */\n this.D_ = !0;\n }\n /**\n * Called by RemoteStore when a watch stream is started (including on each\n * backoff attempt).\n *\n * If this is the first attempt, it sets the OnlineState to Unknown and starts\n * the onlineStateTimer.\n */ v_() {\n 0 === this.S_ && (this.C_(\"Unknown\" /* OnlineState.Unknown */), this.b_ = this.asyncQueue.enqueueAfterDelay(\"online_state_timeout\" /* TimerId.OnlineStateTimeout */ , 1e4, (() => (this.b_ = null, \n this.F_(\"Backend didn't respond within 10 seconds.\"), this.C_(\"Offline\" /* OnlineState.Offline */), \n Promise.resolve()))));\n }\n /**\n * Updates our OnlineState as appropriate after the watch stream reports a\n * failure. The first failure moves us to the 'Unknown' state. We then may\n * allow multiple failures (based on MAX_WATCH_STREAM_FAILURES) before we\n * actually transition to the 'Offline' state.\n */ M_(e) {\n \"Online\" /* OnlineState.Online */ === this.state ? this.C_(\"Unknown\" /* OnlineState.Unknown */) : (this.S_++, \n this.S_ >= 1 && (this.x_(), this.F_(`Connection failed 1 times. Most recent error: ${e.toString()}`), \n this.C_(\"Offline\" /* OnlineState.Offline */)));\n }\n /**\n * Explicitly sets the OnlineState to the specified state.\n *\n * Note that this resets our timers / failure counters, etc. used by our\n * Offline heuristics, so must not be used in place of\n * handleWatchStreamStart() and handleWatchStreamFailure().\n */ set(e) {\n this.x_(), this.S_ = 0, \"Online\" /* OnlineState.Online */ === e && (\n // We've connected to watch at least once. Don't warn the developer\n // about being offline going forward.\n this.D_ = !1), this.C_(e);\n }\n C_(e) {\n e !== this.state && (this.state = e, this.onlineStateHandler(e));\n }\n F_(e) {\n const t = `Could not reach Cloud Firestore backend. ${e}\\nThis typically indicates that your device does not have a healthy Internet connection at the moment. The client will operate in offline mode until it is able to successfully connect to the backend.`;\n this.D_ ? (__PRIVATE_logError(t), this.D_ = !1) : __PRIVATE_logDebug(\"OnlineStateTracker\", t);\n }\n x_() {\n null !== this.b_ && (this.b_.cancel(), this.b_ = null);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_RemoteStoreImpl {\n constructor(\n /**\n * The local store, used to fill the write pipeline with outbound mutations.\n */\n e, \n /** The client-side proxy for interacting with the backend. */\n t, n, r, i) {\n this.localStore = e, this.datastore = t, this.asyncQueue = n, this.remoteSyncer = {}, \n /**\n * A list of up to MAX_PENDING_WRITES writes that we have fetched from the\n * LocalStore via fillWritePipeline() and have or will send to the write\n * stream.\n *\n * Whenever writePipeline.length > 0 the RemoteStore will attempt to start or\n * restart the write stream. When the stream is established the writes in the\n * pipeline will be sent in order.\n *\n * Writes remain in writePipeline until they are acknowledged by the backend\n * and thus will automatically be re-sent if the stream is interrupted /\n * restarted before they're acknowledged.\n *\n * Write responses from the backend are linked to their originating request\n * purely based on order, and so we can just shift() writes from the front of\n * the writePipeline as we receive responses.\n */\n this.O_ = [], \n /**\n * A mapping of watched targets that the client cares about tracking and the\n * user has explicitly called a 'listen' for this target.\n *\n * These targets may or may not have been sent to or acknowledged by the\n * server. On re-establishing the listen stream, these targets should be sent\n * to the server. The targets removed with unlistens are removed eagerly\n * without waiting for confirmation from the listen stream.\n */\n this.N_ = new Map, \n /**\n * A set of reasons for why the RemoteStore may be offline. If empty, the\n * RemoteStore may start its network connections.\n */\n this.L_ = new Set, \n /**\n * Event handlers that get called when the network is disabled or enabled.\n *\n * PORTING NOTE: These functions are used on the Web client to create the\n * underlying streams (to support tree-shakeable streams). On Android and iOS,\n * the streams are created during construction of RemoteStore.\n */\n this.B_ = [], this.k_ = i, this.k_._o((e => {\n n.enqueueAndForget((async () => {\n // Porting Note: Unlike iOS, `restartNetwork()` is called even when the\n // network becomes unreachable as we don't have any other way to tear\n // down our streams.\n __PRIVATE_canUseNetwork(this) && (__PRIVATE_logDebug(\"RemoteStore\", \"Restarting streams for network reachability change.\"), \n await async function __PRIVATE_restartNetwork(e) {\n const t = __PRIVATE_debugCast(e);\n t.L_.add(4 /* OfflineCause.ConnectivityChange */), await __PRIVATE_disableNetworkInternal(t), \n t.q_.set(\"Unknown\" /* OnlineState.Unknown */), t.L_.delete(4 /* OfflineCause.ConnectivityChange */), \n await __PRIVATE_enableNetworkInternal(t);\n }(this));\n }));\n })), this.q_ = new __PRIVATE_OnlineStateTracker(n, r);\n }\n}\n\nasync function __PRIVATE_enableNetworkInternal(e) {\n if (__PRIVATE_canUseNetwork(e)) for (const t of e.B_) await t(/* enabled= */ !0);\n}\n\n/**\n * Temporarily disables the network. The network can be re-enabled using\n * enableNetwork().\n */ async function __PRIVATE_disableNetworkInternal(e) {\n for (const t of e.B_) await t(/* enabled= */ !1);\n}\n\n/**\n * Starts new listen for the given target. Uses resume token if provided. It\n * is a no-op if the target of given `TargetData` is already being listened to.\n */\nfunction __PRIVATE_remoteStoreListen(e, t) {\n const n = __PRIVATE_debugCast(e);\n n.N_.has(t.targetId) || (\n // Mark this as something the client is currently listening for.\n n.N_.set(t.targetId, t), __PRIVATE_shouldStartWatchStream(n) ? \n // The listen will be sent in onWatchStreamOpen\n __PRIVATE_startWatchStream(n) : __PRIVATE_ensureWatchStream(n).r_() && __PRIVATE_sendWatchRequest(n, t));\n}\n\n/**\n * Removes the listen from server. It is a no-op if the given target id is\n * not being listened to.\n */ function __PRIVATE_remoteStoreUnlisten(e, t) {\n const n = __PRIVATE_debugCast(e), r = __PRIVATE_ensureWatchStream(n);\n n.N_.delete(t), r.r_() && __PRIVATE_sendUnwatchRequest(n, t), 0 === n.N_.size && (r.r_() ? r.o_() : __PRIVATE_canUseNetwork(n) && \n // Revert to OnlineState.Unknown if the watch stream is not open and we\n // have no listeners, since without any listens to send we cannot\n // confirm if the stream is healthy and upgrade to OnlineState.Online.\n n.q_.set(\"Unknown\" /* OnlineState.Unknown */));\n}\n\n/**\n * We need to increment the expected number of pending responses we're due\n * from watch so we wait for the ack to process any messages from this target.\n */ function __PRIVATE_sendWatchRequest(e, t) {\n if (e.Q_.xe(t.targetId), t.resumeToken.approximateByteSize() > 0 || t.snapshotVersion.compareTo(SnapshotVersion.min()) > 0) {\n const n = e.remoteSyncer.getRemoteKeysForTarget(t.targetId).size;\n t = t.withExpectedCount(n);\n }\n __PRIVATE_ensureWatchStream(e).A_(t);\n}\n\n/**\n * We need to increment the expected number of pending responses we're due\n * from watch so we wait for the removal on the server before we process any\n * messages from this target.\n */ function __PRIVATE_sendUnwatchRequest(e, t) {\n e.Q_.xe(t), __PRIVATE_ensureWatchStream(e).R_(t);\n}\n\nfunction __PRIVATE_startWatchStream(e) {\n e.Q_ = new __PRIVATE_WatchChangeAggregator({\n getRemoteKeysForTarget: t => e.remoteSyncer.getRemoteKeysForTarget(t),\n ot: t => e.N_.get(t) || null,\n tt: () => e.datastore.serializer.databaseId\n }), __PRIVATE_ensureWatchStream(e).start(), e.q_.v_();\n}\n\n/**\n * Returns whether the watch stream should be started because it's necessary\n * and has not yet been started.\n */ function __PRIVATE_shouldStartWatchStream(e) {\n return __PRIVATE_canUseNetwork(e) && !__PRIVATE_ensureWatchStream(e).n_() && e.N_.size > 0;\n}\n\nfunction __PRIVATE_canUseNetwork(e) {\n return 0 === __PRIVATE_debugCast(e).L_.size;\n}\n\nfunction __PRIVATE_cleanUpWatchStreamState(e) {\n e.Q_ = void 0;\n}\n\nasync function __PRIVATE_onWatchStreamConnected(e) {\n // Mark the client as online since we got a \"connected\" notification.\n e.q_.set(\"Online\" /* OnlineState.Online */);\n}\n\nasync function __PRIVATE_onWatchStreamOpen(e) {\n e.N_.forEach(((t, n) => {\n __PRIVATE_sendWatchRequest(e, t);\n }));\n}\n\nasync function __PRIVATE_onWatchStreamClose(e, t) {\n __PRIVATE_cleanUpWatchStreamState(e), \n // If we still need the watch stream, retry the connection.\n __PRIVATE_shouldStartWatchStream(e) ? (e.q_.M_(t), __PRIVATE_startWatchStream(e)) : \n // No need to restart watch stream because there are no active targets.\n // The online state is set to unknown because there is no active attempt\n // at establishing a connection\n e.q_.set(\"Unknown\" /* OnlineState.Unknown */);\n}\n\nasync function __PRIVATE_onWatchStreamChange(e, t, n) {\n if (\n // Mark the client as online since we got a message from the server\n e.q_.set(\"Online\" /* OnlineState.Online */), t instanceof __PRIVATE_WatchTargetChange && 2 /* WatchTargetChangeState.Removed */ === t.state && t.cause) \n // There was an error on a target, don't wait for a consistent snapshot\n // to raise events\n try {\n await \n /** Handles an error on a target */\n async function __PRIVATE_handleTargetError(e, t) {\n const n = t.cause;\n for (const r of t.targetIds) \n // A watched target might have been removed already.\n e.N_.has(r) && (await e.remoteSyncer.rejectListen(r, n), e.N_.delete(r), e.Q_.removeTarget(r));\n }\n /**\n * Attempts to fill our write pipeline with writes from the LocalStore.\n *\n * Called internally to bootstrap or refill the write pipeline and by\n * SyncEngine whenever there are new mutations to process.\n *\n * Starts the write stream if necessary.\n */ (e, t);\n } catch (n) {\n __PRIVATE_logDebug(\"RemoteStore\", \"Failed to remove targets %s: %s \", t.targetIds.join(\",\"), n), \n await __PRIVATE_disableNetworkUntilRecovery(e, n);\n } else if (t instanceof __PRIVATE_DocumentWatchChange ? e.Q_.Ke(t) : t instanceof __PRIVATE_ExistenceFilterChange ? e.Q_.He(t) : e.Q_.We(t), \n !n.isEqual(SnapshotVersion.min())) try {\n const t = await __PRIVATE_localStoreGetLastRemoteSnapshotVersion(e.localStore);\n n.compareTo(t) >= 0 && \n // We have received a target change with a global snapshot if the snapshot\n // version is not equal to SnapshotVersion.min().\n await \n /**\n * Takes a batch of changes from the Datastore, repackages them as a\n * RemoteEvent, and passes that on to the listener, which is typically the\n * SyncEngine.\n */\n function __PRIVATE_raiseWatchSnapshot(e, t) {\n const n = e.Q_.rt(t);\n // Update in-memory resume tokens. LocalStore will update the\n // persistent view of these when applying the completed RemoteEvent.\n return n.targetChanges.forEach(((n, r) => {\n if (n.resumeToken.approximateByteSize() > 0) {\n const i = e.N_.get(r);\n // A watched target might have been removed already.\n i && e.N_.set(r, i.withResumeToken(n.resumeToken, t));\n }\n })), \n // Re-establish listens for the targets that have been invalidated by\n // existence filter mismatches.\n n.targetMismatches.forEach(((t, n) => {\n const r = e.N_.get(t);\n if (!r) \n // A watched target might have been removed already.\n return;\n // Clear the resume token for the target, since we're in a known mismatch\n // state.\n e.N_.set(t, r.withResumeToken(ByteString.EMPTY_BYTE_STRING, r.snapshotVersion)), \n // Cause a hard reset by unwatching and rewatching immediately, but\n // deliberately don't send a resume token so that we get a full update.\n __PRIVATE_sendUnwatchRequest(e, t);\n // Mark the target we send as being on behalf of an existence filter\n // mismatch, but don't actually retain that in listenTargets. This ensures\n // that we flag the first re-listen this way without impacting future\n // listens of this target (that might happen e.g. on reconnect).\n const i = new TargetData(r.target, t, n, r.sequenceNumber);\n __PRIVATE_sendWatchRequest(e, i);\n })), e.remoteSyncer.applyRemoteEvent(n);\n }(e, n);\n } catch (t) {\n __PRIVATE_logDebug(\"RemoteStore\", \"Failed to raise snapshot:\", t), await __PRIVATE_disableNetworkUntilRecovery(e, t);\n }\n}\n\n/**\n * Recovery logic for IndexedDB errors that takes the network offline until\n * `op` succeeds. Retries are scheduled with backoff using\n * `enqueueRetryable()`. If `op()` is not provided, IndexedDB access is\n * validated via a generic operation.\n *\n * The returned Promise is resolved once the network is disabled and before\n * any retry attempt.\n */ async function __PRIVATE_disableNetworkUntilRecovery(e, t, n) {\n if (!__PRIVATE_isIndexedDbTransactionError(t)) throw t;\n e.L_.add(1 /* OfflineCause.IndexedDbFailed */), \n // Disable network and raise offline snapshots\n await __PRIVATE_disableNetworkInternal(e), e.q_.set(\"Offline\" /* OnlineState.Offline */), \n n || (\n // Use a simple read operation to determine if IndexedDB recovered.\n // Ideally, we would expose a health check directly on SimpleDb, but\n // RemoteStore only has access to persistence through LocalStore.\n n = () => __PRIVATE_localStoreGetLastRemoteSnapshotVersion(e.localStore)), \n // Probe IndexedDB periodically and re-enable network\n e.asyncQueue.enqueueRetryable((async () => {\n __PRIVATE_logDebug(\"RemoteStore\", \"Retrying IndexedDB access\"), await n(), e.L_.delete(1 /* OfflineCause.IndexedDbFailed */), \n await __PRIVATE_enableNetworkInternal(e);\n }));\n}\n\n/**\n * Executes `op`. If `op` fails, takes the network offline until `op`\n * succeeds. Returns after the first attempt.\n */ function __PRIVATE_executeWithRecovery(e, t) {\n return t().catch((n => __PRIVATE_disableNetworkUntilRecovery(e, n, t)));\n}\n\nasync function __PRIVATE_fillWritePipeline(e) {\n const t = __PRIVATE_debugCast(e), n = __PRIVATE_ensureWriteStream(t);\n let r = t.O_.length > 0 ? t.O_[t.O_.length - 1].batchId : -1;\n for (;__PRIVATE_canAddToWritePipeline(t); ) try {\n const e = await __PRIVATE_localStoreGetNextMutationBatch(t.localStore, r);\n if (null === e) {\n 0 === t.O_.length && n.o_();\n break;\n }\n r = e.batchId, __PRIVATE_addToWritePipeline(t, e);\n } catch (e) {\n await __PRIVATE_disableNetworkUntilRecovery(t, e);\n }\n __PRIVATE_shouldStartWriteStream(t) && __PRIVATE_startWriteStream(t);\n}\n\n/**\n * Returns true if we can add to the write pipeline (i.e. the network is\n * enabled and the write pipeline is not full).\n */ function __PRIVATE_canAddToWritePipeline(e) {\n return __PRIVATE_canUseNetwork(e) && e.O_.length < 10;\n}\n\n/**\n * Queues additional writes to be sent to the write stream, sending them\n * immediately if the write stream is established.\n */ function __PRIVATE_addToWritePipeline(e, t) {\n e.O_.push(t);\n const n = __PRIVATE_ensureWriteStream(e);\n n.r_() && n.V_ && n.m_(t.mutations);\n}\n\nfunction __PRIVATE_shouldStartWriteStream(e) {\n return __PRIVATE_canUseNetwork(e) && !__PRIVATE_ensureWriteStream(e).n_() && e.O_.length > 0;\n}\n\nfunction __PRIVATE_startWriteStream(e) {\n __PRIVATE_ensureWriteStream(e).start();\n}\n\nasync function __PRIVATE_onWriteStreamOpen(e) {\n __PRIVATE_ensureWriteStream(e).p_();\n}\n\nasync function __PRIVATE_onWriteHandshakeComplete(e) {\n const t = __PRIVATE_ensureWriteStream(e);\n // Send the write pipeline now that the stream is established.\n for (const n of e.O_) t.m_(n.mutations);\n}\n\nasync function __PRIVATE_onMutationResult(e, t, n) {\n const r = e.O_.shift(), i = MutationBatchResult.from(r, t, n);\n await __PRIVATE_executeWithRecovery(e, (() => e.remoteSyncer.applySuccessfulWrite(i))), \n // It's possible that with the completion of this mutation another\n // slot has freed up.\n await __PRIVATE_fillWritePipeline(e);\n}\n\nasync function __PRIVATE_onWriteStreamClose(e, t) {\n // If the write stream closed after the write handshake completes, a write\n // operation failed and we fail the pending operation.\n t && __PRIVATE_ensureWriteStream(e).V_ && \n // This error affects the actual write.\n await async function __PRIVATE_handleWriteError(e, t) {\n // Only handle permanent errors here. If it's transient, just let the retry\n // logic kick in.\n if (function __PRIVATE_isPermanentWriteError(e) {\n return __PRIVATE_isPermanentError(e) && e !== D.ABORTED;\n }(t.code)) {\n // This was a permanent error, the request itself was the problem\n // so it's not going to succeed if we resend it.\n const n = e.O_.shift();\n // In this case it's also unlikely that the server itself is melting\n // down -- this was just a bad request so inhibit backoff on the next\n // restart.\n __PRIVATE_ensureWriteStream(e).s_(), await __PRIVATE_executeWithRecovery(e, (() => e.remoteSyncer.rejectFailedWrite(n.batchId, t))), \n // It's possible that with the completion of this mutation\n // another slot has freed up.\n await __PRIVATE_fillWritePipeline(e);\n }\n }(e, t), \n // The write stream might have been started by refilling the write\n // pipeline for failed writes\n __PRIVATE_shouldStartWriteStream(e) && __PRIVATE_startWriteStream(e);\n}\n\nasync function __PRIVATE_remoteStoreHandleCredentialChange(e, t) {\n const n = __PRIVATE_debugCast(e);\n n.asyncQueue.verifyOperationInProgress(), __PRIVATE_logDebug(\"RemoteStore\", \"RemoteStore received new credentials\");\n const r = __PRIVATE_canUseNetwork(n);\n // Tear down and re-create our network streams. This will ensure we get a\n // fresh auth token for the new user and re-fill the write pipeline with\n // new mutations from the LocalStore (since mutations are per-user).\n n.L_.add(3 /* OfflineCause.CredentialChange */), await __PRIVATE_disableNetworkInternal(n), \n r && \n // Don't set the network status to Unknown if we are offline.\n n.q_.set(\"Unknown\" /* OnlineState.Unknown */), await n.remoteSyncer.handleCredentialChange(t), \n n.L_.delete(3 /* OfflineCause.CredentialChange */), await __PRIVATE_enableNetworkInternal(n);\n}\n\n/**\n * Toggles the network state when the client gains or loses its primary lease.\n */ async function __PRIVATE_remoteStoreApplyPrimaryState(e, t) {\n const n = __PRIVATE_debugCast(e);\n t ? (n.L_.delete(2 /* OfflineCause.IsSecondary */), await __PRIVATE_enableNetworkInternal(n)) : t || (n.L_.add(2 /* OfflineCause.IsSecondary */), \n await __PRIVATE_disableNetworkInternal(n), n.q_.set(\"Unknown\" /* OnlineState.Unknown */));\n}\n\n/**\n * If not yet initialized, registers the WatchStream and its network state\n * callback with `remoteStoreImpl`. Returns the existing stream if one is\n * already available.\n *\n * PORTING NOTE: On iOS and Android, the WatchStream gets registered on startup.\n * This is not done on Web to allow it to be tree-shaken.\n */ function __PRIVATE_ensureWatchStream(e) {\n return e.K_ || (\n // Create stream (but note that it is not started yet).\n e.K_ = function __PRIVATE_newPersistentWatchStream(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n return r.w_(), new __PRIVATE_PersistentListenStream(t, r.connection, r.authCredentials, r.appCheckCredentials, r.serializer, n);\n }\n /**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ (e.datastore, e.asyncQueue, {\n Eo: __PRIVATE_onWatchStreamConnected.bind(null, e),\n Ro: __PRIVATE_onWatchStreamOpen.bind(null, e),\n mo: __PRIVATE_onWatchStreamClose.bind(null, e),\n d_: __PRIVATE_onWatchStreamChange.bind(null, e)\n }), e.B_.push((async t => {\n t ? (e.K_.s_(), __PRIVATE_shouldStartWatchStream(e) ? __PRIVATE_startWatchStream(e) : e.q_.set(\"Unknown\" /* OnlineState.Unknown */)) : (await e.K_.stop(), \n __PRIVATE_cleanUpWatchStreamState(e));\n }))), e.K_;\n}\n\n/**\n * If not yet initialized, registers the WriteStream and its network state\n * callback with `remoteStoreImpl`. Returns the existing stream if one is\n * already available.\n *\n * PORTING NOTE: On iOS and Android, the WriteStream gets registered on startup.\n * This is not done on Web to allow it to be tree-shaken.\n */ function __PRIVATE_ensureWriteStream(e) {\n return e.U_ || (\n // Create stream (but note that it is not started yet).\n e.U_ = function __PRIVATE_newPersistentWriteStream(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n return r.w_(), new __PRIVATE_PersistentWriteStream(t, r.connection, r.authCredentials, r.appCheckCredentials, r.serializer, n);\n }(e.datastore, e.asyncQueue, {\n Eo: () => Promise.resolve(),\n Ro: __PRIVATE_onWriteStreamOpen.bind(null, e),\n mo: __PRIVATE_onWriteStreamClose.bind(null, e),\n f_: __PRIVATE_onWriteHandshakeComplete.bind(null, e),\n g_: __PRIVATE_onMutationResult.bind(null, e)\n }), e.B_.push((async t => {\n t ? (e.U_.s_(), \n // This will start the write stream if necessary.\n await __PRIVATE_fillWritePipeline(e)) : (await e.U_.stop(), e.O_.length > 0 && (__PRIVATE_logDebug(\"RemoteStore\", `Stopping write stream with ${e.O_.length} pending writes`), \n e.O_ = []));\n }))), e.U_;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents an operation scheduled to be run in the future on an AsyncQueue.\n *\n * It is created via DelayedOperation.createAndSchedule().\n *\n * Supports cancellation (via cancel()) and early execution (via skipDelay()).\n *\n * Note: We implement `PromiseLike` instead of `Promise`, as the `Promise` type\n * in newer versions of TypeScript defines `finally`, which is not available in\n * IE.\n */\nclass DelayedOperation {\n constructor(e, t, n, r, i) {\n this.asyncQueue = e, this.timerId = t, this.targetTimeMs = n, this.op = r, this.removalCallback = i, \n this.deferred = new __PRIVATE_Deferred, this.then = this.deferred.promise.then.bind(this.deferred.promise), \n // It's normal for the deferred promise to be canceled (due to cancellation)\n // and so we attach a dummy catch callback to avoid\n // 'UnhandledPromiseRejectionWarning' log spam.\n this.deferred.promise.catch((e => {}));\n }\n get promise() {\n return this.deferred.promise;\n }\n /**\n * Creates and returns a DelayedOperation that has been scheduled to be\n * executed on the provided asyncQueue after the provided delayMs.\n *\n * @param asyncQueue - The queue to schedule the operation on.\n * @param id - A Timer ID identifying the type of operation this is.\n * @param delayMs - The delay (ms) before the operation should be scheduled.\n * @param op - The operation to run.\n * @param removalCallback - A callback to be called synchronously once the\n * operation is executed or canceled, notifying the AsyncQueue to remove it\n * from its delayedOperations list.\n * PORTING NOTE: This exists to prevent making removeDelayedOperation() and\n * the DelayedOperation class public.\n */ static createAndSchedule(e, t, n, r, i) {\n const s = Date.now() + n, o = new DelayedOperation(e, t, s, r, i);\n return o.start(n), o;\n }\n /**\n * Starts the timer. This is called immediately after construction by\n * createAndSchedule().\n */ start(e) {\n this.timerHandle = setTimeout((() => this.handleDelayElapsed()), e);\n }\n /**\n * Queues the operation to run immediately (if it hasn't already been run or\n * canceled).\n */ skipDelay() {\n return this.handleDelayElapsed();\n }\n /**\n * Cancels the operation if it hasn't already been executed or canceled. The\n * promise will be rejected.\n *\n * As long as the operation has not yet been run, calling cancel() provides a\n * guarantee that the operation will not be run.\n */ cancel(e) {\n null !== this.timerHandle && (this.clearTimeout(), this.deferred.reject(new FirestoreError(D.CANCELLED, \"Operation cancelled\" + (e ? \": \" + e : \"\"))));\n }\n handleDelayElapsed() {\n this.asyncQueue.enqueueAndForget((() => null !== this.timerHandle ? (this.clearTimeout(), \n this.op().then((e => this.deferred.resolve(e)))) : Promise.resolve()));\n }\n clearTimeout() {\n null !== this.timerHandle && (this.removalCallback(this), clearTimeout(this.timerHandle), \n this.timerHandle = null);\n }\n}\n\n/**\n * Returns a FirestoreError that can be surfaced to the user if the provided\n * error is an IndexedDbTransactionError. Re-throws the error otherwise.\n */ function __PRIVATE_wrapInUserErrorIfRecoverable(e, t) {\n if (__PRIVATE_logError(\"AsyncQueue\", `${t}: ${e}`), __PRIVATE_isIndexedDbTransactionError(e)) return new FirestoreError(D.UNAVAILABLE, `${t}: ${e}`);\n throw e;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * DocumentSet is an immutable (copy-on-write) collection that holds documents\n * in order specified by the provided comparator. We always add a document key\n * comparator on top of what is provided to guarantee document equality based on\n * the key.\n */ class DocumentSet {\n /** The default ordering is by key if the comparator is omitted */\n constructor(e) {\n // We are adding document key comparator to the end as it's the only\n // guaranteed unique property of a document.\n this.comparator = e ? (t, n) => e(t, n) || DocumentKey.comparator(t.key, n.key) : (e, t) => DocumentKey.comparator(e.key, t.key), \n this.keyedMap = documentMap(), this.sortedSet = new SortedMap(this.comparator);\n }\n /**\n * Returns an empty copy of the existing DocumentSet, using the same\n * comparator.\n */ static emptySet(e) {\n return new DocumentSet(e.comparator);\n }\n has(e) {\n return null != this.keyedMap.get(e);\n }\n get(e) {\n return this.keyedMap.get(e);\n }\n first() {\n return this.sortedSet.minKey();\n }\n last() {\n return this.sortedSet.maxKey();\n }\n isEmpty() {\n return this.sortedSet.isEmpty();\n }\n /**\n * Returns the index of the provided key in the document set, or -1 if the\n * document key is not present in the set;\n */ indexOf(e) {\n const t = this.keyedMap.get(e);\n return t ? this.sortedSet.indexOf(t) : -1;\n }\n get size() {\n return this.sortedSet.size;\n }\n /** Iterates documents in order defined by \"comparator\" */ forEach(e) {\n this.sortedSet.inorderTraversal(((t, n) => (e(t), !1)));\n }\n /** Inserts or updates a document with the same key */ add(e) {\n // First remove the element if we have it.\n const t = this.delete(e.key);\n return t.copy(t.keyedMap.insert(e.key, e), t.sortedSet.insert(e, null));\n }\n /** Deletes a document with a given key */ delete(e) {\n const t = this.get(e);\n return t ? this.copy(this.keyedMap.remove(e), this.sortedSet.remove(t)) : this;\n }\n isEqual(e) {\n if (!(e instanceof DocumentSet)) return !1;\n if (this.size !== e.size) return !1;\n const t = this.sortedSet.getIterator(), n = e.sortedSet.getIterator();\n for (;t.hasNext(); ) {\n const e = t.getNext().key, r = n.getNext().key;\n if (!e.isEqual(r)) return !1;\n }\n return !0;\n }\n toString() {\n const e = [];\n return this.forEach((t => {\n e.push(t.toString());\n })), 0 === e.length ? \"DocumentSet ()\" : \"DocumentSet (\\n \" + e.join(\" \\n\") + \"\\n)\";\n }\n copy(e, t) {\n const n = new DocumentSet;\n return n.comparator = this.comparator, n.keyedMap = e, n.sortedSet = t, n;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * DocumentChangeSet keeps track of a set of changes to docs in a query, merging\n * duplicate events for the same doc.\n */ class __PRIVATE_DocumentChangeSet {\n constructor() {\n this.W_ = new SortedMap(DocumentKey.comparator);\n }\n track(e) {\n const t = e.doc.key, n = this.W_.get(t);\n n ? \n // Merge the new change with the existing change.\n 0 /* ChangeType.Added */ !== e.type && 3 /* ChangeType.Metadata */ === n.type ? this.W_ = this.W_.insert(t, e) : 3 /* ChangeType.Metadata */ === e.type && 1 /* ChangeType.Removed */ !== n.type ? this.W_ = this.W_.insert(t, {\n type: n.type,\n doc: e.doc\n }) : 2 /* ChangeType.Modified */ === e.type && 2 /* ChangeType.Modified */ === n.type ? this.W_ = this.W_.insert(t, {\n type: 2 /* ChangeType.Modified */ ,\n doc: e.doc\n }) : 2 /* ChangeType.Modified */ === e.type && 0 /* ChangeType.Added */ === n.type ? this.W_ = this.W_.insert(t, {\n type: 0 /* ChangeType.Added */ ,\n doc: e.doc\n }) : 1 /* ChangeType.Removed */ === e.type && 0 /* ChangeType.Added */ === n.type ? this.W_ = this.W_.remove(t) : 1 /* ChangeType.Removed */ === e.type && 2 /* ChangeType.Modified */ === n.type ? this.W_ = this.W_.insert(t, {\n type: 1 /* ChangeType.Removed */ ,\n doc: n.doc\n }) : 0 /* ChangeType.Added */ === e.type && 1 /* ChangeType.Removed */ === n.type ? this.W_ = this.W_.insert(t, {\n type: 2 /* ChangeType.Modified */ ,\n doc: e.doc\n }) : \n // This includes these cases, which don't make sense:\n // Added->Added\n // Removed->Removed\n // Modified->Added\n // Removed->Modified\n // Metadata->Added\n // Removed->Metadata\n fail() : this.W_ = this.W_.insert(t, e);\n }\n G_() {\n const e = [];\n return this.W_.inorderTraversal(((t, n) => {\n e.push(n);\n })), e;\n }\n}\n\nclass ViewSnapshot {\n constructor(e, t, n, r, i, s, o, _, a) {\n this.query = e, this.docs = t, this.oldDocs = n, this.docChanges = r, this.mutatedKeys = i, \n this.fromCache = s, this.syncStateChanged = o, this.excludesMetadataChanges = _, \n this.hasCachedResults = a;\n }\n /** Returns a view snapshot as if all documents in the snapshot were added. */ static fromInitialDocuments(e, t, n, r, i) {\n const s = [];\n return t.forEach((e => {\n s.push({\n type: 0 /* ChangeType.Added */ ,\n doc: e\n });\n })), new ViewSnapshot(e, t, DocumentSet.emptySet(t), s, n, r, \n /* syncStateChanged= */ !0, \n /* excludesMetadataChanges= */ !1, i);\n }\n get hasPendingWrites() {\n return !this.mutatedKeys.isEmpty();\n }\n isEqual(e) {\n if (!(this.fromCache === e.fromCache && this.hasCachedResults === e.hasCachedResults && this.syncStateChanged === e.syncStateChanged && this.mutatedKeys.isEqual(e.mutatedKeys) && __PRIVATE_queryEquals(this.query, e.query) && this.docs.isEqual(e.docs) && this.oldDocs.isEqual(e.oldDocs))) return !1;\n const t = this.docChanges, n = e.docChanges;\n if (t.length !== n.length) return !1;\n for (let e = 0; e < t.length; e++) if (t[e].type !== n[e].type || !t[e].doc.isEqual(n[e].doc)) return !1;\n return !0;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Holds the listeners and the last received ViewSnapshot for a query being\n * tracked by EventManager.\n */ class __PRIVATE_QueryListenersInfo {\n constructor() {\n this.z_ = void 0, this.j_ = [];\n }\n // Helper methods that checks if the query has listeners that listening to remote store\n H_() {\n return this.j_.some((e => e.J_()));\n }\n}\n\nclass __PRIVATE_EventManagerImpl {\n constructor() {\n this.queries = __PRIVATE_newQueriesObjectMap(), this.onlineState = \"Unknown\" /* OnlineState.Unknown */ , \n this.Y_ = new Set;\n }\n terminate() {\n !function __PRIVATE_errorAllTargets(e, t) {\n const n = __PRIVATE_debugCast(e), r = n.queries;\n // Prevent further access by clearing ObjectMap.\n n.queries = __PRIVATE_newQueriesObjectMap(), r.forEach(((e, n) => {\n for (const e of n.j_) e.onError(t);\n }));\n }\n // Call all global snapshot listeners that have been set.\n (this, new FirestoreError(D.ABORTED, \"Firestore shutting down\"));\n }\n}\n\nfunction __PRIVATE_newQueriesObjectMap() {\n return new ObjectMap((e => __PRIVATE_canonifyQuery(e)), __PRIVATE_queryEquals);\n}\n\nasync function __PRIVATE_eventManagerListen(e, t) {\n const n = __PRIVATE_debugCast(e);\n let r = 3 /* ListenerSetupAction.NoActionRequired */;\n const i = t.query;\n let s = n.queries.get(i);\n s ? !s.H_() && t.J_() && (\n // Query has been listening to local cache, and tries to add a new listener sourced from watch.\n r = 2 /* ListenerSetupAction.RequireWatchConnectionOnly */) : (s = new __PRIVATE_QueryListenersInfo, \n r = t.J_() ? 0 /* ListenerSetupAction.InitializeLocalListenAndRequireWatchConnection */ : 1 /* ListenerSetupAction.InitializeLocalListenOnly */);\n try {\n switch (r) {\n case 0 /* ListenerSetupAction.InitializeLocalListenAndRequireWatchConnection */ :\n s.z_ = await n.onListen(i, \n /** enableRemoteListen= */ !0);\n break;\n\n case 1 /* ListenerSetupAction.InitializeLocalListenOnly */ :\n s.z_ = await n.onListen(i, \n /** enableRemoteListen= */ !1);\n break;\n\n case 2 /* ListenerSetupAction.RequireWatchConnectionOnly */ :\n await n.onFirstRemoteStoreListen(i);\n }\n } catch (e) {\n const n = __PRIVATE_wrapInUserErrorIfRecoverable(e, `Initialization of query '${__PRIVATE_stringifyQuery(t.query)}' failed`);\n return void t.onError(n);\n }\n if (n.queries.set(i, s), s.j_.push(t), \n // Run global snapshot listeners if a consistent snapshot has been emitted.\n t.Z_(n.onlineState), s.z_) {\n t.X_(s.z_) && __PRIVATE_raiseSnapshotsInSyncEvent(n);\n }\n}\n\nasync function __PRIVATE_eventManagerUnlisten(e, t) {\n const n = __PRIVATE_debugCast(e), r = t.query;\n let i = 3 /* ListenerRemovalAction.NoActionRequired */;\n const s = n.queries.get(r);\n if (s) {\n const e = s.j_.indexOf(t);\n e >= 0 && (s.j_.splice(e, 1), 0 === s.j_.length ? i = t.J_() ? 0 /* ListenerRemovalAction.TerminateLocalListenAndRequireWatchDisconnection */ : 1 /* ListenerRemovalAction.TerminateLocalListenOnly */ : !s.H_() && t.J_() && (\n // The removed listener is the last one that sourced from watch.\n i = 2 /* ListenerRemovalAction.RequireWatchDisconnectionOnly */));\n }\n switch (i) {\n case 0 /* ListenerRemovalAction.TerminateLocalListenAndRequireWatchDisconnection */ :\n return n.queries.delete(r), n.onUnlisten(r, \n /** disableRemoteListen= */ !0);\n\n case 1 /* ListenerRemovalAction.TerminateLocalListenOnly */ :\n return n.queries.delete(r), n.onUnlisten(r, \n /** disableRemoteListen= */ !1);\n\n case 2 /* ListenerRemovalAction.RequireWatchDisconnectionOnly */ :\n return n.onLastRemoteStoreUnlisten(r);\n\n default:\n return;\n }\n}\n\nfunction __PRIVATE_eventManagerOnWatchChange(e, t) {\n const n = __PRIVATE_debugCast(e);\n let r = !1;\n for (const e of t) {\n const t = e.query, i = n.queries.get(t);\n if (i) {\n for (const t of i.j_) t.X_(e) && (r = !0);\n i.z_ = e;\n }\n }\n r && __PRIVATE_raiseSnapshotsInSyncEvent(n);\n}\n\nfunction __PRIVATE_eventManagerOnWatchError(e, t, n) {\n const r = __PRIVATE_debugCast(e), i = r.queries.get(t);\n if (i) for (const e of i.j_) e.onError(n);\n // Remove all listeners. NOTE: We don't need to call syncEngine.unlisten()\n // after an error.\n r.queries.delete(t);\n}\n\nfunction __PRIVATE_raiseSnapshotsInSyncEvent(e) {\n e.Y_.forEach((e => {\n e.next();\n }));\n}\n\nvar pe, ye;\n\n/** Listen to both cache and server changes */\n(ye = pe || (pe = {})).ea = \"default\", \n/** Listen to changes in cache only */\nye.Cache = \"cache\";\n\n/**\n * QueryListener takes a series of internal view snapshots and determines\n * when to raise the event.\n *\n * It uses an Observer to dispatch events.\n */\nclass __PRIVATE_QueryListener {\n constructor(e, t, n) {\n this.query = e, this.ta = t, \n /**\n * Initial snapshots (e.g. from cache) may not be propagated to the wrapped\n * observer. This flag is set to true once we've actually raised an event.\n */\n this.na = !1, this.ra = null, this.onlineState = \"Unknown\" /* OnlineState.Unknown */ , \n this.options = n || {};\n }\n /**\n * Applies the new ViewSnapshot to this listener, raising a user-facing event\n * if applicable (depending on what changed, whether the user has opted into\n * metadata-only changes, etc.). Returns true if a user-facing event was\n * indeed raised.\n */ X_(e) {\n if (!this.options.includeMetadataChanges) {\n // Remove the metadata only changes.\n const t = [];\n for (const n of e.docChanges) 3 /* ChangeType.Metadata */ !== n.type && t.push(n);\n e = new ViewSnapshot(e.query, e.docs, e.oldDocs, t, e.mutatedKeys, e.fromCache, e.syncStateChanged, \n /* excludesMetadataChanges= */ !0, e.hasCachedResults);\n }\n let t = !1;\n return this.na ? this.ia(e) && (this.ta.next(e), t = !0) : this.sa(e, this.onlineState) && (this.oa(e), \n t = !0), this.ra = e, t;\n }\n onError(e) {\n this.ta.error(e);\n }\n /** Returns whether a snapshot was raised. */ Z_(e) {\n this.onlineState = e;\n let t = !1;\n return this.ra && !this.na && this.sa(this.ra, e) && (this.oa(this.ra), t = !0), \n t;\n }\n sa(e, t) {\n // Always raise the first event when we're synced\n if (!e.fromCache) return !0;\n // Always raise event if listening to cache\n if (!this.J_()) return !0;\n // NOTE: We consider OnlineState.Unknown as online (it should become Offline\n // or Online if we wait long enough).\n const n = \"Offline\" /* OnlineState.Offline */ !== t;\n // Don't raise the event if we're online, aren't synced yet (checked\n // above) and are waiting for a sync.\n return (!this.options._a || !n) && (!e.docs.isEmpty() || e.hasCachedResults || \"Offline\" /* OnlineState.Offline */ === t);\n // Raise data from cache if we have any documents, have cached results before,\n // or we are offline.\n }\n ia(e) {\n // We don't need to handle includeDocumentMetadataChanges here because\n // the Metadata only changes have already been stripped out if needed.\n // At this point the only changes we will see are the ones we should\n // propagate.\n if (e.docChanges.length > 0) return !0;\n const t = this.ra && this.ra.hasPendingWrites !== e.hasPendingWrites;\n return !(!e.syncStateChanged && !t) && !0 === this.options.includeMetadataChanges;\n // Generally we should have hit one of the cases above, but it's possible\n // to get here if there were only metadata docChanges and they got\n // stripped out.\n }\n oa(e) {\n e = ViewSnapshot.fromInitialDocuments(e.query, e.docs, e.mutatedKeys, e.fromCache, e.hasCachedResults), \n this.na = !0, this.ta.next(e);\n }\n J_() {\n return this.options.source !== pe.Cache;\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A complete element in the bundle stream, together with the byte length it\n * occupies in the stream.\n */ class __PRIVATE_SizedBundleElement {\n constructor(e, \n // How many bytes this element takes to store in the bundle.\n t) {\n this.aa = e, this.byteLength = t;\n }\n ua() {\n return \"metadata\" in this.aa;\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Helper to convert objects from bundles to model objects in the SDK.\n */ class __PRIVATE_BundleConverterImpl {\n constructor(e) {\n this.serializer = e;\n }\n Es(e) {\n return fromName(this.serializer, e);\n }\n /**\n * Converts a BundleDocument to a MutableDocument.\n */ ds(e) {\n return e.metadata.exists ? __PRIVATE_fromDocument(this.serializer, e.document, !1) : MutableDocument.newNoDocument(this.Es(e.metadata.name), this.As(e.metadata.readTime));\n }\n As(e) {\n return __PRIVATE_fromVersion(e);\n }\n}\n\n/**\n * A class to process the elements from a bundle, load them into local\n * storage and provide progress update while loading.\n */ class __PRIVATE_BundleLoader {\n constructor(e, t, n) {\n this.ca = e, this.localStore = t, this.serializer = n, \n /** Batched queries to be saved into storage */\n this.queries = [], \n /** Batched documents to be saved into storage */\n this.documents = [], \n /** The collection groups affected by this bundle. */\n this.collectionGroups = new Set, this.progress = __PRIVATE_bundleInitialProgress(e);\n }\n /**\n * Adds an element from the bundle to the loader.\n *\n * Returns a new progress if adding the element leads to a new progress,\n * otherwise returns null.\n */ la(e) {\n this.progress.bytesLoaded += e.byteLength;\n let t = this.progress.documentsLoaded;\n if (e.aa.namedQuery) this.queries.push(e.aa.namedQuery); else if (e.aa.documentMetadata) {\n this.documents.push({\n metadata: e.aa.documentMetadata\n }), e.aa.documentMetadata.exists || ++t;\n const n = ResourcePath.fromString(e.aa.documentMetadata.name);\n this.collectionGroups.add(n.get(n.length - 2));\n } else e.aa.document && (this.documents[this.documents.length - 1].document = e.aa.document, \n ++t);\n return t !== this.progress.documentsLoaded ? (this.progress.documentsLoaded = t, \n Object.assign({}, this.progress)) : null;\n }\n ha(e) {\n const t = new Map, n = new __PRIVATE_BundleConverterImpl(this.serializer);\n for (const r of e) if (r.metadata.queries) {\n const e = n.Es(r.metadata.name);\n for (const n of r.metadata.queries) {\n const r = (t.get(n) || __PRIVATE_documentKeySet()).add(e);\n t.set(n, r);\n }\n }\n return t;\n }\n /**\n * Update the progress to 'Success' and return the updated progress.\n */ async complete() {\n const e = await __PRIVATE_localStoreApplyBundledDocuments(this.localStore, new __PRIVATE_BundleConverterImpl(this.serializer), this.documents, this.ca.id), t = this.ha(this.documents);\n for (const e of this.queries) await __PRIVATE_localStoreSaveNamedQuery(this.localStore, e, t.get(e.name));\n return this.progress.taskState = \"Success\", {\n progress: this.progress,\n Pa: this.collectionGroups,\n Ia: e\n };\n }\n}\n\n/**\n * Returns a `LoadBundleTaskProgress` representing the initial progress of\n * loading a bundle.\n */ function __PRIVATE_bundleInitialProgress(e) {\n return {\n taskState: \"Running\",\n documentsLoaded: 0,\n bytesLoaded: 0,\n totalDocuments: e.totalDocuments,\n totalBytes: e.totalBytes\n };\n}\n\n/**\n * Returns a `LoadBundleTaskProgress` representing the progress that the loading\n * has succeeded.\n */\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass __PRIVATE_AddedLimboDocument {\n constructor(e) {\n this.key = e;\n }\n}\n\nclass __PRIVATE_RemovedLimboDocument {\n constructor(e) {\n this.key = e;\n }\n}\n\n/**\n * View is responsible for computing the final merged truth of what docs are in\n * a query. It gets notified of local and remote changes to docs, and applies\n * the query filters and limits to determine the most correct possible results.\n */ class __PRIVATE_View {\n constructor(e, \n /** Documents included in the remote target */\n t) {\n this.query = e, this.Ta = t, this.Ea = null, this.hasCachedResults = !1, \n /**\n * A flag whether the view is current with the backend. A view is considered\n * current after it has seen the current flag from the backend and did not\n * lose consistency within the watch stream (e.g. because of an existence\n * filter mismatch).\n */\n this.current = !1, \n /** Documents in the view but not in the remote target */\n this.da = __PRIVATE_documentKeySet(), \n /** Document Keys that have local changes */\n this.mutatedKeys = __PRIVATE_documentKeySet(), this.Aa = __PRIVATE_newQueryComparator(e), \n this.Ra = new DocumentSet(this.Aa);\n }\n /**\n * The set of remote documents that the server has told us belongs to the target associated with\n * this view.\n */ get Va() {\n return this.Ta;\n }\n /**\n * Iterates over a set of doc changes, applies the query limit, and computes\n * what the new results should be, what the changes were, and whether we may\n * need to go back to the local cache for more results. Does not make any\n * changes to the view.\n * @param docChanges - The doc changes to apply to this view.\n * @param previousChanges - If this is being called with a refill, then start\n * with this set of docs and changes instead of the current view.\n * @returns a new set of docs, changes, and refill flag.\n */ ma(e, t) {\n const n = t ? t.fa : new __PRIVATE_DocumentChangeSet, r = t ? t.Ra : this.Ra;\n let i = t ? t.mutatedKeys : this.mutatedKeys, s = r, o = !1;\n // Track the last doc in a (full) limit. This is necessary, because some\n // update (a delete, or an update moving a doc past the old limit) might\n // mean there is some other document in the local cache that either should\n // come (1) between the old last limit doc and the new last document, in the\n // case of updates, or (2) after the new last document, in the case of\n // deletes. So we keep this doc at the old limit to compare the updates to.\n // Note that this should never get used in a refill (when previousChanges is\n // set), because there will only be adds -- no deletes or updates.\n const _ = \"F\" /* LimitType.First */ === this.query.limitType && r.size === this.query.limit ? r.last() : null, a = \"L\" /* LimitType.Last */ === this.query.limitType && r.size === this.query.limit ? r.first() : null;\n // Drop documents out to meet limit/limitToLast requirement.\n if (e.inorderTraversal(((e, t) => {\n const u = r.get(e), c = __PRIVATE_queryMatches(this.query, t) ? t : null, l = !!u && this.mutatedKeys.has(u.key), h = !!c && (c.hasLocalMutations || \n // We only consider committed mutations for documents that were\n // mutated during the lifetime of the view.\n this.mutatedKeys.has(c.key) && c.hasCommittedMutations);\n let P = !1;\n // Calculate change\n if (u && c) {\n u.data.isEqual(c.data) ? l !== h && (n.track({\n type: 3 /* ChangeType.Metadata */ ,\n doc: c\n }), P = !0) : this.ga(u, c) || (n.track({\n type: 2 /* ChangeType.Modified */ ,\n doc: c\n }), P = !0, (_ && this.Aa(c, _) > 0 || a && this.Aa(c, a) < 0) && (\n // This doc moved from inside the limit to outside the limit.\n // That means there may be some other doc in the local cache\n // that should be included instead.\n o = !0));\n } else !u && c ? (n.track({\n type: 0 /* ChangeType.Added */ ,\n doc: c\n }), P = !0) : u && !c && (n.track({\n type: 1 /* ChangeType.Removed */ ,\n doc: u\n }), P = !0, (_ || a) && (\n // A doc was removed from a full limit query. We'll need to\n // requery from the local cache to see if we know about some other\n // doc that should be in the results.\n o = !0));\n P && (c ? (s = s.add(c), i = h ? i.add(e) : i.delete(e)) : (s = s.delete(e), i = i.delete(e)));\n })), null !== this.query.limit) for (;s.size > this.query.limit; ) {\n const e = \"F\" /* LimitType.First */ === this.query.limitType ? s.last() : s.first();\n s = s.delete(e.key), i = i.delete(e.key), n.track({\n type: 1 /* ChangeType.Removed */ ,\n doc: e\n });\n }\n return {\n Ra: s,\n fa: n,\n ns: o,\n mutatedKeys: i\n };\n }\n ga(e, t) {\n // We suppress the initial change event for documents that were modified as\n // part of a write acknowledgment (e.g. when the value of a server transform\n // is applied) as Watch will send us the same document again.\n // By suppressing the event, we only raise two user visible events (one with\n // `hasPendingWrites` and the final state of the document) instead of three\n // (one with `hasPendingWrites`, the modified document with\n // `hasPendingWrites` and the final state of the document).\n return e.hasLocalMutations && t.hasCommittedMutations && !t.hasLocalMutations;\n }\n /**\n * Updates the view with the given ViewDocumentChanges and optionally updates\n * limbo docs and sync state from the provided target change.\n * @param docChanges - The set of changes to make to the view's docs.\n * @param limboResolutionEnabled - Whether to update limbo documents based on\n * this change.\n * @param targetChange - A target change to apply for computing limbo docs and\n * sync state.\n * @param targetIsPendingReset - Whether the target is pending to reset due to\n * existence filter mismatch. If not explicitly specified, it is treated\n * equivalently to `false`.\n * @returns A new ViewChange with the given docs, changes, and sync state.\n */\n // PORTING NOTE: The iOS/Android clients always compute limbo document changes.\n applyChanges(e, t, n, r) {\n const i = this.Ra;\n this.Ra = e.Ra, this.mutatedKeys = e.mutatedKeys;\n // Sort changes based on type and query comparator\n const s = e.fa.G_();\n s.sort(((e, t) => function __PRIVATE_compareChangeType(e, t) {\n const order = e => {\n switch (e) {\n case 0 /* ChangeType.Added */ :\n return 1;\n\n case 2 /* ChangeType.Modified */ :\n case 3 /* ChangeType.Metadata */ :\n // A metadata change is converted to a modified change at the public\n // api layer. Since we sort by document key and then change type,\n // metadata and modified changes must be sorted equivalently.\n return 2;\n\n case 1 /* ChangeType.Removed */ :\n return 0;\n\n default:\n return fail();\n }\n };\n return order(e) - order(t);\n }\n /**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ (e.type, t.type) || this.Aa(e.doc, t.doc))), this.pa(n), r = null != r && r;\n const o = t && !r ? this.ya() : [], _ = 0 === this.da.size && this.current && !r ? 1 /* SyncState.Synced */ : 0 /* SyncState.Local */ , a = _ !== this.Ea;\n // We are at synced state if there is no limbo docs are waiting to be resolved, view is current\n // with the backend, and the query is not pending to reset due to existence filter mismatch.\n if (this.Ea = _, 0 !== s.length || a) {\n return {\n snapshot: new ViewSnapshot(this.query, e.Ra, i, s, e.mutatedKeys, 0 /* SyncState.Local */ === _, a, \n /* excludesMetadataChanges= */ !1, !!n && n.resumeToken.approximateByteSize() > 0),\n wa: o\n };\n }\n // no changes\n return {\n wa: o\n };\n }\n /**\n * Applies an OnlineState change to the view, potentially generating a\n * ViewChange if the view's syncState changes as a result.\n */ Z_(e) {\n return this.current && \"Offline\" /* OnlineState.Offline */ === e ? (\n // If we're offline, set `current` to false and then call applyChanges()\n // to refresh our syncState and generate a ViewChange as appropriate. We\n // are guaranteed to get a new TargetChange that sets `current` back to\n // true once the client is back online.\n this.current = !1, this.applyChanges({\n Ra: this.Ra,\n fa: new __PRIVATE_DocumentChangeSet,\n mutatedKeys: this.mutatedKeys,\n ns: !1\n }, \n /* limboResolutionEnabled= */ !1)) : {\n wa: []\n };\n }\n /**\n * Returns whether the doc for the given key should be in limbo.\n */ Sa(e) {\n // If the remote end says it's part of this query, it's not in limbo.\n return !this.Ta.has(e) && (\n // The local store doesn't think it's a result, so it shouldn't be in limbo.\n !!this.Ra.has(e) && !this.Ra.get(e).hasLocalMutations);\n }\n /**\n * Updates syncedDocuments, current, and limbo docs based on the given change.\n * Returns the list of changes to which docs are in limbo.\n */ pa(e) {\n e && (e.addedDocuments.forEach((e => this.Ta = this.Ta.add(e))), e.modifiedDocuments.forEach((e => {})), \n e.removedDocuments.forEach((e => this.Ta = this.Ta.delete(e))), this.current = e.current);\n }\n ya() {\n // We can only determine limbo documents when we're in-sync with the server.\n if (!this.current) return [];\n // TODO(klimt): Do this incrementally so that it's not quadratic when\n // updating many documents.\n const e = this.da;\n this.da = __PRIVATE_documentKeySet(), this.Ra.forEach((e => {\n this.Sa(e.key) && (this.da = this.da.add(e.key));\n }));\n // Diff the new limbo docs with the old limbo docs.\n const t = [];\n return e.forEach((e => {\n this.da.has(e) || t.push(new __PRIVATE_RemovedLimboDocument(e));\n })), this.da.forEach((n => {\n e.has(n) || t.push(new __PRIVATE_AddedLimboDocument(n));\n })), t;\n }\n /**\n * Update the in-memory state of the current view with the state read from\n * persistence.\n *\n * We update the query view whenever a client's primary status changes:\n * - When a client transitions from primary to secondary, it can miss\n * LocalStorage updates and its query views may temporarily not be\n * synchronized with the state on disk.\n * - For secondary to primary transitions, the client needs to update the list\n * of `syncedDocuments` since secondary clients update their query views\n * based purely on synthesized RemoteEvents.\n *\n * @param queryResult.documents - The documents that match the query according\n * to the LocalStore.\n * @param queryResult.remoteKeys - The keys of the documents that match the\n * query according to the backend.\n *\n * @returns The ViewChange that resulted from this synchronization.\n */\n // PORTING NOTE: Multi-tab only.\n ba(e) {\n this.Ta = e.Ts, this.da = __PRIVATE_documentKeySet();\n const t = this.ma(e.documents);\n return this.applyChanges(t, /* limboResolutionEnabled= */ !0);\n }\n /**\n * Returns a view snapshot as if this query was just listened to. Contains\n * a document add for every existing document and the `fromCache` and\n * `hasPendingWrites` status of the already established view.\n */\n // PORTING NOTE: Multi-tab only.\n Da() {\n return ViewSnapshot.fromInitialDocuments(this.query, this.Ra, this.mutatedKeys, 0 /* SyncState.Local */ === this.Ea, this.hasCachedResults);\n }\n}\n\n/**\n * QueryView contains all of the data that SyncEngine needs to keep track of for\n * a particular query.\n */\nclass __PRIVATE_QueryView {\n constructor(\n /**\n * The query itself.\n */\n e, \n /**\n * The target number created by the client that is used in the watch\n * stream to identify this query.\n */\n t, \n /**\n * The view is responsible for computing the final merged truth of what\n * docs are in the query. It gets notified of local and remote changes,\n * and applies the query filters and limits to determine the most correct\n * possible results.\n */\n n) {\n this.query = e, this.targetId = t, this.view = n;\n }\n}\n\n/** Tracks a limbo resolution. */ class LimboResolution {\n constructor(e) {\n this.key = e, \n /**\n * Set to true once we've received a document. This is used in\n * getRemoteKeysForTarget() and ultimately used by WatchChangeAggregator to\n * decide whether it needs to manufacture a delete event for the target once\n * the target is CURRENT.\n */\n this.va = !1;\n }\n}\n\n/**\n * An implementation of `SyncEngine` coordinating with other parts of SDK.\n *\n * The parts of SyncEngine that act as a callback to RemoteStore need to be\n * registered individually. This is done in `syncEngineWrite()` and\n * `syncEngineListen()` (as well as `applyPrimaryState()`) as these methods\n * serve as entry points to RemoteStore's functionality.\n *\n * Note: some field defined in this class might have public access level, but\n * the class is not exported so they are only accessible from this module.\n * This is useful to implement optional features (like bundles) in free\n * functions, such that they are tree-shakeable.\n */ class __PRIVATE_SyncEngineImpl {\n constructor(e, t, n, \n // PORTING NOTE: Manages state synchronization in multi-tab environments.\n r, i, s) {\n this.localStore = e, this.remoteStore = t, this.eventManager = n, this.sharedClientState = r, \n this.currentUser = i, this.maxConcurrentLimboResolutions = s, this.Ca = {}, this.Fa = new ObjectMap((e => __PRIVATE_canonifyQuery(e)), __PRIVATE_queryEquals), \n this.Ma = new Map, \n /**\n * The keys of documents that are in limbo for which we haven't yet started a\n * limbo resolution query. The strings in this set are the result of calling\n * `key.path.canonicalString()` where `key` is a `DocumentKey` object.\n *\n * The `Set` type was chosen because it provides efficient lookup and removal\n * of arbitrary elements and it also maintains insertion order, providing the\n * desired queue-like FIFO semantics.\n */\n this.xa = new Set, \n /**\n * Keeps track of the target ID for each document that is in limbo with an\n * active target.\n */\n this.Oa = new SortedMap(DocumentKey.comparator), \n /**\n * Keeps track of the information about an active limbo resolution for each\n * active target ID that was started for the purpose of limbo resolution.\n */\n this.Na = new Map, this.La = new __PRIVATE_ReferenceSet, \n /** Stores user completion handlers, indexed by User and BatchId. */\n this.Ba = {}, \n /** Stores user callbacks waiting for all pending writes to be acknowledged. */\n this.ka = new Map, this.qa = __PRIVATE_TargetIdGenerator.kn(), this.onlineState = \"Unknown\" /* OnlineState.Unknown */ , \n // The primary state is set to `true` or `false` immediately after Firestore\n // startup. In the interim, a client should only be considered primary if\n // `isPrimary` is true.\n this.Qa = void 0;\n }\n get isPrimaryClient() {\n return !0 === this.Qa;\n }\n}\n\n/**\n * Initiates the new listen, resolves promise when listen enqueued to the\n * server. All the subsequent view snapshots or errors are sent to the\n * subscribed handlers. Returns the initial snapshot.\n */\nasync function __PRIVATE_syncEngineListen(e, t, n = !0) {\n const r = __PRIVATE_ensureWatchCallbacks(e);\n let i;\n const s = r.Fa.get(t);\n return s ? (\n // PORTING NOTE: With Multi-Tab Web, it is possible that a query view\n // already exists when EventManager calls us for the first time. This\n // happens when the primary tab is already listening to this query on\n // behalf of another tab and the user of the primary also starts listening\n // to the query. EventManager will not have an assigned target ID in this\n // case and calls `listen` to obtain this ID.\n r.sharedClientState.addLocalQueryTarget(s.targetId), i = s.view.Da()) : i = await __PRIVATE_allocateTargetAndMaybeListen(r, t, n, \n /** shouldInitializeView= */ !0), i;\n}\n\n/** Query has been listening to the cache, and tries to initiate the remote store listen */ async function __PRIVATE_triggerRemoteStoreListen(e, t) {\n const n = __PRIVATE_ensureWatchCallbacks(e);\n await __PRIVATE_allocateTargetAndMaybeListen(n, t, \n /** shouldListenToRemote= */ !0, \n /** shouldInitializeView= */ !1);\n}\n\nasync function __PRIVATE_allocateTargetAndMaybeListen(e, t, n, r) {\n const i = await __PRIVATE_localStoreAllocateTarget(e.localStore, __PRIVATE_queryToTarget(t)), s = i.targetId, o = e.sharedClientState.addLocalQueryTarget(s, n);\n let _;\n return r && (_ = await __PRIVATE_initializeViewAndComputeSnapshot(e, t, s, \"current\" === o, i.resumeToken)), \n e.isPrimaryClient && n && __PRIVATE_remoteStoreListen(e.remoteStore, i), _;\n}\n\n/**\n * Registers a view for a previously unknown query and computes its initial\n * snapshot.\n */ async function __PRIVATE_initializeViewAndComputeSnapshot(e, t, n, r, i) {\n // PORTING NOTE: On Web only, we inject the code that registers new Limbo\n // targets based on view changes. This allows us to only depend on Limbo\n // changes when user code includes queries.\n e.Ka = (t, n, r) => async function __PRIVATE_applyDocChanges(e, t, n, r) {\n let i = t.view.ma(n);\n i.ns && (\n // The query has a limit and some docs were removed, so we need\n // to re-run the query against the local store to make sure we\n // didn't lose any good docs that had been past the limit.\n i = await __PRIVATE_localStoreExecuteQuery(e.localStore, t.query, \n /* usePreviousResults= */ !1).then((({documents: e}) => t.view.ma(e, i))));\n const s = r && r.targetChanges.get(t.targetId), o = r && null != r.targetMismatches.get(t.targetId), _ = t.view.applyChanges(i, \n /* limboResolutionEnabled= */ e.isPrimaryClient, s, o);\n return __PRIVATE_updateTrackedLimbos(e, t.targetId, _.wa), _.snapshot;\n }(e, t, n, r);\n const s = await __PRIVATE_localStoreExecuteQuery(e.localStore, t, \n /* usePreviousResults= */ !0), o = new __PRIVATE_View(t, s.Ts), _ = o.ma(s.documents), a = TargetChange.createSynthesizedTargetChangeForCurrentChange(n, r && \"Offline\" /* OnlineState.Offline */ !== e.onlineState, i), u = o.applyChanges(_, \n /* limboResolutionEnabled= */ e.isPrimaryClient, a);\n __PRIVATE_updateTrackedLimbos(e, n, u.wa);\n const c = new __PRIVATE_QueryView(t, n, o);\n return e.Fa.set(t, c), e.Ma.has(n) ? e.Ma.get(n).push(t) : e.Ma.set(n, [ t ]), u.snapshot;\n}\n\n/** Stops listening to the query. */ async function __PRIVATE_syncEngineUnlisten(e, t, n) {\n const r = __PRIVATE_debugCast(e), i = r.Fa.get(t), s = r.Ma.get(i.targetId);\n if (s.length > 1) return r.Ma.set(i.targetId, s.filter((e => !__PRIVATE_queryEquals(e, t)))), \n void r.Fa.delete(t);\n // No other queries are mapped to the target, clean up the query and the target.\n if (r.isPrimaryClient) {\n // We need to remove the local query target first to allow us to verify\n // whether any other client is still interested in this target.\n r.sharedClientState.removeLocalQueryTarget(i.targetId);\n r.sharedClientState.isActiveQueryTarget(i.targetId) || await __PRIVATE_localStoreReleaseTarget(r.localStore, i.targetId, \n /*keepPersistedTargetData=*/ !1).then((() => {\n r.sharedClientState.clearQueryState(i.targetId), n && __PRIVATE_remoteStoreUnlisten(r.remoteStore, i.targetId), \n __PRIVATE_removeAndCleanupTarget(r, i.targetId);\n })).catch(__PRIVATE_ignoreIfPrimaryLeaseLoss);\n } else __PRIVATE_removeAndCleanupTarget(r, i.targetId), await __PRIVATE_localStoreReleaseTarget(r.localStore, i.targetId, \n /*keepPersistedTargetData=*/ !0);\n}\n\n/** Unlistens to the remote store while still listening to the cache. */ async function __PRIVATE_triggerRemoteStoreUnlisten(e, t) {\n const n = __PRIVATE_debugCast(e), r = n.Fa.get(t), i = n.Ma.get(r.targetId);\n n.isPrimaryClient && 1 === i.length && (\n // PORTING NOTE: Unregister the target ID with local Firestore client as\n // watch target.\n n.sharedClientState.removeLocalQueryTarget(r.targetId), __PRIVATE_remoteStoreUnlisten(n.remoteStore, r.targetId));\n}\n\n/**\n * Initiates the write of local mutation batch which involves adding the\n * writes to the mutation queue, notifying the remote store about new\n * mutations and raising events for any changes this write caused.\n *\n * The promise returned by this call is resolved when the above steps\n * have completed, *not* when the write was acked by the backend. The\n * userCallback is resolved once the write was acked/rejected by the\n * backend (or failed locally for any other reason).\n */ async function __PRIVATE_syncEngineWrite(e, t, n) {\n const r = __PRIVATE_syncEngineEnsureWriteCallbacks(e);\n try {\n const e = await function __PRIVATE_localStoreWriteLocally(e, t) {\n const n = __PRIVATE_debugCast(e), r = Timestamp.now(), i = t.reduce(((e, t) => e.add(t.key)), __PRIVATE_documentKeySet());\n let s, o;\n return n.persistence.runTransaction(\"Locally write mutations\", \"readwrite\", (e => {\n // Figure out which keys do not have a remote version in the cache, this\n // is needed to create the right overlay mutation: if no remote version\n // presents, we do not need to create overlays as patch mutations.\n // TODO(Overlay): Is there a better way to determine this? Using the\n // document version does not work because local mutations set them back\n // to 0.\n let _ = __PRIVATE_mutableDocumentMap(), a = __PRIVATE_documentKeySet();\n return n.cs.getEntries(e, i).next((e => {\n _ = e, _.forEach(((e, t) => {\n t.isValidDocument() || (a = a.add(e));\n }));\n })).next((() => n.localDocuments.getOverlayedDocuments(e, _))).next((i => {\n s = i;\n // For non-idempotent mutations (such as `FieldValue.increment()`),\n // we record the base state in a separate patch mutation. This is\n // later used to guarantee consistent values and prevents flicker\n // even if the backend sends us an update that already includes our\n // transform.\n const o = [];\n for (const e of t) {\n const t = __PRIVATE_mutationExtractBaseValue(e, s.get(e.key).overlayedDocument);\n null != t && \n // NOTE: The base state should only be applied if there's some\n // existing document to override, so use a Precondition of\n // exists=true\n o.push(new __PRIVATE_PatchMutation(e.key, t, __PRIVATE_extractFieldMask(t.value.mapValue), Precondition.exists(!0)));\n }\n return n.mutationQueue.addMutationBatch(e, r, o, t);\n })).next((t => {\n o = t;\n const r = t.applyToLocalDocumentSet(s, a);\n return n.documentOverlayCache.saveOverlays(e, t.batchId, r);\n }));\n })).then((() => ({\n batchId: o.batchId,\n changes: __PRIVATE_convertOverlayedDocumentMapToDocumentMap(s)\n })));\n }(r.localStore, t);\n r.sharedClientState.addPendingMutation(e.batchId), function __PRIVATE_addMutationCallback(e, t, n) {\n let r = e.Ba[e.currentUser.toKey()];\n r || (r = new SortedMap(__PRIVATE_primitiveComparator));\n r = r.insert(t, n), e.Ba[e.currentUser.toKey()] = r;\n }\n /**\n * Resolves or rejects the user callback for the given batch and then discards\n * it.\n */ (r, e.batchId, n), await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(r, e.changes), \n await __PRIVATE_fillWritePipeline(r.remoteStore);\n } catch (e) {\n // If we can't persist the mutation, we reject the user callback and\n // don't send the mutation. The user can then retry the write.\n const t = __PRIVATE_wrapInUserErrorIfRecoverable(e, \"Failed to persist write\");\n n.reject(t);\n }\n}\n\n/**\n * Applies one remote event to the sync engine, notifying any views of the\n * changes, and releasing any pending mutation batches that would become\n * visible because of the snapshot version the remote event contains.\n */ async function __PRIVATE_syncEngineApplyRemoteEvent(e, t) {\n const n = __PRIVATE_debugCast(e);\n try {\n const e = await __PRIVATE_localStoreApplyRemoteEventToLocalCache(n.localStore, t);\n // Update `receivedDocument` as appropriate for any limbo targets.\n t.targetChanges.forEach(((e, t) => {\n const r = n.Na.get(t);\n r && (\n // Since this is a limbo resolution lookup, it's for a single document\n // and it could be added, modified, or removed, but not a combination.\n __PRIVATE_hardAssert(e.addedDocuments.size + e.modifiedDocuments.size + e.removedDocuments.size <= 1), \n e.addedDocuments.size > 0 ? r.va = !0 : e.modifiedDocuments.size > 0 ? __PRIVATE_hardAssert(r.va) : e.removedDocuments.size > 0 && (__PRIVATE_hardAssert(r.va), \n r.va = !1));\n })), await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(n, e, t);\n } catch (e) {\n await __PRIVATE_ignoreIfPrimaryLeaseLoss(e);\n }\n}\n\n/**\n * Applies an OnlineState change to the sync engine and notifies any views of\n * the change.\n */ function __PRIVATE_syncEngineApplyOnlineStateChange(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n // If we are the secondary client, we explicitly ignore the remote store's\n // online state (the local client may go offline, even though the primary\n // tab remains online) and only apply the primary tab's online state from\n // SharedClientState.\n if (r.isPrimaryClient && 0 /* OnlineStateSource.RemoteStore */ === n || !r.isPrimaryClient && 1 /* OnlineStateSource.SharedClientState */ === n) {\n const e = [];\n r.Fa.forEach(((n, r) => {\n const i = r.view.Z_(t);\n i.snapshot && e.push(i.snapshot);\n })), function __PRIVATE_eventManagerOnOnlineStateChange(e, t) {\n const n = __PRIVATE_debugCast(e);\n n.onlineState = t;\n let r = !1;\n n.queries.forEach(((e, n) => {\n for (const e of n.j_) \n // Run global snapshot listeners if a consistent snapshot has been emitted.\n e.Z_(t) && (r = !0);\n })), r && __PRIVATE_raiseSnapshotsInSyncEvent(n);\n }(r.eventManager, t), e.length && r.Ca.d_(e), r.onlineState = t, r.isPrimaryClient && r.sharedClientState.setOnlineState(t);\n }\n}\n\n/**\n * Rejects the listen for the given targetID. This can be triggered by the\n * backend for any active target.\n *\n * @param syncEngine - The sync engine implementation.\n * @param targetId - The targetID corresponds to one previously initiated by the\n * user as part of TargetData passed to listen() on RemoteStore.\n * @param err - A description of the condition that has forced the rejection.\n * Nearly always this will be an indication that the user is no longer\n * authorized to see the data matching the target.\n */ async function __PRIVATE_syncEngineRejectListen(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n // PORTING NOTE: Multi-tab only.\n r.sharedClientState.updateQueryState(t, \"rejected\", n);\n const i = r.Na.get(t), s = i && i.key;\n if (s) {\n // TODO(klimt): We really only should do the following on permission\n // denied errors, but we don't have the cause code here.\n // It's a limbo doc. Create a synthetic event saying it was deleted.\n // This is kind of a hack. Ideally, we would have a method in the local\n // store to purge a document. However, it would be tricky to keep all of\n // the local store's invariants with another method.\n let e = new SortedMap(DocumentKey.comparator);\n // TODO(b/217189216): This limbo document should ideally have a read time,\n // so that it is picked up by any read-time based scans. The backend,\n // however, does not send a read time for target removals.\n e = e.insert(s, MutableDocument.newNoDocument(s, SnapshotVersion.min()));\n const n = __PRIVATE_documentKeySet().add(s), i = new RemoteEvent(SnapshotVersion.min(), \n /* targetChanges= */ new Map, \n /* targetMismatches= */ new SortedMap(__PRIVATE_primitiveComparator), e, n);\n await __PRIVATE_syncEngineApplyRemoteEvent(r, i), \n // Since this query failed, we won't want to manually unlisten to it.\n // We only remove it from bookkeeping after we successfully applied the\n // RemoteEvent. If `applyRemoteEvent()` throws, we want to re-listen to\n // this query when the RemoteStore restarts the Watch stream, which should\n // re-trigger the target failure.\n r.Oa = r.Oa.remove(s), r.Na.delete(t), __PRIVATE_pumpEnqueuedLimboResolutions(r);\n } else await __PRIVATE_localStoreReleaseTarget(r.localStore, t, \n /* keepPersistedTargetData */ !1).then((() => __PRIVATE_removeAndCleanupTarget(r, t, n))).catch(__PRIVATE_ignoreIfPrimaryLeaseLoss);\n}\n\nasync function __PRIVATE_syncEngineApplySuccessfulWrite(e, t) {\n const n = __PRIVATE_debugCast(e), r = t.batch.batchId;\n try {\n const e = await __PRIVATE_localStoreAcknowledgeBatch(n.localStore, t);\n // The local store may or may not be able to apply the write result and\n // raise events immediately (depending on whether the watcher is caught\n // up), so we raise user callbacks first so that they consistently happen\n // before listen events.\n __PRIVATE_processUserCallback(n, r, /*error=*/ null), __PRIVATE_triggerPendingWritesCallbacks(n, r), \n n.sharedClientState.updateMutationState(r, \"acknowledged\"), await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(n, e);\n } catch (e) {\n await __PRIVATE_ignoreIfPrimaryLeaseLoss(e);\n }\n}\n\nasync function __PRIVATE_syncEngineRejectFailedWrite(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n try {\n const e = await function __PRIVATE_localStoreRejectBatch(e, t) {\n const n = __PRIVATE_debugCast(e);\n return n.persistence.runTransaction(\"Reject batch\", \"readwrite-primary\", (e => {\n let r;\n return n.mutationQueue.lookupMutationBatch(e, t).next((t => (__PRIVATE_hardAssert(null !== t), \n r = t.keys(), n.mutationQueue.removeMutationBatch(e, t)))).next((() => n.mutationQueue.performConsistencyCheck(e))).next((() => n.documentOverlayCache.removeOverlaysForBatchId(e, r, t))).next((() => n.localDocuments.recalculateAndSaveOverlaysForDocumentKeys(e, r))).next((() => n.localDocuments.getDocuments(e, r)));\n }));\n }\n /**\n * Returns the largest (latest) batch id in mutation queue that is pending\n * server response.\n *\n * Returns `BATCHID_UNKNOWN` if the queue is empty.\n */ (r.localStore, t);\n // The local store may or may not be able to apply the write result and\n // raise events immediately (depending on whether the watcher is caught up),\n // so we raise user callbacks first so that they consistently happen before\n // listen events.\n __PRIVATE_processUserCallback(r, t, n), __PRIVATE_triggerPendingWritesCallbacks(r, t), \n r.sharedClientState.updateMutationState(t, \"rejected\", n), await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(r, e);\n } catch (n) {\n await __PRIVATE_ignoreIfPrimaryLeaseLoss(n);\n }\n}\n\n/**\n * Registers a user callback that resolves when all pending mutations at the moment of calling\n * are acknowledged .\n */ async function __PRIVATE_syncEngineRegisterPendingWritesCallback(e, t) {\n const n = __PRIVATE_debugCast(e);\n __PRIVATE_canUseNetwork(n.remoteStore) || __PRIVATE_logDebug(\"SyncEngine\", \"The network is disabled. The task returned by 'awaitPendingWrites()' will not complete until the network is enabled.\");\n try {\n const e = await function __PRIVATE_localStoreGetHighestUnacknowledgedBatchId(e) {\n const t = __PRIVATE_debugCast(e);\n return t.persistence.runTransaction(\"Get highest unacknowledged batch id\", \"readonly\", (e => t.mutationQueue.getHighestUnacknowledgedBatchId(e)));\n }(n.localStore);\n if (-1 === e) \n // Trigger the callback right away if there is no pending writes at the moment.\n return void t.resolve();\n const r = n.ka.get(e) || [];\n r.push(t), n.ka.set(e, r);\n } catch (e) {\n const n = __PRIVATE_wrapInUserErrorIfRecoverable(e, \"Initialization of waitForPendingWrites() operation failed\");\n t.reject(n);\n }\n}\n\n/**\n * Triggers the callbacks that are waiting for this batch id to get acknowledged by server,\n * if there are any.\n */ function __PRIVATE_triggerPendingWritesCallbacks(e, t) {\n (e.ka.get(t) || []).forEach((e => {\n e.resolve();\n })), e.ka.delete(t);\n}\n\n/** Reject all outstanding callbacks waiting for pending writes to complete. */ function __PRIVATE_processUserCallback(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n let i = r.Ba[r.currentUser.toKey()];\n // NOTE: Mutations restored from persistence won't have callbacks, so it's\n // okay for there to be no callback for this ID.\n if (i) {\n const e = i.get(t);\n e && (n ? e.reject(n) : e.resolve(), i = i.remove(t)), r.Ba[r.currentUser.toKey()] = i;\n }\n}\n\nfunction __PRIVATE_removeAndCleanupTarget(e, t, n = null) {\n e.sharedClientState.removeLocalQueryTarget(t);\n for (const r of e.Ma.get(t)) e.Fa.delete(r), n && e.Ca.$a(r, n);\n if (e.Ma.delete(t), e.isPrimaryClient) {\n e.La.gr(t).forEach((t => {\n e.La.containsKey(t) || \n // We removed the last reference for this key\n __PRIVATE_removeLimboTarget(e, t);\n }));\n }\n}\n\nfunction __PRIVATE_removeLimboTarget(e, t) {\n e.xa.delete(t.path.canonicalString());\n // It's possible that the target already got removed because the query failed. In that case,\n // the key won't exist in `limboTargetsByKey`. Only do the cleanup if we still have the target.\n const n = e.Oa.get(t);\n null !== n && (__PRIVATE_remoteStoreUnlisten(e.remoteStore, n), e.Oa = e.Oa.remove(t), \n e.Na.delete(n), __PRIVATE_pumpEnqueuedLimboResolutions(e));\n}\n\nfunction __PRIVATE_updateTrackedLimbos(e, t, n) {\n for (const r of n) if (r instanceof __PRIVATE_AddedLimboDocument) e.La.addReference(r.key, t), \n __PRIVATE_trackLimboChange(e, r); else if (r instanceof __PRIVATE_RemovedLimboDocument) {\n __PRIVATE_logDebug(\"SyncEngine\", \"Document no longer in limbo: \" + r.key), e.La.removeReference(r.key, t);\n e.La.containsKey(r.key) || \n // We removed the last reference for this key\n __PRIVATE_removeLimboTarget(e, r.key);\n } else fail();\n}\n\nfunction __PRIVATE_trackLimboChange(e, t) {\n const n = t.key, r = n.path.canonicalString();\n e.Oa.get(n) || e.xa.has(r) || (__PRIVATE_logDebug(\"SyncEngine\", \"New document in limbo: \" + n), \n e.xa.add(r), __PRIVATE_pumpEnqueuedLimboResolutions(e));\n}\n\n/**\n * Starts listens for documents in limbo that are enqueued for resolution,\n * subject to a maximum number of concurrent resolutions.\n *\n * Without bounding the number of concurrent resolutions, the server can fail\n * with \"resource exhausted\" errors which can lead to pathological client\n * behavior as seen in https://github.com/firebase/firebase-js-sdk/issues/2683.\n */ function __PRIVATE_pumpEnqueuedLimboResolutions(e) {\n for (;e.xa.size > 0 && e.Oa.size < e.maxConcurrentLimboResolutions; ) {\n const t = e.xa.values().next().value;\n e.xa.delete(t);\n const n = new DocumentKey(ResourcePath.fromString(t)), r = e.qa.next();\n e.Na.set(r, new LimboResolution(n)), e.Oa = e.Oa.insert(n, r), __PRIVATE_remoteStoreListen(e.remoteStore, new TargetData(__PRIVATE_queryToTarget(__PRIVATE_newQueryForPath(n.path)), r, \"TargetPurposeLimboResolution\" /* TargetPurpose.LimboResolution */ , __PRIVATE_ListenSequence.oe));\n }\n}\n\nasync function __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(e, t, n) {\n const r = __PRIVATE_debugCast(e), i = [], s = [], o = [];\n r.Fa.isEmpty() || (r.Fa.forEach(((e, _) => {\n o.push(r.Ka(_, t, n).then((e => {\n var t;\n // If there are changes, or we are handling a global snapshot, notify\n // secondary clients to update query state.\n if ((e || n) && r.isPrimaryClient) {\n // Query state is set to `current` if:\n // - There is a view change and it is up-to-date, or,\n // - There is a global snapshot, the Target is current, and no changes to be resolved\n const i = e ? !e.fromCache : null === (t = null == n ? void 0 : n.targetChanges.get(_.targetId)) || void 0 === t ? void 0 : t.current;\n r.sharedClientState.updateQueryState(_.targetId, i ? \"current\" : \"not-current\");\n }\n // Update views if there are actual changes.\n if (e) {\n i.push(e);\n const t = __PRIVATE_LocalViewChanges.Wi(_.targetId, e);\n s.push(t);\n }\n })));\n })), await Promise.all(o), r.Ca.d_(i), await async function __PRIVATE_localStoreNotifyLocalViewChanges(e, t) {\n const n = __PRIVATE_debugCast(e);\n try {\n await n.persistence.runTransaction(\"notifyLocalViewChanges\", \"readwrite\", (e => PersistencePromise.forEach(t, (t => PersistencePromise.forEach(t.$i, (r => n.persistence.referenceDelegate.addReference(e, t.targetId, r))).next((() => PersistencePromise.forEach(t.Ui, (r => n.persistence.referenceDelegate.removeReference(e, t.targetId, r)))))))));\n } catch (e) {\n if (!__PRIVATE_isIndexedDbTransactionError(e)) throw e;\n // If `notifyLocalViewChanges` fails, we did not advance the sequence\n // number for the documents that were included in this transaction.\n // This might trigger them to be deleted earlier than they otherwise\n // would have, but it should not invalidate the integrity of the data.\n __PRIVATE_logDebug(\"LocalStore\", \"Failed to update sequence numbers: \" + e);\n }\n for (const e of t) {\n const t = e.targetId;\n if (!e.fromCache) {\n const e = n.os.get(t), r = e.snapshotVersion, i = e.withLastLimboFreeSnapshotVersion(r);\n // Advance the last limbo free snapshot version\n n.os = n.os.insert(t, i);\n }\n }\n }(r.localStore, s));\n}\n\nasync function __PRIVATE_syncEngineHandleCredentialChange(e, t) {\n const n = __PRIVATE_debugCast(e);\n if (!n.currentUser.isEqual(t)) {\n __PRIVATE_logDebug(\"SyncEngine\", \"User change. New user:\", t.toKey());\n const e = await __PRIVATE_localStoreHandleUserChange(n.localStore, t);\n n.currentUser = t, \n // Fails tasks waiting for pending writes requested by previous user.\n function __PRIVATE_rejectOutstandingPendingWritesCallbacks(e, t) {\n e.ka.forEach((e => {\n e.forEach((e => {\n e.reject(new FirestoreError(D.CANCELLED, t));\n }));\n })), e.ka.clear();\n }(n, \"'waitForPendingWrites' promise is rejected due to a user change.\"), \n // TODO(b/114226417): Consider calling this only in the primary tab.\n n.sharedClientState.handleUserChange(t, e.removedBatchIds, e.addedBatchIds), await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(n, e.hs);\n }\n}\n\nfunction __PRIVATE_syncEngineGetRemoteKeysForTarget(e, t) {\n const n = __PRIVATE_debugCast(e), r = n.Na.get(t);\n if (r && r.va) return __PRIVATE_documentKeySet().add(r.key);\n {\n let e = __PRIVATE_documentKeySet();\n const r = n.Ma.get(t);\n if (!r) return e;\n for (const t of r) {\n const r = n.Fa.get(t);\n e = e.unionWith(r.view.Va);\n }\n return e;\n }\n}\n\n/**\n * Reconcile the list of synced documents in an existing view with those\n * from persistence.\n */ async function __PRIVATE_synchronizeViewAndComputeSnapshot(e, t) {\n const n = __PRIVATE_debugCast(e), r = await __PRIVATE_localStoreExecuteQuery(n.localStore, t.query, \n /* usePreviousResults= */ !0), i = t.view.ba(r);\n return n.isPrimaryClient && __PRIVATE_updateTrackedLimbos(n, t.targetId, i.wa), \n i;\n}\n\n/**\n * Retrieves newly changed documents from remote document cache and raises\n * snapshots if needed.\n */\n// PORTING NOTE: Multi-Tab only.\nasync function __PRIVATE_syncEngineSynchronizeWithChangedDocuments(e, t) {\n const n = __PRIVATE_debugCast(e);\n return __PRIVATE_localStoreGetNewDocumentChanges(n.localStore, t).then((e => __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(n, e)));\n}\n\n/** Applies a mutation state to an existing batch. */\n// PORTING NOTE: Multi-Tab only.\nasync function __PRIVATE_syncEngineApplyBatchState(e, t, n, r) {\n const i = __PRIVATE_debugCast(e), s = await function __PRIVATE_localStoreLookupMutationDocuments(e, t) {\n const n = __PRIVATE_debugCast(e), r = __PRIVATE_debugCast(n.mutationQueue);\n return n.persistence.runTransaction(\"Lookup mutation documents\", \"readonly\", (e => r.Mn(e, t).next((t => t ? n.localDocuments.getDocuments(e, t) : PersistencePromise.resolve(null)))));\n }\n // PORTING NOTE: Multi-Tab only.\n (i.localStore, t);\n null !== s ? (\"pending\" === n ? \n // If we are the primary client, we need to send this write to the\n // backend. Secondary clients will ignore these writes since their remote\n // connection is disabled.\n await __PRIVATE_fillWritePipeline(i.remoteStore) : \"acknowledged\" === n || \"rejected\" === n ? (\n // NOTE: Both these methods are no-ops for batches that originated from\n // other clients.\n __PRIVATE_processUserCallback(i, t, r || null), __PRIVATE_triggerPendingWritesCallbacks(i, t), \n function __PRIVATE_localStoreRemoveCachedMutationBatchMetadata(e, t) {\n __PRIVATE_debugCast(__PRIVATE_debugCast(e).mutationQueue).On(t);\n }\n // PORTING NOTE: Multi-Tab only.\n (i.localStore, t)) : fail(), await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(i, s)) : \n // A throttled tab may not have seen the mutation before it was completed\n // and removed from the mutation queue, in which case we won't have cached\n // the affected documents. In this case we can safely ignore the update\n // since that means we didn't apply the mutation locally at all (if we\n // had, we would have cached the affected documents), and so we will just\n // see any resulting document changes via normal remote document updates\n // as applicable.\n __PRIVATE_logDebug(\"SyncEngine\", \"Cannot apply mutation batch with id: \" + t);\n}\n\n/** Applies a query target change from a different tab. */\n// PORTING NOTE: Multi-Tab only.\nasync function __PRIVATE_syncEngineApplyPrimaryState(e, t) {\n const n = __PRIVATE_debugCast(e);\n if (__PRIVATE_ensureWatchCallbacks(n), __PRIVATE_syncEngineEnsureWriteCallbacks(n), \n !0 === t && !0 !== n.Qa) {\n // Secondary tabs only maintain Views for their local listeners and the\n // Views internal state may not be 100% populated (in particular\n // secondary tabs don't track syncedDocuments, the set of documents the\n // server considers to be in the target). So when a secondary becomes\n // primary, we need to need to make sure that all views for all targets\n // match the state on disk.\n const e = n.sharedClientState.getAllActiveQueryTargets(), t = await __PRIVATE_synchronizeQueryViewsAndRaiseSnapshots(n, e.toArray());\n n.Qa = !0, await __PRIVATE_remoteStoreApplyPrimaryState(n.remoteStore, !0);\n for (const e of t) __PRIVATE_remoteStoreListen(n.remoteStore, e);\n } else if (!1 === t && !1 !== n.Qa) {\n const e = [];\n let t = Promise.resolve();\n n.Ma.forEach(((r, i) => {\n n.sharedClientState.isLocalQueryTarget(i) ? e.push(i) : t = t.then((() => (__PRIVATE_removeAndCleanupTarget(n, i), \n __PRIVATE_localStoreReleaseTarget(n.localStore, i, \n /*keepPersistedTargetData=*/ !0)))), __PRIVATE_remoteStoreUnlisten(n.remoteStore, i);\n })), await t, await __PRIVATE_synchronizeQueryViewsAndRaiseSnapshots(n, e), \n // PORTING NOTE: Multi-Tab only.\n function __PRIVATE_resetLimboDocuments(e) {\n const t = __PRIVATE_debugCast(e);\n t.Na.forEach(((e, n) => {\n __PRIVATE_remoteStoreUnlisten(t.remoteStore, n);\n })), t.La.pr(), t.Na = new Map, t.Oa = new SortedMap(DocumentKey.comparator);\n }\n /**\n * Reconcile the query views of the provided query targets with the state from\n * persistence. Raises snapshots for any changes that affect the local\n * client and returns the updated state of all target's query data.\n *\n * @param syncEngine - The sync engine implementation\n * @param targets - the list of targets with views that need to be recomputed\n * @param transitionToPrimary - `true` iff the tab transitions from a secondary\n * tab to a primary tab\n */\n // PORTING NOTE: Multi-Tab only.\n (n), n.Qa = !1, await __PRIVATE_remoteStoreApplyPrimaryState(n.remoteStore, !1);\n }\n}\n\nasync function __PRIVATE_synchronizeQueryViewsAndRaiseSnapshots(e, t, n) {\n const r = __PRIVATE_debugCast(e), i = [], s = [];\n for (const e of t) {\n let t;\n const n = r.Ma.get(e);\n if (n && 0 !== n.length) {\n // For queries that have a local View, we fetch their current state\n // from LocalStore (as the resume token and the snapshot version\n // might have changed) and reconcile their views with the persisted\n // state (the list of syncedDocuments may have gotten out of sync).\n t = await __PRIVATE_localStoreAllocateTarget(r.localStore, __PRIVATE_queryToTarget(n[0]));\n for (const e of n) {\n const t = r.Fa.get(e), n = await __PRIVATE_synchronizeViewAndComputeSnapshot(r, t);\n n.snapshot && s.push(n.snapshot);\n }\n } else {\n // For queries that never executed on this client, we need to\n // allocate the target in LocalStore and initialize a new View.\n const n = await __PRIVATE_localStoreGetCachedTarget(r.localStore, e);\n t = await __PRIVATE_localStoreAllocateTarget(r.localStore, n), await __PRIVATE_initializeViewAndComputeSnapshot(r, __PRIVATE_synthesizeTargetToQuery(n), e, \n /*current=*/ !1, t.resumeToken);\n }\n i.push(t);\n }\n return r.Ca.d_(s), i;\n}\n\n/**\n * Creates a `Query` object from the specified `Target`. There is no way to\n * obtain the original `Query`, so we synthesize a `Query` from the `Target`\n * object.\n *\n * The synthesized result might be different from the original `Query`, but\n * since the synthesized `Query` should return the same results as the\n * original one (only the presentation of results might differ), the potential\n * difference will not cause issues.\n */\n// PORTING NOTE: Multi-Tab only.\nfunction __PRIVATE_synthesizeTargetToQuery(e) {\n return __PRIVATE_newQuery(e.path, e.collectionGroup, e.orderBy, e.filters, e.limit, \"F\" /* LimitType.First */ , e.startAt, e.endAt);\n}\n\n/** Returns the IDs of the clients that are currently active. */\n// PORTING NOTE: Multi-Tab only.\nfunction __PRIVATE_syncEngineGetActiveClients(e) {\n return function __PRIVATE_localStoreGetActiveClients(e) {\n return __PRIVATE_debugCast(__PRIVATE_debugCast(e).persistence).Qi();\n }(__PRIVATE_debugCast(e).localStore);\n}\n\n/** Applies a query target change from a different tab. */\n// PORTING NOTE: Multi-Tab only.\nasync function __PRIVATE_syncEngineApplyTargetState(e, t, n, r) {\n const i = __PRIVATE_debugCast(e);\n if (i.Qa) \n // If we receive a target state notification via WebStorage, we are\n // either already secondary or another tab has taken the primary lease.\n return void __PRIVATE_logDebug(\"SyncEngine\", \"Ignoring unexpected query state notification.\");\n const s = i.Ma.get(t);\n if (s && s.length > 0) switch (n) {\n case \"current\":\n case \"not-current\":\n {\n const e = await __PRIVATE_localStoreGetNewDocumentChanges(i.localStore, __PRIVATE_queryCollectionGroup(s[0])), r = RemoteEvent.createSynthesizedRemoteEventForCurrentChange(t, \"current\" === n, ByteString.EMPTY_BYTE_STRING);\n await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(i, e, r);\n break;\n }\n\n case \"rejected\":\n await __PRIVATE_localStoreReleaseTarget(i.localStore, t, \n /* keepPersistedTargetData */ !0), __PRIVATE_removeAndCleanupTarget(i, t, r);\n break;\n\n default:\n fail();\n }\n}\n\n/** Adds or removes Watch targets for queries from different tabs. */ async function __PRIVATE_syncEngineApplyActiveTargetsChange(e, t, n) {\n const r = __PRIVATE_ensureWatchCallbacks(e);\n if (r.Qa) {\n for (const e of t) {\n if (r.Ma.has(e) && r.sharedClientState.isActiveQueryTarget(e)) {\n __PRIVATE_logDebug(\"SyncEngine\", \"Adding an already active target \" + e);\n continue;\n }\n const t = await __PRIVATE_localStoreGetCachedTarget(r.localStore, e), n = await __PRIVATE_localStoreAllocateTarget(r.localStore, t);\n await __PRIVATE_initializeViewAndComputeSnapshot(r, __PRIVATE_synthesizeTargetToQuery(t), n.targetId, \n /*current=*/ !1, n.resumeToken), __PRIVATE_remoteStoreListen(r.remoteStore, n);\n }\n for (const e of n) \n // Check that the target is still active since the target might have been\n // removed if it has been rejected by the backend.\n r.Ma.has(e) && \n // Release queries that are still active.\n await __PRIVATE_localStoreReleaseTarget(r.localStore, e, \n /* keepPersistedTargetData */ !1).then((() => {\n __PRIVATE_remoteStoreUnlisten(r.remoteStore, e), __PRIVATE_removeAndCleanupTarget(r, e);\n })).catch(__PRIVATE_ignoreIfPrimaryLeaseLoss);\n }\n}\n\nfunction __PRIVATE_ensureWatchCallbacks(e) {\n const t = __PRIVATE_debugCast(e);\n return t.remoteStore.remoteSyncer.applyRemoteEvent = __PRIVATE_syncEngineApplyRemoteEvent.bind(null, t), \n t.remoteStore.remoteSyncer.getRemoteKeysForTarget = __PRIVATE_syncEngineGetRemoteKeysForTarget.bind(null, t), \n t.remoteStore.remoteSyncer.rejectListen = __PRIVATE_syncEngineRejectListen.bind(null, t), \n t.Ca.d_ = __PRIVATE_eventManagerOnWatchChange.bind(null, t.eventManager), t.Ca.$a = __PRIVATE_eventManagerOnWatchError.bind(null, t.eventManager), \n t;\n}\n\nfunction __PRIVATE_syncEngineEnsureWriteCallbacks(e) {\n const t = __PRIVATE_debugCast(e);\n return t.remoteStore.remoteSyncer.applySuccessfulWrite = __PRIVATE_syncEngineApplySuccessfulWrite.bind(null, t), \n t.remoteStore.remoteSyncer.rejectFailedWrite = __PRIVATE_syncEngineRejectFailedWrite.bind(null, t), \n t;\n}\n\n/**\n * Loads a Firestore bundle into the SDK. The returned promise resolves when\n * the bundle finished loading.\n *\n * @param syncEngine - SyncEngine to use.\n * @param bundleReader - Bundle to load into the SDK.\n * @param task - LoadBundleTask used to update the loading progress to public API.\n */ function __PRIVATE_syncEngineLoadBundle(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n (\n /** Loads a bundle and returns the list of affected collection groups. */\n async function __PRIVATE_loadBundleImpl(e, t, n) {\n try {\n const r = await t.getMetadata();\n if (await function __PRIVATE_localStoreHasNewerBundle(e, t) {\n const n = __PRIVATE_debugCast(e), r = __PRIVATE_fromVersion(t.createTime);\n return n.persistence.runTransaction(\"hasNewerBundle\", \"readonly\", (e => n.Gr.getBundleMetadata(e, t.id))).then((e => !!e && e.createTime.compareTo(r) >= 0));\n }\n /**\n * Saves the given `BundleMetadata` to local persistence.\n */ (e.localStore, r)) return await t.close(), n._completeWith(function __PRIVATE_bundleSuccessProgress(e) {\n return {\n taskState: \"Success\",\n documentsLoaded: e.totalDocuments,\n bytesLoaded: e.totalBytes,\n totalDocuments: e.totalDocuments,\n totalBytes: e.totalBytes\n };\n }(r)), Promise.resolve(new Set);\n n._updateProgress(__PRIVATE_bundleInitialProgress(r));\n const i = new __PRIVATE_BundleLoader(r, e.localStore, t.serializer);\n let s = await t.Ua();\n for (;s; ) {\n const e = await i.la(s);\n e && n._updateProgress(e), s = await t.Ua();\n }\n const o = await i.complete();\n return await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(e, o.Ia, \n /* remoteEvent */ void 0), \n // Save metadata, so loading the same bundle will skip.\n await function __PRIVATE_localStoreSaveBundle(e, t) {\n const n = __PRIVATE_debugCast(e);\n return n.persistence.runTransaction(\"Save bundle\", \"readwrite\", (e => n.Gr.saveBundleMetadata(e, t)));\n }\n /**\n * Returns a promise of a `NamedQuery` associated with given query name. Promise\n * resolves to undefined if no persisted data can be found.\n */ (e.localStore, r), n._completeWith(o.progress), Promise.resolve(o.Pa);\n } catch (e) {\n return __PRIVATE_logWarn(\"SyncEngine\", `Loading bundle failed with ${e}`), n._failWith(e), \n Promise.resolve(new Set);\n }\n }\n /**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /**\n * Provides all components needed for Firestore with in-memory persistence.\n * Uses EagerGC garbage collection.\n */)(r, t, n).then((e => {\n r.sharedClientState.notifyBundleLoaded(e);\n }));\n}\n\nclass __PRIVATE_MemoryOfflineComponentProvider {\n constructor() {\n this.kind = \"memory\", this.synchronizeTabs = !1;\n }\n async initialize(e) {\n this.serializer = __PRIVATE_newSerializer(e.databaseInfo.databaseId), this.sharedClientState = this.Wa(e), \n this.persistence = this.Ga(e), await this.persistence.start(), this.localStore = this.za(e), \n this.gcScheduler = this.ja(e, this.localStore), this.indexBackfillerScheduler = this.Ha(e, this.localStore);\n }\n ja(e, t) {\n return null;\n }\n Ha(e, t) {\n return null;\n }\n za(e) {\n return __PRIVATE_newLocalStore(this.persistence, new __PRIVATE_QueryEngine, e.initialUser, this.serializer);\n }\n Ga(e) {\n return new __PRIVATE_MemoryPersistence(__PRIVATE_MemoryEagerDelegate.Zr, this.serializer);\n }\n Wa(e) {\n return new __PRIVATE_MemorySharedClientState;\n }\n async terminate() {\n var e, t;\n null === (e = this.gcScheduler) || void 0 === e || e.stop(), null === (t = this.indexBackfillerScheduler) || void 0 === t || t.stop(), \n this.sharedClientState.shutdown(), await this.persistence.shutdown();\n }\n}\n\n__PRIVATE_MemoryOfflineComponentProvider.provider = {\n build: () => new __PRIVATE_MemoryOfflineComponentProvider\n};\n\nclass __PRIVATE_LruGcMemoryOfflineComponentProvider extends __PRIVATE_MemoryOfflineComponentProvider {\n constructor(e) {\n super(), this.cacheSizeBytes = e;\n }\n ja(e, t) {\n __PRIVATE_hardAssert(this.persistence.referenceDelegate instanceof __PRIVATE_MemoryLruDelegate);\n const n = this.persistence.referenceDelegate.garbageCollector;\n return new __PRIVATE_LruScheduler(n, e.asyncQueue, t);\n }\n Ga(e) {\n const t = void 0 !== this.cacheSizeBytes ? LruParams.withCacheSize(this.cacheSizeBytes) : LruParams.DEFAULT;\n return new __PRIVATE_MemoryPersistence((e => __PRIVATE_MemoryLruDelegate.Zr(e, t)), this.serializer);\n }\n}\n\n/**\n * Provides all components needed for Firestore with IndexedDB persistence.\n */ class __PRIVATE_IndexedDbOfflineComponentProvider extends __PRIVATE_MemoryOfflineComponentProvider {\n constructor(e, t, n) {\n super(), this.Ja = e, this.cacheSizeBytes = t, this.forceOwnership = n, this.kind = \"persistent\", \n this.synchronizeTabs = !1;\n }\n async initialize(e) {\n await super.initialize(e), await this.Ja.initialize(this, e), \n // Enqueue writes from a previous session\n await __PRIVATE_syncEngineEnsureWriteCallbacks(this.Ja.syncEngine), await __PRIVATE_fillWritePipeline(this.Ja.remoteStore), \n // NOTE: This will immediately call the listener, so we make sure to\n // set it after localStore / remoteStore are started.\n await this.persistence.yi((() => (this.gcScheduler && !this.gcScheduler.started && this.gcScheduler.start(), \n this.indexBackfillerScheduler && !this.indexBackfillerScheduler.started && this.indexBackfillerScheduler.start(), \n Promise.resolve())));\n }\n za(e) {\n return __PRIVATE_newLocalStore(this.persistence, new __PRIVATE_QueryEngine, e.initialUser, this.serializer);\n }\n ja(e, t) {\n const n = this.persistence.referenceDelegate.garbageCollector;\n return new __PRIVATE_LruScheduler(n, e.asyncQueue, t);\n }\n Ha(e, t) {\n const n = new __PRIVATE_IndexBackfiller(t, this.persistence);\n return new __PRIVATE_IndexBackfillerScheduler(e.asyncQueue, n);\n }\n Ga(e) {\n const t = __PRIVATE_indexedDbStoragePrefix(e.databaseInfo.databaseId, e.databaseInfo.persistenceKey), n = void 0 !== this.cacheSizeBytes ? LruParams.withCacheSize(this.cacheSizeBytes) : LruParams.DEFAULT;\n return new __PRIVATE_IndexedDbPersistence(this.synchronizeTabs, t, e.clientId, n, e.asyncQueue, __PRIVATE_getWindow(), getDocument(), this.serializer, this.sharedClientState, !!this.forceOwnership);\n }\n Wa(e) {\n return new __PRIVATE_MemorySharedClientState;\n }\n}\n\n/**\n * Provides all components needed for Firestore with multi-tab IndexedDB\n * persistence.\n *\n * In the legacy client, this provider is used to provide both multi-tab and\n * non-multi-tab persistence since we cannot tell at build time whether\n * `synchronizeTabs` will be enabled.\n */ class __PRIVATE_MultiTabOfflineComponentProvider extends __PRIVATE_IndexedDbOfflineComponentProvider {\n constructor(e, t) {\n super(e, t, /* forceOwnership= */ !1), this.Ja = e, this.cacheSizeBytes = t, this.synchronizeTabs = !0;\n }\n async initialize(e) {\n await super.initialize(e);\n const t = this.Ja.syncEngine;\n this.sharedClientState instanceof __PRIVATE_WebStorageSharedClientState && (this.sharedClientState.syncEngine = {\n no: __PRIVATE_syncEngineApplyBatchState.bind(null, t),\n ro: __PRIVATE_syncEngineApplyTargetState.bind(null, t),\n io: __PRIVATE_syncEngineApplyActiveTargetsChange.bind(null, t),\n Qi: __PRIVATE_syncEngineGetActiveClients.bind(null, t),\n eo: __PRIVATE_syncEngineSynchronizeWithChangedDocuments.bind(null, t)\n }, await this.sharedClientState.start()), \n // NOTE: This will immediately call the listener, so we make sure to\n // set it after localStore / remoteStore are started.\n await this.persistence.yi((async e => {\n await __PRIVATE_syncEngineApplyPrimaryState(this.Ja.syncEngine, e), this.gcScheduler && (e && !this.gcScheduler.started ? this.gcScheduler.start() : e || this.gcScheduler.stop()), \n this.indexBackfillerScheduler && (e && !this.indexBackfillerScheduler.started ? this.indexBackfillerScheduler.start() : e || this.indexBackfillerScheduler.stop());\n }));\n }\n Wa(e) {\n const t = __PRIVATE_getWindow();\n if (!__PRIVATE_WebStorageSharedClientState.D(t)) throw new FirestoreError(D.UNIMPLEMENTED, \"IndexedDB persistence is only available on platforms that support LocalStorage.\");\n const n = __PRIVATE_indexedDbStoragePrefix(e.databaseInfo.databaseId, e.databaseInfo.persistenceKey);\n return new __PRIVATE_WebStorageSharedClientState(t, e.asyncQueue, n, e.clientId, e.initialUser);\n }\n}\n\n/**\n * Initializes and wires the components that are needed to interface with the\n * network.\n */ class OnlineComponentProvider {\n async initialize(e, t) {\n this.localStore || (this.localStore = e.localStore, this.sharedClientState = e.sharedClientState, \n this.datastore = this.createDatastore(t), this.remoteStore = this.createRemoteStore(t), \n this.eventManager = this.createEventManager(t), this.syncEngine = this.createSyncEngine(t, \n /* startAsPrimary=*/ !e.synchronizeTabs), this.sharedClientState.onlineStateHandler = e => __PRIVATE_syncEngineApplyOnlineStateChange(this.syncEngine, e, 1 /* OnlineStateSource.SharedClientState */), \n this.remoteStore.remoteSyncer.handleCredentialChange = __PRIVATE_syncEngineHandleCredentialChange.bind(null, this.syncEngine), \n await __PRIVATE_remoteStoreApplyPrimaryState(this.remoteStore, this.syncEngine.isPrimaryClient));\n }\n createEventManager(e) {\n return function __PRIVATE_newEventManager() {\n return new __PRIVATE_EventManagerImpl;\n }();\n }\n createDatastore(e) {\n const t = __PRIVATE_newSerializer(e.databaseInfo.databaseId), n = function __PRIVATE_newConnection(e) {\n return new __PRIVATE_WebChannelConnection(e);\n }\n /** Return the Platform-specific connectivity monitor. */ (e.databaseInfo);\n return function __PRIVATE_newDatastore(e, t, n, r) {\n return new __PRIVATE_DatastoreImpl(e, t, n, r);\n }(e.authCredentials, e.appCheckCredentials, n, t);\n }\n createRemoteStore(e) {\n return function __PRIVATE_newRemoteStore(e, t, n, r, i) {\n return new __PRIVATE_RemoteStoreImpl(e, t, n, r, i);\n }\n /** Re-enables the network. Idempotent. */ (this.localStore, this.datastore, e.asyncQueue, (e => __PRIVATE_syncEngineApplyOnlineStateChange(this.syncEngine, e, 0 /* OnlineStateSource.RemoteStore */)), function __PRIVATE_newConnectivityMonitor() {\n return __PRIVATE_BrowserConnectivityMonitor.D() ? new __PRIVATE_BrowserConnectivityMonitor : new __PRIVATE_NoopConnectivityMonitor;\n }());\n }\n createSyncEngine(e, t) {\n return function __PRIVATE_newSyncEngine(e, t, n, \n // PORTING NOTE: Manages state synchronization in multi-tab environments.\n r, i, s, o) {\n const _ = new __PRIVATE_SyncEngineImpl(e, t, n, r, i, s);\n return o && (_.Qa = !0), _;\n }(this.localStore, this.remoteStore, this.eventManager, this.sharedClientState, e.initialUser, e.maxConcurrentLimboResolutions, t);\n }\n async terminate() {\n var e, t;\n await async function __PRIVATE_remoteStoreShutdown(e) {\n const t = __PRIVATE_debugCast(e);\n __PRIVATE_logDebug(\"RemoteStore\", \"RemoteStore shutting down.\"), t.L_.add(5 /* OfflineCause.Shutdown */), \n await __PRIVATE_disableNetworkInternal(t), t.k_.shutdown(), \n // Set the OnlineState to Unknown (rather than Offline) to avoid potentially\n // triggering spurious listener events with cached data, etc.\n t.q_.set(\"Unknown\" /* OnlineState.Unknown */);\n }(this.remoteStore), null === (e = this.datastore) || void 0 === e || e.terminate(), \n null === (t = this.eventManager) || void 0 === t || t.terminate();\n }\n}\n\nOnlineComponentProvider.provider = {\n build: () => new OnlineComponentProvider\n};\n\n/**\n * Builds a `ByteStreamReader` from a UInt8Array.\n * @param source - The data source to use.\n * @param bytesPerRead - How many bytes each `read()` from the returned reader\n * will read.\n */\nfunction __PRIVATE_toByteStreamReaderHelper(e, t = 10240) {\n let n = 0;\n // The TypeScript definition for ReadableStreamReader changed. We use\n // `any` here to allow this code to compile with different versions.\n // See https://github.com/microsoft/TypeScript/issues/42970\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async read() {\n if (n < e.byteLength) {\n const r = {\n value: e.slice(n, n + t),\n done: !1\n };\n return n += t, r;\n }\n return {\n done: !0\n };\n },\n async cancel() {},\n releaseLock() {},\n closed: Promise.resolve()\n };\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * On web, a `ReadableStream` is wrapped around by a `ByteStreamReader`.\n */\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/*\n * A wrapper implementation of Observer that will dispatch events\n * asynchronously. To allow immediate silencing, a mute call is added which\n * causes events scheduled to no longer be raised.\n */\nclass __PRIVATE_AsyncObserver {\n constructor(e) {\n this.observer = e, \n /**\n * When set to true, will not raise future events. Necessary to deal with\n * async detachment of listener.\n */\n this.muted = !1;\n }\n next(e) {\n this.muted || this.observer.next && this.Ya(this.observer.next, e);\n }\n error(e) {\n this.muted || (this.observer.error ? this.Ya(this.observer.error, e) : __PRIVATE_logError(\"Uncaught Error in snapshot listener:\", e.toString()));\n }\n Za() {\n this.muted = !0;\n }\n Ya(e, t) {\n setTimeout((() => {\n this.muted || e(t);\n }), 0);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A class representing a bundle.\n *\n * Takes a bundle stream or buffer, and presents abstractions to read bundled\n * elements out of the underlying content.\n */ class __PRIVATE_BundleReaderImpl {\n constructor(\n /** The reader to read from underlying binary bundle data source. */\n e, t) {\n this.Xa = e, this.serializer = t, \n /** Cached bundle metadata. */\n this.metadata = new __PRIVATE_Deferred, \n /**\n * Internal buffer to hold bundle content, accumulating incomplete element\n * content.\n */\n this.buffer = new Uint8Array, this.eu = function __PRIVATE_newTextDecoder() {\n return new TextDecoder(\"utf-8\");\n }(), \n // Read the metadata (which is the first element).\n this.tu().then((e => {\n e && e.ua() ? this.metadata.resolve(e.aa.metadata) : this.metadata.reject(new Error(`The first element of the bundle is not a metadata, it is\\n ${JSON.stringify(null == e ? void 0 : e.aa)}`));\n }), (e => this.metadata.reject(e)));\n }\n close() {\n return this.Xa.cancel();\n }\n async getMetadata() {\n return this.metadata.promise;\n }\n async Ua() {\n // Makes sure metadata is read before proceeding.\n return await this.getMetadata(), this.tu();\n }\n /**\n * Reads from the head of internal buffer, and pulling more data from\n * underlying stream if a complete element cannot be found, until an\n * element(including the prefixed length and the JSON string) is found.\n *\n * Once a complete element is read, it is dropped from internal buffer.\n *\n * Returns either the bundled element, or null if we have reached the end of\n * the stream.\n */ async tu() {\n const e = await this.nu();\n if (null === e) return null;\n const t = this.eu.decode(e), n = Number(t);\n isNaN(n) && this.ru(`length string (${t}) is not valid number`);\n const r = await this.iu(n);\n return new __PRIVATE_SizedBundleElement(JSON.parse(r), e.length + n);\n }\n /** First index of '{' from the underlying buffer. */ su() {\n return this.buffer.findIndex((e => e === \"{\".charCodeAt(0)));\n }\n /**\n * Reads from the beginning of the internal buffer, until the first '{', and\n * return the content.\n *\n * If reached end of the stream, returns a null.\n */ async nu() {\n for (;this.su() < 0; ) {\n if (await this.ou()) break;\n }\n // Broke out of the loop because underlying stream is closed, and there\n // happens to be no more data to process.\n if (0 === this.buffer.length) return null;\n const e = this.su();\n // Broke out of the loop because underlying stream is closed, but still\n // cannot find an open bracket.\n e < 0 && this.ru(\"Reached the end of bundle when a length string is expected.\");\n const t = this.buffer.slice(0, e);\n // Update the internal buffer to drop the read length.\n return this.buffer = this.buffer.slice(e), t;\n }\n /**\n * Reads from a specified position from the internal buffer, for a specified\n * number of bytes, pulling more data from the underlying stream if needed.\n *\n * Returns a string decoded from the read bytes.\n */ async iu(e) {\n for (;this.buffer.length < e; ) {\n await this.ou() && this.ru(\"Reached the end of bundle when more is expected.\");\n }\n const t = this.eu.decode(this.buffer.slice(0, e));\n // Update the internal buffer to drop the read json string.\n return this.buffer = this.buffer.slice(e), t;\n }\n ru(e) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n throw this.Xa.cancel(), new Error(`Invalid bundle format: ${e}`);\n }\n /**\n * Pulls more data from underlying stream to internal buffer.\n * Returns a boolean indicating whether the stream is finished.\n */ async ou() {\n const e = await this.Xa.read();\n if (!e.done) {\n const t = new Uint8Array(this.buffer.length + e.value.length);\n t.set(this.buffer), t.set(e.value, this.buffer.length), this.buffer = t;\n }\n return e.done;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Internal transaction object responsible for accumulating the mutations to\n * perform and the base versions for any documents read.\n */\nclass Transaction$2 {\n constructor(e) {\n this.datastore = e, \n // The version of each document that was read during this transaction.\n this.readVersions = new Map, this.mutations = [], this.committed = !1, \n /**\n * A deferred usage error that occurred previously in this transaction that\n * will cause the transaction to fail once it actually commits.\n */\n this.lastTransactionError = null, \n /**\n * Set of documents that have been written in the transaction.\n *\n * When there's more than one write to the same key in a transaction, any\n * writes after the first are handled differently.\n */\n this.writtenDocs = new Set;\n }\n async lookup(e) {\n if (this.ensureCommitNotCalled(), this.mutations.length > 0) throw this.lastTransactionError = new FirestoreError(D.INVALID_ARGUMENT, \"Firestore transactions require all reads to be executed before all writes.\"), \n this.lastTransactionError;\n const t = await async function __PRIVATE_invokeBatchGetDocumentsRpc(e, t) {\n const n = __PRIVATE_debugCast(e), r = {\n documents: t.map((e => __PRIVATE_toName(n.serializer, e)))\n }, i = await n.Lo(\"BatchGetDocuments\", n.serializer.databaseId, ResourcePath.emptyPath(), r, t.length), s = new Map;\n i.forEach((e => {\n const t = __PRIVATE_fromBatchGetDocumentsResponse(n.serializer, e);\n s.set(t.key.toString(), t);\n }));\n const o = [];\n return t.forEach((e => {\n const t = s.get(e.toString());\n __PRIVATE_hardAssert(!!t), o.push(t);\n })), o;\n }(this.datastore, e);\n return t.forEach((e => this.recordVersion(e))), t;\n }\n set(e, t) {\n this.write(t.toMutation(e, this.precondition(e))), this.writtenDocs.add(e.toString());\n }\n update(e, t) {\n try {\n this.write(t.toMutation(e, this.preconditionForUpdate(e)));\n } catch (e) {\n this.lastTransactionError = e;\n }\n this.writtenDocs.add(e.toString());\n }\n delete(e) {\n this.write(new __PRIVATE_DeleteMutation(e, this.precondition(e))), this.writtenDocs.add(e.toString());\n }\n async commit() {\n if (this.ensureCommitNotCalled(), this.lastTransactionError) throw this.lastTransactionError;\n const e = this.readVersions;\n // For each mutation, note that the doc was written.\n this.mutations.forEach((t => {\n e.delete(t.key.toString());\n })), \n // For each document that was read but not written to, we want to perform\n // a `verify` operation.\n e.forEach(((e, t) => {\n const n = DocumentKey.fromPath(t);\n this.mutations.push(new __PRIVATE_VerifyMutation(n, this.precondition(n)));\n })), await async function __PRIVATE_invokeCommitRpc(e, t) {\n const n = __PRIVATE_debugCast(e), r = {\n writes: t.map((e => toMutation(n.serializer, e)))\n };\n await n.Mo(\"Commit\", n.serializer.databaseId, ResourcePath.emptyPath(), r);\n }(this.datastore, this.mutations), this.committed = !0;\n }\n recordVersion(e) {\n let t;\n if (e.isFoundDocument()) t = e.version; else {\n if (!e.isNoDocument()) throw fail();\n // Represent a deleted doc using SnapshotVersion.min().\n t = SnapshotVersion.min();\n }\n const n = this.readVersions.get(e.key.toString());\n if (n) {\n if (!t.isEqual(n)) \n // This transaction will fail no matter what.\n throw new FirestoreError(D.ABORTED, \"Document version changed between two reads.\");\n } else this.readVersions.set(e.key.toString(), t);\n }\n /**\n * Returns the version of this document when it was read in this transaction,\n * as a precondition, or no precondition if it was not read.\n */ precondition(e) {\n const t = this.readVersions.get(e.toString());\n return !this.writtenDocs.has(e.toString()) && t ? t.isEqual(SnapshotVersion.min()) ? Precondition.exists(!1) : Precondition.updateTime(t) : Precondition.none();\n }\n /**\n * Returns the precondition for a document if the operation is an update.\n */ preconditionForUpdate(e) {\n const t = this.readVersions.get(e.toString());\n // The first time a document is written, we want to take into account the\n // read time and existence\n if (!this.writtenDocs.has(e.toString()) && t) {\n if (t.isEqual(SnapshotVersion.min())) \n // The document doesn't exist, so fail the transaction.\n // This has to be validated locally because you can't send a\n // precondition that a document does not exist without changing the\n // semantics of the backend write to be an insert. This is the reverse\n // of what we want, since we want to assert that the document doesn't\n // exist but then send the update and have it fail. Since we can't\n // express that to the backend, we have to validate locally.\n // Note: this can change once we can send separate verify writes in the\n // transaction.\n throw new FirestoreError(D.INVALID_ARGUMENT, \"Can't update a document that doesn't exist.\");\n // Document exists, base precondition on document update time.\n return Precondition.updateTime(t);\n }\n // Document was not read, so we just use the preconditions for a blind\n // update.\n return Precondition.exists(!0);\n }\n write(e) {\n this.ensureCommitNotCalled(), this.mutations.push(e);\n }\n ensureCommitNotCalled() {}\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * TransactionRunner encapsulates the logic needed to run and retry transactions\n * with backoff.\n */ class __PRIVATE_TransactionRunner {\n constructor(e, t, n, r, i) {\n this.asyncQueue = e, this.datastore = t, this.options = n, this.updateFunction = r, \n this.deferred = i, this._u = n.maxAttempts, this.t_ = new __PRIVATE_ExponentialBackoff(this.asyncQueue, \"transaction_retry\" /* TimerId.TransactionRetry */);\n }\n /** Runs the transaction and sets the result on deferred. */ au() {\n this._u -= 1, this.uu();\n }\n uu() {\n this.t_.Go((async () => {\n const e = new Transaction$2(this.datastore), t = this.cu(e);\n t && t.then((t => {\n this.asyncQueue.enqueueAndForget((() => e.commit().then((() => {\n this.deferred.resolve(t);\n })).catch((e => {\n this.lu(e);\n }))));\n })).catch((e => {\n this.lu(e);\n }));\n }));\n }\n cu(e) {\n try {\n const t = this.updateFunction(e);\n return !__PRIVATE_isNullOrUndefined(t) && t.catch && t.then ? t : (this.deferred.reject(Error(\"Transaction callback must return a Promise\")), \n null);\n } catch (e) {\n // Do not retry errors thrown by user provided updateFunction.\n return this.deferred.reject(e), null;\n }\n }\n lu(e) {\n this._u > 0 && this.hu(e) ? (this._u -= 1, this.asyncQueue.enqueueAndForget((() => (this.uu(), \n Promise.resolve())))) : this.deferred.reject(e);\n }\n hu(e) {\n if (\"FirebaseError\" === e.name) {\n // In transactions, the backend will fail outdated reads with FAILED_PRECONDITION and\n // non-matching document versions with ABORTED. These errors should be retried.\n const t = e.code;\n return \"aborted\" === t || \"failed-precondition\" === t || \"already-exists\" === t || !__PRIVATE_isPermanentError(t);\n }\n return !1;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * FirestoreClient is a top-level class that constructs and owns all of the //\n * pieces of the client SDK architecture. It is responsible for creating the //\n * async queue that is shared by all of the other components in the system. //\n */\nclass FirestoreClient {\n constructor(e, t, \n /**\n * Asynchronous queue responsible for all of our internal processing. When\n * we get incoming work from the user (via public API) or the network\n * (incoming GRPC messages), we should always schedule onto this queue.\n * This ensures all of our work is properly serialized (e.g. we don't\n * start processing a new operation while the previous one is waiting for\n * an async I/O to complete).\n */\n n, r, i) {\n this.authCredentials = e, this.appCheckCredentials = t, this.asyncQueue = n, this.databaseInfo = r, \n this.user = User.UNAUTHENTICATED, this.clientId = __PRIVATE_AutoId.newId(), this.authCredentialListener = () => Promise.resolve(), \n this.appCheckCredentialListener = () => Promise.resolve(), this._uninitializedComponentsProvider = i, \n this.authCredentials.start(n, (async e => {\n __PRIVATE_logDebug(\"FirestoreClient\", \"Received user=\", e.uid), await this.authCredentialListener(e), \n this.user = e;\n })), this.appCheckCredentials.start(n, (e => (__PRIVATE_logDebug(\"FirestoreClient\", \"Received new app check token=\", e), \n this.appCheckCredentialListener(e, this.user))));\n }\n get configuration() {\n return {\n asyncQueue: this.asyncQueue,\n databaseInfo: this.databaseInfo,\n clientId: this.clientId,\n authCredentials: this.authCredentials,\n appCheckCredentials: this.appCheckCredentials,\n initialUser: this.user,\n maxConcurrentLimboResolutions: 100\n };\n }\n setCredentialChangeListener(e) {\n this.authCredentialListener = e;\n }\n setAppCheckTokenChangeListener(e) {\n this.appCheckCredentialListener = e;\n }\n terminate() {\n this.asyncQueue.enterRestrictedMode();\n const e = new __PRIVATE_Deferred;\n return this.asyncQueue.enqueueAndForgetEvenWhileRestricted((async () => {\n try {\n this._onlineComponents && await this._onlineComponents.terminate(), this._offlineComponents && await this._offlineComponents.terminate(), \n // The credentials provider must be terminated after shutting down the\n // RemoteStore as it will prevent the RemoteStore from retrieving auth\n // tokens.\n this.authCredentials.shutdown(), this.appCheckCredentials.shutdown(), e.resolve();\n } catch (t) {\n const n = __PRIVATE_wrapInUserErrorIfRecoverable(t, \"Failed to shutdown persistence\");\n e.reject(n);\n }\n })), e.promise;\n }\n}\n\nasync function __PRIVATE_setOfflineComponentProvider(e, t) {\n e.asyncQueue.verifyOperationInProgress(), __PRIVATE_logDebug(\"FirestoreClient\", \"Initializing OfflineComponentProvider\");\n const n = e.configuration;\n await t.initialize(n);\n let r = n.initialUser;\n e.setCredentialChangeListener((async e => {\n r.isEqual(e) || (await __PRIVATE_localStoreHandleUserChange(t.localStore, e), r = e);\n })), \n // When a user calls clearPersistence() in one client, all other clients\n // need to be terminated to allow the delete to succeed.\n t.persistence.setDatabaseDeletedListener((() => e.terminate())), e._offlineComponents = t;\n}\n\nasync function __PRIVATE_setOnlineComponentProvider(e, t) {\n e.asyncQueue.verifyOperationInProgress();\n const n = await __PRIVATE_ensureOfflineComponents(e);\n __PRIVATE_logDebug(\"FirestoreClient\", \"Initializing OnlineComponentProvider\"), await t.initialize(n, e.configuration), \n // The CredentialChangeListener of the online component provider takes\n // precedence over the offline component provider.\n e.setCredentialChangeListener((e => __PRIVATE_remoteStoreHandleCredentialChange(t.remoteStore, e))), \n e.setAppCheckTokenChangeListener(((e, n) => __PRIVATE_remoteStoreHandleCredentialChange(t.remoteStore, n))), \n e._onlineComponents = t;\n}\n\n/**\n * Decides whether the provided error allows us to gracefully disable\n * persistence (as opposed to crashing the client).\n */ async function __PRIVATE_ensureOfflineComponents(e) {\n if (!e._offlineComponents) if (e._uninitializedComponentsProvider) {\n __PRIVATE_logDebug(\"FirestoreClient\", \"Using user provided OfflineComponentProvider\");\n try {\n await __PRIVATE_setOfflineComponentProvider(e, e._uninitializedComponentsProvider._offline);\n } catch (t) {\n const n = t;\n if (!function __PRIVATE_canFallbackFromIndexedDbError(e) {\n return \"FirebaseError\" === e.name ? e.code === D.FAILED_PRECONDITION || e.code === D.UNIMPLEMENTED : !(\"undefined\" != typeof DOMException && e instanceof DOMException) || \n // When the browser is out of quota we could get either quota exceeded\n // or an aborted error depending on whether the error happened during\n // schema migration.\n 22 === e.code || 20 === e.code || \n // Firefox Private Browsing mode disables IndexedDb and returns\n // INVALID_STATE for any usage.\n 11 === e.code;\n }(n)) throw n;\n __PRIVATE_logWarn(\"Error using user provided cache. Falling back to memory cache: \" + n), \n await __PRIVATE_setOfflineComponentProvider(e, new __PRIVATE_MemoryOfflineComponentProvider);\n }\n } else __PRIVATE_logDebug(\"FirestoreClient\", \"Using default OfflineComponentProvider\"), \n await __PRIVATE_setOfflineComponentProvider(e, new __PRIVATE_MemoryOfflineComponentProvider);\n return e._offlineComponents;\n}\n\nasync function __PRIVATE_ensureOnlineComponents(e) {\n return e._onlineComponents || (e._uninitializedComponentsProvider ? (__PRIVATE_logDebug(\"FirestoreClient\", \"Using user provided OnlineComponentProvider\"), \n await __PRIVATE_setOnlineComponentProvider(e, e._uninitializedComponentsProvider._online)) : (__PRIVATE_logDebug(\"FirestoreClient\", \"Using default OnlineComponentProvider\"), \n await __PRIVATE_setOnlineComponentProvider(e, new OnlineComponentProvider))), e._onlineComponents;\n}\n\nfunction __PRIVATE_getPersistence(e) {\n return __PRIVATE_ensureOfflineComponents(e).then((e => e.persistence));\n}\n\nfunction __PRIVATE_getLocalStore(e) {\n return __PRIVATE_ensureOfflineComponents(e).then((e => e.localStore));\n}\n\nfunction __PRIVATE_getRemoteStore(e) {\n return __PRIVATE_ensureOnlineComponents(e).then((e => e.remoteStore));\n}\n\nfunction __PRIVATE_getSyncEngine(e) {\n return __PRIVATE_ensureOnlineComponents(e).then((e => e.syncEngine));\n}\n\nfunction __PRIVATE_getDatastore(e) {\n return __PRIVATE_ensureOnlineComponents(e).then((e => e.datastore));\n}\n\nasync function __PRIVATE_getEventManager(e) {\n const t = await __PRIVATE_ensureOnlineComponents(e), n = t.eventManager;\n return n.onListen = __PRIVATE_syncEngineListen.bind(null, t.syncEngine), n.onUnlisten = __PRIVATE_syncEngineUnlisten.bind(null, t.syncEngine), \n n.onFirstRemoteStoreListen = __PRIVATE_triggerRemoteStoreListen.bind(null, t.syncEngine), \n n.onLastRemoteStoreUnlisten = __PRIVATE_triggerRemoteStoreUnlisten.bind(null, t.syncEngine), \n n;\n}\n\n/** Enables the network connection and re-enqueues all pending operations. */ function __PRIVATE_firestoreClientEnableNetwork(e) {\n return e.asyncQueue.enqueue((async () => {\n const t = await __PRIVATE_getPersistence(e), n = await __PRIVATE_getRemoteStore(e);\n return t.setNetworkEnabled(!0), function __PRIVATE_remoteStoreEnableNetwork(e) {\n const t = __PRIVATE_debugCast(e);\n return t.L_.delete(0 /* OfflineCause.UserDisabled */), __PRIVATE_enableNetworkInternal(t);\n }(n);\n }));\n}\n\n/** Disables the network connection. Pending operations will not complete. */ function __PRIVATE_firestoreClientDisableNetwork(e) {\n return e.asyncQueue.enqueue((async () => {\n const t = await __PRIVATE_getPersistence(e), n = await __PRIVATE_getRemoteStore(e);\n return t.setNetworkEnabled(!1), async function __PRIVATE_remoteStoreDisableNetwork(e) {\n const t = __PRIVATE_debugCast(e);\n t.L_.add(0 /* OfflineCause.UserDisabled */), await __PRIVATE_disableNetworkInternal(t), \n // Set the OnlineState to Offline so get()s return from cache, etc.\n t.q_.set(\"Offline\" /* OnlineState.Offline */);\n }(n);\n }));\n}\n\n/**\n * Returns a Promise that resolves when all writes that were pending at the time\n * this method was called received server acknowledgement. An acknowledgement\n * can be either acceptance or rejection.\n */ function __PRIVATE_firestoreClientGetDocumentFromLocalCache(e, t) {\n const n = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => async function __PRIVATE_readDocumentFromCache(e, t, n) {\n try {\n const r = await function __PRIVATE_localStoreReadDocument(e, t) {\n const n = __PRIVATE_debugCast(e);\n return n.persistence.runTransaction(\"read document\", \"readonly\", (e => n.localDocuments.getDocument(e, t)));\n }(e, t);\n r.isFoundDocument() ? n.resolve(r) : r.isNoDocument() ? n.resolve(null) : n.reject(new FirestoreError(D.UNAVAILABLE, \"Failed to get document from cache. (However, this document may exist on the server. Run again without setting 'source' in the GetOptions to attempt to retrieve the document from the server.)\"));\n } catch (e) {\n const r = __PRIVATE_wrapInUserErrorIfRecoverable(e, `Failed to get document '${t} from cache`);\n n.reject(r);\n }\n }\n /**\n * Retrieves a latency-compensated document from the backend via a\n * SnapshotListener.\n */ (await __PRIVATE_getLocalStore(e), t, n))), n.promise;\n}\n\nfunction __PRIVATE_firestoreClientGetDocumentViaSnapshotListener(e, t, n = {}) {\n const r = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => function __PRIVATE_readDocumentViaSnapshotListener(e, t, n, r, i) {\n const s = new __PRIVATE_AsyncObserver({\n next: _ => {\n // Mute and remove query first before passing event to user to avoid\n // user actions affecting the now stale query.\n s.Za(), t.enqueueAndForget((() => __PRIVATE_eventManagerUnlisten(e, o)));\n const a = _.docs.has(n);\n !a && _.fromCache ? \n // TODO(dimond): If we're online and the document doesn't\n // exist then we resolve with a doc.exists set to false. If\n // we're offline however, we reject the Promise in this\n // case. Two options: 1) Cache the negative response from\n // the server so we can deliver that even when you're\n // offline 2) Actually reject the Promise in the online case\n // if the document doesn't exist.\n i.reject(new FirestoreError(D.UNAVAILABLE, \"Failed to get document because the client is offline.\")) : a && _.fromCache && r && \"server\" === r.source ? i.reject(new FirestoreError(D.UNAVAILABLE, 'Failed to get document from server. (However, this document does exist in the local cache. Run again without setting source to \"server\" to retrieve the cached document.)')) : i.resolve(_);\n },\n error: e => i.reject(e)\n }), o = new __PRIVATE_QueryListener(__PRIVATE_newQueryForPath(n.path), s, {\n includeMetadataChanges: !0,\n _a: !0\n });\n return __PRIVATE_eventManagerListen(e, o);\n }(await __PRIVATE_getEventManager(e), e.asyncQueue, t, n, r))), r.promise;\n}\n\nfunction __PRIVATE_firestoreClientGetDocumentsFromLocalCache(e, t) {\n const n = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => async function __PRIVATE_executeQueryFromCache(e, t, n) {\n try {\n const r = await __PRIVATE_localStoreExecuteQuery(e, t, \n /* usePreviousResults= */ !0), i = new __PRIVATE_View(t, r.Ts), s = i.ma(r.documents), o = i.applyChanges(s, \n /* limboResolutionEnabled= */ !1);\n n.resolve(o.snapshot);\n } catch (e) {\n const r = __PRIVATE_wrapInUserErrorIfRecoverable(e, `Failed to execute query '${t} against cache`);\n n.reject(r);\n }\n }\n /**\n * Retrieves a latency-compensated query snapshot from the backend via a\n * SnapshotListener.\n */ (await __PRIVATE_getLocalStore(e), t, n))), n.promise;\n}\n\nfunction __PRIVATE_firestoreClientGetDocumentsViaSnapshotListener(e, t, n = {}) {\n const r = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => function __PRIVATE_executeQueryViaSnapshotListener(e, t, n, r, i) {\n const s = new __PRIVATE_AsyncObserver({\n next: n => {\n // Mute and remove query first before passing event to user to avoid\n // user actions affecting the now stale query.\n s.Za(), t.enqueueAndForget((() => __PRIVATE_eventManagerUnlisten(e, o))), n.fromCache && \"server\" === r.source ? i.reject(new FirestoreError(D.UNAVAILABLE, 'Failed to get documents from server. (However, these documents may exist in the local cache. Run again without setting source to \"server\" to retrieve the cached documents.)')) : i.resolve(n);\n },\n error: e => i.reject(e)\n }), o = new __PRIVATE_QueryListener(n, s, {\n includeMetadataChanges: !0,\n _a: !0\n });\n return __PRIVATE_eventManagerListen(e, o);\n }(await __PRIVATE_getEventManager(e), e.asyncQueue, t, n, r))), r.promise;\n}\n\nfunction __PRIVATE_firestoreClientRunAggregateQuery(e, t, n) {\n const r = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => {\n // Implement and call executeAggregateQueryViaSnapshotListener, similar\n // to the implementation in firestoreClientGetDocumentsViaSnapshotListener\n // above\n try {\n // TODO(b/277628384): check `canUseNetwork()` and handle multi-tab.\n const i = await __PRIVATE_getDatastore(e);\n r.resolve(async function __PRIVATE_invokeRunAggregationQueryRpc(e, t, n) {\n var r;\n const i = __PRIVATE_debugCast(e), {request: s, ut: o, parent: _} = __PRIVATE_toRunAggregationQueryRequest(i.serializer, __PRIVATE_queryToAggregateTarget(t), n);\n i.connection.Fo || delete s.parent;\n const a = (await i.Lo(\"RunAggregationQuery\", i.serializer.databaseId, _, s, \n /*expectedResponseCount=*/ 1)).filter((e => !!e.result));\n // Omit RunAggregationQueryResponse that only contain readTimes.\n __PRIVATE_hardAssert(1 === a.length);\n // Remap the short-form aliases that were sent to the server\n // to the client-side aliases. Users will access the results\n // using the client-side alias.\n const u = null === (r = a[0].result) || void 0 === r ? void 0 : r.aggregateFields;\n return Object.keys(u).reduce(((e, t) => (e[o[t]] = u[t], e)), {});\n }(i, t, n));\n } catch (e) {\n r.reject(e);\n }\n })), r.promise;\n}\n\nfunction __PRIVATE_firestoreClientAddSnapshotsInSyncListener(e, t) {\n const n = new __PRIVATE_AsyncObserver(t);\n return e.asyncQueue.enqueueAndForget((async () => function __PRIVATE_addSnapshotsInSyncListener(e, t) {\n __PRIVATE_debugCast(e).Y_.add(t), \n // Immediately fire an initial event, indicating all existing listeners\n // are in-sync.\n t.next();\n }(await __PRIVATE_getEventManager(e), n))), () => {\n n.Za(), e.asyncQueue.enqueueAndForget((async () => function __PRIVATE_removeSnapshotsInSyncListener(e, t) {\n __PRIVATE_debugCast(e).Y_.delete(t);\n }(await __PRIVATE_getEventManager(e), n)));\n };\n}\n\n/**\n * Takes an updateFunction in which a set of reads and writes can be performed\n * atomically. In the updateFunction, the client can read and write values\n * using the supplied transaction object. After the updateFunction, all\n * changes will be committed. If a retryable error occurs (ex: some other\n * client has changed any of the data referenced), then the updateFunction\n * will be called again after a backoff. If the updateFunction still fails\n * after all retries, then the transaction will be rejected.\n *\n * The transaction object passed to the updateFunction contains methods for\n * accessing documents and collections. Unlike other datastore access, data\n * accessed with the transaction will not reflect local changes that have not\n * been committed. For this reason, it is required that all reads are\n * performed before any writes. Transactions must be performed while online.\n */ function __PRIVATE_firestoreClientLoadBundle(e, t, n, r) {\n const i = function __PRIVATE_createBundleReader(e, t) {\n let n;\n n = \"string\" == typeof e ? __PRIVATE_newTextEncoder().encode(e) : e;\n return function __PRIVATE_newBundleReader(e, t) {\n return new __PRIVATE_BundleReaderImpl(e, t);\n }(function __PRIVATE_toByteStreamReader(e, t) {\n if (e instanceof Uint8Array) return __PRIVATE_toByteStreamReaderHelper(e, t);\n if (e instanceof ArrayBuffer) return __PRIVATE_toByteStreamReaderHelper(new Uint8Array(e), t);\n if (e instanceof ReadableStream) return e.getReader();\n throw new Error(\"Source of `toByteStreamReader` has to be a ArrayBuffer or ReadableStream\");\n }(n), t);\n }(n, __PRIVATE_newSerializer(t));\n e.asyncQueue.enqueueAndForget((async () => {\n __PRIVATE_syncEngineLoadBundle(await __PRIVATE_getSyncEngine(e), i, r);\n }));\n}\n\nfunction __PRIVATE_firestoreClientGetNamedQuery(e, t) {\n return e.asyncQueue.enqueue((async () => function __PRIVATE_localStoreGetNamedQuery(e, t) {\n const n = __PRIVATE_debugCast(e);\n return n.persistence.runTransaction(\"Get named query\", \"readonly\", (e => n.Gr.getNamedQuery(e, t)));\n }(await __PRIVATE_getLocalStore(e), t)));\n}\n\nfunction __PRIVATE_firestoreClientSetIndexConfiguration(e, t) {\n return e.asyncQueue.enqueue((async () => async function __PRIVATE_localStoreConfigureFieldIndexes(e, t) {\n const n = __PRIVATE_debugCast(e), r = n.indexManager, i = [];\n return n.persistence.runTransaction(\"Configure indexes\", \"readwrite\", (e => r.getFieldIndexes(e).next((n => \n /**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /**\n * Compares two array for equality using comparator. The method computes the\n * intersection and invokes `onAdd` for every element that is in `after` but not\n * `before`. `onRemove` is invoked for every element in `before` but missing\n * from `after`.\n *\n * The method creates a copy of both `before` and `after` and runs in O(n log\n * n), where n is the size of the two lists.\n *\n * @param before - The elements that exist in the original array.\n * @param after - The elements to diff against the original array.\n * @param comparator - The comparator for the elements in before and after.\n * @param onAdd - A function to invoke for every element that is part of `\n * after` but not `before`.\n * @param onRemove - A function to invoke for every element that is part of\n * `before` but not `after`.\n */\n function __PRIVATE_diffArrays(e, t, n, r, i) {\n e = [ ...e ], t = [ ...t ], e.sort(n), t.sort(n);\n const s = e.length, o = t.length;\n let _ = 0, a = 0;\n for (;_ < o && a < s; ) {\n const s = n(e[a], t[_]);\n s < 0 ? \n // The element was removed if the next element in our ordered\n // walkthrough is only in `before`.\n i(e[a++]) : s > 0 ? \n // The element was added if the next element in our ordered walkthrough\n // is only in `after`.\n r(t[_++]) : (_++, a++);\n }\n for (;_ < o; ) r(t[_++]);\n for (;a < s; ) i(e[a++]);\n }\n /**\n * Verifies equality for an array of primitives.\n *\n * @private\n * @internal\n * @param left Array of primitives.\n * @param right Array of primitives.\n * @return True if arrays are equal.\n */ (n, t, __PRIVATE_fieldIndexSemanticComparator, (t => {\n i.push(r.addFieldIndex(e, t));\n }), (t => {\n i.push(r.deleteFieldIndex(e, t));\n })))).next((() => PersistencePromise.waitFor(i)))));\n }(await __PRIVATE_getLocalStore(e), t)));\n}\n\nfunction __PRIVATE_firestoreClientSetPersistentCacheIndexAutoCreationEnabled(e, t) {\n return e.asyncQueue.enqueue((async () => function __PRIVATE_localStoreSetIndexAutoCreationEnabled(e, t) {\n __PRIVATE_debugCast(e).ss.zi = t;\n }(await __PRIVATE_getLocalStore(e), t)));\n}\n\nfunction __PRIVATE_firestoreClientDeleteAllFieldIndexes(e) {\n return e.asyncQueue.enqueue((async () => function __PRIVATE_localStoreDeleteAllFieldIndexes(e) {\n const t = __PRIVATE_debugCast(e), n = t.indexManager;\n return t.persistence.runTransaction(\"Delete All Indexes\", \"readwrite\", (e => n.deleteAllFieldIndexes(e)));\n }\n /**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n // The format of the LocalStorage key that stores the client state is:\n // firestore_clients__\n (await __PRIVATE_getLocalStore(e))));\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Compares two `ExperimentalLongPollingOptions` objects for equality.\n */\n/**\n * Creates and returns a new `ExperimentalLongPollingOptions` with the same\n * option values as the given instance.\n */\nfunction __PRIVATE_cloneLongPollingOptions(e) {\n const t = {};\n return void 0 !== e.timeoutSeconds && (t.timeoutSeconds = e.timeoutSeconds), t;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const we = new Map;\n\n/**\n * An instance map that ensures only one Datastore exists per Firestore\n * instance.\n */\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction __PRIVATE_validateNonEmptyArgument(e, t, n) {\n if (!n) throw new FirestoreError(D.INVALID_ARGUMENT, `Function ${e}() cannot be called with an empty ${t}.`);\n}\n\n/**\n * Validates that two boolean options are not set at the same time.\n * @internal\n */ function __PRIVATE_validateIsNotUsedTogether(e, t, n, r) {\n if (!0 === t && !0 === r) throw new FirestoreError(D.INVALID_ARGUMENT, `${e} and ${n} cannot be used together.`);\n}\n\n/**\n * Validates that `path` refers to a document (indicated by the fact it contains\n * an even numbers of segments).\n */ function __PRIVATE_validateDocumentPath(e) {\n if (!DocumentKey.isDocumentKey(e)) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid document reference. Document references must have an even number of segments, but ${e} has ${e.length}.`);\n}\n\n/**\n * Validates that `path` refers to a collection (indicated by the fact it\n * contains an odd numbers of segments).\n */ function __PRIVATE_validateCollectionPath(e) {\n if (DocumentKey.isDocumentKey(e)) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid collection reference. Collection references must have an odd number of segments, but ${e} has ${e.length}.`);\n}\n\n/**\n * Returns true if it's a non-null object without a custom prototype\n * (i.e. excludes Array, Date, etc.).\n */\n/** Returns a string describing the type / value of the provided input. */\nfunction __PRIVATE_valueDescription(e) {\n if (void 0 === e) return \"undefined\";\n if (null === e) return \"null\";\n if (\"string\" == typeof e) return e.length > 20 && (e = `${e.substring(0, 20)}...`), \n JSON.stringify(e);\n if (\"number\" == typeof e || \"boolean\" == typeof e) return \"\" + e;\n if (\"object\" == typeof e) {\n if (e instanceof Array) return \"an array\";\n {\n const t = \n /** try to get the constructor name for an object. */\n function __PRIVATE_tryGetCustomObjectType(e) {\n if (e.constructor) return e.constructor.name;\n return null;\n }\n /**\n * Casts `obj` to `T`, optionally unwrapping Compat types to expose the\n * underlying instance. Throws if `obj` is not an instance of `T`.\n *\n * This cast is used in the Lite and Full SDK to verify instance types for\n * arguments passed to the public API.\n * @internal\n */ (e);\n return t ? `a custom ${t} object` : \"an object\";\n }\n }\n return \"function\" == typeof e ? \"a function\" : fail();\n}\n\nfunction __PRIVATE_cast(e, \n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nt) {\n if (\"_delegate\" in e && (\n // Unwrap Compat types\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n e = e._delegate), !(e instanceof t)) {\n if (t.name === e.constructor.name) throw new FirestoreError(D.INVALID_ARGUMENT, \"Type does not match the expected instance. Did you pass a reference from a different Firestore SDK?\");\n {\n const n = __PRIVATE_valueDescription(e);\n throw new FirestoreError(D.INVALID_ARGUMENT, `Expected type '${t.name}', but it was: ${n}`);\n }\n }\n return e;\n}\n\nfunction __PRIVATE_validatePositiveNumber(e, t) {\n if (t <= 0) throw new FirestoreError(D.INVALID_ARGUMENT, `Function ${e}() requires a positive number, but it was: ${t}.`);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// settings() defaults:\n/**\n * A concrete type describing all the values that can be applied via a\n * user-supplied `FirestoreSettings` object. This is a separate type so that\n * defaults can be supplied and the value can be checked for equality.\n */\nclass FirestoreSettingsImpl {\n constructor(e) {\n var t, n;\n if (void 0 === e.host) {\n if (void 0 !== e.ssl) throw new FirestoreError(D.INVALID_ARGUMENT, \"Can't provide ssl option if host option is not set\");\n this.host = \"firestore.googleapis.com\", this.ssl = true;\n } else this.host = e.host, this.ssl = null === (t = e.ssl) || void 0 === t || t;\n if (this.credentials = e.credentials, this.ignoreUndefinedProperties = !!e.ignoreUndefinedProperties, \n this.localCache = e.localCache, void 0 === e.cacheSizeBytes) this.cacheSizeBytes = 41943040; else {\n if (-1 !== e.cacheSizeBytes && e.cacheSizeBytes < 1048576) throw new FirestoreError(D.INVALID_ARGUMENT, \"cacheSizeBytes must be at least 1048576\");\n this.cacheSizeBytes = e.cacheSizeBytes;\n }\n __PRIVATE_validateIsNotUsedTogether(\"experimentalForceLongPolling\", e.experimentalForceLongPolling, \"experimentalAutoDetectLongPolling\", e.experimentalAutoDetectLongPolling), \n this.experimentalForceLongPolling = !!e.experimentalForceLongPolling, this.experimentalForceLongPolling ? this.experimentalAutoDetectLongPolling = !1 : void 0 === e.experimentalAutoDetectLongPolling ? this.experimentalAutoDetectLongPolling = true : \n // For backwards compatibility, coerce the value to boolean even though\n // the TypeScript compiler has narrowed the type to boolean already.\n // noinspection PointlessBooleanExpressionJS\n this.experimentalAutoDetectLongPolling = !!e.experimentalAutoDetectLongPolling, \n this.experimentalLongPollingOptions = __PRIVATE_cloneLongPollingOptions(null !== (n = e.experimentalLongPollingOptions) && void 0 !== n ? n : {}), \n function __PRIVATE_validateLongPollingOptions(e) {\n if (void 0 !== e.timeoutSeconds) {\n if (isNaN(e.timeoutSeconds)) throw new FirestoreError(D.INVALID_ARGUMENT, `invalid long polling timeout: ${e.timeoutSeconds} (must not be NaN)`);\n if (e.timeoutSeconds < 5) throw new FirestoreError(D.INVALID_ARGUMENT, `invalid long polling timeout: ${e.timeoutSeconds} (minimum allowed value is 5)`);\n if (e.timeoutSeconds > 30) throw new FirestoreError(D.INVALID_ARGUMENT, `invalid long polling timeout: ${e.timeoutSeconds} (maximum allowed value is 30)`);\n }\n }\n /**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /**\n * The Cloud Firestore service interface.\n *\n * Do not call this constructor directly. Instead, use {@link (getFirestore:1)}.\n */ (this.experimentalLongPollingOptions), this.useFetchStreams = !!e.useFetchStreams;\n }\n isEqual(e) {\n return this.host === e.host && this.ssl === e.ssl && this.credentials === e.credentials && this.cacheSizeBytes === e.cacheSizeBytes && this.experimentalForceLongPolling === e.experimentalForceLongPolling && this.experimentalAutoDetectLongPolling === e.experimentalAutoDetectLongPolling && function __PRIVATE_longPollingOptionsEqual(e, t) {\n return e.timeoutSeconds === t.timeoutSeconds;\n }(this.experimentalLongPollingOptions, e.experimentalLongPollingOptions) && this.ignoreUndefinedProperties === e.ignoreUndefinedProperties && this.useFetchStreams === e.useFetchStreams;\n }\n}\n\nclass Firestore$1 {\n /** @hideconstructor */\n constructor(e, t, n, r) {\n this._authCredentials = e, this._appCheckCredentials = t, this._databaseId = n, \n this._app = r, \n /**\n * Whether it's a Firestore or Firestore Lite instance.\n */\n this.type = \"firestore-lite\", this._persistenceKey = \"(lite)\", this._settings = new FirestoreSettingsImpl({}), \n this._settingsFrozen = !1, \n // A task that is assigned when the terminate() is invoked and resolved when\n // all components have shut down. Otherwise, Firestore is not terminated,\n // which can mean either the FirestoreClient is in the process of starting,\n // or restarting.\n this._terminateTask = \"notTerminated\";\n }\n /**\n * The {@link @firebase/app#FirebaseApp} associated with this `Firestore` service\n * instance.\n */ get app() {\n if (!this._app) throw new FirestoreError(D.FAILED_PRECONDITION, \"Firestore was not initialized using the Firebase SDK. 'app' is not available\");\n return this._app;\n }\n get _initialized() {\n return this._settingsFrozen;\n }\n get _terminated() {\n return \"notTerminated\" !== this._terminateTask;\n }\n _setSettings(e) {\n if (this._settingsFrozen) throw new FirestoreError(D.FAILED_PRECONDITION, \"Firestore has already been started and its settings can no longer be changed. You can only modify settings before calling any other methods on a Firestore object.\");\n this._settings = new FirestoreSettingsImpl(e), void 0 !== e.credentials && (this._authCredentials = function __PRIVATE_makeAuthCredentialsProvider(e) {\n if (!e) return new __PRIVATE_EmptyAuthCredentialsProvider;\n switch (e.type) {\n case \"firstParty\":\n return new __PRIVATE_FirstPartyAuthCredentialsProvider(e.sessionIndex || \"0\", e.iamToken || null, e.authTokenFactory || null);\n\n case \"provider\":\n return e.client;\n\n default:\n throw new FirestoreError(D.INVALID_ARGUMENT, \"makeAuthCredentialsProvider failed due to invalid credential type\");\n }\n }(e.credentials));\n }\n _getSettings() {\n return this._settings;\n }\n _freezeSettings() {\n return this._settingsFrozen = !0, this._settings;\n }\n _delete() {\n // The `_terminateTask` must be assigned future that completes when\n // terminate is complete. The existence of this future puts SDK in state\n // that will not accept further API interaction.\n return \"notTerminated\" === this._terminateTask && (this._terminateTask = this._terminate()), \n this._terminateTask;\n }\n async _restart() {\n // The `_terminateTask` must equal 'notTerminated' after restart to\n // signal that client is in a state that accepts API calls.\n \"notTerminated\" === this._terminateTask ? await this._terminate() : this._terminateTask = \"notTerminated\";\n }\n /** Returns a JSON-serializable representation of this `Firestore` instance. */ toJSON() {\n return {\n app: this._app,\n databaseId: this._databaseId,\n settings: this._settings\n };\n }\n /**\n * Terminates all components used by this client. Subclasses can override\n * this method to clean up their own dependencies, but must also call this\n * method.\n *\n * Only ever called once.\n */ _terminate() {\n /**\n * Removes all components associated with the provided instance. Must be called\n * when the `Firestore` instance is terminated.\n */\n return function __PRIVATE_removeComponents(e) {\n const t = we.get(e);\n t && (__PRIVATE_logDebug(\"ComponentProvider\", \"Removing Datastore\"), we.delete(e), \n t.terminate());\n }(this), Promise.resolve();\n }\n}\n\n/**\n * Modify this instance to communicate with the Cloud Firestore emulator.\n *\n * Note: This must be called before this instance has been used to do any\n * operations.\n *\n * @param firestore - The `Firestore` instance to configure to connect to the\n * emulator.\n * @param host - the emulator host (ex: localhost).\n * @param port - the emulator port (ex: 9000).\n * @param options.mockUserToken - the mock auth token to use for unit testing\n * Security Rules.\n */ function connectFirestoreEmulator(e, t, n, r = {}) {\n var i;\n const s = (e = __PRIVATE_cast(e, Firestore$1))._getSettings(), o = `${t}:${n}`;\n if (\"firestore.googleapis.com\" !== s.host && s.host !== o && __PRIVATE_logWarn(\"Host has been set in both settings() and connectFirestoreEmulator(), emulator host will be used.\"), \n e._setSettings(Object.assign(Object.assign({}, s), {\n host: o,\n ssl: !1\n })), r.mockUserToken) {\n let t, n;\n if (\"string\" == typeof r.mockUserToken) t = r.mockUserToken, n = User.MOCK_USER; else {\n // Let createMockUserToken validate first (catches common mistakes like\n // invalid field \"uid\" and missing field \"sub\" / \"user_id\".)\n t = createMockUserToken(r.mockUserToken, null === (i = e._app) || void 0 === i ? void 0 : i.options.projectId);\n const s = r.mockUserToken.sub || r.mockUserToken.user_id;\n if (!s) throw new FirestoreError(D.INVALID_ARGUMENT, \"mockUserToken must contain 'sub' or 'user_id' field!\");\n n = new User(s);\n }\n e._authCredentials = new __PRIVATE_EmulatorAuthCredentialsProvider(new __PRIVATE_OAuthToken(t, n));\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A `Query` refers to a query which you can read or listen to. You can also\n * construct refined `Query` objects by adding filters and ordering.\n */ class Query {\n // This is the lite version of the Query class in the main SDK.\n /** @hideconstructor protected */\n constructor(e, \n /**\n * If provided, the `FirestoreDataConverter` associated with this instance.\n */\n t, n) {\n this.converter = t, this._query = n, \n /** The type of this Firestore reference. */\n this.type = \"query\", this.firestore = e;\n }\n withConverter(e) {\n return new Query(this.firestore, e, this._query);\n }\n}\n\n/**\n * A `DocumentReference` refers to a document location in a Firestore database\n * and can be used to write, read, or listen to the location. The document at\n * the referenced location may or may not exist.\n */ class DocumentReference {\n /** @hideconstructor */\n constructor(e, \n /**\n * If provided, the `FirestoreDataConverter` associated with this instance.\n */\n t, n) {\n this.converter = t, this._key = n, \n /** The type of this Firestore reference. */\n this.type = \"document\", this.firestore = e;\n }\n get _path() {\n return this._key.path;\n }\n /**\n * The document's identifier within its collection.\n */ get id() {\n return this._key.path.lastSegment();\n }\n /**\n * A string representing the path of the referenced document (relative\n * to the root of the database).\n */ get path() {\n return this._key.path.canonicalString();\n }\n /**\n * The collection this `DocumentReference` belongs to.\n */ get parent() {\n return new CollectionReference(this.firestore, this.converter, this._key.path.popLast());\n }\n withConverter(e) {\n return new DocumentReference(this.firestore, e, this._key);\n }\n}\n\n/**\n * A `CollectionReference` object can be used for adding documents, getting\n * document references, and querying for documents (using {@link (query:1)}).\n */ class CollectionReference extends Query {\n /** @hideconstructor */\n constructor(e, t, n) {\n super(e, t, __PRIVATE_newQueryForPath(n)), this._path = n, \n /** The type of this Firestore reference. */\n this.type = \"collection\";\n }\n /** The collection's identifier. */ get id() {\n return this._query.path.lastSegment();\n }\n /**\n * A string representing the path of the referenced collection (relative\n * to the root of the database).\n */ get path() {\n return this._query.path.canonicalString();\n }\n /**\n * A reference to the containing `DocumentReference` if this is a\n * subcollection. If this isn't a subcollection, the reference is null.\n */ get parent() {\n const e = this._path.popLast();\n return e.isEmpty() ? null : new DocumentReference(this.firestore, \n /* converter= */ null, new DocumentKey(e));\n }\n withConverter(e) {\n return new CollectionReference(this.firestore, e, this._path);\n }\n}\n\nfunction collection(e, t, ...n) {\n if (e = getModularInstance(e), __PRIVATE_validateNonEmptyArgument(\"collection\", \"path\", t), e instanceof Firestore$1) {\n const r = ResourcePath.fromString(t, ...n);\n return __PRIVATE_validateCollectionPath(r), new CollectionReference(e, /* converter= */ null, r);\n }\n {\n if (!(e instanceof DocumentReference || e instanceof CollectionReference)) throw new FirestoreError(D.INVALID_ARGUMENT, \"Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore\");\n const r = e._path.child(ResourcePath.fromString(t, ...n));\n return __PRIVATE_validateCollectionPath(r), new CollectionReference(e.firestore, \n /* converter= */ null, r);\n }\n}\n\n// TODO(firestorelite): Consider using ErrorFactory -\n// https://github.com/firebase/firebase-js-sdk/blob/0131e1f/packages/util/src/errors.ts#L106\n/**\n * Creates and returns a new `Query` instance that includes all documents in the\n * database that are contained in a collection or subcollection with the\n * given `collectionId`.\n *\n * @param firestore - A reference to the root `Firestore` instance.\n * @param collectionId - Identifies the collections to query over. Every\n * collection or subcollection with this ID as the last segment of its path\n * will be included. Cannot contain a slash.\n * @returns The created `Query`.\n */ function collectionGroup(e, t) {\n if (e = __PRIVATE_cast(e, Firestore$1), __PRIVATE_validateNonEmptyArgument(\"collectionGroup\", \"collection id\", t), \n t.indexOf(\"/\") >= 0) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid collection ID '${t}' passed to function collectionGroup(). Collection IDs must not contain '/'.`);\n return new Query(e, \n /* converter= */ null, function __PRIVATE_newQueryForCollectionGroup(e) {\n return new __PRIVATE_QueryImpl(ResourcePath.emptyPath(), e);\n }(t));\n}\n\nfunction doc(e, t, ...n) {\n if (e = getModularInstance(e), \n // We allow omission of 'pathString' but explicitly prohibit passing in both\n // 'undefined' and 'null'.\n 1 === arguments.length && (t = __PRIVATE_AutoId.newId()), __PRIVATE_validateNonEmptyArgument(\"doc\", \"path\", t), \n e instanceof Firestore$1) {\n const r = ResourcePath.fromString(t, ...n);\n return __PRIVATE_validateDocumentPath(r), new DocumentReference(e, \n /* converter= */ null, new DocumentKey(r));\n }\n {\n if (!(e instanceof DocumentReference || e instanceof CollectionReference)) throw new FirestoreError(D.INVALID_ARGUMENT, \"Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore\");\n const r = e._path.child(ResourcePath.fromString(t, ...n));\n return __PRIVATE_validateDocumentPath(r), new DocumentReference(e.firestore, e instanceof CollectionReference ? e.converter : null, new DocumentKey(r));\n }\n}\n\n/**\n * Returns true if the provided references are equal.\n *\n * @param left - A reference to compare.\n * @param right - A reference to compare.\n * @returns true if the references point to the same location in the same\n * Firestore database.\n */ function refEqual(e, t) {\n return e = getModularInstance(e), t = getModularInstance(t), (e instanceof DocumentReference || e instanceof CollectionReference) && (t instanceof DocumentReference || t instanceof CollectionReference) && (e.firestore === t.firestore && e.path === t.path && e.converter === t.converter);\n}\n\n/**\n * Returns true if the provided queries point to the same collection and apply\n * the same constraints.\n *\n * @param left - A `Query` to compare.\n * @param right - A `Query` to compare.\n * @returns true if the references point to the same location in the same\n * Firestore database.\n */ function queryEqual(e, t) {\n return e = getModularInstance(e), t = getModularInstance(t), e instanceof Query && t instanceof Query && (e.firestore === t.firestore && __PRIVATE_queryEquals(e._query, t._query) && e.converter === t.converter);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_AsyncQueueImpl {\n constructor(e = Promise.resolve()) {\n // A list of retryable operations. Retryable operations are run in order and\n // retried with backoff.\n this.Pu = [], \n // Is this AsyncQueue being shut down? Once it is set to true, it will not\n // be changed again.\n this.Iu = !1, \n // Operations scheduled to be queued in the future. Operations are\n // automatically removed after they are run or canceled.\n this.Tu = [], \n // visible for testing\n this.Eu = null, \n // Flag set while there's an outstanding AsyncQueue operation, used for\n // assertion sanity-checks.\n this.du = !1, \n // Enabled during shutdown on Safari to prevent future access to IndexedDB.\n this.Au = !1, \n // List of TimerIds to fast-forward delays for.\n this.Ru = [], \n // Backoff timer used to schedule retries for retryable operations\n this.t_ = new __PRIVATE_ExponentialBackoff(this, \"async_queue_retry\" /* TimerId.AsyncQueueRetry */), \n // Visibility handler that triggers an immediate retry of all retryable\n // operations. Meant to speed up recovery when we regain file system access\n // after page comes into foreground.\n this.Vu = () => {\n const e = getDocument();\n e && __PRIVATE_logDebug(\"AsyncQueue\", \"Visibility state changed to \" + e.visibilityState), \n this.t_.jo();\n }, this.mu = e;\n const t = getDocument();\n t && \"function\" == typeof t.addEventListener && t.addEventListener(\"visibilitychange\", this.Vu);\n }\n get isShuttingDown() {\n return this.Iu;\n }\n /**\n * Adds a new operation to the queue without waiting for it to complete (i.e.\n * we ignore the Promise result).\n */ enqueueAndForget(e) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.enqueue(e);\n }\n enqueueAndForgetEvenWhileRestricted(e) {\n this.fu(), \n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.gu(e);\n }\n enterRestrictedMode(e) {\n if (!this.Iu) {\n this.Iu = !0, this.Au = e || !1;\n const t = getDocument();\n t && \"function\" == typeof t.removeEventListener && t.removeEventListener(\"visibilitychange\", this.Vu);\n }\n }\n enqueue(e) {\n if (this.fu(), this.Iu) \n // Return a Promise which never resolves.\n return new Promise((() => {}));\n // Create a deferred Promise that we can return to the callee. This\n // allows us to return a \"hanging Promise\" only to the callee and still\n // advance the queue even when the operation is not run.\n const t = new __PRIVATE_Deferred;\n return this.gu((() => this.Iu && this.Au ? Promise.resolve() : (e().then(t.resolve, t.reject), \n t.promise))).then((() => t.promise));\n }\n enqueueRetryable(e) {\n this.enqueueAndForget((() => (this.Pu.push(e), this.pu())));\n }\n /**\n * Runs the next operation from the retryable queue. If the operation fails,\n * reschedules with backoff.\n */ async pu() {\n if (0 !== this.Pu.length) {\n try {\n await this.Pu[0](), this.Pu.shift(), this.t_.reset();\n } catch (e) {\n if (!__PRIVATE_isIndexedDbTransactionError(e)) throw e;\n // Failure will be handled by AsyncQueue\n __PRIVATE_logDebug(\"AsyncQueue\", \"Operation failed with retryable error: \" + e);\n }\n this.Pu.length > 0 && \n // If there are additional operations, we re-schedule `retryNextOp()`.\n // This is necessary to run retryable operations that failed during\n // their initial attempt since we don't know whether they are already\n // enqueued. If, for example, `op1`, `op2`, `op3` are enqueued and `op1`\n // needs to be re-run, we will run `op1`, `op1`, `op2` using the\n // already enqueued calls to `retryNextOp()`. `op3()` will then run in the\n // call scheduled here.\n // Since `backoffAndRun()` cancels an existing backoff and schedules a\n // new backoff on every call, there is only ever a single additional\n // operation in the queue.\n this.t_.Go((() => this.pu()));\n }\n }\n gu(e) {\n const t = this.mu.then((() => (this.du = !0, e().catch((e => {\n this.Eu = e, this.du = !1;\n const t = \n /**\n * Chrome includes Error.message in Error.stack. Other browsers do not.\n * This returns expected output of message + stack when available.\n * @param error - Error or FirestoreError\n */\n function __PRIVATE_getMessageOrStack(e) {\n let t = e.message || \"\";\n e.stack && (t = e.stack.includes(e.message) ? e.stack : e.message + \"\\n\" + e.stack);\n return t;\n }\n /**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ (e);\n // Re-throw the error so that this.tail becomes a rejected Promise and\n // all further attempts to chain (via .then) will just short-circuit\n // and return the rejected Promise.\n throw __PRIVATE_logError(\"INTERNAL UNHANDLED ERROR: \", t), e;\n })).then((e => (this.du = !1, e))))));\n return this.mu = t, t;\n }\n enqueueAfterDelay(e, t, n) {\n this.fu(), \n // Fast-forward delays for timerIds that have been overridden.\n this.Ru.indexOf(e) > -1 && (t = 0);\n const r = DelayedOperation.createAndSchedule(this, e, t, n, (e => this.yu(e)));\n return this.Tu.push(r), r;\n }\n fu() {\n this.Eu && fail();\n }\n verifyOperationInProgress() {}\n /**\n * Waits until all currently queued tasks are finished executing. Delayed\n * operations are not run.\n */ async wu() {\n // Operations in the queue prior to draining may have enqueued additional\n // operations. Keep draining the queue until the tail is no longer advanced,\n // which indicates that no more new operations were enqueued and that all\n // operations were executed.\n let e;\n do {\n e = this.mu, await e;\n } while (e !== this.mu);\n }\n /**\n * For Tests: Determine if a delayed operation with a particular TimerId\n * exists.\n */ Su(e) {\n for (const t of this.Tu) if (t.timerId === e) return !0;\n return !1;\n }\n /**\n * For Tests: Runs some or all delayed operations early.\n *\n * @param lastTimerId - Delayed operations up to and including this TimerId\n * will be drained. Pass TimerId.All to run all delayed operations.\n * @returns a Promise that resolves once all operations have been run.\n */ bu(e) {\n // Note that draining may generate more delayed ops, so we do that first.\n return this.wu().then((() => {\n // Run ops in the same order they'd run if they ran naturally.\n /* eslint-disable-next-line @typescript-eslint/no-floating-promises */\n this.Tu.sort(((e, t) => e.targetTimeMs - t.targetTimeMs));\n for (const t of this.Tu) if (t.skipDelay(), \"all\" /* TimerId.All */ !== e && t.timerId === e) break;\n return this.wu();\n }));\n }\n /**\n * For Tests: Skip all subsequent delays for a timer id.\n */ Du(e) {\n this.Ru.push(e);\n }\n /** Called once a DelayedOperation is run or canceled. */ yu(e) {\n // NOTE: indexOf / slice are O(n), but delayedOperations is expected to be small.\n const t = this.Tu.indexOf(e);\n /* eslint-disable-next-line @typescript-eslint/no-floating-promises */ this.Tu.splice(t, 1);\n }\n}\n\nfunction __PRIVATE_isPartialObserver(e) {\n /**\n * Returns true if obj is an object and contains at least one of the specified\n * methods.\n */\n return function __PRIVATE_implementsAnyMethods(e, t) {\n if (\"object\" != typeof e || null === e) return !1;\n const n = e;\n for (const e of t) if (e in n && \"function\" == typeof n[e]) return !0;\n return !1;\n }\n /**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /**\n * Represents the task of loading a Firestore bundle. It provides progress of bundle\n * loading, as well as task completion and error events.\n *\n * The API is compatible with `Promise`.\n */ (e, [ \"next\", \"error\", \"complete\" ]);\n}\n\nclass LoadBundleTask {\n constructor() {\n this._progressObserver = {}, this._taskCompletionResolver = new __PRIVATE_Deferred, \n this._lastProgress = {\n taskState: \"Running\",\n totalBytes: 0,\n totalDocuments: 0,\n bytesLoaded: 0,\n documentsLoaded: 0\n };\n }\n /**\n * Registers functions to listen to bundle loading progress events.\n * @param next - Called when there is a progress update from bundle loading. Typically `next` calls occur\n * each time a Firestore document is loaded from the bundle.\n * @param error - Called when an error occurs during bundle loading. The task aborts after reporting the\n * error, and there should be no more updates after this.\n * @param complete - Called when the loading task is complete.\n */ onProgress(e, t, n) {\n this._progressObserver = {\n next: e,\n error: t,\n complete: n\n };\n }\n /**\n * Implements the `Promise.catch` interface.\n *\n * @param onRejected - Called when an error occurs during bundle loading.\n */ catch(e) {\n return this._taskCompletionResolver.promise.catch(e);\n }\n /**\n * Implements the `Promise.then` interface.\n *\n * @param onFulfilled - Called on the completion of the loading task with a final `LoadBundleTaskProgress` update.\n * The update will always have its `taskState` set to `\"Success\"`.\n * @param onRejected - Called when an error occurs during bundle loading.\n */ then(e, t) {\n return this._taskCompletionResolver.promise.then(e, t);\n }\n /**\n * Notifies all observers that bundle loading has completed, with a provided\n * `LoadBundleTaskProgress` object.\n *\n * @private\n */ _completeWith(e) {\n this._updateProgress(e), this._progressObserver.complete && this._progressObserver.complete(), \n this._taskCompletionResolver.resolve(e);\n }\n /**\n * Notifies all observers that bundle loading has failed, with a provided\n * `Error` as the reason.\n *\n * @private\n */ _failWith(e) {\n this._lastProgress.taskState = \"Error\", this._progressObserver.next && this._progressObserver.next(this._lastProgress), \n this._progressObserver.error && this._progressObserver.error(e), this._taskCompletionResolver.reject(e);\n }\n /**\n * Notifies a progress update of loading a bundle.\n * @param progress - The new progress.\n *\n * @private\n */ _updateProgress(e) {\n this._lastProgress = e, this._progressObserver.next && this._progressObserver.next(e);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Constant used to indicate the LRU garbage collection should be disabled.\n * Set this value as the `cacheSizeBytes` on the settings passed to the\n * {@link Firestore} instance.\n */ const Se = -1;\n\n/**\n * The Cloud Firestore service interface.\n *\n * Do not call this constructor directly. Instead, use {@link (getFirestore:1)}.\n */ class Firestore extends Firestore$1 {\n /** @hideconstructor */\n constructor(e, t, n, r) {\n super(e, t, n, r), \n /**\n * Whether it's a {@link Firestore} or Firestore Lite instance.\n */\n this.type = \"firestore\", this._queue = new __PRIVATE_AsyncQueueImpl, this._persistenceKey = (null == r ? void 0 : r.name) || \"[DEFAULT]\";\n }\n async _terminate() {\n if (this._firestoreClient) {\n const e = this._firestoreClient.terminate();\n this._queue = new __PRIVATE_AsyncQueueImpl(e), this._firestoreClient = void 0, await e;\n }\n }\n}\n\n/**\n * Initializes a new instance of {@link Firestore} with the provided settings.\n * Can only be called before any other function, including\n * {@link (getFirestore:1)}. If the custom settings are empty, this function is\n * equivalent to calling {@link (getFirestore:1)}.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} with which the {@link Firestore} instance will\n * be associated.\n * @param settings - A settings object to configure the {@link Firestore} instance.\n * @param databaseId - The name of the database.\n * @returns A newly initialized {@link Firestore} instance.\n */ function initializeFirestore(e, t, n) {\n n || (n = \"(default)\");\n const r = _getProvider(e, \"firestore\");\n if (r.isInitialized(n)) {\n const e = r.getImmediate({\n identifier: n\n }), i = r.getOptions(n);\n if (deepEqual(i, t)) return e;\n throw new FirestoreError(D.FAILED_PRECONDITION, \"initializeFirestore() has already been called with different options. To avoid this error, call initializeFirestore() with the same options as when it was originally called, or call getFirestore() to return the already initialized instance.\");\n }\n if (void 0 !== t.cacheSizeBytes && void 0 !== t.localCache) throw new FirestoreError(D.INVALID_ARGUMENT, \"cache and cacheSizeBytes cannot be specified at the same time as cacheSizeBytes willbe deprecated. Instead, specify the cache size in the cache object\");\n if (void 0 !== t.cacheSizeBytes && -1 !== t.cacheSizeBytes && t.cacheSizeBytes < 1048576) throw new FirestoreError(D.INVALID_ARGUMENT, \"cacheSizeBytes must be at least 1048576\");\n return r.initialize({\n options: t,\n instanceIdentifier: n\n });\n}\n\nfunction getFirestore(t, n) {\n const r = \"object\" == typeof t ? t : getApp(), i = \"string\" == typeof t ? t : n || \"(default)\", s = _getProvider(r, \"firestore\").getImmediate({\n identifier: i\n });\n if (!s._initialized) {\n const e = getDefaultEmulatorHostnameAndPort(\"firestore\");\n e && connectFirestoreEmulator(s, ...e);\n }\n return s;\n}\n\n/**\n * @internal\n */ function ensureFirestoreConfigured(e) {\n if (e._terminated) throw new FirestoreError(D.FAILED_PRECONDITION, \"The client has already been terminated.\");\n return e._firestoreClient || __PRIVATE_configureFirestore(e), e._firestoreClient;\n}\n\nfunction __PRIVATE_configureFirestore(e) {\n var t, n, r;\n const i = e._freezeSettings(), s = function __PRIVATE_makeDatabaseInfo(e, t, n, r) {\n return new DatabaseInfo(e, t, n, r.host, r.ssl, r.experimentalForceLongPolling, r.experimentalAutoDetectLongPolling, __PRIVATE_cloneLongPollingOptions(r.experimentalLongPollingOptions), r.useFetchStreams);\n }(e._databaseId, (null === (t = e._app) || void 0 === t ? void 0 : t.options.appId) || \"\", e._persistenceKey, i);\n e._componentsProvider || (null === (n = i.localCache) || void 0 === n ? void 0 : n._offlineComponentProvider) && (null === (r = i.localCache) || void 0 === r ? void 0 : r._onlineComponentProvider) && (e._componentsProvider = {\n _offline: i.localCache._offlineComponentProvider,\n _online: i.localCache._onlineComponentProvider\n }), e._firestoreClient = new FirestoreClient(e._authCredentials, e._appCheckCredentials, e._queue, s, e._componentsProvider && function __PRIVATE_buildComponentProvider(e) {\n const t = null == e ? void 0 : e._online.build();\n return {\n _offline: null == e ? void 0 : e._offline.build(t),\n _online: t\n };\n }\n /**\n * Attempts to enable persistent storage, if possible.\n *\n * On failure, `enableIndexedDbPersistence()` will reject the promise or\n * throw an exception. There are several reasons why this can fail, which can be\n * identified by the `code` on the error.\n *\n * * failed-precondition: The app is already open in another browser tab.\n * * unimplemented: The browser is incompatible with the offline persistence\n * implementation.\n *\n * Note that even after a failure, the {@link Firestore} instance will remain\n * usable, however offline persistence will be disabled.\n *\n * Note: `enableIndexedDbPersistence()` must be called before any other functions\n * (other than {@link initializeFirestore}, {@link (getFirestore:1)} or\n * {@link clearIndexedDbPersistence}.\n *\n * Persistence cannot be used in a Node.js environment.\n *\n * @param firestore - The {@link Firestore} instance to enable persistence for.\n * @param persistenceSettings - Optional settings object to configure\n * persistence.\n * @returns A `Promise` that represents successfully enabling persistent storage.\n * @deprecated This function will be removed in a future major release. Instead, set\n * `FirestoreSettings.localCache` to an instance of `PersistentLocalCache` to\n * turn on IndexedDb cache. Calling this function when `FirestoreSettings.localCache`\n * is already specified will throw an exception.\n */ (e._componentsProvider));\n}\n\nfunction enableIndexedDbPersistence(e, t) {\n __PRIVATE_logWarn(\"enableIndexedDbPersistence() will be deprecated in the future, you can use `FirestoreSettings.cache` instead.\");\n const n = e._freezeSettings();\n return __PRIVATE_setPersistenceProviders(e, OnlineComponentProvider.provider, {\n build: e => new __PRIVATE_IndexedDbOfflineComponentProvider(e, n.cacheSizeBytes, null == t ? void 0 : t.forceOwnership)\n }), Promise.resolve();\n}\n\n/**\n * Attempts to enable multi-tab persistent storage, if possible. If enabled\n * across all tabs, all operations share access to local persistence, including\n * shared execution of queries and latency-compensated local document updates\n * across all connected instances.\n *\n * On failure, `enableMultiTabIndexedDbPersistence()` will reject the promise or\n * throw an exception. There are several reasons why this can fail, which can be\n * identified by the `code` on the error.\n *\n * * failed-precondition: The app is already open in another browser tab and\n * multi-tab is not enabled.\n * * unimplemented: The browser is incompatible with the offline persistence\n * implementation.\n *\n * Note that even after a failure, the {@link Firestore} instance will remain\n * usable, however offline persistence will be disabled.\n *\n * @param firestore - The {@link Firestore} instance to enable persistence for.\n * @returns A `Promise` that represents successfully enabling persistent\n * storage.\n * @deprecated This function will be removed in a future major release. Instead, set\n * `FirestoreSettings.localCache` to an instance of `PersistentLocalCache` to\n * turn on indexeddb cache. Calling this function when `FirestoreSettings.localCache`\n * is already specified will throw an exception.\n */ async function enableMultiTabIndexedDbPersistence(e) {\n __PRIVATE_logWarn(\"enableMultiTabIndexedDbPersistence() will be deprecated in the future, you can use `FirestoreSettings.cache` instead.\");\n const t = e._freezeSettings();\n __PRIVATE_setPersistenceProviders(e, OnlineComponentProvider.provider, {\n build: e => new __PRIVATE_MultiTabOfflineComponentProvider(e, t.cacheSizeBytes)\n });\n}\n\n/**\n * Registers both the `OfflineComponentProvider` and `OnlineComponentProvider`.\n * If the operation fails with a recoverable error (see\n * `canRecoverFromIndexedDbError()` below), the returned Promise is rejected\n * but the client remains usable.\n */ function __PRIVATE_setPersistenceProviders(e, t, n) {\n if ((e = __PRIVATE_cast(e, Firestore))._firestoreClient || e._terminated) throw new FirestoreError(D.FAILED_PRECONDITION, \"Firestore has already been started and persistence can no longer be enabled. You can only enable persistence before calling any other methods on a Firestore object.\");\n if (e._componentsProvider || e._getSettings().localCache) throw new FirestoreError(D.FAILED_PRECONDITION, \"SDK cache is already specified.\");\n e._componentsProvider = {\n _online: t,\n _offline: n\n }, __PRIVATE_configureFirestore(e);\n}\n\n/**\n * Clears the persistent storage. This includes pending writes and cached\n * documents.\n *\n * Must be called while the {@link Firestore} instance is not started (after the app is\n * terminated or when the app is first initialized). On startup, this function\n * must be called before other functions (other than {@link\n * initializeFirestore} or {@link (getFirestore:1)})). If the {@link Firestore}\n * instance is still running, the promise will be rejected with the error code\n * of `failed-precondition`.\n *\n * Note: `clearIndexedDbPersistence()` is primarily intended to help write\n * reliable tests that use Cloud Firestore. It uses an efficient mechanism for\n * dropping existing data but does not attempt to securely overwrite or\n * otherwise make cached data unrecoverable. For applications that are sensitive\n * to the disclosure of cached data in between user sessions, we strongly\n * recommend not enabling persistence at all.\n *\n * @param firestore - The {@link Firestore} instance to clear persistence for.\n * @returns A `Promise` that is resolved when the persistent storage is\n * cleared. Otherwise, the promise is rejected with an error.\n */ function clearIndexedDbPersistence(e) {\n if (e._initialized && !e._terminated) throw new FirestoreError(D.FAILED_PRECONDITION, \"Persistence can only be cleared before a Firestore instance is initialized or after it is terminated.\");\n const t = new __PRIVATE_Deferred;\n return e._queue.enqueueAndForgetEvenWhileRestricted((async () => {\n try {\n await async function __PRIVATE_indexedDbClearPersistence(e) {\n if (!__PRIVATE_SimpleDb.D()) return Promise.resolve();\n const t = e + \"main\";\n await __PRIVATE_SimpleDb.delete(t);\n }(__PRIVATE_indexedDbStoragePrefix(e._databaseId, e._persistenceKey)), t.resolve();\n } catch (e) {\n t.reject(e);\n }\n })), t.promise;\n}\n\n/**\n * Waits until all currently pending writes for the active user have been\n * acknowledged by the backend.\n *\n * The returned promise resolves immediately if there are no outstanding writes.\n * Otherwise, the promise waits for all previously issued writes (including\n * those written in a previous app session), but it does not wait for writes\n * that were added after the function is called. If you want to wait for\n * additional writes, call `waitForPendingWrites()` again.\n *\n * Any outstanding `waitForPendingWrites()` promises are rejected during user\n * changes.\n *\n * @returns A `Promise` which resolves when all currently pending writes have been\n * acknowledged by the backend.\n */ function waitForPendingWrites(e) {\n return function __PRIVATE_firestoreClientWaitForPendingWrites(e) {\n const t = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => __PRIVATE_syncEngineRegisterPendingWritesCallback(await __PRIVATE_getSyncEngine(e), t))), \n t.promise;\n }(ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore)));\n}\n\n/**\n * Re-enables use of the network for this {@link Firestore} instance after a prior\n * call to {@link disableNetwork}.\n *\n * @returns A `Promise` that is resolved once the network has been enabled.\n */ function enableNetwork(e) {\n return __PRIVATE_firestoreClientEnableNetwork(ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore)));\n}\n\n/**\n * Disables network usage for this instance. It can be re-enabled via {@link\n * enableNetwork}. While the network is disabled, any snapshot listeners,\n * `getDoc()` or `getDocs()` calls will return results from cache, and any write\n * operations will be queued until the network is restored.\n *\n * @returns A `Promise` that is resolved once the network has been disabled.\n */ function disableNetwork(e) {\n return __PRIVATE_firestoreClientDisableNetwork(ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore)));\n}\n\n/**\n * Terminates the provided {@link Firestore} instance.\n *\n * After calling `terminate()` only the `clearIndexedDbPersistence()` function\n * may be used. Any other function will throw a `FirestoreError`.\n *\n * To restart after termination, create a new instance of FirebaseFirestore with\n * {@link (getFirestore:1)}.\n *\n * Termination does not cancel any pending writes, and any promises that are\n * awaiting a response from the server will not be resolved. If you have\n * persistence enabled, the next time you start this instance, it will resume\n * sending these writes to the server.\n *\n * Note: Under normal circumstances, calling `terminate()` is not required. This\n * function is useful only when you want to force this instance to release all\n * of its resources or in combination with `clearIndexedDbPersistence()` to\n * ensure that all local state is destroyed between test runs.\n *\n * @returns A `Promise` that is resolved when the instance has been successfully\n * terminated.\n */ function terminate(e) {\n return _removeServiceInstance(e.app, \"firestore\", e._databaseId.database), e._delete();\n}\n\n/**\n * Loads a Firestore bundle into the local cache.\n *\n * @param firestore - The {@link Firestore} instance to load bundles for.\n * @param bundleData - An object representing the bundle to be loaded. Valid\n * objects are `ArrayBuffer`, `ReadableStream` or `string`.\n *\n * @returns A `LoadBundleTask` object, which notifies callers with progress\n * updates, and completion or error events. It can be used as a\n * `Promise`.\n */ function loadBundle(e, t) {\n const n = ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore)), r = new LoadBundleTask;\n return __PRIVATE_firestoreClientLoadBundle(n, e._databaseId, t, r), r;\n}\n\n/**\n * Reads a Firestore {@link Query} from local cache, identified by the given\n * name.\n *\n * The named queries are packaged into bundles on the server side (along\n * with resulting documents), and loaded to local cache using `loadBundle`. Once\n * in local cache, use this method to extract a {@link Query} by name.\n *\n * @param firestore - The {@link Firestore} instance to read the query from.\n * @param name - The name of the query.\n * @returns A `Promise` that is resolved with the Query or `null`.\n */ function namedQuery(e, t) {\n return __PRIVATE_firestoreClientGetNamedQuery(ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore)), t).then((t => t ? new Query(e, null, t.query) : null));\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents an aggregation that can be performed by Firestore.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nclass AggregateField {\n /**\n * Create a new AggregateField\n * @param aggregateType Specifies the type of aggregation operation to perform.\n * @param _internalFieldPath Optionally specifies the field that is aggregated.\n * @internal\n */\n constructor(e = \"count\", t) {\n this._internalFieldPath = t, \n /** A type string to uniquely identify instances of this class. */\n this.type = \"AggregateField\", this.aggregateType = e;\n }\n}\n\n/**\n * The results of executing an aggregation query.\n */ class AggregateQuerySnapshot {\n /** @hideconstructor */\n constructor(e, t, n) {\n this._userDataWriter = t, this._data = n, \n /** A type string to uniquely identify instances of this class. */\n this.type = \"AggregateQuerySnapshot\", this.query = e;\n }\n /**\n * Returns the results of the aggregations performed over the underlying\n * query.\n *\n * The keys of the returned object will be the same as those of the\n * `AggregateSpec` object specified to the aggregation method, and the values\n * will be the corresponding aggregation result.\n *\n * @returns The results of the aggregations performed over the underlying\n * query.\n */ data() {\n return this._userDataWriter.convertObjectMap(this._data);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An immutable object representing an array of bytes.\n */ class Bytes {\n /** @hideconstructor */\n constructor(e) {\n this._byteString = e;\n }\n /**\n * Creates a new `Bytes` object from the given Base64 string, converting it to\n * bytes.\n *\n * @param base64 - The Base64 string used to create the `Bytes` object.\n */ static fromBase64String(e) {\n try {\n return new Bytes(ByteString.fromBase64String(e));\n } catch (e) {\n throw new FirestoreError(D.INVALID_ARGUMENT, \"Failed to construct data from Base64 string: \" + e);\n }\n }\n /**\n * Creates a new `Bytes` object from the given Uint8Array.\n *\n * @param array - The Uint8Array used to create the `Bytes` object.\n */ static fromUint8Array(e) {\n return new Bytes(ByteString.fromUint8Array(e));\n }\n /**\n * Returns the underlying bytes as a Base64-encoded string.\n *\n * @returns The Base64-encoded string created from the `Bytes` object.\n */ toBase64() {\n return this._byteString.toBase64();\n }\n /**\n * Returns the underlying bytes in a new `Uint8Array`.\n *\n * @returns The Uint8Array created from the `Bytes` object.\n */ toUint8Array() {\n return this._byteString.toUint8Array();\n }\n /**\n * Returns a string representation of the `Bytes` object.\n *\n * @returns A string representation of the `Bytes` object.\n */ toString() {\n return \"Bytes(base64: \" + this.toBase64() + \")\";\n }\n /**\n * Returns true if this `Bytes` object is equal to the provided one.\n *\n * @param other - The `Bytes` object to compare against.\n * @returns true if this `Bytes` object is equal to the provided one.\n */ isEqual(e) {\n return this._byteString.isEqual(e._byteString);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A `FieldPath` refers to a field in a document. The path may consist of a\n * single field name (referring to a top-level field in the document), or a\n * list of field names (referring to a nested field in the document).\n *\n * Create a `FieldPath` by providing field names. If more than one field\n * name is provided, the path will point to a nested field in a document.\n */ class FieldPath {\n /**\n * Creates a `FieldPath` from the provided field names. If more than one field\n * name is provided, the path will point to a nested field in a document.\n *\n * @param fieldNames - A list of field names.\n */\n constructor(...e) {\n for (let t = 0; t < e.length; ++t) if (0 === e[t].length) throw new FirestoreError(D.INVALID_ARGUMENT, \"Invalid field name at argument $(i + 1). Field names must not be empty.\");\n this._internalPath = new FieldPath$1(e);\n }\n /**\n * Returns true if this `FieldPath` is equal to the provided one.\n *\n * @param other - The `FieldPath` to compare against.\n * @returns true if this `FieldPath` is equal to the provided one.\n */ isEqual(e) {\n return this._internalPath.isEqual(e._internalPath);\n }\n}\n\n/**\n * Returns a special sentinel `FieldPath` to refer to the ID of a document.\n * It can be used in queries to sort or filter by the document ID.\n */ function documentId() {\n return new FieldPath(\"__name__\");\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Sentinel values that can be used when writing document fields with `set()`\n * or `update()`.\n */ class FieldValue {\n /**\n * @param _methodName - The public API endpoint that returns this class.\n * @hideconstructor\n */\n constructor(e) {\n this._methodName = e;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An immutable object representing a geographic location in Firestore. The\n * location is represented as latitude/longitude pair.\n *\n * Latitude values are in the range of [-90, 90].\n * Longitude values are in the range of [-180, 180].\n */ class GeoPoint {\n /**\n * Creates a new immutable `GeoPoint` object with the provided latitude and\n * longitude values.\n * @param latitude - The latitude as number between -90 and 90.\n * @param longitude - The longitude as number between -180 and 180.\n */\n constructor(e, t) {\n if (!isFinite(e) || e < -90 || e > 90) throw new FirestoreError(D.INVALID_ARGUMENT, \"Latitude must be a number between -90 and 90, but was: \" + e);\n if (!isFinite(t) || t < -180 || t > 180) throw new FirestoreError(D.INVALID_ARGUMENT, \"Longitude must be a number between -180 and 180, but was: \" + t);\n this._lat = e, this._long = t;\n }\n /**\n * The latitude of this `GeoPoint` instance.\n */ get latitude() {\n return this._lat;\n }\n /**\n * The longitude of this `GeoPoint` instance.\n */ get longitude() {\n return this._long;\n }\n /**\n * Returns true if this `GeoPoint` is equal to the provided one.\n *\n * @param other - The `GeoPoint` to compare against.\n * @returns true if this `GeoPoint` is equal to the provided one.\n */ isEqual(e) {\n return this._lat === e._lat && this._long === e._long;\n }\n /** Returns a JSON-serializable representation of this GeoPoint. */ toJSON() {\n return {\n latitude: this._lat,\n longitude: this._long\n };\n }\n /**\n * Actually private to JS consumers of our API, so this function is prefixed\n * with an underscore.\n */ _compareTo(e) {\n return __PRIVATE_primitiveComparator(this._lat, e._lat) || __PRIVATE_primitiveComparator(this._long, e._long);\n }\n}\n\n/**\n * @license\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents a vector type in Firestore documents.\n * Create an instance with {@link FieldValue.vector}.\n *\n * @class VectorValue\n */ class VectorValue {\n /**\n * @private\n * @internal\n */\n constructor(e) {\n // Making a copy of the parameter.\n this._values = (e || []).map((e => e));\n }\n /**\n * Returns a copy of the raw number array form of the vector.\n */ toArray() {\n return this._values.map((e => e));\n }\n /**\n * Returns `true` if the two VectorValue has the same raw number arrays, returns `false` otherwise.\n */ isEqual(e) {\n return function __PRIVATE_isPrimitiveArrayEqual(e, t) {\n if (e.length !== t.length) return !1;\n for (let n = 0; n < e.length; ++n) if (e[n] !== t[n]) return !1;\n return !0;\n }(this._values, e._values);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const be = /^__.*__$/;\n\n/** The result of parsing document data (e.g. for a setData call). */ class ParsedSetData {\n constructor(e, t, n) {\n this.data = e, this.fieldMask = t, this.fieldTransforms = n;\n }\n toMutation(e, t) {\n return null !== this.fieldMask ? new __PRIVATE_PatchMutation(e, this.data, this.fieldMask, t, this.fieldTransforms) : new __PRIVATE_SetMutation(e, this.data, t, this.fieldTransforms);\n }\n}\n\n/** The result of parsing \"update\" data (i.e. for an updateData call). */ class ParsedUpdateData {\n constructor(e, \n // The fieldMask does not include document transforms.\n t, n) {\n this.data = e, this.fieldMask = t, this.fieldTransforms = n;\n }\n toMutation(e, t) {\n return new __PRIVATE_PatchMutation(e, this.data, this.fieldMask, t, this.fieldTransforms);\n }\n}\n\nfunction __PRIVATE_isWrite(e) {\n switch (e) {\n case 0 /* UserDataSource.Set */ :\n // fall through\n case 2 /* UserDataSource.MergeSet */ :\n // fall through\n case 1 /* UserDataSource.Update */ :\n return !0;\n\n case 3 /* UserDataSource.Argument */ :\n case 4 /* UserDataSource.ArrayArgument */ :\n return !1;\n\n default:\n throw fail();\n }\n}\n\n/** A \"context\" object passed around while parsing user data. */ class __PRIVATE_ParseContextImpl {\n /**\n * Initializes a ParseContext with the given source and path.\n *\n * @param settings - The settings for the parser.\n * @param databaseId - The database ID of the Firestore instance.\n * @param serializer - The serializer to use to generate the Value proto.\n * @param ignoreUndefinedProperties - Whether to ignore undefined properties\n * rather than throw.\n * @param fieldTransforms - A mutable list of field transforms encountered\n * while parsing the data.\n * @param fieldMask - A mutable list of field paths encountered while parsing\n * the data.\n *\n * TODO(b/34871131): We don't support array paths right now, so path can be\n * null to indicate the context represents any location within an array (in\n * which case certain features will not work and errors will be somewhat\n * compromised).\n */\n constructor(e, t, n, r, i, s) {\n this.settings = e, this.databaseId = t, this.serializer = n, this.ignoreUndefinedProperties = r, \n // Minor hack: If fieldTransforms is undefined, we assume this is an\n // external call and we need to validate the entire path.\n void 0 === i && this.vu(), this.fieldTransforms = i || [], this.fieldMask = s || [];\n }\n get path() {\n return this.settings.path;\n }\n get Cu() {\n return this.settings.Cu;\n }\n /** Returns a new context with the specified settings overwritten. */ Fu(e) {\n return new __PRIVATE_ParseContextImpl(Object.assign(Object.assign({}, this.settings), e), this.databaseId, this.serializer, this.ignoreUndefinedProperties, this.fieldTransforms, this.fieldMask);\n }\n Mu(e) {\n var t;\n const n = null === (t = this.path) || void 0 === t ? void 0 : t.child(e), r = this.Fu({\n path: n,\n xu: !1\n });\n return r.Ou(e), r;\n }\n Nu(e) {\n var t;\n const n = null === (t = this.path) || void 0 === t ? void 0 : t.child(e), r = this.Fu({\n path: n,\n xu: !1\n });\n return r.vu(), r;\n }\n Lu(e) {\n // TODO(b/34871131): We don't support array paths right now; so make path\n // undefined.\n return this.Fu({\n path: void 0,\n xu: !0\n });\n }\n Bu(e) {\n return __PRIVATE_createError(e, this.settings.methodName, this.settings.ku || !1, this.path, this.settings.qu);\n }\n /** Returns 'true' if 'fieldPath' was traversed when creating this context. */ contains(e) {\n return void 0 !== this.fieldMask.find((t => e.isPrefixOf(t))) || void 0 !== this.fieldTransforms.find((t => e.isPrefixOf(t.field)));\n }\n vu() {\n // TODO(b/34871131): Remove null check once we have proper paths for fields\n // within arrays.\n if (this.path) for (let e = 0; e < this.path.length; e++) this.Ou(this.path.get(e));\n }\n Ou(e) {\n if (0 === e.length) throw this.Bu(\"Document fields must not be empty\");\n if (__PRIVATE_isWrite(this.Cu) && be.test(e)) throw this.Bu('Document fields cannot begin and end with \"__\"');\n }\n}\n\n/**\n * Helper for parsing raw user input (provided via the API) into internal model\n * classes.\n */ class __PRIVATE_UserDataReader {\n constructor(e, t, n) {\n this.databaseId = e, this.ignoreUndefinedProperties = t, this.serializer = n || __PRIVATE_newSerializer(e);\n }\n /** Creates a new top-level parse context. */ Qu(e, t, n, r = !1) {\n return new __PRIVATE_ParseContextImpl({\n Cu: e,\n methodName: t,\n qu: n,\n path: FieldPath$1.emptyPath(),\n xu: !1,\n ku: r\n }, this.databaseId, this.serializer, this.ignoreUndefinedProperties);\n }\n}\n\nfunction __PRIVATE_newUserDataReader(e) {\n const t = e._freezeSettings(), n = __PRIVATE_newSerializer(e._databaseId);\n return new __PRIVATE_UserDataReader(e._databaseId, !!t.ignoreUndefinedProperties, n);\n}\n\n/** Parse document data from a set() call. */ function __PRIVATE_parseSetData(e, t, n, r, i, s = {}) {\n const o = e.Qu(s.merge || s.mergeFields ? 2 /* UserDataSource.MergeSet */ : 0 /* UserDataSource.Set */ , t, n, i);\n __PRIVATE_validatePlainObject(\"Data must be an object, but it was:\", o, r);\n const _ = __PRIVATE_parseObject(r, o);\n let a, u;\n if (s.merge) a = new FieldMask(o.fieldMask), u = o.fieldTransforms; else if (s.mergeFields) {\n const e = [];\n for (const r of s.mergeFields) {\n const i = __PRIVATE_fieldPathFromArgument$1(t, r, n);\n if (!o.contains(i)) throw new FirestoreError(D.INVALID_ARGUMENT, `Field '${i}' is specified in your field mask but missing from your input data.`);\n __PRIVATE_fieldMaskContains(e, i) || e.push(i);\n }\n a = new FieldMask(e), u = o.fieldTransforms.filter((e => a.covers(e.field)));\n } else a = null, u = o.fieldTransforms;\n return new ParsedSetData(new ObjectValue(_), a, u);\n}\n\nclass __PRIVATE_DeleteFieldValueImpl extends FieldValue {\n _toFieldTransform(e) {\n if (2 /* UserDataSource.MergeSet */ !== e.Cu) throw 1 /* UserDataSource.Update */ === e.Cu ? e.Bu(`${this._methodName}() can only appear at the top level of your update data`) : e.Bu(`${this._methodName}() cannot be used with set() unless you pass {merge:true}`);\n // No transform to add for a delete, but we need to add it to our\n // fieldMask so it gets deleted.\n return e.fieldMask.push(e.path), null;\n }\n isEqual(e) {\n return e instanceof __PRIVATE_DeleteFieldValueImpl;\n }\n}\n\n/**\n * Creates a child context for parsing SerializableFieldValues.\n *\n * This is different than calling `ParseContext.contextWith` because it keeps\n * the fieldTransforms and fieldMask separate.\n *\n * The created context has its `dataSource` set to `UserDataSource.Argument`.\n * Although these values are used with writes, any elements in these FieldValues\n * are not considered writes since they cannot contain any FieldValue sentinels,\n * etc.\n *\n * @param fieldValue - The sentinel FieldValue for which to create a child\n * context.\n * @param context - The parent context.\n * @param arrayElement - Whether or not the FieldValue has an array.\n */ function __PRIVATE_createSentinelChildContext(e, t, n) {\n return new __PRIVATE_ParseContextImpl({\n Cu: 3 /* UserDataSource.Argument */ ,\n qu: t.settings.qu,\n methodName: e._methodName,\n xu: n\n }, t.databaseId, t.serializer, t.ignoreUndefinedProperties);\n}\n\nclass __PRIVATE_ServerTimestampFieldValueImpl extends FieldValue {\n _toFieldTransform(e) {\n return new FieldTransform(e.path, new __PRIVATE_ServerTimestampTransform);\n }\n isEqual(e) {\n return e instanceof __PRIVATE_ServerTimestampFieldValueImpl;\n }\n}\n\nclass __PRIVATE_ArrayUnionFieldValueImpl extends FieldValue {\n constructor(e, t) {\n super(e), this.Ku = t;\n }\n _toFieldTransform(e) {\n const t = __PRIVATE_createSentinelChildContext(this, e, \n /*array=*/ !0), n = this.Ku.map((e => __PRIVATE_parseData(e, t))), r = new __PRIVATE_ArrayUnionTransformOperation(n);\n return new FieldTransform(e.path, r);\n }\n isEqual(e) {\n return e instanceof __PRIVATE_ArrayUnionFieldValueImpl && deepEqual(this.Ku, e.Ku);\n }\n}\n\nclass __PRIVATE_ArrayRemoveFieldValueImpl extends FieldValue {\n constructor(e, t) {\n super(e), this.Ku = t;\n }\n _toFieldTransform(e) {\n const t = __PRIVATE_createSentinelChildContext(this, e, \n /*array=*/ !0), n = this.Ku.map((e => __PRIVATE_parseData(e, t))), r = new __PRIVATE_ArrayRemoveTransformOperation(n);\n return new FieldTransform(e.path, r);\n }\n isEqual(e) {\n return e instanceof __PRIVATE_ArrayRemoveFieldValueImpl && deepEqual(this.Ku, e.Ku);\n }\n}\n\nclass __PRIVATE_NumericIncrementFieldValueImpl extends FieldValue {\n constructor(e, t) {\n super(e), this.$u = t;\n }\n _toFieldTransform(e) {\n const t = new __PRIVATE_NumericIncrementTransformOperation(e.serializer, toNumber(e.serializer, this.$u));\n return new FieldTransform(e.path, t);\n }\n isEqual(e) {\n return e instanceof __PRIVATE_NumericIncrementFieldValueImpl && this.$u === e.$u;\n }\n}\n\n/** Parse update data from an update() call. */ function __PRIVATE_parseUpdateData(e, t, n, r) {\n const i = e.Qu(1 /* UserDataSource.Update */ , t, n);\n __PRIVATE_validatePlainObject(\"Data must be an object, but it was:\", i, r);\n const s = [], o = ObjectValue.empty();\n forEach(r, ((e, r) => {\n const _ = __PRIVATE_fieldPathFromDotSeparatedString(t, e, n);\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n r = getModularInstance(r);\n const a = i.Nu(_);\n if (r instanceof __PRIVATE_DeleteFieldValueImpl) \n // Add it to the field mask, but don't add anything to updateData.\n s.push(_); else {\n const e = __PRIVATE_parseData(r, a);\n null != e && (s.push(_), o.set(_, e));\n }\n }));\n const _ = new FieldMask(s);\n return new ParsedUpdateData(o, _, i.fieldTransforms);\n}\n\n/** Parse update data from a list of field/value arguments. */ function __PRIVATE_parseUpdateVarargs(e, t, n, r, i, s) {\n const o = e.Qu(1 /* UserDataSource.Update */ , t, n), _ = [ __PRIVATE_fieldPathFromArgument$1(t, r, n) ], a = [ i ];\n if (s.length % 2 != 0) throw new FirestoreError(D.INVALID_ARGUMENT, `Function ${t}() needs to be called with an even number of arguments that alternate between field names and values.`);\n for (let e = 0; e < s.length; e += 2) _.push(__PRIVATE_fieldPathFromArgument$1(t, s[e])), \n a.push(s[e + 1]);\n const u = [], c = ObjectValue.empty();\n // We iterate in reverse order to pick the last value for a field if the\n // user specified the field multiple times.\n for (let e = _.length - 1; e >= 0; --e) if (!__PRIVATE_fieldMaskContains(u, _[e])) {\n const t = _[e];\n let n = a[e];\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n n = getModularInstance(n);\n const r = o.Nu(t);\n if (n instanceof __PRIVATE_DeleteFieldValueImpl) \n // Add it to the field mask, but don't add anything to updateData.\n u.push(t); else {\n const e = __PRIVATE_parseData(n, r);\n null != e && (u.push(t), c.set(t, e));\n }\n }\n const l = new FieldMask(u);\n return new ParsedUpdateData(c, l, o.fieldTransforms);\n}\n\n/**\n * Parse a \"query value\" (e.g. value in a where filter or a value in a cursor\n * bound).\n *\n * @param allowArrays - Whether the query value is an array that may directly\n * contain additional arrays (e.g. the operand of an `in` query).\n */ function __PRIVATE_parseQueryValue(e, t, n, r = !1) {\n return __PRIVATE_parseData(n, e.Qu(r ? 4 /* UserDataSource.ArrayArgument */ : 3 /* UserDataSource.Argument */ , t));\n}\n\n/**\n * Parses user data to Protobuf Values.\n *\n * @param input - Data to be parsed.\n * @param context - A context object representing the current path being parsed,\n * the source of the data being parsed, etc.\n * @returns The parsed value, or null if the value was a FieldValue sentinel\n * that should not be included in the resulting parsed data.\n */ function __PRIVATE_parseData(e, t) {\n if (__PRIVATE_looksLikeJsonObject(\n // Unwrap the API type from the Compat SDK. This will return the API type\n // from firestore-exp.\n e = getModularInstance(e))) return __PRIVATE_validatePlainObject(\"Unsupported field value:\", t, e), \n __PRIVATE_parseObject(e, t);\n if (e instanceof FieldValue) \n // FieldValues usually parse into transforms (except deleteField())\n // in which case we do not want to include this field in our parsed data\n // (as doing so will overwrite the field directly prior to the transform\n // trying to transform it). So we don't add this location to\n // context.fieldMask and we return null as our parsing result.\n /**\n * \"Parses\" the provided FieldValueImpl, adding any necessary transforms to\n * context.fieldTransforms.\n */\n return function __PRIVATE_parseSentinelFieldValue(e, t) {\n // Sentinels are only supported with writes, and not within arrays.\n if (!__PRIVATE_isWrite(t.Cu)) throw t.Bu(`${e._methodName}() can only be used with update() and set()`);\n if (!t.path) throw t.Bu(`${e._methodName}() is not currently supported inside arrays`);\n const n = e._toFieldTransform(t);\n n && t.fieldTransforms.push(n);\n }\n /**\n * Helper to parse a scalar value (i.e. not an Object, Array, or FieldValue)\n *\n * @returns The parsed value\n */ (e, t), null;\n if (void 0 === e && t.ignoreUndefinedProperties) \n // If the input is undefined it can never participate in the fieldMask, so\n // don't handle this below. If `ignoreUndefinedProperties` is false,\n // `parseScalarValue` will reject an undefined value.\n return null;\n if (\n // If context.path is null we are inside an array and we don't support\n // field mask paths more granular than the top-level array.\n t.path && t.fieldMask.push(t.path), e instanceof Array) {\n // TODO(b/34871131): Include the path containing the array in the error\n // message.\n // In the case of IN queries, the parsed data is an array (representing\n // the set of values to be included for the IN query) that may directly\n // contain additional arrays (each representing an individual field\n // value), so we disable this validation.\n if (t.settings.xu && 4 /* UserDataSource.ArrayArgument */ !== t.Cu) throw t.Bu(\"Nested arrays are not supported\");\n return function __PRIVATE_parseArray(e, t) {\n const n = [];\n let r = 0;\n for (const i of e) {\n let e = __PRIVATE_parseData(i, t.Lu(r));\n null == e && (\n // Just include nulls in the array for fields being replaced with a\n // sentinel.\n e = {\n nullValue: \"NULL_VALUE\"\n }), n.push(e), r++;\n }\n return {\n arrayValue: {\n values: n\n }\n };\n }(e, t);\n }\n return function __PRIVATE_parseScalarValue(e, t) {\n if (null === (e = getModularInstance(e))) return {\n nullValue: \"NULL_VALUE\"\n };\n if (\"number\" == typeof e) return toNumber(t.serializer, e);\n if (\"boolean\" == typeof e) return {\n booleanValue: e\n };\n if (\"string\" == typeof e) return {\n stringValue: e\n };\n if (e instanceof Date) {\n const n = Timestamp.fromDate(e);\n return {\n timestampValue: toTimestamp(t.serializer, n)\n };\n }\n if (e instanceof Timestamp) {\n // Firestore backend truncates precision down to microseconds. To ensure\n // offline mode works the same with regards to truncation, perform the\n // truncation immediately without waiting for the backend to do that.\n const n = new Timestamp(e.seconds, 1e3 * Math.floor(e.nanoseconds / 1e3));\n return {\n timestampValue: toTimestamp(t.serializer, n)\n };\n }\n if (e instanceof GeoPoint) return {\n geoPointValue: {\n latitude: e.latitude,\n longitude: e.longitude\n }\n };\n if (e instanceof Bytes) return {\n bytesValue: __PRIVATE_toBytes(t.serializer, e._byteString)\n };\n if (e instanceof DocumentReference) {\n const n = t.databaseId, r = e.firestore._databaseId;\n if (!r.isEqual(n)) throw t.Bu(`Document reference is for database ${r.projectId}/${r.database} but should be for database ${n.projectId}/${n.database}`);\n return {\n referenceValue: __PRIVATE_toResourceName(e.firestore._databaseId || t.databaseId, e._key.path)\n };\n }\n if (e instanceof VectorValue) \n /**\n * Creates a new VectorValue proto value (using the internal format).\n */\n return function __PRIVATE_parseVectorValue(e, t) {\n return {\n mapValue: {\n fields: {\n __type__: {\n stringValue: \"__vector__\"\n },\n value: {\n arrayValue: {\n values: e.toArray().map((e => {\n if (\"number\" != typeof e) throw t.Bu(\"VectorValues must only contain numeric values.\");\n return __PRIVATE_toDouble(t.serializer, e);\n }))\n }\n }\n }\n }\n };\n }\n /**\n * Checks whether an object looks like a JSON object that should be converted\n * into a struct. Normal class/prototype instances are considered to look like\n * JSON objects since they should be converted to a struct value. Arrays, Dates,\n * GeoPoints, etc. are not considered to look like JSON objects since they map\n * to specific FieldValue types other than ObjectValue.\n */ (e, t);\n throw t.Bu(`Unsupported field value: ${__PRIVATE_valueDescription(e)}`);\n }(e, t);\n}\n\nfunction __PRIVATE_parseObject(e, t) {\n const n = {};\n return isEmpty(e) ? \n // If we encounter an empty object, we explicitly add it to the update\n // mask to ensure that the server creates a map entry.\n t.path && t.path.length > 0 && t.fieldMask.push(t.path) : forEach(e, ((e, r) => {\n const i = __PRIVATE_parseData(r, t.Mu(e));\n null != i && (n[e] = i);\n })), {\n mapValue: {\n fields: n\n }\n };\n}\n\nfunction __PRIVATE_looksLikeJsonObject(e) {\n return !(\"object\" != typeof e || null === e || e instanceof Array || e instanceof Date || e instanceof Timestamp || e instanceof GeoPoint || e instanceof Bytes || e instanceof DocumentReference || e instanceof FieldValue || e instanceof VectorValue);\n}\n\nfunction __PRIVATE_validatePlainObject(e, t, n) {\n if (!__PRIVATE_looksLikeJsonObject(n) || !function __PRIVATE_isPlainObject(e) {\n return \"object\" == typeof e && null !== e && (Object.getPrototypeOf(e) === Object.prototype || null === Object.getPrototypeOf(e));\n }(n)) {\n const r = __PRIVATE_valueDescription(n);\n throw \"an object\" === r ? t.Bu(e + \" a custom object\") : t.Bu(e + \" \" + r);\n }\n}\n\n/**\n * Helper that calls fromDotSeparatedString() but wraps any error thrown.\n */ function __PRIVATE_fieldPathFromArgument$1(e, t, n) {\n if ((\n // If required, replace the FieldPath Compat class with the firestore-exp\n // FieldPath.\n t = getModularInstance(t)) instanceof FieldPath) return t._internalPath;\n if (\"string\" == typeof t) return __PRIVATE_fieldPathFromDotSeparatedString(e, t);\n throw __PRIVATE_createError(\"Field path arguments must be of type string or \", e, \n /* hasConverter= */ !1, \n /* path= */ void 0, n);\n}\n\n/**\n * Matches any characters in a field path string that are reserved.\n */ const De = new RegExp(\"[~\\\\*/\\\\[\\\\]]\");\n\n/**\n * Wraps fromDotSeparatedString with an error message about the method that\n * was thrown.\n * @param methodName - The publicly visible method name\n * @param path - The dot-separated string form of a field path which will be\n * split on dots.\n * @param targetDoc - The document against which the field path will be\n * evaluated.\n */ function __PRIVATE_fieldPathFromDotSeparatedString(e, t, n) {\n if (t.search(De) >= 0) throw __PRIVATE_createError(`Invalid field path (${t}). Paths must not contain '~', '*', '/', '[', or ']'`, e, \n /* hasConverter= */ !1, \n /* path= */ void 0, n);\n try {\n return new FieldPath(...t.split(\".\"))._internalPath;\n } catch (r) {\n throw __PRIVATE_createError(`Invalid field path (${t}). Paths must not be empty, begin with '.', end with '.', or contain '..'`, e, \n /* hasConverter= */ !1, \n /* path= */ void 0, n);\n }\n}\n\nfunction __PRIVATE_createError(e, t, n, r, i) {\n const s = r && !r.isEmpty(), o = void 0 !== i;\n let _ = `Function ${t}() called with invalid data`;\n n && (_ += \" (via `toFirestore()`)\"), _ += \". \";\n let a = \"\";\n return (s || o) && (a += \" (found\", s && (a += ` in field ${r}`), o && (a += ` in document ${i}`), \n a += \")\"), new FirestoreError(D.INVALID_ARGUMENT, _ + e + a);\n}\n\n/** Checks `haystack` if FieldPath `needle` is present. Runs in O(n). */ function __PRIVATE_fieldMaskContains(e, t) {\n return e.some((e => e.isEqual(t)));\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A `DocumentSnapshot` contains data read from a document in your Firestore\n * database. The data can be extracted with `.data()` or `.get()` to\n * get a specific field.\n *\n * For a `DocumentSnapshot` that points to a non-existing document, any data\n * access will return 'undefined'. You can use the `exists()` method to\n * explicitly verify a document's existence.\n */ class DocumentSnapshot$1 {\n // Note: This class is stripped down version of the DocumentSnapshot in\n // the legacy SDK. The changes are:\n // - No support for SnapshotMetadata.\n // - No support for SnapshotOptions.\n /** @hideconstructor protected */\n constructor(e, t, n, r, i) {\n this._firestore = e, this._userDataWriter = t, this._key = n, this._document = r, \n this._converter = i;\n }\n /** Property of the `DocumentSnapshot` that provides the document's ID. */ get id() {\n return this._key.path.lastSegment();\n }\n /**\n * The `DocumentReference` for the document included in the `DocumentSnapshot`.\n */ get ref() {\n return new DocumentReference(this._firestore, this._converter, this._key);\n }\n /**\n * Signals whether or not the document at the snapshot's location exists.\n *\n * @returns true if the document exists.\n */ exists() {\n return null !== this._document;\n }\n /**\n * Retrieves all fields in the document as an `Object`. Returns `undefined` if\n * the document doesn't exist.\n *\n * @returns An `Object` containing all fields in the document or `undefined`\n * if the document doesn't exist.\n */ data() {\n if (this._document) {\n if (this._converter) {\n // We only want to use the converter and create a new DocumentSnapshot\n // if a converter has been provided.\n const e = new QueryDocumentSnapshot$1(this._firestore, this._userDataWriter, this._key, this._document, \n /* converter= */ null);\n return this._converter.fromFirestore(e);\n }\n return this._userDataWriter.convertValue(this._document.data.value);\n }\n }\n /**\n * Retrieves the field specified by `fieldPath`. Returns `undefined` if the\n * document or field doesn't exist.\n *\n * @param fieldPath - The path (for example 'foo' or 'foo.bar') to a specific\n * field.\n * @returns The data at the specified field location or undefined if no such\n * field exists in the document.\n */\n // We are using `any` here to avoid an explicit cast by our users.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(e) {\n if (this._document) {\n const t = this._document.data.field(__PRIVATE_fieldPathFromArgument(\"DocumentSnapshot.get\", e));\n if (null !== t) return this._userDataWriter.convertValue(t);\n }\n }\n}\n\n/**\n * A `QueryDocumentSnapshot` contains data read from a document in your\n * Firestore database as part of a query. The document is guaranteed to exist\n * and its data can be extracted with `.data()` or `.get()` to get a\n * specific field.\n *\n * A `QueryDocumentSnapshot` offers the same API surface as a\n * `DocumentSnapshot`. Since query results contain only existing documents, the\n * `exists` property will always be true and `data()` will never return\n * 'undefined'.\n */ class QueryDocumentSnapshot$1 extends DocumentSnapshot$1 {\n /**\n * Retrieves all fields in the document as an `Object`.\n *\n * @override\n * @returns An `Object` containing all fields in the document.\n */\n data() {\n return super.data();\n }\n}\n\n/**\n * Helper that calls `fromDotSeparatedString()` but wraps any error thrown.\n */ function __PRIVATE_fieldPathFromArgument(e, t) {\n return \"string\" == typeof t ? __PRIVATE_fieldPathFromDotSeparatedString(e, t) : t instanceof FieldPath ? t._internalPath : t._delegate._internalPath;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ function __PRIVATE_validateHasExplicitOrderByForLimitToLast(e) {\n if (\"L\" /* LimitType.Last */ === e.limitType && 0 === e.explicitOrderBy.length) throw new FirestoreError(D.UNIMPLEMENTED, \"limitToLast() queries require specifying at least one orderBy() clause\");\n}\n\n/**\n * An `AppliableConstraint` is an abstraction of a constraint that can be applied\n * to a Firestore query.\n */ class AppliableConstraint {}\n\n/**\n * A `QueryConstraint` is used to narrow the set of documents returned by a\n * Firestore query. `QueryConstraint`s are created by invoking {@link where},\n * {@link orderBy}, {@link (startAt:1)}, {@link (startAfter:1)}, {@link\n * (endBefore:1)}, {@link (endAt:1)}, {@link limit}, {@link limitToLast} and\n * can then be passed to {@link (query:1)} to create a new query instance that\n * also contains this `QueryConstraint`.\n */ class QueryConstraint extends AppliableConstraint {}\n\nfunction query(e, t, ...n) {\n let r = [];\n t instanceof AppliableConstraint && r.push(t), r = r.concat(n), function __PRIVATE_validateQueryConstraintArray(e) {\n const t = e.filter((e => e instanceof QueryCompositeFilterConstraint)).length, n = e.filter((e => e instanceof QueryFieldFilterConstraint)).length;\n if (t > 1 || t > 0 && n > 0) throw new FirestoreError(D.INVALID_ARGUMENT, \"InvalidQuery. When using composite filters, you cannot use more than one filter at the top level. Consider nesting the multiple filters within an `and(...)` statement. For example: change `query(query, where(...), or(...))` to `query(query, and(where(...), or(...)))`.\");\n }\n /**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /**\n * Converts Firestore's internal types to the JavaScript types that we expose\n * to the user.\n *\n * @internal\n */ (r);\n for (const t of r) e = t._apply(e);\n return e;\n}\n\n/**\n * A `QueryFieldFilterConstraint` is used to narrow the set of documents returned by\n * a Firestore query by filtering on one or more document fields.\n * `QueryFieldFilterConstraint`s are created by invoking {@link where} and can then\n * be passed to {@link (query:1)} to create a new query instance that also contains\n * this `QueryFieldFilterConstraint`.\n */ class QueryFieldFilterConstraint extends QueryConstraint {\n /**\n * @internal\n */\n constructor(e, t, n) {\n super(), this._field = e, this._op = t, this._value = n, \n /** The type of this query constraint */\n this.type = \"where\";\n }\n static _create(e, t, n) {\n return new QueryFieldFilterConstraint(e, t, n);\n }\n _apply(e) {\n const t = this._parse(e);\n return __PRIVATE_validateNewFieldFilter(e._query, t), new Query(e.firestore, e.converter, __PRIVATE_queryWithAddedFilter(e._query, t));\n }\n _parse(e) {\n const t = __PRIVATE_newUserDataReader(e.firestore), n = function __PRIVATE_newQueryFilter(e, t, n, r, i, s, o) {\n let _;\n if (i.isKeyField()) {\n if (\"array-contains\" /* Operator.ARRAY_CONTAINS */ === s || \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ === s) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid Query. You can't perform '${s}' queries on documentId().`);\n if (\"in\" /* Operator.IN */ === s || \"not-in\" /* Operator.NOT_IN */ === s) {\n __PRIVATE_validateDisjunctiveFilterElements(o, s);\n const t = [];\n for (const n of o) t.push(__PRIVATE_parseDocumentIdValue(r, e, n));\n _ = {\n arrayValue: {\n values: t\n }\n };\n } else _ = __PRIVATE_parseDocumentIdValue(r, e, o);\n } else \"in\" /* Operator.IN */ !== s && \"not-in\" /* Operator.NOT_IN */ !== s && \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ !== s || __PRIVATE_validateDisjunctiveFilterElements(o, s), \n _ = __PRIVATE_parseQueryValue(n, t, o, \n /* allowArrays= */ \"in\" /* Operator.IN */ === s || \"not-in\" /* Operator.NOT_IN */ === s);\n return FieldFilter.create(i, s, _);\n }(e._query, \"where\", t, e.firestore._databaseId, this._field, this._op, this._value);\n return n;\n }\n}\n\n/**\n * Creates a {@link QueryFieldFilterConstraint} that enforces that documents\n * must contain the specified field and that the value should satisfy the\n * relation constraint provided.\n *\n * @param fieldPath - The path to compare\n * @param opStr - The operation string (e.g \"<\", \"<=\", \"==\", \"<\",\n * \"<=\", \"!=\").\n * @param value - The value for comparison\n * @returns The created {@link QueryFieldFilterConstraint}.\n */ function where(e, t, n) {\n const r = t, i = __PRIVATE_fieldPathFromArgument(\"where\", e);\n return QueryFieldFilterConstraint._create(i, r, n);\n}\n\n/**\n * A `QueryCompositeFilterConstraint` is used to narrow the set of documents\n * returned by a Firestore query by performing the logical OR or AND of multiple\n * {@link QueryFieldFilterConstraint}s or {@link QueryCompositeFilterConstraint}s.\n * `QueryCompositeFilterConstraint`s are created by invoking {@link or} or\n * {@link and} and can then be passed to {@link (query:1)} to create a new query\n * instance that also contains the `QueryCompositeFilterConstraint`.\n */ class QueryCompositeFilterConstraint extends AppliableConstraint {\n /**\n * @internal\n */\n constructor(\n /** The type of this query constraint */\n e, t) {\n super(), this.type = e, this._queryConstraints = t;\n }\n static _create(e, t) {\n return new QueryCompositeFilterConstraint(e, t);\n }\n _parse(e) {\n const t = this._queryConstraints.map((t => t._parse(e))).filter((e => e.getFilters().length > 0));\n return 1 === t.length ? t[0] : CompositeFilter.create(t, this._getOperator());\n }\n _apply(e) {\n const t = this._parse(e);\n return 0 === t.getFilters().length ? e : (function __PRIVATE_validateNewFilter(e, t) {\n let n = e;\n const r = t.getFlattenedFilters();\n for (const e of r) __PRIVATE_validateNewFieldFilter(n, e), n = __PRIVATE_queryWithAddedFilter(n, e);\n }\n // Checks if any of the provided filter operators are included in the given list of filters and\n // returns the first one that is, or null if none are.\n (e._query, t), new Query(e.firestore, e.converter, __PRIVATE_queryWithAddedFilter(e._query, t)));\n }\n _getQueryConstraints() {\n return this._queryConstraints;\n }\n _getOperator() {\n return \"and\" === this.type ? \"and\" /* CompositeOperator.AND */ : \"or\" /* CompositeOperator.OR */;\n }\n}\n\n/**\n * Creates a new {@link QueryCompositeFilterConstraint} that is a disjunction of\n * the given filter constraints. A disjunction filter includes a document if it\n * satisfies any of the given filters.\n *\n * @param queryConstraints - Optional. The list of\n * {@link QueryFilterConstraint}s to perform a disjunction for. These must be\n * created with calls to {@link where}, {@link or}, or {@link and}.\n * @returns The newly created {@link QueryCompositeFilterConstraint}.\n */ function or(...e) {\n // Only support QueryFilterConstraints\n return e.forEach((e => __PRIVATE_validateQueryFilterConstraint(\"or\", e))), QueryCompositeFilterConstraint._create(\"or\" /* CompositeOperator.OR */ , e);\n}\n\n/**\n * Creates a new {@link QueryCompositeFilterConstraint} that is a conjunction of\n * the given filter constraints. A conjunction filter includes a document if it\n * satisfies all of the given filters.\n *\n * @param queryConstraints - Optional. The list of\n * {@link QueryFilterConstraint}s to perform a conjunction for. These must be\n * created with calls to {@link where}, {@link or}, or {@link and}.\n * @returns The newly created {@link QueryCompositeFilterConstraint}.\n */ function and(...e) {\n // Only support QueryFilterConstraints\n return e.forEach((e => __PRIVATE_validateQueryFilterConstraint(\"and\", e))), QueryCompositeFilterConstraint._create(\"and\" /* CompositeOperator.AND */ , e);\n}\n\n/**\n * A `QueryOrderByConstraint` is used to sort the set of documents returned by a\n * Firestore query. `QueryOrderByConstraint`s are created by invoking\n * {@link orderBy} and can then be passed to {@link (query:1)} to create a new query\n * instance that also contains this `QueryOrderByConstraint`.\n *\n * Note: Documents that do not contain the orderBy field will not be present in\n * the query result.\n */ class QueryOrderByConstraint extends QueryConstraint {\n /**\n * @internal\n */\n constructor(e, t) {\n super(), this._field = e, this._direction = t, \n /** The type of this query constraint */\n this.type = \"orderBy\";\n }\n static _create(e, t) {\n return new QueryOrderByConstraint(e, t);\n }\n _apply(e) {\n const t = function __PRIVATE_newQueryOrderBy(e, t, n) {\n if (null !== e.startAt) throw new FirestoreError(D.INVALID_ARGUMENT, \"Invalid query. You must not call startAt() or startAfter() before calling orderBy().\");\n if (null !== e.endAt) throw new FirestoreError(D.INVALID_ARGUMENT, \"Invalid query. You must not call endAt() or endBefore() before calling orderBy().\");\n return new OrderBy(t, n);\n }\n /**\n * Create a `Bound` from a query and a document.\n *\n * Note that the `Bound` will always include the key of the document\n * and so only the provided document will compare equal to the returned\n * position.\n *\n * Will throw if the document does not contain all fields of the order by\n * of the query or if any of the fields in the order by are an uncommitted\n * server timestamp.\n */ (e._query, this._field, this._direction);\n return new Query(e.firestore, e.converter, function __PRIVATE_queryWithAddedOrderBy(e, t) {\n // TODO(dimond): validate that orderBy does not list the same key twice.\n const n = e.explicitOrderBy.concat([ t ]);\n return new __PRIVATE_QueryImpl(e.path, e.collectionGroup, n, e.filters.slice(), e.limit, e.limitType, e.startAt, e.endAt);\n }(e._query, t));\n }\n}\n\n/**\n * Creates a {@link QueryOrderByConstraint} that sorts the query result by the\n * specified field, optionally in descending order instead of ascending.\n *\n * Note: Documents that do not contain the specified field will not be present\n * in the query result.\n *\n * @param fieldPath - The field to sort by.\n * @param directionStr - Optional direction to sort by ('asc' or 'desc'). If\n * not specified, order will be ascending.\n * @returns The created {@link QueryOrderByConstraint}.\n */ function orderBy(e, t = \"asc\") {\n const n = t, r = __PRIVATE_fieldPathFromArgument(\"orderBy\", e);\n return QueryOrderByConstraint._create(r, n);\n}\n\n/**\n * A `QueryLimitConstraint` is used to limit the number of documents returned by\n * a Firestore query.\n * `QueryLimitConstraint`s are created by invoking {@link limit} or\n * {@link limitToLast} and can then be passed to {@link (query:1)} to create a new\n * query instance that also contains this `QueryLimitConstraint`.\n */ class QueryLimitConstraint extends QueryConstraint {\n /**\n * @internal\n */\n constructor(\n /** The type of this query constraint */\n e, t, n) {\n super(), this.type = e, this._limit = t, this._limitType = n;\n }\n static _create(e, t, n) {\n return new QueryLimitConstraint(e, t, n);\n }\n _apply(e) {\n return new Query(e.firestore, e.converter, __PRIVATE_queryWithLimit(e._query, this._limit, this._limitType));\n }\n}\n\n/**\n * Creates a {@link QueryLimitConstraint} that only returns the first matching\n * documents.\n *\n * @param limit - The maximum number of items to return.\n * @returns The created {@link QueryLimitConstraint}.\n */ function limit(e) {\n return __PRIVATE_validatePositiveNumber(\"limit\", e), QueryLimitConstraint._create(\"limit\", e, \"F\" /* LimitType.First */);\n}\n\n/**\n * Creates a {@link QueryLimitConstraint} that only returns the last matching\n * documents.\n *\n * You must specify at least one `orderBy` clause for `limitToLast` queries,\n * otherwise an exception will be thrown during execution.\n *\n * @param limit - The maximum number of items to return.\n * @returns The created {@link QueryLimitConstraint}.\n */ function limitToLast(e) {\n return __PRIVATE_validatePositiveNumber(\"limitToLast\", e), QueryLimitConstraint._create(\"limitToLast\", e, \"L\" /* LimitType.Last */);\n}\n\n/**\n * A `QueryStartAtConstraint` is used to exclude documents from the start of a\n * result set returned by a Firestore query.\n * `QueryStartAtConstraint`s are created by invoking {@link (startAt:1)} or\n * {@link (startAfter:1)} and can then be passed to {@link (query:1)} to create a\n * new query instance that also contains this `QueryStartAtConstraint`.\n */ class QueryStartAtConstraint extends QueryConstraint {\n /**\n * @internal\n */\n constructor(\n /** The type of this query constraint */\n e, t, n) {\n super(), this.type = e, this._docOrFields = t, this._inclusive = n;\n }\n static _create(e, t, n) {\n return new QueryStartAtConstraint(e, t, n);\n }\n _apply(e) {\n const t = __PRIVATE_newQueryBoundFromDocOrFields(e, this.type, this._docOrFields, this._inclusive);\n return new Query(e.firestore, e.converter, function __PRIVATE_queryWithStartAt(e, t) {\n return new __PRIVATE_QueryImpl(e.path, e.collectionGroup, e.explicitOrderBy.slice(), e.filters.slice(), e.limit, e.limitType, t, e.endAt);\n }(e._query, t));\n }\n}\n\nfunction startAt(...e) {\n return QueryStartAtConstraint._create(\"startAt\", e, \n /*inclusive=*/ !0);\n}\n\nfunction startAfter(...e) {\n return QueryStartAtConstraint._create(\"startAfter\", e, \n /*inclusive=*/ !1);\n}\n\n/**\n * A `QueryEndAtConstraint` is used to exclude documents from the end of a\n * result set returned by a Firestore query.\n * `QueryEndAtConstraint`s are created by invoking {@link (endAt:1)} or\n * {@link (endBefore:1)} and can then be passed to {@link (query:1)} to create a new\n * query instance that also contains this `QueryEndAtConstraint`.\n */ class QueryEndAtConstraint extends QueryConstraint {\n /**\n * @internal\n */\n constructor(\n /** The type of this query constraint */\n e, t, n) {\n super(), this.type = e, this._docOrFields = t, this._inclusive = n;\n }\n static _create(e, t, n) {\n return new QueryEndAtConstraint(e, t, n);\n }\n _apply(e) {\n const t = __PRIVATE_newQueryBoundFromDocOrFields(e, this.type, this._docOrFields, this._inclusive);\n return new Query(e.firestore, e.converter, function __PRIVATE_queryWithEndAt(e, t) {\n return new __PRIVATE_QueryImpl(e.path, e.collectionGroup, e.explicitOrderBy.slice(), e.filters.slice(), e.limit, e.limitType, e.startAt, t);\n }(e._query, t));\n }\n}\n\nfunction endBefore(...e) {\n return QueryEndAtConstraint._create(\"endBefore\", e, \n /*inclusive=*/ !1);\n}\n\nfunction endAt(...e) {\n return QueryEndAtConstraint._create(\"endAt\", e, \n /*inclusive=*/ !0);\n}\n\n/** Helper function to create a bound from a document or fields */ function __PRIVATE_newQueryBoundFromDocOrFields(e, t, n, r) {\n if (n[0] = getModularInstance(n[0]), n[0] instanceof DocumentSnapshot$1) return function __PRIVATE_newQueryBoundFromDocument(e, t, n, r, i) {\n if (!r) throw new FirestoreError(D.NOT_FOUND, `Can't use a DocumentSnapshot that doesn't exist for ${n}().`);\n const s = [];\n // Because people expect to continue/end a query at the exact document\n // provided, we need to use the implicit sort order rather than the explicit\n // sort order, because it's guaranteed to contain the document key. That way\n // the position becomes unambiguous and the query continues/ends exactly at\n // the provided document. Without the key (by using the explicit sort\n // orders), multiple documents could match the position, yielding duplicate\n // results.\n for (const n of __PRIVATE_queryNormalizedOrderBy(e)) if (n.field.isKeyField()) s.push(__PRIVATE_refValue(t, r.key)); else {\n const e = r.data.field(n.field);\n if (__PRIVATE_isServerTimestamp(e)) throw new FirestoreError(D.INVALID_ARGUMENT, 'Invalid query. You are trying to start or end a query using a document for which the field \"' + n.field + '\" is an uncommitted server timestamp. (Since the value of this field is unknown, you cannot start/end a query with it.)');\n if (null === e) {\n const e = n.field.canonicalString();\n throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. You are trying to start or end a query using a document for which the field '${e}' (used as the orderBy) does not exist.`);\n }\n s.push(e);\n }\n return new Bound(s, i);\n }\n /**\n * Converts a list of field values to a `Bound` for the given query.\n */ (e._query, e.firestore._databaseId, t, n[0]._document, r);\n {\n const i = __PRIVATE_newUserDataReader(e.firestore);\n return function __PRIVATE_newQueryBoundFromFields(e, t, n, r, i, s) {\n // Use explicit order by's because it has to match the query the user made\n const o = e.explicitOrderBy;\n if (i.length > o.length) throw new FirestoreError(D.INVALID_ARGUMENT, `Too many arguments provided to ${r}(). The number of arguments must be less than or equal to the number of orderBy() clauses`);\n const _ = [];\n for (let s = 0; s < i.length; s++) {\n const a = i[s];\n if (o[s].field.isKeyField()) {\n if (\"string\" != typeof a) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. Expected a string for document ID in ${r}(), but got a ${typeof a}`);\n if (!__PRIVATE_isCollectionGroupQuery(e) && -1 !== a.indexOf(\"/\")) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. When querying a collection and ordering by documentId(), the value passed to ${r}() must be a plain document ID, but '${a}' contains a slash.`);\n const n = e.path.child(ResourcePath.fromString(a));\n if (!DocumentKey.isDocumentKey(n)) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. When querying a collection group and ordering by documentId(), the value passed to ${r}() must result in a valid document path, but '${n}' is not because it contains an odd number of segments.`);\n const i = new DocumentKey(n);\n _.push(__PRIVATE_refValue(t, i));\n } else {\n const e = __PRIVATE_parseQueryValue(n, r, a);\n _.push(e);\n }\n }\n return new Bound(_, s);\n }\n /**\n * Parses the given `documentIdValue` into a `ReferenceValue`, throwing\n * appropriate errors if the value is anything other than a `DocumentReference`\n * or `string`, or if the string is malformed.\n */ (e._query, e.firestore._databaseId, i, t, n, r);\n }\n}\n\nfunction __PRIVATE_parseDocumentIdValue(e, t, n) {\n if (\"string\" == typeof (n = getModularInstance(n))) {\n if (\"\" === n) throw new FirestoreError(D.INVALID_ARGUMENT, \"Invalid query. When querying with documentId(), you must provide a valid document ID, but it was an empty string.\");\n if (!__PRIVATE_isCollectionGroupQuery(t) && -1 !== n.indexOf(\"/\")) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. When querying a collection by documentId(), you must provide a plain document ID, but '${n}' contains a '/' character.`);\n const r = t.path.child(ResourcePath.fromString(n));\n if (!DocumentKey.isDocumentKey(r)) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. When querying a collection group by documentId(), the value provided must result in a valid document path, but '${r}' is not because it has an odd number of segments (${r.length}).`);\n return __PRIVATE_refValue(e, new DocumentKey(r));\n }\n if (n instanceof DocumentReference) return __PRIVATE_refValue(e, n._key);\n throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. When querying with documentId(), you must provide a valid string or a DocumentReference, but it was: ${__PRIVATE_valueDescription(n)}.`);\n}\n\n/**\n * Validates that the value passed into a disjunctive filter satisfies all\n * array requirements.\n */ function __PRIVATE_validateDisjunctiveFilterElements(e, t) {\n if (!Array.isArray(e) || 0 === e.length) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid Query. A non-empty array is required for '${t.toString()}' filters.`);\n}\n\n/**\n * Given an operator, returns the set of operators that cannot be used with it.\n *\n * This is not a comprehensive check, and this function should be removed in the\n * long term. Validations should occur in the Firestore backend.\n *\n * Operators in a query must adhere to the following set of rules:\n * 1. Only one inequality per query.\n * 2. `NOT_IN` cannot be used with array, disjunctive, or `NOT_EQUAL` operators.\n */ function __PRIVATE_validateNewFieldFilter(e, t) {\n const n = function __PRIVATE_findOpInsideFilters(e, t) {\n for (const n of e) for (const e of n.getFlattenedFilters()) if (t.indexOf(e.op) >= 0) return e.op;\n return null;\n }(e.filters, function __PRIVATE_conflictingOps(e) {\n switch (e) {\n case \"!=\" /* Operator.NOT_EQUAL */ :\n return [ \"!=\" /* Operator.NOT_EQUAL */ , \"not-in\" /* Operator.NOT_IN */ ];\n\n case \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ :\n case \"in\" /* Operator.IN */ :\n return [ \"not-in\" /* Operator.NOT_IN */ ];\n\n case \"not-in\" /* Operator.NOT_IN */ :\n return [ \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ , \"in\" /* Operator.IN */ , \"not-in\" /* Operator.NOT_IN */ , \"!=\" /* Operator.NOT_EQUAL */ ];\n\n default:\n return [];\n }\n }(t.op));\n if (null !== n) \n // Special case when it's a duplicate op to give a slightly clearer error message.\n throw n === t.op ? new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. You cannot use more than one '${t.op.toString()}' filter.`) : new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. You cannot use '${t.op.toString()}' filters with '${n.toString()}' filters.`);\n}\n\nfunction __PRIVATE_validateQueryFilterConstraint(e, t) {\n if (!(t instanceof QueryFieldFilterConstraint || t instanceof QueryCompositeFilterConstraint)) throw new FirestoreError(D.INVALID_ARGUMENT, `Function ${e}() requires AppliableConstraints created with a call to 'where(...)', 'or(...)', or 'and(...)'.`);\n}\n\nclass AbstractUserDataWriter {\n convertValue(e, t = \"none\") {\n switch (__PRIVATE_typeOrder(e)) {\n case 0 /* TypeOrder.NullValue */ :\n return null;\n\n case 1 /* TypeOrder.BooleanValue */ :\n return e.booleanValue;\n\n case 2 /* TypeOrder.NumberValue */ :\n return __PRIVATE_normalizeNumber(e.integerValue || e.doubleValue);\n\n case 3 /* TypeOrder.TimestampValue */ :\n return this.convertTimestamp(e.timestampValue);\n\n case 4 /* TypeOrder.ServerTimestampValue */ :\n return this.convertServerTimestamp(e, t);\n\n case 5 /* TypeOrder.StringValue */ :\n return e.stringValue;\n\n case 6 /* TypeOrder.BlobValue */ :\n return this.convertBytes(__PRIVATE_normalizeByteString(e.bytesValue));\n\n case 7 /* TypeOrder.RefValue */ :\n return this.convertReference(e.referenceValue);\n\n case 8 /* TypeOrder.GeoPointValue */ :\n return this.convertGeoPoint(e.geoPointValue);\n\n case 9 /* TypeOrder.ArrayValue */ :\n return this.convertArray(e.arrayValue, t);\n\n case 11 /* TypeOrder.ObjectValue */ :\n return this.convertObject(e.mapValue, t);\n\n case 10 /* TypeOrder.VectorValue */ :\n return this.convertVectorValue(e.mapValue);\n\n default:\n throw fail();\n }\n }\n convertObject(e, t) {\n return this.convertObjectMap(e.fields, t);\n }\n /**\n * @internal\n */ convertObjectMap(e, t = \"none\") {\n const n = {};\n return forEach(e, ((e, r) => {\n n[e] = this.convertValue(r, t);\n })), n;\n }\n /**\n * @internal\n */ convertVectorValue(e) {\n var t, n, r;\n const i = null === (r = null === (n = null === (t = e.fields) || void 0 === t ? void 0 : t.value.arrayValue) || void 0 === n ? void 0 : n.values) || void 0 === r ? void 0 : r.map((e => __PRIVATE_normalizeNumber(e.doubleValue)));\n return new VectorValue(i);\n }\n convertGeoPoint(e) {\n return new GeoPoint(__PRIVATE_normalizeNumber(e.latitude), __PRIVATE_normalizeNumber(e.longitude));\n }\n convertArray(e, t) {\n return (e.values || []).map((e => this.convertValue(e, t)));\n }\n convertServerTimestamp(e, t) {\n switch (t) {\n case \"previous\":\n const n = __PRIVATE_getPreviousValue(e);\n return null == n ? null : this.convertValue(n, t);\n\n case \"estimate\":\n return this.convertTimestamp(__PRIVATE_getLocalWriteTime(e));\n\n default:\n return null;\n }\n }\n convertTimestamp(e) {\n const t = __PRIVATE_normalizeTimestamp(e);\n return new Timestamp(t.seconds, t.nanos);\n }\n convertDocumentKey(e, t) {\n const n = ResourcePath.fromString(e);\n __PRIVATE_hardAssert(__PRIVATE_isValidResourceName(n));\n const r = new DatabaseId(n.get(1), n.get(3)), i = new DocumentKey(n.popFirst(5));\n return r.isEqual(t) || \n // TODO(b/64130202): Somehow support foreign references.\n __PRIVATE_logError(`Document ${i} contains a document reference within a different database (${r.projectId}/${r.database}) which is not supported. It will be treated as a reference in the current database (${t.projectId}/${t.database}) instead.`), \n i;\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Converts custom model object of type T into `DocumentData` by applying the\n * converter if it exists.\n *\n * This function is used when converting user objects to `DocumentData`\n * because we want to provide the user with a more specific error message if\n * their `set()` or fails due to invalid data originating from a `toFirestore()`\n * call.\n */ function __PRIVATE_applyFirestoreDataConverter(e, t, n) {\n let r;\n // Cast to `any` in order to satisfy the union type constraint on\n // toFirestore().\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return r = e ? n && (n.merge || n.mergeFields) ? e.toFirestore(t, n) : e.toFirestore(t) : t, \n r;\n}\n\nclass __PRIVATE_LiteUserDataWriter extends AbstractUserDataWriter {\n constructor(e) {\n super(), this.firestore = e;\n }\n convertBytes(e) {\n return new Bytes(e);\n }\n convertReference(e) {\n const t = this.convertDocumentKey(e, this.firestore._databaseId);\n return new DocumentReference(this.firestore, /* converter= */ null, t);\n }\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Create an AggregateField object that can be used to compute the sum of\n * a specified field over a range of documents in the result set of a query.\n * @param field Specifies the field to sum across the result set.\n */ function sum(e) {\n return new AggregateField(\"sum\", __PRIVATE_fieldPathFromArgument$1(\"sum\", e));\n}\n\n/**\n * Create an AggregateField object that can be used to compute the average of\n * a specified field over a range of documents in the result set of a query.\n * @param field Specifies the field to average across the result set.\n */ function average(e) {\n return new AggregateField(\"avg\", __PRIVATE_fieldPathFromArgument$1(\"average\", e));\n}\n\n/**\n * Create an AggregateField object that can be used to compute the count of\n * documents in the result set of a query.\n */ function count() {\n return new AggregateField(\"count\");\n}\n\n/**\n * Compares two 'AggregateField` instances for equality.\n *\n * @param left Compare this AggregateField to the `right`.\n * @param right Compare this AggregateField to the `left`.\n */ function aggregateFieldEqual(e, t) {\n var n, r;\n return e instanceof AggregateField && t instanceof AggregateField && e.aggregateType === t.aggregateType && (null === (n = e._internalFieldPath) || void 0 === n ? void 0 : n.canonicalString()) === (null === (r = t._internalFieldPath) || void 0 === r ? void 0 : r.canonicalString());\n}\n\n/**\n * Compares two `AggregateQuerySnapshot` instances for equality.\n *\n * Two `AggregateQuerySnapshot` instances are considered \"equal\" if they have\n * underlying queries that compare equal, and the same data.\n *\n * @param left - The first `AggregateQuerySnapshot` to compare.\n * @param right - The second `AggregateQuerySnapshot` to compare.\n *\n * @returns `true` if the objects are \"equal\", as defined above, or `false`\n * otherwise.\n */ function aggregateQuerySnapshotEqual(e, t) {\n return queryEqual(e.query, t.query) && deepEqual(e.data(), t.data());\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Metadata about a snapshot, describing the state of the snapshot.\n */ class SnapshotMetadata {\n /** @hideconstructor */\n constructor(e, t) {\n this.hasPendingWrites = e, this.fromCache = t;\n }\n /**\n * Returns true if this `SnapshotMetadata` is equal to the provided one.\n *\n * @param other - The `SnapshotMetadata` to compare against.\n * @returns true if this `SnapshotMetadata` is equal to the provided one.\n */ isEqual(e) {\n return this.hasPendingWrites === e.hasPendingWrites && this.fromCache === e.fromCache;\n }\n}\n\n/**\n * A `DocumentSnapshot` contains data read from a document in your Firestore\n * database. The data can be extracted with `.data()` or `.get()` to\n * get a specific field.\n *\n * For a `DocumentSnapshot` that points to a non-existing document, any data\n * access will return 'undefined'. You can use the `exists()` method to\n * explicitly verify a document's existence.\n */ class DocumentSnapshot extends DocumentSnapshot$1 {\n /** @hideconstructor protected */\n constructor(e, t, n, r, i, s) {\n super(e, t, n, r, s), this._firestore = e, this._firestoreImpl = e, this.metadata = i;\n }\n /**\n * Returns whether or not the data exists. True if the document exists.\n */ exists() {\n return super.exists();\n }\n /**\n * Retrieves all fields in the document as an `Object`. Returns `undefined` if\n * the document doesn't exist.\n *\n * By default, `serverTimestamp()` values that have not yet been\n * set to their final value will be returned as `null`. You can override\n * this by passing an options object.\n *\n * @param options - An options object to configure how data is retrieved from\n * the snapshot (for example the desired behavior for server timestamps that\n * have not yet been set to their final value).\n * @returns An `Object` containing all fields in the document or `undefined` if\n * the document doesn't exist.\n */ data(e = {}) {\n if (this._document) {\n if (this._converter) {\n // We only want to use the converter and create a new DocumentSnapshot\n // if a converter has been provided.\n const t = new QueryDocumentSnapshot(this._firestore, this._userDataWriter, this._key, this._document, this.metadata, \n /* converter= */ null);\n return this._converter.fromFirestore(t, e);\n }\n return this._userDataWriter.convertValue(this._document.data.value, e.serverTimestamps);\n }\n }\n /**\n * Retrieves the field specified by `fieldPath`. Returns `undefined` if the\n * document or field doesn't exist.\n *\n * By default, a `serverTimestamp()` that has not yet been set to\n * its final value will be returned as `null`. You can override this by\n * passing an options object.\n *\n * @param fieldPath - The path (for example 'foo' or 'foo.bar') to a specific\n * field.\n * @param options - An options object to configure how the field is retrieved\n * from the snapshot (for example the desired behavior for server timestamps\n * that have not yet been set to their final value).\n * @returns The data at the specified field location or undefined if no such\n * field exists in the document.\n */\n // We are using `any` here to avoid an explicit cast by our users.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(e, t = {}) {\n if (this._document) {\n const n = this._document.data.field(__PRIVATE_fieldPathFromArgument(\"DocumentSnapshot.get\", e));\n if (null !== n) return this._userDataWriter.convertValue(n, t.serverTimestamps);\n }\n }\n}\n\n/**\n * A `QueryDocumentSnapshot` contains data read from a document in your\n * Firestore database as part of a query. The document is guaranteed to exist\n * and its data can be extracted with `.data()` or `.get()` to get a\n * specific field.\n *\n * A `QueryDocumentSnapshot` offers the same API surface as a\n * `DocumentSnapshot`. Since query results contain only existing documents, the\n * `exists` property will always be true and `data()` will never return\n * 'undefined'.\n */ class QueryDocumentSnapshot extends DocumentSnapshot {\n /**\n * Retrieves all fields in the document as an `Object`.\n *\n * By default, `serverTimestamp()` values that have not yet been\n * set to their final value will be returned as `null`. You can override\n * this by passing an options object.\n *\n * @override\n * @param options - An options object to configure how data is retrieved from\n * the snapshot (for example the desired behavior for server timestamps that\n * have not yet been set to their final value).\n * @returns An `Object` containing all fields in the document.\n */\n data(e = {}) {\n return super.data(e);\n }\n}\n\n/**\n * A `QuerySnapshot` contains zero or more `DocumentSnapshot` objects\n * representing the results of a query. The documents can be accessed as an\n * array via the `docs` property or enumerated using the `forEach` method. The\n * number of documents can be determined via the `empty` and `size`\n * properties.\n */ class QuerySnapshot {\n /** @hideconstructor */\n constructor(e, t, n, r) {\n this._firestore = e, this._userDataWriter = t, this._snapshot = r, this.metadata = new SnapshotMetadata(r.hasPendingWrites, r.fromCache), \n this.query = n;\n }\n /** An array of all the documents in the `QuerySnapshot`. */ get docs() {\n const e = [];\n return this.forEach((t => e.push(t))), e;\n }\n /** The number of documents in the `QuerySnapshot`. */ get size() {\n return this._snapshot.docs.size;\n }\n /** True if there are no documents in the `QuerySnapshot`. */ get empty() {\n return 0 === this.size;\n }\n /**\n * Enumerates all of the documents in the `QuerySnapshot`.\n *\n * @param callback - A callback to be called with a `QueryDocumentSnapshot` for\n * each document in the snapshot.\n * @param thisArg - The `this` binding for the callback.\n */ forEach(e, t) {\n this._snapshot.docs.forEach((n => {\n e.call(t, new QueryDocumentSnapshot(this._firestore, this._userDataWriter, n.key, n, new SnapshotMetadata(this._snapshot.mutatedKeys.has(n.key), this._snapshot.fromCache), this.query.converter));\n }));\n }\n /**\n * Returns an array of the documents changes since the last snapshot. If this\n * is the first snapshot, all documents will be in the list as 'added'\n * changes.\n *\n * @param options - `SnapshotListenOptions` that control whether metadata-only\n * changes (i.e. only `DocumentSnapshot.metadata` changed) should trigger\n * snapshot events.\n */ docChanges(e = {}) {\n const t = !!e.includeMetadataChanges;\n if (t && this._snapshot.excludesMetadataChanges) throw new FirestoreError(D.INVALID_ARGUMENT, \"To include metadata changes with your document changes, you must also pass { includeMetadataChanges:true } to onSnapshot().\");\n return this._cachedChanges && this._cachedChangesIncludeMetadataChanges === t || (this._cachedChanges = \n /** Calculates the array of `DocumentChange`s for a given `ViewSnapshot`. */\n function __PRIVATE_changesFromSnapshot(e, t) {\n if (e._snapshot.oldDocs.isEmpty()) {\n let t = 0;\n return e._snapshot.docChanges.map((n => {\n const r = new QueryDocumentSnapshot(e._firestore, e._userDataWriter, n.doc.key, n.doc, new SnapshotMetadata(e._snapshot.mutatedKeys.has(n.doc.key), e._snapshot.fromCache), e.query.converter);\n return n.doc, {\n type: \"added\",\n doc: r,\n oldIndex: -1,\n newIndex: t++\n };\n }));\n }\n {\n // A `DocumentSet` that is updated incrementally as changes are applied to use\n // to lookup the index of a document.\n let n = e._snapshot.oldDocs;\n return e._snapshot.docChanges.filter((e => t || 3 /* ChangeType.Metadata */ !== e.type)).map((t => {\n const r = new QueryDocumentSnapshot(e._firestore, e._userDataWriter, t.doc.key, t.doc, new SnapshotMetadata(e._snapshot.mutatedKeys.has(t.doc.key), e._snapshot.fromCache), e.query.converter);\n let i = -1, s = -1;\n return 0 /* ChangeType.Added */ !== t.type && (i = n.indexOf(t.doc.key), n = n.delete(t.doc.key)), \n 1 /* ChangeType.Removed */ !== t.type && (n = n.add(t.doc), s = n.indexOf(t.doc.key)), \n {\n type: __PRIVATE_resultChangeType(t.type),\n doc: r,\n oldIndex: i,\n newIndex: s\n };\n }));\n }\n }(this, t), this._cachedChangesIncludeMetadataChanges = t), this._cachedChanges;\n }\n}\n\nfunction __PRIVATE_resultChangeType(e) {\n switch (e) {\n case 0 /* ChangeType.Added */ :\n return \"added\";\n\n case 2 /* ChangeType.Modified */ :\n case 3 /* ChangeType.Metadata */ :\n return \"modified\";\n\n case 1 /* ChangeType.Removed */ :\n return \"removed\";\n\n default:\n return fail();\n }\n}\n\n// TODO(firestoreexp): Add tests for snapshotEqual with different snapshot\n// metadata\n/**\n * Returns true if the provided snapshots are equal.\n *\n * @param left - A snapshot to compare.\n * @param right - A snapshot to compare.\n * @returns true if the snapshots are equal.\n */ function snapshotEqual(e, t) {\n return e instanceof DocumentSnapshot && t instanceof DocumentSnapshot ? e._firestore === t._firestore && e._key.isEqual(t._key) && (null === e._document ? null === t._document : e._document.isEqual(t._document)) && e._converter === t._converter : e instanceof QuerySnapshot && t instanceof QuerySnapshot && (e._firestore === t._firestore && queryEqual(e.query, t.query) && e.metadata.isEqual(t.metadata) && e._snapshot.isEqual(t._snapshot));\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Reads the document referred to by this `DocumentReference`.\n *\n * Note: `getDoc()` attempts to provide up-to-date data when possible by waiting\n * for data from the server, but it may return cached data or fail if you are\n * offline and the server cannot be reached. To specify this behavior, invoke\n * {@link getDocFromCache} or {@link getDocFromServer}.\n *\n * @param reference - The reference of the document to fetch.\n * @returns A Promise resolved with a `DocumentSnapshot` containing the\n * current document contents.\n */ function getDoc(e) {\n e = __PRIVATE_cast(e, DocumentReference);\n const t = __PRIVATE_cast(e.firestore, Firestore);\n return __PRIVATE_firestoreClientGetDocumentViaSnapshotListener(ensureFirestoreConfigured(t), e._key).then((n => __PRIVATE_convertToDocSnapshot(t, e, n)));\n}\n\nclass __PRIVATE_ExpUserDataWriter extends AbstractUserDataWriter {\n constructor(e) {\n super(), this.firestore = e;\n }\n convertBytes(e) {\n return new Bytes(e);\n }\n convertReference(e) {\n const t = this.convertDocumentKey(e, this.firestore._databaseId);\n return new DocumentReference(this.firestore, /* converter= */ null, t);\n }\n}\n\n/**\n * Reads the document referred to by this `DocumentReference` from cache.\n * Returns an error if the document is not currently cached.\n *\n * @returns A `Promise` resolved with a `DocumentSnapshot` containing the\n * current document contents.\n */ function getDocFromCache(e) {\n e = __PRIVATE_cast(e, DocumentReference);\n const t = __PRIVATE_cast(e.firestore, Firestore), n = ensureFirestoreConfigured(t), r = new __PRIVATE_ExpUserDataWriter(t);\n return __PRIVATE_firestoreClientGetDocumentFromLocalCache(n, e._key).then((n => new DocumentSnapshot(t, r, e._key, n, new SnapshotMetadata(null !== n && n.hasLocalMutations, \n /* fromCache= */ !0), e.converter)));\n}\n\n/**\n * Reads the document referred to by this `DocumentReference` from the server.\n * Returns an error if the network is not available.\n *\n * @returns A `Promise` resolved with a `DocumentSnapshot` containing the\n * current document contents.\n */ function getDocFromServer(e) {\n e = __PRIVATE_cast(e, DocumentReference);\n const t = __PRIVATE_cast(e.firestore, Firestore);\n return __PRIVATE_firestoreClientGetDocumentViaSnapshotListener(ensureFirestoreConfigured(t), e._key, {\n source: \"server\"\n }).then((n => __PRIVATE_convertToDocSnapshot(t, e, n)));\n}\n\n/**\n * Executes the query and returns the results as a `QuerySnapshot`.\n *\n * Note: `getDocs()` attempts to provide up-to-date data when possible by\n * waiting for data from the server, but it may return cached data or fail if\n * you are offline and the server cannot be reached. To specify this behavior,\n * invoke {@link getDocsFromCache} or {@link getDocsFromServer}.\n *\n * @returns A `Promise` that will be resolved with the results of the query.\n */ function getDocs(e) {\n e = __PRIVATE_cast(e, Query);\n const t = __PRIVATE_cast(e.firestore, Firestore), n = ensureFirestoreConfigured(t), r = new __PRIVATE_ExpUserDataWriter(t);\n return __PRIVATE_validateHasExplicitOrderByForLimitToLast(e._query), __PRIVATE_firestoreClientGetDocumentsViaSnapshotListener(n, e._query).then((n => new QuerySnapshot(t, r, e, n)));\n}\n\n/**\n * Executes the query and returns the results as a `QuerySnapshot` from cache.\n * Returns an empty result set if no documents matching the query are currently\n * cached.\n *\n * @returns A `Promise` that will be resolved with the results of the query.\n */ function getDocsFromCache(e) {\n e = __PRIVATE_cast(e, Query);\n const t = __PRIVATE_cast(e.firestore, Firestore), n = ensureFirestoreConfigured(t), r = new __PRIVATE_ExpUserDataWriter(t);\n return __PRIVATE_firestoreClientGetDocumentsFromLocalCache(n, e._query).then((n => new QuerySnapshot(t, r, e, n)));\n}\n\n/**\n * Executes the query and returns the results as a `QuerySnapshot` from the\n * server. Returns an error if the network is not available.\n *\n * @returns A `Promise` that will be resolved with the results of the query.\n */ function getDocsFromServer(e) {\n e = __PRIVATE_cast(e, Query);\n const t = __PRIVATE_cast(e.firestore, Firestore), n = ensureFirestoreConfigured(t), r = new __PRIVATE_ExpUserDataWriter(t);\n return __PRIVATE_firestoreClientGetDocumentsViaSnapshotListener(n, e._query, {\n source: \"server\"\n }).then((n => new QuerySnapshot(t, r, e, n)));\n}\n\nfunction setDoc(e, t, n) {\n e = __PRIVATE_cast(e, DocumentReference);\n const r = __PRIVATE_cast(e.firestore, Firestore), i = __PRIVATE_applyFirestoreDataConverter(e.converter, t, n);\n return executeWrite(r, [ __PRIVATE_parseSetData(__PRIVATE_newUserDataReader(r), \"setDoc\", e._key, i, null !== e.converter, n).toMutation(e._key, Precondition.none()) ]);\n}\n\nfunction updateDoc(e, t, n, ...r) {\n e = __PRIVATE_cast(e, DocumentReference);\n const i = __PRIVATE_cast(e.firestore, Firestore), s = __PRIVATE_newUserDataReader(i);\n let o;\n o = \"string\" == typeof (\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n t = getModularInstance(t)) || t instanceof FieldPath ? __PRIVATE_parseUpdateVarargs(s, \"updateDoc\", e._key, t, n, r) : __PRIVATE_parseUpdateData(s, \"updateDoc\", e._key, t);\n return executeWrite(i, [ o.toMutation(e._key, Precondition.exists(!0)) ]);\n}\n\n/**\n * Deletes the document referred to by the specified `DocumentReference`.\n *\n * @param reference - A reference to the document to delete.\n * @returns A Promise resolved once the document has been successfully\n * deleted from the backend (note that it won't resolve while you're offline).\n */ function deleteDoc(e) {\n return executeWrite(__PRIVATE_cast(e.firestore, Firestore), [ new __PRIVATE_DeleteMutation(e._key, Precondition.none()) ]);\n}\n\n/**\n * Add a new document to specified `CollectionReference` with the given data,\n * assigning it a document ID automatically.\n *\n * @param reference - A reference to the collection to add this document to.\n * @param data - An Object containing the data for the new document.\n * @returns A `Promise` resolved with a `DocumentReference` pointing to the\n * newly created document after it has been written to the backend (Note that it\n * won't resolve while you're offline).\n */ function addDoc(e, t) {\n const n = __PRIVATE_cast(e.firestore, Firestore), r = doc(e), i = __PRIVATE_applyFirestoreDataConverter(e.converter, t);\n return executeWrite(n, [ __PRIVATE_parseSetData(__PRIVATE_newUserDataReader(e.firestore), \"addDoc\", r._key, i, null !== e.converter, {}).toMutation(r._key, Precondition.exists(!1)) ]).then((() => r));\n}\n\nfunction onSnapshot(e, ...t) {\n var n, r, i;\n e = getModularInstance(e);\n let s = {\n includeMetadataChanges: !1,\n source: \"default\"\n }, o = 0;\n \"object\" != typeof t[o] || __PRIVATE_isPartialObserver(t[o]) || (s = t[o], o++);\n const _ = {\n includeMetadataChanges: s.includeMetadataChanges,\n source: s.source\n };\n if (__PRIVATE_isPartialObserver(t[o])) {\n const e = t[o];\n t[o] = null === (n = e.next) || void 0 === n ? void 0 : n.bind(e), t[o + 1] = null === (r = e.error) || void 0 === r ? void 0 : r.bind(e), \n t[o + 2] = null === (i = e.complete) || void 0 === i ? void 0 : i.bind(e);\n }\n let a, u, c;\n if (e instanceof DocumentReference) u = __PRIVATE_cast(e.firestore, Firestore), \n c = __PRIVATE_newQueryForPath(e._key.path), a = {\n next: n => {\n t[o] && t[o](__PRIVATE_convertToDocSnapshot(u, e, n));\n },\n error: t[o + 1],\n complete: t[o + 2]\n }; else {\n const n = __PRIVATE_cast(e, Query);\n u = __PRIVATE_cast(n.firestore, Firestore), c = n._query;\n const r = new __PRIVATE_ExpUserDataWriter(u);\n a = {\n next: e => {\n t[o] && t[o](new QuerySnapshot(u, r, n, e));\n },\n error: t[o + 1],\n complete: t[o + 2]\n }, __PRIVATE_validateHasExplicitOrderByForLimitToLast(e._query);\n }\n return function __PRIVATE_firestoreClientListen(e, t, n, r) {\n const i = new __PRIVATE_AsyncObserver(r), s = new __PRIVATE_QueryListener(t, i, n);\n return e.asyncQueue.enqueueAndForget((async () => __PRIVATE_eventManagerListen(await __PRIVATE_getEventManager(e), s))), \n () => {\n i.Za(), e.asyncQueue.enqueueAndForget((async () => __PRIVATE_eventManagerUnlisten(await __PRIVATE_getEventManager(e), s)));\n };\n }(ensureFirestoreConfigured(u), c, _, a);\n}\n\nfunction onSnapshotsInSync(e, t) {\n return __PRIVATE_firestoreClientAddSnapshotsInSyncListener(ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore)), __PRIVATE_isPartialObserver(t) ? t : {\n next: t\n });\n}\n\n/**\n * Locally writes `mutations` on the async queue.\n * @internal\n */ function executeWrite(e, t) {\n return function __PRIVATE_firestoreClientWrite(e, t) {\n const n = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => __PRIVATE_syncEngineWrite(await __PRIVATE_getSyncEngine(e), t, n))), \n n.promise;\n }(ensureFirestoreConfigured(e), t);\n}\n\n/**\n * Converts a {@link ViewSnapshot} that contains the single document specified by `ref`\n * to a {@link DocumentSnapshot}.\n */ function __PRIVATE_convertToDocSnapshot(e, t, n) {\n const r = n.docs.get(t._key), i = new __PRIVATE_ExpUserDataWriter(e);\n return new DocumentSnapshot(e, i, t._key, r, new SnapshotMetadata(n.hasPendingWrites, n.fromCache), t.converter);\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Calculates the number of documents in the result set of the given query\n * without actually downloading the documents.\n *\n * Using this function to count the documents is efficient because only the\n * final count, not the documents' data, is downloaded. This function can\n * count the documents in cases where the result set is prohibitively large to\n * download entirely (thousands of documents).\n *\n * The result received from the server is presented, unaltered, without\n * considering any local state. That is, documents in the local cache are not\n * taken into consideration, neither are local modifications not yet\n * synchronized with the server. Previously-downloaded results, if any, are not\n * used. Every invocation of this function necessarily involves a round trip to\n * the server.\n *\n * @param query The query whose result set size is calculated.\n * @returns A Promise that will be resolved with the count; the count can be\n * retrieved from `snapshot.data().count`, where `snapshot` is the\n * `AggregateQuerySnapshot` to which the returned Promise resolves.\n */ function getCountFromServer(e) {\n return getAggregateFromServer(e, {\n count: count()\n });\n}\n\n/**\n * Calculates the specified aggregations over the documents in the result\n * set of the given query without actually downloading the documents.\n *\n * Using this function to perform aggregations is efficient because only the\n * final aggregation values, not the documents' data, are downloaded. This\n * function can perform aggregations of the documents in cases where the result\n * set is prohibitively large to download entirely (thousands of documents).\n *\n * The result received from the server is presented, unaltered, without\n * considering any local state. That is, documents in the local cache are not\n * taken into consideration, neither are local modifications not yet\n * synchronized with the server. Previously-downloaded results, if any, are not\n * used. Every invocation of this function necessarily involves a round trip to\n * the server.\n *\n * @param query The query whose result set is aggregated over.\n * @param aggregateSpec An `AggregateSpec` object that specifies the aggregates\n * to perform over the result set. The AggregateSpec specifies aliases for each\n * aggregate, which can be used to retrieve the aggregate result.\n * @example\n * ```typescript\n * const aggregateSnapshot = await getAggregateFromServer(query, {\n * countOfDocs: count(),\n * totalHours: sum('hours'),\n * averageScore: average('score')\n * });\n *\n * const countOfDocs: number = aggregateSnapshot.data().countOfDocs;\n * const totalHours: number = aggregateSnapshot.data().totalHours;\n * const averageScore: number | null = aggregateSnapshot.data().averageScore;\n * ```\n */ function getAggregateFromServer(e, t) {\n const n = __PRIVATE_cast(e.firestore, Firestore), r = ensureFirestoreConfigured(n), i = __PRIVATE_mapToArray(t, ((e, t) => new __PRIVATE_AggregateImpl(t, e.aggregateType, e._internalFieldPath)));\n // Run the aggregation and convert the results\n return __PRIVATE_firestoreClientRunAggregateQuery(r, e._query, i).then((t => \n /**\n * Converts the core aggregation result to an `AggregateQuerySnapshot`\n * that can be returned to the consumer.\n * @param query\n * @param aggregateResult Core aggregation result\n * @internal\n */\n function __PRIVATE_convertToAggregateQuerySnapshot(e, t, n) {\n const r = new __PRIVATE_ExpUserDataWriter(e);\n return new AggregateQuerySnapshot(t, r, n);\n }\n /**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ (n, e, t)));\n}\n\nclass __PRIVATE_MemoryLocalCacheImpl {\n constructor(e) {\n this.kind = \"memory\", this._onlineComponentProvider = OnlineComponentProvider.provider, \n (null == e ? void 0 : e.garbageCollector) ? this._offlineComponentProvider = e.garbageCollector._offlineComponentProvider : this._offlineComponentProvider = __PRIVATE_MemoryOfflineComponentProvider.provider;\n }\n toJSON() {\n return {\n kind: this.kind\n };\n }\n}\n\nclass __PRIVATE_PersistentLocalCacheImpl {\n constructor(e) {\n let t;\n this.kind = \"persistent\", (null == e ? void 0 : e.tabManager) ? (e.tabManager._initialize(e), \n t = e.tabManager) : (t = persistentSingleTabManager(void 0), t._initialize(e)), \n this._onlineComponentProvider = t._onlineComponentProvider, this._offlineComponentProvider = t._offlineComponentProvider;\n }\n toJSON() {\n return {\n kind: this.kind\n };\n }\n}\n\nclass __PRIVATE_MemoryEagerGarbageCollectorImpl {\n constructor() {\n this.kind = \"memoryEager\", this._offlineComponentProvider = __PRIVATE_MemoryOfflineComponentProvider.provider;\n }\n toJSON() {\n return {\n kind: this.kind\n };\n }\n}\n\nclass __PRIVATE_MemoryLruGarbageCollectorImpl {\n constructor(e) {\n this.kind = \"memoryLru\", this._offlineComponentProvider = {\n build: () => new __PRIVATE_LruGcMemoryOfflineComponentProvider(e)\n };\n }\n toJSON() {\n return {\n kind: this.kind\n };\n }\n}\n\n/**\n * Creates an instance of `MemoryEagerGarbageCollector`. This is also the\n * default garbage collector unless it is explicitly specified otherwise.\n */ function memoryEagerGarbageCollector() {\n return new __PRIVATE_MemoryEagerGarbageCollectorImpl;\n}\n\n/**\n * Creates an instance of `MemoryLruGarbageCollector`.\n *\n * A target size can be specified as part of the setting parameter. The\n * collector will start deleting documents once the cache size exceeds\n * the given size. The default cache size is 40MB (40 * 1024 * 1024 bytes).\n */ function memoryLruGarbageCollector(e) {\n return new __PRIVATE_MemoryLruGarbageCollectorImpl(null == e ? void 0 : e.cacheSizeBytes);\n}\n\n/**\n * Creates an instance of `MemoryLocalCache`. The instance can be set to\n * `FirestoreSettings.cache` to tell the SDK which cache layer to use.\n */ function memoryLocalCache(e) {\n return new __PRIVATE_MemoryLocalCacheImpl(e);\n}\n\n/**\n * Creates an instance of `PersistentLocalCache`. The instance can be set to\n * `FirestoreSettings.cache` to tell the SDK which cache layer to use.\n *\n * Persistent cache cannot be used in a Node.js environment.\n */ function persistentLocalCache(e) {\n return new __PRIVATE_PersistentLocalCacheImpl(e);\n}\n\nclass __PRIVATE_SingleTabManagerImpl {\n constructor(e) {\n this.forceOwnership = e, this.kind = \"persistentSingleTab\";\n }\n toJSON() {\n return {\n kind: this.kind\n };\n }\n /**\n * @internal\n */ _initialize(e) {\n this._onlineComponentProvider = OnlineComponentProvider.provider, this._offlineComponentProvider = {\n build: t => new __PRIVATE_IndexedDbOfflineComponentProvider(t, null == e ? void 0 : e.cacheSizeBytes, this.forceOwnership)\n };\n }\n}\n\nclass __PRIVATE_MultiTabManagerImpl {\n constructor() {\n this.kind = \"PersistentMultipleTab\";\n }\n toJSON() {\n return {\n kind: this.kind\n };\n }\n /**\n * @internal\n */ _initialize(e) {\n this._onlineComponentProvider = OnlineComponentProvider.provider, this._offlineComponentProvider = {\n build: t => new __PRIVATE_MultiTabOfflineComponentProvider(t, null == e ? void 0 : e.cacheSizeBytes)\n };\n }\n}\n\n/**\n * Creates an instance of `PersistentSingleTabManager`.\n *\n * @param settings Configures the created tab manager.\n */ function persistentSingleTabManager(e) {\n return new __PRIVATE_SingleTabManagerImpl(null == e ? void 0 : e.forceOwnership);\n}\n\n/**\n * Creates an instance of `PersistentMultipleTabManager`.\n */ function persistentMultipleTabManager() {\n return new __PRIVATE_MultiTabManagerImpl;\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const ve = {\n maxAttempts: 5\n};\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A write batch, used to perform multiple writes as a single atomic unit.\n *\n * A `WriteBatch` object can be acquired by calling {@link writeBatch}. It\n * provides methods for adding writes to the write batch. None of the writes\n * will be committed (or visible locally) until {@link WriteBatch.commit} is\n * called.\n */\nclass WriteBatch {\n /** @hideconstructor */\n constructor(e, t) {\n this._firestore = e, this._commitHandler = t, this._mutations = [], this._committed = !1, \n this._dataReader = __PRIVATE_newUserDataReader(e);\n }\n set(e, t, n) {\n this._verifyNotCommitted();\n const r = __PRIVATE_validateReference(e, this._firestore), i = __PRIVATE_applyFirestoreDataConverter(r.converter, t, n), s = __PRIVATE_parseSetData(this._dataReader, \"WriteBatch.set\", r._key, i, null !== r.converter, n);\n return this._mutations.push(s.toMutation(r._key, Precondition.none())), this;\n }\n update(e, t, n, ...r) {\n this._verifyNotCommitted();\n const i = __PRIVATE_validateReference(e, this._firestore);\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n let s;\n return s = \"string\" == typeof (t = getModularInstance(t)) || t instanceof FieldPath ? __PRIVATE_parseUpdateVarargs(this._dataReader, \"WriteBatch.update\", i._key, t, n, r) : __PRIVATE_parseUpdateData(this._dataReader, \"WriteBatch.update\", i._key, t), \n this._mutations.push(s.toMutation(i._key, Precondition.exists(!0))), this;\n }\n /**\n * Deletes the document referred to by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be deleted.\n * @returns This `WriteBatch` instance. Used for chaining method calls.\n */ delete(e) {\n this._verifyNotCommitted();\n const t = __PRIVATE_validateReference(e, this._firestore);\n return this._mutations = this._mutations.concat(new __PRIVATE_DeleteMutation(t._key, Precondition.none())), \n this;\n }\n /**\n * Commits all of the writes in this write batch as a single atomic unit.\n *\n * The result of these writes will only be reflected in document reads that\n * occur after the returned promise resolves. If the client is offline, the\n * write fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @returns A `Promise` resolved once all of the writes in the batch have been\n * successfully written to the backend as an atomic unit (note that it won't\n * resolve while you're offline).\n */ commit() {\n return this._verifyNotCommitted(), this._committed = !0, this._mutations.length > 0 ? this._commitHandler(this._mutations) : Promise.resolve();\n }\n _verifyNotCommitted() {\n if (this._committed) throw new FirestoreError(D.FAILED_PRECONDITION, \"A write batch can no longer be used after commit() has been called.\");\n }\n}\n\nfunction __PRIVATE_validateReference(e, t) {\n if ((e = getModularInstance(e)).firestore !== t) throw new FirestoreError(D.INVALID_ARGUMENT, \"Provided document reference is from a different Firestore instance.\");\n return e;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// TODO(mrschmidt) Consider using `BaseTransaction` as the base class in the\n// legacy SDK.\n/**\n * A reference to a transaction.\n *\n * The `Transaction` object passed to a transaction's `updateFunction` provides\n * the methods to read and write data within the transaction context. See\n * {@link runTransaction}.\n */\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A reference to a transaction.\n *\n * The `Transaction` object passed to a transaction's `updateFunction` provides\n * the methods to read and write data within the transaction context. See\n * {@link runTransaction}.\n */\nclass Transaction extends class Transaction$1 {\n /** @hideconstructor */\n constructor(e, t) {\n this._firestore = e, this._transaction = t, this._dataReader = __PRIVATE_newUserDataReader(e);\n }\n /**\n * Reads the document referenced by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be read.\n * @returns A `DocumentSnapshot` with the read data.\n */ get(e) {\n const t = __PRIVATE_validateReference(e, this._firestore), n = new __PRIVATE_LiteUserDataWriter(this._firestore);\n return this._transaction.lookup([ t._key ]).then((e => {\n if (!e || 1 !== e.length) return fail();\n const r = e[0];\n if (r.isFoundDocument()) return new DocumentSnapshot$1(this._firestore, n, r.key, r, t.converter);\n if (r.isNoDocument()) return new DocumentSnapshot$1(this._firestore, n, t._key, null, t.converter);\n throw fail();\n }));\n }\n set(e, t, n) {\n const r = __PRIVATE_validateReference(e, this._firestore), i = __PRIVATE_applyFirestoreDataConverter(r.converter, t, n), s = __PRIVATE_parseSetData(this._dataReader, \"Transaction.set\", r._key, i, null !== r.converter, n);\n return this._transaction.set(r._key, s), this;\n }\n update(e, t, n, ...r) {\n const i = __PRIVATE_validateReference(e, this._firestore);\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n let s;\n return s = \"string\" == typeof (t = getModularInstance(t)) || t instanceof FieldPath ? __PRIVATE_parseUpdateVarargs(this._dataReader, \"Transaction.update\", i._key, t, n, r) : __PRIVATE_parseUpdateData(this._dataReader, \"Transaction.update\", i._key, t), \n this._transaction.update(i._key, s), this;\n }\n /**\n * Deletes the document referred to by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be deleted.\n * @returns This `Transaction` instance. Used for chaining method calls.\n */ delete(e) {\n const t = __PRIVATE_validateReference(e, this._firestore);\n return this._transaction.delete(t._key), this;\n }\n} {\n // This class implements the same logic as the Transaction API in the Lite SDK\n // but is subclassed in order to return its own DocumentSnapshot types.\n /** @hideconstructor */\n constructor(e, t) {\n super(e, t), this._firestore = e;\n }\n /**\n * Reads the document referenced by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be read.\n * @returns A `DocumentSnapshot` with the read data.\n */ get(e) {\n const t = __PRIVATE_validateReference(e, this._firestore), n = new __PRIVATE_ExpUserDataWriter(this._firestore);\n return super.get(e).then((e => new DocumentSnapshot(this._firestore, n, t._key, e._document, new SnapshotMetadata(\n /* hasPendingWrites= */ !1, \n /* fromCache= */ !1), t.converter)));\n }\n}\n\n/**\n * Executes the given `updateFunction` and then attempts to commit the changes\n * applied within the transaction. If any document read within the transaction\n * has changed, Cloud Firestore retries the `updateFunction`. If it fails to\n * commit after 5 attempts, the transaction fails.\n *\n * The maximum number of writes allowed in a single transaction is 500.\n *\n * @param firestore - A reference to the Firestore database to run this\n * transaction against.\n * @param updateFunction - The function to execute within the transaction\n * context.\n * @param options - An options object to configure maximum number of attempts to\n * commit.\n * @returns If the transaction completed successfully or was explicitly aborted\n * (the `updateFunction` returned a failed promise), the promise returned by the\n * `updateFunction `is returned here. Otherwise, if the transaction failed, a\n * rejected promise with the corresponding failure error is returned.\n */ function runTransaction(e, t, n) {\n e = __PRIVATE_cast(e, Firestore);\n const r = Object.assign(Object.assign({}, ve), n);\n !function __PRIVATE_validateTransactionOptions(e) {\n if (e.maxAttempts < 1) throw new FirestoreError(D.INVALID_ARGUMENT, \"Max attempts must be at least 1\");\n }(r);\n return function __PRIVATE_firestoreClientTransaction(e, t, n) {\n const r = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => {\n const i = await __PRIVATE_getDatastore(e);\n new __PRIVATE_TransactionRunner(e.asyncQueue, i, n, t, r).au();\n })), r.promise;\n }(ensureFirestoreConfigured(e), (n => t(new Transaction(e, n))), r);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Returns a sentinel for use with {@link @firebase/firestore/lite#(updateDoc:1)} or\n * {@link @firebase/firestore/lite#(setDoc:1)} with `{merge: true}` to mark a field for deletion.\n */ function deleteField() {\n return new __PRIVATE_DeleteFieldValueImpl(\"deleteField\");\n}\n\n/**\n * Returns a sentinel used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link @firebase/firestore/lite#(updateDoc:1)} to\n * include a server-generated timestamp in the written data.\n */ function serverTimestamp() {\n return new __PRIVATE_ServerTimestampFieldValueImpl(\"serverTimestamp\");\n}\n\n/**\n * Returns a special value that can be used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link\n * @firebase/firestore/lite#(updateDoc:1)} that tells the server to union the given elements with any array\n * value that already exists on the server. Each specified element that doesn't\n * already exist in the array will be added to the end. If the field being\n * modified is not already an array it will be overwritten with an array\n * containing exactly the specified elements.\n *\n * @param elements - The elements to union into the array.\n * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or\n * `updateDoc()`.\n */ function arrayUnion(...e) {\n // NOTE: We don't actually parse the data until it's used in set() or\n // update() since we'd need the Firestore instance to do this.\n return new __PRIVATE_ArrayUnionFieldValueImpl(\"arrayUnion\", e);\n}\n\n/**\n * Returns a special value that can be used with {@link (setDoc:1)} or {@link\n * updateDoc:1} that tells the server to remove the given elements from any\n * array value that already exists on the server. All instances of each element\n * specified will be removed from the array. If the field being modified is not\n * already an array it will be overwritten with an empty array.\n *\n * @param elements - The elements to remove from the array.\n * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or\n * `updateDoc()`\n */ function arrayRemove(...e) {\n // NOTE: We don't actually parse the data until it's used in set() or\n // update() since we'd need the Firestore instance to do this.\n return new __PRIVATE_ArrayRemoveFieldValueImpl(\"arrayRemove\", e);\n}\n\n/**\n * Returns a special value that can be used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link\n * @firebase/firestore/lite#(updateDoc:1)} that tells the server to increment the field's current value by\n * the given value.\n *\n * If either the operand or the current field value uses floating point\n * precision, all arithmetic follows IEEE 754 semantics. If both values are\n * integers, values outside of JavaScript's safe number range\n * (`Number.MIN_SAFE_INTEGER` to `Number.MAX_SAFE_INTEGER`) are also subject to\n * precision loss. Furthermore, once processed by the Firestore backend, all\n * integer operations are capped between -2^63 and 2^63-1.\n *\n * If the current field value is not of type `number`, or if the field does not\n * yet exist, the transformation sets the field to the given value.\n *\n * @param n - The value to increment by.\n * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or\n * `updateDoc()`\n */ function increment(e) {\n return new __PRIVATE_NumericIncrementFieldValueImpl(\"increment\", e);\n}\n\n/**\n * Creates a new `VectorValue` constructed with a copy of the given array of numbers.\n *\n * @param values - Create a `VectorValue` instance with a copy of this array of numbers.\n *\n * @returns A new `VectorValue` constructed with a copy of the given array of numbers.\n */ function vector(e) {\n return new VectorValue(e);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Creates a write batch, used for performing multiple writes as a single\n * atomic operation. The maximum number of writes allowed in a single {@link WriteBatch}\n * is 500.\n *\n * Unlike transactions, write batches are persisted offline and therefore are\n * preferable when you don't need to condition your writes on read data.\n *\n * @returns A {@link WriteBatch} that can be used to atomically execute multiple\n * writes.\n */ function writeBatch(e) {\n return ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore)), new WriteBatch(e, (t => executeWrite(e, t)));\n}\n\n/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ function setIndexConfiguration(e, t) {\n const n = ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore));\n if (!n._uninitializedComponentsProvider || \"memory\" === n._uninitializedComponentsProvider._offline.kind) \n // PORTING NOTE: We don't return an error if the user has not enabled\n // persistence since `enableIndexeddbPersistence()` can fail on the Web.\n return __PRIVATE_logWarn(\"Cannot enable indexes when persistence is disabled\"), \n Promise.resolve();\n const r = function __PRIVATE_parseIndexes(e) {\n const t = \"string\" == typeof e ? function __PRIVATE_tryParseJson(e) {\n try {\n return JSON.parse(e);\n } catch (e) {\n throw new FirestoreError(D.INVALID_ARGUMENT, \"Failed to parse JSON: \" + (null == e ? void 0 : e.message));\n }\n }(e) : e, n = [];\n if (Array.isArray(t.indexes)) for (const e of t.indexes) {\n const t = __PRIVATE_tryGetString(e, \"collectionGroup\"), r = [];\n if (Array.isArray(e.fields)) for (const t of e.fields) {\n const e = __PRIVATE_fieldPathFromDotSeparatedString(\"setIndexConfiguration\", __PRIVATE_tryGetString(t, \"fieldPath\"));\n \"CONTAINS\" === t.arrayConfig ? r.push(new IndexSegment(e, 2 /* IndexKind.CONTAINS */)) : \"ASCENDING\" === t.order ? r.push(new IndexSegment(e, 0 /* IndexKind.ASCENDING */)) : \"DESCENDING\" === t.order && r.push(new IndexSegment(e, 1 /* IndexKind.DESCENDING */));\n }\n n.push(new FieldIndex(FieldIndex.UNKNOWN_ID, t, r, IndexState.empty()));\n }\n return n;\n }(t);\n return __PRIVATE_firestoreClientSetIndexConfiguration(n, r);\n}\n\nfunction __PRIVATE_tryGetString(e, t) {\n if (\"string\" != typeof e[t]) throw new FirestoreError(D.INVALID_ARGUMENT, \"Missing string value for: \" + t);\n return e[t];\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A `PersistentCacheIndexManager` for configuring persistent cache indexes used\n * for local query execution.\n *\n * To use, call `getPersistentCacheIndexManager()` to get an instance.\n */ class PersistentCacheIndexManager {\n /** @hideconstructor */\n constructor(e) {\n this._firestore = e, \n /** A type string to uniquely identify instances of this class. */\n this.type = \"PersistentCacheIndexManager\";\n }\n}\n\n/**\n * Returns the PersistentCache Index Manager used by the given `Firestore`\n * object.\n *\n * @return The `PersistentCacheIndexManager` instance, or `null` if local\n * persistent storage is not in use.\n */ function getPersistentCacheIndexManager(e) {\n var t;\n e = __PRIVATE_cast(e, Firestore);\n const n = Ce.get(e);\n if (n) return n;\n if (\"persistent\" !== (null === (t = ensureFirestoreConfigured(e)._uninitializedComponentsProvider) || void 0 === t ? void 0 : t._offline.kind)) return null;\n const r = new PersistentCacheIndexManager(e);\n return Ce.set(e, r), r;\n}\n\n/**\n * Enables the SDK to create persistent cache indexes automatically for local\n * query execution when the SDK believes cache indexes can help improve\n * performance.\n *\n * This feature is disabled by default.\n */ function enablePersistentCacheIndexAutoCreation(e) {\n __PRIVATE_setPersistentCacheIndexAutoCreationEnabled(e, !0);\n}\n\n/**\n * Stops creating persistent cache indexes automatically for local query\n * execution. The indexes which have been created by calling\n * `enablePersistentCacheIndexAutoCreation()` still take effect.\n */ function disablePersistentCacheIndexAutoCreation(e) {\n __PRIVATE_setPersistentCacheIndexAutoCreationEnabled(e, !1);\n}\n\n/**\n * Removes all persistent cache indexes.\n *\n * Please note this function will also deletes indexes generated by\n * `setIndexConfiguration()`, which is deprecated.\n */ function deleteAllPersistentCacheIndexes(e) {\n __PRIVATE_firestoreClientDeleteAllFieldIndexes(ensureFirestoreConfigured(e._firestore)).then((e => __PRIVATE_logDebug(\"deleting all persistent cache indexes succeeded\"))).catch((e => __PRIVATE_logWarn(\"deleting all persistent cache indexes failed\", e)));\n}\n\nfunction __PRIVATE_setPersistentCacheIndexAutoCreationEnabled(e, t) {\n __PRIVATE_firestoreClientSetPersistentCacheIndexAutoCreationEnabled(ensureFirestoreConfigured(e._firestore), t).then((e => __PRIVATE_logDebug(`setting persistent cache index auto creation isEnabled=${t} succeeded`))).catch((e => __PRIVATE_logWarn(`setting persistent cache index auto creation isEnabled=${t} failed`, e)));\n}\n\n/**\n * Maps `Firestore` instances to their corresponding\n * `PersistentCacheIndexManager` instances.\n *\n * Use a `WeakMap` so that the mapping will be automatically dropped when the\n * `Firestore` instance is garbage collected. This emulates a private member\n * as described in https://goo.gle/454yvug.\n */ const Ce = new WeakMap;\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @internal\n * @private\n *\n * This function is for internal use only.\n *\n * Returns the `QueryTarget` representation of the given query. Returns `null`\n * if the Firestore client associated with the given query has not been\n * initialized or has been terminated.\n *\n * @param query - The Query to convert to proto representation.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _internalQueryToProtoQueryTarget(e) {\n var t;\n const n = null === (t = ensureFirestoreConfigured(__PRIVATE_cast(e.firestore, Firestore))._onlineComponents) || void 0 === t ? void 0 : t.datastore.serializer;\n return void 0 === n ? null : __PRIVATE_toQueryTarget(n, __PRIVATE_queryToTarget(e._query))._t;\n}\n\n/**\n * @internal\n * @private\n *\n * This function is for internal use only.\n *\n * Returns `RunAggregationQueryRequest` which contains the proto representation\n * of the given aggregation query request. Returns null if the Firestore client\n * associated with the given query has not been initialized or has been\n * terminated.\n *\n * @param query - The Query to convert to proto representation.\n * @param aggregateSpec - The set of aggregations and their aliases.\n */ function _internalAggregationQueryToProtoRunAggregationQueryRequest(e, t) {\n var n;\n const r = __PRIVATE_mapToArray(t, ((e, t) => new __PRIVATE_AggregateImpl(t, e.aggregateType, e._internalFieldPath))), i = null === (n = ensureFirestoreConfigured(__PRIVATE_cast(e.firestore, Firestore))._onlineComponents) || void 0 === n ? void 0 : n.datastore.serializer;\n return void 0 === i ? null : __PRIVATE_toRunAggregationQueryRequest(i, __PRIVATE_queryToAggregateTarget(e._query), r, \n /* skipAliasing= */ !0).request;\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Testing hooks for use by Firestore's integration test suite to reach into the\n * SDK internals to validate logic and behavior that is not visible from the\n * public API surface.\n *\n * @internal\n */ class TestingHooks {\n constructor() {\n throw new Error(\"instances of this class should not be created\");\n }\n /**\n * Registers a callback to be notified when an existence filter mismatch\n * occurs in the Watch listen stream.\n *\n * The relative order in which callbacks are notified is unspecified; do not\n * rely on any particular ordering. If a given callback is registered multiple\n * times then it will be notified multiple times, once per registration.\n *\n * @param callback the callback to invoke upon existence filter mismatch.\n *\n * @return a function that, when called, unregisters the given callback; only\n * the first invocation of the returned function does anything; all subsequent\n * invocations do nothing.\n */ static onExistenceFilterMismatch(e) {\n return __PRIVATE_TestingHooksSpiImpl.instance.onExistenceFilterMismatch(e);\n }\n}\n\n/**\n * The implementation of `TestingHooksSpi`.\n */ class __PRIVATE_TestingHooksSpiImpl {\n constructor() {\n this.Uu = new Map;\n }\n static get instance() {\n return Fe || (Fe = new __PRIVATE_TestingHooksSpiImpl, function __PRIVATE_setTestingHooksSpi(e) {\n if (Pe) throw new Error(\"a TestingHooksSpi instance is already set\");\n Pe = e;\n }(Fe)), Fe;\n }\n et(e) {\n this.Uu.forEach((t => t(e)));\n }\n onExistenceFilterMismatch(e) {\n const t = Symbol(), n = this.Uu;\n return n.set(t, e), () => n.delete(t);\n }\n}\n\nlet Fe = null;\n\n/**\n * Cloud Firestore\n *\n * @packageDocumentation\n */ !function __PRIVATE_registerFirestore(e, t = !0) {\n !function __PRIVATE_setSDKVersion(e) {\n S = e;\n }(SDK_VERSION), _registerComponent(new Component(\"firestore\", ((e, {instanceIdentifier: n, options: r}) => {\n const i = e.getProvider(\"app\").getImmediate(), s = new Firestore(new __PRIVATE_FirebaseAuthCredentialsProvider(e.getProvider(\"auth-internal\")), new __PRIVATE_FirebaseAppCheckTokenProvider(e.getProvider(\"app-check-internal\")), function __PRIVATE_databaseIdFromApp(e, t) {\n if (!Object.prototype.hasOwnProperty.apply(e.options, [ \"projectId\" ])) throw new FirestoreError(D.INVALID_ARGUMENT, '\"projectId\" not provided in firebase.initializeApp.');\n return new DatabaseId(e.options.projectId, t);\n }(i, n), i);\n return r = Object.assign({\n useFetchStreams: t\n }, r), s._setSettings(r), s;\n }), \"PUBLIC\").setMultipleInstances(!0)), registerVersion(w, \"4.7.3\", e), \n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\n registerVersion(w, \"4.7.3\", \"esm2017\");\n}();\n\nexport { AbstractUserDataWriter, AggregateField, AggregateQuerySnapshot, Bytes, Se as CACHE_SIZE_UNLIMITED, CollectionReference, DocumentReference, DocumentSnapshot, FieldPath, FieldValue, Firestore, FirestoreError, GeoPoint, LoadBundleTask, PersistentCacheIndexManager, Query, QueryCompositeFilterConstraint, QueryConstraint, QueryDocumentSnapshot, QueryEndAtConstraint, QueryFieldFilterConstraint, QueryLimitConstraint, QueryOrderByConstraint, QuerySnapshot, QueryStartAtConstraint, SnapshotMetadata, Timestamp, Transaction, VectorValue, WriteBatch, __PRIVATE_AutoId as _AutoId, ByteString as _ByteString, DatabaseId as _DatabaseId, DocumentKey as _DocumentKey, __PRIVATE_EmptyAppCheckTokenProvider as _EmptyAppCheckTokenProvider, __PRIVATE_EmptyAuthCredentialsProvider as _EmptyAuthCredentialsProvider, FieldPath$1 as _FieldPath, TestingHooks as _TestingHooks, __PRIVATE_cast as _cast, __PRIVATE_debugAssert as _debugAssert, _internalAggregationQueryToProtoRunAggregationQueryRequest, _internalQueryToProtoQueryTarget, __PRIVATE_isBase64Available as _isBase64Available, __PRIVATE_logWarn as _logWarn, __PRIVATE_validateIsNotUsedTogether as _validateIsNotUsedTogether, addDoc, aggregateFieldEqual, aggregateQuerySnapshotEqual, and, arrayRemove, arrayUnion, average, clearIndexedDbPersistence, collection, collectionGroup, connectFirestoreEmulator, count, deleteAllPersistentCacheIndexes, deleteDoc, deleteField, disableNetwork, disablePersistentCacheIndexAutoCreation, doc, documentId, enableIndexedDbPersistence, enableMultiTabIndexedDbPersistence, enableNetwork, enablePersistentCacheIndexAutoCreation, endAt, endBefore, ensureFirestoreConfigured, executeWrite, getAggregateFromServer, getCountFromServer, getDoc, getDocFromCache, getDocFromServer, getDocs, getDocsFromCache, getDocsFromServer, getFirestore, getPersistentCacheIndexManager, increment, initializeFirestore, limit, limitToLast, loadBundle, memoryEagerGarbageCollector, memoryLocalCache, memoryLruGarbageCollector, namedQuery, onSnapshot, onSnapshotsInSync, or, orderBy, persistentLocalCache, persistentMultipleTabManager, persistentSingleTabManager, query, queryEqual, refEqual, runTransaction, serverTimestamp, setDoc, setIndexConfiguration, setLogLevel, snapshotEqual, startAfter, startAt, sum, terminate, updateDoc, vector, waitForPendingWrites, where, writeBatch };\n//# sourceMappingURL=index.esm2017.js.map\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import { SDK_VERSION, _isFirebaseServerApp, _getProvider, _registerComponent, registerVersion, getApp } from '@firebase/app';\nimport { ErrorFactory, isBrowserExtension, isMobileCordova, isReactNative, FirebaseError, querystring, isCloudflareWorker, getModularInstance, base64Decode, getUA, isIE, createSubscribe, deepEqual, querystringDecode, extractQuerystring, isEmpty, getExperimentalSetting, getDefaultEmulatorHost } from '@firebase/util';\nimport { Logger, LogLevel } from '@firebase/logger';\nimport { __rest } from 'tslib';\nimport { Component } from '@firebase/component';\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An enum of factors that may be used for multifactor authentication.\r\n *\r\n * @public\r\n */\r\nconst FactorId = {\r\n /** Phone as second factor */\r\n PHONE: 'phone',\r\n TOTP: 'totp'\r\n};\r\n/**\r\n * Enumeration of supported providers.\r\n *\r\n * @public\r\n */\r\nconst ProviderId = {\r\n /** Facebook provider ID */\r\n FACEBOOK: 'facebook.com',\r\n /** GitHub provider ID */\r\n GITHUB: 'github.com',\r\n /** Google provider ID */\r\n GOOGLE: 'google.com',\r\n /** Password provider */\r\n PASSWORD: 'password',\r\n /** Phone provider */\r\n PHONE: 'phone',\r\n /** Twitter provider ID */\r\n TWITTER: 'twitter.com'\r\n};\r\n/**\r\n * Enumeration of supported sign-in methods.\r\n *\r\n * @public\r\n */\r\nconst SignInMethod = {\r\n /** Email link sign in method */\r\n EMAIL_LINK: 'emailLink',\r\n /** Email/password sign in method */\r\n EMAIL_PASSWORD: 'password',\r\n /** Facebook sign in method */\r\n FACEBOOK: 'facebook.com',\r\n /** GitHub sign in method */\r\n GITHUB: 'github.com',\r\n /** Google sign in method */\r\n GOOGLE: 'google.com',\r\n /** Phone sign in method */\r\n PHONE: 'phone',\r\n /** Twitter sign in method */\r\n TWITTER: 'twitter.com'\r\n};\r\n/**\r\n * Enumeration of supported operation types.\r\n *\r\n * @public\r\n */\r\nconst OperationType = {\r\n /** Operation involving linking an additional provider to an already signed-in user. */\r\n LINK: 'link',\r\n /** Operation involving using a provider to reauthenticate an already signed-in user. */\r\n REAUTHENTICATE: 'reauthenticate',\r\n /** Operation involving signing in a user. */\r\n SIGN_IN: 'signIn'\r\n};\r\n/**\r\n * An enumeration of the possible email action types.\r\n *\r\n * @public\r\n */\r\nconst ActionCodeOperation = {\r\n /** The email link sign-in action. */\r\n EMAIL_SIGNIN: 'EMAIL_SIGNIN',\r\n /** The password reset action. */\r\n PASSWORD_RESET: 'PASSWORD_RESET',\r\n /** The email revocation action. */\r\n RECOVER_EMAIL: 'RECOVER_EMAIL',\r\n /** The revert second factor addition email action. */\r\n REVERT_SECOND_FACTOR_ADDITION: 'REVERT_SECOND_FACTOR_ADDITION',\r\n /** The revert second factor addition email action. */\r\n VERIFY_AND_CHANGE_EMAIL: 'VERIFY_AND_CHANGE_EMAIL',\r\n /** The email verification action. */\r\n VERIFY_EMAIL: 'VERIFY_EMAIL'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _debugErrorMap() {\r\n return {\r\n [\"admin-restricted-operation\" /* AuthErrorCode.ADMIN_ONLY_OPERATION */]: 'This operation is restricted to administrators only.',\r\n [\"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */]: '',\r\n [\"app-not-authorized\" /* AuthErrorCode.APP_NOT_AUTHORIZED */]: \"This app, identified by the domain where it's hosted, is not \" +\r\n 'authorized to use Firebase Authentication with the provided API key. ' +\r\n 'Review your key configuration in the Google API console.',\r\n [\"app-not-installed\" /* AuthErrorCode.APP_NOT_INSTALLED */]: 'The requested mobile application corresponding to the identifier (' +\r\n 'Android package name or iOS bundle ID) provided is not installed on ' +\r\n 'this device.',\r\n [\"captcha-check-failed\" /* AuthErrorCode.CAPTCHA_CHECK_FAILED */]: 'The reCAPTCHA response token provided is either invalid, expired, ' +\r\n 'already used or the domain associated with it does not match the list ' +\r\n 'of whitelisted domains.',\r\n [\"code-expired\" /* AuthErrorCode.CODE_EXPIRED */]: 'The SMS code has expired. Please re-send the verification code to try ' +\r\n 'again.',\r\n [\"cordova-not-ready\" /* AuthErrorCode.CORDOVA_NOT_READY */]: 'Cordova framework is not ready.',\r\n [\"cors-unsupported\" /* AuthErrorCode.CORS_UNSUPPORTED */]: 'This browser is not supported.',\r\n [\"credential-already-in-use\" /* AuthErrorCode.CREDENTIAL_ALREADY_IN_USE */]: 'This credential is already associated with a different user account.',\r\n [\"custom-token-mismatch\" /* AuthErrorCode.CREDENTIAL_MISMATCH */]: 'The custom token corresponds to a different audience.',\r\n [\"requires-recent-login\" /* AuthErrorCode.CREDENTIAL_TOO_OLD_LOGIN_AGAIN */]: 'This operation is sensitive and requires recent authentication. Log in ' +\r\n 'again before retrying this request.',\r\n [\"dependent-sdk-initialized-before-auth\" /* AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH */]: 'Another Firebase SDK was initialized and is trying to use Auth before Auth is ' +\r\n 'initialized. Please be sure to call `initializeAuth` or `getAuth` before ' +\r\n 'starting any other Firebase SDK.',\r\n [\"dynamic-link-not-activated\" /* AuthErrorCode.DYNAMIC_LINK_NOT_ACTIVATED */]: 'Please activate Dynamic Links in the Firebase Console and agree to the terms and ' +\r\n 'conditions.',\r\n [\"email-change-needs-verification\" /* AuthErrorCode.EMAIL_CHANGE_NEEDS_VERIFICATION */]: 'Multi-factor users must always have a verified email.',\r\n [\"email-already-in-use\" /* AuthErrorCode.EMAIL_EXISTS */]: 'The email address is already in use by another account.',\r\n [\"emulator-config-failed\" /* AuthErrorCode.EMULATOR_CONFIG_FAILED */]: 'Auth instance has already been used to make a network call. Auth can ' +\r\n 'no longer be configured to use the emulator. Try calling ' +\r\n '\"connectAuthEmulator()\" sooner.',\r\n [\"expired-action-code\" /* AuthErrorCode.EXPIRED_OOB_CODE */]: 'The action code has expired.',\r\n [\"cancelled-popup-request\" /* AuthErrorCode.EXPIRED_POPUP_REQUEST */]: 'This operation has been cancelled due to another conflicting popup being opened.',\r\n [\"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */]: 'An internal AuthError has occurred.',\r\n [\"invalid-app-credential\" /* AuthErrorCode.INVALID_APP_CREDENTIAL */]: 'The phone verification request contains an invalid application verifier.' +\r\n ' The reCAPTCHA token response is either invalid or expired.',\r\n [\"invalid-app-id\" /* AuthErrorCode.INVALID_APP_ID */]: 'The mobile app identifier is not registered for the current project.',\r\n [\"invalid-user-token\" /* AuthErrorCode.INVALID_AUTH */]: \"This user's credential isn't valid for this project. This can happen \" +\r\n \"if the user's token has been tampered with, or if the user isn't for \" +\r\n 'the project associated with this API key.',\r\n [\"invalid-auth-event\" /* AuthErrorCode.INVALID_AUTH_EVENT */]: 'An internal AuthError has occurred.',\r\n [\"invalid-verification-code\" /* AuthErrorCode.INVALID_CODE */]: 'The SMS verification code used to create the phone auth credential is ' +\r\n 'invalid. Please resend the verification code sms and be sure to use the ' +\r\n 'verification code provided by the user.',\r\n [\"invalid-continue-uri\" /* AuthErrorCode.INVALID_CONTINUE_URI */]: 'The continue URL provided in the request is invalid.',\r\n [\"invalid-cordova-configuration\" /* AuthErrorCode.INVALID_CORDOVA_CONFIGURATION */]: 'The following Cordova plugins must be installed to enable OAuth sign-in: ' +\r\n 'cordova-plugin-buildinfo, cordova-universal-links-plugin, ' +\r\n 'cordova-plugin-browsertab, cordova-plugin-inappbrowser and ' +\r\n 'cordova-plugin-customurlscheme.',\r\n [\"invalid-custom-token\" /* AuthErrorCode.INVALID_CUSTOM_TOKEN */]: 'The custom token format is incorrect. Please check the documentation.',\r\n [\"invalid-dynamic-link-domain\" /* AuthErrorCode.INVALID_DYNAMIC_LINK_DOMAIN */]: 'The provided dynamic link domain is not configured or authorized for the current project.',\r\n [\"invalid-email\" /* AuthErrorCode.INVALID_EMAIL */]: 'The email address is badly formatted.',\r\n [\"invalid-emulator-scheme\" /* AuthErrorCode.INVALID_EMULATOR_SCHEME */]: 'Emulator URL must start with a valid scheme (http:// or https://).',\r\n [\"invalid-api-key\" /* AuthErrorCode.INVALID_API_KEY */]: 'Your API key is invalid, please check you have copied it correctly.',\r\n [\"invalid-cert-hash\" /* AuthErrorCode.INVALID_CERT_HASH */]: 'The SHA-1 certificate hash provided is invalid.',\r\n [\"invalid-credential\" /* AuthErrorCode.INVALID_CREDENTIAL */]: 'The supplied auth credential is incorrect, malformed or has expired.',\r\n [\"invalid-message-payload\" /* AuthErrorCode.INVALID_MESSAGE_PAYLOAD */]: 'The email template corresponding to this action contains invalid characters in its message. ' +\r\n 'Please fix by going to the Auth email templates section in the Firebase Console.',\r\n [\"invalid-multi-factor-session\" /* AuthErrorCode.INVALID_MFA_SESSION */]: 'The request does not contain a valid proof of first factor successful sign-in.',\r\n [\"invalid-oauth-provider\" /* AuthErrorCode.INVALID_OAUTH_PROVIDER */]: 'EmailAuthProvider is not supported for this operation. This operation ' +\r\n 'only supports OAuth providers.',\r\n [\"invalid-oauth-client-id\" /* AuthErrorCode.INVALID_OAUTH_CLIENT_ID */]: 'The OAuth client ID provided is either invalid or does not match the ' +\r\n 'specified API key.',\r\n [\"unauthorized-domain\" /* AuthErrorCode.INVALID_ORIGIN */]: 'This domain is not authorized for OAuth operations for your Firebase ' +\r\n 'project. Edit the list of authorized domains from the Firebase console.',\r\n [\"invalid-action-code\" /* AuthErrorCode.INVALID_OOB_CODE */]: 'The action code is invalid. This can happen if the code is malformed, ' +\r\n 'expired, or has already been used.',\r\n [\"wrong-password\" /* AuthErrorCode.INVALID_PASSWORD */]: 'The password is invalid or the user does not have a password.',\r\n [\"invalid-persistence-type\" /* AuthErrorCode.INVALID_PERSISTENCE */]: 'The specified persistence type is invalid. It can only be local, session or none.',\r\n [\"invalid-phone-number\" /* AuthErrorCode.INVALID_PHONE_NUMBER */]: 'The format of the phone number provided is incorrect. Please enter the ' +\r\n 'phone number in a format that can be parsed into E.164 format. E.164 ' +\r\n 'phone numbers are written in the format [+][country code][subscriber ' +\r\n 'number including area code].',\r\n [\"invalid-provider-id\" /* AuthErrorCode.INVALID_PROVIDER_ID */]: 'The specified provider ID is invalid.',\r\n [\"invalid-recipient-email\" /* AuthErrorCode.INVALID_RECIPIENT_EMAIL */]: 'The email corresponding to this action failed to send as the provided ' +\r\n 'recipient email address is invalid.',\r\n [\"invalid-sender\" /* AuthErrorCode.INVALID_SENDER */]: 'The email template corresponding to this action contains an invalid sender email or name. ' +\r\n 'Please fix by going to the Auth email templates section in the Firebase Console.',\r\n [\"invalid-verification-id\" /* AuthErrorCode.INVALID_SESSION_INFO */]: 'The verification ID used to create the phone auth credential is invalid.',\r\n [\"invalid-tenant-id\" /* AuthErrorCode.INVALID_TENANT_ID */]: \"The Auth instance's tenant ID is invalid.\",\r\n [\"login-blocked\" /* AuthErrorCode.LOGIN_BLOCKED */]: 'Login blocked by user-provided method: {$originalMessage}',\r\n [\"missing-android-pkg-name\" /* AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME */]: 'An Android Package Name must be provided if the Android App is required to be installed.',\r\n [\"auth-domain-config-required\" /* AuthErrorCode.MISSING_AUTH_DOMAIN */]: 'Be sure to include authDomain when calling firebase.initializeApp(), ' +\r\n 'by following the instructions in the Firebase console.',\r\n [\"missing-app-credential\" /* AuthErrorCode.MISSING_APP_CREDENTIAL */]: 'The phone verification request is missing an application verifier ' +\r\n 'assertion. A reCAPTCHA response token needs to be provided.',\r\n [\"missing-verification-code\" /* AuthErrorCode.MISSING_CODE */]: 'The phone auth credential was created with an empty SMS verification code.',\r\n [\"missing-continue-uri\" /* AuthErrorCode.MISSING_CONTINUE_URI */]: 'A continue URL must be provided in the request.',\r\n [\"missing-iframe-start\" /* AuthErrorCode.MISSING_IFRAME_START */]: 'An internal AuthError has occurred.',\r\n [\"missing-ios-bundle-id\" /* AuthErrorCode.MISSING_IOS_BUNDLE_ID */]: 'An iOS Bundle ID must be provided if an App Store ID is provided.',\r\n [\"missing-or-invalid-nonce\" /* AuthErrorCode.MISSING_OR_INVALID_NONCE */]: 'The request does not contain a valid nonce. This can occur if the ' +\r\n 'SHA-256 hash of the provided raw nonce does not match the hashed nonce ' +\r\n 'in the ID token payload.',\r\n [\"missing-password\" /* AuthErrorCode.MISSING_PASSWORD */]: 'A non-empty password must be provided',\r\n [\"missing-multi-factor-info\" /* AuthErrorCode.MISSING_MFA_INFO */]: 'No second factor identifier is provided.',\r\n [\"missing-multi-factor-session\" /* AuthErrorCode.MISSING_MFA_SESSION */]: 'The request is missing proof of first factor successful sign-in.',\r\n [\"missing-phone-number\" /* AuthErrorCode.MISSING_PHONE_NUMBER */]: 'To send verification codes, provide a phone number for the recipient.',\r\n [\"missing-verification-id\" /* AuthErrorCode.MISSING_SESSION_INFO */]: 'The phone auth credential was created with an empty verification ID.',\r\n [\"app-deleted\" /* AuthErrorCode.MODULE_DESTROYED */]: 'This instance of FirebaseApp has been deleted.',\r\n [\"multi-factor-info-not-found\" /* AuthErrorCode.MFA_INFO_NOT_FOUND */]: 'The user does not have a second factor matching the identifier provided.',\r\n [\"multi-factor-auth-required\" /* AuthErrorCode.MFA_REQUIRED */]: 'Proof of ownership of a second factor is required to complete sign-in.',\r\n [\"account-exists-with-different-credential\" /* AuthErrorCode.NEED_CONFIRMATION */]: 'An account already exists with the same email address but different ' +\r\n 'sign-in credentials. Sign in using a provider associated with this ' +\r\n 'email address.',\r\n [\"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */]: 'A network AuthError (such as timeout, interrupted connection or unreachable host) has occurred.',\r\n [\"no-auth-event\" /* AuthErrorCode.NO_AUTH_EVENT */]: 'An internal AuthError has occurred.',\r\n [\"no-such-provider\" /* AuthErrorCode.NO_SUCH_PROVIDER */]: 'User was not linked to an account with the given provider.',\r\n [\"null-user\" /* AuthErrorCode.NULL_USER */]: 'A null user object was provided as the argument for an operation which ' +\r\n 'requires a non-null user object.',\r\n [\"operation-not-allowed\" /* AuthErrorCode.OPERATION_NOT_ALLOWED */]: 'The given sign-in provider is disabled for this Firebase project. ' +\r\n 'Enable it in the Firebase console, under the sign-in method tab of the ' +\r\n 'Auth section.',\r\n [\"operation-not-supported-in-this-environment\" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */]: 'This operation is not supported in the environment this application is ' +\r\n 'running on. \"location.protocol\" must be http, https or chrome-extension' +\r\n ' and web storage must be enabled.',\r\n [\"popup-blocked\" /* AuthErrorCode.POPUP_BLOCKED */]: 'Unable to establish a connection with the popup. It may have been blocked by the browser.',\r\n [\"popup-closed-by-user\" /* AuthErrorCode.POPUP_CLOSED_BY_USER */]: 'The popup has been closed by the user before finalizing the operation.',\r\n [\"provider-already-linked\" /* AuthErrorCode.PROVIDER_ALREADY_LINKED */]: 'User can only be linked to one identity for the given provider.',\r\n [\"quota-exceeded\" /* AuthErrorCode.QUOTA_EXCEEDED */]: \"The project's quota for this operation has been exceeded.\",\r\n [\"redirect-cancelled-by-user\" /* AuthErrorCode.REDIRECT_CANCELLED_BY_USER */]: 'The redirect operation has been cancelled by the user before finalizing.',\r\n [\"redirect-operation-pending\" /* AuthErrorCode.REDIRECT_OPERATION_PENDING */]: 'A redirect sign-in operation is already pending.',\r\n [\"rejected-credential\" /* AuthErrorCode.REJECTED_CREDENTIAL */]: 'The request contains malformed or mismatching credentials.',\r\n [\"second-factor-already-in-use\" /* AuthErrorCode.SECOND_FACTOR_ALREADY_ENROLLED */]: 'The second factor is already enrolled on this account.',\r\n [\"maximum-second-factor-count-exceeded\" /* AuthErrorCode.SECOND_FACTOR_LIMIT_EXCEEDED */]: 'The maximum allowed number of second factors on a user has been exceeded.',\r\n [\"tenant-id-mismatch\" /* AuthErrorCode.TENANT_ID_MISMATCH */]: \"The provided tenant ID does not match the Auth instance's tenant ID\",\r\n [\"timeout\" /* AuthErrorCode.TIMEOUT */]: 'The operation has timed out.',\r\n [\"user-token-expired\" /* AuthErrorCode.TOKEN_EXPIRED */]: \"The user's credential is no longer valid. The user must sign in again.\",\r\n [\"too-many-requests\" /* AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER */]: 'We have blocked all requests from this device due to unusual activity. ' +\r\n 'Try again later.',\r\n [\"unauthorized-continue-uri\" /* AuthErrorCode.UNAUTHORIZED_DOMAIN */]: 'The domain of the continue URL is not whitelisted. Please whitelist ' +\r\n 'the domain in the Firebase console.',\r\n [\"unsupported-first-factor\" /* AuthErrorCode.UNSUPPORTED_FIRST_FACTOR */]: 'Enrolling a second factor or signing in with a multi-factor account requires sign-in with a supported first factor.',\r\n [\"unsupported-persistence-type\" /* AuthErrorCode.UNSUPPORTED_PERSISTENCE */]: 'The current environment does not support the specified persistence type.',\r\n [\"unsupported-tenant-operation\" /* AuthErrorCode.UNSUPPORTED_TENANT_OPERATION */]: 'This operation is not supported in a multi-tenant context.',\r\n [\"unverified-email\" /* AuthErrorCode.UNVERIFIED_EMAIL */]: 'The operation requires a verified email.',\r\n [\"user-cancelled\" /* AuthErrorCode.USER_CANCELLED */]: 'The user did not grant your application the permissions it requested.',\r\n [\"user-not-found\" /* AuthErrorCode.USER_DELETED */]: 'There is no user record corresponding to this identifier. The user may ' +\r\n 'have been deleted.',\r\n [\"user-disabled\" /* AuthErrorCode.USER_DISABLED */]: 'The user account has been disabled by an administrator.',\r\n [\"user-mismatch\" /* AuthErrorCode.USER_MISMATCH */]: 'The supplied credentials do not correspond to the previously signed in user.',\r\n [\"user-signed-out\" /* AuthErrorCode.USER_SIGNED_OUT */]: '',\r\n [\"weak-password\" /* AuthErrorCode.WEAK_PASSWORD */]: 'The password must be 6 characters long or more.',\r\n [\"web-storage-unsupported\" /* AuthErrorCode.WEB_STORAGE_UNSUPPORTED */]: 'This browser is not supported or 3rd party cookies and data may be disabled.',\r\n [\"already-initialized\" /* AuthErrorCode.ALREADY_INITIALIZED */]: 'initializeAuth() has already been called with ' +\r\n 'different options. To avoid this error, call initializeAuth() with the ' +\r\n 'same options as when it was originally called, or call getAuth() to return the' +\r\n ' already initialized instance.',\r\n [\"missing-recaptcha-token\" /* AuthErrorCode.MISSING_RECAPTCHA_TOKEN */]: 'The reCAPTCHA token is missing when sending request to the backend.',\r\n [\"invalid-recaptcha-token\" /* AuthErrorCode.INVALID_RECAPTCHA_TOKEN */]: 'The reCAPTCHA token is invalid when sending request to the backend.',\r\n [\"invalid-recaptcha-action\" /* AuthErrorCode.INVALID_RECAPTCHA_ACTION */]: 'The reCAPTCHA action is invalid when sending request to the backend.',\r\n [\"recaptcha-not-enabled\" /* AuthErrorCode.RECAPTCHA_NOT_ENABLED */]: 'reCAPTCHA Enterprise integration is not enabled for this project.',\r\n [\"missing-client-type\" /* AuthErrorCode.MISSING_CLIENT_TYPE */]: 'The reCAPTCHA client type is missing when sending request to the backend.',\r\n [\"missing-recaptcha-version\" /* AuthErrorCode.MISSING_RECAPTCHA_VERSION */]: 'The reCAPTCHA version is missing when sending request to the backend.',\r\n [\"invalid-req-type\" /* AuthErrorCode.INVALID_REQ_TYPE */]: 'Invalid request parameters.',\r\n [\"invalid-recaptcha-version\" /* AuthErrorCode.INVALID_RECAPTCHA_VERSION */]: 'The reCAPTCHA version is invalid when sending request to the backend.',\r\n [\"unsupported-password-policy-schema-version\" /* AuthErrorCode.UNSUPPORTED_PASSWORD_POLICY_SCHEMA_VERSION */]: 'The password policy received from the backend uses a schema version that is not supported by this version of the Firebase SDK.',\r\n [\"password-does-not-meet-requirements\" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */]: 'The password does not meet the requirements.'\r\n };\r\n}\r\nfunction _prodErrorMap() {\r\n // We will include this one message in the prod error map since by the very\r\n // nature of this error, developers will never be able to see the message\r\n // using the debugErrorMap (which is installed during auth initialization).\r\n return {\r\n [\"dependent-sdk-initialized-before-auth\" /* AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH */]: 'Another Firebase SDK was initialized and is trying to use Auth before Auth is ' +\r\n 'initialized. Please be sure to call `initializeAuth` or `getAuth` before ' +\r\n 'starting any other Firebase SDK.'\r\n };\r\n}\r\n/**\r\n * A verbose error map with detailed descriptions for most error codes.\r\n *\r\n * See discussion at {@link AuthErrorMap}\r\n *\r\n * @public\r\n */\r\nconst debugErrorMap = _debugErrorMap;\r\n/**\r\n * A minimal error map with all verbose error messages stripped.\r\n *\r\n * See discussion at {@link AuthErrorMap}\r\n *\r\n * @public\r\n */\r\nconst prodErrorMap = _prodErrorMap;\r\nconst _DEFAULT_AUTH_ERROR_FACTORY = new ErrorFactory('auth', 'Firebase', _prodErrorMap());\r\n/**\r\n * A map of potential `Auth` error codes, for easier comparison with errors\r\n * thrown by the SDK.\r\n *\r\n * @remarks\r\n * Note that you can't tree-shake individual keys\r\n * in the map, so by using the map you might substantially increase your\r\n * bundle size.\r\n *\r\n * @public\r\n */\r\nconst AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY = {\r\n ADMIN_ONLY_OPERATION: 'auth/admin-restricted-operation',\r\n ARGUMENT_ERROR: 'auth/argument-error',\r\n APP_NOT_AUTHORIZED: 'auth/app-not-authorized',\r\n APP_NOT_INSTALLED: 'auth/app-not-installed',\r\n CAPTCHA_CHECK_FAILED: 'auth/captcha-check-failed',\r\n CODE_EXPIRED: 'auth/code-expired',\r\n CORDOVA_NOT_READY: 'auth/cordova-not-ready',\r\n CORS_UNSUPPORTED: 'auth/cors-unsupported',\r\n CREDENTIAL_ALREADY_IN_USE: 'auth/credential-already-in-use',\r\n CREDENTIAL_MISMATCH: 'auth/custom-token-mismatch',\r\n CREDENTIAL_TOO_OLD_LOGIN_AGAIN: 'auth/requires-recent-login',\r\n DEPENDENT_SDK_INIT_BEFORE_AUTH: 'auth/dependent-sdk-initialized-before-auth',\r\n DYNAMIC_LINK_NOT_ACTIVATED: 'auth/dynamic-link-not-activated',\r\n EMAIL_CHANGE_NEEDS_VERIFICATION: 'auth/email-change-needs-verification',\r\n EMAIL_EXISTS: 'auth/email-already-in-use',\r\n EMULATOR_CONFIG_FAILED: 'auth/emulator-config-failed',\r\n EXPIRED_OOB_CODE: 'auth/expired-action-code',\r\n EXPIRED_POPUP_REQUEST: 'auth/cancelled-popup-request',\r\n INTERNAL_ERROR: 'auth/internal-error',\r\n INVALID_API_KEY: 'auth/invalid-api-key',\r\n INVALID_APP_CREDENTIAL: 'auth/invalid-app-credential',\r\n INVALID_APP_ID: 'auth/invalid-app-id',\r\n INVALID_AUTH: 'auth/invalid-user-token',\r\n INVALID_AUTH_EVENT: 'auth/invalid-auth-event',\r\n INVALID_CERT_HASH: 'auth/invalid-cert-hash',\r\n INVALID_CODE: 'auth/invalid-verification-code',\r\n INVALID_CONTINUE_URI: 'auth/invalid-continue-uri',\r\n INVALID_CORDOVA_CONFIGURATION: 'auth/invalid-cordova-configuration',\r\n INVALID_CUSTOM_TOKEN: 'auth/invalid-custom-token',\r\n INVALID_DYNAMIC_LINK_DOMAIN: 'auth/invalid-dynamic-link-domain',\r\n INVALID_EMAIL: 'auth/invalid-email',\r\n INVALID_EMULATOR_SCHEME: 'auth/invalid-emulator-scheme',\r\n INVALID_IDP_RESPONSE: 'auth/invalid-credential',\r\n INVALID_LOGIN_CREDENTIALS: 'auth/invalid-credential',\r\n INVALID_MESSAGE_PAYLOAD: 'auth/invalid-message-payload',\r\n INVALID_MFA_SESSION: 'auth/invalid-multi-factor-session',\r\n INVALID_OAUTH_CLIENT_ID: 'auth/invalid-oauth-client-id',\r\n INVALID_OAUTH_PROVIDER: 'auth/invalid-oauth-provider',\r\n INVALID_OOB_CODE: 'auth/invalid-action-code',\r\n INVALID_ORIGIN: 'auth/unauthorized-domain',\r\n INVALID_PASSWORD: 'auth/wrong-password',\r\n INVALID_PERSISTENCE: 'auth/invalid-persistence-type',\r\n INVALID_PHONE_NUMBER: 'auth/invalid-phone-number',\r\n INVALID_PROVIDER_ID: 'auth/invalid-provider-id',\r\n INVALID_RECIPIENT_EMAIL: 'auth/invalid-recipient-email',\r\n INVALID_SENDER: 'auth/invalid-sender',\r\n INVALID_SESSION_INFO: 'auth/invalid-verification-id',\r\n INVALID_TENANT_ID: 'auth/invalid-tenant-id',\r\n MFA_INFO_NOT_FOUND: 'auth/multi-factor-info-not-found',\r\n MFA_REQUIRED: 'auth/multi-factor-auth-required',\r\n MISSING_ANDROID_PACKAGE_NAME: 'auth/missing-android-pkg-name',\r\n MISSING_APP_CREDENTIAL: 'auth/missing-app-credential',\r\n MISSING_AUTH_DOMAIN: 'auth/auth-domain-config-required',\r\n MISSING_CODE: 'auth/missing-verification-code',\r\n MISSING_CONTINUE_URI: 'auth/missing-continue-uri',\r\n MISSING_IFRAME_START: 'auth/missing-iframe-start',\r\n MISSING_IOS_BUNDLE_ID: 'auth/missing-ios-bundle-id',\r\n MISSING_OR_INVALID_NONCE: 'auth/missing-or-invalid-nonce',\r\n MISSING_MFA_INFO: 'auth/missing-multi-factor-info',\r\n MISSING_MFA_SESSION: 'auth/missing-multi-factor-session',\r\n MISSING_PHONE_NUMBER: 'auth/missing-phone-number',\r\n MISSING_SESSION_INFO: 'auth/missing-verification-id',\r\n MODULE_DESTROYED: 'auth/app-deleted',\r\n NEED_CONFIRMATION: 'auth/account-exists-with-different-credential',\r\n NETWORK_REQUEST_FAILED: 'auth/network-request-failed',\r\n NULL_USER: 'auth/null-user',\r\n NO_AUTH_EVENT: 'auth/no-auth-event',\r\n NO_SUCH_PROVIDER: 'auth/no-such-provider',\r\n OPERATION_NOT_ALLOWED: 'auth/operation-not-allowed',\r\n OPERATION_NOT_SUPPORTED: 'auth/operation-not-supported-in-this-environment',\r\n POPUP_BLOCKED: 'auth/popup-blocked',\r\n POPUP_CLOSED_BY_USER: 'auth/popup-closed-by-user',\r\n PROVIDER_ALREADY_LINKED: 'auth/provider-already-linked',\r\n QUOTA_EXCEEDED: 'auth/quota-exceeded',\r\n REDIRECT_CANCELLED_BY_USER: 'auth/redirect-cancelled-by-user',\r\n REDIRECT_OPERATION_PENDING: 'auth/redirect-operation-pending',\r\n REJECTED_CREDENTIAL: 'auth/rejected-credential',\r\n SECOND_FACTOR_ALREADY_ENROLLED: 'auth/second-factor-already-in-use',\r\n SECOND_FACTOR_LIMIT_EXCEEDED: 'auth/maximum-second-factor-count-exceeded',\r\n TENANT_ID_MISMATCH: 'auth/tenant-id-mismatch',\r\n TIMEOUT: 'auth/timeout',\r\n TOKEN_EXPIRED: 'auth/user-token-expired',\r\n TOO_MANY_ATTEMPTS_TRY_LATER: 'auth/too-many-requests',\r\n UNAUTHORIZED_DOMAIN: 'auth/unauthorized-continue-uri',\r\n UNSUPPORTED_FIRST_FACTOR: 'auth/unsupported-first-factor',\r\n UNSUPPORTED_PERSISTENCE: 'auth/unsupported-persistence-type',\r\n UNSUPPORTED_TENANT_OPERATION: 'auth/unsupported-tenant-operation',\r\n UNVERIFIED_EMAIL: 'auth/unverified-email',\r\n USER_CANCELLED: 'auth/user-cancelled',\r\n USER_DELETED: 'auth/user-not-found',\r\n USER_DISABLED: 'auth/user-disabled',\r\n USER_MISMATCH: 'auth/user-mismatch',\r\n USER_SIGNED_OUT: 'auth/user-signed-out',\r\n WEAK_PASSWORD: 'auth/weak-password',\r\n WEB_STORAGE_UNSUPPORTED: 'auth/web-storage-unsupported',\r\n ALREADY_INITIALIZED: 'auth/already-initialized',\r\n RECAPTCHA_NOT_ENABLED: 'auth/recaptcha-not-enabled',\r\n MISSING_RECAPTCHA_TOKEN: 'auth/missing-recaptcha-token',\r\n INVALID_RECAPTCHA_TOKEN: 'auth/invalid-recaptcha-token',\r\n INVALID_RECAPTCHA_ACTION: 'auth/invalid-recaptcha-action',\r\n MISSING_CLIENT_TYPE: 'auth/missing-client-type',\r\n MISSING_RECAPTCHA_VERSION: 'auth/missing-recaptcha-version',\r\n INVALID_RECAPTCHA_VERSION: 'auth/invalid-recaptcha-version',\r\n INVALID_REQ_TYPE: 'auth/invalid-req-type'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst logClient = new Logger('@firebase/auth');\r\nfunction _logWarn(msg, ...args) {\r\n if (logClient.logLevel <= LogLevel.WARN) {\r\n logClient.warn(`Auth (${SDK_VERSION}): ${msg}`, ...args);\r\n }\r\n}\r\nfunction _logError(msg, ...args) {\r\n if (logClient.logLevel <= LogLevel.ERROR) {\r\n logClient.error(`Auth (${SDK_VERSION}): ${msg}`, ...args);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _fail(authOrCode, ...rest) {\r\n throw createErrorInternal(authOrCode, ...rest);\r\n}\r\nfunction _createError(authOrCode, ...rest) {\r\n return createErrorInternal(authOrCode, ...rest);\r\n}\r\nfunction _errorWithCustomMessage(auth, code, message) {\r\n const errorMap = Object.assign(Object.assign({}, prodErrorMap()), { [code]: message });\r\n const factory = new ErrorFactory('auth', 'Firebase', errorMap);\r\n return factory.create(code, {\r\n appName: auth.name\r\n });\r\n}\r\nfunction _serverAppCurrentUserOperationNotSupportedError(auth) {\r\n return _errorWithCustomMessage(auth, \"operation-not-supported-in-this-environment\" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */, 'Operations that alter the current user are not supported in conjunction with FirebaseServerApp');\r\n}\r\nfunction _assertInstanceOf(auth, object, instance) {\r\n const constructorInstance = instance;\r\n if (!(object instanceof constructorInstance)) {\r\n if (constructorInstance.name !== object.constructor.name) {\r\n _fail(auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n }\r\n throw _errorWithCustomMessage(auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */, `Type of ${object.constructor.name} does not match expected instance.` +\r\n `Did you pass a reference from a different Auth SDK?`);\r\n }\r\n}\r\nfunction createErrorInternal(authOrCode, ...rest) {\r\n if (typeof authOrCode !== 'string') {\r\n const code = rest[0];\r\n const fullParams = [...rest.slice(1)];\r\n if (fullParams[0]) {\r\n fullParams[0].appName = authOrCode.name;\r\n }\r\n return authOrCode._errorFactory.create(code, ...fullParams);\r\n }\r\n return _DEFAULT_AUTH_ERROR_FACTORY.create(authOrCode, ...rest);\r\n}\r\nfunction _assert(assertion, authOrCode, ...rest) {\r\n if (!assertion) {\r\n throw createErrorInternal(authOrCode, ...rest);\r\n }\r\n}\r\n/**\r\n * Unconditionally fails, throwing an internal error with the given message.\r\n *\r\n * @param failure type of failure encountered\r\n * @throws Error\r\n */\r\nfunction debugFail(failure) {\r\n // Log the failure in addition to throw an exception, just in case the\r\n // exception is swallowed.\r\n const message = `INTERNAL ASSERTION FAILED: ` + failure;\r\n _logError(message);\r\n // NOTE: We don't use FirebaseError here because these are internal failures\r\n // that cannot be handled by the user. (Also it would create a circular\r\n // dependency between the error and assert modules which doesn't work.)\r\n throw new Error(message);\r\n}\r\n/**\r\n * Fails if the given assertion condition is false, throwing an Error with the\r\n * given message if it did.\r\n *\r\n * @param assertion\r\n * @param message\r\n */\r\nfunction debugAssert(assertion, message) {\r\n if (!assertion) {\r\n debugFail(message);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _getCurrentUrl() {\r\n var _a;\r\n return (typeof self !== 'undefined' && ((_a = self.location) === null || _a === void 0 ? void 0 : _a.href)) || '';\r\n}\r\nfunction _isHttpOrHttps() {\r\n return _getCurrentScheme() === 'http:' || _getCurrentScheme() === 'https:';\r\n}\r\nfunction _getCurrentScheme() {\r\n var _a;\r\n return (typeof self !== 'undefined' && ((_a = self.location) === null || _a === void 0 ? void 0 : _a.protocol)) || null;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Determine whether the browser is working online\r\n */\r\nfunction _isOnline() {\r\n if (typeof navigator !== 'undefined' &&\r\n navigator &&\r\n 'onLine' in navigator &&\r\n typeof navigator.onLine === 'boolean' &&\r\n // Apply only for traditional web apps and Chrome extensions.\r\n // This is especially true for Cordova apps which have unreliable\r\n // navigator.onLine behavior unless cordova-plugin-network-information is\r\n // installed which overwrites the native navigator.onLine value and\r\n // defines navigator.connection.\r\n (_isHttpOrHttps() || isBrowserExtension() || 'connection' in navigator)) {\r\n return navigator.onLine;\r\n }\r\n // If we can't determine the state, assume it is online.\r\n return true;\r\n}\r\nfunction _getUserLanguage() {\r\n if (typeof navigator === 'undefined') {\r\n return null;\r\n }\r\n const navigatorLanguage = navigator;\r\n return (\r\n // Most reliable, but only supported in Chrome/Firefox.\r\n (navigatorLanguage.languages && navigatorLanguage.languages[0]) ||\r\n // Supported in most browsers, but returns the language of the browser\r\n // UI, not the language set in browser settings.\r\n navigatorLanguage.language ||\r\n // Couldn't determine language.\r\n null);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A structure to help pick between a range of long and short delay durations\r\n * depending on the current environment. In general, the long delay is used for\r\n * mobile environments whereas short delays are used for desktop environments.\r\n */\r\nclass Delay {\r\n constructor(shortDelay, longDelay) {\r\n this.shortDelay = shortDelay;\r\n this.longDelay = longDelay;\r\n // Internal error when improperly initialized.\r\n debugAssert(longDelay > shortDelay, 'Short delay should be less than long delay!');\r\n this.isMobile = isMobileCordova() || isReactNative();\r\n }\r\n get() {\r\n if (!_isOnline()) {\r\n // Pick the shorter timeout.\r\n return Math.min(5000 /* DelayMin.OFFLINE */, this.shortDelay);\r\n }\r\n // If running in a mobile environment, return the long delay, otherwise\r\n // return the short delay.\r\n // This could be improved in the future to dynamically change based on other\r\n // variables instead of just reading the current environment.\r\n return this.isMobile ? this.longDelay : this.shortDelay;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _emulatorUrl(config, path) {\r\n debugAssert(config.emulator, 'Emulator should always be set here');\r\n const { url } = config.emulator;\r\n if (!path) {\r\n return url;\r\n }\r\n return `${url}${path.startsWith('/') ? path.slice(1) : path}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass FetchProvider {\r\n static initialize(fetchImpl, headersImpl, responseImpl) {\r\n this.fetchImpl = fetchImpl;\r\n if (headersImpl) {\r\n this.headersImpl = headersImpl;\r\n }\r\n if (responseImpl) {\r\n this.responseImpl = responseImpl;\r\n }\r\n }\r\n static fetch() {\r\n if (this.fetchImpl) {\r\n return this.fetchImpl;\r\n }\r\n if (typeof self !== 'undefined' && 'fetch' in self) {\r\n return self.fetch;\r\n }\r\n if (typeof globalThis !== 'undefined' && globalThis.fetch) {\r\n return globalThis.fetch;\r\n }\r\n if (typeof fetch !== 'undefined') {\r\n return fetch;\r\n }\r\n debugFail('Could not find fetch implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill');\r\n }\r\n static headers() {\r\n if (this.headersImpl) {\r\n return this.headersImpl;\r\n }\r\n if (typeof self !== 'undefined' && 'Headers' in self) {\r\n return self.Headers;\r\n }\r\n if (typeof globalThis !== 'undefined' && globalThis.Headers) {\r\n return globalThis.Headers;\r\n }\r\n if (typeof Headers !== 'undefined') {\r\n return Headers;\r\n }\r\n debugFail('Could not find Headers implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill');\r\n }\r\n static response() {\r\n if (this.responseImpl) {\r\n return this.responseImpl;\r\n }\r\n if (typeof self !== 'undefined' && 'Response' in self) {\r\n return self.Response;\r\n }\r\n if (typeof globalThis !== 'undefined' && globalThis.Response) {\r\n return globalThis.Response;\r\n }\r\n if (typeof Response !== 'undefined') {\r\n return Response;\r\n }\r\n debugFail('Could not find Response implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill');\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Map from errors returned by the server to errors to developer visible errors\r\n */\r\nconst SERVER_ERROR_MAP = {\r\n // Custom token errors.\r\n [\"CREDENTIAL_MISMATCH\" /* ServerError.CREDENTIAL_MISMATCH */]: \"custom-token-mismatch\" /* AuthErrorCode.CREDENTIAL_MISMATCH */,\r\n // This can only happen if the SDK sends a bad request.\r\n [\"MISSING_CUSTOM_TOKEN\" /* ServerError.MISSING_CUSTOM_TOKEN */]: \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */,\r\n // Create Auth URI errors.\r\n [\"INVALID_IDENTIFIER\" /* ServerError.INVALID_IDENTIFIER */]: \"invalid-email\" /* AuthErrorCode.INVALID_EMAIL */,\r\n // This can only happen if the SDK sends a bad request.\r\n [\"MISSING_CONTINUE_URI\" /* ServerError.MISSING_CONTINUE_URI */]: \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */,\r\n // Sign in with email and password errors (some apply to sign up too).\r\n [\"INVALID_PASSWORD\" /* ServerError.INVALID_PASSWORD */]: \"wrong-password\" /* AuthErrorCode.INVALID_PASSWORD */,\r\n // This can only happen if the SDK sends a bad request.\r\n [\"MISSING_PASSWORD\" /* ServerError.MISSING_PASSWORD */]: \"missing-password\" /* AuthErrorCode.MISSING_PASSWORD */,\r\n // Thrown if Email Enumeration Protection is enabled in the project and the email or password is\r\n // invalid.\r\n [\"INVALID_LOGIN_CREDENTIALS\" /* ServerError.INVALID_LOGIN_CREDENTIALS */]: \"invalid-credential\" /* AuthErrorCode.INVALID_CREDENTIAL */,\r\n // Sign up with email and password errors.\r\n [\"EMAIL_EXISTS\" /* ServerError.EMAIL_EXISTS */]: \"email-already-in-use\" /* AuthErrorCode.EMAIL_EXISTS */,\r\n [\"PASSWORD_LOGIN_DISABLED\" /* ServerError.PASSWORD_LOGIN_DISABLED */]: \"operation-not-allowed\" /* AuthErrorCode.OPERATION_NOT_ALLOWED */,\r\n // Verify assertion for sign in with credential errors:\r\n [\"INVALID_IDP_RESPONSE\" /* ServerError.INVALID_IDP_RESPONSE */]: \"invalid-credential\" /* AuthErrorCode.INVALID_CREDENTIAL */,\r\n [\"INVALID_PENDING_TOKEN\" /* ServerError.INVALID_PENDING_TOKEN */]: \"invalid-credential\" /* AuthErrorCode.INVALID_CREDENTIAL */,\r\n [\"FEDERATED_USER_ID_ALREADY_LINKED\" /* ServerError.FEDERATED_USER_ID_ALREADY_LINKED */]: \"credential-already-in-use\" /* AuthErrorCode.CREDENTIAL_ALREADY_IN_USE */,\r\n // This can only happen if the SDK sends a bad request.\r\n [\"MISSING_REQ_TYPE\" /* ServerError.MISSING_REQ_TYPE */]: \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */,\r\n // Send Password reset email errors:\r\n [\"EMAIL_NOT_FOUND\" /* ServerError.EMAIL_NOT_FOUND */]: \"user-not-found\" /* AuthErrorCode.USER_DELETED */,\r\n [\"RESET_PASSWORD_EXCEED_LIMIT\" /* ServerError.RESET_PASSWORD_EXCEED_LIMIT */]: \"too-many-requests\" /* AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER */,\r\n [\"EXPIRED_OOB_CODE\" /* ServerError.EXPIRED_OOB_CODE */]: \"expired-action-code\" /* AuthErrorCode.EXPIRED_OOB_CODE */,\r\n [\"INVALID_OOB_CODE\" /* ServerError.INVALID_OOB_CODE */]: \"invalid-action-code\" /* AuthErrorCode.INVALID_OOB_CODE */,\r\n // This can only happen if the SDK sends a bad request.\r\n [\"MISSING_OOB_CODE\" /* ServerError.MISSING_OOB_CODE */]: \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */,\r\n // Operations that require ID token in request:\r\n [\"CREDENTIAL_TOO_OLD_LOGIN_AGAIN\" /* ServerError.CREDENTIAL_TOO_OLD_LOGIN_AGAIN */]: \"requires-recent-login\" /* AuthErrorCode.CREDENTIAL_TOO_OLD_LOGIN_AGAIN */,\r\n [\"INVALID_ID_TOKEN\" /* ServerError.INVALID_ID_TOKEN */]: \"invalid-user-token\" /* AuthErrorCode.INVALID_AUTH */,\r\n [\"TOKEN_EXPIRED\" /* ServerError.TOKEN_EXPIRED */]: \"user-token-expired\" /* AuthErrorCode.TOKEN_EXPIRED */,\r\n [\"USER_NOT_FOUND\" /* ServerError.USER_NOT_FOUND */]: \"user-token-expired\" /* AuthErrorCode.TOKEN_EXPIRED */,\r\n // Other errors.\r\n [\"TOO_MANY_ATTEMPTS_TRY_LATER\" /* ServerError.TOO_MANY_ATTEMPTS_TRY_LATER */]: \"too-many-requests\" /* AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER */,\r\n [\"PASSWORD_DOES_NOT_MEET_REQUIREMENTS\" /* ServerError.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */]: \"password-does-not-meet-requirements\" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */,\r\n // Phone Auth related errors.\r\n [\"INVALID_CODE\" /* ServerError.INVALID_CODE */]: \"invalid-verification-code\" /* AuthErrorCode.INVALID_CODE */,\r\n [\"INVALID_SESSION_INFO\" /* ServerError.INVALID_SESSION_INFO */]: \"invalid-verification-id\" /* AuthErrorCode.INVALID_SESSION_INFO */,\r\n [\"INVALID_TEMPORARY_PROOF\" /* ServerError.INVALID_TEMPORARY_PROOF */]: \"invalid-credential\" /* AuthErrorCode.INVALID_CREDENTIAL */,\r\n [\"MISSING_SESSION_INFO\" /* ServerError.MISSING_SESSION_INFO */]: \"missing-verification-id\" /* AuthErrorCode.MISSING_SESSION_INFO */,\r\n [\"SESSION_EXPIRED\" /* ServerError.SESSION_EXPIRED */]: \"code-expired\" /* AuthErrorCode.CODE_EXPIRED */,\r\n // Other action code errors when additional settings passed.\r\n // MISSING_CONTINUE_URI is getting mapped to INTERNAL_ERROR above.\r\n // This is OK as this error will be caught by client side validation.\r\n [\"MISSING_ANDROID_PACKAGE_NAME\" /* ServerError.MISSING_ANDROID_PACKAGE_NAME */]: \"missing-android-pkg-name\" /* AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME */,\r\n [\"UNAUTHORIZED_DOMAIN\" /* ServerError.UNAUTHORIZED_DOMAIN */]: \"unauthorized-continue-uri\" /* AuthErrorCode.UNAUTHORIZED_DOMAIN */,\r\n // getProjectConfig errors when clientId is passed.\r\n [\"INVALID_OAUTH_CLIENT_ID\" /* ServerError.INVALID_OAUTH_CLIENT_ID */]: \"invalid-oauth-client-id\" /* AuthErrorCode.INVALID_OAUTH_CLIENT_ID */,\r\n // User actions (sign-up or deletion) disabled errors.\r\n [\"ADMIN_ONLY_OPERATION\" /* ServerError.ADMIN_ONLY_OPERATION */]: \"admin-restricted-operation\" /* AuthErrorCode.ADMIN_ONLY_OPERATION */,\r\n // Multi factor related errors.\r\n [\"INVALID_MFA_PENDING_CREDENTIAL\" /* ServerError.INVALID_MFA_PENDING_CREDENTIAL */]: \"invalid-multi-factor-session\" /* AuthErrorCode.INVALID_MFA_SESSION */,\r\n [\"MFA_ENROLLMENT_NOT_FOUND\" /* ServerError.MFA_ENROLLMENT_NOT_FOUND */]: \"multi-factor-info-not-found\" /* AuthErrorCode.MFA_INFO_NOT_FOUND */,\r\n [\"MISSING_MFA_ENROLLMENT_ID\" /* ServerError.MISSING_MFA_ENROLLMENT_ID */]: \"missing-multi-factor-info\" /* AuthErrorCode.MISSING_MFA_INFO */,\r\n [\"MISSING_MFA_PENDING_CREDENTIAL\" /* ServerError.MISSING_MFA_PENDING_CREDENTIAL */]: \"missing-multi-factor-session\" /* AuthErrorCode.MISSING_MFA_SESSION */,\r\n [\"SECOND_FACTOR_EXISTS\" /* ServerError.SECOND_FACTOR_EXISTS */]: \"second-factor-already-in-use\" /* AuthErrorCode.SECOND_FACTOR_ALREADY_ENROLLED */,\r\n [\"SECOND_FACTOR_LIMIT_EXCEEDED\" /* ServerError.SECOND_FACTOR_LIMIT_EXCEEDED */]: \"maximum-second-factor-count-exceeded\" /* AuthErrorCode.SECOND_FACTOR_LIMIT_EXCEEDED */,\r\n // Blocking functions related errors.\r\n [\"BLOCKING_FUNCTION_ERROR_RESPONSE\" /* ServerError.BLOCKING_FUNCTION_ERROR_RESPONSE */]: \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */,\r\n // Recaptcha related errors.\r\n [\"RECAPTCHA_NOT_ENABLED\" /* ServerError.RECAPTCHA_NOT_ENABLED */]: \"recaptcha-not-enabled\" /* AuthErrorCode.RECAPTCHA_NOT_ENABLED */,\r\n [\"MISSING_RECAPTCHA_TOKEN\" /* ServerError.MISSING_RECAPTCHA_TOKEN */]: \"missing-recaptcha-token\" /* AuthErrorCode.MISSING_RECAPTCHA_TOKEN */,\r\n [\"INVALID_RECAPTCHA_TOKEN\" /* ServerError.INVALID_RECAPTCHA_TOKEN */]: \"invalid-recaptcha-token\" /* AuthErrorCode.INVALID_RECAPTCHA_TOKEN */,\r\n [\"INVALID_RECAPTCHA_ACTION\" /* ServerError.INVALID_RECAPTCHA_ACTION */]: \"invalid-recaptcha-action\" /* AuthErrorCode.INVALID_RECAPTCHA_ACTION */,\r\n [\"MISSING_CLIENT_TYPE\" /* ServerError.MISSING_CLIENT_TYPE */]: \"missing-client-type\" /* AuthErrorCode.MISSING_CLIENT_TYPE */,\r\n [\"MISSING_RECAPTCHA_VERSION\" /* ServerError.MISSING_RECAPTCHA_VERSION */]: \"missing-recaptcha-version\" /* AuthErrorCode.MISSING_RECAPTCHA_VERSION */,\r\n [\"INVALID_RECAPTCHA_VERSION\" /* ServerError.INVALID_RECAPTCHA_VERSION */]: \"invalid-recaptcha-version\" /* AuthErrorCode.INVALID_RECAPTCHA_VERSION */,\r\n [\"INVALID_REQ_TYPE\" /* ServerError.INVALID_REQ_TYPE */]: \"invalid-req-type\" /* AuthErrorCode.INVALID_REQ_TYPE */\r\n};\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_API_TIMEOUT_MS = new Delay(30000, 60000);\r\nfunction _addTidIfNecessary(auth, request) {\r\n if (auth.tenantId && !request.tenantId) {\r\n return Object.assign(Object.assign({}, request), { tenantId: auth.tenantId });\r\n }\r\n return request;\r\n}\r\nasync function _performApiRequest(auth, method, path, request, customErrorMap = {}) {\r\n return _performFetchWithErrorHandling(auth, customErrorMap, async () => {\r\n let body = {};\r\n let params = {};\r\n if (request) {\r\n if (method === \"GET\" /* HttpMethod.GET */) {\r\n params = request;\r\n }\r\n else {\r\n body = {\r\n body: JSON.stringify(request)\r\n };\r\n }\r\n }\r\n const query = querystring(Object.assign({ key: auth.config.apiKey }, params)).slice(1);\r\n const headers = await auth._getAdditionalHeaders();\r\n headers[\"Content-Type\" /* HttpHeader.CONTENT_TYPE */] = 'application/json';\r\n if (auth.languageCode) {\r\n headers[\"X-Firebase-Locale\" /* HttpHeader.X_FIREBASE_LOCALE */] = auth.languageCode;\r\n }\r\n const fetchArgs = Object.assign({ method,\r\n headers }, body);\r\n /* Security-conscious server-side frameworks tend to have built in mitigations for referrer\r\n problems\". See the Cloudflare GitHub issue #487: Error: The 'referrerPolicy' field on\r\n 'RequestInitializerDict' is not implemented.\"\r\n https://github.com/cloudflare/next-on-pages/issues/487 */\r\n if (!isCloudflareWorker()) {\r\n fetchArgs.referrerPolicy = 'no-referrer';\r\n }\r\n return FetchProvider.fetch()(_getFinalTarget(auth, auth.config.apiHost, path, query), fetchArgs);\r\n });\r\n}\r\nasync function _performFetchWithErrorHandling(auth, customErrorMap, fetchFn) {\r\n auth._canInitEmulator = false;\r\n const errorMap = Object.assign(Object.assign({}, SERVER_ERROR_MAP), customErrorMap);\r\n try {\r\n const networkTimeout = new NetworkTimeout(auth);\r\n const response = await Promise.race([\r\n fetchFn(),\r\n networkTimeout.promise\r\n ]);\r\n // If we've reached this point, the fetch succeeded and the networkTimeout\r\n // didn't throw; clear the network timeout delay so that Node won't hang\r\n networkTimeout.clearNetworkTimeout();\r\n const json = await response.json();\r\n if ('needConfirmation' in json) {\r\n throw _makeTaggedError(auth, \"account-exists-with-different-credential\" /* AuthErrorCode.NEED_CONFIRMATION */, json);\r\n }\r\n if (response.ok && !('errorMessage' in json)) {\r\n return json;\r\n }\r\n else {\r\n const errorMessage = response.ok ? json.errorMessage : json.error.message;\r\n const [serverErrorCode, serverErrorMessage] = errorMessage.split(' : ');\r\n if (serverErrorCode === \"FEDERATED_USER_ID_ALREADY_LINKED\" /* ServerError.FEDERATED_USER_ID_ALREADY_LINKED */) {\r\n throw _makeTaggedError(auth, \"credential-already-in-use\" /* AuthErrorCode.CREDENTIAL_ALREADY_IN_USE */, json);\r\n }\r\n else if (serverErrorCode === \"EMAIL_EXISTS\" /* ServerError.EMAIL_EXISTS */) {\r\n throw _makeTaggedError(auth, \"email-already-in-use\" /* AuthErrorCode.EMAIL_EXISTS */, json);\r\n }\r\n else if (serverErrorCode === \"USER_DISABLED\" /* ServerError.USER_DISABLED */) {\r\n throw _makeTaggedError(auth, \"user-disabled\" /* AuthErrorCode.USER_DISABLED */, json);\r\n }\r\n const authError = errorMap[serverErrorCode] ||\r\n serverErrorCode\r\n .toLowerCase()\r\n .replace(/[_\\s]+/g, '-');\r\n if (serverErrorMessage) {\r\n throw _errorWithCustomMessage(auth, authError, serverErrorMessage);\r\n }\r\n else {\r\n _fail(auth, authError);\r\n }\r\n }\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError) {\r\n throw e;\r\n }\r\n // Changing this to a different error code will log user out when there is a network error\r\n // because we treat any error other than NETWORK_REQUEST_FAILED as token is invalid.\r\n // https://github.com/firebase/firebase-js-sdk/blob/4fbc73610d70be4e0852e7de63a39cb7897e8546/packages/auth/src/core/auth/auth_impl.ts#L309-L316\r\n _fail(auth, \"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */, { 'message': String(e) });\r\n }\r\n}\r\nasync function _performSignInRequest(auth, method, path, request, customErrorMap = {}) {\r\n const serverResponse = (await _performApiRequest(auth, method, path, request, customErrorMap));\r\n if ('mfaPendingCredential' in serverResponse) {\r\n _fail(auth, \"multi-factor-auth-required\" /* AuthErrorCode.MFA_REQUIRED */, {\r\n _serverResponse: serverResponse\r\n });\r\n }\r\n return serverResponse;\r\n}\r\nfunction _getFinalTarget(auth, host, path, query) {\r\n const base = `${host}${path}?${query}`;\r\n if (!auth.config.emulator) {\r\n return `${auth.config.apiScheme}://${base}`;\r\n }\r\n return _emulatorUrl(auth.config, base);\r\n}\r\nfunction _parseEnforcementState(enforcementStateStr) {\r\n switch (enforcementStateStr) {\r\n case 'ENFORCE':\r\n return \"ENFORCE\" /* EnforcementState.ENFORCE */;\r\n case 'AUDIT':\r\n return \"AUDIT\" /* EnforcementState.AUDIT */;\r\n case 'OFF':\r\n return \"OFF\" /* EnforcementState.OFF */;\r\n default:\r\n return \"ENFORCEMENT_STATE_UNSPECIFIED\" /* EnforcementState.ENFORCEMENT_STATE_UNSPECIFIED */;\r\n }\r\n}\r\nclass NetworkTimeout {\r\n constructor(auth) {\r\n this.auth = auth;\r\n // Node timers and browser timers are fundamentally incompatible, but we\r\n // don't care about the value here\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n this.timer = null;\r\n this.promise = new Promise((_, reject) => {\r\n this.timer = setTimeout(() => {\r\n return reject(_createError(this.auth, \"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */));\r\n }, DEFAULT_API_TIMEOUT_MS.get());\r\n });\r\n }\r\n clearNetworkTimeout() {\r\n clearTimeout(this.timer);\r\n }\r\n}\r\nfunction _makeTaggedError(auth, code, response) {\r\n const errorParams = {\r\n appName: auth.name\r\n };\r\n if (response.email) {\r\n errorParams.email = response.email;\r\n }\r\n if (response.phoneNumber) {\r\n errorParams.phoneNumber = response.phoneNumber;\r\n }\r\n const error = _createError(auth, code, errorParams);\r\n // We know customData is defined on error because errorParams is defined\r\n error.customData._tokenResponse = response;\r\n return error;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction isV2(grecaptcha) {\r\n return (grecaptcha !== undefined &&\r\n grecaptcha.getResponse !== undefined);\r\n}\r\nfunction isEnterprise(grecaptcha) {\r\n return (grecaptcha !== undefined &&\r\n grecaptcha.enterprise !== undefined);\r\n}\r\nclass RecaptchaConfig {\r\n constructor(response) {\r\n /**\r\n * The reCAPTCHA site key.\r\n */\r\n this.siteKey = '';\r\n /**\r\n * The list of providers and their enablement status for reCAPTCHA Enterprise.\r\n */\r\n this.recaptchaEnforcementState = [];\r\n if (response.recaptchaKey === undefined) {\r\n throw new Error('recaptchaKey undefined');\r\n }\r\n // Example response.recaptchaKey: \"projects/proj123/keys/sitekey123\"\r\n this.siteKey = response.recaptchaKey.split('/')[3];\r\n this.recaptchaEnforcementState = response.recaptchaEnforcementState;\r\n }\r\n /**\r\n * Returns the reCAPTCHA Enterprise enforcement state for the given provider.\r\n *\r\n * @param providerStr - The provider whose enforcement state is to be returned.\r\n * @returns The reCAPTCHA Enterprise enforcement state for the given provider.\r\n */\r\n getProviderEnforcementState(providerStr) {\r\n if (!this.recaptchaEnforcementState ||\r\n this.recaptchaEnforcementState.length === 0) {\r\n return null;\r\n }\r\n for (const recaptchaEnforcementState of this.recaptchaEnforcementState) {\r\n if (recaptchaEnforcementState.provider &&\r\n recaptchaEnforcementState.provider === providerStr) {\r\n return _parseEnforcementState(recaptchaEnforcementState.enforcementState);\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Returns true if the reCAPTCHA Enterprise enforcement state for the provider is set to ENFORCE or AUDIT.\r\n *\r\n * @param providerStr - The provider whose enablement state is to be returned.\r\n * @returns Whether or not reCAPTCHA Enterprise protection is enabled for the given provider.\r\n */\r\n isProviderEnabled(providerStr) {\r\n return (this.getProviderEnforcementState(providerStr) ===\r\n \"ENFORCE\" /* EnforcementState.ENFORCE */ ||\r\n this.getProviderEnforcementState(providerStr) === \"AUDIT\" /* EnforcementState.AUDIT */);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function getRecaptchaParams(auth) {\r\n return ((await _performApiRequest(auth, \"GET\" /* HttpMethod.GET */, \"/v1/recaptchaParams\" /* Endpoint.GET_RECAPTCHA_PARAM */)).recaptchaSiteKey || '');\r\n}\r\nasync function getRecaptchaConfig(auth, request) {\r\n return _performApiRequest(auth, \"GET\" /* HttpMethod.GET */, \"/v2/recaptchaConfig\" /* Endpoint.GET_RECAPTCHA_CONFIG */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function deleteAccount(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:delete\" /* Endpoint.DELETE_ACCOUNT */, request);\r\n}\r\nasync function deleteLinkedAccounts(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:update\" /* Endpoint.SET_ACCOUNT_INFO */, request);\r\n}\r\nasync function getAccountInfo(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:lookup\" /* Endpoint.GET_ACCOUNT_INFO */, request);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction utcTimestampToDateString(utcTimestamp) {\r\n if (!utcTimestamp) {\r\n return undefined;\r\n }\r\n try {\r\n // Convert to date object.\r\n const date = new Date(Number(utcTimestamp));\r\n // Test date is valid.\r\n if (!isNaN(date.getTime())) {\r\n // Convert to UTC date string.\r\n return date.toUTCString();\r\n }\r\n }\r\n catch (e) {\r\n // Do nothing. undefined will be returned.\r\n }\r\n return undefined;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a JSON Web Token (JWT) used to identify the user to a Firebase service.\r\n *\r\n * @remarks\r\n * Returns the current token if it has not expired or if it will not expire in the next five\r\n * minutes. Otherwise, this will refresh the token and return a new one.\r\n *\r\n * @param user - The user.\r\n * @param forceRefresh - Force refresh regardless of token expiration.\r\n *\r\n * @public\r\n */\r\nfunction getIdToken(user, forceRefresh = false) {\r\n return getModularInstance(user).getIdToken(forceRefresh);\r\n}\r\n/**\r\n * Returns a deserialized JSON Web Token (JWT) used to identify the user to a Firebase service.\r\n *\r\n * @remarks\r\n * Returns the current token if it has not expired or if it will not expire in the next five\r\n * minutes. Otherwise, this will refresh the token and return a new one.\r\n *\r\n * @param user - The user.\r\n * @param forceRefresh - Force refresh regardless of token expiration.\r\n *\r\n * @public\r\n */\r\nasync function getIdTokenResult(user, forceRefresh = false) {\r\n const userInternal = getModularInstance(user);\r\n const token = await userInternal.getIdToken(forceRefresh);\r\n const claims = _parseToken(token);\r\n _assert(claims && claims.exp && claims.auth_time && claims.iat, userInternal.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const firebase = typeof claims.firebase === 'object' ? claims.firebase : undefined;\r\n const signInProvider = firebase === null || firebase === void 0 ? void 0 : firebase['sign_in_provider'];\r\n return {\r\n claims,\r\n token,\r\n authTime: utcTimestampToDateString(secondsStringToMilliseconds(claims.auth_time)),\r\n issuedAtTime: utcTimestampToDateString(secondsStringToMilliseconds(claims.iat)),\r\n expirationTime: utcTimestampToDateString(secondsStringToMilliseconds(claims.exp)),\r\n signInProvider: signInProvider || null,\r\n signInSecondFactor: (firebase === null || firebase === void 0 ? void 0 : firebase['sign_in_second_factor']) || null\r\n };\r\n}\r\nfunction secondsStringToMilliseconds(seconds) {\r\n return Number(seconds) * 1000;\r\n}\r\nfunction _parseToken(token) {\r\n const [algorithm, payload, signature] = token.split('.');\r\n if (algorithm === undefined ||\r\n payload === undefined ||\r\n signature === undefined) {\r\n _logError('JWT malformed, contained fewer than 3 sections');\r\n return null;\r\n }\r\n try {\r\n const decoded = base64Decode(payload);\r\n if (!decoded) {\r\n _logError('Failed to decode base64 JWT payload');\r\n return null;\r\n }\r\n return JSON.parse(decoded);\r\n }\r\n catch (e) {\r\n _logError('Caught error parsing JWT payload as JSON', e === null || e === void 0 ? void 0 : e.toString());\r\n return null;\r\n }\r\n}\r\n/**\r\n * Extract expiresIn TTL from a token by subtracting the expiration from the issuance.\r\n */\r\nfunction _tokenExpiresIn(token) {\r\n const parsedToken = _parseToken(token);\r\n _assert(parsedToken, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n _assert(typeof parsedToken.exp !== 'undefined', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n _assert(typeof parsedToken.iat !== 'undefined', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return Number(parsedToken.exp) - Number(parsedToken.iat);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function _logoutIfInvalidated(user, promise, bypassAuthState = false) {\r\n if (bypassAuthState) {\r\n return promise;\r\n }\r\n try {\r\n return await promise;\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError && isUserInvalidated(e)) {\r\n if (user.auth.currentUser === user) {\r\n await user.auth.signOut();\r\n }\r\n }\r\n throw e;\r\n }\r\n}\r\nfunction isUserInvalidated({ code }) {\r\n return (code === `auth/${\"user-disabled\" /* AuthErrorCode.USER_DISABLED */}` ||\r\n code === `auth/${\"user-token-expired\" /* AuthErrorCode.TOKEN_EXPIRED */}`);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass ProactiveRefresh {\r\n constructor(user) {\r\n this.user = user;\r\n this.isRunning = false;\r\n // Node timers and browser timers return fundamentally different types.\r\n // We don't actually care what the value is but TS won't accept unknown and\r\n // we can't cast properly in both environments.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n this.timerId = null;\r\n this.errorBackoff = 30000 /* Duration.RETRY_BACKOFF_MIN */;\r\n }\r\n _start() {\r\n if (this.isRunning) {\r\n return;\r\n }\r\n this.isRunning = true;\r\n this.schedule();\r\n }\r\n _stop() {\r\n if (!this.isRunning) {\r\n return;\r\n }\r\n this.isRunning = false;\r\n if (this.timerId !== null) {\r\n clearTimeout(this.timerId);\r\n }\r\n }\r\n getInterval(wasError) {\r\n var _a;\r\n if (wasError) {\r\n const interval = this.errorBackoff;\r\n this.errorBackoff = Math.min(this.errorBackoff * 2, 960000 /* Duration.RETRY_BACKOFF_MAX */);\r\n return interval;\r\n }\r\n else {\r\n // Reset the error backoff\r\n this.errorBackoff = 30000 /* Duration.RETRY_BACKOFF_MIN */;\r\n const expTime = (_a = this.user.stsTokenManager.expirationTime) !== null && _a !== void 0 ? _a : 0;\r\n const interval = expTime - Date.now() - 300000 /* Duration.OFFSET */;\r\n return Math.max(0, interval);\r\n }\r\n }\r\n schedule(wasError = false) {\r\n if (!this.isRunning) {\r\n // Just in case...\r\n return;\r\n }\r\n const interval = this.getInterval(wasError);\r\n this.timerId = setTimeout(async () => {\r\n await this.iteration();\r\n }, interval);\r\n }\r\n async iteration() {\r\n try {\r\n await this.user.getIdToken(true);\r\n }\r\n catch (e) {\r\n // Only retry on network errors\r\n if ((e === null || e === void 0 ? void 0 : e.code) ===\r\n `auth/${\"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */}`) {\r\n this.schedule(/* wasError */ true);\r\n }\r\n return;\r\n }\r\n this.schedule();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass UserMetadata {\r\n constructor(createdAt, lastLoginAt) {\r\n this.createdAt = createdAt;\r\n this.lastLoginAt = lastLoginAt;\r\n this._initializeTime();\r\n }\r\n _initializeTime() {\r\n this.lastSignInTime = utcTimestampToDateString(this.lastLoginAt);\r\n this.creationTime = utcTimestampToDateString(this.createdAt);\r\n }\r\n _copy(metadata) {\r\n this.createdAt = metadata.createdAt;\r\n this.lastLoginAt = metadata.lastLoginAt;\r\n this._initializeTime();\r\n }\r\n toJSON() {\r\n return {\r\n createdAt: this.createdAt,\r\n lastLoginAt: this.lastLoginAt\r\n };\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function _reloadWithoutSaving(user) {\r\n var _a;\r\n const auth = user.auth;\r\n const idToken = await user.getIdToken();\r\n const response = await _logoutIfInvalidated(user, getAccountInfo(auth, { idToken }));\r\n _assert(response === null || response === void 0 ? void 0 : response.users.length, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const coreAccount = response.users[0];\r\n user._notifyReloadListener(coreAccount);\r\n const newProviderData = ((_a = coreAccount.providerUserInfo) === null || _a === void 0 ? void 0 : _a.length)\r\n ? extractProviderData(coreAccount.providerUserInfo)\r\n : [];\r\n const providerData = mergeProviderData(user.providerData, newProviderData);\r\n // Preserves the non-nonymous status of the stored user, even if no more\r\n // credentials (federated or email/password) are linked to the user. If\r\n // the user was previously anonymous, then use provider data to update.\r\n // On the other hand, if it was not anonymous before, it should never be\r\n // considered anonymous now.\r\n const oldIsAnonymous = user.isAnonymous;\r\n const newIsAnonymous = !(user.email && coreAccount.passwordHash) && !(providerData === null || providerData === void 0 ? void 0 : providerData.length);\r\n const isAnonymous = !oldIsAnonymous ? false : newIsAnonymous;\r\n const updates = {\r\n uid: coreAccount.localId,\r\n displayName: coreAccount.displayName || null,\r\n photoURL: coreAccount.photoUrl || null,\r\n email: coreAccount.email || null,\r\n emailVerified: coreAccount.emailVerified || false,\r\n phoneNumber: coreAccount.phoneNumber || null,\r\n tenantId: coreAccount.tenantId || null,\r\n providerData,\r\n metadata: new UserMetadata(coreAccount.createdAt, coreAccount.lastLoginAt),\r\n isAnonymous\r\n };\r\n Object.assign(user, updates);\r\n}\r\n/**\r\n * Reloads user account data, if signed in.\r\n *\r\n * @param user - The user.\r\n *\r\n * @public\r\n */\r\nasync function reload(user) {\r\n const userInternal = getModularInstance(user);\r\n await _reloadWithoutSaving(userInternal);\r\n // Even though the current user hasn't changed, update\r\n // current user will trigger a persistence update w/ the\r\n // new info.\r\n await userInternal.auth._persistUserIfCurrent(userInternal);\r\n userInternal.auth._notifyListenersIfCurrent(userInternal);\r\n}\r\nfunction mergeProviderData(original, newData) {\r\n const deduped = original.filter(o => !newData.some(n => n.providerId === o.providerId));\r\n return [...deduped, ...newData];\r\n}\r\nfunction extractProviderData(providers) {\r\n return providers.map((_a) => {\r\n var { providerId } = _a, provider = __rest(_a, [\"providerId\"]);\r\n return {\r\n providerId,\r\n uid: provider.rawId || '',\r\n displayName: provider.displayName || null,\r\n email: provider.email || null,\r\n phoneNumber: provider.phoneNumber || null,\r\n photoURL: provider.photoUrl || null\r\n };\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function requestStsToken(auth, refreshToken) {\r\n const response = await _performFetchWithErrorHandling(auth, {}, async () => {\r\n const body = querystring({\r\n 'grant_type': 'refresh_token',\r\n 'refresh_token': refreshToken\r\n }).slice(1);\r\n const { tokenApiHost, apiKey } = auth.config;\r\n const url = _getFinalTarget(auth, tokenApiHost, \"/v1/token\" /* Endpoint.TOKEN */, `key=${apiKey}`);\r\n const headers = await auth._getAdditionalHeaders();\r\n headers[\"Content-Type\" /* HttpHeader.CONTENT_TYPE */] = 'application/x-www-form-urlencoded';\r\n return FetchProvider.fetch()(url, {\r\n method: \"POST\" /* HttpMethod.POST */,\r\n headers,\r\n body\r\n });\r\n });\r\n // The response comes back in snake_case. Convert to camel:\r\n return {\r\n accessToken: response.access_token,\r\n expiresIn: response.expires_in,\r\n refreshToken: response.refresh_token\r\n };\r\n}\r\nasync function revokeToken(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts:revokeToken\" /* Endpoint.REVOKE_TOKEN */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * We need to mark this class as internal explicitly to exclude it in the public typings, because\r\n * it references AuthInternal which has a circular dependency with UserInternal.\r\n *\r\n * @internal\r\n */\r\nclass StsTokenManager {\r\n constructor() {\r\n this.refreshToken = null;\r\n this.accessToken = null;\r\n this.expirationTime = null;\r\n }\r\n get isExpired() {\r\n return (!this.expirationTime ||\r\n Date.now() > this.expirationTime - 30000 /* Buffer.TOKEN_REFRESH */);\r\n }\r\n updateFromServerResponse(response) {\r\n _assert(response.idToken, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n _assert(typeof response.idToken !== 'undefined', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n _assert(typeof response.refreshToken !== 'undefined', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const expiresIn = 'expiresIn' in response && typeof response.expiresIn !== 'undefined'\r\n ? Number(response.expiresIn)\r\n : _tokenExpiresIn(response.idToken);\r\n this.updateTokensAndExpiration(response.idToken, response.refreshToken, expiresIn);\r\n }\r\n updateFromIdToken(idToken) {\r\n _assert(idToken.length !== 0, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const expiresIn = _tokenExpiresIn(idToken);\r\n this.updateTokensAndExpiration(idToken, null, expiresIn);\r\n }\r\n async getToken(auth, forceRefresh = false) {\r\n if (!forceRefresh && this.accessToken && !this.isExpired) {\r\n return this.accessToken;\r\n }\r\n _assert(this.refreshToken, auth, \"user-token-expired\" /* AuthErrorCode.TOKEN_EXPIRED */);\r\n if (this.refreshToken) {\r\n await this.refresh(auth, this.refreshToken);\r\n return this.accessToken;\r\n }\r\n return null;\r\n }\r\n clearRefreshToken() {\r\n this.refreshToken = null;\r\n }\r\n async refresh(auth, oldToken) {\r\n const { accessToken, refreshToken, expiresIn } = await requestStsToken(auth, oldToken);\r\n this.updateTokensAndExpiration(accessToken, refreshToken, Number(expiresIn));\r\n }\r\n updateTokensAndExpiration(accessToken, refreshToken, expiresInSec) {\r\n this.refreshToken = refreshToken || null;\r\n this.accessToken = accessToken || null;\r\n this.expirationTime = Date.now() + expiresInSec * 1000;\r\n }\r\n static fromJSON(appName, object) {\r\n const { refreshToken, accessToken, expirationTime } = object;\r\n const manager = new StsTokenManager();\r\n if (refreshToken) {\r\n _assert(typeof refreshToken === 'string', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */, {\r\n appName\r\n });\r\n manager.refreshToken = refreshToken;\r\n }\r\n if (accessToken) {\r\n _assert(typeof accessToken === 'string', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */, {\r\n appName\r\n });\r\n manager.accessToken = accessToken;\r\n }\r\n if (expirationTime) {\r\n _assert(typeof expirationTime === 'number', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */, {\r\n appName\r\n });\r\n manager.expirationTime = expirationTime;\r\n }\r\n return manager;\r\n }\r\n toJSON() {\r\n return {\r\n refreshToken: this.refreshToken,\r\n accessToken: this.accessToken,\r\n expirationTime: this.expirationTime\r\n };\r\n }\r\n _assign(stsTokenManager) {\r\n this.accessToken = stsTokenManager.accessToken;\r\n this.refreshToken = stsTokenManager.refreshToken;\r\n this.expirationTime = stsTokenManager.expirationTime;\r\n }\r\n _clone() {\r\n return Object.assign(new StsTokenManager(), this.toJSON());\r\n }\r\n _performRefresh() {\r\n return debugFail('not implemented');\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction assertStringOrUndefined(assertion, appName) {\r\n _assert(typeof assertion === 'string' || typeof assertion === 'undefined', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */, { appName });\r\n}\r\nclass UserImpl {\r\n constructor(_a) {\r\n var { uid, auth, stsTokenManager } = _a, opt = __rest(_a, [\"uid\", \"auth\", \"stsTokenManager\"]);\r\n // For the user object, provider is always Firebase.\r\n this.providerId = \"firebase\" /* ProviderId.FIREBASE */;\r\n this.proactiveRefresh = new ProactiveRefresh(this);\r\n this.reloadUserInfo = null;\r\n this.reloadListener = null;\r\n this.uid = uid;\r\n this.auth = auth;\r\n this.stsTokenManager = stsTokenManager;\r\n this.accessToken = stsTokenManager.accessToken;\r\n this.displayName = opt.displayName || null;\r\n this.email = opt.email || null;\r\n this.emailVerified = opt.emailVerified || false;\r\n this.phoneNumber = opt.phoneNumber || null;\r\n this.photoURL = opt.photoURL || null;\r\n this.isAnonymous = opt.isAnonymous || false;\r\n this.tenantId = opt.tenantId || null;\r\n this.providerData = opt.providerData ? [...opt.providerData] : [];\r\n this.metadata = new UserMetadata(opt.createdAt || undefined, opt.lastLoginAt || undefined);\r\n }\r\n async getIdToken(forceRefresh) {\r\n const accessToken = await _logoutIfInvalidated(this, this.stsTokenManager.getToken(this.auth, forceRefresh));\r\n _assert(accessToken, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n if (this.accessToken !== accessToken) {\r\n this.accessToken = accessToken;\r\n await this.auth._persistUserIfCurrent(this);\r\n this.auth._notifyListenersIfCurrent(this);\r\n }\r\n return accessToken;\r\n }\r\n getIdTokenResult(forceRefresh) {\r\n return getIdTokenResult(this, forceRefresh);\r\n }\r\n reload() {\r\n return reload(this);\r\n }\r\n _assign(user) {\r\n if (this === user) {\r\n return;\r\n }\r\n _assert(this.uid === user.uid, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n this.displayName = user.displayName;\r\n this.photoURL = user.photoURL;\r\n this.email = user.email;\r\n this.emailVerified = user.emailVerified;\r\n this.phoneNumber = user.phoneNumber;\r\n this.isAnonymous = user.isAnonymous;\r\n this.tenantId = user.tenantId;\r\n this.providerData = user.providerData.map(userInfo => (Object.assign({}, userInfo)));\r\n this.metadata._copy(user.metadata);\r\n this.stsTokenManager._assign(user.stsTokenManager);\r\n }\r\n _clone(auth) {\r\n const newUser = new UserImpl(Object.assign(Object.assign({}, this), { auth, stsTokenManager: this.stsTokenManager._clone() }));\r\n newUser.metadata._copy(this.metadata);\r\n return newUser;\r\n }\r\n _onReload(callback) {\r\n // There should only ever be one listener, and that is a single instance of MultiFactorUser\r\n _assert(!this.reloadListener, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n this.reloadListener = callback;\r\n if (this.reloadUserInfo) {\r\n this._notifyReloadListener(this.reloadUserInfo);\r\n this.reloadUserInfo = null;\r\n }\r\n }\r\n _notifyReloadListener(userInfo) {\r\n if (this.reloadListener) {\r\n this.reloadListener(userInfo);\r\n }\r\n else {\r\n // If no listener is subscribed yet, save the result so it's available when they do subscribe\r\n this.reloadUserInfo = userInfo;\r\n }\r\n }\r\n _startProactiveRefresh() {\r\n this.proactiveRefresh._start();\r\n }\r\n _stopProactiveRefresh() {\r\n this.proactiveRefresh._stop();\r\n }\r\n async _updateTokensIfNecessary(response, reload = false) {\r\n let tokensRefreshed = false;\r\n if (response.idToken &&\r\n response.idToken !== this.stsTokenManager.accessToken) {\r\n this.stsTokenManager.updateFromServerResponse(response);\r\n tokensRefreshed = true;\r\n }\r\n if (reload) {\r\n await _reloadWithoutSaving(this);\r\n }\r\n await this.auth._persistUserIfCurrent(this);\r\n if (tokensRefreshed) {\r\n this.auth._notifyListenersIfCurrent(this);\r\n }\r\n }\r\n async delete() {\r\n if (_isFirebaseServerApp(this.auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(this.auth));\r\n }\r\n const idToken = await this.getIdToken();\r\n await _logoutIfInvalidated(this, deleteAccount(this.auth, { idToken }));\r\n this.stsTokenManager.clearRefreshToken();\r\n // TODO: Determine if cancellable-promises are necessary to use in this class so that delete()\r\n // cancels pending actions...\r\n return this.auth.signOut();\r\n }\r\n toJSON() {\r\n return Object.assign(Object.assign({ uid: this.uid, email: this.email || undefined, emailVerified: this.emailVerified, displayName: this.displayName || undefined, isAnonymous: this.isAnonymous, photoURL: this.photoURL || undefined, phoneNumber: this.phoneNumber || undefined, tenantId: this.tenantId || undefined, providerData: this.providerData.map(userInfo => (Object.assign({}, userInfo))), stsTokenManager: this.stsTokenManager.toJSON(), \r\n // Redirect event ID must be maintained in case there is a pending\r\n // redirect event.\r\n _redirectEventId: this._redirectEventId }, this.metadata.toJSON()), { \r\n // Required for compatibility with the legacy SDK (go/firebase-auth-sdk-persistence-parsing):\r\n apiKey: this.auth.config.apiKey, appName: this.auth.name });\r\n }\r\n get refreshToken() {\r\n return this.stsTokenManager.refreshToken || '';\r\n }\r\n static _fromJSON(auth, object) {\r\n var _a, _b, _c, _d, _e, _f, _g, _h;\r\n const displayName = (_a = object.displayName) !== null && _a !== void 0 ? _a : undefined;\r\n const email = (_b = object.email) !== null && _b !== void 0 ? _b : undefined;\r\n const phoneNumber = (_c = object.phoneNumber) !== null && _c !== void 0 ? _c : undefined;\r\n const photoURL = (_d = object.photoURL) !== null && _d !== void 0 ? _d : undefined;\r\n const tenantId = (_e = object.tenantId) !== null && _e !== void 0 ? _e : undefined;\r\n const _redirectEventId = (_f = object._redirectEventId) !== null && _f !== void 0 ? _f : undefined;\r\n const createdAt = (_g = object.createdAt) !== null && _g !== void 0 ? _g : undefined;\r\n const lastLoginAt = (_h = object.lastLoginAt) !== null && _h !== void 0 ? _h : undefined;\r\n const { uid, emailVerified, isAnonymous, providerData, stsTokenManager: plainObjectTokenManager } = object;\r\n _assert(uid && plainObjectTokenManager, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const stsTokenManager = StsTokenManager.fromJSON(this.name, plainObjectTokenManager);\r\n _assert(typeof uid === 'string', auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n assertStringOrUndefined(displayName, auth.name);\r\n assertStringOrUndefined(email, auth.name);\r\n _assert(typeof emailVerified === 'boolean', auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n _assert(typeof isAnonymous === 'boolean', auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n assertStringOrUndefined(phoneNumber, auth.name);\r\n assertStringOrUndefined(photoURL, auth.name);\r\n assertStringOrUndefined(tenantId, auth.name);\r\n assertStringOrUndefined(_redirectEventId, auth.name);\r\n assertStringOrUndefined(createdAt, auth.name);\r\n assertStringOrUndefined(lastLoginAt, auth.name);\r\n const user = new UserImpl({\r\n uid,\r\n auth,\r\n email,\r\n emailVerified,\r\n displayName,\r\n isAnonymous,\r\n photoURL,\r\n phoneNumber,\r\n tenantId,\r\n stsTokenManager,\r\n createdAt,\r\n lastLoginAt\r\n });\r\n if (providerData && Array.isArray(providerData)) {\r\n user.providerData = providerData.map(userInfo => (Object.assign({}, userInfo)));\r\n }\r\n if (_redirectEventId) {\r\n user._redirectEventId = _redirectEventId;\r\n }\r\n return user;\r\n }\r\n /**\r\n * Initialize a User from an idToken server response\r\n * @param auth\r\n * @param idTokenResponse\r\n */\r\n static async _fromIdTokenResponse(auth, idTokenResponse, isAnonymous = false) {\r\n const stsTokenManager = new StsTokenManager();\r\n stsTokenManager.updateFromServerResponse(idTokenResponse);\r\n // Initialize the Firebase Auth user.\r\n const user = new UserImpl({\r\n uid: idTokenResponse.localId,\r\n auth,\r\n stsTokenManager,\r\n isAnonymous\r\n });\r\n // Updates the user info and data and resolves with a user instance.\r\n await _reloadWithoutSaving(user);\r\n return user;\r\n }\r\n /**\r\n * Initialize a User from an idToken server response\r\n * @param auth\r\n * @param idTokenResponse\r\n */\r\n static async _fromGetAccountInfoResponse(auth, response, idToken) {\r\n const coreAccount = response.users[0];\r\n _assert(coreAccount.localId !== undefined, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const providerData = coreAccount.providerUserInfo !== undefined\r\n ? extractProviderData(coreAccount.providerUserInfo)\r\n : [];\r\n const isAnonymous = !(coreAccount.email && coreAccount.passwordHash) && !(providerData === null || providerData === void 0 ? void 0 : providerData.length);\r\n const stsTokenManager = new StsTokenManager();\r\n stsTokenManager.updateFromIdToken(idToken);\r\n // Initialize the Firebase Auth user.\r\n const user = new UserImpl({\r\n uid: coreAccount.localId,\r\n auth,\r\n stsTokenManager,\r\n isAnonymous\r\n });\r\n // update the user with data from the GetAccountInfo response.\r\n const updates = {\r\n uid: coreAccount.localId,\r\n displayName: coreAccount.displayName || null,\r\n photoURL: coreAccount.photoUrl || null,\r\n email: coreAccount.email || null,\r\n emailVerified: coreAccount.emailVerified || false,\r\n phoneNumber: coreAccount.phoneNumber || null,\r\n tenantId: coreAccount.tenantId || null,\r\n providerData,\r\n metadata: new UserMetadata(coreAccount.createdAt, coreAccount.lastLoginAt),\r\n isAnonymous: !(coreAccount.email && coreAccount.passwordHash) &&\r\n !(providerData === null || providerData === void 0 ? void 0 : providerData.length)\r\n };\r\n Object.assign(user, updates);\r\n return user;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst instanceCache = new Map();\r\nfunction _getInstance(cls) {\r\n debugAssert(cls instanceof Function, 'Expected a class definition');\r\n let instance = instanceCache.get(cls);\r\n if (instance) {\r\n debugAssert(instance instanceof cls, 'Instance stored in cache mismatched with class');\r\n return instance;\r\n }\r\n instance = new cls();\r\n instanceCache.set(cls, instance);\r\n return instance;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass InMemoryPersistence {\r\n constructor() {\r\n this.type = \"NONE\" /* PersistenceType.NONE */;\r\n this.storage = {};\r\n }\r\n async _isAvailable() {\r\n return true;\r\n }\r\n async _set(key, value) {\r\n this.storage[key] = value;\r\n }\r\n async _get(key) {\r\n const value = this.storage[key];\r\n return value === undefined ? null : value;\r\n }\r\n async _remove(key) {\r\n delete this.storage[key];\r\n }\r\n _addListener(_key, _listener) {\r\n // Listeners are not supported for in-memory storage since it cannot be shared across windows/workers\r\n return;\r\n }\r\n _removeListener(_key, _listener) {\r\n // Listeners are not supported for in-memory storage since it cannot be shared across windows/workers\r\n return;\r\n }\r\n}\r\nInMemoryPersistence.type = 'NONE';\r\n/**\r\n * An implementation of {@link Persistence} of type 'NONE'.\r\n *\r\n * @public\r\n */\r\nconst inMemoryPersistence = InMemoryPersistence;\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _persistenceKeyName(key, apiKey, appName) {\r\n return `${\"firebase\" /* Namespace.PERSISTENCE */}:${key}:${apiKey}:${appName}`;\r\n}\r\nclass PersistenceUserManager {\r\n constructor(persistence, auth, userKey) {\r\n this.persistence = persistence;\r\n this.auth = auth;\r\n this.userKey = userKey;\r\n const { config, name } = this.auth;\r\n this.fullUserKey = _persistenceKeyName(this.userKey, config.apiKey, name);\r\n this.fullPersistenceKey = _persistenceKeyName(\"persistence\" /* KeyName.PERSISTENCE_USER */, config.apiKey, name);\r\n this.boundEventHandler = auth._onStorageEvent.bind(auth);\r\n this.persistence._addListener(this.fullUserKey, this.boundEventHandler);\r\n }\r\n setCurrentUser(user) {\r\n return this.persistence._set(this.fullUserKey, user.toJSON());\r\n }\r\n async getCurrentUser() {\r\n const blob = await this.persistence._get(this.fullUserKey);\r\n return blob ? UserImpl._fromJSON(this.auth, blob) : null;\r\n }\r\n removeCurrentUser() {\r\n return this.persistence._remove(this.fullUserKey);\r\n }\r\n savePersistenceForRedirect() {\r\n return this.persistence._set(this.fullPersistenceKey, this.persistence.type);\r\n }\r\n async setPersistence(newPersistence) {\r\n if (this.persistence === newPersistence) {\r\n return;\r\n }\r\n const currentUser = await this.getCurrentUser();\r\n await this.removeCurrentUser();\r\n this.persistence = newPersistence;\r\n if (currentUser) {\r\n return this.setCurrentUser(currentUser);\r\n }\r\n }\r\n delete() {\r\n this.persistence._removeListener(this.fullUserKey, this.boundEventHandler);\r\n }\r\n static async create(auth, persistenceHierarchy, userKey = \"authUser\" /* KeyName.AUTH_USER */) {\r\n if (!persistenceHierarchy.length) {\r\n return new PersistenceUserManager(_getInstance(inMemoryPersistence), auth, userKey);\r\n }\r\n // Eliminate any persistences that are not available\r\n const availablePersistences = (await Promise.all(persistenceHierarchy.map(async (persistence) => {\r\n if (await persistence._isAvailable()) {\r\n return persistence;\r\n }\r\n return undefined;\r\n }))).filter(persistence => persistence);\r\n // Fall back to the first persistence listed, or in memory if none available\r\n let selectedPersistence = availablePersistences[0] ||\r\n _getInstance(inMemoryPersistence);\r\n const key = _persistenceKeyName(userKey, auth.config.apiKey, auth.name);\r\n // Pull out the existing user, setting the chosen persistence to that\r\n // persistence if the user exists.\r\n let userToMigrate = null;\r\n // Note, here we check for a user in _all_ persistences, not just the\r\n // ones deemed available. If we can migrate a user out of a broken\r\n // persistence, we will (but only if that persistence supports migration).\r\n for (const persistence of persistenceHierarchy) {\r\n try {\r\n const blob = await persistence._get(key);\r\n if (blob) {\r\n const user = UserImpl._fromJSON(auth, blob); // throws for unparsable blob (wrong format)\r\n if (persistence !== selectedPersistence) {\r\n userToMigrate = user;\r\n }\r\n selectedPersistence = persistence;\r\n break;\r\n }\r\n }\r\n catch (_a) { }\r\n }\r\n // If we find the user in a persistence that does support migration, use\r\n // that migration path (of only persistences that support migration)\r\n const migrationHierarchy = availablePersistences.filter(p => p._shouldAllowMigration);\r\n // If the persistence does _not_ allow migration, just finish off here\r\n if (!selectedPersistence._shouldAllowMigration ||\r\n !migrationHierarchy.length) {\r\n return new PersistenceUserManager(selectedPersistence, auth, userKey);\r\n }\r\n selectedPersistence = migrationHierarchy[0];\r\n if (userToMigrate) {\r\n // This normally shouldn't throw since chosenPersistence.isAvailable() is true, but if it does\r\n // we'll just let it bubble to surface the error.\r\n await selectedPersistence._set(key, userToMigrate.toJSON());\r\n }\r\n // Attempt to clear the key in other persistences but ignore errors. This helps prevent issues\r\n // such as users getting stuck with a previous account after signing out and refreshing the tab.\r\n await Promise.all(persistenceHierarchy.map(async (persistence) => {\r\n if (persistence !== selectedPersistence) {\r\n try {\r\n await persistence._remove(key);\r\n }\r\n catch (_a) { }\r\n }\r\n }));\r\n return new PersistenceUserManager(selectedPersistence, auth, userKey);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Determine the browser for the purposes of reporting usage to the API\r\n */\r\nfunction _getBrowserName(userAgent) {\r\n const ua = userAgent.toLowerCase();\r\n if (ua.includes('opera/') || ua.includes('opr/') || ua.includes('opios/')) {\r\n return \"Opera\" /* BrowserName.OPERA */;\r\n }\r\n else if (_isIEMobile(ua)) {\r\n // Windows phone IEMobile browser.\r\n return \"IEMobile\" /* BrowserName.IEMOBILE */;\r\n }\r\n else if (ua.includes('msie') || ua.includes('trident/')) {\r\n return \"IE\" /* BrowserName.IE */;\r\n }\r\n else if (ua.includes('edge/')) {\r\n return \"Edge\" /* BrowserName.EDGE */;\r\n }\r\n else if (_isFirefox(ua)) {\r\n return \"Firefox\" /* BrowserName.FIREFOX */;\r\n }\r\n else if (ua.includes('silk/')) {\r\n return \"Silk\" /* BrowserName.SILK */;\r\n }\r\n else if (_isBlackBerry(ua)) {\r\n // Blackberry browser.\r\n return \"Blackberry\" /* BrowserName.BLACKBERRY */;\r\n }\r\n else if (_isWebOS(ua)) {\r\n // WebOS default browser.\r\n return \"Webos\" /* BrowserName.WEBOS */;\r\n }\r\n else if (_isSafari(ua)) {\r\n return \"Safari\" /* BrowserName.SAFARI */;\r\n }\r\n else if ((ua.includes('chrome/') || _isChromeIOS(ua)) &&\r\n !ua.includes('edge/')) {\r\n return \"Chrome\" /* BrowserName.CHROME */;\r\n }\r\n else if (_isAndroid(ua)) {\r\n // Android stock browser.\r\n return \"Android\" /* BrowserName.ANDROID */;\r\n }\r\n else {\r\n // Most modern browsers have name/version at end of user agent string.\r\n const re = /([a-zA-Z\\d\\.]+)\\/[a-zA-Z\\d\\.]*$/;\r\n const matches = userAgent.match(re);\r\n if ((matches === null || matches === void 0 ? void 0 : matches.length) === 2) {\r\n return matches[1];\r\n }\r\n }\r\n return \"Other\" /* BrowserName.OTHER */;\r\n}\r\nfunction _isFirefox(ua = getUA()) {\r\n return /firefox\\//i.test(ua);\r\n}\r\nfunction _isSafari(userAgent = getUA()) {\r\n const ua = userAgent.toLowerCase();\r\n return (ua.includes('safari/') &&\r\n !ua.includes('chrome/') &&\r\n !ua.includes('crios/') &&\r\n !ua.includes('android'));\r\n}\r\nfunction _isChromeIOS(ua = getUA()) {\r\n return /crios\\//i.test(ua);\r\n}\r\nfunction _isIEMobile(ua = getUA()) {\r\n return /iemobile/i.test(ua);\r\n}\r\nfunction _isAndroid(ua = getUA()) {\r\n return /android/i.test(ua);\r\n}\r\nfunction _isBlackBerry(ua = getUA()) {\r\n return /blackberry/i.test(ua);\r\n}\r\nfunction _isWebOS(ua = getUA()) {\r\n return /webos/i.test(ua);\r\n}\r\nfunction _isIOS(ua = getUA()) {\r\n return (/iphone|ipad|ipod/i.test(ua) ||\r\n (/macintosh/i.test(ua) && /mobile/i.test(ua)));\r\n}\r\nfunction _isIOS7Or8(ua = getUA()) {\r\n return (/(iPad|iPhone|iPod).*OS 7_\\d/i.test(ua) ||\r\n /(iPad|iPhone|iPod).*OS 8_\\d/i.test(ua));\r\n}\r\nfunction _isIOSStandalone(ua = getUA()) {\r\n var _a;\r\n return _isIOS(ua) && !!((_a = window.navigator) === null || _a === void 0 ? void 0 : _a.standalone);\r\n}\r\nfunction _isIE10() {\r\n return isIE() && document.documentMode === 10;\r\n}\r\nfunction _isMobileBrowser(ua = getUA()) {\r\n // TODO: implement getBrowserName equivalent for OS.\r\n return (_isIOS(ua) ||\r\n _isAndroid(ua) ||\r\n _isWebOS(ua) ||\r\n _isBlackBerry(ua) ||\r\n /windows phone/i.test(ua) ||\r\n _isIEMobile(ua));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/*\r\n * Determine the SDK version string\r\n */\r\nfunction _getClientVersion(clientPlatform, frameworks = []) {\r\n let reportedPlatform;\r\n switch (clientPlatform) {\r\n case \"Browser\" /* ClientPlatform.BROWSER */:\r\n // In a browser environment, report the browser name.\r\n reportedPlatform = _getBrowserName(getUA());\r\n break;\r\n case \"Worker\" /* ClientPlatform.WORKER */:\r\n // Technically a worker runs from a browser but we need to differentiate a\r\n // worker from a browser.\r\n // For example: Chrome-Worker/JsCore/4.9.1/FirebaseCore-web.\r\n reportedPlatform = `${_getBrowserName(getUA())}-${clientPlatform}`;\r\n break;\r\n default:\r\n reportedPlatform = clientPlatform;\r\n }\r\n const reportedFrameworks = frameworks.length\r\n ? frameworks.join(',')\r\n : 'FirebaseCore-web'; /* default value if no other framework is used */\r\n return `${reportedPlatform}/${\"JsCore\" /* ClientImplementation.CORE */}/${SDK_VERSION}/${reportedFrameworks}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass AuthMiddlewareQueue {\r\n constructor(auth) {\r\n this.auth = auth;\r\n this.queue = [];\r\n }\r\n pushCallback(callback, onAbort) {\r\n // The callback could be sync or async. Wrap it into a\r\n // function that is always async.\r\n const wrappedCallback = (user) => new Promise((resolve, reject) => {\r\n try {\r\n const result = callback(user);\r\n // Either resolve with existing promise or wrap a non-promise\r\n // return value into a promise.\r\n resolve(result);\r\n }\r\n catch (e) {\r\n // Sync callback throws.\r\n reject(e);\r\n }\r\n });\r\n // Attach the onAbort if present\r\n wrappedCallback.onAbort = onAbort;\r\n this.queue.push(wrappedCallback);\r\n const index = this.queue.length - 1;\r\n return () => {\r\n // Unsubscribe. Replace with no-op. Do not remove from array, or it will disturb\r\n // indexing of other elements.\r\n this.queue[index] = () => Promise.resolve();\r\n };\r\n }\r\n async runMiddleware(nextUser) {\r\n if (this.auth.currentUser === nextUser) {\r\n return;\r\n }\r\n // While running the middleware, build a temporary stack of onAbort\r\n // callbacks to call if one middleware callback rejects.\r\n const onAbortStack = [];\r\n try {\r\n for (const beforeStateCallback of this.queue) {\r\n await beforeStateCallback(nextUser);\r\n // Only push the onAbort if the callback succeeds\r\n if (beforeStateCallback.onAbort) {\r\n onAbortStack.push(beforeStateCallback.onAbort);\r\n }\r\n }\r\n }\r\n catch (e) {\r\n // Run all onAbort, with separate try/catch to ignore any errors and\r\n // continue\r\n onAbortStack.reverse();\r\n for (const onAbort of onAbortStack) {\r\n try {\r\n onAbort();\r\n }\r\n catch (_) {\r\n /* swallow error */\r\n }\r\n }\r\n throw this.auth._errorFactory.create(\"login-blocked\" /* AuthErrorCode.LOGIN_BLOCKED */, {\r\n originalMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2023 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Fetches the password policy for the currently set tenant or the project if no tenant is set.\r\n *\r\n * @param auth Auth object.\r\n * @param request Password policy request.\r\n * @returns Password policy response.\r\n */\r\nasync function _getPasswordPolicy(auth, request = {}) {\r\n return _performApiRequest(auth, \"GET\" /* HttpMethod.GET */, \"/v2/passwordPolicy\" /* Endpoint.GET_PASSWORD_POLICY */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2023 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Minimum min password length enforced by the backend, even if no minimum length is set.\r\nconst MINIMUM_MIN_PASSWORD_LENGTH = 6;\r\n/**\r\n * Stores password policy requirements and provides password validation against the policy.\r\n *\r\n * @internal\r\n */\r\nclass PasswordPolicyImpl {\r\n constructor(response) {\r\n var _a, _b, _c, _d;\r\n // Only include custom strength options defined in the response.\r\n const responseOptions = response.customStrengthOptions;\r\n this.customStrengthOptions = {};\r\n // TODO: Remove once the backend is updated to include the minimum min password length instead of undefined when there is no minimum length set.\r\n this.customStrengthOptions.minPasswordLength =\r\n (_a = responseOptions.minPasswordLength) !== null && _a !== void 0 ? _a : MINIMUM_MIN_PASSWORD_LENGTH;\r\n if (responseOptions.maxPasswordLength) {\r\n this.customStrengthOptions.maxPasswordLength =\r\n responseOptions.maxPasswordLength;\r\n }\r\n if (responseOptions.containsLowercaseCharacter !== undefined) {\r\n this.customStrengthOptions.containsLowercaseLetter =\r\n responseOptions.containsLowercaseCharacter;\r\n }\r\n if (responseOptions.containsUppercaseCharacter !== undefined) {\r\n this.customStrengthOptions.containsUppercaseLetter =\r\n responseOptions.containsUppercaseCharacter;\r\n }\r\n if (responseOptions.containsNumericCharacter !== undefined) {\r\n this.customStrengthOptions.containsNumericCharacter =\r\n responseOptions.containsNumericCharacter;\r\n }\r\n if (responseOptions.containsNonAlphanumericCharacter !== undefined) {\r\n this.customStrengthOptions.containsNonAlphanumericCharacter =\r\n responseOptions.containsNonAlphanumericCharacter;\r\n }\r\n this.enforcementState = response.enforcementState;\r\n if (this.enforcementState === 'ENFORCEMENT_STATE_UNSPECIFIED') {\r\n this.enforcementState = 'OFF';\r\n }\r\n // Use an empty string if no non-alphanumeric characters are specified in the response.\r\n this.allowedNonAlphanumericCharacters =\r\n (_c = (_b = response.allowedNonAlphanumericCharacters) === null || _b === void 0 ? void 0 : _b.join('')) !== null && _c !== void 0 ? _c : '';\r\n this.forceUpgradeOnSignin = (_d = response.forceUpgradeOnSignin) !== null && _d !== void 0 ? _d : false;\r\n this.schemaVersion = response.schemaVersion;\r\n }\r\n validatePassword(password) {\r\n var _a, _b, _c, _d, _e, _f;\r\n const status = {\r\n isValid: true,\r\n passwordPolicy: this\r\n };\r\n // Check the password length and character options.\r\n this.validatePasswordLengthOptions(password, status);\r\n this.validatePasswordCharacterOptions(password, status);\r\n // Combine the status into single isValid property.\r\n status.isValid && (status.isValid = (_a = status.meetsMinPasswordLength) !== null && _a !== void 0 ? _a : true);\r\n status.isValid && (status.isValid = (_b = status.meetsMaxPasswordLength) !== null && _b !== void 0 ? _b : true);\r\n status.isValid && (status.isValid = (_c = status.containsLowercaseLetter) !== null && _c !== void 0 ? _c : true);\r\n status.isValid && (status.isValid = (_d = status.containsUppercaseLetter) !== null && _d !== void 0 ? _d : true);\r\n status.isValid && (status.isValid = (_e = status.containsNumericCharacter) !== null && _e !== void 0 ? _e : true);\r\n status.isValid && (status.isValid = (_f = status.containsNonAlphanumericCharacter) !== null && _f !== void 0 ? _f : true);\r\n return status;\r\n }\r\n /**\r\n * Validates that the password meets the length options for the policy.\r\n *\r\n * @param password Password to validate.\r\n * @param status Validation status.\r\n */\r\n validatePasswordLengthOptions(password, status) {\r\n const minPasswordLength = this.customStrengthOptions.minPasswordLength;\r\n const maxPasswordLength = this.customStrengthOptions.maxPasswordLength;\r\n if (minPasswordLength) {\r\n status.meetsMinPasswordLength = password.length >= minPasswordLength;\r\n }\r\n if (maxPasswordLength) {\r\n status.meetsMaxPasswordLength = password.length <= maxPasswordLength;\r\n }\r\n }\r\n /**\r\n * Validates that the password meets the character options for the policy.\r\n *\r\n * @param password Password to validate.\r\n * @param status Validation status.\r\n */\r\n validatePasswordCharacterOptions(password, status) {\r\n // Assign statuses for requirements even if the password is an empty string.\r\n this.updatePasswordCharacterOptionsStatuses(status, \r\n /* containsLowercaseCharacter= */ false, \r\n /* containsUppercaseCharacter= */ false, \r\n /* containsNumericCharacter= */ false, \r\n /* containsNonAlphanumericCharacter= */ false);\r\n let passwordChar;\r\n for (let i = 0; i < password.length; i++) {\r\n passwordChar = password.charAt(i);\r\n this.updatePasswordCharacterOptionsStatuses(status, \r\n /* containsLowercaseCharacter= */ passwordChar >= 'a' &&\r\n passwordChar <= 'z', \r\n /* containsUppercaseCharacter= */ passwordChar >= 'A' &&\r\n passwordChar <= 'Z', \r\n /* containsNumericCharacter= */ passwordChar >= '0' &&\r\n passwordChar <= '9', \r\n /* containsNonAlphanumericCharacter= */ this.allowedNonAlphanumericCharacters.includes(passwordChar));\r\n }\r\n }\r\n /**\r\n * Updates the running validation status with the statuses for the character options.\r\n * Expected to be called each time a character is processed to update each option status\r\n * based on the current character.\r\n *\r\n * @param status Validation status.\r\n * @param containsLowercaseCharacter Whether the character is a lowercase letter.\r\n * @param containsUppercaseCharacter Whether the character is an uppercase letter.\r\n * @param containsNumericCharacter Whether the character is a numeric character.\r\n * @param containsNonAlphanumericCharacter Whether the character is a non-alphanumeric character.\r\n */\r\n updatePasswordCharacterOptionsStatuses(status, containsLowercaseCharacter, containsUppercaseCharacter, containsNumericCharacter, containsNonAlphanumericCharacter) {\r\n if (this.customStrengthOptions.containsLowercaseLetter) {\r\n status.containsLowercaseLetter || (status.containsLowercaseLetter = containsLowercaseCharacter);\r\n }\r\n if (this.customStrengthOptions.containsUppercaseLetter) {\r\n status.containsUppercaseLetter || (status.containsUppercaseLetter = containsUppercaseCharacter);\r\n }\r\n if (this.customStrengthOptions.containsNumericCharacter) {\r\n status.containsNumericCharacter || (status.containsNumericCharacter = containsNumericCharacter);\r\n }\r\n if (this.customStrengthOptions.containsNonAlphanumericCharacter) {\r\n status.containsNonAlphanumericCharacter || (status.containsNonAlphanumericCharacter = containsNonAlphanumericCharacter);\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass AuthImpl {\r\n constructor(app, heartbeatServiceProvider, appCheckServiceProvider, config) {\r\n this.app = app;\r\n this.heartbeatServiceProvider = heartbeatServiceProvider;\r\n this.appCheckServiceProvider = appCheckServiceProvider;\r\n this.config = config;\r\n this.currentUser = null;\r\n this.emulatorConfig = null;\r\n this.operations = Promise.resolve();\r\n this.authStateSubscription = new Subscription(this);\r\n this.idTokenSubscription = new Subscription(this);\r\n this.beforeStateQueue = new AuthMiddlewareQueue(this);\r\n this.redirectUser = null;\r\n this.isProactiveRefreshEnabled = false;\r\n this.EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION = 1;\r\n // Any network calls will set this to true and prevent subsequent emulator\r\n // initialization\r\n this._canInitEmulator = true;\r\n this._isInitialized = false;\r\n this._deleted = false;\r\n this._initializationPromise = null;\r\n this._popupRedirectResolver = null;\r\n this._errorFactory = _DEFAULT_AUTH_ERROR_FACTORY;\r\n this._agentRecaptchaConfig = null;\r\n this._tenantRecaptchaConfigs = {};\r\n this._projectPasswordPolicy = null;\r\n this._tenantPasswordPolicies = {};\r\n // Tracks the last notified UID for state change listeners to prevent\r\n // repeated calls to the callbacks. Undefined means it's never been\r\n // called, whereas null means it's been called with a signed out user\r\n this.lastNotifiedUid = undefined;\r\n this.languageCode = null;\r\n this.tenantId = null;\r\n this.settings = { appVerificationDisabledForTesting: false };\r\n this.frameworks = [];\r\n this.name = app.name;\r\n this.clientVersion = config.sdkClientVersion;\r\n }\r\n _initializeWithPersistence(persistenceHierarchy, popupRedirectResolver) {\r\n if (popupRedirectResolver) {\r\n this._popupRedirectResolver = _getInstance(popupRedirectResolver);\r\n }\r\n // Have to check for app deletion throughout initialization (after each\r\n // promise resolution)\r\n this._initializationPromise = this.queue(async () => {\r\n var _a, _b;\r\n if (this._deleted) {\r\n return;\r\n }\r\n this.persistenceManager = await PersistenceUserManager.create(this, persistenceHierarchy);\r\n if (this._deleted) {\r\n return;\r\n }\r\n // Initialize the resolver early if necessary (only applicable to web:\r\n // this will cause the iframe to load immediately in certain cases)\r\n if ((_a = this._popupRedirectResolver) === null || _a === void 0 ? void 0 : _a._shouldInitProactively) {\r\n // If this fails, don't halt auth loading\r\n try {\r\n await this._popupRedirectResolver._initialize(this);\r\n }\r\n catch (e) {\r\n /* Ignore the error */\r\n }\r\n }\r\n await this.initializeCurrentUser(popupRedirectResolver);\r\n this.lastNotifiedUid = ((_b = this.currentUser) === null || _b === void 0 ? void 0 : _b.uid) || null;\r\n if (this._deleted) {\r\n return;\r\n }\r\n this._isInitialized = true;\r\n });\r\n return this._initializationPromise;\r\n }\r\n /**\r\n * If the persistence is changed in another window, the user manager will let us know\r\n */\r\n async _onStorageEvent() {\r\n if (this._deleted) {\r\n return;\r\n }\r\n const user = await this.assertedPersistence.getCurrentUser();\r\n if (!this.currentUser && !user) {\r\n // No change, do nothing (was signed out and remained signed out).\r\n return;\r\n }\r\n // If the same user is to be synchronized.\r\n if (this.currentUser && user && this.currentUser.uid === user.uid) {\r\n // Data update, simply copy data changes.\r\n this._currentUser._assign(user);\r\n // If tokens changed from previous user tokens, this will trigger\r\n // notifyAuthListeners_.\r\n await this.currentUser.getIdToken();\r\n return;\r\n }\r\n // Update current Auth state. Either a new login or logout.\r\n // Skip blocking callbacks, they should not apply to a change in another tab.\r\n await this._updateCurrentUser(user, /* skipBeforeStateCallbacks */ true);\r\n }\r\n async initializeCurrentUserFromIdToken(idToken) {\r\n try {\r\n const response = await getAccountInfo(this, { idToken });\r\n const user = await UserImpl._fromGetAccountInfoResponse(this, response, idToken);\r\n await this.directlySetCurrentUser(user);\r\n }\r\n catch (err) {\r\n console.warn('FirebaseServerApp could not login user with provided authIdToken: ', err);\r\n await this.directlySetCurrentUser(null);\r\n }\r\n }\r\n async initializeCurrentUser(popupRedirectResolver) {\r\n var _a;\r\n if (_isFirebaseServerApp(this.app)) {\r\n const idToken = this.app.settings.authIdToken;\r\n if (idToken) {\r\n // Start the auth operation in the next tick to allow a moment for the customer's app to\r\n // attach an emulator, if desired.\r\n return new Promise(resolve => {\r\n setTimeout(() => this.initializeCurrentUserFromIdToken(idToken).then(resolve, resolve));\r\n });\r\n }\r\n else {\r\n return this.directlySetCurrentUser(null);\r\n }\r\n }\r\n // First check to see if we have a pending redirect event.\r\n const previouslyStoredUser = (await this.assertedPersistence.getCurrentUser());\r\n let futureCurrentUser = previouslyStoredUser;\r\n let needsTocheckMiddleware = false;\r\n if (popupRedirectResolver && this.config.authDomain) {\r\n await this.getOrInitRedirectPersistenceManager();\r\n const redirectUserEventId = (_a = this.redirectUser) === null || _a === void 0 ? void 0 : _a._redirectEventId;\r\n const storedUserEventId = futureCurrentUser === null || futureCurrentUser === void 0 ? void 0 : futureCurrentUser._redirectEventId;\r\n const result = await this.tryRedirectSignIn(popupRedirectResolver);\r\n // If the stored user (i.e. the old \"currentUser\") has a redirectId that\r\n // matches the redirect user, then we want to initially sign in with the\r\n // new user object from result.\r\n // TODO(samgho): More thoroughly test all of this\r\n if ((!redirectUserEventId || redirectUserEventId === storedUserEventId) &&\r\n (result === null || result === void 0 ? void 0 : result.user)) {\r\n futureCurrentUser = result.user;\r\n needsTocheckMiddleware = true;\r\n }\r\n }\r\n // If no user in persistence, there is no current user. Set to null.\r\n if (!futureCurrentUser) {\r\n return this.directlySetCurrentUser(null);\r\n }\r\n if (!futureCurrentUser._redirectEventId) {\r\n // This isn't a redirect link operation, we can reload and bail.\r\n // First though, ensure that we check the middleware is happy.\r\n if (needsTocheckMiddleware) {\r\n try {\r\n await this.beforeStateQueue.runMiddleware(futureCurrentUser);\r\n }\r\n catch (e) {\r\n futureCurrentUser = previouslyStoredUser;\r\n // We know this is available since the bit is only set when the\r\n // resolver is available\r\n this._popupRedirectResolver._overrideRedirectResult(this, () => Promise.reject(e));\r\n }\r\n }\r\n if (futureCurrentUser) {\r\n return this.reloadAndSetCurrentUserOrClear(futureCurrentUser);\r\n }\r\n else {\r\n return this.directlySetCurrentUser(null);\r\n }\r\n }\r\n _assert(this._popupRedirectResolver, this, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n await this.getOrInitRedirectPersistenceManager();\r\n // If the redirect user's event ID matches the current user's event ID,\r\n // DO NOT reload the current user, otherwise they'll be cleared from storage.\r\n // This is important for the reauthenticateWithRedirect() flow.\r\n if (this.redirectUser &&\r\n this.redirectUser._redirectEventId === futureCurrentUser._redirectEventId) {\r\n return this.directlySetCurrentUser(futureCurrentUser);\r\n }\r\n return this.reloadAndSetCurrentUserOrClear(futureCurrentUser);\r\n }\r\n async tryRedirectSignIn(redirectResolver) {\r\n // The redirect user needs to be checked (and signed in if available)\r\n // during auth initialization. All of the normal sign in and link/reauth\r\n // flows call back into auth and push things onto the promise queue. We\r\n // need to await the result of the redirect sign in *inside the promise\r\n // queue*. This presents a problem: we run into deadlock. See:\r\n // ┌> [Initialization] ─────┐\r\n // ┌> [] │\r\n // └─ [getRedirectResult] <─┘\r\n // where [] are tasks on the queue and arrows denote awaits\r\n // Initialization will never complete because it's waiting on something\r\n // that's waiting for initialization to complete!\r\n //\r\n // Instead, this method calls getRedirectResult() (stored in\r\n // _completeRedirectFn) with an optional parameter that instructs all of\r\n // the underlying auth operations to skip anything that mutates auth state.\r\n let result = null;\r\n try {\r\n // We know this._popupRedirectResolver is set since redirectResolver\r\n // is passed in. The _completeRedirectFn expects the unwrapped extern.\r\n result = await this._popupRedirectResolver._completeRedirectFn(this, redirectResolver, true);\r\n }\r\n catch (e) {\r\n // Swallow any errors here; the code can retrieve them in\r\n // getRedirectResult().\r\n await this._setRedirectUser(null);\r\n }\r\n return result;\r\n }\r\n async reloadAndSetCurrentUserOrClear(user) {\r\n try {\r\n await _reloadWithoutSaving(user);\r\n }\r\n catch (e) {\r\n if ((e === null || e === void 0 ? void 0 : e.code) !==\r\n `auth/${\"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */}`) {\r\n // Something's wrong with the user's token. Log them out and remove\r\n // them from storage\r\n return this.directlySetCurrentUser(null);\r\n }\r\n }\r\n return this.directlySetCurrentUser(user);\r\n }\r\n useDeviceLanguage() {\r\n this.languageCode = _getUserLanguage();\r\n }\r\n async _delete() {\r\n this._deleted = true;\r\n }\r\n async updateCurrentUser(userExtern) {\r\n if (_isFirebaseServerApp(this.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(this));\r\n }\r\n // The public updateCurrentUser method needs to make a copy of the user,\r\n // and also check that the project matches\r\n const user = userExtern\r\n ? getModularInstance(userExtern)\r\n : null;\r\n if (user) {\r\n _assert(user.auth.config.apiKey === this.config.apiKey, this, \"invalid-user-token\" /* AuthErrorCode.INVALID_AUTH */);\r\n }\r\n return this._updateCurrentUser(user && user._clone(this));\r\n }\r\n async _updateCurrentUser(user, skipBeforeStateCallbacks = false) {\r\n if (this._deleted) {\r\n return;\r\n }\r\n if (user) {\r\n _assert(this.tenantId === user.tenantId, this, \"tenant-id-mismatch\" /* AuthErrorCode.TENANT_ID_MISMATCH */);\r\n }\r\n if (!skipBeforeStateCallbacks) {\r\n await this.beforeStateQueue.runMiddleware(user);\r\n }\r\n return this.queue(async () => {\r\n await this.directlySetCurrentUser(user);\r\n this.notifyAuthListeners();\r\n });\r\n }\r\n async signOut() {\r\n if (_isFirebaseServerApp(this.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(this));\r\n }\r\n // Run first, to block _setRedirectUser() if any callbacks fail.\r\n await this.beforeStateQueue.runMiddleware(null);\r\n // Clear the redirect user when signOut is called\r\n if (this.redirectPersistenceManager || this._popupRedirectResolver) {\r\n await this._setRedirectUser(null);\r\n }\r\n // Prevent callbacks from being called again in _updateCurrentUser, as\r\n // they were already called in the first line.\r\n return this._updateCurrentUser(null, /* skipBeforeStateCallbacks */ true);\r\n }\r\n setPersistence(persistence) {\r\n if (_isFirebaseServerApp(this.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(this));\r\n }\r\n return this.queue(async () => {\r\n await this.assertedPersistence.setPersistence(_getInstance(persistence));\r\n });\r\n }\r\n _getRecaptchaConfig() {\r\n if (this.tenantId == null) {\r\n return this._agentRecaptchaConfig;\r\n }\r\n else {\r\n return this._tenantRecaptchaConfigs[this.tenantId];\r\n }\r\n }\r\n async validatePassword(password) {\r\n if (!this._getPasswordPolicyInternal()) {\r\n await this._updatePasswordPolicy();\r\n }\r\n // Password policy will be defined after fetching.\r\n const passwordPolicy = this._getPasswordPolicyInternal();\r\n // Check that the policy schema version is supported by the SDK.\r\n // TODO: Update this logic to use a max supported policy schema version once we have multiple schema versions.\r\n if (passwordPolicy.schemaVersion !==\r\n this.EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION) {\r\n return Promise.reject(this._errorFactory.create(\"unsupported-password-policy-schema-version\" /* AuthErrorCode.UNSUPPORTED_PASSWORD_POLICY_SCHEMA_VERSION */, {}));\r\n }\r\n return passwordPolicy.validatePassword(password);\r\n }\r\n _getPasswordPolicyInternal() {\r\n if (this.tenantId === null) {\r\n return this._projectPasswordPolicy;\r\n }\r\n else {\r\n return this._tenantPasswordPolicies[this.tenantId];\r\n }\r\n }\r\n async _updatePasswordPolicy() {\r\n const response = await _getPasswordPolicy(this);\r\n const passwordPolicy = new PasswordPolicyImpl(response);\r\n if (this.tenantId === null) {\r\n this._projectPasswordPolicy = passwordPolicy;\r\n }\r\n else {\r\n this._tenantPasswordPolicies[this.tenantId] = passwordPolicy;\r\n }\r\n }\r\n _getPersistence() {\r\n return this.assertedPersistence.persistence.type;\r\n }\r\n _updateErrorMap(errorMap) {\r\n this._errorFactory = new ErrorFactory('auth', 'Firebase', errorMap());\r\n }\r\n onAuthStateChanged(nextOrObserver, error, completed) {\r\n return this.registerStateListener(this.authStateSubscription, nextOrObserver, error, completed);\r\n }\r\n beforeAuthStateChanged(callback, onAbort) {\r\n return this.beforeStateQueue.pushCallback(callback, onAbort);\r\n }\r\n onIdTokenChanged(nextOrObserver, error, completed) {\r\n return this.registerStateListener(this.idTokenSubscription, nextOrObserver, error, completed);\r\n }\r\n authStateReady() {\r\n return new Promise((resolve, reject) => {\r\n if (this.currentUser) {\r\n resolve();\r\n }\r\n else {\r\n const unsubscribe = this.onAuthStateChanged(() => {\r\n unsubscribe();\r\n resolve();\r\n }, reject);\r\n }\r\n });\r\n }\r\n /**\r\n * Revokes the given access token. Currently only supports Apple OAuth access tokens.\r\n */\r\n async revokeAccessToken(token) {\r\n if (this.currentUser) {\r\n const idToken = await this.currentUser.getIdToken();\r\n // Generalize this to accept other providers once supported.\r\n const request = {\r\n providerId: 'apple.com',\r\n tokenType: \"ACCESS_TOKEN\" /* TokenType.ACCESS_TOKEN */,\r\n token,\r\n idToken\r\n };\r\n if (this.tenantId != null) {\r\n request.tenantId = this.tenantId;\r\n }\r\n await revokeToken(this, request);\r\n }\r\n }\r\n toJSON() {\r\n var _a;\r\n return {\r\n apiKey: this.config.apiKey,\r\n authDomain: this.config.authDomain,\r\n appName: this.name,\r\n currentUser: (_a = this._currentUser) === null || _a === void 0 ? void 0 : _a.toJSON()\r\n };\r\n }\r\n async _setRedirectUser(user, popupRedirectResolver) {\r\n const redirectManager = await this.getOrInitRedirectPersistenceManager(popupRedirectResolver);\r\n return user === null\r\n ? redirectManager.removeCurrentUser()\r\n : redirectManager.setCurrentUser(user);\r\n }\r\n async getOrInitRedirectPersistenceManager(popupRedirectResolver) {\r\n if (!this.redirectPersistenceManager) {\r\n const resolver = (popupRedirectResolver && _getInstance(popupRedirectResolver)) ||\r\n this._popupRedirectResolver;\r\n _assert(resolver, this, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n this.redirectPersistenceManager = await PersistenceUserManager.create(this, [_getInstance(resolver._redirectPersistence)], \"redirectUser\" /* KeyName.REDIRECT_USER */);\r\n this.redirectUser =\r\n await this.redirectPersistenceManager.getCurrentUser();\r\n }\r\n return this.redirectPersistenceManager;\r\n }\r\n async _redirectUserForId(id) {\r\n var _a, _b;\r\n // Make sure we've cleared any pending persistence actions if we're not in\r\n // the initializer\r\n if (this._isInitialized) {\r\n await this.queue(async () => { });\r\n }\r\n if (((_a = this._currentUser) === null || _a === void 0 ? void 0 : _a._redirectEventId) === id) {\r\n return this._currentUser;\r\n }\r\n if (((_b = this.redirectUser) === null || _b === void 0 ? void 0 : _b._redirectEventId) === id) {\r\n return this.redirectUser;\r\n }\r\n return null;\r\n }\r\n async _persistUserIfCurrent(user) {\r\n if (user === this.currentUser) {\r\n return this.queue(async () => this.directlySetCurrentUser(user));\r\n }\r\n }\r\n /** Notifies listeners only if the user is current */\r\n _notifyListenersIfCurrent(user) {\r\n if (user === this.currentUser) {\r\n this.notifyAuthListeners();\r\n }\r\n }\r\n _key() {\r\n return `${this.config.authDomain}:${this.config.apiKey}:${this.name}`;\r\n }\r\n _startProactiveRefresh() {\r\n this.isProactiveRefreshEnabled = true;\r\n if (this.currentUser) {\r\n this._currentUser._startProactiveRefresh();\r\n }\r\n }\r\n _stopProactiveRefresh() {\r\n this.isProactiveRefreshEnabled = false;\r\n if (this.currentUser) {\r\n this._currentUser._stopProactiveRefresh();\r\n }\r\n }\r\n /** Returns the current user cast as the internal type */\r\n get _currentUser() {\r\n return this.currentUser;\r\n }\r\n notifyAuthListeners() {\r\n var _a, _b;\r\n if (!this._isInitialized) {\r\n return;\r\n }\r\n this.idTokenSubscription.next(this.currentUser);\r\n const currentUid = (_b = (_a = this.currentUser) === null || _a === void 0 ? void 0 : _a.uid) !== null && _b !== void 0 ? _b : null;\r\n if (this.lastNotifiedUid !== currentUid) {\r\n this.lastNotifiedUid = currentUid;\r\n this.authStateSubscription.next(this.currentUser);\r\n }\r\n }\r\n registerStateListener(subscription, nextOrObserver, error, completed) {\r\n if (this._deleted) {\r\n return () => { };\r\n }\r\n const cb = typeof nextOrObserver === 'function'\r\n ? nextOrObserver\r\n : nextOrObserver.next.bind(nextOrObserver);\r\n let isUnsubscribed = false;\r\n const promise = this._isInitialized\r\n ? Promise.resolve()\r\n : this._initializationPromise;\r\n _assert(promise, this, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n // The callback needs to be called asynchronously per the spec.\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n promise.then(() => {\r\n if (isUnsubscribed) {\r\n return;\r\n }\r\n cb(this.currentUser);\r\n });\r\n if (typeof nextOrObserver === 'function') {\r\n const unsubscribe = subscription.addObserver(nextOrObserver, error, completed);\r\n return () => {\r\n isUnsubscribed = true;\r\n unsubscribe();\r\n };\r\n }\r\n else {\r\n const unsubscribe = subscription.addObserver(nextOrObserver);\r\n return () => {\r\n isUnsubscribed = true;\r\n unsubscribe();\r\n };\r\n }\r\n }\r\n /**\r\n * Unprotected (from race conditions) method to set the current user. This\r\n * should only be called from within a queued callback. This is necessary\r\n * because the queue shouldn't rely on another queued callback.\r\n */\r\n async directlySetCurrentUser(user) {\r\n if (this.currentUser && this.currentUser !== user) {\r\n this._currentUser._stopProactiveRefresh();\r\n }\r\n if (user && this.isProactiveRefreshEnabled) {\r\n user._startProactiveRefresh();\r\n }\r\n this.currentUser = user;\r\n if (user) {\r\n await this.assertedPersistence.setCurrentUser(user);\r\n }\r\n else {\r\n await this.assertedPersistence.removeCurrentUser();\r\n }\r\n }\r\n queue(action) {\r\n // In case something errors, the callback still should be called in order\r\n // to keep the promise chain alive\r\n this.operations = this.operations.then(action, action);\r\n return this.operations;\r\n }\r\n get assertedPersistence() {\r\n _assert(this.persistenceManager, this, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return this.persistenceManager;\r\n }\r\n _logFramework(framework) {\r\n if (!framework || this.frameworks.includes(framework)) {\r\n return;\r\n }\r\n this.frameworks.push(framework);\r\n // Sort alphabetically so that \"FirebaseCore-web,FirebaseUI-web\" and\r\n // \"FirebaseUI-web,FirebaseCore-web\" aren't viewed as different.\r\n this.frameworks.sort();\r\n this.clientVersion = _getClientVersion(this.config.clientPlatform, this._getFrameworks());\r\n }\r\n _getFrameworks() {\r\n return this.frameworks;\r\n }\r\n async _getAdditionalHeaders() {\r\n var _a;\r\n // Additional headers on every request\r\n const headers = {\r\n [\"X-Client-Version\" /* HttpHeader.X_CLIENT_VERSION */]: this.clientVersion\r\n };\r\n if (this.app.options.appId) {\r\n headers[\"X-Firebase-gmpid\" /* HttpHeader.X_FIREBASE_GMPID */] = this.app.options.appId;\r\n }\r\n // If the heartbeat service exists, add the heartbeat string\r\n const heartbeatsHeader = await ((_a = this.heartbeatServiceProvider\r\n .getImmediate({\r\n optional: true\r\n })) === null || _a === void 0 ? void 0 : _a.getHeartbeatsHeader());\r\n if (heartbeatsHeader) {\r\n headers[\"X-Firebase-Client\" /* HttpHeader.X_FIREBASE_CLIENT */] = heartbeatsHeader;\r\n }\r\n // If the App Check service exists, add the App Check token in the headers\r\n const appCheckToken = await this._getAppCheckToken();\r\n if (appCheckToken) {\r\n headers[\"X-Firebase-AppCheck\" /* HttpHeader.X_FIREBASE_APP_CHECK */] = appCheckToken;\r\n }\r\n return headers;\r\n }\r\n async _getAppCheckToken() {\r\n var _a;\r\n const appCheckTokenResult = await ((_a = this.appCheckServiceProvider\r\n .getImmediate({ optional: true })) === null || _a === void 0 ? void 0 : _a.getToken());\r\n if (appCheckTokenResult === null || appCheckTokenResult === void 0 ? void 0 : appCheckTokenResult.error) {\r\n // Context: appCheck.getToken() will never throw even if an error happened.\r\n // In the error case, a dummy token will be returned along with an error field describing\r\n // the error. In general, we shouldn't care about the error condition and just use\r\n // the token (actual or dummy) to send requests.\r\n _logWarn(`Error while retrieving App Check token: ${appCheckTokenResult.error}`);\r\n }\r\n return appCheckTokenResult === null || appCheckTokenResult === void 0 ? void 0 : appCheckTokenResult.token;\r\n }\r\n}\r\n/**\r\n * Method to be used to cast down to our private implementation of Auth.\r\n * It will also handle unwrapping from the compat type if necessary\r\n *\r\n * @param auth Auth object passed in from developer\r\n */\r\nfunction _castAuth(auth) {\r\n return getModularInstance(auth);\r\n}\r\n/** Helper class to wrap subscriber logic */\r\nclass Subscription {\r\n constructor(auth) {\r\n this.auth = auth;\r\n this.observer = null;\r\n this.addObserver = createSubscribe(observer => (this.observer = observer));\r\n }\r\n get next() {\r\n _assert(this.observer, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return this.observer.next.bind(this.observer);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nlet externalJSProvider = {\r\n async loadJS() {\r\n throw new Error('Unable to load external scripts');\r\n },\r\n recaptchaV2Script: '',\r\n recaptchaEnterpriseScript: '',\r\n gapiScript: ''\r\n};\r\nfunction _setExternalJSProvider(p) {\r\n externalJSProvider = p;\r\n}\r\nfunction _loadJS(url) {\r\n return externalJSProvider.loadJS(url);\r\n}\r\nfunction _recaptchaV2ScriptUrl() {\r\n return externalJSProvider.recaptchaV2Script;\r\n}\r\nfunction _recaptchaEnterpriseScriptUrl() {\r\n return externalJSProvider.recaptchaEnterpriseScript;\r\n}\r\nfunction _gapiScriptUrl() {\r\n return externalJSProvider.gapiScript;\r\n}\r\nfunction _generateCallbackName(prefix) {\r\n return `__${prefix}${Math.floor(Math.random() * 1000000)}`;\r\n}\n\n/* eslint-disable @typescript-eslint/no-require-imports */\r\nconst RECAPTCHA_ENTERPRISE_VERIFIER_TYPE = 'recaptcha-enterprise';\r\nconst FAKE_TOKEN = 'NO_RECAPTCHA';\r\nclass RecaptchaEnterpriseVerifier {\r\n /**\r\n *\r\n * @param authExtern - The corresponding Firebase {@link Auth} instance.\r\n *\r\n */\r\n constructor(authExtern) {\r\n /**\r\n * Identifies the type of application verifier (e.g. \"recaptcha-enterprise\").\r\n */\r\n this.type = RECAPTCHA_ENTERPRISE_VERIFIER_TYPE;\r\n this.auth = _castAuth(authExtern);\r\n }\r\n /**\r\n * Executes the verification process.\r\n *\r\n * @returns A Promise for a token that can be used to assert the validity of a request.\r\n */\r\n async verify(action = 'verify', forceRefresh = false) {\r\n async function retrieveSiteKey(auth) {\r\n if (!forceRefresh) {\r\n if (auth.tenantId == null && auth._agentRecaptchaConfig != null) {\r\n return auth._agentRecaptchaConfig.siteKey;\r\n }\r\n if (auth.tenantId != null &&\r\n auth._tenantRecaptchaConfigs[auth.tenantId] !== undefined) {\r\n return auth._tenantRecaptchaConfigs[auth.tenantId].siteKey;\r\n }\r\n }\r\n return new Promise(async (resolve, reject) => {\r\n getRecaptchaConfig(auth, {\r\n clientType: \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */,\r\n version: \"RECAPTCHA_ENTERPRISE\" /* RecaptchaVersion.ENTERPRISE */\r\n })\r\n .then(response => {\r\n if (response.recaptchaKey === undefined) {\r\n reject(new Error('recaptcha Enterprise site key undefined'));\r\n }\r\n else {\r\n const config = new RecaptchaConfig(response);\r\n if (auth.tenantId == null) {\r\n auth._agentRecaptchaConfig = config;\r\n }\r\n else {\r\n auth._tenantRecaptchaConfigs[auth.tenantId] = config;\r\n }\r\n return resolve(config.siteKey);\r\n }\r\n })\r\n .catch(error => {\r\n reject(error);\r\n });\r\n });\r\n }\r\n function retrieveRecaptchaToken(siteKey, resolve, reject) {\r\n const grecaptcha = window.grecaptcha;\r\n if (isEnterprise(grecaptcha)) {\r\n grecaptcha.enterprise.ready(() => {\r\n grecaptcha.enterprise\r\n .execute(siteKey, { action })\r\n .then(token => {\r\n resolve(token);\r\n })\r\n .catch(() => {\r\n resolve(FAKE_TOKEN);\r\n });\r\n });\r\n }\r\n else {\r\n reject(Error('No reCAPTCHA enterprise script loaded.'));\r\n }\r\n }\r\n return new Promise((resolve, reject) => {\r\n retrieveSiteKey(this.auth)\r\n .then(siteKey => {\r\n if (!forceRefresh && isEnterprise(window.grecaptcha)) {\r\n retrieveRecaptchaToken(siteKey, resolve, reject);\r\n }\r\n else {\r\n if (typeof window === 'undefined') {\r\n reject(new Error('RecaptchaVerifier is only supported in browser'));\r\n return;\r\n }\r\n let url = _recaptchaEnterpriseScriptUrl();\r\n if (url.length !== 0) {\r\n url += siteKey;\r\n }\r\n _loadJS(url)\r\n .then(() => {\r\n retrieveRecaptchaToken(siteKey, resolve, reject);\r\n })\r\n .catch(error => {\r\n reject(error);\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n reject(error);\r\n });\r\n });\r\n }\r\n}\r\nasync function injectRecaptchaFields(auth, request, action, captchaResp = false) {\r\n const verifier = new RecaptchaEnterpriseVerifier(auth);\r\n let captchaResponse;\r\n try {\r\n captchaResponse = await verifier.verify(action);\r\n }\r\n catch (error) {\r\n captchaResponse = await verifier.verify(action, true);\r\n }\r\n const newRequest = Object.assign({}, request);\r\n if (!captchaResp) {\r\n Object.assign(newRequest, { captchaResponse });\r\n }\r\n else {\r\n Object.assign(newRequest, { 'captchaResp': captchaResponse });\r\n }\r\n Object.assign(newRequest, { 'clientType': \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */ });\r\n Object.assign(newRequest, {\r\n 'recaptchaVersion': \"RECAPTCHA_ENTERPRISE\" /* RecaptchaVersion.ENTERPRISE */\r\n });\r\n return newRequest;\r\n}\r\nasync function handleRecaptchaFlow(authInstance, request, actionName, actionMethod) {\r\n var _a;\r\n if ((_a = authInstance\r\n ._getRecaptchaConfig()) === null || _a === void 0 ? void 0 : _a.isProviderEnabled(\"EMAIL_PASSWORD_PROVIDER\" /* RecaptchaProvider.EMAIL_PASSWORD_PROVIDER */)) {\r\n const requestWithRecaptcha = await injectRecaptchaFields(authInstance, request, actionName, actionName === \"getOobCode\" /* RecaptchaActionName.GET_OOB_CODE */);\r\n return actionMethod(authInstance, requestWithRecaptcha);\r\n }\r\n else {\r\n return actionMethod(authInstance, request).catch(async (error) => {\r\n if (error.code === `auth/${\"missing-recaptcha-token\" /* AuthErrorCode.MISSING_RECAPTCHA_TOKEN */}`) {\r\n console.log(`${actionName} is protected by reCAPTCHA Enterprise for this project. Automatically triggering the reCAPTCHA flow and restarting the flow.`);\r\n const requestWithRecaptcha = await injectRecaptchaFields(authInstance, request, actionName, actionName === \"getOobCode\" /* RecaptchaActionName.GET_OOB_CODE */);\r\n return actionMethod(authInstance, requestWithRecaptcha);\r\n }\r\n else {\r\n return Promise.reject(error);\r\n }\r\n });\r\n }\r\n}\r\nasync function _initializeRecaptchaConfig(auth) {\r\n const authInternal = _castAuth(auth);\r\n const response = await getRecaptchaConfig(authInternal, {\r\n clientType: \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */,\r\n version: \"RECAPTCHA_ENTERPRISE\" /* RecaptchaVersion.ENTERPRISE */\r\n });\r\n const config = new RecaptchaConfig(response);\r\n if (authInternal.tenantId == null) {\r\n authInternal._agentRecaptchaConfig = config;\r\n }\r\n else {\r\n authInternal._tenantRecaptchaConfigs[authInternal.tenantId] = config;\r\n }\r\n if (config.isProviderEnabled(\"EMAIL_PASSWORD_PROVIDER\" /* RecaptchaProvider.EMAIL_PASSWORD_PROVIDER */)) {\r\n const verifier = new RecaptchaEnterpriseVerifier(authInternal);\r\n void verifier.verify();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Initializes an {@link Auth} instance with fine-grained control over\r\n * {@link Dependencies}.\r\n *\r\n * @remarks\r\n *\r\n * This function allows more control over the {@link Auth} instance than\r\n * {@link getAuth}. `getAuth` uses platform-specific defaults to supply\r\n * the {@link Dependencies}. In general, `getAuth` is the easiest way to\r\n * initialize Auth and works for most use cases. Use `initializeAuth` if you\r\n * need control over which persistence layer is used, or to minimize bundle\r\n * size if you're not using either `signInWithPopup` or `signInWithRedirect`.\r\n *\r\n * For example, if your app only uses anonymous accounts and you only want\r\n * accounts saved for the current session, initialize `Auth` with:\r\n *\r\n * ```js\r\n * const auth = initializeAuth(app, {\r\n * persistence: browserSessionPersistence,\r\n * popupRedirectResolver: undefined,\r\n * });\r\n * ```\r\n *\r\n * @public\r\n */\r\nfunction initializeAuth(app, deps) {\r\n const provider = _getProvider(app, 'auth');\r\n if (provider.isInitialized()) {\r\n const auth = provider.getImmediate();\r\n const initialOptions = provider.getOptions();\r\n if (deepEqual(initialOptions, deps !== null && deps !== void 0 ? deps : {})) {\r\n return auth;\r\n }\r\n else {\r\n _fail(auth, \"already-initialized\" /* AuthErrorCode.ALREADY_INITIALIZED */);\r\n }\r\n }\r\n const auth = provider.initialize({ options: deps });\r\n return auth;\r\n}\r\nfunction _initializeAuthInstance(auth, deps) {\r\n const persistence = (deps === null || deps === void 0 ? void 0 : deps.persistence) || [];\r\n const hierarchy = (Array.isArray(persistence) ? persistence : [persistence]).map(_getInstance);\r\n if (deps === null || deps === void 0 ? void 0 : deps.errorMap) {\r\n auth._updateErrorMap(deps.errorMap);\r\n }\r\n // This promise is intended to float; auth initialization happens in the\r\n // background, meanwhile the auth object may be used by the app.\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n auth._initializeWithPersistence(hierarchy, deps === null || deps === void 0 ? void 0 : deps.popupRedirectResolver);\r\n}\n\n/**\r\n * Changes the {@link Auth} instance to communicate with the Firebase Auth Emulator, instead of production\r\n * Firebase Auth services.\r\n *\r\n * @remarks\r\n * This must be called synchronously immediately following the first call to\r\n * {@link initializeAuth}. Do not use with production credentials as emulator\r\n * traffic is not encrypted.\r\n *\r\n *\r\n * @example\r\n * ```javascript\r\n * connectAuthEmulator(auth, 'http://127.0.0.1:9099', { disableWarnings: true });\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param url - The URL at which the emulator is running (eg, 'http://localhost:9099').\r\n * @param options - Optional. `options.disableWarnings` defaults to `false`. Set it to\r\n * `true` to disable the warning banner attached to the DOM.\r\n *\r\n * @public\r\n */\r\nfunction connectAuthEmulator(auth, url, options) {\r\n const authInternal = _castAuth(auth);\r\n _assert(authInternal._canInitEmulator, authInternal, \"emulator-config-failed\" /* AuthErrorCode.EMULATOR_CONFIG_FAILED */);\r\n _assert(/^https?:\\/\\//.test(url), authInternal, \"invalid-emulator-scheme\" /* AuthErrorCode.INVALID_EMULATOR_SCHEME */);\r\n const disableWarnings = !!(options === null || options === void 0 ? void 0 : options.disableWarnings);\r\n const protocol = extractProtocol(url);\r\n const { host, port } = extractHostAndPort(url);\r\n const portStr = port === null ? '' : `:${port}`;\r\n // Always replace path with \"/\" (even if input url had no path at all, or had a different one).\r\n authInternal.config.emulator = { url: `${protocol}//${host}${portStr}/` };\r\n authInternal.settings.appVerificationDisabledForTesting = true;\r\n authInternal.emulatorConfig = Object.freeze({\r\n host,\r\n port,\r\n protocol: protocol.replace(':', ''),\r\n options: Object.freeze({ disableWarnings })\r\n });\r\n if (!disableWarnings) {\r\n emitEmulatorWarning();\r\n }\r\n}\r\nfunction extractProtocol(url) {\r\n const protocolEnd = url.indexOf(':');\r\n return protocolEnd < 0 ? '' : url.substr(0, protocolEnd + 1);\r\n}\r\nfunction extractHostAndPort(url) {\r\n const protocol = extractProtocol(url);\r\n const authority = /(\\/\\/)?([^?#/]+)/.exec(url.substr(protocol.length)); // Between // and /, ? or #.\r\n if (!authority) {\r\n return { host: '', port: null };\r\n }\r\n const hostAndPort = authority[2].split('@').pop() || ''; // Strip out \"username:password@\".\r\n const bracketedIPv6 = /^(\\[[^\\]]+\\])(:|$)/.exec(hostAndPort);\r\n if (bracketedIPv6) {\r\n const host = bracketedIPv6[1];\r\n return { host, port: parsePort(hostAndPort.substr(host.length + 1)) };\r\n }\r\n else {\r\n const [host, port] = hostAndPort.split(':');\r\n return { host, port: parsePort(port) };\r\n }\r\n}\r\nfunction parsePort(portStr) {\r\n if (!portStr) {\r\n return null;\r\n }\r\n const port = Number(portStr);\r\n if (isNaN(port)) {\r\n return null;\r\n }\r\n return port;\r\n}\r\nfunction emitEmulatorWarning() {\r\n function attachBanner() {\r\n const el = document.createElement('p');\r\n const sty = el.style;\r\n el.innerText =\r\n 'Running in emulator mode. Do not use with production credentials.';\r\n sty.position = 'fixed';\r\n sty.width = '100%';\r\n sty.backgroundColor = '#ffffff';\r\n sty.border = '.1em solid #000000';\r\n sty.color = '#b50000';\r\n sty.bottom = '0px';\r\n sty.left = '0px';\r\n sty.margin = '0px';\r\n sty.zIndex = '10000';\r\n sty.textAlign = 'center';\r\n el.classList.add('firebase-emulator-warning');\r\n document.body.appendChild(el);\r\n }\r\n if (typeof console !== 'undefined' && typeof console.info === 'function') {\r\n console.info('WARNING: You are using the Auth Emulator,' +\r\n ' which is intended for local testing only. Do not use with' +\r\n ' production credentials.');\r\n }\r\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\r\n if (document.readyState === 'loading') {\r\n window.addEventListener('DOMContentLoaded', attachBanner);\r\n }\r\n else {\r\n attachBanner();\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Interface that represents the credentials returned by an {@link AuthProvider}.\r\n *\r\n * @remarks\r\n * Implementations specify the details about each auth provider's credential requirements.\r\n *\r\n * @public\r\n */\r\nclass AuthCredential {\r\n /** @internal */\r\n constructor(\r\n /**\r\n * The authentication provider ID for the credential.\r\n *\r\n * @remarks\r\n * For example, 'facebook.com', or 'google.com'.\r\n */\r\n providerId, \r\n /**\r\n * The authentication sign in method for the credential.\r\n *\r\n * @remarks\r\n * For example, {@link SignInMethod}.EMAIL_PASSWORD, or\r\n * {@link SignInMethod}.EMAIL_LINK. This corresponds to the sign-in method\r\n * identifier as returned in {@link fetchSignInMethodsForEmail}.\r\n */\r\n signInMethod) {\r\n this.providerId = providerId;\r\n this.signInMethod = signInMethod;\r\n }\r\n /**\r\n * Returns a JSON-serializable representation of this object.\r\n *\r\n * @returns a JSON-serializable representation of this object.\r\n */\r\n toJSON() {\r\n return debugFail('not implemented');\r\n }\r\n /** @internal */\r\n _getIdTokenResponse(_auth) {\r\n return debugFail('not implemented');\r\n }\r\n /** @internal */\r\n _linkToIdToken(_auth, _idToken) {\r\n return debugFail('not implemented');\r\n }\r\n /** @internal */\r\n _getReauthenticationResolver(_auth) {\r\n return debugFail('not implemented');\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function resetPassword(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:resetPassword\" /* Endpoint.RESET_PASSWORD */, _addTidIfNecessary(auth, request));\r\n}\r\nasync function updateEmailPassword(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:update\" /* Endpoint.SET_ACCOUNT_INFO */, request);\r\n}\r\n// Used for linking an email/password account to an existing idToken. Uses the same request/response\r\n// format as updateEmailPassword.\r\nasync function linkEmailPassword(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signUp\" /* Endpoint.SIGN_UP */, request);\r\n}\r\nasync function applyActionCode$1(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:update\" /* Endpoint.SET_ACCOUNT_INFO */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function signInWithPassword(auth, request) {\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithPassword\" /* Endpoint.SIGN_IN_WITH_PASSWORD */, _addTidIfNecessary(auth, request));\r\n}\r\nasync function sendOobCode(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:sendOobCode\" /* Endpoint.SEND_OOB_CODE */, _addTidIfNecessary(auth, request));\r\n}\r\nasync function sendEmailVerification$1(auth, request) {\r\n return sendOobCode(auth, request);\r\n}\r\nasync function sendPasswordResetEmail$1(auth, request) {\r\n return sendOobCode(auth, request);\r\n}\r\nasync function sendSignInLinkToEmail$1(auth, request) {\r\n return sendOobCode(auth, request);\r\n}\r\nasync function verifyAndChangeEmail(auth, request) {\r\n return sendOobCode(auth, request);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function signInWithEmailLink$1(auth, request) {\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithEmailLink\" /* Endpoint.SIGN_IN_WITH_EMAIL_LINK */, _addTidIfNecessary(auth, request));\r\n}\r\nasync function signInWithEmailLinkForLinking(auth, request) {\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithEmailLink\" /* Endpoint.SIGN_IN_WITH_EMAIL_LINK */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Interface that represents the credentials returned by {@link EmailAuthProvider} for\r\n * {@link ProviderId}.PASSWORD\r\n *\r\n * @remarks\r\n * Covers both {@link SignInMethod}.EMAIL_PASSWORD and\r\n * {@link SignInMethod}.EMAIL_LINK.\r\n *\r\n * @public\r\n */\r\nclass EmailAuthCredential extends AuthCredential {\r\n /** @internal */\r\n constructor(\r\n /** @internal */\r\n _email, \r\n /** @internal */\r\n _password, signInMethod, \r\n /** @internal */\r\n _tenantId = null) {\r\n super(\"password\" /* ProviderId.PASSWORD */, signInMethod);\r\n this._email = _email;\r\n this._password = _password;\r\n this._tenantId = _tenantId;\r\n }\r\n /** @internal */\r\n static _fromEmailAndPassword(email, password) {\r\n return new EmailAuthCredential(email, password, \"password\" /* SignInMethod.EMAIL_PASSWORD */);\r\n }\r\n /** @internal */\r\n static _fromEmailAndCode(email, oobCode, tenantId = null) {\r\n return new EmailAuthCredential(email, oobCode, \"emailLink\" /* SignInMethod.EMAIL_LINK */, tenantId);\r\n }\r\n /** {@inheritdoc AuthCredential.toJSON} */\r\n toJSON() {\r\n return {\r\n email: this._email,\r\n password: this._password,\r\n signInMethod: this.signInMethod,\r\n tenantId: this._tenantId\r\n };\r\n }\r\n /**\r\n * Static method to deserialize a JSON representation of an object into an {@link AuthCredential}.\r\n *\r\n * @param json - Either `object` or the stringified representation of the object. When string is\r\n * provided, `JSON.parse` would be called first.\r\n *\r\n * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned.\r\n */\r\n static fromJSON(json) {\r\n const obj = typeof json === 'string' ? JSON.parse(json) : json;\r\n if ((obj === null || obj === void 0 ? void 0 : obj.email) && (obj === null || obj === void 0 ? void 0 : obj.password)) {\r\n if (obj.signInMethod === \"password\" /* SignInMethod.EMAIL_PASSWORD */) {\r\n return this._fromEmailAndPassword(obj.email, obj.password);\r\n }\r\n else if (obj.signInMethod === \"emailLink\" /* SignInMethod.EMAIL_LINK */) {\r\n return this._fromEmailAndCode(obj.email, obj.password, obj.tenantId);\r\n }\r\n }\r\n return null;\r\n }\r\n /** @internal */\r\n async _getIdTokenResponse(auth) {\r\n switch (this.signInMethod) {\r\n case \"password\" /* SignInMethod.EMAIL_PASSWORD */:\r\n const request = {\r\n returnSecureToken: true,\r\n email: this._email,\r\n password: this._password,\r\n clientType: \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */\r\n };\r\n return handleRecaptchaFlow(auth, request, \"signInWithPassword\" /* RecaptchaActionName.SIGN_IN_WITH_PASSWORD */, signInWithPassword);\r\n case \"emailLink\" /* SignInMethod.EMAIL_LINK */:\r\n return signInWithEmailLink$1(auth, {\r\n email: this._email,\r\n oobCode: this._password\r\n });\r\n default:\r\n _fail(auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }\r\n }\r\n /** @internal */\r\n async _linkToIdToken(auth, idToken) {\r\n switch (this.signInMethod) {\r\n case \"password\" /* SignInMethod.EMAIL_PASSWORD */:\r\n const request = {\r\n idToken,\r\n returnSecureToken: true,\r\n email: this._email,\r\n password: this._password,\r\n clientType: \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */\r\n };\r\n return handleRecaptchaFlow(auth, request, \"signUpPassword\" /* RecaptchaActionName.SIGN_UP_PASSWORD */, linkEmailPassword);\r\n case \"emailLink\" /* SignInMethod.EMAIL_LINK */:\r\n return signInWithEmailLinkForLinking(auth, {\r\n idToken,\r\n email: this._email,\r\n oobCode: this._password\r\n });\r\n default:\r\n _fail(auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }\r\n }\r\n /** @internal */\r\n _getReauthenticationResolver(auth) {\r\n return this._getIdTokenResponse(auth);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function signInWithIdp(auth, request) {\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithIdp\" /* Endpoint.SIGN_IN_WITH_IDP */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst IDP_REQUEST_URI$1 = 'http://localhost';\r\n/**\r\n * Represents the OAuth credentials returned by an {@link OAuthProvider}.\r\n *\r\n * @remarks\r\n * Implementations specify the details about each auth provider's credential requirements.\r\n *\r\n * @public\r\n */\r\nclass OAuthCredential extends AuthCredential {\r\n constructor() {\r\n super(...arguments);\r\n this.pendingToken = null;\r\n }\r\n /** @internal */\r\n static _fromParams(params) {\r\n const cred = new OAuthCredential(params.providerId, params.signInMethod);\r\n if (params.idToken || params.accessToken) {\r\n // OAuth 2 and either ID token or access token.\r\n if (params.idToken) {\r\n cred.idToken = params.idToken;\r\n }\r\n if (params.accessToken) {\r\n cred.accessToken = params.accessToken;\r\n }\r\n // Add nonce if available and no pendingToken is present.\r\n if (params.nonce && !params.pendingToken) {\r\n cred.nonce = params.nonce;\r\n }\r\n if (params.pendingToken) {\r\n cred.pendingToken = params.pendingToken;\r\n }\r\n }\r\n else if (params.oauthToken && params.oauthTokenSecret) {\r\n // OAuth 1 and OAuth token with token secret\r\n cred.accessToken = params.oauthToken;\r\n cred.secret = params.oauthTokenSecret;\r\n }\r\n else {\r\n _fail(\"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n }\r\n return cred;\r\n }\r\n /** {@inheritdoc AuthCredential.toJSON} */\r\n toJSON() {\r\n return {\r\n idToken: this.idToken,\r\n accessToken: this.accessToken,\r\n secret: this.secret,\r\n nonce: this.nonce,\r\n pendingToken: this.pendingToken,\r\n providerId: this.providerId,\r\n signInMethod: this.signInMethod\r\n };\r\n }\r\n /**\r\n * Static method to deserialize a JSON representation of an object into an\r\n * {@link AuthCredential}.\r\n *\r\n * @param json - Input can be either Object or the stringified representation of the object.\r\n * When string is provided, JSON.parse would be called first.\r\n *\r\n * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned.\r\n */\r\n static fromJSON(json) {\r\n const obj = typeof json === 'string' ? JSON.parse(json) : json;\r\n const { providerId, signInMethod } = obj, rest = __rest(obj, [\"providerId\", \"signInMethod\"]);\r\n if (!providerId || !signInMethod) {\r\n return null;\r\n }\r\n const cred = new OAuthCredential(providerId, signInMethod);\r\n cred.idToken = rest.idToken || undefined;\r\n cred.accessToken = rest.accessToken || undefined;\r\n cred.secret = rest.secret;\r\n cred.nonce = rest.nonce;\r\n cred.pendingToken = rest.pendingToken || null;\r\n return cred;\r\n }\r\n /** @internal */\r\n _getIdTokenResponse(auth) {\r\n const request = this.buildRequest();\r\n return signInWithIdp(auth, request);\r\n }\r\n /** @internal */\r\n _linkToIdToken(auth, idToken) {\r\n const request = this.buildRequest();\r\n request.idToken = idToken;\r\n return signInWithIdp(auth, request);\r\n }\r\n /** @internal */\r\n _getReauthenticationResolver(auth) {\r\n const request = this.buildRequest();\r\n request.autoCreate = false;\r\n return signInWithIdp(auth, request);\r\n }\r\n buildRequest() {\r\n const request = {\r\n requestUri: IDP_REQUEST_URI$1,\r\n returnSecureToken: true\r\n };\r\n if (this.pendingToken) {\r\n request.pendingToken = this.pendingToken;\r\n }\r\n else {\r\n const postBody = {};\r\n if (this.idToken) {\r\n postBody['id_token'] = this.idToken;\r\n }\r\n if (this.accessToken) {\r\n postBody['access_token'] = this.accessToken;\r\n }\r\n if (this.secret) {\r\n postBody['oauth_token_secret'] = this.secret;\r\n }\r\n postBody['providerId'] = this.providerId;\r\n if (this.nonce && !this.pendingToken) {\r\n postBody['nonce'] = this.nonce;\r\n }\r\n request.postBody = querystring(postBody);\r\n }\r\n return request;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function sendPhoneVerificationCode(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:sendVerificationCode\" /* Endpoint.SEND_VERIFICATION_CODE */, _addTidIfNecessary(auth, request));\r\n}\r\nasync function signInWithPhoneNumber$1(auth, request) {\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithPhoneNumber\" /* Endpoint.SIGN_IN_WITH_PHONE_NUMBER */, _addTidIfNecessary(auth, request));\r\n}\r\nasync function linkWithPhoneNumber$1(auth, request) {\r\n const response = await _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithPhoneNumber\" /* Endpoint.SIGN_IN_WITH_PHONE_NUMBER */, _addTidIfNecessary(auth, request));\r\n if (response.temporaryProof) {\r\n throw _makeTaggedError(auth, \"account-exists-with-different-credential\" /* AuthErrorCode.NEED_CONFIRMATION */, response);\r\n }\r\n return response;\r\n}\r\nconst VERIFY_PHONE_NUMBER_FOR_EXISTING_ERROR_MAP_ = {\r\n [\"USER_NOT_FOUND\" /* ServerError.USER_NOT_FOUND */]: \"user-not-found\" /* AuthErrorCode.USER_DELETED */\r\n};\r\nasync function verifyPhoneNumberForExisting(auth, request) {\r\n const apiRequest = Object.assign(Object.assign({}, request), { operation: 'REAUTH' });\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithPhoneNumber\" /* Endpoint.SIGN_IN_WITH_PHONE_NUMBER */, _addTidIfNecessary(auth, apiRequest), VERIFY_PHONE_NUMBER_FOR_EXISTING_ERROR_MAP_);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Represents the credentials returned by {@link PhoneAuthProvider}.\r\n *\r\n * @public\r\n */\r\nclass PhoneAuthCredential extends AuthCredential {\r\n constructor(params) {\r\n super(\"phone\" /* ProviderId.PHONE */, \"phone\" /* SignInMethod.PHONE */);\r\n this.params = params;\r\n }\r\n /** @internal */\r\n static _fromVerification(verificationId, verificationCode) {\r\n return new PhoneAuthCredential({ verificationId, verificationCode });\r\n }\r\n /** @internal */\r\n static _fromTokenResponse(phoneNumber, temporaryProof) {\r\n return new PhoneAuthCredential({ phoneNumber, temporaryProof });\r\n }\r\n /** @internal */\r\n _getIdTokenResponse(auth) {\r\n return signInWithPhoneNumber$1(auth, this._makeVerificationRequest());\r\n }\r\n /** @internal */\r\n _linkToIdToken(auth, idToken) {\r\n return linkWithPhoneNumber$1(auth, Object.assign({ idToken }, this._makeVerificationRequest()));\r\n }\r\n /** @internal */\r\n _getReauthenticationResolver(auth) {\r\n return verifyPhoneNumberForExisting(auth, this._makeVerificationRequest());\r\n }\r\n /** @internal */\r\n _makeVerificationRequest() {\r\n const { temporaryProof, phoneNumber, verificationId, verificationCode } = this.params;\r\n if (temporaryProof && phoneNumber) {\r\n return { temporaryProof, phoneNumber };\r\n }\r\n return {\r\n sessionInfo: verificationId,\r\n code: verificationCode\r\n };\r\n }\r\n /** {@inheritdoc AuthCredential.toJSON} */\r\n toJSON() {\r\n const obj = {\r\n providerId: this.providerId\r\n };\r\n if (this.params.phoneNumber) {\r\n obj.phoneNumber = this.params.phoneNumber;\r\n }\r\n if (this.params.temporaryProof) {\r\n obj.temporaryProof = this.params.temporaryProof;\r\n }\r\n if (this.params.verificationCode) {\r\n obj.verificationCode = this.params.verificationCode;\r\n }\r\n if (this.params.verificationId) {\r\n obj.verificationId = this.params.verificationId;\r\n }\r\n return obj;\r\n }\r\n /** Generates a phone credential based on a plain object or a JSON string. */\r\n static fromJSON(json) {\r\n if (typeof json === 'string') {\r\n json = JSON.parse(json);\r\n }\r\n const { verificationId, verificationCode, phoneNumber, temporaryProof } = json;\r\n if (!verificationCode &&\r\n !verificationId &&\r\n !phoneNumber &&\r\n !temporaryProof) {\r\n return null;\r\n }\r\n return new PhoneAuthCredential({\r\n verificationId,\r\n verificationCode,\r\n phoneNumber,\r\n temporaryProof\r\n });\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Maps the mode string in action code URL to Action Code Info operation.\r\n *\r\n * @param mode\r\n */\r\nfunction parseMode(mode) {\r\n switch (mode) {\r\n case 'recoverEmail':\r\n return \"RECOVER_EMAIL\" /* ActionCodeOperation.RECOVER_EMAIL */;\r\n case 'resetPassword':\r\n return \"PASSWORD_RESET\" /* ActionCodeOperation.PASSWORD_RESET */;\r\n case 'signIn':\r\n return \"EMAIL_SIGNIN\" /* ActionCodeOperation.EMAIL_SIGNIN */;\r\n case 'verifyEmail':\r\n return \"VERIFY_EMAIL\" /* ActionCodeOperation.VERIFY_EMAIL */;\r\n case 'verifyAndChangeEmail':\r\n return \"VERIFY_AND_CHANGE_EMAIL\" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */;\r\n case 'revertSecondFactorAddition':\r\n return \"REVERT_SECOND_FACTOR_ADDITION\" /* ActionCodeOperation.REVERT_SECOND_FACTOR_ADDITION */;\r\n default:\r\n return null;\r\n }\r\n}\r\n/**\r\n * Helper to parse FDL links\r\n *\r\n * @param url\r\n */\r\nfunction parseDeepLink(url) {\r\n const link = querystringDecode(extractQuerystring(url))['link'];\r\n // Double link case (automatic redirect).\r\n const doubleDeepLink = link\r\n ? querystringDecode(extractQuerystring(link))['deep_link_id']\r\n : null;\r\n // iOS custom scheme links.\r\n const iOSDeepLink = querystringDecode(extractQuerystring(url))['deep_link_id'];\r\n const iOSDoubleDeepLink = iOSDeepLink\r\n ? querystringDecode(extractQuerystring(iOSDeepLink))['link']\r\n : null;\r\n return iOSDoubleDeepLink || iOSDeepLink || doubleDeepLink || link || url;\r\n}\r\n/**\r\n * A utility class to parse email action URLs such as password reset, email verification,\r\n * email link sign in, etc.\r\n *\r\n * @public\r\n */\r\nclass ActionCodeURL {\r\n /**\r\n * @param actionLink - The link from which to extract the URL.\r\n * @returns The {@link ActionCodeURL} object, or null if the link is invalid.\r\n *\r\n * @internal\r\n */\r\n constructor(actionLink) {\r\n var _a, _b, _c, _d, _e, _f;\r\n const searchParams = querystringDecode(extractQuerystring(actionLink));\r\n const apiKey = (_a = searchParams[\"apiKey\" /* QueryField.API_KEY */]) !== null && _a !== void 0 ? _a : null;\r\n const code = (_b = searchParams[\"oobCode\" /* QueryField.CODE */]) !== null && _b !== void 0 ? _b : null;\r\n const operation = parseMode((_c = searchParams[\"mode\" /* QueryField.MODE */]) !== null && _c !== void 0 ? _c : null);\r\n // Validate API key, code and mode.\r\n _assert(apiKey && code && operation, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n this.apiKey = apiKey;\r\n this.operation = operation;\r\n this.code = code;\r\n this.continueUrl = (_d = searchParams[\"continueUrl\" /* QueryField.CONTINUE_URL */]) !== null && _d !== void 0 ? _d : null;\r\n this.languageCode = (_e = searchParams[\"languageCode\" /* QueryField.LANGUAGE_CODE */]) !== null && _e !== void 0 ? _e : null;\r\n this.tenantId = (_f = searchParams[\"tenantId\" /* QueryField.TENANT_ID */]) !== null && _f !== void 0 ? _f : null;\r\n }\r\n /**\r\n * Parses the email action link string and returns an {@link ActionCodeURL} if the link is valid,\r\n * otherwise returns null.\r\n *\r\n * @param link - The email action link string.\r\n * @returns The {@link ActionCodeURL} object, or null if the link is invalid.\r\n *\r\n * @public\r\n */\r\n static parseLink(link) {\r\n const actionLink = parseDeepLink(link);\r\n try {\r\n return new ActionCodeURL(actionLink);\r\n }\r\n catch (_a) {\r\n return null;\r\n }\r\n }\r\n}\r\n/**\r\n * Parses the email action link string and returns an {@link ActionCodeURL} if\r\n * the link is valid, otherwise returns null.\r\n *\r\n * @public\r\n */\r\nfunction parseActionCodeURL(link) {\r\n return ActionCodeURL.parseLink(link);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for generating {@link EmailAuthCredential}.\r\n *\r\n * @public\r\n */\r\nclass EmailAuthProvider {\r\n constructor() {\r\n /**\r\n * Always set to {@link ProviderId}.PASSWORD, even for email link.\r\n */\r\n this.providerId = EmailAuthProvider.PROVIDER_ID;\r\n }\r\n /**\r\n * Initialize an {@link AuthCredential} using an email and password.\r\n *\r\n * @example\r\n * ```javascript\r\n * const authCredential = EmailAuthProvider.credential(email, password);\r\n * const userCredential = await signInWithCredential(auth, authCredential);\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * const userCredential = await signInWithEmailAndPassword(auth, email, password);\r\n * ```\r\n *\r\n * @param email - Email address.\r\n * @param password - User account password.\r\n * @returns The auth provider credential.\r\n */\r\n static credential(email, password) {\r\n return EmailAuthCredential._fromEmailAndPassword(email, password);\r\n }\r\n /**\r\n * Initialize an {@link AuthCredential} using an email and an email link after a sign in with\r\n * email link operation.\r\n *\r\n * @example\r\n * ```javascript\r\n * const authCredential = EmailAuthProvider.credentialWithLink(auth, email, emailLink);\r\n * const userCredential = await signInWithCredential(auth, authCredential);\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * await sendSignInLinkToEmail(auth, email);\r\n * // Obtain emailLink from user.\r\n * const userCredential = await signInWithEmailLink(auth, email, emailLink);\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance used to verify the link.\r\n * @param email - Email address.\r\n * @param emailLink - Sign-in email link.\r\n * @returns - The auth provider credential.\r\n */\r\n static credentialWithLink(email, emailLink) {\r\n const actionCodeUrl = ActionCodeURL.parseLink(emailLink);\r\n _assert(actionCodeUrl, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n return EmailAuthCredential._fromEmailAndCode(email, actionCodeUrl.code, actionCodeUrl.tenantId);\r\n }\r\n}\r\n/**\r\n * Always set to {@link ProviderId}.PASSWORD, even for email link.\r\n */\r\nEmailAuthProvider.PROVIDER_ID = \"password\" /* ProviderId.PASSWORD */;\r\n/**\r\n * Always set to {@link SignInMethod}.EMAIL_PASSWORD.\r\n */\r\nEmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD = \"password\" /* SignInMethod.EMAIL_PASSWORD */;\r\n/**\r\n * Always set to {@link SignInMethod}.EMAIL_LINK.\r\n */\r\nEmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD = \"emailLink\" /* SignInMethod.EMAIL_LINK */;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The base class for all Federated providers (OAuth (including OIDC), SAML).\r\n *\r\n * This class is not meant to be instantiated directly.\r\n *\r\n * @public\r\n */\r\nclass FederatedAuthProvider {\r\n /**\r\n * Constructor for generic OAuth providers.\r\n *\r\n * @param providerId - Provider for which credentials should be generated.\r\n */\r\n constructor(providerId) {\r\n this.providerId = providerId;\r\n /** @internal */\r\n this.defaultLanguageCode = null;\r\n /** @internal */\r\n this.customParameters = {};\r\n }\r\n /**\r\n * Set the language gode.\r\n *\r\n * @param languageCode - language code\r\n */\r\n setDefaultLanguage(languageCode) {\r\n this.defaultLanguageCode = languageCode;\r\n }\r\n /**\r\n * Sets the OAuth custom parameters to pass in an OAuth request for popup and redirect sign-in\r\n * operations.\r\n *\r\n * @remarks\r\n * For a detailed list, check the reserved required OAuth 2.0 parameters such as `client_id`,\r\n * `redirect_uri`, `scope`, `response_type`, and `state` are not allowed and will be ignored.\r\n *\r\n * @param customOAuthParameters - The custom OAuth parameters to pass in the OAuth request.\r\n */\r\n setCustomParameters(customOAuthParameters) {\r\n this.customParameters = customOAuthParameters;\r\n return this;\r\n }\r\n /**\r\n * Retrieve the current list of {@link CustomParameters}.\r\n */\r\n getCustomParameters() {\r\n return this.customParameters;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Common code to all OAuth providers. This is separate from the\r\n * {@link OAuthProvider} so that child providers (like\r\n * {@link GoogleAuthProvider}) don't inherit the `credential` instance method.\r\n * Instead, they rely on a static `credential` method.\r\n */\r\nclass BaseOAuthProvider extends FederatedAuthProvider {\r\n constructor() {\r\n super(...arguments);\r\n /** @internal */\r\n this.scopes = [];\r\n }\r\n /**\r\n * Add an OAuth scope to the credential.\r\n *\r\n * @param scope - Provider OAuth scope to add.\r\n */\r\n addScope(scope) {\r\n // If not already added, add scope to list.\r\n if (!this.scopes.includes(scope)) {\r\n this.scopes.push(scope);\r\n }\r\n return this;\r\n }\r\n /**\r\n * Retrieve the current list of OAuth scopes.\r\n */\r\n getScopes() {\r\n return [...this.scopes];\r\n }\r\n}\r\n/**\r\n * Provider for generating generic {@link OAuthCredential}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new OAuthProvider('google.com');\r\n * // Start a sign in process for an unauthenticated user.\r\n * provider.addScope('profile');\r\n * provider.addScope('email');\r\n * await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * if (result) {\r\n * // This is the signed-in user\r\n * const user = result.user;\r\n * // This gives you a OAuth Access Token for the provider.\r\n * const credential = provider.credentialFromResult(auth, result);\r\n * const token = credential.accessToken;\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a popup.\r\n * const provider = new OAuthProvider('google.com');\r\n * provider.addScope('profile');\r\n * provider.addScope('email');\r\n * const result = await signInWithPopup(auth, provider);\r\n *\r\n * // The signed-in user info.\r\n * const user = result.user;\r\n * // This gives you a OAuth Access Token for the provider.\r\n * const credential = provider.credentialFromResult(auth, result);\r\n * const token = credential.accessToken;\r\n * ```\r\n * @public\r\n */\r\nclass OAuthProvider extends BaseOAuthProvider {\r\n /**\r\n * Creates an {@link OAuthCredential} from a JSON string or a plain object.\r\n * @param json - A plain object or a JSON string\r\n */\r\n static credentialFromJSON(json) {\r\n const obj = typeof json === 'string' ? JSON.parse(json) : json;\r\n _assert('providerId' in obj && 'signInMethod' in obj, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n return OAuthCredential._fromParams(obj);\r\n }\r\n /**\r\n * Creates a {@link OAuthCredential} from a generic OAuth provider's access token or ID token.\r\n *\r\n * @remarks\r\n * The raw nonce is required when an ID token with a nonce field is provided. The SHA-256 hash of\r\n * the raw nonce must match the nonce field in the ID token.\r\n *\r\n * @example\r\n * ```javascript\r\n * // `googleUser` from the onsuccess Google Sign In callback.\r\n * // Initialize a generate OAuth provider with a `google.com` providerId.\r\n * const provider = new OAuthProvider('google.com');\r\n * const credential = provider.credential({\r\n * idToken: googleUser.getAuthResponse().id_token,\r\n * });\r\n * const result = await signInWithCredential(credential);\r\n * ```\r\n *\r\n * @param params - Either the options object containing the ID token, access token and raw nonce\r\n * or the ID token string.\r\n */\r\n credential(params) {\r\n return this._credential(Object.assign(Object.assign({}, params), { nonce: params.rawNonce }));\r\n }\r\n /** An internal credential method that accepts more permissive options */\r\n _credential(params) {\r\n _assert(params.idToken || params.accessToken, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n // For OAuthCredential, sign in method is same as providerId.\r\n return OAuthCredential._fromParams(Object.assign(Object.assign({}, params), { providerId: this.providerId, signInMethod: this.providerId }));\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromResult(userCredential) {\r\n return OAuthProvider.oauthCredentialFromTaggedObject(userCredential);\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\r\n * thrown during a sign-in, link, or reauthenticate operation.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromError(error) {\r\n return OAuthProvider.oauthCredentialFromTaggedObject((error.customData || {}));\r\n }\r\n static oauthCredentialFromTaggedObject({ _tokenResponse: tokenResponse }) {\r\n if (!tokenResponse) {\r\n return null;\r\n }\r\n const { oauthIdToken, oauthAccessToken, oauthTokenSecret, pendingToken, nonce, providerId } = tokenResponse;\r\n if (!oauthAccessToken &&\r\n !oauthTokenSecret &&\r\n !oauthIdToken &&\r\n !pendingToken) {\r\n return null;\r\n }\r\n if (!providerId) {\r\n return null;\r\n }\r\n try {\r\n return new OAuthProvider(providerId)._credential({\r\n idToken: oauthIdToken,\r\n accessToken: oauthAccessToken,\r\n nonce,\r\n pendingToken\r\n });\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.FACEBOOK.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new FacebookAuthProvider();\r\n * // Start a sign in process for an unauthenticated user.\r\n * provider.addScope('user_birthday');\r\n * await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * if (result) {\r\n * // This is the signed-in user\r\n * const user = result.user;\r\n * // This gives you a Facebook Access Token.\r\n * const credential = FacebookAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a popup.\r\n * const provider = new FacebookAuthProvider();\r\n * provider.addScope('user_birthday');\r\n * const result = await signInWithPopup(auth, provider);\r\n *\r\n * // The signed-in user info.\r\n * const user = result.user;\r\n * // This gives you a Facebook Access Token.\r\n * const credential = FacebookAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * ```\r\n *\r\n * @public\r\n */\r\nclass FacebookAuthProvider extends BaseOAuthProvider {\r\n constructor() {\r\n super(\"facebook.com\" /* ProviderId.FACEBOOK */);\r\n }\r\n /**\r\n * Creates a credential for Facebook.\r\n *\r\n * @example\r\n * ```javascript\r\n * // `event` from the Facebook auth.authResponseChange callback.\r\n * const credential = FacebookAuthProvider.credential(event.authResponse.accessToken);\r\n * const result = await signInWithCredential(credential);\r\n * ```\r\n *\r\n * @param accessToken - Facebook access token.\r\n */\r\n static credential(accessToken) {\r\n return OAuthCredential._fromParams({\r\n providerId: FacebookAuthProvider.PROVIDER_ID,\r\n signInMethod: FacebookAuthProvider.FACEBOOK_SIGN_IN_METHOD,\r\n accessToken\r\n });\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromResult(userCredential) {\r\n return FacebookAuthProvider.credentialFromTaggedObject(userCredential);\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\r\n * thrown during a sign-in, link, or reauthenticate operation.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromError(error) {\r\n return FacebookAuthProvider.credentialFromTaggedObject((error.customData || {}));\r\n }\r\n static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) {\r\n if (!tokenResponse || !('oauthAccessToken' in tokenResponse)) {\r\n return null;\r\n }\r\n if (!tokenResponse.oauthAccessToken) {\r\n return null;\r\n }\r\n try {\r\n return FacebookAuthProvider.credential(tokenResponse.oauthAccessToken);\r\n }\r\n catch (_a) {\r\n return null;\r\n }\r\n }\r\n}\r\n/** Always set to {@link SignInMethod}.FACEBOOK. */\r\nFacebookAuthProvider.FACEBOOK_SIGN_IN_METHOD = \"facebook.com\" /* SignInMethod.FACEBOOK */;\r\n/** Always set to {@link ProviderId}.FACEBOOK. */\r\nFacebookAuthProvider.PROVIDER_ID = \"facebook.com\" /* ProviderId.FACEBOOK */;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.GOOGLE.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new GoogleAuthProvider();\r\n * // Start a sign in process for an unauthenticated user.\r\n * provider.addScope('profile');\r\n * provider.addScope('email');\r\n * await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * if (result) {\r\n * // This is the signed-in user\r\n * const user = result.user;\r\n * // This gives you a Google Access Token.\r\n * const credential = GoogleAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a popup.\r\n * const provider = new GoogleAuthProvider();\r\n * provider.addScope('profile');\r\n * provider.addScope('email');\r\n * const result = await signInWithPopup(auth, provider);\r\n *\r\n * // The signed-in user info.\r\n * const user = result.user;\r\n * // This gives you a Google Access Token.\r\n * const credential = GoogleAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * ```\r\n *\r\n * @public\r\n */\r\nclass GoogleAuthProvider extends BaseOAuthProvider {\r\n constructor() {\r\n super(\"google.com\" /* ProviderId.GOOGLE */);\r\n this.addScope('profile');\r\n }\r\n /**\r\n * Creates a credential for Google. At least one of ID token and access token is required.\r\n *\r\n * @example\r\n * ```javascript\r\n * // \\`googleUser\\` from the onsuccess Google Sign In callback.\r\n * const credential = GoogleAuthProvider.credential(googleUser.getAuthResponse().id_token);\r\n * const result = await signInWithCredential(credential);\r\n * ```\r\n *\r\n * @param idToken - Google ID token.\r\n * @param accessToken - Google access token.\r\n */\r\n static credential(idToken, accessToken) {\r\n return OAuthCredential._fromParams({\r\n providerId: GoogleAuthProvider.PROVIDER_ID,\r\n signInMethod: GoogleAuthProvider.GOOGLE_SIGN_IN_METHOD,\r\n idToken,\r\n accessToken\r\n });\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromResult(userCredential) {\r\n return GoogleAuthProvider.credentialFromTaggedObject(userCredential);\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\r\n * thrown during a sign-in, link, or reauthenticate operation.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromError(error) {\r\n return GoogleAuthProvider.credentialFromTaggedObject((error.customData || {}));\r\n }\r\n static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) {\r\n if (!tokenResponse) {\r\n return null;\r\n }\r\n const { oauthIdToken, oauthAccessToken } = tokenResponse;\r\n if (!oauthIdToken && !oauthAccessToken) {\r\n // This could be an oauth 1 credential or a phone credential\r\n return null;\r\n }\r\n try {\r\n return GoogleAuthProvider.credential(oauthIdToken, oauthAccessToken);\r\n }\r\n catch (_a) {\r\n return null;\r\n }\r\n }\r\n}\r\n/** Always set to {@link SignInMethod}.GOOGLE. */\r\nGoogleAuthProvider.GOOGLE_SIGN_IN_METHOD = \"google.com\" /* SignInMethod.GOOGLE */;\r\n/** Always set to {@link ProviderId}.GOOGLE. */\r\nGoogleAuthProvider.PROVIDER_ID = \"google.com\" /* ProviderId.GOOGLE */;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.GITHUB.\r\n *\r\n * @remarks\r\n * GitHub requires an OAuth 2.0 redirect, so you can either handle the redirect directly, or use\r\n * the {@link signInWithPopup} handler:\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new GithubAuthProvider();\r\n * // Start a sign in process for an unauthenticated user.\r\n * provider.addScope('repo');\r\n * await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * if (result) {\r\n * // This is the signed-in user\r\n * const user = result.user;\r\n * // This gives you a GitHub Access Token.\r\n * const credential = GithubAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a popup.\r\n * const provider = new GithubAuthProvider();\r\n * provider.addScope('repo');\r\n * const result = await signInWithPopup(auth, provider);\r\n *\r\n * // The signed-in user info.\r\n * const user = result.user;\r\n * // This gives you a GitHub Access Token.\r\n * const credential = GithubAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * ```\r\n * @public\r\n */\r\nclass GithubAuthProvider extends BaseOAuthProvider {\r\n constructor() {\r\n super(\"github.com\" /* ProviderId.GITHUB */);\r\n }\r\n /**\r\n * Creates a credential for GitHub.\r\n *\r\n * @param accessToken - GitHub access token.\r\n */\r\n static credential(accessToken) {\r\n return OAuthCredential._fromParams({\r\n providerId: GithubAuthProvider.PROVIDER_ID,\r\n signInMethod: GithubAuthProvider.GITHUB_SIGN_IN_METHOD,\r\n accessToken\r\n });\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromResult(userCredential) {\r\n return GithubAuthProvider.credentialFromTaggedObject(userCredential);\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\r\n * thrown during a sign-in, link, or reauthenticate operation.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromError(error) {\r\n return GithubAuthProvider.credentialFromTaggedObject((error.customData || {}));\r\n }\r\n static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) {\r\n if (!tokenResponse || !('oauthAccessToken' in tokenResponse)) {\r\n return null;\r\n }\r\n if (!tokenResponse.oauthAccessToken) {\r\n return null;\r\n }\r\n try {\r\n return GithubAuthProvider.credential(tokenResponse.oauthAccessToken);\r\n }\r\n catch (_a) {\r\n return null;\r\n }\r\n }\r\n}\r\n/** Always set to {@link SignInMethod}.GITHUB. */\r\nGithubAuthProvider.GITHUB_SIGN_IN_METHOD = \"github.com\" /* SignInMethod.GITHUB */;\r\n/** Always set to {@link ProviderId}.GITHUB. */\r\nGithubAuthProvider.PROVIDER_ID = \"github.com\" /* ProviderId.GITHUB */;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst IDP_REQUEST_URI = 'http://localhost';\r\n/**\r\n * @public\r\n */\r\nclass SAMLAuthCredential extends AuthCredential {\r\n /** @internal */\r\n constructor(providerId, pendingToken) {\r\n super(providerId, providerId);\r\n this.pendingToken = pendingToken;\r\n }\r\n /** @internal */\r\n _getIdTokenResponse(auth) {\r\n const request = this.buildRequest();\r\n return signInWithIdp(auth, request);\r\n }\r\n /** @internal */\r\n _linkToIdToken(auth, idToken) {\r\n const request = this.buildRequest();\r\n request.idToken = idToken;\r\n return signInWithIdp(auth, request);\r\n }\r\n /** @internal */\r\n _getReauthenticationResolver(auth) {\r\n const request = this.buildRequest();\r\n request.autoCreate = false;\r\n return signInWithIdp(auth, request);\r\n }\r\n /** {@inheritdoc AuthCredential.toJSON} */\r\n toJSON() {\r\n return {\r\n signInMethod: this.signInMethod,\r\n providerId: this.providerId,\r\n pendingToken: this.pendingToken\r\n };\r\n }\r\n /**\r\n * Static method to deserialize a JSON representation of an object into an\r\n * {@link AuthCredential}.\r\n *\r\n * @param json - Input can be either Object or the stringified representation of the object.\r\n * When string is provided, JSON.parse would be called first.\r\n *\r\n * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned.\r\n */\r\n static fromJSON(json) {\r\n const obj = typeof json === 'string' ? JSON.parse(json) : json;\r\n const { providerId, signInMethod, pendingToken } = obj;\r\n if (!providerId ||\r\n !signInMethod ||\r\n !pendingToken ||\r\n providerId !== signInMethod) {\r\n return null;\r\n }\r\n return new SAMLAuthCredential(providerId, pendingToken);\r\n }\r\n /**\r\n * Helper static method to avoid exposing the constructor to end users.\r\n *\r\n * @internal\r\n */\r\n static _create(providerId, pendingToken) {\r\n return new SAMLAuthCredential(providerId, pendingToken);\r\n }\r\n buildRequest() {\r\n return {\r\n requestUri: IDP_REQUEST_URI,\r\n returnSecureToken: true,\r\n pendingToken: this.pendingToken\r\n };\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst SAML_PROVIDER_PREFIX = 'saml.';\r\n/**\r\n * An {@link AuthProvider} for SAML.\r\n *\r\n * @public\r\n */\r\nclass SAMLAuthProvider extends FederatedAuthProvider {\r\n /**\r\n * Constructor. The providerId must start with \"saml.\"\r\n * @param providerId - SAML provider ID.\r\n */\r\n constructor(providerId) {\r\n _assert(providerId.startsWith(SAML_PROVIDER_PREFIX), \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n super(providerId);\r\n }\r\n /**\r\n * Generates an {@link AuthCredential} from a {@link UserCredential} after a\r\n * successful SAML flow completes.\r\n *\r\n * @remarks\r\n *\r\n * For example, to get an {@link AuthCredential}, you could write the\r\n * following code:\r\n *\r\n * ```js\r\n * const userCredential = await signInWithPopup(auth, samlProvider);\r\n * const credential = SAMLAuthProvider.credentialFromResult(userCredential);\r\n * ```\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromResult(userCredential) {\r\n return SAMLAuthProvider.samlCredentialFromTaggedObject(userCredential);\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\r\n * thrown during a sign-in, link, or reauthenticate operation.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromError(error) {\r\n return SAMLAuthProvider.samlCredentialFromTaggedObject((error.customData || {}));\r\n }\r\n /**\r\n * Creates an {@link AuthCredential} from a JSON string or a plain object.\r\n * @param json - A plain object or a JSON string\r\n */\r\n static credentialFromJSON(json) {\r\n const credential = SAMLAuthCredential.fromJSON(json);\r\n _assert(credential, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n return credential;\r\n }\r\n static samlCredentialFromTaggedObject({ _tokenResponse: tokenResponse }) {\r\n if (!tokenResponse) {\r\n return null;\r\n }\r\n const { pendingToken, providerId } = tokenResponse;\r\n if (!pendingToken || !providerId) {\r\n return null;\r\n }\r\n try {\r\n return SAMLAuthCredential._create(providerId, pendingToken);\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.TWITTER.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new TwitterAuthProvider();\r\n * // Start a sign in process for an unauthenticated user.\r\n * await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * if (result) {\r\n * // This is the signed-in user\r\n * const user = result.user;\r\n * // This gives you a Twitter Access Token and Secret.\r\n * const credential = TwitterAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * const secret = credential.secret;\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a popup.\r\n * const provider = new TwitterAuthProvider();\r\n * const result = await signInWithPopup(auth, provider);\r\n *\r\n * // The signed-in user info.\r\n * const user = result.user;\r\n * // This gives you a Twitter Access Token and Secret.\r\n * const credential = TwitterAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * const secret = credential.secret;\r\n * ```\r\n *\r\n * @public\r\n */\r\nclass TwitterAuthProvider extends BaseOAuthProvider {\r\n constructor() {\r\n super(\"twitter.com\" /* ProviderId.TWITTER */);\r\n }\r\n /**\r\n * Creates a credential for Twitter.\r\n *\r\n * @param token - Twitter access token.\r\n * @param secret - Twitter secret.\r\n */\r\n static credential(token, secret) {\r\n return OAuthCredential._fromParams({\r\n providerId: TwitterAuthProvider.PROVIDER_ID,\r\n signInMethod: TwitterAuthProvider.TWITTER_SIGN_IN_METHOD,\r\n oauthToken: token,\r\n oauthTokenSecret: secret\r\n });\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromResult(userCredential) {\r\n return TwitterAuthProvider.credentialFromTaggedObject(userCredential);\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\r\n * thrown during a sign-in, link, or reauthenticate operation.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromError(error) {\r\n return TwitterAuthProvider.credentialFromTaggedObject((error.customData || {}));\r\n }\r\n static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) {\r\n if (!tokenResponse) {\r\n return null;\r\n }\r\n const { oauthAccessToken, oauthTokenSecret } = tokenResponse;\r\n if (!oauthAccessToken || !oauthTokenSecret) {\r\n return null;\r\n }\r\n try {\r\n return TwitterAuthProvider.credential(oauthAccessToken, oauthTokenSecret);\r\n }\r\n catch (_a) {\r\n return null;\r\n }\r\n }\r\n}\r\n/** Always set to {@link SignInMethod}.TWITTER. */\r\nTwitterAuthProvider.TWITTER_SIGN_IN_METHOD = \"twitter.com\" /* SignInMethod.TWITTER */;\r\n/** Always set to {@link ProviderId}.TWITTER. */\r\nTwitterAuthProvider.PROVIDER_ID = \"twitter.com\" /* ProviderId.TWITTER */;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function signUp(auth, request) {\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signUp\" /* Endpoint.SIGN_UP */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass UserCredentialImpl {\r\n constructor(params) {\r\n this.user = params.user;\r\n this.providerId = params.providerId;\r\n this._tokenResponse = params._tokenResponse;\r\n this.operationType = params.operationType;\r\n }\r\n static async _fromIdTokenResponse(auth, operationType, idTokenResponse, isAnonymous = false) {\r\n const user = await UserImpl._fromIdTokenResponse(auth, idTokenResponse, isAnonymous);\r\n const providerId = providerIdForResponse(idTokenResponse);\r\n const userCred = new UserCredentialImpl({\r\n user,\r\n providerId,\r\n _tokenResponse: idTokenResponse,\r\n operationType\r\n });\r\n return userCred;\r\n }\r\n static async _forOperation(user, operationType, response) {\r\n await user._updateTokensIfNecessary(response, /* reload */ true);\r\n const providerId = providerIdForResponse(response);\r\n return new UserCredentialImpl({\r\n user,\r\n providerId,\r\n _tokenResponse: response,\r\n operationType\r\n });\r\n }\r\n}\r\nfunction providerIdForResponse(response) {\r\n if (response.providerId) {\r\n return response.providerId;\r\n }\r\n if ('phoneNumber' in response) {\r\n return \"phone\" /* ProviderId.PHONE */;\r\n }\r\n return null;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Asynchronously signs in as an anonymous user.\r\n *\r\n * @remarks\r\n * If there is already an anonymous user signed in, that user will be returned; otherwise, a\r\n * new anonymous user identity will be created and returned.\r\n *\r\n * This method is not supported by {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n *\r\n * @public\r\n */\r\nasync function signInAnonymously(auth) {\r\n var _a;\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const authInternal = _castAuth(auth);\r\n await authInternal._initializationPromise;\r\n if ((_a = authInternal.currentUser) === null || _a === void 0 ? void 0 : _a.isAnonymous) {\r\n // If an anonymous user is already signed in, no need to sign them in again.\r\n return new UserCredentialImpl({\r\n user: authInternal.currentUser,\r\n providerId: null,\r\n operationType: \"signIn\" /* OperationType.SIGN_IN */\r\n });\r\n }\r\n const response = await signUp(authInternal, {\r\n returnSecureToken: true\r\n });\r\n const userCredential = await UserCredentialImpl._fromIdTokenResponse(authInternal, \"signIn\" /* OperationType.SIGN_IN */, response, true);\r\n await authInternal._updateCurrentUser(userCredential.user);\r\n return userCredential;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass MultiFactorError extends FirebaseError {\r\n constructor(auth, error, operationType, user) {\r\n var _a;\r\n super(error.code, error.message);\r\n this.operationType = operationType;\r\n this.user = user;\r\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n Object.setPrototypeOf(this, MultiFactorError.prototype);\r\n this.customData = {\r\n appName: auth.name,\r\n tenantId: (_a = auth.tenantId) !== null && _a !== void 0 ? _a : undefined,\r\n _serverResponse: error.customData._serverResponse,\r\n operationType\r\n };\r\n }\r\n static _fromErrorAndOperation(auth, error, operationType, user) {\r\n return new MultiFactorError(auth, error, operationType, user);\r\n }\r\n}\r\nfunction _processCredentialSavingMfaContextIfNecessary(auth, operationType, credential, user) {\r\n const idTokenProvider = operationType === \"reauthenticate\" /* OperationType.REAUTHENTICATE */\r\n ? credential._getReauthenticationResolver(auth)\r\n : credential._getIdTokenResponse(auth);\r\n return idTokenProvider.catch(error => {\r\n if (error.code === `auth/${\"multi-factor-auth-required\" /* AuthErrorCode.MFA_REQUIRED */}`) {\r\n throw MultiFactorError._fromErrorAndOperation(auth, error, operationType, user);\r\n }\r\n throw error;\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Takes a set of UserInfo provider data and converts it to a set of names\r\n */\r\nfunction providerDataAsNames(providerData) {\r\n return new Set(providerData\r\n .map(({ providerId }) => providerId)\r\n .filter(pid => !!pid));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Unlinks a provider from a user account.\r\n *\r\n * @param user - The user.\r\n * @param providerId - The provider to unlink.\r\n *\r\n * @public\r\n */\r\nasync function unlink(user, providerId) {\r\n const userInternal = getModularInstance(user);\r\n await _assertLinkedStatus(true, userInternal, providerId);\r\n const { providerUserInfo } = await deleteLinkedAccounts(userInternal.auth, {\r\n idToken: await userInternal.getIdToken(),\r\n deleteProvider: [providerId]\r\n });\r\n const providersLeft = providerDataAsNames(providerUserInfo || []);\r\n userInternal.providerData = userInternal.providerData.filter(pd => providersLeft.has(pd.providerId));\r\n if (!providersLeft.has(\"phone\" /* ProviderId.PHONE */)) {\r\n userInternal.phoneNumber = null;\r\n }\r\n await userInternal.auth._persistUserIfCurrent(userInternal);\r\n return userInternal;\r\n}\r\nasync function _link$1(user, credential, bypassAuthState = false) {\r\n const response = await _logoutIfInvalidated(user, credential._linkToIdToken(user.auth, await user.getIdToken()), bypassAuthState);\r\n return UserCredentialImpl._forOperation(user, \"link\" /* OperationType.LINK */, response);\r\n}\r\nasync function _assertLinkedStatus(expected, user, provider) {\r\n await _reloadWithoutSaving(user);\r\n const providerIds = providerDataAsNames(user.providerData);\r\n const code = expected === false\r\n ? \"provider-already-linked\" /* AuthErrorCode.PROVIDER_ALREADY_LINKED */\r\n : \"no-such-provider\" /* AuthErrorCode.NO_SUCH_PROVIDER */;\r\n _assert(providerIds.has(provider) === expected, user.auth, code);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function _reauthenticate(user, credential, bypassAuthState = false) {\r\n const { auth } = user;\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const operationType = \"reauthenticate\" /* OperationType.REAUTHENTICATE */;\r\n try {\r\n const response = await _logoutIfInvalidated(user, _processCredentialSavingMfaContextIfNecessary(auth, operationType, credential, user), bypassAuthState);\r\n _assert(response.idToken, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const parsed = _parseToken(response.idToken);\r\n _assert(parsed, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const { sub: localId } = parsed;\r\n _assert(user.uid === localId, auth, \"user-mismatch\" /* AuthErrorCode.USER_MISMATCH */);\r\n return UserCredentialImpl._forOperation(user, operationType, response);\r\n }\r\n catch (e) {\r\n // Convert user deleted error into user mismatch\r\n if ((e === null || e === void 0 ? void 0 : e.code) === `auth/${\"user-not-found\" /* AuthErrorCode.USER_DELETED */}`) {\r\n _fail(auth, \"user-mismatch\" /* AuthErrorCode.USER_MISMATCH */);\r\n }\r\n throw e;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function _signInWithCredential(auth, credential, bypassAuthState = false) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const operationType = \"signIn\" /* OperationType.SIGN_IN */;\r\n const response = await _processCredentialSavingMfaContextIfNecessary(auth, operationType, credential);\r\n const userCredential = await UserCredentialImpl._fromIdTokenResponse(auth, operationType, response);\r\n if (!bypassAuthState) {\r\n await auth._updateCurrentUser(userCredential.user);\r\n }\r\n return userCredential;\r\n}\r\n/**\r\n * Asynchronously signs in with the given credentials.\r\n *\r\n * @remarks\r\n * An {@link AuthProvider} can be used to generate the credential.\r\n *\r\n * This method is not supported by {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param credential - The auth credential.\r\n *\r\n * @public\r\n */\r\nasync function signInWithCredential(auth, credential) {\r\n return _signInWithCredential(_castAuth(auth), credential);\r\n}\r\n/**\r\n * Links the user account with the given credentials.\r\n *\r\n * @remarks\r\n * An {@link AuthProvider} can be used to generate the credential.\r\n *\r\n * @param user - The user.\r\n * @param credential - The auth credential.\r\n *\r\n * @public\r\n */\r\nasync function linkWithCredential(user, credential) {\r\n const userInternal = getModularInstance(user);\r\n await _assertLinkedStatus(false, userInternal, credential.providerId);\r\n return _link$1(userInternal, credential);\r\n}\r\n/**\r\n * Re-authenticates a user using a fresh credential.\r\n *\r\n * @remarks\r\n * Use before operations such as {@link updatePassword} that require tokens from recent sign-in\r\n * attempts. This method can be used to recover from a `CREDENTIAL_TOO_OLD_LOGIN_AGAIN` error\r\n * or a `TOKEN_EXPIRED` error.\r\n *\r\n * This method is not supported on any {@link User} signed in by {@link Auth} instances\r\n * created with a {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @param user - The user.\r\n * @param credential - The auth credential.\r\n *\r\n * @public\r\n */\r\nasync function reauthenticateWithCredential(user, credential) {\r\n return _reauthenticate(getModularInstance(user), credential);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function signInWithCustomToken$1(auth, request) {\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithCustomToken\" /* Endpoint.SIGN_IN_WITH_CUSTOM_TOKEN */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Asynchronously signs in using a custom token.\r\n *\r\n * @remarks\r\n * Custom tokens are used to integrate Firebase Auth with existing auth systems, and must\r\n * be generated by an auth backend using the\r\n * {@link https://firebase.google.com/docs/reference/admin/node/admin.auth.Auth#createcustomtoken | createCustomToken}\r\n * method in the {@link https://firebase.google.com/docs/auth/admin | Admin SDK} .\r\n *\r\n * Fails with an error if the token is invalid, expired, or not accepted by the Firebase Auth service.\r\n *\r\n * This method is not supported by {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param customToken - The custom token to sign in with.\r\n *\r\n * @public\r\n */\r\nasync function signInWithCustomToken(auth, customToken) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const authInternal = _castAuth(auth);\r\n const response = await signInWithCustomToken$1(authInternal, {\r\n token: customToken,\r\n returnSecureToken: true\r\n });\r\n const cred = await UserCredentialImpl._fromIdTokenResponse(authInternal, \"signIn\" /* OperationType.SIGN_IN */, response);\r\n await authInternal._updateCurrentUser(cred.user);\r\n return cred;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass MultiFactorInfoImpl {\r\n constructor(factorId, response) {\r\n this.factorId = factorId;\r\n this.uid = response.mfaEnrollmentId;\r\n this.enrollmentTime = new Date(response.enrolledAt).toUTCString();\r\n this.displayName = response.displayName;\r\n }\r\n static _fromServerResponse(auth, enrollment) {\r\n if ('phoneInfo' in enrollment) {\r\n return PhoneMultiFactorInfoImpl._fromServerResponse(auth, enrollment);\r\n }\r\n else if ('totpInfo' in enrollment) {\r\n return TotpMultiFactorInfoImpl._fromServerResponse(auth, enrollment);\r\n }\r\n return _fail(auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }\r\n}\r\nclass PhoneMultiFactorInfoImpl extends MultiFactorInfoImpl {\r\n constructor(response) {\r\n super(\"phone\" /* FactorId.PHONE */, response);\r\n this.phoneNumber = response.phoneInfo;\r\n }\r\n static _fromServerResponse(_auth, enrollment) {\r\n return new PhoneMultiFactorInfoImpl(enrollment);\r\n }\r\n}\r\nclass TotpMultiFactorInfoImpl extends MultiFactorInfoImpl {\r\n constructor(response) {\r\n super(\"totp\" /* FactorId.TOTP */, response);\r\n }\r\n static _fromServerResponse(_auth, enrollment) {\r\n return new TotpMultiFactorInfoImpl(enrollment);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _setActionCodeSettingsOnRequest(auth, request, actionCodeSettings) {\r\n var _a;\r\n _assert(((_a = actionCodeSettings.url) === null || _a === void 0 ? void 0 : _a.length) > 0, auth, \"invalid-continue-uri\" /* AuthErrorCode.INVALID_CONTINUE_URI */);\r\n _assert(typeof actionCodeSettings.dynamicLinkDomain === 'undefined' ||\r\n actionCodeSettings.dynamicLinkDomain.length > 0, auth, \"invalid-dynamic-link-domain\" /* AuthErrorCode.INVALID_DYNAMIC_LINK_DOMAIN */);\r\n request.continueUrl = actionCodeSettings.url;\r\n request.dynamicLinkDomain = actionCodeSettings.dynamicLinkDomain;\r\n request.canHandleCodeInApp = actionCodeSettings.handleCodeInApp;\r\n if (actionCodeSettings.iOS) {\r\n _assert(actionCodeSettings.iOS.bundleId.length > 0, auth, \"missing-ios-bundle-id\" /* AuthErrorCode.MISSING_IOS_BUNDLE_ID */);\r\n request.iOSBundleId = actionCodeSettings.iOS.bundleId;\r\n }\r\n if (actionCodeSettings.android) {\r\n _assert(actionCodeSettings.android.packageName.length > 0, auth, \"missing-android-pkg-name\" /* AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME */);\r\n request.androidInstallApp = actionCodeSettings.android.installApp;\r\n request.androidMinimumVersionCode =\r\n actionCodeSettings.android.minimumVersion;\r\n request.androidPackageName = actionCodeSettings.android.packageName;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Updates the password policy cached in the {@link Auth} instance if a policy is already\r\n * cached for the project or tenant.\r\n *\r\n * @remarks\r\n * We only fetch the password policy if the password did not meet policy requirements and\r\n * there is an existing policy cached. A developer must call validatePassword at least\r\n * once for the cache to be automatically updated.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n *\r\n * @private\r\n */\r\nasync function recachePasswordPolicy(auth) {\r\n const authInternal = _castAuth(auth);\r\n if (authInternal._getPasswordPolicyInternal()) {\r\n await authInternal._updatePasswordPolicy();\r\n }\r\n}\r\n/**\r\n * Sends a password reset email to the given email address. This method does not throw an error when\r\n * there's no user account with the given email address and\r\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}\r\n * is enabled.\r\n *\r\n * @remarks\r\n * To complete the password reset, call {@link confirmPasswordReset} with the code supplied in\r\n * the email sent to the user, along with the new password specified by the user.\r\n *\r\n * @example\r\n * ```javascript\r\n * const actionCodeSettings = {\r\n * url: 'https://www.example.com/?email=user@example.com',\r\n * iOS: {\r\n * bundleId: 'com.example.ios'\r\n * },\r\n * android: {\r\n * packageName: 'com.example.android',\r\n * installApp: true,\r\n * minimumVersion: '12'\r\n * },\r\n * handleCodeInApp: true\r\n * };\r\n * await sendPasswordResetEmail(auth, 'user@example.com', actionCodeSettings);\r\n * // Obtain code from user.\r\n * await confirmPasswordReset('user@example.com', code);\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param email - The user's email address.\r\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\r\n *\r\n * @public\r\n */\r\nasync function sendPasswordResetEmail(auth, email, actionCodeSettings) {\r\n const authInternal = _castAuth(auth);\r\n const request = {\r\n requestType: \"PASSWORD_RESET\" /* ActionCodeOperation.PASSWORD_RESET */,\r\n email,\r\n clientType: \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */\r\n };\r\n if (actionCodeSettings) {\r\n _setActionCodeSettingsOnRequest(authInternal, request, actionCodeSettings);\r\n }\r\n await handleRecaptchaFlow(authInternal, request, \"getOobCode\" /* RecaptchaActionName.GET_OOB_CODE */, sendPasswordResetEmail$1);\r\n}\r\n/**\r\n * Completes the password reset process, given a confirmation code and new password.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param oobCode - A confirmation code sent to the user.\r\n * @param newPassword - The new password.\r\n *\r\n * @public\r\n */\r\nasync function confirmPasswordReset(auth, oobCode, newPassword) {\r\n await resetPassword(getModularInstance(auth), {\r\n oobCode,\r\n newPassword\r\n })\r\n .catch(async (error) => {\r\n if (error.code ===\r\n `auth/${\"password-does-not-meet-requirements\" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */}`) {\r\n void recachePasswordPolicy(auth);\r\n }\r\n throw error;\r\n });\r\n // Do not return the email.\r\n}\r\n/**\r\n * Applies a verification code sent to the user by email or other out-of-band mechanism.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param oobCode - A verification code sent to the user.\r\n *\r\n * @public\r\n */\r\nasync function applyActionCode(auth, oobCode) {\r\n await applyActionCode$1(getModularInstance(auth), { oobCode });\r\n}\r\n/**\r\n * Checks a verification code sent to the user by email or other out-of-band mechanism.\r\n *\r\n * @returns metadata about the code.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param oobCode - A verification code sent to the user.\r\n *\r\n * @public\r\n */\r\nasync function checkActionCode(auth, oobCode) {\r\n const authModular = getModularInstance(auth);\r\n const response = await resetPassword(authModular, { oobCode });\r\n // Email could be empty only if the request type is EMAIL_SIGNIN or\r\n // VERIFY_AND_CHANGE_EMAIL.\r\n // New email should not be empty if the request type is\r\n // VERIFY_AND_CHANGE_EMAIL.\r\n // Multi-factor info could not be empty if the request type is\r\n // REVERT_SECOND_FACTOR_ADDITION.\r\n const operation = response.requestType;\r\n _assert(operation, authModular, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n switch (operation) {\r\n case \"EMAIL_SIGNIN\" /* ActionCodeOperation.EMAIL_SIGNIN */:\r\n break;\r\n case \"VERIFY_AND_CHANGE_EMAIL\" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */:\r\n _assert(response.newEmail, authModular, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n break;\r\n case \"REVERT_SECOND_FACTOR_ADDITION\" /* ActionCodeOperation.REVERT_SECOND_FACTOR_ADDITION */:\r\n _assert(response.mfaInfo, authModular, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n // fall through\r\n default:\r\n _assert(response.email, authModular, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }\r\n // The multi-factor info for revert second factor addition\r\n let multiFactorInfo = null;\r\n if (response.mfaInfo) {\r\n multiFactorInfo = MultiFactorInfoImpl._fromServerResponse(_castAuth(authModular), response.mfaInfo);\r\n }\r\n return {\r\n data: {\r\n email: (response.requestType === \"VERIFY_AND_CHANGE_EMAIL\" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */\r\n ? response.newEmail\r\n : response.email) || null,\r\n previousEmail: (response.requestType === \"VERIFY_AND_CHANGE_EMAIL\" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */\r\n ? response.email\r\n : response.newEmail) || null,\r\n multiFactorInfo\r\n },\r\n operation\r\n };\r\n}\r\n/**\r\n * Checks a password reset code sent to the user by email or other out-of-band mechanism.\r\n *\r\n * @returns the user's email address if valid.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param code - A verification code sent to the user.\r\n *\r\n * @public\r\n */\r\nasync function verifyPasswordResetCode(auth, code) {\r\n const { data } = await checkActionCode(getModularInstance(auth), code);\r\n // Email should always be present since a code was sent to it\r\n return data.email;\r\n}\r\n/**\r\n * Creates a new user account associated with the specified email address and password.\r\n *\r\n * @remarks\r\n * On successful creation of the user account, this user will also be signed in to your application.\r\n *\r\n * User account creation can fail if the account already exists or the password is invalid.\r\n *\r\n * This method is not supported on {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * Note: The email address acts as a unique identifier for the user and enables an email-based\r\n * password reset. This function will create a new user account and set the initial user password.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param email - The user's email address.\r\n * @param password - The user's chosen password.\r\n *\r\n * @public\r\n */\r\nasync function createUserWithEmailAndPassword(auth, email, password) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const authInternal = _castAuth(auth);\r\n const request = {\r\n returnSecureToken: true,\r\n email,\r\n password,\r\n clientType: \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */\r\n };\r\n const signUpResponse = handleRecaptchaFlow(authInternal, request, \"signUpPassword\" /* RecaptchaActionName.SIGN_UP_PASSWORD */, signUp);\r\n const response = await signUpResponse.catch(error => {\r\n if (error.code === `auth/${\"password-does-not-meet-requirements\" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */}`) {\r\n void recachePasswordPolicy(auth);\r\n }\r\n throw error;\r\n });\r\n const userCredential = await UserCredentialImpl._fromIdTokenResponse(authInternal, \"signIn\" /* OperationType.SIGN_IN */, response);\r\n await authInternal._updateCurrentUser(userCredential.user);\r\n return userCredential;\r\n}\r\n/**\r\n * Asynchronously signs in using an email and password.\r\n *\r\n * @remarks\r\n * Fails with an error if the email address and password do not match. When\r\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}\r\n * is enabled, this method fails with \"auth/invalid-credential\" in case of an invalid\r\n * email/password.\r\n *\r\n * This method is not supported on {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * Note: The user's password is NOT the password used to access the user's email account. The\r\n * email address serves as a unique identifier for the user, and the password is used to access\r\n * the user's account in your Firebase project. See also: {@link createUserWithEmailAndPassword}.\r\n *\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param email - The users email address.\r\n * @param password - The users password.\r\n *\r\n * @public\r\n */\r\nfunction signInWithEmailAndPassword(auth, email, password) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n return signInWithCredential(getModularInstance(auth), EmailAuthProvider.credential(email, password)).catch(async (error) => {\r\n if (error.code === `auth/${\"password-does-not-meet-requirements\" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */}`) {\r\n void recachePasswordPolicy(auth);\r\n }\r\n throw error;\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Sends a sign-in email link to the user with the specified email.\r\n *\r\n * @remarks\r\n * The sign-in operation has to always be completed in the app unlike other out of band email\r\n * actions (password reset and email verifications). This is because, at the end of the flow,\r\n * the user is expected to be signed in and their Auth state persisted within the app.\r\n *\r\n * To complete sign in with the email link, call {@link signInWithEmailLink} with the email\r\n * address and the email link supplied in the email sent to the user.\r\n *\r\n * @example\r\n * ```javascript\r\n * const actionCodeSettings = {\r\n * url: 'https://www.example.com/?email=user@example.com',\r\n * iOS: {\r\n * bundleId: 'com.example.ios'\r\n * },\r\n * android: {\r\n * packageName: 'com.example.android',\r\n * installApp: true,\r\n * minimumVersion: '12'\r\n * },\r\n * handleCodeInApp: true\r\n * };\r\n * await sendSignInLinkToEmail(auth, 'user@example.com', actionCodeSettings);\r\n * // Obtain emailLink from the user.\r\n * if(isSignInWithEmailLink(auth, emailLink)) {\r\n * await signInWithEmailLink(auth, 'user@example.com', emailLink);\r\n * }\r\n * ```\r\n *\r\n * @param authInternal - The {@link Auth} instance.\r\n * @param email - The user's email address.\r\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\r\n *\r\n * @public\r\n */\r\nasync function sendSignInLinkToEmail(auth, email, actionCodeSettings) {\r\n const authInternal = _castAuth(auth);\r\n const request = {\r\n requestType: \"EMAIL_SIGNIN\" /* ActionCodeOperation.EMAIL_SIGNIN */,\r\n email,\r\n clientType: \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */\r\n };\r\n function setActionCodeSettings(request, actionCodeSettings) {\r\n _assert(actionCodeSettings.handleCodeInApp, authInternal, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n if (actionCodeSettings) {\r\n _setActionCodeSettingsOnRequest(authInternal, request, actionCodeSettings);\r\n }\r\n }\r\n setActionCodeSettings(request, actionCodeSettings);\r\n await handleRecaptchaFlow(authInternal, request, \"getOobCode\" /* RecaptchaActionName.GET_OOB_CODE */, sendSignInLinkToEmail$1);\r\n}\r\n/**\r\n * Checks if an incoming link is a sign-in with email link suitable for {@link signInWithEmailLink}.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param emailLink - The link sent to the user's email address.\r\n *\r\n * @public\r\n */\r\nfunction isSignInWithEmailLink(auth, emailLink) {\r\n const actionCodeUrl = ActionCodeURL.parseLink(emailLink);\r\n return (actionCodeUrl === null || actionCodeUrl === void 0 ? void 0 : actionCodeUrl.operation) === \"EMAIL_SIGNIN\" /* ActionCodeOperation.EMAIL_SIGNIN */;\r\n}\r\n/**\r\n * Asynchronously signs in using an email and sign-in email link.\r\n *\r\n * @remarks\r\n * If no link is passed, the link is inferred from the current URL.\r\n *\r\n * Fails with an error if the email address is invalid or OTP in email link expires.\r\n *\r\n * This method is not supported by {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * Note: Confirm the link is a sign-in email link before calling this method firebase.auth.Auth.isSignInWithEmailLink.\r\n *\r\n * @example\r\n * ```javascript\r\n * const actionCodeSettings = {\r\n * url: 'https://www.example.com/?email=user@example.com',\r\n * iOS: {\r\n * bundleId: 'com.example.ios'\r\n * },\r\n * android: {\r\n * packageName: 'com.example.android',\r\n * installApp: true,\r\n * minimumVersion: '12'\r\n * },\r\n * handleCodeInApp: true\r\n * };\r\n * await sendSignInLinkToEmail(auth, 'user@example.com', actionCodeSettings);\r\n * // Obtain emailLink from the user.\r\n * if(isSignInWithEmailLink(auth, emailLink)) {\r\n * await signInWithEmailLink(auth, 'user@example.com', emailLink);\r\n * }\r\n * ```\r\n *\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param email - The user's email address.\r\n * @param emailLink - The link sent to the user's email address.\r\n *\r\n * @public\r\n */\r\nasync function signInWithEmailLink(auth, email, emailLink) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const authModular = getModularInstance(auth);\r\n const credential = EmailAuthProvider.credentialWithLink(email, emailLink || _getCurrentUrl());\r\n // Check if the tenant ID in the email link matches the tenant ID on Auth\r\n // instance.\r\n _assert(credential._tenantId === (authModular.tenantId || null), authModular, \"tenant-id-mismatch\" /* AuthErrorCode.TENANT_ID_MISMATCH */);\r\n return signInWithCredential(authModular, credential);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function createAuthUri(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:createAuthUri\" /* Endpoint.CREATE_AUTH_URI */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Gets the list of possible sign in methods for the given email address. This method returns an\r\n * empty list when\r\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}\r\n * is enabled, irrespective of the number of authentication methods available for the given email.\r\n *\r\n * @remarks\r\n * This is useful to differentiate methods of sign-in for the same provider, eg.\r\n * {@link EmailAuthProvider} which has 2 methods of sign-in,\r\n * {@link SignInMethod}.EMAIL_PASSWORD and\r\n * {@link SignInMethod}.EMAIL_LINK.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param email - The user's email address.\r\n *\r\n * Deprecated. Migrating off of this method is recommended as a security best-practice.\r\n * Learn more in the Identity Platform documentation for\r\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}.\r\n * @public\r\n */\r\nasync function fetchSignInMethodsForEmail(auth, email) {\r\n // createAuthUri returns an error if continue URI is not http or https.\r\n // For environments like Cordova, Chrome extensions, native frameworks, file\r\n // systems, etc, use http://localhost as continue URL.\r\n const continueUri = _isHttpOrHttps() ? _getCurrentUrl() : 'http://localhost';\r\n const request = {\r\n identifier: email,\r\n continueUri\r\n };\r\n const { signinMethods } = await createAuthUri(getModularInstance(auth), request);\r\n return signinMethods || [];\r\n}\r\n/**\r\n * Sends a verification email to a user.\r\n *\r\n * @remarks\r\n * The verification process is completed by calling {@link applyActionCode}.\r\n *\r\n * @example\r\n * ```javascript\r\n * const actionCodeSettings = {\r\n * url: 'https://www.example.com/?email=user@example.com',\r\n * iOS: {\r\n * bundleId: 'com.example.ios'\r\n * },\r\n * android: {\r\n * packageName: 'com.example.android',\r\n * installApp: true,\r\n * minimumVersion: '12'\r\n * },\r\n * handleCodeInApp: true\r\n * };\r\n * await sendEmailVerification(user, actionCodeSettings);\r\n * // Obtain code from the user.\r\n * await applyActionCode(auth, code);\r\n * ```\r\n *\r\n * @param user - The user.\r\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\r\n *\r\n * @public\r\n */\r\nasync function sendEmailVerification(user, actionCodeSettings) {\r\n const userInternal = getModularInstance(user);\r\n const idToken = await user.getIdToken();\r\n const request = {\r\n requestType: \"VERIFY_EMAIL\" /* ActionCodeOperation.VERIFY_EMAIL */,\r\n idToken\r\n };\r\n if (actionCodeSettings) {\r\n _setActionCodeSettingsOnRequest(userInternal.auth, request, actionCodeSettings);\r\n }\r\n const { email } = await sendEmailVerification$1(userInternal.auth, request);\r\n if (email !== user.email) {\r\n await user.reload();\r\n }\r\n}\r\n/**\r\n * Sends a verification email to a new email address.\r\n *\r\n * @remarks\r\n * The user's email will be updated to the new one after being verified.\r\n *\r\n * If you have a custom email action handler, you can complete the verification process by calling\r\n * {@link applyActionCode}.\r\n *\r\n * @example\r\n * ```javascript\r\n * const actionCodeSettings = {\r\n * url: 'https://www.example.com/?email=user@example.com',\r\n * iOS: {\r\n * bundleId: 'com.example.ios'\r\n * },\r\n * android: {\r\n * packageName: 'com.example.android',\r\n * installApp: true,\r\n * minimumVersion: '12'\r\n * },\r\n * handleCodeInApp: true\r\n * };\r\n * await verifyBeforeUpdateEmail(user, 'newemail@example.com', actionCodeSettings);\r\n * // Obtain code from the user.\r\n * await applyActionCode(auth, code);\r\n * ```\r\n *\r\n * @param user - The user.\r\n * @param newEmail - The new email address to be verified before update.\r\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\r\n *\r\n * @public\r\n */\r\nasync function verifyBeforeUpdateEmail(user, newEmail, actionCodeSettings) {\r\n const userInternal = getModularInstance(user);\r\n const idToken = await user.getIdToken();\r\n const request = {\r\n requestType: \"VERIFY_AND_CHANGE_EMAIL\" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */,\r\n idToken,\r\n newEmail\r\n };\r\n if (actionCodeSettings) {\r\n _setActionCodeSettingsOnRequest(userInternal.auth, request, actionCodeSettings);\r\n }\r\n const { email } = await verifyAndChangeEmail(userInternal.auth, request);\r\n if (email !== user.email) {\r\n // If the local copy of the email on user is outdated, reload the\r\n // user.\r\n await user.reload();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function updateProfile$1(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:update\" /* Endpoint.SET_ACCOUNT_INFO */, request);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Updates a user's profile data.\r\n *\r\n * @param user - The user.\r\n * @param profile - The profile's `displayName` and `photoURL` to update.\r\n *\r\n * @public\r\n */\r\nasync function updateProfile(user, { displayName, photoURL: photoUrl }) {\r\n if (displayName === undefined && photoUrl === undefined) {\r\n return;\r\n }\r\n const userInternal = getModularInstance(user);\r\n const idToken = await userInternal.getIdToken();\r\n const profileRequest = {\r\n idToken,\r\n displayName,\r\n photoUrl,\r\n returnSecureToken: true\r\n };\r\n const response = await _logoutIfInvalidated(userInternal, updateProfile$1(userInternal.auth, profileRequest));\r\n userInternal.displayName = response.displayName || null;\r\n userInternal.photoURL = response.photoUrl || null;\r\n // Update the password provider as well\r\n const passwordProvider = userInternal.providerData.find(({ providerId }) => providerId === \"password\" /* ProviderId.PASSWORD */);\r\n if (passwordProvider) {\r\n passwordProvider.displayName = userInternal.displayName;\r\n passwordProvider.photoURL = userInternal.photoURL;\r\n }\r\n await userInternal._updateTokensIfNecessary(response);\r\n}\r\n/**\r\n * Updates the user's email address.\r\n *\r\n * @remarks\r\n * An email will be sent to the original email address (if it was set) that allows to revoke the\r\n * email address change, in order to protect them from account hijacking.\r\n *\r\n * This method is not supported on any {@link User} signed in by {@link Auth} instances\r\n * created with a {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * Important: this is a security sensitive operation that requires the user to have recently signed\r\n * in. If this requirement isn't met, ask the user to authenticate again and then call\r\n * {@link reauthenticateWithCredential}.\r\n *\r\n * @param user - The user.\r\n * @param newEmail - The new email address.\r\n *\r\n * Throws \"auth/operation-not-allowed\" error when\r\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}\r\n * is enabled.\r\n * Deprecated - Use {@link verifyBeforeUpdateEmail} instead.\r\n *\r\n * @public\r\n */\r\nfunction updateEmail(user, newEmail) {\r\n const userInternal = getModularInstance(user);\r\n if (_isFirebaseServerApp(userInternal.auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(userInternal.auth));\r\n }\r\n return updateEmailOrPassword(userInternal, newEmail, null);\r\n}\r\n/**\r\n * Updates the user's password.\r\n *\r\n * @remarks\r\n * Important: this is a security sensitive operation that requires the user to have recently signed\r\n * in. If this requirement isn't met, ask the user to authenticate again and then call\r\n * {@link reauthenticateWithCredential}.\r\n *\r\n * @param user - The user.\r\n * @param newPassword - The new password.\r\n *\r\n * @public\r\n */\r\nfunction updatePassword(user, newPassword) {\r\n return updateEmailOrPassword(getModularInstance(user), null, newPassword);\r\n}\r\nasync function updateEmailOrPassword(user, email, password) {\r\n const { auth } = user;\r\n const idToken = await user.getIdToken();\r\n const request = {\r\n idToken,\r\n returnSecureToken: true\r\n };\r\n if (email) {\r\n request.email = email;\r\n }\r\n if (password) {\r\n request.password = password;\r\n }\r\n const response = await _logoutIfInvalidated(user, updateEmailPassword(auth, request));\r\n await user._updateTokensIfNecessary(response, /* reload */ true);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Parse the `AdditionalUserInfo` from the ID token response.\r\n *\r\n */\r\nfunction _fromIdTokenResponse(idTokenResponse) {\r\n var _a, _b;\r\n if (!idTokenResponse) {\r\n return null;\r\n }\r\n const { providerId } = idTokenResponse;\r\n const profile = idTokenResponse.rawUserInfo\r\n ? JSON.parse(idTokenResponse.rawUserInfo)\r\n : {};\r\n const isNewUser = idTokenResponse.isNewUser ||\r\n idTokenResponse.kind === \"identitytoolkit#SignupNewUserResponse\" /* IdTokenResponseKind.SignupNewUser */;\r\n if (!providerId && (idTokenResponse === null || idTokenResponse === void 0 ? void 0 : idTokenResponse.idToken)) {\r\n const signInProvider = (_b = (_a = _parseToken(idTokenResponse.idToken)) === null || _a === void 0 ? void 0 : _a.firebase) === null || _b === void 0 ? void 0 : _b['sign_in_provider'];\r\n if (signInProvider) {\r\n const filteredProviderId = signInProvider !== \"anonymous\" /* ProviderId.ANONYMOUS */ &&\r\n signInProvider !== \"custom\" /* ProviderId.CUSTOM */\r\n ? signInProvider\r\n : null;\r\n // Uses generic class in accordance with the legacy SDK.\r\n return new GenericAdditionalUserInfo(isNewUser, filteredProviderId);\r\n }\r\n }\r\n if (!providerId) {\r\n return null;\r\n }\r\n switch (providerId) {\r\n case \"facebook.com\" /* ProviderId.FACEBOOK */:\r\n return new FacebookAdditionalUserInfo(isNewUser, profile);\r\n case \"github.com\" /* ProviderId.GITHUB */:\r\n return new GithubAdditionalUserInfo(isNewUser, profile);\r\n case \"google.com\" /* ProviderId.GOOGLE */:\r\n return new GoogleAdditionalUserInfo(isNewUser, profile);\r\n case \"twitter.com\" /* ProviderId.TWITTER */:\r\n return new TwitterAdditionalUserInfo(isNewUser, profile, idTokenResponse.screenName || null);\r\n case \"custom\" /* ProviderId.CUSTOM */:\r\n case \"anonymous\" /* ProviderId.ANONYMOUS */:\r\n return new GenericAdditionalUserInfo(isNewUser, null);\r\n default:\r\n return new GenericAdditionalUserInfo(isNewUser, providerId, profile);\r\n }\r\n}\r\nclass GenericAdditionalUserInfo {\r\n constructor(isNewUser, providerId, profile = {}) {\r\n this.isNewUser = isNewUser;\r\n this.providerId = providerId;\r\n this.profile = profile;\r\n }\r\n}\r\nclass FederatedAdditionalUserInfoWithUsername extends GenericAdditionalUserInfo {\r\n constructor(isNewUser, providerId, profile, username) {\r\n super(isNewUser, providerId, profile);\r\n this.username = username;\r\n }\r\n}\r\nclass FacebookAdditionalUserInfo extends GenericAdditionalUserInfo {\r\n constructor(isNewUser, profile) {\r\n super(isNewUser, \"facebook.com\" /* ProviderId.FACEBOOK */, profile);\r\n }\r\n}\r\nclass GithubAdditionalUserInfo extends FederatedAdditionalUserInfoWithUsername {\r\n constructor(isNewUser, profile) {\r\n super(isNewUser, \"github.com\" /* ProviderId.GITHUB */, profile, typeof (profile === null || profile === void 0 ? void 0 : profile.login) === 'string' ? profile === null || profile === void 0 ? void 0 : profile.login : null);\r\n }\r\n}\r\nclass GoogleAdditionalUserInfo extends GenericAdditionalUserInfo {\r\n constructor(isNewUser, profile) {\r\n super(isNewUser, \"google.com\" /* ProviderId.GOOGLE */, profile);\r\n }\r\n}\r\nclass TwitterAdditionalUserInfo extends FederatedAdditionalUserInfoWithUsername {\r\n constructor(isNewUser, profile, screenName) {\r\n super(isNewUser, \"twitter.com\" /* ProviderId.TWITTER */, profile, screenName);\r\n }\r\n}\r\n/**\r\n * Extracts provider specific {@link AdditionalUserInfo} for the given credential.\r\n *\r\n * @param userCredential - The user credential.\r\n *\r\n * @public\r\n */\r\nfunction getAdditionalUserInfo(userCredential) {\r\n const { user, _tokenResponse } = userCredential;\r\n if (user.isAnonymous && !_tokenResponse) {\r\n // Handle the special case where signInAnonymously() gets called twice.\r\n // No network call is made so there's nothing to actually fill this in\r\n return {\r\n providerId: null,\r\n isNewUser: false,\r\n profile: null\r\n };\r\n }\r\n return _fromIdTokenResponse(_tokenResponse);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Non-optional auth methods.\r\n/**\r\n * Changes the type of persistence on the {@link Auth} instance for the currently saved\r\n * `Auth` session and applies this type of persistence for future sign-in requests, including\r\n * sign-in with redirect requests.\r\n *\r\n * @remarks\r\n * This makes it easy for a user signing in to specify whether their session should be\r\n * remembered or not. It also makes it easier to never persist the `Auth` state for applications\r\n * that are shared by other users or have sensitive data.\r\n *\r\n * This method does not work in a Node.js environment or with {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * setPersistence(auth, browserSessionPersistence);\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param persistence - The {@link Persistence} to use.\r\n * @returns A `Promise` that resolves once the persistence change has completed\r\n *\r\n * @public\r\n */\r\nfunction setPersistence(auth, persistence) {\r\n return getModularInstance(auth).setPersistence(persistence);\r\n}\r\n/**\r\n * Loads the reCAPTCHA configuration into the `Auth` instance.\r\n *\r\n * @remarks\r\n * This will load the reCAPTCHA config, which indicates whether the reCAPTCHA\r\n * verification flow should be triggered for each auth provider, into the\r\n * current Auth session.\r\n *\r\n * If initializeRecaptchaConfig() is not invoked, the auth flow will always start\r\n * without reCAPTCHA verification. If the provider is configured to require reCAPTCHA\r\n * verification, the SDK will transparently load the reCAPTCHA config and restart the\r\n * auth flows.\r\n *\r\n * Thus, by calling this optional method, you will reduce the latency of future auth flows.\r\n * Loading the reCAPTCHA config early will also enhance the signal collected by reCAPTCHA.\r\n *\r\n * This method does not work in a Node.js environment.\r\n *\r\n * @example\r\n * ```javascript\r\n * initializeRecaptchaConfig(auth);\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n *\r\n * @public\r\n */\r\nfunction initializeRecaptchaConfig(auth) {\r\n return _initializeRecaptchaConfig(auth);\r\n}\r\n/**\r\n * Validates the password against the password policy configured for the project or tenant.\r\n *\r\n * @remarks\r\n * If no tenant ID is set on the `Auth` instance, then this method will use the password\r\n * policy configured for the project. Otherwise, this method will use the policy configured\r\n * for the tenant. If a password policy has not been configured, then the default policy\r\n * configured for all projects will be used.\r\n *\r\n * If an auth flow fails because a submitted password does not meet the password policy\r\n * requirements and this method has previously been called, then this method will use the\r\n * most recent policy available when called again.\r\n *\r\n * @example\r\n * ```javascript\r\n * validatePassword(auth, 'some-password');\r\n * ```\r\n *\r\n * @param auth The {@link Auth} instance.\r\n * @param password The password to validate.\r\n *\r\n * @public\r\n */\r\nasync function validatePassword(auth, password) {\r\n const authInternal = _castAuth(auth);\r\n return authInternal.validatePassword(password);\r\n}\r\n/**\r\n * Adds an observer for changes to the signed-in user's ID token.\r\n *\r\n * @remarks\r\n * This includes sign-in, sign-out, and token refresh events.\r\n * This will not be triggered automatically upon ID token expiration. Use {@link User.getIdToken} to refresh the ID token.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param nextOrObserver - callback triggered on change.\r\n * @param error - Deprecated. This callback is never triggered. Errors\r\n * on signing in/out can be caught in promises returned from\r\n * sign-in/sign-out functions.\r\n * @param completed - Deprecated. This callback is never triggered.\r\n *\r\n * @public\r\n */\r\nfunction onIdTokenChanged(auth, nextOrObserver, error, completed) {\r\n return getModularInstance(auth).onIdTokenChanged(nextOrObserver, error, completed);\r\n}\r\n/**\r\n * Adds a blocking callback that runs before an auth state change\r\n * sets a new user.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param callback - callback triggered before new user value is set.\r\n * If this throws, it blocks the user from being set.\r\n * @param onAbort - callback triggered if a later `beforeAuthStateChanged()`\r\n * callback throws, allowing you to undo any side effects.\r\n */\r\nfunction beforeAuthStateChanged(auth, callback, onAbort) {\r\n return getModularInstance(auth).beforeAuthStateChanged(callback, onAbort);\r\n}\r\n/**\r\n * Adds an observer for changes to the user's sign-in state.\r\n *\r\n * @remarks\r\n * To keep the old behavior, see {@link onIdTokenChanged}.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param nextOrObserver - callback triggered on change.\r\n * @param error - Deprecated. This callback is never triggered. Errors\r\n * on signing in/out can be caught in promises returned from\r\n * sign-in/sign-out functions.\r\n * @param completed - Deprecated. This callback is never triggered.\r\n *\r\n * @public\r\n */\r\nfunction onAuthStateChanged(auth, nextOrObserver, error, completed) {\r\n return getModularInstance(auth).onAuthStateChanged(nextOrObserver, error, completed);\r\n}\r\n/**\r\n * Sets the current language to the default device/browser preference.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n *\r\n * @public\r\n */\r\nfunction useDeviceLanguage(auth) {\r\n getModularInstance(auth).useDeviceLanguage();\r\n}\r\n/**\r\n * Asynchronously sets the provided user as {@link Auth.currentUser} on the\r\n * {@link Auth} instance.\r\n *\r\n * @remarks\r\n * A new instance copy of the user provided will be made and set as currentUser.\r\n *\r\n * This will trigger {@link onAuthStateChanged} and {@link onIdTokenChanged} listeners\r\n * like other sign in methods.\r\n *\r\n * The operation fails with an error if the user to be updated belongs to a different Firebase\r\n * project.\r\n *\r\n * This method is not supported by {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param user - The new {@link User}.\r\n *\r\n * @public\r\n */\r\nfunction updateCurrentUser(auth, user) {\r\n return getModularInstance(auth).updateCurrentUser(user);\r\n}\r\n/**\r\n * Signs out the current user.\r\n *\r\n * @remarks\r\n * This method is not supported by {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n *\r\n * @public\r\n */\r\nfunction signOut(auth) {\r\n return getModularInstance(auth).signOut();\r\n}\r\n/**\r\n * Revokes the given access token. Currently only supports Apple OAuth access tokens.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param token - The Apple OAuth access token.\r\n *\r\n * @public\r\n */\r\nfunction revokeAccessToken(auth, token) {\r\n const authInternal = _castAuth(auth);\r\n return authInternal.revokeAccessToken(token);\r\n}\r\n/**\r\n * Deletes and signs out the user.\r\n *\r\n * @remarks\r\n * Important: this is a security-sensitive operation that requires the user to have recently\r\n * signed in. If this requirement isn't met, ask the user to authenticate again and then call\r\n * {@link reauthenticateWithCredential}.\r\n *\r\n * @param user - The user.\r\n *\r\n * @public\r\n */\r\nasync function deleteUser(user) {\r\n return getModularInstance(user).delete();\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass MultiFactorSessionImpl {\r\n constructor(type, credential, user) {\r\n this.type = type;\r\n this.credential = credential;\r\n this.user = user;\r\n }\r\n static _fromIdtoken(idToken, user) {\r\n return new MultiFactorSessionImpl(\"enroll\" /* MultiFactorSessionType.ENROLL */, idToken, user);\r\n }\r\n static _fromMfaPendingCredential(mfaPendingCredential) {\r\n return new MultiFactorSessionImpl(\"signin\" /* MultiFactorSessionType.SIGN_IN */, mfaPendingCredential);\r\n }\r\n toJSON() {\r\n const key = this.type === \"enroll\" /* MultiFactorSessionType.ENROLL */\r\n ? 'idToken'\r\n : 'pendingCredential';\r\n return {\r\n multiFactorSession: {\r\n [key]: this.credential\r\n }\r\n };\r\n }\r\n static fromJSON(obj) {\r\n var _a, _b;\r\n if (obj === null || obj === void 0 ? void 0 : obj.multiFactorSession) {\r\n if ((_a = obj.multiFactorSession) === null || _a === void 0 ? void 0 : _a.pendingCredential) {\r\n return MultiFactorSessionImpl._fromMfaPendingCredential(obj.multiFactorSession.pendingCredential);\r\n }\r\n else if ((_b = obj.multiFactorSession) === null || _b === void 0 ? void 0 : _b.idToken) {\r\n return MultiFactorSessionImpl._fromIdtoken(obj.multiFactorSession.idToken);\r\n }\r\n }\r\n return null;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass MultiFactorResolverImpl {\r\n constructor(session, hints, signInResolver) {\r\n this.session = session;\r\n this.hints = hints;\r\n this.signInResolver = signInResolver;\r\n }\r\n /** @internal */\r\n static _fromError(authExtern, error) {\r\n const auth = _castAuth(authExtern);\r\n const serverResponse = error.customData._serverResponse;\r\n const hints = (serverResponse.mfaInfo || []).map(enrollment => MultiFactorInfoImpl._fromServerResponse(auth, enrollment));\r\n _assert(serverResponse.mfaPendingCredential, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const session = MultiFactorSessionImpl._fromMfaPendingCredential(serverResponse.mfaPendingCredential);\r\n return new MultiFactorResolverImpl(session, hints, async (assertion) => {\r\n const mfaResponse = await assertion._process(auth, session);\r\n // Clear out the unneeded fields from the old login response\r\n delete serverResponse.mfaInfo;\r\n delete serverResponse.mfaPendingCredential;\r\n // Use in the new token & refresh token in the old response\r\n const idTokenResponse = Object.assign(Object.assign({}, serverResponse), { idToken: mfaResponse.idToken, refreshToken: mfaResponse.refreshToken });\r\n // TODO: we should collapse this switch statement into UserCredentialImpl._forOperation and have it support the SIGN_IN case\r\n switch (error.operationType) {\r\n case \"signIn\" /* OperationType.SIGN_IN */:\r\n const userCredential = await UserCredentialImpl._fromIdTokenResponse(auth, error.operationType, idTokenResponse);\r\n await auth._updateCurrentUser(userCredential.user);\r\n return userCredential;\r\n case \"reauthenticate\" /* OperationType.REAUTHENTICATE */:\r\n _assert(error.user, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return UserCredentialImpl._forOperation(error.user, error.operationType, idTokenResponse);\r\n default:\r\n _fail(auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }\r\n });\r\n }\r\n async resolveSignIn(assertionExtern) {\r\n const assertion = assertionExtern;\r\n return this.signInResolver(assertion);\r\n }\r\n}\r\n/**\r\n * Provides a {@link MultiFactorResolver} suitable for completion of a\r\n * multi-factor flow.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param error - The {@link MultiFactorError} raised during a sign-in, or\r\n * reauthentication operation.\r\n *\r\n * @public\r\n */\r\nfunction getMultiFactorResolver(auth, error) {\r\n var _a;\r\n const authModular = getModularInstance(auth);\r\n const errorInternal = error;\r\n _assert(error.customData.operationType, authModular, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n _assert((_a = errorInternal.customData._serverResponse) === null || _a === void 0 ? void 0 : _a.mfaPendingCredential, authModular, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n return MultiFactorResolverImpl._fromError(authModular, errorInternal);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction startEnrollPhoneMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaEnrollment:start\" /* Endpoint.START_MFA_ENROLLMENT */, _addTidIfNecessary(auth, request));\r\n}\r\nfunction finalizeEnrollPhoneMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaEnrollment:finalize\" /* Endpoint.FINALIZE_MFA_ENROLLMENT */, _addTidIfNecessary(auth, request));\r\n}\r\nfunction startEnrollTotpMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaEnrollment:start\" /* Endpoint.START_MFA_ENROLLMENT */, _addTidIfNecessary(auth, request));\r\n}\r\nfunction finalizeEnrollTotpMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaEnrollment:finalize\" /* Endpoint.FINALIZE_MFA_ENROLLMENT */, _addTidIfNecessary(auth, request));\r\n}\r\nfunction withdrawMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaEnrollment:withdraw\" /* Endpoint.WITHDRAW_MFA */, _addTidIfNecessary(auth, request));\r\n}\n\nclass MultiFactorUserImpl {\r\n constructor(user) {\r\n this.user = user;\r\n this.enrolledFactors = [];\r\n user._onReload(userInfo => {\r\n if (userInfo.mfaInfo) {\r\n this.enrolledFactors = userInfo.mfaInfo.map(enrollment => MultiFactorInfoImpl._fromServerResponse(user.auth, enrollment));\r\n }\r\n });\r\n }\r\n static _fromUser(user) {\r\n return new MultiFactorUserImpl(user);\r\n }\r\n async getSession() {\r\n return MultiFactorSessionImpl._fromIdtoken(await this.user.getIdToken(), this.user);\r\n }\r\n async enroll(assertionExtern, displayName) {\r\n const assertion = assertionExtern;\r\n const session = (await this.getSession());\r\n const finalizeMfaResponse = await _logoutIfInvalidated(this.user, assertion._process(this.user.auth, session, displayName));\r\n // New tokens will be issued after enrollment of the new second factors.\r\n // They need to be updated on the user.\r\n await this.user._updateTokensIfNecessary(finalizeMfaResponse);\r\n // The user needs to be reloaded to get the new multi-factor information\r\n // from server. USER_RELOADED event will be triggered and `enrolledFactors`\r\n // will be updated.\r\n return this.user.reload();\r\n }\r\n async unenroll(infoOrUid) {\r\n const mfaEnrollmentId = typeof infoOrUid === 'string' ? infoOrUid : infoOrUid.uid;\r\n const idToken = await this.user.getIdToken();\r\n try {\r\n const idTokenResponse = await _logoutIfInvalidated(this.user, withdrawMfa(this.user.auth, {\r\n idToken,\r\n mfaEnrollmentId\r\n }));\r\n // Remove the second factor from the user's list.\r\n this.enrolledFactors = this.enrolledFactors.filter(({ uid }) => uid !== mfaEnrollmentId);\r\n // Depending on whether the backend decided to revoke the user's session,\r\n // the tokenResponse may be empty. If the tokens were not updated (and they\r\n // are now invalid), reloading the user will discover this and invalidate\r\n // the user's state accordingly.\r\n await this.user._updateTokensIfNecessary(idTokenResponse);\r\n await this.user.reload();\r\n }\r\n catch (e) {\r\n throw e;\r\n }\r\n }\r\n}\r\nconst multiFactorUserCache = new WeakMap();\r\n/**\r\n * The {@link MultiFactorUser} corresponding to the user.\r\n *\r\n * @remarks\r\n * This is used to access all multi-factor properties and operations related to the user.\r\n *\r\n * @param user - The user.\r\n *\r\n * @public\r\n */\r\nfunction multiFactor(user) {\r\n const userModular = getModularInstance(user);\r\n if (!multiFactorUserCache.has(userModular)) {\r\n multiFactorUserCache.set(userModular, MultiFactorUserImpl._fromUser(userModular));\r\n }\r\n return multiFactorUserCache.get(userModular);\r\n}\n\nconst STORAGE_AVAILABLE_KEY = '__sak';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// There are two different browser persistence types: local and session.\r\n// Both have the same implementation but use a different underlying storage\r\n// object.\r\nclass BrowserPersistenceClass {\r\n constructor(storageRetriever, type) {\r\n this.storageRetriever = storageRetriever;\r\n this.type = type;\r\n }\r\n _isAvailable() {\r\n try {\r\n if (!this.storage) {\r\n return Promise.resolve(false);\r\n }\r\n this.storage.setItem(STORAGE_AVAILABLE_KEY, '1');\r\n this.storage.removeItem(STORAGE_AVAILABLE_KEY);\r\n return Promise.resolve(true);\r\n }\r\n catch (_a) {\r\n return Promise.resolve(false);\r\n }\r\n }\r\n _set(key, value) {\r\n this.storage.setItem(key, JSON.stringify(value));\r\n return Promise.resolve();\r\n }\r\n _get(key) {\r\n const json = this.storage.getItem(key);\r\n return Promise.resolve(json ? JSON.parse(json) : null);\r\n }\r\n _remove(key) {\r\n this.storage.removeItem(key);\r\n return Promise.resolve();\r\n }\r\n get storage() {\r\n return this.storageRetriever();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// The polling period in case events are not supported\r\nconst _POLLING_INTERVAL_MS$1 = 1000;\r\n// The IE 10 localStorage cross tab synchronization delay in milliseconds\r\nconst IE10_LOCAL_STORAGE_SYNC_DELAY = 10;\r\nclass BrowserLocalPersistence extends BrowserPersistenceClass {\r\n constructor() {\r\n super(() => window.localStorage, \"LOCAL\" /* PersistenceType.LOCAL */);\r\n this.boundEventHandler = (event, poll) => this.onStorageEvent(event, poll);\r\n this.listeners = {};\r\n this.localCache = {};\r\n // setTimeout return value is platform specific\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n this.pollTimer = null;\r\n // Whether to use polling instead of depending on window events\r\n this.fallbackToPolling = _isMobileBrowser();\r\n this._shouldAllowMigration = true;\r\n }\r\n forAllChangedKeys(cb) {\r\n // Check all keys with listeners on them.\r\n for (const key of Object.keys(this.listeners)) {\r\n // Get value from localStorage.\r\n const newValue = this.storage.getItem(key);\r\n const oldValue = this.localCache[key];\r\n // If local map value does not match, trigger listener with storage event.\r\n // Differentiate this simulated event from the real storage event.\r\n if (newValue !== oldValue) {\r\n cb(key, oldValue, newValue);\r\n }\r\n }\r\n }\r\n onStorageEvent(event, poll = false) {\r\n // Key would be null in some situations, like when localStorage is cleared\r\n if (!event.key) {\r\n this.forAllChangedKeys((key, _oldValue, newValue) => {\r\n this.notifyListeners(key, newValue);\r\n });\r\n return;\r\n }\r\n const key = event.key;\r\n // Check the mechanism how this event was detected.\r\n // The first event will dictate the mechanism to be used.\r\n if (poll) {\r\n // Environment detects storage changes via polling.\r\n // Remove storage event listener to prevent possible event duplication.\r\n this.detachListener();\r\n }\r\n else {\r\n // Environment detects storage changes via storage event listener.\r\n // Remove polling listener to prevent possible event duplication.\r\n this.stopPolling();\r\n }\r\n const triggerListeners = () => {\r\n // Keep local map up to date in case storage event is triggered before\r\n // poll.\r\n const storedValue = this.storage.getItem(key);\r\n if (!poll && this.localCache[key] === storedValue) {\r\n // Real storage event which has already been detected, do nothing.\r\n // This seems to trigger in some IE browsers for some reason.\r\n return;\r\n }\r\n this.notifyListeners(key, storedValue);\r\n };\r\n const storedValue = this.storage.getItem(key);\r\n if (_isIE10() &&\r\n storedValue !== event.newValue &&\r\n event.newValue !== event.oldValue) {\r\n // IE 10 has this weird bug where a storage event would trigger with the\r\n // correct key, oldValue and newValue but localStorage.getItem(key) does\r\n // not yield the updated value until a few milliseconds. This ensures\r\n // this recovers from that situation.\r\n setTimeout(triggerListeners, IE10_LOCAL_STORAGE_SYNC_DELAY);\r\n }\r\n else {\r\n triggerListeners();\r\n }\r\n }\r\n notifyListeners(key, value) {\r\n this.localCache[key] = value;\r\n const listeners = this.listeners[key];\r\n if (listeners) {\r\n for (const listener of Array.from(listeners)) {\r\n listener(value ? JSON.parse(value) : value);\r\n }\r\n }\r\n }\r\n startPolling() {\r\n this.stopPolling();\r\n this.pollTimer = setInterval(() => {\r\n this.forAllChangedKeys((key, oldValue, newValue) => {\r\n this.onStorageEvent(new StorageEvent('storage', {\r\n key,\r\n oldValue,\r\n newValue\r\n }), \r\n /* poll */ true);\r\n });\r\n }, _POLLING_INTERVAL_MS$1);\r\n }\r\n stopPolling() {\r\n if (this.pollTimer) {\r\n clearInterval(this.pollTimer);\r\n this.pollTimer = null;\r\n }\r\n }\r\n attachListener() {\r\n window.addEventListener('storage', this.boundEventHandler);\r\n }\r\n detachListener() {\r\n window.removeEventListener('storage', this.boundEventHandler);\r\n }\r\n _addListener(key, listener) {\r\n if (Object.keys(this.listeners).length === 0) {\r\n // Whether browser can detect storage event when it had already been pushed to the background.\r\n // This may happen in some mobile browsers. A localStorage change in the foreground window\r\n // will not be detected in the background window via the storage event.\r\n // This was detected in iOS 7.x mobile browsers\r\n if (this.fallbackToPolling) {\r\n this.startPolling();\r\n }\r\n else {\r\n this.attachListener();\r\n }\r\n }\r\n if (!this.listeners[key]) {\r\n this.listeners[key] = new Set();\r\n // Populate the cache to avoid spuriously triggering on first poll.\r\n this.localCache[key] = this.storage.getItem(key);\r\n }\r\n this.listeners[key].add(listener);\r\n }\r\n _removeListener(key, listener) {\r\n if (this.listeners[key]) {\r\n this.listeners[key].delete(listener);\r\n if (this.listeners[key].size === 0) {\r\n delete this.listeners[key];\r\n }\r\n }\r\n if (Object.keys(this.listeners).length === 0) {\r\n this.detachListener();\r\n this.stopPolling();\r\n }\r\n }\r\n // Update local cache on base operations:\r\n async _set(key, value) {\r\n await super._set(key, value);\r\n this.localCache[key] = JSON.stringify(value);\r\n }\r\n async _get(key) {\r\n const value = await super._get(key);\r\n this.localCache[key] = JSON.stringify(value);\r\n return value;\r\n }\r\n async _remove(key) {\r\n await super._remove(key);\r\n delete this.localCache[key];\r\n }\r\n}\r\nBrowserLocalPersistence.type = 'LOCAL';\r\n/**\r\n * An implementation of {@link Persistence} of type `LOCAL` using `localStorage`\r\n * for the underlying storage.\r\n *\r\n * @public\r\n */\r\nconst browserLocalPersistence = BrowserLocalPersistence;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass BrowserSessionPersistence extends BrowserPersistenceClass {\r\n constructor() {\r\n super(() => window.sessionStorage, \"SESSION\" /* PersistenceType.SESSION */);\r\n }\r\n _addListener(_key, _listener) {\r\n // Listeners are not supported for session storage since it cannot be shared across windows\r\n return;\r\n }\r\n _removeListener(_key, _listener) {\r\n // Listeners are not supported for session storage since it cannot be shared across windows\r\n return;\r\n }\r\n}\r\nBrowserSessionPersistence.type = 'SESSION';\r\n/**\r\n * An implementation of {@link Persistence} of `SESSION` using `sessionStorage`\r\n * for the underlying storage.\r\n *\r\n * @public\r\n */\r\nconst browserSessionPersistence = BrowserSessionPersistence;\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Shim for Promise.allSettled, note the slightly different format of `fulfilled` vs `status`.\r\n *\r\n * @param promises - Array of promises to wait on.\r\n */\r\nfunction _allSettled(promises) {\r\n return Promise.all(promises.map(async (promise) => {\r\n try {\r\n const value = await promise;\r\n return {\r\n fulfilled: true,\r\n value\r\n };\r\n }\r\n catch (reason) {\r\n return {\r\n fulfilled: false,\r\n reason\r\n };\r\n }\r\n }));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Interface class for receiving messages.\r\n *\r\n */\r\nclass Receiver {\r\n constructor(eventTarget) {\r\n this.eventTarget = eventTarget;\r\n this.handlersMap = {};\r\n this.boundEventHandler = this.handleEvent.bind(this);\r\n }\r\n /**\r\n * Obtain an instance of a Receiver for a given event target, if none exists it will be created.\r\n *\r\n * @param eventTarget - An event target (such as window or self) through which the underlying\r\n * messages will be received.\r\n */\r\n static _getInstance(eventTarget) {\r\n // The results are stored in an array since objects can't be keys for other\r\n // objects. In addition, setting a unique property on an event target as a\r\n // hash map key may not be allowed due to CORS restrictions.\r\n const existingInstance = this.receivers.find(receiver => receiver.isListeningto(eventTarget));\r\n if (existingInstance) {\r\n return existingInstance;\r\n }\r\n const newInstance = new Receiver(eventTarget);\r\n this.receivers.push(newInstance);\r\n return newInstance;\r\n }\r\n isListeningto(eventTarget) {\r\n return this.eventTarget === eventTarget;\r\n }\r\n /**\r\n * Fans out a MessageEvent to the appropriate listeners.\r\n *\r\n * @remarks\r\n * Sends an {@link Status.ACK} upon receipt and a {@link Status.DONE} once all handlers have\r\n * finished processing.\r\n *\r\n * @param event - The MessageEvent.\r\n *\r\n */\r\n async handleEvent(event) {\r\n const messageEvent = event;\r\n const { eventId, eventType, data } = messageEvent.data;\r\n const handlers = this.handlersMap[eventType];\r\n if (!(handlers === null || handlers === void 0 ? void 0 : handlers.size)) {\r\n return;\r\n }\r\n messageEvent.ports[0].postMessage({\r\n status: \"ack\" /* _Status.ACK */,\r\n eventId,\r\n eventType\r\n });\r\n const promises = Array.from(handlers).map(async (handler) => handler(messageEvent.origin, data));\r\n const response = await _allSettled(promises);\r\n messageEvent.ports[0].postMessage({\r\n status: \"done\" /* _Status.DONE */,\r\n eventId,\r\n eventType,\r\n response\r\n });\r\n }\r\n /**\r\n * Subscribe an event handler for a particular event.\r\n *\r\n * @param eventType - Event name to subscribe to.\r\n * @param eventHandler - The event handler which should receive the events.\r\n *\r\n */\r\n _subscribe(eventType, eventHandler) {\r\n if (Object.keys(this.handlersMap).length === 0) {\r\n this.eventTarget.addEventListener('message', this.boundEventHandler);\r\n }\r\n if (!this.handlersMap[eventType]) {\r\n this.handlersMap[eventType] = new Set();\r\n }\r\n this.handlersMap[eventType].add(eventHandler);\r\n }\r\n /**\r\n * Unsubscribe an event handler from a particular event.\r\n *\r\n * @param eventType - Event name to unsubscribe from.\r\n * @param eventHandler - Optional event handler, if none provided, unsubscribe all handlers on this event.\r\n *\r\n */\r\n _unsubscribe(eventType, eventHandler) {\r\n if (this.handlersMap[eventType] && eventHandler) {\r\n this.handlersMap[eventType].delete(eventHandler);\r\n }\r\n if (!eventHandler || this.handlersMap[eventType].size === 0) {\r\n delete this.handlersMap[eventType];\r\n }\r\n if (Object.keys(this.handlersMap).length === 0) {\r\n this.eventTarget.removeEventListener('message', this.boundEventHandler);\r\n }\r\n }\r\n}\r\nReceiver.receivers = [];\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _generateEventId(prefix = '', digits = 10) {\r\n let random = '';\r\n for (let i = 0; i < digits; i++) {\r\n random += Math.floor(Math.random() * 10);\r\n }\r\n return prefix + random;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Interface for sending messages and waiting for a completion response.\r\n *\r\n */\r\nclass Sender {\r\n constructor(target) {\r\n this.target = target;\r\n this.handlers = new Set();\r\n }\r\n /**\r\n * Unsubscribe the handler and remove it from our tracking Set.\r\n *\r\n * @param handler - The handler to unsubscribe.\r\n */\r\n removeMessageHandler(handler) {\r\n if (handler.messageChannel) {\r\n handler.messageChannel.port1.removeEventListener('message', handler.onMessage);\r\n handler.messageChannel.port1.close();\r\n }\r\n this.handlers.delete(handler);\r\n }\r\n /**\r\n * Send a message to the Receiver located at {@link target}.\r\n *\r\n * @remarks\r\n * We'll first wait a bit for an ACK , if we get one we will wait significantly longer until the\r\n * receiver has had a chance to fully process the event.\r\n *\r\n * @param eventType - Type of event to send.\r\n * @param data - The payload of the event.\r\n * @param timeout - Timeout for waiting on an ACK from the receiver.\r\n *\r\n * @returns An array of settled promises from all the handlers that were listening on the receiver.\r\n */\r\n async _send(eventType, data, timeout = 50 /* _TimeoutDuration.ACK */) {\r\n const messageChannel = typeof MessageChannel !== 'undefined' ? new MessageChannel() : null;\r\n if (!messageChannel) {\r\n throw new Error(\"connection_unavailable\" /* _MessageError.CONNECTION_UNAVAILABLE */);\r\n }\r\n // Node timers and browser timers return fundamentally different types.\r\n // We don't actually care what the value is but TS won't accept unknown and\r\n // we can't cast properly in both environments.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n let completionTimer;\r\n let handler;\r\n return new Promise((resolve, reject) => {\r\n const eventId = _generateEventId('', 20);\r\n messageChannel.port1.start();\r\n const ackTimer = setTimeout(() => {\r\n reject(new Error(\"unsupported_event\" /* _MessageError.UNSUPPORTED_EVENT */));\r\n }, timeout);\r\n handler = {\r\n messageChannel,\r\n onMessage(event) {\r\n const messageEvent = event;\r\n if (messageEvent.data.eventId !== eventId) {\r\n return;\r\n }\r\n switch (messageEvent.data.status) {\r\n case \"ack\" /* _Status.ACK */:\r\n // The receiver should ACK first.\r\n clearTimeout(ackTimer);\r\n completionTimer = setTimeout(() => {\r\n reject(new Error(\"timeout\" /* _MessageError.TIMEOUT */));\r\n }, 3000 /* _TimeoutDuration.COMPLETION */);\r\n break;\r\n case \"done\" /* _Status.DONE */:\r\n // Once the receiver's handlers are finished we will get the results.\r\n clearTimeout(completionTimer);\r\n resolve(messageEvent.data.response);\r\n break;\r\n default:\r\n clearTimeout(ackTimer);\r\n clearTimeout(completionTimer);\r\n reject(new Error(\"invalid_response\" /* _MessageError.INVALID_RESPONSE */));\r\n break;\r\n }\r\n }\r\n };\r\n this.handlers.add(handler);\r\n messageChannel.port1.addEventListener('message', handler.onMessage);\r\n this.target.postMessage({\r\n eventType,\r\n eventId,\r\n data\r\n }, [messageChannel.port2]);\r\n }).finally(() => {\r\n if (handler) {\r\n this.removeMessageHandler(handler);\r\n }\r\n });\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Lazy accessor for window, since the compat layer won't tree shake this out,\r\n * we need to make sure not to mess with window unless we have to\r\n */\r\nfunction _window() {\r\n return window;\r\n}\r\nfunction _setWindowLocation(url) {\r\n _window().location.href = url;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _isWorker() {\r\n return (typeof _window()['WorkerGlobalScope'] !== 'undefined' &&\r\n typeof _window()['importScripts'] === 'function');\r\n}\r\nasync function _getActiveServiceWorker() {\r\n if (!(navigator === null || navigator === void 0 ? void 0 : navigator.serviceWorker)) {\r\n return null;\r\n }\r\n try {\r\n const registration = await navigator.serviceWorker.ready;\r\n return registration.active;\r\n }\r\n catch (_a) {\r\n return null;\r\n }\r\n}\r\nfunction _getServiceWorkerController() {\r\n var _a;\r\n return ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.serviceWorker) === null || _a === void 0 ? void 0 : _a.controller) || null;\r\n}\r\nfunction _getWorkerGlobalScope() {\r\n return _isWorker() ? self : null;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DB_NAME = 'firebaseLocalStorageDb';\r\nconst DB_VERSION = 1;\r\nconst DB_OBJECTSTORE_NAME = 'firebaseLocalStorage';\r\nconst DB_DATA_KEYPATH = 'fbase_key';\r\n/**\r\n * Promise wrapper for IDBRequest\r\n *\r\n * Unfortunately we can't cleanly extend Promise since promises are not callable in ES6\r\n *\r\n */\r\nclass DBPromise {\r\n constructor(request) {\r\n this.request = request;\r\n }\r\n toPromise() {\r\n return new Promise((resolve, reject) => {\r\n this.request.addEventListener('success', () => {\r\n resolve(this.request.result);\r\n });\r\n this.request.addEventListener('error', () => {\r\n reject(this.request.error);\r\n });\r\n });\r\n }\r\n}\r\nfunction getObjectStore(db, isReadWrite) {\r\n return db\r\n .transaction([DB_OBJECTSTORE_NAME], isReadWrite ? 'readwrite' : 'readonly')\r\n .objectStore(DB_OBJECTSTORE_NAME);\r\n}\r\nfunction _deleteDatabase() {\r\n const request = indexedDB.deleteDatabase(DB_NAME);\r\n return new DBPromise(request).toPromise();\r\n}\r\nfunction _openDatabase() {\r\n const request = indexedDB.open(DB_NAME, DB_VERSION);\r\n return new Promise((resolve, reject) => {\r\n request.addEventListener('error', () => {\r\n reject(request.error);\r\n });\r\n request.addEventListener('upgradeneeded', () => {\r\n const db = request.result;\r\n try {\r\n db.createObjectStore(DB_OBJECTSTORE_NAME, { keyPath: DB_DATA_KEYPATH });\r\n }\r\n catch (e) {\r\n reject(e);\r\n }\r\n });\r\n request.addEventListener('success', async () => {\r\n const db = request.result;\r\n // Strange bug that occurs in Firefox when multiple tabs are opened at the\r\n // same time. The only way to recover seems to be deleting the database\r\n // and re-initializing it.\r\n // https://github.com/firebase/firebase-js-sdk/issues/634\r\n if (!db.objectStoreNames.contains(DB_OBJECTSTORE_NAME)) {\r\n // Need to close the database or else you get a `blocked` event\r\n db.close();\r\n await _deleteDatabase();\r\n resolve(await _openDatabase());\r\n }\r\n else {\r\n resolve(db);\r\n }\r\n });\r\n });\r\n}\r\nasync function _putObject(db, key, value) {\r\n const request = getObjectStore(db, true).put({\r\n [DB_DATA_KEYPATH]: key,\r\n value\r\n });\r\n return new DBPromise(request).toPromise();\r\n}\r\nasync function getObject(db, key) {\r\n const request = getObjectStore(db, false).get(key);\r\n const data = await new DBPromise(request).toPromise();\r\n return data === undefined ? null : data.value;\r\n}\r\nfunction _deleteObject(db, key) {\r\n const request = getObjectStore(db, true).delete(key);\r\n return new DBPromise(request).toPromise();\r\n}\r\nconst _POLLING_INTERVAL_MS = 800;\r\nconst _TRANSACTION_RETRY_COUNT = 3;\r\nclass IndexedDBLocalPersistence {\r\n constructor() {\r\n this.type = \"LOCAL\" /* PersistenceType.LOCAL */;\r\n this._shouldAllowMigration = true;\r\n this.listeners = {};\r\n this.localCache = {};\r\n // setTimeout return value is platform specific\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n this.pollTimer = null;\r\n this.pendingWrites = 0;\r\n this.receiver = null;\r\n this.sender = null;\r\n this.serviceWorkerReceiverAvailable = false;\r\n this.activeServiceWorker = null;\r\n // Fire & forget the service worker registration as it may never resolve\r\n this._workerInitializationPromise =\r\n this.initializeServiceWorkerMessaging().then(() => { }, () => { });\r\n }\r\n async _openDb() {\r\n if (this.db) {\r\n return this.db;\r\n }\r\n this.db = await _openDatabase();\r\n return this.db;\r\n }\r\n async _withRetries(op) {\r\n let numAttempts = 0;\r\n while (true) {\r\n try {\r\n const db = await this._openDb();\r\n return await op(db);\r\n }\r\n catch (e) {\r\n if (numAttempts++ > _TRANSACTION_RETRY_COUNT) {\r\n throw e;\r\n }\r\n if (this.db) {\r\n this.db.close();\r\n this.db = undefined;\r\n }\r\n // TODO: consider adding exponential backoff\r\n }\r\n }\r\n }\r\n /**\r\n * IndexedDB events do not propagate from the main window to the worker context. We rely on a\r\n * postMessage interface to send these events to the worker ourselves.\r\n */\r\n async initializeServiceWorkerMessaging() {\r\n return _isWorker() ? this.initializeReceiver() : this.initializeSender();\r\n }\r\n /**\r\n * As the worker we should listen to events from the main window.\r\n */\r\n async initializeReceiver() {\r\n this.receiver = Receiver._getInstance(_getWorkerGlobalScope());\r\n // Refresh from persistence if we receive a KeyChanged message.\r\n this.receiver._subscribe(\"keyChanged\" /* _EventType.KEY_CHANGED */, async (_origin, data) => {\r\n const keys = await this._poll();\r\n return {\r\n keyProcessed: keys.includes(data.key)\r\n };\r\n });\r\n // Let the sender know that we are listening so they give us more timeout.\r\n this.receiver._subscribe(\"ping\" /* _EventType.PING */, async (_origin, _data) => {\r\n return [\"keyChanged\" /* _EventType.KEY_CHANGED */];\r\n });\r\n }\r\n /**\r\n * As the main window, we should let the worker know when keys change (set and remove).\r\n *\r\n * @remarks\r\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/ready | ServiceWorkerContainer.ready}\r\n * may not resolve.\r\n */\r\n async initializeSender() {\r\n var _a, _b;\r\n // Check to see if there's an active service worker.\r\n this.activeServiceWorker = await _getActiveServiceWorker();\r\n if (!this.activeServiceWorker) {\r\n return;\r\n }\r\n this.sender = new Sender(this.activeServiceWorker);\r\n // Ping the service worker to check what events they can handle.\r\n const results = await this.sender._send(\"ping\" /* _EventType.PING */, {}, 800 /* _TimeoutDuration.LONG_ACK */);\r\n if (!results) {\r\n return;\r\n }\r\n if (((_a = results[0]) === null || _a === void 0 ? void 0 : _a.fulfilled) &&\r\n ((_b = results[0]) === null || _b === void 0 ? void 0 : _b.value.includes(\"keyChanged\" /* _EventType.KEY_CHANGED */))) {\r\n this.serviceWorkerReceiverAvailable = true;\r\n }\r\n }\r\n /**\r\n * Let the worker know about a changed key, the exact key doesn't technically matter since the\r\n * worker will just trigger a full sync anyway.\r\n *\r\n * @remarks\r\n * For now, we only support one service worker per page.\r\n *\r\n * @param key - Storage key which changed.\r\n */\r\n async notifyServiceWorker(key) {\r\n if (!this.sender ||\r\n !this.activeServiceWorker ||\r\n _getServiceWorkerController() !== this.activeServiceWorker) {\r\n return;\r\n }\r\n try {\r\n await this.sender._send(\"keyChanged\" /* _EventType.KEY_CHANGED */, { key }, \r\n // Use long timeout if receiver has previously responded to a ping from us.\r\n this.serviceWorkerReceiverAvailable\r\n ? 800 /* _TimeoutDuration.LONG_ACK */\r\n : 50 /* _TimeoutDuration.ACK */);\r\n }\r\n catch (_a) {\r\n // This is a best effort approach. Ignore errors.\r\n }\r\n }\r\n async _isAvailable() {\r\n try {\r\n if (!indexedDB) {\r\n return false;\r\n }\r\n const db = await _openDatabase();\r\n await _putObject(db, STORAGE_AVAILABLE_KEY, '1');\r\n await _deleteObject(db, STORAGE_AVAILABLE_KEY);\r\n return true;\r\n }\r\n catch (_a) { }\r\n return false;\r\n }\r\n async _withPendingWrite(write) {\r\n this.pendingWrites++;\r\n try {\r\n await write();\r\n }\r\n finally {\r\n this.pendingWrites--;\r\n }\r\n }\r\n async _set(key, value) {\r\n return this._withPendingWrite(async () => {\r\n await this._withRetries((db) => _putObject(db, key, value));\r\n this.localCache[key] = value;\r\n return this.notifyServiceWorker(key);\r\n });\r\n }\r\n async _get(key) {\r\n const obj = (await this._withRetries((db) => getObject(db, key)));\r\n this.localCache[key] = obj;\r\n return obj;\r\n }\r\n async _remove(key) {\r\n return this._withPendingWrite(async () => {\r\n await this._withRetries((db) => _deleteObject(db, key));\r\n delete this.localCache[key];\r\n return this.notifyServiceWorker(key);\r\n });\r\n }\r\n async _poll() {\r\n // TODO: check if we need to fallback if getAll is not supported\r\n const result = await this._withRetries((db) => {\r\n const getAllRequest = getObjectStore(db, false).getAll();\r\n return new DBPromise(getAllRequest).toPromise();\r\n });\r\n if (!result) {\r\n return [];\r\n }\r\n // If we have pending writes in progress abort, we'll get picked up on the next poll\r\n if (this.pendingWrites !== 0) {\r\n return [];\r\n }\r\n const keys = [];\r\n const keysInResult = new Set();\r\n if (result.length !== 0) {\r\n for (const { fbase_key: key, value } of result) {\r\n keysInResult.add(key);\r\n if (JSON.stringify(this.localCache[key]) !== JSON.stringify(value)) {\r\n this.notifyListeners(key, value);\r\n keys.push(key);\r\n }\r\n }\r\n }\r\n for (const localKey of Object.keys(this.localCache)) {\r\n if (this.localCache[localKey] && !keysInResult.has(localKey)) {\r\n // Deleted\r\n this.notifyListeners(localKey, null);\r\n keys.push(localKey);\r\n }\r\n }\r\n return keys;\r\n }\r\n notifyListeners(key, newValue) {\r\n this.localCache[key] = newValue;\r\n const listeners = this.listeners[key];\r\n if (listeners) {\r\n for (const listener of Array.from(listeners)) {\r\n listener(newValue);\r\n }\r\n }\r\n }\r\n startPolling() {\r\n this.stopPolling();\r\n this.pollTimer = setInterval(async () => this._poll(), _POLLING_INTERVAL_MS);\r\n }\r\n stopPolling() {\r\n if (this.pollTimer) {\r\n clearInterval(this.pollTimer);\r\n this.pollTimer = null;\r\n }\r\n }\r\n _addListener(key, listener) {\r\n if (Object.keys(this.listeners).length === 0) {\r\n this.startPolling();\r\n }\r\n if (!this.listeners[key]) {\r\n this.listeners[key] = new Set();\r\n // Populate the cache to avoid spuriously triggering on first poll.\r\n void this._get(key); // This can happen in the background async and we can return immediately.\r\n }\r\n this.listeners[key].add(listener);\r\n }\r\n _removeListener(key, listener) {\r\n if (this.listeners[key]) {\r\n this.listeners[key].delete(listener);\r\n if (this.listeners[key].size === 0) {\r\n delete this.listeners[key];\r\n }\r\n }\r\n if (Object.keys(this.listeners).length === 0) {\r\n this.stopPolling();\r\n }\r\n }\r\n}\r\nIndexedDBLocalPersistence.type = 'LOCAL';\r\n/**\r\n * An implementation of {@link Persistence} of type `LOCAL` using `indexedDB`\r\n * for the underlying storage.\r\n *\r\n * @public\r\n */\r\nconst indexedDBLocalPersistence = IndexedDBLocalPersistence;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction startSignInPhoneMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaSignIn:start\" /* Endpoint.START_MFA_SIGN_IN */, _addTidIfNecessary(auth, request));\r\n}\r\nfunction finalizeSignInPhoneMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaSignIn:finalize\" /* Endpoint.FINALIZE_MFA_SIGN_IN */, _addTidIfNecessary(auth, request));\r\n}\r\nfunction finalizeSignInTotpMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaSignIn:finalize\" /* Endpoint.FINALIZE_MFA_SIGN_IN */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst _SOLVE_TIME_MS = 500;\r\nconst _EXPIRATION_TIME_MS = 60000;\r\nconst _WIDGET_ID_START = 1000000000000;\r\nclass MockReCaptcha {\r\n constructor(auth) {\r\n this.auth = auth;\r\n this.counter = _WIDGET_ID_START;\r\n this._widgets = new Map();\r\n }\r\n render(container, parameters) {\r\n const id = this.counter;\r\n this._widgets.set(id, new MockWidget(container, this.auth.name, parameters || {}));\r\n this.counter++;\r\n return id;\r\n }\r\n reset(optWidgetId) {\r\n var _a;\r\n const id = optWidgetId || _WIDGET_ID_START;\r\n void ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.delete());\r\n this._widgets.delete(id);\r\n }\r\n getResponse(optWidgetId) {\r\n var _a;\r\n const id = optWidgetId || _WIDGET_ID_START;\r\n return ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.getResponse()) || '';\r\n }\r\n async execute(optWidgetId) {\r\n var _a;\r\n const id = optWidgetId || _WIDGET_ID_START;\r\n void ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.execute());\r\n return '';\r\n }\r\n}\r\nclass MockWidget {\r\n constructor(containerOrId, appName, params) {\r\n this.params = params;\r\n this.timerId = null;\r\n this.deleted = false;\r\n this.responseToken = null;\r\n this.clickHandler = () => {\r\n this.execute();\r\n };\r\n const container = typeof containerOrId === 'string'\r\n ? document.getElementById(containerOrId)\r\n : containerOrId;\r\n _assert(container, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */, { appName });\r\n this.container = container;\r\n this.isVisible = this.params.size !== 'invisible';\r\n if (this.isVisible) {\r\n this.execute();\r\n }\r\n else {\r\n this.container.addEventListener('click', this.clickHandler);\r\n }\r\n }\r\n getResponse() {\r\n this.checkIfDeleted();\r\n return this.responseToken;\r\n }\r\n delete() {\r\n this.checkIfDeleted();\r\n this.deleted = true;\r\n if (this.timerId) {\r\n clearTimeout(this.timerId);\r\n this.timerId = null;\r\n }\r\n this.container.removeEventListener('click', this.clickHandler);\r\n }\r\n execute() {\r\n this.checkIfDeleted();\r\n if (this.timerId) {\r\n return;\r\n }\r\n this.timerId = window.setTimeout(() => {\r\n this.responseToken = generateRandomAlphaNumericString(50);\r\n const { callback, 'expired-callback': expiredCallback } = this.params;\r\n if (callback) {\r\n try {\r\n callback(this.responseToken);\r\n }\r\n catch (e) { }\r\n }\r\n this.timerId = window.setTimeout(() => {\r\n this.timerId = null;\r\n this.responseToken = null;\r\n if (expiredCallback) {\r\n try {\r\n expiredCallback();\r\n }\r\n catch (e) { }\r\n }\r\n if (this.isVisible) {\r\n this.execute();\r\n }\r\n }, _EXPIRATION_TIME_MS);\r\n }, _SOLVE_TIME_MS);\r\n }\r\n checkIfDeleted() {\r\n if (this.deleted) {\r\n throw new Error('reCAPTCHA mock was already deleted!');\r\n }\r\n }\r\n}\r\nfunction generateRandomAlphaNumericString(len) {\r\n const chars = [];\r\n const allowedChars = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\r\n for (let i = 0; i < len; i++) {\r\n chars.push(allowedChars.charAt(Math.floor(Math.random() * allowedChars.length)));\r\n }\r\n return chars.join('');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// ReCaptcha will load using the same callback, so the callback function needs\r\n// to be kept around\r\nconst _JSLOAD_CALLBACK = _generateCallbackName('rcb');\r\nconst NETWORK_TIMEOUT_DELAY = new Delay(30000, 60000);\r\n/**\r\n * Loader for the GReCaptcha library. There should only ever be one of this.\r\n */\r\nclass ReCaptchaLoaderImpl {\r\n constructor() {\r\n var _a;\r\n this.hostLanguage = '';\r\n this.counter = 0;\r\n /**\r\n * Check for `render()` method. `window.grecaptcha` will exist if the Enterprise\r\n * version of the ReCAPTCHA script was loaded by someone else (e.g. App Check) but\r\n * `window.grecaptcha.render()` will not. Another load will add it.\r\n */\r\n this.librarySeparatelyLoaded = !!((_a = _window().grecaptcha) === null || _a === void 0 ? void 0 : _a.render);\r\n }\r\n load(auth, hl = '') {\r\n _assert(isHostLanguageValid(hl), auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n if (this.shouldResolveImmediately(hl) && isV2(_window().grecaptcha)) {\r\n return Promise.resolve(_window().grecaptcha);\r\n }\r\n return new Promise((resolve, reject) => {\r\n const networkTimeout = _window().setTimeout(() => {\r\n reject(_createError(auth, \"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */));\r\n }, NETWORK_TIMEOUT_DELAY.get());\r\n _window()[_JSLOAD_CALLBACK] = () => {\r\n _window().clearTimeout(networkTimeout);\r\n delete _window()[_JSLOAD_CALLBACK];\r\n const recaptcha = _window().grecaptcha;\r\n if (!recaptcha || !isV2(recaptcha)) {\r\n reject(_createError(auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */));\r\n return;\r\n }\r\n // Wrap the recaptcha render function so that we know if the developer has\r\n // called it separately\r\n const render = recaptcha.render;\r\n recaptcha.render = (container, params) => {\r\n const widgetId = render(container, params);\r\n this.counter++;\r\n return widgetId;\r\n };\r\n this.hostLanguage = hl;\r\n resolve(recaptcha);\r\n };\r\n const url = `${_recaptchaV2ScriptUrl()}?${querystring({\r\n onload: _JSLOAD_CALLBACK,\r\n render: 'explicit',\r\n hl\r\n })}`;\r\n _loadJS(url).catch(() => {\r\n clearTimeout(networkTimeout);\r\n reject(_createError(auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */));\r\n });\r\n });\r\n }\r\n clearedOneInstance() {\r\n this.counter--;\r\n }\r\n shouldResolveImmediately(hl) {\r\n var _a;\r\n // We can resolve immediately if:\r\n // • grecaptcha is already defined AND (\r\n // 1. the requested language codes are the same OR\r\n // 2. there exists already a ReCaptcha on the page\r\n // 3. the library was already loaded by the app\r\n // In cases (2) and (3), we _can't_ reload as it would break the recaptchas\r\n // that are already in the page\r\n return (!!((_a = _window().grecaptcha) === null || _a === void 0 ? void 0 : _a.render) &&\r\n (hl === this.hostLanguage ||\r\n this.counter > 0 ||\r\n this.librarySeparatelyLoaded));\r\n }\r\n}\r\nfunction isHostLanguageValid(hl) {\r\n return hl.length <= 6 && /^\\s*[a-zA-Z0-9\\-]*\\s*$/.test(hl);\r\n}\r\nclass MockReCaptchaLoaderImpl {\r\n async load(auth) {\r\n return new MockReCaptcha(auth);\r\n }\r\n clearedOneInstance() { }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst RECAPTCHA_VERIFIER_TYPE = 'recaptcha';\r\nconst DEFAULT_PARAMS = {\r\n theme: 'light',\r\n type: 'image'\r\n};\r\n/**\r\n * An {@link https://www.google.com/recaptcha/ | reCAPTCHA}-based application verifier.\r\n *\r\n * @remarks\r\n * `RecaptchaVerifier` does not work in a Node.js environment.\r\n *\r\n * @public\r\n */\r\nclass RecaptchaVerifier {\r\n /**\r\n * @param authExtern - The corresponding Firebase {@link Auth} instance.\r\n *\r\n * @param containerOrId - The reCAPTCHA container parameter.\r\n *\r\n * @remarks\r\n * This has different meaning depending on whether the reCAPTCHA is hidden or visible. For a\r\n * visible reCAPTCHA the container must be empty. If a string is used, it has to correspond to\r\n * an element ID. The corresponding element must also must be in the DOM at the time of\r\n * initialization.\r\n *\r\n * @param parameters - The optional reCAPTCHA parameters.\r\n *\r\n * @remarks\r\n * Check the reCAPTCHA docs for a comprehensive list. All parameters are accepted except for\r\n * the sitekey. Firebase Auth backend provisions a reCAPTCHA for each project and will\r\n * configure this upon rendering. For an invisible reCAPTCHA, a size key must have the value\r\n * 'invisible'.\r\n */\r\n constructor(authExtern, containerOrId, parameters = Object.assign({}, DEFAULT_PARAMS)) {\r\n this.parameters = parameters;\r\n /**\r\n * The application verifier type.\r\n *\r\n * @remarks\r\n * For a reCAPTCHA verifier, this is 'recaptcha'.\r\n */\r\n this.type = RECAPTCHA_VERIFIER_TYPE;\r\n this.destroyed = false;\r\n this.widgetId = null;\r\n this.tokenChangeListeners = new Set();\r\n this.renderPromise = null;\r\n this.recaptcha = null;\r\n this.auth = _castAuth(authExtern);\r\n this.isInvisible = this.parameters.size === 'invisible';\r\n _assert(typeof document !== 'undefined', this.auth, \"operation-not-supported-in-this-environment\" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */);\r\n const container = typeof containerOrId === 'string'\r\n ? document.getElementById(containerOrId)\r\n : containerOrId;\r\n _assert(container, this.auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n this.container = container;\r\n this.parameters.callback = this.makeTokenCallback(this.parameters.callback);\r\n this._recaptchaLoader = this.auth.settings.appVerificationDisabledForTesting\r\n ? new MockReCaptchaLoaderImpl()\r\n : new ReCaptchaLoaderImpl();\r\n this.validateStartingState();\r\n // TODO: Figure out if sdk version is needed\r\n }\r\n /**\r\n * Waits for the user to solve the reCAPTCHA and resolves with the reCAPTCHA token.\r\n *\r\n * @returns A Promise for the reCAPTCHA token.\r\n */\r\n async verify() {\r\n this.assertNotDestroyed();\r\n const id = await this.render();\r\n const recaptcha = this.getAssertedRecaptcha();\r\n const response = recaptcha.getResponse(id);\r\n if (response) {\r\n return response;\r\n }\r\n return new Promise(resolve => {\r\n const tokenChange = (token) => {\r\n if (!token) {\r\n return; // Ignore token expirations.\r\n }\r\n this.tokenChangeListeners.delete(tokenChange);\r\n resolve(token);\r\n };\r\n this.tokenChangeListeners.add(tokenChange);\r\n if (this.isInvisible) {\r\n recaptcha.execute(id);\r\n }\r\n });\r\n }\r\n /**\r\n * Renders the reCAPTCHA widget on the page.\r\n *\r\n * @returns A Promise that resolves with the reCAPTCHA widget ID.\r\n */\r\n render() {\r\n try {\r\n this.assertNotDestroyed();\r\n }\r\n catch (e) {\r\n // This method returns a promise. Since it's not async (we want to return the\r\n // _same_ promise if rendering is still occurring), the API surface should\r\n // reject with the error rather than just throw\r\n return Promise.reject(e);\r\n }\r\n if (this.renderPromise) {\r\n return this.renderPromise;\r\n }\r\n this.renderPromise = this.makeRenderPromise().catch(e => {\r\n this.renderPromise = null;\r\n throw e;\r\n });\r\n return this.renderPromise;\r\n }\r\n /** @internal */\r\n _reset() {\r\n this.assertNotDestroyed();\r\n if (this.widgetId !== null) {\r\n this.getAssertedRecaptcha().reset(this.widgetId);\r\n }\r\n }\r\n /**\r\n * Clears the reCAPTCHA widget from the page and destroys the instance.\r\n */\r\n clear() {\r\n this.assertNotDestroyed();\r\n this.destroyed = true;\r\n this._recaptchaLoader.clearedOneInstance();\r\n if (!this.isInvisible) {\r\n this.container.childNodes.forEach(node => {\r\n this.container.removeChild(node);\r\n });\r\n }\r\n }\r\n validateStartingState() {\r\n _assert(!this.parameters.sitekey, this.auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n _assert(this.isInvisible || !this.container.hasChildNodes(), this.auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n _assert(typeof document !== 'undefined', this.auth, \"operation-not-supported-in-this-environment\" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */);\r\n }\r\n makeTokenCallback(existing) {\r\n return token => {\r\n this.tokenChangeListeners.forEach(listener => listener(token));\r\n if (typeof existing === 'function') {\r\n existing(token);\r\n }\r\n else if (typeof existing === 'string') {\r\n const globalFunc = _window()[existing];\r\n if (typeof globalFunc === 'function') {\r\n globalFunc(token);\r\n }\r\n }\r\n };\r\n }\r\n assertNotDestroyed() {\r\n _assert(!this.destroyed, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }\r\n async makeRenderPromise() {\r\n await this.init();\r\n if (!this.widgetId) {\r\n let container = this.container;\r\n if (!this.isInvisible) {\r\n const guaranteedEmpty = document.createElement('div');\r\n container.appendChild(guaranteedEmpty);\r\n container = guaranteedEmpty;\r\n }\r\n this.widgetId = this.getAssertedRecaptcha().render(container, this.parameters);\r\n }\r\n return this.widgetId;\r\n }\r\n async init() {\r\n _assert(_isHttpOrHttps() && !_isWorker(), this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n await domReady();\r\n this.recaptcha = await this._recaptchaLoader.load(this.auth, this.auth.languageCode || undefined);\r\n const siteKey = await getRecaptchaParams(this.auth);\r\n _assert(siteKey, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n this.parameters.sitekey = siteKey;\r\n }\r\n getAssertedRecaptcha() {\r\n _assert(this.recaptcha, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return this.recaptcha;\r\n }\r\n}\r\nfunction domReady() {\r\n let resolver = null;\r\n return new Promise(resolve => {\r\n if (document.readyState === 'complete') {\r\n resolve();\r\n return;\r\n }\r\n // Document not ready, wait for load before resolving.\r\n // Save resolver, so we can remove listener in case it was externally\r\n // cancelled.\r\n resolver = () => resolve();\r\n window.addEventListener('load', resolver);\r\n }).catch(e => {\r\n if (resolver) {\r\n window.removeEventListener('load', resolver);\r\n }\r\n throw e;\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass ConfirmationResultImpl {\r\n constructor(verificationId, onConfirmation) {\r\n this.verificationId = verificationId;\r\n this.onConfirmation = onConfirmation;\r\n }\r\n confirm(verificationCode) {\r\n const authCredential = PhoneAuthCredential._fromVerification(this.verificationId, verificationCode);\r\n return this.onConfirmation(authCredential);\r\n }\r\n}\r\n/**\r\n * Asynchronously signs in using a phone number.\r\n *\r\n * @remarks\r\n * This method sends a code via SMS to the given\r\n * phone number, and returns a {@link ConfirmationResult}. After the user\r\n * provides the code sent to their phone, call {@link ConfirmationResult.confirm}\r\n * with the code to sign the user in.\r\n *\r\n * For abuse prevention, this method also requires a {@link ApplicationVerifier}.\r\n * This SDK includes a reCAPTCHA-based implementation, {@link RecaptchaVerifier}.\r\n * This function can work on other platforms that do not support the\r\n * {@link RecaptchaVerifier} (like React Native), but you need to use a\r\n * third-party {@link ApplicationVerifier} implementation.\r\n *\r\n * This method does not work in a Node.js environment or with {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // 'recaptcha-container' is the ID of an element in the DOM.\r\n * const applicationVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container');\r\n * const confirmationResult = await signInWithPhoneNumber(auth, phoneNumber, applicationVerifier);\r\n * // Obtain a verificationCode from the user.\r\n * const credential = await confirmationResult.confirm(verificationCode);\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101).\r\n * @param appVerifier - The {@link ApplicationVerifier}.\r\n *\r\n * @public\r\n */\r\nasync function signInWithPhoneNumber(auth, phoneNumber, appVerifier) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const authInternal = _castAuth(auth);\r\n const verificationId = await _verifyPhoneNumber(authInternal, phoneNumber, getModularInstance(appVerifier));\r\n return new ConfirmationResultImpl(verificationId, cred => signInWithCredential(authInternal, cred));\r\n}\r\n/**\r\n * Links the user account with the given phone number.\r\n *\r\n * @remarks\r\n * This method does not work in a Node.js environment.\r\n *\r\n * @param user - The user.\r\n * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101).\r\n * @param appVerifier - The {@link ApplicationVerifier}.\r\n *\r\n * @public\r\n */\r\nasync function linkWithPhoneNumber(user, phoneNumber, appVerifier) {\r\n const userInternal = getModularInstance(user);\r\n await _assertLinkedStatus(false, userInternal, \"phone\" /* ProviderId.PHONE */);\r\n const verificationId = await _verifyPhoneNumber(userInternal.auth, phoneNumber, getModularInstance(appVerifier));\r\n return new ConfirmationResultImpl(verificationId, cred => linkWithCredential(userInternal, cred));\r\n}\r\n/**\r\n * Re-authenticates a user using a fresh phone credential.\r\n *\r\n * @remarks\r\n * Use before operations such as {@link updatePassword} that require tokens from recent sign-in attempts.\r\n *\r\n * This method does not work in a Node.js environment or on any {@link User} signed in by\r\n * {@link Auth} instances created with a {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @param user - The user.\r\n * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101).\r\n * @param appVerifier - The {@link ApplicationVerifier}.\r\n *\r\n * @public\r\n */\r\nasync function reauthenticateWithPhoneNumber(user, phoneNumber, appVerifier) {\r\n const userInternal = getModularInstance(user);\r\n if (_isFirebaseServerApp(userInternal.auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(userInternal.auth));\r\n }\r\n const verificationId = await _verifyPhoneNumber(userInternal.auth, phoneNumber, getModularInstance(appVerifier));\r\n return new ConfirmationResultImpl(verificationId, cred => reauthenticateWithCredential(userInternal, cred));\r\n}\r\n/**\r\n * Returns a verification ID to be used in conjunction with the SMS code that is sent.\r\n *\r\n */\r\nasync function _verifyPhoneNumber(auth, options, verifier) {\r\n var _a;\r\n const recaptchaToken = await verifier.verify();\r\n try {\r\n _assert(typeof recaptchaToken === 'string', auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n _assert(verifier.type === RECAPTCHA_VERIFIER_TYPE, auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n let phoneInfoOptions;\r\n if (typeof options === 'string') {\r\n phoneInfoOptions = {\r\n phoneNumber: options\r\n };\r\n }\r\n else {\r\n phoneInfoOptions = options;\r\n }\r\n if ('session' in phoneInfoOptions) {\r\n const session = phoneInfoOptions.session;\r\n if ('phoneNumber' in phoneInfoOptions) {\r\n _assert(session.type === \"enroll\" /* MultiFactorSessionType.ENROLL */, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const response = await startEnrollPhoneMfa(auth, {\r\n idToken: session.credential,\r\n phoneEnrollmentInfo: {\r\n phoneNumber: phoneInfoOptions.phoneNumber,\r\n recaptchaToken\r\n }\r\n });\r\n return response.phoneSessionInfo.sessionInfo;\r\n }\r\n else {\r\n _assert(session.type === \"signin\" /* MultiFactorSessionType.SIGN_IN */, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const mfaEnrollmentId = ((_a = phoneInfoOptions.multiFactorHint) === null || _a === void 0 ? void 0 : _a.uid) ||\r\n phoneInfoOptions.multiFactorUid;\r\n _assert(mfaEnrollmentId, auth, \"missing-multi-factor-info\" /* AuthErrorCode.MISSING_MFA_INFO */);\r\n const response = await startSignInPhoneMfa(auth, {\r\n mfaPendingCredential: session.credential,\r\n mfaEnrollmentId,\r\n phoneSignInInfo: {\r\n recaptchaToken\r\n }\r\n });\r\n return response.phoneResponseInfo.sessionInfo;\r\n }\r\n }\r\n else {\r\n const { sessionInfo } = await sendPhoneVerificationCode(auth, {\r\n phoneNumber: phoneInfoOptions.phoneNumber,\r\n recaptchaToken\r\n });\r\n return sessionInfo;\r\n }\r\n }\r\n finally {\r\n verifier._reset();\r\n }\r\n}\r\n/**\r\n * Updates the user's phone number.\r\n *\r\n * @remarks\r\n * This method does not work in a Node.js environment or on any {@link User} signed in by\r\n * {@link Auth} instances created with a {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```\r\n * // 'recaptcha-container' is the ID of an element in the DOM.\r\n * const applicationVerifier = new RecaptchaVerifier('recaptcha-container');\r\n * const provider = new PhoneAuthProvider(auth);\r\n * const verificationId = await provider.verifyPhoneNumber('+16505550101', applicationVerifier);\r\n * // Obtain the verificationCode from the user.\r\n * const phoneCredential = PhoneAuthProvider.credential(verificationId, verificationCode);\r\n * await updatePhoneNumber(user, phoneCredential);\r\n * ```\r\n *\r\n * @param user - The user.\r\n * @param credential - A credential authenticating the new phone number.\r\n *\r\n * @public\r\n */\r\nasync function updatePhoneNumber(user, credential) {\r\n const userInternal = getModularInstance(user);\r\n if (_isFirebaseServerApp(userInternal.auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(userInternal.auth));\r\n }\r\n await _link$1(userInternal, credential);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for generating an {@link PhoneAuthCredential}.\r\n *\r\n * @remarks\r\n * `PhoneAuthProvider` does not work in a Node.js environment.\r\n *\r\n * @example\r\n * ```javascript\r\n * // 'recaptcha-container' is the ID of an element in the DOM.\r\n * const applicationVerifier = new RecaptchaVerifier('recaptcha-container');\r\n * const provider = new PhoneAuthProvider(auth);\r\n * const verificationId = await provider.verifyPhoneNumber('+16505550101', applicationVerifier);\r\n * // Obtain the verificationCode from the user.\r\n * const phoneCredential = PhoneAuthProvider.credential(verificationId, verificationCode);\r\n * const userCredential = await signInWithCredential(auth, phoneCredential);\r\n * ```\r\n *\r\n * @public\r\n */\r\nclass PhoneAuthProvider {\r\n /**\r\n * @param auth - The Firebase {@link Auth} instance in which sign-ins should occur.\r\n *\r\n */\r\n constructor(auth) {\r\n /** Always set to {@link ProviderId}.PHONE. */\r\n this.providerId = PhoneAuthProvider.PROVIDER_ID;\r\n this.auth = _castAuth(auth);\r\n }\r\n /**\r\n *\r\n * Starts a phone number authentication flow by sending a verification code to the given phone\r\n * number.\r\n *\r\n * @example\r\n * ```javascript\r\n * const provider = new PhoneAuthProvider(auth);\r\n * const verificationId = await provider.verifyPhoneNumber(phoneNumber, applicationVerifier);\r\n * // Obtain verificationCode from the user.\r\n * const authCredential = PhoneAuthProvider.credential(verificationId, verificationCode);\r\n * const userCredential = await signInWithCredential(auth, authCredential);\r\n * ```\r\n *\r\n * @example\r\n * An alternative flow is provided using the `signInWithPhoneNumber` method.\r\n * ```javascript\r\n * const confirmationResult = signInWithPhoneNumber(auth, phoneNumber, applicationVerifier);\r\n * // Obtain verificationCode from the user.\r\n * const userCredential = confirmationResult.confirm(verificationCode);\r\n * ```\r\n *\r\n * @param phoneInfoOptions - The user's {@link PhoneInfoOptions}. The phone number should be in\r\n * E.164 format (e.g. +16505550101).\r\n * @param applicationVerifier - For abuse prevention, this method also requires a\r\n * {@link ApplicationVerifier}. This SDK includes a reCAPTCHA-based implementation,\r\n * {@link RecaptchaVerifier}.\r\n *\r\n * @returns A Promise for a verification ID that can be passed to\r\n * {@link PhoneAuthProvider.credential} to identify this flow..\r\n */\r\n verifyPhoneNumber(phoneOptions, applicationVerifier) {\r\n return _verifyPhoneNumber(this.auth, phoneOptions, getModularInstance(applicationVerifier));\r\n }\r\n /**\r\n * Creates a phone auth credential, given the verification ID from\r\n * {@link PhoneAuthProvider.verifyPhoneNumber} and the code that was sent to the user's\r\n * mobile device.\r\n *\r\n * @example\r\n * ```javascript\r\n * const provider = new PhoneAuthProvider(auth);\r\n * const verificationId = provider.verifyPhoneNumber(phoneNumber, applicationVerifier);\r\n * // Obtain verificationCode from the user.\r\n * const authCredential = PhoneAuthProvider.credential(verificationId, verificationCode);\r\n * const userCredential = signInWithCredential(auth, authCredential);\r\n * ```\r\n *\r\n * @example\r\n * An alternative flow is provided using the `signInWithPhoneNumber` method.\r\n * ```javascript\r\n * const confirmationResult = await signInWithPhoneNumber(auth, phoneNumber, applicationVerifier);\r\n * // Obtain verificationCode from the user.\r\n * const userCredential = await confirmationResult.confirm(verificationCode);\r\n * ```\r\n *\r\n * @param verificationId - The verification ID returned from {@link PhoneAuthProvider.verifyPhoneNumber}.\r\n * @param verificationCode - The verification code sent to the user's mobile device.\r\n *\r\n * @returns The auth provider credential.\r\n */\r\n static credential(verificationId, verificationCode) {\r\n return PhoneAuthCredential._fromVerification(verificationId, verificationCode);\r\n }\r\n /**\r\n * Generates an {@link AuthCredential} from a {@link UserCredential}.\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromResult(userCredential) {\r\n const credential = userCredential;\r\n return PhoneAuthProvider.credentialFromTaggedObject(credential);\r\n }\r\n /**\r\n * Returns an {@link AuthCredential} when passed an error.\r\n *\r\n * @remarks\r\n *\r\n * This method works for errors like\r\n * `auth/account-exists-with-different-credentials`. This is useful for\r\n * recovering when attempting to set a user's phone number but the number\r\n * in question is already tied to another account. For example, the following\r\n * code tries to update the current user's phone number, and if that\r\n * fails, links the user with the account associated with that number:\r\n *\r\n * ```js\r\n * const provider = new PhoneAuthProvider(auth);\r\n * const verificationId = await provider.verifyPhoneNumber(number, verifier);\r\n * try {\r\n * const code = ''; // Prompt the user for the verification code\r\n * await updatePhoneNumber(\r\n * auth.currentUser,\r\n * PhoneAuthProvider.credential(verificationId, code));\r\n * } catch (e) {\r\n * if ((e as FirebaseError)?.code === 'auth/account-exists-with-different-credential') {\r\n * const cred = PhoneAuthProvider.credentialFromError(e);\r\n * await linkWithCredential(auth.currentUser, cred);\r\n * }\r\n * }\r\n *\r\n * // At this point, auth.currentUser.phoneNumber === number.\r\n * ```\r\n *\r\n * @param error - The error to generate a credential from.\r\n */\r\n static credentialFromError(error) {\r\n return PhoneAuthProvider.credentialFromTaggedObject((error.customData || {}));\r\n }\r\n static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) {\r\n if (!tokenResponse) {\r\n return null;\r\n }\r\n const { phoneNumber, temporaryProof } = tokenResponse;\r\n if (phoneNumber && temporaryProof) {\r\n return PhoneAuthCredential._fromTokenResponse(phoneNumber, temporaryProof);\r\n }\r\n return null;\r\n }\r\n}\r\n/** Always set to {@link ProviderId}.PHONE. */\r\nPhoneAuthProvider.PROVIDER_ID = \"phone\" /* ProviderId.PHONE */;\r\n/** Always set to {@link SignInMethod}.PHONE. */\r\nPhoneAuthProvider.PHONE_SIGN_IN_METHOD = \"phone\" /* SignInMethod.PHONE */;\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Chooses a popup/redirect resolver to use. This prefers the override (which\r\n * is directly passed in), and falls back to the property set on the auth\r\n * object. If neither are available, this function errors w/ an argument error.\r\n */\r\nfunction _withDefaultResolver(auth, resolverOverride) {\r\n if (resolverOverride) {\r\n return _getInstance(resolverOverride);\r\n }\r\n _assert(auth._popupRedirectResolver, auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n return auth._popupRedirectResolver;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass IdpCredential extends AuthCredential {\r\n constructor(params) {\r\n super(\"custom\" /* ProviderId.CUSTOM */, \"custom\" /* ProviderId.CUSTOM */);\r\n this.params = params;\r\n }\r\n _getIdTokenResponse(auth) {\r\n return signInWithIdp(auth, this._buildIdpRequest());\r\n }\r\n _linkToIdToken(auth, idToken) {\r\n return signInWithIdp(auth, this._buildIdpRequest(idToken));\r\n }\r\n _getReauthenticationResolver(auth) {\r\n return signInWithIdp(auth, this._buildIdpRequest());\r\n }\r\n _buildIdpRequest(idToken) {\r\n const request = {\r\n requestUri: this.params.requestUri,\r\n sessionId: this.params.sessionId,\r\n postBody: this.params.postBody,\r\n tenantId: this.params.tenantId,\r\n pendingToken: this.params.pendingToken,\r\n returnSecureToken: true,\r\n returnIdpCredential: true\r\n };\r\n if (idToken) {\r\n request.idToken = idToken;\r\n }\r\n return request;\r\n }\r\n}\r\nfunction _signIn(params) {\r\n return _signInWithCredential(params.auth, new IdpCredential(params), params.bypassAuthState);\r\n}\r\nfunction _reauth(params) {\r\n const { auth, user } = params;\r\n _assert(user, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return _reauthenticate(user, new IdpCredential(params), params.bypassAuthState);\r\n}\r\nasync function _link(params) {\r\n const { auth, user } = params;\r\n _assert(user, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return _link$1(user, new IdpCredential(params), params.bypassAuthState);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Popup event manager. Handles the popup's entire lifecycle; listens to auth\r\n * events\r\n */\r\nclass AbstractPopupRedirectOperation {\r\n constructor(auth, filter, resolver, user, bypassAuthState = false) {\r\n this.auth = auth;\r\n this.resolver = resolver;\r\n this.user = user;\r\n this.bypassAuthState = bypassAuthState;\r\n this.pendingPromise = null;\r\n this.eventManager = null;\r\n this.filter = Array.isArray(filter) ? filter : [filter];\r\n }\r\n execute() {\r\n return new Promise(async (resolve, reject) => {\r\n this.pendingPromise = { resolve, reject };\r\n try {\r\n this.eventManager = await this.resolver._initialize(this.auth);\r\n await this.onExecution();\r\n this.eventManager.registerConsumer(this);\r\n }\r\n catch (e) {\r\n this.reject(e);\r\n }\r\n });\r\n }\r\n async onAuthEvent(event) {\r\n const { urlResponse, sessionId, postBody, tenantId, error, type } = event;\r\n if (error) {\r\n this.reject(error);\r\n return;\r\n }\r\n const params = {\r\n auth: this.auth,\r\n requestUri: urlResponse,\r\n sessionId: sessionId,\r\n tenantId: tenantId || undefined,\r\n postBody: postBody || undefined,\r\n user: this.user,\r\n bypassAuthState: this.bypassAuthState\r\n };\r\n try {\r\n this.resolve(await this.getIdpTask(type)(params));\r\n }\r\n catch (e) {\r\n this.reject(e);\r\n }\r\n }\r\n onError(error) {\r\n this.reject(error);\r\n }\r\n getIdpTask(type) {\r\n switch (type) {\r\n case \"signInViaPopup\" /* AuthEventType.SIGN_IN_VIA_POPUP */:\r\n case \"signInViaRedirect\" /* AuthEventType.SIGN_IN_VIA_REDIRECT */:\r\n return _signIn;\r\n case \"linkViaPopup\" /* AuthEventType.LINK_VIA_POPUP */:\r\n case \"linkViaRedirect\" /* AuthEventType.LINK_VIA_REDIRECT */:\r\n return _link;\r\n case \"reauthViaPopup\" /* AuthEventType.REAUTH_VIA_POPUP */:\r\n case \"reauthViaRedirect\" /* AuthEventType.REAUTH_VIA_REDIRECT */:\r\n return _reauth;\r\n default:\r\n _fail(this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }\r\n }\r\n resolve(cred) {\r\n debugAssert(this.pendingPromise, 'Pending promise was never set');\r\n this.pendingPromise.resolve(cred);\r\n this.unregisterAndCleanUp();\r\n }\r\n reject(error) {\r\n debugAssert(this.pendingPromise, 'Pending promise was never set');\r\n this.pendingPromise.reject(error);\r\n this.unregisterAndCleanUp();\r\n }\r\n unregisterAndCleanUp() {\r\n if (this.eventManager) {\r\n this.eventManager.unregisterConsumer(this);\r\n }\r\n this.pendingPromise = null;\r\n this.cleanUp();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst _POLL_WINDOW_CLOSE_TIMEOUT = new Delay(2000, 10000);\r\n/**\r\n * Authenticates a Firebase client using a popup-based OAuth authentication flow.\r\n *\r\n * @remarks\r\n * If succeeds, returns the signed in user along with the provider's credential. If sign in was\r\n * unsuccessful, returns an error object containing additional information about the error.\r\n *\r\n * This method does not work in a Node.js environment or with {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a popup.\r\n * const provider = new FacebookAuthProvider();\r\n * const result = await signInWithPopup(auth, provider);\r\n *\r\n * // The signed-in user info.\r\n * const user = result.user;\r\n * // This gives you a Facebook Access Token.\r\n * const credential = provider.credentialFromResult(auth, result);\r\n * const token = credential.accessToken;\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\r\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\r\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\r\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\r\n *\r\n * @public\r\n */\r\nasync function signInWithPopup(auth, provider, resolver) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_createError(auth, \"operation-not-supported-in-this-environment\" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */));\r\n }\r\n const authInternal = _castAuth(auth);\r\n _assertInstanceOf(auth, provider, FederatedAuthProvider);\r\n const resolverInternal = _withDefaultResolver(authInternal, resolver);\r\n const action = new PopupOperation(authInternal, \"signInViaPopup\" /* AuthEventType.SIGN_IN_VIA_POPUP */, provider, resolverInternal);\r\n return action.executeNotNull();\r\n}\r\n/**\r\n * Reauthenticates the current user with the specified {@link OAuthProvider} using a pop-up based\r\n * OAuth flow.\r\n *\r\n * @remarks\r\n * If the reauthentication is successful, the returned result will contain the user and the\r\n * provider's credential.\r\n *\r\n * This method does not work in a Node.js environment or on any {@link User} signed in by\r\n * {@link Auth} instances created with a {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a popup.\r\n * const provider = new FacebookAuthProvider();\r\n * const result = await signInWithPopup(auth, provider);\r\n * // Reauthenticate using a popup.\r\n * await reauthenticateWithPopup(result.user, provider);\r\n * ```\r\n *\r\n * @param user - The user.\r\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\r\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\r\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\r\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\r\n *\r\n * @public\r\n */\r\nasync function reauthenticateWithPopup(user, provider, resolver) {\r\n const userInternal = getModularInstance(user);\r\n if (_isFirebaseServerApp(userInternal.auth.app)) {\r\n return Promise.reject(_createError(userInternal.auth, \"operation-not-supported-in-this-environment\" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */));\r\n }\r\n _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider);\r\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\r\n const action = new PopupOperation(userInternal.auth, \"reauthViaPopup\" /* AuthEventType.REAUTH_VIA_POPUP */, provider, resolverInternal, userInternal);\r\n return action.executeNotNull();\r\n}\r\n/**\r\n * Links the authenticated provider to the user account using a pop-up based OAuth flow.\r\n *\r\n * @remarks\r\n * If the linking is successful, the returned result will contain the user and the provider's credential.\r\n *\r\n * This method does not work in a Node.js environment.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using some other provider.\r\n * const result = await signInWithEmailAndPassword(auth, email, password);\r\n * // Link using a popup.\r\n * const provider = new FacebookAuthProvider();\r\n * await linkWithPopup(result.user, provider);\r\n * ```\r\n *\r\n * @param user - The user.\r\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\r\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\r\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\r\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\r\n *\r\n * @public\r\n */\r\nasync function linkWithPopup(user, provider, resolver) {\r\n const userInternal = getModularInstance(user);\r\n _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider);\r\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\r\n const action = new PopupOperation(userInternal.auth, \"linkViaPopup\" /* AuthEventType.LINK_VIA_POPUP */, provider, resolverInternal, userInternal);\r\n return action.executeNotNull();\r\n}\r\n/**\r\n * Popup event manager. Handles the popup's entire lifecycle; listens to auth\r\n * events\r\n *\r\n */\r\nclass PopupOperation extends AbstractPopupRedirectOperation {\r\n constructor(auth, filter, provider, resolver, user) {\r\n super(auth, filter, resolver, user);\r\n this.provider = provider;\r\n this.authWindow = null;\r\n this.pollId = null;\r\n if (PopupOperation.currentPopupAction) {\r\n PopupOperation.currentPopupAction.cancel();\r\n }\r\n PopupOperation.currentPopupAction = this;\r\n }\r\n async executeNotNull() {\r\n const result = await this.execute();\r\n _assert(result, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return result;\r\n }\r\n async onExecution() {\r\n debugAssert(this.filter.length === 1, 'Popup operations only handle one event');\r\n const eventId = _generateEventId();\r\n this.authWindow = await this.resolver._openPopup(this.auth, this.provider, this.filter[0], // There's always one, see constructor\r\n eventId);\r\n this.authWindow.associatedEvent = eventId;\r\n // Check for web storage support and origin validation _after_ the popup is\r\n // loaded. These operations are slow (~1 second or so) Rather than\r\n // waiting on them before opening the window, optimistically open the popup\r\n // and check for storage support at the same time. If storage support is\r\n // not available, this will cause the whole thing to reject properly. It\r\n // will also close the popup, but since the promise has already rejected,\r\n // the popup closed by user poll will reject into the void.\r\n this.resolver._originValidation(this.auth).catch(e => {\r\n this.reject(e);\r\n });\r\n this.resolver._isIframeWebStorageSupported(this.auth, isSupported => {\r\n if (!isSupported) {\r\n this.reject(_createError(this.auth, \"web-storage-unsupported\" /* AuthErrorCode.WEB_STORAGE_UNSUPPORTED */));\r\n }\r\n });\r\n // Handle user closure. Notice this does *not* use await\r\n this.pollUserCancellation();\r\n }\r\n get eventId() {\r\n var _a;\r\n return ((_a = this.authWindow) === null || _a === void 0 ? void 0 : _a.associatedEvent) || null;\r\n }\r\n cancel() {\r\n this.reject(_createError(this.auth, \"cancelled-popup-request\" /* AuthErrorCode.EXPIRED_POPUP_REQUEST */));\r\n }\r\n cleanUp() {\r\n if (this.authWindow) {\r\n this.authWindow.close();\r\n }\r\n if (this.pollId) {\r\n window.clearTimeout(this.pollId);\r\n }\r\n this.authWindow = null;\r\n this.pollId = null;\r\n PopupOperation.currentPopupAction = null;\r\n }\r\n pollUserCancellation() {\r\n const poll = () => {\r\n var _a, _b;\r\n if ((_b = (_a = this.authWindow) === null || _a === void 0 ? void 0 : _a.window) === null || _b === void 0 ? void 0 : _b.closed) {\r\n // Make sure that there is sufficient time for whatever action to\r\n // complete. The window could have closed but the sign in network\r\n // call could still be in flight. This is specifically true for\r\n // Firefox or if the opener is in an iframe, in which case the oauth\r\n // helper closes the popup.\r\n this.pollId = window.setTimeout(() => {\r\n this.pollId = null;\r\n this.reject(_createError(this.auth, \"popup-closed-by-user\" /* AuthErrorCode.POPUP_CLOSED_BY_USER */));\r\n }, 8000 /* _Timeout.AUTH_EVENT */);\r\n return;\r\n }\r\n this.pollId = window.setTimeout(poll, _POLL_WINDOW_CLOSE_TIMEOUT.get());\r\n };\r\n poll();\r\n }\r\n}\r\n// Only one popup is ever shown at once. The lifecycle of the current popup\r\n// can be managed / cancelled by the constructor.\r\nPopupOperation.currentPopupAction = null;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst PENDING_REDIRECT_KEY = 'pendingRedirect';\r\n// We only get one redirect outcome for any one auth, so just store it\r\n// in here.\r\nconst redirectOutcomeMap = new Map();\r\nclass RedirectAction extends AbstractPopupRedirectOperation {\r\n constructor(auth, resolver, bypassAuthState = false) {\r\n super(auth, [\r\n \"signInViaRedirect\" /* AuthEventType.SIGN_IN_VIA_REDIRECT */,\r\n \"linkViaRedirect\" /* AuthEventType.LINK_VIA_REDIRECT */,\r\n \"reauthViaRedirect\" /* AuthEventType.REAUTH_VIA_REDIRECT */,\r\n \"unknown\" /* AuthEventType.UNKNOWN */\r\n ], resolver, undefined, bypassAuthState);\r\n this.eventId = null;\r\n }\r\n /**\r\n * Override the execute function; if we already have a redirect result, then\r\n * just return it.\r\n */\r\n async execute() {\r\n let readyOutcome = redirectOutcomeMap.get(this.auth._key());\r\n if (!readyOutcome) {\r\n try {\r\n const hasPendingRedirect = await _getAndClearPendingRedirectStatus(this.resolver, this.auth);\r\n const result = hasPendingRedirect ? await super.execute() : null;\r\n readyOutcome = () => Promise.resolve(result);\r\n }\r\n catch (e) {\r\n readyOutcome = () => Promise.reject(e);\r\n }\r\n redirectOutcomeMap.set(this.auth._key(), readyOutcome);\r\n }\r\n // If we're not bypassing auth state, the ready outcome should be set to\r\n // null.\r\n if (!this.bypassAuthState) {\r\n redirectOutcomeMap.set(this.auth._key(), () => Promise.resolve(null));\r\n }\r\n return readyOutcome();\r\n }\r\n async onAuthEvent(event) {\r\n if (event.type === \"signInViaRedirect\" /* AuthEventType.SIGN_IN_VIA_REDIRECT */) {\r\n return super.onAuthEvent(event);\r\n }\r\n else if (event.type === \"unknown\" /* AuthEventType.UNKNOWN */) {\r\n // This is a sentinel value indicating there's no pending redirect\r\n this.resolve(null);\r\n return;\r\n }\r\n if (event.eventId) {\r\n const user = await this.auth._redirectUserForId(event.eventId);\r\n if (user) {\r\n this.user = user;\r\n return super.onAuthEvent(event);\r\n }\r\n else {\r\n this.resolve(null);\r\n }\r\n }\r\n }\r\n async onExecution() { }\r\n cleanUp() { }\r\n}\r\nasync function _getAndClearPendingRedirectStatus(resolver, auth) {\r\n const key = pendingRedirectKey(auth);\r\n const persistence = resolverPersistence(resolver);\r\n if (!(await persistence._isAvailable())) {\r\n return false;\r\n }\r\n const hasPendingRedirect = (await persistence._get(key)) === 'true';\r\n await persistence._remove(key);\r\n return hasPendingRedirect;\r\n}\r\nasync function _setPendingRedirectStatus(resolver, auth) {\r\n return resolverPersistence(resolver)._set(pendingRedirectKey(auth), 'true');\r\n}\r\nfunction _clearRedirectOutcomes() {\r\n redirectOutcomeMap.clear();\r\n}\r\nfunction _overrideRedirectResult(auth, result) {\r\n redirectOutcomeMap.set(auth._key(), result);\r\n}\r\nfunction resolverPersistence(resolver) {\r\n return _getInstance(resolver._redirectPersistence);\r\n}\r\nfunction pendingRedirectKey(auth) {\r\n return _persistenceKeyName(PENDING_REDIRECT_KEY, auth.config.apiKey, auth.name);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Authenticates a Firebase client using a full-page redirect flow.\r\n *\r\n * @remarks\r\n * To handle the results and errors for this operation, refer to {@link getRedirectResult}.\r\n * Follow the {@link https://firebase.google.com/docs/auth/web/redirect-best-practices\r\n * | best practices} when using {@link signInWithRedirect}.\r\n *\r\n * This method does not work in a Node.js environment or with {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new FacebookAuthProvider();\r\n * // You can add additional scopes to the provider:\r\n * provider.addScope('user_birthday');\r\n * // Start a sign in process for an unauthenticated user.\r\n * await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * if (result) {\r\n * // This is the signed-in user\r\n * const user = result.user;\r\n * // This gives you a Facebook Access Token.\r\n * const credential = provider.credentialFromResult(auth, result);\r\n * const token = credential.accessToken;\r\n * }\r\n * // As this API can be used for sign-in, linking and reauthentication,\r\n * // check the operationType to determine what triggered this redirect\r\n * // operation.\r\n * const operationType = result.operationType;\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\r\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\r\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\r\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\r\n *\r\n * @public\r\n */\r\nfunction signInWithRedirect(auth, provider, resolver) {\r\n return _signInWithRedirect(auth, provider, resolver);\r\n}\r\nasync function _signInWithRedirect(auth, provider, resolver) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const authInternal = _castAuth(auth);\r\n _assertInstanceOf(auth, provider, FederatedAuthProvider);\r\n // Wait for auth initialization to complete, this will process pending redirects and clear the\r\n // PENDING_REDIRECT_KEY in persistence. This should be completed before starting a new\r\n // redirect and creating a PENDING_REDIRECT_KEY entry.\r\n await authInternal._initializationPromise;\r\n const resolverInternal = _withDefaultResolver(authInternal, resolver);\r\n await _setPendingRedirectStatus(resolverInternal, authInternal);\r\n return resolverInternal._openRedirect(authInternal, provider, \"signInViaRedirect\" /* AuthEventType.SIGN_IN_VIA_REDIRECT */);\r\n}\r\n/**\r\n * Reauthenticates the current user with the specified {@link OAuthProvider} using a full-page redirect flow.\r\n * @remarks\r\n * To handle the results and errors for this operation, refer to {@link getRedirectResult}.\r\n * Follow the {@link https://firebase.google.com/docs/auth/web/redirect-best-practices\r\n * | best practices} when using {@link reauthenticateWithRedirect}.\r\n *\r\n * This method does not work in a Node.js environment or with {@link Auth} instances\r\n * created with a {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new FacebookAuthProvider();\r\n * const result = await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * // Reauthenticate using a redirect.\r\n * await reauthenticateWithRedirect(result.user, provider);\r\n * // This will again trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * ```\r\n *\r\n * @param user - The user.\r\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\r\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\r\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\r\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\r\n *\r\n * @public\r\n */\r\nfunction reauthenticateWithRedirect(user, provider, resolver) {\r\n return _reauthenticateWithRedirect(user, provider, resolver);\r\n}\r\nasync function _reauthenticateWithRedirect(user, provider, resolver) {\r\n const userInternal = getModularInstance(user);\r\n _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider);\r\n if (_isFirebaseServerApp(userInternal.auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(userInternal.auth));\r\n }\r\n // Wait for auth initialization to complete, this will process pending redirects and clear the\r\n // PENDING_REDIRECT_KEY in persistence. This should be completed before starting a new\r\n // redirect and creating a PENDING_REDIRECT_KEY entry.\r\n await userInternal.auth._initializationPromise;\r\n // Allow the resolver to error before persisting the redirect user\r\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\r\n await _setPendingRedirectStatus(resolverInternal, userInternal.auth);\r\n const eventId = await prepareUserForRedirect(userInternal);\r\n return resolverInternal._openRedirect(userInternal.auth, provider, \"reauthViaRedirect\" /* AuthEventType.REAUTH_VIA_REDIRECT */, eventId);\r\n}\r\n/**\r\n * Links the {@link OAuthProvider} to the user account using a full-page redirect flow.\r\n * @remarks\r\n * To handle the results and errors for this operation, refer to {@link getRedirectResult}.\r\n * Follow the {@link https://firebase.google.com/docs/auth/web/redirect-best-practices\r\n * | best practices} when using {@link linkWithRedirect}.\r\n *\r\n * This method does not work in a Node.js environment or with {@link Auth} instances\r\n * created with a {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using some other provider.\r\n * const result = await signInWithEmailAndPassword(auth, email, password);\r\n * // Link using a redirect.\r\n * const provider = new FacebookAuthProvider();\r\n * await linkWithRedirect(result.user, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * ```\r\n *\r\n * @param user - The user.\r\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\r\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\r\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\r\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\r\n *\r\n * @public\r\n */\r\nfunction linkWithRedirect(user, provider, resolver) {\r\n return _linkWithRedirect(user, provider, resolver);\r\n}\r\nasync function _linkWithRedirect(user, provider, resolver) {\r\n const userInternal = getModularInstance(user);\r\n _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider);\r\n // Wait for auth initialization to complete, this will process pending redirects and clear the\r\n // PENDING_REDIRECT_KEY in persistence. This should be completed before starting a new\r\n // redirect and creating a PENDING_REDIRECT_KEY entry.\r\n await userInternal.auth._initializationPromise;\r\n // Allow the resolver to error before persisting the redirect user\r\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\r\n await _assertLinkedStatus(false, userInternal, provider.providerId);\r\n await _setPendingRedirectStatus(resolverInternal, userInternal.auth);\r\n const eventId = await prepareUserForRedirect(userInternal);\r\n return resolverInternal._openRedirect(userInternal.auth, provider, \"linkViaRedirect\" /* AuthEventType.LINK_VIA_REDIRECT */, eventId);\r\n}\r\n/**\r\n * Returns a {@link UserCredential} from the redirect-based sign-in flow.\r\n *\r\n * @remarks\r\n * If sign-in succeeded, returns the signed in user. If sign-in was unsuccessful, fails with an\r\n * error. If no redirect operation was called, returns `null`.\r\n *\r\n * This method does not work in a Node.js environment or with {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new FacebookAuthProvider();\r\n * // You can add additional scopes to the provider:\r\n * provider.addScope('user_birthday');\r\n * // Start a sign in process for an unauthenticated user.\r\n * await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * if (result) {\r\n * // This is the signed-in user\r\n * const user = result.user;\r\n * // This gives you a Facebook Access Token.\r\n * const credential = provider.credentialFromResult(auth, result);\r\n * const token = credential.accessToken;\r\n * }\r\n * // As this API can be used for sign-in, linking and reauthentication,\r\n * // check the operationType to determine what triggered this redirect\r\n * // operation.\r\n * const operationType = result.operationType;\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\r\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\r\n *\r\n * @public\r\n */\r\nasync function getRedirectResult(auth, resolver) {\r\n await _castAuth(auth)._initializationPromise;\r\n return _getRedirectResult(auth, resolver, false);\r\n}\r\nasync function _getRedirectResult(auth, resolverExtern, bypassAuthState = false) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const authInternal = _castAuth(auth);\r\n const resolver = _withDefaultResolver(authInternal, resolverExtern);\r\n const action = new RedirectAction(authInternal, resolver, bypassAuthState);\r\n const result = await action.execute();\r\n if (result && !bypassAuthState) {\r\n delete result.user._redirectEventId;\r\n await authInternal._persistUserIfCurrent(result.user);\r\n await authInternal._setRedirectUser(null, resolverExtern);\r\n }\r\n return result;\r\n}\r\nasync function prepareUserForRedirect(user) {\r\n const eventId = _generateEventId(`${user.uid}:::`);\r\n user._redirectEventId = eventId;\r\n await user.auth._setRedirectUser(user);\r\n await user.auth._persistUserIfCurrent(user);\r\n return eventId;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// The amount of time to store the UIDs of seen events; this is\r\n// set to 10 min by default\r\nconst EVENT_DUPLICATION_CACHE_DURATION_MS = 10 * 60 * 1000;\r\nclass AuthEventManager {\r\n constructor(auth) {\r\n this.auth = auth;\r\n this.cachedEventUids = new Set();\r\n this.consumers = new Set();\r\n this.queuedRedirectEvent = null;\r\n this.hasHandledPotentialRedirect = false;\r\n this.lastProcessedEventTime = Date.now();\r\n }\r\n registerConsumer(authEventConsumer) {\r\n this.consumers.add(authEventConsumer);\r\n if (this.queuedRedirectEvent &&\r\n this.isEventForConsumer(this.queuedRedirectEvent, authEventConsumer)) {\r\n this.sendToConsumer(this.queuedRedirectEvent, authEventConsumer);\r\n this.saveEventToCache(this.queuedRedirectEvent);\r\n this.queuedRedirectEvent = null;\r\n }\r\n }\r\n unregisterConsumer(authEventConsumer) {\r\n this.consumers.delete(authEventConsumer);\r\n }\r\n onEvent(event) {\r\n // Check if the event has already been handled\r\n if (this.hasEventBeenHandled(event)) {\r\n return false;\r\n }\r\n let handled = false;\r\n this.consumers.forEach(consumer => {\r\n if (this.isEventForConsumer(event, consumer)) {\r\n handled = true;\r\n this.sendToConsumer(event, consumer);\r\n this.saveEventToCache(event);\r\n }\r\n });\r\n if (this.hasHandledPotentialRedirect || !isRedirectEvent(event)) {\r\n // If we've already seen a redirect before, or this is a popup event,\r\n // bail now\r\n return handled;\r\n }\r\n this.hasHandledPotentialRedirect = true;\r\n // If the redirect wasn't handled, hang on to it\r\n if (!handled) {\r\n this.queuedRedirectEvent = event;\r\n handled = true;\r\n }\r\n return handled;\r\n }\r\n sendToConsumer(event, consumer) {\r\n var _a;\r\n if (event.error && !isNullRedirectEvent(event)) {\r\n const code = ((_a = event.error.code) === null || _a === void 0 ? void 0 : _a.split('auth/')[1]) ||\r\n \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */;\r\n consumer.onError(_createError(this.auth, code));\r\n }\r\n else {\r\n consumer.onAuthEvent(event);\r\n }\r\n }\r\n isEventForConsumer(event, consumer) {\r\n const eventIdMatches = consumer.eventId === null ||\r\n (!!event.eventId && event.eventId === consumer.eventId);\r\n return consumer.filter.includes(event.type) && eventIdMatches;\r\n }\r\n hasEventBeenHandled(event) {\r\n if (Date.now() - this.lastProcessedEventTime >=\r\n EVENT_DUPLICATION_CACHE_DURATION_MS) {\r\n this.cachedEventUids.clear();\r\n }\r\n return this.cachedEventUids.has(eventUid(event));\r\n }\r\n saveEventToCache(event) {\r\n this.cachedEventUids.add(eventUid(event));\r\n this.lastProcessedEventTime = Date.now();\r\n }\r\n}\r\nfunction eventUid(e) {\r\n return [e.type, e.eventId, e.sessionId, e.tenantId].filter(v => v).join('-');\r\n}\r\nfunction isNullRedirectEvent({ type, error }) {\r\n return (type === \"unknown\" /* AuthEventType.UNKNOWN */ &&\r\n (error === null || error === void 0 ? void 0 : error.code) === `auth/${\"no-auth-event\" /* AuthErrorCode.NO_AUTH_EVENT */}`);\r\n}\r\nfunction isRedirectEvent(event) {\r\n switch (event.type) {\r\n case \"signInViaRedirect\" /* AuthEventType.SIGN_IN_VIA_REDIRECT */:\r\n case \"linkViaRedirect\" /* AuthEventType.LINK_VIA_REDIRECT */:\r\n case \"reauthViaRedirect\" /* AuthEventType.REAUTH_VIA_REDIRECT */:\r\n return true;\r\n case \"unknown\" /* AuthEventType.UNKNOWN */:\r\n return isNullRedirectEvent(event);\r\n default:\r\n return false;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function _getProjectConfig(auth, request = {}) {\r\n return _performApiRequest(auth, \"GET\" /* HttpMethod.GET */, \"/v1/projects\" /* Endpoint.GET_PROJECT_CONFIG */, request);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst IP_ADDRESS_REGEX = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\r\nconst HTTP_REGEX = /^https?/;\r\nasync function _validateOrigin(auth) {\r\n // Skip origin validation if we are in an emulated environment\r\n if (auth.config.emulator) {\r\n return;\r\n }\r\n const { authorizedDomains } = await _getProjectConfig(auth);\r\n for (const domain of authorizedDomains) {\r\n try {\r\n if (matchDomain(domain)) {\r\n return;\r\n }\r\n }\r\n catch (_a) {\r\n // Do nothing if there's a URL error; just continue searching\r\n }\r\n }\r\n // In the old SDK, this error also provides helpful messages.\r\n _fail(auth, \"unauthorized-domain\" /* AuthErrorCode.INVALID_ORIGIN */);\r\n}\r\nfunction matchDomain(expected) {\r\n const currentUrl = _getCurrentUrl();\r\n const { protocol, hostname } = new URL(currentUrl);\r\n if (expected.startsWith('chrome-extension://')) {\r\n const ceUrl = new URL(expected);\r\n if (ceUrl.hostname === '' && hostname === '') {\r\n // For some reason we're not parsing chrome URLs properly\r\n return (protocol === 'chrome-extension:' &&\r\n expected.replace('chrome-extension://', '') ===\r\n currentUrl.replace('chrome-extension://', ''));\r\n }\r\n return protocol === 'chrome-extension:' && ceUrl.hostname === hostname;\r\n }\r\n if (!HTTP_REGEX.test(protocol)) {\r\n return false;\r\n }\r\n if (IP_ADDRESS_REGEX.test(expected)) {\r\n // The domain has to be exactly equal to the pattern, as an IP domain will\r\n // only contain the IP, no extra character.\r\n return hostname === expected;\r\n }\r\n // Dots in pattern should be escaped.\r\n const escapedDomainPattern = expected.replace(/\\./g, '\\\\.');\r\n // Non ip address domains.\r\n // domain.com = *.domain.com OR domain.com\r\n const re = new RegExp('^(.+\\\\.' + escapedDomainPattern + '|' + escapedDomainPattern + ')$', 'i');\r\n return re.test(hostname);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst NETWORK_TIMEOUT = new Delay(30000, 60000);\r\n/**\r\n * Reset unloaded GApi modules. If gapi.load fails due to a network error,\r\n * it will stop working after a retrial. This is a hack to fix this issue.\r\n */\r\nfunction resetUnloadedGapiModules() {\r\n // Clear last failed gapi.load state to force next gapi.load to first\r\n // load the failed gapi.iframes module.\r\n // Get gapix.beacon context.\r\n const beacon = _window().___jsl;\r\n // Get current hint.\r\n if (beacon === null || beacon === void 0 ? void 0 : beacon.H) {\r\n // Get gapi hint.\r\n for (const hint of Object.keys(beacon.H)) {\r\n // Requested modules.\r\n beacon.H[hint].r = beacon.H[hint].r || [];\r\n // Loaded modules.\r\n beacon.H[hint].L = beacon.H[hint].L || [];\r\n // Set requested modules to a copy of the loaded modules.\r\n beacon.H[hint].r = [...beacon.H[hint].L];\r\n // Clear pending callbacks.\r\n if (beacon.CP) {\r\n for (let i = 0; i < beacon.CP.length; i++) {\r\n // Remove all failed pending callbacks.\r\n beacon.CP[i] = null;\r\n }\r\n }\r\n }\r\n }\r\n}\r\nfunction loadGapi(auth) {\r\n return new Promise((resolve, reject) => {\r\n var _a, _b, _c;\r\n // Function to run when gapi.load is ready.\r\n function loadGapiIframe() {\r\n // The developer may have tried to previously run gapi.load and failed.\r\n // Run this to fix that.\r\n resetUnloadedGapiModules();\r\n gapi.load('gapi.iframes', {\r\n callback: () => {\r\n resolve(gapi.iframes.getContext());\r\n },\r\n ontimeout: () => {\r\n // The above reset may be sufficient, but having this reset after\r\n // failure ensures that if the developer calls gapi.load after the\r\n // connection is re-established and before another attempt to embed\r\n // the iframe, it would work and would not be broken because of our\r\n // failed attempt.\r\n // Timeout when gapi.iframes.Iframe not loaded.\r\n resetUnloadedGapiModules();\r\n reject(_createError(auth, \"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */));\r\n },\r\n timeout: NETWORK_TIMEOUT.get()\r\n });\r\n }\r\n if ((_b = (_a = _window().gapi) === null || _a === void 0 ? void 0 : _a.iframes) === null || _b === void 0 ? void 0 : _b.Iframe) {\r\n // If gapi.iframes.Iframe available, resolve.\r\n resolve(gapi.iframes.getContext());\r\n }\r\n else if (!!((_c = _window().gapi) === null || _c === void 0 ? void 0 : _c.load)) {\r\n // Gapi loader ready, load gapi.iframes.\r\n loadGapiIframe();\r\n }\r\n else {\r\n // Create a new iframe callback when this is called so as not to overwrite\r\n // any previous defined callback. This happens if this method is called\r\n // multiple times in parallel and could result in the later callback\r\n // overwriting the previous one. This would end up with a iframe\r\n // timeout.\r\n const cbName = _generateCallbackName('iframefcb');\r\n // GApi loader not available, dynamically load platform.js.\r\n _window()[cbName] = () => {\r\n // GApi loader should be ready.\r\n if (!!gapi.load) {\r\n loadGapiIframe();\r\n }\r\n else {\r\n // Gapi loader failed, throw error.\r\n reject(_createError(auth, \"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */));\r\n }\r\n };\r\n // Load GApi loader.\r\n return _loadJS(`${_gapiScriptUrl()}?onload=${cbName}`)\r\n .catch(e => reject(e));\r\n }\r\n }).catch(error => {\r\n // Reset cached promise to allow for retrial.\r\n cachedGApiLoader = null;\r\n throw error;\r\n });\r\n}\r\nlet cachedGApiLoader = null;\r\nfunction _loadGapi(auth) {\r\n cachedGApiLoader = cachedGApiLoader || loadGapi(auth);\r\n return cachedGApiLoader;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst PING_TIMEOUT = new Delay(5000, 15000);\r\nconst IFRAME_PATH = '__/auth/iframe';\r\nconst EMULATED_IFRAME_PATH = 'emulator/auth/iframe';\r\nconst IFRAME_ATTRIBUTES = {\r\n style: {\r\n position: 'absolute',\r\n top: '-100px',\r\n width: '1px',\r\n height: '1px'\r\n },\r\n 'aria-hidden': 'true',\r\n tabindex: '-1'\r\n};\r\n// Map from apiHost to endpoint ID for passing into iframe. In current SDK, apiHost can be set to\r\n// anything (not from a list of endpoints with IDs as in legacy), so this is the closest we can get.\r\nconst EID_FROM_APIHOST = new Map([\r\n [\"identitytoolkit.googleapis.com\" /* DefaultConfig.API_HOST */, 'p'],\r\n ['staging-identitytoolkit.sandbox.googleapis.com', 's'],\r\n ['test-identitytoolkit.sandbox.googleapis.com', 't'] // test\r\n]);\r\nfunction getIframeUrl(auth) {\r\n const config = auth.config;\r\n _assert(config.authDomain, auth, \"auth-domain-config-required\" /* AuthErrorCode.MISSING_AUTH_DOMAIN */);\r\n const url = config.emulator\r\n ? _emulatorUrl(config, EMULATED_IFRAME_PATH)\r\n : `https://${auth.config.authDomain}/${IFRAME_PATH}`;\r\n const params = {\r\n apiKey: config.apiKey,\r\n appName: auth.name,\r\n v: SDK_VERSION\r\n };\r\n const eid = EID_FROM_APIHOST.get(auth.config.apiHost);\r\n if (eid) {\r\n params.eid = eid;\r\n }\r\n const frameworks = auth._getFrameworks();\r\n if (frameworks.length) {\r\n params.fw = frameworks.join(',');\r\n }\r\n return `${url}?${querystring(params).slice(1)}`;\r\n}\r\nasync function _openIframe(auth) {\r\n const context = await _loadGapi(auth);\r\n const gapi = _window().gapi;\r\n _assert(gapi, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return context.open({\r\n where: document.body,\r\n url: getIframeUrl(auth),\r\n messageHandlersFilter: gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER,\r\n attributes: IFRAME_ATTRIBUTES,\r\n dontclear: true\r\n }, (iframe) => new Promise(async (resolve, reject) => {\r\n await iframe.restyle({\r\n // Prevent iframe from closing on mouse out.\r\n setHideOnLeave: false\r\n });\r\n const networkError = _createError(auth, \"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */);\r\n // Confirm iframe is correctly loaded.\r\n // To fallback on failure, set a timeout.\r\n const networkErrorTimer = _window().setTimeout(() => {\r\n reject(networkError);\r\n }, PING_TIMEOUT.get());\r\n // Clear timer and resolve pending iframe ready promise.\r\n function clearTimerAndResolve() {\r\n _window().clearTimeout(networkErrorTimer);\r\n resolve(iframe);\r\n }\r\n // This returns an IThenable. However the reject part does not call\r\n // when the iframe is not loaded.\r\n iframe.ping(clearTimerAndResolve).then(clearTimerAndResolve, () => {\r\n reject(networkError);\r\n });\r\n }));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst BASE_POPUP_OPTIONS = {\r\n location: 'yes',\r\n resizable: 'yes',\r\n statusbar: 'yes',\r\n toolbar: 'no'\r\n};\r\nconst DEFAULT_WIDTH = 500;\r\nconst DEFAULT_HEIGHT = 600;\r\nconst TARGET_BLANK = '_blank';\r\nconst FIREFOX_EMPTY_URL = 'http://localhost';\r\nclass AuthPopup {\r\n constructor(window) {\r\n this.window = window;\r\n this.associatedEvent = null;\r\n }\r\n close() {\r\n if (this.window) {\r\n try {\r\n this.window.close();\r\n }\r\n catch (e) { }\r\n }\r\n }\r\n}\r\nfunction _open(auth, url, name, width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT) {\r\n const top = Math.max((window.screen.availHeight - height) / 2, 0).toString();\r\n const left = Math.max((window.screen.availWidth - width) / 2, 0).toString();\r\n let target = '';\r\n const options = Object.assign(Object.assign({}, BASE_POPUP_OPTIONS), { width: width.toString(), height: height.toString(), top,\r\n left });\r\n // Chrome iOS 7 and 8 is returning an undefined popup win when target is\r\n // specified, even though the popup is not necessarily blocked.\r\n const ua = getUA().toLowerCase();\r\n if (name) {\r\n target = _isChromeIOS(ua) ? TARGET_BLANK : name;\r\n }\r\n if (_isFirefox(ua)) {\r\n // Firefox complains when invalid URLs are popped out. Hacky way to bypass.\r\n url = url || FIREFOX_EMPTY_URL;\r\n // Firefox disables by default scrolling on popup windows, which can create\r\n // issues when the user has many Google accounts, for instance.\r\n options.scrollbars = 'yes';\r\n }\r\n const optionsString = Object.entries(options).reduce((accum, [key, value]) => `${accum}${key}=${value},`, '');\r\n if (_isIOSStandalone(ua) && target !== '_self') {\r\n openAsNewWindowIOS(url || '', target);\r\n return new AuthPopup(null);\r\n }\r\n // about:blank getting sanitized causing browsers like IE/Edge to display\r\n // brief error message before redirecting to handler.\r\n const newWin = window.open(url || '', target, optionsString);\r\n _assert(newWin, auth, \"popup-blocked\" /* AuthErrorCode.POPUP_BLOCKED */);\r\n // Flaky on IE edge, encapsulate with a try and catch.\r\n try {\r\n newWin.focus();\r\n }\r\n catch (e) { }\r\n return new AuthPopup(newWin);\r\n}\r\nfunction openAsNewWindowIOS(url, target) {\r\n const el = document.createElement('a');\r\n el.href = url;\r\n el.target = target;\r\n const click = document.createEvent('MouseEvent');\r\n click.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 1, null);\r\n el.dispatchEvent(click);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * URL for Authentication widget which will initiate the OAuth handshake\r\n *\r\n * @internal\r\n */\r\nconst WIDGET_PATH = '__/auth/handler';\r\n/**\r\n * URL for emulated environment\r\n *\r\n * @internal\r\n */\r\nconst EMULATOR_WIDGET_PATH = 'emulator/auth/handler';\r\n/**\r\n * Fragment name for the App Check token that gets passed to the widget\r\n *\r\n * @internal\r\n */\r\nconst FIREBASE_APP_CHECK_FRAGMENT_ID = encodeURIComponent('fac');\r\nasync function _getRedirectUrl(auth, provider, authType, redirectUrl, eventId, additionalParams) {\r\n _assert(auth.config.authDomain, auth, \"auth-domain-config-required\" /* AuthErrorCode.MISSING_AUTH_DOMAIN */);\r\n _assert(auth.config.apiKey, auth, \"invalid-api-key\" /* AuthErrorCode.INVALID_API_KEY */);\r\n const params = {\r\n apiKey: auth.config.apiKey,\r\n appName: auth.name,\r\n authType,\r\n redirectUrl,\r\n v: SDK_VERSION,\r\n eventId\r\n };\r\n if (provider instanceof FederatedAuthProvider) {\r\n provider.setDefaultLanguage(auth.languageCode);\r\n params.providerId = provider.providerId || '';\r\n if (!isEmpty(provider.getCustomParameters())) {\r\n params.customParameters = JSON.stringify(provider.getCustomParameters());\r\n }\r\n // TODO set additionalParams from the provider as well?\r\n for (const [key, value] of Object.entries(additionalParams || {})) {\r\n params[key] = value;\r\n }\r\n }\r\n if (provider instanceof BaseOAuthProvider) {\r\n const scopes = provider.getScopes().filter(scope => scope !== '');\r\n if (scopes.length > 0) {\r\n params.scopes = scopes.join(',');\r\n }\r\n }\r\n if (auth.tenantId) {\r\n params.tid = auth.tenantId;\r\n }\r\n // TODO: maybe set eid as endpointId\r\n // TODO: maybe set fw as Frameworks.join(\",\")\r\n const paramsDict = params;\r\n for (const key of Object.keys(paramsDict)) {\r\n if (paramsDict[key] === undefined) {\r\n delete paramsDict[key];\r\n }\r\n }\r\n // Sets the App Check token to pass to the widget\r\n const appCheckToken = await auth._getAppCheckToken();\r\n const appCheckTokenFragment = appCheckToken\r\n ? `#${FIREBASE_APP_CHECK_FRAGMENT_ID}=${encodeURIComponent(appCheckToken)}`\r\n : '';\r\n // Start at index 1 to skip the leading '&' in the query string\r\n return `${getHandlerBase(auth)}?${querystring(paramsDict).slice(1)}${appCheckTokenFragment}`;\r\n}\r\nfunction getHandlerBase({ config }) {\r\n if (!config.emulator) {\r\n return `https://${config.authDomain}/${WIDGET_PATH}`;\r\n }\r\n return _emulatorUrl(config, EMULATOR_WIDGET_PATH);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The special web storage event\r\n *\r\n */\r\nconst WEB_STORAGE_SUPPORT_KEY = 'webStorageSupport';\r\nclass BrowserPopupRedirectResolver {\r\n constructor() {\r\n this.eventManagers = {};\r\n this.iframes = {};\r\n this.originValidationPromises = {};\r\n this._redirectPersistence = browserSessionPersistence;\r\n this._completeRedirectFn = _getRedirectResult;\r\n this._overrideRedirectResult = _overrideRedirectResult;\r\n }\r\n // Wrapping in async even though we don't await anywhere in order\r\n // to make sure errors are raised as promise rejections\r\n async _openPopup(auth, provider, authType, eventId) {\r\n var _a;\r\n debugAssert((_a = this.eventManagers[auth._key()]) === null || _a === void 0 ? void 0 : _a.manager, '_initialize() not called before _openPopup()');\r\n const url = await _getRedirectUrl(auth, provider, authType, _getCurrentUrl(), eventId);\r\n return _open(auth, url, _generateEventId());\r\n }\r\n async _openRedirect(auth, provider, authType, eventId) {\r\n await this._originValidation(auth);\r\n const url = await _getRedirectUrl(auth, provider, authType, _getCurrentUrl(), eventId);\r\n _setWindowLocation(url);\r\n return new Promise(() => { });\r\n }\r\n _initialize(auth) {\r\n const key = auth._key();\r\n if (this.eventManagers[key]) {\r\n const { manager, promise } = this.eventManagers[key];\r\n if (manager) {\r\n return Promise.resolve(manager);\r\n }\r\n else {\r\n debugAssert(promise, 'If manager is not set, promise should be');\r\n return promise;\r\n }\r\n }\r\n const promise = this.initAndGetManager(auth);\r\n this.eventManagers[key] = { promise };\r\n // If the promise is rejected, the key should be removed so that the\r\n // operation can be retried later.\r\n promise.catch(() => {\r\n delete this.eventManagers[key];\r\n });\r\n return promise;\r\n }\r\n async initAndGetManager(auth) {\r\n const iframe = await _openIframe(auth);\r\n const manager = new AuthEventManager(auth);\r\n iframe.register('authEvent', (iframeEvent) => {\r\n _assert(iframeEvent === null || iframeEvent === void 0 ? void 0 : iframeEvent.authEvent, auth, \"invalid-auth-event\" /* AuthErrorCode.INVALID_AUTH_EVENT */);\r\n // TODO: Consider splitting redirect and popup events earlier on\r\n const handled = manager.onEvent(iframeEvent.authEvent);\r\n return { status: handled ? \"ACK\" /* GapiOutcome.ACK */ : \"ERROR\" /* GapiOutcome.ERROR */ };\r\n }, gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER);\r\n this.eventManagers[auth._key()] = { manager };\r\n this.iframes[auth._key()] = iframe;\r\n return manager;\r\n }\r\n _isIframeWebStorageSupported(auth, cb) {\r\n const iframe = this.iframes[auth._key()];\r\n iframe.send(WEB_STORAGE_SUPPORT_KEY, { type: WEB_STORAGE_SUPPORT_KEY }, result => {\r\n var _a;\r\n const isSupported = (_a = result === null || result === void 0 ? void 0 : result[0]) === null || _a === void 0 ? void 0 : _a[WEB_STORAGE_SUPPORT_KEY];\r\n if (isSupported !== undefined) {\r\n cb(!!isSupported);\r\n }\r\n _fail(auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }, gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER);\r\n }\r\n _originValidation(auth) {\r\n const key = auth._key();\r\n if (!this.originValidationPromises[key]) {\r\n this.originValidationPromises[key] = _validateOrigin(auth);\r\n }\r\n return this.originValidationPromises[key];\r\n }\r\n get _shouldInitProactively() {\r\n // Mobile browsers and Safari need to optimistically initialize\r\n return _isMobileBrowser() || _isSafari() || _isIOS();\r\n }\r\n}\r\n/**\r\n * An implementation of {@link PopupRedirectResolver} suitable for browser\r\n * based applications.\r\n *\r\n * @remarks\r\n * This method does not work in a Node.js environment.\r\n *\r\n * @public\r\n */\r\nconst browserPopupRedirectResolver = BrowserPopupRedirectResolver;\n\nclass MultiFactorAssertionImpl {\r\n constructor(factorId) {\r\n this.factorId = factorId;\r\n }\r\n _process(auth, session, displayName) {\r\n switch (session.type) {\r\n case \"enroll\" /* MultiFactorSessionType.ENROLL */:\r\n return this._finalizeEnroll(auth, session.credential, displayName);\r\n case \"signin\" /* MultiFactorSessionType.SIGN_IN */:\r\n return this._finalizeSignIn(auth, session.credential);\r\n default:\r\n return debugFail('unexpected MultiFactorSessionType');\r\n }\r\n }\r\n}\n\n/**\r\n * {@inheritdoc PhoneMultiFactorAssertion}\r\n *\r\n * @public\r\n */\r\nclass PhoneMultiFactorAssertionImpl extends MultiFactorAssertionImpl {\r\n constructor(credential) {\r\n super(\"phone\" /* FactorId.PHONE */);\r\n this.credential = credential;\r\n }\r\n /** @internal */\r\n static _fromCredential(credential) {\r\n return new PhoneMultiFactorAssertionImpl(credential);\r\n }\r\n /** @internal */\r\n _finalizeEnroll(auth, idToken, displayName) {\r\n return finalizeEnrollPhoneMfa(auth, {\r\n idToken,\r\n displayName,\r\n phoneVerificationInfo: this.credential._makeVerificationRequest()\r\n });\r\n }\r\n /** @internal */\r\n _finalizeSignIn(auth, mfaPendingCredential) {\r\n return finalizeSignInPhoneMfa(auth, {\r\n mfaPendingCredential,\r\n phoneVerificationInfo: this.credential._makeVerificationRequest()\r\n });\r\n }\r\n}\r\n/**\r\n * Provider for generating a {@link PhoneMultiFactorAssertion}.\r\n *\r\n * @public\r\n */\r\nclass PhoneMultiFactorGenerator {\r\n constructor() { }\r\n /**\r\n * Provides a {@link PhoneMultiFactorAssertion} to confirm ownership of the phone second factor.\r\n *\r\n * @remarks\r\n * This method does not work in a Node.js environment.\r\n *\r\n * @param phoneAuthCredential - A credential provided by {@link PhoneAuthProvider.credential}.\r\n * @returns A {@link PhoneMultiFactorAssertion} which can be used with\r\n * {@link MultiFactorResolver.resolveSignIn}\r\n */\r\n static assertion(credential) {\r\n return PhoneMultiFactorAssertionImpl._fromCredential(credential);\r\n }\r\n}\r\n/**\r\n * The identifier of the phone second factor: `phone`.\r\n */\r\nPhoneMultiFactorGenerator.FACTOR_ID = 'phone';\n\n/**\r\n * Provider for generating a {@link TotpMultiFactorAssertion}.\r\n *\r\n * @public\r\n */\r\nclass TotpMultiFactorGenerator {\r\n /**\r\n * Provides a {@link TotpMultiFactorAssertion} to confirm ownership of\r\n * the TOTP (time-based one-time password) second factor.\r\n * This assertion is used to complete enrollment in TOTP second factor.\r\n *\r\n * @param secret A {@link TotpSecret} containing the shared secret key and other TOTP parameters.\r\n * @param oneTimePassword One-time password from TOTP App.\r\n * @returns A {@link TotpMultiFactorAssertion} which can be used with\r\n * {@link MultiFactorUser.enroll}.\r\n */\r\n static assertionForEnrollment(secret, oneTimePassword) {\r\n return TotpMultiFactorAssertionImpl._fromSecret(secret, oneTimePassword);\r\n }\r\n /**\r\n * Provides a {@link TotpMultiFactorAssertion} to confirm ownership of the TOTP second factor.\r\n * This assertion is used to complete signIn with TOTP as the second factor.\r\n *\r\n * @param enrollmentId identifies the enrolled TOTP second factor.\r\n * @param oneTimePassword One-time password from TOTP App.\r\n * @returns A {@link TotpMultiFactorAssertion} which can be used with\r\n * {@link MultiFactorResolver.resolveSignIn}.\r\n */\r\n static assertionForSignIn(enrollmentId, oneTimePassword) {\r\n return TotpMultiFactorAssertionImpl._fromEnrollmentId(enrollmentId, oneTimePassword);\r\n }\r\n /**\r\n * Returns a promise to {@link TotpSecret} which contains the TOTP shared secret key and other parameters.\r\n * Creates a TOTP secret as part of enrolling a TOTP second factor.\r\n * Used for generating a QR code URL or inputting into a TOTP app.\r\n * This method uses the auth instance corresponding to the user in the multiFactorSession.\r\n *\r\n * @param session The {@link MultiFactorSession} that the user is part of.\r\n * @returns A promise to {@link TotpSecret}.\r\n */\r\n static async generateSecret(session) {\r\n var _a;\r\n const mfaSession = session;\r\n _assert(typeof ((_a = mfaSession.user) === null || _a === void 0 ? void 0 : _a.auth) !== 'undefined', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const response = await startEnrollTotpMfa(mfaSession.user.auth, {\r\n idToken: mfaSession.credential,\r\n totpEnrollmentInfo: {}\r\n });\r\n return TotpSecret._fromStartTotpMfaEnrollmentResponse(response, mfaSession.user.auth);\r\n }\r\n}\r\n/**\r\n * The identifier of the TOTP second factor: `totp`.\r\n */\r\nTotpMultiFactorGenerator.FACTOR_ID = \"totp\" /* FactorId.TOTP */;\r\nclass TotpMultiFactorAssertionImpl extends MultiFactorAssertionImpl {\r\n constructor(otp, enrollmentId, secret) {\r\n super(\"totp\" /* FactorId.TOTP */);\r\n this.otp = otp;\r\n this.enrollmentId = enrollmentId;\r\n this.secret = secret;\r\n }\r\n /** @internal */\r\n static _fromSecret(secret, otp) {\r\n return new TotpMultiFactorAssertionImpl(otp, undefined, secret);\r\n }\r\n /** @internal */\r\n static _fromEnrollmentId(enrollmentId, otp) {\r\n return new TotpMultiFactorAssertionImpl(otp, enrollmentId);\r\n }\r\n /** @internal */\r\n async _finalizeEnroll(auth, idToken, displayName) {\r\n _assert(typeof this.secret !== 'undefined', auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n return finalizeEnrollTotpMfa(auth, {\r\n idToken,\r\n displayName,\r\n totpVerificationInfo: this.secret._makeTotpVerificationInfo(this.otp)\r\n });\r\n }\r\n /** @internal */\r\n async _finalizeSignIn(auth, mfaPendingCredential) {\r\n _assert(this.enrollmentId !== undefined && this.otp !== undefined, auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n const totpVerificationInfo = { verificationCode: this.otp };\r\n return finalizeSignInTotpMfa(auth, {\r\n mfaPendingCredential,\r\n mfaEnrollmentId: this.enrollmentId,\r\n totpVerificationInfo\r\n });\r\n }\r\n}\r\n/**\r\n * Provider for generating a {@link TotpMultiFactorAssertion}.\r\n *\r\n * Stores the shared secret key and other parameters to generate time-based OTPs.\r\n * Implements methods to retrieve the shared secret key and generate a QR code URL.\r\n * @public\r\n */\r\nclass TotpSecret {\r\n // The public members are declared outside the constructor so the docs can be generated.\r\n constructor(secretKey, hashingAlgorithm, codeLength, codeIntervalSeconds, enrollmentCompletionDeadline, sessionInfo, auth) {\r\n this.sessionInfo = sessionInfo;\r\n this.auth = auth;\r\n this.secretKey = secretKey;\r\n this.hashingAlgorithm = hashingAlgorithm;\r\n this.codeLength = codeLength;\r\n this.codeIntervalSeconds = codeIntervalSeconds;\r\n this.enrollmentCompletionDeadline = enrollmentCompletionDeadline;\r\n }\r\n /** @internal */\r\n static _fromStartTotpMfaEnrollmentResponse(response, auth) {\r\n return new TotpSecret(response.totpSessionInfo.sharedSecretKey, response.totpSessionInfo.hashingAlgorithm, response.totpSessionInfo.verificationCodeLength, response.totpSessionInfo.periodSec, new Date(response.totpSessionInfo.finalizeEnrollmentTime).toUTCString(), response.totpSessionInfo.sessionInfo, auth);\r\n }\r\n /** @internal */\r\n _makeTotpVerificationInfo(otp) {\r\n return { sessionInfo: this.sessionInfo, verificationCode: otp };\r\n }\r\n /**\r\n * Returns a QR code URL as described in\r\n * https://github.com/google/google-authenticator/wiki/Key-Uri-Format\r\n * This can be displayed to the user as a QR code to be scanned into a TOTP app like Google Authenticator.\r\n * If the optional parameters are unspecified, an accountName of and issuer of are used.\r\n *\r\n * @param accountName the name of the account/app along with a user identifier.\r\n * @param issuer issuer of the TOTP (likely the app name).\r\n * @returns A QR code URL string.\r\n */\r\n generateQrCodeUrl(accountName, issuer) {\r\n var _a;\r\n let useDefaults = false;\r\n if (_isEmptyString(accountName) || _isEmptyString(issuer)) {\r\n useDefaults = true;\r\n }\r\n if (useDefaults) {\r\n if (_isEmptyString(accountName)) {\r\n accountName = ((_a = this.auth.currentUser) === null || _a === void 0 ? void 0 : _a.email) || 'unknownuser';\r\n }\r\n if (_isEmptyString(issuer)) {\r\n issuer = this.auth.name;\r\n }\r\n }\r\n return `otpauth://totp/${issuer}:${accountName}?secret=${this.secretKey}&issuer=${issuer}&algorithm=${this.hashingAlgorithm}&digits=${this.codeLength}`;\r\n }\r\n}\r\n/** @internal */\r\nfunction _isEmptyString(input) {\r\n return typeof input === 'undefined' || (input === null || input === void 0 ? void 0 : input.length) === 0;\r\n}\n\nvar name = \"@firebase/auth\";\nvar version = \"1.7.9\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass AuthInterop {\r\n constructor(auth) {\r\n this.auth = auth;\r\n this.internalListeners = new Map();\r\n }\r\n getUid() {\r\n var _a;\r\n this.assertAuthConfigured();\r\n return ((_a = this.auth.currentUser) === null || _a === void 0 ? void 0 : _a.uid) || null;\r\n }\r\n async getToken(forceRefresh) {\r\n this.assertAuthConfigured();\r\n await this.auth._initializationPromise;\r\n if (!this.auth.currentUser) {\r\n return null;\r\n }\r\n const accessToken = await this.auth.currentUser.getIdToken(forceRefresh);\r\n return { accessToken };\r\n }\r\n addAuthTokenListener(listener) {\r\n this.assertAuthConfigured();\r\n if (this.internalListeners.has(listener)) {\r\n return;\r\n }\r\n const unsubscribe = this.auth.onIdTokenChanged(user => {\r\n listener((user === null || user === void 0 ? void 0 : user.stsTokenManager.accessToken) || null);\r\n });\r\n this.internalListeners.set(listener, unsubscribe);\r\n this.updateProactiveRefresh();\r\n }\r\n removeAuthTokenListener(listener) {\r\n this.assertAuthConfigured();\r\n const unsubscribe = this.internalListeners.get(listener);\r\n if (!unsubscribe) {\r\n return;\r\n }\r\n this.internalListeners.delete(listener);\r\n unsubscribe();\r\n this.updateProactiveRefresh();\r\n }\r\n assertAuthConfigured() {\r\n _assert(this.auth._initializationPromise, \"dependent-sdk-initialized-before-auth\" /* AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH */);\r\n }\r\n updateProactiveRefresh() {\r\n if (this.internalListeners.size > 0) {\r\n this.auth._startProactiveRefresh();\r\n }\r\n else {\r\n this.auth._stopProactiveRefresh();\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getVersionForPlatform(clientPlatform) {\r\n switch (clientPlatform) {\r\n case \"Node\" /* ClientPlatform.NODE */:\r\n return 'node';\r\n case \"ReactNative\" /* ClientPlatform.REACT_NATIVE */:\r\n return 'rn';\r\n case \"Worker\" /* ClientPlatform.WORKER */:\r\n return 'webworker';\r\n case \"Cordova\" /* ClientPlatform.CORDOVA */:\r\n return 'cordova';\r\n case \"WebExtension\" /* ClientPlatform.WEB_EXTENSION */:\r\n return 'web-extension';\r\n default:\r\n return undefined;\r\n }\r\n}\r\n/** @internal */\r\nfunction registerAuth(clientPlatform) {\r\n _registerComponent(new Component(\"auth\" /* _ComponentName.AUTH */, (container, { options: deps }) => {\r\n const app = container.getProvider('app').getImmediate();\r\n const heartbeatServiceProvider = container.getProvider('heartbeat');\r\n const appCheckServiceProvider = container.getProvider('app-check-internal');\r\n const { apiKey, authDomain } = app.options;\r\n _assert(apiKey && !apiKey.includes(':'), \"invalid-api-key\" /* AuthErrorCode.INVALID_API_KEY */, { appName: app.name });\r\n const config = {\r\n apiKey,\r\n authDomain,\r\n clientPlatform,\r\n apiHost: \"identitytoolkit.googleapis.com\" /* DefaultConfig.API_HOST */,\r\n tokenApiHost: \"securetoken.googleapis.com\" /* DefaultConfig.TOKEN_API_HOST */,\r\n apiScheme: \"https\" /* DefaultConfig.API_SCHEME */,\r\n sdkClientVersion: _getClientVersion(clientPlatform)\r\n };\r\n const authInstance = new AuthImpl(app, heartbeatServiceProvider, appCheckServiceProvider, config);\r\n _initializeAuthInstance(authInstance, deps);\r\n return authInstance;\r\n }, \"PUBLIC\" /* ComponentType.PUBLIC */)\r\n /**\r\n * Auth can only be initialized by explicitly calling getAuth() or initializeAuth()\r\n * For why we do this, See go/firebase-next-auth-init\r\n */\r\n .setInstantiationMode(\"EXPLICIT\" /* InstantiationMode.EXPLICIT */)\r\n /**\r\n * Because all firebase products that depend on auth depend on auth-internal directly,\r\n * we need to initialize auth-internal after auth is initialized to make it available to other firebase products.\r\n */\r\n .setInstanceCreatedCallback((container, _instanceIdentifier, _instance) => {\r\n const authInternalProvider = container.getProvider(\"auth-internal\" /* _ComponentName.AUTH_INTERNAL */);\r\n authInternalProvider.initialize();\r\n }));\r\n _registerComponent(new Component(\"auth-internal\" /* _ComponentName.AUTH_INTERNAL */, container => {\r\n const auth = _castAuth(container.getProvider(\"auth\" /* _ComponentName.AUTH */).getImmediate());\r\n return (auth => new AuthInterop(auth))(auth);\r\n }, \"PRIVATE\" /* ComponentType.PRIVATE */).setInstantiationMode(\"EXPLICIT\" /* InstantiationMode.EXPLICIT */));\r\n registerVersion(name, version, getVersionForPlatform(clientPlatform));\r\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n registerVersion(name, version, 'esm2017');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_ID_TOKEN_MAX_AGE = 5 * 60;\r\nconst authIdTokenMaxAge = getExperimentalSetting('authIdTokenMaxAge') || DEFAULT_ID_TOKEN_MAX_AGE;\r\nlet lastPostedIdToken = null;\r\nconst mintCookieFactory = (url) => async (user) => {\r\n const idTokenResult = user && (await user.getIdTokenResult());\r\n const idTokenAge = idTokenResult &&\r\n (new Date().getTime() - Date.parse(idTokenResult.issuedAtTime)) / 1000;\r\n if (idTokenAge && idTokenAge > authIdTokenMaxAge) {\r\n return;\r\n }\r\n // Specifically trip null => undefined when logged out, to delete any existing cookie\r\n const idToken = idTokenResult === null || idTokenResult === void 0 ? void 0 : idTokenResult.token;\r\n if (lastPostedIdToken === idToken) {\r\n return;\r\n }\r\n lastPostedIdToken = idToken;\r\n await fetch(url, {\r\n method: idToken ? 'POST' : 'DELETE',\r\n headers: idToken\r\n ? {\r\n 'Authorization': `Bearer ${idToken}`\r\n }\r\n : {}\r\n });\r\n};\r\n/**\r\n * Returns the Auth instance associated with the provided {@link @firebase/app#FirebaseApp}.\r\n * If no instance exists, initializes an Auth instance with platform-specific default dependencies.\r\n *\r\n * @param app - The Firebase App.\r\n *\r\n * @public\r\n */\r\nfunction getAuth(app = getApp()) {\r\n const provider = _getProvider(app, 'auth');\r\n if (provider.isInitialized()) {\r\n return provider.getImmediate();\r\n }\r\n const auth = initializeAuth(app, {\r\n popupRedirectResolver: browserPopupRedirectResolver,\r\n persistence: [\r\n indexedDBLocalPersistence,\r\n browserLocalPersistence,\r\n browserSessionPersistence\r\n ]\r\n });\r\n const authTokenSyncPath = getExperimentalSetting('authTokenSyncURL');\r\n // Only do the Cookie exchange in a secure context\r\n if (authTokenSyncPath &&\r\n typeof isSecureContext === 'boolean' &&\r\n isSecureContext) {\r\n // Don't allow urls (XSS possibility), only paths on the same domain\r\n const authTokenSyncUrl = new URL(authTokenSyncPath, location.origin);\r\n if (location.origin === authTokenSyncUrl.origin) {\r\n const mintCookie = mintCookieFactory(authTokenSyncUrl.toString());\r\n beforeAuthStateChanged(auth, mintCookie, () => mintCookie(auth.currentUser));\r\n onIdTokenChanged(auth, user => mintCookie(user));\r\n }\r\n }\r\n const authEmulatorHost = getDefaultEmulatorHost('auth');\r\n if (authEmulatorHost) {\r\n connectAuthEmulator(auth, `http://${authEmulatorHost}`);\r\n }\r\n return auth;\r\n}\r\nfunction getScriptParentElement() {\r\n var _a, _b;\r\n return (_b = (_a = document.getElementsByTagName('head')) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : document;\r\n}\r\n_setExternalJSProvider({\r\n loadJS(url) {\r\n // TODO: consider adding timeout support & cancellation\r\n return new Promise((resolve, reject) => {\r\n const el = document.createElement('script');\r\n el.setAttribute('src', url);\r\n el.onload = resolve;\r\n el.onerror = e => {\r\n const error = _createError(\"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n error.customData = e;\r\n reject(error);\r\n };\r\n el.type = 'text/javascript';\r\n el.charset = 'UTF-8';\r\n getScriptParentElement().appendChild(el);\r\n });\r\n },\r\n gapiScript: 'https://apis.google.com/js/api.js',\r\n recaptchaV2Script: 'https://www.google.com/recaptcha/api.js',\r\n recaptchaEnterpriseScript: 'https://www.google.com/recaptcha/enterprise.js?render='\r\n});\r\nregisterAuth(\"Browser\" /* ClientPlatform.BROWSER */);\n\nexport { TwitterAuthProvider as $, ActionCodeOperation as A, updateCurrentUser as B, signOut as C, revokeAccessToken as D, deleteUser as E, FactorId as F, debugErrorMap as G, prodErrorMap as H, AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY as I, initializeAuth as J, connectAuthEmulator as K, AuthCredential as L, EmailAuthCredential as M, OAuthCredential as N, OperationType as O, PhoneAuthProvider as P, PhoneAuthCredential as Q, RecaptchaVerifier as R, SignInMethod as S, TotpMultiFactorGenerator as T, inMemoryPersistence as U, EmailAuthProvider as V, FacebookAuthProvider as W, GoogleAuthProvider as X, GithubAuthProvider as Y, OAuthProvider as Z, SAMLAuthProvider as _, browserSessionPersistence as a, signInAnonymously as a0, signInWithCredential as a1, linkWithCredential as a2, reauthenticateWithCredential as a3, signInWithCustomToken as a4, sendPasswordResetEmail as a5, confirmPasswordReset as a6, applyActionCode as a7, checkActionCode as a8, verifyPasswordResetCode as a9, _isIOS7Or8 as aA, _createError as aB, _assert as aC, AuthEventManager as aD, _getInstance as aE, _persistenceKeyName as aF, _getRedirectResult as aG, _overrideRedirectResult as aH, _clearRedirectOutcomes as aI, _castAuth as aJ, UserImpl as aK, AuthImpl as aL, _getClientVersion as aM, _generateEventId as aN, AuthPopup as aO, FetchProvider as aP, SAMLAuthCredential as aQ, createUserWithEmailAndPassword as aa, signInWithEmailAndPassword as ab, sendSignInLinkToEmail as ac, isSignInWithEmailLink as ad, signInWithEmailLink as ae, fetchSignInMethodsForEmail as af, sendEmailVerification as ag, verifyBeforeUpdateEmail as ah, ActionCodeURL as ai, parseActionCodeURL as aj, updateProfile as ak, updateEmail as al, updatePassword as am, getIdToken as an, getIdTokenResult as ao, unlink as ap, getAdditionalUserInfo as aq, reload as ar, getMultiFactorResolver as as, multiFactor as at, debugAssert as au, _isIOS as av, _isAndroid as aw, _fail as ax, _getRedirectUrl as ay, _getProjectConfig as az, browserLocalPersistence as b, signInWithPopup as c, linkWithPopup as d, reauthenticateWithPopup as e, signInWithRedirect as f, linkWithRedirect as g, reauthenticateWithRedirect as h, indexedDBLocalPersistence as i, getRedirectResult as j, browserPopupRedirectResolver as k, linkWithPhoneNumber as l, PhoneMultiFactorGenerator as m, TotpSecret as n, getAuth as o, ProviderId as p, setPersistence as q, reauthenticateWithPhoneNumber as r, signInWithPhoneNumber as s, initializeRecaptchaConfig as t, updatePhoneNumber as u, validatePassword as v, onIdTokenChanged as w, beforeAuthStateChanged as x, onAuthStateChanged as y, useDeviceLanguage as z };\n//# sourceMappingURL=index-68602d24.js.map\n","import { initializeApp } from 'firebase/app'\nimport { Firestore, getFirestore } from 'firebase/firestore'\nimport { getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword } from 'firebase/auth'\nimport { useSettingsStore } from '@/stores/settings'\n\nexport let db: Firestore = null\n\nexport function initializeFirebase() {\n const settingsStore = useSettingsStore()\n\n if (!settingsStore.keySettings.firebaseConfig || !settingsStore.keySettings.firebaseConfig.apiKey) {\n console.error('Firebase configuration or API key not found in settings')\n }\n\n const app = initializeApp(settingsStore.keySettings.firebaseConfig)\n const tempDb = getFirestore(app)\n const auth = getAuth(app)\n\n login(auth)\n\n // update database when intialized\n db = tempDb\n\n return { tempDb, auth }\n}\n\nasync function login(auth) {\n const testEmail = 'test@example.com'\n const testPassword = 'dummyPassword123'\n try {\n // Try to create the user\n await createUserWithEmailAndPassword(auth, testEmail, testPassword)\n console.log('User created successfully')\n\n // Sign in the user\n await signInWithEmailAndPassword(auth, testEmail, testPassword)\n console.log('User signed in successfully')\n\n // Get the current user\n const user = auth.currentUser\n console.log('Current user:', user)\n } catch (error) {\n if (error.code === 'auth/email-already-in-use') {\n // If the email is already in use, sign in the user\n await signInWithEmailAndPassword(auth, testEmail, testPassword)\n console.log('User signed in successfully')\n\n // Get the current user\n const user = auth.currentUser\n console.log('Current user:', user)\n } else {\n console.error('Error:', error)\n }\n }\n}","import { toRaw, isProxy } from 'vue'\n\nimport type { Product, Assembly } from '@/models/material'\n\n/**\n * Removes all nested reactivity and returns a raw object\n * @param obj json object to convert\n * @returns object without reactivity\n */\nexport function deepToRaw(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n // Base case: return the value if it's not an object or array\n return obj\n }\n\n if (Array.isArray(obj)) {\n // If it's an array, iterate through the elements and deep convert\n return obj.map((item) => deepToRaw(item)) as unknown as T\n }\n\n if (isProxy(obj)) {\n // If the object is a reactive proxy, use toRaw to convert it\n obj = toRaw(obj)\n }\n\n // If it's a plain object, iterate through keys and deep convert values\n const result: any = {}\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = deepToRaw(obj[key])\n }\n }\n\n return result as T\n}\n\n/**\n * Sanitizer for undefined fields in an object eg. for use in firebase\n * @param obj json object to sanitize\n * @returns returns sanitized object\n */\nexport function removeUndefinedFields(obj: any): any {\n if (obj === null || typeof obj !== 'object') {\n return obj\n }\n\n return Array.isArray(obj)\n ? obj.map((item) => removeUndefinedFields(item))\n : Object.entries(obj)\n .filter(([_, value]) => value !== undefined)\n .reduce((acc, [key, value]) => {\n acc[key] = removeUndefinedFields(value) // Recursively process nested objects\n return acc\n }, {} as any)\n}\n\nexport const getEnumEntries = (enumObj: any) => {\n return Object.keys(enumObj)\n .filter((key) => isNaN(Number(key)))\n .map((key) => ({ label: key, value: enumObj[key] }))\n}","import { defineStore } from 'pinia'\nimport { db } from '@/firebase'\nimport type {\n\tFilterRegistry,\n FilterList\n} from '@/models/filters'\nimport { \n collection, \n addDoc,\n setDoc,\n query, \n where, \n orderBy, \n limit, \n getDocs,\n writeBatch\n} from 'firebase/firestore'\nimport type { \n Mapping,\n Assembly\n} from '@/models/material'\nimport type { \n Results, \n ResultList\n} from '@/models/result'\nimport type {\n FilterLog,\n MappingLog,\n ResultsLog,\n AssemblyList,\n CalculationSettingsLog\n} from '@/models/firebase'\n\nimport { \n deepToRaw,\n removeUndefinedFields\n } from '@/utils/dataUtils'\nimport type { CalculationSettings } from '@/models/settings'\n\nexport const useFirebaseStore = defineStore('firebase', {\n state: () => ({\n loading: false,\n error: null,\n }),\n actions: {\n /**\n * Saves the current filter state to the database, with a timestamp\n * @param projectId projectId which usually is the streamID from speckle\n * @param filterRegistry current loaded filterRegistry\n * @param stackName name of the filter state, eg. Archicad walls \n */\n async addFilterRegistry(projectId: string ,filterRegistry: FilterRegistry, stackName: string) {\n this.loading = true\n this.error = null\n try {\n const newStack: FilterLog = {\n projectId: projectId,\n stackName: stackName,\n filterCallStack: filterRegistry.filterCallStack,\n date: new Date(),\n }\n await addDoc(collection(db, 'projectFilters'), newStack)\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Saves the current filter state to the database, with a timestamp\n * @param projectId projectId which usually is the streamID from speckle\n * @param filterRegistry current loaded filterRegistry\n * @param stackName name of the filter state, eg. Archicad walls \n */\n async addFilterList(projectId: string ,filterList: FilterList, stackName: string) {\n this.loading = true\n this.error = null\n try {\n const newStack: FilterLog = {\n projectId: projectId,\n stackName: stackName,\n filterCallStack: filterList,\n date: new Date(),\n }\n await addDoc(collection(db, 'projectFilters'), newStack)\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Fetches the last 5 filterLogs for a project\n * @param projectId projectId which usually is the streamID from speckle\n * @returns last 5 filterLogs, or null if none found\n */\n async fetchLatestFilters(projectId: string): Promise {\n this.loading = true\n this.error = null\n try {\n const q = query(\n collection(db, 'projectFilters'),\n where('projectId', '==', projectId),\n orderBy('date', 'desc'),\n limit(5)\n )\n const querySnapshot = await getDocs(q)\n if (!querySnapshot.empty) {\n // Get the 5 latest filterstates\n const filterStates = querySnapshot.docs.map(doc => doc.data()) as FilterLog[]\n return filterStates\n } else {\n return null\n }\n } catch (error: any) {\n this.error = error.message\n return null\n } finally {\n this.loading = false\n }\n },\n\n\n /**\n * Returns the last generic filterLogs to be used as standard filters\n * @param resLimit Optional limit of results, default is 20\n * @returns last 20 generic filterLogs\n */\n async fetchGenericFilters(resLimit: number = 20): Promise {\n this.loading = true\n this.error = null\n try {\n const q = query(\n collection(db, 'genericFilters'),\n orderBy('date', 'desc'),\n limit(resLimit)\n )\n const querySnapshot = await getDocs(q)\n if (!querySnapshot.empty) {\n // Get the 20 latest generic filterstates\n const filterStates = querySnapshot.docs.map(doc => doc.data()) as FilterLog[]\n return filterStates\n } else {\n return []\n }\n } catch (error: any) {\n this.error = error.message\n return null\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Adds mapping to the firebase DB to save the current mapping progress\n * @param projectId projectId which usually is the streamID from speckle\n * @param mapping mapping to save\n */\n async addMapping(projectId: string, mapping: Mapping, name: string) {\n this.loading = true\n this.error = null\n\n const rawMapping = deepToRaw(mapping)\n const cleanedMapping = removeUndefinedFields(rawMapping)\n\n try {\n const mappingLog: MappingLog = {\n projectId: projectId,\n mapping: cleanedMapping,\n date: new Date(),\n name: name,\n }\n await addDoc(collection(db, 'mappings'), mappingLog)\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Gets mappings for the project, with a optional limit\n * @param projectId projectId which usually is the streamID from speckle\n * @param resLimit Optional limit of results, default is 25\n * @returns \n */\n async fetchMappings(projectId: string, resLimit: number = 25): Promise {\n this.loading = true\n this.error = null\n try {\n const q = query(\n collection(db, 'mappings'),\n where('projectId', '==', projectId),\n orderBy('date', 'desc'),\n limit(resLimit)\n )\n const querySnapshot = await getDocs(q)\n if (!querySnapshot.empty) {\n const mappings = querySnapshot.docs.map(doc => doc.data()) as MappingLog[]\n return mappings\n } else {\n return []\n }\n } catch (error: any) {\n this.error = error.message\n return null\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Deletes a mapping from the database\n * @param projectId projectId which usually is the streamID from Speckle\n * @param mappingId mappingId to delete\n */\n async deleteMapping(projectId: string, mappingId: string) {\n this.loading = true\n this.error = null\n\n try {\n const q = query(\n collection(db, 'mappings'),\n where('projectId', '==', projectId),\n where('mappingId', '==', mappingId)\n )\n const querySnapshot = await getDocs(q)\n if (!querySnapshot.empty) {\n const batch = writeBatch(db)\n querySnapshot.forEach(doc => {\n batch.delete(doc.ref)\n })\n await batch.commit()\n } else {\n this.error = 'No matching document found'\n }\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n\n\n /**\n * Adds results to the firebase DB to save the current results, only saving aggregated results\n * To get object based results reload the mappings and recalculate\n * @param projectId projectId which usually is the streamID from speckle\n * @param results aggregated results from geometry objects\n */\n async addResultList(projectId: string, resultList: ResultList, name: string) {\n this.loading = true\n this.error = null\n try {\n const resultsLog: ResultsLog = {\n name: name,\n projectId: projectId,\n resultList: resultList,\n date: new Date(),\n }\n await addDoc(collection(db, 'resultLists'), resultsLog)\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Fetches aggregated results for the project, with a optional limit\n * @param projectId projectId which usually is the streamID from speckle\n * @param resLimit Optional limit of results, default is 25\n * @returns \n */\n async fetchResults(projectId: string, resLimit: number = 25): Promise {\n this.loading = true\n this.error = null\n try {\n const q = query(\n collection(db, 'resultLists'),\n where('projectId', '==', projectId),\n orderBy('date', 'desc'),\n limit(resLimit)\n )\n const querySnapshot = await getDocs(q)\n if (!querySnapshot.empty) {\n const results = querySnapshot.docs.map(doc => doc.data()) as ResultsLog[]\n return results\n } else {\n return []\n }\n } catch (error: any) {\n this.error = error.message\n return null\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Deletes a result from the database\n * @param projectId projectId which usually is the streamID from Speckle\n * @param resultsId resultsId to delete\n */\n async deleteResults(projectId: string, resultsId: string) {\n this.loading = true\n this.error = null\n \n try {\n const q = query(\n collection(db, 'projectResults'),\n where('projectId', '==', projectId),\n where('mappingId', '==', resultsId)\n )\n const querySnapshot = await getDocs(q)\n if (!querySnapshot.empty) {\n const batch = writeBatch(db)\n querySnapshot.forEach(doc => {\n batch.delete(doc.ref)\n })\n await batch.commit()\n } else {\n this.error = 'No matching document found'\n }\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Fetches the whole assembly list for a project\n * @param projectId \n * @returns \n */\n async fetchAssemblyList(projectId: string): Promise {\n this.loading = true\n this.error = null\n try {\n const q = query(\n collection(db, 'projectAssemblies'),\n where('projectId', '==', projectId)\n )\n const querySnapshot = await getDocs(q)\n if (!querySnapshot.empty) {\n const assemblyList = querySnapshot.docs[0].data() as AssemblyList\n return assemblyList\n } else {\n return null\n }\n } catch (error: any) {\n this.error = error.message\n return null\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Updates the assembly list for a project\n * Overwrites the current list\n * @param projectId \n * @param assemblies \n */\n async addAssemblyList(projectId: string, assemblies: Assembly[]) {\n this.loading = true\n this.error = null\n\n try {\n const querySnapshot = await getDocs(\n query(collection(db, 'projectAssemblies'), where('projectId', '==', projectId))\n )\n\n const assemblyList: AssemblyList = {\n projectId: projectId,\n assemblies: assemblies,\n }\n\n if (!querySnapshot.empty) {\n const docRef = querySnapshot.docs[0].ref\n await setDoc(docRef, assemblyList)\n } else {\n await addDoc(collection(db, 'projectAssemblies'), assemblyList);\n }\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Fetches the calculation settings for a project and all generic ones\n * @param projectId \n * @param settings \n * @returns CalculationSettings[] or null if none found\n */\n async fetchCalculationSettings(projectId: string): Promise {\n this.loading = true\n this.error = null\n\n try {\n const specificQuery = query(\n collection(db, 'calculationSettings'),\n where('projectId', '==', projectId)\n )\n const genericQuery = query(\n collection(db, 'calculationSettings'),\n where('projectId', '==', 'generic')\n )\n\n const [specificSnapshot, genericSnapshot] = await Promise.all([\n getDocs(specificQuery),\n getDocs(genericQuery)\n ])\n \n if (!specificSnapshot.empty || !genericSnapshot.empty) {\n const combinedSettings: CalculationSettingsLog[] = [...specificSnapshot.docs, ...genericSnapshot.docs].map(doc => ({\n ...doc.data()\n })) as CalculationSettingsLog[]\n return combinedSettings\n } else {\n return null\n }\n } catch (error: any) {\n this.error = error.message\n return null\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Adds a calculation setting to the database\n * @param projectId \n * @param setting \n */\n async addCalculationSettings(projectId: string, setting: CalculationSettings, name: string) {\n this.loading = true\n this.error = null\n \n try {\n if (!setting) \n return null\n\n const settingLog: CalculationSettingsLog = {\n projectId: projectId,\n settings: setting,\n date: new Date(),\n name: name\n }\n await addDoc(collection(db, 'calculationSettings'), settingLog);\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n },\n})","import type { Mapping, MaterialFilterParam, Product } from \"@/models/material\"\nimport type { FilterList, NestedGroup } from \"@/models/filters\"\nimport type { GeometryObject } from \"@/models/geometryObject\"\nimport type { AssemblyList } from \"@/models/firebase\"\n\nimport { useProjectStore } from \"@/stores/main\"\nimport { useMaterialStore } from \"@/stores/material\"\nimport { useSpeckleStore } from \"@/stores/speckle\"\nimport { useFirebaseStore } from \"@/stores/firebase\"\n\nimport { setMappingColorGroup, updateProjectGroups } from \"@/utils/projectUtils\"\n\n/**\n * Updates from a selected mapping to a new one, with all materials and objectIds\n * TODO: This needs a redo and optimisation\n * @param mapping Mapping object to update towards project and material store\n */\nexport function updateMapping(mapping: Mapping) {\n const projectStore = useProjectStore()\n const materialStore = useMaterialStore()\n\n // Keep this in memory to avoid unnecessary updates of groups\n let lastId = null\n clearMapping()\n\n mapping.steps.forEach(step => {\n if (lastId != step.filterId) {\n //Find the filter from the mapping and apply it to the project\n const filterList = mapping.filters.find(filter => filter.id == step.filterId);\n projectStore.updateRegistryStack(filterList.name, filterList.callStack)\n updateProjectGroups(true)\n\n lastId = step.filterId\n }\n //Search and find the group that we are updating\n const group = projectStore.getGroupById(step.nestedGroupId)\n \n if (group == null) {\n return\n } else {\n //Update the material for all objects in the group\n group.elements.forEach(obj => {\n obj.material = step.material\n })\n }\n\n materialStore.updateMappingMaterial(step.nestedGroupId, step.material)\n })\n materialStore.setMapping(mapping)\n}\n\nexport function clearMapping() {\n const projectStore = useProjectStore()\n const materialStore = useMaterialStore()\n\n // Clear the mapping and update the project\n materialStore.mapping = null\n \n // Remove all mappings on objects\n projectStore.currProject.geometry.forEach(geo => {\n geo.material = null\n })\n\n updateProjectGroups(true)\n}\n\n/**\n * Maps materials and updates the material store mapping with the current filter list and current selected material\n * Also sets the color groups for the speckle store and updates the color groups\n * @param inGroup nested group to map materials on\n */\nexport function mapMaterial(inGroup: NestedGroup) {\n const materialStore = useMaterialStore()\n const projectStore = useProjectStore()\n const speckleStore = useSpeckleStore()\n\n const currFilterList: FilterList = projectStore.filterRegistry.filterCallStack\n\n // If no mapping exists, create a new one and then add the step\n if (materialStore.mapping == null) {\n const newMapping: Mapping = {\n id: crypto.randomUUID(),\n name: 'temp',\n filters: [currFilterList],\n steps: []\n }\n materialStore.mapping = newMapping\n materialStore.addStep(inGroup, materialStore.currentMapping, currFilterList.id)\n } else {\n // If the filter list is not in the mapping, add it\n if (!materialStore.mapping.filters.includes(currFilterList)) {\n materialStore.mapping.filters.push(currFilterList)\n }\n materialStore.addStep(inGroup, materialStore.currentMapping, currFilterList.id)\n }\n\n // Apply materials to all objects in the group\n // TODO: I think this should be an automated function from the Step we added or moved to addStep instead\n inGroup.objects.forEach(obj => {\n if (materialStore.currentMapping != null) {\n obj.material = materialStore.currentMapping\n materialStore.updateMappingMaterial(obj.URI, materialStore.currentMapping)\n }\n })\n\n const mappingColors = setMappingColorGroup()\n speckleStore.setColorGroups(mappingColors)\n}\n\n/**\n * Function to sort through materials and only return relevant based on param List\n * @param materials Materials to sort through\n * @param paramFilters Filters to apply\n * @returns List of products matching filtering criteria\n */\nexport function applyParamFilters(materials: Product[], filters: MaterialFilterParam[]) {\n const filteredList = materials\n\n // Safety check if no filters are applied\n if (!filters || filters.length === 0) {\n return filteredList\n }\n\n // Go through all materials and check for filter inclusions\n return materials.filter((material) => {\n if (!material)\n return false\n \n return filters.some((filter) => {\n if (!filter.selected)\n return false\n // Helper function to get the property value if its hidden under metaData or similar so we can access directly\n const paramValue = getNestedPropertyValue(material, filter.filterParamter)\n return filter.name.includes(paramValue)\n })\n })\n}\n\n/**\n * Helper function to get nested property value from a string path\n * @param obj The object to extract the value from\n * @param path The path string (e.g., 'metaData.materialType')\n * @returns The value at the specified path or undefined\n */\nexport function getNestedPropertyValue(obj: any, path: string): any {\n return path.split('.').reduce((acc, part) => acc && acc[part], obj);\n}\n\n/**\n * Gets the mapped material and returns a color based on it\n * @param group \n * @returns \n */\nexport function getMappedMaterial(objects: GeometryObject[]) {\n if (objects) {\n const materialNames = objects.map(obj => obj.material?.name)\n const uniqueMaterialNames = [...new Set(materialNames)]\n \n // Check if there are objects without materials to turn the card yellow\n const objectsWithoutMaterials = objects.filter(obj => obj.material == undefined).length > 0\n\n if (uniqueMaterialNames.length === 1) {\n if (uniqueMaterialNames[0] == undefined) {\n return {\n name: \"No material mapped\",\n color: \"red-50\"\n }\n } else {\n return {\n name: uniqueMaterialNames[0],\n color: \"green-50\"\n }\n }\n } else {\n return {\n name: \"Mixed\",\n color: objectsWithoutMaterials? \"yellow-50\" : \"green-50\"\n }\n }\n } else {\n return {\n name: \"No material mapped\",\n color: \"red-50\"\n }\n }\n}\n\n/**\n * Creates a geometry object cube from a product for emission calculations\n * @param product \n * @returns geometryObject consitsting of a material cube\n */\nexport function createGeometryFromProduct(product: Product): GeometryObject {\n // Create base quantity object\n const quantity = {\n m: 1,\n m2: 1,\n m3: 1,\n kg: 1, // TODO: This should be the weight of the product\n pcs: 1,\n tonnes: 0,\n l: 0\n }\n \n if (product.metaData.thickness) {\n quantity.m3 = parseFloat(product.metaData.thickness) / 1000 // unit is in mm\n }\n\n const geo: GeometryObject = {\n id: product.id,\n name: 'type',\n quantity: quantity,\n material: product,\n parameters: {\n // Parameters from assembly creatino add more here if we add more to it\n thickness: product.metaData.thickness ? product.metaData.thickness: \"0\",\n color: product.metaData.color ? product.metaData.color: \"#ffffff\",\n },\n } \n\n return geo\n}\n\n/**\n * Get the assembly list from firebase and update the material store\n */\nexport async function getAssemblyList() {\n const materialStore = useMaterialStore()\n const projectStore = useProjectStore()\n const firebaseStore = useFirebaseStore()\n\n try {\n const assemblyList: AssemblyList = await firebaseStore.fetchAssemblyList(projectStore.currProject.id)\n if (assemblyList) {\n materialStore.assemblies = assemblyList.assemblies\n }\n } catch (error) {\n console.error('Error fetching assembly list:', error)\n }\n}","/**\n * Truncate text down to set length\n * @param text \n * @param maxLength \n * @returns \n */\nexport function truncateText(text, maxLength) {\n if (text.length > maxLength) {\n return text.substring(0, maxLength) + '...'\n }\n return text\n}\n\n/**\n * Returns a text without any dots in them and returning the last text\n * Used for speckleTypes and such to clean them up\n * @param text that should be cleaned \n * @returns cleaned text with last segement included\n */\nexport function getTextAfterLastDot(text: string): string {\n if (typeof text !== 'string') {\n return text\n }\n\n const lastIndex = text.lastIndexOf('.')\n if (lastIndex !== -1) {\n return text.substring(lastIndex + 1)\n }\n return text\n}","import { useResultStore } from '@/stores/result'\nimport { useProjectStore } from '@/stores/main'\nimport { useSettingsStore } from '@/stores/settings'\n\nimport { getNestedPropertyValue } from '@/utils/material'\nimport { DefaultResultList } from '@/models/result'\nimport { getTextAfterLastDot } from '@/utils/stringUtils'\n\nimport type { GroupedResults } from '@/models/result'\nimport type { ChartData, NestedChartData } from '@/models/chartModels'\nimport type { GeometryObject, Quantity } from '@/models/geometryObject'\nimport type { ExtendedImpactCategoryKey, Emission, LifeCycleStageEmission, MetricUnits } from '@/models/material'\nimport type { ResultItem, ResultList } from '@/models/result'\nimport type { ResultsLog } from '@/models/firebase'\n\n/**\n * Converter of geometry object results into aggregated ChartData for specific LifeCycleStages (LCS)\n * @param objects geometry objects to convert\n * @param impactCategory optional impact category to get results for that category\n * @param resultKey optional key to get specific result\n */\nexport function geometryToLCSChartData(objects: GeometryObject[], impactCategory: string = 'gwp', resultKey: number = Number.MIN_SAFE_INTEGER): ChartData[] {\n const groupedData = new Map()\n\n // Go through each selected object and get aggregated labels and emission data\n for (const obj of objects) {\n const results = obj.results\n if (!results) continue\n\n // Check if we got any resultKey otherwise just take the last one\n const result = resultKey === Number.MIN_SAFE_INTEGER ? results[results.length - 1] : results[resultKey]\n if (!result || !result.emission) continue\n\n for (const lifeCycleStage in result.emission[impactCategory]) {\n const currentValue = groupedData.get(lifeCycleStage) || 0\n groupedData.set(lifeCycleStage, currentValue + result.emission[impactCategory][lifeCycleStage])\n }\n }\n\n const data: ChartData[] = Array.from(groupedData, ([lifeCycleStage, value]) => ({\n label: lifeCycleStage,\n value: Math.round(value)\n }))\n\n return data\n}\n\n/**\n * Converts a ResultItem into a list of ChartData with only lifecycle stages information\n * @param resultItem ResultItem to convert\n * @returns ChartData array for use with charts such as stackedBar\n */\nexport function resultItemToLCSChartData(resultItem: ResultItem): ChartData[] {\n const settingsStore = useSettingsStore()\n const impactCategory = settingsStore.calculationSettings.standardImpactCategory\n const groupedData = new Map()\n\n if (!resultItem?.data) return []\n // Go through each selected object and get aggregated labels and emission data\n for (const groupedResult of resultItem.data) {\n groupedResultToLCSChartData(groupedResult, groupedData, impactCategory)\n }\n\n const data: ChartData[] = Array.from(groupedData, ([material, { value, ids }]) => ({\n label: material,\n value: Math.round(value),\n ids: ids\n }))\n\n return data\n}\n\n/**\n * Converts a ResultItem into a list of ChartData\n * @param resultItem ResultItem to convert\n * @returns ChartData array for use with charts such as pie, bar chart etc\n */\nexport function resultItemToChartData (resultItem: ResultItem): ChartData[] {\n const settingsStore = useSettingsStore()\n const impactCategory = settingsStore.calculationSettings.standardImpactCategory\n const groupedData = new Map()\n\n if (!resultItem?.data) return []\n // Go through each selected object and get aggregated labels and emission data\n for (const groupedResult of resultItem.data) {\n groupedResultToChartData(groupedResult, groupedData, impactCategory)\n }\n \n const data: ChartData[] = Array.from(groupedData, ([material, { value, ids }]) => ({\n label: material,\n value: Math.round(value),\n ids: ids\n }))\n\n return data\n}\n\n/**\n * Converts a ResultItem into a list of NestedChartData\n * The top-level resultItem is transformed into an array of NestedChartData:\n * @param resultItem ResultItem to convert\n * @returns NestedChartData array for use with charts such as diverging stacked bar chart\n */\nexport function resultItemToNestedChartData (resultItem: ResultItem): NestedChartData[] {\n const settingsStore = useSettingsStore()\n const impactCategory = settingsStore.calculationSettings.standardImpactCategory\n \n if (!resultItem?.data) return []\n\n const nestedChartData: NestedChartData[] = []\n\n for (const groupedResult of resultItem.data) {\n // For each top-level grouped result, we gather its ChartData\n const topLevelData = new Map()\n groupedResultToChartData(groupedResult, topLevelData, impactCategory)\n\n // If no nested data, we can still return a NestedChartData with just the top-level data\n if (!groupedResult.nested || groupedResult.nested.length === 0) {\n const topLevelArray: ChartData[] = Array.from(topLevelData, ([label, { value, ids }]) => ({\n label: label,\n value: Math.round(value),\n ids: ids\n }))\n \n nestedChartData.push({\n label: getTextAfterLastDot(groupedResult.parameter),\n value: topLevelArray\n })\n continue\n }\n \n // Add nested results\n const nestedDataArray: ChartData[] = []\n\n for (const nestedResult of groupedResult.nested) {\n const nestedResultMap = new Map()\n groupedResultToChartData(nestedResult, nestedResultMap, impactCategory)\n\n // Each nested result might have multiple entries, append them:\n for (const [label, data] of nestedResultMap) {\n nestedDataArray.push({\n label,\n value: Math.round(data.value),\n ids: data.ids\n })\n }\n }\n\n nestedChartData.push({\n label: getTextAfterLastDot(groupedResult.parameter),\n value: nestedDataArray\n })\n }\n\n return nestedChartData\n}\n\n/**\n * Helper function to convert a single grouped result into a chart data\n * @param groupedResult Grouped result to convert\n * @param groupedData Map to store the grouped data\n * @param impactCategory Impact category to get results for\n */\nfunction groupedResultToChartData(groupedResult: GroupedResults, groupedData: Map, impactCategory: ExtendedImpactCategoryKey): void {\n let objectName = groupedResult.parameter\n const emissionData = groupedResult.data.emission\n\n if (!objectName || !emissionData) return null\n\n // Fix for Speckletype names\n if ((objectName.split('.').length - 1) > 2 )\n objectName = getTextAfterLastDot(objectName)\n\n if (!groupedData.has(objectName)) {\n const entry: ChartData = {\n label: objectName,\n value: 0,\n ids: []\n }\n groupedData.set(objectName, entry)\n }\n\n const materialData = groupedData.get(objectName)!\n\n for (const lifeCycleStage in groupedResult.data.emission[impactCategory]) {\n materialData.value += groupedResult.data.emission[impactCategory][lifeCycleStage]\n }\n\n materialData.ids.push(... groupedResult.data.geoId) \n}\n\n\n/**\n * Helper function to convert a single grouped result into a chart data for lifecycle stages\n * @param groupedResult Grouped result to convert\n * @param groupedData Map to store the grouped data\n * @param impactCategory Impact category to get results for\n */\nfunction groupedResultToLCSChartData(groupedResult: GroupedResults, groupedData: Map, impactCategory: ExtendedImpactCategoryKey): void {\n const emissionData = groupedResult.data.emission\n\n if (!emissionData) return null\n\n for (const lifeCycleStage in groupedResult.data.emission[impactCategory]) {\n if (!groupedData.has(lifeCycleStage)) {\n const entry: ChartData = {\n label: lifeCycleStage,\n value: 0,\n ids: []\n }\n groupedData.set(lifeCycleStage, entry)\n }\n\n const materialData = groupedData.get(lifeCycleStage)!\n\n materialData.value += groupedResult.data.emission[impactCategory][lifeCycleStage]\n materialData.ids.push(... groupedResult.data.geoId) \n }\n}\n\n/**\n * Creates a result list from the given objects and then find the relevant parameter and makes it into chart data\n * @param objects Geoobject with reuslts on them\n * @param chartParameter Parameter to convert into chartdata\n * @returns Chartdata for given parameter\n */\nexport function geometryToChartData(objects: GeometryObject[], chartParameter: string, LCSData: boolean = false): ChartData[] {\n // Create result aggregator and calculator\n const resCalc = new ResultCalculator(objects)\n resCalc.aggregate(false, true)\n \n const resultItem = resCalc.resultList.find((item) => item.parameter === chartParameter)\n\n // If we are calculating for LCS, we need to convert the data differently\n if (LCSData) \n return resultItemToLCSChartData(resultItem)\n \n return resultItemToChartData(resultItem)\n}\n\n/**\n * Creates a result list from the given objects and then find the relevant parameter and makes it into nested chart data\n * @param objects Geoobject with reuslts on them\n * @param chartParameter Parameter to convert into nested chartdata\n * @returns Nested chartdata for given parameter\n */\nexport function geometryToNestedChartData(objects: GeometryObject[], chartParameter: string): NestedChartData[] {\n // Create result aggregator and calculator\n const resCalc = new ResultCalculator(objects)\n resCalc.aggregate(false, true)\n \n const resultItem = resCalc.resultList.find((item) => item.parameter === chartParameter)\n\n return resultItemToNestedChartData(resultItem)\n}\n\n/**\n * Returns number of total emission in co2 eq for a given emission object with all relevant phases and categories from settings\n * @param emission Emission object to convert to number\n * @returns Number for category and included phases in settings\n */\nexport function emissionToNumber(emission: Emission): number {\n const settingsStore = useSettingsStore()\n const impactCategory = settingsStore.calculationSettings.standardImpactCategory\n const includedPhases = settingsStore.calculationSettings.includedStages\n \n let total = 0\n\n // Only go through relevant ImpactCategory\n for (const phase in emission[impactCategory]) {\n // Find the relevant stage object for the current phase\n const relevantStage = includedPhases.relevantStages.find(\n (stageObj) => stageObj.stage === phase\n )\n \n // If the stage exists and is included, add its emission to the total\n if (relevantStage && relevantStage.included) {\n total += emission[impactCategory][phase]\n }\n } \n\n return total\n}\n\n/**\n * Returns emission object from a resultLog\n * @param resultLog ResultLog to get emission from, this comes from Firebase\n * @param parameter Paramater to get emissions for, e.g. 'parameter.category', 'parameter.speckleType'\n * @returns returns summed up emissions for the parameter\n */\nexport function getResultLogEmissions(resultLog: ResultsLog, parameter: string): Emission {\n const resItem = resultLog.resultList.find((item: ResultItem) => item.parameter === parameter)\n\n const emissionList = extractEmissionsFromResultItem(resItem)\n \n return sumEmissions(emissionList)\n}\n\nexport function extractEmissionsFromResultItem(resultItem: ResultItem): Emission[] {\n return resultItem.data.map(groupedResult => groupedResult.data.emission)\n}\n\nexport function sumEmissions(emissions: Emission[]): Emission {\n return emissions.reduce((accumulatedEmission, currentEmission) => {\n return addEmissions(accumulatedEmission, currentEmission)\n }, {})\n}\n\n/**\n * Simple function to add two emissions together\n * @param a Emission to add to\n * @param b Emission to add from\n * @returns Emission with added values\n */\nexport function addEmissions(a: Emission, b: Emission): Emission {\n const result: Emission = {}\n\n const mergeIntoResult = (source: Emission) => {\n for (const impactCategory in source) {\n if (!result[impactCategory]) {\n result[impactCategory] = {}\n }\n\n for (const phase in source[impactCategory]) {\n result[impactCategory][phase] =\n (result[impactCategory][phase] || 0) + (source[impactCategory][phase] || 0)\n }\n }\n }\n mergeIntoResult(a)\n mergeIntoResult(b)\n\n return result\n}\n\n/**\n * Simple function to add two quantities together\n * @param a Quantity to add to\n * @param b Quantity to add from\n * @returns Quantity with added values\n */\nexport function addQuantity(a: Quantity, b: Quantity): Quantity {\n const result: Quantity = {}\n // Find unique keys in a and b\n const allKeys = new Set([...Object.keys(a || {}) as MetricUnits[], ...Object.keys(b || {}) as MetricUnits[]])\n \n for (const key of allKeys) {\n result[key] = (a[key] || 0) + (b[key] || 0)\n }\n return result\n}\n\n/**\n * Aggregates a series of emissions on either whole project or just selection\n */\nexport class ResultCalculator {\n private geos: GeometryObject[] = []\n private resultStore = useResultStore()\n public totalEmission: Emission = {}\n // Decouple from original list\n public resultList: ResultList = DefaultResultList.map(item => ({\n ...item,\n data: [],\n }))\n\n /**\n * @param geos Geometry objects to aggregate emissions on if left empty it will do it on whole project\n */\n constructor(geos: GeometryObject[] = []) {\n this.geos = geos\n // If no geometry sent do it on whole project\n if (geos.length === 0) {\n const projectStore = useProjectStore()\n if (projectStore.currProject) {\n this.geos = projectStore.currProject.geometry\n }\n }\n }\n\n // Main function to aggregate emissions\n public aggregate(save: Boolean = true, calcResultList = true): void {\n this.geos.forEach(geo => {\n if (geo.results) {\n this.aggregateTotalEmissions(geo.results[geo.results.length - 1].emission)\n if (calcResultList) {\n this.aggregateEmissionsForResultList(geo)\n }\n }\n })\n\n if (save)\n this.saveResults()\n }\n\n // Get the total emission\n private aggregateTotalEmissions(emission: Emission): void {\n for (const impactCategory in emission) {\n if (!this.totalEmission[impactCategory]) {\n this.totalEmission[impactCategory] = {} as LifeCycleStageEmission\n }\n for (const phase in emission[impactCategory]) {\n if (!this.totalEmission[impactCategory][phase]) {\n this.totalEmission[impactCategory][phase] = { amount: 0 }\n }\n const emissionAmount = emission[impactCategory][phase] || 0\n const currentTotal = this.totalEmission[impactCategory][phase] || 0\n this.totalEmission[impactCategory][phase] = currentTotal + emissionAmount\n }\n }\n }\n\n private aggregateEmissionsForResultList(geo: GeometryObject): void {\n for (const index in this.resultList) {\n // Parameter to aggregate on\n const parameter = this.resultList[index].parameter\n const paramValue = getNestedPropertyValue(geo, parameter)\n if (paramValue) {\n // Get latest result\n const geoEmission = geo.results[geo.results.length - 1].emission\n const geoQuantity = geo.quantity\n\n const paramItem = this.resultList[index]\n\n if (!paramItem.data) {\n paramItem.data = []\n }\n\n // Find the parameter in the list\n let groupedResult = paramItem.data.find((result) => result.parameter === paramValue)\n\n if (!groupedResult) {\n groupedResult = {\n parameter: paramValue,\n quantity: geoQuantity,\n data: {\n emission: {} as Emission,\n geoId: [],\n }\n }\n paramItem.data.push(groupedResult)\n }\n\n // Add emissions together\n groupedResult.data.emission = addEmissions(\n groupedResult.data.emission,\n geoEmission\n )\n\n // Add quantities together\n groupedResult.quantity = addQuantity(\n groupedResult.quantity, \n geoQuantity\n )\n\n // Add geoId to list if not already there\n if (!groupedResult.data.geoId.includes(geo.id)) {\n groupedResult.data.geoId.push(geo.id)\n }\n\n this.aggregateLifeCycleStages(groupedResult)\n }\n }\n }\n\n /**\n * Aggregate emissions into a nested ResultItem by life cycle stages.\n */\n private aggregateLifeCycleStages(\n groupedResult: GroupedResults,\n ): void {\n // Ensure nested structure exists\n if (!groupedResult.nested) {\n groupedResult.nested = []\n }\n\n const aggregatedEmission = groupedResult.data.emission\n // Iterate through each impact category in the aggregated emission\n for (const impactCategoryKey in aggregatedEmission) {\n const categoryEmission = aggregatedEmission[impactCategoryKey]\n if (!categoryEmission) continue\n\n // For each life cycle stage in this category\n for (const stageKey in categoryEmission) {\n const stageValue = categoryEmission[stageKey]\n\n let stageGrouped = groupedResult.nested.find(\n (group) => group.parameter === stageKey\n )\n\n if (!stageGrouped) {\n stageGrouped = {\n parameter: stageKey,\n quantity: { m:0 }, \n data: {\n emission: {} as Emission,\n geoId: []\n }\n }\n groupedResult.nested.push(stageGrouped)\n }\n\n // Initialize this category and stage if it doesn't exist\n if (!stageGrouped.data.emission[impactCategoryKey]) {\n stageGrouped.data.emission[impactCategoryKey] = {}\n }\n\n // Aggregate the emission for this stage\n stageGrouped.data.emission[impactCategoryKey][stageKey] =\n (stageGrouped.data.emission[impactCategoryKey][stageKey] ?? 0) + stageValue\n\n // Add geoId to list if not already there\n if (groupedResult.data.geoId.length === 0) {\n groupedResult.data.geoId.push(... groupedResult.data.geoId)\n }\n }\n }\n }\n \n private saveResults(): void {\n this.resultStore.setResultList(this.resultList)\n }\n}\n","import type { NestedGroup, Filter, Group } from '@/models/filters'\nimport type { GeometryObject } from '@/models/geometryObject'\n\nimport { useProjectStore } from '@/stores/main'\nimport { useResultStore } from '@/stores/result'\nimport { useSettingsStore } from '@/stores/settings'\nimport { \n baseColors, \n getValueColorFromGradient,\n ColorManager \n} from '@/utils/colorUtils'\nimport { \n ResultCalculator,\n extractEmissionsFromResultItem,\n sumEmissions,\n emissionToNumber\n} from '@/utils/resultUtils'\n\n/**\n * Creates a nested object from an array of Group objects.\n * Each Group object represents a path, and the function creates a nested structure based on the paths.\n * The resulting nested object contains the total number of objects at each level of the hierarchy.\n *\n * @param data An array of Group objects representing the paths.\n * @returns A NestedGroup object representing the nested structure.\n */\nexport function createNestedObject(data: Group[]): NestedGroup {\n const nestedObject: NestedGroup = {\n name: 'root',\n objects: [],\n id: crypto.randomUUID(),\n children: [],\n }\n\n data.forEach(entry => {\n let currentLevel = nestedObject\n\n //TODO Change this to map instead for performance so we dont use find\n entry.path.forEach(level => {\n let existingLevel = currentLevel.children.find(\n child => child.name === level\n )\n\n if (!existingLevel) {\n existingLevel = {\n color: entry.color, \n name: level, \n objects: [], \n id: entry.id,\n children: [] \n }\n currentLevel.children.push(existingLevel)\n }\n\n existingLevel.objects.push(...entry.elements)\n currentLevel = existingLevel\n })\n })\n\n return nestedObject\n}\n\n/**\n * Calculate the groups based on the filters and the project\n * @param reCalc \n */\nexport function updateProjectGroups(reCalc: boolean) {\n const projectStore = useProjectStore()\n let groups: Group[] = []\n // First time running we need to define the groups from scratch\n if (reCalc) {\n //Create geometry objects from the project\n const geo: GeometryObject[] = []\n projectStore.currProject?.geometry.forEach((element) => {\n geo.push(element)\n })\n\n //Root for the group, this should not be needed\n groups = [\n {\n id: 'test',\n name: 'root',\n path: ['root'],\n elements: geo,\n color: 'hsl(151, 100%, 50%)'\n }\n ]\n\n //Go through each filter and iterate over them\n let reverseStack: Filter[] = []\n if (projectStore.filterRegistry)\n reverseStack = projectStore.filterRegistry.filterCallStack.callStack\n\n reverseStack.forEach((el) => {\n if (el.value) {\n groups = projectStore.filterRegistry?.callFilter(\n `${el.name}`,\n groups,\n `${el.field}`,\n `${el.value}`,\n el.remove\n )\n } else {\n groups = projectStore.filterRegistry?.callFilter(\n `${el.name}`,\n groups,\n `${el.field}`\n )\n }\n\n //Remove root in path since we had to add it\n groups.forEach((element) => {\n if (element.path[0] === 'root') element.path.splice(0, 1)\n })\n })\n } else {\n if (projectStore.projectGroups) {\n groups = projectStore.projectGroups\n }\n }\n\n groups.sort((a, b) => b.elements.length - a.elements.length)\n\n //Update groups\n projectStore.updateGroups(groups)\n}\n\n/**\n* Updates the colors of the groups in the project\n* Autmatically setting all colors, optional to change specific ones\n* @param id Optional: Ids of groups to change\n* @param color Optional: colors to change to\n*/\nexport function updateGroupColors(\n tree: NestedGroup[],\n id: string[] = [],\n color: string[] = []\n): void {\n const colorMngr = new ColorManager()\n const colors = colorMngr.getMostDistinctColors(tree.length > 0 ? tree.length : 1)\n tree.map((group, index) => {\n if (id.includes(group.id)) {\n tree[index].color = color[id.indexOf(group.id)]\n } else {\n tree[index].color = colors[index]\n }\n })\n}\n\n\n/**\n * Set the color based on results, if no object is provided it will set all objects in the project\n * @param objects optional for specfic material updates\n * @param colorRange optional number of steps of colors in the gradient\n * @returns gradient groups with increments for results\n */\nexport function setResultsColorGroup(objects: GeometryObject[] = null, colorRange: number = 10) {\n const projectStore = useProjectStore()\n const groups: { objectIds: string[], color: string }[] = []\n\n //Create all colorRange groups including no results\n const neutralGroup: { objectIds: string[], color: string } = \n { objectIds: [], color: baseColors.primaryGrey }\n\n if (!objects) {\n //Get all objects from the project\n const groups = projectStore.projectGroups\n if (groups) {\n groups.forEach(group => {\n group.elements.forEach(element => {\n assignColorGroup(element)\n })\n })\n }\n } else {\n objects.forEach((element) => {\n assignColorGroup(element)\n })\n }\n \n //Add groups to main\n groups.push(neutralGroup)\n\n return groups\n\n function assignColorGroup(object: GeometryObject) {\n const settingsStore = useSettingsStore()\n const resultStore = useResultStore()\n \n if (object && object.results) {\n // Calculate the resultlist for the object\n // TODO: Check if this is super inefficient nice to have it gathered into one function for all results\n const resCalc = new ResultCalculator([object])\n resCalc.aggregate(false)\n\n // Find the result for the active parameter\n const resItem = resCalc.resultList.find((item) => item.parameter === 'material.name')\n \n // Extract emissions from the result\n const emissionList = extractEmissionsFromResultItem(resItem)\n const emission = sumEmissions(emissionList)\n\n // We use a log10 scale, I think it makes sense\n const sizeFactor = object ? Math.log10(object.quantity.m2 + 1) : 1\n const normalisedEmissions = (emissionToNumber(emission) / object.quantity.m2) * sizeFactor\n //Calculate the color based on the gwp value\n const color = getValueColorFromGradient(normalisedEmissions, 0, 200)\n groups.push({ objectIds: [object.id], color: color })\n } else {\n //No result mapped set color to grey\n neutralGroup.objectIds.push(object.id)\n }\n }\n}\n\n/**\n * Set the color of the material based on if it is mapped or not, if no object is provided it will set all objects in the project\n * @param object optional for specifik material updates\n * @returns greenGroup and redGroup with objectIds and color\n */\nexport function setMappingColorGroup(objects: GeometryObject[] = null) {\n const projectStore = useProjectStore()\n //Create two groups for the mapping colors, one red and one green and move objects between them to match if mapped materials or not\n const greenGroup: { objectIds: string[], color: string } = \n { objectIds: [], color: baseColors.primaryGreen }\n const redGroup: { objectIds: string[], color: string } =\n { objectIds: [], color: baseColors.primaryRed }\n\n if (!objects) {\n //Get all objects from the project\n const groups = projectStore.projectGroups\n if (groups) {\n groups.forEach(group => {\n group.elements.forEach(element => {\n assignColorGroup(element)\n })\n })\n }\n } else {\n objects.forEach((element) => {\n assignColorGroup(element)\n })\n }\n \n return [ greenGroup, redGroup ]\n\n function assignColorGroup(object: GeometryObject) {\n //Check if we have a material to map\n if (object && object.material) {\n //Add the object to the green group\n greenGroup.objectIds.push(object.id)\n } else {\n //No material mapped\n redGroup.objectIds.push(object.id)\n }\n }\n}","import { defineStore } from 'pinia'\nimport type { GeometryObject } from '@/models/geometryObject'\nimport type { Project } from '@/models/project'\nimport type {\n\tFilterRegistry,\n\tGroup,\n\tFilter,\n\tNestedGroup\n} from '@/models/filters'\nimport type { \n\tAppSettings \n} from '@/models/settings'\nimport type { Results } from '@/models/result'\n\nimport { createNestedObject } from '@/utils/projectUtils'\nimport { logMessageToSentry } from '@/utils/monitoring'\n\n\n/**\n * Defines the project store, which contains the current project and its geometry and results.\n * TODO: Restructure this and create a seperate speckleViewer store\n */\nexport const useProjectStore = defineStore({\n\tid: 'projectStore',\n\tstate: () => {\n\t\treturn {\n\t\t\tcurrProject: null as Project | null, // The current project being worked on\n\t\t\tprojectGroups: null as Group[] | null, // Groups that have been created for geometry objects\n\t\t\tfilterRegistry: null as FilterRegistry | null, // Filterregistry with current filters and filterCallStack\n\t\t\tselectedGroup: null as NestedGroup | null, // NestedGroup that is currently selected\n\t\t\tselectedObjects: [] as GeometryObject[], // GeometryObjects that are currently selected\n\t\t\thighlightedLabel: null as string | null, // Label that is currently highlighted\n\t\t\thiddenObjects: [] as GeometryObject[], // GeometryObjects that are currently hidden\n\t\t}\n\t},\n\tactions: {\n\t\t/**\n\t\t * Creates a new project.\n\t\t * @param project The project to create.\n\t\t */\n\t\tcreateNewProject(project: Project) {\n\t\t\tthis.currProject = project\n\t\t},\n\n\t\t/**\n\t\t * Creates or updated the current groups set on the project\n\t\t * @param groups\n\t\t */\n\t\tupdateGroups(groups: Group[]) {\n\t\t\tthis.projectGroups = groups\n\t\t},\n\n\t\t/**\n\t\t * Update a specific group by id with a new name and base path\n\t\t * @param name name to change to\n\t\t * @param id id of group to change\n\t\t */\n\t\tupdateGroupName(name: string, id: string) {\n\t\t\tif (this.projectGroups) {\n\t\t\t\tconst foundObject = this.projectGroups.find((obj) => obj.id === id)\n\t\t\t\tif (foundObject) {\n\t\t\t\t\tfoundObject.name = name\n\t\t\t\t\tfoundObject.path[0] = name\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log('Object with the provided ID not found.')\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Removes a group from the project with id reference\n\t\t * @param id if of group to remove\n\t\t */\n\t\tremoveGroup(id: string) {\n\t\t\tif (this.projectGroups) {\n\t\t\t\tconst foundIndex = this.projectGroups.findIndex((obj) => obj.id === id)\n\t\t\t\tif (foundIndex > -1) {\n\t\t\t\t\t//Filter used when splicing it doesnt update the watchers\n\t\t\t\t\tthis.projectGroups = this.projectGroups.filter(\n\t\t\t\t\t\t(element, index) => index != foundIndex\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('Object with the provided ID not found.')\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Adds a group to the project store\n\t\t * @param group group to add to store\n\t\t */\n\t\taddGroup(group: Group) {\n\t\t\tif (this.projectGroups) {\n\t\t\t\tthis.projectGroups.push(group)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Updates the current project.\n\t\t * @param project The project to update.\n\t\t */\n\t\tupdateProject(project: Project) {\n\t\t\tthis.currProject = project\n\t\t},\n\n\t\t/**\n\t\t * Update store with current filter registry\n\t\t * @param registry The registry to update to\n\t\t */\n\t\tsetFilterRegistry(registry: FilterRegistry) {\n\t\t\tthis.filterRegistry = registry\n\t\t},\n\n\t\t/**\n\t\t * Update store with new filter callstack with\n\t\t * names and values\n\t\t * @param callStack list of Filters\n\t\t */\n\t\tupdateRegistryStack(name: string, callStack: Filter[]) {\n\t\t\tif (this.filterRegistry)\n\t\t\t\tthis.filterRegistry.filterCallStack = {\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tname: name,\n\t\t\t\t\tcallStack: callStack\n\t\t\t\t}\n\t\t\t\t\n\t\t},\n\n\t\t/**\n\t\t * Get current filter registry call stack and returns a array of\n\t\t * filters that are within it\n\t\t * @returns Array of filters with keyvalues for the current filtering\n\t\t */\n\t\tgetRegistryStack(): Filter[] {\n\t\t\tif (this.filterRegistry !== null)\n\t\t\t\treturn this.filterRegistry.filterCallStack.callStack\n\t\t\telse\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'No filters founds',\n\t\t\t\t\t\tfield: 'No filters founds',\n\t\t\t\t\t\tvalue: 'No filters founds'\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t},\n\n\t\t/**\n\t\t * Get current filter names available in active registry\n\t\t * @returns array of available filter names\n\t\t */\n\t\tgetFilterNames() {\n\t\t\tif (this.filterRegistry !== null)\n\t\t\t\treturn this.filterRegistry.getFilterNames()\n\t\t\telse return ['No filters founds']\n\t\t},\n\n\t\t/**\n\t\t * Goes through geometry objects and returns list of parameters available\n\t\t * to filter project with\n\t\t * TODO: Run this lazy on load of projects\n\t\t * @returns array of available parameters\n\t\t */\n\t\tgetAvailableParameterList() {\n\t\t\tif (this.currProject) {\n\t\t\t\tconst parameterSet: Set = new Set()\n\t\t\t\tthis.currProject.geometry.forEach((geo) => {\n\t\t\t\t\tObject.keys(geo.parameters).forEach((key) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\ttypeof geo.parameters[key] === 'string' ||\n\t\t\t\t\t\t\ttypeof geo.parameters[key] === 'number'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tparameterSet.add(key)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\tObject.keys(geo.quantity).forEach((key) => {\n\t\t\t\t\t\tconst quantityKey = key as keyof typeof geo.quantity\n\t\t\t\t\t\tif (geo.quantity[quantityKey] !== 0 && geo.quantity[quantityKey] !== null) {\n\t\t\t\t\t\t\tparameterSet.add(key)\n\t\t\t\t\t\t\tgeo.parameters[key] =\n\t\t\t\t\t\t\t\tgeo.quantity[key as keyof typeof geo.quantity].toString()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\treturn Array.from(parameterSet)\n\t\t\t} else {\n\t\t\t\treturn ['No parameters found']\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Adds a geometry object to the current project.\n\t\t * @param geometryObject The geometry object to add.\n\t\t */\n\t\taddGeometry(geometryObject: GeometryObject) {\n\t\t\tthis.currProject?.geometry.push(geometryObject)\n\t\t},\n\n\t\t/**\n\t\t * Removes a geometry object from the current project.\n\t\t * @param id The ID of the geometry object to remove.\n\t\t */\n\t\tremoveGeometry(id: string) {\n\t\t\tconst index = this.findGeometryIndexById(id)\n\n\t\t\tif (index === -1) return\n\n\t\t\tif (index != undefined) this.currProject?.geometry.splice(index, 1)\n\t\t},\n\n\t\t/**\n\t\t * Updates a geometry object in the current project.\n\t\t * @param payload The updated geometry object.\n\t\t * @param id The ID of the geometry object to update.\n\t\t */\n\t\tupdateGeometry(payload: GeometryObject, id: string) {\n\t\t\tif (!id || !payload || this.currProject === null) return\n\n\t\t\tconst index = this.findGeometryIndexById(id)\n\n\t\t\tif (index !== -1 && index != undefined)\n\t\t\t\tthis.currProject.geometry[index] = payload\n\t\t},\n\n\t\t/**\n\t\t * Get the geometry object by ID\n\t\t * @param id The ID of the geometry object to get.\n\t\t * @returns The geometry object with the provided ID.\n\t\t */\n\t\tgetGeometryObjectById(id: string) {\n\t\t\tif (this.currProject) {\n\t\t\t\treturn this.currProject.geometry.find((obj) => obj.id === id)\n\t\t\t} else {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Returns nested group\n\t\t * @param id \n\t\t * @returns \n\t\t */\n\t\tgetGroupById(id: string): Group | null{\n\t\t\tif (this.projectGroups) {\n\t\t\t\treturn this.projectGroups.find((group) => group.id === id)\n\t\t\t} else {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Adds results to the current project.\n\t\t * @param result The results to add.\n\t\t */\n\t\taddResults(result: Results) {\n\t\t\tif (this.currProject?.results != null)\n\t\t\t\tthis.currProject.results.push(result)\n\t\t\telse if (this.currProject != null) this.currProject.results = [result]\n\t\t},\n\n\t\t/**\n\t\t * Updates results in the current project.\n\t\t * @param payload The updated results.\n\t\t * @param id The ID of the results to update.\n\t\t */\n\t\tupdateResults(payload: Results, id: string) {\n\t\t\tif (!id || !payload || this.currProject === undefined) return\n\n\t\t\tconst index = this.findResultIndexById(id)\n\n\t\t\tif (\n\t\t\t\tindex !== -1 &&\n\t\t\t\tindex != undefined &&\n\t\t\t\tthis.currProject?.results != null\n\t\t\t)\n\t\t\t\tthis.currProject.results[index] = payload\n\t\t},\n\n\t\t/**\n\t\t * Set the highlighted label in the project\n\t\t * @param label\n\t\t */\n\t\tsetHighlightedLabel(label: string) {\n\t\t\tthis.highlightedLabel = label\n\t\t},\n\n\t\t/**\n\t\t * Set the selected group in the project\n\t\t * @param group\n\t\t * @returns\n\t\t */\n\t\tsetSelectedGroup(group: NestedGroup) {\n\t\t\tthis.selectedGroup = group\n\t\t\tthis.setObjectsFromGroup()\n\t\t},\n\n\t\t/**\n\t\t * set selected objects from the selected group\n\t\t * Can be used to reset selection\n\t\t */\n\t\tsetObjectsFromGroup() {\n\t\t\tthis.selectedObjects = []\n\t\t\t//if null just return\n\t\t\tif (this.selectedGroup === null) return\n\n\t\t\tconst group = this.selectedGroup\n\t\t\tgroup.objects.forEach(element => {\n\t\t\t\tthis.selectedObjects?.push(element)\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Set the selected objects in the project\n\t\t * @param objects\n\t\t */\n\t\tsetSelectedObjects(objects: GeometryObject[]) {\n\t\t\tthis.selectedObjects = objects\n\t\t},\n\n\t\t/**\n\t\t * Set the selected objects in the project by URI\n\t\t * @param uri\n\t\t */\n\t\tsetObjectsByURI(uri: string[]) {\n\t\t\tconst objects = this.currProject.geometry\n\t\t\tconst foundObjects = objects?.filter((obj) => {\n\t\t\t\treturn uri.includes(obj.URI as string)\n\t\t\t})\n\t\t\tthis.selectedObjects = foundObjects\n\t\t},\n\n\t\t/**\n\t\t * Set the selected objects to a subset of current selected objects by ID\n\t\t * Only searching current selected objects but if we need we can expand to whole project\n\t\t * @param id ids of objects to select\n\t\t */\n\t\tsetObjectsById(id: string[]) {\n\t\t\tconst objects = this.currProject.geometry\n\t\t\tconst foundObjects = objects?.filter((obj) => {\n\t\t\t\treturn id.includes(obj.id)\n\t\t\t})\n\t\t\tthis.selectedObjects = foundObjects\n\t\t},\n\n\t\t/**\n\t\t * Clear the selected objects in the project\n\t\t */\n\t\tclearSelectedObjects() {\n\t\t\tthis.selectedObjects = []\n\t\t},\n\n\t\t/**\n\t\t * Clear the selected group and objects in the project\n\t\t */\n\t\tclearSelectedGroup() {\n\t\t\tthis.selectedGroup = null\n\t\t\tthis.selectedObjects = []\n\t\t},\n\n\t\t/**\n\t\t * returns only the URI of the selected objects in the project\n\t\t * @returns \n\t\t */\n\t\tgetSelectedObjectsURI() {\n\t\t\tif (this.selectedObjects) {\n\t\t\t\treturn this.selectedObjects.map((obj) => obj.URI as string)\n\t\t\t} else {\n\t\t\t\treturn []\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Returns tree structure of current filter groupings in the project\n\t\t */\n\t\tgetGroupTree() {\n\t\t\tif (this.projectGroups) {\n\t\t\t\tconst data = this.projectGroups\n\n\t\t\t\t// Creating the nested object\n\t\t\t\tconst nestedObject = createNestedObject(data)\n\t\t\t\t// Sorting the nested object by the number of objects in each group\n\t\t\t\tnestedObject.children.sort((a, b) => b.objects.length - a.objects.length)\n\t\t\t\treturn nestedObject\n\t\t\t} else {\n\t\t\t\tconst msg =\n\t\t\t\t\t'No groups found to create tree structure in current project.'\n\t\t\t\tlogMessageToSentry(msg, 'info')\n\t\t\t\tconsole.log(msg)\n\t\t\t}\n\n\t\t\t// Add a return statement here\n\t\t\treturn null\n\t\t},\n\n\t\t/**\n\t\t * Finds the index of a geometry object in the current project by its ID.\n\t\t * @param id The ID of the geometry object to find.\n\t\t * @returns The index of the geometry object, or -1 if not found.\n\t\t */\n\t\tfindGeometryIndexById(id: string) {\n\t\t\treturn this.currProject?.geometry.findIndex((item) => item.id === id)\n\t\t},\n\n\t\t/**\n\t\t * Finds the index of results in the current project by its ID.\n\t\t * @param id The ID of the results to find.\n\t\t * @returns The index of the results, or -1 if not found.\n\t\t */\n\t\tfindResultIndexById(id: string) {\n\t\t\treturn this.currProject?.geometry.findIndex((item) => item.id === id)\n\t\t},\n\t}\n})\n","\n\n\n\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","export default \"__VITE_ASSET__d4174b6c__\"","\n\n\n","\n\n\n","\n\n\n","\n\n\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M6.32 2.577a49.255 49.255 0 0 1 11.36 0c1.497.174 2.57 1.46 2.57 2.93V21a.75.75 0 0 1-1.085.67L12 18.089l-7.165 3.583A.75.75 0 0 1 3.75 21V5.507c0-1.47 1.073-2.756 2.57-2.93Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"m15 1.784-.796.795a1.125 1.125 0 1 0 1.591 0L15 1.784ZM12 1.784l-.796.795a1.125 1.125 0 1 0 1.591 0L12 1.784ZM9 1.784l-.796.795a1.125 1.125 0 1 0 1.591 0L9 1.784ZM9.75 7.547c.498-.021.998-.035 1.5-.042V6.75a.75.75 0 0 1 1.5 0v.755c.502.007 1.002.021 1.5.042V6.75a.75.75 0 0 1 1.5 0v.88l.307.022c1.55.117 2.693 1.427 2.693 2.946v1.018a62.182 62.182 0 0 0-13.5 0v-1.018c0-1.519 1.143-2.829 2.693-2.946l.307-.022v-.88a.75.75 0 0 1 1.5 0v.797ZM12 12.75c-2.472 0-4.9.184-7.274.54-1.454.217-2.476 1.482-2.476 2.916v.384a4.104 4.104 0 0 1 2.585.364 2.605 2.605 0 0 0 2.33 0 4.104 4.104 0 0 1 3.67 0 2.605 2.605 0 0 0 2.33 0 4.104 4.104 0 0 1 3.67 0 2.605 2.605 0 0 0 2.33 0 4.104 4.104 0 0 1 2.585-.364v-.384c0-1.434-1.022-2.7-2.476-2.917A49.138 49.138 0 0 0 12 12.75ZM21.75 18.131a2.604 2.604 0 0 0-1.915.165 4.104 4.104 0 0 1-3.67 0 2.605 2.605 0 0 0-2.33 0 4.104 4.104 0 0 1-3.67 0 2.605 2.605 0 0 0-2.33 0 4.104 4.104 0 0 1-3.67 0 2.604 2.604 0 0 0-1.915-.165v2.494c0 1.035.84 1.875 1.875 1.875h15.75c1.035 0 1.875-.84 1.875-1.875v-2.494Z\" })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M6.32 1.827a49.255 49.255 0 0 1 11.36 0c1.497.174 2.57 1.46 2.57 2.93V19.5a3 3 0 0 1-3 3H6.75a3 3 0 0 1-3-3V4.757c0-1.47 1.073-2.756 2.57-2.93ZM7.5 11.25a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75H8.25a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V13.5a.75.75 0 0 0-.75-.75H8.25Zm-.75 3a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75H8.25a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V18a.75.75 0 0 0-.75-.75H8.25Zm1.748-6a.75.75 0 0 1 .75-.75h.007a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.007a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.335.75.75.75h.007a.75.75 0 0 0 .75-.75V13.5a.75.75 0 0 0-.75-.75h-.007Zm-.75 3a.75.75 0 0 1 .75-.75h.007a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.007a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.335.75.75.75h.007a.75.75 0 0 0 .75-.75V18a.75.75 0 0 0-.75-.75h-.007Zm1.754-6a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.008a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V13.5a.75.75 0 0 0-.75-.75h-.008Zm-.75 3a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.008a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V18a.75.75 0 0 0-.75-.75h-.008Zm1.748-6a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.008a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V13.5a.75.75 0 0 0-.75-.75h-.008Zm-8.25-6A.75.75 0 0 1 8.25 6h7.5a.75.75 0 0 1 .75.75v.75a.75.75 0 0 1-.75.75h-7.5a.75.75 0 0 1-.75-.75v-.75Zm9 9a.75.75 0 0 0-1.5 0V18a.75.75 0 0 0 1.5 0v-2.25Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M12.53 16.28a.75.75 0 0 1-1.06 0l-7.5-7.5a.75.75 0 0 1 1.06-1.06L12 14.69l6.97-6.97a.75.75 0 1 1 1.06 1.06l-7.5 7.5Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M7.72 12.53a.75.75 0 0 1 0-1.06l7.5-7.5a.75.75 0 1 1 1.06 1.06L9.31 12l6.97 6.97a.75.75 0 1 1-1.06 1.06l-7.5-7.5Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M11.47 7.72a.75.75 0 0 1 1.06 0l7.5 7.5a.75.75 0 1 1-1.06 1.06L12 9.31l-6.97 6.97a.75.75 0 0 1-1.06-1.06l7.5-7.5Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M8.161 2.58a1.875 1.875 0 0 1 1.678 0l4.993 2.498c.106.052.23.052.336 0l3.869-1.935A1.875 1.875 0 0 1 21.75 4.82v12.485c0 .71-.401 1.36-1.037 1.677l-4.875 2.437a1.875 1.875 0 0 1-1.676 0l-4.994-2.497a.375.375 0 0 0-.336 0l-3.868 1.935A1.875 1.875 0 0 1 2.25 19.18V6.695c0-.71.401-1.36 1.036-1.677l4.875-2.437ZM9 6a.75.75 0 0 1 .75.75V15a.75.75 0 0 1-1.5 0V6.75A.75.75 0 0 1 9 6Zm6.75 3a.75.75 0 0 0-1.5 0v8.25a.75.75 0 0 0 1.5 0V9Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm3 10.5a.75.75 0 0 0 0-1.5H9a.75.75 0 0 0 0 1.5h6Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"M21.731 2.269a2.625 2.625 0 0 0-3.712 0l-1.157 1.157 3.712 3.712 1.157-1.157a2.625 2.625 0 0 0 0-3.712ZM19.513 8.199l-3.712-3.712-8.4 8.4a5.25 5.25 0 0 0-1.32 2.214l-.8 2.685a.75.75 0 0 0 .933.933l2.685-.8a5.25 5.25 0 0 0 2.214-1.32l8.4-8.4Z\" }),\n _createElementVNode(\"path\", { d: \"M5.25 5.25a3 3 0 0 0-3 3v10.5a3 3 0 0 0 3 3h10.5a3 3 0 0 0 3-3V13.5a.75.75 0 0 0-1.5 0v5.25a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V8.25a1.5 1.5 0 0 1 1.5-1.5h5.25a.75.75 0 0 0 0-1.5H5.25Z\" })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25ZM12.75 9a.75.75 0 0 0-1.5 0v2.25H9a.75.75 0 0 0 0 1.5h2.25V15a.75.75 0 0 0 1.5 0v-2.25H15a.75.75 0 0 0 0-1.5h-2.25V9Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","/**!\n * Sortable 1.14.0\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.14.0\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\n\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\n\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\n\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\n\nfunction matches(\n/**HTMLElement*/\nel,\n/**String*/\nselector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n\n return false;\n}\n\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\n\nfunction closest(\n/**HTMLElement*/\nel,\n/**String*/\nselector,\n/**HTMLElement*/\nctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n\n return null;\n}\n\nvar R_SPACE = /\\s+/g;\n\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\n\nfunction css(el, prop, val) {\n var style = el && el.style;\n\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\n\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n\n } while (!selfOnly && (el = el.parentNode));\n }\n\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n\n return matrixFn && new matrixFn(appliedTransforms);\n}\n\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n\n return list;\n }\n\n return [];\n}\n\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n/**\n * Returns the \"bounding client rect\" of given element\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\n * @param {[HTMLElement]} container The parent the element will be placed in\n * @return {Object} The boundingClientRect of el, with specified adjustments\n */\n\n\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container\n\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n\n } while (container = container.parentNode);\n }\n }\n\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n/**\n * Checks if a side of an element is scrolled past a side of its parents\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\n */\n\n\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n /* jshint boss:true */\n\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n\n return false;\n}\n/**\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\n * and non-draggable elements\n * @param {HTMLElement} el The parent element\n * @param {Number} childNum The index of the child\n * @param {Object} options Parent Sortable's options\n * @return {HTMLElement} The child at index childNum, or null if not found\n */\n\n\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n\n currentChild++;\n }\n\n i++;\n }\n\n return null;\n}\n/**\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\n * @param {HTMLElement} el Parent element\n * @param {selector} selector Any other elements that should be ignored\n * @return {HTMLElement} The last child, ignoring ghostEl\n */\n\n\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n\n return last || null;\n}\n/**\n * Returns the index of an element within its parent for a selected set of\n * elements\n * @param {HTMLElement} el\n * @param {selector} selector\n * @return {number}\n */\n\n\nfunction index(el, selector) {\n var index = 0;\n\n if (!el || !el.parentNode) {\n return -1;\n }\n /* jshint boss:true */\n\n\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n\n return index;\n}\n/**\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\n * The value is returned in real pixels.\n * @param {HTMLElement} el\n * @return {Array} Offsets in the format of [left, top]\n */\n\n\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n\n return [offsetLeft, offsetTop];\n}\n/**\n * Returns the index of the object within the given array\n * @param {Array} arr Array that may or may not hold the object\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\n * @return {Number} The index of the object in the array, or -1\n */\n\n\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n\n return -1;\n}\n\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n\n } while (elem = elem.parentNode);\n\n return getWindowScrollingElement();\n}\n\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n\n return dst;\n}\n\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\n\nvar _throttleTimeout;\n\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\n\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\n\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\n\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\n\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\n\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\n\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation\n\n\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n\n target.toRect = toRect;\n\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n } // if fromRect != toRect: animate\n\n\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n\n if (!time) {\n time = _this.options.animation;\n }\n\n _this.animate(target, animatingRect, toRect, time);\n }\n\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\n\nfunction repaint(target) {\n return target.offsetWidth;\n}\n\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n\n this.eventCanceled = false;\n\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable\n\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n } // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n\n\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized; // Add default options from plugin\n\n _extends(defaults, initialized.defaults);\n });\n\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature\n\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\n\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\n\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\n\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\nghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n_silent = false,\n savedInputChecked = [];\n/** @const */\n\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\nsupportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return; // false when <= IE11\n\n if (IE11OrLess) {\n return false;\n }\n\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n}(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n},\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n},\n\n/**\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\n * @param {Number} x X position\n * @param {Number} y Y position\n * @return {HTMLElement} Element of the first found nearest Sortable\n */\n_detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n},\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n\n var group = {};\n var originalGroup = options.group;\n\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n},\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n},\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n}; // #1184 fix - Prevent click event on fallback if dragged but item not changed position\n\n\nif (documentExists) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\n\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n\n if (nearest) {\n // Create imitation event\n var event = {};\n\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n\n nearest[expando]._onDragOver(event);\n }\n }\n};\n\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n/**\n * @class Sortable\n * @param {HTMLElement} el\n * @param {Object} [options]\n */\n\n\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n\n this.el = el; // root element\n\n this.options = options = _extends({}, options); // Export instance\n\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults); // Set default options\n\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n\n _prepareGroup(options); // Bind all private methods\n\n\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n } // Setup drag mode\n\n\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n } // Bind events\n\n\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n\n sortables.push(this.el); // Restore sorting\n\n options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager\n\n _extends(this, AnimationStateManager());\n}\n\nSortable.prototype =\n/** @lends Sortable.prototype */\n{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart(\n /** Event|TouchEvent */\n evt) {\n if (!evt.cancelable) return;\n\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n\n _saveInputCheckedState(el); // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n\n\n if (dragEl) {\n return;\n }\n\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n } // cancel dnd if original target is content editable\n\n\n if (originalTarget.isContentEditable) {\n return;\n } // Safari ignores further event handling after mousedown\n\n\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n\n target = closest(target, options.draggable, el, false);\n\n if (target && target.animated) {\n return;\n }\n\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n } // Get the index of the dragged element within its parent\n\n\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable); // Check filter\n\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n } // Prepare `dragstart`\n\n\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart(\n /** Event */\n evt,\n /** Touch */\n touch,\n /** HTMLElement */\n target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n\n if (Sortable.eventCanceled) {\n _this._onDrop();\n\n return;\n } // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n\n\n _this._disableDelayedDragEvents();\n\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n } // Bind the events: dragstart/dragend\n\n\n _this._triggerDragStart(evt, touch); // Drag start event\n\n\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n }); // Chosen item\n\n\n toggleClass(dragEl, options.chosenClass, true);\n }; // Disable \"draggable\"\n\n\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop); // Make dragEl draggable (must be before delay for FireFox)\n\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n\n pluginEvent('delayStart', this, {\n evt: evt\n }); // Delay is impossible for native DnD in Edge or IE\n\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n\n return;\n } // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n\n\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(\n /** TouchEvent|PointerEvent **/\n e) {\n var touch = e.touches ? e.touches[0] : e;\n\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart(\n /** Event */\n evt,\n /** Touch */\n touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n\n try {\n if (document.selection) {\n // Timeout neccessary for IE9\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n\n awaitingDragStarted = false;\n\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n\n var options = this.options; // Apply effect\n\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost(); // Drag start event\n\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n\n _hideGhostForTarget();\n\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n\n target = parent; // store last element\n }\n /* jshint boss:true */\n while (parent = parent.parentNode);\n }\n\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove(\n /**TouchEvent*/\n evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging\n\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n\n this._onDragStart(evt, true);\n }\n\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options; // Position absolutely\n\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl); // Set transform-origin\n\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart(\n /**Event*/\n evt,\n /**boolean*/\n fallback) {\n var _this = this;\n\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n\n if (Sortable.eventCanceled) {\n this._onDrop();\n\n return;\n }\n\n pluginEvent('setupClone', this);\n\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n\n this._hideClone();\n\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n } // #1143: IFrame support workaround\n\n\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n\n _this._hideClone();\n\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events\n\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n\n on(document, 'drop', _this); // #1276 fix:\n\n css(dragEl, 'transform', 'translateZ(0)');\n }\n\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver(\n /**Event*/\n evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n\n if (_silent) return;\n\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n } // Capture animation state\n\n\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n\n _this.captureAnimationState();\n\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n } // Return invocation when dragEl is inserted (or completed)\n\n\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n } // Animation\n\n\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n } // Null lastTarget if it is not inside a previously swapped element\n\n\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n } // no bubbling and not fallback\n\n\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted\n\n\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n } // Call when dragEl has been inserted\n\n\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n\n ignoreNextClick = false;\n\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n\n if (revert) {\n parentEl = rootEl; // actualization\n\n capture();\n\n this._hideClone();\n\n dragOverEvent('revert');\n\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n\n return completed(true);\n }\n\n var elLastChild = lastChild(el, options.draggable);\n\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n } // if there is a last element, it is the target\n\n\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n\n if (target) {\n targetRect = getRect(target);\n }\n\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n el.appendChild(dragEl);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n\n if (firstChild === dragEl) {\n return completed(false);\n }\n\n target = firstChild;\n targetRect = getRect(target);\n\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n } // If dragEl is already beside target: Do not insert\n\n\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n } // Undo chrome's scroll adjustment (has no effect on other browsers)\n\n\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n\n parentEl = dragEl.parentNode; // actualization\n // must be done before animation\n\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n\n changed();\n return completed(true);\n }\n }\n\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop(\n /**Event*/\n evt) {\n var el = this.el,\n options = this.options; // Get the index of the dragged element within its parent\n\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode; // Get again after plugin event\n\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n\n if (Sortable.eventCanceled) {\n this._nulling();\n\n return;\n }\n\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n\n _cancelNextTick(this.cloneId);\n\n _cancelNextTick(this._dragStartId); // Unbind events\n\n\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n\n this._offMoveEvents();\n\n this._offUpEvents();\n\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n\n css(dragEl, 'transform', '');\n\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n\n _disableDraggable(dragEl);\n\n dragEl.style['will-change'] = ''; // Remove classes\n // ghostClass is added in dragStarted\n\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n\n toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event\n\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n }); // Remove event\n\n\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n }); // drag from one list and drop into another\n\n\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n }); // Save sorting\n\n\n this.save();\n }\n }\n }\n\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent(\n /**Event*/\n evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n\n break;\n\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n\n _globalDragOver(evt);\n }\n\n break;\n\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n\n /**\n * Serializes the item into an array of string.\n * @returns {String[]}\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n\n for (; i < n; i++) {\n el = children[i];\n\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n\n return order;\n },\n\n /**\n * Sorts the elements according to the array.\n * @param {String[]} order order of the items\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n\n /**\n * Save the current sorting\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n\n /**\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\n * @param {HTMLElement} el\n * @param {String} [selector] default: `options.draggable`\n * @returns {HTMLElement|null}\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n\n /**\n * Set/get option\n * @param {string} name\n * @param {*} [value]\n * @returns {*}\n */\n option: function option(name, value) {\n var options = this.options;\n\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n\n /**\n * Destroy\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n } // Remove draggable attributes\n\n\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n\n this._onDrop();\n\n this._disableDelayedDragEvents();\n\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n\n return;\n }\n\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return; // show clone at dragEl or original position\n\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\n\nfunction _globalDragOver(\n/**Event*/\nevt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n\n evt.cancelable && evt.preventDefault();\n}\n\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal; // Support for new CustomEvent feature\n\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n\n return retVal;\n}\n\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\n\nfunction _unsilent() {\n _silent = false;\n}\n\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var rect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var spacer = 10;\n return vertical ? evt.clientX < rect.left - spacer || evt.clientY < rect.top && evt.clientX < rect.right : evt.clientY < rect.top - spacer || evt.clientY < rect.bottom && evt.clientX < rect.left;\n}\n\nfunction _ghostIsLast(evt, vertical, sortable) {\n var rect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var spacer = 10;\n return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer;\n}\n\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n\n invert = invert || invertSwap;\n\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n\n return 0;\n}\n/**\n * Gets the direction dragEl must be swapped relative to target in order to make it\n * seem that dragEl has been \"inserted\" into that element's position\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\n * @return {Number} Direction dragEl must be swapped\n */\n\n\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n/**\n * Generate id\n * @param {HTMLElement} el\n * @returns {String}\n * @private\n */\n\n\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n\n while (i--) {\n sum += str.charCodeAt(i);\n }\n\n return sum.toString(36);\n}\n\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\n\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\n\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n} // Fixed #973:\n\n\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n} // Export utils\n\n\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild\n};\n/**\n * Get the Sortable instance of an element\n * @param {HTMLElement} element The element\n * @return {Sortable|undefined} The instance of Sortable\n */\n\nSortable.get = function (element) {\n return element[expando];\n};\n/**\n * Mount a plugin to Sortable\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\n */\n\n\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n/**\n * Create sortable instance\n * @param {HTMLElement} el\n * @param {Object} [options]\n */\n\n\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n}; // Export\n\n\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\n\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n }; // Bind all private methods\n\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt; // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change\n\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour\n\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\n\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\n\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\n\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn; // New scroll root, set scrollEl\n\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n\n var layersOut = 0;\n var currentParent = scrollEl;\n\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n\n }\n\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\n\nfunction Revert() {}\n\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n\n this.sortable.animateAll();\n\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\n\nfunction Remove() {}\n\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\n\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\n\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\nmultiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\nfolding = false,\n // Folding any other time\ndragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\n\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n\n dataTransfer.setData('Text', data);\n }\n };\n }\n\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n\n sortable._hideClone();\n\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n }); // Sort multi-drag elements\n\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n sortable.captureAnimationState();\n\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n } // Remove all auxiliary multidrag items from el, if sorting enabled\n\n\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n\n initialFolding = false; // If leaving sort:false root, or already folding - Fold to new location\n\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute); // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n } // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n\n\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n\n activeSortable._showClone(sortable); // Unfold animation for clones if showing from hidden\n\n\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children; // Multi-drag selection\n\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvt: evt\n }); // Modifier activated, select from last to dragEl\n\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvt: evt\n });\n }\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvt: evt\n });\n }\n } // Multi-drag drop\n\n\n if (dragStarted && this.isMultiDrag) {\n folding = false; // Do not \"unfold\" after around dragEl if reverted\n\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect; // Prepare unfold animation\n\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n } // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n\n\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n\n multiDragIndex++;\n }); // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n\n if (update) {\n dispatchSortableEvent('update');\n }\n }\n } // Must be done after capturing individual rects (scroll bar)\n\n\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n\n multiDragSortable = toSortable;\n } // Remove clones if necessary\n\n\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return; // Only deselect if selection is in this sortable\n\n if (multiDragSortable !== this.sortable) return; // Only deselect if target is not item in this sortable\n\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; // Only deselect if left click\n\n if (evt && evt.button !== 0) return;\n\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvt: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\n * Selects the provided multi-drag item\n * @param {HTMLElement} el The element to be selected\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n\n multiDragSortable = sortable;\n }\n\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n\n /**\n * Deselects the provided multi-drag item\n * @param {HTMLElement} el The element to be deselected\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n }); // multiDragElements will already be sorted if folding\n\n var newIndex;\n\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n\n return key;\n }\n }\n });\n}\n\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n/**\n * Insert multi-drag clones\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\n * @param {HTMLElement} rootEl\n */\n\n\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\n\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"vue\"), require(\"sortablejs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([, \"sortablejs\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vuedraggable\"] = factory(require(\"vue\"), require(\"sortablejs\"));\n\telse\n\t\troot[\"vuedraggable\"] = factory(root[\"Vue\"], root[\"Sortable\"]);\n})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__8bbf__, __WEBPACK_EXTERNAL_MODULE_a352__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = \"fb15\");\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"00ee\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar wellKnownSymbol = __webpack_require__(\"b622\");\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n\n\n/***/ }),\n\n/***/ \"0366\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar aFunction = __webpack_require__(\"1c0b\");\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n\n\n/***/ }),\n\n/***/ \"057f\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toIndexedObject = __webpack_require__(\"fc6a\");\nvar nativeGetOwnPropertyNames = __webpack_require__(\"241c\").f;\n\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n\n\n/***/ }),\n\n/***/ \"06cf\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar DESCRIPTORS = __webpack_require__(\"83ab\");\nvar propertyIsEnumerableModule = __webpack_require__(\"d1e7\");\nvar createPropertyDescriptor = __webpack_require__(\"5c6c\");\nvar toIndexedObject = __webpack_require__(\"fc6a\");\nvar toPrimitive = __webpack_require__(\"c04e\");\nvar has = __webpack_require__(\"5135\");\nvar IE8_DOM_DEFINE = __webpack_require__(\"0cfb\");\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n\n\n/***/ }),\n\n/***/ \"0cfb\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar DESCRIPTORS = __webpack_require__(\"83ab\");\nvar fails = __webpack_require__(\"d039\");\nvar createElement = __webpack_require__(\"cc12\");\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n\n\n/***/ }),\n\n/***/ \"13d5\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $ = __webpack_require__(\"23e7\");\nvar $reduce = __webpack_require__(\"d58f\").left;\nvar arrayMethodIsStrict = __webpack_require__(\"a640\");\nvar arrayMethodUsesToLength = __webpack_require__(\"ae40\");\n\nvar STRICT_METHOD = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n\n/***/ }),\n\n/***/ \"14c3\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar classof = __webpack_require__(\"c6b6\");\nvar regexpExec = __webpack_require__(\"9263\");\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n\n\n/***/ }),\n\n/***/ \"159b\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"da84\");\nvar DOMIterables = __webpack_require__(\"fdbc\");\nvar forEach = __webpack_require__(\"17c2\");\nvar createNonEnumerableProperty = __webpack_require__(\"9112\");\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n\n\n/***/ }),\n\n/***/ \"17c2\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $forEach = __webpack_require__(\"b727\").forEach;\nvar arrayMethodIsStrict = __webpack_require__(\"a640\");\nvar arrayMethodUsesToLength = __webpack_require__(\"ae40\");\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n\n\n/***/ }),\n\n/***/ \"1be4\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getBuiltIn = __webpack_require__(\"d066\");\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n\n\n/***/ }),\n\n/***/ \"1c0b\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ \"1c7e\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar wellKnownSymbol = __webpack_require__(\"b622\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n\n\n/***/ }),\n\n/***/ \"1d80\":\n/***/ (function(module, exports) {\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n\n/***/ }),\n\n/***/ \"1dde\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar fails = __webpack_require__(\"d039\");\nvar wellKnownSymbol = __webpack_require__(\"b622\");\nvar V8_VERSION = __webpack_require__(\"2d00\");\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n\n\n/***/ }),\n\n/***/ \"23cb\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(\"a691\");\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n\n\n/***/ }),\n\n/***/ \"23e7\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"da84\");\nvar getOwnPropertyDescriptor = __webpack_require__(\"06cf\").f;\nvar createNonEnumerableProperty = __webpack_require__(\"9112\");\nvar redefine = __webpack_require__(\"6eeb\");\nvar setGlobal = __webpack_require__(\"ce4e\");\nvar copyConstructorProperties = __webpack_require__(\"e893\");\nvar isForced = __webpack_require__(\"94ca\");\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n\n\n/***/ }),\n\n/***/ \"241c\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar internalObjectKeys = __webpack_require__(\"ca84\");\nvar enumBugKeys = __webpack_require__(\"7839\");\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n\n\n/***/ }),\n\n/***/ \"25f0\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar redefine = __webpack_require__(\"6eeb\");\nvar anObject = __webpack_require__(\"825a\");\nvar fails = __webpack_require__(\"d039\");\nvar flags = __webpack_require__(\"ad6d\");\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n\n\n/***/ }),\n\n/***/ \"2ca0\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $ = __webpack_require__(\"23e7\");\nvar getOwnPropertyDescriptor = __webpack_require__(\"06cf\").f;\nvar toLength = __webpack_require__(\"50c4\");\nvar notARegExp = __webpack_require__(\"5a34\");\nvar requireObjectCoercible = __webpack_require__(\"1d80\");\nvar correctIsRegExpLogic = __webpack_require__(\"ab13\");\nvar IS_PURE = __webpack_require__(\"c430\");\n\nvar nativeStartsWith = ''.startsWith;\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.startsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = String(requireObjectCoercible(this));\n notARegExp(searchString);\n var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n\n\n/***/ }),\n\n/***/ \"2d00\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"da84\");\nvar userAgent = __webpack_require__(\"342f\");\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n\n\n/***/ }),\n\n/***/ \"342f\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getBuiltIn = __webpack_require__(\"d066\");\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n\n\n/***/ }),\n\n/***/ \"35a1\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar classof = __webpack_require__(\"f5df\");\nvar Iterators = __webpack_require__(\"3f8c\");\nvar wellKnownSymbol = __webpack_require__(\"b622\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n\n\n/***/ }),\n\n/***/ \"37e8\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar DESCRIPTORS = __webpack_require__(\"83ab\");\nvar definePropertyModule = __webpack_require__(\"9bf2\");\nvar anObject = __webpack_require__(\"825a\");\nvar objectKeys = __webpack_require__(\"df75\");\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n\n\n/***/ }),\n\n/***/ \"3bbe\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"861d\");\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ \"3ca3\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar charAt = __webpack_require__(\"6547\").charAt;\nvar InternalStateModule = __webpack_require__(\"69f3\");\nvar defineIterator = __webpack_require__(\"7dd0\");\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n\n\n/***/ }),\n\n/***/ \"3f8c\":\n/***/ (function(module, exports) {\n\nmodule.exports = {};\n\n\n/***/ }),\n\n/***/ \"4160\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $ = __webpack_require__(\"23e7\");\nvar forEach = __webpack_require__(\"17c2\");\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {\n forEach: forEach\n});\n\n\n/***/ }),\n\n/***/ \"428f\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"da84\");\n\nmodule.exports = global;\n\n\n/***/ }),\n\n/***/ \"44ad\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar fails = __webpack_require__(\"d039\");\nvar classof = __webpack_require__(\"c6b6\");\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n\n\n/***/ }),\n\n/***/ \"44d2\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar wellKnownSymbol = __webpack_require__(\"b622\");\nvar create = __webpack_require__(\"7c73\");\nvar definePropertyModule = __webpack_require__(\"9bf2\");\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n\n\n/***/ }),\n\n/***/ \"44e7\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"861d\");\nvar classof = __webpack_require__(\"c6b6\");\nvar wellKnownSymbol = __webpack_require__(\"b622\");\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n\n\n/***/ }),\n\n/***/ \"4930\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar fails = __webpack_require__(\"d039\");\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n\n\n/***/ }),\n\n/***/ \"4d64\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toIndexedObject = __webpack_require__(\"fc6a\");\nvar toLength = __webpack_require__(\"50c4\");\nvar toAbsoluteIndex = __webpack_require__(\"23cb\");\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n\n\n/***/ }),\n\n/***/ \"4de4\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $ = __webpack_require__(\"23e7\");\nvar $filter = __webpack_require__(\"b727\").filter;\nvar arrayMethodHasSpeciesSupport = __webpack_require__(\"1dde\");\nvar arrayMethodUsesToLength = __webpack_require__(\"ae40\");\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n// Edge 14- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n\n/***/ }),\n\n/***/ \"4df4\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar bind = __webpack_require__(\"0366\");\nvar toObject = __webpack_require__(\"7b0b\");\nvar callWithSafeIterationClosing = __webpack_require__(\"9bdd\");\nvar isArrayIteratorMethod = __webpack_require__(\"e95a\");\nvar toLength = __webpack_require__(\"50c4\");\nvar createProperty = __webpack_require__(\"8418\");\nvar getIteratorMethod = __webpack_require__(\"35a1\");\n\n// `Array.from` method implementation\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n\n\n/***/ }),\n\n/***/ \"4fad\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $ = __webpack_require__(\"23e7\");\nvar $entries = __webpack_require__(\"6f53\").entries;\n\n// `Object.entries` method\n// https://tc39.github.io/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n\n\n/***/ }),\n\n/***/ \"50c4\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(\"a691\");\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n\n\n/***/ }),\n\n/***/ \"5135\":\n/***/ (function(module, exports) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n\n/***/ \"5319\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar fixRegExpWellKnownSymbolLogic = __webpack_require__(\"d784\");\nvar anObject = __webpack_require__(\"825a\");\nvar toObject = __webpack_require__(\"7b0b\");\nvar toLength = __webpack_require__(\"50c4\");\nvar toInteger = __webpack_require__(\"a691\");\nvar requireObjectCoercible = __webpack_require__(\"1d80\");\nvar advanceStringIndex = __webpack_require__(\"8aa5\");\nvar regExpExec = __webpack_require__(\"14c3\");\n\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n\n\n/***/ }),\n\n/***/ \"5692\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar IS_PURE = __webpack_require__(\"c430\");\nvar store = __webpack_require__(\"c6cd\");\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.6.5',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n\n\n/***/ }),\n\n/***/ \"56ef\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getBuiltIn = __webpack_require__(\"d066\");\nvar getOwnPropertyNamesModule = __webpack_require__(\"241c\");\nvar getOwnPropertySymbolsModule = __webpack_require__(\"7418\");\nvar anObject = __webpack_require__(\"825a\");\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n\n\n/***/ }),\n\n/***/ \"5a34\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isRegExp = __webpack_require__(\"44e7\");\n\nmodule.exports = function (it) {\n if (isRegExp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n};\n\n\n/***/ }),\n\n/***/ \"5c6c\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\n\n/***/ }),\n\n/***/ \"5db7\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $ = __webpack_require__(\"23e7\");\nvar flattenIntoArray = __webpack_require__(\"a2bf\");\nvar toObject = __webpack_require__(\"7b0b\");\nvar toLength = __webpack_require__(\"50c4\");\nvar aFunction = __webpack_require__(\"1c0b\");\nvar arraySpeciesCreate = __webpack_require__(\"65f0\");\n\n// `Array.prototype.flatMap` method\n// https://github.com/tc39/proposal-flatMap\n$({ target: 'Array', proto: true }, {\n flatMap: function flatMap(callbackfn /* , thisArg */) {\n var O = toObject(this);\n var sourceLen = toLength(O.length);\n var A;\n aFunction(callbackfn);\n A = arraySpeciesCreate(O, 0);\n A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return A;\n }\n});\n\n\n/***/ }),\n\n/***/ \"6547\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(\"a691\");\nvar requireObjectCoercible = __webpack_require__(\"1d80\");\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n\n\n/***/ }),\n\n/***/ \"65f0\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"861d\");\nvar isArray = __webpack_require__(\"e8b5\");\nvar wellKnownSymbol = __webpack_require__(\"b622\");\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n\n\n/***/ }),\n\n/***/ \"69f3\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar NATIVE_WEAK_MAP = __webpack_require__(\"7f9a\");\nvar global = __webpack_require__(\"da84\");\nvar isObject = __webpack_require__(\"861d\");\nvar createNonEnumerableProperty = __webpack_require__(\"9112\");\nvar objectHas = __webpack_require__(\"5135\");\nvar sharedKey = __webpack_require__(\"f772\");\nvar hiddenKeys = __webpack_require__(\"d012\");\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = new WeakMap();\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n\n\n/***/ }),\n\n/***/ \"6eeb\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"da84\");\nvar createNonEnumerableProperty = __webpack_require__(\"9112\");\nvar has = __webpack_require__(\"5135\");\nvar setGlobal = __webpack_require__(\"ce4e\");\nvar inspectSource = __webpack_require__(\"8925\");\nvar InternalStateModule = __webpack_require__(\"69f3\");\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) createNonEnumerableProperty(value, 'name', key);\n enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n\n\n/***/ }),\n\n/***/ \"6f53\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar DESCRIPTORS = __webpack_require__(\"83ab\");\nvar objectKeys = __webpack_require__(\"df75\");\nvar toIndexedObject = __webpack_require__(\"fc6a\");\nvar propertyIsEnumerable = __webpack_require__(\"d1e7\").f;\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod(false)\n};\n\n\n/***/ }),\n\n/***/ \"73d9\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// this method was added to unscopables after implementation\n// in popular engines, so it's moved to a separate module\nvar addToUnscopables = __webpack_require__(\"44d2\");\n\naddToUnscopables('flatMap');\n\n\n/***/ }),\n\n/***/ \"7418\":\n/***/ (function(module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n\n/***/ \"746f\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar path = __webpack_require__(\"428f\");\nvar has = __webpack_require__(\"5135\");\nvar wrappedWellKnownSymbolModule = __webpack_require__(\"e538\");\nvar defineProperty = __webpack_require__(\"9bf2\").f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n\n\n/***/ }),\n\n/***/ \"7839\":\n/***/ (function(module, exports) {\n\n// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n\n\n/***/ }),\n\n/***/ \"7b0b\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar requireObjectCoercible = __webpack_require__(\"1d80\");\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n\n\n/***/ }),\n\n/***/ \"7c73\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(\"825a\");\nvar defineProperties = __webpack_require__(\"37e8\");\nvar enumBugKeys = __webpack_require__(\"7839\");\nvar hiddenKeys = __webpack_require__(\"d012\");\nvar html = __webpack_require__(\"1be4\");\nvar documentCreateElement = __webpack_require__(\"cc12\");\nvar sharedKey = __webpack_require__(\"f772\");\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n\n\n/***/ }),\n\n/***/ \"7dd0\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $ = __webpack_require__(\"23e7\");\nvar createIteratorConstructor = __webpack_require__(\"9ed3\");\nvar getPrototypeOf = __webpack_require__(\"e163\");\nvar setPrototypeOf = __webpack_require__(\"d2bb\");\nvar setToStringTag = __webpack_require__(\"d44e\");\nvar createNonEnumerableProperty = __webpack_require__(\"9112\");\nvar redefine = __webpack_require__(\"6eeb\");\nvar wellKnownSymbol = __webpack_require__(\"b622\");\nvar IS_PURE = __webpack_require__(\"c430\");\nvar Iterators = __webpack_require__(\"3f8c\");\nvar IteratorsCore = __webpack_require__(\"ae93\");\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n\n\n/***/ }),\n\n/***/ \"7f9a\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"da84\");\nvar inspectSource = __webpack_require__(\"8925\");\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n\n\n/***/ }),\n\n/***/ \"825a\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"861d\");\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ \"83ab\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar fails = __webpack_require__(\"d039\");\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n\n\n/***/ }),\n\n/***/ \"8418\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar toPrimitive = __webpack_require__(\"c04e\");\nvar definePropertyModule = __webpack_require__(\"9bf2\");\nvar createPropertyDescriptor = __webpack_require__(\"5c6c\");\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n\n\n/***/ }),\n\n/***/ \"861d\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n\n/***/ \"8875\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// addapted from the document.currentScript polyfill by Adam Miller\n// MIT license\n// source: https://github.com/amiller-gh/currentScript-polyfill\n\n// added support for Firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1620505\n\n(function (root, factory) {\n if (true) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n}(typeof self !== 'undefined' ? self : this, function () {\n function getCurrentScript () {\n var descriptor = Object.getOwnPropertyDescriptor(document, 'currentScript')\n // for chrome\n if (!descriptor && 'currentScript' in document && document.currentScript) {\n return document.currentScript\n }\n\n // for other browsers with native support for currentScript\n if (descriptor && descriptor.get !== getCurrentScript && document.currentScript) {\n return document.currentScript\n }\n \n // IE 8-10 support script readyState\n // IE 11+ & Firefox support stack trace\n try {\n throw new Error();\n }\n catch (err) {\n // Find the second match for the \"at\" string to get file src url from stack.\n var ieStackRegExp = /.*at [^(]*\\((.*):(.+):(.+)\\)$/ig,\n ffStackRegExp = /@([^@]*):(\\d+):(\\d+)\\s*$/ig,\n stackDetails = ieStackRegExp.exec(err.stack) || ffStackRegExp.exec(err.stack),\n scriptLocation = (stackDetails && stackDetails[1]) || false,\n line = (stackDetails && stackDetails[2]) || false,\n currentLocation = document.location.href.replace(document.location.hash, ''),\n pageSource,\n inlineScriptSourceRegExp,\n inlineScriptSource,\n scripts = document.getElementsByTagName('script'); // Live NodeList collection\n \n if (scriptLocation === currentLocation) {\n pageSource = document.documentElement.outerHTML;\n inlineScriptSourceRegExp = new RegExp('(?:[^\\\\n]+?\\\\n){0,' + (line - 2) + '}[^<]*\n","\n\n\n","\n\n\n","\n\n\n\n","\n\n","'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length|0]\n }\n\n return str;\n}\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object} params - The parameters to be converted to a FormData object.\n * @param {Object} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n if (utils.isFunction(options)) {\n options = {\n serialize: options\n };\n } \n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n _navigator as navigator,\n origin\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isHeaders(header)) {\n for (const [key, value] of header.entries()) {\n setHeader(value, key, rewrite);\n }\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn.apply(null, args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n","import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n","import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n\n return (\n origin.protocol === url.protocol &&\n origin.host === url.host &&\n (isMSIE || origin.port === url.port)\n );\n})(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, prop, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, prop , caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, prop , caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, prop , caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)\n };\n\n utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n let contentType;\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // Let the browser set it\n } else if ((contentType = headers.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n headers.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n }\n }\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n","import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils.asap(unsubscribe);\n\n return signal;\n }\n}\n\nexport default composeSignals;\n","\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n}\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst isFetchSupported = typeof fetch === 'function' && typeof Request === 'function' && typeof Response === 'function';\nconst isReadableStreamSupported = isFetchSupported && typeof ReadableStream === 'function';\n\n// used only inside the fetch adapter\nconst encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Response(str).arrayBuffer())\n);\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst supportsRequestStream = isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n});\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst supportsResponseStream = isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n\nconst resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n};\n\nisFetchSupported && (((res) => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = utils.isFunction(res[type]) ? (res) => res[type]() :\n (_, config) => {\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n})(new Response));\n\nconst getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if(utils.isBlob(body)) {\n return body.size;\n }\n\n if(utils.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if(utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if(utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if(utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n}\n\nconst resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n}\n\nexport default isFetchSupported && (async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = \"credentials\" in Request.prototype;\n request = new Request(url, {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n });\n\n let response = await fetch(request);\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n});\n\n\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: fetchAdapter\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","export const VERSION = \"1.7.9\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n // eslint-disable-next-line no-console\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: validators.spelling('withXSRFToken')\n }, true);\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","/**\n * Simple rounding function, how can this not be standard rounding in js!?\n * @param num \n * @param decimals \n * @returns \n */\nexport function roundNumber(num: number, decimals: number) {\n const rounded = num.toFixed(decimals); // Round to 1 decimal place\n if (rounded.endsWith('.0')) { // Check if it ends with .0\n return rounded.slice(0, -2); // Remove the .0\n } else if (rounded.endsWith('0')) {\n return rounded.slice(0, -1); // Remove the trailing 0\n }\n return rounded;\n}\n\nexport function delay(ms: number): Promise {\n return new Promise(resolve => setTimeout(resolve, ms))\n}","import axios from 'axios'\nimport type { AxiosInstance } from 'axios'\n\nimport { delay } from '@/utils/math'\n\nimport { useSettingsStore } from '@/stores/settings'\n\nimport { EPDSource } from '@/models/settings'\nimport type { RevaluData } from '@/models/revaluDataSource'\nimport { type Product, type Emission, type LifeCycleStageEmission, type Assembly, Source} from '@/models/material'\n\n//import { convertIlcd } from 'epdx'\n\nconst MAX_EPD_COUNT = 15\n// Ilcd reference to GWP total\nconst GWP_REF_OBJECT_ID = '6a37f984-a4b3-458a-a20a-64418c145fa2'\n\ninterface EPDService {\n createApiClient(): AxiosInstance\n createListUrl(): string\n createEPDUrl(epd: any): string\n createListParams(): any\n createEPDParams(): any\n updatePageIndex(params: any): any\n extractEPDData(data: any): Product | null\n extractEPDList(data: any): any[]\n}\n\n/**\n * Class for fetching data from EcoPortal\n * TODO: This implementation is not done yet, EPD Information is flaky at best\n */\nclass EcoPortalService implements EPDService {\n createApiClient() {\n const settingsStore = useSettingsStore()\n return axios.create({\n headers: {\n Authorization: `Bearer ${settingsStore.keySettings.materialKeys.ecoPortal}`,\n },\n })\n }\n \n createListUrl() {\n return '/api/eco/resource/processes'\n }\n\n createEPDUrl(epd: any) {\n return `/${epd.nodeid}${epd.uuid}`\n }\n\n createListParams() {\n return {\n search: 'true',\n distributed: 'true',\n virtual: 'true',\n metaDataOnly: 'false',\n startIndex: '0',\n pageSize: MAX_EPD_COUNT,\n format: 'json',\n }\n }\n\n createEPDParams() {\n return {\n format: 'json',\n view: 'extended',\n }\n }\n\n updatePageIndex(params: any) {\n const startIndex = parseInt(params.startIndex) + parseInt(params.pageSize)\n return { ...params, startIndex: startIndex.toString() }\n }\n\n extractEPDData(data: any) {\n return extractILCDData(data)\n }\n\n extractEPDList(data: any): any[] {\n return data.data;\n }\n}\n\n/**\n * Class for fetching data from Revalu\n */\nclass RevaluService implements EPDService {\n createApiClient() {\n const settingsStore = useSettingsStore()\n return axios.create({\n headers: {\n 'x-api-key': settingsStore.keySettings.materialKeys.revalu,\n },\n })\n }\n \n // Create list URL, we check if dev or not and switch the URL\n createListUrl() {\n const apiListUrl = import.meta.env.MODE === 'development' \n ? '/SpeckleLCA/api/revalu/epds/search' \n : 'https://api.revalu.io/epds/search'\n return apiListUrl\n }\n\n // Create EPD URL, we check if dev or not and switch the URL\n createEPDUrl(epd: any) {\n const apiEPDUrl = import.meta.env.MODE === 'development' \n ? `/SpeckleLCA/api/revalu/epds/${epd.id}` \n : `https://api.revalu.io/epds/${epd.id}`\n return apiEPDUrl\n }\n\n createListParams() {\n return {\n search_term: '',\n page_no: 0,\n page_size: MAX_EPD_COUNT,\n }\n }\n\n createEPDParams() {\n return {}\n }\n\n updatePageIndex(params: any) {\n return { ...params, page_no: params.page_no + 1 }\n }\n\n extractEPDData(data: any) {\n return extractRevaluData(data)\n }\n\n extractEPDList(data: any): any[] {\n return data.body.search_results\n }\n}\n\n/**\n * Extract ILCD data from the response\n * TODO: Implement lcaX conversion already made\n * @param data \n * @returns \n */\nconst extractILCDData = (data: any) => {\n // Extract metaData\n const metaData: Record = {}\n const classifications =\n data?.processInformation?.dataSetInformation?.classificationInformation\n ?.classification || []\n\n classifications.forEach((classification: any) => {\n classification.class.forEach((cls: any) => {\n metaData[cls.classId] = cls.value\n })\n })\n\n // Extract GWP emissions\n const lciaResults = data?.LCIAResults?.LCIAResult || []\n const gwpResult = lciaResults.find(\n (result: any) =>\n result.referenceToLCIAMethodDataSet.refObjectId === GWP_REF_OBJECT_ID\n )\n\n const emission = {} as Emission\n let totalA1A3 = 0\n\n if (gwpResult?.other?.anies) {\n gwpResult.other.anies.forEach((entry: any) => {\n const module = entry.module?.toLowerCase().replace(/-/g, '') as string\n const amount = parseFloat(entry.value)\n\n if (['a1', 'a2', 'a3'].includes(module)) {\n totalA1A3 += amount\n } else {\n emission.gwp = emission.gwp || {} as LifeCycleStageEmission\n emission.gwp[module] = { amount }\n }\n })\n\n if (totalA1A3 > 0) {\n emission.gwp = emission.gwp || {} as LifeCycleStageEmission\n emission.gwp['a1a3'] = totalA1A3 \n }\n }\n\n // Extract unit and quantity\n const exchange = data?.exchanges?.exchange?.[0]\n const flowProperties = exchange?.flowProperties || []\n const referenceProperty = flowProperties.find(\n (prop: any) => prop.referenceUnit\n )\n const unit = referenceProperty?.referenceUnit || ''\n const quantity = parseFloat(referenceProperty?.meanValue || '0')\n\n // Build the product object\n const product: Product = {\n id: data.processInformation.dataSetInformation.UUID,\n name:\n data.processInformation.dataSetInformation.name.baseName[0]?.value ||\n '',\n description:\n data.processInformation.technology\n .technologyDescriptionAndIncludedProcesses[0]?.value || '',\n referenceServiceLife: 50,\n impactData: null,\n quantity,\n unit,\n transport: null,\n results: null,\n metaData,\n emission,\n source: Source.ECOPortal,\n }\n return product\n}\n\n/**\n * Extracts data from Revalu and their different data structure\n * @param data \n * @returns \n */\nconst extractRevaluData = (response: { body: RevaluData }) => {\n const data = response.body\n const emission: Emission = {\n gwp: data.gwp,\n gwp_fossil: data.gwp_fossil,\n //gwp_biogenic: data.gwp_biogenic,\n //gwp_luluc: data.gwp_luluc,\n fw: data.fw,\n pert: data.pert,\n penrt: data.penrt,\n //energy_mix_percentage: data.energy_mix_percentage,\n }\n const product: Product = {\n id: data.id,\n name: data.name,\n description: data.manufacturer,\n referenceServiceLife: 50,\n impactData: null,\n quantity: 1,\n unit: data.declared_unit,\n transport: null,\n results: null,\n metaData: {},\n emission,\n source: Source.Revalu,\n }\n return product\n}\n\n/**\n * Checks projectstore and gets the relevant EPD service\n * @returns \n */\nfunction getEPDService(): EPDService {\n const settingsStore = useSettingsStore()\n\n switch (settingsStore.materialSettings.epdSource) {\n case EPDSource.EcoPortal:\n return new EcoPortalService()\n case EPDSource.Revalu:\n return new RevaluService()\n default:\n throw new Error('Unsupported EPD source')\n }\n}\n\n/**\n * Get all EPDs from the ECO Portal\n * Acording to parameters, check API documentation for more information\n * @param parameters Key value pairs for the API call\n * @returns List of products with emission data\n */\nexport async function getEPDList(parameters: { [key: string]: string | string[] } = {}): Promise {\n const epdService = getEPDService()\n const EPDList: Product[] = []\n const apiClient = epdService.createApiClient()\n const baseUrl = epdService.createListUrl()\n let params = epdService.createListParams()\n\n params = { ...params, ...parameters }\n\n await delay(1000)\n\n while (EPDList.length < MAX_EPD_COUNT) {\n try {\n const response = await apiClient.get(baseUrl, { params })\n const data = response.data\n\n const epdListData = epdService.extractEPDList(data)\n\n if (!epdListData || epdListData.length === 0) {\n console.log('No more data to fetch')\n break\n }\n\n for (const epd of epdListData) {\n const product = await getSpecificEPD(epd)\n if (product) {\n EPDList.push(product)\n }\n }\n\n params = epdService.updatePageIndex(params)\n } catch (error) {\n console.error('Error fetching EPD list:', error)\n break\n }\n }\n\n return EPDList\n}\n\n/**\n * Fetches a specific EPD\n * @param epd The EPD data containing uuid and nodeid for ecoportal.\n * @returns A Product with EPD data or null if an error occurs.\n */\nexport async function getSpecificEPD(epd: any): Promise {\n const epdService = getEPDService()\n const apiClient = epdService.createApiClient()\n const url = epdService.createEPDUrl(epd)\n const params = epdService.createEPDParams()\n\n try {\n const response = await apiClient.get(url, { params })\n const data = response.data\n\n return epdService.extractEPDData(data)\n } catch (error) {\n console.error(`Error fetching EPD ${epd.uuid}:`, error)\n return null\n }\n}\n\nexport function isAssembly(val: any): val is Assembly {\n return val && typeof val === 'object' && 'products' in val && 'id' in val;\n}","import { useProjectStore } from '@/stores/main'\nimport { useSettingsStore } from '@/stores/settings'\nimport { isAssembly } from '@/utils/EPDUtils'\n\nimport type { GeometryObject } from '@/models/geometryObject'\nimport type { LifeCycleStageEmission, Product, Emission } from '@/models/material'\nimport type { Results } from '@/models/result'\n\n/**\n * EmissionCalculator class to calculate the emissions of geometry objects if none sent calculate for all\n */\nexport class EmissionCalculator {\n private geo: GeometryObject[] = []\n private settingsStore = useSettingsStore()\n\n constructor(geo: GeometryObject[] = []) {\n const projectStore = useProjectStore()\n this.geo = geo\n if (projectStore.currProject) {\n // If no geometry is provided, calculate for all geometry objects in the project.\n if (geo.length === 0) {\n this.geo = projectStore.currProject.geometry\n }\n \n if (projectStore.currProject.results == null)\n projectStore.currProject.results = []\n }\n }\n\n /**\n * Calculate the emissions of the current geo and attach the results to the geo\n * @param geo\n * @returns\n */\n calculateEmissions(): Results | boolean {\n // Go through each geometry object and calculate the emissions\n for (const geo of this.geo) {\n let result: Results | boolean = false\n if (!geo.material) continue\n\n const emissions: Emission = { \n [this.settingsStore.calculationSettings.standardImpactCategory]: {} as LifeCycleStageEmission }\n const material = geo.material\n\n if (isAssembly(material)) {\n const products = material.products\n result = this.processAssembly(products, emissions, geo)\n } else {\n result = this.processEPD(material as Product, emissions, geo)\n }\n\n if (result) {\n result = this.addEmissionsToGeo(emissions, geo)\n }\n }\n return true\n }\n\n private processAssembly(\n material: { materials?: Product[] },\n emissions: Emission,\n geo: GeometryObject\n ): boolean {\n if (!material.materials) return false\n\n for (const mat of material.materials) {\n if (mat.emission) {\n this.calculateMaterialEmissions(mat, emissions, geo)\n }\n }\n return true\n }\n\n private processEPD(\n material: Product,\n emissions: Emission,\n geo: GeometryObject\n ): boolean {\n if (material.emission) {\n if (this.calculateMaterialEmissions(material, emissions, geo))\n return true\n else \n return false\n }\n return false\n }\n\n // Calculate the emissions of the material and add it to the emissions object\n // TODO this should calculate for all impact categories and then just show the relevant one, its other way around now.\n private calculateMaterialEmissions(\n mat: Product,\n emissions: Emission,\n geo: GeometryObject\n ): boolean {\n const impactCategory = this.settingsStore.calculationSettings.standardImpactCategory\n let matEmission: LifeCycleStageEmission = mat.emission[impactCategory]\n\n // Check if we have the emission for the selected impact category, if not use gwp as fallback\n if (!mat.emission[impactCategory]) {\n if (!mat.emission['gwp'])\n return false\n matEmission = mat.emission['gwp']\n }\n\n // Check if we have the emission else add it as empty object\n if (!emissions[impactCategory]) {\n emissions[impactCategory] = {} as LifeCycleStageEmission\n }\n\n for (const phase in matEmission) {\n // Check if the phase is included in the calculation settings, if not skip it\n if (this.settingsStore.calculationSettings.includedStages.relevantStages.some(\n (stage) => phase === stage.stage && stage.included)\n ){\n let value = matEmission[phase]\n if (value === undefined) value = matEmission[phase]\n if (value !== null && !isNaN(Number(value))) {\n const emissionValue = parseFloat(value as string) * geo.quantity[mat.unit]\n \n if (!emissions[impactCategory][phase]) {\n emissions[impactCategory][phase] = 0\n }\n \n const currentAmount = emissions[impactCategory][phase] || 0\n emissions[impactCategory][phase] = currentAmount + emissionValue\n }\n }\n }\n return true\n }\n\n /**\n * Attached emissions to Geo object\n * @param geo \n * @param emissions \n */\n private addEmissionsToGeo(\n emissions: Emission,\n geo: GeometryObject\n ) {\n const result: Results = {\n id: crypto.randomUUID(),\n date: new Date(),\n emission: emissions,\n }\n if (geo.results) {\n geo.results.push(result)\n } else {\n geo.results = [result]\n }\n return result\n }\n}","\n\n\n","\n\n\n","\n\n","import type { Group } from '@/models/filters'\nimport type { GeometryObject } from '@/models/geometryObject'\n\nimport { useProjectStore } from '@/stores/main'\nimport { useSpeckleStore } from '@/stores/speckle'\nimport { getTextAfterLastDot } from '@/utils/stringUtils'\n/**\n * Generic function to add filters to a registry\n * @param name name of filter\n * @param filterFn function of filter always returns an array of groups\n * @param registry registry to add filters to\n */\nfunction addFilter(\n name: string,\n filterFn: (inGroup: Group[], field: string, value?: any, remove?: boolean) => Group[]\n) {\n const projectStore = useProjectStore()\n const registry = projectStore.filterRegistry\n registry.addFilter(name, filterFn)\n}\n\n/**\n * generic function to create a filter that uses boolean comparisons on a field with specified value\n * @param comparisonFn function for comparison\n * @param name name of filter\n */\nfunction createComparisonFilter (\n name: string,\n comparisonFn: (a: any, b: any) => boolean,\n) {\n const speckleStore = useSpeckleStore()\n addFilter(\n name,\n (inGroup, field, filterValue, remove) => {\n const outGroup: { [key: string]: Group } = {}\n // Go through each group and find the objects that match the comparison function\n for (const grp of inGroup) {\n // Go through each obj in group\n for (const obj of grp.elements) {\n // Check if parameter exists, if not hide object\n if (!obj.parameters && remove) \n speckleStore.addHiddenObject(obj) \n // Search specified object for value\n const objValue = obj.parameters[field]\n if (objValue !== undefined) {\n if (comparisonFn(objValue, filterValue))\n addObjToGroup(outGroup, obj, true, grp, filterValue)\n else if (remove)\n speckleStore.addHiddenObject(obj)\n else if (!remove)\n addObjToGroup(outGroup, obj, false, grp, filterValue)\n } else if (remove){\n speckleStore.addHiddenObject(obj)\n }\n }\n }\n return Object.values(outGroup)\n }\n )\n}\n\n/**\n * Exmaple of how filters are structured\n * Creates standardfilters\n * @param registry \n */\nexport function createStandardFilters() {\n // Define filters\n createComparisonFilter('equalsFilter', (a, b) => a === b)\n createComparisonFilter('notEqualsFilter', (a, b) => a !== b)\n createComparisonFilter('greaterThan', (a, b) => !isNaN(Number(a)) && Number(a) > Number(b))\n\n /**\n * Groupby filter using only field\n */\n addFilter('groupBy', (inGroup, field) => {\n const outGroup: { [field: string]: Group } = {}\n for (const grp of inGroup) {\n for (const obj of grp.elements) {\n if (!obj.parameters) throw new Error(`No parameters found for '${obj.id}'.`)\n const fieldValue = obj.parameters[field] || \"No Data\"\n const pathName = getTextAfterLastDot(fieldValue)\n addObjToGroup(outGroup, obj, true, grp, pathName)\n }\n }\n return Object.values(outGroup)\n })\n}\n\n/**\n * Generic function to push objects into the right group object\n * @param outGroup Groups to add objects to\n * @param obj Obj to add\n * @param condition remove or not\n * @param inGroup Existing group\n * @param fieldValue name of field filtering\n */\nfunction addObjToGroup(\n outGroup: { [key: string]: Group },\n obj: GeometryObject,\n condition: boolean,\n inGroup: Group,\n fieldValue: string\n) {\n const pathName = condition ? fieldValue : `!${fieldValue}`\n const uniqueField = pathName + inGroup.path.join('')\n const paths: string[] = [...inGroup.path, pathName]\n\n if (uniqueField in outGroup) {\n outGroup[uniqueField].elements.push(obj)\n } else {\n outGroup[uniqueField] = {\n id: uniqueField,\n name: pathName,\n path: paths,\n elements: [obj],\n }\n }\n}\n","import type { GeometryObject } from './geometryObject'\n\n/**\n * Filters done in correct sequencing with arguments to be used for each step\n */\nexport interface FilterList {\n\tname: string\n\tid: string\n\tcallStack: Filter[]\n}\n\n/**\n * Interface for filterList\n * name: The name of the filter that is added to the registry\n * field: GeoObject property which to run filter on\n * value: Optional value to use for comparrison in the filter\n * remove: Optional boolean if you want to remove all false results\n */\nexport interface Filter {\n\tname: string\n\tfield: string\n\tvalue?: string\n\tremove?: boolean\n}\n\n/**\n * Grouped geometryObjects with path and color information\n */\nexport interface Group {\n\tid: string\n\tname: string\n\t// Path describes how group is shown in the tree view.\n\t// Always put in the root first and then final name last\n\t// eg. [\"Wall\", \"Inner Wall\", \"Type 1\"]\n\tpath: string[]\n\telements: GeometryObject[]\n\tcolor?: string\n}\n\n/**\n * Filter registry to store all filter functions\n */\nexport class FilterRegistry {\n\tpublic filters: {\n\t\t[filterName: string]: Function\n\t} = {}\n\n\tpublic filterCallStack: FilterList = {\n\t\tname: '',\n\t\tid: '',\n\t\tcallStack: []\n\t}\n\n\t/**\n\t * Add functions to registry by providing a name and the function with 3 set parameters\n\t * @param name\n\t * @param filter\n\t * required inputs on filter (inGroup: Group[], field: string, value: string)\n\t * required output Group[]\n\t */\n\taddFilter(\n\t\tname: string,\n\t\tfilter: (\n\t\t\tinGroup: Group[],\n\t\t\tfield: string,\n\t\t\tvalue?: string,\n\t\t\tremove?: boolean\n\t\t) => Group[]\n\t) {\n\t\tthis.filters[name] = filter\n\t}\n\n\t/**\n\t * Call Filter defined in registry and return grouping\n\t * @param name name of filter\n\t * @param inGroup group to filter, has to have a root level atleast\n\t * @param field field to filter upon\n\t * @param value value to use for filtering true or false\n\t * @param remove remove all false results\n\t * @returns Group[] from filter\n\t */\n\tcallFilter(\n\t\tname: string,\n\t\tinGroup: Group[],\n\t\tfield: string,\n\t\tvalue?: string,\n\t\tremove?: boolean\n\t) {\n\t\tconst filter = this.filters[name]\n\t\tif (typeof filter === 'function') {\n\t\t\treturn filter(inGroup, field, value, remove)\n\t\t} else {\n\t\t\tthrow new Error(`Function '${name}' not found.`)\n\t\t}\n\t}\n\n\t/**\n\t * Get all filternames available for the registry, currently using real function name\n\t * Should maybe be changed to a more proper name later\n\t * @returns list of filter names available for registry\n\t */\n\tgetFilterNames(): string[] {\n\t\treturn Object.keys(this.filters)\n\t}\n}\n\n/**\n * Interface for tree created for grouped up object list\n */\nexport interface NestedGroup {\n\tname: string\n\tobjects: GeometryObject[]\n\tid: string\n\tchildren: NestedGroup[]\n\tcolor?: string\n}\n","\n\n\n","\n\n\n\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"m21 7.5-2.25-1.313M21 7.5v2.25m0-2.25-2.25 1.313M3 7.5l2.25-1.313M3 7.5l2.25 1.313M3 7.5v2.25m9 3 2.25-1.313M12 12.75l-2.25-1.313M12 12.75V15m0 6.75 2.25-1.313M12 21.75V19.5m0 2.25-2.25-1.313m0-16.875L12 2.25l2.25 1.313M21 14.25v2.25l-2.25 1.313m-13.5 0L3 16.5v-2.25\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M3.98 8.223A10.477 10.477 0 0 0 1.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.451 10.451 0 0 1 12 4.5c4.756 0 8.773 3.162 10.065 7.498a10.522 10.522 0 0 1-4.293 5.774M6.228 6.228 3 3m3.228 3.228 3.65 3.65m7.894 7.894L21 21m-3.228-3.228-3.65-3.65m0 0a3 3 0 1 0-4.243-4.243m4.242 4.242L9.88 9.88\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"m2.25 12 8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M16.5 10.5V6.75a4.5 4.5 0 1 0-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 0 0 2.25-2.25v-6.75a2.25 2.25 0 0 0-2.25-2.25H6.75a2.25 2.25 0 0 0-2.25 2.25v6.75a2.25 2.25 0 0 0 2.25 2.25Z\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"m15.75 10.5 4.72-4.72a.75.75 0 0 1 1.28.53v11.38a.75.75 0 0 1-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25h-9A2.25 2.25 0 0 0 2.25 7.5v9a2.25 2.25 0 0 0 2.25 2.25Z\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M7.5 3.75H6A2.25 2.25 0 0 0 3.75 6v1.5M16.5 3.75H18A2.25 2.25 0 0 1 20.25 6v1.5m0 9V18A2.25 2.25 0 0 1 18 20.25h-1.5m-9 0H6A2.25 2.25 0 0 1 3.75 18v-1.5M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M6 18 18 6M6 6l12 12\"\n })\n ]))\n}","\n\n\n","\n\n\n","\n \n \n ","\n\n","\n\n\n","\n\n","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/*!\n * Chart.js v4.4.7\n * https://www.chartjs.org\n * (c) 2024 Chart.js Contributors\n * Released under the MIT License\n */\nimport { Color } from '@kurkle/color';\n\n/**\n * @namespace Chart.helpers\n */ /**\n * An empty function that can be used, for example, for optional callback.\n */ function noop() {\n/* noop */ }\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */ const uid = (()=>{\n let id = 0;\n return ()=>id++;\n})();\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isNullOrUndef(value) {\n return value === null || value === undefined;\n}\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */ function isArray(value) {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isObject(value) {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */ function isNumberFinite(value) {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */ function finiteOrDefault(value, defaultValue) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */ function valueOrDefault(value, defaultValue) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 : +value / dimension;\nconst toDimension = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 * dimension : +value;\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */ function callback(fn, args, thisArg) {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n let i, len, keys;\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for(i = len - 1; i >= 0; i--){\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for(i = 0; i < len; i++){\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for(i = 0; i < len; i++){\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */ function _elementsEqual(a0, a1) {\n let i, ilen, v0, v1;\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n for(i = 0, ilen = a0.length; i < ilen; ++i){\n v0 = a0[i];\n v1 = a1[i];\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n return true;\n}\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */ function clone(source) {\n if (isArray(source)) {\n return source.map(clone);\n }\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n for(; k < klen; ++k){\n target[keys[k]] = clone(source[keys[k]]);\n }\n return target;\n }\n return source;\n}\nfunction isValidKey(key) {\n return [\n '__proto__',\n 'prototype',\n 'constructor'\n ].indexOf(key) === -1;\n}\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */ function _merger(key, target, source, options) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\nfunction merge(target, source, options) {\n const sources = isArray(source) ? source : [\n source\n ];\n const ilen = sources.length;\n if (!isObject(target)) {\n return target;\n }\n options = options || {};\n const merger = options.merger || _merger;\n let current;\n for(let i = 0; i < ilen; ++i){\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n const keys = Object.keys(current);\n for(let k = 0, klen = keys.length; k < klen; ++k){\n merger(keys[k], target, current, options);\n }\n }\n return target;\n}\nfunction mergeIf(target, source) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {\n merger: _mergerIf\n });\n}\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */ function _mergerIf(key, target, source) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n/**\n * @private\n */ function _deprecated(scope, value, previous, current) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous + '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': (v)=>v,\n // default resolvers\n x: (o)=>o.x,\n y: (o)=>o.y\n};\n/**\n * @private\n */ function _splitKey(key) {\n const parts = key.split('.');\n const keys = [];\n let tmp = '';\n for (const part of parts){\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\nfunction _getKeyResolver(key) {\n const keys = _splitKey(key);\n return (obj)=>{\n for (const k of keys){\n if (k === '') {\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\nfunction resolveObjectKey(obj, key) {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n/**\n * @private\n */ function _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value)=>typeof value !== 'undefined';\nconst isFunction = (value)=>typeof value === 'function';\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nconst setsEqual = (a, b)=>{\n if (a.size !== b.size) {\n return false;\n }\n for (const item of a){\n if (!b.has(item)) {\n return false;\n }\n }\n return true;\n};\n/**\n * @param e - The event\n * @private\n */ function _isClickEvent(e) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */ const PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction almostEquals(x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n}\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */ function niceNum(range) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */ function _factorize(value) {\n const result = [];\n const sqrt = Math.sqrt(value);\n let i;\n for(i = 1; i < sqrt; i++){\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) {\n result.push(sqrt);\n }\n result.sort((a, b)=>a - b).pop();\n return result;\n}\nfunction isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostWhole(x, epsilon) {\n const rounded = Math.round(x);\n return rounded - epsilon <= x && rounded + epsilon >= x;\n}\n/**\n * @private\n */ function _setMinAndMaxByKey(array, target, property) {\n let i, ilen, value;\n for(i = 0, ilen = array.length; i < ilen; i++){\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\nfunction toRadians(degrees) {\n return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n return radians * (180 / PI);\n}\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */ function _decimalPlaces(x) {\n if (!isNumberFinite(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while(Math.round(x * e) / e !== x){\n e *= 10;\n p++;\n }\n return p;\n}\n// Gets the angle from vertical upright to the point about a centre.\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n if (angle < -0.5 * PI) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */ function _angleDiff(a, b) {\n return (a - b + PITAU) % TAU - PI;\n}\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */ function _normalizeAngle(a) {\n return (a % TAU + TAU) % TAU;\n}\n/**\n * @private\n */ function _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || sameAngleIsFullCircle && s === e || angleToStart > angleToEnd && startToAngle < endToAngle;\n}\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */ function _limitValue(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n/**\n * @param {number} value\n * @private\n */ function _int16Range(value) {\n return _limitValue(value, -32768, 32767);\n}\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */ function _isBetween(value, start, end, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n\nfunction _lookup(table, value, cmp) {\n cmp = cmp || ((index)=>table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid;\n while(hi - lo > 1){\n mid = lo + hi >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return {\n lo,\n hi\n };\n}\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */ const _lookupByKey = (table, key, value, last)=>_lookup(table, value, last ? (index)=>{\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n } : (index)=>table[index][key] < value);\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */ const _rlookupByKey = (table, key, value)=>_lookup(table, value, (index)=>table[index][key] >= value);\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */ function _filterBetween(values, min, max) {\n let start = 0;\n let end = values.length;\n while(start < end && values[start] < min){\n start++;\n }\n while(end > start && values[end - 1] > max){\n end--;\n }\n return start > 0 || end < values.length ? values.slice(start, end) : values;\n}\nconst arrayEvents = [\n 'push',\n 'pop',\n 'shift',\n 'splice',\n 'unshift'\n];\nfunction listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [\n listener\n ]\n }\n });\n arrayEvents.forEach((key)=>{\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value (...args) {\n const res = base.apply(this, args);\n array._chartjs.listeners.forEach((object)=>{\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n return res;\n }\n });\n });\n}\nfunction unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n if (listeners.length > 0) {\n return;\n }\n arrayEvents.forEach((key)=>{\n delete array[key];\n });\n delete array._chartjs;\n}\n/**\n * @param items\n */ function _arrayUnique(items) {\n const set = new Set(items);\n if (set.size === items.length) {\n return items;\n }\n return Array.from(set);\n}\n\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n/**\n* Request animation polyfill\n*/ const requestAnimFrame = function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}();\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */ function throttled(fn, thisArg) {\n let argsToUse = [];\n let ticking = false;\n return function(...args) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, ()=>{\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n/**\n * Debounces calling `fn` for `delay` ms\n */ function debounce(fn, delay) {\n let timeout;\n return function(...args) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */ const _toLeftRightCenter = (align)=>align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */ const _alignStartEnd = (align, start, end)=>align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */ const _textX = (align, left, right, rtl)=>{\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n/**\n * Return start and count of visible points.\n * @private\n */ function _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n const pointCount = points.length;\n let start = 0;\n let count = pointCount;\n if (meta._sorted) {\n const { iScale , _parsed } = meta;\n const axis = iScale.axis;\n const { min , max , minDefined , maxDefined } = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(Math.min(// @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo, // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo), 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(Math.max(// @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1, // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1), start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n return {\n start,\n count\n };\n}\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */ function _scaleRangesChanged(meta) {\n const { xScale , yScale , _scaleRanges } = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min || _scaleRanges.xmax !== xScale.max || _scaleRanges.ymin !== yScale.min || _scaleRanges.ymax !== yScale.max;\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n\nconst atEdge = (t)=>t === 0 || t === 1;\nconst elasticIn = (t, s, p)=>-(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p)=>Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */ const effects = {\n linear: (t)=>t,\n easeInQuad: (t)=>t * t,\n easeOutQuad: (t)=>-t * (t - 2),\n easeInOutQuad: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1),\n easeInCubic: (t)=>t * t * t,\n easeOutCubic: (t)=>(t -= 1) * t * t + 1,\n easeInOutCubic: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2),\n easeInQuart: (t)=>t * t * t * t,\n easeOutQuart: (t)=>-((t -= 1) * t * t * t - 1),\n easeInOutQuart: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t : -0.5 * ((t -= 2) * t * t * t - 2),\n easeInQuint: (t)=>t * t * t * t * t,\n easeOutQuint: (t)=>(t -= 1) * t * t * t * t + 1,\n easeInOutQuint: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t * t : 0.5 * ((t -= 2) * t * t * t * t + 2),\n easeInSine: (t)=>-Math.cos(t * HALF_PI) + 1,\n easeOutSine: (t)=>Math.sin(t * HALF_PI),\n easeInOutSine: (t)=>-0.5 * (Math.cos(PI * t) - 1),\n easeInExpo: (t)=>t === 0 ? 0 : Math.pow(2, 10 * (t - 1)),\n easeOutExpo: (t)=>t === 1 ? 1 : -Math.pow(2, -10 * t) + 1,\n easeInOutExpo: (t)=>atEdge(t) ? t : t < 0.5 ? 0.5 * Math.pow(2, 10 * (t * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n easeInCirc: (t)=>t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1),\n easeOutCirc: (t)=>Math.sqrt(1 - (t -= 1) * t),\n easeInOutCirc: (t)=>(t /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n easeInElastic: (t)=>atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n easeOutElastic: (t)=>atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n easeInOutElastic (t) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t : t < 0.5 ? 0.5 * elasticIn(t * 2, s, p) : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n easeInBack (t) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n easeOutBack (t) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n easeInOutBack (t) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);\n },\n easeInBounce: (t)=>1 - effects.easeOutBounce(1 - t),\n easeOutBounce (t) {\n const m = 7.5625;\n const d = 2.75;\n if (t < 1 / d) {\n return m * t * t;\n }\n if (t < 2 / d) {\n return m * (t -= 1.5 / d) * t + 0.75;\n }\n if (t < 2.5 / d) {\n return m * (t -= 2.25 / d) * t + 0.9375;\n }\n return m * (t -= 2.625 / d) * t + 0.984375;\n },\n easeInOutBounce: (t)=>t < 0.5 ? effects.easeInBounce(t * 2) * 0.5 : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5\n};\n\nfunction isPatternOrGradient(value) {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n return false;\n}\nfunction color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\nfunction getHoverColor(value) {\n return isPatternOrGradient(value) ? value : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n\nconst numbers = [\n 'x',\n 'y',\n 'borderWidth',\n 'radius',\n 'tension'\n];\nconst colors = [\n 'color',\n 'borderColor',\n 'backgroundColor'\n];\nfunction applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined\n });\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name)=>name !== 'onProgress' && name !== 'onComplete' && name !== 'fn'\n });\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n }\n });\n defaults.describe('animations', {\n _fallback: 'animation'\n });\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0\n }\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: (v)=>v | 0\n }\n }\n }\n });\n}\n\nfunction applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\nfunction formatNumber(num, locale, options) {\n return getNumberFormat(locale, options).format(num);\n}\n\nconst formatters = {\n values (value) {\n return isArray(value) ? value : '' + value;\n },\n numeric (tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue;\n if (ticks.length > 1) {\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n delta = calculateDelta(tickValue, ticks);\n }\n const logDelta = log10(Math.abs(delta));\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n const options = {\n notation,\n minimumFractionDigits: numDecimal,\n maximumFractionDigits: numDecimal\n };\n Object.assign(options, this.options.ticks.format);\n return formatNumber(tickValue, locale, options);\n },\n logarithmic (tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || tickValue / Math.pow(10, Math.floor(log10(tickValue)));\n if ([\n 1,\n 2,\n 3,\n 5,\n 10,\n 15\n ].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n};\nfunction calculateDelta(tickValue, ticks) {\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n var Ticks = {\n formatters\n};\n\nfunction applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n bounds: 'ticks',\n clip: true,\n grace: 0,\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options)=>options.lineWidth,\n tickColor: (_ctx, options)=>options.color,\n offset: false\n },\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n title: {\n display: false,\n text: '',\n padding: {\n top: 4,\n bottom: 4\n }\n },\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2\n }\n });\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name)=>!name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name)=>name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash'\n });\n defaults.describe('scales', {\n _fallback: 'scale'\n });\n defaults.describe('scale.ticks', {\n _scriptable: (name)=>name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name)=>name !== 'backdropPadding'\n });\n}\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\n function getScope$1(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for(let i = 0, n = keys.length; i < n; ++i){\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope$1(root, scope), values);\n }\n return merge(getScope$1(root, ''), scope);\n}\n class Defaults {\n constructor(_descriptors, _appliers){\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context)=>context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options)=>getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options)=>getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options)=>getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n set(scope, values) {\n return set(this, scope, values);\n }\n get(scope) {\n return getScope$1(this, scope);\n }\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n override(scope, values) {\n return set(overrides, scope, values);\n }\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope$1(this, scope);\n const targetScopeObject = getScope$1(this, targetScope);\n const privateName = '_' + name;\n Object.defineProperties(scopeObject, {\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n [name]: {\n enumerable: true,\n get () {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set (value) {\n this[privateName] = value;\n }\n }\n });\n }\n apply(appliers) {\n appliers.forEach((apply)=>apply(this));\n }\n}\nvar defaults = /* #__PURE__ */ new Defaults({\n _scriptable: (name)=>!name.startsWith('on'),\n _indexable: (name)=>name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false\n }\n}, [\n applyAnimationsDefaults,\n applyLayoutsDefaults,\n applyScaleDefaults\n]);\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */ function toFontString(font) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n return (font.style ? font.style + ' ' : '') + (font.weight ? font.weight + ' ' : '') + font.size + 'px ' + font.family;\n}\n/**\n * @private\n */ function _measureText(ctx, data, gc, longest, string) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n/**\n * @private\n */ // eslint-disable-next-line complexity\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n ctx.save();\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i, j, jlen, thing, nestedThing;\n for(i = 0; i < ilen; i++){\n thing = arrayOfThings[i];\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for(j = 0, jlen = thing.length; j < jlen; j++){\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n ctx.restore();\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for(i = 0; i < gcLen; i++){\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */ function _alignPixel(chart, pixel, width) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n/**\n * Clears the entire canvas.\n */ function clearCanvas(canvas, ctx) {\n if (!ctx && !canvas) {\n return;\n }\n ctx = ctx || canvas.getContext('2d');\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n// eslint-disable-next-line complexity\nfunction drawPointLegend(ctx, options, x, y, w) {\n let type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n ctx.beginPath();\n switch(style){\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */ case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */ case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */ function _isPointInArea(point, area, margin) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n return !area || point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin;\n}\nfunction clipArea(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\nfunction unclipArea(ctx) {\n ctx.restore();\n}\n/**\n * @private\n */ function _steppedLineTo(ctx, previous, target, flip, mode) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n/**\n * @private\n */ function _bezierCurveTo(ctx, previous, target, flip) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(flip ? previous.cp1x : previous.cp2x, flip ? previous.cp1y : previous.cp2y, flip ? target.cp2x : target.cp1x, flip ? target.cp2y : target.cp1y, target.x, target.y);\n}\nfunction setRenderOpts(ctx, opts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */ const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\nfunction drawBackdrop(ctx, opts) {\n const oldColor = ctx.fillStyle;\n ctx.fillStyle = opts.color;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n/**\n * Render text onto the canvas\n */ function renderText(ctx, text, x, y, font, opts = {}) {\n const lines = isArray(text) ? text : [\n text\n ];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i, line;\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n for(i = 0; i < lines.length; ++i){\n line = lines[i];\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n y += Number(font.lineHeight);\n }\n ctx.restore();\n}\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */ function addRoundedRectPath(ctx, rect) {\n const { x , y , w , h , radius } = rect;\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n/**\n * @alias Chart.helpers.options\n * @namespace\n */ /**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */ function toLineHeight(value, size) {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n value = +matches[2];\n switch(matches[3]){\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n }\n return size * value;\n}\nconst numberOrZero = (v)=>+v || 0;\nfunction _readValueToProps(value, props) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value) ? objProps ? (prop)=>valueOrDefault(value[prop], value[props[prop]]) : (prop)=>value[prop] : ()=>value;\n for (const prop of keys){\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */ function toTRBL(value) {\n return _readValueToProps(value, {\n top: 'y',\n right: 'x',\n bottom: 'y',\n left: 'x'\n });\n}\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */ function toTRBLCorners(value) {\n return _readValueToProps(value, [\n 'topLeft',\n 'topRight',\n 'bottomLeft',\n 'bottomRight'\n ]);\n}\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */ function toPadding(value) {\n const obj = toTRBL(value);\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n return obj;\n}\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */ function toFont(options, fallback) {\n options = options || {};\n fallback = fallback || defaults.font;\n let size = valueOrDefault(options.size, fallback.size);\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n font.string = toFontString(font);\n return font;\n}\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */ function resolve(inputs, context, index, info) {\n let cacheable = true;\n let i, ilen, value;\n for(i = 0, ilen = inputs.length; i < ilen; ++i){\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */ function _addGrace(minmax, grace, beginAtZero) {\n const { min , max } = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value, add)=>beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\nfunction createContext(parentContext, context) {\n return Object.assign(Object.create(parentContext), context);\n}\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */ function _createResolver(scopes, prefixes = [\n ''\n], rootScopes, fallback, getTarget = ()=>scopes[0]) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope)=>_createResolver([\n scope,\n ...scopes\n ], prefixes, finalRootScopes, fallback)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */ deleteProperty (target, prop) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n /**\n * A trap for getting property values.\n */ get (target, prop) {\n return _cached(target, prop, ()=>_resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */ getOwnPropertyDescriptor (target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n /**\n * A trap for Object.getPrototypeOf.\n */ getPrototypeOf () {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n /**\n * A trap for the in operator.\n */ has (target, prop) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */ ownKeys (target) {\n return getKeysFromAllScopes(target);\n },\n /**\n * A trap for setting property values.\n */ set (target, prop, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n });\n}\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */ function _attachContext(proxy, context, subProxy, descriptorDefaults) {\n const cache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx)=>_attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope)=>_attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */ deleteProperty (target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n /**\n * A trap for getting property values.\n */ get (target, prop, receiver) {\n return _cached(target, prop, ()=>_resolveWithContext(target, prop, receiver));\n },\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */ getOwnPropertyDescriptor (target, prop) {\n return target._descriptors.allKeys ? Reflect.has(proxy, prop) ? {\n enumerable: true,\n configurable: true\n } : undefined : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n /**\n * A trap for Object.getPrototypeOf.\n */ getPrototypeOf () {\n return Reflect.getPrototypeOf(proxy);\n },\n /**\n * A trap for the in operator.\n */ has (target, prop) {\n return Reflect.has(proxy, prop);\n },\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */ ownKeys () {\n return Reflect.ownKeys(proxy);\n },\n /**\n * A trap for setting property values.\n */ set (target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n });\n}\n/**\n * @private\n */ function _descriptors(proxy, defaults = {\n scriptable: true,\n indexable: true\n}) {\n const { _scriptable =defaults.scriptable , _indexable =defaults.indexable , _allKeys =defaults.allKeys } = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : ()=>_scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : ()=>_indexable\n };\n}\nconst readKey = (prefix, name)=>prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value)=>isObject(value) && prop !== 'adapters' && (Object.getPrototypeOf(value) === null || value.constructor === Object);\nfunction _cached(target, prop, resolve) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n const { _proxy , _context , _subProxy , _descriptors: descriptors } = target;\n let value = _proxy[prop]; // resolve from proxy\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\nfunction _resolveScriptable(prop, getValue, target, receiver) {\n const { _proxy , _context , _subProxy , _stack } = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n const { _proxy , _context , _subProxy , _descriptors: descriptors } = target;\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter((s)=>s !== arr);\n value = [];\n for (const item of arr){\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent)=>key === true ? parent : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback, value) {\n for (const parent of parentScopes){\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [\n ...parentScopes,\n ...rootScopes\n ];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [\n ''\n ], rootScopes, fallback, ()=>subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback, item) {\n while(key){\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n let value;\n for (const prefix of prefixes){\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value) ? createSubResolver(scopes, proxy, prop, value) : value;\n }\n }\n}\nfunction _resolve(key, scopes) {\n for (const scope of scopes){\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\nfunction getKeysFromAllScopes(target) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n const set = new Set();\n for (const scope of scopes){\n for (const key of Object.keys(scope).filter((k)=>!k.startsWith('_'))){\n set.add(key);\n }\n }\n return Array.from(set);\n}\nfunction _parseObjectDataRadialScale(meta, data, start, count) {\n const { iScale } = meta;\n const { key ='r' } = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i)=>i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis)=>indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n // This function must also respect \"skipped\" points\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n/**\n * Adjust tangents to ensure monotonic properties\n */ function monotoneAdjust(points, deltaK, mK) {\n const pointsLen = points.length;\n let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(let i = 0; i < pointsLen - 1; ++i){\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(let i = 0; i < pointsLen; ++i){\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */ function splineCurveMonotone(points, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK = Array(pointsLen).fill(0);\n const mK = Array(pointsLen);\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(i = 0; i < pointsLen; ++i){\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i] : !pointAfter ? deltaK[i - 1] : sign(deltaK[i - 1]) !== sign(deltaK[i]) ? 0 : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n monotoneAdjust(points, deltaK, mK);\n monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for(i = 0, ilen = points.length; i < ilen; ++i){\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n/**\n * @private\n */ function _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n let i, ilen, point, controlPoints;\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt)=>!pt.skip);\n }\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for(i = 0, ilen = points.length; i < ilen; ++i){\n point = points[i];\n controlPoints = splineCurve(prev, point, points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen], options.tension);\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n\n/**\n * Note: typedefs are auto-exported, so use a made-up `dom` namespace where\n * necessary to avoid duplicates with `export * from './helpers`; see\n * https://github.com/microsoft/TypeScript/issues/46011\n * @typedef { import('../core/core.controller.js').default } dom.Chart\n * @typedef { import('../../types').ChartEvent } ChartEvent\n */ /**\n * @private\n */ function _isDomSupported() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n/**\n * @private\n */ function _getParentNode(domNode) {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = parent.host;\n }\n return parent;\n}\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */ function parseMaxStyle(styleValue, node, parentProperty) {\n let valueInPixels;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n return valueInPixels;\n}\nconst getComputedStyle = (element)=>element.ownerDocument.defaultView.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = [\n 'top',\n 'right',\n 'bottom',\n 'left'\n];\nfunction getPositionedStyle(styles, style, suffix) {\n const result = {};\n suffix = suffix ? '-' + suffix : '';\n for(let i = 0; i < 4; i++){\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\nconst useOffsetPos = (x, y, target)=>(x > 0 || y > 0) && (!target || !target.shadowRoot);\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */ function getCanvasPosition(e, canvas) {\n const touches = e.touches;\n const source = touches && touches.length ? touches[0] : e;\n const { offsetX , offsetY } = source;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {\n x,\n y,\n box\n };\n}\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */ function getRelativePosition(event, chart) {\n if ('native' in event) {\n return event;\n }\n const { canvas , currentDevicePixelRatio } = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const { x , y , box } = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n let { width , height } = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\nfunction getContainerSize(canvas, width, height) {\n let maxWidth, maxHeight;\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\nconst round1 = (v)=>Math.round(v * 10) / 10;\n// eslint-disable-next-line complexity\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let { width , height } = containerSize;\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n return {\n width,\n height\n };\n}\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */ function retinaScale(chart, forceRatio, forceStyle) {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = Math.floor(chart.height * pixelRatio);\n const deviceWidth = Math.floor(chart.width * pixelRatio);\n chart.height = Math.floor(chart.height);\n chart.width = Math.floor(chart.width);\n const canvas = chart.canvas;\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || !canvas.style.height && !canvas.style.width)) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) {\n chart.currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */ const supportsEventListenerOptions = function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive () {\n passiveSupported = true;\n return false;\n }\n };\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}();\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */ function readUsedSize(element, property) {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n\n/**\n * @private\n */ function _pointInLine(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n/**\n * @private\n */ function _steppedInterpolation(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y : mode === 'after' ? t < 1 ? p1.y : p2.y : t > 0 ? p2.y : p1.y\n };\n}\n/**\n * @private\n */ function _bezierInterpolation(p1, p2, t, mode) {\n const cp1 = {\n x: p1.cp2x,\n y: p1.cp2y\n };\n const cp2 = {\n x: p2.cp1x,\n y: p2.cp1y\n };\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n return {\n x (x) {\n return rectX + rectX + width - x;\n },\n setWidth (w) {\n width = w;\n },\n textAlign (align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus (x, value) {\n return x - value;\n },\n leftForLtr (x, itemWidth) {\n return x - itemWidth;\n }\n };\n};\nconst getLeftToRightAdapter = function() {\n return {\n x (x) {\n return x;\n },\n setWidth (w) {},\n textAlign (align) {\n return align;\n },\n xPlus (x, value) {\n return x + value;\n },\n leftForLtr (x, _itemWidth) {\n return x;\n }\n };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n let style, original;\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction')\n ];\n style.setProperty('direction', direction, 'important');\n ctx.prevTextDirection = original;\n }\n}\nfunction restoreTextDirection(ctx, original) {\n if (original !== undefined) {\n delete ctx.prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle\n };\n }\n return {\n between: _isBetween,\n compare: (a, b)=>a - b,\n normalize: (x)=>x\n };\n}\nfunction normalizeSegment({ start , end , count , loop , style }) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\nfunction getSegment(segment, points, bounds) {\n const { property , start: startBound , end: endBound } = bounds;\n const { between , normalize } = propertyFn(property);\n const count = points.length;\n let { start , end , loop } = segment;\n let i, ilen;\n if (loop) {\n start += count;\n end += count;\n for(i = 0, ilen = count; i < ilen; ++i){\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n if (end < start) {\n end += count;\n }\n return {\n start,\n end,\n loop,\n style: segment.style\n };\n}\n function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [\n segment\n ];\n }\n const { property , start: startBound , end: endBound } = bounds;\n const count = points.length;\n const { compare , between , normalize } = propertyFn(property);\n const { start , end , loop , style } = getSegment(segment, points, bounds);\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n const startIsBefore = ()=>between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = ()=>compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = ()=>inside || startIsBefore();\n const shouldStop = ()=>!inside || endIsBefore();\n for(let i = start, prev = start; i <= end; ++i){\n point = points[i % count];\n if (point.skip) {\n continue;\n }\n value = normalize(point[property]);\n if (value === prevValue) {\n continue;\n }\n inside = between(value, startBound, endBound);\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({\n start: subStart,\n end: i,\n loop,\n count,\n style\n }));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n if (subStart !== null) {\n result.push(normalizeSegment({\n start: subStart,\n end,\n loop,\n count,\n style\n }));\n }\n return result;\n}\n function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n for(let i = 0; i < segments.length; i++){\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n function findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n if (loop && !spanGaps) {\n while(start < count && !points[start].skip){\n start++;\n }\n }\n while(start < count && points[start].skip){\n start++;\n }\n start %= count;\n if (loop) {\n end += start;\n }\n while(end > start && points[end % count].skip){\n end--;\n }\n end %= count;\n return {\n start,\n end\n };\n}\n function solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n for(end = start + 1; end <= max; ++end){\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({\n start: start % count,\n end: (end - 1) % count,\n loop\n });\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n if (last !== null) {\n result.push({\n start: start % count,\n end: last % count,\n loop\n });\n }\n return result;\n}\n function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n if (!count) {\n return [];\n }\n const loop = !!line._loop;\n const { start , end } = findStartAndEnd(points, count, loop, spanGaps);\n if (spanGaps === true) {\n return splitByStyles(line, [\n {\n start,\n end,\n loop\n }\n ], points, segmentOptions);\n }\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n function splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n function doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const { _datasetIndex: datasetIndex , options: { spanGaps } } = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n s += count;\n while(points[s % count].skip){\n s -= dir;\n }\n while(points[e % count].skip){\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({\n start: s % count,\n end: e % count,\n loop: l,\n style: st\n });\n prevStyle = st;\n start = e % count;\n }\n }\n for (const segment of segments){\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for(i = start + 1; i <= segment.end; i++){\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n return result;\n}\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n\nexport { unclipArea as $, _rlookupByKey as A, _lookupByKey as B, _isPointInArea as C, getAngleFromPoint as D, toPadding as E, each as F, getMaximumSize as G, HALF_PI as H, _getParentNode as I, readUsedSize as J, supportsEventListenerOptions as K, throttled as L, _isDomSupported as M, _factorize as N, finiteOrDefault as O, PI as P, callback as Q, _addGrace as R, _limitValue as S, TAU as T, toDegrees as U, _measureText as V, _int16Range as W, _alignPixel as X, clipArea as Y, renderText as Z, _arrayUnique as _, resolve as a, fontString as a$, toFont as a0, _toLeftRightCenter as a1, _alignStartEnd as a2, overrides as a3, merge as a4, _capitalize as a5, descriptors as a6, isFunction as a7, _attachContext as a8, _createResolver as a9, overrideTextDirection as aA, _textX as aB, restoreTextDirection as aC, drawPointLegend as aD, distanceBetweenPoints as aE, noop as aF, _setMinAndMaxByKey as aG, niceNum as aH, almostWhole as aI, almostEquals as aJ, _decimalPlaces as aK, Ticks as aL, log10 as aM, _longestText as aN, _filterBetween as aO, _lookup as aP, isPatternOrGradient as aQ, getHoverColor as aR, clone as aS, _merger as aT, _mergerIf as aU, _deprecated as aV, _splitKey as aW, toFontString as aX, splineCurve as aY, splineCurveMonotone as aZ, getStyle as a_, _descriptors as aa, mergeIf as ab, uid as ac, debounce as ad, retinaScale as ae, clearCanvas as af, setsEqual as ag, _elementsEqual as ah, _isClickEvent as ai, _isBetween as aj, _readValueToProps as ak, _updateBezierControlPoints as al, _computeSegments as am, _boundSegments as an, _steppedInterpolation as ao, _bezierInterpolation as ap, _pointInLine as aq, _steppedLineTo as ar, _bezierCurveTo as as, drawPoint as at, addRoundedRectPath as au, toTRBL as av, toTRBLCorners as aw, _boundSegment as ax, _normalizeAngle as ay, getRtlAdapter as az, isArray as b, toLineHeight as b0, PITAU as b1, INFINITY as b2, RAD_PER_DEG as b3, QUARTER_PI as b4, TWO_THIRDS_PI as b5, _angleDiff as b6, color as c, defaults as d, effects as e, resolveObjectKey as f, isNumberFinite as g, defined as h, isObject as i, createContext as j, isNullOrUndef as k, listenArrayEvents as l, toPercentage as m, toDimension as n, formatNumber as o, _angleBetween as p, _getStartAndCountOfVisiblePoints as q, requestAnimFrame as r, sign as s, toRadians as t, unlistenArrayEvents as u, valueOrDefault as v, _scaleRangesChanged as w, isNumber as x, _parseObjectDataRadialScale as y, getRelativePosition as z };\n//# sourceMappingURL=helpers.segment.js.map\n","/*!\n * Chart.js v4.4.7\n * https://www.chartjs.org\n * (c) 2024 Chart.js Contributors\n * Released under the MIT License\n */\nimport { r as requestAnimFrame, a as resolve, e as effects, c as color, i as isObject, d as defaults, b as isArray, v as valueOrDefault, u as unlistenArrayEvents, l as listenArrayEvents, f as resolveObjectKey, g as isNumberFinite, h as defined, s as sign, j as createContext, k as isNullOrUndef, _ as _arrayUnique, t as toRadians, m as toPercentage, n as toDimension, T as TAU, o as formatNumber, p as _angleBetween, H as HALF_PI, P as PI, q as _getStartAndCountOfVisiblePoints, w as _scaleRangesChanged, x as isNumber, y as _parseObjectDataRadialScale, z as getRelativePosition, A as _rlookupByKey, B as _lookupByKey, C as _isPointInArea, D as getAngleFromPoint, E as toPadding, F as each, G as getMaximumSize, I as _getParentNode, J as readUsedSize, K as supportsEventListenerOptions, L as throttled, M as _isDomSupported, N as _factorize, O as finiteOrDefault, Q as callback, R as _addGrace, S as _limitValue, U as toDegrees, V as _measureText, W as _int16Range, X as _alignPixel, Y as clipArea, Z as renderText, $ as unclipArea, a0 as toFont, a1 as _toLeftRightCenter, a2 as _alignStartEnd, a3 as overrides, a4 as merge, a5 as _capitalize, a6 as descriptors, a7 as isFunction, a8 as _attachContext, a9 as _createResolver, aa as _descriptors, ab as mergeIf, ac as uid, ad as debounce, ae as retinaScale, af as clearCanvas, ag as setsEqual, ah as _elementsEqual, ai as _isClickEvent, aj as _isBetween, ak as _readValueToProps, al as _updateBezierControlPoints, am as _computeSegments, an as _boundSegments, ao as _steppedInterpolation, ap as _bezierInterpolation, aq as _pointInLine, ar as _steppedLineTo, as as _bezierCurveTo, at as drawPoint, au as addRoundedRectPath, av as toTRBL, aw as toTRBLCorners, ax as _boundSegment, ay as _normalizeAngle, az as getRtlAdapter, aA as overrideTextDirection, aB as _textX, aC as restoreTextDirection, aD as drawPointLegend, aE as distanceBetweenPoints, aF as noop, aG as _setMinAndMaxByKey, aH as niceNum, aI as almostWhole, aJ as almostEquals, aK as _decimalPlaces, aL as Ticks, aM as log10, aN as _longestText, aO as _filterBetween, aP as _lookup } from './chunks/helpers.segment.js';\nimport '@kurkle/color';\n\nclass Animator {\n constructor(){\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n callbacks.forEach((fn)=>fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n this._request = requestAnimFrame.call(window, ()=>{\n this._update();\n this._request = null;\n if (this._running) {\n this._refresh();\n }\n });\n }\n _update(date = Date.now()) {\n let remaining = 0;\n this._charts.forEach((anims, chart)=>{\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n for(; i >= 0; --i){\n item = items[i];\n if (item._active) {\n if (item._total > anims.duration) {\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n remaining += items.length;\n });\n this._lastDate = date;\n if (remaining === 0) {\n this._running = false;\n }\n }\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur)=>Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n for(; i >= 0; --i){\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\nvar animator = /* #__PURE__ */ new Animator();\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean (from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n color (from, to, factor) {\n const c0 = color(from || transparent);\n const c1 = c0.valid && color(to || transparent);\n return c1 && c1.valid ? c1.mix(c0, factor).hexString() : to;\n },\n number (from, to, factor) {\n return from + (to - from) * factor;\n }\n};\nclass Animation {\n constructor(cfg, target, prop, to){\n const currentValue = target[prop];\n to = resolve([\n cfg.to,\n to,\n currentValue,\n cfg.from\n ]);\n const from = resolve([\n cfg.from,\n currentValue,\n to\n ]);\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n active() {\n return this._active;\n }\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([\n cfg.to,\n to,\n currentValue,\n cfg.from\n ]);\n this._from = resolve([\n cfg.from,\n currentValue,\n to\n ]);\n }\n }\n cancel() {\n if (this._active) {\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n this._active = from !== to && (loop || elapsed < duration);\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n factor = elapsed / duration % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n this._target[prop] = this._fn(from, to, factor);\n }\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej)=>{\n promises.push({\n res,\n rej\n });\n });\n }\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for(let i = 0; i < promises.length; i++){\n promises[i][method]();\n }\n }\n}\n\nclass Animations {\n constructor(chart, config){\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n Object.getOwnPropertyNames(config).forEach((key)=>{\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions){\n resolved[option] = cfg[option];\n }\n (isArray(cfg.properties) && cfg.properties || [\n key\n ]).forEach((prop)=>{\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n awaitAll(target.options.$animations, newOptions).then(()=>{\n target.options = newOptions;\n }, ()=>{\n });\n }\n return animations;\n }\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n for(i = props.length - 1; i >= 0; --i){\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n if (animation) {\n if (cfg && animation.active()) {\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n target[prop] = value;\n continue;\n }\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n update(target, values) {\n if (this._properties.size === 0) {\n Object.assign(target, values);\n return;\n }\n const animations = this._createAnimations(target, values);\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for(let i = 0; i < keys.length; i++){\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n target.options = options = Object.assign({}, options, {\n $shared: false,\n $animations: {}\n });\n }\n return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\nfunction toClip(value) {\n let t, r, b, l;\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n for(i = 0, ilen = metasets.length; i < ilen; ++i){\n keys.push(metasets[i].index);\n }\n return keys;\n}\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n if (value === null) {\n return;\n }\n let found = false;\n for(i = 0, ilen = keys.length; i < ilen; ++i){\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isNumberFinite(otherValue) && (singleMode || value === 0 || sign(value) === sign(otherValue))) {\n value += otherValue;\n }\n }\n if (!found && !options.all) {\n return 0;\n }\n return value;\n}\nfunction convertObjectDataToArray(data, meta) {\n const { iScale , vScale } = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for(i = 0, ilen = keys.length; i < ilen; ++i){\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || stacked === undefined && meta.stack !== undefined;\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n const { min , max , minDefined , maxDefined } = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()){\n const value = stack[meta.index];\n if (positive && value > 0 || !positive && value < 0) {\n return meta.index;\n }\n }\n return null;\n}\nfunction updateStacks(controller, parsed) {\n const { chart , _cachedMeta: meta } = controller;\n const stacks = chart._stacks || (chart._stacks = {});\n const { iScale , vScale , index: datasetIndex } = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n for(let i = 0; i < ilen; ++i){\n const item = parsed[i];\n const { [iAxis]: index , [vAxis]: value } = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter((key)=>scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n return createContext(parent, {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n });\n}\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\nfunction clearStacks(meta, items) {\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n items = items || meta._parsed;\n for (const parsed of items){\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\nconst isDirectUpdateMode = (mode)=>mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared)=>shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart)=>canStack && !meta.hidden && meta._stacked && {\n keys: getSortedDatasetIndices(chart, true),\n values: null\n };\nclass DatasetController {\n static defaults = {};\n static datasetElementType = null;\n static dataElementType = null;\n constructor(chart, datasetIndex){\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n this.initialize();\n }\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n const chooseId = (axis, x, y, r)=>axis === 'x' ? x : axis === 'r' ? r : y;\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale ? meta.vScale : meta.iScale;\n }\n reset() {\n this._update('reset');\n }\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n unlistenArrayEvents(_data, this);\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n addElements() {\n const meta = this._cachedMeta;\n this._dataCheck();\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n this._dataCheck();\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n this._resyncElements(resetNewElements);\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n parse(start, count) {\n const { _cachedMeta: meta , _data: data } = this;\n const { iScale , _stacked } = meta;\n const iAxis = iScale.axis;\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n const isNotInOrderComparedToPrev = ()=>cur[iAxis] === null || prev && cur[iAxis] < prev[iAxis];\n for(i = 0; i < count; ++i){\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n parsePrimitiveData(meta, data, start, count) {\n const { iScale , vScale } = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const { xScale , yScale } = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const { xScale , yScale } = meta;\n const { xAxisKey ='x' , yAxisKey ='y' } = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {\n mode\n });\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY\n };\n const { min: otherMin , max: otherMax } = getUserBounds(otherScale);\n let i, parsed;\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n for(i = 0; i < ilen; ++i){\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n break;\n }\n }\n if (sorted) {\n for(i = ilen - 1; i >= 0; --i){\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n for(i = 0, ilen = parsed.length; i < ilen; ++i){\n value = parsed[i][scale.axis];\n if (isNumberFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n getMaxOverflow() {\n return false;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n update(mode) {}\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || elements.length - start;\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n for(i = start; i < start + count; ++i){\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n for(i = 0; i < active.length; ++i){\n active[i].draw(ctx, area);\n }\n }\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset ? this.resolveDatasetElementOptions(mode) : this.resolveDataElementOptions(index || 0, mode);\n }\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context || (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context || (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [\n `${elementType}Hover`,\n 'hover',\n elementType,\n ''\n ] : [\n elementType,\n ''\n ];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n const context = ()=>this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n if (values.$shared) {\n values.$shared = sharing;\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n return values;\n }\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || sharedOptions !== previouslySharedOptions;\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {\n sharedOptions,\n includeOptions\n };\n }\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n options: !active && this.getSharedOptions(options) || options\n });\n }\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n for (const [method, arg1, arg2] of this._syncList){\n this[method](arg1, arg2);\n }\n this._syncList = [];\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n if (count) {\n this.parse(0, count);\n }\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n const move = (arr)=>{\n arr.length += count;\n for(i = arr.length - 1; i >= end; i--){\n arr[i] = arr[i - count];\n }\n };\n move(data);\n for(i = start; i < end; ++i){\n data[i] = new this.dataElementType();\n }\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n updateElements(element, start, count, mode) {}\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([\n this.index,\n ...args\n ]);\n }\n _onDataPush() {\n const count = arguments.length;\n this._sync([\n '_insertElements',\n this.getDataset().data.length - count,\n count\n ]);\n }\n _onDataPop() {\n this._sync([\n '_removeElements',\n this._cachedMeta.data.length - 1,\n 1\n ]);\n }\n _onDataShift() {\n this._sync([\n '_removeElements',\n 0,\n 1\n ]);\n }\n _onDataSplice(start, count) {\n if (count) {\n this._sync([\n '_removeElements',\n start,\n count\n ]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync([\n '_insertElements',\n start,\n newCount\n ]);\n }\n }\n _onDataUnshift() {\n this._sync([\n '_insertElements',\n 0,\n arguments.length\n ]);\n }\n}\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n for(let i = 0, ilen = visibleMetas.length; i < ilen; i++){\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b)=>a - b));\n }\n return scale._cache.$bar;\n}\n function computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = ()=>{\n if (curr === 32767 || curr === -32768) {\n return;\n }\n if (defined(prev)) {\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n for(i = 0, ilen = values.length; i < ilen; ++i){\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n prev = undefined;\n for(i = 0, ilen = scale.ticks.length; i < ilen; ++i){\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n return min;\n}\n function computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n size = thickness * stackCount;\n ratio = 1;\n }\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - size / 2\n };\n}\n function computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n if (prev === null) {\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n if (next === null) {\n next = curr + curr - prev;\n }\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n item[vScale.axis] = barEnd;\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n for(i = start, ilen = start + count; i < ilen; ++i){\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {\n start,\n end,\n reverse,\n top,\n bottom\n };\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n if (edge === true) {\n properties.borderSkipped = {\n top: true,\n right: true,\n bottom: true,\n left: true\n };\n return;\n }\n const { start , end , reverse , top , bottom } = borderProps(properties);\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\nfunction setInflateAmount(properties, { inflateAmount }, ratio) {\n properties.inflateAmount = inflateAmount === 'auto' ? ratio === 1 ? 0.33 : 0 : inflateAmount;\n}\nclass BarController extends DatasetController {\n static id = 'bar';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'base',\n 'width',\n 'height'\n ]\n }\n }\n };\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true\n }\n }\n };\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseObjectData(meta, data, start, count) {\n const { iScale , vScale } = meta;\n const { xAxisKey ='x' , yAxisKey ='y' } = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for(i = start, ilen = start + count; i < ilen; ++i){\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n getMaxOverflow() {\n return 0;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const { iScale , vScale } = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom) ? '[' + custom.start + ', ' + custom.end + ']' : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const { index , _cachedMeta: { vScale } } = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n for(let i = start; i < start + count; i++){\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {\n base,\n head: base\n } : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || index === stack._top || index === stack._bottom,\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n _getStacks(last, dataIndex) {\n const { iScale } = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type).filter((meta)=>meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n const skipNull = (meta)=>{\n const parsed = meta._parsed.find((item)=>item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n for (const meta of metasets){\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === undefined && meta.stack === undefined) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n if (!stacks.length) {\n stacks.push(undefined);\n }\n return stacks;\n }\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = name !== undefined ? stacks.indexOf(name) : -1;\n return index === -1 ? stacks.length - 1 : index;\n }\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n for(i = 0, ilen = meta.data.length; i < ilen; ++i){\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n _calculateBarValuePixels(index) {\n const { _cachedMeta: { vScale , _stacked , index: datasetIndex } , options: { base: baseValue , minBarLength } } = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n if (length !== value) {\n start = length - value;\n length = value;\n }\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n head = base;\n }\n size = head - base;\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n if (_stacked && !floating) {\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options, stackCount) : computeFitCategoryTraits(index, ruler, options, stackCount);\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined);\n center = range.start + range.chunk * stackIndex + range.chunk / 2;\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n for(; i < ilen; ++i){\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n}\n\nclass BubbleController extends DatasetController {\n static id = 'bubble';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'borderWidth',\n 'radius'\n ]\n }\n }\n };\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n let max = 0;\n for(let i = data.length - 1; i >= 0; --i){\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const { xScale , yScale } = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n update(mode) {\n const points = this._cachedMeta.data;\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale } = this._cachedMeta;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n for(let i = start; i < start + count; i++){\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n if (reset) {\n properties.options.radius = 0;\n }\n }\n this.updateElement(point, i, properties, mode);\n }\n }\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n if (values.$shared) {\n values = Object.assign({}, values, {\n $shared: false\n });\n }\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n return values;\n }\n}\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {\n ratioX,\n ratioY,\n offsetX,\n offsetY\n };\n}\nclass DoughnutController extends DatasetController {\n static id = 'doughnut';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'circumference',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'startAngle',\n 'x',\n 'y',\n 'offset',\n 'borderWidth',\n 'spacing'\n ]\n }\n },\n cutout: '50%',\n rotation: 0,\n circumference: 360,\n radius: '100%',\n spacing: 0,\n indexAxis: 'r'\n };\n static descriptors = {\n _scriptable: (name)=>name !== 'spacing',\n _indexable: (name)=>name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash')\n };\n static overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels (chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const { labels: { pointStyle , color } } = chart.legend.options;\n return data.labels.map((label, i)=>{\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick (e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n constructor(chart, datasetIndex){\n super(chart, datasetIndex);\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n linkScales() {}\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i)=>+data[i];\n if (isObject(data[start])) {\n const { key ='value' } = this._parsing;\n getter = (i)=>+resolveObjectKey(data[i], key);\n }\n let i, ilen;\n for(i = start, ilen = start + count; i < ilen; ++i){\n meta._parsed[i] = getter(i);\n }\n }\n }\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n for(let i = 0; i < this.chart.data.datasets.length; ++i){\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n return {\n rotation: min,\n circumference: max - min\n };\n }\n update(mode) {\n const chart = this.chart;\n const { chartArea } = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n const { circumference , rotation } = this._getRotationExtents();\n const { ratioX , ratioY , offsetX , offsetY } = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n meta.total = this.calculateTotal();\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if (reset && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n for(i = 0; i < start; ++i){\n startAngle += this._circumference(i, reset);\n }\n for(i = start; i < start + count; ++i){\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n this.updateElement(arc, i, properties, mode);\n }\n }\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n for(i = 0; i < metaData.length; i++){\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n return total;\n }\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n return {\n label: labels[index] || '',\n value\n };\n }\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n if (!arcs) {\n for(i = 0, ilen = chart.data.datasets.length; i < ilen; ++i){\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n if (!arcs) {\n return 0;\n }\n for(i = 0, ilen = arcs.length; i < ilen; ++i){\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n getMaxOffset(arcs) {\n let max = 0;\n for(let i = 0, ilen = arcs.length; i < ilen; ++i){\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n for(let i = 0; i < datasetIndex; ++i){\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n return ringWeightOffset;\n }\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n\nclass LineController extends DatasetController {\n static id = 'line';\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n showLine: true,\n spanGaps: false\n };\n static overrides = {\n scales: {\n _index_: {\n type: 'category'\n },\n _value_: {\n type: 'linear'\n }\n }\n };\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n update(mode) {\n const meta = this._cachedMeta;\n const { dataset: line , data: points = [] , _dataset } = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let { start , count } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n this.updateElements(points, start, count, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale , _stacked , _dataset } = this._cachedMeta;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const { spanGaps , segment } = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for(let i = 0; i < pointsCount; ++i){\n const point = points[i];\n const properties = directUpdate ? point : {};\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n\nclass PolarAreaController extends DatasetController {\n static id = 'polarArea';\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ]\n }\n },\n indexAxis: 'r',\n startAngle: 0\n };\n static overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels (chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const { labels: { pointStyle , color } } = chart.legend.options;\n return data.labels.map((label, i)=>{\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick (e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n constructor(chart, datasetIndex){\n super(chart, datasetIndex);\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n return {\n label: labels[index] || '',\n value\n };\n }\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const arcs = this._cachedMeta.data;\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY\n };\n meta.data.forEach((element, index)=>{\n const parsed = this.getParsed(index).r;\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n return range;\n }\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? outerRadius / 100 * opts.cutoutPercentage : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n this.outerRadius = outerRadius - radiusLength * this.index;\n this.innerRadius = this.outerRadius - radiusLength;\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n const defaultAngle = 360 / this.countVisibleElements();\n for(i = 0; i < start; ++i){\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for(i = start; i < start + count; i++){\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n this.updateElement(arc, i, properties, mode);\n }\n }\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n meta.data.forEach((element, index)=>{\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n return count;\n }\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index) ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle) : 0;\n }\n}\n\nclass PieController extends DoughnutController {\n static id = 'pie';\n static defaults = {\n cutout: 0,\n rotation: 0,\n circumference: 360,\n radius: '100%'\n };\n}\n\nclass RadarController extends DatasetController {\n static id = 'radar';\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n }\n };\n static overrides = {\n aspectRatio: 1,\n scales: {\n r: {\n type: 'radialLinear'\n }\n }\n };\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n line.points = points;\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n this.updateElement(line, undefined, properties, mode);\n }\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n for(let i = start; i < start + count; i++){\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n\nclass ScatterController extends DatasetController {\n static id = 'scatter';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n static overrides = {\n interaction: {\n mode: 'point'\n },\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const { xScale , yScale } = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n update(mode) {\n const meta = this._cachedMeta;\n const { data: points = [] } = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let { start , count } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n if (this.options.showLine) {\n if (!this.datasetElementType) {\n this.addElements();\n }\n const { dataset: line , _dataset } = meta;\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n delete meta.dataset;\n this.datasetElementType = false;\n }\n this.updateElements(points, start, count, mode);\n }\n addElements() {\n const { showLine } = this.options;\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n super.addElements();\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale , _stacked , _dataset } = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const { spanGaps , segment } = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for(let i = start; i < start + count; ++i){\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n if (!this.options.showLine) {\n let max = 0;\n for(let i = data.length - 1; i >= 0; --i){\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPieController: PieController,\nPolarAreaController: PolarAreaController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\n/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */ function abstract() {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */ class DateAdapterBase {\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */ static override(members) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n options;\n constructor(options){\n this.options = options || {};\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n formats() {\n return abstract();\n }\n parse() {\n return abstract();\n }\n format() {\n return abstract();\n }\n add() {\n return abstract();\n }\n diff() {\n return abstract();\n }\n startOf() {\n return abstract();\n }\n endOf() {\n return abstract();\n }\n}\nvar adapters = {\n _date: DateAdapterBase\n};\n\nfunction binarySearch(metaset, axis, value, intersect) {\n const { controller , data , _sorted } = metaset;\n const iScale = controller._cachedMeta.iScale;\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n return lookupMethod(data, axis, value);\n } else if (controller._sharedOptions) {\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {\n lo: start.lo,\n hi: end.hi\n };\n }\n }\n }\n return {\n lo: 0,\n hi: data.length - 1\n };\n}\n function evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for(let i = 0, ilen = metasets.length; i < ilen; ++i){\n const { index , data } = metasets[i];\n const { lo , hi } = binarySearch(metasets[i], axis, value, intersect);\n for(let j = lo; j <= hi; ++j){\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n function getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n function getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n };\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n function getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n function evaluationFunc(element, datasetIndex, index) {\n const { startAngle , endAngle } = element.getProps([\n 'startAngle',\n 'endAngle'\n ], useFinalPosition);\n const { angle } = getAngleFromPoint(element, {\n x: position.x,\n y: position.y\n });\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n function getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [\n {\n element,\n datasetIndex,\n index\n }\n ];\n minDistance = distance;\n } else if (distance === minDistance) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n function getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n return axis === 'r' && !intersect ? getNearestRadialItems(chart, position, axis, useFinalPosition) : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n function getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index)=>{\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n var Interaction = {\n evaluateInteractionItems,\n modes: {\n index (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n if (!items.length) {\n return [];\n }\n chart.getSortedVisibleDatasetMetas().forEach((meta)=>{\n const index = items[0].index;\n const element = meta.data[index];\n if (element && !element.skip) {\n elements.push({\n element,\n datasetIndex: meta.index,\n index\n });\n }\n });\n return elements;\n },\n dataset (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for(let i = 0; i < data.length; ++i){\n items.push({\n element: data[i],\n datasetIndex,\n index: i\n });\n }\n }\n return items;\n },\n point (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n nearest (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n x (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n y (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n\nconst STATIC_POSITIONS = [\n 'left',\n 'top',\n 'right',\n 'bottom'\n];\nfunction filterByPosition(array, position) {\n return array.filter((v)=>v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter((v)=>STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b)=>{\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight;\n });\n}\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n for(i = 0, ilen = (boxes || []).length; i < ilen; ++i){\n box = boxes[i];\n ({ position: pos , options: { stack , stackWeight =1 } } = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && pos + stack,\n stackWeight\n });\n }\n return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts){\n const { stack , pos , stackWeight } = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {\n count: 0,\n placed: 0,\n weight: 0,\n size: 0\n });\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n function setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const { vBoxMaxWidth , hBoxMaxHeight } = params;\n let i, ilen, layout;\n for(i = 0, ilen = layouts.length; i < ilen; ++i){\n layout = layouts[i];\n const { fullSize } = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter((wrap)=>wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n const { pos , box } = layout;\n const maxPadding = chartArea.maxPadding;\n if (!isObject(pos)) {\n if (layout.size) {\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {\n size: 0,\n count: 1\n };\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n return layout.horizontal ? {\n same: widthChanged,\n other: heightChanged\n } : {\n same: heightChanged,\n other: widthChanged\n };\n}\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n function marginForPositions(positions) {\n const margin = {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n };\n positions.forEach((pos)=>{\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n return horizontal ? marginForPositions([\n 'left',\n 'right'\n ]) : marginForPositions([\n 'top',\n 'bottom'\n ]);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n for(i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i){\n layout = boxes[i];\n box = layout.box;\n box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea));\n const { same , other } = updateDims(chartArea, params, layout, stacks);\n refit |= same && refitBoxes.length;\n changed = changed || other;\n if (!box.fullSize) {\n refitBoxes.push(layout);\n }\n }\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let { x , y } = chartArea;\n for (const layout of boxes){\n const box = layout.box;\n const stack = stacks[layout.stack] || {\n count: 1,\n placed: 0,\n weight: 1\n };\n const weight = layout.stackWeight / stack.weight || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n chartArea.x = x;\n chartArea.y = y;\n}\nvar layouts = {\n addBox (chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n item._layers = item._layers || function() {\n return [\n {\n z: 0,\n draw (chartArea) {\n item.draw(chartArea);\n }\n }\n ];\n };\n chart.boxes.push(item);\n },\n removeBox (chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n configure (chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n update (chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n each(chart.boxes, (box)=>{\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap)=>wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n handleMaxPadding(chartArea);\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w\n };\n each(boxes.chartArea, (layout)=>{\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n });\n });\n }\n};\n\nclass BasePlatform {\n acquireContext(canvas, aspectRatio) {}\n releaseContext(context) {\n return false;\n }\n addEventListener(chart, type, listener) {}\n removeEventListener(chart, type, listener) {}\n getDevicePixelRatio() {\n return 1;\n }\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n isAttached(canvas) {\n return true;\n }\n updateConfig(config) {\n }\n}\n\nclass BasicPlatform extends BasePlatform {\n acquireContext(item) {\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n\nconst EXPANDO_KEY = '$chartjs';\n const EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\nconst isNullOrEmpty = (value)=>value === null || value === '';\n function initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n style.display = style.display || 'block';\n style.boxSizing = style.boxSizing || 'border-box';\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {\n passive: true\n} : false;\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const { x , y } = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null\n };\n}\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList){\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver((entries)=>{\n let trigger = false;\n for (const entry of entries){\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {\n childList: true,\n subtree: true\n });\n return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver((entries)=>{\n let trigger = false;\n for (const entry of entries){\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {\n childList: true,\n subtree: true\n });\n return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart)=>{\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height)=>{\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n listener();\n }\n }, window);\n const observer = new ResizeObserver((entries)=>{\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event)=>{\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n addListener(canvas, type, proxy);\n return proxy;\n}\n class DomPlatform extends BasePlatform {\n acquireContext(canvas, aspectRatio) {\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n if (context && context.canvas === canvas) {\n initCanvas(canvas, aspectRatio);\n return context;\n }\n return null;\n }\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n const initial = canvas[EXPANDO_KEY].initial;\n [\n 'height',\n 'width'\n ].forEach((prop)=>{\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n const style = initial.style || {};\n Object.keys(style).forEach((key)=>{\n canvas.style[key] = style[key];\n });\n canvas.width = canvas.width;\n delete canvas[EXPANDO_KEY];\n return true;\n }\n addEventListener(chart, type, listener) {\n this.removeEventListener(chart, type);\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n if (!proxy) {\n return;\n }\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n\nfunction _detectPlatform(canvas) {\n if (!_isDomSupported() || typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nclass Element {\n static defaults = {};\n static defaultRoutes = undefined;\n x;\n y;\n active = false;\n options;\n $animations;\n tooltipPosition(useFinalPosition) {\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return {\n x,\n y\n };\n }\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n getProps(props, final) {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this;\n }\n const ret = {};\n props.forEach((prop)=>{\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop];\n });\n return ret;\n }\n}\n\nfunction autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for(i = 0, ilen = numMajorIndices - 1; i < ilen; i++){\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n function calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n const factors = _factorize(evenMajorSpacing);\n for(let i = 0, ilen = factors.length - 1; i < ilen; i++){\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n function getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n function skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n spacing = Math.ceil(spacing);\n for(i = 0; i < ticks.length; i++){\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n function skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n next = start;\n while(next < 0){\n count++;\n next = Math.round(start + count * spacing);\n }\n for(i = Math.max(start, 0); i < end; i++){\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n function getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n if (len < 2) {\n return false;\n }\n for(diff = arr[0], i = 1; i < len; ++i){\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n\nconst reverseAlign = (align)=>align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset)=>edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit)=>Math.min(maxTicksLimit || ticksLength, ticksLength);\n function sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n for(; i < len; i += increment){\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n function getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6;\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n function garbageCollect(caches, length) {\n each(caches, (cache)=>{\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for(i = 0; i < gcLen; ++i){\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n function getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n function getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n return lines * font.lineHeight + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\nfunction titleAlign(align, position, reverse) {\n let ret = _toLeftRightCenter(align);\n if (reverse && position !== 'right' || !reverse && position === 'right') {\n ret = reverseAlign(ret);\n }\n return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n const { top , left , bottom , right , chart } = scale;\n const { chartArea , scales } = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {\n titleX,\n titleY,\n maxWidth,\n rotation\n };\n}\nclass Scale extends Element {\n constructor(cfg){\n super();\n this.id = cfg.id;\n this.type = cfg.type;\n this.options = undefined;\n this.ctx = cfg.ctx;\n this.chart = cfg.chart;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n this.maxWidth = undefined;\n this.maxHeight = undefined;\n this.paddingTop = undefined;\n this.paddingBottom = undefined;\n this.paddingLeft = undefined;\n this.paddingRight = undefined;\n this.axis = undefined;\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n this.ticks = [];\n this._gridLineItems = null;\n this._labelItems = null;\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n this._startPixel = undefined;\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n init(options) {\n this.options = options.setContext(this.getContext());\n this.axis = options.axis;\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n parse(raw, index) {\n return raw;\n }\n getUserBounds() {\n let { _userMin , _userMax , _suggestedMin , _suggestedMax } = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isNumberFinite(_userMin),\n maxDefined: isNumberFinite(_userMax)\n };\n }\n getMinMax(canStack) {\n let { min , max , minDefined , maxDefined } = this.getUserBounds();\n let range;\n if (minDefined && maxDefined) {\n return {\n min,\n max\n };\n }\n const metas = this.getMatchingVisibleMetas();\n for(let i = 0, ilen = metas.length; i < ilen; ++i){\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n getTicks() {\n return this.ticks;\n }\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n beforeUpdate() {\n callback(this.options.beforeUpdate, [\n this\n ]);\n }\n update(maxWidth, maxHeight, margins) {\n const { beginAtZero , grace , ticks: tickOpts } = this.options;\n const sampleSize = tickOpts.sampleSize;\n this.beforeUpdate();\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n this._maxLength = this.isHorizontal() ? this.width + margins.left + margins.right : this.height + margins.top + margins.bottom;\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n this.beforeBuildTicks();\n this.ticks = this.buildTicks() || [];\n this.afterBuildTicks();\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n this.configure();\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation();\n this.afterCalculateLabelRotation();\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n if (samplingEnabled) {\n this._convertTicksToLabels(this.ticks);\n }\n this.beforeFit();\n this.fit();\n this.afterFit();\n this.afterUpdate();\n }\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n afterUpdate() {\n callback(this.options.afterUpdate, [\n this\n ]);\n }\n beforeSetDimensions() {\n callback(this.options.beforeSetDimensions, [\n this\n ]);\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = 0;\n this.bottom = this.height;\n }\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n callback(this.options.afterSetDimensions, [\n this\n ]);\n }\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n callback(this.options[name], [\n this\n ]);\n }\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n beforeTickToLabelConversion() {\n callback(this.options.beforeTickToLabelConversion, [\n this\n ]);\n }\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n tick = ticks[i];\n tick.label = callback(tickOpts.callback, [\n tick.value,\n i,\n ticks\n ], this);\n }\n }\n afterTickToLabelConversion() {\n callback(this.options.afterTickToLabelConversion, [\n this\n ]);\n }\n beforeCalculateLabelRotation() {\n callback(this.options.beforeCalculateLabelRotation, [\n this\n ]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)), Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n callback(this.options.afterCalculateLabelRotation, [\n this\n ]);\n }\n afterAutoSkip() {}\n beforeFit() {\n callback(this.options.beforeFit, [\n this\n ]);\n }\n fit() {\n const minSize = {\n width: 0,\n height: 0\n };\n const { chart , options: { ticks: tickOpts , title: titleOpts , grid: gridOpts } } = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight;\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n if (tickOpts.display && this.ticks.length) {\n const { first , last , widest , highest } = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n if (isHorizontal) {\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n this._handleMargins();\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n _calculatePadding(first, last, sin, cos) {\n const { ticks: { align , padding } , position } = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n afterFit() {\n callback(this.options.afterFit, [\n this\n ]);\n }\n isHorizontal() {\n const { axis , position } = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n isFullSize() {\n return this.options.fullSize;\n }\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n this.generateTickLabels(ticks);\n let i, ilen;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n this.afterTickToLabelConversion();\n }\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n return labelSizes;\n }\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const { ctx , _longestTextCache: caches } = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n for(i = 0; i < length; i += increment){\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {\n data: {},\n gc: []\n };\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n for(j = 0, jlen = label.length; j < jlen; ++j){\n nestedLabel = label[j];\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n const valueAt = (idx)=>({\n width: widths[idx] || 0,\n height: heights[idx] || 0\n });\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights\n };\n }\n getLabelForValue(value) {\n return value;\n }\n getPixelForValue(value, index) {\n return NaN;\n }\n getValueForPixel(pixel) {}\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n getBaseValue() {\n const { min , max } = this;\n return min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0;\n }\n getContext(index) {\n const ticks = this.ticks || [];\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context || (tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context || (this.$context = createScaleContext(this.chart.getContext(), this));\n }\n _tickSize() {\n const optionTicks = this.options.ticks;\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n return this.isHorizontal() ? h * cos > w * sin ? w / cos : h / sin : h * sin < w * cos ? h / cos : w / sin;\n }\n _isVisible() {\n const display = this.options.display;\n if (display !== 'auto') {\n return !!display;\n }\n return this.getMatchingVisibleMetas().length > 0;\n }\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const { grid , position , border } = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for(i = 0; i < ticksLength; i += step){\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n lineValue = getPixelForGridLine(this, i, offset);\n if (lineValue === undefined) {\n continue;\n }\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset\n });\n }\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n return items;\n }\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const { position , ticks: optionTicks } = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const { align , crossAlign , padding , mirror } = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = (chartArea.top + chartArea.bottom) / 2 + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = (chartArea.left + chartArea.right) / 2 - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n const labelSizes = this._getLabelSizes();\n for(i = 0, ilen = ticks.length; i < ilen; ++i){\n tick = ticks[i];\n label = tick.label;\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n if (isHorizontal) {\n x = pixel;\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += lineHeight / 2 * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n let backdrop;\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n switch(textBaseline){\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n }\n switch(textAlign){\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n }\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n color: optsAtIndex.backdropColor\n };\n }\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [\n x,\n y\n ],\n backdrop\n }\n });\n }\n return items;\n }\n _getXAxisLabelAlignment() {\n const { position , ticks } = this.options;\n const rotation = -toRadians(this.labelRotation);\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n let align = 'center';\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n return align;\n }\n _getYAxisLabelAlignment(tl) {\n const { position , ticks: { crossAlign , mirror , padding } } = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n let textAlign;\n let x;\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= widest / 2;\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= widest / 2;\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n return {\n textAlign,\n x\n };\n }\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n const chart = this.chart;\n const position = this.options.position;\n if (position === 'left' || position === 'right') {\n return {\n top: 0,\n left: this.left,\n bottom: chart.height,\n right: this.right\n };\n }\n if (position === 'top' || position === 'bottom') {\n return {\n top: this.top,\n left: 0,\n bottom: this.bottom,\n right: chart.width\n };\n }\n }\n drawBackground() {\n const { ctx , options: { backgroundColor } , left , top , width , height } = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex((t)=>t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n const drawLine = (p1, p2, style)=>{\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n if (grid.display) {\n for(i = 0, ilen = items.length; i < ilen; ++i){\n const item = items[i];\n if (grid.drawOnChartArea) {\n drawLine({\n x: item.x1,\n y: item.y1\n }, {\n x: item.x2,\n y: item.y2\n }, item);\n }\n if (grid.drawTicks) {\n drawLine({\n x: item.tx1,\n y: item.ty1\n }, {\n x: item.tx2,\n y: item.ty2\n }, {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n });\n }\n }\n }\n }\n drawBorder() {\n const { chart , ctx , options: { border , grid } } = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.restore();\n }\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n if (!optionTicks.display) {\n return;\n }\n const ctx = this.ctx;\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n const items = this.getLabelItems(chartArea);\n for (const item of items){\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n if (area) {\n unclipArea(ctx);\n }\n }\n drawTitle() {\n const { ctx , options: { position , title , reverse } } = this;\n if (!title.display) {\n return;\n }\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n const { titleX , titleY , maxWidth , rotation } = titleArgs(this, offset, position, align);\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [\n titleX,\n titleY\n ]\n });\n }\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n return [\n {\n z: tz,\n draw: (chartArea)=>{\n this.draw(chartArea);\n }\n }\n ];\n }\n return [\n {\n z: gz,\n draw: (chartArea)=>{\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n },\n {\n z: bz,\n draw: ()=>{\n this.drawBorder();\n }\n },\n {\n z: tz,\n draw: (chartArea)=>{\n this.drawLabels(chartArea);\n }\n }\n ];\n }\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n for(i = 0, ilen = metas.length; i < ilen; ++i){\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n\nclass TypedRegistry {\n constructor(type, scope, override){\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n if (isIChartComponent(proto)) {\n parentScope = this.register(proto);\n }\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n if (id in items) {\n return scope;\n }\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n return scope;\n }\n get(id) {\n return this.items[id];\n }\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n if (id in items) {\n delete items[id];\n }\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\nfunction registerDefaults(item, scope, parentScope) {\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n defaults.set(scope, itemDefaults);\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach((property)=>{\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [\n scope\n ].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n constructor(){\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n this._typedRegistries = [\n this.controllers,\n this.scales,\n this.elements\n ];\n }\n add(...args) {\n this._each('register', args);\n }\n remove(...args) {\n this._each('unregister', args);\n }\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n _each(method, args, typedRegistry) {\n [\n ...args\n ].forEach((arg)=>{\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || reg === this.plugins && arg.id) {\n this._exec(method, reg, arg);\n } else {\n each(arg, (item)=>{\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n callback(component['before' + camelMethod], [], component);\n registry[method](component);\n callback(component['after' + camelMethod], [], component);\n }\n _getRegistryForType(type) {\n for(let i = 0; i < this._typedRegistries.length; i++){\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n return this.plugins;\n }\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n}\nvar registry = /* #__PURE__ */ new Registry();\n\nclass PluginService {\n constructor(){\n this._init = [];\n }\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n }\n return result;\n }\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors){\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [\n chart,\n args,\n descriptor.options\n ];\n if (callback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n return true;\n }\n invalidate() {\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n const descriptors = this._cache = this._createDescriptors(chart);\n this._notifyStateChanges(chart);\n return descriptors;\n }\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n function allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for(let i = 0; i < keys.length; i++){\n plugins.push(registry.getPlugin(keys[i]));\n }\n const local = config.plugins || [];\n for(let i = 0; i < local.length; i++){\n const plugin = local[i];\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n return {\n plugins,\n localIds\n };\n}\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\nfunction createDescriptors(chart, { plugins , localIds }, options, all) {\n const result = [];\n const context = chart.getContext();\n for (const plugin of plugins){\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {\n plugin,\n local: localIds[id]\n }, opts, context)\n });\n }\n return result;\n}\nfunction pluginOpts(config, { plugin , local }, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [\n ''\n ], {\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n\nfunction getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\nfunction determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions){\n const axis = opts.axis || axisFromPosition(opts.position) || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {\n axis\n };\n }\n}\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d)=>d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {\n scales: {}\n };\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n Object.keys(configScales).forEach((id)=>{\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [\n {\n axis\n },\n scaleConf,\n defaultScaleOptions[axis],\n defaultScaleOptions[defaultId]\n ]);\n });\n config.data.datasets.forEach((dataset)=>{\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach((defaultID)=>{\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [\n {\n axis\n },\n configScales[id],\n defaultScaleOptions[defaultID]\n ]);\n });\n });\n Object.keys(scales).forEach((key)=>{\n const scale = scales[key];\n mergeIf(scale, [\n defaults.scales[scale.type],\n defaults.scale\n ]);\n });\n return scales;\n}\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n initOptions(config);\n return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\nconst addIfFound = (set, obj, key)=>{\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\nclass Config {\n constructor(config){\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n get platform() {\n return this._config.platform;\n }\n get type() {\n return this._config.type;\n }\n set type(type) {\n this._config.type = type;\n }\n get data() {\n return this._config.data;\n }\n set data(data) {\n this._config.data = initData(data);\n }\n get options() {\n return this._config.options;\n }\n set options(options) {\n this._config.options = options;\n }\n get plugins() {\n return this._config.plugins;\n }\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType, ()=>[\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`, ()=>[\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`\n ],\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`, ()=>[\n [\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]\n ]);\n }\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`, ()=>[\n [\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || []\n ]\n ]);\n }\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n getOptionScopes(mainScope, keyLists, resetCache) {\n const { options , type } = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n const scopes = new Set();\n keyLists.forEach((keys)=>{\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach((key)=>addIfFound(scopes, mainScope, key));\n }\n keys.forEach((key)=>addIfFound(scopes, options, key));\n keys.forEach((key)=>addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach((key)=>addIfFound(scopes, defaults, key));\n keys.forEach((key)=>addIfFound(scopes, descriptors, key));\n });\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n chartOptionScopes() {\n const { options , type } = this;\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {},\n {\n type\n },\n defaults,\n descriptors\n ];\n }\n resolveNamedOptions(scopes, names, context, prefixes = [\n ''\n ]) {\n const result = {\n $shared: true\n };\n const { resolver , subPrefixes } = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n for (const prop of names){\n result[prop] = options[prop];\n }\n return result;\n }\n createResolver(scopes, context, prefixes = [\n ''\n ], descriptorDefaults) {\n const { resolver } = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context) ? _attachContext(resolver, context, undefined, descriptorDefaults) : resolver;\n }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter((p)=>!p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\nconst hasFunction = (value)=>isObject(value) && Object.getOwnPropertyNames(value).some((key)=>isFunction(value[key]));\nfunction needContext(proxy, names) {\n const { isScriptable , isIndexable } = _descriptors(proxy);\n for (const prop of names){\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if (scriptable && (isFunction(value) || hasFunction(value)) || indexable && isArray(value)) {\n return true;\n }\n }\n return false;\n}\n\nvar version = \"4.4.7\";\n\nconst KNOWN_POSITIONS = [\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'chartArea'\n];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x';\n}\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1];\n };\n}\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n chart.notifyPlugins('afterRender');\n callback(animationOptions && animationOptions.onComplete, [\n context\n ], chart);\n}\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callback(animationOptions && animationOptions.onProgress, [\n context\n ], chart);\n}\n function getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n item = item[0];\n }\n if (item && item.canvas) {\n item = item.canvas;\n }\n return item;\n}\nconst instances = {};\nconst getChart = (key)=>{\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c)=>c.canvas === canvas).pop();\n};\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys){\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n function determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\nfunction getSizeForArea(scale, chartArea, field) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\nfunction getDatasetArea(meta, chartArea) {\n const { xScale , yScale } = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\nclass Chart {\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n constructor(item, userConfig){\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error('Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' + ' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.');\n }\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce((mode)=>this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n instances[this.id] = this;\n if (!context || !canvas) {\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n get aspectRatio() {\n const { options: { aspectRatio , maintainAspectRatio } , width , height , _aspectRatio } = this;\n if (!isNullOrUndef(aspectRatio)) {\n return aspectRatio;\n }\n if (maintainAspectRatio && _aspectRatio) {\n return _aspectRatio;\n }\n return height ? width / height : null;\n }\n get data() {\n return this.config.data;\n }\n set data(data) {\n this.config.data = data;\n }\n get options() {\n return this._options;\n }\n set options(options) {\n this.config.options = options;\n }\n get registry() {\n return registry;\n }\n _initialize() {\n this.notifyPlugins('beforeInit');\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n this.bindEvents();\n this.notifyPlugins('afterInit');\n return this;\n }\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n stop() {\n animator.stop(this);\n return this;\n }\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {\n width,\n height\n };\n }\n }\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n this.notifyPlugins('resize', {\n size: newSize\n });\n callback(options.onResize, [\n this,\n newSize\n ], this);\n if (this.attached) {\n if (this._doResize(mode)) {\n this.render();\n }\n }\n }\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n each(scalesOptions, (axisOptions, axisID)=>{\n axisOptions.id = axisID;\n });\n }\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id)=>{\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n if (scaleOpts) {\n items = items.concat(Object.keys(scaleOpts).map((id)=>{\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n }));\n }\n each(items, (item)=>{\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n scale.init(scaleOptions, options);\n });\n each(updated, (hasUpdated, id)=>{\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n each(scales, (scale)=>{\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n metasets.sort((a, b)=>a.index - b.index);\n if (numMeta > numData) {\n for(let i = numData; i < numMeta; ++i){\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n _removeUnreferencedMetasets() {\n const { _metasets: metasets , data: { datasets } } = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index)=>{\n if (datasets.filter((x)=>x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n this._removeUnreferencedMetasets();\n for(i = 0, ilen = datasets.length; i < ilen; i++){\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const { datasetElementType , dataElementType } = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n this._updateMetasets();\n return newControllers;\n }\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex)=>{\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n update(mode) {\n const config = this.config;\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n this._plugins.invalidate();\n if (this.notifyPlugins('beforeUpdate', {\n mode,\n cancelable: true\n }) === false) {\n return;\n }\n const newControllers = this.buildOrUpdateControllers();\n this.notifyPlugins('beforeElementsUpdate');\n let minPadding = 0;\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; i++){\n const { controller } = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n if (!animsDisabled) {\n each(newControllers, (controller)=>{\n controller.reset();\n });\n }\n this._updateDatasets(mode);\n this.notifyPlugins('afterUpdate', {\n mode\n });\n this._layers.sort(compare2Level('z', '_idx'));\n const { _active , _lastEvent } = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n this.render();\n }\n _updateScales() {\n each(this.scales, (scale)=>{\n layouts.removeBox(this, scale);\n });\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n this.unbindEvents();\n this.bindEvents();\n }\n }\n _updateHiddenIndices() {\n const { _hiddenIndices } = this;\n const changes = this._getUniformDataChanges() || [];\n for (const { method , start , count } of changes){\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx)=>new Set(_dataChanges.filter((c)=>c[0] === idx).map((c, i)=>i + ',' + c.splice(1).join(',')));\n const changeSet = makeSet(0);\n for(let i = 1; i < datasetCount; i++){\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet).map((c)=>c.split(',')).map((a)=>({\n method: a[1],\n start: +a[2],\n count: +a[3]\n }));\n }\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {\n cancelable: true\n }) === false) {\n return;\n }\n layouts.update(this, this.width, this.height, minPadding);\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n this._layers = [];\n each(this.boxes, (box)=>{\n if (noArea && box.position === 'chartArea') {\n return;\n }\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n this._layers.forEach((item, index)=>{\n item._idx = index;\n });\n this.notifyPlugins('afterLayout');\n }\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {\n mode,\n cancelable: true\n }) === false) {\n return;\n }\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this.getDatasetMeta(i).controller.configure();\n }\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this._updateDataset(i, isFunction(mode) ? mode({\n datasetIndex: i\n }) : mode);\n }\n this.notifyPlugins('afterDatasetsUpdate', {\n mode\n });\n }\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {\n meta,\n index,\n mode,\n cancelable: true\n };\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n meta.controller._update(mode);\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n render() {\n if (this.notifyPlugins('beforeRender', {\n cancelable: true\n }) === false) {\n return;\n }\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({\n chart: this\n });\n }\n }\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const { width , height } = this._resizeBeforeDraw;\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n if (this.notifyPlugins('beforeDraw', {\n cancelable: true\n }) === false) {\n return;\n }\n const layers = this._layers;\n for(i = 0; i < layers.length && layers[i].z <= 0; ++i){\n layers[i].draw(this.chartArea);\n }\n this._drawDatasets();\n for(; i < layers.length; ++i){\n layers[i].draw(this.chartArea);\n }\n this.notifyPlugins('afterDraw');\n }\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n for(i = 0, ilen = metasets.length; i < ilen; ++i){\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n return result;\n }\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {\n cancelable: true\n }) === false) {\n return;\n }\n const metasets = this.getSortedVisibleDatasetMetas();\n for(let i = metasets.length - 1; i >= 0; --i){\n this._drawDataset(metasets[i]);\n }\n this.notifyPlugins('afterDatasetsDraw');\n }\n _drawDataset(meta) {\n const ctx = this.ctx;\n const clip = meta._clip;\n const useClip = !clip.disabled;\n const area = getDatasetArea(meta, this.chartArea);\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n if (useClip) {\n clipArea(ctx, {\n left: clip.left === false ? 0 : area.left - clip.left,\n right: clip.right === false ? this.width : area.right + clip.right,\n top: clip.top === false ? 0 : area.top - clip.top,\n bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n });\n }\n meta.controller.draw();\n if (useClip) {\n unclipArea(ctx);\n }\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n return [];\n }\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter((x)=>x && x._dataset === dataset).pop();\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n return meta;\n }\n getContext() {\n return this.$context || (this.$context = createContext(null, {\n chart: this,\n type: 'chart'\n }));\n }\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n const meta = this.getDatasetMeta(datasetIndex);\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n anims.update(meta, {\n visible\n });\n this.update((ctx)=>ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n for(i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this._destroyDatasetMeta(i);\n }\n }\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const { canvas , ctx } = this;\n this._stop();\n this.config.clearCache();\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n delete instances[this.id];\n this.notifyPlugins('afterDestroy');\n }\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n const _add = (type, listener)=>{\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const listener = (e, x, y)=>{\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n each(this.options.events, (type)=>_add(type, listener));\n }\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n const _add = (type, listener)=>{\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener)=>{\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n const listener = (width, height)=>{\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n let detached;\n const attached = ()=>{\n _remove('attach', attached);\n this.attached = true;\n this.resize();\n _add('resize', listener);\n _add('detach', detached);\n };\n detached = ()=>{\n this.attached = false;\n _remove('resize', listener);\n this._stop();\n this._resize(0, 0);\n _add('attach', attached);\n };\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n unbindEvents() {\n each(this._listeners, (listener, type)=>{\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n each(this._responsiveListeners, (listener, type)=>{\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n for(i = 0, ilen = items.length; i < ilen; ++i){\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({ datasetIndex , index })=>{\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n if (changed) {\n this._active = active;\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter((p)=>p.plugin.id === pluginId).length === 1;\n }\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin)=>(plugin.options.events || this.options.events).includes(e.native.type);\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n const changed = this._handleEvent(e, replay, args.inChartArea);\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n if (changed || args.changed) {\n this.render();\n }\n return this;\n }\n _handleEvent(e, replay, inChartArea) {\n const { _active: lastActive = [] , options } = this;\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n if (inChartArea) {\n this._lastEvent = null;\n callback(options.onHover, [\n e,\n active,\n this\n ], this);\n if (isClick) {\n callback(options.onClick, [\n e,\n active,\n this\n ], this);\n }\n }\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n this._lastEvent = lastEvent;\n return changed;\n }\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n if (!inChartArea) {\n return lastActive;\n }\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart)=>chart._plugins.invalidate());\n}\n\nfunction clipArc(ctx, element, endAngle) {\n const { startAngle , pixelMargin , x , y , outerRadius , innerRadius } = element;\n let angleMargin = pixelMargin / outerRadius;\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, [\n 'outerStart',\n 'outerEnd',\n 'innerStart',\n 'innerEnd'\n ]);\n}\n/**\n * Parse border radius from the provided options\n */ function parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val)=>{\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit)\n };\n}\n/**\n * Convert (r, 𝜃) to (x, y)\n */ function rThetaToXY(r, theta, x, y) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta)\n };\n}\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */ function pathArc(ctx, element, offset, spacing, end, circular) {\n const { x , y , startAngle: start , pixelMargin , innerRadius: innerR } = element;\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n let spacingOffset = 0;\n const alpha = end - start;\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? alpha * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const { outerStart , outerEnd , innerStart , innerEnd } = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n ctx.beginPath();\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2;\n ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true);\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing, circular) {\n const { fullCircles , startAngle , circumference } = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for(let i = 0; i < fullCircles; ++i){\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\nfunction drawBorder(ctx, element, offset, spacing, circular) {\n const { fullCircles , startAngle , circumference , options } = element;\n const { borderWidth , borderJoinStyle , borderDash , borderDashOffset } = options;\n const inner = options.borderAlign === 'inner';\n if (!borderWidth) {\n return;\n }\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for(let i = 0; i < fullCircles; ++i){\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\nclass ArcElement extends Element {\n static id = 'arc';\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n static descriptors = {\n _scriptable: true,\n _indexable: (name)=>name !== 'borderDash'\n };\n circumference;\n endAngle;\n fullCircles;\n innerRadius;\n outerRadius;\n pixelMargin;\n startAngle;\n constructor(cfg){\n super();\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(chartX, chartY, useFinalPosition) {\n const point = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n const { angle , distance } = getAngleFromPoint(point, {\n x: chartX,\n y: chartY\n });\n const { startAngle , endAngle , innerRadius , outerRadius , circumference } = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n return betweenAngles && withinRadius;\n }\n getCenterPoint(useFinalPosition) {\n const { x , y , startAngle , endAngle , innerRadius , outerRadius } = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const { offset , spacing } = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n tooltipPosition(useFinalPosition) {\n return this.getCenterPoint(useFinalPosition);\n }\n draw(ctx) {\n const { options , circumference } = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = options.borderAlign === 'inner' ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n ctx.save();\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n ctx.restore();\n }\n}\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n function getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const { start: paramsStart = 0 , end: paramsEnd = count - 1 } = params;\n const { start: segmentStart , end: segmentEnd } = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n function pathSegment(ctx, line, segment, params) {\n const { points , options } = line;\n const { count , start , loop , ilen } = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n let { move =true , reverse } = params || {};\n let i, point, prev;\n for(i = 0; i <= ilen; ++i){\n point = points[(start + (reverse ? ilen - i : i)) % count];\n if (point.skip) {\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n prev = point;\n }\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n return !!loop;\n}\n function fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const { count , start , ilen } = pathVars(points, segment, params);\n const { move =true , reverse } = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n const pointIndex = (index)=>(start + (reverse ? ilen - index : index)) % count;\n const drawX = ()=>{\n if (minY !== maxY) {\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n ctx.lineTo(avgX, lastY);\n }\n };\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n for(i = 0; i <= ilen; ++i){\n point = points[pointIndex(i)];\n if (point.skip) {\n continue;\n }\n const x = point.x;\n const y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n ctx.lineTo(x, y);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n lastY = y;\n }\n drawX();\n}\n function _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n function _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n const { segments , options } = line;\n const segmentMethod = _getSegmentMethod(line);\n for (const segment of segments){\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {\n start,\n end: start + count - 1\n })) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\nclass LineElement extends Element {\n static id = 'line';\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n static descriptors = {\n _scriptable: true,\n _indexable: (name)=>name !== 'borderDash' && name !== 'fill'\n };\n constructor(cfg){\n super();\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n get points() {\n return this._points;\n }\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {\n property,\n start: value,\n end: value\n });\n if (!segments.length) {\n return;\n }\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for(i = 0, ilen = segments.length; i < ilen; ++i){\n const { start , end } = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n start = start || 0;\n count = count || this.points.length - start;\n for (const segment of segments){\n loop &= segmentMethod(ctx, this, segment, {\n start,\n end: start + count - 1\n });\n }\n return !!loop;\n }\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n if (points.length && options.borderWidth) {\n ctx.save();\n draw(ctx, this, start, count);\n ctx.restore();\n }\n if (this.animated) {\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n const options = el.options;\n const { [axis]: value } = el.getProps([\n axis\n ], useFinalPosition);\n return Math.abs(pos - value) < options.radius + options.hitRadius;\n}\nclass PointElement extends Element {\n static id = 'point';\n parsed;\n skip;\n stop;\n /**\n * @type {any}\n */ static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n /**\n * @type {any}\n */ static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n constructor(cfg){\n super();\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n const options = this.options;\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2) < Math.pow(options.hitRadius + options.radius, 2);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange$1(this, mouseX, 'x', useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange$1(this, mouseY, 'y', useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return {\n x,\n y\n };\n }\n size(options) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n draw(ctx, area) {\n const options = this.options;\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n\nfunction getBarBounds(bar, useFinalPosition) {\n const { x , y , base , width , height } = bar.getProps([\n 'x',\n 'y',\n 'base',\n 'width',\n 'height'\n ], useFinalPosition);\n let left, right, top, bottom, half;\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n return {\n left,\n top,\n right,\n bottom\n };\n}\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n const { enableBorderRadius } = bar.getProps([\n 'enableBorderRadius'\n ]);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n const enableBorder = enableBorderRadius || isObject(value);\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r))\n }\n }\n };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n return bounds && (skipX || _isBetween(x, bounds.left, bounds.right)) && (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n function addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\nclass BarElement extends Element {\n static id = 'bar';\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n constructor(cfg){\n super();\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n draw(ctx) {\n const { inflateAmount , options: { borderColor , backgroundColor } } = this;\n const { inner , outer } = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n ctx.save();\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const { x , y , base , horizontal } = this.getProps([\n 'x',\n 'y',\n 'base',\n 'horizontal'\n ], useFinalPosition);\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nBarElement: BarElement,\nLineElement: LineElement,\nPointElement: PointElement\n});\n\nconst BORDER_COLORS = [\n 'rgb(54, 162, 235)',\n 'rgb(255, 99, 132)',\n 'rgb(255, 159, 64)',\n 'rgb(255, 205, 86)',\n 'rgb(75, 192, 192)',\n 'rgb(153, 102, 255)',\n 'rgb(201, 203, 207)' // grey\n];\n// Border colors with 50% transparency\nconst BACKGROUND_COLORS = /* #__PURE__ */ BORDER_COLORS.map((color)=>color.replace('rgb(', 'rgba(').replace(')', ', 0.5)'));\nfunction getBorderColor(i) {\n return BORDER_COLORS[i % BORDER_COLORS.length];\n}\nfunction getBackgroundColor(i) {\n return BACKGROUND_COLORS[i % BACKGROUND_COLORS.length];\n}\nfunction colorizeDefaultDataset(dataset, i) {\n dataset.borderColor = getBorderColor(i);\n dataset.backgroundColor = getBackgroundColor(i);\n return ++i;\n}\nfunction colorizeDoughnutDataset(dataset, i) {\n dataset.backgroundColor = dataset.data.map(()=>getBorderColor(i++));\n return i;\n}\nfunction colorizePolarAreaDataset(dataset, i) {\n dataset.backgroundColor = dataset.data.map(()=>getBackgroundColor(i++));\n return i;\n}\nfunction getColorizer(chart) {\n let i = 0;\n return (dataset, datasetIndex)=>{\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n if (controller instanceof DoughnutController) {\n i = colorizeDoughnutDataset(dataset, i);\n } else if (controller instanceof PolarAreaController) {\n i = colorizePolarAreaDataset(dataset, i);\n } else if (controller) {\n i = colorizeDefaultDataset(dataset, i);\n }\n };\n}\nfunction containsColorsDefinitions(descriptors) {\n let k;\n for(k in descriptors){\n if (descriptors[k].borderColor || descriptors[k].backgroundColor) {\n return true;\n }\n }\n return false;\n}\nfunction containsColorsDefinition(descriptor) {\n return descriptor && (descriptor.borderColor || descriptor.backgroundColor);\n}\nfunction containsDefaultColorsDefenitions() {\n return defaults.borderColor !== 'rgba(0,0,0,0.1)' || defaults.backgroundColor !== 'rgba(0,0,0,0.1)';\n}\nvar plugin_colors = {\n id: 'colors',\n defaults: {\n enabled: true,\n forceOverride: false\n },\n beforeLayout (chart, _args, options) {\n if (!options.enabled) {\n return;\n }\n const { data: { datasets } , options: chartOptions } = chart.config;\n const { elements } = chartOptions;\n const containsColorDefenition = containsColorsDefinitions(datasets) || containsColorsDefinition(chartOptions) || elements && containsColorsDefinitions(elements) || containsDefaultColorsDefenitions();\n if (!options.forceOverride && containsColorDefenition) {\n return;\n }\n const colorizer = getColorizer(chart);\n datasets.forEach(colorizer);\n }\n};\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n const samples = options.samples || availableWidth;\n if (samples >= count) {\n return data.slice(start, start + count);\n }\n const decimated = [];\n const bucketWidth = (count - 2) / (samples - 2);\n let sampledIndex = 0;\n const endIndex = start + count - 1;\n let a = start;\n let i, maxAreaPoint, maxArea, area, nextA;\n decimated[sampledIndex++] = data[a];\n for(i = 0; i < samples - 2; i++){\n let avgX = 0;\n let avgY = 0;\n let j;\n const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n for(j = avgRangeStart; j < avgRangeEnd; j++){\n avgX += data[j].x;\n avgY += data[j].y;\n }\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n const { x: pointAx , y: pointAy } = data[a];\n maxArea = area = -1;\n for(j = rangeOffs; j < rangeTo; j++){\n area = 0.5 * Math.abs((pointAx - avgX) * (data[j].y - pointAy) - (pointAx - data[j].x) * (avgY - pointAy));\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n decimated[sampledIndex++] = maxAreaPoint;\n a = nextA;\n }\n decimated[sampledIndex++] = data[endIndex];\n return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n let avgX = 0;\n let countX = 0;\n let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n const decimated = [];\n const endIndex = start + count - 1;\n const xMin = data[start].x;\n const xMax = data[endIndex].x;\n const dx = xMax - xMin;\n for(i = start; i < start + count; ++i){\n point = data[i];\n x = (point.x - xMin) / dx * availableWidth;\n y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n minIndex = i;\n } else if (y > maxY) {\n maxY = y;\n maxIndex = i;\n }\n avgX = (countX * avgX + point.x) / ++countX;\n } else {\n const lastIndex = i - 1;\n if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n const intermediateIndex1 = Math.min(minIndex, maxIndex);\n const intermediateIndex2 = Math.max(minIndex, maxIndex);\n if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex1],\n x: avgX\n });\n }\n if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex2],\n x: avgX\n });\n }\n }\n if (i > 0 && lastIndex !== startIndex) {\n decimated.push(data[lastIndex]);\n }\n decimated.push(point);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n minIndex = maxIndex = startIndex = i;\n }\n }\n return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n if (dataset._decimated) {\n const data = dataset._data;\n delete dataset._decimated;\n delete dataset._data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n writable: true,\n value: data\n });\n }\n}\nfunction cleanDecimatedData(chart) {\n chart.data.datasets.forEach((dataset)=>{\n cleanDecimatedDataset(dataset);\n });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n const pointCount = points.length;\n let start = 0;\n let count;\n const { iScale } = meta;\n const { min , max , minDefined , maxDefined } = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n return {\n start,\n count\n };\n}\nvar plugin_decimation = {\n id: 'decimation',\n defaults: {\n algorithm: 'min-max',\n enabled: false\n },\n beforeElementsUpdate: (chart, args, options)=>{\n if (!options.enabled) {\n cleanDecimatedData(chart);\n return;\n }\n const availableWidth = chart.width;\n chart.data.datasets.forEach((dataset, datasetIndex)=>{\n const { _data , indexAxis } = dataset;\n const meta = chart.getDatasetMeta(datasetIndex);\n const data = _data || dataset.data;\n if (resolve([\n indexAxis,\n chart.options.indexAxis\n ]) === 'y') {\n return;\n }\n if (!meta.controller.supportsDecimation) {\n return;\n }\n const xAxis = chart.scales[meta.xAxisID];\n if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n return;\n }\n if (chart.options.parsing) {\n return;\n }\n let { start , count } = getStartAndCountOfVisiblePointsSimplified(meta, data);\n const threshold = options.threshold || 4 * availableWidth;\n if (count <= threshold) {\n cleanDecimatedDataset(dataset);\n return;\n }\n if (isNullOrUndef(_data)) {\n dataset._data = data;\n delete dataset.data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this._decimated;\n },\n set: function(d) {\n this._data = d;\n }\n });\n }\n let decimated;\n switch(options.algorithm){\n case 'lttb':\n decimated = lttbDecimation(data, start, count, availableWidth, options);\n break;\n case 'min-max':\n decimated = minMaxDecimation(data, start, count, availableWidth);\n break;\n default:\n throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n }\n dataset._decimated = decimated;\n });\n },\n destroy (chart) {\n cleanDecimatedData(chart);\n }\n};\n\nfunction _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n for (const segment of segments){\n let { start , end } = segment;\n end = _findSegmentEnd(start, end, points);\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n if (!target.segments) {\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n const targetSegments = _boundSegments(target, bounds);\n for (const tgt of targetSegments){\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n for (const fillSource of fillSources){\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\nfunction _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {\n property,\n start,\n end\n };\n}\nfunction _pointsFromSegments(boundary, line) {\n const { x =null , y =null } = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({ start , end })=>{\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({\n x: first.x,\n y\n });\n points.push({\n x: last.x,\n y\n });\n } else if (x !== null) {\n points.push({\n x,\n y: first.y\n });\n points.push({\n x,\n y: last.y\n });\n }\n });\n return points;\n}\nfunction _findSegmentEnd(start, end, points) {\n for(; end > start; end--){\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n\nfunction _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n if (isArray(boundary)) {\n _loop = true;\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n return points.length ? new LineElement({\n points,\n options: {\n tension: 0\n },\n _loop,\n _fullLoop: _loop\n }) : null;\n}\nfunction _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n\nfunction _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [\n index\n ];\n let target;\n if (!propagate) {\n return fill;\n }\n while(fill !== false && visited.indexOf(fill) === -1){\n if (!isNumberFinite(fill)) {\n return fill;\n }\n target = sources[fill];\n if (!target) {\n return false;\n }\n if (target.visible) {\n return fill;\n }\n visited.push(fill);\n fill = target.fill;\n }\n return false;\n}\n function _decodeFill(line, index, count) {\n const fill = parseFillOption(line);\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n let target = parseFloat(fill);\n if (isNumberFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n return [\n 'origin',\n 'start',\n 'end',\n 'stack',\n 'shape'\n ].indexOf(fill) >= 0 && fill;\n}\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n return target;\n}\n function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n function _getTargetValue(fill, scale, startValue) {\n let value;\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n function parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n if (fill === false || fill === null) {\n return false;\n }\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n\nfunction _buildStackLine(source) {\n const { scale , index , line } = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({\n x: null,\n y: scale.bottom\n }, line));\n for(let i = 0; i < segments.length; i++){\n const segment = segments[i];\n for(let j = segment.start; j <= segment.end; j++){\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({\n points,\n options: {}\n });\n}\n function getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n for(let i = 0; i < metas.length; i++){\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n function addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for(let j = 0; j < linesBelow.length; j++){\n const line = linesBelow[j];\n const { first , last , point } = findPoint(line, sourcePoint, 'x');\n if (!point || first && last) {\n continue;\n }\n if (first) {\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n break;\n }\n }\n }\n points.push(...postponed);\n}\n function findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for(let i = 0; i < segments.length; i++){\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {\n first,\n last,\n point\n };\n}\n\nclass simpleArc {\n constructor(opts){\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n pathSegment(ctx, bounds, opts) {\n const { x , y , radius } = this;\n bounds = bounds || {\n start: 0,\n end: TAU\n };\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n interpolate(point) {\n const { x , y , radius } = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n\nfunction _getTarget(source) {\n const { chart , fill , line } = source;\n if (isNumberFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n if (fill === 'shape') {\n return true;\n }\n const boundary = computeBoundary(source);\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n return _createBoundaryLine(boundary, line);\n}\n function getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\nfunction computeLinearBoundary(source) {\n const { scale ={} , fill } = source;\n const pixel = _getTargetPixel(fill, scale);\n if (isNumberFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n return null;\n}\nfunction computeCircularBoundary(source) {\n const { scale , fill } = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n for(let i = 0; i < length; ++i){\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\nfunction _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const { line , scale , axis } = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const { above =color , below =color } = fillOption || {};\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {\n line,\n target,\n above,\n below,\n area,\n scale,\n axis\n });\n unclipArea(ctx);\n }\n}\nfunction doFill(ctx, cfg) {\n const { line , target , above , below , area , scale } = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n ctx.save();\n if (property === 'x' && below !== above) {\n clipVertical(ctx, target, area.top);\n fill(ctx, {\n line,\n target,\n color: above,\n scale,\n property\n });\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n }\n fill(ctx, {\n line,\n target,\n color: below,\n scale,\n property\n });\n ctx.restore();\n}\nfunction clipVertical(ctx, target, clipY) {\n const { segments , points } = target;\n let first = true;\n let lineLoop = false;\n ctx.beginPath();\n for (const segment of segments){\n const { start , end } = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {\n move: lineLoop\n });\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\nfunction fill(ctx, cfg) {\n const { line , target , property , color , scale } = cfg;\n const segments = _segments(line, target, property);\n for (const { source: src , target: tgt , start , end } of segments){\n const { style: { backgroundColor =color } = {} } = src;\n const notShape = target !== true;\n ctx.save();\n ctx.fillStyle = backgroundColor;\n clipBounds(ctx, scale, notShape && _getBounds(property, start, end));\n ctx.beginPath();\n const lineLoop = !!line.pathSegment(ctx, src);\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n const targetLoop = !!target.pathSegment(ctx, tgt, {\n move: lineLoop,\n reverse: true\n });\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n ctx.restore();\n }\n}\nfunction clipBounds(ctx, scale, bounds) {\n const { top , bottom } = scale.chart.chartArea;\n const { property , start , end } = bounds || {};\n if (property === 'x') {\n ctx.beginPath();\n ctx.rect(start, top, end - start, bottom - top);\n ctx.clip();\n }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\nvar index = {\n id: 'filler',\n afterDatasetsUpdate (chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n for(i = 0; i < count; ++i){\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line\n };\n }\n meta.$filler = source;\n sources.push(source);\n }\n for(i = 0; i < count; ++i){\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n beforeDraw (chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for(let i = metasets.length - 1; i >= 0; --i){\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n beforeDatasetsDraw (chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n const metasets = chart.getSortedVisibleDatasetMetas();\n for(let i = metasets.length - 1; i >= 0; --i){\n const source = metasets[i].$filler;\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n beforeDatasetDraw (chart, args, options) {\n const source = args.meta.$filler;\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n\nconst getBoxSize = (labelOpts, fontSize)=>{\n let { boxHeight =fontSize , boxWidth =fontSize } = labelOpts;\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\nconst itemsEqual = (a, b)=>a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n constructor(config){\n super();\n this._added = false;\n this.legendHitBoxes = [];\n this._hoveredItem = null;\n this.doughnutMode = false;\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = callback(labelOpts.generateLabels, [\n this.chart\n ], this) || [];\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item)=>labelOpts.filter(item, this.chart.data));\n }\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b)=>labelOpts.sort(a, b, this.chart.data));\n }\n if (this.options.reverse) {\n legendItems.reverse();\n }\n this.legendItems = legendItems;\n }\n fit() {\n const { options , ctx } = this;\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const { boxWidth , itemHeight } = getBoxSize(labelOpts, fontSize);\n let width, height;\n ctx.font = labelFont.string;\n if (this.isHorizontal()) {\n width = this.maxWidth;\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight;\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const { ctx , maxWidth , options: { labels: { padding } } } = this;\n const hitboxes = this.legendHitBoxes = [];\n const lineWidths = this.lineWidths = [\n 0\n ];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i)=>{\n const itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n hitboxes[i] = {\n left: 0,\n top,\n row,\n width: itemWidth,\n height: itemHeight\n };\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n return totalHeight;\n }\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const { ctx , maxHeight , options: { labels: { padding } } } = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n let left = 0;\n let col = 0;\n this.legendItems.forEach((legendItem, i)=>{\n const { itemWidth , itemHeight } = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({\n width: currentColWidth,\n height: currentColHeight\n });\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n hitboxes[i] = {\n left,\n top: currentColHeight,\n col,\n width: itemWidth,\n height: itemHeight\n };\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n totalWidth += currentColWidth;\n columnSizes.push({\n width: currentColWidth,\n height: currentColHeight\n });\n return totalWidth;\n }\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const { legendHitBoxes: hitboxes , options: { align , labels: { padding } , rtl } } = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes){\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes){\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n this._draw();\n unclipArea(ctx);\n }\n }\n _draw() {\n const { options: opts , columnSizes , lineWidths , ctx } = this;\n const { align , labels: labelOpts } = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const { padding } = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n this.drawTitle();\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n const { boxWidth , boxHeight , itemHeight } = getBoxSize(labelOpts, fontSize);\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n ctx.save();\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n if (labelOpts.usePointStyle) {\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n ctx.beginPath();\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n ctx.restore();\n };\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + itemHeight / 2, labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n overrideTextDirection(this.ctx, opts.textDirection);\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i)=>{\n ctx.strokeStyle = legendItem.fontColor;\n ctx.fillStyle = legendItem.fontColor;\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n rtlHelper.setWidth(this.width);\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n const realX = rtlHelper.x(x);\n drawLegendBox(realX, y, legendItem);\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n fillText(rtlHelper.x(x), y, legendItem);\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n if (!titleOpts.display) {\n return;\n }\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n let left = this.left;\n let maxWidth = this.width;\n if (this.isHorizontal()) {\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n const maxHeight = this.columnSizes.reduce((acc, size)=>Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n const x = _alignStartEnd(position, left, left + maxWidth);\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n if (_isBetween(x, this.left, this.right) && _isBetween(y, this.top, this.bottom)) {\n lh = this.legendHitBoxes;\n for(i = 0; i < lh.length; ++i){\n hitBox = lh[i];\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width) && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n return this.legendItems[i];\n }\n }\n }\n return null;\n }\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n callback(opts.onLeave, [\n e,\n previous,\n this\n ], this);\n }\n this._hoveredItem = hoveredItem;\n if (hoveredItem && !sameItem) {\n callback(opts.onHover, [\n e,\n hoveredItem,\n this\n ], this);\n }\n } else if (hoveredItem) {\n callback(opts.onClick, [\n e,\n hoveredItem,\n this\n ], this);\n }\n }\n}\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {\n itemWidth,\n itemHeight\n };\n}\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b)=>a.length > b.length ? a : b);\n }\n return boxWidth + labelFont.size / 2 + ctx.measureText(legendItemText).width;\n}\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\nvar plugin_legend = {\n id: 'legend',\n _element: Legend,\n start (chart, _args, options) {\n const legend = chart.legend = new Legend({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n stop (chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n beforeUpdate (chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n afterUpdate (chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n afterEvent (chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n onClick (e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n onHover: null,\n onLeave: null,\n labels: {\n color: (ctx)=>ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n generateLabels (chart) {\n const datasets = chart.data.datasets;\n const { labels: { usePointStyle , pointStyle , textAlign , color , useBorderRadius , borderRadius } } = chart.legend.options;\n return chart._getSortedDatasetMetas().map((meta)=>{\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n title: {\n color: (ctx)=>ctx.chart.options.color,\n display: false,\n position: 'center',\n text: ''\n }\n },\n descriptors: {\n _scriptable: (name)=>!name.startsWith('on'),\n labels: {\n _scriptable: (name)=>![\n 'generateLabels',\n 'filter',\n 'sort'\n ].includes(name)\n }\n }\n};\n\nclass Title extends Element {\n constructor(config){\n super();\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this._padding = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight) {\n const opts = this.options;\n this.left = 0;\n this.top = 0;\n if (!opts.display) {\n this.width = this.height = this.right = this.bottom = 0;\n return;\n }\n this.width = this.right = maxWidth;\n this.height = this.bottom = maxHeight;\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n this._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n if (this.isHorizontal()) {\n this.height = textSize;\n } else {\n this.width = textSize;\n }\n }\n isHorizontal() {\n const pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n }\n _drawArgs(offset) {\n const { top , left , bottom , right , options } = this;\n const align = options.align;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n if (this.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n if (options.position === 'left') {\n titleX = left + offset;\n titleY = _alignStartEnd(align, bottom, top);\n rotation = PI * -0.5;\n } else {\n titleX = right - offset;\n titleY = _alignStartEnd(align, top, bottom);\n rotation = PI * 0.5;\n }\n maxWidth = bottom - top;\n }\n return {\n titleX,\n titleY,\n maxWidth,\n rotation\n };\n }\n draw() {\n const ctx = this.ctx;\n const opts = this.options;\n if (!opts.display) {\n return;\n }\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + this._padding.top;\n const { titleX , titleY , maxWidth , rotation } = this._drawArgs(offset);\n renderText(ctx, opts.text, 0, 0, fontOpts, {\n color: opts.color,\n maxWidth,\n rotation,\n textAlign: _toLeftRightCenter(opts.align),\n textBaseline: 'middle',\n translation: [\n titleX,\n titleY\n ]\n });\n }\n}\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\nvar plugin_title = {\n id: 'title',\n _element: Title,\n start (chart, _args, options) {\n createTitle(chart, options);\n },\n stop (chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n beforeUpdate (chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'bold'\n },\n fullSize: true,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false\n }\n};\n\nconst map = new WeakMap();\nvar plugin_subtitle = {\n id: 'subtitle',\n start (chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n stop (chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n beforeUpdate (chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal'\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false\n }\n};\n\nconst positioners = {\n average (items) {\n if (!items.length) {\n return false;\n }\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n for(i = 0, len = items.length; i < len; ++i){\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n const xAverage = [\n ...xSet\n ].reduce((a, b)=>a + b) / xSet.size;\n return {\n x: xAverage,\n y: y / count\n };\n },\n nearest (items, eventPosition) {\n if (!items.length) {\n return false;\n }\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n for(i = 0, len = items.length; i < len; ++i){\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n return {\n x,\n y\n };\n }\n};\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n return base;\n}\n function splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n function createTooltipItem(chart, item) {\n const { element , datasetIndex , index } = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const { label , value } = controller.getLabelAndValue(index);\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n function getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const { body , footer , title } = tooltip;\n const { boxWidth , boxHeight } = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n let combinedBodyLength = body.reduce((count, bodyItem)=>count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight + (titleLineCount - 1) * options.titleSpacing + options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight + (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight + (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop + footerLineCount * footerFont.lineHeight + (footerLineCount - 1) * options.footerSpacing;\n }\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n ctx.save();\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n widthPadding = options.displayColors ? boxWidth + 2 + options.boxPadding : 0;\n each(body, (bodyItem)=>{\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n widthPadding = 0;\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n ctx.restore();\n width += padding.width;\n return {\n width,\n height\n };\n}\nfunction determineYAlign(chart, size) {\n const { y , height } = size;\n if (y < height / 2) {\n return 'top';\n } else if (y > chart.height - height / 2) {\n return 'bottom';\n }\n return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const { x , width } = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n const { x , width } = size;\n const { width: chartWidth , chartArea: { left , right } } = chart;\n let xAlign = 'center';\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n return xAlign;\n}\n function determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\nfunction alignX(size, xAlign) {\n let { x , width } = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= width / 2;\n }\n return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n let { y , height } = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= height / 2;\n }\n return y;\n}\n function getBackgroundPoint(options, size, alignment, chart) {\n const { caretSize , caretPadding , cornerRadius } = options;\n const { xAlign , yAlign } = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(cornerRadius);\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n return align === 'center' ? tooltip.x + tooltip.width / 2 : align === 'right' ? tooltip.x + tooltip.width - padding.right : tooltip.x + padding.left;\n}\n function getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\nconst defaultCallbacks = {\n beforeTitle: noop,\n title (tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n return '';\n },\n afterTitle: noop,\n beforeBody: noop,\n beforeLabel: noop,\n label (tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n let label = tooltipItem.dataset.label || '';\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor (tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0\n };\n },\n labelTextColor () {\n return this.options.bodyColor;\n },\n labelPointStyle (tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation\n };\n },\n afterLabel: noop,\n afterBody: noop,\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n function invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n return result;\n}\nclass Tooltip extends Element {\n static positioners = positioners;\n constructor(config){\n super();\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n if (cached) {\n return cached;\n }\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n return animations;\n }\n getContext() {\n return this.$context || (this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n getTitle(context, options) {\n const { callbacks } = options;\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n return lines;\n }\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems));\n }\n getBody(tooltipItems, options) {\n const { callbacks } = options;\n const bodyItems = [];\n each(tooltipItems, (context)=>{\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n bodyItems.push(bodyItem);\n });\n return bodyItems;\n }\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems));\n }\n getFooter(tooltipItems, options) {\n const { callbacks } = options;\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n return lines;\n }\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n for(i = 0, len = active.length; i < len; ++i){\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array)=>options.filter(element, index, array, data));\n }\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b)=>options.itemSort(a, b, data));\n }\n each(tooltipItems, (context)=>{\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n if (changed && options.external) {\n options.external.call(this, {\n chart: this.chart,\n tooltip: this,\n replay\n });\n }\n }\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n getCaretPosition(tooltipPoint, size, options) {\n const { xAlign , yAlign } = this;\n const { caretSize , cornerRadius } = options;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(cornerRadius);\n const { x: ptX , y: ptY } = tooltipPoint;\n const { width , height } = size;\n let x1, x2, x3, y1, y2, y3;\n if (yAlign === 'center') {\n y2 = ptY + height / 2;\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {\n x1,\n x2,\n x3,\n y1,\n y2,\n y3\n };\n }\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, options.titleAlign, options);\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n for(i = 0; i < length; ++i){\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing;\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing;\n }\n }\n }\n }\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const { boxHeight , boxWidth } = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2,\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : labelColor.borderWidth || 1;\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius\n });\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius\n });\n ctx.fill();\n } else {\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n ctx.fillStyle = this.labelTextColors[i];\n }\n drawBody(pt, ctx, options) {\n const { body } = this;\n const { bodySpacing , bodyAlign , displayColors , boxHeight , boxWidth , boxPadding } = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right' ? bodyAlign === 'center' ? boxWidth / 2 + boxPadding : boxWidth + 2 + boxPadding : 0;\n for(i = 0, ilen = body.length; i < ilen; ++i){\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n lines = bodyItem.lines;\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n for(j = 0, jlen = lines.length; j < jlen; ++j){\n fillLineOfText(lines[j]);\n bodyLineHeight = bodyFont.lineHeight;\n }\n each(bodyItem.after, fillLineOfText);\n }\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing;\n }\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n footerFont = toFont(options.footerFont);\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n for(i = 0; i < length; ++i){\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n drawBackground(pt, ctx, tooltipSize, options) {\n const { xAlign , yAlign } = this;\n const { x , y } = pt;\n const { width , height } = tooltipSize;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(options.cornerRadius);\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n _willRender() {\n return !!this.opacity;\n }\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n if (!opacity) {\n return;\n }\n this._updateAnimationTarget(options);\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n const padding = toPadding(options.padding);\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n this.drawBackground(pt, ctx, tooltipSize, options);\n overrideTextDirection(ctx, options.textDirection);\n pt.y += padding.top;\n this.drawTitle(pt, ctx, options);\n this.drawBody(pt, ctx, options);\n this.drawFooter(pt, ctx, options);\n restoreTextDirection(ctx, options.textDirection);\n ctx.restore();\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({ datasetIndex , index })=>{\n const meta = this.chart.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n const positionChanged = this._positionChanged(active, e);\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n if (changed) {\n this._active = active;\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n this.update(true, replay);\n }\n }\n return changed;\n }\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n if (e.type === 'mouseout') {\n return [];\n }\n if (!inChartArea) {\n return lastActive.filter((i)=>this.chart.data.datasets[i.datasetIndex] && this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined);\n }\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n if (options.reverse) {\n active.reverse();\n }\n return active;\n }\n _positionChanged(active, e) {\n const { caretX , caretY , options } = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\nvar plugin_tooltip = {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n afterInit (chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({\n chart,\n options\n });\n }\n },\n beforeUpdate (chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n reset (chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n afterDraw (chart) {\n const tooltip = chart.tooltip;\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n if (chart.notifyPlugins('beforeTooltipDraw', {\n ...args,\n cancelable: true\n }) === false) {\n return;\n }\n tooltip.draw(chart.ctx);\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n afterEvent (chart, args) {\n if (chart.tooltip) {\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n args.changed = true;\n }\n }\n },\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold'\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {},\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold'\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts)=>opts.bodyFont.size,\n boxWidth: (ctx, opts)=>opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart'\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'width',\n 'height',\n 'caretX',\n 'caretY'\n ]\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n descriptors: {\n _scriptable: (name)=>name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n additionalOptionScopes: [\n 'interaction'\n ]\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nColors: plugin_colors,\nDecimation: plugin_decimation,\nFiller: index,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index, addedLabels)=>{\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({\n index,\n label: raw\n });\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\nconst validIndex = (index, max)=>index === null ? null : _limitValue(Math.round(index), 0, max);\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\nclass CategoryScale extends Scale {\n static id = 'category';\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n constructor(cfg){\n super(cfg);\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const { index , label } of added){\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n determineDataLimits() {\n const { minDefined , maxDefined } = this.getUserBounds();\n let { min , max } = this.getMinMax(true);\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n labels = min === 0 && max === labels.length - 1 ? labels : labels.slice(min, max + 1);\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n for(let value = min; value <= max; value++){\n ticks.push({\n value\n });\n }\n return ticks;\n }\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n configure() {\n super.configure();\n if (!this.isHorizontal()) {\n this._reversePixels = !this._reversePixels;\n }\n }\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n getBasePixel() {\n return this.bottom;\n }\n}\n\nfunction generateTicks$1(generationOptions, dataRange) {\n const ticks = [];\n const MIN_SPACING = 1e-14;\n const { bounds , step , min , max , precision , count , maxTicks , maxDigits , includeBounds } = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const { min: rmin , max: rmax } = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [\n {\n value: rmin\n },\n {\n value: rmax\n }\n ];\n }\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n if (!isNullOrUndef(precision)) {\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n numSpaces = (niceMax - niceMin) / spacing;\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n const decimalPlaces = Math.max(_decimalPlaces(spacing), _decimalPlaces(niceMin));\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({\n value: min\n });\n if (niceMin < min) {\n j++;\n }\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n for(; j < numSpaces; ++j){\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({\n value: tickValue\n });\n }\n if (maxDefined && includeBounds && niceMax !== max) {\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({\n value: max\n });\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({\n value: niceMax\n });\n }\n return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, { horizontal , minRotation }) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n constructor(cfg){\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._endValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n return +raw;\n }\n handleTickRangeOptions() {\n const { beginAtZero } = this.options;\n const { minDefined , maxDefined } = this.getUserBounds();\n let { min , max } = this;\n const setMin = (v)=>min = minDefined ? min : v;\n const setMax = (v)=>max = maxDefined ? max : v;\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n setMax(max + offset);\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n getTickLimit() {\n const tickOpts = this.options.ticks;\n let { maxTicksLimit , stepSize } = tickOpts;\n let maxTicks;\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n return maxTicks;\n }\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n super.configure();\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n\nclass LinearScale extends LinearScaleBase {\n static id = 'linear';\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n determineDataLimits() {\n const { min , max } = this.getMinMax(true);\n this.min = isNumberFinite(min) ? min : 0;\n this.max = isNumberFinite(max) ? max : 1;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n\nconst log10Floor = (v)=>Math.floor(log10(v));\nconst changeExponent = (v, m)=>Math.pow(10, log10Floor(v) + m);\nfunction isMajor(tickVal) {\n const remain = tickVal / Math.pow(10, log10Floor(tickVal));\n return remain === 1;\n}\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while(steps(min, max, rangeExp) > 10){\n rangeExp++;\n }\n while(steps(min, max, rangeExp) < 10){\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n function generateTicks(generationOptions, { min , max }) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while(value < max){\n ticks.push({\n value,\n major: isMajor(value),\n significand\n });\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({\n value: lastTick,\n major: isMajor(lastTick),\n significand\n });\n return ticks;\n}\nclass LogarithmicScale extends Scale {\n static id = 'logarithmic';\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n constructor(cfg){\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [\n raw,\n index\n ]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isNumberFinite(value) && value > 0 ? value : null;\n }\n determineDataLimits() {\n const { min , max } = this.getMinMax(true);\n this.min = isNumberFinite(min) ? Math.max(0, min) : null;\n this.max = isNumberFinite(max) ? Math.max(0, max) : null;\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n if (this._zero && this.min !== this._suggestedMin && !isNumberFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n this.handleTickRangeOptions();\n }\n handleTickRangeOptions() {\n const { minDefined , maxDefined } = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n const setMin = (v)=>min = minDefined ? min : v;\n const setMax = (v)=>max = maxDefined ? max : v;\n if (min === max) {\n if (min <= 0) {\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n setMax(changeExponent(min, +1));\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const opts = this.options;\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n getLabelForValue(value) {\n return value === undefined ? '0' : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n configure() {\n const start = this.min;\n super.configure();\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min ? 0 : (log10(value) - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [\n label\n ];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - size / 2,\n end: pos + size / 2\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n return {\n start: pos,\n end: pos + size\n };\n}\n function fitWithPointLabels(scale) {\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n for(let i = 0; i < valueCount; i++){\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n scale.setCenterPoint(orig.l - limits.l, limits.r - orig.r, orig.t - limits.t, limits.b - orig.b);\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const { extra , additionalAngle , padding , size } = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n visible: true,\n x: pointLabelPosition.x,\n y,\n textAlign,\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const { left , top , right , bottom } = item;\n const apexesInArea = _isPointInArea({\n x: left,\n y: top\n }, area) || _isPointInArea({\n x: left,\n y: bottom\n }, area) || _isPointInArea({\n x: right,\n y: top\n }, area) || _isPointInArea({\n x: right,\n y: bottom\n }, area);\n return !apexesInArea;\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const { centerPointLabels , display } = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n for(let i = 0; i < valueCount; i++){\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n return 'right';\n}\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= w / 2;\n }\n return x;\n}\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= h / 2;\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\nfunction drawPointLabelBox(ctx, opts, item) {\n const { left , top , right , bottom } = item;\n const { backdropColor } = opts;\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\nfunction drawPointLabels(scale, labelCount) {\n const { ctx , options: { pointLabels } } = scale;\n for(let i = labelCount - 1; i >= 0; i--){\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const { x , y , textAlign } = item;\n renderText(ctx, scale._pointLabels[i], x, y + plFont.lineHeight / 2, plFont, {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n });\n }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const { ctx } = scale;\n if (circular) {\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n for(let i = 1; i < labelCount; i++){\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n const { color , lineWidth } = gridLineOpts;\n if (!circular && !labelCount || !color || !lineWidth || radius < 0) {\n return;\n }\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\nclass RadialLinearScale extends LinearScaleBase {\n static id = 'radialLinear';\n static defaults = {\n display: true,\n animate: true,\n position: 'chartArea',\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n grid: {\n circular: false\n },\n startAngle: 0,\n ticks: {\n showLabelBackdrop: true,\n callback: Ticks.formatters.numeric\n },\n pointLabels: {\n backdropColor: undefined,\n backdropPadding: 2,\n display: true,\n font: {\n size: 10\n },\n callback (label) {\n return label;\n },\n padding: 5,\n centerPointLabels: false\n }\n };\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n constructor(cfg){\n super(cfg);\n this.xCenter = undefined;\n this.yCenter = undefined;\n this.drawingArea = undefined;\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n setDimensions() {\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n determineDataLimits() {\n const { min , max } = this.getMinMax(false);\n this.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n this.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n this._pointLabels = this.getLabels().map((value, index)=>{\n const label = callback(this.options.pointLabels.callback, [\n value,\n index\n ], this);\n return label || label === 0 ? label : '';\n }).filter((v, i)=>this.chart.getDataVisibility(i));\n }\n fit() {\n const opts = this.options;\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n getPointLabelPosition(index) {\n const { left , top , right , bottom } = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom\n };\n }\n drawBackground() {\n const { backgroundColor , grid: { circular } } = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const { angleLines , grid , border } = opts;\n const labelCount = this._pointLabels.length;\n let i, offset, position;\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n if (grid.display) {\n this.ticks.forEach((tick, index)=>{\n if (index !== 0 || index === 0 && this.min < 0) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n if (angleLines.display) {\n ctx.save();\n for(i = labelCount - 1; i >= 0; i--){\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const { color , lineWidth } = optsAtIndex;\n if (!lineWidth || !color) {\n continue;\n }\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n ctx.restore();\n }\n }\n drawBorder() {}\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n if (!tickOpts.display) {\n return;\n }\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n this.ticks.forEach((tick, index)=>{\n if (index === 0 && this.min >= 0 && !opts.reverse) {\n return;\n }\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(-width / 2 - padding.left, -offset - tickFont.size / 2 - padding.top, width + padding.width, tickFont.size + padding.height);\n }\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth\n });\n });\n ctx.restore();\n }\n drawTitle() {}\n}\n\nconst INTERVALS = {\n millisecond: {\n common: true,\n size: 1,\n steps: 1000\n },\n second: {\n common: true,\n size: 1000,\n steps: 60\n },\n minute: {\n common: true,\n size: 60000,\n steps: 60\n },\n hour: {\n common: true,\n size: 3600000,\n steps: 24\n },\n day: {\n common: true,\n size: 86400000,\n steps: 30\n },\n week: {\n common: false,\n size: 604800000,\n steps: 4\n },\n month: {\n common: true,\n size: 2.628e9,\n steps: 12\n },\n quarter: {\n common: false,\n size: 7.884e9,\n steps: 4\n },\n year: {\n common: true,\n size: 3.154e10\n }\n};\n const UNITS = /* #__PURE__ */ Object.keys(INTERVALS);\n function sorter(a, b) {\n return a - b;\n}\n function parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n const adapter = scale._adapter;\n const { parser , round , isoWeekday } = scale._parseOpts;\n let value = input;\n if (typeof parser === 'function') {\n value = parser(value);\n }\n if (!isNumberFinite(value)) {\n value = typeof parser === 'string' ? adapter.parse(value, parser) : adapter.parse(value);\n }\n if (value === null) {\n return null;\n }\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true) ? adapter.startOf(value, 'isoWeek', isoWeekday) : adapter.startOf(value, round);\n }\n return +value;\n}\n function determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n for(let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i){\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n return UNITS[ilen - 1];\n}\n function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for(let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--){\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n function determineMajorUnit(unit) {\n for(let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i){\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n function addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const { lo , hi } = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n function setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n for(major = first; major <= last; major = +adapter.add(major, 1, majorUnit)){\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n function ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n const map = {};\n const ilen = values.length;\n let i, value;\n for(i = 0; i < ilen; ++i){\n value = values[i];\n map[value] = i;\n ticks.push({\n value,\n major: false\n });\n }\n return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n static id = 'time';\n static defaults = {\n bounds: 'data',\n adapters: {},\n time: {\n parser: false,\n unit: false,\n round: false,\n isoWeekday: false,\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n source: 'auto',\n callback: false,\n major: {\n enabled: false\n }\n }\n };\n constructor(props){\n super(props);\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n this._unit = 'day';\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n adapter.init(opts);\n mergeIf(time.displayFormats, adapter.formats());\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n super.init(scaleOpts);\n this._normalized = opts.normalized;\n }\n parse(raw, index) {\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n let { min , max , minDefined , maxDefined } = this.getUserBounds();\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n if (!minDefined || !maxDefined) {\n _applyBounds(this._getLabelBounds());\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {\n min,\n max\n };\n }\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n const min = this.min;\n const max = this.max;\n const ticks = _filterBetween(timestamps, min, max);\n this._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min)) : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n if (options.reverse) {\n ticks.reverse();\n }\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n afterAutoSkip() {\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map((tick)=>+tick.value));\n }\n }\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n this._offsets = {\n start,\n end,\n factor: 1 / (start + 1 + end)\n };\n }\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for(time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++){\n addTick(ticks, time, timestamps);\n }\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n return Object.keys(ticks).sort(sorter).map((x)=>+x);\n }\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n if (formatter) {\n return callback(formatter, [\n time,\n index,\n ticks\n ], this);\n }\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n generateTickLabels(ticks) {\n let i, ilen, tick;\n for(i = 0, ilen = ticks.length; i < ilen; ++i){\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n return {\n w: tickLabelWidth * cosRotation + tickFontSize * sinRotation,\n h: tickLabelWidth * sinRotation + tickFontSize * cosRotation\n };\n }\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [\n exampleTime\n ], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const metas = this.getMatchingVisibleMetas();\n if (this._normalized && metas.length) {\n return this._cache.data = metas[0].controller.getAllParsedValues(this);\n }\n for(i = 0, ilen = metas.length; i < ilen; ++i){\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n return this._cache.data = this.normalize(timestamps);\n }\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const labels = this.getLabels();\n for(i = 0, ilen = labels.length; i < ilen; ++i){\n timestamps.push(parse(this, labels[i]));\n }\n return this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps);\n }\n normalize(values) {\n return _arrayUnique(values.sort(sorter));\n }\n}\n\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({ lo , hi } = _lookupByKey(table, 'pos', val));\n }\n ({ pos: prevSource , time: prevTarget } = table[lo]);\n ({ pos: nextSource , time: nextTarget } = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({ lo , hi } = _lookupByKey(table, 'time', val));\n }\n ({ time: prevSource , pos: prevTarget } = table[lo]);\n ({ time: nextSource , pos: nextTarget } = table[hi]);\n }\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n static id = 'timeseries';\n static defaults = TimeScale.defaults;\n constructor(props){\n super(props);\n this._table = [];\n this._minPos = undefined;\n this._tableRange = undefined;\n }\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n buildLookupTable(timestamps) {\n const { min , max } = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n for(i = 0, ilen = timestamps.length; i < ilen; ++i){\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n if (items.length < 2) {\n return [\n {\n time: min,\n pos: 0\n },\n {\n time: max,\n pos: 1\n }\n ];\n }\n for(i = 0, ilen = items.length; i < ilen; ++i){\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({\n time: curr,\n pos: i / (ilen - 1)\n });\n }\n }\n return table;\n }\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b)=>a - b);\n }\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n if (timestamps.length) {\n return timestamps;\n }\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n return timestamps;\n }\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nconst registerables = [\n controllers,\n elements,\n plugins,\n scales\n];\n\nexport { Animation, Animations, ArcElement, BarController, BarElement, BasePlatform, BasicPlatform, BubbleController, CategoryScale, Chart, plugin_colors as Colors, DatasetController, plugin_decimation as Decimation, DomPlatform, DoughnutController, Element, index as Filler, Interaction, plugin_legend as Legend, LineController, LineElement, LinearScale, LogarithmicScale, PieController, PointElement, PolarAreaController, RadarController, RadialLinearScale, Scale, ScatterController, plugin_subtitle as SubTitle, Ticks, TimeScale, TimeSeriesScale, plugin_title as Title, plugin_tooltip as Tooltip, adapters as _adapters, _detectPlatform, animator, controllers, defaults, elements, layouts, plugins, registerables, registry, scales };\n//# sourceMappingURL=chart.js.map\n","import { Chart as Chart$1, BarController, DoughnutController, LineController, PieController, PolarAreaController, RadarController, BubbleController, ScatterController } from 'chart.js';\nimport { version, isProxy, toRaw, defineComponent, ref, shallowRef, onMounted, onUnmounted, watch, nextTick, h } from 'vue';\n\nconst CommonProps = {\n data: {\n type: Object,\n required: true\n },\n options: {\n type: Object,\n default: ()=>({})\n },\n plugins: {\n type: Array,\n default: ()=>[]\n },\n datasetIdKey: {\n type: String,\n default: \"label\"\n },\n updateMode: {\n type: String,\n default: undefined\n }\n};\nconst A11yProps = {\n ariaLabel: {\n type: String\n },\n ariaDescribedby: {\n type: String\n }\n};\nconst Props = {\n type: {\n type: String,\n required: true\n },\n destroyDelay: {\n type: Number,\n default: 0 // No delay by default\n },\n ...CommonProps,\n ...A11yProps\n};\n\nconst compatProps = version[0] === \"2\" ? (internals, props)=>Object.assign(internals, {\n attrs: props\n }) : (internals, props)=>Object.assign(internals, props);\nfunction toRawIfProxy(obj) {\n return isProxy(obj) ? toRaw(obj) : obj;\n}\nfunction cloneProxy(obj) {\n let src = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : obj;\n return isProxy(src) ? new Proxy(obj, {}) : obj;\n}\nfunction setOptions(chart, nextOptions) {\n const options = chart.options;\n if (options && nextOptions) {\n Object.assign(options, nextOptions);\n }\n}\nfunction setLabels(currentData, nextLabels) {\n currentData.labels = nextLabels;\n}\nfunction setDatasets(currentData, nextDatasets, datasetIdKey) {\n const addedDatasets = [];\n currentData.datasets = nextDatasets.map((nextDataset)=>{\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find((dataset)=>dataset[datasetIdKey] === nextDataset[datasetIdKey]);\n // There is no original to update, so simply add new one\n if (!currentDataset || !nextDataset.data || addedDatasets.includes(currentDataset)) {\n return {\n ...nextDataset\n };\n }\n addedDatasets.push(currentDataset);\n Object.assign(currentDataset, nextDataset);\n return currentDataset;\n });\n}\nfunction cloneData(data, datasetIdKey) {\n const nextData = {\n labels: [],\n datasets: []\n };\n setLabels(nextData, data.labels);\n setDatasets(nextData, data.datasets, datasetIdKey);\n return nextData;\n}\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */ function getDatasetAtEvent(chart, event) {\n return chart.getElementsAtEventForMode(event, \"dataset\", {\n intersect: true\n }, false);\n}\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */ function getElementAtEvent(chart, event) {\n return chart.getElementsAtEventForMode(event, \"nearest\", {\n intersect: true\n }, false);\n}\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */ function getElementsAtEvent(chart, event) {\n return chart.getElementsAtEventForMode(event, \"index\", {\n intersect: true\n }, false);\n}\n\nconst Chart = defineComponent({\n props: Props,\n setup (props, param) {\n let { expose , slots } = param;\n const canvasRef = ref(null);\n const chartRef = shallowRef(null);\n expose({\n chart: chartRef\n });\n const renderChart = ()=>{\n if (!canvasRef.value) return;\n const { type , data , options , plugins , datasetIdKey } = props;\n const clonedData = cloneData(data, datasetIdKey);\n const proxiedData = cloneProxy(clonedData, data);\n chartRef.value = new Chart$1(canvasRef.value, {\n type,\n data: proxiedData,\n options: {\n ...options\n },\n plugins\n });\n };\n const destroyChart = ()=>{\n const chart = toRaw(chartRef.value);\n if (chart) {\n if (props.destroyDelay > 0) {\n setTimeout(()=>{\n chart.destroy();\n chartRef.value = null;\n }, props.destroyDelay);\n } else {\n chart.destroy();\n chartRef.value = null;\n }\n }\n };\n const update = (chart)=>{\n chart.update(props.updateMode);\n };\n onMounted(renderChart);\n onUnmounted(destroyChart);\n watch([\n ()=>props.options,\n ()=>props.data\n ], (param, param1)=>{\n let [nextOptionsProxy, nextDataProxy] = param, [prevOptionsProxy, prevDataProxy] = param1;\n const chart = toRaw(chartRef.value);\n if (!chart) {\n return;\n }\n let shouldUpdate = false;\n if (nextOptionsProxy) {\n const nextOptions = toRawIfProxy(nextOptionsProxy);\n const prevOptions = toRawIfProxy(prevOptionsProxy);\n if (nextOptions && nextOptions !== prevOptions) {\n setOptions(chart, nextOptions);\n shouldUpdate = true;\n }\n }\n if (nextDataProxy) {\n const nextLabels = toRawIfProxy(nextDataProxy.labels);\n const prevLabels = toRawIfProxy(prevDataProxy.labels);\n const nextDatasets = toRawIfProxy(nextDataProxy.datasets);\n const prevDatasets = toRawIfProxy(prevDataProxy.datasets);\n if (nextLabels !== prevLabels) {\n setLabels(chart.config.data, nextLabels);\n shouldUpdate = true;\n }\n if (nextDatasets && nextDatasets !== prevDatasets) {\n setDatasets(chart.config.data, nextDatasets, props.datasetIdKey);\n shouldUpdate = true;\n }\n }\n if (shouldUpdate) {\n nextTick(()=>{\n update(chart);\n });\n }\n }, {\n deep: true\n });\n return ()=>{\n return h(\"canvas\", {\n role: \"img\",\n ariaLabel: props.ariaLabel,\n ariaDescribedby: props.ariaDescribedby,\n ref: canvasRef\n }, [\n h(\"p\", {}, [\n slots.default ? slots.default() : \"\"\n ])\n ]);\n };\n }\n});\n\nfunction createTypedChart(type, registerables) {\n Chart$1.register(registerables);\n return defineComponent({\n props: CommonProps,\n setup (props, param) {\n let { expose } = param;\n const ref = shallowRef(null);\n const reforwardRef = (chartRef)=>{\n ref.value = chartRef?.chart;\n };\n expose({\n chart: ref\n });\n return ()=>{\n return h(Chart, compatProps({\n ref: reforwardRef\n }, {\n type,\n ...props\n }));\n };\n }\n });\n}\nconst Bar = /* #__PURE__ */ createTypedChart(\"bar\", BarController);\nconst Doughnut = /* #__PURE__ */ createTypedChart(\"doughnut\", DoughnutController);\nconst Line = /* #__PURE__ */ createTypedChart(\"line\", LineController);\nconst Pie = /* #__PURE__ */ createTypedChart(\"pie\", PieController);\nconst PolarArea = /* #__PURE__ */ createTypedChart(\"polarArea\", PolarAreaController);\nconst Radar = /* #__PURE__ */ createTypedChart(\"radar\", RadarController);\nconst Bubble = /* #__PURE__ */ createTypedChart(\"bubble\", BubbleController);\nconst Scatter = /* #__PURE__ */ createTypedChart(\"scatter\", ScatterController);\n\nexport { Bar, Bubble, Chart, Doughnut, Line, Pie, PolarArea, Radar, Scatter, createTypedChart, getDatasetAtEvent, getElementAtEvent, getElementsAtEvent };\n//# sourceMappingURL=index.js.map\n","/*!\n * chartjs-plugin-datalabels v2.2.0\n * https://chartjs-plugin-datalabels.netlify.app\n * (c) 2017-2022 chartjs-plugin-datalabels contributors\n * Released under the MIT license\n */\nimport { isNullOrUndef, merge, toFont, resolve, toPadding, valueOrDefault, callback, isObject, each } from 'chart.js/helpers';\nimport { defaults as defaults$1, ArcElement, PointElement, BarElement } from 'chart.js';\n\nvar devicePixelRatio = (function() {\n if (typeof window !== 'undefined') {\n if (window.devicePixelRatio) {\n return window.devicePixelRatio;\n }\n\n // devicePixelRatio is undefined on IE10\n // https://stackoverflow.com/a/20204180/8837887\n // https://github.com/chartjs/chartjs-plugin-datalabels/issues/85\n var screen = window.screen;\n if (screen) {\n return (screen.deviceXDPI || 1) / (screen.logicalXDPI || 1);\n }\n }\n\n return 1;\n}());\n\nvar utils = {\n // @todo move this in Chart.helpers.toTextLines\n toTextLines: function(inputs) {\n var lines = [];\n var input;\n\n inputs = [].concat(inputs);\n while (inputs.length) {\n input = inputs.pop();\n if (typeof input === 'string') {\n lines.unshift.apply(lines, input.split('\\n'));\n } else if (Array.isArray(input)) {\n inputs.push.apply(inputs, input);\n } else if (!isNullOrUndef(inputs)) {\n lines.unshift('' + input);\n }\n }\n\n return lines;\n },\n\n // @todo move this in Chart.helpers.canvas.textSize\n // @todo cache calls of measureText if font doesn't change?!\n textSize: function(ctx, lines, font) {\n var items = [].concat(lines);\n var ilen = items.length;\n var prev = ctx.font;\n var width = 0;\n var i;\n\n ctx.font = font.string;\n\n for (i = 0; i < ilen; ++i) {\n width = Math.max(ctx.measureText(items[i]).width, width);\n }\n\n ctx.font = prev;\n\n return {\n height: ilen * font.lineHeight,\n width: width\n };\n },\n\n /**\n * Returns value bounded by min and max. This is equivalent to max(min, min(value, max)).\n * @todo move this method in Chart.helpers.bound\n * https://doc.qt.io/qt-5/qtglobal.html#qBound\n */\n bound: function(min, value, max) {\n return Math.max(min, Math.min(value, max));\n },\n\n /**\n * Returns an array of pair [value, state] where state is:\n * * -1: value is only in a0 (removed)\n * * 1: value is only in a1 (added)\n */\n arrayDiff: function(a0, a1) {\n var prev = a0.slice();\n var updates = [];\n var i, j, ilen, v;\n\n for (i = 0, ilen = a1.length; i < ilen; ++i) {\n v = a1[i];\n j = prev.indexOf(v);\n\n if (j === -1) {\n updates.push([v, 1]);\n } else {\n prev.splice(j, 1);\n }\n }\n\n for (i = 0, ilen = prev.length; i < ilen; ++i) {\n updates.push([prev[i], -1]);\n }\n\n return updates;\n },\n\n /**\n * https://github.com/chartjs/chartjs-plugin-datalabels/issues/70\n */\n rasterize: function(v) {\n return Math.round(v * devicePixelRatio) / devicePixelRatio;\n }\n};\n\nfunction orient(point, origin) {\n var x0 = origin.x;\n var y0 = origin.y;\n\n if (x0 === null) {\n return {x: 0, y: -1};\n }\n if (y0 === null) {\n return {x: 1, y: 0};\n }\n\n var dx = point.x - x0;\n var dy = point.y - y0;\n var ln = Math.sqrt(dx * dx + dy * dy);\n\n return {\n x: ln ? dx / ln : 0,\n y: ln ? dy / ln : -1\n };\n}\n\nfunction aligned(x, y, vx, vy, align) {\n switch (align) {\n case 'center':\n vx = vy = 0;\n break;\n case 'bottom':\n vx = 0;\n vy = 1;\n break;\n case 'right':\n vx = 1;\n vy = 0;\n break;\n case 'left':\n vx = -1;\n vy = 0;\n break;\n case 'top':\n vx = 0;\n vy = -1;\n break;\n case 'start':\n vx = -vx;\n vy = -vy;\n break;\n case 'end':\n // keep natural orientation\n break;\n default:\n // clockwise rotation (in degree)\n align *= (Math.PI / 180);\n vx = Math.cos(align);\n vy = Math.sin(align);\n break;\n }\n\n return {\n x: x,\n y: y,\n vx: vx,\n vy: vy\n };\n}\n\n// Line clipping (Cohen–Sutherland algorithm)\n// https://en.wikipedia.org/wiki/Cohen–Sutherland_algorithm\n\nvar R_INSIDE = 0;\nvar R_LEFT = 1;\nvar R_RIGHT = 2;\nvar R_BOTTOM = 4;\nvar R_TOP = 8;\n\nfunction region(x, y, rect) {\n var res = R_INSIDE;\n\n if (x < rect.left) {\n res |= R_LEFT;\n } else if (x > rect.right) {\n res |= R_RIGHT;\n }\n if (y < rect.top) {\n res |= R_TOP;\n } else if (y > rect.bottom) {\n res |= R_BOTTOM;\n }\n\n return res;\n}\n\nfunction clipped(segment, area) {\n var x0 = segment.x0;\n var y0 = segment.y0;\n var x1 = segment.x1;\n var y1 = segment.y1;\n var r0 = region(x0, y0, area);\n var r1 = region(x1, y1, area);\n var r, x, y;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (!(r0 | r1) || (r0 & r1)) {\n // both points inside or on the same side: no clipping\n break;\n }\n\n // at least one point is outside\n r = r0 || r1;\n\n if (r & R_TOP) {\n x = x0 + (x1 - x0) * (area.top - y0) / (y1 - y0);\n y = area.top;\n } else if (r & R_BOTTOM) {\n x = x0 + (x1 - x0) * (area.bottom - y0) / (y1 - y0);\n y = area.bottom;\n } else if (r & R_RIGHT) {\n y = y0 + (y1 - y0) * (area.right - x0) / (x1 - x0);\n x = area.right;\n } else if (r & R_LEFT) {\n y = y0 + (y1 - y0) * (area.left - x0) / (x1 - x0);\n x = area.left;\n }\n\n if (r === r0) {\n x0 = x;\n y0 = y;\n r0 = region(x0, y0, area);\n } else {\n x1 = x;\n y1 = y;\n r1 = region(x1, y1, area);\n }\n }\n\n return {\n x0: x0,\n x1: x1,\n y0: y0,\n y1: y1\n };\n}\n\nfunction compute$1(range, config) {\n var anchor = config.anchor;\n var segment = range;\n var x, y;\n\n if (config.clamp) {\n segment = clipped(segment, config.area);\n }\n\n if (anchor === 'start') {\n x = segment.x0;\n y = segment.y0;\n } else if (anchor === 'end') {\n x = segment.x1;\n y = segment.y1;\n } else {\n x = (segment.x0 + segment.x1) / 2;\n y = (segment.y0 + segment.y1) / 2;\n }\n\n return aligned(x, y, range.vx, range.vy, config.align);\n}\n\nvar positioners = {\n arc: function(el, config) {\n var angle = (el.startAngle + el.endAngle) / 2;\n var vx = Math.cos(angle);\n var vy = Math.sin(angle);\n var r0 = el.innerRadius;\n var r1 = el.outerRadius;\n\n return compute$1({\n x0: el.x + vx * r0,\n y0: el.y + vy * r0,\n x1: el.x + vx * r1,\n y1: el.y + vy * r1,\n vx: vx,\n vy: vy\n }, config);\n },\n\n point: function(el, config) {\n var v = orient(el, config.origin);\n var rx = v.x * el.options.radius;\n var ry = v.y * el.options.radius;\n\n return compute$1({\n x0: el.x - rx,\n y0: el.y - ry,\n x1: el.x + rx,\n y1: el.y + ry,\n vx: v.x,\n vy: v.y\n }, config);\n },\n\n bar: function(el, config) {\n var v = orient(el, config.origin);\n var x = el.x;\n var y = el.y;\n var sx = 0;\n var sy = 0;\n\n if (el.horizontal) {\n x = Math.min(el.x, el.base);\n sx = Math.abs(el.base - el.x);\n } else {\n y = Math.min(el.y, el.base);\n sy = Math.abs(el.base - el.y);\n }\n\n return compute$1({\n x0: x,\n y0: y + sy,\n x1: x + sx,\n y1: y,\n vx: v.x,\n vy: v.y\n }, config);\n },\n\n fallback: function(el, config) {\n var v = orient(el, config.origin);\n\n return compute$1({\n x0: el.x,\n y0: el.y,\n x1: el.x + (el.width || 0),\n y1: el.y + (el.height || 0),\n vx: v.x,\n vy: v.y\n }, config);\n }\n};\n\nvar rasterize = utils.rasterize;\n\nfunction boundingRects(model) {\n var borderWidth = model.borderWidth || 0;\n var padding = model.padding;\n var th = model.size.height;\n var tw = model.size.width;\n var tx = -tw / 2;\n var ty = -th / 2;\n\n return {\n frame: {\n x: tx - padding.left - borderWidth,\n y: ty - padding.top - borderWidth,\n w: tw + padding.width + borderWidth * 2,\n h: th + padding.height + borderWidth * 2\n },\n text: {\n x: tx,\n y: ty,\n w: tw,\n h: th\n }\n };\n}\n\nfunction getScaleOrigin(el, context) {\n var scale = context.chart.getDatasetMeta(context.datasetIndex).vScale;\n\n if (!scale) {\n return null;\n }\n\n if (scale.xCenter !== undefined && scale.yCenter !== undefined) {\n return {x: scale.xCenter, y: scale.yCenter};\n }\n\n var pixel = scale.getBasePixel();\n return el.horizontal ?\n {x: pixel, y: null} :\n {x: null, y: pixel};\n}\n\nfunction getPositioner(el) {\n if (el instanceof ArcElement) {\n return positioners.arc;\n }\n if (el instanceof PointElement) {\n return positioners.point;\n }\n if (el instanceof BarElement) {\n return positioners.bar;\n }\n return positioners.fallback;\n}\n\nfunction drawRoundedRect(ctx, x, y, w, h, radius) {\n var HALF_PI = Math.PI / 2;\n\n if (radius) {\n var r = Math.min(radius, h / 2, w / 2);\n var left = x + r;\n var top = y + r;\n var right = x + w - r;\n var bottom = y + h - r;\n\n ctx.moveTo(x, top);\n if (left < right && top < bottom) {\n ctx.arc(left, top, r, -Math.PI, -HALF_PI);\n ctx.arc(right, top, r, -HALF_PI, 0);\n ctx.arc(right, bottom, r, 0, HALF_PI);\n ctx.arc(left, bottom, r, HALF_PI, Math.PI);\n } else if (left < right) {\n ctx.moveTo(left, y);\n ctx.arc(right, top, r, -HALF_PI, HALF_PI);\n ctx.arc(left, top, r, HALF_PI, Math.PI + HALF_PI);\n } else if (top < bottom) {\n ctx.arc(left, top, r, -Math.PI, 0);\n ctx.arc(left, bottom, r, 0, Math.PI);\n } else {\n ctx.arc(left, top, r, -Math.PI, Math.PI);\n }\n ctx.closePath();\n ctx.moveTo(x, y);\n } else {\n ctx.rect(x, y, w, h);\n }\n}\n\nfunction drawFrame(ctx, rect, model) {\n var bgColor = model.backgroundColor;\n var borderColor = model.borderColor;\n var borderWidth = model.borderWidth;\n\n if (!bgColor && (!borderColor || !borderWidth)) {\n return;\n }\n\n ctx.beginPath();\n\n drawRoundedRect(\n ctx,\n rasterize(rect.x) + borderWidth / 2,\n rasterize(rect.y) + borderWidth / 2,\n rasterize(rect.w) - borderWidth,\n rasterize(rect.h) - borderWidth,\n model.borderRadius);\n\n ctx.closePath();\n\n if (bgColor) {\n ctx.fillStyle = bgColor;\n ctx.fill();\n }\n\n if (borderColor && borderWidth) {\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = 'miter';\n ctx.stroke();\n }\n}\n\nfunction textGeometry(rect, align, font) {\n var h = font.lineHeight;\n var w = rect.w;\n var x = rect.x;\n var y = rect.y + h / 2;\n\n if (align === 'center') {\n x += w / 2;\n } else if (align === 'end' || align === 'right') {\n x += w;\n }\n\n return {\n h: h,\n w: w,\n x: x,\n y: y\n };\n}\n\nfunction drawTextLine(ctx, text, cfg) {\n var shadow = ctx.shadowBlur;\n var stroked = cfg.stroked;\n var x = rasterize(cfg.x);\n var y = rasterize(cfg.y);\n var w = rasterize(cfg.w);\n\n if (stroked) {\n ctx.strokeText(text, x, y, w);\n }\n\n if (cfg.filled) {\n if (shadow && stroked) {\n // Prevent drawing shadow on both the text stroke and fill, so\n // if the text is stroked, remove the shadow for the text fill.\n ctx.shadowBlur = 0;\n }\n\n ctx.fillText(text, x, y, w);\n\n if (shadow && stroked) {\n ctx.shadowBlur = shadow;\n }\n }\n}\n\nfunction drawText(ctx, lines, rect, model) {\n var align = model.textAlign;\n var color = model.color;\n var filled = !!color;\n var font = model.font;\n var ilen = lines.length;\n var strokeColor = model.textStrokeColor;\n var strokeWidth = model.textStrokeWidth;\n var stroked = strokeColor && strokeWidth;\n var i;\n\n if (!ilen || (!filled && !stroked)) {\n return;\n }\n\n // Adjust coordinates based on text alignment and line height\n rect = textGeometry(rect, align, font);\n\n ctx.font = font.string;\n ctx.textAlign = align;\n ctx.textBaseline = 'middle';\n ctx.shadowBlur = model.textShadowBlur;\n ctx.shadowColor = model.textShadowColor;\n\n if (filled) {\n ctx.fillStyle = color;\n }\n if (stroked) {\n ctx.lineJoin = 'round';\n ctx.lineWidth = strokeWidth;\n ctx.strokeStyle = strokeColor;\n }\n\n for (i = 0, ilen = lines.length; i < ilen; ++i) {\n drawTextLine(ctx, lines[i], {\n stroked: stroked,\n filled: filled,\n w: rect.w,\n x: rect.x,\n y: rect.y + rect.h * i\n });\n }\n}\n\nvar Label = function(config, ctx, el, index) {\n var me = this;\n\n me._config = config;\n me._index = index;\n me._model = null;\n me._rects = null;\n me._ctx = ctx;\n me._el = el;\n};\n\nmerge(Label.prototype, {\n /**\n * @private\n */\n _modelize: function(display, lines, config, context) {\n var me = this;\n var index = me._index;\n var font = toFont(resolve([config.font, {}], context, index));\n var color = resolve([config.color, defaults$1.color], context, index);\n\n return {\n align: resolve([config.align, 'center'], context, index),\n anchor: resolve([config.anchor, 'center'], context, index),\n area: context.chart.chartArea,\n backgroundColor: resolve([config.backgroundColor, null], context, index),\n borderColor: resolve([config.borderColor, null], context, index),\n borderRadius: resolve([config.borderRadius, 0], context, index),\n borderWidth: resolve([config.borderWidth, 0], context, index),\n clamp: resolve([config.clamp, false], context, index),\n clip: resolve([config.clip, false], context, index),\n color: color,\n display: display,\n font: font,\n lines: lines,\n offset: resolve([config.offset, 4], context, index),\n opacity: resolve([config.opacity, 1], context, index),\n origin: getScaleOrigin(me._el, context),\n padding: toPadding(resolve([config.padding, 4], context, index)),\n positioner: getPositioner(me._el),\n rotation: resolve([config.rotation, 0], context, index) * (Math.PI / 180),\n size: utils.textSize(me._ctx, lines, font),\n textAlign: resolve([config.textAlign, 'start'], context, index),\n textShadowBlur: resolve([config.textShadowBlur, 0], context, index),\n textShadowColor: resolve([config.textShadowColor, color], context, index),\n textStrokeColor: resolve([config.textStrokeColor, color], context, index),\n textStrokeWidth: resolve([config.textStrokeWidth, 0], context, index)\n };\n },\n\n update: function(context) {\n var me = this;\n var model = null;\n var rects = null;\n var index = me._index;\n var config = me._config;\n var value, label, lines;\n\n // We first resolve the display option (separately) to avoid computing\n // other options in case the label is hidden (i.e. display: false).\n var display = resolve([config.display, true], context, index);\n\n if (display) {\n value = context.dataset.data[index];\n label = valueOrDefault(callback(config.formatter, [value, context]), value);\n lines = isNullOrUndef(label) ? [] : utils.toTextLines(label);\n\n if (lines.length) {\n model = me._modelize(display, lines, config, context);\n rects = boundingRects(model);\n }\n }\n\n me._model = model;\n me._rects = rects;\n },\n\n geometry: function() {\n return this._rects ? this._rects.frame : {};\n },\n\n rotation: function() {\n return this._model ? this._model.rotation : 0;\n },\n\n visible: function() {\n return this._model && this._model.opacity;\n },\n\n model: function() {\n return this._model;\n },\n\n draw: function(chart, center) {\n var me = this;\n var ctx = chart.ctx;\n var model = me._model;\n var rects = me._rects;\n var area;\n\n if (!this.visible()) {\n return;\n }\n\n ctx.save();\n\n if (model.clip) {\n area = model.area;\n ctx.beginPath();\n ctx.rect(\n area.left,\n area.top,\n area.right - area.left,\n area.bottom - area.top);\n ctx.clip();\n }\n\n ctx.globalAlpha = utils.bound(0, model.opacity, 1);\n ctx.translate(rasterize(center.x), rasterize(center.y));\n ctx.rotate(model.rotation);\n\n drawFrame(ctx, rects.frame, model);\n drawText(ctx, model.lines, rects.text, model);\n\n ctx.restore();\n }\n});\n\nvar MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; // eslint-disable-line es/no-number-minsafeinteger\nvar MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; // eslint-disable-line es/no-number-maxsafeinteger\n\nfunction rotated(point, center, angle) {\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var cx = center.x;\n var cy = center.y;\n\n return {\n x: cx + cos * (point.x - cx) - sin * (point.y - cy),\n y: cy + sin * (point.x - cx) + cos * (point.y - cy)\n };\n}\n\nfunction projected(points, axis) {\n var min = MAX_INTEGER;\n var max = MIN_INTEGER;\n var origin = axis.origin;\n var i, pt, vx, vy, dp;\n\n for (i = 0; i < points.length; ++i) {\n pt = points[i];\n vx = pt.x - origin.x;\n vy = pt.y - origin.y;\n dp = axis.vx * vx + axis.vy * vy;\n min = Math.min(min, dp);\n max = Math.max(max, dp);\n }\n\n return {\n min: min,\n max: max\n };\n}\n\nfunction toAxis(p0, p1) {\n var vx = p1.x - p0.x;\n var vy = p1.y - p0.y;\n var ln = Math.sqrt(vx * vx + vy * vy);\n\n return {\n vx: (p1.x - p0.x) / ln,\n vy: (p1.y - p0.y) / ln,\n origin: p0,\n ln: ln\n };\n}\n\nvar HitBox = function() {\n this._rotation = 0;\n this._rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n};\n\nmerge(HitBox.prototype, {\n center: function() {\n var r = this._rect;\n return {\n x: r.x + r.w / 2,\n y: r.y + r.h / 2\n };\n },\n\n update: function(center, rect, rotation) {\n this._rotation = rotation;\n this._rect = {\n x: rect.x + center.x,\n y: rect.y + center.y,\n w: rect.w,\n h: rect.h\n };\n },\n\n contains: function(point) {\n var me = this;\n var margin = 1;\n var rect = me._rect;\n\n point = rotated(point, me.center(), -me._rotation);\n\n return !(point.x < rect.x - margin\n || point.y < rect.y - margin\n || point.x > rect.x + rect.w + margin * 2\n || point.y > rect.y + rect.h + margin * 2);\n },\n\n // Separating Axis Theorem\n // https://gamedevelopment.tutsplus.com/tutorials/collision-detection-using-the-separating-axis-theorem--gamedev-169\n intersects: function(other) {\n var r0 = this._points();\n var r1 = other._points();\n var axes = [\n toAxis(r0[0], r0[1]),\n toAxis(r0[0], r0[3])\n ];\n var i, pr0, pr1;\n\n if (this._rotation !== other._rotation) {\n // Only separate with r1 axis if the rotation is different,\n // else it's enough to separate r0 and r1 with r0 axis only!\n axes.push(\n toAxis(r1[0], r1[1]),\n toAxis(r1[0], r1[3])\n );\n }\n\n for (i = 0; i < axes.length; ++i) {\n pr0 = projected(r0, axes[i]);\n pr1 = projected(r1, axes[i]);\n\n if (pr0.max < pr1.min || pr1.max < pr0.min) {\n return false;\n }\n }\n\n return true;\n },\n\n /**\n * @private\n */\n _points: function() {\n var me = this;\n var rect = me._rect;\n var angle = me._rotation;\n var center = me.center();\n\n return [\n rotated({x: rect.x, y: rect.y}, center, angle),\n rotated({x: rect.x + rect.w, y: rect.y}, center, angle),\n rotated({x: rect.x + rect.w, y: rect.y + rect.h}, center, angle),\n rotated({x: rect.x, y: rect.y + rect.h}, center, angle)\n ];\n }\n});\n\nfunction coordinates(el, model, geometry) {\n var point = model.positioner(el, model);\n var vx = point.vx;\n var vy = point.vy;\n\n if (!vx && !vy) {\n // if aligned center, we don't want to offset the center point\n return {x: point.x, y: point.y};\n }\n\n var w = geometry.w;\n var h = geometry.h;\n\n // take in account the label rotation\n var rotation = model.rotation;\n var dx = Math.abs(w / 2 * Math.cos(rotation)) + Math.abs(h / 2 * Math.sin(rotation));\n var dy = Math.abs(w / 2 * Math.sin(rotation)) + Math.abs(h / 2 * Math.cos(rotation));\n\n // scale the unit vector (vx, vy) to get at least dx or dy equal to\n // w or h respectively (else we would calculate the distance to the\n // ellipse inscribed in the bounding rect)\n var vs = 1 / Math.max(Math.abs(vx), Math.abs(vy));\n dx *= vx * vs;\n dy *= vy * vs;\n\n // finally, include the explicit offset\n dx += model.offset * vx;\n dy += model.offset * vy;\n\n return {\n x: point.x + dx,\n y: point.y + dy\n };\n}\n\nfunction collide(labels, collider) {\n var i, j, s0, s1;\n\n // IMPORTANT Iterate in the reverse order since items at the end of the\n // list have an higher weight/priority and thus should be less impacted\n // by the overlapping strategy.\n\n for (i = labels.length - 1; i >= 0; --i) {\n s0 = labels[i].$layout;\n\n for (j = i - 1; j >= 0 && s0._visible; --j) {\n s1 = labels[j].$layout;\n\n if (s1._visible && s0._box.intersects(s1._box)) {\n collider(s0, s1);\n }\n }\n }\n\n return labels;\n}\n\nfunction compute(labels) {\n var i, ilen, label, state, geometry, center, proxy;\n\n // Initialize labels for overlap detection\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n state = label.$layout;\n\n if (state._visible) {\n // Chart.js 3 removed el._model in favor of getProps(), making harder to\n // abstract reading values in positioners. Also, using string arrays to\n // read values (i.e. var {a,b,c} = el.getProps([\"a\",\"b\",\"c\"])) would make\n // positioners inefficient in the normal case (i.e. not the final values)\n // and the code a bit ugly, so let's use a Proxy instead.\n proxy = new Proxy(label._el, {get: (el, p) => el.getProps([p], true)[p]});\n\n geometry = label.geometry();\n center = coordinates(proxy, label.model(), geometry);\n state._box.update(center, geometry, label.rotation());\n }\n }\n\n // Auto hide overlapping labels\n return collide(labels, function(s0, s1) {\n var h0 = s0._hidable;\n var h1 = s1._hidable;\n\n if ((h0 && h1) || h1) {\n s1._visible = false;\n } else if (h0) {\n s0._visible = false;\n }\n });\n}\n\nvar layout = {\n prepare: function(datasets) {\n var labels = [];\n var i, j, ilen, jlen, label;\n\n for (i = 0, ilen = datasets.length; i < ilen; ++i) {\n for (j = 0, jlen = datasets[i].length; j < jlen; ++j) {\n label = datasets[i][j];\n labels.push(label);\n label.$layout = {\n _box: new HitBox(),\n _hidable: false,\n _visible: true,\n _set: i,\n _idx: label._index\n };\n }\n }\n\n // TODO New `z` option: labels with a higher z-index are drawn\n // of top of the ones with a lower index. Lowest z-index labels\n // are also discarded first when hiding overlapping labels.\n labels.sort(function(a, b) {\n var sa = a.$layout;\n var sb = b.$layout;\n\n return sa._idx === sb._idx\n ? sb._set - sa._set\n : sb._idx - sa._idx;\n });\n\n this.update(labels);\n\n return labels;\n },\n\n update: function(labels) {\n var dirty = false;\n var i, ilen, label, model, state;\n\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n model = label.model();\n state = label.$layout;\n state._hidable = model && model.display === 'auto';\n state._visible = label.visible();\n dirty |= state._hidable;\n }\n\n if (dirty) {\n compute(labels);\n }\n },\n\n lookup: function(labels, point) {\n var i, state;\n\n // IMPORTANT Iterate in the reverse order since items at the end of\n // the list have an higher z-index, thus should be picked first.\n\n for (i = labels.length - 1; i >= 0; --i) {\n state = labels[i].$layout;\n\n if (state && state._visible && state._box.contains(point)) {\n return labels[i];\n }\n }\n\n return null;\n },\n\n draw: function(chart, labels) {\n var i, ilen, label, state, geometry, center;\n\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n state = label.$layout;\n\n if (state._visible) {\n geometry = label.geometry();\n center = coordinates(label._el, label.model(), geometry);\n state._box.update(center, geometry, label.rotation());\n label.draw(chart, center);\n }\n }\n }\n};\n\nvar formatter = function(value) {\n if (isNullOrUndef(value)) {\n return null;\n }\n\n var label = value;\n var keys, klen, k;\n if (isObject(value)) {\n if (!isNullOrUndef(value.label)) {\n label = value.label;\n } else if (!isNullOrUndef(value.r)) {\n label = value.r;\n } else {\n label = '';\n keys = Object.keys(value);\n for (k = 0, klen = keys.length; k < klen; ++k) {\n label += (k !== 0 ? ', ' : '') + keys[k] + ': ' + value[keys[k]];\n }\n }\n }\n\n return '' + label;\n};\n\n/**\n * IMPORTANT: make sure to also update tests and TypeScript definition\n * files (`/test/specs/defaults.spec.js` and `/types/options.d.ts`)\n */\n\nvar defaults = {\n align: 'center',\n anchor: 'center',\n backgroundColor: null,\n borderColor: null,\n borderRadius: 0,\n borderWidth: 0,\n clamp: false,\n clip: false,\n color: undefined,\n display: true,\n font: {\n family: undefined,\n lineHeight: 1.2,\n size: undefined,\n style: undefined,\n weight: null\n },\n formatter: formatter,\n labels: undefined,\n listeners: {},\n offset: 4,\n opacity: 1,\n padding: {\n top: 4,\n right: 4,\n bottom: 4,\n left: 4\n },\n rotation: 0,\n textAlign: 'start',\n textStrokeColor: undefined,\n textStrokeWidth: 0,\n textShadowBlur: 0,\n textShadowColor: undefined\n};\n\n/**\n * @see https://github.com/chartjs/Chart.js/issues/4176\n */\n\nvar EXPANDO_KEY = '$datalabels';\nvar DEFAULT_KEY = '$default';\n\nfunction configure(dataset, options) {\n var override = dataset.datalabels;\n var listeners = {};\n var configs = [];\n var labels, keys;\n\n if (override === false) {\n return null;\n }\n if (override === true) {\n override = {};\n }\n\n options = merge({}, [options, override]);\n labels = options.labels || {};\n keys = Object.keys(labels);\n delete options.labels;\n\n if (keys.length) {\n keys.forEach(function(key) {\n if (labels[key]) {\n configs.push(merge({}, [\n options,\n labels[key],\n {_key: key}\n ]));\n }\n });\n } else {\n // Default label if no \"named\" label defined.\n configs.push(options);\n }\n\n // listeners: {: {: }}\n listeners = configs.reduce(function(target, config) {\n each(config.listeners || {}, function(fn, event) {\n target[event] = target[event] || {};\n target[event][config._key || DEFAULT_KEY] = fn;\n });\n\n delete config.listeners;\n return target;\n }, {});\n\n return {\n labels: configs,\n listeners: listeners\n };\n}\n\nfunction dispatchEvent(chart, listeners, label, event) {\n if (!listeners) {\n return;\n }\n\n var context = label.$context;\n var groups = label.$groups;\n var callback$1;\n\n if (!listeners[groups._set]) {\n return;\n }\n\n callback$1 = listeners[groups._set][groups._key];\n if (!callback$1) {\n return;\n }\n\n if (callback(callback$1, [context, event]) === true) {\n // Users are allowed to tweak the given context by injecting values that can be\n // used in scriptable options to display labels differently based on the current\n // event (e.g. highlight an hovered label). That's why we update the label with\n // the output context and schedule a new chart render by setting it dirty.\n chart[EXPANDO_KEY]._dirty = true;\n label.update(context);\n }\n}\n\nfunction dispatchMoveEvents(chart, listeners, previous, label, event) {\n var enter, leave;\n\n if (!previous && !label) {\n return;\n }\n\n if (!previous) {\n enter = true;\n } else if (!label) {\n leave = true;\n } else if (previous !== label) {\n leave = enter = true;\n }\n\n if (leave) {\n dispatchEvent(chart, listeners.leave, previous, event);\n }\n if (enter) {\n dispatchEvent(chart, listeners.enter, label, event);\n }\n}\n\nfunction handleMoveEvents(chart, event) {\n var expando = chart[EXPANDO_KEY];\n var listeners = expando._listeners;\n var previous, label;\n\n if (!listeners.enter && !listeners.leave) {\n return;\n }\n\n if (event.type === 'mousemove') {\n label = layout.lookup(expando._labels, event);\n } else if (event.type !== 'mouseout') {\n return;\n }\n\n previous = expando._hovered;\n expando._hovered = label;\n dispatchMoveEvents(chart, listeners, previous, label, event);\n}\n\nfunction handleClickEvents(chart, event) {\n var expando = chart[EXPANDO_KEY];\n var handlers = expando._listeners.click;\n var label = handlers && layout.lookup(expando._labels, event);\n if (label) {\n dispatchEvent(chart, handlers, label, event);\n }\n}\n\nvar plugin = {\n id: 'datalabels',\n\n defaults: defaults,\n\n beforeInit: function(chart) {\n chart[EXPANDO_KEY] = {\n _actives: []\n };\n },\n\n beforeUpdate: function(chart) {\n var expando = chart[EXPANDO_KEY];\n expando._listened = false;\n expando._listeners = {}; // {: {: {: }}}\n expando._datasets = []; // per dataset labels: [Label[]]\n expando._labels = []; // layouted labels: Label[]\n },\n\n afterDatasetUpdate: function(chart, args, options) {\n var datasetIndex = args.index;\n var expando = chart[EXPANDO_KEY];\n var labels = expando._datasets[datasetIndex] = [];\n var visible = chart.isDatasetVisible(datasetIndex);\n var dataset = chart.data.datasets[datasetIndex];\n var config = configure(dataset, options);\n var elements = args.meta.data || [];\n var ctx = chart.ctx;\n var i, j, ilen, jlen, cfg, key, el, label;\n\n ctx.save();\n\n for (i = 0, ilen = elements.length; i < ilen; ++i) {\n el = elements[i];\n el[EXPANDO_KEY] = [];\n\n if (visible && el && chart.getDataVisibility(i) && !el.skip) {\n for (j = 0, jlen = config.labels.length; j < jlen; ++j) {\n cfg = config.labels[j];\n key = cfg._key;\n\n label = new Label(cfg, ctx, el, i);\n label.$groups = {\n _set: datasetIndex,\n _key: key || DEFAULT_KEY\n };\n label.$context = {\n active: false,\n chart: chart,\n dataIndex: i,\n dataset: dataset,\n datasetIndex: datasetIndex\n };\n\n label.update(label.$context);\n el[EXPANDO_KEY].push(label);\n labels.push(label);\n }\n }\n }\n\n ctx.restore();\n\n // Store listeners at the chart level and per event type to optimize\n // cases where no listeners are registered for a specific event.\n merge(expando._listeners, config.listeners, {\n merger: function(event, target, source) {\n target[event] = target[event] || {};\n target[event][args.index] = source[event];\n expando._listened = true;\n }\n });\n },\n\n afterUpdate: function(chart) {\n chart[EXPANDO_KEY]._labels = layout.prepare(chart[EXPANDO_KEY]._datasets);\n },\n\n // Draw labels on top of all dataset elements\n // https://github.com/chartjs/chartjs-plugin-datalabels/issues/29\n // https://github.com/chartjs/chartjs-plugin-datalabels/issues/32\n afterDatasetsDraw: function(chart) {\n layout.draw(chart, chart[EXPANDO_KEY]._labels);\n },\n\n beforeEvent: function(chart, args) {\n // If there is no listener registered for this chart, `listened` will be false,\n // meaning we can immediately ignore the incoming event and avoid useless extra\n // computation for users who don't implement label interactions.\n if (chart[EXPANDO_KEY]._listened) {\n var event = args.event;\n switch (event.type) {\n case 'mousemove':\n case 'mouseout':\n handleMoveEvents(chart, event);\n break;\n case 'click':\n handleClickEvents(chart, event);\n break;\n }\n }\n },\n\n afterEvent: function(chart) {\n var expando = chart[EXPANDO_KEY];\n var previous = expando._actives;\n var actives = expando._actives = chart.getActiveElements();\n var updates = utils.arrayDiff(previous, actives);\n var i, ilen, j, jlen, update, label, labels;\n\n for (i = 0, ilen = updates.length; i < ilen; ++i) {\n update = updates[i];\n if (update[1]) {\n labels = update[0].element[EXPANDO_KEY] || [];\n for (j = 0, jlen = labels.length; j < jlen; ++j) {\n label = labels[j];\n label.$context.active = (update[1] === 1);\n label.update(label.$context);\n }\n }\n }\n\n if (expando._dirty || updates.length) {\n layout.update(expando._labels);\n chart.render();\n }\n\n delete expando._dirty;\n }\n};\n\nexport { plugin as default };\n","\n\n\n","export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function descending(a, b) {\n return a == null || b == null ? NaN\n : b < a ? -1\n : b > a ? 1\n : b >= a ? 0\n : NaN;\n}\n","import ascending from \"./ascending.js\";\nimport descending from \"./descending.js\";\n\nexport default function bisector(f) {\n let compare1, compare2, delta;\n\n // If an accessor is specified, promote it to a comparator. In this case we\n // can test whether the search value is (self-) comparable. We can’t do this\n // for a comparator (except for specific, known comparators) because we can’t\n // tell if the comparator is symmetric, and an asymmetric comparator can’t be\n // used to test whether a single value is comparable.\n if (f.length !== 2) {\n compare1 = ascending;\n compare2 = (d, x) => ascending(f(d), x);\n delta = (d, x) => f(d) - x;\n } else {\n compare1 = f === ascending || f === descending ? f : zero;\n compare2 = f;\n delta = f;\n }\n\n function left(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function right(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) <= 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function center(a, x, lo = 0, hi = a.length) {\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction zero() {\n return 0;\n}\n","export default function number(x) {\n return x === null ? NaN : +x;\n}\n\nexport function* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n","import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\n\nconst ascendingBisect = bisector(ascending);\nexport const bisectRight = ascendingBisect.right;\nexport const bisectLeft = ascendingBisect.left;\nexport const bisectCenter = bisector(number).center;\nexport default bisectRight;\n","export default function extent(values, valueof) {\n let min;\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n return [min, max];\n}\n","export class InternMap extends Map {\n constructor(entries, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (entries != null) for (const [key, value] of entries) this.set(key, value);\n }\n get(key) {\n return super.get(intern_get(this, key));\n }\n has(key) {\n return super.has(intern_get(this, key));\n }\n set(key, value) {\n return super.set(intern_set(this, key), value);\n }\n delete(key) {\n return super.delete(intern_delete(this, key));\n }\n}\n\nexport class InternSet extends Set {\n constructor(values, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (values != null) for (const value of values) this.add(value);\n }\n has(value) {\n return super.has(intern_get(this, value));\n }\n add(value) {\n return super.add(intern_set(this, value));\n }\n delete(value) {\n return super.delete(intern_delete(this, value));\n }\n}\n\nfunction intern_get({_intern, _key}, value) {\n const key = _key(value);\n return _intern.has(key) ? _intern.get(key) : value;\n}\n\nfunction intern_set({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) return _intern.get(key);\n _intern.set(key, value);\n return value;\n}\n\nfunction intern_delete({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) {\n value = _intern.get(key);\n _intern.delete(key);\n }\n return value;\n}\n\nfunction keyof(value) {\n return value !== null && typeof value === \"object\" ? value.valueOf() : value;\n}\n","export default function identity(x) {\n return x;\n}\n","import {InternMap} from \"internmap\";\nimport identity from \"./identity.js\";\n\nexport default function group(values, ...keys) {\n return nest(values, identity, identity, keys);\n}\n\nexport function groups(values, ...keys) {\n return nest(values, Array.from, identity, keys);\n}\n\nfunction flatten(groups, keys) {\n for (let i = 1, n = keys.length; i < n; ++i) {\n groups = groups.flatMap(g => g.pop().map(([key, value]) => [...g, key, value]));\n }\n return groups;\n}\n\nexport function flatGroup(values, ...keys) {\n return flatten(groups(values, ...keys), keys);\n}\n\nexport function flatRollup(values, reduce, ...keys) {\n return flatten(rollups(values, reduce, ...keys), keys);\n}\n\nexport function rollup(values, reduce, ...keys) {\n return nest(values, identity, reduce, keys);\n}\n\nexport function rollups(values, reduce, ...keys) {\n return nest(values, Array.from, reduce, keys);\n}\n\nexport function index(values, ...keys) {\n return nest(values, identity, unique, keys);\n}\n\nexport function indexes(values, ...keys) {\n return nest(values, Array.from, unique, keys);\n}\n\nfunction unique(values) {\n if (values.length !== 1) throw new Error(\"duplicate key\");\n return values[0];\n}\n\nfunction nest(values, map, reduce, keys) {\n return (function regroup(values, i) {\n if (i >= keys.length) return reduce(values);\n const groups = new InternMap();\n const keyof = keys[i++];\n let index = -1;\n for (const value of values) {\n const key = keyof(value, ++index, values);\n const group = groups.get(key);\n if (group) group.push(value);\n else groups.set(key, [value]);\n }\n for (const [key, values] of groups) {\n groups.set(key, regroup(values, i));\n }\n return map(groups);\n })(values, 0);\n}\n","const e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nfunction tickSpec(start, stop, count) {\n const step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log10(step)),\n error = step / Math.pow(10, power),\n factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;\n let i1, i2, inc;\n if (power < 0) {\n inc = Math.pow(10, -power) / factor;\n i1 = Math.round(start * inc);\n i2 = Math.round(stop * inc);\n if (i1 / inc < start) ++i1;\n if (i2 / inc > stop) --i2;\n inc = -inc;\n } else {\n inc = Math.pow(10, power) * factor;\n i1 = Math.round(start / inc);\n i2 = Math.round(stop / inc);\n if (i1 * inc < start) ++i1;\n if (i2 * inc > stop) --i2;\n }\n if (i2 < i1 && 0.5 <= count && count < 2) return tickSpec(start, stop, count * 2);\n return [i1, i2, inc];\n}\n\nexport default function ticks(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n if (!(count > 0)) return [];\n if (start === stop) return [start];\n const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);\n if (!(i2 >= i1)) return [];\n const n = i2 - i1 + 1, ticks = new Array(n);\n if (reverse) {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) * inc;\n } else {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) * inc;\n }\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n return tickSpec(start, stop, count)[2];\n}\n\nexport function tickStep(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);\n return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n}\n","export default function range(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n","export default function sum(values, valueof) {\n let sum = 0;\n if (valueof === undefined) {\n for (let value of values) {\n if (value = +value) {\n sum += value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if (value = +valueof(value, ++index, values)) {\n sum += value;\n }\n }\n }\n return sum;\n}\n","var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n","import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don’t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n","import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn’t worried about “live” collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don’t; we’d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n return Array.from(this);\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n","import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n","import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n","import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","export default function(event) {\n let sourceEvent;\n while (sourceEvent = event.sourceEvent) event = sourceEvent;\n return event;\n}\n","import sourceEvent from \"./sourceEvent.js\";\n\nexport default function(event, node) {\n event = sourceEvent(event);\n if (node === undefined) node = event.currentTarget;\n if (node) {\n var svg = node.ownerSVGElement || node;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n if (node.getBoundingClientRect) {\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n }\n }\n return [event.pageX, event.pageY];\n}\n","import array from \"./array.js\";\nimport {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([document.querySelectorAll(selector)], [document.documentElement])\n : new Selection([array(selector)], root);\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export default x => () => x;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","export default function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n","import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n","import value from \"./value.js\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return Math.round(a * (1 - t) + b * t);\n };\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n","import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n","import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n","import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n","import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n","import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n","import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n","import {set} from \"./schedule.js\";\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== \"function\") throw new Error;\n set(this, id).ease = v;\n };\n}\n\nexport default function(value) {\n if (typeof value !== \"function\") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n","import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n","import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n","import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n","function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n","import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n","import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n","import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n","import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n","function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n","import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n","function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n","import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n","import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n","import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_easeVarying from \"./easeVarying.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n selectChild: selection_prototype.selectChild,\n selectChildren: selection_prototype.selectChildren,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n","export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n","import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n","import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n","const pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction append(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n let d = Math.floor(digits);\n if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n if (d > 15) return append;\n const k = 10 ** d;\n return function(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n}\n\nexport class Path {\n constructor(digits) {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n this._append = digits == null ? append : appendRound(digits);\n }\n moveTo(x, y) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n }\n closePath() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._append`Z`;\n }\n }\n lineTo(x, y) {\n this._append`L${this._x1 = +x},${this._y1 = +y}`;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this._append`Q${+x1},${+y1},${this._x1 = +x},${this._y1 = +y}`;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this._append`C${+x1},${+y1},${+x2},${+y2},${this._x1 = +x},${this._y1 = +y}`;\n }\n arcTo(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._append`M${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._append`L${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Otherwise, draw an arc!\n else {\n let x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._append`L${x1 + t01 * x01},${y1 + t01 * y01}`;\n }\n\n this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x1 + t21 * x21},${this._y1 = y1 + t21 * y21}`;\n }\n }\n arc(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._append`M${x0},${y0}`;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._append`L${x0},${y0}`;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._append`A${r},${r},0,1,${cw},${x - dx},${y - dy}A${r},${r},0,1,${cw},${this._x1 = x0},${this._y1 = y0}`;\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._append`A${r},${r},0,${+(da >= pi)},${cw},${this._x1 = x + r * Math.cos(a1)},${this._y1 = y + r * Math.sin(a1)}`;\n }\n }\n rect(x, y, w, h) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${w = +w}v${+h}h${-w}Z`;\n }\n toString() {\n return this._;\n }\n}\n\nexport function path() {\n return new Path;\n}\n\n// Allow instanceof d3.path\npath.prototype = Path.prototype;\n\nexport function pathRound(digits = 3) {\n return new Path(+digits);\n}\n","export default function(x) {\n return Math.abs(x = Math.round(x)) >= 1e21\n ? x.toLocaleString(\"en\").replace(/,/g, \"\")\n : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nexport function formatDecimalParts(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatDecimal from \"./formatDecimal.js\";\nimport formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n \"%\": (x, p) => (x * 100).toFixed(p),\n \"b\": (x) => Math.round(x).toString(2),\n \"c\": (x) => x + \"\",\n \"d\": formatDecimal,\n \"e\": (x, p) => x.toExponential(p),\n \"f\": (x, p) => x.toFixed(p),\n \"g\": (x, p) => x.toPrecision(p),\n \"o\": (x) => Math.round(x).toString(8),\n \"p\": (x, p) => formatRounded(x * 100, p),\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": (x) => Math.round(x).toString(16).toUpperCase(),\n \"x\": (x) => Math.round(x).toString(16)\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n minus = locale.minus === undefined ? \"−\" : locale.minus + \"\",\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","export function initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: {\n if (typeof domain === \"function\") this.interpolator(domain);\n else this.range(domain);\n break;\n }\n default: {\n this.domain(domain);\n if (typeof interpolator === \"function\") this.interpolator(interpolator);\n else this.range(interpolator);\n break;\n }\n }\n return this;\n}\n","import {InternMap} from \"d3-array\";\nimport {initRange} from \"./init.js\";\n\nexport const implicit = Symbol(\"implicit\");\n\nexport default function ordinal() {\n var index = new InternMap(),\n domain = [],\n range = [],\n unknown = implicit;\n\n function scale(d) {\n let i = index.get(d);\n if (i === undefined) {\n if (unknown !== implicit) return unknown;\n index.set(d, i = domain.push(d) - 1);\n }\n return range[i % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = new InternMap();\n for (const value of _) {\n if (index.has(value)) continue;\n index.set(value, domain.push(value) - 1);\n }\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal(domain, range).unknown(unknown);\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n","import {range as sequence} from \"d3-array\";\nimport {initRange} from \"./init.js\";\nimport ordinal from \"./ordinal.js\";\n\nexport default function band() {\n var scale = ordinal().unknown(undefined),\n domain = scale.domain,\n ordinalRange = scale.range,\n r0 = 0,\n r1 = 1,\n step,\n bandwidth,\n round = false,\n paddingInner = 0,\n paddingOuter = 0,\n align = 0.5;\n\n delete scale.unknown;\n\n function rescale() {\n var n = domain().length,\n reverse = r1 < r0,\n start = reverse ? r1 : r0,\n stop = reverse ? r0 : r1;\n step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n if (round) step = Math.floor(step);\n start += (stop - start - step * (n - paddingInner)) * align;\n bandwidth = step * (1 - paddingInner);\n if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n var values = sequence(n).map(function(i) { return start + step * i; });\n return ordinalRange(reverse ? values.reverse() : values);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.range = function(_) {\n return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1];\n };\n\n scale.rangeRound = function(_) {\n return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale();\n };\n\n scale.bandwidth = function() {\n return bandwidth;\n };\n\n scale.step = function() {\n return step;\n };\n\n scale.round = function(_) {\n return arguments.length ? (round = !!_, rescale()) : round;\n };\n\n scale.padding = function(_) {\n return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;\n };\n\n scale.paddingInner = function(_) {\n return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;\n };\n\n scale.paddingOuter = function(_) {\n return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;\n };\n\n scale.align = function(_) {\n return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n };\n\n scale.copy = function() {\n return band(domain(), [r0, r1])\n .round(round)\n .paddingInner(paddingInner)\n .paddingOuter(paddingOuter)\n .align(align);\n };\n\n return initRange.apply(rescale(), arguments);\n}\n\nfunction pointish(scale) {\n var copy = scale.copy;\n\n scale.padding = scale.paddingOuter;\n delete scale.paddingInner;\n delete scale.paddingOuter;\n\n scale.copy = function() {\n return pointish(copy());\n };\n\n return scale;\n}\n\nexport function point() {\n return pointish(band.apply(null, arguments).paddingInner(1));\n}\n","export default function constants(x) {\n return function() {\n return x;\n };\n}\n","export default function number(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport constant from \"./constant.js\";\nimport number from \"./number.js\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n return x;\n}\n\nfunction normalize(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(a, b) {\n var t;\n if (a > b) t = a, a = b, b = t;\n return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport function transformer() {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n transform,\n untransform,\n unknown,\n clamp = identity,\n piecewise,\n output,\n input;\n\n function rescale() {\n var n = Math.min(domain.length, range.length);\n if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n piecewise = n > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n\n scale.invert = function(y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = Array.from(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\n\nexport default function continuous() {\n return transformer()(identity, identity);\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function tickFormat(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\nimport tickFormat from \"./tickFormat.js\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain();\n var i0 = 0;\n var i1 = d.length - 1;\n var start = d[i0];\n var stop = d[i1];\n var prestep;\n var step;\n var maxIter = 10;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n \n while (maxIter-- > 0) {\n step = tickIncrement(start, stop, count);\n if (step === prestep) {\n d[i0] = start\n d[i1] = stop\n return domain(d);\n } else if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n } else {\n break;\n }\n prestep = step;\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous();\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n initRange.apply(scale, arguments);\n\n return linearish(scale);\n}\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export const abs = Math.abs;\nexport const atan2 = Math.atan2;\nexport const cos = Math.cos;\nexport const max = Math.max;\nexport const min = Math.min;\nexport const sin = Math.sin;\nexport const sqrt = Math.sqrt;\n\nexport const epsilon = 1e-12;\nexport const pi = Math.PI;\nexport const halfPi = pi / 2;\nexport const tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","import {Path} from \"d3-path\";\n\nexport function withPath(shape) {\n let digits = 3;\n\n shape.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) {\n digits = null;\n } else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n return shape;\n };\n\n return () => new Path(digits);\n}\n","import constant from \"./constant.js\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math.js\";\nimport {withPath} from \"./path.js\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null,\n path = withPath(arc);\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle. If this\n // intersection fails, it’s probably because the arc is too small, so\n // disable the corner radius entirely.\n if (da < pi) {\n if (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10)) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n } else {\n rc0 = rc1 = 0;\n }\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","export var slice = Array.prototype.slice;\n\nexport default function(x) {\n return typeof x === \"object\" && \"length\" in x\n ? x // Array, TypedArray, NodeList, array-like\n : Array.from(x); // Map, Set, iterable, string, or anything else\n}\n","export default function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n","export default function(d) {\n return d;\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport descending from \"./descending.js\";\nimport identity from \"./identity.js\";\nimport {tau} from \"./math.js\";\n\nexport default function() {\n var value = identity,\n sortValues = descending,\n sort = null,\n startAngle = constant(0),\n endAngle = constant(tau),\n padAngle = constant(0);\n\n function pie(data) {\n var i,\n n = (data = array(data)).length,\n j,\n k,\n sum = 0,\n index = new Array(n),\n arcs = new Array(n),\n a0 = +startAngle.apply(this, arguments),\n da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)),\n a1,\n p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\n pa = p * (da < 0 ? -1 : 1),\n v;\n\n for (i = 0; i < n; ++i) {\n if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\n sum += v;\n }\n }\n\n // Optionally sort the arcs by previously-computed values or by data.\n if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });\n else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });\n\n // Compute the arcs! They are stored in the original data's order.\n for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\n j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\n data: data[j],\n index: i,\n value: v,\n startAngle: a0,\n endAngle: a1,\n padAngle: p\n };\n }\n\n return arcs;\n }\n\n pie.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), pie) : value;\n };\n\n pie.sortValues = function(_) {\n return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\n };\n\n pie.sort = function(_) {\n return arguments.length ? (sort = _, sortValues = null, pie) : sort;\n };\n\n pie.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : startAngle;\n };\n\n pie.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : endAngle;\n };\n\n pie.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : padAngle;\n };\n\n return pie;\n}\n","export default function(series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n s0 = s1, s1 = series[order[i]];\n for (j = 0; j < m; ++j) {\n s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n }\n }\n}\n","export default function(series) {\n var n = series.length, o = new Array(n);\n while (--n >= 0) o[n] = n;\n return o;\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport offsetNone from \"./offset/none.js\";\nimport orderNone from \"./order/none.js\";\n\nfunction stackValue(d, key) {\n return d[key];\n}\n\nfunction stackSeries(key) {\n const series = [];\n series.key = key;\n return series;\n}\n\nexport default function() {\n var keys = constant([]),\n order = orderNone,\n offset = offsetNone,\n value = stackValue;\n\n function stack(data) {\n var sz = Array.from(keys.apply(this, arguments), stackSeries),\n i, n = sz.length, j = -1,\n oz;\n\n for (const d of data) {\n for (i = 0, ++j; i < n; ++i) {\n (sz[i][j] = [0, +value(d, sz[i].key, j, data)]).data = d;\n }\n }\n\n for (i = 0, oz = array(order(sz)); i < n; ++i) {\n sz[oz[i]].index = i;\n }\n\n offset(sz, oz);\n return sz;\n }\n\n stack.keys = function(_) {\n return arguments.length ? (keys = typeof _ === \"function\" ? _ : constant(Array.from(_)), stack) : keys;\n };\n\n stack.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), stack) : value;\n };\n\n stack.order = function(_) {\n return arguments.length ? (order = _ == null ? orderNone : typeof _ === \"function\" ? _ : constant(Array.from(_)), stack) : order;\n };\n\n stack.offset = function(_) {\n return arguments.length ? (offset = _ == null ? offsetNone : _, stack) : offset;\n };\n\n return stack;\n}\n","export default function(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {\n for (yp = yn = 0, i = 0; i < n; ++i) {\n if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) {\n d[0] = yp, d[1] = yp += dy;\n } else if (dy < 0) {\n d[1] = yn, d[0] = yn += dy;\n } else {\n d[0] = 0, d[1] = dy;\n }\n }\n }\n}\n","export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n while (!node.__zoom) if (!(node = node.parentNode)) return identity;\n return node.__zoom;\n}\n","import * as d3 from \"d3\"\nimport { roundNumber} from \"@/utils/math\"\nimport type { ChartData, ChartOptions } from '@/models/chartModels'\n\nimport { useProjectStore } from \"@/stores/main\"\n\n/**\n * For use with aggregate charts, places the total value in the center of the chart\n * @param graph \n * @param total \n * @param w \n * @param h \n * @param unit \n * @returns \n */\nexport function aggregateCenter(graph: d3.Selection, total: number , w: number, h: number, unit: string) {\n const textElement = graph.append(\"text\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dy\", \"0.35em\")\n .attr(\"x\", w / 2)\n .attr(\"y\", h / 2)\n .style(\"font-weight\", \"bold\")\n \n textElement.append(\"tspan\")\n .text(roundNumber(total, 1))\n .classed(\"text-md\", true)\n .attr(\"x\", w / 2)\n .attr(\"dy\", \"-0.2em\")\n textElement.append(\"tspan\")\n .text(unit)\n .classed(\"text-xs\", true)\n .attr(\"x\", w / 2)\n .attr(\"dy\", \"1.2em\")\n return textElement\n}\n\n/**\n * Add centertext of percentage that is within span.\n * @param graph \n * @param span Span to check within like [50, 100]\n * @param value This is the value we check is within span, like DL results\n * @param graphValue This is the actual value that we calculate percentage from like m2\n * @param w Width\n * @param h Height\n */\nexport function spanPercentCenter(graph: d3.Selection, span: number[], value: number[], graphValue: number[], w: number, h: number) {\n span.sort((a, b) => a - b)\n const result = checkValuesInSpan(value, span[0], span[1])\n const spanPercent = calculatePercent(result, graphValue)\n const textElement = graph.append(\"text\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dy\", \"0.35em\")\n .attr(\"x\", w / 2)\n .attr(\"y\", h / 2)\n .style(\"font-weight\", \"bold\")\n \n textElement.append(\"tspan\")\n .text(`${span[0]} - ${span[1]}`)\n .classed(\"text-md\", true)\n .attr(\"x\", w / 2)\n .attr(\"dy\", \"-0.2em\")\n textElement.append(\"tspan\")\n .text(`${spanPercent}%`)\n .classed(\"text-md\", true)\n .attr(\"x\", w / 2)\n .attr(\"dy\", \"1.2em\")\n return textElement\n function isValueInSpan(value: number, spanStart: number, spanEnd: number): boolean {\n return value >= spanStart && value <= spanEnd\n }\n \n function checkValuesInSpan(values: number[], spanStart: number, spanEnd: number): boolean[] {\n return values.map(value => isValueInSpan(value, spanStart, spanEnd))\n }\n function calculatePercent(result: boolean[], graphValues: number[]): number {\n const filteredSum = result.reduce((sum, isTrue, index) => {\n return isTrue ? sum + graphValues[index] : sum\n }, 0)\n const totalSum = graphValues.reduce((sum, value) => sum + value, 0)\n if (totalSum === 0) return 0\n return Math.round((filteredSum / totalSum) * 100)\n }\n}\n\nexport function parameterCenter(graph: d3.Selection, parameterValue: number, total: number, w: number, h: number) {\n const textElement = graph.append(\"text\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dy\", \"0.35em\")\n .attr(\"x\", w / 2)\n .attr(\"y\", h / 2)\n .style(\"font-weight\", \"bold\")\n \n textElement.append(\"tspan\")\n .text(parameterValue)\n .classed(\"text-md\", true)\n .attr(\"x\", w / 2)\n .attr(\"dy\", \"-0.2em\")\n return textElement\n}\n\n/**\n * Sets selected objects from charts\n * @param ids to select in viewer\n */\nexport function updateSelectedObjects(ids: string[]) {\n const projectStore = useProjectStore()\n projectStore.setObjectsById(ids)\n}\n\n/**\n * Create the same base chart options and object for all charts\n * @param options \n * @param containerElement \n * @returns \n */\nexport function createBaseChart(options: ChartOptions, containerElement: HTMLElement) {\n const width = options.width || 600\n const height = options.height || 400\n const margin = options.margin || { top: 20, right: 20, bottom: 20, left: 20 }\n\n const svg = d3.select(containerElement)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n\n return { svg, width, height, margin }\n}\n\n\n/**\n * Creates a style for tooltips of charts\n * @param tooltipElement \n * @returns \n */\nexport function createTooltip(tooltipElement: HTMLDivElement) {\n return d3.select(tooltipElement)\n .style('position', 'absolute')\n .style('background-color', 'white')\n .style('border', 'solid')\n .style('border-width', '2px')\n .style('border-radius', '5px')\n .style('padding', '5px')\n .style('opacity', 0)\n}\n\n/**\n * Creates generalized mouse event handlers for charts\n * @param tooltipDiv \n * @param container \n * @returns \n */\nexport function createMouseEventHandlers(tooltipDiv: d3.Selection, container: HTMLElement) {\n function mouseover(event: MouseEvent, data: any) {\n tooltipDiv.style('opacity', 1)\n d3.select(event.currentTarget)\n .style('stroke', 'black')\n .style('opacity', 1)\n }\n\n function mousemove(event: MouseEvent, data: any) {\n const [mouseX, mouseY] = d3.pointer(event, container)\n const containerRect = container.getBoundingClientRect()\n const tooltipRect = tooltipDiv.node()!.getBoundingClientRect()\n\n let left = mouseX + 15\n let top = mouseY - 28\n\n // Adjust left and top to keep the tooltip within the container\n if (left + tooltipRect.width > containerRect.width) {\n left = event.clientX - containerRect.left - tooltipRect.width - 15\n }\n if (left < 0) {\n left = 10\n }\n if (top + tooltipRect.height > containerRect.height) {\n top = containerRect.height - tooltipRect.height - 10\n }\n if (top < 0) {\n top = 10\n }\n\n tooltipDiv\n .html(data.tooltipContent)\n .style('left', `${left}px`)\n .style('top', `${top}px`)\n }\n\n function mouseleave(event: MouseEvent, data: any) {\n tooltipDiv.style('opacity', 0)\n d3.select(event.currentTarget)\n .style('stroke', null)\n .style('opacity', 0.8)\n }\n\n return { mouseover, mousemove, mouseleave }\n}\n\n/**\n * Process data for charts\n * @param data \n * @param totalValue \n * @returns \n */\nexport function groupChartData(data: ChartData[], totalValue: number) {\n let cumulative = 0\n return data.map((d) => {\n cumulative += Math.abs(d.value)\n const percent = totalValue > 0 ? (d.value / totalValue) * 100 : 0\n return {\n ...d,\n cumulative: cumulative - Math.abs(d.value),\n percent,\n }\n }).filter((d) => d.value !== 0)\n}\n","\n\n\n\n\n","\n\n\n\n","\n\n","\n\n","\n\n\n\n","\n\n","\n\n","\n\n","\n\n\n","import type { LifeCycleStageEmission } from \"@/models/material\"\nimport { Source } from \"@/models/material\"\nimport { useMaterialStore } from \"@/stores/material\"\nimport { getEPDList } from \"@/utils/EPDUtils\"\n\n/**\n * Enum for countries to search from\n */\nexport enum Country {\n Sweden = \"Sweden\",\n Norway = \"Norway\",\n Denmark = \"Denmark\",\n Finland = \"Finland\",\n Germany = \"Germany\",\n Europe = \"Europe\",\n}\n\n/**\n * Reduced list for common use cases\n */\nexport enum StandardBuildingMaterialType {\n AluminiumElements = \"Aluminium elements\",\n Asphalt = \"Asphalt\",\n BioBasedInsulation = \"Bio-based insulation\",\n Boards = \"Boards\",\n Bricks = \"Bricks\",\n Cement = \"Cement\",\n Concrete = \"Concrete\",\n ConcreteBlocks = \"Concrete blocks\",\n CurtainWall = \"Curtain wall\",\n Doors = \"Doors\",\n /*ExteriorSubstrate = \"Exterior Substrate\",\n FibreCementBoard = \"Fibre Cement board\",\n FramesAndProfiles = \"Frames and profiles\",\n */\n Generic = \"Generic\",\n Gypsum = \"Gypsum\",\n /*Hemp = \"Hemp\",\n Infill = \"Infill\",\n */\n MineralWool = \"Mineral wool\",\n ModifiedWood = \"Modified wood\",\n Mortar = \"Mortar\",\n /*PaintExterior = \"Paint (Exterior)\",\n PaintInterior = \"Paint (Interior)\",\n Plasterboards = \"Plasterboards\",\n PlasticFlooring = \"Plastic flooring\",\n PlasticProfiles = \"Plastic profiles\",\n Primer = \"Primer\",\n ReinforcementSteel = \"Reinforcement steel\",\n RoofingMembranes = \"Roofing membranes\",\n RubberFlooring = \"Rubber flooring\",\n Stones = \"Stones\",\n StructuralTimber = \"Structural timber\",\n TextileFlooring = \"Textile flooring\",\n Tiles = \"Tiles\",*/\n TimberBoards = \"Timber Boards\",\n TimberElements = \"Timber Elements\",\n TimberFlooring = \"Timber flooring\",\n /*WaterproofingMembranes = \"Waterproofing membranes\",\n WindowFittings = \"Window fittings\",*/\n Windows = \"Windows\"\n}\n\n/**\n * Enum for all Building Material types\n */\nexport enum FullBuildingMaterialType {\n AccessoriesForWindowsWallingAndDoors = \"Accessories for windows, walling and doors\",\n Aggregates = \"Aggregates\",\n AirConditioningAndVentilationSystem = \"Air conditioning and ventilation system\",\n AluminiumElements = \"Aluminium elements\",\n Asphalt = \"Asphalt\",\n BioBasedInsulation = \"Bio-based insulation\",\n Boards = \"Boards\",\n Bricks = \"Bricks\",\n CalciumSilicateInsulation = \"Calcium Silicate Insulation\",\n Cement = \"Cement\",\n Clay = \"Clay\",\n CompositeBoards = \"Composite Boards\",\n Concrete = \"Concrete\",\n ConcreteBlocks = \"Concrete blocks\",\n CopperElements = \"Copper elements\",\n CurtainWall = \"Curtain wall\",\n DaylightSystemsAndSmokeOrHeatControlSystems = \"Daylight systems and smoke or heat control systems\",\n DaylightSystemsAndSmokeHeatControlSystems = \"Daylight systems and smoke/heat control systems\",\n Doors = \"Doors\",\n DriveSystemWindowsAndDoors = \"Drive system windows and doors\",\n ElectricalFireProtection = \"Electrical fire protection\",\n ElectricalSystem = \"Electrical system\",\n EndOfLifeProcesses = \"End-of-life processes\",\n EnergyCarrierDeliveryFreeUser = \"Energy carrier - delivery free user\",\n Escalator = \"Escalator\",\n ExpandedPerlit = \"Expanded perlit\",\n ExpandedPolystyreneEPS = \"Expanded polystyrene (EPS)\",\n ExteriorSubstrate = \"Exterior Substrate\",\n ExternalThermalInsulationCompositeSystemETICS = \"External Thermal insulation composite system (ETICS)\",\n ExtrudedPolystyreneXPS = \"Extruded polystyrene (XPS)\",\n FibreCementBoard = \"Fibre Cement board\",\n FireProtectionCoating = \"Fire protection coating\",\n FireProtectionDevices = \"Fire protection devices\",\n FoilsAndFleeces = \"Foils and fleeces\",\n FramesAndProfiles = \"Frames and profiles\",\n Generic = \"Generic\",\n Gypsum = \"Gypsum\",\n HeatingSystems = \"Heating systems\",\n Hemp = \"Hemp\",\n Infill = \"Infill\",\n InsulationFoam = \"Insulation foam\",\n IronElements = \"Iron elements\",\n LeadElements = \"Lead elements\",\n Lime = \"Lime\",\n MineralWool = \"Mineral wool\",\n ModifiedWood = \"Modified wood\",\n Mortar = \"Mortar\",\n Others = \"Others\",\n PaintExterior = \"Paint (Exterior)\",\n PaintInterior = \"Paint (Interior)\",\n PassengerTransportPersonKm = \"Passenger transport [person km]\",\n Pigments = \"Pigments\",\n Plasterboards = \"Plasterboards\",\n PlasticFlooring = \"Plastic flooring\",\n PlasticProfiles = \"Plastic profiles\",\n Primer = \"Primer\",\n ProcessesAtBuildingSite = \"Processes at building site\",\n ReinforcementSteel = \"Reinforcement steel\",\n RendersAndPlasters = \"Renders and plasters\",\n Resin = \"Resin\",\n RigidFoam = \"Rigid foam\",\n RigidFoamBoards = \"Rigid foam boards\",\n RoofingMembranes = \"Roofing membranes\",\n RubberFlooring = \"Rubber flooring\",\n SanitaryWare = \"Sanitary ware\",\n Screed = \"Screed\",\n SealingMaterials = \"Sealing materials\",\n SiliciumDioxideBased = \"Silicium dioxide based\",\n SolarPanel = \"Solar Panel\",\n StainlessSteelTubes = \"Stainless steel tubes\",\n SteelSheets = \"Steel sheets\",\n Stones = \"Stones\",\n StructuralTimber = \"Structural timber\",\n SystemCompositions = \"System compositions\",\n TextileFlooring = \"Textile flooring\",\n Tiles = \"Tiles\",\n TimberBoards = \"Timber Boards\",\n TimberElements = \"Timber Elements\",\n TimberFlooring = \"Timber flooring\",\n TransportOfGoodsTKm = \"Transport of goods [t km]\",\n TransportationSystem = \"Transportation system\",\n TreatmentAndCoatingOfMetals = \"Treatment and coating of metals\",\n Tubes = \"Tubes\",\n Use = \"Use\",\n VarnishesAndStains = \"Varnishes and stains\",\n WaterproofingMembranes = \"Waterproofing membranes\",\n WindowFittings = \"Window fittings\",\n Windows = \"Windows\"\n}\n\nexport interface RevaluData {\n id: string\n location: string\n version: string\n registration_number: string\n name: string\n manufacturer: string\n valid_until: number\n valid_from: number\n declared_unit: string\n thickness: number | null\n grammage: number | null\n gross_density: number | null\n bulk_density: number | null\n linear_density: number | null\n standard: string\n subtype: string\n version_last_update_date: string\n lambda: number | null\n u_value: number | null\n r_value: number | null\n source: SourceInfo\n gwp: LifeCycleStageEmission\n gwp_fossil: LifeCycleStageEmission\n gwp_biogenic: LifeCycleStageEmission\n gwp_luluc: LifeCycleStageEmission\n fw: LifeCycleStageEmission\n pert: LifeCycleStageEmission\n penrt: LifeCycleStageEmission\n energy_mix_percentage: LifeCycleStageEmission\n custom_attribute: any \n additional_data: AdditionalData\n all_documents: Document[]\n data_quality_warnings: any | null \n certificates: any[]\n}\n\ninterface SourceInfo {\n name: string\n url: string\n}\n\ninterface AdditionalData {\n epd_pdf_url: string\n}\n\ninterface Document {\n document_type: string\n document_url: string\n}\n\nexport const getRevaluBaseList = async() => {\n const allCountries: Country[] = Object.values(Country)\n const materialStore = useMaterialStore()\n\n for (const materialType in StandardBuildingMaterialType) {\n const products = await getEPDList({\n \"material_type\": StandardBuildingMaterialType[materialType], \n \"country\": allCountries\n })\n\n for (const product of products) {\n product.metaData = { materialType: StandardBuildingMaterialType[materialType] }\n product.source = Source.Revalu\n \n materialStore.addMaterial(product)\n }\n }\n}","import { useProjectStore } from '@/stores/main'\nimport { useMaterialStore } from '@/stores/material'\n\nimport { getAssemblyList } from '@/utils/material'\nimport { getRevaluBaseList } from '@/models/revaluDataSource'\n\n/**\n * Preload data needed for the dashboard view\n */\nexport async function preloadDashboardData() {\n const projectStore = useProjectStore()\n const materialStore = useMaterialStore()\n\n try {\n // Example: Preload available parameter list\n await projectStore.getAvailableParameterList()\n\n materialStore.materialsFromJson()\n\t\tgetAssemblyList()\n\t\tgetRevaluBaseList()\n\t\t\n\n // Add more preload calls here if needed\n console.log('Dashboard data preloaded successfully.')\n } catch (error) {\n console.error('Error preloading dashboard data:', error)\n }\n}\n","\n\n","\n\n","\n\n","\n\n","\n","\n\n","\n\n","\n\n\n","const name = 'VueColor';\n// 自定义组件前缀\nconst prefix = '';\nconst cssPrefix = '';\nconst size = 'medium';\n\nexport { cssPrefix, name, prefix, size };\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport { styleInject as s };\n","import { prefix } from '../defaultConfig.js';\n\nconst install = function (app, options) {\n const { componentPrefix = prefix } = options || {};\n app.component(`${componentPrefix}${this.name}`, this);\n};\n\nexport { install };\n","import { openBlock, createElementBlock, normalizeStyle } from 'vue';\nimport { s as styleInject } from '../../style-inject.es-746bb8ed.js';\nimport { install } from '../../utils/compoent.js';\nimport '../../defaultConfig.js';\n\nconst _checkboardCache = {};\n\nvar script = {\n name: 'Checkboard',\n props: {\n size: {\n type: [Number, String],\n default: 8,\n },\n white: {\n type: String,\n default: '#fff',\n },\n grey: {\n type: String,\n default: '#e6e6e6',\n },\n },\n computed: {\n bgStyle() {\n return {\n 'background-image': `url(${getCheckboard(this.white, this.grey, this.size)})`,\n };\n },\n },\n};\n\n/**\n * get base 64 data by canvas\n *\n * @param {String} c1 hex color\n * @param {String} c2 hex color\n * @param {Number} size\n */\n\nfunction renderCheckboard(c1, c2, size) {\n // Dont Render On Server\n if (typeof document === 'undefined')\n return null;\n\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = size * 2;\n const ctx = canvas.getContext('2d');\n // If no context can be found, return early.\n if (!ctx)\n return null;\n\n ctx.fillStyle = c1;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.fillStyle = c2;\n ctx.fillRect(0, 0, size, size);\n ctx.translate(size, size);\n ctx.fillRect(0, 0, size, size);\n return canvas.toDataURL();\n}\n\n/**\n * get checkboard base data and cache\n *\n * @param {String} c1 hex color\n * @param {String} c2 hex color\n * @param {Number} size\n */\n\nfunction getCheckboard(c1, c2, size) {\n const key = `${c1},${c2},${size}`;\n\n if (_checkboardCache[key])\n return _checkboardCache[key];\n\n const checkboard = renderCheckboard(c1, c2, size);\n _checkboardCache[key] = checkboard;\n return checkboard;\n}\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (openBlock(), createElementBlock(\"div\", {\n class: \"vc-checkerboard\",\n style: normalizeStyle($options.bgStyle)\n }, null, 4 /* STYLE */))\n}\n\nvar css_248z = \".vc-checkerboard{background-size:contain;bottom:0;left:0;position:absolute;right:0;top:0}\";\nstyleInject(css_248z);\n\nscript.render = render;\nscript.__file = \"src/components/checkboard/checkboard.vue\";\n\nscript.install = install;\n\nexport { script as default };\n","import script$1 from '../checkboard/index.js';\nimport { resolveComponent, openBlock, createElementBlock, createElementVNode, createVNode, normalizeStyle } from 'vue';\nimport { s as styleInject } from '../../style-inject.es-746bb8ed.js';\nimport { install } from '../../utils/compoent.js';\nimport '../../defaultConfig.js';\n\nvar script = {\n name: 'Alpha',\n components: {\n Checkboard: script$1,\n },\n props: {\n value: Object,\n onChange: Function,\n },\n computed: {\n colors() {\n return this.value;\n },\n gradientColor() {\n const { rgba } = this.colors;\n const rgbStr = [rgba.r, rgba.g, rgba.b].join(',');\n return `linear-gradient(to right, rgba(${rgbStr}, 0) 0%, rgba(${rgbStr}, 1) 100%)`;\n },\n },\n methods: {\n handleChange(e, skip) {\n !skip && e.preventDefault();\n const { container } = this.$refs;\n if (!container) {\n // for some edge cases, container may not exist. see #220\n return;\n }\n const containerWidth = container.clientWidth;\n\n const xOffset = container.getBoundingClientRect().left + window.pageXOffset;\n const pageX = e.pageX || (e.touches ? e.touches[0].pageX : 0);\n const left = pageX - xOffset;\n\n let a;\n if (left < 0)\n a = 0;\n else if (left > containerWidth)\n a = 1;\n else\n a = Math.round(left * 100 / containerWidth) / 100;\n\n if (this.colors.a !== a) {\n this.$emit('change', {\n h: this.colors.hsl.h,\n s: this.colors.hsl.s,\n l: this.colors.hsl.l,\n a,\n source: 'rgba',\n });\n }\n },\n handleMouseDown(e) {\n this.handleChange(e, true);\n window.addEventListener('mousemove', this.handleChange);\n window.addEventListener('mouseup', this.handleMouseUp);\n },\n handleMouseUp() {\n this.unbindEventListeners();\n },\n unbindEventListeners() {\n window.removeEventListener('mousemove', this.handleChange);\n window.removeEventListener('mouseup', this.handleMouseUp);\n },\n },\n};\n\nconst _hoisted_1 = { class: \"vc-alpha\" };\nconst _hoisted_2 = { class: \"vc-alpha-checkboard-wrap\" };\nconst _hoisted_3 = /*#__PURE__*/createElementVNode(\"div\", { class: \"vc-alpha-picker\" }, null, -1 /* HOISTED */);\nconst _hoisted_4 = [\n _hoisted_3\n];\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_Checkboard = resolveComponent(\"Checkboard\");\n\n return (openBlock(), createElementBlock(\"div\", _hoisted_1, [\n createElementVNode(\"div\", _hoisted_2, [\n createVNode(_component_Checkboard)\n ]),\n createElementVNode(\"div\", {\n class: \"vc-alpha-gradient\",\n style: normalizeStyle({ background: $options.gradientColor })\n }, null, 4 /* STYLE */),\n createElementVNode(\"div\", {\n ref: \"container\",\n class: \"vc-alpha-container\",\n onMousedown: _cache[0] || (_cache[0] = (...args) => ($options.handleMouseDown && $options.handleMouseDown(...args))),\n onTouchmove: _cache[1] || (_cache[1] = (...args) => ($options.handleChange && $options.handleChange(...args))),\n onTouchstart: _cache[2] || (_cache[2] = (...args) => ($options.handleChange && $options.handleChange(...args)))\n }, [\n createElementVNode(\"div\", {\n class: \"vc-alpha-pointer\",\n style: normalizeStyle({ left: `${$options.colors.a * 100}%` })\n }, _hoisted_4, 4 /* STYLE */)\n ], 544 /* HYDRATE_EVENTS, NEED_PATCH */)\n ]))\n}\n\nvar css_248z = \".vc-alpha,.vc-alpha-checkboard-wrap{bottom:0;left:0;position:absolute;right:0;top:0}.vc-alpha-checkboard-wrap{overflow:hidden}.vc-alpha-gradient{bottom:0;left:0;position:absolute;right:0;top:0}.vc-alpha-container{cursor:pointer;height:100%;margin:0 3px;position:relative;z-index:2}.vc-alpha-pointer{position:absolute;z-index:2}.vc-alpha-picker{background:#fff;border-radius:1px;box-shadow:0 0 2px rgba(0,0,0,.6);cursor:pointer;height:8px;margin-top:1px;transform:translateX(-2px);width:4px}\";\nstyleInject(css_248z);\n\nscript.render = render;\nscript.__file = \"src/components/alpha/alpha.vue\";\n\nscript.install = install;\n\nexport { script as default };\n","/**\n * Take input from [0, n] and return it as [0, 1]\n * @hidden\n */\nexport function bound01(n, max) {\n if (isOnePointZero(n)) {\n n = '100%';\n }\n var isPercent = isPercentage(n);\n n = max === 360 ? n : Math.min(max, Math.max(0, parseFloat(n)));\n // Automatically convert percentage into number\n if (isPercent) {\n n = parseInt(String(n * max), 10) / 100;\n }\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n // Convert into [0, 1] range if it isn't already\n if (max === 360) {\n // If n is a hue given in degrees,\n // wrap around out-of-range values into [0, 360] range\n // then convert into [0, 1].\n n = (n < 0 ? (n % max) + max : n % max) / parseFloat(String(max));\n }\n else {\n // If n not a hue given in degrees\n // Convert into [0, 1] range if it isn't already.\n n = (n % max) / parseFloat(String(max));\n }\n return n;\n}\n/**\n * Force a number between 0 and 1\n * @hidden\n */\nexport function clamp01(val) {\n return Math.min(1, Math.max(0, val));\n}\n/**\n * Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n * \n * @hidden\n */\nexport function isOnePointZero(n) {\n return typeof n === 'string' && n.indexOf('.') !== -1 && parseFloat(n) === 1;\n}\n/**\n * Check to see if string passed in is a percentage\n * @hidden\n */\nexport function isPercentage(n) {\n return typeof n === 'string' && n.indexOf('%') !== -1;\n}\n/**\n * Return a valid alpha value [0,1] with all invalid values being set to 1\n * @hidden\n */\nexport function boundAlpha(a) {\n a = parseFloat(a);\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n return a;\n}\n/**\n * Replace a decimal with it's percentage value\n * @hidden\n */\nexport function convertToPercentage(n) {\n if (n <= 1) {\n return \"\".concat(Number(n) * 100, \"%\");\n }\n return n;\n}\n/**\n * Force a hex value to have 2 characters\n * @hidden\n */\nexport function pad2(c) {\n return c.length === 1 ? '0' + c : String(c);\n}\n","import { bound01, pad2 } from './util.js';\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// \n/**\n * Handle bounds / percentage checking to conform to CSS color spec\n * \n * *Assumes:* r, g, b in [0, 255] or [0, 1]\n * *Returns:* { r, g, b } in [0, 255]\n */\nexport function rgbToRgb(r, g, b) {\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255,\n };\n}\n/**\n * Converts an RGB color value to HSL.\n * *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n * *Returns:* { h, s, l } in [0,1]\n */\nexport function rgbToHsl(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var h = 0;\n var s = 0;\n var l = (max + min) / 2;\n if (max === min) {\n s = 0;\n h = 0; // achromatic\n }\n else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n break;\n }\n h /= 6;\n }\n return { h: h, s: s, l: l };\n}\nfunction hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * (6 * t);\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n}\n/**\n * Converts an HSL color value to RGB.\n *\n * *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n * *Returns:* { r, g, b } in the set [0, 255]\n */\nexport function hslToRgb(h, s, l) {\n var r;\n var g;\n var b;\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n if (s === 0) {\n // achromatic\n g = l;\n b = l;\n r = l;\n }\n else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n/**\n * Converts an RGB color value to HSV\n *\n * *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n * *Returns:* { h, s, v } in [0,1]\n */\nexport function rgbToHsv(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var h = 0;\n var v = max;\n var d = max - min;\n var s = max === 0 ? 0 : d / max;\n if (max === min) {\n h = 0; // achromatic\n }\n else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n break;\n }\n h /= 6;\n }\n return { h: h, s: s, v: v };\n}\n/**\n * Converts an HSV color value to RGB.\n *\n * *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n * *Returns:* { r, g, b } in the set [0, 255]\n */\nexport function hsvToRgb(h, s, v) {\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n var i = Math.floor(h);\n var f = h - i;\n var p = v * (1 - s);\n var q = v * (1 - f * s);\n var t = v * (1 - (1 - f) * s);\n var mod = i % 6;\n var r = [v, q, p, p, t, v][mod];\n var g = [t, v, v, q, p, p][mod];\n var b = [p, p, t, v, v, q][mod];\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n/**\n * Converts an RGB color to hex\n *\n * Assumes r, g, and b are contained in the set [0, 255]\n * Returns a 3 or 6 character hex\n */\nexport function rgbToHex(r, g, b, allow3Char) {\n var hex = [\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n ];\n // Return a 3 character hex if possible\n if (allow3Char &&\n hex[0].startsWith(hex[0].charAt(1)) &&\n hex[1].startsWith(hex[1].charAt(1)) &&\n hex[2].startsWith(hex[2].charAt(1))) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n return hex.join('');\n}\n/**\n * Converts an RGBA color plus alpha transparency to hex\n *\n * Assumes r, g, b are contained in the set [0, 255] and\n * a in [0, 1]. Returns a 4 or 8 character rgba hex\n */\n// eslint-disable-next-line max-params\nexport function rgbaToHex(r, g, b, a, allow4Char) {\n var hex = [\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n pad2(convertDecimalToHex(a)),\n ];\n // Return a 4 character hex if possible\n if (allow4Char &&\n hex[0].startsWith(hex[0].charAt(1)) &&\n hex[1].startsWith(hex[1].charAt(1)) &&\n hex[2].startsWith(hex[2].charAt(1)) &&\n hex[3].startsWith(hex[3].charAt(1))) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n return hex.join('');\n}\n/**\n * Converts an RGBA color to an ARGB Hex8 string\n * Rarely used, but required for \"toFilter()\"\n */\nexport function rgbaToArgbHex(r, g, b, a) {\n var hex = [\n pad2(convertDecimalToHex(a)),\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n ];\n return hex.join('');\n}\n/** Converts a decimal to a hex value */\nexport function convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n}\n/** Converts a hex value to a decimal */\nexport function convertHexToDecimal(h) {\n return parseIntFromHex(h) / 255;\n}\n/** Parse a base-16 hex value into a base-10 integer */\nexport function parseIntFromHex(val) {\n return parseInt(val, 16);\n}\nexport function numberInputToObject(color) {\n return {\n r: color >> 16,\n g: (color & 0xff00) >> 8,\n b: color & 0xff,\n };\n}\n","// https://github.com/bahamas10/css-color-names/blob/master/css-color-names.json\n/**\n * @hidden\n */\nexport var names = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n goldenrod: '#daa520',\n gold: '#ffd700',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavenderblush: '#fff0f5',\n lavender: '#e6e6fa',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32',\n};\n","/* eslint-disable @typescript-eslint/no-redundant-type-constituents */\nimport { convertHexToDecimal, hslToRgb, hsvToRgb, parseIntFromHex, rgbToRgb, } from './conversion.js';\nimport { names } from './css-color-names.js';\nimport { boundAlpha, convertToPercentage } from './util.js';\n/**\n * Given a string or object, convert that input to RGB\n *\n * Possible string inputs:\n * ```\n * \"red\"\n * \"#f00\" or \"f00\"\n * \"#ff0000\" or \"ff0000\"\n * \"#ff000000\" or \"ff000000\"\n * \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n * \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n * \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n * \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n * \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n * \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n * \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n * ```\n */\nexport function inputToRGB(color) {\n var rgb = { r: 0, g: 0, b: 0 };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n if (typeof color === 'string') {\n color = stringInputToObject(color);\n }\n if (typeof color === 'object') {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === '%' ? 'prgb' : 'rgb';\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = 'hsv';\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = 'hsl';\n }\n if (Object.prototype.hasOwnProperty.call(color, 'a')) {\n a = color.a;\n }\n }\n a = boundAlpha(a);\n return {\n ok: ok,\n format: color.format || format,\n r: Math.min(255, Math.max(rgb.r, 0)),\n g: Math.min(255, Math.max(rgb.g, 0)),\n b: Math.min(255, Math.max(rgb.b, 0)),\n a: a,\n };\n}\n// \nvar CSS_INTEGER = '[-\\\\+]?\\\\d+%?';\n// \nvar CSS_NUMBER = '[-\\\\+]?\\\\d*\\\\.\\\\d+%?';\n// Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\nvar CSS_UNIT = \"(?:\".concat(CSS_NUMBER, \")|(?:\").concat(CSS_INTEGER, \")\");\n// Actual matching.\n// Parentheses and commas are optional, but not required.\n// Whitespace can take the place of commas or opening paren\nvar PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\".concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")\\\\s*\\\\)?\");\nvar PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\".concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")\\\\s*\\\\)?\");\nvar matchers = {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp('rgb' + PERMISSIVE_MATCH3),\n rgba: new RegExp('rgba' + PERMISSIVE_MATCH4),\n hsl: new RegExp('hsl' + PERMISSIVE_MATCH3),\n hsla: new RegExp('hsla' + PERMISSIVE_MATCH4),\n hsv: new RegExp('hsv' + PERMISSIVE_MATCH3),\n hsva: new RegExp('hsva' + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n};\n/**\n * Permissive string parsing. Take in a number of formats, and output an object\n * based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\n */\nexport function stringInputToObject(color) {\n color = color.trim().toLowerCase();\n if (color.length === 0) {\n return false;\n }\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n }\n else if (color === 'transparent') {\n return { r: 0, g: 0, b: 0, a: 0, format: 'name' };\n }\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match = matchers.rgb.exec(color);\n if (match) {\n return { r: match[1], g: match[2], b: match[3] };\n }\n match = matchers.rgba.exec(color);\n if (match) {\n return { r: match[1], g: match[2], b: match[3], a: match[4] };\n }\n match = matchers.hsl.exec(color);\n if (match) {\n return { h: match[1], s: match[2], l: match[3] };\n }\n match = matchers.hsla.exec(color);\n if (match) {\n return { h: match[1], s: match[2], l: match[3], a: match[4] };\n }\n match = matchers.hsv.exec(color);\n if (match) {\n return { h: match[1], s: match[2], v: match[3] };\n }\n match = matchers.hsva.exec(color);\n if (match) {\n return { h: match[1], s: match[2], v: match[3], a: match[4] };\n }\n match = matchers.hex8.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? 'name' : 'hex8',\n };\n }\n match = matchers.hex6.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? 'name' : 'hex',\n };\n }\n match = matchers.hex4.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1] + match[1]),\n g: parseIntFromHex(match[2] + match[2]),\n b: parseIntFromHex(match[3] + match[3]),\n a: convertHexToDecimal(match[4] + match[4]),\n format: named ? 'name' : 'hex8',\n };\n }\n match = matchers.hex3.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1] + match[1]),\n g: parseIntFromHex(match[2] + match[2]),\n b: parseIntFromHex(match[3] + match[3]),\n format: named ? 'name' : 'hex',\n };\n }\n return false;\n}\n/**\n * Check to see if it looks like a CSS unit\n * (see `matchers` above for definition).\n */\nexport function isValidCSSUnit(color) {\n return Boolean(matchers.CSS_UNIT.exec(String(color)));\n}\n","import { numberInputToObject, rgbaToHex, rgbToHex, rgbToHsl, rgbToHsv } from './conversion.js';\nimport { names } from './css-color-names.js';\nimport { inputToRGB } from './format-input';\nimport { bound01, boundAlpha, clamp01 } from './util.js';\nvar TinyColor = /** @class */ (function () {\n function TinyColor(color, opts) {\n if (color === void 0) { color = ''; }\n if (opts === void 0) { opts = {}; }\n var _a;\n // If input is already a tinycolor, return itself\n if (color instanceof TinyColor) {\n // eslint-disable-next-line no-constructor-return\n return color;\n }\n if (typeof color === 'number') {\n color = numberInputToObject(color);\n }\n this.originalInput = color;\n var rgb = inputToRGB(color);\n this.originalInput = color;\n this.r = rgb.r;\n this.g = rgb.g;\n this.b = rgb.b;\n this.a = rgb.a;\n this.roundA = Math.round(100 * this.a) / 100;\n this.format = (_a = opts.format) !== null && _a !== void 0 ? _a : rgb.format;\n this.gradientType = opts.gradientType;\n // Don't let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n if (this.r < 1) {\n this.r = Math.round(this.r);\n }\n if (this.g < 1) {\n this.g = Math.round(this.g);\n }\n if (this.b < 1) {\n this.b = Math.round(this.b);\n }\n this.isValid = rgb.ok;\n }\n TinyColor.prototype.isDark = function () {\n return this.getBrightness() < 128;\n };\n TinyColor.prototype.isLight = function () {\n return !this.isDark();\n };\n /**\n * Returns the perceived brightness of the color, from 0-255.\n */\n TinyColor.prototype.getBrightness = function () {\n // http://www.w3.org/TR/AERT#color-contrast\n var rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n };\n /**\n * Returns the perceived luminance of a color, from 0-1.\n */\n TinyColor.prototype.getLuminance = function () {\n // http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n var rgb = this.toRgb();\n var R;\n var G;\n var B;\n var RsRGB = rgb.r / 255;\n var GsRGB = rgb.g / 255;\n var BsRGB = rgb.b / 255;\n if (RsRGB <= 0.03928) {\n R = RsRGB / 12.92;\n }\n else {\n // eslint-disable-next-line prefer-exponentiation-operator\n R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n }\n if (GsRGB <= 0.03928) {\n G = GsRGB / 12.92;\n }\n else {\n // eslint-disable-next-line prefer-exponentiation-operator\n G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n }\n if (BsRGB <= 0.03928) {\n B = BsRGB / 12.92;\n }\n else {\n // eslint-disable-next-line prefer-exponentiation-operator\n B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n }\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n };\n /**\n * Returns the alpha value of a color, from 0-1.\n */\n TinyColor.prototype.getAlpha = function () {\n return this.a;\n };\n /**\n * Sets the alpha value on the current color.\n *\n * @param alpha - The new alpha value. The accepted range is 0-1.\n */\n TinyColor.prototype.setAlpha = function (alpha) {\n this.a = boundAlpha(alpha);\n this.roundA = Math.round(100 * this.a) / 100;\n return this;\n };\n /**\n * Returns whether the color is monochrome.\n */\n TinyColor.prototype.isMonochrome = function () {\n var s = this.toHsl().s;\n return s === 0;\n };\n /**\n * Returns the object as a HSVA object.\n */\n TinyColor.prototype.toHsv = function () {\n var hsv = rgbToHsv(this.r, this.g, this.b);\n return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this.a };\n };\n /**\n * Returns the hsva values interpolated into a string with the following format:\n * \"hsva(xxx, xxx, xxx, xx)\".\n */\n TinyColor.prototype.toHsvString = function () {\n var hsv = rgbToHsv(this.r, this.g, this.b);\n var h = Math.round(hsv.h * 360);\n var s = Math.round(hsv.s * 100);\n var v = Math.round(hsv.v * 100);\n return this.a === 1 ? \"hsv(\".concat(h, \", \").concat(s, \"%, \").concat(v, \"%)\") : \"hsva(\".concat(h, \", \").concat(s, \"%, \").concat(v, \"%, \").concat(this.roundA, \")\");\n };\n /**\n * Returns the object as a HSLA object.\n */\n TinyColor.prototype.toHsl = function () {\n var hsl = rgbToHsl(this.r, this.g, this.b);\n return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this.a };\n };\n /**\n * Returns the hsla values interpolated into a string with the following format:\n * \"hsla(xxx, xxx, xxx, xx)\".\n */\n TinyColor.prototype.toHslString = function () {\n var hsl = rgbToHsl(this.r, this.g, this.b);\n var h = Math.round(hsl.h * 360);\n var s = Math.round(hsl.s * 100);\n var l = Math.round(hsl.l * 100);\n return this.a === 1 ? \"hsl(\".concat(h, \", \").concat(s, \"%, \").concat(l, \"%)\") : \"hsla(\".concat(h, \", \").concat(s, \"%, \").concat(l, \"%, \").concat(this.roundA, \")\");\n };\n /**\n * Returns the hex value of the color.\n * @param allow3Char will shorten hex value to 3 char if possible\n */\n TinyColor.prototype.toHex = function (allow3Char) {\n if (allow3Char === void 0) { allow3Char = false; }\n return rgbToHex(this.r, this.g, this.b, allow3Char);\n };\n /**\n * Returns the hex value of the color -with a # prefixed.\n * @param allow3Char will shorten hex value to 3 char if possible\n */\n TinyColor.prototype.toHexString = function (allow3Char) {\n if (allow3Char === void 0) { allow3Char = false; }\n return '#' + this.toHex(allow3Char);\n };\n /**\n * Returns the hex 8 value of the color.\n * @param allow4Char will shorten hex value to 4 char if possible\n */\n TinyColor.prototype.toHex8 = function (allow4Char) {\n if (allow4Char === void 0) { allow4Char = false; }\n return rgbaToHex(this.r, this.g, this.b, this.a, allow4Char);\n };\n /**\n * Returns the hex 8 value of the color -with a # prefixed.\n * @param allow4Char will shorten hex value to 4 char if possible\n */\n TinyColor.prototype.toHex8String = function (allow4Char) {\n if (allow4Char === void 0) { allow4Char = false; }\n return '#' + this.toHex8(allow4Char);\n };\n /**\n * Returns the shorter hex value of the color depends on its alpha -with a # prefixed.\n * @param allowShortChar will shorten hex value to 3 or 4 char if possible\n */\n TinyColor.prototype.toHexShortString = function (allowShortChar) {\n if (allowShortChar === void 0) { allowShortChar = false; }\n return this.a === 1 ? this.toHexString(allowShortChar) : this.toHex8String(allowShortChar);\n };\n /**\n * Returns the object as a RGBA object.\n */\n TinyColor.prototype.toRgb = function () {\n return {\n r: Math.round(this.r),\n g: Math.round(this.g),\n b: Math.round(this.b),\n a: this.a,\n };\n };\n /**\n * Returns the RGBA values interpolated into a string with the following format:\n * \"RGBA(xxx, xxx, xxx, xx)\".\n */\n TinyColor.prototype.toRgbString = function () {\n var r = Math.round(this.r);\n var g = Math.round(this.g);\n var b = Math.round(this.b);\n return this.a === 1 ? \"rgb(\".concat(r, \", \").concat(g, \", \").concat(b, \")\") : \"rgba(\".concat(r, \", \").concat(g, \", \").concat(b, \", \").concat(this.roundA, \")\");\n };\n /**\n * Returns the object as a RGBA object.\n */\n TinyColor.prototype.toPercentageRgb = function () {\n var fmt = function (x) { return \"\".concat(Math.round(bound01(x, 255) * 100), \"%\"); };\n return {\n r: fmt(this.r),\n g: fmt(this.g),\n b: fmt(this.b),\n a: this.a,\n };\n };\n /**\n * Returns the RGBA relative values interpolated into a string\n */\n TinyColor.prototype.toPercentageRgbString = function () {\n var rnd = function (x) { return Math.round(bound01(x, 255) * 100); };\n return this.a === 1\n ? \"rgb(\".concat(rnd(this.r), \"%, \").concat(rnd(this.g), \"%, \").concat(rnd(this.b), \"%)\")\n : \"rgba(\".concat(rnd(this.r), \"%, \").concat(rnd(this.g), \"%, \").concat(rnd(this.b), \"%, \").concat(this.roundA, \")\");\n };\n /**\n * The 'real' name of the color -if there is one.\n */\n TinyColor.prototype.toName = function () {\n if (this.a === 0) {\n return 'transparent';\n }\n if (this.a < 1) {\n return false;\n }\n var hex = '#' + rgbToHex(this.r, this.g, this.b, false);\n for (var _i = 0, _a = Object.entries(names); _i < _a.length; _i++) {\n var _b = _a[_i], key = _b[0], value = _b[1];\n if (hex === value) {\n return key;\n }\n }\n return false;\n };\n TinyColor.prototype.toString = function (format) {\n var formatSet = Boolean(format);\n format = format !== null && format !== void 0 ? format : this.format;\n var formattedString = false;\n var hasAlpha = this.a < 1 && this.a >= 0;\n var needsAlphaFormat = !formatSet && hasAlpha && (format.startsWith('hex') || format === 'name');\n if (needsAlphaFormat) {\n // Special case for \"transparent\", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === 'name' && this.a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === 'rgb') {\n formattedString = this.toRgbString();\n }\n if (format === 'prgb') {\n formattedString = this.toPercentageRgbString();\n }\n if (format === 'hex' || format === 'hex6') {\n formattedString = this.toHexString();\n }\n if (format === 'hex3') {\n formattedString = this.toHexString(true);\n }\n if (format === 'hex4') {\n formattedString = this.toHex8String(true);\n }\n if (format === 'hex8') {\n formattedString = this.toHex8String();\n }\n if (format === 'name') {\n formattedString = this.toName();\n }\n if (format === 'hsl') {\n formattedString = this.toHslString();\n }\n if (format === 'hsv') {\n formattedString = this.toHsvString();\n }\n return formattedString || this.toHexString();\n };\n TinyColor.prototype.toNumber = function () {\n return (Math.round(this.r) << 16) + (Math.round(this.g) << 8) + Math.round(this.b);\n };\n TinyColor.prototype.clone = function () {\n return new TinyColor(this.toString());\n };\n /**\n * Lighten the color a given amount. Providing 100 will always return white.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.lighten = function (amount) {\n if (amount === void 0) { amount = 10; }\n var hsl = this.toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return new TinyColor(hsl);\n };\n /**\n * Brighten the color a given amount, from 0 to 100.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.brighten = function (amount) {\n if (amount === void 0) { amount = 10; }\n var rgb = this.toRgb();\n rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));\n rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));\n rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));\n return new TinyColor(rgb);\n };\n /**\n * Darken the color a given amount, from 0 to 100.\n * Providing 100 will always return black.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.darken = function (amount) {\n if (amount === void 0) { amount = 10; }\n var hsl = this.toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return new TinyColor(hsl);\n };\n /**\n * Mix the color with pure white, from 0 to 100.\n * Providing 0 will do nothing, providing 100 will always return white.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.tint = function (amount) {\n if (amount === void 0) { amount = 10; }\n return this.mix('white', amount);\n };\n /**\n * Mix the color with pure black, from 0 to 100.\n * Providing 0 will do nothing, providing 100 will always return black.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.shade = function (amount) {\n if (amount === void 0) { amount = 10; }\n return this.mix('black', amount);\n };\n /**\n * Desaturate the color a given amount, from 0 to 100.\n * Providing 100 will is the same as calling greyscale\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.desaturate = function (amount) {\n if (amount === void 0) { amount = 10; }\n var hsl = this.toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return new TinyColor(hsl);\n };\n /**\n * Saturate the color a given amount, from 0 to 100.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.saturate = function (amount) {\n if (amount === void 0) { amount = 10; }\n var hsl = this.toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return new TinyColor(hsl);\n };\n /**\n * Completely desaturates a color into greyscale.\n * Same as calling `desaturate(100)`\n */\n TinyColor.prototype.greyscale = function () {\n return this.desaturate(100);\n };\n /**\n * Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n * Values outside of this range will be wrapped into this range.\n */\n TinyColor.prototype.spin = function (amount) {\n var hsl = this.toHsl();\n var hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return new TinyColor(hsl);\n };\n /**\n * Mix the current color a given amount with another color, from 0 to 100.\n * 0 means no mixing (return current color).\n */\n TinyColor.prototype.mix = function (color, amount) {\n if (amount === void 0) { amount = 50; }\n var rgb1 = this.toRgb();\n var rgb2 = new TinyColor(color).toRgb();\n var p = amount / 100;\n var rgba = {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b,\n a: (rgb2.a - rgb1.a) * p + rgb1.a,\n };\n return new TinyColor(rgba);\n };\n TinyColor.prototype.analogous = function (results, slices) {\n if (results === void 0) { results = 6; }\n if (slices === void 0) { slices = 30; }\n var hsl = this.toHsl();\n var part = 360 / slices;\n var ret = [this];\n for (hsl.h = (hsl.h - ((part * results) >> 1) + 720) % 360; --results;) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(new TinyColor(hsl));\n }\n return ret;\n };\n /**\n * taken from https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js\n */\n TinyColor.prototype.complement = function () {\n var hsl = this.toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return new TinyColor(hsl);\n };\n TinyColor.prototype.monochromatic = function (results) {\n if (results === void 0) { results = 6; }\n var hsv = this.toHsv();\n var h = hsv.h;\n var s = hsv.s;\n var v = hsv.v;\n var res = [];\n var modification = 1 / results;\n while (results--) {\n res.push(new TinyColor({ h: h, s: s, v: v }));\n v = (v + modification) % 1;\n }\n return res;\n };\n TinyColor.prototype.splitcomplement = function () {\n var hsl = this.toHsl();\n var h = hsl.h;\n return [\n this,\n new TinyColor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l }),\n new TinyColor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l }),\n ];\n };\n /**\n * Compute how the color would appear on a background\n */\n TinyColor.prototype.onBackground = function (background) {\n var fg = this.toRgb();\n var bg = new TinyColor(background).toRgb();\n var alpha = fg.a + bg.a * (1 - fg.a);\n return new TinyColor({\n r: (fg.r * fg.a + bg.r * bg.a * (1 - fg.a)) / alpha,\n g: (fg.g * fg.a + bg.g * bg.a * (1 - fg.a)) / alpha,\n b: (fg.b * fg.a + bg.b * bg.a * (1 - fg.a)) / alpha,\n a: alpha,\n });\n };\n /**\n * Alias for `polyad(3)`\n */\n TinyColor.prototype.triad = function () {\n return this.polyad(3);\n };\n /**\n * Alias for `polyad(4)`\n */\n TinyColor.prototype.tetrad = function () {\n return this.polyad(4);\n };\n /**\n * Get polyad colors, like (for 1, 2, 3, 4, 5, 6, 7, 8, etc...)\n * monad, dyad, triad, tetrad, pentad, hexad, heptad, octad, etc...\n */\n TinyColor.prototype.polyad = function (n) {\n var hsl = this.toHsl();\n var h = hsl.h;\n var result = [this];\n var increment = 360 / n;\n for (var i = 1; i < n; i++) {\n result.push(new TinyColor({ h: (h + i * increment) % 360, s: hsl.s, l: hsl.l }));\n }\n return result;\n };\n /**\n * compare color vs current color\n */\n TinyColor.prototype.equals = function (color) {\n return this.toRgbString() === new TinyColor(color).toRgbString();\n };\n return TinyColor;\n}());\nexport { TinyColor };\n// kept for backwards compatability with v1\nexport function tinycolor(color, opts) {\n if (color === void 0) { color = ''; }\n if (opts === void 0) { opts = {}; }\n return new TinyColor(color, opts);\n}\n","import { TinyColor } from '@ctrl/tinycolor';\n\nfunction tinycolor(...args) {\n return new TinyColor(...args);\n}\n\nfunction _colorChange(data, oldHue) {\n const alpha = data && data.a;\n let color;\n\n // hsl is better than hex between conversions\n if (data && data.hsl)\n color = tinycolor(data.hsl);\n else if (data && data.hex && data.hex.length > 0)\n color = tinycolor(data.hex);\n else if (data && data.hsv)\n color = tinycolor(data.hsv);\n else if (data && data.rgba)\n color = tinycolor(data.rgba);\n else if (data && data.rgb)\n color = tinycolor(data.rgb);\n else\n color = tinycolor(data);\n\n if (color && (color._a === undefined || color._a === null))\n color.setAlpha(alpha || color.getAlpha());\n\n const hsl = color.toHsl();\n const hsv = color.toHsv();\n\n if (hsl.s === 0)\n hsv.h = hsl.h = data.h || (data.hsl && data.hsl.h) || oldHue || 0;\n\n /* --- comment this block to fix #109, may cause #25 again --- */\n // when the hsv.v is less than 0.0164 (base on test)\n // because of possible loss of precision\n // the result of hue and saturation would be miscalculated\n if (hsv.v < 0.0164) {\n hsv.h = data.h || (data.hsv && data.hsv.h) || 0;\n hsv.s = data.s || (data.hsv && data.hsv.s) || 0;\n }\n\n if (hsl.l < 0.01) {\n hsl.h = data.h || (data.hsl && data.hsl.h) || 0;\n hsl.s = data.s || (data.hsl && data.hsl.s) || 0;\n }\n /* ------ */\n\n return {\n hsl,\n hex: color.toHexString().toUpperCase(),\n hex8: color.toHex8String().toUpperCase(),\n rgba: color.toRgb(),\n hsv,\n oldHue: data.h || oldHue || hsl.h,\n source: data.source,\n a: color.getAlpha(),\n };\n}\n\nvar colorMixin = {\n model: {\n prop: 'modelValue',\n event: 'update:modelValue',\n },\n props: ['modelValue'],\n data() {\n return {\n val: _colorChange(this.modelValue),\n };\n },\n computed: {\n colors: {\n get() {\n return this.val;\n },\n set(newVal) {\n this.val = newVal;\n this.$emit('update:modelValue', newVal);\n },\n },\n },\n watch: {\n modelValue(newVal) {\n this.val = _colorChange(newVal);\n },\n },\n methods: {\n colorChange(data, oldHue) {\n this.oldHue = this.colors.hsl.h;\n this.colors = _colorChange(data, oldHue || this.oldHue);\n },\n isValidHex(hex) {\n return tinycolor(hex).isValid;\n },\n simpleCheckForValidColor(data) {\n const keysToCheck = ['r', 'g', 'b', 'a', 'h', 's', 'l', 'v'];\n let checked = 0;\n let passed = 0;\n\n for (let i = 0; i < keysToCheck.length; i++) {\n const letter = keysToCheck[i];\n if (data[letter]) {\n checked++;\n if (!isNaN(data[letter]))\n passed++;\n }\n }\n\n if (checked === passed)\n return data;\n },\n paletteUpperCase(palette) {\n return palette.map(c => c.toUpperCase());\n },\n isTransparent(color) {\n return tinycolor(color).getAlpha() === 0;\n },\n },\n};\n\nexport { colorMixin as default };\n","import { openBlock, createElementBlock, withDirectives, createElementVNode, vModelText, toDisplayString } from 'vue';\nimport { s as styleInject } from '../../style-inject.es-746bb8ed.js';\nimport { install } from '../../utils/compoent.js';\nimport '../../defaultConfig.js';\n\nvar script = {\n name: 'EditableInput',\n props: {\n label: String,\n labelText: String,\n desc: String,\n value: [String, Number],\n max: Number,\n min: Number,\n arrowOffset: {\n type: Number,\n default: 1,\n },\n },\n computed: {\n val: {\n get() {\n return this.value;\n },\n set(v) {\n // TODO: min\n if (!(this.max === undefined) && +v > this.max)\n this.$refs.input.value = this.max;\n else\n return v;\n },\n },\n labelId() {\n return `input__label__${this.label}__${Math.random().toString().slice(2, 5)}`;\n },\n labelSpanText() {\n return this.labelText || this.label;\n },\n },\n methods: {\n update(e) {\n this.handleChange(e.target.value);\n },\n handleChange(newVal) {\n const data = {};\n data[this.label] = newVal;\n if (data.hex === undefined && data['#'] === undefined)\n this.$emit('change', data);\n else if (newVal.length > 5)\n this.$emit('change', data);\n },\n // **** unused\n // handleBlur (e) {\n // console.log(e)\n // },\n handleKeyDown(e) {\n let { val } = this;\n const number = Number(val);\n\n if (number) {\n const amount = this.arrowOffset || 1;\n\n // Up\n if (e.keyCode === 38) {\n val = number + amount;\n this.handleChange(val);\n e.preventDefault();\n }\n\n // Down\n if (e.keyCode === 40) {\n val = number - amount;\n this.handleChange(val);\n e.preventDefault();\n }\n }\n },\n // **** unused\n // handleDrag (e) {\n // console.log(e)\n // },\n // handleMouseDown (e) {\n // console.log(e)\n // }\n },\n};\n\nconst _hoisted_1 = { class: \"vc-editable-input\" };\nconst _hoisted_2 = [\"aria-labelledby\"];\nconst _hoisted_3 = [\"id\", \"for\"];\nconst _hoisted_4 = { class: \"vc-input__desc\" };\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (openBlock(), createElementBlock(\"div\", _hoisted_1, [\n withDirectives(createElementVNode(\"input\", {\n ref: \"input\",\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($options.val) = $event)),\n \"aria-labelledby\": $options.labelId,\n class: \"vc-input__input\",\n onKeydown: _cache[1] || (_cache[1] = (...args) => ($options.handleKeyDown && $options.handleKeyDown(...args))),\n onInput: _cache[2] || (_cache[2] = (...args) => ($options.update && $options.update(...args)))\n }, null, 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_2), [\n [vModelText, $options.val]\n ]),\n createElementVNode(\"span\", {\n id: $options.labelId,\n for: $props.label,\n class: \"vc-input__label\"\n }, toDisplayString($options.labelSpanText), 9 /* TEXT, PROPS */, _hoisted_3),\n createElementVNode(\"span\", _hoisted_4, toDisplayString($props.desc), 1 /* TEXT */)\n ]))\n}\n\nvar css_248z = \".vc-editable-input{position:relative}.vc-input__input{border:0;outline:none;padding:0}.vc-input__label{text-transform:capitalize}\";\nstyleInject(css_248z);\n\nscript.render = render;\nscript.__file = \"src/components/editable-input/editable-input.vue\";\n\nscript.install = install;\n\nexport { script as default };\n","function clamp(value, min, max) {\n return min < max\n ? (value < min ? min : value > max ? max : value)\n : (value < max ? max : value > min ? min : value);\n}\n\nexport { clamp };\n","import { clamp } from '../../utils/utils.js';\nimport { openBlock, createElementBlock, normalizeStyle, createElementVNode } from 'vue';\nimport { s as styleInject } from '../../style-inject.es-746bb8ed.js';\nimport { install } from '../../utils/compoent.js';\nimport '../../defaultConfig.js';\n\nvar script = {\n name: 'Saturation',\n props: {\n value: Object,\n },\n computed: {\n colors() {\n return this.value;\n },\n bgColor() {\n return `hsl(${this.colors.hsv.h}, 100%, 50%)`;\n },\n pointerTop() {\n return `${(-(this.colors.hsv.v * 100) + 1) + 100}%`;\n },\n pointerLeft() {\n return `${this.colors.hsv.s * 100}%`;\n },\n },\n methods: {\n handleChange(e, skip) {\n !skip && e.preventDefault();\n const { container } = this.$refs;\n if (!container) {\n // for some edge cases, container may not exist. see #220\n return;\n }\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n const xOffset = container.getBoundingClientRect().left + window.pageXOffset;\n const yOffset = container.getBoundingClientRect().top + window.pageYOffset;\n const pageX = e.pageX || (e.touches ? e.touches[0].pageX : 0);\n const pageY = e.pageY || (e.touches ? e.touches[0].pageY : 0);\n const left = clamp(pageX - xOffset, 0, containerWidth);\n const top = clamp(pageY - yOffset, 0, containerHeight);\n const saturation = left / containerWidth;\n const bright = clamp(-(top / containerHeight) + 1, 0, 1);\n\n this.onChange({\n h: this.colors.hsv.h,\n s: saturation,\n v: bright,\n a: this.colors.hsv.a,\n source: 'hsva',\n });\n },\n onChange(param) {\n this.$emit('change', param);\n },\n handleMouseDown(e) {\n // this.handleChange(e, true)\n window.addEventListener('mousemove', this.handleChange);\n window.addEventListener('mouseup', this.handleChange);\n window.addEventListener('mouseup', this.handleMouseUp);\n },\n handleMouseUp(e) {\n this.unbindEventListeners();\n },\n unbindEventListeners() {\n window.removeEventListener('mousemove', this.handleChange);\n window.removeEventListener('mouseup', this.handleChange);\n window.removeEventListener('mouseup', this.handleMouseUp);\n },\n },\n};\n\nconst _hoisted_1 = /*#__PURE__*/createElementVNode(\"div\", { class: \"vc-saturation--white\" }, null, -1 /* HOISTED */);\nconst _hoisted_2 = /*#__PURE__*/createElementVNode(\"div\", { class: \"vc-saturation--black\" }, null, -1 /* HOISTED */);\nconst _hoisted_3 = /*#__PURE__*/createElementVNode(\"div\", { class: \"vc-saturation-circle\" }, null, -1 /* HOISTED */);\nconst _hoisted_4 = [\n _hoisted_3\n];\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (openBlock(), createElementBlock(\"div\", {\n ref: \"container\",\n class: \"vc-saturation\",\n style: normalizeStyle({ background: $options.bgColor }),\n onMousedown: _cache[0] || (_cache[0] = (...args) => ($options.handleMouseDown && $options.handleMouseDown(...args))),\n onTouchmove: _cache[1] || (_cache[1] = (...args) => ($options.handleChange && $options.handleChange(...args))),\n onTouchstart: _cache[2] || (_cache[2] = (...args) => ($options.handleChange && $options.handleChange(...args)))\n }, [\n _hoisted_1,\n _hoisted_2,\n createElementVNode(\"div\", {\n class: \"vc-saturation-pointer\",\n style: normalizeStyle({ top: $options.pointerTop, left: $options.pointerLeft })\n }, _hoisted_4, 4 /* STYLE */)\n ], 36 /* STYLE, HYDRATE_EVENTS */))\n}\n\nvar css_248z = \".vc-saturation,.vc-saturation--black,.vc-saturation--white{bottom:0;cursor:pointer;left:0;position:absolute;right:0;top:0}.vc-saturation--white{background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.vc-saturation--black{background:linear-gradient(0deg,#000,transparent)}.vc-saturation-pointer{cursor:pointer;position:absolute}.vc-saturation-circle{border-radius:50%;box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);cursor:head;height:4px;transform:translate(-2px,-2px);width:4px}\";\nstyleInject(css_248z);\n\nscript.render = render;\nscript.__file = \"src/components/saturation/saturation.vue\";\n\nscript.install = install;\n\nexport { script as default };\n","import { openBlock, createElementBlock, normalizeClass, createElementVNode, normalizeStyle } from 'vue';\nimport { s as styleInject } from '../../style-inject.es-746bb8ed.js';\nimport { install } from '../../utils/compoent.js';\nimport '../../defaultConfig.js';\n\nvar script = {\n name: 'Hue',\n props: {\n value: Object,\n direction: {\n type: String,\n // [horizontal | vertical]\n default: 'horizontal',\n },\n },\n data() {\n return {\n oldHue: 0,\n pullDirection: '',\n };\n },\n computed: {\n colors() {\n return this.value;\n },\n directionClass() {\n return {\n 'vc-hue--horizontal': this.direction === 'horizontal',\n 'vc-hue--vertical': this.direction === 'vertical',\n };\n },\n pointerTop() {\n if (this.direction === 'vertical') {\n if (this.colors.hsl.h === 0 && this.pullDirection === 'right')\n return 0;\n return `${-((this.colors.hsl.h * 100) / 360) + 100}%`;\n }\n return 0;\n },\n pointerLeft() {\n if (this.direction === 'vertical')\n return 0;\n\n if (this.colors.hsl.h === 0 && this.pullDirection === 'right')\n return '100%';\n return `${(this.colors.hsl.h * 100) / 360}%`;\n },\n },\n watch: {\n value: {\n handler(value, oldVal) {\n const { h } = value.hsl;\n if (h !== 0 && h - this.oldHue > 0)\n this.pullDirection = 'right';\n if (h !== 0 && h - this.oldHue < 0)\n this.pullDirection = 'left';\n this.oldHue = h;\n },\n deep: true,\n immediate: true,\n },\n },\n methods: {\n handleChange(e, skip) {\n !skip && e.preventDefault();\n\n const { container } = this.$refs;\n if (!container) {\n // for some edge cases, container may not exist. see #220\n return;\n }\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n const xOffset = container.getBoundingClientRect().left + window.pageXOffset;\n const yOffset = container.getBoundingClientRect().top + window.pageYOffset;\n const pageX = e.pageX || (e.touches ? e.touches[0].pageX : 0);\n const pageY = e.pageY || (e.touches ? e.touches[0].pageY : 0);\n const left = pageX - xOffset;\n const top = pageY - yOffset;\n\n let h;\n let percent;\n\n if (this.direction === 'vertical') {\n if (top < 0) {\n h = 360;\n }\n else if (top > containerHeight) {\n h = 0;\n }\n else {\n percent = -(top * 100 / containerHeight) + 100;\n h = (360 * percent / 100);\n }\n\n if (this.colors.hsl.h !== h) {\n this.$emit('change', {\n h,\n s: this.colors.hsl.s,\n l: this.colors.hsl.l,\n a: this.colors.hsl.a,\n source: 'hsl',\n });\n }\n }\n else {\n if (left < 0) {\n h = 0;\n }\n else if (left > containerWidth) {\n h = 360;\n }\n else {\n percent = left * 100 / containerWidth;\n h = (360 * percent / 100);\n }\n\n if (this.colors.hsl.h !== h) {\n this.$emit('change', {\n h,\n s: this.colors.hsl.s,\n l: this.colors.hsl.l,\n a: this.colors.hsl.a,\n source: 'hsl',\n });\n }\n }\n },\n handleMouseDown(e) {\n this.handleChange(e, true);\n window.addEventListener('mousemove', this.handleChange);\n window.addEventListener('mouseup', this.handleChange);\n window.addEventListener('mouseup', this.handleMouseUp);\n },\n handleMouseUp(e) {\n this.unbindEventListeners();\n },\n unbindEventListeners() {\n window.removeEventListener('mousemove', this.handleChange);\n window.removeEventListener('mouseup', this.handleChange);\n window.removeEventListener('mouseup', this.handleMouseUp);\n },\n },\n};\n\nconst _hoisted_1 = [\"aria-valuenow\"];\nconst _hoisted_2 = /*#__PURE__*/createElementVNode(\"div\", { class: \"vc-hue-picker\" }, null, -1 /* HOISTED */);\nconst _hoisted_3 = [\n _hoisted_2\n];\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\"vc-hue\", [$options.directionClass]])\n }, [\n createElementVNode(\"div\", {\n ref: \"container\",\n class: \"vc-hue-container\",\n role: \"slider\",\n \"aria-valuenow\": $options.colors.hsl.h,\n \"aria-valuemin\": \"0\",\n \"aria-valuemax\": \"360\",\n onMousedown: _cache[0] || (_cache[0] = (...args) => ($options.handleMouseDown && $options.handleMouseDown(...args))),\n onTouchmove: _cache[1] || (_cache[1] = (...args) => ($options.handleChange && $options.handleChange(...args))),\n onTouchstart: _cache[2] || (_cache[2] = (...args) => ($options.handleChange && $options.handleChange(...args)))\n }, [\n createElementVNode(\"div\", {\n class: \"vc-hue-pointer\",\n style: normalizeStyle({ top: $options.pointerTop, left: $options.pointerLeft }),\n role: \"presentation\"\n }, _hoisted_3, 4 /* STYLE */)\n ], 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_1)\n ], 2 /* CLASS */))\n}\n\nvar css_248z = \".vc-hue{border-radius:2px;bottom:0;left:0;position:absolute;right:0;top:0}.vc-hue--horizontal{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.vc-hue--vertical{background:linear-gradient(0deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.vc-hue-container{cursor:pointer;height:100%;margin:0 2px;position:relative}.vc-hue-pointer{position:absolute;z-index:2}.vc-hue-picker{background:#fff;border-radius:1px;box-shadow:0 0 2px rgba(0,0,0,.6);cursor:pointer;height:8px;margin-top:1px;transform:translateX(-2px);width:4px}\";\nstyleInject(css_248z);\n\nscript.render = render;\nscript.__file = \"src/components/hue/hue.vue\";\n\nscript.install = install;\n\nexport { script as default };\n","import colorMixin from '../../mixin/color.js';\nimport script$4 from '../editable-input/index.js';\nimport script$1 from '../saturation/index.js';\nimport script$2 from '../hue/index.js';\nimport script$3 from '../alpha/index.js';\nimport script$5 from '../checkboard/index.js';\nimport { resolveComponent, openBlock, createElementBlock, normalizeClass, createElementVNode, createVNode, createCommentVNode, normalizeStyle, Fragment, renderList } from 'vue';\nimport { s as styleInject } from '../../style-inject.es-746bb8ed.js';\nimport { install } from '../../utils/compoent.js';\nimport '@ctrl/tinycolor';\nimport '../../defaultConfig.js';\nimport '../../utils/utils.js';\n\nconst presetColors = [\n '#D0021B', '#F5A623', '#F8E71C', '#8B572A', '#7ED321',\n '#417505', '#BD10E0', '#9013FE', '#4A90E2', '#50E3C2',\n '#B8E986', '#000000', '#4A4A4A', '#9B9B9B', '#FFFFFF',\n 'rgba(0,0,0,0)',\n];\n\nvar script = {\n name: 'Sketch',\n components: {\n Saturation: script$1,\n Hue: script$2,\n Alpha: script$3,\n EdIn: script$4,\n Checkboard: script$5,\n },\n mixins: [colorMixin],\n props: {\n presetColors: {\n type: Array,\n default() {\n return presetColors;\n },\n },\n disableAlpha: {\n type: Boolean,\n default: false,\n },\n disableFields: {\n type: Boolean,\n default: false,\n },\n },\n computed: {\n hex() {\n let hex;\n if (this.colors.a < 1)\n hex = this.colors.hex8;\n else\n hex = this.colors.hex;\n\n return hex.replace('#', '');\n },\n activeColor() {\n const { rgba } = this.colors;\n return `rgba(${[rgba.r, rgba.g, rgba.b, rgba.a].join(',')})`;\n },\n },\n methods: {\n handlePreset(c) {\n this.colorChange(c);\n },\n childChange(data) {\n this.colorChange(data);\n },\n inputChange(data) {\n if (!data)\n return;\n\n if (data.hex) {\n this.isValidHex(data.hex) && this.colorChange({\n hex: data.hex,\n source: 'hex',\n });\n }\n else if (data.r || data.g || data.b || data.a) {\n this.colorChange({\n r: data.r || this.colors.rgba.r,\n g: data.g || this.colors.rgba.g,\n b: data.b || this.colors.rgba.b,\n a: data.a || this.colors.rgba.a,\n source: 'rgba',\n });\n }\n },\n },\n};\n\nconst _hoisted_1 = { class: \"vc-sketch-saturation-wrap\" };\nconst _hoisted_2 = { class: \"vc-sketch-controls\" };\nconst _hoisted_3 = { class: \"vc-sketch-sliders\" };\nconst _hoisted_4 = { class: \"vc-sketch-hue-wrap\" };\nconst _hoisted_5 = {\n key: 0,\n class: \"vc-sketch-alpha-wrap\"\n};\nconst _hoisted_6 = { class: \"vc-sketch-color-wrap\" };\nconst _hoisted_7 = [\"aria-label\"];\nconst _hoisted_8 = {\n key: 0,\n class: \"vc-sketch-field\"\n};\nconst _hoisted_9 = { class: \"vc-sketch-field--double\" };\nconst _hoisted_10 = { class: \"vc-sketch-field--single\" };\nconst _hoisted_11 = { class: \"vc-sketch-field--single\" };\nconst _hoisted_12 = { class: \"vc-sketch-field--single\" };\nconst _hoisted_13 = {\n key: 0,\n class: \"vc-sketch-field--single\"\n};\nconst _hoisted_14 = {\n class: \"vc-sketch-presets\",\n role: \"group\",\n \"aria-label\": \"A color preset, pick one to set as current color\"\n};\nconst _hoisted_15 = [\"aria-label\", \"onClick\"];\nconst _hoisted_16 = [\"aria-label\", \"onClick\"];\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_Saturation = resolveComponent(\"Saturation\");\n const _component_Hue = resolveComponent(\"Hue\");\n const _component_Alpha = resolveComponent(\"Alpha\");\n const _component_Checkboard = resolveComponent(\"Checkboard\");\n const _component_EdIn = resolveComponent(\"EdIn\");\n\n return (openBlock(), createElementBlock(\"div\", {\n role: \"application\",\n \"aria-label\": \"Sketch color picker\",\n class: normalizeClass([\"vc-sketch\", [$props.disableAlpha ? 'vc-sketch__disable-alpha' : '']])\n }, [\n createElementVNode(\"div\", _hoisted_1, [\n createVNode(_component_Saturation, {\n value: _ctx.colors,\n onChange: $options.childChange\n }, null, 8 /* PROPS */, [\"value\", \"onChange\"])\n ]),\n createElementVNode(\"div\", _hoisted_2, [\n createElementVNode(\"div\", _hoisted_3, [\n createElementVNode(\"div\", _hoisted_4, [\n createVNode(_component_Hue, {\n value: _ctx.colors,\n onChange: $options.childChange\n }, null, 8 /* PROPS */, [\"value\", \"onChange\"])\n ]),\n (!$props.disableAlpha)\n ? (openBlock(), createElementBlock(\"div\", _hoisted_5, [\n createVNode(_component_Alpha, {\n value: _ctx.colors,\n onChange: $options.childChange\n }, null, 8 /* PROPS */, [\"value\", \"onChange\"])\n ]))\n : createCommentVNode(\"v-if\", true)\n ]),\n createElementVNode(\"div\", _hoisted_6, [\n createElementVNode(\"div\", {\n \"aria-label\": `Current color is ${$options.activeColor}`,\n class: \"vc-sketch-active-color\",\n style: normalizeStyle({ background: $options.activeColor })\n }, null, 12 /* STYLE, PROPS */, _hoisted_7),\n createVNode(_component_Checkboard)\n ])\n ]),\n (!$props.disableFields)\n ? (openBlock(), createElementBlock(\"div\", _hoisted_8, [\n createCommentVNode(\" rgba \"),\n createElementVNode(\"div\", _hoisted_9, [\n createVNode(_component_EdIn, {\n label: \"hex\",\n value: $options.hex,\n onChange: $options.inputChange\n }, null, 8 /* PROPS */, [\"value\", \"onChange\"])\n ]),\n createElementVNode(\"div\", _hoisted_10, [\n createVNode(_component_EdIn, {\n label: \"r\",\n value: _ctx.colors.rgba.r,\n onChange: $options.inputChange\n }, null, 8 /* PROPS */, [\"value\", \"onChange\"])\n ]),\n createElementVNode(\"div\", _hoisted_11, [\n createVNode(_component_EdIn, {\n label: \"g\",\n value: _ctx.colors.rgba.g,\n onChange: $options.inputChange\n }, null, 8 /* PROPS */, [\"value\", \"onChange\"])\n ]),\n createElementVNode(\"div\", _hoisted_12, [\n createVNode(_component_EdIn, {\n label: \"b\",\n value: _ctx.colors.rgba.b,\n onChange: $options.inputChange\n }, null, 8 /* PROPS */, [\"value\", \"onChange\"])\n ]),\n (!$props.disableAlpha)\n ? (openBlock(), createElementBlock(\"div\", _hoisted_13, [\n createVNode(_component_EdIn, {\n label: \"a\",\n value: _ctx.colors.a,\n \"arrow-offset\": 0.01,\n max: 1,\n onChange: $options.inputChange\n }, null, 8 /* PROPS */, [\"value\", \"arrow-offset\", \"onChange\"])\n ]))\n : createCommentVNode(\"v-if\", true)\n ]))\n : createCommentVNode(\"v-if\", true),\n createElementVNode(\"div\", _hoisted_14, [\n (openBlock(true), createElementBlock(Fragment, null, renderList($props.presetColors, (c) => {\n return (openBlock(), createElementBlock(Fragment, null, [\n (!_ctx.isTransparent(c))\n ? (openBlock(), createElementBlock(\"div\", {\n key: `!${c}`,\n class: \"vc-sketch-presets-color\",\n \"aria-label\": `Color:${c}`,\n style: normalizeStyle({ background: c }),\n onClick: $event => ($options.handlePreset(c))\n }, null, 12 /* STYLE, PROPS */, _hoisted_15))\n : (openBlock(), createElementBlock(\"div\", {\n key: c,\n \"aria-label\": `Color:${c}`,\n class: \"vc-sketch-presets-color\",\n onClick: $event => ($options.handlePreset(c))\n }, [\n createVNode(_component_Checkboard)\n ], 8 /* PROPS */, _hoisted_16))\n ], 64 /* STABLE_FRAGMENT */))\n }), 256 /* UNKEYED_FRAGMENT */))\n ])\n ], 2 /* CLASS */))\n}\n\nvar css_248z = \".vc-sketch{background:#fff;border-radius:4px;box-shadow:0 0 0 1px rgba(0,0,0,.15),0 8px 16px rgba(0,0,0,.15);box-sizing:initial;padding:10px 10px 0;position:relative;width:200px}.vc-sketch-saturation-wrap{overflow:hidden;padding-bottom:75%;position:relative;width:100%}.vc-sketch-controls{display:flex}.vc-sketch-sliders{flex:1;padding:4px 0}.vc-sketch-sliders .vc-alpha-gradient,.vc-sketch-sliders .vc-hue{border-radius:2px}.vc-sketch-alpha-wrap,.vc-sketch-hue-wrap{height:10px;position:relative}.vc-sketch-alpha-wrap{margin-top:4px;overflow:hidden}.vc-sketch-color-wrap{border-radius:3px;height:24px;margin-left:4px;margin-top:4px;position:relative;width:24px}.vc-sketch-active-color{border-radius:2px;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.15),inset 0 0 4px rgba(0,0,0,.25);left:0;position:absolute;right:0;top:0;z-index:2}.vc-sketch-color-wrap .vc-checkerboard{background-size:auto}.vc-sketch-field{display:flex;padding-top:4px}.vc-sketch-field .vc-input__input{border:none;box-shadow:inset 0 0 0 1px #ccc;font-size:10px;padding:4px 0 3px 10%;width:90%}.vc-sketch-field .vc-input__label{color:#222;display:block;font-size:11px;padding-bottom:4px;padding-top:3px;text-align:center;text-transform:capitalize}.vc-sketch-field--single{flex:1;padding-left:6px}.vc-sketch-field--double{flex:2}.vc-sketch-presets{border-top:1px solid #eee;margin-left:-10px;margin-right:-10px;padding-left:10px;padding-top:10px}.vc-sketch-presets-color{cursor:pointer;display:inline-block;height:16px;margin:0 10px 10px 0;overflow:hidden;position:relative;vertical-align:top;width:16px}.vc-sketch-presets-color,.vc-sketch-presets-color .vc-checkerboard{border-radius:3px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.15)}.vc-sketch__disable-alpha .vc-sketch-color-wrap{height:10px}\";\nstyleInject(css_248z);\n\nscript.render = render;\nscript.__file = \"src/components/sketch/sketch.vue\";\n\nscript.install = install;\n\nexport { script as default };\n","\n\n","\n\n\n","\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n","\n\n","\n\n\n","\n","\n\n","\n\n\n\n","\n\n\n","import { createRouter, createWebHistory } from 'vue-router'\nimport type { RouteLocationNormalized } from 'vue-router'\n\nimport LandingView from '@/views/Landing.vue'\nimport Dashboard from '@/views/Dashboard.vue'\nimport ProjectSelection from '@/views/ProjectSelection.vue'\nimport Benchmark from '@/views/Benchmark.vue'\nimport NotFound from '@/views/NotFound.vue'\nimport TestZone from '@/views/TestZone.vue'\nimport ReportPage from '@/views/ReportPage.vue'\n\n\nimport LoginComponent from '@/components/SpeckleLogin.vue'\n\nimport { useSpeckleStore } from '@/stores/speckle'\nimport { logMessageToSentry } from '@/utils/monitoring'\nimport { useSettingsStore } from '@/stores/settings'\nimport { useNavigationStore } from '@/stores/navigation'\n\n/**\n * The router instance for the application.\n */\nconst router = createRouter({\n history: createWebHistory(import.meta.env.BASE_URL),\n routes: [\n {\n path: '/',\n name: 'Landing',\n component: LandingView,\n meta: {\n requiresAuth: false,\n title: 'Landing',\n icon: '',\n },\n },\n {\n path: '/login',\n name: 'Login',\n component: LoginComponent,\n meta: {\n requiresAuth: false,\n title: 'Login',\n icon: '',\n },\n },\n {\n path: '/dashboard',\n name: 'Dashboard',\n component: Dashboard,\n meta: {\n requiresAuth: true,\n title: 'Dashboard',\n icon: '',\n },\n },\n {\n path: '/projects',\n name: 'Projects',\n component: ProjectSelection,\n meta: {\n requiresAuth: true,\n title: 'Project Selection',\n icon: '',\n },\n },\n {\n path: '/benchmark',\n name: 'Benchmark',\n component: Benchmark,\n meta: {\n requiresAuth: true,\n title: 'Benchmark',\n icon: '',\n },\n },\n {\n path: '/report',\n name: 'Report',\n component: ReportPage,\n meta: {\n requiresAuth: true,\n title: 'Report',\n icon: '',\n },\n },\n {\n path: '/:catchAll(.*)', // Wildcard for missing routes.\n name: 'NotFound', // 404 page.\n component: NotFound,\n meta: {\n requiresAuth: false,\n title: 'Not Found',\n icon: '',\n },\n },\n {\n path: '/test',\n name: 'Test',\n component: TestZone,\n meta: {\n requiresAuth: false,\n title: 'Test',\n icon: '',\n },\n },\n ],\n})\n\n/**\n * A navigation guard function that is executed before each route navigation.\n * It handles the exchange of access codes, updates the user information, and checks for authentication.\n *\n * @param to - The target route location.\n * @returns A route object indicating the next route to navigate to.\n */\nconst beforeEachGuard = async (to: RouteLocationNormalized) => {\n const speckleStore = useSpeckleStore()\n const settingsStore = useSettingsStore()\n const navigationStore = useNavigationStore()\n\n if (to.query.access_code) {\n // If the route contains an access code, exchange it.\n let accessCode: string\n if (Array.isArray(to.query.access_code) && to.query.access_code[0] != null) {\n accessCode = to.query.access_code[0].toString()\n }\n else {\n accessCode = to.query.access_code.toString()\n }\n\n // If the access code is not set, return to the home page.\n await speckleStore.exchangeAccessCodes(accessCode)\n .then(() => {\n logMessageToSentry('Access code exchange was successful', 'info');\n return { name: 'Projects' }\n })\n .catch(() => {\n logMessageToSentry('Access code exchange failed', 'warning');\n return { name: 'Home' }\n });\n }\n // Fetch if the user is authenticated.\n await speckleStore.updateUser().then(() => {\n logMessageToSentry(\"Updated current user to: \" + speckleStore.getUserInfo?.name, 'info');\n }).then(() => {\n // If the route requires authentication and the user is not authenticated, return to the login page.\n if (to.meta.requiresAuth && !speckleStore.isAuthenticated) {\n if (settingsStore.keySettings.speckleConfig.id == undefined || settingsStore.keySettings.speckleConfig.secret == undefined) {\n console.log(\"Speckle credentials are not set, redirecting to project.\")\n navigationStore.toggleSettingsModal()\n return { name: 'Projects' }\n } else {\n //logMessageToSentry(\"User is not authenticated, but the route required it.\", 'warning')\n console.log(\"User is not authenticated, but the route required it and keys exists.\")\n speckleStore.login()\n return { name: 'Login' }\n }\n }\n return true\n })\n}\n\nrouter.beforeEach(beforeEachGuard)\n\nexport default router","export const clickOutsideDirective = {\n beforeMount(element, binding) {\n element.clickOutsideEvent = function (event) {\n if (!(element === event.target || element.contains(event.target))) {\n binding.value(event)\n }\n }\n document.addEventListener('click', element.clickOutsideEvent, true)\n },\n unmounted(element) {\n document.removeEventListener('click', element.clickOutsideEvent, true)\n },\n}\n","/**\n * Entry point of the application.\n * Initializes the Vue app, Pinia store, router, and mounts the app to the DOM.\n */\n\nimport { createApp } from 'vue'\nimport { createPinia } from 'pinia'\nimport piniaPluginPersistedstate from 'pinia-plugin-persistedstate'\n\nimport App from './App.vue'\nimport router from './router'\nimport * as Sentry from '@sentry/vue'\nimport { initializeFirebase } from '@/firebase'\n\nimport './index.css'\nimport type { Vue } from '@sentry/vue/types/types'\n\nimport { clickOutsideDirective } from '@/directives/clickDirectives'\n\n// Create the Vue 3 application.\nconst app = createApp(App)\n\n// Initialize Sentry for application-wide\n// error monitoring and performance tracking.\nSentry.init({\n app,\n // dsn: import.meta.env.VITE_SENTRY_DSN,\n debug: false, // TODO Set this to `false` for production\n attachStacktrace: true,\n integrations: [\n new Sentry.BrowserTracing({\n // TODO Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled\n tracePropagationTargets: ['localhost', /^https:\\/\\/yourserver\\.io\\/api/],\n routingInstrumentation: Sentry.vueRouterInstrumentation(router)\n }),\n new Sentry.Replay({\n // Additional SDK configuration:\n maskAllText: true,\n blockAllMedia: true\n })\n ],\n // Performance (set appropriately for production.)\n tracesSampleRate: 0.1, // Capture 100% of transactions\n replaysSessionSampleRate: 0.5, // Change the sample rate to 100% while in development and then sample at a lower rate in production.\n replaysOnErrorSampleRate: 1.0 // If you're not already sampling the entire session, change the sample rate to 100% when sampling sessions where errors occur.\n})\n\n/**\n * Configures global error handling for Vue application.\n * @param {Vue} app - The Vue 3 application instance.\n */\nexport function configureGlobalErrorHandling(app: Vue) {\n app.config.errorHandler = (err: any, vm: any, info: any) => {\n Sentry.captureException(err, {\n extra: { info }\n })\n console.error(`Error: ${err}, Info: ${info}`)\n }\n}\n\n// Setup our Pinia store, and initialize the router.\nconst pinia = createPinia()\npinia.use(piniaPluginPersistedstate)\n\napp.use(pinia)\napp.use(router)\n\n// Create directives\napp.directive('click-outside' ,clickOutsideDirective)\n\n// Mount the app.\napp.mount('#app')\n\ninitializeFirebase()\n\nexport default app\n"],"file":"assets/index-af8551e8.js"} \ No newline at end of file +{"version":3,"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAsOV,eACU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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ACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,MACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,QACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,SACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,QACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,QACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,iBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,MACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,MACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,gBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,kBACR,EACD,CACE,MAAQ,UACR,KAAO,kBACR,EACD,CACE,MAAQ,UACR,KAAO,kBACR,EACD,CACE,MAAQ,UACR,KAAO,kBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,gBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,MACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,MACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,MACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,iBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,kBACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,mBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,MACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,SACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,MACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,OACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,kBACR,EACD,CACE,MAAQ,UACR,KAAO,kBACR,EACD,CACE,MAAQ,UACR,KAAO,kBACR,EACD,CACE,MAAQ,UACR,KAAO,kBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,gBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,sBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,OACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,OACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,kBACR,EACD,CACE,MAAQ,UACR,KAAO,kBACR,EACD,CACE,MAAQ,UACR,KAAO,kBACR,EACD,CACE,MAAQ,UACR,KAAO,kBACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,MACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,iBACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,SACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,KACR,EACD,CACE,MAAQ,UACR,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,OACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,MACR,EACD,CACE,MAAQ,UACR,KAAO,OACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,WACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,OACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,MACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,QACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,YACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,OACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,KACR,EACD,CACE,MAAQ,UACR,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,OACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,SACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,QACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,UACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,gBACR,EACD,CACE,MAAQ,UACR,KAAO,YACR,EACD,CACE,MAAQ,UACR,KAAO,cACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,eACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,aACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,WACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,QACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,UACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,MACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,IAAM,GACN,IAAM,GACN,KAAO,OACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CACE,MAAQ,UACR,KAAO,SACR,EACD,CA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3K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,CAAG,GACnC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,CAAG,GACnC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GAEpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,CAAG,GACnC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GAEpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GACpC2lB,EAAK,EAAE,EAAK+xJ,GAAe13K,EAAK,EAAI,GAEpC2lB,EAAK,EAA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CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAG,EAC9H,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAG,EAC9H,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAG,EAC9H,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAG,EAC9H,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAG,EAC9H,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAG,EAAE,CAAE,EAAG,EAAG,EAAG,CAAC,EAAI,CAAE,EAAG,EAAG,EAAG,CAAC,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,KAAK,SAAS,YAAY,CAAC,MAAM,IAAIA,CAAC,EAAE,KAAK,SAAS,eAAe,CAAC,MAAM,CAAC,EAAE,KAAK,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAksW,KAAK,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAi7T,CAAC,IAAI,gBAAgB,CAAC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAkgU,CAAC,IAAI,gBAAgB,CAAC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["makeMap","str","map","key","val","EMPTY_OBJ","EMPTY_ARR","NOOP","NO","isOn","isModelListener","extend","remove","arr","el","i","hasOwnProperty","hasOwn","isArray","isMap","toTypeString","isSet","isDate","isRegExp","isFunction","isString","isSymbol","isObject","isPromise","objectToString","value","toRawType","isPlainObject","isIntegerKey","isReservedProp","cacheStringFunction","fn","cache","camelizeRE","camelize","_","c","hyphenateRE","hyphenate","capitalize","toHandlerKey","hasChanged","oldValue","invokeArrayFns","fns","arg","def","obj","writable","looseToNumber","n","toNumber","_globalThis","getGlobalThis","GLOBALS_ALLOWED","isGloballyAllowed","normalizeStyle","res","item","normalized","parseStringStyle","listDelimiterRE","propertyDelimiterRE","styleCommentRE","cssText","ret","tmp","normalizeClass","name","normalizeProps","props","klass","style","specialBooleanAttrs","isSpecialBooleanAttr","includeBooleanAttr","looseCompareArrays","a","b","equal","looseEqual","aValidType","bValidType","aKeysCount","bKeysCount","aHasKey","bHasKey","looseIndexOf","isRef","toDisplayString","replacer","_key","entries","val2","stringifySymbol","v","_a","activeEffectScope","EffectScope","detached","l","currentEffectScope","fromParent","last","effectScope","getCurrentScope","onScopeDispose","failSilently","activeSub","pausedQueueEffects","ReactiveEffect","batch","cleanupEffect","prepareDeps","prevEffect","prevShouldTrack","shouldTrack","cleanupDeps","link","removeSub","isDirty","batchDepth","batchedSub","batchedComputed","sub","isComputed","startBatch","endBatch","next","error","err","head","tail","prev","removeDep","refreshComputed","computed","globalVersion","dep","prevSub","soft","nextSub","prevDep","nextDep","effect","options","e","runner","stop","trackStack","pauseTracking","resetTracking","cleanup","Link","Dep","debugInfo","addSub","currentTail","targetMap","ITERATE_KEY","MAP_KEY_ITERATE_KEY","ARRAY_ITERATE_KEY","track","target","type","depsMap","trigger","newValue","oldTarget","run","targetIsArray","isArrayIndex","newLength","key2","getDepFromReactive","object","depMap","reactiveReadArray","array","raw","toRaw","isShallow","toReactive","shallowReadArray","arrayInstrumentations","iterator","args","x","thisArg","apply","searchProxy","separator","noTracking","reduce","comparer","self","method","wrapValue","iter","result","arrayProto","wrappedRetFn","needsWrap","methodFn","result2","wrappedFn","index","acc","isProxy","isNonTrackableKeys","builtInSymbols","BaseReactiveHandler","_isReadonly","_isShallow","receiver","isReadonly2","isShallow2","shallowReadonlyMap","readonlyMap","shallowReactiveMap","reactiveMap","readonly","reactive","MutableReactiveHandler","isOldValueReadonly","isReadonly","hadKey","ReadonlyReactiveHandler","mutableHandlers","readonlyHandlers","shallowReactiveHandlers","shallowReadonlyHandlers","toShallow","getProto","createIterableMethod","rawTarget","targetIsMap","isPair","isKeyOnly","innerIterator","wrap","toReadonly","done","createReadonlyMethod","createInstrumentations","shallow","instrumentations","rawKey","has","callback","observed","get","hadItems","createInstrumentationGetter","mutableCollectionHandlers","shallowCollectionHandlers","readonlyCollectionHandlers","shallowReadonlyCollectionHandlers","targetTypeMap","rawType","getTargetType","createReactiveObject","shallowReactive","shallowReadonly","baseHandlers","collectionHandlers","proxyMap","existingProxy","targetType","proxy","isReactive","markRaw","r","ref","createRef","shallowRef","rawValue","RefImpl","useDirectValue","triggerRef","ref2","unref","toValue","source","shallowUnwrapHandlers","proxyRefs","objectWithRefs","CustomRefImpl","factory","set","newVal","customRef","toRefs","propertyToRef","ObjectRefImpl","_object","_defaultValue","GetterRefImpl","_getter","toRef","defaultValue","ComputedRefImpl","setter","isSSR","getterOrOptions","debugOptions","getter","TrackOpTypes","TriggerOpTypes","INITIAL_WATCHER_VALUE","cleanupMap","activeWatcher","getCurrentWatcher","onWatcherCleanup","cleanupFn","owner","cleanups","watch","cb","immediate","deep","once","scheduler","augmentJob","call","reactiveGetter","source2","traverse","boundCleanup","forceTrigger","isMultiSource","s","currentEffect","baseGetter","depth","scope","watchHandle","_cb","job","immediateFirstRun","currentWatcher","cleanup2","seen","stack","pushWarningContext","vnode","popWarningContext","assertNumber","ErrorCodes","ErrorTypeStrings$1","callWithErrorHandling","instance","handleError","callWithAsyncErrorHandling","values","throwInDev","contextVNode","errorHandler","throwUnhandledErrorInProduction","cur","exposedInstance","errorInfo","errorCapturedHooks","logError","throwInProd","queue","flushIndex","pendingPostFlushCbs","activePostFlushCbs","postFlushIndex","resolvedPromise","currentFlushPromise","nextTick","p","findInsertionIndex","id","start","end","middle","middleJob","middleJobId","getId","queueJob","jobId","lastJob","queueFlush","flushJobs","queuePostFlushCb","flushPreFlushCbs","flushPostFlushCbs","deduped","check","devtools$1","buffer","setDevtoolsHook$1","hook","_b","event","newHook","currentRenderingInstance","currentScopeId","setCurrentRenderingInstance","pushScopeId","popScopeId","withScopeId","_id","withCtx","ctx","isNonScopedSlot","renderFnWithContext","setBlockTracking","prevInstance","withDirectives","directives","getComponentPublicInstance","bindings","dir","modifiers","invokeDirectiveHook","prevVNode","oldBindings","binding","TeleportEndKey","isTeleport","isTeleportDisabled","isTeleportDeferred","isTargetSVG","isTargetMathML","resolveTarget","select","targetSelector","TeleportImpl","n1","n2","container","anchor","parentComponent","parentSuspense","namespace","slotScopeIds","optimized","internals","mountChildren","patchChildren","patchBlockChildren","insert","querySelector","createText","createComment","disabled","shapeFlag","children","dynamicChildren","placeholder","mainAnchor","mount","container2","anchor2","mountToTarget","targetAnchor","prepareAnchor","updateCssVars","queuePostRenderEffect","wasDisabled","currentContainer","currentAnchor","traverseStaticChildren","moveTeleport","nextTarget","unmount","hostRemove","doRemove","targetStart","shouldRemove","child","hydrateTeleport","parentAnchor","move","moveType","isReorder","node","nextSibling","parentNode","hydrateChildren","targetNode","Teleport","isDisabled","leaveCbKey","enterCbKey","useTransitionState","state","onMounted","onBeforeUnmount","TransitionHookValidator","BaseTransitionPropsValidators","recursiveGetSubtree","subTree","BaseTransitionImpl","slots","getCurrentInstance","getTransitionRawChildren","findNonCommentChild","rawProps","mode","emptyPlaceholder","innerChild","getInnerChild$1","enterHooks","resolveTransitionHooks","hooks","Comment","setTransitionHooks","oldInnerChild","isSameVNodeType","leavingHooks","earlyRemove","delayedLeave","leavingVNodesCache","getLeavingNodesForType","BaseTransition","leavingVNodes","postClone","appear","persisted","onBeforeEnter","onEnter","onAfterEnter","onEnterCancelled","onBeforeLeave","onLeave","onAfterLeave","onLeaveCancelled","onBeforeAppear","onAppear","onAfterAppear","onAppearCancelled","callHook","callAsyncHook","hook2","leavingVNode","afterHook","cancelHook","called","cancelled","vnode2","hooks2","isKeepAlive","cloneVNode","keepComment","parentKey","keyedFragmentCount","Fragment","defineComponent","extraOptions","useId","markAsyncBoundary","useTemplateRef","refs","setRef","rawRef","oldRawRef","isUnmount","isAsyncWrapper","refValue","oldRef","setupState","rawSetupState","canSetSetupRef","_isString","_isRef","doSet","existing","hasLoggedMismatchError","logMismatchError","isSVGContainer","isMathMLContainer","getContainerType","isComment","createHydrationFunctions","rendererInternals","mountComponent","patch","patchProp","hydrate","hydrateNode","isFragmentStart","onMismatch","handleMismatch","patchFlag","domType","nextNode","Text","isTemplateNode","replaceNode","Static","needToAdoptContent","hydrateFragment","hydrateElement","locateClosingAnchor","createVNode","createTextVNode","dirs","transition","forcePatch","needCallTransitionHooks","needTransition","content","isMismatchAllowed","clientText","isCustomElement","vnodeHooks","invokeVNodeHook","queueEffectWithSuspense","parentVNode","normalizeVNode","isText","fragmentSlotScopeIds","isFragment","next2","updateHOCHostEl","open","close","match","newNode","oldNode","parentNode2","parent","allowMismatchAttr","MismatchTypeString","allowedType","allowedAttr","list","requestIdleCallback","cancelIdleCallback","hydrateOnIdle","timeout","elementIsVisibleInViewport","top","left","bottom","right","innerHeight","innerWidth","hydrateOnVisible","opts","forEach","ob","hydrateOnMediaQuery","query","mql","hydrateOnInteraction","interactions","hasHydrated","doHydrate","teardown","forEachElement","defineAsyncComponent","loader","loadingComponent","errorComponent","delay","hydrateStrategy","suspensible","userOnError","pendingRequest","resolvedComp","retries","retry","load","thisRequest","resolve","reject","comp","currentInstance","createInnerComp","onError","isInSSRComponentSetup","loaded","delayed","ce","KeepAliveImpl","sharedContext","keys","current","_unmount","createElement","storageContainer","instance2","vnodeHook","invalidateMount","resetShapeFlag","pruneCache","filter","getComponentName","pruneCacheEntry","cached","include","exclude","matches","pendingCacheKey","cacheSubtree","isSuspense","getInnerChild","onUpdated","suspense","da","rawVNode","isVNode","max","cachedVNode","KeepAlive","pattern","onActivated","registerKeepAliveHook","onDeactivated","wrappedHook","injectHook","injectToKeepAliveRoot","keepAliveRoot","injected","onUnmounted","prepend","reset","setCurrentInstance","createHook","lifecycle","onBeforeMount","onBeforeUpdate","onServerPrefetch","onRenderTriggered","onRenderTracked","onErrorCaptured","COMPONENTS","DIRECTIVES","resolveComponent","maybeSelfReference","resolveAsset","NULL_DYNAMIC_COMPONENT","resolveDynamicComponent","component","resolveDirective","warnMissing","Component","selfName","registry","renderList","renderItem","sourceIsArray","sourceIsReactiveArray","createSlots","dynamicSlots","slot","j","renderSlot","fallback","noSlotted","openBlock","createBlock","validSlotContent","ensureValidVNode","slotKey","rendered","vnodes","toHandlers","preserveCaseIfNecessary","getPublicInstance","isStatefulComponent","publicPropertiesMap","resolveMergedOptions","instanceWatch","hasSetupBinding","PublicInstanceProxyHandlers","data","accessCache","appContext","normalizedProps","shouldCacheAccess","publicGetter","cssModule","globalProperties","propsOptions","descriptor","RuntimeCompiledPublicInstanceProxyHandlers","defineProps","defineEmits","defineExpose","exposed","defineOptions","defineSlots","defineModel","withDefaults","defaults","useSlots","getContext","useAttrs","createSetupContext","normalizePropsOrEmits","mergeDefaults","opt","mergeModels","createPropsRestProxy","excludedKeys","withAsyncContext","getAwaitable","awaitable","unsetCurrentInstance","applyOptions","publicThis","dataOptions","computedOptions","methods","watchOptions","provideOptions","injectOptions","created","beforeMount","mounted","beforeUpdate","updated","activated","deactivated","beforeDestroy","beforeUnmount","destroyed","unmounted","render","renderTracked","renderTriggered","errorCaptured","serverPrefetch","expose","inheritAttrs","components","filters","resolveInjections","methodHandler","createWatcher","provides","provide","registerLifecycleHook","register","_hook","checkDuplicateProperties","normalizeInject","inject","h","createPathGetter","handler","base","mixins","extendsOptions","globalMixins","optionMergeStrategies","resolved","m","mergeOptions","to","from","strats","asMixin","strat","internalOptionMergeStrats","mergeDataFn","mergeEmitsOrPropsOptions","mergeObjectOptions","mergeAsArray","mergeWatchOptions","mergeInject","merged","createAppContext","uid$1","createAppAPI","rootComponent","rootProps","context","installedPlugins","pluginCleanupFns","isMounted","app","version","plugin","mixin","directive","rootContainer","isHydrate","lastApp","currentApp","parentProvides","treatDefaultAsFactory","hasInjectionContext","internalObjectProto","createInternalObject","isInternalObject","initProps","isStateful","attrs","setFullProps","updateProps","rawPrevProps","rawCurrentProps","hasAttrsChanged","propsToUpdate","isEmitListener","camelizedKey","resolvePropValue","kebabKey","needCastKeys","rawCastValues","camelKey","castValues","isAbsent","hasDefault","propsDefaults","mixinPropsCache","normalizePropsOptions","hasExtends","extendProps","raw2","normalizedKey","validatePropName","prop","propType","shouldCast","shouldCastTrue","typeName","isInternalKey","normalizeSlotValue","normalizeSlot","rawSlot","normalizeObjectSlots","rawSlots","normalizeVNodeSlots","assignSlots","initSlots","updateSlots","needDeletionCheck","deletionComparisonTarget","createRenderer","baseCreateRenderer","createHydrationRenderer","createHydrationFns","hostInsert","hostPatchProp","hostCreateElement","hostCreateText","hostCreateComment","hostSetText","hostSetElementText","hostParentNode","hostNextSibling","hostSetScopeId","hostInsertStaticContent","getNextHostNode","processText","processCommentNode","mountStaticNode","processFragment","processElement","processComponent","moveStaticNode","removeStaticNode","mountElement","patchElement","resolveChildrenNamespace","setScopeId","scopeId","cloneIfMounted","oldProps","newProps","toggleRecurse","patchProps","oldChildren","newChildren","fallbackContainer","oldVNode","newVNode","fragmentStartAnchor","fragmentEndAnchor","updateComponent","initialVNode","createComponentInstance","setupComponent","setupRenderEffect","shouldUpdateComponent","updateComponentPreRender","componentUpdateFn","bu","u","nonHydratedAsyncRoot","locateNonHydratedAsyncRoot","originNext","nextTree","renderComponentRoot","prevTree","bm","root","isAsyncWrapperVNode","hydrateSubTree","scopedInitialVNode","update","nextVNode","prevProps","c1","prevShapeFlag","c2","patchKeyedChildren","patchUnkeyedChildren","unmountChildren","oldLength","commonLength","nextChild","l2","e1","e2","nextPos","s1","s2","keyToNewIndexMap","patched","toBePatched","moved","maxNewIndexSoFar","newIndexToOldIndexMap","prevChild","newIndex","increasingNewIndexSequence","getSequence","nextIndex","leave","delayLeave","afterLeave","remove2","performLeave","cacheIndex","shouldInvokeDirs","shouldInvokeVnodeHook","unmountComponent","removeFragment","performRemove","bum","um","teleportEnd","isFlushing","currentNamespace","allowed","ch1","ch2","len","arrI","subComponent","ssrContextKey","useSSRContext","watchEffect","doWatch","watchPostEffect","watchSyncEffect","flush","baseWatchOptions","runsImmediately","ssrCleanup","watchStopHandle","isPre","isFirstRun","watch$1","path","segments","useModel","camelizedName","hyphenatedName","getModelModifiers","localValue","prevSetValue","prevEmittedValue","propValue","emittedValue","i2","modelName","emit","rawArgs","handlerName","onceHandler","normalizeEmitsOptions","extendEmits","normalizedFromExtend","withProxy","renderCache","fallthroughAttrs","proxyToUse","thisProxy","render2","getFunctionalFallthrough","blockStack","filterModelListeners","filterSingleRoot","recurse","singleRoot","prevChildren","nextProps","nextChildren","emits","hasPropsChanged","dynamicProps","emitsOptions","nextKeys","suspenseId","SuspenseImpl","mountSuspense","patchSuspense","hydrateSuspense","normalizeSuspenseChildren","Suspense","triggerEvent","eventListener","hiddenContainer","createSuspenseBoundary","setActiveBranch","newBranch","newFallback","activeBranch","pendingBranch","isInFallback","isHydrating","pendingId","parentSuspenseId","isSuspensible","isVNodeSuspensible","initialAnchor","resume","sync","effects","parentComponent2","delayEnter","hasUnresolvedAncestor","fallbackVNode","namespace2","mountFallback","optimized2","isInPendingSuspense","hydratedEl","asyncSetupResult","handleSetupResult","parentSuspense2","isSlotChildren","normalizeSuspenseSlot","block","trackBlock","isBlockTreeEnabled","currentBlock","closeBlock","branch","disableTracking","inVOnce","setupBlock","createElementBlock","createBaseVNode","transformVNodeArgs","transformer","normalizeKey","normalizeRef","ref_key","ref_for","isBlockNode","needFullChildrenNormalization","normalizeChildren","_createVNode","cloned","isClassComponent","guardReactiveProps","extraProps","mergeRef","cloneTransition","mergedProps","mergeProps","text","flag","createStaticVNode","numberOfNodes","createCommentVNode","asBlock","slotFlag","toMerge","incoming","emptyAppContext","uid","internalSetCurrentInstance","setInSSRSetupState","g","registerGlobalSetter","setters","setupResult","setupStatefulComponent","setup","setupContext","isAsyncSetup","resolvedResult","finishComponentSetup","compile","installWithProxy","registerRuntimeCompiler","_compile","isRuntimeOnly","skipOptions","template","compilerOptions","delimiters","componentCompilerOptions","finalCompilerOptions","attrsProxyHandlers","includeInferred","computed$1","propsOrChildren","initCustomFormatter","withMemo","memo","isMemoSame","warn","ErrorTypeStrings","devtools","setDevtoolsHook","_ssrUtils","ssrUtils","resolveFilter","compatUtils","DeprecationTypes","policy","tt","unsafeToTrustedHTML","svgNS","mathmlNS","doc","templateContainer","nodeOps","tag","is","selector","before","wrapper","TRANSITION","ANIMATION","vtcKey","DOMTransitionPropsValidators","TransitionPropsValidators","decorate$1","Transition","resolveTransitionProps","h2","hasExplicitCallback","baseProps","duration","enterFromClass","enterActiveClass","enterToClass","appearFromClass","appearActiveClass","appearToClass","leaveFromClass","leaveActiveClass","leaveToClass","durations","normalizeDuration","enterDuration","leaveDuration","finishEnter","isAppear","isCancelled","removeTransitionClass","finishLeave","makeEnterHook","nextFrame","addTransitionClass","whenTransitionEnds","forceReflow","NumberOf","cls","_vtc","endId","expectedType","explicitTimeout","resolveIfNotStale","propCount","getTransitionInfo","endEvent","ended","onEnd","styles","getStyleProperties","transitionDelays","transitionDurations","transitionTimeout","getTimeout","animationDelays","animationDurations","animationTimeout","hasTransform","delays","d","toMs","patchClass","isSVG","transitionClasses","vShowOriginalDisplay","vShowHidden","vShow","setDisplay","initVShowForSSR","CSS_VAR_TEXT","useCssVars","updateTeleports","vars","setVarsOnNode","setVars","setVarsOnVNode","displayRE","patchStyle","isCssString","hasControlledDisplay","prevStyle","setStyle","cssVarText","importantRE","prefixed","autoPrefix","prefixes","prefixCache","rawName","xlinkNS","patchAttr","isBoolean","patchDOMProp","attrName","needRemove","addEventListener","removeEventListener","veiKey","patchEvent","prevValue","nextValue","invokers","existingInvoker","parseName","invoker","createInvoker","optionsModifierRE","cachedNow","getNow","initialValue","patchStopImmediatePropagation","originalStop","isNativeOn","shouldSetAsProp","camelize$1","REMOVAL","defineCustomElement","_createApp","Comp","VueCustomElement","VueElement","initialProps","defineSSRCustomElement","createSSRApp","BaseClass","_def","_props","createApp","mutations","isAsync","numberProps","asyncDef","declaredPropKeys","shouldReflect","shouldUpdate","dispatch","nonce","slotName","outlets","o","walker","useHost","caller","useShadowRoot","useCssModule","modules","mod","positionMap","newPositionMap","moveCbKey","decorate","TransitionGroupImpl","moveClass","hasCSSTransform","callPendingCbs","recordPosition","movedChildren","applyTranslation","cssTransitionProps","TransitionGroup","oldPos","newPos","dx","dy","clone","getModelAssigner","onCompositionStart","onCompositionEnd","assignKey","vModelText","lazy","trim","number","castToNumber","domValue","elValue","vModelCheckbox","modelValue","elementValue","getValue","checked","assign","found","filtered","getCheckboxValue","setChecked","vModelRadio","vModelSelect","isSetModel","selectedVal","setSelected","_binding","isMultiple","isArrayValue","option","optionValue","optionType","vModelDynamic","callModelHook","resolveDynamicModel","tagName","initVModelForSSR","modelToUse","systemModifiers","modifierGuards","withModifiers","cacheKey","guard","keyNames","withKeys","eventKey","k","rendererOptions","renderer","enabledHydration","ensureRenderer","ensureHydrationRenderer","containerOrSelector","normalizeContainer","resolveRootNamespace","ssrDirectiveInitialized","initDirectivesForSSR","isVue2","activePinia","setActivePinia","pinia","piniaSymbol","MutationType","createPinia","_p","toBeInstalled","noop","addSubscription","subscriptions","onCleanup","removeSubscription","idx","triggerSubscriptions","fallbackRunWithContext","ACTION_MARKER","ACTION_NAME","mergeReactiveObjects","patchToApply","subPatch","targetValue","skipHydrateSymbol","shouldHydrate","createOptionsStore","hot","actions","getters","initialState","store","localState","computedGetters","createSetupStore","$id","isOptionsStore","optionsForPlugin","$subscribeOptions","isListening","isSyncListening","actionSubscriptions","debuggerEvents","activeListener","$patch","partialStateOrMutator","subscriptionMutation","myListenerId","$reset","newState","$state","$dispose","action","wrappedAction","afterCallbackList","onErrorCallbackList","after","partialStore","stopWatcher","setupStore","actionValue","extender","defineStore","idOrOptions","setupOptions","isSetupStore","useStore","hasContext","storeToRefs","rawStore","suspectProtoRx","suspectConstructorRx","JsonSigRx","jsonParseTransform","warnKeyDropped","destr","_value","_lval","unset","deepPickUnsafe","paths","t","deepOmitUnsafe","hydrateStore","storage","serializer","debug","pick","omit","beforeHydrate","afterHydrate","runHooks","fromStorage","deserialized","picked","omitted","persistState","toStorage","createPersistence","optionsParser","auto","persist","originalStore","persistences","_mutation","createPersistedState","src_default","isBrowser","isRouteComponent","isESModule","applyToParams","params","newParams","HASH_RE","AMPERSAND_RE","SLASH_RE","EQUAL_RE","IM_RE","PLUS_RE","ENC_BRACKET_OPEN_RE","ENC_BRACKET_CLOSE_RE","ENC_CARET_RE","ENC_BACKTICK_RE","ENC_CURLY_OPEN_RE","ENC_PIPE_RE","ENC_CURLY_CLOSE_RE","ENC_SPACE_RE","commonEncode","encodeHash","encodeQueryValue","encodeQueryKey","encodePath","encodeParam","decode","TRAILING_SLASH_RE","removeTrailingSlash","parseURL","parseQuery","location","currentLocation","searchString","hash","hashPos","searchPos","resolveRelativePath","stringifyURL","stringifyQuery","stripBase","pathname","isSameRouteLocation","aLastIndex","bLastIndex","isSameRouteRecord","isSameRouteLocationParams","isSameRouteLocationParamsValue","isEquivalentArray","fromSegments","toSegments","lastToSegment","position","toPosition","segment","START_LOCATION_NORMALIZED","NavigationType","NavigationDirection","normalizeBase","baseEl","BEFORE_HASH_RE","createHref","getElementPosition","offset","docRect","elRect","computeScrollPosition","scrollToPosition","scrollToOptions","positionEl","isIdSelector","getScrollKey","delta","scrollPositions","saveScrollPosition","scrollPosition","getSavedScrollPosition","scroll","createBaseLocation","createCurrentLocation","search","slicePos","pathFromHash","useHistoryListeners","historyState","replace","listeners","teardowns","pauseState","popStateHandler","fromState","listener","pauseListeners","listen","beforeUnloadListener","history","destroy","buildState","back","forward","replaced","computeScroll","useHistoryStateNavigation","changeLocation","hashIndex","url","push","currentState","createWebHistory","historyNavigation","historyListeners","go","triggerListeners","routerHistory","isRouteLocation","route","isRouteName","NavigationFailureSymbol","NavigationFailureType","createRouterError","isNavigationFailure","BASE_PARAM_PATTERN","BASE_PATH_PARSER_OPTIONS","REGEX_CHARS_RE","tokensToParser","score","segmentScores","tokenIndex","token","subSegmentScore","repeatable","optional","regexp","re","subPattern","parse","stringify","avoidDuplicatedSlash","param","compareScoreArray","diff","comparePathParserScore","aScore","bScore","isLastScoreNegative","ROOT_TOKEN","VALID_PARAM_RE","tokenizePath","crash","message","previousState","tokens","finalizeSegment","char","customRe","consumeBuffer","addCharToBuffer","createRouteRecordMatcher","record","parser","matcher","createRouterMatcher","routes","globalOptions","matchers","matcherMap","getRecordMatcher","addRoute","originalRecord","isRootAdd","mainNormalizedRecord","normalizeRouteRecord","normalizedRecords","aliases","alias","originalMatcher","normalizedRecord","parentPath","connectingSlash","isAliasRecord","removeRoute","isMatchable","insertMatcher","matcherRef","getRoutes","paramsFromLocation","matched","parentMatcher","mergeMetaFields","clearRoutes","normalizeRecordProps","propsObject","meta","partialOptions","lower","upper","mid","insertionAncestor","getInsertionAncestor","ancestor","searchParams","searchParam","eqPos","currentValue","normalizeQuery","normalizedQuery","matchedRouteKey","viewDepthKey","routerKey","routeLocationKey","routerViewLocationKey","useCallbacks","handlers","add","guardToPromiseFn","runWithContext","enterCallbackArray","valid","guardReturn","guardCall","extractComponentsGuards","guardType","guards","rawComponent","componentPromise","resolvedComponent","useLink","router","currentRoute","activeRecordIndex","length","routeMatched","currentMatched","parentRecordPath","getOriginalPath","isActive","includesParams","isExactActive","navigate","guardEvent","preferSingleVNode","RouterLinkImpl","elClass","getLinkClass","RouterLink","outer","inner","innerValue","outerValue","propClass","globalClass","defaultClass","RouterViewImpl","injectedRoute","routeToDisplay","injectedDepth","initialDepth","matchedRoute","matchedRouteRef","viewRef","oldInstance","oldName","currentName","ViewComponent","routePropsOption","routeProps","slotContent","RouterView","createRouter","parseQuery$1","stringifyQuery$1","beforeGuards","beforeResolveGuards","afterGuards","pendingLocation","normalizeParams","paramValue","encodeParams","decodeParams","parentOrRoute","recordMatcher","routeMatcher","hasRoute","rawLocation","locationNormalized","href","matcherLocation","targetParams","fullPath","locationAsObject","checkCanceledNavigation","pushWithRedirect","handleRedirectRecord","lastMatched","redirect","newTargetLocation","redirectedFrom","targetLocation","force","shouldRedirect","toLocation","failure","handleScroll","markAsReady","triggerError","finalizeNavigation","triggerAfterEach","checkCanceledNavigationAndReject","installedApps","leavingRecords","updatingRecords","enteringRecords","extractChangingRecords","canceledNavigationCheck","runGuardQueue","beforeEnter","isPush","isFirstNavigation","removeHistoryListener","setupListeners","_from","info","readyHandlers","errorListeners","ready","isReady","scrollBehavior","started","reactiveRoute","unmountApp","promise","recordFrom","recordTo","useRoute","_name","isError","wat","isInstanceOf","isBuiltin","className","isErrorEvent","isDOMError","isDOMException","isParameterizedString","isPrimitive","isEvent","isElement","isThenable","isSyntheticEvent","isNaN","isVueViewModel","truncate","safeJoin","input","delimiter","output","isMatchingPattern","requireExactStringMatch","stringMatchesSomePattern","testString","patterns","applyAggregateErrorsToEvent","exceptionFromErrorImplementation","maxValueLimit","limit","hint","originalException","truncateAggregateExceptions","aggregateExceptionsFromError","prevExceptions","exception","exceptionId","newExceptions","applyExceptionGroupFieldsForParentException","newException","newExceptionId","applyExceptionGroupFieldsForChildException","childError","parentId","exceptions","maxValueLength","isGlobalObj","GLOBAL_OBJ","getGlobalObject","getGlobalSingleton","creator","gbl","__SENTRY__","WINDOW","DEFAULT_MAX_STRING_LENGTH","htmlTreeAsString","elem","currentElem","MAX_TRAVERSE_HEIGHT","out","height","sepLength","nextStr","keyAttrs","maxStringLength","_htmlElementAsString","classes","attr","keyAttrPairs","keyAttr","keyAttrPair","allowedAttrs","getLocationHref","getDomElement","DEBUG_BUILD","PREFIX","CONSOLE_LEVELS","originalConsoleMethods","consoleSandbox","console","wrappedFuncs","wrappedLevels","level","originalConsoleMethod","makeLogger","enabled","logger","DSN_REGEX","isValidProtocol","protocol","dsnToString","dsn","withPassword","host","pass","port","projectId","publicKey","dsnFromString","lastPath","split","projectMatch","dsnFromComponents","validateDsn","makeDsn","SentryError","logLevel","fill","replacementFactory","original","wrapped","markFunctionWrapped","addNonEnumerableProperty","proto","getOriginalFunction","func","urlEncode","convertToPlainObject","getOwnProperties","newObj","serializeEventTarget","extractedProps","property","extractExceptionKeysForMessage","maxLength","includedKeys","serialized","dropUndefinedKeys","inputValue","_dropUndefinedKeys","memoizationMap","isPojo","memoVal","returnValue","STACKTRACE_FRAME_LIMIT","WEBPACK_ERROR_REGEXP","STRIP_FRAME_REGEXP","createStackParser","parsers","sortedParsers","skipFirst","frames","lines","line","cleanedLine","frame","stripSentryFramesAndReverse","stackParserFromStackParserOptions","stackParser","localStack","defaultFunctionName","getFunctionName","instrumented","addHandler","maybeInstrument","instrumentFn","triggerHandlers","typeHandlers","addConsoleInstrumentationHandler","instrumentConsole","log","uuid4","crypto","getRandomByte","typedArray","getFirstException","getEventDescription","eventId","firstException","addExceptionTypeValue","addExceptionMechanism","newMechanism","defaultMechanism","currentMechanism","mergedData","checkOrSetAlreadyCaught","arrayify","maybeArray","DEBOUNCE_DURATION","debounceTimerID","lastCapturedEventType","lastCapturedEventTargetId","addClickKeypressInstrumentationHandler","instrumentDOM","triggerDOMHandler","globalDOMEventHandler","makeDOMEventHandler","originalAddEventListener","handlerForType","originalRemoveEventListener","isSimilarToLastCapturedEvent","shouldSkipDOMEvent","eventType","globalListener","getEventTarget","supportsFetch","isNativeFetch","supportsNativeFetch","sandbox","addFetchInstrumentationHandler","instrumentFetch","originalFetch","parseFetchArgs","handlerData","response","finishedHandlerData","erroredHandlerData","hasProp","getUrlFromResource","resource","fetchArgs","_oldOnErrorHandler","addGlobalErrorInstrumentationHandler","instrumentError","msg","column","_oldOnUnhandledRejectionHandler","addGlobalUnhandledRejectionInstrumentationHandler","instrumentUnhandledRejection","supportsHistory","chromeVar","isChromePackagedApp","hasHistoryApi","lastHref","addHistoryInstrumentationHandler","instrumentHistory","oldOnPopState","historyReplacementFunction","originalHistoryFunction","SENTRY_XHR_DATA_KEY","addXhrInstrumentationHandler","instrumentXHR","xhrproto","originalOpen","startTimestamp","parseUrl","onreadystatechangeHandler","xhrInfo","readyStateArgs","setRequestHeaderArgs","header","originalSend","sentryXhrData","isBrowserBundle","getSDKSource","isNodeEnv","isElectronNodeRenderer","memoBuilder","hasWeakSet","memoize","unmemoize","normalize","maxProperties","visit","normalizeToSize","maxSize","jsonSize","stringified","stringifyValue","remainingDepth","valueWithToJSON","jsonValue","numAdded","visitable","visitKey","visitValue","objName","getConstructorName","prototype","utf8Length","States","RESOLVED","REJECTED","resolvedSyncPromise","SyncPromise","rejectedSyncPromise","reason","executor","onfulfilled","onrejected","onfinally","isRejected","cachedHandlers","makePromiseBuffer","task","taskProducer","drain","counter","capturedSetTimeout","fragment","validSeverityLevels","severityLevelFromString","ONE_SECOND_IN_MS","dateTimestampInSeconds","createUnixTimestampInSecondsFunc","performance","approxStartingTimeOrigin","timeOrigin","timestampInSeconds","browserPerformanceTimeOrigin","threshold","performanceNow","dateNow","timeOriginDelta","timeOriginIsReliable","navigationStart","navigationStartDelta","navigationStartIsReliable","BAGGAGE_HEADER_NAME","SENTRY_BAGGAGE_KEY_PREFIX","SENTRY_BAGGAGE_KEY_PREFIX_REGEX","MAX_BAGGAGE_STRING_LENGTH","baggageHeaderToDynamicSamplingContext","baggageHeader","baggageObject","curr","currBaggageObject","baggageHeaderToObject","dynamicSamplingContext","nonPrefixedKey","dynamicSamplingContextToSentryBaggageHeader","sentryPrefixedDSC","dscKey","dscValue","objectToBaggageHeader","baggageEntry","keyOrValue","objectKey","objectValue","currentIndex","newBaggageHeader","TRACEPARENT_REGEXP","extractTraceparentData","traceparent","parentSampled","propagationContextFromHeaders","sentryTrace","baggage","traceparentData","traceId","parentSpanId","generateSentryTraceHeader","spanId","sampled","sampledString","createEnvelope","headers","items","addItemToEnvelope","envelope","newItem","forEachEnvelopeItem","envelopeItems","envelopeItem","envelopeItemType","encodeUTF8","textEncoder","serializeEnvelope","envHeaders","parts","append","itemHeaders","payload","stringifiedPayload","concatBuffers","buffers","totalLength","buf","createAttachmentEnvelopeItem","attachment","ITEM_TYPE_TO_DATA_CATEGORY_MAP","envelopeItemTypeToDataCategory","getSdkMetadataForEnvelopeHeader","metadataOrEvent","createEventEnvelopeHeaders","sdkInfo","tunnel","createClientReportEnvelope","discarded_events","timestamp","clientReportItem","DEFAULT_RETRY_AFTER","parseRetryAfterHeader","now","headerDelay","headerDate","disabledUntil","limits","dataCategory","isRateLimited","updateRateLimits","statusCode","updatedRateLimits","rateLimitHeader","retryAfterHeader","retryAfter","categories","namespaces","category","_nullishCoalesce","lhs","rhsFn","_optionalChain","ops","lastAccessLHS","op","DEFAULT_ENVIRONMENT","getGlobalEventProcessors","addGlobalEventProcessor","notifyEventProcessors","processors","processor","final","makeSession","startingTime","session","sessionToJSON","updateSession","closeSession","status","TRACE_FLAG_NONE","TRACE_FLAG_SAMPLED","spanToTraceContext","span","span_id","trace_id","parent_span_id","tags","origin","spanToJSON","spanToTraceHeader","spanIsSampled","spanTimeInputToSeconds","ensureTimestampInSeconds","spanIsSpanClass","traceFlags","prepareEvent","client","isolationScope","normalizeDepth","normalizeMaxBreadth","prepared","integrations","applyClientOptions","applyIntegrationsMetadata","applyDebugIds","finalScope","getFinalScope","clientEventProcessors","getGlobalScope","isolationData","mergeScopeData","finalScopeData","attachments","applyScopeDataToEvent","eventProcessors","evt","applyDebugMeta","normalizeEvent","environment","release","dist","request","debugIdStackParserCache","debugIdMap","debugIdStackFramesCache","cachedDebugIdStackFrameCache","filenameDebugIdMap","debugIdStackTrace","parsedStack","cachedParsedStack","stackFrame","images","filename","integrationNames","maxBreadth","captureContext","Scope","parseEventHintOrCaptureContext","hintIsScopeOrFunction","hintIsScopeContext","captureContextKeys","captureException","getCurrentHub","captureMessage","captureEvent","addBreadcrumb","breadcrumb","setContext","withScope","rest","hub","getClient","startSession","getIsolationScope","currentScope","userAgent","currentSession","endSession","_sendSessionUpdate","captureSession","getRootSpan","getDynamicSamplingContextFromClient","public_key","user_segment","dsc","getDynamicSamplingContextFromSpan","txn","v7FrozenDsc","maybeSampleRate","jsonSpan","fingerprint","breadcrumbs","sdkProcessingMetadata","applyDataToEvent","applySpanToEvent","applyFingerprintToEvent","applyBreadcrumbsToEvent","applySdkMetadataToEvent","mergeData","extra","user","contexts","propagationContext","transactionName","mergeAndOverwriteScopeData","mergeVal","cleanedExtra","cleanedTags","cleanedUser","cleanedContexts","mergedBreadcrumbs","rootSpan","DEFAULT_MAX_BREADCRUMBS","globalScope","generatePropagationContext","newScope","requestSession","extras","scopeToMerge","scopeData","scopeContext","maxBreadcrumbs","maxCrumbs","mergedBreadcrumb","_breadcrumbs","_attachments","_contexts","_tags","_extra","_user","_level","_fingerprint","_eventProcessors","_propagationContext","_sdkProcessingMetadata","_transactionName","_span","additionalEventProcessors","newData","syntheticException","SDK_VERSION","API_VERSION","DEFAULT_BREADCRUMBS","Hub","_version","assignedScope","assignedIsolationScope","maybePromiseResult","beforeBreadcrumb","finalBreadcrumb","oldHub","makeMain","integration","customSamplingContext","sentry","getMainCarrier","getHubFromCarrier","setHubOnCarrier","getGlobalHub","hasHubOnCarrier","carrier","getActiveTransaction","maybeHub","errorsInstrumented","registerErrorInstrumentation","errorCallback","activeTransaction","SpanStatus","Ok","DeadlineExceeded","Unauthenticated","PermissionDenied","NotFound","ResourceExhausted","InvalidArgument","Unimplemented","Unavailable","InternalError","UnknownError","Cancelled","AlreadyExists","FailedPrecondition","Aborted","OutOfRange","DataLoss","getSpanStatusFromHttpCode","httpStatus","setHttpStatus","spanStatus","hasTracingEnabled","maybeOptions","startInactiveSpan","spanContext","normalizeContext","parentSpan","getActiveSpan","temporaryScope","createChildSpanOrTransaction","forceTransaction","setCapturedScopesOnSpan","SCOPE_ON_START_SPAN_FIELD","ISOLATION_SCOPE_ON_START_SPAN_FIELD","getCapturedScopesOnSpan","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_PROFILE_ID","SpanRecorder","maxlen","Span","description","string","attributes","startTime","endTime","childSpan","opStr","nameStr","idStr","logMessage","endTimestamp","hasData","hasAttributes","Transaction","transactionContext","incomingDynamicSamplingContext","newName","metadata","unit","newMetadata","timestampInS","transaction","finishedSpans","endTimes","capturedSpanScope","capturedSpanIsolationScope","TRACING_DEFAULTS","FINISH_REASON_TAG","IDLE_TRANSACTION_FINISH_REASONS","IdleTransactionSpanRecorder","_pushActivity","_popActivity","transactionSpanId","originalEnd","IdleTransaction","_idleHub","_idleTimeout","_finalTimeout","_heartbeatInterval","_onScope","delayAutoFinishUntilSignal","endTimestampInS","spanStartedBeforeTransactionFinish","timeoutWithMarginOfError","spanEndedBeforeFinalTimeout","stringifiedSpan","pushActivity","popActivity","restartOnChildSpanChange","heartbeatString","sampleTransaction","samplingContext","sampleRate","isValidSampleRate","rate","traceHeaders","_startTransaction","configInstrumenter","transactionInstrumenter","startIdleTransaction","idleTimeout","finalTimeout","onScope","heartbeatInterval","addTracingExtensions","setMeasurement","enhanceEventWithSdkInfo","createSessionEnvelope","envelopeHeaders","createEventEnvelope","SENTRY_API_VERSION","getBaseApiEndpoint","_getIngestEndpoint","_encodedAuth","getEnvelopeEndpointWithUrlEncodedAuth","tunnelOrOptions","installedIntegrations","filterDuplicates","integrationsByName","existingInstance","getIntegrationsToSetup","defaultIntegrations","userIntegrations","finalIntegrations","debugIndex","findIndex","debugInstance","setupIntegrations","integrationIndex","setupIntegration","afterSetupIntegrations","convertIntegrationFnToClass","serializeMetricBuckets","metricBucketItems","tagEntries","maybeTags","createMetricEnvelope","createMetricEnvelopeItem","ALREADY_SEEN_ERROR","BaseClient","eventMessage","promisedEvent","transport","clientFinished","transportFlushed","eventProcessor","forceInitialize","integrationId","integrationName","isAlreadyInstalled","env","sendResponse","eventOrCount","count","metricsEnvelope","crashed","errored","ex","mechanism","sessionNonTerminal","ticked","tick","interval","finalEvent","sentryError","isTransaction","isTransactionEvent","beforeSendLabel","processBeforeSend","_validateBeforeSendResult","processedEvent","spanCount","spanCountBefore","spanCountAfter","droppedSpanCount","transactionInfo","outcomes","beforeSendResult","invalidValueError","beforeSend","beforeSendTransaction","addEventProcessor","initAndBind","clientClass","setCurrentClient","initializeClient","DEFAULT_TRANSPORT_BUFFER_SIZE","createTransport","makeRequest","rateLimits","send","filteredEnvelopeItems","getEventForEnvelopeItem","filteredEnvelope","recordEnvelopeLoss","requestTask","createSpanEnvelope","spans","createSpanItem","isSentryRequestUrl","hubOrClient","isHub","checkDsn","checkTunnel","applySdkMetadata","names","DEFAULT_IGNORE_ERRORS","DEFAULT_IGNORE_TRANSACTIONS","INTEGRATION_NAME","_inboundFiltersIntegration","_hint","clientOptions","mergedOptions","_mergeOptions","_shouldDropEvent","inboundFiltersIntegration","internalOptions","_isSentryError","_isIgnoredError","_isIgnoredTransaction","_isDeniedUrl","_getEventFilterUrl","_isAllowedUrl","ignoreErrors","_getPossibleEventMessages","ignoreTransactions","denyUrls","allowUrls","possibleMessages","lastException","_getLastValidUrl","originalFunctionToString","SETUP_CLIENTS","_functionToStringIntegration","originalFunction","functionToStringIntegration","registerBackgroundTabDetection","statusType","bindReporter","metric","reportAllChanges","forceReport","generateUniqueID","getNavigationEntryFromPerformanceTiming","timing","navigationEntry","getNavigationEntry","getActivationStart","navEntry","initMetric","navigationType","observe","po","onHidden","onHiddenOrPageHide","onCLS","onReport","report","sessionValue","sessionEntries","handleEntries","entry","firstSessionEntry","lastSessionEntry","stopListening","firstHiddenTime","initHiddenTime","trackChanges","timeStamp","getVisibilityWatcher","onFID","visibilityWatcher","handleEntry","interactionCountEstimate","minKnownInteractionId","maxKnownInteractionId","updateEstimate","getInteractionCount","initInteractionCountPolyfill","getInteractionCountForNavigation","MAX_INTERACTIONS_TO_CONSIDER","longestInteractionList","longestInteractionMap","processEntry","minLongestInteraction","existingInteraction","interaction","estimateP98LongestInteraction","candidateInteractionIndex","onINP","prevEntry","inp","reportedMetricIDs","onLCP","lastEntry","whenReady","onTTFB","_previousCls","_previousFid","_previousLcp","_previousTtfb","_previousInp","addClsInstrumentationHandler","stopOnCallback","addMetricObserver","instrumentCls","addLcpInstrumentationHandler","instrumentLcp","addTtfbInstrumentationHandler","instrumentTtfb","addFidInstrumentationHandler","instrumentFid","addInpInstrumentationHandler","instrumentInp","addPerformanceInstrumentationHandler","instrumentPerformanceObserver","getCleanupCallback","previousValue","isMeasurementValue","_startChild","MAX_INT_AS_BYTES","msToSec","time","getBrowserPerformanceAPI","_performanceCursor","_measurements","_lcpEntry","_clsEntry","startTrackingWebVitals","fidCallback","_trackFID","clsCallback","_trackCLS","lcpCallback","_trackLCP","ttfbCallback","_trackTtfb","startTrackingLongTasks","startTrackingInteractions","componentName","startTrackingINP","interactionIdtoRouteNameMapping","interactionsSampleRate","inpCallback","_trackINP","INP_ENTRY_MAP","interactionIdToRouteNameMapping","interactionType","routeName","parentContext","replayId","userDisplay","profileId","getSampleRate","addPerformanceEntries","performanceEntries","transactionStartTime","_addNavigationSpans","_addMeasureSpans","firstHidden","shouldRecord","_addResourceSpans","_trackNavigator","_addTtfbRequestTimeToMeasurements","measurementTimestamp","normalizedValue","fidMark","measurementName","_tagMetricInfo","measureStartTimestamp","measureEndTimestamp","_addPerformanceNavigationTiming","_addRequest","eventEnd","resourceUrl","parsedUrl","setResourceEntrySizeData","navigator","connection","dataKey","entryVal","responseStart","requestStart","instrumentFetchRequest","shouldCreateSpan","shouldAttachHeaders","spanOrigin","shouldCreateSpanResult","endSpan","fullUrl","getFullURL","addTracingHeadersToFetchRequest","requestSpan","sentryTraceHeader","sentryBaggageHeader","newHeaders","existingBaggageHeader","newBaggageHeaders","contentLength","contentLengthNum","DEFAULT_TRACE_PROPAGATION_TARGETS","defaultRequestInstrumentationOptions","instrumentOutgoingRequests","_options","traceFetch","traceXHR","tracePropagationTargets","tracingOrigins","shouldCreateSpanForRequest","enableHTTPTimings","shouldAttachHeadersWithTargets","createdSpan","addHTTPTimings","xhrCallback","isPerformanceResourceTiming","resourceTimingEntryToSpanData","extractNetworkProtocol","nextHopProtocol","getAbsoluteTime","resourceTiming","timingSpanData","xhr","setHeaderOnXhr","instrumentRoutingWithDefaults","customStartTransaction","startTransactionOnPageLoad","startTransactionOnLocationChange","startingUrl","BROWSER_TRACING_INTEGRATION_ID","DEFAULT_BROWSER_TRACING_OPTIONS","MAX_INTERACTIONS","BrowserTracing","instrumentRouting","markBackgroundTransactions","_experiments","clientOptionsTracePropagationTargets","beforeNavigate","isPageloadTransaction","expandedContext","getMetaContent","modifiedContext","finalContext","idleTransaction","inflightInteractionTransaction","registerInteractionTransaction","currentTransaction","getSource","replay","isPerformanceEventTiming","interactionId","minInteractionId","metaName","metaTag","sourceFromAttributes","sourceFromData","sourceFromMetadata","ignoreOnError","shouldIgnoreOnError","ignoreNextOnError","sentryWrapped","wrappedArguments","exceptionFromError","parseStackFrames","extractMessage","eventFromPlainObject","isUnhandledRejection","getNonErrorObjectExceptionValue","eventFromError","stacktrace","popSize","getPopSize","reactMinifiedRegexp","eventFromException","attachStacktrace","eventFromUnknownInput","eventFromMessage","eventFromString","domException","__sentry_template_string__","__sentry_template_values__","captureType","getObjectClassName","createUserFeedbackEnvelope","feedback","createUserFeedbackEnvelopeItem","BrowserClient","sdkSource","cachedFetchImpl","getNativeFetchImplementation","document","fetchImpl","contentWindow","clearCachedFetchImplementation","makeFetchTransport","nativeFetch","pendingBodySize","pendingCount","requestSize","requestOptions","XHR_READYSTATE_DONE","makeXHRTransport","UNKNOWN_FUNCTION","CHROME_PRIORITY","WINJS_PRIORITY","GECKO_PRIORITY","createFrame","lineno","colno","chromeRegex","chromeEvalRegex","chromeStackParserFn","subMatch","extractSafariExtensionDetails","chromeStackLineParser","geckoREgex","geckoEvalRegex","gecko","geckoStackLineParser","winjsRegex","winjs","winjsStackLineParser","defaultStackLineParsers","defaultStackParser","isSafariExtension","isSafariWebExtension","MAX_ALLOWED_STRING_LENGTH","_breadcrumbsIntegration","_getConsoleBreadcrumbHandler","_getDomBreadcrumbHandler","_getXhrBreadcrumbHandler","_getFetchBreadcrumbHandler","_getHistoryBreadcrumbHandler","_getSentryBreadcrumbHandler","breadcrumbsIntegration","dom","element","_isEvent","status_code","body","parsedLoc","parsedFrom","parsedTo","_dedupeIntegration","previousEvent","currentEvent","dedupeIntegration","_isSameMessageEvent","_isSameExceptionEvent","currentMessage","previousMessage","_isSameFingerprint","_isSameStacktrace","previousException","_getExceptionFromEvent","currentException","currentFrames","_getFramesFromEvent","previousFrames","frameA","frameB","currentFingerprint","previousFingerprint","_globalHandlersIntegration","_installGlobalOnErrorHandler","globalHandlerLog","_installGlobalOnUnhandledRejectionHandler","globalHandlersIntegration","getOptions","_eventFromIncompleteOnError","_enhanceEventWithInitialFrame","_getUnhandledRejectionError","_eventFromRejectionWithPrimitive","ERROR_TYPES_RE","groups","ev","ev0","ev0s","ev0sf","_httpContextIntegration","referrer","httpContextIntegration","DEFAULT_KEY","DEFAULT_LIMIT","_linkedErrorsIntegration","linkedErrorsIntegration","DEFAULT_EVENT_TARGET","_browserApiErrorsIntegration","_wrapTimeFunction","_wrapRAF","_wrapXHR","eventTargetOption","_wrapEventTarget","browserApiErrorsIntegration","originalCallback","wrapOptions","globalObject","eventName","wrappedEventHandler","originalEventHandler","getDefaultIntegrations","init","startSessionTracking","REPLAY_SESSION_KEY","REPLAY_EVENT_NAME","UNABLE_TO_SEND_REPLAY","SESSION_IDLE_PAUSE_DURATION","SESSION_IDLE_EXPIRE_DURATION","DEFAULT_FLUSH_MIN_DELAY","DEFAULT_FLUSH_MAX_DELAY","BUFFER_CHECKOUT_TIME","RETRY_BASE_INTERVAL","RETRY_MAX_COUNT","NETWORK_BODY_MAX_SIZE","CONSOLE_ARG_MAX_SIZE","SLOW_CLICK_THRESHOLD","SLOW_CLICK_SCROLL_TIMEOUT","REPLAY_MAX_EVENT_BUFFER_SIZE","MIN_REPLAY_DURATION","MIN_REPLAY_DURATION_LIMIT","MAX_REPLAY_DURATION","_nullishCoalesce$1","_optionalChain$5","NodeType$1","NodeType","isElement$1","isShadowRoot","_2","isNativeShadowDom","shadowRoot","fixBrowserCompatibilityIssuesInCSS","escapeImportStatement","rule","statement","stringifyStylesheet","rules","stringifyRule","importStringified","isCSSImportRule","isCSSStyleRule","fixSafariColons","cssStringified","regex","Mirror","_3","_4","_5","childNode","createMirror","shouldMaskInput","maskInputOptions","maskInputValue","isMasked","maskInputFn","toLowerCase","toUpperCase","ORIGINAL_ATTRIBUTE_NAME","is2DCanvasBlank","canvas","chunkSize","y","getImageData","originalGetImageData","pixel","getInputType","getInputValue","tagNameRegex","IGNORED_NODE","genId","getValidTagName","processedTagName","extractOrigin","canvasService","canvasCtx","URL_IN_CSS_REF","URL_PROTOCOL_MATCH","URL_WWW_MATCH","DATA_URI","absoluteToStylesheet","quote1","path1","quote2","path2","path3","filePath","maybeQuote","part","SRCSET_NOT_SPACES","SRCSET_COMMAS_OR_SPACES","getAbsoluteSrcsetString","attributeValue","pos","collectCharacters","regEx","chars","absoluteToDoc","descriptorsStr","inParens","isSVGElement","getHref","transformAttribute","maskAttributeFn","ignoreAttribute","_isBlockedElement","blockClass","blockSelector","unblockSelector","eIndex","elementClassMatchesRegex","distanceToMatch","matchPredicate","distance","createMatchPredicate","needMaskingText","maskTextClass","maskTextSelector","unmaskTextClass","unmaskTextSelector","maskAllText","autocomplete","maskDistance","unmaskDistance","onceIframeLoaded","iframeEl","iframeLoadTimeout","win","fired","readyState","timer","blankUrl","onceStylesheetLoaded","styleSheetLoadTimeout","styleSheetLoaded","serializeNode","mirror","inlineStylesheet","maskTextFn","dataURLOptions","inlineImages","recordCanvas","keepIframeSrcFn","newlyAddedElement","rootId","getRootId","serializeElementNode","serializeTextNode","docId","parentTagName","textContent","isStyle","isScript","isTextarea","_6","_7","_8","forceMask","isInputMasked","needBlock","stylesheet","canvasDataURL","blankCanvas","blankCanvasDataURL","image","recordInlineImage","width","lowerIfExists","maybeAttr","slimDOMExcluded","sn","slimDOMOptions","serializeNodeWithId","skipChild","onSerialize","onIframeLoad","onStylesheetLoad","stylesheetLoadTimeout","preserveWhiteSpace","_serializedNode","serializedNode","recordChild","bypassOptions","childN","serializedChildNode","iframeDoc","serializedIframeNode","serializedLinkNode","snapshot","maskAllInputs","slimDOM","_optionalChain$4","on","DEPARTED_MIRROR_ACCESS_WARNING","_mirror","throttle$1","wait","previous","remaining","clearTimeout$1","setTimeout$1","hookSetter","isRevoked","replacement","nowTimestamp","getWindowScroll","_9","_10","_11","_12","_13","_14","getWindowHeight","getWindowWidth","closestElementOfNode","isBlocked","checkAncestors","blockedPredicate","isUnblocked","blockDistance","unblockDistance","isSerialized","isIgnored","isAncestorRemoved","legacy_isTouchEvent","polyfill","isSerializedIframe","isSerializedStylesheet","hasShadowRoot","_18","StyleSheetMirror","newId","getShadowHost","shadowHost","_19","_20","_21","getRootShadowHost","rootShadowHost","shadowHostInDom","inDom","cachedImplementations","getImplementation","impl","onRequestAnimationFrame","EventType","EventType2","IncrementalSource","IncrementalSource2","MouseInteractions","MouseInteractions2","PointerTypes","PointerTypes2","_optionalChain$3","isNodeInLinkedList","DoubleLinkedList","moveKey","MutationBuffer","adds","addedIds","addList","getNextId","ns","nextId","pushAdd","currentN","iframe","childSn","isParentRemoved","isAncestorInSet","candidate","tailNode","_node","unhandledNode","attribute","diffAsStr","unchangedAsStr","attributeName","old","pname","newPriority","nodeId","deepDelete","targetId","addsSet","removes","_isParentRemoved","_isAncestorInSet","registerErrorHandler","unregisterErrorHandler","callbackWrapper","_optionalChain$2","mutationBuffers","initMutationObserver","rootEl","mutationBuffer","mutationObserverCtor","angularZoneSymbol","observer","initMoveObserver","mousemoveCb","sampling","callbackThreshold","positions","timeBaseline","wrappedCb","totalOffset","updatePosition","clientX","clientY","initMouseInteractionObserver","mouseInteractionCb","disableMap","currentPointerType","getHandler","pointerType","thisEventKey","initScrollObserver","scrollCb","scrollLeftTop","initViewportResizeObserver","viewportResizeCb","lastH","lastW","updateDimension","INPUT_TAGS","lastInputValueMap","initInputObserver","inputCb","ignoreClass","ignoreSelector","userTriggeredOnInput","eventHandler","userTriggered","isChecked","cbWithDedup","lastInputValue","currentWindow","propertyDescriptor","hookProperties","getNestedCSSRulePositions","childRule","hasNestedCSSRule","getIdAndStyleId","sheet","styleMirror","styleId","initStyleSheetObserver","styleSheetRuleCb","stylesheetManager","insertRule","argumentsList","deleteRule","replaceSync","supportedNestedCSSRuleTypes","canMonkeyPatchNestedCSSRule","unmodifiedFunctions","typeKey","initAdoptedStyleSheetObserver","hostId","patchTarget","originalPropertyDescriptor","sheets","_15","_16","initStyleDeclarationObserver","styleDeclarationCb","ignoreCSSAttributes","setProperty","priority","_17","removeProperty","initMediaInteractionObserver","mediaInteractionCb","currentTime","volume","muted","playbackRate","initFontObserver","fontCb","fontMap","originalFontFace","family","descriptors","fontFace","restoreHandler","initSelectionObserver","selectionCb","collapsed","updateSelection","selection","ranges","range","startContainer","startOffset","endContainer","endOffset","initCustomElementObserver","customElementCb","constructor","initObservers","_hooks","mutationObserver","mousemoveHandler","mouseInteractionHandler","scrollHandler","viewportResizeHandler","inputHandler","mediaInteractionHandler","styleSheetObserver","adoptedStyleSheetObserver","styleDeclarationObserver","fontObserver","selectionObserver","customElementObserver","pluginHandlers","CrossOriginIframeMirror","generateIdFn","remoteId","idToRemoteMap","remoteToIdMap","idToRemoteIdMap","remoteIdToIdMap","ids","_optionalChain$1","IframeManagerNoop","IframeManager","crossOriginMessageEvent","transformedEvent","iframeMirror","ShadowDomManagerNoop","ShadowDomManager","iframeElement","manager","CanvasManagerNoop","StylesheetManager","linkEl","adoptedStyleSheetData","ProcessedNodeManager","thisBuffer","wrappedEmit","_takeFullSnapshot","checkoutEveryNms","checkoutEveryNth","_maskInputOptions","_slimDOMOptions","maxCanvasSize","packFn","mousemoveWait","recordCrossOriginIframes","recordAfter","collectFonts","plugins","onMutation","getCanvasManager","inEmittingFrame","passEmitsToParent","lastFullSnapshotEvent","incrementalSnapshotCount","isCheckout","exceedCount","exceedTime","takeFullSnapshot","wrappedMutationEmit","wrappedScrollEmit","wrappedCanvasMutationEmit","wrappedAdoptedStyleSheetEmit","iframeManager","processedNodeManager","canvasManager","_getCanvasManager","shadowDomManager","getCanvasManagerFn","ReplayEventTypeIncrementalSnapshot","ReplayEventTypeCustom","timestampToMs","timestampToS","addBreadcrumbEvent","INTERACTIVE_SELECTOR","getClosestInteractive","getClickTargetNode","getTargetNode","isEventWithTarget","onWindowOpen","monkeyPatchWindowOpen","originalWindowOpen","handleClick","clickDetector","clickBreadcrumb","ClickDetector","slowClickConfig","_addBreadcrumbEvent","cleanupWindowOpen","nowInSeconds","ignoreElement","isClickBreadcrumb","newClick","click","timedOutClicks","hadScroll","hadMutation","isSlowClick","clickCount","timeAfterClickMs","endReason","SLOW_CLICK_TAGS","updateClickDetectorForRecordingEvent","isIncrementalEvent","isIncrementalMouseInteraction","createBreadcrumb","ATTRIBUTES_TO_RECORD","getAttributesToRecord","handleDomListener","handleDom","isClick","getBaseDomBreadcrumb","getDomTarget","handleKeyboardEvent","getKeyboardBreadcrumb","metaKey","shiftKey","ctrlKey","altKey","isInputElement","hasModifierKey","isCharacterKey","baseBreadcrumb","ENTRY_TYPES","createResourceEntry","createPaintEntry","createNavigationEntry","createPerformanceEntries","createPerformanceEntry","entryType","decodedBodySize","domComplete","encodedBodySize","domContentLoadedEventStart","domContentLoadedEventEnd","domInteractive","loadEventStart","loadEventEnd","redirectCount","transferSize","initiatorType","responseEnd","responseStatus","getLargestContentfulPaint","setupPerformanceObserver","addPerformanceEntry","onEntries","clearCallbacks","clearCallback","logInfo","shouldAddBreadcrumb","addLogBreadcrumb","logInfoNextTick","EventBufferSizeExceededError","EventBufferArray","eventSize","eventsRet","WorkerHandler","worker","EventBufferCompressionWorker","EventBufferProxy","events","hasCheckout","addEventPromises","createEventBuffer","useCompression","customWorkerUrl","_loadWorker","workerUrl","_getWorkerUrl","hasSessionStorage","clearSession","deleteSession","isSampled","lastActivity","segmentId","previousSessionId","saveSession","getSessionSampleType","sessionSampleRate","allowBuffering","createSession","stickySession","fetchSession","traceInternals","sessionStringFromStorage","sessionObj","isExpired","initialTime","expiry","targetTime","isSessionExpired","maxReplayDuration","sessionIdleExpire","shouldRefreshSession","loadOrCreateSession","sessionOptions","existingSession","isCustomEvent","addEventSync","shouldAddEvent","_addEvent","addEvent","replayOptions","eventAfterPossibleCallback","maybeApplyCallback","timestampInMs","isReplayEvent","isFeedbackEvent","handleAfterSendEvent","enforceStatusCode","isBaseTransportSend","handleTransactionEvent","handleErrorEvent","replayContext","beforeErrorSampling","handleBeforeSendEvent","handleHydrationError","exceptionValue","isRrwebError","addFeedbackBreadcrumb","shouldSampleForBufferEvent","handleGlobalEventListener","includeAfterSendEventHandling","afterSendHandler","createPerformanceSpans","handleHistory","handleHistorySpanListener","shouldFilterRequest","addNetworkBreadcrumb","handleFetch","fetchData","handleFetchSpanListener","handleXhr","handleXhrSpanListener","getBodySize","formDataStr","_serializeFormData","parseContentLengthHeader","size","getBodyString","mergeWarning","warning","newMeta","existingWarnings","makeNetworkReplayBreadcrumb","buildSkippedNetworkRequestOrResponse","bodySize","buildNetworkRequestOrResponse","normalizedBody","warnings","normalizeNetworkBody","getAllowedHeaders","allowedHeaders","filteredHeaders","formData","exceedsSizeLimit","isProbablyJson","_strIsProbablyJson","truncatedBody","first","urlMatches","urls","getFullUrl","baseURI","fixedUrl","captureFetchBreadcrumbToReplay","_prepareFetchData","enrichFetchBreadcrumb","_getFetchRequestArgBody","reqSize","resSize","requestBodySize","responseBodySize","captureDetails","_getRequestInfo","_getResponseInfo","networkCaptureBodies","networkRequestHeaders","getRequestHeaders","requestBody","bodyStr","networkResponseHeaders","getAllHeaders","bodyText","_parseFetchResponseBody","getResponseData","_tryCloneResponse","_tryGetResponseText","allHeaders","getHeadersFromOptions","_getResponseText","txt","captureXhrBreadcrumbToReplay","_prepareXhrData","enrichXhrBreadcrumb","_getBodySize","getResponseHeaders","requestWarning","responseBody","responseWarning","_getXhrResponseBody","errors","_parseXhrResponse","responseType","handleNetworkBreadcrumbs","networkDetailAllowUrls","networkDetailDenyUrls","beforeAddNetworkBreadcrumb","_isXhrBreadcrumb","_isXhrHint","_isFetchBreadcrumb","_isFetchHint","_LAST_BREADCRUMB","isBreadcrumbWithCategory","handleScopeListener","handleScope","newBreadcrumb","normalizeConsoleBreadcrumb","isTruncated","normalizedArgs","normalizedArg","addGlobalListeners","hasHooks","feedbackEvent","addMemoryEntry","createMemoryEntry","memoryEntry","jsHeapSizeLimit","totalJSHeapSize","usedJSHeapSize","debounce","callbackReturnValue","timerId","maxTimerId","maxWait","invokeFunc","cancelTimers","debounced","getHandleRecordingEmit","hadFirstEvent","_isCheckout","addSettingsEvent","earliestEvent","createOptionsEvent","createReplayEnvelope","replayEvent","recordingData","prepareRecordingData","payloadWithSequence","replayHeaders","sequence","prepareReplayEvent","event_id","eventHint","preparedEvent","sendReplayRequest","segment_id","eventContext","preparedRecordingData","errorIds","traceIds","initialTimestamp","baseEvent","TransportStatusCodeError","RateLimitError","sendReplay","replayData","retryConfig","THROTTLED","SKIPPED","throttle","maxCount","durationSeconds","_cleanup","_getTotalCount","isThrottled","wasThrottled","ReplayContainer","recordingOptions","slowClickTimeout","slowClickIgnoreSelectors","errorSampleRate","canvasOptions","forceFlush","continueRecording","activityTime","hasStoppedRecording","cbResult","urlPath","lastTransaction","_lastActivity","eventBuffer","_context","tooShort","tooLong","mutationLimit","mutationBreadcrumbLimit","overMutationLimit","getOption","selectors","defaultSelectors","deprecatedClassOption","deprecatedSelectorOption","deprecatedSelectors","allSelectors","getPrivacyOptions","mask","unmask","unblock","ignore","defaultBlockedElements","maskSelector","unmaskSelector","maskAttribute","maskAttributes","privacyOptions","MEDIA_SELECTORS","DEFAULT_NETWORK_HEADERS","_initialized","Replay$1","flushMinDelay","flushMaxDelay","minReplayDuration","blockAllMedia","maskFn","beforeAddRecordingEvent","_getMergedNetworkHeaders","finalOptions","loadReplayOptionsFromClient","canvasIntegration","initialOptions","DEFAULT_HOOKS","classifyRE","classify","ROOT_COMPONENT_NAME","ANONYMOUS_COMPONENT_NAME","repeat","formatComponentName","vm","includeFile","file","generateComponentTrace","tree","currentRecursiveSequence","attachErrorHandler","warnHandler","silent","lifecycleHook","trace","hasConsole","VUE_OP","HOOKS","finishRootSpan","createTracingMixins","operation","internalHooks","internalHook","isRoot","oldSpan","globalWithVue","DEFAULT_CONFIG","_vueIntegration","integrationOptions","_setupIntegration","vueIntegration","vueInit","appWithInstance","config","init$1","vueRouterInstrumentation","startTransaction","instrumentVueRouter","startNavigationSpanFn","isPageLoadNavigation","transactionSource","pageloadTransaction","logMessageToSentry","severity","Sentry.captureMessage","reportErrorToSentry","Sentry.captureException","f","e.useId","e.inject","s$5","N","T","F","E","w","M","S","H","I","O","P","L","C","A","R","B","ue","$","z","J","Q","D","G","W","K","q","U","Te","Y","Ye","De","he","X","Ce","Z","me","ee","te","le","ae","oe","ye","Pe","de","ne","ve","se","ie","Se","ge","fe","be","V","Ge","Ve","pe","Me","je","Ae","Ee","useNavigationStore","page","_sfc_main$14","Dialog","TransitionRoot","TransitionChild","navigationStore","navRef","spinnerStyle","spinnerStyle1","animationStyle","_hoisted_1","_hoisted_3","_hoisted_4","_resolveComponent","_createBlock","_component_TransitionRoot","_ctx","_withCtx","_component_Dialog","_component_TransitionChild","_createElementVNode","_hoisted_2","_withDirectives","_createElementBlock","_Fragment","_renderList","_openBlock","_normalizeClass","_sfc_main$13","pacmanLoader","originalPath","redirectPath","_component_pacman_loader","_cache","BSAB96","generic","buildingCodes","EPDSource","EPDSource2","standardAppSettings","standardKeySettings","standardCalculationSettings","standardMaterialSettings","useSettingsStore","firebaseConfig","speckleConfig","materialKeys","epdSource","githubApiKey","includedStages","standardImpactCategory","buildingCode","area","logo","appScreenshot$1","_sfc_main$12","nav","_sfc_render","$props","$setup","$data","$options","$event","_createTextVNode","_toDisplayString","_sfc_main$11","_sfc_main$10","UpdateButton","settingsStore","_hoisted_5","_vModelText","_hoisted_6","_hoisted_7","DefaultResultList","useResultStore","resultList","reload","parameter","limit$1","low","high","min","clip_rgb","rgb","classToType","unpack$2","keyOrder","last$1","PI","TWOPI","PITHIRD","DEG2RAD","RAD2DEG","Color$3","autodetect","_input","chk","chroma","Color","cmyk2rgb","unpack","alpha","rgb2cmyk","rnd","hsl2css","hsla","rgb2hsl","minRgb","maxRgb","round","rgb2css","rgba","hsl2rgb","t3","t2","t1","h_","RE_RGB","RE_RGBA","RE_RGB_PCT","RE_RGBA_PCT","RE_HSL","RE_HSLA","css2rgb","css","hsl","floor","hcg2rgb","_g","_c","rgb2hcg","RE_HEX","RE_HEXA","hex2rgb","hex","rgb2hex","hxa","cos","hsi2rgb","sqrt","acos","rgb2hsi","min_","hsv2rgb","max_","rgb2hsv","LAB_CONSTANTS","pow","lab2rgb","b_","lab_xyz","xyz_rgb","rgb2lab","rgb2xyz","rgb_xyz","xyz_lab","sin","lch2lab","lch2rgb","hcl2rgb","hcl","atan2","lab2lch","rgb2lch","w3cx11","num2rgb","num","rgb2num","temperature2rgb","kelvin","temp","rgb2temperature","minTemp","maxTemp","eps","sign","oklab2rgb","lrgb2rgb","abs","cbrt","rgb2oklab","lr","lg","lb","rgb2lrgb","oklch2rgb","rgb2oklch","mutate","amount","lab","mc","channel","src","EPS","MAX_ITER","lum","cur_lum","max_iter","test","lm","rgb2luminance","luminance_x","index$3","mix","col1","col2","interpolator","lch","xyz0","xyz1","lrgb","x1","y1","z1","x2","y2","z2","interpolate_hsx","hue0","hue1","sat0","sat1","lbv0","lbv1","sat","hue","lbv","dh","hcg","hsi","hsv","oklab","oklch","average","colors","weights","_average_lrgb","xyz","cnt","ci","xyz2","col","scale$2","_mode","_nacol","_spread","_domain","_pos","_padding","_classes","_colors","_out","_min","_max","_correctLightness","_colorCache","_useCache","_gamma","setColors","resetCache","getClass","tMapLightness","tMapDomain","getColor","bypassMap","domain","tOut","tBreaks","_m","_o","L0","L1","pol","L_actual","L_ideal","L_diff","t0","numColors","dm","dd","__range__","samples","asc","inclusive","ascending","binom_row","row","newrow","bezier","lab0","lab1","lab2","lab3","labs","sum","bezier$1","scale","blend","blend_f","c0","each","normal","multiply","darken","lighten","screen","overlay","burn","dodge","cubehelix","rotations","gamma","lightness","dl","fract","amp","cos_a","sin_a","digits","random","random$2","code","analyze","min_log","max_log","pb","pr","cluster","assignments","clusterSizes","nb_iters","centroids","mindist","best","newCentroids","kClusters","tmpKMeansBreaks","contrast","l1","exp","deltaE","Kl","Kc","Kh","rad2deg","rad","deg2rad","deg","a1","b1","L2","a2","b2","avgL","C1","C2","avgC","a1p","a2p","C1p","C2p","avgCp","arctan1","arctan2","h1p","h2p","avgHp","deltaHp","deltaL","deltaCp","sl","sc","sh","deltaTheta","Rt","sum_sq","valid$1","scales","colorbrewer","brewer","baseColors","fontColors","ColorManager","__publicField","color1","color2","h1","distinctColors","maxDistance","nextColor","color","minDistanceToSet","selectedColor","getFontColorForHSL","hslValues","hslToHex","getValueColorFromGradient","startColor","endColor","Source","Source2","extendedImpactCategoryKeys","LifeCycleStages","useMaterialStore","material","materials","assembly","mapping","materialList","uniqueMaterialTypes","mat","uniqueDeclaredUnits","direction","sorting","applyParamFilters","product","nestedGroupId","step","nestedGroup","filterId","userInfoQuery","projectVersionsQuery","latestStreamsQuery","modelIdQuery","selectedObjectsQuery","speckleSelection","sourceApplication","generalParameters","archicadParameters","revitParameters","ifcParameters","rhinoParameters","APP_NAME","TOKEN","REFRESH_TOKEN","CHALLENGE","navigateToAuthPage","challenge","speckleLogOut","exchangeAccessCode","accessCode","speckleFetch","getUserData","getProjectVersions","itemsPerPage","cursor","getProjectsData","getLatestModel","getObjectParameters","streamId","objectId","convertObjects","speckleStore","useSpeckleStore","modelObjects","projectDetails","geoObjects","quantity","calculateQuantity","searchObject","searchNested","sObj","REVISION","MOUSE","TOUCH","CullFaceNone","CullFaceBack","CullFaceFront","CullFaceFrontBack","BasicShadowMap","PCFShadowMap","PCFSoftShadowMap","VSMShadowMap","FrontSide","BackSide","DoubleSide","FlatShading","SmoothShading","NoBlending","NormalBlending","AdditiveBlending","SubtractiveBlending","MultiplyBlending","CustomBlending","AddEquation","SubtractEquation","ReverseSubtractEquation","MinEquation","MaxEquation","ZeroFactor","OneFactor","SrcColorFactor","OneMinusSrcColorFactor","SrcAlphaFactor","OneMinusSrcAlphaFactor","DstAlphaFactor","OneMinusDstAlphaFactor","DstColorFactor","OneMinusDstColorFactor","SrcAlphaSaturateFactor","NeverDepth","AlwaysDepth","LessDepth","LessEqualDepth","EqualDepth","GreaterEqualDepth","GreaterDepth","NotEqualDepth","MultiplyOperation","MixOperation","AddOperation","NoToneMapping","LinearToneMapping","ReinhardToneMapping","CineonToneMapping","ACESFilmicToneMapping","CustomToneMapping","UVMapping","CubeReflectionMapping","CubeRefractionMapping","EquirectangularReflectionMapping","EquirectangularRefractionMapping","CubeUVReflectionMapping","RepeatWrapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","NearestMipmapNearestFilter","NearestMipMapNearestFilter","NearestMipmapLinearFilter","NearestMipMapLinearFilter","LinearFilter","LinearMipmapNearestFilter","LinearMipMapNearestFilter","LinearMipmapLinearFilter","LinearMipMapLinearFilter","UnsignedByteType","ByteType","ShortType","UnsignedShortType","IntType","UnsignedIntType","FloatType","HalfFloatType","UnsignedShort4444Type","UnsignedShort5551Type","UnsignedInt248Type","AlphaFormat","RGBFormat","RGBAFormat","LuminanceFormat","LuminanceAlphaFormat","DepthFormat","DepthStencilFormat","RedFormat","RedIntegerFormat","RGFormat","RGIntegerFormat","RGBAIntegerFormat","RGB_S3TC_DXT1_Format","RGBA_S3TC_DXT1_Format","RGBA_S3TC_DXT3_Format","RGBA_S3TC_DXT5_Format","RGB_PVRTC_4BPPV1_Format","RGB_PVRTC_2BPPV1_Format","RGBA_PVRTC_4BPPV1_Format","RGBA_PVRTC_2BPPV1_Format","RGB_ETC1_Format","RGB_ETC2_Format","RGBA_ETC2_EAC_Format","RGBA_ASTC_4x4_Format","RGBA_ASTC_5x4_Format","RGBA_ASTC_5x5_Format","RGBA_ASTC_6x5_Format","RGBA_ASTC_6x6_Format","RGBA_ASTC_8x5_Format","RGBA_ASTC_8x6_Format","RGBA_ASTC_8x8_Format","RGBA_ASTC_10x5_Format","RGBA_ASTC_10x6_Format","RGBA_ASTC_10x8_Format","RGBA_ASTC_10x10_Format","RGBA_ASTC_12x10_Format","RGBA_ASTC_12x12_Format","RGBA_BPTC_Format","LoopOnce","LoopRepeat","LoopPingPong","InterpolateDiscrete","InterpolateLinear","InterpolateSmooth","ZeroCurvatureEnding","ZeroSlopeEnding","WrapAroundEnding","NormalAnimationBlendMode","AdditiveAnimationBlendMode","TrianglesDrawMode","TriangleStripDrawMode","TriangleFanDrawMode","LinearEncoding","sRGBEncoding","BasicDepthPacking","RGBADepthPacking","TangentSpaceNormalMap","ObjectSpaceNormalMap","NoColorSpace","SRGBColorSpace","LinearSRGBColorSpace","ZeroStencilOp","KeepStencilOp","ReplaceStencilOp","IncrementStencilOp","DecrementStencilOp","IncrementWrapStencilOp","DecrementWrapStencilOp","InvertStencilOp","NeverStencilFunc","LessStencilFunc","EqualStencilFunc","LessEqualStencilFunc","GreaterStencilFunc","NotEqualStencilFunc","GreaterEqualStencilFunc","AlwaysStencilFunc","StaticDrawUsage","DynamicDrawUsage","StreamDrawUsage","StaticReadUsage","DynamicReadUsage","StreamReadUsage","StaticCopyUsage","DynamicCopyUsage","StreamCopyUsage","GLSL1","GLSL3","_SRGBAFormat","EventDispatcher$2","listenerArray","_lut","_seed","generateUUID","d0","d1","d2","d3","clamp","euclideanModulo","mapLinear","inverseLerp","lerp","damp","lambda","dt","pingpong","smoothstep","smootherstep","randInt","randFloat","randFloatSpread","seededRandom","degToRad","degrees","radToDeg","radians","isPowerOfTwo","ceilPowerOfTwo","floorPowerOfTwo","setQuaternionFromProperEuler","order","c13","s13","c1_3","s1_3","c3_1","s3_1","denormalize$1","MathUtils","Vector2","scalar","minVal","maxVal","v1","v2","center","angle","Matrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","xAxis","yAxis","zAxis","a11","a12","a13","a21","a22","a23","a31","a32","a33","b11","b12","b13","b21","b22","b23","b31","b32","b33","t11","t12","t13","det","detInv","matrix4","tx","ty","sx","sy","rotation","cx","cy","theta","matrix","arrayNeedsUint32","TYPED_ARRAYS","getTypedArray","createElementNS","SRGBToLinear","LinearToSRGB","FN","ColorManagement","colorSpace","sourceColorSpace","targetColorSpace","_colorKeywords","_rgb","_hslA","_hslB","hue2rgb","toComponents","Color$2","handleAlpha","saturation","_canvas","ImageUtils","imageData","isRootObject","serializeImage","textureId","Texture","EventDispatcher","wrapS","wrapT","magFilter","minFilter","format","anisotropy","encoding","uv","Vector4","m11","m12","m13","m21","m22","m23","m31","m32","m33","xx","yy","zz","xy","xz","yz","WebGLRenderTarget","DataArrayTexture","WebGLArrayRenderTarget","Data3DTexture","WebGL3DRenderTarget","WebGLMultipleRenderTargets","texture","il","Quaternion","qa","qb","qm","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","w1","sqrSin","tDir","quaternion","euler","c3","s3","axis","halfAngle","vFrom","vTo","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","cosHalfTheta","sqrSinHalfTheta","sinHalfTheta","halfTheta","ratioA","ratioB","u1","sqrt1u1","sqrtu1","u2","u3","Vector3","_quaternion$4","qx","qy","qz","qw","ix","iy","iz","iw","camera","ax","ay","az","bx","by","bz","denominator","planeNormal","_vector$c","dz","radius","phi","sinPhiRadius","sz","Box3","minX","minY","minZ","maxX","maxY","maxZ","points","halfSize","_vector$b","precise","box","point","vector","geometry","_box$3","sphere","plane","triangle","_center","_extents","_v0$2","_v1$7","_v2$3","_f0","_f1","_f2","axes","satForAxes","_triangleNormal","_points","_testAxis","v0","extents","p0","p1","p2","_box$2","_v1$6","_toFarthestPoint","_toPoint","Sphere","optionalCenter","maxRadiusSq","radiusSum","deltaLengthSq","lengthSq","missingRadiusHalf","_vector$a","_segCenter","_segDir","_diff","_edge1","_edge2","_normal$1","Ray","ray","directionDistance","optionalPointOnRay","optionalPointOnSegment","segExtent","a01","b0","s0","sqrDist","extDet","invDet","tca","radius2","thc","distToPoint","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","backfaceCulling","DdN","DdQxE2","DdE1xQ","QdN","Matrix4","n14","n24","n34","n41","n42","n43","n44","scaleX","_v1$5","scaleY","scaleZ","af","bf","cf","df","ac","ad","bc","bd","_zero","_one","eye","up","_z","_x","_y","a14","a24","a34","a41","a42","a43","a44","b14","b24","b34","b41","b42","b43","b44","t14","scaleXSq","scaleYSq","scaleZSq","yx","zx","zy","wx","wy","wz","_m1$2","invSX","invSY","invSZ","near","far","_matrix$1","_quaternion$3","Euler","newOrder","Layers","layers","_object3DId","_v1$4","_q1","_m1$1","_target","_position$3","_scale$2","_quaternion$2","_xAxis","_yAxis","_zAxis","_addedEvent","_removedEvent","Object3D","onRotationChange","onQuaternionChange","updateParents","updateChildren","serialize","library","parameters","shapes","shape","uuids","animation","geometries","extractFromCache","textures","skeletons","animations","nodes","recursive","_v0$1","_v1$3","_v2$2","_v3$1","_vab","_vac","_vbc","_vap","_vbp","_vcp","Triangle","targetLengthSq","dot00","dot01","dot02","dot11","dot12","denom","invDenom","p3","uv1","uv2","uv3","i0","i1","d4","vc","d5","d6","vb","va","materialId","Material","srcPlanes","dstPlanes","MeshBasicMaterial","_vector$9","_vector2$1","BufferAttribute","itemSize","index1","index2","vectors","Int8BufferAttribute","Uint8BufferAttribute","Uint8ClampedBufferAttribute","Int16BufferAttribute","Uint16BufferAttribute","Int32BufferAttribute","Uint32BufferAttribute","Float16BufferAttribute","Float32BufferAttribute","Float64BufferAttribute","_id$1","_m1","_obj","_offset","_box$1","_boxMorphTargets","_vector$8","BufferGeometry","materialIndex","normalMatrix","tangent","morphAttributesPosition","morphAttribute","morphTargetsRelative","jl","indices","normals","uvs","nVertices","tangents","tan1","tan2","vA","vB","vC","uvA","uvB","uvC","sdir","tdir","handleTriangle","group","tmp2","handleVertex","positionAttribute","normalAttribute","pA","pB","pC","nA","nB","nC","ab","attributeArray1","attribute2","attributeArray2","attributeOffset","convertBufferAttribute","array2","geometry2","newAttribute","morphAttributes","morphArray","hasMorphAttributes","attributeArray","boundingSphere","boundingBox","_inverseMatrix$2","_ray$2","_sphere$3","_vA$1","_vB$1","_vC$1","_tempA","_tempB","_tempC","_morphA","_morphB","_morphC","_uvA$1","_uvB$1","_uvC$1","_intersectionPoint","_intersectionPointWorld","Mesh","ml","morphTargets","raycaster","intersects","matrixWorld","intersection","morphPosition","drawRange","groupMaterial","checkBufferGeometryIntersection","checkIntersection","intersect","morphInfluences","influence","face","BoxGeometry","widthSegments","heightSegments","depthSegments","vertices","numberOfVertices","groupStart","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","groupCount","cloneUniforms","mergeUniforms","uniforms","UniformsUtils","default_vertex","default_fragment","ShaderMaterial","extensions","Camera","PerspectiveCamera","fov","aspect","focalLength","vExtentSlope","fullWidth","fullHeight","view","skew","CubeCamera","renderTarget","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","scene","currentRenderTarget","currentToneMapping","currentXrEnabled","generateMipmaps","CubeTexture","WebGLCubeRenderTarget","shader","mesh","currentMinFilter","stencil","_vector1","_vector2","_normalMatrix","Plane","constant","inverseNormalLength","startSign","endSign","optionalNormalMatrix","referencePoint","_sphere$2","_vector$7","Frustum","p4","p5","planes","frustum","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","sprite","negRadius","WebGLAnimation","isAnimating","animationLoop","requestId","onAnimationFrame","WebGLAttributes","gl","capabilities","isWebGL2","createBuffer","bufferType","usage","updateBuffer","updateRange","PlaneGeometry","width_half","height_half","segment_width","segment_height","alphamap_fragment","alphamap_pars_fragment","alphatest_fragment","alphatest_pars_fragment","aomap_fragment","aomap_pars_fragment","begin_vertex","beginnormal_vertex","bsdfs","bumpmap_pars_fragment","clipping_planes_fragment","clipping_planes_pars_fragment","clipping_planes_pars_vertex","clipping_planes_vertex","color_fragment","color_pars_fragment","color_pars_vertex","color_vertex","common","cube_uv_reflection_fragment","defaultnormal_vertex","displacementmap_pars_vertex","displacementmap_vertex","emissivemap_fragment","emissivemap_pars_fragment","encodings_fragment","encodings_pars_fragment","envmap_fragment","envmap_common_pars_fragment","envmap_pars_fragment","envmap_pars_vertex","envmap_vertex","fog_vertex","fog_pars_vertex","fog_fragment","fog_pars_fragment","gradientmap_pars_fragment","lightmap_fragment","lightmap_pars_fragment","lights_lambert_vertex","lights_pars_begin","envmap_physical_pars_fragment","lights_toon_fragment","lights_toon_pars_fragment","lights_phong_fragment","lights_phong_pars_fragment","lights_physical_fragment","lights_physical_pars_fragment","lights_fragment_begin","lights_fragment_maps","lights_fragment_end","logdepthbuf_fragment","logdepthbuf_pars_fragment","logdepthbuf_pars_vertex","logdepthbuf_vertex","map_fragment","map_pars_fragment","map_particle_fragment","map_particle_pars_fragment","metalnessmap_fragment","metalnessmap_pars_fragment","morphcolor_vertex","morphnormal_vertex","morphtarget_pars_vertex","morphtarget_vertex","normal_fragment_begin","normal_fragment_maps","normal_pars_fragment","normal_pars_vertex","normal_vertex","normalmap_pars_fragment","clearcoat_normal_fragment_begin","clearcoat_normal_fragment_maps","clearcoat_pars_fragment","output_fragment","packing","premultiplied_alpha_fragment","project_vertex","dithering_fragment","dithering_pars_fragment","roughnessmap_fragment","roughnessmap_pars_fragment","shadowmap_pars_fragment","shadowmap_pars_vertex","shadowmap_vertex","shadowmask_pars_fragment","skinbase_vertex","skinning_pars_vertex","skinning_vertex","skinnormal_vertex","specularmap_fragment","specularmap_pars_fragment","tonemapping_fragment","tonemapping_pars_fragment","transmission_fragment","transmission_pars_fragment","uv_pars_fragment","uv_pars_vertex","uv_vertex","uv2_pars_fragment","uv2_pars_vertex","uv2_vertex","worldpos_vertex","vertex$g","fragment$g","vertex$f","fragment$f","vertex$e","fragment$e","vertex$d","fragment$d","vertex$c","fragment$c","vertex$b","fragment$b","vertex$a","fragment$a","vertex$9","fragment$9","vertex$8","fragment$8","vertex$7","fragment$7","vertex$6","fragment$6","vertex$5","fragment$5","vertex$4","fragment$4","vertex$3","fragment$3","vertex$2","fragment$2","vertex$1","fragment$1","ShaderChunk","UniformsLib","ShaderLib","WebGLBackground","cubemaps","objects","premultipliedAlpha","clearColor","clearAlpha","planeMesh","boxMesh","currentBackground","currentBackgroundVersion","currentTonemapping","forceClear","background","xr","setClear","WebGLBindingStates","maxVertexAttributes","extension","vaoAvailable","bindingStates","defaultState","createBindingState","forceUpdate","program","updateBuffers","getBindingState","bindVertexArrayObject","needsUpdate","saveCache","wireframe","setupVertexAttributes","createVertexArrayObject","vao","deleteVertexArrayObject","programMap","stateMap","newAttributes","enabledAttributes","attributeDivisors","cachedAttributes","geometryAttributes","attributesNum","programAttributes","cachedAttribute","geometryAttribute","initAttributes","enableAttribute","enableAttributeAndDivisor","meshPerAttribute","disableUnusedAttributes","vertexAttribPointer","stride","materialDefaultAttributeValues","programAttribute","bytesPerElement","dispose","geometryId","programId","releaseStatesOfGeometry","releaseStatesOfProgram","resetDefaultState","WebGLBufferRenderer","setMode","renderInstances","primcount","methodName","WebGLCapabilities","maxAnisotropy","getMaxAnisotropy","getMaxPrecision","precision","maxPrecision","drawBuffers","logarithmicDepthBuffer","maxTextures","maxVertexTextures","maxTextureSize","maxCubemapSize","maxAttributes","maxVertexUniforms","maxVaryings","maxFragmentUniforms","vertexTextures","floatFragmentTextures","floatVertexTextures","maxSamples","WebGLClipping","properties","globalState","numGlobalPlanes","localClippingEnabled","renderingShadows","viewNormalMatrix","uniform","enableLocalClipping","projectPlanes","resetGlobalState","useCache","clipIntersection","clipShadows","materialProperties","nGlobal","lGlobal","dstArray","skipTransform","nPlanes","flatSize","viewMatrix","i4","WebGLCubeMaps","mapTextureMapping","cubemap","onTextureDispose","OrthographicCamera","scaleW","scaleH","LOD_MIN","EXTRA_LOD_SIGMA","MAX_SAMPLES","_flatCamera","_clearColor","_oldTarget","PHI","INV_PHI","_axisDirections","PMREMGenerator","sigma","cubeUVRenderTarget","equirectangular","_getCubemapMaterial","_getEquirectMaterial","cubeSize","outputTarget","_setViewport","_createRenderTarget","_lodMax","_createPlanes","_getBlurShader","tmpMesh","cubeCamera","upSign","forwardSign","originalAutoClear","toneMapping","backgroundMaterial","backgroundBox","useSolidColor","isCubeTexture","autoClear","poleAxis","lodIn","lodOut","pingPongRenderTarget","targetIn","targetOut","sigmaRadians","blurMaterial","STANDARD_DEVIATIONS","blurMesh","blurUniforms","pixels","radiansPerPixel","sigmaPixels","weight","outputSize","lodMax","lodPlanes","sizeLods","sigmas","lod","totalLods","sizeLod","texelSize","cubeFaces","positionSize","uvSize","faceIndexSize","faceIndex","coordinates","_getCommonVertexShader","WebGLCubeUVMaps","cubeUVmaps","pmremGenerator","isEquirectMap","isCubeMap","isCubeTextureComplete","cubemapUV","WebGLExtensions","getExtension","WebGLGeometries","wireframeAttributes","onGeometryDispose","updateWireframeAttribute","geometryIndex","geometryPosition","previousAttribute","getWireframeAttribute","currentAttribute","WebGLIndexedBufferRenderer","setIndex","WebGLInfo","memory","instanceCount","numericalSort","absNumericalSort","denormalize","morph","WebGLMorphtargets","influencesList","morphTextures","workInfluences","objectInfluences","morphTargetsCount","disposeTexture","hasMorphPosition","hasMorphNormals","hasMorphColors","morphNormals","morphColors","vertexDataCount","vertexDataStride","morphTarget","morphNormal","morphColor","morphInfluencesSum","morphBaseInfluence","influences","WebGLObjects","updateMap","buffergeometry","onInstancedMeshDispose","instancedMesh","emptyTexture","emptyArrayTexture","empty3dTexture","emptyCubeTexture","arrayCacheF32","arrayCacheI32","mat4array","mat3array","mat2array","flatten","nBlocks","blockSize","firstElem","arraysEqual","copyArray","allocTexUnits","setValueV1f","setValueV2f","setValueV3f","setValueV4f","setValueM2","elements","setValueM3","setValueM4","setValueV1i","setValueV2i","setValueV3i","setValueV4i","setValueV1ui","setValueV2ui","setValueV3ui","setValueV4ui","setValueT1","setValueT3D1","setValueT6","setValueT2DArray1","getSingularSetter","setValueV1fArray","setValueV2fArray","setValueV3fArray","setValueV4fArray","setValueM2Array","setValueM3Array","setValueM4Array","setValueV1iArray","setValueV2iArray","setValueV3iArray","setValueV4iArray","setValueV1uiArray","setValueV2uiArray","setValueV3uiArray","setValueV4uiArray","setValueT1Array","units","setValueT3DArray","setValueT6Array","setValueT2DArrayArray","getPureArraySetter","SingleUniform","activeInfo","addr","PureArrayUniform","StructuredUniform","seq","RePathPart","addUniform","uniformObject","parseUniform","pathLength","matchEnd","idIsIndex","subscript","WebGLUniforms","WebGLShader","programIdCount","handleSource","errorLine","lines2","getEncodingComponents","getShaderErrors","errorMatches","getTexelEncodingFunction","functionName","getToneMappingFunction","toneMappingName","generateExtensions","filterEmptyLine","generateDefines","defines","chunks","fetchAttributeLocations","locationSize","replaceLightNums","replaceClippingPlaneNums","includePattern","resolveIncludes","includeReplacer","deprecatedUnrollLoopPattern","unrollLoopPattern","unrollLoops","loopReplacer","deprecatedLoopReplacer","snippet","generatePrecision","precisionstring","generateShadowMapTypeDefine","shadowMapTypeDefine","generateEnvMapTypeDefine","envMapTypeDefine","generateEnvMapModeDefine","envMapModeDefine","generateEnvMapBlendingDefine","envMapBlendingDefine","generateCubeUVSize","imageHeight","maxMip","texelHeight","WebGLProgram","vertexShader","fragmentShader","envMapCubeUVSize","customExtensions","customDefines","prefixVertex","prefixFragment","versionString","vertexGlsl","fragmentGlsl","glVertexShader","glFragmentShader","programLog","vertexLog","fragmentLog","runnable","haveDiagnostics","vertexErrors","fragmentErrors","cachedUniforms","WebGLShaderCache","vertexShaderStage","fragmentShaderStage","materialShaders","shaderStage","stage","WebGLShaderStage","WebGLPrograms","cubeuvmaps","clipping","_programLayers","_customShaders","programs","shaderIDs","getParameters","lights","shadows","fog","envMap","envMapCubeUVHeight","shaderID","morphTextureStride","customVertexShaderID","customFragmentShaderID","useAlphaTest","useClearcoat","getProgramCacheKey","getProgramCacheKeyParameters","getProgramCacheKeyBooleans","getUniforms","acquireProgram","pl","preexistingProgram","releaseProgram","releaseShaderCache","WebGLProperties","painterSortStable","reversePainterSortStable","WebGLRenderList","renderItems","renderItemsIndex","opaque","transmissive","transparent","getNextRenderItem","groupOrder","unshift","sort","customOpaqueSort","customTransparentSort","finish","WebGLRenderLists","lists","renderCallDepth","UniformsCache","light","ShadowUniformsCache","nextVersion","shadowCastingLightsFirst","lightA","lightB","WebGLLights","shadowCache","vector3","matrix42","physicallyCorrectLights","directionalLength","pointLength","spotLength","rectAreaLength","hemiLength","numDirectionalShadows","numPointShadows","numSpotShadows","scaleFactor","intensity","shadowMap","shadow","shadowUniforms","setupView","WebGLRenderState","lightsArray","shadowsArray","pushLight","pushShadow","shadowLight","setupLights","setupLightsView","WebGLRenderStates","renderStates","renderState","MeshDepthMaterial","MeshDistanceMaterial","vertex","WebGLShadowMap","_renderer","_objects","_capabilities","_frustum","_shadowMapSize","_viewportSize","_viewport","_depthMaterial","_distanceMaterial","_materialCache","_maxTextureSize","shadowSide","shadowMaterialVertical","shadowMaterialHorizontal","fullScreenTri","fullScreenMesh","activeCubeFace","activeMipmapLevel","_state","shadowFrameExtents","pars","viewportCount","vp","viewport","renderObject","VSMPass","getDepthMaterial","shadowCameraNear","shadowCameraFar","customMaterial","keyA","keyB","materialsForVariant","cachedMaterial","shadowCamera","kl","depthMaterial","WebGLState","ColorBuffer","locked","currentColorMask","currentColorClear","colorMask","lock","DepthBuffer","currentDepthMask","currentDepthFunc","currentDepthClear","depthTest","enable","disable","depthMask","depthFunc","StencilBuffer","currentStencilMask","currentStencilFunc","currentStencilRef","currentStencilFuncMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentStencilClear","stencilTest","stencilMask","stencilFunc","stencilRef","stencilFail","stencilZFail","stencilZPass","colorBuffer","depthBuffer","stencilBuffer","enabledCapabilities","currentBoundFramebuffers","currentDrawbuffers","defaultDrawbuffers","currentProgram","currentBlendingEnabled","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentPremultipledAlpha","currentFlipSided","currentCullFace","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","lineWidthAvailable","glVersion","currentTextureSlot","currentBoundTextures","scissorParam","viewportParam","currentScissor","currentViewport","createTexture","emptyTextures","setFlipSided","setCullFace","setBlending","bindFramebuffer","framebuffer","useProgram","equationToGL","factorToGL","blending","blendEquation","blendSrc","blendDst","blendEquationAlpha","blendSrcAlpha","blendDstAlpha","setMaterial","frontFaceCW","flipSided","stencilWrite","setPolygonOffset","cullFace","setLineWidth","polygonOffset","factor","setScissorTest","scissorTest","activeTexture","webglSlot","bindTexture","webglType","webglTexture","boundTexture","unbindTexture","compressedTexImage2D","texSubImage2D","texSubImage3D","compressedTexSubImage2D","texStorage2D","texStorage3D","texImage2D","texImage3D","scissor","WebGLTextures","_gl","utils","multisampledRTTExt","supportsInvalidateFramebuffer","_videoTextures","_sources","useOffscreenCanvas","createCanvas","resizeImage","needsPowerOfTwo","needsNewCanvas","isPowerOfTwo$1","textureNeedsPowerOfTwo","textureNeedsGenerateMipmaps","supportsMips","generateMipmap","getInternalFormat","internalFormatName","glFormat","glType","isVideoTexture","internalFormat","getMipLevels","filterFallback","deallocateTexture","onRenderTargetDispose","deallocateRenderTarget","textureProperties","webglTextures","deleteTexture","renderTargetProperties","attachmentProperties","textureUnits","resetTextureUnits","allocateTextureUnit","textureUnit","getTextureCacheKey","setTexture2D","updateVideoTexture","uploadTexture","setTexture2DArray","setTexture3D","setTextureCube","uploadCubeTexture","wrappingToGL","filterToGL","setTextureParameters","textureType","initTexture","forceUpload","textureCacheKey","verifyColorSpace","glInternalFormat","mipmap","mipmaps","useTexStorage","allocateMemory","levels","isCompressed","isDataTexture","cubeImage","mipmapImage","setupFrameBufferTexture","textureTarget","useMultisampledRTT","getRenderTargetSamples","setupRenderBufferStorage","renderbuffer","isMultisample","depthTexture","setupDepthTexture","webglDepthTexture","setupDepthRenderbuffer","isCube","rebindTextures","colorTexture","setupRenderTarget","isMultipleRenderTargets","glTextureType","updateRenderTargetMipmap","updateMultisampleRenderTarget","invalidationArray","depthStyle","ignoreDepthValues","WebGLUtils","convert","ArrayCamera","Group","_moveEvent","WebXRController","inputSource","referenceSpace","inputPose","gripPose","handPose","targetRay","grip","hand","inputjoint","jointPose","joint","indexTip","thumbTip","distanceToPinch","DepthTexture","WebXRManager","framebufferScaleFactor","referenceSpaceType","customReferenceSpace","pose","glBinding","glProjLayer","glBaseLayer","xrFrame","initialRenderTarget","newRenderTarget","controllers","inputSourcesMap","cameraL","cameraR","cameras","cameraVR","_currentDepthNear","_currentDepthFar","controller","onSessionEvent","onSessionEnd","space","onInputSourcesChange","layerInit","depthFormat","depthType","glDepthFormat","projectionlayerInit","inputSources","cameraLPos","cameraRPos","setProjectionFromUnion","ipd","projL","projR","topFov","bottomFov","leftFov","rightFov","zOffset","xOffset","near2","far2","left2","right2","top2","bottom2","updateCamera","foveation","onAnimationFrameCallback","views","cameraVRNeedsUpdate","glSubImage","WebGLMaterials","refreshFogUniforms","refreshMaterialUniforms","pixelRatio","transmissionRenderTarget","refreshUniformsCommon","refreshUniformsToon","refreshUniformsPhong","refreshUniformsStandard","refreshUniformsPhysical","refreshUniformsMatcap","refreshUniformsDistance","refreshUniformsLine","refreshUniformsDash","refreshUniformsPoints","refreshUniformsSprites","uvScaleMap","uv2ScaleMap","createCanvasElement","WebGLRenderer","_depth","_stencil","_antialias","_premultipliedAlpha","_preserveDrawingBuffer","_powerPreference","_failIfMajorPerformanceCaveat","_alpha","currentRenderList","currentRenderState","renderListStack","renderStateStack","_this","_isContextLost","_currentActiveCubeFace","_currentActiveMipmapLevel","_currentRenderTarget","_currentMaterialId","_currentCamera","_currentViewport","_currentScissor","_currentScissorTest","_width","_height","_pixelRatio","_opaqueSort","_transparentSort","_scissor","_scissorTest","_clippingEnabled","_localClippingEnabled","_transmissionRenderTarget","_projScreenMatrix","_vector3","_emptyScene","getTargetPixelRatio","contextNames","contextAttributes","contextName","onContextLost","onContextRestore","programCache","renderLists","morphtargets","bufferRenderer","indexedBufferRenderer","initGLContext","updateStyle","boolean","bits","onXRSessionStart","onXRSessionEnd","infoAutoReset","shadowMapEnabled","shadowMapAutoUpdate","shadowMapNeedsUpdate","shadowMapType","onMaterialDispose","deallocateMaterial","releaseMaterialProgramReferences","setProgram","rangeFactor","dataCount","rangeStart","rangeCount","drawStart","drawEnd","drawCount","lineWidth","material2","getProgram","projectObject","camera2","renderScene","sortObjects","opaqueObjects","transmissiveObjects","transparentObjects","renderTransmissionPass","renderObjects","overrideMaterial","lightsStateVersion","programCacheKey","updateCommonMaterialProperties","materialNeedsLights","progUniforms","uniformsList","vertexAlphas","vertexTangents","needsProgramChange","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","uCamPos","skeleton","markUniformsLightsNeedsUpdate","defaultFramebuffer","useDefaultFramebuffer","isRenderTarget3D","__webglFramebuffer","layer","activeCubeFaceIndex","textureFormat","halfFloatSupportedByExt","levelScale","srcTexture","dstTexture","sourceBox","glTarget","unpackRowLen","unpackImageHeight","unpackSkipPixels","unpackSkipRows","unpackSkipImages","WebGL1Renderer","FogExp2","density","Fog","Scene","InterleavedBuffer","ib","_vector$6","InterleavedBufferAttribute","interleavedBuffer","SpriteMaterial","_geometry","_intersectPoint","_worldScale","_mvPosition","_alignedPosition","_rotatedPosition","_viewWorldMatrix","_vA","_vB","_vC","_uvA","_uvB","_uvC","Sprite","float32Array","transformVertex","vertexPosition","mvPosition","_v1$2","_v2$1","LOD","_basePosition","_skinIndex","_skinWeight","_vector$5","_matrix","SkinnedMesh","bindMatrix","skinWeight","boneIndex","Bone","DataTexture","_offsetMatrix","_identityMatrix","Skeleton","bones","boneInverses","inverse","bone","boneMatrices","boneTexture","json","uuid","boneInverse","InstancedBufferAttribute","_instanceLocalMatrix","_instanceWorldMatrix","_instanceIntersects","_mesh","InstancedMesh","raycastTimes","instanceId","LineBasicMaterial","_start$1","_end$1","_inverseMatrix$1","_ray$1","_sphere$1","Line","lineDistances","localThreshold","localThresholdSq","vStart","vEnd","interSegment","interRay","_start","_end","LineSegments","LineLoop","PointsMaterial","_inverseMatrix","_ray","_sphere","_position$2","Points","testPoint","rayPointDistanceSq","intersectPoint","VideoTexture","video","updateVideo","FramebufferTexture","CompressedTexture","CanvasTexture","Curve","optionalTarget","divisions","lengths","arcLengths","targetArcLength","comparison","lengthBefore","segmentLength","segmentFraction","pt1","pt2","closed","binormals","vec","tz","EllipseCurve","aX","aY","xRadius","yRadius","aStartAngle","aEndAngle","aClockwise","aRotation","twoPi","deltaAngle","samePoints","ArcCurve","aRadius","CubicPoly","x3","tension","dt0","dt1","dt2","px","py","pz","CatmullRomCurve3","curveType","intPoint","CatmullRom","QuadraticBezierP0","QuadraticBezierP1","QuadraticBezierP2","QuadraticBezier","CubicBezierP0","CubicBezierP1","CubicBezierP2","CubicBezierP3","CubicBezier","CubicBezierCurve","v3","CubicBezierCurve3","LineCurve","LineCurve3","QuadraticBezierCurve","QuadraticBezierCurve3","SplineCurve","Curves","CurvePath","curve","startPoint","endPoint","curveLengths","lens","sums","curves","resolution","pts","aCPx","aCPy","aCP1x","aCP1y","aCP2x","aCP2y","npts","firstPoint","lastPoint","LatheGeometry","phiStart","phiLength","initNormals","inverseSegments","curNormal","prevNormal","CapsuleGeometry","capSegments","radialSegments","Path","CircleGeometry","thetaStart","thetaLength","CylinderGeometry","radiusTop","radiusBottom","openEnded","indexArray","halfHeight","generateTorso","generateCap","slope","indexRow","sinTheta","cosTheta","centerIndexStart","centerIndexEnd","ConeGeometry","PolyhedronGeometry","detail","vertexBuffer","uvBuffer","subdivide","applyRadius","generateUVs","getVertexByIndex","subdivideFace","cols","aj","bj","rows","pushVertex","azimuth","inclination","correctUVs","correctSeam","centroid","azi","correctUV","DodecahedronGeometry","_v0","_v1$1","_normal","_triangle","EdgesGeometry","thresholdAngle","thresholdDot","indexAttr","positionAttr","indexCount","indexArr","vertKeys","hashes","edgeData","jNext","vecHash0","vecHash1","reverseHash","index0","Shape","holesPts","hole","Earcut","holeIndices","dim","hasHoles","outerLen","outerNode","linkedList","triangles","invSize","eliminateHoles","earcutLinked","clockwise","signedArea","insertNode","equals","removeNode","filterPoints","again","ear","indexCurve","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangle","minTX","minTY","maxTX","maxTY","zOrder","locallyInside","isValidDiagonal","splitPolygon","getLeftmost","compareX","eliminateHole","findHoleBridge","hx","hy","mx","my","tanMin","tan","sectorContainsSector","sortLinked","numMerges","pSize","qSize","inSize","leftmost","intersectsPolygon","middleInside","q1","q2","o1","o2","o3","o4","onSegment","inside","Node","an","bp","ShapeUtils","contour","holes","faces","removeDupEndPts","addContour","holeIndex","ExtrudeGeometry","verticesArray","uvArray","addShape","curveSegments","steps","bevelEnabled","bevelThickness","bevelSize","bevelOffset","bevelSegments","extrudePath","uvgen","WorldUVGenerator","extrudePts","extrudeByPath","splineTube","binormal","position2","shapePoints","hl","ahole","scalePt2","pt","vlen","flen","getBevelVec","inPt","inPrev","inNext","v_trans_x","v_trans_y","shrink_by","v_prev_x","v_prev_y","v_next_x","v_next_y","v_prev_lensq","collinear0","v_prev_len","v_next_len","ptPrevShift_x","ptPrevShift_y","ptNextShift_x","ptNextShift_y","sf","v_trans_lensq","direction_eq","contourMovements","holesMovements","oneHoleMovements","verticesMovements","bs","vert","buildLidFaces","buildSideFaces","f3","layeroffset","sidewalls","slen1","slen2","f4","addVertex","addUV","vector2","toJSON$1","geometryShapes","indexA","indexB","indexC","a_x","a_y","b_x","b_y","c_x","c_y","indexD","a_z","b_z","c_z","d_x","d_y","d_z","IcosahedronGeometry","OctahedronGeometry","RingGeometry","innerRadius","outerRadius","thetaSegments","phiSegments","radiusStep","thetaSegmentLevel","ShapeGeometry","indexOffset","shapeVertices","shapeHoles","shapeHole","toJSON","SphereGeometry","thetaEnd","grid","verticesRow","uOffset","TetrahedronGeometry","TorusGeometry","tube","tubularSegments","arc","TorusKnotGeometry","P1","P2","calculatePositionOnCurve","cu","su","quOverP","cs","TubeGeometry","generateBufferData","generateSegment","generateIndices","WireframeGeometry","edges","ol","isUniqueEdge","hash1","hash2","Geometries","ShadowMaterial","RawShaderMaterial","MeshStandardMaterial","MeshPhysicalMaterial","reflectivity","MeshPhongMaterial","MeshToonMaterial","MeshNormalMaterial","MeshLambertMaterial","MeshMatcapMaterial","LineDashedMaterial","materialLib","AnimationUtils","forceClone","times","compareTime","nValues","srcOffset","jsonKeys","valuePropertyName","sourceClip","startFrame","endFrame","fps","clip","tracks","valueSize","minStartTime","targetClip","referenceFrame","referenceClip","numTracks","referenceTime","referenceTrack","referenceTrackType","targetTrack","referenceOffset","referenceValueSize","targetOffset","targetValueSize","lastIndex","referenceValue","startIndex","endIndex","interpolant","numTimes","valueStart","valueEnd","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","pp","validate_interval","seek","linear_scan","forward_scan","giveUpAt","t1global","CubicInterpolant","iPrev","iNext","tPrev","tNext","halfDt","o0","oP","oN","wP","wN","ppp","sP","sN","LinearInterpolant","offset1","offset0","weight1","weight0","DiscreteInterpolant","KeyframeTrack","interpolation","trackType","factoryMethod","timeOffset","timeScale","nKeys","prevTime","currTime","smoothInterpolation","writeIndex","keep","timeNext","offsetP","offsetN","readOffset","writeOffset","TypedKeyframeTrack","BooleanKeyframeTrack","ColorKeyframeTrack","NumberKeyframeTrack","QuaternionLinearInterpolant","QuaternionKeyframeTrack","StringKeyframeTrack","VectorKeyframeTrack","AnimationClip","blendMode","jsonTracks","frameTime","parseKeyframeTrack","clipTracks","morphTargetSequence","noLoop","numMorphTargets","objectOrClipArray","clipArray","animationToMorphTargets","animationMorphTargets","clips","addNonemptyTrack","trackName","animationKeys","propertyName","destTracks","clipName","hierarchyTracks","morphTargetNames","morphTargetName","animationKey","boneName","getTrackTypeForValueTypeName","Cache","LoadingManager","onLoad","onProgress","isLoading","itemsLoaded","itemsTotal","urlModifier","transform","DefaultLoadingManager","Loader","crossOrigin","resourcePath","requestHeader","loading","FileLoader","req","mimeType","callbacks","reader","total","lengthComputable","stream","readData","exec","label","decoder","AnimationLoader","CompressedTextureLoader","loadTexture","texDatas","ImageLoader","onImageLoad","removeEventListeners","onImageError","CubeTextureLoader","DataTextureLoader","texData","TextureLoader","Light","HemisphereLight","skyColor","groundColor","_projScreenMatrix$1","_lightPositionWorld$1","_lookTarget$1","LightShadow","shadowMatrix","viewportIndex","SpotLightShadow","SpotLight","penumbra","decay","power","_lightPositionWorld","_lookTarget","PointLightShadow","PointLight","DirectionalLightShadow","DirectionalLight","AmbientLight","RectAreaLight","SphericalHarmonics3","coefficients","coeff","shBasis","LightProbe","MaterialLoader","getTexture","normalScale","LoaderUtils","InstancedBufferGeometry","BufferGeometryLoader","interleavedBufferMap","arrayBufferMap","getInterleavedBuffer","getArrayBuffer","arrayBuffer","bufferAttribute","bufferAttributeConstr","ObjectLoader","hasImages","bufferGeometryLoader","loadImage","deserializeImage","imageArray","currentUrl","deserializedImage","parseConstant","TEXTURE_MAPPING","TEXTURE_WRAPPING","TEXTURE_FILTER","getGeometry","getMaterial","instanceMatrix","instanceColor","objectAnimations","ImageBitmapLoader","fetchOptions","blob","imageBitmap","AudioContext","AudioLoader","bufferCopy","audioBuffer","HemisphereLightProbe","sky","ground","AmbientLightProbe","_eyeRight","_eyeLeft","_projectionMatrix","StereoCamera","eyeSepHalf","eyeSepOnProjection","ymax","xmin","xmax","Clock","autoStart","newTime","_position$1","_quaternion$1","_scale$1","_orientation$1","AudioListener","Audio","audioNode","mediaElement","mediaStream","_position","_quaternion","_scale","_orientation","PositionalAudio","coneInnerAngle","coneOuterAngle","coneOuterGain","panner","AudioAnalyser","audio","fftSize","PropertyMixer","mixFunction","mixFunctionAdditive","setIdentity","accuIndex","currentWeight","weightAdditive","originalValueOffset","targetIndex","workOffset","_RESERVED_CHARS_RE","_reservedRe","_wordChar","_wordCharOrDot","_directoryRe","_nodeRe","_objectRe","_propertyRe","_trackRe","_supportedObjectNames","Composite","targetGroup","optionalParsedPath","parsedPath","PropertyBinding","firstValidIndex","rootNode","results","lastDot","objectName","nodeName","searchNodeSubtree","subTreeNode","dest","targetArray","sourceArray","targetObject","propertyIndex","objectIndex","nodeProperty","versioning","bindingType","AnimationObjectGroup","indicesByUUID","parsedPaths","nBindings","knownObject","nObjects","nCachedObjects","firstActiveIndex","lastCachedObject","bindingsForPath","lastCached","lastCachedIndex","firstActiveObject","firstActive","lastObject","indicesByPath","lastBindingsIndex","lastBindings","lastBindingsPath","AnimationAction","mixer","localRoot","nTracks","interpolants","interpolantSettings","repetitions","fadeOutAction","warp","fadeInDuration","fadeOutDuration","startEndRatio","endStartRatio","fadeInAction","weightInterpolant","startTimeScale","endTimeScale","timeScaleInterpolant","deltaTime","timeDirection","timeRunning","clipTime","propertyMixers","interpolantValue","loop","loopCount","pingPong","handle_stop","loopDelta","pending","atStart","atEnd","settings","weightNow","weightThen","AnimationMixer","prototypeAction","rootUuid","bindingsByRoot","bindingsByName","clipUuid","actionsForClip","actionsByClip","knownActions","lastInactiveAction","knownActionsForClip","lastKnownAction","byClipCacheIndex","actionByRoot","prevIndex","lastActiveIndex","firstInactiveAction","firstInactiveIndex","lastActiveAction","bindingByName","propBinding","lastInactiveBinding","firstInactiveBinding","lastActiveBinding","lastActiveInterpolant","optionalRoot","clipObject","existingAction","newAction","nActions","timeInSeconds","actionsToRemove","Uniform","InstancedInterleavedBuffer","GLBufferAttribute","elementSize","Raycaster","coords","intersectObject","ascSort","Spherical","other","Cylindrical","_vector$4","Box2","_startP","_startEnd","Line3","clampToLine","startEnd2","_vector$3","SpotLightHelper","coneLength","coneWidth","_vector$2","_boneMatrix","_matrixWorldInv","SkeletonHelper","getBoneList","boneList","PointLightHelper","sphereSize","_vector$1","_color1","_color2","HemisphereLightHelper","GridHelper","PolarGridHelper","radials","circles","_v1","_v2","_v3","DirectionalLightHelper","_vector","_camera","CameraHelper","pointMap","colorFrustum","colorCone","colorUp","colorTarget","colorCross","addLine","addPoint","setPoint","_box","BoxHelper","Box3Helper","PlaneHelper","positions2","_axis","_lineGeometry","_coneGeometry","ArrowHelper","headLength","headWidth","AxesHelper","xAxisColor","yAxisColor","zAxisColor","ShapePath","isCCW","noHoles","toShapesNoHoles","inSubpaths","tmpPath","tmpShape","isPointInsidePolygon","inPolygon","polyLen","edgeLowPt","edgeHighPt","edgeDx","edgeDy","perpEdge","isClockWise","subPaths","solid","holesFirst","betterShapeHoles","newShapes","newShapeHoles","mainIdx","tmpPoints","ambiguous","toChange","sIdx","sLen","sho","hIdx","ho","hole_unassigned","s2Idx","tmpHoles","DataUtils","_floatView","_uint32View","_baseTable","_shiftTable","_mantissaTable","_offsetTable","_exponentTable","_buffer","LineStrip","LinePieces","NoColors","FaceColors","VertexColors","MeshFaceMaterial","MultiMaterial","PointCloud","Particle","ParticleSystem","PointCloudMaterial","ParticleBasicMaterial","ParticleSystemMaterial","Vertex","DynamicBufferAttribute","Int8Attribute","Uint8Attribute","Uint8ClampedAttribute","Int16Attribute","Uint16Attribute","Int32Attribute","Uint32Attribute","Float32Attribute","Float64Attribute","construct","getPoint","AxisHelper","BoundingBoxHelper","EdgesHelper","WireframeHelper","XHRLoader","BinaryTextureLoader","filmGauge","WebGLRenderTargetCube","CanvasRenderer","JSONLoader","SceneUtils","LensFlare","ParametricGeometry","TextGeometry","FontLoader","Font","ImmediateRenderObject","WebGLMultisampleRenderTarget","DataTexture2DArray","DataTexture3D","Stats","showPanel","addPanel","panel","beginTime","fpsPanel","msPanel","memPanel","fg","bg","PR","WIDTH","HEIGHT","TEXT_X","TEXT_Y","GRAPH_X","GRAPH_Y","GRAPH_WIDTH","GRAPH_HEIGHT","maxValue","Te$1","it","globalThis_1","global","this","fails","require$$0","functionBindNative","NATIVE_BIND","functionCall","$propertyIsEnumerable","getOwnPropertyDescriptor","NASHORN_BUG","objectPropertyIsEnumerable","createPropertyDescriptor","bitmap","FunctionPrototype","uncurryThisWithBind","functionUncurryThis","uncurryThis","toString","stringSlice","classofRaw","require$$1","classof","require$$2","$Object","indexedObject","isNullOrUndefined","$TypeError","requireObjectCoercible","IndexedObject","toIndexedObject","documentAll","isCallable","argument","globalThis","aFunction","getBuiltIn","objectIsPrototypeOf","environmentUserAgent","process","Deno","versions","v8","environmentV8Version","V8_VERSION","$String","symbolConstructorDetection","symbol","NATIVE_SYMBOL","useSymbolAsUid","isPrototypeOf","USE_SYMBOL_AS_UID","require$$3","$Symbol","tryToString","aCallable","getMethod","ordinaryToPrimitive","pref","isPure","defineProperty","defineGlobalProperty","SHARED","sharedStoreModule","shared","toObject","hasOwnProperty_1","postfix","require$$4","require$$5","Symbol","WellKnownSymbolsStore","createWellKnownSymbol","wellKnownSymbol","TO_PRIMITIVE","toPrimitive","exoticToPrim","toPropertyKey","EXISTS","documentCreateElement","DESCRIPTORS","ie8DomDefine","propertyIsEnumerableModule","require$$6","IE8_DOM_DEFINE","require$$7","$getOwnPropertyDescriptor","objectGetOwnPropertyDescriptor","v8PrototypeDefineBug","anObject","V8_PROTOTYPE_DEFINE_BUG","$defineProperty","ENUMERABLE","CONFIGURABLE","WRITABLE","objectDefineProperty","Attributes","definePropertyModule","createNonEnumerableProperty","getDescriptor","PROPER","functionToString","inspectSource","WeakMap","weakMapBasicDetection","sharedKey","hiddenKeys","NATIVE_WEAK_MAP","OBJECT_ALREADY_INITIALIZED","TypeError","enforce","getterFor","TYPE","STATE","internalState","CONFIGURABLE_FUNCTION_NAME","InternalStateModule","enforceInternalState","getInternalState","join","CONFIGURABLE_LENGTH","TEMPLATE","makeBuiltIn","makeBuiltInModule","defineBuiltIn","simple","ceil","mathTrunc","trunc","toIntegerOrInfinity","toAbsoluteIndex","integer","toLength","lengthOfArrayLike","createMethod","IS_INCLUDES","$this","fromIndex","arrayIncludes","indexOf","objectKeysInternal","enumBugKeys","internalObjectKeys","objectGetOwnPropertyNames","objectGetOwnPropertySymbols","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","concat","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptorModule","copyConstructorProperties","isForced","feature","detection","POLYFILL","NATIVE","isForced_1","_export","TARGET","GLOBAL","STATIC","FORCED","targetProperty","sourceProperty","TO_STRING_TAG","toStringTagSupport","TO_STRING_TAG_SUPPORT","CORRECT_ARGUMENTS","tryGet","defineBuiltInAccessor","require$$8","require$$9","NativeSymbol","SymbolPrototype","EmptyStringDescriptionStore","SymbolWrapper","thisSymbolValue","symbolDescriptiveString","desc","MAX_SAFE_INTEGER","doesNotExceedSafeInteger","functionUncurryThisClause","bind","functionBindContext","that","flattenIntoArray","sourceLen","mapper","sourceIndex","mapFn","elementLen","flattenIntoArray_1","constructorRegExp","INCORRECT_TO_STRING","isConstructorModern","isConstructorLegacy","isConstructor","SPECIES","$Array","arraySpeciesConstructor","originalArray","arraySpeciesCreate","depthArg","callbackfn","objectKeys","objectDefineProperties","Properties","html","definePropertiesModule","GT","LT","PROTOTYPE","SCRIPT","IE_PROTO","EmptyConstructor","scriptTag","NullProtoObjectViaActiveX","activeXDocument","NullProtoObjectViaIFrame","JS","iframeDocument","NullProtoObject","objectCreate","create","UNSCOPABLES","ArrayPrototype","addToUnscopables","$includes","BROKEN_ON_SPARSE","REDUCE_EMPTY","IS_RIGHT","argumentsLength","arrayReduce","arrayMethodIsStrict","METHOD_NAME","userAgentStartsWith","ENVIRONMENT","environmentIsNode","$reduce","CHROME_VERSION","IS_NODE","CHROME_BUG","$reduceRight","deletePropertyOrThrow","arraySlice","comparefn","llength","rlength","lindex","rindex","arraySort","firefox","environmentFfVersion","UA","environmentIsIeOrEdge","webkit","environmentWebkitVersion","internalSort","FF","require$$10","IE_OR_EDGE","require$$11","V8","require$$12","WEBKIT","require$$13","nativeSort","FAILS_ON_UNDEFINED","FAILS_ON_NULL","STRICT_METHOD","STABLE_SORT","chr","getSortCompare","arrayLength","itemsLength","$hypot","value1","value2","aLen","larg","div","iterators","Iterators","ITERATOR","isArrayIteratorMethod","getIteratorMethod","getIterator","usingIterator","iteratorMethod","iteratorClose","kind","innerResult","innerError","Result","stopped","ResultPrototype","iterate","iterable","unboundFunction","AS_ENTRIES","IS_RECORD","IS_ITERATOR","INTERRUPTED","iterFn","condition","callFn","createProperty","functionUncurryThisAccessor","isPossiblePrototype","aPossiblePrototype","uncurryThisAccessor","objectSetPrototypeOf","CORRECT_SETTER","setToStringTag","TAG","setSpecies","CONSTRUCTOR_NAME","Constructor","anInstance","Prototype","aConstructor","speciesConstructor","defaultConstructor","functionApply","validateArgumentsLength","passed","required","environmentIsIos","IS_IOS","clear","Dispatch","Function","MessageChannel","String","ONREADYSTATECHANGE","$location","defer","globalPostMessageDefer","safeGetBuiltIn","Queue","environmentIsIosPebble","environmentIsWebosWebkit","macrotask","IS_IOS_PEBBLE","IS_WEBOS_WEBKIT","MutationObserver","Promise","microtask","notify","toggle","then","microtask_1","hostReportErrors","perform","promiseNativeConstructor","NativePromiseConstructor","SUBCLASSING","NATIVE_PROMISE_REJECTION_EVENT","FORCED_PROMISE_CONSTRUCTOR","PROMISE_CONSTRUCTOR_SOURCE","GLOBAL_CORE_JS_PROMISE","FakePromise","promiseConstructorDetection","PromiseCapability","$$resolve","$$reject","newPromiseCapability","setPrototypeOf","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","PromiseConstructorDetection","require$$21","newPromiseCapabilityModule","require$$22","PROMISE","NATIVE_PROMISE_SUBCLASSING","getInternalPromiseState","setInternalState","NativePromisePrototype","PromiseConstructor","PromisePrototype","newGenericPromiseCapability","DISPATCH_EVENT","UNHANDLED_REJECTION","REJECTION_HANDLED","PENDING","FULFILLED","HANDLED","UNHANDLED","Internal","OwnPromiseCapability","PromiseWrapper","nativeThen","callReaction","reaction","ok","exited","onHandleUnhandled","isReject","reactions","onUnhandled","dispatchEvent","IS_UNHANDLED","isUnhandled","unwrap","internalReject","internalResolve","onFulfilled","onRejected","SAFE_CLOSING","iteratorWithReturn","checkCorrectnessOfIteration","SKIP_CLOSING","ITERATION_SUPPORT","promiseStaticsIncorrectIteration","PROMISE_STATICS_INCORRECT_ITERATION","capability","$promiseResolve","alreadyCalled","capabilityReject","promiseResolve","promiseCapability","NON_GENERIC","onFinally","inheritIfRequired","dummy","Wrapper","NewTarget","NewTargetPrototype","MATCH","isRegexp","regexpFlags","regExpFlags","RegExpPrototype","regexpGetFlags","flags","$RegExp","UNSUPPORTED_Y","MISSED_STICKY","BROKEN_CARET","regexpStickyHelpers","proxyAccessor","Target","regexpUnsupportedDotAll","regexpUnsupportedNcg","getOwnPropertyNames","getRegExpFlags","stickyHelpers","UNSUPPORTED_DOT_ALL","UNSUPPORTED_NCG","NativeRegExp","SyntaxError","charAt","stringIndexOf","IS_NCG","re1","re2","CORRECT_NEW","BASE_FORCED","handleDotAll","brackets","handleNCG","named","ncg","groupid","groupname","RegExpWrapper","thisIsRegExp","patternIsRegExp","flagsAreUndefined","rawPattern","rawFlags","dotAll","sticky","handled","nativeReplace","nativeExec","patchedExec","UPDATES_LAST_INDEX_WRONG","NPCG_INCLUDED","PATCH","reCopy","charsAdded","strCopy","regexpExec","RegExp","INDICES_SUPPORT","calls","expected","addGetter","pairs","fixRegexpWellKnownSymbolLogic","KEY","SHAM","SYMBOL","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","nativeMethod","arg2","forceStringMethod","$exec","charCodeAt","CONVERT_TO_STRING","second","stringMultibyte","advanceStringIndex","unicode","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","getSubstitution","captures","namedCaptures","tailPos","symbols","ch","capture","regexpExecAbstract","fixRegExpWellKnownSymbolLogic","regExpExec","REPLACE","maybeToString","REPLACE_KEEPS_$0","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","REPLACE_SUPPORTS_NAMED_GROUPS","maybeCallNative","UNSAFE_SUBSTITUTE","searchValue","replaceValue","rx","functionalReplace","fullUnicode","matchStr","accumulatedResult","nextSourcePosition","replacerArgs","arrayBufferBasicDetection","correctPrototypeGetter","CORRECT_PROTOTYPE_GETTER","ObjectPrototype","objectGetPrototypeOf","NATIVE_ARRAY_BUFFER","getPrototypeOf","Int8Array","Int8ArrayPrototype","Uint8ClampedArray","Uint8ClampedArrayPrototype","TypedArray","TypedArrayPrototype","TYPED_ARRAY_TAG","TYPED_ARRAY_CONSTRUCTOR","NATIVE_ARRAY_BUFFER_VIEWS","TYPED_ARRAY_TAG_REQUIRED","NAME","TypedArrayConstructorsList","BigIntArrayConstructorsList","isView","getTypedArrayConstructor","isTypedArray","aTypedArray","aTypedArrayConstructor","exportTypedArrayMethod","forced","ARRAY","TypedArrayConstructor","exportTypedArrayStaticMethod","arrayBufferViewCore","ArrayBuffer","typedArrayConstructorsRequireWrappers","defineBuiltIns","$RangeError","toIndex","mathSign","EPSILON","INVERSE_EPSILON","mathRoundTiesToEven","roundTiesToEven","mathFloatRound","FLOAT_EPSILON","FLOAT_MAX_VALUE","FLOAT_MIN_VALUE","absolute","floatRound","FLOAT32_EPSILON","FLOAT32_MAX_VALUE","FLOAT32_MIN_VALUE","mathFround","LN2","pack","mantissaLength","bytes","exponentLength","eMax","eBias","rt","exponent","mantissa","nBits","ieee754","arrayFill","endPos","FunctionName","fround","IEEE754","PROPER_FUNCTION_NAME","ARRAY_BUFFER","DATA_VIEW","WRONG_LENGTH","WRONG_INDEX","getInternalArrayBufferState","getInternalDataViewState","NativeArrayBuffer","$ArrayBuffer","ArrayBufferPrototype","$DataView","DataViewPrototype","Array","RangeError","reverse","packIEEE754","unpackIEEE754","packInt8","packInt16","packInt32","unpackInt32","packFloat32","packFloat64","isLittleEndian","intIndex","boolIsLittleEndian","conversion","byteLength","byteOffset","bufferState","bufferLength","INCORRECT_ARRAY_BUFFER_NAME","testView","$setInt8","isIntegralNumber","toPositiveInteger","toOffset","BYTES","toUint8Clamped","isBigIntArray","toBigInt","prim","typedArrayFrom","mapfn","thisIsBigIntArray","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","IS_FILTER_REJECT","NO_HOLES","specificCreate","boundFunction","arrayIteration","arrayFromConstructorAndList","$length","TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS","ArrayBufferViewCore","ArrayBufferModule","require$$23","require$$24","require$$25","require$$26","require$$27","require$$28","require$$29","require$$30","require$$31","require$$32","nativeDefineProperty","nativeGetOwnPropertyDescriptor","DataView","BYTES_PER_ELEMENT","isArrayBuffer","isTypedArrayIndex","wrappedGetOwnPropertyDescriptor","wrappedDefineProperty","typedArrayConstructorModule","CLAMPED","GETTER","SETTER","NativeTypedArrayConstructor","TypedArrayConstructorPrototype","exported","addElement","typedArrayOffset","$len","createTypedArrayConstructor","$set","WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS","TO_OBJECT_BUG","arrayLike","Uint16Array","ACCEPT_INCORRECT_ARGUMENTS","installErrorCause","$Error","TEST","V8_OR_CHAKRA_STACK_ENTRY","IS_V8_OR_CHAKRA_STACK","errorStackClear","dropEntries","errorStackInstallable","clearErrorStack","ERROR_STACK_INSTALLABLE","captureStackTrace","errorStackInstall","normalizeStringArgument","$default","installErrorStack","$AggregateError","isInstance","AggregateErrorPrototype","errorsArray","$getOwnPropertyNames","windowNames","getWindowNames","objectGetOwnPropertyNamesExternal","arrayBufferNonExtensible","ARRAY_BUFFER_NON_EXTENSIBLE","$isExtensible","FAILS_ON_PRIMITIVES","objectIsExtensible","freezing","getOwnPropertyNamesExternalModule","isExtensible","FREEZING","REQUIRED","METADATA","setMetadata","fastKey","getWeakData","onFreeze","splice","internalMetadataModule","InternalMetadataModule","collection","IS_WEAK","ADDER","NativeConstructor","NativePrototype","fixMethod","uncurriedNativeMethod","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","BUGGY_SAFARI_ITERATORS","IteratorPrototype","PrototypeOfArrayIteratorPrototype","arrayIterator","NEW_ITERATOR_PROTOTYPE","iteratorsCore","returnThis","iteratorCreateConstructor","IteratorConstructor","ENUMERABLE_NEXT","createIteratorConstructor","IteratorsCore","KEYS","VALUES","ENTRIES","iteratorDefine","Iterable","DEFAULT","IS_SET","getIterationMethod","KIND","defaultIterator","IterablePrototype","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","CurrentIteratorPrototype","createIterResultObject","defineIterator","internalStateGetterFor","collectionStrong","define","getEntry","ITERATOR_NAME","getInternalCollectionState","getInternalIteratorState","iterated","ArrayIterationModule","find","uncaughtFrozenStore","UncaughtFrozenStore","findUncaughtFrozen","collectionWeak","isFrozen","isSealed","freeze","seal","IS_IE11","InternalWeakMap","$WeakMap","WeakMapPrototype","nativeSet","hasMSEdgeFreezingBug","frozenArray","nativeDelete","nativeHas","nativeGet","arrayIntegrityLevel","Map","initializer","IS_OBJECT","compositeKey","active","getCompositeKeyNode","MapPrototype","mapHelpers","aMap","allDeleted","wasDeleted","iterateSimple","ITERATOR_INSTEAD_OF_RECORD","MapHelpers","mapIterate","interruptible","newMap","collectionFrom","adder","ENTRY","nextItem","createCollectionFrom","DOES_NOT_WORK_WITH_PRIMITIVES","sameValueZero","searchElement","keyDerivative","collectionOf","createCollectionOf","noInitial","accumulator","isPresentInMap","RAD_PER_DEG","mathScale","inLow","inHigh","outLow","outHigh","nx","nInLow","nInHigh","nOutLow","nOutHigh","$x0","$x1","$y0","UINT16","$u","$v","u0","DEG_PER_RAD","globalIsFinite","numberIsFinite","SEEDED_RANDOM","SEEDED_RANDOM_GENERATOR","SEED_TYPE_ERROR","$SeededRandomGenerator","seed","INVALID_NUMBER_REPRESENTATION","INVALID_RADIX","$SyntaxError","$parseInt","numberToString","radix","mathNum","$$OBSERVABLE","OBSERVABLE","SUBSCRIPTION","SUBSCRIPTION_OBSERVER","getObservableInternalState","getSubscriptionInternalState","getSubscriptionObserverInternalState","SubscriptionState","subscription","subscriptionObserver","Subscription","subscriber","subscriptionState","SubscriptionObserver","nextMethod","errorMethod","completeMethod","$Observable","ObservablePrototype","observableMethod","observable","PROMISE_ANY_ERROR","AggregateError","alreadyResolved","alreadyRejected","slice","ACCEPT_ARGUMENTS","getOrCreateMetadataMap","targetKey","targetMetadata","keyMetadata","ordinaryHasOwnMetadata","MetadataKey","metadataMap","ordinaryGetOwnMetadata","ordinaryDefineOwnMetadata","MetadataValue","ordinaryOwnMetadataKeys","toMetadataKey","reflectMetadata","ReflectMetadataModule","metadataKey","metadataValue","ordinaryGetMetadata","mapHas","mapSet","arrayUniqueBy","resolver","resolverFunction","$arrayUniqueBy","ordinaryMetadataKeys","oKeys","pKeys","ordinaryHasMetadata","SetPrototype","setHelpers","aSet","isIterable","Set","isSetLike","toSetLike","SetHelpers","setIterate","setClone","setSize","getIteratorDirect","INVALID_SIZE","SetRecord","intSize","getSetRecord","numSize","iterateSet","setDifference","otherRec","$difference","newSet","setIntersection","$intersection","setIsDisjointFrom","$isDisjointFrom","setIsSubsetOf","$isSubsetOf","setIsSupersetOf","$isSupersetOf","arrayJoin","sep","setSymmetricDifference","keysIter","$symmetricDifference","setUnion","$union","relativeIndex","StringMultibyteModule","codeAt","STRING_ITERATOR","$StringIterator","IS_PURE","MATCH_ALL","REGEXP_STRING","REGEXP_STRING_ITERATOR","nativeMatchAll","WORKS_WITH_NON_GLOBAL_REGEX","$RegExpStringIterator","$global","$matchAll","IS_REG_EXP","searchLength","advanceBy","endOfLastMatch","wellKnownSymbolWrapped","wrappedWellKnownSymbolModule","wellKnownSymbolDefine","defineWellKnownSymbol","weakMapHelpers","aWeakMap","WeakMapHelpers","WeakSetPrototype","weakSetHelpers","aWeakSet","WeakSetHelpers","domIterables","classList","DOMTokenListPrototype","domTokenListPrototype","ARRAY_ITERATOR","es_array_iterator","DOMIterables","ArrayIteratorMethods","ArrayValues","handlePrototype","CollectionPrototype","COLLECTION_NAME","clearImmediate","USER_AGENT","WRAP","schedulersFix","hasTimeArg","firstParamIndex","boundArgs","setTask","setImmediate","WRONG_ARITY","urlConstructorDetection","params2","$assign","objectAssign","alphabet","propertyIsEnumerable","callWithSafeIterationClosing","arrayFrom","IS_CONSTRUCTOR","maxInt","tMin","tMax","initialBias","initialN","regexNonASCII","regexSeparators","OVERFLOW_ERROR","baseMinusTMin","fromCharCode","ucs2decode","digitToBasic","digit","adapt","numPoints","firstTime","encode","inputLength","bias","basicLength","handledCPCount","handledCPCountPlusOne","qMinusT","baseMinusT","stringPunycodeToAscii","encoded","labels","$fromCodePoint","INCORRECT_LENGTH","USE_NATIVE_URL","$toString","URL_SEARCH_PARAMS","URL_SEARCH_PARAMS_ITERATOR","getInternalParamsState","NativeRequest","Headers","RequestPrototype","HeadersPrototype","encodeURIComponent","fromCodePoint","shift","plus","FALLBACK_REPLACER","VALID_HEX","parseHexOctet","substr","getLeadingOnes","octet","utf8Decode","octets","codePoint","decodedChar","byteSequenceLength","sequenceIndex","nextByte","replacements","URLSearchParamsIterator","URLSearchParamsState","entryIterator","entryNext","URLSearchParamsConstructor","URLSearchParamsPrototype","$value","headersHas","headersSet","wrapRequestOptions","RequestConstructor","web_urlSearchParams_constructor","toASCII","URLSearchParamsModule","getInternalURLState","URLSearchParams","getInternalSearchParamsState","NativeURL","parseInt","pop","INVALID_AUTHORITY","INVALID_SCHEME","INVALID_HOST","INVALID_PORT","ALPHA","ALPHANUMERIC","DIGIT","HEX_START","OCT","DEC","HEX","FORBIDDEN_HOST_CODE_POINT","FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT","LEADING_C0_CONTROL_OR_SPACE","TRAILING_C0_CONTROL_OR_SPACE","TAB_AND_NEW_LINE","EOF","parseIPv4","partsLength","numbers","ipv4","parseIPv6","address","pieceIndex","compress","pointer","numbersSeen","ipv4Piece","swaps","swap","findLongestZeroSequence","ipv6","maxIndex","currStart","currLength","serializeHost","ignore0","C0ControlPercentEncodeSet","fragmentPercentEncodeSet","pathPercentEncodeSet","userinfoPercentEncodeSet","percentEncode","specialSchemes","isWindowsDriveLetter","startsWithWindowsDriveLetter","third","isSingleDot","isDoubleDot","SCHEME_START","SCHEME","NO_SCHEME","SPECIAL_RELATIVE_OR_AUTHORITY","PATH_OR_AUTHORITY","RELATIVE","RELATIVE_SLASH","SPECIAL_AUTHORITY_SLASHES","SPECIAL_AUTHORITY_IGNORE_SLASHES","AUTHORITY","HOST","HOSTNAME","PORT","FILE","FILE_SLASH","FILE_HOST","PATH_START","PATH","CANNOT_BE_A_BASE_URL_PATH","QUERY","FRAGMENT","URLState","isBase","urlString","baseState","stateOverride","seenAt","seenBracket","seenPasswordToken","codePoints","bufferCodePoints","encodedCodePoints","pathSize","scheme","username","password","URLConstructor","hostname","URLPrototype","accessorDescriptor","nativeCreateObjectURL","nativeRevokeObjectURL","freeGlobal","freeGlobal$4","freeSelf","root$6","Symbol$5","objectProto","nativeObjectToString","symToStringTag","getRawTag","isOwn","unmasked","nullTag","undefinedTag","baseGetTag","isObjectLike","symbolTag","isArray$5","reWhitespace","trimmedEndIndex","reTrimStart","baseTrim","NAN","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","isBinary","INFINITY","MAX_INTEGER","toFinite","toInteger","remainder","asyncTag","funcTag","genTag","proxyTag","reIsUint","isIndex","eq","isLength","isArrayLike","isIterateeCall","baseSlice","nativeCeil","nativeMax","chunk","resIndex","stringTag","i$1","Logger","logHandler","contextualLoggersByNameMap","merge","defineLogLevel","ContextualLogger","defaultContext","newLevel","lvl","filterLevel","msgArgs","globalLogger","messages","timerStartTimeByLabelMap","invokeConsoleMethod","hdlr","timerLabel","module","MOUSE_BUTTON","ACTION","isPerspectiveCamera","isOrthographicCamera","PI_2","PI_HALF","approxZero","approxEquals","roundToStep","infinityToMaxNumber","maxNumberToInfinity","extractClientCoordFromEvent","pointers","notSupportedInOrthographicCamera","quatInvertCompat","EventDispatcher$1","VERSION","TOUCH_DOLLY_FACTOR","isMac","isPointerEventsNotSupported","THREE","_ORIGIN","_AXIS_Y","_AXIS_Z","_v3A","_v3B","_v3C","_xColumn","_yColumn","_zColumn","_deltaTarget","_deltaOffset","_sphericalA","_sphericalB","_box3A","_box3B","_quaternionA","_quaternionB","_rotationMatrix","_raycaster","CameraControls","libs","domElement","deltaX","deltaY","dragToOffset","targetDistance","truckX","pedestalY","dollyScale","prevRadius","signedPrevRadius","zoomScale","prevZoom","dragStartPosition","lastDragPosition","dollyStart","onPointerDown","onPointerMove","onPointerUp","startDragging","onMouseDown","onMouseMove","onMouseUp","onTouchStart","touch","onTouchMove","onTouchEnd","pointerId","dragging","endDragging","lastScrollTimeStamp","onMouseWheel","deltaYFactor","onContextMenu","isPointerLockActive","dollyX","dollyY","dollyDelta","azimuthAngle","polarAngle","boundaryEnclosesCamera","enableTransition","resolveImmediately","lastRadius","newRadius","maxDistanceByCollisionTest","isCollided","zoomStep","zoom","box3OrObject","cover","paddingLeft","paddingRight","paddingBottom","paddingTop","promises","aabb","viewFromPolar","bb","bbSize","sphereOrMesh","createBoundingSphere","distanceToFit","diameter","positionX","positionY","positionZ","targetX","targetY","targetZ","positionAX","positionAY","positionAZ","targetAX","targetAY","targetAZ","positionBX","positionBY","positionBZ","targetBX","targetBY","targetBZ","targetA","positionA","targetB","positionB","deltaPhi","deltaRadius","cameraToPoint","box3","viewportOrX","boundingRectAspect","vFOV","hFOV","dampingFactor","lerpRatio","deltaTarget","deltaOffset","cameraDirection","planeX","planeY","worldToScreen","worldCursorPosition","prevPlaneConstant","newPlaneConstant","pullBack","deltaZoom","activePointer","friction","offsetLength2","newTarget","deltaClampedTarget","deltaClampedTargetLength2","offsetFactor","zoomInv","nearPlaneCorner","rect","onResolve","_domElement","object3d","HOLD_EVENT_TYPE","extendStatics","__extends","__","Hold","_super","holdIntervalDelay","ElementHold","KeyboardKeyHold","keyCode","onKeydown","isInputEvent","onKeyup","CENTER","AVERAGE","SAH","CONTAINED","TRIANGLE_INTERSECT_COST","TRAVERSAL_COST","BYTES_PER_NODE","IS_LEAFNODE_FLAG","MeshBVHNode","arrayToBox","nodeIndex32","getLongestEdgeIndex","bounds","splitDimIdx","splitDist","copyBounds","unionBounds","aVal","bVal","expandByTriangleBounds","triangleBounds","tCenter","tHalf","computeSurfaceArea","ensureIndex","geo","vertexCount","BufferConstructor","getRootIndexRanges","rangeBoundaries","sortedBoundaries","getBounds","centroidTarget","minx","miny","minz","maxx","maxy","maxz","cminx","cminy","cminz","cmaxx","cmaxy","cmaxz","includeCentroid","lx","ly","ry","cz","hz","lz","rz","getCentroidBounds","partition","axisOffset","BIN_COUNT","binsSort","sahBins","leftBounds","getOptimalSplit","nodeBoundingData","centroidBoundingData","strategy","getAverage","rootSurfaceArea","bestCost","cStart","cEnd","axisLeft","binWidth","truncatedBins","bin","leftCacheBounds","rightCacheBounds","splitCount","bi","leftCount","rightCount","rightBounds","leftProb","rightProb","cost","binIndex","lastBin","nextBin","binCount","avg","computeTriangleBounds","fullBounds","posAttr","triCount","posArr","bufferOffset","tri","tri3","tri6","ai","halfExtents","el2","buildTree","triggerProgress","trianglesProcessed","totalTriangles","splitNode","reachedMaxDepth","maxDepth","verbose","maxLeafTris","splitOffset","lstart","lcount","cacheCentroidBoundingData","rstart","rcount","roots","buildPackedTree","uint32Array","uint16Array","packedRoots","nodeCount","countNodes","populateBuffer","stride4Offset","stride2Offset","isLeaf","boundingData","splitAxis","nextUnusedPointer","SeparatingAxisBounds","field","boxMin","boxMax","closestPointLineToLine","dir1","dir2","v02","v10","v32","d0232","d3210","d3232","d0210","closestPointsSegmentToSegment","paramResult","temp1","temp2","target1","target2","closestPoint","closestPoint2","sphereIntersectTriangle","closestPointTemp","projectedPointTemp","planeTemp","lineTemp","DIST_EPSILON","isNearZero","ExtendedTriangle","satAxes","satBounds","axis0","sab0","axis1","sab1","axis2","sab2","axis3","sab3","point1","point2","edge","distSq","closestDistanceSq","nexti","saTri2","arr1","arr2","cachedSatBounds","cachedSatBounds2","cachedAxis","tempDir","edge1","edge2","plane1","plane2","satBounds1","satAxes1","sb","sa","satBounds2","satAxes2","sa1","sa2","points1","found1","count1","pNext","targetPoint","startIntersects","points2","found2","count2","separated1","separated2","cornerFields","line1","line2","lineTarget","otherVec","thisVec","f11","f12","f21","f22","OrientedBox","minVec","pi","alignedSatBounds","aabbBounds","saTri","pointsArr","triSatBounds","triSatAxes","xyzFields","segments1","segments2","threshold2","nextIndex2","f1","f2","intersectionPoint","side","intersectTri","intersections","triOffset","intersectTris","intersectClosestTri","setTriangle","ta","tb","tc","iterateOverTriangles","intersectsTriangleFunc","contained","PrimitivePool","getNewPrimitive","primitives","primitive","IS_LEAF","n16","OFFSET","COUNT","LEFT_NODE","RIGHT_NODE","SPLIT_AXIS","boxIntersection","raycast","nodeIndex16","_float32Array","_uint16Array","_uint32Array","leftIndex","intersectRay","rightIndex","raycastFirst","xyzAxis","leftToRight","c1Result","c2Result","shapecast","_box1","_box2","boxStack","boxPool","shapecastTraverse","intersectsBoundsFunc","intersectsRangeFunc","nodeScoreFunc","nodeIndexByteOffset","getLeftOffset","getRightEndOffset","score1","score2","box1","box2","isC1Leaf","c1Intersection","c1StopTraversal","isC2Leaf","c2Intersection","c2StopTraversal","intersectsGeometry","triangle2","invertedMat","obb","obb2","otherGeometry","geometryToBvh","cachedObb","thisGeometry","thisIndex","thisPos","bufferStack","_prevBuffer","setBuffer","clearBuffer","SKIP_GENERATION","aabb2","tempMatrix","temp3","temp4","tempBox","trianglePool","MeshBVH","bvh","rootData","indexAttribute","nodeIndices","_traverse","node32Index","node16Index","offsetLeft","offsetRight","forceChildren","includesLeft","includesRight","traverseLeft","traverseRight","leftChange","rightChange","didChange","lefti","righti","minLeftValue","maxLeftValue","minRightValue","maxRightValue","rootIndex","materialOrSide","isMaterial","isArrayMaterial","materialSide","startCount","closestResult","geomToMesh","_intersectsTriangleFunc","_orderNodesFunc","originalTriangleFunc","i3","boundsTraverseOrder","intersectsBounds","intersectsRange","intersectsTriangle","originalIntersectsRange","nodeIndex","otherBvh","matrixToLocal","intersectsRanges","intersectsTriangles","otherIndexAttr","otherPositionAttr","iterateOverDoubleTriangles","offset2","depth1","depth2","originalIntersectsRanges","nodeIndex1","nodeIndex2","boxToMesh","minThreshold","maxThreshold","otherPos","otherIndex","tempTarget1","tempTargetDest1","tempTarget2","tempTargetDest2","closestDistance","closestDistanceTriIndex","closestDistanceOtherTriIndex","otherOffset","otherCount","minThresholdSq","maxThresholdSq","triIndex","MeshBVHRootVisualizer","boundsTree","targetDepth","displayParents","boundsCount","posIndex","positionArray","terminate","xVal","yVal","zVal","indexLength","posOffset","MeshBVHVisualizer","edgeMaterial","meshMaterial","totalRoots","LineMaterial","cssColors","vgaColors","reAsciiWord","rsAstralRange","rsComboMarksRange","rsComboSymbolsRange","rsDingbatRange","rsLowerRange","rsMathOpRange","rsNonCharRange","rsPunctuationRange","rsSpaceRange","rsUpperRange","rsVarRange","rsBreakRange","rsApos","rsBreak","rsCombo","rsDigits","rsDingbat","rsLower","rsMisc","rsFitz","rsModifier","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsZWJ","rsLowerMisc","rsUpperMisc","rsOptLowerContr","rsOptUpperContr","reOptMod","rsOptVar","rsOptJoin","rsSeq","rsEmoji","reUnicodeWord","reHasUnicodeWord","asciiWords","hasUnicodeWord","unicodeWords","symbolProto","symbolToString","baseToString","words","lodash_words","rsAstral","rsSymbol","reUnicode","reHasUnicode","asciiToArray","baseFindIndex","predicate","fromRight","baseIndexOf","baseIsNaN","charsStartIndex","strSymbols","chrSymbols","hasUnicode","stringToArray","unicodeToArray","castSlice","trimStart","lodash_trimstart","reTrim","asciiSize","baseProperty","stringSize","unicodeSize","nativeFloor","baseRepeat","createPadding","charsLength","padEnd","strLength","lodash_padend","rgbHex","red","green","blue","isPercent","hexCharacters","match3or4Hex","match6or8Hex","nonHexChars","validHexSize","hexRgb","alphaFromHex","alphaString","toHex","_words","MIXED_WEIGHT","TEXT_WEIGHT","SEED","FACTOR","stringToColor","generateColor","getColors","word","mixColors","mixed","durl","cwk","wk","transfer","u8","u16","u32","fleb","fdeb","clim","freb","eb","fl","revfl","fd","revfd","rev","hMap","cd","mb","co","rvb","sv","r_1","flt","fdt","flm","flrm","fdm","fdrm","bits16","shft","slc","inflt","dat","st","noBuf","noSt","cbuf","bl","nbuf","bt","lbt","dbt","tbts","hLit","hcLen","tl","ldt","clt","clb","clbmsk","clm","lt","lms","dms","lpos","sym","dsym","wbits","wbits16","hTree","et","maxSym","tr","mbt","ln","lft","cst","i2_1","i2_2","i2_3","lc","cl","cli","cln","clen","wfblk","wblk","syms","lf","li","dlt","mlb","ddt","mdb","lclt","nlc","_d","lcdt","ndc","lcfreq","_e","lct","mlcb","nlcc","ftlen","dtlen","ll","llm","lcts","clct","deo","dflt","plvl","pre","post","lst","msk_1","bs1_1","bs2_1","hsh","lc_1","wi","hv","imod","pimod","rem","ch_1","dif","maxn","maxd","nl","mmd","md","ti","pti","lin","din","crct","crc","cr","adler","dopt","mrg","wcln","fnStr","td","ks","st_1","spInd","cbfs","wrkr","td_1","bInflt","inflateSync","pbf","gu8","bDflt","deflateSync","gze","gzh","gzhl","wbytes","guze","gzs","gzl","zle","zlh","zule","zlv","cbify","astrm","strm","astrmify","b4","b8","flg","zs","lv","AsyncCmpStrm","Deflate","AsyncDeflate","deflate","Inflate","bts","AsyncInflate","inflate","Gzip","AsyncGzip","gzip","gzipSync","Gunzip","AsyncGunzip","gunzip","gunzipSync","Zlib","AsyncZlib","zlib","zlibSync","Unzlib","AsyncUnzlib","unzlib","unzlibSync","Decompress","_this_1","AsyncDecompress","decompress","decompressSync","fltn","tds","dutf8","DecodeUTF8","np","EncodeUTF8","strToU8","latin1","ar_1","ar","strFromU8","ext","dbf","slzh","zh","fnl","es","z64e","off","exfl","wzh","exl","exf","wzf","ZipPassThrough","ZipDeflate","AsyncZipDeflate","Zip","com","chks","pAll","_i","chks_1","ind","uf","nxt","zip","tot","slft","files","term","tAll","cbf","cdl","badd","loc","_loop_1","ms","compression","cbl","zipSync","UnzipPassThrough","UnzipInflate","AsyncUnzipInflate","Unzip","toAdd","oc","_loop_2","sig","this_1","cmp_1","chks_2","sc_1","su_1","fn_1","d_1","file_1","ctr","chks_3","state_1","unzip","_loop_3","c_1","no","infl","unzipSync","c_2","EXRLoader","logBase","reverseLutFromBitmap","lut","hufClearDecTable","hdec","getBitsReturn","getBits","uInt8Array","inOffset","parseUint8Array","hufTableBuffer","hufCanonicalCodeTable","hcode","nc","hufUnpackEncTable","ni","im","iM","zerun","hufLength","hufCode","hufBuildDecTable","hdecod","plOffset","getCharReturn","getChar","getCodeReturn","getCode","rlc","outBuffer","outBufferOffset","outBufferEndOffset","UInt16","Int16","wdec14Return","wdec14","ls","hi","as","wdec16","aa","wav2Decode","ox","ny","oy","w14","ey","oy1","oy2","ox1","ox2","i00","i01","i10","i11","p01","p10","p11","hufDecode","encodingTable","decodingTable","outOffset","inOffsetEnd","hufUncompress","inDataView","nCompressed","nRaw","initialInOffset","parseUint32","freq","applyLut","nData","predictor","interleaveScalar","decodeRunLength","lossyDctDecode","cscSet","rowPtrs","channelData","acBuffer","dcBuffer","dataView","numComp","numFullBlocksX","numBlocksX","numBlocksY","leftoverX","leftoverY","currAcComp","currDcComp","dctData","halfZigBlock","rowBlock","rowOffsets","blocky","blockx","unRleAC","unZigZag","dctInverse","csc709Inverse","convertToHalf","halfRow","decodeFloat16","acValue","dctComp","beta","rowPtr","toLinear","float","uncompressRAW","uncompressRLE","compressed","rawBuffer","tmpBuffer","uncompressZIP","fflate","fflate.unzlibSync","uncompressPIZ","outBufferEnd","pizChannelData","minNonZero","parseUint16","maxNonZero","parseUint8","tmpOffset","cp","uncompressPXR","tmpBufferEnd","writePtr","ptr","uncompressDWA","dwaHeader","parseInt64","EXRHeader","channelRules","ruleSize","parseNullTerminatedString","csc","channels","rleBuffer","zlibInfo","chan","rleOffset","rowOffsetBytes","byte","uintBuffer","stringValue","parseFixedLengthString","parseRational","parseInt32","parseTimecode","Int32","Uint32","Uint8","int","parseFloat32","decodeFloat32","binary","fraction","Uint16","parseFloat16","parseChlist","pixelType","pLinear","xSampling","ySampling","parseChromaticities","redX","redY","greenX","greenY","blueX","blueY","whiteX","whiteY","parseCompression","compressionCodes","parseBox2i","xMin","yMin","xMax","yMax","parseLineOrder","lineOrders","lineOrder","parseV2f","parseV3f","parseValue","parseHeader","spec","keepReading","attributeType","attributeSize","setupDecoder","outputType","EXRDecoder","bufferDataView","channelOffsets","scanlineBlockIdx","viewer","line_y","true_y","channelID","cOff","outIndex","onLoadCallback","RGBELoader","rgbe_error","rgbe_error_code","NEWLINE","fgets","lineLimit","consume","RGBE_ReadHeader","magic_token_re","gamma_re","exposure_re","format_re","dimensions_re","RGBE_ReadPixels_RLE","scanline_width","data_rgba","ptr_end","rgbeStart","scanline_buffer","num_scanlines","isEncodedRun","byteValue","RGBEByteToRGBFloat","sourceOffset","destArray","destOffset","RGBEByteToRGBHalf","byteArray","rgbe_header_info","image_rgba_data","numElements","floatArray","halfArray","font","createPaths","line_height","offsetX","offsetY","createPath","glyph","cpx","cpy","cpx1","cpy1","cpx2","cpy2","outline","workerBootstrap","registerModule","dependencies","getTransferables","depResult","rehydrate","callModule","ref$1","handleResult","rej","messageId","transferables","defineMainThreadModule","moduleFunc","initResult","initPromise","deps","supportsWorkers","supported","_workerModuleId","_messageId","_allowInitAsString","workers","registeredModules","openRequests","defineWorkerModule","workerId","registrationPromise","stringifyFunction","callWorker","unregister","terminateWorker","getWorker","bootstrap","msgId","SDFGenerator","exports","pointOnQuadraticBezier","pointOut","pointOnCubicBezier","y3","forEachPathCommand","pathString","commandCallback","segmentRE","firstX","firstY","prevX","prevY","pathToLineSegments","segmentCallback","curvePoints","tempPoint","command","startX","startY","endX","endY","ctrl1X","ctrl1Y","ctrl2X","ctrl2Y","prevCurveX","prevCurveY","prevCurveX$1","prevCurveY$1","viewportQuadVertex","copyTexFragment","glContextParams","withWebGLContext","glOrCanvas","compileShader","withProgram","frag","uniformLoc","instancingDivisor","withTexture","withTextureFramebuffer","framebufferStack","handleContextLoss","renderImageData","tex","texUnit","setUniform","setAttribute","resizeWebGLCanvasWithoutClearing","newWidth","newHeight","webglUtils","generate$2","sdfWidth","sdfHeight","viewBox","sdfExponent","textureData","viewBoxWidth","viewBoxHeight","sdfX","sdfY","signedDist","findNearestSignedDistance","closestDistSq","closestDist","seg","absSquareDistanceToLineSegment","isPointInPoly","winding","generateIntoCanvas$2","generateIntoFramebuffer$1","rgbaData","lineX0","lineY0","lineX1","lineY1","ldx","ldy","javascript","mainVertex","mainFragment","postFragment","viewportUVs","implicitContext","isTestingSupport","NULL_OBJECT","supportByCanvas","validateSupport","isSupported","generate$1","generateIntoFramebuffer","generateIntoCanvas$1","lineSegmentCoords","intermediateTexture","intermediateTextureUnit","instancingExtension","blendMinMaxExtension","failReason","expectedResult","testResult","webgl","generate","generateIntoCanvas","bidiFactory","bidi","DATA","TYPES","TYPES_TO_NAMES","ISOLATE_INIT_TYPES","STRONG_TYPES","NEUTRAL_ISOLATE_TYPES","BN_LIKE_TYPES","TRAILING_TYPES","parseData","lastCode","skip","getBidiCharType","getBidiCharTypeName","data$1","parseCharacterMap","encodedString","includeReverse","reverseMap","prevPair","openToClose","closeToOpen","canonical","parse$1","openingToClosingBracket","closingToOpeningBracket","getCanonicalBracket","TYPE_L","TYPE_R","TYPE_EN","TYPE_ES","TYPE_ET","TYPE_AN","TYPE_CS","TYPE_B","TYPE_S","TYPE_ON","TYPE_BN","TYPE_NSM","TYPE_AL","TYPE_LRO","TYPE_RLO","TYPE_LRE","TYPE_RLE","TYPE_PDF","TYPE_LRI","TYPE_RLI","TYPE_FSI","TYPE_PDI","getEmbeddingLevels","baseDirection","MAX_DEPTH","charTypes","charTypeCounts","changeCharType","oldType","embedLevels","isolationPairs","paragraphs","paragraph","determineAutoEmbedLevel","FORMATTING_TYPES","nextEven","nextOdd","paraIdx","statusStack","stackTop","overflowIsolateCount","overflowEmbeddingCount","validIsolateCount","i$2","charType","level$1","level$2","isolInitIndex","levelRuns","currentRun","i$3","charType$1","isIsolInit","isPDI","isolatingRunSeqs","runIdx","seqRuns","pdiIndex","i$4","seqIndices","i$5","run$1","firstLevel","prevLevel","i$6","lastLevel","nextLevel","i$7","seqIdx","seqIndices$1","sosType","eosType","embedDirection","si","i$8","prevType","sj","si$1","i$9","sj$1","prevCharType","si$2","i$10","si$3","i$11","prevType$1","nextType","sj$2","sj$3","si$4","i$12","sj$4","si$5","i$13","sj$5","sj$6","si$6","prevStrongType","i$14","R_TYPES_FOR_N_STEPS","STRONG_TYPES_FOR_N_STEPS","bracketPairs","openerStack","si$7","oppositeBracket","stackIdx","stackChar","pairIdx","openSeqIdx","closeSeqIdx","foundStrongType","useStrongType","si$8","i$15","si$9","i$16","lr$1","si$10","si$11","si$12","niRunStart","niRunEnd","prevType$2","si2","nextType$1","si2$1","sj$7","i$17","level$3","type$1","j$1","isFSI","pdi","indexOfMatchingPDI","isolateStart","isolationLevel","mirrorMap","getMirroredCharacter","getMirroredCharactersMap","embeddingLevels","strLen","getReorderSegments","embeddingLevelsResult","lineStart","lineEnd","lineLevels","maxLevel","minOddLevel","segStart","getReorderedString","embedLevelsResult","getReorderedIndices","charIndex","voidMainRegExp","expandShaderIncludes","epoch","CONSTRUCTOR_CACHE","SHADER_UPGRADE_CACHE","materialInstanceId","createDerivedMaterial","baseMaterial","optionsKey","getKeyForOptions","ctorsByDerivation","privateBeforeCompileProp","onBeforeCompile","shaderInfo","upgradedShaders","upgraded","upgradeShaders","DerivedMaterial","derive","derived","newBase","distanceMaterial","vertexDefs","vertexMainIntro","vertexMainOutro","vertexTransform","fragmentDefs","fragmentMainIntro","fragmentMainOutro","fragmentColorTransform","customRewriter","timeUniform","postChunks","match1","fullStr","injectIntoShaderCode","shaderCode","defs","intro","outro","optionsJsonReplacer","_idCtr","optionsHashesToIds","optionsHash","createTypesetter","fontParser","defaultFontURL","fonts","INF","DEFAULT_IGNORABLE_CHARS","lineBreakingWhiteSpace","BREAK_AFTER_CHARS","doLoadFont","tryLoad","fontObj","loadFont","fontUrl","typeset","sdfGlyphSize","fontSize","letterSpacing","lineHeight","maxWidth","textAlign","textIndent","whiteSpace","overflowWrap","anchorX","anchorY","includeCaretPositions","chunkedBoundsSize","colorRanges","metricsOnly","mainStart","timings","hasMaxWidth","glyphIds","glyphPositions","glyphData","glyphColors","caretPositions","visibleBounds","chunkedBounds","maxLineWidth","renderableGlyphCount","canWrap","ascender","descender","unitsPerEm","lineGap","capHeight","xHeight","typesetStart","fontSizeMult","halfLeading","topBaseline","caretHeight","caretBottomOffset","lineXOffset","currentLine","TextLine","glyphObj","glyphX","glyphWidth","curLineCount","nextLine","adjustX","fly","anchorXOffset","anchorYOffset","parsePercent","bidiLevelsResult","lineYOffset","renderableGlyphIndex","prevCharIndex","colorCharIndex","currentColor","lineIndex","lineGlyphCount","trailingWhitespaceCount","justifyAdjust","whitespaceCount","justifyOffset","glyphInfo","flips","fi","startInLine","endInLine","setGlyphObj","glyphId","rtl","mirrored","caretLeft","caretRight","ligCount","fillLigatureCaretPositions","glyphY","visX0","visY0","visX1","visY1","chunkRect","measure","pct","ligStartIndex","ligStartX","ligEndX","ligY","guessedAdvanceX","textLineProps","newLine","all","mainThreadGenerator","createSDFGenerator","warned","generateSDF","useWebGL","generateSDF_GL","generateSDF_JS_Worker","chunkTimeBudget","nextChunk","threadCount","threads","callNum","thread","_createSDFGenerator","warmUpSDFCanvas","typrFactory","woff2otfFactory","rr","er","nr","parserFactory","Typr","woff2otf","cmdArgLengths","joiningTypeRawData","JT_LEFT","JT_RIGHT","JT_DUAL","JT_TRANSPARENT","JT_JOIN_CAUSING","JT_NON_JOINING","joiningTypeMap","getCharJoiningType","ISOL","INIT","FINA","MEDI","formsToFeatures","detectJoiningForms","joiningForms","prevJoiningType","prevForm","joiningType","form","stringToGlyphs","cc","gsub","lookupList","featureList","supportedFeatures","usedLookups","tab","isJoiningFeature","firstNum","wrapFontObj","typrFont","glyphMap","os2","hhea","fontScale","glyphIndices","prevGlyphIndex","glyphIndex","cmds","crds","crdsIdx","numArgs","peek","workerModule","CONFIG","tempColor","now$1","atlases","getTextRenderInfo","totalStart","toAbsoluteURL","textureWidth","glyphsPerRow","atlas","initContextLossHandling","sdfTexture","sdfCanvas","fontGlyphs","typesetInWorker","neededSDFs","glyphBounds","boundsIdx","positionsIdx","quadsStart","pathBounds","fontUnitsMargin","atlasIndex","sdfViewBox","posX","posY","sdfStart","currentHeight","neededRows","neededHeight","generateGlyphSDF","safariPre15Workaround","contextLost","useGPU","maxDist","squareIndex","toObj","fromObj","typesetterWorkerModule","typesetter","templateGeometries","getTemplateGeometry","geom","front","frontAttrs","backAttrs","combined","vertCount","glyphBoundsAttrName","glyphIndexAttrName","glyphColorAttrName","GlyphsGeometry","verts","tpl","glyphAtlasIndices","blockBounds","updateBufferAttr","curveRadius","bbox","halfPi","absR","leftAngle","rightAngle","clipRect","newArray","VERTEX_DEFS","VERTEX_TRANSFORM","FRAGMENT_DEFS","FRAGMENT_TRANSFORM","createTextDerivedMaterial","textMaterial","uDiffuseRE","defaultMaterial","defaultStrokeColor","tempMat4","tempVec3a","tempVec3b","tempArray","defaultOrient","getFlatRaycastMesh","getCurvedRaycastMesh","syncStartEvent","syncCompleteEvent","SYNCABLE_PROPS","COPYABLE_PROPS","textRenderInfo","queued","derivedMaterial","onDispose","outlineMaterial","isOutline","textInfo","distanceOffset","blurRadius","strokeWidth","fillOpacity","strokeOpacity","strokeColor","outlineWidth","outlineOffsetX","outlineOffsetY","outlineBlur","outlineOpacity","pad","colorObj","orient","rotMat","hSign","hAxis","vSign","vAxis","raycastMesh","privateKey","LineSegmentsGeometry","lineSegments","instanceBuffer","instanceColorBuffer","_start4","_end4","_ssOrigin","_ssOrigin3","_mvMatrix","_line","_closestPoint","_clipToWorldVector","_instanceStart","_instanceEnd","_lineWidth","getWorldSpaceHalfWidth","raycastWorldUnits","pointOnLine","raycastScreenSpace","projectionMatrix","instanceStart","instanceEnd","deltaDist","zPos","isInClipSpace","isInside","LineSegments2","instanceDistanceBuffer","worldUnits","sphereMargin","distanceToSphere","boxMargin","distanceToBox","CopyShader","Pass","FullScreenQuad","ShaderPass","textureID","writeBuffer","readBuffer","MaskPass","writeValue","clearValue","ClearMaskPass","EffectComposer","passIndex","maskActive","effectiveWidth","effectiveHeight","SAOShader","DepthLimitedBlurShader","BlurShaderUtils","kernelRadius","stdDev","gaussian","uvIncrement","offsets","SimplexNoise","xin","yin","n0","F2","G2","X0","Y0","j1","ii","jj","gi0","gi1","gi2","zin","n3","F3","G3","Z0","k1","j2","k2","z3","kk","gi3","grad4","simplex","perm","F4","G4","n4","W0","c4","c5","c6","j3","k3","l3","w2","w3","x4","y4","z4","w4","gi4","t4","_tempVector","_tempVector2","_tempQuaternion","_unit","_changeEvent","_mouseDownEvent","_mouseUpEvent","_objectChangeEvent","TransformControls","_gizmo","TransformControlsGizmo","_plane","TransformControlsPlane","propName","worldPosition","worldPositionStart","worldQuaternion","worldQuaternionStart","cameraPosition","cameraQuaternion","pointStart","pointEnd","rotationAxis","rotationAngle","getPointer","onPointerHover","intersectObjectWithRay","planeIntersect","ROTATION_SPEED","translationSnap","rotationSnap","scaleSnap","includeInvisible","allIntersections","_tempEuler","_alignVector","_zeroVector","_lookAtMatrix","_tempQuaternion2","_identityQuaternion","_dirVector","_tempMatrix","_unitX","_unitY","_unitZ","gizmoMaterial","gizmoLineMaterial","matInvisible","matHelper","matRed","matGreen","matBlue","matRedTransparent","matGreenTransparent","matBlueTransparent","matWhiteTransparent","matYellowTransparent","matGray","arrowGeometry","scaleHandleGeometry","lineGeometry","lineGeometry2","TranslateHelperGeometry","gizmoTranslate","pickerTranslate","helperTranslate","gizmoRotate","helperRotate","pickerRotate","gizmoScale","pickerScale","helperScale","setupGizmo","gizmoMap","gizmo","tempGeometry","handles","handle","mergesort","mergeSort","comparatorFn","firstHalf","secondHalf","left1","findInsertIndex","treeModel","walkStrategies","TreeModel","addChildToNode","model","childCount","hasComparatorFunction","addChild","insertIndex","oldIndex","addToPath","parseArgs","depthFirstPreOrder","keepGoing","depthFirstPostOrder","processQueue","indexOfChild","ArrayProto","ObjProto","SymbolProto","supportsArrayBuffer","supportsDataView","nativeIsArray","nativeKeys","nativeCreate","nativeIsView","_isNaN","_isFinite","hasEnumBug","nonEnumerableProps","MAX_ARRAY_INDEX","restArguments","isNull","isUndefined","tagTester","isString$1","isNumber$2","isDate$1","isRegExp$1","isArrayBuffer$1","nodelist","isFunction$3","hasObjectTag","hasStringTagBug","isIE11","isDataView","ie10IsDataView","isDataView$1","isArray$3","isArguments","isArguments$1","isFinite","isNumber","createSizePropertyCheck","getSizeProperty","sizeProperty","shallowProperty","getByteLength","isBufferLike","typedArrayPattern","isTypedArray$2","getLength","emulatedSet","collectNonEnumProps","nonEnumIdx","isEmpty","isMatch","_keys","toBufferView","bufferSource","tagDataView","aStack","bStack","deepEq","areArrays","aCtor","bCtor","isEqual","allKeys","ie11fingerprint","weakMapMethods","forEachName","hasName","commonInit","mapTail","mapMethods","setMethods","isWeakMap","isWeakSet","invert","functions","createAssigner","keysFunc","extend$3","extendOwn","defaults$5","ctor","baseCreate","Ctor","tap","interceptor","toPath","deepGet","_has","identity","optimizeCb","argCount","baseIteratee","iteratee","mapObject","currentKey","propertyOf","accum","createEscaper","escaper","testRegexp","replaceRegexp","escapeMap","escape$1","unescapeMap","unescape$1","noMatch","escapes","escapeRegExp","escapeChar","bareIdentifier","oldSettings","escape","interpolate","evaluate","idCounter","uniqueId","prefix","chain","executeBound","sourceFunc","boundFunc","callingContext","partial","bound","bind$1","callArgs","strict","bindAll","hasher","later","throttled","_now","_args","negate","compose","findKey","createPredicateIndexFinder","findLastIndex","sortedIndex","createIndexFinder","predicateFind","lastIndexOf","keyFinder","findWhere","createReduce","reducer","initial","reduceRight","every","some","contains","invoke","contextPath","pluck","where","lastComputed","reStrSymbol","toArray","sample","rand","shuffle","sortBy","behavior","groupBy","indexBy","countBy","keyInObj","compact","_flatten","difference","without","otherArrays","uniq","isSorted","union","arrays","argsLength","chainResult","allExports","nt","at","We","xe","ut","ot","ct","vt","ft","St","ht","Vt","mt","zt","Xt","qt","e.PerspectiveCamera","e.OrthographicCamera","e.Vector3","Re","e.Vector2","e.Raycaster","Kt","Ut","Tt","xt","Pt","Wt","Le","yt","Ne","Oe","En","Mt","Nt","Ot","Lt","Zt","kt","Gt","jt","It","Et","wt","ke","Jt","Yt","Ft","Dt","gt","Ct","Ht","Qt","kr","At","Bt","_t","$t","Ie","sr","ur","ir","dr","or","vr","we","fr","Sr","hr","Vr","mr","zr","Xr","br","qr","Kr","Ur","Tr","Pr","Wr","yr","Rr","Mr","Nr","Or","Lr","Zr","gr","Gr","jr","Ir","Er","Fe","wr","Jr","Yr","Fr","Je","Dr","Cr","Hr","Qr","Ar","_r","Br","$r","en","tn","bn","Un","rn","He","nn","un","dn","pn","cn","vn","Qe","Be","Sn","hn","Vn","mn","zn","Xn","qn","Kn","Tn","xn","Pn","Wn","yn","Rn","Mn","Nn","On","Ln","Zn","kn","Gn","jn","In","wn","ze","Xe","qe","Ze","Ke","Ue","Jn","Yn","Fn","Dn","e.Group","e.MeshStandardMaterial","e.DoubleSide","e.Mesh","e.Box3Helper","e.SphereGeometry","e.PlaneGeometry","$e","e.BufferGeometry","e.BufferAttribute","e.Plane","e.Box3","gn","Qn","Cn","Hn","An","Bn","_n","$n","ei","e.Clock","projects","proj","projDet","selectedProj","allModels","allVers","modelVers","branchName","_f","project","allVer","modelVer","viewerInstance","updateGroupColors","hslRegex","colorGroups","serverUrl","objectIds","colorMap","relevantColorGroups","stringToByteArray$1","byteArrayToString","base64","webSafe","byteToCharMap","byte1","haveByte2","byte2","haveByte3","byte3","outByte1","outByte2","outByte3","outByte4","charToByteMap","byte4","DecodeBase64StringError","base64Encode","utf8Bytes","base64urlEncodeWithoutPadding","base64Decode","getGlobal","getDefaultsFromGlobal","getDefaultsFromEnvVariable","defaultsJsonString","getDefaultsFromCookie","decoded","getDefaults","getDefaultEmulatorHost","productName","getDefaultEmulatorHostnameAndPort","separatorIndex","getDefaultAppConfig","getExperimentalSetting","Deferred","createMockUserToken","iat","signature","getUA","isMobileCordova","isNode","forceEnvironment","isCloudflareWorker","isBrowserExtension","runtime","isReactNative","isIE","ua","isSafari","isIndexedDBAvailable","validateIndexedDBOpenable","preExist","DB_CHECK_NAME","ERROR_NAME","FirebaseError","customData","ErrorFactory","service","serviceName","fullCode","replaceTemplate","fullMessage","PATTERN","deepEqual","aKeys","bKeys","aProp","bProp","thing","querystring","querystringParams","arrayVal","querystringDecode","extractQuerystring","queryStart","fragmentStart","createSubscribe","onNoObservers","ObserverProxy","nextOrObserver","complete","implementsAnyMethods","unsub","getModularInstance","instanceFactory","multipleInstances","DEFAULT_ENTRY_NAME","Provider","identifier","normalizedIdentifier","deferred","isComponentEager","instanceIdentifier","instanceDeferred","services","normalizedDeferredIdentifier","existingCallbacks","normalizeIdentifierForFactory","ComponentContainer","provider","LogLevel","levelStringToEnum","defaultLogLevel","ConsoleMethod","defaultLogHandler","logType","instanceOfAny","constructors","idbProxyableTypes","cursorAdvanceMethods","getIdbProxyableTypes","getCursorAdvanceMethods","cursorRequestMap","transactionDoneMap","transactionStoreNamesMap","transformCache","reverseTransformCache","promisifyRequest","unlisten","success","cacheDonePromiseForTransaction","idbProxyTraps","replaceTraps","wrapFunction","storeNames","transformCachableValue","openDB","blocked","upgrade","blocking","terminated","openPromise","db","readMethods","writeMethods","cachedMethods","targetFuncName","useIndex","isWrite","storeName","oldTraps","PlatformLoggerServiceImpl","isVersionServiceProvider","logString","name$q","version$1","name$p","name$o","name$n","name$m","name$l","name$k","name$j","name$i","name$h","name$g","name$f","name$e","name$d","name$c","name$b","name$a","name$9","name$8","name$7","name$6","name$5","name$4","name$3","name$2","name$1","PLATFORM_LOG_STRING","_apps","_serverApps","_components","_addComponent","_registerComponent","serverApp","_getProvider","heartbeatController","_isFirebaseServerApp","ERRORS","ERROR_FACTORY","FirebaseAppImpl","initializeApp","rawConfig","existingApp","newApp","getApp","registerVersion","libraryKeyOrName","variant","libraryMismatch","versionMismatch","DB_NAME","DB_VERSION","STORE_NAME","dbPromise","getDbPromise","oldVersion","readHeartbeatsFromIndexedDB","computeKey","idbGetError","writeHeartbeatsToIndexedDB","heartbeatObject","MAX_HEADER_BYTES","STORED_HEARTBEAT_RETENTION_MAX_MILLIS","HeartbeatServiceImpl","HeartbeatStorageImpl","agent","date","getUTCDateString","singleDateHeartbeat","hbTimestamp","heartbeatsToSend","unsentEntries","extractHeartbeatsForHeader","headerString","heartbeatsCache","heartbeatEntry","hb","countBytes","idbHeartbeatObject","heartbeatsObject","existingHeartbeatsObject","registerCoreComponents","commonjsGlobal","Integer","Md5","XhrIo","WebChannel","ErrorCode","Stat","Event","getStatEventTarget","createWebChannelTransport","ba","ca","ea","fa","ha","ia","ja","ka","la","ma","na","oa","pa","ra","wa","xa","za","Aa","Ba","Ca","Ea","Da","Fa","Ga","Ha","Ia","Ja","Ka","La","Ma","Na","Oa","Qa","Ra","Sa","Ta","Ua","Va","Wa","Xa","Ya","Za","$a","fb","gb","jb","kb","nb","rb","ub","wb","xb","yb","zb","Ab","Bb","Cb","Db","Eb","Fb","Gb","Hb","Ib","Jb","Kb","Lb","Mb","Nb","Ob","Pb","Qb","Rb","Sb","Tb","Ub","Vb","Wb","Xb","Yb","Zb","$b","ya","dc","ec","fc","gc","hc","ic","jc","kc","pc","qc","rc","uc","wc","xc","yc","zc","Ac","Bc","Cc","Dc","Ec","Fc","Gc","Hc","Ic","Jc","Lc","Mc","Nc","Oc","Pc","Qc","Rc","Sc","Tc","Uc","Vc","Wc","Xc","Yc","Zc","$c","ed","gd","hd","jd","User","__PRIVATE_getLogLevel","__PRIVATE_logDebug","__PRIVATE_argToString","__PRIVATE_logError","__PRIVATE_logWarn","fail","__PRIVATE_hardAssert","__PRIVATE_debugCast","FirestoreError","__PRIVATE_Deferred","__PRIVATE_OAuthToken","__PRIVATE_EmptyAuthCredentialsProvider","__PRIVATE_EmulatorAuthCredentialsProvider","__PRIVATE_FirebaseAuthCredentialsProvider","__PRIVATE_guardedChangeListener","__PRIVATE_awaitNextToken","__PRIVATE_registerAuth","__PRIVATE_FirstPartyToken","__PRIVATE_FirstPartyAuthCredentialsProvider","AppCheckToken","__PRIVATE_FirebaseAppCheckTokenProvider","onTokenChanged","__PRIVATE_registerAppCheck","__PRIVATE_randomBytes","__PRIVATE_AutoId","__PRIVATE_primitiveComparator","__PRIVATE_arrayEquals","Timestamp","SnapshotVersion","BasePath","ResourcePath","FieldPath$1","__PRIVATE_addCurrentSegment","DocumentKey","__PRIVATE_newIndexOffsetSuccessorFromReadTime","IndexOffset","__PRIVATE_newIndexOffsetFromDocument","__PRIVATE_indexOffsetComparator","PersistenceTransaction","__PRIVATE_ignoreIfPrimaryLeaseLoss","PersistencePromise","__PRIVATE_getAndroidVersion","__PRIVATE_isIndexedDbTransactionError","__PRIVATE_ListenSequence","__PRIVATE_isNullOrUndefined","__PRIVATE_isNegativeZero","isSafeInteger","__PRIVATE_objectSize","SortedMap","LLRBNode","SortedMapIterator","SortedSet","SortedSetIterator","FieldMask","__PRIVATE_Base64DecodeError","ByteString","__PRIVATE_normalizeTimestamp","__PRIVATE_normalizeNumber","__PRIVATE_normalizeByteString","__PRIVATE_isServerTimestamp","__PRIVATE_getPreviousValue","__PRIVATE_getLocalWriteTime","DatabaseInfo","DatabaseId","__PRIVATE_typeOrder","__PRIVATE_isMaxValue","__PRIVATE_isVectorValue","__PRIVATE_valueEquals","__PRIVATE_arrayValueContains","__PRIVATE_valueCompare","__PRIVATE_compareTimestamps","__PRIVATE_compareArrays","canonicalId","__PRIVATE_canonifyValue","__PRIVATE_refValue","isInteger","__PRIVATE_isNullValue","__PRIVATE_isNanValue","__PRIVATE_isMapValue","__PRIVATE_deepClone","ObjectValue","__PRIVATE_extractFieldMask","MutableDocument","Bound","__PRIVATE_boundCompareToDocument","__PRIVATE_boundEquals","OrderBy","__PRIVATE_orderByEquals","Filter","FieldFilter","__PRIVATE_KeyFieldFilter","__PRIVATE_ArrayContainsFilter","__PRIVATE_InFilter","__PRIVATE_NotInFilter","__PRIVATE_ArrayContainsAnyFilter","__PRIVATE_KeyFieldInFilter","__PRIVATE_KeyFieldNotInFilter","CompositeFilter","__PRIVATE_compositeFilterIsConjunction","__PRIVATE_compositeFilterIsFlatConjunction","__PRIVATE_compositeFilterIsFlat","__PRIVATE_canonifyFilter","__PRIVATE_filterEquals","__PRIVATE_stringifyFilter","__PRIVATE_extractDocumentKeysFromArrayValue","__PRIVATE_TargetImpl","__PRIVATE_newTarget","__PRIVATE_canonifyTarget","__PRIVATE_targetEquals","__PRIVATE_targetIsDocumentTarget","__PRIVATE_QueryImpl","__PRIVATE_newQuery","__PRIVATE_newQueryForPath","__PRIVATE_queryMatchesAllDocuments","__PRIVATE_isCollectionGroupQuery","__PRIVATE_queryNormalizedOrderBy","__PRIVATE_queryToTarget","__PRIVATE__queryToTarget","__PRIVATE_queryWithAddedFilter","__PRIVATE_queryWithLimit","__PRIVATE_queryEquals","__PRIVATE_canonifyQuery","__PRIVATE_stringifyQuery","__PRIVATE_queryMatches","__PRIVATE_queryCollectionGroup","__PRIVATE_newQueryComparator","__PRIVATE_compareDocs","ObjectMap","__PRIVATE_mutableDocumentMap","documentMap","__PRIVATE_convertOverlayedDocumentMapToDocumentMap","__PRIVATE_newOverlayMap","__PRIVATE_newDocumentKeyMap","__PRIVATE_newMutationMap","__PRIVATE_documentKeySet","__PRIVATE_targetIdSet","__PRIVATE_toDouble","__PRIVATE_toInteger","TransformOperation","__PRIVATE_applyTransformOperationToLocalView","__PRIVATE_ServerTimestampTransform","__PRIVATE_ArrayUnionTransformOperation","__PRIVATE_applyArrayUnionTransformOperation","__PRIVATE_ArrayRemoveTransformOperation","__PRIVATE_applyArrayRemoveTransformOperation","__PRIVATE_computeTransformOperationBaseValue","asNumber","__PRIVATE_applyTransformOperationToRemoteDocument","__PRIVATE_NumericIncrementTransformOperation","__PRIVATE_coercedFieldValuesArray","__PRIVATE_fieldTransformEquals","MutationResult","Precondition","__PRIVATE_preconditionIsValidForDocument","Mutation","__PRIVATE_calculateOverlayMutation","__PRIVATE_DeleteMutation","__PRIVATE_SetMutation","__PRIVATE_PatchMutation","__PRIVATE_mutationApplyToRemoteDocument","__PRIVATE_serverTransformResults","__PRIVATE_getPatch","__PRIVATE_mutationApplyToLocalView","__PRIVATE_localTransformResults","__PRIVATE_mutationExtractBaseValue","__PRIVATE_mutationEquals","__PRIVATE_VerifyMutation","MutationBatch","MutationBatchResult","Overlay","ExistenceFilter","__PRIVATE_isPermanentError","__PRIVATE_mapCodeFromRpcCode","__PRIVATE_newTextEncoder","__PRIVATE_getMd5HashValue","__PRIVATE_get64BitUints","BloomFilter","__PRIVATE_BloomFilterError","RemoteEvent","TargetChange","__PRIVATE_DocumentWatchChange","__PRIVATE_ExistenceFilterChange","__PRIVATE_WatchTargetChange","__PRIVATE_TargetState","__PRIVATE_snapshotChangesMap","__PRIVATE_WatchChangeAggregator","__PRIVATE_documentTargetMap","JsonProtoSerializer","__PRIVATE_toInt32Proto","toTimestamp","__PRIVATE_toBytes","__PRIVATE_toVersion","__PRIVATE_fromVersion","__PRIVATE_toResourceName","__PRIVATE_toResourcePath","__PRIVATE_fromResourceName","__PRIVATE_isValidResourceName","__PRIVATE_toName","fromName","__PRIVATE_extractLocalPathFromResourceName","__PRIVATE_toQueryPath","__PRIVATE_fromQueryPath","__PRIVATE_getEncodedDatabaseId","__PRIVATE_toMutationDocument","__PRIVATE_fromWatchChange","toMutation","__PRIVATE_toDocumentMask","__PRIVATE_fromWriteResults","__PRIVATE_toDocumentsTarget","__PRIVATE_toQueryTarget","__PRIVATE_toFilter","__PRIVATE_toFieldPathReference","__PRIVATE_toDirection","__PRIVATE_convertQueryTargetToQuery","__PRIVATE_fromFilter","__PRIVATE_fromFieldPathReference","__PRIVATE_toListenRequestLabels","__PRIVATE_toOperatorName","__PRIVATE_toCompositeOperatorName","TargetData","__PRIVATE_LocalSerializer","__PRIVATE_fromBundledQuery","__PRIVATE_MemoryIndexManager","__PRIVATE_MemoryCollectionParentIndex","__PRIVATE_TargetIdGenerator","RemoteDocumentChangeBuffer","OverlayedDocument","LocalDocumentsView","__PRIVATE_MemoryBundleCache","__PRIVATE_MemoryDocumentOverlayCache","__PRIVATE_MemoryGlobalsCache","__PRIVATE_ReferenceSet","__PRIVATE_DocReference","__PRIVATE_MemoryMutationQueue","__PRIVATE_MemoryRemoteDocumentCacheImpl","__PRIVATE_MemoryRemoteDocumentChangeBuffer","__PRIVATE_MemoryTargetCache","__PRIVATE_MemoryPersistence","__PRIVATE_MemoryTransaction","__PRIVATE_MemoryEagerDelegate","__PRIVATE_LocalViewChanges","QueryContext","__PRIVATE_QueryEngine","__PRIVATE_LocalStoreImpl","__PRIVATE_newLocalStore","__PRIVATE_localStoreHandleUserChange","__PRIVATE_localStoreAcknowledgeBatch","__PRIVATE_localStoreGetLastRemoteSnapshotVersion","__PRIVATE_localStoreApplyRemoteEventToLocalCache","__PRIVATE_populateDocumentChangeBuffer","__PRIVATE_localStoreGetNextMutationBatch","__PRIVATE_localStoreAllocateTarget","__PRIVATE_localStoreReleaseTarget","__PRIVATE_localStoreExecuteQuery","__PRIVATE_setMaxReadTime","__PRIVATE_LocalClientState","__PRIVATE_MemorySharedClientState","__PRIVATE_NoopConnectivityMonitor","__PRIVATE_BrowserConnectivityMonitor","__PRIVATE_generateUniqueDebugId","__PRIVATE_StreamBridge","__PRIVATE_WebChannelConnection","__PRIVATE_unguardedEventListen","getDocument","__PRIVATE_newSerializer","__PRIVATE_ExponentialBackoff","__PRIVATE_PersistentStream","__PRIVATE_PersistentListenStream","__PRIVATE_PersistentWriteStream","__PRIVATE_DatastoreImpl","__PRIVATE_OnlineStateTracker","__PRIVATE_RemoteStoreImpl","__PRIVATE_canUseNetwork","__PRIVATE_disableNetworkInternal","__PRIVATE_enableNetworkInternal","__PRIVATE_remoteStoreListen","__PRIVATE_shouldStartWatchStream","__PRIVATE_startWatchStream","__PRIVATE_ensureWatchStream","__PRIVATE_sendWatchRequest","__PRIVATE_remoteStoreUnlisten","__PRIVATE_sendUnwatchRequest","__PRIVATE_cleanUpWatchStreamState","__PRIVATE_onWatchStreamConnected","__PRIVATE_onWatchStreamOpen","__PRIVATE_onWatchStreamClose","__PRIVATE_onWatchStreamChange","__PRIVATE_disableNetworkUntilRecovery","__PRIVATE_executeWithRecovery","__PRIVATE_fillWritePipeline","__PRIVATE_ensureWriteStream","__PRIVATE_canAddToWritePipeline","__PRIVATE_addToWritePipeline","__PRIVATE_shouldStartWriteStream","__PRIVATE_startWriteStream","__PRIVATE_onWriteStreamOpen","__PRIVATE_onWriteHandshakeComplete","__PRIVATE_onMutationResult","__PRIVATE_onWriteStreamClose","__PRIVATE_remoteStoreHandleCredentialChange","__PRIVATE_remoteStoreApplyPrimaryState","DelayedOperation","__PRIVATE_wrapInUserErrorIfRecoverable","DocumentSet","__PRIVATE_DocumentChangeSet","ViewSnapshot","__PRIVATE_QueryListenersInfo","__PRIVATE_EventManagerImpl","__PRIVATE_newQueriesObjectMap","__PRIVATE_eventManagerListen","__PRIVATE_raiseSnapshotsInSyncEvent","__PRIVATE_eventManagerUnlisten","__PRIVATE_eventManagerOnWatchChange","__PRIVATE_eventManagerOnWatchError","__PRIVATE_QueryListener","__PRIVATE_AddedLimboDocument","__PRIVATE_RemovedLimboDocument","__PRIVATE_View","__PRIVATE_QueryView","LimboResolution","__PRIVATE_SyncEngineImpl","__PRIVATE_syncEngineListen","__PRIVATE_ensureWatchCallbacks","__PRIVATE_allocateTargetAndMaybeListen","__PRIVATE_triggerRemoteStoreListen","__PRIVATE_initializeViewAndComputeSnapshot","__PRIVATE_updateTrackedLimbos","__PRIVATE_syncEngineUnlisten","__PRIVATE_removeAndCleanupTarget","__PRIVATE_triggerRemoteStoreUnlisten","__PRIVATE_syncEngineWrite","__PRIVATE_syncEngineEnsureWriteCallbacks","__PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore","__PRIVATE_syncEngineApplyRemoteEvent","__PRIVATE_syncEngineApplyOnlineStateChange","__PRIVATE_syncEngineRejectListen","__PRIVATE_pumpEnqueuedLimboResolutions","__PRIVATE_syncEngineApplySuccessfulWrite","__PRIVATE_processUserCallback","__PRIVATE_triggerPendingWritesCallbacks","__PRIVATE_syncEngineRejectFailedWrite","__PRIVATE_removeLimboTarget","__PRIVATE_trackLimboChange","__PRIVATE_syncEngineHandleCredentialChange","__PRIVATE_syncEngineGetRemoteKeysForTarget","__PRIVATE_MemoryOfflineComponentProvider","OnlineComponentProvider","__PRIVATE_AsyncObserver","FirestoreClient","__PRIVATE_setOfflineComponentProvider","__PRIVATE_setOnlineComponentProvider","__PRIVATE_ensureOfflineComponents","__PRIVATE_ensureOnlineComponents","__PRIVATE_getSyncEngine","__PRIVATE_getEventManager","__PRIVATE_firestoreClientGetDocumentsViaSnapshotListener","__PRIVATE_cloneLongPollingOptions","__PRIVATE_validateNonEmptyArgument","__PRIVATE_validateIsNotUsedTogether","__PRIVATE_validateDocumentPath","__PRIVATE_validateCollectionPath","__PRIVATE_valueDescription","__PRIVATE_cast","__PRIVATE_validatePositiveNumber","FirestoreSettingsImpl","Firestore$1","connectFirestoreEmulator","Query","DocumentReference","CollectionReference","__PRIVATE_AsyncQueueImpl","Firestore","getFirestore","ensureFirestoreConfigured","__PRIVATE_configureFirestore","Bytes","FieldPath","FieldValue","GeoPoint","VectorValue","ParsedSetData","ParsedUpdateData","__PRIVATE_isWrite","__PRIVATE_ParseContextImpl","__PRIVATE_createError","__PRIVATE_UserDataReader","__PRIVATE_newUserDataReader","__PRIVATE_parseSetData","__PRIVATE_validatePlainObject","__PRIVATE_parseObject","__PRIVATE_fieldPathFromArgument$1","__PRIVATE_fieldMaskContains","__PRIVATE_DeleteFieldValueImpl","__PRIVATE_parseUpdateData","__PRIVATE_fieldPathFromDotSeparatedString","__PRIVATE_parseData","__PRIVATE_parseUpdateVarargs","__PRIVATE_parseQueryValue","__PRIVATE_looksLikeJsonObject","DocumentSnapshot$1","QueryDocumentSnapshot$1","__PRIVATE_fieldPathFromArgument","__PRIVATE_validateHasExplicitOrderByForLimitToLast","AppliableConstraint","QueryConstraint","QueryCompositeFilterConstraint","QueryFieldFilterConstraint","__PRIVATE_validateNewFieldFilter","__PRIVATE_validateDisjunctiveFilterElements","__PRIVATE_parseDocumentIdValue","QueryOrderByConstraint","orderBy","QueryLimitConstraint","AbstractUserDataWriter","__PRIVATE_applyFirestoreDataConverter","SnapshotMetadata","DocumentSnapshot","QueryDocumentSnapshot","QuerySnapshot","__PRIVATE_resultChangeType","__PRIVATE_ExpUserDataWriter","getDocs","setDoc","executeWrite","addDoc","WriteBatch","__PRIVATE_validateReference","writeBatch","__rest","_prodErrorMap","prodErrorMap","_DEFAULT_AUTH_ERROR_FACTORY","logClient","_logWarn","_logError","_fail","authOrCode","createErrorInternal","_createError","_errorWithCustomMessage","auth","errorMap","_serverAppCurrentUserOperationNotSupportedError","fullParams","_assert","assertion","debugFail","debugAssert","_getCurrentUrl","_isHttpOrHttps","_getCurrentScheme","_isOnline","_getUserLanguage","navigatorLanguage","Delay","shortDelay","longDelay","_emulatorUrl","FetchProvider","headersImpl","responseImpl","SERVER_ERROR_MAP","DEFAULT_API_TIMEOUT_MS","_addTidIfNecessary","_performApiRequest","customErrorMap","_performFetchWithErrorHandling","_getFinalTarget","fetchFn","networkTimeout","NetworkTimeout","_makeTaggedError","errorMessage","serverErrorCode","serverErrorMessage","authError","_performSignInRequest","serverResponse","_parseEnforcementState","enforcementStateStr","errorParams","isEnterprise","grecaptcha","RecaptchaConfig","providerStr","recaptchaEnforcementState","getRecaptchaConfig","deleteAccount","getAccountInfo","utcTimestampToDateString","utcTimestamp","getIdTokenResult","forceRefresh","userInternal","claims","_parseToken","firebase","signInProvider","secondsStringToMilliseconds","seconds","algorithm","_tokenExpiresIn","parsedToken","_logoutIfInvalidated","bypassAuthState","isUserInvalidated","ProactiveRefresh","wasError","UserMetadata","createdAt","lastLoginAt","_reloadWithoutSaving","idToken","coreAccount","newProviderData","extractProviderData","providerData","mergeProviderData","oldIsAnonymous","newIsAnonymous","isAnonymous","updates","providers","providerId","requestStsToken","refreshToken","tokenApiHost","apiKey","revokeToken","StsTokenManager","expiresIn","oldToken","accessToken","expiresInSec","appName","expirationTime","stsTokenManager","assertStringOrUndefined","UserImpl","userInfo","newUser","tokensRefreshed","_h","displayName","email","phoneNumber","photoURL","tenantId","_redirectEventId","emailVerified","plainObjectTokenManager","idTokenResponse","instanceCache","_getInstance","InMemoryPersistence","_listener","inMemoryPersistence","_persistenceKeyName","PersistenceUserManager","persistence","userKey","newPersistence","currentUser","persistenceHierarchy","availablePersistences","selectedPersistence","userToMigrate","migrationHierarchy","_getBrowserName","_isIEMobile","_isFirefox","_isBlackBerry","_isWebOS","_isSafari","_isChromeIOS","_isAndroid","_isIOS","_isIOSStandalone","_isIE10","_isMobileBrowser","_getClientVersion","clientPlatform","frameworks","reportedPlatform","reportedFrameworks","AuthMiddlewareQueue","onAbort","wrappedCallback","nextUser","onAbortStack","beforeStateCallback","_getPasswordPolicy","MINIMUM_MIN_PASSWORD_LENGTH","PasswordPolicyImpl","responseOptions","minPasswordLength","maxPasswordLength","passwordChar","containsLowercaseCharacter","containsUppercaseCharacter","containsNumericCharacter","containsNonAlphanumericCharacter","AuthImpl","heartbeatServiceProvider","appCheckServiceProvider","popupRedirectResolver","previouslyStoredUser","futureCurrentUser","needsTocheckMiddleware","redirectUserEventId","storedUserEventId","redirectResolver","userExtern","skipBeforeStateCallbacks","passwordPolicy","completed","unsubscribe","redirectManager","currentUid","isUnsubscribed","framework","heartbeatsHeader","appCheckToken","appCheckTokenResult","_castAuth","externalJSProvider","_setExternalJSProvider","_loadJS","_recaptchaEnterpriseScriptUrl","_gapiScriptUrl","_generateCallbackName","RECAPTCHA_ENTERPRISE_VERIFIER_TYPE","FAKE_TOKEN","RecaptchaEnterpriseVerifier","authExtern","retrieveSiteKey","retrieveRecaptchaToken","siteKey","injectRecaptchaFields","captchaResp","verifier","captchaResponse","newRequest","handleRecaptchaFlow","authInstance","actionName","actionMethod","requestWithRecaptcha","initializeAuth","_initializeAuthInstance","hierarchy","connectAuthEmulator","authInternal","disableWarnings","extractProtocol","extractHostAndPort","portStr","emitEmulatorWarning","protocolEnd","authority","hostAndPort","bracketedIPv6","parsePort","attachBanner","sty","AuthCredential","signInMethod","_auth","_idToken","linkEmailPassword","signInWithPassword","signInWithEmailLink$1","signInWithEmailLinkForLinking","EmailAuthCredential","_email","_password","_tenantId","oobCode","signInWithIdp","IDP_REQUEST_URI$1","OAuthCredential","cred","postBody","parseMode","parseDeepLink","doubleDeepLink","iOSDeepLink","ActionCodeURL","actionLink","EmailAuthProvider","emailLink","actionCodeUrl","FederatedAuthProvider","languageCode","customOAuthParameters","BaseOAuthProvider","FacebookAuthProvider","userCredential","tokenResponse","GoogleAuthProvider","oauthIdToken","oauthAccessToken","GithubAuthProvider","TwitterAuthProvider","secret","oauthTokenSecret","signUp","UserCredentialImpl","operationType","providerIdForResponse","MultiFactorError","_processCredentialSavingMfaContextIfNecessary","credential","_link$1","_reauthenticate","parsed","localId","_signInWithCredential","signInWithCredential","recachePasswordPolicy","createUserWithEmailAndPassword","signInWithEmailAndPassword","onIdTokenChanged","beforeAuthStateChanged","STORAGE_AVAILABLE_KEY","BrowserPersistenceClass","storageRetriever","_POLLING_INTERVAL_MS$1","IE10_LOCAL_STORAGE_SYNC_DELAY","BrowserLocalPersistence","poll","_oldValue","storedValue","browserLocalPersistence","BrowserSessionPersistence","browserSessionPersistence","_allSettled","Receiver","eventTarget","newInstance","messageEvent","_generateEventId","Sender","messageChannel","completionTimer","ackTimer","_window","_setWindowLocation","_isWorker","_getActiveServiceWorker","_getServiceWorkerController","_getWorkerGlobalScope","DB_OBJECTSTORE_NAME","DB_DATA_KEYPATH","DBPromise","getObjectStore","isReadWrite","_deleteDatabase","_openDatabase","_putObject","getObject","_deleteObject","_POLLING_INTERVAL_MS","_TRANSACTION_RETRY_COUNT","IndexedDBLocalPersistence","numAttempts","_origin","_data","write","getAllRequest","keysInResult","localKey","indexedDBLocalPersistence","_withDefaultResolver","resolverOverride","IdpCredential","_signIn","_reauth","_link","AbstractPopupRedirectOperation","urlResponse","sessionId","_POLL_WINDOW_CLOSE_TIMEOUT","PopupOperation","PENDING_REDIRECT_KEY","redirectOutcomeMap","RedirectAction","readyOutcome","_getAndClearPendingRedirectStatus","pendingRedirectKey","resolverPersistence","hasPendingRedirect","_overrideRedirectResult","_getRedirectResult","resolverExtern","EVENT_DUPLICATION_CACHE_DURATION_MS","AuthEventManager","authEventConsumer","consumer","isRedirectEvent","isNullRedirectEvent","eventIdMatches","eventUid","_getProjectConfig","IP_ADDRESS_REGEX","HTTP_REGEX","_validateOrigin","authorizedDomains","matchDomain","ceUrl","escapedDomainPattern","NETWORK_TIMEOUT","resetUnloadedGapiModules","beacon","loadGapi","loadGapiIframe","cbName","cachedGApiLoader","_loadGapi","PING_TIMEOUT","IFRAME_PATH","EMULATED_IFRAME_PATH","IFRAME_ATTRIBUTES","EID_FROM_APIHOST","getIframeUrl","eid","_openIframe","gapi","networkError","networkErrorTimer","clearTimerAndResolve","BASE_POPUP_OPTIONS","DEFAULT_WIDTH","DEFAULT_HEIGHT","TARGET_BLANK","FIREFOX_EMPTY_URL","AuthPopup","window","_open","optionsString","openAsNewWindowIOS","newWin","WIDGET_PATH","EMULATOR_WIDGET_PATH","FIREBASE_APP_CHECK_FRAGMENT_ID","_getRedirectUrl","authType","redirectUrl","additionalParams","scopes","paramsDict","appCheckTokenFragment","getHandlerBase","WEB_STORAGE_SUPPORT_KEY","BrowserPopupRedirectResolver","iframeEvent","browserPopupRedirectResolver","AuthInterop","getVersionForPlatform","registerAuth","authDomain","_instanceIdentifier","_instance","DEFAULT_ID_TOKEN_MAX_AGE","authIdTokenMaxAge","lastPostedIdToken","mintCookieFactory","idTokenResult","idTokenAge","getAuth","authTokenSyncPath","authTokenSyncUrl","mintCookie","authEmulatorHost","getScriptParentElement","initializeFirebase","tempDb","login","testEmail","testPassword","deepToRaw","removeUndefinedFields","getEnumEntries","enumObj","collectParameters","parameterSet","guidOrHexRegex","useFirebaseStore","filterRegistry","stackName","newStack","filterList","querySnapshot","resLimit","rawMapping","cleanedMapping","mappingLog","mappingId","resultsLog","resultsId","assemblies","assemblyList","docRef","specificQuery","genericQuery","specificSnapshot","genericSnapshot","setting","settingLog","updateMapping","projectStore","useProjectStore","materialStore","lastId","clearMapping","updateProjectGroups","mapMaterial","inGroup","currFilterList","newMapping","mappingColors","setMappingColorGroup","filteredList","getNestedPropertyValue","getMappedMaterial","materialNames","uniqueMaterialNames","objectsWithoutMaterials","createGeometryFromProduct","getAssemblyList","firebaseStore","truncateText","getTextAfterLastDot","resultItemToLCSChartData","resultItem","impactCategory","groupedData","groupedResult","groupedResultToLCSChartData","resultItemToChartData","groupedResultToChartData","resultItemToNestedChartData","nestedChartData","topLevelData","topLevelArray","nestedDataArray","nestedResult","nestedResultMap","emissionData","materialData","lifeCycleStage","geometryToChartData","chartParameter","LCSData","resCalc","ResultCalculator","geometryToNestedChartData","emissionToNumber","emission","includedPhases","phase","relevantStage","stageObj","getResultLogEmissions","resultLog","resItem","emissionList","extractEmissionsFromResultItem","sumEmissions","emissions","accumulatedEmission","currentEmission","addEmissions","mergeIntoResult","addQuantity","geos","save","calcResultList","emissionAmount","currentTotal","geoEmission","geoQuantity","paramItem","aggregatedEmission","impactCategoryKey","categoryEmission","stageKey","stageValue","stageGrouped","createNestedObject","nestedObject","currentLevel","existingLevel","reCalc","reverseStack","setResultsColorGroup","colorRange","neutralGroup","assignColorGroup","sizeFactor","normalisedEmissions","greenGroup","redGroup","foundObject","foundIndex","callStack","quantityKey","geometryObject","uri","foundObjects","_sfc_main$$","ChevronRightIcon","__vitePreload","DropdownMenuItem$1","isOpen","hasChildren","selectedItem","_component_ChevronRightIcon","_createCommentVNode","_component_DropdownMenuItem","_sfc_main$_","ChevronDownIcon","DropdownMenuItem","toggleDropdown","newItems","_component_ChevronDownIcon","_Transition","_sfc_main$Z","Dropdown","savedSettings","currentSetting","handleSelectedItem","_component_Dropdown","saveSettings","_sfc_main$Y","calculationSettings","impactCategoryList","updateImpactCategory","_sfc_main$X","groupedStages","letter","initializeGroupedStages","includedStage","_vModelCheckbox","_sfc_main$W","groupedBuildingCodes","buildingCodeName","buildingCodeDropdown","initializeGroupedBuildingCodes","_component_UpdateButton","_hoisted_8","childIndex","_hoisted_9","_sfc_main$V","firebaseSettings","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","updateFirebaseSettings","_hoisted_14","_hoisted_15","_sfc_main$U","speckleSettings","_sfc_main$T","_sfc_main$S","githubKey","_sfc_main$R","UserCircleIcon","FingerPrintIcon","CalculatorIcon","DialogPanel","SettingsSidebar","SettingsFirebase","SettingsSpeckle","SettingsMaterials","SettingsGithub","SettingsLifecycleStages","SettingsCalculationCategory","navStore","settingsModalOpen","currentSettingView","settingViews","viewComponents","SettingsGeneral","SettingsImpactCategory","SettingsBuildingCodes","currentViewComponents","_component_ProjectDialog","_component_DialogPanel","_component_SettingsSidebar","_sfc_main$Q","SettingsModal","latestCommit","latestCommitMessage","icon","appScreenshot","_component_SettingsModal","_component_router_link","appScreenshotUrl","_sfc_main$P","HomeModernIcon","FunnelIcon","ServerStackIcon","_resolveDynamicComponent","_sfc_main$O","_sfc_main$N","LinkIcon","CodeBracketIcon","VideoCameraIcon","_sfc_main$M","HeroComponent","FeaturesComponent","ContributeComponent","FooterComponent","_component_FooterComponent","_component_HeroComponent","_component_FeaturesComponent","_component_ContributeComponent","enumerableOnly","_objectSpread2","_defineProperty","_typeof","_extends","_objectWithoutPropertiesLoose","excluded","sourceKeys","_objectWithoutProperties","sourceSymbolKeys","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","_arrayLikeToArray","minLen","IE11OrLess","Edge","FireFox","Safari","IOS","ChromeForAndroid","captureMode","getParentOrHost","closest","includeCTX","R_SPACE","toggleClass","selfOnly","appliedTransforms","matrixFn","getWindowScrollingElement","scrollingElement","getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","containerRect","elMatrix","isScrolledPast","elSide","parentSide","getParentAutoScrollElement","elSideVal","parentSideVal","visible","getChild","childNum","includeDragEl","currentChild","Sortable","lastChild","getRelativeScrollOffset","offsetTop","winScroller","indexOfObject","includeSelf","gotSelf","elemCSS","isRectEqual","rect1","rect2","_throttleTimeout","cancelThrottle","scrollBy","Polymer","setRect","unsetRect","expando","AnimationStateManager","animationStates","animationCallbackId","fromRect","childMatrix","animating","animationTime","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","calculateRealTime","currentRect","translateX","translateY","repaint","PluginManager","sortable","eventNameGlobal","pluginName","initialized","modified","eventProperties","modifiedValue","_ref","targetEl","cloneEl","toEl","fromEl","oldDraggableIndex","newDraggableIndex","originalEvent","putSortable","extraEventProperties","onName","allEventProperties","_excluded","pluginEvent","dragEl","parentEl","ghostEl","nextEl","lastDownEl","cloneHidden","_hideGhostForTarget","_unhideGhostForTarget","_dispatchEvent","activeGroup","awaitingDragStarted","ignoreNextClick","sortables","tapEvt","touchEvt","lastDx","lastDy","tapDistanceLeft","tapDistanceTop","lastTarget","lastDirection","pastFirstInvertThresh","isCircumstantialInvert","targetMoveDistance","ghostRelativeParent","ghostRelativeParentInitialScroll","_silent","savedInputChecked","documentExists","PositionGhostAbsolutely","CSSFloatProperty","supportDraggable","supportCssPointerEvents","_detectDirection","elCSS","elWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","secondChildWidth","touchingSideChild2","_dragElInRowColumn","dragRect","targetRect","vertical","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","_detectNearestEmptySortable","insideHorizontally","insideVertically","_prepareGroup","toFn","pull","sameGroup","otherGroup","originalGroup","nearestEmptyInsertDetectEvent","nearest","_checkOutsideTargetEl","dataTransfer","preventOnFilter","originalTarget","_saveInputCheckedState","criteria","ownerDocument","dragStartFn","_disableDraggable","_nextTick","inserted","fallbackTolerance","fallbackOffset","ghostMatrix","relativeScrollOffset","cssMatrix","revert","activeSortable","isOwner","canSort","fromSortable","completedFired","dragOverEvent","_onMove","changed","insertion","elLastChild","_ghostIsLast","_ghostIsFirst","firstChild","targetBeforeFirstSwap","differentLevel","differentRowCol","side1","scrolledPastTop","scrollBefore","_getSwapDirection","sibling","dragIndex","moveVector","_unsilent","_cancelNextTick","_globalDragOver","_generateId","useAnimation","willInsertAfter","onMoveFn","retVal","spacer","swapThreshold","invertedSwapThreshold","invertSwap","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","_getInsertDirection","inputs","_len","autoScrolls","scrollEl","scrollRootEl","scrolling","lastAutoScrollX","lastAutoScrollY","touchEvt$1","pointerElemChangedInterval","AutoScrollPlugin","AutoScroll","_ref2","clearPointerElemChangedInterval","clearAutoScrolls","autoScroll","ogElemScroller","newElem","isFallback","sens","speed","scrollThisInstance","scrollCustomFn","layersOut","currentParent","canScrollX","canScrollY","scrollWidth","scrollHeight","scrollPosX","scrollPosY","vx","vy","scrollOffsetY","scrollOffsetX","drop","dispatchSortableEvent","hideGhostForTarget","unhideGhostForTarget","toSortable","Revert","_ref3","Remove","_ref4","parentSortable","lastSwapEl","SwapPlugin","Swap","onMove","cancel","prevSwapEl","swapNodes","multiDragElements","multiDragClones","lastMultiDragSelect","multiDragSortable","initialFolding","folding","dragStarted","dragEl$1","clonesFromRect","clonesHidden","MultiDragPlugin","MultiDrag","multiDragElement","dragged","insertMultiDragClones","cloneNowShown","_ref5","cloneNowHidden","_ref6","_ref7","_this2","removeMultiDragElements","_ref8","_ref9","insertMultiDragElements","_ref10","dragRectAbsolute","clonesHiddenBefore","_ref11","dragMatrix","_ref12","multiDragIndex","_this3","oldIndicies","newIndicies","clonesInserted","elementsInserted","__WEBPACK_EXTERNAL_MODULE__8bbf__","__WEBPACK_EXTERNAL_MODULE_a352__","installedModules","__webpack_require__","moduleId","nativeGetOwnPropertyNames","arrayMethodUsesToLength","USES_TO_LENGTH","Collection","$forEach","redefine","setGlobal","TO_STRING","nativeToString","NOT_GENERIC","INCORRECT_NAME","rf","notARegExp","correctIsRegExpLogic","nativeStartsWith","CORRECT_IS_REGEXP_LOGIC","MDN_POLYFILL_BUG","$filter","arrayMethodHasSpeciesSupport","HAS_SPECIES_SUPPORT","$entries","objectHas","wmget","wmhas","wmset","unsafe","noTargetGet","TO_ENTRIES","defineProperties","propertyKey","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","getCurrentScript","ieStackRegExp","ffStackRegExp","stackDetails","scriptLocation","pageSource","inlineScriptSourceRegExp","inlineScriptSource","scripts","IS_CONCAT_SPREADABLE","MAXIMUM_ALLOWED_INDEX_EXCEEDED","IS_CONCAT_SPREADABLE_SUPPORT","SPECIES_SUPPORT","isConcatSpreadable","spreadable","returnMethod","RE","MAXIMUM_ALLOWED_LENGTH_EXCEEDED","deleteCount","actualStart","insertCount","actualDeleteCount","nativeObjectCreate","getOwnPropertyNamesExternal","HIDDEN","$stringify","nativePropertyIsEnumerable","AllSymbols","ObjectPrototypeSymbols","StringToSymbolRegistry","SymbolToStringRegistry","QObject","USE_SETTER","setSymbolDescriptor","ObjectPrototypeDescriptor","$defineProperties","$getOwnPropertySymbols","$create","enumerable","IS_OBJECT_PROTOTYPE","FORCED_JSON_STRINGIFY","$replacer","INCORRECT_ITERATION","thrower","ACCESSORS","argument0","argument1","FunctionPrototypeToString","nameRE","PREFERRED_STRING","$findIndex","FIND_INDEX","SKIPS_HOLES","$indexOf","nativeIndexOf","NEGATIVE_ZERO","variable","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","sham","stringMethod","regexMethod","$map","__webpack_exports__","getConsole","symbolPrototype","native","currentScript","_arrayWithHoles","_iterableToArrayLimit","_arr","_s","_nonIterableRest","_slicedToArray","external_commonjs_sortablejs_commonjs2_sortablejs_amd_sortablejs_root_Sortable_","external_commonjs_sortablejs_commonjs2_sortablejs_amd_sortablejs_root_Sortable_default","insertNodeAt","fatherNode","refNode","hit","manageAndEmit","manage","eventHandlerNames","isReadOnly","isHtmlTag","isTransition","isHtmlAttribute","getComponentAttributes","$attrs","_ref3$componentData","componentData","createSortableOption","callBackBuilder","getValidSortableEntries","eventBuilder","draggable","_ref13","_ref14","_classCallCheck","_defineProperties","_createClass","protoProps","staticProps","getHtmlElementFromNode","addContext","componentStructure_ComponentStructure","ComponentStructure","_ref2$nodes","defaultNodes","footer","realList","_isRootComponent","domIndex","domChildren","firstDomListElement","indexFirstDomListElement","external_commonjs_vue_commonjs2_vue_root_Vue_","getSlot","slotValue","computeNodes","$slots","getKey","normalizedList","_map","_map2","getRootInformation","externalComponent","computeComponentStructure","_emit","evtName","evtData","_manage","originalElement","_manageAndEmit","delegateCallBack","draggingElement","draggableComponent","componentStructure","_this4","$el","sortableOptions","targetDomElement","itemKey","newOptionValue","_sortable","htmElement","_this5","onList","newList","_arguments","spliceList","related","destination","added","_this$context","removed","relatedContext","currentDomIndex","draggedInList","futureIndex","draggedContext","sendEvent","vuedraggable","nativeSlice","fin","_sfc_main$L","ChevronUpIcon","subGroupData","expand","computedPadding","subGroup","_component_subGroup","_component_ChevronUpIcon","_sfc_main$K","inGroups","totalArea","_sfc_main$J","PencilSquareIcon","_sfc_main$I","totalObjects","percentageWithMaterial","_normalizeStyle","_sfc_main$H","MapIcon","_component_MapIcon","kindOf","kindOfTest","typeOfTest","isBuffer","isArrayBufferView","isFile","isBlob","isFileList","isStream","isFormData","isURLSearchParams","isReadableStream","isRequest","isResponse","isHeaders","allOwnKeys","_global","isContextDefined","caseless","assignValue","stripBOM","inherits","superConstructor","toFlatObject","sourceObj","destObj","propFilter","endsWith","forEachEntry","pair","matchAll","regExp","isHTMLForm","toCamelCase","reduceDescriptors","reducedDescriptors","freezeMethods","toObjectSet","arrayOrString","toFiniteNumber","ALPHABET","generateString","isSpecCompliantForm","toJSONObject","reducedValue","isAsyncFn","_setImmediate","setImmediateSupported","postMessageSupported","asap","utils$2","AxiosError","customProps","axiosError","httpAdapter","isVisitable","removeBrackets","renderKey","dots","isFlatArray","predicates","toFormData","metaTokens","visitor","defaultVisitor","indexes","useBlob","convertValue","exposedHelpers","build","charMap","AxiosURLSearchParams","encoder","_encode","buildURL","serializeFn","serializedParams","hashmarkIndex","InterceptorManager","fulfilled","rejected","InterceptorManager$1","transitionalDefaults","URLSearchParams$1","FormData$1","Blob$1","platform$1","FormData","Blob","hasBrowserEnv","_navigator","hasStandardBrowserEnv","hasStandardBrowserWebWorkerEnv","platform","toURLEncodedForm","helpers","parsePropPath","arrayToObject","formDataToJSON","buildPath","isNumericKey","isLast","stringifySafely","contentType","hasJSONContentType","isObjectPayload","_FormData","transitional","forcedJSONParsing","JSONRequested","strictJSONParsing","defaults$3","ignoreDuplicateOf","parseHeaders","rawHeaders","$internals","normalizeHeader","normalizeValue","parseTokens","tokensRE","isValidHeaderName","matchHeaderValue","isHeaderNameFilter","formatHeader","buildAccessors","accessorName","arg1","arg3","AxiosHeaders","valueOrRewrite","rewrite","setHeader","_header","_rewrite","lHeader","setHeaders","deleted","deleteHeader","targets","asStrings","accessors","defineAccessor","mapped","headerValue","AxiosHeaders$1","transformData","isCancel","CanceledError","settle","validateStatus","parseProtocol","speedometer","samplesCount","timestamps","firstSampleTS","chunkLength","startedAt","bytesCount","lastArgs","progressEventReducer","isDownloadStream","bytesNotified","_speedometer","progressBytes","inRange","progressEventDecorator","asyncDecorator","isURLSameOrigin","isMSIE","cookies","expires","secure","cookie","isAbsoluteURL","combineURLs","baseURL","relativeURL","buildFullPath","requestedURL","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","configValue","resolveConfig","newConfig","withXSRFToken","xsrfHeaderName","xsrfCookieName","xsrfValue","isXHRAdapterSupported","xhrAdapter","_config","requestData","requestHeaders","onUploadProgress","onDownloadProgress","onCanceled","uploadThrottled","downloadThrottled","flushUpload","flushDownload","onloadend","responseHeaders","timeoutErrorMessage","composeSignals","signals","aborted","onabort","signal","composeSignals$1","streamChunk","readBytes","readStream","trackStream","onFinish","_onFinish","loadedBytes","isFetchSupported","isReadableStreamSupported","encodeText","supportsRequestStream","duplexAccessed","hasContentType","DEFAULT_CHUNK_SIZE","supportsResponseStream","resolvers","getBodyLength","resolveBodyLength","fetchAdapter","cancelToken","withCredentials","composedSignal","requestContentLength","_request","contentTypeHeader","isCredentialsSupported","isStreamResponse","responseContentLength","responseData","knownAdapters","renderReason","isResolvedHandle","adapter","adapters$1","adapters","nameOrAdapter","rejectedReasons","reasons","throwIfCancellationRequested","dispatchRequest","validators","deprecatedWarnings","validator","formatMessage","correctSpelling","assertOptions","schema","allowUnknown","Axios","instanceConfig","configOrUrl","paramsSerializer","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","responseInterceptorChain","generateHTTPMethod","isForm","Axios$1","CancelToken","resolvePromise","_resolve","abort","CancelToken$1","spread","isAxiosError","HttpStatusCode","HttpStatusCode$1","createInstance","defaultConfig","axios","axios$1","roundNumber","decimals","rounded","MAX_EPD_COUNT","GWP_REF_OBJECT_ID","EcoPortalService","epd","collectionId","extractILCDData","RevaluService","extractRevaluData","metaData","classification","gwpResult","totalA1A3","exchange","referenceProperty","getEPDService","getSpecificEPD","epdService","apiClient","isAssembly","getCollection","collectionEpds","collectionDetailsUrl","collectionData","EmissionCalculator","products","matEmission","emissionValue","currentAmount","_sfc_main$G","_sfc_main$F","emissionText","lastResult","_sfc_main$E","SubGroup","OverviewGroupCard","MinusCircleIcon","editName","activePage","renderMode","selectedGroup","selectedBool","fontColor","currGroupValue","currGroupTotal","MaterialGroupCard","ResultsGroupCard","currIconAction","OverviewIconAction","MaterialIconAction","ResultIconAction","_withKeys","_component_SubGroup","_component_MinusCircleIcon","recursiveValueCheck","comparisonFn","filterValue","recursiveFieldSearch","addFilter","filterFn","createComparisonFilter","outGroup","grp","addObjToGroup","createStandardFilters","fieldValue","pathName","uniqueField","FilterRegistry","useFetchDropdownItems","dropdownItems","dropdownName","projectFilters","genericFilter","projectMappings","projectResults","useHandleSelected","resultStore","_sfc_main$D","PlusCircleIcon","CakeIcon","Draggable","GroupCard","currSlideName","fetchDropdownItems","handleSelected","projectGroups","refTree","toggleSlideover","addGroup","toggleColorMode","toggleAssemblyModal","setStandardFilters","_component_PencilSquareIcon","_component_CakeIcon","_component_Draggable","_component_GroupCard","_sfc_main$C","GroupList","ChevronLeftIcon","sideBarShow","_component_ChevronLeftIcon","_sfc_main$B","DialogTitle","XMarkIcon","BookmarkIcon","editFilter","filterNames","parameterNames","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_component_DialogTitle","_component_BookmarkIcon","_component_XMarkIcon","_hoisted_23","_sfc_main$A","nameInput","_withModifiers","_sfc_main$z","_sfc_main$y","ModifyFilter","currentSlideover","SaveMapping","SaveResults","_sfc_main$x","amountSelected","groupArea","_sfc_main$w","selectedObjects","mappedMaterial","lim","p2b","n2b","b2n","n2p","map$1","isShort","hexParse","hexString","HUE_RE","hsl2rgbn","hsv2rgbn","hwb2rgbn","hueValue","calln","hwb2rgb","hueParse","rotate","hslString","names$1","unpacked","tkeys","nk","nameParse","RGB_RE","rgbParse","rgbString","rgb1","rgb2","modHSL","ratio","fromObject","functionParse","Color$1","isNullOrUndef","isNumberFinite","finiteOrDefault","valueOrDefault","toDimension","dimension","loopable","_elementsEqual","a0","ilen","klen","isValidKey","_merger","tval","sval","sources","merger","mergeIf","_mergerIf","keyResolvers","_splitKey","_getKeyResolver","resolveObjectKey","_capitalize","defined","setsEqual","_isClickEvent","TAU","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","_factorize","toRadians","toDegrees","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","distanceBetweenPoints","_normalizeAngle","_angleBetween","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","epsilon","_lookup","table","cmp","lo","_lookupByKey","_rlookupByKey","_filterBetween","arrayEvents","listenArrayEvents","unlistenArrayEvents","stub","_arrayUnique","requestAnimFrame","argsToUse","ticking","_toLeftRightCenter","align","_alignStartEnd","_textX","atEdge","elasticIn","elasticOut","isPatternOrGradient","getHoverColor","applyAnimationsDefaults","applyLayoutsDefaults","intlCache","getNumberFormat","locale","formatter","formatNumber","formatters","tickValue","ticks","notation","maxTick","calculateDelta","logDelta","numDecimal","remain","Ticks","applyScaleDefaults","overrides","getScope$1","Defaults","_descriptors","_appliers","targetScope","targetName","scopeObject","targetScopeObject","privateName","local","appliers","toFontString","_measureText","longest","textWidth","_alignPixel","chart","devicePixelRatio","halfWidth","clearCanvas","drawPoint","drawPointLegend","yOffset","cornerRadius","xOffsetW","yOffsetW","_isPointInArea","margin","clipArea","unclipArea","setRenderOpts","decorateText","metrics","yDecoration","drawBackdrop","oldColor","renderText","stroke","addRoundedRectPath","LINE_HEIGHT","FONT_STYLE","toLineHeight","numberOrZero","_readValueToProps","objProps","read","toTRBL","toTRBLCorners","toPadding","toFont","cacheable","_addGrace","minmax","grace","beginAtZero","change","keepZero","createContext","_createResolver","rootScopes","getTarget","finalRootScopes","_cached","_resolveWithPrefixes","getKeysFromAllScopes","_attachContext","subProxy","descriptorDefaults","_resolveWithContext","_scriptable","_indexable","_allKeys","readKey","needsSubResolver","_proxy","_subProxy","_resolveScriptable","_resolveArray","_stack","createSubResolver","isIndexable","resolveFallback","getScope","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_isDomSupported","_getParentNode","domNode","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","getStyle","getPositionedStyle","suffix","useOffsetPos","getCanvasPosition","touches","getRelativePosition","currentDevicePixelRatio","borderBox","paddings","borders","getContainerSize","maxHeight","containerStyle","containerBorder","containerPadding","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","retinaScale","forceRatio","forceStyle","deviceHeight","deviceWidth","supportsEventListenerOptions","passiveSupported","readUsedSize","getRightToLeftAdapter","rectX","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","restoreTextDirection","Animator","anims","numSteps","draw","charts","animator","interpolators","Animation","cfg","elapsed","Animations","animationOptions","animatedProps","newOptions","resolveTargetOptions","awaitAll","running","anim","scaleClip","allowedOverflow","defaultClip","xScale","yScale","toClip","getSortedDatasetIndices","filterVisible","metasets","applyStack","dsIndex","singleMode","datasetIndex","otherValue","convertObjectDataToArray","iScale","vScale","iAxisKey","vAxisKey","adata","isStacked","stacked","getStackKey","indexScale","valueScale","getUserBounds","minDefined","maxDefined","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","positive","updateStacks","iAxis","itemStacks","visualValues","getFirstScaleId","createDatasetContext","createDataContext","clearStacks","isDirectUpdateMode","cloneIfNotShared","createStack","canStack","DatasetController","dataset","chooseId","xid","yid","rid","indexAxis","iid","vid","scaleID","resetNewElements","stackChanged","oldStacked","scopeKeys","_stacked","sorted","isNotInOrderComparedToPrev","singleScale","xAxisKey","yAxisKey","parsedValue","_parsed","otherScale","otherMin","otherMax","_skip","drawActiveElementsOnTop","elementType","sharing","sharedOptions","firstOpts","previouslySharedOptions","includeOptions","numMeta","numData","newCount","getAllScaleValues","visibleMetas","computeMinSampleSize","updateMinAndPrev","computeFitCategoryTraits","ruler","stackCount","thickness","computeFlexCategoryTraits","percent","parseFloatBar","startValue","endValue","barStart","barEnd","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","borderProps","setBorderSkipped","parseEdge","startEnd","orig","setInflateAmount","inflateAmount","BarController","bars","horizontal","vpixels","ipixels","dataIndex","currentParsed","iScaleValue","skipNull","barThickness","baseValue","minBarLength","floating","startPixel","endPixel","halfGrid","maxBarThickness","stackIndex","rects","abstract","DateAdapterBase","members","binarySearch","metaset","_sorted","lookupMethod","evaluateInteractionItems","getDistanceMetricForAxis","useX","useY","getIntersectItems","useFinalPosition","getNearestRadialItems","evaluationFunc","startAngle","endAngle","getNearestCartesianItems","distanceMetric","minDistance","getNearestItems","getAxisItems","rangeMethod","intersectsItem","Interaction","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","setLayoutDims","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","buildLayoutBoxes","centerHorizontal","centerVertical","getCombinedMax","maxPadding","chartArea","updateMaxPadding","boxPadding","updateDims","widthChanged","heightChanged","handleMaxPadding","updatePos","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","same","setBoxDims","placeBoxes","userPadding","layoutItem","minPadding","padding","availableWidth","availableHeight","verticalBoxes","horizontalBoxes","visibleVerticalBoxCount","BasePlatform","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","isNullOrEmpty","initCanvas","renderHeight","renderWidth","displayWidth","displayHeight","eventListenerOptions","addListener","removeListener","fromNativeEvent","nodeListContains","nodeList","createAttachObserver","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","resize","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","releaseObserver","createProxyAndListen","DomPlatform","proxies","_detectPlatform","Element$1","autoSkip","tickOpts","determinedMaxTicks","determineMaxTicks","ticksLimit","majorIndices","getMajorIndices","numMajorIndices","newTicks","skipMajors","spacing","calculateSpacing","avgMajorSpacing","tickLength","maxScale","maxChart","evenMajorSpacing","getEvenSpacing","factors","majorStart","majorEnd","reverseAlign","offsetFromEdge","getTicksLimit","ticksLength","maxTicksLimit","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","garbageCollect","caches","gcLen","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","Element","_userMin","_userMax","_suggestedMin","_suggestedMax","metas","samplingEnabled","reversePixels","numTicks","minRotation","maxRotation","labelRotation","tickWidth","maxLabelDiagonal","labelSizes","maxLabelWidth","maxLabelHeight","minSize","titleOpts","gridOpts","display","isHorizontal","titleHeight","widest","highest","tickPadding","angleRadians","labelHeight","labelWidth","isRotated","labelsBelowTicks","widths","heights","widestLabelSize","highestLabelSize","jlen","tickFont","fontString","nestedLabel","valueAt","decimal","optionTicks","rot","border","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","optsAtIndex","optsAtIndexBorder","lineColor","borderDash","borderDashOffset","tickColor","tickBorderDash","tickBorderDashOffset","crossAlign","tickAndPadding","hTickAndPadding","lineCount","textOffset","textBaseline","halfCount","tickTextAlign","backdrop","labelPadding","backgroundColor","drawLine","lastLineWidth","renderTextOptions","title","gz","axisID","TypedRegistry","override","parentScope","isIChartComponent","registerDefaults","itemDefaults","routeDefaults","propertyParts","sourceName","sourceScope","Registry","typedRegistry","reg","itemReg","camelMethod","PluginService","allPlugins","createDescriptors","previousDescriptors","localIds","getOpts","pluginOpts","getIndexAxis","datasetDefaults","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","idMatchesAxis","axisFromPosition","determineAxis","scaleOptions","getAxisFromDataset","retrieveAxisFromDatasets","boundDs","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","addIfFound","Config","datasetType","mainScope","_scopeCache","keyLists","subPrefixes","getResolver","needContext","subResolver","resolverCache","hasFunction","isScriptable","scriptable","indexable","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","onAnimationsComplete","onAnimationProgress","getCanvas","instances","getChart","moveNumericKeys","intKey","determineLastEvent","lastEvent","inChartArea","getSizeForArea","getDatasetArea","Chart$1","invalidatePlugins","userConfig","initialCanvas","existingChart","maintainAspectRatio","_aspectRatio","newSize","newRatio","scalesOptions","axisOptions","scaleOpts","isRadial","scaleType","scaleClass","hasUpdated","datasets","newControllers","ControllerClass","datasetElementType","dataElementType","animsDisabled","_active","_lastEvent","existingEvents","newEvents","_hiddenIndices","changes","_dataChanges","datasetCount","makeSet","changeSet","noArea","useClip","_add","_remove","attached","activeElements","lastActive","pluginId","hoverOptions","eventFilter","Chart","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","rThetaToXY","pathArc","circular","innerR","spacingOffset","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","angleOffset","outerStart","outerEnd","innerStart","innerEnd","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","drawArc","fullCircles","circumference","drawBorder","borderWidth","borderJoinStyle","ArcElement","chartX","chartY","rAdjust","_circumference","nonZeroBetween","betweenAngles","withinRadius","halfRadius","fix","radiusOffset","inRange$1","PointElement","mouseX","mouseY","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","enableBorderRadius","maxR","enableBorder","boundingRects","skipX","skipY","hasRadius","addNormalRectPath","inflateRect","refRect","BarElement","borderColor","addRectPath","getBoxSize","labelOpts","boxHeight","boxWidth","itemsEqual","Legend","legendItems","labelFont","itemHeight","hitboxes","lineWidths","totalHeight","legendItem","_itemHeight","columnSizes","heightLimit","totalWidth","currentColWidth","currentColHeight","calculateItemSize","rtlHelper","hitbox","defaultColor","halfFontSize","drawLegendBox","drawOptions","centerX","centerY","yBoxTop","xBoxLeft","borderRadius","fillText","realX","fontLineHeight","calculateLegendItemHeight","titleFont","titlePadding","topPaddingPlusHalfFontSize","hitBox","lh","isListened","hoveredItem","sameItem","calculateItemWidth","calculateItemHeight","legendItemText","plugin_legend","legend","usePointStyle","pointStyle","useBorderRadius","Title","textSize","fontOpts","createTitle","plugin_title","titleBlock","positioners","xSet","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","getTooltipSize","tooltip","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","bodyLineHeight","widthPadding","determineYAlign","doesNotFitWithAlign","xAlign","caret","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","caretSize","caretPadding","topLeft","topRight","bottomLeft","bottomRight","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","defaultCallbacks","labelCount","tooltipItem","invokeCallbackWithFallback","Tooltip","beforeTitle","afterTitle","bodyItems","scoped","beforeFooter","afterFooter","labelColors","labelPointStyles","labelTextColors","positionAndSize","backgroundPoint","tooltipPoint","caretPosition","ptX","ptY","titleSpacing","labelColor","labelPointStyle","colorX","rtlColorX","yOffSet","colorY","outerX","innerX","bodySpacing","bodyAlign","displayColors","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","tooltipSize","animX","animY","opacity","hasTooltipContent","positionChanged","caretX","caretY","plugin_tooltip","INTERVALS","UNITS","sorter","isoWeekday","determineUnitForAutoTicks","minUnit","capacity","determineUnitForFormatting","determineMajorUnit","addTick","setMajorTicks","majorUnit","major","ticksFromTimestamps","TimeScale","_applyBounds","timeOpts","minor","stepSize","weekday","hasWeekday","formats","fmt","minorFormat","majorFormat","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","displayFormats","exampleLabel","prevSource","nextSource","prevTarget","TimeSeriesScale","CommonProps","A11yProps","Props","compatProps","toRawIfProxy","cloneProxy","setOptions","nextOptions","setLabels","currentData","nextLabels","setDatasets","nextDatasets","datasetIdKey","addedDatasets","nextDataset","currentDataset","cloneData","nextData","canvasRef","chartRef","renderChart","clonedData","proxiedData","destroyChart","param1","nextOptionsProxy","nextDataProxy","prevOptionsProxy","prevDataProxy","prevOptions","prevLabels","prevDatasets","createTypedChart","registerables","reforwardRef","Bar","aligned","R_INSIDE","R_LEFT","R_RIGHT","R_BOTTOM","R_TOP","region","clipped","r0","r1","compute$1","rasterize","th","tw","getScaleOrigin","getPositioner","drawRoundedRect","drawFrame","bgColor","textGeometry","drawTextLine","stroked","drawText","filled","Label","defaults$1","MIN_INTEGER","rotated","projected","dp","toAxis","HitBox","pr0","pr1","vs","collide","collider","compute","h0","dirty","configure","configs","callback$1","dispatchMoveEvents","enter","handleMoveEvents","handleClickEvents","actives","ChartJS","ChartDataLabels","_sfc_main$v","chartData","chartOptions","groupEmissions","_component_Bar","descending","bisector","compare1","compare2","zero","ascendingBisect","bisectRight","bisect","extent","valueof","InternMap","keyof","intern_get","intern_set","intern_delete","_intern","rollup","nest","rollups","regroup","e10","e5","tickSpec","inc","tickIncrement","tickStep","parseTypenames","typenames","types","typename","copy","xhtml","creatorInherit","creatorFixed","fullname","none","selection_select","subgroups","subgroup","subnode","Selection","empty","selectorAll","arrayAll","selection_selectAll","parents","childMatcher","childFind","childFirst","selection_selectChild","childrenFilter","selection_selectChildren","selection_filter","sparse","selection_enter","EnterNode","datum","constant$2","bindIndex","exit","groupLength","dataLength","bindKey","nodeByKeyValue","keyValues","keyValue","selection_data","arraylike","enterGroup","updateGroup","exitGroup","selection_exit","selection_join","onenter","onupdate","onexit","selection_merge","groups0","groups1","m0","m1","merges","group0","group1","selection_order","selection_sort","compare","compareNode","sortgroups","sortgroup","selection_call","selection_nodes","selection_node","selection_size","selection_empty","selection_each","attrRemove","attrRemoveNS","attrConstant","attrConstantNS","attrFunction","attrFunctionNS","selection_attr","defaultView","styleRemove","styleConstant","styleFunction","selection_style","propertyRemove","propertyConstant","propertyFunction","selection_property","classArray","ClassList","classedAdd","classedRemove","classedTrue","classedFalse","classedFunction","selection_classed","textRemove","textConstant","textFunction","selection_text","htmlRemove","htmlConstant","htmlFunction","selection_html","raise","selection_raise","selection_lower","selection_append","constantNull","selection_insert","selection_remove","selection_cloneShallow","selection_cloneDeep","selection_clone","selection_datum","contextListener","onRemove","onAdd","selection_on","dispatchConstant","dispatchFunction","selection_dispatch","selection_iterator","selection_selection","sourceEvent","svg","definition","darker","brighter","reI","reN","reP","reHex","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","color_formatHex","color_formatHex8","color_formatHsl","color_formatRgb","hslConvert","rgbn","Rgb","rgbConvert","clampi","clampa","rgb_formatHex","rgb_formatHex8","rgb_formatRgb","Hsl","m2","clamph","clampt","constant$1","linear","exponential","nogamma","interpolateRgb","rgbGamma","colorRgb","numberArray","isNumberArray","genericArray","interpolateNumber","reA","reB","one","interpolateString","am","interpolate$1","interpolateRound","decompose","skewX","svgNode","parseCss","parseSvg","interpolateTransform","pxComma","pxParen","degParen","translate","interpolateTransformCss","interpolateTransformSvg","pokeDelay","taskHead","taskTail","clockLast","clockNow","clockSkew","clock","setFrame","clearNow","Timer","sleep","timerFlush","wake","nap","poke","emptyOn","emptyTween","CREATED","SCHEDULED","STARTING","STARTED","RUNNING","ENDING","ENDED","schedule","schedules","tween","interrupt","selection_interrupt","tweenRemove","tween0","tween1","tweenFunction","transition_tween","tweenValue","string00","string1","interpolate0","string0","string10","transition_attr","attrInterpolate","attrInterpolateNS","attrTweenNS","attrTween","transition_attrTween","delayFunction","delayConstant","transition_delay","durationFunction","durationConstant","transition_duration","easeConstant","transition_ease","easeVarying","transition_easeVarying","transition_filter","transition_merge","onFunction","on0","on1","sit","transition_on","removeFunction","transition_remove","transition_select","transition_selectAll","inherit","transition_selection","styleNull","styleMaybeRemove","listener0","transition_style","styleInterpolate","styleTween","transition_styleTween","transition_text","textInterpolate","textTween","transition_textTween","transition_transition","id0","id1","transition_end","selection_prototype","cubicInOut","defaultTiming","easeCubicInOut","selection_transition","tau","tauEpsilon","strings","appendRound","x21","y21","x01","y01","l01_2","x20","y20","l21_2","l20_2","l21","l01","t01","t21","ccw","cw","formatDecimal","formatDecimalParts","coefficient","formatGroup","grouping","thousands","formatNumerals","numerals","formatSpecifier","specifier","FormatSpecifier","formatTrim","prefixExponent","formatPrefixAuto","formatRounded","formatTypes","identity$2","formatLocale","currencyPrefix","currencySuffix","minus","nan","newFormat","comma","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","formatPrefix","defaultLocale","precisionFixed","precisionPrefix","precisionRound","initRange","implicit","ordinal","unknown","band","ordinalRange","bandwidth","paddingInner","paddingOuter","rescale","constants","clamper","bimap","polymap","interpolateValue","untransform","piecewise","continuous","tickFormat","linearish","prestep","maxIter","asin","withPath","arcInnerRadius","arcOuterRadius","arcStartAngle","arcEndAngle","arcPadAngle","x10","y10","x32","y32","cornerTangents","x11","y11","x00","y00","cx0","cy0","cx1","cy1","dx0","dy0","dx1","dy1","padRadius","padAngle","a00","a10","da0","da1","ap","rp","rc0","rc1","pie","sortValues","arcs","none$1","series","stackValue","stackSeries","orderNone","offsetNone","oz","diverging","yp","Transform","aggregateCenter","graph","textElement","spanPercentCenter","graphValue","checkValuesInSpan","spanPercent","calculatePercent","isValueInSpan","spanStart","spanEnd","graphValues","filteredSum","isTrue","totalSum","parameterCenter","parameterValue","updateSelectedObjects","createTooltip","tooltipElement","d3.select","createMouseEventHandlers","tooltipDiv","mouseover","mousemove","d3.pointer","tooltipRect","mouseleave","_sfc_main$u","clearSVG","drawChart","stackedBarChart","barHeight","halfBarHeight","d3.sum","totalAbs","groupData","zeroPoint","groupDataFunc","containerElement","d3.scaleLinear","addTextWithTooltip","d3.format","cumulative","tooltipContent","_sfc_main$t","OverviewBar","MaterialBar","ResultsBar","StackedBarChart","currDetailbar","componentProps","updateComponentProps","_sfc_main$s","Switch","HomeIcon","HomeOutline","EyeIcon","EyeSlashIcon","showHiddenObjects","_component_EyeIcon","_component_Switch","_component_HomeOutline","_component_EyeSlashIcon","rotationLocked","handleProjectionButtonClick","handleSelectAllButton","guid","handleZoomExtentsButtonClick","handleToggleSectionBoxButtonClick","handleLockOrbitButtonClick","_sfc_main$q","SelectablePieChart","labelRadius","strokeLinejoin","maxTextLength","clickTimeout","d3.pie","d3.arc","arcNegative","arcLabel","renderCenter","isLargeArc","isSmallArc","newLabel","arcData","_sfc_main$p","DivergingStackedBar","resizeObserver","flatData","d3.rollups","d3.ascending","dataByName","d3.rollup","svgElement","totalsByName","groupNames","d3.stack","phaseData","d3.stackOffsetDiverging","xDomain","d3.extent","d3.scaleBand","allValues","actualValue","leftmostXByGroup","groupName","currentMinX","__props","graphParameters","updateGraphDropdown","selectedResult","handleResultListSelection","parsedResult","updateGraphProps","leftModule","ViewerControls","componentNames","graphProps","newGraphParameters","fadeOut","handleEscKey","handleResize","renderParent","Viewer","DefaultViewerParams","lightConfig","ViewerEvent","selectionInfo","hiddenIds","_sfc_main$m","Disclosure","DisclosureButton","DisclosurePanel","Menu","MenuButton","MenuItem","MenuItems","Bars3Icon","_component_Disclosure","_component_DisclosureButton","_component_Bars3Icon","_component_Menu","_component_MenuButton","_component_MenuItems","_component_MenuItem","_component_DisclosurePanel","getRevaluCollections","preloadDashboardData","_sfc_main$l","groupModalOpen","geoObj","_sfc_main$k","projStore","_sfc_main$j","MaterialList","dragOptions","roundedEmissions","roundedValue","cloneItem","_sfc_main$i","Popover","PopoverButton","PopoverPanel","updatedOptions","_component_Popover","_component_PopoverButton","_component_PopoverPanel","optionIdx","filterName","_sfc_main$h","PopoverGroup","DropdownMulti","searchQuery","selectedFilters","manualMode","getOptionsForParameter","paramName","optionsSet","filteredData","matchesSearch","matchesFilters","selectedOptions","isAssemblyMatch","itemType","sortedData","dataToSort","newMaterial","setSortOption","parameterName","updateFilterOptions","_component_PopoverGroup","sortingParam","_component_DropdownMulti","_sfc_main$g","MappingCard","MaterialTable","SearchBar","filteredMaterial","mappingModalOpen","productFilterParams","sortingParameters","emptyGroup","combinedMaterials","_component_MappingCard","_component_SearchBar","handleFilteredData","_sfc_main$f","saveModalOpen","_sfc_main$e","loadAssembly","styleInject","insertAt","install","componentPrefix","_checkboardCache","script","getCheckboard","renderCheckboard","checkboard","css_248z","script$1","rgbStr","containerWidth","createElementVNode","_component_Checkboard","bound01","isOnePointZero","isPercentage","clamp01","boundAlpha","convertToPercentage","pad2","rgbToRgb","rgbToHsl","hslToRgb","rgbToHsv","hsvToRgb","rgbToHex","allow3Char","rgbaToHex","allow4Char","convertDecimalToHex","convertHexToDecimal","parseIntFromHex","numberInputToObject","inputToRGB","stringInputToObject","isValidCSSUnit","CSS_INTEGER","CSS_NUMBER","CSS_UNIT","PERMISSIVE_MATCH3","PERMISSIVE_MATCH4","TinyColor","RsRGB","GsRGB","BsRGB","allowShortChar","formatSet","formattedString","hasAlpha","needsAlphaFormat","slices","modification","tinycolor","_colorChange","oldHue","colorMixin","keysToCheck","palette","containerHeight","pageX","pageY","bright","oldVal","presetColors","script$2","script$3","script$4","script$5","_component_Saturation","_component_Hue","_component_Alpha","_component_EdIn","_sfc_main$d","PaintBrushIcon","Sketch","showColorPicker","barStyle","toggleColorPicker","newColor","newHexColor","_resolveDirective","_component_PaintBrushIcon","_component_Sketch","_directive_click_outside","_sfc_main$c","assemblyViewerRef","localMaterials","normalizeHeight","halfContainerHeight","onDropAtStart","onDropAtEnd","updateMaterialThickness","appId","updateMaterialColor","deleteMaterial","newMaterials","_component_PlusCircleIcon","_component_MaterialBar","_sfc_main$b","AssemblyTable","AssemblyViewer","assemblyModalOpen","assemblyTableShow","currentAssemby","assemblyName","assemblyDescription","materialType","assemblyId","codes","assemblyFilterParams","filteredProducts","filteredAssemblies","productData","assemblyData","handleFilteredAssemblyData","closeModal","toggleAssemblyTable","updateMaterials","newAssembly","saveAssembly","tempGeos","handleLoadAssembly","_component_AssemblyViewer","_sfc_main$a","NavbarComponent","SpeckleViewer","Sidebar","Slideover","NewGroupModal","MaterialMappingModal","SaveFilterModal","AssemblyModal","resultsColors","_component_Slideover","_component_NewGroupModal","_component_MaterialMappingModal","_component_SaveFilterModal","_component_AssemblyModal","_component_NavbarComponent","_component_Sidebar","_Suspense","_component_SpeckleViewer","_sfc_main$9","selectedProjectId","selectedProjectName","extractNames","loadProject","versionFound","latestVersion","_sfc_main$8","VersionSelectionModal","baseUrl","versionModalOpen","projectsWithRandomNumbers","randomNumber","percentageDifference","differenceText","formatDate","dateString","mm","hh","openVersionModal","closeVersionModal","openSlideOver","getEmbeddedUrl","_sfc_main","Navbar","ProjectGrid","_component_Navbar","_component_ProjectGrid","_sfc_main$6","isHighlighted","onRowClicked","getRoundedEmissions","_sfc_main$5","GraphContainer","DataTable","resultLogs","benchmarkParameter","expanded","logs","aggregatedSQMEmission","emissionPercentage","maxEmission","displayResultList","toggleExpansion","_component_DataTable","_component_GraphContainer","_sfc_main$4","BenchmarkGrid","_component_BenchmarkGrid","_component_DivergingStackedBar","reportTitle","isA4Mode","editableText","selectedResultItem","phaseOptions","updateSelectedPhase","prepareAndPrint","_component_v_container","LandingView","LoginComponent","Dashboard","ProjectSelection","Benchmark","ReportPage","TestZone","beforeEachGuard","clickOutsideDirective","App","Sentry.init","Sentry.BrowserTracing","Sentry.vueRouterInstrumentation","Sentry.Replay","piniaPluginPersistedstate"],"sources":["../../node_modules/@vue/shared/dist/shared.esm-bundler.js","../../node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js","../../node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js","../../node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js","../../node_modules/vue/dist/vue.runtime.esm-bundler.js","../../node_modules/vue-demi/lib/index.mjs","../../node_modules/pinia/dist/pinia.mjs","../../node_modules/destr/dist/index.mjs","../../node_modules/deep-pick-omit/dist/index.mjs","../../node_modules/pinia-plugin-persistedstate/dist/index.js","../../node_modules/vue-router/dist/vue-router.mjs","../../node_modules/@sentry/utils/esm/is.js","../../node_modules/@sentry/utils/esm/string.js","../../node_modules/@sentry/utils/esm/aggregate-errors.js","../../node_modules/@sentry/utils/esm/worldwide.js","../../node_modules/@sentry/utils/esm/browser.js","../../node_modules/@sentry/utils/esm/debug-build.js","../../node_modules/@sentry/utils/esm/logger.js","../../node_modules/@sentry/utils/esm/dsn.js","../../node_modules/@sentry/utils/esm/error.js","../../node_modules/@sentry/utils/esm/object.js","../../node_modules/@sentry/utils/esm/stacktrace.js","../../node_modules/@sentry/utils/esm/instrument/_handlers.js","../../node_modules/@sentry/utils/esm/instrument/console.js","../../node_modules/@sentry/utils/esm/misc.js","../../node_modules/@sentry/utils/esm/instrument/dom.js","../../node_modules/@sentry/utils/esm/supports.js","../../node_modules/@sentry/utils/esm/instrument/fetch.js","../../node_modules/@sentry/utils/esm/instrument/globalError.js","../../node_modules/@sentry/utils/esm/instrument/globalUnhandledRejection.js","../../node_modules/@sentry/utils/esm/vendor/supportsHistory.js","../../node_modules/@sentry/utils/esm/instrument/history.js","../../node_modules/@sentry/utils/esm/instrument/xhr.js","../../node_modules/@sentry/utils/esm/env.js","../../node_modules/@sentry/utils/esm/node.js","../../node_modules/@sentry/utils/esm/isBrowser.js","../../node_modules/@sentry/utils/esm/memo.js","../../node_modules/@sentry/utils/esm/normalize.js","../../node_modules/@sentry/utils/esm/syncpromise.js","../../node_modules/@sentry/utils/esm/promisebuffer.js","../../node_modules/@sentry/utils/esm/url.js","../../node_modules/@sentry/utils/esm/severity.js","../../node_modules/@sentry/utils/esm/time.js","../../node_modules/@sentry/utils/esm/baggage.js","../../node_modules/@sentry/utils/esm/tracing.js","../../node_modules/@sentry/utils/esm/envelope.js","../../node_modules/@sentry/utils/esm/clientreport.js","../../node_modules/@sentry/utils/esm/ratelimit.js","../../node_modules/@sentry/utils/esm/buildPolyfills/_nullishCoalesce.js","../../node_modules/@sentry/utils/esm/buildPolyfills/_optionalChain.js","../../node_modules/@sentry/core/esm/debug-build.js","../../node_modules/@sentry/core/esm/constants.js","../../node_modules/@sentry/core/esm/eventProcessors.js","../../node_modules/@sentry/core/esm/session.js","../../node_modules/@sentry/core/esm/utils/spanUtils.js","../../node_modules/@sentry/core/esm/utils/prepareEvent.js","../../node_modules/@sentry/core/esm/exports.js","../../node_modules/@sentry/core/esm/utils/getRootSpan.js","../../node_modules/@sentry/core/esm/tracing/dynamicSamplingContext.js","../../node_modules/@sentry/core/esm/utils/applyScopeDataToEvent.js","../../node_modules/@sentry/core/esm/scope.js","../../node_modules/@sentry/core/esm/version.js","../../node_modules/@sentry/core/esm/hub.js","../../node_modules/@sentry/core/esm/tracing/utils.js","../../node_modules/@sentry/core/esm/tracing/errors.js","../../node_modules/@sentry/core/esm/tracing/spanstatus.js","../../node_modules/@sentry/core/esm/utils/hasTracingEnabled.js","../../node_modules/@sentry/core/esm/tracing/trace.js","../../node_modules/@sentry/core/esm/semanticAttributes.js","../../node_modules/@sentry/core/esm/tracing/span.js","../../node_modules/@sentry/core/esm/tracing/transaction.js","../../node_modules/@sentry/core/esm/tracing/idletransaction.js","../../node_modules/@sentry/core/esm/tracing/sampling.js","../../node_modules/@sentry/core/esm/tracing/hubextensions.js","../../node_modules/@sentry/core/esm/tracing/measurement.js","../../node_modules/@sentry/core/esm/envelope.js","../../node_modules/@sentry/core/esm/api.js","../../node_modules/@sentry/core/esm/integration.js","../../node_modules/@sentry/core/esm/metrics/utils.js","../../node_modules/@sentry/core/esm/metrics/envelope.js","../../node_modules/@sentry/core/esm/baseclient.js","../../node_modules/@sentry/core/esm/sdk.js","../../node_modules/@sentry/core/esm/transports/base.js","../../node_modules/@sentry/core/esm/span.js","../../node_modules/@sentry/core/esm/utils/isSentryRequestUrl.js","../../node_modules/@sentry/core/esm/utils/sdkMetadata.js","../../node_modules/@sentry/core/esm/integrations/inboundfilters.js","../../node_modules/@sentry/core/esm/integrations/functiontostring.js","../../node_modules/@sentry-internal/tracing/esm/common/debug-build.js","../../node_modules/@sentry-internal/tracing/esm/browser/types.js","../../node_modules/@sentry-internal/tracing/esm/browser/backgroundtab.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/bindReporter.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/generateUniqueID.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/getNavigationEntry.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/getActivationStart.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/initMetric.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/observe.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/onHidden.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/getCLS.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/getVisibilityWatcher.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/getFID.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/polyfills/interactionCountPolyfill.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/getINP.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/getLCP.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/onTTFB.js","../../node_modules/@sentry-internal/tracing/esm/browser/instrument.js","../../node_modules/@sentry-internal/tracing/esm/browser/metrics/utils.js","../../node_modules/@sentry-internal/tracing/esm/browser/metrics/index.js","../../node_modules/@sentry-internal/tracing/esm/common/fetch.js","../../node_modules/@sentry-internal/tracing/esm/browser/request.js","../../node_modules/@sentry-internal/tracing/esm/browser/router.js","../../node_modules/@sentry-internal/tracing/esm/browser/browsertracing.js","../../node_modules/@sentry/browser/esm/helpers.js","../../node_modules/@sentry/browser/esm/debug-build.js","../../node_modules/@sentry/browser/esm/eventbuilder.js","../../node_modules/@sentry/browser/esm/userfeedback.js","../../node_modules/@sentry/browser/esm/client.js","../../node_modules/@sentry/browser/esm/transports/utils.js","../../node_modules/@sentry/browser/esm/transports/fetch.js","../../node_modules/@sentry/browser/esm/transports/xhr.js","../../node_modules/@sentry/browser/esm/stack-parsers.js","../../node_modules/@sentry/browser/esm/integrations/breadcrumbs.js","../../node_modules/@sentry/browser/esm/integrations/dedupe.js","../../node_modules/@sentry/browser/esm/integrations/globalhandlers.js","../../node_modules/@sentry/browser/esm/integrations/httpcontext.js","../../node_modules/@sentry/browser/esm/integrations/linkederrors.js","../../node_modules/@sentry/browser/esm/integrations/trycatch.js","../../node_modules/@sentry/browser/esm/sdk.js","../../node_modules/@sentry/replay/esm/index.js","../../node_modules/@sentry/vue/esm/constants.js","../../node_modules/@sentry/vue/esm/vendor/components.js","../../node_modules/@sentry/vue/esm/errorhandler.js","../../node_modules/@sentry/vue/esm/debug-build.js","../../node_modules/@sentry/vue/esm/tracing.js","../../node_modules/@sentry/vue/esm/integration.js","../../node_modules/@sentry/vue/esm/sdk.js","../../node_modules/@sentry/vue/esm/router.js","../../src/utils/monitoring.ts","../../node_modules/@headlessui/vue/dist/hooks/use-controllable.js","../../node_modules/@headlessui/vue/dist/utils/micro-task.js","../../node_modules/@headlessui/vue/dist/utils/disposables.js","../../node_modules/@headlessui/vue/dist/hooks/use-id.js","../../node_modules/@headlessui/vue/dist/utils/dom.js","../../node_modules/@headlessui/vue/dist/utils/match.js","../../node_modules/@headlessui/vue/dist/utils/env.js","../../node_modules/@headlessui/vue/dist/utils/owner.js","../../node_modules/@headlessui/vue/dist/utils/focus-management.js","../../node_modules/@headlessui/vue/dist/utils/platform.js","../../node_modules/@headlessui/vue/dist/hooks/use-document-event.js","../../node_modules/@headlessui/vue/dist/hooks/use-window-event.js","../../node_modules/@headlessui/vue/dist/hooks/use-outside-click.js","../../node_modules/@headlessui/vue/dist/hooks/use-resolve-button-type.js","../../node_modules/@headlessui/vue/dist/hooks/use-tracked-pointer.js","../../node_modules/@headlessui/vue/dist/hooks/use-tree-walker.js","../../node_modules/@headlessui/vue/dist/utils/render.js","../../node_modules/@headlessui/vue/dist/internal/hidden.js","../../node_modules/@headlessui/vue/dist/internal/open-closed.js","../../node_modules/@headlessui/vue/dist/keyboard.js","../../node_modules/@headlessui/vue/dist/utils/document-ready.js","../../node_modules/@headlessui/vue/dist/utils/active-element-history.js","../../node_modules/@headlessui/vue/dist/utils/calculate-active-index.js","../../node_modules/@headlessui/vue/dist/utils/form.js","../../node_modules/@headlessui/vue/dist/hooks/use-event-listener.js","../../node_modules/@headlessui/vue/dist/hooks/use-tab-direction.js","../../node_modules/@headlessui/vue/dist/components/focus-trap/focus-trap.js","../../node_modules/@headlessui/vue/dist/hooks/use-store.js","../../node_modules/@headlessui/vue/dist/utils/store.js","../../node_modules/@headlessui/vue/dist/hooks/document-overflow/adjust-scrollbar-padding.js","../../node_modules/@headlessui/vue/dist/hooks/document-overflow/handle-ios-locking.js","../../node_modules/@headlessui/vue/dist/hooks/document-overflow/prevent-scroll.js","../../node_modules/@headlessui/vue/dist/hooks/document-overflow/overflow-store.js","../../node_modules/@headlessui/vue/dist/hooks/document-overflow/use-document-overflow.js","../../node_modules/@headlessui/vue/dist/hooks/use-inert.js","../../node_modules/@headlessui/vue/dist/hooks/use-root-containers.js","../../node_modules/@headlessui/vue/dist/internal/portal-force-root.js","../../node_modules/@headlessui/vue/dist/internal/stack-context.js","../../node_modules/@headlessui/vue/dist/components/description/description.js","../../node_modules/@headlessui/vue/dist/components/portal/portal.js","../../node_modules/@headlessui/vue/dist/components/dialog/dialog.js","../../node_modules/@headlessui/vue/dist/components/disclosure/disclosure.js","../../node_modules/@headlessui/vue/dist/utils/get-text-value.js","../../node_modules/@headlessui/vue/dist/hooks/use-text-value.js","../../node_modules/@headlessui/vue/dist/components/menu/menu.js","../../node_modules/@headlessui/vue/dist/components/popover/popover.js","../../node_modules/@headlessui/vue/dist/components/switch/switch.js","../../node_modules/@headlessui/vue/dist/utils/once.js","../../node_modules/@headlessui/vue/dist/components/transitions/utils/transition.js","../../node_modules/@headlessui/vue/dist/components/transitions/transition.js","../../src/stores/navigation.ts","../../src/components/Misc/PacmanLoader.vue","../../src/App.vue","../../node_modules/@heroicons/vue/20/solid/esm/CalculatorIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/ChevronDownIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/ChevronRightIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/ChevronUpIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/CodeBracketIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/EyeIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/FingerPrintIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/FunnelIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/HomeModernIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/HomeIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/LinkIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/MinusCircleIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/PaintBrushIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/PlusCircleIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/ServerStackIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/UserCircleIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/VideoCameraIcon.js","../../src/models/buildingCode.ts","../../src/models/settings.ts","../../src/stores/settings.ts","../../src/assets/icons/logo.svg","../../src/assets/images/AppPicture3D.png","../../src/components/Misc/Settings/SettingsSidebar.vue","../../src/components/Misc/Settings/UpdateButton.vue","../../src/components/Misc/Settings/SettingsGeneral.vue","../../src/models/result.ts","../../src/stores/result.ts","../../node_modules/chroma-js/src/utils/limit.js","../../node_modules/chroma-js/src/utils/clip_rgb.js","../../node_modules/chroma-js/src/utils/type.js","../../node_modules/chroma-js/src/utils/unpack.js","../../node_modules/chroma-js/src/utils/last.js","../../node_modules/chroma-js/src/utils/index.js","../../node_modules/chroma-js/src/io/input.js","../../node_modules/chroma-js/src/Color.js","../../node_modules/chroma-js/src/version.js","../../node_modules/chroma-js/src/chroma.js","../../node_modules/chroma-js/src/io/cmyk/cmyk2rgb.js","../../node_modules/chroma-js/src/io/cmyk/rgb2cmyk.js","../../node_modules/chroma-js/src/io/cmyk/index.js","../../node_modules/chroma-js/src/io/css/hsl2css.js","../../node_modules/chroma-js/src/io/hsl/rgb2hsl.js","../../node_modules/chroma-js/src/io/css/rgb2css.js","../../node_modules/chroma-js/src/io/hsl/hsl2rgb.js","../../node_modules/chroma-js/src/io/css/css2rgb.js","../../node_modules/chroma-js/src/io/css/index.js","../../node_modules/chroma-js/src/io/gl/index.js","../../node_modules/chroma-js/src/io/hcg/hcg2rgb.js","../../node_modules/chroma-js/src/io/hcg/rgb2hcg.js","../../node_modules/chroma-js/src/io/hcg/index.js","../../node_modules/chroma-js/src/io/hex/hex2rgb.js","../../node_modules/chroma-js/src/io/hex/rgb2hex.js","../../node_modules/chroma-js/src/io/hex/index.js","../../node_modules/chroma-js/src/io/hsi/hsi2rgb.js","../../node_modules/chroma-js/src/io/hsi/rgb2hsi.js","../../node_modules/chroma-js/src/io/hsi/index.js","../../node_modules/chroma-js/src/io/hsl/index.js","../../node_modules/chroma-js/src/io/hsv/hsv2rgb.js","../../node_modules/chroma-js/src/io/hsv/rgb2hsv.js","../../node_modules/chroma-js/src/io/hsv/index.js","../../node_modules/chroma-js/src/io/lab/lab-constants.js","../../node_modules/chroma-js/src/io/lab/lab2rgb.js","../../node_modules/chroma-js/src/io/lab/rgb2lab.js","../../node_modules/chroma-js/src/io/lab/index.js","../../node_modules/chroma-js/src/io/lch/lch2lab.js","../../node_modules/chroma-js/src/io/lch/lch2rgb.js","../../node_modules/chroma-js/src/io/lch/hcl2rgb.js","../../node_modules/chroma-js/src/io/lch/lab2lch.js","../../node_modules/chroma-js/src/io/lch/rgb2lch.js","../../node_modules/chroma-js/src/io/lch/index.js","../../node_modules/chroma-js/src/colors/w3cx11.js","../../node_modules/chroma-js/src/io/named/index.js","../../node_modules/chroma-js/src/io/num/num2rgb.js","../../node_modules/chroma-js/src/io/num/rgb2num.js","../../node_modules/chroma-js/src/io/num/index.js","../../node_modules/chroma-js/src/io/rgb/index.js","../../node_modules/chroma-js/src/io/temp/temperature2rgb.js","../../node_modules/chroma-js/src/io/temp/rgb2temperature.js","../../node_modules/chroma-js/src/io/temp/index.js","../../node_modules/chroma-js/src/io/oklab/oklab2rgb.js","../../node_modules/chroma-js/src/io/oklab/rgb2oklab.js","../../node_modules/chroma-js/src/io/oklab/index.js","../../node_modules/chroma-js/src/io/oklch/oklch2rgb.js","../../node_modules/chroma-js/src/io/oklch/rgb2oklch.js","../../node_modules/chroma-js/src/io/oklch/index.js","../../node_modules/chroma-js/src/ops/alpha.js","../../node_modules/chroma-js/src/ops/clipped.js","../../node_modules/chroma-js/src/ops/darken.js","../../node_modules/chroma-js/src/ops/get.js","../../node_modules/chroma-js/src/ops/luminance.js","../../node_modules/chroma-js/src/interpolator/index.js","../../node_modules/chroma-js/src/generator/mix.js","../../node_modules/chroma-js/src/ops/mix.js","../../node_modules/chroma-js/src/ops/premultiply.js","../../node_modules/chroma-js/src/ops/saturate.js","../../node_modules/chroma-js/src/ops/set.js","../../node_modules/chroma-js/src/ops/shade.js","../../node_modules/chroma-js/src/interpolator/rgb.js","../../node_modules/chroma-js/src/interpolator/lrgb.js","../../node_modules/chroma-js/src/interpolator/lab.js","../../node_modules/chroma-js/src/interpolator/_hsx.js","../../node_modules/chroma-js/src/interpolator/lch.js","../../node_modules/chroma-js/src/interpolator/num.js","../../node_modules/chroma-js/src/interpolator/hcg.js","../../node_modules/chroma-js/src/interpolator/hsi.js","../../node_modules/chroma-js/src/interpolator/hsl.js","../../node_modules/chroma-js/src/interpolator/hsv.js","../../node_modules/chroma-js/src/interpolator/oklab.js","../../node_modules/chroma-js/src/interpolator/oklch.js","../../node_modules/chroma-js/src/generator/average.js","../../node_modules/chroma-js/src/generator/scale.js","../../node_modules/chroma-js/src/generator/bezier.js","../../node_modules/chroma-js/src/generator/blend.js","../../node_modules/chroma-js/src/generator/cubehelix.js","../../node_modules/chroma-js/src/generator/random.js","../../node_modules/chroma-js/src/utils/analyze.js","../../node_modules/chroma-js/src/utils/contrast.js","../../node_modules/chroma-js/src/utils/delta-e.js","../../node_modules/chroma-js/src/utils/distance.js","../../node_modules/chroma-js/src/utils/valid.js","../../node_modules/chroma-js/src/utils/scales.js","../../node_modules/chroma-js/src/colors/colorbrewer.js","../../node_modules/chroma-js/index.js","../../src/utils/colorUtils.ts","../../src/models/material.ts","../../src/stores/material.ts","../../src/graphql/speckleQueries.ts","../../src/graphql/speckleVariables.ts","../../src/utils/speckleUtils.ts","../../node_modules/three/build/three.module.js","../../node_modules/three/examples/jsm/libs/stats.module.js","../../node_modules/core-js/internals/global-this.js","../../node_modules/core-js/internals/fails.js","../../node_modules/core-js/internals/descriptors.js","../../node_modules/core-js/internals/function-bind-native.js","../../node_modules/core-js/internals/function-call.js","../../node_modules/core-js/internals/object-property-is-enumerable.js","../../node_modules/core-js/internals/create-property-descriptor.js","../../node_modules/core-js/internals/function-uncurry-this.js","../../node_modules/core-js/internals/classof-raw.js","../../node_modules/core-js/internals/indexed-object.js","../../node_modules/core-js/internals/is-null-or-undefined.js","../../node_modules/core-js/internals/require-object-coercible.js","../../node_modules/core-js/internals/to-indexed-object.js","../../node_modules/core-js/internals/is-callable.js","../../node_modules/core-js/internals/is-object.js","../../node_modules/core-js/internals/get-built-in.js","../../node_modules/core-js/internals/object-is-prototype-of.js","../../node_modules/core-js/internals/environment-user-agent.js","../../node_modules/core-js/internals/environment-v8-version.js","../../node_modules/core-js/internals/symbol-constructor-detection.js","../../node_modules/core-js/internals/use-symbol-as-uid.js","../../node_modules/core-js/internals/is-symbol.js","../../node_modules/core-js/internals/try-to-string.js","../../node_modules/core-js/internals/a-callable.js","../../node_modules/core-js/internals/get-method.js","../../node_modules/core-js/internals/ordinary-to-primitive.js","../../node_modules/core-js/internals/is-pure.js","../../node_modules/core-js/internals/define-global-property.js","../../node_modules/core-js/internals/shared-store.js","../../node_modules/core-js/internals/shared.js","../../node_modules/core-js/internals/to-object.js","../../node_modules/core-js/internals/has-own-property.js","../../node_modules/core-js/internals/uid.js","../../node_modules/core-js/internals/well-known-symbol.js","../../node_modules/core-js/internals/to-primitive.js","../../node_modules/core-js/internals/to-property-key.js","../../node_modules/core-js/internals/document-create-element.js","../../node_modules/core-js/internals/ie8-dom-define.js","../../node_modules/core-js/internals/object-get-own-property-descriptor.js","../../node_modules/core-js/internals/v8-prototype-define-bug.js","../../node_modules/core-js/internals/an-object.js","../../node_modules/core-js/internals/object-define-property.js","../../node_modules/core-js/internals/create-non-enumerable-property.js","../../node_modules/core-js/internals/function-name.js","../../node_modules/core-js/internals/inspect-source.js","../../node_modules/core-js/internals/weak-map-basic-detection.js","../../node_modules/core-js/internals/shared-key.js","../../node_modules/core-js/internals/hidden-keys.js","../../node_modules/core-js/internals/internal-state.js","../../node_modules/core-js/internals/make-built-in.js","../../node_modules/core-js/internals/define-built-in.js","../../node_modules/core-js/internals/math-trunc.js","../../node_modules/core-js/internals/to-integer-or-infinity.js","../../node_modules/core-js/internals/to-absolute-index.js","../../node_modules/core-js/internals/to-length.js","../../node_modules/core-js/internals/length-of-array-like.js","../../node_modules/core-js/internals/array-includes.js","../../node_modules/core-js/internals/object-keys-internal.js","../../node_modules/core-js/internals/enum-bug-keys.js","../../node_modules/core-js/internals/object-get-own-property-names.js","../../node_modules/core-js/internals/object-get-own-property-symbols.js","../../node_modules/core-js/internals/own-keys.js","../../node_modules/core-js/internals/copy-constructor-properties.js","../../node_modules/core-js/internals/is-forced.js","../../node_modules/core-js/internals/export.js","../../node_modules/core-js/internals/to-string-tag-support.js","../../node_modules/core-js/internals/classof.js","../../node_modules/core-js/internals/to-string.js","../../node_modules/core-js/internals/define-built-in-accessor.js","../../node_modules/core-js/modules/es.symbol.description.js","../../node_modules/core-js/internals/is-array.js","../../node_modules/core-js/internals/does-not-exceed-safe-integer.js","../../node_modules/core-js/internals/function-uncurry-this-clause.js","../../node_modules/core-js/internals/function-bind-context.js","../../node_modules/core-js/internals/flatten-into-array.js","../../node_modules/core-js/internals/is-constructor.js","../../node_modules/core-js/internals/array-species-constructor.js","../../node_modules/core-js/internals/array-species-create.js","../../node_modules/core-js/modules/es.array.flat.js","../../node_modules/core-js/modules/es.array.flat-map.js","../../node_modules/core-js/internals/object-keys.js","../../node_modules/core-js/internals/object-define-properties.js","../../node_modules/core-js/internals/html.js","../../node_modules/core-js/internals/object-create.js","../../node_modules/core-js/internals/add-to-unscopables.js","../../node_modules/core-js/modules/es.array.includes.js","../../node_modules/core-js/internals/array-reduce.js","../../node_modules/core-js/internals/array-method-is-strict.js","../../node_modules/core-js/internals/environment.js","../../node_modules/core-js/internals/environment-is-node.js","../../node_modules/core-js/modules/es.array.reduce.js","../../node_modules/core-js/modules/es.array.reduce-right.js","../../node_modules/core-js/internals/delete-property-or-throw.js","../../node_modules/core-js/internals/array-slice.js","../../node_modules/core-js/internals/array-sort.js","../../node_modules/core-js/internals/environment-ff-version.js","../../node_modules/core-js/internals/environment-is-ie-or-edge.js","../../node_modules/core-js/internals/environment-webkit-version.js","../../node_modules/core-js/modules/es.array.sort.js","../../node_modules/core-js/modules/es.array.unscopables.flat.js","../../node_modules/core-js/modules/es.array.unscopables.flat-map.js","../../node_modules/core-js/modules/es.math.hypot.js","../../node_modules/core-js/internals/iterators.js","../../node_modules/core-js/internals/is-array-iterator-method.js","../../node_modules/core-js/internals/get-iterator-method.js","../../node_modules/core-js/internals/get-iterator.js","../../node_modules/core-js/internals/iterator-close.js","../../node_modules/core-js/internals/iterate.js","../../node_modules/core-js/internals/create-property.js","../../node_modules/core-js/modules/es.object.from-entries.js","../../node_modules/core-js/internals/function-uncurry-this-accessor.js","../../node_modules/core-js/internals/is-possible-prototype.js","../../node_modules/core-js/internals/a-possible-prototype.js","../../node_modules/core-js/internals/object-set-prototype-of.js","../../node_modules/core-js/internals/set-to-string-tag.js","../../node_modules/core-js/internals/set-species.js","../../node_modules/core-js/internals/an-instance.js","../../node_modules/core-js/internals/a-constructor.js","../../node_modules/core-js/internals/species-constructor.js","../../node_modules/core-js/internals/function-apply.js","../../node_modules/core-js/internals/validate-arguments-length.js","../../node_modules/core-js/internals/environment-is-ios.js","../../node_modules/core-js/internals/task.js","../../node_modules/core-js/internals/safe-get-built-in.js","../../node_modules/core-js/internals/queue.js","../../node_modules/core-js/internals/environment-is-ios-pebble.js","../../node_modules/core-js/internals/environment-is-webos-webkit.js","../../node_modules/core-js/internals/microtask.js","../../node_modules/core-js/internals/host-report-errors.js","../../node_modules/core-js/internals/perform.js","../../node_modules/core-js/internals/promise-native-constructor.js","../../node_modules/core-js/internals/promise-constructor-detection.js","../../node_modules/core-js/internals/new-promise-capability.js","../../node_modules/core-js/modules/es.promise.constructor.js","../../node_modules/core-js/internals/check-correctness-of-iteration.js","../../node_modules/core-js/internals/promise-statics-incorrect-iteration.js","../../node_modules/core-js/modules/es.promise.all.js","../../node_modules/core-js/modules/es.promise.catch.js","../../node_modules/core-js/modules/es.promise.race.js","../../node_modules/core-js/modules/es.promise.reject.js","../../node_modules/core-js/internals/promise-resolve.js","../../node_modules/core-js/modules/es.promise.resolve.js","../../node_modules/core-js/modules/es.promise.finally.js","../../node_modules/core-js/internals/inherit-if-required.js","../../node_modules/core-js/internals/is-regexp.js","../../node_modules/core-js/internals/regexp-flags.js","../../node_modules/core-js/internals/regexp-get-flags.js","../../node_modules/core-js/internals/regexp-sticky-helpers.js","../../node_modules/core-js/internals/proxy-accessor.js","../../node_modules/core-js/internals/regexp-unsupported-dot-all.js","../../node_modules/core-js/internals/regexp-unsupported-ncg.js","../../node_modules/core-js/modules/es.regexp.constructor.js","../../node_modules/core-js/internals/regexp-exec.js","../../node_modules/core-js/modules/es.regexp.exec.js","../../node_modules/core-js/modules/es.regexp.flags.js","../../node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","../../node_modules/core-js/internals/string-multibyte.js","../../node_modules/core-js/internals/advance-string-index.js","../../node_modules/core-js/internals/get-substitution.js","../../node_modules/core-js/internals/regexp-exec-abstract.js","../../node_modules/core-js/modules/es.string.replace.js","../../node_modules/core-js/internals/array-buffer-basic-detection.js","../../node_modules/core-js/internals/correct-prototype-getter.js","../../node_modules/core-js/internals/object-get-prototype-of.js","../../node_modules/core-js/internals/array-buffer-view-core.js","../../node_modules/core-js/internals/typed-array-constructors-require-wrappers.js","../../node_modules/core-js/internals/define-built-ins.js","../../node_modules/core-js/internals/to-index.js","../../node_modules/core-js/internals/math-sign.js","../../node_modules/core-js/internals/math-round-ties-to-even.js","../../node_modules/core-js/internals/math-float-round.js","../../node_modules/core-js/internals/math-fround.js","../../node_modules/core-js/internals/ieee754.js","../../node_modules/core-js/internals/array-fill.js","../../node_modules/core-js/internals/array-buffer.js","../../node_modules/core-js/internals/is-integral-number.js","../../node_modules/core-js/internals/to-positive-integer.js","../../node_modules/core-js/internals/to-offset.js","../../node_modules/core-js/internals/to-uint8-clamped.js","../../node_modules/core-js/internals/is-big-int-array.js","../../node_modules/core-js/internals/to-big-int.js","../../node_modules/core-js/internals/typed-array-from.js","../../node_modules/core-js/internals/array-iteration.js","../../node_modules/core-js/internals/array-from-constructor-and-list.js","../../node_modules/core-js/internals/typed-array-constructor.js","../../node_modules/core-js/modules/es.typed-array.float32-array.js","../../node_modules/core-js/modules/es.typed-array.float64-array.js","../../node_modules/core-js/modules/es.typed-array.int8-array.js","../../node_modules/core-js/modules/es.typed-array.int16-array.js","../../node_modules/core-js/modules/es.typed-array.int32-array.js","../../node_modules/core-js/modules/es.typed-array.uint8-array.js","../../node_modules/core-js/modules/es.typed-array.uint8-clamped-array.js","../../node_modules/core-js/modules/es.typed-array.uint16-array.js","../../node_modules/core-js/modules/es.typed-array.uint32-array.js","../../node_modules/core-js/modules/es.typed-array.from.js","../../node_modules/core-js/modules/es.typed-array.of.js","../../node_modules/core-js/modules/es.typed-array.set.js","../../node_modules/core-js/modules/es.typed-array.sort.js","../../node_modules/core-js/internals/install-error-cause.js","../../node_modules/core-js/internals/error-stack-clear.js","../../node_modules/core-js/internals/error-stack-installable.js","../../node_modules/core-js/internals/error-stack-install.js","../../node_modules/core-js/internals/normalize-string-argument.js","../../node_modules/core-js/modules/es.aggregate-error.constructor.js","../../node_modules/core-js/modules/esnext.array.last-index.js","../../node_modules/core-js/modules/esnext.array.last-item.js","../../node_modules/core-js/internals/object-get-own-property-names-external.js","../../node_modules/core-js/internals/array-buffer-non-extensible.js","../../node_modules/core-js/internals/object-is-extensible.js","../../node_modules/core-js/internals/freezing.js","../../node_modules/core-js/internals/internal-metadata.js","../../node_modules/core-js/internals/collection.js","../../node_modules/core-js/internals/iterators-core.js","../../node_modules/core-js/internals/iterator-create-constructor.js","../../node_modules/core-js/internals/iterator-define.js","../../node_modules/core-js/internals/create-iter-result-object.js","../../node_modules/core-js/internals/collection-strong.js","../../node_modules/core-js/modules/es.map.constructor.js","../../node_modules/core-js/internals/collection-weak.js","../../node_modules/core-js/modules/es.weak-map.constructor.js","../../node_modules/core-js/internals/composite-key.js","../../node_modules/core-js/modules/esnext.composite-key.js","../../node_modules/core-js/modules/esnext.composite-symbol.js","../../node_modules/core-js/modules/es.global-this.js","../../node_modules/core-js/internals/map-helpers.js","../../node_modules/core-js/internals/a-map.js","../../node_modules/core-js/modules/esnext.map.delete-all.js","../../node_modules/core-js/internals/iterate-simple.js","../../node_modules/core-js/internals/map-iterate.js","../../node_modules/core-js/modules/esnext.map.every.js","../../node_modules/core-js/modules/esnext.map.filter.js","../../node_modules/core-js/modules/esnext.map.find.js","../../node_modules/core-js/modules/esnext.map.find-key.js","../../node_modules/core-js/internals/collection-from.js","../../node_modules/core-js/modules/esnext.map.from.js","../../node_modules/core-js/modules/es.map.group-by.js","../../node_modules/core-js/internals/same-value-zero.js","../../node_modules/core-js/modules/esnext.map.includes.js","../../node_modules/core-js/modules/esnext.map.key-by.js","../../node_modules/core-js/modules/esnext.map.key-of.js","../../node_modules/core-js/modules/esnext.map.map-keys.js","../../node_modules/core-js/modules/esnext.map.map-values.js","../../node_modules/core-js/modules/esnext.map.merge.js","../../node_modules/core-js/internals/collection-of.js","../../node_modules/core-js/modules/esnext.map.of.js","../../node_modules/core-js/modules/esnext.map.reduce.js","../../node_modules/core-js/modules/esnext.map.some.js","../../node_modules/core-js/modules/esnext.map.update.js","../../node_modules/core-js/modules/esnext.math.clamp.js","../../node_modules/core-js/modules/esnext.math.deg-per-rad.js","../../node_modules/core-js/modules/esnext.math.degrees.js","../../node_modules/core-js/internals/math-scale.js","../../node_modules/core-js/modules/esnext.math.fscale.js","../../node_modules/core-js/modules/esnext.math.iaddh.js","../../node_modules/core-js/modules/esnext.math.imulh.js","../../node_modules/core-js/modules/esnext.math.isubh.js","../../node_modules/core-js/modules/esnext.math.rad-per-deg.js","../../node_modules/core-js/modules/esnext.math.radians.js","../../node_modules/core-js/modules/esnext.math.scale.js","../../node_modules/core-js/internals/number-is-finite.js","../../node_modules/core-js/modules/esnext.math.seeded-prng.js","../../node_modules/core-js/modules/esnext.math.signbit.js","../../node_modules/core-js/modules/esnext.math.umulh.js","../../node_modules/core-js/modules/esnext.number.from-string.js","../../node_modules/core-js/modules/esnext.observable.constructor.js","../../node_modules/core-js/modules/esnext.observable.from.js","../../node_modules/core-js/modules/esnext.observable.of.js","../../node_modules/core-js/modules/es.promise.all-settled.js","../../node_modules/core-js/modules/es.promise.any.js","../../node_modules/core-js/modules/es.promise.try.js","../../node_modules/core-js/internals/reflect-metadata.js","../../node_modules/core-js/modules/esnext.reflect.define-metadata.js","../../node_modules/core-js/modules/esnext.reflect.delete-metadata.js","../../node_modules/core-js/modules/esnext.reflect.get-metadata.js","../../node_modules/core-js/internals/array-unique-by.js","../../node_modules/core-js/modules/esnext.reflect.get-metadata-keys.js","../../node_modules/core-js/modules/esnext.reflect.get-own-metadata.js","../../node_modules/core-js/modules/esnext.reflect.get-own-metadata-keys.js","../../node_modules/core-js/modules/esnext.reflect.has-metadata.js","../../node_modules/core-js/modules/esnext.reflect.has-own-metadata.js","../../node_modules/core-js/modules/esnext.reflect.metadata.js","../../node_modules/core-js/internals/set-helpers.js","../../node_modules/core-js/internals/a-set.js","../../node_modules/core-js/modules/esnext.set.add-all.js","../../node_modules/core-js/modules/esnext.set.delete-all.js","../../node_modules/core-js/internals/is-iterable.js","../../node_modules/core-js/internals/to-set-like.js","../../node_modules/core-js/internals/set-iterate.js","../../node_modules/core-js/internals/set-clone.js","../../node_modules/core-js/internals/set-size.js","../../node_modules/core-js/internals/get-iterator-direct.js","../../node_modules/core-js/internals/get-set-record.js","../../node_modules/core-js/internals/set-difference.js","../../node_modules/core-js/modules/esnext.set.difference.js","../../node_modules/core-js/modules/esnext.set.every.js","../../node_modules/core-js/modules/esnext.set.filter.js","../../node_modules/core-js/modules/esnext.set.find.js","../../node_modules/core-js/modules/esnext.set.from.js","../../node_modules/core-js/internals/set-intersection.js","../../node_modules/core-js/modules/esnext.set.intersection.js","../../node_modules/core-js/internals/set-is-disjoint-from.js","../../node_modules/core-js/modules/esnext.set.is-disjoint-from.js","../../node_modules/core-js/internals/set-is-subset-of.js","../../node_modules/core-js/modules/esnext.set.is-subset-of.js","../../node_modules/core-js/internals/set-is-superset-of.js","../../node_modules/core-js/modules/esnext.set.is-superset-of.js","../../node_modules/core-js/modules/esnext.set.join.js","../../node_modules/core-js/modules/esnext.set.map.js","../../node_modules/core-js/modules/esnext.set.of.js","../../node_modules/core-js/modules/esnext.set.reduce.js","../../node_modules/core-js/modules/esnext.set.some.js","../../node_modules/core-js/internals/set-symmetric-difference.js","../../node_modules/core-js/modules/esnext.set.symmetric-difference.js","../../node_modules/core-js/internals/set-union.js","../../node_modules/core-js/modules/esnext.set.union.js","../../node_modules/core-js/modules/esnext.string.at.js","../../node_modules/core-js/modules/esnext.string.code-points.js","../../node_modules/core-js/modules/es.string.match-all.js","../../node_modules/core-js/modules/es.string.replace-all.js","../../node_modules/core-js/internals/path.js","../../node_modules/core-js/internals/well-known-symbol-wrapped.js","../../node_modules/core-js/internals/well-known-symbol-define.js","../../node_modules/core-js/modules/esnext.symbol.dispose.js","../../node_modules/core-js/modules/esnext.symbol.observable.js","../../node_modules/core-js/modules/esnext.symbol.pattern-match.js","../../node_modules/core-js/internals/weak-map-helpers.js","../../node_modules/core-js/internals/a-weak-map.js","../../node_modules/core-js/modules/esnext.weak-map.delete-all.js","../../node_modules/core-js/modules/esnext.weak-map.from.js","../../node_modules/core-js/modules/esnext.weak-map.of.js","../../node_modules/core-js/internals/weak-set-helpers.js","../../node_modules/core-js/internals/a-weak-set.js","../../node_modules/core-js/modules/esnext.weak-set.add-all.js","../../node_modules/core-js/modules/esnext.weak-set.delete-all.js","../../node_modules/core-js/modules/esnext.weak-set.from.js","../../node_modules/core-js/modules/esnext.weak-set.of.js","../../node_modules/core-js/internals/dom-iterables.js","../../node_modules/core-js/internals/dom-token-list-prototype.js","../../node_modules/core-js/modules/es.array.iterator.js","../../node_modules/core-js/modules/web.dom-collections.iterator.js","../../node_modules/core-js/modules/web.clear-immediate.js","../../node_modules/core-js/internals/schedulers-fix.js","../../node_modules/core-js/modules/web.set-immediate.js","../../node_modules/core-js/modules/web.queue-microtask.js","../../node_modules/core-js/modules/es.string.iterator.js","../../node_modules/core-js/internals/url-constructor-detection.js","../../node_modules/core-js/internals/object-assign.js","../../node_modules/core-js/internals/call-with-safe-iteration-closing.js","../../node_modules/core-js/internals/array-from.js","../../node_modules/core-js/internals/string-punycode-to-ascii.js","../../node_modules/core-js/modules/es.string.from-code-point.js","../../node_modules/core-js/modules/web.url-search-params.constructor.js","../../node_modules/core-js/modules/web.url.constructor.js","../../node_modules/core-js/modules/web.url.to-json.js","../../node_modules/lodash-es/_freeGlobal.js","../../node_modules/lodash-es/_root.js","../../node_modules/lodash-es/_Symbol.js","../../node_modules/lodash-es/_getRawTag.js","../../node_modules/lodash-es/_objectToString.js","../../node_modules/lodash-es/_baseGetTag.js","../../node_modules/lodash-es/isObjectLike.js","../../node_modules/lodash-es/isSymbol.js","../../node_modules/lodash-es/isArray.js","../../node_modules/lodash-es/_trimmedEndIndex.js","../../node_modules/lodash-es/_baseTrim.js","../../node_modules/lodash-es/isObject.js","../../node_modules/lodash-es/toNumber.js","../../node_modules/lodash-es/toFinite.js","../../node_modules/lodash-es/toInteger.js","../../node_modules/lodash-es/isFunction.js","../../node_modules/lodash-es/_isIndex.js","../../node_modules/lodash-es/eq.js","../../node_modules/lodash-es/isLength.js","../../node_modules/lodash-es/isArrayLike.js","../../node_modules/lodash-es/_isIterateeCall.js","../../node_modules/lodash-es/_baseSlice.js","../../node_modules/lodash-es/chunk.js","../../node_modules/lodash-es/isString.js","../../node_modules/@speckle/objectloader/dist/objectloader.esm.js","../../node_modules/three/src/math/MathUtils.js","../../node_modules/js-logger/src/logger.js","../../node_modules/camera-controls/dist/camera-controls.module.js","../../node_modules/hold-event/dist/hold-event.module.js","../../node_modules/three-mesh-bvh/src/core/Constants.js","../../node_modules/three-mesh-bvh/src/core/MeshBVHNode.js","../../node_modules/three-mesh-bvh/src/utils/ArrayBoxUtilities.js","../../node_modules/three-mesh-bvh/src/core/buildFunctions.js","../../node_modules/three-mesh-bvh/src/math/SeparatingAxisBounds.js","../../node_modules/three-mesh-bvh/src/math/MathUtilities.js","../../node_modules/three-mesh-bvh/src/math/ExtendedTriangle.js","../../node_modules/three-mesh-bvh/src/math/OrientedBox.js","../../node_modules/three-mesh-bvh/src/utils/ThreeRayIntersectUtilities.js","../../node_modules/three-mesh-bvh/src/utils/GeometryRayIntersectUtilities.js","../../node_modules/three-mesh-bvh/src/utils/TriangleUtilities.js","../../node_modules/three-mesh-bvh/src/utils/PrimitivePool.js","../../node_modules/three-mesh-bvh/src/core/nodeBufferFunctions.js","../../node_modules/three-mesh-bvh/src/core/castFunctions.js","../../node_modules/three-mesh-bvh/src/core/MeshBVH.js","../../node_modules/three-mesh-bvh/src/objects/MeshBVHVisualizer.js","../../node_modules/three/examples/jsm/lines/LineMaterial.js","../../node_modules/colornames/colors.js","../../node_modules/colornames/index.js","../../node_modules/lodash.words/index.js","../../node_modules/lodash.trimstart/index.js","../../node_modules/lodash.padend/index.js","../../node_modules/rgb-hex/index.js","../../node_modules/hex-rgb/index.js","../../node_modules/string-to-color/index.js","../../node_modules/three/examples/jsm/libs/fflate.module.js","../../node_modules/three/examples/jsm/loaders/EXRLoader.js","../../node_modules/three/examples/jsm/loaders/RGBELoader.js","../../node_modules/three/examples/jsm/loaders/FontLoader.js","../../node_modules/troika-worker-utils/dist/troika-worker-utils.esm.js","../../node_modules/webgl-sdf-generator/dist/webgl-sdf-generator.mjs","../../node_modules/bidi-js/dist/bidi.mjs","../../node_modules/troika-three-utils/dist/troika-three-utils.esm.js","../../node_modules/troika-three-text/dist/troika-three-text.esm.js","../../node_modules/three/examples/jsm/lines/LineSegmentsGeometry.js","../../node_modules/three/examples/jsm/lines/LineSegments2.js","../../node_modules/three/examples/jsm/shaders/CopyShader.js","../../node_modules/three/examples/jsm/postprocessing/Pass.js","../../node_modules/three/examples/jsm/postprocessing/ShaderPass.js","../../node_modules/three/examples/jsm/postprocessing/MaskPass.js","../../node_modules/three/examples/jsm/postprocessing/EffectComposer.js","../../node_modules/three/examples/jsm/shaders/SAOShader.js","../../node_modules/three/examples/jsm/shaders/DepthLimitedBlurShader.js","../../node_modules/three/examples/jsm/math/SimplexNoise.js","../../node_modules/three/examples/jsm/controls/TransformControls.js","../../node_modules/mergesort/index.js","../../node_modules/find-insert-index/index.js","../../node_modules/tree-model/index.js","../../node_modules/underscore/modules/_setup.js","../../node_modules/underscore/modules/restArguments.js","../../node_modules/underscore/modules/isObject.js","../../node_modules/underscore/modules/isNull.js","../../node_modules/underscore/modules/isUndefined.js","../../node_modules/underscore/modules/isBoolean.js","../../node_modules/underscore/modules/isElement.js","../../node_modules/underscore/modules/_tagTester.js","../../node_modules/underscore/modules/isString.js","../../node_modules/underscore/modules/isNumber.js","../../node_modules/underscore/modules/isDate.js","../../node_modules/underscore/modules/isRegExp.js","../../node_modules/underscore/modules/isError.js","../../node_modules/underscore/modules/isSymbol.js","../../node_modules/underscore/modules/isArrayBuffer.js","../../node_modules/underscore/modules/isFunction.js","../../node_modules/underscore/modules/_hasObjectTag.js","../../node_modules/underscore/modules/_stringTagBug.js","../../node_modules/underscore/modules/isDataView.js","../../node_modules/underscore/modules/isArray.js","../../node_modules/underscore/modules/_has.js","../../node_modules/underscore/modules/isArguments.js","../../node_modules/underscore/modules/isFinite.js","../../node_modules/underscore/modules/isNaN.js","../../node_modules/underscore/modules/constant.js","../../node_modules/underscore/modules/_createSizePropertyCheck.js","../../node_modules/underscore/modules/_shallowProperty.js","../../node_modules/underscore/modules/_getByteLength.js","../../node_modules/underscore/modules/_isBufferLike.js","../../node_modules/underscore/modules/isTypedArray.js","../../node_modules/underscore/modules/_getLength.js","../../node_modules/underscore/modules/_collectNonEnumProps.js","../../node_modules/underscore/modules/keys.js","../../node_modules/underscore/modules/isEmpty.js","../../node_modules/underscore/modules/isMatch.js","../../node_modules/underscore/modules/underscore.js","../../node_modules/underscore/modules/_toBufferView.js","../../node_modules/underscore/modules/isEqual.js","../../node_modules/underscore/modules/allKeys.js","../../node_modules/underscore/modules/_methodFingerprint.js","../../node_modules/underscore/modules/isMap.js","../../node_modules/underscore/modules/isWeakMap.js","../../node_modules/underscore/modules/isSet.js","../../node_modules/underscore/modules/isWeakSet.js","../../node_modules/underscore/modules/values.js","../../node_modules/underscore/modules/pairs.js","../../node_modules/underscore/modules/invert.js","../../node_modules/underscore/modules/functions.js","../../node_modules/underscore/modules/_createAssigner.js","../../node_modules/underscore/modules/extend.js","../../node_modules/underscore/modules/extendOwn.js","../../node_modules/underscore/modules/defaults.js","../../node_modules/underscore/modules/_baseCreate.js","../../node_modules/underscore/modules/create.js","../../node_modules/underscore/modules/clone.js","../../node_modules/underscore/modules/tap.js","../../node_modules/underscore/modules/toPath.js","../../node_modules/underscore/modules/_toPath.js","../../node_modules/underscore/modules/_deepGet.js","../../node_modules/underscore/modules/get.js","../../node_modules/underscore/modules/has.js","../../node_modules/underscore/modules/identity.js","../../node_modules/underscore/modules/matcher.js","../../node_modules/underscore/modules/property.js","../../node_modules/underscore/modules/_optimizeCb.js","../../node_modules/underscore/modules/_baseIteratee.js","../../node_modules/underscore/modules/iteratee.js","../../node_modules/underscore/modules/_cb.js","../../node_modules/underscore/modules/mapObject.js","../../node_modules/underscore/modules/noop.js","../../node_modules/underscore/modules/propertyOf.js","../../node_modules/underscore/modules/times.js","../../node_modules/underscore/modules/random.js","../../node_modules/underscore/modules/now.js","../../node_modules/underscore/modules/_createEscaper.js","../../node_modules/underscore/modules/_escapeMap.js","../../node_modules/underscore/modules/escape.js","../../node_modules/underscore/modules/_unescapeMap.js","../../node_modules/underscore/modules/unescape.js","../../node_modules/underscore/modules/templateSettings.js","../../node_modules/underscore/modules/template.js","../../node_modules/underscore/modules/result.js","../../node_modules/underscore/modules/uniqueId.js","../../node_modules/underscore/modules/chain.js","../../node_modules/underscore/modules/_executeBound.js","../../node_modules/underscore/modules/partial.js","../../node_modules/underscore/modules/bind.js","../../node_modules/underscore/modules/_isArrayLike.js","../../node_modules/underscore/modules/_flatten.js","../../node_modules/underscore/modules/bindAll.js","../../node_modules/underscore/modules/memoize.js","../../node_modules/underscore/modules/delay.js","../../node_modules/underscore/modules/defer.js","../../node_modules/underscore/modules/throttle.js","../../node_modules/underscore/modules/debounce.js","../../node_modules/underscore/modules/wrap.js","../../node_modules/underscore/modules/negate.js","../../node_modules/underscore/modules/compose.js","../../node_modules/underscore/modules/after.js","../../node_modules/underscore/modules/before.js","../../node_modules/underscore/modules/once.js","../../node_modules/underscore/modules/findKey.js","../../node_modules/underscore/modules/_createPredicateIndexFinder.js","../../node_modules/underscore/modules/findIndex.js","../../node_modules/underscore/modules/findLastIndex.js","../../node_modules/underscore/modules/sortedIndex.js","../../node_modules/underscore/modules/_createIndexFinder.js","../../node_modules/underscore/modules/indexOf.js","../../node_modules/underscore/modules/lastIndexOf.js","../../node_modules/underscore/modules/find.js","../../node_modules/underscore/modules/findWhere.js","../../node_modules/underscore/modules/each.js","../../node_modules/underscore/modules/map.js","../../node_modules/underscore/modules/_createReduce.js","../../node_modules/underscore/modules/reduce.js","../../node_modules/underscore/modules/reduceRight.js","../../node_modules/underscore/modules/filter.js","../../node_modules/underscore/modules/reject.js","../../node_modules/underscore/modules/every.js","../../node_modules/underscore/modules/some.js","../../node_modules/underscore/modules/contains.js","../../node_modules/underscore/modules/invoke.js","../../node_modules/underscore/modules/pluck.js","../../node_modules/underscore/modules/where.js","../../node_modules/underscore/modules/max.js","../../node_modules/underscore/modules/min.js","../../node_modules/underscore/modules/toArray.js","../../node_modules/underscore/modules/sample.js","../../node_modules/underscore/modules/shuffle.js","../../node_modules/underscore/modules/sortBy.js","../../node_modules/underscore/modules/_group.js","../../node_modules/underscore/modules/groupBy.js","../../node_modules/underscore/modules/indexBy.js","../../node_modules/underscore/modules/countBy.js","../../node_modules/underscore/modules/partition.js","../../node_modules/underscore/modules/size.js","../../node_modules/underscore/modules/_keyInObj.js","../../node_modules/underscore/modules/pick.js","../../node_modules/underscore/modules/omit.js","../../node_modules/underscore/modules/initial.js","../../node_modules/underscore/modules/first.js","../../node_modules/underscore/modules/rest.js","../../node_modules/underscore/modules/last.js","../../node_modules/underscore/modules/compact.js","../../node_modules/underscore/modules/flatten.js","../../node_modules/underscore/modules/difference.js","../../node_modules/underscore/modules/without.js","../../node_modules/underscore/modules/uniq.js","../../node_modules/underscore/modules/union.js","../../node_modules/underscore/modules/intersection.js","../../node_modules/underscore/modules/unzip.js","../../node_modules/underscore/modules/zip.js","../../node_modules/underscore/modules/object.js","../../node_modules/underscore/modules/range.js","../../node_modules/underscore/modules/chunk.js","../../node_modules/underscore/modules/_chainResult.js","../../node_modules/underscore/modules/mixin.js","../../node_modules/underscore/modules/underscore-array-methods.js","../../node_modules/underscore/modules/index-default.js","../../node_modules/@speckle/viewer/dist/index.js","../../src/stores/speckle.ts","../../node_modules/@firebase/util/dist/index.esm2017.js","../../node_modules/@firebase/component/dist/esm/index.esm2017.js","../../node_modules/@firebase/logger/dist/esm/index.esm2017.js","../../node_modules/idb/build/wrap-idb-value.js","../../node_modules/idb/build/index.js","../../node_modules/@firebase/app/dist/esm/index.esm2017.js","../../node_modules/firebase/app/dist/esm/index.esm.js","../../node_modules/@firebase/webchannel-wrapper/dist/bloom-blob/esm/bloom_blob_es2018.js","../../node_modules/@firebase/webchannel-wrapper/dist/webchannel-blob/esm/webchannel_blob_es2018.js","../../node_modules/@firebase/firestore/dist/index.esm2017.js","../../node_modules/tslib/tslib.es6.mjs","../../node_modules/@firebase/auth/dist/esm2017/index-68602d24.js","../../src/firebase.ts","../../src/utils/dataUtils.ts","../../src/stores/firebase.ts","../../src/utils/material.ts","../../src/utils/stringUtils.ts","../../src/utils/resultUtils.ts","../../src/utils/projectUtils.ts","../../src/stores/main.ts","../../src/components/Misc/DropdownMenuItem.vue","../../src/components/Misc/Dropdown.vue","../../src/components/Misc/Settings/SettingsCalculationCategory.vue","../../src/components/Misc/Settings/SettingsImpactCategory.vue","../../src/components/Misc/Settings/SettingsLifecycleStages.vue","../../src/components/Misc/Settings/SettingsBuildingCodes.vue","../../src/components/Misc/Settings/SettingsFirebase.vue","../../src/components/Misc/Settings/SettingsSpeckle.vue","../../src/components/Misc/Settings/SettingsMaterials.vue","../../src/components/Misc/Settings/SettingsGithub.vue","../../src/components/Modals/SettingsModal.vue","../../src/components/Landing/Hero.vue","../../src/assets/images/AppPictureMapping.png","../../src/components/Landing/Features.vue","../../src/components/Landing/Contribute.vue","../../src/components/Landing/Footer.vue","../../src/views/Landing.vue","../../node_modules/@heroicons/vue/24/solid/esm/BookmarkIcon.js","../../node_modules/@heroicons/vue/24/solid/esm/CakeIcon.js","../../node_modules/@heroicons/vue/24/solid/esm/CalculatorIcon.js","../../node_modules/@heroicons/vue/24/solid/esm/ChevronDownIcon.js","../../node_modules/@heroicons/vue/24/solid/esm/ChevronLeftIcon.js","../../node_modules/@heroicons/vue/24/solid/esm/ChevronRightIcon.js","../../node_modules/@heroicons/vue/24/solid/esm/ChevronUpIcon.js","../../node_modules/@heroicons/vue/24/solid/esm/MapIcon.js","../../node_modules/@heroicons/vue/24/solid/esm/MinusCircleIcon.js","../../node_modules/@heroicons/vue/24/solid/esm/PencilSquareIcon.js","../../node_modules/@heroicons/vue/24/solid/esm/PlusCircleIcon.js","../../node_modules/sortablejs/modular/sortable.esm.js","../../node_modules/vuedraggable/dist/vuedraggable.umd.js","../../src/components/Sidebar/SubGroup.vue","../../src/components/Sidebar/Overview/OverviewGroupCard.vue","../../src/components/Sidebar/Overview/OverviewIconAction.vue","../../src/components/Sidebar/Mapping/MaterialGroupCard.vue","../../src/components/Sidebar/Mapping/MaterialIconAction.vue","../../node_modules/axios/lib/helpers/bind.js","../../node_modules/axios/lib/utils.js","../../node_modules/axios/lib/core/AxiosError.js","../../node_modules/axios/lib/helpers/null.js","../../node_modules/axios/lib/helpers/toFormData.js","../../node_modules/axios/lib/helpers/AxiosURLSearchParams.js","../../node_modules/axios/lib/helpers/buildURL.js","../../node_modules/axios/lib/core/InterceptorManager.js","../../node_modules/axios/lib/defaults/transitional.js","../../node_modules/axios/lib/platform/browser/classes/URLSearchParams.js","../../node_modules/axios/lib/platform/browser/classes/FormData.js","../../node_modules/axios/lib/platform/browser/classes/Blob.js","../../node_modules/axios/lib/platform/browser/index.js","../../node_modules/axios/lib/platform/common/utils.js","../../node_modules/axios/lib/platform/index.js","../../node_modules/axios/lib/helpers/toURLEncodedForm.js","../../node_modules/axios/lib/helpers/formDataToJSON.js","../../node_modules/axios/lib/defaults/index.js","../../node_modules/axios/lib/helpers/parseHeaders.js","../../node_modules/axios/lib/core/AxiosHeaders.js","../../node_modules/axios/lib/core/transformData.js","../../node_modules/axios/lib/cancel/isCancel.js","../../node_modules/axios/lib/cancel/CanceledError.js","../../node_modules/axios/lib/core/settle.js","../../node_modules/axios/lib/helpers/parseProtocol.js","../../node_modules/axios/lib/helpers/speedometer.js","../../node_modules/axios/lib/helpers/throttle.js","../../node_modules/axios/lib/helpers/progressEventReducer.js","../../node_modules/axios/lib/helpers/isURLSameOrigin.js","../../node_modules/axios/lib/helpers/cookies.js","../../node_modules/axios/lib/helpers/isAbsoluteURL.js","../../node_modules/axios/lib/helpers/combineURLs.js","../../node_modules/axios/lib/core/buildFullPath.js","../../node_modules/axios/lib/core/mergeConfig.js","../../node_modules/axios/lib/helpers/resolveConfig.js","../../node_modules/axios/lib/adapters/xhr.js","../../node_modules/axios/lib/helpers/composeSignals.js","../../node_modules/axios/lib/helpers/trackStream.js","../../node_modules/axios/lib/adapters/fetch.js","../../node_modules/axios/lib/adapters/adapters.js","../../node_modules/axios/lib/core/dispatchRequest.js","../../node_modules/axios/lib/env/data.js","../../node_modules/axios/lib/helpers/validator.js","../../node_modules/axios/lib/core/Axios.js","../../node_modules/axios/lib/cancel/CancelToken.js","../../node_modules/axios/lib/helpers/spread.js","../../node_modules/axios/lib/helpers/isAxiosError.js","../../node_modules/axios/lib/helpers/HttpStatusCode.js","../../node_modules/axios/lib/axios.js","../../src/utils/math.ts","../../src/utils/EPDUtils.ts","../../src/utils/emissionUtils.ts","../../src/components/Sidebar/Results/ResultIconAction.vue","../../src/components/Sidebar/Results/ResultsGroupCard.vue","../../src/components/Sidebar/GroupCard.vue","../../src/utils/filterUtils.ts","../../src/models/filters.ts","../../src/components/Sidebar/GroupList.vue","../../src/components/Sidebar/Sidebar.vue","../../node_modules/@heroicons/vue/24/outline/esm/ArrowsPointingOutIcon.js","../../node_modules/@heroicons/vue/24/outline/esm/Bars3Icon.js","../../node_modules/@heroicons/vue/24/outline/esm/CubeTransparentIcon.js","../../node_modules/@heroicons/vue/24/outline/esm/EyeSlashIcon.js","../../node_modules/@heroicons/vue/24/outline/esm/HomeIcon.js","../../node_modules/@heroicons/vue/24/outline/esm/LockClosedIcon.js","../../node_modules/@heroicons/vue/24/outline/esm/VideoCameraIcon.js","../../node_modules/@heroicons/vue/24/outline/esm/ViewfinderCircleIcon.js","../../node_modules/@heroicons/vue/24/outline/esm/XMarkIcon.js","../../src/components/SlideOver/ModifyFilter.vue","../../src/components/SlideOver/SaveMapping.vue","../../src/components/SlideOver/SaveResults.vue","../../src/components/SlideOver/Sliderover.vue","../../src/components/DetailBar/OverviewBar.vue","../../src/components/DetailBar/MaterialBar.vue","../../node_modules/@kurkle/color/dist/color.esm.js","../../node_modules/chart.js/dist/chunks/helpers.segment.js","../../node_modules/chart.js/dist/chart.js","../../node_modules/vue-chartjs/dist/index.js","../../node_modules/chartjs-plugin-datalabels/dist/chartjs-plugin-datalabels.esm.js","../../src/components/DetailBar/ResultsBar.vue","../../node_modules/d3-array/src/ascending.js","../../node_modules/d3-array/src/descending.js","../../node_modules/d3-array/src/bisector.js","../../node_modules/d3-array/src/number.js","../../node_modules/d3-array/src/bisect.js","../../node_modules/d3-array/src/extent.js","../../node_modules/internmap/src/index.js","../../node_modules/d3-array/src/identity.js","../../node_modules/d3-array/src/group.js","../../node_modules/d3-array/src/ticks.js","../../node_modules/d3-array/src/range.js","../../node_modules/d3-array/src/sum.js","../../node_modules/d3-dispatch/src/dispatch.js","../../node_modules/d3-selection/src/namespaces.js","../../node_modules/d3-selection/src/namespace.js","../../node_modules/d3-selection/src/creator.js","../../node_modules/d3-selection/src/selector.js","../../node_modules/d3-selection/src/selection/select.js","../../node_modules/d3-selection/src/array.js","../../node_modules/d3-selection/src/selectorAll.js","../../node_modules/d3-selection/src/selection/selectAll.js","../../node_modules/d3-selection/src/matcher.js","../../node_modules/d3-selection/src/selection/selectChild.js","../../node_modules/d3-selection/src/selection/selectChildren.js","../../node_modules/d3-selection/src/selection/filter.js","../../node_modules/d3-selection/src/selection/sparse.js","../../node_modules/d3-selection/src/selection/enter.js","../../node_modules/d3-selection/src/constant.js","../../node_modules/d3-selection/src/selection/data.js","../../node_modules/d3-selection/src/selection/exit.js","../../node_modules/d3-selection/src/selection/join.js","../../node_modules/d3-selection/src/selection/merge.js","../../node_modules/d3-selection/src/selection/order.js","../../node_modules/d3-selection/src/selection/sort.js","../../node_modules/d3-selection/src/selection/call.js","../../node_modules/d3-selection/src/selection/nodes.js","../../node_modules/d3-selection/src/selection/node.js","../../node_modules/d3-selection/src/selection/size.js","../../node_modules/d3-selection/src/selection/empty.js","../../node_modules/d3-selection/src/selection/each.js","../../node_modules/d3-selection/src/selection/attr.js","../../node_modules/d3-selection/src/window.js","../../node_modules/d3-selection/src/selection/style.js","../../node_modules/d3-selection/src/selection/property.js","../../node_modules/d3-selection/src/selection/classed.js","../../node_modules/d3-selection/src/selection/text.js","../../node_modules/d3-selection/src/selection/html.js","../../node_modules/d3-selection/src/selection/raise.js","../../node_modules/d3-selection/src/selection/lower.js","../../node_modules/d3-selection/src/selection/append.js","../../node_modules/d3-selection/src/selection/insert.js","../../node_modules/d3-selection/src/selection/remove.js","../../node_modules/d3-selection/src/selection/clone.js","../../node_modules/d3-selection/src/selection/datum.js","../../node_modules/d3-selection/src/selection/on.js","../../node_modules/d3-selection/src/selection/dispatch.js","../../node_modules/d3-selection/src/selection/iterator.js","../../node_modules/d3-selection/src/selection/index.js","../../node_modules/d3-selection/src/select.js","../../node_modules/d3-selection/src/sourceEvent.js","../../node_modules/d3-selection/src/pointer.js","../../node_modules/d3-color/src/define.js","../../node_modules/d3-color/src/color.js","../../node_modules/d3-interpolate/src/constant.js","../../node_modules/d3-interpolate/src/color.js","../../node_modules/d3-interpolate/src/rgb.js","../../node_modules/d3-interpolate/src/numberArray.js","../../node_modules/d3-interpolate/src/array.js","../../node_modules/d3-interpolate/src/date.js","../../node_modules/d3-interpolate/src/number.js","../../node_modules/d3-interpolate/src/object.js","../../node_modules/d3-interpolate/src/string.js","../../node_modules/d3-interpolate/src/value.js","../../node_modules/d3-interpolate/src/round.js","../../node_modules/d3-interpolate/src/transform/decompose.js","../../node_modules/d3-interpolate/src/transform/parse.js","../../node_modules/d3-interpolate/src/transform/index.js","../../node_modules/d3-timer/src/timer.js","../../node_modules/d3-timer/src/timeout.js","../../node_modules/d3-transition/src/transition/schedule.js","../../node_modules/d3-transition/src/interrupt.js","../../node_modules/d3-transition/src/selection/interrupt.js","../../node_modules/d3-transition/src/transition/tween.js","../../node_modules/d3-transition/src/transition/interpolate.js","../../node_modules/d3-transition/src/transition/attr.js","../../node_modules/d3-transition/src/transition/attrTween.js","../../node_modules/d3-transition/src/transition/delay.js","../../node_modules/d3-transition/src/transition/duration.js","../../node_modules/d3-transition/src/transition/ease.js","../../node_modules/d3-transition/src/transition/easeVarying.js","../../node_modules/d3-transition/src/transition/filter.js","../../node_modules/d3-transition/src/transition/merge.js","../../node_modules/d3-transition/src/transition/on.js","../../node_modules/d3-transition/src/transition/remove.js","../../node_modules/d3-transition/src/transition/select.js","../../node_modules/d3-transition/src/transition/selectAll.js","../../node_modules/d3-transition/src/transition/selection.js","../../node_modules/d3-transition/src/transition/style.js","../../node_modules/d3-transition/src/transition/styleTween.js","../../node_modules/d3-transition/src/transition/text.js","../../node_modules/d3-transition/src/transition/textTween.js","../../node_modules/d3-transition/src/transition/transition.js","../../node_modules/d3-transition/src/transition/end.js","../../node_modules/d3-transition/src/transition/index.js","../../node_modules/d3-ease/src/cubic.js","../../node_modules/d3-transition/src/selection/transition.js","../../node_modules/d3-transition/src/selection/index.js","../../node_modules/d3-path/src/path.js","../../node_modules/d3-format/src/formatDecimal.js","../../node_modules/d3-format/src/exponent.js","../../node_modules/d3-format/src/formatGroup.js","../../node_modules/d3-format/src/formatNumerals.js","../../node_modules/d3-format/src/formatSpecifier.js","../../node_modules/d3-format/src/formatTrim.js","../../node_modules/d3-format/src/formatPrefixAuto.js","../../node_modules/d3-format/src/formatRounded.js","../../node_modules/d3-format/src/formatTypes.js","../../node_modules/d3-format/src/identity.js","../../node_modules/d3-format/src/locale.js","../../node_modules/d3-format/src/defaultLocale.js","../../node_modules/d3-format/src/precisionFixed.js","../../node_modules/d3-format/src/precisionPrefix.js","../../node_modules/d3-format/src/precisionRound.js","../../node_modules/d3-scale/src/init.js","../../node_modules/d3-scale/src/ordinal.js","../../node_modules/d3-scale/src/band.js","../../node_modules/d3-scale/src/constant.js","../../node_modules/d3-scale/src/number.js","../../node_modules/d3-scale/src/continuous.js","../../node_modules/d3-scale/src/tickFormat.js","../../node_modules/d3-scale/src/linear.js","../../node_modules/d3-shape/src/constant.js","../../node_modules/d3-shape/src/math.js","../../node_modules/d3-shape/src/path.js","../../node_modules/d3-shape/src/arc.js","../../node_modules/d3-shape/src/array.js","../../node_modules/d3-shape/src/descending.js","../../node_modules/d3-shape/src/identity.js","../../node_modules/d3-shape/src/pie.js","../../node_modules/d3-shape/src/offset/none.js","../../node_modules/d3-shape/src/order/none.js","../../node_modules/d3-shape/src/stack.js","../../node_modules/d3-shape/src/offset/diverging.js","../../node_modules/d3-zoom/src/transform.js","../../src/utils/chartUtils.ts","../../src/components/Graphs/StackedBarChart.vue","../../src/components/DetailBar/DetailBar.vue","../../src/components/Misc/RenderToggle.vue","../../src/components/ModelViewer/ViewerControls.vue","../../src/components/Graphs/SelectablePieChart.vue","../../src/components/Graphs/DivergingStackedBar.vue","../../src/components/Graphs/GraphContainer.vue","../../src/components/ModelViewer/SpeckleViewer.vue","../../src/components/Navbar.vue","../../src/models/revaluDataSource.ts","../../src/utils/preLoader.ts","../../src/components/Sidebar/NewGroupModal.vue","../../src/components/Mapping/MaterialMappingCard.vue","../../src/components/Mapping/MaterialTable.vue","../../src/components/Misc/DropdownMulti.vue","../../src/components/Misc/SearchBar.vue","../../src/components/Mapping/MaterialMappingModal.vue","../../src/components/Modals/SaveFilterModal.vue","../../src/components/Mapping/AssemblyTable.vue","../../node_modules/@ckpack/vue-color/libs/defaultConfig.js","../../node_modules/@ckpack/vue-color/libs/style-inject.es-746bb8ed.js","../../node_modules/@ckpack/vue-color/libs/utils/compoent.js","../../node_modules/@ckpack/vue-color/libs/components/checkboard/index.js","../../node_modules/@ckpack/vue-color/libs/components/alpha/index.js","../../node_modules/@ctrl/tinycolor/dist/module/util.js","../../node_modules/@ctrl/tinycolor/dist/module/conversion.js","../../node_modules/@ctrl/tinycolor/dist/module/css-color-names.js","../../node_modules/@ctrl/tinycolor/dist/module/format-input.js","../../node_modules/@ctrl/tinycolor/dist/module/index.js","../../node_modules/@ckpack/vue-color/libs/mixin/color.js","../../node_modules/@ckpack/vue-color/libs/components/editable-input/index.js","../../node_modules/@ckpack/vue-color/libs/utils/utils.js","../../node_modules/@ckpack/vue-color/libs/components/saturation/index.js","../../node_modules/@ckpack/vue-color/libs/components/hue/index.js","../../node_modules/@ckpack/vue-color/libs/components/sketch/index.js","../../src/components/Mapping/MaterialBar.vue","../../src/components/Mapping/AssemblyViewer.vue","../../src/components/Modals/AssemblyModal.vue","../../src/views/Dashboard.vue","../../src/components/ProjectSelection/VersionSelectionModal.vue","../../src/components/ProjectSelection/ProjectGrid.vue","../../src/views/ProjectSelection.vue","../../src/components/Graphs/DataTable.vue","../../src/components/Benchmark/BenchmarkGrid.vue","../../src/views/Benchmark.vue","../../src/views/NotFound.vue","../../src/views/TestZone.vue","../../src/views/ReportPage.vue","../../src/components/SpeckleLogin.vue","../../src/router/index.ts","../../src/directives/clickDirectives.ts","../../src/main.ts"],"sourcesContent":["/**\n* @vue/shared v3.5.13\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str) {\n const map = /* @__PURE__ */ Object.create(null);\n for (const key of str.split(\",\")) map[key] = 1;\n return (val) => val in map;\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n};\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction(\n (str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n }\n);\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction(\n (str) => {\n const s = str ? `on${capitalize(str)}` : ``;\n return s;\n }\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, ...arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](...arg);\n }\n};\nconst def = (obj, key, value, writable = false) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n writable,\n value\n });\n};\nconst looseToNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n const n = isString(val) ? Number(val) : NaN;\n return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\nfunction genCacheKey(source, options) {\n return source + JSON.stringify(\n options,\n (_, val) => typeof val === \"function\" ? val.toString() : val\n );\n}\n\nconst PatchFlags = {\n \"TEXT\": 1,\n \"1\": \"TEXT\",\n \"CLASS\": 2,\n \"2\": \"CLASS\",\n \"STYLE\": 4,\n \"4\": \"STYLE\",\n \"PROPS\": 8,\n \"8\": \"PROPS\",\n \"FULL_PROPS\": 16,\n \"16\": \"FULL_PROPS\",\n \"NEED_HYDRATION\": 32,\n \"32\": \"NEED_HYDRATION\",\n \"STABLE_FRAGMENT\": 64,\n \"64\": \"STABLE_FRAGMENT\",\n \"KEYED_FRAGMENT\": 128,\n \"128\": \"KEYED_FRAGMENT\",\n \"UNKEYED_FRAGMENT\": 256,\n \"256\": \"UNKEYED_FRAGMENT\",\n \"NEED_PATCH\": 512,\n \"512\": \"NEED_PATCH\",\n \"DYNAMIC_SLOTS\": 1024,\n \"1024\": \"DYNAMIC_SLOTS\",\n \"DEV_ROOT_FRAGMENT\": 2048,\n \"2048\": \"DEV_ROOT_FRAGMENT\",\n \"CACHED\": -1,\n \"-1\": \"CACHED\",\n \"BAIL\": -2,\n \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n [1]: `TEXT`,\n [2]: `CLASS`,\n [4]: `STYLE`,\n [8]: `PROPS`,\n [16]: `FULL_PROPS`,\n [32]: `NEED_HYDRATION`,\n [64]: `STABLE_FRAGMENT`,\n [128]: `KEYED_FRAGMENT`,\n [256]: `UNKEYED_FRAGMENT`,\n [512]: `NEED_PATCH`,\n [1024]: `DYNAMIC_SLOTS`,\n [2048]: `DEV_ROOT_FRAGMENT`,\n [-1]: `HOISTED`,\n [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n \"ELEMENT\": 1,\n \"1\": \"ELEMENT\",\n \"FUNCTIONAL_COMPONENT\": 2,\n \"2\": \"FUNCTIONAL_COMPONENT\",\n \"STATEFUL_COMPONENT\": 4,\n \"4\": \"STATEFUL_COMPONENT\",\n \"TEXT_CHILDREN\": 8,\n \"8\": \"TEXT_CHILDREN\",\n \"ARRAY_CHILDREN\": 16,\n \"16\": \"ARRAY_CHILDREN\",\n \"SLOTS_CHILDREN\": 32,\n \"32\": \"SLOTS_CHILDREN\",\n \"TELEPORT\": 64,\n \"64\": \"TELEPORT\",\n \"SUSPENSE\": 128,\n \"128\": \"SUSPENSE\",\n \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n \"COMPONENT_KEPT_ALIVE\": 512,\n \"512\": \"COMPONENT_KEPT_ALIVE\",\n \"COMPONENT\": 6,\n \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n \"STABLE\": 1,\n \"1\": \"STABLE\",\n \"DYNAMIC\": 2,\n \"2\": \"DYNAMIC\",\n \"FORWARDED\": 3,\n \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n [1]: \"STABLE\",\n [2]: \"DYNAMIC\",\n [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n start = Math.max(0, Math.min(start, source.length));\n end = Math.max(0, Math.min(end, source.length));\n if (start > end) return \"\";\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length) continue;\n const line = j + 1;\n res.push(\n `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`\n );\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(\n 1,\n end > count ? lineLength - pad : end - start\n );\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isString(value) || isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n if (!styles) return \"\";\n if (isString(styles)) return styles;\n let ret = \"\";\n for (const key in styles) {\n const value = styles[key];\n if (isString(value) || typeof value === \"number\") {\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props) return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nconst isKnownMathMLAttr = /* @__PURE__ */ makeMap(\n `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns`\n);\nfunction isRenderableAttrValue(value) {\n if (value == null) {\n return false;\n }\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \""\";\n break;\n case 38:\n escaped = \"&\";\n break;\n case 39:\n escaped = \"'\";\n break;\n case 60:\n escaped = \"<\";\n break;\n case 62:\n escaped = \">\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.slice(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>||--!>|?@[\\\\\\]^`{|}~]/g;\nfunction getEscapedCssVarName(key, doubleEscape) {\n return key.replace(\n cssVarNameEscapeSymbolsRE,\n (s) => doubleEscape ? s === '\"' ? '\\\\\\\\\\\\\"' : `\\\\\\\\${s}` : `\\\\${s}`\n );\n}\n\nfunction looseCompareArrays(a, b) {\n if (a.length !== b.length) return false;\n let equal = true;\n for (let i = 0; equal && i < a.length; i++) {\n equal = looseEqual(a[i], b[i]);\n }\n return equal;\n}\nfunction looseEqual(a, b) {\n if (a === b) return true;\n let aValidType = isDate(a);\n let bValidType = isDate(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n }\n aValidType = isSymbol(a);\n bValidType = isSymbol(b);\n if (aValidType || bValidType) {\n return a === b;\n }\n aValidType = isArray(a);\n bValidType = isArray(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n }\n aValidType = isObject(a);\n bValidType = isObject(b);\n if (aValidType || bValidType) {\n if (!aValidType || !bValidType) {\n return false;\n }\n const aKeysCount = Object.keys(a).length;\n const bKeysCount = Object.keys(b).length;\n if (aKeysCount !== bKeysCount) {\n return false;\n }\n for (const key in a) {\n const aHasKey = a.hasOwnProperty(key);\n const bHasKey = b.hasOwnProperty(key);\n if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n return false;\n }\n }\n }\n return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst isRef = (val) => {\n return !!(val && val[\"__v_isRef\"] === true);\n};\nconst toDisplayString = (val) => {\n return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n if (isRef(val)) {\n return replacer(_key, val.value);\n } else if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce(\n (entries, [key, val2], i) => {\n entries[stringifySymbol(key, i) + \" =>\"] = val2;\n return entries;\n },\n {}\n )\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n };\n } else if (isSymbol(val)) {\n return stringifySymbol(val);\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n var _a;\n return (\n // Symbol.description in es2019+ so we need to cast here to pass\n // the lib: es2016 check\n isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n );\n};\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, cssVarNameEscapeSymbolsRE, def, escapeHtml, escapeHtmlComment, extend, genCacheKey, genPropsAccessExp, generateCodeFrame, getEscapedCssVarName, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownMathMLAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","/**\n* @vue/reactivity v3.5.13\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { hasChanged, extend, isArray, isIntegerKey, isSymbol, isMap, hasOwn, isObject, makeMap, toRawType, capitalize, def, isFunction, EMPTY_OBJ, isSet, isPlainObject, NOOP, remove } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n constructor(detached = false) {\n this.detached = detached;\n /**\n * @internal\n */\n this._active = true;\n /**\n * @internal\n */\n this.effects = [];\n /**\n * @internal\n */\n this.cleanups = [];\n this._isPaused = false;\n this.parent = activeEffectScope;\n if (!detached && activeEffectScope) {\n this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n this\n ) - 1;\n }\n }\n get active() {\n return this._active;\n }\n pause() {\n if (this._active) {\n this._isPaused = true;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].pause();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].pause();\n }\n }\n }\n /**\n * Resumes the effect scope, including all child scopes and effects.\n */\n resume() {\n if (this._active) {\n if (this._isPaused) {\n this._isPaused = false;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].resume();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].resume();\n }\n }\n }\n }\n run(fn) {\n if (this._active) {\n const currentEffectScope = activeEffectScope;\n try {\n activeEffectScope = this;\n return fn();\n } finally {\n activeEffectScope = currentEffectScope;\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(`cannot run an inactive effect scope.`);\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n on() {\n activeEffectScope = this;\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n off() {\n activeEffectScope = this.parent;\n }\n stop(fromParent) {\n if (this._active) {\n this._active = false;\n let i, l;\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].stop();\n }\n this.effects.length = 0;\n for (i = 0, l = this.cleanups.length; i < l; i++) {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].stop(true);\n }\n this.scopes.length = 0;\n }\n if (!this.detached && this.parent && !fromParent) {\n const last = this.parent.scopes.pop();\n if (last && last !== this) {\n this.parent.scopes[this.index] = last;\n last.index = this.index;\n }\n }\n this.parent = void 0;\n }\n }\n}\nfunction effectScope(detached) {\n return new EffectScope(detached);\n}\nfunction getCurrentScope() {\n return activeEffectScope;\n}\nfunction onScopeDispose(fn, failSilently = false) {\n if (activeEffectScope) {\n activeEffectScope.cleanups.push(fn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onScopeDispose() is called when there is no active effect scope to be associated with.`\n );\n }\n}\n\nlet activeSub;\nconst EffectFlags = {\n \"ACTIVE\": 1,\n \"1\": \"ACTIVE\",\n \"RUNNING\": 2,\n \"2\": \"RUNNING\",\n \"TRACKING\": 4,\n \"4\": \"TRACKING\",\n \"NOTIFIED\": 8,\n \"8\": \"NOTIFIED\",\n \"DIRTY\": 16,\n \"16\": \"DIRTY\",\n \"ALLOW_RECURSE\": 32,\n \"32\": \"ALLOW_RECURSE\",\n \"PAUSED\": 64,\n \"64\": \"PAUSED\"\n};\nconst pausedQueueEffects = /* @__PURE__ */ new WeakSet();\nclass ReactiveEffect {\n constructor(fn) {\n this.fn = fn;\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 1 | 4;\n /**\n * @internal\n */\n this.next = void 0;\n /**\n * @internal\n */\n this.cleanup = void 0;\n this.scheduler = void 0;\n if (activeEffectScope && activeEffectScope.active) {\n activeEffectScope.effects.push(this);\n }\n }\n pause() {\n this.flags |= 64;\n }\n resume() {\n if (this.flags & 64) {\n this.flags &= ~64;\n if (pausedQueueEffects.has(this)) {\n pausedQueueEffects.delete(this);\n this.trigger();\n }\n }\n }\n /**\n * @internal\n */\n notify() {\n if (this.flags & 2 && !(this.flags & 32)) {\n return;\n }\n if (!(this.flags & 8)) {\n batch(this);\n }\n }\n run() {\n if (!(this.flags & 1)) {\n return this.fn();\n }\n this.flags |= 2;\n cleanupEffect(this);\n prepareDeps(this);\n const prevEffect = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = this;\n shouldTrack = true;\n try {\n return this.fn();\n } finally {\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub !== this) {\n warn(\n \"Active effect was not restored correctly - this is likely a Vue internal bug.\"\n );\n }\n cleanupDeps(this);\n activeSub = prevEffect;\n shouldTrack = prevShouldTrack;\n this.flags &= ~2;\n }\n }\n stop() {\n if (this.flags & 1) {\n for (let link = this.deps; link; link = link.nextDep) {\n removeSub(link);\n }\n this.deps = this.depsTail = void 0;\n cleanupEffect(this);\n this.onStop && this.onStop();\n this.flags &= ~1;\n }\n }\n trigger() {\n if (this.flags & 64) {\n pausedQueueEffects.add(this);\n } else if (this.scheduler) {\n this.scheduler();\n } else {\n this.runIfDirty();\n }\n }\n /**\n * @internal\n */\n runIfDirty() {\n if (isDirty(this)) {\n this.run();\n }\n }\n get dirty() {\n return isDirty(this);\n }\n}\nlet batchDepth = 0;\nlet batchedSub;\nlet batchedComputed;\nfunction batch(sub, isComputed = false) {\n sub.flags |= 8;\n if (isComputed) {\n sub.next = batchedComputed;\n batchedComputed = sub;\n return;\n }\n sub.next = batchedSub;\n batchedSub = sub;\n}\nfunction startBatch() {\n batchDepth++;\n}\nfunction endBatch() {\n if (--batchDepth > 0) {\n return;\n }\n if (batchedComputed) {\n let e = batchedComputed;\n batchedComputed = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= ~8;\n e = next;\n }\n }\n let error;\n while (batchedSub) {\n let e = batchedSub;\n batchedSub = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= ~8;\n if (e.flags & 1) {\n try {\n ;\n e.trigger();\n } catch (err) {\n if (!error) error = err;\n }\n }\n e = next;\n }\n }\n if (error) throw error;\n}\nfunction prepareDeps(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n link.version = -1;\n link.prevActiveLink = link.dep.activeLink;\n link.dep.activeLink = link;\n }\n}\nfunction cleanupDeps(sub) {\n let head;\n let tail = sub.depsTail;\n let link = tail;\n while (link) {\n const prev = link.prevDep;\n if (link.version === -1) {\n if (link === tail) tail = prev;\n removeSub(link);\n removeDep(link);\n } else {\n head = link;\n }\n link.dep.activeLink = link.prevActiveLink;\n link.prevActiveLink = void 0;\n link = prev;\n }\n sub.deps = head;\n sub.depsTail = tail;\n}\nfunction isDirty(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) {\n return true;\n }\n }\n if (sub._dirty) {\n return true;\n }\n return false;\n}\nfunction refreshComputed(computed) {\n if (computed.flags & 4 && !(computed.flags & 16)) {\n return;\n }\n computed.flags &= ~16;\n if (computed.globalVersion === globalVersion) {\n return;\n }\n computed.globalVersion = globalVersion;\n const dep = computed.dep;\n computed.flags |= 2;\n if (dep.version > 0 && !computed.isSSR && computed.deps && !isDirty(computed)) {\n computed.flags &= ~2;\n return;\n }\n const prevSub = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = computed;\n shouldTrack = true;\n try {\n prepareDeps(computed);\n const value = computed.fn(computed._value);\n if (dep.version === 0 || hasChanged(value, computed._value)) {\n computed._value = value;\n dep.version++;\n }\n } catch (err) {\n dep.version++;\n throw err;\n } finally {\n activeSub = prevSub;\n shouldTrack = prevShouldTrack;\n cleanupDeps(computed);\n computed.flags &= ~2;\n }\n}\nfunction removeSub(link, soft = false) {\n const { dep, prevSub, nextSub } = link;\n if (prevSub) {\n prevSub.nextSub = nextSub;\n link.prevSub = void 0;\n }\n if (nextSub) {\n nextSub.prevSub = prevSub;\n link.nextSub = void 0;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && dep.subsHead === link) {\n dep.subsHead = nextSub;\n }\n if (dep.subs === link) {\n dep.subs = prevSub;\n if (!prevSub && dep.computed) {\n dep.computed.flags &= ~4;\n for (let l = dep.computed.deps; l; l = l.nextDep) {\n removeSub(l, true);\n }\n }\n }\n if (!soft && !--dep.sc && dep.map) {\n dep.map.delete(dep.key);\n }\n}\nfunction removeDep(link) {\n const { prevDep, nextDep } = link;\n if (prevDep) {\n prevDep.nextDep = nextDep;\n link.prevDep = void 0;\n }\n if (nextDep) {\n nextDep.prevDep = prevDep;\n link.nextDep = void 0;\n }\n}\nfunction effect(fn, options) {\n if (fn.effect instanceof ReactiveEffect) {\n fn = fn.effect.fn;\n }\n const e = new ReactiveEffect(fn);\n if (options) {\n extend(e, options);\n }\n try {\n e.run();\n } catch (err) {\n e.stop();\n throw err;\n }\n const runner = e.run.bind(e);\n runner.effect = e;\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n}\nfunction enableTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = true;\n}\nfunction resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n}\nfunction onEffectCleanup(fn, failSilently = false) {\n if (activeSub instanceof ReactiveEffect) {\n activeSub.cleanup = fn;\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onEffectCleanup() was called when there was no active effect to associate with.`\n );\n }\n}\nfunction cleanupEffect(e) {\n const { cleanup } = e;\n e.cleanup = void 0;\n if (cleanup) {\n const prevSub = activeSub;\n activeSub = void 0;\n try {\n cleanup();\n } finally {\n activeSub = prevSub;\n }\n }\n}\n\nlet globalVersion = 0;\nclass Link {\n constructor(sub, dep) {\n this.sub = sub;\n this.dep = dep;\n this.version = dep.version;\n this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;\n }\n}\nclass Dep {\n constructor(computed) {\n this.computed = computed;\n this.version = 0;\n /**\n * Link between this dep and the current active effect\n */\n this.activeLink = void 0;\n /**\n * Doubly linked list representing the subscribing effects (tail)\n */\n this.subs = void 0;\n /**\n * For object property deps cleanup\n */\n this.map = void 0;\n this.key = void 0;\n /**\n * Subscriber counter\n */\n this.sc = 0;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.subsHead = void 0;\n }\n }\n track(debugInfo) {\n if (!activeSub || !shouldTrack || activeSub === this.computed) {\n return;\n }\n let link = this.activeLink;\n if (link === void 0 || link.sub !== activeSub) {\n link = this.activeLink = new Link(activeSub, this);\n if (!activeSub.deps) {\n activeSub.deps = activeSub.depsTail = link;\n } else {\n link.prevDep = activeSub.depsTail;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n }\n addSub(link);\n } else if (link.version === -1) {\n link.version = this.version;\n if (link.nextDep) {\n const next = link.nextDep;\n next.prevDep = link.prevDep;\n if (link.prevDep) {\n link.prevDep.nextDep = next;\n }\n link.prevDep = activeSub.depsTail;\n link.nextDep = void 0;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n if (activeSub.deps === link) {\n activeSub.deps = next;\n }\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub.onTrack) {\n activeSub.onTrack(\n extend(\n {\n effect: activeSub\n },\n debugInfo\n )\n );\n }\n return link;\n }\n trigger(debugInfo) {\n this.version++;\n globalVersion++;\n this.notify(debugInfo);\n }\n notify(debugInfo) {\n startBatch();\n try {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n for (let head = this.subsHead; head; head = head.nextSub) {\n if (head.sub.onTrigger && !(head.sub.flags & 8)) {\n head.sub.onTrigger(\n extend(\n {\n effect: head.sub\n },\n debugInfo\n )\n );\n }\n }\n }\n for (let link = this.subs; link; link = link.prevSub) {\n if (link.sub.notify()) {\n ;\n link.sub.dep.notify();\n }\n }\n } finally {\n endBatch();\n }\n }\n}\nfunction addSub(link) {\n link.dep.sc++;\n if (link.sub.flags & 4) {\n const computed = link.dep.computed;\n if (computed && !link.dep.subs) {\n computed.flags |= 4 | 16;\n for (let l = computed.deps; l; l = l.nextDep) {\n addSub(l);\n }\n }\n const currentTail = link.dep.subs;\n if (currentTail !== link) {\n link.prevSub = currentTail;\n if (currentTail) currentTail.nextSub = link;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && link.dep.subsHead === void 0) {\n link.dep.subsHead = link;\n }\n link.dep.subs = link;\n }\n}\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Object iterate\" : \"\"\n);\nconst MAP_KEY_ITERATE_KEY = Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Map keys iterate\" : \"\"\n);\nconst ARRAY_ITERATE_KEY = Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Array iterate\" : \"\"\n);\nfunction track(target, type, key) {\n if (shouldTrack && activeSub) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = new Dep());\n dep.map = depsMap;\n dep.key = key;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.track({\n target,\n type,\n key\n });\n } else {\n dep.track();\n }\n }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n globalVersion++;\n return;\n }\n const run = (dep) => {\n if (dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.trigger({\n target,\n type,\n key,\n newValue,\n oldValue,\n oldTarget\n });\n } else {\n dep.trigger();\n }\n }\n };\n startBatch();\n if (type === \"clear\") {\n depsMap.forEach(run);\n } else {\n const targetIsArray = isArray(target);\n const isArrayIndex = targetIsArray && isIntegerKey(key);\n if (targetIsArray && key === \"length\") {\n const newLength = Number(newValue);\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) {\n run(dep);\n }\n });\n } else {\n if (key !== void 0 || depsMap.has(void 0)) {\n run(depsMap.get(key));\n }\n if (isArrayIndex) {\n run(depsMap.get(ARRAY_ITERATE_KEY));\n }\n switch (type) {\n case \"add\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (isArrayIndex) {\n run(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (isMap(target)) {\n run(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n }\n endBatch();\n}\nfunction getDepFromReactive(object, key) {\n const depMap = targetMap.get(object);\n return depMap && depMap.get(key);\n}\n\nfunction reactiveReadArray(array) {\n const raw = toRaw(array);\n if (raw === array) return raw;\n track(raw, \"iterate\", ARRAY_ITERATE_KEY);\n return isShallow(array) ? raw : raw.map(toReactive);\n}\nfunction shallowReadArray(arr) {\n track(arr = toRaw(arr), \"iterate\", ARRAY_ITERATE_KEY);\n return arr;\n}\nconst arrayInstrumentations = {\n __proto__: null,\n [Symbol.iterator]() {\n return iterator(this, Symbol.iterator, toReactive);\n },\n concat(...args) {\n return reactiveReadArray(this).concat(\n ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x)\n );\n },\n entries() {\n return iterator(this, \"entries\", (value) => {\n value[1] = toReactive(value[1]);\n return value;\n });\n },\n every(fn, thisArg) {\n return apply(this, \"every\", fn, thisArg, void 0, arguments);\n },\n filter(fn, thisArg) {\n return apply(this, \"filter\", fn, thisArg, (v) => v.map(toReactive), arguments);\n },\n find(fn, thisArg) {\n return apply(this, \"find\", fn, thisArg, toReactive, arguments);\n },\n findIndex(fn, thisArg) {\n return apply(this, \"findIndex\", fn, thisArg, void 0, arguments);\n },\n findLast(fn, thisArg) {\n return apply(this, \"findLast\", fn, thisArg, toReactive, arguments);\n },\n findLastIndex(fn, thisArg) {\n return apply(this, \"findLastIndex\", fn, thisArg, void 0, arguments);\n },\n // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\n forEach(fn, thisArg) {\n return apply(this, \"forEach\", fn, thisArg, void 0, arguments);\n },\n includes(...args) {\n return searchProxy(this, \"includes\", args);\n },\n indexOf(...args) {\n return searchProxy(this, \"indexOf\", args);\n },\n join(separator) {\n return reactiveReadArray(this).join(separator);\n },\n // keys() iterator only reads `length`, no optimisation required\n lastIndexOf(...args) {\n return searchProxy(this, \"lastIndexOf\", args);\n },\n map(fn, thisArg) {\n return apply(this, \"map\", fn, thisArg, void 0, arguments);\n },\n pop() {\n return noTracking(this, \"pop\");\n },\n push(...args) {\n return noTracking(this, \"push\", args);\n },\n reduce(fn, ...args) {\n return reduce(this, \"reduce\", fn, args);\n },\n reduceRight(fn, ...args) {\n return reduce(this, \"reduceRight\", fn, args);\n },\n shift() {\n return noTracking(this, \"shift\");\n },\n // slice could use ARRAY_ITERATE but also seems to beg for range tracking\n some(fn, thisArg) {\n return apply(this, \"some\", fn, thisArg, void 0, arguments);\n },\n splice(...args) {\n return noTracking(this, \"splice\", args);\n },\n toReversed() {\n return reactiveReadArray(this).toReversed();\n },\n toSorted(comparer) {\n return reactiveReadArray(this).toSorted(comparer);\n },\n toSpliced(...args) {\n return reactiveReadArray(this).toSpliced(...args);\n },\n unshift(...args) {\n return noTracking(this, \"unshift\", args);\n },\n values() {\n return iterator(this, \"values\", toReactive);\n }\n};\nfunction iterator(self, method, wrapValue) {\n const arr = shallowReadArray(self);\n const iter = arr[method]();\n if (arr !== self && !isShallow(self)) {\n iter._next = iter.next;\n iter.next = () => {\n const result = iter._next();\n if (result.value) {\n result.value = wrapValue(result.value);\n }\n return result;\n };\n }\n return iter;\n}\nconst arrayProto = Array.prototype;\nfunction apply(self, method, fn, thisArg, wrappedRetFn, args) {\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self && !isShallow(self);\n const methodFn = arr[method];\n if (methodFn !== arrayProto[method]) {\n const result2 = methodFn.apply(self, args);\n return needsWrap ? toReactive(result2) : result2;\n }\n let wrappedFn = fn;\n if (arr !== self) {\n if (needsWrap) {\n wrappedFn = function(item, index) {\n return fn.call(this, toReactive(item), index, self);\n };\n } else if (fn.length > 2) {\n wrappedFn = function(item, index) {\n return fn.call(this, item, index, self);\n };\n }\n }\n const result = methodFn.call(arr, wrappedFn, thisArg);\n return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\nfunction reduce(self, method, fn, args) {\n const arr = shallowReadArray(self);\n let wrappedFn = fn;\n if (arr !== self) {\n if (!isShallow(self)) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, toReactive(item), index, self);\n };\n } else if (fn.length > 3) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, item, index, self);\n };\n }\n }\n return arr[method](wrappedFn, ...args);\n}\nfunction searchProxy(self, method, args) {\n const arr = toRaw(self);\n track(arr, \"iterate\", ARRAY_ITERATE_KEY);\n const res = arr[method](...args);\n if ((res === -1 || res === false) && isProxy(args[0])) {\n args[0] = toRaw(args[0]);\n return arr[method](...args);\n }\n return res;\n}\nfunction noTracking(self, method, args = []) {\n pauseTracking();\n startBatch();\n const res = toRaw(self)[method].apply(self, args);\n endBatch();\n resetTracking();\n return res;\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nfunction hasOwnProperty(key) {\n if (!isSymbol(key)) key = String(key);\n const obj = toRaw(this);\n track(obj, \"has\", key);\n return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n constructor(_isReadonly = false, _isShallow = false) {\n this._isReadonly = _isReadonly;\n this._isShallow = _isShallow;\n }\n get(target, key, receiver) {\n if (key === \"__v_skip\") return target[\"__v_skip\"];\n const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_isShallow\") {\n return isShallow2;\n } else if (key === \"__v_raw\") {\n if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n // this means the receiver is a user proxy of the reactive proxy\n Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n return target;\n }\n return;\n }\n const targetIsArray = isArray(target);\n if (!isReadonly2) {\n let fn;\n if (targetIsArray && (fn = arrayInstrumentations[key])) {\n return fn;\n }\n if (key === \"hasOwnProperty\") {\n return hasOwnProperty;\n }\n }\n const res = Reflect.get(\n target,\n key,\n // if this is a proxy wrapping a ref, return methods using the raw ref\n // as receiver so that we don't have to call `toRaw` on the ref in all\n // its class methods\n isRef(target) ? target : receiver\n );\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (isShallow2) {\n return res;\n }\n if (isRef(res)) {\n return targetIsArray && isIntegerKey(key) ? res : res.value;\n }\n if (isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive(res);\n }\n return res;\n }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(false, isShallow2);\n }\n set(target, key, value, receiver) {\n let oldValue = target[key];\n if (!this._isShallow) {\n const isOldValueReadonly = isReadonly(oldValue);\n if (!isShallow(value) && !isReadonly(value)) {\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n }\n if (!isArray(target) && isRef(oldValue) && !isRef(value)) {\n if (isOldValueReadonly) {\n return false;\n } else {\n oldValue.value = value;\n return true;\n }\n }\n }\n const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);\n const result = Reflect.set(\n target,\n key,\n value,\n isRef(target) ? target : receiver\n );\n if (target === toRaw(receiver)) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n }\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n has(target, key) {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n ownKeys(target) {\n track(\n target,\n \"iterate\",\n isArray(target) ? \"length\" : ITERATE_KEY\n );\n return Reflect.ownKeys(target);\n }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(true, isShallow2);\n }\n set(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n deleteProperty(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction createIterableMethod(method, isReadonly2, isShallow2) {\n return function(...args) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(\n rawTarget,\n \"iterate\",\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n );\n return {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n },\n // iterable protocol\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n}\nfunction createReadonlyMethod(type) {\n return function(...args) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n warn(\n `${capitalize(type)} operation ${key}failed: target is readonly.`,\n toRaw(this)\n );\n }\n return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n };\n}\nfunction createInstrumentations(readonly, shallow) {\n const instrumentations = {\n get(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"get\", key);\n }\n track(rawTarget, \"get\", rawKey);\n }\n const { has } = getProto(rawTarget);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n if (has.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n },\n get size() {\n const target = this[\"__v_raw\"];\n !readonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n return Reflect.get(target, \"size\", target);\n },\n has(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"has\", key);\n }\n track(rawTarget, \"has\", rawKey);\n }\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n },\n forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n !readonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n }\n };\n extend(\n instrumentations,\n readonly ? {\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\")\n } : {\n add(value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const proto = getProto(target);\n const hadKey = proto.has.call(target, value);\n if (!hadKey) {\n target.add(value);\n trigger(target, \"add\", value, value);\n }\n return this;\n },\n set(key, value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n },\n delete(key) {\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get ? get.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n },\n clear() {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n const result = target.clear();\n if (hadItems) {\n trigger(\n target,\n \"clear\",\n void 0,\n void 0,\n oldTarget\n );\n }\n return result;\n }\n }\n );\n const iteratorMethods = [\n \"keys\",\n \"values\",\n \"entries\",\n Symbol.iterator\n ];\n iteratorMethods.forEach((method) => {\n instrumentations[method] = createIterableMethod(method, readonly, shallow);\n });\n return instrumentations;\n}\nfunction createInstrumentationGetter(isReadonly2, shallow) {\n const instrumentations = createInstrumentations(isReadonly2, shallow);\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n key,\n receiver\n );\n };\n}\nconst mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has, key) {\n const rawKey = toRaw(key);\n if (rawKey !== key && has.call(target, rawKey)) {\n const type = toRawType(target);\n warn(\n `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n );\n }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1 /* COMMON */;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2 /* COLLECTION */;\n default:\n return 0 /* INVALID */;\n }\n}\nfunction getTargetType(value) {\n return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n if (isReadonly(target)) {\n return target;\n }\n return createReactiveObject(\n target,\n false,\n mutableHandlers,\n mutableCollectionHandlers,\n reactiveMap\n );\n}\nfunction shallowReactive(target) {\n return createReactiveObject(\n target,\n false,\n shallowReactiveHandlers,\n shallowCollectionHandlers,\n shallowReactiveMap\n );\n}\nfunction readonly(target) {\n return createReactiveObject(\n target,\n true,\n readonlyHandlers,\n readonlyCollectionHandlers,\n readonlyMap\n );\n}\nfunction shallowReadonly(target) {\n return createReactiveObject(\n target,\n true,\n shallowReadonlyHandlers,\n shallowReadonlyCollectionHandlers,\n shallowReadonlyMap\n );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!isObject(target)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `value cannot be made ${isReadonly2 ? \"readonly\" : \"reactive\"}: ${String(\n target\n )}`\n );\n }\n return target;\n }\n if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const targetType = getTargetType(target);\n if (targetType === 0 /* INVALID */) {\n return target;\n }\n const proxy = new Proxy(\n target,\n targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n );\n proxyMap.set(target, proxy);\n return proxy;\n}\nfunction isReactive(value) {\n if (isReadonly(value)) {\n return isReactive(value[\"__v_raw\"]);\n }\n return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n return value ? !!value[\"__v_raw\"] : false;\n}\nfunction toRaw(observed) {\n const raw = observed && observed[\"__v_raw\"];\n return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n if (!hasOwn(value, \"__v_skip\") && Object.isExtensible(value)) {\n def(value, \"__v_skip\", true);\n }\n return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nfunction isRef(r) {\n return r ? r[\"__v_isRef\"] === true : false;\n}\nfunction ref(value) {\n return createRef(value, false);\n}\nfunction shallowRef(value) {\n return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n if (isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n constructor(value, isShallow2) {\n this.dep = new Dep();\n this[\"__v_isRef\"] = true;\n this[\"__v_isShallow\"] = false;\n this._rawValue = isShallow2 ? value : toRaw(value);\n this._value = isShallow2 ? value : toReactive(value);\n this[\"__v_isShallow\"] = isShallow2;\n }\n get value() {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n });\n } else {\n this.dep.track();\n }\n return this._value;\n }\n set value(newValue) {\n const oldValue = this._rawValue;\n const useDirectValue = this[\"__v_isShallow\"] || isShallow(newValue) || isReadonly(newValue);\n newValue = useDirectValue ? newValue : toRaw(newValue);\n if (hasChanged(newValue, oldValue)) {\n this._rawValue = newValue;\n this._value = useDirectValue ? newValue : toReactive(newValue);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.trigger({\n target: this,\n type: \"set\",\n key: \"value\",\n newValue,\n oldValue\n });\n } else {\n this.dep.trigger();\n }\n }\n }\n}\nfunction triggerRef(ref2) {\n if (ref2.dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n ref2.dep.trigger({\n target: ref2,\n type: \"set\",\n key: \"value\",\n newValue: ref2._value\n });\n } else {\n ref2.dep.trigger();\n }\n }\n}\nfunction unref(ref2) {\n return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n get: (target, key, receiver) => key === \"__v_raw\" ? target : unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n};\nfunction proxyRefs(objectWithRefs) {\n return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n constructor(factory) {\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n const dep = this.dep = new Dep();\n const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep));\n this._get = get;\n this._set = set;\n }\n get value() {\n return this._value = this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n}\nfunction customRef(factory) {\n return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n warn(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = propertyToRef(object, key);\n }\n return ret;\n}\nclass ObjectRefImpl {\n constructor(_object, _key, _defaultValue) {\n this._object = _object;\n this._key = _key;\n this._defaultValue = _defaultValue;\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n }\n get value() {\n const val = this._object[this._key];\n return this._value = val === void 0 ? this._defaultValue : val;\n }\n set value(newVal) {\n this._object[this._key] = newVal;\n }\n get dep() {\n return getDepFromReactive(toRaw(this._object), this._key);\n }\n}\nclass GetterRefImpl {\n constructor(_getter) {\n this._getter = _getter;\n this[\"__v_isRef\"] = true;\n this[\"__v_isReadonly\"] = true;\n this._value = void 0;\n }\n get value() {\n return this._value = this._getter();\n }\n}\nfunction toRef(source, key, defaultValue) {\n if (isRef(source)) {\n return source;\n } else if (isFunction(source)) {\n return new GetterRefImpl(source);\n } else if (isObject(source) && arguments.length > 1) {\n return propertyToRef(source, key, defaultValue);\n } else {\n return ref(source);\n }\n}\nfunction propertyToRef(source, key, defaultValue) {\n const val = source[key];\n return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);\n}\n\nclass ComputedRefImpl {\n constructor(fn, setter, isSSR) {\n this.fn = fn;\n this.setter = setter;\n /**\n * @internal\n */\n this._value = void 0;\n /**\n * @internal\n */\n this.dep = new Dep(this);\n /**\n * @internal\n */\n this.__v_isRef = true;\n // TODO isolatedDeclarations \"__v_isReadonly\"\n // A computed is also a subscriber that tracks other deps\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 16;\n /**\n * @internal\n */\n this.globalVersion = globalVersion - 1;\n /**\n * @internal\n */\n this.next = void 0;\n // for backwards compat\n this.effect = this;\n this[\"__v_isReadonly\"] = !setter;\n this.isSSR = isSSR;\n }\n /**\n * @internal\n */\n notify() {\n this.flags |= 16;\n if (!(this.flags & 8) && // avoid infinite self recursion\n activeSub !== this) {\n batch(this, true);\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\")) ;\n }\n get value() {\n const link = !!(process.env.NODE_ENV !== \"production\") ? this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n }) : this.dep.track();\n refreshComputed(this);\n if (link) {\n link.version = this.dep.version;\n }\n return this._value;\n }\n set value(newValue) {\n if (this.setter) {\n this.setter(newValue);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\"Write operation failed: computed value is readonly\");\n }\n }\n}\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n let getter;\n let setter;\n if (isFunction(getterOrOptions)) {\n getter = getterOrOptions;\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n const cRef = new ComputedRefImpl(getter, setter, isSSR);\n if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n cRef.onTrack = debugOptions.onTrack;\n cRef.onTrigger = debugOptions.onTrigger;\n }\n return cRef;\n}\n\nconst TrackOpTypes = {\n \"GET\": \"get\",\n \"HAS\": \"has\",\n \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n \"SET\": \"set\",\n \"ADD\": \"add\",\n \"DELETE\": \"delete\",\n \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n \"SKIP\": \"__v_skip\",\n \"IS_REACTIVE\": \"__v_isReactive\",\n \"IS_READONLY\": \"__v_isReadonly\",\n \"IS_SHALLOW\": \"__v_isShallow\",\n \"RAW\": \"__v_raw\",\n \"IS_REF\": \"__v_isRef\"\n};\n\nconst WatchErrorCodes = {\n \"WATCH_GETTER\": 2,\n \"2\": \"WATCH_GETTER\",\n \"WATCH_CALLBACK\": 3,\n \"3\": \"WATCH_CALLBACK\",\n \"WATCH_CLEANUP\": 4,\n \"4\": \"WATCH_CLEANUP\"\n};\nconst INITIAL_WATCHER_VALUE = {};\nconst cleanupMap = /* @__PURE__ */ new WeakMap();\nlet activeWatcher = void 0;\nfunction getCurrentWatcher() {\n return activeWatcher;\n}\nfunction onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {\n if (owner) {\n let cleanups = cleanupMap.get(owner);\n if (!cleanups) cleanupMap.set(owner, cleanups = []);\n cleanups.push(cleanupFn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onWatcherCleanup() was called when there was no active watcher to associate with.`\n );\n }\n}\nfunction watch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, once, scheduler, augmentJob, call } = options;\n const warnInvalidSource = (s) => {\n (options.onWarn || warn)(\n `Invalid watch source: `,\n s,\n `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n );\n };\n const reactiveGetter = (source2) => {\n if (deep) return source2;\n if (isShallow(source2) || deep === false || deep === 0)\n return traverse(source2, 1);\n return traverse(source2);\n };\n let effect;\n let getter;\n let cleanup;\n let boundCleanup;\n let forceTrigger = false;\n let isMultiSource = false;\n if (isRef(source)) {\n getter = () => source.value;\n forceTrigger = isShallow(source);\n } else if (isReactive(source)) {\n getter = () => reactiveGetter(source);\n forceTrigger = true;\n } else if (isArray(source)) {\n isMultiSource = true;\n forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n getter = () => source.map((s) => {\n if (isRef(s)) {\n return s.value;\n } else if (isReactive(s)) {\n return reactiveGetter(s);\n } else if (isFunction(s)) {\n return call ? call(s, 2) : s();\n } else {\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n }\n });\n } else if (isFunction(source)) {\n if (cb) {\n getter = call ? () => call(source, 2) : source;\n } else {\n getter = () => {\n if (cleanup) {\n pauseTracking();\n try {\n cleanup();\n } finally {\n resetTracking();\n }\n }\n const currentEffect = activeWatcher;\n activeWatcher = effect;\n try {\n return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);\n } finally {\n activeWatcher = currentEffect;\n }\n };\n }\n } else {\n getter = NOOP;\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n }\n if (cb && deep) {\n const baseGetter = getter;\n const depth = deep === true ? Infinity : deep;\n getter = () => traverse(baseGetter(), depth);\n }\n const scope = getCurrentScope();\n const watchHandle = () => {\n effect.stop();\n if (scope && scope.active) {\n remove(scope.effects, effect);\n }\n };\n if (once && cb) {\n const _cb = cb;\n cb = (...args) => {\n _cb(...args);\n watchHandle();\n };\n }\n let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n const job = (immediateFirstRun) => {\n if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) {\n return;\n }\n if (cb) {\n const newValue = effect.run();\n if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {\n if (cleanup) {\n cleanup();\n }\n const currentWatcher = activeWatcher;\n activeWatcher = effect;\n try {\n const args = [\n newValue,\n // pass undefined as the old value when it's changed for the first time\n oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n boundCleanup\n ];\n call ? call(cb, 3, args) : (\n // @ts-expect-error\n cb(...args)\n );\n oldValue = newValue;\n } finally {\n activeWatcher = currentWatcher;\n }\n }\n } else {\n effect.run();\n }\n };\n if (augmentJob) {\n augmentJob(job);\n }\n effect = new ReactiveEffect(getter);\n effect.scheduler = scheduler ? () => scheduler(job, false) : job;\n boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);\n cleanup = effect.onStop = () => {\n const cleanups = cleanupMap.get(effect);\n if (cleanups) {\n if (call) {\n call(cleanups, 4);\n } else {\n for (const cleanup2 of cleanups) cleanup2();\n }\n cleanupMap.delete(effect);\n }\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n effect.onTrack = options.onTrack;\n effect.onTrigger = options.onTrigger;\n }\n if (cb) {\n if (immediate) {\n job(true);\n } else {\n oldValue = effect.run();\n }\n } else if (scheduler) {\n scheduler(job.bind(null, true), true);\n } else {\n effect.run();\n }\n watchHandle.pause = effect.pause.bind(effect);\n watchHandle.resume = effect.resume.bind(effect);\n watchHandle.stop = watchHandle;\n return watchHandle;\n}\nfunction traverse(value, depth = Infinity, seen) {\n if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n return value;\n }\n seen = seen || /* @__PURE__ */ new Set();\n if (seen.has(value)) {\n return value;\n }\n seen.add(value);\n depth--;\n if (isRef(value)) {\n traverse(value.value, depth, seen);\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n traverse(value[i], depth, seen);\n }\n } else if (isSet(value) || isMap(value)) {\n value.forEach((v) => {\n traverse(v, depth, seen);\n });\n } else if (isPlainObject(value)) {\n for (const key in value) {\n traverse(value[key], depth, seen);\n }\n for (const key of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n traverse(value[key], depth, seen);\n }\n }\n }\n return value;\n}\n\nexport { ARRAY_ITERATE_KEY, EffectFlags, EffectScope, ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, WatchErrorCodes, computed, customRef, effect, effectScope, enableTracking, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onEffectCleanup, onScopeDispose, onWatcherCleanup, pauseTracking, proxyRefs, reactive, reactiveReadArray, readonly, ref, resetTracking, shallowReactive, shallowReadArray, shallowReadonly, shallowRef, stop, toRaw, toReactive, toReadonly, toRef, toRefs, toValue, track, traverse, trigger, triggerRef, unref, watch };\n","/**\n* @vue/runtime-core v3.5.13\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { pauseTracking, resetTracking, isRef, toRaw, traverse, shallowRef, readonly, isReactive, ref, isShallow, shallowReadArray, toReactive, shallowReadonly, track, reactive, shallowReactive, trigger, ReactiveEffect, watch as watch$1, customRef, isProxy, proxyRefs, markRaw, EffectScope, computed as computed$1, isReadonly } from '@vue/reactivity';\nexport { EffectScope, ReactiveEffect, TrackOpTypes, TriggerOpTypes, customRef, effect, effectScope, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, onWatcherCleanup, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, triggerRef, unref } from '@vue/reactivity';\nimport { isString, isFunction, isPromise, isArray, EMPTY_OBJ, NOOP, getGlobalThis, extend, isBuiltInDirective, hasOwn, remove, def, isOn, isReservedProp, normalizeClass, stringifyStyle, normalizeStyle, isKnownSvgAttr, isBooleanAttr, isKnownHtmlAttr, includeBooleanAttr, isRenderableAttrValue, getEscapedCssVarName, isObject, isRegExp, invokeArrayFns, toHandlerKey, capitalize, camelize, isSymbol, isGloballyAllowed, NO, hyphenate, EMPTY_ARR, toRawType, makeMap, hasChanged, looseToNumber, isModelListener, toNumber } from '@vue/shared';\nexport { camelize, capitalize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n stack.push(vnode);\n}\nfunction popWarningContext() {\n stack.pop();\n}\nlet isWarning = false;\nfunction warn$1(msg, ...args) {\n if (isWarning) return;\n isWarning = true;\n pauseTracking();\n const instance = stack.length ? stack[stack.length - 1].component : null;\n const appWarnHandler = instance && instance.appContext.config.warnHandler;\n const trace = getComponentTrace();\n if (appWarnHandler) {\n callWithErrorHandling(\n appWarnHandler,\n instance,\n 11,\n [\n // eslint-disable-next-line no-restricted-syntax\n msg + args.map((a) => {\n var _a, _b;\n return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);\n }).join(\"\"),\n instance && instance.proxy,\n trace.map(\n ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n ).join(\"\\n\"),\n trace\n ]\n );\n } else {\n const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n if (trace.length && // avoid spamming console during tests\n true) {\n warnArgs.push(`\n`, ...formatTrace(trace));\n }\n console.warn(...warnArgs);\n }\n resetTracking();\n isWarning = false;\n}\nfunction getComponentTrace() {\n let currentVNode = stack[stack.length - 1];\n if (!currentVNode) {\n return [];\n }\n const normalizedStack = [];\n while (currentVNode) {\n const last = normalizedStack[0];\n if (last && last.vnode === currentVNode) {\n last.recurseCount++;\n } else {\n normalizedStack.push({\n vnode: currentVNode,\n recurseCount: 0\n });\n }\n const parentInstance = currentVNode.component && currentVNode.component.parent;\n currentVNode = parentInstance && parentInstance.vnode;\n }\n return normalizedStack;\n}\nfunction formatTrace(trace) {\n const logs = [];\n trace.forEach((entry, i) => {\n logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n });\n return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n const isRoot = vnode.component ? vnode.component.parent == null : false;\n const open = ` at <${formatComponentName(\n vnode.component,\n vnode.type,\n isRoot\n )}`;\n const close = `>` + postfix;\n return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n const res = [];\n const keys = Object.keys(props);\n keys.slice(0, 3).forEach((key) => {\n res.push(...formatProp(key, props[key]));\n });\n if (keys.length > 3) {\n res.push(` ...`);\n }\n return res;\n}\nfunction formatProp(key, value, raw) {\n if (isString(value)) {\n value = JSON.stringify(value);\n return raw ? value : [`${key}=${value}`];\n } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n return raw ? value : [`${key}=${value}`];\n } else if (isRef(value)) {\n value = formatProp(key, toRaw(value.value), true);\n return raw ? value : [`${key}=Ref<`, value, `>`];\n } else if (isFunction(value)) {\n return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n } else {\n value = toRaw(value);\n return raw ? value : [`${key}=`, value];\n }\n}\nfunction assertNumber(val, type) {\n if (!!!(process.env.NODE_ENV !== \"production\")) return;\n if (val === void 0) {\n return;\n } else if (typeof val !== \"number\") {\n warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);\n } else if (isNaN(val)) {\n warn$1(`${type} is NaN - the duration expression might be incorrect.`);\n }\n}\n\nconst ErrorCodes = {\n \"SETUP_FUNCTION\": 0,\n \"0\": \"SETUP_FUNCTION\",\n \"RENDER_FUNCTION\": 1,\n \"1\": \"RENDER_FUNCTION\",\n \"NATIVE_EVENT_HANDLER\": 5,\n \"5\": \"NATIVE_EVENT_HANDLER\",\n \"COMPONENT_EVENT_HANDLER\": 6,\n \"6\": \"COMPONENT_EVENT_HANDLER\",\n \"VNODE_HOOK\": 7,\n \"7\": \"VNODE_HOOK\",\n \"DIRECTIVE_HOOK\": 8,\n \"8\": \"DIRECTIVE_HOOK\",\n \"TRANSITION_HOOK\": 9,\n \"9\": \"TRANSITION_HOOK\",\n \"APP_ERROR_HANDLER\": 10,\n \"10\": \"APP_ERROR_HANDLER\",\n \"APP_WARN_HANDLER\": 11,\n \"11\": \"APP_WARN_HANDLER\",\n \"FUNCTION_REF\": 12,\n \"12\": \"FUNCTION_REF\",\n \"ASYNC_COMPONENT_LOADER\": 13,\n \"13\": \"ASYNC_COMPONENT_LOADER\",\n \"SCHEDULER\": 14,\n \"14\": \"SCHEDULER\",\n \"COMPONENT_UPDATE\": 15,\n \"15\": \"COMPONENT_UPDATE\",\n \"APP_UNMOUNT_CLEANUP\": 16,\n \"16\": \"APP_UNMOUNT_CLEANUP\"\n};\nconst ErrorTypeStrings$1 = {\n [\"sp\"]: \"serverPrefetch hook\",\n [\"bc\"]: \"beforeCreate hook\",\n [\"c\"]: \"created hook\",\n [\"bm\"]: \"beforeMount hook\",\n [\"m\"]: \"mounted hook\",\n [\"bu\"]: \"beforeUpdate hook\",\n [\"u\"]: \"updated\",\n [\"bum\"]: \"beforeUnmount hook\",\n [\"um\"]: \"unmounted hook\",\n [\"a\"]: \"activated hook\",\n [\"da\"]: \"deactivated hook\",\n [\"ec\"]: \"errorCaptured hook\",\n [\"rtc\"]: \"renderTracked hook\",\n [\"rtg\"]: \"renderTriggered hook\",\n [0]: \"setup function\",\n [1]: \"render function\",\n [2]: \"watcher getter\",\n [3]: \"watcher callback\",\n [4]: \"watcher cleanup function\",\n [5]: \"native event handler\",\n [6]: \"component event handler\",\n [7]: \"vnode hook\",\n [8]: \"directive hook\",\n [9]: \"transition hook\",\n [10]: \"app errorHandler\",\n [11]: \"app warnHandler\",\n [12]: \"ref function\",\n [13]: \"async component loader\",\n [14]: \"scheduler flush\",\n [15]: \"component update\",\n [16]: \"app unmount cleanup function\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n try {\n return args ? fn(...args) : fn();\n } catch (err) {\n handleError(err, instance, type);\n }\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n if (isFunction(fn)) {\n const res = callWithErrorHandling(fn, instance, type, args);\n if (res && isPromise(res)) {\n res.catch((err) => {\n handleError(err, instance, type);\n });\n }\n return res;\n }\n if (isArray(fn)) {\n const values = [];\n for (let i = 0; i < fn.length; i++) {\n values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n }\n return values;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`\n );\n }\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n const contextVNode = instance ? instance.vnode : null;\n const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ;\n if (instance) {\n let cur = instance.parent;\n const exposedInstance = instance.proxy;\n const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;\n while (cur) {\n const errorCapturedHooks = cur.ec;\n if (errorCapturedHooks) {\n for (let i = 0; i < errorCapturedHooks.length; i++) {\n if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n return;\n }\n }\n }\n cur = cur.parent;\n }\n if (errorHandler) {\n pauseTracking();\n callWithErrorHandling(errorHandler, null, 10, [\n err,\n exposedInstance,\n errorInfo\n ]);\n resetTracking();\n return;\n }\n }\n logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction);\n}\nfunction logError(err, type, contextVNode, throwInDev = true, throwInProd = false) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const info = ErrorTypeStrings$1[type];\n if (contextVNode) {\n pushWarningContext(contextVNode);\n }\n warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n if (contextVNode) {\n popWarningContext();\n }\n if (throwInDev) {\n throw err;\n } else {\n console.error(err);\n }\n } else if (throwInProd) {\n throw err;\n } else {\n console.error(err);\n }\n}\n\nconst queue = [];\nlet flushIndex = -1;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick(fn) {\n const p = currentFlushPromise || resolvedPromise;\n return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n let start = flushIndex + 1;\n let end = queue.length;\n while (start < end) {\n const middle = start + end >>> 1;\n const middleJob = queue[middle];\n const middleJobId = getId(middleJob);\n if (middleJobId < id || middleJobId === id && middleJob.flags & 2) {\n start = middle + 1;\n } else {\n end = middle;\n }\n }\n return start;\n}\nfunction queueJob(job) {\n if (!(job.flags & 1)) {\n const jobId = getId(job);\n const lastJob = queue[queue.length - 1];\n if (!lastJob || // fast path when the job id is larger than the tail\n !(job.flags & 2) && jobId >= getId(lastJob)) {\n queue.push(job);\n } else {\n queue.splice(findInsertionIndex(jobId), 0, job);\n }\n job.flags |= 1;\n queueFlush();\n }\n}\nfunction queueFlush() {\n if (!currentFlushPromise) {\n currentFlushPromise = resolvedPromise.then(flushJobs);\n }\n}\nfunction queuePostFlushCb(cb) {\n if (!isArray(cb)) {\n if (activePostFlushCbs && cb.id === -1) {\n activePostFlushCbs.splice(postFlushIndex + 1, 0, cb);\n } else if (!(cb.flags & 1)) {\n pendingPostFlushCbs.push(cb);\n cb.flags |= 1;\n }\n } else {\n pendingPostFlushCbs.push(...cb);\n }\n queueFlush();\n}\nfunction flushPreFlushCbs(instance, seen, i = flushIndex + 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (; i < queue.length; i++) {\n const cb = queue[i];\n if (cb && cb.flags & 2) {\n if (instance && cb.id !== instance.uid) {\n continue;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n queue.splice(i, 1);\n i--;\n if (cb.flags & 4) {\n cb.flags &= ~1;\n }\n cb();\n if (!(cb.flags & 4)) {\n cb.flags &= ~1;\n }\n }\n }\n}\nfunction flushPostFlushCbs(seen) {\n if (pendingPostFlushCbs.length) {\n const deduped = [...new Set(pendingPostFlushCbs)].sort(\n (a, b) => getId(a) - getId(b)\n );\n pendingPostFlushCbs.length = 0;\n if (activePostFlushCbs) {\n activePostFlushCbs.push(...deduped);\n return;\n }\n activePostFlushCbs = deduped;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n const cb = activePostFlushCbs[postFlushIndex];\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n if (cb.flags & 4) {\n cb.flags &= ~1;\n }\n if (!(cb.flags & 8)) cb();\n cb.flags &= ~1;\n }\n activePostFlushCbs = null;\n postFlushIndex = 0;\n }\n}\nconst getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id;\nfunction flushJobs(seen) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n try {\n for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job && !(job.flags & 8)) {\n if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n continue;\n }\n if (job.flags & 4) {\n job.flags &= ~1;\n }\n callWithErrorHandling(\n job,\n job.i,\n job.i ? 15 : 14\n );\n if (!(job.flags & 4)) {\n job.flags &= ~1;\n }\n }\n }\n } finally {\n for (; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job) {\n job.flags &= ~1;\n }\n }\n flushIndex = -1;\n queue.length = 0;\n flushPostFlushCbs(seen);\n currentFlushPromise = null;\n if (queue.length || pendingPostFlushCbs.length) {\n flushJobs(seen);\n }\n }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n const count = seen.get(fn) || 0;\n if (count > RECURSION_LIMIT) {\n const instance = fn.i;\n const componentName = instance && getComponentName(instance.type);\n handleError(\n `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,\n null,\n 10\n );\n return true;\n }\n seen.set(fn, count + 1);\n return false;\n}\n\nlet isHmrUpdating = false;\nconst hmrDirtyComponents = /* @__PURE__ */ new Map();\nif (!!(process.env.NODE_ENV !== \"production\")) {\n getGlobalThis().__VUE_HMR_RUNTIME__ = {\n createRecord: tryWrap(createRecord),\n rerender: tryWrap(rerender),\n reload: tryWrap(reload)\n };\n}\nconst map = /* @__PURE__ */ new Map();\nfunction registerHMR(instance) {\n const id = instance.type.__hmrId;\n let record = map.get(id);\n if (!record) {\n createRecord(id, instance.type);\n record = map.get(id);\n }\n record.instances.add(instance);\n}\nfunction unregisterHMR(instance) {\n map.get(instance.type.__hmrId).instances.delete(instance);\n}\nfunction createRecord(id, initialDef) {\n if (map.has(id)) {\n return false;\n }\n map.set(id, {\n initialDef: normalizeClassComponent(initialDef),\n instances: /* @__PURE__ */ new Set()\n });\n return true;\n}\nfunction normalizeClassComponent(component) {\n return isClassComponent(component) ? component.__vccOpts : component;\n}\nfunction rerender(id, newRender) {\n const record = map.get(id);\n if (!record) {\n return;\n }\n record.initialDef.render = newRender;\n [...record.instances].forEach((instance) => {\n if (newRender) {\n instance.render = newRender;\n normalizeClassComponent(instance.type).render = newRender;\n }\n instance.renderCache = [];\n isHmrUpdating = true;\n instance.update();\n isHmrUpdating = false;\n });\n}\nfunction reload(id, newComp) {\n const record = map.get(id);\n if (!record) return;\n newComp = normalizeClassComponent(newComp);\n updateComponentDef(record.initialDef, newComp);\n const instances = [...record.instances];\n for (let i = 0; i < instances.length; i++) {\n const instance = instances[i];\n const oldComp = normalizeClassComponent(instance.type);\n let dirtyInstances = hmrDirtyComponents.get(oldComp);\n if (!dirtyInstances) {\n if (oldComp !== record.initialDef) {\n updateComponentDef(oldComp, newComp);\n }\n hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set());\n }\n dirtyInstances.add(instance);\n instance.appContext.propsCache.delete(instance.type);\n instance.appContext.emitsCache.delete(instance.type);\n instance.appContext.optionsCache.delete(instance.type);\n if (instance.ceReload) {\n dirtyInstances.add(instance);\n instance.ceReload(newComp.styles);\n dirtyInstances.delete(instance);\n } else if (instance.parent) {\n queueJob(() => {\n isHmrUpdating = true;\n instance.parent.update();\n isHmrUpdating = false;\n dirtyInstances.delete(instance);\n });\n } else if (instance.appContext.reload) {\n instance.appContext.reload();\n } else if (typeof window !== \"undefined\") {\n window.location.reload();\n } else {\n console.warn(\n \"[HMR] Root or manually mounted instance modified. Full reload required.\"\n );\n }\n if (instance.root.ce && instance !== instance.root) {\n instance.root.ce._removeChildStyle(oldComp);\n }\n }\n queuePostFlushCb(() => {\n hmrDirtyComponents.clear();\n });\n}\nfunction updateComponentDef(oldComp, newComp) {\n extend(oldComp, newComp);\n for (const key in oldComp) {\n if (key !== \"__file\" && !(key in newComp)) {\n delete oldComp[key];\n }\n }\n}\nfunction tryWrap(fn) {\n return (id, arg) => {\n try {\n return fn(id, arg);\n } catch (e) {\n console.error(e);\n console.warn(\n `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`\n );\n }\n };\n}\n\nlet devtools$1;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n if (devtools$1) {\n devtools$1.emit(event, ...args);\n } else if (!devtoolsNotInstalled) {\n buffer.push({ event, args });\n }\n}\nfunction setDevtoolsHook$1(hook, target) {\n var _a, _b;\n devtools$1 = hook;\n if (devtools$1) {\n devtools$1.enabled = true;\n buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));\n buffer = [];\n } else if (\n // handle late devtools injection - only do this if we are in an actual\n // browser environment to avoid the timer handle stalling test runner exit\n // (#4815)\n typeof window !== \"undefined\" && // some envs mock window but not fully\n window.HTMLElement && // also exclude jsdom\n // eslint-disable-next-line no-restricted-syntax\n !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n ) {\n const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n replay.push((newHook) => {\n setDevtoolsHook$1(newHook, target);\n });\n setTimeout(() => {\n if (!devtools$1) {\n target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n devtoolsNotInstalled = true;\n buffer = [];\n }\n }, 3e3);\n } else {\n devtoolsNotInstalled = true;\n buffer = [];\n }\n}\nfunction devtoolsInitApp(app, version) {\n emit$1(\"app:init\" /* APP_INIT */, app, version, {\n Fragment,\n Text,\n Comment,\n Static\n });\n}\nfunction devtoolsUnmountApp(app) {\n emit$1(\"app:unmount\" /* APP_UNMOUNT */, app);\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\"component:added\" /* COMPONENT_ADDED */);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n if (devtools$1 && typeof devtools$1.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n !devtools$1.cleanupBuffer(component)) {\n _devtoolsComponentRemoved(component);\n }\n};\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction createDevtoolsComponentHook(hook) {\n return (component) => {\n emit$1(\n hook,\n component.appContext.app,\n component.uid,\n component.parent ? component.parent.uid : void 0,\n component\n );\n };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:start\" /* PERFORMANCE_START */);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:end\" /* PERFORMANCE_END */);\nfunction createDevtoolsPerformanceHook(hook) {\n return (component, type, time) => {\n emit$1(hook, component.appContext.app, component.uid, component, type, time);\n };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n emit$1(\n \"component:emit\" /* COMPONENT_EMIT */,\n component.appContext.app,\n component,\n event,\n params\n );\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n const prev = currentRenderingInstance;\n currentRenderingInstance = instance;\n currentScopeId = instance && instance.type.__scopeId || null;\n return prev;\n}\nfunction pushScopeId(id) {\n currentScopeId = id;\n}\nfunction popScopeId() {\n currentScopeId = null;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n if (!ctx) return fn;\n if (fn._n) {\n return fn;\n }\n const renderFnWithContext = (...args) => {\n if (renderFnWithContext._d) {\n setBlockTracking(-1);\n }\n const prevInstance = setCurrentRenderingInstance(ctx);\n let res;\n try {\n res = fn(...args);\n } finally {\n setCurrentRenderingInstance(prevInstance);\n if (renderFnWithContext._d) {\n setBlockTracking(1);\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentUpdated(ctx);\n }\n return res;\n };\n renderFnWithContext._n = true;\n renderFnWithContext._c = true;\n renderFnWithContext._d = true;\n return renderFnWithContext;\n}\n\nfunction validateDirectiveName(name) {\n if (isBuiltInDirective(name)) {\n warn$1(\"Do not use built-in directive ids as custom directive id: \" + name);\n }\n}\nfunction withDirectives(vnode, directives) {\n if (currentRenderingInstance === null) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`withDirectives can only be used inside render functions.`);\n return vnode;\n }\n const instance = getComponentPublicInstance(currentRenderingInstance);\n const bindings = vnode.dirs || (vnode.dirs = []);\n for (let i = 0; i < directives.length; i++) {\n let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n if (dir) {\n if (isFunction(dir)) {\n dir = {\n mounted: dir,\n updated: dir\n };\n }\n if (dir.deep) {\n traverse(value);\n }\n bindings.push({\n dir,\n instance,\n value,\n oldValue: void 0,\n arg,\n modifiers\n });\n }\n }\n return vnode;\n}\nfunction invokeDirectiveHook(vnode, prevVNode, instance, name) {\n const bindings = vnode.dirs;\n const oldBindings = prevVNode && prevVNode.dirs;\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n if (oldBindings) {\n binding.oldValue = oldBindings[i].value;\n }\n let hook = binding.dir[name];\n if (hook) {\n pauseTracking();\n callWithAsyncErrorHandling(hook, instance, 8, [\n vnode.el,\n binding,\n vnode,\n prevVNode\n ]);\n resetTracking();\n }\n }\n}\n\nconst TeleportEndKey = Symbol(\"_vte\");\nconst isTeleport = (type) => type.__isTeleport;\nconst isTeleportDisabled = (props) => props && (props.disabled || props.disabled === \"\");\nconst isTeleportDeferred = (props) => props && (props.defer || props.defer === \"\");\nconst isTargetSVG = (target) => typeof SVGElement !== \"undefined\" && target instanceof SVGElement;\nconst isTargetMathML = (target) => typeof MathMLElement === \"function\" && target instanceof MathMLElement;\nconst resolveTarget = (props, select) => {\n const targetSelector = props && props.to;\n if (isString(targetSelector)) {\n if (!select) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`\n );\n return null;\n } else {\n const target = select(targetSelector);\n if (!!(process.env.NODE_ENV !== \"production\") && !target && !isTeleportDisabled(props)) {\n warn$1(\n `Failed to locate Teleport target with selector \"${targetSelector}\". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`\n );\n }\n return target;\n }\n } else {\n if (!!(process.env.NODE_ENV !== \"production\") && !targetSelector && !isTeleportDisabled(props)) {\n warn$1(`Invalid Teleport target: ${targetSelector}`);\n }\n return targetSelector;\n }\n};\nconst TeleportImpl = {\n name: \"Teleport\",\n __isTeleport: true,\n process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) {\n const {\n mc: mountChildren,\n pc: patchChildren,\n pbc: patchBlockChildren,\n o: { insert, querySelector, createText, createComment }\n } = internals;\n const disabled = isTeleportDisabled(n2.props);\n let { shapeFlag, children, dynamicChildren } = n2;\n if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n optimized = false;\n dynamicChildren = null;\n }\n if (n1 == null) {\n const placeholder = n2.el = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport start\") : createText(\"\");\n const mainAnchor = n2.anchor = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport end\") : createText(\"\");\n insert(placeholder, container, anchor);\n insert(mainAnchor, container, anchor);\n const mount = (container2, anchor2) => {\n if (shapeFlag & 16) {\n if (parentComponent && parentComponent.isCE) {\n parentComponent.ce._teleportTarget = container2;\n }\n mountChildren(\n children,\n container2,\n anchor2,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n }\n };\n const mountToTarget = () => {\n const target = n2.target = resolveTarget(n2.props, querySelector);\n const targetAnchor = prepareAnchor(target, n2, createText, insert);\n if (target) {\n if (namespace !== \"svg\" && isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace !== \"mathml\" && isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (!disabled) {\n mount(target, targetAnchor);\n updateCssVars(n2, false);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && !disabled) {\n warn$1(\n \"Invalid Teleport target on mount:\",\n target,\n `(${typeof target})`\n );\n }\n };\n if (disabled) {\n mount(container, mainAnchor);\n updateCssVars(n2, true);\n }\n if (isTeleportDeferred(n2.props)) {\n queuePostRenderEffect(() => {\n mountToTarget();\n n2.el.__isMounted = true;\n }, parentSuspense);\n } else {\n mountToTarget();\n }\n } else {\n if (isTeleportDeferred(n2.props) && !n1.el.__isMounted) {\n queuePostRenderEffect(() => {\n TeleportImpl.process(\n n1,\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized,\n internals\n );\n delete n1.el.__isMounted;\n }, parentSuspense);\n return;\n }\n n2.el = n1.el;\n n2.targetStart = n1.targetStart;\n const mainAnchor = n2.anchor = n1.anchor;\n const target = n2.target = n1.target;\n const targetAnchor = n2.targetAnchor = n1.targetAnchor;\n const wasDisabled = isTeleportDisabled(n1.props);\n const currentContainer = wasDisabled ? container : target;\n const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;\n if (namespace === \"svg\" || isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace === \"mathml\" || isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (dynamicChildren) {\n patchBlockChildren(\n n1.dynamicChildren,\n dynamicChildren,\n currentContainer,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds\n );\n traverseStaticChildren(n1, n2, true);\n } else if (!optimized) {\n patchChildren(\n n1,\n n2,\n currentContainer,\n currentAnchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n false\n );\n }\n if (disabled) {\n if (!wasDisabled) {\n moveTeleport(\n n2,\n container,\n mainAnchor,\n internals,\n 1\n );\n } else {\n if (n2.props && n1.props && n2.props.to !== n1.props.to) {\n n2.props.to = n1.props.to;\n }\n }\n } else {\n if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {\n const nextTarget = n2.target = resolveTarget(\n n2.props,\n querySelector\n );\n if (nextTarget) {\n moveTeleport(\n n2,\n nextTarget,\n null,\n internals,\n 0\n );\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n \"Invalid Teleport target on update:\",\n target,\n `(${typeof target})`\n );\n }\n } else if (wasDisabled) {\n moveTeleport(\n n2,\n target,\n targetAnchor,\n internals,\n 1\n );\n }\n }\n updateCssVars(n2, disabled);\n }\n },\n remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) {\n const {\n shapeFlag,\n children,\n anchor,\n targetStart,\n targetAnchor,\n target,\n props\n } = vnode;\n if (target) {\n hostRemove(targetStart);\n hostRemove(targetAnchor);\n }\n doRemove && hostRemove(anchor);\n if (shapeFlag & 16) {\n const shouldRemove = doRemove || !isTeleportDisabled(props);\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n unmount(\n child,\n parentComponent,\n parentSuspense,\n shouldRemove,\n !!child.dynamicChildren\n );\n }\n }\n },\n move: moveTeleport,\n hydrate: hydrateTeleport\n};\nfunction moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {\n if (moveType === 0) {\n insert(vnode.targetAnchor, container, parentAnchor);\n }\n const { el, anchor, shapeFlag, children, props } = vnode;\n const isReorder = moveType === 2;\n if (isReorder) {\n insert(el, container, parentAnchor);\n }\n if (!isReorder || isTeleportDisabled(props)) {\n if (shapeFlag & 16) {\n for (let i = 0; i < children.length; i++) {\n move(\n children[i],\n container,\n parentAnchor,\n 2\n );\n }\n }\n }\n if (isReorder) {\n insert(anchor, container, parentAnchor);\n }\n}\nfunction hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {\n o: { nextSibling, parentNode, querySelector, insert, createText }\n}, hydrateChildren) {\n const target = vnode.target = resolveTarget(\n vnode.props,\n querySelector\n );\n if (target) {\n const disabled = isTeleportDisabled(vnode.props);\n const targetNode = target._lpa || target.firstChild;\n if (vnode.shapeFlag & 16) {\n if (disabled) {\n vnode.anchor = hydrateChildren(\n nextSibling(node),\n vnode,\n parentNode(node),\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n vnode.targetStart = targetNode;\n vnode.targetAnchor = targetNode && nextSibling(targetNode);\n } else {\n vnode.anchor = nextSibling(node);\n let targetAnchor = targetNode;\n while (targetAnchor) {\n if (targetAnchor && targetAnchor.nodeType === 8) {\n if (targetAnchor.data === \"teleport start anchor\") {\n vnode.targetStart = targetAnchor;\n } else if (targetAnchor.data === \"teleport anchor\") {\n vnode.targetAnchor = targetAnchor;\n target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);\n break;\n }\n }\n targetAnchor = nextSibling(targetAnchor);\n }\n if (!vnode.targetAnchor) {\n prepareAnchor(target, vnode, createText, insert);\n }\n hydrateChildren(\n targetNode && nextSibling(targetNode),\n vnode,\n target,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n }\n updateCssVars(vnode, disabled);\n }\n return vnode.anchor && nextSibling(vnode.anchor);\n}\nconst Teleport = TeleportImpl;\nfunction updateCssVars(vnode, isDisabled) {\n const ctx = vnode.ctx;\n if (ctx && ctx.ut) {\n let node, anchor;\n if (isDisabled) {\n node = vnode.el;\n anchor = vnode.anchor;\n } else {\n node = vnode.targetStart;\n anchor = vnode.targetAnchor;\n }\n while (node && node !== anchor) {\n if (node.nodeType === 1) node.setAttribute(\"data-v-owner\", ctx.uid);\n node = node.nextSibling;\n }\n ctx.ut();\n }\n}\nfunction prepareAnchor(target, vnode, createText, insert) {\n const targetStart = vnode.targetStart = createText(\"\");\n const targetAnchor = vnode.targetAnchor = createText(\"\");\n targetStart[TeleportEndKey] = targetAnchor;\n if (target) {\n insert(targetStart, target);\n insert(targetAnchor, target);\n }\n return targetAnchor;\n}\n\nconst leaveCbKey = Symbol(\"_leaveCb\");\nconst enterCbKey = Symbol(\"_enterCb\");\nfunction useTransitionState() {\n const state = {\n isMounted: false,\n isLeaving: false,\n isUnmounting: false,\n leavingVNodes: /* @__PURE__ */ new Map()\n };\n onMounted(() => {\n state.isMounted = true;\n });\n onBeforeUnmount(() => {\n state.isUnmounting = true;\n });\n return state;\n}\nconst TransitionHookValidator = [Function, Array];\nconst BaseTransitionPropsValidators = {\n mode: String,\n appear: Boolean,\n persisted: Boolean,\n // enter\n onBeforeEnter: TransitionHookValidator,\n onEnter: TransitionHookValidator,\n onAfterEnter: TransitionHookValidator,\n onEnterCancelled: TransitionHookValidator,\n // leave\n onBeforeLeave: TransitionHookValidator,\n onLeave: TransitionHookValidator,\n onAfterLeave: TransitionHookValidator,\n onLeaveCancelled: TransitionHookValidator,\n // appear\n onBeforeAppear: TransitionHookValidator,\n onAppear: TransitionHookValidator,\n onAfterAppear: TransitionHookValidator,\n onAppearCancelled: TransitionHookValidator\n};\nconst recursiveGetSubtree = (instance) => {\n const subTree = instance.subTree;\n return subTree.component ? recursiveGetSubtree(subTree.component) : subTree;\n};\nconst BaseTransitionImpl = {\n name: `BaseTransition`,\n props: BaseTransitionPropsValidators,\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const state = useTransitionState();\n return () => {\n const children = slots.default && getTransitionRawChildren(slots.default(), true);\n if (!children || !children.length) {\n return;\n }\n const child = findNonCommentChild(children);\n const rawProps = toRaw(props);\n const { mode } = rawProps;\n if (!!(process.env.NODE_ENV !== \"production\") && mode && mode !== \"in-out\" && mode !== \"out-in\" && mode !== \"default\") {\n warn$1(`invalid mode: ${mode}`);\n }\n if (state.isLeaving) {\n return emptyPlaceholder(child);\n }\n const innerChild = getInnerChild$1(child);\n if (!innerChild) {\n return emptyPlaceholder(child);\n }\n let enterHooks = resolveTransitionHooks(\n innerChild,\n rawProps,\n state,\n instance,\n // #11061, ensure enterHooks is fresh after clone\n (hooks) => enterHooks = hooks\n );\n if (innerChild.type !== Comment) {\n setTransitionHooks(innerChild, enterHooks);\n }\n let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree);\n if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(innerChild, oldInnerChild) && recursiveGetSubtree(instance).type !== Comment) {\n let leavingHooks = resolveTransitionHooks(\n oldInnerChild,\n rawProps,\n state,\n instance\n );\n setTransitionHooks(oldInnerChild, leavingHooks);\n if (mode === \"out-in\" && innerChild.type !== Comment) {\n state.isLeaving = true;\n leavingHooks.afterLeave = () => {\n state.isLeaving = false;\n if (!(instance.job.flags & 8)) {\n instance.update();\n }\n delete leavingHooks.afterLeave;\n oldInnerChild = void 0;\n };\n return emptyPlaceholder(child);\n } else if (mode === \"in-out\" && innerChild.type !== Comment) {\n leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {\n const leavingVNodesCache = getLeavingNodesForType(\n state,\n oldInnerChild\n );\n leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;\n el[leaveCbKey] = () => {\n earlyRemove();\n el[leaveCbKey] = void 0;\n delete enterHooks.delayedLeave;\n oldInnerChild = void 0;\n };\n enterHooks.delayedLeave = () => {\n delayedLeave();\n delete enterHooks.delayedLeave;\n oldInnerChild = void 0;\n };\n };\n } else {\n oldInnerChild = void 0;\n }\n } else if (oldInnerChild) {\n oldInnerChild = void 0;\n }\n return child;\n };\n }\n};\nfunction findNonCommentChild(children) {\n let child = children[0];\n if (children.length > 1) {\n let hasFound = false;\n for (const c of children) {\n if (c.type !== Comment) {\n if (!!(process.env.NODE_ENV !== \"production\") && hasFound) {\n warn$1(\n \" can only be used on a single element or component. Use for lists.\"\n );\n break;\n }\n child = c;\n hasFound = true;\n if (!!!(process.env.NODE_ENV !== \"production\")) break;\n }\n }\n }\n return child;\n}\nconst BaseTransition = BaseTransitionImpl;\nfunction getLeavingNodesForType(state, vnode) {\n const { leavingVNodes } = state;\n let leavingVNodesCache = leavingVNodes.get(vnode.type);\n if (!leavingVNodesCache) {\n leavingVNodesCache = /* @__PURE__ */ Object.create(null);\n leavingVNodes.set(vnode.type, leavingVNodesCache);\n }\n return leavingVNodesCache;\n}\nfunction resolveTransitionHooks(vnode, props, state, instance, postClone) {\n const {\n appear,\n mode,\n persisted = false,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n onBeforeAppear,\n onAppear,\n onAfterAppear,\n onAppearCancelled\n } = props;\n const key = String(vnode.key);\n const leavingVNodesCache = getLeavingNodesForType(state, vnode);\n const callHook = (hook, args) => {\n hook && callWithAsyncErrorHandling(\n hook,\n instance,\n 9,\n args\n );\n };\n const callAsyncHook = (hook, args) => {\n const done = args[1];\n callHook(hook, args);\n if (isArray(hook)) {\n if (hook.every((hook2) => hook2.length <= 1)) done();\n } else if (hook.length <= 1) {\n done();\n }\n };\n const hooks = {\n mode,\n persisted,\n beforeEnter(el) {\n let hook = onBeforeEnter;\n if (!state.isMounted) {\n if (appear) {\n hook = onBeforeAppear || onBeforeEnter;\n } else {\n return;\n }\n }\n if (el[leaveCbKey]) {\n el[leaveCbKey](\n true\n /* cancelled */\n );\n }\n const leavingVNode = leavingVNodesCache[key];\n if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {\n leavingVNode.el[leaveCbKey]();\n }\n callHook(hook, [el]);\n },\n enter(el) {\n let hook = onEnter;\n let afterHook = onAfterEnter;\n let cancelHook = onEnterCancelled;\n if (!state.isMounted) {\n if (appear) {\n hook = onAppear || onEnter;\n afterHook = onAfterAppear || onAfterEnter;\n cancelHook = onAppearCancelled || onEnterCancelled;\n } else {\n return;\n }\n }\n let called = false;\n const done = el[enterCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n if (cancelled) {\n callHook(cancelHook, [el]);\n } else {\n callHook(afterHook, [el]);\n }\n if (hooks.delayedLeave) {\n hooks.delayedLeave();\n }\n el[enterCbKey] = void 0;\n };\n if (hook) {\n callAsyncHook(hook, [el, done]);\n } else {\n done();\n }\n },\n leave(el, remove) {\n const key2 = String(vnode.key);\n if (el[enterCbKey]) {\n el[enterCbKey](\n true\n /* cancelled */\n );\n }\n if (state.isUnmounting) {\n return remove();\n }\n callHook(onBeforeLeave, [el]);\n let called = false;\n const done = el[leaveCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n remove();\n if (cancelled) {\n callHook(onLeaveCancelled, [el]);\n } else {\n callHook(onAfterLeave, [el]);\n }\n el[leaveCbKey] = void 0;\n if (leavingVNodesCache[key2] === vnode) {\n delete leavingVNodesCache[key2];\n }\n };\n leavingVNodesCache[key2] = vnode;\n if (onLeave) {\n callAsyncHook(onLeave, [el, done]);\n } else {\n done();\n }\n },\n clone(vnode2) {\n const hooks2 = resolveTransitionHooks(\n vnode2,\n props,\n state,\n instance,\n postClone\n );\n if (postClone) postClone(hooks2);\n return hooks2;\n }\n };\n return hooks;\n}\nfunction emptyPlaceholder(vnode) {\n if (isKeepAlive(vnode)) {\n vnode = cloneVNode(vnode);\n vnode.children = null;\n return vnode;\n }\n}\nfunction getInnerChild$1(vnode) {\n if (!isKeepAlive(vnode)) {\n if (isTeleport(vnode.type) && vnode.children) {\n return findNonCommentChild(vnode.children);\n }\n return vnode;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && vnode.component) {\n return vnode.component.subTree;\n }\n const { shapeFlag, children } = vnode;\n if (children) {\n if (shapeFlag & 16) {\n return children[0];\n }\n if (shapeFlag & 32 && isFunction(children.default)) {\n return children.default();\n }\n }\n}\nfunction setTransitionHooks(vnode, hooks) {\n if (vnode.shapeFlag & 6 && vnode.component) {\n vnode.transition = hooks;\n setTransitionHooks(vnode.component.subTree, hooks);\n } else if (vnode.shapeFlag & 128) {\n vnode.ssContent.transition = hooks.clone(vnode.ssContent);\n vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);\n } else {\n vnode.transition = hooks;\n }\n}\nfunction getTransitionRawChildren(children, keepComment = false, parentKey) {\n let ret = [];\n let keyedFragmentCount = 0;\n for (let i = 0; i < children.length; i++) {\n let child = children[i];\n const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);\n if (child.type === Fragment) {\n if (child.patchFlag & 128) keyedFragmentCount++;\n ret = ret.concat(\n getTransitionRawChildren(child.children, keepComment, key)\n );\n } else if (keepComment || child.type !== Comment) {\n ret.push(key != null ? cloneVNode(child, { key }) : child);\n }\n }\n if (keyedFragmentCount > 1) {\n for (let i = 0; i < ret.length; i++) {\n ret[i].patchFlag = -2;\n }\n }\n return ret;\n}\n\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineComponent(options, extraOptions) {\n return isFunction(options) ? (\n // #8236: extend call and options.name access are considered side-effects\n // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n ) : options;\n}\n\nfunction useId() {\n const i = getCurrentInstance();\n if (i) {\n return (i.appContext.config.idPrefix || \"v\") + \"-\" + i.ids[0] + i.ids[1]++;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `useId() is called when there is no active component instance to be associated with.`\n );\n }\n return \"\";\n}\nfunction markAsyncBoundary(instance) {\n instance.ids = [instance.ids[0] + instance.ids[2]++ + \"-\", 0, 0];\n}\n\nconst knownTemplateRefs = /* @__PURE__ */ new WeakSet();\nfunction useTemplateRef(key) {\n const i = getCurrentInstance();\n const r = shallowRef(null);\n if (i) {\n const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs;\n let desc;\n if (!!(process.env.NODE_ENV !== \"production\") && (desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable) {\n warn$1(`useTemplateRef('${key}') already exists.`);\n } else {\n Object.defineProperty(refs, key, {\n enumerable: true,\n get: () => r.value,\n set: (val) => r.value = val\n });\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `useTemplateRef() is called when there is no active component instance to be associated with.`\n );\n }\n const ret = !!(process.env.NODE_ENV !== \"production\") ? readonly(r) : r;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n knownTemplateRefs.add(ret);\n }\n return ret;\n}\n\nfunction setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {\n if (isArray(rawRef)) {\n rawRef.forEach(\n (r, i) => setRef(\n r,\n oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),\n parentSuspense,\n vnode,\n isUnmount\n )\n );\n return;\n }\n if (isAsyncWrapper(vnode) && !isUnmount) {\n if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) {\n setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree);\n }\n return;\n }\n const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;\n const value = isUnmount ? null : refValue;\n const { i: owner, r: ref } = rawRef;\n if (!!(process.env.NODE_ENV !== \"production\") && !owner) {\n warn$1(\n `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`\n );\n return;\n }\n const oldRef = oldRawRef && oldRawRef.r;\n const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;\n const setupState = owner.setupState;\n const rawSetupState = toRaw(setupState);\n const canSetSetupRef = setupState === EMPTY_OBJ ? () => false : (key) => {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (hasOwn(rawSetupState, key) && !isRef(rawSetupState[key])) {\n warn$1(\n `Template ref \"${key}\" used on a non-ref value. It will not work in the production build.`\n );\n }\n if (knownTemplateRefs.has(rawSetupState[key])) {\n return false;\n }\n }\n return hasOwn(rawSetupState, key);\n };\n if (oldRef != null && oldRef !== ref) {\n if (isString(oldRef)) {\n refs[oldRef] = null;\n if (canSetSetupRef(oldRef)) {\n setupState[oldRef] = null;\n }\n } else if (isRef(oldRef)) {\n oldRef.value = null;\n }\n }\n if (isFunction(ref)) {\n callWithErrorHandling(ref, owner, 12, [value, refs]);\n } else {\n const _isString = isString(ref);\n const _isRef = isRef(ref);\n if (_isString || _isRef) {\n const doSet = () => {\n if (rawRef.f) {\n const existing = _isString ? canSetSetupRef(ref) ? setupState[ref] : refs[ref] : ref.value;\n if (isUnmount) {\n isArray(existing) && remove(existing, refValue);\n } else {\n if (!isArray(existing)) {\n if (_isString) {\n refs[ref] = [refValue];\n if (canSetSetupRef(ref)) {\n setupState[ref] = refs[ref];\n }\n } else {\n ref.value = [refValue];\n if (rawRef.k) refs[rawRef.k] = ref.value;\n }\n } else if (!existing.includes(refValue)) {\n existing.push(refValue);\n }\n }\n } else if (_isString) {\n refs[ref] = value;\n if (canSetSetupRef(ref)) {\n setupState[ref] = value;\n }\n } else if (_isRef) {\n ref.value = value;\n if (rawRef.k) refs[rawRef.k] = value;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n };\n if (value) {\n doSet.id = -1;\n queuePostRenderEffect(doSet, parentSuspense);\n } else {\n doSet();\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n }\n}\n\nlet hasLoggedMismatchError = false;\nconst logMismatchError = () => {\n if (hasLoggedMismatchError) {\n return;\n }\n console.error(\"Hydration completed but contains mismatches.\");\n hasLoggedMismatchError = true;\n};\nconst isSVGContainer = (container) => container.namespaceURI.includes(\"svg\") && container.tagName !== \"foreignObject\";\nconst isMathMLContainer = (container) => container.namespaceURI.includes(\"MathML\");\nconst getContainerType = (container) => {\n if (container.nodeType !== 1) return void 0;\n if (isSVGContainer(container)) return \"svg\";\n if (isMathMLContainer(container)) return \"mathml\";\n return void 0;\n};\nconst isComment = (node) => node.nodeType === 8;\nfunction createHydrationFunctions(rendererInternals) {\n const {\n mt: mountComponent,\n p: patch,\n o: {\n patchProp,\n createText,\n nextSibling,\n parentNode,\n remove,\n insert,\n createComment\n }\n } = rendererInternals;\n const hydrate = (vnode, container) => {\n if (!container.hasChildNodes()) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`\n );\n patch(null, vnode, container);\n flushPostFlushCbs();\n container._vnode = vnode;\n return;\n }\n hydrateNode(container.firstChild, vnode, null, null, null);\n flushPostFlushCbs();\n container._vnode = vnode;\n };\n const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const isFragmentStart = isComment(node) && node.data === \"[\";\n const onMismatch = () => handleMismatch(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n isFragmentStart\n );\n const { type, ref, shapeFlag, patchFlag } = vnode;\n let domType = node.nodeType;\n vnode.el = node;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n def(node, \"__vnode\", vnode, true);\n def(node, \"__vueParentComponent\", parentComponent, true);\n }\n if (patchFlag === -2) {\n optimized = false;\n vnode.dynamicChildren = null;\n }\n let nextNode = null;\n switch (type) {\n case Text:\n if (domType !== 3) {\n if (vnode.children === \"\") {\n insert(vnode.el = createText(\"\"), parentNode(node), node);\n nextNode = node;\n } else {\n nextNode = onMismatch();\n }\n } else {\n if (node.data !== vnode.children) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text mismatch in`,\n node.parentNode,\n `\n - rendered on server: ${JSON.stringify(\n node.data\n )}\n - expected on client: ${JSON.stringify(vnode.children)}`\n );\n logMismatchError();\n node.data = vnode.children;\n }\n nextNode = nextSibling(node);\n }\n break;\n case Comment:\n if (isTemplateNode(node)) {\n nextNode = nextSibling(node);\n replaceNode(\n vnode.el = node.content.firstChild,\n node,\n parentComponent\n );\n } else if (domType !== 8 || isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = nextSibling(node);\n }\n break;\n case Static:\n if (isFragmentStart) {\n node = nextSibling(node);\n domType = node.nodeType;\n }\n if (domType === 1 || domType === 3) {\n nextNode = node;\n const needToAdoptContent = !vnode.children.length;\n for (let i = 0; i < vnode.staticCount; i++) {\n if (needToAdoptContent)\n vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data;\n if (i === vnode.staticCount - 1) {\n vnode.anchor = nextNode;\n }\n nextNode = nextSibling(nextNode);\n }\n return isFragmentStart ? nextSibling(nextNode) : nextNode;\n } else {\n onMismatch();\n }\n break;\n case Fragment:\n if (!isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateFragment(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n break;\n default:\n if (shapeFlag & 1) {\n if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateElement(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n } else if (shapeFlag & 6) {\n vnode.slotScopeIds = slotScopeIds;\n const container = parentNode(node);\n if (isFragmentStart) {\n nextNode = locateClosingAnchor(node);\n } else if (isComment(node) && node.data === \"teleport start\") {\n nextNode = locateClosingAnchor(node, node.data, \"teleport end\");\n } else {\n nextNode = nextSibling(node);\n }\n mountComponent(\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n optimized\n );\n if (isAsyncWrapper(vnode) && !vnode.type.__asyncResolved) {\n let subTree;\n if (isFragmentStart) {\n subTree = createVNode(Fragment);\n subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;\n } else {\n subTree = node.nodeType === 3 ? createTextVNode(\"\") : createVNode(\"div\");\n }\n subTree.el = node;\n vnode.component.subTree = subTree;\n }\n } else if (shapeFlag & 64) {\n if (domType !== 8) {\n nextNode = onMismatch();\n } else {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateChildren\n );\n }\n } else if (shapeFlag & 128) {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n getContainerType(parentNode(node)),\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateNode\n );\n } else if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) {\n warn$1(\"Invalid HostVNode type:\", type, `(${typeof type})`);\n }\n }\n if (ref != null) {\n setRef(ref, null, parentSuspense, vnode);\n }\n return nextNode;\n };\n const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;\n const forcePatch = type === \"input\" || type === \"option\";\n if (!!(process.env.NODE_ENV !== \"production\") || forcePatch || patchFlag !== -1) {\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n }\n let needCallTransitionHooks = false;\n if (isTemplateNode(el)) {\n needCallTransitionHooks = needTransition(\n null,\n // no need check parentSuspense in hydration\n transition\n ) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;\n const content = el.content.firstChild;\n if (needCallTransitionHooks) {\n transition.beforeEnter(content);\n }\n replaceNode(content, el, parentComponent);\n vnode.el = el = content;\n }\n if (shapeFlag & 16 && // skip if element has innerHTML / textContent\n !(props && (props.innerHTML || props.textContent))) {\n let next = hydrateChildren(\n el.firstChild,\n vnode,\n el,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n let hasWarned = false;\n while (next) {\n if (!isMismatchAllowed(el, 1 /* CHILDREN */)) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n el,\n `\nServer rendered element contains more child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n }\n const cur = next;\n next = next.nextSibling;\n remove(cur);\n }\n } else if (shapeFlag & 8) {\n let clientText = vnode.children;\n if (clientText[0] === \"\\n\" && (el.tagName === \"PRE\" || el.tagName === \"TEXTAREA\")) {\n clientText = clientText.slice(1);\n }\n if (el.textContent !== clientText) {\n if (!isMismatchAllowed(el, 0 /* TEXT */)) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text content mismatch on`,\n el,\n `\n - rendered on server: ${el.textContent}\n - expected on client: ${vnode.children}`\n );\n logMismatchError();\n }\n el.textContent = vnode.children;\n }\n }\n if (props) {\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ || forcePatch || !optimized || patchFlag & (16 | 32)) {\n const isCustomElement = el.tagName.includes(\"-\");\n for (const key in props) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && // #11189 skip if this node has directives that have created hooks\n // as it could have mutated the DOM in any possible way\n !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) {\n logMismatchError();\n }\n if (forcePatch && (key.endsWith(\"value\") || key === \"indeterminate\") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers\n key[0] === \".\" || isCustomElement) {\n patchProp(el, key, null, props[key], void 0, parentComponent);\n }\n }\n } else if (props.onClick) {\n patchProp(\n el,\n \"onClick\",\n null,\n props.onClick,\n void 0,\n parentComponent\n );\n } else if (patchFlag & 4 && isReactive(props.style)) {\n for (const key in props.style) props.style[key];\n }\n }\n let vnodeHooks;\n if (vnodeHooks = props && props.onVnodeBeforeMount) {\n invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n }\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n }\n if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {\n queueEffectWithSuspense(() => {\n vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n needCallTransitionHooks && transition.enter(el);\n dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n }, parentSuspense);\n }\n }\n return el.nextSibling;\n };\n const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!parentVNode.dynamicChildren;\n const children = parentVNode.children;\n const l = children.length;\n let hasWarned = false;\n for (let i = 0; i < l; i++) {\n const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);\n const isText = vnode.type === Text;\n if (node) {\n if (isText && !optimized) {\n if (i + 1 < l && normalizeVNode(children[i + 1]).type === Text) {\n insert(\n createText(\n node.data.slice(vnode.children.length)\n ),\n container,\n nextSibling(node)\n );\n node.data = vnode.children;\n }\n }\n node = hydrateNode(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n } else if (isText && !vnode.children) {\n insert(vnode.el = createText(\"\"), container);\n } else {\n if (!isMismatchAllowed(container, 1 /* CHILDREN */)) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n container,\n `\nServer rendered element contains fewer child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n }\n patch(\n null,\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n }\n }\n return node;\n };\n const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n const { slotScopeIds: fragmentSlotScopeIds } = vnode;\n if (fragmentSlotScopeIds) {\n slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n }\n const container = parentNode(node);\n const next = hydrateChildren(\n nextSibling(node),\n vnode,\n container,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n if (next && isComment(next) && next.data === \"]\") {\n return nextSibling(vnode.anchor = next);\n } else {\n logMismatchError();\n insert(vnode.anchor = createComment(`]`), container, next);\n return next;\n }\n };\n const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {\n if (!isMismatchAllowed(node.parentElement, 1 /* CHILDREN */)) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration node mismatch:\n- rendered on server:`,\n node,\n node.nodeType === 3 ? `(text)` : isComment(node) && node.data === \"[\" ? `(start of fragment)` : ``,\n `\n- expected on client:`,\n vnode.type\n );\n logMismatchError();\n }\n vnode.el = null;\n if (isFragment) {\n const end = locateClosingAnchor(node);\n while (true) {\n const next2 = nextSibling(node);\n if (next2 && next2 !== end) {\n remove(next2);\n } else {\n break;\n }\n }\n }\n const next = nextSibling(node);\n const container = parentNode(node);\n remove(node);\n patch(\n null,\n vnode,\n container,\n next,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n if (parentComponent) {\n parentComponent.vnode.el = vnode.el;\n updateHOCHostEl(parentComponent, vnode.el);\n }\n return next;\n };\n const locateClosingAnchor = (node, open = \"[\", close = \"]\") => {\n let match = 0;\n while (node) {\n node = nextSibling(node);\n if (node && isComment(node)) {\n if (node.data === open) match++;\n if (node.data === close) {\n if (match === 0) {\n return nextSibling(node);\n } else {\n match--;\n }\n }\n }\n }\n return node;\n };\n const replaceNode = (newNode, oldNode, parentComponent) => {\n const parentNode2 = oldNode.parentNode;\n if (parentNode2) {\n parentNode2.replaceChild(newNode, oldNode);\n }\n let parent = parentComponent;\n while (parent) {\n if (parent.vnode.el === oldNode) {\n parent.vnode.el = parent.subTree.el = newNode;\n }\n parent = parent.parent;\n }\n };\n const isTemplateNode = (node) => {\n return node.nodeType === 1 && node.tagName === \"TEMPLATE\";\n };\n return [hydrate, hydrateNode];\n}\nfunction propHasMismatch(el, key, clientValue, vnode, instance) {\n let mismatchType;\n let mismatchKey;\n let actual;\n let expected;\n if (key === \"class\") {\n actual = el.getAttribute(\"class\");\n expected = normalizeClass(clientValue);\n if (!isSetEqual(toClassSet(actual || \"\"), toClassSet(expected))) {\n mismatchType = 2 /* CLASS */;\n mismatchKey = `class`;\n }\n } else if (key === \"style\") {\n actual = el.getAttribute(\"style\") || \"\";\n expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue));\n const actualMap = toStyleMap(actual);\n const expectedMap = toStyleMap(expected);\n if (vnode.dirs) {\n for (const { dir, value } of vnode.dirs) {\n if (dir.name === \"show\" && !value) {\n expectedMap.set(\"display\", \"none\");\n }\n }\n }\n if (instance) {\n resolveCssVars(instance, vnode, expectedMap);\n }\n if (!isMapEqual(actualMap, expectedMap)) {\n mismatchType = 3 /* STYLE */;\n mismatchKey = \"style\";\n }\n } else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) {\n if (isBooleanAttr(key)) {\n actual = el.hasAttribute(key);\n expected = includeBooleanAttr(clientValue);\n } else if (clientValue == null) {\n actual = el.hasAttribute(key);\n expected = false;\n } else {\n if (el.hasAttribute(key)) {\n actual = el.getAttribute(key);\n } else if (key === \"value\" && el.tagName === \"TEXTAREA\") {\n actual = el.value;\n } else {\n actual = false;\n }\n expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;\n }\n if (actual !== expected) {\n mismatchType = 4 /* ATTRIBUTE */;\n mismatchKey = key;\n }\n }\n if (mismatchType != null && !isMismatchAllowed(el, mismatchType)) {\n const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}=\"${v}\"`;\n const preSegment = `Hydration ${MismatchTypeString[mismatchType]} mismatch on`;\n const postSegment = `\n - rendered on server: ${format(actual)}\n - expected on client: ${format(expected)}\n Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.\n You should fix the source of the mismatch.`;\n {\n warn$1(preSegment, el, postSegment);\n }\n return true;\n }\n return false;\n}\nfunction toClassSet(str) {\n return new Set(str.trim().split(/\\s+/));\n}\nfunction isSetEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const s of a) {\n if (!b.has(s)) {\n return false;\n }\n }\n return true;\n}\nfunction toStyleMap(str) {\n const styleMap = /* @__PURE__ */ new Map();\n for (const item of str.split(\";\")) {\n let [key, value] = item.split(\":\");\n key = key.trim();\n value = value && value.trim();\n if (key && value) {\n styleMap.set(key, value);\n }\n }\n return styleMap;\n}\nfunction isMapEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const [key, value] of a) {\n if (value !== b.get(key)) {\n return false;\n }\n }\n return true;\n}\nfunction resolveCssVars(instance, vnode, expectedMap) {\n const root = instance.subTree;\n if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) {\n const cssVars = instance.getCssVars();\n for (const key in cssVars) {\n expectedMap.set(\n `--${getEscapedCssVarName(key, false)}`,\n String(cssVars[key])\n );\n }\n }\n if (vnode === root && instance.parent) {\n resolveCssVars(instance.parent, instance.vnode, expectedMap);\n }\n}\nconst allowMismatchAttr = \"data-allow-mismatch\";\nconst MismatchTypeString = {\n [0 /* TEXT */]: \"text\",\n [1 /* CHILDREN */]: \"children\",\n [2 /* CLASS */]: \"class\",\n [3 /* STYLE */]: \"style\",\n [4 /* ATTRIBUTE */]: \"attribute\"\n};\nfunction isMismatchAllowed(el, allowedType) {\n if (allowedType === 0 /* TEXT */ || allowedType === 1 /* CHILDREN */) {\n while (el && !el.hasAttribute(allowMismatchAttr)) {\n el = el.parentElement;\n }\n }\n const allowedAttr = el && el.getAttribute(allowMismatchAttr);\n if (allowedAttr == null) {\n return false;\n } else if (allowedAttr === \"\") {\n return true;\n } else {\n const list = allowedAttr.split(\",\");\n if (allowedType === 0 /* TEXT */ && list.includes(\"children\")) {\n return true;\n }\n return allowedAttr.split(\",\").includes(MismatchTypeString[allowedType]);\n }\n}\n\nconst requestIdleCallback = getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1));\nconst cancelIdleCallback = getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id));\nconst hydrateOnIdle = (timeout = 1e4) => (hydrate) => {\n const id = requestIdleCallback(hydrate, { timeout });\n return () => cancelIdleCallback(id);\n};\nfunction elementIsVisibleInViewport(el) {\n const { top, left, bottom, right } = el.getBoundingClientRect();\n const { innerHeight, innerWidth } = window;\n return (top > 0 && top < innerHeight || bottom > 0 && bottom < innerHeight) && (left > 0 && left < innerWidth || right > 0 && right < innerWidth);\n}\nconst hydrateOnVisible = (opts) => (hydrate, forEach) => {\n const ob = new IntersectionObserver((entries) => {\n for (const e of entries) {\n if (!e.isIntersecting) continue;\n ob.disconnect();\n hydrate();\n break;\n }\n }, opts);\n forEach((el) => {\n if (!(el instanceof Element)) return;\n if (elementIsVisibleInViewport(el)) {\n hydrate();\n ob.disconnect();\n return false;\n }\n ob.observe(el);\n });\n return () => ob.disconnect();\n};\nconst hydrateOnMediaQuery = (query) => (hydrate) => {\n if (query) {\n const mql = matchMedia(query);\n if (mql.matches) {\n hydrate();\n } else {\n mql.addEventListener(\"change\", hydrate, { once: true });\n return () => mql.removeEventListener(\"change\", hydrate);\n }\n }\n};\nconst hydrateOnInteraction = (interactions = []) => (hydrate, forEach) => {\n if (isString(interactions)) interactions = [interactions];\n let hasHydrated = false;\n const doHydrate = (e) => {\n if (!hasHydrated) {\n hasHydrated = true;\n teardown();\n hydrate();\n e.target.dispatchEvent(new e.constructor(e.type, e));\n }\n };\n const teardown = () => {\n forEach((el) => {\n for (const i of interactions) {\n el.removeEventListener(i, doHydrate);\n }\n });\n };\n forEach((el) => {\n for (const i of interactions) {\n el.addEventListener(i, doHydrate, { once: true });\n }\n });\n return teardown;\n};\nfunction forEachElement(node, cb) {\n if (isComment(node) && node.data === \"[\") {\n let depth = 1;\n let next = node.nextSibling;\n while (next) {\n if (next.nodeType === 1) {\n const result = cb(next);\n if (result === false) {\n break;\n }\n } else if (isComment(next)) {\n if (next.data === \"]\") {\n if (--depth === 0) break;\n } else if (next.data === \"[\") {\n depth++;\n }\n }\n next = next.nextSibling;\n }\n } else {\n cb(node);\n }\n}\n\nconst isAsyncWrapper = (i) => !!i.type.__asyncLoader;\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineAsyncComponent(source) {\n if (isFunction(source)) {\n source = { loader: source };\n }\n const {\n loader,\n loadingComponent,\n errorComponent,\n delay = 200,\n hydrate: hydrateStrategy,\n timeout,\n // undefined = never times out\n suspensible = true,\n onError: userOnError\n } = source;\n let pendingRequest = null;\n let resolvedComp;\n let retries = 0;\n const retry = () => {\n retries++;\n pendingRequest = null;\n return load();\n };\n const load = () => {\n let thisRequest;\n return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {\n err = err instanceof Error ? err : new Error(String(err));\n if (userOnError) {\n return new Promise((resolve, reject) => {\n const userRetry = () => resolve(retry());\n const userFail = () => reject(err);\n userOnError(err, userRetry, userFail, retries + 1);\n });\n } else {\n throw err;\n }\n }).then((comp) => {\n if (thisRequest !== pendingRequest && pendingRequest) {\n return pendingRequest;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && !comp) {\n warn$1(\n `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`\n );\n }\n if (comp && (comp.__esModule || comp[Symbol.toStringTag] === \"Module\")) {\n comp = comp.default;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && comp && !isObject(comp) && !isFunction(comp)) {\n throw new Error(`Invalid async component load result: ${comp}`);\n }\n resolvedComp = comp;\n return comp;\n }));\n };\n return defineComponent({\n name: \"AsyncComponentWrapper\",\n __asyncLoader: load,\n __asyncHydrate(el, instance, hydrate) {\n const doHydrate = hydrateStrategy ? () => {\n const teardown = hydrateStrategy(\n hydrate,\n (cb) => forEachElement(el, cb)\n );\n if (teardown) {\n (instance.bum || (instance.bum = [])).push(teardown);\n }\n } : hydrate;\n if (resolvedComp) {\n doHydrate();\n } else {\n load().then(() => !instance.isUnmounted && doHydrate());\n }\n },\n get __asyncResolved() {\n return resolvedComp;\n },\n setup() {\n const instance = currentInstance;\n markAsyncBoundary(instance);\n if (resolvedComp) {\n return () => createInnerComp(resolvedComp, instance);\n }\n const onError = (err) => {\n pendingRequest = null;\n handleError(\n err,\n instance,\n 13,\n !errorComponent\n );\n };\n if (suspensible && instance.suspense || isInSSRComponentSetup) {\n return load().then((comp) => {\n return () => createInnerComp(comp, instance);\n }).catch((err) => {\n onError(err);\n return () => errorComponent ? createVNode(errorComponent, {\n error: err\n }) : null;\n });\n }\n const loaded = ref(false);\n const error = ref();\n const delayed = ref(!!delay);\n if (delay) {\n setTimeout(() => {\n delayed.value = false;\n }, delay);\n }\n if (timeout != null) {\n setTimeout(() => {\n if (!loaded.value && !error.value) {\n const err = new Error(\n `Async component timed out after ${timeout}ms.`\n );\n onError(err);\n error.value = err;\n }\n }, timeout);\n }\n load().then(() => {\n loaded.value = true;\n if (instance.parent && isKeepAlive(instance.parent.vnode)) {\n instance.parent.update();\n }\n }).catch((err) => {\n onError(err);\n error.value = err;\n });\n return () => {\n if (loaded.value && resolvedComp) {\n return createInnerComp(resolvedComp, instance);\n } else if (error.value && errorComponent) {\n return createVNode(errorComponent, {\n error: error.value\n });\n } else if (loadingComponent && !delayed.value) {\n return createVNode(loadingComponent);\n }\n };\n }\n });\n}\nfunction createInnerComp(comp, parent) {\n const { ref: ref2, props, children, ce } = parent.vnode;\n const vnode = createVNode(comp, props, children);\n vnode.ref = ref2;\n vnode.ce = ce;\n delete parent.vnode.ce;\n return vnode;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nconst KeepAliveImpl = {\n name: `KeepAlive`,\n // Marker for special handling inside the renderer. We are not using a ===\n // check directly on KeepAlive in the renderer, because importing it directly\n // would prevent it from being tree-shaken.\n __isKeepAlive: true,\n props: {\n include: [String, RegExp, Array],\n exclude: [String, RegExp, Array],\n max: [String, Number]\n },\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const sharedContext = instance.ctx;\n if (!sharedContext.renderer) {\n return () => {\n const children = slots.default && slots.default();\n return children && children.length === 1 ? children[0] : children;\n };\n }\n const cache = /* @__PURE__ */ new Map();\n const keys = /* @__PURE__ */ new Set();\n let current = null;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n instance.__v_cache = cache;\n }\n const parentSuspense = instance.suspense;\n const {\n renderer: {\n p: patch,\n m: move,\n um: _unmount,\n o: { createElement }\n }\n } = sharedContext;\n const storageContainer = createElement(\"div\");\n sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {\n const instance2 = vnode.component;\n move(vnode, container, anchor, 0, parentSuspense);\n patch(\n instance2.vnode,\n vnode,\n container,\n anchor,\n instance2,\n parentSuspense,\n namespace,\n vnode.slotScopeIds,\n optimized\n );\n queuePostRenderEffect(() => {\n instance2.isDeactivated = false;\n if (instance2.a) {\n invokeArrayFns(instance2.a);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n };\n sharedContext.deactivate = (vnode) => {\n const instance2 = vnode.component;\n invalidateMount(instance2.m);\n invalidateMount(instance2.a);\n move(vnode, storageContainer, null, 1, parentSuspense);\n queuePostRenderEffect(() => {\n if (instance2.da) {\n invokeArrayFns(instance2.da);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n instance2.isDeactivated = true;\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n };\n function unmount(vnode) {\n resetShapeFlag(vnode);\n _unmount(vnode, instance, parentSuspense, true);\n }\n function pruneCache(filter) {\n cache.forEach((vnode, key) => {\n const name = getComponentName(vnode.type);\n if (name && !filter(name)) {\n pruneCacheEntry(key);\n }\n });\n }\n function pruneCacheEntry(key) {\n const cached = cache.get(key);\n if (cached && (!current || !isSameVNodeType(cached, current))) {\n unmount(cached);\n } else if (current) {\n resetShapeFlag(current);\n }\n cache.delete(key);\n keys.delete(key);\n }\n watch(\n () => [props.include, props.exclude],\n ([include, exclude]) => {\n include && pruneCache((name) => matches(include, name));\n exclude && pruneCache((name) => !matches(exclude, name));\n },\n // prune post-render after `current` has been updated\n { flush: \"post\", deep: true }\n );\n let pendingCacheKey = null;\n const cacheSubtree = () => {\n if (pendingCacheKey != null) {\n if (isSuspense(instance.subTree.type)) {\n queuePostRenderEffect(() => {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }, instance.subTree.suspense);\n } else {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }\n }\n };\n onMounted(cacheSubtree);\n onUpdated(cacheSubtree);\n onBeforeUnmount(() => {\n cache.forEach((cached) => {\n const { subTree, suspense } = instance;\n const vnode = getInnerChild(subTree);\n if (cached.type === vnode.type && cached.key === vnode.key) {\n resetShapeFlag(vnode);\n const da = vnode.component.da;\n da && queuePostRenderEffect(da, suspense);\n return;\n }\n unmount(cached);\n });\n });\n return () => {\n pendingCacheKey = null;\n if (!slots.default) {\n return current = null;\n }\n const children = slots.default();\n const rawVNode = children[0];\n if (children.length > 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`KeepAlive should contain exactly one component child.`);\n }\n current = null;\n return children;\n } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {\n current = null;\n return rawVNode;\n }\n let vnode = getInnerChild(rawVNode);\n if (vnode.type === Comment) {\n current = null;\n return vnode;\n }\n const comp = vnode.type;\n const name = getComponentName(\n isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp\n );\n const { include, exclude, max } = props;\n if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {\n vnode.shapeFlag &= ~256;\n current = vnode;\n return rawVNode;\n }\n const key = vnode.key == null ? comp : vnode.key;\n const cachedVNode = cache.get(key);\n if (vnode.el) {\n vnode = cloneVNode(vnode);\n if (rawVNode.shapeFlag & 128) {\n rawVNode.ssContent = vnode;\n }\n }\n pendingCacheKey = key;\n if (cachedVNode) {\n vnode.el = cachedVNode.el;\n vnode.component = cachedVNode.component;\n if (vnode.transition) {\n setTransitionHooks(vnode, vnode.transition);\n }\n vnode.shapeFlag |= 512;\n keys.delete(key);\n keys.add(key);\n } else {\n keys.add(key);\n if (max && keys.size > parseInt(max, 10)) {\n pruneCacheEntry(keys.values().next().value);\n }\n }\n vnode.shapeFlag |= 256;\n current = vnode;\n return isSuspense(rawVNode.type) ? rawVNode : vnode;\n };\n }\n};\nconst KeepAlive = KeepAliveImpl;\nfunction matches(pattern, name) {\n if (isArray(pattern)) {\n return pattern.some((p) => matches(p, name));\n } else if (isString(pattern)) {\n return pattern.split(\",\").includes(name);\n } else if (isRegExp(pattern)) {\n pattern.lastIndex = 0;\n return pattern.test(name);\n }\n return false;\n}\nfunction onActivated(hook, target) {\n registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n let current = target;\n while (current) {\n if (current.isDeactivated) {\n return;\n }\n current = current.parent;\n }\n return hook();\n });\n injectHook(type, wrappedHook, target);\n if (target) {\n let current = target.parent;\n while (current && current.parent) {\n if (isKeepAlive(current.parent.vnode)) {\n injectToKeepAliveRoot(wrappedHook, type, target, current);\n }\n current = current.parent;\n }\n }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n const injected = injectHook(\n type,\n hook,\n keepAliveRoot,\n true\n /* prepend */\n );\n onUnmounted(() => {\n remove(keepAliveRoot[type], injected);\n }, target);\n}\nfunction resetShapeFlag(vnode) {\n vnode.shapeFlag &= ~256;\n vnode.shapeFlag &= ~512;\n}\nfunction getInnerChild(vnode) {\n return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n if (target) {\n const hooks = target[type] || (target[type] = []);\n const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n pauseTracking();\n const reset = setCurrentInstance(target);\n const res = callWithAsyncErrorHandling(hook, target, type, args);\n reset();\n resetTracking();\n return res;\n });\n if (prepend) {\n hooks.unshift(wrappedHook);\n } else {\n hooks.push(wrappedHook);\n }\n return wrappedHook;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, \"\"));\n warn$1(\n `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )\n );\n }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => {\n if (!isInSSRComponentSetup || lifecycle === \"sp\") {\n injectHook(lifecycle, (...args) => hook(...args), target);\n }\n};\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\n \"bu\"\n);\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\n \"bum\"\n);\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\n \"sp\"\n);\nconst onRenderTriggered = createHook(\"rtg\");\nconst onRenderTracked = createHook(\"rtc\");\nfunction onErrorCaptured(hook, target = currentInstance) {\n injectHook(\"ec\", hook, target);\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = Symbol.for(\"v-ndc\");\nfunction resolveDynamicComponent(component) {\n if (isString(component)) {\n return resolveAsset(COMPONENTS, component, false) || component;\n } else {\n return component || NULL_DYNAMIC_COMPONENT;\n }\n}\nfunction resolveDirective(name) {\n return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n const instance = currentRenderingInstance || currentInstance;\n if (instance) {\n const Component = instance.type;\n if (type === COMPONENTS) {\n const selfName = getComponentName(\n Component,\n false\n );\n if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n return Component;\n }\n }\n const res = (\n // local registration\n // check instance[type] first which is resolved for options API\n resolve(instance[type] || Component[type], name) || // global registration\n resolve(instance.appContext[type], name)\n );\n if (!res && maybeSelfReference) {\n return Component;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n }\n return res;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n );\n }\n}\nfunction resolve(registry, name) {\n return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nfunction renderList(source, renderItem, cache, index) {\n let ret;\n const cached = cache && cache[index];\n const sourceIsArray = isArray(source);\n if (sourceIsArray || isString(source)) {\n const sourceIsReactiveArray = sourceIsArray && isReactive(source);\n let needsWrap = false;\n if (sourceIsReactiveArray) {\n needsWrap = !isShallow(source);\n source = shallowReadArray(source);\n }\n ret = new Array(source.length);\n for (let i = 0, l = source.length; i < l; i++) {\n ret[i] = renderItem(\n needsWrap ? toReactive(source[i]) : source[i],\n i,\n void 0,\n cached && cached[i]\n );\n }\n } else if (typeof source === \"number\") {\n if (!!(process.env.NODE_ENV !== \"production\") && !Number.isInteger(source)) {\n warn$1(`The v-for range expect an integer value but got ${source}.`);\n }\n ret = new Array(source);\n for (let i = 0; i < source; i++) {\n ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);\n }\n } else if (isObject(source)) {\n if (source[Symbol.iterator]) {\n ret = Array.from(\n source,\n (item, i) => renderItem(item, i, void 0, cached && cached[i])\n );\n } else {\n const keys = Object.keys(source);\n ret = new Array(keys.length);\n for (let i = 0, l = keys.length; i < l; i++) {\n const key = keys[i];\n ret[i] = renderItem(source[key], key, i, cached && cached[i]);\n }\n }\n } else {\n ret = [];\n }\n if (cache) {\n cache[index] = ret;\n }\n return ret;\n}\n\nfunction createSlots(slots, dynamicSlots) {\n for (let i = 0; i < dynamicSlots.length; i++) {\n const slot = dynamicSlots[i];\n if (isArray(slot)) {\n for (let j = 0; j < slot.length; j++) {\n slots[slot[j].name] = slot[j].fn;\n }\n } else if (slot) {\n slots[slot.name] = slot.key ? (...args) => {\n const res = slot.fn(...args);\n if (res) res.key = slot.key;\n return res;\n } : slot.fn;\n }\n }\n return slots;\n}\n\nfunction renderSlot(slots, name, props = {}, fallback, noSlotted) {\n if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) {\n if (name !== \"default\") props.name = name;\n return openBlock(), createBlock(\n Fragment,\n null,\n [createVNode(\"slot\", props, fallback && fallback())],\n 64\n );\n }\n let slot = slots[name];\n if (!!(process.env.NODE_ENV !== \"production\") && slot && slot.length > 1) {\n warn$1(\n `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`\n );\n slot = () => [];\n }\n if (slot && slot._c) {\n slot._d = false;\n }\n openBlock();\n const validSlotContent = slot && ensureValidVNode(slot(props));\n const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch\n // key attached in the `createSlots` helper, respect that\n validSlotContent && validSlotContent.key;\n const rendered = createBlock(\n Fragment,\n {\n key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content\n (!validSlotContent && fallback ? \"_fb\" : \"\")\n },\n validSlotContent || (fallback ? fallback() : []),\n validSlotContent && slots._ === 1 ? 64 : -2\n );\n if (!noSlotted && rendered.scopeId) {\n rendered.slotScopeIds = [rendered.scopeId + \"-s\"];\n }\n if (slot && slot._c) {\n slot._d = true;\n }\n return rendered;\n}\nfunction ensureValidVNode(vnodes) {\n return vnodes.some((child) => {\n if (!isVNode(child)) return true;\n if (child.type === Comment) return false;\n if (child.type === Fragment && !ensureValidVNode(child.children))\n return false;\n return true;\n }) ? vnodes : null;\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n const ret = {};\n if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n warn$1(`v-on with no argument expects an object value.`);\n return ret;\n }\n for (const key in obj) {\n ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n }\n return ret;\n}\n\nconst getPublicInstance = (i) => {\n if (!i) return null;\n if (isStatefulComponent(i)) return getComponentPublicInstance(i);\n return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = (\n // Move PURE marker to new line to workaround compiler discarding it\n // due to type annotation\n /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n $: (i) => i,\n $el: (i) => i.vnode.el,\n $data: (i) => i.data,\n $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n $parent: (i) => getPublicInstance(i.parent),\n $root: (i) => getPublicInstance(i.root),\n $host: (i) => i.ce,\n $emit: (i) => i.emit,\n $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n $forceUpdate: (i) => i.f || (i.f = () => {\n queueJob(i.update);\n }),\n $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),\n $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n get({ _: instance }, key) {\n if (key === \"__v_skip\") {\n return true;\n }\n const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n return true;\n }\n let normalizedProps;\n if (key[0] !== \"$\") {\n const n = accessCache[key];\n if (n !== void 0) {\n switch (n) {\n case 1 /* SETUP */:\n return setupState[key];\n case 2 /* DATA */:\n return data[key];\n case 4 /* CONTEXT */:\n return ctx[key];\n case 3 /* PROPS */:\n return props[key];\n }\n } else if (hasSetupBinding(setupState, key)) {\n accessCache[key] = 1 /* SETUP */;\n return setupState[key];\n } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {\n accessCache[key] = 2 /* DATA */;\n return data[key];\n } else if (\n // only cache other properties when instance has declared (thus stable)\n // props\n (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)\n ) {\n accessCache[key] = 3 /* PROPS */;\n return props[key];\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n accessCache[key] = 0 /* OTHER */;\n }\n }\n const publicGetter = publicPropertiesMap[key];\n let cssModule, globalProperties;\n if (publicGetter) {\n if (key === \"$attrs\") {\n track(instance.attrs, \"get\", \"\");\n !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n track(instance, \"get\", key);\n }\n return publicGetter(instance);\n } else if (\n // css module (injected by vue-loader)\n (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n ) {\n return cssModule;\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (\n // global properties\n globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n ) {\n {\n return globalProperties[key];\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n // to infinite warning loop\n key.indexOf(\"__v\") !== 0)) {\n if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n warn$1(\n `Property ${JSON.stringify(\n key\n )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n );\n } else if (instance === currentRenderingInstance) {\n warn$1(\n `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n );\n }\n }\n },\n set({ _: instance }, key, value) {\n const { data, setupState, ctx } = instance;\n if (hasSetupBinding(setupState, key)) {\n setupState[key] = value;\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n warn$1(`Cannot mutate \n\n\n","\n\n\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M10 1c-1.716 0-3.408.106-5.07.31C3.806 1.45 3 2.414 3 3.517V16.75A2.25 2.25 0 0 0 5.25 19h9.5A2.25 2.25 0 0 0 17 16.75V3.517c0-1.103-.806-2.068-1.93-2.207A41.403 41.403 0 0 0 10 1ZM5.99 8.75A.75.75 0 0 1 6.74 8h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm-.75 2.916a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm1.417-5.75a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm-.75 2.916a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm1.42-5.75a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm-.75 2.916a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01ZM12.5 8.75a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75v-.01Zm.75 1.417a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 0 0 .75-.75v-.01a.75.75 0 0 0-.75-.75h-.01Zm0 2.166a.75.75 0 0 1 .75.75v2.167a.75.75 0 1 1-1.5 0v-2.167a.75.75 0 0 1 .75-.75ZM6.75 4a.75.75 0 0 0-.75.75v.5c0 .414.336.75.75.75h6.5a.75.75 0 0 0 .75-.75v-.5a.75.75 0 0 0-.75-.75h-6.5Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M9.47 6.47a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 1 1-1.06 1.06L10 8.06l-3.72 3.72a.75.75 0 0 1-1.06-1.06l4.25-4.25Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Zm7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06ZM11.377 2.011a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"M10 12.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z\" }),\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M.664 10.59a1.651 1.651 0 0 1 0-1.186A10.004 10.004 0 0 1 10 3c4.257 0 7.893 2.66 9.336 6.41.147.381.146.804 0 1.186A10.004 10.004 0 0 1 10 17c-4.257 0-7.893-2.66-9.336-6.41ZM14 10a4 4 0 1 1-8 0 4 4 0 0 1 8 0Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M10 2.5c-1.31 0-2.526.386-3.546 1.051a.75.75 0 0 1-.82-1.256A8 8 0 0 1 18 9a22.47 22.47 0 0 1-1.228 7.351.75.75 0 1 1-1.417-.49A20.97 20.97 0 0 0 16.5 9 6.5 6.5 0 0 0 10 2.5ZM4.333 4.416a.75.75 0 0 1 .218 1.038A6.466 6.466 0 0 0 3.5 9a7.966 7.966 0 0 1-1.293 4.362.75.75 0 0 1-1.257-.819A6.466 6.466 0 0 0 2 9c0-1.61.476-3.11 1.295-4.365a.75.75 0 0 1 1.038-.219ZM10 6.12a3 3 0 0 0-3.001 3.041 11.455 11.455 0 0 1-2.697 7.24.75.75 0 0 1-1.148-.965A9.957 9.957 0 0 0 5.5 9c0-.028.002-.055.004-.082a4.5 4.5 0 0 1 8.996.084V9.15l-.005.297a.75.75 0 1 1-1.5-.034c.003-.11.004-.219.005-.328a3 3 0 0 0-3-2.965Zm0 2.13a.75.75 0 0 1 .75.75c0 3.51-1.187 6.745-3.181 9.323a.75.75 0 1 1-1.186-.918A13.687 13.687 0 0 0 9.25 9a.75.75 0 0 1 .75-.75Zm3.529 3.698a.75.75 0 0 1 .584.885 18.883 18.883 0 0 1-2.257 5.84.75.75 0 1 1-1.29-.764 17.386 17.386 0 0 0 2.078-5.377.75.75 0 0 1 .885-.584Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M2.628 1.601C5.028 1.206 7.49 1 10 1s4.973.206 7.372.601a.75.75 0 0 1 .628.74v2.288a2.25 2.25 0 0 1-.659 1.59l-4.682 4.683a2.25 2.25 0 0 0-.659 1.59v3.037c0 .684-.31 1.33-.844 1.757l-1.937 1.55A.75.75 0 0 1 8 18.25v-5.757a2.25 2.25 0 0 0-.659-1.591L2.659 6.22A2.25 2.25 0 0 1 2 4.629V2.34a.75.75 0 0 1 .628-.74Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"M14.916 2.404a.75.75 0 0 1-.32 1.011l-.596.31V17a1 1 0 0 1-1 1h-2.26a.75.75 0 0 1-.75-.75v-3.5a.75.75 0 0 0-.75-.75H6.75a.75.75 0 0 0-.75.75v3.5a.75.75 0 0 1-.75.75h-3.5a.75.75 0 0 1 0-1.5H2V9.957a.75.75 0 0 1-.596-1.372L2 8.275V5.75a.75.75 0 0 1 1.5 0v1.745l10.404-5.41a.75.75 0 0 1 1.012.319ZM15.861 8.57a.75.75 0 0 1 .736-.025l1.999 1.04A.75.75 0 0 1 18 10.957V16.5h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1-.75-.75V9.21a.75.75 0 0 1 .361-.64Z\" })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M9.293 2.293a1 1 0 0 1 1.414 0l7 7A1 1 0 0 1 17 11h-1v6a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-3a1 1 0 0 0-1-1H9a1 1 0 0 0-1 1v3a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-6H3a1 1 0 0 1-.707-1.707l7-7Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z\" }),\n _createElementVNode(\"path\", { d: \"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z\" })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM6.75 9.25a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5h-6.5Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"M15.993 1.385a1.87 1.87 0 0 1 2.623 2.622l-4.03 5.27a12.749 12.749 0 0 1-4.237 3.562 4.508 4.508 0 0 0-3.188-3.188 12.75 12.75 0 0 1 3.562-4.236l5.27-4.03ZM6 11a3 3 0 0 0-3 3 .5.5 0 0 1-.72.45.75.75 0 0 0-1.035.931A4.001 4.001 0 0 0 9 14.004V14a3.01 3.01 0 0 0-1.66-2.685A2.99 2.99 0 0 0 6 11Z\" })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm.75-11.25a.75.75 0 0 0-1.5 0v2.5h-2.5a.75.75 0 0 0 0 1.5h2.5v2.5a.75.75 0 0 0 1.5 0v-2.5h2.5a.75.75 0 0 0 0-1.5h-2.5v-2.5Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"M4.464 3.162A2 2 0 0 1 6.28 2h7.44a2 2 0 0 1 1.816 1.162l1.154 2.5c.067.145.115.291.145.438A3.508 3.508 0 0 0 16 6H4c-.288 0-.568.035-.835.1.03-.147.078-.293.145-.438l1.154-2.5Z\" }),\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M2 9.5a2 2 0 0 1 2-2h12a2 2 0 1 1 0 4H4a2 2 0 0 1-2-2Zm13.24 0a.75.75 0 0 1 .75-.75H16a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75V9.5Zm-2.25-.75a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75H13a.75.75 0 0 0 .75-.75V9.5a.75.75 0 0 0-.75-.75h-.01ZM2 15a2 2 0 0 1 2-2h12a2 2 0 1 1 0 4H4a2 2 0 0 1-2-2Zm13.24 0a.75.75 0 0 1 .75-.75H16a.75.75 0 0 1 .75.75v.01a.75.75 0 0 1-.75.75h-.01a.75.75 0 0 1-.75-.75V15Zm-2.25-.75a.75.75 0 0 0-.75.75v.01c0 .414.336.75.75.75H13a.75.75 0 0 0 .75-.75V15a.75.75 0 0 0-.75-.75h-.01Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-5.5-2.5a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0ZM10 12a5.99 5.99 0 0 0-4.793 2.39A6.483 6.483 0 0 0 10 16.5a6.483 6.483 0 0 0 4.793-2.11A5.99 5.99 0 0 0 10 12Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"M3.25 4A2.25 2.25 0 0 0 1 6.25v7.5A2.25 2.25 0 0 0 3.25 16h7.5A2.25 2.25 0 0 0 13 13.75v-7.5A2.25 2.25 0 0 0 10.75 4h-7.5ZM19 4.75a.75.75 0 0 0-1.28-.53l-3 3a.75.75 0 0 0-.22.53v4.5c0 .199.079.39.22.53l3 3a.75.75 0 0 0 1.28-.53V4.75Z\" })\n ]))\n}","export interface BuildingCodeItem {\n name: string\n selected?: boolean\n children?: BuildingCodeItem[]\n}\n\n/**\n * BASAB codes for buildingParts\n */\nexport const BSAB96: BuildingCodeItem[] = [\n {\n name: '0 SANERING OCH RIVNING',\n children: [\n { name: '00 Sammansatta', selected: false },\n { name: '01 Demontoring', selected: false },\n { name: '02 Sanering och lätt rivning', selected: false },\n { name: '03 Tung rivning', selected: false },\n { name: '04 Efterlagning', selected: false },\n { name: '06 Håltagning', selected: false },\n { name: '07 Arbeten för installationer', selected: false },\n ],\n },\n {\n name: '1 MARK',\n children: [\n { name: '10 Sammansatta', selected: false },\n { name: '11 Röjning, rivning och flyttning', selected: false },\n { name: '12 Schakter, fyllning', selected: false },\n { name: '13 Markförstärkning, dränering', selected: false },\n { name: '15 Ledningar, kulvertar, tunnlar', selected: false },\n { name: '16 Vägar, planer', selected: false },\n { name: '17 Trädgård', selected: false },\n { name: '18 Markrutt, Stödmurar, komplementbyggnader', selected: false },\n { name: '19 Mark övrigt', selected: false },\n ],\n },\n {\n name: '2. HUSUNDERBYGGNAD',\n children: [\n { name: '20 Sammansatta', selected: false },\n\t\t\t{ name: '22 Schakt, fyllning', selected: false },\n { name: '23 Markförstärkning, dränering', selected: false },\n { name: '24 Grundkonstruktioner', selected: false },\n { name: '25 Kulvertar, tunnlar', selected: false },\n { name: '26 Garage', selected: false },\n { name: '27 Platta på mark', selected: false },\n { name: '28 Huskomplementering, husunderbyggnad', selected: false },\n { name: '29 Husunderbyggnad övrigt', selected: false },\n ],\n },\n {\n name: '3. STOMME',\n children: [\n { name: '30 Sammansatta', selected: false },\n { name: '31 Stomme - väggar', selected: false },\n { name: '32 Stomme - pelare', selected: false },\n { name: '33 Prefab', selected: false },\n { name: '34 Stomme bjälklag, balkar', selected: false },\n { name: '35 Smide', selected: false },\n { name: '36 Stomme, trappor, hisschakt', selected: false },\n { name: '37 Samverkande takstomme', selected: false },\n { name: '38 Huskomplementering, stomme', selected: false },\n { name: '39 Stomme övrigt', selected: false },\n ],\n },\n {\n name: '4. YTTERTAK',\n children: [\n { name: '40 Sammansatta', selected: false },\n { name: '41 Tak-stomme', selected: false },\n { name: '42 Taklagskomplettering', selected: false },\n { name: '43 Taktäckning', selected: false },\n { name: '44 Takfot och gavlar', selected: false },\n { name: '45 Öppningskompletteringar, yttertak', selected: false },\n { name: '46 Plåt', selected: false },\n { name: '47 Terasstak, altaner', selected: false },\n { name: '48 Huskomplettering, yttertak', selected: false },\n { name: '49 Yttertak övrigt', selected: false },\n ],\n },\n {\n name: '5. FASADER',\n children: [\n { name: '50 Sammansatta', selected: false },\n { name: '51 Stomkomplement, utfackning', selected: false },\n { name: '53 Fasadbeklädnad', selected: false },\n { name: '55 Fönster, dörrar, partier, portar', selected: false },\n { name: '58 Huskomplettering ytterväggar', selected: false },\n { name: '59 Ytterväggar övrigt', selected: false },\n ],\n },\n {\n name: '6. STOMKOMPL. RUMSBILDN.',\n children: [\n { name: '60 Sammansatta', selected: false },\n { name: '61 Insida yttervägg', selected: false },\n { name: '62 Undergolv', selected: false },\n { name: '63 Innerväggar', selected: false },\n { name: '64 Innertak', selected: false },\n { name: '65 Invändiga dörrar, glaspartier', selected: false },\n { name: '66 Invändiga trappor', selected: false },\n { name: '68 Huskomplettering, rumsbildning', selected: false },\n { name: '69 Rumsbildning övrigt', selected: false },\n ],\n },\n {\n name: '7. INVÄNDIGA YTSKIKT RUMSKOMPL.',\n children: [\n { name: '70 Sammansatta', selected: false },\n { name: '72 Ytskikt golv, sporer', selected: false },\n { name: '73 Ytskikt vägg', selected: false },\n { name: '74 Ytskikt tak, undertak', selected: false },\n { name: '75 Målning', selected: false },\n { name: '76 Vitvaror', selected: false },\n { name: '77 Skåpsinsikter', selected: false },\n { name: '78 Rumsinsikter', selected: false },\n { name: '79 Rumsinsikter övrigt', selected: false },\n ],\n },\n {\n name: '8 INSTALLATIONER',\n children: [\n { name: '80 Sammansatta', selected: false },\n { name: '82 Process', selected: false },\n { name: '83 Storkök', selected: false },\n { name: '84 Sanitet, värme', selected: false },\n { name: '85 Kyla, luft', selected: false },\n { name: '86 El', selected: false },\n { name: '87 Transport', selected: false },\n { name: '88 Styr och regler', selected: false },\n { name: '89 Installationer övrigt', selected: false },\n ],\n },\n {\n name: '9. GEMENSAMMA ARBETEN',\n children: [\n { name: '90 Gemensamma arbeten sammansatta', selected: false },\n { name: '91 Gemensamma arbeten', selected: false },\n ],\n },\n]\n\n/**\n * Generic building codes\n */\nexport const generic: BuildingCodeItem[] = [\n {\n name: \"1. Substructure\",\n children: [\n { name: \"1.1 Foundations\", selected: false },\n { name: \"1.2 Basement Construction\" }\n ]\n },\n {\n name: \"2. Superstructure\",\n children: [\n { name: \"2.1 Structural Frame\", selected: false },\n { name: \"2.2 External Walls\", selected: false },\n { name: \"2.3 Internal Walls\", selected: false },\n { name: \"2.4 Upper Floors\", selected: false },\n { name: \"2.5 Roof Structure\", selected: false }\n ]\n },\n {\n name: \"3. Finishes\",\n children: [\n { name: \"3.1 Wall Finishes\", selected: false },\n { name: \"3.2 Floor Finishes\", selected: false },\n { name: \"3.3 Ceiling Finishes\", selected: false }\n ]\n },\n {\n name: \"4. Fittings and Furnishings\",\n children: [\n { name: \"4.1 Fixed Furniture\", selected: false },\n { name: \"4.2 Movable Furniture\", selected: false }\n ]\n },\n {\n name: \"5. Building Services\",\n children: [\n { name: \"5.1 Heating, Ventilation, and Air Conditioning (HVAC)\", selected: false },\n { name: \"5.2 Electrical Installations\", selected: false },\n { name: \"5.3 Plumbing Installations\", selected: false },\n { name: \"5.4 Fire Protection Systems\", selected: false }\n ]\n },\n {\n name: \"6. External Works\",\n children: [\n { name: \"6.1 Landscaping\", selected: false },\n { name: \"6.2 Site Infrastructure\", selected: false }\n ]\n }\n]\n\n/**\n * List of building codes\n * Add new codes here\n */\nexport const buildingCodes: { [key:string]: BuildingCodeItem[] } = {\n BSAB96: BSAB96,\n generic: generic\n}","import type { LifeCycleStage } from \"lcax\"\nimport type { ExtendedImpactCategoryKey } from '@/models/material'\nimport type { BuildingCodeItem } from '@/models/buildingCode'\nimport { BSAB96 } from '@/models/buildingCode'\n\n/**\n * Settings for external connections such as API keys and configurations\n */\nexport interface KeySettings {\n materialKeys: MaterialKeys,\n githubApiKey: string\n firebaseConfig: FirebaseConfig\n speckleConfig: SpeckleConfig\n}\n\nexport interface CalculationSettings {\n includedStages: IncludedStages\n standardImpactCategory: ExtendedImpactCategoryKey\n buildingCode: {\n key: string,\n data: BuildingCodeItem[],\n },\n}\n\nexport interface MaterialSettings {\n epdSource: EPDSource\n}\n\nexport interface AppSettings {\n colorscheme: string\n area: number\n}\n\nexport enum EPDSource {\n EcoPortal,\n Revalu,\n LCAByg,\n Other\n}\n\nexport interface SettingView {\n name: string,\n icon: any,\n current: boolean\n}\n\n\ninterface SpeckleConfig {\n serverUrl: string\n id: string\n secret: string\n}\n\n/**\n * Configuration for firebase, this is using an auto creation of users to the project\n * TODO: Check if this is the best way or move to Speckle\n */\ninterface FirebaseConfig {\n apiKey: string\n authDomain: string\n projectId: string\n storageBucket: string\n messagingSenderId: string\n appId: string\n measurementId: string\n}\n\n/**\n * External API keys, add more here if needed\n */\ninterface MaterialKeys {\n revalu: string\n ecoPortal: string\n}\n\n/**\n * Simple interface for stage inclusion\n */\ninterface IncludedStages {\n relevantStages: Array<{\n included: boolean\n stage: LifeCycleStage\n }>\n}\n\n/**\n * Default settings for the application\n * TODO Move the project specific settings to a seperate interface?\n */\nexport const standardAppSettings: AppSettings = {\n colorscheme: 'light',\n area: 1000\n}\n\n/**\n * Default settings for the material settings\n */\nexport const standardKeySettings: KeySettings = {\n materialKeys: {\n revalu: null,\n ecoPortal: null\n },\n githubApiKey: null,\n firebaseConfig: {\n apiKey: null,\n authDomain: \"specklca.firebaseapp.com\",\n projectId: \"specklca\",\n storageBucket: \"specklca.appspot.com\",\n messagingSenderId: \"660785821928\",\n appId: \"1:660785821928:web:236a8b63b72bf6abcc715d\",\n measurementId: \"G-EKQGVJLEEG\"\n },\n speckleConfig: {\n serverUrl: \"https://app.speckle.systems\",\n id: \"25477842e5\",\n secret: \"c5a683ccc4\"\n }\n}\n\nexport const standardCalculationSettings: CalculationSettings = {\n includedStages: {\n relevantStages: [\n { included: true, stage: \"a1a3\" as LifeCycleStage }, // Manufacturing\n { included: true, stage: \"a4\" as LifeCycleStage }, // Transport\n { included: true, stage: \"a5\" as LifeCycleStage }, // Assembly\n { included: true, stage: \"b1\" as LifeCycleStage }, // Use\n { included: true, stage: \"c1\" as LifeCycleStage }, // End of life\n ]\n },\n standardImpactCategory: 'gwp',\n buildingCode: {\n key: 'BSAB96',\n data: BSAB96\n }\n}\n\nexport const standardMaterialSettings: MaterialSettings = {\n epdSource: EPDSource.Revalu\n}","import { defineStore } from 'pinia'\n\nimport { \n\tstandardAppSettings, \n\tstandardCalculationSettings, \n\tstandardKeySettings,\n\tstandardMaterialSettings,\n} from '@/models/settings'\nimport type { \n\tAppSettings,\n\tCalculationSettings,\n\tKeySettings,\n\tMaterialSettings,\n } from '@/models/settings'\n\nexport const useSettingsStore = defineStore({\n\tid: 'settingsStore',\n\tstate: () => {\n\t\treturn {\n\t\t\tappSettings: standardAppSettings as AppSettings, // Application settings\n\t\t\tcalculationSettings: standardCalculationSettings as CalculationSettings, // Calculation settings\n\t\t\tkeySettings: standardKeySettings as KeySettings, // Key settings\n\t\t\tmaterialSettings: standardMaterialSettings as MaterialSettings // Material settings\n\t\t}\n\t},\n\t// Save the store to local storage so we dont have to create new settings every time\n\tpersist: {\n storage: localStorage,\n\t\tafterHydrate: (ctx) => {\n console.log(`just hydrated '${ctx.store.$id}'`)\n }\n\t},\n\tactions: {\n\t\t\n\t\t/**\n\t\t * Updates the firebase configuration in the app settings.\n\t\t * @param firebaseConfig The new firebase configuration.\n\t\t */\n\t\tupdateFirebaseSettings(firebaseConfig: KeySettings['firebaseConfig']) {\n\t\t\tthis.keySettings.firebaseConfig = firebaseConfig\n\t\t},\n\n\t\t/**\n\t\t * Updates the speckle configuration in the app settings.\n\t\t * @param speckleConfig The new speckle configuration.\n\t\t */\n\t\tupdateSpeckleSettings(speckleConfig: KeySettings['speckleConfig']) {\n\t\t\tthis.keySettings.speckleConfig = speckleConfig\n\t\t},\n\n\t\t/**\n\t\t * Updates the material keys in the app settings.\n\t\t * @param materialKeys The new material keys.\n\t\t */\n\t\tupdateMaterialKeys(materialKeys: KeySettings['materialKeys']) {\n\t\t\tthis.keySettings.materialKeys = materialKeys\n\t\t},\n\n\t\t/**\n\t\t * Updates the EPD source in the app settings.\n\t\t * @param epdSource The new EPD source.\n\t\t */\n\t\tupdateEPDSource(epdSource: MaterialSettings['epdSource']) {\n\t\t\tthis.materialSettings.epdSource = epdSource\n\t\t},\n\n\t\t\n\t\tupdateGithubApiKey(githubApiKey: KeySettings['githubApiKey']) {\n\t\t\tthis.keySettings.githubApiKey = githubApiKey\n\t\t},\n\n\t\t/**\n\t\t * Updates the included stages in the app settings.\n\t\t * @param includedStages The new included stages.\n\t\t */\n\t\tupdateIncludedStages(includedStages: CalculationSettings['includedStages']) {\n\t\t\tthis.calculationSettings.includedStages = includedStages\n\t\t},\n\n\t\t/**\n\t\t * Updates the standard impact category in the app settings.\n\t\t * @param standardImpactCategory The new standard impact category.\n\t\t */\n\t\tupdateStandardImpactCategory(standardImpactCategory: CalculationSettings['standardImpactCategory']) {\n\t\t\tthis.calculationSettings.standardImpactCategory = standardImpactCategory\n\t\t},\n\n\t\t/**\n\t\t * Updates the building code in the app settings.\n\t\t * @param buildingCode The new building code.\n\t\t */\n\t\tupdateBuildingCode(buildingCode: CalculationSettings['buildingCode']) {\n\t\t\tthis.calculationSettings.buildingCode = buildingCode\n\t\t},\n\n\t\tupdateArea(area: AppSettings['area']) {\n\t\t\tthis.appSettings.area = area\n\t\t},\n\t}\n})","export default \"__VITE_ASSET__c2b3a5f0__\"","export default \"__VITE_ASSET__0919f98b__\"","\n\n","\n\n","\n\n","import type { Emission } from '@/models/material'\nimport type { Quantity } from '@/models/geometryObject'\n\n/**\n * Grouped results interface to store the results grouped by a parameter\n * These are for precalculated aggregated results.\n */\nexport interface GroupedResults{\n parameter: string\n data: GroupedEmission\n quantity?: Quantity\n nested?: GroupedResults[]\n}\n\n/**\n * Grouped emission interface to store the emission grouped by a parameter\n */\ninterface GroupedEmission {\n emission: Emission\n geoId: string[]\n}\n\n/**\n * Main interface for storing results, this is the main object that is stored in the database.\n * It contains the results for each parameter that is grouped on and the result with correlation to ids.\n */\nexport interface ResultItem {\n parameter: string\n displayName: string\n data: GroupedResults[]\n}\n\nexport type ResultList = ResultItem[]\n\n/**\n * Predefined list of ResultItem objects for default use\n */\nexport const DefaultResultList: ResultList = [\n { parameter: 'parameters.category', displayName: 'Category', data: [] },\n { parameter: 'material.name', displayName: 'Material', data: [] },\n { parameter: 'material.metaData.materialType', displayName: 'Material Type', data: [] },\n { parameter: 'BSABCodes', displayName: 'BSAB Codes', data: [] },\n { parameter: 'parameters.speckle_type', displayName: 'Speckle Type', data: [] },\n]\n\n/**\n * Results are stored as Impact Category, Life Cycle Stage then emission value.\n * Optional parameter for aggregated results and what parameter is grouped on.\n * ID and date is just for documentation.\n */\nexport interface Results {\n\tid: string // Run ID for results.\n\tdate: Date\n\temission: Emission\n}","import { defineStore } from 'pinia'\n\nimport type { \n ResultList,\n} from '@/models/result'\n\nimport { DefaultResultList } from '@/models/result'\n\nimport type { Results } from '@/models/result'\n\n/**\n * Defines the result store, which is used to store the results of the calculations\n * Aggregates and provides some chartdata for use\n */\nexport const useResultStore = defineStore({\n\tid: 'resultStore',\n\tstate: () => {\n\t\treturn {\n aggregatedResults: [] as Results[],\n resultList: DefaultResultList,\n activeParameter: 'parameters.category', // Default active parameter for result filtering in resultLists TODO: Is this needed?\n reloadChartData: true, // Boolean to reload the chart data\n\t\t}\n\t},\n actions: {\n /**\n * Updates resultList\n * @param resultList resultList to update with\n */\n setResultList(resultList: ResultList) {\n this.resultList = resultList\n },\n\n /**\n * Returns the grouped results for a specific id or all if empty\n * @param id \n * @returns \n */\n getGroupedResults(id: string = 'all') {\n if (id === 'all') {\n return this.resultList\n }\n if (this.resultList[id]) {\n return { [id]: this.resultList[id] }\n }\n return {}\n },\n\n /**\n * Toggle the reloadChartData boolean\n */\n toggleReloadData() {\n this.reloadChartData = !this.reloadChartData\n },\n\n /**\n * Set the reloadChartData boolean\n * @param reload \n */\n setReloadData(reload: boolean) {\n this.reloadChartData = reload\n },\n\n /**\n * Set the active parameter for result filtering\n * @param parameter \n */\n setActiveParameter(parameter: string) {\n this.activeParameter = parameter\n },\n }\n \n})","import { min, max } from './index.js';\n\nexport default (x, low = 0, high = 1) => {\n return min(max(low, x), high);\n};\n","import limit from './limit.js';\n\nexport default (rgb) => {\n rgb._clipped = false;\n rgb._unclipped = rgb.slice(0);\n for (let i = 0; i <= 3; i++) {\n if (i < 3) {\n if (rgb[i] < 0 || rgb[i] > 255) rgb._clipped = true;\n rgb[i] = limit(rgb[i], 0, 255);\n } else if (i === 3) {\n rgb[i] = limit(rgb[i], 0, 1);\n }\n }\n return rgb;\n};\n","// ported from jQuery's $.type\nconst classToType = {};\nfor (let name of [\n 'Boolean',\n 'Number',\n 'String',\n 'Function',\n 'Array',\n 'Date',\n 'RegExp',\n 'Undefined',\n 'Null'\n]) {\n classToType[`[object ${name}]`] = name.toLowerCase();\n}\nexport default function (obj) {\n return classToType[Object.prototype.toString.call(obj)] || 'object';\n}\n","import type from './type.js';\n\nexport default (args, keyOrder = null) => {\n // if called with more than 3 arguments, we return the arguments\n if (args.length >= 3) return Array.prototype.slice.call(args);\n // with less than 3 args we check if first arg is object\n // and use the keyOrder string to extract and sort properties\n if (type(args[0]) == 'object' && keyOrder) {\n return keyOrder\n .split('')\n .filter((k) => args[0][k] !== undefined)\n .map((k) => args[0][k]);\n }\n // otherwise we just return the first argument\n // (which we suppose is an array of args)\n return args[0];\n};\n","import type from './type.js';\n\nexport default (args) => {\n if (args.length < 2) return null;\n const l = args.length - 1;\n if (type(args[l]) == 'string') return args[l].toLowerCase();\n return null;\n};\n","const { PI, min, max } = Math;\n\nexport { default as clip_rgb } from './clip_rgb.js';\nexport { default as limit } from './limit.js';\nexport { default as type } from './type.js';\nexport { default as unpack } from './unpack.js';\nexport { default as last } from './last.js';\n\nconst TWOPI = PI * 2;\nconst PITHIRD = PI / 3;\nconst DEG2RAD = PI / 180;\nconst RAD2DEG = 180 / PI;\n\nexport { PI, TWOPI, PITHIRD, DEG2RAD, RAD2DEG, min, max };\n","export default {\n format: {},\n autodetect: []\n};\n","import { last, clip_rgb, type } from './utils/index.js';\nimport _input from './io/input.js';\n\nclass Color {\n constructor(...args) {\n const me = this;\n if (\n type(args[0]) === 'object' &&\n args[0].constructor &&\n args[0].constructor === this.constructor\n ) {\n // the argument is already a Color instance\n return args[0];\n }\n // last argument could be the mode\n let mode = last(args);\n let autodetect = false;\n if (!mode) {\n autodetect = true;\n if (!_input.sorted) {\n _input.autodetect = _input.autodetect.sort((a, b) => b.p - a.p);\n _input.sorted = true;\n }\n // auto-detect format\n for (let chk of _input.autodetect) {\n mode = chk.test(...args);\n if (mode) break;\n }\n }\n if (_input.format[mode]) {\n const rgb = _input.format[mode].apply(\n null,\n autodetect ? args : args.slice(0, -1)\n );\n me._rgb = clip_rgb(rgb);\n } else {\n throw new Error('unknown format: ' + args);\n }\n // add alpha channel\n if (me._rgb.length === 3) me._rgb.push(1);\n }\n toString() {\n if (type(this.hex) == 'function') return this.hex();\n return `[${this._rgb.join(',')}]`;\n }\n}\nexport default Color;\n","// this gets updated automatically\nexport const version = '2.6.0';\n","import Color from './Color.js';\nimport { version } from './version.js';\n\nconst chroma = (...args) => {\n return new chroma.Color(...args);\n};\n\nchroma.Color = Color;\nchroma.version = version;\n\nexport default chroma;\n","import { unpack } from '../../utils/index.js';\n\nconst cmyk2rgb = (...args) => {\n args = unpack(args, 'cmyk');\n const [c, m, y, k] = args;\n const alpha = args.length > 4 ? args[4] : 1;\n if (k === 1) return [0, 0, 0, alpha];\n return [\n c >= 1 ? 0 : 255 * (1 - c) * (1 - k), // r\n m >= 1 ? 0 : 255 * (1 - m) * (1 - k), // g\n y >= 1 ? 0 : 255 * (1 - y) * (1 - k), // b\n alpha\n ];\n};\n\nexport default cmyk2rgb;\n","import { unpack } from '../../utils/index.js';\nconst { max } = Math;\n\nconst rgb2cmyk = (...args) => {\n let [r, g, b] = unpack(args, 'rgb');\n r = r / 255;\n g = g / 255;\n b = b / 255;\n const k = 1 - max(r, max(g, b));\n const f = k < 1 ? 1 / (1 - k) : 0;\n const c = (1 - r - k) * f;\n const m = (1 - g - k) * f;\n const y = (1 - b - k) * f;\n return [c, m, y, k];\n};\n\nexport default rgb2cmyk;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { unpack, type } from '../../utils/index.js';\nimport cmyk2rgb from './cmyk2rgb.js';\nimport rgb2cmyk from './rgb2cmyk.js';\n\nColor.prototype.cmyk = function () {\n return rgb2cmyk(this._rgb);\n};\n\nchroma.cmyk = (...args) => new Color(...args, 'cmyk');\n\ninput.format.cmyk = cmyk2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'cmyk');\n if (type(args) === 'array' && args.length === 4) {\n return 'cmyk';\n }\n }\n});\n","import { unpack, last } from '../../utils/index.js';\nconst rnd = (a) => Math.round(a * 100) / 100;\n\n/*\n * supported arguments:\n * - hsl2css(h,s,l)\n * - hsl2css(h,s,l,a)\n * - hsl2css([h,s,l], mode)\n * - hsl2css([h,s,l,a], mode)\n * - hsl2css({h,s,l,a}, mode)\n */\nconst hsl2css = (...args) => {\n const hsla = unpack(args, 'hsla');\n let mode = last(args) || 'lsa';\n hsla[0] = rnd(hsla[0] || 0);\n hsla[1] = rnd(hsla[1] * 100) + '%';\n hsla[2] = rnd(hsla[2] * 100) + '%';\n if (mode === 'hsla' || (hsla.length > 3 && hsla[3] < 1)) {\n hsla[3] = hsla.length > 3 ? hsla[3] : 1;\n mode = 'hsla';\n } else {\n hsla.length = 3;\n }\n return `${mode}(${hsla.join(',')})`;\n};\n\nexport default hsl2css;\n","import { unpack, min, max } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - rgb2hsl(r,g,b)\n * - rgb2hsl(r,g,b,a)\n * - rgb2hsl([r,g,b])\n * - rgb2hsl([r,g,b,a])\n * - rgb2hsl({r,g,b,a})\n */\nconst rgb2hsl = (...args) => {\n args = unpack(args, 'rgba');\n let [r, g, b] = args;\n\n r /= 255;\n g /= 255;\n b /= 255;\n\n const minRgb = min(r, g, b);\n const maxRgb = max(r, g, b);\n\n const l = (maxRgb + minRgb) / 2;\n let s, h;\n\n if (maxRgb === minRgb) {\n s = 0;\n h = Number.NaN;\n } else {\n s =\n l < 0.5\n ? (maxRgb - minRgb) / (maxRgb + minRgb)\n : (maxRgb - minRgb) / (2 - maxRgb - minRgb);\n }\n\n if (r == maxRgb) h = (g - b) / (maxRgb - minRgb);\n else if (g == maxRgb) h = 2 + (b - r) / (maxRgb - minRgb);\n else if (b == maxRgb) h = 4 + (r - g) / (maxRgb - minRgb);\n\n h *= 60;\n if (h < 0) h += 360;\n if (args.length > 3 && args[3] !== undefined) return [h, s, l, args[3]];\n return [h, s, l];\n};\n\nexport default rgb2hsl;\n","import { unpack, last } from '../../utils/index.js';\nimport hsl2css from './hsl2css.js';\nimport rgb2hsl from '../hsl/rgb2hsl.js';\nconst { round } = Math;\n\n/*\n * supported arguments:\n * - rgb2css(r,g,b)\n * - rgb2css(r,g,b,a)\n * - rgb2css([r,g,b], mode)\n * - rgb2css([r,g,b,a], mode)\n * - rgb2css({r,g,b,a}, mode)\n */\nconst rgb2css = (...args) => {\n const rgba = unpack(args, 'rgba');\n let mode = last(args) || 'rgb';\n if (mode.substr(0, 3) == 'hsl') {\n return hsl2css(rgb2hsl(rgba), mode);\n }\n rgba[0] = round(rgba[0]);\n rgba[1] = round(rgba[1]);\n rgba[2] = round(rgba[2]);\n if (mode === 'rgba' || (rgba.length > 3 && rgba[3] < 1)) {\n rgba[3] = rgba.length > 3 ? rgba[3] : 1;\n mode = 'rgba';\n }\n return `${mode}(${rgba.slice(0, mode === 'rgb' ? 3 : 4).join(',')})`;\n};\n\nexport default rgb2css;\n","import { unpack } from '../../utils/index.js';\nconst { round } = Math;\n\nconst hsl2rgb = (...args) => {\n args = unpack(args, 'hsl');\n const [h, s, l] = args;\n let r, g, b;\n if (s === 0) {\n r = g = b = l * 255;\n } else {\n const t3 = [0, 0, 0];\n const c = [0, 0, 0];\n const t2 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const t1 = 2 * l - t2;\n const h_ = h / 360;\n t3[0] = h_ + 1 / 3;\n t3[1] = h_;\n t3[2] = h_ - 1 / 3;\n for (let i = 0; i < 3; i++) {\n if (t3[i] < 0) t3[i] += 1;\n if (t3[i] > 1) t3[i] -= 1;\n if (6 * t3[i] < 1) c[i] = t1 + (t2 - t1) * 6 * t3[i];\n else if (2 * t3[i] < 1) c[i] = t2;\n else if (3 * t3[i] < 2) c[i] = t1 + (t2 - t1) * (2 / 3 - t3[i]) * 6;\n else c[i] = t1;\n }\n [r, g, b] = [round(c[0] * 255), round(c[1] * 255), round(c[2] * 255)];\n }\n if (args.length > 3) {\n // keep alpha channel\n return [r, g, b, args[3]];\n }\n return [r, g, b, 1];\n};\n\nexport default hsl2rgb;\n","import hsl2rgb from '../hsl/hsl2rgb.js';\nimport input from '../input.js';\n\nconst RE_RGB = /^rgb\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*\\)$/;\nconst RE_RGBA =\n /^rgba\\(\\s*(-?\\d+),\\s*(-?\\d+)\\s*,\\s*(-?\\d+)\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\nconst RE_RGB_PCT =\n /^rgb\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/;\nconst RE_RGBA_PCT =\n /^rgba\\(\\s*(-?\\d+(?:\\.\\d+)?)%,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\nconst RE_HSL =\n /^hsl\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*\\)$/;\nconst RE_HSLA =\n /^hsla\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n\nconst { round } = Math;\n\nconst css2rgb = (css) => {\n css = css.toLowerCase().trim();\n let m;\n\n if (input.format.named) {\n try {\n return input.format.named(css);\n // eslint-disable-next-line\n } catch (e) {}\n }\n\n // rgb(250,20,0)\n if ((m = css.match(RE_RGB))) {\n const rgb = m.slice(1, 4);\n for (let i = 0; i < 3; i++) {\n rgb[i] = +rgb[i];\n }\n rgb[3] = 1; // default alpha\n return rgb;\n }\n\n // rgba(250,20,0,0.4)\n if ((m = css.match(RE_RGBA))) {\n const rgb = m.slice(1, 5);\n for (let i = 0; i < 4; i++) {\n rgb[i] = +rgb[i];\n }\n return rgb;\n }\n\n // rgb(100%,0%,0%)\n if ((m = css.match(RE_RGB_PCT))) {\n const rgb = m.slice(1, 4);\n for (let i = 0; i < 3; i++) {\n rgb[i] = round(rgb[i] * 2.55);\n }\n rgb[3] = 1; // default alpha\n return rgb;\n }\n\n // rgba(100%,0%,0%,0.4)\n if ((m = css.match(RE_RGBA_PCT))) {\n const rgb = m.slice(1, 5);\n for (let i = 0; i < 3; i++) {\n rgb[i] = round(rgb[i] * 2.55);\n }\n rgb[3] = +rgb[3];\n return rgb;\n }\n\n // hsl(0,100%,50%)\n if ((m = css.match(RE_HSL))) {\n const hsl = m.slice(1, 4);\n hsl[1] *= 0.01;\n hsl[2] *= 0.01;\n const rgb = hsl2rgb(hsl);\n rgb[3] = 1;\n return rgb;\n }\n\n // hsla(0,100%,50%,0.5)\n if ((m = css.match(RE_HSLA))) {\n const hsl = m.slice(1, 4);\n hsl[1] *= 0.01;\n hsl[2] *= 0.01;\n const rgb = hsl2rgb(hsl);\n rgb[3] = +m[4]; // default alpha = 1\n return rgb;\n }\n};\n\ncss2rgb.test = (s) => {\n return (\n RE_RGB.test(s) ||\n RE_RGBA.test(s) ||\n RE_RGB_PCT.test(s) ||\n RE_RGBA_PCT.test(s) ||\n RE_HSL.test(s) ||\n RE_HSLA.test(s)\n );\n};\n\nexport default css2rgb;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\n\nimport rgb2css from './rgb2css.js';\nimport css2rgb from './css2rgb.js';\n\nColor.prototype.css = function (mode) {\n return rgb2css(this._rgb, mode);\n};\n\nchroma.css = (...args) => new Color(...args, 'css');\n\ninput.format.css = css2rgb;\n\ninput.autodetect.push({\n p: 5,\n test: (h, ...rest) => {\n if (!rest.length && type(h) === 'string' && css2rgb.test(h)) {\n return 'css';\n }\n }\n});\n","import Color from '../../Color.js';\nimport chroma from '../../chroma.js';\nimport input from '../input.js';\nimport { unpack } from '../../utils/index.js';\n\ninput.format.gl = (...args) => {\n const rgb = unpack(args, 'rgba');\n rgb[0] *= 255;\n rgb[1] *= 255;\n rgb[2] *= 255;\n return rgb;\n};\n\nchroma.gl = (...args) => new Color(...args, 'gl');\n\nColor.prototype.gl = function () {\n const rgb = this._rgb;\n return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, rgb[3]];\n};\n","import { unpack } from '../../utils/index.js';\nconst { floor } = Math;\n\n/*\n * this is basically just HSV with some minor tweaks\n *\n * hue.. [0..360]\n * chroma .. [0..1]\n * grayness .. [0..1]\n */\n\nconst hcg2rgb = (...args) => {\n args = unpack(args, 'hcg');\n let [h, c, _g] = args;\n let r, g, b;\n _g = _g * 255;\n const _c = c * 255;\n if (c === 0) {\n r = g = b = _g;\n } else {\n if (h === 360) h = 0;\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 60;\n const i = floor(h);\n const f = h - i;\n const p = _g * (1 - c);\n const q = p + _c * (1 - f);\n const t = p + _c * f;\n const v = p + _c;\n switch (i) {\n case 0:\n [r, g, b] = [v, t, p];\n break;\n case 1:\n [r, g, b] = [q, v, p];\n break;\n case 2:\n [r, g, b] = [p, v, t];\n break;\n case 3:\n [r, g, b] = [p, q, v];\n break;\n case 4:\n [r, g, b] = [t, p, v];\n break;\n case 5:\n [r, g, b] = [v, p, q];\n break;\n }\n }\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default hcg2rgb;\n","import { unpack, max, min } from '../../utils/index.js';\n\nconst rgb2hcg = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n const minRgb = min(r, g, b);\n const maxRgb = max(r, g, b);\n const delta = maxRgb - minRgb;\n const c = (delta * 100) / 255;\n const _g = (minRgb / (255 - delta)) * 100;\n let h;\n if (delta === 0) {\n h = Number.NaN;\n } else {\n if (r === maxRgb) h = (g - b) / delta;\n if (g === maxRgb) h = 2 + (b - r) / delta;\n if (b === maxRgb) h = 4 + (r - g) / delta;\n h *= 60;\n if (h < 0) h += 360;\n }\n return [h, c, _g];\n};\n\nexport default rgb2hcg;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hcg2rgb from './hcg2rgb.js';\nimport rgb2hcg from './rgb2hcg.js';\n\nColor.prototype.hcg = function () {\n return rgb2hcg(this._rgb);\n};\n\nchroma.hcg = (...args) => new Color(...args, 'hcg');\n\ninput.format.hcg = hcg2rgb;\n\ninput.autodetect.push({\n p: 1,\n test: (...args) => {\n args = unpack(args, 'hcg');\n if (type(args) === 'array' && args.length === 3) {\n return 'hcg';\n }\n }\n});\n","const RE_HEX = /^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\nconst RE_HEXA = /^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/;\n\nconst hex2rgb = (hex) => {\n if (hex.match(RE_HEX)) {\n // remove optional leading #\n if (hex.length === 4 || hex.length === 7) {\n hex = hex.substr(1);\n }\n // expand short-notation to full six-digit\n if (hex.length === 3) {\n hex = hex.split('');\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n const u = parseInt(hex, 16);\n const r = u >> 16;\n const g = (u >> 8) & 0xff;\n const b = u & 0xff;\n return [r, g, b, 1];\n }\n\n // match rgba hex format, eg #FF000077\n if (hex.match(RE_HEXA)) {\n if (hex.length === 5 || hex.length === 9) {\n // remove optional leading #\n hex = hex.substr(1);\n }\n // expand short-notation to full eight-digit\n if (hex.length === 4) {\n hex = hex.split('');\n hex =\n hex[0] +\n hex[0] +\n hex[1] +\n hex[1] +\n hex[2] +\n hex[2] +\n hex[3] +\n hex[3];\n }\n const u = parseInt(hex, 16);\n const r = (u >> 24) & 0xff;\n const g = (u >> 16) & 0xff;\n const b = (u >> 8) & 0xff;\n const a = Math.round(((u & 0xff) / 0xff) * 100) / 100;\n return [r, g, b, a];\n }\n\n // we used to check for css colors here\n // if _input.css? and rgb = _input.css hex\n // return rgb\n\n throw new Error(`unknown hex color: ${hex}`);\n};\n\nexport default hex2rgb;\n","import { unpack, last } from '../../utils/index.js';\nconst { round } = Math;\n\nconst rgb2hex = (...args) => {\n let [r, g, b, a] = unpack(args, 'rgba');\n let mode = last(args) || 'auto';\n if (a === undefined) a = 1;\n if (mode === 'auto') {\n mode = a < 1 ? 'rgba' : 'rgb';\n }\n r = round(r);\n g = round(g);\n b = round(b);\n const u = (r << 16) | (g << 8) | b;\n let str = '000000' + u.toString(16); //#.toUpperCase();\n str = str.substr(str.length - 6);\n let hxa = '0' + round(a * 255).toString(16);\n hxa = hxa.substr(hxa.length - 2);\n switch (mode.toLowerCase()) {\n case 'rgba':\n return `#${str}${hxa}`;\n case 'argb':\n return `#${hxa}${str}`;\n default:\n return `#${str}`;\n }\n};\n\nexport default rgb2hex;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport { type } from '../../utils/index.js';\nimport input from '../input.js';\nimport hex2rgb from './hex2rgb.js';\nimport rgb2hex from './rgb2hex.js';\n\nColor.prototype.hex = function (mode) {\n return rgb2hex(this._rgb, mode);\n};\n\nchroma.hex = (...args) => new Color(...args, 'hex');\n\ninput.format.hex = hex2rgb;\ninput.autodetect.push({\n p: 4,\n test: (h, ...rest) => {\n if (\n !rest.length &&\n type(h) === 'string' &&\n [3, 4, 5, 6, 7, 8, 9].indexOf(h.length) >= 0\n ) {\n return 'hex';\n }\n }\n});\n","import { unpack, limit, TWOPI, PITHIRD } from '../../utils/index.js';\nconst { cos } = Math;\n\n/*\n * hue [0..360]\n * saturation [0..1]\n * intensity [0..1]\n */\nconst hsi2rgb = (...args) => {\n /*\n borrowed from here:\n http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp\n */\n args = unpack(args, 'hsi');\n let [h, s, i] = args;\n let r, g, b;\n\n if (isNaN(h)) h = 0;\n if (isNaN(s)) s = 0;\n // normalize hue\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 360;\n if (h < 1 / 3) {\n b = (1 - s) / 3;\n r = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n g = 1 - (b + r);\n } else if (h < 2 / 3) {\n h -= 1 / 3;\n r = (1 - s) / 3;\n g = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n b = 1 - (r + g);\n } else {\n h -= 2 / 3;\n g = (1 - s) / 3;\n b = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n r = 1 - (g + b);\n }\n r = limit(i * r * 3);\n g = limit(i * g * 3);\n b = limit(i * b * 3);\n return [r * 255, g * 255, b * 255, args.length > 3 ? args[3] : 1];\n};\n\nexport default hsi2rgb;\n","import { unpack, TWOPI } from '../../utils/index.js';\nconst { min, sqrt, acos } = Math;\n\nconst rgb2hsi = (...args) => {\n /*\n borrowed from here:\n http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/rgb2hsi.cpp\n */\n let [r, g, b] = unpack(args, 'rgb');\n r /= 255;\n g /= 255;\n b /= 255;\n let h;\n const min_ = min(r, g, b);\n const i = (r + g + b) / 3;\n const s = i > 0 ? 1 - min_ / i : 0;\n if (s === 0) {\n h = NaN;\n } else {\n h = (r - g + (r - b)) / 2;\n h /= sqrt((r - g) * (r - g) + (r - b) * (g - b));\n h = acos(h);\n if (b > g) {\n h = TWOPI - h;\n }\n h /= TWOPI;\n }\n return [h * 360, s, i];\n};\n\nexport default rgb2hsi;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsi2rgb from './hsi2rgb.js';\nimport rgb2hsi from './rgb2hsi.js';\n\nColor.prototype.hsi = function () {\n return rgb2hsi(this._rgb);\n};\n\nchroma.hsi = (...args) => new Color(...args, 'hsi');\n\ninput.format.hsi = hsi2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsi');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsi';\n }\n }\n});\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsl2rgb from './hsl2rgb.js';\nimport rgb2hsl from './rgb2hsl.js';\n\nColor.prototype.hsl = function () {\n return rgb2hsl(this._rgb);\n};\n\nchroma.hsl = (...args) => new Color(...args, 'hsl');\n\ninput.format.hsl = hsl2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsl');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsl';\n }\n }\n});\n","import { unpack } from '../../utils/index.js';\nconst { floor } = Math;\n\nconst hsv2rgb = (...args) => {\n args = unpack(args, 'hsv');\n let [h, s, v] = args;\n let r, g, b;\n v *= 255;\n if (s === 0) {\n r = g = b = v;\n } else {\n if (h === 360) h = 0;\n if (h > 360) h -= 360;\n if (h < 0) h += 360;\n h /= 60;\n\n const i = floor(h);\n const f = h - i;\n const p = v * (1 - s);\n const q = v * (1 - s * f);\n const t = v * (1 - s * (1 - f));\n\n switch (i) {\n case 0:\n [r, g, b] = [v, t, p];\n break;\n case 1:\n [r, g, b] = [q, v, p];\n break;\n case 2:\n [r, g, b] = [p, v, t];\n break;\n case 3:\n [r, g, b] = [p, q, v];\n break;\n case 4:\n [r, g, b] = [t, p, v];\n break;\n case 5:\n [r, g, b] = [v, p, q];\n break;\n }\n }\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default hsv2rgb;\n","import { unpack } from '../../utils/index.js';\nconst { min, max } = Math;\n\n/*\n * supported arguments:\n * - rgb2hsv(r,g,b)\n * - rgb2hsv([r,g,b])\n * - rgb2hsv({r,g,b})\n */\nconst rgb2hsl = (...args) => {\n args = unpack(args, 'rgb');\n let [r, g, b] = args;\n const min_ = min(r, g, b);\n const max_ = max(r, g, b);\n const delta = max_ - min_;\n let h, s, v;\n v = max_ / 255.0;\n if (max_ === 0) {\n h = Number.NaN;\n s = 0;\n } else {\n s = delta / max_;\n if (r === max_) h = (g - b) / delta;\n if (g === max_) h = 2 + (b - r) / delta;\n if (b === max_) h = 4 + (r - g) / delta;\n h *= 60;\n if (h < 0) h += 360;\n }\n return [h, s, v];\n};\n\nexport default rgb2hsl;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsv2rgb from './hsv2rgb.js';\nimport rgb2hsv from './rgb2hsv.js';\n\nColor.prototype.hsv = function () {\n return rgb2hsv(this._rgb);\n};\n\nchroma.hsv = (...args) => new Color(...args, 'hsv');\n\ninput.format.hsv = hsv2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'hsv');\n if (type(args) === 'array' && args.length === 3) {\n return 'hsv';\n }\n }\n});\n","export default {\n // Corresponds roughly to RGB brighter/darker\n Kn: 18,\n\n // D65 standard referent\n Xn: 0.95047,\n Yn: 1,\n Zn: 1.08883,\n\n t0: 0.137931034, // 4 / 29\n t1: 0.206896552, // 6 / 29\n t2: 0.12841855, // 3 * t1 * t1\n t3: 0.008856452 // t1 * t1 * t1\n};\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\nconst { pow } = Math;\n\n/*\n * L* [0..100]\n * a [-100..100]\n * b [-100..100]\n */\nconst lab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [l, a, b] = args;\n let x, y, z, r, g, b_;\n\n y = (l + 16) / 116;\n x = isNaN(a) ? y : y + a / 500;\n z = isNaN(b) ? y : y - b / 200;\n\n y = LAB_CONSTANTS.Yn * lab_xyz(y);\n x = LAB_CONSTANTS.Xn * lab_xyz(x);\n z = LAB_CONSTANTS.Zn * lab_xyz(z);\n\n r = xyz_rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z); // D65 -> sRGB\n g = xyz_rgb(-0.969266 * x + 1.8760108 * y + 0.041556 * z);\n b_ = xyz_rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z);\n\n return [r, g, b_, args.length > 3 ? args[3] : 1];\n};\n\nconst xyz_rgb = (r) => {\n return 255 * (r <= 0.00304 ? 12.92 * r : 1.055 * pow(r, 1 / 2.4) - 0.055);\n};\n\nconst lab_xyz = (t) => {\n return t > LAB_CONSTANTS.t1\n ? t * t * t\n : LAB_CONSTANTS.t2 * (t - LAB_CONSTANTS.t0);\n};\n\nexport default lab2rgb;\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\nconst { pow } = Math;\n\nconst rgb2lab = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n const [x, y, z] = rgb2xyz(r, g, b);\n const l = 116 * y - 16;\n return [l < 0 ? 0 : l, 500 * (x - y), 200 * (y - z)];\n};\n\nconst rgb_xyz = (r) => {\n if ((r /= 255) <= 0.04045) return r / 12.92;\n return pow((r + 0.055) / 1.055, 2.4);\n};\n\nconst xyz_lab = (t) => {\n if (t > LAB_CONSTANTS.t3) return pow(t, 1 / 3);\n return t / LAB_CONSTANTS.t2 + LAB_CONSTANTS.t0;\n};\n\nconst rgb2xyz = (r, g, b) => {\n r = rgb_xyz(r);\n g = rgb_xyz(g);\n b = rgb_xyz(b);\n const x = xyz_lab(\n (0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / LAB_CONSTANTS.Xn\n );\n const y = xyz_lab(\n (0.2126729 * r + 0.7151522 * g + 0.072175 * b) / LAB_CONSTANTS.Yn\n );\n const z = xyz_lab(\n (0.0193339 * r + 0.119192 * g + 0.9503041 * b) / LAB_CONSTANTS.Zn\n );\n return [x, y, z];\n};\n\nexport default rgb2lab;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport lab2rgb from './lab2rgb.js';\nimport rgb2lab from './rgb2lab.js';\n\nColor.prototype.lab = function () {\n return rgb2lab(this._rgb);\n};\n\nchroma.lab = (...args) => new Color(...args, 'lab');\n\ninput.format.lab = lab2rgb;\n\ninput.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, 'lab');\n if (type(args) === 'array' && args.length === 3) {\n return 'lab';\n }\n }\n});\n","import { unpack, DEG2RAD } from '../../utils/index.js';\nconst { sin, cos } = Math;\n\nconst lch2lab = (...args) => {\n /*\n Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n These formulas were invented by David Dalrymple to obtain maximum contrast without going\n out of gamut if the parameters are in the range 0-1.\n\n A saturation multiplier was added by Gregor Aisch\n */\n let [l, c, h] = unpack(args, 'lch');\n if (isNaN(h)) h = 0;\n h = h * DEG2RAD;\n return [l, cos(h) * c, sin(h) * c];\n};\n\nexport default lch2lab;\n","import { unpack } from '../../utils/index.js';\nimport lch2lab from './lch2lab.js';\nimport lab2rgb from '../lab/lab2rgb.js';\n\nconst lch2rgb = (...args) => {\n args = unpack(args, 'lch');\n const [l, c, h] = args;\n const [L, a, b_] = lch2lab(l, c, h);\n const [r, g, b] = lab2rgb(L, a, b_);\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default lch2rgb;\n","import { unpack } from '../../utils/index.js';\nimport lch2rgb from './lch2rgb.js';\n\nconst hcl2rgb = (...args) => {\n const hcl = unpack(args, 'hcl').reverse();\n return lch2rgb(...hcl);\n};\n\nexport default hcl2rgb;\n","import { unpack, RAD2DEG } from '../../utils/index.js';\nconst { sqrt, atan2, round } = Math;\n\nconst lab2lch = (...args) => {\n const [l, a, b] = unpack(args, 'lab');\n const c = sqrt(a * a + b * b);\n let h = (atan2(b, a) * RAD2DEG + 360) % 360;\n if (round(c * 10000) === 0) h = Number.NaN;\n return [l, c, h];\n};\n\nexport default lab2lch;\n","import { unpack } from '../../utils/index.js';\nimport rgb2lab from '../lab/rgb2lab.js';\nimport lab2lch from './lab2lch.js';\n\nconst rgb2lch = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n const [l, a, b_] = rgb2lab(r, g, b);\n return lab2lch(l, a, b_);\n};\n\nexport default rgb2lch;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport lch2rgb from './lch2rgb.js';\nimport hcl2rgb from './hcl2rgb.js';\nimport rgb2lch from './rgb2lch.js';\n\nColor.prototype.lch = function () {\n return rgb2lch(this._rgb);\n};\nColor.prototype.hcl = function () {\n return rgb2lch(this._rgb).reverse();\n};\n\nchroma.lch = (...args) => new Color(...args, 'lch');\nchroma.hcl = (...args) => new Color(...args, 'hcl');\n\ninput.format.lch = lch2rgb;\ninput.format.hcl = hcl2rgb;\n['lch', 'hcl'].forEach((m) =>\n input.autodetect.push({\n p: 2,\n test: (...args) => {\n args = unpack(args, m);\n if (type(args) === 'array' && args.length === 3) {\n return m;\n }\n }\n })\n);\n","/**\n\tX11 color names\n\n\thttp://www.w3.org/TR/css3-color/#svg-color\n*/\n\nconst w3cx11 = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n laserlemon: '#ffff54',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrod: '#fafad2',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n maroon2: '#7f0000',\n maroon3: '#b03060',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n purple2: '#7f007f',\n purple3: '#a020f0',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32'\n};\n\nexport default w3cx11;\n","import Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\n\nimport w3cx11 from '../../colors/w3cx11.js';\nimport hex2rgb from '../hex/hex2rgb.js';\nimport rgb2hex from '../hex/rgb2hex.js';\n\nColor.prototype.name = function () {\n const hex = rgb2hex(this._rgb, 'rgb');\n for (let n of Object.keys(w3cx11)) {\n if (w3cx11[n] === hex) return n.toLowerCase();\n }\n return hex;\n};\n\ninput.format.named = (name) => {\n name = name.toLowerCase();\n if (w3cx11[name]) return hex2rgb(w3cx11[name]);\n throw new Error('unknown color name: ' + name);\n};\n\ninput.autodetect.push({\n p: 5,\n test: (h, ...rest) => {\n if (!rest.length && type(h) === 'string' && w3cx11[h.toLowerCase()]) {\n return 'named';\n }\n }\n});\n","import { type } from '../../utils/index.js';\n\nconst num2rgb = (num) => {\n if (type(num) == 'number' && num >= 0 && num <= 0xffffff) {\n const r = num >> 16;\n const g = (num >> 8) & 0xff;\n const b = num & 0xff;\n return [r, g, b, 1];\n }\n throw new Error('unknown num color: ' + num);\n};\n\nexport default num2rgb;\n","import { unpack } from '../../utils/index.js';\n\nconst rgb2num = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n return (r << 16) + (g << 8) + b;\n};\n\nexport default rgb2num;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\nimport num2rgb from './num2rgb.js';\nimport rgb2num from './rgb2num.js';\n\nColor.prototype.num = function () {\n return rgb2num(this._rgb);\n};\n\nchroma.num = (...args) => new Color(...args, 'num');\n\ninput.format.num = num2rgb;\n\ninput.autodetect.push({\n p: 5,\n test: (...args) => {\n if (\n args.length === 1 &&\n type(args[0]) === 'number' &&\n args[0] >= 0 &&\n args[0] <= 0xffffff\n ) {\n return 'num';\n }\n }\n});\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { unpack, type } from '../../utils/index.js';\nconst { round } = Math;\n\nColor.prototype.rgb = function (rnd = true) {\n if (rnd === false) return this._rgb.slice(0, 3);\n return this._rgb.slice(0, 3).map(round);\n};\n\nColor.prototype.rgba = function (rnd = true) {\n return this._rgb.slice(0, 4).map((v, i) => {\n return i < 3 ? (rnd === false ? v : round(v)) : v;\n });\n};\n\nchroma.rgb = (...args) => new Color(...args, 'rgb');\n\ninput.format.rgb = (...args) => {\n const rgba = unpack(args, 'rgba');\n if (rgba[3] === undefined) rgba[3] = 1;\n return rgba;\n};\n\ninput.autodetect.push({\n p: 3,\n test: (...args) => {\n args = unpack(args, 'rgba');\n if (\n type(args) === 'array' &&\n (args.length === 3 ||\n (args.length === 4 &&\n type(args[3]) == 'number' &&\n args[3] >= 0 &&\n args[3] <= 1))\n ) {\n return 'rgb';\n }\n }\n});\n","/*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n */\n\nconst { log } = Math;\n\nconst temperature2rgb = (kelvin) => {\n const temp = kelvin / 100;\n let r, g, b;\n if (temp < 66) {\n r = 255;\n g =\n temp < 6\n ? 0\n : -155.25485562709179 -\n 0.44596950469579133 * (g = temp - 2) +\n 104.49216199393888 * log(g);\n b =\n temp < 20\n ? 0\n : -254.76935184120902 +\n 0.8274096064007395 * (b = temp - 10) +\n 115.67994401066147 * log(b);\n } else {\n r =\n 351.97690566805693 +\n 0.114206453784165 * (r = temp - 55) -\n 40.25366309332127 * log(r);\n g =\n 325.4494125711974 +\n 0.07943456536662342 * (g = temp - 50) -\n 28.0852963507957 * log(g);\n b = 255;\n }\n return [r, g, b, 1];\n};\n\nexport default temperature2rgb;\n","/*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n **/\n\nimport temperature2rgb from './temperature2rgb.js';\nimport { unpack } from '../../utils/index.js';\nconst { round } = Math;\n\nconst rgb2temperature = (...args) => {\n const rgb = unpack(args, 'rgb');\n const r = rgb[0],\n b = rgb[2];\n let minTemp = 1000;\n let maxTemp = 40000;\n const eps = 0.4;\n let temp;\n while (maxTemp - minTemp > eps) {\n temp = (maxTemp + minTemp) * 0.5;\n const rgb = temperature2rgb(temp);\n if (rgb[2] / rgb[0] >= b / r) {\n maxTemp = temp;\n } else {\n minTemp = temp;\n }\n }\n return round(temp);\n};\n\nexport default rgb2temperature;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport temperature2rgb from './temperature2rgb.js';\nimport rgb2temperature from './rgb2temperature.js';\n\nColor.prototype.temp =\n Color.prototype.kelvin =\n Color.prototype.temperature =\n function () {\n return rgb2temperature(this._rgb);\n };\n\nchroma.temp =\n chroma.kelvin =\n chroma.temperature =\n (...args) => new Color(...args, 'temp');\n\ninput.format.temp =\n input.format.kelvin =\n input.format.temperature =\n temperature2rgb;\n","import { unpack } from '../../utils/index.js';\nconst { pow, sign } = Math;\n\n/*\n * L* [0..100]\n * a [-100..100]\n * b [-100..100]\n */\nconst oklab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [L, a, b] = args;\n\n const l = pow(L + 0.3963377774 * a + 0.2158037573 * b, 3);\n const m = pow(L - 0.1055613458 * a - 0.0638541728 * b, 3);\n const s = pow(L - 0.0894841775 * a - 1.291485548 * b, 3);\n\n return [\n 255 * lrgb2rgb(+4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),\n 255 * lrgb2rgb(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),\n 255 * lrgb2rgb(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s),\n args.length > 3 ? args[3] : 1\n ];\n};\n\nexport default oklab2rgb;\n\nfunction lrgb2rgb(c) {\n const abs = Math.abs(c);\n if (abs > 0.0031308) {\n return (sign(c) || 1) * (1.055 * pow(abs, 1 / 2.4) - 0.055);\n }\n return c * 12.92;\n}\n","import { unpack } from '../../utils/index.js';\nconst { cbrt, pow, sign } = Math;\n\nconst rgb2oklab = (...args) => {\n // OKLab color space implementation taken from\n // https://bottosson.github.io/posts/oklab/\n const [r, g, b] = unpack(args, 'rgb');\n const [lr, lg, lb] = [\n rgb2lrgb(r / 255),\n rgb2lrgb(g / 255),\n rgb2lrgb(b / 255)\n ];\n const l = cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);\n const m = cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);\n const s = cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);\n\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s\n ];\n};\n\nexport default rgb2oklab;\n\nfunction rgb2lrgb(c) {\n const abs = Math.abs(c);\n if (abs < 0.04045) {\n return c / 12.92;\n }\n return (sign(c) || 1) * pow((abs + 0.055) / 1.055, 2.4);\n}\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport oklab2rgb from './oklab2rgb.js';\nimport rgb2oklab from './rgb2oklab.js';\n\nColor.prototype.oklab = function () {\n return rgb2oklab(this._rgb);\n};\n\nchroma.oklab = (...args) => new Color(...args, 'oklab');\n\ninput.format.oklab = oklab2rgb;\n\ninput.autodetect.push({\n p: 3,\n test: (...args) => {\n args = unpack(args, 'oklab');\n if (type(args) === 'array' && args.length === 3) {\n return 'oklab';\n }\n }\n});\n","import { unpack } from '../../utils/index.js';\nimport lch2lab from '../lch/lch2lab.js';\nimport oklab2rgb from '../oklab/oklab2rgb.js';\n\nconst oklch2rgb = (...args) => {\n args = unpack(args, 'lch');\n const [l, c, h] = args;\n const [L, a, b_] = lch2lab(l, c, h);\n const [r, g, b] = oklab2rgb(L, a, b_);\n return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default oklch2rgb;\n","import { unpack } from '../../utils/index.js';\nimport rgb2oklab from '../oklab/rgb2oklab.js';\nimport lab2lch from '../lch/lab2lch.js';\n\nconst rgb2oklch = (...args) => {\n const [r, g, b] = unpack(args, 'rgb');\n const [l, a, b_] = rgb2oklab(r, g, b);\n return lab2lch(l, a, b_);\n};\n\nexport default rgb2oklch;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport oklch2rgb from './oklch2rgb.js';\nimport rgb2oklch from './rgb2oklch.js';\n\nColor.prototype.oklch = function () {\n return rgb2oklch(this._rgb);\n};\n\nchroma.oklch = (...args) => new Color(...args, 'oklch');\n\ninput.format.oklch = oklch2rgb;\n\ninput.autodetect.push({\n p: 3,\n test: (...args) => {\n args = unpack(args, 'oklch');\n if (type(args) === 'array' && args.length === 3) {\n return 'oklch';\n }\n }\n});\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\n\nColor.prototype.alpha = function (a, mutate = false) {\n if (a !== undefined && type(a) === 'number') {\n if (mutate) {\n this._rgb[3] = a;\n return this;\n }\n return new Color([this._rgb[0], this._rgb[1], this._rgb[2], a], 'rgb');\n }\n return this._rgb[3];\n};\n","import Color from '../Color.js';\n\nColor.prototype.clipped = function () {\n return this._rgb._clipped || false;\n};\n","import '../io/lab/index.js';\nimport Color from '../Color.js';\nimport LAB_CONSTANTS from '../io/lab/lab-constants.js';\n\nColor.prototype.darken = function (amount = 1) {\n const me = this;\n const lab = me.lab();\n lab[0] -= LAB_CONSTANTS.Kn * amount;\n return new Color(lab, 'lab').alpha(me.alpha(), true);\n};\n\nColor.prototype.brighten = function (amount = 1) {\n return this.darken(-amount);\n};\n\nColor.prototype.darker = Color.prototype.darken;\nColor.prototype.brighter = Color.prototype.brighten;\n","import Color from '../Color.js';\n\nColor.prototype.get = function (mc) {\n const [mode, channel] = mc.split('.');\n const src = this[mode]();\n if (channel) {\n const i = mode.indexOf(channel) - (mode.substr(0, 2) === 'ok' ? 2 : 0);\n if (i > -1) return src[i];\n throw new Error(`unknown channel ${channel} in mode ${mode}`);\n } else {\n return src;\n }\n};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\nconst { pow } = Math;\n\nconst EPS = 1e-7;\nconst MAX_ITER = 20;\n\nColor.prototype.luminance = function (lum, mode = 'rgb') {\n if (lum !== undefined && type(lum) === 'number') {\n if (lum === 0) {\n // return pure black\n return new Color([0, 0, 0, this._rgb[3]], 'rgb');\n }\n if (lum === 1) {\n // return pure white\n return new Color([255, 255, 255, this._rgb[3]], 'rgb');\n }\n // compute new color using...\n let cur_lum = this.luminance();\n let max_iter = MAX_ITER;\n\n const test = (low, high) => {\n const mid = low.interpolate(high, 0.5, mode);\n const lm = mid.luminance();\n if (Math.abs(lum - lm) < EPS || !max_iter--) {\n // close enough\n return mid;\n }\n return lm > lum ? test(low, mid) : test(mid, high);\n };\n\n const rgb = (\n cur_lum > lum\n ? test(new Color([0, 0, 0]), this)\n : test(this, new Color([255, 255, 255]))\n ).rgb();\n return new Color([...rgb, this._rgb[3]]);\n }\n return rgb2luminance(...this._rgb.slice(0, 3));\n};\n\nconst rgb2luminance = (r, g, b) => {\n // relative luminance\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n r = luminance_x(r);\n g = luminance_x(g);\n b = luminance_x(b);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\nconst luminance_x = (x) => {\n x /= 255;\n return x <= 0.03928 ? x / 12.92 : pow((x + 0.055) / 1.055, 2.4);\n};\n","export default {};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\nimport interpolator from '../interpolator/index.js';\n\nexport default (col1, col2, f = 0.5, ...rest) => {\n let mode = rest[0] || 'lrgb';\n if (!interpolator[mode] && !rest.length) {\n // fall back to the first supported mode\n mode = Object.keys(interpolator)[0];\n }\n if (!interpolator[mode]) {\n throw new Error(`interpolation mode ${mode} is not defined`);\n }\n if (type(col1) !== 'object') col1 = new Color(col1);\n if (type(col2) !== 'object') col2 = new Color(col2);\n return interpolator[mode](col1, col2, f).alpha(\n col1.alpha() + f * (col2.alpha() - col1.alpha())\n );\n};\n","import Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\nColor.prototype.mix = Color.prototype.interpolate = function (\n col2,\n f = 0.5,\n ...rest\n) {\n return mix(this, col2, f, ...rest);\n};\n","import Color from '../Color.js';\n\nColor.prototype.premultiply = function (mutate = false) {\n const rgb = this._rgb;\n const a = rgb[3];\n if (mutate) {\n this._rgb = [rgb[0] * a, rgb[1] * a, rgb[2] * a, a];\n return this;\n } else {\n return new Color([rgb[0] * a, rgb[1] * a, rgb[2] * a, a], 'rgb');\n }\n};\n","import '../io/lch/index.js';\nimport Color from '../Color.js';\nimport LAB_CONSTANTS from '../io/lab/lab-constants.js';\n\nColor.prototype.saturate = function (amount = 1) {\n const me = this;\n const lch = me.lch();\n lch[1] += LAB_CONSTANTS.Kn * amount;\n if (lch[1] < 0) lch[1] = 0;\n return new Color(lch, 'lch').alpha(me.alpha(), true);\n};\n\nColor.prototype.desaturate = function (amount = 1) {\n return this.saturate(-amount);\n};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\n\nColor.prototype.set = function (mc, value, mutate = false) {\n const [mode, channel] = mc.split('.');\n const src = this[mode]();\n if (channel) {\n const i = mode.indexOf(channel) - (mode.substr(0, 2) === 'ok' ? 2 : 0);\n if (i > -1) {\n if (type(value) == 'string') {\n switch (value.charAt(0)) {\n case '+':\n src[i] += +value;\n break;\n case '-':\n src[i] += +value;\n break;\n case '*':\n src[i] *= +value.substr(1);\n break;\n case '/':\n src[i] /= +value.substr(1);\n break;\n default:\n src[i] = +value;\n }\n } else if (type(value) === 'number') {\n src[i] = value;\n } else {\n throw new Error(`unsupported value for Color.set`);\n }\n const out = new Color(src, mode);\n if (mutate) {\n this._rgb = out._rgb;\n return this;\n }\n return out;\n }\n throw new Error(`unknown channel ${channel} in mode ${mode}`);\n } else {\n return src;\n }\n};\n","import '../io/lab/index.js';\nimport Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\nColor.prototype.tint = function (f = 0.5, ...rest) {\n return mix(this, 'white', f, ...rest);\n};\n\nColor.prototype.shade = function (f = 0.5, ...rest) {\n return mix(this, 'black', f, ...rest);\n};\n","import Color from '../Color.js';\nimport index from './index.js';\n\nconst rgb = (col1, col2, f) => {\n const xyz0 = col1._rgb;\n const xyz1 = col2._rgb;\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'rgb'\n );\n};\n\n// register interpolator\nindex.rgb = rgb;\n\nexport default rgb;\n","import Color from '../Color.js';\nconst { sqrt, pow } = Math;\nimport index from './index.js';\n\nconst lrgb = (col1, col2, f) => {\n const [x1, y1, z1] = col1._rgb;\n const [x2, y2, z2] = col2._rgb;\n return new Color(\n sqrt(pow(x1, 2) * (1 - f) + pow(x2, 2) * f),\n sqrt(pow(y1, 2) * (1 - f) + pow(y2, 2) * f),\n sqrt(pow(z1, 2) * (1 - f) + pow(z2, 2) * f),\n 'rgb'\n );\n};\n\n// register interpolator\nindex.lrgb = lrgb;\n\nexport default lrgb;\n","import '../io/lab/index.js';\nimport index from './index.js';\nimport Color from '../Color.js';\n\nconst lab = (col1, col2, f) => {\n const xyz0 = col1.lab();\n const xyz1 = col2.lab();\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'lab'\n );\n};\n\n// register interpolator\nindex.lab = lab;\n\nexport default lab;\n","import Color from '../Color.js';\n\nexport default (col1, col2, f, m) => {\n let xyz0, xyz1;\n if (m === 'hsl') {\n xyz0 = col1.hsl();\n xyz1 = col2.hsl();\n } else if (m === 'hsv') {\n xyz0 = col1.hsv();\n xyz1 = col2.hsv();\n } else if (m === 'hcg') {\n xyz0 = col1.hcg();\n xyz1 = col2.hcg();\n } else if (m === 'hsi') {\n xyz0 = col1.hsi();\n xyz1 = col2.hsi();\n } else if (m === 'lch' || m === 'hcl') {\n m = 'hcl';\n xyz0 = col1.hcl();\n xyz1 = col2.hcl();\n } else if (m === 'oklch') {\n xyz0 = col1.oklch().reverse();\n xyz1 = col2.oklch().reverse();\n }\n\n let hue0, hue1, sat0, sat1, lbv0, lbv1;\n if (m.substr(0, 1) === 'h' || m === 'oklch') {\n [hue0, sat0, lbv0] = xyz0;\n [hue1, sat1, lbv1] = xyz1;\n }\n\n let sat, hue, lbv, dh;\n\n if (!isNaN(hue0) && !isNaN(hue1)) {\n // both colors have hue\n if (hue1 > hue0 && hue1 - hue0 > 180) {\n dh = hue1 - (hue0 + 360);\n } else if (hue1 < hue0 && hue0 - hue1 > 180) {\n dh = hue1 + 360 - hue0;\n } else {\n dh = hue1 - hue0;\n }\n hue = hue0 + f * dh;\n } else if (!isNaN(hue0)) {\n hue = hue0;\n if ((lbv1 == 1 || lbv1 == 0) && m != 'hsv') sat = sat0;\n } else if (!isNaN(hue1)) {\n hue = hue1;\n if ((lbv0 == 1 || lbv0 == 0) && m != 'hsv') sat = sat1;\n } else {\n hue = Number.NaN;\n }\n\n if (sat === undefined) sat = sat0 + f * (sat1 - sat0);\n lbv = lbv0 + f * (lbv1 - lbv0);\n return m === 'oklch'\n ? new Color([lbv, sat, hue], m)\n : new Color([hue, sat, lbv], m);\n};\n","import '../io/lch/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst lch = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'lch');\n};\n\n// register interpolator\nindex.lch = lch;\nindex.hcl = lch;\n\nexport default lch;\n","import '../io/num/index.js';\nimport index from './index.js';\n\nimport Color from '../Color.js';\n\nconst num = (col1, col2, f) => {\n const c1 = col1.num();\n const c2 = col2.num();\n return new Color(c1 + f * (c2 - c1), 'num');\n};\n\n// register interpolator\nindex.num = num;\n\nexport default num;\n","import '../io/hcg/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hcg = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hcg');\n};\n\n// register interpolator\nindex.hcg = hcg;\n\nexport default hcg;\n","import '../io/hsi/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsi = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsi');\n};\n\n// register interpolator\nindex.hsi = hsi;\n\nexport default hsi;\n","import '../io/hsl/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsl = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsl');\n};\n\n// register interpolator\nindex.hsl = hsl;\n\nexport default hsl;\n","import '../io/hsv/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsv = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'hsv');\n};\n\n// register interpolator\nindex.hsv = hsv;\n\nexport default hsv;\n","import '../io/oklab/index.js';\nimport index from './index.js';\nimport Color from '../Color.js';\n\nconst oklab = (col1, col2, f) => {\n const xyz0 = col1.oklab();\n const xyz1 = col2.oklab();\n return new Color(\n xyz0[0] + f * (xyz1[0] - xyz0[0]),\n xyz0[1] + f * (xyz1[1] - xyz0[1]),\n xyz0[2] + f * (xyz1[2] - xyz0[2]),\n 'oklab'\n );\n};\n\n// register interpolator\nindex.oklab = oklab;\n\nexport default oklab;\n","import '../io/lch/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst oklch = (col1, col2, f) => {\n return interpolate_hsx(col1, col2, f, 'oklch');\n};\n\n// register interpolator\nindex.oklch = oklch;\n\nexport default oklch;\n","import Color from '../Color.js';\nimport { clip_rgb } from '../utils/index.js';\n\nconst { pow, sqrt, PI, cos, sin, atan2 } = Math;\n\nexport default (colors, mode = 'lrgb', weights = null) => {\n const l = colors.length;\n if (!weights) weights = Array.from(new Array(l)).map(() => 1);\n // normalize weights\n const k =\n l /\n weights.reduce(function (a, b) {\n return a + b;\n });\n weights.forEach((w, i) => {\n weights[i] *= k;\n });\n // convert colors to Color objects\n colors = colors.map((c) => new Color(c));\n if (mode === 'lrgb') {\n return _average_lrgb(colors, weights);\n }\n const first = colors.shift();\n const xyz = first.get(mode);\n const cnt = [];\n let dx = 0;\n let dy = 0;\n // initial color\n for (let i = 0; i < xyz.length; i++) {\n xyz[i] = (xyz[i] || 0) * weights[0];\n cnt.push(isNaN(xyz[i]) ? 0 : weights[0]);\n if (mode.charAt(i) === 'h' && !isNaN(xyz[i])) {\n const A = (xyz[i] / 180) * PI;\n dx += cos(A) * weights[0];\n dy += sin(A) * weights[0];\n }\n }\n\n let alpha = first.alpha() * weights[0];\n colors.forEach((c, ci) => {\n const xyz2 = c.get(mode);\n alpha += c.alpha() * weights[ci + 1];\n for (let i = 0; i < xyz.length; i++) {\n if (!isNaN(xyz2[i])) {\n cnt[i] += weights[ci + 1];\n if (mode.charAt(i) === 'h') {\n const A = (xyz2[i] / 180) * PI;\n dx += cos(A) * weights[ci + 1];\n dy += sin(A) * weights[ci + 1];\n } else {\n xyz[i] += xyz2[i] * weights[ci + 1];\n }\n }\n }\n });\n\n for (let i = 0; i < xyz.length; i++) {\n if (mode.charAt(i) === 'h') {\n let A = (atan2(dy / cnt[i], dx / cnt[i]) / PI) * 180;\n while (A < 0) A += 360;\n while (A >= 360) A -= 360;\n xyz[i] = A;\n } else {\n xyz[i] = xyz[i] / cnt[i];\n }\n }\n alpha /= l;\n return new Color(xyz, mode).alpha(alpha > 0.99999 ? 1 : alpha, true);\n};\n\nconst _average_lrgb = (colors, weights) => {\n const l = colors.length;\n const xyz = [0, 0, 0, 0];\n for (let i = 0; i < colors.length; i++) {\n const col = colors[i];\n const f = weights[i] / l;\n const rgb = col._rgb;\n xyz[0] += pow(rgb[0], 2) * f;\n xyz[1] += pow(rgb[1], 2) * f;\n xyz[2] += pow(rgb[2], 2) * f;\n xyz[3] += rgb[3] * f;\n }\n xyz[0] = sqrt(xyz[0]);\n xyz[1] = sqrt(xyz[1]);\n xyz[2] = sqrt(xyz[2]);\n if (xyz[3] > 0.9999999) xyz[3] = 1;\n return new Color(clip_rgb(xyz));\n};\n","// minimal multi-purpose interface\n\n// @requires utils color analyze\nimport chroma from '../chroma.js';\nimport { limit, type } from '../utils/index.js';\n\nconst { pow } = Math;\n\nexport default function (colors) {\n // constructor\n let _mode = 'rgb';\n let _nacol = chroma('#ccc');\n let _spread = 0;\n // const _fixed = false;\n let _domain = [0, 1];\n let _pos = [];\n let _padding = [0, 0];\n let _classes = false;\n let _colors = [];\n let _out = false;\n let _min = 0;\n let _max = 1;\n let _correctLightness = false;\n let _colorCache = {};\n let _useCache = true;\n let _gamma = 1;\n\n // private methods\n\n const setColors = function (colors) {\n colors = colors || ['#fff', '#000'];\n if (\n colors &&\n type(colors) === 'string' &&\n chroma.brewer &&\n chroma.brewer[colors.toLowerCase()]\n ) {\n colors = chroma.brewer[colors.toLowerCase()];\n }\n if (type(colors) === 'array') {\n // handle single color\n if (colors.length === 1) {\n colors = [colors[0], colors[0]];\n }\n // make a copy of the colors\n colors = colors.slice(0);\n // convert to chroma classes\n for (let c = 0; c < colors.length; c++) {\n colors[c] = chroma(colors[c]);\n }\n // auto-fill color position\n _pos.length = 0;\n for (let c = 0; c < colors.length; c++) {\n _pos.push(c / (colors.length - 1));\n }\n }\n resetCache();\n return (_colors = colors);\n };\n\n const getClass = function (value) {\n if (_classes != null) {\n const n = _classes.length - 1;\n let i = 0;\n while (i < n && value >= _classes[i]) {\n i++;\n }\n return i - 1;\n }\n return 0;\n };\n\n let tMapLightness = (t) => t;\n let tMapDomain = (t) => t;\n\n // const classifyValue = function(value) {\n // let val = value;\n // if (_classes.length > 2) {\n // const n = _classes.length-1;\n // const i = getClass(value);\n // const minc = _classes[0] + ((_classes[1]-_classes[0]) * (0 + (_spread * 0.5))); // center of 1st class\n // const maxc = _classes[n-1] + ((_classes[n]-_classes[n-1]) * (1 - (_spread * 0.5))); // center of last class\n // val = _min + ((((_classes[i] + ((_classes[i+1] - _classes[i]) * 0.5)) - minc) / (maxc-minc)) * (_max - _min));\n // }\n // return val;\n // };\n\n const getColor = function (val, bypassMap) {\n let col, t;\n if (bypassMap == null) {\n bypassMap = false;\n }\n if (isNaN(val) || val === null) {\n return _nacol;\n }\n if (!bypassMap) {\n if (_classes && _classes.length > 2) {\n // find the class\n const c = getClass(val);\n t = c / (_classes.length - 2);\n } else if (_max !== _min) {\n // just interpolate between min/max\n t = (val - _min) / (_max - _min);\n } else {\n t = 1;\n }\n } else {\n t = val;\n }\n\n // domain map\n t = tMapDomain(t);\n\n if (!bypassMap) {\n t = tMapLightness(t); // lightness correction\n }\n\n if (_gamma !== 1) {\n t = pow(t, _gamma);\n }\n\n t = _padding[0] + t * (1 - _padding[0] - _padding[1]);\n\n t = limit(t, 0, 1);\n\n const k = Math.floor(t * 10000);\n\n if (_useCache && _colorCache[k]) {\n col = _colorCache[k];\n } else {\n if (type(_colors) === 'array') {\n //for i in [0.._pos.length-1]\n for (let i = 0; i < _pos.length; i++) {\n const p = _pos[i];\n if (t <= p) {\n col = _colors[i];\n break;\n }\n if (t >= p && i === _pos.length - 1) {\n col = _colors[i];\n break;\n }\n if (t > p && t < _pos[i + 1]) {\n t = (t - p) / (_pos[i + 1] - p);\n col = chroma.interpolate(\n _colors[i],\n _colors[i + 1],\n t,\n _mode\n );\n break;\n }\n }\n } else if (type(_colors) === 'function') {\n col = _colors(t);\n }\n if (_useCache) {\n _colorCache[k] = col;\n }\n }\n return col;\n };\n\n var resetCache = () => (_colorCache = {});\n\n setColors(colors);\n\n // public interface\n\n const f = function (v) {\n const c = chroma(getColor(v));\n if (_out && c[_out]) {\n return c[_out]();\n } else {\n return c;\n }\n };\n\n f.classes = function (classes) {\n if (classes != null) {\n if (type(classes) === 'array') {\n _classes = classes;\n _domain = [classes[0], classes[classes.length - 1]];\n } else {\n const d = chroma.analyze(_domain);\n if (classes === 0) {\n _classes = [d.min, d.max];\n } else {\n _classes = chroma.limits(d, 'e', classes);\n }\n }\n return f;\n }\n return _classes;\n };\n\n f.domain = function (domain) {\n if (!arguments.length) {\n return _domain;\n }\n _min = domain[0];\n _max = domain[domain.length - 1];\n _pos = [];\n const k = _colors.length;\n if (domain.length === k && _min !== _max) {\n // update positions\n for (let d of Array.from(domain)) {\n _pos.push((d - _min) / (_max - _min));\n }\n } else {\n for (let c = 0; c < k; c++) {\n _pos.push(c / (k - 1));\n }\n if (domain.length > 2) {\n // set domain map\n const tOut = domain.map((d, i) => i / (domain.length - 1));\n const tBreaks = domain.map((d) => (d - _min) / (_max - _min));\n if (!tBreaks.every((val, i) => tOut[i] === val)) {\n tMapDomain = (t) => {\n if (t <= 0 || t >= 1) return t;\n let i = 0;\n while (t >= tBreaks[i + 1]) i++;\n const f =\n (t - tBreaks[i]) / (tBreaks[i + 1] - tBreaks[i]);\n const out = tOut[i] + f * (tOut[i + 1] - tOut[i]);\n return out;\n };\n }\n }\n }\n _domain = [_min, _max];\n return f;\n };\n\n f.mode = function (_m) {\n if (!arguments.length) {\n return _mode;\n }\n _mode = _m;\n resetCache();\n return f;\n };\n\n f.range = function (colors, _pos) {\n setColors(colors, _pos);\n return f;\n };\n\n f.out = function (_o) {\n _out = _o;\n return f;\n };\n\n f.spread = function (val) {\n if (!arguments.length) {\n return _spread;\n }\n _spread = val;\n return f;\n };\n\n f.correctLightness = function (v) {\n if (v == null) {\n v = true;\n }\n _correctLightness = v;\n resetCache();\n if (_correctLightness) {\n tMapLightness = function (t) {\n const L0 = getColor(0, true).lab()[0];\n const L1 = getColor(1, true).lab()[0];\n const pol = L0 > L1;\n let L_actual = getColor(t, true).lab()[0];\n const L_ideal = L0 + (L1 - L0) * t;\n let L_diff = L_actual - L_ideal;\n let t0 = 0;\n let t1 = 1;\n let max_iter = 20;\n while (Math.abs(L_diff) > 1e-2 && max_iter-- > 0) {\n (function () {\n if (pol) {\n L_diff *= -1;\n }\n if (L_diff < 0) {\n t0 = t;\n t += (t1 - t) * 0.5;\n } else {\n t1 = t;\n t += (t0 - t) * 0.5;\n }\n L_actual = getColor(t, true).lab()[0];\n return (L_diff = L_actual - L_ideal);\n })();\n }\n return t;\n };\n } else {\n tMapLightness = (t) => t;\n }\n return f;\n };\n\n f.padding = function (p) {\n if (p != null) {\n if (type(p) === 'number') {\n p = [p, p];\n }\n _padding = p;\n return f;\n } else {\n return _padding;\n }\n };\n\n f.colors = function (numColors, out) {\n // If no arguments are given, return the original colors that were provided\n if (arguments.length < 2) {\n out = 'hex';\n }\n let result = [];\n\n if (arguments.length === 0) {\n result = _colors.slice(0);\n } else if (numColors === 1) {\n result = [f(0.5)];\n } else if (numColors > 1) {\n const dm = _domain[0];\n const dd = _domain[1] - dm;\n result = __range__(0, numColors, false).map((i) =>\n f(dm + (i / (numColors - 1)) * dd)\n );\n } else {\n // returns all colors based on the defined classes\n colors = [];\n let samples = [];\n if (_classes && _classes.length > 2) {\n for (\n let i = 1, end = _classes.length, asc = 1 <= end;\n asc ? i < end : i > end;\n asc ? i++ : i--\n ) {\n samples.push((_classes[i - 1] + _classes[i]) * 0.5);\n }\n } else {\n samples = _domain;\n }\n result = samples.map((v) => f(v));\n }\n\n if (chroma[out]) {\n result = result.map((c) => c[out]());\n }\n return result;\n };\n\n f.cache = function (c) {\n if (c != null) {\n _useCache = c;\n return f;\n } else {\n return _useCache;\n }\n };\n\n f.gamma = function (g) {\n if (g != null) {\n _gamma = g;\n return f;\n } else {\n return _gamma;\n }\n };\n\n f.nodata = function (d) {\n if (d != null) {\n _nacol = chroma(d);\n return f;\n } else {\n return _nacol;\n }\n };\n\n return f;\n}\n\nfunction __range__(left, right, inclusive) {\n let range = [];\n let ascending = left < right;\n let end = !inclusive ? right : ascending ? right + 1 : right - 1;\n for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n range.push(i);\n }\n return range;\n}\n","//\n// interpolates between a set of colors uzing a bezier spline\n//\n\n// @requires utils lab\nimport Color from '../Color.js';\nimport '../io/lab/index.js';\nimport scale from './scale.js';\n\n// nth row of the pascal triangle\nconst binom_row = function (n) {\n let row = [1, 1];\n for (let i = 1; i < n; i++) {\n let newrow = [1];\n for (let j = 1; j <= row.length; j++) {\n newrow[j] = (row[j] || 0) + row[j - 1];\n }\n row = newrow;\n }\n return row;\n};\n\nconst bezier = function (colors) {\n let I, lab0, lab1, lab2;\n colors = colors.map((c) => new Color(c));\n if (colors.length === 2) {\n // linear interpolation\n [lab0, lab1] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map((i) => lab0[i] + t * (lab1[i] - lab0[i]));\n return new Color(lab, 'lab');\n };\n } else if (colors.length === 3) {\n // quadratic bezier interpolation\n [lab0, lab1, lab2] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map(\n (i) =>\n (1 - t) * (1 - t) * lab0[i] +\n 2 * (1 - t) * t * lab1[i] +\n t * t * lab2[i]\n );\n return new Color(lab, 'lab');\n };\n } else if (colors.length === 4) {\n // cubic bezier interpolation\n let lab3;\n [lab0, lab1, lab2, lab3] = colors.map((c) => c.lab());\n I = function (t) {\n const lab = [0, 1, 2].map(\n (i) =>\n (1 - t) * (1 - t) * (1 - t) * lab0[i] +\n 3 * (1 - t) * (1 - t) * t * lab1[i] +\n 3 * (1 - t) * t * t * lab2[i] +\n t * t * t * lab3[i]\n );\n return new Color(lab, 'lab');\n };\n } else if (colors.length >= 5) {\n // general case (degree n bezier)\n let labs, row, n;\n labs = colors.map((c) => c.lab());\n n = colors.length - 1;\n row = binom_row(n);\n I = function (t) {\n const u = 1 - t;\n const lab = [0, 1, 2].map((i) =>\n labs.reduce(\n (sum, el, j) =>\n sum + row[j] * u ** (n - j) * t ** j * el[i],\n 0\n )\n );\n return new Color(lab, 'lab');\n };\n } else {\n throw new RangeError('No point in running bezier with only one color.');\n }\n return I;\n};\n\nexport default (colors) => {\n const f = bezier(colors);\n f.scale = () => scale(f);\n return f;\n};\n","/*\n * interpolates between a set of colors uzing a bezier spline\n * blend mode formulas taken from https://web.archive.org/web/20180110014946/http://www.venture-ware.com/kevin/coding/lets-learn-math-photoshop-blend-modes/\n */\n\nimport '../io/rgb/index.js';\nimport chroma from '../chroma.js';\n\nconst blend = (bottom, top, mode) => {\n if (!blend[mode]) {\n throw new Error('unknown blend mode ' + mode);\n }\n return blend[mode](bottom, top);\n};\n\nconst blend_f = (f) => (bottom, top) => {\n const c0 = chroma(top).rgb();\n const c1 = chroma(bottom).rgb();\n return chroma.rgb(f(c0, c1));\n};\n\nconst each = (f) => (c0, c1) => {\n const out = [];\n out[0] = f(c0[0], c1[0]);\n out[1] = f(c0[1], c1[1]);\n out[2] = f(c0[2], c1[2]);\n return out;\n};\n\nconst normal = (a) => a;\nconst multiply = (a, b) => (a * b) / 255;\nconst darken = (a, b) => (a > b ? b : a);\nconst lighten = (a, b) => (a > b ? a : b);\nconst screen = (a, b) => 255 * (1 - (1 - a / 255) * (1 - b / 255));\nconst overlay = (a, b) =>\n b < 128 ? (2 * a * b) / 255 : 255 * (1 - 2 * (1 - a / 255) * (1 - b / 255));\nconst burn = (a, b) => 255 * (1 - (1 - b / 255) / (a / 255));\nconst dodge = (a, b) => {\n if (a === 255) return 255;\n a = (255 * (b / 255)) / (1 - a / 255);\n return a > 255 ? 255 : a;\n};\n\n// # add = (a,b) ->\n// # if (a + b > 255) then 255 else a + b\n\nblend.normal = blend_f(each(normal));\nblend.multiply = blend_f(each(multiply));\nblend.screen = blend_f(each(screen));\nblend.overlay = blend_f(each(overlay));\nblend.darken = blend_f(each(darken));\nblend.lighten = blend_f(each(lighten));\nblend.dodge = blend_f(each(dodge));\nblend.burn = blend_f(each(burn));\n// blend.add = blend_f(each(add));\n\nexport default blend;\n","// cubehelix interpolation\n// based on D.A. Green \"A colour scheme for the display of astronomical intensity images\"\n// http://astron-soc.in/bulletin/11June/289392011.pdf\nimport { type, clip_rgb, TWOPI } from '../utils/index.js';\nimport chroma from '../chroma.js';\nconst { pow, sin, cos } = Math;\n\nexport default function (\n start = 300,\n rotations = -1.5,\n hue = 1,\n gamma = 1,\n lightness = [0, 1]\n) {\n let dh = 0,\n dl;\n if (type(lightness) === 'array') {\n dl = lightness[1] - lightness[0];\n } else {\n dl = 0;\n lightness = [lightness, lightness];\n }\n const f = function (fract) {\n const a = TWOPI * ((start + 120) / 360 + rotations * fract);\n const l = pow(lightness[0] + dl * fract, gamma);\n const h = dh !== 0 ? hue[0] + fract * dh : hue;\n const amp = (h * l * (1 - l)) / 2;\n const cos_a = cos(a);\n const sin_a = sin(a);\n const r = l + amp * (-0.14861 * cos_a + 1.78277 * sin_a);\n const g = l + amp * (-0.29227 * cos_a - 0.90649 * sin_a);\n const b = l + amp * (+1.97294 * cos_a);\n return chroma(clip_rgb([r * 255, g * 255, b * 255, 1]));\n };\n f.start = function (s) {\n if (s == null) {\n return start;\n }\n start = s;\n return f;\n };\n f.rotations = function (r) {\n if (r == null) {\n return rotations;\n }\n rotations = r;\n return f;\n };\n f.gamma = function (g) {\n if (g == null) {\n return gamma;\n }\n gamma = g;\n return f;\n };\n f.hue = function (h) {\n if (h == null) {\n return hue;\n }\n hue = h;\n if (type(hue) === 'array') {\n dh = hue[1] - hue[0];\n if (dh === 0) {\n hue = hue[1];\n }\n } else {\n dh = 0;\n }\n return f;\n };\n f.lightness = function (h) {\n if (h == null) {\n return lightness;\n }\n if (type(h) === 'array') {\n lightness = h;\n dl = h[1] - h[0];\n } else {\n lightness = [h, h];\n dl = 0;\n }\n return f;\n };\n f.scale = () => chroma.scale(f);\n f.hue(hue);\n return f;\n}\n","import Color from '../Color.js';\nconst digits = '0123456789abcdef';\n\nconst { floor, random } = Math;\n\nexport default () => {\n let code = '#';\n for (let i = 0; i < 6; i++) {\n code += digits.charAt(floor(random() * 16));\n }\n return new Color(code, 'hex');\n};\n","import type from './type.js';\n\nconst { log, pow, floor, abs } = Math;\n\nexport function analyze(data, key = null) {\n const r = {\n min: Number.MAX_VALUE,\n max: Number.MAX_VALUE * -1,\n sum: 0,\n values: [],\n count: 0\n };\n if (type(data) === 'object') {\n data = Object.values(data);\n }\n data.forEach((val) => {\n if (key && type(val) === 'object') val = val[key];\n if (val !== undefined && val !== null && !isNaN(val)) {\n r.values.push(val);\n r.sum += val;\n if (val < r.min) r.min = val;\n if (val > r.max) r.max = val;\n r.count += 1;\n }\n });\n\n r.domain = [r.min, r.max];\n\n r.limits = (mode, num) => limits(r, mode, num);\n\n return r;\n}\n\nexport function limits(data, mode = 'equal', num = 7) {\n if (type(data) == 'array') {\n data = analyze(data);\n }\n const { min, max } = data;\n const values = data.values.sort((a, b) => a - b);\n\n if (num === 1) {\n return [min, max];\n }\n\n const limits = [];\n\n if (mode.substr(0, 1) === 'c') {\n // continuous\n limits.push(min);\n limits.push(max);\n }\n\n if (mode.substr(0, 1) === 'e') {\n // equal interval\n limits.push(min);\n for (let i = 1; i < num; i++) {\n limits.push(min + (i / num) * (max - min));\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'l') {\n // log scale\n if (min <= 0) {\n throw new Error(\n 'Logarithmic scales are only possible for values > 0'\n );\n }\n const min_log = Math.LOG10E * log(min);\n const max_log = Math.LOG10E * log(max);\n limits.push(min);\n for (let i = 1; i < num; i++) {\n limits.push(pow(10, min_log + (i / num) * (max_log - min_log)));\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'q') {\n // quantile scale\n limits.push(min);\n for (let i = 1; i < num; i++) {\n const p = ((values.length - 1) * i) / num;\n const pb = floor(p);\n if (pb === p) {\n limits.push(values[pb]);\n } else {\n // p > pb\n const pr = p - pb;\n limits.push(values[pb] * (1 - pr) + values[pb + 1] * pr);\n }\n }\n limits.push(max);\n } else if (mode.substr(0, 1) === 'k') {\n // k-means clustering\n /*\n implementation based on\n http://code.google.com/p/figue/source/browse/trunk/figue.js#336\n simplified for 1-d input values\n */\n let cluster;\n const n = values.length;\n const assignments = new Array(n);\n const clusterSizes = new Array(num);\n let repeat = true;\n let nb_iters = 0;\n let centroids = null;\n\n // get seed values\n centroids = [];\n centroids.push(min);\n for (let i = 1; i < num; i++) {\n centroids.push(min + (i / num) * (max - min));\n }\n centroids.push(max);\n\n while (repeat) {\n // assignment step\n for (let j = 0; j < num; j++) {\n clusterSizes[j] = 0;\n }\n for (let i = 0; i < n; i++) {\n const value = values[i];\n let mindist = Number.MAX_VALUE;\n let best;\n for (let j = 0; j < num; j++) {\n const dist = abs(centroids[j] - value);\n if (dist < mindist) {\n mindist = dist;\n best = j;\n }\n clusterSizes[best]++;\n assignments[i] = best;\n }\n }\n\n // update centroids step\n const newCentroids = new Array(num);\n for (let j = 0; j < num; j++) {\n newCentroids[j] = null;\n }\n for (let i = 0; i < n; i++) {\n cluster = assignments[i];\n if (newCentroids[cluster] === null) {\n newCentroids[cluster] = values[i];\n } else {\n newCentroids[cluster] += values[i];\n }\n }\n for (let j = 0; j < num; j++) {\n newCentroids[j] *= 1 / clusterSizes[j];\n }\n\n // check convergence\n repeat = false;\n for (let j = 0; j < num; j++) {\n if (newCentroids[j] !== centroids[j]) {\n repeat = true;\n break;\n }\n }\n\n centroids = newCentroids;\n nb_iters++;\n\n if (nb_iters > 200) {\n repeat = false;\n }\n }\n\n // finished k-means clustering\n // the next part is borrowed from gabrielflor.it\n const kClusters = {};\n for (let j = 0; j < num; j++) {\n kClusters[j] = [];\n }\n for (let i = 0; i < n; i++) {\n cluster = assignments[i];\n kClusters[cluster].push(values[i]);\n }\n let tmpKMeansBreaks = [];\n for (let j = 0; j < num; j++) {\n tmpKMeansBreaks.push(kClusters[j][0]);\n tmpKMeansBreaks.push(kClusters[j][kClusters[j].length - 1]);\n }\n tmpKMeansBreaks = tmpKMeansBreaks.sort((a, b) => a - b);\n limits.push(tmpKMeansBreaks[0]);\n for (let i = 1; i < tmpKMeansBreaks.length; i += 2) {\n const v = tmpKMeansBreaks[i];\n if (!isNaN(v) && limits.indexOf(v) === -1) {\n limits.push(v);\n }\n }\n }\n return limits;\n}\n","import Color from '../Color.js';\nimport '../ops/luminance.js';\n\nexport default (a, b) => {\n // WCAG contrast ratio\n // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\n a = new Color(a);\n b = new Color(b);\n const l1 = a.luminance();\n const l2 = b.luminance();\n return l1 > l2 ? (l1 + 0.05) / (l2 + 0.05) : (l2 + 0.05) / (l1 + 0.05);\n};\n","import Color from '../Color.js';\nconst { sqrt, pow, min, max, atan2, abs, cos, sin, exp, PI } = Math;\n\nexport default function (a, b, Kl = 1, Kc = 1, Kh = 1) {\n // Delta E (CIE 2000)\n // see http://www.brucelindbloom.com/index.html?Eqn_DeltaE_CIE2000.html\n var rad2deg = function (rad) {\n return (360 * rad) / (2 * PI);\n };\n var deg2rad = function (deg) {\n return (2 * PI * deg) / 360;\n };\n a = new Color(a);\n b = new Color(b);\n const [L1, a1, b1] = Array.from(a.lab());\n const [L2, a2, b2] = Array.from(b.lab());\n const avgL = (L1 + L2) / 2;\n const C1 = sqrt(pow(a1, 2) + pow(b1, 2));\n const C2 = sqrt(pow(a2, 2) + pow(b2, 2));\n const avgC = (C1 + C2) / 2;\n const G = 0.5 * (1 - sqrt(pow(avgC, 7) / (pow(avgC, 7) + pow(25, 7))));\n const a1p = a1 * (1 + G);\n const a2p = a2 * (1 + G);\n const C1p = sqrt(pow(a1p, 2) + pow(b1, 2));\n const C2p = sqrt(pow(a2p, 2) + pow(b2, 2));\n const avgCp = (C1p + C2p) / 2;\n const arctan1 = rad2deg(atan2(b1, a1p));\n const arctan2 = rad2deg(atan2(b2, a2p));\n const h1p = arctan1 >= 0 ? arctan1 : arctan1 + 360;\n const h2p = arctan2 >= 0 ? arctan2 : arctan2 + 360;\n const avgHp =\n abs(h1p - h2p) > 180 ? (h1p + h2p + 360) / 2 : (h1p + h2p) / 2;\n const T =\n 1 -\n 0.17 * cos(deg2rad(avgHp - 30)) +\n 0.24 * cos(deg2rad(2 * avgHp)) +\n 0.32 * cos(deg2rad(3 * avgHp + 6)) -\n 0.2 * cos(deg2rad(4 * avgHp - 63));\n let deltaHp = h2p - h1p;\n deltaHp =\n abs(deltaHp) <= 180\n ? deltaHp\n : h2p <= h1p\n ? deltaHp + 360\n : deltaHp - 360;\n deltaHp = 2 * sqrt(C1p * C2p) * sin(deg2rad(deltaHp) / 2);\n const deltaL = L2 - L1;\n const deltaCp = C2p - C1p;\n const sl = 1 + (0.015 * pow(avgL - 50, 2)) / sqrt(20 + pow(avgL - 50, 2));\n const sc = 1 + 0.045 * avgCp;\n const sh = 1 + 0.015 * avgCp * T;\n const deltaTheta = 30 * exp(-pow((avgHp - 275) / 25, 2));\n const Rc = 2 * sqrt(pow(avgCp, 7) / (pow(avgCp, 7) + pow(25, 7)));\n const Rt = -Rc * sin(2 * deg2rad(deltaTheta));\n const result = sqrt(\n pow(deltaL / (Kl * sl), 2) +\n pow(deltaCp / (Kc * sc), 2) +\n pow(deltaHp / (Kh * sh), 2) +\n Rt * (deltaCp / (Kc * sc)) * (deltaHp / (Kh * sh))\n );\n return max(0, min(100, result));\n}\n","import Color from '../Color.js';\n\n// simple Euclidean distance\nexport default function (a, b, mode = 'lab') {\n // Delta E (CIE 1976)\n // see http://www.brucelindbloom.com/index.html?Equations.html\n a = new Color(a);\n b = new Color(b);\n const l1 = a.get(mode);\n const l2 = b.get(mode);\n let sum_sq = 0;\n for (let i in l1) {\n const d = (l1[i] || 0) - (l2[i] || 0);\n sum_sq += d * d;\n }\n return Math.sqrt(sum_sq);\n}\n","import Color from '../Color.js';\n\nexport default (...args) => {\n try {\n new Color(...args);\n return true;\n // eslint-disable-next-line\n } catch (e) {\n return false;\n }\n};\n","// some pre-defined color scales:\nimport chroma from '../chroma.js';\nimport '../io/hsl/index.js';\nimport scale from '../generator/scale.js';\n\nexport default {\n cool() {\n return scale([chroma.hsl(180, 1, 0.9), chroma.hsl(250, 0.7, 0.4)]);\n },\n hot() {\n return scale(['#000', '#f00', '#ff0', '#fff'], [0, 0.25, 0.75, 1]).mode(\n 'rgb'\n );\n }\n};\n","/**\n ColorBrewer colors for chroma.js\n\n Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The\n Pennsylvania State University.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software distributed\n under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n CONDITIONS OF ANY KIND, either express or implied. See the License for the\n specific language governing permissions and limitations under the License.\n*/\n\nconst colorbrewer = {\n // sequential\n OrRd: ['#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59', '#ef6548', '#d7301f', '#b30000', '#7f0000'],\n PuBu: ['#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858'],\n BuPu: ['#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb1', '#88419d', '#810f7c', '#4d004b'],\n Oranges: ['#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c', '#f16913', '#d94801', '#a63603', '#7f2704'],\n BuGn: ['#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4', '#41ae76', '#238b45', '#006d2c', '#00441b'],\n YlOrBr: ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506'],\n YlGn: ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529'],\n Reds: ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d'],\n RdPu: ['#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1', '#dd3497', '#ae017e', '#7a0177', '#49006a'],\n Greens: ['#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476', '#41ab5d', '#238b45', '#006d2c', '#00441b'],\n YlGnBu: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'],\n Purples: ['#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8', '#807dba', '#6a51a3', '#54278f', '#3f007d'],\n GnBu: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4', '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'],\n Greys: ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000'],\n YlOrRd: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'],\n PuRd: ['#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0', '#e7298a', '#ce1256', '#980043', '#67001f'],\n Blues: ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'],\n PuBuGn: ['#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf', '#3690c0', '#02818a', '#016c59', '#014636'],\n Viridis: ['#440154', '#482777', '#3f4a8a', '#31678e', '#26838f', '#1f9d8a', '#6cce5a', '#b6de2b', '#fee825'],\n\n // diverging\n Spectral: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'],\n RdYlGn: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850', '#006837'],\n RdBu: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'],\n PiYG: ['#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef', '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221', '#276419'],\n PRGn: ['#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8', '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837', '#00441b'],\n RdYlBu: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090', '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695'],\n BrBG: ['#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3', '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e', '#003c30'],\n RdGy: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d', '#1a1a1a'],\n PuOr: ['#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6', '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788', '#2d004b'],\n\n // qualitative\n Set2: ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f', '#e5c494', '#b3b3b3'],\n Accent: ['#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0', '#f0027f', '#bf5b17', '#666666'],\n Set1: ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf', '#999999'],\n Set3: ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462', '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'],\n Dark2: ['#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02', '#a6761d', '#666666'],\n Paired: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'],\n Pastel2: ['#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae', '#f1e2cc', '#cccccc'],\n Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2']\n};\n\n// add lowercase aliases for case-insensitive matches\nfor (let key of Object.keys(colorbrewer)) {\n colorbrewer[key.toLowerCase()] = colorbrewer[key];\n}\n\nexport default colorbrewer;\n","import chroma from './src/chroma.js';\n\n// feel free to comment out anything to rollup\n// a smaller chroma.js built\n\n// io --> convert colors\nimport './src/io/cmyk/index.js';\nimport './src/io/css/index.js';\nimport './src/io/gl/index.js';\nimport './src/io/hcg/index.js';\nimport './src/io/hex/index.js';\nimport './src/io/hsi/index.js';\nimport './src/io/hsl/index.js';\nimport './src/io/hsv/index.js';\nimport './src/io/lab/index.js';\nimport './src/io/lch/index.js';\nimport './src/io/named/index.js';\nimport './src/io/num/index.js';\nimport './src/io/rgb/index.js';\nimport './src/io/temp/index.js';\nimport './src/io/oklab/index.js';\nimport './src/io/oklch/index.js';\n\n// operators --> modify existing Colors\nimport './src/ops/alpha.js';\nimport './src/ops/clipped.js';\nimport './src/ops/darken.js';\nimport './src/ops/get.js';\nimport './src/ops/luminance.js';\nimport './src/ops/mix.js';\nimport './src/ops/premultiply.js';\nimport './src/ops/saturate.js';\nimport './src/ops/set.js';\nimport './src/ops/shade.js';\n\n// interpolators\nimport './src/interpolator/rgb.js';\nimport './src/interpolator/lrgb.js';\nimport './src/interpolator/lab.js';\nimport './src/interpolator/lch.js';\nimport './src/interpolator/num.js';\nimport './src/interpolator/hcg.js';\nimport './src/interpolator/hsi.js';\nimport './src/interpolator/hsl.js';\nimport './src/interpolator/hsv.js';\nimport './src/interpolator/oklab.js';\nimport './src/interpolator/oklch.js';\n\n// generators -- > create new colors\nimport average from './src/generator/average.js';\nimport bezier from './src/generator/bezier.js';\nimport blend from './src/generator/blend.js';\nimport cubehelix from './src/generator/cubehelix.js';\nimport mix from './src/generator/mix.js';\nimport random from './src/generator/random.js';\nimport scale from './src/generator/scale.js';\n\n// other utility methods\nimport { analyze } from './src/utils/analyze.js';\nimport contrast from './src/utils/contrast.js';\nimport deltaE from './src/utils/delta-e.js';\nimport distance from './src/utils/distance.js';\nimport { limits } from './src/utils/analyze.js';\nimport valid from './src/utils/valid.js';\nimport input from './src/io/input.js';\n\n// scale\nimport scales from './src/utils/scales.js';\n\n// colors\nimport colors from './src/colors/w3cx11.js';\nimport brewer from './src/colors/colorbrewer.js';\n\nObject.assign(chroma, {\n average,\n bezier,\n blend,\n cubehelix,\n mix,\n interpolate: mix,\n random,\n scale,\n analyze,\n contrast,\n deltaE,\n distance,\n limits,\n valid,\n scales,\n input,\n colors,\n brewer\n});\n\nexport default chroma;\n","import chroma from 'chroma-js'\n\nexport const baseColors = {\n primaryGreen: '#95C92C',\n secondaryGreen: '#B5E655',\n primaryRed: '#F06000',\n secondaryRed: '#FF8F00',\n primaryGrey: '#E0E0E0',\n}\n\nconst fontColors = {\n white: 'text-gray-200',\n black: 'text-gray-700',\n}\n\nexport class ColorManager {\n // List of Link colors\n private colors: string[] = [\n 'rgb(153,128,119)',\n 'rgb(199,151,129)',\n 'rgb(187,167,137)',\n 'rgb(205,197,177)',\n 'rgb(224,222,197)',\n 'rgb(194,207,179)',\n 'rgb(173,183,167)',\n 'rgb(160,167,159)',\n 'rgb(140,144,145)',\n 'rgb(62,85,100)',\n 'rgb(106,119,134)',\n 'rgb(150,151,170)',\n 'rgb(111,85,101)',\n 'rgb(128,106,109)'\n ]\n\n private colorIndex: number = 0\n\n // Converts 'rgb(r,g,b)' to an array [r, g, b]\n private rgbStringToArray(rgb: string): number[] {\n const result = rgb.match(/\\d+/g)\n return result ? result.map(Number) : [0, 0, 0]\n }\n\n // Convert RGB to HSL\n private rgbToHsl(rgb: string): number[] {\n const [r, g, b] = this.rgbStringToArray(rgb).map(v => v / 255)\n\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n // eslint-disable-next-line prefer-const\n let h: number = 0, s: number, l: number = (max + min) / 2\n\n if (max === min) {\n h = s = 0 // achromatic\n } else {\n const d = max - min\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n switch (max) {\n case r: \n h = (g - b) / d + (g < b ? 6 : 0) \n break\n case g: \n h = (b - r) / d + 2 \n break\n case b: \n h = (r - g) / d + 4 \n break\n }\n h /= 6\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100)]\n }\n\n // Convert HSL to string format\n private hslToString(hsl: number[]): string {\n return `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`\n }\n\n // Helper function to calculate Euclidean distance in HSL space\n private calculateColorDistanceHSL(color1: string, color2: string): number {\n const [h1, s1, l1] = this.rgbToHsl(color1)\n const [h2, s2, l2] = this.rgbToHsl(color2)\n\n return Math.sqrt(Math.pow(h1 - h2, 2) + Math.pow(s1 - s2, 2) + Math.pow(l1 - l2, 2))\n }\n\n // Get 'count' most distinct colors from the list based on distance in HSL space\n public getMostDistinctColors(count: number): string[] {\n if (count >= this.colors.length) return this.colors.map(c => this.hslToString(this.rgbToHsl(c))) // Return all in HSL if needed\n\n const distinctColors: string[] = [this.hslToString(this.rgbToHsl(this.colors[0]))] // Start with first color\n\n // Find most distinct colors by maximizing distance in HSL space\n for (let i = 1; i < count; i++) {\n let maxDistance = -1\n let nextColor = ''\n\n for (const color of this.colors) {\n if (!distinctColors.includes(this.hslToString(this.rgbToHsl(color)))) {\n const minDistanceToSet = Math.min(\n ...distinctColors.map(selectedColor => this.calculateColorDistanceHSL(this.hslToString(this.rgbToHsl(selectedColor)), color))\n )\n if (minDistanceToSet > maxDistance) {\n maxDistance = minDistanceToSet\n nextColor = color\n }\n }\n }\n\n distinctColors.push(this.hslToString(this.rgbToHsl(nextColor)))\n }\n\n return distinctColors\n }\n\n // Get next color in HSL format\n public getNextColor(): string {\n return this.hslToString(this.rgbToHsl(this.colors[this.colorIndex++ % this.colors.length]))\n }\n\n // Reset color index to start rotation again\n public resetColorIndex(index: number = 0): void {\n this.colorIndex = index\n }\n}\n\n/**\n * Checks the lightness of the color and returns the appropriate font color\n * @param hsl HSL color string\n * @returns \n */\nexport function getFontColorForHSL(hsl: string): string {\n // Extract the lightness value from the HSL string\n const hslValues = hsl.match(/\\d+/g)?.map(Number)\n \n if (!hslValues || hslValues.length !== 3) {\n throw new Error('Invalid HSL format')\n }\n\n const lightness = hslValues[2]\n\n // Return white font color if the background is dark,\n // otherwise return black font color\n return lightness < 50 ? fontColors.white : fontColors.black\n}\n\n\n/**\n * Create a list of colors based on the number of objects\n * Rainbow style for now, we can limit this range later\n * @param n number of colors\n * @returns list of HSL colors\n */\nexport function generateColors(n: number): string[] {\n const colors: string[] = []\n for (let i = 0; i < n; i++) {\n const hue = Math.round(360 * i / n)\n colors.push(`hsl(${hue}, 100%, 80%)`)\n }\n return colors\n}\n\n/**\n * Convert hsl to hex, https://stackoverflow.com/questions/36721830/convert-hsl-to-rgb-and-hex\n * @param h hue\n * @param s saturation\n * @param l lightness\n * @returns Hex color\n */\nexport function hslToHex(h: number, s: number, l: number) {\n l /= 100\n const a = s * Math.min(l, 1 - l) / 100\n const f = n => {\n const k = (n + h / 30) % 12\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\n return Math.round(255 * color).toString(16).padStart(2, '0') // convert to Hex and prefix \"0\" if needed\n }\n return `#${f(0)}${f(8)}${f(4)}`\n}\n\n/**\n * Get gradient color scale for custom color length\n * Only supports a start and an end color\n * @param numColors number of colors in the gradient\n * @param startColor optional otherwise it uses primaryGreen\n * @param endColor optional otherwise it uses primaryRed\n * @returns \n */\nexport function generateGradientColorScale(numColors: number, startColor: string = baseColors.primaryGreen, endColor: string = baseColors.primaryRed) {\n return chroma.scale([startColor, endColor]).mode('lab').colors(numColors)\n}\n\n/**\n * Get specific color from gradient based on a min and max value\n * @param startColor optional otherwise it uses primaryGreen\n * @param endColor optional otherwise it uses primaryRed\n * @param value number to get color for\n * @param min minimum value for interpolation\n * @param max maximum value for interpolation\n * @returns \n */\nexport function getValueColorFromGradient(value: number, min: number, max: number, startColor: string = baseColors.primaryGreen, endColor: string = baseColors.primaryRed) {\n const normalizedValue = (value - min) / (max - min)\n return chroma.scale([startColor, endColor])(normalizedValue).hex()\n}","import type { \n\tLifeCycleStage, \n\tImpactCategoryKey, \n\tAssembly as LcaxAssembly,\n\tProduct as LcaxProduct \n} from 'lcax'\nimport type { FilterList } from './filters'\n\n// Material and Assembly interfaces\n\nexport enum Source {\n LCAbyg,\n Organisation,\n Revalu,\n ECOPortal,\n}\n\n\nexport type Emission = Partial<{\n\t[impactCategory in ExtendedImpactCategoryKey]: \n\t\tLifeCycleStageEmission\n}>\n\nexport type LifeCycleStageEmission = {\n\t[lifecycleStage in LifeCycleStage]: number\n}\n\n/**\n * Product interface, extends LcaxProduct and adds emission data\n */\nexport interface Product extends LcaxProduct {\n emission: Emission\n materialFraction?: number\n source: Source\n}\n\n/**\n * Assembly interface, extends LcaxAssembly and adds emission data and replaces products with local one\n */\nexport interface Assembly extends Omit {\n\tproducts: Record\n\temission: Emission\n}\n\n/**\n * Mapping step used in saving and restoring mappings\n */\nexport interface MappingStep {\n\tfilterId: string\n\tnestedGroupId: string\n\tmaterial: Product | Assembly\n}\n\n/**\n * Mapping interface, stores all metadata of the mapping.\n * Keeps a list of all filters so we dont have to cross reference with relationships\n */\nexport interface Mapping {\n id: string\n name: string\n\tfilters: FilterList[] \n\tsteps: MappingStep[]\n}\n\n/**\n * Filter parameters for material and assembly list.\n */\nexport interface MaterialFilterParam {\n\tname: string,\n\tselected: boolean,\n\tfilterParamter: string\n}\n\n/**\n * Sorting option for material and assembly list.\n */\nexport interface MaterialSortingOption {\n\tparameter: string\n\tdirection: string\n}\n\n/**\n * Units for materials and assemblies.\n */\nexport type MetricUnits = \"m\" | \"m2\" | \"m3\" | \"pcs\" | \"kg\" | \"l\" | \"tonnes\"\n\n/**\n * Extended impact categories for application\n * Array of possible impact categories to use, increase as needed\n */\nexport type ExtendedImpactCategoryKey = 'gwp_total' | 'gwp_fossil' | 'gwp_biogenic' | 'gwp_LULUC' | ImpactCategoryKey\nexport const extendedImpactCategoryKeys: readonly ExtendedImpactCategoryKey[] = [\n 'gwp',\n 'gwp_total',\n 'gwp_fossil',\n 'gwp_biogenic',\n 'gwp_LULUC',\n 'odp',\n 'ap',\n 'pocp',\n] as const\n\nexport const LifeCycleStages: readonly LifeCycleStage[] = [\n 'a1a3',\n 'a4',\n 'a5',\n 'b1',\n 'b2',\n 'b3',\n 'b4',\n 'b5',\n 'b6',\n 'c1',\n 'c2',\n 'c3',\n 'c4',\n 'd',\n] as const","import { type Mapping, type MaterialFilterParam, type MaterialSortingOption, type Assembly, type Product, Source } from '@/models/material'\nimport { defineStore } from 'pinia'\nimport materialList from '@/tests/objects/materialList.json'\nimport type { NestedGroup } from \"@/models/filters\"\n\nimport { applyParamFilters } from '@/utils/material'\n\nexport const useMaterialStore = defineStore({\n id: 'materialStore',\n state: () => ({\n materials: [] as Product[],\n assemblies: [] as Assembly[],\n currentMapping: null as Product | Assembly | null,\n currentAssemby: null as Assembly | null,\n sorting: { parameter: 'name', direction: 'asc' } as MaterialSortingOption,\n EPDMode: true,\n EPDList: [] as Product[],\n assemblyList: [] as Assembly[],\n //Filters this could be dynamic?\n paramFilters: {\n matParam: [] as MaterialFilterParam[],\n subParam: [] as MaterialFilterParam[],\n unitParam: [] as MaterialFilterParam[],\n },\n sortingParameters: [\n { \"filterName\": 'name',\n \"displayName\": \"Name\",\n \"paramName\": null \n },\n { \"filterName\": 'subType',\n \"displayName\": \"EPD Type\",\n \"paramName\": \"subParam\"\n },\n { \"filterName\": 'materialType',\n \"displayName\": \"Material Type\",\n \"paramName\": \"matParam\"\n },\n { \"filterName\": 'declared_unit',\n \"displayName\": \"Declared Unit\",\n \"paramName\": \"unitParam\"\n }\n ],\n mapping: null as Mapping | null,\n }),\n actions: {\n /**\n * Add material to store\n * @param material \n */\n addMaterial(material: Product) {\n this.materials.push(material)\n this.updateParameters()\n },\n \n /**\n * Add material list to store\n * @param materials\n */\n addMaterialList(materials: Product[]) {\n this.materials = materials\n this.updateParameters()\n },\n\n /**\n * Remove material from store\n * @param material \n */\n removeMaterial(material: Product) {\n const index = this.materials.indexOf(material)\n if (index !== -1) {\n this.materials.splice(index, 1)\n }\n },\n\n /**\n * Add assembly to store\n * @param assembly\n */\n addAssembly(assembly: Assembly) {\n const index = this.assemblies.findIndex((el) => el.id === assembly.id)\n if (index !== -1) {\n this.assemblies[index] = assembly;\n } else {\n this.assemblies.push(assembly);\n }\n },\n\n /**\n * Remove assembly from store\n * @param assembly\n */\n removeAssembly(assembly: Assembly) {\n const index = this.assemblies.indexOf(assembly)\n if (index !== -1) {\n this.assemblies.splice(index, 1)\n }\n },\n\n /**\n * Set current mapping material which is being dragged\n * @param mapping either EPD or Assembly\n */\n setCurrentMapping(mapping: Product | Assembly) {\n this.currentMapping = mapping\n },\n\n /**\n * Set current assembly which is being dragged\n * @param assembly\n */\n setCurrentAssembly(assembly: Assembly) {\n this.currentAssemby = assembly\n },\n\n /**\n * set filtered EPD list\n */\n setFilteredMaterials(materials: Product[]) {\n this.EPDList = materials\n },\n\n /**\n * Returns the current mapping\n */\n getCurrentMapping() {\n return this.mapping\n },\n\n /**\n * Update EPD list from JSON path \n */\n async materialsFromJson() {\n try {\n this.materials = materialList.map((material: any) => ({\n ...material,\n metaData: {\n materialType: material[\"materialType\"],\n Collection: material?.metaData?.Collection ?? \"-\", // Check for metaData.Collection, set to \"-\" if it doesn't exist\n },\n source: Source.LCAbyg\n })) as any\n\n this.EPDList = this.materials\n this.updateParameters()\n } catch (error) {\n console.error('Error fetching JSON:', error)\n }\n },\n\n /**\n * Update filterable parameters from material list\n * DEPRICATED\n */\n updateParameters() {\n const uniqueMaterialTypes = Array.from(\n new Set(this.materials.map((mat) => mat.metaData?.materialType))\n ).filter(Boolean) as string[]\n const uniqueDeclaredUnits = Array.from(\n new Set(this.materials.map((mat) => mat.unit))\n ).filter(Boolean) as string[]\n\n this.paramFilters.matParam = uniqueMaterialTypes.map((name) => ({ \n name: name, \n selected: false,\n filterParamter: 'metaData.materialType'\n }))\n this.paramFilters.unitParam = uniqueDeclaredUnits.map((name) => ({ \n name: name, \n selected: false,\n filterParamter: 'unit'\n }))\n },\n\n /**\n * Set sorting option and sort the list\n * DEPRICATED\n */\n setSorting(parameter: string, direction: string) {\n const sorting = { parameter, direction }\n this.sorting = sorting\n this.sortList()\n },\n\n /**\n * Filter EPD list based on selected parameters\n * DEPRICATED\n */\n triggerParamSort() {\n if(this.EPDMode === true) {\n // Reset EPDList to all EPDs\n this.EPDList = this.materials\n this.sortList()\n // Go through each paramFilters and check if any are selected\n for (const key in this.paramFilters) {\n // If none of the filters are selected then take all EPDs\n if (!this.paramFilters[key].some((param) => param.selected)) {\n continue\n } else {\n // Update the filtered list\n this.EPDList = applyParamFilters(this.EPDList, this.paramFilters[key])\n }\n }\n } else {\n // Filter assembly list\n this.assemblyList = this.assemblyList.filter((assembly) => {\n // Check if at least one product in the assembly matches the filter\n return Object.values(assembly.products).some((product) => {\n for (const key in this.paramFilters) {\n // If none of the filters are selected, skip this filter\n if (!this.paramFilters[key].some((param) => param.selected)) {\n continue\n }\n // Apply filters to each product in the assembly\n const filteredProducts = applyParamFilters([product], this.paramFilters[key])\n // If any product matches the filters, include the assembly\n if (filteredProducts.length > 0) {\n return true\n }\n }\n return false\n })\n })\n }\n },\n\n /**\n * Reset sorting to default\n */\n resetSorting() {\n this.sorting = { parameter: 'name', direction: 'asc' }\n },\n\n /**\n * Sort filteredList by set sorting Option\n */\n sortList() {\n const { parameter, direction } = this.sorting\n this.EPDList.sort((a, b) => {\n if (a[parameter] < b[parameter]) {\n return direction === 'asc' ? -1 : 1\n }\n if (a[parameter] > b[parameter]) {\n return direction === 'asc' ? 1 : -1\n }\n return 0\n })\n },\n\n /**\n * Set Mapping for saving and reloading from firebase\n */\n setMapping(mapping: Mapping) {\n this.mapping = mapping\n },\n\n /**\n * Update Mapping material for specific nesterGroupId\n * @param nestedGroupId id for the group to update\n * @param material EPD or Assembly cannot be null\n */\n updateMappingMaterial(nestedGroupId: string, material: Product | Assembly) {\n if (!this.mapping) {\n this.mapping = {\n id: crypto.randomUUID(),\n name: 'temp',\n filters: [],\n steps: []\n }\n }\n const index = this.mapping.steps.findIndex((step) => step.nestedGroupId === nestedGroupId)\n if (index !== -1) {\n this.mapping.steps[index].material = material\n }\n },\n\n /**\n * Remove material for nested group\n * @param nestedGroupId nested Group Id\n */\n removeMappingMaterial(nestedGroupId: string) {\n const index = this.mapping.steps.findIndex((mat) => mat.nestedGroupId === nestedGroupId)\n if (index !== -1) {\n this.mapping.steps.splice(index, 1)\n }\n },\n\n /**\n * Add step to current mapping\n * @param filterId filter id from current filter list to add to mapping object\n * @param nestedGroup nested group to add mapping towards \n * @param material material to add to mapping\n */\n addStep(nestedGroup: NestedGroup, material: Product | Assembly, filterId: string) {\n this.mapping?.steps.push({\n filterId: filterId,\n nestedGroupId: nestedGroup.id,\n material\n })\n }\n }\n})","/**\n * @description GraphQL query to fetch user and server information.\n */\nexport const userInfoQuery = `\n query {\n user {\n name\n id\n avatar\n email\n },\n serverInfo {\n name\n company\n }\n }`\n\n/**\n * @description GraphQL query to fetch project versions.\n * @param id - The ID of the stream.\n */\nexport const projectVersionsQuery = `\n query($id: String!) {\n stream(id: $id){\n name\n updatedAt\n id\n commits{\n totalCount\n cursor\n items{\n id\n message\n branchName\n sourceApplication\n referencedObject\n authorName\n createdAt\n }\n }\n }\n }`\n\n/**\n * @description GraphQL query to search for streams.\n * @param searchText - The text to search for.\n */\nexport const streamSearchQuery = `\n query($searchText: String!) {\n streams(query: $searchText) {\n totalCount\n cursor\n items {\n id\n name\n updatedAt\n }\n }\n }`\n\n/**\n * @description GraphQL query to fetch the latest streams.\n */\nexport const latestStreamsQuery = `query {\n streams(limit: 10){\n cursor\n totalCount\n items {\n id\n name\n description\n createdAt\n updatedAt\n }\n }\n}`\n\nexport const modelIdQuery = `query($projectId: String!) {\n project(id: $projectId) {\n models {\n items {\n id\n }\n }\n }\n}\n`\n\n/**\n * @description GraphQL query to fetch children objects and their parameters based on selection.\n * @param streamId - The ID of the stream.\n * @param objectId - The ID of the object.\n * @param select - An array of parameters to include for each object\n */\nexport const selectedObjectsQuery = `query Stream($streamId: String!, $objectId: String!, $select: [String]) {\n stream(id: $streamId) {\n object(id: $objectId) {\n totalChildrenCount\n elements: children(select: $select limit:1000000){\n objects {\n id\n data\n }\n }\n }\n }\n}`\n\n/**\n * @description DEPRECATED GraphQL query to fetch a stream object use selectedObjectsQuery instead\n * @param streamId - The ID of the stream.\n * @param objectId - The ID of the object.\n */\nexport const streamObjectQuery = `query($streamId: String!, $objectId: String!) {\n stream(id: $streamId){\n object(id: $objectId){\n totalChildrenCount\n id\n speckleType\n data\n children(select:[\"speckle_type\",\"type\", \"family\", \"category\", \"level.name\", \"level.elevation\", \"level.id\", \"parameters.HOST_AREA_COMPUTED.value\", \"parameters.HOST_VOLUME_COMPUTED.value\",\"height\"] limit:1000000){\n totalCount\n cursor\n objects{\n id\n data\n }\n }\n }\n }\n}`\n","/**\n * Combines and gets the selection variable to get proper information from your speckle project\n * @param sourceApplication source application as string\n * @returns array of strings to be set as variables for graphQL queries\n */\nexport function speckleSelection(sourceApplication: string) {\n\tconst selection: string[] = []\n\tselection.push(...generalParameters)\n\n\tif (sourceApplication.includes('Archicad'))\n\t\tselection.push(...archicadParameters)\n\n\tif (sourceApplication.includes('Revit')) selection.push(...revitParameters)\n\n\tif (sourceApplication.includes('IFC')) selection.push(...ifcParameters)\n\n\tif (\n\t\tsourceApplication.includes('Rhino') &&\n\t\tsourceApplication.includes('Grasshopper')\n\t)\n\t\tselection.push(...rhinoParameters)\n\n\treturn selection\n}\n\n/**\n * General geometry information that speckle sets from all supported applications\n */\nconst generalParameters = ['name', 'speckleType', 'height', 'width', 'level']\n\n/**\n * Archicad building element information that speckle sets when sent from Archicad\n */\nconst archicadParameters = [\n\t'elementType',\n\t'area',\n\t'volume',\n\t'number',\n\t'sideMaterialName',\n\t'oppositeMaterialName',\n\t'referenceMaterialName',\n\t'botMat',\n\t'topMat',\n\t'sideMat',\n\t'buildingMaterialName',\n\t'classifications'\n]\n\n/**\n * Revit building element information that speckle sets when sent from Revit\n */\nconst revitParameters = [\n\t'type',\n\t'family',\n\t'category',\n\t'parameters.HOST_AREA_COMPUTED.value',\n\t'parameters.HOST_VOLUME_COMPUTED.value'\n]\n\n/**\n * IFC building element information that speckle sets when sent from IFC\n * THIS NEEDS TO BE EXPANDED\n */\nconst ifcParameters = ['Name', 'GlobalId', 'Type', 'BIP', 'Tag']\n\n/**\n * Rhino building element information that speckle sets when sent from Rhino\n */\nconst rhinoParameters = ['area', 'provenance', 'volume']\n","/**\n * This file contains utility functions for working with Speckle, including authentication, data fetching, and object conversion.\n *\n * @packageDocumentation\n */\nimport type { Project } from '@/models/project'\nimport type { ResponseObject, ResponseObjectStream } from '@/models/speckle'\nimport type { GeometryObject, Quantity } from '@/models/geometryObject'\nimport type { MetricUnits } from '@/models/material'\n\nimport { selectedObjectsQuery } from '@/graphql/speckleQueries'\nimport { speckleSelection } from '@/graphql/speckleVariables'\nimport {\n\tlatestStreamsQuery,\n\tprojectVersionsQuery,\n\tstreamObjectQuery,\n\tstreamSearchQuery,\n\tuserInfoQuery,\n\tmodelIdQuery\n} from '@/graphql/speckleQueries'\n\nimport { reportErrorToSentry } from './monitoring'\n\nimport { useSpeckleStore } from '@/stores/speckle'\nimport { useSettingsStore } from '@/stores/settings'\n\n\nexport const APP_NAME = 'SpeckLCA'\n\nexport const TOKEN = `${APP_NAME}.AuthToken`\nexport const REFRESH_TOKEN = `${APP_NAME}.RefreshToken`\nexport const CHALLENGE = `${APP_NAME}.Challenge`\n\n// TODO Update all these to Project, Model and Version terminology.\n\n/**\n * Redirects the user to the Speckle authentication page.\n * Generates a random challenge, saves it in localStorage, and redirects the user to the authentication page.\n */\nexport function navigateToAuthPage() {\n\tconst settingsStore = useSettingsStore()\n\t// Generate random challenge.\n\tconst challenge =\n\t\tMath.random().toString(36).substring(2, 15) +\n\t\tMath.random().toString(36).substring(2, 15)\n\n\t// Save challenge in localStorage.\n\tlocalStorage.setItem(CHALLENGE, challenge)\n\n\t// Send user to auth page.\n\twindow.location.href = `${settingsStore.keySettings.speckleConfig.serverUrl}/authn/verify/${\n\t\tsettingsStore.keySettings.speckleConfig.id\n\t}/${challenge}`\n}\n\n/**\n * Logs out the user by removing the token and refreshToken from localStorage.\n */\nexport function speckleLogOut() {\n\t// Remove both token and refreshToken from localStorage\n\tlocalStorage.removeItem(TOKEN)\n\tlocalStorage.removeItem(REFRESH_TOKEN)\n}\n\n/**\n * Exchanges the access code for a token and refresh token.\n * @param accessCode The access code to exchange.\n * @returns A promise that resolves to the response data.\n */\nexport async function exchangeAccessCode(accessCode: string) {\n\tconst settingsStore = useSettingsStore()\n\tconst res = await fetch(`${settingsStore.keySettings.speckleConfig.serverUrl}/auth/token/`, {\n\t\tmethod: 'POST',\n\t\theaders: {\n\t\t\t'Content-Type': 'application/json'\n\t\t},\n\t\tbody: JSON.stringify({\n\t\t\taccessCode: accessCode,\n\t\t\tappId: settingsStore.keySettings.speckleConfig.id,\n\t\t\tappSecret: settingsStore.keySettings.speckleConfig.secret,\n\t\t\tchallenge: localStorage.getItem(CHALLENGE)\n\t\t})\n\t})\n\n\t/**\n\t * Try retrieving the token.\n\t * If successful, remove challenge and set the new token and refresh token.\n\t * */\n\tconst data = await res.json()\n\tif (data.token) {\n\t\tlocalStorage.removeItem(CHALLENGE)\n\t\tlocalStorage.setItem(TOKEN, data.token)\n\t\tlocalStorage.setItem(REFRESH_TOKEN, data.refreshToken)\n\t}\n\treturn data\n}\n\n/**\n * Fetches data from the Speckle server using GraphQL.\n * @param query - The GraphQL query string.\n * @param vars - Optional variables to be passed with the query.\n * @returns A Promise that resolves to the fetched data.\n * @throws If the API call fails or the user is not logged in.\n */\nexport async function speckleFetch(\n\tquery: string,\n\tvars?: { [key: string]: any }\n) {\n\tconst settingsStore = useSettingsStore()\n\tconst token = localStorage.getItem(TOKEN)\n\tif (token)\n\t\ttry {\n\t\t\tconst res = await fetch(`${settingsStore.keySettings.speckleConfig.serverUrl}/graphql`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: 'Bearer ' + token,\n\t\t\t\t\t'Content-Type': 'application/json'\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tquery: query,\n\t\t\t\t\tvariables: vars || null\n\t\t\t\t})\n\t\t\t})\n\t\t\tconst data = await res.json()\n\t\t\treturn data\n\t\t} catch (err) {\n\t\t\tconst msg = 'API call failed!'\n\n\t\t\treportErrorToSentry(err as Error)\n\t\t\tconsole.error(msg, err)\n\n\t\t\treturn Promise.reject(msg)\n\t\t}\n\telse return Promise.reject('You are not logged in. (Token does not exist.)')\n}\n\n// Fetch the current user data using the userInfoQuery\nexport const getUserData = () => speckleFetch(userInfoQuery)\n\n// Fetch for streams matching the specified text using the streamSearchQuery\nexport function searchStreams(variables: string) {\n\tconst vars = { var: variables }\n\tspeckleFetch(streamSearchQuery, vars)\n}\n\n// Get versions related to a specific project, allows for pagination by passing a cursor\nexport function getProjectVersions(\n\tprojectId: string,\n\titemsPerPage: number,\n\tcursor: Date | null\n) {\n\treturn speckleFetch(projectVersionsQuery, {\n\t\tid: projectId,\n\t\tcursor,\n\t\tlimit: itemsPerPage\n\t})\n}\n\n// Get a specific object from a specific stream\nexport function getObject(streamId: string, objectId: string) {\n\treturn speckleFetch(streamObjectQuery, { streamId, objectId })\n}\n\n// Get the latest projects\nexport function getProjectsData() {\n\treturn speckleFetch(latestStreamsQuery)\n}\n\n// Get the latest model for a specific project\nexport function getLatestModel(projectId: string) {\n\treturn speckleFetch(modelIdQuery, { projectId })\n}\n\n/**\n * Get object parameters for a stream and specific referenced object.\n * The parameters will be dynamic for the sourceapplication that was used when sending to Speckle\n * @param streamId\n * @param objectId\n * @param sourceApplication\n */\nexport async function getObjectParameters(\n\tstreamId: string,\n\tobjectId: string,\n\tsourceApplication: string\n) {\n\tconst selection = speckleSelection(sourceApplication)\n\treturn await speckleFetch(selectedObjectsQuery, {\n\t\tstreamId: streamId,\n\t\tobjectId: objectId,\n\t\tselection: selection\n\t})\n}\n\nexport function convertObjects(input: ResponseObjectStream): Project | null {\n\tconst speckleStore = useSpeckleStore()\n\n\tconst objects: ResponseObject[] = input.data.stream.object.elements.objects\n\n\tconst modelObjects = objects.filter(\n\t\t(obj) => obj.data.speckle_type !== 'Speckle.Core.Models.DataChunk'\n\t)\n\tconst projectDetails = speckleStore.getProjectDetails\n\tconst version = speckleStore.getSelectedVersion\n\n\tif (projectDetails && version) {\n\t\tconst geoObjects: GeometryObject[] = []\n\n\t\tmodelObjects.forEach((el) => {\n\t\t\tconst quantity = calculateQuantity(el)\n\n\t\t\tconst name: string = el.data.name ? el.data.name : el.data.speckle_type\n\n\t\t\tconst obj: GeometryObject = {\n\t\t\t\tid: el.id,\n\t\t\t\tname: name,\n\t\t\t\tquantity: quantity,\n\t\t\t\tparameters: el.data,\n\t\t\t\tURI: el.id\n\t\t\t}\n\n\t\t\tgeoObjects.push(obj)\n\t\t})\n\n\t\tconst project: Project = {\n\t\t\tname: projectDetails.stream.name,\n\t\t\tid: projectDetails.stream.id,\n\t\t\tdescription: version.message,\n\t\t\tgeometry: geoObjects\n\t\t}\n\t\treturn project\n\t}\n\treturn null\n}\n\n/**\n * Calculates the quantity of different units in the given ResponseObject.\n *\n * @param obj The ResponseObject containing the data to calculate the quantity from.\n * @returns An object representing the quantity of different units.\n */\nexport function calculateQuantity(obj: ResponseObject) {\n\tconst quantity: Quantity = {\n\t\tm2: 0,\n\t}\n\n\t// Initial parameters we search for, can be added upon should maybe be moved from here to a model file instead\n\t// TODO create a populated interface for this\n\tconst searchObject = [\n\t\t{\n\t\t\tsearchValue: 'area',\n\t\t\tmetric: 'm2',\n\t\t\tmmConversion: 1000000\n\t\t},\n\t\t{\n\t\t\tsearchValue: 'volume',\n\t\t\tmetric: 'm3',\n\t\t\tmmConversion: 1000000000\n\t\t},\n\t\t{\n\t\t\tsearchValue: 'length',\n\t\t\tmetric: 'm',\n\t\t\tmmConversion: 1000\n\t\t}\n\t]\n\n\t// Recursive search for key values in object properties\n\tconst searchNested = (\n\t\tdata: { [key: string]: any },\n\t\tsObj: { searchValue: string; metric: string; mmConversion: number }\n\t) => {\n\t\tfor (const key in data) {\n\t\t\tif (Object.prototype.hasOwnProperty.call(data, key)) {\n\t\t\t\tif (typeof data[key] === 'object' && data[key] !== null) {\n\t\t\t\t\t// If the current property is an object, recursively search\n\t\t\t\t\tsearchNested(data[key], sObj)\n\t\t\t\t} else if (\n\t\t\t\t\ttypeof data[key] === 'string' &&\n\t\t\t\t\tdata[key].toLowerCase() == sObj.searchValue\n\t\t\t\t) {\n\t\t\t\t\t// If the property is a string and matches the search value, set the quantity\n\t\t\t\t\tlet value = data[key]\n\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\tvalue = data['value']\n\t\t\t\t\t}\n\t\t\t\t\tquantity[sObj.metric] = value\n\t\t\t\t} else if (key == sObj.searchValue) {\n\t\t\t\t\t// If the property is a string and matches the search value, set the quantity\n\t\t\t\t\tlet value = data[key]\n\n\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\tvalue = data['value']\n\t\t\t\t\t}\n\t\t\t\t\t//TODO Make more conversions\n\t\t\t\t\tif (data['units'] == 'mm') {\n\t\t\t\t\t\tvalue = value / sObj.mmConversion\n\t\t\t\t\t}\n\n\t\t\t\t\tquantity[sObj.metric] = value\n\t\t\t\t}\n\t\t\t}\t\n\t\t}\n\t}\n\n\t// Start recursive search on the object\n\t// TODO this should probably be optimized, could become slow on large projects or atleast add a loading bar\n\tif (obj.data) {\n\t\tsearchObject.forEach((sObj) => {\n\t\t\tsearchNested(obj.data, sObj)\n\t\t})\n\t}\n\treturn quantity\n}\n","/**\n * @license\n * Copyright 2010-2022 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '140';\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nconst CullFaceNone = 0;\nconst CullFaceBack = 1;\nconst CullFaceFront = 2;\nconst CullFaceFrontBack = 3;\nconst BasicShadowMap = 0;\nconst PCFShadowMap = 1;\nconst PCFSoftShadowMap = 2;\nconst VSMShadowMap = 3;\nconst FrontSide = 0;\nconst BackSide = 1;\nconst DoubleSide = 2;\nconst FlatShading = 1;\nconst SmoothShading = 2;\nconst NoBlending = 0;\nconst NormalBlending = 1;\nconst AdditiveBlending = 2;\nconst SubtractiveBlending = 3;\nconst MultiplyBlending = 4;\nconst CustomBlending = 5;\nconst AddEquation = 100;\nconst SubtractEquation = 101;\nconst ReverseSubtractEquation = 102;\nconst MinEquation = 103;\nconst MaxEquation = 104;\nconst ZeroFactor = 200;\nconst OneFactor = 201;\nconst SrcColorFactor = 202;\nconst OneMinusSrcColorFactor = 203;\nconst SrcAlphaFactor = 204;\nconst OneMinusSrcAlphaFactor = 205;\nconst DstAlphaFactor = 206;\nconst OneMinusDstAlphaFactor = 207;\nconst DstColorFactor = 208;\nconst OneMinusDstColorFactor = 209;\nconst SrcAlphaSaturateFactor = 210;\nconst NeverDepth = 0;\nconst AlwaysDepth = 1;\nconst LessDepth = 2;\nconst LessEqualDepth = 3;\nconst EqualDepth = 4;\nconst GreaterEqualDepth = 5;\nconst GreaterDepth = 6;\nconst NotEqualDepth = 7;\nconst MultiplyOperation = 0;\nconst MixOperation = 1;\nconst AddOperation = 2;\nconst NoToneMapping = 0;\nconst LinearToneMapping = 1;\nconst ReinhardToneMapping = 2;\nconst CineonToneMapping = 3;\nconst ACESFilmicToneMapping = 4;\nconst CustomToneMapping = 5;\n\nconst UVMapping = 300;\nconst CubeReflectionMapping = 301;\nconst CubeRefractionMapping = 302;\nconst EquirectangularReflectionMapping = 303;\nconst EquirectangularRefractionMapping = 304;\nconst CubeUVReflectionMapping = 306;\nconst RepeatWrapping = 1000;\nconst ClampToEdgeWrapping = 1001;\nconst MirroredRepeatWrapping = 1002;\nconst NearestFilter = 1003;\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004;\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005;\nconst LinearFilter = 1006;\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007;\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008;\nconst UnsignedByteType = 1009;\nconst ByteType = 1010;\nconst ShortType = 1011;\nconst UnsignedShortType = 1012;\nconst IntType = 1013;\nconst UnsignedIntType = 1014;\nconst FloatType = 1015;\nconst HalfFloatType = 1016;\nconst UnsignedShort4444Type = 1017;\nconst UnsignedShort5551Type = 1018;\nconst UnsignedInt248Type = 1020;\nconst AlphaFormat = 1021;\nconst RGBFormat = 1022;\nconst RGBAFormat = 1023;\nconst LuminanceFormat = 1024;\nconst LuminanceAlphaFormat = 1025;\nconst DepthFormat = 1026;\nconst DepthStencilFormat = 1027;\nconst RedFormat = 1028;\nconst RedIntegerFormat = 1029;\nconst RGFormat = 1030;\nconst RGIntegerFormat = 1031;\nconst RGBAIntegerFormat = 1033;\n\nconst RGB_S3TC_DXT1_Format = 33776;\nconst RGBA_S3TC_DXT1_Format = 33777;\nconst RGBA_S3TC_DXT3_Format = 33778;\nconst RGBA_S3TC_DXT5_Format = 33779;\nconst RGB_PVRTC_4BPPV1_Format = 35840;\nconst RGB_PVRTC_2BPPV1_Format = 35841;\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\nconst RGB_ETC1_Format = 36196;\nconst RGB_ETC2_Format = 37492;\nconst RGBA_ETC2_EAC_Format = 37496;\nconst RGBA_ASTC_4x4_Format = 37808;\nconst RGBA_ASTC_5x4_Format = 37809;\nconst RGBA_ASTC_5x5_Format = 37810;\nconst RGBA_ASTC_6x5_Format = 37811;\nconst RGBA_ASTC_6x6_Format = 37812;\nconst RGBA_ASTC_8x5_Format = 37813;\nconst RGBA_ASTC_8x6_Format = 37814;\nconst RGBA_ASTC_8x8_Format = 37815;\nconst RGBA_ASTC_10x5_Format = 37816;\nconst RGBA_ASTC_10x6_Format = 37817;\nconst RGBA_ASTC_10x8_Format = 37818;\nconst RGBA_ASTC_10x10_Format = 37819;\nconst RGBA_ASTC_12x10_Format = 37820;\nconst RGBA_ASTC_12x12_Format = 37821;\nconst RGBA_BPTC_Format = 36492;\nconst LoopOnce = 2200;\nconst LoopRepeat = 2201;\nconst LoopPingPong = 2202;\nconst InterpolateDiscrete = 2300;\nconst InterpolateLinear = 2301;\nconst InterpolateSmooth = 2302;\nconst ZeroCurvatureEnding = 2400;\nconst ZeroSlopeEnding = 2401;\nconst WrapAroundEnding = 2402;\nconst NormalAnimationBlendMode = 2500;\nconst AdditiveAnimationBlendMode = 2501;\nconst TrianglesDrawMode = 0;\nconst TriangleStripDrawMode = 1;\nconst TriangleFanDrawMode = 2;\nconst LinearEncoding = 3000;\nconst sRGBEncoding = 3001;\nconst BasicDepthPacking = 3200;\nconst RGBADepthPacking = 3201;\nconst TangentSpaceNormalMap = 0;\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\nconst NoColorSpace = '';\nconst SRGBColorSpace = 'srgb';\nconst LinearSRGBColorSpace = 'srgb-linear';\n\nconst ZeroStencilOp = 0;\nconst KeepStencilOp = 7680;\nconst ReplaceStencilOp = 7681;\nconst IncrementStencilOp = 7682;\nconst DecrementStencilOp = 7683;\nconst IncrementWrapStencilOp = 34055;\nconst DecrementWrapStencilOp = 34056;\nconst InvertStencilOp = 5386;\n\nconst NeverStencilFunc = 512;\nconst LessStencilFunc = 513;\nconst EqualStencilFunc = 514;\nconst LessEqualStencilFunc = 515;\nconst GreaterStencilFunc = 516;\nconst NotEqualStencilFunc = 517;\nconst GreaterEqualStencilFunc = 518;\nconst AlwaysStencilFunc = 519;\n\nconst StaticDrawUsage = 35044;\nconst DynamicDrawUsage = 35048;\nconst StreamDrawUsage = 35040;\nconst StaticReadUsage = 35045;\nconst DynamicReadUsage = 35049;\nconst StreamReadUsage = 35041;\nconst StaticCopyUsage = 35046;\nconst DynamicCopyUsage = 35050;\nconst StreamCopyUsage = 35042;\n\nconst GLSL1 = '100';\nconst GLSL3 = '300 es';\n\nconst _SRGBAFormat = 1035; // fallback for WebGL 1\n\n/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nclass EventDispatcher {\n\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\thasEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t}\n\n\tremoveEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [];\n\nfor ( let i = 0; i < 256; i ++ ) {\n\n\t_lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 );\n\n}\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range to range \nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\nfunction denormalize$1( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, - 1.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, - 1.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nvar MathUtils = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\tgenerateUUID: generateUUID,\n\tclamp: clamp,\n\teuclideanModulo: euclideanModulo,\n\tmapLinear: mapLinear,\n\tinverseLerp: inverseLerp,\n\tlerp: lerp,\n\tdamp: damp,\n\tpingpong: pingpong,\n\tsmoothstep: smoothstep,\n\tsmootherstep: smootherstep,\n\trandInt: randInt,\n\trandFloat: randFloat,\n\trandFloatSpread: randFloatSpread,\n\tseededRandom: seededRandom,\n\tdegToRad: degToRad,\n\tradToDeg: radToDeg,\n\tisPowerOfTwo: isPowerOfTwo,\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\tnormalize: normalize,\n\tdenormalize: denormalize$1\n});\n\nclass Vector2 {\n\n\tconstructor( x = 0, y = 0 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tangle() {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\nVector2.prototype.isVector2 = true;\n\nclass Matrix3 {\n\n\tconstructor() {\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tscale( sx, sy ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;\n\t\tte[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;\n\n\t\treturn this;\n\n\t}\n\n\trotate( theta ) {\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tconst te = this.elements;\n\n\t\tconst a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];\n\t\tconst a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];\n\n\t\tte[ 0 ] = c * a11 + s * a21;\n\t\tte[ 3 ] = c * a12 + s * a22;\n\t\tte[ 6 ] = c * a13 + s * a23;\n\n\t\tte[ 1 ] = - s * a11 + c * a21;\n\t\tte[ 4 ] = - s * a12 + c * a22;\n\t\tte[ 7 ] = - s * a13 + c * a23;\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( tx, ty ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];\n\t\tte[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nMatrix3.prototype.isMatrix3 = true;\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] > 65535 ) return true;\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\n// JavaScript RGB-to-RGB transforms, defined as\n// FN[InputColorSpace][OutputColorSpace] callback functions.\nconst FN = {\n\t[ SRGBColorSpace ]: { [ LinearSRGBColorSpace ]: SRGBToLinear },\n\t[ LinearSRGBColorSpace ]: { [ SRGBColorSpace ]: LinearToSRGB },\n};\n\nconst ColorManagement = {\n\n\tlegacyMode: true,\n\n\tget workingColorSpace() {\n\n\t\treturn LinearSRGBColorSpace;\n\n\t},\n\n\tset workingColorSpace( colorSpace ) {\n\n\t\tconsole.warn( 'THREE.ColorManagement: .workingColorSpace is readonly.' );\n\n\t},\n\n\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\tif ( this.legacyMode || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\treturn color;\n\n\t\t}\n\n\t\tif ( FN[ sourceColorSpace ] && FN[ sourceColorSpace ][ targetColorSpace ] !== undefined ) {\n\n\t\t\tconst fn = FN[ sourceColorSpace ][ targetColorSpace ];\n\n\t\t\tcolor.r = fn( color.r );\n\t\t\tcolor.g = fn( color.g );\n\t\t\tcolor.b = fn( color.b );\n\n\t\t\treturn color;\n\n\t\t}\n\n\t\tthrow new Error( 'Unsupported color space conversion.' );\n\n\t},\n\n\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\treturn this.convert( color, this.workingColorSpace, targetColorSpace );\n\n\t},\n\n\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\treturn this.convert( color, sourceColorSpace, this.workingColorSpace );\n\n\t},\n\n};\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _rgb = { r: 0, g: 0, b: 0 };\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\nfunction toComponents( source, target ) {\n\n\ttarget.r = source.r;\n\ttarget.g = source.g;\n\ttarget.b = source.b;\n\n\treturn target;\n\n}\n\nclass Color {\n\n\tconstructor( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tset( value ) {\n\n\t\tif ( value && value.isColor ) {\n\n\t\t\tthis.copy( value );\n\n\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\tthis.setHex( value );\n\n\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\tthis.setStyle( value );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetRGB( r, g, b, colorSpace = LinearSRGBColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetHSL( h, s, l, colorSpace = LinearSRGBColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^((?:rgb|hsl)a?)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\tconst h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\tconst s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\tconst l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL( h, s, l, colorSpace );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\treturn this;\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb ), colorSpace );\n\n\t\treturn clamp( _rgb.r * 255, 0, 255 ) << 16 ^ clamp( _rgb.g * 255, 0, 255 ) << 8 ^ clamp( _rgb.b * 255, 0, 255 ) << 0;\n\n\t}\n\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( - 6 );\n\n\t}\n\n\tgetHSL( target, colorSpace = LinearSRGBColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb ), colorSpace );\n\n\t\tconst r = _rgb.r, g = _rgb.g, b = _rgb.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\tgetRGB( target, colorSpace = LinearSRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb ), colorSpace );\n\n\t\ttarget.r = _rgb.r;\n\t\ttarget.g = _rgb.g;\n\t\ttarget.b = _rgb.b;\n\n\t\treturn target;\n\n\t}\n\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb ), colorSpace );\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ _rgb.r } ${ _rgb.g } ${ _rgb.b })`;\n\n\t\t}\n\n\t\treturn `rgb(${( _rgb.r * 255 ) | 0},${( _rgb.g * 255 ) | 0},${( _rgb.b * 255 ) | 0})`;\n\n\t}\n\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\t_hslA.h += h; _hslA.s += s; _hslA.l += l;\n\n\t\tthis.setHSL( _hslA.h, _hslA.s, _hslA.l );\n\n\t\treturn this;\n\n\t}\n\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\tif ( attribute.normalized === true ) {\n\n\t\t\t// assuming Uint8Array\n\n\t\t\tthis.r /= 255;\n\t\t\tthis.g /= 255;\n\t\t\tthis.b /= 255;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nColor.NAMES = _colorKeywords;\n\nColor.prototype.isColor = true;\nColor.prototype.r = 1;\nColor.prototype.g = 1;\nColor.prototype.b = 1;\n\nlet _canvas;\n\nclass ImageUtils {\n\n\tstatic getDataURL( image ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement == 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image );\n\n\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t} else {\n\n\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t}\n\n\t}\n\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nclass Source {\n\n\tconstructor( data = null ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.data = data;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.prototype.slice.call( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nSource.prototype.isSource = true;\n\nlet textureId = 0;\n\nclass Texture extends EventDispatcher {\n\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = 1, encoding = LinearEncoding ) {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.source = new Source( image );\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping;\n\n\t\tthis.wrapS = wrapS;\n\t\tthis.wrapT = wrapT;\n\n\t\tthis.magFilter = magFilter;\n\t\tthis.minFilter = minFilter;\n\n\t\tthis.anisotropy = anisotropy;\n\n\t\tthis.format = format;\n\t\tthis.internalFormat = null;\n\t\tthis.type = type;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\t\tthis.center = new Vector2( 0, 0 );\n\t\tthis.rotation = 0;\n\n\t\tthis.matrixAutoUpdate = true;\n\t\tthis.matrix = new Matrix3();\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t\tthis.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not\n\t\tthis.needsPMREMUpdate = false; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures)\n\n\t}\n\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.encoding = source.encoding;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\ttype: this.type,\n\t\t\tencoding: this.encoding,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nTexture.DEFAULT_IMAGE = null;\nTexture.DEFAULT_MAPPING = UVMapping;\n\nTexture.prototype.isTexture = true;\n\nclass Vector4 {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\t\tthis.w = Math.max( minVal, Math.min( maxVal, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\nVector4.prototype.isVector4 = true;\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nclass WebGLRenderTarget extends EventDispatcher {\n\n\tconstructor( width, height, options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.depth = 1;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: 1 };\n\n\t\tthis.texture = new Texture( image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.flipY = false;\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.internalFormat = options.internalFormat !== undefined ? options.internalFormat : null;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : false;\n\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t\tthis.samples = options.samples !== undefined ? options.samples : 0;\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tthis.texture.image.width = width;\n\t\t\tthis.texture.image.height = height;\n\t\t\tthis.texture.image.depth = depth;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.texture = source.texture.clone();\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\t// ensure image object is not shared, see #20328\n\n\t\tconst image = Object.assign( {}, source.texture.image );\n\t\tthis.texture.source = new Source( image );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nWebGLRenderTarget.prototype.isWebGLRenderTarget = true;\n\nclass DataArrayTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nDataArrayTexture.prototype.isDataArrayTexture = true;\n\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width, height, depth ) {\n\n\t\tsuper( width, height );\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nWebGLArrayRenderTarget.prototype.isWebGLArrayRenderTarget = true;\n\nclass Data3DTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in DataTexture3D directly.\n\t\t//\n\t\t//\tconst texture = new THREE.DataTexture3D( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nData3DTexture.prototype.isData3DTexture = true;\n\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width, height, depth ) {\n\n\t\tsuper( width, height );\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nWebGL3DRenderTarget.prototype.isWebGL3DRenderTarget = true;\n\nclass WebGLMultipleRenderTargets extends WebGLRenderTarget {\n\n\tconstructor( width, height, count, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tconst texture = this.texture;\n\n\t\tthis.texture = [];\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.texture[ i ] = texture.clone();\n\t\t\tthis.texture[ i ].isRenderTargetTexture = true;\n\n\t\t}\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.texture.length; i < il; i ++ ) {\n\n\t\t\t\tthis.texture[ i ].image.width = width;\n\t\t\t\tthis.texture[ i ].image.height = height;\n\t\t\t\tthis.texture[ i ].image.depth = depth;\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.dispose();\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.viewport.set( 0, 0, this.width, this.height );\n\t\tthis.scissor.set( 0, 0, this.width, this.height );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.texture.length = 0;\n\n\t\tfor ( let i = 0, il = source.texture.length; i < il; i ++ ) {\n\n\t\t\tthis.texture[ i ] = source.texture[ i ].clone();\n\t\t\tthis.texture[ i ].isRenderTargetTexture = true;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nWebGLMultipleRenderTargets.prototype.isWebGLMultipleRenderTargets = true;\n\nclass Quaternion {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\tstatic slerp( qa, qb, qm, t ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: Static .slerp() has been deprecated. Use qm.slerpQuaternions( qa, qb, t ) instead.' );\n\t\treturn qm.slerpQuaternions( qa, qb, t );\n\n\t}\n\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t === 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t === 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t;\n\t\t\tconst cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tconst sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tconst tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromEuler( euler, update ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update !== false ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < Number.EPSILON ) {\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), - 1, 1 ) ) );\n\n\t}\n\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\tinvert() {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t}\n\n\tconjugate() {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( q, p ) {\n\n\t\tif ( p !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t}\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerp( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tlet cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize();\n\t\t\tthis._onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\trandom() {\n\n\t\t// Derived from http://planning.cs.uiuc.edu/node198.html\n\t\t// Note, this source uses w, x, y, z ordering,\n\t\t// so we swap the order below.\n\n\t\tconst u1 = Math.random();\n\t\tconst sqrt1u1 = Math.sqrt( 1 - u1 );\n\t\tconst sqrtu1 = Math.sqrt( u1 );\n\n\t\tconst u2 = 2 * Math.PI * Math.random();\n\n\t\tconst u3 = 2 * Math.PI * Math.random();\n\n\t\treturn this.set(\n\t\t\tsqrt1u1 * Math.cos( u2 ),\n\t\t\tsqrtu1 * Math.sin( u3 ),\n\t\t\tsqrtu1 * Math.cos( u3 ),\n\t\t\tsqrt1u1 * Math.sin( u2 ),\n\t\t);\n\n\t}\n\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\nQuaternion.prototype.isQuaternion = true;\n\nclass Vector3 {\n\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t}\n\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t}\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyEuler( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// calculate quat * vector\n\n\t\tconst ix = qw * x + qy * z - qz * y;\n\t\tconst iy = qw * y + qz * x - qx * z;\n\t\tconst iz = qw * z + qx * y - qy * x;\n\t\tconst iw = - qx * x - qy * y - qz * z;\n\n\t\t// calculate result * inverse quat\n\n\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\treturn this;\n\n\t}\n\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tcross( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\treturn this.crossVectors( v, w );\n\n\t\t}\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\treflect( normal ) {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\trandomDirection() {\n\n\t\t// Derived from https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst u = ( Math.random() - 0.5 ) * 2;\n\t\tconst t = Math.random() * Math.PI * 2;\n\t\tconst f = Math.sqrt( 1 - u ** 2 );\n\n\t\tthis.x = f * Math.cos( t );\n\t\tthis.y = f * Math.sin( t );\n\t\tthis.z = u;\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nVector3.prototype.isVector3 = true;\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\nclass Box3 {\n\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromArray( array ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\tconst x = array[ i ];\n\t\t\tconst y = array[ i + 1 ];\n\t\t\tconst z = array[ i + 2 ];\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\tconst x = attribute.getX( i );\n\t\t\tconst y = attribute.getY( i );\n\t\t\tconst z = attribute.getZ( i );\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tif ( precise && geometry.attributes != undefined && geometry.attributes.position !== undefined ) {\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tfor ( let i = 0, l = position.count; i < l; i ++ ) {\n\n\t\t\t\t\t_vector$b.fromBufferAttribute( position, i ).applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t}\n\n\t\t\t\t_box$3.copy( geometry.boundingBox );\n\t\t\t\t_box$3.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$3 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$2.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$3.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$2 );\n\t\t_f1.subVectors( _v2$3, _v1$7 );\n\t\t_f2.subVectors( _v0$2, _v2$3 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$3, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$3, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$2, _v1$7, _v2$3, _extents );\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\tconst clampedPoint = _vector$b.copy( point ).clamp( this.min, this.max );\n\n\t\treturn clampedPoint.sub( point ).length();\n\n\t}\n\n\tgetBoundingSphere( target ) {\n\n\t\tthis.getCenter( target.center );\n\n\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\treturn target;\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nBox3.prototype.isBox3 = true;\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$3 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _toFarthestPoint = /*@__PURE__*/ new Vector3();\nconst _toPoint = /*@__PURE__*/ new Vector3();\n\nclass Sphere {\n\n\tconstructor( center = new Vector3(), radius = - 1 ) {\n\n\t\tthis.center = center;\n\t\tthis.radius = radius;\n\n\t}\n\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$2.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = - 1;\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\t// from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L649-L671\n\n\t\t_toPoint.subVectors( point, this.center );\n\n\t\tconst lengthSq = _toPoint.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\t\t\tconst missingRadiusHalf = ( length - this.radius ) * 0.5;\n\n\t\t\t// Nudge this sphere towards the target point. Add half the missing distance to radius,\n\t\t\t// and the other half to position. This gives a tighter enclosure, instead of if\n\t\t\t// the whole missing distance were just added to radius.\n\n\t\t\tthis.center.add( _toPoint.multiplyScalar( missingRadiusHalf / length ) );\n\t\t\tthis.radius += missingRadiusHalf;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunion( sphere ) {\n\n\t\t// from https://github.com/juj/MathGeoLib/blob/2940b99b99cfe575dd45103ef20f4019dee15b54/src/Geometry/Sphere.cpp#L759-L769\n\n\t\t// To enclose another sphere into this sphere, we only need to enclose two points:\n\t\t// 1) Enclose the farthest point on the other sphere into this sphere.\n\t\t// 2) Enclose the opposite point of the farthest point into this sphere.\n\n\t\t if ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t _toFarthestPoint.set( 0, 0, 1 ).multiplyScalar( sphere.radius );\n\n\n\t\t} else {\n\n\t\t\t_toFarthestPoint.subVectors( sphere.center, this.center ).normalize().multiplyScalar( sphere.radius );\n\n\t\t}\n\n\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _toFarthestPoint ) );\n\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _toFarthestPoint ) );\n\n\t\treturn this;\n\n\t}\n\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\nclass Ray {\n\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, - 1 ) ) {\n\n\t\tthis.origin = origin;\n\t\tthis.direction = direction;\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn target.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t}\n\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = - 1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass Matrix4 {\n\n\tconstructor() {\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractRotation( m ) {\n\n\t\t// this method does not support reflection matrices\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromEuler( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m, n ) {\n\n\t\tif ( n !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t}\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\tmakeTranslation( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, x,\n\t\t\t0, 1, 0, y,\n\t\t\t0, 0, 1, z,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1$2.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$2.elements[ 0 ] *= invSX;\n\t\t_m1$2.elements[ 1 ] *= invSX;\n\t\t_m1$2.elements[ 2 ] *= invSX;\n\n\t\t_m1$2.elements[ 4 ] *= invSY;\n\t\t_m1$2.elements[ 5 ] *= invSY;\n\t\t_m1$2.elements[ 6 ] *= invSY;\n\n\t\t_m1$2.elements[ 8 ] *= invSZ;\n\t\t_m1$2.elements[ 9 ] *= invSZ;\n\t\t_m1$2.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$2 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tmakePerspective( left, right, top, bottom, near, far ) {\n\n\t\tif ( far === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t}\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\t\tconst c = - ( far + near ) / ( far - near );\n\t\tconst d = - 2 * far * near / ( far - near );\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\tmakeOrthographic( left, right, top, bottom, near, far ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\t\tconst z = ( far + near ) * p;\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nMatrix4.prototype.isMatrix4 = true;\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\nclass Euler {\n\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DefaultOrder ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$1.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$1, order, update );\n\n\t}\n\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\treorder( newOrder ) {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\nEuler.prototype.isEuler = true;\n\nEuler.DefaultOrder = 'XYZ';\nEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\nclass Layers {\n\n\tconstructor() {\n\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\tset( channel ) {\n\n\t\tthis.mask = ( 1 << channel | 0 ) >>> 0;\n\n\t}\n\n\tenable( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t}\n\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\ttoggle( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t}\n\n\tdisable( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t}\n\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\tisEnabled( channel ) {\n\n\t\treturn ( this.mask & ( 1 << channel | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\nconst _addedEvent = { type: 'added' };\nconst _removedEvent = { type: 'removed' };\n\nclass Object3D extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DefaultUp.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.animations = [];\n\n\t\tthis.userData = {};\n\n\t}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\tlocalToWorld( vector ) {\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\tworldToLocal( vector ) {\n\n\t\treturn vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\tobject.parent.remove( object );\n\n\t\t\t}\n\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclear() {\n\n\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\tconst object = this.children[ i ];\n\n\t\t\tobject.parent = null;\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\tthis.children.length = 0;\n\n\t\treturn this;\n\n\n\t}\n\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tthis.add( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\treturn this;\n\n\t}\n\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\traycast( /* raycaster, intersects */ ) {}\n\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// update children\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.parent === null ) {\n\n\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t} else {\n\n\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t}\n\n\t\t// update children\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nObject3D.DefaultUp = new Vector3( 0, 1, 0 );\nObject3D.DefaultMatrixAutoUpdate = true;\n\nObject3D.prototype.isObject3D = true;\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$1 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nclass Triangle {\n\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t}\n\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\t// arbitrary location outside of triangle?\n\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\treturn target.set( - 2, - 1, - 1 );\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\tthis.getBarycoord( point, a, b, c, _v3$1 );\n\n\t\treturn ( _v3$1.x >= 0 ) && ( _v3$1.y >= 0 ) && ( ( _v3$1.x + _v3$1.y ) <= 1 );\n\n\t}\n\n\tstatic getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) {\n\n\t\tthis.getBarycoord( point, p1, p2, p3, _v3$1 );\n\n\t\ttarget.set( 0, 0 );\n\t\ttarget.addScaledVector( uv1, _v3$1.x );\n\t\ttarget.addScaledVector( uv2, _v3$1.y );\n\t\ttarget.addScaledVector( uv3, _v3$1.z );\n\n\t\treturn target;\n\n\t}\n\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\tgetArea() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\tgetUV( point, uv1, uv2, uv3, target ) {\n\n\t\treturn Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, target );\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nlet materialId = 0;\n\nclass Material extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.vertexColors = false;\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.stencilWriteMask = 0xff;\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\t\tthis.stencilRef = 0;\n\t\tthis.stencilFuncMask = 0xff;\n\t\tthis.stencilFail = KeepStencilOp;\n\t\tthis.stencilZFail = KeepStencilOp;\n\t\tthis.stencilZPass = KeepStencilOp;\n\t\tthis.stencilWrite = false;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.shadowSide = null;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.dithering = false;\n\n\t\tthis.alphaToCoverage = false;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.visible = true;\n\n\t\tthis.toneMapped = true;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\tonBuild( /* shaderobject, renderer */ ) {}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Material: \\'' + key + '\\' parameter is undefined.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// for backward compatibility if shading is set in the constructor\n\t\t\tif ( key === 'shading' ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\t\tthis.flatShading = ( newValue === FlatShading ) ? true : false;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': \\'' + key + '\\' is not a property of this material.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\tdata.depthFunc = this.depthFunc;\n\t\tdata.depthTest = this.depthTest;\n\t\tdata.depthWrite = this.depthWrite;\n\t\tdata.colorWrite = this.colorWrite;\n\n\t\tdata.stencilWrite = this.stencilWrite;\n\t\tdata.stencilWriteMask = this.stencilWriteMask;\n\t\tdata.stencilFunc = this.stencilFunc;\n\t\tdata.stencilRef = this.stencilRef;\n\t\tdata.stencilFuncMask = this.stencilFuncMask;\n\t\tdata.stencilFail = this.stencilFail;\n\t\tdata.stencilZFail = this.stencilZFail;\n\t\tdata.stencilZPass = this.stencilZPass;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = this.alphaToCoverage;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\n\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = this.flatShading;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\nMaterial.prototype.isMaterial = true;\n\nMaterial.fromType = function ( /*type*/ ) {\n\n\t// TODO: Behavior added in Materials.js\n\n\treturn null;\n\n};\n\nclass MeshBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nclass BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.name = '';\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized === true;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\tcopyColorsArray( colors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\tlet color = colors[ i ];\n\n\t\t\tif ( color === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\tcolor = new Color();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = color.r;\n\t\t\tarray[ offset ++ ] = color.g;\n\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector2sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector2();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector3sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector3();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyVector4sArray( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector4();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\treturn this.array[ index * this.itemSize ];\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.prototype.slice.call( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\t\tif ( this.updateRange.offset !== 0 || this.updateRange.count !== - 1 ) data.updateRange = this.updateRange;\n\n\t\treturn data;\n\n\t}\n\n}\n\nBufferAttribute.prototype.isBufferAttribute = true;\n\n//\n\nclass Int8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nFloat16BufferAttribute.prototype.isFloat16BufferAttribute = true;\n\nclass Float32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float64BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float64Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$1 = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\nclass BufferGeometry extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tObject.defineProperty( this, 'id', { value: _id$1 ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\t\tthis.morphTargetsRelative = false;\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\tthis.userData = {};\n\n\t}\n\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tconst position = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$1.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$1.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$1.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$1.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$1.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$1.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$1.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$1.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$1.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$1.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$1.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$1.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$1.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst indices = index.array;\n\t\tconst positions = attributes.position.array;\n\t\tconst normals = attributes.normal.array;\n\t\tconst uvs = attributes.uv.array;\n\n\t\tconst nVertices = positions.length / 3;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * nVertices ), 4 ) );\n\n\t\t}\n\n\t\tconst tangents = this.getAttribute( 'tangent' ).array;\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < nVertices; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromArray( positions, a * 3 );\n\t\t\tvB.fromArray( positions, b * 3 );\n\t\t\tvC.fromArray( positions, c * 3 );\n\n\t\t\tuvA.fromArray( uvs, a * 2 );\n\t\t\tuvB.fromArray( uvs, b * 2 );\n\t\t\tuvC.fromArray( uvs, c * 2 );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: indices.length\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindices[ j + 0 ],\n\t\t\t\t\tindices[ j + 1 ],\n\t\t\t\t\tindices[ j + 2 ]\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromArray( normals, v * 3 );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? - 1.0 : 1.0;\n\n\t\t\ttangents[ v * 4 ] = tmp.x;\n\t\t\ttangents[ v * 4 + 1 ] = tmp.y;\n\t\t\ttangents[ v * 4 + 2 ] = tmp.z;\n\t\t\ttangents[ v * 4 + 3 ] = w;\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( indices[ j + 0 ] );\n\t\t\t\thandleVertex( indices[ j + 1 ] );\n\t\t\t\thandleVertex( indices[ j + 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tmerge( geometry, offset ) {\n\n\t\tif ( ! ( geometry && geometry.isBufferGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( offset === undefined ) {\n\n\t\t\toffset = 0;\n\n\t\t\tconsole.warn(\n\t\t\t\t'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '\n\t\t\t\t+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'\n\t\t\t);\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\tconst attribute1 = attributes[ key ];\n\t\t\tconst attributeArray1 = attribute1.array;\n\n\t\t\tconst attribute2 = geometry.attributes[ key ];\n\t\t\tconst attributeArray2 = attribute2.array;\n\n\t\t\tconst attributeOffset = attribute2.itemSize * offset;\n\t\t\tconst length = Math.min( attributeArray2.length, attributeArray1.length - attributeOffset );\n\n\t\t\tfor ( let i = 0, j = attributeOffset; i < length; i ++, j ++ ) {\n\n\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\t return new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone( data ) );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\t// geometry generator parameters\n\n\t\tif ( source.parameters !== undefined ) this.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nBufferGeometry.prototype.isBufferGeometry = true;\n\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _tempB = /*@__PURE__*/ new Vector3();\nconst _tempC = /*@__PURE__*/ new Vector3();\n\nconst _morphA = /*@__PURE__*/ new Vector3();\nconst _morphB = /*@__PURE__*/ new Vector3();\nconst _morphC = /*@__PURE__*/ new Vector3();\n\nconst _uvA$1 = /*@__PURE__*/ new Vector2();\nconst _uvB$1 = /*@__PURE__*/ new Vector2();\nconst _uvC$1 = /*@__PURE__*/ new Vector2();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\nclass Mesh extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$3.copy( geometry.boundingSphere );\n\t\t_sphere$3.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$3 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// Check boundingBox before continuing\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\tlet intersection;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\t\t\tconst uv = geometry.attributes.uv;\n\t\t\tconst uv2 = geometry.attributes.uv2;\n\t\t\tconst groups = geometry.groups;\n\t\t\tconst drawRange = geometry.drawRange;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\t// indexed buffer geometry\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\tconst a = i;\n\t\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray$2, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t}\n\n}\n\nMesh.prototype.isMesh = true;\n\nfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkBufferGeometryIntersection( object, material, raycaster, ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ) {\n\n\t_vA$1.fromBufferAttribute( position, a );\n\t_vB$1.fromBufferAttribute( position, b );\n\t_vC$1.fromBufferAttribute( position, c );\n\n\tconst morphInfluences = object.morphTargetInfluences;\n\n\tif ( morphPosition && morphInfluences ) {\n\n\t\t_morphA.set( 0, 0, 0 );\n\t\t_morphB.set( 0, 0, 0 );\n\t\t_morphC.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\tconst influence = morphInfluences[ i ];\n\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t_tempA.fromBufferAttribute( morphAttribute, a );\n\t\t\t_tempB.fromBufferAttribute( morphAttribute, b );\n\t\t\t_tempC.fromBufferAttribute( morphAttribute, c );\n\n\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t} else {\n\n\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA$1 ), influence );\n\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB$1 ), influence );\n\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC$1 ), influence );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_vA$1.add( _morphA );\n\t\t_vB$1.add( _morphB );\n\t\t_vC$1.add( _morphC );\n\n\t}\n\n\tif ( object.isSkinnedMesh ) {\n\n\t\tobject.boneTransform( a, _vA$1 );\n\t\tobject.boneTransform( b, _vB$1 );\n\t\tobject.boneTransform( c, _vC$1 );\n\n\t}\n\n\tconst intersection = checkIntersection( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA$1.fromBufferAttribute( uv, a );\n\t\t\t_uvB$1.fromBufferAttribute( uv, b );\n\t\t\t_uvC$1.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = Triangle.getUV( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv2 ) {\n\n\t\t\t_uvA$1.fromBufferAttribute( uv2, a );\n\t\t\t_uvB$1.fromBufferAttribute( uv2, b );\n\t\t\t_uvC$1.fromBufferAttribute( uv2, c );\n\n\t\t\tintersection.uv2 = Triangle.getUV( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() );\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\n\t}\n\n\treturn intersection;\n\n}\n\nclass BoxGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Uniform Utilities\n */\n\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\nclass ShaderMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = default_vertex;\n\t\tthis.fragmentShader = default_fragment;\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\nShaderMaterial.prototype.isShaderMaterial = true;\n\nclass Camera extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\tthis.projectionMatrix = new Matrix4();\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\treturn this;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nCamera.prototype.isCamera = true;\n\nclass PerspectiveCamera extends Camera {\n\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = - 0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nPerspectiveCamera.prototype.isPerspectiveCamera = true;\n\nconst fov = 90, aspect = 1;\n\nclass CubeCamera extends Object3D {\n\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget !== true ) {\n\n\t\t\tconsole.error( 'THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.renderTarget = renderTarget;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst renderTarget = this.renderTarget;\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst currentToneMapping = renderer.toneMapping;\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0 );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1 );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2 );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3 );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4 );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5 );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\trenderer.toneMapping = currentToneMapping;\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\nclass CubeTexture extends Texture {\n\n\tconstructor( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\nCubeTexture.prototype.isCubeTexture = true;\n\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( size, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\tthis.texture = new CubeTexture( images, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t}\n\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.encoding = texture.encoding;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\tclear( renderer, color, depth, stencil ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\nWebGLCubeRenderTarget.prototype.isWebGLCubeRenderTarget = true;\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\nclass Plane {\n\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\t// normal is assumed to be normalized\n\n\t\tthis.normal = normal;\n\t\tthis.constant = constant;\n\n\t}\n\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );\n\n\t}\n\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t}\n\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nPlane.prototype.isPlane = true;\n\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\nclass Frustum {\n\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromProjectionMatrix( m ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\tintersectsObject( object ) {\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$2.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$2 );\n\n\t}\n\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$2.center.set( 0, 0, 0 );\n\t\t_sphere$2.radius = 0.7071067811865476;\n\t\t_sphere$2.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$2 );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$7.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$7.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$7.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$7 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = 5126;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\ttype = 5131;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttype = 5123;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = 5122;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = 5125;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = 5124;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = 5120;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = 5121;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = 5121;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRange = attribute.updateRange;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRange.count === - 1 ) {\n\n\t\t\t// Not using update ranges\n\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, updateRange.offset, updateRange.count );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );\n\n\t\t\t}\n\n\t\t\tupdateRange.count = - 1; // reset range\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nclass PlaneGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"vec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( V * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\\n\\t\\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\tplane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\tif ( clipped ) discard;\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract( sin( sn ) * c );\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal;\\n#endif\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nmat3 transposeMat3( const in mat3 m ) {\\n\\tmat3 tmp;\\n\\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\\n\\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\\n\\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\\n\\treturn tmp;\\n}\\nfloat linearToRelativeLuminance( const in vec3 color ) {\\n\\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\\n\\treturn dot( weights, color.rgb );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\tvec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define r0 1.0\\n\\t#define v0 0.339\\n\\t#define m0 - 2.0\\n\\t#define r1 0.8\\n\\t#define v1 0.276\\n\\t#define m1 - 1.0\\n\\t#define r4 0.4\\n\\t#define v4 0.046\\n\\t#define m4 2.0\\n\\t#define r5 0.305\\n\\t#define v5 0.016\\n\\t#define m5 3.0\\n\\t#define r6 0.21\\n\\t#define v6 0.0038\\n\\t#define m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= r1 ) {\\n\\t\\t\\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\\n\\t\\t} else if ( roughness >= r4 ) {\\n\\t\\t\\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\\n\\t\\t} else if ( roughness >= r5 ) {\\n\\t\\t\\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\\n\\t\\t} else if ( roughness >= r6 ) {\\n\\t\\t\\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_INSTANCING\\n\\tmat3 m = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\\n\\ttransformedNormal = m * transformedNormal;\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar encodings_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar encodings_pars_fragment = \"vec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\t\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t#endif\\n}\";\n\nvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\treflectedLight.indirectDiffuse += lightMapIrradiance;\\n#endif\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\nvIndirectFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n\\tvIndirectBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry.normal );\\n#ifdef DOUBLE_SIDED\\n\\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\\n\\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry.normal );\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointLightInfo( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotLightInfo( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalLightInfo( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry.normal );\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\nuniform vec3 lightProbe[ 9 ];\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\t}\\n\\t\\treturn distanceFalloff;\\n\\t#else\\n\\t\\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\\n\\t\\t\\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n\\t\\t}\\n\\t\\treturn 1.0;\\n\\t#endif\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#if defined( USE_ENVMAP )\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#if defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#if defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\\n#define Material_LightProbeLOD( material )\\t(0)\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\t#ifdef SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULARINTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULARCOLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vUv ).rgb;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEENCOLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\\n\\t#ifdef USE_SHEENROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\\n\\t#endif\\n#endif\";\n\nvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat roughness;\\n\\tvec3 specularColor;\\n\\tfloat specularF90;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n};\\nvec3 clearcoatSpecular = vec3( 0.0 );\\nvec3 sheenSpecular = vec3( 0.0 );\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\\n\\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\\n\\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\\n\\treturn saturate( DG * RECIPROCAL_PI );\\n}\\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\\n\\treturn fab;\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\tvec3 FssEss = specularColor * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometry.normal;\\n\\t\\tvec3 viewDir = geometry.viewDir;\\n\\t\\tvec3 position = geometry.position;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.roughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\\n\\t#endif\\n\\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\\n\\t#endif\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\\n\\treflectedLight.indirectSpecular += radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\n#ifdef USE_CLEARCOAT\\n\\tgeometry.clearcoatNormal = clearcoatNormal;\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometry.normal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t\\tvarying float vIsPerspective;\\n\\t#else\\n\\t\\tuniform float logDepthBufFC;\\n\\t#endif\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n\\t#else\\n\\t\\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\\n\\t\\t\\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\\n\\t\\t\\tgl_Position.z *= gl_Position.w;\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\tuniform mat3 uvTransform;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t\\t}\\n\\t#else\\n\\t\\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\\n\\t\\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\\n\\t\\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\\n\\t\\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\\n\\t#endif\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\tuniform float morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t\\tuniform sampler2DArray morphTargetsTexture;\\n\\t\\tuniform ivec2 morphTargetsTextureSize;\\n\\t\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t\\t}\\n\\t#else\\n\\t\\t#ifndef USE_MORPHNORMALS\\n\\t\\t\\tuniform float morphTargetInfluences[ 8 ];\\n\\t\\t#else\\n\\t\\t\\tuniform float morphTargetInfluences[ 4 ];\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t\\t}\\n\\t#else\\n\\t\\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\\n\\t\\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\\n\\t\\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\\n\\t\\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\\n\\t\\t#ifndef USE_MORPHNORMALS\\n\\t\\t\\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\\n\\t\\t\\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\\n\\t\\t\\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\\n\\t\\t\\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\t#ifdef USE_TANGENT\\n\\t\\tvec3 tangent = normalize( vTangent );\\n\\t\\tvec3 bitangent = normalize( vBitangent );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\ttangent = tangent * faceDirection;\\n\\t\\t\\tbitangent = bitangent * faceDirection;\\n\\t\\t#endif\\n\\t\\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tmat3 vTBN = mat3( tangent, bitangent, normal );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\nvec3 geometryNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef OBJECTSPACE_NORMALMAP\\n\\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( TANGENTSPACE_NORMALMAP )\\n\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\t#ifdef USE_TANGENT\\n\\t\\tnormal = normalize( vTBN * mapN );\\n\\t#else\\n\\t\\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\\n\\t#endif\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef OBJECTSPACE_NORMALMAP\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\\n\\t\\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\\n\\t\\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tvec3 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\\n\\t\\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = geometryNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\t#ifdef USE_TANGENT\\n\\t\\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\\n\\t#else\\n\\t\\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\\n\\t#endif\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\";\n\nvar output_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= transmissionAlpha + 0.1;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nvec4 pack2HalfToRGBA( vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\tfloat hard_shadow = step( compare , distribution.x );\\n\\t\\tif (hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x ;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn shadow;\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\tdp += shadowBias;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\tvec4 shadowWorldPosition;\\n\\t#endif\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tuniform int boneTextureSize;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tfloat j = i * 4.0;\\n\\t\\tfloat x = mod( j, float( boneTextureSize ) );\\n\\t\\tfloat y = floor( j / float( boneTextureSize ) );\\n\\t\\tfloat dx = 1.0 / float( boneTextureSize );\\n\\t\\tfloat dy = 1.0 / float( boneTextureSize );\\n\\t\\ty = dy * ( y + 0.5 );\\n\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\treturn bone;\\n\\t}\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3( 1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108, 1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605, 1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tfloat transmissionAlpha = 1.0;\\n\\tfloat transmissionFactor = transmission;\\n\\tfloat thicknessFactor = thickness;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\ttransmissionFactor *= texture2D( transmissionMap, vUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmission = getIBLVolumeRefraction(\\n\\t\\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\\n\\t\\tattenuationColor, attenuationDistance );\\n\\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );\\n\\ttransmissionAlpha = mix( transmissionAlpha, transmission.a, transmissionFactor );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\t#ifdef texture2DLodEXT\\n\\t\\t\\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( attenuationDistance == 0.0 ) {\\n\\t\\t\\treturn radiance;\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance * radiance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\trefractionCoords += 1.0;\\n\\t\\trefractionCoords /= 2.0;\\n\\t\\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\\n\\tvarying vec2 vUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#ifdef USE_UV\\n\\t#ifdef UVS_VERTEX_ONLY\\n\\t\\tvec2 vUv;\\n\\t#else\\n\\t\\tvarying vec2 vUv;\\n\\t#endif\\n\\tuniform mat3 uvTransform;\\n#endif\";\n\nvar uv_vertex = \"#ifdef USE_UV\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n#endif\";\n\nvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\nvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n\\tuniform mat3 uv2Transform;\\n#endif\";\n\nvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$g = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$g = \"uniform sampler2D t2D;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tgl_FragColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tgl_FragColor = vec4( mix( pow( gl_FragColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), gl_FragColor.rgb * 0.0773993808, vec3( lessThanEqual( gl_FragColor.rgb, vec3( 0.04045 ) ) ) ), gl_FragColor.w );\\n\\t#endif\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"#include \\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 vReflect = vWorldDirection;\\n\\t#include \\n\\tgl_FragColor = envColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$e = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main () {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$b = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$a = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$a = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vLightFront;\\nvarying vec3 vIndirectFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n\\tvarying vec3 vIndirectBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$9 = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\nvarying vec3 vIndirectFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n\\tvarying vec3 vIndirectBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vIndirectFront;\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= BRDF_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$6 = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULARINTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULARCOLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEENCOLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEENROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include \\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\t\\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$2 = \"#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\tvec2 scale;\\n\\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\\n\\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst ShaderChunk = {\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tencodings_fragment: encodings_fragment,\n\tencodings_pars_fragment: encodings_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_fragment: lightmap_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_vertex: lights_lambert_vertex,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\toutput_fragment: output_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tuv2_pars_fragment: uv2_pars_fragment,\n\tuv2_pars_vertex: uv2_pars_vertex,\n\tuv2_vertex: uv2_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$g,\n\tbackground_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistanceRGBA_vert: vertex$d,\n\tdistanceRGBA_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tuvTransform: { value: new Matrix3() },\n\t\tuv2Transform: { value: new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tflipEnvMap: { value: - 1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 } // basic, lambert, phong\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotShadowMap: { value: [] },\n\t\tspotShadowMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\t/* -------------------------------------------------------------------------\n\t//\tCube map shader\n\t ------------------------------------------------------------------------- */\n\n\tcube: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.envmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatNormalScale: { value: new Vector2( 1, 1 ) },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionSamplerSize: { value: new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: new Color( 0x000000 ) },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularColor: { value: new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nfunction WebGLBackground( renderer, cubemaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction render( renderList, scene ) {\n\n\t\tlet forceClear = false;\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tbackground = cubemaps.get( background );\n\n\t\t}\n\n\t\t// Ignore background in AR\n\t\t// TODO: Reconsider this.\n\n\t\tconst xr = renderer.xr;\n\t\tconst session = xr.getSession && xr.getSession();\n\n\t\tif ( session && session.environmentBlendMode === 'additive' ) {\n\n\t\t\tbackground = null;\n\n\t\t}\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.cube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tstate.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, extensions, attributes, capabilities ) {\n\n\tconst maxVertexAttributes = gl.getParameter( 34921 );\n\n\tconst extension = capabilities.isWebGL2 ? null : extensions.get( 'OES_vertex_array_object' );\n\tconst vaoAvailable = capabilities.isWebGL2 || extension !== null;\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tif ( vaoAvailable ) {\n\n\t\t\tconst state = getBindingState( geometry, program, material );\n\n\t\t\tif ( currentState !== state ) {\n\n\t\t\t\tcurrentState = state;\n\t\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t\t}\n\n\t\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\t} else {\n\n\t\t\tconst wireframe = ( material.wireframe === true );\n\n\t\t\tif ( currentState.geometry !== geometry.id ||\n\t\t\t\tcurrentState.program !== program.id ||\n\t\t\t\tcurrentState.wireframe !== wireframe ) {\n\n\t\t\t\tcurrentState.geometry = geometry.id;\n\t\t\t\tcurrentState.program = program.id;\n\t\t\t\tcurrentState.wireframe = wireframe;\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, 34963 );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( 34963, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.createVertexArray();\n\n\t\treturn extension.createVertexArrayOES();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.bindVertexArray( vao );\n\n\t\treturn extension.bindVertexArrayOES( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.deleteVertexArray( vao );\n\n\t\treturn extension.deleteVertexArrayOES( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tconst extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset ) {\n\n\t\tif ( capabilities.isWebGL2 === true && ( type === 5124 || type === 5125 ) ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tif ( capabilities.isWebGL2 === false && ( object.isInstancedMesh || geometry.isInstancedBufferGeometry ) ) {\n\n\t\t\tif ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) return;\n\n\t\t}\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawArraysInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawArraysInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( 35633, 36338 ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( 35632, 36338 ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( 35633, 36337 ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( 35632, 36337 ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tconst isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext ) ||\n\t\t( typeof WebGL2ComputeRenderingContext !== 'undefined' && gl instanceof WebGL2ComputeRenderingContext );\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst drawBuffers = isWebGL2 || extensions.has( 'WEBGL_draw_buffers' );\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tconst maxTextures = gl.getParameter( 34930 );\n\tconst maxVertexTextures = gl.getParameter( 35660 );\n\tconst maxTextureSize = gl.getParameter( 3379 );\n\tconst maxCubemapSize = gl.getParameter( 34076 );\n\n\tconst maxAttributes = gl.getParameter( 34921 );\n\tconst maxVertexUniforms = gl.getParameter( 36347 );\n\tconst maxVaryings = gl.getParameter( 36348 );\n\tconst maxFragmentUniforms = gl.getParameter( 36349 );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\tconst floatFragmentTextures = isWebGL2 || extensions.has( 'OES_texture_float' );\n\tconst floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\tconst maxSamples = isWebGL2 ? gl.getParameter( 36183 ) : 0;\n\n\treturn {\n\n\t\tisWebGL2: isWebGL2,\n\n\t\tdrawBuffers: drawBuffers,\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\tfloatVertexTextures: floatVertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping, camera ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\t\tresetGlobalState();\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture && texture.isRenderTargetTexture === false ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height / 2 );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nclass OrthographicCamera extends Camera {\n\n\tconstructor( left = - 1, right = 1, top = 1, bottom = - 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\nOrthographicCamera.prototype.isOrthographicCamera = true;\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips. These are\n// chosen to approximate a Trowbridge-Reitz distribution function times the\n// geometric shadowing function. These sigma values squared must match the\n// variance #defines in cube_uv_reflection_fragment.glsl.js.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\n\n// Golden Ratio\nconst PHI = ( 1 + Math.sqrt( 5 ) ) / 2;\nconst INV_PHI = 1 / PHI;\n\n// Vertices of a dodecahedron (except the opposites, which represent the\n// same axis), used as axis directions evenly spread on a sphere.\nconst _axisDirections = [\n\t/*@__PURE__*/ new Vector3( 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),\n\t/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),\n\t/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ];\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * Paper: Fast, Accurate Image-Based Lighting\n * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view\n*/\n\nclass PMREMGenerator {\n\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._lodPlanes = [];\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\n\t\tthis._blurMaterial = null;\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._compileMaterial( this._blurMaterial );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety (the cubeCamera\n\t * is placed at the origin).\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100 ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\n\t\tthis._setSize( 256 );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodPlanes.length; i ++ ) {\n\n\t\t\tthis._lodPlanes[ i ].dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget );\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tencoding: LinearEncoding,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { sizeLods: this._sizeLods, lodPlanes: this._lodPlanes, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst tmpMesh = new Mesh( this._lodPlanes[ 0 ], material );\n\t\tthis._renderer.compile( tmpMesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, - 1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\tconst backgroundMaterial = new MeshBasicMaterial( {\n\t\t\tname: 'PMREM.Background',\n\t\t\tside: BackSide,\n\t\t\tdepthWrite: false,\n\t\t\tdepthTest: false,\n\t\t} );\n\n\t\tconst backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial );\n\n\t\tlet useSolidColor = false;\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( forwardSign[ i ], 0, 0 );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.lookAt( 0, forwardSign[ i ], 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( 0, 0, forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\tbackgroundBox.geometry.dispose();\n\t\tbackgroundBox.material.dispose();\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\t\tconst mesh = new Mesh( this._lodPlanes[ 0 ], material );\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tfor ( let i = 1; i < this._lodPlanes.length; i ++ ) {\n\n\t\t\tconst sigma = Math.sqrt( this._sigmas[ i ] * this._sigmas[ i ] - this._sigmas[ i - 1 ] * this._sigmas[ i - 1 ] );\n\n\t\t\tconst poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];\n\n\t\t\tthis._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\tconsole.error(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = new Mesh( this._lodPlanes[ lodOut ], blurMaterial );\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\tconsole.warn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst lodPlanes = [];\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : - 1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodPlanes.push( planes );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodPlanes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: - 1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.needsPMREMUpdate === true ) {\n\n\t\t\t\t\ttexture.needsPMREMUpdate = false;\n\n\t\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( cubeUVmaps.has( texture ) ) {\n\n\t\t\t\t\t\treturn cubeUVmaps.get( texture ).texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\tconst renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tlet extension;\n\n\t\tswitch ( name ) {\n\n\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\textension = gl.getExtension( name );\n\n\t\t}\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function ( capabilities ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\n\t\t\t} else {\n\n\t\t\t\tgetExtension( 'WEBGL_depth_texture' );\n\t\t\t\tgetExtension( 'OES_texture_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float_linear' );\n\t\t\t\tgetExtension( 'OES_standard_derivatives' );\n\t\t\t\tgetExtension( 'OES_element_index_uint' );\n\t\t\t\tgetExtension( 'OES_vertex_array_object' );\n\t\t\t\tgetExtension( 'ANGLE_instanced_arrays' );\n\n\t\t\t}\n\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], 34962 );\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = morphAttributes[ name ];\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.update( array[ i ], 34962 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawElementsInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawElementsInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase 4:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase 0:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.frame ++;\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction numericalSort( a, b ) {\n\n\treturn a[ 0 ] - b[ 0 ];\n\n}\n\nfunction absNumericalSort( a, b ) {\n\n\treturn Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );\n\n}\n\nfunction denormalize( morph, attribute ) {\n\n\tlet denominator = 1;\n\tconst array = attribute.isInterleavedBufferAttribute ? attribute.data.array : attribute.array;\n\n\tif ( array instanceof Int8Array ) denominator = 127;\n\telse if ( array instanceof Int16Array ) denominator = 32767;\n\telse if ( array instanceof Int32Array ) denominator = 2147483647;\n\telse console.error( 'THREE.WebGLMorphtargets: Unsupported morph attribute data type: ', array );\n\n\tmorph.divideScalar( denominator );\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst influencesList = {};\n\tconst morphInfluences = new Float32Array( 8 );\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tconst workInfluences = [];\n\n\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\tworkInfluences[ i ] = [ i, 0 ];\n\n\t}\n\n\tfunction update( object, geometry, material, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tif ( capabilities.isWebGL2 === true ) {\n\n\t\t\t// instead of using attributes, the WebGL 2 code path encodes morph targets\n\t\t\t// into an array of data textures. Each layer represents a single morph target.\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tlet entry = morphTextures.get( geometry );\n\n\t\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\t\tlet vertexDataCount = 0;\n\n\t\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\t\tlet height = 1;\n\n\t\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t\t}\n\n\t\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\t\ttexture.type = FloatType;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t// fill buffer\n\n\t\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\t\tif ( morphTarget.normalized === true ) denormalize( morph, morphTarget );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\t\tif ( morphNormal.normalized === true ) denormalize( morph, morphNormal );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\t\tif ( morphColor.normalized === true ) denormalize( morph, morphColor );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tentry = {\n\t\t\t\t\tcount: morphTargetsCount,\n\t\t\t\t\ttexture: texture,\n\t\t\t\t\tsize: new Vector2( width, height )\n\t\t\t\t};\n\n\t\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\t\tfunction disposeTexture() {\n\n\t\t\t\t\ttexture.dispose();\n\n\t\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\n\t\t} else {\n\n\t\t\t// When object doesn't have morph target influences defined, we treat it as a 0-length array\n\t\t\t// This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences\n\n\t\t\tconst length = objectInfluences === undefined ? 0 : objectInfluences.length;\n\n\t\t\tlet influences = influencesList[ geometry.id ];\n\n\t\t\tif ( influences === undefined || influences.length !== length ) {\n\n\t\t\t\t// initialise list\n\n\t\t\t\tinfluences = [];\n\n\t\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tinfluences[ i ] = [ i, 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tinfluencesList[ geometry.id ] = influences;\n\n\t\t\t}\n\n\t\t\t// Collect influences\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tconst influence = influences[ i ];\n\n\t\t\t\tinfluence[ 0 ] = i;\n\t\t\t\tinfluence[ 1 ] = objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tinfluences.sort( absNumericalSort );\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tif ( i < length && influences[ i ][ 1 ] ) {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = influences[ i ][ 0 ];\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = influences[ i ][ 1 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER;\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tworkInfluences.sort( numericalSort );\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position;\n\t\t\tconst morphNormals = geometry.morphAttributes.normal;\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tconst influence = workInfluences[ i ];\n\t\t\t\tconst index = influence[ 0 ];\n\t\t\t\tconst value = influence[ 1 ];\n\n\t\t\t\tif ( index !== Number.MAX_SAFE_INTEGER && value ) {\n\n\t\t\t\t\tif ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = value;\n\t\t\t\t\tmorphInfluencesSum += value;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphTarget' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// GLSL shader uses formula baseinfluence * base + sum(target * influence)\n\t\t\t// This allows us to switch between absolute morphs and relative morphs without changing shader code\n\t\t\t// When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence)\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tattributes.update( object.instanceMatrix, 34962 );\n\n\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\tattributes.update( object.instanceColor, 34962 );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\nconst emptyTexture = new Texture();\nconst emptyArrayTexture = new DataArrayTexture();\nconst empty3dTexture = new Data3DTexture();\nconst emptyCubeTexture = new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4uiv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nfunction SingleUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.size = activeInfo.size;\n\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nfunction StructuredUniform( id ) {\n\n\tthis.id = id;\n\n\tthis.seq = [];\n\tthis.map = {};\n\n}\n\nStructuredUniform.prototype.setValue = function ( gl, value, textures ) {\n\n\tconst seq = this.seq;\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ];\n\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t}\n\n};\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nfunction WebGLUniforms( gl, program ) {\n\n\tthis.seq = [];\n\tthis.map = {};\n\n\tconst n = gl.getProgramParameter( program, 35718 );\n\n\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\tparseUniform( info, addr, this );\n\n\t}\n\n}\n\nWebGLUniforms.prototype.setValue = function ( gl, name, value, textures ) {\n\n\tconst u = this.map[ name ];\n\n\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n};\n\nWebGLUniforms.prototype.setOptional = function ( gl, object, name ) {\n\n\tconst v = object[ name ];\n\n\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n};\n\n\n// Static interface\n\nWebGLUniforms.upload = function ( gl, seq, values, textures ) {\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ],\n\t\t\tv = values[ u.id ];\n\n\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t}\n\n\t}\n\n};\n\nWebGLUniforms.seqWithValue = function ( seq, values ) {\n\n\tconst r = [];\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ];\n\t\tif ( u.id in values ) r.push( u );\n\n\t}\n\n\treturn r;\n\n};\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tlines2.push( ( i + 1 ) + ': ' + lines[ i ] );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nfunction getEncodingComponents( encoding ) {\n\n\tswitch ( encoding ) {\n\n\t\tcase LinearEncoding:\n\t\t\treturn [ 'Linear', '( value )' ];\n\t\tcase sRGBEncoding:\n\t\t\treturn [ 'sRGB', '( value )' ];\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported encoding:', encoding );\n\t\t\treturn [ 'Linear', '( value )' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, 35713 );\n\tconst errors = gl.getShaderInfoLog( shader ).trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 0 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\tconst components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nfunction generateExtensions( parameters ) {\n\n\tconst chunks = [\n\t\t( parameters.extensionDerivatives || !! parameters.envMapCubeUVHeight || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t( parameters.extensionShaderTextureLOD || parameters.envMap || parameters.transmission ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, 35721 );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === 35674 ) locationSize = 2;\n\t\tif ( info.type === 35675 ) locationSize = 3;\n\t\tif ( info.type === 35676 ) locationSize = 4;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nfunction includeReplacer( match, include ) {\n\n\tconst string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst deprecatedUnrollLoopPattern = /#pragma unroll_loop[\\s]+?for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string\n\t\t.replace( unrollLoopPattern, loopReplacer )\n\t\t.replace( deprecatedUnrollLoopPattern, deprecatedLoopReplacer );\n\n}\n\nfunction deprecatedLoopReplacer( match, start, end, snippet ) {\n\n\tconsole.warn( 'WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.' );\n\treturn loopReplacer( match, start, end, snippet );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = 'precision ' + parameters.precision + ' float;\\nprecision ' + parameters.precision + ' int;';\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// console.log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\n\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors && parameters.isWebGL2 ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE' : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )',\n\n\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t'\t#else',\n\n\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t'\t#endif',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'encodings_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\t'precision mediump sampler2DArray;',\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, 35633, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, 35632, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\t// check for link errors\n\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\tconst programLog = gl.getProgramInfoLog( program ).trim();\n\t\tconst vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\t\tconst fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\t\tlet runnable = true;\n\t\tlet haveDiagnostics = true;\n\n\t\tif ( gl.getProgramParameter( program, 35714 ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\tconsole.error(\n\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, 35715 ) + '\\n\\n' +\n\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\tfragmentErrors\n\t\t\t);\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t}\n\n\t// Clean up\n\n\t// Crashes in iOS9 and iOS10. #18402\n\t// gl.detachShader( program, glVertexShader );\n\t// gl.detachShader( program, glFragmentShader );\n\n\tgl.deleteShader( glVertexShader );\n\tgl.deleteShader( glFragmentShader );\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\n\t\tif ( cache.has( material ) === false ) {\n\n\t\t\tcache.set( material, new Set() );\n\n\t\t}\n\n\t\treturn cache.get( material );\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\n\t\tif ( cache.has( code ) === false ) {\n\n\t\t\tconst stage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn cache.get( code );\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst programs = [];\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst vertexTextures = capabilities.vertexTextures;\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst useAlphaTest = material.alphaTest > 0;\n\t\tconst useClearcoat = material.clearcoat > 0;\n\n\t\tconst parameters = {\n\n\t\t\tisWebGL2: isWebGL2,\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderName: material.type,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tinstancing: object.isInstancedMesh === true,\n\t\t\tinstancingColor: object.isInstancedMesh === true && object.instanceColor !== null,\n\n\t\t\tsupportsVertexTextures: vertexTextures,\n\t\t\toutputEncoding: ( currentRenderTarget === null ) ? renderer.outputEncoding : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.encoding : LinearEncoding ),\n\t\t\tmap: !! material.map,\n\t\t\tmatcap: !! material.matcap,\n\t\t\tenvMap: !! envMap,\n\t\t\tenvMapMode: envMap && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\tlightMap: !! material.lightMap,\n\t\t\taoMap: !! material.aoMap,\n\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\tbumpMap: !! material.bumpMap,\n\t\t\tnormalMap: !! material.normalMap,\n\t\t\tobjectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,\n\t\t\ttangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tdecodeVideoTexture: !! material.map && ( material.map.isVideoTexture === true ) && ( material.map.encoding === sRGBEncoding ),\n\n\t\t\tclearcoat: useClearcoat,\n\t\t\tclearcoatMap: useClearcoat && !! material.clearcoatMap,\n\t\t\tclearcoatRoughnessMap: useClearcoat && !! material.clearcoatRoughnessMap,\n\t\t\tclearcoatNormalMap: useClearcoat && !! material.clearcoatNormalMap,\n\n\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\tspecularMap: !! material.specularMap,\n\t\t\tspecularIntensityMap: !! material.specularIntensityMap,\n\t\t\tspecularColorMap: !! material.specularColorMap,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending,\n\n\t\t\talphaMap: !! material.alphaMap,\n\t\t\talphaTest: useAlphaTest,\n\n\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\tsheen: material.sheen > 0,\n\t\t\tsheenColorMap: !! material.sheenColorMap,\n\t\t\tsheenRoughnessMap: !! material.sheenRoughnessMap,\n\n\t\t\ttransmission: material.transmission > 0,\n\t\t\ttransmissionMap: !! material.transmissionMap,\n\t\t\tthicknessMap: !! material.thicknessMap,\n\n\t\t\tcombine: material.combine,\n\n\t\t\tvertexTangents: ( !! material.normalMap && !! geometry.attributes.tangent ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\t\t\tvertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.displacementMap || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || !! material.sheenColorMap || !! material.sheenRoughnessMap,\n\t\t\tuvsVertexOnly: ! ( !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatNormalMap || material.transmission > 0 || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || material.sheen > 0 || !! material.sheenColorMap || !! material.sheenRoughnessMap ) && !! material.displacementMap,\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: !! material.flatShading,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: material.toneMapped ? renderer.toneMapping : NoToneMapping,\n\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: !! material.depthPacking,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionDerivatives: material.extensions && material.extensions.derivatives,\n\t\t\textensionFragDepth: material.extensions && material.extensions.fragDepth,\n\t\t\textensionDrawBuffers: material.extensions && material.extensions.drawBuffers,\n\t\t\textensionShaderTextureLOD: material.extensions && material.extensions.shaderTextureLOD,\n\n\t\t\trendererExtensionFragDepth: isWebGL2 || extensions.has( 'EXT_frag_depth' ),\n\t\t\trendererExtensionDrawBuffers: isWebGL2 || extensions.has( 'WEBGL_draw_buffers' ),\n\t\t\trendererExtensionShaderTextureLod: isWebGL2 || extensions.has( 'EXT_shader_texture_lod' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputEncoding );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputEncoding );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.vertexUvs );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.isWebGL2 )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.map )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.lightMap )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.aoMap )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.emissiveMap )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.bumpMap )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.normalMap )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.objectSpaceNormalMap )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.tangentSpaceNormalMap )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.clearcoatMap )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.clearcoatRoughnessMap )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.clearcoatNormalMap )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.displacementMap )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.specularMap )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.roughnessMap )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.metalnessMap )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 22 );\n\t\tif ( parameters.alphaMap )\n\t\t\t_programLayers.enable( 23 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 24 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 25 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 26 );\n\t\tif ( parameters.vertexUvs )\n\t\t\t_programLayers.enable( 27 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 28 );\n\t\tif ( parameters.uvsVertexOnly )\n\t\t\t_programLayers.enable( 29 );\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 30 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.physicallyCorrectLights )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.specularIntensityMap )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.specularColorMap )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.transmissionMap )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.thicknessMap )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.sheenColorMap )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.sheenRoughnessMap )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 22 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 23 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tlet list;\n\n\t\tif ( lists.has( scene ) === false ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= lists.get( scene ).length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlists.get( scene ).push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = lists.get( scene )[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 1 : 0 ) - ( lightA.castShadow ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions, capabilities ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: - 1,\n\t\t\tpointLength: - 1,\n\t\t\tspotLength: - 1,\n\t\t\trectAreaLength: - 1,\n\t\t\themiLength: - 1,\n\n\t\t\tnumDirectionalShadows: - 1,\n\t\t\tnumPointShadows: - 1,\n\t\t\tnumSpotShadows: - 1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotShadowMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: []\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights, physicallyCorrectLights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\n\t\tlights.sort( shadowCastingLightsFirst );\n\n\t\t// artist-friendly light intensity scaling factor\n\t\tconst scaleFactor = ( physicallyCorrectLights !== true ) ? Math.PI : 1;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity * scaleFactor;\n\t\t\t\tg += color.g * intensity * scaleFactor;\n\t\t\t\tb += color.b * intensity * scaleFactor;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\tstate.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\t// (a) intensity is the total visible light emitted\n\t\t\t\t//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );\n\n\t\t\t\t// (b) intensity is the brightness of the light\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity * scaleFactor );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\t// WebGL 2\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\t// WebGL 1\n\n\t\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t\t} else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotShadowMatrix.length = numSpotShadows;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions, capabilities ) {\n\n\tconst lights = new WebGLLights( extensions, capabilities );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init() {\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights( physicallyCorrectLights ) {\n\n\t\tlights.setup( lightsArray, physicallyCorrectLights );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tlights: lights\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions, capabilities ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tlet renderState;\n\n\t\tif ( renderStates.has( scene ) === false ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStates.get( scene ).length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\t\trenderStates.get( scene ).push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStates.get( scene )[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nclass MeshDepthMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\nclass MeshDistanceMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\tthis.referencePosition = new Vector3();\n\t\tthis.nearDistance = 1;\n\t\tthis.farDistance = 1000;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.referencePosition.copy( source.referencePosition );\n\t\tthis.nearDistance = source.nearDistance;\n\t\tthis.farDistance = source.farDistance;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include \\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nfunction WebGLShadowMap( _renderer, _objects, _capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = _capabilities.maxTextureSize;\n\n\tconst shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = _renderer.getRenderTarget();\n\t\tconst activeCubeFace = _renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = _renderer.getActiveMipmapLevel();\n\n\t\tconst _state = _renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null && ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\tconst pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\t_renderer.setRenderTarget( shadow.map );\n\t\t\t_renderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\tscope.needsUpdate = false;\n\n\t\t_renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = _objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.mapPass );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.map );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, shadowCameraNear, shadowCameraFar, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t}\n\n\t\tif ( ( _renderer.localClippingEnabled && material.clipShadows === true && material.clippingPlanes.length !== 0 ) ||\n\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t( material.alphaMap && material.alphaTest > 0 ) ) {\n\n\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t// appropriate state\n\n\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t}\n\n\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult = cachedMaterial;\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = material.alphaTest;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tresult.referencePosition.setFromMatrixPosition( light.matrixWorld );\n\t\t\tresult.nearDistance = shadowCameraNear;\n\t\t\tresult.farDistance = shadowCameraFar;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = _objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n}\n\nfunction WebGLState( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( 2929 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( 2929 );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 512 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 519 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 513 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 515 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 514 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 518 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 516 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 517 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 515 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.depthFunc( 515 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( 2960 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( 2960 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef !== stencilRef ||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( 35661 );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( 7938 );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( 3088 );\n\tconst viewportParam = gl.getParameter( 2978 );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, 10241, 9728 );\n\t\tgl.texParameteri( type, 10240, 9728 );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tgl.texImage2D( target + i, 0, 6408, 1, 1, 0, 6408, 5121, data );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ 3553 ] = createTexture( 3553, 3553, 1 );\n\temptyTextures[ 34067 ] = createTexture( 34067, 34069, 6 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( 2929 );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( 2884 );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t// 36009 is equivalent to 36160\n\n\t\t\t\tif ( target === 36009 ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ 36160 ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t\tif ( target === 36160 ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ 36009 ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== 36064 ) {\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tdrawBuffers[ i ] = 36064 + i;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( drawBuffers[ 0 ] !== 36064 ) {\n\n\t\t\t\t\tdrawBuffers[ 0 ] = 36064;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== 1029 ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = 1029;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t\t} else {\n\n\t\t\t\textensions.get( 'WEBGL_draw_buffers' ).drawBuffersWEBGL( drawBuffers );\n\n\t\t\t}\n\n\t\t}\n\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: 32774,\n\t\t[ SubtractEquation ]: 32778,\n\t\t[ ReverseSubtractEquation ]: 32779\n\t};\n\n\tif ( isWebGL2 ) {\n\n\t\tequationToGL[ MinEquation ] = 32775;\n\t\tequationToGL[ MaxEquation ] = 32776;\n\n\t} else {\n\n\t\tconst extension = extensions.get( 'EXT_blend_minmax' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tequationToGL[ MinEquation ] = extension.MIN_EXT;\n\t\t\tequationToGL[ MaxEquation ] = extension.MAX_EXT;\n\n\t\t}\n\n\t}\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: 0,\n\t\t[ OneFactor ]: 1,\n\t\t[ SrcColorFactor ]: 768,\n\t\t[ SrcAlphaFactor ]: 770,\n\t\t[ SrcAlphaSaturateFactor ]: 776,\n\t\t[ DstColorFactor ]: 774,\n\t\t[ DstAlphaFactor ]: 772,\n\t\t[ OneMinusSrcColorFactor ]: 769,\n\t\t[ OneMinusSrcAlphaFactor ]: 771,\n\t\t[ OneMinusDstColorFactor ]: 775,\n\t\t[ OneMinusDstAlphaFactor ]: 773\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( 3042 );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( 3042 );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( 32774 );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 1, 771, 1, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 1, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 769, 0, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 768, 0, 770 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 770, 771, 1, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 770, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 769, 0, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 0, 768 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = null;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( 2884 )\n\t\t\t: enable( 2884 );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( 32926 )\n\t\t\t: disable( 32926 );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( 2304 );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( 2305 );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( 2884 );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( 1029 );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( 1028 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( 1032 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( 2884 );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( 32823 );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( 32823 );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( 3089 );\n\n\t\t} else {\n\n\t\t\tdisable( 3089 );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = 33984 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\tif ( currentTextureSlot === null ) {\n\n\t\t\tactiveTexture();\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( 3042 );\n\t\tgl.disable( 2884 );\n\t\tgl.disable( 2929 );\n\t\tgl.disable( 32823 );\n\t\tgl.disable( 3089 );\n\t\tgl.disable( 2960 );\n\t\tgl.disable( 32926 );\n\n\t\tgl.blendEquation( 32774 );\n\t\tgl.blendFunc( 1, 0 );\n\t\tgl.blendFuncSeparate( 1, 0, 1, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( 513 );\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( 519, 0, 0xffffffff );\n\t\tgl.stencilOp( 7680, 7680, 7680 );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( 1029 );\n\t\tgl.frontFace( 2305 );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( 33984 );\n\n\t\tgl.bindFramebuffer( 36160, null );\n\n\t\tif ( isWebGL2 === true ) {\n\n\t\t\tgl.bindFramebuffer( 36009, null );\n\t\t\tgl.bindFramebuffer( 36008, null );\n\n\t\t}\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst maxTextures = capabilities.maxTextures;\n\tconst maxCubemapSize = capabilities.maxCubemapSize;\n\tconst maxTextureSize = capabilities.maxTextureSize;\n\tconst maxSamples = capabilities.maxSamples;\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( image.width, image.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 || needsPowerOfTwo === true ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\t\tconst floor = needsPowerOfTwo ? floorPowerOfTwo : Math.floor;\n\n\t\t\t\tconst width = floor( scale * image.width );\n\t\t\t\tconst height = floor( scale * image.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction isPowerOfTwo$1( image ) {\n\n\t\treturn isPowerOfTwo( image.width ) && isPowerOfTwo( image.height );\n\n\t}\n\n\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\tif ( isWebGL2 ) return false;\n\n\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture, supportsMips ) {\n\n\t\treturn texture.generateMipmaps && supportsMips &&\n\t\t\ttexture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, encoding, isVideoTexture = false ) {\n\n\t\tif ( isWebGL2 === false ) return glFormat;\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === 6403 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 33326;\n\t\t\tif ( glType === 5131 ) internalFormat = 33325;\n\t\t\tif ( glType === 5121 ) internalFormat = 33321;\n\n\t\t}\n\n\t\tif ( glFormat === 33319 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 33328;\n\t\t\tif ( glType === 5131 ) internalFormat = 33327;\n\t\t\tif ( glType === 5121 ) internalFormat = 33323;\n\n\t\t}\n\n\t\tif ( glFormat === 6408 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 34836;\n\t\t\tif ( glType === 5131 ) internalFormat = 34842;\n\t\t\tif ( glType === 5121 ) internalFormat = ( encoding === sRGBEncoding && isVideoTexture === false ) ? 35907 : 32856;\n\t\t\tif ( glType === 32819 ) internalFormat = 32854;\n\t\t\tif ( glType === 32820 ) internalFormat = 32855;\n\n\t\t}\n\n\t\tif ( internalFormat === 33325 || internalFormat === 33326 ||\n\t\t\tinternalFormat === 33327 || internalFormat === 33328 ||\n\t\t\tinternalFormat === 34842 || internalFormat === 34836 ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image, supportsMips ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t// Fallback filters for non-power-of-2 textures\n\n\tfunction filterFallback( f ) {\n\n\t\tif ( f === NearestFilter || f === NearestMipmapNearestFilter || f === NearestMipmapLinearFilter ) {\n\n\t\t\treturn 9728;\n\n\t\t}\n\n\t\treturn 9729;\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\tinfo.memory.textures --;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = texture.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachmentProperties = properties.get( texture[ i ] );\n\n\t\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\t\tinfo.memory.textures --;\n\n\t\t\t\t}\n\n\t\t\t\tproperties.remove( texture[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.encoding );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 3553, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 35866, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 32879, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: 10497,\n\t\t[ ClampToEdgeWrapping ]: 33071,\n\t\t[ MirroredRepeatWrapping ]: 33648\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: 9728,\n\t\t[ NearestMipmapNearestFilter ]: 9984,\n\t\t[ NearestMipmapLinearFilter ]: 9986,\n\n\t\t[ LinearFilter ]: 9729,\n\t\t[ LinearMipmapNearestFilter ]: 9985,\n\t\t[ LinearMipmapLinearFilter ]: 9987\n\t};\n\n\tfunction setTextureParameters( textureType, texture, supportsMips ) {\n\n\t\tif ( supportsMips ) {\n\n\t\t\t_gl.texParameteri( textureType, 10242, wrappingToGL[ texture.wrapS ] );\n\t\t\t_gl.texParameteri( textureType, 10243, wrappingToGL[ texture.wrapT ] );\n\n\t\t\tif ( textureType === 32879 || textureType === 35866 ) {\n\n\t\t\t\t_gl.texParameteri( textureType, 32882, wrappingToGL[ texture.wrapR ] );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, 10240, filterToGL[ texture.magFilter ] );\n\t\t\t_gl.texParameteri( textureType, 10241, filterToGL[ texture.minFilter ] );\n\n\t\t} else {\n\n\t\t\t_gl.texParameteri( textureType, 10242, 33071 );\n\t\t\t_gl.texParameteri( textureType, 10243, 33071 );\n\n\t\t\tif ( textureType === 32879 || textureType === 35866 ) {\n\n\t\t\t\t_gl.texParameteri( textureType, 32882, 33071 );\n\n\t\t\t}\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, 10240, filterFallback( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, 10241, filterFallback( texture.minFilter ) );\n\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension for WebGL 1 and WebGL 2\n\t\t\tif ( isWebGL2 === false && ( texture.type === HalfFloatType && extensions.has( 'OES_texture_half_float_linear' ) === false ) ) return; // verify extension for WebGL 1 only\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = 3553;\n\n\t\tif ( texture.isDataArrayTexture ) textureType = 35866;\n\t\tif ( texture.isData3DTexture ) textureType = 32879;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture );\n\n\t\tif ( source.version !== source.__currentVersion || forceUpload === true ) {\n\n\t\t\t_gl.pixelStorei( 37440, texture.flipY );\n\t\t\t_gl.pixelStorei( 37441, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( 3317, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( 37443, 0 );\n\n\t\t\tconst needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo$1( texture.image ) === false;\n\t\t\tlet image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst supportsMips = isPowerOfTwo$1( image ) || isWebGL2,\n\t\t\t\tglFormat = utils.convert( texture.format, texture.encoding );\n\n\t\t\tlet glType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture, supportsMips );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( textureProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst levels = getMipLevels( texture, image, supportsMips );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tglInternalFormat = 6402;\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = 36012;\n\n\t\t\t\t\t} else if ( texture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = 33190;\n\n\t\t\t\t\t} else if ( texture.type === UnsignedInt248Type ) {\n\n\t\t\t\t\t\tglInternalFormat = 35056;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tglInternalFormat = 33189; // WebGL2 requires sized internalformat for glTexImage2D\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\t\tconsole.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// validation checks for WebGL 1\n\n\t\t\t\tif ( texture.format === DepthFormat && glInternalFormat === 6402 ) {\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.format === DepthStencilFormat && glInternalFormat === 6402 ) {\n\n\t\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tglInternalFormat = 34041;\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 3553, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstate.texSubImage2D( 3553, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( 3553, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.compressedTexImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 3553, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( 35866, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage3D( 35866, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( 35866, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( 32879, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage3D( 32879, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( 32879, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 3553, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstate.texSubImage2D( 3553, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsource.__currentVersion = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\n\t\tif ( source.version !== source.__currentVersion || forceUpload === true ) {\n\n\t\t\t_gl.pixelStorei( 37440, texture.flipY );\n\t\t\t_gl.pixelStorei( 37441, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( 3317, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( 37443, 0 );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tsupportsMips = isPowerOfTwo$1( image ) || isWebGL2,\n\t\t\t\tglFormat = utils.convert( texture.format, texture.encoding ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\n\t\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( textureProperties.__version === undefined );\n\t\t\tlet levels = getMipLevels( texture, image, supportsMips );\n\n\t\t\tsetTextureParameters( 34067, texture, supportsMips );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( 34067, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( 34069 + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tstate.texStorage2D( 34067, levels, glInternalFormat, cubeImage[ 0 ].width, cubeImage[ 0 ].height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( 34067 );\n\n\t\t\t}\n\n\t\t\tsource.__currentVersion = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tif ( textureTarget === 32879 || textureTarget === 35866 ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( 36160, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else {\n\n\t\t\t_gl.framebufferTexture2D( 36160, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( 36160, null );\n\n\t}\n\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( 36161, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\tlet glInternalFormat = 33189;\n\n\t\t\tif ( isMultisample || useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\n\t\t\t\tif ( depthTexture && depthTexture.isDepthTexture ) {\n\n\t\t\t\t\tif ( depthTexture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = 36012;\n\n\t\t\t\t\t} else if ( depthTexture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = 33190;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( 36160, 36096, 36161, renderbuffer );\n\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, 35056, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( 36161, samples, 35056, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, 34041, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\n\t\t\t_gl.framebufferRenderbuffer( 36160, 33306, 36161, renderbuffer );\n\n\t\t} else {\n\n\t\t\t// Use the first texture for MRT so far\n\t\t\tconst texture = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture[ 0 ] : renderTarget.texture;\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( 36161, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( 36160, 36096, 3553, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( 36160, 36096, 3553, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( 36160, 33306, 3553, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( 36160, 33306, 3553, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( 36160, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, 36064, 3553 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets !== true ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );\n\t\tconst supportsMips = isPowerOfTwo$1( renderTarget ) || isWebGL2;\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tif ( capabilities.drawBuffers ) {\n\n\t\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.' );\n\n\t\t\t\t}\n\n\t\t\t} else if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();\n\n\t\t\t\t_gl.bindRenderbuffer( 36161, renderTargetProperties.__webglColorRenderbuffer );\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t_gl.framebufferRenderbuffer( 36160, 36064, 36161, renderTargetProperties.__webglColorRenderbuffer );\n\t\t\t\t_gl.bindRenderbuffer( 36161, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( 36160, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( 34067, texture, supportsMips );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, 36064, 34069 + i );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( 34067 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tconst textures = renderTarget.texture;\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tstate.bindTexture( 3553, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( 3553, attachment, supportsMips );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, 36064 + i, 3553 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {\n\n\t\t\t\t\tgenerateMipmap( 3553 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = 3553;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? 32879 : 35866;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLTextures: THREE.Data3DTexture and THREE.DataArrayTexture only supported with WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture, supportsMips );\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, 36064, glTextureType );\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst supportsMips = isPowerOfTwo$1( renderTarget ) || isWebGL2;\n\n\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tconst target = renderTarget.isWebGLCubeRenderTarget ? 34067 : 3553;\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\tgenerateMipmap( target );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\tconst width = renderTarget.width;\n\t\t\tconst height = renderTarget.height;\n\t\t\tlet mask = 16384;\n\t\t\tconst invalidationArray = [ 36064 ];\n\t\t\tconst depthStyle = renderTarget.stencilBuffer ? 33306 : 36096;\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tinvalidationArray.push( depthStyle );\n\n\t\t\t}\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\tconst ignoreDepthValues = ( renderTargetProperties.__ignoreDepthValues !== undefined ) ? renderTargetProperties.__ignoreDepthValues : false;\n\n\t\t\tif ( ignoreDepthValues === false ) {\n\n\t\t\t\tif ( renderTarget.depthBuffer ) mask |= 256;\n\t\t\t\tif ( renderTarget.stencilBuffer ) mask |= 1024;\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( 36008, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\tstate.bindFramebuffer( 36009, renderTargetProperties.__webglFramebuffer );\n\n\t\t\tif ( ignoreDepthValues === true ) {\n\n\t\t\t\t_gl.invalidateFramebuffer( 36008, [ depthStyle ] );\n\t\t\t\t_gl.invalidateFramebuffer( 36009, [ depthStyle ] );\n\n\t\t\t}\n\n\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, 9728 );\n\n\t\t\tif ( supportsInvalidateFramebuffer ) {\n\n\t\t\t\t_gl.invalidateFramebuffer( 36008, invalidationArray );\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( 36008, null );\n\t\t\tstate.bindFramebuffer( 36009, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn isWebGL2 && renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst encoding = texture.encoding;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true || texture.format === _SRGBAFormat ) return image;\n\n\t\tif ( encoding !== LinearEncoding ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( encoding === sRGBEncoding ) {\n\n\t\t\t\tif ( isWebGL2 === false ) {\n\n\t\t\t\t\t// in WebGL 1, try to use EXT_sRGB extension and unsized formats\n\n\t\t\t\t\tif ( extensions.has( 'EXT_sRGB' ) === true && format === RGBAFormat ) {\n\n\t\t\t\t\t\ttexture.format = _SRGBAFormat;\n\n\t\t\t\t\t\t// it's not possible to generate mips in WebGL 1 with this extension\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// slow fallback (CPU decode)\n\n\t\t\t\t\t\timage = ImageUtils.sRGBToLinear( image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.WebGLTextures: Unsupported texture encoding:', encoding );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n}\n\nfunction WebGLUtils( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction convert( p, encoding = null ) {\n\n\t\tlet extension;\n\n\t\tif ( p === UnsignedByteType ) return 5121;\n\t\tif ( p === UnsignedShort4444Type ) return 32819;\n\t\tif ( p === UnsignedShort5551Type ) return 32820;\n\n\t\tif ( p === ByteType ) return 5120;\n\t\tif ( p === ShortType ) return 5122;\n\t\tif ( p === UnsignedShortType ) return 5123;\n\t\tif ( p === IntType ) return 5124;\n\t\tif ( p === UnsignedIntType ) return 5125;\n\t\tif ( p === FloatType ) return 5126;\n\n\t\tif ( p === HalfFloatType ) {\n\n\t\t\tif ( isWebGL2 ) return 5131;\n\n\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.HALF_FLOAT_OES;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === AlphaFormat ) return 6406;\n\t\tif ( p === RGBAFormat ) return 6408;\n\t\tif ( p === LuminanceFormat ) return 6409;\n\t\tif ( p === LuminanceAlphaFormat ) return 6410;\n\t\tif ( p === DepthFormat ) return 6402;\n\t\tif ( p === DepthStencilFormat ) return 34041;\n\t\tif ( p === RedFormat ) return 6403;\n\n\t\tif ( p === RGBFormat ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: THREE.RGBFormat has been removed. Use THREE.RGBAFormat instead. https://github.com/mrdoob/three.js/pull/23228' );\n\t\t\treturn 6408;\n\n\t\t}\n\n\t\t// WebGL 1 sRGB fallback\n\n\t\tif ( p === _SRGBAFormat ) {\n\n\t\t\textension = extensions.get( 'EXT_sRGB' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.SRGB_ALPHA_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedIntegerFormat ) return 36244;\n\t\tif ( p === RGFormat ) return 33319;\n\t\tif ( p === RGIntegerFormat ) return 33320;\n\t\tif ( p === RGBAIntegerFormat ) return 36249;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( encoding === sRGBEncoding ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC1\n\n\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC2\n\n\t\tif ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC2_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\tif ( isWebGL2 ) return 34042;\n\n\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nclass ArrayCamera extends PerspectiveCamera {\n\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\nArrayCamera.prototype.isArrayCamera = true;\n\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nGroup.prototype.isGroup = true;\n\nconst _moveEvent = { type: 'move' };\n\nclass WebXRController {\n\n\tconstructor() {\n\n\t\tthis._targetRay = null;\n\t\tthis._grip = null;\n\t\tthis._hand = null;\n\n\t}\n\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\t\tconst joint = new Group();\n\t\t\t\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\t\t\t\tjoint.visible = false;\n\t\t\t\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\t\t\t\t\t\t// ??\n\t\t\t\t\t\thand.add( joint );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst joint = hand.joints[ inputjoint.jointName ];\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass DepthTexture extends Texture {\n\n\tconstructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps\t= false;\n\n\t}\n\n\n}\n\nDepthTexture.prototype.isDepthTexture = true;\n\nclass WebXRManager extends EventDispatcher {\n\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\t\tconst attributes = gl.getContextAttributes();\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst inputSourcesMap = new Map();\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.layers.enable( 1 );\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.layers.enable( 2 );\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraVR = new ArrayCamera();\n\t\tcameraVR.layers.enable( 1 );\n\t\tcameraVR.layers.enable( 2 );\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\tthis.cameraAutoUpdate = true;\n\t\tthis.enabled = false;\n\n\t\tthis.isPresenting = false;\n\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controller = inputSourcesMap.get( event.inputSource );\n\n\t\t\tif ( controller ) {\n\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tinputSourcesMap.forEach( function ( controller, inputSource ) {\n\n\t\t\t\tcontroller.disconnect( inputSource );\n\n\t\t\t} );\n\n\t\t\tinputSourcesMap.clear();\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\tthis.getBinding = function () {\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tif ( ( session.renderState.layers === undefined ) || ( renderer.capabilities.isWebGL2 === false ) ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: ( session.renderState.layers === undefined ) ? attributes.antialias : true,\n\t\t\t\t\t\talpha: attributes.alpha,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tencoding: renderer.outputEncoding\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? 35056 : 33190;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedShortType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: ( renderer.outputEncoding === sRGBEncoding ) ? 35907 : 32856,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tencoding: renderer.outputEncoding,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0\n\t\t\t\t\t\t} );\n\n\t\t\t\t\tconst renderTargetProperties = renderer.properties.get( newRenderTarget );\n\t\t\t\t\trenderTargetProperties.__ignoreDepthValues = glProjLayer.ignoreDepthValues;\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\t// Set foveation to maximum.\n\t\t\t\tthis.setFoveation( 1.0 );\n\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\tconst inputSources = session.inputSources;\n\n\t\t\t// Assign controllers to available inputSources\n\n\t\t\tfor ( let i = 0; i < inputSources.length; i ++ ) {\n\n\t\t\t\tconst index = inputSources[ i ].handedness === 'right' ? 1 : 0;\n\t\t\t\tinputSourcesMap.set( inputSources[ i ], controllers[ index ] );\n\n\t\t\t}\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\t\t\t\t\tinputSourcesMap.delete( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\t\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t// although must now be relative to the new union camera.\n\t\t\tconst near2 = near + zOffset;\n\t\t\tconst far2 = far + zOffset;\n\t\t\tconst left2 = left - xOffset;\n\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tcameraVR.near = cameraR.near = cameraL.near = camera.near;\n\t\t\tcameraVR.far = cameraR.far = cameraL.far = camera.far;\n\n\t\t\tif ( _currentDepthNear !== cameraVR.near || _currentDepthFar !== cameraVR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraVR.near,\n\t\t\t\t\tdepthFar: cameraVR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraVR.near;\n\t\t\t\t_currentDepthFar = cameraVR.far;\n\n\t\t\t}\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraVR.cameras;\n\n\t\t\tupdateCamera( cameraVR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\tcameraVR.matrixWorld.decompose( cameraVR.position, cameraVR.quaternion, cameraVR.scale );\n\n\t\t\t// update user camera and its children\n\n\t\t\tcamera.position.copy( cameraVR.position );\n\t\t\tcamera.quaternion.copy( cameraVR.quaternion );\n\t\t\tcamera.scale.copy( cameraVR.scale );\n\t\t\tcamera.matrix.copy( cameraVR.matrix );\n\t\t\tcamera.matrixWorld.copy( cameraVR.matrixWorld );\n\n\t\t\tconst children = camera.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( true );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraVR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraVR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraVR;\n\n\t\t};\n\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\treturn glProjLayer.fixedFoveation;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\treturn glBaseLayer.fixedFoveation;\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t};\n\n\t\tthis.setFoveation = function ( foveation ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = foveation;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = foveation;\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraVRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraVR's camera list\n\n\t\t\t\tif ( views.length !== cameraVR.cameras.length ) {\n\n\t\t\t\t\tcameraVR.cameras.length = 0;\n\t\t\t\t\tcameraVRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst camera = cameras[ i ];\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraVR.matrix.copy( camera.matrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraVRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraVR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst inputSources = session.inputSources;\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = inputSources[ i ];\n\t\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tuniforms.fogColor.value.copy( fog.color );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\n\t\t\t// artist-friendly light intensity scaling factor\n\t\t\tconst scaleFactor = ( renderer.physicallyCorrectLights !== true ) ? Math.PI : 1;\n\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity * scaleFactor;\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. specular map\n\t\t// 3. displacementMap map\n\t\t// 4. normal map\n\t\t// 5. bump map\n\t\t// 6. roughnessMap map\n\t\t// 7. metalnessMap map\n\t\t// 8. alphaMap map\n\t\t// 9. emissiveMap map\n\t\t// 10. clearcoat map\n\t\t// 11. clearcoat normal map\n\t\t// 12. clearcoat roughnessMap map\n\t\t// 13. specular intensity map\n\t\t// 14. specular tint map\n\t\t// 15. transmission map\n\t\t// 16. thickness map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.specularMap ) {\n\n\t\t\tuvScaleMap = material.specularMap;\n\n\t\t} else if ( material.displacementMap ) {\n\n\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t} else if ( material.normalMap ) {\n\n\t\t\tuvScaleMap = material.normalMap;\n\n\t\t} else if ( material.bumpMap ) {\n\n\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t} else if ( material.roughnessMap ) {\n\n\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t} else if ( material.metalnessMap ) {\n\n\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t} else if ( material.emissiveMap ) {\n\n\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t} else if ( material.clearcoatMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatMap;\n\n\t\t} else if ( material.clearcoatNormalMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatNormalMap;\n\n\t\t} else if ( material.clearcoatRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatRoughnessMap;\n\n\t\t} else if ( material.specularIntensityMap ) {\n\n\t\t\tuvScaleMap = material.specularIntensityMap;\n\n\t\t} else if ( material.specularColorMap ) {\n\n\t\t\tuvScaleMap = material.specularColorMap;\n\n\t\t} else if ( material.transmissionMap ) {\n\n\t\t\tuvScaleMap = material.transmissionMap;\n\n\t\t} else if ( material.thicknessMap ) {\n\n\t\t\tuvScaleMap = material.thicknessMap;\n\n\t\t} else if ( material.sheenColorMap ) {\n\n\t\t\tuvScaleMap = material.sheenColorMap;\n\n\t\t} else if ( material.sheenRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.sheenRoughnessMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities for uv2\n\t\t// 1. ao map\n\t\t// 2. light map\n\n\t\tlet uv2ScaleMap;\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuv2ScaleMap = material.aoMap;\n\n\t\t} else if ( material.lightMap ) {\n\n\t\t\tuv2ScaleMap = material.lightMap;\n\n\t\t}\n\n\t\tif ( uv2ScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uv2ScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuv2ScaleMap = uv2ScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uv2ScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuv2ScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uv2Transform.value.copy( uv2ScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.roughness.value = material.roughness;\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t}\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t}\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tuniforms.referencePosition.value.copy( material.referencePosition );\n\t\tuniforms.nearDistance.value = material.nearDistance;\n\t\tuniforms.farDistance.value = material.farDistance;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nfunction WebGLRenderer( parameters = {} ) {\n\n\tconst _canvas = parameters.canvas !== undefined ? parameters.canvas : createCanvasElement(),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,\n\t\t_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default',\n\t\t_failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false;\n\n\tlet _alpha;\n\n\tif ( _context !== null ) {\n\n\t\t_alpha = _context.getContextAttributes().alpha;\n\n\t} else {\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false;\n\n\t}\n\n\tlet currentRenderList = null;\n\tlet currentRenderState = null;\n\n\t// render() can be called from within a callback triggered by another render.\n\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\tconst renderListStack = [];\n\tconst renderStateStack = [];\n\n\t// public properties\n\n\tthis.domElement = _canvas;\n\n\t// Debug configuration container\n\tthis.debug = {\n\n\t\t/**\n\t\t * Enables error checking and reporting when shader programs are being compiled\n\t\t * @type {boolean}\n\t\t */\n\t\tcheckShaderErrors: true\n\t};\n\n\t// clearing\n\n\tthis.autoClear = true;\n\tthis.autoClearColor = true;\n\tthis.autoClearDepth = true;\n\tthis.autoClearStencil = true;\n\n\t// scene graph\n\n\tthis.sortObjects = true;\n\n\t// user-defined clipping\n\n\tthis.clippingPlanes = [];\n\tthis.localClippingEnabled = false;\n\n\t// physically based shading\n\n\tthis.outputEncoding = LinearEncoding;\n\n\t// physical lights\n\n\tthis.physicallyCorrectLights = false;\n\n\t// tone mapping\n\n\tthis.toneMapping = NoToneMapping;\n\tthis.toneMappingExposure = 1.0;\n\n\t// internal properties\n\n\tconst _this = this;\n\n\tlet _isContextLost = false;\n\n\t// internal state cache\n\n\tlet _currentActiveCubeFace = 0;\n\tlet _currentActiveMipmapLevel = 0;\n\tlet _currentRenderTarget = null;\n\tlet _currentMaterialId = - 1;\n\n\tlet _currentCamera = null;\n\n\tconst _currentViewport = new Vector4();\n\tconst _currentScissor = new Vector4();\n\tlet _currentScissorTest = null;\n\n\t//\n\n\tlet _width = _canvas.width;\n\tlet _height = _canvas.height;\n\n\tlet _pixelRatio = 1;\n\tlet _opaqueSort = null;\n\tlet _transparentSort = null;\n\n\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\tlet _scissorTest = false;\n\n\t// frustum\n\n\tconst _frustum = new Frustum();\n\n\t// clipping\n\n\tlet _clippingEnabled = false;\n\tlet _localClippingEnabled = false;\n\n\t// transmission\n\n\tlet _transmissionRenderTarget = null;\n\n\t// camera matrices cache\n\n\tconst _projScreenMatrix = new Matrix4();\n\n\tconst _vector2 = new Vector2();\n\tconst _vector3 = new Vector3();\n\n\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\tfunction getTargetPixelRatio() {\n\n\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t}\n\n\t// initialize\n\n\tlet _gl = _context;\n\n\tfunction getContext( contextNames, contextAttributes ) {\n\n\t\tfor ( let i = 0; i < contextNames.length; i ++ ) {\n\n\t\t\tconst contextName = contextNames[ i ];\n\t\t\tconst context = _canvas.getContext( contextName, contextAttributes );\n\t\t\tif ( context !== null ) return context;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\ttry {\n\n\t\tconst contextAttributes = {\n\t\t\talpha: true,\n\t\t\tdepth: _depth,\n\t\t\tstencil: _stencil,\n\t\t\tantialias: _antialias,\n\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer,\n\t\t\tpowerPreference: _powerPreference,\n\t\t\tfailIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat\n\t\t};\n\n\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\tif ( 'setAttribute' in _canvas ) _canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\tif ( _gl === null ) {\n\n\t\t\tconst contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];\n\n\t\t\tif ( _this.isWebGL1Renderer === true ) {\n\n\t\t\t\tcontextNames.shift();\n\n\t\t\t}\n\n\t\t\t_gl = getContext( contextNames, contextAttributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( getContext( contextNames ) ) {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t};\n\n\t\t}\n\n\t} catch ( error ) {\n\n\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\t\tthrow error;\n\n\t}\n\n\tlet extensions, capabilities, state, info;\n\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\tlet utils, bindingStates;\n\n\tfunction initGLContext() {\n\n\t\textensions = new WebGLExtensions( _gl );\n\n\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\textensions.init( capabilities );\n\n\t\tutils = new WebGLUtils( _gl, extensions, capabilities );\n\n\t\tstate = new WebGLState( _gl, extensions, capabilities );\n\n\t\tinfo = new WebGLInfo( _gl );\n\t\tproperties = new WebGLProperties();\n\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\tattributes = new WebGLAttributes( _gl, capabilities );\n\t\tbindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities );\n\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\tclipping = new WebGLClipping( properties );\n\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\trenderLists = new WebGLRenderLists();\n\t\trenderStates = new WebGLRenderStates( extensions, capabilities );\n\t\tbackground = new WebGLBackground( _this, cubemaps, state, objects, _alpha, _premultipliedAlpha );\n\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\n\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );\n\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );\n\n\t\tinfo.programs = programCache.programs;\n\n\t\t_this.capabilities = capabilities;\n\t\t_this.extensions = extensions;\n\t\t_this.properties = properties;\n\t\t_this.renderLists = renderLists;\n\t\t_this.shadowMap = shadowMap;\n\t\t_this.state = state;\n\t\t_this.info = info;\n\n\t}\n\n\tinitGLContext();\n\n\t// xr\n\n\tconst xr = new WebXRManager( _this, _gl );\n\n\tthis.xr = xr;\n\n\t// API\n\n\tthis.getContext = function () {\n\n\t\treturn _gl;\n\n\t};\n\n\tthis.getContextAttributes = function () {\n\n\t\treturn _gl.getContextAttributes();\n\n\t};\n\n\tthis.forceContextLoss = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.loseContext();\n\n\t};\n\n\tthis.forceContextRestore = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.restoreContext();\n\n\t};\n\n\tthis.getPixelRatio = function () {\n\n\t\treturn _pixelRatio;\n\n\t};\n\n\tthis.setPixelRatio = function ( value ) {\n\n\t\tif ( value === undefined ) return;\n\n\t\t_pixelRatio = value;\n\n\t\tthis.setSize( _width, _height, false );\n\n\t};\n\n\tthis.getSize = function ( target ) {\n\n\t\treturn target.set( _width, _height );\n\n\t};\n\n\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\tif ( xr.isPresenting ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_canvas.width = Math.floor( width * _pixelRatio );\n\t\t_canvas.height = Math.floor( height * _pixelRatio );\n\n\t\tif ( updateStyle !== false ) {\n\n\t\t\t_canvas.style.width = width + 'px';\n\t\t\t_canvas.style.height = height + 'px';\n\n\t\t}\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t};\n\n\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_pixelRatio = pixelRatio;\n\n\t\t_canvas.width = Math.floor( width * pixelRatio );\n\t\t_canvas.height = Math.floor( height * pixelRatio );\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getCurrentViewport = function ( target ) {\n\n\t\treturn target.copy( _currentViewport );\n\n\t};\n\n\tthis.getViewport = function ( target ) {\n\n\t\treturn target.copy( _viewport );\n\n\t};\n\n\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_viewport.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissor = function ( target ) {\n\n\t\treturn target.copy( _scissor );\n\n\t};\n\n\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_scissor.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissorTest = function () {\n\n\t\treturn _scissorTest;\n\n\t};\n\n\tthis.setScissorTest = function ( boolean ) {\n\n\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t};\n\n\tthis.setOpaqueSort = function ( method ) {\n\n\t\t_opaqueSort = method;\n\n\t};\n\n\tthis.setTransparentSort = function ( method ) {\n\n\t\t_transparentSort = method;\n\n\t};\n\n\t// Clearing\n\n\tthis.getClearColor = function ( target ) {\n\n\t\treturn target.copy( background.getClearColor() );\n\n\t};\n\n\tthis.setClearColor = function () {\n\n\t\tbackground.setClearColor.apply( background, arguments );\n\n\t};\n\n\tthis.getClearAlpha = function () {\n\n\t\treturn background.getClearAlpha();\n\n\t};\n\n\tthis.setClearAlpha = function () {\n\n\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t};\n\n\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\tlet bits = 0;\n\n\t\tif ( color ) bits |= 16384;\n\t\tif ( depth ) bits |= 256;\n\t\tif ( stencil ) bits |= 1024;\n\n\t\t_gl.clear( bits );\n\n\t};\n\n\tthis.clearColor = function () {\n\n\t\tthis.clear( true, false, false );\n\n\t};\n\n\tthis.clearDepth = function () {\n\n\t\tthis.clear( false, true, false );\n\n\t};\n\n\tthis.clearStencil = function () {\n\n\t\tthis.clear( false, false, true );\n\n\t};\n\n\t//\n\n\tthis.dispose = function () {\n\n\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\trenderLists.dispose();\n\t\trenderStates.dispose();\n\t\tproperties.dispose();\n\t\tcubemaps.dispose();\n\t\tcubeuvmaps.dispose();\n\t\tobjects.dispose();\n\t\tbindingStates.dispose();\n\t\tprogramCache.dispose();\n\n\t\txr.dispose();\n\n\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\tif ( _transmissionRenderTarget ) {\n\n\t\t\t_transmissionRenderTarget.dispose();\n\t\t\t_transmissionRenderTarget = null;\n\n\t\t}\n\n\t\tanimation.stop();\n\n\t};\n\n\t// Events\n\n\tfunction onContextLost( event ) {\n\n\t\tevent.preventDefault();\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t_isContextLost = true;\n\n\t}\n\n\tfunction onContextRestore( /* event */ ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t_isContextLost = false;\n\n\t\tconst infoAutoReset = info.autoReset;\n\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\tconst shadowMapType = shadowMap.type;\n\n\t\tinitGLContext();\n\n\t\tinfo.autoReset = infoAutoReset;\n\t\tshadowMap.enabled = shadowMapEnabled;\n\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\tshadowMap.type = shadowMapType;\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\tdeallocateMaterial( material );\n\n\t}\n\n\t// Buffer deallocation\n\n\tfunction deallocateMaterial( material ) {\n\n\t\treleaseMaterialProgramReferences( material );\n\n\t\tproperties.remove( material );\n\n\t}\n\n\n\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\tconst programs = properties.get( material ).programs;\n\n\t\tif ( programs !== undefined ) {\n\n\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t} );\n\n\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Buffer rendering\n\n\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t//\n\n\t\tlet index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\n\t\t//\n\n\t\tif ( index === null ) {\n\n\t\t\tif ( position === undefined || position.count === 0 ) return;\n\n\t\t} else if ( index.count === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t//\n\n\t\tlet rangeFactor = 1;\n\n\t\tif ( material.wireframe === true ) {\n\n\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\t\t\trangeFactor = 2;\n\n\t\t}\n\n\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\tlet attribute;\n\t\tlet renderer = bufferRenderer;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattribute = attributes.get( index );\n\n\t\t\trenderer = indexedBufferRenderer;\n\t\t\trenderer.setIndex( attribute );\n\n\t\t}\n\n\t\t//\n\n\t\tconst dataCount = ( index !== null ) ? index.count : position.count;\n\n\t\tconst rangeStart = geometry.drawRange.start * rangeFactor;\n\t\tconst rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\tconst groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\tconst groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\tconst drawStart = Math.max( rangeStart, groupStart );\n\t\tconst drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\tconst drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\t//\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\trenderer.setMode( 1 );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( 4 );\n\n\t\t\t}\n\n\t\t} else if ( object.isLine ) {\n\n\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\trenderer.setMode( 1 );\n\n\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\trenderer.setMode( 2 );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( 3 );\n\n\t\t\t}\n\n\t\t} else if ( object.isPoints ) {\n\n\t\t\trenderer.setMode( 0 );\n\n\t\t} else if ( object.isSprite ) {\n\n\t\t\trenderer.setMode( 4 );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\tconst instanceCount = Math.min( geometry.instanceCount, geometry._maxInstanceCount );\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t} else {\n\n\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t}\n\n\t};\n\n\t// Compile\n\n\tthis.compile = function ( scene, camera ) {\n\n\t\tcurrentRenderState = renderStates.get( scene );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcurrentRenderState.setupLights( _this.physicallyCorrectLights );\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tconst material = object.material;\n\n\t\t\tif ( material ) {\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\tgetProgram( material2, scene, object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\trenderStateStack.pop();\n\t\tcurrentRenderState = null;\n\n\t};\n\n\t// Animation Loop\n\n\tlet onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame( time ) {\n\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t}\n\n\tfunction onXRSessionStart() {\n\n\t\tanimation.stop();\n\n\t}\n\n\tfunction onXRSessionEnd() {\n\n\t\tanimation.start();\n\n\t}\n\n\tconst animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\n\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\t\txr.setAnimationLoop( callback );\n\n\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t};\n\n\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t// Rendering\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( _isContextLost === true ) return;\n\n\t\t// update scene graph\n\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t// update camera matrices and frustum\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t}\n\n\t\t//\n\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\tcurrentRenderList.init();\n\n\t\trenderListStack.push( currentRenderList );\n\n\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\tcurrentRenderList.finish();\n\n\t\tif ( _this.sortObjects === true ) {\n\n\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t//\n\n\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t//\n\n\t\tbackground.render( currentRenderList, scene );\n\n\t\t// render scene\n\n\t\tcurrentRenderState.setupLights( _this.physicallyCorrectLights );\n\n\t\tif ( camera.isArrayCamera ) {\n\n\t\t\tconst cameras = camera.cameras;\n\n\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t// _gl.finish();\n\n\t\tbindingStates.resetDefaultState();\n\t\t_currentMaterialId = - 1;\n\t\t_currentCamera = null;\n\n\t\trenderStateStack.pop();\n\n\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderState = null;\n\n\t\t}\n\n\t\trenderListStack.pop();\n\n\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderList = null;\n\n\t\t}\n\n\t};\n\n\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible ) {\n\n\t\t\tif ( object.isGroup ) {\n\n\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t// update skeleton only once in a frame\n\n\t\t\t\t\tif ( object.skeleton.frame !== info.render.frame ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\t\t\t\t\t\tobject.skeleton.frame = info.render.frame;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t}\n\n\t}\n\n\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\t\tconst transparentObjects = currentRenderList.transparent;\n\n\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, scene, camera );\n\n\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\tstate.buffers.depth.setTest( true );\n\t\tstate.buffers.depth.setMask( true );\n\t\tstate.buffers.color.setMask( true );\n\n\t\tstate.setPolygonOffset( false );\n\n\t}\n\n\tfunction renderTransmissionPass( opaqueObjects, scene, camera ) {\n\n\t\tconst isWebGL2 = capabilities.isWebGL2;\n\n\t\tif ( _transmissionRenderTarget === null ) {\n\n\t\t\t_transmissionRenderTarget = new WebGLRenderTarget( 1, 1, {\n\t\t\t\tgenerateMipmaps: true,\n\t\t\t\ttype: extensions.has( 'EXT_color_buffer_half_float' ) ? HalfFloatType : UnsignedByteType,\n\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\tsamples: ( isWebGL2 && _antialias === true ) ? 4 : 0\n\t\t\t} );\n\n\t\t}\n\n\t\t_this.getDrawingBufferSize( _vector2 );\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\t_transmissionRenderTarget.setSize( _vector2.x, _vector2.y );\n\n\t\t} else {\n\n\t\t\t_transmissionRenderTarget.setSize( floorPowerOfTwo( _vector2.x ), floorPowerOfTwo( _vector2.y ) );\n\n\t\t}\n\n\t\t//\n\n\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t_this.setRenderTarget( _transmissionRenderTarget );\n\t\t_this.clear();\n\n\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\tconst currentToneMapping = _this.toneMapping;\n\t\t_this.toneMapping = NoToneMapping;\n\n\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t_this.toneMapping = currentToneMapping;\n\n\t\ttextures.updateMultisampleRenderTarget( _transmissionRenderTarget );\n\t\ttextures.updateRenderTargetMipmap( _transmissionRenderTarget );\n\n\t\t_this.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\tconst object = renderItem.object;\n\t\t\tconst geometry = renderItem.geometry;\n\t\t\tconst material = overrideMaterial === null ? renderItem.material : overrideMaterial;\n\t\t\tconst group = renderItem.group;\n\n\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\tif ( material.transparent === true && material.side === DoubleSide ) {\n\n\t\t\tmaterial.side = BackSide;\n\t\t\tmaterial.needsUpdate = true;\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\tmaterial.side = FrontSide;\n\t\t\tmaterial.needsUpdate = true;\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\tmaterial.side = DoubleSide;\n\n\t\t} else {\n\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t}\n\n\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t}\n\n\tfunction getProgram( material, scene, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst lights = currentRenderState.state.lights;\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tconst lightsStateVersion = lights.state.version;\n\n\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\tlet programs = materialProperties.programs;\n\n\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tmaterialProperties.fog = scene.fog;\n\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\n\t\tif ( programs === undefined ) {\n\n\t\t\t// new material\n\n\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tprograms = new Map();\n\t\t\tmaterialProperties.programs = programs;\n\n\t\t}\n\n\t\tlet program = programs.get( programCacheKey );\n\n\t\tif ( program !== undefined ) {\n\n\t\t\t// early out if program and light state is identical\n\n\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\treturn program;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\tmaterial.onBuild( object, parameters, _this );\n\n\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t}\n\n\t\tconst uniforms = materialProperties.uniforms;\n\n\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t}\n\n\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t// store the light setup it was created for\n\n\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\tuniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;\n\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t}\n\n\t\tconst progUniforms = program.getUniforms();\n\t\tconst uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\tmaterialProperties.currentProgram = program;\n\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\treturn program;\n\n\t}\n\n\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tmaterialProperties.outputEncoding = parameters.outputEncoding;\n\t\tmaterialProperties.instancing = parameters.instancing;\n\t\tmaterialProperties.skinning = parameters.skinning;\n\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t}\n\n\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\ttextures.resetTextureUnits();\n\n\t\tconst fog = scene.fog;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tconst encoding = ( _currentRenderTarget === null ) ? _this.outputEncoding : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.encoding : LinearEncoding );\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\tconst vertexTangents = !! material.normalMap && !! geometry.attributes.tangent;\n\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\tconst morphColors = !! geometry.morphAttributes.color;\n\t\tconst toneMapping = material.toneMapped ? _this.toneMapping : NoToneMapping;\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tconst materialProperties = properties.get( material );\n\t\tconst lights = currentRenderState.state.lights;\n\n\t\tif ( _clippingEnabled === true ) {\n\n\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\tconst useCache =\n\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t// (#8465, #8379)\n\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet needsProgramChange = false;\n\n\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.outputEncoding !== encoding ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( capabilities.isWebGL2 === true && materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tneedsProgramChange = true;\n\t\t\tmaterialProperties.__version = material.version;\n\n\t\t}\n\n\t\t//\n\n\t\tlet program = materialProperties.currentProgram;\n\n\t\tif ( needsProgramChange === true ) {\n\n\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t}\n\n\t\tlet refreshProgram = false;\n\t\tlet refreshMaterial = false;\n\t\tlet refreshLights = false;\n\n\t\tconst p_uniforms = program.getUniforms(),\n\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\trefreshProgram = true;\n\t\t\trefreshMaterial = true;\n\t\t\trefreshLights = true;\n\n\t\t}\n\n\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t_currentMaterialId = material.id;\n\n\t\t\trefreshMaterial = true;\n\n\t\t}\n\n\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t}\n\n\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t}\n\n\t\t\t// load material specific uniforms\n\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\tmaterial.isShadowMaterial ||\n\t\t\t\tobject.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( skeleton ) {\n\n\t\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: SkinnedMesh can only be used with WebGL 2. With WebGL 1 OES_texture_float and vertex textures support is required.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined && capabilities.isWebGL2 === true ) ) {\n\n\t\t\tmorphtargets.update( object, geometry, material, program );\n\n\t\t}\n\n\n\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t}\n\n\t\tif ( refreshMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t// values\n\t\t\t\t//\n\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t// the GL state when required\n\n\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t}\n\n\t\t\t// refresh uniforms common to several materials\n\n\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t}\n\n\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget );\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\n\t\t}\n\n\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t}\n\n\t\t// common matrices\n\n\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\treturn program;\n\n\t}\n\n\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\tuniforms.directionalLights.needsUpdate = value;\n\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\tuniforms.pointLights.needsUpdate = value;\n\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\tuniforms.spotLights.needsUpdate = value;\n\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t}\n\n\tfunction materialNeedsLights( material ) {\n\n\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t}\n\n\tthis.getActiveCubeFace = function () {\n\n\t\treturn _currentActiveCubeFace;\n\n\t};\n\n\tthis.getActiveMipmapLevel = function () {\n\n\t\treturn _currentActiveMipmapLevel;\n\n\t};\n\n\tthis.getRenderTarget = function () {\n\n\t\treturn _currentRenderTarget;\n\n\t};\n\n\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = depthTexture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\tif ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;\n\n\t\t\tif ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );\n\t\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t};\n\n\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t_currentRenderTarget = renderTarget;\n\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\tlet useDefaultFramebuffer = true;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\tstate.bindFramebuffer( 36160, null );\n\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet framebuffer = null;\n\t\tlet isCube = false;\n\t\tlet isRenderTarget3D = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst texture = renderTarget.texture;\n\n\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture ) {\n\n\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t}\n\n\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\t\t\t\tisCube = true;\n\n\t\t\t} else if ( ( capabilities.isWebGL2 && renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t}\n\n\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t} else {\n\n\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t}\n\n\t\tconst framebufferBound = state.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( framebufferBound && capabilities.drawBuffers && useDefaultFramebuffer ) {\n\n\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport );\n\t\tstate.scissor( _currentScissor );\n\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\tif ( isCube ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t_gl.framebufferTexture2D( 36160, 36064, 34069 + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\tconst layer = activeCubeFace || 0;\n\t\t\t_gl.framebufferTextureLayer( 36160, 36064, textureProperties.__webglTexture, activeMipmapLevel || 0, layer );\n\n\t\t}\n\n\t\t_currentMaterialId = - 1; // reset current material to ensure correct uniform bindings\n\n\t};\n\n\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t}\n\n\t\tif ( framebuffer ) {\n\n\t\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\t\ttry {\n\n\t\t\t\tconst texture = renderTarget.texture;\n\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( 35739 ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || ( capabilities.isWebGL2 && extensions.has( 'EXT_color_buffer_float' ) ) );\n\n\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( 35738 ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.has( 'OES_texture_float' ) || extensions.has( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t! halfFloatSupportedByExt ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t}\n\n\t\t\t} finally {\n\n\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.copyFramebufferToTexture = function ( position, texture, level = 0 ) {\n\n\t\tif ( texture.isFramebufferTexture !== true ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: copyFramebufferToTexture() can only be used with FramebufferTexture.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst levelScale = Math.pow( 2, - level );\n\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t_gl.copyTexSubImage2D( 3553, level, 0, 0, position.x, position.y, width, height );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tconst width = srcTexture.image.width;\n\t\tconst height = srcTexture.image.height;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\n\t\ttextures.setTexture2D( dstTexture, 0 );\n\n\t\t// As another texture upload may have changed pixelStorei\n\t\t// parameters, make sure they are correct for the dstTexture\n\t\t_gl.pixelStorei( 37440, dstTexture.flipY );\n\t\t_gl.pixelStorei( 37441, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( 3317, dstTexture.unpackAlignment );\n\n\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t_gl.texSubImage2D( 3553, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t_gl.compressedTexSubImage2D( 3553, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage2D( 3553, level, position.x, position.y, glFormat, glType, srcTexture.image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( 3553 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tif ( _this.isWebGL1Renderer ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst width = sourceBox.max.x - sourceBox.min.x + 1;\n\t\tconst height = sourceBox.max.y - sourceBox.min.y + 1;\n\t\tconst depth = sourceBox.max.z - sourceBox.min.z + 1;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\t\tlet glTarget;\n\n\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\tglTarget = 32879;\n\n\t\t} else if ( dstTexture.isDataArrayTexture ) {\n\n\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\tglTarget = 35866;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_gl.pixelStorei( 37440, dstTexture.flipY );\n\t\t_gl.pixelStorei( 37441, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( 3317, dstTexture.unpackAlignment );\n\n\t\tconst unpackRowLen = _gl.getParameter( 3314 );\n\t\tconst unpackImageHeight = _gl.getParameter( 32878 );\n\t\tconst unpackSkipPixels = _gl.getParameter( 3316 );\n\t\tconst unpackSkipRows = _gl.getParameter( 3315 );\n\t\tconst unpackSkipImages = _gl.getParameter( 32877 );\n\n\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ 0 ] : srcTexture.image;\n\n\t\t_gl.pixelStorei( 3314, image.width );\n\t\t_gl.pixelStorei( 32878, image.height );\n\t\t_gl.pixelStorei( 3316, sourceBox.min.x );\n\t\t_gl.pixelStorei( 3315, sourceBox.min.y );\n\t\t_gl.pixelStorei( 32877, sourceBox.min.z );\n\n\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.' );\n\t\t\t\t_gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.pixelStorei( 3314, unpackRowLen );\n\t\t_gl.pixelStorei( 32878, unpackImageHeight );\n\t\t_gl.pixelStorei( 3316, unpackSkipPixels );\n\t\t_gl.pixelStorei( 3315, unpackSkipRows );\n\t\t_gl.pixelStorei( 32877, unpackSkipImages );\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.initTexture = function ( texture ) {\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.resetState = function () {\n\n\t\t_currentActiveCubeFace = 0;\n\t\t_currentActiveMipmapLevel = 0;\n\t\t_currentRenderTarget = null;\n\n\t\tstate.reset();\n\t\tbindingStates.reset();\n\n\t};\n\n\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t}\n\n}\n\nWebGLRenderer.prototype.isWebGLRenderer = true;\n\nclass WebGL1Renderer extends WebGLRenderer {}\n\nWebGL1Renderer.prototype.isWebGL1Renderer = true;\n\nclass FogExp2 {\n\n\tconstructor( color, density = 0.00025 ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = density;\n\n\t}\n\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\nFogExp2.prototype.isFogExp2 = true;\n\nclass Fog {\n\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\nFog.prototype.isFog = true;\n\nclass Scene extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.environment = null;\n\t\tthis.fog = null;\n\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t}\n\n}\n\nScene.prototype.isScene = true;\n\nclass InterleavedBuffer {\n\n\tconstructor( array, stride ) {\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= attribute.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.prototype.slice.call( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nInterleavedBuffer.prototype.isInterleavedBuffer = true;\n\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\nclass InterleavedBufferAttribute {\n\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\tthis.name = '';\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t}\n\n\tgetY( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t}\n\n\tgetZ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t}\n\n\tgetW( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// deinterleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interlaved attribtue\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\nInterleavedBufferAttribute.prototype.isInterleavedBufferAttribute = true;\n\nclass SpriteMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nSpriteMaterial.prototype.isSpriteMaterial = true;\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\nclass Sprite extends Object3D {\n\n\tconstructor( material ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0, 0,\n\t\t\t\t0.5, - 0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\tthis.geometry = _geometry;\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\tconsole.error( 'THREE.Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( - 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( - 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getUV( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nSprite.prototype.isSprite = true;\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\nclass LOD extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t},\n\t\t\tisLOD: {\n\t\t\t\tvalue: true,\n\t\t\t}\n\t\t} );\n\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\taddLevel( object, distance = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\nclass SkinnedMesh extends Mesh {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = 'attached';\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\treturn this;\n\n\t}\n\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === 'attached' ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === 'detached' ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\tboneTransform( index, target ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( target ).applyMatrix4( this.bindMatrix );\n\n\t\ttarget.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\ttarget.addScaledVector( _vector$5.copy( _basePosition ).applyMatrix4( _matrix ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\nSkinnedMesh.prototype.isSkinnedMesh = true;\n\nclass Bone extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\nBone.prototype.isBone = true;\n\nclass DataTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, encoding ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nDataTexture.prototype.isDataTexture = true;\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\n\nclass Skeleton {\n\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.bones = bones.slice( 0 );\n\t\tthis.boneInverses = boneInverses;\n\t\tthis.boneMatrices = null;\n\n\t\tthis.boneTexture = null;\n\t\tthis.boneTextureSize = 0;\n\n\t\tthis.frame = - 1;\n\n\t\tthis.init();\n\n\t}\n\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = ceilPowerOfTwo( size );\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\t\tthis.boneTextureSize = size;\n\n\t\treturn this;\n\n\t}\n\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tif ( typeof normalized === 'number' ) {\n\n\t\t\tmeshPerAttribute = normalized;\n\n\t\t\tnormalized = false;\n\n\t\t\tconsole.error( 'THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.' );\n\n\t\t}\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _mesh = /*@__PURE__*/ new Mesh();\n\nclass InstancedMesh extends Mesh {\n\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\t\tthis.instanceColor = null;\n\n\t\tthis.count = count;\n\n\t\tthis.frustumCulled = false;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\treturn this;\n\n\t}\n\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh.geometry = this.geometry;\n\t\t_mesh.material = this.material;\n\n\t\tif ( _mesh.material === undefined ) return;\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nInstancedMesh.prototype.isInstancedMesh = true;\n\nclass LineBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\nconst _start$1 = /*@__PURE__*/ new Vector3();\nconst _end$1 = /*@__PURE__*/ new Vector3();\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nclass Line extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t// we assume non-indexed geometry\n\n\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t_start$1.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t\t_end$1.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\t\tlineDistances[ i ] += _start$1.distanceTo( _end$1 );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.Line.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst vStart = new Vector3();\n\t\tconst vEnd = new Vector3();\n\t\tconst interSegment = new Vector3();\n\t\tconst interRay = new Vector3();\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst attributes = geometry.attributes;\n\t\t\tconst positionAttribute = attributes.position;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\t\tvStart.fromBufferAttribute( positionAttribute, a );\n\t\t\t\t\tvEnd.fromBufferAttribute( positionAttribute, b );\n\n\t\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\t\tvStart.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t\tvEnd.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nLine.prototype.isLine = true;\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\nclass LineSegments extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t// we assume non-indexed geometry\n\n\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\t\tconst lineDistances = [];\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.LineSegments.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nLineSegments.prototype.isLineSegments = true;\n\nclass LineLoop extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\nLineLoop.prototype.isLineLoop = true;\n\nclass PointsMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nPointsMaterial.prototype.isPointsMaterial = true;\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\nclass Points extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst attributes = geometry.attributes;\n\t\t\tconst positionAttribute = attributes.position;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Points.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nPoints.prototype.isPoints = true;\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\nclass VideoTexture extends Texture {\n\n\tconstructor( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearFilter;\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nVideoTexture.prototype.isVideoTexture = true;\n\nclass FramebufferTexture extends Texture {\n\n\tconstructor( width, height, format ) {\n\n\t\tsuper( { width, height } );\n\n\t\tthis.format = format;\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nFramebufferTexture.prototype.isFramebufferTexture = true;\n\nclass CompressedTexture extends Texture {\n\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\nCompressedTexture.prototype.isCompressedTexture = true;\n\nclass CanvasTexture extends Texture {\n\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nCanvasTexture.prototype.isCanvasTexture = true;\n\n/**\n * Extensible curve object.\n *\n * Some common of curve methods:\n * .getPoint( t, optionalTarget ), .getTangent( t, optionalTarget )\n * .getPointAt( u, optionalTarget ), .getTangentAt( u, optionalTarget )\n * .getPoints(), .getSpacedPoints()\n * .getLength()\n * .updateArcLengths()\n *\n * This following curves inherit from THREE.Curve:\n *\n * -- 2D curves --\n * THREE.ArcCurve\n * THREE.CubicBezierCurve\n * THREE.EllipseCurve\n * THREE.LineCurve\n * THREE.QuadraticBezierCurve\n * THREE.SplineCurve\n *\n * -- 3D curves --\n * THREE.CatmullRomCurve3\n * THREE.CubicBezierCurve3\n * THREE.LineCurve3\n * THREE.QuadraticBezierCurve3\n *\n * A series of curves can be represented as a THREE.CurvePath.\n *\n **/\n\nclass Curve {\n\n\tconstructor() {\n\n\t\tthis.type = 'Curve';\n\n\t\tthis.arcLengthDivisions = 200;\n\n\t}\n\n\t// Virtual base class method to overwrite and implement in subclasses\n\t//\t- t [0 .. 1]\n\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\tconsole.warn( 'THREE.Curve: .getPoint() not implemented.' );\n\t\treturn null;\n\n\t}\n\n\t// Get point at relative position in curve according to arc length\n\t// - u [0 .. 1]\n\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t// Get sequence of points using getPoint( t )\n\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get total curve arc length\n\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t// Get list of cumulative segment lengths\n\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\tgetUtoTmapping( u, distance ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t// Returns a unit vector tangent at t\n\t// In case any sub curve does not implement its tangent derivation,\n\t// 2 points a small delta apart will be used to find its gradient\n\t// which seems to give a reasonable approximation\n\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\tcomputeFrenetFrames( segments, closed ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass EllipseCurve extends Curve {\n\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\tgetPoint( t, optionalTarget ) {\n\n\t\tconst point = optionalTarget || new Vector2();\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\nEllipseCurve.prototype.isEllipseCurve = true;\n\nclass ArcCurve extends EllipseCurve {\n\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\nArcCurve.prototype.isArcCurve = true;\n\n/**\n * Centripetal CatmullRom Curve - which is useful for avoiding\n * cusps and self-intersections in non-uniform catmull rom curves.\n * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n *\n * curve.type accepts centripetal(default), chordal and catmullrom\n * curve.tension is used for catmullrom which defaults to 0.5\n */\n\n\n/*\nBased on an optimized c++ solution in\n - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n - http://ideone.com/NoEbVM\n\nThis CubicPoly class could be used for reusing some variables and calculations,\nbut for three.js curve use, it could be possible inlined and flatten into a single function call\nwhich can be placed in CurveUtils.\n*/\n\nfunction CubicPoly() {\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = new Vector3();\nconst px = new CubicPoly(), py = new CubicPoly(), pz = new CubicPoly();\n\nclass CatmullRomCurve3 extends Curve {\n\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\tthis.points = points;\n\t\tthis.closed = closed;\n\t\tthis.curveType = curveType;\n\t\tthis.tension = tension;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\nCatmullRomCurve3.prototype.isCatmullRomCurve3 = true;\n\n/**\n * Bezier Curves formulas obtained from\n * https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n */\n\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\nclass CubicBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nCubicBezierCurve.prototype.isCubicBezierCurve = true;\n\nclass CubicBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nCubicBezierCurve3.prototype.isCubicBezierCurve3 = true;\n\nclass LineCurve extends Curve {\n\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LineCurve';\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst tangent = optionalTarget || new Vector2();\n\n\t\ttangent.copy( this.v2 ).sub( this.v1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nLineCurve.prototype.isLineCurve = true;\n\nclass LineCurve3 extends Curve {\n\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LineCurve3';\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass QuadraticBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nQuadraticBezierCurve.prototype.isQuadraticBezierCurve = true;\n\nclass QuadraticBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nQuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true;\n\nclass SplineCurve extends Curve {\n\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SplineCurve';\n\n\t\tthis.points = points;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nSplineCurve.prototype.isSplineCurve = true;\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**************************************************************\n *\tCurved Path - a curve path is simply a array of connected\n * curves, but retains the api of a curve\n **************************************************************/\n\nclass CurvePath extends Curve {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\tthis.curves = [];\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t}\n\n\t}\n\n\t// To get accurate point with reference to\n\t// entire path distance at time t,\n\t// following has to be done:\n\n\t// 1. Length of each sub path have to be known\n\t// 2. Locate and identify type of curve\n\t// 3. Get t for the curve\n\t// 4. Return curve.getPointAt(t')\n\n\tgetPoint( t, optionalTarget ) {\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Path extends CurvePath {\n\n\tconstructor( points ) {\n\n\t\tsuper();\n\t\tthis.type = 'Path';\n\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tsplineThru( pts /*Array of Vector*/ ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LatheGeometry extends BufferGeometry {\n\n\tconstructor( points = [ new Vector2( 0, 0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, - 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\nclass CapsuleGeometry extends LatheGeometry {\n\n\tconstructor( radius = 1, length = 1, capSegments = 4, radialSegments = 8 ) {\n\n\t\tconst path = new Path();\n\t\tpath.absarc( 0, - length / 2, radius, Math.PI * 1.5, 0 );\n\t\tpath.absarc( 0, length / 2, radius, 0, Math.PI * 0.5 );\n\n\t\tsuper( path.getPoints( capSegments ), radialSegments );\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: length,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments );\n\n\t}\n\n}\n\nclass CircleGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, segments = 8, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass CylinderGeometry extends BufferGeometry {\n\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass ConeGeometry extends CylinderGeometry {\n\n\tconstructor( radius = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass PolyhedronGeometry extends BufferGeometry {\n\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1,\t- 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t1, - 1, - 1, 1, - 1, 1,\n\t\t\t1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = new Vector3();\nconst _v1$1 = new Vector3();\nconst _normal = new Vector3();\nconst _triangle = new Triangle();\n\nclass EdgesGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n}\n\nclass Shape extends Path {\n\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\tthis.holes = [];\n\n\t}\n\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Port from https://github.com/mapbox/earcut (v2.2.2)\n */\n\nconst Earcut = {\n\n\ttriangulate: function ( data, holeIndices, dim = 2 ) {\n\n\t\tconst hasHoles = holeIndices && holeIndices.length;\n\t\tconst outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length;\n\t\tlet outerNode = linkedList( data, 0, outerLen, dim, true );\n\t\tconst triangles = [];\n\n\t\tif ( ! outerNode || outerNode.next === outerNode.prev ) return triangles;\n\n\t\tlet minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t\tif ( data.length > 80 * dim ) {\n\n\t\t\tminX = maxX = data[ 0 ];\n\t\t\tminY = maxY = data[ 1 ];\n\n\t\t\tfor ( let i = dim; i < outerLen; i += dim ) {\n\n\t\t\t\tx = data[ i ];\n\t\t\t\ty = data[ i + 1 ];\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 1 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize );\n\n\t\treturn triangles;\n\n\t}\n\n};\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tlet i, last;\n\n\tif ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {\n\n\t\tfor ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t} else {\n\n\t\tfor ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t}\n\n\tif ( last && equals( last, last.next ) ) {\n\n\t\tremoveNode( last );\n\t\tlast = last.next;\n\n\t}\n\n\treturn last;\n\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tlet p = start,\n\t\tagain;\n\tdo {\n\n\t\tagain = false;\n\n\t\tif ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {\n\n\t\t\tremoveNode( p );\n\t\t\tp = end = p.prev;\n\t\t\tif ( p === p.next ) break;\n\t\t\tagain = true;\n\n\t\t} else {\n\n\t\t\tp = p.next;\n\n\t\t}\n\n\t} while ( again || p !== end );\n\n\treturn end;\n\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tlet stop = ear,\n\t\tprev, next;\n\n\t// iterate through ears, slicing them one by one\n\twhile ( ear.prev !== ear.next ) {\n\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {\n\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push( prev.i / dim );\n\t\t\ttriangles.push( ear.i / dim );\n\t\t\ttriangles.push( next.i / dim );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertex leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\n\t\t\tif ( ! pass ) {\n\n\t\t\t\tearcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\n\t\t\t} else if ( pass === 1 ) {\n\n\t\t\t\tear = cureLocalIntersections( filterPoints( ear ), triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\t\t\t// as a last resort, try splitting the remaining polygon into two\n\n\t\t\t} else if ( pass === 2 ) {\n\n\t\t\t\tsplitEarcut( ear, triangles, dim, minX, minY, invSize );\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar( ear ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tlet p = ear.next.next;\n\n\twhile ( p !== ear.prev ) {\n\n\t\tif ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ),\n\t\tminTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ),\n\t\tmaxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ),\n\t\tmaxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y );\n\n\t// z-order range for the current triangle bbox;\n\tconst minZ = zOrder( minTX, minTY, minX, minY, invSize ),\n\t\tmaxZ = zOrder( maxTX, maxTY, minX, minY, invSize );\n\n\tlet p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile ( p && p.z >= minZ && n && n.z <= maxZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t\tif ( n !== ear.prev && n !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) &&\n\t\t\tarea( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile ( n && n.z <= maxZ ) {\n\n\t\tif ( n !== ear.prev && n !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) &&\n\t\t\tarea( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tconst a = p.prev,\n\t\t\tb = p.next.next;\n\n\t\tif ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {\n\n\t\t\ttriangles.push( a.i / dim );\n\t\t\ttriangles.push( p.i / dim );\n\t\t\ttriangles.push( b.i / dim );\n\n\t\t\t// remove two nodes involved\n\t\t\tremoveNode( p );\n\t\t\tremoveNode( p.next );\n\n\t\t\tp = start = b;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn filterPoints( p );\n\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\tlet a = start;\n\tdo {\n\n\t\tlet b = a.next.next;\n\t\twhile ( b !== a.prev ) {\n\n\t\t\tif ( a.i !== b.i && isValidDiagonal( a, b ) ) {\n\n\t\t\t\t// split the polygon in two by the diagonal\n\t\t\t\tlet c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\n\t\t\t\ta = filterPoints( a, a.next );\n\t\t\t\tc = filterPoints( c, c.next );\n\n\t\t\t\t// run earcut on each half\n\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tb = b.next;\n\n\t\t}\n\n\t\ta = a.next;\n\n\t} while ( a !== start );\n\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tconst queue = [];\n\tlet i, len, start, end, list;\n\n\tfor ( i = 0, len = holeIndices.length; i < len; i ++ ) {\n\n\t\tstart = holeIndices[ i ] * dim;\n\t\tend = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;\n\t\tlist = linkedList( data, start, end, dim, false );\n\t\tif ( list === list.next ) list.steiner = true;\n\t\tqueue.push( getLeftmost( list ) );\n\n\t}\n\n\tqueue.sort( compareX );\n\n\t// process holes from left to right\n\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\teliminateHole( queue[ i ], outerNode );\n\t\touterNode = filterPoints( outerNode, outerNode.next );\n\n\t}\n\n\treturn outerNode;\n\n}\n\nfunction compareX( a, b ) {\n\n\treturn a.x - b.x;\n\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole( hole, outerNode ) {\n\n\touterNode = findHoleBridge( hole, outerNode );\n\tif ( outerNode ) {\n\n\t\tconst b = splitPolygon( outerNode, hole );\n\n\t\t// filter collinear points around the cuts\n\t\tfilterPoints( outerNode, outerNode.next );\n\t\tfilterPoints( b, b.next );\n\n\t}\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge( hole, outerNode ) {\n\n\tlet p = outerNode;\n\tconst hx = hole.x;\n\tconst hy = hole.y;\n\tlet qx = - Infinity, m;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tconst x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\t\t\t\tif ( x === hx ) {\n\n\t\t\t\t\tif ( hy === p.y ) return p;\n\t\t\t\t\tif ( hy === p.next.y ) return p.next;\n\n\t\t\t\t}\n\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== outerNode );\n\n\tif ( ! m ) return null;\n\n\tif ( hx === qx ) return m; // hole touches outer segment; pick leftmost endpoint\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tconst stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y;\n\tlet tanMin = Infinity, tan;\n\n\tp = m;\n\n\tdo {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\tpointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {\n\n\t\t\ttan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential\n\n\t\t\tif ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) {\n\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== stop );\n\n\treturn m;\n\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector( m, p ) {\n\n\treturn area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0;\n\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tif ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize );\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked( p );\n\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked( list ) {\n\n\tlet i, p, q, e, tail, numMerges, pSize, qSize,\n\t\tinSize = 1;\n\n\tdo {\n\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile ( p ) {\n\n\t\t\tnumMerges ++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\t\t\tfor ( i = 0; i < inSize; i ++ ) {\n\n\t\t\t\tpSize ++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif ( ! q ) break;\n\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile ( pSize > 0 || ( qSize > 0 && q ) ) {\n\n\t\t\t\tif ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {\n\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize --;\n\n\t\t\t\t} else {\n\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize --;\n\n\t\t\t\t}\n\n\t\t\t\tif ( tail ) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\n\t\t\t}\n\n\t\t\tp = q;\n\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\n\t} while ( numMerges > 1 );\n\n\treturn list;\n\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = 32767 * ( x - minX ) * invSize;\n\ty = 32767 * ( y - minY ) * invSize;\n\n\tx = ( x | ( x << 8 ) ) & 0x00FF00FF;\n\tx = ( x | ( x << 4 ) ) & 0x0F0F0F0F;\n\tx = ( x | ( x << 2 ) ) & 0x33333333;\n\tx = ( x | ( x << 1 ) ) & 0x55555555;\n\n\ty = ( y | ( y << 8 ) ) & 0x00FF00FF;\n\ty = ( y | ( y << 4 ) ) & 0x0F0F0F0F;\n\ty = ( y | ( y << 2 ) ) & 0x33333333;\n\ty = ( y | ( y << 1 ) ) & 0x55555555;\n\n\treturn x | ( y << 1 );\n\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost( start ) {\n\n\tlet p = start,\n\t\tleftmost = start;\n\tdo {\n\n\t\tif ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn leftmost;\n\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 &&\n\t\t\t( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 &&\n\t\t\t( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0;\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // doesn't intersect other edges\n\t\t( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible\n\t\t( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors\n\t\tequals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case\n\n}\n\n// signed area of a triangle\nfunction area( p, q, r ) {\n\n\treturn ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );\n\n}\n\n// check if two points are equal\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tconst o1 = sign( area( p1, q1, p2 ) );\n\tconst o2 = sign( area( p1, q1, q2 ) );\n\tconst o3 = sign( area( p2, q2, p1 ) );\n\tconst o4 = sign( area( p2, q2, q1 ) );\n\n\tif ( o1 !== o2 && o3 !== o4 ) return true; // general case\n\n\tif ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n\tif ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n\tif ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n\tif ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n\treturn false;\n\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment( p, q, r ) {\n\n\treturn q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y );\n\n}\n\nfunction sign( num ) {\n\n\treturn num > 0 ? 1 : num < 0 ? - 1 : 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon( a, b ) {\n\n\tlet p = a;\n\tdo {\n\n\t\tif ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\t\tintersects( p, p.next, a, b ) ) return true;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn false;\n\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside( a, b ) {\n\n\treturn area( a.prev, a, a.next ) < 0 ?\n\t\tarea( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :\n\t\tarea( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;\n\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside( a, b ) {\n\n\tlet p = a,\n\t\tinside = false;\n\tconst px = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) )\n\t\t\tinside = ! inside;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn inside;\n\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon( a, b ) {\n\n\tconst a2 = new Node( a.i, a.x, a.y ),\n\t\tb2 = new Node( b.i, b.x, b.y ),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode( i, x, y, last ) {\n\n\tconst p = new Node( i, x, y );\n\n\tif ( ! last ) {\n\n\t\tp.prev = p;\n\t\tp.next = p;\n\n\t} else {\n\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\n\t}\n\n\treturn p;\n\n}\n\nfunction removeNode( p ) {\n\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif ( p.prevZ ) p.prevZ.nextZ = p.nextZ;\n\tif ( p.nextZ ) p.nextZ.prevZ = p.prevZ;\n\n}\n\nfunction Node( i, x, y ) {\n\n\t// vertex index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertex nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = null;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n\n}\n\nfunction signedArea( data, start, end, dim ) {\n\n\tlet sum = 0;\n\tfor ( let i = start, j = end - dim; i < end; i += dim ) {\n\n\t\tsum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );\n\t\tj = i;\n\n\t}\n\n\treturn sum;\n\n}\n\nclass ShapeUtils {\n\n\t// calculate area of the contour polygon\n\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n * curveSegments: , // number of points on the curves\n * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n * depth: , // Depth to extrude the shape\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into the original shape bevel goes\n * bevelSize: , // how far from shape outline (including bevelOffset) is bevel\n * bevelOffset: , // how far from shape outline does bevel start\n * bevelSegments: , // number of bevel layers\n *\n * extrudePath: // curve to extrude shape along\n *\n * UVGenerator: // object that provides UV generator functions\n *\n * }\n */\n\nclass ExtrudeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( - 0.5, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tlet depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t// deprecated options\n\n\t\t\tif ( options.amount !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ExtrudeBufferGeometry: amount has been renamed to depth.' );\n\t\t\t\tdepth = options.amount;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length, flen = faces.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t// but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\n\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t///// Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t- 1, t, 0, \t1, t, 0, \t- 1, - t, 0, \t1, - t, 0,\n\t\t\t0, - 1, t, \t0, 1, t,\t0, - 1, - t, \t0, 1, - t,\n\t\t\tt, 0, - 1, \tt, 0, 1, \t- t, 0, - 1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t- 1, 0, 0,\t0, 1, 0,\n\t\t\t0, - 1, 0, \t0, 0, 1,\t0, 0, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass RingGeometry extends BufferGeometry {\n\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 8, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass ShapeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// incides\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\nclass SphereGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy == 0 && thetaStart == 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy == heightSegments && thetaEnd == Math.PI ) {\n\n\t\t\t\tuOffset = - 0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t- 1, - 1, 1, \t- 1, 1, - 1, \t1, - 1, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass TorusGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 8, tubularSegments = 6, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\nclass TorusKnotGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\nclass TubeGeometry extends BufferGeometry {\n\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( - 1, - 1, 0 ), new Vector3( - 1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\nclass WireframeGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\t\tthis.type = 'WireframeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tBoxBufferGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCapsuleBufferGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tCircleBufferGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tConeBufferGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tCylinderBufferGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tDodecahedronBufferGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tExtrudeBufferGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tIcosahedronBufferGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tLatheBufferGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tOctahedronBufferGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPlaneBufferGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tPolyhedronBufferGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tRingBufferGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tShapeBufferGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tSphereBufferGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTetrahedronBufferGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusBufferGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTorusKnotBufferGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tTubeBufferGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\nclass ShadowMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\tthis.color = new Color( 0x000000 );\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nShadowMaterial.prototype.isShadowMaterial = true;\n\nclass RawShaderMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\nRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\nclass MeshStandardMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 1.0;\n\t\tthis.metalness = 0.0;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.clearcoatMap = null;\n\t\tthis.clearcoatRoughness = 0.0;\n\t\tthis.clearcoatRoughnessMap = null;\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\t\tthis.clearcoatNormalMap = null;\n\n\t\tthis.ior = 1.5;\n\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\tthis.sheenColor = new Color( 0x000000 );\n\t\tthis.sheenColorMap = null;\n\t\tthis.sheenRoughness = 1.0;\n\t\tthis.sheenRoughnessMap = null;\n\n\t\tthis.transmissionMap = null;\n\n\t\tthis.thickness = 0;\n\t\tthis.thicknessMap = null;\n\t\tthis.attenuationDistance = 0.0;\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\tthis.specularIntensity = 1.0;\n\t\tthis.specularIntensityMap = null;\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\t\tthis.specularColorMap = null;\n\n\t\tthis._sheen = 0.0;\n\t\tthis._clearcoat = 0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.ior = source.ior;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\nclass MeshPhongMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\nclass MeshToonMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\t\tthis.gradientMap = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\nclass MeshNormalMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\nclass MeshLambertMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\nclass MeshMatcapMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.matcap = null;\n\n\t\tthis.map = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nMeshMatcapMaterial.prototype.isMeshMatcapMaterial = true;\n\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\nLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\nconst materialLib = {\n\tShadowMaterial,\n\tSpriteMaterial,\n\tRawShaderMaterial,\n\tShaderMaterial,\n\tPointsMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMeshPhongMaterial,\n\tMeshToonMaterial,\n\tMeshNormalMaterial,\n\tMeshLambertMaterial,\n\tMeshDepthMaterial,\n\tMeshDistanceMaterial,\n\tMeshBasicMaterial,\n\tMeshMatcapMaterial,\n\tLineDashedMaterial,\n\tLineBasicMaterial,\n\tMaterial\n};\n\nMaterial.fromType = function ( type ) {\n\n\treturn new materialLib[ type ]();\n\n};\n\nconst AnimationUtils = {\n\n\t// same as Array.prototype.slice, but also works on typed arrays\n\tarraySlice: function ( array, from, to ) {\n\n\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t// in ios9 array.subarray(from, undefined) will return empty array\n\t\t\t// but array.subarray(from) or array.subarray(from, len) is correct\n\t\t\treturn new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );\n\n\t\t}\n\n\t\treturn array.slice( from, to );\n\n\t},\n\n\t// converts an array to a specific type\n\tconvertArray: function ( array, type, forceClone ) {\n\n\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\treturn new type( array ); // create typed array\n\n\t\t}\n\n\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t},\n\n\tisTypedArray: function ( object ) {\n\n\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t! ( object instanceof DataView );\n\n\t},\n\n\t// returns an array by which times and values can be sorted\n\tgetKeyframeOrder: function ( times ) {\n\n\t\tfunction compareTime( i, j ) {\n\n\t\t\treturn times[ i ] - times[ j ];\n\n\t\t}\n\n\t\tconst n = times.length;\n\t\tconst result = new Array( n );\n\t\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\tresult.sort( compareTime );\n\n\t\treturn result;\n\n\t},\n\n\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\tsortedArray: function ( values, stride, order ) {\n\n\t\tconst nValues = values.length;\n\t\tconst result = new values.constructor( nValues );\n\n\t\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\tconst srcOffset = order[ i ] * stride;\n\n\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\t// function for parsing AOS keyframe formats\n\tflattenJSON: function ( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tlet i = 1, key = jsonKeys[ 0 ];\n\n\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t}\n\n\t\tif ( key === undefined ) return; // no data\n\n\t\tlet value = key[ valuePropertyName ];\n\t\tif ( value === undefined ) return; // no data\n\n\t\tif ( Array.isArray( value ) ) {\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t} else if ( value.toArray !== undefined ) {\n\n\t\t\t// ...assume THREE.Math-ish\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t} else {\n\n\t\t\t// otherwise push as-is\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t}\n\n\t},\n\n\tsubclip: function ( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\t\tconst clip = sourceClip.clone();\n\n\t\tclip.name = name;\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\t\tconst track = clip.tracks[ i ];\n\t\t\tconst valueSize = track.getValueSize();\n\n\t\t\tconst times = [];\n\t\t\tconst values = [];\n\n\t\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( times.length === 0 ) continue;\n\n\t\t\ttrack.times = AnimationUtils.convertArray( times, track.times.constructor );\n\t\t\ttrack.values = AnimationUtils.convertArray( values, track.values.constructor );\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\tclip.tracks = tracks;\n\n\t\t// find minimum .times value across all tracks in the trimmed clip\n\n\t\tlet minStartTime = Infinity;\n\n\t\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// shift all tracks such that clip begins at t=0\n\n\t\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\t\tclip.tracks[ i ].shift( - 1 * minStartTime );\n\n\t\t}\n\n\t\tclip.resetDuration();\n\n\t\treturn clip;\n\n\t},\n\n\tmakeClipAdditive: function ( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\t\tif ( fps <= 0 ) fps = 30;\n\n\t\tconst numTracks = referenceClip.tracks.length;\n\t\tconst referenceTime = referenceFrame / fps;\n\n\t\t// Make each track's values relative to the values at the reference frame\n\t\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t\t// Skip this track if it's non-numeric\n\t\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t\t} );\n\n\t\t\tif ( targetTrack === undefined ) continue;\n\n\t\t\tlet referenceOffset = 0;\n\t\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t\t}\n\n\t\t\tlet targetOffset = 0;\n\t\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t\t}\n\n\t\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\t\tlet referenceValue;\n\n\t\t\t// Find the value to subtract out of the track\n\t\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\t\tconst startIndex = referenceOffset;\n\t\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\t\treferenceValue = AnimationUtils.arraySlice( referenceTrack.values, startIndex, endIndex );\n\n\t\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\t\treferenceValue = AnimationUtils.arraySlice( referenceTrack.values, startIndex, endIndex );\n\n\t\t\t} else {\n\n\t\t\t\t// Interpolate to the reference value\n\t\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\t\tconst startIndex = referenceOffset;\n\t\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\t\treferenceValue = AnimationUtils.arraySlice( interpolant.resultBuffer, startIndex, endIndex );\n\n\t\t\t}\n\n\t\t\t// Conjugate the quaternion\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t\t}\n\n\t\t\t// Subtract the reference value from all of the track values\n\n\t\t\tconst numTimes = targetTrack.times.length;\n\t\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\t\tvalueStart,\n\t\t\t\t\t\treferenceValue,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\t\tvalueStart\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\t\treturn targetClip;\n\n\t}\n\n};\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References:\n *\n * \t\thttp://www.oodesign.com/template-method-pattern.html\n *\n */\n\nclass Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t\tthis.settings = null;\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t// Template methods for derived classes:\n\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n// ALIAS DEFINITIONS\n\nInterpolant.prototype.beforeStart_ = Interpolant.prototype.copySampleValue_;\nInterpolant.prototype.afterEnd_ = Interpolant.prototype.copySampleValue_;\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n */\n\nclass CubicInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = - 0;\n\t\tthis._offsetPrev = - 0;\n\t\tthis._weightNext = - 0;\n\t\tthis._offsetNext = - 0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1;\n\t\tconst s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nclass LinearInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n *\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n */\n\nclass DiscreteInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\nclass KeyframeTrack {\n\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t// Serialization (in static context, because of constructor invocation\n\t// and automatic invocation of .toJSON):\n\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t// move all keyframes either forwards or backwards in time\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== - 1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\tthis.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t// removes equivalent sequential keys as common in morph target sequences\n\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\toptimize() {\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = AnimationUtils.arraySlice( this.times ),\n\t\t\tvalues = AnimationUtils.arraySlice( this.values ),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst times = AnimationUtils.arraySlice( this.times, 0 );\n\t\tconst values = AnimationUtils.arraySlice( this.values, 0 );\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A Track of Boolean keyframe values.\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {}\n\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of keyframe values that represent color.\n */\nclass ColorKeyframeTrack extends KeyframeTrack {}\n\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A Track of numeric keyframe values.\n */\nclass NumberKeyframeTrack extends KeyframeTrack {}\n\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n */\n\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A Track of quaternion keyframe values.\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\nQuaternionKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track that interpolates Strings\n */\nclass StringKeyframeTrack extends KeyframeTrack {}\n\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\nStringKeyframeTrack.prototype.ValueBufferType = Array;\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of vectored keyframe values.\n */\nclass VectorKeyframeTrack extends KeyframeTrack {}\n\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\nclass AnimationClip {\n\n\tconstructor( name, duration = - 1, tracks, blendMode = NormalAnimationBlendMode ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = duration;\n\t\tthis.blendMode = blendMode;\n\n\t\tthis.uuid = generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\treturn clip;\n\n\t}\n\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = AnimationUtils.getKeyframeOrder( times );\n\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, - 1, tracks );\n\n\t}\n\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t// parse the animation.hierarchy format\n\tstatic parseAnimation( animation, bones ) {\n\n\t\tif ( ! animation ) {\n\n\t\t\tconsole.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || - 1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\treturn new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\nconst Cache = {\n\n\tenabled: false,\n\n\tfiles: {},\n\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\nclass LoadingManager {\n\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t}\n\n}\n\nconst DefaultLoadingManager = new LoadingManager();\n\nclass Loader {\n\n\tconstructor( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.crossOrigin = 'anonymous';\n\t\tthis.withCredentials = false;\n\t\tthis.path = '';\n\t\tthis.resourcePath = '';\n\t\tthis.requestHeader = {};\n\n\t}\n\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\tparse( /* data */ ) {}\n\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n}\n\nconst loading = {};\n\nclass FileLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\t// An abort controller could be added within a future PR\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\t\t\t\t\tconst contentLength = response.headers.get( 'Content-Length' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow Error( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}` );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === undefined ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( url, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n}\n\nclass AnimationLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract Base class to block based textures loader (dds, pvr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass CompressedTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass ImageLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tCache.add( url, this );\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n}\n\nclass CubeTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass DataTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tconst texData = scope.parse( buffer );\n\n\t\t\tif ( ! texData ) return;\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.encoding !== undefined ) {\n\n\t\t\t\ttexture.encoding = texData.encoding;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass TextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass Light extends Object3D {\n\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity;\n\n\t}\n\n\tdispose() {\n\n\t\t// Empty here in base class; some subclasses override.\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\treturn data;\n\n\t}\n\n}\n\nLight.prototype.isLight = true;\n\nclass HemisphereLight extends Light {\n\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n}\n\nHemisphereLight.prototype.isHemisphereLight = true;\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();\nconst _lookTarget$1 = /*@__PURE__*/ new Vector3();\n\nclass LightShadow {\n\n\tconstructor( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.normalBias = 0;\n\t\tthis.radius = 1;\n\t\tthis.blurSamples = 8;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.mapPass = null;\n\t\tthis.matrix = new Matrix4();\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld$1 );\n\n\t\t_lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget$1 );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix$1 );\n\n\t\tshadowMatrix.set(\n\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t);\n\n\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t}\n\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\nclass SpotLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\tthis.focus = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = this.mapSize.width / this.mapSize.height;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\nSpotLightShadow.prototype.isSpotLightShadow = true;\n\nclass SpotLight extends Light {\n\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 1 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.distance = distance;\n\t\tthis.angle = angle;\n\t\tthis.penumbra = penumbra;\n\t\tthis.decay = decay; // for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nSpotLight.prototype.isSpotLight = true;\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\nclass PointLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t// xzXZ\n\t\t\t// y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t\t];\n\n\t\tthis._cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t}\n\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t}\n\n}\n\nPointLightShadow.prototype.isPointLightShadow = true;\n\nclass PointLight extends Light {\n\n\tconstructor( color, intensity, distance = 0, decay = 1 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tthis.distance = distance;\n\t\tthis.decay = decay; // for physically correct lights, should be 2.\n\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nPointLight.prototype.isPointLight = true;\n\nclass DirectionalLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n}\n\nDirectionalLightShadow.prototype.isDirectionalLightShadow = true;\n\nclass DirectionalLight extends Light {\n\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nDirectionalLight.prototype.isDirectionalLight = true;\n\nclass AmbientLight extends Light {\n\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\nAmbientLight.prototype.isAmbientLight = true;\n\nclass RectAreaLight extends Light {\n\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\nRectAreaLight.prototype.isRectAreaLight = true;\n\n/**\n * Primary reference:\n * https://graphics.stanford.edu/papers/envmap/envmap.pdf\n *\n * Secondary reference:\n * https://www.ppsloan.org/publications/StupidSH36.pdf\n */\n\n// 3-band SH defined by 9 coefficients\n\nclass SphericalHarmonics3 {\n\n\tconstructor() {\n\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// get the radiance in the direction of the normal\n\t// target is a Vector3\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t// get the irradiance (radiance convolved with cosine lobe) in the direction of the normal\n\t// target is a Vector3\n\t// https://graphics.stanford.edu/papers/envmap/envmap.pdf\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t// evaluate the basis functions\n\t// shBasis is an Array[ 9 ]\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\nSphericalHarmonics3.prototype.isSphericalHarmonics3 = true;\n\nclass LightProbe extends Light {\n\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\nLightProbe.prototype.isLightProbe = true;\n\nclass MaterialLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\t\tthis.textures = {};\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = Material.fromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== 1 ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Deprecated\n\n\t\tif ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n}\n\nclass LoaderUtils {\n\n\tstatic decodeText( array ) {\n\n\t\tif ( typeof TextDecoder !== 'undefined' ) {\n\n\t\t\treturn new TextDecoder().decode( array );\n\n\t\t}\n\n\t\t// Avoid the String.fromCharCode.apply(null, array) shortcut, which\n\t\t// throws a \"maximum call stack size exceeded\" error for large arrays.\n\n\t\tlet s = '';\n\n\t\tfor ( let i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t// Implicitly assumes little-endian.\n\t\t\ts += String.fromCharCode( array[ i ] );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\t// merges multi-byte utf-8 characters.\n\n\t\t\treturn decodeURIComponent( escape( s ) );\n\n\t\t} catch ( e ) { // see #16358\n\n\t\t\treturn s;\n\n\t\t}\n\n\t}\n\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === - 1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON( this );\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\nclass BufferGeometryLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tif ( attribute.updateRange !== undefined ) {\n\n\t\t\t\tbufferAttribute.updateRange.offset = attribute.updateRange.offset;\n\t\t\t\tbufferAttribute.updateRange.count = attribute.updateRange.count;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tconst center = new Vector3();\n\n\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t}\n\n\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\nclass ObjectLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ] instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\n\t\treturn object;\n\n\t}\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\tconsole.error( 'THREE.ObjectLoader: The legacy Geometry type is no longer supported.' );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( `THREE.ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.type === 'MultiMaterial' ) {\n\n\t\t\t\t\t// Deprecated\n\n\t\t\t\t\tconst array = [];\n\n\t\t\t\t\tfor ( let j = 0; j < data.materials.length; j ++ ) {\n\n\t\t\t\t\t\tconst material = data.materials[ j ];\n\n\t\t\t\t\t\tif ( cache[ material.uuid ] === undefined ) {\n\n\t\t\t\t\t\t\tcache[ material.uuid ] = loader.parse( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tarray.push( cache[ material.uuid ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterials[ data.uuid ] = array;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.encoding !== undefined ) texture.encoding = data.encoding;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/* DEPRECATED */\n\n\tsetTexturePath( value ) {\n\n\t\tconsole.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' );\n\t\treturn this.setResourcePath( value );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nclass ImageBitmapLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t}\n\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\n\t\tfetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( url, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n}\n\nImageBitmapLoader.prototype.isImageBitmapLoader = true;\n\nlet _context;\n\nconst AudioContext = {\n\n\tgetContext: function () {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t},\n\n\tsetContext: function ( value ) {\n\n\t\t_context = value;\n\n\t}\n\n};\n\nclass AudioLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n}\n\nclass HemisphereLightProbe extends LightProbe {\n\n\tconstructor( skyColor, groundColor, intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tconst color1 = new Color().set( skyColor );\n\t\tconst color2 = new Color().set( groundColor );\n\n\t\tconst sky = new Vector3( color1.r, color1.g, color1.b );\n\t\tconst ground = new Vector3( color2.r, color2.g, color2.b );\n\n\t\t// without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI );\n\t\tconst c0 = Math.sqrt( Math.PI );\n\t\tconst c1 = c0 * Math.sqrt( 0.75 );\n\n\t\tthis.sh.coefficients[ 0 ].copy( sky ).add( ground ).multiplyScalar( c0 );\n\t\tthis.sh.coefficients[ 1 ].copy( sky ).sub( ground ).multiplyScalar( c1 );\n\n\t}\n\n}\n\nHemisphereLightProbe.prototype.isHemisphereLightProbe = true;\n\nclass AmbientLightProbe extends LightProbe {\n\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tconst color1 = new Color().set( color );\n\n\t\t// without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI );\n\t\tthis.sh.coefficients[ 0 ].set( color1.r, color1.g, color1.b ).multiplyScalar( 2 * Math.sqrt( Math.PI ) );\n\n\t}\n\n}\n\nAmbientLightProbe.prototype.isAmbientLightProbe = true;\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\nclass StereoCamera {\n\n\tconstructor() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\nclass Clock {\n\n\tconstructor( autoStart = true ) {\n\n\t\tthis.autoStart = autoStart;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tstart() {\n\n\t\tthis.startTime = now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nfunction now() {\n\n\treturn ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\nconst _orientation$1 = /*@__PURE__*/ new Vector3();\n\nclass AudioListener extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\t\tconst up = this.up;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t_orientation$1.set( 0, 0, - 1 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _orientation$1.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _orientation$1.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _orientation$1.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass Audio extends Object3D {\n\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.listener = listener;\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.detune = 0;\n\t\tthis.loop = false;\n\t\tthis.loopStart = 0;\n\t\tthis.loopEnd = 0;\n\t\tthis.offset = 0;\n\t\tthis.duration = undefined;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.source = null;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\tthis.filters = [];\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tthis.source.stop();\n\t\tthis.source.onended = null;\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.source.detune === undefined ) return; // only set detune when available\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\n\t}\n\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\nclass PositionalAudio extends Audio {\n\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass AudioAnalyser {\n\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\nclass PropertyMixer {\n\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'accu'\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'add'\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t// apply the state of 'accu' to the binding when accus differ\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// remember the state of the bound property and copy it to both accus\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t// apply the state previously taken via 'saveOriginalState' to the binding\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\nclass PropertyBinding {\n\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\tstatic create( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name Node name to be sanitized.\n\t * @return {string}\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== - 1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t// create getter / setter pair for a property in the scene graph\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\\'t found.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.geometry.isBufferGeometry ) {\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n *\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n *\n * - Instead pass this object as 'root'.\n *\n * - You can also add and remove objects later when the mixer\n * is running.\n *\n * Note:\n *\n * Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done\n * on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the\n * all objects in the group.\n *\n * - A single property can either be controlled through a\n * target group or directly, but not both.\n */\n\nclass AnimationObjectGroup {\n\n\tconstructor() {\n\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\tconsole.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// remove & forget\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\nAnimationObjectGroup.prototype.isAnimationObjectGroup = true;\n\nclass AnimationAction {\n\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = - 1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; // no. of repetitions when looping\n\n\t\tthis.paused = false; // true -> zero effective time scale\n\t\tthis.enabled = true; // false -> zero effective weight\n\n\t\tthis.clampWhenFinished = false;// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart = true;// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd = true;// clips for start, loop and end\n\n\t}\n\n\t// State & Scheduling\n\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = - 1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t// return true when play has been called\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t// Weight\n\n\t// set the weight stopping any scheduled fading\n\t// although .enabled = false yields an effective weight of zero, this\n\t// method does *not* change .enabled, because it would be confusing\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t// return the weight considering fading and .enabled\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\tcrossFadeFrom( fadeOutAction, duration, warp ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcrossFadeTo( fadeInAction, duration, warp ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Time Scale Control\n\n\t// set the time scale stopping any scheduled warping\n\t// although .paused = true yields an effective time scale of zero, this\n\t// method does *not* change .paused, because it would be confusing\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t// return the time scale considering warping and .paused\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Object Accessors\n\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t}\n\n\t\t\t// start\n\n\t\t\tthis._startTime = null; // unschedule\n\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === - 1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? - 1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : - 1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass AnimationMixer extends EventDispatcher {\n\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\t\tthis.time = 0;\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t// return an action for a clip optionally using a custom root target\n\t// object (this method allocates a lot of dynamic memory in case a\n\t// previously unknown clip/root combination is specified)\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t// get an existing action\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// deactivates all previously scheduled actions\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// advance the time and update apply the animation\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Allows you to seek to a specific time in an animation.\n\tsetTime( timeInSeconds ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( timeInSeconds ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t// return this mixer's root target object\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t// free all resources specific to a particular clip\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t// free all resources specific to a particular root target object\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// remove a targeted clip from the cache\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\nAnimationMixer.prototype._controlInterpolantsResultBuffer = new Float32Array( 1 );\n\nclass Uniform {\n\n\tconstructor( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\nInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\nclass GLBufferAttribute {\n\n\tconstructor( buffer, type, itemSize, elementSize, count ) {\n\n\t\tthis.buffer = buffer;\n\t\tthis.type = type;\n\t\tthis.itemSize = itemSize;\n\t\tthis.elementSize = elementSize;\n\t\tthis.count = count;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nGLBufferAttribute.prototype.isGLBufferAttribute = true;\n\nclass Raycaster {\n\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.camera = null;\n\t\tthis.layers = new Layers();\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersectObject( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t}\n\n\tif ( recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n *\n * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up.\n * The azimuthal angle (theta) is measured from the positive z-axis.\n */\n\nclass Spherical {\n\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi; // polar angle\n\t\tthis.theta = theta; // azimuthal angle\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t// restrict phi to be between EPS and PI-EPS\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, - 1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n */\n\nclass Cylindrical {\n\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\tthis.radius = radius; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = theta; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = y; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\nclass Box2 {\n\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\tconst clampedPoint = _vector$4.copy( point ).clamp( this.min, this.max );\n\t\treturn clampedPoint.sub( point ).length();\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nBox2.prototype.isBox2 = true;\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nclass Line3 {\n\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\tthis.start = start;\n\t\tthis.end = end;\n\n\t}\n\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\nclass SpotLightHelper extends Object3D {\n\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t- 1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, - 1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateMatrixWorld();\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n\nclass SkeletonHelper extends LineSegments {\n\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst color1 = new Color( 0, 0, 1 );\n\t\tconst color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'SkeletonHelper';\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.root = object;\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push.apply( boneList, getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\nclass PointLightHelper extends Mesh {\n\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\nclass HemisphereLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\nclass GridHelper extends LineSegments {\n\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n}\n\nclass PolarGridHelper extends LineSegments {\n\n\tconstructor( radius = 10, radials = 16, circles = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the radials\n\n\t\tfor ( let i = 0; i <= radials; i ++ ) {\n\n\t\t\tconst v = ( i / radials ) * ( Math.PI * 2 );\n\n\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( x, 0, z );\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t\t// create the circles\n\n\t\tfor ( let i = 0; i <= circles; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / circles * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\nclass DirectionalLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n *\t- shows frustum, line of sight and up of the camera\n *\t- suitable for fast updates\n * \t- based on frustum visualization in lightgl.js shadowmap example\n *\t\thttps://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html\n */\n\nclass CameraHelper extends LineSegments {\n\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2', colorFrustum );\n\t\taddLine( 'n2', 'n4', colorFrustum );\n\t\taddLine( 'n4', 'n3', colorFrustum );\n\t\taddLine( 'n3', 'n1', colorFrustum );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2', colorFrustum );\n\t\taddLine( 'f2', 'f4', colorFrustum );\n\t\taddLine( 'f4', 'f3', colorFrustum );\n\t\taddLine( 'f3', 'f1', colorFrustum );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1', colorFrustum );\n\t\taddLine( 'n2', 'f2', colorFrustum );\n\t\taddLine( 'n3', 'f3', colorFrustum );\n\t\taddLine( 'n4', 'f4', colorFrustum );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1', colorCone );\n\t\taddLine( 'p', 'n2', colorCone );\n\t\taddLine( 'p', 'n3', colorCone );\n\t\taddLine( 'p', 'n4', colorCone );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2', colorUp );\n\t\taddLine( 'u2', 'u3', colorUp );\n\t\taddLine( 'u3', 'u1', colorUp );\n\n\t\t// target\n\n\t\taddLine( 'c', 't', colorTarget );\n\t\taddLine( 'p', 'c', colorCross );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2', colorCross );\n\t\taddLine( 'cn3', 'cn4', colorCross );\n\n\t\taddLine( 'cf1', 'cf2', colorCross );\n\t\taddLine( 'cf3', 'cf4', colorCross );\n\n\t\tfunction addLine( a, b, color ) {\n\n\t\t\taddPoint( a, color );\n\t\t\taddPoint( b, color );\n\n\t\t}\n\n\t\tfunction addPoint( id, color ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t}\n\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// center / target\n\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, 1 );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, 1 );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\nclass BoxHelper extends LineSegments {\n\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tupdate( object ) {\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );\n\n\t\t}\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\n\t}\n\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tLineSegments.prototype.copy.call( this, source );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Box3Helper extends LineSegments {\n\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tconst positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nclass PlaneHelper extends Line {\n\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\tthis.plane = plane;\n\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tlet scale = - this.plane.constant;\n\n\t\tif ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, scale );\n\n\t\tthis.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\nclass ArrowHelper extends Object3D {\n\n\t// dir is assumed to be normalized\n\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new CylinderGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass AxesHelper extends LineSegments {\n\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass ShapePath {\n\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\tthis.color = new Color();\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\ttoShapes( isCCW, noHoles ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//console.log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//console.log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//console.log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nclass DataUtils {\n\n\t// float32 to float16\n\n\tstatic toHalfFloat( val ) {\n\n\t\tif ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' );\n\n\t\tval = clamp( val, - 65504, 65504 );\n\n\t\t_floatView[ 0 ] = val;\n\t\tconst f = _uint32View[ 0 ];\n\t\tconst e = ( f >> 23 ) & 0x1ff;\n\t\treturn _baseTable[ e ] + ( ( f & 0x007fffff ) >> _shiftTable[ e ] );\n\n\t}\n\n\t// float16 to float32\n\n\tstatic fromHalfFloat( val ) {\n\n\t\tconst m = val >> 10;\n\t\t_uint32View[ 0 ] = _mantissaTable[ _offsetTable[ m ] + ( val & 0x3ff ) ] + _exponentTable[ m ];\n\t\treturn _floatView[ 0 ];\n\n\t}\n\n}\n\n// float32 to float16 helpers\n\nconst _buffer = new ArrayBuffer( 4 );\nconst _floatView = new Float32Array( _buffer );\nconst _uint32View = new Uint32Array( _buffer );\n\nconst _baseTable = new Uint32Array( 512 );\nconst _shiftTable = new Uint32Array( 512 );\n\nfor ( let i = 0; i < 256; ++ i ) {\n\n\tconst e = i - 127;\n\n\t// very small number (0, -0)\n\n\tif ( e < - 27 ) {\n\n\t\t_baseTable[ i ] = 0x0000;\n\t\t_baseTable[ i | 0x100 ] = 0x8000;\n\t\t_shiftTable[ i ] = 24;\n\t\t_shiftTable[ i | 0x100 ] = 24;\n\n\t\t// small number (denorm)\n\n\t} else if ( e < - 14 ) {\n\n\t\t_baseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t_baseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t_shiftTable[ i ] = - e - 1;\n\t\t_shiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t// normal number\n\n\t} else if ( e <= 15 ) {\n\n\t\t_baseTable[ i ] = ( e + 15 ) << 10;\n\t\t_baseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t_shiftTable[ i ] = 13;\n\t\t_shiftTable[ i | 0x100 ] = 13;\n\n\t\t// large number (Infinity, -Infinity)\n\n\t} else if ( e < 128 ) {\n\n\t\t_baseTable[ i ] = 0x7c00;\n\t\t_baseTable[ i | 0x100 ] = 0xfc00;\n\t\t_shiftTable[ i ] = 24;\n\t\t_shiftTable[ i | 0x100 ] = 24;\n\n\t\t// stay (NaN, Infinity, -Infinity)\n\n\t} else {\n\n\t\t_baseTable[ i ] = 0x7c00;\n\t\t_baseTable[ i | 0x100 ] = 0xfc00;\n\t\t_shiftTable[ i ] = 13;\n\t\t_shiftTable[ i | 0x100 ] = 13;\n\n\t}\n\n}\n\n// float16 to float32 helpers\n\nconst _mantissaTable = new Uint32Array( 2048 );\nconst _exponentTable = new Uint32Array( 64 );\nconst _offsetTable = new Uint32Array( 64 );\n\nfor ( let i = 1; i < 1024; ++ i ) {\n\n\tlet m = i << 13; // zero pad mantissa bits\n\tlet e = 0; // zero exponent\n\n\t// normalized\n\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\tm <<= 1;\n\t\te -= 0x00800000; // decrement exponent\n\n\t}\n\n\tm &= ~ 0x00800000; // clear leading 1 bit\n\te += 0x38800000; // adjust bias\n\n\t_mantissaTable[ i ] = m | e;\n\n}\n\nfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t_mantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n}\n\nfor ( let i = 1; i < 31; ++ i ) {\n\n\t_exponentTable[ i ] = i << 23;\n\n}\n\n_exponentTable[ 31 ] = 0x47800000;\n_exponentTable[ 32 ] = 0x80000000;\nfor ( let i = 33; i < 63; ++ i ) {\n\n\t_exponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n}\n\n_exponentTable[ 63 ] = 0xc7800000;\n\nfor ( let i = 1; i < 64; ++ i ) {\n\n\tif ( i !== 32 ) {\n\n\t\t_offsetTable[ i ] = 1024;\n\n\t}\n\n}\n\nconst LineStrip = 0;\nconst LinePieces = 1;\nconst NoColors = 0;\nconst FaceColors = 1;\nconst VertexColors = 2;\n\nfunction MeshFaceMaterial( materials ) {\n\n\tconsole.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' );\n\treturn materials;\n\n}\n\nfunction MultiMaterial( materials = [] ) {\n\n\tconsole.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' );\n\tmaterials.isMultiMaterial = true;\n\tmaterials.materials = materials;\n\tmaterials.clone = function () {\n\n\t\treturn materials.slice();\n\n\t};\n\n\treturn materials;\n\n}\n\nclass PointCloud extends Points {\n\n\tconstructor( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\tsuper( geometry, material );\n\n\t}\n\n}\n\nclass Particle extends Sprite {\n\n\tconstructor( material ) {\n\n\t\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\t\tsuper( material );\n\n\t}\n\n}\n\nclass ParticleSystem extends Points {\n\n\tconstructor( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\tsuper( geometry, material );\n\n\t}\n\n}\n\nclass PointCloudMaterial extends PointsMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\tsuper( parameters );\n\n\t}\n\n}\n\nclass ParticleBasicMaterial extends PointsMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\tsuper( parameters );\n\n\t}\n\n}\n\nclass ParticleSystemMaterial extends PointsMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\tsuper( parameters );\n\n\t}\n\n}\n\nclass Vertex extends Vector3 {\n\n\tconstructor( x, y, z ) {\n\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\tsuper( x, y, z );\n\n\t}\n\n}\n\n//\n\nclass DynamicBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead.' );\n\t\tsuper( array, itemSize );\n\t\tthis.setUsage( DynamicDrawUsage );\n\n\t}\n\n}\n\nclass Int8Attribute extends Int8BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Uint8Attribute extends Uint8BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Uint8ClampedAttribute extends Uint8ClampedBufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Int16Attribute extends Int16BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Uint16Attribute extends Uint16BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Int32Attribute extends Int32BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Uint32Attribute extends Uint32BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Float32Attribute extends Float32BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\nclass Float64Attribute extends Float64BufferAttribute {\n\n\tconstructor( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\t\tsuper( array, itemSize );\n\n\t}\n\n}\n\n//\n\nCurve.create = function ( construct, getPoint ) {\n\n\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\tconstruct.prototype = Object.create( Curve.prototype );\n\tconstruct.prototype.constructor = construct;\n\tconstruct.prototype.getPoint = getPoint;\n\n\treturn construct;\n\n};\n\n//\n\nPath.prototype.fromPoints = function ( points ) {\n\n\tconsole.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' );\n\treturn this.setFromPoints( points );\n\n};\n\n//\n\nclass AxisHelper extends AxesHelper {\n\n\tconstructor( size ) {\n\n\t\tconsole.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' );\n\t\tsuper( size );\n\n\t}\n\n}\n\nclass BoundingBoxHelper extends BoxHelper {\n\n\tconstructor( object, color ) {\n\n\t\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\t\tsuper( object, color );\n\n\t}\n\n}\n\nclass EdgesHelper extends LineSegments {\n\n\tconstructor( object, hex ) {\n\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\tsuper( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n}\n\nGridHelper.prototype.setColors = function () {\n\n\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n};\n\nSkeletonHelper.prototype.update = function () {\n\n\tconsole.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' );\n\n};\n\nclass WireframeHelper extends LineSegments {\n\n\tconstructor( object, hex ) {\n\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\tsuper( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n}\n\n//\n\nLoader.prototype.extractUrlBase = function ( url ) {\n\n\tconsole.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' );\n\treturn LoaderUtils.extractUrlBase( url );\n\n};\n\nLoader.Handlers = {\n\n\tadd: function ( /* regex, loader */ ) {\n\n\t\tconsole.error( 'THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.' );\n\n\t},\n\n\tget: function ( /* file */ ) {\n\n\t\tconsole.error( 'THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.' );\n\n\t}\n\n};\n\nclass XHRLoader extends FileLoader {\n\n\tconstructor( manager ) {\n\n\t\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\t\tsuper( manager );\n\n\t}\n\n}\n\nclass BinaryTextureLoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\t\tsuper( manager );\n\n\t}\n\n}\n\n//\n\nBox2.prototype.center = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\treturn this.getCenter( optionalTarget );\n\n};\n\nBox2.prototype.empty = function () {\n\n\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\treturn this.isEmpty();\n\n};\n\nBox2.prototype.isIntersectionBox = function ( box ) {\n\n\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\treturn this.intersectsBox( box );\n\n};\n\nBox2.prototype.size = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\treturn this.getSize( optionalTarget );\n\n};\n\n//\n\nBox3.prototype.center = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\treturn this.getCenter( optionalTarget );\n\n};\n\nBox3.prototype.empty = function () {\n\n\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\treturn this.isEmpty();\n\n};\n\nBox3.prototype.isIntersectionBox = function ( box ) {\n\n\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\treturn this.intersectsBox( box );\n\n};\n\nBox3.prototype.isIntersectionSphere = function ( sphere ) {\n\n\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\treturn this.intersectsSphere( sphere );\n\n};\n\nBox3.prototype.size = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\treturn this.getSize( optionalTarget );\n\n};\n\n//\n\nEuler.prototype.toVector3 = function () {\n\n\tconsole.error( 'THREE.Euler: .toVector3() has been removed. Use Vector3.setFromEuler() instead' );\n\n};\n\n\n//\n\nSphere.prototype.empty = function () {\n\n\tconsole.warn( 'THREE.Sphere: .empty() has been renamed to .isEmpty().' );\n\treturn this.isEmpty();\n\n};\n\n//\n\nFrustum.prototype.setFromMatrix = function ( m ) {\n\n\tconsole.warn( 'THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix().' );\n\treturn this.setFromProjectionMatrix( m );\n\n};\n\n//\n\nLine3.prototype.center = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\treturn this.getCenter( optionalTarget );\n\n};\n\n//\n\nMatrix3.prototype.flattenToArrayOffset = function ( array, offset ) {\n\n\tconsole.warn( 'THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' );\n\treturn this.toArray( array, offset );\n\n};\n\nMatrix3.prototype.multiplyVector3 = function ( vector ) {\n\n\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\treturn vector.applyMatrix3( this );\n\n};\n\nMatrix3.prototype.multiplyVector3Array = function ( /* a */ ) {\n\n\tconsole.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' );\n\n};\n\nMatrix3.prototype.applyToBufferAttribute = function ( attribute ) {\n\n\tconsole.warn( 'THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead.' );\n\treturn attribute.applyMatrix3( this );\n\n};\n\nMatrix3.prototype.applyToVector3Array = function ( /* array, offset, length */ ) {\n\n\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n};\n\nMatrix3.prototype.getInverse = function ( matrix ) {\n\n\tconsole.warn( 'THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' );\n\treturn this.copy( matrix ).invert();\n\n};\n\n//\n\nMatrix4.prototype.extractPosition = function ( m ) {\n\n\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\treturn this.copyPosition( m );\n\n};\n\nMatrix4.prototype.flattenToArrayOffset = function ( array, offset ) {\n\n\tconsole.warn( 'THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' );\n\treturn this.toArray( array, offset );\n\n};\n\nMatrix4.prototype.getPosition = function () {\n\n\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\treturn new Vector3().setFromMatrixColumn( this, 3 );\n\n};\n\nMatrix4.prototype.setRotationFromQuaternion = function ( q ) {\n\n\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\treturn this.makeRotationFromQuaternion( q );\n\n};\n\nMatrix4.prototype.multiplyToArray = function () {\n\n\tconsole.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' );\n\n};\n\nMatrix4.prototype.multiplyVector3 = function ( vector ) {\n\n\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\treturn vector.applyMatrix4( this );\n\n};\n\nMatrix4.prototype.multiplyVector4 = function ( vector ) {\n\n\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\treturn vector.applyMatrix4( this );\n\n};\n\nMatrix4.prototype.multiplyVector3Array = function ( /* a */ ) {\n\n\tconsole.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' );\n\n};\n\nMatrix4.prototype.rotateAxis = function ( v ) {\n\n\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\tv.transformDirection( this );\n\n};\n\nMatrix4.prototype.crossVector = function ( vector ) {\n\n\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\treturn vector.applyMatrix4( this );\n\n};\n\nMatrix4.prototype.translate = function () {\n\n\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n};\n\nMatrix4.prototype.rotateX = function () {\n\n\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n};\n\nMatrix4.prototype.rotateY = function () {\n\n\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n};\n\nMatrix4.prototype.rotateZ = function () {\n\n\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n};\n\nMatrix4.prototype.rotateByAxis = function () {\n\n\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n};\n\nMatrix4.prototype.applyToBufferAttribute = function ( attribute ) {\n\n\tconsole.warn( 'THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead.' );\n\treturn attribute.applyMatrix4( this );\n\n};\n\nMatrix4.prototype.applyToVector3Array = function ( /* array, offset, length */ ) {\n\n\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n};\n\nMatrix4.prototype.makeFrustum = function ( left, right, bottom, top, near, far ) {\n\n\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n};\n\nMatrix4.prototype.getInverse = function ( matrix ) {\n\n\tconsole.warn( 'THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' );\n\treturn this.copy( matrix ).invert();\n\n};\n\n//\n\nPlane.prototype.isIntersectionLine = function ( line ) {\n\n\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\treturn this.intersectsLine( line );\n\n};\n\n//\n\nQuaternion.prototype.multiplyVector3 = function ( vector ) {\n\n\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\treturn vector.applyQuaternion( this );\n\n};\n\nQuaternion.prototype.inverse = function ( ) {\n\n\tconsole.warn( 'THREE.Quaternion: .inverse() has been renamed to invert().' );\n\treturn this.invert();\n\n};\n\n//\n\nRay.prototype.isIntersectionBox = function ( box ) {\n\n\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\treturn this.intersectsBox( box );\n\n};\n\nRay.prototype.isIntersectionPlane = function ( plane ) {\n\n\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\treturn this.intersectsPlane( plane );\n\n};\n\nRay.prototype.isIntersectionSphere = function ( sphere ) {\n\n\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\treturn this.intersectsSphere( sphere );\n\n};\n\n//\n\nTriangle.prototype.area = function () {\n\n\tconsole.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' );\n\treturn this.getArea();\n\n};\n\nTriangle.prototype.barycoordFromPoint = function ( point, target ) {\n\n\tconsole.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );\n\treturn this.getBarycoord( point, target );\n\n};\n\nTriangle.prototype.midpoint = function ( target ) {\n\n\tconsole.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' );\n\treturn this.getMidpoint( target );\n\n};\n\nTriangle.prototypenormal = function ( target ) {\n\n\tconsole.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );\n\treturn this.getNormal( target );\n\n};\n\nTriangle.prototype.plane = function ( target ) {\n\n\tconsole.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' );\n\treturn this.getPlane( target );\n\n};\n\nTriangle.barycoordFromPoint = function ( point, a, b, c, target ) {\n\n\tconsole.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );\n\treturn Triangle.getBarycoord( point, a, b, c, target );\n\n};\n\nTriangle.normal = function ( a, b, c, target ) {\n\n\tconsole.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );\n\treturn Triangle.getNormal( a, b, c, target );\n\n};\n\n//\n\nShape.prototype.extractAllPoints = function ( divisions ) {\n\n\tconsole.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' );\n\treturn this.extractPoints( divisions );\n\n};\n\nShape.prototype.extrude = function ( options ) {\n\n\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\treturn new ExtrudeGeometry( this, options );\n\n};\n\nShape.prototype.makeGeometry = function ( options ) {\n\n\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\treturn new ShapeGeometry( this, options );\n\n};\n\n//\n\nVector2.prototype.fromAttribute = function ( attribute, index, offset ) {\n\n\tconsole.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\treturn this.fromBufferAttribute( attribute, index, offset );\n\n};\n\nVector2.prototype.distanceToManhattan = function ( v ) {\n\n\tconsole.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );\n\treturn this.manhattanDistanceTo( v );\n\n};\n\nVector2.prototype.lengthManhattan = function () {\n\n\tconsole.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' );\n\treturn this.manhattanLength();\n\n};\n\n//\n\nVector3.prototype.setEulerFromRotationMatrix = function () {\n\n\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n};\n\nVector3.prototype.setEulerFromQuaternion = function () {\n\n\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n};\n\nVector3.prototype.getPositionFromMatrix = function ( m ) {\n\n\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\treturn this.setFromMatrixPosition( m );\n\n};\n\nVector3.prototype.getScaleFromMatrix = function ( m ) {\n\n\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\treturn this.setFromMatrixScale( m );\n\n};\n\nVector3.prototype.getColumnFromMatrix = function ( index, matrix ) {\n\n\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\treturn this.setFromMatrixColumn( matrix, index );\n\n};\n\nVector3.prototype.applyProjection = function ( m ) {\n\n\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\treturn this.applyMatrix4( m );\n\n};\n\nVector3.prototype.fromAttribute = function ( attribute, index, offset ) {\n\n\tconsole.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\treturn this.fromBufferAttribute( attribute, index, offset );\n\n};\n\nVector3.prototype.distanceToManhattan = function ( v ) {\n\n\tconsole.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );\n\treturn this.manhattanDistanceTo( v );\n\n};\n\nVector3.prototype.lengthManhattan = function () {\n\n\tconsole.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' );\n\treturn this.manhattanLength();\n\n};\n\n//\n\nVector4.prototype.fromAttribute = function ( attribute, index, offset ) {\n\n\tconsole.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\treturn this.fromBufferAttribute( attribute, index, offset );\n\n};\n\nVector4.prototype.lengthManhattan = function () {\n\n\tconsole.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' );\n\treturn this.manhattanLength();\n\n};\n\n//\n\nObject3D.prototype.getChildByName = function ( name ) {\n\n\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\treturn this.getObjectByName( name );\n\n};\n\nObject3D.prototype.renderDepth = function () {\n\n\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n};\n\nObject3D.prototype.translate = function ( distance, axis ) {\n\n\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\treturn this.translateOnAxis( axis, distance );\n\n};\n\nObject3D.prototype.getWorldRotation = function () {\n\n\tconsole.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' );\n\n};\n\nObject3D.prototype.applyMatrix = function ( matrix ) {\n\n\tconsole.warn( 'THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4().' );\n\treturn this.applyMatrix4( matrix );\n\n};\n\nObject.defineProperties( Object3D.prototype, {\n\n\teulerOrder: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\treturn this.rotation.order;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\tthis.rotation.order = value;\n\n\t\t}\n\t},\n\tuseQuaternion: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t}\n\t}\n\n} );\n\nMesh.prototype.setDrawMode = function () {\n\n\tconsole.error( 'THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' );\n\n};\n\nObject.defineProperties( Mesh.prototype, {\n\n\tdrawMode: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode.' );\n\t\t\treturn TrianglesDrawMode;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' );\n\n\t\t}\n\t}\n\n} );\n\nSkinnedMesh.prototype.initBones = function () {\n\n\tconsole.error( 'THREE.SkinnedMesh: initBones() has been removed.' );\n\n};\n\n//\n\nPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\tconsole.warn( 'THREE.PerspectiveCamera.setLens is deprecated. ' +\n\t\t\t'Use .setFocalLength and .filmGauge for a photographic setup.' );\n\n\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\tthis.setFocalLength( focalLength );\n\n};\n\n//\n\nObject.defineProperties( Light.prototype, {\n\tonlyShadow: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t}\n\t},\n\tshadowCameraFov: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\tthis.shadow.camera.fov = value;\n\n\t\t}\n\t},\n\tshadowCameraLeft: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\tthis.shadow.camera.left = value;\n\n\t\t}\n\t},\n\tshadowCameraRight: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\tthis.shadow.camera.right = value;\n\n\t\t}\n\t},\n\tshadowCameraTop: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\tthis.shadow.camera.top = value;\n\n\t\t}\n\t},\n\tshadowCameraBottom: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t}\n\t},\n\tshadowCameraNear: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\tthis.shadow.camera.near = value;\n\n\t\t}\n\t},\n\tshadowCameraFar: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\tthis.shadow.camera.far = value;\n\n\t\t}\n\t},\n\tshadowCameraVisible: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t}\n\t},\n\tshadowBias: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\tthis.shadow.bias = value;\n\n\t\t}\n\t},\n\tshadowDarkness: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t}\n\t},\n\tshadowMapWidth: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t}\n\t},\n\tshadowMapHeight: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t}\n\t}\n} );\n\n//\n\nObject.defineProperties( BufferAttribute.prototype, {\n\n\tlength: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\treturn this.array.length;\n\n\t\t}\n\t},\n\tdynamic: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' );\n\t\t\treturn this.usage === DynamicDrawUsage;\n\n\t\t},\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' );\n\t\t\tthis.setUsage( DynamicDrawUsage );\n\n\t\t}\n\t}\n\n} );\n\nBufferAttribute.prototype.setDynamic = function ( value ) {\n\n\tconsole.warn( 'THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.' );\n\tthis.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage );\n\treturn this;\n\n};\n\nBufferAttribute.prototype.copyIndicesArray = function ( /* indices */ ) {\n\n\tconsole.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' );\n\n},\n\nBufferAttribute.prototype.setArray = function ( /* array */ ) {\n\n\tconsole.error( 'THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' );\n\n};\n\n//\n\nBufferGeometry.prototype.addIndex = function ( index ) {\n\n\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\tthis.setIndex( index );\n\n};\n\nBufferGeometry.prototype.addAttribute = function ( name, attribute ) {\n\n\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().' );\n\n\tif ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\treturn this.setAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t}\n\n\tif ( name === 'index' ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\tthis.setIndex( attribute );\n\n\t\treturn this;\n\n\t}\n\n\treturn this.setAttribute( name, attribute );\n\n};\n\nBufferGeometry.prototype.addDrawCall = function ( start, count, indexOffset ) {\n\n\tif ( indexOffset !== undefined ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t}\n\n\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\tthis.addGroup( start, count );\n\n};\n\nBufferGeometry.prototype.clearDrawCalls = function () {\n\n\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\tthis.clearGroups();\n\n};\n\nBufferGeometry.prototype.computeOffsets = function () {\n\n\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n};\n\nBufferGeometry.prototype.removeAttribute = function ( name ) {\n\n\tconsole.warn( 'THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().' );\n\n\treturn this.deleteAttribute( name );\n\n};\n\nBufferGeometry.prototype.applyMatrix = function ( matrix ) {\n\n\tconsole.warn( 'THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4().' );\n\treturn this.applyMatrix4( matrix );\n\n};\n\nObject.defineProperties( BufferGeometry.prototype, {\n\n\tdrawcalls: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\treturn this.groups;\n\n\t\t}\n\t},\n\toffsets: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\treturn this.groups;\n\n\t\t}\n\t}\n\n} );\n\nInterleavedBuffer.prototype.setDynamic = function ( value ) {\n\n\tconsole.warn( 'THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.' );\n\tthis.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage );\n\treturn this;\n\n};\n\nInterleavedBuffer.prototype.setArray = function ( /* array */ ) {\n\n\tconsole.error( 'THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' );\n\n};\n\n//\n\nExtrudeGeometry.prototype.getArrays = function () {\n\n\tconsole.error( 'THREE.ExtrudeGeometry: .getArrays() has been removed.' );\n\n};\n\nExtrudeGeometry.prototype.addShapeList = function () {\n\n\tconsole.error( 'THREE.ExtrudeGeometry: .addShapeList() has been removed.' );\n\n};\n\nExtrudeGeometry.prototype.addShape = function () {\n\n\tconsole.error( 'THREE.ExtrudeGeometry: .addShape() has been removed.' );\n\n};\n\n//\n\nScene.prototype.dispose = function () {\n\n\tconsole.error( 'THREE.Scene: .dispose() has been removed.' );\n\n};\n\n//\n\nUniform.prototype.onUpdate = function () {\n\n\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\treturn this;\n\n};\n\n//\n\nObject.defineProperties( Material.prototype, {\n\n\twrapAround: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t}\n\t},\n\n\toverdraw: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .overdraw has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .overdraw has been removed.' );\n\n\t\t}\n\t},\n\n\twrapRGB: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapRGB has been removed.' );\n\t\t\treturn new Color();\n\n\t\t}\n\t},\n\n\tshading: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\tthis.flatShading = ( value === FlatShading );\n\n\t\t}\n\t},\n\n\tstencilMask: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' );\n\t\t\treturn this.stencilFuncMask;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' );\n\t\t\tthis.stencilFuncMask = value;\n\n\t\t}\n\t},\n\n\tvertexTangents: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .vertexTangents has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .vertexTangents has been removed.' );\n\n\t\t}\n\t},\n\n} );\n\nObject.defineProperties( ShaderMaterial.prototype, {\n\n\tderivatives: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\treturn this.extensions.derivatives;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\tthis.extensions.derivatives = value;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nWebGLRenderer.prototype.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' );\n\tthis.setRenderTarget( renderTarget );\n\tthis.clear( color, depth, stencil );\n\n};\n\nWebGLRenderer.prototype.animate = function ( callback ) {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' );\n\tthis.setAnimationLoop( callback );\n\n};\n\nWebGLRenderer.prototype.getCurrentRenderTarget = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' );\n\treturn this.getRenderTarget();\n\n};\n\nWebGLRenderer.prototype.getMaxAnisotropy = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' );\n\treturn this.capabilities.getMaxAnisotropy();\n\n};\n\nWebGLRenderer.prototype.getPrecision = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' );\n\treturn this.capabilities.precision;\n\n};\n\nWebGLRenderer.prototype.resetGLState = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' );\n\treturn this.state.reset();\n\n};\n\nWebGLRenderer.prototype.supportsFloatTextures = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\treturn this.extensions.get( 'OES_texture_float' );\n\n};\n\nWebGLRenderer.prototype.supportsHalfFloatTextures = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\treturn this.extensions.get( 'OES_texture_half_float' );\n\n};\n\nWebGLRenderer.prototype.supportsStandardDerivatives = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n};\n\nWebGLRenderer.prototype.supportsCompressedTextureS3TC = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n};\n\nWebGLRenderer.prototype.supportsCompressedTexturePVRTC = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n};\n\nWebGLRenderer.prototype.supportsBlendMinMax = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n};\n\nWebGLRenderer.prototype.supportsVertexTextures = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\treturn this.capabilities.vertexTextures;\n\n};\n\nWebGLRenderer.prototype.supportsInstancedArrays = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n};\n\nWebGLRenderer.prototype.enableScissorTest = function ( boolean ) {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\tthis.setScissorTest( boolean );\n\n};\n\nWebGLRenderer.prototype.initMaterial = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.addPrePlugin = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.addPostPlugin = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.updateShadowMap = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.setFaceCulling = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.allocTextureUnit = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .allocTextureUnit() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.setTexture = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .setTexture() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.setTexture2D = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .setTexture2D() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.setTextureCube = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .setTextureCube() has been removed.' );\n\n};\n\nWebGLRenderer.prototype.getActiveMipMapLevel = function () {\n\n\tconsole.warn( 'THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().' );\n\treturn this.getActiveMipmapLevel();\n\n};\n\nObject.defineProperties( WebGLRenderer.prototype, {\n\n\tshadowMapEnabled: {\n\t\tget: function () {\n\n\t\t\treturn this.shadowMap.enabled;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\tthis.shadowMap.enabled = value;\n\n\t\t}\n\t},\n\tshadowMapType: {\n\t\tget: function () {\n\n\t\t\treturn this.shadowMap.type;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\tthis.shadowMap.type = value;\n\n\t\t}\n\t},\n\tshadowMapCullFace: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\tcontext: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.' );\n\t\t\treturn this.getContext();\n\n\t\t}\n\t},\n\tvr: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .vr has been renamed to .xr' );\n\t\t\treturn this.xr;\n\n\t\t}\n\t},\n\tgammaInput: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' );\n\t\t\treturn false;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' );\n\n\t\t}\n\t},\n\tgammaOutput: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' );\n\t\t\treturn false;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' );\n\t\t\tthis.outputEncoding = ( value === true ) ? sRGBEncoding : LinearEncoding;\n\n\t\t}\n\t},\n\ttoneMappingWhitePoint: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' );\n\t\t\treturn 1.0;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' );\n\n\t\t}\n\t},\n\tgammaFactor: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaFactor has been removed.' );\n\t\t\treturn 2;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaFactor has been removed.' );\n\n\t\t}\n\t}\n} );\n\nObject.defineProperties( WebGLShadowMap.prototype, {\n\n\tcullFace: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function ( /* cullFace */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\trenderReverseSided: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\trenderSingleSided: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t}\n\n} );\n\nclass WebGLRenderTargetCube extends WebGLCubeRenderTarget {\n\n\tconstructor( width, height, options ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options ).' );\n\t\tsuper( width, options );\n\n\t}\n\n}\n\n//\n\nObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\twrapS: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\treturn this.texture.wrapS;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\tthis.texture.wrapS = value;\n\n\t\t}\n\t},\n\twrapT: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\treturn this.texture.wrapT;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\tthis.texture.wrapT = value;\n\n\t\t}\n\t},\n\tmagFilter: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\treturn this.texture.magFilter;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\tthis.texture.magFilter = value;\n\n\t\t}\n\t},\n\tminFilter: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\treturn this.texture.minFilter;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\tthis.texture.minFilter = value;\n\n\t\t}\n\t},\n\tanisotropy: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\treturn this.texture.anisotropy;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\tthis.texture.anisotropy = value;\n\n\t\t}\n\t},\n\toffset: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\treturn this.texture.offset;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\tthis.texture.offset = value;\n\n\t\t}\n\t},\n\trepeat: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\treturn this.texture.repeat;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\tthis.texture.repeat = value;\n\n\t\t}\n\t},\n\tformat: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\treturn this.texture.format;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\tthis.texture.format = value;\n\n\t\t}\n\t},\n\ttype: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\treturn this.texture.type;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\tthis.texture.type = value;\n\n\t\t}\n\t},\n\tgenerateMipmaps: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\treturn this.texture.generateMipmaps;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nAudio.prototype.load = function ( file ) {\n\n\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\tconst scope = this;\n\tconst audioLoader = new AudioLoader();\n\taudioLoader.load( file, function ( buffer ) {\n\n\t\tscope.setBuffer( buffer );\n\n\t} );\n\treturn this;\n\n};\n\n\nAudioAnalyser.prototype.getData = function () {\n\n\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\treturn this.getFrequencyData();\n\n};\n\n//\n\nCubeCamera.prototype.updateCubeMap = function ( renderer, scene ) {\n\n\tconsole.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' );\n\treturn this.update( renderer, scene );\n\n};\n\nCubeCamera.prototype.clear = function ( renderer, color, depth, stencil ) {\n\n\tconsole.warn( 'THREE.CubeCamera: .clear() is now .renderTarget.clear().' );\n\treturn this.renderTarget.clear( renderer, color, depth, stencil );\n\n};\n\nImageUtils.crossOrigin = undefined;\n\nImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) {\n\n\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\tconst loader = new TextureLoader();\n\tloader.setCrossOrigin( this.crossOrigin );\n\n\tconst texture = loader.load( url, onLoad, undefined, onError );\n\n\tif ( mapping ) texture.mapping = mapping;\n\n\treturn texture;\n\n};\n\nImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) {\n\n\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\tconst loader = new CubeTextureLoader();\n\tloader.setCrossOrigin( this.crossOrigin );\n\n\tconst texture = loader.load( urls, onLoad, undefined, onError );\n\n\tif ( mapping ) texture.mapping = mapping;\n\n\treturn texture;\n\n};\n\nImageUtils.loadCompressedTexture = function () {\n\n\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n};\n\nImageUtils.loadCompressedTextureCube = function () {\n\n\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n};\n\n//\n\nfunction CanvasRenderer() {\n\n\tconsole.error( 'THREE.CanvasRenderer has been removed' );\n\n}\n\n//\n\nfunction JSONLoader() {\n\n\tconsole.error( 'THREE.JSONLoader has been removed.' );\n\n}\n\n//\n\nconst SceneUtils = {\n\n\tcreateMultiMaterialObject: function ( /* geometry, materials */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );\n\n\t},\n\n\tdetach: function ( /* child, parent, scene */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );\n\n\t},\n\n\tattach: function ( /* child, scene, parent */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );\n\n\t}\n\n};\n\n//\n\nfunction LensFlare() {\n\n\tconsole.error( 'THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js' );\n\n}\n\n//\n\nclass ParametricGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tconsole.error( 'THREE.ParametricGeometry has been moved to /examples/jsm/geometries/ParametricGeometry.js' );\n\t\tsuper();\n\n\t}\n\n}\n\nclass TextGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tconsole.error( 'THREE.TextGeometry has been moved to /examples/jsm/geometries/TextGeometry.js' );\n\t\tsuper();\n\n\t}\n\n}\n\nfunction FontLoader() {\n\n\tconsole.error( 'THREE.FontLoader has been moved to /examples/jsm/loaders/FontLoader.js' );\n\n}\n\nfunction Font() {\n\n\tconsole.error( 'THREE.Font has been moved to /examples/jsm/loaders/FontLoader.js' );\n\n}\n\nfunction ImmediateRenderObject() {\n\n\tconsole.error( 'THREE.ImmediateRenderObject has been removed.' );\n\n}\n\nclass WebGLMultisampleRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width, height, options ) {\n\n\t\tconsole.error( 'THREE.WebGLMultisampleRenderTarget has been removed. Use a normal render target and set the \"samples\" property to greater 0 to enable multisampling.' );\n\t\tsuper( width, height, options );\n\t\tthis.samples = 4;\n\n\t}\n\n}\n\nclass DataTexture2DArray extends DataArrayTexture {\n\n\tconstructor( data, width, height, depth ) {\n\n\t\tconsole.warn( 'THREE.DataTexture2DArray has been renamed to DataArrayTexture.' );\n\t\tsuper( data, width, height, depth );\n\n\t}\n\n}\n\nclass DataTexture3D extends Data3DTexture {\n\n\tconstructor( data, width, height, depth ) {\n\n\t\tconsole.warn( 'THREE.DataTexture3D has been renamed to Data3DTexture.' );\n\t\tsuper( data, width, height, depth );\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\tconsole.warn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AlphaFormat, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightProbe, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, AxisHelper, BackSide, BasicDepthPacking, BasicShadowMap, BinaryTextureLoader, Bone, BooleanKeyframeTrack, BoundingBoxHelper, Box2, Box3, Box3Helper, BoxGeometry as BoxBufferGeometry, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasRenderer, CanvasTexture, CapsuleGeometry as CapsuleBufferGeometry, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry as CircleBufferGeometry, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedTexture, CompressedTextureLoader, ConeGeometry as ConeBufferGeometry, ConeGeometry, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry as CylinderBufferGeometry, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTexture2DArray, DataTexture3D, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry as DodecahedronBufferGeometry, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicBufferAttribute, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EdgesHelper, EllipseCurve, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeGeometry as ExtrudeBufferGeometry, ExtrudeGeometry, FaceColors, FileLoader, FlatShading, Float16BufferAttribute, Float32Attribute, Float32BufferAttribute, Float64Attribute, Float64BufferAttribute, FloatType, Fog, FogExp2, Font, FontLoader, FramebufferTexture, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GreaterDepth, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, HemisphereLightProbe, IcosahedronGeometry as IcosahedronBufferGeometry, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, ImmediateRenderObject, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16Attribute, Int16BufferAttribute, Int32Attribute, Int32BufferAttribute, Int8Attribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, JSONLoader, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry as LatheBufferGeometry, LatheGeometry, Layers, LensFlare, LessDepth, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LinePieces, LineSegments, LineStrip, LinearEncoding, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils as Math, MathUtils, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshFaceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiMaterial, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoColors, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry as OctahedronBufferGeometry, OctahedronGeometry, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, ParametricGeometry, Particle, ParticleBasicMaterial, ParticleSystem, ParticleSystemMaterial, Path, PerspectiveCamera, Plane, PlaneGeometry as PlaneBufferGeometry, PlaneGeometry, PlaneHelper, PointCloud, PointCloudMaterial, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry as PolyhedronBufferGeometry, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry as RingBufferGeometry, RingGeometry, SRGBColorSpace, Scene, SceneUtils, ShaderChunk, ShaderLib, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry as ShapeBufferGeometry, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, SmoothShading, Source, Sphere, SphereGeometry as SphereBufferGeometry, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry as TetrahedronBufferGeometry, TetrahedronGeometry, TextGeometry, Texture, TextureLoader, TorusGeometry as TorusBufferGeometry, TorusGeometry, TorusKnotGeometry as TorusKnotBufferGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry as TubeBufferGeometry, TubeGeometry, UVMapping, Uint16Attribute, Uint16BufferAttribute, Uint32Attribute, Uint32BufferAttribute, Uint8Attribute, Uint8BufferAttribute, Uint8ClampedAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, Vertex, VertexColors, VideoTexture, WebGL1Renderer, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCubeRenderTarget, WebGLMultipleRenderTargets, WebGLMultisampleRenderTarget, WebGLRenderTarget, WebGLRenderTargetCube, WebGLRenderer, WebGLUtils, WireframeGeometry, WireframeHelper, WrapAroundEnding, XHRLoader, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, _SRGBAFormat, sRGBEncoding };\n","var Stats = function () {\n\n\tvar mode = 0;\n\n\tvar container = document.createElement( 'div' );\n\tcontainer.style.cssText = 'position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000';\n\tcontainer.addEventListener( 'click', function ( event ) {\n\n\t\tevent.preventDefault();\n\t\tshowPanel( ++ mode % container.children.length );\n\n\t}, false );\n\n\t//\n\n\tfunction addPanel( panel ) {\n\n\t\tcontainer.appendChild( panel.dom );\n\t\treturn panel;\n\n\t}\n\n\tfunction showPanel( id ) {\n\n\t\tfor ( var i = 0; i < container.children.length; i ++ ) {\n\n\t\t\tcontainer.children[ i ].style.display = i === id ? 'block' : 'none';\n\n\t\t}\n\n\t\tmode = id;\n\n\t}\n\n\t//\n\n\tvar beginTime = ( performance || Date ).now(), prevTime = beginTime, frames = 0;\n\n\tvar fpsPanel = addPanel( new Stats.Panel( 'FPS', '#0ff', '#002' ) );\n\tvar msPanel = addPanel( new Stats.Panel( 'MS', '#0f0', '#020' ) );\n\n\tif ( self.performance && self.performance.memory ) {\n\n\t\tvar memPanel = addPanel( new Stats.Panel( 'MB', '#f08', '#201' ) );\n\n\t}\n\n\tshowPanel( 0 );\n\n\treturn {\n\n\t\tREVISION: 16,\n\n\t\tdom: container,\n\n\t\taddPanel: addPanel,\n\t\tshowPanel: showPanel,\n\n\t\tbegin: function () {\n\n\t\t\tbeginTime = ( performance || Date ).now();\n\n\t\t},\n\n\t\tend: function () {\n\n\t\t\tframes ++;\n\n\t\t\tvar time = ( performance || Date ).now();\n\n\t\t\tmsPanel.update( time - beginTime, 200 );\n\n\t\t\tif ( time >= prevTime + 1000 ) {\n\n\t\t\t\tfpsPanel.update( ( frames * 1000 ) / ( time - prevTime ), 100 );\n\n\t\t\t\tprevTime = time;\n\t\t\t\tframes = 0;\n\n\t\t\t\tif ( memPanel ) {\n\n\t\t\t\t\tvar memory = performance.memory;\n\t\t\t\t\tmemPanel.update( memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn time;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tbeginTime = this.end();\n\n\t\t},\n\n\t\t// Backwards Compatibility\n\n\t\tdomElement: container,\n\t\tsetMode: showPanel\n\n\t};\n\n};\n\nStats.Panel = function ( name, fg, bg ) {\n\n\tvar min = Infinity, max = 0, round = Math.round;\n\tvar PR = round( window.devicePixelRatio || 1 );\n\n\tvar WIDTH = 80 * PR, HEIGHT = 48 * PR,\n\t\tTEXT_X = 3 * PR, TEXT_Y = 2 * PR,\n\t\tGRAPH_X = 3 * PR, GRAPH_Y = 15 * PR,\n\t\tGRAPH_WIDTH = 74 * PR, GRAPH_HEIGHT = 30 * PR;\n\n\tvar canvas = document.createElement( 'canvas' );\n\tcanvas.width = WIDTH;\n\tcanvas.height = HEIGHT;\n\tcanvas.style.cssText = 'width:80px;height:48px';\n\n\tvar context = canvas.getContext( '2d' );\n\tcontext.font = 'bold ' + ( 9 * PR ) + 'px Helvetica,Arial,sans-serif';\n\tcontext.textBaseline = 'top';\n\n\tcontext.fillStyle = bg;\n\tcontext.fillRect( 0, 0, WIDTH, HEIGHT );\n\n\tcontext.fillStyle = fg;\n\tcontext.fillText( name, TEXT_X, TEXT_Y );\n\tcontext.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\n\n\tcontext.fillStyle = bg;\n\tcontext.globalAlpha = 0.9;\n\tcontext.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\n\n\treturn {\n\n\t\tdom: canvas,\n\n\t\tupdate: function ( value, maxValue ) {\n\n\t\t\tmin = Math.min( min, value );\n\t\t\tmax = Math.max( max, value );\n\n\t\t\tcontext.fillStyle = bg;\n\t\t\tcontext.globalAlpha = 1;\n\t\t\tcontext.fillRect( 0, 0, WIDTH, GRAPH_Y );\n\t\t\tcontext.fillStyle = fg;\n\t\t\tcontext.fillText( round( value ) + ' ' + name + ' (' + round( min ) + '-' + round( max ) + ')', TEXT_X, TEXT_Y );\n\n\t\t\tcontext.drawImage( canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT );\n\n\t\t\tcontext.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT );\n\n\t\t\tcontext.fillStyle = bg;\n\t\t\tcontext.globalAlpha = 0.9;\n\t\t\tcontext.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round( ( 1 - ( value / maxValue ) ) * GRAPH_HEIGHT ) );\n\n\t\t}\n\n\t};\n\n};\n\nexport default Stats;\n","'use strict';\nvar check = function (it) {\n return it && it.Math === Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n check(typeof this == 'object' && this) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n","'use strict';\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7;\n});\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-function-prototype-bind -- safe\n var test = (function () { /* empty */ }).bind();\n // eslint-disable-next-line no-prototype-builtins -- safe\n return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar call = Function.prototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","'use strict';\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n return function () {\n return call.apply(fn, arguments);\n };\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) === 'String' ? split(it, '') : $Object(it);\n} : $Object;\n","'use strict';\n// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n return it === null || it === undefined;\n};\n","'use strict';\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) throw new $TypeError(\"Can't call method on \" + it);\n return it;\n};\n","'use strict';\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","'use strict';\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\nvar documentAll = typeof document == 'object' && document.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nmodule.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) {\n return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n return typeof argument == 'function';\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\n\nmodule.exports = function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method];\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nvar navigator = globalThis.navigator;\nvar userAgent = navigator && navigator.userAgent;\n\nmodule.exports = userAgent ? String(userAgent) : '';\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar userAgent = require('../internals/environment-user-agent');\n\nvar process = globalThis.process;\nvar Deno = globalThis.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/environment-v8-version');\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\nvar $String = globalThis.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol('symbol detection');\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n // of course, fail.\n return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nmodule.exports = NATIVE_SYMBOL &&\n !Symbol.sham &&\n typeof Symbol.iterator == 'symbol';\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n","'use strict';\nvar $String = String;\n\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw new $TypeError(tryToString(argument) + ' is not a function');\n};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw new $TypeError(\"Can't convert object to primitive value\");\n};\n","'use strict';\nmodule.exports = false;\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(globalThis, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n globalThis[key] = value;\n } return value;\n};\n","'use strict';\nvar IS_PURE = require('../internals/is-pure');\nvar globalThis = require('../internals/global-this');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nvar SHARED = '__core-js_shared__';\nvar store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {});\n\n(store.versions || (store.versions = [])).push({\n version: '3.40.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2014-2025 Denis Pushkarev (zloirock.ru)',\n license: 'https://github.com/zloirock/core-js/blob/v3.40.0/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n","'use strict';\nvar store = require('../internals/shared-store');\n\nmodule.exports = function (key, value) {\n return store[key] || (store[key] = value || {});\n};\n","'use strict';\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.0.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Symbol = globalThis.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name)) {\n WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n ? Symbol[name]\n : createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw new $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\n\nvar document = globalThis.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a !== 7;\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n value: 42,\n writable: false\n }).prototype !== 42;\n});\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw new $TypeError($String(argument) + ' is not an object');\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n var current = $getOwnPropertyDescriptor(O, P);\n if (current && current[WRITABLE]) {\n O[P] = Attributes.value;\n Attributes = {\n configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n writable: false\n };\n }\n } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar WeakMap = globalThis.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n","'use strict';\nvar shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","'use strict';\nmodule.exports = {};\n","'use strict';\nvar NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = globalThis.TypeError;\nvar WeakMap = globalThis.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw new TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n /* eslint-disable no-self-assign -- prototype methods protection */\n store.get = store.get;\n store.has = store.has;\n store.set = store.set;\n /* eslint-enable no-self-assign -- prototype methods protection */\n set = function (it, metadata) {\n if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n store.set(it, metadata);\n return metadata;\n };\n get = function (it) {\n return store.get(it) || {};\n };\n has = function (it) {\n return store.has(it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\).*$/, '$1') + ']';\n }\n if (options && options.getter) name = 'get ' + name;\n if (options && options.setter) name = 'set ' + name;\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n else value.name = name;\n }\n if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n defineProperty(value, 'length', { value: options.arity });\n }\n try {\n if (options && hasOwn(options, 'constructor') && options.constructor) {\n if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n } else if (value.prototype) value.prototype = undefined;\n } catch (error) { /* empty */ }\n var state = enforceInternalState(value);\n if (!hasOwn(state, 'source')) {\n state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar definePropertyModule = require('../internals/object-define-property');\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nmodule.exports = function (O, key, value, options) {\n if (!options) options = {};\n var simple = options.enumerable;\n var name = options.name !== undefined ? options.name : key;\n if (isCallable(value)) makeBuiltIn(value, name, options);\n if (options.global) {\n if (simple) O[key] = value;\n else defineGlobalProperty(key, value);\n } else {\n try {\n if (!options.unsafe) delete O[key];\n else if (O[key]) simple = true;\n } catch (error) { /* empty */ }\n if (simple) O[key] = value;\n else definePropertyModule.f(O, key, {\n value: value,\n enumerable: false,\n configurable: !options.nonConfigurable,\n writable: !options.nonWritable\n });\n } return O;\n};\n","'use strict';\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n var n = +x;\n return (n > 0 ? floor : ceil)(n);\n};\n","'use strict';\nvar trunc = require('../internals/math-trunc');\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- NaN check\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n var len = toIntegerOrInfinity(argument);\n return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","'use strict';\nvar toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n if (length === 0) return !IS_INCLUDES && -1;\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el !== el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value !== value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n","'use strict';\n// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","'use strict';\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source, exceptions) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value === POLYFILL ? true\n : value === NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.dontCallGetSet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = globalThis;\n } else if (STATIC) {\n target = globalThis[TARGET] || defineGlobalProperty(TARGET, {});\n } else {\n target = globalThis[TARGET] && globalThis[TARGET].prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.dontCallGetSet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n defineBuiltIn(target, key, sourceProperty, options);\n }\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","'use strict';\nvar classof = require('../internals/classof');\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string');\n return $String(argument);\n};\n","'use strict';\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineProperty = require('../internals/object-define-property');\n\nmodule.exports = function (target, name, descriptor) {\n if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true });\n if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true });\n return defineProperty.f(target, name, descriptor);\n};\n","// `Symbol.prototype.description` getter\n// https://tc39.es/ecma262/#sec-symbol.prototype.description\n'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar toString = require('../internals/to-string');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\n\nvar NativeSymbol = globalThis.Symbol;\nvar SymbolPrototype = NativeSymbol && NativeSymbol.prototype;\n\nif (DESCRIPTORS && isCallable(NativeSymbol) && (!('description' in SymbolPrototype) ||\n // Safari 12 bug\n NativeSymbol().description !== undefined\n)) {\n var EmptyStringDescriptionStore = {};\n // wrap Symbol constructor for correct work with undefined description\n var SymbolWrapper = function Symbol() {\n var description = arguments.length < 1 || arguments[0] === undefined ? undefined : toString(arguments[0]);\n var result = isPrototypeOf(SymbolPrototype, this)\n // eslint-disable-next-line sonarjs/inconsistent-function-call -- ok\n ? new NativeSymbol(description)\n // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n : description === undefined ? NativeSymbol() : NativeSymbol(description);\n if (description === '') EmptyStringDescriptionStore[result] = true;\n return result;\n };\n\n copyConstructorProperties(SymbolWrapper, NativeSymbol);\n SymbolWrapper.prototype = SymbolPrototype;\n SymbolPrototype.constructor = SymbolWrapper;\n\n var NATIVE_SYMBOL = String(NativeSymbol('description detection')) === 'Symbol(description detection)';\n var thisSymbolValue = uncurryThis(SymbolPrototype.valueOf);\n var symbolDescriptiveString = uncurryThis(SymbolPrototype.toString);\n var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n var replace = uncurryThis(''.replace);\n var stringSlice = uncurryThis(''.slice);\n\n defineBuiltInAccessor(SymbolPrototype, 'description', {\n configurable: true,\n get: function description() {\n var symbol = thisSymbolValue(this);\n if (hasOwn(EmptyStringDescriptionStore, symbol)) return '';\n var string = symbolDescriptiveString(symbol);\n var desc = NATIVE_SYMBOL ? stringSlice(string, 7, -1) : replace(string, regexp, '$1');\n return desc === '' ? undefined : desc;\n }\n });\n\n $({ global: true, constructor: true, forced: true }, {\n Symbol: SymbolWrapper\n });\n}\n","'use strict';\nvar classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n return classof(argument) === 'Array';\n};\n","'use strict';\nvar $TypeError = TypeError;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991\n\nmodule.exports = function (it) {\n if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded');\n return it;\n};\n","'use strict';\nvar classofRaw = require('../internals/classof-raw');\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = function (fn) {\n // Nashorn bug:\n // https://github.com/zloirock/core-js/issues/1128\n // https://github.com/zloirock/core-js/issues/1130\n if (classofRaw(fn) === 'Function') return uncurryThis(fn);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar aCallable = require('../internals/a-callable');\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n aCallable(fn);\n return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","'use strict';\nvar isArray = require('../internals/is-array');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer');\nvar bind = require('../internals/function-bind-context');\n\n// `FlattenIntoArray` abstract operation\n// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray\nvar flattenIntoArray = function (target, original, source, sourceLen, start, depth, mapper, thisArg) {\n var targetIndex = start;\n var sourceIndex = 0;\n var mapFn = mapper ? bind(mapper, thisArg) : false;\n var element, elementLen;\n\n while (sourceIndex < sourceLen) {\n if (sourceIndex in source) {\n element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];\n\n if (depth > 0 && isArray(element)) {\n elementLen = lengthOfArrayLike(element);\n targetIndex = flattenIntoArray(target, original, element, elementLen, targetIndex, depth - 1) - 1;\n } else {\n doesNotExceedSafeInteger(targetIndex + 1);\n target[targetIndex] = element;\n }\n\n targetIndex++;\n }\n sourceIndex++;\n }\n return targetIndex;\n};\n\nmodule.exports = flattenIntoArray;\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof');\nvar getBuiltIn = require('../internals/get-built-in');\nvar inspectSource = require('../internals/inspect-source');\n\nvar noop = function () { /* empty */ };\nvar construct = getBuiltIn('Reflect', 'construct');\nvar constructorRegExp = /^\\s*(?:class|function)\\b/;\nvar exec = uncurryThis(constructorRegExp.exec);\nvar INCORRECT_TO_STRING = !constructorRegExp.test(noop);\n\nvar isConstructorModern = function isConstructor(argument) {\n if (!isCallable(argument)) return false;\n try {\n construct(noop, [], argument);\n return true;\n } catch (error) {\n return false;\n }\n};\n\nvar isConstructorLegacy = function isConstructor(argument) {\n if (!isCallable(argument)) return false;\n switch (classof(argument)) {\n case 'AsyncFunction':\n case 'GeneratorFunction':\n case 'AsyncGeneratorFunction': return false;\n }\n try {\n // we can't check .prototype since constructors produced by .bind haven't it\n // `Function#toString` throws on some built-it function in some legacy engines\n // (for example, `DOMQuad` and similar in FF41-)\n return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument));\n } catch (error) {\n return true;\n }\n};\n\nisConstructorLegacy.sham = true;\n\n// `IsConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-isconstructor\nmodule.exports = !construct || fails(function () {\n var called;\n return isConstructorModern(isConstructorModern.call)\n || !isConstructorModern(Object)\n || !isConstructorModern(function () { called = true; })\n || called;\n}) ? isConstructorLegacy : isConstructorModern;\n","'use strict';\nvar isArray = require('../internals/is-array');\nvar isConstructor = require('../internals/is-constructor');\nvar isObject = require('../internals/is-object');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\nvar $Array = Array;\n\n// a part of `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (isConstructor(C) && (C === $Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? $Array : C;\n};\n","'use strict';\nvar arraySpeciesConstructor = require('../internals/array-species-constructor');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar flattenIntoArray = require('../internals/flatten-into-array');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\n// `Array.prototype.flat` method\n// https://tc39.es/ecma262/#sec-array.prototype.flat\n$({ target: 'Array', proto: true }, {\n flat: function flat(/* depthArg = 1 */) {\n var depthArg = arguments.length ? arguments[0] : undefined;\n var O = toObject(this);\n var sourceLen = lengthOfArrayLike(O);\n var A = arraySpeciesCreate(O, 0);\n A.length = flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toIntegerOrInfinity(depthArg));\n return A;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar flattenIntoArray = require('../internals/flatten-into-array');\nvar aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\n// `Array.prototype.flatMap` method\n// https://tc39.es/ecma262/#sec-array.prototype.flatmap\n$({ target: 'Array', proto: true }, {\n flatMap: function flatMap(callbackfn /* , thisArg */) {\n var O = toObject(this);\n var sourceLen = lengthOfArrayLike(O);\n var A;\n aCallable(callbackfn);\n A = arraySpeciesCreate(O, 0);\n A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return A;\n }\n});\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","'use strict';\n/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar definePropertiesModule = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n // eslint-disable-next-line no-useless-assignment -- avoid memory leak\n activeXDocument = null;\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = typeof document != 'undefined'\n ? document.domain && activeXDocument\n ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n : NullProtoObjectViaIFrame()\n : NullProtoObjectViaActiveX(activeXDocument); // WSH\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar defineProperty = require('../internals/object-define-property').f;\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] === undefined) {\n defineProperty(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar fails = require('../internals/fails');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// FF99+ bug\nvar BROKEN_ON_SPARSE = fails(function () {\n // eslint-disable-next-line es/no-array-prototype-includes -- detection\n return !Array(1).includes();\n});\n\n// `Array.prototype.includes` method\n// https://tc39.es/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\nvar $TypeError = TypeError;\n\nvar REDUCE_EMPTY = 'Reduce of empty array with no initial value';\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = lengthOfArrayLike(O);\n aCallable(callbackfn);\n if (length === 0 && argumentsLength < 2) throw new $TypeError(REDUCE_EMPTY);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw new $TypeError(REDUCE_EMPTY);\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call -- required for testing\n method.call(null, argument || function () { return 1; }, 1);\n });\n};\n","'use strict';\n/* global Bun, Deno -- detection */\nvar globalThis = require('../internals/global-this');\nvar userAgent = require('../internals/environment-user-agent');\nvar classof = require('../internals/classof-raw');\n\nvar userAgentStartsWith = function (string) {\n return userAgent.slice(0, string.length) === string;\n};\n\nmodule.exports = (function () {\n if (userAgentStartsWith('Bun/')) return 'BUN';\n if (userAgentStartsWith('Cloudflare-Workers')) return 'CLOUDFLARE';\n if (userAgentStartsWith('Deno/')) return 'DENO';\n if (userAgentStartsWith('Node.js/')) return 'NODE';\n if (globalThis.Bun && typeof Bun.version == 'string') return 'BUN';\n if (globalThis.Deno && typeof Deno.version == 'object') return 'DENO';\n if (classof(globalThis.process) === 'process') return 'NODE';\n if (globalThis.window && globalThis.document) return 'BROWSER';\n return 'REST';\n})();\n","'use strict';\nvar ENVIRONMENT = require('../internals/environment');\n\nmodule.exports = ENVIRONMENT === 'NODE';\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar CHROME_VERSION = require('../internals/environment-v8-version');\nvar IS_NODE = require('../internals/environment-is-node');\n\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\nvar FORCED = CHROME_BUG || !arrayMethodIsStrict('reduce');\n\n// `Array.prototype.reduce` method\n// https://tc39.es/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: FORCED }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n var length = arguments.length;\n return $reduce(this, callbackfn, length, length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduceRight = require('../internals/array-reduce').right;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar CHROME_VERSION = require('../internals/environment-v8-version');\nvar IS_NODE = require('../internals/environment-is-node');\n\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\nvar FORCED = CHROME_BUG || !arrayMethodIsStrict('reduceRight');\n\n// `Array.prototype.reduceRight` method\n// https://tc39.es/ecma262/#sec-array.prototype.reduceright\n$({ target: 'Array', proto: true, forced: FORCED }, {\n reduceRight: function reduceRight(callbackfn /* , initialValue */) {\n return $reduceRight(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (O, P) {\n if (!delete O[P]) throw new $TypeError('Cannot delete property ' + tryToString(P) + ' of ' + tryToString(O));\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis([].slice);\n","'use strict';\nvar arraySlice = require('../internals/array-slice');\n\nvar floor = Math.floor;\n\nvar sort = function (array, comparefn) {\n var length = array.length;\n\n if (length < 8) {\n // insertion sort\n var i = 1;\n var element, j;\n\n while (i < length) {\n j = i;\n element = array[i];\n while (j && comparefn(array[j - 1], element) > 0) {\n array[j] = array[--j];\n }\n if (j !== i++) array[j] = element;\n }\n } else {\n // merge sort\n var middle = floor(length / 2);\n var left = sort(arraySlice(array, 0, middle), comparefn);\n var right = sort(arraySlice(array, middle), comparefn);\n var llength = left.length;\n var rlength = right.length;\n var lindex = 0;\n var rindex = 0;\n\n while (lindex < llength || rindex < rlength) {\n array[lindex + rindex] = (lindex < llength && rindex < rlength)\n ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]\n : lindex < llength ? left[lindex++] : right[rindex++];\n }\n }\n\n return array;\n};\n\nmodule.exports = sort;\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\nvar firefox = userAgent.match(/firefox\\/(\\d+)/i);\n\nmodule.exports = !!firefox && +firefox[1];\n","'use strict';\nvar UA = require('../internals/environment-user-agent');\n\nmodule.exports = /MSIE|Trident/.test(UA);\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\nvar webkit = userAgent.match(/AppleWebKit\\/(\\d+)\\./);\n\nmodule.exports = !!webkit && +webkit[1];\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar deletePropertyOrThrow = require('../internals/delete-property-or-throw');\nvar toString = require('../internals/to-string');\nvar fails = require('../internals/fails');\nvar internalSort = require('../internals/array-sort');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar FF = require('../internals/environment-ff-version');\nvar IE_OR_EDGE = require('../internals/environment-is-ie-or-edge');\nvar V8 = require('../internals/environment-v8-version');\nvar WEBKIT = require('../internals/environment-webkit-version');\n\nvar test = [];\nvar nativeSort = uncurryThis(test.sort);\nvar push = uncurryThis(test.push);\n\n// IE8-\nvar FAILS_ON_UNDEFINED = fails(function () {\n test.sort(undefined);\n});\n// V8 bug\nvar FAILS_ON_NULL = fails(function () {\n test.sort(null);\n});\n// Old WebKit\nvar STRICT_METHOD = arrayMethodIsStrict('sort');\n\nvar STABLE_SORT = !fails(function () {\n // feature detection can be too slow, so check engines versions\n if (V8) return V8 < 70;\n if (FF && FF > 3) return;\n if (IE_OR_EDGE) return true;\n if (WEBKIT) return WEBKIT < 603;\n\n var result = '';\n var code, chr, value, index;\n\n // generate an array with more 512 elements (Chakra and old V8 fails only in this case)\n for (code = 65; code < 76; code++) {\n chr = String.fromCharCode(code);\n\n switch (code) {\n case 66: case 69: case 70: case 72: value = 3; break;\n case 68: case 71: value = 4; break;\n default: value = 2;\n }\n\n for (index = 0; index < 47; index++) {\n test.push({ k: chr + index, v: value });\n }\n }\n\n test.sort(function (a, b) { return b.v - a.v; });\n\n for (index = 0; index < test.length; index++) {\n chr = test[index].k.charAt(0);\n if (result.charAt(result.length - 1) !== chr) result += chr;\n }\n\n return result !== 'DGBEFHACIJK';\n});\n\nvar FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD || !STABLE_SORT;\n\nvar getSortCompare = function (comparefn) {\n return function (x, y) {\n if (y === undefined) return -1;\n if (x === undefined) return 1;\n if (comparefn !== undefined) return +comparefn(x, y) || 0;\n return toString(x) > toString(y) ? 1 : -1;\n };\n};\n\n// `Array.prototype.sort` method\n// https://tc39.es/ecma262/#sec-array.prototype.sort\n$({ target: 'Array', proto: true, forced: FORCED }, {\n sort: function sort(comparefn) {\n if (comparefn !== undefined) aCallable(comparefn);\n\n var array = toObject(this);\n\n if (STABLE_SORT) return comparefn === undefined ? nativeSort(array) : nativeSort(array, comparefn);\n\n var items = [];\n var arrayLength = lengthOfArrayLike(array);\n var itemsLength, index;\n\n for (index = 0; index < arrayLength; index++) {\n if (index in array) push(items, array[index]);\n }\n\n internalSort(items, getSortCompare(comparefn));\n\n itemsLength = lengthOfArrayLike(items);\n index = 0;\n\n while (index < itemsLength) array[index] = items[index++];\n while (index < arrayLength) deletePropertyOrThrow(array, index++);\n\n return array;\n }\n});\n","'use strict';\n// this method was added to unscopables after implementation\n// in popular engines, so it's moved to a separate module\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('flat');\n","'use strict';\n// this method was added to unscopables after implementation\n// in popular engines, so it's moved to a separate module\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('flatMap');\n","'use strict';\nvar $ = require('../internals/export');\n\n// eslint-disable-next-line es/no-math-hypot -- required for testing\nvar $hypot = Math.hypot;\nvar abs = Math.abs;\nvar sqrt = Math.sqrt;\n\n// Chrome 77 bug\n// https://bugs.chromium.org/p/v8/issues/detail?id=9546\nvar FORCED = !!$hypot && $hypot(Infinity, NaN) !== Infinity;\n\n// `Math.hypot` method\n// https://tc39.es/ecma262/#sec-math.hypot\n$({ target: 'Math', stat: true, arity: 2, forced: FORCED }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n hypot: function hypot(value1, value2) {\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * sqrt(sum);\n }\n});\n","'use strict';\nmodule.exports = {};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","'use strict';\nvar classof = require('../internals/classof');\nvar getMethod = require('../internals/get-method');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR)\n || getMethod(it, '@@iterator')\n || Iterators[classof(it)];\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument, usingIterator) {\n var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));\n throw new $TypeError(tryToString(argument) + ' is not iterable');\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar getMethod = require('../internals/get-method');\n\nmodule.exports = function (iterator, kind, value) {\n var innerResult, innerError;\n anObject(iterator);\n try {\n innerResult = getMethod(iterator, 'return');\n if (!innerResult) {\n if (kind === 'throw') throw value;\n return value;\n }\n innerResult = call(innerResult, iterator);\n } catch (error) {\n innerError = true;\n innerResult = error;\n }\n if (kind === 'throw') throw value;\n if (innerError) throw innerResult;\n anObject(innerResult);\n return value;\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar $TypeError = TypeError;\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar ResultPrototype = Result.prototype;\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_RECORD = !!(options && options.IS_RECORD);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator, 'normal', condition);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_RECORD) {\n iterator = iterable.iterator;\n } else if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n }\n iterator = getIterator(iterable, iterFn);\n }\n\n next = IS_RECORD ? iterable.next : iterator.next;\n while (!(step = call(next, iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor(0, value));\n else object[key] = value;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar iterate = require('../internals/iterate');\nvar createProperty = require('../internals/create-property');\n\n// `Object.fromEntries` method\n// https://tc39.es/ecma262/#sec-object.fromentries\n$({ target: 'Object', stat: true }, {\n fromEntries: function fromEntries(iterable) {\n var obj = {};\n iterate(iterable, function (k, v) {\n createProperty(obj, k, v);\n }, { AS_ENTRIES: true });\n return obj;\n }\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\n\nmodule.exports = function (object, key, method) {\n try {\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));\n } catch (error) { /* empty */ }\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nmodule.exports = function (argument) {\n return isObject(argument) || argument === null;\n};\n","'use strict';\nvar isPossiblePrototype = require('../internals/is-possible-prototype');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument) {\n if (isPossiblePrototype(argument)) return argument;\n throw new $TypeError(\"Can't set \" + $String(argument) + ' as a prototype');\n};\n","'use strict';\n/* eslint-disable no-proto -- safe */\nvar uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');\nvar isObject = require('../internals/is-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n// eslint-disable-next-line es/no-object-setprototypeof -- safe\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set');\n setter(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n requireObjectCoercible(O);\n aPossiblePrototype(proto);\n if (!isObject(O)) return O;\n if (CORRECT_SETTER) setter(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","'use strict';\nvar defineProperty = require('../internals/object-define-property').f;\nvar hasOwn = require('../internals/has-own-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (target, TAG, STATIC) {\n if (target && !STATIC) target = target.prototype;\n if (target && !hasOwn(target, TO_STRING_TAG)) {\n defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineBuiltInAccessor(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","'use strict';\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it, Prototype) {\n if (isPrototypeOf(Prototype, it)) return it;\n throw new $TypeError('Incorrect invocation');\n};\n","'use strict';\nvar isConstructor = require('../internals/is-constructor');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsConstructor(argument) is true`\nmodule.exports = function (argument) {\n if (isConstructor(argument)) return argument;\n throw new $TypeError(tryToString(argument) + ' is not a constructor');\n};\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar aConstructor = require('../internals/a-constructor');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || isNullOrUndefined(S = anObject(C)[SPECIES]) ? defaultConstructor : aConstructor(S);\n};\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar call = FunctionPrototype.call;\n\n// eslint-disable-next-line es/no-function-prototype-bind, es/no-reflect -- safe\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () {\n return call.apply(apply, arguments);\n});\n","'use strict';\nvar $TypeError = TypeError;\n\nmodule.exports = function (passed, required) {\n if (passed < required) throw new $TypeError('Not enough arguments');\n return passed;\n};\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\n// eslint-disable-next-line redos/no-vulnerable -- safe\nmodule.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent);\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar apply = require('../internals/function-apply');\nvar bind = require('../internals/function-bind-context');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar fails = require('../internals/fails');\nvar html = require('../internals/html');\nvar arraySlice = require('../internals/array-slice');\nvar createElement = require('../internals/document-create-element');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar IS_IOS = require('../internals/environment-is-ios');\nvar IS_NODE = require('../internals/environment-is-node');\n\nvar set = globalThis.setImmediate;\nvar clear = globalThis.clearImmediate;\nvar process = globalThis.process;\nvar Dispatch = globalThis.Dispatch;\nvar Function = globalThis.Function;\nvar MessageChannel = globalThis.MessageChannel;\nvar String = globalThis.String;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar $location, defer, channel, port;\n\nfails(function () {\n // Deno throws a ReferenceError on `location` access without `--location` flag\n $location = globalThis.location;\n});\n\nvar run = function (id) {\n if (hasOwn(queue, id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar eventListener = function (event) {\n run(event.data);\n};\n\nvar globalPostMessageDefer = function (id) {\n // old engines have not location.origin\n globalThis.postMessage(String(id), $location.protocol + '//' + $location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = function setImmediate(handler) {\n validateArgumentsLength(arguments.length, 1);\n var fn = isCallable(handler) ? handler : Function(handler);\n var args = arraySlice(arguments, 1);\n queue[++counter] = function () {\n apply(fn, undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (IS_NODE) {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = eventListener;\n defer = bind(port.postMessage, port);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (\n globalThis.addEventListener &&\n isCallable(globalThis.postMessage) &&\n !globalThis.importScripts &&\n $location && $location.protocol !== 'file:' &&\n !fails(globalPostMessageDefer)\n ) {\n defer = globalPostMessageDefer;\n globalThis.addEventListener('message', eventListener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar DESCRIPTORS = require('../internals/descriptors');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Avoid NodeJS experimental warning\nmodule.exports = function (name) {\n if (!DESCRIPTORS) return globalThis[name];\n var descriptor = getOwnPropertyDescriptor(globalThis, name);\n return descriptor && descriptor.value;\n};\n","'use strict';\nvar Queue = function () {\n this.head = null;\n this.tail = null;\n};\n\nQueue.prototype = {\n add: function (item) {\n var entry = { item: item, next: null };\n var tail = this.tail;\n if (tail) tail.next = entry;\n else this.head = entry;\n this.tail = entry;\n },\n get: function () {\n var entry = this.head;\n if (entry) {\n var next = this.head = entry.next;\n if (next === null) this.tail = null;\n return entry.item;\n }\n }\n};\n\nmodule.exports = Queue;\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\nmodule.exports = /ipad|iphone|ipod/i.test(userAgent) && typeof Pebble != 'undefined';\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\nmodule.exports = /web0s(?!.*chrome)/i.test(userAgent);\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar safeGetBuiltIn = require('../internals/safe-get-built-in');\nvar bind = require('../internals/function-bind-context');\nvar macrotask = require('../internals/task').set;\nvar Queue = require('../internals/queue');\nvar IS_IOS = require('../internals/environment-is-ios');\nvar IS_IOS_PEBBLE = require('../internals/environment-is-ios-pebble');\nvar IS_WEBOS_WEBKIT = require('../internals/environment-is-webos-webkit');\nvar IS_NODE = require('../internals/environment-is-node');\n\nvar MutationObserver = globalThis.MutationObserver || globalThis.WebKitMutationObserver;\nvar document = globalThis.document;\nvar process = globalThis.process;\nvar Promise = globalThis.Promise;\nvar microtask = safeGetBuiltIn('queueMicrotask');\nvar notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!microtask) {\n var queue = new Queue();\n\n var flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (fn = queue.get()) try {\n fn();\n } catch (error) {\n if (queue.head) notify();\n throw error;\n }\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898\n if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true });\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (!IS_IOS_PEBBLE && Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise.resolve(undefined);\n // workaround of WebKit ~ iOS Safari 10.1 bug\n promise.constructor = Promise;\n then = bind(promise.then, promise);\n notify = function () {\n then(flush);\n };\n // Node.js without promises\n } else if (IS_NODE) {\n notify = function () {\n process.nextTick(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessage\n // - onreadystatechange\n // - setTimeout\n } else {\n // `webpack` dev server bug on IE global methods - use bind(fn, global)\n macrotask = bind(macrotask, globalThis);\n notify = function () {\n macrotask(flush);\n };\n }\n\n microtask = function (fn) {\n if (!queue.head) notify();\n queue.add(fn);\n };\n}\n\nmodule.exports = microtask;\n","'use strict';\nmodule.exports = function (a, b) {\n try {\n // eslint-disable-next-line no-console -- safe\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n } catch (error) { /* empty */ }\n};\n","'use strict';\nmodule.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nmodule.exports = globalThis.Promise;\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar isCallable = require('../internals/is-callable');\nvar isForced = require('../internals/is-forced');\nvar inspectSource = require('../internals/inspect-source');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar ENVIRONMENT = require('../internals/environment');\nvar IS_PURE = require('../internals/is-pure');\nvar V8_VERSION = require('../internals/environment-v8-version');\n\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\nvar SPECIES = wellKnownSymbol('species');\nvar SUBCLASSING = false;\nvar NATIVE_PROMISE_REJECTION_EVENT = isCallable(globalThis.PromiseRejectionEvent);\n\nvar FORCED_PROMISE_CONSTRUCTOR = isForced('Promise', function () {\n var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(NativePromiseConstructor);\n var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(NativePromiseConstructor);\n // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // We can't detect it synchronously, so just check versions\n if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION === 66) return true;\n // We need Promise#{ catch, finally } in the pure version for preventing prototype pollution\n if (IS_PURE && !(NativePromisePrototype['catch'] && NativePromisePrototype['finally'])) return true;\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (!V8_VERSION || V8_VERSION < 51 || !/native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) {\n // Detect correctness of subclassing with @@species support\n var promise = new NativePromiseConstructor(function (resolve) { resolve(1); });\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES] = FakePromise;\n SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise;\n if (!SUBCLASSING) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n } return !GLOBAL_CORE_JS_PROMISE && (ENVIRONMENT === 'BROWSER' || ENVIRONMENT === 'DENO') && !NATIVE_PROMISE_REJECTION_EVENT;\n});\n\nmodule.exports = {\n CONSTRUCTOR: FORCED_PROMISE_CONSTRUCTOR,\n REJECTION_EVENT: NATIVE_PROMISE_REJECTION_EVENT,\n SUBCLASSING: SUBCLASSING\n};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\n\nvar $TypeError = TypeError;\n\nvar PromiseCapability = function (C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw new $TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aCallable(resolve);\n this.reject = aCallable(reject);\n};\n\n// `NewPromiseCapability` abstract operation\n// https://tc39.es/ecma262/#sec-newpromisecapability\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar IS_NODE = require('../internals/environment-is-node');\nvar globalThis = require('../internals/global-this');\nvar call = require('../internals/function-call');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar aCallable = require('../internals/a-callable');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar perform = require('../internals/perform');\nvar Queue = require('../internals/queue');\nvar InternalStateModule = require('../internals/internal-state');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar PromiseConstructorDetection = require('../internals/promise-constructor-detection');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\n\nvar PROMISE = 'Promise';\nvar FORCED_PROMISE_CONSTRUCTOR = PromiseConstructorDetection.CONSTRUCTOR;\nvar NATIVE_PROMISE_REJECTION_EVENT = PromiseConstructorDetection.REJECTION_EVENT;\nvar NATIVE_PROMISE_SUBCLASSING = PromiseConstructorDetection.SUBCLASSING;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar setInternalState = InternalStateModule.set;\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\nvar PromiseConstructor = NativePromiseConstructor;\nvar PromisePrototype = NativePromisePrototype;\nvar TypeError = globalThis.TypeError;\nvar document = globalThis.document;\nvar process = globalThis.process;\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\n\nvar DISPATCH_EVENT = !!(document && document.createEvent && globalThis.dispatchEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\n\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && isCallable(then = it.then) ? then : false;\n};\n\nvar callReaction = function (reaction, state) {\n var value = state.value;\n var ok = state.state === FULFILLED;\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(new TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n call(then, result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n};\n\nvar notify = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n microtask(function () {\n var reactions = state.reactions;\n var reaction;\n while (reaction = reactions.get()) {\n callReaction(reaction, state);\n }\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n globalThis.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_PROMISE_REJECTION_EVENT && (handler = globalThis['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n call(task, globalThis, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n call(task, globalThis, function () {\n var promise = state.facade;\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n};\n\nvar internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw new TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n call(then, value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED_PROMISE_CONSTRUCTOR) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromisePrototype);\n aCallable(executor);\n call(Internal, this);\n var state = getInternalPromiseState(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n\n PromisePrototype = PromiseConstructor.prototype;\n\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: new Queue(),\n rejection: false,\n state: PENDING,\n value: null\n });\n };\n\n // `Promise.prototype.then` method\n // https://tc39.es/ecma262/#sec-promise.prototype.then\n Internal.prototype = defineBuiltIn(PromisePrototype, 'then', function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n state.parent = true;\n reaction.ok = isCallable(onFulfilled) ? onFulfilled : true;\n reaction.fail = isCallable(onRejected) && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n if (state.state === PENDING) state.reactions.add(reaction);\n else microtask(function () {\n callReaction(reaction, state);\n });\n return reaction.promise;\n });\n\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalPromiseState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && isCallable(NativePromiseConstructor) && NativePromisePrototype !== Object.prototype) {\n nativeThen = NativePromisePrototype.then;\n\n if (!NATIVE_PROMISE_SUBCLASSING) {\n // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs\n defineBuiltIn(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n call(nativeThen, that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n }\n\n // make `.constructor === Promise` work for native promise-based APIs\n try {\n delete NativePromisePrototype.constructor;\n } catch (error) { /* empty */ }\n\n // make `instanceof Promise` work for native promise-based APIs\n if (setPrototypeOf) {\n setPrototypeOf(NativePromisePrototype, PromisePrototype);\n }\n }\n}\n\n// `Promise` constructor\n// https://tc39.es/ecma262/#sec-promise-executor\n$({ global: true, constructor: true, wrap: true, forced: FORCED_PROMISE_CONSTRUCTOR }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n try {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n } catch (error) { return false; } // workaround of old WebKit + `eval` bug\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","'use strict';\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\n\nmodule.exports = FORCED_PROMISE_CONSTRUCTOR || !checkCorrectnessOfIteration(function (iterable) {\n NativePromiseConstructor.all(iterable).then(undefined, function () { /* empty */ });\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\n// `Promise.all` method\n// https://tc39.es/ecma262/#sec-promise.all\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aCallable(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n remaining++;\n call($promiseResolve, C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar defineBuiltIn = require('../internals/define-built-in');\n\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\n\n// `Promise.prototype.catch` method\n// https://tc39.es/ecma262/#sec-promise.prototype.catch\n$({ target: 'Promise', proto: true, forced: FORCED_PROMISE_CONSTRUCTOR, real: true }, {\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n});\n\n// makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`\nif (!IS_PURE && isCallable(NativePromiseConstructor)) {\n var method = getBuiltIn('Promise').prototype['catch'];\n if (NativePromisePrototype['catch'] !== method) {\n defineBuiltIn(NativePromisePrototype, 'catch', method, { unsafe: true });\n }\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\n// `Promise.race` method\n// https://tc39.es/ecma262/#sec-promise.race\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aCallable(C.resolve);\n iterate(iterable, function (promise) {\n call($promiseResolve, C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\n\n// `Promise.reject` method\n// https://tc39.es/ecma262/#sec-promise.reject\n$({ target: 'Promise', stat: true, forced: FORCED_PROMISE_CONSTRUCTOR }, {\n reject: function reject(r) {\n var capability = newPromiseCapabilityModule.f(this);\n var capabilityReject = capability.reject;\n capabilityReject(r);\n return capability.promise;\n }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar IS_PURE = require('../internals/is-pure');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\nvar promiseResolve = require('../internals/promise-resolve');\n\nvar PromiseConstructorWrapper = getBuiltIn('Promise');\nvar CHECK_WRAPPER = IS_PURE && !FORCED_PROMISE_CONSTRUCTOR;\n\n// `Promise.resolve` method\n// https://tc39.es/ecma262/#sec-promise.resolve\n$({ target: 'Promise', stat: true, forced: IS_PURE || FORCED_PROMISE_CONSTRUCTOR }, {\n resolve: function resolve(x) {\n return promiseResolve(CHECK_WRAPPER && this === PromiseConstructorWrapper ? NativePromiseConstructor : this, x);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar fails = require('../internals/fails');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar speciesConstructor = require('../internals/species-constructor');\nvar promiseResolve = require('../internals/promise-resolve');\nvar defineBuiltIn = require('../internals/define-built-in');\n\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\n\n// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829\nvar NON_GENERIC = !!NativePromiseConstructor && fails(function () {\n // eslint-disable-next-line unicorn/no-thenable -- required for testing\n NativePromisePrototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });\n});\n\n// `Promise.prototype.finally` method\n// https://tc39.es/ecma262/#sec-promise.prototype.finally\n$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {\n 'finally': function (onFinally) {\n var C = speciesConstructor(this, getBuiltIn('Promise'));\n var isFunction = isCallable(onFinally);\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n }\n});\n\n// makes sure that native promise-based APIs `Promise#finally` properly works with patched `Promise#then`\nif (!IS_PURE && isCallable(NativePromiseConstructor)) {\n var method = getBuiltIn('Promise').prototype['finally'];\n if (NativePromisePrototype['finally'] !== method) {\n defineBuiltIn(NativePromisePrototype, 'finally', method, { unsafe: true });\n }\n}\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n isCallable(NewTarget = dummy.constructor) &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.es/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) === 'RegExp');\n};\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.hasIndices) result += 'd';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.unicodeSets) result += 'v';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar hasOwn = require('../internals/has-own-property');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar regExpFlags = require('../internals/regexp-flags');\n\nvar RegExpPrototype = RegExp.prototype;\n\nmodule.exports = function (R) {\n var flags = R.flags;\n return flags === undefined && !('flags' in RegExpPrototype) && !hasOwn(R, 'flags') && isPrototypeOf(RegExpPrototype, R)\n ? call(regExpFlags, R) : flags;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\n// babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\nvar $RegExp = globalThis.RegExp;\n\nvar UNSUPPORTED_Y = fails(function () {\n var re = $RegExp('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') !== null;\n});\n\n// UC Browser bug\n// https://github.com/zloirock/core-js/issues/1008\nvar MISSED_STICKY = UNSUPPORTED_Y || fails(function () {\n return !$RegExp('a', 'y').sticky;\n});\n\nvar BROKEN_CARET = UNSUPPORTED_Y || fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = $RegExp('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') !== null;\n});\n\nmodule.exports = {\n BROKEN_CARET: BROKEN_CARET,\n MISSED_STICKY: MISSED_STICKY,\n UNSUPPORTED_Y: UNSUPPORTED_Y\n};\n","'use strict';\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (Target, Source, key) {\n key in Target || defineProperty(Target, key, {\n configurable: true,\n get: function () { return Source[key]; },\n set: function (it) { Source[key] = it; }\n });\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\n// babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError\nvar $RegExp = globalThis.RegExp;\n\nmodule.exports = fails(function () {\n var re = $RegExp('.', 's');\n return !(re.dotAll && re.test('\\n') && re.flags === 's');\n});\n","'use strict';\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\n// babel-minify and Closure Compiler transpiles RegExp('(?b)', 'g') -> /(?b)/g and it causes SyntaxError\nvar $RegExp = globalThis.RegExp;\n\nmodule.exports = fails(function () {\n var re = $RegExp('(?b)', 'g');\n return re.exec('b').groups.a !== 'b' ||\n 'b'.replace(re, '$c') !== 'bc';\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar create = require('../internals/object-create');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar isRegExp = require('../internals/is-regexp');\nvar toString = require('../internals/to-string');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar proxyAccessor = require('../internals/proxy-accessor');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar fails = require('../internals/fails');\nvar hasOwn = require('../internals/has-own-property');\nvar enforceInternalState = require('../internals/internal-state').enforce;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = globalThis.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar SyntaxError = globalThis.SyntaxError;\nvar exec = uncurryThis(RegExpPrototype.exec);\nvar charAt = uncurryThis(''.charAt);\nvar replace = uncurryThis(''.replace);\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar stringSlice = uncurryThis(''.slice);\n// TODO: Use only proper RegExpIdentifierName\nvar IS_NCG = /^\\?<[^\\s\\d!#%&*+<=>@^][^\\s!#%&*+<=>@^]*>/;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar MISSED_STICKY = stickyHelpers.MISSED_STICKY;\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar BASE_FORCED = DESCRIPTORS &&\n (!CORRECT_NEW || MISSED_STICKY || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails(function () {\n re2[MATCH] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n // eslint-disable-next-line sonarjs/inconsistent-function-call -- required for testing\n return NativeRegExp(re1) !== re1 || NativeRegExp(re2) === re2 || String(NativeRegExp(re1, 'i')) !== '/a/i';\n }));\n\nvar handleDotAll = function (string) {\n var length = string.length;\n var index = 0;\n var result = '';\n var brackets = false;\n var chr;\n for (; index <= length; index++) {\n chr = charAt(string, index);\n if (chr === '\\\\') {\n result += chr + charAt(string, ++index);\n continue;\n }\n if (!brackets && chr === '.') {\n result += '[\\\\s\\\\S]';\n } else {\n if (chr === '[') {\n brackets = true;\n } else if (chr === ']') {\n brackets = false;\n } result += chr;\n }\n } return result;\n};\n\nvar handleNCG = function (string) {\n var length = string.length;\n var index = 0;\n var result = '';\n var named = [];\n var names = create(null);\n var brackets = false;\n var ncg = false;\n var groupid = 0;\n var groupname = '';\n var chr;\n for (; index <= length; index++) {\n chr = charAt(string, index);\n if (chr === '\\\\') {\n chr += charAt(string, ++index);\n } else if (chr === ']') {\n brackets = false;\n } else if (!brackets) switch (true) {\n case chr === '[':\n brackets = true;\n break;\n case chr === '(':\n result += chr;\n // ignore non-capturing groups\n if (stringSlice(string, index + 1, index + 3) === '?:') {\n continue;\n }\n if (exec(IS_NCG, stringSlice(string, index + 1))) {\n index += 2;\n ncg = true;\n }\n groupid++;\n continue;\n case chr === '>' && ncg:\n if (groupname === '' || hasOwn(names, groupname)) {\n throw new SyntaxError('Invalid capture group name');\n }\n names[groupname] = true;\n named[named.length] = [groupname, groupid];\n ncg = false;\n groupname = '';\n continue;\n }\n if (ncg) groupname += chr;\n else result += chr;\n } return [result, named];\n};\n\n// `RegExp` constructor\n// https://tc39.es/ecma262/#sec-regexp-constructor\nif (isForced('RegExp', BASE_FORCED)) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = isPrototypeOf(RegExpPrototype, this);\n var patternIsRegExp = isRegExp(pattern);\n var flagsAreUndefined = flags === undefined;\n var groups = [];\n var rawPattern = pattern;\n var rawFlags, dotAll, sticky, handled, result, state;\n\n if (!thisIsRegExp && patternIsRegExp && flagsAreUndefined && pattern.constructor === RegExpWrapper) {\n return pattern;\n }\n\n if (patternIsRegExp || isPrototypeOf(RegExpPrototype, pattern)) {\n pattern = pattern.source;\n if (flagsAreUndefined) flags = getRegExpFlags(rawPattern);\n }\n\n pattern = pattern === undefined ? '' : toString(pattern);\n flags = flags === undefined ? '' : toString(flags);\n rawPattern = pattern;\n\n if (UNSUPPORTED_DOT_ALL && 'dotAll' in re1) {\n dotAll = !!flags && stringIndexOf(flags, 's') > -1;\n if (dotAll) flags = replace(flags, /s/g, '');\n }\n\n rawFlags = flags;\n\n if (MISSED_STICKY && 'sticky' in re1) {\n sticky = !!flags && stringIndexOf(flags, 'y') > -1;\n if (sticky && UNSUPPORTED_Y) flags = replace(flags, /y/g, '');\n }\n\n if (UNSUPPORTED_NCG) {\n handled = handleNCG(pattern);\n pattern = handled[0];\n groups = handled[1];\n }\n\n result = inheritIfRequired(NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype, RegExpWrapper);\n\n if (dotAll || sticky || groups.length) {\n state = enforceInternalState(result);\n if (dotAll) {\n state.dotAll = true;\n state.raw = RegExpWrapper(handleDotAll(pattern), rawFlags);\n }\n if (sticky) state.sticky = true;\n if (groups.length) state.groups = groups;\n }\n\n if (pattern !== rawPattern) try {\n // fails in old engines, but we have no alternatives for unsupported regex syntax\n createNonEnumerableProperty(result, 'source', rawPattern === '' ? '(?:)' : rawPattern);\n } catch (error) { /* empty */ }\n\n return result;\n };\n\n for (var keys = getOwnPropertyNames(NativeRegExp), index = 0; keys.length > index;) {\n proxyAccessor(RegExpWrapper, NativeRegExp, keys[index++]);\n }\n\n RegExpPrototype.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype;\n defineBuiltIn(globalThis, 'RegExp', RegExpWrapper, { constructor: true });\n}\n\n// https://tc39.es/ecma262/#sec-get-regexp-@@species\nsetSpecies('RegExp');\n","'use strict';\n/* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */\n/* eslint-disable regexp/no-useless-quantifier -- testing */\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar regexpFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar shared = require('../internals/shared');\nvar create = require('../internals/object-create');\nvar getInternalState = require('../internals/internal-state').get;\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');\n\nvar nativeReplace = shared('native-string-replace', String.prototype.replace);\nvar nativeExec = RegExp.prototype.exec;\nvar patchedExec = nativeExec;\nvar charAt = uncurryThis(''.charAt);\nvar indexOf = uncurryThis(''.indexOf);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n call(nativeExec, re1, 'a');\n call(nativeExec, re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG;\n\nif (PATCH) {\n patchedExec = function exec(string) {\n var re = this;\n var state = getInternalState(re);\n var str = toString(string);\n var raw = state.raw;\n var result, reCopy, lastIndex, match, i, object, group;\n\n if (raw) {\n raw.lastIndex = re.lastIndex;\n result = call(patchedExec, raw, str);\n re.lastIndex = raw.lastIndex;\n return result;\n }\n\n var groups = state.groups;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = call(regexpFlags, re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = replace(flags, 'y', '');\n if (indexOf(flags, 'g') === -1) {\n flags += 'g';\n }\n\n strCopy = stringSlice(str, re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && charAt(str, re.lastIndex - 1) !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = call(nativeExec, sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = stringSlice(match.input, charsAdded);\n match[0] = stringSlice(match[0], charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn't work for /(.?)?/\n call(nativeReplace, match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n if (match && groups) {\n match.groups = object = create(null);\n for (i = 0; i < groups.length; i++) {\n group = groups[i];\n object[group[0]] = match[group[1]];\n }\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n// `RegExp.prototype.exec` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.exec\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar regExpFlags = require('../internals/regexp-flags');\nvar fails = require('../internals/fails');\n\n// babel-minify and Closure Compiler transpiles RegExp('.', 'd') -> /./d and it causes SyntaxError\nvar RegExp = globalThis.RegExp;\nvar RegExpPrototype = RegExp.prototype;\n\nvar FORCED = DESCRIPTORS && fails(function () {\n var INDICES_SUPPORT = true;\n try {\n RegExp('.', 'd');\n } catch (error) {\n INDICES_SUPPORT = false;\n }\n\n var O = {};\n // modern V8 bug\n var calls = '';\n var expected = INDICES_SUPPORT ? 'dgimsy' : 'gimsy';\n\n var addGetter = function (key, chr) {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty(O, key, { get: function () {\n calls += chr;\n return true;\n } });\n };\n\n var pairs = {\n dotAll: 's',\n global: 'g',\n ignoreCase: 'i',\n multiline: 'm',\n sticky: 'y'\n };\n\n if (INDICES_SUPPORT) pairs.hasIndices = 'd';\n\n for (var key in pairs) addGetter(key, pairs[key]);\n\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n var result = Object.getOwnPropertyDescriptor(RegExpPrototype, 'flags').get.call(O);\n\n return result !== expected || calls !== expected;\n});\n\n// `RegExp.prototype.flags` getter\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nif (FORCED) defineBuiltInAccessor(RegExpPrototype, 'flags', {\n configurable: true,\n get: regExpFlags\n});\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar call = require('../internals/function-call');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar SPECIES = wellKnownSymbol('species');\nvar RegExpPrototype = RegExp.prototype;\n\nmodule.exports = function (KEY, exec, FORCED, SHAM) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegExp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) !== 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () {\n execCalled = true;\n return null;\n };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n FORCED\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n var $exec = regexp.exec;\n if ($exec === regexpExec || $exec === RegExpPrototype.exec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: call(nativeRegExpMethod, regexp, str, arg2) };\n }\n return { done: true, value: call(nativeMethod, str, regexp, arg2) };\n }\n return { done: false };\n });\n\n defineBuiltIn(String.prototype, KEY, methods[0]);\n defineBuiltIn(RegExpPrototype, SYMBOL, methods[1]);\n }\n\n if (SHAM) createNonEnumerableProperty(RegExpPrototype[SYMBOL], 'sham', true);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar stringSlice = uncurryThis(''.slice);\n\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = toString(requireObjectCoercible($this));\n var position = toIntegerOrInfinity(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = charCodeAt(S, position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING\n ? charAt(S, position)\n : first\n : CONVERT_TO_STRING\n ? stringSlice(S, position, position + 2)\n : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.es/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.es/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar floor = Math.floor;\nvar charAt = uncurryThis(''.charAt);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\n// eslint-disable-next-line redos/no-vulnerable -- safe\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d{1,2}|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d{1,2})/g;\n\n// `GetSubstitution` abstract operation\n// https://tc39.es/ecma262/#sec-getsubstitution\nmodule.exports = function (matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return replace(replacement, symbols, function (match, ch) {\n var capture;\n switch (charAt(ch, 0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return stringSlice(str, 0, position);\n case \"'\": return stringSlice(str, tailPos);\n case '<':\n capture = namedCaptures[stringSlice(ch, 1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? charAt(ch, 1) : captures[f - 1] + charAt(ch, 1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof-raw');\nvar regexpExec = require('../internals/regexp-exec');\n\nvar $TypeError = TypeError;\n\n// `RegExpExec` abstract operation\n// https://tc39.es/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (isCallable(exec)) {\n var result = call(exec, R, S);\n if (result !== null) anObject(result);\n return result;\n }\n if (classof(R) === 'RegExp') return call(regexpExec, R, S);\n throw new $TypeError('RegExp#exec called on incompatible receiver');\n};\n","'use strict';\nvar apply = require('../internals/function-apply');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar fails = require('../internals/fails');\nvar anObject = require('../internals/an-object');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar getMethod = require('../internals/get-method');\nvar getSubstitution = require('../internals/get-substitution');\nvar regExpExec = require('../internals/regexp-exec-abstract');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar REPLACE = wellKnownSymbol('replace');\nvar max = Math.max;\nvar min = Math.min;\nvar concat = uncurryThis([].concat);\nvar push = uncurryThis([].push);\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar stringSlice = uncurryThis(''.slice);\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n // eslint-disable-next-line regexp/no-useless-dollar-replacements -- false positive\n return ''.replace(re, '$') !== '7';\n});\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNative) {\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.es/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = isNullOrUndefined(searchValue) ? undefined : getMethod(searchValue, REPLACE);\n return replacer\n ? call(replacer, searchValue, O, replaceValue)\n : call(nativeReplace, toString(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace\n function (string, replaceValue) {\n var rx = anObject(this);\n var S = toString(string);\n\n if (\n typeof replaceValue == 'string' &&\n stringIndexOf(replaceValue, UNSAFE_SUBSTITUTE) === -1 &&\n stringIndexOf(replaceValue, '$<') === -1\n ) {\n var res = maybeCallNative(nativeReplace, rx, S, replaceValue);\n if (res.done) return res.value;\n }\n\n var functionalReplace = isCallable(replaceValue);\n if (!functionalReplace) replaceValue = toString(replaceValue);\n\n var global = rx.global;\n var fullUnicode;\n if (global) {\n fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n\n var results = [];\n var result;\n while (true) {\n result = regExpExec(rx, S);\n if (result === null) break;\n\n push(results, result);\n if (!global) break;\n\n var matchStr = toString(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = toString(result[0]);\n var position = max(min(toIntegerOrInfinity(result.index), S.length), 0);\n var captures = [];\n var replacement;\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) push(captures, maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = concat([matched], captures, position, S);\n if (namedCaptures !== undefined) push(replacerArgs, namedCaptures);\n replacement = toString(apply(replaceValue, undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += stringSlice(S, nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n\n return accumulatedResult + stringSlice(S, nextSourcePosition);\n }\n ];\n}, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);\n","'use strict';\n// eslint-disable-next-line es/no-typed-arrays -- safe\nmodule.exports = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined';\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n // eslint-disable-next-line es/no-object-getprototypeof -- required for testing\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar $Object = Object;\nvar ObjectPrototype = $Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n// eslint-disable-next-line es/no-object-getprototypeof -- safe\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {\n var object = toObject(O);\n if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n var constructor = object.constructor;\n if (isCallable(constructor) && object instanceof constructor) {\n return constructor.prototype;\n } return object instanceof $Object ? ObjectPrototype : null;\n};\n","'use strict';\nvar NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-basic-detection');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar hasOwn = require('../internals/has-own-property');\nvar classof = require('../internals/classof');\nvar tryToString = require('../internals/try-to-string');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar uid = require('../internals/uid');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar Int8Array = globalThis.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar Uint8ClampedArray = globalThis.Uint8ClampedArray;\nvar Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;\nvar TypedArray = Int8Array && getPrototypeOf(Int8Array);\nvar TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);\nvar ObjectPrototype = Object.prototype;\nvar TypeError = globalThis.TypeError;\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');\nvar TYPED_ARRAY_CONSTRUCTOR = 'TypedArrayConstructor';\n// Fixing native typed arrays in Opera Presto crashes the browser, see #595\nvar NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(globalThis.opera) !== 'Opera';\nvar TYPED_ARRAY_TAG_REQUIRED = false;\nvar NAME, Constructor, Prototype;\n\nvar TypedArrayConstructorsList = {\n Int8Array: 1,\n Uint8Array: 1,\n Uint8ClampedArray: 1,\n Int16Array: 2,\n Uint16Array: 2,\n Int32Array: 4,\n Uint32Array: 4,\n Float32Array: 4,\n Float64Array: 8\n};\n\nvar BigIntArrayConstructorsList = {\n BigInt64Array: 8,\n BigUint64Array: 8\n};\n\nvar isView = function isView(it) {\n if (!isObject(it)) return false;\n var klass = classof(it);\n return klass === 'DataView'\n || hasOwn(TypedArrayConstructorsList, klass)\n || hasOwn(BigIntArrayConstructorsList, klass);\n};\n\nvar getTypedArrayConstructor = function (it) {\n var proto = getPrototypeOf(it);\n if (!isObject(proto)) return;\n var state = getInternalState(proto);\n return (state && hasOwn(state, TYPED_ARRAY_CONSTRUCTOR)) ? state[TYPED_ARRAY_CONSTRUCTOR] : getTypedArrayConstructor(proto);\n};\n\nvar isTypedArray = function (it) {\n if (!isObject(it)) return false;\n var klass = classof(it);\n return hasOwn(TypedArrayConstructorsList, klass)\n || hasOwn(BigIntArrayConstructorsList, klass);\n};\n\nvar aTypedArray = function (it) {\n if (isTypedArray(it)) return it;\n throw new TypeError('Target is not a typed array');\n};\n\nvar aTypedArrayConstructor = function (C) {\n if (isCallable(C) && (!setPrototypeOf || isPrototypeOf(TypedArray, C))) return C;\n throw new TypeError(tryToString(C) + ' is not a typed array constructor');\n};\n\nvar exportTypedArrayMethod = function (KEY, property, forced, options) {\n if (!DESCRIPTORS) return;\n if (forced) for (var ARRAY in TypedArrayConstructorsList) {\n var TypedArrayConstructor = globalThis[ARRAY];\n if (TypedArrayConstructor && hasOwn(TypedArrayConstructor.prototype, KEY)) try {\n delete TypedArrayConstructor.prototype[KEY];\n } catch (error) {\n // old WebKit bug - some methods are non-configurable\n try {\n TypedArrayConstructor.prototype[KEY] = property;\n } catch (error2) { /* empty */ }\n }\n }\n if (!TypedArrayPrototype[KEY] || forced) {\n defineBuiltIn(TypedArrayPrototype, KEY, forced ? property\n : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options);\n }\n};\n\nvar exportTypedArrayStaticMethod = function (KEY, property, forced) {\n var ARRAY, TypedArrayConstructor;\n if (!DESCRIPTORS) return;\n if (setPrototypeOf) {\n if (forced) for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = globalThis[ARRAY];\n if (TypedArrayConstructor && hasOwn(TypedArrayConstructor, KEY)) try {\n delete TypedArrayConstructor[KEY];\n } catch (error) { /* empty */ }\n }\n if (!TypedArray[KEY] || forced) {\n // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable\n try {\n return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property);\n } catch (error) { /* empty */ }\n } else return;\n }\n for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = globalThis[ARRAY];\n if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n defineBuiltIn(TypedArrayConstructor, KEY, property);\n }\n }\n};\n\nfor (NAME in TypedArrayConstructorsList) {\n Constructor = globalThis[NAME];\n Prototype = Constructor && Constructor.prototype;\n if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor;\n else NATIVE_ARRAY_BUFFER_VIEWS = false;\n}\n\nfor (NAME in BigIntArrayConstructorsList) {\n Constructor = globalThis[NAME];\n Prototype = Constructor && Constructor.prototype;\n if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor;\n}\n\n// WebKit bug - typed arrays constructors prototype is Object.prototype\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) {\n // eslint-disable-next-line no-shadow -- safe\n TypedArray = function TypedArray() {\n throw new TypeError('Incorrect invocation');\n };\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (globalThis[NAME]) setPrototypeOf(globalThis[NAME], TypedArray);\n }\n}\n\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {\n TypedArrayPrototype = TypedArray.prototype;\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (globalThis[NAME]) setPrototypeOf(globalThis[NAME].prototype, TypedArrayPrototype);\n }\n}\n\n// WebKit bug - one more object in Uint8ClampedArray prototype chain\nif (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n}\n\nif (DESCRIPTORS && !hasOwn(TypedArrayPrototype, TO_STRING_TAG)) {\n TYPED_ARRAY_TAG_REQUIRED = true;\n defineBuiltInAccessor(TypedArrayPrototype, TO_STRING_TAG, {\n configurable: true,\n get: function () {\n return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n }\n });\n for (NAME in TypedArrayConstructorsList) if (globalThis[NAME]) {\n createNonEnumerableProperty(globalThis[NAME], TYPED_ARRAY_TAG, NAME);\n }\n}\n\nmodule.exports = {\n NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG,\n aTypedArray: aTypedArray,\n aTypedArrayConstructor: aTypedArrayConstructor,\n exportTypedArrayMethod: exportTypedArrayMethod,\n exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n getTypedArrayConstructor: getTypedArrayConstructor,\n isView: isView,\n isTypedArray: isTypedArray,\n TypedArray: TypedArray,\n TypedArrayPrototype: TypedArrayPrototype\n};\n","'use strict';\n/* eslint-disable no-new, sonarjs/inconsistent-function-call -- required for testing */\nvar globalThis = require('../internals/global-this');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar NATIVE_ARRAY_BUFFER_VIEWS = require('../internals/array-buffer-view-core').NATIVE_ARRAY_BUFFER_VIEWS;\n\nvar ArrayBuffer = globalThis.ArrayBuffer;\nvar Int8Array = globalThis.Int8Array;\n\nmodule.exports = !NATIVE_ARRAY_BUFFER_VIEWS || !fails(function () {\n Int8Array(1);\n}) || !fails(function () {\n new Int8Array(-1);\n}) || !checkCorrectnessOfIteration(function (iterable) {\n new Int8Array();\n new Int8Array(null);\n new Int8Array(1.5);\n new Int8Array(iterable);\n}, true) || fails(function () {\n // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill\n return new Int8Array(new ArrayBuffer(2), 1, undefined).length !== 1;\n});\n","'use strict';\nvar defineBuiltIn = require('../internals/define-built-in');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) defineBuiltIn(target, key, src[key], options);\n return target;\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toLength = require('../internals/to-length');\n\nvar $RangeError = RangeError;\n\n// `ToIndex` abstract operation\n// https://tc39.es/ecma262/#sec-toindex\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toIntegerOrInfinity(it);\n var length = toLength(number);\n if (number !== length) throw new $RangeError('Wrong length or index');\n return length;\n};\n","'use strict';\n// `Math.sign` method implementation\n// https://tc39.es/ecma262/#sec-math.sign\n// eslint-disable-next-line es/no-math-sign -- safe\nmodule.exports = Math.sign || function sign(x) {\n var n = +x;\n // eslint-disable-next-line no-self-compare -- NaN check\n return n === 0 || n !== n ? n : n < 0 ? -1 : 1;\n};\n","'use strict';\nvar EPSILON = 2.220446049250313e-16; // Number.EPSILON\nvar INVERSE_EPSILON = 1 / EPSILON;\n\nmodule.exports = function (n) {\n return n + INVERSE_EPSILON - INVERSE_EPSILON;\n};\n","'use strict';\nvar sign = require('../internals/math-sign');\nvar roundTiesToEven = require('../internals/math-round-ties-to-even');\n\nvar abs = Math.abs;\n\nvar EPSILON = 2.220446049250313e-16; // Number.EPSILON\n\nmodule.exports = function (x, FLOAT_EPSILON, FLOAT_MAX_VALUE, FLOAT_MIN_VALUE) {\n var n = +x;\n var absolute = abs(n);\n var s = sign(n);\n if (absolute < FLOAT_MIN_VALUE) return s * roundTiesToEven(absolute / FLOAT_MIN_VALUE / FLOAT_EPSILON) * FLOAT_MIN_VALUE * FLOAT_EPSILON;\n var a = (1 + FLOAT_EPSILON / EPSILON) * absolute;\n var result = a - (a - absolute);\n // eslint-disable-next-line no-self-compare -- NaN check\n if (result > FLOAT_MAX_VALUE || result !== result) return s * Infinity;\n return s * result;\n};\n","'use strict';\nvar floatRound = require('../internals/math-float-round');\n\nvar FLOAT32_EPSILON = 1.1920928955078125e-7; // 2 ** -23;\nvar FLOAT32_MAX_VALUE = 3.4028234663852886e+38; // 2 ** 128 - 2 ** 104\nvar FLOAT32_MIN_VALUE = 1.1754943508222875e-38; // 2 ** -126;\n\n// `Math.fround` method implementation\n// https://tc39.es/ecma262/#sec-math.fround\n// eslint-disable-next-line es/no-math-fround -- safe\nmodule.exports = Math.fround || function fround(x) {\n return floatRound(x, FLOAT32_EPSILON, FLOAT32_MAX_VALUE, FLOAT32_MIN_VALUE);\n};\n","'use strict';\n// IEEE754 conversions based on https://github.com/feross/ieee754\nvar $Array = Array;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\n\nvar pack = function (number, mantissaLength, bytes) {\n var buffer = $Array(bytes);\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;\n var index = 0;\n var exponent, mantissa, c;\n number = abs(number);\n // eslint-disable-next-line no-self-compare -- NaN check\n if (number !== number || number === Infinity) {\n // eslint-disable-next-line no-self-compare -- NaN check\n mantissa = number !== number ? 1 : 0;\n exponent = eMax;\n } else {\n exponent = floor(log(number) / LN2);\n c = pow(2, -exponent);\n if (number * c < 1) {\n exponent--;\n c *= 2;\n }\n if (exponent + eBias >= 1) {\n number += rt / c;\n } else {\n number += rt * pow(2, 1 - eBias);\n }\n if (number * c >= 2) {\n exponent++;\n c /= 2;\n }\n if (exponent + eBias >= eMax) {\n mantissa = 0;\n exponent = eMax;\n } else if (exponent + eBias >= 1) {\n mantissa = (number * c - 1) * pow(2, mantissaLength);\n exponent += eBias;\n } else {\n mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength);\n exponent = 0;\n }\n }\n while (mantissaLength >= 8) {\n buffer[index++] = mantissa & 255;\n mantissa /= 256;\n mantissaLength -= 8;\n }\n exponent = exponent << mantissaLength | mantissa;\n exponentLength += mantissaLength;\n while (exponentLength > 0) {\n buffer[index++] = exponent & 255;\n exponent /= 256;\n exponentLength -= 8;\n }\n buffer[index - 1] |= sign * 128;\n return buffer;\n};\n\nvar unpack = function (buffer, mantissaLength) {\n var bytes = buffer.length;\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var nBits = exponentLength - 7;\n var index = bytes - 1;\n var sign = buffer[index--];\n var exponent = sign & 127;\n var mantissa;\n sign >>= 7;\n while (nBits > 0) {\n exponent = exponent * 256 + buffer[index--];\n nBits -= 8;\n }\n mantissa = exponent & (1 << -nBits) - 1;\n exponent >>= -nBits;\n nBits += mantissaLength;\n while (nBits > 0) {\n mantissa = mantissa * 256 + buffer[index--];\n nBits -= 8;\n }\n if (exponent === 0) {\n exponent = 1 - eBias;\n } else if (exponent === eMax) {\n return mantissa ? NaN : sign ? -Infinity : Infinity;\n } else {\n mantissa += pow(2, mantissaLength);\n exponent -= eBias;\n } return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength);\n};\n\nmodule.exports = {\n pack: pack,\n unpack: unpack\n};\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.fill` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.fill\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = lengthOfArrayLike(O);\n var argumentsLength = arguments.length;\n var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);\n var end = argumentsLength > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-basic-detection');\nvar FunctionName = require('../internals/function-name');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar fails = require('../internals/fails');\nvar anInstance = require('../internals/an-instance');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toLength = require('../internals/to-length');\nvar toIndex = require('../internals/to-index');\nvar fround = require('../internals/math-fround');\nvar IEEE754 = require('../internals/ieee754');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar arrayFill = require('../internals/array-fill');\nvar arraySlice = require('../internals/array-slice');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar PROPER_FUNCTION_NAME = FunctionName.PROPER;\nvar CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length';\nvar WRONG_INDEX = 'Wrong index';\nvar getInternalArrayBufferState = InternalStateModule.getterFor(ARRAY_BUFFER);\nvar getInternalDataViewState = InternalStateModule.getterFor(DATA_VIEW);\nvar setInternalState = InternalStateModule.set;\nvar NativeArrayBuffer = globalThis[ARRAY_BUFFER];\nvar $ArrayBuffer = NativeArrayBuffer;\nvar ArrayBufferPrototype = $ArrayBuffer && $ArrayBuffer[PROTOTYPE];\nvar $DataView = globalThis[DATA_VIEW];\nvar DataViewPrototype = $DataView && $DataView[PROTOTYPE];\nvar ObjectPrototype = Object.prototype;\nvar Array = globalThis.Array;\nvar RangeError = globalThis.RangeError;\nvar fill = uncurryThis(arrayFill);\nvar reverse = uncurryThis([].reverse);\n\nvar packIEEE754 = IEEE754.pack;\nvar unpackIEEE754 = IEEE754.unpack;\n\nvar packInt8 = function (number) {\n return [number & 0xFF];\n};\n\nvar packInt16 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF];\n};\n\nvar packInt32 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];\n};\n\nvar unpackInt32 = function (buffer) {\n return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];\n};\n\nvar packFloat32 = function (number) {\n return packIEEE754(fround(number), 23, 4);\n};\n\nvar packFloat64 = function (number) {\n return packIEEE754(number, 52, 8);\n};\n\nvar addGetter = function (Constructor, key, getInternalState) {\n defineBuiltInAccessor(Constructor[PROTOTYPE], key, {\n configurable: true,\n get: function () {\n return getInternalState(this)[key];\n }\n });\n};\n\nvar get = function (view, count, index, isLittleEndian) {\n var store = getInternalDataViewState(view);\n var intIndex = toIndex(index);\n var boolIsLittleEndian = !!isLittleEndian;\n if (intIndex + count > store.byteLength) throw new RangeError(WRONG_INDEX);\n var bytes = store.bytes;\n var start = intIndex + store.byteOffset;\n var pack = arraySlice(bytes, start, start + count);\n return boolIsLittleEndian ? pack : reverse(pack);\n};\n\nvar set = function (view, count, index, conversion, value, isLittleEndian) {\n var store = getInternalDataViewState(view);\n var intIndex = toIndex(index);\n var pack = conversion(+value);\n var boolIsLittleEndian = !!isLittleEndian;\n if (intIndex + count > store.byteLength) throw new RangeError(WRONG_INDEX);\n var bytes = store.bytes;\n var start = intIndex + store.byteOffset;\n for (var i = 0; i < count; i++) bytes[start + i] = pack[boolIsLittleEndian ? i : count - i - 1];\n};\n\nif (!NATIVE_ARRAY_BUFFER) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, ArrayBufferPrototype);\n var byteLength = toIndex(length);\n setInternalState(this, {\n type: ARRAY_BUFFER,\n bytes: fill(Array(byteLength), 0),\n byteLength: byteLength\n });\n if (!DESCRIPTORS) {\n this.byteLength = byteLength;\n this.detached = false;\n }\n };\n\n ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE];\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, DataViewPrototype);\n anInstance(buffer, ArrayBufferPrototype);\n var bufferState = getInternalArrayBufferState(buffer);\n var bufferLength = bufferState.byteLength;\n var offset = toIntegerOrInfinity(byteOffset);\n if (offset < 0 || offset > bufferLength) throw new RangeError('Wrong offset');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw new RangeError(WRONG_LENGTH);\n setInternalState(this, {\n type: DATA_VIEW,\n buffer: buffer,\n byteLength: byteLength,\n byteOffset: offset,\n bytes: bufferState.bytes\n });\n if (!DESCRIPTORS) {\n this.buffer = buffer;\n this.byteLength = byteLength;\n this.byteOffset = offset;\n }\n };\n\n DataViewPrototype = $DataView[PROTOTYPE];\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, 'byteLength', getInternalArrayBufferState);\n addGetter($DataView, 'buffer', getInternalDataViewState);\n addGetter($DataView, 'byteLength', getInternalDataViewState);\n addGetter($DataView, 'byteOffset', getInternalDataViewState);\n }\n\n defineBuiltIns(DataViewPrototype, {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : false);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : false);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : false));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : false)) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : false), 23);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : false), 52);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : false);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : false);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : false);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : false);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : false);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : false);\n }\n });\n} else {\n var INCORRECT_ARRAY_BUFFER_NAME = PROPER_FUNCTION_NAME && NativeArrayBuffer.name !== ARRAY_BUFFER;\n /* eslint-disable no-new, sonarjs/inconsistent-function-call -- required for testing */\n if (!fails(function () {\n NativeArrayBuffer(1);\n }) || !fails(function () {\n new NativeArrayBuffer(-1);\n }) || fails(function () {\n new NativeArrayBuffer();\n new NativeArrayBuffer(1.5);\n new NativeArrayBuffer(NaN);\n return NativeArrayBuffer.length !== 1 || INCORRECT_ARRAY_BUFFER_NAME && !CONFIGURABLE_FUNCTION_NAME;\n })) {\n /* eslint-enable no-new, sonarjs/inconsistent-function-call -- required for testing */\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, ArrayBufferPrototype);\n return inheritIfRequired(new NativeArrayBuffer(toIndex(length)), this, $ArrayBuffer);\n };\n\n $ArrayBuffer[PROTOTYPE] = ArrayBufferPrototype;\n\n ArrayBufferPrototype.constructor = $ArrayBuffer;\n\n copyConstructorProperties($ArrayBuffer, NativeArrayBuffer);\n } else if (INCORRECT_ARRAY_BUFFER_NAME && CONFIGURABLE_FUNCTION_NAME) {\n createNonEnumerableProperty(NativeArrayBuffer, 'name', ARRAY_BUFFER);\n }\n\n // WebKit bug - the same parent prototype for typed arrays and data view\n if (setPrototypeOf && getPrototypeOf(DataViewPrototype) !== ObjectPrototype) {\n setPrototypeOf(DataViewPrototype, ObjectPrototype);\n }\n\n // iOS Safari 7.x bug\n var testView = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = uncurryThis(DataViewPrototype.setInt8);\n testView.setInt8(0, 2147483648);\n testView.setInt8(1, 2147483649);\n if (testView.getInt8(0) || !testView.getInt8(1)) defineBuiltIns(DataViewPrototype, {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8(this, byteOffset, value << 24 >> 24);\n }\n }, { unsafe: true });\n}\n\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\n\nmodule.exports = {\n ArrayBuffer: $ArrayBuffer,\n DataView: $DataView\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nvar floor = Math.floor;\n\n// `IsIntegralNumber` abstract operation\n// https://tc39.es/ecma262/#sec-isintegralnumber\n// eslint-disable-next-line es/no-number-isinteger -- safe\nmodule.exports = Number.isInteger || function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar $RangeError = RangeError;\n\nmodule.exports = function (it) {\n var result = toIntegerOrInfinity(it);\n if (result < 0) throw new $RangeError(\"The argument can't be less than 0\");\n return result;\n};\n","'use strict';\nvar toPositiveInteger = require('../internals/to-positive-integer');\n\nvar $RangeError = RangeError;\n\nmodule.exports = function (it, BYTES) {\n var offset = toPositiveInteger(it);\n if (offset % BYTES) throw new $RangeError('Wrong offset');\n return offset;\n};\n","'use strict';\nvar round = Math.round;\n\nmodule.exports = function (it) {\n var value = round(it);\n return value < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;\n};\n","'use strict';\nvar classof = require('../internals/classof');\n\nmodule.exports = function (it) {\n var klass = classof(it);\n return klass === 'BigInt64Array' || klass === 'BigUint64Array';\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\n\nvar $TypeError = TypeError;\n\n// `ToBigInt` abstract operation\n// https://tc39.es/ecma262/#sec-tobigint\nmodule.exports = function (argument) {\n var prim = toPrimitive(argument, 'number');\n if (typeof prim == 'number') throw new $TypeError(\"Can't convert number to bigint\");\n // eslint-disable-next-line es/no-bigint -- safe\n return BigInt(prim);\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar aConstructor = require('../internals/a-constructor');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar isBigIntArray = require('../internals/is-big-int-array');\nvar aTypedArrayConstructor = require('../internals/array-buffer-view-core').aTypedArrayConstructor;\nvar toBigInt = require('../internals/to-big-int');\n\nmodule.exports = function from(source /* , mapfn, thisArg */) {\n var C = aConstructor(this);\n var O = toObject(source);\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var i, length, result, thisIsBigIntArray, value, step, iterator, next;\n if (iteratorMethod && !isArrayIteratorMethod(iteratorMethod)) {\n iterator = getIterator(O, iteratorMethod);\n next = iterator.next;\n O = [];\n while (!(step = call(next, iterator)).done) {\n O.push(step.value);\n }\n }\n if (mapping && argumentsLength > 2) {\n mapfn = bind(mapfn, arguments[2]);\n }\n length = lengthOfArrayLike(O);\n result = new (aTypedArrayConstructor(C))(length);\n thisIsBigIntArray = isBigIntArray(result);\n for (i = 0; length > i; i++) {\n value = mapping ? mapfn(O[i], i) : O[i];\n // FF30- typed arrays doesn't properly convert objects to typed array values\n result[i] = thisIsBigIntArray ? toBigInt(value) : +value;\n }\n return result;\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = uncurryThis([].push);\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation\nvar createMethod = function (TYPE) {\n var IS_MAP = TYPE === 1;\n var IS_FILTER = TYPE === 2;\n var IS_SOME = TYPE === 3;\n var IS_EVERY = TYPE === 4;\n var IS_FIND_INDEX = TYPE === 6;\n var IS_FILTER_REJECT = TYPE === 7;\n var NO_HOLES = TYPE === 5 || IS_FIND_INDEX;\n return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var length = lengthOfArrayLike(self);\n var boundFunction = bind(callbackfn, that);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push(target, value); // filter\n } else switch (TYPE) {\n case 4: return false; // every\n case 7: push(target, value); // filterReject\n }\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.es/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.es/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.es/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.es/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.es/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.es/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.es/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6),\n // `Array.prototype.filterReject` method\n // https://github.com/tc39/proposal-array-filtering\n filterReject: createMethod(7)\n};\n","'use strict';\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\nmodule.exports = function (Constructor, list, $length) {\n var index = 0;\n var length = arguments.length > 2 ? $length : lengthOfArrayLike(list);\n var result = new Constructor(length);\n while (length > index) result[index] = list[index++];\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar call = require('../internals/function-call');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = require('../internals/typed-array-constructors-require-wrappers');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar ArrayBufferModule = require('../internals/array-buffer');\nvar anInstance = require('../internals/an-instance');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar isIntegralNumber = require('../internals/is-integral-number');\nvar toLength = require('../internals/to-length');\nvar toIndex = require('../internals/to-index');\nvar toOffset = require('../internals/to-offset');\nvar toUint8Clamped = require('../internals/to-uint8-clamped');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar classof = require('../internals/classof');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar create = require('../internals/object-create');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar typedArrayFrom = require('../internals/typed-array-from');\nvar forEach = require('../internals/array-iteration').forEach;\nvar setSpecies = require('../internals/set-species');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar definePropertyModule = require('../internals/object-define-property');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar arrayFromConstructorAndList = require('../internals/array-from-constructor-and-list');\nvar InternalStateModule = require('../internals/internal-state');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar enforceInternalState = InternalStateModule.enforce;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar RangeError = globalThis.RangeError;\nvar ArrayBuffer = ArrayBufferModule.ArrayBuffer;\nvar ArrayBufferPrototype = ArrayBuffer.prototype;\nvar DataView = ArrayBufferModule.DataView;\nvar NATIVE_ARRAY_BUFFER_VIEWS = ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\nvar TYPED_ARRAY_TAG = ArrayBufferViewCore.TYPED_ARRAY_TAG;\nvar TypedArray = ArrayBufferViewCore.TypedArray;\nvar TypedArrayPrototype = ArrayBufferViewCore.TypedArrayPrototype;\nvar isTypedArray = ArrayBufferViewCore.isTypedArray;\nvar BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\nvar WRONG_LENGTH = 'Wrong length';\n\nvar addGetter = function (it, key) {\n defineBuiltInAccessor(it, key, {\n configurable: true,\n get: function () {\n return getInternalState(this)[key];\n }\n });\n};\n\nvar isArrayBuffer = function (it) {\n var klass;\n return isPrototypeOf(ArrayBufferPrototype, it) || (klass = classof(it)) === 'ArrayBuffer' || klass === 'SharedArrayBuffer';\n};\n\nvar isTypedArrayIndex = function (target, key) {\n return isTypedArray(target)\n && !isSymbol(key)\n && key in target\n && isIntegralNumber(+key)\n && key >= 0;\n};\n\nvar wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {\n key = toPropertyKey(key);\n return isTypedArrayIndex(target, key)\n ? createPropertyDescriptor(2, target[key])\n : nativeGetOwnPropertyDescriptor(target, key);\n};\n\nvar wrappedDefineProperty = function defineProperty(target, key, descriptor) {\n key = toPropertyKey(key);\n if (isTypedArrayIndex(target, key)\n && isObject(descriptor)\n && hasOwn(descriptor, 'value')\n && !hasOwn(descriptor, 'get')\n && !hasOwn(descriptor, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !descriptor.configurable\n && (!hasOwn(descriptor, 'writable') || descriptor.writable)\n && (!hasOwn(descriptor, 'enumerable') || descriptor.enumerable)\n ) {\n target[key] = descriptor.value;\n return target;\n } return nativeDefineProperty(target, key, descriptor);\n};\n\nif (DESCRIPTORS) {\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n getOwnPropertyDescriptorModule.f = wrappedGetOwnPropertyDescriptor;\n definePropertyModule.f = wrappedDefineProperty;\n addGetter(TypedArrayPrototype, 'buffer');\n addGetter(TypedArrayPrototype, 'byteOffset');\n addGetter(TypedArrayPrototype, 'byteLength');\n addGetter(TypedArrayPrototype, 'length');\n }\n\n $({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {\n getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,\n defineProperty: wrappedDefineProperty\n });\n\n module.exports = function (TYPE, wrapper, CLAMPED) {\n var BYTES = TYPE.match(/\\d+/)[0] / 8;\n var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + TYPE;\n var SETTER = 'set' + TYPE;\n var NativeTypedArrayConstructor = globalThis[CONSTRUCTOR_NAME];\n var TypedArrayConstructor = NativeTypedArrayConstructor;\n var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;\n var exported = {};\n\n var getter = function (that, index) {\n var data = getInternalState(that);\n return data.view[GETTER](index * BYTES + data.byteOffset, true);\n };\n\n var setter = function (that, index, value) {\n var data = getInternalState(that);\n data.view[SETTER](index * BYTES + data.byteOffset, CLAMPED ? toUint8Clamped(value) : value, true);\n };\n\n var addElement = function (that, index) {\n nativeDefineProperty(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n TypedArrayConstructor = wrapper(function (that, data, offset, $length) {\n anInstance(that, TypedArrayConstructorPrototype);\n var index = 0;\n var byteOffset = 0;\n var buffer, byteLength, length;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new ArrayBuffer(byteLength);\n } else if (isArrayBuffer(data)) {\n buffer = data;\n byteOffset = toOffset(offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw new RangeError(WRONG_LENGTH);\n byteLength = $len - byteOffset;\n if (byteLength < 0) throw new RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + byteOffset > $len) throw new RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (isTypedArray(data)) {\n return arrayFromConstructorAndList(TypedArrayConstructor, data);\n } else {\n return call(typedArrayFrom, TypedArrayConstructor, data);\n }\n setInternalState(that, {\n buffer: buffer,\n byteOffset: byteOffset,\n byteLength: byteLength,\n length: length,\n view: new DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = create(TypedArrayPrototype);\n } else if (TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS) {\n TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {\n anInstance(dummy, TypedArrayConstructorPrototype);\n return inheritIfRequired(function () {\n if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data));\n if (isArrayBuffer(data)) return $length !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length)\n : typedArrayOffset !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES))\n : new NativeTypedArrayConstructor(data);\n if (isTypedArray(data)) return arrayFromConstructorAndList(TypedArrayConstructor, data);\n return call(typedArrayFrom, TypedArrayConstructor, data);\n }(), dummy, TypedArrayConstructor);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {\n if (!(key in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);\n }\n });\n TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;\n }\n\n if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);\n }\n\n enforceInternalState(TypedArrayConstructorPrototype).TypedArrayConstructor = TypedArrayConstructor;\n\n if (TYPED_ARRAY_TAG) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);\n }\n\n var FORCED = TypedArrayConstructor !== NativeTypedArrayConstructor;\n\n exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;\n\n $({ global: true, constructor: true, forced: FORCED, sham: !NATIVE_ARRAY_BUFFER_VIEWS }, exported);\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);\n }\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);\n }\n\n setSpecies(CONSTRUCTOR_NAME);\n };\n} else module.exports = function () { /* empty */ };\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Float32Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Float32', function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Float64Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Float64', function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Int8Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Int8', function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Int16Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Int16', function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Int32Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Int32', function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Uint8Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint8', function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Uint8ClampedArray` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint8', function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Uint16Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint16', function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Uint32Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint32', function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = require('../internals/typed-array-constructors-require-wrappers');\nvar exportTypedArrayStaticMethod = require('../internals/array-buffer-view-core').exportTypedArrayStaticMethod;\nvar typedArrayFrom = require('../internals/typed-array-from');\n\n// `%TypedArray%.from` method\n// https://tc39.es/ecma262/#sec-%typedarray%.from\nexportTypedArrayStaticMethod('from', typedArrayFrom, TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS);\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = require('../internals/typed-array-constructors-require-wrappers');\n\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayStaticMethod = ArrayBufferViewCore.exportTypedArrayStaticMethod;\n\n// `%TypedArray%.of` method\n// https://tc39.es/ecma262/#sec-%typedarray%.of\nexportTypedArrayStaticMethod('of', function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = new (aTypedArrayConstructor(this))(length);\n while (length > index) result[index] = arguments[index++];\n return result;\n}, TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS);\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar call = require('../internals/function-call');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar toOffset = require('../internals/to-offset');\nvar toIndexedObject = require('../internals/to-object');\nvar fails = require('../internals/fails');\n\nvar RangeError = globalThis.RangeError;\nvar Int8Array = globalThis.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar $set = Int8ArrayPrototype && Int8ArrayPrototype.set;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\nvar WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS = !fails(function () {\n // eslint-disable-next-line es/no-typed-arrays -- required for testing\n var array = new Uint8ClampedArray(2);\n call($set, array, { length: 1, 0: 3 }, 1);\n return array[1] !== 3;\n});\n\n// https://bugs.chromium.org/p/v8/issues/detail?id=11294 and other\nvar TO_OBJECT_BUG = WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS && ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS && fails(function () {\n var array = new Int8Array(2);\n array.set(1);\n array.set('2', 1);\n return array[0] !== 0 || array[1] !== 2;\n});\n\n// `%TypedArray%.prototype.set` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.set\nexportTypedArrayMethod('set', function set(arrayLike /* , offset */) {\n aTypedArray(this);\n var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);\n var src = toIndexedObject(arrayLike);\n if (WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS) return call($set, this, src, offset);\n var length = this.length;\n var len = lengthOfArrayLike(src);\n var index = 0;\n if (len + offset > length) throw new RangeError('Wrong length');\n while (index < len) this[offset + index] = src[index++];\n}, !WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS || TO_OBJECT_BUG);\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar fails = require('../internals/fails');\nvar aCallable = require('../internals/a-callable');\nvar internalSort = require('../internals/array-sort');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar FF = require('../internals/environment-ff-version');\nvar IE_OR_EDGE = require('../internals/environment-is-ie-or-edge');\nvar V8 = require('../internals/environment-v8-version');\nvar WEBKIT = require('../internals/environment-webkit-version');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar Uint16Array = globalThis.Uint16Array;\nvar nativeSort = Uint16Array && uncurryThis(Uint16Array.prototype.sort);\n\n// WebKit\nvar ACCEPT_INCORRECT_ARGUMENTS = !!nativeSort && !(fails(function () {\n nativeSort(new Uint16Array(2), null);\n}) && fails(function () {\n nativeSort(new Uint16Array(2), {});\n}));\n\nvar STABLE_SORT = !!nativeSort && !fails(function () {\n // feature detection can be too slow, so check engines versions\n if (V8) return V8 < 74;\n if (FF) return FF < 67;\n if (IE_OR_EDGE) return true;\n if (WEBKIT) return WEBKIT < 602;\n\n var array = new Uint16Array(516);\n var expected = Array(516);\n var index, mod;\n\n for (index = 0; index < 516; index++) {\n mod = index % 4;\n array[index] = 515 - index;\n expected[index] = index - 2 * mod + 3;\n }\n\n nativeSort(array, function (a, b) {\n return (a / 4 | 0) - (b / 4 | 0);\n });\n\n for (index = 0; index < 516; index++) {\n if (array[index] !== expected[index]) return true;\n }\n});\n\nvar getSortCompare = function (comparefn) {\n return function (x, y) {\n if (comparefn !== undefined) return +comparefn(x, y) || 0;\n // eslint-disable-next-line no-self-compare -- NaN check\n if (y !== y) return -1;\n // eslint-disable-next-line no-self-compare -- NaN check\n if (x !== x) return 1;\n if (x === 0 && y === 0) return 1 / x > 0 && 1 / y < 0 ? 1 : -1;\n return x > y;\n };\n};\n\n// `%TypedArray%.prototype.sort` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.sort\nexportTypedArrayMethod('sort', function sort(comparefn) {\n if (comparefn !== undefined) aCallable(comparefn);\n if (STABLE_SORT) return nativeSort(this, comparefn);\n\n return internalSort(aTypedArray(this), getSortCompare(comparefn));\n}, !STABLE_SORT || ACCEPT_INCORRECT_ARGUMENTS);\n","'use strict';\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\n// `InstallErrorCause` abstract operation\n// https://tc39.es/proposal-error-cause/#sec-errorobjects-install-error-cause\nmodule.exports = function (O, options) {\n if (isObject(options) && 'cause' in options) {\n createNonEnumerableProperty(O, 'cause', options.cause);\n }\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar $Error = Error;\nvar replace = uncurryThis(''.replace);\n\nvar TEST = (function (arg) { return String(new $Error(arg).stack); })('zxcasd');\n// eslint-disable-next-line redos/no-vulnerable, sonarjs/slow-regex -- safe\nvar V8_OR_CHAKRA_STACK_ENTRY = /\\n\\s*at [^:]*:[^\\n]*/;\nvar IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST);\n\nmodule.exports = function (stack, dropEntries) {\n if (IS_V8_OR_CHAKRA_STACK && typeof stack == 'string' && !$Error.prepareStackTrace) {\n while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, '');\n } return stack;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = !fails(function () {\n var error = new Error('a');\n if (!('stack' in error)) return true;\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7));\n return error.stack !== 7;\n});\n","'use strict';\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar clearErrorStack = require('../internals/error-stack-clear');\nvar ERROR_STACK_INSTALLABLE = require('../internals/error-stack-installable');\n\n// non-standard V8\nvar captureStackTrace = Error.captureStackTrace;\n\nmodule.exports = function (error, C, stack, dropEntries) {\n if (ERROR_STACK_INSTALLABLE) {\n if (captureStackTrace) captureStackTrace(error, C);\n else createNonEnumerableProperty(error, 'stack', clearErrorStack(stack, dropEntries));\n }\n};\n","'use strict';\nvar toString = require('../internals/to-string');\n\nmodule.exports = function (argument, $default) {\n return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar create = require('../internals/object-create');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar installErrorCause = require('../internals/install-error-cause');\nvar installErrorStack = require('../internals/error-stack-install');\nvar iterate = require('../internals/iterate');\nvar normalizeStringArgument = require('../internals/normalize-string-argument');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Error = Error;\nvar push = [].push;\n\nvar $AggregateError = function AggregateError(errors, message /* , options */) {\n var isInstance = isPrototypeOf(AggregateErrorPrototype, this);\n var that;\n if (setPrototypeOf) {\n that = setPrototypeOf(new $Error(), isInstance ? getPrototypeOf(this) : AggregateErrorPrototype);\n } else {\n that = isInstance ? this : create(AggregateErrorPrototype);\n createNonEnumerableProperty(that, TO_STRING_TAG, 'Error');\n }\n if (message !== undefined) createNonEnumerableProperty(that, 'message', normalizeStringArgument(message));\n installErrorStack(that, $AggregateError, that.stack, 1);\n if (arguments.length > 2) installErrorCause(that, arguments[2]);\n var errorsArray = [];\n iterate(errors, push, { that: errorsArray });\n createNonEnumerableProperty(that, 'errors', errorsArray);\n return that;\n};\n\nif (setPrototypeOf) setPrototypeOf($AggregateError, $Error);\nelse copyConstructorProperties($AggregateError, $Error, { name: true });\n\nvar AggregateErrorPrototype = $AggregateError.prototype = create($Error.prototype, {\n constructor: createPropertyDescriptor(1, $AggregateError),\n message: createPropertyDescriptor(1, ''),\n name: createPropertyDescriptor(1, 'AggregateError')\n});\n\n// `AggregateError` constructor\n// https://tc39.es/ecma262/#sec-aggregate-error-constructor\n$({ global: true, constructor: true, arity: 2 }, {\n AggregateError: $AggregateError\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar DESCRIPTORS = require('../internals/descriptors');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\n\n// `Array.prototype.lastIndex` getter\n// https://github.com/keithamus/proposal-array-last\nif (DESCRIPTORS) {\n defineBuiltInAccessor(Array.prototype, 'lastIndex', {\n configurable: true,\n get: function lastIndex() {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n return len === 0 ? 0 : len - 1;\n }\n });\n\n addToUnscopables('lastIndex');\n}\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar DESCRIPTORS = require('../internals/descriptors');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\n\n// `Array.prototype.lastIndex` accessor\n// https://github.com/keithamus/proposal-array-last\nif (DESCRIPTORS) {\n defineBuiltInAccessor(Array.prototype, 'lastItem', {\n configurable: true,\n get: function lastItem() {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n return len === 0 ? undefined : O[len - 1];\n },\n set: function lastItem(value) {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n return O[len === 0 ? 0 : len - 1] = value;\n }\n });\n\n addToUnscopables('lastItem');\n}\n","'use strict';\n/* eslint-disable es/no-object-getownpropertynames -- safe */\nvar classof = require('../internals/classof-raw');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar $getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar arraySlice = require('../internals/array-slice');\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return $getOwnPropertyNames(it);\n } catch (error) {\n return arraySlice(windowNames);\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && classof(it) === 'Window'\n ? getWindowNames(it)\n : $getOwnPropertyNames(toIndexedObject(it));\n};\n","'use strict';\n// FF26- bug: ArrayBuffers are non-extensible, but Object.isExtensible does not report it\nvar fails = require('../internals/fails');\n\nmodule.exports = fails(function () {\n if (typeof ArrayBuffer == 'function') {\n var buffer = new ArrayBuffer(8);\n // eslint-disable-next-line es/no-object-isextensible, es/no-object-defineproperty -- safe\n if (Object.isExtensible(buffer)) Object.defineProperty(buffer, 'a', { value: 8 });\n }\n});\n","'use strict';\nvar fails = require('../internals/fails');\nvar isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar ARRAY_BUFFER_NON_EXTENSIBLE = require('../internals/array-buffer-non-extensible');\n\n// eslint-disable-next-line es/no-object-isextensible -- safe\nvar $isExtensible = Object.isExtensible;\nvar FAILS_ON_PRIMITIVES = fails(function () { $isExtensible(1); });\n\n// `Object.isExtensible` method\n// https://tc39.es/ecma262/#sec-object.isextensible\nmodule.exports = (FAILS_ON_PRIMITIVES || ARRAY_BUFFER_NON_EXTENSIBLE) ? function isExtensible(it) {\n if (!isObject(it)) return false;\n if (ARRAY_BUFFER_NON_EXTENSIBLE && classof(it) === 'ArrayBuffer') return false;\n return $isExtensible ? $isExtensible(it) : true;\n} : $isExtensible;\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar hasOwn = require('../internals/has-own-property');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternalModule = require('../internals/object-get-own-property-names-external');\nvar isExtensible = require('../internals/object-is-extensible');\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar REQUIRED = false;\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + id++, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!hasOwn(it, METADATA)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!hasOwn(it, METADATA)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar enable = function () {\n meta.enable = function () { /* empty */ };\n REQUIRED = true;\n var getOwnPropertyNames = getOwnPropertyNamesModule.f;\n var splice = uncurryThis([].splice);\n var test = {};\n test[METADATA] = 1;\n\n // prevent exposing of metadata key\n if (getOwnPropertyNames(test).length) {\n getOwnPropertyNamesModule.f = function (it) {\n var result = getOwnPropertyNames(it);\n for (var i = 0, length = result.length; i < length; i++) {\n if (result[i] === METADATA) {\n splice(result, i, 1);\n break;\n }\n } return result;\n };\n\n $({ target: 'Object', stat: true, forced: true }, {\n getOwnPropertyNames: getOwnPropertyNamesExternalModule.f\n });\n }\n};\n\nvar meta = module.exports = {\n enable: enable,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = globalThis[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var uncurriedNativeMethod = uncurryThis(NativePrototype[KEY]);\n defineBuiltIn(NativePrototype, KEY,\n KEY === 'add' ? function add(value) {\n uncurriedNativeMethod(this, value === 0 ? 0 : value);\n return this;\n } : KEY === 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : KEY === 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : KEY === 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n uncurriedNativeMethod(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n var REPLACE = isForced(\n CONSTRUCTOR_NAME,\n !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n }))\n );\n\n if (REPLACE) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.enable();\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) !== instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n // eslint-disable-next-line no-new -- required for testing\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, NativePrototype);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, constructor: true, forced: Constructor !== NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es/no-array-prototype-keys -- safe */\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () {\n var test = {};\n // FF44- legacy iterators case\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n defineBuiltIn(IteratorPrototype, ITERATOR, function () {\n return this;\n });\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar IS_PURE = require('../internals/is-pure');\nvar FunctionName = require('../internals/function-name');\nvar isCallable = require('../internals/is-callable');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar PROPER_FUNCTION_NAME = FunctionName.PROPER;\nvar CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND && KIND in IterablePrototype) return IterablePrototype[KIND];\n\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n }\n\n return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME === 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) {\n defineBuiltIn(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array.prototype.{ values, @@iterator }.name in V8 / FF\n if (PROPER_FUNCTION_NAME && DEFAULT === VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) {\n createNonEnumerableProperty(IterablePrototype, 'name', VALUES);\n } else {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return call(nativeIterator, this); };\n }\n }\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n defineBuiltIn(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n defineBuiltIn(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT });\n }\n Iterators[NAME] = defaultIterator;\n\n return methods;\n};\n","'use strict';\n// `CreateIterResultObject` abstract operation\n// https://tc39.es/ecma262/#sec-createiterresultobject\nmodule.exports = function (value, done) {\n return { value: value, done: done };\n};\n","'use strict';\nvar create = require('../internals/object-create');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar bind = require('../internals/function-bind-context');\nvar anInstance = require('../internals/an-instance');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar iterate = require('../internals/iterate');\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar setSpecies = require('../internals/set-species');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fastKey = require('../internals/internal-metadata').fastKey;\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var Constructor = wrapper(function (that, iterable) {\n anInstance(that, Prototype);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n index: create(null),\n first: null,\n last: null,\n size: 0\n });\n if (!DESCRIPTORS) that.size = 0;\n if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var Prototype = Constructor.prototype;\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var entry = getEntry(that, key);\n var previous, index;\n // change existing entry\n if (entry) {\n entry.value = value;\n // create new entry\n } else {\n state.last = entry = {\n index: index = fastKey(key, true),\n key: key,\n value: value,\n previous: previous = state.last,\n next: null,\n removed: false\n };\n if (!state.first) state.first = entry;\n if (previous) previous.next = entry;\n if (DESCRIPTORS) state.size++;\n else that.size++;\n // add to index\n if (index !== 'F') state.index[index] = entry;\n } return that;\n };\n\n var getEntry = function (that, key) {\n var state = getInternalState(that);\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return state.index[index];\n // frozen object case\n for (entry = state.first; entry; entry = entry.next) {\n if (entry.key === key) return entry;\n }\n };\n\n defineBuiltIns(Prototype, {\n // `{ Map, Set }.prototype.clear()` methods\n // https://tc39.es/ecma262/#sec-map.prototype.clear\n // https://tc39.es/ecma262/#sec-set.prototype.clear\n clear: function clear() {\n var that = this;\n var state = getInternalState(that);\n var entry = state.first;\n while (entry) {\n entry.removed = true;\n if (entry.previous) entry.previous = entry.previous.next = null;\n entry = entry.next;\n }\n state.first = state.last = null;\n state.index = create(null);\n if (DESCRIPTORS) state.size = 0;\n else that.size = 0;\n },\n // `{ Map, Set }.prototype.delete(key)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.delete\n // https://tc39.es/ecma262/#sec-set.prototype.delete\n 'delete': function (key) {\n var that = this;\n var state = getInternalState(that);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.next;\n var prev = entry.previous;\n delete state.index[entry.index];\n entry.removed = true;\n if (prev) prev.next = next;\n if (next) next.previous = prev;\n if (state.first === entry) state.first = next;\n if (state.last === entry) state.last = prev;\n if (DESCRIPTORS) state.size--;\n else that.size--;\n } return !!entry;\n },\n // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.foreach\n // https://tc39.es/ecma262/#sec-set.prototype.foreach\n forEach: function forEach(callbackfn /* , that = undefined */) {\n var state = getInternalState(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var entry;\n while (entry = entry ? entry.next : state.first) {\n boundFunction(entry.value, entry.key, this);\n // revert to the last existing entry\n while (entry && entry.removed) entry = entry.previous;\n }\n },\n // `{ Map, Set}.prototype.has(key)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.has\n // https://tc39.es/ecma262/#sec-set.prototype.has\n has: function has(key) {\n return !!getEntry(this, key);\n }\n });\n\n defineBuiltIns(Prototype, IS_MAP ? {\n // `Map.prototype.get(key)` method\n // https://tc39.es/ecma262/#sec-map.prototype.get\n get: function get(key) {\n var entry = getEntry(this, key);\n return entry && entry.value;\n },\n // `Map.prototype.set(key, value)` method\n // https://tc39.es/ecma262/#sec-map.prototype.set\n set: function set(key, value) {\n return define(this, key === 0 ? 0 : key, value);\n }\n } : {\n // `Set.prototype.add(value)` method\n // https://tc39.es/ecma262/#sec-set.prototype.add\n add: function add(value) {\n return define(this, value = value === 0 ? 0 : value, value);\n }\n });\n if (DESCRIPTORS) defineBuiltInAccessor(Prototype, 'size', {\n configurable: true,\n get: function () {\n return getInternalState(this).size;\n }\n });\n return Constructor;\n },\n setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) {\n var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';\n var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);\n var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);\n // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods\n // https://tc39.es/ecma262/#sec-map.prototype.entries\n // https://tc39.es/ecma262/#sec-map.prototype.keys\n // https://tc39.es/ecma262/#sec-map.prototype.values\n // https://tc39.es/ecma262/#sec-map.prototype-@@iterator\n // https://tc39.es/ecma262/#sec-set.prototype.entries\n // https://tc39.es/ecma262/#sec-set.prototype.keys\n // https://tc39.es/ecma262/#sec-set.prototype.values\n // https://tc39.es/ecma262/#sec-set.prototype-@@iterator\n defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) {\n setInternalState(this, {\n type: ITERATOR_NAME,\n target: iterated,\n state: getInternalCollectionState(iterated),\n kind: kind,\n last: null\n });\n }, function () {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var entry = state.last;\n // revert to the last existing entry\n while (entry && entry.removed) entry = entry.previous;\n // get next entry\n if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {\n // or finish the iteration\n state.target = null;\n return createIterResultObject(undefined, true);\n }\n // return step by kind\n if (kind === 'keys') return createIterResultObject(entry.key, false);\n if (kind === 'values') return createIterResultObject(entry.value, false);\n return createIterResultObject([entry.key, entry.value], false);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // `{ Map, Set }.prototype[@@species]` accessors\n // https://tc39.es/ecma262/#sec-get-map-@@species\n // https://tc39.es/ecma262/#sec-get-set-@@species\n setSpecies(CONSTRUCTOR_NAME);\n }\n};\n","'use strict';\nvar collection = require('../internals/collection');\nvar collectionStrong = require('../internals/collection-strong');\n\n// `Map` constructor\n// https://tc39.es/ecma262/#sec-map-objects\ncollection('Map', function (init) {\n return function Map() { return init(this, arguments.length ? arguments[0] : undefined); };\n}, collectionStrong);\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar getWeakData = require('../internals/internal-metadata').getWeakData;\nvar anInstance = require('../internals/an-instance');\nvar anObject = require('../internals/an-object');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isObject = require('../internals/is-object');\nvar iterate = require('../internals/iterate');\nvar ArrayIterationModule = require('../internals/array-iteration');\nvar hasOwn = require('../internals/has-own-property');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\nvar find = ArrayIterationModule.find;\nvar findIndex = ArrayIterationModule.findIndex;\nvar splice = uncurryThis([].splice);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (state) {\n return state.frozen || (state.frozen = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function () {\n this.entries = [];\n};\n\nvar findUncaughtFrozen = function (store, key) {\n return find(store.entries, function (it) {\n return it[0] === key;\n });\n};\n\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) splice(this.entries, index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var Constructor = wrapper(function (that, iterable) {\n anInstance(that, Prototype);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n id: id++,\n frozen: null\n });\n if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var Prototype = Constructor.prototype;\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\n\n defineBuiltIns(Prototype, {\n // `{ WeakMap, WeakSet }.prototype.delete(key)` methods\n // https://tc39.es/ecma262/#sec-weakmap.prototype.delete\n // https://tc39.es/ecma262/#sec-weakset.prototype.delete\n 'delete': function (key) {\n var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && hasOwn(data, state.id) && delete data[state.id];\n },\n // `{ WeakMap, WeakSet }.prototype.has(key)` methods\n // https://tc39.es/ecma262/#sec-weakmap.prototype.has\n // https://tc39.es/ecma262/#sec-weakset.prototype.has\n has: function has(key) {\n var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && hasOwn(data, state.id);\n }\n });\n\n defineBuiltIns(Prototype, IS_MAP ? {\n // `WeakMap.prototype.get(key)` method\n // https://tc39.es/ecma262/#sec-weakmap.prototype.get\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n if (data) return data[state.id];\n }\n },\n // `WeakMap.prototype.set(key, value)` method\n // https://tc39.es/ecma262/#sec-weakmap.prototype.set\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // `WeakSet.prototype.add(value)` method\n // https://tc39.es/ecma262/#sec-weakset.prototype.add\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return Constructor;\n }\n};\n","'use strict';\nvar FREEZING = require('../internals/freezing');\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\nvar isObject = require('../internals/is-object');\nvar enforceInternalState = require('../internals/internal-state').enforce;\nvar fails = require('../internals/fails');\nvar NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\n\nvar $Object = Object;\n// eslint-disable-next-line es/no-array-isarray -- safe\nvar isArray = Array.isArray;\n// eslint-disable-next-line es/no-object-isextensible -- safe\nvar isExtensible = $Object.isExtensible;\n// eslint-disable-next-line es/no-object-isfrozen -- safe\nvar isFrozen = $Object.isFrozen;\n// eslint-disable-next-line es/no-object-issealed -- safe\nvar isSealed = $Object.isSealed;\n// eslint-disable-next-line es/no-object-freeze -- safe\nvar freeze = $Object.freeze;\n// eslint-disable-next-line es/no-object-seal -- safe\nvar seal = $Object.seal;\n\nvar IS_IE11 = !globalThis.ActiveXObject && 'ActiveXObject' in globalThis;\nvar InternalWeakMap;\n\nvar wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n};\n\n// `WeakMap` constructor\n// https://tc39.es/ecma262/#sec-weakmap-constructor\nvar $WeakMap = collection('WeakMap', wrapper, collectionWeak);\nvar WeakMapPrototype = $WeakMap.prototype;\nvar nativeSet = uncurryThis(WeakMapPrototype.set);\n\n// Chakra Edge bug: adding frozen arrays to WeakMap unfreeze them\nvar hasMSEdgeFreezingBug = function () {\n return FREEZING && fails(function () {\n var frozenArray = freeze([]);\n nativeSet(new $WeakMap(), frozenArray, 1);\n return !isFrozen(frozenArray);\n });\n};\n\n// IE11 WeakMap frozen keys fix\n// We can't use feature detection because it crash some old IE builds\n// https://github.com/zloirock/core-js/issues/485\nif (NATIVE_WEAK_MAP) if (IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n InternalMetadataModule.enable();\n var nativeDelete = uncurryThis(WeakMapPrototype['delete']);\n var nativeHas = uncurryThis(WeakMapPrototype.has);\n var nativeGet = uncurryThis(WeakMapPrototype.get);\n defineBuiltIns(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceInternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete(this, key) || state.frozen['delete'](key);\n } return nativeDelete(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceInternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas(this, key) || state.frozen.has(key);\n } return nativeHas(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceInternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas(this, key) ? nativeGet(this, key) : state.frozen.get(key);\n } return nativeGet(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceInternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas(this, key) ? nativeSet(this, key, value) : state.frozen.set(key, value);\n } else nativeSet(this, key, value);\n return this;\n }\n });\n// Chakra Edge frozen keys fix\n} else if (hasMSEdgeFreezingBug()) {\n defineBuiltIns(WeakMapPrototype, {\n set: function set(key, value) {\n var arrayIntegrityLevel;\n if (isArray(key)) {\n if (isFrozen(key)) arrayIntegrityLevel = freeze;\n else if (isSealed(key)) arrayIntegrityLevel = seal;\n }\n nativeSet(this, key, value);\n if (arrayIntegrityLevel) arrayIntegrityLevel(key);\n return this;\n }\n });\n}\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.map');\nrequire('../modules/es.weak-map');\nvar getBuiltIn = require('../internals/get-built-in');\nvar create = require('../internals/object-create');\nvar isObject = require('../internals/is-object');\n\nvar $Object = Object;\nvar $TypeError = TypeError;\nvar Map = getBuiltIn('Map');\nvar WeakMap = getBuiltIn('WeakMap');\n\nvar Node = function () {\n // keys\n this.object = null;\n this.symbol = null;\n // child nodes\n this.primitives = null;\n this.objectsByIndex = create(null);\n};\n\nNode.prototype.get = function (key, initializer) {\n return this[key] || (this[key] = initializer());\n};\n\nNode.prototype.next = function (i, it, IS_OBJECT) {\n var store = IS_OBJECT\n ? this.objectsByIndex[i] || (this.objectsByIndex[i] = new WeakMap())\n : this.primitives || (this.primitives = new Map());\n var entry = store.get(it);\n if (!entry) store.set(it, entry = new Node());\n return entry;\n};\n\nvar root = new Node();\n\nmodule.exports = function () {\n var active = root;\n var length = arguments.length;\n var i, it;\n // for prevent leaking, start from objects\n for (i = 0; i < length; i++) {\n if (isObject(it = arguments[i])) active = active.next(i, it, true);\n }\n if (this === $Object && active === root) throw new $TypeError('Composite keys must contain a non-primitive component');\n for (i = 0; i < length; i++) {\n if (!isObject(it = arguments[i])) active = active.next(i, it, false);\n } return active;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar apply = require('../internals/function-apply');\nvar getCompositeKeyNode = require('../internals/composite-key');\nvar getBuiltIn = require('../internals/get-built-in');\nvar create = require('../internals/object-create');\n\nvar $Object = Object;\n\nvar initializer = function () {\n var freeze = getBuiltIn('Object', 'freeze');\n return freeze ? freeze(create(null)) : create(null);\n};\n\n// https://github.com/tc39/proposal-richer-keys/tree/master/compositeKey\n$({ global: true, forced: true }, {\n compositeKey: function compositeKey() {\n return apply(getCompositeKeyNode, $Object, arguments).get('object', initializer);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar getCompositeKeyNode = require('../internals/composite-key');\nvar getBuiltIn = require('../internals/get-built-in');\nvar apply = require('../internals/function-apply');\n\n// https://github.com/tc39/proposal-richer-keys/tree/master/compositeKey\n$({ global: true, forced: true }, {\n compositeSymbol: function compositeSymbol() {\n if (arguments.length === 1 && typeof arguments[0] == 'string') return getBuiltIn('Symbol')['for'](arguments[0]);\n return apply(getCompositeKeyNode, null, arguments).get('symbol', getBuiltIn('Symbol'));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\n\n// `globalThis` object\n// https://tc39.es/ecma262/#sec-globalthis\n$({ global: true, forced: globalThis.globalThis !== globalThis }, {\n globalThis: globalThis\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-map -- safe\nvar MapPrototype = Map.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-map -- safe\n Map: Map,\n set: uncurryThis(MapPrototype.set),\n get: uncurryThis(MapPrototype.get),\n has: uncurryThis(MapPrototype.has),\n remove: uncurryThis(MapPrototype['delete']),\n proto: MapPrototype\n};\n","'use strict';\nvar has = require('../internals/map-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[MapData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar aMap = require('../internals/a-map');\nvar remove = require('../internals/map-helpers').remove;\n\n// `Map.prototype.deleteAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n deleteAll: function deleteAll(/* ...elements */) {\n var collection = aMap(this);\n var allDeleted = true;\n var wasDeleted;\n for (var k = 0, len = arguments.length; k < len; k++) {\n wasDeleted = remove(collection, arguments[k]);\n allDeleted = allDeleted && wasDeleted;\n } return !!allDeleted;\n }\n});\n","'use strict';\nvar call = require('../internals/function-call');\n\nmodule.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) {\n var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator;\n var next = record.next;\n var step, result;\n while (!(step = call(next, iterator)).done) {\n result = fn(step.value);\n if (result !== undefined) return result;\n }\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar iterateSimple = require('../internals/iterate-simple');\nvar MapHelpers = require('../internals/map-helpers');\n\nvar Map = MapHelpers.Map;\nvar MapPrototype = MapHelpers.proto;\nvar forEach = uncurryThis(MapPrototype.forEach);\nvar entries = uncurryThis(MapPrototype.entries);\nvar next = entries(new Map()).next;\n\nmodule.exports = function (map, fn, interruptible) {\n return interruptible ? iterateSimple({ iterator: entries(map), next: next }, function (entry) {\n return fn(entry[1], entry[0]);\n }) : forEach(map, fn);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.every` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n every: function every(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return iterate(map, function (value, key) {\n if (!boundFunction(value, key, map)) return false;\n }, true) !== false;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar MapHelpers = require('../internals/map-helpers');\nvar iterate = require('../internals/map-iterate');\n\nvar Map = MapHelpers.Map;\nvar set = MapHelpers.set;\n\n// `Map.prototype.filter` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n filter: function filter(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newMap = new Map();\n iterate(map, function (value, key) {\n if (boundFunction(value, key, map)) set(newMap, key, value);\n });\n return newMap;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.find` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n find: function find(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var result = iterate(map, function (value, key) {\n if (boundFunction(value, key, map)) return { value: value };\n }, true);\n return result && result.value;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.findKey` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n findKey: function findKey(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var result = iterate(map, function (value, key) {\n if (boundFunction(value, key, map)) return { key: key };\n }, true);\n return result && result.key;\n }\n});\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar bind = require('../internals/function-bind-context');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar iterate = require('../internals/iterate');\n\nmodule.exports = function (C, adder, ENTRY) {\n return function from(source /* , mapFn, thisArg */) {\n var O = toObject(source);\n var length = arguments.length;\n var mapFn = length > 1 ? arguments[1] : undefined;\n var mapping = mapFn !== undefined;\n var boundFunction = mapping ? bind(mapFn, length > 2 ? arguments[2] : undefined) : undefined;\n var result = new C();\n var n = 0;\n iterate(O, function (nextItem) {\n var entry = mapping ? boundFunction(nextItem, n++) : nextItem;\n if (ENTRY) adder(result, anObject(entry)[0], entry[1]);\n else adder(result, entry);\n });\n return result;\n };\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar MapHelpers = require('../internals/map-helpers');\nvar createCollectionFrom = require('../internals/collection-from');\n\n// `Map.from` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from\n$({ target: 'Map', stat: true, forced: true }, {\n from: createCollectionFrom(MapHelpers.Map, MapHelpers.set, true)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar iterate = require('../internals/iterate');\nvar MapHelpers = require('../internals/map-helpers');\nvar IS_PURE = require('../internals/is-pure');\nvar fails = require('../internals/fails');\n\nvar Map = MapHelpers.Map;\nvar has = MapHelpers.has;\nvar get = MapHelpers.get;\nvar set = MapHelpers.set;\nvar push = uncurryThis([].push);\n\nvar DOES_NOT_WORK_WITH_PRIMITIVES = IS_PURE || fails(function () {\n return Map.groupBy('ab', function (it) {\n return it;\n }).get('a').length !== 1;\n});\n\n// `Map.groupBy` method\n// https://tc39.es/ecma262/#sec-map.groupby\n$({ target: 'Map', stat: true, forced: IS_PURE || DOES_NOT_WORK_WITH_PRIMITIVES }, {\n groupBy: function groupBy(items, callbackfn) {\n requireObjectCoercible(items);\n aCallable(callbackfn);\n var map = new Map();\n var k = 0;\n iterate(items, function (value) {\n var key = callbackfn(value, k++);\n if (!has(map, key)) set(map, key, [value]);\n else push(get(map, key), value);\n });\n return map;\n }\n});\n","'use strict';\n// `SameValueZero` abstract operation\n// https://tc39.es/ecma262/#sec-samevaluezero\nmodule.exports = function (x, y) {\n // eslint-disable-next-line no-self-compare -- NaN check\n return x === y || x !== x && y !== y;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar sameValueZero = require('../internals/same-value-zero');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.includes` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n includes: function includes(searchElement) {\n return iterate(aMap(this), function (value) {\n if (sameValueZero(value, searchElement)) return true;\n }, true) === true;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar iterate = require('../internals/iterate');\nvar isCallable = require('../internals/is-callable');\nvar aCallable = require('../internals/a-callable');\nvar Map = require('../internals/map-helpers').Map;\n\n// `Map.keyBy` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', stat: true, forced: true }, {\n keyBy: function keyBy(iterable, keyDerivative) {\n var C = isCallable(this) ? this : Map;\n var newMap = new C();\n aCallable(keyDerivative);\n var setter = aCallable(newMap.set);\n iterate(iterable, function (element) {\n call(setter, newMap, keyDerivative(element), element);\n });\n return newMap;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.keyOf` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n keyOf: function keyOf(searchElement) {\n var result = iterate(aMap(this), function (value, key) {\n if (value === searchElement) return { key: key };\n }, true);\n return result && result.key;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar MapHelpers = require('../internals/map-helpers');\nvar iterate = require('../internals/map-iterate');\n\nvar Map = MapHelpers.Map;\nvar set = MapHelpers.set;\n\n// `Map.prototype.mapKeys` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n mapKeys: function mapKeys(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newMap = new Map();\n iterate(map, function (value, key) {\n set(newMap, boundFunction(value, key, map), value);\n });\n return newMap;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar MapHelpers = require('../internals/map-helpers');\nvar iterate = require('../internals/map-iterate');\n\nvar Map = MapHelpers.Map;\nvar set = MapHelpers.set;\n\n// `Map.prototype.mapValues` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n mapValues: function mapValues(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newMap = new Map();\n iterate(map, function (value, key) {\n set(newMap, key, boundFunction(value, key, map));\n });\n return newMap;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/iterate');\nvar set = require('../internals/map-helpers').set;\n\n// `Map.prototype.merge` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, arity: 1, forced: true }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n merge: function merge(iterable /* ...iterables */) {\n var map = aMap(this);\n var argumentsLength = arguments.length;\n var i = 0;\n while (i < argumentsLength) {\n iterate(arguments[i++], function (key, value) {\n set(map, key, value);\n }, { AS_ENTRIES: true });\n }\n return map;\n }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// https://tc39.github.io/proposal-setmap-offrom/\nmodule.exports = function (C, adder, ENTRY) {\n return function of() {\n var result = new C();\n var length = arguments.length;\n for (var index = 0; index < length; index++) {\n var entry = arguments[index];\n if (ENTRY) adder(result, anObject(entry)[0], entry[1]);\n else adder(result, entry);\n } return result;\n };\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar MapHelpers = require('../internals/map-helpers');\nvar createCollectionOf = require('../internals/collection-of');\n\n// `Map.of` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of\n$({ target: 'Map', stat: true, forced: true }, {\n of: createCollectionOf(MapHelpers.Map, MapHelpers.set, true)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aCallable = require('../internals/a-callable');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\nvar $TypeError = TypeError;\n\n// `Map.prototype.reduce` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n var map = aMap(this);\n var noInitial = arguments.length < 2;\n var accumulator = noInitial ? undefined : arguments[1];\n aCallable(callbackfn);\n iterate(map, function (value, key) {\n if (noInitial) {\n noInitial = false;\n accumulator = value;\n } else {\n accumulator = callbackfn(accumulator, value, key, map);\n }\n });\n if (noInitial) throw new $TypeError('Reduce of empty map with no initial value');\n return accumulator;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.some` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n some: function some(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return iterate(map, function (value, key) {\n if (boundFunction(value, key, map)) return true;\n }, true) === true;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aCallable = require('../internals/a-callable');\nvar aMap = require('../internals/a-map');\nvar MapHelpers = require('../internals/map-helpers');\n\nvar $TypeError = TypeError;\nvar get = MapHelpers.get;\nvar has = MapHelpers.has;\nvar set = MapHelpers.set;\n\n// `Map.prototype.update` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n update: function update(key, callback /* , thunk */) {\n var map = aMap(this);\n var length = arguments.length;\n aCallable(callback);\n var isPresentInMap = has(map, key);\n if (!isPresentInMap && length < 3) {\n throw new $TypeError('Updating absent value');\n }\n var value = isPresentInMap ? get(map, key) : aCallable(length > 2 ? arguments[2] : undefined)(key, map);\n set(map, key, callback(value, key, map));\n return map;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\nvar min = Math.min;\nvar max = Math.max;\n\n// `Math.clamp` method\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, forced: true }, {\n clamp: function clamp(x, lower, upper) {\n return min(upper, max(lower, x));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.DEG_PER_RAD` constant\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, nonConfigurable: true, nonWritable: true }, {\n DEG_PER_RAD: Math.PI / 180\n});\n","'use strict';\nvar $ = require('../internals/export');\n\nvar RAD_PER_DEG = 180 / Math.PI;\n\n// `Math.degrees` method\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, forced: true }, {\n degrees: function degrees(radians) {\n return radians * RAD_PER_DEG;\n }\n});\n","'use strict';\n// `Math.scale` method implementation\n// https://rwaldron.github.io/proposal-math-extensions/\nmodule.exports = function scale(x, inLow, inHigh, outLow, outHigh) {\n var nx = +x;\n var nInLow = +inLow;\n var nInHigh = +inHigh;\n var nOutLow = +outLow;\n var nOutHigh = +outHigh;\n // eslint-disable-next-line no-self-compare -- NaN check\n if (nx !== nx || nInLow !== nInLow || nInHigh !== nInHigh || nOutLow !== nOutLow || nOutHigh !== nOutHigh) return NaN;\n if (nx === Infinity || nx === -Infinity) return nx;\n return (nx - nInLow) * (nOutHigh - nOutLow) / (nInHigh - nInLow) + nOutLow;\n};\n","'use strict';\nvar $ = require('../internals/export');\n\nvar scale = require('../internals/math-scale');\nvar fround = require('../internals/math-fround');\n\n// `Math.fscale` method\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, forced: true }, {\n fscale: function fscale(x, inLow, inHigh, outLow, outHigh) {\n return fround(scale(x, inLow, inHigh, outLow, outHigh));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.iaddh` method\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n// TODO: Remove from `core-js@4`\n$({ target: 'Math', stat: true, forced: true }, {\n iaddh: function iaddh(x0, x1, y0, y1) {\n var $x0 = x0 >>> 0;\n var $x1 = x1 >>> 0;\n var $y0 = y0 >>> 0;\n return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.imulh` method\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n// TODO: Remove from `core-js@4`\n$({ target: 'Math', stat: true, forced: true }, {\n imulh: function imulh(u, v) {\n var UINT16 = 0xFFFF;\n var $u = +u;\n var $v = +v;\n var u0 = $u & UINT16;\n var v0 = $v & UINT16;\n var u1 = $u >> 16;\n var v1 = $v >> 16;\n var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.isubh` method\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n// TODO: Remove from `core-js@4`\n$({ target: 'Math', stat: true, forced: true }, {\n isubh: function isubh(x0, x1, y0, y1) {\n var $x0 = x0 >>> 0;\n var $x1 = x1 >>> 0;\n var $y0 = y0 >>> 0;\n return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.RAD_PER_DEG` constant\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, nonConfigurable: true, nonWritable: true }, {\n RAD_PER_DEG: 180 / Math.PI\n});\n","'use strict';\nvar $ = require('../internals/export');\n\nvar DEG_PER_RAD = Math.PI / 180;\n\n// `Math.radians` method\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, forced: true }, {\n radians: function radians(degrees) {\n return degrees * DEG_PER_RAD;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar scale = require('../internals/math-scale');\n\n// `Math.scale` method\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, forced: true }, {\n scale: scale\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nvar globalIsFinite = globalThis.isFinite;\n\n// `Number.isFinite` method\n// https://tc39.es/ecma262/#sec-number.isfinite\n// eslint-disable-next-line es/no-number-isfinite -- safe\nmodule.exports = Number.isFinite || function isFinite(it) {\n return typeof it == 'number' && globalIsFinite(it);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar anObject = require('../internals/an-object');\nvar numberIsFinite = require('../internals/number-is-finite');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar SEEDED_RANDOM = 'Seeded Random';\nvar SEEDED_RANDOM_GENERATOR = SEEDED_RANDOM + ' Generator';\nvar SEED_TYPE_ERROR = 'Math.seededPRNG() argument should have a \"seed\" field with a finite value.';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SEEDED_RANDOM_GENERATOR);\nvar $TypeError = TypeError;\n\nvar $SeededRandomGenerator = createIteratorConstructor(function SeededRandomGenerator(seed) {\n setInternalState(this, {\n type: SEEDED_RANDOM_GENERATOR,\n seed: seed % 2147483647\n });\n}, SEEDED_RANDOM, function next() {\n var state = getInternalState(this);\n var seed = state.seed = (state.seed * 1103515245 + 12345) % 2147483647;\n return createIterResultObject((seed & 1073741823) / 1073741823, false);\n});\n\n// `Math.seededPRNG` method\n// https://github.com/tc39/proposal-seeded-random\n// based on https://github.com/tc39/proposal-seeded-random/blob/78b8258835b57fc2100d076151ab506bc3202ae6/demo.html\n$({ target: 'Math', stat: true, forced: true }, {\n seededPRNG: function seededPRNG(it) {\n var seed = anObject(it).seed;\n if (!numberIsFinite(seed)) throw new $TypeError(SEED_TYPE_ERROR);\n return new $SeededRandomGenerator(seed);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.signbit` method\n// https://github.com/tc39/proposal-Math.signbit\n$({ target: 'Math', stat: true, forced: true }, {\n signbit: function signbit(x) {\n var n = +x;\n // eslint-disable-next-line no-self-compare -- NaN check\n return n === n && n === 0 ? 1 / n === -Infinity : n < 0;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.umulh` method\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n// TODO: Remove from `core-js@4`\n$({ target: 'Math', stat: true, forced: true }, {\n umulh: function umulh(u, v) {\n var UINT16 = 0xFFFF;\n var $u = +u;\n var $v = +v;\n var u0 = $u & UINT16;\n var v0 = $v & UINT16;\n var u1 = $u >>> 16;\n var v1 = $v >>> 16;\n var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar INVALID_NUMBER_REPRESENTATION = 'Invalid number representation';\nvar INVALID_RADIX = 'Invalid radix';\nvar $RangeError = RangeError;\nvar $SyntaxError = SyntaxError;\nvar $TypeError = TypeError;\nvar $parseInt = parseInt;\nvar pow = Math.pow;\nvar valid = /^[\\d.a-z]+$/;\nvar charAt = uncurryThis(''.charAt);\nvar exec = uncurryThis(valid.exec);\nvar numberToString = uncurryThis(1.0.toString);\nvar stringSlice = uncurryThis(''.slice);\nvar split = uncurryThis(''.split);\n\n// `Number.fromString` method\n// https://github.com/tc39/proposal-number-fromstring\n$({ target: 'Number', stat: true, forced: true }, {\n fromString: function fromString(string, radix) {\n var sign = 1;\n if (typeof string != 'string') throw new $TypeError(INVALID_NUMBER_REPRESENTATION);\n if (!string.length) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);\n if (charAt(string, 0) === '-') {\n sign = -1;\n string = stringSlice(string, 1);\n if (!string.length) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);\n }\n var R = radix === undefined ? 10 : toIntegerOrInfinity(radix);\n if (R < 2 || R > 36) throw new $RangeError(INVALID_RADIX);\n if (!exec(valid, string)) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);\n var parts = split(string, '.');\n var mathNum = $parseInt(parts[0], R);\n if (parts.length > 1) mathNum += $parseInt(parts[1], R) / pow(R, parts[1].length);\n if (R === 10 && numberToString(mathNum, R) !== string) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);\n return sign * mathNum;\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-observable\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar setSpecies = require('../internals/set-species');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isObject = require('../internals/is-object');\nvar getMethod = require('../internals/get-method');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar $$OBSERVABLE = wellKnownSymbol('observable');\nvar OBSERVABLE = 'Observable';\nvar SUBSCRIPTION = 'Subscription';\nvar SUBSCRIPTION_OBSERVER = 'SubscriptionObserver';\nvar getterFor = InternalStateModule.getterFor;\nvar setInternalState = InternalStateModule.set;\nvar getObservableInternalState = getterFor(OBSERVABLE);\nvar getSubscriptionInternalState = getterFor(SUBSCRIPTION);\nvar getSubscriptionObserverInternalState = getterFor(SUBSCRIPTION_OBSERVER);\n\nvar SubscriptionState = function (observer) {\n this.observer = anObject(observer);\n this.cleanup = null;\n this.subscriptionObserver = null;\n};\n\nSubscriptionState.prototype = {\n type: SUBSCRIPTION,\n clean: function () {\n var cleanup = this.cleanup;\n if (cleanup) {\n this.cleanup = null;\n try {\n cleanup();\n } catch (error) {\n hostReportErrors(error);\n }\n }\n },\n close: function () {\n if (!DESCRIPTORS) {\n var subscription = this.facade;\n var subscriptionObserver = this.subscriptionObserver;\n subscription.closed = true;\n if (subscriptionObserver) subscriptionObserver.closed = true;\n } this.observer = null;\n },\n isClosed: function () {\n return this.observer === null;\n }\n};\n\nvar Subscription = function (observer, subscriber) {\n var subscriptionState = setInternalState(this, new SubscriptionState(observer));\n var start;\n if (!DESCRIPTORS) this.closed = false;\n try {\n if (start = getMethod(observer, 'start')) call(start, observer, this);\n } catch (error) {\n hostReportErrors(error);\n }\n if (subscriptionState.isClosed()) return;\n var subscriptionObserver = subscriptionState.subscriptionObserver = new SubscriptionObserver(subscriptionState);\n try {\n var cleanup = subscriber(subscriptionObserver);\n var subscription = cleanup;\n if (!isNullOrUndefined(cleanup)) subscriptionState.cleanup = isCallable(cleanup.unsubscribe)\n ? function () { subscription.unsubscribe(); }\n : aCallable(cleanup);\n } catch (error) {\n subscriptionObserver.error(error);\n return;\n } if (subscriptionState.isClosed()) subscriptionState.clean();\n};\n\nSubscription.prototype = defineBuiltIns({}, {\n unsubscribe: function unsubscribe() {\n var subscriptionState = getSubscriptionInternalState(this);\n if (!subscriptionState.isClosed()) {\n subscriptionState.close();\n subscriptionState.clean();\n }\n }\n});\n\nif (DESCRIPTORS) defineBuiltInAccessor(Subscription.prototype, 'closed', {\n configurable: true,\n get: function closed() {\n return getSubscriptionInternalState(this).isClosed();\n }\n});\n\nvar SubscriptionObserver = function (subscriptionState) {\n setInternalState(this, {\n type: SUBSCRIPTION_OBSERVER,\n subscriptionState: subscriptionState\n });\n if (!DESCRIPTORS) this.closed = false;\n};\n\nSubscriptionObserver.prototype = defineBuiltIns({}, {\n next: function next(value) {\n var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;\n if (!subscriptionState.isClosed()) {\n var observer = subscriptionState.observer;\n try {\n var nextMethod = getMethod(observer, 'next');\n if (nextMethod) call(nextMethod, observer, value);\n } catch (error) {\n hostReportErrors(error);\n }\n }\n },\n error: function error(value) {\n var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;\n if (!subscriptionState.isClosed()) {\n var observer = subscriptionState.observer;\n subscriptionState.close();\n try {\n var errorMethod = getMethod(observer, 'error');\n if (errorMethod) call(errorMethod, observer, value);\n else hostReportErrors(value);\n } catch (err) {\n hostReportErrors(err);\n } subscriptionState.clean();\n }\n },\n complete: function complete() {\n var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;\n if (!subscriptionState.isClosed()) {\n var observer = subscriptionState.observer;\n subscriptionState.close();\n try {\n var completeMethod = getMethod(observer, 'complete');\n if (completeMethod) call(completeMethod, observer);\n } catch (error) {\n hostReportErrors(error);\n } subscriptionState.clean();\n }\n }\n});\n\nif (DESCRIPTORS) defineBuiltInAccessor(SubscriptionObserver.prototype, 'closed', {\n configurable: true,\n get: function closed() {\n return getSubscriptionObserverInternalState(this).subscriptionState.isClosed();\n }\n});\n\nvar $Observable = function Observable(subscriber) {\n anInstance(this, ObservablePrototype);\n setInternalState(this, {\n type: OBSERVABLE,\n subscriber: aCallable(subscriber)\n });\n};\n\nvar ObservablePrototype = $Observable.prototype;\n\ndefineBuiltIns(ObservablePrototype, {\n subscribe: function subscribe(observer) {\n var length = arguments.length;\n return new Subscription(isCallable(observer) ? {\n next: observer,\n error: length > 1 ? arguments[1] : undefined,\n complete: length > 2 ? arguments[2] : undefined\n } : isObject(observer) ? observer : {}, getObservableInternalState(this).subscriber);\n }\n});\n\ndefineBuiltIn(ObservablePrototype, $$OBSERVABLE, function () { return this; });\n\n$({ global: true, constructor: true, forced: true }, {\n Observable: $Observable\n});\n\nsetSpecies(OBSERVABLE);\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar isConstructor = require('../internals/is-constructor');\nvar getIterator = require('../internals/get-iterator');\nvar getMethod = require('../internals/get-method');\nvar iterate = require('../internals/iterate');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $$OBSERVABLE = wellKnownSymbol('observable');\n\n// `Observable.from` method\n// https://github.com/tc39/proposal-observable\n$({ target: 'Observable', stat: true, forced: true }, {\n from: function from(x) {\n var C = isConstructor(this) ? this : getBuiltIn('Observable');\n var observableMethod = getMethod(anObject(x), $$OBSERVABLE);\n if (observableMethod) {\n var observable = anObject(call(observableMethod, x));\n return observable.constructor === C ? observable : new C(function (observer) {\n return observable.subscribe(observer);\n });\n }\n var iterator = getIterator(x);\n return new C(function (observer) {\n iterate(iterator, function (it, stop) {\n observer.next(it);\n if (observer.closed) return stop();\n }, { IS_ITERATOR: true, INTERRUPTED: true });\n observer.complete();\n });\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isConstructor = require('../internals/is-constructor');\n\nvar Array = getBuiltIn('Array');\n\n// `Observable.of` method\n// https://github.com/tc39/proposal-observable\n$({ target: 'Observable', stat: true, forced: true }, {\n of: function of() {\n var C = isConstructor(this) ? this : getBuiltIn('Observable');\n var length = arguments.length;\n var items = Array(length);\n var index = 0;\n while (index < length) items[index] = arguments[index++];\n return new C(function (observer) {\n for (var i = 0; i < length; i++) {\n observer.next(items[i]);\n if (observer.closed) return;\n } observer.complete();\n });\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\n// `Promise.allSettled` method\n// https://tc39.es/ecma262/#sec-promise.allsettled\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n allSettled: function allSettled(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var promiseResolve = aCallable(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n remaining++;\n call(promiseResolve, C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'fulfilled', value: value };\n --remaining || resolve(values);\n }, function (error) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'rejected', reason: error };\n --remaining || resolve(values);\n });\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar getBuiltIn = require('../internals/get-built-in');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\nvar PROMISE_ANY_ERROR = 'No one promise resolved';\n\n// `Promise.any` method\n// https://tc39.es/ecma262/#sec-promise.any\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n any: function any(iterable) {\n var C = this;\n var AggregateError = getBuiltIn('AggregateError');\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var promiseResolve = aCallable(C.resolve);\n var errors = [];\n var counter = 0;\n var remaining = 1;\n var alreadyResolved = false;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyRejected = false;\n remaining++;\n call(promiseResolve, C, promise).then(function (value) {\n if (alreadyRejected || alreadyResolved) return;\n alreadyResolved = true;\n resolve(value);\n }, function (error) {\n if (alreadyRejected || alreadyResolved) return;\n alreadyRejected = true;\n errors[index] = error;\n --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR));\n });\n });\n --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR));\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar apply = require('../internals/function-apply');\nvar slice = require('../internals/array-slice');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar aCallable = require('../internals/a-callable');\nvar perform = require('../internals/perform');\n\nvar Promise = globalThis.Promise;\n\nvar ACCEPT_ARGUMENTS = false;\n// Avoiding the use of polyfills of the previous iteration of this proposal\n// that does not accept arguments of the callback\nvar FORCED = !Promise || !Promise['try'] || perform(function () {\n Promise['try'](function (argument) {\n ACCEPT_ARGUMENTS = argument === 8;\n }, 8);\n}).error || !ACCEPT_ARGUMENTS;\n\n// `Promise.try` method\n// https://tc39.es/ecma262/#sec-promise.try\n$({ target: 'Promise', stat: true, forced: FORCED }, {\n 'try': function (callbackfn /* , ...args */) {\n var args = arguments.length > 1 ? slice(arguments, 1) : [];\n var promiseCapability = newPromiseCapabilityModule.f(this);\n var result = perform(function () {\n return apply(aCallable(callbackfn), undefined, args);\n });\n (result.error ? promiseCapability.reject : promiseCapability.resolve)(result.value);\n return promiseCapability.promise;\n }\n});\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.map');\nrequire('../modules/es.weak-map');\nvar getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar shared = require('../internals/shared');\n\nvar Map = getBuiltIn('Map');\nvar WeakMap = getBuiltIn('WeakMap');\nvar push = uncurryThis([].push);\n\nvar metadata = shared('metadata');\nvar store = metadata.store || (metadata.store = new WeakMap());\n\nvar getOrCreateMetadataMap = function (target, targetKey, create) {\n var targetMetadata = store.get(target);\n if (!targetMetadata) {\n if (!create) return;\n store.set(target, targetMetadata = new Map());\n }\n var keyMetadata = targetMetadata.get(targetKey);\n if (!keyMetadata) {\n if (!create) return;\n targetMetadata.set(targetKey, keyMetadata = new Map());\n } return keyMetadata;\n};\n\nvar ordinaryHasOwnMetadata = function (MetadataKey, O, P) {\n var metadataMap = getOrCreateMetadataMap(O, P, false);\n return metadataMap === undefined ? false : metadataMap.has(MetadataKey);\n};\n\nvar ordinaryGetOwnMetadata = function (MetadataKey, O, P) {\n var metadataMap = getOrCreateMetadataMap(O, P, false);\n return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey);\n};\n\nvar ordinaryDefineOwnMetadata = function (MetadataKey, MetadataValue, O, P) {\n getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue);\n};\n\nvar ordinaryOwnMetadataKeys = function (target, targetKey) {\n var metadataMap = getOrCreateMetadataMap(target, targetKey, false);\n var keys = [];\n if (metadataMap) metadataMap.forEach(function (_, key) { push(keys, key); });\n return keys;\n};\n\nvar toMetadataKey = function (it) {\n return it === undefined || typeof it == 'symbol' ? it : String(it);\n};\n\nmodule.exports = {\n store: store,\n getMap: getOrCreateMetadataMap,\n has: ordinaryHasOwnMetadata,\n get: ordinaryGetOwnMetadata,\n set: ordinaryDefineOwnMetadata,\n keys: ordinaryOwnMetadataKeys,\n toKey: toMetadataKey\n};\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar toMetadataKey = ReflectMetadataModule.toKey;\nvar ordinaryDefineOwnMetadata = ReflectMetadataModule.set;\n\n// `Reflect.defineMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n defineMetadata: function defineMetadata(metadataKey, metadataValue, target /* , targetKey */) {\n var targetKey = arguments.length < 4 ? undefined : toMetadataKey(arguments[3]);\n ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), targetKey);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar toMetadataKey = ReflectMetadataModule.toKey;\nvar getOrCreateMetadataMap = ReflectMetadataModule.getMap;\nvar store = ReflectMetadataModule.store;\n\n// `Reflect.deleteMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n deleteMetadata: function deleteMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false);\n if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false;\n if (metadataMap.size) return true;\n var targetMetadata = store.get(target);\n targetMetadata['delete'](targetKey);\n return !!targetMetadata.size || store['delete'](target);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\n\nvar ordinaryHasOwnMetadata = ReflectMetadataModule.has;\nvar ordinaryGetOwnMetadata = ReflectMetadataModule.get;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\nvar ordinaryGetMetadata = function (MetadataKey, O, P) {\n var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P);\n var parent = getPrototypeOf(O);\n return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined;\n};\n\n// `Reflect.getMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n getMetadata: function getMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n return ordinaryGetMetadata(metadataKey, anObject(target), targetKey);\n }\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar toObject = require('../internals/to-object');\nvar MapHelpers = require('../internals/map-helpers');\nvar iterate = require('../internals/map-iterate');\n\nvar Map = MapHelpers.Map;\nvar mapHas = MapHelpers.has;\nvar mapSet = MapHelpers.set;\nvar push = uncurryThis([].push);\n\n// `Array.prototype.uniqueBy` method\n// https://github.com/tc39/proposal-array-unique\nmodule.exports = function uniqueBy(resolver) {\n var that = toObject(this);\n var length = lengthOfArrayLike(that);\n var result = [];\n var map = new Map();\n var resolverFunction = !isNullOrUndefined(resolver) ? aCallable(resolver) : function (value) {\n return value;\n };\n var index, item, key;\n for (index = 0; index < length; index++) {\n item = that[index];\n key = resolverFunction(item);\n if (!mapHas(map, key)) mapSet(map, key, item);\n }\n iterate(map, function (value) {\n push(result, value);\n });\n return result;\n};\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar $arrayUniqueBy = require('../internals/array-unique-by');\n\nvar arrayUniqueBy = uncurryThis($arrayUniqueBy);\nvar concat = uncurryThis([].concat);\nvar ordinaryOwnMetadataKeys = ReflectMetadataModule.keys;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\nvar ordinaryMetadataKeys = function (O, P) {\n var oKeys = ordinaryOwnMetadataKeys(O, P);\n var parent = getPrototypeOf(O);\n if (parent === null) return oKeys;\n var pKeys = ordinaryMetadataKeys(parent, P);\n return pKeys.length ? oKeys.length ? arrayUniqueBy(concat(oKeys, pKeys)) : pKeys : oKeys;\n};\n\n// `Reflect.getMetadataKeys` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n getMetadataKeys: function getMetadataKeys(target /* , targetKey */) {\n var targetKey = arguments.length < 2 ? undefined : toMetadataKey(arguments[1]);\n return ordinaryMetadataKeys(anObject(target), targetKey);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar ordinaryGetOwnMetadata = ReflectMetadataModule.get;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\n// `Reflect.getOwnMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n getOwnMetadata: function getOwnMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n return ordinaryGetOwnMetadata(metadataKey, anObject(target), targetKey);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar ordinaryOwnMetadataKeys = ReflectMetadataModule.keys;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\n// `Reflect.getOwnMetadataKeys` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n getOwnMetadataKeys: function getOwnMetadataKeys(target /* , targetKey */) {\n var targetKey = arguments.length < 2 ? undefined : toMetadataKey(arguments[1]);\n return ordinaryOwnMetadataKeys(anObject(target), targetKey);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\n\nvar ordinaryHasOwnMetadata = ReflectMetadataModule.has;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\nvar ordinaryHasMetadata = function (MetadataKey, O, P) {\n var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n if (hasOwn) return true;\n var parent = getPrototypeOf(O);\n return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false;\n};\n\n// `Reflect.hasMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n hasMetadata: function hasMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n return ordinaryHasMetadata(metadataKey, anObject(target), targetKey);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar ordinaryHasOwnMetadata = ReflectMetadataModule.has;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\n// `Reflect.hasOwnMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n hasOwnMetadata: function hasOwnMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n return ordinaryHasOwnMetadata(metadataKey, anObject(target), targetKey);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar toMetadataKey = ReflectMetadataModule.toKey;\nvar ordinaryDefineOwnMetadata = ReflectMetadataModule.set;\n\n// `Reflect.metadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n metadata: function metadata(metadataKey, metadataValue) {\n return function decorator(target, key) {\n ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetadataKey(key));\n };\n }\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-set -- safe\nvar SetPrototype = Set.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-set -- safe\n Set: Set,\n add: uncurryThis(SetPrototype.add),\n has: uncurryThis(SetPrototype.has),\n remove: uncurryThis(SetPrototype['delete']),\n proto: SetPrototype\n};\n","'use strict';\nvar has = require('../internals/set-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[SetData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar aSet = require('../internals/a-set');\nvar add = require('../internals/set-helpers').add;\n\n// `Set.prototype.addAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n addAll: function addAll(/* ...elements */) {\n var set = aSet(this);\n for (var k = 0, len = arguments.length; k < len; k++) {\n add(set, arguments[k]);\n } return set;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aSet = require('../internals/a-set');\nvar remove = require('../internals/set-helpers').remove;\n\n// `Set.prototype.deleteAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n deleteAll: function deleteAll(/* ...elements */) {\n var collection = aSet(this);\n var allDeleted = true;\n var wasDeleted;\n for (var k = 0, len = arguments.length; k < len; k++) {\n wasDeleted = remove(collection, arguments[k]);\n allDeleted = allDeleted && wasDeleted;\n } return !!allDeleted;\n }\n});\n","'use strict';\nvar classof = require('../internals/classof');\nvar hasOwn = require('../internals/has-own-property');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar $Object = Object;\n\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) return false;\n var O = $Object(it);\n return O[ITERATOR] !== undefined\n || '@@iterator' in O\n || hasOwn(Iterators, classof(O));\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isIterable = require('../internals/is-iterable');\nvar isObject = require('../internals/is-object');\n\nvar Set = getBuiltIn('Set');\n\nvar isSetLike = function (it) {\n return isObject(it)\n && typeof it.size == 'number'\n && isCallable(it.has)\n && isCallable(it.keys);\n};\n\n// fallback old -> new set methods proposal arguments\nmodule.exports = function (it) {\n if (isSetLike(it)) return it;\n return isIterable(it) ? new Set(it) : it;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar iterateSimple = require('../internals/iterate-simple');\nvar SetHelpers = require('../internals/set-helpers');\n\nvar Set = SetHelpers.Set;\nvar SetPrototype = SetHelpers.proto;\nvar forEach = uncurryThis(SetPrototype.forEach);\nvar keys = uncurryThis(SetPrototype.keys);\nvar next = keys(new Set()).next;\n\nmodule.exports = function (set, fn, interruptible) {\n return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn);\n};\n","'use strict';\nvar SetHelpers = require('../internals/set-helpers');\nvar iterate = require('../internals/set-iterate');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\n\nmodule.exports = function (set) {\n var result = new Set();\n iterate(set, function (it) {\n add(result, it);\n });\n return result;\n};\n","'use strict';\nvar uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');\nvar SetHelpers = require('../internals/set-helpers');\n\nmodule.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) {\n return set.size;\n};\n","'use strict';\n// `GetIteratorDirect(obj)` abstract operation\n// https://tc39.es/proposal-iterator-helpers/#sec-getiteratordirect\nmodule.exports = function (obj) {\n return {\n iterator: obj,\n next: obj.next,\n done: false\n };\n};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar call = require('../internals/function-call');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar getIteratorDirect = require('../internals/get-iterator-direct');\n\nvar INVALID_SIZE = 'Invalid size';\nvar $RangeError = RangeError;\nvar $TypeError = TypeError;\nvar max = Math.max;\n\nvar SetRecord = function (set, intSize) {\n this.set = set;\n this.size = max(intSize, 0);\n this.has = aCallable(set.has);\n this.keys = aCallable(set.keys);\n};\n\nSetRecord.prototype = {\n getIterator: function () {\n return getIteratorDirect(anObject(call(this.keys, this.set)));\n },\n includes: function (it) {\n return call(this.has, this.set, it);\n }\n};\n\n// `GetSetRecord` abstract operation\n// https://tc39.es/proposal-set-methods/#sec-getsetrecord\nmodule.exports = function (obj) {\n anObject(obj);\n var numSize = +obj.size;\n // NOTE: If size is undefined, then numSize will be NaN\n // eslint-disable-next-line no-self-compare -- NaN check\n if (numSize !== numSize) throw new $TypeError(INVALID_SIZE);\n var intSize = toIntegerOrInfinity(numSize);\n if (intSize < 0) throw new $RangeError(INVALID_SIZE);\n return new SetRecord(obj, intSize);\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar clone = require('../internals/set-clone');\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.difference` method\n// https://github.com/tc39/proposal-set-methods\nmodule.exports = function difference(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n var result = clone(O);\n if (size(O) <= otherRec.size) iterateSet(O, function (e) {\n if (otherRec.includes(e)) remove(result, e);\n });\n else iterateSimple(otherRec.getIterator(), function (e) {\n if (has(O, e)) remove(result, e);\n });\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $difference = require('../internals/set-difference');\n\n// `Set.prototype.difference` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n difference: function difference(other) {\n return call($difference, this, toSetLike(other));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\n\n// `Set.prototype.every` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n every: function every(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return iterate(set, function (value) {\n if (!boundFunction(value, value, set)) return false;\n }, true) !== false;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar iterate = require('../internals/set-iterate');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\n\n// `Set.prototype.filter` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n filter: function filter(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newSet = new Set();\n iterate(set, function (value) {\n if (boundFunction(value, value, set)) add(newSet, value);\n });\n return newSet;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\n\n// `Set.prototype.find` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n find: function find(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var result = iterate(set, function (value) {\n if (boundFunction(value, value, set)) return { value: value };\n }, true);\n return result && result.value;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar SetHelpers = require('../internals/set-helpers');\nvar createCollectionFrom = require('../internals/collection-from');\n\n// `Set.from` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from\n$({ target: 'Set', stat: true, forced: true }, {\n from: createCollectionFrom(SetHelpers.Set, SetHelpers.add, false)\n});\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\n\n// `Set.prototype.intersection` method\n// https://github.com/tc39/proposal-set-methods\nmodule.exports = function intersection(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n var result = new Set();\n\n if (size(O) > otherRec.size) {\n iterateSimple(otherRec.getIterator(), function (e) {\n if (has(O, e)) add(result, e);\n });\n } else {\n iterateSet(O, function (e) {\n if (otherRec.includes(e)) add(result, e);\n });\n }\n\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $intersection = require('../internals/set-intersection');\n\n// `Set.prototype.intersection` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n intersection: function intersection(other) {\n return call($intersection, this, toSetLike(other));\n }\n});\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar has = require('../internals/set-helpers').has;\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\nvar iteratorClose = require('../internals/iterator-close');\n\n// `Set.prototype.isDisjointFrom` method\n// https://tc39.github.io/proposal-set-methods/#Set.prototype.isDisjointFrom\nmodule.exports = function isDisjointFrom(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) <= otherRec.size) return iterateSet(O, function (e) {\n if (otherRec.includes(e)) return false;\n }, true) !== false;\n var iterator = otherRec.getIterator();\n return iterateSimple(iterator, function (e) {\n if (has(O, e)) return iteratorClose(iterator, 'normal', false);\n }) !== false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $isDisjointFrom = require('../internals/set-is-disjoint-from');\n\n// `Set.prototype.isDisjointFrom` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n isDisjointFrom: function isDisjointFrom(other) {\n return call($isDisjointFrom, this, toSetLike(other));\n }\n});\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar size = require('../internals/set-size');\nvar iterate = require('../internals/set-iterate');\nvar getSetRecord = require('../internals/get-set-record');\n\n// `Set.prototype.isSubsetOf` method\n// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSubsetOf\nmodule.exports = function isSubsetOf(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) > otherRec.size) return false;\n return iterate(O, function (e) {\n if (!otherRec.includes(e)) return false;\n }, true) !== false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $isSubsetOf = require('../internals/set-is-subset-of');\n\n// `Set.prototype.isSubsetOf` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n isSubsetOf: function isSubsetOf(other) {\n return call($isSubsetOf, this, toSetLike(other));\n }\n});\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar has = require('../internals/set-helpers').has;\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\nvar iteratorClose = require('../internals/iterator-close');\n\n// `Set.prototype.isSupersetOf` method\n// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSupersetOf\nmodule.exports = function isSupersetOf(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) < otherRec.size) return false;\n var iterator = otherRec.getIterator();\n return iterateSimple(iterator, function (e) {\n if (!has(O, e)) return iteratorClose(iterator, 'normal', false);\n }) !== false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $isSupersetOf = require('../internals/set-is-superset-of');\n\n// `Set.prototype.isSupersetOf` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n isSupersetOf: function isSupersetOf(other) {\n return call($isSupersetOf, this, toSetLike(other));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\nvar toString = require('../internals/to-string');\n\nvar arrayJoin = uncurryThis([].join);\nvar push = uncurryThis([].push);\n\n// `Set.prototype.join` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n join: function join(separator) {\n var set = aSet(this);\n var sep = separator === undefined ? ',' : toString(separator);\n var array = [];\n iterate(set, function (value) {\n push(array, value);\n });\n return arrayJoin(array, sep);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar iterate = require('../internals/set-iterate');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\n\n// `Set.prototype.map` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n map: function map(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newSet = new Set();\n iterate(set, function (value) {\n add(newSet, boundFunction(value, value, set));\n });\n return newSet;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar SetHelpers = require('../internals/set-helpers');\nvar createCollectionOf = require('../internals/collection-of');\n\n// `Set.of` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of\n$({ target: 'Set', stat: true, forced: true }, {\n of: createCollectionOf(SetHelpers.Set, SetHelpers.add, false)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aCallable = require('../internals/a-callable');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\n\nvar $TypeError = TypeError;\n\n// `Set.prototype.reduce` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n var set = aSet(this);\n var noInitial = arguments.length < 2;\n var accumulator = noInitial ? undefined : arguments[1];\n aCallable(callbackfn);\n iterate(set, function (value) {\n if (noInitial) {\n noInitial = false;\n accumulator = value;\n } else {\n accumulator = callbackfn(accumulator, value, value, set);\n }\n });\n if (noInitial) throw new $TypeError('Reduce of empty set with no initial value');\n return accumulator;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\n\n// `Set.prototype.some` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n some: function some(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return iterate(set, function (value) {\n if (boundFunction(value, value, set)) return true;\n }, true) === true;\n }\n});\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar clone = require('../internals/set-clone');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.symmetricDifference` method\n// https://github.com/tc39/proposal-set-methods\nmodule.exports = function symmetricDifference(other) {\n var O = aSet(this);\n var keysIter = getSetRecord(other).getIterator();\n var result = clone(O);\n iterateSimple(keysIter, function (e) {\n if (has(O, e)) remove(result, e);\n else add(result, e);\n });\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $symmetricDifference = require('../internals/set-symmetric-difference');\n\n// `Set.prototype.symmetricDifference` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n symmetricDifference: function symmetricDifference(other) {\n return call($symmetricDifference, this, toSetLike(other));\n }\n});\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar add = require('../internals/set-helpers').add;\nvar clone = require('../internals/set-clone');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\n\n// `Set.prototype.union` method\n// https://github.com/tc39/proposal-set-methods\nmodule.exports = function union(other) {\n var O = aSet(this);\n var keysIter = getSetRecord(other).getIterator();\n var result = clone(O);\n iterateSimple(keysIter, function (it) {\n add(result, it);\n });\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $union = require('../internals/set-union');\n\n// `Set.prototype.union` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n union: function union(other) {\n return call($union, this, toSetLike(other));\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar charAt = require('../internals/string-multibyte').charAt;\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\n\n// `String.prototype.at` method\n// https://github.com/mathiasbynens/String.prototype.at\n$({ target: 'String', proto: true, forced: true }, {\n at: function at(index) {\n var S = toString(requireObjectCoercible(this));\n var len = S.length;\n var relativeIndex = toIntegerOrInfinity(index);\n var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex;\n return (k < 0 || k >= len) ? undefined : charAt(S, k);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toString = require('../internals/to-string');\nvar InternalStateModule = require('../internals/internal-state');\nvar StringMultibyteModule = require('../internals/string-multibyte');\n\nvar codeAt = StringMultibyteModule.codeAt;\nvar charAt = StringMultibyteModule.charAt;\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// TODO: unify with String#@@iterator\nvar $StringIterator = createIteratorConstructor(function StringIterator(string) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: string,\n index: 0\n });\n}, 'String', function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return createIterResultObject(undefined, true);\n point = charAt(string, index);\n state.index += point.length;\n return createIterResultObject({ codePoint: codeAt(point, 0), position: index }, false);\n});\n\n// `String.prototype.codePoints` method\n// https://github.com/tc39/proposal-string-prototype-codepoints\n$({ target: 'String', proto: true, forced: true }, {\n codePoints: function codePoints() {\n return new $StringIterator(toString(requireObjectCoercible(this)));\n }\n});\n","'use strict';\n/* eslint-disable es/no-string-prototype-matchall -- safe */\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar anObject = require('../internals/an-object');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar classof = require('../internals/classof-raw');\nvar isRegExp = require('../internals/is-regexp');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar getMethod = require('../internals/get-method');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\nvar InternalStateModule = require('../internals/internal-state');\nvar IS_PURE = require('../internals/is-pure');\n\nvar MATCH_ALL = wellKnownSymbol('matchAll');\nvar REGEXP_STRING = 'RegExp String';\nvar REGEXP_STRING_ITERATOR = REGEXP_STRING + ' Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(REGEXP_STRING_ITERATOR);\nvar RegExpPrototype = RegExp.prototype;\nvar $TypeError = TypeError;\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar nativeMatchAll = uncurryThis(''.matchAll);\n\nvar WORKS_WITH_NON_GLOBAL_REGEX = !!nativeMatchAll && !fails(function () {\n nativeMatchAll('a', /./);\n});\n\nvar $RegExpStringIterator = createIteratorConstructor(function RegExpStringIterator(regexp, string, $global, fullUnicode) {\n setInternalState(this, {\n type: REGEXP_STRING_ITERATOR,\n regexp: regexp,\n string: string,\n global: $global,\n unicode: fullUnicode,\n done: false\n });\n}, REGEXP_STRING, function next() {\n var state = getInternalState(this);\n if (state.done) return createIterResultObject(undefined, true);\n var R = state.regexp;\n var S = state.string;\n var match = regExpExec(R, S);\n if (match === null) {\n state.done = true;\n return createIterResultObject(undefined, true);\n }\n if (state.global) {\n if (toString(match[0]) === '') R.lastIndex = advanceStringIndex(S, toLength(R.lastIndex), state.unicode);\n return createIterResultObject(match, false);\n }\n state.done = true;\n return createIterResultObject(match, false);\n});\n\nvar $matchAll = function (string) {\n var R = anObject(this);\n var S = toString(string);\n var C = speciesConstructor(R, RegExp);\n var flags = toString(getRegExpFlags(R));\n var matcher, $global, fullUnicode;\n matcher = new C(C === RegExp ? R.source : R, flags);\n $global = !!~stringIndexOf(flags, 'g');\n fullUnicode = !!~stringIndexOf(flags, 'u');\n matcher.lastIndex = toLength(R.lastIndex);\n return new $RegExpStringIterator(matcher, S, $global, fullUnicode);\n};\n\n// `String.prototype.matchAll` method\n// https://tc39.es/ecma262/#sec-string.prototype.matchall\n$({ target: 'String', proto: true, forced: WORKS_WITH_NON_GLOBAL_REGEX }, {\n matchAll: function matchAll(regexp) {\n var O = requireObjectCoercible(this);\n var flags, S, matcher, rx;\n if (!isNullOrUndefined(regexp)) {\n if (isRegExp(regexp)) {\n flags = toString(requireObjectCoercible(getRegExpFlags(regexp)));\n if (!~stringIndexOf(flags, 'g')) throw new $TypeError('`.matchAll` does not allow non-global regexes');\n }\n if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll(O, regexp);\n matcher = getMethod(regexp, MATCH_ALL);\n if (matcher === undefined && IS_PURE && classof(regexp) === 'RegExp') matcher = $matchAll;\n if (matcher) return call(matcher, regexp, O);\n } else if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll(O, regexp);\n S = toString(O);\n rx = new RegExp(regexp, 'g');\n return IS_PURE ? call($matchAll, rx, S) : rx[MATCH_ALL](S);\n }\n});\n\nIS_PURE || MATCH_ALL in RegExpPrototype || defineBuiltIn(RegExpPrototype, MATCH_ALL, $matchAll);\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isRegExp = require('../internals/is-regexp');\nvar toString = require('../internals/to-string');\nvar getMethod = require('../internals/get-method');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar getSubstitution = require('../internals/get-substitution');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar REPLACE = wellKnownSymbol('replace');\nvar $TypeError = TypeError;\nvar indexOf = uncurryThis(''.indexOf);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\nvar max = Math.max;\n\n// `String.prototype.replaceAll` method\n// https://tc39.es/ecma262/#sec-string.prototype.replaceall\n$({ target: 'String', proto: true }, {\n replaceAll: function replaceAll(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var IS_REG_EXP, flags, replacer, string, searchString, functionalReplace, searchLength, advanceBy, position, replacement;\n var endOfLastMatch = 0;\n var result = '';\n if (!isNullOrUndefined(searchValue)) {\n IS_REG_EXP = isRegExp(searchValue);\n if (IS_REG_EXP) {\n flags = toString(requireObjectCoercible(getRegExpFlags(searchValue)));\n if (!~indexOf(flags, 'g')) throw new $TypeError('`.replaceAll` does not allow non-global regexes');\n }\n replacer = getMethod(searchValue, REPLACE);\n if (replacer) return call(replacer, searchValue, O, replaceValue);\n if (IS_PURE && IS_REG_EXP) return replace(toString(O), searchValue, replaceValue);\n }\n string = toString(O);\n searchString = toString(searchValue);\n functionalReplace = isCallable(replaceValue);\n if (!functionalReplace) replaceValue = toString(replaceValue);\n searchLength = searchString.length;\n advanceBy = max(1, searchLength);\n position = indexOf(string, searchString);\n while (position !== -1) {\n replacement = functionalReplace\n ? toString(replaceValue(searchString, position, string))\n : getSubstitution(searchString, string, position, [], undefined, replaceValue);\n result += stringSlice(string, endOfLastMatch, position) + replacement;\n endOfLastMatch = position + searchLength;\n position = position + advanceBy > string.length ? -1 : indexOf(string, searchString, position + advanceBy);\n }\n if (endOfLastMatch < string.length) {\n result += stringSlice(string, endOfLastMatch);\n }\n return result;\n }\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nmodule.exports = globalThis;\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nexports.f = wellKnownSymbol;\n","'use strict';\nvar path = require('../internals/path');\nvar hasOwn = require('../internals/has-own-property');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!hasOwn(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar defineWellKnownSymbol = require('../internals/well-known-symbol-define');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\n\nvar Symbol = globalThis.Symbol;\n\n// `Symbol.dispose` well-known symbol\n// https://github.com/tc39/proposal-explicit-resource-management\ndefineWellKnownSymbol('dispose');\n\nif (Symbol) {\n var descriptor = getOwnPropertyDescriptor(Symbol, 'dispose');\n // workaround of NodeJS 20.4 bug\n // https://github.com/nodejs/node/issues/48699\n // and incorrect descriptor from some transpilers and userland helpers\n if (descriptor.enumerable && descriptor.configurable && descriptor.writable) {\n defineProperty(Symbol, 'dispose', { value: descriptor.value, enumerable: false, configurable: false, writable: false });\n }\n}\n","'use strict';\nvar defineWellKnownSymbol = require('../internals/well-known-symbol-define');\n\n// `Symbol.observable` well-known symbol\n// https://github.com/tc39/proposal-observable\ndefineWellKnownSymbol('observable');\n","'use strict';\n// TODO: remove from `core-js@4`\nvar defineWellKnownSymbol = require('../internals/well-known-symbol-define');\n\n// `Symbol.patternMatch` well-known symbol\n// https://github.com/tc39/proposal-pattern-matching\ndefineWellKnownSymbol('patternMatch');\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-weak-map -- safe\nvar WeakMapPrototype = WeakMap.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-weak-map -- safe\n WeakMap: WeakMap,\n set: uncurryThis(WeakMapPrototype.set),\n get: uncurryThis(WeakMapPrototype.get),\n has: uncurryThis(WeakMapPrototype.has),\n remove: uncurryThis(WeakMapPrototype['delete'])\n};\n","'use strict';\nvar has = require('../internals/weak-map-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[WeakMapData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar aWeakMap = require('../internals/a-weak-map');\nvar remove = require('../internals/weak-map-helpers').remove;\n\n// `WeakMap.prototype.deleteAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'WeakMap', proto: true, real: true, forced: true }, {\n deleteAll: function deleteAll(/* ...elements */) {\n var collection = aWeakMap(this);\n var allDeleted = true;\n var wasDeleted;\n for (var k = 0, len = arguments.length; k < len; k++) {\n wasDeleted = remove(collection, arguments[k]);\n allDeleted = allDeleted && wasDeleted;\n } return !!allDeleted;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar WeakMapHelpers = require('../internals/weak-map-helpers');\nvar createCollectionFrom = require('../internals/collection-from');\n\n// `WeakMap.from` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from\n$({ target: 'WeakMap', stat: true, forced: true }, {\n from: createCollectionFrom(WeakMapHelpers.WeakMap, WeakMapHelpers.set, true)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar WeakMapHelpers = require('../internals/weak-map-helpers');\nvar createCollectionOf = require('../internals/collection-of');\n\n// `WeakMap.of` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of\n$({ target: 'WeakMap', stat: true, forced: true }, {\n of: createCollectionOf(WeakMapHelpers.WeakMap, WeakMapHelpers.set, true)\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-weak-set -- safe\nvar WeakSetPrototype = WeakSet.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-weak-set -- safe\n WeakSet: WeakSet,\n add: uncurryThis(WeakSetPrototype.add),\n has: uncurryThis(WeakSetPrototype.has),\n remove: uncurryThis(WeakSetPrototype['delete'])\n};\n","'use strict';\nvar has = require('../internals/weak-set-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[WeakSetData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar aWeakSet = require('../internals/a-weak-set');\nvar add = require('../internals/weak-set-helpers').add;\n\n// `WeakSet.prototype.addAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'WeakSet', proto: true, real: true, forced: true }, {\n addAll: function addAll(/* ...elements */) {\n var set = aWeakSet(this);\n for (var k = 0, len = arguments.length; k < len; k++) {\n add(set, arguments[k]);\n } return set;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aWeakSet = require('../internals/a-weak-set');\nvar remove = require('../internals/weak-set-helpers').remove;\n\n// `WeakSet.prototype.deleteAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'WeakSet', proto: true, real: true, forced: true }, {\n deleteAll: function deleteAll(/* ...elements */) {\n var collection = aWeakSet(this);\n var allDeleted = true;\n var wasDeleted;\n for (var k = 0, len = arguments.length; k < len; k++) {\n wasDeleted = remove(collection, arguments[k]);\n allDeleted = allDeleted && wasDeleted;\n } return !!allDeleted;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar WeakSetHelpers = require('../internals/weak-set-helpers');\nvar createCollectionFrom = require('../internals/collection-from');\n\n// `WeakSet.from` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from\n$({ target: 'WeakSet', stat: true, forced: true }, {\n from: createCollectionFrom(WeakSetHelpers.WeakSet, WeakSetHelpers.add, false)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar WeakSetHelpers = require('../internals/weak-set-helpers');\nvar createCollectionOf = require('../internals/collection-of');\n\n// `WeakSet.of` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of\n$({ target: 'WeakSet', stat: true, forced: true }, {\n of: createCollectionOf(WeakSetHelpers.WeakSet, WeakSetHelpers.add, false)\n});\n","'use strict';\n// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","'use strict';\n// in old WebKit versions, `element.classList` is not an instance of global `DOMTokenList`\nvar documentCreateElement = require('../internals/document-create-element');\n\nvar classList = documentCreateElement('span').classList;\nvar DOMTokenListPrototype = classList && classList.constructor && classList.constructor.prototype;\n\nmodule.exports = DOMTokenListPrototype === Object.prototype ? undefined : DOMTokenListPrototype;\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineProperty = require('../internals/object-define-property').f;\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.es/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.es/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.es/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.es/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = null;\n return createIterResultObject(undefined, true);\n }\n switch (state.kind) {\n case 'keys': return createIterResultObject(index, false);\n case 'values': return createIterResultObject(target[index], false);\n } return createIterResultObject([index, target[index]], false);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.es/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.es/ecma262/#sec-createmappedargumentsobject\nvar values = Iterators.Arguments = Iterators.Array;\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n// V8 ~ Chrome 45- bug\nif (!IS_PURE && DESCRIPTORS && values.name !== 'values') try {\n defineProperty(values, 'name', { value: 'values' });\n} catch (error) { /* empty */ }\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar DOMIterables = require('../internals/dom-iterables');\nvar DOMTokenListPrototype = require('../internals/dom-token-list-prototype');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nvar handlePrototype = function (CollectionPrototype, COLLECTION_NAME) {\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n setToStringTag(CollectionPrototype, COLLECTION_NAME, true);\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n};\n\nfor (var COLLECTION_NAME in DOMIterables) {\n handlePrototype(globalThis[COLLECTION_NAME] && globalThis[COLLECTION_NAME].prototype, COLLECTION_NAME);\n}\n\nhandlePrototype(DOMTokenListPrototype, 'DOMTokenList');\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar clearImmediate = require('../internals/task').clear;\n\n// `clearImmediate` method\n// http://w3c.github.io/setImmediate/#si-clearImmediate\n$({ global: true, bind: true, enumerable: true, forced: globalThis.clearImmediate !== clearImmediate }, {\n clearImmediate: clearImmediate\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar apply = require('../internals/function-apply');\nvar isCallable = require('../internals/is-callable');\nvar ENVIRONMENT = require('../internals/environment');\nvar USER_AGENT = require('../internals/environment-user-agent');\nvar arraySlice = require('../internals/array-slice');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\n\nvar Function = globalThis.Function;\n// dirty IE9- and Bun 0.3.0- checks\nvar WRAP = /MSIE .\\./.test(USER_AGENT) || ENVIRONMENT === 'BUN' && (function () {\n var version = globalThis.Bun.version.split('.');\n return version.length < 3 || version[0] === '0' && (version[1] < 3 || version[1] === '3' && version[2] === '0');\n})();\n\n// IE9- / Bun 0.3.0- setTimeout / setInterval / setImmediate additional parameters fix\n// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers\n// https://github.com/oven-sh/bun/issues/1633\nmodule.exports = function (scheduler, hasTimeArg) {\n var firstParamIndex = hasTimeArg ? 2 : 1;\n return WRAP ? function (handler, timeout /* , ...arguments */) {\n var boundArgs = validateArgumentsLength(arguments.length, 1) > firstParamIndex;\n var fn = isCallable(handler) ? handler : Function(handler);\n var params = boundArgs ? arraySlice(arguments, firstParamIndex) : [];\n var callback = boundArgs ? function () {\n apply(fn, this, params);\n } : fn;\n return hasTimeArg ? scheduler(callback, timeout) : scheduler(callback);\n } : scheduler;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar setTask = require('../internals/task').set;\nvar schedulersFix = require('../internals/schedulers-fix');\n\n// https://github.com/oven-sh/bun/issues/1633\nvar setImmediate = globalThis.setImmediate ? schedulersFix(setTask, false) : setTask;\n\n// `setImmediate` method\n// http://w3c.github.io/setImmediate/#si-setImmediate\n$({ global: true, bind: true, enumerable: true, forced: globalThis.setImmediate !== setImmediate }, {\n setImmediate: setImmediate\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar microtask = require('../internals/microtask');\nvar aCallable = require('../internals/a-callable');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar fails = require('../internals/fails');\nvar DESCRIPTORS = require('../internals/descriptors');\n\n// Bun ~ 1.0.30 bug\n// https://github.com/oven-sh/bun/issues/9249\nvar WRONG_ARITY = fails(function () {\n // getOwnPropertyDescriptor for prevent experimental warning in Node 11\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n return DESCRIPTORS && Object.getOwnPropertyDescriptor(globalThis, 'queueMicrotask').value.length !== 1;\n});\n\n// `queueMicrotask` method\n// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-queuemicrotask\n$({ global: true, enumerable: true, dontCallGetSet: true, forced: WRONG_ARITY }, {\n queueMicrotask: function queueMicrotask(fn) {\n validateArgumentsLength(arguments.length, 1);\n microtask(aCallable(fn));\n }\n});\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar toString = require('../internals/to-string');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: toString(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return createIterResultObject(undefined, true);\n point = charAt(string, index);\n state.index += point.length;\n return createIterResultObject(point, false);\n});\n","'use strict';\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line unicorn/relative-url-style -- required for testing\n var url = new URL('b?a=1&b=2&c=3', 'https://a');\n var params = url.searchParams;\n var params2 = new URLSearchParams('a=1&a=2&b=3');\n var result = '';\n url.pathname = 'c%20d';\n params.forEach(function (value, key) {\n params['delete']('b');\n result += key + value;\n });\n params2['delete']('a', 2);\n // `undefined` case is a Chromium 117 bug\n // https://bugs.chromium.org/p/v8/issues/detail?id=14222\n params2['delete']('b', undefined);\n return (IS_PURE && (!url.toJSON || !params2.has('a', 1) || params2.has('a', 2) || !params2.has('a', undefined) || params2.has('b')))\n || (!params.size && (IS_PURE || !DESCRIPTORS))\n || !params.sort\n || url.href !== 'https://a/c%20d?a=1&c=3'\n || params.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !params[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('https://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('https://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('https://x', undefined).host !== 'x';\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar call = require('../internals/function-call');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\n// eslint-disable-next-line es/no-object-assign -- safe\nvar $assign = Object.assign;\n// eslint-disable-next-line es/no-object-defineproperty -- required for testing\nvar defineProperty = Object.defineProperty;\nvar concat = uncurryThis([].concat);\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\nmodule.exports = !$assign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && $assign({ b: 1 }, $assign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line es/no-symbol -- safe\n var symbol = Symbol('assign detection');\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n // eslint-disable-next-line es/no-array-prototype-foreach -- safe\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return $assign({}, A)[symbol] !== 7 || objectKeys($assign({}, B)).join('') !== alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? concat(objectKeys(S), getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || call(propertyIsEnumerable, S, key)) T[key] = S[key];\n }\n } return T;\n} : $assign;\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar iteratorClose = require('../internals/iterator-close');\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar isConstructor = require('../internals/is-constructor');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar createProperty = require('../internals/create-property');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar $Array = Array;\n\n// `Array.from` method implementation\n// https://tc39.es/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var IS_CONSTRUCTOR = isConstructor(this);\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined);\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod && !(this === $Array && isArrayIteratorMethod(iteratorMethod))) {\n result = IS_CONSTRUCTOR ? new this() : [];\n iterator = getIterator(O, iteratorMethod);\n next = iterator.next;\n for (;!(step = call(next, iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = lengthOfArrayLike(O);\n result = IS_CONSTRUCTOR ? new this(length) : $Array(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\n\nvar $RangeError = RangeError;\nvar exec = uncurryThis(regexSeparators.exec);\nvar floor = Math.floor;\nvar fromCharCode = String.fromCharCode;\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar join = uncurryThis([].join);\nvar push = uncurryThis([].push);\nvar replace = uncurryThis(''.replace);\nvar split = uncurryThis(''.split);\nvar toLowerCase = uncurryThis(''.toLowerCase);\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = charCodeAt(string, counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = charCodeAt(string, counter++);\n if ((extra & 0xFC00) === 0xDC00) { // Low surrogate.\n push(output, ((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n push(output, value);\n counter--;\n }\n } else {\n push(output, value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n while (delta > baseMinusTMin * tMax >> 1) {\n delta = floor(delta / baseMinusTMin);\n k += base;\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n push(output, fromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n push(output, delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's state to , but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw new $RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw new $RangeError(OVERFLOW_ERROR);\n }\n if (currentValue === n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n var k = base;\n while (true) {\n var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n push(output, fromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n k += base;\n }\n\n push(output, fromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);\n delta = 0;\n handledCPCount++;\n }\n }\n\n delta++;\n n++;\n }\n return join(output, '');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = split(replace(toLowerCase(input), regexSeparators, '\\u002E'), '.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n push(encoded, exec(regexNonASCII, label) ? 'xn--' + encode(label) : label);\n }\n return join(encoded, '.');\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\nvar $RangeError = RangeError;\nvar fromCharCode = String.fromCharCode;\n// eslint-disable-next-line es/no-string-fromcodepoint -- required for testing\nvar $fromCodePoint = String.fromCodePoint;\nvar join = uncurryThis([].join);\n\n// length should be 1, old FF problem\nvar INCORRECT_LENGTH = !!$fromCodePoint && $fromCodePoint.length !== 1;\n\n// `String.fromCodePoint` method\n// https://tc39.es/ecma262/#sec-string.fromcodepoint\n$({ target: 'String', stat: true, arity: 1, forced: INCORRECT_LENGTH }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n fromCodePoint: function fromCodePoint(x) {\n var elements = [];\n var length = arguments.length;\n var i = 0;\n var code;\n while (length > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10FFFF) !== code) throw new $RangeError(code + ' is not a valid code point');\n elements[i] = code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xD800, code % 0x400 + 0xDC00);\n } return join(elements, '');\n }\n});\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nrequire('../modules/es.string.from-code-point');\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar safeGetBuiltIn = require('../internals/safe-get-built-in');\nvar getBuiltIn = require('../internals/get-built-in');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/url-constructor-detection');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar $toString = require('../internals/to-string');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arraySort = require('../internals/array-sort');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar nativeFetch = safeGetBuiltIn('fetch');\nvar NativeRequest = safeGetBuiltIn('Request');\nvar Headers = safeGetBuiltIn('Headers');\nvar RequestPrototype = NativeRequest && NativeRequest.prototype;\nvar HeadersPrototype = Headers && Headers.prototype;\nvar TypeError = globalThis.TypeError;\nvar encodeURIComponent = globalThis.encodeURIComponent;\nvar fromCharCode = String.fromCharCode;\nvar fromCodePoint = getBuiltIn('String', 'fromCodePoint');\nvar $parseInt = parseInt;\nvar charAt = uncurryThis(''.charAt);\nvar join = uncurryThis([].join);\nvar push = uncurryThis([].push);\nvar replace = uncurryThis(''.replace);\nvar shift = uncurryThis([].shift);\nvar splice = uncurryThis([].splice);\nvar split = uncurryThis(''.split);\nvar stringSlice = uncurryThis(''.slice);\nvar exec = uncurryThis(/./.exec);\n\nvar plus = /\\+/g;\nvar FALLBACK_REPLACER = '\\uFFFD';\nvar VALID_HEX = /^[0-9a-f]+$/i;\n\nvar parseHexOctet = function (string, start) {\n var substr = stringSlice(string, start, start + 2);\n if (!exec(VALID_HEX, substr)) return NaN;\n\n return $parseInt(substr, 16);\n};\n\nvar getLeadingOnes = function (octet) {\n var count = 0;\n for (var mask = 0x80; mask > 0 && (octet & mask) !== 0; mask >>= 1) {\n count++;\n }\n return count;\n};\n\nvar utf8Decode = function (octets) {\n var codePoint = null;\n\n switch (octets.length) {\n case 1:\n codePoint = octets[0];\n break;\n case 2:\n codePoint = (octets[0] & 0x1F) << 6 | (octets[1] & 0x3F);\n break;\n case 3:\n codePoint = (octets[0] & 0x0F) << 12 | (octets[1] & 0x3F) << 6 | (octets[2] & 0x3F);\n break;\n case 4:\n codePoint = (octets[0] & 0x07) << 18 | (octets[1] & 0x3F) << 12 | (octets[2] & 0x3F) << 6 | (octets[3] & 0x3F);\n break;\n }\n\n return codePoint > 0x10FFFF ? null : codePoint;\n};\n\nvar decode = function (input) {\n input = replace(input, plus, ' ');\n var length = input.length;\n var result = '';\n var i = 0;\n\n while (i < length) {\n var decodedChar = charAt(input, i);\n\n if (decodedChar === '%') {\n if (charAt(input, i + 1) === '%' || i + 3 > length) {\n result += '%';\n i++;\n continue;\n }\n\n var octet = parseHexOctet(input, i + 1);\n\n // eslint-disable-next-line no-self-compare -- NaN check\n if (octet !== octet) {\n result += decodedChar;\n i++;\n continue;\n }\n\n i += 2;\n var byteSequenceLength = getLeadingOnes(octet);\n\n if (byteSequenceLength === 0) {\n decodedChar = fromCharCode(octet);\n } else {\n if (byteSequenceLength === 1 || byteSequenceLength > 4) {\n result += FALLBACK_REPLACER;\n i++;\n continue;\n }\n\n var octets = [octet];\n var sequenceIndex = 1;\n\n while (sequenceIndex < byteSequenceLength) {\n i++;\n if (i + 3 > length || charAt(input, i) !== '%') break;\n\n var nextByte = parseHexOctet(input, i + 1);\n\n // eslint-disable-next-line no-self-compare -- NaN check\n if (nextByte !== nextByte) {\n i += 3;\n break;\n }\n if (nextByte > 191 || nextByte < 128) break;\n\n push(octets, nextByte);\n i += 2;\n sequenceIndex++;\n }\n\n if (octets.length !== byteSequenceLength) {\n result += FALLBACK_REPLACER;\n continue;\n }\n\n var codePoint = utf8Decode(octets);\n if (codePoint === null) {\n result += FALLBACK_REPLACER;\n } else {\n decodedChar = fromCodePoint(codePoint);\n }\n }\n }\n\n result += decodedChar;\n i++;\n }\n\n return result;\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replacements = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replacements[match];\n};\n\nvar serialize = function (it) {\n return replace(encodeURIComponent(it), find, replacer);\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n target: getInternalParamsState(params).entries,\n index: 0,\n kind: kind\n });\n}, URL_SEARCH_PARAMS, function next() {\n var state = getInternalIteratorState(this);\n var target = state.target;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = null;\n return createIterResultObject(undefined, true);\n }\n var entry = target[index];\n switch (state.kind) {\n case 'keys': return createIterResultObject(entry.key, false);\n case 'values': return createIterResultObject(entry.value, false);\n } return createIterResultObject([entry.key, entry.value], false);\n}, true);\n\nvar URLSearchParamsState = function (init) {\n this.entries = [];\n this.url = null;\n\n if (init !== undefined) {\n if (isObject(init)) this.parseObject(init);\n else this.parseQuery(typeof init == 'string' ? charAt(init, 0) === '?' ? stringSlice(init, 1) : init : $toString(init));\n }\n};\n\nURLSearchParamsState.prototype = {\n type: URL_SEARCH_PARAMS,\n bindURL: function (url) {\n this.url = url;\n this.update();\n },\n parseObject: function (object) {\n var entries = this.entries;\n var iteratorMethod = getIteratorMethod(object);\n var iterator, next, step, entryIterator, entryNext, first, second;\n\n if (iteratorMethod) {\n iterator = getIterator(object, iteratorMethod);\n next = iterator.next;\n while (!(step = call(next, iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = call(entryNext, entryIterator)).done ||\n (second = call(entryNext, entryIterator)).done ||\n !call(entryNext, entryIterator).done\n ) throw new TypeError('Expected sequence with length 2');\n push(entries, { key: $toString(first.value), value: $toString(second.value) });\n }\n } else for (var key in object) if (hasOwn(object, key)) {\n push(entries, { key: key, value: $toString(object[key]) });\n }\n },\n parseQuery: function (query) {\n if (query) {\n var entries = this.entries;\n var attributes = split(query, '&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = split(attribute, '=');\n push(entries, {\n key: decode(shift(entry)),\n value: decode(join(entry, '='))\n });\n }\n }\n }\n },\n serialize: function () {\n var entries = this.entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n push(result, serialize(entry.key) + '=' + serialize(entry.value));\n } return join(result, '&');\n },\n update: function () {\n this.entries.length = 0;\n this.parseQuery(this.url.query);\n },\n updateURL: function () {\n if (this.url) this.url.update();\n }\n};\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsPrototype);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var state = setInternalState(this, new URLSearchParamsState(init));\n if (!DESCRIPTORS) this.size = state.entries.length;\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\ndefineBuiltIns(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n var state = getInternalParamsState(this);\n validateArgumentsLength(arguments.length, 2);\n push(state.entries, { key: $toString(name), value: $toString(value) });\n if (!DESCRIPTORS) this.length++;\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name /* , value */) {\n var state = getInternalParamsState(this);\n var length = validateArgumentsLength(arguments.length, 1);\n var entries = state.entries;\n var key = $toString(name);\n var $value = length < 2 ? undefined : arguments[1];\n var value = $value === undefined ? $value : $toString($value);\n var index = 0;\n while (index < entries.length) {\n var entry = entries[index];\n if (entry.key === key && (value === undefined || entry.value === value)) {\n splice(entries, index, 1);\n if (value !== undefined) break;\n } else index++;\n }\n if (!DESCRIPTORS) this.size = entries.length;\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n var entries = getInternalParamsState(this).entries;\n validateArgumentsLength(arguments.length, 1);\n var key = $toString(name);\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n var entries = getInternalParamsState(this).entries;\n validateArgumentsLength(arguments.length, 1);\n var key = $toString(name);\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) push(result, entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name /* , value */) {\n var entries = getInternalParamsState(this).entries;\n var length = validateArgumentsLength(arguments.length, 1);\n var key = $toString(name);\n var $value = length < 2 ? undefined : arguments[1];\n var value = $value === undefined ? $value : $toString($value);\n var index = 0;\n while (index < entries.length) {\n var entry = entries[index++];\n if (entry.key === key && (value === undefined || entry.value === value)) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n var state = getInternalParamsState(this);\n validateArgumentsLength(arguments.length, 1);\n var entries = state.entries;\n var found = false;\n var key = $toString(name);\n var val = $toString(value);\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) splice(entries, index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) push(entries, { key: key, value: val });\n if (!DESCRIPTORS) this.size = entries.length;\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n arraySort(state.entries, function (a, b) {\n return a.key > b.key ? 1 : -1;\n });\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\ndefineBuiltIn(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries, { name: 'entries' });\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\ndefineBuiltIn(URLSearchParamsPrototype, 'toString', function toString() {\n return getInternalParamsState(this).serialize();\n}, { enumerable: true });\n\n// `URLSearchParams.prototype.size` getter\n// https://github.com/whatwg/url/pull/734\nif (DESCRIPTORS) defineBuiltInAccessor(URLSearchParamsPrototype, 'size', {\n get: function size() {\n return getInternalParamsState(this).entries.length;\n },\n configurable: true,\n enumerable: true\n});\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, constructor: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` and `Request` for correct work with polyfilled `URLSearchParams`\nif (!USE_NATIVE_URL && isCallable(Headers)) {\n var headersHas = uncurryThis(HeadersPrototype.has);\n var headersSet = uncurryThis(HeadersPrototype.set);\n\n var wrapRequestOptions = function (init) {\n if (isObject(init)) {\n var body = init.body;\n var headers;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headersHas(headers, 'content-type')) {\n headersSet(headers, 'content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n return create(init, {\n body: createPropertyDescriptor(0, $toString(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n } return init;\n };\n\n if (isCallable(nativeFetch)) {\n $({ global: true, enumerable: true, dontCallGetSet: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n return nativeFetch(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});\n }\n });\n }\n\n if (isCallable(NativeRequest)) {\n var RequestConstructor = function Request(input /* , init */) {\n anInstance(this, RequestPrototype);\n return new NativeRequest(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});\n };\n\n RequestPrototype.constructor = RequestConstructor;\n RequestConstructor.prototype = RequestPrototype;\n\n $({ global: true, constructor: true, dontCallGetSet: true, forced: true }, {\n Request: RequestConstructor\n });\n }\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/url-constructor-detection');\nvar globalThis = require('../internals/global-this');\nvar bind = require('../internals/function-bind-context');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has-own-property');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar arraySlice = require('../internals/array-slice');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/string-punycode-to-ascii');\nvar $toString = require('../internals/to-string');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar URLSearchParamsModule = require('../modules/web.url-search-params.constructor');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\n\nvar NativeURL = globalThis.URL;\nvar TypeError = globalThis.TypeError;\nvar parseInt = globalThis.parseInt;\nvar floor = Math.floor;\nvar pow = Math.pow;\nvar charAt = uncurryThis(''.charAt);\nvar exec = uncurryThis(/./.exec);\nvar join = uncurryThis([].join);\nvar numberToString = uncurryThis(1.0.toString);\nvar pop = uncurryThis([].pop);\nvar push = uncurryThis([].push);\nvar replace = uncurryThis(''.replace);\nvar shift = uncurryThis([].shift);\nvar split = uncurryThis(''.split);\nvar stringSlice = uncurryThis(''.slice);\nvar toLowerCase = uncurryThis(''.toLowerCase);\nvar unshift = uncurryThis([].unshift);\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[a-z]/i;\n// eslint-disable-next-line regexp/no-obscure-range -- safe\nvar ALPHANUMERIC = /[\\d+-.a-z]/i;\nvar DIGIT = /\\d/;\nvar HEX_START = /^0x/i;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\da-f]+$/i;\n/* eslint-disable regexp/no-control-character -- safe */\nvar FORBIDDEN_HOST_CODE_POINT = /[\\0\\t\\n\\r #%/:<>?@[\\\\\\]^|]/;\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\0\\t\\n\\r #/:<>?@[\\\\\\]^|]/;\nvar LEADING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u0020]+/;\nvar TRAILING_C0_CONTROL_OR_SPACE = /(^|[^\\u0000-\\u0020])[\\u0000-\\u0020]+$/;\nvar TAB_AND_NEW_LINE = /[\\t\\n\\r]/g;\n/* eslint-enable regexp/no-control-character -- safe */\nvar EOF;\n\n// https://url.spec.whatwg.org/#ipv4-number-parser\nvar parseIPv4 = function (input) {\n var parts = split(input, '.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] === '') {\n parts.length--;\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part === '') return input;\n radix = 10;\n if (part.length > 1 && charAt(part, 0) === '0') {\n radix = exec(HEX_START, part) ? 16 : 8;\n part = stringSlice(part, radix === 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!exec(radix === 10 ? DEC : radix === 8 ? OCT : HEX, part)) return input;\n number = parseInt(part, radix);\n }\n push(numbers, number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index === partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = pop(numbers);\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// https://url.spec.whatwg.org/#concept-ipv6-parser\n// eslint-disable-next-line max-statements -- TODO\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var chr = function () {\n return charAt(input, pointer);\n };\n\n if (chr() === ':') {\n if (charAt(input, 1) !== ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (chr()) {\n if (pieceIndex === 8) return;\n if (chr() === ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && exec(HEX, chr())) {\n value = value * 16 + parseInt(chr(), 16);\n pointer++;\n length++;\n }\n if (chr() === '.') {\n if (length === 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (chr()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (chr() === '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!exec(DIGIT, chr())) return;\n while (exec(DIGIT, chr())) {\n number = parseInt(chr(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece === 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen === 2 || numbersSeen === 4) pieceIndex++;\n }\n if (numbersSeen !== 4) return;\n break;\n } else if (chr() === ':') {\n pointer++;\n if (!chr()) return;\n } else if (chr()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex !== 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex !== 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n return currLength > maxLength ? currStart : maxIndex;\n};\n\n// https://url.spec.whatwg.org/#host-serializing\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n unshift(result, host % 256);\n host = floor(host / 256);\n }\n return join(result, '.');\n }\n\n // ipv6\n if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += numberToString(host[index], 16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n }\n\n return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (chr, set) {\n var code = codeAt(chr, 0);\n return code > 0x20 && code < 0x7F && !hasOwn(set, chr) ? chr : encodeURIComponent(chr);\n};\n\n// https://url.spec.whatwg.org/#special-scheme\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\n// https://url.spec.whatwg.org/#windows-drive-letter\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length === 2 && exec(ALPHA, charAt(string, 0))\n && ((second = charAt(string, 1)) === ':' || (!normalized && second === '|'));\n};\n\n// https://url.spec.whatwg.org/#start-with-a-windows-drive-letter\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(stringSlice(string, 0, 2)) && (\n string.length === 2 ||\n ((third = charAt(string, 2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\n// https://url.spec.whatwg.org/#single-dot-path-segment\nvar isSingleDot = function (segment) {\n return segment === '.' || toLowerCase(segment) === '%2e';\n};\n\n// https://url.spec.whatwg.org/#double-dot-path-segment\nvar isDoubleDot = function (segment) {\n segment = toLowerCase(segment);\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\nvar URLState = function (url, isBase, base) {\n var urlString = $toString(url);\n var baseState, failure, searchParams;\n if (isBase) {\n failure = this.parse(urlString);\n if (failure) throw new TypeError(failure);\n this.searchParams = null;\n } else {\n if (base !== undefined) baseState = new URLState(base, true);\n failure = this.parse(urlString, null, baseState);\n if (failure) throw new TypeError(failure);\n searchParams = getInternalSearchParamsState(new URLSearchParams());\n searchParams.bindURL(this);\n this.searchParams = searchParams;\n }\n};\n\nURLState.prototype = {\n type: 'URL',\n // https://url.spec.whatwg.org/#url-parsing\n // eslint-disable-next-line max-statements -- TODO\n parse: function (input, stateOverride, base) {\n var url = this;\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, chr, bufferCodePoints, failure;\n\n input = $toString(input);\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = replace(input, LEADING_C0_CONTROL_OR_SPACE, '');\n input = replace(input, TRAILING_C0_CONTROL_OR_SPACE, '$1');\n }\n\n input = replace(input, TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n chr = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (chr && exec(ALPHA, chr)) {\n buffer += toLowerCase(chr);\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (chr && (exec(ALPHANUMERIC, chr) || chr === '+' || chr === '-' || chr === '.')) {\n buffer += toLowerCase(chr);\n } else if (chr === ':') {\n if (stateOverride && (\n (url.isSpecial() !== hasOwn(specialSchemes, buffer)) ||\n (buffer === 'file' && (url.includesCredentials() || url.port !== null)) ||\n (url.scheme === 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (url.isSpecial() && specialSchemes[url.scheme] === url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme === 'file') {\n state = FILE;\n } else if (url.isSpecial() && base && base.scheme === url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (url.isSpecial()) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] === '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n push(url.path, '');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && chr !== '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && chr === '#') {\n url.scheme = base.scheme;\n url.path = arraySlice(base.path);\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme === 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (chr === '/' && codePoints[pointer + 1] === '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (chr === '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (chr === EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.query = base.query;\n } else if (chr === '/' || (chr === '\\\\' && url.isSpecial())) {\n state = RELATIVE_SLASH;\n } else if (chr === '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.query = '';\n state = QUERY;\n } else if (chr === '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.path.length--;\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (url.isSpecial() && (chr === '/' || chr === '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (chr === '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (chr !== '/' || charAt(buffer, pointer + 1) !== '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (chr !== '/' && chr !== '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (chr === '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint === ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n chr === EOF || chr === '/' || chr === '?' || chr === '#' ||\n (chr === '\\\\' && url.isSpecial())\n ) {\n if (seenAt && buffer === '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += chr;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme === 'file') {\n state = FILE_HOST;\n continue;\n } else if (chr === ':' && !seenBracket) {\n if (buffer === '') return INVALID_HOST;\n failure = url.parseHost(buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride === HOSTNAME) return;\n } else if (\n chr === EOF || chr === '/' || chr === '?' || chr === '#' ||\n (chr === '\\\\' && url.isSpecial())\n ) {\n if (url.isSpecial() && buffer === '') return INVALID_HOST;\n if (stateOverride && buffer === '' && (url.includesCredentials() || url.port !== null)) return;\n failure = url.parseHost(buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (chr === '[') seenBracket = true;\n else if (chr === ']') seenBracket = false;\n buffer += chr;\n } break;\n\n case PORT:\n if (exec(DIGIT, chr)) {\n buffer += chr;\n } else if (\n chr === EOF || chr === '/' || chr === '?' || chr === '#' ||\n (chr === '\\\\' && url.isSpecial()) ||\n stateOverride\n ) {\n if (buffer !== '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (url.isSpecial() && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (chr === '/' || chr === '\\\\') state = FILE_SLASH;\n else if (base && base.scheme === 'file') {\n switch (chr) {\n case EOF:\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.query = base.query;\n break;\n case '?':\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.query = '';\n state = QUERY;\n break;\n case '#':\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n break;\n default:\n if (!startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.shortenPath();\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (chr === '/' || chr === '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme === 'file' && !startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {\n if (isWindowsDriveLetter(base.path[0], true)) push(url.path, base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (chr === EOF || chr === '/' || chr === '\\\\' || chr === '?' || chr === '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer === '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = url.parseHost(buffer);\n if (failure) return failure;\n if (url.host === 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += chr;\n break;\n\n case PATH_START:\n if (url.isSpecial()) {\n state = PATH;\n if (chr !== '/' && chr !== '\\\\') continue;\n } else if (!stateOverride && chr === '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && chr === '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (chr !== EOF) {\n state = PATH;\n if (chr !== '/') continue;\n } break;\n\n case PATH:\n if (\n chr === EOF || chr === '/' ||\n (chr === '\\\\' && url.isSpecial()) ||\n (!stateOverride && (chr === '?' || chr === '#'))\n ) {\n if (isDoubleDot(buffer)) {\n url.shortenPath();\n if (chr !== '/' && !(chr === '\\\\' && url.isSpecial())) {\n push(url.path, '');\n }\n } else if (isSingleDot(buffer)) {\n if (chr !== '/' && !(chr === '\\\\' && url.isSpecial())) {\n push(url.path, '');\n }\n } else {\n if (url.scheme === 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = charAt(buffer, 0) + ':'; // normalize windows drive letter\n }\n push(url.path, buffer);\n }\n buffer = '';\n if (url.scheme === 'file' && (chr === EOF || chr === '?' || chr === '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n shift(url.path);\n }\n }\n if (chr === '?') {\n url.query = '';\n state = QUERY;\n } else if (chr === '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(chr, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (chr === '?') {\n url.query = '';\n state = QUERY;\n } else if (chr === '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (chr !== EOF) {\n url.path[0] += percentEncode(chr, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && chr === '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (chr !== EOF) {\n if (chr === \"'\" && url.isSpecial()) url.query += '%27';\n else if (chr === '#') url.query += '%23';\n else url.query += percentEncode(chr, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (chr !== EOF) url.fragment += percentEncode(chr, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n },\n // https://url.spec.whatwg.org/#host-parsing\n parseHost: function (input) {\n var result, codePoints, index;\n if (charAt(input, 0) === '[') {\n if (charAt(input, input.length - 1) !== ']') return INVALID_HOST;\n result = parseIPv6(stringSlice(input, 1, -1));\n if (!result) return INVALID_HOST;\n this.host = result;\n // opaque host\n } else if (!this.isSpecial()) {\n if (exec(FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT, input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n this.host = result;\n } else {\n input = toASCII(input);\n if (exec(FORBIDDEN_HOST_CODE_POINT, input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n this.host = result;\n }\n },\n // https://url.spec.whatwg.org/#cannot-have-a-username-password-port\n cannotHaveUsernamePasswordPort: function () {\n return !this.host || this.cannotBeABaseURL || this.scheme === 'file';\n },\n // https://url.spec.whatwg.org/#include-credentials\n includesCredentials: function () {\n return this.username !== '' || this.password !== '';\n },\n // https://url.spec.whatwg.org/#is-special\n isSpecial: function () {\n return hasOwn(specialSchemes, this.scheme);\n },\n // https://url.spec.whatwg.org/#shorten-a-urls-path\n shortenPath: function () {\n var path = this.path;\n var pathSize = path.length;\n if (pathSize && (this.scheme !== 'file' || pathSize !== 1 || !isWindowsDriveLetter(path[0], true))) {\n path.length--;\n }\n },\n // https://url.spec.whatwg.org/#concept-url-serializer\n serialize: function () {\n var url = this;\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (url.includesCredentials()) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme === 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n },\n // https://url.spec.whatwg.org/#dom-url-href\n setHref: function (href) {\n var failure = this.parse(href);\n if (failure) throw new TypeError(failure);\n this.searchParams.update();\n },\n // https://url.spec.whatwg.org/#dom-url-origin\n getOrigin: function () {\n var scheme = this.scheme;\n var port = this.port;\n if (scheme === 'blob') try {\n return new URLConstructor(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme === 'file' || !this.isSpecial()) return 'null';\n return scheme + '://' + serializeHost(this.host) + (port !== null ? ':' + port : '');\n },\n // https://url.spec.whatwg.org/#dom-url-protocol\n getProtocol: function () {\n return this.scheme + ':';\n },\n setProtocol: function (protocol) {\n this.parse($toString(protocol) + ':', SCHEME_START);\n },\n // https://url.spec.whatwg.org/#dom-url-username\n getUsername: function () {\n return this.username;\n },\n setUsername: function (username) {\n var codePoints = arrayFrom($toString(username));\n if (this.cannotHaveUsernamePasswordPort()) return;\n this.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n this.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n },\n // https://url.spec.whatwg.org/#dom-url-password\n getPassword: function () {\n return this.password;\n },\n setPassword: function (password) {\n var codePoints = arrayFrom($toString(password));\n if (this.cannotHaveUsernamePasswordPort()) return;\n this.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n this.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n },\n // https://url.spec.whatwg.org/#dom-url-host\n getHost: function () {\n var host = this.host;\n var port = this.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n },\n setHost: function (host) {\n if (this.cannotBeABaseURL) return;\n this.parse(host, HOST);\n },\n // https://url.spec.whatwg.org/#dom-url-hostname\n getHostname: function () {\n var host = this.host;\n return host === null ? '' : serializeHost(host);\n },\n setHostname: function (hostname) {\n if (this.cannotBeABaseURL) return;\n this.parse(hostname, HOSTNAME);\n },\n // https://url.spec.whatwg.org/#dom-url-port\n getPort: function () {\n var port = this.port;\n return port === null ? '' : $toString(port);\n },\n setPort: function (port) {\n if (this.cannotHaveUsernamePasswordPort()) return;\n port = $toString(port);\n if (port === '') this.port = null;\n else this.parse(port, PORT);\n },\n // https://url.spec.whatwg.org/#dom-url-pathname\n getPathname: function () {\n var path = this.path;\n return this.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';\n },\n setPathname: function (pathname) {\n if (this.cannotBeABaseURL) return;\n this.path = [];\n this.parse(pathname, PATH_START);\n },\n // https://url.spec.whatwg.org/#dom-url-search\n getSearch: function () {\n var query = this.query;\n return query ? '?' + query : '';\n },\n setSearch: function (search) {\n search = $toString(search);\n if (search === '') {\n this.query = null;\n } else {\n if (charAt(search, 0) === '?') search = stringSlice(search, 1);\n this.query = '';\n this.parse(search, QUERY);\n }\n this.searchParams.update();\n },\n // https://url.spec.whatwg.org/#dom-url-searchparams\n getSearchParams: function () {\n return this.searchParams.facade;\n },\n // https://url.spec.whatwg.org/#dom-url-hash\n getHash: function () {\n var fragment = this.fragment;\n return fragment ? '#' + fragment : '';\n },\n setHash: function (hash) {\n hash = $toString(hash);\n if (hash === '') {\n this.fragment = null;\n return;\n }\n if (charAt(hash, 0) === '#') hash = stringSlice(hash, 1);\n this.fragment = '';\n this.parse(hash, FRAGMENT);\n },\n update: function () {\n this.query = this.searchParams.serialize() || null;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLPrototype);\n var base = validateArgumentsLength(arguments.length, 1) > 1 ? arguments[1] : undefined;\n var state = setInternalState(that, new URLState(url, false, base));\n if (!DESCRIPTORS) {\n that.href = state.serialize();\n that.origin = state.getOrigin();\n that.protocol = state.getProtocol();\n that.username = state.getUsername();\n that.password = state.getPassword();\n that.host = state.getHost();\n that.hostname = state.getHostname();\n that.port = state.getPort();\n that.pathname = state.getPathname();\n that.search = state.getSearch();\n that.searchParams = state.getSearchParams();\n that.hash = state.getHash();\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar accessorDescriptor = function (getter, setter) {\n return {\n get: function () {\n return getInternalURLState(this)[getter]();\n },\n set: setter && function (value) {\n return getInternalURLState(this)[setter](value);\n },\n configurable: true,\n enumerable: true\n };\n};\n\nif (DESCRIPTORS) {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n defineBuiltInAccessor(URLPrototype, 'href', accessorDescriptor('serialize', 'setHref'));\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n defineBuiltInAccessor(URLPrototype, 'origin', accessorDescriptor('getOrigin'));\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n defineBuiltInAccessor(URLPrototype, 'protocol', accessorDescriptor('getProtocol', 'setProtocol'));\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n defineBuiltInAccessor(URLPrototype, 'username', accessorDescriptor('getUsername', 'setUsername'));\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n defineBuiltInAccessor(URLPrototype, 'password', accessorDescriptor('getPassword', 'setPassword'));\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n defineBuiltInAccessor(URLPrototype, 'host', accessorDescriptor('getHost', 'setHost'));\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n defineBuiltInAccessor(URLPrototype, 'hostname', accessorDescriptor('getHostname', 'setHostname'));\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n defineBuiltInAccessor(URLPrototype, 'port', accessorDescriptor('getPort', 'setPort'));\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n defineBuiltInAccessor(URLPrototype, 'pathname', accessorDescriptor('getPathname', 'setPathname'));\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n defineBuiltInAccessor(URLPrototype, 'search', accessorDescriptor('getSearch', 'setSearch'));\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n defineBuiltInAccessor(URLPrototype, 'searchParams', accessorDescriptor('getSearchParams'));\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n defineBuiltInAccessor(URLPrototype, 'hash', accessorDescriptor('getHash', 'setHash'));\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\ndefineBuiltIn(URLPrototype, 'toJSON', function toJSON() {\n return getInternalURLState(this).serialize();\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\ndefineBuiltIn(URLPrototype, 'toString', function toString() {\n return getInternalURLState(this).serialize();\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n if (nativeCreateObjectURL) defineBuiltIn(URLConstructor, 'createObjectURL', bind(nativeCreateObjectURL, NativeURL));\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n if (nativeRevokeObjectURL) defineBuiltIn(URLConstructor, 'revokeObjectURL', bind(nativeRevokeObjectURL, NativeURL));\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, constructor: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\n$({ target: 'URL', proto: true, enumerable: true }, {\n toJSON: function toJSON() {\n return call(URL.prototype.toString, this);\n }\n});\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import toNumber from './toNumber.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nexport default toFinite;\n","import toFinite from './toFinite.js';\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nexport default toInteger;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import eq from './eq.js';\nimport isArrayLike from './isArrayLike.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nexport default isIterateeCall;\n","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nexport default baseSlice;\n","import baseSlice from './_baseSlice.js';\nimport isIterateeCall from './_isIterateeCall.js';\nimport toInteger from './toInteger.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n nativeMax = Math.max;\n\n/**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\nfunction chunk(array, size, guard) {\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n size = 1;\n } else {\n size = nativeMax(toInteger(size), 0);\n }\n var length = array == null ? 0 : array.length;\n if (!length || size < 1) {\n return [];\n }\n var index = 0,\n resIndex = 0,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[resIndex++] = baseSlice(array, index, (index += size));\n }\n return result;\n}\n\nexport default chunk;\n","import baseGetTag from './_baseGetTag.js';\nimport isArray from './isArray.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nexport default isString;\n","import\"core-js/modules/es.symbol.description.js\";import\"core-js/modules/es.array.flat.js\";import\"core-js/modules/es.array.flat-map.js\";import\"core-js/modules/es.array.includes.js\";import\"core-js/modules/es.array.reduce.js\";import\"core-js/modules/es.array.reduce-right.js\";import\"core-js/modules/es.array.sort.js\";import\"core-js/modules/es.array.unscopables.flat.js\";import\"core-js/modules/es.array.unscopables.flat-map.js\";import\"core-js/modules/es.math.hypot.js\";import\"core-js/modules/es.object.from-entries.js\";import\"core-js/modules/es.promise.js\";import\"core-js/modules/es.promise.finally.js\";import\"core-js/modules/es.regexp.constructor.js\";import\"core-js/modules/es.regexp.exec.js\";import\"core-js/modules/es.regexp.flags.js\";import\"core-js/modules/es.string.replace.js\";import\"core-js/modules/es.typed-array.float32-array.js\";import\"core-js/modules/es.typed-array.float64-array.js\";import\"core-js/modules/es.typed-array.int8-array.js\";import\"core-js/modules/es.typed-array.int16-array.js\";import\"core-js/modules/es.typed-array.int32-array.js\";import\"core-js/modules/es.typed-array.uint8-array.js\";import\"core-js/modules/es.typed-array.uint8-clamped-array.js\";import\"core-js/modules/es.typed-array.uint16-array.js\";import\"core-js/modules/es.typed-array.uint32-array.js\";import\"core-js/modules/es.typed-array.from.js\";import\"core-js/modules/es.typed-array.of.js\";import\"core-js/modules/es.typed-array.set.js\";import\"core-js/modules/es.typed-array.sort.js\";import\"core-js/modules/esnext.aggregate-error.js\";import\"core-js/modules/esnext.array.last-index.js\";import\"core-js/modules/esnext.array.last-item.js\";import\"core-js/modules/esnext.composite-key.js\";import\"core-js/modules/esnext.composite-symbol.js\";import\"core-js/modules/esnext.global-this.js\";import\"core-js/modules/esnext.map.delete-all.js\";import\"core-js/modules/esnext.map.every.js\";import\"core-js/modules/esnext.map.filter.js\";import\"core-js/modules/esnext.map.find.js\";import\"core-js/modules/esnext.map.find-key.js\";import\"core-js/modules/esnext.map.from.js\";import\"core-js/modules/esnext.map.group-by.js\";import\"core-js/modules/esnext.map.includes.js\";import\"core-js/modules/esnext.map.key-by.js\";import\"core-js/modules/esnext.map.key-of.js\";import\"core-js/modules/esnext.map.map-keys.js\";import\"core-js/modules/esnext.map.map-values.js\";import\"core-js/modules/esnext.map.merge.js\";import\"core-js/modules/esnext.map.of.js\";import\"core-js/modules/esnext.map.reduce.js\";import\"core-js/modules/esnext.map.some.js\";import\"core-js/modules/esnext.map.update.js\";import\"core-js/modules/esnext.math.clamp.js\";import\"core-js/modules/esnext.math.deg-per-rad.js\";import\"core-js/modules/esnext.math.degrees.js\";import\"core-js/modules/esnext.math.fscale.js\";import\"core-js/modules/esnext.math.iaddh.js\";import\"core-js/modules/esnext.math.imulh.js\";import\"core-js/modules/esnext.math.isubh.js\";import\"core-js/modules/esnext.math.rad-per-deg.js\";import\"core-js/modules/esnext.math.radians.js\";import\"core-js/modules/esnext.math.scale.js\";import\"core-js/modules/esnext.math.seeded-prng.js\";import\"core-js/modules/esnext.math.signbit.js\";import\"core-js/modules/esnext.math.umulh.js\";import\"core-js/modules/esnext.number.from-string.js\";import\"core-js/modules/esnext.observable.js\";import\"core-js/modules/esnext.promise.all-settled.js\";import\"core-js/modules/esnext.promise.any.js\";import\"core-js/modules/esnext.promise.try.js\";import\"core-js/modules/esnext.reflect.define-metadata.js\";import\"core-js/modules/esnext.reflect.delete-metadata.js\";import\"core-js/modules/esnext.reflect.get-metadata.js\";import\"core-js/modules/esnext.reflect.get-metadata-keys.js\";import\"core-js/modules/esnext.reflect.get-own-metadata.js\";import\"core-js/modules/esnext.reflect.get-own-metadata-keys.js\";import\"core-js/modules/esnext.reflect.has-metadata.js\";import\"core-js/modules/esnext.reflect.has-own-metadata.js\";import\"core-js/modules/esnext.reflect.metadata.js\";import\"core-js/modules/esnext.set.add-all.js\";import\"core-js/modules/esnext.set.delete-all.js\";import\"core-js/modules/esnext.set.difference.js\";import\"core-js/modules/esnext.set.every.js\";import\"core-js/modules/esnext.set.filter.js\";import\"core-js/modules/esnext.set.find.js\";import\"core-js/modules/esnext.set.from.js\";import\"core-js/modules/esnext.set.intersection.js\";import\"core-js/modules/esnext.set.is-disjoint-from.js\";import\"core-js/modules/esnext.set.is-subset-of.js\";import\"core-js/modules/esnext.set.is-superset-of.js\";import\"core-js/modules/esnext.set.join.js\";import\"core-js/modules/esnext.set.map.js\";import\"core-js/modules/esnext.set.of.js\";import\"core-js/modules/esnext.set.reduce.js\";import\"core-js/modules/esnext.set.some.js\";import\"core-js/modules/esnext.set.symmetric-difference.js\";import\"core-js/modules/esnext.set.union.js\";import\"core-js/modules/esnext.string.at.js\";import\"core-js/modules/esnext.string.code-points.js\";import\"core-js/modules/esnext.string.match-all.js\";import\"core-js/modules/esnext.string.replace-all.js\";import\"core-js/modules/esnext.symbol.dispose.js\";import\"core-js/modules/esnext.symbol.observable.js\";import\"core-js/modules/esnext.symbol.pattern-match.js\";import\"core-js/modules/esnext.weak-map.delete-all.js\";import\"core-js/modules/esnext.weak-map.from.js\";import\"core-js/modules/esnext.weak-map.of.js\";import\"core-js/modules/esnext.weak-set.add-all.js\";import\"core-js/modules/esnext.weak-set.delete-all.js\";import\"core-js/modules/esnext.weak-set.from.js\";import\"core-js/modules/esnext.weak-set.of.js\";import\"core-js/modules/web.dom-collections.iterator.js\";import\"core-js/modules/web.immediate.js\";import\"core-js/modules/web.queue-microtask.js\";import\"core-js/modules/web.url.js\";import\"core-js/modules/web.url.to-json.js\";import\"core-js/modules/web.url-search-params.js\";import{chunk as e,isString as t}from\"#lodash\";function s(e,t,s){return t in e?Object.defineProperty(e,t,{value:s,enumerable:!0,configurable:!0,writable:!0}):e[t]=s,e}class o extends Error{constructor(e,t){e||(e=new.target.defaultMessage),super(e,t)}}s(o,\"defaultMessage\",\"Unexpected error occurred\");class r extends o{}s(r,\"defaultMessage\",\"Object loader configured incorrectly!\");class i extends o{}s(i,\"defaultMessage\",\"Object loader encountered a runtime problem!\");class a{constructor(e){var t;let{serverUrl:s,streamId:o,token:a,objectId:n,options:c={enableCaching:!0,fullyTraverseArrays:!1,excludeProps:[],fetch:null,customLogger:void 0,customWarner:void 0}}=e;if(this.logger=c.customLogger||console.log,this.warner=c.customWarner||console.warn,this.INTERVAL_MS=20,this.TIMEOUT_MS=18e4,this.serverUrl=s||(null===globalThis||void 0===globalThis||null===(t=globalThis.location)||void 0===t?void 0:t.origin),!this.serverUrl)throw new r(\"Invalid serverUrl specified!\");if(this.streamId=o,this.objectId=n,!this.streamId)throw new r(\"Invalid streamId specified!\");if(!this.objectId)throw new r(\"Invalid objectId specified!\");this.logger(\"Object loader constructor called!\"),this.token=a,this.headers={Accept:\"text/plain\"},this.token&&(this.headers.Authorization=\"Bearer \".concat(this.token)),this.requestUrlRootObj=\"\".concat(this.serverUrl,\"/objects/\").concat(this.streamId,\"/\").concat(this.objectId,\"/single\"),this.requestUrlChildren=\"\".concat(this.serverUrl,\"/api/getobjects/\").concat(this.streamId),this.promises=[],this.intervals={},this.buffer=[],this.isLoading=!1,this.totalChildrenCount=0,this.traversedReferencesCount=0,this.options=c,this.options.numConnections=this.options.numConnections||4,this.cacheDB=null,this.lastAsyncPause=Date.now(),this.existingAsyncPause=null,this.preferredFetch=c.fetch,this.fetch=function(){const e=this.preferredFetch||fetch;if(!e)throw new i(\"Couldn't find fetch implementation! If running in a node environment, make sure you pass it in through the constructor!\");return e(...arguments)}}static createFromJSON(e){const t=performance.now(),s=JSON.parse(e);console.warn(\"JSON Parse Time -> \",performance.now()-t);const o=s[0];return new class extends a{constructor(){super({serverUrl:\"dummy\",streamId:\"dummy\",undefined:void 0,objectId:o.id}),this.objectId=o.id}async getRootObject(){return o}async getTotalObjectCount(){return Object.keys((null==o?void 0:o.__closure)||{}).length}async*getObjectIterator(){const e=Date.now();let t=0;for await(const{id:e,obj:o}of this.getRawObjectIterator(s))this.buffer[e]=o,t+=1,yield o;this.logger(\"Loaded \".concat(t,\" objects in: \").concat((Date.now()-e)/1e3))}async*getRawObjectIterator(e){yield{id:e[0].id,obj:e[0]};if(e[0].__closure)for(const t of e)yield{id:t.id,obj:t}}}}async asyncPause(){Date.now()-this.lastAsyncPause>=100&&(this.lastAsyncPause=Date.now(),this.existingAsyncPause=new Promise((e=>setTimeout(e,0))),await this.existingAsyncPause,this.existingAsyncPause=null,Date.now()-this.lastAsyncPause>500&&this.logger(\"Loader Event loop lag: \",Date.now()-this.lastAsyncPause))}dispose(){this.buffer=[],this.promises=[],Object.values(this.intervals).forEach((e=>clearInterval(e.interval)))}async getTotalObjectCount(){const e=await this.getRawRootObject(),t=JSON.parse(e);return Object.keys((null==t?void 0:t.__closure)||{}).length}async getRootObject(){const e=await this.getRawRootObject();return JSON.parse(e)}async getAndConstructObject(e){await this.downloadObjectsInBuffer(e);const t=await this.getObject(this.objectId);return this.traverseAndConstruct(t,e)}async downloadObjectsInBuffer(e){let t=!0,s=0;for await(const o of this.getObjectIterator())t&&(this.totalChildrenCount=o.totalChildrenCount,t=!1,this.isLoading=!0),s++,e&&e({stage:\"download\",current:s,total:this.totalChildrenCount});this.isLoading=!1}async traverseAndConstruct(e,t){if(e){if(\"object\"!=typeof e)return e;if(Array.isArray(e)&&0!==e.length){var s,o;const r=[];for(const s of e){if(!s)continue;if(\"object\"!=typeof s&&!this.options.fullyTraverseArrays)return e;const o=s.referencedId?await this.getObject(s.referencedId):s;s.referencedId&&t&&t({stage:\"construction\",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount}),r.push(await this.traverseAndConstruct(o,t))}return null!==(s=r[0])&&void 0!==s&&null!==(o=s.speckle_type)&&void 0!==o&&o.toLowerCase().includes(\"datachunk\")?r.reduce(((e,t)=>e.concat(t.data)),[]):r}for(const t of this.options.excludeProps)delete e[t];for(const s in e)\"object\"==typeof e[s]&&null!==e[s]&&(e[s].referencedId&&(e[s]=await this.getObject(e[s].referencedId),t&&t({stage:\"construction\",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount})),e[s]=await this.traverseAndConstruct(e[s],t));return e}}async getObject(e){if(this.buffer[e])return this.buffer[e];return new Promise(((t,s)=>{if(this.promises.push({id:e,resolve:t,reject:s}),this.intervals[e])this.intervals[e].elapsed=0;else{const t=setInterval(this.tryResolvePromise.bind(this),this.INTERVAL_MS,e);this.intervals[e]={interval:t,elapsed:0}}}))}tryResolvePromise(e){if(this.intervals[e].elapsed+=this.INTERVAL_MS,this.buffer[e]){for(const t of this.promises.filter((t=>t.id===e)))t.resolve(this.buffer[e]);return clearInterval(this.intervals[e].interval),void delete this.intervals[e]}this.intervals[e].elapsed>this.TIMEOUT_MS&&(this.warner(\"Timeout resolving \".concat(e,\". HIC SVNT DRACONES.\")),clearInterval(this.intervals[e].interval),this.promises.filter((t=>t.id===e)).forEach((e=>e.reject())),this.promises=this.promises.filter((e=>e.id!=e.id)))}async*getObjectIterator(){const e=Date.now();let t=0;for await(const e of this.getRawObjectIterator()){const{id:s,obj:o}=this.processLine(e);this.buffer[s]=o,t+=1,yield o}this.logger(\"Loaded \".concat(t,\" objects in: \").concat((Date.now()-e)/1e3))}processLine(e){const t=e.split(\"\\t\"),[s,o]=t;let r;try{r=JSON.parse(o)}catch(e){throw new Error(\"Error parsing object \".concat(s,\": \").concat(e.message))}return{id:s,obj:r}}supportsCache(){return!(!this.options.enableCaching||!globalThis.indexedDB)}async setupCacheDb(){if(!this.supportsCache()||null!==this.cacheDB)return;await function(){if(navigator.userAgentData||!/Safari\\//.test(navigator.userAgent)||/Chrom(e|ium)\\//.test(navigator.userAgent)||!indexedDB.databases)return Promise.resolve();let e;return new Promise((t=>{const s=()=>indexedDB.databases().finally(t);e=setInterval(s,100),s()})).finally((()=>clearInterval(e)))}();const e=indexedDB.open(\"speckle-object-cache\",1);e.onupgradeneeded=()=>e.result.createObjectStore(\"objects\"),this.cacheDB=await this.promisifyIdbRequest(e)}async*getRawObjectIterator(){await this.setupCacheDb();const t=await this.getRawRootObject();yield\"\".concat(this.objectId,\"\\t\").concat(t);const s=JSON.parse(t);if(!s.__closure)return;let o=Object.keys(s.__closure).filter((e=>!e.includes(\"blob\"))).sort(((e,t)=>s.__closure[e]-s.__closure[t]));if(0===o.length)return;let r=[];if(o.length>50){const t=[[],[],[],[]];let i=0;for(;i<.05*o.length;i++)t[0].push(o[i]);for(;i<.2*o.length;i++)t[1].push(o[i]);for(;i<.6*o.length;i++)t[2].push(o[i]);for(;is.__closure[e]-s.__closure[t]));for(const e of i)yield\"\".concat(e,\"\\t\").concat(r[e]);const c=t[o].filter((e=>!(e in r))),l=e(c,500);for(let e=0;es.__closure[e]-s.__closure[t]));for(const s of t)yield\"\".concat(s,\"\\t\").concat(e[s]);if(o=o.filter((t=>!(t in e))),0===o.length)return;r.push(o)}const i=[],a=[],n=[],c=[],l=[];for(let e=0;e{t.body.getReader&&(t.body.iterator=async function*(){const e=this.getReader();for(;;){const t=await e.read();if(t.done)return t.value;yield t.value}});const s=t.body.iterator();a[e]=s;const o=s.next().then((t=>(t.reqId=e,t)));n[e]=o}));for(;;){const e=n.filter((e=>!!e));if(0===e.length){if(l.every((e=>e)))break;await new Promise((e=>{setTimeout(e,10)}));continue}const t=await Promise.any(e);let{value:s,done:o,reqId:r}=t;if(l[r]=o,o)c[r].length>0&&(yield c[r],c[r]=\"\"),n[r]=null;else{const e=a[r].next().then((e=>(e.reqId=r,e)));n[r]=e}if(!s)continue;s=i[r].decode(s);const m=(c[r]+s).split(/\\r\\n|\\n|\\r/),d=m.pop();c[r]=d;for(const e of m)yield e;this.cacheStoreObjects(m)}}async getRawRootObject(){const e=await this.cacheGetObjects([this.objectId]);if(e[this.objectId])return e[this.objectId];const t=await this.fetch(this.requestUrlRootObj,{headers:this.headers}),s=await t.text();if([401,403].includes(t.status))throw new i(\"You do not have access to the root object!\");return this.cacheStoreObjects([\"\".concat(this.objectId,\"\\t\").concat(s)]),s}promisifyIdbRequest(e){return new Promise(((t,s)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>s(e.error)}))}async cacheGetObjects(e){if(!this.supportsCache())return{};null===this.cacheDB&&await this.setupCacheDb();const s={};for(let o=0;othis.promisifyIdbRequest(i.get(e)).then((t=>({id:e,data:t}))))),n=await Promise.all(a);for(const e of n)!e.data||t(e.data)&&e.data.startsWith(\"> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range to range \nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, - 1.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, - 1.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n\n\nexport {\n\tDEG2RAD,\n\tRAD2DEG,\n\tgenerateUUID,\n\tclamp,\n\teuclideanModulo,\n\tmapLinear,\n\tinverseLerp,\n\tlerp,\n\tdamp,\n\tpingpong,\n\tsmoothstep,\n\tsmootherstep,\n\trandInt,\n\trandFloat,\n\trandFloatSpread,\n\tseededRandom,\n\tdegToRad,\n\tradToDeg,\n\tisPowerOfTwo,\n\tceilPowerOfTwo,\n\tfloorPowerOfTwo,\n\tsetQuaternionFromProperEuler,\n\tnormalize,\n\tdenormalize,\n};\n","/*!\r\n * js-logger - http://github.com/jonnyreeves/js-logger\r\n * Jonny Reeves, http://jonnyreeves.co.uk/\r\n * js-logger may be freely distributed under the MIT license.\r\n */\r\n(function (global) {\r\n\t\"use strict\";\r\n\r\n\t// Top level module for the global, static logger instance.\r\n\tvar Logger = { };\r\n\r\n\t// For those that are at home that are keeping score.\r\n\tLogger.VERSION = \"1.6.1\";\r\n\r\n\t// Function which handles all incoming log messages.\r\n\tvar logHandler;\r\n\r\n\t// Map of ContextualLogger instances by name; used by Logger.get() to return the same named instance.\r\n\tvar contextualLoggersByNameMap = {};\r\n\r\n\t// Polyfill for ES5's Function.bind.\r\n\tvar bind = function(scope, func) {\r\n\t\treturn function() {\r\n\t\t\treturn func.apply(scope, arguments);\r\n\t\t};\r\n\t};\r\n\r\n\t// Super exciting object merger-matron 9000 adding another 100 bytes to your download.\r\n\tvar merge = function () {\r\n\t\tvar args = arguments, target = args[0], key, i;\r\n\t\tfor (i = 1; i < args.length; i++) {\r\n\t\t\tfor (key in args[i]) {\r\n\t\t\t\tif (!(key in target) && args[i].hasOwnProperty(key)) {\r\n\t\t\t\t\ttarget[key] = args[i][key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn target;\r\n\t};\r\n\r\n\t// Helper to define a logging level object; helps with optimisation.\r\n\tvar defineLogLevel = function(value, name) {\r\n\t\treturn { value: value, name: name };\r\n\t};\r\n\r\n\t// Predefined logging levels.\r\n\tLogger.TRACE = defineLogLevel(1, 'TRACE');\r\n\tLogger.DEBUG = defineLogLevel(2, 'DEBUG');\r\n\tLogger.INFO = defineLogLevel(3, 'INFO');\r\n\tLogger.TIME = defineLogLevel(4, 'TIME');\r\n\tLogger.WARN = defineLogLevel(5, 'WARN');\r\n\tLogger.ERROR = defineLogLevel(8, 'ERROR');\r\n\tLogger.OFF = defineLogLevel(99, 'OFF');\r\n\r\n\t// Inner class which performs the bulk of the work; ContextualLogger instances can be configured independently\r\n\t// of each other.\r\n\tvar ContextualLogger = function(defaultContext) {\r\n\t\tthis.context = defaultContext;\r\n\t\tthis.setLevel(defaultContext.filterLevel);\r\n\t\tthis.log = this.info; // Convenience alias.\r\n\t};\r\n\r\n\tContextualLogger.prototype = {\r\n\t\t// Changes the current logging level for the logging instance.\r\n\t\tsetLevel: function (newLevel) {\r\n\t\t\t// Ensure the supplied Level object looks valid.\r\n\t\t\tif (newLevel && \"value\" in newLevel) {\r\n\t\t\t\tthis.context.filterLevel = newLevel;\r\n\t\t\t}\r\n\t\t},\r\n\t\t\r\n\t\t// Gets the current logging level for the logging instance\r\n\t\tgetLevel: function () {\r\n\t\t\treturn this.context.filterLevel;\r\n\t\t},\r\n\r\n\t\t// Is the logger configured to output messages at the supplied level?\r\n\t\tenabledFor: function (lvl) {\r\n\t\t\tvar filterLevel = this.context.filterLevel;\r\n\t\t\treturn lvl.value >= filterLevel.value;\r\n\t\t},\r\n\r\n\t\ttrace: function () {\r\n\t\t\tthis.invoke(Logger.TRACE, arguments);\r\n\t\t},\r\n\r\n\t\tdebug: function () {\r\n\t\t\tthis.invoke(Logger.DEBUG, arguments);\r\n\t\t},\r\n\r\n\t\tinfo: function () {\r\n\t\t\tthis.invoke(Logger.INFO, arguments);\r\n\t\t},\r\n\r\n\t\twarn: function () {\r\n\t\t\tthis.invoke(Logger.WARN, arguments);\r\n\t\t},\r\n\r\n\t\terror: function () {\r\n\t\t\tthis.invoke(Logger.ERROR, arguments);\r\n\t\t},\r\n\r\n\t\ttime: function (label) {\r\n\t\t\tif (typeof label === 'string' && label.length > 0) {\r\n\t\t\t\tthis.invoke(Logger.TIME, [ label, 'start' ]);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ttimeEnd: function (label) {\r\n\t\t\tif (typeof label === 'string' && label.length > 0) {\r\n\t\t\t\tthis.invoke(Logger.TIME, [ label, 'end' ]);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// Invokes the logger callback if it's not being filtered.\r\n\t\tinvoke: function (level, msgArgs) {\r\n\t\t\tif (logHandler && this.enabledFor(level)) {\r\n\t\t\t\tlogHandler(msgArgs, merge({ level: level }, this.context));\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t// Protected instance which all calls to the to level `Logger` module will be routed through.\r\n\tvar globalLogger = new ContextualLogger({ filterLevel: Logger.OFF });\r\n\r\n\t// Configure the global Logger instance.\r\n\t(function() {\r\n\t\t// Shortcut for optimisers.\r\n\t\tvar L = Logger;\r\n\r\n\t\tL.enabledFor = bind(globalLogger, globalLogger.enabledFor);\r\n\t\tL.trace = bind(globalLogger, globalLogger.trace);\r\n\t\tL.debug = bind(globalLogger, globalLogger.debug);\r\n\t\tL.time = bind(globalLogger, globalLogger.time);\r\n\t\tL.timeEnd = bind(globalLogger, globalLogger.timeEnd);\r\n\t\tL.info = bind(globalLogger, globalLogger.info);\r\n\t\tL.warn = bind(globalLogger, globalLogger.warn);\r\n\t\tL.error = bind(globalLogger, globalLogger.error);\r\n\r\n\t\t// Don't forget the convenience alias!\r\n\t\tL.log = L.info;\r\n\t}());\r\n\r\n\t// Set the global logging handler. The supplied function should expect two arguments, the first being an arguments\r\n\t// object with the supplied log messages and the second being a context object which contains a hash of stateful\r\n\t// parameters which the logging function can consume.\r\n\tLogger.setHandler = function (func) {\r\n\t\tlogHandler = func;\r\n\t};\r\n\r\n\t// Sets the global logging filter level which applies to *all* previously registered, and future Logger instances.\r\n\t// (note that named loggers (retrieved via `Logger.get`) can be configured independently if required).\r\n\tLogger.setLevel = function(level) {\r\n\t\t// Set the globalLogger's level.\r\n\t\tglobalLogger.setLevel(level);\r\n\r\n\t\t// Apply this level to all registered contextual loggers.\r\n\t\tfor (var key in contextualLoggersByNameMap) {\r\n\t\t\tif (contextualLoggersByNameMap.hasOwnProperty(key)) {\r\n\t\t\t\tcontextualLoggersByNameMap[key].setLevel(level);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t// Gets the global logging filter level\r\n\tLogger.getLevel = function() {\r\n\t\treturn globalLogger.getLevel();\r\n\t};\r\n\r\n\t// Retrieve a ContextualLogger instance. Note that named loggers automatically inherit the global logger's level,\r\n\t// default context and log handler.\r\n\tLogger.get = function (name) {\r\n\t\t// All logger instances are cached so they can be configured ahead of use.\r\n\t\treturn contextualLoggersByNameMap[name] ||\r\n\t\t\t(contextualLoggersByNameMap[name] = new ContextualLogger(merge({ name: name }, globalLogger.context)));\r\n\t};\r\n\r\n\t// CreateDefaultHandler returns a handler function which can be passed to `Logger.setHandler()` which will\r\n\t// write to the window's console object (if present); the optional options object can be used to customise the\r\n\t// formatter used to format each log message.\r\n\tLogger.createDefaultHandler = function (options) {\r\n\t\toptions = options || {};\r\n\r\n\t\toptions.formatter = options.formatter || function defaultMessageFormatter(messages, context) {\r\n\t\t\t// Prepend the logger's name to the log message for easy identification.\r\n\t\t\tif (context.name) {\r\n\t\t\t\tmessages.unshift(\"[\" + context.name + \"]\");\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Map of timestamps by timer labels used to track `#time` and `#timeEnd()` invocations in environments\r\n\t\t// that don't offer a native console method.\r\n\t\tvar timerStartTimeByLabelMap = {};\r\n\r\n\t\t// Support for IE8+ (and other, slightly more sane environments)\r\n\t\tvar invokeConsoleMethod = function (hdlr, messages) {\r\n\t\t\tFunction.prototype.apply.call(hdlr, console, messages);\r\n\t\t};\r\n\r\n\t\t// Check for the presence of a logger.\r\n\t\tif (typeof console === \"undefined\") {\r\n\t\t\treturn function () { /* no console */ };\r\n\t\t}\r\n\r\n\t\treturn function(messages, context) {\r\n\t\t\t// Convert arguments object to Array.\r\n\t\t\tmessages = Array.prototype.slice.call(messages);\r\n\r\n\t\t\tvar hdlr = console.log;\r\n\t\t\tvar timerLabel;\r\n\r\n\t\t\tif (context.level === Logger.TIME) {\r\n\t\t\t\ttimerLabel = (context.name ? '[' + context.name + '] ' : '') + messages[0];\r\n\r\n\t\t\t\tif (messages[1] === 'start') {\r\n\t\t\t\t\tif (console.time) {\r\n\t\t\t\t\t\tconsole.time(timerLabel);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\ttimerStartTimeByLabelMap[timerLabel] = new Date().getTime();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (console.timeEnd) {\r\n\t\t\t\t\t\tconsole.timeEnd(timerLabel);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tinvokeConsoleMethod(hdlr, [ timerLabel + ': ' +\r\n\t\t\t\t\t\t\t(new Date().getTime() - timerStartTimeByLabelMap[timerLabel]) + 'ms' ]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// Delegate through to custom warn/error loggers if present on the console.\r\n\t\t\t\tif (context.level === Logger.WARN && console.warn) {\r\n\t\t\t\t\thdlr = console.warn;\r\n\t\t\t\t} else if (context.level === Logger.ERROR && console.error) {\r\n\t\t\t\t\thdlr = console.error;\r\n\t\t\t\t} else if (context.level === Logger.INFO && console.info) {\r\n\t\t\t\t\thdlr = console.info;\r\n\t\t\t\t} else if (context.level === Logger.DEBUG && console.debug) {\r\n\t\t\t\t\thdlr = console.debug;\r\n\t\t\t\t} else if (context.level === Logger.TRACE && console.trace) {\r\n\t\t\t\t\thdlr = console.trace;\r\n\t\t\t\t}\r\n\r\n\t\t\t\toptions.formatter(messages, context);\r\n\t\t\t\tinvokeConsoleMethod(hdlr, messages);\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n\r\n\t// Configure and example a Default implementation which writes to the `window.console` (if present). The\r\n\t// `options` hash can be used to configure the default logLevel and provide a custom message formatter.\r\n\tLogger.useDefaults = function(options) {\r\n\t\tLogger.setLevel(options && options.defaultLevel || Logger.DEBUG);\r\n\t\tLogger.setHandler(Logger.createDefaultHandler(options));\r\n\t};\r\n\r\n\t// Createa an alias to useDefaults to avoid reaking a react-hooks rule.\r\n\tLogger.setDefaults = Logger.useDefaults;\r\n\r\n\t// Export to popular environments boilerplate.\r\n\tif (typeof define === 'function' && define.amd) {\r\n\t\tdefine(Logger);\r\n\t}\r\n\telse if (typeof module !== 'undefined' && module.exports) {\r\n\t\tmodule.exports = Logger;\r\n\t}\r\n\telse {\r\n\t\tLogger._prevLogger = global.Logger;\r\n\r\n\t\tLogger.noConflict = function () {\r\n\t\t\tglobal.Logger = Logger._prevLogger;\r\n\t\t\treturn Logger;\r\n\t\t};\r\n\r\n\t\tglobal.Logger = Logger;\r\n\t}\r\n}(this));\r\n","/*!\n * camera-controls\n * https://github.com/yomotsu/camera-controls\n * (c) 2017 @yomotsu\n * Released under the MIT License.\n */\n// see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#value\nconst MOUSE_BUTTON = {\n LEFT: 1,\n RIGHT: 2,\n MIDDLE: 4,\n};\nconst ACTION = Object.freeze({\n NONE: 0,\n ROTATE: 1,\n TRUCK: 2,\n OFFSET: 4,\n DOLLY: 8,\n ZOOM: 16,\n TOUCH_ROTATE: 32,\n TOUCH_TRUCK: 64,\n TOUCH_OFFSET: 128,\n TOUCH_DOLLY: 256,\n TOUCH_ZOOM: 512,\n TOUCH_DOLLY_TRUCK: 1024,\n TOUCH_DOLLY_OFFSET: 2048,\n TOUCH_DOLLY_ROTATE: 4096,\n TOUCH_ZOOM_TRUCK: 8192,\n TOUCH_ZOOM_OFFSET: 16384,\n TOUCH_ZOOM_ROTATE: 32768,\n});\nfunction isPerspectiveCamera(camera) {\n return camera.isPerspectiveCamera;\n}\nfunction isOrthographicCamera(camera) {\n return camera.isOrthographicCamera;\n}\n\nconst PI_2 = Math.PI * 2;\nconst PI_HALF = Math.PI / 2;\n\nconst EPSILON = 1e-5;\nfunction approxZero(number, error = EPSILON) {\n return Math.abs(number) < error;\n}\nfunction approxEquals(a, b, error = EPSILON) {\n return approxZero(a - b, error);\n}\nfunction roundToStep(value, step) {\n return Math.round(value / step) * step;\n}\nfunction infinityToMaxNumber(value) {\n if (isFinite(value))\n return value;\n if (value < 0)\n return -Number.MAX_VALUE;\n return Number.MAX_VALUE;\n}\nfunction maxNumberToInfinity(value) {\n if (Math.abs(value) < Number.MAX_VALUE)\n return value;\n return value * Infinity;\n}\n\nfunction extractClientCoordFromEvent(pointers, out) {\n out.set(0, 0);\n pointers.forEach((pointer) => {\n out.x += pointer.clientX;\n out.y += pointer.clientY;\n });\n out.x /= pointers.length;\n out.y /= pointers.length;\n}\n\nfunction notSupportedInOrthographicCamera(camera, message) {\n if (isOrthographicCamera(camera)) {\n console.warn(`${message} is not supported in OrthographicCamera`);\n return true;\n }\n return false;\n}\n\n/**\n * A compat function for `Quaternion.invert()` / `Quaternion.inverse()`.\n * `Quaternion.invert()` is introduced in r123 and `Quaternion.inverse()` emits a warning.\n * We are going to use this compat for a while.\n * @param target A target quaternion\n */\nfunction quatInvertCompat(target) {\n if (target.invert) {\n target.invert();\n }\n else {\n target.inverse();\n }\n return target;\n}\n\nclass EventDispatcher {\n constructor() {\n this._listeners = {};\n }\n /**\n * Adds the specified event listener.\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n addEventListener(type, listener) {\n const listeners = this._listeners;\n if (listeners[type] === undefined)\n listeners[type] = [];\n if (listeners[type].indexOf(listener) === -1)\n listeners[type].push(listener);\n }\n /**\n * Presence of the specified event listener.\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n hasEventListener(type, listener) {\n const listeners = this._listeners;\n return listeners[type] !== undefined && listeners[type].indexOf(listener) !== -1;\n }\n /**\n * Removes the specified event listener\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n removeEventListener(type, listener) {\n const listeners = this._listeners;\n const listenerArray = listeners[type];\n if (listenerArray !== undefined) {\n const index = listenerArray.indexOf(listener);\n if (index !== -1)\n listenerArray.splice(index, 1);\n }\n }\n /**\n * Removes all event listeners\n * @param type event name\n * @category Methods\n */\n removeAllEventListeners(type) {\n if (!type) {\n this._listeners = {};\n return;\n }\n if (Array.isArray(this._listeners[type]))\n this._listeners[type].length = 0;\n }\n /**\n * Fire an event type.\n * @param event DispatcherEvent\n * @category Methods\n */\n dispatchEvent(event) {\n const listeners = this._listeners;\n const listenerArray = listeners[event.type];\n if (listenerArray !== undefined) {\n event.target = this;\n const array = listenerArray.slice(0);\n for (let i = 0, l = array.length; i < l; i++) {\n array[i].call(this, event);\n }\n }\n }\n}\n\nconst VERSION = '1.38.1'; // will be replaced with `version` in package.json during the build process.\nconst TOUCH_DOLLY_FACTOR = 1 / 8;\nconst isBrowser = typeof window !== 'undefined';\nconst isMac = isBrowser && /Mac/.test(navigator.platform);\nconst isPointerEventsNotSupported = !(isBrowser && 'PointerEvent' in window); // Safari 12 does not support PointerEvents API\nlet THREE;\nlet _ORIGIN;\nlet _AXIS_Y;\nlet _AXIS_Z;\nlet _v2;\nlet _v3A;\nlet _v3B;\nlet _v3C;\nlet _xColumn;\nlet _yColumn;\nlet _zColumn;\nlet _deltaTarget;\nlet _deltaOffset;\nlet _sphericalA;\nlet _sphericalB;\nlet _box3A;\nlet _box3B;\nlet _sphere;\nlet _quaternionA;\nlet _quaternionB;\nlet _rotationMatrix;\nlet _raycaster;\nclass CameraControls extends EventDispatcher {\n /**\n * Injects THREE as the dependency. You can then proceed to use CameraControls.\n *\n * e.g\n * ```javascript\n * CameraControls.install( { THREE: THREE } );\n * ```\n *\n * Note: If you do not wish to use enter three.js to reduce file size(tree-shaking for example), make a subset to install.\n *\n * ```js\n * import {\n * \tVector2,\n * \tVector3,\n * \tVector4,\n * \tQuaternion,\n * \tMatrix4,\n * \tSpherical,\n * \tBox3,\n * \tSphere,\n * \tRaycaster,\n * \tMathUtils,\n * } from 'three';\n *\n * const subsetOfTHREE = {\n * \tVector2 : Vector2,\n * \tVector3 : Vector3,\n * \tVector4 : Vector4,\n * \tQuaternion: Quaternion,\n * \tMatrix4 : Matrix4,\n * \tSpherical : Spherical,\n * \tBox3 : Box3,\n * \tSphere : Sphere,\n * \tRaycaster : Raycaster,\n * \tMathUtils : {\n * \t\tDEG2RAD: MathUtils.DEG2RAD,\n * \t\tclamp: MathUtils.clamp,\n * \t},\n * };\n\n * CameraControls.install( { THREE: subsetOfTHREE } );\n * ```\n * @category Statics\n */\n static install(libs) {\n THREE = libs.THREE;\n _ORIGIN = Object.freeze(new THREE.Vector3(0, 0, 0));\n _AXIS_Y = Object.freeze(new THREE.Vector3(0, 1, 0));\n _AXIS_Z = Object.freeze(new THREE.Vector3(0, 0, 1));\n _v2 = new THREE.Vector2();\n _v3A = new THREE.Vector3();\n _v3B = new THREE.Vector3();\n _v3C = new THREE.Vector3();\n _xColumn = new THREE.Vector3();\n _yColumn = new THREE.Vector3();\n _zColumn = new THREE.Vector3();\n _deltaTarget = new THREE.Vector3();\n _deltaOffset = new THREE.Vector3();\n _sphericalA = new THREE.Spherical();\n _sphericalB = new THREE.Spherical();\n _box3A = new THREE.Box3();\n _box3B = new THREE.Box3();\n _sphere = new THREE.Sphere();\n _quaternionA = new THREE.Quaternion();\n _quaternionB = new THREE.Quaternion();\n _rotationMatrix = new THREE.Matrix4();\n _raycaster = new THREE.Raycaster();\n }\n /**\n * list all ACTIONs\n * @category Statics\n */\n static get ACTION() {\n return ACTION;\n }\n /**\n * Creates a `CameraControls` instance.\n *\n * Note:\n * You **must install** three.js before using camera-controls. see [#install](#install)\n * Not doing so will lead to runtime errors (`undefined` references to THREE).\n *\n * e.g.\n * ```\n * CameraControls.install( { THREE } );\n * const cameraControls = new CameraControls( camera, domElement );\n * ```\n *\n * @param camera A `THREE.PerspectiveCamera` or `THREE.OrthographicCamera` to be controlled.\n * @param domElement A `HTMLElement` for the draggable area, usually `renderer.domElement`.\n * @category Constructor\n */\n constructor(camera, domElement) {\n super();\n /**\n * Minimum vertical angle in radians.\n * The angle has to be between `0` and `.maxPolarAngle` inclusive.\n * The default value is `0`.\n *\n * e.g.\n * ```\n * cameraControls.maxPolarAngle = 0;\n * ```\n * @category Properties\n */\n this.minPolarAngle = 0; // radians\n /**\n * Maximum vertical angle in radians.\n * The angle has to be between `.maxPolarAngle` and `Math.PI` inclusive.\n * The default value is `Math.PI`.\n *\n * e.g.\n * ```\n * cameraControls.maxPolarAngle = Math.PI;\n * ```\n * @category Properties\n */\n this.maxPolarAngle = Math.PI; // radians\n /**\n * Minimum horizontal angle in radians.\n * The angle has to be less than `.maxAzimuthAngle`.\n * The default value is `- Infinity`.\n *\n * e.g.\n * ```\n * cameraControls.minAzimuthAngle = - Infinity;\n * ```\n * @category Properties\n */\n this.minAzimuthAngle = -Infinity; // radians\n /**\n * Maximum horizontal angle in radians.\n * The angle has to be greater than `.minAzimuthAngle`.\n * The default value is `Infinity`.\n *\n * e.g.\n * ```\n * cameraControls.maxAzimuthAngle = Infinity;\n * ```\n * @category Properties\n */\n this.maxAzimuthAngle = Infinity; // radians\n // How far you can dolly in and out ( PerspectiveCamera only )\n /**\n * Minimum distance for dolly. The value must be higher than `0`.\n * PerspectiveCamera only.\n * @category Properties\n */\n this.minDistance = 0;\n /**\n * Maximum distance for dolly. The value must be higher than `minDistance`.\n * PerspectiveCamera only.\n * @category Properties\n */\n this.maxDistance = Infinity;\n /**\n * `true` to enable Infinity Dolly.\n * When the Dolly distance is less than the `minDistance`, radius of the sphere will be set `minDistance` automatically.\n * @category Properties\n */\n this.infinityDolly = false;\n /**\n * Minimum camera zoom.\n * @category Properties\n */\n this.minZoom = 0.01;\n /**\n * Maximum camera zoom.\n * @category Properties\n */\n this.maxZoom = Infinity;\n /**\n * The damping inertia.\n * The value must be between `Math.EPSILON` to `1` inclusive.\n * Setting `1` to disable smooth transitions.\n * @category Properties\n */\n this.dampingFactor = 0.05;\n /**\n * The damping inertia while dragging.\n * The value must be between `Math.EPSILON` to `1` inclusive.\n * Setting `1` to disable smooth transitions.\n * @category Properties\n */\n this.draggingDampingFactor = 0.25;\n /**\n * Speed of azimuth (horizontal) rotation.\n * @category Properties\n */\n this.azimuthRotateSpeed = 1.0;\n /**\n * Speed of polar (vertical) rotation.\n * @category Properties\n */\n this.polarRotateSpeed = 1.0;\n /**\n * Speed of mouse-wheel dollying.\n * @category Properties\n */\n this.dollySpeed = 1.0;\n /**\n * Speed of drag for truck and pedestal.\n * @category Properties\n */\n this.truckSpeed = 2.0;\n /**\n * `true` to enable Dolly-in to the mouse cursor coords.\n * @category Properties\n */\n this.dollyToCursor = false;\n /**\n * @category Properties\n */\n this.dragToOffset = false;\n /**\n * The same as `.screenSpacePanning` in three.js's OrbitControls.\n * @category Properties\n */\n this.verticalDragToForward = false;\n /**\n * Friction ratio of the boundary.\n * @category Properties\n */\n this.boundaryFriction = 0.0;\n /**\n * Controls how soon the `rest` event fires as the camera slows.\n * @category Properties\n */\n this.restThreshold = 0.01;\n /**\n * An array of Meshes to collide with camera.\n * Be aware colliderMeshes may decrease performance. The collision test uses 4 raycasters from the camera since the near plane has 4 corners.\n * @category Properties\n */\n this.colliderMeshes = [];\n /**\n * Force cancel user dragging.\n * @category Methods\n */\n // cancel will be overwritten in the constructor.\n this.cancel = () => { };\n this._enabled = true;\n this._state = ACTION.NONE;\n this._viewport = null;\n this._affectOffset = false;\n this._dollyControlAmount = 0;\n this._hasRested = true;\n this._boundaryEnclosesCamera = false;\n this._needsUpdate = true;\n this._updatedLastTime = false;\n this._elementRect = new DOMRect();\n this._activePointers = [];\n this._truckInternal = (deltaX, deltaY, dragToOffset) => {\n if (isPerspectiveCamera(this._camera)) {\n const offset = _v3A.copy(this._camera.position).sub(this._target);\n // half of the fov is center to top of screen\n const fov = this._camera.getEffectiveFOV() * THREE.MathUtils.DEG2RAD;\n const targetDistance = offset.length() * Math.tan(fov * 0.5);\n const truckX = (this.truckSpeed * deltaX * targetDistance / this._elementRect.height);\n const pedestalY = (this.truckSpeed * deltaY * targetDistance / this._elementRect.height);\n if (this.verticalDragToForward) {\n dragToOffset ?\n this.setFocalOffset(this._focalOffsetEnd.x + truckX, this._focalOffsetEnd.y, this._focalOffsetEnd.z, true) :\n this.truck(truckX, 0, true);\n this.forward(-pedestalY, true);\n }\n else {\n dragToOffset ?\n this.setFocalOffset(this._focalOffsetEnd.x + truckX, this._focalOffsetEnd.y + pedestalY, this._focalOffsetEnd.z, true) :\n this.truck(truckX, pedestalY, true);\n }\n }\n else if (isOrthographicCamera(this._camera)) {\n // orthographic\n const camera = this._camera;\n const truckX = deltaX * (camera.right - camera.left) / camera.zoom / this._elementRect.width;\n const pedestalY = deltaY * (camera.top - camera.bottom) / camera.zoom / this._elementRect.height;\n dragToOffset ?\n this.setFocalOffset(this._focalOffsetEnd.x + truckX, this._focalOffsetEnd.y + pedestalY, this._focalOffsetEnd.z, true) :\n this.truck(truckX, pedestalY, true);\n }\n };\n this._rotateInternal = (deltaX, deltaY) => {\n const theta = PI_2 * this.azimuthRotateSpeed * deltaX / this._elementRect.height; // divide by *height* to refer the resolution\n const phi = PI_2 * this.polarRotateSpeed * deltaY / this._elementRect.height;\n this.rotate(theta, phi, true);\n };\n this._dollyInternal = (delta, x, y) => {\n const dollyScale = Math.pow(0.95, -delta * this.dollySpeed);\n const distance = this._sphericalEnd.radius * dollyScale;\n const prevRadius = this._sphericalEnd.radius;\n const signedPrevRadius = prevRadius * (delta >= 0 ? -1 : 1);\n this.dollyTo(distance);\n if (this.infinityDolly && (distance < this.minDistance || this.maxDistance === this.minDistance)) {\n this._camera.getWorldDirection(_v3A);\n this._targetEnd.add(_v3A.normalize().multiplyScalar(signedPrevRadius));\n this._target.add(_v3A.normalize().multiplyScalar(signedPrevRadius));\n }\n if (this.dollyToCursor) {\n this._dollyControlAmount += this._sphericalEnd.radius - prevRadius;\n if (this.infinityDolly && (distance < this.minDistance || this.maxDistance === this.minDistance)) {\n this._dollyControlAmount -= signedPrevRadius;\n }\n this._dollyControlCoord.set(x, y);\n }\n return;\n };\n this._zoomInternal = (delta, x, y) => {\n const zoomScale = Math.pow(0.95, delta * this.dollySpeed);\n const prevZoom = this._zoomEnd;\n // for both PerspectiveCamera and OrthographicCamera\n this.zoomTo(this._zoom * zoomScale);\n if (this.dollyToCursor) {\n this._dollyControlAmount += this._zoomEnd - prevZoom;\n this._dollyControlCoord.set(x, y);\n }\n return;\n };\n // Check if the user has installed THREE\n if (typeof THREE === 'undefined') {\n console.error('camera-controls: `THREE` is undefined. You must first run `CameraControls.install( { THREE: THREE } )`. Check the docs for further information.');\n }\n this._camera = camera;\n this._yAxisUpSpace = new THREE.Quaternion().setFromUnitVectors(this._camera.up, _AXIS_Y);\n this._yAxisUpSpaceInverse = quatInvertCompat(this._yAxisUpSpace.clone());\n this._state = ACTION.NONE;\n // the location\n this._target = new THREE.Vector3();\n this._targetEnd = this._target.clone();\n this._focalOffset = new THREE.Vector3();\n this._focalOffsetEnd = this._focalOffset.clone();\n // rotation\n this._spherical = new THREE.Spherical().setFromVector3(_v3A.copy(this._camera.position).applyQuaternion(this._yAxisUpSpace));\n this._sphericalEnd = this._spherical.clone();\n this._zoom = this._camera.zoom;\n this._zoomEnd = this._zoom;\n // collisionTest uses nearPlane.s\n this._nearPlaneCorners = [\n new THREE.Vector3(),\n new THREE.Vector3(),\n new THREE.Vector3(),\n new THREE.Vector3(),\n ];\n this._updateNearPlaneCorners();\n // Target cannot move outside of this box\n this._boundary = new THREE.Box3(new THREE.Vector3(-Infinity, -Infinity, -Infinity), new THREE.Vector3(Infinity, Infinity, Infinity));\n // reset\n this._target0 = this._target.clone();\n this._position0 = this._camera.position.clone();\n this._zoom0 = this._zoom;\n this._focalOffset0 = this._focalOffset.clone();\n this._dollyControlAmount = 0;\n this._dollyControlCoord = new THREE.Vector2();\n // configs\n this.mouseButtons = {\n left: ACTION.ROTATE,\n middle: ACTION.DOLLY,\n right: ACTION.TRUCK,\n wheel: isPerspectiveCamera(this._camera) ? ACTION.DOLLY :\n isOrthographicCamera(this._camera) ? ACTION.ZOOM :\n ACTION.NONE,\n };\n this.touches = {\n one: ACTION.TOUCH_ROTATE,\n two: isPerspectiveCamera(this._camera) ? ACTION.TOUCH_DOLLY_TRUCK :\n isOrthographicCamera(this._camera) ? ACTION.TOUCH_ZOOM_TRUCK :\n ACTION.NONE,\n three: ACTION.TOUCH_TRUCK,\n };\n const dragStartPosition = new THREE.Vector2();\n const lastDragPosition = new THREE.Vector2();\n const dollyStart = new THREE.Vector2();\n const onPointerDown = (event) => {\n if (!this._enabled || !this._domElement)\n return;\n // Don't call `event.preventDefault()` on the pointerdown event\n // to keep receiving pointermove evens outside dragging iframe\n // https://taye.me/blog/tips/2015/11/16/mouse-drag-outside-iframe/\n const pointer = {\n pointerId: event.pointerId,\n clientX: event.clientX,\n clientY: event.clientY,\n deltaX: 0,\n deltaY: 0,\n };\n this._activePointers.push(pointer);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n this._domElement.ownerDocument.addEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.addEventListener('pointerup', onPointerUp);\n startDragging(event);\n };\n const onMouseDown = (event) => {\n if (!this._enabled || !this._domElement)\n return;\n const pointer = {\n pointerId: 0,\n clientX: event.clientX,\n clientY: event.clientY,\n deltaX: 0,\n deltaY: 0,\n };\n this._activePointers.push(pointer);\n // see https://github.com/microsoft/TypeScript/issues/32912#issuecomment-522142969\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('mousemove', onMouseMove);\n this._domElement.ownerDocument.removeEventListener('mouseup', onMouseUp);\n this._domElement.ownerDocument.addEventListener('mousemove', onMouseMove);\n this._domElement.ownerDocument.addEventListener('mouseup', onMouseUp);\n startDragging(event);\n };\n const onTouchStart = (event) => {\n if (!this._enabled || !this._domElement)\n return;\n event.preventDefault();\n Array.prototype.forEach.call(event.changedTouches, (touch) => {\n const pointer = {\n pointerId: touch.identifier,\n clientX: touch.clientX,\n clientY: touch.clientY,\n deltaX: 0,\n deltaY: 0,\n };\n this._activePointers.push(pointer);\n });\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('touchmove', onTouchMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('touchend', onTouchEnd);\n this._domElement.ownerDocument.addEventListener('touchmove', onTouchMove, { passive: false });\n this._domElement.ownerDocument.addEventListener('touchend', onTouchEnd);\n startDragging(event);\n };\n const onPointerMove = (event) => {\n if (event.cancelable)\n event.preventDefault();\n const pointerId = event.pointerId;\n const pointer = this._findPointerById(pointerId);\n if (!pointer)\n return;\n pointer.clientX = event.clientX;\n pointer.clientY = event.clientY;\n pointer.deltaX = event.movementX;\n pointer.deltaY = event.movementY;\n if (event.pointerType === 'touch') {\n switch (this._activePointers.length) {\n case 1:\n this._state = this.touches.one;\n break;\n case 2:\n this._state = this.touches.two;\n break;\n case 3:\n this._state = this.touches.three;\n break;\n }\n }\n else {\n this._state = 0;\n if ((event.buttons & MOUSE_BUTTON.LEFT) === MOUSE_BUTTON.LEFT) {\n this._state = this._state | this.mouseButtons.left;\n }\n if ((event.buttons & MOUSE_BUTTON.MIDDLE) === MOUSE_BUTTON.MIDDLE) {\n this._state = this._state | this.mouseButtons.middle;\n }\n if ((event.buttons & MOUSE_BUTTON.RIGHT) === MOUSE_BUTTON.RIGHT) {\n this._state = this._state | this.mouseButtons.right;\n }\n }\n dragging();\n };\n const onMouseMove = (event) => {\n const pointer = this._findPointerById(0);\n if (!pointer)\n return;\n pointer.clientX = event.clientX;\n pointer.clientY = event.clientY;\n pointer.deltaX = event.movementX;\n pointer.deltaY = event.movementY;\n this._state = 0;\n if ((event.buttons & MOUSE_BUTTON.LEFT) === MOUSE_BUTTON.LEFT) {\n this._state = this._state | this.mouseButtons.left;\n }\n if ((event.buttons & MOUSE_BUTTON.MIDDLE) === MOUSE_BUTTON.MIDDLE) {\n this._state = this._state | this.mouseButtons.middle;\n }\n if ((event.buttons & MOUSE_BUTTON.RIGHT) === MOUSE_BUTTON.RIGHT) {\n this._state = this._state | this.mouseButtons.right;\n }\n dragging();\n };\n const onTouchMove = (event) => {\n if (event.cancelable)\n event.preventDefault();\n Array.prototype.forEach.call(event.changedTouches, (touch) => {\n const pointerId = touch.identifier;\n const pointer = this._findPointerById(pointerId);\n if (!pointer)\n return;\n pointer.clientX = touch.clientX;\n pointer.clientY = touch.clientY;\n // touch event does not have movementX and movementY.\n });\n dragging();\n };\n const onPointerUp = (event) => {\n const pointerId = event.pointerId;\n const pointer = this._findPointerById(pointerId);\n pointer && this._activePointers.splice(this._activePointers.indexOf(pointer), 1);\n if (event.pointerType === 'touch') {\n switch (this._activePointers.length) {\n case 0:\n this._state = ACTION.NONE;\n break;\n case 1:\n this._state = this.touches.one;\n break;\n case 2:\n this._state = this.touches.two;\n break;\n case 3:\n this._state = this.touches.three;\n break;\n }\n }\n else {\n this._state = ACTION.NONE;\n }\n endDragging();\n };\n const onMouseUp = () => {\n const pointer = this._findPointerById(0);\n pointer && this._activePointers.splice(this._activePointers.indexOf(pointer), 1);\n this._state = ACTION.NONE;\n endDragging();\n };\n const onTouchEnd = (event) => {\n Array.prototype.forEach.call(event.changedTouches, (touch) => {\n const pointerId = touch.identifier;\n const pointer = this._findPointerById(pointerId);\n pointer && this._activePointers.splice(this._activePointers.indexOf(pointer), 1);\n });\n switch (this._activePointers.length) {\n case 0:\n this._state = ACTION.NONE;\n break;\n case 1:\n this._state = this.touches.one;\n break;\n case 2:\n this._state = this.touches.two;\n break;\n case 3:\n this._state = this.touches.three;\n break;\n }\n endDragging();\n };\n let lastScrollTimeStamp = -1;\n const onMouseWheel = (event) => {\n if (!this._enabled || this.mouseButtons.wheel === ACTION.NONE)\n return;\n event.preventDefault();\n if (this.dollyToCursor ||\n this.mouseButtons.wheel === ACTION.ROTATE ||\n this.mouseButtons.wheel === ACTION.TRUCK) {\n const now = performance.now();\n // only need to fire this at scroll start.\n if (lastScrollTimeStamp - now < 1000)\n this._getClientRect(this._elementRect);\n lastScrollTimeStamp = now;\n }\n // Ref: https://github.com/cedricpinson/osgjs/blob/00e5a7e9d9206c06fdde0436e1d62ab7cb5ce853/sources/osgViewer/input/source/InputSourceMouse.js#L89-L103\n const deltaYFactor = isMac ? -1 : -3;\n const delta = (event.deltaMode === 1) ? event.deltaY / deltaYFactor : event.deltaY / (deltaYFactor * 10);\n const x = this.dollyToCursor ? (event.clientX - this._elementRect.x) / this._elementRect.width * 2 - 1 : 0;\n const y = this.dollyToCursor ? (event.clientY - this._elementRect.y) / this._elementRect.height * -2 + 1 : 0;\n switch (this.mouseButtons.wheel) {\n case ACTION.ROTATE: {\n this._rotateInternal(event.deltaX, event.deltaY);\n break;\n }\n case ACTION.TRUCK: {\n this._truckInternal(event.deltaX, event.deltaY, false);\n break;\n }\n case ACTION.OFFSET: {\n this._truckInternal(event.deltaX, event.deltaY, true);\n break;\n }\n case ACTION.DOLLY: {\n this._dollyInternal(-delta, x, y);\n break;\n }\n case ACTION.ZOOM: {\n this._zoomInternal(-delta, x, y);\n break;\n }\n }\n this.dispatchEvent({ type: 'control' });\n };\n const onContextMenu = (event) => {\n if (!this._enabled)\n return;\n event.preventDefault();\n };\n const startDragging = (event) => {\n if (!this._enabled)\n return;\n extractClientCoordFromEvent(this._activePointers, _v2);\n this._getClientRect(this._elementRect);\n dragStartPosition.copy(_v2);\n lastDragPosition.copy(_v2);\n const isMultiTouch = this._activePointers.length >= 2;\n if (isMultiTouch) {\n // 2 finger pinch\n const dx = _v2.x - this._activePointers[1].clientX;\n const dy = _v2.y - this._activePointers[1].clientY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n dollyStart.set(0, distance);\n // center coords of 2 finger truck\n const x = (this._activePointers[0].clientX + this._activePointers[1].clientX) * 0.5;\n const y = (this._activePointers[0].clientY + this._activePointers[1].clientY) * 0.5;\n lastDragPosition.set(x, y);\n }\n if ('touches' in event ||\n 'pointerType' in event && event.pointerType === 'touch') {\n switch (this._activePointers.length) {\n case 1:\n this._state = this.touches.one;\n break;\n case 2:\n this._state = this.touches.two;\n break;\n case 3:\n this._state = this.touches.three;\n break;\n }\n }\n else {\n this._state = 0;\n if ((event.buttons & MOUSE_BUTTON.LEFT) === MOUSE_BUTTON.LEFT) {\n this._state = this._state | this.mouseButtons.left;\n }\n if ((event.buttons & MOUSE_BUTTON.MIDDLE) === MOUSE_BUTTON.MIDDLE) {\n this._state = this._state | this.mouseButtons.middle;\n }\n if ((event.buttons & MOUSE_BUTTON.RIGHT) === MOUSE_BUTTON.RIGHT) {\n this._state = this._state | this.mouseButtons.right;\n }\n }\n this.dispatchEvent({ type: 'controlstart' });\n };\n const dragging = () => {\n if (!this._enabled)\n return;\n extractClientCoordFromEvent(this._activePointers, _v2);\n // When pointer lock is enabled clientX, clientY, screenX, and screenY remain 0.\n // If pointer lock is enabled, use the Delta directory, and assume active-pointer is not multiple.\n const isPointerLockActive = this._domElement && document.pointerLockElement === this._domElement;\n const deltaX = isPointerLockActive ? -this._activePointers[0].deltaX : lastDragPosition.x - _v2.x;\n const deltaY = isPointerLockActive ? -this._activePointers[0].deltaY : lastDragPosition.y - _v2.y;\n lastDragPosition.copy(_v2);\n if ((this._state & ACTION.ROTATE) === ACTION.ROTATE ||\n (this._state & ACTION.TOUCH_ROTATE) === ACTION.TOUCH_ROTATE ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE ||\n (this._state & ACTION.TOUCH_ZOOM_ROTATE) === ACTION.TOUCH_ZOOM_ROTATE) {\n this._rotateInternal(deltaX, deltaY);\n }\n if ((this._state & ACTION.DOLLY) === ACTION.DOLLY ||\n (this._state & ACTION.ZOOM) === ACTION.ZOOM) {\n const dollyX = this.dollyToCursor ? (dragStartPosition.x - this._elementRect.x) / this._elementRect.width * 2 - 1 : 0;\n const dollyY = this.dollyToCursor ? (dragStartPosition.y - this._elementRect.y) / this._elementRect.height * -2 + 1 : 0;\n (this._state & ACTION.DOLLY) === ACTION.DOLLY ?\n this._dollyInternal(deltaY * TOUCH_DOLLY_FACTOR, dollyX, dollyY) :\n this._zoomInternal(deltaY * TOUCH_DOLLY_FACTOR, dollyX, dollyY);\n }\n if ((this._state & ACTION.TOUCH_DOLLY) === ACTION.TOUCH_DOLLY ||\n (this._state & ACTION.TOUCH_ZOOM) === ACTION.TOUCH_ZOOM ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_ZOOM_TRUCK) === ACTION.TOUCH_ZOOM_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET ||\n (this._state & ACTION.TOUCH_ZOOM_OFFSET) === ACTION.TOUCH_ZOOM_OFFSET ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE ||\n (this._state & ACTION.TOUCH_ZOOM_ROTATE) === ACTION.TOUCH_ZOOM_ROTATE) {\n const dx = _v2.x - this._activePointers[1].clientX;\n const dy = _v2.y - this._activePointers[1].clientY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const dollyDelta = dollyStart.y - distance;\n dollyStart.set(0, distance);\n const dollyX = this.dollyToCursor ? (lastDragPosition.x - this._elementRect.x) / this._elementRect.width * 2 - 1 : 0;\n const dollyY = this.dollyToCursor ? (lastDragPosition.y - this._elementRect.y) / this._elementRect.height * -2 + 1 : 0;\n (this._state & ACTION.TOUCH_DOLLY) === ACTION.TOUCH_DOLLY ||\n (this._state & ACTION.TOUCH_DOLLY_ROTATE) === ACTION.TOUCH_DOLLY_ROTATE ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET ?\n this._dollyInternal(dollyDelta * TOUCH_DOLLY_FACTOR, dollyX, dollyY) :\n this._zoomInternal(dollyDelta * TOUCH_DOLLY_FACTOR, dollyX, dollyY);\n }\n if ((this._state & ACTION.TRUCK) === ACTION.TRUCK ||\n (this._state & ACTION.TOUCH_TRUCK) === ACTION.TOUCH_TRUCK ||\n (this._state & ACTION.TOUCH_DOLLY_TRUCK) === ACTION.TOUCH_DOLLY_TRUCK ||\n (this._state & ACTION.TOUCH_ZOOM_TRUCK) === ACTION.TOUCH_ZOOM_TRUCK) {\n this._truckInternal(deltaX, deltaY, false);\n }\n if ((this._state & ACTION.OFFSET) === ACTION.OFFSET ||\n (this._state & ACTION.TOUCH_OFFSET) === ACTION.TOUCH_OFFSET ||\n (this._state & ACTION.TOUCH_DOLLY_OFFSET) === ACTION.TOUCH_DOLLY_OFFSET ||\n (this._state & ACTION.TOUCH_ZOOM_OFFSET) === ACTION.TOUCH_ZOOM_OFFSET) {\n this._truckInternal(deltaX, deltaY, true);\n }\n this.dispatchEvent({ type: 'control' });\n };\n const endDragging = () => {\n extractClientCoordFromEvent(this._activePointers, _v2);\n lastDragPosition.copy(_v2);\n if (this._activePointers.length === 0 && this._domElement) {\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('touchmove', onTouchMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('touchend', onTouchEnd);\n this.dispatchEvent({ type: 'controlend' });\n }\n };\n this._addAllEventListeners = (domElement) => {\n this._domElement = domElement;\n this._domElement.style.touchAction = 'none';\n this._domElement.style.userSelect = 'none';\n this._domElement.style.webkitUserSelect = 'none';\n this._domElement.addEventListener('pointerdown', onPointerDown);\n isPointerEventsNotSupported && this._domElement.addEventListener('mousedown', onMouseDown);\n isPointerEventsNotSupported && this._domElement.addEventListener('touchstart', onTouchStart);\n this._domElement.addEventListener('pointercancel', onPointerUp);\n this._domElement.addEventListener('wheel', onMouseWheel, { passive: false });\n this._domElement.addEventListener('contextmenu', onContextMenu);\n };\n this._removeAllEventListeners = () => {\n if (!this._domElement)\n return;\n this._domElement.removeEventListener('pointerdown', onPointerDown);\n this._domElement.removeEventListener('mousedown', onMouseDown);\n this._domElement.removeEventListener('touchstart', onTouchStart);\n this._domElement.removeEventListener('pointercancel', onPointerUp);\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener#matching_event_listeners_for_removal\n // > it's probably wise to use the same values used for the call to `addEventListener()` when calling `removeEventListener()`\n // see https://github.com/microsoft/TypeScript/issues/32912#issuecomment-522142969\n // eslint-disable-next-line no-undef\n this._domElement.removeEventListener('wheel', onMouseWheel, { passive: false });\n this._domElement.removeEventListener('contextmenu', onContextMenu);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('pointermove', onPointerMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('mousemove', onMouseMove);\n // eslint-disable-next-line no-undef\n this._domElement.ownerDocument.removeEventListener('touchmove', onTouchMove, { passive: false });\n this._domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n this._domElement.ownerDocument.removeEventListener('mouseup', onMouseUp);\n this._domElement.ownerDocument.removeEventListener('touchend', onTouchEnd);\n };\n this.cancel = () => {\n if (this._state === ACTION.NONE)\n return;\n this._state = ACTION.NONE;\n this._activePointers.length = 0;\n endDragging();\n };\n if (domElement)\n this.connect(domElement);\n this.update(0);\n }\n /**\n * The camera to be controlled\n * @category Properties\n */\n get camera() {\n return this._camera;\n }\n set camera(camera) {\n this._camera = camera;\n this.updateCameraUp();\n this._camera.updateProjectionMatrix();\n this._updateNearPlaneCorners();\n this._needsUpdate = true;\n }\n /**\n * Whether or not the controls are enabled.\n * `false` to disable user dragging/touch-move, but all methods works.\n * @category Properties\n */\n get enabled() {\n return this._enabled;\n }\n set enabled(enabled) {\n if (!this._domElement)\n return;\n this._enabled = enabled;\n if (enabled) {\n this._domElement.style.touchAction = 'none';\n this._domElement.style.userSelect = 'none';\n this._domElement.style.webkitUserSelect = 'none';\n }\n else {\n this.cancel();\n this._domElement.style.touchAction = '';\n this._domElement.style.userSelect = '';\n this._domElement.style.webkitUserSelect = '';\n }\n }\n /**\n * Returns `true` if the controls are active updating.\n * readonly value.\n * @category Properties\n */\n get active() {\n return !this._hasRested;\n }\n /**\n * Getter for the current `ACTION`.\n * readonly value.\n * @category Properties\n */\n get currentAction() {\n return this._state;\n }\n /**\n * get/set Current distance.\n * @category Properties\n */\n get distance() {\n return this._spherical.radius;\n }\n set distance(distance) {\n if (this._spherical.radius === distance &&\n this._sphericalEnd.radius === distance)\n return;\n this._spherical.radius = distance;\n this._sphericalEnd.radius = distance;\n this._needsUpdate = true;\n }\n // horizontal angle\n /**\n * get/set the azimuth angle (horizontal) in radians.\n * Every 360 degrees turn is added to `.azimuthAngle` value, which is accumulative.\n * @category Properties\n */\n get azimuthAngle() {\n return this._spherical.theta;\n }\n set azimuthAngle(azimuthAngle) {\n if (this._spherical.theta === azimuthAngle &&\n this._sphericalEnd.theta === azimuthAngle)\n return;\n this._spherical.theta = azimuthAngle;\n this._sphericalEnd.theta = azimuthAngle;\n this._needsUpdate = true;\n }\n // vertical angle\n /**\n * get/set the polar angle (vertical) in radians.\n * @category Properties\n */\n get polarAngle() {\n return this._spherical.phi;\n }\n set polarAngle(polarAngle) {\n if (this._spherical.phi === polarAngle &&\n this._sphericalEnd.phi === polarAngle)\n return;\n this._spherical.phi = polarAngle;\n this._sphericalEnd.phi = polarAngle;\n this._needsUpdate = true;\n }\n /**\n * Whether camera position should be enclosed in the boundary or not.\n * @category Properties\n */\n get boundaryEnclosesCamera() {\n return this._boundaryEnclosesCamera;\n }\n set boundaryEnclosesCamera(boundaryEnclosesCamera) {\n this._boundaryEnclosesCamera = boundaryEnclosesCamera;\n this._needsUpdate = true;\n }\n /**\n * Adds the specified event listener.\n * Applicable event types (which is `K`) are:\n * | Event name | Timing |\n * | ------------------- | ------ |\n * | `'controlstart'` | When the user starts to control the camera via mouse / touches. ¹ |\n * | `'control'` | When the user controls the camera (dragging). |\n * | `'controlend'` | When the user ends to control the camera. ¹ |\n * | `'transitionstart'` | When any kind of transition starts, either user control or using a method with `enableTransition = true` |\n * | `'update'` | When the camera position is updated. |\n * | `'wake'` | When the camera starts moving. |\n * | `'rest'` | When the camera movement is below `.restThreshold` ². |\n * | `'sleep'` | When the camera end moving. |\n *\n * 1. `mouseButtons.wheel` (Mouse wheel control) does not emit `'controlstart'` and `'controlend'`. `mouseButtons.wheel` uses scroll-event internally, and scroll-event happens intermittently. That means \"start\" and \"end\" cannot be detected.\n * 2. Due to damping, `sleep` will usually fire a few seconds after the camera _appears_ to have stopped moving. If you want to do something (e.g. enable UI, perform another transition) at the point when the camera has stopped, you probably want the `rest` event. This can be fine tuned using the `.restThreshold` parameter. See the [Rest and Sleep Example](https://yomotsu.github.io/camera-controls/examples/rest-and-sleep.html).\n *\n * e.g.\n * ```\n * cameraControl.addEventListener( 'controlstart', myCallbackFunction );\n * ```\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n addEventListener(type, listener) {\n super.addEventListener(type, listener);\n }\n /**\n * Removes the specified event listener\n * e.g.\n * ```\n * cameraControl.addEventListener( 'controlstart', myCallbackFunction );\n * ```\n * @param type event name\n * @param listener handler function\n * @category Methods\n */\n removeEventListener(type, listener) {\n super.removeEventListener(type, listener);\n }\n /**\n * Rotate azimuthal angle(horizontal) and polar angle(vertical).\n * Every value is added to the current value.\n * @param azimuthAngle Azimuth rotate angle. In radian.\n * @param polarAngle Polar rotate angle. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotate(azimuthAngle, polarAngle, enableTransition = false) {\n return this.rotateTo(this._sphericalEnd.theta + azimuthAngle, this._sphericalEnd.phi + polarAngle, enableTransition);\n }\n /**\n * Rotate azimuthal angle(horizontal) to the given angle and keep the same polar angle(vertical) target.\n *\n * e.g.\n * ```\n * cameraControls.rotateAzimuthTo( 30 * THREE.MathUtils.DEG2RAD, true );\n * ```\n * @param azimuthAngle Azimuth rotate angle. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotateAzimuthTo(azimuthAngle, enableTransition = false) {\n return this.rotateTo(azimuthAngle, this._sphericalEnd.phi, enableTransition);\n }\n /**\n * Rotate polar angle(vertical) to the given angle and keep the same azimuthal angle(horizontal) target.\n *\n * e.g.\n * ```\n * cameraControls.rotatePolarTo( 30 * THREE.MathUtils.DEG2RAD, true );\n * ```\n * @param polarAngle Polar rotate angle. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotatePolarTo(polarAngle, enableTransition = false) {\n return this.rotateTo(this._sphericalEnd.theta, polarAngle, enableTransition);\n }\n /**\n * Rotate azimuthal angle(horizontal) and polar angle(vertical) to the given angle.\n * Camera view will rotate over the orbit pivot absolutely:\n *\n * azimuthAngle\n * ```\n * 0º\n * \\\n * 90º -----+----- -90º\n * \\\n * 180º\n * ```\n * | direction | angle |\n * | --------- | ---------------------- |\n * | front | 0º |\n * | left | 90º (`Math.PI / 2`) |\n * | right | -90º (`- Math.PI / 2`) |\n * | back | 180º (`Math.PI`) |\n *\n * polarAngle\n * ```\n * 180º\n * |\n * 90º\n * |\n * 0º\n * ```\n * | direction | angle |\n * | -------------------- | ---------------------- |\n * | top/sky | 180º (`Math.PI`) |\n * | horizontal from view | 90º (`Math.PI / 2`) |\n * | bottom/floor | 0º |\n *\n * @param azimuthAngle Azimuth rotate angle to. In radian.\n * @param polarAngle Polar rotate angle to. In radian.\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n rotateTo(azimuthAngle, polarAngle, enableTransition = false) {\n const theta = THREE.MathUtils.clamp(azimuthAngle, this.minAzimuthAngle, this.maxAzimuthAngle);\n const phi = THREE.MathUtils.clamp(polarAngle, this.minPolarAngle, this.maxPolarAngle);\n this._sphericalEnd.theta = theta;\n this._sphericalEnd.phi = phi;\n this._sphericalEnd.makeSafe();\n this._needsUpdate = true;\n if (!enableTransition) {\n this._spherical.theta = this._sphericalEnd.theta;\n this._spherical.phi = this._sphericalEnd.phi;\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._spherical.theta, this._sphericalEnd.theta, this.restThreshold) &&\n approxEquals(this._spherical.phi, this._sphericalEnd.phi, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Dolly in/out camera position.\n * @param distance Distance of dollyIn. Negative number for dollyOut.\n * @param enableTransition Whether to move smoothly or immediately.\n * @category Methods\n */\n dolly(distance, enableTransition = false) {\n return this.dollyTo(this._sphericalEnd.radius - distance, enableTransition);\n }\n /**\n * Dolly in/out camera position to given distance.\n * @param distance Distance of dolly.\n * @param enableTransition Whether to move smoothly or immediately.\n * @category Methods\n */\n dollyTo(distance, enableTransition = false) {\n const lastRadius = this._sphericalEnd.radius;\n const newRadius = THREE.MathUtils.clamp(distance, this.minDistance, this.maxDistance);\n const hasCollider = this.colliderMeshes.length >= 1;\n if (hasCollider) {\n const maxDistanceByCollisionTest = this._collisionTest();\n const isCollided = approxEquals(maxDistanceByCollisionTest, this._spherical.radius);\n const isDollyIn = lastRadius > newRadius;\n if (!isDollyIn && isCollided)\n return Promise.resolve();\n this._sphericalEnd.radius = Math.min(newRadius, maxDistanceByCollisionTest);\n }\n else {\n this._sphericalEnd.radius = newRadius;\n }\n this._needsUpdate = true;\n if (!enableTransition) {\n this._spherical.radius = this._sphericalEnd.radius;\n }\n const resolveImmediately = !enableTransition || approxEquals(this._spherical.radius, this._sphericalEnd.radius, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Zoom in/out camera. The value is added to camera zoom.\n * Limits set with `.minZoom` and `.maxZoom`\n * @param zoomStep zoom scale\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n zoom(zoomStep, enableTransition = false) {\n return this.zoomTo(this._zoomEnd + zoomStep, enableTransition);\n }\n /**\n * Zoom in/out camera to given scale. The value overwrites camera zoom.\n * Limits set with .minZoom and .maxZoom\n * @param zoom\n * @param enableTransition\n * @category Methods\n */\n zoomTo(zoom, enableTransition = false) {\n this._zoomEnd = THREE.MathUtils.clamp(zoom, this.minZoom, this.maxZoom);\n this._needsUpdate = true;\n if (!enableTransition) {\n this._zoom = this._zoomEnd;\n }\n const resolveImmediately = !enableTransition || approxEquals(this._zoom, this._zoomEnd, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * @deprecated `pan()` has been renamed to `truck()`\n * @category Methods\n */\n pan(x, y, enableTransition = false) {\n console.warn('`pan` has been renamed to `truck`');\n return this.truck(x, y, enableTransition);\n }\n /**\n * Truck and pedestal camera using current azimuthal angle\n * @param x Horizontal translate amount\n * @param y Vertical translate amount\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n truck(x, y, enableTransition = false) {\n this._camera.updateMatrix();\n _xColumn.setFromMatrixColumn(this._camera.matrix, 0);\n _yColumn.setFromMatrixColumn(this._camera.matrix, 1);\n _xColumn.multiplyScalar(x);\n _yColumn.multiplyScalar(-y);\n const offset = _v3A.copy(_xColumn).add(_yColumn);\n const to = _v3B.copy(this._targetEnd).add(offset);\n return this.moveTo(to.x, to.y, to.z, enableTransition);\n }\n /**\n * Move forward / backward.\n * @param distance Amount to move forward / backward. Negative value to move backward\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n forward(distance, enableTransition = false) {\n _v3A.setFromMatrixColumn(this._camera.matrix, 0);\n _v3A.crossVectors(this._camera.up, _v3A);\n _v3A.multiplyScalar(distance);\n const to = _v3B.copy(this._targetEnd).add(_v3A);\n return this.moveTo(to.x, to.y, to.z, enableTransition);\n }\n /**\n * Move target position to given point.\n * @param x x coord to move center position\n * @param y y coord to move center position\n * @param z z coord to move center position\n * @param enableTransition Whether to move smoothly or immediately\n * @category Methods\n */\n moveTo(x, y, z, enableTransition = false) {\n const offset = _v3A.set(x, y, z).sub(this._targetEnd);\n this._encloseToBoundary(this._targetEnd, offset, this.boundaryFriction);\n this._needsUpdate = true;\n if (!enableTransition) {\n this._target.copy(this._targetEnd);\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._target.x, this._targetEnd.x, this.restThreshold) &&\n approxEquals(this._target.y, this._targetEnd.y, this.restThreshold) &&\n approxEquals(this._target.z, this._targetEnd.z, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Fit the viewport to the box or the bounding box of the object, using the nearest axis. paddings are in unit.\n * set `cover: true` to fill enter screen.\n * e.g.\n * ```\n * cameraControls.fitToBox( myMesh );\n * ```\n * @param box3OrObject Axis aligned bounding box to fit the view.\n * @param enableTransition Whether to move smoothly or immediately.\n * @param options | `` { cover: boolean, paddingTop: number, paddingLeft: number, paddingBottom: number, paddingRight: number }\n * @returns Transition end promise\n * @category Methods\n */\n fitToBox(box3OrObject, enableTransition, { cover = false, paddingLeft = 0, paddingRight = 0, paddingBottom = 0, paddingTop = 0 } = {}) {\n const promises = [];\n const aabb = box3OrObject.isBox3\n ? _box3A.copy(box3OrObject)\n : _box3A.setFromObject(box3OrObject);\n if (aabb.isEmpty()) {\n console.warn('camera-controls: fitTo() cannot be used with an empty box. Aborting');\n Promise.resolve();\n }\n // round to closest axis ( forward | backward | right | left | top | bottom )\n const theta = roundToStep(this._sphericalEnd.theta, PI_HALF);\n const phi = roundToStep(this._sphericalEnd.phi, PI_HALF);\n promises.push(this.rotateTo(theta, phi, enableTransition));\n const normal = _v3A.setFromSpherical(this._sphericalEnd).normalize();\n const rotation = _quaternionA.setFromUnitVectors(normal, _AXIS_Z);\n const viewFromPolar = approxEquals(Math.abs(normal.y), 1);\n if (viewFromPolar) {\n rotation.multiply(_quaternionB.setFromAxisAngle(_AXIS_Y, theta));\n }\n rotation.multiply(this._yAxisUpSpaceInverse);\n // make oriented bounding box\n const bb = _box3B.makeEmpty();\n // left bottom back corner\n _v3B.copy(aabb.min).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right bottom back corner\n _v3B.copy(aabb.min).setX(aabb.max.x).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // left top back corner\n _v3B.copy(aabb.min).setY(aabb.max.y).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right top back corner\n _v3B.copy(aabb.max).setZ(aabb.min.z).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // left bottom front corner\n _v3B.copy(aabb.min).setZ(aabb.max.z).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right bottom front corner\n _v3B.copy(aabb.max).setY(aabb.min.y).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // left top front corner\n _v3B.copy(aabb.max).setX(aabb.min.x).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // right top front corner\n _v3B.copy(aabb.max).applyQuaternion(rotation);\n bb.expandByPoint(_v3B);\n // add padding\n bb.min.x -= paddingLeft;\n bb.min.y -= paddingBottom;\n bb.max.x += paddingRight;\n bb.max.y += paddingTop;\n rotation.setFromUnitVectors(_AXIS_Z, normal);\n if (viewFromPolar) {\n rotation.premultiply(_quaternionB.invert());\n }\n rotation.premultiply(this._yAxisUpSpace);\n const bbSize = bb.getSize(_v3A);\n const center = bb.getCenter(_v3B).applyQuaternion(rotation);\n if (isPerspectiveCamera(this._camera)) {\n const distance = this.getDistanceToFitBox(bbSize.x, bbSize.y, bbSize.z, cover);\n promises.push(this.moveTo(center.x, center.y, center.z, enableTransition));\n promises.push(this.dollyTo(distance, enableTransition));\n promises.push(this.setFocalOffset(0, 0, 0, enableTransition));\n }\n else if (isOrthographicCamera(this._camera)) {\n const camera = this._camera;\n const width = camera.right - camera.left;\n const height = camera.top - camera.bottom;\n const zoom = cover ? Math.max(width / bbSize.x, height / bbSize.y) : Math.min(width / bbSize.x, height / bbSize.y);\n promises.push(this.moveTo(center.x, center.y, center.z, enableTransition));\n promises.push(this.zoomTo(zoom, enableTransition));\n promises.push(this.setFocalOffset(0, 0, 0, enableTransition));\n }\n return Promise.all(promises);\n }\n /**\n * Fit the viewport to the sphere or the bounding sphere of the object.\n * @param sphereOrMesh\n * @param enableTransition\n * @category Methods\n */\n fitToSphere(sphereOrMesh, enableTransition) {\n const promises = [];\n const isSphere = sphereOrMesh instanceof THREE.Sphere;\n const boundingSphere = isSphere ?\n _sphere.copy(sphereOrMesh) :\n createBoundingSphere(sphereOrMesh, _sphere);\n promises.push(this.moveTo(boundingSphere.center.x, boundingSphere.center.y, boundingSphere.center.z, enableTransition));\n if (isPerspectiveCamera(this._camera)) {\n const distanceToFit = this.getDistanceToFitSphere(boundingSphere.radius);\n promises.push(this.dollyTo(distanceToFit, enableTransition));\n }\n else if (isOrthographicCamera(this._camera)) {\n const width = this._camera.right - this._camera.left;\n const height = this._camera.top - this._camera.bottom;\n const diameter = 2 * boundingSphere.radius;\n const zoom = Math.min(width / diameter, height / diameter);\n promises.push(this.zoomTo(zoom, enableTransition));\n }\n promises.push(this.setFocalOffset(0, 0, 0, enableTransition));\n return Promise.all(promises);\n }\n /**\n * Make an orbit with given points.\n * @param positionX\n * @param positionY\n * @param positionZ\n * @param targetX\n * @param targetY\n * @param targetZ\n * @param enableTransition\n * @category Methods\n */\n setLookAt(positionX, positionY, positionZ, targetX, targetY, targetZ, enableTransition = false) {\n const target = _v3B.set(targetX, targetY, targetZ);\n const position = _v3A.set(positionX, positionY, positionZ);\n this._targetEnd.copy(target);\n this._sphericalEnd.setFromVector3(position.sub(target).applyQuaternion(this._yAxisUpSpace));\n this.normalizeRotations();\n this._needsUpdate = true;\n if (!enableTransition) {\n this._target.copy(this._targetEnd);\n this._spherical.copy(this._sphericalEnd);\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._target.x, this._targetEnd.x, this.restThreshold) &&\n approxEquals(this._target.y, this._targetEnd.y, this.restThreshold) &&\n approxEquals(this._target.z, this._targetEnd.z, this.restThreshold) &&\n approxEquals(this._spherical.theta, this._sphericalEnd.theta, this.restThreshold) &&\n approxEquals(this._spherical.phi, this._sphericalEnd.phi, this.restThreshold) &&\n approxEquals(this._spherical.radius, this._sphericalEnd.radius, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Similar to setLookAt, but it interpolates between two states.\n * @param positionAX\n * @param positionAY\n * @param positionAZ\n * @param targetAX\n * @param targetAY\n * @param targetAZ\n * @param positionBX\n * @param positionBY\n * @param positionBZ\n * @param targetBX\n * @param targetBY\n * @param targetBZ\n * @param t\n * @param enableTransition\n * @category Methods\n */\n lerpLookAt(positionAX, positionAY, positionAZ, targetAX, targetAY, targetAZ, positionBX, positionBY, positionBZ, targetBX, targetBY, targetBZ, t, enableTransition = false) {\n const targetA = _v3A.set(targetAX, targetAY, targetAZ);\n const positionA = _v3B.set(positionAX, positionAY, positionAZ);\n _sphericalA.setFromVector3(positionA.sub(targetA).applyQuaternion(this._yAxisUpSpace));\n const targetB = _v3C.set(targetBX, targetBY, targetBZ);\n const positionB = _v3B.set(positionBX, positionBY, positionBZ);\n _sphericalB.setFromVector3(positionB.sub(targetB).applyQuaternion(this._yAxisUpSpace));\n this._targetEnd.copy(targetA.lerp(targetB, t)); // tricky\n const deltaTheta = _sphericalB.theta - _sphericalA.theta;\n const deltaPhi = _sphericalB.phi - _sphericalA.phi;\n const deltaRadius = _sphericalB.radius - _sphericalA.radius;\n this._sphericalEnd.set(_sphericalA.radius + deltaRadius * t, _sphericalA.phi + deltaPhi * t, _sphericalA.theta + deltaTheta * t);\n this.normalizeRotations();\n this._needsUpdate = true;\n if (!enableTransition) {\n this._target.copy(this._targetEnd);\n this._spherical.copy(this._sphericalEnd);\n }\n const resolveImmediately = !enableTransition ||\n approxEquals(this._target.x, this._targetEnd.x, this.restThreshold) &&\n approxEquals(this._target.y, this._targetEnd.y, this.restThreshold) &&\n approxEquals(this._target.z, this._targetEnd.z, this.restThreshold) &&\n approxEquals(this._spherical.theta, this._sphericalEnd.theta, this.restThreshold) &&\n approxEquals(this._spherical.phi, this._sphericalEnd.phi, this.restThreshold) &&\n approxEquals(this._spherical.radius, this._sphericalEnd.radius, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * setLookAt without target, keep gazing at the current target\n * @param positionX\n * @param positionY\n * @param positionZ\n * @param enableTransition\n * @category Methods\n */\n setPosition(positionX, positionY, positionZ, enableTransition = false) {\n return this.setLookAt(positionX, positionY, positionZ, this._targetEnd.x, this._targetEnd.y, this._targetEnd.z, enableTransition);\n }\n /**\n * setLookAt without position, Stay still at the position.\n * @param targetX\n * @param targetY\n * @param targetZ\n * @param enableTransition\n * @category Methods\n */\n setTarget(targetX, targetY, targetZ, enableTransition = false) {\n const pos = this.getPosition(_v3A);\n const promise = this.setLookAt(pos.x, pos.y, pos.z, targetX, targetY, targetZ, enableTransition);\n // see https://github.com/yomotsu/camera-controls/issues/335\n this._sphericalEnd.phi = THREE.MathUtils.clamp(this.polarAngle, this.minPolarAngle, this.maxPolarAngle);\n return promise;\n }\n /**\n * Set focal offset using the screen parallel coordinates. z doesn't affect in Orthographic as with Dolly.\n * @param x\n * @param y\n * @param z\n * @param enableTransition\n * @category Methods\n */\n setFocalOffset(x, y, z, enableTransition = false) {\n this._focalOffsetEnd.set(x, y, z);\n this._needsUpdate = true;\n if (!enableTransition) {\n this._focalOffset.copy(this._focalOffsetEnd);\n }\n this._affectOffset =\n !approxZero(x) ||\n !approxZero(y) ||\n !approxZero(z);\n const resolveImmediately = !enableTransition ||\n approxEquals(this._focalOffset.x, this._focalOffsetEnd.x, this.restThreshold) &&\n approxEquals(this._focalOffset.y, this._focalOffsetEnd.y, this.restThreshold) &&\n approxEquals(this._focalOffset.z, this._focalOffsetEnd.z, this.restThreshold);\n return this._createOnRestPromise(resolveImmediately);\n }\n /**\n * Set orbit point without moving the camera.\n * SHOULD NOT RUN DURING ANIMATIONS. `setOrbitPoint()` will immediately fix the positions.\n * @param targetX\n * @param targetY\n * @param targetZ\n * @category Methods\n */\n setOrbitPoint(targetX, targetY, targetZ) {\n this._camera.updateMatrixWorld();\n _xColumn.setFromMatrixColumn(this._camera.matrixWorldInverse, 0);\n _yColumn.setFromMatrixColumn(this._camera.matrixWorldInverse, 1);\n _zColumn.setFromMatrixColumn(this._camera.matrixWorldInverse, 2);\n const position = _v3A.set(targetX, targetY, targetZ);\n const distance = position.distanceTo(this._camera.position);\n const cameraToPoint = position.sub(this._camera.position);\n _xColumn.multiplyScalar(cameraToPoint.x);\n _yColumn.multiplyScalar(cameraToPoint.y);\n _zColumn.multiplyScalar(cameraToPoint.z);\n _v3A.copy(_xColumn).add(_yColumn).add(_zColumn);\n _v3A.z = _v3A.z + distance;\n this.dollyTo(distance, false);\n this.setFocalOffset(-_v3A.x, _v3A.y, -_v3A.z, false);\n this.moveTo(targetX, targetY, targetZ, false);\n }\n /**\n * Set the boundary box that encloses the target of the camera. box3 is in THREE.Box3\n * @param box3\n * @category Methods\n */\n setBoundary(box3) {\n if (!box3) {\n this._boundary.min.set(-Infinity, -Infinity, -Infinity);\n this._boundary.max.set(Infinity, Infinity, Infinity);\n this._needsUpdate = true;\n return;\n }\n this._boundary.copy(box3);\n this._boundary.clampPoint(this._targetEnd, this._targetEnd);\n this._needsUpdate = true;\n }\n /**\n * Set (or unset) the current viewport.\n * Set this when you want to use renderer viewport and .dollyToCursor feature at the same time.\n * @param viewportOrX\n * @param y\n * @param width\n * @param height\n * @category Methods\n */\n setViewport(viewportOrX, y, width, height) {\n if (viewportOrX === null) { // null\n this._viewport = null;\n return;\n }\n this._viewport = this._viewport || new THREE.Vector4();\n if (typeof viewportOrX === 'number') { // number\n this._viewport.set(viewportOrX, y, width, height);\n }\n else { // Vector4\n this._viewport.copy(viewportOrX);\n }\n }\n /**\n * Calculate the distance to fit the box.\n * @param width box width\n * @param height box height\n * @param depth box depth\n * @returns distance\n * @category Methods\n */\n getDistanceToFitBox(width, height, depth, cover = false) {\n if (notSupportedInOrthographicCamera(this._camera, 'getDistanceToFitBox'))\n return this._spherical.radius;\n const boundingRectAspect = width / height;\n const fov = this._camera.getEffectiveFOV() * THREE.MathUtils.DEG2RAD;\n const aspect = this._camera.aspect;\n const heightToFit = (cover ? boundingRectAspect > aspect : boundingRectAspect < aspect) ? height : width / aspect;\n return heightToFit * 0.5 / Math.tan(fov * 0.5) + depth * 0.5;\n }\n /**\n * Calculate the distance to fit the sphere.\n * @param radius sphere radius\n * @returns distance\n * @category Methods\n */\n getDistanceToFitSphere(radius) {\n if (notSupportedInOrthographicCamera(this._camera, 'getDistanceToFitSphere'))\n return this._spherical.radius;\n // https://stackoverflow.com/a/44849975\n const vFOV = this._camera.getEffectiveFOV() * THREE.MathUtils.DEG2RAD;\n const hFOV = Math.atan(Math.tan(vFOV * 0.5) * this._camera.aspect) * 2;\n const fov = 1 < this._camera.aspect ? vFOV : hFOV;\n return radius / (Math.sin(fov * 0.5));\n }\n /**\n * Returns its current gazing target, which is the center position of the orbit.\n * @param out current gazing target\n * @category Methods\n */\n getTarget(out) {\n const _out = !!out && out.isVector3 ? out : new THREE.Vector3();\n return _out.copy(this._targetEnd);\n }\n /**\n * Returns its current position.\n * @param out current position\n * @category Methods\n */\n getPosition(out) {\n const _out = !!out && out.isVector3 ? out : new THREE.Vector3();\n return _out.setFromSpherical(this._sphericalEnd).applyQuaternion(this._yAxisUpSpaceInverse).add(this._targetEnd);\n }\n /**\n * Returns its current focal offset, which is how much the camera appears to be translated in screen parallel coordinates.\n * @param out current focal offset\n * @category Methods\n */\n getFocalOffset(out) {\n const _out = !!out && out.isVector3 ? out : new THREE.Vector3();\n return _out.copy(this._focalOffsetEnd);\n }\n /**\n * Normalize camera azimuth angle rotation between 0 and 360 degrees.\n * @category Methods\n */\n normalizeRotations() {\n this._sphericalEnd.theta = this._sphericalEnd.theta % PI_2;\n if (this._sphericalEnd.theta < 0)\n this._sphericalEnd.theta += PI_2;\n this._spherical.theta += PI_2 * Math.round((this._sphericalEnd.theta - this._spherical.theta) / PI_2);\n }\n /**\n * Reset all rotation and position to defaults.\n * @param enableTransition\n * @category Methods\n */\n reset(enableTransition = false) {\n const promises = [\n this.setLookAt(this._position0.x, this._position0.y, this._position0.z, this._target0.x, this._target0.y, this._target0.z, enableTransition),\n this.setFocalOffset(this._focalOffset0.x, this._focalOffset0.y, this._focalOffset0.z, enableTransition),\n this.zoomTo(this._zoom0, enableTransition),\n ];\n return Promise.all(promises);\n }\n /**\n * Set current camera position as the default position.\n * @category Methods\n */\n saveState() {\n this.getTarget(this._target0);\n this.getPosition(this._position0);\n this._zoom0 = this._zoom;\n this._focalOffset0.copy(this._focalOffset);\n }\n /**\n * Sync camera-up direction.\n * When camera-up vector is changed, `.updateCameraUp()` must be called.\n * @category Methods\n */\n updateCameraUp() {\n this._yAxisUpSpace.setFromUnitVectors(this._camera.up, _AXIS_Y);\n quatInvertCompat(this._yAxisUpSpaceInverse.copy(this._yAxisUpSpace));\n }\n /**\n * Update camera position and directions.\n * This should be called in your tick loop every time, and returns true if re-rendering is needed.\n * @param delta\n * @returns updated\n * @category Methods\n */\n update(delta) {\n const dampingFactor = this._state === ACTION.NONE ? this.dampingFactor : this.draggingDampingFactor;\n // The original THREE.OrbitControls assume 60 FPS fixed and does NOT rely on delta time.\n // (that must be a problem of the original one though)\n // To to emulate the speed of the original one under 60 FPS, multiply `60` to delta,\n // but ours are more flexible to any FPS unlike the original.\n const lerpRatio = Math.min(dampingFactor * delta * 60, 1);\n const deltaTheta = this._sphericalEnd.theta - this._spherical.theta;\n const deltaPhi = this._sphericalEnd.phi - this._spherical.phi;\n const deltaRadius = this._sphericalEnd.radius - this._spherical.radius;\n const deltaTarget = _deltaTarget.subVectors(this._targetEnd, this._target);\n const deltaOffset = _deltaOffset.subVectors(this._focalOffsetEnd, this._focalOffset);\n if (!approxZero(deltaTheta) ||\n !approxZero(deltaPhi) ||\n !approxZero(deltaRadius) ||\n !approxZero(deltaTarget.x) ||\n !approxZero(deltaTarget.y) ||\n !approxZero(deltaTarget.z) ||\n !approxZero(deltaOffset.x) ||\n !approxZero(deltaOffset.y) ||\n !approxZero(deltaOffset.z)) {\n this._spherical.set(this._spherical.radius + deltaRadius * lerpRatio, this._spherical.phi + deltaPhi * lerpRatio, this._spherical.theta + deltaTheta * lerpRatio);\n this._target.add(deltaTarget.multiplyScalar(lerpRatio));\n this._focalOffset.add(deltaOffset.multiplyScalar(lerpRatio));\n this._needsUpdate = true;\n }\n else {\n this._spherical.copy(this._sphericalEnd);\n this._target.copy(this._targetEnd);\n this._focalOffset.copy(this._focalOffsetEnd);\n }\n if (this._dollyControlAmount !== 0) {\n if (isPerspectiveCamera(this._camera)) {\n const camera = this._camera;\n const cameraDirection = _v3A.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).normalize().negate();\n const planeX = _v3B.copy(cameraDirection).cross(camera.up).normalize();\n if (planeX.lengthSq() === 0)\n planeX.x = 1.0;\n const planeY = _v3C.crossVectors(planeX, cameraDirection);\n const worldToScreen = this._sphericalEnd.radius * Math.tan(camera.getEffectiveFOV() * THREE.MathUtils.DEG2RAD * 0.5);\n const prevRadius = this._sphericalEnd.radius - this._dollyControlAmount;\n const lerpRatio = (prevRadius - this._sphericalEnd.radius) / this._sphericalEnd.radius;\n const cursor = _v3A.copy(this._targetEnd)\n .add(planeX.multiplyScalar(this._dollyControlCoord.x * worldToScreen * camera.aspect))\n .add(planeY.multiplyScalar(this._dollyControlCoord.y * worldToScreen));\n this._targetEnd.lerp(cursor, lerpRatio);\n }\n else if (isOrthographicCamera(this._camera)) {\n const camera = this._camera;\n const worldCursorPosition = _v3A.set(this._dollyControlCoord.x, this._dollyControlCoord.y, (camera.near + camera.far) / (camera.near - camera.far)).unproject(camera); //.sub( _v3B.set( this._focalOffset.x, this._focalOffset.y, 0 ) );\n const quaternion = _v3B.set(0, 0, -1).applyQuaternion(camera.quaternion);\n const cursor = _v3C.copy(worldCursorPosition).add(quaternion.multiplyScalar(-worldCursorPosition.dot(camera.up)));\n const prevZoom = this._zoom - this._dollyControlAmount;\n const lerpRatio = -(prevZoom - this._zoomEnd) / this._zoom;\n // find the \"distance\" (aka plane constant in three.js) of Plane\n // from a given position (this._targetEnd) and normal vector (cameraDirection)\n // https://www.maplesoft.com/support/help/maple/view.aspx?path=MathApps%2FEquationOfAPlaneNormal#bkmrk0\n const cameraDirection = _v3A.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).normalize().negate();\n const prevPlaneConstant = this._targetEnd.dot(cameraDirection);\n this._targetEnd.lerp(cursor, lerpRatio);\n const newPlaneConstant = this._targetEnd.dot(cameraDirection);\n // Pull back the camera depth that has moved, to be the camera stationary as zoom\n const pullBack = cameraDirection.multiplyScalar(newPlaneConstant - prevPlaneConstant);\n this._targetEnd.sub(pullBack);\n }\n this._target.copy(this._targetEnd);\n // target position may be moved beyond boundary.\n this._boundary.clampPoint(this._targetEnd, this._targetEnd);\n this._dollyControlAmount = 0;\n }\n // zoom\n const deltaZoom = this._zoomEnd - this._zoom;\n this._zoom += deltaZoom * lerpRatio;\n if (this._camera.zoom !== this._zoom) {\n if (approxZero(deltaZoom))\n this._zoom = this._zoomEnd;\n this._camera.zoom = this._zoom;\n this._camera.updateProjectionMatrix();\n this._updateNearPlaneCorners();\n this._needsUpdate = true;\n }\n // collision detection\n const maxDistance = this._collisionTest();\n this._spherical.radius = Math.min(this._spherical.radius, maxDistance);\n // decompose spherical to the camera position\n this._spherical.makeSafe();\n this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target);\n this._camera.lookAt(this._target);\n // set offset after the orbit movement\n if (this._affectOffset) {\n this._camera.updateMatrixWorld();\n _xColumn.setFromMatrixColumn(this._camera.matrix, 0);\n _yColumn.setFromMatrixColumn(this._camera.matrix, 1);\n _zColumn.setFromMatrixColumn(this._camera.matrix, 2);\n _xColumn.multiplyScalar(this._focalOffset.x);\n _yColumn.multiplyScalar(-this._focalOffset.y);\n _zColumn.multiplyScalar(this._focalOffset.z); // notice: z-offset will not affect in Orthographic.\n _v3A.copy(_xColumn).add(_yColumn).add(_zColumn);\n this._camera.position.add(_v3A);\n }\n if (this._boundaryEnclosesCamera) {\n this._encloseToBoundary(this._camera.position.copy(this._target), _v3A.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse), 1.0);\n }\n const updated = this._needsUpdate;\n if (updated && !this._updatedLastTime) {\n this._hasRested = false;\n this.dispatchEvent({ type: 'wake' });\n this.dispatchEvent({ type: 'update' });\n }\n else if (updated) {\n this.dispatchEvent({ type: 'update' });\n if (approxZero(deltaTheta, this.restThreshold) &&\n approxZero(deltaPhi, this.restThreshold) &&\n approxZero(deltaRadius, this.restThreshold) &&\n approxZero(deltaTarget.x, this.restThreshold) &&\n approxZero(deltaTarget.y, this.restThreshold) &&\n approxZero(deltaTarget.z, this.restThreshold) &&\n approxZero(deltaOffset.x, this.restThreshold) &&\n approxZero(deltaOffset.y, this.restThreshold) &&\n approxZero(deltaOffset.z, this.restThreshold) &&\n approxZero(deltaZoom, this.restThreshold) &&\n !this._hasRested) {\n this._hasRested = true;\n this.dispatchEvent({ type: 'rest' });\n }\n }\n else if (!updated && this._updatedLastTime) {\n this.dispatchEvent({ type: 'sleep' });\n }\n this._updatedLastTime = updated;\n this._needsUpdate = false;\n return updated;\n }\n /**\n * Get all state in JSON string\n * @category Methods\n */\n toJSON() {\n return JSON.stringify({\n enabled: this._enabled,\n minDistance: this.minDistance,\n maxDistance: infinityToMaxNumber(this.maxDistance),\n minZoom: this.minZoom,\n maxZoom: infinityToMaxNumber(this.maxZoom),\n minPolarAngle: this.minPolarAngle,\n maxPolarAngle: infinityToMaxNumber(this.maxPolarAngle),\n minAzimuthAngle: infinityToMaxNumber(this.minAzimuthAngle),\n maxAzimuthAngle: infinityToMaxNumber(this.maxAzimuthAngle),\n dampingFactor: this.dampingFactor,\n draggingDampingFactor: this.draggingDampingFactor,\n dollySpeed: this.dollySpeed,\n truckSpeed: this.truckSpeed,\n dollyToCursor: this.dollyToCursor,\n verticalDragToForward: this.verticalDragToForward,\n target: this._targetEnd.toArray(),\n position: _v3A.setFromSpherical(this._sphericalEnd).add(this._targetEnd).toArray(),\n zoom: this._zoomEnd,\n focalOffset: this._focalOffsetEnd.toArray(),\n target0: this._target0.toArray(),\n position0: this._position0.toArray(),\n zoom0: this._zoom0,\n focalOffset0: this._focalOffset0.toArray(),\n });\n }\n /**\n * Reproduce the control state with JSON. enableTransition is where anim or not in a boolean.\n * @param json\n * @param enableTransition\n * @category Methods\n */\n fromJSON(json, enableTransition = false) {\n const obj = JSON.parse(json);\n const position = _v3A.fromArray(obj.position);\n this.enabled = obj.enabled;\n this.minDistance = obj.minDistance;\n this.maxDistance = maxNumberToInfinity(obj.maxDistance);\n this.minZoom = obj.minZoom;\n this.maxZoom = maxNumberToInfinity(obj.maxZoom);\n this.minPolarAngle = obj.minPolarAngle;\n this.maxPolarAngle = maxNumberToInfinity(obj.maxPolarAngle);\n this.minAzimuthAngle = maxNumberToInfinity(obj.minAzimuthAngle);\n this.maxAzimuthAngle = maxNumberToInfinity(obj.maxAzimuthAngle);\n this.dampingFactor = obj.dampingFactor;\n this.draggingDampingFactor = obj.draggingDampingFactor;\n this.dollySpeed = obj.dollySpeed;\n this.truckSpeed = obj.truckSpeed;\n this.dollyToCursor = obj.dollyToCursor;\n this.verticalDragToForward = obj.verticalDragToForward;\n this._target0.fromArray(obj.target0);\n this._position0.fromArray(obj.position0);\n this._zoom0 = obj.zoom0;\n this._focalOffset0.fromArray(obj.focalOffset0);\n this.moveTo(obj.target[0], obj.target[1], obj.target[2], enableTransition);\n _sphericalA.setFromVector3(position.sub(this._targetEnd).applyQuaternion(this._yAxisUpSpace));\n this.rotateTo(_sphericalA.theta, _sphericalA.phi, enableTransition);\n this.zoomTo(obj.zoom, enableTransition);\n this.setFocalOffset(obj.focalOffset[0], obj.focalOffset[1], obj.focalOffset[2], enableTransition);\n this._needsUpdate = true;\n }\n /**\n * Attach all internal event handlers to enable drag control.\n * @category Methods\n */\n connect(domElement) {\n if (this._domElement) {\n console.warn('camera-controls is already connected.');\n return;\n }\n domElement.setAttribute('data-camera-controls-version', VERSION);\n this._addAllEventListeners(domElement);\n }\n /**\n * Detach all internal event handlers to disable drag control.\n */\n disconnect() {\n this._removeAllEventListeners();\n this._domElement = undefined;\n }\n /**\n * Dispose the cameraControls instance itself, remove all eventListeners.\n * @category Methods\n */\n dispose() {\n this.disconnect();\n if (this._domElement && 'setAttribute' in this._domElement)\n this._domElement.removeAttribute('data-camera-controls-version');\n }\n _findPointerById(pointerId) {\n // to support IE11 use some instead of Array#find (will be removed when IE11 is deprecated)\n let pointer = null;\n this._activePointers.some((activePointer) => {\n if (activePointer.pointerId === pointerId) {\n pointer = activePointer;\n return true;\n }\n return false;\n });\n return pointer;\n }\n _encloseToBoundary(position, offset, friction) {\n const offsetLength2 = offset.lengthSq();\n if (offsetLength2 === 0.0) { // sanity check\n return position;\n }\n // See: https://twitter.com/FMS_Cat/status/1106508958640988161\n const newTarget = _v3B.copy(offset).add(position); // target\n const clampedTarget = this._boundary.clampPoint(newTarget, _v3C); // clamped target\n const deltaClampedTarget = clampedTarget.sub(newTarget); // newTarget -> clampedTarget\n const deltaClampedTargetLength2 = deltaClampedTarget.lengthSq(); // squared length of deltaClampedTarget\n if (deltaClampedTargetLength2 === 0.0) { // when the position doesn't have to be clamped\n return position.add(offset);\n }\n else if (deltaClampedTargetLength2 === offsetLength2) { // when the position is completely stuck\n return position;\n }\n else if (friction === 0.0) {\n return position.add(offset).add(deltaClampedTarget);\n }\n else {\n const offsetFactor = 1.0 + friction * deltaClampedTargetLength2 / offset.dot(deltaClampedTarget);\n return position\n .add(_v3B.copy(offset).multiplyScalar(offsetFactor))\n .add(deltaClampedTarget.multiplyScalar(1.0 - friction));\n }\n }\n _updateNearPlaneCorners() {\n if (isPerspectiveCamera(this._camera)) {\n const camera = this._camera;\n const near = camera.near;\n const fov = camera.getEffectiveFOV() * THREE.MathUtils.DEG2RAD;\n const heightHalf = Math.tan(fov * 0.5) * near; // near plain half height\n const widthHalf = heightHalf * camera.aspect; // near plain half width\n this._nearPlaneCorners[0].set(-widthHalf, -heightHalf, 0);\n this._nearPlaneCorners[1].set(widthHalf, -heightHalf, 0);\n this._nearPlaneCorners[2].set(widthHalf, heightHalf, 0);\n this._nearPlaneCorners[3].set(-widthHalf, heightHalf, 0);\n }\n else if (isOrthographicCamera(this._camera)) {\n const camera = this._camera;\n const zoomInv = 1 / camera.zoom;\n const left = camera.left * zoomInv;\n const right = camera.right * zoomInv;\n const top = camera.top * zoomInv;\n const bottom = camera.bottom * zoomInv;\n this._nearPlaneCorners[0].set(left, top, 0);\n this._nearPlaneCorners[1].set(right, top, 0);\n this._nearPlaneCorners[2].set(right, bottom, 0);\n this._nearPlaneCorners[3].set(left, bottom, 0);\n }\n }\n // lateUpdate\n _collisionTest() {\n let distance = Infinity;\n const hasCollider = this.colliderMeshes.length >= 1;\n if (!hasCollider)\n return distance;\n if (notSupportedInOrthographicCamera(this._camera, '_collisionTest'))\n return distance;\n // divide by distance to normalize, lighter than `Vector3.prototype.normalize()`\n const direction = _v3A.setFromSpherical(this._spherical).divideScalar(this._spherical.radius);\n _rotationMatrix.lookAt(_ORIGIN, direction, this._camera.up);\n for (let i = 0; i < 4; i++) {\n const nearPlaneCorner = _v3B.copy(this._nearPlaneCorners[i]);\n nearPlaneCorner.applyMatrix4(_rotationMatrix);\n const origin = _v3C.addVectors(this._target, nearPlaneCorner);\n _raycaster.set(origin, direction);\n _raycaster.far = this._spherical.radius + 1;\n const intersects = _raycaster.intersectObjects(this.colliderMeshes);\n if (intersects.length !== 0 && intersects[0].distance < distance) {\n distance = intersects[0].distance;\n }\n }\n return distance;\n }\n /**\n * Get its client rect and package into given `DOMRect` .\n */\n _getClientRect(target) {\n if (!this._domElement)\n return;\n const rect = this._domElement.getBoundingClientRect();\n target.x = rect.left;\n target.y = rect.top;\n if (this._viewport) {\n target.x += this._viewport.x;\n target.y += rect.height - this._viewport.w - this._viewport.y;\n target.width = this._viewport.z;\n target.height = this._viewport.w;\n }\n else {\n target.width = rect.width;\n target.height = rect.height;\n }\n return target;\n }\n _createOnRestPromise(resolveImmediately) {\n if (resolveImmediately)\n return Promise.resolve();\n this._hasRested = false;\n this.dispatchEvent({ type: 'transitionstart' });\n return new Promise((resolve) => {\n const onResolve = () => {\n this.removeEventListener('rest', onResolve);\n resolve();\n };\n this.addEventListener('rest', onResolve);\n });\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _addAllEventListeners(_domElement) { }\n _removeAllEventListeners() { }\n}\nfunction createBoundingSphere(object3d, out) {\n const boundingSphere = out;\n const center = boundingSphere.center;\n _box3A.makeEmpty();\n // find the center\n object3d.traverseVisible((object) => {\n if (!object.isMesh)\n return;\n _box3A.expandByObject(object);\n });\n _box3A.getCenter(center);\n // find the radius\n let maxRadiusSq = 0;\n object3d.traverseVisible((object) => {\n if (!object.isMesh)\n return;\n const mesh = object;\n const geometry = mesh.geometry.clone();\n geometry.applyMatrix4(mesh.matrixWorld);\n if (geometry.isBufferGeometry) {\n const bufferGeometry = geometry;\n const position = bufferGeometry.attributes.position;\n for (let i = 0, l = position.count; i < l; i++) {\n _v3A.fromBufferAttribute(position, i);\n maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_v3A));\n }\n }\n else {\n // for old three.js, which supports both BufferGeometry and Geometry\n // this condition block will be removed in the near future.\n const position = geometry.attributes.position;\n const vector = new THREE.Vector3();\n for (let i = 0, l = position.count; i < l; i++) {\n vector.fromBufferAttribute(position, i);\n maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(vector));\n }\n }\n });\n boundingSphere.radius = Math.sqrt(maxRadiusSq);\n return boundingSphere;\n}\n\nexport { CameraControls as default };\n","/*!\n * hold-event\n * https://github.com/yomotsu/hold-event\n * (c) 2020 @yomotsu\n * Released under the MIT License.\n */\nvar HOLD_EVENT_TYPE;\r\n(function (HOLD_EVENT_TYPE) {\r\n HOLD_EVENT_TYPE[\"HOLD_START\"] = \"holdStart\";\r\n HOLD_EVENT_TYPE[\"HOLD_END\"] = \"holdEnd\";\r\n HOLD_EVENT_TYPE[\"HOLDING\"] = \"holding\";\r\n})(HOLD_EVENT_TYPE || (HOLD_EVENT_TYPE = {}));\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nfunction __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\n\nvar EventDispatcher = (function () {\r\n function EventDispatcher() {\r\n this._listeners = {};\r\n }\r\n EventDispatcher.prototype.addEventListener = function (type, listener) {\r\n var listeners = this._listeners;\r\n if (listeners[type] === undefined)\r\n listeners[type] = [];\r\n if (listeners[type].indexOf(listener) === -1)\r\n listeners[type].push(listener);\r\n };\r\n EventDispatcher.prototype.removeEventListener = function (type, listener) {\r\n var listeners = this._listeners;\r\n var listenerArray = listeners[type];\r\n if (listenerArray !== undefined) {\r\n var index = listenerArray.indexOf(listener);\r\n if (index !== -1)\r\n listenerArray.splice(index, 1);\r\n }\r\n };\r\n EventDispatcher.prototype.dispatchEvent = function (event) {\r\n var listeners = this._listeners;\r\n var listenerArray = listeners[event.type];\r\n if (listenerArray !== undefined) {\r\n event.target = this;\r\n var array = listenerArray.slice(0);\r\n for (var i = 0, l = array.length; i < l; i++) {\r\n array[i].call(this, event);\r\n }\r\n }\r\n };\r\n return EventDispatcher;\r\n}());\n\nvar Hold = (function (_super) {\r\n __extends(Hold, _super);\r\n function Hold(holdIntervalDelay) {\r\n var _this = _super.call(this) || this;\r\n _this._enabled = true;\r\n _this._holding = false;\r\n _this._intervalId = -1;\r\n _this._deltaTime = 0;\r\n _this._elapsedTime = 0;\r\n _this._lastTime = 0;\r\n _this._holdStart = function (event) {\r\n if (!_this._enabled)\r\n return;\r\n if (_this._holding)\r\n return;\r\n _this._deltaTime = 0;\r\n _this._elapsedTime = 0;\r\n _this._lastTime = performance.now();\r\n _this.dispatchEvent({\r\n type: HOLD_EVENT_TYPE.HOLD_START,\r\n deltaTime: _this._deltaTime,\r\n elapsedTime: _this._elapsedTime,\r\n originalEvent: event,\r\n });\r\n _this._holding = true;\r\n var cb = function () {\r\n _this._intervalId = !!_this.holdIntervalDelay ?\r\n window.setTimeout(cb, _this.holdIntervalDelay) :\r\n window.requestAnimationFrame(cb);\r\n var now = performance.now();\r\n _this._deltaTime = now - _this._lastTime;\r\n _this._elapsedTime += _this._deltaTime;\r\n _this._lastTime = performance.now();\r\n _this.dispatchEvent({\r\n type: HOLD_EVENT_TYPE.HOLDING,\r\n deltaTime: _this._deltaTime,\r\n elapsedTime: _this._elapsedTime,\r\n });\r\n };\r\n _this._intervalId = !!_this.holdIntervalDelay ?\r\n window.setTimeout(cb, _this.holdIntervalDelay) :\r\n window.requestAnimationFrame(cb);\r\n };\r\n _this._holdEnd = function (event) {\r\n if (!_this._enabled)\r\n return;\r\n if (!_this._holding)\r\n return;\r\n var now = performance.now();\r\n _this._deltaTime = now - _this._lastTime;\r\n _this._elapsedTime += _this._deltaTime;\r\n _this._lastTime = performance.now();\r\n _this.dispatchEvent({\r\n type: HOLD_EVENT_TYPE.HOLD_END,\r\n deltaTime: _this._deltaTime,\r\n elapsedTime: _this._elapsedTime,\r\n originalEvent: event,\r\n });\r\n window.clearTimeout(_this._intervalId);\r\n window.cancelAnimationFrame(_this._intervalId);\r\n _this._holding = false;\r\n };\r\n _this.holdIntervalDelay = holdIntervalDelay;\r\n return _this;\r\n }\r\n Object.defineProperty(Hold.prototype, \"enabled\", {\r\n get: function () {\r\n return this._enabled;\r\n },\r\n set: function (enabled) {\r\n if (this._enabled === enabled)\r\n return;\r\n this._enabled = enabled;\r\n if (!this._enabled)\r\n this._holdEnd();\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n return Hold;\r\n}(EventDispatcher));\n\nvar ElementHold = (function (_super) {\r\n __extends(ElementHold, _super);\r\n function ElementHold(element, holdIntervalDelay) {\r\n var _this = _super.call(this, holdIntervalDelay) || this;\r\n _this._holdStart = _this._holdStart.bind(_this);\r\n _this._holdEnd = _this._holdEnd.bind(_this);\r\n var onPointerDown = _this._holdStart;\r\n var onPointerUp = _this._holdEnd;\r\n element.addEventListener('mousedown', onPointerDown);\r\n document.addEventListener('mouseup', onPointerUp);\r\n window.addEventListener('blur', _this._holdEnd);\r\n return _this;\r\n }\r\n return ElementHold;\r\n}(Hold));\n\nvar KeyboardKeyHold = (function (_super) {\r\n __extends(KeyboardKeyHold, _super);\r\n function KeyboardKeyHold(keyCode, holdIntervalDelay) {\r\n var _this = _super.call(this, holdIntervalDelay) || this;\r\n _this._holdStart = _this._holdStart.bind(_this);\r\n _this._holdEnd = _this._holdEnd.bind(_this);\r\n var onKeydown = function (event) {\r\n if (isInputEvent(event))\r\n return;\r\n if (event.keyCode !== keyCode)\r\n return;\r\n _this._holdStart(event);\r\n };\r\n var onKeyup = function (event) {\r\n if (event.keyCode !== keyCode)\r\n return;\r\n _this._holdEnd(event);\r\n };\r\n document.addEventListener('keydown', onKeydown);\r\n document.addEventListener('keyup', onKeyup);\r\n window.addEventListener('blur', _this._holdEnd);\r\n return _this;\r\n }\r\n return KeyboardKeyHold;\r\n}(Hold));\r\nfunction isInputEvent(event) {\r\n var target = event.target;\r\n return (target.tagName === 'INPUT' ||\r\n target.tagName === 'SELECT' ||\r\n target.tagName === 'TEXTAREA' ||\r\n target.isContentEditable);\r\n}\n\nexport { ElementHold, HOLD_EVENT_TYPE, KeyboardKeyHold };\n","// Split strategy constants\r\nexport const CENTER = 0;\r\nexport const AVERAGE = 1;\r\nexport const SAH = 2;\r\n\r\n// Traversal constants\r\nexport const NOT_INTERSECTED = 0;\r\nexport const INTERSECTED = 1;\r\nexport const CONTAINED = 2;\r\n\r\n// SAH cost constants\r\n// TODO: hone these costs more. The relative difference between them should be the\r\n// difference in measured time to perform a triangle intersection vs traversing\r\n// bounds.\r\nexport const TRIANGLE_INTERSECT_COST = 1.25;\r\nexport const TRAVERSAL_COST = 1;\r\n\r\n\r\n// Build constants\r\nexport const BYTES_PER_NODE = 6 * 4 + 4 + 4;\r\nexport const IS_LEAFNODE_FLAG = 0xFFFF;\r\n\r\n// EPSILON for computing floating point error during build\r\n// https://en.wikipedia.org/wiki/Machine_epsilon#Values_for_standard_hardware_floating_point_arithmetics\r\nexport const FLOAT32_EPSILON = Math.pow( 2, - 24 );\r\n\r\n","export class MeshBVHNode {\r\n\r\n\tconstructor() {\r\n\r\n\t\t// internal nodes have boundingData, left, right, and splitAxis\r\n\t\t// leaf nodes have offset and count (referring to primitives in the mesh geometry)\r\n\r\n\t}\r\n\r\n}\r\n","export function arrayToBox( nodeIndex32, array, target ) {\r\n\r\n\ttarget.min.x = array[ nodeIndex32 ];\r\n\ttarget.min.y = array[ nodeIndex32 + 1 ];\r\n\ttarget.min.z = array[ nodeIndex32 + 2 ];\r\n\r\n\ttarget.max.x = array[ nodeIndex32 + 3 ];\r\n\ttarget.max.y = array[ nodeIndex32 + 4 ];\r\n\ttarget.max.z = array[ nodeIndex32 + 5 ];\r\n\r\n\treturn target;\r\n\r\n}\r\n\r\nexport function getLongestEdgeIndex( bounds ) {\r\n\r\n\tlet splitDimIdx = - 1;\r\n\tlet splitDist = - Infinity;\r\n\r\n\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\tconst dist = bounds[ i + 3 ] - bounds[ i ];\r\n\t\tif ( dist > splitDist ) {\r\n\r\n\t\t\tsplitDist = dist;\r\n\t\t\tsplitDimIdx = i;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn splitDimIdx;\r\n\r\n}\r\n\r\n// copys bounds a into bounds b\r\nexport function copyBounds( source, target ) {\r\n\r\n\ttarget.set( source );\r\n\r\n}\r\n\r\n// sets bounds target to the union of bounds a and b\r\nexport function unionBounds( a, b, target ) {\r\n\r\n\tlet aVal, bVal;\r\n\tfor ( let d = 0; d < 3; d ++ ) {\r\n\r\n\t\tconst d3 = d + 3;\r\n\r\n\t\t// set the minimum values\r\n\t\taVal = a[ d ];\r\n\t\tbVal = b[ d ];\r\n\t\ttarget[ d ] = aVal < bVal ? aVal : bVal;\r\n\r\n\t\t// set the max values\r\n\t\taVal = a[ d3 ];\r\n\t\tbVal = b[ d3 ];\r\n\t\ttarget[ d3 ] = aVal > bVal ? aVal : bVal;\r\n\r\n\t}\r\n\r\n}\r\n\r\n// expands the given bounds by the provided triangle bounds\r\nexport function expandByTriangleBounds( startIndex, triangleBounds, bounds ) {\r\n\r\n\tfor ( let d = 0; d < 3; d ++ ) {\r\n\r\n\t\tconst tCenter = triangleBounds[ startIndex + 2 * d ];\r\n\t\tconst tHalf = triangleBounds[ startIndex + 2 * d + 1 ];\r\n\r\n\t\tconst tMin = tCenter - tHalf;\r\n\t\tconst tMax = tCenter + tHalf;\r\n\r\n\t\tif ( tMin < bounds[ d ] ) {\r\n\r\n\t\t\tbounds[ d ] = tMin;\r\n\r\n\t\t}\r\n\r\n\t\tif ( tMax > bounds[ d + 3 ] ) {\r\n\r\n\t\t\tbounds[ d + 3 ] = tMax;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\n// compute bounds surface area\r\nexport function computeSurfaceArea( bounds ) {\r\n\r\n\tconst d0 = bounds[ 3 ] - bounds[ 0 ];\r\n\tconst d1 = bounds[ 4 ] - bounds[ 1 ];\r\n\tconst d2 = bounds[ 5 ] - bounds[ 2 ];\r\n\r\n\treturn 2 * ( d0 * d1 + d1 * d2 + d2 * d0 );\r\n\r\n}\r\n","import { BufferAttribute } from 'three';\r\nimport { MeshBVHNode } from './MeshBVHNode.js';\r\nimport { getLongestEdgeIndex, computeSurfaceArea, copyBounds, unionBounds, expandByTriangleBounds } from '../utils/ArrayBoxUtilities.js';\r\nimport {\r\n\tCENTER, AVERAGE, SAH, TRIANGLE_INTERSECT_COST, TRAVERSAL_COST,\r\n\tBYTES_PER_NODE, FLOAT32_EPSILON, IS_LEAFNODE_FLAG,\r\n} from './Constants.js';\r\n\r\nfunction ensureIndex( geo, options ) {\r\n\r\n\tif ( ! geo.index ) {\r\n\r\n\t\tconst vertexCount = geo.attributes.position.count;\r\n\t\tconst BufferConstructor = options.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer;\r\n\t\tlet index;\r\n\t\tif ( vertexCount > 65535 ) {\r\n\r\n\t\t\tindex = new Uint32Array( new BufferConstructor( 4 * vertexCount ) );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tindex = new Uint16Array( new BufferConstructor( 2 * vertexCount ) );\r\n\r\n\t\t}\r\n\r\n\t\tgeo.setIndex( new BufferAttribute( index, 1 ) );\r\n\r\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\r\n\r\n\t\t\tindex[ i ] = i;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\n// Computes the set of { offset, count } ranges which need independent BVH roots. Each\r\n// region in the geometry index that belongs to a different set of material groups requires\r\n// a separate BVH root, so that triangles indices belonging to one group never get swapped\r\n// with triangle indices belongs to another group. For example, if the groups were like this:\r\n//\r\n// [-------------------------------------------------------------]\r\n// |__________________|\r\n// g0 = [0, 20] |______________________||_____________________|\r\n// g1 = [16, 40] g2 = [41, 60]\r\n//\r\n// we would need four BVH roots: [0, 15], [16, 20], [21, 40], [41, 60].\r\nfunction getRootIndexRanges( geo ) {\r\n\r\n\tif ( ! geo.groups || ! geo.groups.length ) {\r\n\r\n\t\treturn [ { offset: 0, count: geo.index.count / 3 } ];\r\n\r\n\t}\r\n\r\n\tconst ranges = [];\r\n\tconst rangeBoundaries = new Set();\r\n\tfor ( const group of geo.groups ) {\r\n\r\n\t\trangeBoundaries.add( group.start );\r\n\t\trangeBoundaries.add( group.start + group.count );\r\n\r\n\t}\r\n\r\n\t// note that if you don't pass in a comparator, it sorts them lexicographically as strings :-(\r\n\tconst sortedBoundaries = Array.from( rangeBoundaries.values() ).sort( ( a, b ) => a - b );\r\n\tfor ( let i = 0; i < sortedBoundaries.length - 1; i ++ ) {\r\n\r\n\t\tconst start = sortedBoundaries[ i ], end = sortedBoundaries[ i + 1 ];\r\n\t\tranges.push( { offset: ( start / 3 ), count: ( end - start ) / 3 } );\r\n\r\n\t}\r\n\r\n\treturn ranges;\r\n\r\n}\r\n\r\n// computes the union of the bounds of all of the given triangles and puts the resulting box in target. If\r\n// centroidTarget is provided then a bounding box is computed for the centroids of the triangles, as well.\r\n// These are computed together to avoid redundant accesses to bounds array.\r\nfunction getBounds( triangleBounds, offset, count, target, centroidTarget = null ) {\r\n\r\n\tlet minx = Infinity;\r\n\tlet miny = Infinity;\r\n\tlet minz = Infinity;\r\n\tlet maxx = - Infinity;\r\n\tlet maxy = - Infinity;\r\n\tlet maxz = - Infinity;\r\n\r\n\tlet cminx = Infinity;\r\n\tlet cminy = Infinity;\r\n\tlet cminz = Infinity;\r\n\tlet cmaxx = - Infinity;\r\n\tlet cmaxy = - Infinity;\r\n\tlet cmaxz = - Infinity;\r\n\r\n\tconst includeCentroid = centroidTarget !== null;\r\n\tfor ( let i = offset * 6, end = ( offset + count ) * 6; i < end; i += 6 ) {\r\n\r\n\t\tconst cx = triangleBounds[ i + 0 ];\r\n\t\tconst hx = triangleBounds[ i + 1 ];\r\n\t\tconst lx = cx - hx;\r\n\t\tconst rx = cx + hx;\r\n\t\tif ( lx < minx ) minx = lx;\r\n\t\tif ( rx > maxx ) maxx = rx;\r\n\t\tif ( includeCentroid && cx < cminx ) cminx = cx;\r\n\t\tif ( includeCentroid && cx > cmaxx ) cmaxx = cx;\r\n\r\n\t\tconst cy = triangleBounds[ i + 2 ];\r\n\t\tconst hy = triangleBounds[ i + 3 ];\r\n\t\tconst ly = cy - hy;\r\n\t\tconst ry = cy + hy;\r\n\t\tif ( ly < miny ) miny = ly;\r\n\t\tif ( ry > maxy ) maxy = ry;\r\n\t\tif ( includeCentroid && cy < cminy ) cminy = cy;\r\n\t\tif ( includeCentroid && cy > cmaxy ) cmaxy = cy;\r\n\r\n\t\tconst cz = triangleBounds[ i + 4 ];\r\n\t\tconst hz = triangleBounds[ i + 5 ];\r\n\t\tconst lz = cz - hz;\r\n\t\tconst rz = cz + hz;\r\n\t\tif ( lz < minz ) minz = lz;\r\n\t\tif ( rz > maxz ) maxz = rz;\r\n\t\tif ( includeCentroid && cz < cminz ) cminz = cz;\r\n\t\tif ( includeCentroid && cz > cmaxz ) cmaxz = cz;\r\n\r\n\t}\r\n\r\n\ttarget[ 0 ] = minx;\r\n\ttarget[ 1 ] = miny;\r\n\ttarget[ 2 ] = minz;\r\n\r\n\ttarget[ 3 ] = maxx;\r\n\ttarget[ 4 ] = maxy;\r\n\ttarget[ 5 ] = maxz;\r\n\r\n\tif ( includeCentroid ) {\r\n\r\n\t\tcentroidTarget[ 0 ] = cminx;\r\n\t\tcentroidTarget[ 1 ] = cminy;\r\n\t\tcentroidTarget[ 2 ] = cminz;\r\n\r\n\t\tcentroidTarget[ 3 ] = cmaxx;\r\n\t\tcentroidTarget[ 4 ] = cmaxy;\r\n\t\tcentroidTarget[ 5 ] = cmaxz;\r\n\r\n\t}\r\n\r\n}\r\n\r\n// A stand alone function for retrieving the centroid bounds.\r\nfunction getCentroidBounds( triangleBounds, offset, count, centroidTarget ) {\r\n\r\n\tlet cminx = Infinity;\r\n\tlet cminy = Infinity;\r\n\tlet cminz = Infinity;\r\n\tlet cmaxx = - Infinity;\r\n\tlet cmaxy = - Infinity;\r\n\tlet cmaxz = - Infinity;\r\n\r\n\tfor ( let i = offset * 6, end = ( offset + count ) * 6; i < end; i += 6 ) {\r\n\r\n\t\tconst cx = triangleBounds[ i + 0 ];\r\n\t\tif ( cx < cminx ) cminx = cx;\r\n\t\tif ( cx > cmaxx ) cmaxx = cx;\r\n\r\n\t\tconst cy = triangleBounds[ i + 2 ];\r\n\t\tif ( cy < cminy ) cminy = cy;\r\n\t\tif ( cy > cmaxy ) cmaxy = cy;\r\n\r\n\t\tconst cz = triangleBounds[ i + 4 ];\r\n\t\tif ( cz < cminz ) cminz = cz;\r\n\t\tif ( cz > cmaxz ) cmaxz = cz;\r\n\r\n\t}\r\n\r\n\tcentroidTarget[ 0 ] = cminx;\r\n\tcentroidTarget[ 1 ] = cminy;\r\n\tcentroidTarget[ 2 ] = cminz;\r\n\r\n\tcentroidTarget[ 3 ] = cmaxx;\r\n\tcentroidTarget[ 4 ] = cmaxy;\r\n\tcentroidTarget[ 5 ] = cmaxz;\r\n\r\n}\r\n\r\n\r\n// reorders `tris` such that for `count` elements after `offset`, elements on the left side of the split\r\n// will be on the left and elements on the right side of the split will be on the right. returns the index\r\n// of the first element on the right side, or offset + count if there are no elements on the right side.\r\nfunction partition( index, triangleBounds, offset, count, split ) {\r\n\r\n\tlet left = offset;\r\n\tlet right = offset + count - 1;\r\n\tconst pos = split.pos;\r\n\tconst axisOffset = split.axis * 2;\r\n\r\n\t// hoare partitioning, see e.g. https://en.wikipedia.org/wiki/Quicksort#Hoare_partition_scheme\r\n\twhile ( true ) {\r\n\r\n\t\twhile ( left <= right && triangleBounds[ left * 6 + axisOffset ] < pos ) {\r\n\r\n\t\t\tleft ++;\r\n\r\n\t\t}\r\n\r\n\r\n\t\t// if a triangle center lies on the partition plane it is considered to be on the right side\r\n\t\twhile ( left <= right && triangleBounds[ right * 6 + axisOffset ] >= pos ) {\r\n\r\n\t\t\tright --;\r\n\r\n\t\t}\r\n\r\n\t\tif ( left < right ) {\r\n\r\n\t\t\t// we need to swap all of the information associated with the triangles at index\r\n\t\t\t// left and right; that's the verts in the geometry index, the bounds,\r\n\t\t\t// and perhaps the SAH planes\r\n\r\n\t\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\tlet t0 = index[ left * 3 + i ];\r\n\t\t\t\tindex[ left * 3 + i ] = index[ right * 3 + i ];\r\n\t\t\t\tindex[ right * 3 + i ] = t0;\r\n\r\n\t\t\t\tlet t1 = triangleBounds[ left * 6 + i * 2 + 0 ];\r\n\t\t\t\ttriangleBounds[ left * 6 + i * 2 + 0 ] = triangleBounds[ right * 6 + i * 2 + 0 ];\r\n\t\t\t\ttriangleBounds[ right * 6 + i * 2 + 0 ] = t1;\r\n\r\n\t\t\t\tlet t2 = triangleBounds[ left * 6 + i * 2 + 1 ];\r\n\t\t\t\ttriangleBounds[ left * 6 + i * 2 + 1 ] = triangleBounds[ right * 6 + i * 2 + 1 ];\r\n\t\t\t\ttriangleBounds[ right * 6 + i * 2 + 1 ] = t2;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tleft ++;\r\n\t\t\tright --;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn left;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nconst BIN_COUNT = 32;\r\nconst binsSort = ( a, b ) => a.candidate - b.candidate;\r\nconst sahBins = new Array( BIN_COUNT ).fill().map( () => {\r\n\r\n\treturn {\r\n\r\n\t\tcount: 0,\r\n\t\tbounds: new Float32Array( 6 ),\r\n\t\trightCacheBounds: new Float32Array( 6 ),\r\n\t\tleftCacheBounds: new Float32Array( 6 ),\r\n\t\tcandidate: 0,\r\n\r\n\t};\r\n\r\n} );\r\nconst leftBounds = new Float32Array( 6 );\r\n\r\nfunction getOptimalSplit( nodeBoundingData, centroidBoundingData, triangleBounds, offset, count, strategy ) {\r\n\r\n\tlet axis = - 1;\r\n\tlet pos = 0;\r\n\r\n\t// Center\r\n\tif ( strategy === CENTER ) {\r\n\r\n\t\taxis = getLongestEdgeIndex( centroidBoundingData );\r\n\t\tif ( axis !== - 1 ) {\r\n\r\n\t\t\tpos = ( centroidBoundingData[ axis ] + centroidBoundingData[ axis + 3 ] ) / 2;\r\n\r\n\t\t}\r\n\r\n\t} else if ( strategy === AVERAGE ) {\r\n\r\n\t\taxis = getLongestEdgeIndex( nodeBoundingData );\r\n\t\tif ( axis !== - 1 ) {\r\n\r\n\t\t\tpos = getAverage( triangleBounds, offset, count, axis );\r\n\r\n\t\t}\r\n\r\n\t} else if ( strategy === SAH ) {\r\n\r\n\t\tconst rootSurfaceArea = computeSurfaceArea( nodeBoundingData );\r\n\t\tlet bestCost = TRIANGLE_INTERSECT_COST * count;\r\n\r\n\t\t// iterate over all axes\r\n\t\tconst cStart = offset * 6;\r\n\t\tconst cEnd = ( offset + count ) * 6;\r\n\t\tfor ( let a = 0; a < 3; a ++ ) {\r\n\r\n\t\t\tconst axisLeft = centroidBoundingData[ a ];\r\n\t\t\tconst axisRight = centroidBoundingData[ a + 3 ];\r\n\t\t\tconst axisLength = axisRight - axisLeft;\r\n\t\t\tconst binWidth = axisLength / BIN_COUNT;\r\n\r\n\t\t\t// If we have fewer triangles than we're planning to split then just check all\r\n\t\t\t// the triangle positions because it will be faster.\r\n\t\t\tif ( count < BIN_COUNT / 4 ) {\r\n\r\n\t\t\t\t// initialize the bin candidates\r\n\t\t\t\tconst truncatedBins = [ ...sahBins ];\r\n\t\t\t\ttruncatedBins.length = count;\r\n\r\n\t\t\t\t// set the candidates\r\n\t\t\t\tlet b = 0;\r\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6, b ++ ) {\r\n\r\n\t\t\t\t\tconst bin = truncatedBins[ b ];\r\n\t\t\t\t\tbin.candidate = triangleBounds[ c + 2 * a ];\r\n\t\t\t\t\tbin.count = 0;\r\n\r\n\t\t\t\t\tconst {\r\n\t\t\t\t\t\tbounds,\r\n\t\t\t\t\t\tleftCacheBounds,\r\n\t\t\t\t\t\trightCacheBounds,\r\n\t\t\t\t\t} = bin;\r\n\t\t\t\t\tfor ( let d = 0; d < 3; d ++ ) {\r\n\r\n\t\t\t\t\t\trightCacheBounds[ d ] = Infinity;\r\n\t\t\t\t\t\trightCacheBounds[ d + 3 ] = - Infinity;\r\n\r\n\t\t\t\t\t\tleftCacheBounds[ d ] = Infinity;\r\n\t\t\t\t\t\tleftCacheBounds[ d + 3 ] = - Infinity;\r\n\r\n\t\t\t\t\t\tbounds[ d ] = Infinity;\r\n\t\t\t\t\t\tbounds[ d + 3 ] = - Infinity;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\texpandByTriangleBounds( c, triangleBounds, bounds );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttruncatedBins.sort( binsSort );\r\n\r\n\t\t\t\t// remove redundant splits\r\n\t\t\t\tlet splitCount = count;\r\n\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\r\n\r\n\t\t\t\t\tconst bin = truncatedBins[ bi ];\r\n\t\t\t\t\twhile ( bi + 1 < splitCount && truncatedBins[ bi + 1 ].candidate === bin.candidate ) {\r\n\r\n\t\t\t\t\t\ttruncatedBins.splice( bi + 1, 1 );\r\n\t\t\t\t\t\tsplitCount --;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// find the appropriate bin for each triangle and expand the bounds.\r\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6 ) {\r\n\r\n\t\t\t\t\tconst center = triangleBounds[ c + 2 * a ];\r\n\t\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\r\n\r\n\t\t\t\t\t\tconst bin = truncatedBins[ bi ];\r\n\t\t\t\t\t\tif ( center >= bin.candidate ) {\r\n\r\n\t\t\t\t\t\t\texpandByTriangleBounds( c, triangleBounds, bin.rightCacheBounds );\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\texpandByTriangleBounds( c, triangleBounds, bin.leftCacheBounds );\r\n\t\t\t\t\t\t\tbin.count ++;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// expand all the bounds\r\n\t\t\t\tfor ( let bi = 0; bi < splitCount; bi ++ ) {\r\n\r\n\t\t\t\t\tconst bin = truncatedBins[ bi ];\r\n\t\t\t\t\tconst leftCount = bin.count;\r\n\t\t\t\t\tconst rightCount = count - bin.count;\r\n\r\n\t\t\t\t\t// check the cost of this split\r\n\t\t\t\t\tconst leftBounds = bin.leftCacheBounds;\r\n\t\t\t\t\tconst rightBounds = bin.rightCacheBounds;\r\n\r\n\t\t\t\t\tlet leftProb = 0;\r\n\t\t\t\t\tif ( leftCount !== 0 ) {\r\n\r\n\t\t\t\t\t\tleftProb = computeSurfaceArea( leftBounds ) / rootSurfaceArea;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tlet rightProb = 0;\r\n\t\t\t\t\tif ( rightCount !== 0 ) {\r\n\r\n\t\t\t\t\t\trightProb = computeSurfaceArea( rightBounds ) / rootSurfaceArea;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst cost = TRAVERSAL_COST + TRIANGLE_INTERSECT_COST * (\r\n\t\t\t\t\t\tleftProb * leftCount + rightProb * rightCount\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tif ( cost < bestCost ) {\r\n\r\n\t\t\t\t\t\taxis = a;\r\n\t\t\t\t\t\tbestCost = cost;\r\n\t\t\t\t\t\tpos = bin.candidate;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// reset the bins\r\n\t\t\t\tfor ( let i = 0; i < BIN_COUNT; i ++ ) {\r\n\r\n\t\t\t\t\tconst bin = sahBins[ i ];\r\n\t\t\t\t\tbin.count = 0;\r\n\t\t\t\t\tbin.candidate = axisLeft + binWidth + i * binWidth;\r\n\r\n\t\t\t\t\tconst bounds = bin.bounds;\r\n\t\t\t\t\tfor ( let d = 0; d < 3; d ++ ) {\r\n\r\n\t\t\t\t\t\tbounds[ d ] = Infinity;\r\n\t\t\t\t\t\tbounds[ d + 3 ] = - Infinity;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// iterate over all center positions\r\n\t\t\t\tfor ( let c = cStart; c < cEnd; c += 6 ) {\r\n\r\n\t\t\t\t\tconst triCenter = triangleBounds[ c + 2 * a ];\r\n\t\t\t\t\tconst relativeCenter = triCenter - axisLeft;\r\n\r\n\t\t\t\t\t// in the partition function if the centroid lies on the split plane then it is\r\n\t\t\t\t\t// considered to be on the right side of the split\r\n\t\t\t\t\tlet binIndex = ~ ~ ( relativeCenter / binWidth );\r\n\t\t\t\t\tif ( binIndex >= BIN_COUNT ) binIndex = BIN_COUNT - 1;\r\n\r\n\t\t\t\t\tconst bin = sahBins[ binIndex ];\r\n\t\t\t\t\tbin.count ++;\r\n\r\n\t\t\t\t\texpandByTriangleBounds( c, triangleBounds, bin.bounds );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// cache the unioned bounds from right to left so we don't have to regenerate them each time\r\n\t\t\t\tconst lastBin = sahBins[ BIN_COUNT - 1 ];\r\n\t\t\t\tcopyBounds( lastBin.bounds, lastBin.rightCacheBounds );\r\n\t\t\t\tfor ( let i = BIN_COUNT - 2; i >= 0; i -- ) {\r\n\r\n\t\t\t\t\tconst bin = sahBins[ i ];\r\n\t\t\t\t\tconst nextBin = sahBins[ i + 1 ];\r\n\t\t\t\t\tunionBounds( bin.bounds, nextBin.rightCacheBounds, bin.rightCacheBounds );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet leftCount = 0;\r\n\t\t\t\tfor ( let i = 0; i < BIN_COUNT - 1; i ++ ) {\r\n\r\n\t\t\t\t\tconst bin = sahBins[ i ];\r\n\t\t\t\t\tconst binCount = bin.count;\r\n\t\t\t\t\tconst bounds = bin.bounds;\r\n\r\n\t\t\t\t\tconst nextBin = sahBins[ i + 1 ];\r\n\t\t\t\t\tconst rightBounds = nextBin.rightCacheBounds;\r\n\r\n\t\t\t\t\t// dont do anything with the bounds if the new bounds have no triangles\r\n\t\t\t\t\tif ( binCount !== 0 ) {\r\n\r\n\t\t\t\t\t\tif ( leftCount === 0 ) {\r\n\r\n\t\t\t\t\t\t\tcopyBounds( bounds, leftBounds );\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tunionBounds( bounds, leftBounds, leftBounds );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tleftCount += binCount;\r\n\r\n\t\t\t\t\t// check the cost of this split\r\n\t\t\t\t\tlet leftProb = 0;\r\n\t\t\t\t\tlet rightProb = 0;\r\n\r\n\t\t\t\t\tif ( leftCount !== 0 ) {\r\n\r\n\t\t\t\t\t\tleftProb = computeSurfaceArea( leftBounds ) / rootSurfaceArea;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst rightCount = count - leftCount;\r\n\t\t\t\t\tif ( rightCount !== 0 ) {\r\n\r\n\t\t\t\t\t\trightProb = computeSurfaceArea( rightBounds ) / rootSurfaceArea;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst cost = TRAVERSAL_COST + TRIANGLE_INTERSECT_COST * (\r\n\t\t\t\t\t\tleftProb * leftCount + rightProb * rightCount\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tif ( cost < bestCost ) {\r\n\r\n\t\t\t\t\t\taxis = a;\r\n\t\t\t\t\t\tbestCost = cost;\r\n\t\t\t\t\t\tpos = bin.candidate;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t} else {\r\n\r\n\t\tconsole.warn( `MeshBVH: Invalid build strategy value ${ strategy } used.` );\r\n\r\n\t}\r\n\r\n\treturn { axis, pos };\r\n\r\n}\r\n\r\n// returns the average coordinate on the specified axis of the all the provided triangles\r\nfunction getAverage( triangleBounds, offset, count, axis ) {\r\n\r\n\tlet avg = 0;\r\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\r\n\r\n\t\tavg += triangleBounds[ i * 6 + axis * 2 ];\r\n\r\n\t}\r\n\r\n\treturn avg / count;\r\n\r\n}\r\n\r\n// precomputes the bounding box for each triangle; required for quickly calculating tree splits.\r\n// result is an array of size tris.length * 6 where triangle i maps to a\r\n// [x_center, x_delta, y_center, y_delta, z_center, z_delta] tuple starting at index i * 6,\r\n// representing the center and half-extent in each dimension of triangle i\r\nfunction computeTriangleBounds( geo, fullBounds ) {\r\n\r\n\tconst posAttr = geo.attributes.position;\r\n\tconst index = geo.index.array;\r\n\tconst triCount = index.length / 3;\r\n\tconst triangleBounds = new Float32Array( triCount * 6 );\r\n\tconst normalized = posAttr.normalized;\r\n\r\n\t// used for non-normalized positions\r\n\tconst posArr = posAttr.array;\r\n\r\n\t// support for an interleaved position buffer\r\n\tconst bufferOffset = posAttr.offset || 0;\r\n\tlet stride = 3;\r\n\tif ( posAttr.isInterleavedBufferAttribute ) {\r\n\r\n\t\tstride = posAttr.data.stride;\r\n\r\n\t}\r\n\r\n\t// used for normalized positions\r\n\tconst getters = [ 'getX', 'getY', 'getZ' ];\r\n\r\n\tfor ( let tri = 0; tri < triCount; tri ++ ) {\r\n\r\n\t\tconst tri3 = tri * 3;\r\n\t\tconst tri6 = tri * 6;\r\n\r\n\t\tlet ai, bi, ci;\r\n\r\n\t\tif ( normalized ) {\r\n\r\n\t\t\tai = index[ tri3 + 0 ];\r\n\t\t\tbi = index[ tri3 + 1 ];\r\n\t\t\tci = index[ tri3 + 2 ];\r\n\r\n\t\t} else {\r\n\r\n\t\t\tai = index[ tri3 + 0 ] * stride + bufferOffset;\r\n\t\t\tbi = index[ tri3 + 1 ] * stride + bufferOffset;\r\n\t\t\tci = index[ tri3 + 2 ] * stride + bufferOffset;\r\n\r\n\t\t}\r\n\r\n\t\tfor ( let el = 0; el < 3; el ++ ) {\r\n\r\n\t\t\tlet a, b, c;\r\n\r\n\t\t\tif ( normalized ) {\r\n\r\n\t\t\t\ta = posAttr[ getters[ el ] ]( ai );\r\n\t\t\t\tb = posAttr[ getters[ el ] ]( bi );\r\n\t\t\t\tc = posAttr[ getters[ el ] ]( ci );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\ta = posArr[ ai + el ];\r\n\t\t\t\tb = posArr[ bi + el ];\r\n\t\t\t\tc = posArr[ ci + el ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tlet min = a;\r\n\t\t\tif ( b < min ) min = b;\r\n\t\t\tif ( c < min ) min = c;\r\n\r\n\t\t\tlet max = a;\r\n\t\t\tif ( b > max ) max = b;\r\n\t\t\tif ( c > max ) max = c;\r\n\r\n\t\t\t// Increase the bounds size by float32 epsilon to avoid precision errors when\r\n\t\t\t// converting to 32 bit float. Scale the epsilon by the size of the numbers being\r\n\t\t\t// worked with.\r\n\t\t\tconst halfExtents = ( max - min ) / 2;\r\n\t\t\tconst el2 = el * 2;\r\n\t\t\ttriangleBounds[ tri6 + el2 + 0 ] = min + halfExtents;\r\n\t\t\ttriangleBounds[ tri6 + el2 + 1 ] = halfExtents + ( Math.abs( min ) + halfExtents ) * FLOAT32_EPSILON;\r\n\r\n\t\t\tif ( min < fullBounds[ el ] ) fullBounds[ el ] = min;\r\n\t\t\tif ( max > fullBounds[ el + 3 ] ) fullBounds[ el + 3 ] = max;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn triangleBounds;\r\n\r\n}\r\n\r\nexport function buildTree( geo, options ) {\r\n\r\n\tfunction triggerProgress( trianglesProcessed ) {\r\n\r\n\t\tif ( onProgress ) {\r\n\r\n\t\t\tonProgress( trianglesProcessed / totalTriangles );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// either recursively splits the given node, creating left and right subtrees for it, or makes it a leaf node,\r\n\t// recording the offset and count of its triangles and writing them into the reordered geometry index.\r\n\tfunction splitNode( node, offset, count, centroidBoundingData = null, depth = 0 ) {\r\n\r\n\t\tif ( ! reachedMaxDepth && depth >= maxDepth ) {\r\n\r\n\t\t\treachedMaxDepth = true;\r\n\t\t\tif ( verbose ) {\r\n\r\n\t\t\t\tconsole.warn( `MeshBVH: Max depth of ${ maxDepth } reached when generating BVH. Consider increasing maxDepth.` );\r\n\t\t\t\tconsole.warn( geo );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// early out if we've met our capacity\r\n\t\tif ( count <= maxLeafTris || depth >= maxDepth ) {\r\n\r\n\t\t\ttriggerProgress( offset + count );\r\n\t\t\tnode.offset = offset;\r\n\t\t\tnode.count = count;\r\n\t\t\treturn node;\r\n\r\n\t\t}\r\n\r\n\t\t// Find where to split the volume\r\n\t\tconst split = getOptimalSplit( node.boundingData, centroidBoundingData, triangleBounds, offset, count, strategy );\r\n\t\tif ( split.axis === - 1 ) {\r\n\r\n\t\t\ttriggerProgress( offset + count );\r\n\t\t\tnode.offset = offset;\r\n\t\t\tnode.count = count;\r\n\t\t\treturn node;\r\n\r\n\t\t}\r\n\r\n\t\tconst splitOffset = partition( indexArray, triangleBounds, offset, count, split );\r\n\r\n\t\t// create the two new child nodes\r\n\t\tif ( splitOffset === offset || splitOffset === offset + count ) {\r\n\r\n\t\t\ttriggerProgress( offset + count );\r\n\t\t\tnode.offset = offset;\r\n\t\t\tnode.count = count;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tnode.splitAxis = split.axis;\r\n\r\n\t\t\t// create the left child and compute its bounding box\r\n\t\t\tconst left = new MeshBVHNode();\r\n\t\t\tconst lstart = offset;\r\n\t\t\tconst lcount = splitOffset - offset;\r\n\t\t\tnode.left = left;\r\n\t\t\tleft.boundingData = new Float32Array( 6 );\r\n\r\n\t\t\tgetBounds( triangleBounds, lstart, lcount, left.boundingData, cacheCentroidBoundingData );\r\n\t\t\tsplitNode( left, lstart, lcount, cacheCentroidBoundingData, depth + 1 );\r\n\r\n\t\t\t// repeat for right\r\n\t\t\tconst right = new MeshBVHNode();\r\n\t\t\tconst rstart = splitOffset;\r\n\t\t\tconst rcount = count - lcount;\r\n\t\t\tnode.right = right;\r\n\t\t\tright.boundingData = new Float32Array( 6 );\r\n\r\n\t\t\tgetBounds( triangleBounds, rstart, rcount, right.boundingData, cacheCentroidBoundingData );\r\n\t\t\tsplitNode( right, rstart, rcount, cacheCentroidBoundingData, depth + 1 );\r\n\r\n\t\t}\r\n\r\n\t\treturn node;\r\n\r\n\t}\r\n\r\n\tensureIndex( geo, options );\r\n\r\n\t// Compute the full bounds of the geometry at the same time as triangle bounds because\r\n\t// we'll need it for the root bounds in the case with no groups and it should be fast here.\r\n\t// We can't use the geometrying bounding box if it's available because it may be out of date.\r\n\tconst fullBounds = new Float32Array( 6 );\r\n\tconst cacheCentroidBoundingData = new Float32Array( 6 );\r\n\tconst triangleBounds = computeTriangleBounds( geo, fullBounds );\r\n\tconst indexArray = geo.index.array;\r\n\tconst maxDepth = options.maxDepth;\r\n\tconst verbose = options.verbose;\r\n\tconst maxLeafTris = options.maxLeafTris;\r\n\tconst strategy = options.strategy;\r\n\tconst onProgress = options.onProgress;\r\n\tconst totalTriangles = geo.index.count / 3;\r\n\tlet reachedMaxDepth = false;\r\n\r\n\tconst roots = [];\r\n\tconst ranges = getRootIndexRanges( geo );\r\n\r\n\tif ( ranges.length === 1 ) {\r\n\r\n\t\tconst range = ranges[ 0 ];\r\n\t\tconst root = new MeshBVHNode();\r\n\t\troot.boundingData = fullBounds;\r\n\t\tgetCentroidBounds( triangleBounds, range.offset, range.count, cacheCentroidBoundingData );\r\n\r\n\t\tsplitNode( root, range.offset, range.count, cacheCentroidBoundingData );\r\n\t\troots.push( root );\r\n\r\n\t} else {\r\n\r\n\t\tfor ( let range of ranges ) {\r\n\r\n\t\t\tconst root = new MeshBVHNode();\r\n\t\t\troot.boundingData = new Float32Array( 6 );\r\n\t\t\tgetBounds( triangleBounds, range.offset, range.count, root.boundingData, cacheCentroidBoundingData );\r\n\r\n\t\t\tsplitNode( root, range.offset, range.count, cacheCentroidBoundingData );\r\n\t\t\troots.push( root );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn roots;\r\n\r\n}\r\n\r\nexport function buildPackedTree( geo, options ) {\r\n\r\n\t// boundingData \t\t\t\t: 6 float32\r\n\t// right / offset \t\t\t\t: 1 uint32\r\n\t// splitAxis / isLeaf + count \t: 1 uint32 / 2 uint16\r\n\tconst roots = buildTree( geo, options );\r\n\r\n\tlet float32Array;\r\n\tlet uint32Array;\r\n\tlet uint16Array;\r\n\tconst packedRoots = [];\r\n\tconst BufferConstructor = options.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer;\r\n\tfor ( let i = 0; i < roots.length; i ++ ) {\r\n\r\n\t\tconst root = roots[ i ];\r\n\t\tlet nodeCount = countNodes( root );\r\n\r\n\t\tconst buffer = new BufferConstructor( BYTES_PER_NODE * nodeCount );\r\n\t\tfloat32Array = new Float32Array( buffer );\r\n\t\tuint32Array = new Uint32Array( buffer );\r\n\t\tuint16Array = new Uint16Array( buffer );\r\n\t\tpopulateBuffer( 0, root );\r\n\t\tpackedRoots.push( buffer );\r\n\r\n\t}\r\n\r\n\treturn packedRoots;\r\n\r\n\tfunction countNodes( node ) {\r\n\r\n\t\tif ( node.count ) {\r\n\r\n\t\t\treturn 1;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn 1 + countNodes( node.left ) + countNodes( node.right );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction populateBuffer( byteOffset, node ) {\r\n\r\n\t\tconst stride4Offset = byteOffset / 4;\r\n\t\tconst stride2Offset = byteOffset / 2;\r\n\t\tconst isLeaf = ! ! node.count;\r\n\t\tconst boundingData = node.boundingData;\r\n\t\tfor ( let i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\tfloat32Array[ stride4Offset + i ] = boundingData[ i ];\r\n\r\n\t\t}\r\n\r\n\t\tif ( isLeaf ) {\r\n\r\n\t\t\tconst offset = node.offset;\r\n\t\t\tconst count = node.count;\r\n\t\t\tuint32Array[ stride4Offset + 6 ] = offset;\r\n\t\t\tuint16Array[ stride2Offset + 14 ] = count;\r\n\t\t\tuint16Array[ stride2Offset + 15 ] = IS_LEAFNODE_FLAG;\r\n\t\t\treturn byteOffset + BYTES_PER_NODE;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconst left = node.left;\r\n\t\t\tconst right = node.right;\r\n\t\t\tconst splitAxis = node.splitAxis;\r\n\r\n\t\t\tlet nextUnusedPointer;\r\n\t\t\tnextUnusedPointer = populateBuffer( byteOffset + BYTES_PER_NODE, left );\r\n\r\n\t\t\tif ( ( nextUnusedPointer / 4 ) > Math.pow( 2, 32 ) ) {\r\n\r\n\t\t\t\tthrow new Error( 'MeshBVH: Cannot store child pointer greater than 32 bits.' );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tuint32Array[ stride4Offset + 6 ] = nextUnusedPointer / 4;\r\n\t\t\tnextUnusedPointer = populateBuffer( nextUnusedPointer, right );\r\n\r\n\t\t\tuint32Array[ stride4Offset + 7 ] = splitAxis;\r\n\t\t\treturn nextUnusedPointer;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { Vector3 } from 'three';\r\n\r\nexport class SeparatingAxisBounds {\r\n\r\n\tconstructor() {\r\n\r\n\t\tthis.min = Infinity;\r\n\t\tthis.max = - Infinity;\r\n\r\n\t}\r\n\r\n\tsetFromPointsField( points, field ) {\r\n\r\n\t\tlet min = Infinity;\r\n\t\tlet max = - Infinity;\r\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\r\n\r\n\t\t\tconst p = points[ i ];\r\n\t\t\tconst val = p[ field ];\r\n\t\t\tmin = val < min ? val : min;\r\n\t\t\tmax = val > max ? val : max;\r\n\r\n\t\t}\r\n\r\n\t\tthis.min = min;\r\n\t\tthis.max = max;\r\n\r\n\t}\r\n\r\n\tsetFromPoints( axis, points ) {\r\n\r\n\t\tlet min = Infinity;\r\n\t\tlet max = - Infinity;\r\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\r\n\r\n\t\t\tconst p = points[ i ];\r\n\t\t\tconst val = axis.dot( p );\r\n\t\t\tmin = val < min ? val : min;\r\n\t\t\tmax = val > max ? val : max;\r\n\r\n\t\t}\r\n\r\n\t\tthis.min = min;\r\n\t\tthis.max = max;\r\n\r\n\t}\r\n\r\n\tisSeparated( other ) {\r\n\r\n\t\treturn this.min > other.max || other.min > this.max;\r\n\r\n\t}\r\n\r\n}\r\n\r\nSeparatingAxisBounds.prototype.setFromBox = ( function () {\r\n\r\n\tconst p = new Vector3();\r\n\treturn function setFromBox( axis, box ) {\r\n\r\n\t\tconst boxMin = box.min;\r\n\t\tconst boxMax = box.max;\r\n\t\tlet min = Infinity;\r\n\t\tlet max = - Infinity;\r\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\r\n\r\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\r\n\r\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\r\n\r\n\t\t\t\t\tp.x = boxMin.x * x + boxMax.x * ( 1 - x );\r\n\t\t\t\t\tp.y = boxMin.y * y + boxMax.y * ( 1 - y );\r\n\t\t\t\t\tp.z = boxMin.z * z + boxMax.z * ( 1 - z );\r\n\r\n\t\t\t\t\tconst val = axis.dot( p );\r\n\t\t\t\t\tmin = Math.min( val, min );\r\n\t\t\t\t\tmax = Math.max( val, max );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.min = min;\r\n\t\tthis.max = max;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nexport const areIntersecting = ( function () {\r\n\r\n\tconst cacheSatBounds = new SeparatingAxisBounds();\r\n\treturn function areIntersecting( shape1, shape2 ) {\r\n\r\n\t\tconst points1 = shape1.points;\r\n\t\tconst satAxes1 = shape1.satAxes;\r\n\t\tconst satBounds1 = shape1.satBounds;\r\n\r\n\t\tconst points2 = shape2.points;\r\n\t\tconst satAxes2 = shape2.satAxes;\r\n\t\tconst satBounds2 = shape2.satBounds;\r\n\r\n\t\t// check axes of the first shape\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sb = satBounds1[ i ];\r\n\t\t\tconst sa = satAxes1[ i ];\r\n\t\t\tcacheSatBounds.setFromPoints( sa, points2 );\r\n\t\t\tif ( sb.isSeparated( cacheSatBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\t// check axes of the second shape\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sb = satBounds2[ i ];\r\n\t\t\tconst sa = satAxes2[ i ];\r\n\t\t\tcacheSatBounds.setFromPoints( sa, points1 );\r\n\t\t\tif ( sb.isSeparated( cacheSatBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n} )();\r\n","import { Vector3, Vector2, Plane, Line3 } from 'three';\r\n\r\nexport const closestPointLineToLine = ( function () {\r\n\r\n\t// https://github.com/juj/MathGeoLib/blob/master/src/Geometry/Line.cpp#L56\r\n\tconst dir1 = new Vector3();\r\n\tconst dir2 = new Vector3();\r\n\tconst v02 = new Vector3();\r\n\treturn function closestPointLineToLine( l1, l2, result ) {\r\n\r\n\t\tconst v0 = l1.start;\r\n\t\tconst v10 = dir1;\r\n\t\tconst v2 = l2.start;\r\n\t\tconst v32 = dir2;\r\n\r\n\t\tv02.subVectors( v0, v2 );\r\n\t\tdir1.subVectors( l1.end, l1.start );\r\n\t\tdir2.subVectors( l2.end, l2.start );\r\n\r\n\t\t// float d0232 = v02.Dot(v32);\r\n\t\tconst d0232 = v02.dot( v32 );\r\n\r\n\t\t// float d3210 = v32.Dot(v10);\r\n\t\tconst d3210 = v32.dot( v10 );\r\n\r\n\t\t// float d3232 = v32.Dot(v32);\r\n\t\tconst d3232 = v32.dot( v32 );\r\n\r\n\t\t// float d0210 = v02.Dot(v10);\r\n\t\tconst d0210 = v02.dot( v10 );\r\n\r\n\t\t// float d1010 = v10.Dot(v10);\r\n\t\tconst d1010 = v10.dot( v10 );\r\n\r\n\t\t// float denom = d1010*d3232 - d3210*d3210;\r\n\t\tconst denom = d1010 * d3232 - d3210 * d3210;\r\n\r\n\t\tlet d, d2;\r\n\t\tif ( denom !== 0 ) {\r\n\r\n\t\t\td = ( d0232 * d3210 - d0210 * d3232 ) / denom;\r\n\r\n\t\t} else {\r\n\r\n\t\t\td = 0;\r\n\r\n\t\t}\r\n\r\n\t\td2 = ( d0232 + d * d3210 ) / d3232;\r\n\r\n\t\tresult.x = d;\r\n\t\tresult.y = d2;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nexport const closestPointsSegmentToSegment = ( function () {\r\n\r\n\t// https://github.com/juj/MathGeoLib/blob/master/src/Geometry/LineSegment.cpp#L187\r\n\tconst paramResult = new Vector2();\r\n\tconst temp1 = new Vector3();\r\n\tconst temp2 = new Vector3();\r\n\treturn function closestPointsSegmentToSegment( l1, l2, target1, target2 ) {\r\n\r\n\t\tclosestPointLineToLine( l1, l2, paramResult );\r\n\r\n\t\tlet d = paramResult.x;\r\n\t\tlet d2 = paramResult.y;\r\n\t\tif ( d >= 0 && d <= 1 && d2 >= 0 && d2 <= 1 ) {\r\n\r\n\t\t\tl1.at( d, target1 );\r\n\t\t\tl2.at( d2, target2 );\r\n\r\n\t\t\treturn;\r\n\r\n\t\t} else if ( d >= 0 && d <= 1 ) {\r\n\r\n\t\t\t// Only d2 is out of bounds.\r\n\t\t\tif ( d2 < 0 ) {\r\n\r\n\t\t\t\tl2.at( 0, target2 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tl2.at( 1, target2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tl1.closestPointToPoint( target2, true, target1 );\r\n\t\t\treturn;\r\n\r\n\t\t} else if ( d2 >= 0 && d2 <= 1 ) {\r\n\r\n\t\t\t// Only d is out of bounds.\r\n\t\t\tif ( d < 0 ) {\r\n\r\n\t\t\t\tl1.at( 0, target1 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tl1.at( 1, target1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tl2.closestPointToPoint( target1, true, target2 );\r\n\t\t\treturn;\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// Both u and u2 are out of bounds.\r\n\t\t\tlet p;\r\n\t\t\tif ( d < 0 ) {\r\n\r\n\t\t\t\tp = l1.start;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tp = l1.end;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tlet p2;\r\n\t\t\tif ( d2 < 0 ) {\r\n\r\n\t\t\t\tp2 = l2.start;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tp2 = l2.end;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tconst closestPoint = temp1;\r\n\t\t\tconst closestPoint2 = temp2;\r\n\t\t\tl1.closestPointToPoint( p2, true, temp1 );\r\n\t\t\tl2.closestPointToPoint( p, true, temp2 );\r\n\r\n\t\t\tif ( closestPoint.distanceToSquared( p2 ) <= closestPoint2.distanceToSquared( p ) ) {\r\n\r\n\t\t\t\ttarget1.copy( closestPoint );\r\n\t\t\t\ttarget2.copy( p2 );\r\n\t\t\t\treturn;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\ttarget1.copy( p );\r\n\t\t\t\ttarget2.copy( closestPoint2 );\r\n\t\t\t\treturn;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n\r\nexport const sphereIntersectTriangle = ( function () {\r\n\r\n\t// https://stackoverflow.com/questions/34043955/detect-collision-between-sphere-and-triangle-in-three-js\r\n\tconst closestPointTemp = new Vector3();\r\n\tconst projectedPointTemp = new Vector3();\r\n\tconst planeTemp = new Plane();\r\n\tconst lineTemp = new Line3();\r\n\treturn function sphereIntersectTriangle( sphere, triangle ) {\r\n\r\n\t\tconst { radius, center } = sphere;\r\n\t\tconst { a, b, c } = triangle;\r\n\r\n\t\t// phase 1\r\n\t\tlineTemp.start = a;\r\n\t\tlineTemp.end = b;\r\n\t\tconst closestPoint1 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\r\n\t\tif ( closestPoint1.distanceTo( center ) <= radius ) return true;\r\n\r\n\t\tlineTemp.start = a;\r\n\t\tlineTemp.end = c;\r\n\t\tconst closestPoint2 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\r\n\t\tif ( closestPoint2.distanceTo( center ) <= radius ) return true;\r\n\r\n\t\tlineTemp.start = b;\r\n\t\tlineTemp.end = c;\r\n\t\tconst closestPoint3 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\r\n\t\tif ( closestPoint3.distanceTo( center ) <= radius ) return true;\r\n\r\n\t\t// phase 2\r\n\t\tconst plane = triangle.getPlane( planeTemp );\r\n\t\tconst dp = Math.abs( plane.distanceToPoint( center ) );\r\n\t\tif ( dp <= radius ) {\r\n\r\n\t\t\tconst pp = plane.projectPoint( center, projectedPointTemp );\r\n\t\t\tconst cp = triangle.containsPoint( pp );\r\n\t\t\tif ( cp ) return true;\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t};\r\n\r\n} )();\r\n","import { Triangle, Vector3, Line3, Sphere, Plane } from 'three';\r\nimport { SeparatingAxisBounds } from './SeparatingAxisBounds.js';\r\nimport { closestPointsSegmentToSegment, sphereIntersectTriangle } from './MathUtilities.js';\r\n\r\nconst DIST_EPSILON = 1e-15;\r\nfunction isNearZero( value ) {\r\n\r\n\treturn Math.abs( value ) < DIST_EPSILON;\r\n\r\n}\r\n\r\nexport class ExtendedTriangle extends Triangle {\r\n\r\n\tconstructor( ...args ) {\r\n\r\n\t\tsuper( ...args );\r\n\r\n\t\tthis.isExtendedTriangle = true;\r\n\t\tthis.satAxes = new Array( 4 ).fill().map( () => new Vector3() );\r\n\t\tthis.satBounds = new Array( 4 ).fill().map( () => new SeparatingAxisBounds() );\r\n\t\tthis.points = [ this.a, this.b, this.c ];\r\n\t\tthis.sphere = new Sphere();\r\n\t\tthis.plane = new Plane();\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\tintersectsSphere( sphere ) {\r\n\r\n\t\treturn sphereIntersectTriangle( sphere, this );\r\n\r\n\t}\r\n\r\n\tupdate() {\r\n\r\n\t\tconst a = this.a;\r\n\t\tconst b = this.b;\r\n\t\tconst c = this.c;\r\n\t\tconst points = this.points;\r\n\r\n\t\tconst satAxes = this.satAxes;\r\n\t\tconst satBounds = this.satBounds;\r\n\r\n\t\tconst axis0 = satAxes[ 0 ];\r\n\t\tconst sab0 = satBounds[ 0 ];\r\n\t\tthis.getNormal( axis0 );\r\n\t\tsab0.setFromPoints( axis0, points );\r\n\r\n\t\tconst axis1 = satAxes[ 1 ];\r\n\t\tconst sab1 = satBounds[ 1 ];\r\n\t\taxis1.subVectors( a, b );\r\n\t\tsab1.setFromPoints( axis1, points );\r\n\r\n\t\tconst axis2 = satAxes[ 2 ];\r\n\t\tconst sab2 = satBounds[ 2 ];\r\n\t\taxis2.subVectors( b, c );\r\n\t\tsab2.setFromPoints( axis2, points );\r\n\r\n\t\tconst axis3 = satAxes[ 3 ];\r\n\t\tconst sab3 = satBounds[ 3 ];\r\n\t\taxis3.subVectors( c, a );\r\n\t\tsab3.setFromPoints( axis3, points );\r\n\r\n\t\tthis.sphere.setFromPoints( this.points );\r\n\t\tthis.plane.setFromNormalAndCoplanarPoint( axis0, a );\r\n\t\tthis.needsUpdate = false;\r\n\r\n\t}\r\n\r\n}\r\n\r\nExtendedTriangle.prototype.closestPointToSegment = ( function () {\r\n\r\n\tconst point1 = new Vector3();\r\n\tconst point2 = new Vector3();\r\n\tconst edge = new Line3();\r\n\r\n\treturn function distanceToSegment( segment, target1 = null, target2 = null ) {\r\n\r\n\t\tconst { start, end } = segment;\r\n\t\tconst points = this.points;\r\n\t\tlet distSq;\r\n\t\tlet closestDistanceSq = Infinity;\r\n\r\n\t\t// check the triangle edges\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst nexti = ( i + 1 ) % 3;\r\n\t\t\tedge.start.copy( points[ i ] );\r\n\t\t\tedge.end.copy( points[ nexti ] );\r\n\r\n\t\t\tclosestPointsSegmentToSegment( edge, segment, point1, point2 );\r\n\r\n\t\t\tdistSq = point1.distanceToSquared( point2 );\r\n\t\t\tif ( distSq < closestDistanceSq ) {\r\n\r\n\t\t\t\tclosestDistanceSq = distSq;\r\n\t\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// check end points\r\n\t\tthis.closestPointToPoint( start, point1 );\r\n\t\tdistSq = start.distanceToSquared( point1 );\r\n\t\tif ( distSq < closestDistanceSq ) {\r\n\r\n\t\t\tclosestDistanceSq = distSq;\r\n\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\tif ( target2 ) target2.copy( start );\r\n\r\n\t\t}\r\n\r\n\t\tthis.closestPointToPoint( end, point1 );\r\n\t\tdistSq = end.distanceToSquared( point1 );\r\n\t\tif ( distSq < closestDistanceSq ) {\r\n\r\n\t\t\tclosestDistanceSq = distSq;\r\n\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\tif ( target2 ) target2.copy( end );\r\n\r\n\t\t}\r\n\r\n\t\treturn Math.sqrt( closestDistanceSq );\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nExtendedTriangle.prototype.intersectsTriangle = ( function () {\r\n\r\n\tconst saTri2 = new ExtendedTriangle();\r\n\tconst arr1 = new Array( 3 );\r\n\tconst arr2 = new Array( 3 );\r\n\tconst cachedSatBounds = new SeparatingAxisBounds();\r\n\tconst cachedSatBounds2 = new SeparatingAxisBounds();\r\n\tconst cachedAxis = new Vector3();\r\n\tconst dir1 = new Vector3();\r\n\tconst dir2 = new Vector3();\r\n\tconst tempDir = new Vector3();\r\n\tconst edge = new Line3();\r\n\tconst edge1 = new Line3();\r\n\tconst edge2 = new Line3();\r\n\r\n\t// TODO: If the triangles are coplanar and intersecting the target is nonsensical. It should at least\r\n\t// be a line contained by both triangles if not a different special case somehow represented in the return result.\r\n\treturn function intersectsTriangle( other, target = null ) {\r\n\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\tif ( ! other.isExtendedTriangle ) {\r\n\r\n\t\t\tsaTri2.copy( other );\r\n\t\t\tsaTri2.update();\r\n\t\t\tother = saTri2;\r\n\r\n\t\t} else if ( other.needsUpdate ) {\r\n\r\n\t\t\tother.update();\r\n\r\n\t\t}\r\n\r\n\t\tconst plane1 = this.plane;\r\n\t\tconst plane2 = other.plane;\r\n\r\n\t\tif ( Math.abs( plane1.normal.dot( plane2.normal ) ) > 1.0 - 1e-10 ) {\r\n\r\n\t\t\t// perform separating axis intersection test only for coplanar triangles\r\n\t\t\tconst satBounds1 = this.satBounds;\r\n\t\t\tconst satAxes1 = this.satAxes;\r\n\t\t\tarr2[ 0 ] = other.a;\r\n\t\t\tarr2[ 1 ] = other.b;\r\n\t\t\tarr2[ 2 ] = other.c;\r\n\t\t\tfor ( let i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\t\tconst sb = satBounds1[ i ];\r\n\t\t\t\tconst sa = satAxes1[ i ];\r\n\t\t\t\tcachedSatBounds.setFromPoints( sa, arr2 );\r\n\t\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tconst satBounds2 = other.satBounds;\r\n\t\t\tconst satAxes2 = other.satAxes;\r\n\t\t\tarr1[ 0 ] = this.a;\r\n\t\t\tarr1[ 1 ] = this.b;\r\n\t\t\tarr1[ 2 ] = this.c;\r\n\t\t\tfor ( let i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\t\tconst sb = satBounds2[ i ];\r\n\t\t\t\tconst sa = satAxes2[ i ];\r\n\t\t\t\tcachedSatBounds.setFromPoints( sa, arr1 );\r\n\t\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// check crossed axes\r\n\t\t\tfor ( let i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\t\tconst sa1 = satAxes1[ i ];\r\n\t\t\t\tfor ( let i2 = 0; i2 < 4; i2 ++ ) {\r\n\r\n\t\t\t\t\tconst sa2 = satAxes2[ i2 ];\r\n\t\t\t\t\tcachedAxis.crossVectors( sa1, sa2 );\r\n\t\t\t\t\tcachedSatBounds.setFromPoints( cachedAxis, arr1 );\r\n\t\t\t\t\tcachedSatBounds2.setFromPoints( cachedAxis, arr2 );\r\n\t\t\t\t\tif ( cachedSatBounds.isSeparated( cachedSatBounds2 ) ) return false;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( target ) {\r\n\r\n\t\t\t\t// TODO find two points that intersect on the edges and make that the result\r\n\t\t\t\tconsole.warn( 'ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0.' );\r\n\r\n\t\t\t\ttarget.start.set( 0, 0, 0 );\r\n\t\t\t\ttarget.end.set( 0, 0, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// find the edge that intersects the other triangle plane\r\n\t\t\tconst points1 = this.points;\r\n\t\t\tlet found1 = false;\r\n\t\t\tlet count1 = 0;\r\n\t\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\tconst p = points1[ i ];\r\n\t\t\t\tconst pNext = points1[ ( i + 1 ) % 3 ];\r\n\r\n\t\t\t\tedge.start.copy( p );\r\n\t\t\t\tedge.end.copy( pNext );\r\n\t\t\t\tedge.delta( dir1 );\r\n\r\n\t\t\t\tconst targetPoint = found1 ? edge1.start : edge1.end;\r\n\t\t\t\tconst startIntersects = isNearZero( plane2.distanceToPoint( p ) );\r\n\t\t\t\tif ( isNearZero( plane2.normal.dot( dir1 ) ) && startIntersects ) {\r\n\r\n\t\t\t\t\t// if the edge lies on the plane then take the line\r\n\t\t\t\t\tedge1.copy( edge );\r\n\t\t\t\t\tcount1 = 2;\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// check if the start point is near the plane because \"intersectLine\" is not robust to that case\r\n\t\t\t\tconst doesIntersect = plane2.intersectLine( edge, targetPoint ) || startIntersects;\r\n\t\t\t\tif ( doesIntersect && ! isNearZero( targetPoint.distanceTo( pNext ) ) ) {\r\n\r\n\t\t\t\t\tcount1 ++;\r\n\t\t\t\t\tif ( found1 ) {\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfound1 = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( count1 === 1 && this.containsPoint( edge1.end ) ) {\r\n\r\n\t\t\t\tif ( target ) {\r\n\r\n\t\t\t\t\ttarget.start.copy( edge1.end );\r\n\t\t\t\t\ttarget.end.copy( edge1.end );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t} else if ( count1 !== 2 ) {\r\n\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// find the other triangles edge that intersects this plane\r\n\t\t\tconst points2 = other.points;\r\n\t\t\tlet found2 = false;\r\n\t\t\tlet count2 = 0;\r\n\t\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\tconst p = points2[ i ];\r\n\t\t\t\tconst pNext = points2[ ( i + 1 ) % 3 ];\r\n\r\n\t\t\t\tedge.start.copy( p );\r\n\t\t\t\tedge.end.copy( pNext );\r\n\t\t\t\tedge.delta( dir2 );\r\n\r\n\t\t\t\tconst targetPoint = found2 ? edge2.start : edge2.end;\r\n\t\t\t\tconst startIntersects = isNearZero( plane1.distanceToPoint( p ) );\r\n\t\t\t\tif ( isNearZero( plane1.normal.dot( dir2 ) ) && startIntersects ) {\r\n\r\n\t\t\t\t\t// if the edge lies on the plane then take the line\r\n\t\t\t\t\tedge2.copy( edge );\r\n\t\t\t\t\tcount2 = 2;\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// check if the start point is near the plane because \"intersectLine\" is not robust to that case\r\n\t\t\t\tconst doesIntersect = plane1.intersectLine( edge, targetPoint ) || startIntersects;\r\n\t\t\t\tif ( doesIntersect && ! isNearZero( targetPoint.distanceTo( pNext ) ) ) {\r\n\r\n\t\t\t\t\tcount2 ++;\r\n\t\t\t\t\tif ( found2 ) {\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfound2 = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( count2 === 1 && this.containsPoint( edge2.end ) ) {\r\n\r\n\t\t\t\tif ( target ) {\r\n\r\n\t\t\t\t\ttarget.start.copy( edge2.end );\r\n\t\t\t\t\ttarget.end.copy( edge2.end );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t} else if ( count2 !== 2 ) {\r\n\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// find swap the second edge so both lines are running the same direction\r\n\t\t\tedge1.delta( dir1 );\r\n\t\t\tedge2.delta( dir2 );\r\n\r\n\t\t\tif ( dir1.dot( dir2 ) < 0 ) {\r\n\r\n\t\t\t\tlet tmp = edge2.start;\r\n\t\t\t\tedge2.start = edge2.end;\r\n\t\t\t\tedge2.end = tmp;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// check if the edges are overlapping\r\n\t\t\tconst s1 = edge1.start.dot( dir1 );\r\n\t\t\tconst e1 = edge1.end.dot( dir1 );\r\n\t\t\tconst s2 = edge2.start.dot( dir1 );\r\n\t\t\tconst e2 = edge2.end.dot( dir1 );\r\n\t\t\tconst separated1 = e1 < s2;\r\n\t\t\tconst separated2 = s1 < e2;\r\n\r\n\t\t\tif ( s1 !== e2 && s2 !== e1 && separated1 === separated2 ) {\r\n\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// assign the target output\r\n\t\t\tif ( target ) {\r\n\r\n\t\t\t\ttempDir.subVectors( edge1.start, edge2.start );\r\n\t\t\t\tif ( tempDir.dot( dir1 ) > 0 ) {\r\n\r\n\t\t\t\t\ttarget.start.copy( edge1.start );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\ttarget.start.copy( edge2.start );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttempDir.subVectors( edge1.end, edge2.end );\r\n\t\t\t\tif ( tempDir.dot( dir1 ) < 0 ) {\r\n\r\n\t\t\t\t\ttarget.end.copy( edge1.end );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\ttarget.end.copy( edge2.end );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n\r\nExtendedTriangle.prototype.distanceToPoint = ( function () {\r\n\r\n\tconst target = new Vector3();\r\n\treturn function distanceToPoint( point ) {\r\n\r\n\t\tthis.closestPointToPoint( point, target );\r\n\t\treturn point.distanceTo( target );\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n\r\nExtendedTriangle.prototype.distanceToTriangle = ( function () {\r\n\r\n\tconst point = new Vector3();\r\n\tconst point2 = new Vector3();\r\n\tconst cornerFields = [ 'a', 'b', 'c' ];\r\n\tconst line1 = new Line3();\r\n\tconst line2 = new Line3();\r\n\r\n\treturn function distanceToTriangle( other, target1 = null, target2 = null ) {\r\n\r\n\t\tconst lineTarget = target1 || target2 ? line1 : null;\r\n\t\tif ( this.intersectsTriangle( other, lineTarget ) ) {\r\n\r\n\t\t\tif ( target1 || target2 ) {\r\n\r\n\t\t\t\tif ( target1 ) lineTarget.getCenter( target1 );\r\n\t\t\t\tif ( target2 ) lineTarget.getCenter( target2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn 0;\r\n\r\n\t\t}\r\n\r\n\t\tlet closestDistanceSq = Infinity;\r\n\r\n\t\t// check all point distances\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tlet dist;\r\n\t\t\tconst field = cornerFields[ i ];\r\n\t\t\tconst otherVec = other[ field ];\r\n\t\t\tthis.closestPointToPoint( otherVec, point );\r\n\r\n\t\t\tdist = otherVec.distanceToSquared( point );\r\n\r\n\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\tif ( target1 ) target1.copy( point );\r\n\t\t\t\tif ( target2 ) target2.copy( otherVec );\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t\tconst thisVec = this[ field ];\r\n\t\t\tother.closestPointToPoint( thisVec, point );\r\n\r\n\t\t\tdist = thisVec.distanceToSquared( point );\r\n\r\n\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\tif ( target1 ) target1.copy( thisVec );\r\n\t\t\t\tif ( target2 ) target2.copy( point );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst f11 = cornerFields[ i ];\r\n\t\t\tconst f12 = cornerFields[ ( i + 1 ) % 3 ];\r\n\t\t\tline1.set( this[ f11 ], this[ f12 ] );\r\n\t\t\tfor ( let i2 = 0; i2 < 3; i2 ++ ) {\r\n\r\n\t\t\t\tconst f21 = cornerFields[ i2 ];\r\n\t\t\t\tconst f22 = cornerFields[ ( i2 + 1 ) % 3 ];\r\n\t\t\t\tline2.set( other[ f21 ], other[ f22 ] );\r\n\r\n\t\t\t\tclosestPointsSegmentToSegment( line1, line2, point, point2 );\r\n\r\n\t\t\t\tconst dist = point.distanceToSquared( point2 );\r\n\t\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\t\tif ( target1 ) target1.copy( point );\r\n\t\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn Math.sqrt( closestDistanceSq );\r\n\r\n\t};\r\n\r\n} )();\r\n","import { Vector3, Matrix4, Line3 } from 'three';\r\nimport { SeparatingAxisBounds } from './SeparatingAxisBounds.js';\r\nimport { ExtendedTriangle } from './ExtendedTriangle.js';\r\nimport { closestPointsSegmentToSegment } from './MathUtilities.js';\r\n\r\nexport class OrientedBox {\r\n\r\n\tconstructor( min, max, matrix ) {\r\n\r\n\t\tthis.isOrientedBox = true;\r\n\t\tthis.min = new Vector3();\r\n\t\tthis.max = new Vector3();\r\n\t\tthis.matrix = new Matrix4();\r\n\t\tthis.invMatrix = new Matrix4();\r\n\t\tthis.points = new Array( 8 ).fill().map( () => new Vector3() );\r\n\t\tthis.satAxes = new Array( 3 ).fill().map( () => new Vector3() );\r\n\t\tthis.satBounds = new Array( 3 ).fill().map( () => new SeparatingAxisBounds() );\r\n\t\tthis.alignedSatBounds = new Array( 3 ).fill().map( () => new SeparatingAxisBounds() );\r\n\t\tthis.needsUpdate = false;\r\n\r\n\t\tif ( min ) this.min.copy( min );\r\n\t\tif ( max ) this.max.copy( max );\r\n\t\tif ( matrix ) this.matrix.copy( matrix );\r\n\r\n\t}\r\n\r\n\tset( min, max, matrix ) {\r\n\r\n\t\tthis.min.copy( min );\r\n\t\tthis.max.copy( max );\r\n\t\tthis.matrix.copy( matrix );\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\tcopy( other ) {\r\n\r\n\t\tthis.min.copy( other.min );\r\n\t\tthis.max.copy( other.max );\r\n\t\tthis.matrix.copy( other.matrix );\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n\r\nOrientedBox.prototype.update = ( function () {\r\n\r\n\treturn function update() {\r\n\r\n\t\tconst matrix = this.matrix;\r\n\t\tconst min = this.min;\r\n\t\tconst max = this.max;\r\n\r\n\t\tconst points = this.points;\r\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\r\n\r\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\r\n\r\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\r\n\r\n\t\t\t\t\tconst i = ( ( 1 << 0 ) * x ) | ( ( 1 << 1 ) * y ) | ( ( 1 << 2 ) * z );\r\n\t\t\t\t\tconst v = points[ i ];\r\n\t\t\t\t\tv.x = x ? max.x : min.x;\r\n\t\t\t\t\tv.y = y ? max.y : min.y;\r\n\t\t\t\t\tv.z = z ? max.z : min.z;\r\n\r\n\t\t\t\t\tv.applyMatrix4( matrix );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tconst satBounds = this.satBounds;\r\n\t\tconst satAxes = this.satAxes;\r\n\t\tconst minVec = points[ 0 ];\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst axis = satAxes[ i ];\r\n\t\t\tconst sb = satBounds[ i ];\r\n\t\t\tconst index = 1 << i;\r\n\t\t\tconst pi = points[ index ];\r\n\r\n\t\t\taxis.subVectors( minVec, pi );\r\n\t\t\tsb.setFromPoints( axis, points );\r\n\r\n\t\t}\r\n\r\n\t\tconst alignedSatBounds = this.alignedSatBounds;\r\n\t\talignedSatBounds[ 0 ].setFromPointsField( points, 'x' );\r\n\t\talignedSatBounds[ 1 ].setFromPointsField( points, 'y' );\r\n\t\talignedSatBounds[ 2 ].setFromPointsField( points, 'z' );\r\n\r\n\t\tthis.invMatrix.copy( this.matrix ).invert();\r\n\t\tthis.needsUpdate = false;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nOrientedBox.prototype.intersectsBox = ( function () {\r\n\r\n\tconst aabbBounds = new SeparatingAxisBounds();\r\n\treturn function intersectsBox( box ) {\r\n\r\n\t\t// TODO: should this be doing SAT against the AABB?\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\tconst min = box.min;\r\n\t\tconst max = box.max;\r\n\t\tconst satBounds = this.satBounds;\r\n\t\tconst satAxes = this.satAxes;\r\n\t\tconst alignedSatBounds = this.alignedSatBounds;\r\n\r\n\t\taabbBounds.min = min.x;\r\n\t\taabbBounds.max = max.x;\r\n\t\tif ( alignedSatBounds[ 0 ].isSeparated( aabbBounds ) ) return false;\r\n\r\n\t\taabbBounds.min = min.y;\r\n\t\taabbBounds.max = max.y;\r\n\t\tif ( alignedSatBounds[ 1 ].isSeparated( aabbBounds ) ) return false;\r\n\r\n\t\taabbBounds.min = min.z;\r\n\t\taabbBounds.max = max.z;\r\n\t\tif ( alignedSatBounds[ 2 ].isSeparated( aabbBounds ) ) return false;\r\n\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst axis = satAxes[ i ];\r\n\t\t\tconst sb = satBounds[ i ];\r\n\t\t\taabbBounds.setFromBox( axis, box );\r\n\t\t\tif ( sb.isSeparated( aabbBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nOrientedBox.prototype.intersectsTriangle = ( function () {\r\n\r\n\tconst saTri = new ExtendedTriangle();\r\n\tconst pointsArr = new Array( 3 );\r\n\tconst cachedSatBounds = new SeparatingAxisBounds();\r\n\tconst cachedSatBounds2 = new SeparatingAxisBounds();\r\n\tconst cachedAxis = new Vector3();\r\n\treturn function intersectsTriangle( triangle ) {\r\n\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\tif ( ! triangle.isExtendedTriangle ) {\r\n\r\n\t\t\tsaTri.copy( triangle );\r\n\t\t\tsaTri.update();\r\n\t\t\ttriangle = saTri;\r\n\r\n\t\t} else if ( triangle.needsUpdate ) {\r\n\r\n\t\t\ttriangle.update();\r\n\r\n\t\t}\r\n\r\n\t\tconst satBounds = this.satBounds;\r\n\t\tconst satAxes = this.satAxes;\r\n\r\n\t\tpointsArr[ 0 ] = triangle.a;\r\n\t\tpointsArr[ 1 ] = triangle.b;\r\n\t\tpointsArr[ 2 ] = triangle.c;\r\n\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sb = satBounds[ i ];\r\n\t\t\tconst sa = satAxes[ i ];\r\n\t\t\tcachedSatBounds.setFromPoints( sa, pointsArr );\r\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\tconst triSatBounds = triangle.satBounds;\r\n\t\tconst triSatAxes = triangle.satAxes;\r\n\t\tconst points = this.points;\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sb = triSatBounds[ i ];\r\n\t\t\tconst sa = triSatAxes[ i ];\r\n\t\t\tcachedSatBounds.setFromPoints( sa, points );\r\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\t// check crossed axes\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sa1 = satAxes[ i ];\r\n\t\t\tfor ( let i2 = 0; i2 < 4; i2 ++ ) {\r\n\r\n\t\t\t\tconst sa2 = triSatAxes[ i2 ];\r\n\t\t\t\tcachedAxis.crossVectors( sa1, sa2 );\r\n\t\t\t\tcachedSatBounds.setFromPoints( cachedAxis, pointsArr );\r\n\t\t\t\tcachedSatBounds2.setFromPoints( cachedAxis, points );\r\n\t\t\t\tif ( cachedSatBounds.isSeparated( cachedSatBounds2 ) ) return false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nOrientedBox.prototype.closestPointToPoint = ( function () {\r\n\r\n\treturn function closestPointToPoint( point, target1 ) {\r\n\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\ttarget1\r\n\t\t\t.copy( point )\r\n\t\t\t.applyMatrix4( this.invMatrix )\r\n\t\t\t.clamp( this.min, this.max )\r\n\t\t\t.applyMatrix4( this.matrix );\r\n\r\n\t\treturn target1;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nOrientedBox.prototype.distanceToPoint = ( function () {\r\n\r\n\tconst target = new Vector3();\r\n\treturn function distanceToPoint( point ) {\r\n\r\n\t\tthis.closestPointToPoint( point, target );\r\n\t\treturn point.distanceTo( target );\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nOrientedBox.prototype.distanceToBox = ( function () {\r\n\r\n\tconst xyzFields = [ 'x', 'y', 'z' ];\r\n\tconst segments1 = new Array( 12 ).fill().map( () => new Line3() );\r\n\tconst segments2 = new Array( 12 ).fill().map( () => new Line3() );\r\n\r\n\tconst point1 = new Vector3();\r\n\tconst point2 = new Vector3();\r\n\r\n\t// early out if we find a value below threshold\r\n\treturn function distanceToBox( box, threshold = 0, target1 = null, target2 = null ) {\r\n\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.intersectsBox( box ) ) {\r\n\r\n\t\t\tif ( target1 || target2 ) {\r\n\r\n\t\t\t\tbox.getCenter( point2 );\r\n\t\t\t\tthis.closestPointToPoint( point2, point1 );\r\n\t\t\t\tbox.closestPointToPoint( point1, point2 );\r\n\r\n\t\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn 0;\r\n\r\n\t\t}\r\n\r\n\t\tconst threshold2 = threshold * threshold;\r\n\t\tconst min = box.min;\r\n\t\tconst max = box.max;\r\n\t\tconst points = this.points;\r\n\r\n\r\n\t\t// iterate over every edge and compare distances\r\n\t\tlet closestDistanceSq = Infinity;\r\n\r\n\t\t// check over all these points\r\n\t\tfor ( let i = 0; i < 8; i ++ ) {\r\n\r\n\t\t\tconst p = points[ i ];\r\n\t\t\tpoint2.copy( p ).clamp( min, max );\r\n\r\n\t\t\tconst dist = p.distanceToSquared( point2 );\r\n\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\tif ( target1 ) target1.copy( p );\r\n\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// generate and check all line segment distances\r\n\t\tlet count = 0;\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tfor ( let i1 = 0; i1 <= 1; i1 ++ ) {\r\n\r\n\t\t\t\tfor ( let i2 = 0; i2 <= 1; i2 ++ ) {\r\n\r\n\t\t\t\t\tconst nextIndex = ( i + 1 ) % 3;\r\n\t\t\t\t\tconst nextIndex2 = ( i + 2 ) % 3;\r\n\r\n\t\t\t\t\t// get obb line segments\r\n\t\t\t\t\tconst index = i1 << nextIndex | i2 << nextIndex2;\r\n\t\t\t\t\tconst index2 = 1 << i | i1 << nextIndex | i2 << nextIndex2;\r\n\t\t\t\t\tconst p1 = points[ index ];\r\n\t\t\t\t\tconst p2 = points[ index2 ];\r\n\t\t\t\t\tconst line1 = segments1[ count ];\r\n\t\t\t\t\tline1.set( p1, p2 );\r\n\r\n\r\n\t\t\t\t\t// get aabb line segments\r\n\t\t\t\t\tconst f1 = xyzFields[ i ];\r\n\t\t\t\t\tconst f2 = xyzFields[ nextIndex ];\r\n\t\t\t\t\tconst f3 = xyzFields[ nextIndex2 ];\r\n\t\t\t\t\tconst line2 = segments2[ count ];\r\n\t\t\t\t\tconst start = line2.start;\r\n\t\t\t\t\tconst end = line2.end;\r\n\r\n\t\t\t\t\tstart[ f1 ] = min[ f1 ];\r\n\t\t\t\t\tstart[ f2 ] = i1 ? min[ f2 ] : max[ f2 ];\r\n\t\t\t\t\tstart[ f3 ] = i2 ? min[ f3 ] : max[ f2 ];\r\n\r\n\t\t\t\t\tend[ f1 ] = max[ f1 ];\r\n\t\t\t\t\tend[ f2 ] = i1 ? min[ f2 ] : max[ f2 ];\r\n\t\t\t\t\tend[ f3 ] = i2 ? min[ f3 ] : max[ f2 ];\r\n\r\n\t\t\t\t\tcount ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// check all the other boxes point\r\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\r\n\r\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\r\n\r\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\r\n\r\n\t\t\t\t\tpoint2.x = x ? max.x : min.x;\r\n\t\t\t\t\tpoint2.y = y ? max.y : min.y;\r\n\t\t\t\t\tpoint2.z = z ? max.z : min.z;\r\n\r\n\t\t\t\t\tthis.closestPointToPoint( point2, point1 );\r\n\t\t\t\t\tconst dist = point2.distanceToSquared( point1 );\r\n\t\t\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( let i = 0; i < 12; i ++ ) {\r\n\r\n\t\t\tconst l1 = segments1[ i ];\r\n\t\t\tfor ( let i2 = 0; i2 < 12; i2 ++ ) {\r\n\r\n\t\t\t\tconst l2 = segments2[ i2 ];\r\n\t\t\t\tclosestPointsSegmentToSegment( l1, l2, point1, point2 );\r\n\t\t\t\tconst dist = point1.distanceToSquared( point2 );\r\n\t\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn Math.sqrt( closestDistanceSq );\r\n\r\n\t};\r\n\r\n} )();\r\n","import { Vector3, Vector2, Triangle, DoubleSide, BackSide } from 'three';\r\n\r\n// Ripped and modified From THREE.js Mesh raycast\r\n// https://github.com/mrdoob/three.js/blob/0aa87c999fe61e216c1133fba7a95772b503eddf/src/objects/Mesh.js#L115\r\nconst vA = /* @__PURE__ */ new Vector3();\r\nconst vB = /* @__PURE__ */ new Vector3();\r\nconst vC = /* @__PURE__ */ new Vector3();\r\n\r\nconst uvA = /* @__PURE__ */ new Vector2();\r\nconst uvB = /* @__PURE__ */ new Vector2();\r\nconst uvC = /* @__PURE__ */ new Vector2();\r\n\r\nconst intersectionPoint = /* @__PURE__ */ new Vector3();\r\nfunction checkIntersection( ray, pA, pB, pC, point, side ) {\r\n\r\n\tlet intersect;\r\n\tif ( side === BackSide ) {\r\n\r\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\r\n\r\n\t} else {\r\n\r\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, side !== DoubleSide, point );\r\n\r\n\t}\r\n\r\n\tif ( intersect === null ) return null;\r\n\r\n\tconst distance = ray.origin.distanceTo( point );\r\n\r\n\treturn {\r\n\r\n\t\tdistance: distance,\r\n\t\tpoint: point.clone(),\r\n\r\n\t};\r\n\r\n}\r\n\r\nfunction checkBufferGeometryIntersection( ray, position, uv, a, b, c, side ) {\r\n\r\n\tvA.fromBufferAttribute( position, a );\r\n\tvB.fromBufferAttribute( position, b );\r\n\tvC.fromBufferAttribute( position, c );\r\n\r\n\tconst intersection = checkIntersection( ray, vA, vB, vC, intersectionPoint, side );\r\n\r\n\tif ( intersection ) {\r\n\r\n\t\tif ( uv ) {\r\n\r\n\t\t\tuvA.fromBufferAttribute( uv, a );\r\n\t\t\tuvB.fromBufferAttribute( uv, b );\r\n\t\t\tuvC.fromBufferAttribute( uv, c );\r\n\r\n\t\t\tintersection.uv = Triangle.getUV( intersectionPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2( ) );\r\n\r\n\t\t}\r\n\r\n\t\tconst face = {\r\n\t\t\ta: a,\r\n\t\t\tb: b,\r\n\t\t\tc: c,\r\n\t\t\tnormal: new Vector3(),\r\n\t\t\tmaterialIndex: 0\r\n\t\t};\r\n\r\n\t\tTriangle.getNormal( vA, vB, vC, face.normal );\r\n\r\n\t\tintersection.face = face;\r\n\t\tintersection.faceIndex = a;\r\n\r\n\t}\r\n\r\n\treturn intersection;\r\n\r\n}\r\n\r\n// https://github.com/mrdoob/three.js/blob/0aa87c999fe61e216c1133fba7a95772b503eddf/src/objects/Mesh.js#L258\r\nfunction intersectTri( geo, side, ray, tri, intersections ) {\r\n\r\n\tconst triOffset = tri * 3;\r\n\tconst a = geo.index.getX( triOffset );\r\n\tconst b = geo.index.getX( triOffset + 1 );\r\n\tconst c = geo.index.getX( triOffset + 2 );\r\n\r\n\tconst intersection = checkBufferGeometryIntersection( ray, geo.attributes.position, geo.attributes.uv, a, b, c, side );\r\n\r\n\tif ( intersection ) {\r\n\r\n\t\tintersection.faceIndex = tri;\r\n\t\tif ( intersections ) intersections.push( intersection );\r\n\t\treturn intersection;\r\n\r\n\t}\r\n\r\n\treturn null;\r\n\r\n}\r\n\r\nexport { intersectTri };\r\n","import { intersectTri } from './ThreeRayIntersectUtilities.js';\r\n\r\nexport function intersectTris( geo, side, ray, offset, count, intersections ) {\r\n\r\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\r\n\r\n\t\tintersectTri( geo, side, ray, i, intersections );\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport function intersectClosestTri( geo, side, ray, offset, count ) {\r\n\r\n\tlet dist = Infinity;\r\n\tlet res = null;\r\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\r\n\r\n\t\tconst intersection = intersectTri( geo, side, ray, i );\r\n\t\tif ( intersection && intersection.distance < dist ) {\r\n\r\n\t\t\tres = intersection;\r\n\t\t\tdist = intersection.distance;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn res;\r\n\r\n}\r\n\r\n// converts the given BVH raycast intersection to align with the three.js raycast\r\n// structure (include object, world space distance and point).\r\nexport function convertRaycastIntersect( hit, object, raycaster ) {\r\n\r\n\tif ( hit === null ) {\r\n\r\n\t\treturn null;\r\n\r\n\t}\r\n\r\n\thit.point.applyMatrix4( object.matrixWorld );\r\n\thit.distance = hit.point.distanceTo( raycaster.ray.origin );\r\n\thit.object = object;\r\n\r\n\tif ( hit.distance < raycaster.near || hit.distance > raycaster.far ) {\r\n\r\n\t\treturn null;\r\n\r\n\t} else {\r\n\r\n\t\treturn hit;\r\n\r\n\t}\r\n\r\n}\r\n","\r\nimport { Vector2, Vector3, Triangle } from 'three';\r\n\r\n// sets the vertices of triangle `tri` with the 3 vertices after i\r\nexport function setTriangle( tri, i, index, pos ) {\r\n\r\n\tconst ta = tri.a;\r\n\tconst tb = tri.b;\r\n\tconst tc = tri.c;\r\n\r\n\tlet i0 = i;\r\n\tlet i1 = i + 1;\r\n\tlet i2 = i + 2;\r\n\tif ( index ) {\r\n\r\n\t\ti0 = index.getX( i );\r\n\t\ti1 = index.getX( i + 1 );\r\n\t\ti2 = index.getX( i + 2 );\r\n\r\n\t}\r\n\r\n\tta.x = pos.getX( i0 );\r\n\tta.y = pos.getY( i0 );\r\n\tta.z = pos.getZ( i0 );\r\n\r\n\ttb.x = pos.getX( i1 );\r\n\ttb.y = pos.getY( i1 );\r\n\ttb.z = pos.getZ( i1 );\r\n\r\n\ttc.x = pos.getX( i2 );\r\n\ttc.y = pos.getY( i2 );\r\n\ttc.z = pos.getZ( i2 );\r\n\r\n}\r\n\r\nexport function iterateOverTriangles(\r\n\toffset,\r\n\tcount,\r\n\tgeometry,\r\n\tintersectsTriangleFunc,\r\n\tcontained,\r\n\tdepth,\r\n\ttriangle\r\n) {\r\n\r\n\tconst index = geometry.index;\r\n\tconst pos = geometry.attributes.position;\r\n\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\r\n\r\n\t\tsetTriangle( triangle, i * 3, index, pos );\r\n\t\ttriangle.needsUpdate = true;\r\n\r\n\t\tif ( intersectsTriangleFunc( triangle, i, contained, depth ) ) {\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn false;\r\n\r\n}\r\n\r\nconst tempV1 = /* @__PURE__ */ new Vector3();\r\nconst tempV2 = /* @__PURE__ */ new Vector3();\r\nconst tempV3 = /* @__PURE__ */ new Vector3();\r\nconst tempUV1 = /* @__PURE__ */ new Vector2();\r\nconst tempUV2 = /* @__PURE__ */ new Vector2();\r\nconst tempUV3 = /* @__PURE__ */ new Vector2();\r\n\r\nexport function getTriangleHitPointInfo( point, geometry, triangleIndex, target ) {\r\n\r\n\tconst indices = geometry.getIndex().array;\r\n\tconst positions = geometry.getAttribute( 'position' );\r\n\tconst uvs = geometry.getAttribute( 'uv' );\r\n\r\n\tconst a = indices[ triangleIndex * 3 ];\r\n\tconst b = indices[ triangleIndex * 3 + 1 ];\r\n\tconst c = indices[ triangleIndex * 3 + 2 ];\r\n\r\n\ttempV1.fromBufferAttribute( positions, a );\r\n\ttempV2.fromBufferAttribute( positions, b );\r\n\ttempV3.fromBufferAttribute( positions, c );\r\n\r\n\t// find the associated material index\r\n\tlet materialIndex = 0;\r\n\tconst groups = geometry.groups;\r\n\tconst firstVertexIndex = triangleIndex * 3;\r\n\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\r\n\r\n\t\tconst group = groups[ i ];\r\n\t\tconst { start, count } = group;\r\n\t\tif ( firstVertexIndex >= start && firstVertexIndex < start + count ) {\r\n\r\n\t\t\tmaterialIndex = group.materialIndex;\r\n\t\t\tbreak;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// extract uvs\r\n\tlet uv = null;\r\n\tif ( uvs ) {\r\n\r\n\t\ttempUV1.fromBufferAttribute( uvs, a );\r\n\t\ttempUV2.fromBufferAttribute( uvs, b );\r\n\t\ttempUV3.fromBufferAttribute( uvs, c );\r\n\r\n\t\tif ( target && target.uv ) uv = target.uv;\r\n\t\telse uv = new Vector2();\r\n\r\n\t\tTriangle.getUV( point, tempV1, tempV2, tempV3, tempUV1, tempUV2, tempUV3, uv );\r\n\r\n\t}\r\n\r\n\t// adjust the provided target or create a new one\r\n\tif ( target ) {\r\n\r\n\t\tif ( ! target.face ) target.face = { };\r\n\t\ttarget.face.a = a;\r\n\t\ttarget.face.b = b;\r\n\t\ttarget.face.c = c;\r\n\t\ttarget.face.materialIndex = materialIndex;\r\n\t\tif ( ! target.face.normal ) target.face.normal = new Vector3();\r\n\t\tTriangle.getNormal( tempV1, tempV2, tempV3, target.face.normal );\r\n\r\n\t\tif ( ! target.uv ) target.uv = new Vector2();\r\n\t\ttarget.uv.copy( uv );\r\n\r\n\t\treturn target;\r\n\r\n\t} else {\r\n\r\n\t\treturn {\r\n\t\t\tface: {\r\n\t\t\t\ta: a,\r\n\t\t\t\tb: b,\r\n\t\t\t\tc: c,\r\n\t\t\t\tmaterialIndex: materialIndex,\r\n\t\t\t\tnormal: Triangle.getNormal( tempV1, tempV2, tempV3, new Vector3() )\r\n\t\t\t},\r\n\t\t\tuv: uv\r\n\t\t};\r\n\r\n\t}\r\n\r\n}\r\n","export class PrimitivePool {\r\n\r\n\tconstructor( getNewPrimitive ) {\r\n\r\n\t\tthis._getNewPrimitive = getNewPrimitive;\r\n\t\tthis._primitives = [];\r\n\r\n\t}\r\n\r\n\tgetPrimitive() {\r\n\r\n\t\tconst primitives = this._primitives;\r\n\t\tif ( primitives.length === 0 ) {\r\n\r\n\t\t\treturn this._getNewPrimitive();\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn primitives.pop();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treleasePrimitive( primitive ) {\r\n\r\n\t\tthis._primitives.push( primitive );\r\n\r\n\t}\r\n\r\n}\r\n","export function IS_LEAF( n16, uint16Array ) {\r\n\r\n\treturn uint16Array[ n16 + 15 ] === 0xFFFF;\r\n\r\n}\r\n\r\nexport function OFFSET( n32, uint32Array ) {\r\n\r\n\treturn uint32Array[ n32 + 6 ];\r\n\r\n}\r\n\r\nexport function COUNT( n16, uint16Array ) {\r\n\r\n\treturn uint16Array[ n16 + 14 ];\r\n\r\n}\r\n\r\nexport function LEFT_NODE( n32 ) {\r\n\r\n\treturn n32 + 8;\r\n\r\n}\r\n\r\nexport function RIGHT_NODE( n32, uint32Array ) {\r\n\r\n\treturn uint32Array[ n32 + 6 ];\r\n\r\n}\r\n\r\nexport function SPLIT_AXIS( n32, uint32Array ) {\r\n\r\n\treturn uint32Array[ n32 + 7 ];\r\n\r\n}\r\n\r\nexport function BOUNDING_DATA_INDEX( n32 ) {\r\n\r\n\treturn n32;\r\n\r\n}\r\n","import { Box3, Vector3, Matrix4 } from 'three';\r\nimport { CONTAINED } from './Constants.js';\r\n\r\nimport { OrientedBox } from '../math/OrientedBox.js';\r\nimport { ExtendedTriangle } from '../math/ExtendedTriangle.js';\r\nimport { intersectTris, intersectClosestTri } from '../utils/GeometryRayIntersectUtilities.js';\r\nimport { setTriangle } from '../utils/TriangleUtilities.js';\r\nimport { arrayToBox } from '../utils/ArrayBoxUtilities.js';\r\nimport { PrimitivePool } from '../utils/PrimitivePool.js';\r\nimport { COUNT, OFFSET, LEFT_NODE, RIGHT_NODE, IS_LEAF, BOUNDING_DATA_INDEX, SPLIT_AXIS } from './nodeBufferFunctions.js';\r\n\r\nconst boundingBox = new Box3();\r\nconst boxIntersection = new Vector3();\r\nconst xyzFields = [ 'x', 'y', 'z' ];\r\n\r\nexport function raycast( nodeIndex32, geometry, side, ray, intersects ) {\r\n\r\n\tlet nodeIndex16 = nodeIndex32 * 2, float32Array = _float32Array, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\r\n\tif ( isLeaf ) {\r\n\r\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\r\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\r\n\r\n\t\tintersectTris( geometry, side, ray, offset, count, intersects );\r\n\r\n\t} else {\r\n\r\n\t\tconst leftIndex = LEFT_NODE( nodeIndex32 );\r\n\t\tif ( intersectRay( leftIndex, float32Array, ray, boxIntersection ) ) {\r\n\r\n\t\t\traycast( leftIndex, geometry, side, ray, intersects );\r\n\r\n\t\t}\r\n\r\n\t\tconst rightIndex = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\t\tif ( intersectRay( rightIndex, float32Array, ray, boxIntersection ) ) {\r\n\r\n\t\t\traycast( rightIndex, geometry, side, ray, intersects );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport function raycastFirst( nodeIndex32, geometry, side, ray ) {\r\n\r\n\tlet nodeIndex16 = nodeIndex32 * 2, float32Array = _float32Array, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\r\n\tif ( isLeaf ) {\r\n\r\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\r\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\r\n\t\treturn intersectClosestTri( geometry, side, ray, offset, count );\r\n\r\n\t} else {\r\n\r\n\t\t// consider the position of the split plane with respect to the oncoming ray; whichever direction\r\n\t\t// the ray is coming from, look for an intersection among that side of the tree first\r\n\t\tconst splitAxis = SPLIT_AXIS( nodeIndex32, uint32Array );\r\n\t\tconst xyzAxis = xyzFields[ splitAxis ];\r\n\t\tconst rayDir = ray.direction[ xyzAxis ];\r\n\t\tconst leftToRight = rayDir >= 0;\r\n\r\n\t\t// c1 is the child to check first\r\n\t\tlet c1, c2;\r\n\t\tif ( leftToRight ) {\r\n\r\n\t\t\tc1 = LEFT_NODE( nodeIndex32 );\r\n\t\t\tc2 = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tc1 = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\t\t\tc2 = LEFT_NODE( nodeIndex32 );\r\n\r\n\t\t}\r\n\r\n\t\tconst c1Intersection = intersectRay( c1, float32Array, ray, boxIntersection );\r\n\t\tconst c1Result = c1Intersection ? raycastFirst( c1, geometry, side, ray ) : null;\r\n\r\n\t\t// if we got an intersection in the first node and it's closer than the second node's bounding\r\n\t\t// box, we don't need to consider the second node because it couldn't possibly be a better result\r\n\t\tif ( c1Result ) {\r\n\r\n\t\t\t// check if the point is within the second bounds\r\n\t\t\t// \"point\" is in the local frame of the bvh\r\n\t\t\tconst point = c1Result.point[ xyzAxis ];\r\n\t\t\tconst isOutside = leftToRight ?\r\n\t\t\t\tpoint <= float32Array[ c2 + splitAxis ] : // min bounding data\r\n\t\t\t\tpoint >= float32Array[ c2 + splitAxis + 3 ]; // max bounding data\r\n\r\n\t\t\tif ( isOutside ) {\r\n\r\n\t\t\t\treturn c1Result;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// either there was no intersection in the first node, or there could still be a closer\r\n\t\t// intersection in the second, so check the second node and then take the better of the two\r\n\t\tconst c2Intersection = intersectRay( c2, float32Array, ray, boxIntersection );\r\n\t\tconst c2Result = c2Intersection ? raycastFirst( c2, geometry, side, ray ) : null;\r\n\r\n\t\tif ( c1Result && c2Result ) {\r\n\r\n\t\t\treturn c1Result.distance <= c2Result.distance ? c1Result : c2Result;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn c1Result || c2Result || null;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport const shapecast = ( function () {\r\n\r\n\tlet _box1, _box2;\r\n\tconst boxStack = [];\r\n\tconst boxPool = new PrimitivePool( () => new Box3() );\r\n\r\n\treturn function shapecast( ...args ) {\r\n\r\n\t\t_box1 = boxPool.getPrimitive();\r\n\t\t_box2 = boxPool.getPrimitive();\r\n\t\tboxStack.push( _box1, _box2 );\r\n\r\n\t\tconst result = shapecastTraverse( ...args );\r\n\r\n\t\tboxPool.releasePrimitive( _box1 );\r\n\t\tboxPool.releasePrimitive( _box2 );\r\n\t\tboxStack.pop();\r\n\t\tboxStack.pop();\r\n\r\n\t\tconst length = boxStack.length;\r\n\t\tif ( length > 0 ) {\r\n\r\n\t\t\t_box2 = boxStack[ length - 1 ];\r\n\t\t\t_box1 = boxStack[ length - 2 ];\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t};\r\n\r\n\tfunction shapecastTraverse(\r\n\t\tnodeIndex32,\r\n\t\tgeometry,\r\n\t\tintersectsBoundsFunc,\r\n\t\tintersectsRangeFunc,\r\n\t\tnodeScoreFunc = null,\r\n\t\tnodeIndexByteOffset = 0, // offset for unique node identifier\r\n\t\tdepth = 0\r\n\t) {\r\n\r\n\t\t// Define these inside the function so it has access to the local variables needed\r\n\t\t// when converting to the buffer equivalents\r\n\t\tfunction getLeftOffset( nodeIndex32 ) {\r\n\r\n\t\t\tlet nodeIndex16 = nodeIndex32 * 2, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\t\t\t// traverse until we find a leaf\r\n\t\t\twhile ( ! IS_LEAF( nodeIndex16, uint16Array ) ) {\r\n\r\n\t\t\t\tnodeIndex32 = LEFT_NODE( nodeIndex32 );\r\n\t\t\t\tnodeIndex16 = nodeIndex32 * 2;\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn OFFSET( nodeIndex32, uint32Array );\r\n\r\n\t\t}\r\n\r\n\t\tfunction getRightEndOffset( nodeIndex32 ) {\r\n\r\n\t\t\tlet nodeIndex16 = nodeIndex32 * 2, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\t\t\t// traverse until we find a leaf\r\n\t\t\twhile ( ! IS_LEAF( nodeIndex16, uint16Array ) ) {\r\n\r\n\t\t\t\t// adjust offset to point to the right node\r\n\t\t\t\tnodeIndex32 = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\t\t\t\tnodeIndex16 = nodeIndex32 * 2;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// return the end offset of the triangle range\r\n\t\t\treturn OFFSET( nodeIndex32, uint32Array ) + COUNT( nodeIndex16, uint16Array );\r\n\r\n\t\t}\r\n\r\n\t\tlet nodeIndex16 = nodeIndex32 * 2, float32Array = _float32Array, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\t\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\r\n\t\tif ( isLeaf ) {\r\n\r\n\t\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\r\n\t\t\tconst count = COUNT( nodeIndex16, uint16Array );\r\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( nodeIndex32 ), float32Array, _box1 );\r\n\t\t\treturn intersectsRangeFunc( offset, count, false, depth, nodeIndexByteOffset + nodeIndex32, _box1 );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconst left = LEFT_NODE( nodeIndex32 );\r\n\t\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\t\t\tlet c1 = left;\r\n\t\t\tlet c2 = right;\r\n\r\n\t\t\tlet score1, score2;\r\n\t\t\tlet box1, box2;\r\n\t\t\tif ( nodeScoreFunc ) {\r\n\r\n\t\t\t\tbox1 = _box1;\r\n\t\t\t\tbox2 = _box2;\r\n\r\n\t\t\t\t// bounding data is not offset\r\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c1 ), float32Array, box1 );\r\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c2 ), float32Array, box2 );\r\n\r\n\t\t\t\tscore1 = nodeScoreFunc( box1 );\r\n\t\t\t\tscore2 = nodeScoreFunc( box2 );\r\n\r\n\t\t\t\tif ( score2 < score1 ) {\r\n\r\n\t\t\t\t\tc1 = right;\r\n\t\t\t\t\tc2 = left;\r\n\r\n\t\t\t\t\tconst temp = score1;\r\n\t\t\t\t\tscore1 = score2;\r\n\t\t\t\t\tscore2 = temp;\r\n\r\n\t\t\t\t\tbox1 = box2;\r\n\t\t\t\t\t// box2 is always set before use below\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Check box 1 intersection\r\n\t\t\tif ( ! box1 ) {\r\n\r\n\t\t\t\tbox1 = _box1;\r\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c1 ), float32Array, box1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tconst isC1Leaf = IS_LEAF( c1 * 2, uint16Array );\r\n\t\t\tconst c1Intersection = intersectsBoundsFunc( box1, isC1Leaf, score1, depth + 1, nodeIndexByteOffset + c1 );\r\n\r\n\t\t\tlet c1StopTraversal;\r\n\t\t\tif ( c1Intersection === CONTAINED ) {\r\n\r\n\t\t\t\tconst offset = getLeftOffset( c1 );\r\n\t\t\t\tconst end = getRightEndOffset( c1 );\r\n\t\t\t\tconst count = end - offset;\r\n\r\n\t\t\t\tc1StopTraversal = intersectsRangeFunc( offset, count, true, depth + 1, nodeIndexByteOffset + c1, box1 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tc1StopTraversal =\r\n\t\t\t\t\tc1Intersection &&\r\n\t\t\t\t\tshapecastTraverse(\r\n\t\t\t\t\t\tc1,\r\n\t\t\t\t\t\tgeometry,\r\n\t\t\t\t\t\tintersectsBoundsFunc,\r\n\t\t\t\t\t\tintersectsRangeFunc,\r\n\t\t\t\t\t\tnodeScoreFunc,\r\n\t\t\t\t\t\tnodeIndexByteOffset,\r\n\t\t\t\t\t\tdepth + 1\r\n\t\t\t\t\t);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( c1StopTraversal ) return true;\r\n\r\n\t\t\t// Check box 2 intersection\r\n\t\t\t// cached box2 will have been overwritten by previous traversal\r\n\t\t\tbox2 = _box2;\r\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c2 ), float32Array, box2 );\r\n\r\n\t\t\tconst isC2Leaf = IS_LEAF( c2 * 2, uint16Array );\r\n\t\t\tconst c2Intersection = intersectsBoundsFunc( box2, isC2Leaf, score2, depth + 1, nodeIndexByteOffset + c2 );\r\n\r\n\t\t\tlet c2StopTraversal;\r\n\t\t\tif ( c2Intersection === CONTAINED ) {\r\n\r\n\t\t\t\tconst offset = getLeftOffset( c2 );\r\n\t\t\t\tconst end = getRightEndOffset( c2 );\r\n\t\t\t\tconst count = end - offset;\r\n\r\n\t\t\t\tc2StopTraversal = intersectsRangeFunc( offset, count, true, depth + 1, nodeIndexByteOffset + c2, box2 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tc2StopTraversal =\r\n\t\t\t\t\tc2Intersection &&\r\n\t\t\t\t\tshapecastTraverse(\r\n\t\t\t\t\t\tc2,\r\n\t\t\t\t\t\tgeometry,\r\n\t\t\t\t\t\tintersectsBoundsFunc,\r\n\t\t\t\t\t\tintersectsRangeFunc,\r\n\t\t\t\t\t\tnodeScoreFunc,\r\n\t\t\t\t\t\tnodeIndexByteOffset,\r\n\t\t\t\t\t\tdepth + 1\r\n\t\t\t\t\t);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( c2StopTraversal ) return true;\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n} )();\r\n\r\nexport const intersectsGeometry = ( function () {\r\n\r\n\tconst triangle = new ExtendedTriangle();\r\n\tconst triangle2 = new ExtendedTriangle();\r\n\tconst invertedMat = new Matrix4();\r\n\r\n\tconst obb = new OrientedBox();\r\n\tconst obb2 = new OrientedBox();\r\n\r\n\treturn function intersectsGeometry( nodeIndex32, geometry, otherGeometry, geometryToBvh, cachedObb = null ) {\r\n\r\n\t\tlet nodeIndex16 = nodeIndex32 * 2, float32Array = _float32Array, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\t\tif ( cachedObb === null ) {\r\n\r\n\t\t\tif ( ! otherGeometry.boundingBox ) {\r\n\r\n\t\t\t\totherGeometry.computeBoundingBox();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\r\n\t\t\tcachedObb = obb;\r\n\r\n\t\t}\r\n\r\n\t\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\r\n\t\tif ( isLeaf ) {\r\n\r\n\t\t\tconst thisGeometry = geometry;\r\n\t\t\tconst thisIndex = thisGeometry.index;\r\n\t\t\tconst thisPos = thisGeometry.attributes.position;\r\n\r\n\t\t\tconst index = otherGeometry.index;\r\n\t\t\tconst pos = otherGeometry.attributes.position;\r\n\r\n\t\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\r\n\t\t\tconst count = COUNT( nodeIndex16, uint16Array );\r\n\r\n\t\t\t// get the inverse of the geometry matrix so we can transform our triangles into the\r\n\t\t\t// geometry space we're trying to test. We assume there are fewer triangles being checked\r\n\t\t\t// here.\r\n\t\t\tinvertedMat.copy( geometryToBvh ).invert();\r\n\r\n\t\t\tif ( otherGeometry.boundsTree ) {\r\n\r\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( nodeIndex32 ), float32Array, obb2 );\r\n\t\t\t\tobb2.matrix.copy( invertedMat );\r\n\t\t\t\tobb2.needsUpdate = true;\r\n\r\n\t\t\t\tconst res = otherGeometry.boundsTree.shapecast( {\r\n\r\n\t\t\t\t\tintersectsBounds: box => obb2.intersectsBox( box ),\r\n\r\n\t\t\t\t\tintersectsTriangle: tri => {\r\n\r\n\t\t\t\t\t\ttri.a.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\ttri.b.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\ttri.c.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\ttri.needsUpdate = true;\r\n\r\n\t\t\t\t\t\tfor ( let i = offset * 3, l = ( count + offset ) * 3; i < l; i += 3 ) {\r\n\r\n\t\t\t\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\r\n\t\t\t\t\t\t\tsetTriangle( triangle2, i, thisIndex, thisPos );\r\n\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\r\n\t\t\t\t\t\t\tif ( tri.intersectsTriangle( triangle2 ) ) {\r\n\r\n\t\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} );\r\n\r\n\t\t\t\treturn res;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tfor ( let i = offset * 3, l = ( count + offset * 3 ); i < l; i += 3 ) {\r\n\r\n\t\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\r\n\t\t\t\t\tsetTriangle( triangle, i, thisIndex, thisPos );\r\n\t\t\t\t\ttriangle.a.applyMatrix4( invertedMat );\r\n\t\t\t\t\ttriangle.b.applyMatrix4( invertedMat );\r\n\t\t\t\t\ttriangle.c.applyMatrix4( invertedMat );\r\n\t\t\t\t\ttriangle.needsUpdate = true;\r\n\r\n\t\t\t\t\tfor ( let i2 = 0, l2 = index.count; i2 < l2; i2 += 3 ) {\r\n\r\n\t\t\t\t\t\tsetTriangle( triangle2, i2, index, pos );\r\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\r\n\r\n\t\t\t\t\t\tif ( triangle.intersectsTriangle( triangle2 ) ) {\r\n\r\n\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconst left = nodeIndex32 + 8;\r\n\t\t\tconst right = uint32Array[ nodeIndex32 + 6 ];\r\n\r\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( left ), float32Array, boundingBox );\r\n\t\t\tconst leftIntersection =\r\n\t\t\t\tcachedObb.intersectsBox( boundingBox ) &&\r\n\t\t\t\tintersectsGeometry( left, geometry, otherGeometry, geometryToBvh, cachedObb );\r\n\r\n\t\t\tif ( leftIntersection ) return true;\r\n\r\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( right ), float32Array, boundingBox );\r\n\t\t\tconst rightIntersection =\r\n\t\t\t\tcachedObb.intersectsBox( boundingBox ) &&\r\n\t\t\t\tintersectsGeometry( right, geometry, otherGeometry, geometryToBvh, cachedObb );\r\n\r\n\t\t\tif ( rightIntersection ) return true;\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nfunction intersectRay( nodeIndex32, array, ray, target ) {\r\n\r\n\tarrayToBox( nodeIndex32, array, boundingBox );\r\n\treturn ray.intersectBox( boundingBox, target );\r\n\r\n}\r\n\r\nconst bufferStack = [];\r\nlet _prevBuffer;\r\nlet _float32Array;\r\nlet _uint16Array;\r\nlet _uint32Array;\r\nexport function setBuffer( buffer ) {\r\n\r\n\tif ( _prevBuffer ) {\r\n\r\n\t\tbufferStack.push( _prevBuffer );\r\n\r\n\t}\r\n\r\n\t_prevBuffer = buffer;\r\n\t_float32Array = new Float32Array( buffer );\r\n\t_uint16Array = new Uint16Array( buffer );\r\n\t_uint32Array = new Uint32Array( buffer );\r\n\r\n}\r\n\r\nexport function clearBuffer() {\r\n\r\n\t_prevBuffer = null;\r\n\t_float32Array = null;\r\n\t_uint16Array = null;\r\n\t_uint32Array = null;\r\n\r\n\tif ( bufferStack.length ) {\r\n\r\n\t\tsetBuffer( bufferStack.pop() );\r\n\r\n\t}\r\n\r\n}\r\n","import { Vector3, BufferAttribute, Box3, FrontSide, Matrix4 } from 'three';\r\nimport { CENTER, BYTES_PER_NODE, IS_LEAFNODE_FLAG } from './Constants.js';\r\nimport { buildPackedTree } from './buildFunctions.js';\r\nimport {\r\n\traycast,\r\n\traycastFirst,\r\n\tshapecast,\r\n\tintersectsGeometry,\r\n\tsetBuffer,\r\n\tclearBuffer,\r\n} from './castFunctions.js';\r\nimport { OrientedBox } from '../math/OrientedBox.js';\r\nimport { ExtendedTriangle } from '../math/ExtendedTriangle.js';\r\nimport { PrimitivePool } from '../utils/PrimitivePool.js';\r\nimport { arrayToBox } from '../utils/ArrayBoxUtilities.js';\r\nimport { iterateOverTriangles, setTriangle } from '../utils/TriangleUtilities.js';\r\n\r\nconst SKIP_GENERATION = Symbol( 'skip tree generation' );\r\n\r\nconst aabb = /* @__PURE__ */ new Box3();\r\nconst aabb2 = /* @__PURE__ */ new Box3();\r\nconst tempMatrix = /* @__PURE__ */ new Matrix4();\r\nconst obb = /* @__PURE__ */ new OrientedBox();\r\nconst obb2 = /* @__PURE__ */ new OrientedBox();\r\nconst temp = /* @__PURE__ */ new Vector3();\r\nconst temp1 = /* @__PURE__ */ new Vector3();\r\nconst temp2 = /* @__PURE__ */ new Vector3();\r\nconst temp3 = /* @__PURE__ */ new Vector3();\r\nconst temp4 = /* @__PURE__ */ new Vector3();\r\nconst tempBox = /* @__PURE__ */ new Box3();\r\nconst trianglePool = /* @__PURE__ */ new PrimitivePool( () => new ExtendedTriangle() );\r\n\r\nexport class MeshBVH {\r\n\r\n\tstatic serialize( bvh, options = {} ) {\r\n\r\n\t\tif ( options.isBufferGeometry ) {\r\n\r\n\t\t\tconsole.warn( 'MeshBVH.serialize: The arguments for the function have changed. See documentation for new signature.' );\r\n\r\n\t\t\treturn MeshBVH.serialize(\r\n\t\t\t\targuments[ 0 ],\r\n\t\t\t\t{\r\n\t\t\t\t\tcloneBuffers: arguments[ 2 ] === undefined ? true : arguments[ 2 ],\r\n\t\t\t\t}\r\n\t\t\t);\r\n\r\n\t\t}\r\n\r\n\t\toptions = {\r\n\t\t\tcloneBuffers: true,\r\n\t\t\t...options,\r\n\t\t};\r\n\r\n\t\tconst geometry = bvh.geometry;\r\n\t\tconst rootData = bvh._roots;\r\n\t\tconst indexAttribute = geometry.getIndex();\r\n\t\tlet result;\r\n\t\tif ( options.cloneBuffers ) {\r\n\r\n\t\t\tresult = {\r\n\t\t\t\troots: rootData.map( root => root.slice() ),\r\n\t\t\t\tindex: indexAttribute.array.slice(),\r\n\t\t\t};\r\n\r\n\t\t} else {\r\n\r\n\t\t\tresult = {\r\n\t\t\t\troots: rootData,\r\n\t\t\t\tindex: indexAttribute.array,\r\n\t\t\t};\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n\tstatic deserialize( data, geometry, options = {} ) {\r\n\r\n\t\tif ( typeof options === 'boolean' ) {\r\n\r\n\t\t\tconsole.warn( 'MeshBVH.deserialize: The arguments for the function have changed. See documentation for new signature.' );\r\n\r\n\t\t\treturn MeshBVH.deserialize(\r\n\t\t\t\targuments[ 0 ],\r\n\t\t\t\targuments[ 1 ],\r\n\t\t\t\t{\r\n\t\t\t\t\tsetIndex: arguments[ 2 ] === undefined ? true : arguments[ 2 ],\r\n\t\t\t\t}\r\n\t\t\t);\r\n\r\n\t\t}\r\n\r\n\t\toptions = {\r\n\t\t\tsetIndex: true,\r\n\t\t\t...options,\r\n\t\t};\r\n\r\n\t\tconst { index, roots } = data;\r\n\t\tconst bvh = new MeshBVH( geometry, { ...options, [ SKIP_GENERATION ]: true } );\r\n\t\tbvh._roots = roots;\r\n\r\n\t\tif ( options.setIndex ) {\r\n\r\n\t\t\tconst indexAttribute = geometry.getIndex();\r\n\t\t\tif ( indexAttribute === null ) {\r\n\r\n\t\t\t\tconst newIndex = new BufferAttribute( data.index, 1, false );\r\n\t\t\t\tgeometry.setIndex( newIndex );\r\n\r\n\t\t\t} else if ( indexAttribute.array !== index ) {\r\n\r\n\t\t\t\tindexAttribute.array.set( index );\r\n\t\t\t\tindexAttribute.needsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn bvh;\r\n\r\n\t}\r\n\r\n\tconstructor( geometry, options = {} ) {\r\n\r\n\t\tif ( ! geometry.isBufferGeometry ) {\r\n\r\n\t\t\tthrow new Error( 'MeshBVH: Only BufferGeometries are supported.' );\r\n\r\n\t\t} else if ( geometry.index && geometry.index.isInterleavedBufferAttribute ) {\r\n\r\n\t\t\tthrow new Error( 'MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.' );\r\n\r\n\t\t}\r\n\r\n\t\t// default options\r\n\t\toptions = Object.assign( {\r\n\r\n\t\t\tstrategy: CENTER,\r\n\t\t\tmaxDepth: 40,\r\n\t\t\tmaxLeafTris: 10,\r\n\t\t\tverbose: true,\r\n\t\t\tuseSharedArrayBuffer: false,\r\n\t\t\tsetBoundingBox: true,\r\n\t\t\tonProgress: null,\r\n\r\n\t\t\t// undocumented options\r\n\r\n\t\t\t// Whether to skip generating the tree. Used for deserialization.\r\n\t\t\t[ SKIP_GENERATION ]: false,\r\n\r\n\t\t}, options );\r\n\r\n\t\tif ( options.useSharedArrayBuffer && typeof SharedArrayBuffer === 'undefined' ) {\r\n\r\n\t\t\tthrow new Error( 'MeshBVH: SharedArrayBuffer is not available.' );\r\n\r\n\t\t}\r\n\r\n\t\tthis._roots = null;\r\n\t\tif ( ! options[ SKIP_GENERATION ] ) {\r\n\r\n\t\t\tthis._roots = buildPackedTree( geometry, options );\r\n\r\n\t\t\tif ( ! geometry.boundingBox && options.setBoundingBox ) {\r\n\r\n\t\t\t\tgeometry.boundingBox = this.getBoundingBox( new Box3() );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// retain references to the geometry so we can use them it without having to\r\n\t\t// take a geometry reference in every function.\r\n\t\tthis.geometry = geometry;\r\n\r\n\t}\r\n\r\n\trefit( nodeIndices = null ) {\r\n\r\n\t\tif ( nodeIndices && Array.isArray( nodeIndices ) ) {\r\n\r\n\t\t\tnodeIndices = new Set( nodeIndices );\r\n\r\n\t\t}\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tconst indexArr = geometry.index.array;\r\n\t\tconst posAttr = geometry.attributes.position;\r\n\r\n\t\tlet buffer, uint32Array, uint16Array, float32Array;\r\n\t\tlet byteOffset = 0;\r\n\t\tconst roots = this._roots;\r\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\r\n\r\n\t\t\tbuffer = roots[ i ];\r\n\t\t\tuint32Array = new Uint32Array( buffer );\r\n\t\t\tuint16Array = new Uint16Array( buffer );\r\n\t\t\tfloat32Array = new Float32Array( buffer );\r\n\r\n\t\t\t_traverse( 0, byteOffset );\r\n\t\t\tbyteOffset += buffer.byteLength;\r\n\r\n\t\t}\r\n\r\n\t\tfunction _traverse( node32Index, byteOffset, force = false ) {\r\n\r\n\t\t\tconst node16Index = node32Index * 2;\r\n\t\t\tconst isLeaf = uint16Array[ node16Index + 15 ] === IS_LEAFNODE_FLAG;\r\n\t\t\tif ( isLeaf ) {\r\n\r\n\t\t\t\tconst offset = uint32Array[ node32Index + 6 ];\r\n\t\t\t\tconst count = uint16Array[ node16Index + 14 ];\r\n\r\n\t\t\t\tlet minx = Infinity;\r\n\t\t\t\tlet miny = Infinity;\r\n\t\t\t\tlet minz = Infinity;\r\n\t\t\t\tlet maxx = - Infinity;\r\n\t\t\t\tlet maxy = - Infinity;\r\n\t\t\t\tlet maxz = - Infinity;\r\n\r\n\t\t\t\tfor ( let i = 3 * offset, l = 3 * ( offset + count ); i < l; i ++ ) {\r\n\r\n\t\t\t\t\tconst index = indexArr[ i ];\r\n\t\t\t\t\tconst x = posAttr.getX( index );\r\n\t\t\t\t\tconst y = posAttr.getY( index );\r\n\t\t\t\t\tconst z = posAttr.getZ( index );\r\n\r\n\t\t\t\t\tif ( x < minx ) minx = x;\r\n\t\t\t\t\tif ( x > maxx ) maxx = x;\r\n\r\n\t\t\t\t\tif ( y < miny ) miny = y;\r\n\t\t\t\t\tif ( y > maxy ) maxy = y;\r\n\r\n\t\t\t\t\tif ( z < minz ) minz = z;\r\n\t\t\t\t\tif ( z > maxz ) maxz = z;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tfloat32Array[ node32Index + 0 ] !== minx ||\r\n\t\t\t\t\tfloat32Array[ node32Index + 1 ] !== miny ||\r\n\t\t\t\t\tfloat32Array[ node32Index + 2 ] !== minz ||\r\n\r\n\t\t\t\t\tfloat32Array[ node32Index + 3 ] !== maxx ||\r\n\t\t\t\t\tfloat32Array[ node32Index + 4 ] !== maxy ||\r\n\t\t\t\t\tfloat32Array[ node32Index + 5 ] !== maxz\r\n\t\t\t\t) {\r\n\r\n\t\t\t\t\tfloat32Array[ node32Index + 0 ] = minx;\r\n\t\t\t\t\tfloat32Array[ node32Index + 1 ] = miny;\r\n\t\t\t\t\tfloat32Array[ node32Index + 2 ] = minz;\r\n\r\n\t\t\t\t\tfloat32Array[ node32Index + 3 ] = maxx;\r\n\t\t\t\t\tfloat32Array[ node32Index + 4 ] = maxy;\r\n\t\t\t\t\tfloat32Array[ node32Index + 5 ] = maxz;\r\n\r\n\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tconst left = node32Index + 8;\r\n\t\t\t\tconst right = uint32Array[ node32Index + 6 ];\r\n\r\n\t\t\t\t// the identifying node indices provided by the shapecast function include offsets of all\r\n\t\t\t\t// root buffers to guarantee they're unique between roots so offset left and right indices here.\r\n\t\t\t\tconst offsetLeft = left + byteOffset;\r\n\t\t\t\tconst offsetRight = right + byteOffset;\r\n\t\t\t\tlet forceChildren = force;\r\n\t\t\t\tlet includesLeft = false;\r\n\t\t\t\tlet includesRight = false;\r\n\r\n\t\t\t\tif ( nodeIndices ) {\r\n\r\n\t\t\t\t\t// if we see that neither the left or right child are included in the set that need to be updated\r\n\t\t\t\t\t// then we assume that all children need to be updated.\r\n\t\t\t\t\tif ( ! forceChildren ) {\r\n\r\n\t\t\t\t\t\tincludesLeft = nodeIndices.has( offsetLeft );\r\n\t\t\t\t\t\tincludesRight = nodeIndices.has( offsetRight );\r\n\t\t\t\t\t\tforceChildren = ! includesLeft && ! includesRight;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tincludesLeft = true;\r\n\t\t\t\t\tincludesRight = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst traverseLeft = forceChildren || includesLeft;\r\n\t\t\t\tconst traverseRight = forceChildren || includesRight;\r\n\r\n\t\t\t\tlet leftChange = false;\r\n\t\t\t\tif ( traverseLeft ) {\r\n\r\n\t\t\t\t\tleftChange = _traverse( left, byteOffset, forceChildren );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet rightChange = false;\r\n\t\t\t\tif ( traverseRight ) {\r\n\r\n\t\t\t\t\trightChange = _traverse( right, byteOffset, forceChildren );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst didChange = leftChange || rightChange;\r\n\t\t\t\tif ( didChange ) {\r\n\r\n\t\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\t\t\tconst lefti = left + i;\r\n\t\t\t\t\t\tconst righti = right + i;\r\n\t\t\t\t\t\tconst minLeftValue = float32Array[ lefti ];\r\n\t\t\t\t\t\tconst maxLeftValue = float32Array[ lefti + 3 ];\r\n\t\t\t\t\t\tconst minRightValue = float32Array[ righti ];\r\n\t\t\t\t\t\tconst maxRightValue = float32Array[ righti + 3 ];\r\n\r\n\t\t\t\t\t\tfloat32Array[ node32Index + i ] = minLeftValue < minRightValue ? minLeftValue : minRightValue;\r\n\t\t\t\t\t\tfloat32Array[ node32Index + i + 3 ] = maxLeftValue > maxRightValue ? maxLeftValue : maxRightValue;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn didChange;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\ttraverse( callback, rootIndex = 0 ) {\r\n\r\n\t\tconst buffer = this._roots[ rootIndex ];\r\n\t\tconst uint32Array = new Uint32Array( buffer );\r\n\t\tconst uint16Array = new Uint16Array( buffer );\r\n\t\t_traverse( 0 );\r\n\r\n\t\tfunction _traverse( node32Index, depth = 0 ) {\r\n\r\n\t\t\tconst node16Index = node32Index * 2;\r\n\t\t\tconst isLeaf = uint16Array[ node16Index + 15 ] === IS_LEAFNODE_FLAG;\r\n\t\t\tif ( isLeaf ) {\r\n\r\n\t\t\t\tconst offset = uint32Array[ node32Index + 6 ];\r\n\t\t\t\tconst count = uint16Array[ node16Index + 14 ];\r\n\t\t\t\tcallback( depth, isLeaf, new Float32Array( buffer, node32Index * 4, 6 ), offset, count );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// TODO: use node functions here\r\n\t\t\t\tconst left = node32Index + BYTES_PER_NODE / 4;\r\n\t\t\t\tconst right = uint32Array[ node32Index + 6 ];\r\n\t\t\t\tconst splitAxis = uint32Array[ node32Index + 7 ];\r\n\t\t\t\tconst stopTraversal = callback( depth, isLeaf, new Float32Array( buffer, node32Index * 4, 6 ), splitAxis );\r\n\r\n\t\t\t\tif ( ! stopTraversal ) {\r\n\r\n\t\t\t\t\t_traverse( left, depth + 1 );\r\n\t\t\t\t\t_traverse( right, depth + 1 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/* Core Cast Functions */\r\n\traycast( ray, materialOrSide = FrontSide ) {\r\n\r\n\t\tconst roots = this._roots;\r\n\t\tconst geometry = this.geometry;\r\n\t\tconst intersects = [];\r\n\t\tconst isMaterial = materialOrSide.isMaterial;\r\n\t\tconst isArrayMaterial = Array.isArray( materialOrSide );\r\n\r\n\t\tconst groups = geometry.groups;\r\n\t\tconst side = isMaterial ? materialOrSide.side : materialOrSide;\r\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\r\n\r\n\t\t\tconst materialSide = isArrayMaterial ? materialOrSide[ groups[ i ].materialIndex ].side : side;\r\n\t\t\tconst startCount = intersects.length;\r\n\r\n\t\t\tsetBuffer( roots[ i ] );\r\n\t\t\traycast( 0, geometry, materialSide, ray, intersects );\r\n\t\t\tclearBuffer();\r\n\r\n\t\t\tif ( isArrayMaterial ) {\r\n\r\n\t\t\t\tconst materialIndex = groups[ i ].materialIndex;\r\n\t\t\t\tfor ( let j = startCount, jl = intersects.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\t\tintersects[ j ].face.materialIndex = materialIndex;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn intersects;\r\n\r\n\t}\r\n\r\n\traycastFirst( ray, materialOrSide = FrontSide ) {\r\n\r\n\t\tconst roots = this._roots;\r\n\t\tconst geometry = this.geometry;\r\n\t\tconst isMaterial = materialOrSide.isMaterial;\r\n\t\tconst isArrayMaterial = Array.isArray( materialOrSide );\r\n\r\n\t\tlet closestResult = null;\r\n\r\n\t\tconst groups = geometry.groups;\r\n\t\tconst side = isMaterial ? materialOrSide.side : materialOrSide;\r\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\r\n\r\n\t\t\tconst materialSide = isArrayMaterial ? materialOrSide[ groups[ i ].materialIndex ].side : side;\r\n\r\n\t\t\tsetBuffer( roots[ i ] );\r\n\t\t\tconst result = raycastFirst( 0, geometry, materialSide, ray );\r\n\t\t\tclearBuffer();\r\n\r\n\t\t\tif ( result != null && ( closestResult == null || result.distance < closestResult.distance ) ) {\r\n\r\n\t\t\t\tclosestResult = result;\r\n\t\t\t\tif ( isArrayMaterial ) {\r\n\r\n\t\t\t\t\tresult.face.materialIndex = groups[ i ].materialIndex;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn closestResult;\r\n\r\n\t}\r\n\r\n\tintersectsGeometry( otherGeometry, geomToMesh ) {\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tlet result = false;\r\n\t\tfor ( const root of this._roots ) {\r\n\r\n\t\t\tsetBuffer( root );\r\n\t\t\tresult = intersectsGeometry( 0, geometry, otherGeometry, geomToMesh );\r\n\t\t\tclearBuffer();\r\n\r\n\t\t\tif ( result ) {\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n\tshapecast( callbacks, _intersectsTriangleFunc, _orderNodesFunc ) {\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tif ( callbacks instanceof Function ) {\r\n\r\n\t\t\tif ( _intersectsTriangleFunc ) {\r\n\r\n\t\t\t\t// Support the previous function signature that provided three sequential index buffer\r\n\t\t\t\t// indices here.\r\n\t\t\t\tconst originalTriangleFunc = _intersectsTriangleFunc;\r\n\t\t\t\t_intersectsTriangleFunc = ( tri, index, contained, depth ) => {\r\n\r\n\t\t\t\t\tconst i3 = index * 3;\r\n\t\t\t\t\treturn originalTriangleFunc( tri, i3, i3 + 1, i3 + 2, contained, depth );\r\n\r\n\t\t\t\t};\r\n\r\n\r\n\t\t\t}\r\n\r\n\t\t\tcallbacks = {\r\n\r\n\t\t\t\tboundsTraverseOrder: _orderNodesFunc,\r\n\t\t\t\tintersectsBounds: callbacks,\r\n\t\t\t\tintersectsTriangle: _intersectsTriangleFunc,\r\n\t\t\t\tintersectsRange: null,\r\n\r\n\t\t\t};\r\n\r\n\t\t\tconsole.warn( 'MeshBVH: Shapecast function signature has changed and now takes an object of callbacks as a second argument. See docs for new signature.' );\r\n\r\n\t\t}\r\n\r\n\t\tconst triangle = trianglePool.getPrimitive();\r\n\t\tlet {\r\n\t\t\tboundsTraverseOrder,\r\n\t\t\tintersectsBounds,\r\n\t\t\tintersectsRange,\r\n\t\t\tintersectsTriangle,\r\n\t\t} = callbacks;\r\n\r\n\t\tif ( intersectsRange && intersectsTriangle ) {\r\n\r\n\t\t\tconst originalIntersectsRange = intersectsRange;\r\n\t\t\tintersectsRange = ( offset, count, contained, depth, nodeIndex ) => {\r\n\r\n\t\t\t\tif ( ! originalIntersectsRange( offset, count, contained, depth, nodeIndex ) ) {\r\n\r\n\t\t\t\t\treturn iterateOverTriangles( offset, count, geometry, intersectsTriangle, contained, depth, triangle );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t};\r\n\r\n\t\t} else if ( ! intersectsRange ) {\r\n\r\n\t\t\tif ( intersectsTriangle ) {\r\n\r\n\t\t\t\tintersectsRange = ( offset, count, contained, depth ) => {\r\n\r\n\t\t\t\t\treturn iterateOverTriangles( offset, count, geometry, intersectsTriangle, contained, depth, triangle );\r\n\r\n\t\t\t\t};\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tintersectsRange = ( offset, count, contained ) => {\r\n\r\n\t\t\t\t\treturn contained;\r\n\r\n\t\t\t\t};\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tlet result = false;\r\n\t\tlet byteOffset = 0;\r\n\t\tfor ( const root of this._roots ) {\r\n\r\n\t\t\tsetBuffer( root );\r\n\t\t\tresult = shapecast( 0, geometry, intersectsBounds, intersectsRange, boundsTraverseOrder, byteOffset );\r\n\t\t\tclearBuffer();\r\n\r\n\t\t\tif ( result ) {\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tbyteOffset += root.byteLength;\r\n\r\n\t\t}\r\n\r\n\t\ttrianglePool.releasePrimitive( triangle );\r\n\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n\tbvhcast( otherBvh, matrixToLocal, callbacks ) {\r\n\r\n\t\t// BVHCast function for intersecting two BVHs against each other. Ultimately just uses two recursive shapecast calls rather\r\n\t\t// than an approach that walks down the tree (see bvhcast.js file for more info).\r\n\r\n\t\tlet {\r\n\t\t\tintersectsRanges,\r\n\t\t\tintersectsTriangles,\r\n\t\t} = callbacks;\r\n\r\n\t\tconst indexAttr = this.geometry.index;\r\n\t\tconst positionAttr = this.geometry.attributes.position;\r\n\r\n\t\tconst otherIndexAttr = otherBvh.geometry.index;\r\n\t\tconst otherPositionAttr = otherBvh.geometry.attributes.position;\r\n\r\n\t\ttempMatrix.copy( matrixToLocal ).invert();\r\n\r\n\t\tconst triangle = trianglePool.getPrimitive();\r\n\t\tconst triangle2 = trianglePool.getPrimitive();\r\n\r\n\t\tif ( intersectsTriangles ) {\r\n\r\n\t\t\tfunction iterateOverDoubleTriangles( offset1, count1, offset2, count2, depth1, index1, depth2, index2 ) {\r\n\r\n\t\t\t\tfor ( let i2 = offset2, l2 = offset2 + count2; i2 < l2; i2 ++ ) {\r\n\r\n\t\t\t\t\tsetTriangle( triangle2, i2 * 3, otherIndexAttr, otherPositionAttr );\r\n\t\t\t\t\ttriangle2.a.applyMatrix4( matrixToLocal );\r\n\t\t\t\t\ttriangle2.b.applyMatrix4( matrixToLocal );\r\n\t\t\t\t\ttriangle2.c.applyMatrix4( matrixToLocal );\r\n\t\t\t\t\ttriangle2.needsUpdate = true;\r\n\r\n\t\t\t\t\tfor ( let i1 = offset1, l1 = offset1 + count1; i1 < l1; i1 ++ ) {\r\n\r\n\t\t\t\t\t\tsetTriangle( triangle, i1 * 3, indexAttr, positionAttr );\r\n\t\t\t\t\t\ttriangle.needsUpdate = true;\r\n\r\n\t\t\t\t\t\tif ( intersectsTriangles( triangle, triangle2, i1, i2, depth1, index1, depth2, index2 ) ) {\r\n\r\n\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( intersectsRanges ) {\r\n\r\n\t\t\t\tconst originalIntersectsRanges = intersectsRanges;\r\n\t\t\t\tintersectsRanges = function ( offset1, count1, offset2, count2, depth1, index1, depth2, index2 ) {\r\n\r\n\t\t\t\t\tif ( ! originalIntersectsRanges( offset1, count1, offset2, count2, depth1, index1, depth2, index2 ) ) {\r\n\r\n\t\t\t\t\t\treturn iterateOverDoubleTriangles( offset1, count1, offset2, count2, depth1, index1, depth2, index2 );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t};\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tintersectsRanges = iterateOverDoubleTriangles;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\totherBvh.getBoundingBox( aabb2 );\r\n\t\taabb2.applyMatrix4( matrixToLocal );\r\n\t\tconst result = this.shapecast( {\r\n\r\n\t\t\tintersectsBounds: box => aabb2.intersectsBox( box ),\r\n\r\n\t\t\tintersectsRange: ( offset1, count1, contained, depth1, nodeIndex1, box ) => {\r\n\r\n\t\t\t\taabb.copy( box );\r\n\t\t\t\taabb.applyMatrix4( tempMatrix );\r\n\t\t\t\treturn otherBvh.shapecast( {\r\n\r\n\t\t\t\t\tintersectsBounds: box => aabb.intersectsBox( box ),\r\n\r\n\t\t\t\t\tintersectsRange: ( offset2, count2, contained, depth2, nodeIndex2 ) => {\r\n\r\n\t\t\t\t\t\treturn intersectsRanges( offset1, count1, offset2, count2, depth1, nodeIndex1, depth2, nodeIndex2 );\r\n\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t} );\r\n\r\n\t\t\t}\r\n\r\n\t\t} );\r\n\r\n\t\ttrianglePool.releasePrimitive( triangle );\r\n\t\ttrianglePool.releasePrimitive( triangle2 );\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n\t/* Derived Cast Functions */\r\n\tintersectsBox( box, boxToMesh ) {\r\n\r\n\t\tobb.set( box.min, box.max, boxToMesh );\r\n\t\tobb.needsUpdate = true;\r\n\r\n\t\treturn this.shapecast(\r\n\t\t\t{\r\n\t\t\t\tintersectsBounds: box => obb.intersectsBox( box ),\r\n\t\t\t\tintersectsTriangle: tri => obb.intersectsTriangle( tri )\r\n\t\t\t}\r\n\t\t);\r\n\r\n\t}\r\n\r\n\tintersectsSphere( sphere ) {\r\n\r\n\t\treturn this.shapecast(\r\n\t\t\t{\r\n\t\t\t\tintersectsBounds: box => sphere.intersectsBox( box ),\r\n\t\t\t\tintersectsTriangle: tri => tri.intersectsSphere( sphere )\r\n\t\t\t}\r\n\t\t);\r\n\r\n\t}\r\n\r\n\tclosestPointToGeometry( otherGeometry, geometryToBvh, target1 = { }, target2 = { }, minThreshold = 0, maxThreshold = Infinity ) {\r\n\r\n\t\tif ( ! otherGeometry.boundingBox ) {\r\n\r\n\t\t\totherGeometry.computeBoundingBox();\r\n\r\n\t\t}\r\n\r\n\t\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\r\n\t\tobb.needsUpdate = true;\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tconst pos = geometry.attributes.position;\r\n\t\tconst index = geometry.index;\r\n\t\tconst otherPos = otherGeometry.attributes.position;\r\n\t\tconst otherIndex = otherGeometry.index;\r\n\t\tconst triangle = trianglePool.getPrimitive();\r\n\t\tconst triangle2 = trianglePool.getPrimitive();\r\n\r\n\t\tlet tempTarget1 = temp1;\r\n\t\tlet tempTargetDest1 = temp2;\r\n\t\tlet tempTarget2 = null;\r\n\t\tlet tempTargetDest2 = null;\r\n\r\n\t\tif ( target2 ) {\r\n\r\n\t\t\ttempTarget2 = temp3;\r\n\t\t\ttempTargetDest2 = temp4;\r\n\r\n\t\t}\r\n\r\n\t\tlet closestDistance = Infinity;\r\n\t\tlet closestDistanceTriIndex = null;\r\n\t\tlet closestDistanceOtherTriIndex = null;\r\n\t\ttempMatrix.copy( geometryToBvh ).invert();\r\n\t\tobb2.matrix.copy( tempMatrix );\r\n\t\tthis.shapecast(\r\n\t\t\t{\r\n\r\n\t\t\t\tboundsTraverseOrder: box => {\r\n\r\n\t\t\t\t\treturn obb.distanceToBox( box );\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\r\n\r\n\t\t\t\t\tif ( score < closestDistance && score < maxThreshold ) {\r\n\r\n\t\t\t\t\t\t// if we know the triangles of this bounds will be intersected next then\r\n\t\t\t\t\t\t// save the bounds to use during triangle checks.\r\n\t\t\t\t\t\tif ( isLeaf ) {\r\n\r\n\t\t\t\t\t\t\tobb2.min.copy( box.min );\r\n\t\t\t\t\t\t\tobb2.max.copy( box.max );\r\n\t\t\t\t\t\t\tobb2.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tintersectsRange: ( offset, count ) => {\r\n\r\n\t\t\t\t\tif ( otherGeometry.boundsTree ) {\r\n\r\n\t\t\t\t\t\t// if the other geometry has a bvh then use the accelerated path where we use shapecast to find\r\n\t\t\t\t\t\t// the closest bounds in the other geometry to check.\r\n\t\t\t\t\t\treturn otherGeometry.boundsTree.shapecast( {\r\n\t\t\t\t\t\t\tboundsTraverseOrder: box => {\r\n\r\n\t\t\t\t\t\t\t\treturn obb2.distanceToBox( box );\r\n\r\n\t\t\t\t\t\t\t},\r\n\r\n\t\t\t\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\r\n\r\n\t\t\t\t\t\t\t\treturn score < closestDistance && score < maxThreshold;\r\n\r\n\t\t\t\t\t\t\t},\r\n\r\n\t\t\t\t\t\t\tintersectsRange: ( otherOffset, otherCount ) => {\r\n\r\n\t\t\t\t\t\t\t\tfor ( let i2 = otherOffset * 3, l2 = ( otherOffset + otherCount ) * 3; i2 < l2; i2 += 3 ) {\r\n\r\n\t\t\t\t\t\t\t\t\tsetTriangle( triangle2, i2, otherIndex, otherPos );\r\n\t\t\t\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t\t\t\tfor ( let i = offset * 3, l = ( offset + count ) * 3; i < l; i += 3 ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\tsetTriangle( triangle, i, index, pos );\r\n\t\t\t\t\t\t\t\t\t\ttriangle.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\r\n\t\t\t\t\t\t\t\t\t\tif ( dist < closestDistance ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\r\n\r\n\t\t\t\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\t\tclosestDistance = dist;\r\n\t\t\t\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i / 3;\r\n\t\t\t\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2 / 3;\r\n\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\r\n\t\t\t\t\t\t\t\t\t\tif ( dist < minThreshold ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t} );\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t// If no bounds tree then we'll just check every triangle.\r\n\t\t\t\t\t\tconst triCount = otherIndex ? otherIndex.count : otherPos.count;\r\n\t\t\t\t\t\tfor ( let i2 = 0, l2 = triCount; i2 < l2; i2 += 3 ) {\r\n\r\n\t\t\t\t\t\t\tsetTriangle( triangle2, i2, otherIndex, otherPos );\r\n\t\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t\tfor ( let i = offset * 3, l = ( offset + count ) * 3; i < l; i += 3 ) {\r\n\r\n\t\t\t\t\t\t\t\tsetTriangle( triangle, i, index, pos );\r\n\t\t\t\t\t\t\t\ttriangle.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\r\n\t\t\t\t\t\t\t\tif ( dist < closestDistance ) {\r\n\r\n\t\t\t\t\t\t\t\t\ttempTargetDest1.copy( tempTarget1 );\r\n\r\n\t\t\t\t\t\t\t\t\tif ( tempTargetDest2 ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\ttempTargetDest2.copy( tempTarget2 );\r\n\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\tclosestDistance = dist;\r\n\t\t\t\t\t\t\t\t\tclosestDistanceTriIndex = i / 3;\r\n\t\t\t\t\t\t\t\t\tclosestDistanceOtherTriIndex = i2 / 3;\r\n\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\r\n\t\t\t\t\t\t\t\tif ( dist < minThreshold ) {\r\n\r\n\t\t\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t}\r\n\r\n\t\t);\r\n\r\n\t\ttrianglePool.releasePrimitive( triangle );\r\n\t\ttrianglePool.releasePrimitive( triangle2 );\r\n\r\n\t\tif ( closestDistance === Infinity ) return null;\r\n\r\n\t\tif ( ! target1.point ) target1.point = tempTargetDest1.clone();\r\n\t\telse target1.point.copy( tempTargetDest1 );\r\n\t\ttarget1.distance = closestDistance,\r\n\t\ttarget1.faceIndex = closestDistanceTriIndex;\r\n\r\n\t\tif ( target2 ) {\r\n\r\n\t\t\tif ( ! target2.point ) target2.point = tempTargetDest2.clone();\r\n\t\t\telse target2.point.copy( tempTargetDest2 );\r\n\t\t\ttarget2.point.applyMatrix4( tempMatrix );\r\n\t\t\ttempTargetDest1.applyMatrix4( tempMatrix );\r\n\t\t\ttarget2.distance = tempTargetDest1.sub( target2.point ).length();\r\n\t\t\ttarget2.faceIndex = closestDistanceOtherTriIndex;\r\n\r\n\t\t}\r\n\r\n\t\treturn target1;\r\n\r\n\t}\r\n\r\n\tclosestPointToPoint( point, target = { }, minThreshold = 0, maxThreshold = Infinity ) {\r\n\r\n\t\t// early out if under minThreshold\r\n\t\t// skip checking if over maxThreshold\r\n\t\t// set minThreshold = maxThreshold to quickly check if a point is within a threshold\r\n\t\t// returns Infinity if no value found\r\n\t\tconst minThresholdSq = minThreshold * minThreshold;\r\n\t\tconst maxThresholdSq = maxThreshold * maxThreshold;\r\n\t\tlet closestDistanceSq = Infinity;\r\n\t\tlet closestDistanceTriIndex = null;\r\n\t\tthis.shapecast(\r\n\r\n\t\t\t{\r\n\r\n\t\t\t\tboundsTraverseOrder: box => {\r\n\r\n\t\t\t\t\ttemp.copy( point ).clamp( box.min, box.max );\r\n\t\t\t\t\treturn temp.distanceToSquared( point );\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\r\n\r\n\t\t\t\t\treturn score < closestDistanceSq && score < maxThresholdSq;\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tintersectsTriangle: ( tri, triIndex ) => {\r\n\r\n\t\t\t\t\ttri.closestPointToPoint( point, temp );\r\n\t\t\t\t\tconst distSq = point.distanceToSquared( temp );\r\n\t\t\t\t\tif ( distSq < closestDistanceSq ) {\r\n\r\n\t\t\t\t\t\ttemp1.copy( temp );\r\n\t\t\t\t\t\tclosestDistanceSq = distSq;\r\n\t\t\t\t\t\tclosestDistanceTriIndex = triIndex;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( distSq < minThresholdSq ) {\r\n\r\n\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t}\r\n\r\n\t\t);\r\n\r\n\t\tif ( closestDistanceSq === Infinity ) return null;\r\n\r\n\t\tconst closestDistance = Math.sqrt( closestDistanceSq );\r\n\r\n\t\tif ( ! target.point ) target.point = temp1.clone();\r\n\t\telse target.point.copy( temp1 );\r\n\t\ttarget.distance = closestDistance,\r\n\t\ttarget.faceIndex = closestDistanceTriIndex;\r\n\r\n\t\treturn target;\r\n\r\n\t}\r\n\r\n\tgetBoundingBox( target ) {\r\n\r\n\t\ttarget.makeEmpty();\r\n\r\n\t\tconst roots = this._roots;\r\n\t\troots.forEach( buffer => {\r\n\r\n\t\t\tarrayToBox( 0, new Float32Array( buffer ), tempBox );\r\n\t\t\ttarget.union( tempBox );\r\n\r\n\t\t} );\r\n\r\n\t\treturn target;\r\n\r\n\t}\r\n\r\n}\r\n","import { LineBasicMaterial, BufferAttribute, Box3, Group, MeshBasicMaterial, Object3D, BufferGeometry } from 'three';\r\nimport { arrayToBox } from '../utils/ArrayBoxUtilities.js';\r\n\r\nconst boundingBox = /* @__PURE__ */ new Box3();\r\nclass MeshBVHRootVisualizer extends Object3D {\r\n\r\n\tget isMesh() {\r\n\r\n\t\treturn ! this.displayEdges;\r\n\r\n\t}\r\n\r\n\tget isLineSegments() {\r\n\r\n\t\treturn this.displayEdges;\r\n\r\n\t}\r\n\r\n\tget isLine() {\r\n\r\n\t\treturn this.displayEdges;\r\n\r\n\t}\r\n\r\n\tconstructor( mesh, material, depth = 10, group = 0 ) {\r\n\r\n\t\tsuper();\r\n\r\n\t\tthis.material = material;\r\n\t\tthis.geometry = new BufferGeometry();\r\n\t\tthis.name = 'MeshBVHRootVisualizer';\r\n\t\tthis.depth = depth;\r\n\t\tthis.displayParents = false;\r\n\t\tthis.mesh = mesh;\r\n\t\tthis.displayEdges = true;\r\n\t\tthis._group = group;\r\n\r\n\t}\r\n\r\n\traycast() {}\r\n\r\n\tupdate() {\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tconst boundsTree = this.mesh.geometry.boundsTree;\r\n\t\tconst group = this._group;\r\n\t\tgeometry.dispose();\r\n\t\tthis.visible = false;\r\n\t\tif ( boundsTree ) {\r\n\r\n\t\t\t// count the number of bounds required\r\n\t\t\tconst targetDepth = this.depth - 1;\r\n\t\t\tconst displayParents = this.displayParents;\r\n\t\t\tlet boundsCount = 0;\r\n\t\t\tboundsTree.traverse( ( depth, isLeaf ) => {\r\n\r\n\t\t\t\tif ( depth === targetDepth || isLeaf ) {\r\n\r\n\t\t\t\t\tboundsCount ++;\r\n\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t} else if ( displayParents ) {\r\n\r\n\t\t\t\t\tboundsCount ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}, group );\r\n\r\n\t\t\t// fill in the position buffer with the bounds corners\r\n\t\t\tlet posIndex = 0;\r\n\t\t\tconst positionArray = new Float32Array( 8 * 3 * boundsCount );\r\n\t\t\tboundsTree.traverse( ( depth, isLeaf, boundingData ) => {\r\n\r\n\t\t\t\tconst terminate = depth === targetDepth || isLeaf;\r\n\t\t\t\tif ( terminate || displayParents ) {\r\n\r\n\t\t\t\t\tarrayToBox( 0, boundingData, boundingBox );\r\n\r\n\t\t\t\t\tconst { min, max } = boundingBox;\r\n\t\t\t\t\tfor ( let x = - 1; x <= 1; x += 2 ) {\r\n\r\n\t\t\t\t\t\tconst xVal = x < 0 ? min.x : max.x;\r\n\t\t\t\t\t\tfor ( let y = - 1; y <= 1; y += 2 ) {\r\n\r\n\t\t\t\t\t\t\tconst yVal = y < 0 ? min.y : max.y;\r\n\t\t\t\t\t\t\tfor ( let z = - 1; z <= 1; z += 2 ) {\r\n\r\n\t\t\t\t\t\t\t\tconst zVal = z < 0 ? min.z : max.z;\r\n\t\t\t\t\t\t\t\tpositionArray[ posIndex + 0 ] = xVal;\r\n\t\t\t\t\t\t\t\tpositionArray[ posIndex + 1 ] = yVal;\r\n\t\t\t\t\t\t\t\tpositionArray[ posIndex + 2 ] = zVal;\r\n\r\n\t\t\t\t\t\t\t\tposIndex += 3;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn terminate;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}, group );\r\n\r\n\t\t\tlet indexArray;\r\n\t\t\tlet indices;\r\n\t\t\tif ( this.displayEdges ) {\r\n\r\n\t\t\t\t// fill in the index buffer to point to the corner points\r\n\t\t\t\tindices = new Uint8Array( [\r\n\t\t\t\t\t// x axis\r\n\t\t\t\t\t0, 4,\r\n\t\t\t\t\t1, 5,\r\n\t\t\t\t\t2, 6,\r\n\t\t\t\t\t3, 7,\r\n\r\n\t\t\t\t\t// y axis\r\n\t\t\t\t\t0, 2,\r\n\t\t\t\t\t1, 3,\r\n\t\t\t\t\t4, 6,\r\n\t\t\t\t\t5, 7,\r\n\r\n\t\t\t\t\t// z axis\r\n\t\t\t\t\t0, 1,\r\n\t\t\t\t\t2, 3,\r\n\t\t\t\t\t4, 5,\r\n\t\t\t\t\t6, 7,\r\n\t\t\t\t] );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tindices = new Uint8Array( [\r\n\r\n\t\t\t\t\t// X-, X+\r\n\t\t\t\t\t0, 1, 2,\r\n\t\t\t\t\t2, 1, 3,\r\n\r\n\t\t\t\t\t4, 6, 5,\r\n\t\t\t\t\t6, 7, 5,\r\n\r\n\t\t\t\t\t// Y-, Y+\r\n\t\t\t\t\t1, 4, 5,\r\n\t\t\t\t\t0, 4, 1,\r\n\r\n\t\t\t\t\t2, 3, 6,\r\n\t\t\t\t\t3, 7, 6,\r\n\r\n\t\t\t\t\t// Z-, Z+\r\n\t\t\t\t\t0, 2, 4,\r\n\t\t\t\t\t2, 6, 4,\r\n\r\n\t\t\t\t\t1, 5, 3,\r\n\t\t\t\t\t3, 5, 7,\r\n\r\n\t\t\t\t] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( positionArray.length > 65535 ) {\r\n\r\n\t\t\t\tindexArray = new Uint32Array( indices.length * boundsCount );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tindexArray = new Uint16Array( indices.length * boundsCount );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tconst indexLength = indices.length;\r\n\t\t\tfor ( let i = 0; i < boundsCount; i ++ ) {\r\n\r\n\t\t\t\tconst posOffset = i * 8;\r\n\t\t\t\tconst indexOffset = i * indexLength;\r\n\t\t\t\tfor ( let j = 0; j < indexLength; j ++ ) {\r\n\r\n\t\t\t\t\tindexArray[ indexOffset + j ] = posOffset + indices[ j ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// update the geometry\r\n\t\t\tgeometry.setIndex(\r\n\t\t\t\tnew BufferAttribute( indexArray, 1, false ),\r\n\t\t\t);\r\n\t\t\tgeometry.setAttribute(\r\n\t\t\t\t'position',\r\n\t\t\t\tnew BufferAttribute( positionArray, 3, false ),\r\n\t\t\t);\r\n\t\t\tthis.visible = true;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nclass MeshBVHVisualizer extends Group {\r\n\r\n\tget color() {\r\n\r\n\t\treturn this.edgeMaterial.color;\r\n\r\n\t}\r\n\r\n\tget opacity() {\r\n\r\n\t\treturn this.edgeMaterial.opacity;\r\n\r\n\t}\r\n\r\n\tset opacity( v ) {\r\n\r\n\t\tthis.edgeMaterial.opacity = v;\r\n\t\tthis.meshMaterial.opacity = v;\r\n\r\n\t}\r\n\r\n\tconstructor( mesh, depth = 10 ) {\r\n\r\n\t\tsuper();\r\n\r\n\t\tthis.name = 'MeshBVHVisualizer';\r\n\t\tthis.depth = depth;\r\n\t\tthis.mesh = mesh;\r\n\t\tthis.displayParents = false;\r\n\t\tthis.displayEdges = true;\r\n\t\tthis._roots = [];\r\n\r\n\t\tconst edgeMaterial = new LineBasicMaterial( {\r\n\t\t\tcolor: 0x00FF88,\r\n\t\t\ttransparent: true,\r\n\t\t\topacity: 0.3,\r\n\t\t\tdepthWrite: false,\r\n\t\t} );\r\n\r\n\t\tconst meshMaterial = new MeshBasicMaterial( {\r\n\t\t\tcolor: 0x00FF88,\r\n\t\t\ttransparent: true,\r\n\t\t\topacity: 0.3,\r\n\t\t\tdepthWrite: false,\r\n\t\t} );\r\n\r\n\t\tmeshMaterial.color = edgeMaterial.color;\r\n\r\n\t\tthis.edgeMaterial = edgeMaterial;\r\n\t\tthis.meshMaterial = meshMaterial;\r\n\r\n\t\tthis.update();\r\n\r\n\t}\r\n\r\n\tupdate() {\r\n\r\n\t\tconst bvh = this.mesh.geometry.boundsTree;\r\n\t\tconst totalRoots = bvh ? bvh._roots.length : 0;\r\n\t\twhile ( this._roots.length > totalRoots ) {\r\n\r\n\t\t\tconst root = this._roots.pop();\r\n\t\t\troot.geometry.dispose();\r\n\t\t\tthis.remove( root );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( let i = 0; i < totalRoots; i ++ ) {\r\n\r\n\t\t\tif ( i >= this._roots.length ) {\r\n\r\n\t\t\t\tconst root = new MeshBVHRootVisualizer( this.mesh, this.edgeMaterial, this.depth, i );\r\n\t\t\t\tthis.add( root );\r\n\t\t\t\tthis._roots.push( root );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tconst root = this._roots[ i ];\r\n\t\t\troot.depth = this.depth;\r\n\t\t\troot.mesh = this.mesh;\r\n\t\t\troot.displayParents = this.displayParents;\r\n\t\t\troot.displayEdges = this.displayEdges;\r\n\t\t\troot.material = this.displayEdges ? this.edgeMaterial : this.meshMaterial;\r\n\t\t\troot.update();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tupdateMatrixWorld( ...args ) {\r\n\r\n\t\tthis.position.copy( this.mesh.position );\r\n\t\tthis.rotation.copy( this.mesh.rotation );\r\n\t\tthis.scale.copy( this.mesh.scale );\r\n\r\n\t\tsuper.updateMatrixWorld( ...args );\r\n\r\n\t}\r\n\r\n\tcopy( source ) {\r\n\r\n\t\tthis.depth = source.depth;\r\n\t\tthis.mesh = source.mesh;\r\n\r\n\t}\r\n\r\n\tclone() {\r\n\r\n\t\treturn new MeshBVHVisualizer( this.mesh, this.depth );\r\n\r\n\t}\r\n\r\n\tdispose() {\r\n\r\n\t\tthis.edgeMaterial.dispose();\r\n\t\tthis.meshMaterial.dispose();\r\n\r\n\t\tconst children = this.children;\r\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\r\n\r\n\t\t\tchildren[ i ].geometry.dispose();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\n\r\nexport { MeshBVHVisualizer };\r\n","/**\n * parameters = {\n * color: ,\n * linewidth: ,\n * dashed: ,\n * dashScale: ,\n * dashSize: ,\n * dashOffset: ,\n * gapSize: ,\n * resolution: , // to be set by renderer\n * }\n */\n\nimport {\n\tShaderLib,\n\tShaderMaterial,\n\tUniformsLib,\n\tUniformsUtils,\n\tVector2\n} from 'three';\n\n\nUniformsLib.line = {\n\n\tworldUnits: { value: 1 },\n\tlinewidth: { value: 1 },\n\tresolution: { value: new Vector2( 1, 1 ) },\n\tdashOffset: { value: 0 },\n\tdashScale: { value: 1 },\n\tdashSize: { value: 1 },\n\tgapSize: { value: 1 } // todo FIX - maybe change to totalSize\n\n};\n\nShaderLib[ 'line' ] = {\n\n\tuniforms: UniformsUtils.merge( [\n\t\tUniformsLib.common,\n\t\tUniformsLib.fog,\n\t\tUniformsLib.line\n\t] ),\n\n\tvertexShader:\n\t/* glsl */`\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\n\t\tuniform float linewidth;\n\t\tuniform vec2 resolution;\n\n\t\tattribute vec3 instanceStart;\n\t\tattribute vec3 instanceEnd;\n\n\t\tattribute vec3 instanceColorStart;\n\t\tattribute vec3 instanceColorEnd;\n\n\t\t#ifdef WORLD_UNITS\n\n\t\t\tvarying vec4 worldPos;\n\t\t\tvarying vec3 worldStart;\n\t\t\tvarying vec3 worldEnd;\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t#endif\n\n\t\t#else\n\n\t\t\tvarying vec2 vUv;\n\n\t\t#endif\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashScale;\n\t\t\tattribute float instanceDistanceStart;\n\t\t\tattribute float instanceDistanceEnd;\n\t\t\tvarying float vLineDistance;\n\n\t\t#endif\n\n\t\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\n\n\t\t\t// trim end segment so it terminates between the camera plane and the near plane\n\n\t\t\t// conservative estimate of the near plane\n\t\t\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\n\t\t\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\n\t\t\tfloat nearEstimate = - 0.5 * b / a;\n\n\t\t\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\n\n\t\t\tend.xyz = mix( start.xyz, end.xyz, alpha );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#ifdef USE_COLOR\n\n\t\t\t\tvColor.xyz = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\n\n\t\t\t#endif\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\n\t\t\t\tvUv = uv;\n\n\t\t\t#endif\n\n\t\t\tfloat aspect = resolution.x / resolution.y;\n\n\t\t\t// camera space\n\t\t\tvec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\n\t\t\tvec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\tworldStart = start.xyz;\n\t\t\t\tworldEnd = end.xyz;\n\n\t\t\t#else\n\n\t\t\t\tvUv = uv;\n\n\t\t\t#endif\n\n\t\t\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\n\t\t\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\n\t\t\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\n\t\t\t// perhaps there is a more elegant solution -- WestLangley\n\n\t\t\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\n\n\t\t\tif ( perspective ) {\n\n\t\t\t\tif ( start.z < 0.0 && end.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( start, end );\n\n\t\t\t\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( end, start );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// clip space\n\t\t\tvec4 clipStart = projectionMatrix * start;\n\t\t\tvec4 clipEnd = projectionMatrix * end;\n\n\t\t\t// ndc space\n\t\t\tvec3 ndcStart = clipStart.xyz / clipStart.w;\n\t\t\tvec3 ndcEnd = clipEnd.xyz / clipEnd.w;\n\n\t\t\t// direction\n\t\t\tvec2 dir = ndcEnd.xy - ndcStart.xy;\n\n\t\t\t// account for clip-space aspect ratio\n\t\t\tdir.x *= aspect;\n\t\t\tdir = normalize( dir );\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t// get the offset direction as perpendicular to the view vector\n\t\t\t\tvec3 worldDir = normalize( end.xyz - start.xyz );\n\t\t\t\tvec3 offset;\n\t\t\t\tif ( position.y < 0.5 ) {\n\n\t\t\t\t\toffset = normalize( cross( start.xyz, worldDir ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\toffset = normalize( cross( end.xyz, worldDir ) );\n\n\t\t\t\t}\n\n\t\t\t\t// sign flip\n\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\tfloat forwardOffset = dot( worldDir, vec3( 0.0, 0.0, 1.0 ) );\n\n\t\t\t\t// don't extend the line if we're rendering dashes because we\n\t\t\t\t// won't be rendering the endcaps\n\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t// extend the line bounds to encompass endcaps\n\t\t\t\t\tstart.xyz += - worldDir * linewidth * 0.5;\n\t\t\t\t\tend.xyz += worldDir * linewidth * 0.5;\n\n\t\t\t\t\t// shift the position of the quad so it hugs the forward edge of the line\n\t\t\t\t\toffset.xy -= dir * forwardOffset;\n\t\t\t\t\toffset.z += 0.5;\n\n\t\t\t\t#endif\n\n\t\t\t\t// endcaps\n\t\t\t\tif ( position.y > 1.0 || position.y < 0.0 ) {\n\n\t\t\t\t\toffset.xy += dir * 2.0 * forwardOffset;\n\n\t\t\t\t}\n\n\t\t\t\t// adjust for linewidth\n\t\t\t\toffset *= linewidth * 0.5;\n\n\t\t\t\t// set the world position\n\t\t\t\tworldPos = ( position.y < 0.5 ) ? start : end;\n\t\t\t\tworldPos.xyz += offset;\n\n\t\t\t\t// project the worldpos\n\t\t\t\tvec4 clip = projectionMatrix * worldPos;\n\n\t\t\t\t// shift the depth of the projected points so the line\n\t\t\t\t// segments overlap neatly\n\t\t\t\tvec3 clipPose = ( position.y < 0.5 ) ? ndcStart : ndcEnd;\n\t\t\t\tclip.z = clipPose.z * clip.w;\n\n\t\t\t#else\n\n\t\t\t\tvec2 offset = vec2( dir.y, - dir.x );\n\t\t\t\t// undo aspect ratio adjustment\n\t\t\t\tdir.x /= aspect;\n\t\t\t\toffset.x /= aspect;\n\n\t\t\t\t// sign flip\n\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\t// endcaps\n\t\t\t\tif ( position.y < 0.0 ) {\n\n\t\t\t\t\toffset += - dir;\n\n\t\t\t\t} else if ( position.y > 1.0 ) {\n\n\t\t\t\t\toffset += dir;\n\n\t\t\t\t}\n\n\t\t\t\t// adjust for linewidth\n\t\t\t\toffset *= linewidth;\n\n\t\t\t\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\n\t\t\t\toffset /= resolution.y;\n\n\t\t\t\t// select end\n\t\t\t\tvec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;\n\n\t\t\t\t// back to clip space\n\t\t\t\toffset *= clip.w;\n\n\t\t\t\tclip.xy += offset;\n\n\t\t\t#endif\n\n\t\t\tgl_Position = clip;\n\n\t\t\tvec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation\n\n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\n\t\t}\n\t\t`,\n\n\tfragmentShader:\n\t/* glsl */`\n\t\tuniform vec3 diffuse;\n\t\tuniform float opacity;\n\t\tuniform float linewidth;\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashOffset;\n\t\t\tuniform float dashSize;\n\t\t\tuniform float gapSize;\n\n\t\t#endif\n\n\t\tvarying float vLineDistance;\n\n\t\t#ifdef WORLD_UNITS\n\n\t\t\tvarying vec4 worldPos;\n\t\t\tvarying vec3 worldStart;\n\t\t\tvarying vec3 worldEnd;\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t#endif\n\n\t\t#else\n\n\t\t\tvarying vec2 vUv;\n\n\t\t#endif\n\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\n\t\tvec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {\n\n\t\t\tfloat mua;\n\t\t\tfloat mub;\n\n\t\t\tvec3 p13 = p1 - p3;\n\t\t\tvec3 p43 = p4 - p3;\n\n\t\t\tvec3 p21 = p2 - p1;\n\n\t\t\tfloat d1343 = dot( p13, p43 );\n\t\t\tfloat d4321 = dot( p43, p21 );\n\t\t\tfloat d1321 = dot( p13, p21 );\n\t\t\tfloat d4343 = dot( p43, p43 );\n\t\t\tfloat d2121 = dot( p21, p21 );\n\n\t\t\tfloat denom = d2121 * d4343 - d4321 * d4321;\n\n\t\t\tfloat numer = d1343 * d4321 - d1321 * d4343;\n\n\t\t\tmua = numer / denom;\n\t\t\tmua = clamp( mua, 0.0, 1.0 );\n\t\t\tmub = ( d1343 + d4321 * ( mua ) ) / d4343;\n\t\t\tmub = clamp( mub, 0.0, 1.0 );\n\n\t\t\treturn vec2( mua, mub );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#include \n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\n\n\t\t\t\tif ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\n\n\t\t\t#endif\n\n\t\t\tfloat alpha = opacity;\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t// Find the closest points on the view ray and the line segment\n\t\t\t\tvec3 rayEnd = normalize( worldPos.xyz ) * 1e5;\n\t\t\t\tvec3 lineDir = worldEnd - worldStart;\n\t\t\t\tvec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );\n\n\t\t\t\tvec3 p1 = worldStart + lineDir * params.x;\n\t\t\t\tvec3 p2 = rayEnd * params.y;\n\t\t\t\tvec3 delta = p1 - p2;\n\t\t\t\tfloat len = length( delta );\n\t\t\t\tfloat norm = len / linewidth;\n\n\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t\tfloat dnorm = fwidth( norm );\n\t\t\t\t\t\talpha = 1.0 - smoothstep( 0.5 - dnorm, 0.5 + dnorm, norm );\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\tif ( norm > 0.5 ) {\n\n\t\t\t\t\t\t\tdiscard;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t#endif\n\n\t\t\t\t#endif\n\n\t\t\t#else\n\n\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t// artifacts appear on some hardware if a derivative is taken within a conditional\n\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\tfloat len2 = a * a + b * b;\n\t\t\t\t\tfloat dlen = fwidth( len2 );\n\n\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\talpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t#else\n\n\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\t\tfloat len2 = a * a + b * b;\n\n\t\t\t\t\t\tif ( len2 > 1.0 ) discard;\n\n\t\t\t\t\t}\n\n\t\t\t\t#endif\n\n\t\t\t#endif\n\n\t\t\tvec4 diffuseColor = vec4( diffuse, alpha );\n\n\t\t\t#include \n\t\t\t#include \n\n\t\t\tgl_FragColor = vec4( diffuseColor.rgb, alpha );\n\n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\n\t\t}\n\t\t`\n};\n\nclass LineMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( {\n\n\t\t\ttype: 'LineMaterial',\n\n\t\t\tuniforms: UniformsUtils.clone( ShaderLib[ 'line' ].uniforms ),\n\n\t\t\tvertexShader: ShaderLib[ 'line' ].vertexShader,\n\t\t\tfragmentShader: ShaderLib[ 'line' ].fragmentShader,\n\n\t\t\tclipping: true // required for clipping support\n\n\t\t} );\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tcolor: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.diffuse.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.diffuse.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tworldUnits: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn 'WORLD_UNITS' in this.defines;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tif ( value === true ) {\n\n\t\t\t\t\t\tthis.defines.WORLD_UNITS = '';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdelete this.defines.WORLD_UNITS;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tlinewidth: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.linewidth.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.linewidth.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashed: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn Boolean( 'USE_DASH' in this.defines );\n\n\t\t\t\t},\n\n\t\t\t\tset( value ) {\n\n\t\t\t\t\tif ( Boolean( value ) !== Boolean( 'USE_DASH' in this.defines ) ) {\n\n\t\t\t\t\t\tthis.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( value === true ) {\n\n\t\t\t\t\t\tthis.defines.USE_DASH = '';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdelete this.defines.USE_DASH;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashScale: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.dashScale.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.dashScale.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashSize: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.dashSize.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.dashSize.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tdashOffset: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.dashOffset.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.dashOffset.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tgapSize: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.gapSize.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.gapSize.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\topacity: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tresolution: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.resolution.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.resolution.value.copy( value );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\talphaToCoverage: {\n\n\t\t\t\tenumerable: true,\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn Boolean( 'USE_ALPHA_TO_COVERAGE' in this.defines );\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tif ( Boolean( value ) !== Boolean( 'USE_ALPHA_TO_COVERAGE' in this.defines ) ) {\n\n\t\t\t\t\t\tthis.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( value === true ) {\n\n\t\t\t\t\t\tthis.defines.USE_ALPHA_TO_COVERAGE = '';\n\t\t\t\t\t\tthis.extensions.derivatives = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdelete this.defines.USE_ALPHA_TO_COVERAGE;\n\t\t\t\t\t\tthis.extensions.derivatives = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n}\n\nLineMaterial.prototype.isLineMaterial = true;\n\nexport { LineMaterial };\n","module.exports = [\n {\n \"value\":\"#B0171F\",\n \"name\":\"indian red\"\n },\n {\n \"value\":\"#DC143C\",\n \"css\":true,\n \"name\":\"crimson\"\n },\n {\n \"value\":\"#FFB6C1\",\n \"css\":true,\n \"name\":\"lightpink\"\n },\n {\n \"value\":\"#FFAEB9\",\n \"name\":\"lightpink 1\"\n },\n {\n \"value\":\"#EEA2AD\",\n \"name\":\"lightpink 2\"\n },\n {\n \"value\":\"#CD8C95\",\n \"name\":\"lightpink 3\"\n },\n {\n \"value\":\"#8B5F65\",\n \"name\":\"lightpink 4\"\n },\n {\n \"value\":\"#FFC0CB\",\n \"css\":true,\n \"name\":\"pink\"\n },\n {\n \"value\":\"#FFB5C5\",\n \"name\":\"pink 1\"\n },\n {\n \"value\":\"#EEA9B8\",\n \"name\":\"pink 2\"\n },\n {\n \"value\":\"#CD919E\",\n \"name\":\"pink 3\"\n },\n {\n \"value\":\"#8B636C\",\n \"name\":\"pink 4\"\n },\n {\n \"value\":\"#DB7093\",\n \"css\":true,\n \"name\":\"palevioletred\"\n },\n {\n \"value\":\"#FF82AB\",\n \"name\":\"palevioletred 1\"\n },\n {\n \"value\":\"#EE799F\",\n \"name\":\"palevioletred 2\"\n },\n {\n \"value\":\"#CD6889\",\n \"name\":\"palevioletred 3\"\n },\n {\n \"value\":\"#8B475D\",\n \"name\":\"palevioletred 4\"\n },\n {\n \"value\":\"#FFF0F5\",\n \"name\":\"lavenderblush 1\"\n },\n {\n \"value\":\"#FFF0F5\",\n \"css\":true,\n \"name\":\"lavenderblush\"\n },\n {\n \"value\":\"#EEE0E5\",\n \"name\":\"lavenderblush 2\"\n },\n {\n \"value\":\"#CDC1C5\",\n \"name\":\"lavenderblush 3\"\n },\n {\n \"value\":\"#8B8386\",\n \"name\":\"lavenderblush 4\"\n },\n {\n \"value\":\"#FF3E96\",\n \"name\":\"violetred 1\"\n },\n {\n \"value\":\"#EE3A8C\",\n \"name\":\"violetred 2\"\n },\n {\n \"value\":\"#CD3278\",\n \"name\":\"violetred 3\"\n },\n {\n \"value\":\"#8B2252\",\n \"name\":\"violetred 4\"\n },\n {\n \"value\":\"#FF69B4\",\n \"css\":true,\n \"name\":\"hotpink\"\n },\n {\n \"value\":\"#FF6EB4\",\n \"name\":\"hotpink 1\"\n },\n {\n \"value\":\"#EE6AA7\",\n \"name\":\"hotpink 2\"\n },\n {\n \"value\":\"#CD6090\",\n \"name\":\"hotpink 3\"\n },\n {\n \"value\":\"#8B3A62\",\n \"name\":\"hotpink 4\"\n },\n {\n \"value\":\"#872657\",\n \"name\":\"raspberry\"\n },\n {\n \"value\":\"#FF1493\",\n \"name\":\"deeppink 1\"\n },\n {\n \"value\":\"#FF1493\",\n \"css\":true,\n \"name\":\"deeppink\"\n },\n {\n \"value\":\"#EE1289\",\n \"name\":\"deeppink 2\"\n },\n {\n \"value\":\"#CD1076\",\n \"name\":\"deeppink 3\"\n },\n {\n \"value\":\"#8B0A50\",\n \"name\":\"deeppink 4\"\n },\n {\n \"value\":\"#FF34B3\",\n \"name\":\"maroon 1\"\n },\n {\n \"value\":\"#EE30A7\",\n \"name\":\"maroon 2\"\n },\n {\n \"value\":\"#CD2990\",\n \"name\":\"maroon 3\"\n },\n {\n \"value\":\"#8B1C62\",\n \"name\":\"maroon 4\"\n },\n {\n \"value\":\"#C71585\",\n \"css\":true,\n \"name\":\"mediumvioletred\"\n },\n {\n \"value\":\"#D02090\",\n \"name\":\"violetred\"\n },\n {\n \"value\":\"#DA70D6\",\n \"css\":true,\n \"name\":\"orchid\"\n },\n {\n \"value\":\"#FF83FA\",\n \"name\":\"orchid 1\"\n },\n {\n \"value\":\"#EE7AE9\",\n \"name\":\"orchid 2\"\n },\n {\n \"value\":\"#CD69C9\",\n \"name\":\"orchid 3\"\n },\n {\n \"value\":\"#8B4789\",\n \"name\":\"orchid 4\"\n },\n {\n \"value\":\"#D8BFD8\",\n \"css\":true,\n \"name\":\"thistle\"\n },\n {\n \"value\":\"#FFE1FF\",\n \"name\":\"thistle 1\"\n },\n {\n \"value\":\"#EED2EE\",\n \"name\":\"thistle 2\"\n },\n {\n \"value\":\"#CDB5CD\",\n \"name\":\"thistle 3\"\n },\n {\n \"value\":\"#8B7B8B\",\n \"name\":\"thistle 4\"\n },\n {\n \"value\":\"#FFBBFF\",\n \"name\":\"plum 1\"\n },\n {\n \"value\":\"#EEAEEE\",\n \"name\":\"plum 2\"\n },\n {\n \"value\":\"#CD96CD\",\n \"name\":\"plum 3\"\n },\n {\n \"value\":\"#8B668B\",\n \"name\":\"plum 4\"\n },\n {\n \"value\":\"#DDA0DD\",\n \"css\":true,\n \"name\":\"plum\"\n },\n {\n \"value\":\"#EE82EE\",\n \"css\":true,\n \"name\":\"violet\"\n },\n {\n \"value\":\"#FF00FF\",\n \"vga\":true,\n \"name\":\"magenta\"\n },\n {\n \"value\":\"#FF00FF\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"fuchsia\"\n },\n {\n \"value\":\"#EE00EE\",\n \"name\":\"magenta 2\"\n },\n {\n \"value\":\"#CD00CD\",\n \"name\":\"magenta 3\"\n },\n {\n \"value\":\"#8B008B\",\n \"name\":\"magenta 4\"\n },\n {\n \"value\":\"#8B008B\",\n \"css\":true,\n \"name\":\"darkmagenta\"\n },\n {\n \"value\":\"#800080\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"purple\"\n },\n {\n \"value\":\"#BA55D3\",\n \"css\":true,\n \"name\":\"mediumorchid\"\n },\n {\n \"value\":\"#E066FF\",\n \"name\":\"mediumorchid 1\"\n },\n {\n \"value\":\"#D15FEE\",\n \"name\":\"mediumorchid 2\"\n },\n {\n \"value\":\"#B452CD\",\n \"name\":\"mediumorchid 3\"\n },\n {\n \"value\":\"#7A378B\",\n \"name\":\"mediumorchid 4\"\n },\n {\n \"value\":\"#9400D3\",\n \"css\":true,\n \"name\":\"darkviolet\"\n },\n {\n \"value\":\"#9932CC\",\n \"css\":true,\n \"name\":\"darkorchid\"\n },\n {\n \"value\":\"#BF3EFF\",\n \"name\":\"darkorchid 1\"\n },\n {\n \"value\":\"#B23AEE\",\n \"name\":\"darkorchid 2\"\n },\n {\n \"value\":\"#9A32CD\",\n \"name\":\"darkorchid 3\"\n },\n {\n \"value\":\"#68228B\",\n \"name\":\"darkorchid 4\"\n },\n {\n \"value\":\"#4B0082\",\n \"css\":true,\n \"name\":\"indigo\"\n },\n {\n \"value\":\"#8A2BE2\",\n \"css\":true,\n \"name\":\"blueviolet\"\n },\n {\n \"value\":\"#9B30FF\",\n \"name\":\"purple 1\"\n },\n {\n \"value\":\"#912CEE\",\n \"name\":\"purple 2\"\n },\n {\n \"value\":\"#7D26CD\",\n \"name\":\"purple 3\"\n },\n {\n \"value\":\"#551A8B\",\n \"name\":\"purple 4\"\n },\n {\n \"value\":\"#9370DB\",\n \"css\":true,\n \"name\":\"mediumpurple\"\n },\n {\n \"value\":\"#AB82FF\",\n \"name\":\"mediumpurple 1\"\n },\n {\n \"value\":\"#9F79EE\",\n \"name\":\"mediumpurple 2\"\n },\n {\n \"value\":\"#8968CD\",\n \"name\":\"mediumpurple 3\"\n },\n {\n \"value\":\"#5D478B\",\n \"name\":\"mediumpurple 4\"\n },\n {\n \"value\":\"#483D8B\",\n \"css\":true,\n \"name\":\"darkslateblue\"\n },\n {\n \"value\":\"#8470FF\",\n \"name\":\"lightslateblue\"\n },\n {\n \"value\":\"#7B68EE\",\n \"css\":true,\n \"name\":\"mediumslateblue\"\n },\n {\n \"value\":\"#6A5ACD\",\n \"css\":true,\n \"name\":\"slateblue\"\n },\n {\n \"value\":\"#836FFF\",\n \"name\":\"slateblue 1\"\n },\n {\n \"value\":\"#7A67EE\",\n \"name\":\"slateblue 2\"\n },\n {\n \"value\":\"#6959CD\",\n \"name\":\"slateblue 3\"\n },\n {\n \"value\":\"#473C8B\",\n \"name\":\"slateblue 4\"\n },\n {\n \"value\":\"#F8F8FF\",\n \"css\":true,\n \"name\":\"ghostwhite\"\n },\n {\n \"value\":\"#E6E6FA\",\n \"css\":true,\n \"name\":\"lavender\"\n },\n {\n \"value\":\"#0000FF\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"blue\"\n },\n {\n \"value\":\"#0000EE\",\n \"name\":\"blue 2\"\n },\n {\n \"value\":\"#0000CD\",\n \"name\":\"blue 3\"\n },\n {\n \"value\":\"#0000CD\",\n \"css\":true,\n \"name\":\"mediumblue\"\n },\n {\n \"value\":\"#00008B\",\n \"name\":\"blue 4\"\n },\n {\n \"value\":\"#00008B\",\n \"css\":true,\n \"name\":\"darkblue\"\n },\n {\n \"value\":\"#000080\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"navy\"\n },\n {\n \"value\":\"#191970\",\n \"css\":true,\n \"name\":\"midnightblue\"\n },\n {\n \"value\":\"#3D59AB\",\n \"name\":\"cobalt\"\n },\n {\n \"value\":\"#4169E1\",\n \"css\":true,\n \"name\":\"royalblue\"\n },\n {\n \"value\":\"#4876FF\",\n \"name\":\"royalblue 1\"\n },\n {\n \"value\":\"#436EEE\",\n \"name\":\"royalblue 2\"\n },\n {\n \"value\":\"#3A5FCD\",\n \"name\":\"royalblue 3\"\n },\n {\n \"value\":\"#27408B\",\n \"name\":\"royalblue 4\"\n },\n {\n \"value\":\"#6495ED\",\n \"css\":true,\n \"name\":\"cornflowerblue\"\n },\n {\n \"value\":\"#B0C4DE\",\n \"css\":true,\n \"name\":\"lightsteelblue\"\n },\n {\n \"value\":\"#CAE1FF\",\n \"name\":\"lightsteelblue 1\"\n },\n {\n \"value\":\"#BCD2EE\",\n \"name\":\"lightsteelblue 2\"\n },\n {\n \"value\":\"#A2B5CD\",\n \"name\":\"lightsteelblue 3\"\n },\n {\n \"value\":\"#6E7B8B\",\n \"name\":\"lightsteelblue 4\"\n },\n {\n \"value\":\"#778899\",\n \"css\":true,\n \"name\":\"lightslategray\"\n },\n {\n \"value\":\"#708090\",\n \"css\":true,\n \"name\":\"slategray\"\n },\n {\n \"value\":\"#C6E2FF\",\n \"name\":\"slategray 1\"\n },\n {\n \"value\":\"#B9D3EE\",\n \"name\":\"slategray 2\"\n },\n {\n \"value\":\"#9FB6CD\",\n \"name\":\"slategray 3\"\n },\n {\n \"value\":\"#6C7B8B\",\n \"name\":\"slategray 4\"\n },\n {\n \"value\":\"#1E90FF\",\n \"name\":\"dodgerblue 1\"\n },\n {\n \"value\":\"#1E90FF\",\n \"css\":true,\n \"name\":\"dodgerblue\"\n },\n {\n \"value\":\"#1C86EE\",\n \"name\":\"dodgerblue 2\"\n },\n {\n \"value\":\"#1874CD\",\n \"name\":\"dodgerblue 3\"\n },\n {\n \"value\":\"#104E8B\",\n \"name\":\"dodgerblue 4\"\n },\n {\n \"value\":\"#F0F8FF\",\n \"css\":true,\n \"name\":\"aliceblue\"\n },\n {\n \"value\":\"#4682B4\",\n \"css\":true,\n \"name\":\"steelblue\"\n },\n {\n \"value\":\"#63B8FF\",\n \"name\":\"steelblue 1\"\n },\n {\n \"value\":\"#5CACEE\",\n \"name\":\"steelblue 2\"\n },\n {\n \"value\":\"#4F94CD\",\n \"name\":\"steelblue 3\"\n },\n {\n \"value\":\"#36648B\",\n \"name\":\"steelblue 4\"\n },\n {\n \"value\":\"#87CEFA\",\n \"css\":true,\n \"name\":\"lightskyblue\"\n },\n {\n \"value\":\"#B0E2FF\",\n \"name\":\"lightskyblue 1\"\n },\n {\n \"value\":\"#A4D3EE\",\n \"name\":\"lightskyblue 2\"\n },\n {\n \"value\":\"#8DB6CD\",\n \"name\":\"lightskyblue 3\"\n },\n {\n \"value\":\"#607B8B\",\n \"name\":\"lightskyblue 4\"\n },\n {\n \"value\":\"#87CEFF\",\n \"name\":\"skyblue 1\"\n },\n {\n \"value\":\"#7EC0EE\",\n \"name\":\"skyblue 2\"\n },\n {\n \"value\":\"#6CA6CD\",\n \"name\":\"skyblue 3\"\n },\n {\n \"value\":\"#4A708B\",\n \"name\":\"skyblue 4\"\n },\n {\n \"value\":\"#87CEEB\",\n \"css\":true,\n \"name\":\"skyblue\"\n },\n {\n \"value\":\"#00BFFF\",\n \"name\":\"deepskyblue 1\"\n },\n {\n \"value\":\"#00BFFF\",\n \"css\":true,\n \"name\":\"deepskyblue\"\n },\n {\n \"value\":\"#00B2EE\",\n \"name\":\"deepskyblue 2\"\n },\n {\n \"value\":\"#009ACD\",\n \"name\":\"deepskyblue 3\"\n },\n {\n \"value\":\"#00688B\",\n \"name\":\"deepskyblue 4\"\n },\n {\n \"value\":\"#33A1C9\",\n \"name\":\"peacock\"\n },\n {\n \"value\":\"#ADD8E6\",\n \"css\":true,\n \"name\":\"lightblue\"\n },\n {\n \"value\":\"#BFEFFF\",\n \"name\":\"lightblue 1\"\n },\n {\n \"value\":\"#B2DFEE\",\n \"name\":\"lightblue 2\"\n },\n {\n \"value\":\"#9AC0CD\",\n \"name\":\"lightblue 3\"\n },\n {\n \"value\":\"#68838B\",\n \"name\":\"lightblue 4\"\n },\n {\n \"value\":\"#B0E0E6\",\n \"css\":true,\n \"name\":\"powderblue\"\n },\n {\n \"value\":\"#98F5FF\",\n \"name\":\"cadetblue 1\"\n },\n {\n \"value\":\"#8EE5EE\",\n \"name\":\"cadetblue 2\"\n },\n {\n \"value\":\"#7AC5CD\",\n \"name\":\"cadetblue 3\"\n },\n {\n \"value\":\"#53868B\",\n \"name\":\"cadetblue 4\"\n },\n {\n \"value\":\"#00F5FF\",\n \"name\":\"turquoise 1\"\n },\n {\n \"value\":\"#00E5EE\",\n \"name\":\"turquoise 2\"\n },\n {\n \"value\":\"#00C5CD\",\n \"name\":\"turquoise 3\"\n },\n {\n \"value\":\"#00868B\",\n \"name\":\"turquoise 4\"\n },\n {\n \"value\":\"#5F9EA0\",\n \"css\":true,\n \"name\":\"cadetblue\"\n },\n {\n \"value\":\"#00CED1\",\n \"css\":true,\n \"name\":\"darkturquoise\"\n },\n {\n \"value\":\"#F0FFFF\",\n \"name\":\"azure 1\"\n },\n {\n \"value\":\"#F0FFFF\",\n \"css\":true,\n \"name\":\"azure\"\n },\n {\n \"value\":\"#E0EEEE\",\n \"name\":\"azure 2\"\n },\n {\n \"value\":\"#C1CDCD\",\n \"name\":\"azure 3\"\n },\n {\n \"value\":\"#838B8B\",\n \"name\":\"azure 4\"\n },\n {\n \"value\":\"#E0FFFF\",\n \"name\":\"lightcyan 1\"\n },\n {\n \"value\":\"#E0FFFF\",\n \"css\":true,\n \"name\":\"lightcyan\"\n },\n {\n \"value\":\"#D1EEEE\",\n \"name\":\"lightcyan 2\"\n },\n {\n \"value\":\"#B4CDCD\",\n \"name\":\"lightcyan 3\"\n },\n {\n \"value\":\"#7A8B8B\",\n \"name\":\"lightcyan 4\"\n },\n {\n \"value\":\"#BBFFFF\",\n \"name\":\"paleturquoise 1\"\n },\n {\n \"value\":\"#AEEEEE\",\n \"name\":\"paleturquoise 2\"\n },\n {\n \"value\":\"#AEEEEE\",\n \"css\":true,\n \"name\":\"paleturquoise\"\n },\n {\n \"value\":\"#96CDCD\",\n \"name\":\"paleturquoise 3\"\n },\n {\n \"value\":\"#668B8B\",\n \"name\":\"paleturquoise 4\"\n },\n {\n \"value\":\"#2F4F4F\",\n \"css\":true,\n \"name\":\"darkslategray\"\n },\n {\n \"value\":\"#97FFFF\",\n \"name\":\"darkslategray 1\"\n },\n {\n \"value\":\"#8DEEEE\",\n \"name\":\"darkslategray 2\"\n },\n {\n \"value\":\"#79CDCD\",\n \"name\":\"darkslategray 3\"\n },\n {\n \"value\":\"#528B8B\",\n \"name\":\"darkslategray 4\"\n },\n {\n \"value\":\"#00FFFF\",\n \"name\":\"cyan\"\n },\n {\n \"value\":\"#00FFFF\",\n \"css\":true,\n \"name\":\"aqua\"\n },\n {\n \"value\":\"#00EEEE\",\n \"name\":\"cyan 2\"\n },\n {\n \"value\":\"#00CDCD\",\n \"name\":\"cyan 3\"\n },\n {\n \"value\":\"#008B8B\",\n \"name\":\"cyan 4\"\n },\n {\n \"value\":\"#008B8B\",\n \"css\":true,\n \"name\":\"darkcyan\"\n },\n {\n \"value\":\"#008080\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"teal\"\n },\n {\n \"value\":\"#48D1CC\",\n \"css\":true,\n \"name\":\"mediumturquoise\"\n },\n {\n \"value\":\"#20B2AA\",\n \"css\":true,\n \"name\":\"lightseagreen\"\n },\n {\n \"value\":\"#03A89E\",\n \"name\":\"manganeseblue\"\n },\n {\n \"value\":\"#40E0D0\",\n \"css\":true,\n \"name\":\"turquoise\"\n },\n {\n \"value\":\"#808A87\",\n \"name\":\"coldgrey\"\n },\n {\n \"value\":\"#00C78C\",\n \"name\":\"turquoiseblue\"\n },\n {\n \"value\":\"#7FFFD4\",\n \"name\":\"aquamarine 1\"\n },\n {\n \"value\":\"#7FFFD4\",\n \"css\":true,\n \"name\":\"aquamarine\"\n },\n {\n \"value\":\"#76EEC6\",\n \"name\":\"aquamarine 2\"\n },\n {\n \"value\":\"#66CDAA\",\n \"name\":\"aquamarine 3\"\n },\n {\n \"value\":\"#66CDAA\",\n \"css\":true,\n \"name\":\"mediumaquamarine\"\n },\n {\n \"value\":\"#458B74\",\n \"name\":\"aquamarine 4\"\n },\n {\n \"value\":\"#00FA9A\",\n \"css\":true,\n \"name\":\"mediumspringgreen\"\n },\n {\n \"value\":\"#F5FFFA\",\n \"css\":true,\n \"name\":\"mintcream\"\n },\n {\n \"value\":\"#00FF7F\",\n \"css\":true,\n \"name\":\"springgreen\"\n },\n {\n \"value\":\"#00EE76\",\n \"name\":\"springgreen 1\"\n },\n {\n \"value\":\"#00CD66\",\n \"name\":\"springgreen 2\"\n },\n {\n \"value\":\"#008B45\",\n \"name\":\"springgreen 3\"\n },\n {\n \"value\":\"#3CB371\",\n \"css\":true,\n \"name\":\"mediumseagreen\"\n },\n {\n \"value\":\"#54FF9F\",\n \"name\":\"seagreen 1\"\n },\n {\n \"value\":\"#4EEE94\",\n \"name\":\"seagreen 2\"\n },\n {\n \"value\":\"#43CD80\",\n \"name\":\"seagreen 3\"\n },\n {\n \"value\":\"#2E8B57\",\n \"name\":\"seagreen 4\"\n },\n {\n \"value\":\"#2E8B57\",\n \"css\":true,\n \"name\":\"seagreen\"\n },\n {\n \"value\":\"#00C957\",\n \"name\":\"emeraldgreen\"\n },\n {\n \"value\":\"#BDFCC9\",\n \"name\":\"mint\"\n },\n {\n \"value\":\"#3D9140\",\n \"name\":\"cobaltgreen\"\n },\n {\n \"value\":\"#F0FFF0\",\n \"name\":\"honeydew 1\"\n },\n {\n \"value\":\"#F0FFF0\",\n \"css\":true,\n \"name\":\"honeydew\"\n },\n {\n \"value\":\"#E0EEE0\",\n \"name\":\"honeydew 2\"\n },\n {\n \"value\":\"#C1CDC1\",\n \"name\":\"honeydew 3\"\n },\n {\n \"value\":\"#838B83\",\n \"name\":\"honeydew 4\"\n },\n {\n \"value\":\"#8FBC8F\",\n \"css\":true,\n \"name\":\"darkseagreen\"\n },\n {\n \"value\":\"#C1FFC1\",\n \"name\":\"darkseagreen 1\"\n },\n {\n \"value\":\"#B4EEB4\",\n \"name\":\"darkseagreen 2\"\n },\n {\n \"value\":\"#9BCD9B\",\n \"name\":\"darkseagreen 3\"\n },\n {\n \"value\":\"#698B69\",\n \"name\":\"darkseagreen 4\"\n },\n {\n \"value\":\"#98FB98\",\n \"css\":true,\n \"name\":\"palegreen\"\n },\n {\n \"value\":\"#9AFF9A\",\n \"name\":\"palegreen 1\"\n },\n {\n \"value\":\"#90EE90\",\n \"name\":\"palegreen 2\"\n },\n {\n \"value\":\"#90EE90\",\n \"css\":true,\n \"name\":\"lightgreen\"\n },\n {\n \"value\":\"#7CCD7C\",\n \"name\":\"palegreen 3\"\n },\n {\n \"value\":\"#548B54\",\n \"name\":\"palegreen 4\"\n },\n {\n \"value\":\"#32CD32\",\n \"css\":true,\n \"name\":\"limegreen\"\n },\n {\n \"value\":\"#228B22\",\n \"css\":true,\n \"name\":\"forestgreen\"\n },\n {\n \"value\":\"#00FF00\",\n \"vga\":true,\n \"name\":\"green 1\"\n },\n {\n \"value\":\"#00FF00\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"lime\"\n },\n {\n \"value\":\"#00EE00\",\n \"name\":\"green 2\"\n },\n {\n \"value\":\"#00CD00\",\n \"name\":\"green 3\"\n },\n {\n \"value\":\"#008B00\",\n \"name\":\"green 4\"\n },\n {\n \"value\":\"#008000\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"green\"\n },\n {\n \"value\":\"#006400\",\n \"css\":true,\n \"name\":\"darkgreen\"\n },\n {\n \"value\":\"#308014\",\n \"name\":\"sapgreen\"\n },\n {\n \"value\":\"#7CFC00\",\n \"css\":true,\n \"name\":\"lawngreen\"\n },\n {\n \"value\":\"#7FFF00\",\n \"name\":\"chartreuse 1\"\n },\n {\n \"value\":\"#7FFF00\",\n \"css\":true,\n \"name\":\"chartreuse\"\n },\n {\n \"value\":\"#76EE00\",\n \"name\":\"chartreuse 2\"\n },\n {\n \"value\":\"#66CD00\",\n \"name\":\"chartreuse 3\"\n },\n {\n \"value\":\"#458B00\",\n \"name\":\"chartreuse 4\"\n },\n {\n \"value\":\"#ADFF2F\",\n \"css\":true,\n \"name\":\"greenyellow\"\n },\n {\n \"value\":\"#CAFF70\",\n \"name\":\"darkolivegreen 1\"\n },\n {\n \"value\":\"#BCEE68\",\n \"name\":\"darkolivegreen 2\"\n },\n {\n \"value\":\"#A2CD5A\",\n \"name\":\"darkolivegreen 3\"\n },\n {\n \"value\":\"#6E8B3D\",\n \"name\":\"darkolivegreen 4\"\n },\n {\n \"value\":\"#556B2F\",\n \"css\":true,\n \"name\":\"darkolivegreen\"\n },\n {\n \"value\":\"#6B8E23\",\n \"css\":true,\n \"name\":\"olivedrab\"\n },\n {\n \"value\":\"#C0FF3E\",\n \"name\":\"olivedrab 1\"\n },\n {\n \"value\":\"#B3EE3A\",\n \"name\":\"olivedrab 2\"\n },\n {\n \"value\":\"#9ACD32\",\n \"name\":\"olivedrab 3\"\n },\n {\n \"value\":\"#9ACD32\",\n \"css\":true,\n \"name\":\"yellowgreen\"\n },\n {\n \"value\":\"#698B22\",\n \"name\":\"olivedrab 4\"\n },\n {\n \"value\":\"#FFFFF0\",\n \"name\":\"ivory 1\"\n },\n {\n \"value\":\"#FFFFF0\",\n \"css\":true,\n \"name\":\"ivory\"\n },\n {\n \"value\":\"#EEEEE0\",\n \"name\":\"ivory 2\"\n },\n {\n \"value\":\"#CDCDC1\",\n \"name\":\"ivory 3\"\n },\n {\n \"value\":\"#8B8B83\",\n \"name\":\"ivory 4\"\n },\n {\n \"value\":\"#F5F5DC\",\n \"css\":true,\n \"name\":\"beige\"\n },\n {\n \"value\":\"#FFFFE0\",\n \"name\":\"lightyellow 1\"\n },\n {\n \"value\":\"#FFFFE0\",\n \"css\":true,\n \"name\":\"lightyellow\"\n },\n {\n \"value\":\"#EEEED1\",\n \"name\":\"lightyellow 2\"\n },\n {\n \"value\":\"#CDCDB4\",\n \"name\":\"lightyellow 3\"\n },\n {\n \"value\":\"#8B8B7A\",\n \"name\":\"lightyellow 4\"\n },\n {\n \"value\":\"#FAFAD2\",\n \"css\":true,\n \"name\":\"lightgoldenrodyellow\"\n },\n {\n \"value\":\"#FFFF00\",\n \"vga\":true,\n \"name\":\"yellow 1\"\n },\n {\n \"value\":\"#FFFF00\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"yellow\"\n },\n {\n \"value\":\"#EEEE00\",\n \"name\":\"yellow 2\"\n },\n {\n \"value\":\"#CDCD00\",\n \"name\":\"yellow 3\"\n },\n {\n \"value\":\"#8B8B00\",\n \"name\":\"yellow 4\"\n },\n {\n \"value\":\"#808069\",\n \"name\":\"warmgrey\"\n },\n {\n \"value\":\"#808000\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"olive\"\n },\n {\n \"value\":\"#BDB76B\",\n \"css\":true,\n \"name\":\"darkkhaki\"\n },\n {\n \"value\":\"#FFF68F\",\n \"name\":\"khaki 1\"\n },\n {\n \"value\":\"#EEE685\",\n \"name\":\"khaki 2\"\n },\n {\n \"value\":\"#CDC673\",\n \"name\":\"khaki 3\"\n },\n {\n \"value\":\"#8B864E\",\n \"name\":\"khaki 4\"\n },\n {\n \"value\":\"#F0E68C\",\n \"css\":true,\n \"name\":\"khaki\"\n },\n {\n \"value\":\"#EEE8AA\",\n \"css\":true,\n \"name\":\"palegoldenrod\"\n },\n {\n \"value\":\"#FFFACD\",\n \"name\":\"lemonchiffon 1\"\n },\n {\n \"value\":\"#FFFACD\",\n \"css\":true,\n \"name\":\"lemonchiffon\"\n },\n {\n \"value\":\"#EEE9BF\",\n \"name\":\"lemonchiffon 2\"\n },\n {\n \"value\":\"#CDC9A5\",\n \"name\":\"lemonchiffon 3\"\n },\n {\n \"value\":\"#8B8970\",\n \"name\":\"lemonchiffon 4\"\n },\n {\n \"value\":\"#FFEC8B\",\n \"name\":\"lightgoldenrod 1\"\n },\n {\n \"value\":\"#EEDC82\",\n \"name\":\"lightgoldenrod 2\"\n },\n {\n \"value\":\"#CDBE70\",\n \"name\":\"lightgoldenrod 3\"\n },\n {\n \"value\":\"#8B814C\",\n \"name\":\"lightgoldenrod 4\"\n },\n {\n \"value\":\"#E3CF57\",\n \"name\":\"banana\"\n },\n {\n \"value\":\"#FFD700\",\n \"name\":\"gold 1\"\n },\n {\n \"value\":\"#FFD700\",\n \"css\":true,\n \"name\":\"gold\"\n },\n {\n \"value\":\"#EEC900\",\n \"name\":\"gold 2\"\n },\n {\n \"value\":\"#CDAD00\",\n \"name\":\"gold 3\"\n },\n {\n \"value\":\"#8B7500\",\n \"name\":\"gold 4\"\n },\n {\n \"value\":\"#FFF8DC\",\n \"name\":\"cornsilk 1\"\n },\n {\n \"value\":\"#FFF8DC\",\n \"css\":true,\n \"name\":\"cornsilk\"\n },\n {\n \"value\":\"#EEE8CD\",\n \"name\":\"cornsilk 2\"\n },\n {\n \"value\":\"#CDC8B1\",\n \"name\":\"cornsilk 3\"\n },\n {\n \"value\":\"#8B8878\",\n \"name\":\"cornsilk 4\"\n },\n {\n \"value\":\"#DAA520\",\n \"css\":true,\n \"name\":\"goldenrod\"\n },\n {\n \"value\":\"#FFC125\",\n \"name\":\"goldenrod 1\"\n },\n {\n \"value\":\"#EEB422\",\n \"name\":\"goldenrod 2\"\n },\n {\n \"value\":\"#CD9B1D\",\n \"name\":\"goldenrod 3\"\n },\n {\n \"value\":\"#8B6914\",\n \"name\":\"goldenrod 4\"\n },\n {\n \"value\":\"#B8860B\",\n \"css\":true,\n \"name\":\"darkgoldenrod\"\n },\n {\n \"value\":\"#FFB90F\",\n \"name\":\"darkgoldenrod 1\"\n },\n {\n \"value\":\"#EEAD0E\",\n \"name\":\"darkgoldenrod 2\"\n },\n {\n \"value\":\"#CD950C\",\n \"name\":\"darkgoldenrod 3\"\n },\n {\n \"value\":\"#8B6508\",\n \"name\":\"darkgoldenrod 4\"\n },\n {\n \"value\":\"#FFA500\",\n \"name\":\"orange 1\"\n },\n {\n \"value\":\"#FF8000\",\n \"css\":true,\n \"name\":\"orange\"\n },\n {\n \"value\":\"#EE9A00\",\n \"name\":\"orange 2\"\n },\n {\n \"value\":\"#CD8500\",\n \"name\":\"orange 3\"\n },\n {\n \"value\":\"#8B5A00\",\n \"name\":\"orange 4\"\n },\n {\n \"value\":\"#FFFAF0\",\n \"css\":true,\n \"name\":\"floralwhite\"\n },\n {\n \"value\":\"#FDF5E6\",\n \"css\":true,\n \"name\":\"oldlace\"\n },\n {\n \"value\":\"#F5DEB3\",\n \"css\":true,\n \"name\":\"wheat\"\n },\n {\n \"value\":\"#FFE7BA\",\n \"name\":\"wheat 1\"\n },\n {\n \"value\":\"#EED8AE\",\n \"name\":\"wheat 2\"\n },\n {\n \"value\":\"#CDBA96\",\n \"name\":\"wheat 3\"\n },\n {\n \"value\":\"#8B7E66\",\n \"name\":\"wheat 4\"\n },\n {\n \"value\":\"#FFE4B5\",\n \"css\":true,\n \"name\":\"moccasin\"\n },\n {\n \"value\":\"#FFEFD5\",\n \"css\":true,\n \"name\":\"papayawhip\"\n },\n {\n \"value\":\"#FFEBCD\",\n \"css\":true,\n \"name\":\"blanchedalmond\"\n },\n {\n \"value\":\"#FFDEAD\",\n \"name\":\"navajowhite 1\"\n },\n {\n \"value\":\"#FFDEAD\",\n \"css\":true,\n \"name\":\"navajowhite\"\n },\n {\n \"value\":\"#EECFA1\",\n \"name\":\"navajowhite 2\"\n },\n {\n \"value\":\"#CDB38B\",\n \"name\":\"navajowhite 3\"\n },\n {\n \"value\":\"#8B795E\",\n \"name\":\"navajowhite 4\"\n },\n {\n \"value\":\"#FCE6C9\",\n \"name\":\"eggshell\"\n },\n {\n \"value\":\"#D2B48C\",\n \"css\":true,\n \"name\":\"tan\"\n },\n {\n \"value\":\"#9C661F\",\n \"name\":\"brick\"\n },\n {\n \"value\":\"#FF9912\",\n \"name\":\"cadmiumyellow\"\n },\n {\n \"value\":\"#FAEBD7\",\n \"css\":true,\n \"name\":\"antiquewhite\"\n },\n {\n \"value\":\"#FFEFDB\",\n \"name\":\"antiquewhite 1\"\n },\n {\n \"value\":\"#EEDFCC\",\n \"name\":\"antiquewhite 2\"\n },\n {\n \"value\":\"#CDC0B0\",\n \"name\":\"antiquewhite 3\"\n },\n {\n \"value\":\"#8B8378\",\n \"name\":\"antiquewhite 4\"\n },\n {\n \"value\":\"#DEB887\",\n \"css\":true,\n \"name\":\"burlywood\"\n },\n {\n \"value\":\"#FFD39B\",\n \"name\":\"burlywood 1\"\n },\n {\n \"value\":\"#EEC591\",\n \"name\":\"burlywood 2\"\n },\n {\n \"value\":\"#CDAA7D\",\n \"name\":\"burlywood 3\"\n },\n {\n \"value\":\"#8B7355\",\n \"name\":\"burlywood 4\"\n },\n {\n \"value\":\"#FFE4C4\",\n \"name\":\"bisque 1\"\n },\n {\n \"value\":\"#FFE4C4\",\n \"css\":true,\n \"name\":\"bisque\"\n },\n {\n \"value\":\"#EED5B7\",\n \"name\":\"bisque 2\"\n },\n {\n \"value\":\"#CDB79E\",\n \"name\":\"bisque 3\"\n },\n {\n \"value\":\"#8B7D6B\",\n \"name\":\"bisque 4\"\n },\n {\n \"value\":\"#E3A869\",\n \"name\":\"melon\"\n },\n {\n \"value\":\"#ED9121\",\n \"name\":\"carrot\"\n },\n {\n \"value\":\"#FF8C00\",\n \"css\":true,\n \"name\":\"darkorange\"\n },\n {\n \"value\":\"#FF7F00\",\n \"name\":\"darkorange 1\"\n },\n {\n \"value\":\"#EE7600\",\n \"name\":\"darkorange 2\"\n },\n {\n \"value\":\"#CD6600\",\n \"name\":\"darkorange 3\"\n },\n {\n \"value\":\"#8B4500\",\n \"name\":\"darkorange 4\"\n },\n {\n \"value\":\"#FFA54F\",\n \"name\":\"tan 1\"\n },\n {\n \"value\":\"#EE9A49\",\n \"name\":\"tan 2\"\n },\n {\n \"value\":\"#CD853F\",\n \"name\":\"tan 3\"\n },\n {\n \"value\":\"#CD853F\",\n \"css\":true,\n \"name\":\"peru\"\n },\n {\n \"value\":\"#8B5A2B\",\n \"name\":\"tan 4\"\n },\n {\n \"value\":\"#FAF0E6\",\n \"css\":true,\n \"name\":\"linen\"\n },\n {\n \"value\":\"#FFDAB9\",\n \"name\":\"peachpuff 1\"\n },\n {\n \"value\":\"#FFDAB9\",\n \"css\":true,\n \"name\":\"peachpuff\"\n },\n {\n \"value\":\"#EECBAD\",\n \"name\":\"peachpuff 2\"\n },\n {\n \"value\":\"#CDAF95\",\n \"name\":\"peachpuff 3\"\n },\n {\n \"value\":\"#8B7765\",\n \"name\":\"peachpuff 4\"\n },\n {\n \"value\":\"#FFF5EE\",\n \"name\":\"seashell 1\"\n },\n {\n \"value\":\"#FFF5EE\",\n \"css\":true,\n \"name\":\"seashell\"\n },\n {\n \"value\":\"#EEE5DE\",\n \"name\":\"seashell 2\"\n },\n {\n \"value\":\"#CDC5BF\",\n \"name\":\"seashell 3\"\n },\n {\n \"value\":\"#8B8682\",\n \"name\":\"seashell 4\"\n },\n {\n \"value\":\"#F4A460\",\n \"css\":true,\n \"name\":\"sandybrown\"\n },\n {\n \"value\":\"#C76114\",\n \"name\":\"rawsienna\"\n },\n {\n \"value\":\"#D2691E\",\n \"css\":true,\n \"name\":\"chocolate\"\n },\n {\n \"value\":\"#FF7F24\",\n \"name\":\"chocolate 1\"\n },\n {\n \"value\":\"#EE7621\",\n \"name\":\"chocolate 2\"\n },\n {\n \"value\":\"#CD661D\",\n \"name\":\"chocolate 3\"\n },\n {\n \"value\":\"#8B4513\",\n \"name\":\"chocolate 4\"\n },\n {\n \"value\":\"#8B4513\",\n \"css\":true,\n \"name\":\"saddlebrown\"\n },\n {\n \"value\":\"#292421\",\n \"name\":\"ivoryblack\"\n },\n {\n \"value\":\"#FF7D40\",\n \"name\":\"flesh\"\n },\n {\n \"value\":\"#FF6103\",\n \"name\":\"cadmiumorange\"\n },\n {\n \"value\":\"#8A360F\",\n \"name\":\"burntsienna\"\n },\n {\n \"value\":\"#A0522D\",\n \"css\":true,\n \"name\":\"sienna\"\n },\n {\n \"value\":\"#FF8247\",\n \"name\":\"sienna 1\"\n },\n {\n \"value\":\"#EE7942\",\n \"name\":\"sienna 2\"\n },\n {\n \"value\":\"#CD6839\",\n \"name\":\"sienna 3\"\n },\n {\n \"value\":\"#8B4726\",\n \"name\":\"sienna 4\"\n },\n {\n \"value\":\"#FFA07A\",\n \"name\":\"lightsalmon 1\"\n },\n {\n \"value\":\"#FFA07A\",\n \"css\":true,\n \"name\":\"lightsalmon\"\n },\n {\n \"value\":\"#EE9572\",\n \"name\":\"lightsalmon 2\"\n },\n {\n \"value\":\"#CD8162\",\n \"name\":\"lightsalmon 3\"\n },\n {\n \"value\":\"#8B5742\",\n \"name\":\"lightsalmon 4\"\n },\n {\n \"value\":\"#FF7F50\",\n \"css\":true,\n \"name\":\"coral\"\n },\n {\n \"value\":\"#FF4500\",\n \"name\":\"orangered 1\"\n },\n {\n \"value\":\"#FF4500\",\n \"css\":true,\n \"name\":\"orangered\"\n },\n {\n \"value\":\"#EE4000\",\n \"name\":\"orangered 2\"\n },\n {\n \"value\":\"#CD3700\",\n \"name\":\"orangered 3\"\n },\n {\n \"value\":\"#8B2500\",\n \"name\":\"orangered 4\"\n },\n {\n \"value\":\"#5E2612\",\n \"name\":\"sepia\"\n },\n {\n \"value\":\"#E9967A\",\n \"css\":true,\n \"name\":\"darksalmon\"\n },\n {\n \"value\":\"#FF8C69\",\n \"name\":\"salmon 1\"\n },\n {\n \"value\":\"#EE8262\",\n \"name\":\"salmon 2\"\n },\n {\n \"value\":\"#CD7054\",\n \"name\":\"salmon 3\"\n },\n {\n \"value\":\"#8B4C39\",\n \"name\":\"salmon 4\"\n },\n {\n \"value\":\"#FF7256\",\n \"name\":\"coral 1\"\n },\n {\n \"value\":\"#EE6A50\",\n \"name\":\"coral 2\"\n },\n {\n \"value\":\"#CD5B45\",\n \"name\":\"coral 3\"\n },\n {\n \"value\":\"#8B3E2F\",\n \"name\":\"coral 4\"\n },\n {\n \"value\":\"#8A3324\",\n \"name\":\"burntumber\"\n },\n {\n \"value\":\"#FF6347\",\n \"name\":\"tomato 1\"\n },\n {\n \"value\":\"#FF6347\",\n \"css\":true,\n \"name\":\"tomato\"\n },\n {\n \"value\":\"#EE5C42\",\n \"name\":\"tomato 2\"\n },\n {\n \"value\":\"#CD4F39\",\n \"name\":\"tomato 3\"\n },\n {\n \"value\":\"#8B3626\",\n \"name\":\"tomato 4\"\n },\n {\n \"value\":\"#FA8072\",\n \"css\":true,\n \"name\":\"salmon\"\n },\n {\n \"value\":\"#FFE4E1\",\n \"name\":\"mistyrose 1\"\n },\n {\n \"value\":\"#FFE4E1\",\n \"css\":true,\n \"name\":\"mistyrose\"\n },\n {\n \"value\":\"#EED5D2\",\n \"name\":\"mistyrose 2\"\n },\n {\n \"value\":\"#CDB7B5\",\n \"name\":\"mistyrose 3\"\n },\n {\n \"value\":\"#8B7D7B\",\n \"name\":\"mistyrose 4\"\n },\n {\n \"value\":\"#FFFAFA\",\n \"name\":\"snow 1\"\n },\n {\n \"value\":\"#FFFAFA\",\n \"css\":true,\n \"name\":\"snow\"\n },\n {\n \"value\":\"#EEE9E9\",\n \"name\":\"snow 2\"\n },\n {\n \"value\":\"#CDC9C9\",\n \"name\":\"snow 3\"\n },\n {\n \"value\":\"#8B8989\",\n \"name\":\"snow 4\"\n },\n {\n \"value\":\"#BC8F8F\",\n \"css\":true,\n \"name\":\"rosybrown\"\n },\n {\n \"value\":\"#FFC1C1\",\n \"name\":\"rosybrown 1\"\n },\n {\n \"value\":\"#EEB4B4\",\n \"name\":\"rosybrown 2\"\n },\n {\n \"value\":\"#CD9B9B\",\n \"name\":\"rosybrown 3\"\n },\n {\n \"value\":\"#8B6969\",\n \"name\":\"rosybrown 4\"\n },\n {\n \"value\":\"#F08080\",\n \"css\":true,\n \"name\":\"lightcoral\"\n },\n {\n \"value\":\"#CD5C5C\",\n \"css\":true,\n \"name\":\"indianred\"\n },\n {\n \"value\":\"#FF6A6A\",\n \"name\":\"indianred 1\"\n },\n {\n \"value\":\"#EE6363\",\n \"name\":\"indianred 2\"\n },\n {\n \"value\":\"#8B3A3A\",\n \"name\":\"indianred 4\"\n },\n {\n \"value\":\"#CD5555\",\n \"name\":\"indianred 3\"\n },\n {\n \"value\":\"#A52A2A\",\n \"css\":true,\n \"name\":\"brown\"\n },\n {\n \"value\":\"#FF4040\",\n \"name\":\"brown 1\"\n },\n {\n \"value\":\"#EE3B3B\",\n \"name\":\"brown 2\"\n },\n {\n \"value\":\"#CD3333\",\n \"name\":\"brown 3\"\n },\n {\n \"value\":\"#8B2323\",\n \"name\":\"brown 4\"\n },\n {\n \"value\":\"#B22222\",\n \"css\":true,\n \"name\":\"firebrick\"\n },\n {\n \"value\":\"#FF3030\",\n \"name\":\"firebrick 1\"\n },\n {\n \"value\":\"#EE2C2C\",\n \"name\":\"firebrick 2\"\n },\n {\n \"value\":\"#CD2626\",\n \"name\":\"firebrick 3\"\n },\n {\n \"value\":\"#8B1A1A\",\n \"name\":\"firebrick 4\"\n },\n {\n \"value\":\"#FF0000\",\n \"vga\":true,\n \"name\":\"red 1\"\n },\n {\n \"value\":\"#FF0000\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"red\"\n },\n {\n \"value\":\"#EE0000\",\n \"name\":\"red 2\"\n },\n {\n \"value\":\"#CD0000\",\n \"name\":\"red 3\"\n },\n {\n \"value\":\"#8B0000\",\n \"name\":\"red 4\"\n },\n {\n \"value\":\"#8B0000\",\n \"css\":true,\n \"name\":\"darkred\"\n },\n {\n \"value\":\"#800000\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"maroon\"\n },\n {\n \"value\":\"#8E388E\",\n \"name\":\"sgi beet\"\n },\n {\n \"value\":\"#7171C6\",\n \"name\":\"sgi slateblue\"\n },\n {\n \"value\":\"#7D9EC0\",\n \"name\":\"sgi lightblue\"\n },\n {\n \"value\":\"#388E8E\",\n \"name\":\"sgi teal\"\n },\n {\n \"value\":\"#71C671\",\n \"name\":\"sgi chartreuse\"\n },\n {\n \"value\":\"#8E8E38\",\n \"name\":\"sgi olivedrab\"\n },\n {\n \"value\":\"#C5C1AA\",\n \"name\":\"sgi brightgray\"\n },\n {\n \"value\":\"#C67171\",\n \"name\":\"sgi salmon\"\n },\n {\n \"value\":\"#555555\",\n \"name\":\"sgi darkgray\"\n },\n {\n \"value\":\"#1E1E1E\",\n \"name\":\"sgi gray 12\"\n },\n {\n \"value\":\"#282828\",\n \"name\":\"sgi gray 16\"\n },\n {\n \"value\":\"#515151\",\n \"name\":\"sgi gray 32\"\n },\n {\n \"value\":\"#5B5B5B\",\n \"name\":\"sgi gray 36\"\n },\n {\n \"value\":\"#848484\",\n \"name\":\"sgi gray 52\"\n },\n {\n \"value\":\"#8E8E8E\",\n \"name\":\"sgi gray 56\"\n },\n {\n \"value\":\"#AAAAAA\",\n \"name\":\"sgi lightgray\"\n },\n {\n \"value\":\"#B7B7B7\",\n \"name\":\"sgi gray 72\"\n },\n {\n \"value\":\"#C1C1C1\",\n \"name\":\"sgi gray 76\"\n },\n {\n \"value\":\"#EAEAEA\",\n \"name\":\"sgi gray 92\"\n },\n {\n \"value\":\"#F4F4F4\",\n \"name\":\"sgi gray 96\"\n },\n {\n \"value\":\"#FFFFFF\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"white\"\n },\n {\n \"value\":\"#F5F5F5\",\n \"name\":\"white smoke\"\n },\n {\n \"value\":\"#F5F5F5\",\n \"name\":\"gray 96\"\n },\n {\n \"value\":\"#DCDCDC\",\n \"css\":true,\n \"name\":\"gainsboro\"\n },\n {\n \"value\":\"#D3D3D3\",\n \"css\":true,\n \"name\":\"lightgrey\"\n },\n {\n \"value\":\"#C0C0C0\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"silver\"\n },\n {\n \"value\":\"#A9A9A9\",\n \"css\":true,\n \"name\":\"darkgray\"\n },\n {\n \"value\":\"#808080\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"gray\"\n },\n {\n \"value\":\"#696969\",\n \"css\":true,\n \"name\":\"dimgray\"\n },\n {\n \"value\":\"#696969\",\n \"name\":\"gray 42\"\n },\n {\n \"value\":\"#000000\",\n \"vga\":true,\n \"css\":true,\n \"name\":\"black\"\n },\n {\n \"value\":\"#FCFCFC\",\n \"name\":\"gray 99\"\n },\n {\n \"value\":\"#FAFAFA\",\n \"name\":\"gray 98\"\n },\n {\n \"value\":\"#F7F7F7\",\n \"name\":\"gray 97\"\n },\n {\n \"value\":\"#F2F2F2\",\n \"name\":\"gray 95\"\n },\n {\n \"value\":\"#F0F0F0\",\n \"name\":\"gray 94\"\n },\n {\n \"value\":\"#EDEDED\",\n \"name\":\"gray 93\"\n },\n {\n \"value\":\"#EBEBEB\",\n \"name\":\"gray 92\"\n },\n {\n \"value\":\"#E8E8E8\",\n \"name\":\"gray 91\"\n },\n {\n \"value\":\"#E5E5E5\",\n \"name\":\"gray 90\"\n },\n {\n \"value\":\"#E3E3E3\",\n \"name\":\"gray 89\"\n },\n {\n \"value\":\"#E0E0E0\",\n \"name\":\"gray 88\"\n },\n {\n \"value\":\"#DEDEDE\",\n \"name\":\"gray 87\"\n },\n {\n \"value\":\"#DBDBDB\",\n \"name\":\"gray 86\"\n },\n {\n \"value\":\"#D9D9D9\",\n \"name\":\"gray 85\"\n },\n {\n \"value\":\"#D6D6D6\",\n \"name\":\"gray 84\"\n },\n {\n \"value\":\"#D4D4D4\",\n \"name\":\"gray 83\"\n },\n {\n \"value\":\"#D1D1D1\",\n \"name\":\"gray 82\"\n },\n {\n \"value\":\"#CFCFCF\",\n \"name\":\"gray 81\"\n },\n {\n \"value\":\"#CCCCCC\",\n \"name\":\"gray 80\"\n },\n {\n \"value\":\"#C9C9C9\",\n \"name\":\"gray 79\"\n },\n {\n \"value\":\"#C7C7C7\",\n \"name\":\"gray 78\"\n },\n {\n \"value\":\"#C4C4C4\",\n \"name\":\"gray 77\"\n },\n {\n \"value\":\"#C2C2C2\",\n \"name\":\"gray 76\"\n },\n {\n \"value\":\"#BFBFBF\",\n \"name\":\"gray 75\"\n },\n {\n \"value\":\"#BDBDBD\",\n \"name\":\"gray 74\"\n },\n {\n \"value\":\"#BABABA\",\n \"name\":\"gray 73\"\n },\n {\n \"value\":\"#B8B8B8\",\n \"name\":\"gray 72\"\n },\n {\n \"value\":\"#B5B5B5\",\n \"name\":\"gray 71\"\n },\n {\n \"value\":\"#B3B3B3\",\n \"name\":\"gray 70\"\n },\n {\n \"value\":\"#B0B0B0\",\n \"name\":\"gray 69\"\n },\n {\n \"value\":\"#ADADAD\",\n \"name\":\"gray 68\"\n },\n {\n \"value\":\"#ABABAB\",\n \"name\":\"gray 67\"\n },\n {\n \"value\":\"#A8A8A8\",\n \"name\":\"gray 66\"\n },\n {\n \"value\":\"#A6A6A6\",\n \"name\":\"gray 65\"\n },\n {\n \"value\":\"#A3A3A3\",\n \"name\":\"gray 64\"\n },\n {\n \"value\":\"#A1A1A1\",\n \"name\":\"gray 63\"\n },\n {\n \"value\":\"#9E9E9E\",\n \"name\":\"gray 62\"\n },\n {\n \"value\":\"#9C9C9C\",\n \"name\":\"gray 61\"\n },\n {\n \"value\":\"#999999\",\n \"name\":\"gray 60\"\n },\n {\n \"value\":\"#969696\",\n \"name\":\"gray 59\"\n },\n {\n \"value\":\"#949494\",\n \"name\":\"gray 58\"\n },\n {\n \"value\":\"#919191\",\n \"name\":\"gray 57\"\n },\n {\n \"value\":\"#8F8F8F\",\n \"name\":\"gray 56\"\n },\n {\n \"value\":\"#8C8C8C\",\n \"name\":\"gray 55\"\n },\n {\n \"value\":\"#8A8A8A\",\n \"name\":\"gray 54\"\n },\n {\n \"value\":\"#878787\",\n \"name\":\"gray 53\"\n },\n {\n \"value\":\"#858585\",\n \"name\":\"gray 52\"\n },\n {\n \"value\":\"#828282\",\n \"name\":\"gray 51\"\n },\n {\n \"value\":\"#7F7F7F\",\n \"name\":\"gray 50\"\n },\n {\n \"value\":\"#7D7D7D\",\n \"name\":\"gray 49\"\n },\n {\n \"value\":\"#7A7A7A\",\n \"name\":\"gray 48\"\n },\n {\n \"value\":\"#787878\",\n \"name\":\"gray 47\"\n },\n {\n \"value\":\"#757575\",\n \"name\":\"gray 46\"\n },\n {\n \"value\":\"#737373\",\n \"name\":\"gray 45\"\n },\n {\n \"value\":\"#707070\",\n \"name\":\"gray 44\"\n },\n {\n \"value\":\"#6E6E6E\",\n \"name\":\"gray 43\"\n },\n {\n \"value\":\"#666666\",\n \"name\":\"gray 40\"\n },\n {\n \"value\":\"#636363\",\n \"name\":\"gray 39\"\n },\n {\n \"value\":\"#616161\",\n \"name\":\"gray 38\"\n },\n {\n \"value\":\"#5E5E5E\",\n \"name\":\"gray 37\"\n },\n {\n \"value\":\"#5C5C5C\",\n \"name\":\"gray 36\"\n },\n {\n \"value\":\"#595959\",\n \"name\":\"gray 35\"\n },\n {\n \"value\":\"#575757\",\n \"name\":\"gray 34\"\n },\n {\n \"value\":\"#545454\",\n \"name\":\"gray 33\"\n },\n {\n \"value\":\"#525252\",\n \"name\":\"gray 32\"\n },\n {\n \"value\":\"#4F4F4F\",\n \"name\":\"gray 31\"\n },\n {\n \"value\":\"#4D4D4D\",\n \"name\":\"gray 30\"\n },\n {\n \"value\":\"#4A4A4A\",\n \"name\":\"gray 29\"\n },\n {\n \"value\":\"#474747\",\n \"name\":\"gray 28\"\n },\n {\n \"value\":\"#454545\",\n \"name\":\"gray 27\"\n },\n {\n \"value\":\"#424242\",\n \"name\":\"gray 26\"\n },\n {\n \"value\":\"#404040\",\n \"name\":\"gray 25\"\n },\n {\n \"value\":\"#3D3D3D\",\n \"name\":\"gray 24\"\n },\n {\n \"value\":\"#3B3B3B\",\n \"name\":\"gray 23\"\n },\n {\n \"value\":\"#383838\",\n \"name\":\"gray 22\"\n },\n {\n \"value\":\"#363636\",\n \"name\":\"gray 21\"\n },\n {\n \"value\":\"#333333\",\n \"name\":\"gray 20\"\n },\n {\n \"value\":\"#303030\",\n \"name\":\"gray 19\"\n },\n {\n \"value\":\"#2E2E2E\",\n \"name\":\"gray 18\"\n },\n {\n \"value\":\"#2B2B2B\",\n \"name\":\"gray 17\"\n },\n {\n \"value\":\"#292929\",\n \"name\":\"gray 16\"\n },\n {\n \"value\":\"#262626\",\n \"name\":\"gray 15\"\n },\n {\n \"value\":\"#242424\",\n \"name\":\"gray 14\"\n },\n {\n \"value\":\"#212121\",\n \"name\":\"gray 13\"\n },\n {\n \"value\":\"#1F1F1F\",\n \"name\":\"gray 12\"\n },\n {\n \"value\":\"#1C1C1C\",\n \"name\":\"gray 11\"\n },\n {\n \"value\":\"#1A1A1A\",\n \"name\":\"gray 10\"\n },\n {\n \"value\":\"#171717\",\n \"name\":\"gray 9\"\n },\n {\n \"value\":\"#141414\",\n \"name\":\"gray 8\"\n },\n {\n \"value\":\"#121212\",\n \"name\":\"gray 7\"\n },\n {\n \"value\":\"#0F0F0F\",\n \"name\":\"gray 6\"\n },\n {\n \"value\":\"#0D0D0D\",\n \"name\":\"gray 5\"\n },\n {\n \"value\":\"#0A0A0A\",\n \"name\":\"gray 4\"\n },\n {\n \"value\":\"#080808\",\n \"name\":\"gray 3\"\n },\n {\n \"value\":\"#050505\",\n \"name\":\"gray 2\"\n },\n {\n \"value\":\"#030303\",\n \"name\":\"gray 1\"\n },\n {\n \"value\":\"#F5F5F5\",\n \"css\":true,\n \"name\":\"whitesmoke\"\n }\n]\n","/**\n * Module dependencies\n */\nvar colors = require('./colors')\n\nvar cssColors = colors.filter(function(color){\n return !! color.css\n})\n\nvar vgaColors = colors.filter(function(color){\n return !! color.vga\n})\n\n\n/**\n * Get color value for a certain name.\n * @param name {String}\n * @return {String} Hex color value\n * @api public\n */\n\nmodule.exports = function(name) {\n var color = module.exports.get(name)\n return color && color.value\n}\n\n/**\n * Get color object.\n *\n * @param name {String}\n * @return {Object} Color object\n * @api public\n */\n\nmodule.exports.get = function(name) {\n name = name || ''\n name = name.trim().toLowerCase()\n return colors.filter(function(color){\n return color.name.toLowerCase() === name\n }).pop()\n}\n\n/**\n * Get all color object.\n *\n * @return {Array}\n * @api public\n */\n\nmodule.exports.all = module.exports.get.all = function() {\n return colors\n}\n\n/**\n * Get color object compatible with CSS.\n *\n * @return {Array}\n * @api public\n */\n\nmodule.exports.get.css = function(name) {\n if (!name) return cssColors\n name = name || ''\n name = name.trim().toLowerCase()\n return cssColors.filter(function(color){\n return color.name.toLowerCase() === name\n }).pop()\n}\n\n\n\nmodule.exports.get.vga = function(name) {\n if (!name) return vgaColors\n name = name || ''\n name = name.trim().toLowerCase()\n return vgaColors.filter(function(color){\n return color.name.toLowerCase() === name\n }).pop()\n}\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match words composed of alphanumeric characters. */\nvar reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20f0',\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\",\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar rsLowerMisc = '(?:' + rsLower + '|' + rsMisc + ')',\n rsUpperMisc = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptLowerContr = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptUpperContr = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq;\n\n/** Used to match complex or compound words. */\nvar reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptLowerContr + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsUpperMisc + '+' + rsOptUpperContr + '(?=' + [rsBreak, rsUpper + rsLowerMisc, '$'].join('|') + ')',\n rsUpper + '?' + rsLowerMisc + '+' + rsOptLowerContr,\n rsUpper + '+' + rsOptUpperContr,\n rsDigits,\n rsEmoji\n].join('|'), 'g');\n\n/** Used to detect strings that need a more robust regexp to match words. */\nvar reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction asciiWords(string) {\n return string.match(reAsciiWord) || [];\n}\n\n/**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\nfunction hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n}\n\n/**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\nfunction words(string, pattern, guard) {\n string = toString(string);\n pattern = guard ? undefined : pattern;\n\n if (pattern === undefined) {\n return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n }\n return string.match(pattern) || [];\n}\n\nmodule.exports = words;\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20f0',\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\n/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n if (value !== value) {\n return baseFindIndex(array, baseIsNaN, fromIndex);\n }\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\n/**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */\nfunction charsStartIndex(strSymbols, chrSymbols) {\n var index = -1,\n length = strSymbols.length;\n\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n}\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Removes leading whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimStart(' abc ');\n * // => 'abc '\n *\n * _.trimStart('-_-abc-_-', '_-');\n * // => 'abc-_-'\n */\nfunction trimStart(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return string.replace(reTrimStart, '');\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n start = charsStartIndex(strSymbols, stringToArray(chars));\n\n return castSlice(strSymbols, start).join('');\n}\n\nmodule.exports = trimStart;\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20f0',\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nvar asciiSize = baseProperty('length');\n\n/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\n/**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\nfunction stringSize(string) {\n return hasUnicode(string)\n ? unicodeSize(string)\n : asciiSize(string);\n}\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\n/**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nfunction unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n result++;\n }\n return result;\n}\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n nativeFloor = Math.floor;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.repeat` which doesn't coerce arguments.\n *\n * @private\n * @param {string} string The string to repeat.\n * @param {number} n The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n */\nfunction baseRepeat(string, n) {\n var result = '';\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n return result;\n }\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n do {\n if (n % 2) {\n result += string;\n }\n n = nativeFloor(n / 2);\n if (n) {\n string += string;\n }\n } while (n);\n\n return result;\n}\n\n/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\n/**\n * Creates the padding for `string` based on `length`. The `chars` string\n * is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {number} length The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padding for `string`.\n */\nfunction createPadding(length, chars) {\n chars = chars === undefined ? ' ' : baseToString(chars);\n\n var charsLength = chars.length;\n if (charsLength < 2) {\n return charsLength ? baseRepeat(chars, length) : chars;\n }\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n return hasUnicode(chars)\n ? castSlice(stringToArray(result), 0, length).join('')\n : result.slice(0, length);\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padEnd('abc', 6);\n * // => 'abc '\n *\n * _.padEnd('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padEnd('abc', 3);\n * // => 'abc'\n */\nfunction padEnd(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (string + createPadding(length - strLength, chars))\n : string;\n}\n\nmodule.exports = padEnd;\n","'use strict';\n/* eslint-disable no-mixed-operators */\nmodule.exports = (red, green, blue, alpha) => {\n\tconst isPercent = (red + (alpha || '')).toString().includes('%');\n\n\tif (typeof red === 'string') {\n\t\t[red, green, blue, alpha] = red.match(/(0?\\.?\\d{1,3})%?\\b/g).map(Number);\n\t} else if (alpha !== undefined) {\n\t\talpha = parseFloat(alpha);\n\t}\n\n\tif (typeof red !== 'number' ||\n\t\ttypeof green !== 'number' ||\n\t\ttypeof blue !== 'number' ||\n\t\tred > 255 ||\n\t\tgreen > 255 ||\n\t\tblue > 255\n\t) {\n\t\tthrow new TypeError('Expected three numbers below 256');\n\t}\n\n\tif (typeof alpha === 'number') {\n\t\tif (!isPercent && alpha >= 0 && alpha <= 1) {\n\t\t\talpha = Math.round(255 * alpha);\n\t\t} else if (isPercent && alpha >= 0 && alpha <= 100) {\n\t\t\talpha = Math.round(255 * alpha / 100);\n\t\t} else {\n\t\t\tthrow new TypeError(`Expected alpha value (${alpha}) as a fraction or percentage`);\n\t\t}\n\n\t\talpha = (alpha | 1 << 8).toString(16).slice(1);\n\t} else {\n\t\talpha = '';\n\t}\n\n\treturn ((blue | green << 8 | red << 16) | 1 << 24).toString(16).slice(1) + alpha;\n};\n/* eslint-enable no-mixed-operators */\n","'use strict';\n\nconst hexCharacters = 'a-f\\\\d';\nconst match3or4Hex = `#?[${hexCharacters}]{3}[${hexCharacters}]?`;\nconst match6or8Hex = `#?[${hexCharacters}]{6}([${hexCharacters}]{2})?`;\nconst nonHexChars = new RegExp(`[^#${hexCharacters}]`, 'gi');\nconst validHexSize = new RegExp(`^${match3or4Hex}$|^${match6or8Hex}$`, 'i');\n\nmodule.exports = (hex, options = {}) => {\n\tif (typeof hex !== 'string' || nonHexChars.test(hex) || !validHexSize.test(hex)) {\n\t\tthrow new TypeError('Expected a valid hex string');\n\t}\n\n\thex = hex.replace(/^#/, '');\n\tlet alphaFromHex = 1;\n\n\tif (hex.length === 8) {\n\t\talphaFromHex = Number.parseInt(hex.slice(6, 8), 16) / 255;\n\t\thex = hex.slice(0, 6);\n\t}\n\n\tif (hex.length === 4) {\n\t\talphaFromHex = Number.parseInt(hex.slice(3, 4).repeat(2), 16) / 255;\n\t\thex = hex.slice(0, 3);\n\t}\n\n\tif (hex.length === 3) {\n\t\thex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n\t}\n\n\tconst number = Number.parseInt(hex, 16);\n\tconst red = number >> 16;\n\tconst green = (number >> 8) & 255;\n\tconst blue = number & 255;\n\tconst alpha = typeof options.alpha === 'number' ? options.alpha : alphaFromHex;\n\n\tif (options.format === 'array') {\n\t\treturn [red, green, blue, alpha];\n\t}\n\n\tif (options.format === 'css') {\n\t\tconst alphaString = alpha === 1 ? '' : ` / ${Number((alpha * 100).toFixed(2))}%`;\n\t\treturn `rgb(${red} ${green} ${blue}${alphaString})`;\n\t}\n\n\treturn {red, green, blue, alpha};\n};\n","var toHex = require('colornames');\nvar _words = require('lodash.words');\nvar trimStart = require('lodash.trimstart');\nvar padEnd = require('lodash.padend');\nvar rgbHex = require('rgb-hex');\nvar hexRgb = require('hex-rgb');\n\nconst MIXED_WEIGHT = 0.75;\nconst TEXT_WEIGHT = 0.25;\nconst SEED = 16777215;\nconst FACTOR = 49979693;\n\nmodule.exports = function(object) {\n return '#' + generateColor(String(JSON.stringify(object)));\n};\n\nfunction getColors(text) {\n var words = _words(text);\n var colors = [];\n words.forEach(function(word) {\n var color = toHex(word);\n if (color) colors.push(hexRgb(trimStart(color, '#'), {format: 'array'}));\n });\n return colors;\n}\n\nfunction mixColors(colors) {\n var mixed = [0, 0, 0];\n colors.forEach(function(value) {\n for (var i = 0; i < 3; i++) mixed[i] += value[i];\n });\n return [mixed[0] / colors.length, mixed[1] / colors.length, mixed[2] / colors.length];\n}\n\nfunction generateColor(text) {\n var mixed;\n var colors = getColors(text);\n if (colors.length > 0) mixed = mixColors(colors);\n var b = 1;\n var d = 0;\n var f = 1;\n if (text.length > 0) {\n for (var i = 0; i < text.length; i++)\n text[i].charCodeAt(0) > d && (d = text[i].charCodeAt(0)),\n (f = parseInt(SEED / d)),\n (b = (b + text[i].charCodeAt(0) * f * FACTOR) % SEED);\n }\n var hex = ((b * text.length) % SEED).toString(16);\n hex = padEnd(hex, 6, hex);\n var rgb = hexRgb(hex, {format: 'array'});\n if (mixed)\n return rgbHex(\n TEXT_WEIGHT * rgb[0] + MIXED_WEIGHT * mixed[0],\n TEXT_WEIGHT * rgb[1] + MIXED_WEIGHT * mixed[1],\n TEXT_WEIGHT * rgb[2] + MIXED_WEIGHT * mixed[2]\n );\n return hex;\n}\n","/*!\nfflate - fast JavaScript compression/decompression\n\nLicensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE\nversion 0.6.9\n*/\n\n// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar durl = function (c) { return URL.createObjectURL(new Blob([c], { type: 'text/javascript' })); };\nvar cwk = function (u) { return new Worker(u); };\ntry {\n URL.revokeObjectURL(durl(''));\n}\ncatch (e) {\n // We're in Deno or a very old browser\n durl = function (c) { return 'data:application/javascript;charset=UTF-8,' + encodeURI(c); };\n // If Deno, this is necessary; if not, this changes nothing\n cwk = function (u) { return new Worker(u, { type: 'module' }); };\n}\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = cwk(ch2[id] || (ch2[id] = durl(c)));\n w.onerror = function (e) { return cb(e.error, null); };\n w.onmessage = function (e) { return cb(null, e.data); };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\n// see fleb note\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new u32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return [b, r];\n};\nvar _a = freb(fleb, 2), fl = _a[0], revfl = _a[1];\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i)\n ++l[cd[i] - 1];\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 0; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >>> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >>> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p / 8) | 0) + (p & 7 && 1); };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n var n = new (v instanceof u16 ? u16 : v instanceof u32 ? u32 : u8)(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, buf, st) {\n // source length\n var sl = dat.length;\n if (!sl || (st && !st.l && sl < 5))\n return buf || new u8(0);\n // have to estimate size\n var noBuf = !buf || st;\n // no state\n var noSt = !st || st.i;\n if (!st)\n st = {};\n // Assumes roughly 33% compression ratio average\n if (!buf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n st.f = final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n // ensure size\n if (noBuf)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >>> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n throw 'invalid block type';\n if (pos > tbts) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17;\n if (noBuf)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >>> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n if (!c)\n throw 'invalid length/literal';\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;\n if (!d)\n throw 'invalid distance';\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & ((1 << b) - 1), pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n if (noBuf)\n cbuf(bt + 131072);\n var end = bt + add;\n for (; bt < end; bt += 4) {\n buf[bt] = buf[bt - dt];\n buf[bt + 1] = buf[bt + 1 - dt];\n buf[bt + 2] = buf[bt + 2 - dt];\n buf[bt + 3] = buf[bt + 3 - dt];\n }\n bt = end;\n }\n }\n st.l = lm, st.p = lpos, st.b = bt;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n return bt == buf.length ? buf : slc(buf, 0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n d[o + 2] |= v >>> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return [et, 0];\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return [v, 1];\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return [new u8(tr), mbt];\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return [cl.subarray(0, cli), s];\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >>> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a[0], mlb = _a[1];\n var _b = hTree(df, 15), ddt = _b[0], mdb = _b[1];\n var _c = lc(dlt), lclt = _c[0], nlc = _c[1];\n var _d = lc(ddt), lcdt = _d[0], ndc = _d[1];\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n lcfreq[lclt[i] & 31]++;\n for (var i = 0; i < lcdt.length; ++i)\n lcfreq[lcdt[i] & 31]++;\n var _e = hTree(lcfreq, 7), lct = _e[0], mlcb = _e[1];\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + (2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]);\n if (flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >>> 5) & 127), p += clct[i] >>> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n if (syms[i] > 255) {\n var len = (syms[i] >>> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (syms[i] >>> 23) & 31), p += fleb[len];\n var dst = syms[i] & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (syms[i] >>> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[syms[i]]), p += ll[syms[i]];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, lst) {\n var s = dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var pos = 0;\n if (!lvl || s < 8) {\n for (var i = 0; i <= s; i += 65535) {\n // end\n var e = i + 65535;\n if (e < s) {\n // write full block\n pos = wfblk(w, pos, dat.subarray(i, e));\n }\n else {\n // write final block\n w[i] = lst;\n pos = wfblk(w, pos, dat.subarray(i, s));\n }\n }\n }\n else {\n var opt = deo[lvl - 1];\n var n = opt >>> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = new u16(32768), head = new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new u32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx bitpos\n var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n for (; i < s; ++i) {\n // hash value\n // deopt when i > s - 3 - at end, deopt acceptable\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && rem > 423) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = (imod - pimod) & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = (i - dif + j + 32768) & 32767;\n var pti = prev[ti];\n var cd = (ti - pti + 32768) & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += (imod - pimod + 32768) & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one Uint32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n // this is the easiest way to avoid needing to maintain state\n if (!lst && pos & 7)\n pos = wfblk(w, pos + 1, et);\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new u32(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && 0xEDB88320) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Alder32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a >>> 8) << 16 | (b & 255) << 8 | (b >>> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : (12 + opt.mem), pre, post, !st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/ /g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return [fnStr, td];\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k] instanceof u8 || v[k] instanceof u16 || v[k] instanceof u32)\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n var _a;\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n _a = wcln(fns[i], fnStr, td_1), fnStr = _a[0], td_1 = _a[1];\n ch[id] = wcln(fns[m], fnStr, td_1);\n }\n var td = mrg({}, ch[id][1]);\n return wk(ch[id][0] + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, u32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, hMap, max, bits, bits16, shft, slc, inflt, inflateSync, pbf, gu8]; };\nvar bDflt = function () { return [u8, u16, u32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zlv]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get u8\nvar gu8 = function (o) { return o && o.size && new u8(o.size); };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) { return strm.push(ev.data[0], ev.data[1]); };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.push = function (d, f) {\n if (t)\n throw 'stream finished';\n if (!strm.ondata)\n throw 'no stream handler';\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n throw 'invalid gzip data';\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += d[10] | (d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return ((d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16) | (d[l - 1] << 24)) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + ((o.filename && (o.filename.length + 1)) || 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (fl ? (32 - 2 * fl) : 1);\n};\n// zlib valid\nvar zlv = function (d) {\n if ((d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n throw 'invalid zlib data';\n if (d[1] & 32)\n throw 'invalid zlib data: preset dictionaries not supported';\n};\nfunction AsyncCmpStrm(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n// zlib footer: -4 to -0 is Adler32\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, !f), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n this.d = final;\n this.p(chunk, final || false);\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n /**\n * Creates an inflation stream\n * @param cb The callback to call whenever data is inflated\n */\n function Inflate(cb) {\n this.s = {};\n this.p = new u8(0);\n this.ondata = cb;\n }\n Inflate.prototype.e = function (c) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n var l = this.p.length;\n var n = new u8(l + c.length);\n n.set(this.p), n.set(c, l), this.p = n;\n };\n Inflate.prototype.c = function (final) {\n this.d = this.s.i = final || false;\n var bts = this.s.b;\n var dt = inflt(this.p, this.o, this.s);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous inflation stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncInflate(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, 0, function () {\n var strm = new Inflate();\n onmessage = astrm(strm);\n }, 7);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gu8(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, out) {\n return inflt(data, out);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n this.c.p(c);\n this.l += c.length;\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, !f);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n /**\n * Creates a GUNZIP stream\n * @param cb The callback to call whenever data is inflated\n */\n function Gunzip(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n var s = this.p.length > 3 ? gzs(this.p) : 4;\n if (s >= this.p.length && !final)\n return;\n this.p = this.p.subarray(s), this.v = 0;\n }\n if (final) {\n if (this.p.length < 8)\n throw 'invalid gzip stream';\n this.p = this.p.subarray(0, -8);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous GUNZIP stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncGunzip(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, 0, function () {\n var strm = new Gunzip();\n onmessage = astrm(strm);\n }, 9);\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param out Where to write the data. GZIP already encodes the output size, so providing this doesn't save memory.\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, out) {\n return inflt(data.subarray(gzs(data), -8), out || new u8(gzl(data)));\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n this.c.p(c);\n var raw = dopt(c, this.o, this.v && 2, f && 4, !f);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n /**\n * Creates a Zlib decompression stream\n * @param cb The callback to call whenever data is inflated\n */\n function Unzlib(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 2 && !final)\n return;\n this.p = this.p.subarray(2), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n throw 'invalid zlib stream';\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous Zlib decompression stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncUnzlib(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, 0, function () {\n var strm = new Unzlib();\n onmessage = astrm(strm);\n }, 11);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gu8(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, out) {\n return inflt((zlv(data), data.subarray(2, -4)), out);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function Decompress(cb) {\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no stream handler';\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n var _this_1 = this;\n var cb = function () { _this_1.ondata.apply(_this_1, arguments); };\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(cb)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(cb)\n : new this.Z(cb);\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function AsyncDecompress(cb) {\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, out) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, out)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, out)\n : unzlibSync(data, out);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k;\n if (val instanceof u8)\n t[n] = [val, o];\n else if (Array.isArray(val))\n t[n] = [val[0], mrg(o, val[1])];\n else\n fltn(val, n + '/', t, o);\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return [r, slc(d, i - 1)];\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no callback';\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n throw 'invalid utf-8 data';\n this.t = null;\n }\n return;\n }\n if (!this.p)\n throw 'stream finished';\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), ch = _a[0], np = _a[1];\n if (final) {\n if (np.length)\n throw 'invalid utf-8 data';\n this.p = null;\n }\n else\n this.p = np;\n this.ondata(ch, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no callback';\n if (this.d)\n throw 'stream finished';\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td)\n return td.decode(dat);\n else {\n var _a = dutf8(dat), out = _a[0], ext = _a[1];\n if (ext.length)\n throw 'invalid utf-8 data';\n return out;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n throw 'extra field too long';\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c == null && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n throw 'date not in range 1980-2099';\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >>> 1)), b += 4;\n if (c != null) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no callback - add to ZIP archive before pushing';\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this_1 = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this_1 = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this_1.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this_1 = this;\n if (this.d & 2)\n throw 'stream finished';\n var f = strToU8(file.filename), fl = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl != file.filename.length || (o && (com.length != o.length));\n var hl = fl + exfl(file.extra) + 30;\n if (fl > 65535)\n throw 'filename too long';\n var header = new u8(hl);\n wzh(header, 0, file, f, u);\n var chks = [header];\n var pAll = function () {\n for (var _i = 0, chks_1 = chks; _i < chks_1.length; _i++) {\n var chk = chks_1[_i];\n _this_1.ondata(null, chk, false);\n }\n chks = [];\n };\n var tr = this.d;\n this.d = 0;\n var ind = this.u.length;\n var uf = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll();\n if (tr) {\n var nxt = _this_1.u[ind + 1];\n if (nxt)\n nxt.r();\n else\n _this_1.d = 1;\n }\n tr = 1;\n }\n });\n var cl = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this_1.ondata(err, dat, final);\n _this_1.terminate();\n }\n else {\n cl += dat.length;\n chks.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl);\n wbytes(dd, 12, file.size);\n chks.push(dd);\n uf.c = cl, uf.b = hl + cl + 16, uf.crc = file.crc, uf.size = file.size;\n if (tr)\n uf.r();\n tr = 1;\n }\n else if (tr)\n pAll();\n }\n };\n this.u.push(uf);\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this_1 = this;\n if (this.d & 2) {\n if (this.d & 1)\n throw 'stream finishing';\n throw 'stream finished';\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this_1.d & 1))\n return;\n _this_1.u.splice(-1, 1);\n _this_1.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, f.c, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cb(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cb(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl('filename too long', null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n throw 'filename too long';\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (data, final) {\n this.ondata(null, data, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this_1 = this;\n this.i = new Inflate(function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (data, final) {\n try {\n this.i.push(data, final);\n }\n catch (e) {\n this.ondata(e, data, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this_1 = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this_1.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (data, final) {\n if (this.i.terminate)\n data = slc(data, 0);\n this.i.push(data, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this_1 = this;\n if (!this.onfile)\n throw 'no callback';\n if (!this.p)\n throw 'stream finished';\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var _a;\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_2 = [];\n this_1.k.unshift(chks_2);\n f = 2;\n var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n if (sc_1 == 4294967295) {\n _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n }\n else if (dd)\n sc_1 = -1;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n throw 'no callback';\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this_1.o[cmp_1];\n if (!ctr)\n throw 'unknown compression type ' + cmp_1;\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_3 = chks_2; _i < chks_3.length; _i++) {\n var dat = chks_3[_i];\n d_1.push(dat, false);\n }\n if (_this_1.k[0] == chks_2 && _this_1.c)\n _this_1.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n throw 'invalid zip file';\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\n/**\n * Asynchronously decompresses a ZIP archive\n * @param data The raw compressed ZIP file\n * @param cb The callback to call with the decompressed files\n * @returns A function that can be used to immediately terminate the unzipping\n */\nexport function unzip(data, cb) {\n if (typeof cb != 'function')\n throw 'no callback';\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cb('invalid zip file', null);\n return;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (!lft)\n cb(null, {});\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50) {\n cb('invalid zip file', null);\n return;\n }\n c = lft = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n files[fn] = d;\n if (!--lft)\n cb(null, files);\n }\n };\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n if (sc < 320000) {\n try {\n cbl(null, inflateSync(infl, new u8(su)));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl('unknown compression type ' + c_1, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @returns The decompressed files\n */\nexport function unzipSync(data) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n throw 'invalid zip file';\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n throw 'invalid zip file';\n c = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), new u8(su));\n else\n throw 'unknown compression type ' + c_2;\n }\n return files;\n}\n","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearEncoding,\n\tLinearFilter,\n\tRedFormat,\n\tRGBAFormat\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\n\n/**\n * OpenEXR loader currently supports uncompressed, ZIP(S), RLE, PIZ and DWA/B compression.\n * Supports reading as UnsignedByte, HalfFloat and Float type data texture.\n *\n * Referred to the original Industrial Light & Magic OpenEXR implementation and the TinyEXR / Syoyo Fujita\n * implementation, so I have preserved their copyright notices.\n */\n\n// /*\n// Copyright (c) 2014 - 2017, Syoyo Fujita\n// All rights reserved.\n\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above copyright\n// notice, this list of conditions and the following disclaimer in the\n// documentation and/or other materials provided with the distribution.\n// * Neither the name of the Syoyo Fujita nor the\n// names of its contributors may be used to endorse or promote products\n// derived from this software without specific prior written permission.\n\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n// DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY\n// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// */\n\n// // TinyEXR contains some OpenEXR code, which is licensed under ------------\n\n// ///////////////////////////////////////////////////////////////////////////\n// //\n// // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\n// // Digital Ltd. LLC\n// //\n// // All rights reserved.\n// //\n// // Redistribution and use in source and binary forms, with or without\n// // modification, are permitted provided that the following conditions are\n// // met:\n// // * Redistributions of source code must retain the above copyright\n// // notice, this list of conditions and the following disclaimer.\n// // * Redistributions in binary form must reproduce the above\n// // copyright notice, this list of conditions and the following disclaimer\n// // in the documentation and/or other materials provided with the\n// // distribution.\n// // * Neither the name of Industrial Light & Magic nor the names of\n// // its contributors may be used to endorse or promote products derived\n// // from this software without specific prior written permission.\n// //\n// // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// // \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// //\n// ///////////////////////////////////////////////////////////////////////////\n\n// // End of OpenEXR license -------------------------------------------------\n\nclass EXRLoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\tparse( buffer ) {\n\n\t\tconst USHORT_RANGE = ( 1 << 16 );\n\t\tconst BITMAP_SIZE = ( USHORT_RANGE >> 3 );\n\n\t\tconst HUF_ENCBITS = 16; // literal (value) bit length\n\t\tconst HUF_DECBITS = 14; // decoding bit size (>= 8)\n\n\t\tconst HUF_ENCSIZE = ( 1 << HUF_ENCBITS ) + 1; // encoding table size\n\t\tconst HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size\n\t\tconst HUF_DECMASK = HUF_DECSIZE - 1;\n\n\t\tconst NBITS = 16;\n\t\tconst A_OFFSET = 1 << ( NBITS - 1 );\n\t\tconst MOD_MASK = ( 1 << NBITS ) - 1;\n\n\t\tconst SHORT_ZEROCODE_RUN = 59;\n\t\tconst LONG_ZEROCODE_RUN = 63;\n\t\tconst SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN;\n\n\t\tconst ULONG_SIZE = 8;\n\t\tconst FLOAT32_SIZE = 4;\n\t\tconst INT32_SIZE = 4;\n\t\tconst INT16_SIZE = 2;\n\t\tconst INT8_SIZE = 1;\n\n\t\tconst STATIC_HUFFMAN = 0;\n\t\tconst DEFLATE = 1;\n\n\t\tconst UNKNOWN = 0;\n\t\tconst LOSSY_DCT = 1;\n\t\tconst RLE = 2;\n\n\t\tconst logBase = Math.pow( 2.7182818, 2.2 );\n\n\t\tfunction reverseLutFromBitmap( bitmap, lut ) {\n\n\t\t\tlet k = 0;\n\n\t\t\tfor ( let i = 0; i < USHORT_RANGE; ++ i ) {\n\n\t\t\t\tif ( ( i == 0 ) || ( bitmap[ i >> 3 ] & ( 1 << ( i & 7 ) ) ) ) {\n\n\t\t\t\t\tlut[ k ++ ] = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst n = k - 1;\n\n\t\t\twhile ( k < USHORT_RANGE ) lut[ k ++ ] = 0;\n\n\t\t\treturn n;\n\n\t\t}\n\n\t\tfunction hufClearDecTable( hdec ) {\n\n\t\t\tfor ( let i = 0; i < HUF_DECSIZE; i ++ ) {\n\n\t\t\t\thdec[ i ] = {};\n\t\t\t\thdec[ i ].len = 0;\n\t\t\t\thdec[ i ].lit = 0;\n\t\t\t\thdec[ i ].p = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst getBitsReturn = { l: 0, c: 0, lc: 0 };\n\n\t\tfunction getBits( nBits, c, lc, uInt8Array, inOffset ) {\n\n\t\t\twhile ( lc < nBits ) {\n\n\t\t\t\tc = ( c << 8 ) | parseUint8Array( uInt8Array, inOffset );\n\t\t\t\tlc += 8;\n\n\t\t\t}\n\n\t\t\tlc -= nBits;\n\n\t\t\tgetBitsReturn.l = ( c >> lc ) & ( ( 1 << nBits ) - 1 );\n\t\t\tgetBitsReturn.c = c;\n\t\t\tgetBitsReturn.lc = lc;\n\n\t\t}\n\n\t\tconst hufTableBuffer = new Array( 59 );\n\n\t\tfunction hufCanonicalCodeTable( hcode ) {\n\n\t\t\tfor ( let i = 0; i <= 58; ++ i ) hufTableBuffer[ i ] = 0;\n\t\t\tfor ( let i = 0; i < HUF_ENCSIZE; ++ i ) hufTableBuffer[ hcode[ i ] ] += 1;\n\n\t\t\tlet c = 0;\n\n\t\t\tfor ( let i = 58; i > 0; -- i ) {\n\n\t\t\t\tconst nc = ( ( c + hufTableBuffer[ i ] ) >> 1 );\n\t\t\t\thufTableBuffer[ i ] = c;\n\t\t\t\tc = nc;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < HUF_ENCSIZE; ++ i ) {\n\n\t\t\t\tconst l = hcode[ i ];\n\t\t\t\tif ( l > 0 ) hcode[ i ] = l | ( hufTableBuffer[ l ] ++ << 6 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction hufUnpackEncTable( uInt8Array, inOffset, ni, im, iM, hcode ) {\n\n\t\t\tconst p = inOffset;\n\t\t\tlet c = 0;\n\t\t\tlet lc = 0;\n\n\t\t\tfor ( ; im <= iM; im ++ ) {\n\n\t\t\t\tif ( p.value - inOffset.value > ni ) return false;\n\n\t\t\t\tgetBits( 6, c, lc, uInt8Array, p );\n\n\t\t\t\tconst l = getBitsReturn.l;\n\t\t\t\tc = getBitsReturn.c;\n\t\t\t\tlc = getBitsReturn.lc;\n\n\t\t\t\thcode[ im ] = l;\n\n\t\t\t\tif ( l == LONG_ZEROCODE_RUN ) {\n\n\t\t\t\t\tif ( p.value - inOffset.value > ni ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgetBits( 8, c, lc, uInt8Array, p );\n\n\t\t\t\t\tlet zerun = getBitsReturn.l + SHORTEST_LONG_RUN;\n\t\t\t\t\tc = getBitsReturn.c;\n\t\t\t\t\tlc = getBitsReturn.lc;\n\n\t\t\t\t\tif ( im + zerun > iM + 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( zerun -- ) hcode[ im ++ ] = 0;\n\n\t\t\t\t\tim --;\n\n\t\t\t\t} else if ( l >= SHORT_ZEROCODE_RUN ) {\n\n\t\t\t\t\tlet zerun = l - SHORT_ZEROCODE_RUN + 2;\n\n\t\t\t\t\tif ( im + zerun > iM + 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( zerun -- ) hcode[ im ++ ] = 0;\n\n\t\t\t\t\tim --;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thufCanonicalCodeTable( hcode );\n\n\t\t}\n\n\t\tfunction hufLength( code ) {\n\n\t\t\treturn code & 63;\n\n\t\t}\n\n\t\tfunction hufCode( code ) {\n\n\t\t\treturn code >> 6;\n\n\t\t}\n\n\t\tfunction hufBuildDecTable( hcode, im, iM, hdecod ) {\n\n\t\t\tfor ( ; im <= iM; im ++ ) {\n\n\t\t\t\tconst c = hufCode( hcode[ im ] );\n\t\t\t\tconst l = hufLength( hcode[ im ] );\n\n\t\t\t\tif ( c >> l ) {\n\n\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( l > HUF_DECBITS ) {\n\n\t\t\t\t\tconst pl = hdecod[ ( c >> ( l - HUF_DECBITS ) ) ];\n\n\t\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.lit ++;\n\n\t\t\t\t\tif ( pl.p ) {\n\n\t\t\t\t\t\tconst p = pl.p;\n\t\t\t\t\t\tpl.p = new Array( pl.lit );\n\n\t\t\t\t\t\tfor ( let i = 0; i < pl.lit - 1; ++ i ) {\n\n\t\t\t\t\t\t\tpl.p[ i ] = p[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpl.p = new Array( 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.p[ pl.lit - 1 ] = im;\n\n\t\t\t\t} else if ( l ) {\n\n\t\t\t\t\tlet plOffset = 0;\n\n\t\t\t\t\tfor ( let i = 1 << ( HUF_DECBITS - l ); i > 0; i -- ) {\n\n\t\t\t\t\t\tconst pl = hdecod[ ( c << ( HUF_DECBITS - l ) ) + plOffset ];\n\n\t\t\t\t\t\tif ( pl.len || pl.p ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpl.len = l;\n\t\t\t\t\t\tpl.lit = im;\n\n\t\t\t\t\t\tplOffset ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst getCharReturn = { c: 0, lc: 0 };\n\n\t\tfunction getChar( c, lc, uInt8Array, inOffset ) {\n\n\t\t\tc = ( c << 8 ) | parseUint8Array( uInt8Array, inOffset );\n\t\t\tlc += 8;\n\n\t\t\tgetCharReturn.c = c;\n\t\t\tgetCharReturn.lc = lc;\n\n\t\t}\n\n\t\tconst getCodeReturn = { c: 0, lc: 0 };\n\n\t\tfunction getCode( po, rlc, c, lc, uInt8Array, inOffset, outBuffer, outBufferOffset, outBufferEndOffset ) {\n\n\t\t\tif ( po == rlc ) {\n\n\t\t\t\tif ( lc < 8 ) {\n\n\t\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\t\t\t\t\tc = getCharReturn.c;\n\t\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\t}\n\n\t\t\t\tlc -= 8;\n\n\t\t\t\tlet cs = ( c >> lc );\n\t\t\t\tcs = new Uint8Array( [ cs ] )[ 0 ];\n\n\t\t\t\tif ( outBufferOffset.value + cs > outBufferEndOffset ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tconst s = outBuffer[ outBufferOffset.value - 1 ];\n\n\t\t\t\twhile ( cs -- > 0 ) {\n\n\t\t\t\t\toutBuffer[ outBufferOffset.value ++ ] = s;\n\n\t\t\t\t}\n\n\t\t\t} else if ( outBufferOffset.value < outBufferEndOffset ) {\n\n\t\t\t\toutBuffer[ outBufferOffset.value ++ ] = po;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tgetCodeReturn.c = c;\n\t\t\tgetCodeReturn.lc = lc;\n\n\t\t}\n\n\t\tfunction UInt16( value ) {\n\n\t\t\treturn ( value & 0xFFFF );\n\n\t\t}\n\n\t\tfunction Int16( value ) {\n\n\t\t\tconst ref = UInt16( value );\n\t\t\treturn ( ref > 0x7FFF ) ? ref - 0x10000 : ref;\n\n\t\t}\n\n\t\tconst wdec14Return = { a: 0, b: 0 };\n\n\t\tfunction wdec14( l, h ) {\n\n\t\t\tconst ls = Int16( l );\n\t\t\tconst hs = Int16( h );\n\n\t\t\tconst hi = hs;\n\t\t\tconst ai = ls + ( hi & 1 ) + ( hi >> 1 );\n\n\t\t\tconst as = ai;\n\t\t\tconst bs = ai - hi;\n\n\t\t\twdec14Return.a = as;\n\t\t\twdec14Return.b = bs;\n\n\t\t}\n\n\t\tfunction wdec16( l, h ) {\n\n\t\t\tconst m = UInt16( l );\n\t\t\tconst d = UInt16( h );\n\n\t\t\tconst bb = ( m - ( d >> 1 ) ) & MOD_MASK;\n\t\t\tconst aa = ( d + bb - A_OFFSET ) & MOD_MASK;\n\n\t\t\twdec14Return.a = aa;\n\t\t\twdec14Return.b = bb;\n\n\t\t}\n\n\t\tfunction wav2Decode( buffer, j, nx, ox, ny, oy, mx ) {\n\n\t\t\tconst w14 = mx < ( 1 << 14 );\n\t\t\tconst n = ( nx > ny ) ? ny : nx;\n\t\t\tlet p = 1;\n\t\t\tlet p2;\n\t\t\tlet py;\n\n\t\t\twhile ( p <= n ) p <<= 1;\n\n\t\t\tp >>= 1;\n\t\t\tp2 = p;\n\t\t\tp >>= 1;\n\n\t\t\twhile ( p >= 1 ) {\n\n\t\t\t\tpy = 0;\n\t\t\t\tconst ey = py + oy * ( ny - p2 );\n\t\t\t\tconst oy1 = oy * p;\n\t\t\t\tconst oy2 = oy * p2;\n\t\t\t\tconst ox1 = ox * p;\n\t\t\t\tconst ox2 = ox * p2;\n\t\t\t\tlet i00, i01, i10, i11;\n\n\t\t\t\tfor ( ; py <= ey; py += oy2 ) {\n\n\t\t\t\t\tlet px = py;\n\t\t\t\t\tconst ex = py + ox * ( nx - p2 );\n\n\t\t\t\t\tfor ( ; px <= ex; px += ox2 ) {\n\n\t\t\t\t\t\tconst p01 = px + ox1;\n\t\t\t\t\t\tconst p10 = px + oy1;\n\t\t\t\t\t\tconst p11 = p10 + ox1;\n\n\t\t\t\t\t\tif ( w14 ) {\n\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\t\ti10 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( buffer[ p01 + j ], buffer[ p11 + j ] );\n\n\t\t\t\t\t\t\ti01 = wdec14Return.a;\n\t\t\t\t\t\t\ti11 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( i00, i01 );\n\n\t\t\t\t\t\t\tbuffer[ px + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( i10, i11 );\n\n\t\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p11 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\t\ti10 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( buffer[ p01 + j ], buffer[ p11 + j ] );\n\n\t\t\t\t\t\t\ti01 = wdec14Return.a;\n\t\t\t\t\t\t\ti11 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( i00, i01 );\n\n\t\t\t\t\t\t\tbuffer[ px + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( i10, i11 );\n\n\t\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p11 + j ] = wdec14Return.b;\n\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( nx & p ) {\n\n\t\t\t\t\t\tconst p10 = px + oy1;\n\n\t\t\t\t\t\tif ( w14 )\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p10 + j ] );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\tbuffer[ px + j ] = i00;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ny & p ) {\n\n\t\t\t\t\tlet px = py;\n\t\t\t\t\tconst ex = py + ox * ( nx - p2 );\n\n\t\t\t\t\tfor ( ; px <= ex; px += ox2 ) {\n\n\t\t\t\t\t\tconst p01 = px + ox1;\n\n\t\t\t\t\t\tif ( w14 )\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p01 + j ] );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p01 + j ] );\n\n\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\tbuffer[ px + j ] = i00;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tp2 = p;\n\t\t\t\tp >>= 1;\n\n\t\t\t}\n\n\t\t\treturn py;\n\n\t\t}\n\n\t\tfunction hufDecode( encodingTable, decodingTable, uInt8Array, inOffset, ni, rlc, no, outBuffer, outOffset ) {\n\n\t\t\tlet c = 0;\n\t\t\tlet lc = 0;\n\t\t\tconst outBufferEndOffset = no;\n\t\t\tconst inOffsetEnd = Math.trunc( inOffset.value + ( ni + 7 ) / 8 );\n\n\t\t\twhile ( inOffset.value < inOffsetEnd ) {\n\n\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\n\t\t\t\tc = getCharReturn.c;\n\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\twhile ( lc >= HUF_DECBITS ) {\n\n\t\t\t\t\tconst index = ( c >> ( lc - HUF_DECBITS ) ) & HUF_DECMASK;\n\t\t\t\t\tconst pl = decodingTable[ index ];\n\n\t\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\t\tlc -= pl.len;\n\n\t\t\t\t\t\tgetCode( pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ! pl.p ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet j;\n\n\t\t\t\t\t\tfor ( j = 0; j < pl.lit; j ++ ) {\n\n\t\t\t\t\t\t\tconst l = hufLength( encodingTable[ pl.p[ j ] ] );\n\n\t\t\t\t\t\t\twhile ( lc < l && inOffset.value < inOffsetEnd ) {\n\n\t\t\t\t\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\n\t\t\t\t\t\t\t\tc = getCharReturn.c;\n\t\t\t\t\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( lc >= l ) {\n\n\t\t\t\t\t\t\t\tif ( hufCode( encodingTable[ pl.p[ j ] ] ) == ( ( c >> ( lc - l ) ) & ( ( 1 << l ) - 1 ) ) ) {\n\n\t\t\t\t\t\t\t\t\tlc -= l;\n\n\t\t\t\t\t\t\t\t\tgetCode( pl.p[ j ], rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( j == pl.lit ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst i = ( 8 - ni ) & 7;\n\n\t\t\tc >>= i;\n\t\t\tlc -= i;\n\n\t\t\twhile ( lc > 0 ) {\n\n\t\t\t\tconst pl = decodingTable[ ( c << ( HUF_DECBITS - lc ) ) & HUF_DECMASK ];\n\n\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\tlc -= pl.len;\n\n\t\t\t\t\tgetCode( pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction hufUncompress( uInt8Array, inDataView, inOffset, nCompressed, outBuffer, nRaw ) {\n\n\t\t\tconst outOffset = { value: 0 };\n\t\t\tconst initialInOffset = inOffset.value;\n\n\t\t\tconst im = parseUint32( inDataView, inOffset );\n\t\t\tconst iM = parseUint32( inDataView, inOffset );\n\n\t\t\tinOffset.value += 4;\n\n\t\t\tconst nBits = parseUint32( inDataView, inOffset );\n\n\t\t\tinOffset.value += 4;\n\n\t\t\tif ( im < 0 || im >= HUF_ENCSIZE || iM < 0 || iM >= HUF_ENCSIZE ) {\n\n\t\t\t\tthrow new Error( 'Something wrong with HUF_ENCSIZE' );\n\n\t\t\t}\n\n\t\t\tconst freq = new Array( HUF_ENCSIZE );\n\t\t\tconst hdec = new Array( HUF_DECSIZE );\n\n\t\t\thufClearDecTable( hdec );\n\n\t\t\tconst ni = nCompressed - ( inOffset.value - initialInOffset );\n\n\t\t\thufUnpackEncTable( uInt8Array, inOffset, ni, im, iM, freq );\n\n\t\t\tif ( nBits > 8 * ( nCompressed - ( inOffset.value - initialInOffset ) ) ) {\n\n\t\t\t\tthrow new Error( 'Something wrong with hufUncompress' );\n\n\t\t\t}\n\n\t\t\thufBuildDecTable( freq, im, iM, hdec );\n\n\t\t\thufDecode( freq, hdec, uInt8Array, inOffset, nBits, iM, nRaw, outBuffer, outOffset );\n\n\t\t}\n\n\t\tfunction applyLut( lut, data, nData ) {\n\n\t\t\tfor ( let i = 0; i < nData; ++ i ) {\n\n\t\t\t\tdata[ i ] = lut[ data[ i ] ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction predictor( source ) {\n\n\t\t\tfor ( let t = 1; t < source.length; t ++ ) {\n\n\t\t\t\tconst d = source[ t - 1 ] + source[ t ] - 128;\n\t\t\t\tsource[ t ] = d;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction interleaveScalar( source, out ) {\n\n\t\t\tlet t1 = 0;\n\t\t\tlet t2 = Math.floor( ( source.length + 1 ) / 2 );\n\t\t\tlet s = 0;\n\t\t\tconst stop = source.length - 1;\n\n\t\t\twhile ( true ) {\n\n\t\t\t\tif ( s > stop ) break;\n\t\t\t\tout[ s ++ ] = source[ t1 ++ ];\n\n\t\t\t\tif ( s > stop ) break;\n\t\t\t\tout[ s ++ ] = source[ t2 ++ ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction decodeRunLength( source ) {\n\n\t\t\tlet size = source.byteLength;\n\t\t\tconst out = new Array();\n\t\t\tlet p = 0;\n\n\t\t\tconst reader = new DataView( source );\n\n\t\t\twhile ( size > 0 ) {\n\n\t\t\t\tconst l = reader.getInt8( p ++ );\n\n\t\t\t\tif ( l < 0 ) {\n\n\t\t\t\t\tconst count = - l;\n\t\t\t\t\tsize -= count + 1;\n\n\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\tout.push( reader.getUint8( p ++ ) );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst count = l;\n\t\t\t\t\tsize -= 2;\n\n\t\t\t\t\tconst value = reader.getUint8( p ++ );\n\n\t\t\t\t\tfor ( let i = 0; i < count + 1; i ++ ) {\n\n\t\t\t\t\t\tout.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn out;\n\n\t\t}\n\n\t\tfunction lossyDctDecode( cscSet, rowPtrs, channelData, acBuffer, dcBuffer, outBuffer ) {\n\n\t\t\tlet dataView = new DataView( outBuffer.buffer );\n\n\t\t\tconst width = channelData[ cscSet.idx[ 0 ] ].width;\n\t\t\tconst height = channelData[ cscSet.idx[ 0 ] ].height;\n\n\t\t\tconst numComp = 3;\n\n\t\t\tconst numFullBlocksX = Math.floor( width / 8.0 );\n\t\t\tconst numBlocksX = Math.ceil( width / 8.0 );\n\t\t\tconst numBlocksY = Math.ceil( height / 8.0 );\n\t\t\tconst leftoverX = width - ( numBlocksX - 1 ) * 8;\n\t\t\tconst leftoverY = height - ( numBlocksY - 1 ) * 8;\n\n\t\t\tconst currAcComp = { value: 0 };\n\t\t\tconst currDcComp = new Array( numComp );\n\t\t\tconst dctData = new Array( numComp );\n\t\t\tconst halfZigBlock = new Array( numComp );\n\t\t\tconst rowBlock = new Array( numComp );\n\t\t\tconst rowOffsets = new Array( numComp );\n\n\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\trowOffsets[ comp ] = rowPtrs[ cscSet.idx[ comp ] ];\n\t\t\t\tcurrDcComp[ comp ] = ( comp < 1 ) ? 0 : currDcComp[ comp - 1 ] + numBlocksX * numBlocksY;\n\t\t\t\tdctData[ comp ] = new Float32Array( 64 );\n\t\t\t\thalfZigBlock[ comp ] = new Uint16Array( 64 );\n\t\t\t\trowBlock[ comp ] = new Uint16Array( numBlocksX * 64 );\n\n\t\t\t}\n\n\t\t\tfor ( let blocky = 0; blocky < numBlocksY; ++ blocky ) {\n\n\t\t\t\tlet maxY = 8;\n\n\t\t\t\tif ( blocky == numBlocksY - 1 )\n\t\t\t\t\tmaxY = leftoverY;\n\n\t\t\t\tlet maxX = 8;\n\n\t\t\t\tfor ( let blockx = 0; blockx < numBlocksX; ++ blockx ) {\n\n\t\t\t\t\tif ( blockx == numBlocksX - 1 )\n\t\t\t\t\t\tmaxX = leftoverX;\n\n\t\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\t\thalfZigBlock[ comp ].fill( 0 );\n\n\t\t\t\t\t\t// set block DC component\n\t\t\t\t\t\thalfZigBlock[ comp ][ 0 ] = dcBuffer[ currDcComp[ comp ] ++ ];\n\t\t\t\t\t\t// set block AC components\n\t\t\t\t\t\tunRleAC( currAcComp, acBuffer, halfZigBlock[ comp ] );\n\n\t\t\t\t\t\t// UnZigZag block to float\n\t\t\t\t\t\tunZigZag( halfZigBlock[ comp ], dctData[ comp ] );\n\t\t\t\t\t\t// decode float dct\n\t\t\t\t\t\tdctInverse( dctData[ comp ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( numComp == 3 ) {\n\n\t\t\t\t\t\tcsc709Inverse( dctData );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\t\tconvertToHalf( dctData[ comp ], rowBlock[ comp ], blockx * 64 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // blockx\n\n\t\t\t\tlet offset = 0;\n\n\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\tconst type = channelData[ cscSet.idx[ comp ] ].type;\n\n\t\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\t\toffset = rowOffsets[ comp ][ y ];\n\n\t\t\t\t\t\tfor ( let blockx = 0; blockx < numFullBlocksX; ++ blockx ) {\n\n\t\t\t\t\t\t\tconst src = blockx * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + 0 * INT16_SIZE * type, rowBlock[ comp ][ src + 0 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 1 * INT16_SIZE * type, rowBlock[ comp ][ src + 1 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 2 * INT16_SIZE * type, rowBlock[ comp ][ src + 2 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 3 * INT16_SIZE * type, rowBlock[ comp ][ src + 3 ], true );\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + 4 * INT16_SIZE * type, rowBlock[ comp ][ src + 4 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 5 * INT16_SIZE * type, rowBlock[ comp ][ src + 5 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 6 * INT16_SIZE * type, rowBlock[ comp ][ src + 6 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 7 * INT16_SIZE * type, rowBlock[ comp ][ src + 7 ], true );\n\n\t\t\t\t\t\t\toffset += 8 * INT16_SIZE * type;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// handle partial X blocks\n\t\t\t\t\tif ( numFullBlocksX != numBlocksX ) {\n\n\t\t\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\t\t\tconst offset = rowOffsets[ comp ][ y ] + 8 * numFullBlocksX * INT16_SIZE * type;\n\t\t\t\t\t\t\tconst src = numFullBlocksX * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\t\tfor ( let x = 0; x < maxX; ++ x ) {\n\n\t\t\t\t\t\t\t\tdataView.setUint16( offset + x * INT16_SIZE * type, rowBlock[ comp ][ src + x ], true );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} // comp\n\n\t\t\t} // blocky\n\n\t\t\tconst halfRow = new Uint16Array( width );\n\t\t\tdataView = new DataView( outBuffer.buffer );\n\n\t\t\t// convert channels back to float, if needed\n\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\tchannelData[ cscSet.idx[ comp ] ].decoded = true;\n\t\t\t\tconst type = channelData[ cscSet.idx[ comp ] ].type;\n\n\t\t\t\tif ( channelData[ comp ].type != 2 ) continue;\n\n\t\t\t\tfor ( let y = 0; y < height; ++ y ) {\n\n\t\t\t\t\tconst offset = rowOffsets[ comp ][ y ];\n\n\t\t\t\t\tfor ( let x = 0; x < width; ++ x ) {\n\n\t\t\t\t\t\thalfRow[ x ] = dataView.getUint16( offset + x * INT16_SIZE * type, true );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let x = 0; x < width; ++ x ) {\n\n\t\t\t\t\t\tdataView.setFloat32( offset + x * INT16_SIZE * type, decodeFloat16( halfRow[ x ] ), true );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction unRleAC( currAcComp, acBuffer, halfZigBlock ) {\n\n\t\t\tlet acValue;\n\t\t\tlet dctComp = 1;\n\n\t\t\twhile ( dctComp < 64 ) {\n\n\t\t\t\tacValue = acBuffer[ currAcComp.value ];\n\n\t\t\t\tif ( acValue == 0xff00 ) {\n\n\t\t\t\t\tdctComp = 64;\n\n\t\t\t\t} else if ( acValue >> 8 == 0xff ) {\n\n\t\t\t\t\tdctComp += acValue & 0xff;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thalfZigBlock[ dctComp ] = acValue;\n\t\t\t\t\tdctComp ++;\n\n\t\t\t\t}\n\n\t\t\t\tcurrAcComp.value ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction unZigZag( src, dst ) {\n\n\t\t\tdst[ 0 ] = decodeFloat16( src[ 0 ] );\n\t\t\tdst[ 1 ] = decodeFloat16( src[ 1 ] );\n\t\t\tdst[ 2 ] = decodeFloat16( src[ 5 ] );\n\t\t\tdst[ 3 ] = decodeFloat16( src[ 6 ] );\n\t\t\tdst[ 4 ] = decodeFloat16( src[ 14 ] );\n\t\t\tdst[ 5 ] = decodeFloat16( src[ 15 ] );\n\t\t\tdst[ 6 ] = decodeFloat16( src[ 27 ] );\n\t\t\tdst[ 7 ] = decodeFloat16( src[ 28 ] );\n\t\t\tdst[ 8 ] = decodeFloat16( src[ 2 ] );\n\t\t\tdst[ 9 ] = decodeFloat16( src[ 4 ] );\n\n\t\t\tdst[ 10 ] = decodeFloat16( src[ 7 ] );\n\t\t\tdst[ 11 ] = decodeFloat16( src[ 13 ] );\n\t\t\tdst[ 12 ] = decodeFloat16( src[ 16 ] );\n\t\t\tdst[ 13 ] = decodeFloat16( src[ 26 ] );\n\t\t\tdst[ 14 ] = decodeFloat16( src[ 29 ] );\n\t\t\tdst[ 15 ] = decodeFloat16( src[ 42 ] );\n\t\t\tdst[ 16 ] = decodeFloat16( src[ 3 ] );\n\t\t\tdst[ 17 ] = decodeFloat16( src[ 8 ] );\n\t\t\tdst[ 18 ] = decodeFloat16( src[ 12 ] );\n\t\t\tdst[ 19 ] = decodeFloat16( src[ 17 ] );\n\n\t\t\tdst[ 20 ] = decodeFloat16( src[ 25 ] );\n\t\t\tdst[ 21 ] = decodeFloat16( src[ 30 ] );\n\t\t\tdst[ 22 ] = decodeFloat16( src[ 41 ] );\n\t\t\tdst[ 23 ] = decodeFloat16( src[ 43 ] );\n\t\t\tdst[ 24 ] = decodeFloat16( src[ 9 ] );\n\t\t\tdst[ 25 ] = decodeFloat16( src[ 11 ] );\n\t\t\tdst[ 26 ] = decodeFloat16( src[ 18 ] );\n\t\t\tdst[ 27 ] = decodeFloat16( src[ 24 ] );\n\t\t\tdst[ 28 ] = decodeFloat16( src[ 31 ] );\n\t\t\tdst[ 29 ] = decodeFloat16( src[ 40 ] );\n\n\t\t\tdst[ 30 ] = decodeFloat16( src[ 44 ] );\n\t\t\tdst[ 31 ] = decodeFloat16( src[ 53 ] );\n\t\t\tdst[ 32 ] = decodeFloat16( src[ 10 ] );\n\t\t\tdst[ 33 ] = decodeFloat16( src[ 19 ] );\n\t\t\tdst[ 34 ] = decodeFloat16( src[ 23 ] );\n\t\t\tdst[ 35 ] = decodeFloat16( src[ 32 ] );\n\t\t\tdst[ 36 ] = decodeFloat16( src[ 39 ] );\n\t\t\tdst[ 37 ] = decodeFloat16( src[ 45 ] );\n\t\t\tdst[ 38 ] = decodeFloat16( src[ 52 ] );\n\t\t\tdst[ 39 ] = decodeFloat16( src[ 54 ] );\n\n\t\t\tdst[ 40 ] = decodeFloat16( src[ 20 ] );\n\t\t\tdst[ 41 ] = decodeFloat16( src[ 22 ] );\n\t\t\tdst[ 42 ] = decodeFloat16( src[ 33 ] );\n\t\t\tdst[ 43 ] = decodeFloat16( src[ 38 ] );\n\t\t\tdst[ 44 ] = decodeFloat16( src[ 46 ] );\n\t\t\tdst[ 45 ] = decodeFloat16( src[ 51 ] );\n\t\t\tdst[ 46 ] = decodeFloat16( src[ 55 ] );\n\t\t\tdst[ 47 ] = decodeFloat16( src[ 60 ] );\n\t\t\tdst[ 48 ] = decodeFloat16( src[ 21 ] );\n\t\t\tdst[ 49 ] = decodeFloat16( src[ 34 ] );\n\n\t\t\tdst[ 50 ] = decodeFloat16( src[ 37 ] );\n\t\t\tdst[ 51 ] = decodeFloat16( src[ 47 ] );\n\t\t\tdst[ 52 ] = decodeFloat16( src[ 50 ] );\n\t\t\tdst[ 53 ] = decodeFloat16( src[ 56 ] );\n\t\t\tdst[ 54 ] = decodeFloat16( src[ 59 ] );\n\t\t\tdst[ 55 ] = decodeFloat16( src[ 61 ] );\n\t\t\tdst[ 56 ] = decodeFloat16( src[ 35 ] );\n\t\t\tdst[ 57 ] = decodeFloat16( src[ 36 ] );\n\t\t\tdst[ 58 ] = decodeFloat16( src[ 48 ] );\n\t\t\tdst[ 59 ] = decodeFloat16( src[ 49 ] );\n\n\t\t\tdst[ 60 ] = decodeFloat16( src[ 57 ] );\n\t\t\tdst[ 61 ] = decodeFloat16( src[ 58 ] );\n\t\t\tdst[ 62 ] = decodeFloat16( src[ 62 ] );\n\t\t\tdst[ 63 ] = decodeFloat16( src[ 63 ] );\n\n\t\t}\n\n\t\tfunction dctInverse( data ) {\n\n\t\t\tconst a = 0.5 * Math.cos( 3.14159 / 4.0 );\n\t\t\tconst b = 0.5 * Math.cos( 3.14159 / 16.0 );\n\t\t\tconst c = 0.5 * Math.cos( 3.14159 / 8.0 );\n\t\t\tconst d = 0.5 * Math.cos( 3.0 * 3.14159 / 16.0 );\n\t\t\tconst e = 0.5 * Math.cos( 5.0 * 3.14159 / 16.0 );\n\t\t\tconst f = 0.5 * Math.cos( 3.0 * 3.14159 / 8.0 );\n\t\t\tconst g = 0.5 * Math.cos( 7.0 * 3.14159 / 16.0 );\n\n\t\t\tconst alpha = new Array( 4 );\n\t\t\tconst beta = new Array( 4 );\n\t\t\tconst theta = new Array( 4 );\n\t\t\tconst gamma = new Array( 4 );\n\n\t\t\tfor ( let row = 0; row < 8; ++ row ) {\n\n\t\t\t\tconst rowPtr = row * 8;\n\n\t\t\t\talpha[ 0 ] = c * data[ rowPtr + 2 ];\n\t\t\t\talpha[ 1 ] = f * data[ rowPtr + 2 ];\n\t\t\t\talpha[ 2 ] = c * data[ rowPtr + 6 ];\n\t\t\t\talpha[ 3 ] = f * data[ rowPtr + 6 ];\n\n\t\t\t\tbeta[ 0 ] = b * data[ rowPtr + 1 ] + d * data[ rowPtr + 3 ] + e * data[ rowPtr + 5 ] + g * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 1 ] = d * data[ rowPtr + 1 ] - g * data[ rowPtr + 3 ] - b * data[ rowPtr + 5 ] - e * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 2 ] = e * data[ rowPtr + 1 ] - b * data[ rowPtr + 3 ] + g * data[ rowPtr + 5 ] + d * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 3 ] = g * data[ rowPtr + 1 ] - e * data[ rowPtr + 3 ] + d * data[ rowPtr + 5 ] - b * data[ rowPtr + 7 ];\n\n\t\t\t\ttheta[ 0 ] = a * ( data[ rowPtr + 0 ] + data[ rowPtr + 4 ] );\n\t\t\t\ttheta[ 3 ] = a * ( data[ rowPtr + 0 ] - data[ rowPtr + 4 ] );\n\t\t\t\ttheta[ 1 ] = alpha[ 0 ] + alpha[ 3 ];\n\t\t\t\ttheta[ 2 ] = alpha[ 1 ] - alpha[ 2 ];\n\n\t\t\t\tgamma[ 0 ] = theta[ 0 ] + theta[ 1 ];\n\t\t\t\tgamma[ 1 ] = theta[ 3 ] + theta[ 2 ];\n\t\t\t\tgamma[ 2 ] = theta[ 3 ] - theta[ 2 ];\n\t\t\t\tgamma[ 3 ] = theta[ 0 ] - theta[ 1 ];\n\n\t\t\t\tdata[ rowPtr + 0 ] = gamma[ 0 ] + beta[ 0 ];\n\t\t\t\tdata[ rowPtr + 1 ] = gamma[ 1 ] + beta[ 1 ];\n\t\t\t\tdata[ rowPtr + 2 ] = gamma[ 2 ] + beta[ 2 ];\n\t\t\t\tdata[ rowPtr + 3 ] = gamma[ 3 ] + beta[ 3 ];\n\n\t\t\t\tdata[ rowPtr + 4 ] = gamma[ 3 ] - beta[ 3 ];\n\t\t\t\tdata[ rowPtr + 5 ] = gamma[ 2 ] - beta[ 2 ];\n\t\t\t\tdata[ rowPtr + 6 ] = gamma[ 1 ] - beta[ 1 ];\n\t\t\t\tdata[ rowPtr + 7 ] = gamma[ 0 ] - beta[ 0 ];\n\n\t\t\t}\n\n\t\t\tfor ( let column = 0; column < 8; ++ column ) {\n\n\t\t\t\talpha[ 0 ] = c * data[ 16 + column ];\n\t\t\t\talpha[ 1 ] = f * data[ 16 + column ];\n\t\t\t\talpha[ 2 ] = c * data[ 48 + column ];\n\t\t\t\talpha[ 3 ] = f * data[ 48 + column ];\n\n\t\t\t\tbeta[ 0 ] = b * data[ 8 + column ] + d * data[ 24 + column ] + e * data[ 40 + column ] + g * data[ 56 + column ];\n\t\t\t\tbeta[ 1 ] = d * data[ 8 + column ] - g * data[ 24 + column ] - b * data[ 40 + column ] - e * data[ 56 + column ];\n\t\t\t\tbeta[ 2 ] = e * data[ 8 + column ] - b * data[ 24 + column ] + g * data[ 40 + column ] + d * data[ 56 + column ];\n\t\t\t\tbeta[ 3 ] = g * data[ 8 + column ] - e * data[ 24 + column ] + d * data[ 40 + column ] - b * data[ 56 + column ];\n\n\t\t\t\ttheta[ 0 ] = a * ( data[ column ] + data[ 32 + column ] );\n\t\t\t\ttheta[ 3 ] = a * ( data[ column ] - data[ 32 + column ] );\n\n\t\t\t\ttheta[ 1 ] = alpha[ 0 ] + alpha[ 3 ];\n\t\t\t\ttheta[ 2 ] = alpha[ 1 ] - alpha[ 2 ];\n\n\t\t\t\tgamma[ 0 ] = theta[ 0 ] + theta[ 1 ];\n\t\t\t\tgamma[ 1 ] = theta[ 3 ] + theta[ 2 ];\n\t\t\t\tgamma[ 2 ] = theta[ 3 ] - theta[ 2 ];\n\t\t\t\tgamma[ 3 ] = theta[ 0 ] - theta[ 1 ];\n\n\t\t\t\tdata[ 0 + column ] = gamma[ 0 ] + beta[ 0 ];\n\t\t\t\tdata[ 8 + column ] = gamma[ 1 ] + beta[ 1 ];\n\t\t\t\tdata[ 16 + column ] = gamma[ 2 ] + beta[ 2 ];\n\t\t\t\tdata[ 24 + column ] = gamma[ 3 ] + beta[ 3 ];\n\n\t\t\t\tdata[ 32 + column ] = gamma[ 3 ] - beta[ 3 ];\n\t\t\t\tdata[ 40 + column ] = gamma[ 2 ] - beta[ 2 ];\n\t\t\t\tdata[ 48 + column ] = gamma[ 1 ] - beta[ 1 ];\n\t\t\t\tdata[ 56 + column ] = gamma[ 0 ] - beta[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction csc709Inverse( data ) {\n\n\t\t\tfor ( let i = 0; i < 64; ++ i ) {\n\n\t\t\t\tconst y = data[ 0 ][ i ];\n\t\t\t\tconst cb = data[ 1 ][ i ];\n\t\t\t\tconst cr = data[ 2 ][ i ];\n\n\t\t\t\tdata[ 0 ][ i ] = y + 1.5747 * cr;\n\t\t\t\tdata[ 1 ][ i ] = y - 0.1873 * cb - 0.4682 * cr;\n\t\t\t\tdata[ 2 ][ i ] = y + 1.8556 * cb;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction convertToHalf( src, dst, idx ) {\n\n\t\t\tfor ( let i = 0; i < 64; ++ i ) {\n\n\t\t\t\tdst[ idx + i ] = DataUtils.toHalfFloat( toLinear( src[ i ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction toLinear( float ) {\n\n\t\t\tif ( float <= 1 ) {\n\n\t\t\t\treturn Math.sign( float ) * Math.pow( Math.abs( float ), 2.2 );\n\n\t\t\t} else {\n\n\t\t\t\treturn Math.sign( float ) * Math.pow( logBase, Math.abs( float ) - 1.0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uncompressRAW( info ) {\n\n\t\t\treturn new DataView( info.array.buffer, info.offset.value, info.size );\n\n\t\t}\n\n\t\tfunction uncompressRLE( info ) {\n\n\t\t\tconst compressed = info.viewer.buffer.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = new Uint8Array( decodeRunLength( compressed ) );\n\t\t\tconst tmpBuffer = new Uint8Array( rawBuffer.length );\n\n\t\t\tpredictor( rawBuffer ); // revert predictor\n\n\t\t\tinterleaveScalar( rawBuffer, tmpBuffer ); // interleave pixels\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressZIP( info ) {\n\n\t\t\tconst compressed = info.array.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tif ( typeof fflate === 'undefined' ) {\n\n\t\t\t\tconsole.error( 'THREE.EXRLoader: External library fflate.min.js required.' );\n\n\t\t\t}\n\n\t\t\tconst rawBuffer = fflate.unzlibSync( compressed ); // eslint-disable-line no-undef\n\t\t\tconst tmpBuffer = new Uint8Array( rawBuffer.length );\n\n\t\t\tpredictor( rawBuffer ); // revert predictor\n\n\t\t\tinterleaveScalar( rawBuffer, tmpBuffer ); // interleave pixels\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressPIZ( info ) {\n\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\n\t\t\tconst outBuffer = new Uint16Array( info.width * info.scanlineBlockSize * ( info.channels * info.type ) );\n\t\t\tconst bitmap = new Uint8Array( BITMAP_SIZE );\n\n\t\t\t// Setup channel info\n\t\t\tlet outBufferEnd = 0;\n\t\t\tconst pizChannelData = new Array( info.channels );\n\t\t\tfor ( let i = 0; i < info.channels; i ++ ) {\n\n\t\t\t\tpizChannelData[ i ] = {};\n\t\t\t\tpizChannelData[ i ][ 'start' ] = outBufferEnd;\n\t\t\t\tpizChannelData[ i ][ 'end' ] = pizChannelData[ i ][ 'start' ];\n\t\t\t\tpizChannelData[ i ][ 'nx' ] = info.width;\n\t\t\t\tpizChannelData[ i ][ 'ny' ] = info.lines;\n\t\t\t\tpizChannelData[ i ][ 'size' ] = info.type;\n\n\t\t\t\toutBufferEnd += pizChannelData[ i ].nx * pizChannelData[ i ].ny * pizChannelData[ i ].size;\n\n\t\t\t}\n\n\t\t\t// Read range compression data\n\n\t\t\tconst minNonZero = parseUint16( inDataView, inOffset );\n\t\t\tconst maxNonZero = parseUint16( inDataView, inOffset );\n\n\t\t\tif ( maxNonZero >= BITMAP_SIZE ) {\n\n\t\t\t\tthrow new Error( 'Something is wrong with PIZ_COMPRESSION BITMAP_SIZE' );\n\n\t\t\t}\n\n\t\t\tif ( minNonZero <= maxNonZero ) {\n\n\t\t\t\tfor ( let i = 0; i < maxNonZero - minNonZero + 1; i ++ ) {\n\n\t\t\t\t\tbitmap[ i + minNonZero ] = parseUint8( inDataView, inOffset );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Reverse LUT\n\t\t\tconst lut = new Uint16Array( USHORT_RANGE );\n\t\t\tconst maxValue = reverseLutFromBitmap( bitmap, lut );\n\n\t\t\tconst length = parseUint32( inDataView, inOffset );\n\n\t\t\t// Huffman decoding\n\t\t\thufUncompress( info.array, inDataView, inOffset, length, outBuffer, outBufferEnd );\n\n\t\t\t// Wavelet decoding\n\t\t\tfor ( let i = 0; i < info.channels; ++ i ) {\n\n\t\t\t\tconst cd = pizChannelData[ i ];\n\n\t\t\t\tfor ( let j = 0; j < pizChannelData[ i ].size; ++ j ) {\n\n\t\t\t\t\twav2Decode(\n\t\t\t\t\t\toutBuffer,\n\t\t\t\t\t\tcd.start + j,\n\t\t\t\t\t\tcd.nx,\n\t\t\t\t\t\tcd.size,\n\t\t\t\t\t\tcd.ny,\n\t\t\t\t\t\tcd.nx * cd.size,\n\t\t\t\t\t\tmaxValue\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Expand the pixel data to their original range\n\t\t\tapplyLut( lut, outBuffer, outBufferEnd );\n\n\t\t\t// Rearrange the pixel data into the format expected by the caller.\n\t\t\tlet tmpOffset = 0;\n\t\t\tconst tmpBuffer = new Uint8Array( outBuffer.buffer.byteLength );\n\t\t\tfor ( let y = 0; y < info.lines; y ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < info.channels; c ++ ) {\n\n\t\t\t\t\tconst cd = pizChannelData[ c ];\n\n\t\t\t\t\tconst n = cd.nx * cd.size;\n\t\t\t\t\tconst cp = new Uint8Array( outBuffer.buffer, cd.end * INT16_SIZE, n * INT16_SIZE );\n\n\t\t\t\t\ttmpBuffer.set( cp, tmpOffset );\n\t\t\t\t\ttmpOffset += n * INT16_SIZE;\n\t\t\t\t\tcd.end += n;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressPXR( info ) {\n\n\t\t\tconst compressed = info.array.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tif ( typeof fflate === 'undefined' ) {\n\n\t\t\t\tconsole.error( 'THREE.EXRLoader: External library fflate.min.js required.' );\n\n\t\t\t}\n\n\t\t\tconst rawBuffer = fflate.unzlibSync( compressed ); // eslint-disable-line no-undef\n\n\t\t\tconst sz = info.lines * info.channels * info.width;\n\t\t\tconst tmpBuffer = ( info.type == 1 ) ? new Uint16Array( sz ) : new Uint32Array( sz );\n\n\t\t\tlet tmpBufferEnd = 0;\n\t\t\tlet writePtr = 0;\n\t\t\tconst ptr = new Array( 4 );\n\n\t\t\tfor ( let y = 0; y < info.lines; y ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < info.channels; c ++ ) {\n\n\t\t\t\t\tlet pixel = 0;\n\n\t\t\t\t\tswitch ( info.type ) {\n\n\t\t\t\t\t\tcase 1:\n\n\t\t\t\t\t\t\tptr[ 0 ] = tmpBufferEnd;\n\t\t\t\t\t\t\tptr[ 1 ] = ptr[ 0 ] + info.width;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[ 1 ] + info.width;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < info.width; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst diff = ( rawBuffer[ ptr[ 0 ] ++ ] << 8 ) | rawBuffer[ ptr[ 1 ] ++ ];\n\n\t\t\t\t\t\t\t\tpixel += diff;\n\n\t\t\t\t\t\t\t\ttmpBuffer[ writePtr ] = pixel;\n\t\t\t\t\t\t\t\twritePtr ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 2:\n\n\t\t\t\t\t\t\tptr[ 0 ] = tmpBufferEnd;\n\t\t\t\t\t\t\tptr[ 1 ] = ptr[ 0 ] + info.width;\n\t\t\t\t\t\t\tptr[ 2 ] = ptr[ 1 ] + info.width;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[ 2 ] + info.width;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < info.width; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst diff = ( rawBuffer[ ptr[ 0 ] ++ ] << 24 ) | ( rawBuffer[ ptr[ 1 ] ++ ] << 16 ) | ( rawBuffer[ ptr[ 2 ] ++ ] << 8 );\n\n\t\t\t\t\t\t\t\tpixel += diff;\n\n\t\t\t\t\t\t\t\ttmpBuffer[ writePtr ] = pixel;\n\t\t\t\t\t\t\t\twritePtr ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressDWA( info ) {\n\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\t\t\tconst outBuffer = new Uint8Array( info.width * info.lines * ( info.channels * info.type * INT16_SIZE ) );\n\n\t\t\t// Read compression header information\n\t\t\tconst dwaHeader = {\n\n\t\t\t\tversion: parseInt64( inDataView, inOffset ),\n\t\t\t\tunknownUncompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tunknownCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tacCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tdcCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleUncompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleRawSize: parseInt64( inDataView, inOffset ),\n\t\t\t\ttotalAcUncompressedCount: parseInt64( inDataView, inOffset ),\n\t\t\t\ttotalDcUncompressedCount: parseInt64( inDataView, inOffset ),\n\t\t\t\tacCompression: parseInt64( inDataView, inOffset )\n\n\t\t\t};\n\n\t\t\tif ( dwaHeader.version < 2 )\n\t\t\t\tthrow new Error( 'EXRLoader.parse: ' + EXRHeader.compression + ' version ' + dwaHeader.version + ' is unsupported' );\n\n\t\t\t// Read channel ruleset information\n\t\t\tconst channelRules = new Array();\n\t\t\tlet ruleSize = parseUint16( inDataView, inOffset ) - INT16_SIZE;\n\n\t\t\twhile ( ruleSize > 0 ) {\n\n\t\t\t\tconst name = parseNullTerminatedString( inDataView.buffer, inOffset );\n\t\t\t\tconst value = parseUint8( inDataView, inOffset );\n\t\t\t\tconst compression = ( value >> 2 ) & 3;\n\t\t\t\tconst csc = ( value >> 4 ) - 1;\n\t\t\t\tconst index = new Int8Array( [ csc ] )[ 0 ];\n\t\t\t\tconst type = parseUint8( inDataView, inOffset );\n\n\t\t\t\tchannelRules.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\tindex: index,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tcompression: compression,\n\t\t\t\t} );\n\n\t\t\t\truleSize -= name.length + 3;\n\n\t\t\t}\n\n\t\t\t// Classify channels\n\t\t\tconst channels = EXRHeader.channels;\n\t\t\tconst channelData = new Array( info.channels );\n\n\t\t\tfor ( let i = 0; i < info.channels; ++ i ) {\n\n\t\t\t\tconst cd = channelData[ i ] = {};\n\t\t\t\tconst channel = channels[ i ];\n\n\t\t\t\tcd.name = channel.name;\n\t\t\t\tcd.compression = UNKNOWN;\n\t\t\t\tcd.decoded = false;\n\t\t\t\tcd.type = channel.pixelType;\n\t\t\t\tcd.pLinear = channel.pLinear;\n\t\t\t\tcd.width = info.width;\n\t\t\t\tcd.height = info.lines;\n\n\t\t\t}\n\n\t\t\tconst cscSet = {\n\t\t\t\tidx: new Array( 3 )\n\t\t\t};\n\n\t\t\tfor ( let offset = 0; offset < info.channels; ++ offset ) {\n\n\t\t\t\tconst cd = channelData[ offset ];\n\n\t\t\t\tfor ( let i = 0; i < channelRules.length; ++ i ) {\n\n\t\t\t\t\tconst rule = channelRules[ i ];\n\n\t\t\t\t\tif ( cd.name == rule.name ) {\n\n\t\t\t\t\t\tcd.compression = rule.compression;\n\n\t\t\t\t\t\tif ( rule.index >= 0 ) {\n\n\t\t\t\t\t\t\tcscSet.idx[ rule.index ] = offset;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcd.offset = offset;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet acBuffer, dcBuffer, rleBuffer;\n\n\t\t\t// Read DCT - AC component data\n\t\t\tif ( dwaHeader.acCompressedSize > 0 ) {\n\n\t\t\t\tswitch ( dwaHeader.acCompression ) {\n\n\t\t\t\t\tcase STATIC_HUFFMAN:\n\n\t\t\t\t\t\tacBuffer = new Uint16Array( dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\thufUncompress( info.array, inDataView, inOffset, dwaHeader.acCompressedSize, acBuffer, dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase DEFLATE:\n\n\t\t\t\t\t\tconst compressed = info.array.slice( inOffset.value, inOffset.value + dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\tconst data = fflate.unzlibSync( compressed ); // eslint-disable-line no-undef\n\t\t\t\t\t\tacBuffer = new Uint16Array( data.buffer );\n\t\t\t\t\t\tinOffset.value += dwaHeader.totalAcUncompressedCount;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Read DCT - DC component data\n\t\t\tif ( dwaHeader.dcCompressedSize > 0 ) {\n\n\t\t\t\tconst zlibInfo = {\n\t\t\t\t\tarray: info.array,\n\t\t\t\t\toffset: inOffset,\n\t\t\t\t\tsize: dwaHeader.dcCompressedSize\n\t\t\t\t};\n\t\t\t\tdcBuffer = new Uint16Array( uncompressZIP( zlibInfo ).buffer );\n\t\t\t\tinOffset.value += dwaHeader.dcCompressedSize;\n\n\t\t\t}\n\n\t\t\t// Read RLE compressed data\n\t\t\tif ( dwaHeader.rleRawSize > 0 ) {\n\n\t\t\t\tconst compressed = info.array.slice( inOffset.value, inOffset.value + dwaHeader.rleCompressedSize );\n\t\t\t\tconst data = fflate.unzlibSync( compressed ); // eslint-disable-line no-undef\n\t\t\t\trleBuffer = decodeRunLength( data.buffer );\n\n\t\t\t\tinOffset.value += dwaHeader.rleCompressedSize;\n\n\t\t\t}\n\n\t\t\t// Prepare outbuffer data offset\n\t\t\tlet outBufferEnd = 0;\n\t\t\tconst rowOffsets = new Array( channelData.length );\n\t\t\tfor ( let i = 0; i < rowOffsets.length; ++ i ) {\n\n\t\t\t\trowOffsets[ i ] = new Array();\n\n\t\t\t}\n\n\t\t\tfor ( let y = 0; y < info.lines; ++ y ) {\n\n\t\t\t\tfor ( let chan = 0; chan < channelData.length; ++ chan ) {\n\n\t\t\t\t\trowOffsets[ chan ].push( outBufferEnd );\n\t\t\t\t\toutBufferEnd += channelData[ chan ].width * info.type * INT16_SIZE;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Lossy DCT decode RGB channels\n\t\t\tlossyDctDecode( cscSet, rowOffsets, channelData, acBuffer, dcBuffer, outBuffer );\n\n\t\t\t// Decode other channels\n\t\t\tfor ( let i = 0; i < channelData.length; ++ i ) {\n\n\t\t\t\tconst cd = channelData[ i ];\n\n\t\t\t\tif ( cd.decoded ) continue;\n\n\t\t\t\tswitch ( cd.compression ) {\n\n\t\t\t\t\tcase RLE:\n\n\t\t\t\t\t\tlet row = 0;\n\t\t\t\t\t\tlet rleOffset = 0;\n\n\t\t\t\t\t\tfor ( let y = 0; y < info.lines; ++ y ) {\n\n\t\t\t\t\t\t\tlet rowOffsetBytes = rowOffsets[ i ][ row ];\n\n\t\t\t\t\t\t\tfor ( let x = 0; x < cd.width; ++ x ) {\n\n\t\t\t\t\t\t\t\tfor ( let byte = 0; byte < INT16_SIZE * cd.type; ++ byte ) {\n\n\t\t\t\t\t\t\t\t\toutBuffer[ rowOffsetBytes ++ ] = rleBuffer[ rleOffset + byte * cd.width * cd.height ];\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\trleOffset ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\trow ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase LOSSY_DCT: // skip\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( 'EXRLoader.parse: unsupported channel compression' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( outBuffer.buffer );\n\n\t\t}\n\n\t\tfunction parseNullTerminatedString( buffer, offset ) {\n\n\t\t\tconst uintBuffer = new Uint8Array( buffer );\n\t\t\tlet endOffset = 0;\n\n\t\t\twhile ( uintBuffer[ offset.value + endOffset ] != 0 ) {\n\n\t\t\t\tendOffset += 1;\n\n\t\t\t}\n\n\t\t\tconst stringValue = new TextDecoder().decode(\n\t\t\t\tuintBuffer.slice( offset.value, offset.value + endOffset )\n\t\t\t);\n\n\t\t\toffset.value = offset.value + endOffset + 1;\n\n\t\t\treturn stringValue;\n\n\t\t}\n\n\t\tfunction parseFixedLengthString( buffer, offset, size ) {\n\n\t\t\tconst stringValue = new TextDecoder().decode(\n\t\t\t\tnew Uint8Array( buffer ).slice( offset.value, offset.value + size )\n\t\t\t);\n\n\t\t\toffset.value = offset.value + size;\n\n\t\t\treturn stringValue;\n\n\t\t}\n\n\t\tfunction parseRational( dataView, offset ) {\n\n\t\t\tconst x = parseInt32( dataView, offset );\n\t\t\tconst y = parseUint32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseTimecode( dataView, offset ) {\n\n\t\t\tconst x = parseUint32( dataView, offset );\n\t\t\tconst y = parseUint32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseInt32( dataView, offset ) {\n\n\t\t\tconst Int32 = dataView.getInt32( offset.value, true );\n\n\t\t\toffset.value = offset.value + INT32_SIZE;\n\n\t\t\treturn Int32;\n\n\t\t}\n\n\t\tfunction parseUint32( dataView, offset ) {\n\n\t\t\tconst Uint32 = dataView.getUint32( offset.value, true );\n\n\t\t\toffset.value = offset.value + INT32_SIZE;\n\n\t\t\treturn Uint32;\n\n\t\t}\n\n\t\tfunction parseUint8Array( uInt8Array, offset ) {\n\n\t\t\tconst Uint8 = uInt8Array[ offset.value ];\n\n\t\t\toffset.value = offset.value + INT8_SIZE;\n\n\t\t\treturn Uint8;\n\n\t\t}\n\n\t\tfunction parseUint8( dataView, offset ) {\n\n\t\t\tconst Uint8 = dataView.getUint8( offset.value );\n\n\t\t\toffset.value = offset.value + INT8_SIZE;\n\n\t\t\treturn Uint8;\n\n\t\t}\n\n\t\tconst parseInt64 = function ( dataView, offset ) {\n\n\t\t\tlet int;\n\n\t\t\tif ( 'getBigInt64' in DataView.prototype ) {\n\n\t\t\t\tint = Number( dataView.getBigInt64( offset.value, true ) );\n\n\t\t\t} else {\n\n\t\t\t\tint = dataView.getUint32( offset.value + 4, true ) + Number( dataView.getUint32( offset.value, true ) << 32 );\n\n\t\t\t}\n\n\t\t\toffset.value += ULONG_SIZE;\n\n\t\t\treturn int;\n\n\t\t};\n\n\t\tfunction parseFloat32( dataView, offset ) {\n\n\t\t\tconst float = dataView.getFloat32( offset.value, true );\n\n\t\t\toffset.value += FLOAT32_SIZE;\n\n\t\t\treturn float;\n\n\t\t}\n\n\t\tfunction decodeFloat32( dataView, offset ) {\n\n\t\t\treturn DataUtils.toHalfFloat( parseFloat32( dataView, offset ) );\n\n\t\t}\n\n\t\t// https://stackoverflow.com/questions/5678432/decompressing-half-precision-floats-in-javascript\n\t\tfunction decodeFloat16( binary ) {\n\n\t\t\tconst exponent = ( binary & 0x7C00 ) >> 10,\n\t\t\t\tfraction = binary & 0x03FF;\n\n\t\t\treturn ( binary >> 15 ? - 1 : 1 ) * (\n\t\t\t\texponent ?\n\t\t\t\t\t(\n\t\t\t\t\t\texponent === 0x1F ?\n\t\t\t\t\t\t\tfraction ? NaN : Infinity :\n\t\t\t\t\t\t\tMath.pow( 2, exponent - 15 ) * ( 1 + fraction / 0x400 )\n\t\t\t\t\t) :\n\t\t\t\t\t6.103515625e-5 * ( fraction / 0x400 )\n\t\t\t);\n\n\t\t}\n\n\t\tfunction parseUint16( dataView, offset ) {\n\n\t\t\tconst Uint16 = dataView.getUint16( offset.value, true );\n\n\t\t\toffset.value += INT16_SIZE;\n\n\t\t\treturn Uint16;\n\n\t\t}\n\n\t\tfunction parseFloat16( buffer, offset ) {\n\n\t\t\treturn decodeFloat16( parseUint16( buffer, offset ) );\n\n\t\t}\n\n\t\tfunction parseChlist( dataView, buffer, offset, size ) {\n\n\t\t\tconst startOffset = offset.value;\n\t\t\tconst channels = [];\n\n\t\t\twhile ( offset.value < ( startOffset + size - 1 ) ) {\n\n\t\t\t\tconst name = parseNullTerminatedString( buffer, offset );\n\t\t\t\tconst pixelType = parseInt32( dataView, offset );\n\t\t\t\tconst pLinear = parseUint8( dataView, offset );\n\t\t\t\toffset.value += 3; // reserved, three chars\n\t\t\t\tconst xSampling = parseInt32( dataView, offset );\n\t\t\t\tconst ySampling = parseInt32( dataView, offset );\n\n\t\t\t\tchannels.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\tpixelType: pixelType,\n\t\t\t\t\tpLinear: pLinear,\n\t\t\t\t\txSampling: xSampling,\n\t\t\t\t\tySampling: ySampling\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\toffset.value += 1;\n\n\t\t\treturn channels;\n\n\t\t}\n\n\t\tfunction parseChromaticities( dataView, offset ) {\n\n\t\t\tconst redX = parseFloat32( dataView, offset );\n\t\t\tconst redY = parseFloat32( dataView, offset );\n\t\t\tconst greenX = parseFloat32( dataView, offset );\n\t\t\tconst greenY = parseFloat32( dataView, offset );\n\t\t\tconst blueX = parseFloat32( dataView, offset );\n\t\t\tconst blueY = parseFloat32( dataView, offset );\n\t\t\tconst whiteX = parseFloat32( dataView, offset );\n\t\t\tconst whiteY = parseFloat32( dataView, offset );\n\n\t\t\treturn { redX: redX, redY: redY, greenX: greenX, greenY: greenY, blueX: blueX, blueY: blueY, whiteX: whiteX, whiteY: whiteY };\n\n\t\t}\n\n\t\tfunction parseCompression( dataView, offset ) {\n\n\t\t\tconst compressionCodes = [\n\t\t\t\t'NO_COMPRESSION',\n\t\t\t\t'RLE_COMPRESSION',\n\t\t\t\t'ZIPS_COMPRESSION',\n\t\t\t\t'ZIP_COMPRESSION',\n\t\t\t\t'PIZ_COMPRESSION',\n\t\t\t\t'PXR24_COMPRESSION',\n\t\t\t\t'B44_COMPRESSION',\n\t\t\t\t'B44A_COMPRESSION',\n\t\t\t\t'DWAA_COMPRESSION',\n\t\t\t\t'DWAB_COMPRESSION'\n\t\t\t];\n\n\t\t\tconst compression = parseUint8( dataView, offset );\n\n\t\t\treturn compressionCodes[ compression ];\n\n\t\t}\n\n\t\tfunction parseBox2i( dataView, offset ) {\n\n\t\t\tconst xMin = parseUint32( dataView, offset );\n\t\t\tconst yMin = parseUint32( dataView, offset );\n\t\t\tconst xMax = parseUint32( dataView, offset );\n\t\t\tconst yMax = parseUint32( dataView, offset );\n\n\t\t\treturn { xMin: xMin, yMin: yMin, xMax: xMax, yMax: yMax };\n\n\t\t}\n\n\t\tfunction parseLineOrder( dataView, offset ) {\n\n\t\t\tconst lineOrders = [\n\t\t\t\t'INCREASING_Y'\n\t\t\t];\n\n\t\t\tconst lineOrder = parseUint8( dataView, offset );\n\n\t\t\treturn lineOrders[ lineOrder ];\n\n\t\t}\n\n\t\tfunction parseV2f( dataView, offset ) {\n\n\t\t\tconst x = parseFloat32( dataView, offset );\n\t\t\tconst y = parseFloat32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseV3f( dataView, offset ) {\n\n\t\t\tconst x = parseFloat32( dataView, offset );\n\t\t\tconst y = parseFloat32( dataView, offset );\n\t\t\tconst z = parseFloat32( dataView, offset );\n\n\t\t\treturn [ x, y, z ];\n\n\t\t}\n\n\t\tfunction parseValue( dataView, buffer, offset, type, size ) {\n\n\t\t\tif ( type === 'string' || type === 'stringvector' || type === 'iccProfile' ) {\n\n\t\t\t\treturn parseFixedLengthString( buffer, offset, size );\n\n\t\t\t} else if ( type === 'chlist' ) {\n\n\t\t\t\treturn parseChlist( dataView, buffer, offset, size );\n\n\t\t\t} else if ( type === 'chromaticities' ) {\n\n\t\t\t\treturn parseChromaticities( dataView, offset );\n\n\t\t\t} else if ( type === 'compression' ) {\n\n\t\t\t\treturn parseCompression( dataView, offset );\n\n\t\t\t} else if ( type === 'box2i' ) {\n\n\t\t\t\treturn parseBox2i( dataView, offset );\n\n\t\t\t} else if ( type === 'lineOrder' ) {\n\n\t\t\t\treturn parseLineOrder( dataView, offset );\n\n\t\t\t} else if ( type === 'float' ) {\n\n\t\t\t\treturn parseFloat32( dataView, offset );\n\n\t\t\t} else if ( type === 'v2f' ) {\n\n\t\t\t\treturn parseV2f( dataView, offset );\n\n\t\t\t} else if ( type === 'v3f' ) {\n\n\t\t\t\treturn parseV3f( dataView, offset );\n\n\t\t\t} else if ( type === 'int' ) {\n\n\t\t\t\treturn parseInt32( dataView, offset );\n\n\t\t\t} else if ( type === 'rational' ) {\n\n\t\t\t\treturn parseRational( dataView, offset );\n\n\t\t\t} else if ( type === 'timecode' ) {\n\n\t\t\t\treturn parseTimecode( dataView, offset );\n\n\t\t\t} else if ( type === 'preview' ) {\n\n\t\t\t\toffset.value += size;\n\t\t\t\treturn 'skipped';\n\n\t\t\t} else {\n\n\t\t\t\toffset.value += size;\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseHeader( dataView, buffer, offset ) {\n\n\t\t\tconst EXRHeader = {};\n\n\t\t\tif ( dataView.getUint32( 0, true ) != 20000630 ) { // magic\n\n\t\t\t\tthrow new Error( 'THREE.EXRLoader: provided file doesn\\'t appear to be in OpenEXR format.' );\n\n\t\t\t}\n\n\t\t\tEXRHeader.version = dataView.getUint8( 4 );\n\n\t\t\tconst spec = dataView.getUint8( 5 ); // fullMask\n\n\t\t\tEXRHeader.spec = {\n\t\t\t\tsingleTile: !! ( spec & 2 ),\n\t\t\t\tlongName: !! ( spec & 4 ),\n\t\t\t\tdeepFormat: !! ( spec & 8 ),\n\t\t\t\tmultiPart: !! ( spec & 16 ),\n\t\t\t};\n\n\t\t\t// start of header\n\n\t\t\toffset.value = 8; // start at 8 - after pre-amble\n\n\t\t\tlet keepReading = true;\n\n\t\t\twhile ( keepReading ) {\n\n\t\t\t\tconst attributeName = parseNullTerminatedString( buffer, offset );\n\n\t\t\t\tif ( attributeName == 0 ) {\n\n\t\t\t\t\tkeepReading = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst attributeType = parseNullTerminatedString( buffer, offset );\n\t\t\t\t\tconst attributeSize = parseUint32( dataView, offset );\n\t\t\t\t\tconst attributeValue = parseValue( dataView, buffer, offset, attributeType, attributeSize );\n\n\t\t\t\t\tif ( attributeValue === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( `EXRLoader.parse: skipped unknown header attribute type \\'${attributeType}\\'.` );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tEXRHeader[ attributeName ] = attributeValue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( spec != 0 ) {\n\n\t\t\t\tconsole.error( 'EXRHeader:', EXRHeader );\n\t\t\t\tthrow new Error( 'THREE.EXRLoader: provided file is currently unsupported.' );\n\n\t\t\t}\n\n\t\t\treturn EXRHeader;\n\n\t\t}\n\n\t\tfunction setupDecoder( EXRHeader, dataView, uInt8Array, offset, outputType ) {\n\n\t\t\tconst EXRDecoder = {\n\t\t\t\tsize: 0,\n\t\t\t\tviewer: dataView,\n\t\t\t\tarray: uInt8Array,\n\t\t\t\toffset: offset,\n\t\t\t\twidth: EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1,\n\t\t\t\theight: EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1,\n\t\t\t\tchannels: EXRHeader.channels.length,\n\t\t\t\tbytesPerLine: null,\n\t\t\t\tlines: null,\n\t\t\t\tinputSize: null,\n\t\t\t\ttype: EXRHeader.channels[ 0 ].pixelType,\n\t\t\t\tuncompress: null,\n\t\t\t\tgetter: null,\n\t\t\t\tformat: null,\n\t\t\t\tencoding: null,\n\t\t\t};\n\n\t\t\tswitch ( EXRHeader.compression ) {\n\n\t\t\t\tcase 'NO_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressRAW;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RLE_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressRLE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZIPS_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressZIP;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZIP_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 16;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressZIP;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PIZ_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 32;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressPIZ;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PXR24_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 16;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressPXR;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DWAA_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 32;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressDWA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DWAB_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 256;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressDWA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'EXRLoader.parse: ' + EXRHeader.compression + ' is unsupported' );\n\n\t\t\t}\n\n\t\t\tEXRDecoder.scanlineBlockSize = EXRDecoder.lines;\n\n\t\t\tif ( EXRDecoder.type == 1 ) {\n\n\t\t\t\t// half\n\t\t\t\tswitch ( outputType ) {\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat16;\n\t\t\t\t\t\tEXRDecoder.inputSize = INT16_SIZE;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseUint16;\n\t\t\t\t\t\tEXRDecoder.inputSize = INT16_SIZE;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( EXRDecoder.type == 2 ) {\n\n\t\t\t\t// float\n\t\t\t\tswitch ( outputType ) {\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat32;\n\t\t\t\t\t\tEXRDecoder.inputSize = FLOAT32_SIZE;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tEXRDecoder.getter = decodeFloat32;\n\t\t\t\t\t\tEXRDecoder.inputSize = FLOAT32_SIZE;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'EXRLoader.parse: unsupported pixelType ' + EXRDecoder.type + ' for ' + EXRHeader.compression + '.' );\n\n\t\t\t}\n\n\t\t\tEXRDecoder.blockCount = ( EXRHeader.dataWindow.yMax + 1 ) / EXRDecoder.scanlineBlockSize;\n\n\t\t\tfor ( let i = 0; i < EXRDecoder.blockCount; i ++ )\n\t\t\t\tparseInt64( dataView, offset ); // scanlineOffset\n\n\t\t\t// we should be passed the scanline offset table, ready to start reading pixel data.\n\n\t\t\t// RGB images will be converted to RGBA format, preventing software emulation in select devices.\n\t\t\tEXRDecoder.outputChannels = ( ( EXRDecoder.channels == 3 ) ? 4 : EXRDecoder.channels );\n\t\t\tconst size = EXRDecoder.width * EXRDecoder.height * EXRDecoder.outputChannels;\n\n\t\t\tswitch ( outputType ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\t\tEXRDecoder.byteArray = new Float32Array( size );\n\n\t\t\t\t\t// Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten\n\t\t\t\t\tif ( EXRDecoder.channels < EXRDecoder.outputChannels )\n\t\t\t\t\t\tEXRDecoder.byteArray.fill( 1, 0, size );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase HalfFloatType:\n\t\t\t\t\tEXRDecoder.byteArray = new Uint16Array( size );\n\n\t\t\t\t\tif ( EXRDecoder.channels < EXRDecoder.outputChannels )\n\t\t\t\t\t\tEXRDecoder.byteArray.fill( 0x3C00, 0, size ); // Uint16Array holds half float data, 0x3C00 is 1\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error( 'THREE.EXRLoader: unsupported type: ', outputType );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tEXRDecoder.bytesPerLine = EXRDecoder.width * EXRDecoder.inputSize * EXRDecoder.channels;\n\n\t\t\tif ( EXRDecoder.outputChannels == 4 ) {\n\n\t\t\t\tEXRDecoder.format = RGBAFormat;\n\t\t\t\tEXRDecoder.encoding = LinearEncoding;\n\n\t\t\t} else {\n\n\t\t\t\tEXRDecoder.format = RedFormat;\n\t\t\t\tEXRDecoder.encoding = LinearEncoding;\n\n\t\t\t}\n\n\t\t\treturn EXRDecoder;\n\n\t\t}\n\n\t\t// start parsing file [START]\n\n\t\tconst bufferDataView = new DataView( buffer );\n\t\tconst uInt8Array = new Uint8Array( buffer );\n\t\tconst offset = { value: 0 };\n\n\t\t// get header information and validate format.\n\t\tconst EXRHeader = parseHeader( bufferDataView, buffer, offset );\n\n\t\t// get input compression information and prepare decoding.\n\t\tconst EXRDecoder = setupDecoder( EXRHeader, bufferDataView, uInt8Array, offset, this.type );\n\n\t\tconst tmpOffset = { value: 0 };\n\t\tconst channelOffsets = { R: 0, G: 1, B: 2, A: 3, Y: 0 };\n\n\t\tfor ( let scanlineBlockIdx = 0; scanlineBlockIdx < EXRDecoder.height / EXRDecoder.scanlineBlockSize; scanlineBlockIdx ++ ) {\n\n\t\t\tconst line = parseUint32( bufferDataView, offset ); // line_no\n\t\t\tEXRDecoder.size = parseUint32( bufferDataView, offset ); // data_len\n\t\t\tEXRDecoder.lines = ( ( line + EXRDecoder.scanlineBlockSize > EXRDecoder.height ) ? ( EXRDecoder.height - line ) : EXRDecoder.scanlineBlockSize );\n\n\t\t\tconst isCompressed = EXRDecoder.size < EXRDecoder.lines * EXRDecoder.bytesPerLine;\n\t\t\tconst viewer = isCompressed ? EXRDecoder.uncompress( EXRDecoder ) : uncompressRAW( EXRDecoder );\n\n\t\t\toffset.value += EXRDecoder.size;\n\n\t\t\tfor ( let line_y = 0; line_y < EXRDecoder.scanlineBlockSize; line_y ++ ) {\n\n\t\t\t\tconst true_y = line_y + scanlineBlockIdx * EXRDecoder.scanlineBlockSize;\n\t\t\t\tif ( true_y >= EXRDecoder.height ) break;\n\n\t\t\t\tfor ( let channelID = 0; channelID < EXRDecoder.channels; channelID ++ ) {\n\n\t\t\t\t\tconst cOff = channelOffsets[ EXRHeader.channels[ channelID ].name ];\n\n\t\t\t\t\tfor ( let x = 0; x < EXRDecoder.width; x ++ ) {\n\n\t\t\t\t\t\ttmpOffset.value = ( line_y * ( EXRDecoder.channels * EXRDecoder.width ) + channelID * EXRDecoder.width + x ) * EXRDecoder.inputSize;\n\t\t\t\t\t\tconst outIndex = ( EXRDecoder.height - 1 - true_y ) * ( EXRDecoder.width * EXRDecoder.outputChannels ) + x * EXRDecoder.outputChannels + cOff;\n\t\t\t\t\t\tEXRDecoder.byteArray[ outIndex ] = EXRDecoder.getter( viewer, tmpOffset );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\theader: EXRHeader,\n\t\t\twidth: EXRDecoder.width,\n\t\t\theight: EXRDecoder.height,\n\t\t\tdata: EXRDecoder.byteArray,\n\t\t\tformat: EXRDecoder.format,\n\t\t\tencoding: EXRDecoder.encoding,\n\t\t\ttype: this.type,\n\t\t};\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\ttexture.encoding = texData.encoding;\n\t\t\ttexture.minFilter = LinearFilter;\n\t\t\ttexture.magFilter = LinearFilter;\n\t\t\ttexture.generateMipmaps = false;\n\t\t\ttexture.flipY = false;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { EXRLoader };\n","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearEncoding,\n\tLinearFilter\n} from 'three';\n\n// https://github.com/mrdoob/three.js/issues/5552\n// http://en.wikipedia.org/wiki/RGBE_image_format\n\nclass RGBELoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\t// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n\tparse( buffer ) {\n\n\t\tconst\n\t\t\t/* return codes for rgbe routines */\n\t\t\t//RGBE_RETURN_SUCCESS = 0,\n\t\t\tRGBE_RETURN_FAILURE = - 1,\n\n\t\t\t/* default error routine. change this to change error handling */\n\t\t\trgbe_read_error = 1,\n\t\t\trgbe_write_error = 2,\n\t\t\trgbe_format_error = 3,\n\t\t\trgbe_memory_error = 4,\n\t\t\trgbe_error = function ( rgbe_error_code, msg ) {\n\n\t\t\t\tswitch ( rgbe_error_code ) {\n\n\t\t\t\t\tcase rgbe_read_error: console.error( 'THREE.RGBELoader Read Error: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase rgbe_write_error: console.error( 'THREE.RGBELoader Write Error: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase rgbe_format_error: console.error( 'THREE.RGBELoader Bad File Format: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase rgbe_memory_error: console.error( 'THREE.RGBELoader: Error: ' + ( msg || '' ) );\n\n\t\t\t\t}\n\n\t\t\t\treturn RGBE_RETURN_FAILURE;\n\n\t\t\t},\n\n\t\t\t/* offsets to red, green, and blue components in a data (float) pixel */\n\t\t\t//RGBE_DATA_RED = 0,\n\t\t\t//RGBE_DATA_GREEN = 1,\n\t\t\t//RGBE_DATA_BLUE = 2,\n\n\t\t\t/* number of floats per pixel, use 4 since stored in rgba image format */\n\t\t\t//RGBE_DATA_SIZE = 4,\n\n\t\t\t/* flags indicating which fields in an rgbe_header_info are valid */\n\t\t\tRGBE_VALID_PROGRAMTYPE = 1,\n\t\t\tRGBE_VALID_FORMAT = 2,\n\t\t\tRGBE_VALID_DIMENSIONS = 4,\n\n\t\t\tNEWLINE = '\\n',\n\n\t\t\tfgets = function ( buffer, lineLimit, consume ) {\n\n\t\t\t\tconst chunkSize = 128;\n\n\t\t\t\tlineLimit = ! lineLimit ? 1024 : lineLimit;\n\t\t\t\tlet p = buffer.pos,\n\t\t\t\t\ti = - 1, len = 0, s = '',\n\t\t\t\t\tchunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\twhile ( ( 0 > ( i = chunk.indexOf( NEWLINE ) ) ) && ( len < lineLimit ) && ( p < buffer.byteLength ) ) {\n\n\t\t\t\t\ts += chunk; len += chunk.length;\n\t\t\t\t\tp += chunkSize;\n\t\t\t\t\tchunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( - 1 < i ) {\n\n\t\t\t\t\t/*for (i=l-1; i>=0; i--) {\n\t\t\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t\t\t}*/\n\t\t\t\t\tif ( false !== consume ) buffer.pos += len + i + 1;\n\t\t\t\t\treturn s + chunk.slice( 0, i );\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\t/* minimal header reading. modify if you want to parse more information */\n\t\t\tRGBE_ReadHeader = function ( buffer ) {\n\n\n\t\t\t\t// regexes to parse header info fields\n\t\t\t\tconst magic_token_re = /^#\\?(\\S+)/,\n\t\t\t\t\tgamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\texposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\tformat_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n\t\t\t\t\tdimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n\n\t\t\t\t\t// RGBE format header struct\n\t\t\t\t\theader = {\n\n\t\t\t\t\t\tvalid: 0, /* indicate which fields are valid */\n\n\t\t\t\t\t\tstring: '', /* the actual header string */\n\n\t\t\t\t\t\tcomments: '', /* comments found in header */\n\n\t\t\t\t\t\tprogramtype: 'RGBE', /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */\n\n\t\t\t\t\t\tformat: '', /* RGBE format, default 32-bit_rle_rgbe */\n\n\t\t\t\t\t\tgamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */\n\n\t\t\t\t\t\texposure: 1.0, /* a value of 1.0 in an image corresponds to watts/steradian/m^2. defaults to 1.0 */\n\n\t\t\t\t\t\twidth: 0, height: 0 /* image dimensions, width/height */\n\n\t\t\t\t\t};\n\n\t\t\t\tlet line, match;\n\n\t\t\t\tif ( buffer.pos >= buffer.byteLength || ! ( line = fgets( buffer ) ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_read_error, 'no header found' );\n\n\t\t\t\t}\n\n\t\t\t\t/* if you want to require the magic token then uncomment the next line */\n\t\t\t\tif ( ! ( match = line.match( magic_token_re ) ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad initial token' );\n\n\t\t\t\t}\n\n\t\t\t\theader.valid |= RGBE_VALID_PROGRAMTYPE;\n\t\t\t\theader.programtype = match[ 1 ];\n\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\twhile ( true ) {\n\n\t\t\t\t\tline = fgets( buffer );\n\t\t\t\t\tif ( false === line ) break;\n\t\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\t\tif ( '#' === line.charAt( 0 ) ) {\n\n\t\t\t\t\t\theader.comments += line + '\\n';\n\t\t\t\t\t\tcontinue; // comment line\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( gamma_re ) ) {\n\n\t\t\t\t\t\theader.gamma = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( exposure_re ) ) {\n\n\t\t\t\t\t\theader.exposure = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( format_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_FORMAT;\n\t\t\t\t\t\theader.format = match[ 1 ];//'32-bit_rle_rgbe';\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( dimensions_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_DIMENSIONS;\n\t\t\t\t\t\theader.height = parseInt( match[ 1 ], 10 );\n\t\t\t\t\t\theader.width = parseInt( match[ 2 ], 10 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( header.valid & RGBE_VALID_FORMAT ) && ( header.valid & RGBE_VALID_DIMENSIONS ) ) break;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_FORMAT ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'missing format specifier' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_DIMENSIONS ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'missing image size specifier' );\n\n\t\t\t\t}\n\n\t\t\t\treturn header;\n\n\t\t\t},\n\n\t\t\tRGBE_ReadPixels_RLE = function ( buffer, w, h ) {\n\n\t\t\t\tconst scanline_width = w;\n\n\t\t\t\tif (\n\t\t\t\t\t// run length encoding is not allowed so read flat\n\t\t\t\t\t( ( scanline_width < 8 ) || ( scanline_width > 0x7fff ) ) ||\n\t\t\t\t\t// this file is not run length encoded\n\t\t\t\t\t( ( 2 !== buffer[ 0 ] ) || ( 2 !== buffer[ 1 ] ) || ( buffer[ 2 ] & 0x80 ) )\n\t\t\t\t) {\n\n\t\t\t\t\t// return the flat buffer\n\t\t\t\t\treturn new Uint8Array( buffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scanline_width !== ( ( buffer[ 2 ] << 8 ) | buffer[ 3 ] ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'wrong scanline width' );\n\n\t\t\t\t}\n\n\t\t\t\tconst data_rgba = new Uint8Array( 4 * w * h );\n\n\t\t\t\tif ( ! data_rgba.length ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_memory_error, 'unable to allocate buffer space' );\n\n\t\t\t\t}\n\n\t\t\t\tlet offset = 0, pos = 0;\n\n\t\t\t\tconst ptr_end = 4 * scanline_width;\n\t\t\t\tconst rgbeStart = new Uint8Array( 4 );\n\t\t\t\tconst scanline_buffer = new Uint8Array( ptr_end );\n\t\t\t\tlet num_scanlines = h;\n\n\t\t\t\t// read in each successive scanline\n\t\t\t\twhile ( ( num_scanlines > 0 ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\tif ( pos + 4 > buffer.byteLength ) {\n\n\t\t\t\t\t\treturn rgbe_error( rgbe_read_error );\n\n\t\t\t\t\t}\n\n\t\t\t\t\trgbeStart[ 0 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 1 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 2 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 3 ] = buffer[ pos ++ ];\n\n\t\t\t\t\tif ( ( 2 != rgbeStart[ 0 ] ) || ( 2 != rgbeStart[ 1 ] ) || ( ( ( rgbeStart[ 2 ] << 8 ) | rgbeStart[ 3 ] ) != scanline_width ) ) {\n\n\t\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad rgbe scanline format' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// read each of the four channels for the scanline into the buffer\n\t\t\t\t\t// first red, then green, then blue, then exponent\n\t\t\t\t\tlet ptr = 0, count;\n\n\t\t\t\t\twhile ( ( ptr < ptr_end ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\t\tcount = buffer[ pos ++ ];\n\t\t\t\t\t\tconst isEncodedRun = count > 128;\n\t\t\t\t\t\tif ( isEncodedRun ) count -= 128;\n\n\t\t\t\t\t\tif ( ( 0 === count ) || ( ptr + count > ptr_end ) ) {\n\n\t\t\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad scanline data' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( isEncodedRun ) {\n\n\t\t\t\t\t\t\t// a (encoded) run of the same value\n\t\t\t\t\t\t\tconst byteValue = buffer[ pos ++ ];\n\t\t\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\t\t\tscanline_buffer[ ptr ++ ] = byteValue;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//ptr += count;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// a literal-run\n\t\t\t\t\t\t\tscanline_buffer.set( buffer.subarray( pos, pos + count ), ptr );\n\t\t\t\t\t\t\tptr += count; pos += count;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\t// now convert data from buffer into rgba\n\t\t\t\t\t// first red, then green, then blue, then exponent (alpha)\n\t\t\t\t\tconst l = scanline_width; //scanline_buffer.byteLength;\n\t\t\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\t\t\tlet off = 0;\n\t\t\t\t\t\tdata_rgba[ offset ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 1 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 2 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 3 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnum_scanlines --;\n\n\t\t\t\t}\n\n\t\t\t\treturn data_rgba;\n\n\t\t\t};\n\n\t\tconst RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\tdestArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale;\n\t\t\tdestArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale;\n\t\t\tdestArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale;\n\t\t\tdestArray[ destOffset + 3 ] = 1;\n\n\t\t};\n\n\t\tconst RGBEByteToRGBHalf = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\t// clamping to 65504, the maximum representable value in float16\n\t\t\tdestArray[ destOffset + 0 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 1 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 2 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 3 ] = DataUtils.toHalfFloat( 1 );\n\n\t\t};\n\n\t\tconst byteArray = new Uint8Array( buffer );\n\t\tbyteArray.pos = 0;\n\t\tconst rgbe_header_info = RGBE_ReadHeader( byteArray );\n\n\t\tif ( RGBE_RETURN_FAILURE !== rgbe_header_info ) {\n\n\t\t\tconst w = rgbe_header_info.width,\n\t\t\t\th = rgbe_header_info.height,\n\t\t\t\timage_rgba_data = RGBE_ReadPixels_RLE( byteArray.subarray( byteArray.pos ), w, h );\n\n\t\t\tif ( RGBE_RETURN_FAILURE !== image_rgba_data ) {\n\n\t\t\t\tlet data, format, type;\n\t\t\t\tlet numElements;\n\n\t\t\t\tswitch ( this.type ) {\n\n\t\t\t\t\tcase FloatType:\n\n\t\t\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\t\t\tconst floatArray = new Float32Array( numElements * 4 );\n\n\t\t\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\t\t\tRGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 4 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = floatArray;\n\t\t\t\t\t\ttype = FloatType;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\t\t\tconst halfArray = new Uint16Array( numElements * 4 );\n\n\t\t\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\t\t\tRGBEByteToRGBHalf( image_rgba_data, j * 4, halfArray, j * 4 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = halfArray;\n\t\t\t\t\t\ttype = HalfFloatType;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tconsole.error( 'THREE.RGBELoader: unsupported type: ', this.type );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\twidth: w, height: h,\n\t\t\t\t\tdata: data,\n\t\t\t\t\theader: rgbe_header_info.string,\n\t\t\t\t\tgamma: rgbe_header_info.gamma,\n\t\t\t\t\texposure: rgbe_header_info.exposure,\n\t\t\t\t\tformat: format,\n\t\t\t\t\ttype: type\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\tswitch ( texture.type ) {\n\n\t\t\t\tcase FloatType:\n\n\t\t\t\t\ttexture.encoding = LinearEncoding;\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\ttexture.flipY = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\ttexture.encoding = LinearEncoding;\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\ttexture.flipY = true;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { RGBELoader };\n","import {\n\tFileLoader,\n\tLoader,\n\tShapePath\n} from 'three';\n\nclass FontLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t}\n\n\t\t\tconst font = scope.parse( json );\n\n\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\treturn new Font( json );\n\n\t}\n\n}\n\n//\n\nclass Font {\n\n\tconstructor( data ) {\n\n\t\tthis.type = 'Font';\n\n\t\tthis.data = data;\n\n\t}\n\n\tgenerateShapes( text, size = 100 ) {\n\n\t\tconst shapes = [];\n\t\tconst paths = createPaths( text, size, this.data );\n\n\t\tfor ( let p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n}\n\nfunction createPaths( text, size, data ) {\n\n\tconst chars = Array.from( text );\n\tconst scale = size / data.resolution;\n\tconst line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\tconst paths = [];\n\n\tlet offsetX = 0, offsetY = 0;\n\n\tfor ( let i = 0; i < chars.length; i ++ ) {\n\n\t\tconst char = chars[ i ];\n\n\t\tif ( char === '\\n' ) {\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY -= line_height;\n\n\t\t} else {\n\n\t\t\tconst ret = createPath( char, scale, offsetX, offsetY, data );\n\t\t\toffsetX += ret.offsetX;\n\t\t\tpaths.push( ret.path );\n\n\t\t}\n\n\t}\n\n\treturn paths;\n\n}\n\nfunction createPath( char, scale, offsetX, offsetY, data ) {\n\n\tconst glyph = data.glyphs[ char ] || data.glyphs[ '?' ];\n\n\tif ( ! glyph ) {\n\n\t\tconsole.error( 'THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.' );\n\n\t\treturn;\n\n\t}\n\n\tconst path = new ShapePath();\n\n\tlet x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;\n\n\tif ( glyph.o ) {\n\n\t\tconst outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\tfor ( let i = 0, l = outline.length; i < l; ) {\n\n\t\t\tconst action = outline[ i ++ ];\n\n\t\t\tswitch ( action ) {\n\n\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { offsetX: glyph.ha * scale, path: path };\n\n}\n\nFont.prototype.isFont = true;\n\nexport { FontLoader, Font };\n","/**\n * Main content for the worker that handles the loading and execution of\n * modules within it.\n */\nfunction workerBootstrap() {\n var modules = Object.create(null);\n\n // Handle messages for registering a module\n function registerModule(ref, callback) {\n var id = ref.id;\n var name = ref.name;\n var dependencies = ref.dependencies; if ( dependencies === void 0 ) dependencies = [];\n var init = ref.init; if ( init === void 0 ) init = function(){};\n var getTransferables = ref.getTransferables; if ( getTransferables === void 0 ) getTransferables = null;\n\n // Only register once\n if (modules[id]) { return }\n\n try {\n // If any dependencies are modules, ensure they're registered and grab their value\n dependencies = dependencies.map(function (dep) {\n if (dep && dep.isWorkerModule) {\n registerModule(dep, function (depResult) {\n if (depResult instanceof Error) { throw depResult }\n });\n dep = modules[dep.id].value;\n }\n return dep\n });\n\n // Rehydrate functions\n init = rehydrate((\"<\" + name + \">.init\"), init);\n if (getTransferables) {\n getTransferables = rehydrate((\"<\" + name + \">.getTransferables\"), getTransferables);\n }\n\n // Initialize the module and store its value\n var value = null;\n if (typeof init === 'function') {\n value = init.apply(void 0, dependencies);\n } else {\n console.error('worker module init function failed to rehydrate');\n }\n modules[id] = {\n id: id,\n value: value,\n getTransferables: getTransferables\n };\n callback(value);\n } catch(err) {\n if (!(err && err.noLog)) {\n console.error(err);\n }\n callback(err);\n }\n }\n\n // Handle messages for calling a registered module's result function\n function callModule(ref, callback) {\n var ref$1;\n\n var id = ref.id;\n var args = ref.args;\n if (!modules[id] || typeof modules[id].value !== 'function') {\n callback(new Error((\"Worker module \" + id + \": not found or its 'init' did not return a function\")));\n }\n try {\n var result = (ref$1 = modules[id]).value.apply(ref$1, args);\n if (result && typeof result.then === 'function') {\n result.then(handleResult, function (rej) { return callback(rej instanceof Error ? rej : new Error('' + rej)); });\n } else {\n handleResult(result);\n }\n } catch(err) {\n callback(err);\n }\n function handleResult(result) {\n try {\n var tx = modules[id].getTransferables && modules[id].getTransferables(result);\n if (!tx || !Array.isArray(tx) || !tx.length) {\n tx = undefined; //postMessage is very picky about not passing null or empty transferables\n }\n callback(result, tx);\n } catch(err) {\n console.error(err);\n callback(err);\n }\n }\n }\n\n function rehydrate(name, str) {\n var result = void 0;\n self.troikaDefine = function (r) { return result = r; };\n var url = URL.createObjectURL(\n new Blob(\n [(\"/** \" + (name.replace(/\\*/g, '')) + \" **/\\n\\ntroikaDefine(\\n\" + str + \"\\n)\")],\n {type: 'application/javascript'}\n )\n );\n try {\n importScripts(url);\n } catch(err) {\n console.error(err);\n }\n URL.revokeObjectURL(url);\n delete self.troikaDefine;\n return result\n }\n\n // Handler for all messages within the worker\n self.addEventListener('message', function (e) {\n var ref = e.data;\n var messageId = ref.messageId;\n var action = ref.action;\n var data = ref.data;\n try {\n // Module registration\n if (action === 'registerModule') {\n registerModule(data, function (result) {\n if (result instanceof Error) {\n postMessage({\n messageId: messageId,\n success: false,\n error: result.message\n });\n } else {\n postMessage({\n messageId: messageId,\n success: true,\n result: {isCallable: typeof result === 'function'}\n });\n }\n });\n }\n // Invocation\n if (action === 'callModule') {\n callModule(data, function (result, transferables) {\n if (result instanceof Error) {\n postMessage({\n messageId: messageId,\n success: false,\n error: result.message\n });\n } else {\n postMessage({\n messageId: messageId,\n success: true,\n result: result\n }, transferables || undefined);\n }\n });\n }\n } catch(err) {\n postMessage({\n messageId: messageId,\n success: false,\n error: err.stack\n });\n }\n });\n}\n\n/**\n * Fallback for `defineWorkerModule` that behaves identically but runs in the main\n * thread, for when the execution environment doesn't support web workers or they\n * are disallowed due to e.g. CSP security restrictions.\n */\nfunction defineMainThreadModule(options) {\n var moduleFunc = function() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n return moduleFunc._getInitResult().then(function (initResult) {\n if (typeof initResult === 'function') {\n return initResult.apply(void 0, args)\n } else {\n throw new Error('Worker module function was called but `init` did not return a callable function')\n }\n })\n };\n moduleFunc._getInitResult = function() {\n // We can ignore getTransferables in main thread. TODO workerId?\n var dependencies = options.dependencies;\n var init = options.init;\n\n // Resolve dependencies\n dependencies = Array.isArray(dependencies) ? dependencies.map(function (dep) { return dep && dep._getInitResult ? dep._getInitResult() : dep; }\n ) : [];\n\n // Invoke init with the resolved dependencies\n var initPromise = Promise.all(dependencies).then(function (deps) {\n return init.apply(null, deps)\n });\n\n // Cache the resolved promise for subsequent calls\n moduleFunc._getInitResult = function () { return initPromise; };\n\n return initPromise\n };\n return moduleFunc\n}\n\nvar supportsWorkers = function () {\n var supported = false;\n\n // Only attempt worker initialization in browsers; elsewhere it would just be\n // noise e.g. loading into a Node environment for SSR.\n if (typeof window !== 'undefined' && typeof window.document !== 'undefined') {\n try {\n // TODO additional checks for things like importScripts within the worker?\n // Would need to be an async check.\n var worker = new Worker(\n URL.createObjectURL(new Blob([''], { type: 'application/javascript' }))\n );\n worker.terminate();\n supported = true;\n } catch (err) {\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') ; else {\n console.log(\n (\"Troika createWorkerModule: web workers not allowed; falling back to main thread execution. Cause: [\" + (err.message) + \"]\")\n );\n }\n }\n }\n\n // Cached result\n supportsWorkers = function () { return supported; };\n return supported\n};\n\nvar _workerModuleId = 0;\nvar _messageId = 0;\nvar _allowInitAsString = false;\nvar workers = Object.create(null);\nvar registeredModules = Object.create(null); //workerId -> Set\nvar openRequests = Object.create(null);\n\n\n/**\n * Define a module of code that will be executed with a web worker. This provides a simple\n * interface for moving chunks of logic off the main thread, and managing their dependencies\n * among one another.\n *\n * @param {object} options\n * @param {function} options.init\n * @param {array} [options.dependencies]\n * @param {function} [options.getTransferables]\n * @param {string} [options.name]\n * @param {string} [options.workerId]\n * @return {function(...[*]): {then}}\n */\nfunction defineWorkerModule(options) {\n if ((!options || typeof options.init !== 'function') && !_allowInitAsString) {\n throw new Error('requires `options.init` function')\n }\n var dependencies = options.dependencies;\n var init = options.init;\n var getTransferables = options.getTransferables;\n var workerId = options.workerId;\n\n if (!supportsWorkers()) {\n return defineMainThreadModule(options)\n }\n\n if (workerId == null) {\n workerId = '#default';\n }\n var id = \"workerModule\" + (++_workerModuleId);\n var name = options.name || id;\n var registrationPromise = null;\n\n dependencies = dependencies && dependencies.map(function (dep) {\n // Wrap raw functions as worker modules with no dependencies\n if (typeof dep === 'function' && !dep.workerModuleData) {\n _allowInitAsString = true;\n dep = defineWorkerModule({\n workerId: workerId,\n name: (\"<\" + name + \"> function dependency: \" + (dep.name)),\n init: (\"function(){return (\\n\" + (stringifyFunction(dep)) + \"\\n)}\")\n });\n _allowInitAsString = false;\n }\n // Grab postable data for worker modules\n if (dep && dep.workerModuleData) {\n dep = dep.workerModuleData;\n }\n return dep\n });\n\n function moduleFunc() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n // Register this module if needed\n if (!registrationPromise) {\n registrationPromise = callWorker(workerId,'registerModule', moduleFunc.workerModuleData);\n var unregister = function () {\n registrationPromise = null;\n registeredModules[workerId].delete(unregister);\n }\n ;(registeredModules[workerId] || (registeredModules[workerId] = new Set())).add(unregister);\n }\n\n // Invoke the module, returning a promise\n return registrationPromise.then(function (ref) {\n var isCallable = ref.isCallable;\n\n if (isCallable) {\n return callWorker(workerId,'callModule', {id: id, args: args})\n } else {\n throw new Error('Worker module function was called but `init` did not return a callable function')\n }\n })\n }\n moduleFunc.workerModuleData = {\n isWorkerModule: true,\n id: id,\n name: name,\n dependencies: dependencies,\n init: stringifyFunction(init),\n getTransferables: getTransferables && stringifyFunction(getTransferables)\n };\n return moduleFunc\n}\n\n/**\n * Terminate an active Worker by a workerId that was passed to defineWorkerModule.\n * This only terminates the Worker itself; the worker module will remain available\n * and if you call it again its Worker will be respawned.\n * @param {string} workerId\n */\nfunction terminateWorker(workerId) {\n // Unregister all modules that were registered in that worker\n if (registeredModules[workerId]) {\n registeredModules[workerId].forEach(function (unregister) {\n unregister();\n });\n }\n // Terminate the Worker object\n if (workers[workerId]) {\n workers[workerId].terminate();\n delete workers[workerId];\n }\n}\n\n/**\n * Stringifies a function into a form that can be deserialized in the worker\n * @param fn\n */\nfunction stringifyFunction(fn) {\n var str = fn.toString();\n // If it was defined in object method/property format, it needs to be modified\n if (!/^function/.test(str) && /^\\w+\\s*\\(/.test(str)) {\n str = 'function ' + str;\n }\n return str\n}\n\n\nfunction getWorker(workerId) {\n var worker = workers[workerId];\n if (!worker) {\n // Bootstrap the worker's content\n var bootstrap = stringifyFunction(workerBootstrap);\n\n // Create the worker from the bootstrap function content\n worker = workers[workerId] = new Worker(\n URL.createObjectURL(\n new Blob(\n [(\"/** Worker Module Bootstrap: \" + (workerId.replace(/\\*/g, '')) + \" **/\\n\\n;(\" + bootstrap + \")()\")],\n {type: 'application/javascript'}\n )\n )\n );\n\n // Single handler for response messages from the worker\n worker.onmessage = function (e) {\n var response = e.data;\n var msgId = response.messageId;\n var callback = openRequests[msgId];\n if (!callback) {\n throw new Error('WorkerModule response with empty or unknown messageId')\n }\n delete openRequests[msgId];\n callback(response);\n };\n }\n return worker\n}\n\n// Issue a call to the worker with a callback to handle the response\nfunction callWorker(workerId, action, data) {\n return new Promise(function (resolve, reject) {\n var messageId = ++_messageId;\n openRequests[messageId] = function (response) {\n if (response.success) {\n resolve(response.result);\n } else {\n reject(new Error((\"Error in worker \" + action + \" call: \" + (response.error))));\n }\n };\n getWorker(workerId).postMessage({\n messageId: messageId,\n action: action,\n data: data\n });\n })\n}\n\nexport { defineWorkerModule, stringifyFunction, terminateWorker };\n","function SDFGenerator() {\nvar exports = (function (exports) {\n\n /**\n * Find the point on a quadratic bezier curve at t where t is in the range [0, 1]\n */\n function pointOnQuadraticBezier (x0, y0, x1, y1, x2, y2, t, pointOut) {\n var t2 = 1 - t;\n pointOut.x = t2 * t2 * x0 + 2 * t2 * t * x1 + t * t * x2;\n pointOut.y = t2 * t2 * y0 + 2 * t2 * t * y1 + t * t * y2;\n }\n\n /**\n * Find the point on a cubic bezier curve at t where t is in the range [0, 1]\n */\n function pointOnCubicBezier (x0, y0, x1, y1, x2, y2, x3, y3, t, pointOut) {\n var t2 = 1 - t;\n pointOut.x = t2 * t2 * t2 * x0 + 3 * t2 * t2 * t * x1 + 3 * t2 * t * t * x2 + t * t * t * x3;\n pointOut.y = t2 * t2 * t2 * y0 + 3 * t2 * t2 * t * y1 + 3 * t2 * t * t * y2 + t * t * t * y3;\n }\n\n /**\n * Parse a path string into its constituent line/curve commands, invoking a callback for each.\n * @param {string} pathString - An SVG-like path string to parse; should only contain commands: M/L/Q/C/Z\n * @param {function(\n * command: 'L'|'Q'|'C',\n * startX: number,\n * startY: number,\n * endX: number,\n * endY: number,\n * ctrl1X?: number,\n * ctrl1Y?: number,\n * ctrl2X?: number,\n * ctrl2Y?: number\n * )} commandCallback - A callback function that will be called once for each parsed path command, passing the\n * command identifier (only L/Q/C commands) and its numeric arguments.\n */\n function forEachPathCommand(pathString, commandCallback) {\n var segmentRE = /([MLQCZ])([^MLQCZ]*)/g;\n var match, firstX, firstY, prevX, prevY;\n while ((match = segmentRE.exec(pathString))) {\n var args = match[2]\n .replace(/^\\s*|\\s*$/g, '')\n .split(/[,\\s]+/)\n .map(function (v) { return parseFloat(v); });\n switch (match[1]) {\n case 'M':\n prevX = firstX = args[0];\n prevY = firstY = args[1];\n break\n case 'L':\n if (args[0] !== prevX || args[1] !== prevY) { // yup, some fonts have zero-length line commands\n commandCallback('L', prevX, prevY, (prevX = args[0]), (prevY = args[1]));\n }\n break\n case 'Q': {\n commandCallback('Q', prevX, prevY, (prevX = args[2]), (prevY = args[3]), args[0], args[1]);\n break\n }\n case 'C': {\n commandCallback('C', prevX, prevY, (prevX = args[4]), (prevY = args[5]), args[0], args[1], args[2], args[3]);\n break\n }\n case 'Z':\n if (prevX !== firstX || prevY !== firstY) {\n commandCallback('L', prevX, prevY, firstX, firstY);\n }\n break\n }\n }\n }\n\n /**\n * Convert a path string to a series of straight line segments\n * @param {string} pathString - An SVG-like path string to parse; should only contain commands: M/L/Q/C/Z\n * @param {function(x1:number, y1:number, x2:number, y2:number)} segmentCallback - A callback\n * function that will be called once for every line segment\n * @param {number} [curvePoints] - How many straight line segments to use when approximating a\n * bezier curve in the path. Defaults to 16.\n */\n function pathToLineSegments (pathString, segmentCallback, curvePoints) {\n if ( curvePoints === void 0 ) curvePoints = 16;\n\n var tempPoint = { x: 0, y: 0 };\n forEachPathCommand(pathString, function (command, startX, startY, endX, endY, ctrl1X, ctrl1Y, ctrl2X, ctrl2Y) {\n switch (command) {\n case 'L':\n segmentCallback(startX, startY, endX, endY);\n break\n case 'Q': {\n var prevCurveX = startX;\n var prevCurveY = startY;\n for (var i = 1; i < curvePoints; i++) {\n pointOnQuadraticBezier(\n startX, startY,\n ctrl1X, ctrl1Y,\n endX, endY,\n i / (curvePoints - 1),\n tempPoint\n );\n segmentCallback(prevCurveX, prevCurveY, tempPoint.x, tempPoint.y);\n prevCurveX = tempPoint.x;\n prevCurveY = tempPoint.y;\n }\n break\n }\n case 'C': {\n var prevCurveX$1 = startX;\n var prevCurveY$1 = startY;\n for (var i$1 = 1; i$1 < curvePoints; i$1++) {\n pointOnCubicBezier(\n startX, startY,\n ctrl1X, ctrl1Y,\n ctrl2X, ctrl2Y,\n endX, endY,\n i$1 / (curvePoints - 1),\n tempPoint\n );\n segmentCallback(prevCurveX$1, prevCurveY$1, tempPoint.x, tempPoint.y);\n prevCurveX$1 = tempPoint.x;\n prevCurveY$1 = tempPoint.y;\n }\n break\n }\n }\n });\n }\n\n var viewportQuadVertex = \"precision highp float;attribute vec2 aUV;varying vec2 vUV;void main(){vUV=aUV;gl_Position=vec4(mix(vec2(-1.0),vec2(1.0),aUV),0.0,1.0);}\";\n\n var copyTexFragment = \"precision highp float;uniform sampler2D tex;varying vec2 vUV;void main(){gl_FragColor=texture2D(tex,vUV);}\";\n\n var cache = new WeakMap();\n\n var glContextParams = {\n premultipliedAlpha: false,\n preserveDrawingBuffer: true,\n antialias: false,\n depth: false,\n };\n\n /**\n * This is a little helper library for WebGL. It assists with state management for a GL context.\n * It's pretty tightly wrapped to the needs of this package, not very general-purpose.\n *\n * @param { WebGLRenderingContext | HTMLCanvasElement | OffscreenCanvas } glOrCanvas - the GL context to wrap\n * @param { ({gl, getExtension, withProgram, withTexture, withTextureFramebuffer, handleContextLoss}) => void } callback\n */\n function withWebGLContext (glOrCanvas, callback) {\n var gl = glOrCanvas.getContext ? glOrCanvas.getContext('webgl', glContextParams) : glOrCanvas;\n var wrapper = cache.get(gl);\n if (!wrapper) {\n var isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext;\n var extensions = {};\n var programs = {};\n var textures = {};\n var textureUnit = -1;\n var framebufferStack = [];\n\n gl.canvas.addEventListener('webglcontextlost', function (e) {\n handleContextLoss();\n e.preventDefault();\n }, false);\n\n function getExtension (name) {\n var ext = extensions[name];\n if (!ext) {\n ext = extensions[name] = gl.getExtension(name);\n if (!ext) {\n throw new Error((name + \" not supported\"))\n }\n }\n return ext\n }\n\n function compileShader (src, type) {\n var shader = gl.createShader(type);\n gl.shaderSource(shader, src);\n gl.compileShader(shader);\n // const status = gl.getShaderParameter(shader, gl.COMPILE_STATUS)\n // if (!status && !gl.isContextLost()) {\n // throw new Error(gl.getShaderInfoLog(shader).trim())\n // }\n return shader\n }\n\n function withProgram (name, vert, frag, func) {\n if (!programs[name]) {\n var attributes = {};\n var uniforms = {};\n var program = gl.createProgram();\n gl.attachShader(program, compileShader(vert, gl.VERTEX_SHADER));\n gl.attachShader(program, compileShader(frag, gl.FRAGMENT_SHADER));\n gl.linkProgram(program);\n\n programs[name] = {\n program: program,\n transaction: function transaction (func) {\n gl.useProgram(program);\n func({\n setUniform: function setUniform (type, name) {\n var values = [], len = arguments.length - 2;\n while ( len-- > 0 ) values[ len ] = arguments[ len + 2 ];\n\n var uniformLoc = uniforms[name] || (uniforms[name] = gl.getUniformLocation(program, name));\n gl[(\"uniform\" + type)].apply(gl, [ uniformLoc ].concat( values ));\n },\n\n setAttribute: function setAttribute (name, size, usage, instancingDivisor, data) {\n var attr = attributes[name];\n if (!attr) {\n attr = attributes[name] = {\n buf: gl.createBuffer(), // TODO should we destroy our buffers?\n loc: gl.getAttribLocation(program, name),\n data: null\n };\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, attr.buf);\n gl.vertexAttribPointer(attr.loc, size, gl.FLOAT, false, 0, 0);\n gl.enableVertexAttribArray(attr.loc);\n if (isWebGL2) {\n gl.vertexAttribDivisor(attr.loc, instancingDivisor);\n } else {\n getExtension('ANGLE_instanced_arrays').vertexAttribDivisorANGLE(attr.loc, instancingDivisor);\n }\n if (data !== attr.data) {\n gl.bufferData(gl.ARRAY_BUFFER, data, usage);\n attr.data = data;\n }\n }\n });\n }\n };\n }\n\n programs[name].transaction(func);\n }\n\n function withTexture (name, func) {\n textureUnit++;\n try {\n gl.activeTexture(gl.TEXTURE0 + textureUnit);\n var texture = textures[name];\n if (!texture) {\n texture = textures[name] = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n }\n gl.bindTexture(gl.TEXTURE_2D, texture);\n func(texture, textureUnit);\n } finally {\n textureUnit--;\n }\n }\n\n function withTextureFramebuffer (texture, textureUnit, func) {\n var framebuffer = gl.createFramebuffer();\n framebufferStack.push(framebuffer);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.activeTexture(gl.TEXTURE0 + textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n try {\n func(framebuffer);\n } finally {\n gl.deleteFramebuffer(framebuffer);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferStack[--framebufferStack.length - 1] || null);\n }\n }\n\n function handleContextLoss () {\n extensions = {};\n programs = {};\n textures = {};\n textureUnit = -1;\n framebufferStack.length = 0;\n }\n\n cache.set(gl, wrapper = {\n gl: gl,\n isWebGL2: isWebGL2,\n getExtension: getExtension,\n withProgram: withProgram,\n withTexture: withTexture,\n withTextureFramebuffer: withTextureFramebuffer,\n handleContextLoss: handleContextLoss,\n });\n }\n callback(wrapper);\n }\n\n\n function renderImageData(glOrCanvas, imageData, x, y, width, height, channels, framebuffer) {\n if ( channels === void 0 ) channels = 15;\n if ( framebuffer === void 0 ) framebuffer = null;\n\n withWebGLContext(glOrCanvas, function (ref) {\n var gl = ref.gl;\n var withProgram = ref.withProgram;\n var withTexture = ref.withTexture;\n\n withTexture('copy', function (tex, texUnit) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, imageData);\n withProgram('copy', viewportQuadVertex, copyTexFragment, function (ref) {\n var setUniform = ref.setUniform;\n var setAttribute = ref.setAttribute;\n\n setAttribute('aUV', 2, gl.STATIC_DRAW, 0, new Float32Array([0, 0, 2, 0, 0, 2]));\n setUniform('1i', 'image', texUnit);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer || null);\n gl.disable(gl.BLEND);\n gl.colorMask(channels & 8, channels & 4, channels & 2, channels & 1);\n gl.viewport(x, y, width, height);\n gl.scissor(x, y, width, height);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n });\n });\n });\n }\n\n /**\n * Resizing a canvas clears its contents; this utility copies the previous contents over.\n * @param canvas\n * @param newWidth\n * @param newHeight\n */\n function resizeWebGLCanvasWithoutClearing(canvas, newWidth, newHeight) {\n var width = canvas.width;\n var height = canvas.height;\n withWebGLContext(canvas, function (ref) {\n var gl = ref.gl;\n\n var data = new Uint8Array(width * height * 4);\n gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);\n canvas.width = newWidth;\n canvas.height = newHeight;\n renderImageData(gl, data, 0, 0, width, height);\n });\n }\n\n var webglUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n withWebGLContext: withWebGLContext,\n renderImageData: renderImageData,\n resizeWebGLCanvasWithoutClearing: resizeWebGLCanvasWithoutClearing\n });\n\n function generate$2 (sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n\n var textureData = new Uint8Array(sdfWidth * sdfHeight);\n\n var viewBoxWidth = viewBox[2] - viewBox[0];\n var viewBoxHeight = viewBox[3] - viewBox[1];\n\n // Decompose all paths into straight line segments and add them to an index\n var segments = [];\n pathToLineSegments(path, function (x1, y1, x2, y2) {\n segments.push({\n x1: x1, y1: y1, x2: x2, y2: y2,\n minX: Math.min(x1, x2),\n minY: Math.min(y1, y2),\n maxX: Math.max(x1, x2),\n maxY: Math.max(y1, y2)\n });\n });\n\n // Sort segments by maxX, this will let us short-circuit some loops below\n segments.sort(function (a, b) { return a.maxX - b.maxX; });\n\n // For each target SDF texel, find the distance from its center to its nearest line segment,\n // map that distance to an alpha value, and write that alpha to the texel\n for (var sdfX = 0; sdfX < sdfWidth; sdfX++) {\n for (var sdfY = 0; sdfY < sdfHeight; sdfY++) {\n var signedDist = findNearestSignedDistance(\n viewBox[0] + viewBoxWidth * (sdfX + 0.5) / sdfWidth,\n viewBox[1] + viewBoxHeight * (sdfY + 0.5) / sdfHeight\n );\n\n // Use an exponential scale to ensure the texels very near the glyph path have adequate\n // precision, while allowing the distance field to cover the entire texture, given that\n // there are only 8 bits available. Formula visualized: https://www.desmos.com/calculator/uiaq5aqiam\n var alpha = Math.pow((1 - Math.abs(signedDist) / maxDistance), sdfExponent) / 2;\n if (signedDist < 0) {\n alpha = 1 - alpha;\n }\n\n alpha = Math.max(0, Math.min(255, Math.round(alpha * 255))); //clamp\n textureData[sdfY * sdfWidth + sdfX] = alpha;\n }\n }\n\n return textureData\n\n /**\n * For a given x/y, search the index for the closest line segment and return\n * its signed distance. Negative = inside, positive = outside, zero = on edge\n * @param x\n * @param y\n * @returns {number}\n */\n function findNearestSignedDistance (x, y) {\n var closestDistSq = Infinity;\n var closestDist = Infinity;\n\n for (var i = segments.length; i--;) {\n var seg = segments[i];\n if (seg.maxX + closestDist <= x) { break } //sorting by maxX means no more can be closer, so we can short-circuit\n if (x + closestDist > seg.minX && y - closestDist < seg.maxY && y + closestDist > seg.minY) {\n var distSq = absSquareDistanceToLineSegment(x, y, seg.x1, seg.y1, seg.x2, seg.y2);\n if (distSq < closestDistSq) {\n closestDistSq = distSq;\n closestDist = Math.sqrt(closestDistSq);\n }\n }\n }\n\n // Flip to negative distance if inside the poly\n if (isPointInPoly(x, y)) {\n closestDist = -closestDist;\n }\n return closestDist\n }\n\n /**\n * Determine whether the given point lies inside or outside the glyph. Uses a simple\n * winding-number ray casting algorithm using a ray pointing east from the point.\n */\n function isPointInPoly (x, y) {\n var winding = 0;\n for (var i = segments.length; i--;) {\n var seg = segments[i];\n if (seg.maxX <= x) { break } //sorting by maxX means no more can cross, so we can short-circuit\n var intersects = ((seg.y1 > y) !== (seg.y2 > y)) && (x < (seg.x2 - seg.x1) * (y - seg.y1) / (seg.y2 - seg.y1) + seg.x1);\n if (intersects) {\n winding += seg.y1 < seg.y2 ? 1 : -1;\n }\n }\n return winding !== 0\n }\n }\n\n function generateIntoCanvas$2(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, canvas, x, y, channel) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n generateIntoFramebuffer$1(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, canvas, null, x, y, channel);\n }\n\n function generateIntoFramebuffer$1 (sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, glOrCanvas, framebuffer, x, y, channel) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n var data = generate$2(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent);\n // Expand single-channel data to rbga\n var rgbaData = new Uint8Array(data.length * 4);\n for (var i = 0; i < data.length; i++) {\n rgbaData[i * 4 + channel] = data[i];\n }\n renderImageData(glOrCanvas, rgbaData, x, y, sdfWidth, sdfHeight, 1 << (3 - channel), framebuffer);\n }\n\n /**\n * Find the absolute distance from a point to a line segment at closest approach\n */\n function absSquareDistanceToLineSegment (x, y, lineX0, lineY0, lineX1, lineY1) {\n var ldx = lineX1 - lineX0;\n var ldy = lineY1 - lineY0;\n var lengthSq = ldx * ldx + ldy * ldy;\n var t = lengthSq ? Math.max(0, Math.min(1, ((x - lineX0) * ldx + (y - lineY0) * ldy) / lengthSq)) : 0;\n var dx = x - (lineX0 + t * ldx);\n var dy = y - (lineY0 + t * ldy);\n return dx * dx + dy * dy\n }\n\n var javascript = /*#__PURE__*/Object.freeze({\n __proto__: null,\n generate: generate$2,\n generateIntoCanvas: generateIntoCanvas$2,\n generateIntoFramebuffer: generateIntoFramebuffer$1\n });\n\n var mainVertex = \"precision highp float;uniform vec4 uGlyphBounds;attribute vec2 aUV;attribute vec4 aLineSegment;varying vec4 vLineSegment;varying vec2 vGlyphXY;void main(){vLineSegment=aLineSegment;vGlyphXY=mix(uGlyphBounds.xy,uGlyphBounds.zw,aUV);gl_Position=vec4(mix(vec2(-1.0),vec2(1.0),aUV),0.0,1.0);}\";\n\n var mainFragment = \"precision highp float;uniform vec4 uGlyphBounds;uniform float uMaxDistance;uniform float uExponent;varying vec4 vLineSegment;varying vec2 vGlyphXY;float absDistToSegment(vec2 point,vec2 lineA,vec2 lineB){vec2 lineDir=lineB-lineA;float lenSq=dot(lineDir,lineDir);float t=lenSq==0.0 ? 0.0 : clamp(dot(point-lineA,lineDir)/lenSq,0.0,1.0);vec2 linePt=lineA+t*lineDir;return distance(point,linePt);}void main(){vec4 seg=vLineSegment;vec2 p=vGlyphXY;float dist=absDistToSegment(p,seg.xy,seg.zw);float val=pow(1.0-clamp(dist/uMaxDistance,0.0,1.0),uExponent)*0.5;bool crossing=(seg.y>p.y!=seg.w>p.y)&&(p.x<(seg.z-seg.x)*(p.y-seg.y)/(seg.w-seg.y)+seg.x);bool crossingUp=crossing&&vLineSegment.y bool\n\n function validateSupport (glOrCanvas) {\n if (!isTestingSupport && !isSupported(glOrCanvas)) {\n throw new Error('WebGL generation not supported')\n }\n }\n\n function generate$1 (sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, glOrCanvas) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( glOrCanvas === void 0 ) glOrCanvas = null;\n\n if (!glOrCanvas) {\n glOrCanvas = implicitContext;\n if (!glOrCanvas) {\n var canvas = typeof OffscreenCanvas === 'function'\n ? new OffscreenCanvas(1, 1)\n : typeof document !== 'undefined'\n ? document.createElement('canvas')\n : null;\n if (!canvas) {\n throw new Error('OffscreenCanvas or DOM canvas not supported')\n }\n glOrCanvas = implicitContext = canvas.getContext('webgl', { depth: false });\n }\n }\n\n validateSupport(glOrCanvas);\n\n var rgbaData = new Uint8Array(sdfWidth * sdfHeight * 4); //not Uint8ClampedArray, cuz Safari\n\n // Render into a background texture framebuffer\n withWebGLContext(glOrCanvas, function (ref) {\n var gl = ref.gl;\n var withTexture = ref.withTexture;\n var withTextureFramebuffer = ref.withTextureFramebuffer;\n\n withTexture('readable', function (texture, textureUnit) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, sdfWidth, sdfHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n\n withTextureFramebuffer(texture, textureUnit, function (framebuffer) {\n generateIntoFramebuffer(\n sdfWidth,\n sdfHeight,\n path,\n viewBox,\n maxDistance,\n sdfExponent,\n gl,\n framebuffer,\n 0,\n 0,\n 0 // red channel\n );\n gl.readPixels(0, 0, sdfWidth, sdfHeight, gl.RGBA, gl.UNSIGNED_BYTE, rgbaData);\n });\n });\n });\n\n // Throw away all but the red channel\n var data = new Uint8Array(sdfWidth * sdfHeight);\n for (var i = 0, j = 0; i < rgbaData.length; i += 4) {\n data[j++] = rgbaData[i];\n }\n\n return data\n }\n\n function generateIntoCanvas$1(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, canvas, x, y, channel) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n generateIntoFramebuffer(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, canvas, null, x, y, channel);\n }\n\n function generateIntoFramebuffer (sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, glOrCanvas, framebuffer, x, y, channel) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n // Verify support\n validateSupport(glOrCanvas);\n\n // Compute path segments\n var lineSegmentCoords = [];\n pathToLineSegments(path, function (x1, y1, x2, y2) {\n lineSegmentCoords.push(x1, y1, x2, y2);\n });\n lineSegmentCoords = new Float32Array(lineSegmentCoords);\n\n withWebGLContext(glOrCanvas, function (ref) {\n var gl = ref.gl;\n var isWebGL2 = ref.isWebGL2;\n var getExtension = ref.getExtension;\n var withProgram = ref.withProgram;\n var withTexture = ref.withTexture;\n var withTextureFramebuffer = ref.withTextureFramebuffer;\n var handleContextLoss = ref.handleContextLoss;\n\n withTexture('rawDistances', function (intermediateTexture, intermediateTextureUnit) {\n if (sdfWidth !== intermediateTexture._lastWidth || sdfHeight !== intermediateTexture._lastHeight) {\n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.RGBA,\n intermediateTexture._lastWidth = sdfWidth,\n intermediateTexture._lastHeight = sdfHeight,\n 0, gl.RGBA, gl.UNSIGNED_BYTE, null\n );\n }\n\n // Unsigned distance pass\n withProgram('main', mainVertex, mainFragment, function (ref) {\n var setAttribute = ref.setAttribute;\n var setUniform = ref.setUniform;\n\n // Init extensions\n var instancingExtension = !isWebGL2 && getExtension('ANGLE_instanced_arrays');\n var blendMinMaxExtension = !isWebGL2 && getExtension('EXT_blend_minmax');\n\n // Init/update attributes\n setAttribute('aUV', 2, gl.STATIC_DRAW, 0, viewportUVs);\n setAttribute('aLineSegment', 4, gl.DYNAMIC_DRAW, 1, lineSegmentCoords);\n\n // Init/update uniforms\n setUniform.apply(void 0, [ '4f', 'uGlyphBounds' ].concat( viewBox ));\n setUniform('1f', 'uMaxDistance', maxDistance);\n setUniform('1f', 'uExponent', sdfExponent);\n\n // Render initial unsigned distance / winding number info to a texture\n withTextureFramebuffer(intermediateTexture, intermediateTextureUnit, function (framebuffer) {\n gl.enable(gl.BLEND);\n gl.colorMask(true, true, true, true);\n gl.viewport(0, 0, sdfWidth, sdfHeight);\n gl.scissor(0, 0, sdfWidth, sdfHeight);\n gl.blendFunc(gl.ONE, gl.ONE);\n // Red+Green channels are incremented (FUNC_ADD) for segment-ray crossings to give a \"winding number\".\n // Alpha holds the closest (MAX) unsigned distance.\n gl.blendEquationSeparate(gl.FUNC_ADD, isWebGL2 ? gl.MAX : blendMinMaxExtension.MAX_EXT);\n gl.clear(gl.COLOR_BUFFER_BIT);\n if (isWebGL2) {\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 3, lineSegmentCoords.length / 4);\n } else {\n instancingExtension.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 3, lineSegmentCoords.length / 4);\n }\n // Debug\n // const debug = new Uint8Array(sdfWidth * sdfHeight * 4)\n // gl.readPixels(0, 0, sdfWidth, sdfHeight, gl.RGBA, gl.UNSIGNED_BYTE, debug)\n // console.log('intermediate texture data: ', debug)\n });\n });\n\n // Use the data stored in the texture to apply inside/outside and write to the output framebuffer rect+channel.\n withProgram('post', viewportQuadVertex, postFragment, function (program) {\n program.setAttribute('aUV', 2, gl.STATIC_DRAW, 0, viewportUVs);\n program.setUniform('1i', 'tex', intermediateTextureUnit);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.disable(gl.BLEND);\n gl.colorMask(channel === 0, channel === 1, channel === 2, channel === 3);\n gl.viewport(x, y, sdfWidth, sdfHeight);\n gl.scissor(x, y, sdfWidth, sdfHeight);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n });\n });\n\n // Handle context loss occurring during any of the above calls\n if (gl.isContextLost()) {\n handleContextLoss();\n throw new Error('webgl context lost')\n }\n });\n }\n\n function isSupported (glOrCanvas) {\n var key = (!glOrCanvas || glOrCanvas === implicitContext) ? NULL_OBJECT : (glOrCanvas.canvas || glOrCanvas);\n var supported = supportByCanvas.get(key);\n if (supported === undefined) {\n isTestingSupport = true;\n var failReason = null;\n try {\n // Since we can't detect all failure modes up front, let's just do a trial run of a\n // simple path and compare what we get back to the correct expected result. This will\n // also serve to prime the shader compilation.\n var expectedResult = [\n 97, 106, 97, 61,\n 99, 137, 118, 80,\n 80, 118, 137, 99,\n 61, 97, 106, 97\n ];\n var testResult = generate$1(\n 4,\n 4,\n 'M8,8L16,8L24,24L16,24Z',\n [0, 0, 32, 32],\n 24,\n 1,\n glOrCanvas\n );\n supported = testResult && expectedResult.length === testResult.length &&\n testResult.every(function (val, i) { return val === expectedResult[i]; });\n if (!supported) {\n failReason = 'bad trial run results';\n console.info(expectedResult, testResult);\n }\n } catch (err) {\n // TODO if it threw due to webgl context loss, should we maybe leave isSupported as null and try again later?\n supported = false;\n failReason = err.message;\n }\n if (failReason) {\n console.warn('WebGL SDF generation not supported:', failReason);\n }\n isTestingSupport = false;\n supportByCanvas.set(key, supported);\n }\n return supported\n }\n\n var webgl = /*#__PURE__*/Object.freeze({\n __proto__: null,\n generate: generate$1,\n generateIntoCanvas: generateIntoCanvas$1,\n generateIntoFramebuffer: generateIntoFramebuffer,\n isSupported: isSupported\n });\n\n /**\n * Generate an SDF texture image for a 2D path.\n *\n * @param {number} sdfWidth - width of the SDF output image in pixels.\n * @param {number} sdfHeight - height of the SDF output image in pixels.\n * @param {string} path - an SVG-like path string describing the glyph; should only contain commands: M/L/Q/C/Z.\n * @param {number[]} viewBox - [minX, minY, maxX, maxY] in font units aligning with the texture's edges.\n * @param {number} maxDistance - the maximum distance from the glyph path in font units that will be encoded; defaults\n * to half the maximum viewBox dimension.\n * @param {number} [sdfExponent] - specifies an exponent for encoding the SDF's distance values; higher exponents\n * will give greater precision nearer the glyph's path.\n * @return {Uint8Array}\n */\n function generate(\n sdfWidth,\n sdfHeight,\n path,\n viewBox,\n maxDistance,\n sdfExponent\n ) {\n if ( maxDistance === void 0 ) maxDistance = Math.max(viewBox[2] - viewBox[0], viewBox[3] - viewBox[1]) / 2;\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n\n try {\n return generate$1.apply(webgl, arguments)\n } catch(e) {\n console.info('WebGL SDF generation failed, falling back to JS', e);\n return generate$2.apply(javascript, arguments)\n }\n }\n\n /**\n * Generate an SDF texture image for a 2D path, inserting the result into a WebGL `canvas` at a given x/y position\n * and color channel. This is generally much faster than calling `generate` because it does not require reading pixels\n * back from the GPU->CPU -- the `canvas` can be used directly as a WebGL texture image, so it all stays on the GPU.\n *\n * @param {number} sdfWidth - width of the SDF output image in pixels.\n * @param {number} sdfHeight - height of the SDF output image in pixels.\n * @param {string} path - an SVG-like path string describing the glyph; should only contain commands: M/L/Q/C/Z.\n * @param {number[]} viewBox - [minX, minY, maxX, maxY] in font units aligning with the texture's edges.\n * @param {number} maxDistance - the maximum distance from the glyph path in font units that will be encoded; defaults\n * to half the maximum viewBox dimension.\n * @param {number} [sdfExponent] - specifies an exponent for encoding the SDF's distance values; higher exponents\n * will give greater precision nearer the glyph's path.\n * @param {HTMLCanvasElement|OffscreenCanvas} canvas - a WebGL-enabled canvas into which the SDF will be rendered.\n * Only the relevant rect/channel will be modified, the rest will be preserved. To avoid unpredictable results\n * due to shared GL context state, this canvas should be dedicated to use by this library alone.\n * @param {number} x - the x position at which to render the SDF.\n * @param {number} y - the y position at which to render the SDF.\n * @param {number} channel - the color channel index (0-4) into which the SDF will be rendered.\n * @return {Uint8Array}\n */\n function generateIntoCanvas(\n sdfWidth,\n sdfHeight,\n path,\n viewBox,\n maxDistance,\n sdfExponent,\n canvas,\n x,\n y,\n channel\n ) {\n if ( maxDistance === void 0 ) maxDistance = Math.max(viewBox[2] - viewBox[0], viewBox[3] - viewBox[1]) / 2;\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n try {\n return generateIntoCanvas$1.apply(webgl, arguments)\n } catch(e) {\n console.info('WebGL SDF generation failed, falling back to JS', e);\n return generateIntoCanvas$2.apply(javascript, arguments)\n }\n }\n\n exports.forEachPathCommand = forEachPathCommand;\n exports.generate = generate;\n exports.generateIntoCanvas = generateIntoCanvas;\n exports.javascript = javascript;\n exports.pathToLineSegments = pathToLineSegments;\n exports.webgl = webgl;\n exports.webglUtils = webglUtils;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n return exports;\n\n}({}));\nreturn exports\n}\n\nexport { SDFGenerator as default };\n","function bidiFactory() {\nvar bidi = (function (exports) {\n\n // Bidi character types data, auto generated\n var DATA = {\n \"R\": \"13k,1a,2,3,3,2+1j,ch+16,a+1,5+2,2+n,5,a,4,6+16,4+3,h+1b,4mo,179q,2+9,2+11,2i9+7y,2+68,4,3+4,5+13,4+3,2+4k,3+29,8+cf,1t+7z,w+17,3+3m,1t+3z,16o1+5r,8+30,8+mc,29+1r,29+4v,75+73\",\n \"EN\": \"1c+9,3d+1,6,187+9,513,4+5,7+9,sf+j,175h+9,qw+q,161f+1d,4xt+a,25i+9\",\n \"ES\": \"17,2,6dp+1,f+1,av,16vr,mx+1,4o,2\",\n \"ET\": \"z+2,3h+3,b+1,ym,3e+1,2o,p4+1,8,6u,7c,g6,1wc,1n9+4,30+1b,2n,6d,qhx+1,h0m,a+1,49+2,63+1,4+1,6bb+3,12jj\",\n \"AN\": \"16o+5,2j+9,2+1,35,ed,1ff2+9,87+u\",\n \"CS\": \"18,2+1,b,2u,12k,55v,l,17v0,2,3,53,2+1,b\",\n \"B\": \"a,3,f+2,2v,690\",\n \"S\": \"9,2,k\",\n \"WS\": \"c,k,4f4,1vk+a,u,1j,335\",\n \"ON\": \"x+1,4+4,h+5,r+5,r+3,z,5+3,2+1,2+1,5,2+2,3+4,o,w,ci+1,8+d,3+d,6+8,2+g,39+1,9,6+1,2,33,b8,3+1,3c+1,7+1,5r,b,7h+3,sa+5,2,3i+6,jg+3,ur+9,2v,ij+1,9g+9,7+a,8m,4+1,49+x,14u,2+2,c+2,e+2,e+2,e+1,i+n,e+e,2+p,u+2,e+2,36+1,2+3,2+1,b,2+2,6+5,2,2,2,h+1,5+4,6+3,3+f,16+2,5+3l,3+81,1y+p,2+40,q+a,m+13,2r+ch,2+9e,75+hf,3+v,2+2w,6e+5,f+6,75+2a,1a+p,2+2g,d+5x,r+b,6+3,4+o,g,6+1,6+2,2k+1,4,2j,5h+z,1m+1,1e+f,t+2,1f+e,d+3,4o+3,2s+1,w,535+1r,h3l+1i,93+2,2s,b+1,3l+x,2v,4g+3,21+3,kz+1,g5v+1,5a,j+9,n+v,2,3,2+8,2+1,3+2,2,3,46+1,4+4,h+5,r+5,r+a,3h+2,4+6,b+4,78,1r+24,4+c,4,1hb,ey+6,103+j,16j+c,1ux+7,5+g,fsh,jdq+1t,4,57+2e,p1,1m,1m,1m,1m,4kt+1,7j+17,5+2r,d+e,3+e,2+e,2+10,m+4,w,1n+5,1q,4z+5,4b+rb,9+c,4+c,4+37,d+2g,8+b,l+b,5+1j,9+9,7+13,9+t,3+1,27+3c,2+29,2+3q,d+d,3+4,4+2,6+6,a+o,8+6,a+2,e+6,16+42,2+1i\",\n \"BN\": \"0+8,6+d,2s+5,2+p,e,4m9,1kt+2,2b+5,5+5,17q9+v,7k,6p+8,6+1,119d+3,440+7,96s+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+75,6p+2rz,1ben+1,1ekf+1,1ekf+1\",\n \"NSM\": \"lc+33,7o+6,7c+18,2,2+1,2+1,2,21+a,1d+k,h,2u+6,3+5,3+1,2+3,10,v+q,2k+a,1n+8,a,p+3,2+8,2+2,2+4,18+2,3c+e,2+v,1k,2,5+7,5,4+6,b+1,u,1n,5+3,9,l+1,r,3+1,1m,5+1,5+1,3+2,4,v+1,4,c+1,1m,5+4,2+1,5,l+1,n+5,2,1n,3,2+3,9,8+1,c+1,v,1q,d,1f,4,1m+2,6+2,2+3,8+1,c+1,u,1n,g+1,l+1,t+1,1m+1,5+3,9,l+1,u,21,8+2,2,2j,3+6,d+7,2r,3+8,c+5,23+1,s,2,2,1k+d,2+4,2+1,6+a,2+z,a,2v+3,2+5,2+1,3+1,q+1,5+2,h+3,e,3+1,7,g,jk+2,qb+2,u+2,u+1,v+1,1t+1,2+6,9,3+a,a,1a+2,3c+1,z,3b+2,5+1,a,7+2,64+1,3,1n,2+6,2,2,3+7,7+9,3,1d+g,1s+3,1d,2+4,2,6,15+8,d+1,x+3,3+1,2+2,1l,2+1,4,2+2,1n+7,3+1,49+2,2+c,2+6,5,7,4+1,5j+1l,2+4,k1+w,2db+2,3y,2p+v,ff+3,30+1,n9x+3,2+9,x+1,29+1,7l,4,5,q+1,6,48+1,r+h,e,13+7,q+a,1b+2,1d,3+3,3+1,14,1w+5,3+1,3+1,d,9,1c,1g,2+2,3+1,6+1,2,17+1,9,6n,3,5,fn5,ki+f,h+f,r2,6b,46+4,1af+2,2+1,6+3,15+2,5,4m+1,fy+3,as+1,4a+a,4x,1j+e,1l+2,1e+3,3+1,1y+2,11+4,2+7,1r,d+1,1h+8,b+3,3,2o+2,3,2+1,7,4h,4+7,m+1,1m+1,4,12+6,4+4,5g+7,3+2,2,o,2d+5,2,5+1,2+1,6n+3,7+1,2+1,s+1,2e+7,3,2+1,2z,2,3+5,2,2u+2,3+3,2+4,78+8,2+1,75+1,2,5,41+3,3+1,5,x+5,3+1,15+5,3+3,9,a+5,3+2,1b+c,2+1,bb+6,2+5,2d+l,3+6,2+1,2+1,3f+5,4,2+1,2+6,2,21+1,4,2,9o+1,f0c+4,1o+6,t5,1s+3,2a,f5l+1,43t+2,i+7,3+6,v+3,45+2,1j0+1i,5+1d,9,f,n+4,2+e,11t+6,2+g,3+6,2+1,2+4,7a+6,c6+3,15t+6,32+6,gzhy+6n\",\n \"AL\": \"16w,3,2,e+1b,z+2,2+2s,g+1,8+1,b+m,2+t,s+2i,c+e,4h+f,1d+1e,1bwe+dp,3+3z,x+c,2+1,35+3y,2rm+z,5+7,b+5,dt+l,c+u,17nl+27,1t+27,4x+6n,3+d\",\n \"LRO\": \"6ct\",\n \"RLO\": \"6cu\",\n \"LRE\": \"6cq\",\n \"RLE\": \"6cr\",\n \"PDF\": \"6cs\",\n \"LRI\": \"6ee\",\n \"RLI\": \"6ef\",\n \"FSI\": \"6eg\",\n \"PDI\": \"6eh\"\n };\n\n var TYPES = {};\n var TYPES_TO_NAMES = {};\n TYPES.L = 1; //L is the default\n TYPES_TO_NAMES[1] = 'L';\n Object.keys(DATA).forEach(function (type, i) {\n TYPES[type] = 1 << (i + 1);\n TYPES_TO_NAMES[TYPES[type]] = type;\n });\n Object.freeze(TYPES);\n\n var ISOLATE_INIT_TYPES = TYPES.LRI | TYPES.RLI | TYPES.FSI;\n var STRONG_TYPES = TYPES.L | TYPES.R | TYPES.AL;\n var NEUTRAL_ISOLATE_TYPES = TYPES.B | TYPES.S | TYPES.WS | TYPES.ON | TYPES.FSI | TYPES.LRI | TYPES.RLI | TYPES.PDI;\n var BN_LIKE_TYPES = TYPES.BN | TYPES.RLE | TYPES.LRE | TYPES.RLO | TYPES.LRO | TYPES.PDF;\n var TRAILING_TYPES = TYPES.S | TYPES.WS | TYPES.B | ISOLATE_INIT_TYPES | TYPES.PDI | BN_LIKE_TYPES;\n\n var map = null;\n\n function parseData () {\n if (!map) {\n //const start = performance.now()\n map = new Map();\n var loop = function ( type ) {\n if (DATA.hasOwnProperty(type)) {\n var lastCode = 0;\n DATA[type].split(',').forEach(function (range) {\n var ref = range.split('+');\n var skip = ref[0];\n var step = ref[1];\n skip = parseInt(skip, 36);\n step = step ? parseInt(step, 36) : 0;\n map.set(lastCode += skip, TYPES[type]);\n for (var i = 0; i < step; i++) {\n map.set(++lastCode, TYPES[type]);\n }\n });\n }\n };\n\n for (var type in DATA) loop( type );\n //console.log(`char types parsed in ${performance.now() - start}ms`)\n }\n }\n\n /**\n * @param {string} char\n * @return {number}\n */\n function getBidiCharType (char) {\n parseData();\n return map.get(char.codePointAt(0)) || TYPES.L\n }\n\n function getBidiCharTypeName(char) {\n return TYPES_TO_NAMES[getBidiCharType(char)]\n }\n\n // Bidi bracket pairs data, auto generated\n var data$1 = {\n \"pairs\": \"14>1,1e>2,u>2,2wt>1,1>1,1ge>1,1wp>1,1j>1,f>1,hm>1,1>1,u>1,u6>1,1>1,+5,28>1,w>1,1>1,+3,b8>1,1>1,+3,1>3,-1>-1,3>1,1>1,+2,1s>1,1>1,x>1,th>1,1>1,+2,db>1,1>1,+3,3>1,1>1,+2,14qm>1,1>1,+1,4q>1,1e>2,u>2,2>1,+1\",\n \"canonical\": \"6f1>-6dx,6dy>-6dx,6ec>-6ed,6ee>-6ed,6ww>2jj,-2ji>2jj,14r4>-1e7l,1e7m>-1e7l,1e7m>-1e5c,1e5d>-1e5b,1e5c>-14qx,14qy>-14qx,14vn>-1ecg,1ech>-1ecg,1edu>-1ecg,1eci>-1ecg,1eda>-1ecg,1eci>-1ecg,1eci>-168q,168r>-168q,168s>-14ye,14yf>-14ye\"\n };\n\n /**\n * Parses an string that holds encoded codepoint mappings, e.g. for bracket pairs or\n * mirroring characters, as encoded by scripts/generateBidiData.js. Returns an object\n * holding the `map`, and optionally a `reverseMap` if `includeReverse:true`.\n * @param {string} encodedString\n * @param {boolean} includeReverse - true if you want reverseMap in the output\n * @return {{map: Map, reverseMap?: Map}}\n */\n function parseCharacterMap (encodedString, includeReverse) {\n var radix = 36;\n var lastCode = 0;\n var map = new Map();\n var reverseMap = includeReverse && new Map();\n var prevPair;\n encodedString.split(',').forEach(function visit(entry) {\n if (entry.indexOf('+') !== -1) {\n for (var i = +entry; i--;) {\n visit(prevPair);\n }\n } else {\n prevPair = entry;\n var ref = entry.split('>');\n var a = ref[0];\n var b = ref[1];\n a = String.fromCodePoint(lastCode += parseInt(a, radix));\n b = String.fromCodePoint(lastCode += parseInt(b, radix));\n map.set(a, b);\n includeReverse && reverseMap.set(b, a);\n }\n });\n return { map: map, reverseMap: reverseMap }\n }\n\n var openToClose, closeToOpen, canonical;\n\n function parse$1 () {\n if (!openToClose) {\n //const start = performance.now()\n var ref = parseCharacterMap(data$1.pairs, true);\n var map = ref.map;\n var reverseMap = ref.reverseMap;\n openToClose = map;\n closeToOpen = reverseMap;\n canonical = parseCharacterMap(data$1.canonical, false).map;\n //console.log(`brackets parsed in ${performance.now() - start}ms`)\n }\n }\n\n function openingToClosingBracket (char) {\n parse$1();\n return openToClose.get(char) || null\n }\n\n function closingToOpeningBracket (char) {\n parse$1();\n return closeToOpen.get(char) || null\n }\n\n function getCanonicalBracket (char) {\n parse$1();\n return canonical.get(char) || null\n }\n\n // Local type aliases\n var TYPE_L = TYPES.L;\n var TYPE_R = TYPES.R;\n var TYPE_EN = TYPES.EN;\n var TYPE_ES = TYPES.ES;\n var TYPE_ET = TYPES.ET;\n var TYPE_AN = TYPES.AN;\n var TYPE_CS = TYPES.CS;\n var TYPE_B = TYPES.B;\n var TYPE_S = TYPES.S;\n var TYPE_ON = TYPES.ON;\n var TYPE_BN = TYPES.BN;\n var TYPE_NSM = TYPES.NSM;\n var TYPE_AL = TYPES.AL;\n var TYPE_LRO = TYPES.LRO;\n var TYPE_RLO = TYPES.RLO;\n var TYPE_LRE = TYPES.LRE;\n var TYPE_RLE = TYPES.RLE;\n var TYPE_PDF = TYPES.PDF;\n var TYPE_LRI = TYPES.LRI;\n var TYPE_RLI = TYPES.RLI;\n var TYPE_FSI = TYPES.FSI;\n var TYPE_PDI = TYPES.PDI;\n\n /**\n * @typedef {object} GetEmbeddingLevelsResult\n * @property {{start, end, level}[]} paragraphs\n * @property {Uint8Array} levels\n */\n\n /**\n * This function applies the Bidirectional Algorithm to a string, returning the resolved embedding levels\n * in a single Uint8Array plus a list of objects holding each paragraph's start and end indices and resolved\n * base embedding level.\n *\n * @param {string} string - The input string\n * @param {\"ltr\"|\"rtl\"|\"auto\"} [baseDirection] - Use \"ltr\" or \"rtl\" to force a base paragraph direction,\n * otherwise a direction will be chosen automatically from each paragraph's contents.\n * @return {GetEmbeddingLevelsResult}\n */\n function getEmbeddingLevels (string, baseDirection) {\n var MAX_DEPTH = 125;\n\n // Start by mapping all characters to their unicode type, as a bitmask integer\n var charTypes = new Uint32Array(string.length);\n for (var i = 0; i < string.length; i++) {\n charTypes[i] = getBidiCharType(string[i]);\n }\n\n var charTypeCounts = new Map(); //will be cleared at start of each paragraph\n function changeCharType(i, type) {\n var oldType = charTypes[i];\n charTypes[i] = type;\n charTypeCounts.set(oldType, charTypeCounts.get(oldType) - 1);\n if (oldType & NEUTRAL_ISOLATE_TYPES) {\n charTypeCounts.set(NEUTRAL_ISOLATE_TYPES, charTypeCounts.get(NEUTRAL_ISOLATE_TYPES) - 1);\n }\n charTypeCounts.set(type, (charTypeCounts.get(type) || 0) + 1);\n if (type & NEUTRAL_ISOLATE_TYPES) {\n charTypeCounts.set(NEUTRAL_ISOLATE_TYPES, (charTypeCounts.get(NEUTRAL_ISOLATE_TYPES) || 0) + 1);\n }\n }\n\n var embedLevels = new Uint8Array(string.length);\n var isolationPairs = new Map(); //init->pdi and pdi->init\n\n // === 3.3.1 The Paragraph Level ===\n // 3.3.1 P1: Split the text into paragraphs\n var paragraphs = []; // [{start, end, level}, ...]\n var paragraph = null;\n for (var i$1 = 0; i$1 < string.length; i$1++) {\n if (!paragraph) {\n paragraphs.push(paragraph = {\n start: i$1,\n end: string.length - 1,\n // 3.3.1 P2-P3: Determine the paragraph level\n level: baseDirection === 'rtl' ? 1 : baseDirection === 'ltr' ? 0 : determineAutoEmbedLevel(i$1, false)\n });\n }\n if (charTypes[i$1] & TYPE_B) {\n paragraph.end = i$1;\n paragraph = null;\n }\n }\n\n var FORMATTING_TYPES = TYPE_RLE | TYPE_LRE | TYPE_RLO | TYPE_LRO | ISOLATE_INIT_TYPES | TYPE_PDI | TYPE_PDF | TYPE_B;\n var nextEven = function (n) { return n + ((n & 1) ? 1 : 2); };\n var nextOdd = function (n) { return n + ((n & 1) ? 2 : 1); };\n\n // Everything from here on will operate per paragraph.\n for (var paraIdx = 0; paraIdx < paragraphs.length; paraIdx++) {\n paragraph = paragraphs[paraIdx];\n var statusStack = [{\n _level: paragraph.level,\n _override: 0, //0=neutral, 1=L, 2=R\n _isolate: 0 //bool\n }];\n var stackTop = (void 0);\n var overflowIsolateCount = 0;\n var overflowEmbeddingCount = 0;\n var validIsolateCount = 0;\n charTypeCounts.clear();\n\n // === 3.3.2 Explicit Levels and Directions ===\n for (var i$2 = paragraph.start; i$2 <= paragraph.end; i$2++) {\n var charType = charTypes[i$2];\n stackTop = statusStack[statusStack.length - 1];\n\n // Set initial counts\n charTypeCounts.set(charType, (charTypeCounts.get(charType) || 0) + 1);\n if (charType & NEUTRAL_ISOLATE_TYPES) {\n charTypeCounts.set(NEUTRAL_ISOLATE_TYPES, (charTypeCounts.get(NEUTRAL_ISOLATE_TYPES) || 0) + 1);\n }\n\n // Explicit Embeddings: 3.3.2 X2 - X3\n if (charType & FORMATTING_TYPES) { //prefilter all formatters\n if (charType & (TYPE_RLE | TYPE_LRE)) {\n embedLevels[i$2] = stackTop._level; // 5.2\n var level = (charType === TYPE_RLE ? nextOdd : nextEven)(stackTop._level);\n if (level <= MAX_DEPTH && !overflowIsolateCount && !overflowEmbeddingCount) {\n statusStack.push({\n _level: level,\n _override: 0,\n _isolate: 0\n });\n } else if (!overflowIsolateCount) {\n overflowEmbeddingCount++;\n }\n }\n\n // Explicit Overrides: 3.3.2 X4 - X5\n else if (charType & (TYPE_RLO | TYPE_LRO)) {\n embedLevels[i$2] = stackTop._level; // 5.2\n var level$1 = (charType === TYPE_RLO ? nextOdd : nextEven)(stackTop._level);\n if (level$1 <= MAX_DEPTH && !overflowIsolateCount && !overflowEmbeddingCount) {\n statusStack.push({\n _level: level$1,\n _override: (charType & TYPE_RLO) ? TYPE_R : TYPE_L,\n _isolate: 0\n });\n } else if (!overflowIsolateCount) {\n overflowEmbeddingCount++;\n }\n }\n\n // Isolates: 3.3.2 X5a - X5c\n else if (charType & ISOLATE_INIT_TYPES) {\n // X5c - FSI becomes either RLI or LRI\n if (charType & TYPE_FSI) {\n charType = determineAutoEmbedLevel(i$2 + 1, true) === 1 ? TYPE_RLI : TYPE_LRI;\n }\n\n embedLevels[i$2] = stackTop._level;\n if (stackTop._override) {\n changeCharType(i$2, stackTop._override);\n }\n var level$2 = (charType === TYPE_RLI ? nextOdd : nextEven)(stackTop._level);\n if (level$2 <= MAX_DEPTH && overflowIsolateCount === 0 && overflowEmbeddingCount === 0) {\n validIsolateCount++;\n statusStack.push({\n _level: level$2,\n _override: 0,\n _isolate: 1,\n _isolInitIndex: i$2\n });\n } else {\n overflowIsolateCount++;\n }\n }\n\n // Terminating Isolates: 3.3.2 X6a\n else if (charType & TYPE_PDI) {\n if (overflowIsolateCount > 0) {\n overflowIsolateCount--;\n } else if (validIsolateCount > 0) {\n overflowEmbeddingCount = 0;\n while (!statusStack[statusStack.length - 1]._isolate) {\n statusStack.pop();\n }\n // Add to isolation pairs bidirectional mapping:\n var isolInitIndex = statusStack[statusStack.length - 1]._isolInitIndex;\n if (isolInitIndex != null) {\n isolationPairs.set(isolInitIndex, i$2);\n isolationPairs.set(i$2, isolInitIndex);\n }\n statusStack.pop();\n validIsolateCount--;\n }\n stackTop = statusStack[statusStack.length - 1];\n embedLevels[i$2] = stackTop._level;\n if (stackTop._override) {\n changeCharType(i$2, stackTop._override);\n }\n }\n\n\n // Terminating Embeddings and Overrides: 3.3.2 X7\n else if (charType & TYPE_PDF) {\n if (overflowIsolateCount === 0) {\n if (overflowEmbeddingCount > 0) {\n overflowEmbeddingCount--;\n } else if (!stackTop._isolate && statusStack.length > 1) {\n statusStack.pop();\n stackTop = statusStack[statusStack.length - 1];\n }\n }\n embedLevels[i$2] = stackTop._level; // 5.2\n }\n\n // End of Paragraph: 3.3.2 X8\n else if (charType & TYPE_B) {\n embedLevels[i$2] = paragraph.level;\n }\n }\n\n // Non-formatting characters: 3.3.2 X6\n else {\n embedLevels[i$2] = stackTop._level;\n // NOTE: This exclusion of BN seems to go against what section 5.2 says, but is required for test passage\n if (stackTop._override && charType !== TYPE_BN) {\n changeCharType(i$2, stackTop._override);\n }\n }\n }\n\n // === 3.3.3 Preparations for Implicit Processing ===\n\n // Remove all RLE, LRE, RLO, LRO, PDF, and BN characters: 3.3.3 X9\n // Note: Due to section 5.2, we won't remove them, but we'll use the BN_LIKE_TYPES bitset to\n // easily ignore them all from here on out.\n\n // 3.3.3 X10\n // Compute the set of isolating run sequences as specified by BD13\n var levelRuns = [];\n var currentRun = null;\n for (var i$3 = paragraph.start; i$3 <= paragraph.end; i$3++) {\n var charType$1 = charTypes[i$3];\n if (!(charType$1 & BN_LIKE_TYPES)) {\n var lvl = embedLevels[i$3];\n var isIsolInit = charType$1 & ISOLATE_INIT_TYPES;\n var isPDI = charType$1 === TYPE_PDI;\n if (currentRun && lvl === currentRun._level) {\n currentRun._end = i$3;\n currentRun._endsWithIsolInit = isIsolInit;\n } else {\n levelRuns.push(currentRun = {\n _start: i$3,\n _end: i$3,\n _level: lvl,\n _startsWithPDI: isPDI,\n _endsWithIsolInit: isIsolInit\n });\n }\n }\n }\n var isolatingRunSeqs = []; // [{seqIndices: [], sosType: L|R, eosType: L|R}]\n for (var runIdx = 0; runIdx < levelRuns.length; runIdx++) {\n var run = levelRuns[runIdx];\n if (!run._startsWithPDI || (run._startsWithPDI && !isolationPairs.has(run._start))) {\n var seqRuns = [currentRun = run];\n for (var pdiIndex = (void 0); currentRun && currentRun._endsWithIsolInit && (pdiIndex = isolationPairs.get(currentRun._end)) != null;) {\n for (var i$4 = runIdx + 1; i$4 < levelRuns.length; i$4++) {\n if (levelRuns[i$4]._start === pdiIndex) {\n seqRuns.push(currentRun = levelRuns[i$4]);\n break\n }\n }\n }\n // build flat list of indices across all runs:\n var seqIndices = [];\n for (var i$5 = 0; i$5 < seqRuns.length; i$5++) {\n var run$1 = seqRuns[i$5];\n for (var j = run$1._start; j <= run$1._end; j++) {\n seqIndices.push(j);\n }\n }\n // determine the sos/eos types:\n var firstLevel = embedLevels[seqIndices[0]];\n var prevLevel = paragraph.level;\n for (var i$6 = seqIndices[0] - 1; i$6 >= 0; i$6--) {\n if (!(charTypes[i$6] & BN_LIKE_TYPES)) { //5.2\n prevLevel = embedLevels[i$6];\n break\n }\n }\n var lastIndex = seqIndices[seqIndices.length - 1];\n var lastLevel = embedLevels[lastIndex];\n var nextLevel = paragraph.level;\n if (!(charTypes[lastIndex] & ISOLATE_INIT_TYPES)) {\n for (var i$7 = lastIndex + 1; i$7 <= paragraph.end; i$7++) {\n if (!(charTypes[i$7] & BN_LIKE_TYPES)) { //5.2\n nextLevel = embedLevels[i$7];\n break\n }\n }\n }\n isolatingRunSeqs.push({\n _seqIndices: seqIndices,\n _sosType: Math.max(prevLevel, firstLevel) % 2 ? TYPE_R : TYPE_L,\n _eosType: Math.max(nextLevel, lastLevel) % 2 ? TYPE_R : TYPE_L\n });\n }\n }\n\n // The next steps are done per isolating run sequence\n for (var seqIdx = 0; seqIdx < isolatingRunSeqs.length; seqIdx++) {\n var ref = isolatingRunSeqs[seqIdx];\n var seqIndices$1 = ref._seqIndices;\n var sosType = ref._sosType;\n var eosType = ref._eosType;\n /**\n * All the level runs in an isolating run sequence have the same embedding level.\n * \n * DO NOT change any `embedLevels[i]` within the current scope.\n */\n var embedDirection = ((embedLevels[seqIndices$1[0]]) & 1) ? TYPE_R : TYPE_L;\n\n // === 3.3.4 Resolving Weak Types ===\n\n // W1 + 5.2. Search backward from each NSM to the first character in the isolating run sequence whose\n // bidirectional type is not BN, and set the NSM to ON if it is an isolate initiator or PDI, and to its\n // type otherwise. If the NSM is the first non-BN character, change the NSM to the type of sos.\n if (charTypeCounts.get(TYPE_NSM)) {\n for (var si = 0; si < seqIndices$1.length; si++) {\n var i$8 = seqIndices$1[si];\n if (charTypes[i$8] & TYPE_NSM) {\n var prevType = sosType;\n for (var sj = si - 1; sj >= 0; sj--) {\n if (!(charTypes[seqIndices$1[sj]] & BN_LIKE_TYPES)) { //5.2 scan back to first non-BN\n prevType = charTypes[seqIndices$1[sj]];\n break\n }\n }\n changeCharType(i$8, (prevType & (ISOLATE_INIT_TYPES | TYPE_PDI)) ? TYPE_ON : prevType);\n }\n }\n }\n\n // W2. Search backward from each instance of a European number until the first strong type (R, L, AL, or sos)\n // is found. If an AL is found, change the type of the European number to Arabic number.\n if (charTypeCounts.get(TYPE_EN)) {\n for (var si$1 = 0; si$1 < seqIndices$1.length; si$1++) {\n var i$9 = seqIndices$1[si$1];\n if (charTypes[i$9] & TYPE_EN) {\n for (var sj$1 = si$1 - 1; sj$1 >= -1; sj$1--) {\n var prevCharType = sj$1 === -1 ? sosType : charTypes[seqIndices$1[sj$1]];\n if (prevCharType & STRONG_TYPES) {\n if (prevCharType === TYPE_AL) {\n changeCharType(i$9, TYPE_AN);\n }\n break\n }\n }\n }\n }\n }\n\n // W3. Change all ALs to R\n if (charTypeCounts.get(TYPE_AL)) {\n for (var si$2 = 0; si$2 < seqIndices$1.length; si$2++) {\n var i$10 = seqIndices$1[si$2];\n if (charTypes[i$10] & TYPE_AL) {\n changeCharType(i$10, TYPE_R);\n }\n }\n }\n\n // W4. A single European separator between two European numbers changes to a European number. A single common\n // separator between two numbers of the same type changes to that type.\n if (charTypeCounts.get(TYPE_ES) || charTypeCounts.get(TYPE_CS)) {\n for (var si$3 = 1; si$3 < seqIndices$1.length - 1; si$3++) {\n var i$11 = seqIndices$1[si$3];\n if (charTypes[i$11] & (TYPE_ES | TYPE_CS)) {\n var prevType$1 = 0, nextType = 0;\n for (var sj$2 = si$3 - 1; sj$2 >= 0; sj$2--) {\n prevType$1 = charTypes[seqIndices$1[sj$2]];\n if (!(prevType$1 & BN_LIKE_TYPES)) { //5.2\n break\n }\n }\n for (var sj$3 = si$3 + 1; sj$3 < seqIndices$1.length; sj$3++) {\n nextType = charTypes[seqIndices$1[sj$3]];\n if (!(nextType & BN_LIKE_TYPES)) { //5.2\n break\n }\n }\n if (prevType$1 === nextType && (charTypes[i$11] === TYPE_ES ? prevType$1 === TYPE_EN : (prevType$1 & (TYPE_EN | TYPE_AN)))) {\n changeCharType(i$11, prevType$1);\n }\n }\n }\n }\n\n // W5. A sequence of European terminators adjacent to European numbers changes to all European numbers.\n if (charTypeCounts.get(TYPE_EN)) {\n for (var si$4 = 0; si$4 < seqIndices$1.length; si$4++) {\n var i$12 = seqIndices$1[si$4];\n if (charTypes[i$12] & TYPE_EN) {\n for (var sj$4 = si$4 - 1; sj$4 >= 0 && (charTypes[seqIndices$1[sj$4]] & (TYPE_ET | BN_LIKE_TYPES)); sj$4--) {\n changeCharType(seqIndices$1[sj$4], TYPE_EN);\n }\n for (si$4++; si$4 < seqIndices$1.length && (charTypes[seqIndices$1[si$4]] & (TYPE_ET | BN_LIKE_TYPES | TYPE_EN)); si$4++) {\n if (charTypes[seqIndices$1[si$4]] !== TYPE_EN) {\n changeCharType(seqIndices$1[si$4], TYPE_EN);\n }\n }\n }\n }\n }\n\n // W6. Otherwise, separators and terminators change to Other Neutral.\n if (charTypeCounts.get(TYPE_ET) || charTypeCounts.get(TYPE_ES) || charTypeCounts.get(TYPE_CS)) {\n for (var si$5 = 0; si$5 < seqIndices$1.length; si$5++) {\n var i$13 = seqIndices$1[si$5];\n if (charTypes[i$13] & (TYPE_ET | TYPE_ES | TYPE_CS)) {\n changeCharType(i$13, TYPE_ON);\n // 5.2 transform adjacent BNs too:\n for (var sj$5 = si$5 - 1; sj$5 >= 0 && (charTypes[seqIndices$1[sj$5]] & BN_LIKE_TYPES); sj$5--) {\n changeCharType(seqIndices$1[sj$5], TYPE_ON);\n }\n for (var sj$6 = si$5 + 1; sj$6 < seqIndices$1.length && (charTypes[seqIndices$1[sj$6]] & BN_LIKE_TYPES); sj$6++) {\n changeCharType(seqIndices$1[sj$6], TYPE_ON);\n }\n }\n }\n }\n\n // W7. Search backward from each instance of a European number until the first strong type (R, L, or sos)\n // is found. If an L is found, then change the type of the European number to L.\n // NOTE: implemented in single forward pass for efficiency\n if (charTypeCounts.get(TYPE_EN)) {\n for (var si$6 = 0, prevStrongType = sosType; si$6 < seqIndices$1.length; si$6++) {\n var i$14 = seqIndices$1[si$6];\n var type = charTypes[i$14];\n if (type & TYPE_EN) {\n if (prevStrongType === TYPE_L) {\n changeCharType(i$14, TYPE_L);\n }\n } else if (type & STRONG_TYPES) {\n prevStrongType = type;\n }\n }\n }\n\n // === 3.3.5 Resolving Neutral and Isolate Formatting Types ===\n\n if (charTypeCounts.get(NEUTRAL_ISOLATE_TYPES)) {\n // N0. Process bracket pairs in an isolating run sequence sequentially in the logical order of the text\n // positions of the opening paired brackets using the logic given below. Within this scope, bidirectional\n // types EN and AN are treated as R.\n var R_TYPES_FOR_N_STEPS = (TYPE_R | TYPE_EN | TYPE_AN);\n var STRONG_TYPES_FOR_N_STEPS = R_TYPES_FOR_N_STEPS | TYPE_L;\n\n // * Identify the bracket pairs in the current isolating run sequence according to BD16.\n var bracketPairs = [];\n {\n var openerStack = [];\n for (var si$7 = 0; si$7 < seqIndices$1.length; si$7++) {\n // NOTE: for any potential bracket character we also test that it still carries a NI\n // type, as that may have been changed earlier. This doesn't seem to be explicitly\n // called out in the spec, but is required for passage of certain tests.\n if (charTypes[seqIndices$1[si$7]] & NEUTRAL_ISOLATE_TYPES) {\n var char = string[seqIndices$1[si$7]];\n var oppositeBracket = (void 0);\n // Opening bracket\n if (openingToClosingBracket(char) !== null) {\n if (openerStack.length < 63) {\n openerStack.push({ char: char, seqIndex: si$7 });\n } else {\n break\n }\n }\n // Closing bracket\n else if ((oppositeBracket = closingToOpeningBracket(char)) !== null) {\n for (var stackIdx = openerStack.length - 1; stackIdx >= 0; stackIdx--) {\n var stackChar = openerStack[stackIdx].char;\n if (stackChar === oppositeBracket ||\n stackChar === closingToOpeningBracket(getCanonicalBracket(char)) ||\n openingToClosingBracket(getCanonicalBracket(stackChar)) === char\n ) {\n bracketPairs.push([openerStack[stackIdx].seqIndex, si$7]);\n openerStack.length = stackIdx; //pop the matching bracket and all following\n break\n }\n }\n }\n }\n }\n bracketPairs.sort(function (a, b) { return a[0] - b[0]; });\n }\n // * For each bracket-pair element in the list of pairs of text positions\n for (var pairIdx = 0; pairIdx < bracketPairs.length; pairIdx++) {\n var ref$1 = bracketPairs[pairIdx];\n var openSeqIdx = ref$1[0];\n var closeSeqIdx = ref$1[1];\n // a. Inspect the bidirectional types of the characters enclosed within the bracket pair.\n // b. If any strong type (either L or R) matching the embedding direction is found, set the type for both\n // brackets in the pair to match the embedding direction.\n var foundStrongType = false;\n var useStrongType = 0;\n for (var si$8 = openSeqIdx + 1; si$8 < closeSeqIdx; si$8++) {\n var i$15 = seqIndices$1[si$8];\n if (charTypes[i$15] & STRONG_TYPES_FOR_N_STEPS) {\n foundStrongType = true;\n var lr = (charTypes[i$15] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L;\n if (lr === embedDirection) {\n useStrongType = lr;\n break\n }\n }\n }\n // c. Otherwise, if there is a strong type it must be opposite the embedding direction. Therefore, test\n // for an established context with a preceding strong type by checking backwards before the opening paired\n // bracket until the first strong type (L, R, or sos) is found.\n // 1. If the preceding strong type is also opposite the embedding direction, context is established, so\n // set the type for both brackets in the pair to that direction.\n // 2. Otherwise set the type for both brackets in the pair to the embedding direction.\n if (foundStrongType && !useStrongType) {\n useStrongType = sosType;\n for (var si$9 = openSeqIdx - 1; si$9 >= 0; si$9--) {\n var i$16 = seqIndices$1[si$9];\n if (charTypes[i$16] & STRONG_TYPES_FOR_N_STEPS) {\n var lr$1 = (charTypes[i$16] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L;\n if (lr$1 !== embedDirection) {\n useStrongType = lr$1;\n } else {\n useStrongType = embedDirection;\n }\n break\n }\n }\n }\n if (useStrongType) {\n charTypes[seqIndices$1[openSeqIdx]] = charTypes[seqIndices$1[closeSeqIdx]] = useStrongType;\n // * Any number of characters that had original bidirectional character type NSM prior to the application\n // of W1 that immediately follow a paired bracket which changed to L or R under N0 should change to match\n // the type of their preceding bracket.\n if (useStrongType !== embedDirection) {\n for (var si$10 = openSeqIdx + 1; si$10 < seqIndices$1.length; si$10++) {\n if (!(charTypes[seqIndices$1[si$10]] & BN_LIKE_TYPES)) {\n if (getBidiCharType(string[seqIndices$1[si$10]]) & TYPE_NSM) {\n charTypes[seqIndices$1[si$10]] = useStrongType;\n }\n break\n }\n }\n }\n if (useStrongType !== embedDirection) {\n for (var si$11 = closeSeqIdx + 1; si$11 < seqIndices$1.length; si$11++) {\n if (!(charTypes[seqIndices$1[si$11]] & BN_LIKE_TYPES)) {\n if (getBidiCharType(string[seqIndices$1[si$11]]) & TYPE_NSM) {\n charTypes[seqIndices$1[si$11]] = useStrongType;\n }\n break\n }\n }\n }\n }\n }\n\n // N1. A sequence of NIs takes the direction of the surrounding strong text if the text on both sides has the\n // same direction.\n // N2. Any remaining NIs take the embedding direction.\n for (var si$12 = 0; si$12 < seqIndices$1.length; si$12++) {\n if (charTypes[seqIndices$1[si$12]] & NEUTRAL_ISOLATE_TYPES) {\n var niRunStart = si$12, niRunEnd = si$12;\n var prevType$2 = sosType; //si === 0 ? sosType : (charTypes[seqIndices[si - 1]] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L\n for (var si2 = si$12 - 1; si2 >= 0; si2--) {\n if (charTypes[seqIndices$1[si2]] & BN_LIKE_TYPES) {\n niRunStart = si2; //5.2 treat BNs adjacent to NIs as NIs\n } else {\n prevType$2 = (charTypes[seqIndices$1[si2]] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L;\n break\n }\n }\n var nextType$1 = eosType;\n for (var si2$1 = si$12 + 1; si2$1 < seqIndices$1.length; si2$1++) {\n if (charTypes[seqIndices$1[si2$1]] & (NEUTRAL_ISOLATE_TYPES | BN_LIKE_TYPES)) {\n niRunEnd = si2$1;\n } else {\n nextType$1 = (charTypes[seqIndices$1[si2$1]] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L;\n break\n }\n }\n for (var sj$7 = niRunStart; sj$7 <= niRunEnd; sj$7++) {\n charTypes[seqIndices$1[sj$7]] = prevType$2 === nextType$1 ? prevType$2 : embedDirection;\n }\n si$12 = niRunEnd;\n }\n }\n }\n }\n\n // === 3.3.6 Resolving Implicit Levels ===\n\n for (var i$17 = paragraph.start; i$17 <= paragraph.end; i$17++) {\n var level$3 = embedLevels[i$17];\n var type$1 = charTypes[i$17];\n // I2. For all characters with an odd (right-to-left) embedding level, those of type L, EN or AN go up one level.\n if (level$3 & 1) {\n if (type$1 & (TYPE_L | TYPE_EN | TYPE_AN)) {\n embedLevels[i$17]++;\n }\n }\n // I1. For all characters with an even (left-to-right) embedding level, those of type R go up one level\n // and those of type AN or EN go up two levels.\n else {\n if (type$1 & TYPE_R) {\n embedLevels[i$17]++;\n } else if (type$1 & (TYPE_AN | TYPE_EN)) {\n embedLevels[i$17] += 2;\n }\n }\n\n // 5.2: Resolve any LRE, RLE, LRO, RLO, PDF, or BN to the level of the preceding character if there is one,\n // and otherwise to the base level.\n if (type$1 & BN_LIKE_TYPES) {\n embedLevels[i$17] = i$17 === 0 ? paragraph.level : embedLevels[i$17 - 1];\n }\n\n // 3.4 L1.1-4: Reset the embedding level of segment/paragraph separators, and any sequence of whitespace or\n // isolate formatting characters preceding them or the end of the paragraph, to the paragraph level.\n // NOTE: this will also need to be applied to each individual line ending after line wrapping occurs.\n if (i$17 === paragraph.end || getBidiCharType(string[i$17]) & (TYPE_S | TYPE_B)) {\n for (var j$1 = i$17; j$1 >= 0 && (getBidiCharType(string[j$1]) & TRAILING_TYPES); j$1--) {\n embedLevels[j$1] = paragraph.level;\n }\n }\n }\n }\n\n // DONE! The resolved levels can then be used, after line wrapping, to flip runs of characters\n // according to section 3.4 Reordering Resolved Levels\n return {\n levels: embedLevels,\n paragraphs: paragraphs\n }\n\n function determineAutoEmbedLevel (start, isFSI) {\n // 3.3.1 P2 - P3\n for (var i = start; i < string.length; i++) {\n var charType = charTypes[i];\n if (charType & (TYPE_R | TYPE_AL)) {\n return 1\n }\n if ((charType & (TYPE_B | TYPE_L)) || (isFSI && charType === TYPE_PDI)) {\n return 0\n }\n if (charType & ISOLATE_INIT_TYPES) {\n var pdi = indexOfMatchingPDI(i);\n i = pdi === -1 ? string.length : pdi;\n }\n }\n return 0\n }\n\n function indexOfMatchingPDI (isolateStart) {\n // 3.1.2 BD9\n var isolationLevel = 1;\n for (var i = isolateStart + 1; i < string.length; i++) {\n var charType = charTypes[i];\n if (charType & TYPE_B) {\n break\n }\n if (charType & TYPE_PDI) {\n if (--isolationLevel === 0) {\n return i\n }\n } else if (charType & ISOLATE_INIT_TYPES) {\n isolationLevel++;\n }\n }\n return -1\n }\n }\n\n // Bidi mirrored chars data, auto generated\n var data = \"14>1,j>2,t>2,u>2,1a>g,2v3>1,1>1,1ge>1,1wd>1,b>1,1j>1,f>1,ai>3,-2>3,+1,8>1k0,-1jq>1y7,-1y6>1hf,-1he>1h6,-1h5>1ha,-1h8>1qi,-1pu>1,6>3u,-3s>7,6>1,1>1,f>1,1>1,+2,3>1,1>1,+13,4>1,1>1,6>1eo,-1ee>1,3>1mg,-1me>1mk,-1mj>1mi,-1mg>1mi,-1md>1,1>1,+2,1>10k,-103>1,1>1,4>1,5>1,1>1,+10,3>1,1>8,-7>8,+1,-6>7,+1,a>1,1>1,u>1,u6>1,1>1,+5,26>1,1>1,2>1,2>2,8>1,7>1,4>1,1>1,+5,b8>1,1>1,+3,1>3,-2>1,2>1,1>1,+2,c>1,3>1,1>1,+2,h>1,3>1,a>1,1>1,2>1,3>1,1>1,d>1,f>1,3>1,1a>1,1>1,6>1,7>1,13>1,k>1,1>1,+19,4>1,1>1,+2,2>1,1>1,+18,m>1,a>1,1>1,lk>1,1>1,4>1,2>1,f>1,3>1,1>1,+3,db>1,1>1,+3,3>1,1>1,+2,14qm>1,1>1,+1,6>1,4j>1,j>2,t>2,u>2,2>1,+1\";\n\n var mirrorMap;\n\n function parse () {\n if (!mirrorMap) {\n //const start = performance.now()\n var ref = parseCharacterMap(data, true);\n var map = ref.map;\n var reverseMap = ref.reverseMap;\n // Combine both maps into one\n reverseMap.forEach(function (value, key) {\n map.set(key, value);\n });\n mirrorMap = map;\n //console.log(`mirrored chars parsed in ${performance.now() - start}ms`)\n }\n }\n\n function getMirroredCharacter (char) {\n parse();\n return mirrorMap.get(char) || null\n }\n\n /**\n * Given a string and its resolved embedding levels, build a map of indices to replacement chars\n * for any characters in right-to-left segments that have defined mirrored characters.\n * @param string\n * @param embeddingLevels\n * @param [start]\n * @param [end]\n * @return {Map}\n */\n function getMirroredCharactersMap(string, embeddingLevels, start, end) {\n var strLen = string.length;\n start = Math.max(0, start == null ? 0 : +start);\n end = Math.min(strLen - 1, end == null ? strLen - 1 : +end);\n\n var map = new Map();\n for (var i = start; i <= end; i++) {\n if (embeddingLevels[i] & 1) { //only odd (rtl) levels\n var mirror = getMirroredCharacter(string[i]);\n if (mirror !== null) {\n map.set(i, mirror);\n }\n }\n }\n return map\n }\n\n /**\n * Given a start and end denoting a single line within a string, and a set of precalculated\n * bidi embedding levels, produce a list of segments whose ordering should be flipped, in sequence.\n * @param {string} string - the full input string\n * @param {GetEmbeddingLevelsResult} embeddingLevelsResult - the result object from getEmbeddingLevels\n * @param {number} [start] - first character in a subset of the full string\n * @param {number} [end] - last character in a subset of the full string\n * @return {number[][]} - the list of start/end segments that should be flipped, in order.\n */\n function getReorderSegments(string, embeddingLevelsResult, start, end) {\n var strLen = string.length;\n start = Math.max(0, start == null ? 0 : +start);\n end = Math.min(strLen - 1, end == null ? strLen - 1 : +end);\n\n var segments = [];\n embeddingLevelsResult.paragraphs.forEach(function (paragraph) {\n var lineStart = Math.max(start, paragraph.start);\n var lineEnd = Math.min(end, paragraph.end);\n if (lineStart < lineEnd) {\n // Local slice for mutation\n var lineLevels = embeddingLevelsResult.levels.slice(lineStart, lineEnd + 1);\n\n // 3.4 L1.4: Reset any sequence of whitespace characters and/or isolate formatting characters at the\n // end of the line to the paragraph level.\n for (var i = lineEnd; i >= lineStart && (getBidiCharType(string[i]) & TRAILING_TYPES); i--) {\n lineLevels[i] = paragraph.level;\n }\n\n // L2. From the highest level found in the text to the lowest odd level on each line, including intermediate levels\n // not actually present in the text, reverse any contiguous sequence of characters that are at that level or higher.\n var maxLevel = paragraph.level;\n var minOddLevel = Infinity;\n for (var i$1 = 0; i$1 < lineLevels.length; i$1++) {\n var level = lineLevels[i$1];\n if (level > maxLevel) { maxLevel = level; }\n if (level < minOddLevel) { minOddLevel = level | 1; }\n }\n for (var lvl = maxLevel; lvl >= minOddLevel; lvl--) {\n for (var i$2 = 0; i$2 < lineLevels.length; i$2++) {\n if (lineLevels[i$2] >= lvl) {\n var segStart = i$2;\n while (i$2 + 1 < lineLevels.length && lineLevels[i$2 + 1] >= lvl) {\n i$2++;\n }\n if (i$2 > segStart) {\n segments.push([segStart + lineStart, i$2 + lineStart]);\n }\n }\n }\n }\n }\n });\n return segments\n }\n\n /**\n * @param {string} string\n * @param {GetEmbeddingLevelsResult} embedLevelsResult\n * @param {number} [start]\n * @param {number} [end]\n * @return {string} the new string with bidi segments reordered\n */\n function getReorderedString(string, embedLevelsResult, start, end) {\n var indices = getReorderedIndices(string, embedLevelsResult, start, end);\n var chars = [].concat( string );\n indices.forEach(function (charIndex, i) {\n chars[i] = (\n (embedLevelsResult.levels[charIndex] & 1) ? getMirroredCharacter(string[charIndex]) : null\n ) || string[charIndex];\n });\n return chars.join('')\n }\n\n /**\n * @param {string} string\n * @param {GetEmbeddingLevelsResult} embedLevelsResult\n * @param {number} [start]\n * @param {number} [end]\n * @return {number[]} an array with character indices in their new bidi order\n */\n function getReorderedIndices(string, embedLevelsResult, start, end) {\n var segments = getReorderSegments(string, embedLevelsResult, start, end);\n // Fill an array with indices\n var indices = [];\n for (var i = 0; i < string.length; i++) {\n indices[i] = i;\n }\n // Reverse each segment in order\n segments.forEach(function (ref) {\n var start = ref[0];\n var end = ref[1];\n\n var slice = indices.slice(start, end + 1);\n for (var i = slice.length; i--;) {\n indices[end - i] = slice[i];\n }\n });\n return indices\n }\n\n exports.closingToOpeningBracket = closingToOpeningBracket;\n exports.getBidiCharType = getBidiCharType;\n exports.getBidiCharTypeName = getBidiCharTypeName;\n exports.getCanonicalBracket = getCanonicalBracket;\n exports.getEmbeddingLevels = getEmbeddingLevels;\n exports.getMirroredCharacter = getMirroredCharacter;\n exports.getMirroredCharactersMap = getMirroredCharactersMap;\n exports.getReorderSegments = getReorderSegments;\n exports.getReorderedIndices = getReorderedIndices;\n exports.getReorderedString = getReorderedString;\n exports.openingToClosingBracket = openingToClosingBracket;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n return exports;\n\n}({}));\nreturn bidi}\n\nexport default bidiFactory;\n","import { ShaderChunk, UniformsUtils, MeshDepthMaterial, RGBADepthPacking, MeshDistanceMaterial, ShaderLib, Matrix4, Vector3, Mesh, CylinderGeometry, Vector2, MeshStandardMaterial, DoubleSide } from 'three';\n\n/**\n * Regular expression for matching the `void main() {` opener line in GLSL.\n * @type {RegExp}\n */\nconst voidMainRegExp = /\\bvoid\\s+main\\s*\\(\\s*\\)\\s*{/g;\n\n/**\n * Recursively expands all `#include ` statements within string of shader code.\n * Copied from three's WebGLProgram#parseIncludes for external use.\n *\n * @param {string} source - The GLSL source code to evaluate\n * @return {string} The GLSL code with all includes expanded\n */\nfunction expandShaderIncludes( source ) {\n const pattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n function replace(match, include) {\n let chunk = ShaderChunk[include];\n return chunk ? expandShaderIncludes(chunk) : match\n }\n return source.replace( pattern, replace )\n}\n\n/*\n * This is a direct copy of MathUtils.generateUUID from Three.js, to preserve compatibility with three\n * versions before 0.113.0 as it was changed from Math to MathUtils in that version.\n * https://github.com/mrdoob/three.js/blob/dd8b5aa3b270c17096b90945cd2d6d1b13aaec53/src/math/MathUtils.js#L16\n */\n\nconst _lut = [];\n\nfor (let i = 0; i < 256; i++) {\n _lut[i] = (i < 16 ? '0' : '') + (i).toString(16);\n}\n\nfunction generateUUID() {\n\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n const d0 = Math.random() * 0xffffffff | 0;\n const d1 = Math.random() * 0xffffffff | 0;\n const d2 = Math.random() * 0xffffffff | 0;\n const d3 = Math.random() * 0xffffffff | 0;\n const uuid = _lut[d0 & 0xff] + _lut[d0 >> 8 & 0xff] + _lut[d0 >> 16 & 0xff] + _lut[d0 >> 24 & 0xff] + '-' +\n _lut[d1 & 0xff] + _lut[d1 >> 8 & 0xff] + '-' + _lut[d1 >> 16 & 0x0f | 0x40] + _lut[d1 >> 24 & 0xff] + '-' +\n _lut[d2 & 0x3f | 0x80] + _lut[d2 >> 8 & 0xff] + '-' + _lut[d2 >> 16 & 0xff] + _lut[d2 >> 24 & 0xff] +\n _lut[d3 & 0xff] + _lut[d3 >> 8 & 0xff] + _lut[d3 >> 16 & 0xff] + _lut[d3 >> 24 & 0xff];\n\n // .toUpperCase() here flattens concatenated strings to save heap memory space.\n return uuid.toUpperCase()\n\n}\n\n// Local assign polyfill to avoid importing troika-core\nconst assign = Object.assign || function(/*target, ...sources*/) {\n let target = arguments[0];\n for (let i = 1, len = arguments.length; i < len; i++) {\n let source = arguments[i];\n if (source) {\n for (let prop in source) {\n if (Object.prototype.hasOwnProperty.call(source, prop)) {\n target[prop] = source[prop];\n }\n }\n }\n }\n return target\n};\n\n\nconst epoch = Date.now();\nconst CONSTRUCTOR_CACHE = new WeakMap();\nconst SHADER_UPGRADE_CACHE = new Map();\n\n// Material ids must be integers, but we can't access the increment from Three's `Material` module,\n// so let's choose a sufficiently large starting value that should theoretically never collide.\nlet materialInstanceId = 1e10;\n\n/**\n * A utility for creating a custom shader material derived from another material's\n * shaders. This allows you to inject custom shader logic and transforms into the\n * builtin ThreeJS materials without having to recreate them from scratch.\n *\n * @param {THREE.Material} baseMaterial - the original material to derive from\n *\n * @param {Object} options - How the base material should be modified.\n * @param {Object} options.defines - Custom `defines` for the material\n * @param {Object} options.extensions - Custom `extensions` for the material, e.g. `{derivatives: true}`\n * @param {Object} options.uniforms - Custom `uniforms` for use in the modified shader. These can\n * be accessed and manipulated via the resulting material's `uniforms` property, just like\n * in a ShaderMaterial. You do not need to repeat the base material's own uniforms here.\n * @param {String} options.timeUniform - If specified, a uniform of this name will be injected into\n * both shaders, and it will automatically be updated on each render frame with a number of\n * elapsed milliseconds. The \"zero\" epoch time is not significant so don't rely on this as a\n * true calendar time.\n * @param {String} options.vertexDefs - Custom GLSL code to inject into the vertex shader's top-level\n * definitions, above the `void main()` function.\n * @param {String} options.vertexMainIntro - Custom GLSL code to inject at the top of the vertex\n * shader's `void main` function.\n * @param {String} options.vertexMainOutro - Custom GLSL code to inject at the end of the vertex\n * shader's `void main` function.\n * @param {String} options.vertexTransform - Custom GLSL code to manipulate the `position`, `normal`,\n * and/or `uv` vertex attributes. This code will be wrapped within a standalone function with\n * those attributes exposed by their normal names as read/write values.\n * @param {String} options.fragmentDefs - Custom GLSL code to inject into the fragment shader's top-level\n * definitions, above the `void main()` function.\n * @param {String} options.fragmentMainIntro - Custom GLSL code to inject at the top of the fragment\n * shader's `void main` function.\n * @param {String} options.fragmentMainOutro - Custom GLSL code to inject at the end of the fragment\n * shader's `void main` function. You can manipulate `gl_FragColor` here but keep in mind it goes\n * after any of ThreeJS's color postprocessing shader chunks (tonemapping, fog, etc.), so if you\n * want those to apply to your changes use `fragmentColorTransform` instead.\n * @param {String} options.fragmentColorTransform - Custom GLSL code to manipulate the `gl_FragColor`\n * output value. Will be injected near the end of the `void main` function, but before any\n * of ThreeJS's color postprocessing shader chunks (tonemapping, fog, etc.), and before the\n * `fragmentMainOutro`.\n * @param {function<{vertexShader,fragmentShader}>:{vertexShader,fragmentShader}} options.customRewriter - A function\n * for performing custom rewrites of the full shader code. Useful if you need to do something\n * special that's not covered by the other builtin options. This function will be executed before\n * any other transforms are applied.\n * @param {boolean} options.chained - Set to `true` to prototype-chain the derived material to the base\n * material, rather than the default behavior of copying it. This allows the derived material to\n * automatically pick up changes made to the base material and its properties. This can be useful\n * where the derived material is hidden from the user as an implementation detail, allowing them\n * to work with the original material like normal. But it can result in unexpected behavior if not\n * handled carefully.\n *\n * @return {THREE.Material}\n *\n * The returned material will also have two new methods, `getDepthMaterial()` and `getDistanceMaterial()`,\n * which can be called to get a variant of the derived material for use in shadow casting. If the\n * target mesh is expected to cast shadows, then you can assign these to the mesh's `customDepthMaterial`\n * (for directional and spot lights) and/or `customDistanceMaterial` (for point lights) properties to\n * allow the cast shadow to honor your derived shader's vertex transforms and discarded fragments. These\n * will also set a custom `#define IS_DEPTH_MATERIAL` or `#define IS_DISTANCE_MATERIAL` that you can look\n * for in your derived shaders with `#ifdef` to customize their behavior for the depth or distance\n * scenarios, e.g. skipping antialiasing or expensive shader logic.\n */\nfunction createDerivedMaterial(baseMaterial, options) {\n // Generate a key that is unique to the content of these `options`. We'll use this\n // throughout for caching and for generating the upgraded shader code. This increases\n // the likelihood that the resulting shaders will line up across multiple calls so\n // their GL programs can be shared and cached.\n const optionsKey = getKeyForOptions(options);\n\n // First check to see if we've already derived from this baseMaterial using this\n // unique set of options, and if so reuse the constructor to avoid some allocations.\n let ctorsByDerivation = CONSTRUCTOR_CACHE.get(baseMaterial);\n if (!ctorsByDerivation) {\n CONSTRUCTOR_CACHE.set(baseMaterial, (ctorsByDerivation = Object.create(null)));\n }\n if (ctorsByDerivation[optionsKey]) {\n return new ctorsByDerivation[optionsKey]()\n }\n\n const privateBeforeCompileProp = `_onBeforeCompile${optionsKey}`;\n\n // Private onBeforeCompile handler that injects the modified shaders and uniforms when\n // the renderer switches to this material's program\n const onBeforeCompile = function (shaderInfo, renderer) {\n baseMaterial.onBeforeCompile.call(this, shaderInfo, renderer);\n\n // Upgrade the shaders, caching the result by incoming source code\n const cacheKey = this.customProgramCacheKey() + '|' + shaderInfo.vertexShader + '|' + shaderInfo.fragmentShader;\n let upgradedShaders = SHADER_UPGRADE_CACHE[cacheKey];\n if (!upgradedShaders) {\n const upgraded = upgradeShaders(this, shaderInfo, options, optionsKey);\n upgradedShaders = SHADER_UPGRADE_CACHE[cacheKey] = upgraded;\n }\n\n // Inject upgraded shaders and uniforms into the program\n shaderInfo.vertexShader = upgradedShaders.vertexShader;\n shaderInfo.fragmentShader = upgradedShaders.fragmentShader;\n assign(shaderInfo.uniforms, this.uniforms);\n\n // Inject auto-updating time uniform if requested\n if (options.timeUniform) {\n shaderInfo.uniforms[options.timeUniform] = {\n get value() {return Date.now() - epoch}\n };\n }\n\n // Users can still add their own handlers on top of ours\n if (this[privateBeforeCompileProp]) {\n this[privateBeforeCompileProp](shaderInfo);\n }\n };\n\n const DerivedMaterial = function DerivedMaterial() {\n return derive(options.chained ? baseMaterial : baseMaterial.clone())\n };\n\n const derive = function(base) {\n // Prototype chain to the base material\n const derived = Object.create(base, descriptor);\n\n // Store the baseMaterial for reference; this is always the original even when cloning\n Object.defineProperty(derived, 'baseMaterial', { value: baseMaterial });\n\n // Needs its own ids\n Object.defineProperty(derived, 'id', { value: materialInstanceId++ });\n derived.uuid = generateUUID();\n\n // Merge uniforms, defines, and extensions\n derived.uniforms = assign({}, base.uniforms, options.uniforms);\n derived.defines = assign({}, base.defines, options.defines);\n derived.defines[`TROIKA_DERIVED_MATERIAL_${optionsKey}`] = ''; //force a program change from the base material\n derived.extensions = assign({}, base.extensions, options.extensions);\n\n // Don't inherit EventDispatcher listeners\n derived._listeners = undefined;\n\n return derived\n };\n\n const descriptor = {\n constructor: {value: DerivedMaterial},\n isDerivedMaterial: {value: true},\n\n customProgramCacheKey: {\n writable: true,\n configurable: true,\n value: function () {\n return baseMaterial.customProgramCacheKey() + '|' + optionsKey\n }\n },\n\n onBeforeCompile: {\n get() {\n return onBeforeCompile\n },\n set(fn) {\n this[privateBeforeCompileProp] = fn;\n }\n },\n\n copy: {\n writable: true,\n configurable: true,\n value: function (source) {\n baseMaterial.copy.call(this, source);\n if (!baseMaterial.isShaderMaterial && !baseMaterial.isDerivedMaterial) {\n assign(this.extensions, source.extensions);\n assign(this.defines, source.defines);\n assign(this.uniforms, UniformsUtils.clone(source.uniforms));\n }\n return this\n }\n },\n\n clone: {\n writable: true,\n configurable: true,\n value: function () {\n const newBase = new baseMaterial.constructor();\n return derive(newBase).copy(this)\n }\n },\n\n /**\n * Utility to get a MeshDepthMaterial that will honor this derived material's vertex\n * transformations and discarded fragments.\n */\n getDepthMaterial: {\n writable: true,\n configurable: true,\n value: function() {\n let depthMaterial = this._depthMaterial;\n if (!depthMaterial) {\n depthMaterial = this._depthMaterial = createDerivedMaterial(\n baseMaterial.isDerivedMaterial\n ? baseMaterial.getDepthMaterial()\n : new MeshDepthMaterial({ depthPacking: RGBADepthPacking }),\n options\n );\n depthMaterial.defines.IS_DEPTH_MATERIAL = '';\n depthMaterial.uniforms = this.uniforms; //automatically recieve same uniform values\n }\n return depthMaterial\n }\n },\n\n /**\n * Utility to get a MeshDistanceMaterial that will honor this derived material's vertex\n * transformations and discarded fragments.\n */\n getDistanceMaterial: {\n writable: true,\n configurable: true,\n value: function() {\n let distanceMaterial = this._distanceMaterial;\n if (!distanceMaterial) {\n distanceMaterial = this._distanceMaterial = createDerivedMaterial(\n baseMaterial.isDerivedMaterial\n ? baseMaterial.getDistanceMaterial()\n : new MeshDistanceMaterial(),\n options\n );\n distanceMaterial.defines.IS_DISTANCE_MATERIAL = '';\n distanceMaterial.uniforms = this.uniforms; //automatically recieve same uniform values\n }\n return distanceMaterial\n }\n },\n\n dispose: {\n writable: true,\n configurable: true,\n value() {\n const {_depthMaterial, _distanceMaterial} = this;\n if (_depthMaterial) _depthMaterial.dispose();\n if (_distanceMaterial) _distanceMaterial.dispose();\n baseMaterial.dispose.call(this);\n }\n }\n };\n\n ctorsByDerivation[optionsKey] = DerivedMaterial;\n return new DerivedMaterial()\n}\n\n\nfunction upgradeShaders(material, {vertexShader, fragmentShader}, options, key) {\n let {\n vertexDefs,\n vertexMainIntro,\n vertexMainOutro,\n vertexTransform,\n fragmentDefs,\n fragmentMainIntro,\n fragmentMainOutro,\n fragmentColorTransform,\n customRewriter,\n timeUniform\n } = options;\n\n vertexDefs = vertexDefs || '';\n vertexMainIntro = vertexMainIntro || '';\n vertexMainOutro = vertexMainOutro || '';\n fragmentDefs = fragmentDefs || '';\n fragmentMainIntro = fragmentMainIntro || '';\n fragmentMainOutro = fragmentMainOutro || '';\n\n // Expand includes if needed\n if (vertexTransform || customRewriter) {\n vertexShader = expandShaderIncludes(vertexShader);\n }\n if (fragmentColorTransform || customRewriter) {\n // We need to be able to find postprocessing chunks after include expansion in order to\n // put them after the fragmentColorTransform, so mark them with comments first. Even if\n // this particular derivation doesn't have a fragmentColorTransform, other derivations may,\n // so we still mark them.\n fragmentShader = fragmentShader.replace(\n /^[ \\t]*#include <((?:tonemapping|encodings|fog|premultiplied_alpha|dithering)_fragment)>/gm,\n '\\n//!BEGIN_POST_CHUNK $1\\n$&\\n//!END_POST_CHUNK\\n'\n );\n fragmentShader = expandShaderIncludes(fragmentShader);\n }\n\n // Apply custom rewriter function\n if (customRewriter) {\n let res = customRewriter({vertexShader, fragmentShader});\n vertexShader = res.vertexShader;\n fragmentShader = res.fragmentShader;\n }\n\n // The fragmentColorTransform needs to go before any postprocessing chunks, so extract\n // those and re-insert them into the outro in the correct place:\n if (fragmentColorTransform) {\n let postChunks = [];\n fragmentShader = fragmentShader.replace(\n /^\\/\\/!BEGIN_POST_CHUNK[^]+?^\\/\\/!END_POST_CHUNK/gm, // [^]+? = non-greedy match of any chars including newlines\n match => {\n postChunks.push(match);\n return ''\n }\n );\n fragmentMainOutro = `${fragmentColorTransform}\\n${postChunks.join('\\n')}\\n${fragmentMainOutro}`;\n }\n\n // Inject auto-updating time uniform if requested\n if (timeUniform) {\n const code = `\\nuniform float ${timeUniform};\\n`;\n vertexDefs = code + vertexDefs;\n fragmentDefs = code + fragmentDefs;\n }\n\n // Inject a function for the vertexTransform and rename all usages of position/normal/uv\n if (vertexTransform) {\n // Hoist these defs to the very top so they work in other function defs\n vertexShader = `vec3 troika_position_${key};\nvec3 troika_normal_${key};\nvec2 troika_uv_${key};\n${vertexShader}\n`;\n vertexDefs = `${vertexDefs}\nvoid troikaVertexTransform${key}(inout vec3 position, inout vec3 normal, inout vec2 uv) {\n ${vertexTransform}\n}\n`;\n vertexMainIntro = `\ntroika_position_${key} = vec3(position);\ntroika_normal_${key} = vec3(normal);\ntroika_uv_${key} = vec2(uv);\ntroikaVertexTransform${key}(troika_position_${key}, troika_normal_${key}, troika_uv_${key});\n${vertexMainIntro}\n`;\n vertexShader = vertexShader.replace(/\\b(position|normal|uv)\\b/g, (match, match1, index, fullStr) => {\n return /\\battribute\\s+vec[23]\\s+$/.test(fullStr.substr(0, index)) ? match1 : `troika_${match1}_${key}`\n });\n\n // Three r152 introduced the MAP_UV token, replace it too if it's pointing to the main 'uv'\n // Perhaps the other textures too going forward?\n if (!(material.map && material.map.channel > 0)) {\n vertexShader = vertexShader.replace(/\\bMAP_UV\\b/g, `troika_uv_${key}`);\n }\n }\n\n // Inject defs and intro/outro snippets\n vertexShader = injectIntoShaderCode(vertexShader, key, vertexDefs, vertexMainIntro, vertexMainOutro);\n fragmentShader = injectIntoShaderCode(fragmentShader, key, fragmentDefs, fragmentMainIntro, fragmentMainOutro);\n\n return {\n vertexShader,\n fragmentShader\n }\n}\n\nfunction injectIntoShaderCode(shaderCode, id, defs, intro, outro) {\n if (intro || outro || defs) {\n shaderCode = shaderCode.replace(voidMainRegExp, `\n${defs}\nvoid troikaOrigMain${id}() {`\n );\n shaderCode += `\nvoid main() {\n ${intro}\n troikaOrigMain${id}();\n ${outro}\n}`;\n }\n return shaderCode\n}\n\n\nfunction optionsJsonReplacer(key, value) {\n return key === 'uniforms' ? undefined : typeof value === 'function' ? value.toString() : value\n}\n\nlet _idCtr = 0;\nconst optionsHashesToIds = new Map();\nfunction getKeyForOptions(options) {\n const optionsHash = JSON.stringify(options, optionsJsonReplacer);\n let id = optionsHashesToIds.get(optionsHash);\n if (id == null) {\n optionsHashesToIds.set(optionsHash, (id = ++_idCtr));\n }\n return id\n}\n\n// Copied from threejs WebGLPrograms.js so we can resolve builtin materials to their shaders\n// TODO how can we keep this from getting stale?\nconst MATERIAL_TYPES_TO_SHADERS = {\n MeshDepthMaterial: 'depth',\n MeshDistanceMaterial: 'distanceRGBA',\n MeshNormalMaterial: 'normal',\n MeshBasicMaterial: 'basic',\n MeshLambertMaterial: 'lambert',\n MeshPhongMaterial: 'phong',\n MeshToonMaterial: 'toon',\n MeshStandardMaterial: 'physical',\n MeshPhysicalMaterial: 'physical',\n MeshMatcapMaterial: 'matcap',\n LineBasicMaterial: 'basic',\n LineDashedMaterial: 'dashed',\n PointsMaterial: 'points',\n ShadowMaterial: 'shadow',\n SpriteMaterial: 'sprite'\n};\n\n/**\n * Given a Three.js `Material` instance, find the shaders/uniforms that will be\n * used to render that material.\n *\n * @param material - the Material instance\n * @return {object} - the material's shader info: `{uniforms:{}, fragmentShader:'', vertexShader:''}`\n */\nfunction getShadersForMaterial(material) {\n let builtinType = MATERIAL_TYPES_TO_SHADERS[material.type];\n return builtinType ? ShaderLib[builtinType] : material //TODO fallback for unknown type?\n}\n\n/**\n * Find all uniforms and their types within a shader code string.\n *\n * @param {string} shader - The shader code to parse\n * @return {object} mapping of uniform names to their glsl type\n */\nfunction getShaderUniformTypes(shader) {\n let uniformRE = /\\buniform\\s+(int|float|vec[234]|mat[34])\\s+([A-Za-z_][\\w]*)/g;\n let uniforms = Object.create(null);\n let match;\n while ((match = uniformRE.exec(shader)) !== null) {\n uniforms[match[2]] = match[1];\n }\n return uniforms\n}\n\n/**\n * Helper for smoothing out the `m.getInverse(x)` --> `m.copy(x).invert()` conversion\n * that happened in ThreeJS r123.\n * @param {Matrix4} srcMatrix\n * @param {Matrix4} [tgtMatrix]\n */\nfunction invertMatrix4(srcMatrix, tgtMatrix = new Matrix4()) {\n if (typeof tgtMatrix.invert === 'function') {\n tgtMatrix.copy(srcMatrix).invert();\n } else {\n tgtMatrix.getInverse(srcMatrix);\n }\n return tgtMatrix\n}\n\n/*\nInput geometry is a cylinder with r=1, height in y dimension from 0 to 1,\ndivided into a reasonable number of height segments.\n*/\n\nconst vertexDefs = `\nuniform vec3 pointA;\nuniform vec3 controlA;\nuniform vec3 controlB;\nuniform vec3 pointB;\nuniform float radius;\nvarying float bezierT;\n\nvec3 cubicBezier(vec3 p1, vec3 c1, vec3 c2, vec3 p2, float t) {\n float t2 = 1.0 - t;\n float b0 = t2 * t2 * t2;\n float b1 = 3.0 * t * t2 * t2;\n float b2 = 3.0 * t * t * t2;\n float b3 = t * t * t;\n return b0 * p1 + b1 * c1 + b2 * c2 + b3 * p2;\n}\n\nvec3 cubicBezierDerivative(vec3 p1, vec3 c1, vec3 c2, vec3 p2, float t) {\n float t2 = 1.0 - t;\n return -3.0 * p1 * t2 * t2 +\n c1 * (3.0 * t2 * t2 - 6.0 * t2 * t) +\n c2 * (6.0 * t2 * t - 3.0 * t * t) +\n 3.0 * p2 * t * t;\n}\n`;\n\nconst vertexTransform = `\nfloat t = position.y;\nbezierT = t;\nvec3 bezierCenterPos = cubicBezier(pointA, controlA, controlB, pointB, t);\nvec3 bezierDir = normalize(cubicBezierDerivative(pointA, controlA, controlB, pointB, t));\n\n// Make \"sideways\" always perpendicular to the camera ray; this ensures that any twists\n// in the cylinder occur where you won't see them: \nvec3 viewDirection = normalMatrix * vec3(0.0, 0.0, 1.0);\nif (bezierDir == viewDirection) {\n bezierDir = normalize(cubicBezierDerivative(pointA, controlA, controlB, pointB, t == 1.0 ? t - 0.0001 : t + 0.0001));\n}\nvec3 sideways = normalize(cross(bezierDir, viewDirection));\nvec3 upish = normalize(cross(sideways, bezierDir));\n\n// Build a matrix for transforming this disc in the cylinder:\nmat4 discTx;\ndiscTx[0].xyz = sideways * radius;\ndiscTx[1].xyz = bezierDir * radius;\ndiscTx[2].xyz = upish * radius;\ndiscTx[3].xyz = bezierCenterPos;\ndiscTx[3][3] = 1.0;\n\n// Apply transform, ignoring original y\nposition = (discTx * vec4(position.x, 0.0, position.z, 1.0)).xyz;\nnormal = normalize(mat3(discTx) * normal);\n`;\n\nconst fragmentDefs = `\nuniform vec3 dashing;\nvarying float bezierT;\n`;\n\nconst fragmentMainIntro = `\nif (dashing.x + dashing.y > 0.0) {\n float dashFrac = mod(bezierT - dashing.z, dashing.x + dashing.y);\n if (dashFrac > dashing.x) {\n discard;\n }\n}\n`;\n\n// Debugging: separate color for each of the 6 sides:\n// const fragmentColorTransform = `\n// float sideNum = floor(vUV.x * 6.0);\n// vec3 mixColor = sideNum < 1.0 ? vec3(1.0, 0.0, 0.0) :\n// sideNum < 2.0 ? vec3(0.0, 1.0, 1.0) :\n// sideNum < 3.0 ? vec3(1.0, 1.0, 0.0) :\n// sideNum < 4.0 ? vec3(0.0, 0.0, 1.0) :\n// sideNum < 5.0 ? vec3(0.0, 1.0, 0.0) :\n// vec3(1.0, 0.0, 1.0);\n// gl_FragColor.xyz = mix(gl_FragColor.xyz, mixColor, 0.5);\n// `\n\n\n\nfunction createBezierMeshMaterial(baseMaterial) {\n return createDerivedMaterial(\n baseMaterial,\n {\n chained: true,\n uniforms: {\n pointA: {value: new Vector3()},\n controlA: {value: new Vector3()},\n controlB: {value: new Vector3()},\n pointB: {value: new Vector3()},\n radius: {value: 0.01},\n dashing: {value: new Vector3()} //on, off, offset\n },\n vertexDefs,\n vertexTransform,\n fragmentDefs,\n fragmentMainIntro\n }\n )\n}\n\nlet geometry = null;\n\nconst defaultBaseMaterial = /*#__PURE__*/new MeshStandardMaterial({color: 0xffffff, side: DoubleSide});\n\n\n/**\n * A ThreeJS `Mesh` that bends a tube shape along a 3D cubic bezier path. The bending is done\n * by deforming a straight cylindrical geometry in the vertex shader based on a set of four\n * control point uniforms. It patches the necessary GLSL into the mesh's assigned `material`\n * automatically.\n *\n * The cubiz bezier path is determined by its four `Vector3` properties:\n * - `pointA`\n * - `controlA`\n * - `controlB`\n * - `pointB`\n *\n * The tube's radius is controlled by its `radius` property, which defaults to `0.01`.\n *\n * You can also give the tube a dashed appearance with two properties:\n *\n * - `dashArray` - an array of two numbers, defining the length of \"on\" and \"off\" parts of\n * the dash. Each is a 0-1 ratio of the entire path's length. (Actually this is the `t` length\n * used as input to the cubic bezier function, not its visible length.)\n * - `dashOffset` - offset of where the dash starts. You can animate this to make the dashes move.\n *\n * Note that the dashes will appear like a hollow tube, not solid. This will be more apparent on\n * thicker tubes.\n *\n * TODO: proper geometry bounding sphere and raycasting\n * TODO: allow control of the geometry's segment counts\n */\nclass BezierMesh extends Mesh {\n static getGeometry() {\n return geometry || (geometry =\n new CylinderGeometry(1, 1, 1, 6, 64).translate(0, 0.5, 0)\n )\n }\n\n constructor() {\n super(\n BezierMesh.getGeometry(),\n defaultBaseMaterial\n );\n\n this.pointA = new Vector3();\n this.controlA = new Vector3();\n this.controlB = new Vector3();\n this.pointB = new Vector3();\n this.radius = 0.01;\n this.dashArray = new Vector2();\n this.dashOffset = 0;\n\n // TODO - disabling frustum culling until I figure out how to customize the\n // geometry's bounding sphere that gets used\n this.frustumCulled = false;\n }\n\n // Handler for automatically wrapping the base material with our upgrades. We do the wrapping\n // lazily on _read_ rather than write to avoid unnecessary wrapping on transient values.\n get material() {\n let derivedMaterial = this._derivedMaterial;\n const baseMaterial = this._baseMaterial || this._defaultMaterial || (this._defaultMaterial = defaultBaseMaterial.clone());\n if (!derivedMaterial || derivedMaterial.baseMaterial !== baseMaterial) {\n derivedMaterial = this._derivedMaterial = createBezierMeshMaterial(baseMaterial);\n // dispose the derived material when its base material is disposed:\n baseMaterial.addEventListener('dispose', function onDispose() {\n baseMaterial.removeEventListener('dispose', onDispose);\n derivedMaterial.dispose();\n });\n }\n return derivedMaterial\n }\n set material(baseMaterial) {\n this._baseMaterial = baseMaterial;\n }\n\n // Create and update material for shadows upon request:\n get customDepthMaterial() {\n return this.material.getDepthMaterial()\n }\n get customDistanceMaterial() {\n return this.material.getDistanceMaterial()\n }\n\n onBeforeRender() {\n const {uniforms} = this.material;\n const {pointA, controlA, controlB, pointB, radius, dashArray, dashOffset} = this;\n uniforms.pointA.value.copy(pointA);\n uniforms.controlA.value.copy(controlA);\n uniforms.controlB.value.copy(controlB);\n uniforms.pointB.value.copy(pointB);\n uniforms.radius.value = radius;\n uniforms.dashing.value.set(dashArray.x, dashArray.y, dashOffset || 0);\n }\n\n raycast(/*raycaster, intersects*/) {\n // TODO - just fail for now\n }\n}\n\nexport { BezierMesh, createDerivedMaterial, expandShaderIncludes, getShaderUniformTypes, getShadersForMaterial, invertMatrix4, voidMainRegExp };\n","import { Texture, LinearFilter, Color, InstancedBufferGeometry, Sphere, Box3, BackSide, DoubleSide, InstancedBufferAttribute, PlaneGeometry, BufferGeometry, Float32BufferAttribute, Vector2, Vector4, Matrix3, Mesh, FrontSide, MeshBasicMaterial, Matrix4, Vector3 } from 'three';\nimport { terminateWorker, defineWorkerModule } from 'troika-worker-utils';\nimport createSDFGenerator from 'webgl-sdf-generator';\nimport bidiFactory from 'bidi-js';\nimport { createDerivedMaterial, voidMainRegExp } from 'troika-three-utils';\n\n/**\n * Factory function that creates a self-contained environment for processing text typesetting requests.\n *\n * It is important that this function has no closure dependencies, so that it can be easily injected\n * into the source for a Worker without requiring a build step or complex dependency loading. All its\n * dependencies must be passed in at initialization.\n *\n * @param {function} fontParser - a function that accepts an ArrayBuffer of the font data and returns\n * a standardized structure giving access to the font and its glyphs:\n * {\n * unitsPerEm: number,\n * ascender: number,\n * descender: number,\n * capHeight: number,\n * xHeight: number,\n * lineGap: number,\n * forEachGlyph(string, fontSize, letterSpacing, callback) {\n * //invokes callback for each glyph to render, passing it an object:\n * callback({\n * index: number,\n * advanceWidth: number,\n * xMin: number,\n * yMin: number,\n * xMax: number,\n * yMax: number,\n * path: string,\n * pathCommandCount: number\n * })\n * }\n * }\n * @param {object} bidi - the bidi.js implementation object\n * @param {Object} config\n * @return {Object}\n */\nfunction createTypesetter(fontParser, bidi, config) {\n\n const {\n defaultFontURL\n } = config;\n\n /**\n * Holds parsed font objects by url\n */\n const fonts = Object.create(null);\n\n const INF = Infinity;\n\n // Set of Unicode Default_Ignorable_Code_Point characters, these will not produce visible glyphs\n // eslint-disable-next-line no-misleading-character-class\n const DEFAULT_IGNORABLE_CHARS = /[\\u00AD\\u034F\\u061C\\u115F-\\u1160\\u17B4-\\u17B5\\u180B-\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u3164\\uFE00-\\uFE0F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8]/;\n\n // This regex (instead of /\\s/) allows us to select all whitespace EXCEPT for non-breaking white spaces\n const lineBreakingWhiteSpace = `[^\\\\S\\\\u00A0]`;\n\n // Incomplete set of characters that allow line breaking after them\n // In the future we may consider a full Unicode line breaking algorithm impl: https://www.unicode.org/reports/tr14\n const BREAK_AFTER_CHARS = new RegExp(`${lineBreakingWhiteSpace}|[\\\\-\\\\u007C\\\\u00AD\\\\u2010\\\\u2012-\\\\u2014\\\\u2027\\\\u2056\\\\u2E17\\\\u2E40]`);\n\n /**\n * Load a given font url\n */\n function doLoadFont(url, callback) {\n function tryLoad() {\n const onError = err => {\n console.error(`Failure loading font ${url}${url === defaultFontURL ? '' : '; trying fallback'}`, err);\n if (url !== defaultFontURL) {\n url = defaultFontURL;\n tryLoad();\n }\n };\n try {\n const request = new XMLHttpRequest();\n request.open('get', url, true);\n request.responseType = 'arraybuffer';\n request.onload = function () {\n if (request.status >= 400) {\n onError(new Error(request.statusText));\n }\n else if (request.status > 0) {\n try {\n const fontObj = fontParser(request.response);\n callback(fontObj);\n } catch (e) {\n onError(e);\n }\n }\n };\n request.onerror = onError;\n request.send();\n } catch(err) {\n onError(err);\n }\n }\n tryLoad();\n }\n\n\n /**\n * Load a given font url if needed, invoking a callback when it's loaded. If already\n * loaded, the callback will be called synchronously.\n */\n function loadFont(fontUrl, callback) {\n if (!fontUrl) fontUrl = defaultFontURL;\n let font = fonts[fontUrl];\n if (font) {\n // if currently loading font, add to callbacks, otherwise execute immediately\n if (font.pending) {\n font.pending.push(callback);\n } else {\n callback(font);\n }\n } else {\n fonts[fontUrl] = {pending: [callback]};\n doLoadFont(fontUrl, fontObj => {\n let callbacks = fonts[fontUrl].pending;\n fonts[fontUrl] = fontObj;\n callbacks.forEach(cb => cb(fontObj));\n });\n }\n }\n\n\n /**\n * Main entry point.\n * Process a text string with given font and formatting parameters, and return all info\n * necessary to render all its glyphs.\n */\n function typeset(\n {\n text='',\n font=defaultFontURL,\n sdfGlyphSize=64,\n fontSize=1,\n letterSpacing=0,\n lineHeight='normal',\n maxWidth=INF,\n direction,\n textAlign='left',\n textIndent=0,\n whiteSpace='normal',\n overflowWrap='normal',\n anchorX = 0,\n anchorY = 0,\n includeCaretPositions=false,\n chunkedBoundsSize=8192,\n colorRanges=null\n },\n callback,\n metricsOnly=false\n ) {\n const mainStart = now();\n const timings = {fontLoad: 0, typesetting: 0};\n\n // Ensure newlines are normalized\n if (text.indexOf('\\r') > -1) {\n console.info('Typesetter: got text with \\\\r chars; normalizing to \\\\n');\n text = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n }\n\n // Ensure we've got numbers not strings\n fontSize = +fontSize;\n letterSpacing = +letterSpacing;\n maxWidth = +maxWidth;\n lineHeight = lineHeight || 'normal';\n textIndent = +textIndent;\n\n loadFont(font, fontObj => {\n const hasMaxWidth = isFinite(maxWidth);\n let glyphIds = null;\n let glyphPositions = null;\n let glyphData = null;\n let glyphColors = null;\n let caretPositions = null;\n let visibleBounds = null;\n let chunkedBounds = null;\n let maxLineWidth = 0;\n let renderableGlyphCount = 0;\n let canWrap = whiteSpace !== 'nowrap';\n const {ascender, descender, unitsPerEm, lineGap, capHeight, xHeight} = fontObj;\n timings.fontLoad = now() - mainStart;\n const typesetStart = now();\n\n // Find conversion between native font units and fontSize units; this will already be done\n // for the gx/gy values below but everything else we'll need to convert\n const fontSizeMult = fontSize / unitsPerEm;\n\n // Determine appropriate value for 'normal' line height based on the font's actual metrics\n // TODO this does not guarantee individual glyphs won't exceed the line height, e.g. Roboto; should we use yMin/Max instead?\n if (lineHeight === 'normal') {\n lineHeight = (ascender - descender + lineGap) / unitsPerEm;\n }\n\n // Determine line height and leading adjustments\n lineHeight = lineHeight * fontSize;\n const halfLeading = (lineHeight - (ascender - descender) * fontSizeMult) / 2;\n const topBaseline = -(ascender * fontSizeMult + halfLeading);\n const caretHeight = Math.min(lineHeight, (ascender - descender) * fontSizeMult);\n const caretBottomOffset = (ascender + descender) / 2 * fontSizeMult - caretHeight / 2;\n\n // Distribute glyphs into lines based on wrapping\n let lineXOffset = textIndent;\n let currentLine = new TextLine();\n const lines = [currentLine];\n\n fontObj.forEachGlyph(text, fontSize, letterSpacing, (glyphObj, glyphX, charIndex) => {\n const char = text.charAt(charIndex);\n const glyphWidth = glyphObj.advanceWidth * fontSizeMult;\n const curLineCount = currentLine.count;\n let nextLine;\n\n // Calc isWhitespace and isEmpty once per glyphObj\n if (!('isEmpty' in glyphObj)) {\n glyphObj.isWhitespace = !!char && new RegExp(lineBreakingWhiteSpace).test(char);\n glyphObj.canBreakAfter = !!char && BREAK_AFTER_CHARS.test(char);\n glyphObj.isEmpty = glyphObj.xMin === glyphObj.xMax || glyphObj.yMin === glyphObj.yMax || DEFAULT_IGNORABLE_CHARS.test(char);\n }\n if (!glyphObj.isWhitespace && !glyphObj.isEmpty) {\n renderableGlyphCount++;\n }\n\n // If a non-whitespace character overflows the max width, we need to soft-wrap\n if (canWrap && hasMaxWidth && !glyphObj.isWhitespace && glyphX + glyphWidth + lineXOffset > maxWidth && curLineCount) {\n // If it's the first char after a whitespace, start a new line\n if (currentLine.glyphAt(curLineCount - 1).glyphObj.canBreakAfter) {\n nextLine = new TextLine();\n lineXOffset = -glyphX;\n } else {\n // Back up looking for a whitespace character to wrap at\n for (let i = curLineCount; i--;) {\n // If we got the start of the line there's no soft break point; make hard break if overflowWrap='break-word'\n if (i === 0 && overflowWrap === 'break-word') {\n nextLine = new TextLine();\n lineXOffset = -glyphX;\n break\n }\n // Found a soft break point; move all chars since it to a new line\n else if (currentLine.glyphAt(i).glyphObj.canBreakAfter) {\n nextLine = currentLine.splitAt(i + 1);\n const adjustX = nextLine.glyphAt(0).x;\n lineXOffset -= adjustX;\n for (let j = nextLine.count; j--;) {\n nextLine.glyphAt(j).x -= adjustX;\n }\n break\n }\n }\n }\n if (nextLine) {\n currentLine.isSoftWrapped = true;\n currentLine = nextLine;\n lines.push(currentLine);\n maxLineWidth = maxWidth; //after soft wrapping use maxWidth as calculated width\n }\n }\n\n let fly = currentLine.glyphAt(currentLine.count);\n fly.glyphObj = glyphObj;\n fly.x = glyphX + lineXOffset;\n fly.width = glyphWidth;\n fly.charIndex = charIndex;\n\n // Handle hard line breaks\n if (char === '\\n') {\n currentLine = new TextLine();\n lines.push(currentLine);\n lineXOffset = -(glyphX + glyphWidth + (letterSpacing * fontSize)) + textIndent;\n }\n });\n\n // Calculate width of each line (excluding trailing whitespace) and maximum block width\n lines.forEach(line => {\n for (let i = line.count; i--;) {\n let {glyphObj, x, width} = line.glyphAt(i);\n if (!glyphObj.isWhitespace) {\n line.width = x + width;\n if (line.width > maxLineWidth) {\n maxLineWidth = line.width;\n }\n return\n }\n }\n });\n\n // Find overall position adjustments for anchoring\n let anchorXOffset = 0;\n let anchorYOffset = 0;\n if (anchorX) {\n if (typeof anchorX === 'number') {\n anchorXOffset = -anchorX;\n }\n else if (typeof anchorX === 'string') {\n anchorXOffset = -maxLineWidth * (\n anchorX === 'left' ? 0 :\n anchorX === 'center' ? 0.5 :\n anchorX === 'right' ? 1 :\n parsePercent(anchorX)\n );\n }\n }\n if (anchorY) {\n if (typeof anchorY === 'number') {\n anchorYOffset = -anchorY;\n }\n else if (typeof anchorY === 'string') {\n let height = lines.length * lineHeight;\n anchorYOffset = anchorY === 'top' ? 0 :\n anchorY === 'top-baseline' ? -topBaseline :\n anchorY === 'top-cap' ? -topBaseline - capHeight * fontSizeMult :\n anchorY === 'top-ex' ? -topBaseline - xHeight * fontSizeMult :\n anchorY === 'middle' ? height / 2 :\n anchorY === 'bottom' ? height :\n anchorY === 'bottom-baseline' ? height - halfLeading + descender * fontSizeMult :\n parsePercent(anchorY) * height;\n }\n }\n\n if (!metricsOnly) {\n // Resolve bidi levels\n const bidiLevelsResult = bidi.getEmbeddingLevels(text, direction);\n\n // Process each line, applying alignment offsets, adding each glyph to the atlas, and\n // collecting all renderable glyphs into a single collection.\n glyphIds = new Uint16Array(renderableGlyphCount);\n glyphPositions = new Float32Array(renderableGlyphCount * 2);\n glyphData = {};\n visibleBounds = [INF, INF, -INF, -INF];\n chunkedBounds = [];\n let lineYOffset = topBaseline;\n if (includeCaretPositions) {\n caretPositions = new Float32Array(text.length * 3);\n }\n if (colorRanges) {\n glyphColors = new Uint8Array(renderableGlyphCount * 3);\n }\n let renderableGlyphIndex = 0;\n let prevCharIndex = -1;\n let colorCharIndex = -1;\n let chunk;\n let currentColor;\n lines.forEach((line, lineIndex) => {\n let {count:lineGlyphCount, width:lineWidth} = line;\n\n // Ignore empty lines\n if (lineGlyphCount > 0) {\n // Count trailing whitespaces, we want to ignore these for certain things\n let trailingWhitespaceCount = 0;\n for (let i = lineGlyphCount; i-- && line.glyphAt(i).glyphObj.isWhitespace;) {\n trailingWhitespaceCount++;\n }\n\n // Apply horizontal alignment adjustments\n let lineXOffset = 0;\n let justifyAdjust = 0;\n if (textAlign === 'center') {\n lineXOffset = (maxLineWidth - lineWidth) / 2;\n } else if (textAlign === 'right') {\n lineXOffset = maxLineWidth - lineWidth;\n } else if (textAlign === 'justify' && line.isSoftWrapped) {\n // count non-trailing whitespace characters, and we'll adjust the offsets per character in the next loop\n let whitespaceCount = 0;\n for (let i = lineGlyphCount - trailingWhitespaceCount; i--;) {\n if (line.glyphAt(i).glyphObj.isWhitespace) {\n whitespaceCount++;\n }\n }\n justifyAdjust = (maxLineWidth - lineWidth) / whitespaceCount;\n }\n if (justifyAdjust || lineXOffset) {\n let justifyOffset = 0;\n for (let i = 0; i < lineGlyphCount; i++) {\n let glyphInfo = line.glyphAt(i);\n const glyphObj = glyphInfo.glyphObj;\n glyphInfo.x += lineXOffset + justifyOffset;\n // Expand non-trailing whitespaces for justify alignment\n if (justifyAdjust !== 0 && glyphObj.isWhitespace && i < lineGlyphCount - trailingWhitespaceCount) {\n justifyOffset += justifyAdjust;\n glyphInfo.width += justifyAdjust;\n }\n }\n }\n\n // Perform bidi range flipping\n const flips = bidi.getReorderSegments(\n text, bidiLevelsResult, line.glyphAt(0).charIndex, line.glyphAt(line.count - 1).charIndex\n );\n for (let fi = 0; fi < flips.length; fi++) {\n const [start, end] = flips[fi];\n // Map start/end string indices to indices in the line\n let left = Infinity, right = -Infinity;\n for (let i = 0; i < lineGlyphCount; i++) {\n if (line.glyphAt(i).charIndex >= start) { // gte to handle removed characters\n let startInLine = i, endInLine = i;\n for (; endInLine < lineGlyphCount; endInLine++) {\n let info = line.glyphAt(endInLine);\n if (info.charIndex > end) {\n break\n }\n if (endInLine < lineGlyphCount - trailingWhitespaceCount) { //don't include trailing ws in flip width\n left = Math.min(left, info.x);\n right = Math.max(right, info.x + info.width);\n }\n }\n for (let j = startInLine; j < endInLine; j++) {\n const glyphInfo = line.glyphAt(j);\n glyphInfo.x = right - (glyphInfo.x + glyphInfo.width - left);\n }\n break\n }\n }\n }\n\n // Assemble final data arrays\n let glyphObj;\n const setGlyphObj = g => glyphObj = g;\n for (let i = 0; i < lineGlyphCount; i++) {\n let glyphInfo = line.glyphAt(i);\n glyphObj = glyphInfo.glyphObj;\n const glyphId = glyphObj.index;\n\n // Replace mirrored characters in rtl\n const rtl = bidiLevelsResult.levels[glyphInfo.charIndex] & 1; //odd level means rtl\n if (rtl) {\n const mirrored = bidi.getMirroredCharacter(text[glyphInfo.charIndex]);\n if (mirrored) {\n fontObj.forEachGlyph(mirrored, 0, 0, setGlyphObj);\n }\n }\n\n // Add caret positions\n if (includeCaretPositions) {\n const {charIndex} = glyphInfo;\n const caretLeft = glyphInfo.x + anchorXOffset;\n const caretRight = glyphInfo.x + glyphInfo.width + anchorXOffset;\n caretPositions[charIndex * 3] = rtl ? caretRight : caretLeft; //start edge x\n caretPositions[charIndex * 3 + 1] = rtl ? caretLeft : caretRight; //end edge x\n caretPositions[charIndex * 3 + 2] = lineYOffset + caretBottomOffset + anchorYOffset; //common bottom y\n\n // If we skipped any chars from the previous glyph (due to ligature subs), fill in caret\n // positions for those missing char indices; currently this uses a best-guess by dividing\n // the ligature's width evenly. In the future we may try to use the font's LigatureCaretList\n // table to get better interior caret positions.\n const ligCount = charIndex - prevCharIndex;\n if (ligCount > 1) {\n fillLigatureCaretPositions(caretPositions, prevCharIndex, ligCount);\n }\n prevCharIndex = charIndex;\n }\n\n // Track current color range\n if (colorRanges) {\n const {charIndex} = glyphInfo;\n while(charIndex > colorCharIndex) {\n colorCharIndex++;\n if (colorRanges.hasOwnProperty(colorCharIndex)) {\n currentColor = colorRanges[colorCharIndex];\n }\n }\n }\n\n // Get atlas data for renderable glyphs\n if (!glyphObj.isWhitespace && !glyphObj.isEmpty) {\n const idx = renderableGlyphIndex++;\n\n // Add this glyph's path data\n if (!glyphData[glyphId]) {\n glyphData[glyphId] = {\n path: glyphObj.path,\n pathBounds: [glyphObj.xMin, glyphObj.yMin, glyphObj.xMax, glyphObj.yMax]\n };\n }\n\n // Determine final glyph position and add to glyphPositions array\n const glyphX = glyphInfo.x + anchorXOffset;\n const glyphY = lineYOffset + anchorYOffset;\n glyphPositions[idx * 2] = glyphX;\n glyphPositions[idx * 2 + 1] = glyphY;\n\n // Track total visible bounds\n const visX0 = glyphX + glyphObj.xMin * fontSizeMult;\n const visY0 = glyphY + glyphObj.yMin * fontSizeMult;\n const visX1 = glyphX + glyphObj.xMax * fontSizeMult;\n const visY1 = glyphY + glyphObj.yMax * fontSizeMult;\n if (visX0 < visibleBounds[0]) visibleBounds[0] = visX0;\n if (visY0 < visibleBounds[1]) visibleBounds[1] = visY0;\n if (visX1 > visibleBounds[2]) visibleBounds[2] = visX1;\n if (visY1 > visibleBounds[3]) visibleBounds[3] = visY1;\n\n // Track bounding rects for each chunk of N glyphs\n if (idx % chunkedBoundsSize === 0) {\n chunk = {start: idx, end: idx, rect: [INF, INF, -INF, -INF]};\n chunkedBounds.push(chunk);\n }\n chunk.end++;\n const chunkRect = chunk.rect;\n if (visX0 < chunkRect[0]) chunkRect[0] = visX0;\n if (visY0 < chunkRect[1]) chunkRect[1] = visY0;\n if (visX1 > chunkRect[2]) chunkRect[2] = visX1;\n if (visY1 > chunkRect[3]) chunkRect[3] = visY1;\n\n // Add to glyph ids array\n glyphIds[idx] = glyphId;\n\n // Add colors\n if (colorRanges) {\n const start = idx * 3;\n glyphColors[start] = currentColor >> 16 & 255;\n glyphColors[start + 1] = currentColor >> 8 & 255;\n glyphColors[start + 2] = currentColor & 255;\n }\n }\n }\n }\n\n // Increment y offset for next line\n lineYOffset -= lineHeight;\n });\n\n // Fill in remaining caret positions in case the final character was a ligature\n if (caretPositions) {\n const ligCount = text.length - prevCharIndex;\n if (ligCount > 1) {\n fillLigatureCaretPositions(caretPositions, prevCharIndex, ligCount);\n }\n }\n }\n\n // Timing stats\n timings.typesetting = now() - typesetStart;\n\n callback({\n glyphIds, //font indices for each glyph\n glyphPositions, //x,y of each glyph's origin in layout\n glyphData, //dict holding data about each glyph appearing in the text\n caretPositions, //startX,endX,bottomY caret positions for each char\n caretHeight, //height of cursor from bottom to top\n glyphColors, //color for each glyph, if color ranges supplied\n chunkedBounds, //total rects per (n=chunkedBoundsSize) consecutive glyphs\n fontSize, //calculated em height\n unitsPerEm, //font units per em\n ascender: ascender * fontSizeMult, //font ascender\n descender: descender * fontSizeMult, //font descender\n capHeight: capHeight * fontSizeMult, //font cap-height\n xHeight: xHeight * fontSizeMult, //font x-height\n lineHeight, //computed line height\n topBaseline, //y coordinate of the top line's baseline\n blockBounds: [ //bounds for the whole block of text, including vertical padding for lineHeight\n anchorXOffset,\n anchorYOffset - lines.length * lineHeight,\n anchorXOffset + maxLineWidth,\n anchorYOffset\n ],\n visibleBounds, //total bounds of visible text paths, may be larger or smaller than blockBounds\n timings\n });\n });\n }\n\n\n /**\n * For a given text string and font parameters, determine the resulting block dimensions\n * after wrapping for the given maxWidth.\n * @param args\n * @param callback\n */\n function measure(args, callback) {\n typeset(args, (result) => {\n const [x0, y0, x1, y1] = result.blockBounds;\n callback({\n width: x1 - x0,\n height: y1 - y0\n });\n }, {metricsOnly: true});\n }\n\n function parsePercent(str) {\n let match = str.match(/^([\\d.]+)%$/);\n let pct = match ? parseFloat(match[1]) : NaN;\n return isNaN(pct) ? 0 : pct / 100\n }\n\n function fillLigatureCaretPositions(caretPositions, ligStartIndex, ligCount) {\n const ligStartX = caretPositions[ligStartIndex * 3];\n const ligEndX = caretPositions[ligStartIndex * 3 + 1];\n const ligY = caretPositions[ligStartIndex * 3 + 2];\n const guessedAdvanceX = (ligEndX - ligStartX) / ligCount;\n for (let i = 0; i < ligCount; i++) {\n const startIndex = (ligStartIndex + i) * 3;\n caretPositions[startIndex] = ligStartX + guessedAdvanceX * i;\n caretPositions[startIndex + 1] = ligStartX + guessedAdvanceX * (i + 1);\n caretPositions[startIndex + 2] = ligY;\n }\n }\n\n function now() {\n return (self.performance || Date).now()\n }\n\n // Array-backed structure for a single line's glyphs data\n function TextLine() {\n this.data = [];\n }\n const textLineProps = ['glyphObj', 'x', 'width', 'charIndex'];\n TextLine.prototype = {\n width: 0,\n isSoftWrapped: false,\n get count() {\n return Math.ceil(this.data.length / textLineProps.length)\n },\n glyphAt(i) {\n let fly = TextLine.flyweight;\n fly.data = this.data;\n fly.index = i;\n return fly\n },\n splitAt(i) {\n let newLine = new TextLine();\n newLine.data = this.data.splice(i * textLineProps.length);\n return newLine\n }\n };\n TextLine.flyweight = textLineProps.reduce((obj, prop, i, all) => {\n Object.defineProperty(obj, prop, {\n get() {\n return this.data[this.index * textLineProps.length + i]\n },\n set(val) {\n this.data[this.index * textLineProps.length + i] = val;\n }\n });\n return obj\n }, {data: null, index: 0});\n\n\n return {\n typeset,\n measure,\n loadFont\n }\n}\n\nconst now = () => (self.performance || Date).now();\n\nconst mainThreadGenerator = /*#__PURE__*/ createSDFGenerator();\n\nlet warned;\n\n/**\n * Generate an SDF texture image for a single glyph path, placing the result into a webgl canvas at a\n * given location and channel. Utilizes the webgl-sdf-generator external package for GPU-accelerated SDF\n * generation when supported.\n */\nfunction generateSDF(width, height, path, viewBox, distance, exponent, canvas, x, y, channel, useWebGL = true) {\n // Allow opt-out\n if (!useWebGL) {\n return generateSDF_JS_Worker(width, height, path, viewBox, distance, exponent, canvas, x, y, channel)\n }\n\n // Attempt GPU-accelerated generation first\n return generateSDF_GL(width, height, path, viewBox, distance, exponent, canvas, x, y, channel).then(\n null,\n err => {\n // WebGL failed either due to a hard error or unexpected results; fall back to JS in workers\n if (!warned) {\n console.warn(`WebGL SDF generation failed, falling back to JS`, err);\n warned = true;\n }\n return generateSDF_JS_Worker(width, height, path, viewBox, distance, exponent, canvas, x, y, channel)\n }\n )\n}\n\nconst queue = [];\nconst chunkTimeBudget = 5; // ms\nlet timer = 0;\n\nfunction nextChunk() {\n const start = now();\n while (queue.length && now() - start < chunkTimeBudget) {\n queue.shift()();\n }\n timer = queue.length ? setTimeout(nextChunk, 0) : 0;\n}\n\n/**\n * WebGL-based implementation executed on the main thread. Requests are executed in time-bounded\n * macrotask chunks to allow render frames to execute in between.\n */\nconst generateSDF_GL = (...args) => {\n return new Promise((resolve, reject) => {\n queue.push(() => {\n const start = now();\n try {\n mainThreadGenerator.webgl.generateIntoCanvas(...args);\n resolve({ timing: now() - start });\n } catch (err) {\n reject(err);\n }\n });\n if (!timer) {\n timer = setTimeout(nextChunk, 0);\n }\n })\n};\n\nconst threadCount = 4; // how many workers to spawn\nconst idleTimeout = 2000; // workers will be terminated after being idle this many milliseconds\nconst threads = {};\nlet callNum = 0;\n\n/**\n * Fallback JS-based implementation, fanned out to a number of worker threads for parallelism\n */\nfunction generateSDF_JS_Worker(width, height, path, viewBox, distance, exponent, canvas, x, y, channel) {\n const workerId = 'TroikaTextSDFGenerator_JS_' + ((callNum++) % threadCount);\n let thread = threads[workerId];\n if (!thread) {\n thread = threads[workerId] = {\n workerModule: defineWorkerModule({\n name: workerId,\n workerId,\n dependencies: [\n createSDFGenerator,\n now\n ],\n init(_createSDFGenerator, now) {\n const generate = _createSDFGenerator().javascript.generate;\n return function (...args) {\n const start = now();\n const textureData = generate(...args);\n return {\n textureData,\n timing: now() - start\n }\n }\n },\n getTransferables(result) {\n return [result.textureData.buffer]\n }\n }),\n requests: 0,\n idleTimer: null\n };\n }\n\n thread.requests++;\n clearTimeout(thread.idleTimer);\n return thread.workerModule(width, height, path, viewBox, distance, exponent)\n .then(({ textureData, timing }) => {\n // copy result data into the canvas\n const start = now();\n // expand single-channel data into rgba\n const imageData = new Uint8Array(textureData.length * 4);\n for (let i = 0; i < textureData.length; i++) {\n imageData[i * 4 + channel] = textureData[i];\n }\n mainThreadGenerator.webglUtils.renderImageData(canvas, imageData, x, y, width, height, 1 << (3 - channel));\n timing += now() - start;\n\n // clean up workers after a while\n if (--thread.requests === 0) {\n thread.idleTimer = setTimeout(() => { terminateWorker(workerId); }, idleTimeout);\n }\n return { timing }\n })\n}\n\nfunction warmUpSDFCanvas(canvas) {\n if (!canvas._warm) {\n mainThreadGenerator.webgl.isSupported(canvas);\n canvas._warm = true;\n }\n}\n\nconst resizeWebGLCanvasWithoutClearing = mainThreadGenerator.webglUtils.resizeWebGLCanvasWithoutClearing;\n\n/*!\nCustom build of Typr.ts (https://github.com/fredli74/Typr.ts) for use in Troika text rendering.\nOriginal MIT license applies: https://github.com/fredli74/Typr.ts/blob/master/LICENSE\n*/\nfunction typrFactory(){return \"undefined\"==typeof window&&(self.window=self),function(r){var e={parse:function(r){var t=e._bin,a=new Uint8Array(r);if(\"ttcf\"==t.readASCII(a,0,4)){var n=4;t.readUshort(a,n),n+=2,t.readUshort(a,n),n+=2;var o=t.readUint(a,n);n+=4;for(var s=[],i=0;i>>t&1)&&e++;return e},e._lctf.readClassDef=function(r,t){var a=e._bin,n=[],o=a.readUshort(r,t);if(t+=2,1==o){var s=a.readUshort(r,t);t+=2;var i=a.readUshort(r,t);t+=2;for(var h=0;h0&&(o.featureParams=n+s);var i=a.readUshort(r,t);t+=2,o.tab=[];for(var h=0;h255?-1:e.CFF.glyphByUnicode(r,e.CFF.tableSE[t])},e.CFF.readEncoding=function(r,t,a){e._bin;var n=[\".notdef\"],o=r[t];if(t++,0!=o)throw \"error: unknown encoding format: \"+o;var s=r[t];t++;for(var i=0;i>4,p=15&v;if(15!=c&&l.push(c),15!=p&&l.push(p),15==p)break}for(var U=\"\",g=[0,1,2,3,4,5,6,7,8,9,\".\",\"e\",\"e-\",\"reserved\",\"-\",\"endOfNumber\"],S=0;S=s.xMax||s.yMin>=s.yMax)return null;if(s.noc>0){s.endPts=[];for(var i=0;i=1&&i.fmt<=2){f=o.readUshort(r,a);a+=2;var u=o.readUshort(r,a);a+=2;d=e._lctf.numOfOnes(f);var l=e._lctf.numOfOnes(u);if(1==i.fmt){i.pairsets=[];var v=o.readUshort(r,a);a+=2;for(var c=0;c=1&&i.fmt<=2){if(1==i.fmt)i.delta=o.readShort(r,a),a+=2;else if(2==i.fmt){var f=o.readUshort(r,a);a+=2,i.newg=o.readUshorts(r,a,f),a+=2*i.newg.length;}}else if(4==t){i.vals=[];f=o.readUshort(r,a);a+=2;for(var d=0;d>>8;if(0!=(u&=15))throw \"unknown kern table format: \"+u;t=e.kern.readFormat0(r,t,h);}return h},e.kern.parseV1=function(r,t,a,n){var o=e._bin;o.readFixed(r,t),t+=4;var s=o.readUint(r,t);t+=4;for(var i={glyph1:[],rval:[]},h=0;h>>8;if(0!=(d&=15))throw \"unknown kern table format: \"+d;t=e.kern.readFormat0(r,t,i);}return i},e.kern.readFormat0=function(r,t,a){var n=e._bin,o=-1,s=n.readUshort(r,t);t+=2,n.readUshort(r,t),t+=2,n.readUshort(r,t),t+=2,n.readUshort(r,t),t+=2;for(var i=0;i=n.map.length?0:n.map[e];if(4==n.format){for(var o=-1,s=0;se)return 0;return 65535&(0!=n.idRangeOffset[o]?n.glyphIdArray[e-n.startCount[o]+(n.idRangeOffset[o]>>1)-(n.idRangeOffset.length-o)]:e+n.idDelta[o])}if(12==n.format){if(e>n.groups[n.groups.length-1][1])return 0;for(s=0;s-1?e.U._simpleGlyph(n,a):e.U._compoGlyph(n,t,a));},e.U._simpleGlyph=function(r,t){for(var a=0;ao)){for(var v=!0,c=0,p=0;po)){for(v=!0,p=0;p>1,s.length=0,h=!0;else if(\"o3\"==x||\"o23\"==x){s.length%2!=0&&!h&&(f=s.shift()+n.nominalWidthX),i+=s.length>>1,s.length=0,h=!0;}else if(\"o4\"==x)s.length>1&&!h&&(f=s.shift()+n.nominalWidthX,h=!0),d&&e.U.P.closePath(o),v+=s.pop(),e.U.P.moveTo(o,l,v),d=!0;else if(\"o5\"==x)for(;s.length>0;)l+=s.shift(),v+=s.shift(),e.U.P.lineTo(o,l,v);else if(\"o6\"==x||\"o7\"==x)for(var P=s.length,I=\"o6\"==x,w=0;wMath.abs(y-v)?l=b+s.shift():v=y+s.shift(),e.U.P.curveTo(o,c,p,U,g,F,_),e.U.P.curveTo(o,S,m,b,y,l,v));else if(\"o14\"==x){if(s.length>0&&!h&&(f=s.shift()+a.nominalWidthX,h=!0),4==s.length){var k=s.shift(),G=s.shift(),D=s.shift(),B=s.shift(),L=e.CFF.glyphBySE(a,D),R=e.CFF.glyphBySE(a,B);e.U._drawCFF(a.CharStrings[L],t,a,n,o),t.x=k,t.y=G,e.U._drawCFF(a.CharStrings[R],t,a,n,o);}d&&(e.U.P.closePath(o),d=!1);}else if(\"o19\"==x||\"o20\"==x){s.length%2!=0&&!h&&(f=s.shift()+n.nominalWidthX),i+=s.length>>1,s.length=0,h=!0,u+=i+7>>3;}else if(\"o21\"==x)s.length>2&&!h&&(f=s.shift()+n.nominalWidthX,h=!0),v+=s.pop(),l+=s.pop(),d&&e.U.P.closePath(o),e.U.P.moveTo(o,l,v),d=!0;else if(\"o22\"==x)s.length>1&&!h&&(f=s.shift()+n.nominalWidthX,h=!0),l+=s.pop(),d&&e.U.P.closePath(o),e.U.P.moveTo(o,l,v),d=!0;else if(\"o25\"==x){for(;s.length>6;)l+=s.shift(),v+=s.shift(),e.U.P.lineTo(o,l,v);c=l+s.shift(),p=v+s.shift(),U=c+s.shift(),g=p+s.shift(),l=U+s.shift(),v=g+s.shift(),e.U.P.curveTo(o,c,p,U,g,l,v);}else if(\"o26\"==x)for(s.length%2&&(l+=s.shift());s.length>0;)c=l,p=v+s.shift(),l=U=c+s.shift(),v=(g=p+s.shift())+s.shift(),e.U.P.curveTo(o,c,p,U,g,l,v);else if(\"o27\"==x)for(s.length%2&&(v+=s.shift());s.length>0;)p=v,U=(c=l+s.shift())+s.shift(),g=p+s.shift(),l=U+s.shift(),v=g,e.U.P.curveTo(o,c,p,U,g,l,v);else if(\"o10\"==x||\"o29\"==x){var A=\"o10\"==x?n:a;if(0==s.length)console.debug(\"error: empty stack\");else {var W=s.pop(),M=A.Subrs[W+A.Bias];t.x=l,t.y=v,t.nStems=i,t.haveWidth=h,t.width=f,t.open=d,e.U._drawCFF(M,t,a,n,o),l=t.x,v=t.y,i=t.nStems,h=t.haveWidth,f=t.width,d=t.open;}}else if(\"o30\"==x||\"o31\"==x){var V=s.length,N=(T=0,\"o31\"==x);for(T+=V-(P=-3&V);T>>1|(21845&g)<<1;h=(61680&(h=(52428&h)>>>2|(13107&h)<<2))>>>4|(3855&h)<<4,c[g]=((65280&h)>>>8|(255&h)<<8)>>>1;}var w=function(r,e,t){for(var a=r.length,i=0,o=new n(e);i>>v]=s;}else for(f=new n(a),i=0;i>>15-r[i]);return f},d=new e(288);for(g=0;g<144;++g)d[g]=8;for(g=144;g<256;++g)d[g]=9;for(g=256;g<280;++g)d[g]=7;for(g=280;g<288;++g)d[g]=8;var m=new e(32);for(g=0;g<32;++g)m[g]=5;var b=w(d,9,1),p=w(m,5,1),y=function(r){for(var e=r[0],n=1;ne&&(e=r[n]);return e},L=function(r,e,n){var t=e/8|0;return (r[t]|r[t+1]<<8)>>(7&e)&n},U=function(r,e){var n=e/8|0;return (r[n]|r[n+1]<<8|r[n+2]<<16)>>(7&e)},k=[\"unexpected EOF\",\"invalid block type\",\"invalid length/literal\",\"invalid distance\",\"stream finished\",\"no stream handler\",,\"no callback\",\"invalid UTF-8 data\",\"extra field too long\",\"date not in range 1980-2099\",\"filename too long\",\"stream finishing\",\"invalid zip data\"],T=function(r,e,n){var t=new Error(e||k[r]);if(t.code=r,Error.captureStackTrace&&Error.captureStackTrace(t,T),!n)throw t;return t},O=function(r,f,u){var s=r.length;if(!s||u&&!u.l&&s<5)return f||new e(0);var c=!f||u,g=!u||u.i;u||(u={}),f||(f=new e(3*s));var h,d=function(r){var n=f.length;if(r>n){var t=new e(Math.max(2*n,r));t.set(f),f=t;}},m=u.f||0,k=u.p||0,O=u.b||0,A=u.l,x=u.d,E=u.m,D=u.n,M=8*s;do{if(!A){u.f=m=L(r,k,1);var S=L(r,k+1,3);if(k+=3,!S){var V=r[(I=((h=k)/8|0)+(7&h&&1)+4)-4]|r[I-3]<<8,_=I+V;if(_>s){g&&T(0);break}c&&d(O+V),f.set(r.subarray(I,_),O),u.b=O+=V,u.p=k=8*_;continue}if(1==S)A=b,x=p,E=9,D=5;else if(2==S){var j=L(r,k,31)+257,z=L(r,k+10,15)+4,C=j+L(r,k+5,31)+1;k+=14;for(var F=new e(C),P=new e(19),q=0;q>>4)<16)F[q++]=I;else {var K=0,N=0;for(16==I?(N=3+L(r,k,3),k+=2,K=F[q-1]):17==I?(N=3+L(r,k,7),k+=3):18==I&&(N=11+L(r,k,127),k+=7);N--;)F[q++]=K;}}var Q=F.subarray(0,j),R=F.subarray(j);E=y(Q),D=y(R),A=w(Q,E,1),x=w(R,D,1);}else T(1);if(k>M){g&&T(0);break}}c&&d(O+131072);for(var W=(1<>>4;if((k+=15&K)>M){g&&T(0);break}if(K||T(2),Z<256)f[O++]=Z;else {if(256==Z){Y=k,A=null;break}var $=Z-254;if(Z>264){var rr=a[q=Z-257];$=L(r,k,(1<>>4;er||T(3),k+=15&er;R=l[nr];if(nr>3){rr=i[nr];R+=U(r,k)&(1<M){g&&T(0);break}c&&d(O+131072);for(var tr=O+$;Or.length)&&(i=r.length);var o=new(r instanceof n?n:r instanceof t?t:e)(i-a);return o.set(r.subarray(a,i)),o}(f,0,O)},A=new e(0);var x=\"undefined\"!=typeof TextDecoder&&new TextDecoder;try{x.decode(A,{stream:!0}),1;}catch(r){}return r.convert_streams=function(r){var e=new DataView(r),n=0;function t(){var r=e.getUint16(n);return n+=2,r}function a(){var r=e.getUint32(n);return n+=4,r}function i(r){m.setUint16(b,r),b+=2;}function o(r){m.setUint32(b,r),b+=4;}for(var f={signature:a(),flavor:a(),length:a(),numTables:t(),reserved:t(),totalSfntSize:a(),majorVersion:t(),minorVersion:t(),metaOffset:a(),metaLength:a(),metaOrigLength:a(),privOffset:a(),privLength:a()},u=0;Math.pow(2,u)<=f.numTables;)u++;u--;for(var v=16*Math.pow(2,u),s=16*f.numTables-v,l=12,c=[],g=0;g {\n let [skip, step] = range.split('+');\n skip = parseInt(skip,36);\n step = step ? parseInt(step, 36) : 0;\n joiningTypeMap.set(lastCode += skip, m[type]);\n for (let i = step; i--;) {\n joiningTypeMap.set(++lastCode, m[type]);\n }\n });\n }\n }\n return joiningTypeMap.get(ch) || JT_NON_JOINING\n }\n\n const ISOL = 1, INIT = 2, FINA = 3, MEDI = 4;\n const formsToFeatures = [null, 'isol', 'init', 'fina', 'medi'];\n\n function detectJoiningForms(str) {\n // This implements the algorithm described here:\n // https://github.com/n8willis/opentype-shaping-documents/blob/master/opentype-shaping-arabic-general.md\n const joiningForms = new Uint8Array(str.length);\n let prevJoiningType = JT_NON_JOINING;\n let prevForm = ISOL;\n let prevIndex = -1;\n for (let i = 0; i < str.length; i++) {\n const code = str.codePointAt(i);\n let joiningType = getCharJoiningType(code) | 0;\n let form = ISOL;\n if (joiningType & JT_TRANSPARENT) {\n continue\n }\n if (prevJoiningType & (JT_LEFT | JT_DUAL | JT_JOIN_CAUSING)) {\n if (joiningType & (JT_RIGHT | JT_DUAL | JT_JOIN_CAUSING)) {\n form = FINA;\n // isol->init, fina->medi\n if (prevForm === ISOL || prevForm === FINA) {\n joiningForms[prevIndex]++;\n }\n }\n else if (joiningType & (JT_LEFT | JT_NON_JOINING)) {\n // medi->fina, init->isol\n if (prevForm === INIT || prevForm === MEDI) {\n joiningForms[prevIndex]--;\n }\n }\n }\n else if (prevJoiningType & (JT_RIGHT | JT_NON_JOINING)) {\n // medi->fina, init->isol\n if (prevForm === INIT || prevForm === MEDI) {\n joiningForms[prevIndex]--;\n }\n }\n prevForm = joiningForms[i] = form;\n prevJoiningType = joiningType;\n prevIndex = i;\n if (code > 0xffff) i++;\n }\n // console.log(str.split('').map(ch => ch.codePointAt(0).toString(16)))\n // console.log(str.split('').map(ch => getCharJoiningType(ch.codePointAt(0))))\n // console.log(Array.from(joiningForms).map(f => formsToFeatures[f] || 'none'))\n return joiningForms\n }\n\n function stringToGlyphs (font, str) {\n const glyphIds = [];\n for (let i = 0; i < str.length; i++) {\n const cc = str.codePointAt(i);\n if (cc > 0xffff) i++;\n glyphIds.push(Typr.U.codeToGlyph(font, cc));\n }\n\n const gsub = font['GSUB'];\n if (gsub) {\n const {lookupList, featureList} = gsub;\n let joiningForms;\n const supportedFeatures = /^(rlig|liga|mset|isol|init|fina|medi|half|pres|blws)$/;\n const usedLookups = [];\n featureList.forEach(feature => {\n if (supportedFeatures.test(feature.tag)) {\n for (let ti = 0; ti < feature.tab.length; ti++) {\n if (usedLookups[feature.tab[ti]]) continue\n usedLookups[feature.tab[ti]] = true;\n const tab = lookupList[feature.tab[ti]];\n const isJoiningFeature = /^(isol|init|fina|medi)$/.test(feature.tag);\n if (isJoiningFeature && !joiningForms) { //lazy\n joiningForms = detectJoiningForms(str);\n }\n for (let ci = 0; ci < glyphIds.length; ci++) {\n if (!joiningForms || !isJoiningFeature || formsToFeatures[joiningForms[ci]] === feature.tag) {\n Typr.U._applySubs(glyphIds, ci, tab, lookupList);\n }\n }\n }\n }\n });\n }\n\n return glyphIds\n }\n\n function firstNum(...args) {\n for (let i = 0; i < args.length; i++) {\n if (typeof args[i] === 'number') {\n return args[i]\n }\n }\n }\n\n function wrapFontObj(typrFont) {\n const glyphMap = Object.create(null);\n\n const os2 = typrFont['OS/2'];\n const hhea = typrFont.hhea;\n const unitsPerEm = typrFont.head.unitsPerEm;\n const ascender = firstNum(os2 && os2.sTypoAscender, hhea && hhea.ascender, unitsPerEm);\n\n const fontObj = {\n unitsPerEm,\n ascender,\n descender: firstNum(os2 && os2.sTypoDescender, hhea && hhea.descender, 0),\n capHeight: firstNum(os2 && os2.sCapHeight, ascender),\n xHeight: firstNum(os2 && os2.sxHeight, ascender),\n lineGap: firstNum(os2 && os2.sTypoLineGap, hhea && hhea.lineGap),\n forEachGlyph(text, fontSize, letterSpacing, callback) {\n let glyphX = 0;\n const fontScale = 1 / fontObj.unitsPerEm * fontSize;\n\n const glyphIndices = stringToGlyphs(typrFont, text);\n let charIndex = 0;\n let prevGlyphIndex = -1;\n glyphIndices.forEach((glyphIndex, i) => {\n // Typr returns a glyph index per string codepoint, with -1s in place of those that\n // were omitted due to ligature substitution. So we can track original index in the\n // string via simple increment, and skip everything else when seeing a -1.\n if (glyphIndex !== -1) {\n let glyphObj = glyphMap[glyphIndex];\n if (!glyphObj) {\n const {cmds, crds} = Typr.U.glyphToPath(typrFont, glyphIndex);\n\n // Build path string\n let path = '';\n let crdsIdx = 0;\n for (let i = 0, len = cmds.length; i < len; i++) {\n const numArgs = cmdArgLengths[cmds[i]];\n path += cmds[i];\n for (let j = 1; j <= numArgs; j++) {\n path += (j > 1 ? ',' : '') + crds[crdsIdx++];\n }\n }\n\n // Find extents - Glyf gives this in metadata but not CFF, and Typr doesn't\n // normalize the two, so it's simplest just to iterate ourselves.\n let xMin, yMin, xMax, yMax;\n if (crds.length) {\n xMin = yMin = Infinity;\n xMax = yMax = -Infinity;\n for (let i = 0, len = crds.length; i < len; i += 2) {\n let x = crds[i];\n let y = crds[i + 1];\n if (x < xMin) xMin = x;\n if (y < yMin) yMin = y;\n if (x > xMax) xMax = x;\n if (y > yMax) yMax = y;\n }\n } else {\n xMin = xMax = yMin = yMax = 0;\n }\n\n glyphObj = glyphMap[glyphIndex] = {\n index: glyphIndex,\n advanceWidth: typrFont.hmtx.aWidth[glyphIndex],\n xMin,\n yMin,\n xMax,\n yMax,\n path,\n pathCommandCount: cmds.length,\n // forEachPathCommand(callback) {\n // let argsIndex = 0\n // const argsArray = []\n // for (let i = 0, len = cmds.length; i < len; i++) {\n // const numArgs = cmdArgLengths[cmds[i]]\n // argsArray.length = 1 + numArgs\n // argsArray[0] = cmds[i]\n // for (let j = 1; j <= numArgs; j++) {\n // argsArray[j] = crds[argsIndex++]\n // }\n // callback.apply(null, argsArray)\n // }\n // }\n };\n }\n\n // Kerning\n if (prevGlyphIndex !== -1) {\n glyphX += Typr.U.getPairAdjustment(typrFont, prevGlyphIndex, glyphIndex) * fontScale;\n }\n\n callback.call(null, glyphObj, glyphX, charIndex);\n\n if (glyphObj.advanceWidth) {\n glyphX += glyphObj.advanceWidth * fontScale;\n }\n if (letterSpacing) {\n glyphX += letterSpacing * fontSize;\n }\n\n prevGlyphIndex = glyphIndex;\n }\n charIndex += (text.codePointAt(charIndex) > 0xffff ? 2 : 1);\n });\n return glyphX\n }\n };\n\n return fontObj\n }\n\n return function parse(buffer) {\n // Look to see if we have a WOFF file and convert it if so:\n const peek = new Uint8Array(buffer, 0, 4);\n const tag = Typr._bin.readASCII(peek, 0, 4);\n if (tag === 'wOFF') {\n buffer = woff2otf(buffer);\n } else if (tag === 'wOF2') {\n throw new Error('woff2 fonts not supported')\n }\n return wrapFontObj(Typr.parse(buffer)[0])\n }\n}\n\n\nconst workerModule = /*#__PURE__*/defineWorkerModule({\n name: 'Typr Font Parser',\n dependencies: [typrFactory, woff2otfFactory, parserFactory],\n init(typrFactory, woff2otfFactory, parserFactory) {\n const Typr = typrFactory();\n const woff2otf = woff2otfFactory();\n return parserFactory(Typr, woff2otf)\n }\n});\n\nconst CONFIG = {\n defaultFontURL: 'https://fonts.gstatic.com/s/roboto/v18/KFOmCnqEu92Fr1Mu4mxM.woff', //Roboto Regular\n sdfGlyphSize: 64,\n sdfMargin: 1 / 16,\n sdfExponent: 9,\n textureWidth: 2048\n};\nconst tempColor = /*#__PURE__*/new Color();\nlet hasRequested = false;\n\nfunction now$1() {\n return (self.performance || Date).now()\n}\n\n/**\n * Customizes the text builder configuration. This must be called prior to the first font processing\n * request, and applies to all fonts.\n *\n * @param {String} config.defaultFontURL - The URL of the default font to use for text processing\n * requests, in case none is specified or the specifiede font fails to load or parse.\n * Defaults to \"Roboto Regular\" from Google Fonts.\n * @param {Number} config.sdfGlyphSize - The default size of each glyph's SDF (signed distance field)\n * texture used for rendering. Must be a power-of-two number, and applies to all fonts,\n * but note that this can also be overridden per call to `getTextRenderInfo()`.\n * Larger sizes can improve the quality of glyph rendering by increasing the sharpness\n * of corners and preventing loss of very thin lines, at the expense of memory. Defaults\n * to 64 which is generally a good balance of size and quality.\n * @param {Number} config.sdfExponent - The exponent used when encoding the SDF values. A higher exponent\n * shifts the encoded 8-bit values to achieve higher precision/accuracy at texels nearer\n * the glyph's path, with lower precision further away. Defaults to 9.\n * @param {Number} config.sdfMargin - How much space to reserve in the SDF as margin outside the glyph's\n * path, as a percentage of the SDF width. A larger margin increases the quality of\n * extruded glyph outlines, but decreases the precision available for the glyph itself.\n * Defaults to 1/16th of the glyph size.\n * @param {Number} config.textureWidth - The width of the SDF texture; must be a power of 2. Defaults to\n * 2048 which is a safe maximum texture dimension according to the stats at\n * https://webglstats.com/webgl/parameter/MAX_TEXTURE_SIZE and should allow for a\n * reasonably large number of glyphs (default glyph size of 64^2 and safe texture size of\n * 2048^2, times 4 channels, allows for 4096 glyphs.) This can be increased if you need to\n * increase the glyph size and/or have an extraordinary number of glyphs.\n */\nfunction configureTextBuilder(config) {\n if (hasRequested) {\n console.warn('configureTextBuilder called after first font request; will be ignored.');\n } else {\n assign(CONFIG, config);\n }\n}\n\n/**\n * Repository for all font SDF atlas textures and their glyph mappings. There is a separate atlas for\n * each sdfGlyphSize. Each atlas has a single Texture that holds all glyphs for all fonts.\n *\n * {\n * [sdfGlyphSize]: {\n * glyphCount: number,\n * sdfGlyphSize: number,\n * sdfTexture: Texture,\n * sdfCanvas: HTMLCanvasElement,\n * contextLost: boolean,\n * glyphsByFont: Map>\n * }\n * }\n */\nconst atlases = Object.create(null);\n\n/**\n * @typedef {object} TroikaTextRenderInfo - Format of the result from `getTextRenderInfo`.\n * @property {object} parameters - The normalized input arguments to the render call.\n * @property {Texture} sdfTexture - The SDF atlas texture.\n * @property {number} sdfGlyphSize - The size of each glyph's SDF; see `configureTextBuilder`.\n * @property {number} sdfExponent - The exponent used in encoding the SDF's values; see `configureTextBuilder`.\n * @property {Float32Array} glyphBounds - List of [minX, minY, maxX, maxY] quad bounds for each glyph.\n * @property {Float32Array} glyphAtlasIndices - List holding each glyph's index in the SDF atlas.\n * @property {Uint8Array} [glyphColors] - List holding each glyph's [r, g, b] color, if `colorRanges` was supplied.\n * @property {Float32Array} [caretPositions] - A list of caret positions for all characters in the string; each is\n * three elements: the starting X, the ending X, and the bottom Y for the caret.\n * @property {number} [caretHeight] - An appropriate height for all selection carets.\n * @property {number} ascender - The font's ascender metric.\n * @property {number} descender - The font's descender metric.\n * @property {number} capHeight - The font's cap height metric, based on the height of Latin capital letters.\n * @property {number} xHeight - The font's x height metric, based on the height of Latin lowercase letters.\n * @property {number} lineHeight - The final computed lineHeight measurement.\n * @property {number} topBaseline - The y position of the top line's baseline.\n * @property {Array} blockBounds - The total [minX, minY, maxX, maxY] rect of the whole text block;\n * this can include extra vertical space beyond the visible glyphs due to lineHeight, and is\n * equivalent to the dimensions of a block-level text element in CSS.\n * @property {Array} visibleBounds - The total [minX, minY, maxX, maxY] rect of the whole text block;\n * unlike `blockBounds` this is tightly wrapped to the visible glyph paths.\n * @property {Array} chunkedBounds - List of bounding rects for each consecutive set of N glyphs,\n * in the format `{start:N, end:N, rect:[minX, minY, maxX, maxY]}`.\n * @property {object} timings - Timing info for various parts of the rendering logic including SDF\n * generation, typesetting, etc.\n * @frozen\n */\n\n/**\n * @callback getTextRenderInfo~callback\n * @param {TroikaTextRenderInfo} textRenderInfo\n */\n\n/**\n * Main entry point for requesting the data needed to render a text string with given font parameters.\n * This is an asynchronous call, performing most of the logic in a web worker thread.\n * @param {object} args\n * @param {getTextRenderInfo~callback} callback\n */\nfunction getTextRenderInfo(args, callback) {\n hasRequested = true;\n args = assign({}, args);\n const totalStart = now$1();\n\n // Apply default font here to avoid a 'null' atlas, and convert relative\n // URLs to absolute so they can be resolved in the worker\n args.font = toAbsoluteURL(args.font || CONFIG.defaultFontURL);\n\n // Normalize text to a string\n args.text = '' + args.text;\n\n args.sdfGlyphSize = args.sdfGlyphSize || CONFIG.sdfGlyphSize;\n\n // Normalize colors\n if (args.colorRanges != null) {\n let colors = {};\n for (let key in args.colorRanges) {\n if (args.colorRanges.hasOwnProperty(key)) {\n let val = args.colorRanges[key];\n if (typeof val !== 'number') {\n val = tempColor.set(val).getHex();\n }\n colors[key] = val;\n }\n }\n args.colorRanges = colors;\n }\n\n Object.freeze(args);\n\n // Init the atlas if needed\n const {textureWidth, sdfExponent} = CONFIG;\n const {sdfGlyphSize} = args;\n const glyphsPerRow = (textureWidth / sdfGlyphSize * 4);\n let atlas = atlases[sdfGlyphSize];\n if (!atlas) {\n const canvas = document.createElement('canvas');\n canvas.width = textureWidth;\n canvas.height = sdfGlyphSize * 256 / glyphsPerRow; // start tall enough to fit 256 glyphs\n atlas = atlases[sdfGlyphSize] = {\n glyphCount: 0,\n sdfGlyphSize,\n sdfCanvas: canvas,\n sdfTexture: new Texture(\n canvas,\n undefined,\n undefined,\n undefined,\n LinearFilter,\n LinearFilter\n ),\n contextLost: false,\n glyphsByFont: new Map()\n };\n atlas.sdfTexture.generateMipmaps = false;\n initContextLossHandling(atlas);\n }\n\n const {sdfTexture, sdfCanvas} = atlas;\n let fontGlyphs = atlas.glyphsByFont.get(args.font);\n if (!fontGlyphs) {\n atlas.glyphsByFont.set(args.font, fontGlyphs = new Map());\n }\n\n // Issue request to the typesetting engine in the worker\n typesetInWorker(args).then(result => {\n const {glyphIds, glyphPositions, fontSize, unitsPerEm, timings} = result;\n const neededSDFs = [];\n const glyphBounds = new Float32Array(glyphIds.length * 4);\n const fontSizeMult = fontSize / unitsPerEm;\n let boundsIdx = 0;\n let positionsIdx = 0;\n const quadsStart = now$1();\n glyphIds.forEach((glyphId, i) => {\n let glyphInfo = fontGlyphs.get(glyphId);\n\n // If this is a glyphId not seen before, add it to the atlas\n if (!glyphInfo) {\n const {path, pathBounds} = result.glyphData[glyphId];\n\n // Margin around path edges in SDF, based on a percentage of the glyph's max dimension.\n // Note we add an extra 0.5 px over the configured value because the outer 0.5 doesn't contain\n // useful interpolated values and will be ignored anyway.\n const fontUnitsMargin = Math.max(pathBounds[2] - pathBounds[0], pathBounds[3] - pathBounds[1])\n / sdfGlyphSize * (CONFIG.sdfMargin * sdfGlyphSize + 0.5);\n\n const atlasIndex = atlas.glyphCount++;\n const sdfViewBox = [\n pathBounds[0] - fontUnitsMargin,\n pathBounds[1] - fontUnitsMargin,\n pathBounds[2] + fontUnitsMargin,\n pathBounds[3] + fontUnitsMargin,\n ];\n fontGlyphs.set(glyphId, (glyphInfo = { path, atlasIndex, sdfViewBox }));\n\n // Collect those that need SDF generation\n neededSDFs.push(glyphInfo);\n }\n\n // Calculate bounds for renderable quads\n // TODO can we get this back off the main thread?\n const {sdfViewBox} = glyphInfo;\n const posX = glyphPositions[positionsIdx++];\n const posY = glyphPositions[positionsIdx++];\n glyphBounds[boundsIdx++] = posX + sdfViewBox[0] * fontSizeMult;\n glyphBounds[boundsIdx++] = posY + sdfViewBox[1] * fontSizeMult;\n glyphBounds[boundsIdx++] = posX + sdfViewBox[2] * fontSizeMult;\n glyphBounds[boundsIdx++] = posY + sdfViewBox[3] * fontSizeMult;\n\n // Convert glyphId to SDF index for the shader\n glyphIds[i] = glyphInfo.atlasIndex;\n });\n timings.quads = (timings.quads || 0) + (now$1() - quadsStart);\n\n const sdfStart = now$1();\n timings.sdf = {};\n\n // Grow the texture height by power of 2 if needed\n const currentHeight = sdfCanvas.height;\n const neededRows = Math.ceil(atlas.glyphCount / glyphsPerRow);\n const neededHeight = Math.pow(2, Math.ceil(Math.log2(neededRows * sdfGlyphSize)));\n if (neededHeight > currentHeight) {\n // Since resizing the canvas clears its render buffer, it needs special handling to copy the old contents over\n console.info(`Increasing SDF texture size ${currentHeight}->${neededHeight}`);\n resizeWebGLCanvasWithoutClearing(sdfCanvas, textureWidth, neededHeight);\n // As of Three r136 textures cannot be resized once they're allocated on the GPU, we must dispose to reallocate it\n sdfTexture.dispose();\n }\n\n Promise.all(neededSDFs.map(glyphInfo =>\n generateGlyphSDF(glyphInfo, atlas, args.gpuAccelerateSDF).then(({timing}) => {\n timings.sdf[glyphInfo.atlasIndex] = timing;\n })\n )).then(() => {\n if (neededSDFs.length && !atlas.contextLost) {\n safariPre15Workaround(atlas);\n sdfTexture.needsUpdate = true;\n }\n timings.sdfTotal = now$1() - sdfStart;\n timings.total = now$1() - totalStart;\n // console.log(`SDF - ${timings.sdfTotal}, Total - ${timings.total - timings.fontLoad}`)\n\n // Invoke callback with the text layout arrays and updated texture\n callback(Object.freeze({\n parameters: args,\n sdfTexture,\n sdfGlyphSize,\n sdfExponent,\n glyphBounds,\n glyphAtlasIndices: glyphIds,\n glyphColors: result.glyphColors,\n caretPositions: result.caretPositions,\n caretHeight: result.caretHeight,\n chunkedBounds: result.chunkedBounds,\n ascender: result.ascender,\n descender: result.descender,\n lineHeight: result.lineHeight,\n capHeight: result.capHeight,\n xHeight: result.xHeight,\n topBaseline: result.topBaseline,\n blockBounds: result.blockBounds,\n visibleBounds: result.visibleBounds,\n timings: result.timings,\n }));\n });\n });\n\n // While the typesetting request is being handled, go ahead and make sure the atlas canvas context is\n // \"warmed up\"; the first request will be the longest due to shader program compilation so this gets\n // a head start on that process before SDFs actually start getting processed.\n Promise.resolve().then(() => {\n if (!atlas.contextLost) {\n warmUpSDFCanvas(sdfCanvas);\n }\n });\n}\n\nfunction generateGlyphSDF({path, atlasIndex, sdfViewBox}, {sdfGlyphSize, sdfCanvas, contextLost}, useGPU) {\n if (contextLost) {\n // If the context is lost there's nothing we can do, just quit silently and let it\n // get regenerated when the context is restored\n return Promise.resolve({timing: -1})\n }\n const {textureWidth, sdfExponent} = CONFIG;\n const maxDist = Math.max(sdfViewBox[2] - sdfViewBox[0], sdfViewBox[3] - sdfViewBox[1]);\n const squareIndex = Math.floor(atlasIndex / 4);\n const x = squareIndex % (textureWidth / sdfGlyphSize) * sdfGlyphSize;\n const y = Math.floor(squareIndex / (textureWidth / sdfGlyphSize)) * sdfGlyphSize;\n const channel = atlasIndex % 4;\n return generateSDF(sdfGlyphSize, sdfGlyphSize, path, sdfViewBox, maxDist, sdfExponent, sdfCanvas, x, y, channel, useGPU)\n}\n\nfunction initContextLossHandling(atlas) {\n const canvas = atlas.sdfCanvas;\n\n /*\n // Begin context loss simulation\n if (!window.WebGLDebugUtils) {\n let script = document.getElementById('WebGLDebugUtilsScript')\n if (!script) {\n script = document.createElement('script')\n script.id = 'WebGLDebugUtils'\n document.head.appendChild(script)\n script.src = 'https://cdn.jsdelivr.net/gh/KhronosGroup/WebGLDeveloperTools@b42e702/src/debug/webgl-debug.js'\n }\n script.addEventListener('load', () => {\n initContextLossHandling(atlas)\n })\n return\n }\n window.WebGLDebugUtils.makeLostContextSimulatingCanvas(canvas)\n canvas.loseContextInNCalls(500)\n canvas.addEventListener('webglcontextrestored', (event) => {\n canvas.loseContextInNCalls(5000)\n })\n // End context loss simulation\n */\n\n canvas.addEventListener('webglcontextlost', (event) => {\n console.log('Context Lost', event);\n event.preventDefault();\n atlas.contextLost = true;\n });\n canvas.addEventListener('webglcontextrestored', (event) => {\n console.log('Context Restored', event);\n atlas.contextLost = false;\n // Regenerate all glyphs into the restored canvas:\n const promises = [];\n atlas.glyphsByFont.forEach(glyphMap => {\n glyphMap.forEach(glyph => {\n promises.push(generateGlyphSDF(glyph, atlas, true));\n });\n });\n Promise.all(promises).then(() => {\n safariPre15Workaround(atlas);\n atlas.sdfTexture.needsUpdate = true;\n });\n });\n}\n\n/**\n * Preload a given font and optionally pre-generate glyph SDFs for one or more character sequences.\n * This can be useful to avoid long pauses when first showing text in a scene, by preloading the\n * needed fonts and glyphs up front along with other assets.\n *\n * @param {object} options\n * @param {string} options.font - URL of the font file to preload. If not given, the default font will\n * be loaded.\n * @param {string|string[]} options.characters - One or more character sequences for which to pre-\n * generate glyph SDFs. Note that this will honor ligature substitution, so you may need\n * to specify ligature sequences in addition to their individual characters to get all\n * possible glyphs, e.g. `[\"t\", \"h\", \"th\"]` to get the \"t\" and \"h\" glyphs plus the \"th\" ligature.\n * @param {number} options.sdfGlyphSize - The size at which to prerender the SDF textures for the\n * specified `characters`.\n * @param {function} callback - A function that will be called when the preloading is complete.\n */\nfunction preloadFont({font, characters, sdfGlyphSize}, callback) {\n let text = Array.isArray(characters) ? characters.join('\\n') : '' + characters;\n getTextRenderInfo({ font, sdfGlyphSize, text }, callback);\n}\n\n\n// Local assign impl so we don't have to import troika-core\nfunction assign(toObj, fromObj) {\n for (let key in fromObj) {\n if (fromObj.hasOwnProperty(key)) {\n toObj[key] = fromObj[key];\n }\n }\n return toObj\n}\n\n// Utility for making URLs absolute\nlet linkEl;\nfunction toAbsoluteURL(path) {\n if (!linkEl) {\n linkEl = typeof document === 'undefined' ? {} : document.createElement('a');\n }\n linkEl.href = path;\n return linkEl.href\n}\n\n/**\n * Safari < v15 seems unable to use the SDF webgl canvas as a texture. This applies a workaround\n * where it reads the pixels out of that canvas and uploads them as a data texture instead, at\n * a slight performance cost.\n */\nfunction safariPre15Workaround(atlas) {\n // Use createImageBitmap support as a proxy for Safari<15, all other mainstream browsers\n // have supported it for a long while so any false positives should be minimal.\n if (typeof createImageBitmap !== 'function') {\n console.info('Safari<15: applying SDF canvas workaround');\n const {sdfCanvas, sdfTexture} = atlas;\n const {width, height} = sdfCanvas;\n const gl = atlas.sdfCanvas.getContext('webgl');\n let pixels = sdfTexture.image.data;\n if (!pixels || pixels.length !== width * height * 4) {\n pixels = new Uint8Array(width * height * 4);\n sdfTexture.image = {width, height, data: pixels};\n sdfTexture.flipY = false;\n sdfTexture.isDataTexture = true;\n }\n gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\n }\n}\n\n\nconst typesetterWorkerModule = /*#__PURE__*/defineWorkerModule({\n name: 'Typesetter',\n dependencies: [\n CONFIG,\n workerModule,\n createTypesetter,\n bidiFactory\n ],\n init(config, fontParser, createTypesetter, bidiFactory) {\n const {defaultFontURL} = config;\n return createTypesetter(fontParser, bidiFactory(), { defaultFontURL })\n }\n});\n\nconst typesetInWorker = /*#__PURE__*/defineWorkerModule({\n name: 'Typesetter',\n dependencies: [\n typesetterWorkerModule,\n ],\n init(typesetter) {\n return function(args) {\n return new Promise(resolve => {\n typesetter.typeset(args, resolve);\n })\n }\n },\n getTransferables(result) {\n // Mark array buffers as transferable to avoid cloning during postMessage\n const transferables = [\n result.glyphPositions.buffer,\n result.glyphIds.buffer\n ];\n if (result.caretPositions) {\n transferables.push(result.caretPositions.buffer);\n }\n if (result.glyphColors) {\n transferables.push(result.glyphColors.buffer);\n }\n return transferables\n }\n});\n\nfunction dumpSDFTextures() {\n Object.keys(atlases).forEach(size => {\n const canvas = atlases[size].sdfCanvas;\n const {width, height} = canvas;\n console.log(\"%c.\", `\n background: url(${canvas.toDataURL()});\n background-size: ${width}px ${height}px;\n color: transparent;\n font-size: 0;\n line-height: ${height}px;\n padding-left: ${width}px;\n `);\n });\n}\n\nconst templateGeometries = {};\n\nfunction getTemplateGeometry(detail) {\n let geom = templateGeometries[detail];\n if (!geom) {\n // Geometry is two planes back-to-back, which will always be rendered FrontSide only but\n // appear as DoubleSide by default. FrontSide/BackSide are emulated using drawRange.\n // We do it this way to avoid the performance hit of two draw calls for DoubleSide materials\n // introduced by Three.js in r130 - see https://github.com/mrdoob/three.js/pull/21967\n const front = new PlaneGeometry(1, 1, detail, detail);\n const back = front.clone();\n const frontAttrs = front.attributes;\n const backAttrs = back.attributes;\n const combined = new BufferGeometry();\n const vertCount = frontAttrs.uv.count;\n for (let i = 0; i < vertCount; i++) {\n backAttrs.position.array[i * 3] *= -1; // flip position x\n backAttrs.normal.array[i * 3 + 2] *= -1; // flip normal z\n }\n ['position', 'normal', 'uv'].forEach(name => {\n combined.setAttribute(name, new Float32BufferAttribute(\n [...frontAttrs[name].array, ...backAttrs[name].array],\n frontAttrs[name].itemSize)\n );\n });\n combined.setIndex([...front.index.array, ...back.index.array.map(n => n + vertCount)]);\n combined.translate(0.5, 0.5, 0);\n geom = templateGeometries[detail] = combined;\n }\n return geom\n}\n\nconst glyphBoundsAttrName = 'aTroikaGlyphBounds';\nconst glyphIndexAttrName = 'aTroikaGlyphIndex';\nconst glyphColorAttrName = 'aTroikaGlyphColor';\n\n/**\n@class GlyphsGeometry\n\nA specialized Geometry for rendering a set of text glyphs. Uses InstancedBufferGeometry to\nrender the glyphs using GPU instancing of a single quad, rather than constructing a whole\ngeometry with vertices, for much smaller attribute arraybuffers according to this math:\n\n Where N = number of glyphs...\n\n Instanced:\n - position: 4 * 3\n - index: 2 * 3\n - normal: 4 * 3\n - uv: 4 * 2\n - glyph x/y bounds: N * 4\n - glyph indices: N * 1\n = 5N + 38\n\n Non-instanced:\n - position: N * 4 * 3\n - index: N * 2 * 3\n - normal: N * 4 * 3\n - uv: N * 4 * 2\n - glyph indices: N * 1\n = 39N\n\nA downside of this is the rare-but-possible lack of the instanced arrays extension,\nwhich we could potentially work around with a fallback non-instanced implementation.\n\n*/\nclass GlyphsGeometry extends InstancedBufferGeometry {\n constructor() {\n super();\n\n this.detail = 1;\n this.curveRadius = 0;\n\n // Define groups for rendering text outline as a separate pass; these will only\n // be used when the `material` getter returns an array, i.e. outlineWidth > 0.\n this.groups = [\n {start: 0, count: Infinity, materialIndex: 0},\n {start: 0, count: Infinity, materialIndex: 1}\n ];\n\n // Preallocate empty bounding objects\n this.boundingSphere = new Sphere();\n this.boundingBox = new Box3();\n }\n\n computeBoundingSphere () {\n // No-op; we'll sync the boundingSphere proactively when needed.\n }\n\n computeBoundingBox() {\n // No-op; we'll sync the boundingBox proactively when needed.\n }\n\n // Since our base geometry contains triangles for both front and back sides, we can emulate\n // the \"side\" by restricting the draw range.\n setSide(side) {\n const verts = this.getIndex().count;\n this.setDrawRange(side === BackSide ? verts / 2 : 0, side === DoubleSide ? verts : verts / 2);\n }\n\n set detail(detail) {\n if (detail !== this._detail) {\n this._detail = detail;\n if (typeof detail !== 'number' || detail < 1) {\n detail = 1;\n }\n let tpl = getTemplateGeometry(detail)\n ;['position', 'normal', 'uv'].forEach(attr => {\n this.attributes[attr] = tpl.attributes[attr].clone();\n });\n this.setIndex(tpl.getIndex().clone());\n }\n }\n get detail() {\n return this._detail\n }\n\n set curveRadius(r) {\n if (r !== this._curveRadius) {\n this._curveRadius = r;\n this._updateBounds();\n }\n }\n get curveRadius() {\n return this._curveRadius\n }\n\n /**\n * Update the geometry for a new set of glyphs.\n * @param {Float32Array} glyphBounds - An array holding the planar bounds for all glyphs\n * to be rendered, 4 entries for each glyph: x1,x2,y1,y1\n * @param {Float32Array} glyphAtlasIndices - An array holding the index of each glyph within\n * the SDF atlas texture.\n * @param {Array} blockBounds - An array holding the [minX, minY, maxX, maxY] across all glyphs\n * @param {Array} [chunkedBounds] - An array of objects describing bounds for each chunk of N\n * consecutive glyphs: `{start:N, end:N, rect:[minX, minY, maxX, maxY]}`. This can be\n * used with `applyClipRect` to choose an optimized `instanceCount`.\n * @param {Uint8Array} [glyphColors] - An array holding r,g,b values for each glyph.\n */\n updateGlyphs(glyphBounds, glyphAtlasIndices, blockBounds, chunkedBounds, glyphColors) {\n // Update the instance attributes\n updateBufferAttr(this, glyphBoundsAttrName, glyphBounds, 4);\n updateBufferAttr(this, glyphIndexAttrName, glyphAtlasIndices, 1);\n updateBufferAttr(this, glyphColorAttrName, glyphColors, 3);\n this._blockBounds = blockBounds;\n this._chunkedBounds = chunkedBounds;\n this.instanceCount = glyphAtlasIndices.length;\n this._updateBounds();\n }\n\n _updateBounds() {\n const bounds = this._blockBounds;\n if (bounds) {\n const { curveRadius, boundingBox: bbox } = this;\n if (curveRadius) {\n const { PI, floor, min, max, sin, cos } = Math;\n const halfPi = PI / 2;\n const twoPi = PI * 2;\n const absR = Math.abs(curveRadius);\n const leftAngle = bounds[0] / absR;\n const rightAngle = bounds[2] / absR;\n const minX = floor((leftAngle + halfPi) / twoPi) !== floor((rightAngle + halfPi) / twoPi)\n ? -absR : min(sin(leftAngle) * absR, sin(rightAngle) * absR);\n const maxX = floor((leftAngle - halfPi) / twoPi) !== floor((rightAngle - halfPi) / twoPi)\n ? absR : max(sin(leftAngle) * absR, sin(rightAngle) * absR);\n const maxZ = floor((leftAngle + PI) / twoPi) !== floor((rightAngle + PI) / twoPi)\n ? absR * 2 : max(absR - cos(leftAngle) * absR, absR - cos(rightAngle) * absR);\n bbox.min.set(minX, bounds[1], curveRadius < 0 ? -maxZ : 0);\n bbox.max.set(maxX, bounds[3], curveRadius < 0 ? 0 : maxZ);\n } else {\n bbox.min.set(bounds[0], bounds[1], 0);\n bbox.max.set(bounds[2], bounds[3], 0);\n }\n bbox.getBoundingSphere(this.boundingSphere);\n }\n }\n\n /**\n * Given a clipping rect, and the chunkedBounds from the last updateGlyphs call, choose the lowest\n * `instanceCount` that will show all glyphs within the clipped view. This is an optimization\n * for long blocks of text that are clipped, to skip vertex shader evaluation for glyphs that would\n * be clipped anyway.\n *\n * Note that since `drawElementsInstanced[ANGLE]` only accepts an instance count and not a starting\n * offset, this optimization becomes less effective as the clipRect moves closer to the end of the\n * text block. We could fix that by switching from instancing to a full geometry with a drawRange,\n * but at the expense of much larger attribute buffers (see classdoc above.)\n *\n * @param {Vector4} clipRect\n */\n applyClipRect(clipRect) {\n let count = this.getAttribute(glyphIndexAttrName).count;\n let chunks = this._chunkedBounds;\n if (chunks) {\n for (let i = chunks.length; i--;) {\n count = chunks[i].end;\n let rect = chunks[i].rect;\n // note: both rects are l-b-r-t\n if (rect[1] < clipRect.w && rect[3] > clipRect.y && rect[0] < clipRect.z && rect[2] > clipRect.x) {\n break\n }\n }\n }\n this.instanceCount = count;\n }\n}\n\n\nfunction updateBufferAttr(geom, attrName, newArray, itemSize) {\n const attr = geom.getAttribute(attrName);\n if (newArray) {\n // If length isn't changing, just update the attribute's array data\n if (attr && attr.array.length === newArray.length) {\n attr.array.set(newArray);\n attr.needsUpdate = true;\n } else {\n geom.setAttribute(attrName, new InstancedBufferAttribute(newArray, itemSize));\n // If the new attribute has a different size, we also have to (as of r117) manually clear the\n // internal cached max instance count. See https://github.com/mrdoob/three.js/issues/19706\n // It's unclear if this is a threejs bug or a truly unsupported scenario; discussion in\n // that ticket is ambiguous as to whether replacing a BufferAttribute with one of a\n // different size is supported, but https://github.com/mrdoob/three.js/pull/17418 strongly\n // implies it should be supported. It's possible we need to\n delete geom._maxInstanceCount; //for r117+, could be fragile\n geom.dispose(); //for r118+, more robust feeling, but more heavy-handed than I'd like\n }\n } else if (attr) {\n geom.deleteAttribute(attrName);\n }\n}\n\n// language=GLSL\nconst VERTEX_DEFS = `\nuniform vec2 uTroikaSDFTextureSize;\nuniform float uTroikaSDFGlyphSize;\nuniform vec4 uTroikaTotalBounds;\nuniform vec4 uTroikaClipRect;\nuniform mat3 uTroikaOrient;\nuniform bool uTroikaUseGlyphColors;\nuniform float uTroikaDistanceOffset;\nuniform float uTroikaBlurRadius;\nuniform vec2 uTroikaPositionOffset;\nuniform float uTroikaCurveRadius;\nattribute vec4 aTroikaGlyphBounds;\nattribute float aTroikaGlyphIndex;\nattribute vec3 aTroikaGlyphColor;\nvarying vec2 vTroikaGlyphUV;\nvarying vec4 vTroikaTextureUVBounds;\nvarying float vTroikaTextureChannel;\nvarying vec3 vTroikaGlyphColor;\nvarying vec2 vTroikaGlyphDimensions;\n`;\n\n// language=GLSL prefix=\"void main() {\" suffix=\"}\"\nconst VERTEX_TRANSFORM = `\nvec4 bounds = aTroikaGlyphBounds;\nbounds.xz += uTroikaPositionOffset.x;\nbounds.yw -= uTroikaPositionOffset.y;\n\nvec4 outlineBounds = vec4(\n bounds.xy - uTroikaDistanceOffset - uTroikaBlurRadius,\n bounds.zw + uTroikaDistanceOffset + uTroikaBlurRadius\n);\nvec4 clippedBounds = vec4(\n clamp(outlineBounds.xy, uTroikaClipRect.xy, uTroikaClipRect.zw),\n clamp(outlineBounds.zw, uTroikaClipRect.xy, uTroikaClipRect.zw)\n);\n\nvec2 clippedXY = (mix(clippedBounds.xy, clippedBounds.zw, position.xy) - bounds.xy) / (bounds.zw - bounds.xy);\n\nposition.xy = mix(bounds.xy, bounds.zw, clippedXY);\n\nuv = (position.xy - uTroikaTotalBounds.xy) / (uTroikaTotalBounds.zw - uTroikaTotalBounds.xy);\n\nfloat rad = uTroikaCurveRadius;\nif (rad != 0.0) {\n float angle = position.x / rad;\n position.xz = vec2(sin(angle) * rad, rad - cos(angle) * rad);\n normal.xz = vec2(sin(angle), cos(angle));\n}\n \nposition = uTroikaOrient * position;\nnormal = uTroikaOrient * normal;\n\nvTroikaGlyphUV = clippedXY.xy;\nvTroikaGlyphDimensions = vec2(bounds[2] - bounds[0], bounds[3] - bounds[1]);\n\n${''/* NOTE: it seems important to calculate the glyph's bounding texture UVs here in the\n vertex shader, rather than in the fragment shader, as the latter gives strange artifacts\n on some glyphs (those in the leftmost texture column) on some systems. The exact reason\n isn't understood but doing this here, then mix()-ing in the fragment shader, seems to work. */}\nfloat txCols = uTroikaSDFTextureSize.x / uTroikaSDFGlyphSize;\nvec2 txUvPerSquare = uTroikaSDFGlyphSize / uTroikaSDFTextureSize;\nvec2 txStartUV = txUvPerSquare * vec2(\n mod(floor(aTroikaGlyphIndex / 4.0), txCols),\n floor(floor(aTroikaGlyphIndex / 4.0) / txCols)\n);\nvTroikaTextureUVBounds = vec4(txStartUV, vec2(txStartUV) + txUvPerSquare);\nvTroikaTextureChannel = mod(aTroikaGlyphIndex, 4.0);\n`;\n\n// language=GLSL\nconst FRAGMENT_DEFS = `\nuniform sampler2D uTroikaSDFTexture;\nuniform vec2 uTroikaSDFTextureSize;\nuniform float uTroikaSDFGlyphSize;\nuniform float uTroikaSDFExponent;\nuniform float uTroikaDistanceOffset;\nuniform float uTroikaFillOpacity;\nuniform float uTroikaOutlineOpacity;\nuniform float uTroikaBlurRadius;\nuniform vec3 uTroikaStrokeColor;\nuniform float uTroikaStrokeWidth;\nuniform float uTroikaStrokeOpacity;\nuniform bool uTroikaSDFDebug;\nvarying vec2 vTroikaGlyphUV;\nvarying vec4 vTroikaTextureUVBounds;\nvarying float vTroikaTextureChannel;\nvarying vec2 vTroikaGlyphDimensions;\n\nfloat troikaSdfValueToSignedDistance(float alpha) {\n // Inverse of exponential encoding in webgl-sdf-generator\n ${''/* TODO - there's some slight inaccuracy here when dealing with interpolated alpha values; those\n are linearly interpolated where the encoding is exponential. Look into improving this by rounding\n to nearest 2 whole texels, decoding those exponential values, and linearly interpolating the result.\n */}\n float maxDimension = max(vTroikaGlyphDimensions.x, vTroikaGlyphDimensions.y);\n float absDist = (1.0 - pow(2.0 * (alpha > 0.5 ? 1.0 - alpha : alpha), 1.0 / uTroikaSDFExponent)) * maxDimension;\n float signedDist = absDist * (alpha > 0.5 ? -1.0 : 1.0);\n return signedDist;\n}\n\nfloat troikaGlyphUvToSdfValue(vec2 glyphUV) {\n vec2 textureUV = mix(vTroikaTextureUVBounds.xy, vTroikaTextureUVBounds.zw, glyphUV);\n vec4 rgba = texture2D(uTroikaSDFTexture, textureUV);\n float ch = floor(vTroikaTextureChannel + 0.5); //NOTE: can't use round() in WebGL1\n return ch == 0.0 ? rgba.r : ch == 1.0 ? rgba.g : ch == 2.0 ? rgba.b : rgba.a;\n}\n\nfloat troikaGlyphUvToDistance(vec2 uv) {\n return troikaSdfValueToSignedDistance(troikaGlyphUvToSdfValue(uv));\n}\n\nfloat troikaGetAADist() {\n ${''/*\n When the standard derivatives extension is available, we choose an antialiasing alpha threshold based\n on the potential change in the SDF's alpha from this fragment to its neighbor. This strategy maximizes \n readability and edge crispness at all sizes and screen resolutions.\n */}\n #if defined(GL_OES_standard_derivatives) || __VERSION__ >= 300\n return length(fwidth(vTroikaGlyphUV * vTroikaGlyphDimensions)) * 0.5;\n #else\n return vTroikaGlyphDimensions.x / 64.0;\n #endif\n}\n\nfloat troikaGetFragDistValue() {\n vec2 clampedGlyphUV = clamp(vTroikaGlyphUV, 0.5 / uTroikaSDFGlyphSize, 1.0 - 0.5 / uTroikaSDFGlyphSize);\n float distance = troikaGlyphUvToDistance(clampedGlyphUV);\n \n // Extrapolate distance when outside bounds:\n distance += clampedGlyphUV == vTroikaGlyphUV ? 0.0 : \n length((vTroikaGlyphUV - clampedGlyphUV) * vTroikaGlyphDimensions);\n\n ${''/* \n // TODO more refined extrapolated distance by adjusting for angle of gradient at edge...\n // This has potential but currently gives very jagged extensions, maybe due to precision issues?\n float uvStep = 1.0 / uTroikaSDFGlyphSize;\n vec2 neighbor1UV = clampedGlyphUV + (\n vTroikaGlyphUV.x != clampedGlyphUV.x ? vec2(0.0, uvStep * sign(0.5 - vTroikaGlyphUV.y)) :\n vTroikaGlyphUV.y != clampedGlyphUV.y ? vec2(uvStep * sign(0.5 - vTroikaGlyphUV.x), 0.0) :\n vec2(0.0)\n );\n vec2 neighbor2UV = clampedGlyphUV + (\n vTroikaGlyphUV.x != clampedGlyphUV.x ? vec2(0.0, uvStep * -sign(0.5 - vTroikaGlyphUV.y)) :\n vTroikaGlyphUV.y != clampedGlyphUV.y ? vec2(uvStep * -sign(0.5 - vTroikaGlyphUV.x), 0.0) :\n vec2(0.0)\n );\n float neighbor1Distance = troikaGlyphUvToDistance(neighbor1UV);\n float neighbor2Distance = troikaGlyphUvToDistance(neighbor2UV);\n float distToUnclamped = length((vTroikaGlyphUV - clampedGlyphUV) * vTroikaGlyphDimensions);\n float distToNeighbor = length((clampedGlyphUV - neighbor1UV) * vTroikaGlyphDimensions);\n float gradientAngle1 = min(asin(abs(neighbor1Distance - distance) / distToNeighbor), PI / 2.0);\n float gradientAngle2 = min(asin(abs(neighbor2Distance - distance) / distToNeighbor), PI / 2.0);\n distance += (cos(gradientAngle1) + cos(gradientAngle2)) / 2.0 * distToUnclamped;\n */}\n\n return distance;\n}\n\nfloat troikaGetEdgeAlpha(float distance, float distanceOffset, float aaDist) {\n #if defined(IS_DEPTH_MATERIAL) || defined(IS_DISTANCE_MATERIAL)\n float alpha = step(-distanceOffset, -distance);\n #else\n\n float alpha = smoothstep(\n distanceOffset + aaDist,\n distanceOffset - aaDist,\n distance\n );\n #endif\n\n return alpha;\n}\n`;\n\n// language=GLSL prefix=\"void main() {\" suffix=\"}\"\nconst FRAGMENT_TRANSFORM = `\nfloat aaDist = troikaGetAADist();\nfloat fragDistance = troikaGetFragDistValue();\nfloat edgeAlpha = uTroikaSDFDebug ?\n troikaGlyphUvToSdfValue(vTroikaGlyphUV) :\n troikaGetEdgeAlpha(fragDistance, uTroikaDistanceOffset, max(aaDist, uTroikaBlurRadius));\n\n#if !defined(IS_DEPTH_MATERIAL) && !defined(IS_DISTANCE_MATERIAL)\nvec4 fillRGBA = gl_FragColor;\nfillRGBA.a *= uTroikaFillOpacity;\nvec4 strokeRGBA = uTroikaStrokeWidth == 0.0 ? fillRGBA : vec4(uTroikaStrokeColor, uTroikaStrokeOpacity);\nif (fillRGBA.a == 0.0) fillRGBA.rgb = strokeRGBA.rgb;\ngl_FragColor = mix(fillRGBA, strokeRGBA, smoothstep(\n -uTroikaStrokeWidth - aaDist,\n -uTroikaStrokeWidth + aaDist,\n fragDistance\n));\ngl_FragColor.a *= edgeAlpha;\n#endif\n\nif (edgeAlpha == 0.0) {\n discard;\n}\n`;\n\n\n/**\n * Create a material for rendering text, derived from a baseMaterial\n */\nfunction createTextDerivedMaterial(baseMaterial) {\n const textMaterial = createDerivedMaterial(baseMaterial, {\n chained: true,\n extensions: {\n derivatives: true\n },\n uniforms: {\n uTroikaSDFTexture: {value: null},\n uTroikaSDFTextureSize: {value: new Vector2()},\n uTroikaSDFGlyphSize: {value: 0},\n uTroikaSDFExponent: {value: 0},\n uTroikaTotalBounds: {value: new Vector4(0,0,0,0)},\n uTroikaClipRect: {value: new Vector4(0,0,0,0)},\n uTroikaDistanceOffset: {value: 0},\n uTroikaOutlineOpacity: {value: 0},\n uTroikaFillOpacity: {value: 1},\n uTroikaPositionOffset: {value: new Vector2()},\n uTroikaCurveRadius: {value: 0},\n uTroikaBlurRadius: {value: 0},\n uTroikaStrokeWidth: {value: 0},\n uTroikaStrokeColor: {value: new Color()},\n uTroikaStrokeOpacity: {value: 1},\n uTroikaOrient: {value: new Matrix3()},\n uTroikaUseGlyphColors: {value: true},\n uTroikaSDFDebug: {value: false}\n },\n vertexDefs: VERTEX_DEFS,\n vertexTransform: VERTEX_TRANSFORM,\n fragmentDefs: FRAGMENT_DEFS,\n fragmentColorTransform: FRAGMENT_TRANSFORM,\n customRewriter({vertexShader, fragmentShader}) {\n let uDiffuseRE = /\\buniform\\s+vec3\\s+diffuse\\b/;\n if (uDiffuseRE.test(fragmentShader)) {\n // Replace all instances of `diffuse` with our varying\n fragmentShader = fragmentShader\n .replace(uDiffuseRE, 'varying vec3 vTroikaGlyphColor')\n .replace(/\\bdiffuse\\b/g, 'vTroikaGlyphColor');\n // Make sure the vertex shader declares the uniform so we can grab it as a fallback\n if (!uDiffuseRE.test(vertexShader)) {\n vertexShader = vertexShader.replace(\n voidMainRegExp,\n 'uniform vec3 diffuse;\\n$&\\nvTroikaGlyphColor = uTroikaUseGlyphColors ? aTroikaGlyphColor / 255.0 : diffuse;\\n'\n );\n }\n }\n return { vertexShader, fragmentShader }\n }\n });\n\n // Force transparency - TODO is this reasonable?\n textMaterial.transparent = true;\n\n Object.defineProperties(textMaterial, {\n isTroikaTextMaterial: {value: true},\n\n // WebGLShadowMap reverses the side of the shadow material by default, which fails\n // for planes, so here we force the `shadowSide` to always match the main side.\n shadowSide: {\n get() {\n return this.side\n },\n set() {\n //no-op\n }\n }\n });\n\n return textMaterial\n}\n\nconst defaultMaterial = /*#__PURE__*/ new MeshBasicMaterial({\n color: 0xffffff,\n side: DoubleSide,\n transparent: true\n});\nconst defaultStrokeColor = 0x808080;\n\nconst tempMat4 = /*#__PURE__*/ new Matrix4();\nconst tempVec3a = /*#__PURE__*/ new Vector3();\nconst tempVec3b = /*#__PURE__*/ new Vector3();\nconst tempArray = [];\nconst origin = /*#__PURE__*/ new Vector3();\nconst defaultOrient = '+x+y';\n\nfunction first(o) {\n return Array.isArray(o) ? o[0] : o\n}\n\nlet getFlatRaycastMesh = () => {\n const mesh = new Mesh(\n new PlaneGeometry(1, 1),\n defaultMaterial\n );\n getFlatRaycastMesh = () => mesh;\n return mesh\n};\nlet getCurvedRaycastMesh = () => {\n const mesh = new Mesh(\n new PlaneGeometry(1, 1, 32, 1),\n defaultMaterial\n );\n getCurvedRaycastMesh = () => mesh;\n return mesh\n};\n\nconst syncStartEvent = { type: 'syncstart' };\nconst syncCompleteEvent = { type: 'synccomplete' };\n\nconst SYNCABLE_PROPS = [\n 'font',\n 'fontSize',\n 'letterSpacing',\n 'lineHeight',\n 'maxWidth',\n 'overflowWrap',\n 'text',\n 'direction',\n 'textAlign',\n 'textIndent',\n 'whiteSpace',\n 'anchorX',\n 'anchorY',\n 'colorRanges',\n 'sdfGlyphSize'\n];\n\nconst COPYABLE_PROPS = SYNCABLE_PROPS.concat(\n 'material',\n 'color',\n 'depthOffset',\n 'clipRect',\n 'curveRadius',\n 'orientation',\n 'glyphGeometryDetail'\n);\n\n/**\n * @class Text\n *\n * A ThreeJS Mesh that renders a string of text on a plane in 3D space using signed distance\n * fields (SDF).\n */\nclass Text extends Mesh {\n constructor() {\n const geometry = new GlyphsGeometry();\n super(geometry, null);\n\n // === Text layout properties: === //\n\n /**\n * @member {string} text\n * The string of text to be rendered.\n */\n this.text = '';\n\n /**\n * @member {number|string} anchorX\n * Defines the horizontal position in the text block that should line up with the local origin.\n * Can be specified as a numeric x position in local units, a string percentage of the total\n * text block width e.g. `'25%'`, or one of the following keyword strings: 'left', 'center',\n * or 'right'.\n */\n this.anchorX = 0;\n\n /**\n * @member {number|string} anchorX\n * Defines the vertical position in the text block that should line up with the local origin.\n * Can be specified as a numeric y position in local units (note: down is negative y), a string\n * percentage of the total text block height e.g. `'25%'`, or one of the following keyword strings:\n * 'top', 'top-baseline', 'top-cap', 'top-ex', 'middle', 'bottom-baseline', or 'bottom'.\n */\n this.anchorY = 0;\n\n /**\n * @member {number} curveRadius\n * Defines a cylindrical radius along which the text's plane will be curved. Positive numbers put\n * the cylinder's centerline (oriented vertically) that distance in front of the text, for a concave\n * curvature, while negative numbers put it behind the text for a convex curvature. The centerline\n * will be aligned with the text's local origin; you can use `anchorX` to offset it.\n *\n * Since each glyph is by default rendered with a simple quad, each glyph remains a flat plane\n * internally. You can use `glyphGeometryDetail` to add more vertices for curvature inside glyphs.\n */\n this.curveRadius = 0;\n\n /**\n * @member {string} direction\n * Sets the base direction for the text. The default value of \"auto\" will choose a direction based\n * on the text's content according to the bidi spec. A value of \"ltr\" or \"rtl\" will force the direction.\n */\n this.direction = 'auto';\n\n /**\n * @member {string} font\n * URL of a custom font to be used. Font files can be in .ttf, .otf, or .woff (not .woff2) formats.\n * Defaults to the Roboto font loaded from Google Fonts.\n */\n this.font = null; //will use default from TextBuilder\n\n /**\n * @member {number} fontSize\n * The size at which to render the font in local units; corresponds to the em-box height\n * of the chosen `font`.\n */\n this.fontSize = 0.1;\n\n /**\n * @member {number} letterSpacing\n * Sets a uniform adjustment to spacing between letters after kerning is applied. Positive\n * numbers increase spacing and negative numbers decrease it.\n */\n this.letterSpacing = 0;\n\n /**\n * @member {number|string} lineHeight\n * Sets the height of each line of text, as a multiple of the `fontSize`. Defaults to 'normal'\n * which chooses a reasonable height based on the chosen font's ascender/descender metrics.\n */\n this.lineHeight = 'normal';\n\n /**\n * @member {number} maxWidth\n * The maximum width of the text block, above which text may start wrapping according to the\n * `whiteSpace` and `overflowWrap` properties.\n */\n this.maxWidth = Infinity;\n\n /**\n * @member {string} overflowWrap\n * Defines how text wraps if the `whiteSpace` property is `normal`. Can be either `'normal'`\n * to break at whitespace characters, or `'break-word'` to allow breaking within words.\n * Defaults to `'normal'`.\n */\n this.overflowWrap = 'normal';\n\n /**\n * @member {string} textAlign\n * The horizontal alignment of each line of text within the overall text bounding box.\n */\n this.textAlign = 'left';\n\n /**\n * @member {number} textIndent\n * Indentation for the first character of a line; see CSS `text-indent`.\n */\n this.textIndent = 0;\n\n /**\n * @member {string} whiteSpace\n * Defines whether text should wrap when a line reaches the `maxWidth`. Can\n * be either `'normal'` (the default), to allow wrapping according to the `overflowWrap` property,\n * or `'nowrap'` to prevent wrapping. Note that `'normal'` here honors newline characters to\n * manually break lines, making it behave more like `'pre-wrap'` does in CSS.\n */\n this.whiteSpace = 'normal';\n\n\n // === Presentation properties: === //\n\n /**\n * @member {THREE.Material} material\n * Defines a _base_ material to be used when rendering the text. This material will be\n * automatically replaced with a material derived from it, that adds shader code to\n * decrease the alpha for each fragment (pixel) outside the text glyphs, with antialiasing.\n * By default it will derive from a simple white MeshBasicMaterial, but you can use any\n * of the other mesh materials to gain other features like lighting, texture maps, etc.\n *\n * Also see the `color` shortcut property.\n */\n this.material = null;\n\n /**\n * @member {string|number|THREE.Color} color\n * This is a shortcut for setting the `color` of the text's material. You can use this\n * if you don't want to specify a whole custom `material`. Also, if you do use a custom\n * `material`, this color will only be used for this particuar Text instance, even if\n * that same material instance is shared across multiple Text objects.\n */\n this.color = null;\n\n /**\n * @member {object|null} colorRanges\n * WARNING: This API is experimental and may change.\n * This allows more fine-grained control of colors for individual or ranges of characters,\n * taking precedence over the material's `color`. Its format is an Object whose keys each\n * define a starting character index for a range, and whose values are the color for each\n * range. The color value can be a numeric hex color value, a `THREE.Color` object, or\n * any of the strings accepted by `THREE.Color`.\n */\n this.colorRanges = null;\n\n /**\n * @member {number|string} outlineWidth\n * WARNING: This API is experimental and may change.\n * The width of an outline/halo to be drawn around each text glyph using the `outlineColor` and `outlineOpacity`.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g.\n * `\"12%\"` which is treated as a percentage of the `fontSize`. Defaults to `0`, which means\n * no outline will be drawn unless an `outlineOffsetX/Y` or `outlineBlur` is set.\n */\n this.outlineWidth = 0;\n\n /**\n * @member {string|number|THREE.Color} outlineColor\n * WARNING: This API is experimental and may change.\n * The color of the text outline, if `outlineWidth`/`outlineBlur`/`outlineOffsetX/Y` are set.\n * Defaults to black.\n */\n this.outlineColor = 0x000000;\n\n /**\n * @member {number} outlineOpacity\n * WARNING: This API is experimental and may change.\n * The opacity of the outline, if `outlineWidth`/`outlineBlur`/`outlineOffsetX/Y` are set.\n * Defaults to `1`.\n */\n this.outlineOpacity = 1;\n\n /**\n * @member {number|string} outlineBlur\n * WARNING: This API is experimental and may change.\n * A blur radius applied to the outer edge of the text's outline. If the `outlineWidth` is\n * zero, the blur will be applied at the glyph edge, like CSS's `text-shadow` blur radius.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g.\n * `\"12%\"` which is treated as a percentage of the `fontSize`. Defaults to `0`.\n */\n this.outlineBlur = 0;\n\n /**\n * @member {number|string} outlineOffsetX\n * WARNING: This API is experimental and may change.\n * A horizontal offset for the text outline.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g. `\"12%\"`\n * which is treated as a percentage of the `fontSize`. Defaults to `0`.\n */\n this.outlineOffsetX = 0;\n\n /**\n * @member {number|string} outlineOffsetY\n * WARNING: This API is experimental and may change.\n * A vertical offset for the text outline.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g. `\"12%\"`\n * which is treated as a percentage of the `fontSize`. Defaults to `0`.\n */\n this.outlineOffsetY = 0;\n\n /**\n * @member {number|string} strokeWidth\n * WARNING: This API is experimental and may change.\n * The width of an inner stroke drawn inside each text glyph using the `strokeColor` and `strokeOpacity`.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g. `\"12%\"`\n * which is treated as a percentage of the `fontSize`. Defaults to `0`.\n */\n this.strokeWidth = 0;\n\n /**\n * @member {string|number|THREE.Color} strokeColor\n * WARNING: This API is experimental and may change.\n * The color of the text stroke, if `strokeWidth` is greater than zero. Defaults to gray.\n */\n this.strokeColor = defaultStrokeColor;\n\n /**\n * @member {number} strokeOpacity\n * WARNING: This API is experimental and may change.\n * The opacity of the stroke, if `strokeWidth` is greater than zero. Defaults to `1`.\n */\n this.strokeOpacity = 1;\n\n /**\n * @member {number} fillOpacity\n * WARNING: This API is experimental and may change.\n * The opacity of the glyph's fill from 0 to 1. This behaves like the material's `opacity` but allows\n * giving the fill a different opacity than the `strokeOpacity`. A fillOpacity of `0` makes the\n * interior of the glyph invisible, leaving just the `strokeWidth`. Defaults to `1`.\n */\n this.fillOpacity = 1;\n\n /**\n * @member {number} depthOffset\n * This is a shortcut for setting the material's `polygonOffset` and related properties,\n * which can be useful in preventing z-fighting when this text is laid on top of another\n * plane in the scene. Positive numbers are further from the camera, negatives closer.\n */\n this.depthOffset = 0;\n\n /**\n * @member {Array} clipRect\n * If specified, defines a `[minX, minY, maxX, maxY]` of a rectangle outside of which all\n * pixels will be discarded. This can be used for example to clip overflowing text when\n * `whiteSpace='nowrap'`.\n */\n this.clipRect = null;\n\n /**\n * @member {string} orientation\n * Defines the axis plane on which the text should be laid out when the mesh has no extra\n * rotation transform. It is specified as a string with two axes: the horizontal axis with\n * positive pointing right, and the vertical axis with positive pointing up. By default this\n * is '+x+y', meaning the text sits on the xy plane with the text's top toward positive y\n * and facing positive z. A value of '+x-z' would place it on the xz plane with the text's\n * top toward negative z and facing positive y.\n */\n this.orientation = defaultOrient;\n\n /**\n * @member {number} glyphGeometryDetail\n * Controls number of vertical/horizontal segments that make up each glyph's rectangular\n * plane. Defaults to 1. This can be increased to provide more geometrical detail for custom\n * vertex shader effects, for example.\n */\n this.glyphGeometryDetail = 1;\n\n /**\n * @member {number|null} sdfGlyphSize\n * The size of each glyph's SDF (signed distance field) used for rendering. This must be a\n * power-of-two number. Defaults to 64 which is generally a good balance of size and quality\n * for most fonts. Larger sizes can improve the quality of glyph rendering by increasing\n * the sharpness of corners and preventing loss of very thin lines, at the expense of\n * increased memory footprint and longer SDF generation time.\n */\n this.sdfGlyphSize = null;\n\n /**\n * @member {boolean} gpuAccelerateSDF\n * When `true`, the SDF generation process will be GPU-accelerated with WebGL when possible,\n * making it much faster especially for complex glyphs, and falling back to a JavaScript version\n * executed in web workers when support isn't available. It should automatically detect support,\n * but it's still somewhat experimental, so you can set it to `false` to force it to use the JS\n * version if you encounter issues with it.\n */\n this.gpuAccelerateSDF = true;\n\n this.debugSDF = false;\n }\n\n /**\n * Updates the text rendering according to the current text-related configuration properties.\n * This is an async process, so you can pass in a callback function to be executed when it\n * finishes.\n * @param {function} [callback]\n */\n sync(callback) {\n if (this._needsSync) {\n this._needsSync = false;\n\n // If there's another sync still in progress, queue\n if (this._isSyncing) {\n (this._queuedSyncs || (this._queuedSyncs = [])).push(callback);\n } else {\n this._isSyncing = true;\n this.dispatchEvent(syncStartEvent);\n\n getTextRenderInfo({\n text: this.text,\n font: this.font,\n fontSize: this.fontSize || 0.1,\n letterSpacing: this.letterSpacing || 0,\n lineHeight: this.lineHeight || 'normal',\n maxWidth: this.maxWidth,\n direction: this.direction || 'auto',\n textAlign: this.textAlign,\n textIndent: this.textIndent,\n whiteSpace: this.whiteSpace,\n overflowWrap: this.overflowWrap,\n anchorX: this.anchorX,\n anchorY: this.anchorY,\n colorRanges: this.colorRanges,\n includeCaretPositions: true, //TODO parameterize\n sdfGlyphSize: this.sdfGlyphSize,\n gpuAccelerateSDF: this.gpuAccelerateSDF,\n }, textRenderInfo => {\n this._isSyncing = false;\n\n // Save result for later use in onBeforeRender\n this._textRenderInfo = textRenderInfo;\n\n // Update the geometry attributes\n this.geometry.updateGlyphs(\n textRenderInfo.glyphBounds,\n textRenderInfo.glyphAtlasIndices,\n textRenderInfo.blockBounds,\n textRenderInfo.chunkedBounds,\n textRenderInfo.glyphColors\n );\n\n // If we had extra sync requests queued up, kick it off\n const queued = this._queuedSyncs;\n if (queued) {\n this._queuedSyncs = null;\n this._needsSync = true;\n this.sync(() => {\n queued.forEach(fn => fn && fn());\n });\n }\n\n this.dispatchEvent(syncCompleteEvent);\n if (callback) {\n callback();\n }\n });\n }\n }\n }\n\n /**\n * Initiate a sync if needed - note it won't complete until next frame at the\n * earliest so if possible it's a good idea to call sync() manually as soon as\n * all the properties have been set.\n * @override\n */\n onBeforeRender(renderer, scene, camera, geometry, material, group) {\n this.sync();\n\n // This may not always be a text material, e.g. if there's a scene.overrideMaterial present\n if (material.isTroikaTextMaterial) {\n this._prepareForRender(material);\n }\n\n // We need to force the material to FrontSide to avoid the double-draw-call performance hit\n // introduced in Three.js r130: https://github.com/mrdoob/three.js/pull/21967 - The sidedness\n // is instead applied via drawRange in the GlyphsGeometry.\n material._hadOwnSide = material.hasOwnProperty('side');\n this.geometry.setSide(material._actualSide = material.side);\n material.side = FrontSide;\n }\n\n onAfterRender(renderer, scene, camera, geometry, material, group) {\n // Restore original material side\n if (material._hadOwnSide) {\n material.side = material._actualSide;\n } else {\n delete material.side; // back to inheriting from base material\n }\n }\n\n /**\n * Shortcut to dispose the geometry specific to this instance.\n * Note: we don't also dispose the derived material here because if anything else is\n * sharing the same base material it will result in a pause next frame as the program\n * is recompiled. Instead users can dispose the base material manually, like normal,\n * and we'll also dispose the derived material at that time.\n */\n dispose() {\n this.geometry.dispose();\n }\n\n /**\n * @property {TroikaTextRenderInfo|null} textRenderInfo\n * @readonly\n * The current processed rendering data for this TextMesh, returned by the TextBuilder after\n * a `sync()` call. This will be `null` initially, and may be stale for a short period until\n * the asynchrous `sync()` process completes.\n */\n get textRenderInfo() {\n return this._textRenderInfo || null\n }\n\n // Handler for automatically wrapping the base material with our upgrades. We do the wrapping\n // lazily on _read_ rather than write to avoid unnecessary wrapping on transient values.\n get material() {\n let derivedMaterial = this._derivedMaterial;\n const baseMaterial = this._baseMaterial || this._defaultMaterial || (this._defaultMaterial = defaultMaterial.clone());\n if (!derivedMaterial || derivedMaterial.baseMaterial !== baseMaterial) {\n derivedMaterial = this._derivedMaterial = createTextDerivedMaterial(baseMaterial);\n // dispose the derived material when its base material is disposed:\n baseMaterial.addEventListener('dispose', function onDispose() {\n baseMaterial.removeEventListener('dispose', onDispose);\n derivedMaterial.dispose();\n });\n }\n // If text outline is configured, render it as a preliminary draw using Three's multi-material\n // feature (see GlyphsGeometry which sets up `groups` for this purpose) Doing it with multi\n // materials ensures the layers are always rendered consecutively in a consistent order.\n // Each layer will trigger onBeforeRender with the appropriate material.\n if (this.outlineWidth || this.outlineBlur || this.outlineOffsetX || this.outlineOffsetY) {\n let outlineMaterial = derivedMaterial._outlineMtl;\n if (!outlineMaterial) {\n outlineMaterial = derivedMaterial._outlineMtl = Object.create(derivedMaterial, {\n id: {value: derivedMaterial.id + 0.1}\n });\n outlineMaterial.isTextOutlineMaterial = true;\n outlineMaterial.depthWrite = false;\n outlineMaterial.map = null; //???\n derivedMaterial.addEventListener('dispose', function onDispose() {\n derivedMaterial.removeEventListener('dispose', onDispose);\n outlineMaterial.dispose();\n });\n }\n return [\n outlineMaterial,\n derivedMaterial\n ]\n } else {\n return derivedMaterial\n }\n }\n set material(baseMaterial) {\n if (baseMaterial && baseMaterial.isTroikaTextMaterial) { //prevent double-derivation\n this._derivedMaterial = baseMaterial;\n this._baseMaterial = baseMaterial.baseMaterial;\n } else {\n this._baseMaterial = baseMaterial;\n }\n }\n\n get glyphGeometryDetail() {\n return this.geometry.detail\n }\n set glyphGeometryDetail(detail) {\n this.geometry.detail = detail;\n }\n\n get curveRadius() {\n return this.geometry.curveRadius\n }\n set curveRadius(r) {\n this.geometry.curveRadius = r;\n }\n\n // Create and update material for shadows upon request:\n get customDepthMaterial() {\n return first(this.material).getDepthMaterial()\n }\n get customDistanceMaterial() {\n return first(this.material).getDistanceMaterial()\n }\n\n _prepareForRender(material) {\n const isOutline = material.isTextOutlineMaterial;\n const uniforms = material.uniforms;\n const textInfo = this.textRenderInfo;\n if (textInfo) {\n const {sdfTexture, blockBounds} = textInfo;\n uniforms.uTroikaSDFTexture.value = sdfTexture;\n uniforms.uTroikaSDFTextureSize.value.set(sdfTexture.image.width, sdfTexture.image.height);\n uniforms.uTroikaSDFGlyphSize.value = textInfo.sdfGlyphSize;\n uniforms.uTroikaSDFExponent.value = textInfo.sdfExponent;\n uniforms.uTroikaTotalBounds.value.fromArray(blockBounds);\n uniforms.uTroikaUseGlyphColors.value = !isOutline && !!textInfo.glyphColors;\n\n let distanceOffset = 0;\n let blurRadius = 0;\n let strokeWidth = 0;\n let fillOpacity;\n let strokeOpacity;\n let strokeColor;\n let offsetX = 0;\n let offsetY = 0;\n\n if (isOutline) {\n let {outlineWidth, outlineOffsetX, outlineOffsetY, outlineBlur, outlineOpacity} = this;\n distanceOffset = this._parsePercent(outlineWidth) || 0;\n blurRadius = Math.max(0, this._parsePercent(outlineBlur) || 0);\n fillOpacity = outlineOpacity;\n offsetX = this._parsePercent(outlineOffsetX) || 0;\n offsetY = this._parsePercent(outlineOffsetY) || 0;\n } else {\n strokeWidth = Math.max(0, this._parsePercent(this.strokeWidth) || 0);\n if (strokeWidth) {\n strokeColor = this.strokeColor;\n uniforms.uTroikaStrokeColor.value.set(strokeColor == null ? defaultStrokeColor : strokeColor);\n strokeOpacity = this.strokeOpacity;\n if (strokeOpacity == null) strokeOpacity = 1;\n }\n fillOpacity = this.fillOpacity;\n }\n\n uniforms.uTroikaDistanceOffset.value = distanceOffset;\n uniforms.uTroikaPositionOffset.value.set(offsetX, offsetY);\n uniforms.uTroikaBlurRadius.value = blurRadius;\n uniforms.uTroikaStrokeWidth.value = strokeWidth;\n uniforms.uTroikaStrokeOpacity.value = strokeOpacity;\n uniforms.uTroikaFillOpacity.value = fillOpacity == null ? 1 : fillOpacity;\n uniforms.uTroikaCurveRadius.value = this.curveRadius || 0;\n\n let clipRect = this.clipRect;\n if (clipRect && Array.isArray(clipRect) && clipRect.length === 4) {\n uniforms.uTroikaClipRect.value.fromArray(clipRect);\n } else {\n // no clipping - choose a finite rect that shouldn't ever be reached by overflowing glyphs or outlines\n const pad = (this.fontSize || 0.1) * 100;\n uniforms.uTroikaClipRect.value.set(\n blockBounds[0] - pad,\n blockBounds[1] - pad,\n blockBounds[2] + pad,\n blockBounds[3] + pad\n );\n }\n this.geometry.applyClipRect(uniforms.uTroikaClipRect.value);\n }\n uniforms.uTroikaSDFDebug.value = !!this.debugSDF;\n material.polygonOffset = !!this.depthOffset;\n material.polygonOffsetFactor = material.polygonOffsetUnits = this.depthOffset || 0;\n\n // Shortcut for setting material color via `color` prop on the mesh; this is\n // applied only to the derived material to avoid mutating a shared base material.\n const color = isOutline ? (this.outlineColor || 0) : this.color;\n\n if (color == null) {\n delete material.color; //inherit from base\n } else {\n const colorObj = material.hasOwnProperty('color') ? material.color : (material.color = new Color());\n if (color !== colorObj._input || typeof color === 'object') {\n colorObj.set(colorObj._input = color);\n }\n }\n\n // base orientation\n let orient = this.orientation || defaultOrient;\n if (orient !== material._orientation) {\n let rotMat = uniforms.uTroikaOrient.value;\n orient = orient.replace(/[^-+xyz]/g, '');\n let match = orient !== defaultOrient && orient.match(/^([-+])([xyz])([-+])([xyz])$/);\n if (match) {\n let [, hSign, hAxis, vSign, vAxis] = match;\n tempVec3a.set(0, 0, 0)[hAxis] = hSign === '-' ? 1 : -1;\n tempVec3b.set(0, 0, 0)[vAxis] = vSign === '-' ? -1 : 1;\n tempMat4.lookAt(origin, tempVec3a.cross(tempVec3b), tempVec3b);\n rotMat.setFromMatrix4(tempMat4);\n } else {\n rotMat.identity();\n }\n material._orientation = orient;\n }\n }\n\n _parsePercent(value) {\n if (typeof value === 'string') {\n let match = value.match(/^(-?[\\d.]+)%$/);\n let pct = match ? parseFloat(match[1]) : NaN;\n value = (isNaN(pct) ? 0 : pct / 100) * this.fontSize;\n }\n return value\n }\n\n /**\n * Translate a point in local space to an x/y in the text plane.\n */\n localPositionToTextCoords(position, target = new Vector2()) {\n target.copy(position); //simple non-curved case is 1:1\n const r = this.curveRadius;\n if (r) { //flatten the curve\n target.x = Math.atan2(position.x, Math.abs(r) - Math.abs(position.z)) * Math.abs(r);\n }\n return target\n }\n\n /**\n * Translate a point in world space to an x/y in the text plane.\n */\n worldPositionToTextCoords(position, target = new Vector2()) {\n tempVec3a.copy(position);\n return this.localPositionToTextCoords(this.worldToLocal(tempVec3a), target)\n }\n\n /**\n * @override Custom raycasting to test against the whole text block's max rectangular bounds\n * TODO is there any reason to make this more granular, like within individual line or glyph rects?\n */\n raycast(raycaster, intersects) {\n const {textRenderInfo, curveRadius} = this;\n if (textRenderInfo) {\n const bounds = textRenderInfo.blockBounds;\n const raycastMesh = curveRadius ? getCurvedRaycastMesh() : getFlatRaycastMesh();\n const geom = raycastMesh.geometry;\n const {position, uv} = geom.attributes;\n for (let i = 0; i < uv.count; i++) {\n let x = bounds[0] + (uv.getX(i) * (bounds[2] - bounds[0]));\n const y = bounds[1] + (uv.getY(i) * (bounds[3] - bounds[1]));\n let z = 0;\n if (curveRadius) {\n z = curveRadius - Math.cos(x / curveRadius) * curveRadius;\n x = Math.sin(x / curveRadius) * curveRadius;\n }\n position.setXYZ(i, x, y, z);\n }\n geom.boundingSphere = this.geometry.boundingSphere;\n geom.boundingBox = this.geometry.boundingBox;\n raycastMesh.matrixWorld = this.matrixWorld;\n raycastMesh.material.side = this.material.side;\n tempArray.length = 0;\n raycastMesh.raycast(raycaster, tempArray);\n for (let i = 0; i < tempArray.length; i++) {\n tempArray[i].object = this;\n intersects.push(tempArray[i]);\n }\n }\n }\n\n copy(source) {\n // Prevent copying the geometry reference so we don't end up sharing attributes between instances\n const geom = this.geometry;\n super.copy(source);\n this.geometry = geom;\n\n COPYABLE_PROPS.forEach(prop => {\n this[prop] = source[prop];\n });\n return this\n }\n\n clone() {\n return new this.constructor().copy(this)\n }\n}\n\n\n// Create setters for properties that affect text layout:\nSYNCABLE_PROPS.forEach(prop => {\n const privateKey = '_private_' + prop;\n Object.defineProperty(Text.prototype, prop, {\n get() {\n return this[privateKey]\n },\n set(value) {\n if (value !== this[privateKey]) {\n this[privateKey] = value;\n this._needsSync = true;\n }\n }\n });\n});\n\n//=== Utility functions for dealing with carets and selection ranges ===//\n\n/**\n * @typedef {object} TextCaret\n * @property {number} x - x position of the caret\n * @property {number} y - y position of the caret's bottom\n * @property {number} height - height of the caret\n * @property {number} charIndex - the index in the original input string of this caret's target\n * character; the caret will be for the position _before_ that character.\n */\n\n/**\n * Given a local x/y coordinate in the text block plane, find the nearest caret position.\n * @param {TroikaTextRenderInfo} textRenderInfo - a result object from TextBuilder#getTextRenderInfo\n * @param {number} x\n * @param {number} y\n * @return {TextCaret | null}\n */\nfunction getCaretAtPoint(textRenderInfo, x, y) {\n let closestCaret = null;\n const {caretHeight} = textRenderInfo;\n const caretsByRow = groupCaretsByRow(textRenderInfo);\n\n // Find nearest row by y first\n let closestRowY = Infinity;\n caretsByRow.forEach((carets, rowY) => {\n if (Math.abs(y - (rowY + caretHeight / 2)) < Math.abs(y - (closestRowY + caretHeight / 2))) {\n closestRowY = rowY;\n }\n });\n\n // Then find closest caret by x within that row\n caretsByRow.get(closestRowY).forEach(caret => {\n if (!closestCaret || Math.abs(x - caret.x) < Math.abs(x - closestCaret.x)) {\n closestCaret = caret;\n }\n });\n return closestCaret\n}\n\n\nconst _rectsCache = new WeakMap();\n\n/**\n * Given start and end character indexes, return a list of rectangles covering all the\n * characters within that selection.\n * @param {TroikaTextRenderInfo} textRenderInfo\n * @param {number} start - index of the first char in the selection\n * @param {number} end - index of the first char after the selection\n * @return {Array<{left, top, right, bottom}> | null}\n */\nfunction getSelectionRects(textRenderInfo, start, end) {\n let rects;\n if (textRenderInfo) {\n // Check cache - textRenderInfo is frozen so it's safe to cache based on it\n let prevResult = _rectsCache.get(textRenderInfo);\n if (prevResult && prevResult.start === start && prevResult.end === end) {\n return prevResult.rects\n }\n\n const {caretPositions, caretHeight} = textRenderInfo;\n\n // Normalize\n if (end < start) {\n const s = start;\n start = end;\n end = s;\n }\n start = Math.max(start, 0);\n end = Math.min(end, caretPositions.length + 1);\n\n // Build list of rects, expanding the current rect for all characters in a run and starting\n // a new rect whenever reaching a new line or a new bidi direction\n rects = [];\n let currentRect = null;\n for (let i = start; i < end; i++) {\n const x1 = caretPositions[i * 3];\n const x2 = caretPositions[i * 3 + 1];\n const left = Math.min(x1, x2);\n const right = Math.max(x1, x2);\n const bottom = caretPositions[i * 3 + 2];\n if (!currentRect || bottom !== currentRect.bottom || left > currentRect.right || right < currentRect.left) {\n currentRect = {\n left: Infinity,\n right: -Infinity,\n bottom: bottom,\n top: bottom + caretHeight\n };\n rects.push(currentRect);\n }\n currentRect.left = Math.min(left, currentRect.left);\n currentRect.right = Math.max(right, currentRect.right);\n }\n\n // Merge any overlapping rects, e.g. those formed by adjacent bidi runs\n rects.sort((a, b) => b.bottom - a.bottom || a.left - b.left);\n for (let i = rects.length - 1; i-- > 0;) {\n const rectA = rects[i];\n const rectB = rects[i + 1];\n if (rectA.bottom === rectB.bottom && rectA.left <= rectB.right && rectA.right >= rectB.left) {\n rectB.left = Math.min(rectB.left, rectA.left);\n rectB.right = Math.max(rectB.right, rectA.right);\n rects.splice(i, 1);\n }\n }\n\n _rectsCache.set(textRenderInfo, {start, end, rects});\n }\n return rects\n}\n\nconst _caretsByRowCache = new WeakMap();\n\nfunction groupCaretsByRow(textRenderInfo) {\n // textRenderInfo is frozen so it's safe to cache based on it\n let caretsByRow = _caretsByRowCache.get(textRenderInfo);\n if (!caretsByRow) {\n const {caretPositions, caretHeight} = textRenderInfo;\n caretsByRow = new Map();\n for (let i = 0; i < caretPositions.length; i += 3) {\n const rowY = caretPositions[i + 2];\n let rowCarets = caretsByRow.get(rowY);\n if (!rowCarets) {\n caretsByRow.set(rowY, rowCarets = []);\n }\n rowCarets.push({\n x: caretPositions[i],\n y: rowY,\n height: caretHeight,\n charIndex: i / 3\n });\n // Add one more caret after the final char\n if (i + 3 >= caretPositions.length) {\n rowCarets.push({\n x: caretPositions[i + 1],\n y: rowY,\n height: caretHeight,\n charIndex: i / 3 + 1\n });\n }\n }\n }\n _caretsByRowCache.set(textRenderInfo, caretsByRow);\n return caretsByRow\n}\n\nexport { GlyphsGeometry, Text, configureTextBuilder, createTextDerivedMaterial, dumpSDFTextures, getCaretAtPoint, getSelectionRects, preloadFont, typesetterWorkerModule };\n","import {\n\tBox3,\n\tFloat32BufferAttribute,\n\tInstancedBufferGeometry,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tSphere,\n\tVector3,\n\tWireframeGeometry\n} from 'three';\n\nconst _box = new Box3();\nconst _vector = new Vector3();\n\nclass LineSegmentsGeometry extends InstancedBufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'LineSegmentsGeometry';\n\n\t\tconst positions = [ - 1, 2, 0, 1, 2, 0, - 1, 1, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\t\tconst uvs = [ - 1, 2, 1, 2, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 2, 1, - 2 ];\n\t\tconst index = [ 0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5 ];\n\n\t\tthis.setIndex( index );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined ) {\n\n\t\t\tstart.applyMatrix4( matrix );\n\n\t\t\tend.applyMatrix4( matrix );\n\n\t\t\tstart.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetPositions( array ) {\n\n\t\tlet lineSegments;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\tlineSegments = array;\n\n\t\t} else if ( Array.isArray( array ) ) {\n\n\t\t\tlineSegments = new Float32Array( array );\n\n\t\t}\n\n\t\tconst instanceBuffer = new InstancedInterleavedBuffer( lineSegments, 6, 1 ); // xyz, xyz\n\n\t\tthis.setAttribute( 'instanceStart', new InterleavedBufferAttribute( instanceBuffer, 3, 0 ) ); // xyz\n\t\tthis.setAttribute( 'instanceEnd', new InterleavedBufferAttribute( instanceBuffer, 3, 3 ) ); // xyz\n\n\t\t//\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\n\t\treturn this;\n\n\t}\n\n\tsetColors( array ) {\n\n\t\tlet colors;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\tcolors = array;\n\n\t\t} else if ( Array.isArray( array ) ) {\n\n\t\t\tcolors = new Float32Array( array );\n\n\t\t}\n\n\t\tconst instanceColorBuffer = new InstancedInterleavedBuffer( colors, 6, 1 ); // rgb, rgb\n\n\t\tthis.setAttribute( 'instanceColorStart', new InterleavedBufferAttribute( instanceColorBuffer, 3, 0 ) ); // rgb\n\t\tthis.setAttribute( 'instanceColorEnd', new InterleavedBufferAttribute( instanceColorBuffer, 3, 3 ) ); // rgb\n\n\t\treturn this;\n\n\t}\n\n\tfromWireframeGeometry( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t}\n\n\tfromEdgesGeometry( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t}\n\n\tfromMesh( mesh ) {\n\n\t\tthis.fromWireframeGeometry( new WireframeGeometry( mesh.geometry ) );\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t}\n\n\tfromLineSegments( lineSegments ) {\n\n\t\tconst geometry = lineSegments.geometry;\n\n\t\tif ( geometry.isGeometry ) {\n\n\t\t\tconsole.error( 'THREE.LineSegmentsGeometry no longer supports Geometry. Use THREE.BufferGeometry instead.' );\n\t\t\treturn;\n\n\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\tthis.setPositions( geometry.attributes.position.array ); // assumes non-indexed\n\n\t\t}\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( start );\n\n\t\t\t_box.setFromBufferAttribute( end );\n\n\t\t\tthis.boundingBox.union( _box );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\tthis.boundingBox.getCenter( center );\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = start.count; i < il; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( start, i );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t\t_vector.fromBufferAttribute( end, i );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\t// todo\n\n\t}\n\n\tapplyMatrix( matrix ) {\n\n\t\tconsole.warn( 'THREE.LineSegmentsGeometry: applyMatrix() has been renamed to applyMatrix4().' );\n\n\t\treturn this.applyMatrix4( matrix );\n\n\t}\n\n}\n\nLineSegmentsGeometry.prototype.isLineSegmentsGeometry = true;\n\nexport { LineSegmentsGeometry };\n","import {\n\tBox3,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tLine3,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tSphere,\n\tVector3,\n\tVector4\n} from 'three';\nimport { LineSegmentsGeometry } from '../lines/LineSegmentsGeometry.js';\nimport { LineMaterial } from '../lines/LineMaterial.js';\n\nconst _start = new Vector3();\nconst _end = new Vector3();\n\nconst _start4 = new Vector4();\nconst _end4 = new Vector4();\n\nconst _ssOrigin = new Vector4();\nconst _ssOrigin3 = new Vector3();\nconst _mvMatrix = new Matrix4();\nconst _line = new Line3();\nconst _closestPoint = new Vector3();\n\nconst _box = new Box3();\nconst _sphere = new Sphere();\nconst _clipToWorldVector = new Vector4();\n\nlet _ray, _instanceStart, _instanceEnd, _lineWidth;\n\n// Returns the margin required to expand by in world space given the distance from the camera,\n// line width, resolution, and camera projection\nfunction getWorldSpaceHalfWidth( camera, distance, resolution ) {\n\n\t// transform into clip space, adjust the x and y values by the pixel width offset, then\n\t// transform back into world space to get world offset. Note clip space is [-1, 1] so full\n\t// width does not need to be halved.\n\t_clipToWorldVector.set( 0, 0, - distance, 1.0 ).applyMatrix4( camera.projectionMatrix );\n\t_clipToWorldVector.multiplyScalar( 1.0 / _clipToWorldVector.w );\n\t_clipToWorldVector.x = _lineWidth / resolution.width;\n\t_clipToWorldVector.y = _lineWidth / resolution.height;\n\t_clipToWorldVector.applyMatrix4( camera.projectionMatrixInverse );\n\t_clipToWorldVector.multiplyScalar( 1.0 / _clipToWorldVector.w );\n\n\treturn Math.abs( Math.max( _clipToWorldVector.x, _clipToWorldVector.y ) );\n\n}\n\nfunction raycastWorldUnits( lineSegments, intersects ) {\n\n\tfor ( let i = 0, l = _instanceStart.count; i < l; i ++ ) {\n\n\t\t_line.start.fromBufferAttribute( _instanceStart, i );\n\t\t_line.end.fromBufferAttribute( _instanceEnd, i );\n\n\t\tconst pointOnLine = new Vector3();\n\t\tconst point = new Vector3();\n\n\t\t_ray.distanceSqToSegment( _line.start, _line.end, point, pointOnLine );\n\t\tconst isInside = point.distanceTo( pointOnLine ) < _lineWidth * 0.5;\n\n\t\tif ( isInside ) {\n\n\t\t\tintersects.push( {\n\t\t\t\tpoint,\n\t\t\t\tpointOnLine,\n\t\t\t\tdistance: _ray.origin.distanceTo( point ),\n\t\t\t\tobject: lineSegments,\n\t\t\t\tface: null,\n\t\t\t\tfaceIndex: i,\n\t\t\t\tuv: null,\n\t\t\t\tuv2: null,\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n}\n\nfunction raycastScreenSpace( lineSegments, camera, intersects ) {\n\n\tconst projectionMatrix = camera.projectionMatrix;\n\tconst material = lineSegments.material;\n\tconst resolution = material.resolution;\n\tconst matrixWorld = lineSegments.matrixWorld;\n\n\tconst geometry = lineSegments.geometry;\n\tconst instanceStart = geometry.attributes.instanceStart;\n\tconst instanceEnd = geometry.attributes.instanceEnd;\n\n\tconst near = - camera.near;\n\n\t//\n\n\t// pick a point 1 unit out along the ray to avoid the ray origin\n\t// sitting at the camera origin which will cause \"w\" to be 0 when\n\t// applying the projection matrix.\n\t_ray.at( 1, _ssOrigin );\n\n\t// ndc space [ - 1.0, 1.0 ]\n\t_ssOrigin.w = 1;\n\t_ssOrigin.applyMatrix4( camera.matrixWorldInverse );\n\t_ssOrigin.applyMatrix4( projectionMatrix );\n\t_ssOrigin.multiplyScalar( 1 / _ssOrigin.w );\n\n\t// screen space\n\t_ssOrigin.x *= resolution.x / 2;\n\t_ssOrigin.y *= resolution.y / 2;\n\t_ssOrigin.z = 0;\n\n\t_ssOrigin3.copy( _ssOrigin );\n\n\t_mvMatrix.multiplyMatrices( camera.matrixWorldInverse, matrixWorld );\n\n\tfor ( let i = 0, l = instanceStart.count; i < l; i ++ ) {\n\n\t\t_start4.fromBufferAttribute( instanceStart, i );\n\t\t_end4.fromBufferAttribute( instanceEnd, i );\n\n\t\t_start4.w = 1;\n\t\t_end4.w = 1;\n\n\t\t// camera space\n\t\t_start4.applyMatrix4( _mvMatrix );\n\t\t_end4.applyMatrix4( _mvMatrix );\n\n\t\t// skip the segment if it's entirely behind the camera\n\t\tconst isBehindCameraNear = _start4.z > near && _end4.z > near;\n\t\tif ( isBehindCameraNear ) {\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\t// trim the segment if it extends behind camera near\n\t\tif ( _start4.z > near ) {\n\n\t\t\tconst deltaDist = _start4.z - _end4.z;\n\t\t\tconst t = ( _start4.z - near ) / deltaDist;\n\t\t\t_start4.lerp( _end4, t );\n\n\t\t} else if ( _end4.z > near ) {\n\n\t\t\tconst deltaDist = _end4.z - _start4.z;\n\t\t\tconst t = ( _end4.z - near ) / deltaDist;\n\t\t\t_end4.lerp( _start4, t );\n\n\t\t}\n\n\t\t// clip space\n\t\t_start4.applyMatrix4( projectionMatrix );\n\t\t_end4.applyMatrix4( projectionMatrix );\n\n\t\t// ndc space [ - 1.0, 1.0 ]\n\t\t_start4.multiplyScalar( 1 / _start4.w );\n\t\t_end4.multiplyScalar( 1 / _end4.w );\n\n\t\t// screen space\n\t\t_start4.x *= resolution.x / 2;\n\t\t_start4.y *= resolution.y / 2;\n\n\t\t_end4.x *= resolution.x / 2;\n\t\t_end4.y *= resolution.y / 2;\n\n\t\t// create 2d segment\n\t\t_line.start.copy( _start4 );\n\t\t_line.start.z = 0;\n\n\t\t_line.end.copy( _end4 );\n\t\t_line.end.z = 0;\n\n\t\t// get closest point on ray to segment\n\t\tconst param = _line.closestPointToPointParameter( _ssOrigin3, true );\n\t\t_line.at( param, _closestPoint );\n\n\t\t// check if the intersection point is within clip space\n\t\tconst zPos = MathUtils.lerp( _start4.z, _end4.z, param );\n\t\tconst isInClipSpace = zPos >= - 1 && zPos <= 1;\n\n\t\tconst isInside = _ssOrigin3.distanceTo( _closestPoint ) < _lineWidth * 0.5;\n\n\t\tif ( isInClipSpace && isInside ) {\n\n\t\t\t_line.start.fromBufferAttribute( instanceStart, i );\n\t\t\t_line.end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t_line.start.applyMatrix4( matrixWorld );\n\t\t\t_line.end.applyMatrix4( matrixWorld );\n\n\t\t\tconst pointOnLine = new Vector3();\n\t\t\tconst point = new Vector3();\n\n\t\t\t_ray.distanceSqToSegment( _line.start, _line.end, point, pointOnLine );\n\n\t\t\tintersects.push( {\n\t\t\t\tpoint: point,\n\t\t\t\tpointOnLine: pointOnLine,\n\t\t\t\tdistance: _ray.origin.distanceTo( point ),\n\t\t\t\tobject: lineSegments,\n\t\t\t\tface: null,\n\t\t\t\tfaceIndex: i,\n\t\t\t\tuv: null,\n\t\t\t\tuv2: null,\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n}\n\nclass LineSegments2 extends Mesh {\n\n\tconstructor( geometry = new LineSegmentsGeometry(), material = new LineMaterial( { color: Math.random() * 0xffffff } ) ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'LineSegments2';\n\n\t}\n\n\t// for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst instanceStart = geometry.attributes.instanceStart;\n\t\tconst instanceEnd = geometry.attributes.instanceEnd;\n\t\tconst lineDistances = new Float32Array( 2 * instanceStart.count );\n\n\t\tfor ( let i = 0, j = 0, l = instanceStart.count; i < l; i ++, j += 2 ) {\n\n\t\t\t_start.fromBufferAttribute( instanceStart, i );\n\t\t\t_end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\tlineDistances[ j ] = ( j === 0 ) ? 0 : lineDistances[ j - 1 ];\n\t\t\tlineDistances[ j + 1 ] = lineDistances[ j ] + _start.distanceTo( _end );\n\n\t\t}\n\n\t\tconst instanceDistanceBuffer = new InstancedInterleavedBuffer( lineDistances, 2, 1 ); // d0, d1\n\n\t\tgeometry.setAttribute( 'instanceDistanceStart', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 0 ) ); // d0\n\t\tgeometry.setAttribute( 'instanceDistanceEnd', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 1 ) ); // d1\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst worldUnits = this.material.worldUnits;\n\t\tconst camera = raycaster.camera;\n\n\t\tif ( camera === null && ! worldUnits ) {\n\n\t\t\tconsole.error( 'LineSegments2: \"Raycaster.camera\" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.' );\n\n\t\t}\n\n\t\tconst threshold = ( raycaster.params.Line2 !== undefined ) ? raycaster.params.Line2.threshold || 0 : 0;\n\n\t\t_ray = raycaster.ray;\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\t_lineWidth = material.linewidth + threshold;\n\n\t\t_instanceStart = geometry.attributes.instanceStart;\n\t\t_instanceEnd = geometry.attributes.instanceEnd;\n\n\t\t// check if we intersect the sphere bounds\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\t_sphere.copy( geometry.boundingSphere ).applyMatrix4( matrixWorld );\n\n\t\t// increase the sphere bounds by the worst case line screen space width\n\t\tlet sphereMargin;\n\t\tif ( worldUnits ) {\n\n\t\t\tsphereMargin = _lineWidth * 0.5;\n\n\t\t} else {\n\n\t\t\tconst distanceToSphere = Math.max( camera.near, _sphere.distanceToPoint( _ray.origin ) );\n\t\t\tsphereMargin = getWorldSpaceHalfWidth( camera, distanceToSphere, material.resolution );\n\n\t\t}\n\n\t\t_sphere.radius += sphereMargin;\n\n\t\tif ( _ray.intersectsSphere( _sphere ) === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// check if we intersect the box bounds\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\t_box.copy( geometry.boundingBox ).applyMatrix4( matrixWorld );\n\n\t\t// increase the box bounds by the worst case line width\n\t\tlet boxMargin;\n\t\tif ( worldUnits ) {\n\n\t\t\tboxMargin = _lineWidth * 0.5;\n\n\t\t} else {\n\n\t\t\tconst distanceToBox = Math.max( camera.near, _box.distanceToPoint( _ray.origin ) );\n\t\t\tboxMargin = getWorldSpaceHalfWidth( camera, distanceToBox, material.resolution );\n\n\t\t}\n\n\t\t_box.expandByScalar( boxMargin );\n\n\t\tif ( _ray.intersectsBox( _box ) === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( worldUnits ) {\n\n\t\t\traycastWorldUnits( this, intersects );\n\n\t\t} else {\n\n\t\t\traycastScreenSpace( this, camera, intersects );\n\n\t\t}\n\n\t}\n\n}\n\nLineSegments2.prototype.isLineSegments2 = true;\n\nexport { LineSegments2 };\n","/**\n * Full-screen textured quad shader\n */\n\nconst CopyShader = {\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor.a *= opacity;\n\n\n\t\t}`\n\n};\n\nexport { CopyShader };\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\nclass Pass {\n\n\tconstructor() {\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nconst _geometry = new BufferGeometry();\n_geometry.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n_geometry.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","import {\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\n\nclass ShaderPass extends Pass {\n\n\tconstructor( shader, textureID ) {\n\n\t\tsuper();\n\n\t\tthis.textureID = ( textureID !== undefined ) ? textureID : 'tDiffuse';\n\n\t\tif ( shader instanceof ShaderMaterial ) {\n\n\t\t\tthis.uniforms = shader.uniforms;\n\n\t\t\tthis.material = shader;\n\n\t\t} else if ( shader ) {\n\n\t\t\tthis.uniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t\tthis.material = new ShaderMaterial( {\n\n\t\t\t\tdefines: Object.assign( {}, shader.defines ),\n\t\t\t\tuniforms: this.uniforms,\n\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\tfragmentShader: shader.fragmentShader\n\n\t\t\t} );\n\n\t\t}\n\n\t\tthis.fsQuad = new FullScreenQuad( this.material );\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].value = readBuffer.texture;\n\n\t\t}\n\n\t\tthis.fsQuad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n}\n\nexport { ShaderPass };\n","import { Pass } from './Pass.js';\n\nclass MaskPass extends Pass {\n\n\tconstructor( scene, camera ) {\n\n\t\tsuper();\n\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.clear = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis.inverse = false;\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst context = renderer.getContext();\n\t\tconst state = renderer.state;\n\n\t\t// don't update color or depth\n\n\t\tstate.buffers.color.setMask( false );\n\t\tstate.buffers.depth.setMask( false );\n\n\t\t// lock buffers\n\n\t\tstate.buffers.color.setLocked( true );\n\t\tstate.buffers.depth.setLocked( true );\n\n\t\t// set up stencil\n\n\t\tlet writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tstate.buffers.stencil.setTest( true );\n\t\tstate.buffers.stencil.setOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tstate.buffers.stencil.setFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tstate.buffers.stencil.setClear( clearValue );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.setRenderTarget( readBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\trenderer.setRenderTarget( writeBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// unlock color and depth buffer for subsequent rendering\n\n\t\tstate.buffers.color.setLocked( false );\n\t\tstate.buffers.depth.setLocked( false );\n\n\t\t// only render where stencil is set to 1\n\n\t\tstate.buffers.stencil.setLocked( false );\n\t\tstate.buffers.stencil.setFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n\t\tstate.buffers.stencil.setOp( context.KEEP, context.KEEP, context.KEEP );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t}\n\n}\n\nclass ClearMaskPass extends Pass {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.needsSwap = false;\n\n\t}\n\n\trender( renderer /*, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\trenderer.state.buffers.stencil.setLocked( false );\n\t\trenderer.state.buffers.stencil.setTest( false );\n\n\t}\n\n}\n\nexport { MaskPass, ClearMaskPass };\n","import {\n\tBufferGeometry,\n\tClock,\n\tFloat32BufferAttribute,\n\tMesh,\n\tOrthographicCamera,\n\tVector2,\n\tWebGLRenderTarget\n} from 'three';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { ShaderPass } from './ShaderPass.js';\nimport { MaskPass } from './MaskPass.js';\nimport { ClearMaskPass } from './MaskPass.js';\n\nclass EffectComposer {\n\n\tconstructor( renderer, renderTarget ) {\n\n\t\tthis.renderer = renderer;\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = renderer.getSize( new Vector2() );\n\t\t\tthis._pixelRatio = renderer.getPixelRatio();\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = new WebGLRenderTarget( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\t\t\trenderTarget.texture.name = 'EffectComposer.rt1';\n\n\t\t} else {\n\n\t\t\tthis._pixelRatio = 1;\n\t\t\tthis._width = renderTarget.width;\n\t\t\tthis._height = renderTarget.height;\n\n\t\t}\n\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\t\tthis.renderTarget2.texture.name = 'EffectComposer.rt2';\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tthis.renderToScreen = true;\n\n\t\tthis.passes = [];\n\n\t\t// dependencies\n\n\t\tif ( CopyShader === undefined ) {\n\n\t\t\tconsole.error( 'THREE.EffectComposer relies on CopyShader' );\n\n\t\t}\n\n\t\tif ( ShaderPass === undefined ) {\n\n\t\t\tconsole.error( 'THREE.EffectComposer relies on ShaderPass' );\n\n\t\t}\n\n\t\tthis.copyPass = new ShaderPass( CopyShader );\n\n\t\tthis.clock = new Clock();\n\n\t}\n\n\tswapBuffers() {\n\n\t\tconst tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t}\n\n\taddPass( pass ) {\n\n\t\tthis.passes.push( pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tinsertPass( pass, index ) {\n\n\t\tthis.passes.splice( index, 0, pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tremovePass( pass ) {\n\n\t\tconst index = this.passes.indexOf( pass );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tthis.passes.splice( index, 1 );\n\n\t\t}\n\n\t}\n\n\tisLastEnabledPass( passIndex ) {\n\n\t\tfor ( let i = passIndex + 1; i < this.passes.length; i ++ ) {\n\n\t\t\tif ( this.passes[ i ].enabled ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\trender( deltaTime ) {\n\n\t\t// deltaTime value is in seconds\n\n\t\tif ( deltaTime === undefined ) {\n\n\t\t\tdeltaTime = this.clock.getDelta();\n\n\t\t}\n\n\t\tconst currentRenderTarget = this.renderer.getRenderTarget();\n\n\t\tlet maskActive = false;\n\n\t\tfor ( let i = 0, il = this.passes.length; i < il; i ++ ) {\n\n\t\t\tconst pass = this.passes[ i ];\n\n\t\t\tif ( pass.enabled === false ) continue;\n\n\t\t\tpass.renderToScreen = ( this.renderToScreen && this.isLastEnabledPass( i ) );\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tconst context = this.renderer.getContext();\n\t\t\t\t\tconst stencil = this.renderer.state.buffers.stencil;\n\n\t\t\t\t\t//context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime );\n\n\t\t\t\t\t//context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( MaskPass !== undefined ) {\n\n\t\t\t\tif ( pass instanceof MaskPass ) {\n\n\t\t\t\t\tmaskActive = true;\n\n\t\t\t\t} else if ( pass instanceof ClearMaskPass ) {\n\n\t\t\t\t\tmaskActive = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.renderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\treset( renderTarget ) {\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = this.renderer.getSize( new Vector2() );\n\t\t\tthis._pixelRatio = this.renderer.getPixelRatio();\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = this.renderTarget1.clone();\n\t\t\trenderTarget.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t\t}\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tthis._width = width;\n\t\tthis._height = height;\n\n\t\tconst effectiveWidth = this._width * this._pixelRatio;\n\t\tconst effectiveHeight = this._height * this._pixelRatio;\n\n\t\tthis.renderTarget1.setSize( effectiveWidth, effectiveHeight );\n\t\tthis.renderTarget2.setSize( effectiveWidth, effectiveHeight );\n\n\t\tfor ( let i = 0; i < this.passes.length; i ++ ) {\n\n\t\t\tthis.passes[ i ].setSize( effectiveWidth, effectiveHeight );\n\n\t\t}\n\n\t}\n\n\tsetPixelRatio( pixelRatio ) {\n\n\t\tthis._pixelRatio = pixelRatio;\n\n\t\tthis.setSize( this._width, this._height );\n\n\t}\n\n}\n\n\nclass Pass {\n\n\tconstructor() {\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nconst _geometry = new BufferGeometry();\n_geometry.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n_geometry.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { EffectComposer, Pass, FullScreenQuad };\n","import {\n\tMatrix4,\n\tVector2\n} from 'three';\n\n/**\n * TODO\n */\n\nconst SAOShader = {\n\tdefines: {\n\t\t'NUM_SAMPLES': 7,\n\t\t'NUM_RINGS': 4,\n\t\t'NORMAL_TEXTURE': 0,\n\t\t'DIFFUSE_TEXTURE': 0,\n\t\t'DEPTH_PACKING': 1,\n\t\t'PERSPECTIVE_CAMERA': 1\n\t},\n\tuniforms: {\n\n\t\t'tDepth': { value: null },\n\t\t'tDiffuse': { value: null },\n\t\t'tNormal': { value: null },\n\t\t'size': { value: new Vector2( 512, 512 ) },\n\n\t\t'cameraNear': { value: 1 },\n\t\t'cameraFar': { value: 100 },\n\t\t'cameraProjectionMatrix': { value: new Matrix4() },\n\t\t'cameraInverseProjectionMatrix': { value: new Matrix4() },\n\n\t\t'scale': { value: 1.0 },\n\t\t'intensity': { value: 0.1 },\n\t\t'bias': { value: 0.5 },\n\n\t\t'minResolution': { value: 0.0 },\n\t\t'kernelRadius': { value: 100.0 },\n\t\t'randomSeed': { value: 0.0 }\n\t},\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#include \n\n\t\tvarying vec2 vUv;\n\n\t\t#if DIFFUSE_TEXTURE == 1\n\t\tuniform sampler2D tDiffuse;\n\t\t#endif\n\n\t\tuniform sampler2D tDepth;\n\n\t\t#if NORMAL_TEXTURE == 1\n\t\tuniform sampler2D tNormal;\n\t\t#endif\n\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform mat4 cameraProjectionMatrix;\n\t\tuniform mat4 cameraInverseProjectionMatrix;\n\n\t\tuniform float scale;\n\t\tuniform float intensity;\n\t\tuniform float bias;\n\t\tuniform float kernelRadius;\n\t\tuniform float minResolution;\n\t\tuniform vec2 size;\n\t\tuniform float randomSeed;\n\n\t\t// RGBA depth\n\n\t\t#include \n\n\t\tvec4 getDefaultColor( const in vec2 screenPosition ) {\n\t\t\t#if DIFFUSE_TEXTURE == 1\n\t\t\treturn texture2D( tDiffuse, vUv );\n\t\t\t#else\n\t\t\treturn vec4( 1.0 );\n\t\t\t#endif\n\t\t}\n\n\t\tfloat getDepth( const in vec2 screenPosition ) {\n\t\t\t#if DEPTH_PACKING == 1\n\t\t\treturn unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );\n\t\t\t#else\n\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\t\t\t#endif\n\t\t}\n\n\t\tfloat getViewZ( const in float depth ) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\n\t\t\t#else\n\t\t\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 getViewPosition( const in vec2 screenPosition, const in float depth, const in float viewZ ) {\n\t\t\tfloat clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];\n\t\t\tvec4 clipPosition = vec4( ( vec3( screenPosition, depth ) - 0.5 ) * 2.0, 1.0 );\n\t\t\tclipPosition *= clipW; // unprojection.\n\n\t\t\treturn ( cameraInverseProjectionMatrix * clipPosition ).xyz;\n\t\t}\n\n\t\tvec3 getViewNormal( const in vec3 viewPosition, const in vec2 screenPosition ) {\n\t\t\t#if NORMAL_TEXTURE == 1\n\t\t\treturn unpackRGBToNormal( texture2D( tNormal, screenPosition ).xyz );\n\t\t\t#else\n\t\t\treturn normalize( cross( dFdx( viewPosition ), dFdy( viewPosition ) ) );\n\t\t\t#endif\n\t\t}\n\n\t\tfloat scaleDividedByCameraFar;\n\t\tfloat minResolutionMultipliedByCameraFar;\n\n\t\tfloat getOcclusion( const in vec3 centerViewPosition, const in vec3 centerViewNormal, const in vec3 sampleViewPosition ) {\n\t\t\tvec3 viewDelta = sampleViewPosition - centerViewPosition;\n\t\t\tfloat viewDistance = length( viewDelta );\n\t\t\tfloat scaledScreenDistance = scaleDividedByCameraFar * viewDistance;\n\n\t\t\treturn max(0.0, (dot(centerViewNormal, viewDelta) - minResolutionMultipliedByCameraFar) / scaledScreenDistance - bias) / (1.0 + pow2( scaledScreenDistance ) );\n\t\t}\n\n\t\t// moving costly divides into consts\n\t\tconst float ANGLE_STEP = PI2 * float( NUM_RINGS ) / float( NUM_SAMPLES );\n\t\tconst float INV_NUM_SAMPLES = 1.0 / float( NUM_SAMPLES );\n\n\t\tfloat getAmbientOcclusion( const in vec3 centerViewPosition ) {\n\t\t\t// precompute some variables require in getOcclusion.\n\t\t\tscaleDividedByCameraFar = scale / cameraFar;\n\t\t\tminResolutionMultipliedByCameraFar = minResolution * cameraFar;\n\t\t\tvec3 centerViewNormal = getViewNormal( centerViewPosition, vUv );\n\n\t\t\t// jsfiddle that shows sample pattern: https://jsfiddle.net/a16ff1p7/\n\t\t\tfloat angle = rand( vUv + randomSeed ) * PI2;\n\t\t\tvec2 radius = vec2( kernelRadius * INV_NUM_SAMPLES ) / size;\n\t\t\tvec2 radiusStep = radius;\n\n\t\t\tfloat occlusionSum = 0.0;\n\t\t\tfloat weightSum = 0.0;\n\n\t\t\tfor( int i = 0; i < NUM_SAMPLES; i ++ ) {\n\t\t\t\tvec2 sampleUv = vUv + vec2( cos( angle ), sin( angle ) ) * radius;\n\t\t\t\tradius += radiusStep;\n\t\t\t\tangle += ANGLE_STEP;\n\n\t\t\t\tfloat sampleDepth = getDepth( sampleUv );\n\t\t\t\tif( sampleDepth >= ( 1.0 - EPSILON ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfloat sampleViewZ = getViewZ( sampleDepth );\n\t\t\t\tvec3 sampleViewPosition = getViewPosition( sampleUv, sampleDepth, sampleViewZ );\n\t\t\t\tocclusionSum += getOcclusion( centerViewPosition, centerViewNormal, sampleViewPosition );\n\t\t\t\tweightSum += 1.0;\n\t\t\t}\n\n\t\t\tif( weightSum == 0.0 ) discard;\n\n\t\t\treturn occlusionSum * ( intensity / weightSum );\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat centerDepth = getDepth( vUv );\n\t\t\tif( centerDepth >= ( 1.0 - EPSILON ) ) {\n\t\t\t\tdiscard;\n\t\t\t}\n\n\t\t\tfloat centerViewZ = getViewZ( centerDepth );\n\t\t\tvec3 viewPosition = getViewPosition( vUv, centerDepth, centerViewZ );\n\n\t\t\tfloat ambientOcclusion = getAmbientOcclusion( viewPosition );\n\n\t\t\tgl_FragColor = getDefaultColor( vUv );\n\t\t\tgl_FragColor.xyz *= 1.0 - ambientOcclusion;\n\t\t}`\n\n};\n\nexport { SAOShader };\n","import {\n\tVector2\n} from 'three';\n\n/**\n * TODO\n */\n\nconst DepthLimitedBlurShader = {\n\tdefines: {\n\t\t'KERNEL_RADIUS': 4,\n\t\t'DEPTH_PACKING': 1,\n\t\t'PERSPECTIVE_CAMERA': 1\n\t},\n\tuniforms: {\n\t\t'tDiffuse': { value: null },\n\t\t'size': { value: new Vector2( 512, 512 ) },\n\t\t'sampleUvOffsets': { value: [ new Vector2( 0, 0 ) ] },\n\t\t'sampleWeights': { value: [ 1.0 ] },\n\t\t'tDepth': { value: null },\n\t\t'cameraNear': { value: 10 },\n\t\t'cameraFar': { value: 1000 },\n\t\t'depthCutoff': { value: 10 },\n\t},\n\tvertexShader: /* glsl */`\n\n\t\t#include \n\n\t\tuniform vec2 size;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec2 vInvSize;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tvInvSize = 1.0 / size;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#include \n\t\t#include \n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tDepth;\n\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform float depthCutoff;\n\n\t\tuniform vec2 sampleUvOffsets[ KERNEL_RADIUS + 1 ];\n\t\tuniform float sampleWeights[ KERNEL_RADIUS + 1 ];\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec2 vInvSize;\n\n\t\tfloat getDepth( const in vec2 screenPosition ) {\n\t\t\t#if DEPTH_PACKING == 1\n\t\t\treturn unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );\n\t\t\t#else\n\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\t\t\t#endif\n\t\t}\n\n\t\tfloat getViewZ( const in float depth ) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\n\t\t\t#else\n\t\t\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\n\t\t\t#endif\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getDepth( vUv );\n\t\t\tif( depth >= ( 1.0 - EPSILON ) ) {\n\t\t\t\tdiscard;\n\t\t\t}\n\n\t\t\tfloat centerViewZ = -getViewZ( depth );\n\t\t\tbool rBreak = false, lBreak = false;\n\n\t\t\tfloat weightSum = sampleWeights[0];\n\t\t\tvec4 diffuseSum = texture2D( tDiffuse, vUv ) * weightSum;\n\n\t\t\tfor( int i = 1; i <= KERNEL_RADIUS; i ++ ) {\n\n\t\t\t\tfloat sampleWeight = sampleWeights[i];\n\t\t\t\tvec2 sampleUvOffset = sampleUvOffsets[i] * vInvSize;\n\n\t\t\t\tvec2 sampleUv = vUv + sampleUvOffset;\n\t\t\t\tfloat viewZ = -getViewZ( getDepth( sampleUv ) );\n\n\t\t\t\tif( abs( viewZ - centerViewZ ) > depthCutoff ) rBreak = true;\n\n\t\t\t\tif( ! rBreak ) {\n\t\t\t\t\tdiffuseSum += texture2D( tDiffuse, sampleUv ) * sampleWeight;\n\t\t\t\t\tweightSum += sampleWeight;\n\t\t\t\t}\n\n\t\t\t\tsampleUv = vUv - sampleUvOffset;\n\t\t\t\tviewZ = -getViewZ( getDepth( sampleUv ) );\n\n\t\t\t\tif( abs( viewZ - centerViewZ ) > depthCutoff ) lBreak = true;\n\n\t\t\t\tif( ! lBreak ) {\n\t\t\t\t\tdiffuseSum += texture2D( tDiffuse, sampleUv ) * sampleWeight;\n\t\t\t\t\tweightSum += sampleWeight;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgl_FragColor = diffuseSum / weightSum;\n\t\t}`\n\n};\n\nconst BlurShaderUtils = {\n\n\tcreateSampleWeights: function ( kernelRadius, stdDev ) {\n\n\t\tconst weights = [];\n\n\t\tfor ( let i = 0; i <= kernelRadius; i ++ ) {\n\n\t\t\tweights.push( gaussian( i, stdDev ) );\n\n\t\t}\n\n\t\treturn weights;\n\n\t},\n\n\tcreateSampleOffsets: function ( kernelRadius, uvIncrement ) {\n\n\t\tconst offsets = [];\n\n\t\tfor ( let i = 0; i <= kernelRadius; i ++ ) {\n\n\t\t\toffsets.push( uvIncrement.clone().multiplyScalar( i ) );\n\n\t\t}\n\n\t\treturn offsets;\n\n\t},\n\n\tconfigure: function ( material, kernelRadius, stdDev, uvIncrement ) {\n\n\t\tmaterial.defines[ 'KERNEL_RADIUS' ] = kernelRadius;\n\t\tmaterial.uniforms[ 'sampleUvOffsets' ].value = BlurShaderUtils.createSampleOffsets( kernelRadius, uvIncrement );\n\t\tmaterial.uniforms[ 'sampleWeights' ].value = BlurShaderUtils.createSampleWeights( kernelRadius, stdDev );\n\t\tmaterial.needsUpdate = true;\n\n\t}\n\n};\n\nfunction gaussian( x, stdDev ) {\n\n\treturn Math.exp( - ( x * x ) / ( 2.0 * ( stdDev * stdDev ) ) ) / ( Math.sqrt( 2.0 * Math.PI ) * stdDev );\n\n}\n\nexport { DepthLimitedBlurShader, BlurShaderUtils };\n","// Ported from Stefan Gustavson's java implementation\n// http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf\n// Read Stefan's excellent paper for details on how this code works.\n//\n// Sean McCullough banksean@gmail.com\n//\n// Added 4D noise\n\n/**\n * You can pass in a random number generator object if you like.\n * It is assumed to have a random() method.\n */\nclass SimplexNoise {\n\n\tconstructor( r = Math ) {\n\n\t\tthis.grad3 = [[ 1, 1, 0 ], [ - 1, 1, 0 ], [ 1, - 1, 0 ], [ - 1, - 1, 0 ],\n\t\t\t[ 1, 0, 1 ], [ - 1, 0, 1 ], [ 1, 0, - 1 ], [ - 1, 0, - 1 ],\n\t\t\t[ 0, 1, 1 ], [ 0, - 1, 1 ], [ 0, 1, - 1 ], [ 0, - 1, - 1 ]];\n\n\t\tthis.grad4 = [[ 0, 1, 1, 1 ], [ 0, 1, 1, - 1 ], [ 0, 1, - 1, 1 ], [ 0, 1, - 1, - 1 ],\n\t\t\t[ 0, - 1, 1, 1 ], [ 0, - 1, 1, - 1 ], [ 0, - 1, - 1, 1 ], [ 0, - 1, - 1, - 1 ],\n\t\t\t[ 1, 0, 1, 1 ], [ 1, 0, 1, - 1 ], [ 1, 0, - 1, 1 ], [ 1, 0, - 1, - 1 ],\n\t\t\t[ - 1, 0, 1, 1 ], [ - 1, 0, 1, - 1 ], [ - 1, 0, - 1, 1 ], [ - 1, 0, - 1, - 1 ],\n\t\t\t[ 1, 1, 0, 1 ], [ 1, 1, 0, - 1 ], [ 1, - 1, 0, 1 ], [ 1, - 1, 0, - 1 ],\n\t\t\t[ - 1, 1, 0, 1 ], [ - 1, 1, 0, - 1 ], [ - 1, - 1, 0, 1 ], [ - 1, - 1, 0, - 1 ],\n\t\t\t[ 1, 1, 1, 0 ], [ 1, 1, - 1, 0 ], [ 1, - 1, 1, 0 ], [ 1, - 1, - 1, 0 ],\n\t\t\t[ - 1, 1, 1, 0 ], [ - 1, 1, - 1, 0 ], [ - 1, - 1, 1, 0 ], [ - 1, - 1, - 1, 0 ]];\n\n\t\tthis.p = [];\n\n\t\tfor ( let i = 0; i < 256; i ++ ) {\n\n\t\t\tthis.p[ i ] = Math.floor( r.random() * 256 );\n\n\t\t}\n\n\t\t// To remove the need for index wrapping, double the permutation table length\n\t\tthis.perm = [];\n\n\t\tfor ( let i = 0; i < 512; i ++ ) {\n\n\t\t\tthis.perm[ i ] = this.p[ i & 255 ];\n\n\t\t}\n\n\t\t// A lookup table to traverse the simplex around a given point in 4D.\n\t\t// Details can be found where this table is used, in the 4D noise method.\n\t\tthis.simplex = [\n\t\t\t[ 0, 1, 2, 3 ], [ 0, 1, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 2, 3, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 2, 3, 0 ],\n\t\t\t[ 0, 2, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 3, 1, 2 ], [ 0, 3, 2, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 3, 2, 0 ],\n\t\t\t[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ],\n\t\t\t[ 1, 2, 0, 3 ], [ 0, 0, 0, 0 ], [ 1, 3, 0, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 3, 0, 1 ], [ 2, 3, 1, 0 ],\n\t\t\t[ 1, 0, 2, 3 ], [ 1, 0, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 0, 3, 1 ], [ 0, 0, 0, 0 ], [ 2, 1, 3, 0 ],\n\t\t\t[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ],\n\t\t\t[ 2, 0, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 0, 1, 2 ], [ 3, 0, 2, 1 ], [ 0, 0, 0, 0 ], [ 3, 1, 2, 0 ],\n\t\t\t[ 2, 1, 0, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 1, 0, 2 ], [ 0, 0, 0, 0 ], [ 3, 2, 0, 1 ], [ 3, 2, 1, 0 ]];\n\n\t}\n\n\tdot( g, x, y ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y;\n\n\t}\n\n\tdot3( g, x, y, z ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z;\n\n\t}\n\n\tdot4( g, x, y, z, w ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z + g[ 3 ] * w;\n\n\t}\n\n\tnoise( xin, yin ) {\n\n\t\tlet n0; // Noise contributions from the three corners\n\t\tlet n1;\n\t\tlet n2;\n\t\t// Skew the input space to determine which simplex cell we're in\n\t\tconst F2 = 0.5 * ( Math.sqrt( 3.0 ) - 1.0 );\n\t\tconst s = ( xin + yin ) * F2; // Hairy factor for 2D\n\t\tconst i = Math.floor( xin + s );\n\t\tconst j = Math.floor( yin + s );\n\t\tconst G2 = ( 3.0 - Math.sqrt( 3.0 ) ) / 6.0;\n\t\tconst t = ( i + j ) * G2;\n\t\tconst X0 = i - t; // Unskew the cell origin back to (x,y) space\n\t\tconst Y0 = j - t;\n\t\tconst x0 = xin - X0; // The x,y distances from the cell origin\n\t\tconst y0 = yin - Y0;\n\n\t\t// For the 2D case, the simplex shape is an equilateral triangle.\n\t\t// Determine which simplex we are in.\n\t\tlet i1; // Offsets for second (middle) corner of simplex in (i,j) coords\n\n\t\tlet j1;\n\t\tif ( x0 > y0 ) {\n\n\t\t\ti1 = 1; j1 = 0;\n\n\t\t\t// lower triangle, XY order: (0,0)->(1,0)->(1,1)\n\n\t\t}\telse {\n\n\t\t\ti1 = 0; j1 = 1;\n\n\t\t} // upper triangle, YX order: (0,0)->(0,1)->(1,1)\n\n\t\t// A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and\n\t\t// a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where\n\t\t// c = (3-sqrt(3))/6\n\t\tconst x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords\n\t\tconst y1 = y0 - j1 + G2;\n\t\tconst x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords\n\t\tconst y2 = y0 - 1.0 + 2.0 * G2;\n\t\t// Work out the hashed gradient indices of the three simplex corners\n\t\tconst ii = i & 255;\n\t\tconst jj = j & 255;\n\t\tconst gi0 = this.perm[ ii + this.perm[ jj ] ] % 12;\n\t\tconst gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 ] ] % 12;\n\t\tconst gi2 = this.perm[ ii + 1 + this.perm[ jj + 1 ] ] % 12;\n\t\t// Calculate the contribution from the three corners\n\t\tlet t0 = 0.5 - x0 * x0 - y0 * y0;\n\t\tif ( t0 < 0 ) n0 = 0.0;\n\t\telse {\n\n\t\t\tt0 *= t0;\n\t\t\tn0 = t0 * t0 * this.dot( this.grad3[ gi0 ], x0, y0 ); // (x,y) of grad3 used for 2D gradient\n\n\t\t}\n\n\t\tlet t1 = 0.5 - x1 * x1 - y1 * y1;\n\t\tif ( t1 < 0 ) n1 = 0.0;\n\t\telse {\n\n\t\t\tt1 *= t1;\n\t\t\tn1 = t1 * t1 * this.dot( this.grad3[ gi1 ], x1, y1 );\n\n\t\t}\n\n\t\tlet t2 = 0.5 - x2 * x2 - y2 * y2;\n\t\tif ( t2 < 0 ) n2 = 0.0;\n\t\telse {\n\n\t\t\tt2 *= t2;\n\t\t\tn2 = t2 * t2 * this.dot( this.grad3[ gi2 ], x2, y2 );\n\n\t\t}\n\n\t\t// Add contributions from each corner to get the final noise value.\n\t\t// The result is scaled to return values in the interval [-1,1].\n\t\treturn 70.0 * ( n0 + n1 + n2 );\n\n\t}\n\n\t// 3D simplex noise\n\tnoise3d( xin, yin, zin ) {\n\n\t\tlet n0; // Noise contributions from the four corners\n\t\tlet n1;\n\t\tlet n2;\n\t\tlet n3;\n\t\t// Skew the input space to determine which simplex cell we're in\n\t\tconst F3 = 1.0 / 3.0;\n\t\tconst s = ( xin + yin + zin ) * F3; // Very nice and simple skew factor for 3D\n\t\tconst i = Math.floor( xin + s );\n\t\tconst j = Math.floor( yin + s );\n\t\tconst k = Math.floor( zin + s );\n\t\tconst G3 = 1.0 / 6.0; // Very nice and simple unskew factor, too\n\t\tconst t = ( i + j + k ) * G3;\n\t\tconst X0 = i - t; // Unskew the cell origin back to (x,y,z) space\n\t\tconst Y0 = j - t;\n\t\tconst Z0 = k - t;\n\t\tconst x0 = xin - X0; // The x,y,z distances from the cell origin\n\t\tconst y0 = yin - Y0;\n\t\tconst z0 = zin - Z0;\n\n\t\t// For the 3D case, the simplex shape is a slightly irregular tetrahedron.\n\t\t// Determine which simplex we are in.\n\t\tlet i1; // Offsets for second corner of simplex in (i,j,k) coords\n\n\t\tlet j1;\n\t\tlet k1;\n\t\tlet i2; // Offsets for third corner of simplex in (i,j,k) coords\n\t\tlet j2;\n\t\tlet k2;\n\t\tif ( x0 >= y0 ) {\n\n\t\t\tif ( y0 >= z0 ) {\n\n\t\t\t\ti1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 1; k2 = 0;\n\n\t\t\t\t// X Y Z order\n\n\t\t\t} else if ( x0 >= z0 ) {\n\n\t\t\t\ti1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1;\n\n\t\t\t\t// X Z Y order\n\n\t\t\t} else {\n\n\t\t\t\ti1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1;\n\n\t\t\t} // Z X Y order\n\n\t\t} else { // x0 y0 ) ? 32 : 0;\n\t\tconst c2 = ( x0 > z0 ) ? 16 : 0;\n\t\tconst c3 = ( y0 > z0 ) ? 8 : 0;\n\t\tconst c4 = ( x0 > w0 ) ? 4 : 0;\n\t\tconst c5 = ( y0 > w0 ) ? 2 : 0;\n\t\tconst c6 = ( z0 > w0 ) ? 1 : 0;\n\t\tconst c = c1 + c2 + c3 + c4 + c5 + c6;\n\n\t\t// simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.\n\t\t// Many values of c will never occur, since e.g. x>y>z>w makes x= 3 ? 1 : 0;\n\t\tconst j1 = simplex[ c ][ 1 ] >= 3 ? 1 : 0;\n\t\tconst k1 = simplex[ c ][ 2 ] >= 3 ? 1 : 0;\n\t\tconst l1 = simplex[ c ][ 3 ] >= 3 ? 1 : 0;\n\t\t// The number 2 in the \"simplex\" array is at the second largest coordinate.\n\t\tconst i2 = simplex[ c ][ 0 ] >= 2 ? 1 : 0;\n\t\tconst j2 = simplex[ c ][ 1 ] >= 2 ? 1 : 0;\n\t\tconst k2 = simplex[ c ][ 2 ] >= 2 ? 1 : 0;\n\t\tconst l2 = simplex[ c ][ 3 ] >= 2 ? 1 : 0;\n\t\t// The number 1 in the \"simplex\" array is at the second smallest coordinate.\n\t\tconst i3 = simplex[ c ][ 0 ] >= 1 ? 1 : 0;\n\t\tconst j3 = simplex[ c ][ 1 ] >= 1 ? 1 : 0;\n\t\tconst k3 = simplex[ c ][ 2 ] >= 1 ? 1 : 0;\n\t\tconst l3 = simplex[ c ][ 3 ] >= 1 ? 1 : 0;\n\t\t// The fifth corner has all coordinate offsets = 1, so no need to look that up.\n\t\tconst x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords\n\t\tconst y1 = y0 - j1 + G4;\n\t\tconst z1 = z0 - k1 + G4;\n\t\tconst w1 = w0 - l1 + G4;\n\t\tconst x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords\n\t\tconst y2 = y0 - j2 + 2.0 * G4;\n\t\tconst z2 = z0 - k2 + 2.0 * G4;\n\t\tconst w2 = w0 - l2 + 2.0 * G4;\n\t\tconst x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords\n\t\tconst y3 = y0 - j3 + 3.0 * G4;\n\t\tconst z3 = z0 - k3 + 3.0 * G4;\n\t\tconst w3 = w0 - l3 + 3.0 * G4;\n\t\tconst x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords\n\t\tconst y4 = y0 - 1.0 + 4.0 * G4;\n\t\tconst z4 = z0 - 1.0 + 4.0 * G4;\n\t\tconst w4 = w0 - 1.0 + 4.0 * G4;\n\t\t// Work out the hashed gradient indices of the five simplex corners\n\t\tconst ii = i & 255;\n\t\tconst jj = j & 255;\n\t\tconst kk = k & 255;\n\t\tconst ll = l & 255;\n\t\tconst gi0 = perm[ ii + perm[ jj + perm[ kk + perm[ ll ] ] ] ] % 32;\n\t\tconst gi1 = perm[ ii + i1 + perm[ jj + j1 + perm[ kk + k1 + perm[ ll + l1 ] ] ] ] % 32;\n\t\tconst gi2 = perm[ ii + i2 + perm[ jj + j2 + perm[ kk + k2 + perm[ ll + l2 ] ] ] ] % 32;\n\t\tconst gi3 = perm[ ii + i3 + perm[ jj + j3 + perm[ kk + k3 + perm[ ll + l3 ] ] ] ] % 32;\n\t\tconst gi4 = perm[ ii + 1 + perm[ jj + 1 + perm[ kk + 1 + perm[ ll + 1 ] ] ] ] % 32;\n\t\t// Calculate the contribution from the five corners\n\t\tlet t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;\n\t\tif ( t0 < 0 ) n0 = 0.0;\n\t\telse {\n\n\t\t\tt0 *= t0;\n\t\t\tn0 = t0 * t0 * this.dot4( grad4[ gi0 ], x0, y0, z0, w0 );\n\n\t\t}\n\n\t\tlet t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;\n\t\tif ( t1 < 0 ) n1 = 0.0;\n\t\telse {\n\n\t\t\tt1 *= t1;\n\t\t\tn1 = t1 * t1 * this.dot4( grad4[ gi1 ], x1, y1, z1, w1 );\n\n\t\t}\n\n\t\tlet t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;\n\t\tif ( t2 < 0 ) n2 = 0.0;\n\t\telse {\n\n\t\t\tt2 *= t2;\n\t\t\tn2 = t2 * t2 * this.dot4( grad4[ gi2 ], x2, y2, z2, w2 );\n\n\t\t}\n\n\t\tlet t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;\n\t\tif ( t3 < 0 ) n3 = 0.0;\n\t\telse {\n\n\t\t\tt3 *= t3;\n\t\t\tn3 = t3 * t3 * this.dot4( grad4[ gi3 ], x3, y3, z3, w3 );\n\n\t\t}\n\n\t\tlet t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;\n\t\tif ( t4 < 0 ) n4 = 0.0;\n\t\telse {\n\n\t\t\tt4 *= t4;\n\t\t\tn4 = t4 * t4 * this.dot4( grad4[ gi4 ], x4, y4, z4, w4 );\n\n\t\t}\n\n\t\t// Sum up and scale the result to cover the range [-1,1]\n\t\treturn 27.0 * ( n0 + n1 + n2 + n3 + n4 );\n\n\t}\n\n}\n\nexport { SimplexNoise };\n","import {\n\tBoxGeometry,\n\tBufferGeometry,\n\tCylinderGeometry,\n\tDoubleSide,\n\tEuler,\n\tFloat32BufferAttribute,\n\tLine,\n\tLineBasicMaterial,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tObject3D,\n\tOctahedronGeometry,\n\tPlaneGeometry,\n\tQuaternion,\n\tRaycaster,\n\tSphereGeometry,\n\tTorusGeometry,\n\tVector3\n} from 'three';\n\nconst _raycaster = new Raycaster();\n\nconst _tempVector = new Vector3();\nconst _tempVector2 = new Vector3();\nconst _tempQuaternion = new Quaternion();\nconst _unit = {\n\tX: new Vector3( 1, 0, 0 ),\n\tY: new Vector3( 0, 1, 0 ),\n\tZ: new Vector3( 0, 0, 1 )\n};\n\nconst _changeEvent = { type: 'change' };\nconst _mouseDownEvent = { type: 'mouseDown' };\nconst _mouseUpEvent = { type: 'mouseUp', mode: null };\nconst _objectChangeEvent = { type: 'objectChange' };\n\nclass TransformControls extends Object3D {\n\n\tconstructor( camera, domElement ) {\n\n\t\tsuper();\n\n\t\tif ( domElement === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.TransformControls: The second parameter \"domElement\" is now mandatory.' );\n\t\t\tdomElement = document;\n\n\t\t}\n\n\t\tthis.visible = false;\n\t\tthis.domElement = domElement;\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t\tconst _gizmo = new TransformControlsGizmo();\n\t\tthis._gizmo = _gizmo;\n\t\tthis.add( _gizmo );\n\n\t\tconst _plane = new TransformControlsPlane();\n\t\tthis._plane = _plane;\n\t\tthis.add( _plane );\n\n\t\tconst scope = this;\n\n\t\t// Defined getter, setter and store for a property\n\t\tfunction defineProperty( propName, defaultValue ) {\n\n\t\t\tlet propValue = defaultValue;\n\n\t\t\tObject.defineProperty( scope, propName, {\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn propValue !== undefined ? propValue : defaultValue;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tif ( propValue !== value ) {\n\n\t\t\t\t\t\tpropValue = value;\n\t\t\t\t\t\t_plane[ propName ] = value;\n\t\t\t\t\t\t_gizmo[ propName ] = value;\n\n\t\t\t\t\t\tscope.dispatchEvent( { type: propName + '-changed', value: value } );\n\t\t\t\t\t\tscope.dispatchEvent( _changeEvent );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tscope[ propName ] = defaultValue;\n\t\t\t_plane[ propName ] = defaultValue;\n\t\t\t_gizmo[ propName ] = defaultValue;\n\n\t\t}\n\n\t\t// Define properties with getters/setter\n\t\t// Setting the defined property will automatically trigger change event\n\t\t// Defined properties are passed down to gizmo and plane\n\n\t\tdefineProperty( 'camera', camera );\n\t\tdefineProperty( 'object', undefined );\n\t\tdefineProperty( 'enabled', true );\n\t\tdefineProperty( 'axis', null );\n\t\tdefineProperty( 'mode', 'translate' );\n\t\tdefineProperty( 'translationSnap', null );\n\t\tdefineProperty( 'rotationSnap', null );\n\t\tdefineProperty( 'scaleSnap', null );\n\t\tdefineProperty( 'space', 'world' );\n\t\tdefineProperty( 'size', 1 );\n\t\tdefineProperty( 'dragging', false );\n\t\tdefineProperty( 'showX', true );\n\t\tdefineProperty( 'showY', true );\n\t\tdefineProperty( 'showZ', true );\n\n\t\t// Reusable utility variables\n\n\t\tconst worldPosition = new Vector3();\n\t\tconst worldPositionStart = new Vector3();\n\t\tconst worldQuaternion = new Quaternion();\n\t\tconst worldQuaternionStart = new Quaternion();\n\t\tconst cameraPosition = new Vector3();\n\t\tconst cameraQuaternion = new Quaternion();\n\t\tconst pointStart = new Vector3();\n\t\tconst pointEnd = new Vector3();\n\t\tconst rotationAxis = new Vector3();\n\t\tconst rotationAngle = 0;\n\t\tconst eye = new Vector3();\n\n\t\t// TODO: remove properties unused in plane and gizmo\n\n\t\tdefineProperty( 'worldPosition', worldPosition );\n\t\tdefineProperty( 'worldPositionStart', worldPositionStart );\n\t\tdefineProperty( 'worldQuaternion', worldQuaternion );\n\t\tdefineProperty( 'worldQuaternionStart', worldQuaternionStart );\n\t\tdefineProperty( 'cameraPosition', cameraPosition );\n\t\tdefineProperty( 'cameraQuaternion', cameraQuaternion );\n\t\tdefineProperty( 'pointStart', pointStart );\n\t\tdefineProperty( 'pointEnd', pointEnd );\n\t\tdefineProperty( 'rotationAxis', rotationAxis );\n\t\tdefineProperty( 'rotationAngle', rotationAngle );\n\t\tdefineProperty( 'eye', eye );\n\n\t\tthis._offset = new Vector3();\n\t\tthis._startNorm = new Vector3();\n\t\tthis._endNorm = new Vector3();\n\t\tthis._cameraScale = new Vector3();\n\n\t\tthis._parentPosition = new Vector3();\n\t\tthis._parentQuaternion = new Quaternion();\n\t\tthis._parentQuaternionInv = new Quaternion();\n\t\tthis._parentScale = new Vector3();\n\n\t\tthis._worldScaleStart = new Vector3();\n\t\tthis._worldQuaternionInv = new Quaternion();\n\t\tthis._worldScale = new Vector3();\n\n\t\tthis._positionStart = new Vector3();\n\t\tthis._quaternionStart = new Quaternion();\n\t\tthis._scaleStart = new Vector3();\n\n\t\tthis._getPointer = getPointer.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerHover = onPointerHover.bind( this );\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerUp = onPointerUp.bind( this );\n\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointermove', this._onPointerHover );\n\t\tthis.domElement.addEventListener( 'pointerup', this._onPointerUp );\n\n\t}\n\n\t// updateMatrixWorld updates key transformation variables\n\tupdateMatrixWorld() {\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\tthis.object.updateMatrixWorld();\n\n\t\t\tif ( this.object.parent === null ) {\n\n\t\t\t\tconsole.error( 'TransformControls: The attached 3D object must be a part of the scene graph.' );\n\n\t\t\t} else {\n\n\t\t\t\tthis.object.parent.matrixWorld.decompose( this._parentPosition, this._parentQuaternion, this._parentScale );\n\n\t\t\t}\n\n\t\t\tthis.object.matrixWorld.decompose( this.worldPosition, this.worldQuaternion, this._worldScale );\n\n\t\t\tthis._parentQuaternionInv.copy( this._parentQuaternion ).invert();\n\t\t\tthis._worldQuaternionInv.copy( this.worldQuaternion ).invert();\n\n\t\t}\n\n\t\tthis.camera.updateMatrixWorld();\n\t\tthis.camera.matrixWorld.decompose( this.cameraPosition, this.cameraQuaternion, this._cameraScale );\n\n\t\tthis.eye.copy( this.cameraPosition ).sub( this.worldPosition ).normalize();\n\n\t\tsuper.updateMatrixWorld( this );\n\n\t}\n\n\tpointerHover( pointer ) {\n\n\t\tif ( this.object === undefined || this.dragging === true ) return;\n\n\t\t_raycaster.setFromCamera( pointer, this.camera );\n\n\t\tconst intersect = intersectObjectWithRay( this._gizmo.picker[ this.mode ], _raycaster );\n\n\t\tif ( intersect ) {\n\n\t\t\tthis.axis = intersect.object.name;\n\n\t\t} else {\n\n\t\t\tthis.axis = null;\n\n\t\t}\n\n\t}\n\n\tpointerDown( pointer ) {\n\n\t\tif ( this.object === undefined || this.dragging === true || pointer.button !== 0 ) return;\n\n\t\tif ( this.axis !== null ) {\n\n\t\t\t_raycaster.setFromCamera( pointer, this.camera );\n\n\t\t\tconst planeIntersect = intersectObjectWithRay( this._plane, _raycaster, true );\n\n\t\t\tif ( planeIntersect ) {\n\n\t\t\t\tthis.object.updateMatrixWorld();\n\t\t\t\tthis.object.parent.updateMatrixWorld();\n\n\t\t\t\tthis._positionStart.copy( this.object.position );\n\t\t\t\tthis._quaternionStart.copy( this.object.quaternion );\n\t\t\t\tthis._scaleStart.copy( this.object.scale );\n\n\t\t\t\tthis.object.matrixWorld.decompose( this.worldPositionStart, this.worldQuaternionStart, this._worldScaleStart );\n\n\t\t\t\tthis.pointStart.copy( planeIntersect.point ).sub( this.worldPositionStart );\n\n\t\t\t}\n\n\t\t\tthis.dragging = true;\n\t\t\t_mouseDownEvent.mode = this.mode;\n\t\t\tthis.dispatchEvent( _mouseDownEvent );\n\n\t\t}\n\n\t}\n\n\tpointerMove( pointer ) {\n\n\t\tconst axis = this.axis;\n\t\tconst mode = this.mode;\n\t\tconst object = this.object;\n\t\tlet space = this.space;\n\n\t\tif ( mode === 'scale' ) {\n\n\t\t\tspace = 'local';\n\n\t\t} else if ( axis === 'E' || axis === 'XYZE' || axis === 'XYZ' ) {\n\n\t\t\tspace = 'world';\n\n\t\t}\n\n\t\tif ( object === undefined || axis === null || this.dragging === false || pointer.button !== - 1 ) return;\n\n\t\t_raycaster.setFromCamera( pointer, this.camera );\n\n\t\tconst planeIntersect = intersectObjectWithRay( this._plane, _raycaster, true );\n\n\t\tif ( ! planeIntersect ) return;\n\n\t\tthis.pointEnd.copy( planeIntersect.point ).sub( this.worldPositionStart );\n\n\t\tif ( mode === 'translate' ) {\n\n\t\t\t// Apply translate\n\n\t\t\tthis._offset.copy( this.pointEnd ).sub( this.pointStart );\n\n\t\t\tif ( space === 'local' && axis !== 'XYZ' ) {\n\n\t\t\t\tthis._offset.applyQuaternion( this._worldQuaternionInv );\n\n\t\t\t}\n\n\t\t\tif ( axis.indexOf( 'X' ) === - 1 ) this._offset.x = 0;\n\t\t\tif ( axis.indexOf( 'Y' ) === - 1 ) this._offset.y = 0;\n\t\t\tif ( axis.indexOf( 'Z' ) === - 1 ) this._offset.z = 0;\n\n\t\t\tif ( space === 'local' && axis !== 'XYZ' ) {\n\n\t\t\t\tthis._offset.applyQuaternion( this._quaternionStart ).divide( this._parentScale );\n\n\t\t\t} else {\n\n\t\t\t\tthis._offset.applyQuaternion( this._parentQuaternionInv ).divide( this._parentScale );\n\n\t\t\t}\n\n\t\t\tobject.position.copy( this._offset ).add( this._positionStart );\n\n\t\t\t// Apply translation snap\n\n\t\t\tif ( this.translationSnap ) {\n\n\t\t\t\tif ( space === 'local' ) {\n\n\t\t\t\t\tobject.position.applyQuaternion( _tempQuaternion.copy( this._quaternionStart ).invert() );\n\n\t\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.position.applyQuaternion( this._quaternionStart );\n\n\t\t\t\t}\n\n\t\t\t\tif ( space === 'world' ) {\n\n\t\t\t\t\tif ( object.parent ) {\n\n\t\t\t\t\t\tobject.position.add( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.parent ) {\n\n\t\t\t\t\t\tobject.position.sub( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( mode === 'scale' ) {\n\n\t\t\tif ( axis.search( 'XYZ' ) !== - 1 ) {\n\n\t\t\t\tlet d = this.pointEnd.length() / this.pointStart.length();\n\n\t\t\t\tif ( this.pointEnd.dot( this.pointStart ) < 0 ) d *= - 1;\n\n\t\t\t\t_tempVector2.set( d, d, d );\n\n\t\t\t} else {\n\n\t\t\t\t_tempVector.copy( this.pointStart );\n\t\t\t\t_tempVector2.copy( this.pointEnd );\n\n\t\t\t\t_tempVector.applyQuaternion( this._worldQuaternionInv );\n\t\t\t\t_tempVector2.applyQuaternion( this._worldQuaternionInv );\n\n\t\t\t\t_tempVector2.divide( _tempVector );\n\n\t\t\t\tif ( axis.search( 'X' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.x = 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Y' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.y = 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Z' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.z = 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Apply scale\n\n\t\t\tobject.scale.copy( this._scaleStart ).multiply( _tempVector2 );\n\n\t\t\tif ( this.scaleSnap ) {\n\n\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.x = Math.round( object.scale.x / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.y = Math.round( object.scale.y / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.z = Math.round( object.scale.z / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( mode === 'rotate' ) {\n\n\t\t\tthis._offset.copy( this.pointEnd ).sub( this.pointStart );\n\n\t\t\tconst ROTATION_SPEED = 20 / this.worldPosition.distanceTo( _tempVector.setFromMatrixPosition( this.camera.matrixWorld ) );\n\n\t\t\tif ( axis === 'E' ) {\n\n\t\t\t\tthis.rotationAxis.copy( this.eye );\n\t\t\t\tthis.rotationAngle = this.pointEnd.angleTo( this.pointStart );\n\n\t\t\t\tthis._startNorm.copy( this.pointStart ).normalize();\n\t\t\t\tthis._endNorm.copy( this.pointEnd ).normalize();\n\n\t\t\t\tthis.rotationAngle *= ( this._endNorm.cross( this._startNorm ).dot( this.eye ) < 0 ? 1 : - 1 );\n\n\t\t\t} else if ( axis === 'XYZE' ) {\n\n\t\t\t\tthis.rotationAxis.copy( this._offset ).cross( this.eye ).normalize();\n\t\t\t\tthis.rotationAngle = this._offset.dot( _tempVector.copy( this.rotationAxis ).cross( this.eye ) ) * ROTATION_SPEED;\n\n\t\t\t} else if ( axis === 'X' || axis === 'Y' || axis === 'Z' ) {\n\n\t\t\t\tthis.rotationAxis.copy( _unit[ axis ] );\n\n\t\t\t\t_tempVector.copy( _unit[ axis ] );\n\n\t\t\t\tif ( space === 'local' ) {\n\n\t\t\t\t\t_tempVector.applyQuaternion( this.worldQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tthis.rotationAngle = this._offset.dot( _tempVector.cross( this.eye ).normalize() ) * ROTATION_SPEED;\n\n\t\t\t}\n\n\t\t\t// Apply rotation snap\n\n\t\t\tif ( this.rotationSnap ) this.rotationAngle = Math.round( this.rotationAngle / this.rotationSnap ) * this.rotationSnap;\n\n\t\t\t// Apply rotate\n\t\t\tif ( space === 'local' && axis !== 'E' && axis !== 'XYZE' ) {\n\n\t\t\t\tobject.quaternion.copy( this._quaternionStart );\n\t\t\t\tobject.quaternion.multiply( _tempQuaternion.setFromAxisAngle( this.rotationAxis, this.rotationAngle ) ).normalize();\n\n\t\t\t} else {\n\n\t\t\t\tthis.rotationAxis.applyQuaternion( this._parentQuaternionInv );\n\t\t\t\tobject.quaternion.copy( _tempQuaternion.setFromAxisAngle( this.rotationAxis, this.rotationAngle ) );\n\t\t\t\tobject.quaternion.multiply( this._quaternionStart ).normalize();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( _changeEvent );\n\t\tthis.dispatchEvent( _objectChangeEvent );\n\n\t}\n\n\tpointerUp( pointer ) {\n\n\t\tif ( pointer.button !== 0 ) return;\n\n\t\tif ( this.dragging && ( this.axis !== null ) ) {\n\n\t\t\t_mouseUpEvent.mode = this.mode;\n\t\t\tthis.dispatchEvent( _mouseUpEvent );\n\n\t\t}\n\n\t\tthis.dragging = false;\n\t\tthis.axis = null;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerHover );\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\tthis.traverse( function ( child ) {\n\n\t\t\tif ( child.geometry ) child.geometry.dispose();\n\t\t\tif ( child.material ) child.material.dispose();\n\n\t\t} );\n\n\t}\n\n\t// Set current object\n\tattach( object ) {\n\n\t\tthis.object = object;\n\t\tthis.visible = true;\n\n\t\treturn this;\n\n\t}\n\n\t// Detatch from object\n\tdetach() {\n\n\t\tthis.object = undefined;\n\t\tthis.visible = false;\n\t\tthis.axis = null;\n\n\t\treturn this;\n\n\t}\n\n\treset() {\n\n\t\tif ( ! this.enabled ) return;\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis.object.position.copy( this._positionStart );\n\t\t\tthis.object.quaternion.copy( this._quaternionStart );\n\t\t\tthis.object.scale.copy( this._scaleStart );\n\n\t\t\tthis.dispatchEvent( _changeEvent );\n\t\t\tthis.dispatchEvent( _objectChangeEvent );\n\n\t\t\tthis.pointStart.copy( this.pointEnd );\n\n\t\t}\n\n\t}\n\n\tgetRaycaster() {\n\n\t\treturn _raycaster;\n\n\t}\n\n\t// TODO: deprecate\n\n\tgetMode() {\n\n\t\treturn this.mode;\n\n\t}\n\n\tsetMode( mode ) {\n\n\t\tthis.mode = mode;\n\n\t}\n\n\tsetTranslationSnap( translationSnap ) {\n\n\t\tthis.translationSnap = translationSnap;\n\n\t}\n\n\tsetRotationSnap( rotationSnap ) {\n\n\t\tthis.rotationSnap = rotationSnap;\n\n\t}\n\n\tsetScaleSnap( scaleSnap ) {\n\n\t\tthis.scaleSnap = scaleSnap;\n\n\t}\n\n\tsetSize( size ) {\n\n\t\tthis.size = size;\n\n\t}\n\n\tsetSpace( space ) {\n\n\t\tthis.space = space;\n\n\t}\n\n\tupdate() {\n\n\t\tconsole.warn( 'THREE.TransformControls: update function has no more functionality and therefore has been deprecated.' );\n\n\t}\n\n}\n\nTransformControls.prototype.isTransformControls = true;\n\n// mouse / touch event handlers\n\nfunction getPointer( event ) {\n\n\tif ( this.domElement.ownerDocument.pointerLockElement ) {\n\n\t\treturn {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tbutton: event.button\n\t\t};\n\n\t} else {\n\n\t\tconst rect = this.domElement.getBoundingClientRect();\n\n\t\treturn {\n\t\t\tx: ( event.clientX - rect.left ) / rect.width * 2 - 1,\n\t\t\ty: - ( event.clientY - rect.top ) / rect.height * 2 + 1,\n\t\t\tbutton: event.button\n\t\t};\n\n\t}\n\n}\n\nfunction onPointerHover( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tswitch ( event.pointerType ) {\n\n\t\tcase 'mouse':\n\t\tcase 'pen':\n\t\t\tthis.pointerHover( this._getPointer( event ) );\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onPointerDown( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tif ( ! document.pointerLockElement ) {\n\n\t\tthis.domElement.setPointerCapture( event.pointerId );\n\n\t}\n\n\tthis.domElement.addEventListener( 'pointermove', this._onPointerMove );\n\n\tthis.pointerHover( this._getPointer( event ) );\n\tthis.pointerDown( this._getPointer( event ) );\n\n}\n\nfunction onPointerMove( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tthis.pointerMove( this._getPointer( event ) );\n\n}\n\nfunction onPointerUp( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tthis.domElement.releasePointerCapture( event.pointerId );\n\n\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\n\tthis.pointerUp( this._getPointer( event ) );\n\n}\n\nfunction intersectObjectWithRay( object, raycaster, includeInvisible ) {\n\n\tconst allIntersections = raycaster.intersectObject( object, true );\n\n\tfor ( let i = 0; i < allIntersections.length; i ++ ) {\n\n\t\tif ( allIntersections[ i ].object.visible || includeInvisible ) {\n\n\t\t\treturn allIntersections[ i ];\n\n\t\t}\n\n\t}\n\n\treturn false;\n\n}\n\n//\n\n// Reusable utility variables\n\nconst _tempEuler = new Euler();\nconst _alignVector = new Vector3( 0, 1, 0 );\nconst _zeroVector = new Vector3( 0, 0, 0 );\nconst _lookAtMatrix = new Matrix4();\nconst _tempQuaternion2 = new Quaternion();\nconst _identityQuaternion = new Quaternion();\nconst _dirVector = new Vector3();\nconst _tempMatrix = new Matrix4();\n\nconst _unitX = new Vector3( 1, 0, 0 );\nconst _unitY = new Vector3( 0, 1, 0 );\nconst _unitZ = new Vector3( 0, 0, 1 );\n\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\nconst _v3 = new Vector3();\n\nclass TransformControlsGizmo extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'TransformControlsGizmo';\n\n\t\t// shared materials\n\n\t\tconst gizmoMaterial = new MeshBasicMaterial( {\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tfog: false,\n\t\t\ttoneMapped: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\tconst gizmoLineMaterial = new LineBasicMaterial( {\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tfog: false,\n\t\t\ttoneMapped: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\t// Make unique material for each axis/color\n\n\t\tconst matInvisible = gizmoMaterial.clone();\n\t\tmatInvisible.opacity = 0.15;\n\n\t\tconst matHelper = gizmoLineMaterial.clone();\n\t\tmatHelper.opacity = 0.5;\n\n\t\tconst matRed = gizmoMaterial.clone();\n\t\tmatRed.color.setHex( 0xff0000 );\n\n\t\tconst matGreen = gizmoMaterial.clone();\n\t\tmatGreen.color.setHex( 0x00ff00 );\n\n\t\tconst matBlue = gizmoMaterial.clone();\n\t\tmatBlue.color.setHex( 0x0000ff );\n\n\t\tconst matRedTransparent = gizmoMaterial.clone();\n\t\tmatRedTransparent.color.setHex( 0xff0000 );\n\t\tmatRedTransparent.opacity = 0.5;\n\n\t\tconst matGreenTransparent = gizmoMaterial.clone();\n\t\tmatGreenTransparent.color.setHex( 0x00ff00 );\n\t\tmatGreenTransparent.opacity = 0.5;\n\n\t\tconst matBlueTransparent = gizmoMaterial.clone();\n\t\tmatBlueTransparent.color.setHex( 0x0000ff );\n\t\tmatBlueTransparent.opacity = 0.5;\n\n\t\tconst matWhiteTransparent = gizmoMaterial.clone();\n\t\tmatWhiteTransparent.opacity = 0.25;\n\n\t\tconst matYellowTransparent = gizmoMaterial.clone();\n\t\tmatYellowTransparent.color.setHex( 0xffff00 );\n\t\tmatYellowTransparent.opacity = 0.25;\n\n\t\tconst matYellow = gizmoMaterial.clone();\n\t\tmatYellow.color.setHex( 0xffff00 );\n\n\t\tconst matGray = gizmoMaterial.clone();\n\t\tmatGray.color.setHex( 0x787878 );\n\n\t\t// reusable geometry\n\n\t\tconst arrowGeometry = new CylinderGeometry( 0, 0.04, 0.1, 12 );\n\t\tarrowGeometry.translate( 0, 0.05, 0 );\n\n\t\tconst scaleHandleGeometry = new BoxGeometry( 0.08, 0.08, 0.08 );\n\t\tscaleHandleGeometry.translate( 0, 0.04, 0 );\n\n\t\tconst lineGeometry = new BufferGeometry();\n\t\tlineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0,\t1, 0, 0 ], 3 ) );\n\n\t\tconst lineGeometry2 = new CylinderGeometry( 0.0075, 0.0075, 0.5, 3 );\n\t\tlineGeometry2.translate( 0, 0.25, 0 );\n\n\t\tfunction CircleGeometry( radius, arc ) {\n\n\t\t\tconst geometry = new TorusGeometry( radius, 0.0075, 3, 64, arc * Math.PI * 2 );\n\t\t\tgeometry.rotateY( Math.PI / 2 );\n\t\t\tgeometry.rotateX( Math.PI / 2 );\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\t// Special geometry for transform helper. If scaled with position vector it spans from [0,0,0] to position\n\n\t\tfunction TranslateHelperGeometry() {\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 1, 1, 1 ], 3 ) );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\t// Gizmo definitions - custom hierarchy definitions for setupGizmo() function\n\n\t\tconst gizmoTranslate = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( arrowGeometry, matRed ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( arrowGeometry, matGreen ), [ 0, 0.5, 0 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matGreen ), [ 0, - 0.5, 0 ], [ Math.PI, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matGreen ) ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matBlue ), null, [ Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.1, 0 ), matWhiteTransparent.clone() ), [ 0, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent.clone() ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent.clone() ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent.clone() ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst pickerTranslate = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.2, 0 ), matInvisible ) ]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst helperTranslate = {\n\t\t\tSTART: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tEND: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tDELTA: [\n\t\t\t\t[ new Line( TranslateHelperGeometry(), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, - 1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\tconst gizmoRotate = {\n\t\t\tXYZE: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 1 ), matGray ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matRed ) ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matGreen ), null, [ 0, 0, - Math.PI / 2 ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matBlue ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tE: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.75, 1 ), matYellowTransparent ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst helperRotate = {\n\t\t\tAXIS: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\tconst pickerRotate = {\n\t\t\tXYZE: [\n\t\t\t\t[ new Mesh( new SphereGeometry( 0.25, 10, 8 ), matInvisible ) ]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, - Math.PI / 2, - Math.PI / 2 ]],\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t],\n\t\t\tE: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.75, 0.1, 2, 24 ), matInvisible ) ]\n\t\t\t]\n\t\t};\n\n\t\tconst gizmoScale = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matRed ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]],\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matGreen ), [ 0, 0.5, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matGreen ) ],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matGreen ), [ 0, - 0.5, 0 ], [ 0, 0, Math.PI ]],\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matBlue ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.1, 0.1, 0.1 ), matWhiteTransparent.clone() ) ],\n\t\t\t]\n\t\t};\n\n\t\tconst pickerScale = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]],\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]],\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]],\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 0 ]],\n\t\t\t]\n\t\t};\n\n\t\tconst helperScale = {\n\t\t\tX: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, - 1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Line( lineGeometry, matHelper.clone() ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\t// Creates an Object3D with gizmos described in custom hierarchy definition.\n\n\t\tfunction setupGizmo( gizmoMap ) {\n\n\t\t\tconst gizmo = new Object3D();\n\n\t\t\tfor ( const name in gizmoMap ) {\n\n\t\t\t\tfor ( let i = gizmoMap[ name ].length; i --; ) {\n\n\t\t\t\t\tconst object = gizmoMap[ name ][ i ][ 0 ].clone();\n\t\t\t\t\tconst position = gizmoMap[ name ][ i ][ 1 ];\n\t\t\t\t\tconst rotation = gizmoMap[ name ][ i ][ 2 ];\n\t\t\t\t\tconst scale = gizmoMap[ name ][ i ][ 3 ];\n\t\t\t\t\tconst tag = gizmoMap[ name ][ i ][ 4 ];\n\n\t\t\t\t\t// name and tag properties are essential for picking and updating logic.\n\t\t\t\t\tobject.name = name;\n\t\t\t\t\tobject.tag = tag;\n\n\t\t\t\t\tif ( position ) {\n\n\t\t\t\t\t\tobject.position.set( position[ 0 ], position[ 1 ], position[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( rotation ) {\n\n\t\t\t\t\t\tobject.rotation.set( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( scale ) {\n\n\t\t\t\t\t\tobject.scale.set( scale[ 0 ], scale[ 1 ], scale[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.updateMatrix();\n\n\t\t\t\t\tconst tempGeometry = object.geometry.clone();\n\t\t\t\t\ttempGeometry.applyMatrix4( object.matrix );\n\t\t\t\t\tobject.geometry = tempGeometry;\n\t\t\t\t\tobject.renderOrder = Infinity;\n\n\t\t\t\t\tobject.position.set( 0, 0, 0 );\n\t\t\t\t\tobject.rotation.set( 0, 0, 0 );\n\t\t\t\t\tobject.scale.set( 1, 1, 1 );\n\n\t\t\t\t\tgizmo.add( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn gizmo;\n\n\t\t}\n\n\t\t// Gizmo creation\n\n\t\tthis.gizmo = {};\n\t\tthis.picker = {};\n\t\tthis.helper = {};\n\n\t\tthis.add( this.gizmo[ 'translate' ] = setupGizmo( gizmoTranslate ) );\n\t\tthis.add( this.gizmo[ 'rotate' ] = setupGizmo( gizmoRotate ) );\n\t\tthis.add( this.gizmo[ 'scale' ] = setupGizmo( gizmoScale ) );\n\t\tthis.add( this.picker[ 'translate' ] = setupGizmo( pickerTranslate ) );\n\t\tthis.add( this.picker[ 'rotate' ] = setupGizmo( pickerRotate ) );\n\t\tthis.add( this.picker[ 'scale' ] = setupGizmo( pickerScale ) );\n\t\tthis.add( this.helper[ 'translate' ] = setupGizmo( helperTranslate ) );\n\t\tthis.add( this.helper[ 'rotate' ] = setupGizmo( helperRotate ) );\n\t\tthis.add( this.helper[ 'scale' ] = setupGizmo( helperScale ) );\n\n\t\t// Pickers should be hidden always\n\n\t\tthis.picker[ 'translate' ].visible = false;\n\t\tthis.picker[ 'rotate' ].visible = false;\n\t\tthis.picker[ 'scale' ].visible = false;\n\n\t}\n\n\t// updateMatrixWorld will update transformations and appearance of individual handles\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst space = ( this.mode === 'scale' ) ? 'local' : this.space; // scale always oriented to local rotation\n\n\t\tconst quaternion = ( space === 'local' ) ? this.worldQuaternion : _identityQuaternion;\n\n\t\t// Show only gizmos for current transform mode\n\n\t\tthis.gizmo[ 'translate' ].visible = this.mode === 'translate';\n\t\tthis.gizmo[ 'rotate' ].visible = this.mode === 'rotate';\n\t\tthis.gizmo[ 'scale' ].visible = this.mode === 'scale';\n\n\t\tthis.helper[ 'translate' ].visible = this.mode === 'translate';\n\t\tthis.helper[ 'rotate' ].visible = this.mode === 'rotate';\n\t\tthis.helper[ 'scale' ].visible = this.mode === 'scale';\n\n\n\t\tlet handles = [];\n\t\thandles = handles.concat( this.picker[ this.mode ].children );\n\t\thandles = handles.concat( this.gizmo[ this.mode ].children );\n\t\thandles = handles.concat( this.helper[ this.mode ].children );\n\n\t\tfor ( let i = 0; i < handles.length; i ++ ) {\n\n\t\t\tconst handle = handles[ i ];\n\n\t\t\t// hide aligned to camera\n\n\t\t\thandle.visible = true;\n\t\t\thandle.rotation.set( 0, 0, 0 );\n\t\t\thandle.position.copy( this.worldPosition );\n\n\t\t\tlet factor;\n\n\t\t\tif ( this.camera.isOrthographicCamera ) {\n\n\t\t\t\tfactor = ( this.camera.top - this.camera.bottom ) / this.camera.zoom;\n\n\t\t\t} else {\n\n\t\t\t\tfactor = this.worldPosition.distanceTo( this.cameraPosition ) * Math.min( 1.9 * Math.tan( Math.PI * this.camera.fov / 360 ) / this.camera.zoom, 7 );\n\n\t\t\t}\n\n\t\t\thandle.scale.set( 1, 1, 1 ).multiplyScalar( factor * this.size / 4 );\n\n\t\t\t// TODO: simplify helpers and consider decoupling from gizmo\n\n\t\t\tif ( handle.tag === 'helper' ) {\n\n\t\t\t\thandle.visible = false;\n\n\t\t\t\tif ( handle.name === 'AXIS' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.visible = !! this.axis;\n\n\t\t\t\t\tif ( this.axis === 'X' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, 0, 0 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'Y' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, 0, Math.PI / 2 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'Z' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, Math.PI / 2, 0 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'XYZE' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, Math.PI / 2, 0 ) );\n\t\t\t\t\t\t_alignVector.copy( this.rotationAxis );\n\t\t\t\t\t\thandle.quaternion.setFromRotationMatrix( _lookAtMatrix.lookAt( _zeroVector, _alignVector, _unitY ) );\n\t\t\t\t\t\thandle.quaternion.multiply( _tempQuaternion );\n\t\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'E' ) {\n\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else if ( handle.name === 'START' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else if ( handle.name === 'END' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPosition );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else if ( handle.name === 'DELTA' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.quaternion.copy( this.worldQuaternionStart );\n\t\t\t\t\t_tempVector.set( 1e-10, 1e-10, 1e-10 ).add( this.worldPositionStart ).sub( this.worldPosition ).multiplyScalar( - 1 );\n\t\t\t\t\t_tempVector.applyQuaternion( this.worldQuaternionStart.clone().invert() );\n\t\t\t\t\thandle.scale.copy( _tempVector );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thandle.quaternion.copy( quaternion );\n\n\t\t\t\t\tif ( this.dragging ) {\n\n\t\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\thandle.position.copy( this.worldPosition );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis ) {\n\n\t\t\t\t\t\thandle.visible = this.axis.search( handle.name ) !== - 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// If updating helper, skip rest of the loop\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// Align handles to current local or world rotation\n\n\t\t\thandle.quaternion.copy( quaternion );\n\n\t\t\tif ( this.mode === 'translate' || this.mode === 'scale' ) {\n\n\t\t\t\t// Hide translate and scale axis facing the camera\n\n\t\t\t\tconst AXIS_HIDE_TRESHOLD = 0.99;\n\t\t\t\tconst PLANE_HIDE_TRESHOLD = 0.2;\n\n\t\t\t\tif ( handle.name === 'X' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Y' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Z' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'XY' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_TRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'YZ' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_TRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'XZ' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_TRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( this.mode === 'rotate' ) {\n\n\t\t\t\t// Align handles to current local or world rotation\n\n\t\t\t\t_tempQuaternion2.copy( quaternion );\n\t\t\t\t_alignVector.copy( this.eye ).applyQuaternion( _tempQuaternion.copy( quaternion ).invert() );\n\n\t\t\t\tif ( handle.name.search( 'E' ) !== - 1 ) {\n\n\t\t\t\t\thandle.quaternion.setFromRotationMatrix( _lookAtMatrix.lookAt( this.eye, _zeroVector, _unitY ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'X' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitX, Math.atan2( - _alignVector.y, _alignVector.z ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Y' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitY, Math.atan2( _alignVector.x, _alignVector.z ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Z' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitZ, Math.atan2( _alignVector.y, _alignVector.x ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Hide disabled axes\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'X' ) === - 1 || this.showX );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'Y' ) === - 1 || this.showY );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'Z' ) === - 1 || this.showZ );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'E' ) === - 1 || ( this.showX && this.showY && this.showZ ) );\n\n\t\t\t// highlight selected axis\n\n\t\t\thandle.material._color = handle.material._color || handle.material.color.clone();\n\t\t\thandle.material._opacity = handle.material._opacity || handle.material.opacity;\n\n\t\t\thandle.material.color.copy( handle.material._color );\n\t\t\thandle.material.opacity = handle.material._opacity;\n\n\t\t\tif ( this.enabled && this.axis ) {\n\n\t\t\t\tif ( handle.name === this.axis ) {\n\n\t\t\t\t\thandle.material.color.setHex( 0xffff00 );\n\t\t\t\t\thandle.material.opacity = 1.0;\n\n\t\t\t\t} else if ( this.axis.split( '' ).some( function ( a ) {\n\n\t\t\t\t\treturn handle.name === a;\n\n\t\t\t\t} ) ) {\n\n\t\t\t\t\thandle.material.color.setHex( 0xffff00 );\n\t\t\t\t\thandle.material.opacity = 1.0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nTransformControlsGizmo.prototype.isTransformControlsGizmo = true;\n\n//\n\nclass TransformControlsPlane extends Mesh {\n\n\tconstructor() {\n\n\t\tsuper(\n\t\t\tnew PlaneGeometry( 100000, 100000, 2, 2 ),\n\t\t\tnew MeshBasicMaterial( { visible: false, wireframe: true, side: DoubleSide, transparent: true, opacity: 0.1, toneMapped: false } )\n\t\t);\n\n\t\tthis.type = 'TransformControlsPlane';\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tlet space = this.space;\n\n\t\tthis.position.copy( this.worldPosition );\n\n\t\tif ( this.mode === 'scale' ) space = 'local'; // scale always oriented to local rotation\n\n\t\t_v1.copy( _unitX ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\t\t_v2.copy( _unitY ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\t\t_v3.copy( _unitZ ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\n\t\t// Align the plane for current transform mode, axis and space.\n\n\t\t_alignVector.copy( _v2 );\n\n\t\tswitch ( this.mode ) {\n\n\t\t\tcase 'translate':\n\t\t\tcase 'scale':\n\t\t\t\tswitch ( this.axis ) {\n\n\t\t\t\t\tcase 'X':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v1 );\n\t\t\t\t\t\t_dirVector.copy( _v1 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Y':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v2 );\n\t\t\t\t\t\t_dirVector.copy( _v2 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v3 );\n\t\t\t\t\t\t_dirVector.copy( _v3 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XY':\n\t\t\t\t\t\t_dirVector.copy( _v3 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'YZ':\n\t\t\t\t\t\t_dirVector.copy( _v1 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XZ':\n\t\t\t\t\t\t_alignVector.copy( _v3 );\n\t\t\t\t\t\t_dirVector.copy( _v2 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XYZ':\n\t\t\t\t\tcase 'E':\n\t\t\t\t\t\t_dirVector.set( 0, 0, 0 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase 'rotate':\n\t\t\tdefault:\n\t\t\t\t// special case for rotate\n\t\t\t\t_dirVector.set( 0, 0, 0 );\n\n\t\t}\n\n\t\tif ( _dirVector.length() === 0 ) {\n\n\t\t\t// If in rotate mode, make the plane parallel to camera\n\t\t\tthis.quaternion.copy( this.cameraQuaternion );\n\n\t\t} else {\n\n\t\t\t_tempMatrix.lookAt( _tempVector.set( 0, 0, 0 ), _dirVector, _alignVector );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( _tempMatrix );\n\n\t\t}\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nTransformControlsPlane.prototype.isTransformControlsPlane = true;\n\nexport { TransformControls, TransformControlsGizmo, TransformControlsPlane };\n","module.exports = (function () {\n 'use strict';\n\n /**\n * Sort an array using the merge sort algorithm.\n *\n * @param {function} comparatorFn The comparator function.\n * @param {array} arr The array to sort.\n * @returns {array} The sorted array.\n */\n function mergeSort(comparatorFn, arr) {\n var len = arr.length, firstHalf, secondHalf;\n if (len >= 2) {\n firstHalf = arr.slice(0, len / 2);\n secondHalf = arr.slice(len / 2, len);\n return merge(comparatorFn, mergeSort(comparatorFn, firstHalf), mergeSort(comparatorFn, secondHalf));\n } else {\n return arr.slice();\n }\n }\n\n /**\n * The merge part of the merge sort algorithm.\n *\n * @param {function} comparatorFn The comparator function.\n * @param {array} arr1 The first sorted array.\n * @param {array} arr2 The second sorted array.\n * @returns {array} The merged and sorted array.\n */\n function merge(comparatorFn, arr1, arr2) {\n var result = [], left1 = arr1.length, left2 = arr2.length;\n while (left1 > 0 && left2 > 0) {\n if (comparatorFn(arr1[0], arr2[0]) <= 0) {\n result.push(arr1.shift());\n left1--;\n } else {\n result.push(arr2.shift());\n left2--;\n }\n }\n if (left1 > 0) {\n result.push.apply(result, arr1);\n } else {\n result.push.apply(result, arr2);\n }\n return result;\n }\n\n return mergeSort;\n})();\n","module.exports = (function () {\n 'use strict';\n\n /**\n * Find the index to insert an element in array keeping the sort order.\n *\n * @param {function} comparatorFn The comparator function which sorted the array.\n * @param {array} arr The sorted array.\n * @param {object} el The element to insert.\n */\n function findInsertIndex(comparatorFn, arr, el) {\n var i, len;\n for (i = 0, len = arr.length; i < len; i++) {\n if (comparatorFn(arr[i], el) > 0) {\n break;\n }\n }\n return i;\n }\n\n return findInsertIndex;\n})();\n","var mergeSort, findInsertIndex;\nmergeSort = require('mergesort');\nfindInsertIndex = require('find-insert-index');\n\nmodule.exports = (function () {\n 'use strict';\n\n var walkStrategies;\n\n walkStrategies = {};\n\n function k(result) {\n return function () {\n return result;\n };\n }\n\n function TreeModel(config) {\n config = config || {};\n this.config = config;\n this.config.childrenPropertyName = config.childrenPropertyName || 'children';\n this.config.modelComparatorFn = config.modelComparatorFn;\n }\n\n function addChildToNode(node, child) {\n child.parent = node;\n node.children.push(child);\n return child;\n }\n\n function Node(config, model) {\n this.config = config;\n this.model = model;\n this.children = [];\n }\n\n TreeModel.prototype.parse = function (model) {\n var i, childCount, node;\n\n if (!(model instanceof Object)) {\n throw new TypeError('Model must be of type object.');\n }\n\n node = new Node(this.config, model);\n if (model[this.config.childrenPropertyName] instanceof Array) {\n if (this.config.modelComparatorFn) {\n model[this.config.childrenPropertyName] = mergeSort(\n this.config.modelComparatorFn,\n model[this.config.childrenPropertyName]);\n }\n for (i = 0, childCount = model[this.config.childrenPropertyName].length; i < childCount; i++) {\n addChildToNode(node, this.parse(model[this.config.childrenPropertyName][i]));\n }\n }\n return node;\n };\n\n function hasComparatorFunction(node) {\n return typeof node.config.modelComparatorFn === 'function';\n }\n\n Node.prototype.isRoot = function () {\n return this.parent === undefined;\n };\n\n Node.prototype.hasChildren = function () {\n return this.children.length > 0;\n };\n\n function addChild(self, child, insertIndex) {\n var index;\n\n if (!(child instanceof Node)) {\n throw new TypeError('Child must be of type Node.');\n }\n\n child.parent = self;\n if (!(self.model[self.config.childrenPropertyName] instanceof Array)) {\n self.model[self.config.childrenPropertyName] = [];\n }\n\n if (hasComparatorFunction(self)) {\n // Find the index to insert the child\n index = findInsertIndex(\n self.config.modelComparatorFn,\n self.model[self.config.childrenPropertyName],\n child.model);\n\n // Add to the model children\n self.model[self.config.childrenPropertyName].splice(index, 0, child.model);\n\n // Add to the node children\n self.children.splice(index, 0, child);\n } else {\n if (insertIndex === undefined) {\n self.model[self.config.childrenPropertyName].push(child.model);\n self.children.push(child);\n } else {\n if (insertIndex < 0 || insertIndex > self.children.length) {\n throw new Error('Invalid index.');\n }\n self.model[self.config.childrenPropertyName].splice(insertIndex, 0, child.model);\n self.children.splice(insertIndex, 0, child);\n }\n }\n return child;\n }\n\n Node.prototype.addChild = function (child) {\n return addChild(this, child);\n };\n\n Node.prototype.addChildAtIndex = function (child, index) {\n if (hasComparatorFunction(this)) {\n throw new Error('Cannot add child at index when using a comparator function.');\n }\n\n return addChild(this, child, index);\n };\n\n Node.prototype.setIndex = function (index) {\n if (hasComparatorFunction(this)) {\n throw new Error('Cannot set node index when using a comparator function.');\n }\n\n if (this.isRoot()) {\n if (index === 0) {\n return this;\n }\n throw new Error('Invalid index.');\n }\n\n if (index < 0 || index >= this.parent.children.length) {\n throw new Error('Invalid index.');\n }\n\n var oldIndex = this.parent.children.indexOf(this);\n\n this.parent.children.splice(index, 0, this.parent.children.splice(oldIndex, 1)[0]);\n\n this.parent.model[this.parent.config.childrenPropertyName]\n .splice(index, 0, this.parent.model[this.parent.config.childrenPropertyName].splice(oldIndex, 1)[0]);\n\n return this;\n };\n\n Node.prototype.getPath = function () {\n var path = [];\n (function addToPath(node) {\n path.unshift(node);\n if (!node.isRoot()) {\n addToPath(node.parent);\n }\n })(this);\n return path;\n };\n\n Node.prototype.getIndex = function () {\n if (this.isRoot()) {\n return 0;\n }\n return this.parent.children.indexOf(this);\n };\n\n /**\n * Parse the arguments of traversal functions. These functions can take one optional\n * first argument which is an options object. If present, this object will be stored\n * in args.options. The only mandatory argument is the callback function which can\n * appear in the first or second position (if an options object is given). This\n * function will be saved to args.fn. The last optional argument is the context on\n * which the callback function will be called. It will be available in args.ctx.\n *\n * @returns Parsed arguments.\n */\n function parseArgs() {\n var args = {};\n if (arguments.length === 1) {\n if (typeof arguments[0] === 'function') {\n args.fn = arguments[0];\n } else {\n args.options = arguments[0];\n }\n } else if (arguments.length === 2) {\n if (typeof arguments[0] === 'function') {\n args.fn = arguments[0];\n args.ctx = arguments[1];\n } else {\n args.options = arguments[0];\n args.fn = arguments[1];\n }\n } else {\n args.options = arguments[0];\n args.fn = arguments[1];\n args.ctx = arguments[2];\n }\n args.options = args.options || {};\n if (!args.options.strategy) {\n args.options.strategy = 'pre';\n }\n if (!walkStrategies[args.options.strategy]) {\n throw new Error('Unknown tree walk strategy. Valid strategies are \\'pre\\' [default], \\'post\\' and \\'breadth\\'.');\n }\n return args;\n }\n\n Node.prototype.walk = function () {\n var args;\n args = parseArgs.apply(this, arguments);\n walkStrategies[args.options.strategy].call(this, args.fn, args.ctx);\n };\n\n walkStrategies.pre = function depthFirstPreOrder(callback, context) {\n var i, childCount, keepGoing;\n keepGoing = callback.call(context, this);\n for (i = 0, childCount = this.children.length; i < childCount; i++) {\n if (keepGoing === false) {\n return false;\n }\n keepGoing = depthFirstPreOrder.call(this.children[i], callback, context);\n }\n return keepGoing;\n };\n\n walkStrategies.post = function depthFirstPostOrder(callback, context) {\n var i, childCount, keepGoing;\n for (i = 0, childCount = this.children.length; i < childCount; i++) {\n keepGoing = depthFirstPostOrder.call(this.children[i], callback, context);\n if (keepGoing === false) {\n return false;\n }\n }\n keepGoing = callback.call(context, this);\n return keepGoing;\n };\n\n walkStrategies.breadth = function breadthFirst(callback, context) {\n var queue = [this];\n (function processQueue() {\n var i, childCount, node;\n if (queue.length === 0) {\n return;\n }\n node = queue.shift();\n for (i = 0, childCount = node.children.length; i < childCount; i++) {\n queue.push(node.children[i]);\n }\n if (callback.call(context, node) !== false) {\n processQueue();\n }\n })();\n };\n\n Node.prototype.all = function () {\n var args, all = [];\n args = parseArgs.apply(this, arguments);\n args.fn = args.fn || k(true);\n walkStrategies[args.options.strategy].call(this, function (node) {\n if (args.fn.call(args.ctx, node)) {\n all.push(node);\n }\n }, args.ctx);\n return all;\n };\n\n Node.prototype.first = function () {\n var args, first;\n args = parseArgs.apply(this, arguments);\n args.fn = args.fn || k(true);\n walkStrategies[args.options.strategy].call(this, function (node) {\n if (args.fn.call(args.ctx, node)) {\n first = node;\n return false;\n }\n }, args.ctx);\n return first;\n };\n\n Node.prototype.drop = function () {\n var indexOfChild;\n if (!this.isRoot()) {\n indexOfChild = this.parent.children.indexOf(this);\n this.parent.children.splice(indexOfChild, 1);\n this.parent.model[this.config.childrenPropertyName].splice(indexOfChild, 1);\n this.parent = undefined;\n delete this.parent;\n }\n return this;\n };\n\n return TreeModel;\n})();\n","// Current version.\nexport var VERSION = '1.13.6';\n\n// Establish the root object, `window` (`self`) in the browser, `global`\n// on the server, or `this` in some virtual machines. We use `self`\n// instead of `window` for `WebWorker` support.\nexport var root = (typeof self == 'object' && self.self === self && self) ||\n (typeof global == 'object' && global.global === global && global) ||\n Function('return this')() ||\n {};\n\n// Save bytes in the minified (but not gzipped) version:\nexport var ArrayProto = Array.prototype, ObjProto = Object.prototype;\nexport var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;\n\n// Create quick reference variables for speed access to core prototypes.\nexport var push = ArrayProto.push,\n slice = ArrayProto.slice,\n toString = ObjProto.toString,\n hasOwnProperty = ObjProto.hasOwnProperty;\n\n// Modern feature detection.\nexport var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',\n supportsDataView = typeof DataView !== 'undefined';\n\n// All **ECMAScript 5+** native function implementations that we hope to use\n// are declared here.\nexport var nativeIsArray = Array.isArray,\n nativeKeys = Object.keys,\n nativeCreate = Object.create,\n nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;\n\n// Create references to these builtin functions because we override them.\nexport var _isNaN = isNaN,\n _isFinite = isFinite;\n\n// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\nexport var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\nexport var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n// The largest integer that can be represented exactly.\nexport var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n","// Some functions take a variable number of arguments, or a few expected\n// arguments at the beginning and then a variable number of values to operate\n// on. This helper accumulates all remaining arguments past the function’s\n// argument length (or an explicit `startIndex`), into an array that becomes\n// the last argument. Similar to ES6’s \"rest parameter\".\nexport default function restArguments(func, startIndex) {\n startIndex = startIndex == null ? func.length - 1 : +startIndex;\n return function() {\n var length = Math.max(arguments.length - startIndex, 0),\n rest = Array(length),\n index = 0;\n for (; index < length; index++) {\n rest[index] = arguments[index + startIndex];\n }\n switch (startIndex) {\n case 0: return func.call(this, rest);\n case 1: return func.call(this, arguments[0], rest);\n case 2: return func.call(this, arguments[0], arguments[1], rest);\n }\n var args = Array(startIndex + 1);\n for (index = 0; index < startIndex; index++) {\n args[index] = arguments[index];\n }\n args[startIndex] = rest;\n return func.apply(this, args);\n };\n}\n","// Is a given variable an object?\nexport default function isObject(obj) {\n var type = typeof obj;\n return type === 'function' || (type === 'object' && !!obj);\n}\n","// Is a given value equal to null?\nexport default function isNull(obj) {\n return obj === null;\n}\n","// Is a given variable undefined?\nexport default function isUndefined(obj) {\n return obj === void 0;\n}\n","import { toString } from './_setup.js';\n\n// Is a given value a boolean?\nexport default function isBoolean(obj) {\n return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n}\n","// Is a given value a DOM element?\nexport default function isElement(obj) {\n return !!(obj && obj.nodeType === 1);\n}\n","import { toString } from './_setup.js';\n\n// Internal function for creating a `toString`-based type tester.\nexport default function tagTester(name) {\n var tag = '[object ' + name + ']';\n return function(obj) {\n return toString.call(obj) === tag;\n };\n}\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('String');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Number');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Date');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('RegExp');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Error');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Symbol');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('ArrayBuffer');\n","import tagTester from './_tagTester.js';\nimport { root } from './_setup.js';\n\nvar isFunction = tagTester('Function');\n\n// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old\n// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).\nvar nodelist = root.document && root.document.childNodes;\nif (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {\n isFunction = function(obj) {\n return typeof obj == 'function' || false;\n };\n}\n\nexport default isFunction;\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('Object');\n","import { supportsDataView } from './_setup.js';\nimport hasObjectTag from './_hasObjectTag.js';\n\n// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.\n// In IE 11, the most common among them, this problem also applies to\n// `Map`, `WeakMap` and `Set`.\nexport var hasStringTagBug = (\n supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))\n ),\n isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));\n","import tagTester from './_tagTester.js';\nimport isFunction from './isFunction.js';\nimport isArrayBuffer from './isArrayBuffer.js';\nimport { hasStringTagBug } from './_stringTagBug.js';\n\nvar isDataView = tagTester('DataView');\n\n// In IE 10 - Edge 13, we need a different heuristic\n// to determine whether an object is a `DataView`.\nfunction ie10IsDataView(obj) {\n return obj != null && isFunction(obj.getInt8) && isArrayBuffer(obj.buffer);\n}\n\nexport default (hasStringTagBug ? ie10IsDataView : isDataView);\n","import { nativeIsArray } from './_setup.js';\nimport tagTester from './_tagTester.js';\n\n// Is a given value an array?\n// Delegates to ECMA5's native `Array.isArray`.\nexport default nativeIsArray || tagTester('Array');\n","import { hasOwnProperty } from './_setup.js';\n\n// Internal function to check whether `key` is an own property name of `obj`.\nexport default function has(obj, key) {\n return obj != null && hasOwnProperty.call(obj, key);\n}\n","import tagTester from './_tagTester.js';\nimport has from './_has.js';\n\nvar isArguments = tagTester('Arguments');\n\n// Define a fallback version of the method in browsers (ahem, IE < 9), where\n// there isn't any inspectable \"Arguments\" type.\n(function() {\n if (!isArguments(arguments)) {\n isArguments = function(obj) {\n return has(obj, 'callee');\n };\n }\n}());\n\nexport default isArguments;\n","import { _isFinite } from './_setup.js';\nimport isSymbol from './isSymbol.js';\n\n// Is a given object a finite number?\nexport default function isFinite(obj) {\n return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));\n}\n","import { _isNaN } from './_setup.js';\nimport isNumber from './isNumber.js';\n\n// Is the given value `NaN`?\nexport default function isNaN(obj) {\n return isNumber(obj) && _isNaN(obj);\n}\n","// Predicate-generating function. Often useful outside of Underscore.\nexport default function constant(value) {\n return function() {\n return value;\n };\n}\n","import { MAX_ARRAY_INDEX } from './_setup.js';\n\n// Common internal logic for `isArrayLike` and `isBufferLike`.\nexport default function createSizePropertyCheck(getSizeProperty) {\n return function(collection) {\n var sizeProperty = getSizeProperty(collection);\n return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;\n }\n}\n","// Internal helper to generate a function to obtain property `key` from `obj`.\nexport default function shallowProperty(key) {\n return function(obj) {\n return obj == null ? void 0 : obj[key];\n };\n}\n","import shallowProperty from './_shallowProperty.js';\n\n// Internal helper to obtain the `byteLength` property of an object.\nexport default shallowProperty('byteLength');\n","import createSizePropertyCheck from './_createSizePropertyCheck.js';\nimport getByteLength from './_getByteLength.js';\n\n// Internal helper to determine whether we should spend extensive checks against\n// `ArrayBuffer` et al.\nexport default createSizePropertyCheck(getByteLength);\n","import { supportsArrayBuffer, nativeIsView, toString } from './_setup.js';\nimport isDataView from './isDataView.js';\nimport constant from './constant.js';\nimport isBufferLike from './_isBufferLike.js';\n\n// Is a given value a typed array?\nvar typedArrayPattern = /\\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\\]/;\nfunction isTypedArray(obj) {\n // `ArrayBuffer.isView` is the most future-proof, so use it when available.\n // Otherwise, fall back on the above regular expression.\n return nativeIsView ? (nativeIsView(obj) && !isDataView(obj)) :\n isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));\n}\n\nexport default supportsArrayBuffer ? isTypedArray : constant(false);\n","import shallowProperty from './_shallowProperty.js';\n\n// Internal helper to obtain the `length` property of an object.\nexport default shallowProperty('length');\n","import { nonEnumerableProps, ObjProto } from './_setup.js';\nimport isFunction from './isFunction.js';\nimport has from './_has.js';\n\n// Internal helper to create a simple lookup structure.\n// `collectNonEnumProps` used to depend on `_.contains`, but this led to\n// circular imports. `emulatedSet` is a one-off solution that only works for\n// arrays of strings.\nfunction emulatedSet(keys) {\n var hash = {};\n for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;\n return {\n contains: function(key) { return hash[key] === true; },\n push: function(key) {\n hash[key] = true;\n return keys.push(key);\n }\n };\n}\n\n// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't\n// be iterated by `for key in ...` and thus missed. Extends `keys` in place if\n// needed.\nexport default function collectNonEnumProps(obj, keys) {\n keys = emulatedSet(keys);\n var nonEnumIdx = nonEnumerableProps.length;\n var constructor = obj.constructor;\n var proto = (isFunction(constructor) && constructor.prototype) || ObjProto;\n\n // Constructor is a special case.\n var prop = 'constructor';\n if (has(obj, prop) && !keys.contains(prop)) keys.push(prop);\n\n while (nonEnumIdx--) {\n prop = nonEnumerableProps[nonEnumIdx];\n if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {\n keys.push(prop);\n }\n }\n}\n","import isObject from './isObject.js';\nimport { nativeKeys, hasEnumBug } from './_setup.js';\nimport has from './_has.js';\nimport collectNonEnumProps from './_collectNonEnumProps.js';\n\n// Retrieve the names of an object's own properties.\n// Delegates to **ECMAScript 5**'s native `Object.keys`.\nexport default function keys(obj) {\n if (!isObject(obj)) return [];\n if (nativeKeys) return nativeKeys(obj);\n var keys = [];\n for (var key in obj) if (has(obj, key)) keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, keys);\n return keys;\n}\n","import getLength from './_getLength.js';\nimport isArray from './isArray.js';\nimport isString from './isString.js';\nimport isArguments from './isArguments.js';\nimport keys from './keys.js';\n\n// Is a given array, string, or object empty?\n// An \"empty\" object has no enumerable own-properties.\nexport default function isEmpty(obj) {\n if (obj == null) return true;\n // Skip the more expensive `toString`-based type checks if `obj` has no\n // `.length`.\n var length = getLength(obj);\n if (typeof length == 'number' && (\n isArray(obj) || isString(obj) || isArguments(obj)\n )) return length === 0;\n return getLength(keys(obj)) === 0;\n}\n","import keys from './keys.js';\n\n// Returns whether an object has a given set of `key:value` pairs.\nexport default function isMatch(object, attrs) {\n var _keys = keys(attrs), length = _keys.length;\n if (object == null) return !length;\n var obj = Object(object);\n for (var i = 0; i < length; i++) {\n var key = _keys[i];\n if (attrs[key] !== obj[key] || !(key in obj)) return false;\n }\n return true;\n}\n","import { VERSION } from './_setup.js';\n\n// If Underscore is called as a function, it returns a wrapped object that can\n// be used OO-style. This wrapper holds altered versions of all functions added\n// through `_.mixin`. Wrapped objects may be chained.\nexport default function _(obj) {\n if (obj instanceof _) return obj;\n if (!(this instanceof _)) return new _(obj);\n this._wrapped = obj;\n}\n\n_.VERSION = VERSION;\n\n// Extracts the result from a wrapped and chained object.\n_.prototype.value = function() {\n return this._wrapped;\n};\n\n// Provide unwrapping proxies for some methods used in engine operations\n// such as arithmetic and JSON stringification.\n_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n_.prototype.toString = function() {\n return String(this._wrapped);\n};\n","import getByteLength from './_getByteLength.js';\n\n// Internal function to wrap or shallow-copy an ArrayBuffer,\n// typed array or DataView to a new view, reusing the buffer.\nexport default function toBufferView(bufferSource) {\n return new Uint8Array(\n bufferSource.buffer || bufferSource,\n bufferSource.byteOffset || 0,\n getByteLength(bufferSource)\n );\n}\n","import _ from './underscore.js';\nimport { toString, SymbolProto } from './_setup.js';\nimport getByteLength from './_getByteLength.js';\nimport isTypedArray from './isTypedArray.js';\nimport isFunction from './isFunction.js';\nimport { hasStringTagBug } from './_stringTagBug.js';\nimport isDataView from './isDataView.js';\nimport keys from './keys.js';\nimport has from './_has.js';\nimport toBufferView from './_toBufferView.js';\n\n// We use this string twice, so give it a name for minification.\nvar tagDataView = '[object DataView]';\n\n// Internal recursive comparison function for `_.isEqual`.\nfunction eq(a, b, aStack, bStack) {\n // Identical objects are equal. `0 === -0`, but they aren't identical.\n // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n if (a === b) return a !== 0 || 1 / a === 1 / b;\n // `null` or `undefined` only equal to itself (strict comparison).\n if (a == null || b == null) return false;\n // `NaN`s are equivalent, but non-reflexive.\n if (a !== a) return b !== b;\n // Exhaust primitive checks\n var type = typeof a;\n if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;\n return deepEq(a, b, aStack, bStack);\n}\n\n// Internal recursive comparison function for `_.isEqual`.\nfunction deepEq(a, b, aStack, bStack) {\n // Unwrap any wrapped objects.\n if (a instanceof _) a = a._wrapped;\n if (b instanceof _) b = b._wrapped;\n // Compare `[[Class]]` names.\n var className = toString.call(a);\n if (className !== toString.call(b)) return false;\n // Work around a bug in IE 10 - Edge 13.\n if (hasStringTagBug && className == '[object Object]' && isDataView(a)) {\n if (!isDataView(b)) return false;\n className = tagDataView;\n }\n switch (className) {\n // These types are compared by value.\n case '[object RegExp]':\n // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n case '[object String]':\n // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n // equivalent to `new String(\"5\")`.\n return '' + a === '' + b;\n case '[object Number]':\n // `NaN`s are equivalent, but non-reflexive.\n // Object(NaN) is equivalent to NaN.\n if (+a !== +a) return +b !== +b;\n // An `egal` comparison is performed for other numeric values.\n return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n case '[object Date]':\n case '[object Boolean]':\n // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n // millisecond representations. Note that invalid dates with millisecond representations\n // of `NaN` are not equivalent.\n return +a === +b;\n case '[object Symbol]':\n return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);\n case '[object ArrayBuffer]':\n case tagDataView:\n // Coerce to typed array so we can fall through.\n return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);\n }\n\n var areArrays = className === '[object Array]';\n if (!areArrays && isTypedArray(a)) {\n var byteLength = getByteLength(a);\n if (byteLength !== getByteLength(b)) return false;\n if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;\n areArrays = true;\n }\n if (!areArrays) {\n if (typeof a != 'object' || typeof b != 'object') return false;\n\n // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n // from different frames are.\n var aCtor = a.constructor, bCtor = b.constructor;\n if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&\n isFunction(bCtor) && bCtor instanceof bCtor)\n && ('constructor' in a && 'constructor' in b)) {\n return false;\n }\n }\n // Assume equality for cyclic structures. The algorithm for detecting cyclic\n // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n // Initializing stack of traversed objects.\n // It's done here since we only need them for objects and arrays comparison.\n aStack = aStack || [];\n bStack = bStack || [];\n var length = aStack.length;\n while (length--) {\n // Linear search. Performance is inversely proportional to the number of\n // unique nested structures.\n if (aStack[length] === a) return bStack[length] === b;\n }\n\n // Add the first object to the stack of traversed objects.\n aStack.push(a);\n bStack.push(b);\n\n // Recursively compare objects and arrays.\n if (areArrays) {\n // Compare array lengths to determine if a deep comparison is necessary.\n length = a.length;\n if (length !== b.length) return false;\n // Deep compare the contents, ignoring non-numeric properties.\n while (length--) {\n if (!eq(a[length], b[length], aStack, bStack)) return false;\n }\n } else {\n // Deep compare objects.\n var _keys = keys(a), key;\n length = _keys.length;\n // Ensure that both objects contain the same number of properties before comparing deep equality.\n if (keys(b).length !== length) return false;\n while (length--) {\n // Deep compare each member\n key = _keys[length];\n if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n }\n }\n // Remove the first object from the stack of traversed objects.\n aStack.pop();\n bStack.pop();\n return true;\n}\n\n// Perform a deep comparison to check if two objects are equal.\nexport default function isEqual(a, b) {\n return eq(a, b);\n}\n","import isObject from './isObject.js';\nimport { hasEnumBug } from './_setup.js';\nimport collectNonEnumProps from './_collectNonEnumProps.js';\n\n// Retrieve all the enumerable property names of an object.\nexport default function allKeys(obj) {\n if (!isObject(obj)) return [];\n var keys = [];\n for (var key in obj) keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, keys);\n return keys;\n}\n","import getLength from './_getLength.js';\nimport isFunction from './isFunction.js';\nimport allKeys from './allKeys.js';\n\n// Since the regular `Object.prototype.toString` type tests don't work for\n// some types in IE 11, we use a fingerprinting heuristic instead, based\n// on the methods. It's not great, but it's the best we got.\n// The fingerprint method lists are defined below.\nexport function ie11fingerprint(methods) {\n var length = getLength(methods);\n return function(obj) {\n if (obj == null) return false;\n // `Map`, `WeakMap` and `Set` have no enumerable keys.\n var keys = allKeys(obj);\n if (getLength(keys)) return false;\n for (var i = 0; i < length; i++) {\n if (!isFunction(obj[methods[i]])) return false;\n }\n // If we are testing against `WeakMap`, we need to ensure that\n // `obj` doesn't have a `forEach` method in order to distinguish\n // it from a regular `Map`.\n return methods !== weakMapMethods || !isFunction(obj[forEachName]);\n };\n}\n\n// In the interest of compact minification, we write\n// each string in the fingerprints only once.\nvar forEachName = 'forEach',\n hasName = 'has',\n commonInit = ['clear', 'delete'],\n mapTail = ['get', hasName, 'set'];\n\n// `Map`, `WeakMap` and `Set` each have slightly different\n// combinations of the above sublists.\nexport var mapMethods = commonInit.concat(forEachName, mapTail),\n weakMapMethods = commonInit.concat(mapTail),\n setMethods = ['add'].concat(commonInit, forEachName, hasName);\n","import tagTester from './_tagTester.js';\nimport { isIE11 } from './_stringTagBug.js';\nimport { ie11fingerprint, mapMethods } from './_methodFingerprint.js';\n\nexport default isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');\n","import tagTester from './_tagTester.js';\nimport { isIE11 } from './_stringTagBug.js';\nimport { ie11fingerprint, weakMapMethods } from './_methodFingerprint.js';\n\nexport default isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');\n","import tagTester from './_tagTester.js';\nimport { isIE11 } from './_stringTagBug.js';\nimport { ie11fingerprint, setMethods } from './_methodFingerprint.js';\n\nexport default isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');\n","import tagTester from './_tagTester.js';\n\nexport default tagTester('WeakSet');\n","import keys from './keys.js';\n\n// Retrieve the values of an object's properties.\nexport default function values(obj) {\n var _keys = keys(obj);\n var length = _keys.length;\n var values = Array(length);\n for (var i = 0; i < length; i++) {\n values[i] = obj[_keys[i]];\n }\n return values;\n}\n","import keys from './keys.js';\n\n// Convert an object into a list of `[key, value]` pairs.\n// The opposite of `_.object` with one argument.\nexport default function pairs(obj) {\n var _keys = keys(obj);\n var length = _keys.length;\n var pairs = Array(length);\n for (var i = 0; i < length; i++) {\n pairs[i] = [_keys[i], obj[_keys[i]]];\n }\n return pairs;\n}\n","import keys from './keys.js';\n\n// Invert the keys and values of an object. The values must be serializable.\nexport default function invert(obj) {\n var result = {};\n var _keys = keys(obj);\n for (var i = 0, length = _keys.length; i < length; i++) {\n result[obj[_keys[i]]] = _keys[i];\n }\n return result;\n}\n","import isFunction from './isFunction.js';\n\n// Return a sorted list of the function names available on the object.\nexport default function functions(obj) {\n var names = [];\n for (var key in obj) {\n if (isFunction(obj[key])) names.push(key);\n }\n return names.sort();\n}\n","// An internal function for creating assigner functions.\nexport default function createAssigner(keysFunc, defaults) {\n return function(obj) {\n var length = arguments.length;\n if (defaults) obj = Object(obj);\n if (length < 2 || obj == null) return obj;\n for (var index = 1; index < length; index++) {\n var source = arguments[index],\n keys = keysFunc(source),\n l = keys.length;\n for (var i = 0; i < l; i++) {\n var key = keys[i];\n if (!defaults || obj[key] === void 0) obj[key] = source[key];\n }\n }\n return obj;\n };\n}\n","import createAssigner from './_createAssigner.js';\nimport allKeys from './allKeys.js';\n\n// Extend a given object with all the properties in passed-in object(s).\nexport default createAssigner(allKeys);\n","import createAssigner from './_createAssigner.js';\nimport keys from './keys.js';\n\n// Assigns a given object with all the own properties in the passed-in\n// object(s).\n// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\nexport default createAssigner(keys);\n","import createAssigner from './_createAssigner.js';\nimport allKeys from './allKeys.js';\n\n// Fill in a given object with default properties.\nexport default createAssigner(allKeys, true);\n","import isObject from './isObject.js';\nimport { nativeCreate } from './_setup.js';\n\n// Create a naked function reference for surrogate-prototype-swapping.\nfunction ctor() {\n return function(){};\n}\n\n// An internal function for creating a new object that inherits from another.\nexport default function baseCreate(prototype) {\n if (!isObject(prototype)) return {};\n if (nativeCreate) return nativeCreate(prototype);\n var Ctor = ctor();\n Ctor.prototype = prototype;\n var result = new Ctor;\n Ctor.prototype = null;\n return result;\n}\n","import baseCreate from './_baseCreate.js';\nimport extendOwn from './extendOwn.js';\n\n// Creates an object that inherits from the given prototype object.\n// If additional properties are provided then they will be added to the\n// created object.\nexport default function create(prototype, props) {\n var result = baseCreate(prototype);\n if (props) extendOwn(result, props);\n return result;\n}\n","import isObject from './isObject.js';\nimport isArray from './isArray.js';\nimport extend from './extend.js';\n\n// Create a (shallow-cloned) duplicate of an object.\nexport default function clone(obj) {\n if (!isObject(obj)) return obj;\n return isArray(obj) ? obj.slice() : extend({}, obj);\n}\n","// Invokes `interceptor` with the `obj` and then returns `obj`.\n// The primary purpose of this method is to \"tap into\" a method chain, in\n// order to perform operations on intermediate results within the chain.\nexport default function tap(obj, interceptor) {\n interceptor(obj);\n return obj;\n}\n","import _ from './underscore.js';\nimport isArray from './isArray.js';\n\n// Normalize a (deep) property `path` to array.\n// Like `_.iteratee`, this function can be customized.\nexport default function toPath(path) {\n return isArray(path) ? path : [path];\n}\n_.toPath = toPath;\n","import _ from './underscore.js';\nimport './toPath.js';\n\n// Internal wrapper for `_.toPath` to enable minification.\n// Similar to `cb` for `_.iteratee`.\nexport default function toPath(path) {\n return _.toPath(path);\n}\n","// Internal function to obtain a nested property in `obj` along `path`.\nexport default function deepGet(obj, path) {\n var length = path.length;\n for (var i = 0; i < length; i++) {\n if (obj == null) return void 0;\n obj = obj[path[i]];\n }\n return length ? obj : void 0;\n}\n","import toPath from './_toPath.js';\nimport deepGet from './_deepGet.js';\nimport isUndefined from './isUndefined.js';\n\n// Get the value of the (deep) property on `path` from `object`.\n// If any property in `path` does not exist or if the value is\n// `undefined`, return `defaultValue` instead.\n// The `path` is normalized through `_.toPath`.\nexport default function get(object, path, defaultValue) {\n var value = deepGet(object, toPath(path));\n return isUndefined(value) ? defaultValue : value;\n}\n","import _has from './_has.js';\nimport toPath from './_toPath.js';\n\n// Shortcut function for checking if an object has a given property directly on\n// itself (in other words, not on a prototype). Unlike the internal `has`\n// function, this public version can also traverse nested properties.\nexport default function has(obj, path) {\n path = toPath(path);\n var length = path.length;\n for (var i = 0; i < length; i++) {\n var key = path[i];\n if (!_has(obj, key)) return false;\n obj = obj[key];\n }\n return !!length;\n}\n","// Keep the identity function around for default iteratees.\nexport default function identity(value) {\n return value;\n}\n","import extendOwn from './extendOwn.js';\nimport isMatch from './isMatch.js';\n\n// Returns a predicate for checking whether an object has a given set of\n// `key:value` pairs.\nexport default function matcher(attrs) {\n attrs = extendOwn({}, attrs);\n return function(obj) {\n return isMatch(obj, attrs);\n };\n}\n","import deepGet from './_deepGet.js';\nimport toPath from './_toPath.js';\n\n// Creates a function that, when passed an object, will traverse that object’s\n// properties down the given `path`, specified as an array of keys or indices.\nexport default function property(path) {\n path = toPath(path);\n return function(obj) {\n return deepGet(obj, path);\n };\n}\n","// Internal function that returns an efficient (for current engines) version\n// of the passed-in callback, to be repeatedly applied in other Underscore\n// functions.\nexport default function optimizeCb(func, context, argCount) {\n if (context === void 0) return func;\n switch (argCount == null ? 3 : argCount) {\n case 1: return function(value) {\n return func.call(context, value);\n };\n // The 2-argument case is omitted because we’re not using it.\n case 3: return function(value, index, collection) {\n return func.call(context, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(context, accumulator, value, index, collection);\n };\n }\n return function() {\n return func.apply(context, arguments);\n };\n}\n","import identity from './identity.js';\nimport isFunction from './isFunction.js';\nimport isObject from './isObject.js';\nimport isArray from './isArray.js';\nimport matcher from './matcher.js';\nimport property from './property.js';\nimport optimizeCb from './_optimizeCb.js';\n\n// An internal function to generate callbacks that can be applied to each\n// element in a collection, returning the desired result — either `_.identity`,\n// an arbitrary callback, a property matcher, or a property accessor.\nexport default function baseIteratee(value, context, argCount) {\n if (value == null) return identity;\n if (isFunction(value)) return optimizeCb(value, context, argCount);\n if (isObject(value) && !isArray(value)) return matcher(value);\n return property(value);\n}\n","import _ from './underscore.js';\nimport baseIteratee from './_baseIteratee.js';\n\n// External wrapper for our callback generator. Users may customize\n// `_.iteratee` if they want additional predicate/iteratee shorthand styles.\n// This abstraction hides the internal-only `argCount` argument.\nexport default function iteratee(value, context) {\n return baseIteratee(value, context, Infinity);\n}\n_.iteratee = iteratee;\n","import _ from './underscore.js';\nimport baseIteratee from './_baseIteratee.js';\nimport iteratee from './iteratee.js';\n\n// The function we call internally to generate a callback. It invokes\n// `_.iteratee` if overridden, otherwise `baseIteratee`.\nexport default function cb(value, context, argCount) {\n if (_.iteratee !== iteratee) return _.iteratee(value, context);\n return baseIteratee(value, context, argCount);\n}\n","import cb from './_cb.js';\nimport keys from './keys.js';\n\n// Returns the results of applying the `iteratee` to each element of `obj`.\n// In contrast to `_.map` it returns an object.\nexport default function mapObject(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var _keys = keys(obj),\n length = _keys.length,\n results = {};\n for (var index = 0; index < length; index++) {\n var currentKey = _keys[index];\n results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n}\n","// Predicate-generating function. Often useful outside of Underscore.\nexport default function noop(){}\n","import noop from './noop.js';\nimport get from './get.js';\n\n// Generates a function for a given object that returns a given property.\nexport default function propertyOf(obj) {\n if (obj == null) return noop;\n return function(path) {\n return get(obj, path);\n };\n}\n","import optimizeCb from './_optimizeCb.js';\n\n// Run a function **n** times.\nexport default function times(n, iteratee, context) {\n var accum = Array(Math.max(0, n));\n iteratee = optimizeCb(iteratee, context, 1);\n for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n return accum;\n}\n","// Return a random integer between `min` and `max` (inclusive).\nexport default function random(min, max) {\n if (max == null) {\n max = min;\n min = 0;\n }\n return min + Math.floor(Math.random() * (max - min + 1));\n}\n","// A (possibly faster) way to get the current timestamp as an integer.\nexport default Date.now || function() {\n return new Date().getTime();\n};\n","import keys from './keys.js';\n\n// Internal helper to generate functions for escaping and unescaping strings\n// to/from HTML interpolation.\nexport default function createEscaper(map) {\n var escaper = function(match) {\n return map[match];\n };\n // Regexes for identifying a key that needs to be escaped.\n var source = '(?:' + keys(map).join('|') + ')';\n var testRegexp = RegExp(source);\n var replaceRegexp = RegExp(source, 'g');\n return function(string) {\n string = string == null ? '' : '' + string;\n return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n };\n}\n","// Internal list of HTML entities for escaping.\nexport default {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n};\n","import createEscaper from './_createEscaper.js';\nimport escapeMap from './_escapeMap.js';\n\n// Function for escaping strings to HTML interpolation.\nexport default createEscaper(escapeMap);\n","import invert from './invert.js';\nimport escapeMap from './_escapeMap.js';\n\n// Internal list of HTML entities for unescaping.\nexport default invert(escapeMap);\n","import createEscaper from './_createEscaper.js';\nimport unescapeMap from './_unescapeMap.js';\n\n// Function for unescaping strings from HTML interpolation.\nexport default createEscaper(unescapeMap);\n","import _ from './underscore.js';\n\n// By default, Underscore uses ERB-style template delimiters. Change the\n// following template settings to use alternative delimiters.\nexport default _.templateSettings = {\n evaluate: /<%([\\s\\S]+?)%>/g,\n interpolate: /<%=([\\s\\S]+?)%>/g,\n escape: /<%-([\\s\\S]+?)%>/g\n};\n","import defaults from './defaults.js';\nimport _ from './underscore.js';\nimport './templateSettings.js';\n\n// When customizing `_.templateSettings`, if you don't want to define an\n// interpolation, evaluation or escaping regex, we need one that is\n// guaranteed not to match.\nvar noMatch = /(.)^/;\n\n// Certain characters need to be escaped so that they can be put into a\n// string literal.\nvar escapes = {\n \"'\": \"'\",\n '\\\\': '\\\\',\n '\\r': 'r',\n '\\n': 'n',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n};\n\nvar escapeRegExp = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\nfunction escapeChar(match) {\n return '\\\\' + escapes[match];\n}\n\n// In order to prevent third-party code injection through\n// `_.templateSettings.variable`, we test it against the following regular\n// expression. It is intentionally a bit more liberal than just matching valid\n// identifiers, but still prevents possible loopholes through defaults or\n// destructuring assignment.\nvar bareIdentifier = /^\\s*(\\w|\\$)+\\s*$/;\n\n// JavaScript micro-templating, similar to John Resig's implementation.\n// Underscore templating handles arbitrary delimiters, preserves whitespace,\n// and correctly escapes quotes within interpolated code.\n// NB: `oldSettings` only exists for backwards compatibility.\nexport default function template(text, settings, oldSettings) {\n if (!settings && oldSettings) settings = oldSettings;\n settings = defaults({}, settings, _.templateSettings);\n\n // Combine delimiters into one regular expression via alternation.\n var matcher = RegExp([\n (settings.escape || noMatch).source,\n (settings.interpolate || noMatch).source,\n (settings.evaluate || noMatch).source\n ].join('|') + '|$', 'g');\n\n // Compile the template source, escaping string literals appropriately.\n var index = 0;\n var source = \"__p+='\";\n text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n source += text.slice(index, offset).replace(escapeRegExp, escapeChar);\n index = offset + match.length;\n\n if (escape) {\n source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n } else if (interpolate) {\n source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n } else if (evaluate) {\n source += \"';\\n\" + evaluate + \"\\n__p+='\";\n }\n\n // Adobe VMs need the match returned to produce the correct offset.\n return match;\n });\n source += \"';\\n\";\n\n var argument = settings.variable;\n if (argument) {\n // Insure against third-party code injection. (CVE-2021-23358)\n if (!bareIdentifier.test(argument)) throw new Error(\n 'variable is not a bare identifier: ' + argument\n );\n } else {\n // If a variable is not specified, place data values in local scope.\n source = 'with(obj||{}){\\n' + source + '}\\n';\n argument = 'obj';\n }\n\n source = \"var __t,__p='',__j=Array.prototype.join,\" +\n \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n source + 'return __p;\\n';\n\n var render;\n try {\n render = new Function(argument, '_', source);\n } catch (e) {\n e.source = source;\n throw e;\n }\n\n var template = function(data) {\n return render.call(this, data, _);\n };\n\n // Provide the compiled source as a convenience for precompilation.\n template.source = 'function(' + argument + '){\\n' + source + '}';\n\n return template;\n}\n","import isFunction from './isFunction.js';\nimport toPath from './_toPath.js';\n\n// Traverses the children of `obj` along `path`. If a child is a function, it\n// is invoked with its parent as context. Returns the value of the final\n// child, or `fallback` if any child is undefined.\nexport default function result(obj, path, fallback) {\n path = toPath(path);\n var length = path.length;\n if (!length) {\n return isFunction(fallback) ? fallback.call(obj) : fallback;\n }\n for (var i = 0; i < length; i++) {\n var prop = obj == null ? void 0 : obj[path[i]];\n if (prop === void 0) {\n prop = fallback;\n i = length; // Ensure we don't continue iterating.\n }\n obj = isFunction(prop) ? prop.call(obj) : prop;\n }\n return obj;\n}\n","// Generate a unique integer id (unique within the entire client session).\n// Useful for temporary DOM ids.\nvar idCounter = 0;\nexport default function uniqueId(prefix) {\n var id = ++idCounter + '';\n return prefix ? prefix + id : id;\n}\n","import _ from './underscore.js';\n\n// Start chaining a wrapped Underscore object.\nexport default function chain(obj) {\n var instance = _(obj);\n instance._chain = true;\n return instance;\n}\n","import baseCreate from './_baseCreate.js';\nimport isObject from './isObject.js';\n\n// Internal function to execute `sourceFunc` bound to `context` with optional\n// `args`. Determines whether to execute a function as a constructor or as a\n// normal function.\nexport default function executeBound(sourceFunc, boundFunc, context, callingContext, args) {\n if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n var self = baseCreate(sourceFunc.prototype);\n var result = sourceFunc.apply(self, args);\n if (isObject(result)) return result;\n return self;\n}\n","import restArguments from './restArguments.js';\nimport executeBound from './_executeBound.js';\nimport _ from './underscore.js';\n\n// Partially apply a function by creating a version that has had some of its\n// arguments pre-filled, without changing its dynamic `this` context. `_` acts\n// as a placeholder by default, allowing any combination of arguments to be\n// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.\nvar partial = restArguments(function(func, boundArgs) {\n var placeholder = partial.placeholder;\n var bound = function() {\n var position = 0, length = boundArgs.length;\n var args = Array(length);\n for (var i = 0; i < length; i++) {\n args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];\n }\n while (position < arguments.length) args.push(arguments[position++]);\n return executeBound(func, bound, this, this, args);\n };\n return bound;\n});\n\npartial.placeholder = _;\nexport default partial;\n","import restArguments from './restArguments.js';\nimport isFunction from './isFunction.js';\nimport executeBound from './_executeBound.js';\n\n// Create a function bound to a given object (assigning `this`, and arguments,\n// optionally).\nexport default restArguments(function(func, context, args) {\n if (!isFunction(func)) throw new TypeError('Bind must be called on a function');\n var bound = restArguments(function(callArgs) {\n return executeBound(func, bound, context, this, args.concat(callArgs));\n });\n return bound;\n});\n","import createSizePropertyCheck from './_createSizePropertyCheck.js';\nimport getLength from './_getLength.js';\n\n// Internal helper for collection methods to determine whether a collection\n// should be iterated as an array or as an object.\n// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\nexport default createSizePropertyCheck(getLength);\n","import getLength from './_getLength.js';\nimport isArrayLike from './_isArrayLike.js';\nimport isArray from './isArray.js';\nimport isArguments from './isArguments.js';\n\n// Internal implementation of a recursive `flatten` function.\nexport default function flatten(input, depth, strict, output) {\n output = output || [];\n if (!depth && depth !== 0) {\n depth = Infinity;\n } else if (depth <= 0) {\n return output.concat(input);\n }\n var idx = output.length;\n for (var i = 0, length = getLength(input); i < length; i++) {\n var value = input[i];\n if (isArrayLike(value) && (isArray(value) || isArguments(value))) {\n // Flatten current level of array or arguments object.\n if (depth > 1) {\n flatten(value, depth - 1, strict, output);\n idx = output.length;\n } else {\n var j = 0, len = value.length;\n while (j < len) output[idx++] = value[j++];\n }\n } else if (!strict) {\n output[idx++] = value;\n }\n }\n return output;\n}\n","import restArguments from './restArguments.js';\nimport flatten from './_flatten.js';\nimport bind from './bind.js';\n\n// Bind a number of an object's methods to that object. Remaining arguments\n// are the method names to be bound. Useful for ensuring that all callbacks\n// defined on an object belong to it.\nexport default restArguments(function(obj, keys) {\n keys = flatten(keys, false, false);\n var index = keys.length;\n if (index < 1) throw new Error('bindAll must be passed function names');\n while (index--) {\n var key = keys[index];\n obj[key] = bind(obj[key], obj);\n }\n return obj;\n});\n","import has from './_has.js';\n\n// Memoize an expensive function by storing its results.\nexport default function memoize(func, hasher) {\n var memoize = function(key) {\n var cache = memoize.cache;\n var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n if (!has(cache, address)) cache[address] = func.apply(this, arguments);\n return cache[address];\n };\n memoize.cache = {};\n return memoize;\n}\n","import restArguments from './restArguments.js';\n\n// Delays a function for the given number of milliseconds, and then calls\n// it with the arguments supplied.\nexport default restArguments(function(func, wait, args) {\n return setTimeout(function() {\n return func.apply(null, args);\n }, wait);\n});\n","import partial from './partial.js';\nimport delay from './delay.js';\nimport _ from './underscore.js';\n\n// Defers a function, scheduling it to run after the current call stack has\n// cleared.\nexport default partial(delay, _, 1);\n","import now from './now.js';\n\n// Returns a function, that, when invoked, will only be triggered at most once\n// during a given window of time. Normally, the throttled function will run\n// as much as it can, without ever going more than once per `wait` duration;\n// but if you'd like to disable the execution on the leading edge, pass\n// `{leading: false}`. To disable execution on the trailing edge, ditto.\nexport default function throttle(func, wait, options) {\n var timeout, context, args, result;\n var previous = 0;\n if (!options) options = {};\n\n var later = function() {\n previous = options.leading === false ? 0 : now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n\n var throttled = function() {\n var _now = now();\n if (!previous && options.leading === false) previous = _now;\n var remaining = wait - (_now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = _now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n\n throttled.cancel = function() {\n clearTimeout(timeout);\n previous = 0;\n timeout = context = args = null;\n };\n\n return throttled;\n}\n","import restArguments from './restArguments.js';\nimport now from './now.js';\n\n// When a sequence of calls of the returned function ends, the argument\n// function is triggered. The end of a sequence is defined by the `wait`\n// parameter. If `immediate` is passed, the argument function will be\n// triggered at the beginning of the sequence instead of at the end.\nexport default function debounce(func, wait, immediate) {\n var timeout, previous, args, result, context;\n\n var later = function() {\n var passed = now() - previous;\n if (wait > passed) {\n timeout = setTimeout(later, wait - passed);\n } else {\n timeout = null;\n if (!immediate) result = func.apply(context, args);\n // This check is needed because `func` can recursively invoke `debounced`.\n if (!timeout) args = context = null;\n }\n };\n\n var debounced = restArguments(function(_args) {\n context = this;\n args = _args;\n previous = now();\n if (!timeout) {\n timeout = setTimeout(later, wait);\n if (immediate) result = func.apply(context, args);\n }\n return result;\n });\n\n debounced.cancel = function() {\n clearTimeout(timeout);\n timeout = args = context = null;\n };\n\n return debounced;\n}\n","import partial from './partial.js';\n\n// Returns the first function passed as an argument to the second,\n// allowing you to adjust arguments, run code before and after, and\n// conditionally execute the original function.\nexport default function wrap(func, wrapper) {\n return partial(wrapper, func);\n}\n","// Returns a negated version of the passed-in predicate.\nexport default function negate(predicate) {\n return function() {\n return !predicate.apply(this, arguments);\n };\n}\n","// Returns a function that is the composition of a list of functions, each\n// consuming the return value of the function that follows.\nexport default function compose() {\n var args = arguments;\n var start = args.length - 1;\n return function() {\n var i = start;\n var result = args[start].apply(this, arguments);\n while (i--) result = args[i].call(this, result);\n return result;\n };\n}\n","// Returns a function that will only be executed on and after the Nth call.\nexport default function after(times, func) {\n return function() {\n if (--times < 1) {\n return func.apply(this, arguments);\n }\n };\n}\n","// Returns a function that will only be executed up to (but not including) the\n// Nth call.\nexport default function before(times, func) {\n var memo;\n return function() {\n if (--times > 0) {\n memo = func.apply(this, arguments);\n }\n if (times <= 1) func = null;\n return memo;\n };\n}\n","import partial from './partial.js';\nimport before from './before.js';\n\n// Returns a function that will be executed at most one time, no matter how\n// often you call it. Useful for lazy initialization.\nexport default partial(before, 2);\n","import cb from './_cb.js';\nimport keys from './keys.js';\n\n// Returns the first key on an object that passes a truth test.\nexport default function findKey(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = keys(obj), key;\n for (var i = 0, length = _keys.length; i < length; i++) {\n key = _keys[i];\n if (predicate(obj[key], key, obj)) return key;\n }\n}\n","import cb from './_cb.js';\nimport getLength from './_getLength.js';\n\n// Internal function to generate `_.findIndex` and `_.findLastIndex`.\nexport default function createPredicateIndexFinder(dir) {\n return function(array, predicate, context) {\n predicate = cb(predicate, context);\n var length = getLength(array);\n var index = dir > 0 ? 0 : length - 1;\n for (; index >= 0 && index < length; index += dir) {\n if (predicate(array[index], index, array)) return index;\n }\n return -1;\n };\n}\n","import createPredicateIndexFinder from './_createPredicateIndexFinder.js';\n\n// Returns the first index on an array-like that passes a truth test.\nexport default createPredicateIndexFinder(1);\n","import createPredicateIndexFinder from './_createPredicateIndexFinder.js';\n\n// Returns the last index on an array-like that passes a truth test.\nexport default createPredicateIndexFinder(-1);\n","import cb from './_cb.js';\nimport getLength from './_getLength.js';\n\n// Use a comparator function to figure out the smallest index at which\n// an object should be inserted so as to maintain order. Uses binary search.\nexport default function sortedIndex(array, obj, iteratee, context) {\n iteratee = cb(iteratee, context, 1);\n var value = iteratee(obj);\n var low = 0, high = getLength(array);\n while (low < high) {\n var mid = Math.floor((low + high) / 2);\n if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n }\n return low;\n}\n","import getLength from './_getLength.js';\nimport { slice } from './_setup.js';\nimport isNaN from './isNaN.js';\n\n// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.\nexport default function createIndexFinder(dir, predicateFind, sortedIndex) {\n return function(array, item, idx) {\n var i = 0, length = getLength(array);\n if (typeof idx == 'number') {\n if (dir > 0) {\n i = idx >= 0 ? idx : Math.max(idx + length, i);\n } else {\n length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n }\n } else if (sortedIndex && idx && length) {\n idx = sortedIndex(array, item);\n return array[idx] === item ? idx : -1;\n }\n if (item !== item) {\n idx = predicateFind(slice.call(array, i, length), isNaN);\n return idx >= 0 ? idx + i : -1;\n }\n for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n if (array[idx] === item) return idx;\n }\n return -1;\n };\n}\n","import sortedIndex from './sortedIndex.js';\nimport findIndex from './findIndex.js';\nimport createIndexFinder from './_createIndexFinder.js';\n\n// Return the position of the first occurrence of an item in an array,\n// or -1 if the item is not included in the array.\n// If the array is large and already in sort order, pass `true`\n// for **isSorted** to use binary search.\nexport default createIndexFinder(1, findIndex, sortedIndex);\n","import findLastIndex from './findLastIndex.js';\nimport createIndexFinder from './_createIndexFinder.js';\n\n// Return the position of the last occurrence of an item in an array,\n// or -1 if the item is not included in the array.\nexport default createIndexFinder(-1, findLastIndex);\n","import isArrayLike from './_isArrayLike.js';\nimport findIndex from './findIndex.js';\nimport findKey from './findKey.js';\n\n// Return the first value which passes a truth test.\nexport default function find(obj, predicate, context) {\n var keyFinder = isArrayLike(obj) ? findIndex : findKey;\n var key = keyFinder(obj, predicate, context);\n if (key !== void 0 && key !== -1) return obj[key];\n}\n","import find from './find.js';\nimport matcher from './matcher.js';\n\n// Convenience version of a common use case of `_.find`: getting the first\n// object containing specific `key:value` pairs.\nexport default function findWhere(obj, attrs) {\n return find(obj, matcher(attrs));\n}\n","import optimizeCb from './_optimizeCb.js';\nimport isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// The cornerstone for collection functions, an `each`\n// implementation, aka `forEach`.\n// Handles raw objects in addition to array-likes. Treats all\n// sparse array-likes as if they were dense.\nexport default function each(obj, iteratee, context) {\n iteratee = optimizeCb(iteratee, context);\n var i, length;\n if (isArrayLike(obj)) {\n for (i = 0, length = obj.length; i < length; i++) {\n iteratee(obj[i], i, obj);\n }\n } else {\n var _keys = keys(obj);\n for (i = 0, length = _keys.length; i < length; i++) {\n iteratee(obj[_keys[i]], _keys[i], obj);\n }\n }\n return obj;\n}\n","import cb from './_cb.js';\nimport isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// Return the results of applying the iteratee to each element.\nexport default function map(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length,\n results = Array(length);\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n results[index] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n}\n","import isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\nimport optimizeCb from './_optimizeCb.js';\n\n// Internal helper to create a reducing function, iterating left or right.\nexport default function createReduce(dir) {\n // Wrap code that reassigns argument variables in a separate function than\n // the one that accesses `arguments.length` to avoid a perf hit. (#1991)\n var reducer = function(obj, iteratee, memo, initial) {\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length,\n index = dir > 0 ? 0 : length - 1;\n if (!initial) {\n memo = obj[_keys ? _keys[index] : index];\n index += dir;\n }\n for (; index >= 0 && index < length; index += dir) {\n var currentKey = _keys ? _keys[index] : index;\n memo = iteratee(memo, obj[currentKey], currentKey, obj);\n }\n return memo;\n };\n\n return function(obj, iteratee, memo, context) {\n var initial = arguments.length >= 3;\n return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);\n };\n}\n","import createReduce from './_createReduce.js';\n\n// **Reduce** builds up a single result from a list of values, aka `inject`,\n// or `foldl`.\nexport default createReduce(1);\n","import createReduce from './_createReduce.js';\n\n// The right-associative version of reduce, also known as `foldr`.\nexport default createReduce(-1);\n","import cb from './_cb.js';\nimport each from './each.js';\n\n// Return all the elements that pass a truth test.\nexport default function filter(obj, predicate, context) {\n var results = [];\n predicate = cb(predicate, context);\n each(obj, function(value, index, list) {\n if (predicate(value, index, list)) results.push(value);\n });\n return results;\n}\n","import filter from './filter.js';\nimport negate from './negate.js';\nimport cb from './_cb.js';\n\n// Return all the elements for which a truth test fails.\nexport default function reject(obj, predicate, context) {\n return filter(obj, negate(cb(predicate)), context);\n}\n","import cb from './_cb.js';\nimport isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// Determine whether all of the elements pass a truth test.\nexport default function every(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n if (!predicate(obj[currentKey], currentKey, obj)) return false;\n }\n return true;\n}\n","import cb from './_cb.js';\nimport isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// Determine if at least one element in the object passes a truth test.\nexport default function some(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n if (predicate(obj[currentKey], currentKey, obj)) return true;\n }\n return false;\n}\n","import isArrayLike from './_isArrayLike.js';\nimport values from './values.js';\nimport indexOf from './indexOf.js';\n\n// Determine if the array or object contains a given item (using `===`).\nexport default function contains(obj, item, fromIndex, guard) {\n if (!isArrayLike(obj)) obj = values(obj);\n if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n return indexOf(obj, item, fromIndex) >= 0;\n}\n","import restArguments from './restArguments.js';\nimport isFunction from './isFunction.js';\nimport map from './map.js';\nimport deepGet from './_deepGet.js';\nimport toPath from './_toPath.js';\n\n// Invoke a method (with arguments) on every item in a collection.\nexport default restArguments(function(obj, path, args) {\n var contextPath, func;\n if (isFunction(path)) {\n func = path;\n } else {\n path = toPath(path);\n contextPath = path.slice(0, -1);\n path = path[path.length - 1];\n }\n return map(obj, function(context) {\n var method = func;\n if (!method) {\n if (contextPath && contextPath.length) {\n context = deepGet(context, contextPath);\n }\n if (context == null) return void 0;\n method = context[path];\n }\n return method == null ? method : method.apply(context, args);\n });\n});\n","import map from './map.js';\nimport property from './property.js';\n\n// Convenience version of a common use case of `_.map`: fetching a property.\nexport default function pluck(obj, key) {\n return map(obj, property(key));\n}\n","import filter from './filter.js';\nimport matcher from './matcher.js';\n\n// Convenience version of a common use case of `_.filter`: selecting only\n// objects containing specific `key:value` pairs.\nexport default function where(obj, attrs) {\n return filter(obj, matcher(attrs));\n}\n","import isArrayLike from './_isArrayLike.js';\nimport values from './values.js';\nimport cb from './_cb.js';\nimport each from './each.js';\n\n// Return the maximum element (or element-based computation).\nexport default function max(obj, iteratee, context) {\n var result = -Infinity, lastComputed = -Infinity,\n value, computed;\n if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {\n obj = isArrayLike(obj) ? obj : values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value != null && value > result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n each(obj, function(v, index, list) {\n computed = iteratee(v, index, list);\n if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) {\n result = v;\n lastComputed = computed;\n }\n });\n }\n return result;\n}\n","import isArrayLike from './_isArrayLike.js';\nimport values from './values.js';\nimport cb from './_cb.js';\nimport each from './each.js';\n\n// Return the minimum element (or element-based computation).\nexport default function min(obj, iteratee, context) {\n var result = Infinity, lastComputed = Infinity,\n value, computed;\n if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {\n obj = isArrayLike(obj) ? obj : values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value != null && value < result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n each(obj, function(v, index, list) {\n computed = iteratee(v, index, list);\n if (computed < lastComputed || (computed === Infinity && result === Infinity)) {\n result = v;\n lastComputed = computed;\n }\n });\n }\n return result;\n}\n","import isArray from './isArray.js';\nimport { slice } from './_setup.js';\nimport isString from './isString.js';\nimport isArrayLike from './_isArrayLike.js';\nimport map from './map.js';\nimport identity from './identity.js';\nimport values from './values.js';\n\n// Safely create a real, live array from anything iterable.\nvar reStrSymbol = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\nexport default function toArray(obj) {\n if (!obj) return [];\n if (isArray(obj)) return slice.call(obj);\n if (isString(obj)) {\n // Keep surrogate pair characters together.\n return obj.match(reStrSymbol);\n }\n if (isArrayLike(obj)) return map(obj, identity);\n return values(obj);\n}\n","import isArrayLike from './_isArrayLike.js';\nimport values from './values.js';\nimport getLength from './_getLength.js';\nimport random from './random.js';\nimport toArray from './toArray.js';\n\n// Sample **n** random values from a collection using the modern version of the\n// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n// If **n** is not specified, returns a single random element.\n// The internal `guard` argument allows it to work with `_.map`.\nexport default function sample(obj, n, guard) {\n if (n == null || guard) {\n if (!isArrayLike(obj)) obj = values(obj);\n return obj[random(obj.length - 1)];\n }\n var sample = toArray(obj);\n var length = getLength(sample);\n n = Math.max(Math.min(n, length), 0);\n var last = length - 1;\n for (var index = 0; index < n; index++) {\n var rand = random(index, last);\n var temp = sample[index];\n sample[index] = sample[rand];\n sample[rand] = temp;\n }\n return sample.slice(0, n);\n}\n","import sample from './sample.js';\n\n// Shuffle a collection.\nexport default function shuffle(obj) {\n return sample(obj, Infinity);\n}\n","import cb from './_cb.js';\nimport pluck from './pluck.js';\nimport map from './map.js';\n\n// Sort the object's values by a criterion produced by an iteratee.\nexport default function sortBy(obj, iteratee, context) {\n var index = 0;\n iteratee = cb(iteratee, context);\n return pluck(map(obj, function(value, key, list) {\n return {\n value: value,\n index: index++,\n criteria: iteratee(value, key, list)\n };\n }).sort(function(left, right) {\n var a = left.criteria;\n var b = right.criteria;\n if (a !== b) {\n if (a > b || a === void 0) return 1;\n if (a < b || b === void 0) return -1;\n }\n return left.index - right.index;\n }), 'value');\n}\n","import cb from './_cb.js';\nimport each from './each.js';\n\n// An internal function used for aggregate \"group by\" operations.\nexport default function group(behavior, partition) {\n return function(obj, iteratee, context) {\n var result = partition ? [[], []] : {};\n iteratee = cb(iteratee, context);\n each(obj, function(value, index) {\n var key = iteratee(value, index, obj);\n behavior(result, value, key);\n });\n return result;\n };\n}\n","import group from './_group.js';\nimport has from './_has.js';\n\n// Groups the object's values by a criterion. Pass either a string attribute\n// to group by, or a function that returns the criterion.\nexport default group(function(result, value, key) {\n if (has(result, key)) result[key].push(value); else result[key] = [value];\n});\n","import group from './_group.js';\n\n// Indexes the object's values by a criterion, similar to `_.groupBy`, but for\n// when you know that your index values will be unique.\nexport default group(function(result, value, key) {\n result[key] = value;\n});\n","import group from './_group.js';\nimport has from './_has.js';\n\n// Counts instances of an object that group by a certain criterion. Pass\n// either a string attribute to count by, or a function that returns the\n// criterion.\nexport default group(function(result, value, key) {\n if (has(result, key)) result[key]++; else result[key] = 1;\n});\n","import group from './_group.js';\n\n// Split a collection into two arrays: one whose elements all pass the given\n// truth test, and one whose elements all do not pass the truth test.\nexport default group(function(result, value, pass) {\n result[pass ? 0 : 1].push(value);\n}, true);\n","import isArrayLike from './_isArrayLike.js';\nimport keys from './keys.js';\n\n// Return the number of elements in a collection.\nexport default function size(obj) {\n if (obj == null) return 0;\n return isArrayLike(obj) ? obj.length : keys(obj).length;\n}\n","// Internal `_.pick` helper function to determine whether `key` is an enumerable\n// property name of `obj`.\nexport default function keyInObj(value, key, obj) {\n return key in obj;\n}\n","import restArguments from './restArguments.js';\nimport isFunction from './isFunction.js';\nimport optimizeCb from './_optimizeCb.js';\nimport allKeys from './allKeys.js';\nimport keyInObj from './_keyInObj.js';\nimport flatten from './_flatten.js';\n\n// Return a copy of the object only containing the allowed properties.\nexport default restArguments(function(obj, keys) {\n var result = {}, iteratee = keys[0];\n if (obj == null) return result;\n if (isFunction(iteratee)) {\n if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);\n keys = allKeys(obj);\n } else {\n iteratee = keyInObj;\n keys = flatten(keys, false, false);\n obj = Object(obj);\n }\n for (var i = 0, length = keys.length; i < length; i++) {\n var key = keys[i];\n var value = obj[key];\n if (iteratee(value, key, obj)) result[key] = value;\n }\n return result;\n});\n","import restArguments from './restArguments.js';\nimport isFunction from './isFunction.js';\nimport negate from './negate.js';\nimport map from './map.js';\nimport flatten from './_flatten.js';\nimport contains from './contains.js';\nimport pick from './pick.js';\n\n// Return a copy of the object without the disallowed properties.\nexport default restArguments(function(obj, keys) {\n var iteratee = keys[0], context;\n if (isFunction(iteratee)) {\n iteratee = negate(iteratee);\n if (keys.length > 1) context = keys[1];\n } else {\n keys = map(flatten(keys, false, false), String);\n iteratee = function(value, key) {\n return !contains(keys, key);\n };\n }\n return pick(obj, iteratee, context);\n});\n","import { slice } from './_setup.js';\n\n// Returns everything but the last entry of the array. Especially useful on\n// the arguments object. Passing **n** will return all the values in\n// the array, excluding the last N.\nexport default function initial(array, n, guard) {\n return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n}\n","import initial from './initial.js';\n\n// Get the first element of an array. Passing **n** will return the first N\n// values in the array. The **guard** check allows it to work with `_.map`.\nexport default function first(array, n, guard) {\n if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n if (n == null || guard) return array[0];\n return initial(array, array.length - n);\n}\n","import { slice } from './_setup.js';\n\n// Returns everything but the first entry of the `array`. Especially useful on\n// the `arguments` object. Passing an **n** will return the rest N values in the\n// `array`.\nexport default function rest(array, n, guard) {\n return slice.call(array, n == null || guard ? 1 : n);\n}\n","import rest from './rest.js';\n\n// Get the last element of an array. Passing **n** will return the last N\n// values in the array.\nexport default function last(array, n, guard) {\n if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n if (n == null || guard) return array[array.length - 1];\n return rest(array, Math.max(0, array.length - n));\n}\n","import filter from './filter.js';\n\n// Trim out all falsy values from an array.\nexport default function compact(array) {\n return filter(array, Boolean);\n}\n","import _flatten from './_flatten.js';\n\n// Flatten out an array, either recursively (by default), or up to `depth`.\n// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.\nexport default function flatten(array, depth) {\n return _flatten(array, depth, false);\n}\n","import restArguments from './restArguments.js';\nimport flatten from './_flatten.js';\nimport filter from './filter.js';\nimport contains from './contains.js';\n\n// Take the difference between one array and a number of other arrays.\n// Only the elements present in just the first array will remain.\nexport default restArguments(function(array, rest) {\n rest = flatten(rest, true, true);\n return filter(array, function(value){\n return !contains(rest, value);\n });\n});\n","import restArguments from './restArguments.js';\nimport difference from './difference.js';\n\n// Return a version of the array that does not contain the specified value(s).\nexport default restArguments(function(array, otherArrays) {\n return difference(array, otherArrays);\n});\n","import isBoolean from './isBoolean.js';\nimport cb from './_cb.js';\nimport getLength from './_getLength.js';\nimport contains from './contains.js';\n\n// Produce a duplicate-free version of the array. If the array has already\n// been sorted, you have the option of using a faster algorithm.\n// The faster algorithm will not work with an iteratee if the iteratee\n// is not a one-to-one function, so providing an iteratee will disable\n// the faster algorithm.\nexport default function uniq(array, isSorted, iteratee, context) {\n if (!isBoolean(isSorted)) {\n context = iteratee;\n iteratee = isSorted;\n isSorted = false;\n }\n if (iteratee != null) iteratee = cb(iteratee, context);\n var result = [];\n var seen = [];\n for (var i = 0, length = getLength(array); i < length; i++) {\n var value = array[i],\n computed = iteratee ? iteratee(value, i, array) : value;\n if (isSorted && !iteratee) {\n if (!i || seen !== computed) result.push(value);\n seen = computed;\n } else if (iteratee) {\n if (!contains(seen, computed)) {\n seen.push(computed);\n result.push(value);\n }\n } else if (!contains(result, value)) {\n result.push(value);\n }\n }\n return result;\n}\n","import restArguments from './restArguments.js';\nimport uniq from './uniq.js';\nimport flatten from './_flatten.js';\n\n// Produce an array that contains the union: each distinct element from all of\n// the passed-in arrays.\nexport default restArguments(function(arrays) {\n return uniq(flatten(arrays, true, true));\n});\n","import getLength from './_getLength.js';\nimport contains from './contains.js';\n\n// Produce an array that contains every item shared between all the\n// passed-in arrays.\nexport default function intersection(array) {\n var result = [];\n var argsLength = arguments.length;\n for (var i = 0, length = getLength(array); i < length; i++) {\n var item = array[i];\n if (contains(result, item)) continue;\n var j;\n for (j = 1; j < argsLength; j++) {\n if (!contains(arguments[j], item)) break;\n }\n if (j === argsLength) result.push(item);\n }\n return result;\n}\n","import max from './max.js';\nimport getLength from './_getLength.js';\nimport pluck from './pluck.js';\n\n// Complement of zip. Unzip accepts an array of arrays and groups\n// each array's elements on shared indices.\nexport default function unzip(array) {\n var length = (array && max(array, getLength).length) || 0;\n var result = Array(length);\n\n for (var index = 0; index < length; index++) {\n result[index] = pluck(array, index);\n }\n return result;\n}\n","import restArguments from './restArguments.js';\nimport unzip from './unzip.js';\n\n// Zip together multiple lists into a single array -- elements that share\n// an index go together.\nexport default restArguments(unzip);\n","import getLength from './_getLength.js';\n\n// Converts lists into objects. Pass either a single array of `[key, value]`\n// pairs, or two parallel arrays of the same length -- one of keys, and one of\n// the corresponding values. Passing by pairs is the reverse of `_.pairs`.\nexport default function object(list, values) {\n var result = {};\n for (var i = 0, length = getLength(list); i < length; i++) {\n if (values) {\n result[list[i]] = values[i];\n } else {\n result[list[i][0]] = list[i][1];\n }\n }\n return result;\n}\n","// Generate an integer Array containing an arithmetic progression. A port of\n// the native Python `range()` function. See\n// [the Python documentation](https://docs.python.org/library/functions.html#range).\nexport default function range(start, stop, step) {\n if (stop == null) {\n stop = start || 0;\n start = 0;\n }\n if (!step) {\n step = stop < start ? -1 : 1;\n }\n\n var length = Math.max(Math.ceil((stop - start) / step), 0);\n var range = Array(length);\n\n for (var idx = 0; idx < length; idx++, start += step) {\n range[idx] = start;\n }\n\n return range;\n}\n","import { slice } from './_setup.js';\n\n// Chunk a single array into multiple arrays, each containing `count` or fewer\n// items.\nexport default function chunk(array, count) {\n if (count == null || count < 1) return [];\n var result = [];\n var i = 0, length = array.length;\n while (i < length) {\n result.push(slice.call(array, i, i += count));\n }\n return result;\n}\n","import _ from './underscore.js';\n\n// Helper function to continue chaining intermediate results.\nexport default function chainResult(instance, obj) {\n return instance._chain ? _(obj).chain() : obj;\n}\n","import _ from './underscore.js';\nimport each from './each.js';\nimport functions from './functions.js';\nimport { push } from './_setup.js';\nimport chainResult from './_chainResult.js';\n\n// Add your own custom functions to the Underscore object.\nexport default function mixin(obj) {\n each(functions(obj), function(name) {\n var func = _[name] = obj[name];\n _.prototype[name] = function() {\n var args = [this._wrapped];\n push.apply(args, arguments);\n return chainResult(this, func.apply(_, args));\n };\n });\n return _;\n}\n","import _ from './underscore.js';\nimport each from './each.js';\nimport { ArrayProto } from './_setup.js';\nimport chainResult from './_chainResult.js';\n\n// Add all mutator `Array` functions to the wrapper.\neach(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n var method = ArrayProto[name];\n _.prototype[name] = function() {\n var obj = this._wrapped;\n if (obj != null) {\n method.apply(obj, arguments);\n if ((name === 'shift' || name === 'splice') && obj.length === 0) {\n delete obj[0];\n }\n }\n return chainResult(this, obj);\n };\n});\n\n// Add all accessor `Array` functions to the wrapper.\neach(['concat', 'join', 'slice'], function(name) {\n var method = ArrayProto[name];\n _.prototype[name] = function() {\n var obj = this._wrapped;\n if (obj != null) obj = method.apply(obj, arguments);\n return chainResult(this, obj);\n };\n});\n\nexport default _;\n","// Default Export\n// ==============\n// In this module, we mix our bundled exports into the `_` object and export\n// the result. This is analogous to setting `module.exports = _` in CommonJS.\n// Hence, this module is also the entry point of our UMD bundle and the package\n// entry point for CommonJS and AMD users. In other words, this is (the source\n// of) the module you are interfacing with when you do any of the following:\n//\n// ```js\n// // CommonJS\n// var _ = require('underscore');\n//\n// // AMD\n// define(['underscore'], function(_) {...});\n//\n// // UMD in the browser\n// // _ is available as a global variable\n// ```\nimport * as allExports from './index.js';\nimport { mixin } from './index.js';\n\n// Add all of the Underscore functions to the wrapper object.\nvar _ = mixin(allExports);\n// Legacy Node.js API.\n_._ = _;\n// Export the Underscore API.\nexport default _;\n","import*as e from\"three\";import{Vector3 as t,MathUtils as r,Float32BufferAttribute as n,InstancedInterleavedBuffer as i,InterleavedBufferAttribute as l,BufferAttribute as a,Matrix4 as s,BufferGeometry as u,Uint32BufferAttribute as d,Uint16BufferAttribute as p,FrontSide as o,Box3 as c,Box3Helper as v,Ray as f,EllipseCurve as S,UniformsUtils as h,ShaderLib as V,MeshStandardMaterial as m,MeshBasicMaterial as z,MeshDepthMaterial as X,MeshNormalMaterial as b,PointsMaterial as q,TextureLoader as K,PMREMGenerator as U,Texture as T,Color as x,DataTexture as P,NearestFilter as W,Vector2 as y,DoubleSide as R,AlwaysStencilFunc as M,ReplaceStencilOp as N,Sphere as O,Mesh as L,RGBAFormat as Z,FloatType as k,Triangle as G,BackSide as j,Euler as I,Quaternion as E,DynamicDrawUsage as w,Vector4 as J,Points as Y,PlaneGeometry as F,Raycaster as D,ShaderMaterial as g,NoBlending as C,CustomBlending as H,DstColorFactor as Q,ZeroFactor as A,AddEquation as B,DstAlphaFactor as _,WebGLRenderTarget as $,RGBADepthPacking as ee,OneFactor as te,ReverseSubtractEquation as re,RedFormat as ne,RepeatWrapping as ie,EqualStencilFunc as le,Line3 as ae,Plane as se,LinearFilter as ue,OrthographicCamera as de,BasicDepthPacking as pe,CameraHelper as oe,MaxEquation as ce,Group as ve,CircleGeometry as fe,Object3D as Se,PerspectiveCamera as he,Scene as Ve,WebGLRenderer as me,sRGBEncoding as ze,ACESFilmicToneMapping as Xe,VSMShadowMap as be,DirectionalLightHelper as qe,DirectionalLight as Ke,Spherical as Ue}from\"three\";export{Box3,Vector3}from\"three\";import Te from\"three/examples/jsm/libs/stats.module.js\";import xe from\"@speckle/objectloader\";import{generateUUID as Pe}from\"three/src/math/MathUtils\";import We from\"js-logger\";import ye from\"camera-controls\";import{KeyboardKeyHold as Re,HOLD_EVENT_TYPE as Me}from\"hold-event\";import{MeshBVH as Ne,ExtendedTriangle as Oe,CENTER as Le,MeshBVHVisualizer as Ze}from\"three-mesh-bvh\";import{LineMaterial as ke}from\"three/examples/jsm/lines/LineMaterial.js\";import Ge from\"string-to-color\";import{EXRLoader as je}from\"three/examples/jsm/loaders/EXRLoader.js\";import{RGBELoader as Ie}from\"three/examples/jsm/loaders/RGBELoader.js\";import{FontLoader as Ee}from\"three/examples/jsm/loaders/FontLoader.js\";import{createTextDerivedMaterial as we,Text as Je}from\"troika-three-text\";import{LineSegments2 as Ye}from\"three/examples/jsm/lines/LineSegments2.js\";import{LineSegmentsGeometry as Fe}from\"three/examples/jsm/lines/LineSegmentsGeometry.js\";import{EffectComposer as De}from\"three/examples/jsm/postprocessing/EffectComposer.js\";import{Pass as ge,FullScreenQuad as Ce}from\"three/examples/jsm/postprocessing/Pass.js\";import{CopyShader as He}from\"three/examples/jsm/shaders/CopyShader.js\";import{SAOShader as Qe}from\"three/examples/jsm/shaders/SAOShader.js\";import{DepthLimitedBlurShader as Ae,BlurShaderUtils as Be}from\"three/examples/jsm/shaders/DepthLimitedBlurShader.js\";import{SimplexNoise as _e}from\"three/examples/jsm//math/SimplexNoise.js\";import{TransformControls as $e}from\"three/examples/jsm/controls/TransformControls.js\";import et from\"tree-model\";import tt from\"underscore\";var rt;!function(e){e.TEXTURE_8BPP=\"png\",e.TEXTURE_HDR=\"hdr\",e.TEXTURE_EXR=\"exr\",e.FONT_JSON=\"font-json\"}(rt||(rt={}));const nt={showStats:!1,verbose:!1,keepGeometryData:!1,environmentSrc:{src:\"data:image/png;base64,di8xAQIAAABFeGlmOkltYWdlSGlzdG9yeQBzdHJpbmcAvAAAAG9paW90b29sICJYOlxccGhjbG91ZFxcUG9seSBIYXZlbiBBc3NldHNcXEhEUklzXFxoZHJcXDFrXFxwaG90b19zdHVkaW9fMDFfMWsuaGRyIiAtLWNvbXByZXNzaW9uIHBpeiAtLW5vLWNsb2JiZXIgLW8gIlg6XFxwaGNsb3VkXFxQb2x5IEhhdmVuIEFzc2V0c1xcSERSSXNcXGV4clxcMWtcXHBob3RvX3N0dWRpb18wMV8xay5leHIiT3JpZW50YXRpb24AaW50AAQAAAABAAAAU29mdHdhcmUAc3RyaW5nANEAAABPcGVuSW1hZ2VJTyAyLjEuMTYgOiBvaWlvdG9vbCAiWDpcXHBoY2xvdWRcXFBvbHkgSGF2ZW4gQXNzZXRzXFxIRFJJc1xcaGRyXFwxa1xccGhvdG9fc3R1ZGlvXzAxXzFrLmhkciIgLS1jb21wcmVzc2lvbiBwaXogLS1uby1jbG9iYmVyIC1vICJYOlxccGhjbG91ZFxcUG9seSBIYXZlbiBBc3NldHNcXEhEUklzXFxleHJcXDFrXFxwaG90b19zdHVkaW9fMDFfMWsuZXhyImNhcERhdGUAc3RyaW5nABMAAAAyMDIxOjA1OjA4IDE0OjU3OjU5Y2hhbm5lbHMAY2hsaXN0ADcAAABCAAIAAAAAAAAAAQAAAAEAAABHAAIAAAAAAAAAAQAAAAEAAABSAAIAAAAAAAAAAQAAAAEAAAAAY29tcHJlc3Npb24AY29tcHJlc3Npb24AAQAAAARkYXRhV2luZG93AGJveDJpABAAAAAAAAAAAAAAAP8DAAD/AQAAZGlzcGxheVdpbmRvdwBib3gyaQAQAAAAAAAAAAAAAAD/AwAA/wEAAGxpbmVPcmRlcgBsaW5lT3JkZXIAAQAAAABwaXhlbEFzcGVjdFJhdGlvAGZsb2F0AAQAAAAAAIA/c2NyZWVuV2luZG93Q2VudGVyAHYyZgAIAAAAAAAAAAAAAABzY3JlZW5XaW5kb3dXaWR0aABmbG9hdAAEAAAAAACAPwC1AwAAAAAAAFKzAAAAAAAA5mMBAAAAAADJMQIAAAAAAG8VAwAAAAAAASkEAAAAAAA6PQUAAAAAAHVYBgAAAAAAEWMHAAAAAADkaQgAAAAAAFqxCQAAAAAAugULAAAAAAA8hwwAAAAAAAD6DQAAAAAAYnsPAAAAAACv8hAAAAAAAAAAAACVrwAA0gfdBwjAEQZDNPrv////f4GvAAAAAAAAAAABAOgBAAAmbAUAAAAAAAQxRyTDkkEkk0UU000/E+0wE0wEEUUUUUEE0EEEEEUED0U/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////STSAS9SSQQRROMKIGECSgAZ3nn7/bz3v3/v8ADO/b////29/7fgAZ/9/n/t+Z73/n4AAnm/9/t7bf+3v/YAG979n/7bf7b//eAB3//P9/v2/9vf4AHfe/9vP/f5vb/8ADvt5/ttj/P3mf/+AB9ttvf+eb3vzf/7ABD/7//Mz/b23v/wAQ7//e37b9723/4AI2/223v9m/2//bwAHfb3/v/2ee3//4ADu8zb///e/P979gAlbfntv9/v//beeAC/ntvf/+b2/e9t4AL+/b/z/eb2/M/3gAu3s/Nvbe//fvz9gAv7e/b22///37/ABd/+zz/fm9729/mACffnvftv/fvPN/4AJ9/ts///f/57ePABP78/b/f+zz9tv8AEv//vz3nv35737AAd9+979v9v3+ZnvABH//7f///v//eACP3+3+/f/t/+f4AH//f57Y8/ZtszP/wAN//7b3+G/8//P8ADbe//b/x/v95+3gAde3vf7//x+//2wAN57Y9+z/89/+234PAZgNgzBttmMb9/n7PzzeGZ/54bDGHmGeZnmZs8PDw88N5/m9jP//xjPebzH7222Y22/ez2b//PbwZg2DMGweANgPAeDYPB4PGx4PBhg8BmDYDYDwGwZgPAeA8AZgDMAHmAHwAfgA9gB8AbAHg2PGbMHg8Hg2MweDYPGYNg8bB4DYMb8f/mNsx48ePHjx4PB4DDB4DwZgPAeDYDxse9v95tvHg8HgPBttmzBmA8AZgB2AMYAxgPAGwHgDwB4AzAD4A2ANgMwB4Ng8Hj283vZjx4MwbAeDYzGwGYMwYx4PB48Hv/zwzPPPYbNmPB42Pe2w2Y94zBhg8B4DwHjbbxmNtsezMz2eeGw8N4YGzDPze9mPZ/5s8PNhmeeb88z/3sx4PAbAeA8AbAeAzBsbBseMx48GYPBmA2Dxt/mZ55mHgbDzYeBs8PPP97NmPY2H/s2Y9mA8B4DYPGx4zB7b37zf73vHjY8eMweA8B4DMAeA2AzAHgDwHgPAZgDYNgzAGwHgzG3tmwzDYHngbDzZh4e/b8bbHjx4Ng8B4DMAeAPBsB4DwHgPAeDweDMAZgDwB4A8B4DwGwGwB4DwA5gDYA8APgB2A8BsB4297Nv/88DYHgeAeB4HgbA8A2AZhmZmM/zeZ/s83jx4MwbAeDweDx48ZjweDxmDMGweNjDB4PB4948ZgzAeA8B4DweDweD9s2/Pze9mDweMx48eDN728MZg/Zt+f5m3h+ze/DbM8bPAe2A8PBn4PNjxn4Yxtn7Z5v/M/N5nvD9sYeMxm942eP9t/72eP/Z+/bNtnjz2/M8w8/f/n5s9n/v8Htg34294M9mx4bB54zBm95/mx4fs2bf/+bf5v/PeHtgbf5sb8Hng94297x7/8BsPB7wGzYD3veDYHgPPH+3482P8f723vee88f4A3sAe8Gbwb2A82A/YAz2A94D3szY/Y34Nng973s9j/8ebPH+DbP97D/fsPef/5mx7MG9vf/tng2eD3tm2bxsDfvebH+NhjAHvBs2DY2A34PeA2zHvAbeA8PAHng/YPNgPeA22zbH+P8H+N+2HmezZseeNmwfsHng97/8fvbYePNsx7z9nvNg2Pe9s/2ftg88H+D/G37Nt/+Z/7PD/P3v8zY9+fnnnvN+bPPPbP8/zY//3/7/Zv35/s9tmeeP89/7HnvZ+fvzPz29tn+2f/h5vfnntmezxs294/83/s94bN+9sP97zY3sHjMeNv2bPM/P2b/f//7PHnnh+z8z/N7bee8M/Z4z8Ns2f+YNt7YYMwZjGPB7G94zHgzG8Z+eY9se/xmN/5n+2fvw3mMDw8zwx4MMHsxmNjMGYMY3tv/Zs23jDG9vPP82w2YPB+MNgZh4eHhhhsDwPAzDYHgbAww8DwMwDMDwDMzfjeMx5sDwDMDYbP2GZh+eAbDMzMwz/3gzBjB4zB49j8MYHgHh5sYbe8eYbzwzMe9+2GDDezZgzAeAzHgzB4NmMDZmDDAB5gDGNjbbDGY8e9+/HjYM9veDYMwbG34/Zjf55vGweN7PPe28eDx7N4DMZjwZgDDBg/2HmZmZ+wxmzHsZ7DB4xt/+eY9tj2z/xmDweA2MGwx7xmDN5s/zbMBmDze9mzM888PD/9mMwGYMY8bexsweM2372eZs3tvHjNmNgzAD4APYMGN5vHjx7xt48Yxm2eeZmZs2fhjMG2zYYZmbGY8Z7MzMz948e3555555s/PPfhsPZjx4zfv29nn5g2N4w8DwzD2GMwbBseYw8z82eb882bzGYPebA2BsDwArAMMDzP88Z/v2eeHgYwAawAuB4HgeAeBnnj/2w2AZgBWBhmH5+Z5nhts35+bMzPZjPeGwDGAFwDwM89nmw/DBmAxgzY3tmbfns/PPNmZ554GZmwxm3mGMw89mzD972/88M/bDYeBh//n+835jZv8zbP8343mbeG37efn//t73+/z9jzP95n7f/m2/2eZh+3+Ht+x+8/z/e//M9n+Hth+bZ5sef4fs28z9tsPP9sP/bw9+bZ7efhtjP8M3t7D37bN5jewz/bGH4bfh7wN+bGbzYe35+xsP9me2NtvMzNv/bZtm2Y22bMx5ntjB+2bYPYzPYA/94YD/34/Z/j/2Zj28ze2b9tn7Y2/e3t79v/9gx5ntjee/e8D/Bts/wB7Zt4PN5vAbfn4DftjYDM97YA2Zm3gB/xvwA7/Y2AHxjb8AbzxvAHs9jYAd+z8Ae954P9+wbe/YD3m8wA7ef4A/Mf4P/8Y8/fg888bAebDbwf434Mzw94N/t4D/DbwH/szAH/tsAe2ZmY/b/Bv2Zsf4PeD9h+x5mNv/bZ7bZv23vbHv/f/7/3ntvM/37//9t7YZ+Nm83nm2z9nmb3mzfvN+DNsNvfsA28eZgbeG3gb2zbA/z3gb8/GH/nsNveeB+95m2PeZm3/nvb8PGzeYZnmMGz9m8z9n7DZ4/ZvM2N5/7f7ZjMxhmAZgeZh4H4f+GwPMxm2bDP3+Z+9jNmf+AYwDDwzZ5sPMP/Z7/xveeM2Hn7zD8Mbew/MzYbDMDzN+w2Znh/mMM2b/NgeHhmZveb8wYGwM8/9hts2G8bZgzb8MYHgeHsweDMY/Z+M3v82AFYZgZmzMe2zH4w8A2YBg8bNns3mDAMwxgbAzAMYBhgGwzNm88PGzHtmYwwHg8ZvezPAxgGHgGzZhjA2HnmYzMZh+wNjDebMeeZmzM8NgGwzN5vAZgxtnvG/zzze8bY29mYwwY8GZvNmYDMGMeN7fs2/2YDMGN4PBtvMGYMwZjbeG2357N4DDAYNm2DMB49jP8YGDwGYMbPMbHjMbBsbBmAzBgzYzAe2M2MGGDe8/wMGYA8B4Px57xtjDB4PBt7eYPBtv/AN4YM2/PeDNtmMweNjMGGAzAbAbH7HjwbHj2P83gzBvf/m9mbM/GYDMBvZ5nhjxnv3jDBhgxjMB42ewxsGYDxseYMDYGHn7bN7eex4zbGbG8HsZsDZ78xhjZnm8ZgzBsYwxmGMx5sM8Me3vfvBhg8G97Zj2bxs2GGMxvbbeeMPDN/m8MYw2Gfje/GGDf+3m8N5+GzPDe3tm2ewMHg3s2H/njA2Yfmww/eZ4wDBgBcAK8Db2Hn+37MBmNvbNmHnjPMYeGz9vZvHm2ZvfhsbPH4xmPeG2bbGwz2zf+G8x5sNnswP8DxmAb8PDwzHhjMw82GbGB48Nh4e2bDzYbDN4b8P8AzPNnh/h7M8PDZsDzYeHm22/e3795vf+/2837Hm/Z+ZjB5vMbDMxsZvMbDz/8P8Ns9h+2Pf/55jYwZhmb8Mzbz8w3s2H7DNs83s8N7fjDGP2eGN4MzGZ+G2xj/YzA2zBtsA3t+wDY9+ez37P82Ns/bfn4bZjYee23+ew8ez3/n7/Z42Hv/P3vf73jzY9vPb/eHt/s37bxjH5tv2Ht7Gzx4z2ZjZse2/2w/xsbA8e3/jw8G/Zj3h43hmw94zNvDw37Z7PYeD3g2eP9/v9/t7B/gPbGbbx4NnjzYPGbe3jeb/b/Y82PbHv88Z+/xsMxnsb8Hng/x+x7Nt482/29vD8237Hvz22ezb8e82bZjGbHj37zbe/xmMZ/hsft7/z/MGwPfmB5s/PwNmbHmbDMHnjz3hszD8zbw/MMYbAM2Yf4B+w9s35mBtvMDYHmxsMPbf7PbGYfmBsDGB79/jbM8zZ7Yf/+zAzeYw82/wNvbeMweDxg/G2M3m/GGMD8wZjbzGBsDw2zxnmwNmBtthjANh4BjACsAwzM8PD8M2ftjNn7DzYBjAww2HhsA2Zs23t+9tt4eGZ4Y89/4eeeGMDM2YGNmxmxh4bD829vbP97ZsDDDzGwMb972bbDbeNvZjPYz9m2w/f5+e/DN7bfjAwbH72e94xmPDzBjNjAwB5g2Hj948BmANjGDMG8eYbMxnmDe8/3mPDBhmz3jD2GYzP9mwMzMbN5j2M8DZnmw283jN5jDGw2Y82ZsDGM2YbMzPPDMwMGYDzGGYMMB49v94YHmYGwAuB4eAeYfvN5vzBm2/zw2GZ5sz2bD2GN+ZtmzDPNgeB4HnjAMGD3njw8/YwM2fgYwzN542BjGfhtvGYP295sPDNm82bzH4M/3s2Y8/P2fnsxmDZjDD//x5vMNmAzGAzbDeZ7zNnhvzBhmZmMDeGNvH+zZjefvew3sx72ZjANgGBm8MeezHsYwwB4MHmxnh5tmGDAwN7eYzB7GGeZ5jDMDYGw8zDeYeGfh5mH+eGMM/M2bMHsb3j2M/DB7YMwGx4DPAGHvGbbMYY8MBgYG/MGGGPMbxmbDx5t+/eMA8wMbDbDeeYbA8GGfmMDwwwMYZ+Zs8e2fvzAZjYzGw3m/xs94/BmGM3jzxmMHhjDAHjBhvP/f5nnvM3ns8eGe3h/+3sf+wDDb379veB/sbzf+GYAV7M3n/7MD/bG2ee/A23+bfjx4Ge9+f+2zeZtsM/GNvb2e8zeex7eZ+3+9+b2P/M/G822wzb88GY/9+/z3/sb8z342357G228H+Mbw8b82P35t49/g/97zY35g9tvP9mZtvM3sPe3sZ42eM/22x7b/3+fg/fv9+8YDP89j/MPYD3t/7eewZ+22Gbbx4Df4eNmHn7B72/f/7Ae3m/978Ab979v28Abb/M/B5mMB+22/9vwGPP897/wG23542GY/AHvPb3n/gN+237efgD/N5hvfngDY3nt7b3gDPZjeM/P8BjHv/f7eA//ebb/YA2/2z8zZmDHs83vP2wBt7e/z/MBjf/j/PMwbZ7/2exsHnsY9tn7GAz2x+fv/Hm8w9tm34Dz/bDPb/Afvx/5ttgBz/3m8zxjADhn/jwM3mMYAwzf5t4zD2A3nt7PHhm9nnn+/b//2ftt/tm8z29sbz342zMb2bY9jfv3+xn/tjft/+2Zje972xnszwb8Yx4wYeHmZ5ngMw8ZmzzGN7AZ/s2DDGB4GMMDD8xns8Nm8/888/NmGDMMPYwPMDf+MNgYYGwNgBTDDA2GH/m2ePDGwzBs/YZjxtmN5seH4zG8NvDeMwbGxmDwezGMZ7GGxvf5jMPGw8YeZn+/Zv/eD2z8ze8z957PYbezzw2BmzG2/MMGYxtmY/Bjx49tmD2MBmMYfhgA8DBgMP8zw2A9mGYPAwfjDPMz2/B54NgY3hg3+2Hthv8bPN/7bMGN54zx+eMNvGMDAYzGewwbAeAPG2YNt4Y8Btgz3jDBjY8zHh7zwYGH5mwxmAwwGDHjwYGAMbGY2YAwDBgMBmDf5jbwxh+e8/YGN4NgYwYwwGY2/GMMY2zzbA8eY3nsb88ezZjYwxvAGGGAzG2zDMzx+88YwMB4DY22/MZjbG9htjxs2zHjY8eMxjzAfjZjf7M2GPZtjMG2eDPbM/w2YxtjMGYDNg8xmDYwweDYPGxmAw2DPHtg97NjHj2YM8eG9tmMzZsze3hjwYxmMeYMweDwA5gweGDMweYxmewYYMfmMYBg2wMBsGYNjAwYxhgDwGwHgMMAbAeANj2GAMMAeAwbAMAHmAxgMwe8BgGAHwBjBmAD2DYxs2zDZjYxgMxjM22DAPDAx/v2GMMDxh4Yw3gYxmwPDw8zfjz3hm2GDwfv3gbMw2MA2M2GMMwArwzMbNme94YwxmAx5jftmwzH7Nhm882eMwPzANjYeeGzYG2w/fmz2YHgbDzZ/hvfjef5gMMDPwx+NgezBs288DM35jGZsD3g89j/w2zY/9ve83vD/88NjZ73jYfj/zMb95tmPGMGe8zMMH7fgxtmZs2NvfsbeP2Dx7f57ef5tmzbBmebf4349vMb/YzDYMZnhjGPA2DxsZhsZjYzNjx/tjNsbMxsbGP2xtnsHgP9sbGbGzbHtjxv823mbzG8Y37BmNs9vBm3v/Htjz/A2Nh7Gee282DNsH7Bn4NvfjeGxmNjbY97fth7x7ewb2N5swMZ72z9szwz2bZ7f/tvZ/v35j/Dbz3jHvZgZgzN+eeMPHtvDYzGx+2Hgx4Pwze28zbGPNm2/2z22Yb2/e8Hmx7YPNs/Bsez3549seGYNsxsGf57D2/eBjePMz2eNmDwYw2D/GG9szG8PZ49t/jYeNmGDHmDf7H+9seP9/72/Y2Mx7GA34A88BtmA22AP8APjYAw9gNvAbZgB9jADhvAe2A9sBm8Bs8AH54AfBhgDGHgNjDBjGwGbYAfDYwDG2YbGPzwZm8/PP882e2fh7xm2Zt4MZt+2wAuPbGbGDxn7xvMYw8bDA22bMAweb/b2b9t5+zzZnsxgGBnjM8AzDA/zYw2BsMAKYNtmGww/ZsMxgHgZhgzAwzDYZhgb37YZgwwPYYf5mDP8x4Y8wYGeGGMM8w82GbYGMDACgYwMDezDMZ794/3/h42ZsZthjzBmMeGxvGbGDNjYPAzGeGAbBgZmYGYPBmMBjGGYHmf54ZhgP9vzbACsbDGwYYxjPBh55jPGYebPDDxj8xjYBjBjMYzYzGPDYNhmPPZ4ePw/zwYYbbPxsDN+2YM2M2wNjDwZgN+DYzB7x7GwMYze2BsZ5mMMY8wGYMGwMAfjAz8bZmfsNg2AeAwDMDAYYGGwz37Nns8Df4beDMw/MM8MHgNt4eMA8zM9+2M34YMGYGZjwY/YYMBjPzeG2x4AVgNhsx4M2NjYex7/A/NhhtmB+bAPGf4M9mMzeDP/YYzBg2GNjMHgzYDYGDNtm2PZjx4N5sYzNs2weZ7NmGNs3j9j835jee89nmHjMzYZmGHntmGDDG89h/nm2ZjPNs8GzYbHv3sxnmfjDMwzAwxnh+bZ5hjDGPMZv/DYzNh7GGN48De2GMMwMDM2GwZhg2Mxm2294/MftsDzwZm8NgzNnthsHnmefnjYeAw8M2B4De88BgYPHgwxhsG82Bhnsb2ebB4fjbGHjMZgwxjGZj82H+Y2Bhg/w2Y2NmbMxv28BsePB/m8xt/n/h4/GB4Nn4GYZsDD8Z+w2ezMYfvbe3g/YbzbeAezbeB7PYbA9vPYHtmPzNgwz2YYbMMzNvMeYz9mPbz2e282zf4GPMefttnj9sYzPZ4xjZt4M8bG9n4z35t79//tvZ5t+Bt7/2NjN5jYwb//Ae2e8B789gDzzZhgN5m3gP/bYA/Z7YDzH+wZ+z2D2wPzH7Db35m2NhtmPMbf+MHv/MYxs8zBvHmeP228GMze9vbPxtjzNjNvPYPf54Pzz8f4M8eHjZtszbbbPZ/jz/2PYPzMefje349s2Zjbbw2Y3jY/9+xs3vft72xt5n4M2zD8xs9+befm234xmbYx+3vzZ7MbbP222Ztt7/f//vHhntn5njGee3/mPP3sMD2xth+bfjzMY2Z7e83+bM9t48w9jGe/Z79m/3nv8/ez89+b/2Zs/3s9hvNszfs3mBv8Yzwfm95th578zbzbee2bYbZmN5jPH7DP8bw37f+8P9/5tg9vPYwzf+PzMbMG3/4N/sMwZ/m8G3s9g37PwH7H+D/PbGeYxtjNv8xv8G8Y/f/7P/PYf5+Nn/7ezN5jbeB4AzDPzzxmYYHgZtmN7zM/eN4zM2zBh7DHs2AYBgeGMM2ee9h+zew2ee9vNjMeGGDAw8GYb82zNgzA2eA8AwGYDHjGGNsxjw2BsHjP2BsMAK2ZngPGM2z2w23+Z4zM2GezY2GPPAP2BjwZjHs2bYYwMYxmMDY3jDbGzGDDBm/2wHve9hgDAwGAPDYPxhs/GbYwweMweANsY9mPB+bDewbACgzMBgzBhgMeBsxmM3+wNg8AwYY2D37B+z2GMHnsMMwYwPYe8PM2bYw2MM8AxgDwN48Hv3/m/Mz2ZgGAx4Y2MDe37MwYwNtjZ+e83s9+9/gGxj/MDHhj8PA2G8DD2/ZjBve2GwwMxsN+M8MDAx5t+YzxsYY9hsBmzAMBgz/PYbDGAHYbB+wbMzzMGGBths88MH+e8PMbN7Z7DYYZgG83hjwzzBhsYPeGPDwGbPGbYYGYNhsGMzNh4x7GMxmMGw/zG97MwzB4zAYGwB5thsM/B78Pbzz/YY8Zj8YBmefswNjMYGBsZhvA/M8MeYeMDMYGMzPzMGZmH5mzNngYMAw2GbMBhgBTzwMYYGw8GGMMwx4ZsPDDD/Azxhsww2GYMz8zHgbD37PbGMxhh+MM8e/Dw82ZsD/GMxgwNszB+2DAeM82eDbDYGMYPHtsMeD2PBs3mA8MYPAxj3h+DDMHmYzwNgZnswDwwwwwzwwebMDe2wfsNtjGBmDzDZ/48eGzHm89j9vzDGNmZtvMNt5mwx5jzHjebZthvDDx4Zmz23gbGz2x+MP9vMbZhtszHvYw3v3jxs/w2DMDGPDMbGG2AbBt48G3s3m2ZvMYZjN7MMxmw8HmzPe3gfmPbN+be2zP8Gx5488G8MZ7Z+2/PY28bfmbNj83vGeGeGH/mZ/v8zGZts3/mfhj95s9mNjbDebDwNn7PGewz28DzZsNhjNt+bA22DDeG//x4fsNmw2B7Gwzex5sGMzZveH734bxhv/3v9s3j8zb/zbPDw3jNjxnsZ5mDz37zf+HtvGbDfj/Y2AYYPMxm2PB43+8N7bYPDZ4xmbw3+wzPxnvNhm9jZmGDZvDNmZsNnvDNj2fsbeH+DNs9mHh4bZ7M8H/+Zn542HsN7Yez3n4YPNv9n/nhs/Pe83njYf4BtmAfmB5sAzeG3mMNh5v/3n+x4DZvGN+x+N+3vM94w9n/vNjN5nnm/DYPA2MwPDBmw8MYDw95j8DYMZnvM8DzMN5gbZgfmGNhgY3n+ZjAYbbDNgz8NsDzP/PGe2Px4GDBmeDewYGZg8YwHm3jPDN+e2/Zs2P2HvD89me89s28MP8Z4zPbzx7PYeGzwwDHvG2B4NmY8A/YZjM2eNvBnnmBgYwDPDzDZhm/MzeM8DBm3hmNng29+97zBnmPGDbBs/MMbMGbYYz/9jwweYMPMDGbGGN543thgzzDAYYBhvA2NhjGYZtmfjDPYYZjAwwMHgGZt+GAwMMwwzb829hjZm88Nmw9gYDDe2GGbM2fsD9jDAwZmDBsYMw37A8PMMwxjGMwYeeBswfgZgGYHgGeebHjeMZ7DN4GGGYwzDGGHmY8x5gzMMPDG9t+D2xszMDYw2YGY89+2z882BgeGM8w/YxmDxmMzbMDGHm8wz35hmYPMPMBmAYZmb8/PNh48x7MZn7D9jNhmGZjeH5mPPAYYZ7MwBhngb83/gGDBmZgYwGHnnvzMGYBh4YBhjYexvBh+GbDAw372G9hsb88MwwY/DP2ZjAPMeH+zDA2YwwMYGeBjGzGeH7DGGZs8DZ+MzDPMMZ5h+Bs8efnh7zwArB49nh4GYbDwwGAYGeYZ5sDDz88/PHmMzM8zMD2ew2DM/Dft7wzbD2HsxnszMbPGxjMYeMbG3gx+NgwweDB5hh5s2N48BsYGAx4eGeeNgeGwMDDAD4e/DwzDZgbfj8YZsZsMNjw8DGPDZs2Z4wNgzA2zMz82f7DHjGPzZh+GMGMNsYYMwb/wf+8Db/Aw9jbMBmZhhgeMw3gxsH+eGBg2BmPPGAZhjAMwzDGH+N5jeMALh+MbMft+w28b/G8zYAEwzf+f/4f+8Ns8eG2Btt+2/YeMD23jfn5tmNje2/Nj8M9/vw97bPbY8ef+zbGe/22Pb8Pzb9+e3mzbbzfv97eZ5m2bPb2349vBt42PeN+2fvZ4Gew22De/2zYz2/Z7e/9+AzbzP29j8/2Mbe/MzB5v/Y8zzN7NvNjbZ+/bf/5hmDfsz2z2343vD9t/5h73+xs28wBjbbNs/M/DGD8ft7eNgD95mbz/Yw2/e3jfswA73szeP378DN5n7/GA/bf7PeMb2bzP8H5gwZs9//5sb8NvN7xvwf+28ee2bz//8ebwG/3t5+2f5sZ+ezewBnvbNntn+95veY/8B+/w/D95sebfvH/sB/5mez/Y88zb897eAHbb9+GZvw/bMe/b/AD72/2Z7PGbe8eZ+3gDM/P2/M8b2b8/Z42YAz/PG/f4eNvZn79sYA8z3s//b/Nns9h78bNtmZjMPHmN7PPNm9sx5h7ZsbG94Gb2zNsz3mP/z9/5hg3tv//zwzbZv9jHv9vMY88fm3mMMA8GBgeGHmxgPNgw2eGzDN54GHjBmBgYYYGBhgGwMB4ZgYB4GDAwDwzH54H7APA8wAuGGMPDGGzGZseeBm8DDDb3ge8ZhsDGGxvGDw2bPxmDN7BsNgMzHs83sDM3+wNm3jPZ7bD8DAYH7e22Yzxj3/vDY8ALngwzMBmbDeNgzGzG8YzMYeeYPAeAwYwYwzBjf4NngbHgeYMGw8NmDD8zYZvGw2Y2wxgGDBjAPx7Z+2wbxsx4Yx+GYAcM2w3h7wGHvMBgYDA/8YGfhs8bDDDBhsMzGz8ebAwww/GNhsZtmxjeZ7ebxjZmzDPzBnvGGbHhv/x72Ntm3gYwwYYx+MYDMHg2AzZjDGeb94f4BvBvHvwZ42YxjZ4zGYwwbYGGDAMAKAzxh4YeZ5+BgBzGeH+DGwZgw2YxgbY8MeNjMeAwDGNgw2zYPBvGbMGDG97PBse/2e8NhgwBg3/+w2YNtsxsGwf/7GGD9jYwwfswxsx73+bx7Y2z/MYGN7wwwwYGxnv9gwwYYBs28AZ4GBt5mPbDBhjMGDB4MwYxvDGMGMBsGDBjG2wZjA9jwBjAHgDYDGDN4MGP3mzbzYYMxjA8wDGMHjMY2DGBgMYMMHjYwwZjHs2AzGx4MYwGMMYGDwYHgPDHjH+GMZnmY2bZ4zBtgPAMY89seAFMGH4fg/PzA2B4x+MwMw22DZg2MZ+eb22ePHhvbMeBvMM34fhnj82e37B494zYDM35+bA9hnh4Ybw9mG2wzMwzeGzMNvMGHhmHm/N7w3mz2zGbZm8e9jYbZvzxv2eDYZhvGeZsx/nh+zb3nsbe37zGNjZtth+zw2fj/bbMxt/hnmzPHj/M2MAz3v/e/xgZtmG2bY2GxvGPzbx54Mzb2PeZ7Hj9n+Yz9v8PZh+x7zHgG3j2/bePbH57xtj/Z/4ZvDwx5/5t4e88//8MfnvDew2/G8z/GeeAFYPxvHv9ttv8w28M2Zttt4x5j823htjzYxsZtvNsw2PNj2wGzYM3gMZ4zeA2eA8bB4e8ezDY2G3jxmbB7Y/YP2zbYwNtj2w972zMb8Z4x/gxnvA8YzxmGx5see8e2Y3h7e3sMGMDbPMeMY222GMG/YbY9sfmDYePe37fj9+B4zHse3mYeAwwwYB+/Yf/t+Hs//fsbNt+DbGDM8B4zfsGxsBszAbPAbB4xngNmxn434DH43jGfg2HjD8GZsH7Af7wbG2YDZt4xs3jYbBj8B4eANvGxsBm2D2GDYbe9mNj/GzxsPBn7N4M3jebD94Mzxs8zz2HvD8YbPDZs28NhszD2w9434b/eY2YY88Mw2PYw3vZ5v9t7H/4Nsxv2P8wwYZ7DzGYYGMDZh4ZhsGZhmBgwzDGAYGGwMMMYAVhszPfgbZ4GeGYZ/4zP/8GBs2Gz2MA2PGwMYwwZhsNtgDDMw/PDeAzft/+M2/A/PY8YZhjMZh7NgYYGwweePA8YzezMYGBjDGDHjHngZvAZ+MZ7wZ4Zts2/3/jzeBmHs34M2N+Yw22wMDYbGbYbBsAwxhmYeDxhgf/4PHtszwx+eBjDMZjeHv2G2YZgeD8wDeDw3gH79jANsZjGZjB55sZjDDzNngzZth/mP2M37YBmBjzYDwNgNmZ4DbGNtmNnhgYwwePB4NmMDZjPMYbPxjMG8x72YzGY9mMPDZ57wN4wZvGDYYYzGGNvBmMGMNj2Zjxn+GYzA34Hse2NsbBt5jYNt7MeAbYeMDzMZgeb2e8DAeNht+fmM8ZjZgeeBhjzN5vMeDwz8/3jzYYzG/GMbwZ5vbYzNjNj/M3mPMbD2Dfs2D8NgYGeH7exn4P94eeAzDMDMeebZgGx7zYYMMebYbBjA3mHjYGfg3mzY3szNhjx48ftmMxme2GGw9h+G8AxgGM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geGbw8PP/wNnjDwzPYG2Hn4bGwHjNtvbxszGw/w8zDbbY28/G8N4ft42xhhmYMMbGDZjAweA8b2MA2Gxtsz8PHmzZg2x4GMYz2zYZvwwDNsPzBmHhh5hhsx4zMPMYeGwx5mBjA22f5jMwbGGB7NhjMeYzwH5gbBsN42bfmMPYMbYw/PPDGeDNh+29mwxmbGP8BgbGBs8eGwMNh4DPzDMePzDeDMwBswzNhmHmGB+AeDAPAww/8Me3sb8YzGbPBgPzAebMYMMMZ5jwHgxgNjBts/bP82M28YYZjDDPx5ts2Hj2B4z2ewwx5+3n4HmZjbPZ5th+82fs/2GPzf5vGxvzb34e/YP2Zn5m9/ve/237/b8ee8bb/b3tjf/t54Y83sxs/be2Ybeze9v8zzN4//fh/+2YzPb/bzPD82PebbzDGDb8NgAEWN7zw/MM294/28PZ4bft/+8/N+G3722Zn73g22wbM3n735n+D897GHn7Zntt4DbbPZn7zYN5tvNt4Zsbf7bftvb/DZn7fsfvzH7fm2D28bz3t7H+/x+zeMGM2fvN5vbM9tjzP9nhmf7b3vMZh7Zn7bebf+b3782Y2PMz37M3/5549sZh/4xm/9/n+YZ7Gzzb3hsGZ549vbYPzx/mwY/fmzY9nj288/zf4Ns//NmxvBm/z2HtjeA2b95/78G9+8/9mxn/5t//n7/e88bZ5nv2ee97Z42GfvH72/e2G835v2bfjbMzxje/8///3+eeGz//Z7/ewz/Bs2e9swDA/Nmf/vGH5tsz8xjeN+MbMP37YDHt+Z555mN/szZmw2Bmbzf4zbN5gb3s/bP94zZs9hjDYwwbN+MzM/MNs3n7DYDfgPA8MNjA9mMwNj/wM2DYx5sDDM23njMeDDezGGM3g8BgYDwY3+M2xsGNgYN4DGN+e2bMbx4xsYx4zY3mNgBcHgbGGNgeDPM3mxmPbYYwMGYzee837AC542zzBhjwPYYew3hsN+M3gZg9mBsDAewHs8MMGAFMH+/H+PMGbGGDBvYBjG8e9jH4Mw2Z7YYMMMx4Ac8z/MHjZjx7N+zZsA3jYzGwb2MB5/mPGxhjBs3jYDPBtmAb2MzYA8PMbA8Pz2GzBj2M2YG95gG28Hs22Dw8HsDYNtsDGbAeBhmwzYMNmx4PzAxjb2w2B+bM2Ht4NjZsPMD2AzH+Zn4eZv2M/DzPezDHs/GMM2wDH+G8bHgA3MxvMzGGP/GeM9jw/H4M8MZvNgP/MPYYNgM2/GZvN5jYG82YwZjD8xtmwM3j9vBnt/h+PHnmAbxtsY8Mfv2PMYwbMPBt+NtmMDGDNvPPPM/3t5tjG2DMeYYNjGD2AxtgzMbPZ79gbPMMB4bPNg2bBv23mbb82fsMw/bD8b2fjbYGzGAx+2G2zZmbAMbbxnv2/8xtmzwYNh7xsMZhmD3jxmD8PMGGB+Z48MPwDzwxn+NjeDGPBsGGDAe94/8Zm2PxmN4PzMbPYGGbN/jY2YZsDMNs/DB/gw8/M22zPZmw8zxtvbN7f5m2H5nhm2HjMN7PNh/h/vMzePw8PG3szGxnm3+35th73h42HjM/9+w9m/PMNmzMxtsMzDM2bNn5ge/3sbPY2b2z8bY3mH7ezMZtj97zbP3vZ4xm8Pw2f+N5/7Db2YbPP2x4YP8eeNtv2M37Bmze9+fjM2NjY3vzb/w28web2fg2zbebYNmN7zxmzBvYDG8BvwHmwGD8B+GM82zPM8z9sH/+zxttv3h7x+Zjz/YzxvMwHhsD89vDeYzGM22Pz94ZtgbZj2zNvx7b2GzM3vx7Nn4Y95nvHvY8zPPZj29sfm3jbDeNs9j/9jMwxmwx5vNmZvZvPGY8/bNmGY37zxvPe2bb8ex7GwftjPz357ezzYbf7GZvNjb8zBvPZsxjZ+Z/437Yz2943+83tm2/GeY//bPf4be9j2PDxvBtj3nmHvfhv/xs3gZ+Hn7H78xttjP9nn7YbM8z3+M8zPP3+bGzP3hh/hs8/w22GzwD3gH7A8bDf7YzZv34wMb3jHm8/DGMz8N7PAZ72/NjHmYebG9+bbPM/HmPYZmPzww/M288PAZhjeHgMwP8DGHm2zM8GxmAFxmPD/BmeMw2MMHg2bAZh4wMBmw8wZs97zA8GzNnn/swP2fm2bNhj3+YzPD8Y/8eYM2GAwDA88f4YYM2Z4MzGYMH5+ezPBmZgZmY88MYYbPbD8M8z9gGZ5mw3+8zeeDY28bMzfmbz/GwZvZhm2YzMNgGzYDw3mDfgbbGGAZvbPDNg8Z+GGzZmPDz/D2zDeYGBmfnmMMfmeGGY22zZsG8MZhtjMzMGDMYbBsxmDBjwbezB4wD8ew82G2YZmxhhjbebYbPMzzGGDMzGx+Y8eGf4GMzYe2Gfsxs9mZ7BjbYzxmZ/mZv8Hsw/wzDPZ78DZ7Pz8Axh+xhvNmwNgwwx+BjM/xhsZgNmzHt4BnvbYBsDbZ7DeBhjMM3hns2DbYBsYZsNgbYf4bDZj9jbzAexnt548zA9mZme8xmHvPN4zwbAPx4/3sw3mw29jHgZjMDYD3vMwwext4GYZsNmM8xnmG8wf4xj8NmGwBjA8ZgxmDePM3s2YzDweN7Y8wPDwDZsMwGGBnmGH4GMYYwPzfhsMMYZmDMGGDPw/PAPzwNmBmG8NtjwbBjYYGwM8w8MwBjAPG3sMZmzANmG8N7DAMMA2ZhswM2Bh+zAYeYBmP9hjfgN7zD8zz/PYfnveMe949jG88Yw2AD2ezBmeDMDwDMbHh7DN7bMzPx57eZ48ef+Y//zP9+Ztm9mNjDHhnmbbGez297bYeG3vxgf+fgY2/Hm22ew2zHmwNs3vNjYeNhmZjMeB4wHm2bbPzP9+wz3htvxn55v/Zs2zx7Zt+9vYz2e22ZvP/GMPMzP2HmzeMNvY9h/7f4zN4zfvxmP2z23+8x4zN422GPxjPDzzBmGY2e8/Nnt+2eP9s22Nnm9gN+zGwHnm9gDzY/YDZjb8HvN7Z+bez288eP/2294z2378zM28bYb2Pxs2x5nt/48zZ57PYxnh548zbf+9v343sDZ+237N5se288b/bGGbGP/zZ/vH/gb95hm3hvf7PfvNtvbDGb9t7b/fn5+b/b89/vezeZj9vD/eZtnszf7z8wZ79mbbN+bPDPbzPbZ+2/35j9m9+zz3/ve/z942GHm2Z5jZt+8zPezPPz/PbMe9vf5/t+eee8P2z8z2/z9veH+/MPbZvMPwbzPPZmP2zbZjY83mfn+YMbMGPM8zxjMPz/zzD/ez29+8zx+NvNt+BnszH555t5j2bGHmAYMPMDMPPGYHjNgYww82G8wbPBhnmz/AzPMMzB7N7xhmGPPxgYYwww35hm29mDAwYeGwNngbMMPMfmAzwM9h4bMYZh4fhhhnhgZjZvxgeZnvDHgzze943nvGYwBjGzNmZmG8DZ42BgxmxgbBsMzYHtmfh5ntjDw8GZ/hj3mB4Ngb8AGm8A2GY82B/tvzeGGMx+Z7DDNjzAGMwY8HsM9jHgezf4zDbNmD9/sewMPHh54D2YzZtszZnvYMN+YbGDbeez8AwYNmzwxmAxgzGYzAZs8BmBs8efvG2DezGAFYxmwYMNj/ebf48zY8YzMw8bDM83gwAoPGMGbPHjH/jM8f4bPDbxjw22zZ+bw2BmeZhhmZsAee8MNsPDPbz3h4eD8f/57fsZm/w37zA2HmBt+YB5mZtsxnv3mMPAeZhvxjb8MZ7GDwPYDDYxnh+Yz8xvGYeBszwwz8HnvAZgYGMxhvMDZmYwMGYBmMz8ebNmNgGZmM2ZmYzb/2ZvbDbx4ZmPZ+YBmfn48N+bxhs8Gf7b/Y2P28AxjM/GY9/j2PfsxjGf5sHjZsZs3thv/NgY/bAZgYweN4bw8eGeGNjDBhgZngw/bNmMxthnmz2bf78MMfg8DY2YPbxmAb8MZsMGNm2MMebZmDYYzAwzw/M/xjYwzGZ/vbbGbGNsN/t+2eHm2Z7ZmDzZ+w2Y/NjM/zYebMf+ee2bGwzbPeG/PHntt55jYPNgZhmNgeDwPA8MN4G8w2MYGewDHsDZszYzNsM/MzGBhthnsP8MeYHjwDzwD9mwDYe8PebMGb8MH5sN+M9hm29s/DD2wze2bDHtn/tjzzZ5+z8z8z8z9mMzGzMP22eG2b8fmz8/DzYefvZsfmB+fm3mzM2A8N5mzw22e2bbN7PzA3s8GzMxnjew2N+zZ7GxjD2fv/zbzx4B+N5+bN4PZ5nvM29+Dzf+M9795s355mYz/8PYM/Yz8xjzwG3jZ4MYGbPHsYf7Pf+3v28w9vbPxmZ54Z+ZtnmxmeMwPYwNsYbDfnm/DeMNgeZ4PG/Z434ZnmD83hgYYbx7MYM8MPY/P82Gew/xmfjM2Zv9vM2/DzG82xhn5+zxsxvN79s/w/PwP/3szezYZm/z28Zm/PA294zeMzbNtnvP/Yz29vfmbzNm9hvPZsbPPef/vz3t49jAwx7eGGPDbYN7N+82zYx4wZgZgNh4A9sHgD9jM9+ew9sDbMMzGbbMxt/sZ//7Nje/9+NjDMYw2MHsw9vbPx72e97zGHsxsYwGMZvMzN4B/vZ4YHgbACmGYGYPDeYPeBsGGx7N42wPDGMYDB5vGweG9vGzexjeG8fgN+BmzGeH4MbDHvP8M/YYMPDMMDA8AGmHgYwM8zAYYYbMYBgew2fsMYGBnhgYbMPYYw2YYfsMYGYYeAPGw2xgzf4YZs2ZgbbPAxgezMPGePDBm9jDYYMwNmw8MwzzBh4f4eZ5mAZj82YbZhthmYzeZ57xmHh5jA34YPMw95h+ZjMD2bDAzD8MZh/gbYw2BvPDMz3swZmeebPPYZsMDMzfh4YGfn+Pbxhvx4G9j9mYDMe/Z/jeMPGMAzBsDYNme/GfgwwYHgBRgZ7ZhsDMM/z9hsGbwb88GMMYYPbAZgMbxsY2bAZj8PAMwwwNn+Zt4zDDzPM2eGGbDD/Dx7ZsbzzzM35jMDwMPPYMw/MAzGGYGzAzxnvGZ7DDwM2GeMzw8DwMzzPYYbZmwMZmYzH+DDDwMNmDGzbwzDPwzMP8wwMxhgzYeGBn/gw/MxmBmZjxmYYGbPA3sweZgH5gwMzZhg348bMD83jPwYZn4eGzzMxjY2N5hmDwPzeBmzDxm/2GbfsMzMGGzNhs9mHvGeZsfmA95mAPDGGzYezHgbePe8A88DbzYYNgMwGYwGNjxt4xsMY834/wGAYGGZgYBsMGAZhhhgYGee8bzHh4D37bA28fn7D2Zh+2bGPBm95gAdxv///N+2//Mz3gAb3///v9/5v/fsADvnt+/zPe9/n7e8AD7P23/7bN/+3v/wAP///7f7//f7/wAQt///vz///3v8AEPs/e3v/f7P//2ACH22//beb//z834AI3+3v//f7///eAA7/sAA0kb/9gAj2Z//tsf73737/ABK3v/95+9/7b9vYAJ/P3+/9/vf7//ABPv/f+be///28/AAf//bf79/v9+3vAAf//37f7/fve/2AA/t//nmf+29vzf+AAK7xtvP//e372/9gAP/v3t7//z3vf/gAv/v9+9/v////ABffvfn7f7//f/4ALv/f/v/9/5n73gAv7/Z5+3v8/fv/wAX9/v35v/b2/f/gAn97/3//ttv88/wAS///v/f79///gAl3/v3v3//+z/8AEf5sf/m/P3tv/z8AEP/v97ez3nn+/9gAf/fv3+e////22AB9vb2/b/Pe/f5v8AD/+3s9/7/e/b/94zB4PHtjwbHt//+eeHh4ef54ZnmzzwzDwNgeBmHh4eH7Dw8zP//PM/ZmwPAzNmYbMPN7283/5/+9m94zHg8HjbMePHtvHjY2PePGY2DwePBmAxgMwHgPAZgNgDYA8APgPAHgPBsZg8ePHjNtmDY9+xmDxsHg8Hj95/mwwbHj2xm8e94zB4PB4PB4PBmMb8fhsPNgefhvBmDMGMfs3mzZjwYYPB4NgNg8eNjMHg8eDwZjxmPHm283+zB4PB4PHjx7MeDMGweMxttt/hs2YZ5///jx4zHveMx4zBmA8BsHg8e28eNve9/hs8z/Pzf5sxt48eNjMePbebDwzPDM8z8Nh54Z5+bYbbMZg8GxmDwGYNj2x48ZgPAeDx482//88PDwzPNnmw2f73jG9t+/zze9hjxseM28x48Hg2PePY2GPGx4zHjx48eDweDMAZgzAeDYDDAeA8B4PBmAzAeDYDMGY8bbPDzw2B4GYeGf/7/eNvGGPHg8HgzAGwHgDMGwbBseNgzB4PAHgDYAzAeDMAeA8BjAbAYYA8B4DwHgDwbAeDYNvft+8zzw2BsDYB4AVgBcAzA2B4GZsMzw88882f/vG83jx4294zBse2PG3veDMHj223/nmzGxmA8eNj23j22/8888/P3ve8bf+2/e/zz3nh4Z+B5s/wz8Dzw2bbD3vz/fnjzze/D2w35/n+e8PebNg2B4DxmPf7GP3m8PGw2f4eft+/Zt5/+w8z88N72ZszYf5/737M29+3nv9/hsBsPzB4fs/Z7w95vez9+f/nn7PeB7wDYbDYbbD3+/ez/Z+/z2w2DzwG/H+//Ng2Zv294/wb9//55v97/9tmwe9vY342ePPHng897/H/7exs97/e9/sw9+MP97e89+P3mfv/2H+e/2z3v/bYbB7x+wf7zb9v9+3mwbPB48ebB4Hjb3tv28bHnvPBsPBsNgP8Htjfs/eb89mf7z/DxsPNj22/b2P8bNg8Z5jMP3vbYe8f5/7G9gNvGfv/3t+NhsHvB/j/bb/9+ZtnjwPeHh+zY297zzZ55+ezzf+22e9/tj//e/b9sNve82373t+xvee3sfmP8b9mM/e889+2ZsN+8P2b89//5t54/Y9+fnnh7MNhsz2bNmf/sft7Nt/vP2Gfnmz/P88834GbwDzw/Yf4HvA2ft57Zh+M2zGeeYzw/3/mwwGYDwbe97b3sweP3/g28eNmbMe/GZnnjNtm3/+bDMP9m/P8MZg8B42xjM2Z4bZ55/jMbbPPPM8283mM2Hh4eAeAZgZgeB4bDMzDM2bNh4HgeB5nvNmDMG8YeGZ55+MzbDYZh5mefmbMx4PBmDMHgNg2NmzMDYB4HhmZ/5jDwzMPzMzww2Z73hn5gMwA7AGxjZg9jDGAeH5gM29+ez/PMzNh4GZ7Z55mZ5gzGxnj9n5s8PPewx+PZsM/DeY8Gxt//7DAZgPGMxmwzNhsPMNmw3s2/GBjb/P8zYY9vBhmef7xjBseAzB4zezfs83h5jDG9nmZszDzM2HgbMzPNmNj3//sxt+97M8zw2ftm/8/GYMMAZgDYNvHjxvN42Mx+NmN78xh5vwzNmYMwGMbNn4bMbZjZs8/N48BmNv8zzPPD8z8/Nnm8xhg8bfs2f+zPMHg8G29gZhmZvGYDMBsYzGB5meeZh5/7N5jMGNsNgeHgbA2HhmZ788M2YzbZ+bAxgBWAFwMwPANgGYYZ/vYezGB4BsDDPM9+eGbPf7/3ts3v3mYw2AeB55meeHh/gzAbB4MG9vPNm8bf+M/zw8PDMwxmD2zwxhm95sw3vbYY/Z4ZnmYbA8DZv/M8bPfgbeDN4b8Peb/3htvz9+bf/7f7/PN+Bt429+b3+89sP3vxnmb823t5+//3nnvee8/9+e8PPf+2/8z3/mbZtvz8eYeee8zPPb9/+bbN+e9+w8zPbN/+zN+/D37Mw9sP8Pe94bb89sYw/2Z+2x4Nh+b88eYPe28H42Ye2z/Y/b2wZ7z8G/zZg/23jz/eD3nmY37M2N5n7Bvz2wf4zeN79v9+bb/2/e2Zt5m/G2zbYPPP2A972wG3s3vM9j34/2PP94PPf/7ePHtm2x7/2D/bbbM89jb37zPbbbZ/7bw/Mf4bbB7Ns2/f78///w2PGZsNtg/e/f7/GNv8x/m2wHv34A/3+A23mzB/v8ee89572xn/7bPf4zYzzwbG/8b9vx7/2P9t+f+bG/Pe37PZ5/mZ73vNs9+b37YHmb3m2zbz3jNsP354Bv2ZmBjeH4wD35tgf7x4Bt+bYGzNn4bbZngbebzA8bZmYftvwPHm/DY2bzAz834fs//eP2f488/zxs/w29mP9+MPDYGYGYbA8z2zMYH5g/Z5sM2ZjA8zb/3t+BsM3mzPw2GH/5+zHt+zZ+ZvDfhh5gzG3tv22GDAzMNhj9/vGGYYwzMx7GGMPMw2ezH5szGBmeG/3mNvzBmMfsMGY8MYBsMzN48HjYNvzGbYz3sPAwzM/94YzGP9geYY2Nvx+2GMDw8Dw8DYYBhsz2fmDNjZ+ZvAYYA2A8AeDGNjPYeGeG/GHgbDP/zA2BmBthjGf4wwbYzw888NgHmZ7DHgzG3vGbbxmNvPM28xm/YMMB+82e8wGYNvbGHv8Mxn5gDwbeDAwbbMDGYMxtj8zf+PP/Bhj/9mPNn5tsMbAYbGGw/M/2bY8eDxgwzPz95/7DYZnhhsDeD8ez8zP2Y8GbZm978PM2GwArMMZt7Mxm2zZjxt7xmDYMY9n78xmNj9mzPb3vMP95v89mwweP9vZ/szebx4NjYPAexn5jweDx7Z4GzDGG/83ts9gzbGx7xmPGzYZn+fh7Mwzwx48HsGBjAzZsYeB5gGNjzGGebMHtvZ+zewfmbZmM3nmGZnmw8Pz/eezz82P/Zj8fv2bNmHsDwMz8/3hsz2Bg8eNhjD/2GwNmZ4fnmPbeBgMALgGYYf7M/8ePGYA8HjxjN+/zYbDZhmbbzb3m2ZtmbNth4M9s/efm9vNv223m/BnveewzHhs8DY8NmwzbxjMDzYZhjDx5t4ZvNnh+wz8Nh5szAM/Nh4Ztn5m/N7A8P8/xsbPH+Gf+e9v/N7b/NjZ+2bwzY8PBm2GbNsN5t/se8P88b2b9tj9n/4/f4e9nj9v97PDMbDxv2zYzNvZvDwe/Mxjwf+Zs34z828N+/wNvYew8b97bx/v97w/8bx7Ybfs2/zfmZsA29ns95t/ge82HhmbP34/H+3hs888M2/Z7Db2fm2b/b8Zm/N+/b3/mbMzGB7MN5m/bZ7eePPf4PDY/8wb3+x4b8/M/zzZ482D3gbeM//fv/ezNns2P8G2x73+88HnjbPYePG3tttj3j3t7e/zY/3+3m/Y9m2bB57xs8Z7PbA2942e8//8f+zPf7PH73/n+2B4zBn7PPZvw8HmwDzYGPN/jf5nmbZ7MeHvDYZnhsM8YZ+B48P828N+B7w2eHngbA2AeeBs8A8PP8NvDw22zDYZht4GHtvzzbZmHvNmMD2Zt5vz2ze9nvD8/D9n7/zYb83jZjxnjzZsYYz/2BmBh5gze2GwDwMz8NjzDYGbAxtsMGBhhsDwNgGZ5h79m9tm/ZgezwwGADcDAzBhmBsz9h79/+MZmebDDPAxmfsewzPNhsAzDZgbw3h7Dw2GZh5+9//j2BsDZge2GAx+MwGY228e2/bDH+/2Y8ZjMfszw/bMNvNvMYYxvN+YZthvMZhswe2MMAbxsN+YMx4MDAGxjfsDZ4BsMP8MHv972G88w3tthth5sxhsGHh7DxveDxsNmZ54wxjP29mbA2w2bGZ7wMYwzwxjZmPMPwMZg9s/Axts82f4YzMMGB4ZgbACnnszPBmPbYfmezwxgeGw8MM2Zhv9hvzZ/ntmMPAzDNhgxvHseG94xh+G8Pw2DMPxgYwf5g22wMGzZvDNh5h48zMNnsNjMPZ5/vMzGHhsz22MMbDBh7xtvYzxmbDB4wZ5n5meHhmGw3hhgwzPDwN4bGzzfmzGPZ7DfhvBm/bDDYB4Zhs9vxn7xmAPGDD3gbA2B+GYzMf5mwMBveGzbNnhjDMDzw2YYeH7DzzNmGMDw9vM9hgPY3sMHjGGMwMB7wZj3gw2DD28/Yb2GBgMDD2fmGz2ZjM2eDP2b9vGAFZhth4wNjPMzPz/MGB4YZvD2BsMz//82GDY9hth54zzGzN7zHhv282DNvMeDY2Y8MDPz23/gzMDebH7Zt/gH5n+Ns3tgBTbb/23+AY3veG2bN4B+Mz3tmezDH49sef54H4zPN5+3gZsfnntv2BvM9v/e8Pewze9vN7GPM822z3n72Pef7be/Hh7eZj3/+f5me2exs8zb/Nt/mN73s89j9t+2DzGN+e9t4M/bfmN78Hvbzf4Z7bZ7b9v9vN+b2Z7Hve35tvPx/t5m3tvB//vf4ex78f57z9/tv//e89mxmGbPPB7283/+x/+M//2xje9v/9sH/s89gzDNg2/28/b8BvNn+Nv8wH7zfjYe3j/z235+YMbN7GZt+eDZnjw9t5+P2Z79t7wfs2//M/BjZvee//H/jG/Y/8ef79+ee3n+9vzGwbf7ZvP/Btj9v342Y3/me3tj/M/Zt5+2w222wz3vYzx783nvwHm/3mb28Z723v2xsHvb8N5m2wH7exsDN5tgz22zb2Z/t/m2HjeefvZ4e3t57/zP234b//8ez2Y289v2zee3tmNjZ/mP2ez2228/fn+xts8eeZngz8eMMY/GebMeY89hn4wNj/Bgbw8zYGMA8AxhgYGzA3mzz9+eG8PZ4YbMDGYYG3gbDAxhj2MMYZhjDYHmGbMP2e2ePA28MGzeYeM22HvzZgG2zGPPbAx48H43jDBt49h483t7NhjDDx4Z5nhsx72P/89mMZh5hj8zD/G8bMZsZm/zGAFPxmYzzMeDYzYbbxhjx7eY/wYY2ZswBhgMAZs3mGY3thtsMG2zDz3ntseYPDN5+Ge88wbxh5sMwxmYY8D8HthszPeewxj9mDGYzD94DMAPjYzGb3swYeMMMZgwxj22HjDMGGHjAwM2YzA2xhgMY8YxmDew2wwGGMBjN+/ezMYbzNv2DDHjweDBgDAwGwYYMeMYG2P94zxmezDYwfs9vxmNjweMBmBgPGPeG9mD2NgGMYMMAbAbB48ezGMHjx72wGYwbYzGxt4z/8MB7GMNjzbzGY2zGPN4ezM8YH5h7x7G8Zg3szZve9vPGzeYPMZsweDPZ7ANtgYP2DN7G8fj2GZ5sw8b8MbMMGYwbMAeDBhm89hgweB+DMGNmYMGAYweBgNgwxgwYHg2Bg8bbwxmDwG8ZhgDDAeDBsMAOBgMBg9jeMwGYA2AwwGYA2MY9vN4NsYwMYNmbxgbAwMfm35jMPGeGwM8Ns2BsMMMYfhj8w3mZsMeDzHn4GwPMNnszDGGYB5hh7ez2zDMN7MB7Gz//Pf4bP82G/zD/AP8DZmBvwN7DN5ts88DzwPDGe2Y3+2Hm3gwwzPMHhswPeN7f4Z48M2MM8N5j3seZjM2bGx5j9795sDebwPNthh43+Hsb23t7ebeMxjH7DMzDG9jeDbYf+2YxvNtsx+Y8bfv97fn79tj/DeZ+23j2bGz2PNgwebNt4bzGx5szbZmP3+3m2MYHjN4xvbH+NvH7e2ebZse237Z57/NsNvb/Y82PNswf+/22NjZ/h42ZsYZ/seNjzGAzGx/jGeMxjG9jxtmD2xseeNgbZ5tjN/nmZmAY37e9s/ZnjNszbx5nseePbee/xs8fjZg23vAzGZtvM8Zt428AKMGY8GY9htvAZvDGN7eBsbbebB4z2D2/ZjzYbbbB73jY8372/zMY2Hjx7fjeexnvzzxs/zb2w//xjwG2zYzPHh7Y8GPA9mxsNv9szGzMb8bNnjHm2/Y97M3nt7Y2MMbwY2ZgzbBt4NmMbA8BtjAGbY28Y/AG2wA+bAGbYDM2AM2wBsMwBszAe8AbDwBvMBseAMweA89hj37Gz3s23vD/2Zgb/Z7M9tsYeD8fmbe2B55thsbwebebzYzbYYe3+BtmbPbxgex4PP/DGBsz2GYHh5s8Awww22GMYYMA/AzHjbPz/DHmMDYZmzMDw2GYGB7H/h4zMYw//NmezeGNmMAKZ54Zh4G/DPwMGBhgYwwM3sMwYbb/z97NmZsPxm2GMwwZ7MzZm3sG/HjPBmMMAG4MPDMMwZj2DG/A8wzZnhmYDD/z/YYNjNgxmMGYeDD8MzzBmGM8zMPbNmMGwDGNhj9jAxjYeDYZjD94w95+xn5nhsw/YBh+ezbNhsww2B7AwZ7BmMMHtv3gBWDMfvYw8zYbBhhjDBsZgPwYBn+bPZjYexngwMwDBhhgbMPHh7G9+Hts94zMN5mYzAeABGYwGwxgwDP8NtsYMeD8wYDw/exmeBsbN4bwN7GGAFwB5mG2MPGx55j2/DPB+Z4YGz2AbAYH5jNsxmftnmb/b9mNvAZ4NhjGb/fh5v9hnmMwwZh5/nsMzAxvDGx57MzefjMzPPzBn4zM/PN5vGGYM3t+fm28ZvbezbGBgMMY9sxmNvbPeBjzzMYeH54zwzw3//mY8YMwxs9mxmDMDGx54HnnsDGDDDGYPGbBtvHsZmwNtgwM8wG8xhgN+zZsDGzNmGf4bGM8BhmZjDYA2GxngM22YzGbHsDGAeBhs2N5ng8PMY8Yez2MN4w8eGZmG/GwMMbPPxseGeZj82ZjGMwGDB+zGzGxtv34Zt7Dx55hmG8MPDZ7w897GGbbbzY/HmGPNt57Nvw8Z7NnjYZt57YMzDNjM2/2wzzee9+Ns/2zMf/nj/fhjz3tmx5sZ7282MzbHhtsZ4289jzD29vNt57ebb2eZvwP/2Zveew3jbbbNgPeZ+D9mewbMzZmN5mMeD97GYN/nsHhv9s22bGzYw/2e2b957x5tnvbfng3jzzPbYZ/vef//vY3tvz2/9sZh+Mxj/ebbzxvDA8954DPBmZ4/Zntt7bz2b9m2xtvzMf4GNsZ5/t5m2357b9s3/m2GYNjNmbeN+M/D9gMPYZ+Y3hj837N+3+3m357f57M3je/P22Ztt55+8zNvePZ7DPZnje9sefmPzxvDD/G2bP3tnmb/fm8x/hv3+bMM2xjN+3sf+zf+9vNnnm/22bP35/+/Dxm/PP883mB/njNjZh+NnsP95mbY/3nvNvx+N7f/557GNm8zHm28M/95njBm2bYwGGbZ7Af+822beY/28MH/m8G35+D/Zng9jfsHnntg/23vbZhm28xsxjPZ5v3m/9m/eMbM3ns9n+2exgbAHn7NmMHmZ4ex795/n7HvDNjeB48bPGBgGeYM8YYzbb/Hge89m/PDNsx4YBgwMPGYbMZ7DA8eBt4A8AKAzBjbZtjMYzGYGxmMMw2B5gGxhmBht7PwzwZ4//N4YM8wxvxsPfh7YeGMN+MMYbM2bHmwzB7Z7w/Gbz/bB+MzGxsBgGAx7xmb8PYzYYMwbYYPGDMeeY8ezHgwxgMYANB5jZgzAY2H4w2G82w8GwDBhjGPbMwexhszxmGwZ5jGHjNvNmeGeMMYMNmB4AzD8YY/PH+Z5meH55g9tgxmx7M3hjYbBsHsPDDZ5jZjbMM2Y8AG72eYGMPB57Dz/w2/eDb9nmMMMxjDGNgPYYGBjz/zPb2G9hsAYYzACgMB/n4w2BjAGw/8Y2zPPGGAeDD8eeA/GbeZgHhn+P2YzA88YbDDB4ZvYeA3sw2YeAw2GHgbGGZgPAxg9/mYP83vGPDzNs97PDMBmPBhjGwwb8/89mB/jMPNmzBt7fhnmbPzG2DDNsz8Df+GPMPGZgwPMMM2bBszzDPYZ5sDGBgbD2YzACmMNgeBmw8ezwMbNmGzw35+wNmGbMDH55mzDwzZh5mNjYbDAz3m2x5+f+Z5hmNhjGBvw8wZtgzzYeHvYeGMY23mwxht4zBsDHmDwDBgPAMGMbe8YHjYe29mf5gYz8MM8MeY8A8G9gN7DxsHgBcbMw/N+MGze2bPNg82x+bGMzNseGfmzNgY8weY2Ns9/7zDx4Hmw2xmft/4/Bn57PbYZtsM2Y8xhvGH7bePeBjAZgbB5mN4YwYbAbeDwbzHm2NmbbZtnthmbNh4PNsPz/DbNsPeeGP23szxsbA8fmDebNsGfjx5m9/jf+89+GbHj2eYZmPzP9t7Db/b8Pb889ts89n+zZ+zzzzexnsPb8PxmZjNt+z2e9h+AbPeb8Nmz/DYb2MDDYbZt7Mz3n+exh5sMYBs9vZv22Y2zH4zYZ572BmbYwx7Gbb2G2fs2N7Z5gbe3nn42P2DYZg/Mfvx7e9mY954Mwx+N4fmzH42z/9+97GMwzHmPM2e2H+zzBjP897Ye2DM8PMM2GwMeY8M8ZmHht5mHmPM8MexhhsP35m35n7/835489vzDN7DPw3mH5gb2Bh+B+w8Nnt7Mw3mfvxsMYbbzbPY/37w/xmb/NszbDYw/DezzY8Nsw2GwxmZsGzY2G9hsbMzzNsPzDfnswzZhjYYY/D2ebBn7wxjPMxsNvxveM/be8MYz2M28zMGxsebe9mG2ZmNv2f+bwD37ZmN43ht+3mHnvxsPY/fj/AzD9mBttjeB4Nmbz/DDeBszZtjMMzDMMGBh4Hs/AzB+HhngzDDGb8DMZmMGP8NmMfmG/bYN4xsMMYHjzYG2GzNvNjMDBmGzfjxjDG88eNjMeZmMwMwZh48NgzAPbzPYHhmZmMMMMeB+NthgMAzzA8Zn7BmMxjzbDP8MPYGDDxmYYbHh4b2G8YzA2Bm22MM8MbDzeHhsHsMeGbMzPMDMA2eBmYfsGb2/eGGPMDDDGeBgww9mDeMPBmfts23swY9jMDGBh+GDDw2/b82f+8wPxn5vxjMeDN4bGGGwD2xhhmfmGBgYYMww8MBmAF3m9+ezzMeGDPMYZmHhhswYYMDwMzGzDH5jGzBmB+MMwGGeBjebxmwDAYDMzAMGAww/zGNmYDYZjDAwx4Yf5gzNh4zABrGZtjDG82MH7YeYxszN7DAxgZmMwNjxmGHmzDBnmGMYf+b2YwwM2ZgZ/jPM2zGfgGzD8xnvzAzGZ4AVgM2YwzDwzDwDGBsDMPDM8NgYeZ554bPDMYwzMYYZh+B5hmz9nn4wzzMeYeHhm/bMNsDxtjMGZtngPAxjNjYzYxjeH4eeP8wYxmDHmGZmGYxgbPMDwB4beM2bDDwPAZmx4zfmwP8MMwDY8Mx5+Bh4YxnjYze/PMZjNmDMGPbw28YNmbYYxsZmeP88wwYM/AMDDxj2PPDDDYDMNhjbGZv2bYfjbGAZhjAzA8MYGz2PMb2AZn7/Z5v2ftn/jNngBQw/357zZ/vz3t4YxgBRtttv9m89vweN5sxsMbG/bebzPPGf/h/5nt5vbfvzbHm/Ntvz8z8/2//PYe957zNn7fhs8b88bebeNt/vG2bG89j/8eww2MP8bP3t7fv9+89/vxm3n+3tvf+DZ/+fvP3njPM8x/7Mz3s/bZttj2/MYZ/ntn7zDbfsfv2zPY/P/z2ZsY22e8ZmZ5jHt+3t7GA/eG9/v2f+z/e/MAb2bM/zNts2G//8zxgD3j/bzeP//M/3+MB+e3v3ntvPeZ+ftgP9sY/M22Z5/+8b/xn+/z/bDGexs9/5+M2P95m2ft+Z/sx+9/42bzPx+P235je9jx/mHj28xn5t5v/bYP/P2Nn+/bbz2fvwB/sefnsZmZj37M2e8wZv83nvNjf/n5vY2YDM9+/Y/MzH7f5v22D3tm/Bj//PzebZn7Hm2P9/vw3vM3+9vHn42ezP89t/+/Pw2x+Z/57wxvHt572/PezH7Yxtm22z2/bGPzxhgHjAw8zNjwb8YGwzA2Z4zzDAxt4BhmZ4GZmAPDYYGYYwMPM28zDzYeH4B5hgwMwDzYY2GN54Hg8zA3j2Gx7DDYGDPeYxs22eMzG22NgbAYYGPezG8DPe9+f7P83h4Zhgw2/2bMMZmx7BmbebBmAFG9h5gPPDPBtvGGzGMYZszAweAzAHgMG2MMNvGeA2bN7DbBjGb3sN+b8H7MzeMMYYNsM2wzwNszGMH4wx4Y/ZmAPDbAMeHjMZvDxhgw9vbxs94N4eMN42x+Y8xgYeB4xt72Zh+2GYZjxhjYMHhmMwPexnj8w22xn5j9hsBgzzzGbDBmDHjbB4PAbAYG8YYP949mPGBg8BjMBn4YMNjZjMGN4MMGNmAzzDYYAUGHveG/HtgYAzGGMD3gN4wMe8Ywx5mYPY2eMGAbGZhtmwex7NhsBs8Zhht7zHnmxhh4BjAYx//s8wbbe8Hj89s83m8Zgb2Z7GBs3nvx/swbYY8Zgwxjf+YP/37weMwDf+A8MDfjM2wx4MweAxg8ZjYwPY2DGDwbAYMHsYMMGAeYPAYweDGMBj8DBgx+PA83tsMAZjPGMMYwHjDGxsGAYDBgwwZjY8e/zYMMbBmDYxgwwYY2DA2A8N4N+2DYz8xsA9m2YNsGYGDGPGxvM2YYzbAeMPMw2GY2PeB4e2xhsbGezM37H48eYzebYf4fsw9+YzMPMbfsZg2zZsBhgZmfns9mxhswx5mw9jwzzM8zZnt7ef7Nn79m9sPYzfgzN7Y3vMeY35j8b8bMM3sPPZnnn+bx+ezxttjzzDGzH7ezf+eZn/vf7Y/MPzGzGPf548DN/m348w2w9thmMxsbA9j2w/YPBsxsw2P3+Z4GPGPeePBmN435tj9+29sNve88HsxmPHn48f78Z/s94f5mb83t+zewN7DNvP3mwx+bBjfhnt+bDY3t+fveN73mH+PM9tj2234x72ZjY37Y8x7zbw22MbbYP8HvAbDwZswbNg22AzPHg8eAbAb97xmBsbfvGDPbNvYbbB42ZvHvM23vxsz2Pxs9/5htnt5n7bwxvDNt7YMNjNswZjMYx4D2wDGNvz2P8eYY373s2/Nvb2B7P9tv8AzBhgYMDbw8Zm3hsGZnsP943t+2MPY9jN4NvG9g2PBvxs8eA2MYePbeZsYeA82N7eDwf4w2bMPH+A9sePB48Hmx4xgw/Ab8GM8BmHg8Zj8YPxg9hjzY34zMGD/AbzB5sBmPGZsGGzbZs/ePGxtn5hsZv/G9//78Nm8zxs9/sZjz2Z7M2zw/YP2bNm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BmezZhnvM/NmZs2Hmw9sPZ+b9/h57YbGzGGzMMzw9+3v2PbGYwz/ezGHmHvHmYM3h/72/bN5737Pef7z9+z2f4fjBnv2wMAKYGDGeG2G882w2NsMGeZ4YYYw8YYbDBm8YYNsbYzGY2D/M94wzYHjPMMZjxm83hgwY2xjDZjZvD3mMzG9gzzYMYMMbMxhgMB54xgBQGNm3thsMBsYPzz8NmDe2wbDA97/HhsNhv2eDNjYMDAzPGYZgwPDA3sNhmY8GHsN5mbANmGGezAAmGAATAMAFYAPADjB7G2e2MA28B+zZhvGNhh72Z4zAYGGYwx+PYzPZmwzM9gH4bPDwwxmP8x7PMNt7Mb9j/bMM2fhh4PAx+AzMx7Z5jMGAFfs/AZh4HmzYHhv8zDMbYzA2N5+BsAKeY97DGG2zfmPbMx5nhgzDPGHgxmB/4PebGHmeYxt7B4wft4G2GYYZvGYGGM8MwNhgxhnmMxsZjAxmAew2Y2GZ5/jPwDMzeH5nn+G28wzP2AbBmeeYbYzB7e9sx+fmZhhh5nj8b2YeHsMPYB5tsbYMMAzweMYx+wMHgDMY2Nh57eNmHgezDzMMefm29jMDYePwwDPGBjPbA2e29htszzN7NmP8wYBj2BsB/gZjHh+DN7wex+PYYBm37Nh57Axh4NvYwzMz2GMzGef7b9hje2DexhjGB4HgPA2BhmGwZmwzDGYzGYbbDx+BhnhmfmH5thjDDPPM2bAGxt7YzBnmxgPMx4G8YMDDZv2zbbYMxmBh/n+ZjeeMMzZh7weH+BvwHmB79mHnvNmx/mbzwYP/M8f5vP9sz/3+82bxseft7Ngf/jPGbx7/29tns9t+P/zx+GPG/9t+b/23t/hv3j34/PPGe2zNt7/MzwPGx/+/b223jzY3s289n5sbbN/5sbeZmADW22Ztj2HvbNjbN57zxve3n7f/nnvb8bDD9+8GNjbebw9jx/nns288bD/xsz37Y3tns9t7wbM3th78Mxg/82zef7bMzDZmzb2xt/495s9jGfm2z3tmxtt7/b2bebPwzN57b29t/5+3/+/G9ns/G837HnjZv89+3tmPZ4f+2bzM2eftvbPfttv/957zf5meefhsb9tvP3g8fv/b/f4exv8G9t+fn/g2zf4Z54/fn72Gbb/e9tmb2Pb9tvNvf4z/PMfn73/7zb973n5n+e9vzPZ/+/M/9/m/zDY/ZsbwbZhh7G9/sP/Az9t7MzzGZ7HmzD37Zgf5jZve94Yf43hmZ43nt5/57Y94Zsee35/sY8zDfvP2zPzP9nm//P/f/m9vPN/vw2f57DZhsAxsDbMGeBt4YHmbz8w2A82A2GzMYw/Y8Axv82BjBsGPMYZ578PGewYbGzzwxmDwYGN7zPNsPYwbPZjY2Y/B4ebB43tjGzHjGA3g2Ab2GbNsDY8YZvePH48xhve8N+bMxgZh73mGMAweB+GB7DGYbD9g9+YDMww8DY8GGMDMwNgfvwG8Hts8AZ7MZvwDGPeDGbBvMGYeYebDw3tgDzZ4PDBm2e3vM3hs8NvGM3t7GPDzfmz8Y2bMY2B48PA3488HhsDGMzePbMeMG8ebAPDeYAUY8xthjbHmwHmHgzGNm9jMDDNh7BhsNsYwbZ4zw/DGbzGGGGZvfthsDMMA8GDf/n7A37wx+fmZvfgbeB4bYe2AYz2eNjBmAeZg3vYDDNv82MxsZnjHmDMw2GwzYDM2zPGGNgzbeMwPZvN4ew8xg3+zY/wM2bGbeAzxj3vMezx4HmNsYz8fnj8zGMH54A//Hj2G82eZvNh5m/b97G2zHmGM28PBsZgDDD3mPYDZsN54Y8888ebH5jPM8x+PBgbYbYYb2bPNszbez9jG9sP88wzYY9+MzZmD3n7GwzZgxjD234DMDxnm/DGz8xmG3+xhh+B+zee/B5gxvbGBsf5jbHsGbNgP3jDMHvxjN4Bmf/72A8PwPD8MMzeYwZmf5n7M8zxnnse2Hs/Y8282eZgfmbD8MNvDzZ+w37YGZ7fnmzG8YZts83+2ZmY889mG2ZtmZv3mPP8/fmbPMbxmeZ+f+fmbxtmbZn/vZ/g3tvDP8bP/3mzPDMZvew88GzPzzzfmPYb9jNvfv9njZmPDN72MNvPzeN5jMZjb2b2bbwGbG2eb8ZmbYZtm9meDPDe9ngDYbNv8eM9swbbAYwzfjGPMbMMZ+Mw8H/4eDxvPM/bx+w/z/DbzeYexjNj8z2eBtm2Nm3jDx7bHnvHsPzbxh7P2Hs3tvzz/e3n7w2bzMNsf7bP9728f7829vMePZ+348G8w35+Z5+ezHs9g95/vM897/MYPPbG9v97Z/v23mf7P2Pw282Pfv9h/vPDBsMD/8xjMPDwz8Nm95tmx7MNmM/PG9s2zHv9s2bPPPf7GbeH48e9/5h72PP83n7zNs/Zt+w2bb2zPDfvNsw8PPDe9mZn5vfn7PNvZhmebDz/MbYbDYY2w/YGYNh55482G9v3v94wZ+Bv2N/tmzMfv35sb9+G3m/Nmz82x+95mN55gGbz9nngMzbZ4A8PDwxgf4MwwwzfhgGYMMZmZ4z/MMwYYwwGGeAMwDGwwGeHmDNnsx5mYPw35s8/zZn+zbxt48/GGHmeNsfjzAYeAbAwNmGDzM8GGzDMBhvxgPZ4Z+YHszMD/f4bMDYfsPDA9mb2AeAbw2Gzz3mzN4wbZ/nvzM8PePZts8z2ZhmYeGwGezxsZgGzYzAMx42Hngxhs2wM3vPMAzMM8Dxth7MwNt5njMGZmB5n4P83ttmMw3sPNjGPDBg2/YNjHs3g8GAbNnge2GMMwzDeexvPbMZhhhhs8x5m82eNgMwzDGwwZ7A2xmfjNjA2wzPDbH7PHnvZ/jb9hh/hme/x+Yw8zx/hsPGxmM3hsNjDNvD8w3sNjDB/gY9nh+9hsA2H+BnnvD8A9vMPe/wPGYGzYew3s3jwf495jPGZ42bAeZgGx5+e9jYY3gfvYH7A23j9jPMx5jNng3sPzDGDbMYZhhse28MM9hvHmYzwzxm2eNj2bDxg8DxhgNmzzMzZ5+zzAZjb9swzzA2GMzAGGGYYbDzAPzYBmZvwNhhjNhvGb8w/MYBmwNh5gZm82xmwebzA2GGZgHmYDMDDew2GMzwwDZm82NmBhgfmGwww8MMx+NvAPYebPMzB/5ht4GebebPZv9sbe97Gz9g2eAN/mDMzHgHgH72ezP/wzftnhv97bzNv2ZveGf/4Ztm8wxt4zDzzN4/exvP2P8N/+w/3mZj2f/vf4Y2e9gYx5sbPb9jD/ZvA3jz8Dbz2YbNvNn7M2wzN54Znme/9v3tm2Z/njGZvfsee978Z5/+wN7DH4N5m9h+Zvz37xmP9nm2zZsNvG2Z7GPY97xmbH+8zeHjzG/Pxh+//xvbYbbb2Ntg372wb83mAPMZvYDZv2Y889jGe2/ZtjPzN5jxjbzPB+e8/eY9v/9t7bPb89t+Yz//YfvB/s/ebfn7Gxmf7ezb3/5s3mY9t54xn+zDMZj/ebP/37e/8zf5j2/3/7w/b2bbPG/eZ+w/eG822N7zbH+//z37bMz8Zm/zz//b8z2bw37A3mPPAw9m8MN7/8fn///t+/97fm/9vz3557PDDb83vzPN5+e2fm3sbe3s3nsx+Zv//M97zPfvPMb8zbezM/9tmebfn7Ht/+29sYZvAzNm3hj2GDHnmGbbP/fvzDYMYPZv9tvzDbYzebb8P34/P83mG9+MPMAwZnh55sGYeMNgbDMzw3mxh4Mzz8DMwwMDPAzDAfm9mMMwNnmDGBgbDDDzZhmZsxh4YPM2fmezzwbbBs89m8GYMMzDD2YZ7DPMZt4wzzDNhm9mMDew2Y/DM3hsGNtt+eYft+w2w97YzPw/ZmfmZ5mDAzzeBs2YwNswDMZmwNgGfhvDeGMD/e/8wzePMw2Yf42YDYYwe2w/GN4Bse22/Y9mNntmMBnh+DPzMAezHnvfsPebBm3sNt7bANnthmDDAzMwxgYDYMwbGY9hsBmbN4zeNj2AN42DA83sYzZ78zbw2PM9mN54Gx4Z5mzYbDe8ewb3s8f7/DbzbPGYfjzZ+b9hnmzM37AeG/zbD8/ZjPMMwzBmbzZ5m22Zsw3+Y3+Z4ZmBjBs8DzZht5s2PPeDA8fgYG/YNszxnjBgPAPwZjGzYb/97eMwxhnmMMM9jYY3jwwxmzZvbMxmDYHjz8eeHmPABuzzHswxn5vYwze2e8HhmebP2B+/xvAxvA9sNh4zNh/5n4z9+G3/jDGPB+zBswe3jYMA2NhsBt5sZs/H+ZmewDH/g8AKx7bDMz3hgZhgxswGGYbPN4/e97DMD2Gb2MzwZ5mw94HtmNjZgwwAaNmGMzMezeDAx4bM95+BgZmBmZh5sfvMZns2bHg37B+bbzex+DD95h5szf5s2fsMzYM3n+ef+z8zb9jZ7/8x//5m8Z49se8zzGzbZvwzMw2PPbDzYG3mzebH4PDPzMMYZg2Z+ez2zDMYwD/APbNgbA883vxj9/m9n+ex4fmeM/MPz3t5jxtmf+bb2ebPMzz2eZ7z/wZvGBhvMGZ+bZt4x5jPf/hvPD3vx+Zn/7zNhmePN///5vG235s35sbM/zMGe3v9vZvBtsHh4PeP9/veDM8b8//e29mH7/29vxj/P97zPZ4zbPN7Gbw8Yzz3mZsM3vNjZm2YfhjbYZmeZ+/9n5szPZ7/wZhnmw8D3+Zhtnt57Htj/M3+zzzGbP8Mezfm2Y88wxs//M/bxm3+exmef7z2Gwz8ebzGezN5tnvMM8eYe2Gfh4eZtmzePzDBjNmzPPzMPeftv/Mzz/Deb/82e8G/8Zv/Hmxsz3t/7Z/g3vzZts3s34Nm/f/j/Ztm3s/DNvGwwxsxsxsP3sZh72P28DxsPGe8wfjPPPzD/H7PM9veZjbz9hvZvZnje2/PwbYe8zYP8PNtmZ+e8PeHszZjNtjBgx+2H5jYH5/+BhhgZgHhmbAGYYzYPHhsZsZ5jY/NgbYwGDZtg8B/73jPzZnh4eMMGDA8DMezDDMxjYGMxnm82zzGYZmzMww8Zgw/PAGB4b8MD/HvZszMYYYGeBjYYw2ZmZ5jDzDwA+NhsbGG88z22ZgbG/ANgezDDbDeMMYeNgzzeGxmBnmeZjDw/MMP8DDMN+bwN+GPMzB5szzzfgbAzMYH7NvPPDDA3mbYbZ4YZgHjMB4b8P2HgewzA8MPZ5jeb8/ebDNhh4Z7DYZh/n+Pb8DxhjwN+MePGD/eDZ7DGZsM2wMMAeBts82zH+M34YDDNjYeMzPx/n4/BmM2BmBg2Bs37BhjGf7Ztjx+HgGzMPDZsMPGYwwMNmfmzwwzZgZvD2f+M8MwMYYbPzAeeGZ5g3gbzAzGGYH4Gfmb2GAbMMNh/hjGwNngY/PDDHmez8DGGB7MeeDPMP9jGYzMMMz3geZmYYYZ4YzwMzDMeMMGGGzNmBm/YMMzMxmwzxmzDwzPGHhsMD/2bMzPDZs2xh5thmGw8PMbxtvDA8G9hhjMDx+YP8Z/tjbPPGGzDYZ5vNt/mYwb8BvYeAPwZ/mZh+GbNn/gG9hjZs/Hhvxv//Y8N/jA22eAMAwwM8Az2MPMDwwz2/G2GD/G2z8Zt/szeGYw8Pzw8eYzZszAAq/9/+3+/P/fveABX/3/+/2P3+3v8ACv/78//f5vzZ7zwAK5/tve9+/P/P9vAAr/t/v/3797b9vAAT9me/Pf//tv9s2wAEz3/7e373+e/z/AAT9//+9//+/zNvAAV/3se973tv3/v8ABfM/N/73/79v3vwAFzeZm/e2xv/37ftsABn///f7e37/9t4ADe/P//9v3+/bfsABv/9v8/3/v9ve8AC+/ftv9v///e/wAL7fvfvebP2/3se8ADL/z2//e97f5v3gAZ9tt+ft////5/gAX/e9t/+/9+97Z4AGW///3v97be8/zAAu//zb/b//35veYAF97//z/2/zz9vbAAZ/e23v//ef/7/AAZ/9/+b//8/3v8ABv/eb/9t/t/v/PAAX3/7//M/9v37bYACv/7Nt/7be/9+ewAFfz972/z/23//4ACf//7x//5/+8/wAKt+/f//+/z8894AFf/973/t/7/zbwAK///+3v/9/tv8Zg8Hjxj/NnsMM/Nn7D35554eB4GYGwM8zZhmw2AbA8PDzzPzfmzz83jNvzw2AbAwzYbPN+DweDweP23/+Z//+zeze2zHjMeDwbH5vZv29vMZjY29mPBhg8HgMwB4DYNg8e9sfv2f5vbbf7xmPBmN+eZ/7zNve9nnmbN4wweNjwePHsx7D/zw8P3hs2YPB4PGNthjxmAMwB4DwbB4MwHgzAZgDwGweA8GwZj2bHnt73sweDwHgPGwZjx4PB4zB4zB4zB435s8MzzzeG97MeMweDMe/83jwYYPBmA8B4228ePHvzN/+zN//tm3m97MGYxs8/3s2BmbMM8zPPDwzDMz9mzGweDMB4DYPG3jNm948Gx42DwePbPPDwzMzPzwNmGfmezeMxsZg8HjGPH7ezHgwweA8HjxmPG2Y948bbHg8eDwZgPAeA8GwZgDMAOwB4AfAD4AzADmAHMAH4AfAB+AD2AHGAHMAPgDMB4DMB4PG37/8ZjMw82f7/e8bHg8Hg8BmA8HgMwA5gDYAzAeDYPB48bB4PAeAxjDG2Y8GweMwGYA8AeA8AbGYNts2e8/N+ebDwDYHgGwDYAUw8DwPA82bMwzMM2bDYeZ/7x4PGx4MweD/eMN7MePHjweDYNg2Dxt7x4PB4DwHjGPHjx4/Zm82eef55n5nnm/z/xmY8eb2e8P2Hsw35vw2Nh7zz2zxs97Pbz3nttnm9n+H+bMz8wM/A/ew/x+bw837w8bAC7YebPeHtnjw8/z9+Hnm3gbDzzwM2w/z9+b3t5482//eef+2z2Y8/9nnvP8/ZtsD3n+eee82eB/gHnh4GPZt+e//P/3/m3vf7fsfn5+f5737Pf48PHve8M3h42eeeGNvbZ+3/tt488e8b/xs/MPP/3h/vP8/zfh488Mbbz2YeHh54beB/nnht4H+eb9s3mf/7G83j/N7//Dbz9t5tmxm95se2DZ783tv3+x549mPGwbbHjY97P3ve2/23/548Nntn+f4e/xt4PPHvZnthsf789+PeNhsB/jNm9/+/xvbxm8/9//v88/ZmeBm88D9//7eH+fs8eH+G/8/bzw2e3vzPzZ/n73/n/795hve8/883/+8N7DzZm/zZ+2/zMz/N7D8w/Yb34b/9//7MzZ57w2bPGzezfn7ebHs3jf+f4Z4w2zDfnh+zzfgeDwNh55sPeB/h7GbNnvAzM3+Gwz8xhmfm3m2MMGGAzGN737f7DBhg2bDwM2Y3mNm3gzbbPPM2GPHvzZmzf+9hjN+ZmMwZg8GYPb8z/z/HjxvbGebzM/e8e3s8DYbDMMzMNgbDw8Mw8PzNnh4eBmZjMY9vGZsDGAFwMw3/mZm2zNnn5/7N4PBsHg8B4MezZsDwDwMDMz/xhhhmGw/w3hvxhnh7DYGzDGGA8G9/tsDGAZh7DAeMe/DM8/DbDYbA2ZmZsDMPDZ5+Y3s8PDzDNgeGYGZ/sZ4eAeB+Ybw3jNvGezY2YMMBtjDwPAxgYYZn5mbP378YGDbzz9579v/PDMw3jx48b3v95ngeB4ZmGZs2MDYGwzDYeGwDwMwMMzNh4ZvZjMePePZjMb2f5//79hn5szeDMBhgNt/nmPb2z3j9s3ns8Nnh4HhmYYwx+MNgeHnt5vNmMDzPN7b8bbYbDzw8DwMz2ew2AbD828P/Nn+bM2YzGYNszGB4bDzMYbY3sPAPDZ54bDwMwMzwzw2Y9jANgHgBTAwwDYGYGZhm/xme3//nhjAC4AVgGGAbA2BsDDDPM/2zGBsA2GGf5s2GYZsMe9tszP2f5vzwxgBTAMMM/88/YeZjAwBsG9s9+37x+M8M/PA8Mw2eZjNj8Nh5n+zGZnn4f4ZjA8MwMwz2HgeHn78DGxn7Dfj/Az2e/efvP2H5m/D3mZs/Z495mezM2Pfj/PNvee8P/fvPMf//tm2/b22f+bZt/n7H7f/sw29s9/+//828zM/ef+//w/f+Mzz2P9mft+G8/b3mP8zeH+e888NsYbPA2PM29vMz3jGHt4fm2/bzP/PY8e2//3meb9/s/PeDbZ/78b83mYxj///z/3sb3+3vb2Z/vfj23v/37fttn79s35jH5vYPbNvB7f+D/exg22z8HmZjeD9m2wB/n7AHnt7AZnhsZg8YzNjAfn7GD8xtsfnm2D3vP/MfsY2YbPHtm8xv37Bm9t7N7x55mzbeZm2YzNh73mY2fnm/Pez3/n7Y//DN+28zez8wN794H+34bzP3+/Yw34//GzwzNtmewPe/YbG2HsPz34eYz/Mef5h+973+MzMfmxs2Zv828exh5+3tvP837/A29/gGP3+B/h7YG3vYwPPNvAN5+2G8/8Nj35gH/vw9v2z9jZmB+95h7bZmB/hvwM9+8Pf+wNntthmfsGMM/2P9m2M9hsDwzDYeBvDxthsPwx+w2ef5sPNv97Z+wMYGHn554eZs28Pfs2M28eGMPMzGZmbMAZjweDxmNsYGMAzMDZvN+N7PNmGMDBsGzzzYZmbwbY/MYHhh/7xmPHvGeNmDDGPwxgeGfjxjGYPb3jZjb88YGw/H42NvAZg9j8MeBgDxjGbbMfjAzA2B4Zmzwxhh+YPNt4zB4xsMBmAHGAxg8Zg8bxhvMYYPG2w3nvDeYww/wN5+BgzG97A2bPA2AbDMNmGzexhjMPMbN+w/8zzx734zGM2YHs88GY23mzGzYeHnsMHjbxmNhvAwGweDxv2GMZsxmZm8BhgNsbwZj9mZmzBmDwewGeZ+bYY8HjGMwGYx5vfjZsx7Zs/ZmMMAeDYxjMYYNvHgzHjNt7Me/2e/A/AxmPfthg/fvB78MZgPBjG237B42zfjDwzM2zH5h/7fn5/+Y2Hmw2Gf7Nh+H722GDeMPDN7NvZ5sMzD29jzZ5sMeDMbY3jxmDwb8PzYzbNvGzePBhgxjYbAzzGzGBnmM288bDGGDxv2YzGbY29vHgYNg83h7888DDYbbMePMZn+exmNjYzGGMebw2b2ef7x+xtjMYMDAePYwPDM8zNgfnn/vY/bAMYAXAMMw/2YZ+G/2YDDBseN42b9vNhmeZ7bMz/Nsw3mbPYw22bz3s2Z+bPPPPbP2eP82Z5geeGbYBvwNh4GfmPDA2bDPYfvf/+z3t5vNjzeYZn7P9veYbA2/wzx/+9jbx/+MxjD/GbMP8xttn43vH5/t57DGwM3sYbZ+z9vfnnvbNg2ZjeMZjbPbxhngbHv9nvMxt+B4PMxjHt42eP2eMNveZhjeP3/7bH/sbA2MxvMM/Z+Gwb9vZ+/f/jz2zGze22Pef7f/m2Bjbz9nvbfmzP/PNsz89+Px/sD/3mbGzMbbbGZsNg9sbGb3ts3s3tjZm35+Hj8eb8/M35sebHtmbMb28/MeNng3m2bHh7Zt4bzbPHtnj3jb3t/m2Y9szw23sb8f7PMbzB54PHjbY97229s/eZ+HvGwebZvPNt+Nm2fjex/jbz/Mz9gbzAfvY2ezbZ/s3hmzw2f5nt+9jPYHjMHv95t49sGbYG3h4zb97/PM2w8e8N+bDM2GzNvzYHjwPeb/GZhszP8D/ANngZngbPDzZ78f5m3+G37eBmYxvz/3mB7MN+B/m3ht4e2bbbD/Nn+B7zYeY8zz/MYx+APGNj9hsYbD8DNhmB5mzHjYBgwDMDDPw///YbbwxmZjDYGww2eMzDPPP/8MGZh5sDwDYYZjDMMZmbzbz9t7zMYZgMDzw/A957DM2eYwPDzNjNsPBhjDYB5mG2bxnjYbH4bA/D2wMGZsZgxve9mPe9hg9sZ+zHjx49s/PN5m2zG9jA2Mz/zYYzDbDYeYY/YwMBvBsPeGPGYMwGzeewNmGBsMzNhgP3+2xmP/MHjwbbGGxsDBhjH5hsNvMZg8bA2H+bGHjMMZv2eGe88YeewMYzxmMbM2Zhj8ZgN7DMZgMxje2bbPPMYeeBsDPNt5sZj/zY8zGGw2BhmzzNs8DNmGDDzzw//MGBmB4GGfgY/x5s9+2w/zMDZgGYMMPYwMY3jAwY22GDY3mN4/zBttmNjY2x5j289h4YezGYee2YPGPGGeb3vYb/Hg8Y2GPGY9s2f5szbDPNj294zB49thgx7z8GYNjb97zMYB4eeYfn4b8YwMBgYDbY2GMDMPebAz8/bMGzGGHsMw8MzGB4Zn7Mf+eGYbPzYzGGez8wGBgDY8HvB48/Dftmx+M8AYYH+GbYb2YGAwMPeYzDGYf4w9mYzM9vNmwYBswMHhjGBjBmzP/D2eMDzDDGZ5n5mM/P9sMAZsbDGDDZh5tsZm9+373sPGHtmwweMZjwMM22/PZ4/DeezzzbbGB//5sbGbZn/n/t7w9+2ZsfmZh+z8w//zPbexsz9+b3nv9s2wM//b8z3hvM9v3v3tnmbMM3+PbeeeN7bNn7xg8/M/x5vYz9+Yb2/M2eP8zb9j/zb8e3s89je2/Pb3j/9/ve2P3tn+3+Ntmb/2z/Znvb/PDY2/x+2ew2fsbZ73ntvz/e2zD2222bee9557/9vNtn7ef7/29n55njM95tve/P9/jZ+8bPP94x7eN//vHvebD8Hhmx+e3+e2ZjHnn/7f4/ef7Ge2wf+e3/jYYMbxsbD22ZsBnv/N7z8b8w9+9/v822PzP2xv/PGzb9v/zeN/4/e3n+eZv3v8b3sb/f7zM//3+eb/9vN7zbP3je9s37zYxmxtt/t/s8e9m89+Df+eexvPZ+eP2e28e/bzftjYDPeePDNvYwYYbe3+zNsY2Z/jzHhhsft/n72Ye2/Zttt+G2e/bG82MPbzbPPbft+Nn7f7N5+23+/A/9/tv9h79/hjH7YwMGPbPezMMGZhsM83tj2z9jDbDYYYGwwMxsMGz//xhvG3vwwZg3gNmbHhnmDDG2YYMDwxgGZ+GYwze/HmMeG/DHmNmYYMxmPY2bGZtjDGMZsbMe8ftmDwfmDxnv8/8NgYzDN5hjA8w88we/GzZ+zYz9m/zDeG/BmGMNgDz/8YBgeY/GbAw3gxg/wbezGx4x5j9gwxsDNmAMNgA8AKYZmww2D3gZjMMb8PPDb2beeAzDxnt+Y823mMw3mw/9+eNjZtht/7NjNsDHgYwzM8MBmAM9s2zP9jzGBmzYYxt7D/DGYZjAwM8N4BsbDAbftmDD3sxgw2DZvPZveb/MPDz8PBnszGMDB49sMeHvwPDeGY8MwYYH4/Zm2Y83vGeAwwMAZjbBs88wbxhnsYYDMBsBjGNmDMeMx737GG82wweMeef4MMDBmbbH+2HsMY3+z89sM9ht+GNj82bYDMYDzBmD3njMexsx+DMPfg8f5+bexgeN7N5sGBsG3hv/2PeY3hgzG2wGGDBhnntgYwGYbYMxt5gxgGNsMBse9+DZg/YzGN48YM2YYMMB4wbDADmDGDNvxhg8GMGGABGYAdgxjPebxvYM9sw28DGYBgweeN4Y8DxhmGw/Ns8PMw2Gb3gzzZvHg8Htm8zz9jDMGHmwzA/PMZmwzN5h7bAwYPfmZ5sPB4bPA9mGw3+YGZ4B4PA/w/MDxsA9sN7A/MDw2AeYz3gbeG2z9+Mzw9jMx5mPebB7zxjPbGHs94NvbGf7B7H7373m3s834Ht+e37Zme/z8f+bezYwef5hhjPYzxj2ZmwNmYN+3t73ng2beeGezPZmf4xvPMeZ+/G22bbw2P8GMzwxsbMb2MGZtnsYZvN7ezN557xsYz8bz23/79vxj2P2z3/nj2fsMfvMzft+H5sNvz8ftmfhmH7AzNhmG//3782PA9tnmbb28bPbHg2zz2beP223sbDNmYMGbY3sbzfm2bZhjG/P/2Z+PM/Nts22Y8Db2GGGHjD3hszNm/beBse9+8PexmZgbfsw/e/9572MwNvDNsDYfjM37//3mzYzw8fvZt+w97M2z88x/+zwwf+H+e34DM372zPzZnszNmx+MfsYwzAbDwG3gxnjY2ze9sHn+9s8ZjYxsMfjB7xnttmNmx/jwbHm2xm2e9sHtjxsH+PHjw8Bs8HjMG/bGbH4MMYweBjGHsb2Df/mbZ7Pe34b23tm2Bg2YPYzwe9sMwYwD2Ztm2DN7ZmNmGxhtsMDN+eBjZnng2bD3sf5tmMDYGZs2AFwPMzw8DDeMMYwxgewDMZj2BsDDPMzMMYGYGGGMDDAzDYZgZhnh+YYYwwPwzDNmY8Mx54GDZgwMNh7P8DZsP8MGGBhgzANvMPGbbHtsPbPMz3hvDGzZ4w2DMP8Nng8w37AzBhsMAzYHmGAbYG8YxjMwPMMwYeZmBjf+ebYG83jZ4MM8YBszDYG2YGDDw8wPGzZsGwDBgxnvxh4NmYMYGbDA2bYePYbxmwGYY2MMwZ4Hs/95sMGGGGwMbDG/b8Ge294BsYbzGbAYZm8DYMDNhtsMBjMGBmze/D2M9jNgwMwMAYYYYzDbw/ZmZ4e/MwzZmBsPMDYY8AOxvzYGZ5gf+xj2Z4xmGZ789gY2DDZ42bbMYGMAYw8x4DAxjbGBjMHsfn5szHhh5ngezeYPGM/DeDDNnmfg22294w8HgBW/w/Mw8zwzGGZ7wN4fjbzZhhnsz/MDN5n5+wPDwzA8AxhhhjDMDMww8MzwNgYHv9mw/DNm8/8/M3hgzGDNh//mz94GbNgZ5+2bZsMMYYxtvePGY2YGN/mMeMwDe3jMzzPDbDMZjx42w3j3mYwN+DDzMeHsDGDPefhmM8NgZm2B42YbD82GNvPDDBm8ewxhjAfgbDwNszAZmGYYMw8xvMPZ+MDGwZ4MzMwzzMeYGM2zN72bww35572GMYDNvxgY8Y8wzY2BsGbMDYx+zMweBn4/eeZv2BnvbbY9vMx+3mZswb8PZnhsM2x/hn/+BmwYYZsNmPPw3mb/3vfsfvP223vebZv//Zt/vee/DY8/zPHv/bz2e2/zz3nmxsz8xswDbM/M95+wMeN/g/bPw3t+bNt/mww289jx/htmA22Zmwfs28fsZm82wzzbPPexvebYfm82xtnv2w3mG9mZm3je/fvZt+N7fs/NsY2H/sf7Pe2ZtvM/b/8eHj9vPbbb3tvbPzx/vZmbeYNv/Z7M82/3+MZ7Hs/M28N57zee2/8PbZ7PbNsz//83t79jzeG/b/PZ49vf+fvNsNvM/MzbbzxthmwzPz2Z+NvP8b823htht7fm/GH4Y/22H+zeGz/xh5mfsZthsZjGPe229+f7PPNsw3+9ve28/wZt+/z229mef+9jftt+M/xmft/m3mzMbbZsf7z95mfg2237Zt5n/v82MZsGPxjD3+MbP2z2z3t5+8x72f795nt73jPG8/M/xjzzG2zxtmZ/5g2eP2bMf5t4/H/vxmfs9vZt+PeDDYPPb/GDwz2AZ7Mbfh5jPbPB4ZgNthveMZjAwDD8Hnjwz8wz95gzYZmMzNh78HhhgwzxhgHvzwMPeGNmAzAMGYDGzGeMwx/s29h5sNgYB7PMMbweBsMze/zYwxjAxh4Yb2NsN4zA2bPbA8Z4eY2bPeYwzGY2b342bMwzHsHmzzDzAGBgxszZ/4exhjYzBjGYMwHsG2Z+Dwzw3mDMDeBg8xmMZhh+HhvMx+PAMGY2M8fjzGH4bBs9meMYbGe/YZjP2BjGbwDYA8PYzGbeD/Z5vM/AzMG9gxgw222YDeMZjYMY3542bY/Yz8N7A/Z/mD8bN5+35vZ+Df+efgeNm2YwzDAMDGbP83sbGbebAYYzDGAMP97AxgYAwBjDYPDGNgYfgZjDDbN7bwG8beeYHhh5sYbwxhmZj9jAwYz8xh4x7GHmGwbMN5jGZsYwxjH42GNjHseDDGA8NszGYb88MwGY8GBjAbAxvGZ+zGAzDw2zPMZgMwY/GBtgf5n+GMeMzYMzbPYfmPDPYGBsDGGZhtmNhn4eGMzZjA8DPDPMYYGY8w8M2Z5j8MGwx5vYYZs9jMwzDMzAZvz3hm8zPMxsYw2ZnjMN+/PN7wzYYZjz2BvYbAxnsGYwzANgGBgxmeHjbezZjNjwYYPA3hg8DBjMMY3mHjBhhg35j2z9sMNsMZ5jMGzZgGwf48x42wYwArGMPzbbGMGzHj9h7Yzx7ZmxvM9vM2M/2GNhjPGNv9/nv9+HvwGzMPbN+A3g/Z+ZsbDPx5nnjZvHme379h4zDeZ7Hns2N+8ebeHmP9j2bZ+wzx/4N7M/bzNs23gbZ489/7MHv/z8eH5482NjxmbB5sHjwf42DxnmDwYZmbMPe8M8e83sZtvDZ+8w8D2w2e2wzbZ7fs9vb29szBjBmZ7fs29v9vB4Mx5/t/+2M/zYbYxhmw2MzGDfs2/PP34b2b8P/23jPGDYP3+Zn55mbbP2P2/Nj8b23jzPPM95mYe37bwzG3+N+PNt7zfnt4bPbZ+bD9h7PGb/Zn+DGYGezHmG3hjDw95mMYHszZtvNtm37M2ebZt+88PPM/A/Hn4bNsM2f4N5jZ5t4w2w/PHmDw/YGZ55vM/x4e8P2Hjz3+G2/GwPPM9jw2Dw2GP34PPf7f4b8GGbf+zDeG89mzZ5/mzDDZg22Zsfsb2xhmN/vDGzzDNh57Mw8zHmbGZ/4bBh42YeMzPxmzD2GYzPD9vbAwbPf7zzbBjPeZ7MzGf+/2B5s9jA2/bMxsPxmezG8/9mbPGwZ/sGeMNgGzYYB79jMDY2bGw8xgZ5gYz3tjDDNhgYGMDDwD8PMMNjPwwNg2ZgPx542eP8zZgN7MMH43jeNjM8Mx55jYYzDeZjBmGzNgY2BjGeGwbNjbe3+GDAwMx5tvYzDNsM94bPMDxmBgYPDMxtjwBgZnhhjeZ4/Axsw9n5vPZgw2Pww2DM3g2DAxjG8AwYbGPGM/PGAeeZsDBg2wweGbPxthmBmGYHnhtswbNveHvMwzB+Y2Bj2MHgMDYNvPx+2PwbPGw8w2zGGZjfg3vYZ7GeGHhj/D/bDBmDDYZmww8DM9geB4YwwwMMNh4GYGAwwMzMPNh/nsNvMY/BmGzGzGYwMYeGBmPMA/MMeZgDMDzGGwZhsNjDP/YBgwGZhhsGHhszMzwNsDNmAe8MMbZs9h7DACmzYbwPHhmD2GMzDNjzM/zAMYAUMMZgbBnhhh4bDDGGB4bG8ZjDMPDBnmGeBgZj8zPHgYzPDYwNhtmGZvA/2MA2A/NmGAZh4eB5gzA/DDzxgZmYeBjD82/2HhsNmYx/+PD2bN5+wPBsNvbDeY/DG9g8x4zxvx5sYe2MNj/DDwwwzD/zGDGBgx5mB+YY2GzzANgNhtsZs8/ACsAfg9jNvNh/4eG2YZhnnhmGB+ZnsM8x57ZvwxsGM8ZhjGbB4ZtmMHsMzDGwPDwzYwxmBgZ7bPMzMMDMGzZgwYwf/mGPDx+PDzGBgZ4YzzeMMNjzAPN7fvf+9njZvGDZmwDDP2/M3+Bjbbz2e82wAo2P8fn57M9njbZ+2w229+8/zeY35tm37Pze9+fn7GMf7PeM2bwz//G/3h+eNvP/9+2/Zm3szbebG3t/tt5tv9ts/H4YezG8G22H7x/v2Pf72/2DA9v9tvG/Y/GP/f+D/N+x/+b2e82957G9t795+M//Debbzx/+2295mePYft4ezMGN+9+/zzbNve289g/Zmb3vZveext7fvfv8P3+bBnnvN7/GP3vPb9/55//49mP//2/zb3+35v/3m9t7z97eb/zb2/Gz3vzH+fn7f7/bz37Pz/M9ts/fje3+22e/zH7PNv9/vbbZmbb/xj8955///v/2//A/b229t7GYbNmbbwbPDN7ePN7bwe/M37ebe35n5/jZg/b9/v88bbf+zxtjMP3vx/7/2be2Bt/5tv9szebH/7P/bM3m2PxtjPN+Zv9/vM29/v3+bbHjf+28zNjZtvGP89vw95sf+YzZgGYDDDwM/Gxt4w2B5swzeeGBjGMYHh5mGBsMB4ZgYB4GMDDw/zNgGw8A2HmAZhgYMDDAxhhhjwNsM8DweGYfs2B7YzDMPPNhg2zYYzzePY8bA2ADwwMHjDAbGwYH72wZt7GM/ZvNh5gw3j8fsMZ7GbzNvwbwDYeMDPGM2fj2bZg/GzDeYYzB4AzAY2MYGGNjZ4DZsMbYBjxt+B+w/zBngwwZmzNsxmDHgbMZjB5sfjBmPDbDMbYeAHMxjDbDx7MwexmDMbPeew37zMDBh+PGzZjewzMNjH+9hvbBs/MewxjBthm8Nt4zG/w2N4z9sbZsGNth7DYBjG3tjbHjwYZ7DZnvGzMzYbBnhjDeGPDZgb2w2w3sDBmYGYwwDAYG3+bzGbDAwYBsNhhswH7DYb3hvzN4Ns/AYAVgzGAY8NvbbNgYwH5vDNjx5sYb9gYeAbB4wxhn/m97f48Y8eH7we2xjAwZjM8wZ42b2PeeYYM29vHt+zwxmz9/t4zA3mYYDYYGw3gG8Zjxhsxj/MbGzxjwG2zGNvGMMYBmx4MY8bY34YNvwYwNmDbbwBmDzHsbG2YweA2Bg2DNmxs2ZvMxgzbw2zAYZsMewzAGBgZ54ZmYxtnhjYZmG/BtjwP8N42w/PZg2D2G2wAozeMbBmHh7bGY3jPww2/Y3gP8x+zeHtgfnhmGZt5mzf54w3nsNgMz3v2MNveG/Bmez2PDDDYZmzfmx7GZ+b3+/YbzZ+8ftm97/bZvwMzGH72bM/bNn5nvD/3+/ftsfvPD3g/Bvb97D9ttje37xvD8zZ+2PYw94Ge/D37zDNn/mYzzbDbZts/e294e/Z7zMxmxvM/2f7/w35+9+PDb3sZtt7MBtv8ez2z/bN+DDNj/D/2N5jZtszD2e//9mP9j/YbY22PDMe2DeYN+PGx49hhjZ+/Y8bH4we2DPYM/BjZttjx48/P3tvbHm3swY88x7Z57Z4ebNme2PbbYzD23vG3g2Z42zbYzfm8eNnjbM8wee2xnme2ezNg2eN+PZjzBjfj9vZjGew8x7bwfvYe2GZvxm8M2z37Z43nt7eB+G2xtjw8MwGGGMD9gbZtvDYPZ734e/bw3+bGbeHtgzPY9jbGZvN+23meHmZvYeN7b282PNgM2YzDY88Bs28Gx42Pe9jGZsefvN4Gx4z2282N5/vfvxts2MPGw2DDGxhtsM2N5szbMHm9/+GMZs23jeZmbYbeGbYGYHm/N+fvzZmDYZ4w/w9s3sPeebN7Yzb9mwbfsMzYHswMGGe82PAwxhg/MMzY8PwMeGYMMALswPAZmGzM22Bm/z8PMP/efmZmAwDGB+w2xge9jNjDAZhjA9mAwDMMzzw3jfjPPDM88eZnhgbHjDDN48PbM8zMB5n5hg9n5mwzYGxj2zNgePAYGe3thgMMPMxs/NnhmzYZtmYfhmHj2PeG/H4YB7Nm8A2PACh5mYePzA8w22DYMwbZ4exhmMDGYGzZ4HjN5/h4B4zMMA8wYe2Bjx+NgbGDMYMM2PZv8ZmeGMMx7N7MYbZ43jePAzD2GwBsDwbwzwZ7BvYYMZs8YY8eMwZmPNvPGY/xjDBt4Nj2GMwe/DeGeH4eGZnj3jYZhje282MY2Y2eZjMbzM8GGAfmGez2YwwZvGZjYMb/YMwNjZjA2GbwM9sMM/DbHmD/NnjMbx+G8YGb8xs9mPBmGfmeGeP8PDGMzb2GDP/3vPYeM9h+Zs8eGYxmMxtj2GYYZhmDPzGzz8e8MzMGYeYfhn5mAfs/MMZjzfm2BmeB4PDM2PP29h5h7De223j8H7xsYB4zwZs8bAxh7M3n7Yb9+wPD37AMeMbH+ZvB4eYxvBgDbxvGDb9sAZg9g3sx4NsMGweM2Y2MeBg2x4MMM8PDMPMGGAFDGAYwPAzAMGBmGGeB554bNhsALgYzGGZhvPzMYGwwzHs/8Peb8BmzGDBttn48M/DzPz3t/5mxjN7zYz3n48NjDP8Z5/m2z8Y/zMzx+Pb22bbMNjx+fnm2G/GewD37wwPYM94G2z9h+GY3hmzbzMeMz3sZn7Me//bb8zbw2MfszZvz9szbezz9meM28Yez95sPPPY2f7N4AA8MABEACYA8AHgBzBvAwYMbD8fm9tsz3+N7PZj8Znm8xjGezbzPz95mPY34e8H7M3t+P8zbP2ef/m/D237ZsB57A9jZ7x4bG82eP2beM8z8Gz97bDbDH4MbePwf+bx7Y2e/Y22/D29tmezBvMebBhnnmY9v9jPbeMZ72/Pb9n55572Y3vwzb23/m8Pfm3m/2PeftvHt/mz82zHsfszxn/j9hn+PMDZswzGZsYZv/3sZt5+zZ5+DMzw8bYbYbbZ7fm22e/H7G2f+9n+/Pb2G82/PeN+2fs3tszN+Gxj2ex7GYbYM/f4x+xtjebPGPZjz2e3nt7M23nnn+PxmGG/e2/Zh+N5mYeDe9jNhmz8xvb2wezGGfnt+ZvPbP823n7PzPN/mG/D9+29g35gw2w9hvHmxm/PZhmPxjGwzPG/z/89vfswGZ4GPZ7DAZ+AzNgGw2Y3vzP2Hhh4ZsDx4bGNtmP9/sxnn7A2BsNhth4PAZ5m2YYw8YbGGYMwwNnmMwzYZs8AZ+MPwYG88zzbNvwzDwPM9mDD2ZmYzM9ge2BjM2HmAbN7zMDHhhngeGYPPPGBnm83geMwz8MwH+MwN/4DAxgAHgAQgAB7AACwAB4BjAMYGHhsA2PN42YeDGMGBm/82GYbw8zzNs/AMBtmw/e2NsNt7wGePeAMMwYY/PZjA2Ye2NtmbfmZhsPM8A3gGZsww8N5mwMw8MYBgZnmY8z2xjM8P2/N4xvwbGDZswww2PGDeB5+2bG83mwGGxh48PBn43jH57HgxgB2fmN+Yxm2PDMGBgfmGMN7DMGYbAzM8DwzM9me/DDz9tthnnsbGfvDfnm2fszxszMDeBv34GbNg8P2MwzeGYbw8xhgw8PMzeD/35jwwPA9mf7G9mGMG2B5mBs2G8PwG3hgwNm8weNvBnmz2w2eDYxnvMwGYw2eGG/PP2/PMwMYZh+2G3/mGxmPPxhsHje8YYwN7MGbGGYYeAbMN48MeZsDH5mZgG3gYPGPBhjNgZhnmMbDMee22exjxjGx49hh4YwbePwwb8bMZ5+M2Nm9jPGBt4xmPPDDwxn5jGeDZsYMbGbbxmbYPePMbAZsfj9+H794xmP2MPMGexmNjAC5jx/ts3jM/bM283vPb//zY3hjbMY8GPbBjNszYzw/22zY3mz/bPNnhm2/G2b2eY2z/BmeG97z/GZmxj/3h78GP8Pbxns8bM8bY9mM889mGzYZgzD/DzZ55/m29v9mYYxgeNgefjA/Z48bZsYANDABWBgARgDDAbGG8wY37f+Zs8b3mY2bbxv8MZjBhmN+89mN/nvwb8B7Me8eMYzMx579mbY8xg97/B5mMYfvMbef543sPwzM2eGz8Z/m/beG/8z8zMf7NjZsP9+e9mzM2GeH+w94ebPebfvHmAww8/83ntvzDeGN+B+94ZjeD2zPx//7/xseftt/+2/GP22Gb95j9mYweGwN5seZ73mZ/vP35s/w8PN549v/BvPZ+37e9mH+9/7GePe8bzPfmDwMYM2xsezxjxnsPPeeGfths2Bj888DbYb2B54bNmMMM97bef+G/PzbbHjZ7PzN5+/xmwePM8/3jxszPMNm2zP2Z+z8/Pz82z34fsA22B54fs8834e2fts9mZmzf7z/YzNj8wPzzHs2YHg/MezH+P8bzYzMGzY2D9h7Ns2zNt55sYfh/tmxvxmAeGMZ4GbDGHjDB5tmDDGGfmYBmMNgwzYb82GzGM2e8YxhjNmD2MPGG3h4YPbZv8YGAwH7YzeD2DzZjMGeP8HvxsZvw8PeGweAbe/28w28YeHnhgeY9+xjzx7bMYYZm/DxhmDPGxmHh48DDYbP8wPwM3gwDb97xgbAzAPewDAwACoANABSAHADjGDY2YbPYB7wGY82YH+DeAY2M2Yx4MAz2YxsGYMH+MwN+GZmB7N+ZhhjDHs2PGfhvHsx7978ZvH48MYDe/BhjMZhj8xgYwN/4bGzMDN4Gw8PPZmGzHgwwPDPzw8wPDz8zzbYYzzfvMbzZjPPGGNgzD2BseMzxgeGZm9jP9sPPwMYMDMMPHjMMxjPw2bYZ5swGM8ZjYbZ5jYGYbD3szGAbD2zYG/MZ+94eGYewPBgGZmeeMHmbHv82zPM3+YeY3mMG3mM2bNsPN5j2zA/bbG22Y2DMY9jA3jYPBhjMfvNh+zPMMYzbZ4YYHmMDDD8A3mDMDYYGM/GGDMZmGZgw82YNngYwN4zwebM2xhgeD83j2zx4YYB43n7DeDzYbBjH4zMzMDYYzDeZmb2P2Bj2YMAO2xh7ANnjMPAw2BsZh4GYGMNh4YGbYYYMPAMDDYYGGYZgH4ZsNgGZh+ezYPG2bYwwfmYDBjNgDYG8YzN4zY3+DeDN4ZnsMw2Ye8N5hmDw948M3hjDxngYYz3nnj/zf+bzxjbeZ42G9vH/n7GGzZ/sN+9gbf49h/7HmzezPH/h/n+/fs29+/Y9t+e35s2P9mbPP9tjY/z/8exvzZv9+D8Nj2/2zM/e/3mxjZ/nn/mx42ftswYD/MzABrY3me2ebG3ntv/f/7xt/73meeG223+Z+3vGPbGzN5/4/z3n+/wYf+2eY9vAY9vfn/+PDD22/8Pe3vYz3/788NnveZv//fv/2A/zfnjbzGPZvbPbzPHm3h57Mz288YxmeZ5t/nmbe237Pbeeeb/GzbzA3mwY28x7ef+//28Nm3tjD9m2x/55h/vfmbM/22zb/8exntg3mbH72PPMzPGMbNg2Mbz83t7B5nnszYZjwxt+/Z/sz2bP2efvzZ+3vzeYw/bz95+xvPzHhj9tvbP8/zfsPz2w3/v3ts3mw3t5mbN7fjbMMPb/9s89mfmNv88PDNsH7P8z/A2/H7NvGzDAz2PP88ezbbPM3vb3nsb/2e2P228/b3t5mZhs/Nn/n/sbz3428zz/83s3+e8zYG2G/AYZgZ+YZmZvN+xmbBjDZm8PGGMwArZ5mGGbYMZh4GGexthmPePx4YzYe2YMMY3mZ5tnsGDe2bAYP2Gx4bDY8eM2MGbzY2zGwPHhmz8xg94ePMZsbGzBhjNn57M/MGGZsbbzBmx4zDA3hsw8/wbeZgzDMzNvAGYzMw8M3+D2MzD3g8H7GbYHs8DHngMzAwGGGZm8MxmZswB7GePNngw/GbDMNmG/A37eDMbY2PAxm8HjYNgMGPeMYw8AeHhmeMPMGYGwxsDw2zxh+N7GPYGw/YGNswew8eP8B4YB7M3mPGAzDDMYexmzY/H4bAZjNsMe8MZh5mP22/8wD2DMfv8ZmHn7Yz2Y/Gw3hjPDYZsP2Bs/2NjHgZhmDbPMe2N+be8Zmb/GzMZjDDYM/8Nj2xmxhjHhjGZvb9hmYwfhtm3vDZsbb2DNg2bZsweA/BsDe97MzB4bDzNmwbGGHgMY3vG2MDB7YbM3hsNsNvY8D2xg2PbMDY9hsMB48AOYbM2PwZ4YBnh4GA8NmZ4Mze9h4wzPY9+Y8zYGYwx5nnv8bZnmYDGYbMzDbMzDYBvbNnvMf7N4//GxhnjZ4PD2/Bjw2b/GGZsMz8wMPAMzYG883gzM2GZmzwZ4GbZsNsM95mMN+Df4wYewDPezZt48zYGYH4f+9gzzMz82M9h/mz8beHs8MbYG2zeZmeZ7AzYYebD/Dfgf5sMzbGHmYbN+DM2f5/789jw9hszGzDxhnvbM3/mzMZnh5mbe/YZvNvzbPbf43mGbw37PYN7DbD22PzbBs2DZnh42M8/Ye37ZmHnhtt4Znh+M88N5h/t4b3n/gw2Hv9njzDMGZ48/MebHj2Meeb8Z4Y2GbM9jN42w8bHvAY8eY372eweMH42e/bGP3mf55meeGZt7/94bG2x/v/3+YzD8wYMzGeZjYGPeftns/bDbxmeP9mfv3tv2B4/Y/PPM95jGze/z8wzbZs34Zn/tj/2M82zNjDPGYefv3sf7DZ5nvZmZtmPew2MzxtnmeN+/YPPbxvfs37b/eY35g3sHjGD9vDbP2/2bebHsbMM2zNsM3jPw//PZmzx7bY28Ztj9/n/tmMNmwNv972PG8MzbHvfh4Z+bGZvYef/nm82MezNtmPfszzzPz/Nh55s9j8zzP95v9n78Dz9mZ7YbYz9h+w2bPHmx+22Pb3722zxs3m3se/83t+xm/PbzPexsxvMez/bbP8zweZnm2YbPM8wGZ/ngPDZ+zfgzAwDMMewDAMMYeGZsxnvwPBmMxnsAYYHsAwBhsDYYM//GwzDB+ezN78wPP2wzzzezZnmw88zbzbYeD8MYGbM29geD97B7GYNsZ4ZnmHsPAwMz22ZsM2H5gYwwzYGezDMA2YbDZ5mwMxvGbBvxmwMzPM/DZvYM/wz97DDDw8NgPDbx7MAxmMZgA0we8A2Z4M2HsM3jDwZhmZh4GY/M8zAN7M2Yzf4Gw2bHtgbe2zGH5s8NjBmMwe2wbBtjM2bHsDPYefj2YYGYGM8xj948x/hmzZjN7fng8ZhhgbwN5s3j9sZ49jDMwPY37PeHmbPz2xvw3+efv2ZsNmb/w3sbBm/9mxhg/DA8zAP88YGDP82ZhmH5jPA2G2z2HmYZsNvD2Gf/gf4eGwDbP3sx4Dft4zBvHmGD9jZsA2D9+/wbMbYfmGwPeHvbDZjNhm8Nv9jHgZsDA8AfnszDYNjbYGGZ4bfsxhmZ48/NsHmeYYwbD2GAMZjb/3mY9mHgzB+Y3hngZgbDYZgMMDMzzeBj2wPM35jAw3n7Hj2wNjNgZsNm8M94eNmYPGNn5hmYbMwbDNs9hv8wPw2Z42GHgb8NhmbDP/f4f7Dw22GD2ZmBvDM83mfmzG3vBt+fsbebGM8B5mzGGZg8AKwAptv9mb94YGe2/Df/jDeG94BjPAzef7/DMbDHmGNveGZnhtjDebY2H49mYe/8Z+e/DGe28M2829szw829tvb/b9v37MebMNs2bZv/Nn5mb3thm8fhj9m9+N+M9n7zNszb9t4bz2Nt5hmbNveMxnm222MNv3mNvN7Mb29m/3vb/8x4373+/37f4/2zN5v2beZ+8fttv9/vY8/23+G9vxm/fj2/PZsbzzP/9jD/2YY973+P2x/7zzb/Z+28bPeZh7ebx78P2H/jz83578zZvY88zDezftjf7bzAx+3mGDee3hmNjef/vD9/4G/2ee83jM3+2e822fnse28x4fm8/w/PbGxjM8f+3tvNv97zP88Pee9nmH5v2bz973nn5t7MMz2b9tv97bw8e/9+Nsx7/83vG2eZvNm2b2NmZts35n7zw/YY2zefj/e/2/3554//8/b8b3+8bzP3mzM3jbP3v3+M3+D28eGe8/NtmMZn54282/2fmGwbbZ+//Pw34PGzY88829nnmzHmYzMzGZmGw/DPz2ZmwzA2GB554w28wZmZnn5mGbA8MeGY97AzMZ+wYGGzAw8xhmebNmwweGY82f5hvbGwbMPbMzZgzMPPGBm/9sHv8PGBnsw23jDB7NgYPDD//Bt//n4Ywx7YwxszZ42eGw/Gw3szP8GBvGzM/AwYbbA2xhsNgHsYew8MDGB73tsbYbePMzbP8bwGPAYDMGNgZ7ew2DN7eZ434xsYx4wezNjw372Y8zbGbYbMbYMNvwNg3/mzDeB48DYZmwMGDM3gzGb8GGG2eef/4NmzYB7x72Z+ZsxjGY/zxmD/wNjYZgYwxmDAwbYxjYbHgN5mYMz8DMw88x5jZmbHn+zZ+eZ+B7MbBjAxvw2z8/GYzzPMx7Yzee22ZswwMYeZvN57NmGwfmeGGBnth4bGePxgePMw2eDGPeeZjYDMDxjDxv/MN55j8GGGw37DYbxvfjDAwNhsDGZhjMwwYbDAzzDPGHjNm2Ae9h/meefjx+NvN+MzMNmeG8AxmxmN+G3h5s2AbZmz2zw9vMxsM3mfnvDZ5vPHmwxsGYweHgDwZh4zZjxs3/7Awb9g8DG8Y8zzNmZ5jYwwGBmeYYeG89m8zDMDbMbxtvB4YezxsNt7beMMAK2YbA8wb22MPYeGGGPPwMMwMzzN48/DNsMD/Ng2Pbbb22zfjzYHm2YebMx5sNmzbH+wex+88xtm/M/ee3+z34/Db/3t7NsB/gfnj3+zZmzNvNsZnvBn/jePe8z2f4HjwPPD8Mx+GGNh/nm3h+95g23j9mbGNjPez/N5/j2YG9s95tseP/z8Yw94eHh5s355vMDzzHnjwP2Pz3me8b8YeP/w2M/b3t/+82bz/PxsPP8888PMZn55s3mG9/thmPbbZvY/xnts8DwzeebP3m9sNt+/P89jzzZ5/mz2zfvHnnnhmee/82zPw2Bsxjz3mZj/ex5v8ZmeAYx5m82Zg/zbe3+8Pf7PGzP89s8Hs/Z7eexm2w88PZ7AzNsYGzZs2fs837MPzMf7MwzDbeMxgMwz8xnmfh/7zPZ/szGe97eZ+eAZmPM/ZmZ7PzBtt+2z2//z/P9/5mPZs828/zx5s/M/bbwewN/jGz3m8M2z/DMebPN+bPxm/NgeNmwN+f49+Zj2P9jAPZseGbZg3jGbZnjYezbePMzebeb2A2G3nnnhvN/n5nv2Zt/mbD9v9hmMeb/zx4DMx4Z4DPMzDbf5nn57Z/mz3tsGDHvZ/g8D8NtjYYGYHgHh4GweGDMwB7wMGAzYzP8b/DY2A9+wbHmNt+Mxnj8wzN5gMGBsD3g8DfjGwwG2DPH+z8GZhmebA/wMGBs8NgYYG/MDe9+M3nswwMzD8xtsPP/3gHgDYMYY8YxvzPNmMzDz3geAZ+GY2ZswMZ7Y8zAeGzGG8MwzDGGGAZnhmfhmAZjfgzAPebzwwebDNhhsxmGww8ebYYPzDMGGwz2bMPGeGeAZjDAGGB+ZhhsPA2MPDDMNjbHveNse95h4Gfm2fgZgZn+YD3vA9m8M3vP2PHj3mbN55hjMDAwBgYZjwMDMww2HmzZsAx/jYbfmH789+Yw/ezB/n5jZsGfmP2x4N+GBjPA2bMwzx4zAw8w/Pzw8eG3nt4wxjHg2bw35mDN4ZsPY8MbMMxmwNmGZ/jDGGGeB5hnmGPYGPYGw2bM/DP8xgYwwzwN+YwwzD8wY2Y3hmZ4NmeYeGbMYY/PwzPHjDDYeA8NtjYN+G3vMebwwwzD2ZmDDDzD/8DDMMzxnsGGZvDA8w8Nm3g2zPMxjA3hjDwPDPHvGeGGYf4eGYwNhnmbx57ew2bHjMBm8wwGZsNvMDMN5+x79gbMz22ftnsMHn7/Y8NttnjfgMDww2Ae2MMMw8MMz/MZsMbPBtveMPH5jDD8DDGGGezw3gzB/5kIAAAAIywAAC9B94HAkQAAAFGAAUAAAAAACTAAgAAAEECAAAI0kDj8P//////f2KwAAAAAAAAAAABAP8BAAB4cgUAAAAAAAQxRySzDDTjzj0EEkT0UgEkgEkvwNL5JFFBBBJE9A889A9FJA9BAA9ABBFFH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////qUku0ku0vEgEUfEUgEEUUkkED0DjzTCyiRhAkiAEr/Mw35v3mZ7Ye9/mACP8zfjf+x7/f+fjwAR7Bj/B78fm2f7xtvZgAj9/5v2Nmf4bNmP82YADvvHvxm/2MZ/szP9jACMPfsZvPf5//73vYAStm/MbHveDe/fnm/GAFLbZ7Ge95jbN+2eebGAA/v8zP/BvH/nt7/2ACdtvzft5+/9j/N5mACkY/b/ezHj/zbbx7xgBf+8bebePGexjZg/N/gAvMz9/vY9v/Pf794AEL/eNm23497/f+PwAIzP23tvPHtn+37Z7AAlP/z/b3vz9vbNtsAF5m37DMPPGYe9vzPZ7YAXmbzZn+e2/8b3543gBf+22Y3mzPY/2bPe3gAt22e2Nn+2ee2ebG94ALTM82zMwZvbz/97f+AC029+2/DP/3tv3m8AL/9/55/79tmfj/wAVvPe955j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j3gzY/MwzP2/f+b8eGbbMbGf/hsw8YbYMYCgAHQMACsAGIwBeG8YNgbGGMBRgYYYGbMPPxmPAODMeBvP2YYYbBhjAOALAEwDjGzAUYCsAWBgFjYMMzDMZgYMzGGHjM8H5h4ZjPMPzMM/M22ZhmDPbZj2YNvzY82HvPz8zPD2ZsNjwwx7ZgOAGeM2f4GZhswe9sMYCsDbAJ9gHeb2GPA9mArGwPw2Gzz8NhthgewBZgYBJmbzYN5v83nhjDDAxmBtmMzPMPf+xjxvAxmzHs2xht4fQAAAANvNAAC/B3oIUAAAAEAIBhAmBRB1di1UW0f/////////////////////////////////////////f/+/RQWzbf/L7buHSoQYUQGcGQBghx+VAiTgbBYhBUbAWbohEAIgm7SIR2CETFgRBQv0Uaqrkz/5i0sTVNKAhAIIY2B78gChXYQUMMAVAVBVuj9Sj9rQ6u//f3fffn//d//f/bv//e/3P0b6FxCEYEWSY3ZGCwRCK3Q1IxATJFQUSPZt977/++//TRMXzQAAAAAAAAAAAQD0AgAAc1AGAAAAAAAEMQUcggkkooossssswwwwwwww00w00000404040444400084444804840484089A45A4844889BBA9A9A885E88848489BA885A9A48849E9BA9FBA88889BBE9A884845A89A9A9E9A49A89D1ABE89BA9FDtE8BFD8CR7RRARAR+RQRR/AEfwBH8ARRP8R/DUUQEfzJH8DR7R////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////DR7R7RAQAR/EEe0EQEQEfxtHxBH1FBD8JRAQARAR9R7Q7RRQPQQQRPRPQPPRRQQQAPPAQARAQQARRPRRARRRAPRQAPQPPAPPARAQPPPQPRQRPPAPRAOOQRPPOPPOOOQPPOOOPPOOPOPPPPRORQPPQROPPOPPPOPPOOOOQOOPOPOOOOONPOONPOPOONONMNNNMNMMMMMMMMMLLLLLLKKKJJIHFEDQCATbvrrhf3znd/XdVDddd1AJdzvq+v7u+p33P5X8r44AW9Xdx1HUJhMF4pThpQfCMNwfAvnAu4HUPFA5gbwCXBNBm4Q47n9/V1fU++q77vgE37r7h+7i64NX39c+O5zu4BQ/qqn87u593c6uvu76ncBi7jvrvur77q/7u7+53wGOu/67vuvnXd987nzu+AVf7+p1/fU/53Pn93d8Ar9333fO7nfH3ffd/99wC1XffUP3cffDyrlVz+fc/gBz3c+5z+u74e4+d33d3fdwC511/dd/85XO5zuf313ALv191f393P//q/lOdwAEVX99Xd1XcFXffdTv7uuABv59TuCr7v7gZXfdznOrv/gB7VXVVUVfVdwS9XX8J66quAWf5dVFV9zu4p8uv+7urqAWLq+fcq6qv6++7n993OAy1Xf8/v7u7/r+++/gFb+59393fO/v+6u/u6gFj/v+/q+rq5/1Hd39TgBvOqv+5Vf1P47u593d9VOAWLv++q/vh6lVVO77vuvgMt/9dz/767n9dff9wA26qqq+uqu6++/7nO7vuAV+f1/V/3dXV931V3d/ADW6qXVSvqufXy+5/313AKs7+7+qrhcdV9/9Srq5VAKlV33O+vqpSvvvlU/r+Ax/3f/V1PqXXd3yru/4AZd9X93dd9wnr++E/dX3Ku6jq6lfV1cviur4rlcrlcpdXP7ur7riu+dX3XUKnDRSqKpVUdyh4OgzcG6g1C44I+OCWB9AkQmDcBLgDWHgBFAGUF4F8qqF1XV1XOOVTl/z6h4qhrg64q5Xd1Ovu+qqOpRxRdXc6u5XUq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86n3OdXzuOKOc7/lyvnP+777u+dw9Q/Ph+H453f8U7nV1Oc5T53HV1dQ9x93ddT51/U67qdVd33H91z65/3df33c66u7qO5X853f11U511c6q5c+7ur4+d86uKf939911OK6u+uP7uur65RwucKhcL4eGu6v513FV3DVXd3O7n1d3XHwdO7l38+7jlHUc+rijqr5/3O+qr5z6qvuqnyvu7/75XH38pyhq7nK66qpVf93U47q+rnz76upd1yv6r+O5XzlznVx93fHV11/KPildfUq66lfVX/OUPFcruG7uLqquuvqpynHc6rnUd8+c446uUV/dXzqVxSr5w07q7lcJ4eqjq+O7/uG7+cUd91HK64rlFKqjq4uGhpVzqvruKFcoNQm4RqFQVQdKC8EkKgrgtB8G4OgR4JYIYHENKDMPCMIQMbg3wqUfDcCvOBlOB5HAhOCa4GVwbqF8De4Q4EBwQZQPI7hGEaj4NXOUDCD4IMF4CbCoXCEF4K7hUF5wYg18rvn9ylc/qvhNQ8oV1UHzrlOdx3Ou58PDz+59dfdVK+5d1fX3fK453Or6+ql1FHyu77l13Lvv7n877hpw9zq+59X1ffU+v7uVfX3Lq53K+7juV311XLjuXF/Pr/vuV8+v776q+dR3c7n1z7593dX/Xfcqq+r45331f853dVO7ufVT7+7uurnxXd1z7ud9dTquq753xdf1d3Xf/X1XcVzuuOuo+uPnKHnXD93Hfx38+dR9Th6inC7q4QudQj/cNPvhuHv4evh+dT5XOo/r7qu5TqfdVfXdc7lc+fd111f3y66/uq67qvvuuV3cVXcVRfXyu6qdX/f1/Dc/5znf3ddX9X8/59ffcupRxSuGq+7qoXOrq6r/53Hc513Xd/3Oddf138+7q+rnd8q7vur7+7qc53dy4/q67r7l3Vc+d33KXz+vuU53Xf3d1d3K587+r7r+7+++qurnf993dfdVd9XOuv+u6q/i/qupX8py5f/XX3X3119fdc7rnUrnx8f876+Hq6ud/d3yu/6lO45/dzudVOcLhMDGC8DOCfud1c+LncXzupS6n/Vc6vudxcKhCBfcHwRxcHwqBdA1qHgawLMEcDKdQagzA5gxArQKsFUoFWCuFwbnOKKoap/dXC4THDVFcVRTlKKpT4oHkKggwhHBRKqlA44KoTAgIJYDxBFARsE8D6C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Puc7uuvnxzv/u76qVzu66qX8u/v/++dy/n939zudx1L6+XXU64a745z46rnd8X3Oqu5z7ur7u+r45xznO+vv+/vu53O7++59939dffd33fzuruv4rudXc+u/vu77//7u6v51XKV3d33HcccPd8EG77nfD87h+c4GtzuEbjuBauHuAhYCLgHKBWgAehoJYCdAcYBwglgP0AEcCpAaIHE4EuANoAWQOIF0AiQdAD6BjOUAC0oTUC/i4HtSuEyqoGEpShuXA+uqhuuC0opQmpVXKoa64au/rh7rqupXf1Vw1dd3X3ddffzu7n//wn/+5VV/fd3X/X93fBjq7/huv7ndxVc/hGr6u7qv/q/nXFKGih4ecc7vu/u6/u/77u/u+/+7u7/huv/l133dVff3OO+75y7uVVxX8v++rufd/d3d993d9VUv7v7/n339993/f9dc75/dS6qr7++r/r7ruru/+qrr51P/6/u7+/u/6/76hHlU+7nc+/nDTu53HO7uq6n1VSv5coaXzhdVXU+oecdV8NLr7gzFBeC0Hzgfwh8UoeUqnL7+fyi4bqXV3V1ylOp3H3Hyu7nfc6uudVHXLqqqXVcX/y4qupVP+oR4Qh4RqH47rr7/vr+ruUpc6nx1ccdccvq6nKPupThVxQmruK7uofj+fVV1L4p1P5/UcVVdcq6+7nw0dS7r++pw3DXCbqKq5fUp1UcqlPr7753y5Rxw847jqc7q+7/5851P6/5dzh5cu647rjhrr58VXylL6jiuKuVX9Ryq6ndyuu7jrn3dzuO67vnd1xT7qOUd3U+Hij45TnO47nc7/udRw/VRf1/fVfF/876vrrvvl91d9Xd3d3df/3UN9T/7lco5Q851D1AeoAVQDZAfYDdAiQDFA3gzAFGBJgDaBBQE6A6wMIBugKEAwQSQIKB9A8hGB9BPBmcI3C+HqO591Puc4aH58+OULnPur5yuu+v6ur53P77qf/UffOr5Xcuu6nc/vq+7quVXK/rnX93O7q66l/3U7q6+Lvv++/qKoX1DQ8Kq4b+Koqlc7g6+vn1FC4Pjh4F3DQUQvvn933OXO6u+ffLldd86v7i+cquu/jq4a5VXXPuH+KEJSnK7nKHud3U753LnKvquVznV/9TldTqfPnX9cc67vn33U+458533fK6vq7q77u5VVXLvq6uXFd3f9/8fO7nV3V3V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/fy+vuu75XH3/Pu4u7vlOp9/K51FXff1VdXPl3X13f9c/n3/fd1U+Kquqq+/+fV3OXL+XPncfP++v/+XfzrlfyuVfXV91dXfU4orlzqdS44e5ynynL6vi5V3XV31V87iqrq+q5XVz65crqpThuKp8HVHwWlXDThM5VUqqu53cJnB8NCYRgtKoO7q4apVLq4r6qcuV1L5VKqqVc4urupznOrlVco5fcVRVK5XDXF1dSrl8rnd1X1fFOFQ8dyqrhfLuVRRwmo7qGucNHL/rl3fdyuKOLi5dcIxSu44VBidT58JhcNCeKp986lcdXy6jiv51FP7ij4uoo4pVL5VLuf/V1dd86j66lzqpTlFFOXKpdXUo7qccNDy7+D4XUXDzhVR1L+U6q6ucUco4e+VSuKKpd3FOv5d1K4p1OuPvjlcXcuPnDXKKVX1cp9VXfPjl13Kp1dcpVXyr7qr5187ur4u+v7qqriqXVXKqupyquXVS6qKUvh7l3Uuoql1cNOC04IYeBMgWIAZwKUBQgKcH8BcgGeAlwJkC3AoQHqCaCWAnwGqBLgNUBogphcGoed3HFcJnBiFwMIeBdB8UF4J4PgdSgcxwQIXBVOFzh5x3/LnKOVV1XdS+V11K6qOpd/U+66qpVV3U6+dcp9TqDcJggwfA7hMDi4K4K4I4JoEW4GMKhUFu7l1yuU64e/hGHgxA7gkg6B1B0CVAwgP0EUo4MQ8+pwqcIxcpVOXKVVK6l85XXHyr7vv5131L6qdXU53fd3OXf8/l/cr7q6vnO/u5d3f8r51cPyu+ruqu51Or6rvuo6u66u47511zv77u5XfL66/++6+pXX/1x3X9c5SlXX1cpVcp8Jv77u76uV1Uu5VcpyuK6qu5ddTvvuKuV1y5zq5TnO74oecVwupTq7hMcoT3ccN1FPu/nfFPq6hqirv+uqrq66nFXxXKOGq6r5AYAAAAJ7jAADCB3cIQAgIYglMGfcVcveffX//////////////////////////////////////////d///v+ccHm6eVzErEIFERRBBIDBZVwhDEMFB9AQIAwMEaqJcNSxniOIQvSAyAhUHQIHU3U/s3ppFYwLQxgRYAg3awpL2LCMkOqGWEEJPIDBQp3n/r/7X9///////////f//3//7//////5pToNy20hX39/2ZV1JT59e99uauccVV/////////y7g4gAAAAAAAAAAAQArAwAAAv0GAAAAAAAEMQYccggkkkoooosssssssswswwww000000000404040884008400040448400444448044449A844485A8880448444884489A448888A48A5BFA8889A448849BA8889ABA9BFA89BA8889BA9A5A45A8889E9A5A9BBBBBBBFEBFHtBABFBHtFH8AR+R8R8RRR8RARRQRAR8QRQARRRARRAQ8R9R9R7R9Q8R9RRQ7QARR9R7QARAR/C0fEfEfxxH8CR8R/NEfUUf///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////WEQEQEUe0fEfxtHxA9HtH8ERARARAQ8R/A0QEAEfUe0QEUEAEO0UT0EAET0EAEe0UEUUUEUEEET0UEEUDzzz0DwEDkD0AD0Tz0AEDzj0EED0T0ED0EDz0EDz0EEDzzzzzzzkDzzjjjzzjzzjjjzjkDjzjjjjjzjjjTTTTjjjjjTjjjzjzjjzjjTjTTTjjTTTjjTTDDDDDDDDDDCyyyyyiiiiiiiSSSSSBxxhA0QgFOVVV3UO5VXdRo/GuIjw+LvqIqpwAr7v7uGalcru4dfVf3UrnylAKf3dx5wt9/XDH/3d33d3wGy7u+dTu+d3P/7qXffXOAVKlV93Hjzvr74uPHq+d3ffcAr9f33dznd1Fy5x53cernw3h8AMZ393fd33fV9/X1fXXADK7q+u6u538/++6quXzgFzrnXxXHqc7qLv6653UpzvgF67rurnfXzud138ed3cXzuAHN9c75399XD+dzv587ruUAyfU+qjx51d3UXO7vqp3O5x49wA+nfO77ruuqn1/993dXwBBu+vuu7+6n/XPndVP+AIdfV1cDdcePDM484LbncPnHnDM49xU48eACacVHhWLhmKgiwvCCFYEpBbAf4D1ANcCBgDHFwAdwI+AiIGKADKB5AToGGB3COAP4DZABbAX4BmgsgAcg1AnQZgAqlDeCeomUAEdS4jqoT641VUAQqjVDpRpQbquIrqCf+XVSu6lVcAy99dd1dz7qdX9X3d9/wDL1f9/918ao0REREaojriI9RUBuuufPhLlA6gT4E+BQgn4MIIMDHAj49xoMJ3dVVwDHd8/u/vu+P3867u7ufUA0f9/3XX1F//XOd/y4Agd3Hjx+c76+pd3O/7/64Bn/u+5d3dV/3f3z+q7gGf76+pVX/P++q7vvu4Bn+r+/6q7v++599VKquAZvu76+vvuNf3PuV39VUBu/6u+X39y5VLuf3zv4Ab3fU53XKuruG1Kpfy418pRoAZRqi65XK51V/Dbu+76l/9wGyvr+IupVV3dVcRfxomHVEz+pVGnylKo3841R6h8/jynUqlxM5cv641T5VP6vqXLq5fKVyjVKPHq6rj1K6uuffdVd19xFVL5dXVVP7+48a53UVU5R6nD65w6Lh8e6iuIuVzrqdf/Kquur5yrnVT4qNHipcapdRELxMNj3X3dV38q+r7nLv51V1cRVxFxcT9Xd1c75XUrvuNKXOvuPLjV1cXXX9T6qcquXOcT1yqVx53z5xvhsMyiuGbipx7nVxd3fK6nVVcrufXK6u6n/1L7nVx+Pc4iKiIruLn8+40eIuHVVTrrjfO+6v6uvqpVfV/3U6ud3XKqlU5T6qUuo0uuupfKddRF3K5XUq+uv+rqq5VKo1w6Lgki4HcMQC1B6AzwLko0C7AG+AuQGaCBAtQHyCHByARIDnAswIGA5wYR4XuFYJIIkMQgjwxOP9XU6vn33K+ca6j8/7r/qV33VdXPlUr6l1V3zu+6vn33fXO/v6qXKq7+V1H4VhOCDCcDfcIoOwVQjgTJQSwlDqjRF9fKUeJhaCuCaEUTDEIJ1F3D6j8+Lu751fX8ruurr7qu+6u7+74jnd1G76j3c++Vx65XUfrq75Xfd85Tv53f9ynV8fvnc4q53d9fGuN919X1c5y6nfF9ffHlH777nKv/jd3zqcpynKPd1O51F8VU7vnOdXce499fdXdXffOru4066quqn9xucu+cp1XXdXU6j3df9Xcb6qcadXO4m4uLqcXONUeHTiYdKGIiNOpzj87+rur/6vqLqVTq+X9ylXXG66iLlOdfGqPdceL4v+u77qrhsofEXK6u5xE40aPONcrr6jVdxHdxr+I+om5VEX3U5XL+N1VdXGquuuurl3dXfVfXO43LrjXXfHuVRdRc4qf3d991cXOqurqp1G/q75f1d9XLi651zruIuKqNO7n9X11/fX3x7lG41yrlEXKfdV3Xfd/f/U+XK5zjV1Db7qLhs7nco3fEdXG5XznUurnxUpTnUaPKfOVzuuqnynKd9dXzl3dX/dXOdfd9XLrld8vu+5/V91VVc49VOfGnV865/3U+/7qu7qp98e+51XKo/Ece4nviLrjfy+pfxvuNPnKdzqcuV1Oru5X3Gj3OGx5xUHIqGIqAvwvAQ8GMBwgO8BrgIaAzxUA5QJOAkIGKAZoFOBigLUAi3AOUANIBtgYILYK4RcHodC8RFSnGj1VXVd999VOqjR6uU6vu6q65V193VcuuuXXd/d1d93Pu6//vr66uf8XdXDNS4Mah1wX98LxoPQ6CbrglqND4fFQUXAg4KoIsDuEpwEfAko8XDri+Pcf/491/31877+5//1f/V9///K49/dT6v66qfK5zv7uuq75XH+4/3f3f398o9fXz/i7r+PcRU7iOrl1x5yqKuU4q/i7ur5/33cROP9xXXFVfOv6jTirlx6upc4/f9VUe/nzv77u6+X9Xd/93Pu+rq7u+dVd/fdV3y7lc41x7lLq7h0RDMoSiI0eKl3fcRceN9T6urrvu6v7qu+NV8avqqvl8aNKLj/E1VX1dT586nP//iIiIhtSlV1fFQ2LhsaNXOXxv51Hjdca40aU4io1Vcqv5ynKVVVSqVS+vquUq+q5V/y+V11UblKXX3fc49zuU5XXXXdRo9VKPUqnK40b6qpV/U4iq++qjV1XVRdVx7qc/lf9yldSru66iKlynGjxqlGnfdx/rqqly5Xzj1cTcNuIhtxp1c+u+Ll1OG3GiI3G+r7ldd1PqN1GuPxNXKqlDZxpVKo3crq6u+UuVSnG+dd3fVR5XL405R/rjy/lUaPGnUriIVhsMwtG41VG//v53f/Pvj3/3f933K53O7u+UuNcRyuqrlylVVcTHjVKpdTr+q51Vdcv41xpxqiOGzg3FwOIfAJUBIwCXBPDYUgWICEgK8BjggQFGBmgRcaAqwBvh8CIgPkGM4ZuKnOp8+Pc++77urr7u5R7v+66/nXK5V19XGuvqV8u+q/qNf39X/Kp9fdVX/3d86vlO7qfD40F8JwPY0I4LoLIQwO4TiYbVQR4FWBCVAQsMwgghT4qL/+qlV1L5T51Pru5cv5zru7lGl/d11fV/VVX9dz+v7+qrnVcv6vnz7vrlxruV/91GjRuUuU+PzqfO+PfVRupf1Pvvq+o8o/Hu7q5dfXfO7vnx7nUqlcTHqqrr7nHqcfvu+/r/r+pdy+Xcr5XOvrr7v6/6nVTuNdd9fV1xuo0eU7v+pRMMQSRFSj1UuPUomH1G+5991OpVF98XOU7r5y4i5Rcqqu6nK40PjSqNFw+oi40eUuPX1GlUVcqhs+cXCseGISuVRUrnCcXF3FdcGr407jx4Uu6i6jXCk4qcKVPiajXHnOcRX1fxFdX3xru6u+Nd3V3ca7q+5xr67nHrrjd3d/Vz6vq6+udx59Rvvv5fOqqom77u+Nc+p3VXdxu+u76vru59cv5X3UvnXOXfz+VR48u7q//43dzjVy7uNc/nP75V//1OcXXfXzjdVx51/yu5yn8qq65zl8r7+d8buv+ruurudVU7nca7uPPv4849f3dxd3w+r6n9z5Vd33XffX8e7u77u/uuca+7+ob1x+7lc+u7htRqu/iZx53cXOU491Oc4i53x484SnHnHnF3AsRUMx4EfFQrC0AC8GMDNAeIBCgDpANkVC8COgICBGwBMgJsAiwB7AFOBxAJcBugBCgJkBrhsHoUgphsHYiHRouUar64/Kp1XF1KqlEyuo0p1XVRqr77qv6l1z+/vq/7+f9Tu/v7+p/3Pjd3D77h3VQvVcVGiahaPF9yjREEKXwL9xcMwggrgJsEGB9OH9/9Vfc7jVPv/76+p9cu7r6jX3/xuvn3XfK77n9XfF3d3OfH75X1H/u749/3/Uvn8omrjXHu7n1OpdV/8vu7u4875fx++r5RdVd3VXX3d3d1Xc7up/Kdx7v7qo/3F9cf+rq599/yv7/u766vq+uv/+v5zjV938XVVyjx4m7+dXF8o0omPFQ2PH48pce+593Opdf3f9d1fVV91LjX3/xPXDMaDUGo8MR40u7qNcf77/jTl1UrhiDG4bFX8pxMOh8NqPVRNyjSlKcJTiIiqq5T6uo913P7j1Uuq5yn3VdRupd11fcqquX3PqrlVXUu+uV113Uu7qp1Kvj38fu6/u6qNX19TqUp1ddXXffcV1/193OrqNVfU5Tqqqqj1FfD+Iu7nKNf3xpXGq/j9zj9d1KPVxfcVKLu6uVT++caFYmFoWj1d1ylKdXUacbqdfx7q4mcRcerlH433zqrq66+pzqVffL7/lK5XPlc5xof3OLru6nUep3V1UXU+5/1d9cau6+676qqq7qVTlUp991fOuuur75f33KUpRp8pXLlES5V/yquqr+uXG4jiZw6cGZwUxUBjgQ0AlQWQ2FIChAcoCdAIcCSgK8D2AeYMYE6A5QXwNkCWhDOF4uGaj3d3Pq+5X33OdX3393/91OX/d3Prlcrvj/9TqVX/9119Xd33x7qdX1dfLn1dT77+Xw2I+quUIYUgfRMGEGEFcHoHUJw2JjT4/d1Ovq6q7vnKPOdX33OvqpRrjdSqV3dylGlXyuu6+d3dXd11H49zqfPud1O+Vxrl1V8u6qvqr+uq43Oqrlyu+fV8r7ru7u6u+6lyuuq+5R+PcfndXV1f9XfXz48r7j99V9XXPuru51O+7q6nV31Pvnf/1Uu6rqpx6u7lUu7ld8u+f1Gi413xo9c6vi5R5xrjT+dyu/uU6n87q+rrlcqqcvq5TnXXdyqUbu5XEQ2Bjh0Elw24rjQ+uJ59T6qNKL4iruo0MzlxcomcG+7hmoMxuPCkb4Tq48J3Lg3KLlBNKEoXiJy/5RNzuN9xvuV/GuuVdyquu+rncv6nL+ur7qd1Xd1d9XGvn38/uur+V9yqdRuU6431d/d1dXK+6/jddfOrq/rqp1U6uv51Vyld19xHPiZ1ca6uq5yqPURcrrqu4/O5d1UeXfdVwzOIuH1DP33GlH4icvjxrlX11dT6qvqcepVXXK5ffxurnyur7qq6qd9z5XH587jcXdcfu6ufXXfXd11z6+7u+/ud31U7r6qquVRrru+p1XXK6vndRMouobxEXUedynUeV86n3VynV3ONPnETqcOncXBuLh8PgKULQIiDCA2wHaAFkBzgEycA3wMUDJAlIBYgKsB7gzAAJAToDtAbYB9gshBBNDMJxUNjxpxp1Ovn8rr5y+5dXVy7+q6jz66nfcu+cvrvufc+v5Vdyq7q67v+6u51d93K+6urqp1ERrlUMxpw/jcHeNULRMKxERBqIgtgknBuGLu6vn3cpx51cep8/7+6+pXV9/Xff1X9d8ur59XdVO/j93c7nHv593H776v7/6qpXKr6qPOrq64843Kq/qu5d1V1dX3Lu43Vyn8e5VH59191d1zqrqf1c53//P7n/9Rdy4up99XOr49/913/9VVX398bn987++++qq+L7q6lOqn31U7qdx7rrq+XOp9V39dXOq/lXzuN1XX8pX3d/CPgqlx/hip3dzlx665xvqdXG+pQvKIiIuEoJouLnOcVCco1T4dcOjxHKIq4bD4JIZgeRUGoTiZSiJ8RFyjXX85T77l1VddTqv6rqu43Lq+uv7qXVdcau66vrqq7uPXXKquVVy40XExqqqr59fGjz+fHldVzqcpV/Gq7u5XyvldVzr7lUeVR4nlca4mPDYmEo8pdfdXdcpyrnXyj9VOrup1K5f11znG764/HjcRLiai5S+uuVcq/qXXUo8TOVVf8ucu7q751F33Xcr6qcpzrup93O4qu/u67qv+++6vrvvrn1/Oup1XPnfzqI5y6r/vurvndVUuIi4iNddXd139x/+q/6uV1UqlxriLiJw64UjwUwrAX4EdAY4E6IiYCxAGCAlQFOAkICrCOAbIGqBSgHyIgthFCsPh8XH53dXK7vnV991f3fcr7r7q5XzufKcaPX/1F93/V8+pS/599X3/f1Vxrlx/5VVdSrrjRcTCcI4UhaF485/dylHnKGISgi3EQ+BSi4JoJf++6uN1dXd3Oru+67/+/u++rqfO/vlxrrlVVLq7lHld99Xd1dRfF1H58e53Op3OfO5f38r/hn/rqpcuXVS5VVyqXXLlcpRqjcRUqlLlU5XXV18rvqpxuV1KpdS+vurqr6up9zvnKdSu759XV1V1KVXXf13Od3XP6q411c7lO6r5R5RFRfO/uNXxoqIjR4dFx6j9f3dVfUr+qlfXPi7lzl/dzqU66+VxqqpdVHuI4XvnXHufxo0bh91xpRuDVSqNFRUoZi6lKL6gTIiJh8EkeNDYJoOQihaF4qqgU5wSzibjTiZTi+IhHOCbhsNheGIRR4M3HuP3w27593Lu533EX9393d3d8b5/3/f3crvu7u+7n/E3/dXHq6u74j++7l333caru7vru53fETn31dx/rqoi+49/Gvq740T19Vx5VceKh9xF3V/fLnzu4jnc+c6ld3Xca77ud3V39VL7nK+ru66407nPqqnOrl1De7+vip87nUrjxce743dR53x7nd1c67uc/nfXfzr593V3zu+5/Vd33d9/O+/7v//qu/qf3O53XKpdSgeQJkCxBBhDFwLsBMgXoH0F04Wjzjxp3c5zuLnO53O4HlzuLjxdwQY8ePDEeKjwBMh8I4Wga4LoELAc4CvAdoBuuADeA6QDtBHgA6gYYBQgtgNUAkQAEwCzANMDqAowbgN8JQSREMxobKDXK4fXUv4fxpREpS40TUJdVf1XXHq6r+NdSrvrvud33dX11/3X/3387/vi7/vqEqu53dwe5SiefBNEQ2EpxouLhmCiBeghQP+UOg7yjVD6nGuL+7/+Lu+r6qq5znPu+d/dfEdVdfDPO7ndxu7vu4Yufd9zu5z7qKqrld1F/3VVP++qnxo0o8XOdX9VdV99zu6qVf13c7++6nfL7n9zrv7nX/8qu/u7lPq+pRf87uca75VVR+7v+fUoiUr7u/n93f9Tqd9dx77lyru6quc6q5S6qHRFc484b93df1Uau4fdXLviOqqr+/rnxp9RobGuPXUar66uqq43V1dXKNXOP/OpXzuc+cNiYicRcaNdyi41w6Hxo0GYRwJ0IYCdA8gnh06iIWgqjQ6E4iofKND4HcKwai4i4SuNOI4jlfX3f191ffddXKdV1fd1HjXzq+P1fd9fVV1VdXKqup8a67qqnXznV9Sr6v7vnf3PurrruN9V19xcq/uo9VVcvqd/x4m5Thnibuf9RVTqUrjSuNH+fHrlOV8pR6lyqdRqqpynK66uV1LjXGncXDbjyr5xNVUvr7nPiLndXfUa40eUq+V3x405fKvj9zruXUp1yn1PqU6qpc6qpVVVV1Hqqv6qq/lK+dfL6u76vnznOUeU+6vj8fi+PdRcbgeQJKBdgKc6gToWglgVI9TqPceri6vn39ddcurlcrrlOI4moSi4JoZgMMDdAXIFqdQF2AcYKICXAxwKtwJGA+QGSAi4GeDGKheLipxdzqdXfd99133f8+4/VX91O//rnV85fXOvl9Xdzqc+774/Orj8vuu6v7ru7ur+ddxEPlOd3z6++4mH8Pi7jTjR4iC+DcESEUFkIIK4UlDZzup3d9V3K6u77l3dd1V131yvq7677lOp8fj8Xdzvj1PnfLndf9ynfXPlcrqPdzuU539zjSly533KquudynEXU5znz5TurnU7nff91XVd/13V3Oo9X111UqlddcpxHUvlfGur53f1fd8evnVX1VS+VcavlfPjyj3PuV/1VTuuL641XVw2EcHIbGjT7lKud1d3K76qqupd9/G413cr7/v4qHShse/qcp9VKVVLu/uUpd1fOqqu+5fxpQzKHynGjVwrxMu4MxMPgnioQwCDBhBFiYPcEsoH8BKhKUaIhKLhaIg5PhDDaqUKQxGjw6dXET7lPuufL7q+/n1/V933fP5cr+rq/l1cv411y//uVfKq6uU+51zu5Xz/v66v+P33VRu7+VxF9SuXfKvndV33KXVcfqrlF3EQ/nK++/+67vlO+Nfdff3X1xqrlcvuKq7qU+Nd1dz5VK6vvqV/8vqdyqcoic+IupyuuXO6lL5yu5x+7lO+6q7qX339VV/Vzv+q6uLqVxu7v6v776jXdT7/uq4/3H648+5/UX3wWQKUCTgICCi4H8FMeBoibj3zn91c7q+dX3K53ETu4i+cOnOPBuLhmGYCtCOBBQWwCvAHGAG0B6gMkaA8QDtAR0Pg1AaYAzQRIBjgGCBJwF6BrgcQtBqLhsVEzjXKfPlV/39TqpTlOU++rvl93xqjz6lX9XOVVVdT/vvurvlc+N3X1d3f/d9cuKlK4mLjz++caGziOdxEeF48X3BNHgthicJ3BbwnxodBbUEnDYVqPXVy/rndVO/u6qurqrq7qp9VF9XFX3H7nF3c4vu4877u/r+431XKd38o/Kcp9d1XOp1KXFx5xqjynd/z5zj911dzuXF33H7qXHuuuVy53L+7+rn13Uflc585Xf1Pqfc7qdXf/Ue7uVzq+5fd3/V1Ue5VVzuuPOX/cqi6lcoudT6vlDbr40JXF3FXXO+5X85V/Vfd1ESv6uU74/d1/dT5xqiY/8blXdfcao9RrlVcq6uff9VOoicoZhePKqqco8RERN1C8GoQwSwjgY4BOjwNMDqLgUJQZgqhmBAxMVDo0oqDkuIjQ2VxNxoShKPExoiuo1SuuV11y+6jfy6r77/r/59/Kqq6qpVXVV1y6l/cp1KuXV1XdVKPK6ruvvlz5X3d/8rq7rlUo8ovjdXLi+rv6nXVSj8ROd84qIu6j1XV1V3d38RVf9SuVyrvnfK5c+cbl938e5X33/z6i665XGj3Uqrrud86lVxpRrjSuuf1Kp/d3H59d3Xdy51ynxurv/rqu/vnV3X/fKdTvvqU6rrn/1UpdXV93OXH7lGvnUeoIkCnBjA3QO6grg3BdA9nf3V/f1/3VS5VXXKcpxrlxribhtwnHgrhmAywR4C1AIsXGgMcCQiIFCA7wSwSwAqgPkC7Ah4DtB6GIfcfnz7u48rlG53/f186j3Puu665VUuV1zjTrqrqLiIfcPuLuKlFXFyj3K4iPEREacTcTfG/+pXyuXLnUeHQlOV1d8o04Mx4Sq74Vh8Vdx40XDHKo9S6hHBuCBFwTwQoHUFMauV39XK5S+qud/L/5/3/1Vxoq4853d333dXdXXK+7uP3d93fXVVXVy6/up8eU53x51V1H5858v5XPlHufcefz6nceov5xqjXKXVynUXznKqiO7qPUe7n3dTqd9fPj1F8e7v6u6+7urqP3d8eU7nO5zjTnX39f9crn3UobFw6XE31KqlcGbhONFQZhmH3V3K7jTnUvrv7qf3dxdd1dyv7nVy/lKInHhKND6jxvqqrqPVfGqNEXy+5fKpRqrlKvqd84Un1HiY0XArRMFUaCNCcKQgg/HhmNBfGgngzBNDMEsPg/CcI5wnHnUXwchKDkTCKHwVQtDE4mc77u5c51d8b7u7/vjf99T+5d/fcr77upX93dxH3c7uI/u+o33fdxqv53y+/udXO6q51c7u7uV9x+uG/z6uIq7iLu6/u7uLldxH8V/D/6u7rv+uL/if7jx59zuV/Lvj9cbu5X3d3Ufvjfz/ld9XO67n/xrr7ncrrnzuUe7nc/u5ynH+XP7uu7u+5ffffd1Xffd1d3Uuv/ufXfU7++6/u6r+413d1XHnO598RxFQKUBagW4JIKoL4GmB/DFx7hW5zu533O5Xdzu5w3u53dwpcec4uKnAqx4fFQNUPg/CGAA+CNARUA8wGeBjgHyDcB/gOMA3wTQBFgEmASIJIA1wA/gAdgUoArwUQKMKQxDYUjQzKI7qvr+o0r5VOo0blGqfKpXdx6rvrvqrq7v+U7nfd1d8e531fH6u6uq6lc/jVV3U5T777uXGuGalx5xUXV9QxCkC1FQvOdwtVfU51cTBqDD4qHQvdxPFXK6qXOd3fO/q/q53D7u4nnwxfc53cPnf1O4Zv76q67u7vqqi6+qu5V3P7rvi+pR6lHnd3VdTu+ru491/85/f3c7qLlGq7j3Gvq7vuVVc53G6+pSi+593Ua53H7v759ffUe53V9xXGlUqudfOud1f/3O5/c41S5xoqPK7jx5xEaUfqI58XX9/d1Ue65dV9VG7+vjXVyu7hvVR6q4S+Ur7ieNETuqiP5fxvqf1/VTuJ5y+u+fG6hKcqlDeLqUpwcjwUwggT4q4CXDYInHjxouFIU5QzEQlcuKhs4K4YhSCSLqH8VETn8pfdd1Xd1fKdcv+X/91f/91VdXX9V193fVfU6uXVfXXLlUuXdX8q+Vd31U6uVd9d/cburq/nGriJxMr/lfOvldXc++6j84/OVXdfXfdVd/3Uqjd1V3K+vnVRfXfKq6i5Rd1PlKU+Vyn9Tu77u6vuc+ced3d1cRc7jynXVdd3865X3z7qu+v6uXfV/11K/rupfK6+Xc/6lXKqqvn1XV1/99Tq+6nVT4iGYFSAlQigT4JYioLKh/8vu+v/nVVVXXX3VxuNca43GnEVDeDMVA4hmATagKEBmhiIgE+AswfgV4EZAhouAowDzBdBFhHCOKh/Fz6nXd9XU/653Vxru+75Xcfnc7nO5Tjzj1/G/+dXHlGqpVVV9dX91fUPiIfw+4/VVcq6rjxEP+7q741RE+KnHjRcM1cucNhiFrj/c6qrurjQXQWQQoIUCbC8EkE3Lq7+uXVXXd3XVcru5TlHu5x+6up3H7rlH53Pj1PvnGqo8p3Of1F111Prr6jyl86nzri5VV1yn33OpzvuVzuXfG+d333K4/Uep8491UuV/Od3Or75XfPv+r+7++ur6r/nKc7n3fcp/8pz7u7lO748u6vqX1KLipTuVVdTqqqdTu+ddxdTj38/q6l1xquV/K5VVXzu6lOuNcRKNURUR1EXC8qiKiLlKu+X1z+p1VVU7iZ91XXdVwzKE6vh0a4iBQgkgulAHkoqE4uB9DEGYdOLgsgqioIECjBRC0NhiFL4Yg1GheEoRwYwUc4Zi7lfOU+6up/d99Vfdf9/39X3XLr+v6vv+6ud1dcRVXLu/lf3URfxuU6u/ur+vuq7/qpyup//3UqnUJVHqFO7qL6rriKjz+pyvqrq6rvnV/d331Kdxu7qfxuNy7qX3X/9V9y6u7i6lxuVS4n7jXKdd/z6r43c+rvnXLndXER77up1/V1znLq5f1fUb7q5X8r/uXP7r67lOrldTu7vvuv43Uo3dynd/LlVx+pTiOFYK6gkqHQImBGwZhDzu+fdX31V1crr+X3GvuNdzjR7nDZzjwcioqHwCLCGAhIIUBngDRAEOBvgEmKgL0BAwIyBegHeCiAcYCzAl4Bhgugdwfgkh8NjxFxo8a6v6l3XK+6uuXGup8qn33Kqv+dX3zuu/vur77vld3VX/3F98fn/f3ddxM+493cp/HhsRKEo8ePD+NUfheoUgnqPc6l1XKcXwlwXSi6g1CUH6hsLQaj/dfU/u6+u/ncpz6uLvuH3VxX3H+cXd3F18XcuPd3Pu7uVx+5dx/vuvvuqndV1ON3//Oq74/1dV/Lncb7lca66+dXXfK+76u7ld11cq74/V9x7rvvlfP6qfzj3Pr6/qPU6rrqpTj8a4rq49xVVO+N3Do843fPhKUVKIuvnGu6nd867q5c/+41VUbu43dxrqo1zqG85Q2/hvGqIr5XDbjVFR4icuIq+I43G/jRqlXVfOJu+NUq7qrriY8NiIbxcRCdQ+rh8LQehDCcaPDobEQigdwNsCdBPGiodDMKQS1cOhK74fEw6ql1XX11f33VfXOv++rv+/rl1KupVdcv++/6+uviOrrn/OrqUv6uq7qq5Xcblzv+XVVfPr6uNUriOUqqo8aI5cvrurqrqP/dT/vrjXV391cp8rjVUeqqVVKcupXdV13x+dXXV1K5xNy77lfGuJuIqUq/6qr+d1zvuq6uuX3yu6rq666qcrrrqdVGqNcuuXddXHq6qq6ruuu7ruV1dXVcbnXUqjTqqq5XG5XU7ldXPnBhArwImCHBfA7gOkDRA/ghSv/51Kuvv+6uuurl1GqqruqrlcTw3g3cFULwCjBqAkwCBByBqgYYDRA3QCBBhANsBIQL8B2gugx4Yi4up3dX/dXffV/fV9XOIudyrrr5f/f3KP3OXKqvu/i7uqrrruu65dXUa5Vcr6qPKJ7lUqrlcpxMLwxC8JQncVU5VUpyh8LXdzuXO48uXGvlHjQRYM3A/gsg3KX1PiJx66quuq6nLqP3Ue7lOo93c+cp8e58/7ufF3Hu7lV85R5x5R759XGvnd9/ffdy5X3VyufL+cpxuNyqVRFRFxqjVK5VOr6nERcRUROV/V1Kv7/u+7531O+7qrqqrld/Op39S+uPd/V1fX1cup3F31cXc5XzqU4bHlHj/ExUGZSlHj3cv+upfKd8rr+65VUqvqXVVONHiOInG4ipddVy+rlUeUaJuuXKVxr+qqGwj/hXvnV3dzqJl18qhONGuEoThOLuKg1A5gmgquPCCFZw2B1KCyDcPnA4gWb4QQPoMfhiHxuKhFCsXEceNBmF4VhacXc4dzjznc6jVV11wvdcblcar6+of9xq7jXfO7uHX/3113zuGef/3V1/cJXO+u53985yu6n3cfvu7uFLucoiNUapVGv+41xcMwtOH1/V3CV33fz6/u4uc5z+5d/1UKVzu7uK5zvu407v7777q7hPu+/uqr6u++6u51Xd3cKVznd3F31fd1c+Px48fvjz7gzd3d3d3ff1Or77uPd3O58TXd3O4v++7iL+7vu++f/993Pl9Xxu+5znPvnV840BhnAlbu4Mbjx48edQeud3c7j87n/AET7nd8Vc7ipx5wAYzi7hiPDMVA9hiDsIIGKBqgHWAdYB9hmBFQIiAKECQgY4DJAFKB9AWIAaQATwGCAZYK4DpBPAowggUZRMoBQ41Q3rnVVGqVQZqIlCkoiofUbiOuJrqu+uuu+/u7ufd993PvurnfV/1Kq41S66lOc7uVX/wY3UuGx4Zj3dXO7gzHgdQEnnfBmq+p3DPXKu6+o0JQ2Nx+KqcVxXO4rncGNzuKudznHu59w2urq5z6uVfCGdcIfuL6qVfF3VdXw3lxvuKv6vlXXdTndzvv7nOddShirn93HrnHud1X9zv/nd1DN3ffxqq5X1fdz++53fO4Z++fVf99f3VfK+UqlGj13c7433V/H6+5VVzj/VyiYiJqPd1Hj9fzrn31E18uuDXXE1KUaVVXdxVdVKXE1Upfw6qqXXPqufKCeLuq649d9S667v7nz/jxfddzlKdQ6oWjwTwRYiAj4KYEnBDgRUE8MQeuHxc7ncRCsGYQ1UPqGxUEeEEOga4TgjwjjwzKUDiC+CuCi6qLh0LS4/HqL493z/vuVz6vqfK/6/qrur/uq6vuvq+f1d93U67nyu7vqpXfdTjXy+uuXUb6qqlV9z+IqNd1dy40XE11VfVfUqupcu7/qqnK+u66qr651xu4ioioqqu+u6lKNdfO+uuuP85Tu7ndz7udTlxr7593U64upSuUq6v7ld1L+V/Pv+5VUq6qp9VLj1dRv+UXKqn/1VSnf3U677lHldS/+VfOuvlV/X3/1XPqD8VVdV1dSr5V1Kuuqrrq6vupd9xrqqqXGnE3DpwcjwKsD2A0R4mB5AVYAxwKsAgwMsBMgzByBCQCDAh4DzCKKuD8CbAHfKdTu/lf/Lr7lPuP1z76q66lL/7+X/dTv7vq+5XKcuf/Uf/5VdTupfGnzvi41SiJTie4dCCCSHwj5z7uco/CKGZzvuc4/zuf9VV13KEMEsF0H4HEVDYU/5Rqru+POdR5zuPU+PV1znKPzqfH6j1V91/U+cadTqdXO++dTq7uru6ly5VK75x7i/qpXVzq5/93c+rqPUeoqVznx7i6jznKdRXFTiqirj85dXVTq7qPzudz7n1HqPceuca+V3f/Kc77+dXUup3HlF/df3/y66nx67u4mHw2UVUPq4/O++uq58qnVVyuU5cuN1ynVX1/V3KdznOr6/7uqurq4qJiYUqX1VdfHqUT3xE66qIh8MR4i4Mbhs4I9VGgh8NnA+4qJg9KHRMCRgzFQrDM48Go8TGgkg9GgUoiBjhWHx4GqcJzgariIuCJwzwRbg3OCJOF7gix5R4PxM7hBOVwhlxoXi4uHRdxXCUJQzOUeV3y++u+6ur7q759df9d1Oc5XH49dXVX1V1dX/1f1ynVyvuvuqr/u411c5RrndVGjyh04mH/339crlU/ufU6uvuXV1ynd9Xxrn3PnEXV1cbqqu7qd1Lrq5dc/qX18vqV/EXXK53Kqu7/+fU7r+7vlf1P6uV1zurjcbu65Tur6q5xu7lV3Vzuuv7ur77+v66v5f1fU65y59d8XdX33fHlDYU5391fHlUu+rr7q++/+r7jXdxru4id3DYucVByKhaF4AAIPwDvAywMEA7wMME8CzAN0ACcXAhIBQgU4mAgIAA4BzgUYPQWRUGMMxEeUeUevjyr+6qp1yuNdcbqN/U/l19fXV3VdVH/vldX3X3P/qX3K7lEd1LjR7uu+uVz+P8L3D53dVO6uEcPg1Au3Ofd1z6uf1y6jXK4Q8G5xcNgiRMG48JQt3KPFzqcVPnFfcPu5x+f9XHn8furqNHi5xcr51dy75V18Xd86up1dz66udVVz7j3UbnVc7ur/4uquLq7j/OKnfH/nO+6ncePEXH587qrqdS75zlOKv4vq77uPfd3Hq51/9XfXfX/VXFXKou49R+ru/qr65cVPuquruNGj8X3P76u+7qq+qqXPiKuo0qqXL76l1//Uv76/ia7q5VLjT4id3/8eq+pTjR+Vd3DMaEURBbCUF0Mwh4RyhDD4YuH3O5wTwehiEFQhhKFYfHlOPOHQxF9QtUKxcMcMzi40VOPX1dx49XFxcoupx4XjQflC0oRzhBwfu4MwvCGFpTuHQfgnqGxNTv76j31Vdyrvr5dddVUru49193fXU5V3V91Urq5XUq41xqrq6qX9fO7uInffK+751UadRH8uf1Pv6n39XVVPuVcTc7q407j1O7qrqNzq/lKpyqUeVSlK66uXEXERo0qruU41VKqqcRVf11O75VVcaqnKqnUR8p1dcu511KVxqququrqd1f1c6uXEVGlffXLrrlKu41/d1Urqo/Kvld/dVfK+PU53dd3d113C386qp9/1XLlyrv/r+VfKVcqlyqXK4jieHTgkh8BUgQcAlwnCsG4C/ARMGYFCBjhmUBVgH6C2CPHhBwhhBD7i7nd13V1df1VT6qV9V/X9f31Uuu+V3Oq7r/6l3/VVOvnV/8blxuqq+6lzuV1HqcM3Doq4qp3KPKV/w+Lu6u67uc7nV/LnUpTruofDYI84KILYJ4Kfu51fOp3PiuPF3U53V/V3f3fHlO77qfdXfdyqdSuU533d/Od3/O7ld1PnGi5VdVFzq+d13Gj91HjTudXU7+40/u651cqlV11Vf13V1ETrvqdRceca591V39/crlfKd3OqqfVVdXUfv513V1O/lxrqpyjxFxcuN3UeUXF8qqdXOdd9fV3fLrj1y6r+NfXKcRcpdVfUuvqVy43Ecaqrurj1Uvuvrlcqhe40H4KYWjygvhidwxxNwd4040e6gwrhsaGJRED6NBmUFUrh8PioiDcRKCiCuCHH48CdD4WjwRIqKu5Rc4RzlcXOLuEEeKnD+E+EcaoWj3UeEdQlLh8IZwX/yj1EweqobFdyhiJjR4fca41Q37q413f3Op3/OPU7+GblLr7nyrnOu407/u5c7l313fd/fUTd1dRo07q4iNEVD48PhiN31V8bu53dyq5yv413d/dd3K/+v75X3fVRN9/3Dvu7vhLv7q4dd9fKEv/nUKTq/nwpUupxdwld1zucOuc77uGznHjXfE3ff1E3fK75XdyqfLnOd/U485fUb+rnfzvvqr77rru5T7n/K7nF399Vzn/dXwCHBLFzjzqc75z4j6j3O405z7vld9XfGnO7uPHhK484ucXFwFOHwvD4DzC8F8GEABUBBQAgwELAWoJoDzAGCAaoCTAYoEyA2QF+AA2AGsD+BNgX4uB9DYNREXGiZQ+o1dy5dVdRpSqJqpSqdV1fd1dVVdV3d/XfL+rvru7q7r/7j9V1UqnUp9zj3OURdVOGbnxN3ce7491wtCs4F6D1/HquV3z5Vf1F38TfOFq6h8RDoiNO4YiLhecMTi5xp3UVVXP6iuc5X1FfV8pQZgU4RwNkDuPdRffKqqf99c7qXVd/19RV39/dRo/zu7rnznH/uqqH8593w/up3XP6u5xcervu+PUoju7ir+v4r+++f99VPlcepzv7+qu/qvi7+ffd1UXUpcp1ER49yuqh99T64SuPOP1xfKr/+pRurnVVGqX1X3dXUqjXU5XVRq/quJuquVcTd3K64m4iN3D6i6uoiJ4Zio0XA5gwjwYRMLwinD4ipRMepyuVw6fGhaFoPRc5xuFIYuGIi5VK5QzDMoSi4mGJRcXF84ZjRUeUXGlF3c5x4fO585yioXguqJudync4iXGiKuGLhmoRQ2C+CSCBD4PQtcIYNShOpS7lOr7quq7rq67qdyuouFa/5XfLl11Krr6uuvlK/q+uLr7q6q4mPFS5TjVUv+U65XVVXK77iJV3K7r7/qr6qdXX1VSvqqqddffco1XGuNVVLlxHKUrlURcp8pVEXGqpX8XE1GqI4mNETiaialxqjSly6nEXKpcpylUeXXG4ipcq51yuNyl1V/OXdXL+uuo33PqpynUv751xp1VfGn3V386ur77+7u53Vca++fUr+uqq+q+5dV93Llf31dcrrlcrhtwlOCiGYCrAywFaAsQhhFAZoDPBAgXYI0A3wMsBcgP8CMhDFQvOKuL5867uUXHufPqquuqu5X1Or/qvlO7nf1dXdzur753dX1L776lfc58eUe4qUXOLrqURXHiOffK4jjV93GuUeUeInFVEXOXXz5yu+7j8eo8+u758MwnAluCeCNCcHLq7u49R5XP7r7+U6nz7lfO7jwEuBBwEuAux7qrlOo9R5R7q7urqu759x6vu+fF8XOLqHxuGblH5/dXfc5xpyupyj1Hu6vuUfnV3Pj31fcadTuLufdR6j1Hu++7nV9zvvn3x6urucfl9y49XdV/f3U5y6u6v641XGi7l3GjS+rjXHjR+P31d3X/Ov6uuq5XOr7+p93G7qfG+q6/qvu/+6upX/OcaURHjTqUOhmoJ4L4LIVgjQjuF6jx58TDoqF/uKnUa+IhOUVDZR48RHqKiIShao8oTipRMFcXFzqHw+Ii7hKU4q5Rdzi4bBmHRoQS+4TuC6LnxFw24fFQlcLQUwnA3wSXXOoq+IhmF4mLgxh8RcEWpcI40LRMRFwtC93F199dTl1y74nncbvjddTjXV31crlfdX3LrlHq/v++XGuuufUvu7qVVHip1f1fcuuV3/8v5d3Gv4nq5XXG/lca5fOV1Ua58a6qJlfDau4ddXDq+HVdw7qoTlHuErjcOlHqEuVw6ovhOcpw3jXDuPHh3U4mfcTce4b1cRP43Liau4i/iefEXXK6uXV93OXXX1zjX8fqf/8uq77/qc5XFXdXz7uVV3fddy4HHFS6u+p986uuc67uv6u7q59X3K5zld3Gnx4Sjx4uCiHwjhHALcFsBBwBqgLUCQgHmC2BogI6AVoDPAP8EKA2wA/gfwFGCHUMwpFQ2PEXK41VOp//1VcuXV1/VX9ffX/3Xd/XVXVTq+59XV/X/c6jVF9SviJxd/851fUXOPXf85XfXCOEEEsC9Oo/987uuvnxuL77rufK4P3BPwvKCFEw6PBLDEVOo8XP4v++Vxf3H6uLquK5XUBJgoggd1cfu49Tq++d9fXO4uV1yvr7q51V3zjXF3cqj/13fx+IuKn3O/ndXHudR+rj3P+7q6u+Nxd9x+dc4/K75dX9dzlc6nU+rn93z7v751/z7qr40bvnOHXD7iqiO5Rr+JlVzj/yndf8518uqvruv+VfK6+pVUvl3KX3LnxudV3xvuJuPUKVHhSHVByGYYuIheCNUoVi4HED6B9DEVOU584UhWEUI41REGZwzOobB6Gai48XClwhj/F1DZxr5cRK4SiYPw67qDMH7jR+Lq48aIhOGIiJjTiI3cAdxM4bcXOcEkVE8JwQYHcC31HnFd8PgzD4QRENjQ2qjzi6hFCkESJhFFQZgknOXX3XK+qquVxuIlEcpSuup1Uq+o913XKrup1yuqq65fLlzqdSqU776nGj3OPV3L6jyjVf1dy+Vxo1TjcqlVTlOXV1VdXGqIlKrj1dV3VSuNxuXEcrjXE1GnGlEcTUTxM4iUa43DeJlGjylEXE1GuNUN4niLlUTUTOG1GqJ41RNxPEcbjXG5fdXKcacTcaUao3Uu5ddTlUpRuv6vurq6rqr5/Xfdf1/XVz65VVd3U6v7+F+V1cfrrv7up1VfL/5VXVz7lOVVVXXLiONURxEeE48E0PgBXBDgWIDHBVAf4FuAwwIuBZhSBSgPUBJgaIEjCOHw+ce77/6u7u67+/+uXdS/+qvuvqq7lyqurr+rlV3V91ON9X98b6ldc7rqfUeGyiIbUNi/++dVVVfzlB6H9RXOdc5XP6u+5X877v5xo9xdQ+IghXBNBhDYUj1O+NfPvndzuVzn3x+d33KCmUD+BJXHqqn8u7qV187vvn3P//jXHrqXd9xo0R3zqVT/vq7nc59XfXL7vu4991PlG+qu6nP+qvruqqrld93fz6qudVc+5z6+V1Vzv58ru75VHlcqldxN1ce5VURcTcRGlwzERUVU+Iu+5Svu+fKp1/KXVX99dRv+51cuXESqUrjXVVy6uuVxE4TjwZqDcXBuouDcESEoZgxiIqE4Sh8ECcNi4dDMIoVqHQnD4H0IeF4mUM/F8ROHQnE1Vwii4iNDoORECUg9UJxMDqEoJYJIMIXjwpCKGYqPFyha4fd8IIKYVi4ZuLipXOce53C87j3KNCkXGhDBAhiEUROEU5Vd8pwJkXBEqUOiIOznGh98RG6uGwlBqFofBJBmL48Lx4q4SuJ4fwl913xru4u7nEd87ur77r4bfc53dXd33yu/ruG3cv/uVXHipwxfVfKJj3fX1d/d1Br+U7qH8v/hO/i7+InfdVcR/cp3Vfd9Vzu6nca7v+493U7u6vu/6l/V93HuPdVDr751cPuu+5wcv+7485z53wS9/c7lx+L53CXc4u64m53O7uJu6vvl9zu+r++fGuPOff3d/1Od/84fwF2BMgthiHzhF3c493E31/xd3OdzuG93H7udzuPcecCfd3FzjzgSseHxcI4qFYZgE+D0D+CDAF2A4wAfRUAF8AaYAtxUA+wGqAzQKcBFQA8gCVBLAE2DkDmEoAS4iE4mCaUaq5VE1VVUqhKUTVVKojri/4ivlf/zjdzvvlXff87587/v+/6jcq+ce5zuUNqcVzjx5V3c+fc7+oRQggbIFuBNhsN4Pdf3Hh9V93URXcX/Bfce4q5zjTu7jRMRD4q4fVw+4u+UMX8LTj853ONf9Vwigdwf4YquLrruqhj+Ndc6+qq4Z643Lu5x774fyqpx4/VXf8Puur7q498+ofzuddSru7nUV9/19XXfFd91XHud3/O7v66upVz49/XV311/3dy5VHjRP1Hi7n1DeIlcbu7nc6vqq5z6lVXE8pRH8f6jcqiarq/q+o19QpUpRMo3P7i+VQnfwdlDZQ6NUa5QVQTQfh8I4iGYPQxFTiI0PjQtcoJYE+CmDCBRiIORoZgcwR7guhBEXKKucaquGYZ5QtOLuFIOTiY0PuHTipxMoZ7q48bq7i4NfGnKE4HEEK493PlOPO+cou+ouIgvglhmHygcwYQR4ZgzCOPcI4jqcDiB7B2CDFRERCOVx4dHjS484fEQjgmlBFhsECBViYMwlEVcrruuql9f1O75X1XVV1X11VSqquuUepXxrlUv+X8r7iJxoq4/FX31fPjRFS+7jT7ufOrrlUpd1ylG4iojq+ucaUaUuXG+G9w2LhsaIqI4m4ionjSlcrquo8ofGiuH3D6h9QvUMzipxdznPq5cRUTxNRE4SqI4bOGzieErhvDeJuHTiZREo3XKcaNyq5cuuXKV13K6++UvjXLnyv66r5VdffXfVd1zu6nOp/Oq5cXURK67r6+uXUrqVVG5S/uuq+ruN/1dVXLlHiLjThSF4KoZgMs4bAmwMEA3QlArwM8CLg9ATICJhBBfCGGIuPOfPuqr7up13fd1fKV1fd11VVK+f111GuPzldyv6vq6nzv77q766+5VK7uXU7iIqdXHi5c+o986u/qVcLQlHirr4udz7qNO7lfO7qPV3Hu+6nc7nwxDYLYZg3FRobdXHnHnU759d3d93dT7lDMOj1Oo/f87nc+dTuru59zuo9RfO6ur6j1dzqLlHhm40Xce49R7i7iuc7nXVXU++d/1Pj1H7nPj3fz6u4vjzj85zlO7rnXVyrrudXKfOU+5zqPKPd/VXdR7nc/nX/Gjxp3dVf3ExVRdxdw/qLqNU+7vq7lcuXLq5Tquq+XfK5VOpc/6lyqNxuNUuNVcuJnCXDrhO4FGCNFQLcCZBGggwRodC9QlCOC2EMPnBjBRA6hWC6F4Qw7hWoXiIucEWcOuUTEQzBqU6h8VcJQ+KqGbh048EsCVlDoWjyg5wTR4ZhOH858obEQxF3GnCOcHY/DYiKnUeU7r7ncM8GeCJFQgiuJhaEdzheDcXUeNB+LnUEsFEIoNREKwpf3FxVxpQenBLcDfUTCkKwnE3Dag7BPCUIoMz+dyr+fdcfq419/X9f/331K+cbrl3OXOcaomcflcVVcXc7r/5XXF9XX3d1f3fxFTqI7qJnVQlfw241xN3w7+Eqlcacp8qioZnEXC1yuEE5XB2d8Hr+D91cHufB7+DvfBjd8GP8GN3ODs+oP3PhHU6nxdRqnwnzlBq/gzPuDM6nCV1cNuuG3U40+5XzlyuV3Ou+Nca5X3XV91dX3GlfU76urvuvvud1Lv6lAoVC/f3fHvlfcu+u+NfHlf1crl3dXdyvuru4iPceEouPD4HUMQdgxgFmBkgJ8A7wF6FIEfACbAi4FyAhYqAeoBigHqBghFBZC8JRcNnEcapdVVVVSlOuuN/V1y7nUqncrnVf9y+776uqu+ru51f93dd3LjREq7uca+7qUeLnOVX1dyu/rqrhmDsJwLU4JIvnOI4q4ruV19R76uPcuKu5w+7nF33CCcHOKiIIsTEQxBqf/O4ivjznH7nd1H648Dq+P1x5Xxf1F3XOUeUe5XF9cXUXV9dzu75cXcpRcac+NUeL5XfHrqr513/VX/VT+c5/O67+7l3c6+67vr7/6+rv6+dR7rv++quvur59zqp1V9RUXU/uomIi5RcXEXH7v4/XX3/y5dVEVPiP5X91dXdfU6jVH41dSqVRu7jVVQ36gmjRUJQURMKQQoZhmFYEyBtuBtjQrU4qcKRETw6F48DZB2Bqh0EeCND4fwtByPByJjQ2Hyi7uI4uc40DuJhWIgzFwzEwrDoHMIYZjxERUeUpxVRUVDMTD5wjhsTG5Q+ouH3ULwnDMVFSqGY/Hq+rq53B+GZxcJQzA7gkiLh8FN3U48Rx49QlCKNKqq4iEp3z7h/yg9BuB7A5gulBjCKCuBsgqgoiJdVVf11191P7uV1KXLlOuqlLl3XLly+pXGu40o38o/FVF9XOqnVyrqVVdS7q6qvvnGuGziIjlEXK4mo0o1yjRqhtw2oiojlKPGhmoQxMH5QY1CCcIrhW4XnFXO4uUXzvuqudyvq591Or7l3d3d3OUXKGY0KyhFGgxqC+oOzhBFRUPlOG3DYuHVDrhKodw24bOG1DeIuVSqNUrldcqlOq/qNHlVVVynd99111O5XVcq6vly5RH8/jTlUXKpdzqqq6n3Kq6l9/yuNUr7+rqNLlVdfcqq6uNcbhKcG4uAnwMUBhgVYuDUAlQCNA9gKUFsBFwImAoQEfAgIVh8fnzq/6+6r6nLqqq675Xzu51OVSquNPq7+VdS5cq6/6rn13d3VV8adyj33f93KNfceo99VyrlF333UMR48M/xquXF1cecpcq5V3UeUXzuLnHudx413OcLwpCGDGCWJqIurqPx+f31fO751fcr593OUfnU5RVxdRc49T59z5zvurup1d1O531fUaNU7jVL6ur/rufzlcuVVK511XX1c++7ud3GuqlXyrq59f139/y6l18pVfKfO4/Huc7ldSnUqr4uVx75VERUKVz6nV/zv6vqVxrvuru+o8uNcuqqr+ucuqqcuXKXd333XGuHXDYiE4uCqEcFPB6ARoIMD6BJQCdODcH4QxcHoWh0TC0Jwcgkg9BhCcIobDoqD04TgriZQ2JgzA/hHONGuUVFTqIiIUg1cTOHxURBqJgmhiEMECoTgohHKDcJwlFT4fD7hmcfi+PFQzxUaPFcTHiourldXOP1KInzhHwlUKxdz4mKqKiIbA8hi4iLlcNgzKDCD04dzqK4iJhKH3cGENuIjxMqg78OhWDURw6EoShmHx6uHXD+G87l313cv7+41z7/iO/nfE3XffKruV3d/zuc66765XfP7iL+/uErqoqoiUGavqr4mo/DuLjwvO+GznHg/d3V9weu7u53CDvj/wrV13VQrU7q7nCt3dfwivuu+Efd33cIr+rnwg+7+4RXfdSlcpShipXBqquH3zgnncfnOcG7ipxrj8NuPf/Dfu7+IudxE58v6nO6uffc40qjXd391V9wYcG4VgiziKr6u5zld31XEfVzncRzupzuN3fc7iLnfce4UuPOKi4fFwGqGYQQtACLBfAgIA2wLUBHQBqghwBIgR8CWgFSAE+FIBogAIgCtAoQB/BqLhSDkTDMaGyrjV9Sqo3Uo0r64i66uUouo1RF1yuPHq7+76v5/ddz7n/dyu7u6jXd3XVxfV8OioVjdX/VXd3d1K+4fB+BmgXIVgnhT53VV876q7jQ+c5xM484V53cedwtzuVzuGO6g/CcJREOhiPFwT8McX3zudxf8bvhiBPg/dfwx13/D6qo8o0ov++7iuur+Kqufdz5SvrnO+rur6q7vnd8euu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q77urq+NdVdz6u77u67u/5XLq5zq74qVcac++f3PlO6r7n/Gr7u7l9xEf6u6v+7nff1399TufLv5/P7/vnfXzq7v53f1P+IuVQVQLcCtBqEoPQN0F0VfOK53c593Odd993EXc7nO4Suc48eKnAqx4qKgScMwihaABCCLAd4A2wGCBGQEBBmBAQBigG2CmAI0BngMsEkA9wDJAEuAkwDXBNAoQnD4mDMRDEojvl3Vd1UqjRErqUuNEd8qlOc/qU5VV8+f/393d/33x+7qrqc7uLldV/x741V3K6v7+7jXVxdVxceLj11wzEwWVC19wt31/KomDcHanFQ6GbnEVFdffce7+rn9X9d3DNznEXOcMdzndzhid3H+4/918/vvu6lUepdX1Lu4/f/z5VOqj33ylfF/VXc4/X3fd/9zu75ylV3P7r/7/7u6/uVdXc487uV3cX//z7r6lf93fF3fKq4/993H+6u7jx7v+5VXyi4933O40aUe+Uu7r53yufV31G64vlKHdd11Derld3DarnUuEupSu7hvGjVfUT9Vd8auq/r6743cv7vnyuoSnGlGiKn1KcJx4J4RQO4fEQJkTBfxdyjwZhKcoZiYSupRcTODM40J3O6uNd1fX9XdV/XyvlXd//f9dd1df/XVdVK+r7n/39XVdd1OuVV1yqVynKq5VV8+VXzuV3/f/U7u7+5dSuNL+5dTldS5d/cr4u+d9dTquXO5VPndTuvianyq67+/qf13G7vuUX1F8apXy/u5T593U6nXHuVx7q7nK+585Tqq7+585991fXcuu/qpdXO76rr41y67qNfV11Lu+7nVX11dXc/uurrlVz7qfHrq7qo8DuCqGIHEHOUFfFXX86n9zqXP/r766rlUa665TiOG8GYuCqFoBM4FyAvziIBSgEeEUCvAjoEPFwLcA+wxBEh8LRcM3F3ynXd1Vyr7+48/++fOqu77+/rn9Sn1dXXfUeUq5XXLuuv6vu4qJi6i7u6up1X1H4mPd31U7jSiI/FcXGi4Yl9XEwxC3O5Xdyq7q40GEFkEaCDA8h8G4OVf1fddXKv5d1ddRqu4id3dx4uovnc+7nV1Op3d9/yur51d8+ufLu+6+q53zq6/6i40qq//59d393d9dxrrud3U5XPqLlOo853yq+Xd3c6vj3V33cfq7ur7u6urnfXz6uV3zv7nKfOo9Tqf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/r+A3d91O7q//v7+VXznfdwG67+u+77/+775VUqqr4AdV3d9Xd9//1z+u/5RoDb3d87+q/+vqu7u6nfUAv3Hu486q41VznDalVV8aquVVUAsSqcpSnG7vrqHV/fyl8r5wAu7ur+J6qNVVdVcrufKVxur5VKfKNKUadc4i5yip3U5TjVKXETrlV8ao0acqly6/6lddXxvlVVHj93XOUb7r+ddX9dcapV8r4393O5c5y5z4qU5TqUVG7hsXFxd3FXEcTOf91Prq753XOo9VfVXc65yuI5caNDMOh0XUr7l/PlUvq+o9VVV91ceIlcTcVE/G5zq53K4/KfUeJqIqu/i5VGr66uq75/XLuU5ziZxrqUri5/zuIqUJxfO4u5zu75zuc7lVXKvlc51Vf91XOrqIrqPGq6nOdRcp3U+r/qPG4jrvqpxu/u5d1131VVVyuVfVcr+r6qquV3K40pxqlcqr+r776+q/uX9S/quXXXVSuEpwbioHUI4BajwCBAUOIgLEA3wFqASYIcCzAeYI8EkBggOcCbAfoCGg/HhecMwbguh8I4uGY8e7r59zudynz5xrqd333VR666/lXd9Rrrupcqud8/6vuU6nc/n913/VV/8bufC0JQRIbBBnC0IYJYfBXUHISiKjRr6viKuFIZgpg5DM4Wg7cpx4fKH3HuK48e7rqu+u6qpy+5VVyuqvnV91d/1V1V1z59VdRuquffzqru53/P7nzj31V1dX3V/FT4851z5dXU6u51dXd//O7qfOp1Hq77vlKr65R+7uuuriLuffOU53313F3z58Xzqd/Pj1Fzi77vnKP9/11Hqcp3Pvn3yqX11dTnd3XfVy5VKdR653GlD51ce5VFxFxpRofESqqnVVKupzl/VVdXO74/UqvqcuurieNconqf9xquqqc6i5S5d3zlVxEouJuNcu5xE65/91c+IuPxFXdT6jX1EX8Rz41xuXXGq6qUpyq+XXV1/d1OfLl11f3dcrrvj8qiqucPnGudRd33U4q6ldX99V1XXV1dXdyuudVOqn9xuH8ad/1d8vvu/7j8+URUa+6qXK531d3x48rn3/XffXHuNUuI76jxE7/q/jVfLjXPnc7lz7r49Ro/dTlfd8qvlOV/cpXzldT5y65Vzu+5S7l/Lrq+f1c+uX39R51Lncrrrv+uV186ndf3X9d/V9VV3cqviPqN9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CCiEUFcOiY0o9zu591df3fHu+++5Xzrq66lUpcquu6667/q6q666lK+X3U+dR6j85x6nd1ddffdX91Kr7u51fcp331XVf/99dynKqnGqpXy+/+qnzuc7ld3Vz53/df/dxHdzu7uUvuU4urudznK7nz++vuU+/nVd9cac/6u58ePcR91OUe+uu6qUo8b43y53fOp1Uo1VXOXcvqPGnOc/7lcpVPq513L5x6uXVxNREuuNdQ6BHQlBq404/Kfxu43HqX8XUqvjRofcqnyjyr51L5yl8RK+I5cTKPUKVEQzVz764058vuXH433L+v676v+7uXfV1cu7l/Gu+NzuX9dffdc+V1xq+rq41R+uNP5XKqn8+V3dXO6q6jXVxrlyuc65cao99/Kr+q+p338apzibjXK53L5xuPxpy+pdc+p9VdTru+vvq4/F13XKo8o04i7i6uuV9z/l3V9X1UupXVynXV1ffVXfV9VOqnO++rn3fddcud1dc+ql/VzuXfdXx/vur7q6u//u7q++77q/nfdV9/1UarlLjT7j3U6nV1H7q65zlPuInc4mfHiZ3HgkjwxD4CnC0CDg9ADOAhoBUgPkBpi4AToD3AgYGyAXICrAfoJIBogD6A6wC/APcDqEUHIYhOLiZxo8up1dT41TlOVxuNfy7lKd339X9c/q6uu+pVdfOr6q6/u/7rn9zqVz5XV3cb7q7v/nGiJXLio04viKhBcbh8TCsaIlDoYgzHhOGbvq6n3/dyudR7nX3Xfc6rudXf1/Pqqvq6ur7+P1ynO4133cXPnF91Pq4858+Vzv/rrlfU6+Ln/19xr6lfdV8ar5XU6vuu+rq++4/XHv7r+Xd/dcfl/3d3X9/391Vx7r/66uXVx+u+pX1VVLndd31d1V/85Tud31c6qf9XfLqqvqr/uc6q76nUquq6q7q6uX3fH5c/6qVVUauo3XVyuGKgklx651H+d8u6+ca777jc64YlESuURO74/1fH5cp1yjXLi4mLg3HlDf4bO6jyr411HlHldcr6rrrlfOql8bj1/c6r5cuXUqlLjcbqo1ylKVddTrlOI5VKVVUaoqNG66r5/fKfKpynGrl9TlKr4jjXO5y7nd9y+5TlylHlx5X9TiJxMRDuUuru675d1fOuqj1111z6qqr6qU+VVd8+5cauGzj/UpVz41y75yjffKcRcapX85XPupynVXKc6rv+pXHjTi+c40e+PV/VV3XX/yuPU/7uU759XdV9/Xf93f/UR3d9df1VcrncvrlcpdzlfVy7u4v6l/y6uVylVSqVRriZw2PCkXBRCOARoEnAXIFiNGgYYBqgJMBSgRsBZgjwBUgR0C5AHCCSCNBhCsMxUXHqPcerr777r/uVyu5xrq6uNdcuVz6ldXffV1f/3K6nUuN/X3XdXdffd8v7qv/7l/xouIhKF4dDEPndy7uNUVHlDMTBfF1FwO4qCWDcqqU5/yvv6u5/XOq7/+6n/P/urv7/qddVK433Orq6u7qdTiY9R53K7nVx753Hv+uVzu/qfdRV/f3f1OXKpfKq66+uurqu6lfKI/n/VcrqX3Vz75/yrq6/uv7rqVVd/dd1XdS6nXOp9Sr7/qfP6qo318v7j1HvrnKco3Or++rj33KuIufPq6uc5Tu+ru6uru53x7qVxF1XdylynGuUuXGu/lO4bwtXyqff1L/5yjRqh1RqlFxdR4qPO+NUE0uKh0eo0RCULQ+7iOCyoOXK+PDuPO40XwbqqiouGbhvdz7qG3311K53f3E3Pufc7u598N+c/ur7/nEX1fd1d3f8Ov7udy753VS+cernz/v43fff33c7uIufP7nPqq+Nd3d9S//jRFV1VXOXcePF3ETuXXOVXP/qruc53Lu7quV9dx5yuf/VR7+Ndyu53/Gnc7v+7q5fE138r4qKuLnHqXc77uJ776qrnc+c49Vfd3Lurv+XV38r+/vuurqv7nc+Ued86533VT6ru+6i6u/53ylKuoOQWQKMEWEM4E6CyBTg/COPFXOPKd3F3HuK484uce4Hdx7io8e4IU48eGIuHxcAD0PhHC8DbBjAg4CCgJ8B/gDPwAcwAoQDhBbAFGAywCpBhAK0BjgAGgFiAKEDuAoQpAMUOg5EQ+UNlBmpceuUTGlKKlERoTjREouNGqG8aXH5f9zvru66qu+rvnc77/rqr/u/vu/q//vjznd31E193c4R1XEXfCUaIhKcRFxcVDoLIQQvcaHQeqXcP48ri6u/v7i/qq/77vvu+7+/4j+d3cM3fc7uXdz5zhi77/nf/fF9391d/9V13ffV1GqPPj1P+uru76ufX986+7vu7n9XXPvu5/d/dd31VX9/3X1X8ed3fO7u676nff939VfV/f/3d93UXz59zjz51dV//zn3cpd1fL7+Uqq75X8RXxV1cb+HXVcv/6q+HTqo0TLuVcaviPvrnK+d9XGqVXfP+V8ec+5xERETruN8o8uJnUomKgohaBPgkgqlGjcMwcqGxMpRdxpwajxo8riJxE4jiLjdS/urr/nVc5VXV1VV93zldXV93V33138rqqq7qu5RcpXVT5V1Up3G7qNcp1HufO76uc+f1dVdVOUrr+L5fU411f9c6nzqriLjXD7iI9x7/n3ddS+V/dX8pyldVPlcao8o1VfXKdV1V8rjcp8eJnF1XziZXXXK7nc+InHvu/jXGnGl3yudR43V1VVV8rrnXVXcvlVx/n/KuVXGu6qo/Oqq+X8pdRFd/V/VXVfyvjzj398fi5RfF1H7nGjxFQO4GuBYgJ8eUEsMQ6CiPUfj3d3fF3OfL+pV11VXG5ca41RNwlOCaHwCPBHgD+AnxpQGCAcIKYCVAhIFuNAlYGWAtwHiBtg7DMMXD7j3Ou7uru7lcvnF3O5XVzv+6u+d1fV91dXK6l/O4iPKPc+6nc7ud987vvu+Nfff1/Pq/5fERVR7ucrqrqq4bFyh8epTlcRB2DkF8IIKoVgph0odHn/Prq75df3ync6vqrrq/7rn3VXc6nPqPKfHuPO7j1HvnVfdX33Lr7u+dR6nHv/nyu58RXXOfcadRdzufONPvnOceXX3f1OuV3df/K+7+cp86n8vu/+vu6q6vlVynVSld9f/LuXUrupXV/LnGqUaXKq/nKdR++d33K53dRfXVX1UeInUa/5RqnOp3/V1Ko06rn9/xrlcRf9SuuPEyl91LlfVSrurvuXKVXcu7qvnfUrqcaUPlD+cuVQzcRUePDquFI04CZCOEcNg/UEtQYwKMJRuNCceKlBq40Ph3XDYqNcTcrjXVy66++6ur/6v/q+ddXf33Kfz43fL/6urviPqX8bu6u7rld/3c77//vlzu/u77vjXVy5TiLny5X33Xdd9c5V1GnHur6i+IivlHl1z6u6q59T77ndX386/qXXKd3fH77qfGnH7uP1yuvndV13xuP/XOURHj3Gjxrq7lEdTru6vu5x/6uVdVca+d3KrqVVPquudVyuqnUa5V3L5z+dX1KfK/qN/fdRpx7rj93P6nzuCSBzA/gPUJzgiQai4LZTj9zu+/u67jyup1d3Kd3GnziZzjwZjwzD4GCFYDxBhAC2AN8AuQMUBolAfYBxgP0VBLAKsA9QQIBggFiBJwCJA0wUwxBqKiY8RONdXXKNV1LjxuInK41yqvlVTurur/q7+qjX1c7vqd1PqPdTjX9939c6+urvldXV913UrjR4vn3ceUNnVT6jwvH+cNnCKK4bwY8TxomDGoJI0OhbnfXKP/3dd3X31Lr7/vnd9T6uK7493OfUeL7qPOrvupVdVdVfd1dX931OVXfV1XddS5xc5VHqfOfz7uf/dXPup8uf/zurl11zuuu7+rnV8/u7u+6uPVXPnynd1O7+XOp3VXVX8u6/ufXVRfGur7q4u//43Oqu4991VyvuPUuNz4uuq++/uXVdVdVfExMfqJ41xF3y6uqnV/KUav65dT/nGqKqInLlUvjc/q66nyuoqGY8r6i5XGiauoZhKGYTheAkYDFOCDBPHgcxEKQScCIh0XCcobHgzGiOJiIi4icaIiJxuq+rrrq6qqlL+VdVyr7+vuvvnV1cqrqUupX1OrldVL6lcp11cq+u+6++V11Vx6+dV31H7nUu+ca5VK40eo3VyqcpV/9X9R7jc5VcXEzlfdXKupX3L43U+7uVynVTru7qu53y7u6nfF3K/+V11Oov/qpT5SqVV99Xdc6uNUa5VLqcq6nc7ndfOr6vnVTrjXUap3cau/uud9/V3U65V1O+5X1Kvuuf3/11X93y7q6l3Pi6giQKMCXgewZuCWoRQYXP7l1VdVP7nUpdVXLlyuVy4iPEcNuE7gohiASoQQE+Arx6gM0EWIgTIDpAoQOYDJAeoEyBCwHuEcLxXHufdTvnGnGq5z7l/3Kcrq6rucao1RFRpSlXXG6q+6i5R+LuLuLlF8eruqqcaUuNOGx5SlG/6+rlGquo8NhKPKf3Uo04M3DvuoVioqLqLqPDPdT4i+EcGYIkVBNBDgcQUyiI9XOqly5Svv7qq65X3cuP1398e4vu53HqP3O+PK5dy6n3//K5f3fdcuV91XX1dc4/K59TqPO67+Px6nO/59zur777urrlfXLlP49xriI/Od86u++rqdT53fONHuf3d1K5fO58e4u59z/77nOo8o/O7q+++5c6nGjRNw2NKI6rjcpRFxPUo9X1yqcacXUR/1yuVVyrio1xpxuV91OX93GqNc4SjQzXG6u6qdR6r40o0R1K7ur6qu5cpT+rrjwlF3xUTKLgeSgzKDsNh0Mx7lEweiIJYTgph8GYuEcJQvODkePXUTUGo0PnCUPh8eJnO5c+N3y7uV/dz43f3dxuu+7lU7q/lf1d1Gud1/Ed87+I67u+Nfdc+XfGjz413/zq75d3c+7+5Xc6u+Nd/9xFdy7uNdXf3f/K7uu4q53U743dXVX3f13OPdy76v65V3d1313933V/d3f8rurnd13crvrlKNc+r6j87jXf9zuc+V9V/d3df33caVzq+659fd93O+41V/99/c+pzud1cr+P9SvnGu7+/v4u7qI41QSwK0CnBqNB6B/B2K7nD7nO5x77i+Vx5xVXOJnHnO53CVx7uPFzgJMXFRcDVD4QQjgAOgugImAeYC7Ak4DrCcCCgDDAF2CeAI0BogEyDcA9wDDAA1ASoBrglgTYTiomFI0MyiJXUqqNGqPKIibjREr40pxo1XdVGu7n9VVV9c6u+7+77v6uuK76/vrj/VVXd/L53V1f3dXOqqcXXxc4uPL+GODcaF7lwxfy7vqIgzB7uKhsM91UV3/Xd13z6qrvlznF93GuLnC9zvndxXd33cVd/1U6q+/v7nX/9V913fdXP65R49313c7+r7j9ffU76v+7up1Vd3X1d87jfddzl1XV1f3Hu7iP4vvvvn91fxd3ddcf+5Sq6/+4vv++Lio8/u41S48aLi/4/dRqi6qVXf/V1LnUvvialU+pQ76nXUNn8r7h3VX84d1Kp9xuNGu64nvv+I+r++6ru5VUvld8+r4SqVRERK6qU4UjwSwtA5io0DmHQXynKuFISnDYqGwlVynEThO6hK51XE3d3cp1z/l3d/Vy5crqX/KcaUq/+5VKurvlVd11ffLq/uuuuVxqlKVxriOVfyqpSlV39V31fcrvq5V/d8+VVKcRKp85T+p1Lqp13XKdTu/vnVTjXHu65z+591KXKXcrru/4u/ndSuudRUrncpVH65R/lf/fX1x/5z59yjyudRcr5XXK5/3K6+6ururndV9TlO7ndf3yuXXdRuNX/z493XL+VVKrj1UbjV1ffd/V3O77n/BXBqGYHEHKjQTyj1fLvncrn9zn1Pi5dXX3LlyqV8eNUTOEouCqHwGiDMCvAWI8RAKkBphDArQIqBjnArwEFGgiQXwtDMPqKu+5c+vqdSn3O5fV1f3L48RFXOcXx5R5zn1U5S5/OuL4jqX3U6/nVz7nxcaPUXz/r/qp3DYu6j11fLiY/FXFyi4YrlU4mGIVufO7qUu5R5QXQVwRYIMDqKg1By++6+uU5Vcp139dS+413O+c40e53O493fz+7ucp3O7/n/Puru5XVz/6qp9fdTlO6i5S67777/vlfO/7nL+7n9859Tv+PcqjTlHvnGuuv77nd998p9/Oqlyvqq5/dXznf3//cu/u7lOP86n3fVR+o0XHu/urq7qud3Pu51fGj9/39y6lXG43UarldfV9XKca41yqXKpXUpwxxoi43KqupyqpVd3KdVV1fK/rqu/qGJQ2r4dLlBTDYRxoHdxcNlBbD4NwpceCmCuKgugcwahmUMRE7i4mU5RUMRMomL7jR6uV1dXV/dyvqrq5fdXfGv4i53XVxrncuX3d/fL+V1ddXK/l9yn3K641VOV85dXXdV/3f33dyurq/n/dRHH4Sruo/y53G53L7rjXfV31fd39zncvqLvqrlV1EyldfKrnVXzrnUb+rjfx+V1OX8riLqV3V19x+o1dT499XzvqU7ucRHudXXdd3fzuurr+rrjd3U6nXL6viKuquXUp3GuU+4051d19yu+NK+Iu7jR53EXVy5X3VyuHwpDoThioH8CWhOGau+p1dXU7up8e6jV8RdXGvuNfONH5xN3HgzFwvDMDDCsA/wQYDBAO0AOoIsBphaATYCBgZoCdAGWB1AcYCvBhAL8GEDqFYNQ+HR4i405X/xEquNGlONHqcrrqVTqNzuPV9Xdzu+uvuX3X3Xd3/8+v6rud1z5/d331U4bO+PV3KPXOJlKHTi5wzcq7heGINwJlfdVzrq4fUKcGEofUKQ6FriYfCcev+6nf31131c5TjzlxU6jw+64ur51c7v7uufXF877nf1cXdc7uvvvvu6uPz7rlzq+6u6n1d9V3X1XPr7rldVO6n3f3Xd/3G6uVS+67u/u7n9Tq6vu76+ufzv7677rr/6lOPcuK5ce4u7u6quIjzq7ufEdcqnXONdd3dzr/l11XyrqI741VcbvlfxNcom74nlUao99xupRUeJurjcuXVy/jSlKVxFXXG7qNKuo8ac/ibjREbipRo0M1OPFQihaEobFwnDYmEcFEESDkGeHyioiEupSvqKiYiUpXGqXKud39yuqldXO767rl111y5cRUapVLlxqr7lf/UpXXxqlUu518o8RcR/VyuqlVdXUupTquqvruo9fyuVylXUavi6iK5dVynX1dffco/K7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K5VVVOuXLjXKUrlVdcvj1xuNxHEXEVKcRKoiLjQtKEFwvFxcXO5/Hr++5X3UeU7+vqqqdfKp98rld1VdS/r5XK5VKUrr5cr6uuU5V1Vyj9VdXGqNcrvuc7jxEM8IY0HqhaKuLiZw3hs4jjcaoicbl1Urly66uNxqqqu6qrvnGnUuU5XONVSurld9TlBhByHwjjVVVP4icqjXLqVVVyuN1X9c/l1OUXEcurq6uNcpRHGqJ4SnBRC8BjqDcDiBagOkIoFmCFAOUCNgKECIgZYRQxD48fnP7n//O7vv7ldxdznO66lzuo/y6q6lXX9//X3c+pRu6lyr/io3L584iF4uNcXz51LlUf+dfdz5T7++VX87r5T7nHjQxcVU48PuL4uVzj3PnGqdxrlcaLlBFgc8DXBNBRcrnHlF8Xx51P5xEVKL4qoucM8P4fx5R53P6qLqPUfjzj/3fVzuUfupxo/31cud1x4nlXV3LlxuNffXca77/qXPjT51ddc/r5T++65X/Puq764333dR6v7lco/ynd1UeNKUTceURESl9dX3HupR5VKV/yupVcaU6/qo8aNKrrnUupTjXVVOupxrlcacOnHiYdFQ2DMGMVBfKBpgbYfUMQ+NEx4TuEoZg5CGHQ+DseFobwah3FVdQWwEuBeAgAAAAIoTAQC9B3UIEAAQAQiAIIxAoCiMAITXTEE+Fvv////////////////////////////////////////9////////////t39rVwJHQdNrv1m1q/yd8e//09znZ0T+XaGtW2nX2eTmHs+jq8RB5W/7+5d9s2NaSaa1mTtUc3/pb78/779UfJJPysVncVz/7////7v//////////391///v/9//ffv3/3/f/f5FHv/f3//+7Xf///3//n//3dX///9/bQXJEgEAAAAAAAAAAQA+BAAAtnMIAAAAAAAEQUUYccgggkkkkoooooosssssswwwwwwwww0w0w000000000004040404444444444084084488044848844404480885A48485A84444445E444884484448444844444844484888889FBBE9A8889A885E9FBA9A9BA9A9A88889E485A89A49A9A9BBBFBA9A9A9A9A9FBBA89ABBEA8BFBFBA9BA8BABFFBBFFFFFBDxBFBBFBHxFHtHtABFEBEBFEBFFBABFBHxHtFFFABBHtBABFHxABABABBBDxEBH09BFBFBFBEBBBFABFHtFFFFFHtHxFBBEBEBBHtBFEBABFHxFH8AR7R7R7RR7RQAR8RRAR/BUe0QEfw5FH8AR/BUUQEEUQEfUUQEUfUfwtFH5EBFEBFFFFEBH8CR/FUfkfw1H8JRAR/Akf//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1tH1EBH8rR8RR/CEUUUPxNH1HtH8JQARQAR/AUQEUe0UUe0QEUQEUUUUQEfxxEBFHtFFFFFH8ER9RQ7RARR8RAR8R7QQRRR7RRARR8RRR+QAQRRARAQ/AUQEfwRFFBEBABFBBEBFABBEBABBA9FBE9E889FE9BFE9A9E9BBBA9DtFHtFFHxEBBDxBHtEBEBDxFFABFBABBE9HtFFBFBBBE8BEBH5H1FEBBBBBFBABE9BBBA9A9FEBBABFBBBA9BBBBFA9BAA9BA8BA9BAA9A89A9E9A89A488448884884888888848844444484448849A8884889E9A444889A845A4888444488484489A44444444444440440440040840000w00wwwwwwwsssssssssoooookkkkkggggcccYU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JPr/VtD7Tz0LCAAAARIAgAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECABAAAAAAAAAAAAAAAAADAYBQAAAAAAAAAAAAAAAAAAAAAAAIAAAASkEwEAAAAAAAAAAQCfAgAAg4cIAAAAAAAEQUYYcccgggkkkkkkooooooosssswsswwwwwww00w00004008448404885BE489FA849FBBFBFBA48889A/tBA9BE9A9BBABBBFABAA9BFEBFA9EA8BE9EBBBFBFBA9FBFBBFFBABBBBBA9BFE9BBABFBBBBBABHtFBABH1H1FEBDxEA/xHtHtHtFH//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////MRQR/AkUQEfkfEUEAEQEEAEUQEe0QEEEUEEEEAEAEEEUED0UD0DzzwEEEDzzkDjjjzjjjjjkDzjjTTTTTTTTTDDTDDDDDCzDCyyyyyiiiiiiSSSSSCCCBxxxhhRA0QIAixcQkxGGZ6T1mpSkddJEPhTlyZEVCMueRNxsAOOKk3AmgcmhtJMiBeHwTh0FZ5UuvcqFojEoqJz3cAjROKpG1j5E8PgUXErh1x1I65VwZrS7v6cAPrm5E8ikif46a4/p80ib60np0pAI1YnB/LioVmkV5MZJh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W/++7v+/p39/S6Vu5v/pWl17vp0p3fdL++7u/n+6dOa5q3PW763d9efl891pPdeek9K3Wl3PSXc/Lml8/Kml0l1rNLuX1pWevXn4+RBGANa9eel0npPNL5dKzS5ol88i5qyKSOK5NxXIk1mnm4/+es1zUp9zcielOla1pS+6/N1mp306dL6dKU76TUu6V6dL+7mu+7rcjlci5p7nkTz8m7u55FZp6fc3c9Kyp5rnvrFzSOnf81b/5q/WtLmunNWLl0uKkwnAggjBeKpJpHw2CCMjoFcHzRki5NayJcIy4JS4J0kwhLut1pKmutyIlDoHIbByFes1Oavf99K8undJpqyJ61/rS5/vrSvcvmrWs09x9Y/l1nvuv0mu7rcqHRndK0rWeaMghnrPStJ5pdJXPcThsut9aVutzd06c09K9aVnu+enzUuk1O6d8vp/c199eblw+IwcgQx9yrvpT63dbmlzVuekq55o6I/Lj6S6xk8dD5F3WXLhKXPLpdJM0uTPfWKhGaevPS54DdaQzSTWtIqkukMSZUmEonSMghvu+nNGR8OnnlS4Uic9xGGYG4jzSYqLulJFKXFSojz0r3NWeT0iEIyJQMAAAAAzGwEAqQdlCEAAAEAAEAAAIAAIQUTW41x89V7/9vZ9937v/39//3/////7////3///////////////////////////////////////////////////////////////////////////AASAFEAAAQABQAAABQAIAQAAAAAGYQAgBAICEBAAEAQggAAACAAAAACAAEAAAEAAAICQoACABVRAMAAADFSCBALCGBBJBTBApIGwqQIqCRCVhTAIGCUQRd9+v3vAAm4aAQAAAAAAAAABAHMDAAA1twgAAAAAAARBRhhxyCCCCSSSSSiiiiiiyyyyyyyzDCyzDDDDDDTDTTTTTTTTTTTTjjjjTTjjzkTkDzjjjzzzzzzzjzzjj0Dzzzz0EEUUED0EDzz0Tz0AEEEEEEEEUEEEQDwEUEUAEEUAEe0UUEUUUT0UfEEEQEEe0D0e0EEEUe0AEEUUQEe0UEUUUUUEUQEUEe0O0Ue0UUQEUAEPEQEUPEEPEAEEAEEAEQEUe0UQEUAEEPEQEPEUEUQEO0UEUEO0AEUUAEUfEEUUUUUQEEEEUUUUe0e0fEUUQEUe0UAD0EEUAEEfEUAEEe0EEEEUEQEEPUUUQEQEUfEEUUfwhH8DRRR/AkQEQEfwFH5BH8BRQR/KEfwREBH///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xNH5FFHxH1HtHtEBFDtEBD5FEBBH1HtBHxEBHxHtH1H8AQ+QRQRARR/BUe0QEQEPwZFBFFHs8BEBABFHxFEBFFBBBEBEBABDtDtHtEBFFBBEBBBBFA9BBBBFABBBFFABBA9E9E889E8889A4A8884889A448880440044444444040000000000040000wwwwww0wwwwwwwwsssssssssooooookkkkkkgggcccYYUQNGAFTvkXNNdb6QncV6U+IxcVmvmk8dNAI+IQvBFDEGEO3CciE4fAvhSF4uCWEkG42FqQjhyDGHbh8M1+AEPmuRdZo+tI65ppUuR0lR9/ffTngBHl0lyJolFybuleRPPW5qTzyLu4fSvPAJCt0kUp0nulOlwxSevIp0l80mkmTAJOtLrd3SR89/NS7pyeR/EIUl3AChyOMiNwinrW5+tx1InWVzdOnI6UgElImm6Xf9388v7r1uXd1nrW4BLfcutay7u633FLrSXWtY2t9ay7gE7c9z3dY657r3cOdayrnnjbrWVc9YAYue5d14rPLrH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VwajofC8NQkrP3wvWITRWLjI2VWVBuGYrD4bisbNPzTzdwcj4nFIVkR/S60nkfcqMnmjofDsTjZMuMj4mOAAAACUCgEAswcGCCAAABAAAQQAABQAAQBBVF8Hmb3GZTf99f3FVZ/9/ef2////////////////////////////////////////////////////////////////////NzgKAQAAAAAAAAABAMsCAADFOggAAAAAAARBRRhxxyCCCSSSSSiiiiiyyyyyyyyzDDDDDDDDDDDDTDDDTTTTTTjTTjzzjzjjzzzzkDjz0D0D0UUT0UDz0UAEAEEEEUUe0PEEe0UUUUe0PzZH8AR8R9RQRAR7QARRARARAQAQRARRAR/A0EUAEUEUEUUPEUAEEQEUEUEUUQEUEEfwBBD8BR+RARAR9RRARR+RRR7R7RARARRRQRAR/AUQEfyxH8EQ/EEfwVEBH///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9lH8HRRR7R/BUUEQEUUO0Ee0QEO0UUUUAEUEAEEDz0EEEQEEEEUDzjzzzzzzzjjzzzzzjjjjjjjTjTjjTTTjTTTDDTTTTTDTTTDDDDDDDDCzDDDCyyyyyyyyiyiiiSiSSSSSCCBxxxhRA0SACSCG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1fz/fvf33335/d/3//////////////////////////////////////////////////8HRQYBAAAAAAAAAAEAgwMAAHAVCAAAAAAABEEGGHHIIIIJJJKKKKKKLLLLLMMMMMMMMMMNNNMNONNNNNNNOOONNONOOOQPOPOQOPPRPQPQQQPRPRPPRPQQQQQPPAPPPPQPQQPRQQR7QPRQQQQRQRQPQPPQRPRQQQRPRRQQQQRQ7RQPAQRQRAR7RARRRAR7RRQ8QRARRAR7Q7RQRAQ+QR7RAR8RR9Q7RRRRAR/AEEEO0EEAEQEEQETwD0UEEAEO0EPEAEO0QEQEUQEUfEAEUEEUfwBH5FHtFFH5FHtFH1H8ER+R7R/BEQEUfyZHxH5FDtBFEBH8DR8RRRARRRR/AUfEO0QEUUQEUAEQEe0UQEQEUUfD0AEEQEEQEET0UQEUAEUEUUAEUQEEO0fUe0UfwBEBH8ARRRRAR9Q7R+RRAR/AEe0fwVHxHtFH1D/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ZkfxpH8IR/Bkfw5FHtHtH8uR/CkUQEfkfwNHxEBFFFFFDxBH5DxD1HxH5FEBEBFEBBFBABHtEBHtBBBFBEBA9FABFBBA/tBABA9FBE9EBFBFBFABHs9BB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48Nu5MVE0kQ2kbw2lZw2KnFQ6WfCMD0LwVhkH4K/SWkIwy48OuROCaAwQNpYyteW+sbfcn7ja9xtZ3GdZy3dY275Z9y98X05NPk3c42fONnc426cmdzl/r331u77l6Tl6zuXuss6yZ333/985z7uk/58NufzgQKzn849JY87iMIYqsssvOPInInBaRFzgNYAEoDrhGHRnCc68Ay3AX4TgDnBWArQBHxMQpBWJioh0uDMmPC8mTInSNiYmsTIkzpywyREIyE42FJwvH76U4jDpHfWtJyIuk7kRtZaxUbXj8bBWHVg5celaRsiLhkPlhkOl5ZNLjxssLxVYmF42GwvCtZMKQyD8Iedye59ORH5NeGyJMP+7kx63DYhHhssmnOsid0rGxUQiomGUirh9YSnD+HSYTiMGoqGyISu6wyD8iJjxCEZxM4mPCMXBBLAqkQL4hAUYWgKsOrG3O5yziEIywpGXWDEiWRCGk+RcX0jbuNhWD0TXiaQynS5zgpgOJ850uP9Z3W617nS4/c+s425Fw2LiYdGzjaxvGSI2csmLuJhs6TkR+Px7kVjznznTj85zv5z7nf3Os/uffPn3c7p17++5/zud9z63dz6/dz++7vu7v53OXutet1pWt9/WW5Zbrd8iWt93dO/l6yznLda87+7p990rP53Od9fnPndzu+6z7+7ut8/jzu6X/OvHrcKRcVCdZ3W53OkvO7ule7u63LHk1r3Tut/Wc50uRSlz53InHkx6R586VkT7pOnO50/u7+fSfT586z++tOk/vnc77pLS6XHulaVnWRWRciRSdKRMbHnTnHk0uMpc6TnzutZ1rc+cesmJuMnPnHpyZzpc60nSdKUnfOceTD4HHPn9Prd99058+l3HnO6Tul0nH53Tj3IrHuktORx5xNKTieJuKjxU4mk48JXDImd3dbpLFTiYqdYJoEystevffWdZy9etedbrWvLy8s6zvud8tJeTOTcvLSNuvfXluW7nL3d07+s59zu+fOX++/rfzufcs7u+s77nOdZ3O7pOc/uTO7pSdK9LnHluEpYyPC0JXFTnOci4mTB+RArhGCCPcPnIh0NrDeGUgtxNIJoT4yJio8+JpEYmCKkKRNYqvIjIqTCUZCCcXXj0iobDomE58mRCNZ9x5zhek+txciRExdJZxU4ru6z5ER7/rCkNu4/DJHEOkVLLzn3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ddI8mkTOWEYQRUbOROIx4qIVjx4ZEY2F4PwduPF3DJEVDJbiYm5ZxMtZaRvW63OIQTQL4Ea4DPGQgjYX5MLRsbGUjaRlxtK9bi6yxU4ydZw7iMTcMrDrh3DaRUeJlnTu+fO585zrOc53O6/zvu539J9Ln15/y3/y87rS5znfO53fP+d8/nOfdzu586T485zpWPzjzrTkTpSde750+7+fScfnz7jzrPpdJx53Pudek+lz5znS7r39aVp0p0uXv5zufXr3OkIYbDoHr7rORWRfc5M5bluXkzlu7++tK1ul9KTpz7nOf984/c6z6c5z53O6c50uciPcedK8+tJ0pSs+dzuc+Njx+Wd3c+d90uRzuc6XSPOc+fOPO6c+csfj9KzjzunHnSke49Kc7nP6XHnSc6T5/O690nO53PkSYLwQT6dLnOdJzndOfS51pdKdyyJy0rO6SKXS5EsTFR5xXI4mcTHirkVipYqcNrEyZEeceD8NgZQdgHuEMAeoNQBxlgHOE4BqgJkDCkBKwF2WtZ8+/vud87ufLXudJZ3de6XO6XPn06T6z+l86XW539a9bu+7pWdet/LO6V7rfXlpdfkSJ158753dOTdPnP7uc59Ol/SvOfSXp0pw2EMAaYUgG6A7hKA5gJOA1gFnBFAFXcFMDWNjZMRhKceKipMfj1pIhsmB7jwXuBGgNYyA4kwlFQViEF4KxMsVTjYfSH1hs4dEw+48Q4NRcPuLhk4ZSMkQ+sF4mJgUwvBeEEsTLInceGQerC8TcMnSLhOsMie4She4KxMLw+UgAQAAbkcBAHgH9AcBAAAAAQAAAAEAAb7/////////////ff3/////////////36/331VX9///////////////391//f//////////////////////////////////////////////////////////////////////////////////////////P+lGAQAAAAAAAAABAO8EAAAsDwoAAAAAAARBRRhhxxxyCCCCSSSSSSSiiiiiiiiiiyiiyyyyyyyyyyyyyyyyyzDDDDDDDDDDDDCzDDDDDTDTTTTTDDDDTjTTTTTTTTTTTTTTTTTTTTTTTjjTjjTTTTTTTTjTTTTTjTjjjzTTjTTzjTjjjjjzzjzzjjjjjjzjzzjzjkTjjzjz0DkDzzjzzzzzzzjzjjjjjzzj0EDz0Dz0EDzj0D0Dj0D0ED0D0Dz0ED0EEED0Dz0UEUED0Dz0D0EEUO0ED0EEEEUEUTz0O0EEEEQEEEEUUQEDwEUTz0ETwEAEEPEAEUAEEEPEUEUEUQDkUEQEAEUEUUEUQEUEUEEUEEEUAEUEQEAEQEQEQEQEO0EUEUe0EQEQEUUe0EUUQEUfUUQEEQEAEEe0e0UQEUPUEfEQEe0e0UUfUe0UQEfEO0fEUUQEUUUfEUQEfUQEQEfwFH8FR8R9R+R7RARR9RAR7Q+RAQRARR9R7R/AEfUfw5H8ER8R/CEfEQEfwBH8AQ9R8RAR+R8R8R/AkUAEfEQEfEAEe0fwNFHxH5H8ARR7RRRARRARRRARR7RARQ/A0UfUfUfEQEfUUPEEEUfUUUfkQEO0UfwRH8AQ/AEfEUe0Efke0UQEfEfwNEBEBEBFEBH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6RHxHtHtFHxEBABFEBHxDtFH5HtH8ARRARRRRQAR/AEPEQEfEe0QEQEfwRH8ER7R9RARR/AEUQEUUfwFHxH8ARR9R/AD+0QEUUe0UEfEAEe0AEUPEQEEEUUAEQEQET0O0QEO0UUe0UUQEEQEUEQEEUPUEUO0AEUEe0EEEQEQEEUQEEEEAEO0QEUEUEUPEUUAEUEUEEUUAEUUUUUUUDwDwEEO0EAEO0EUEUEED0QD0EEADzwD0UUED0EED0EDzzzzwD0D0EEDzzz0ED0D0T0D0EDzzzzzkD0D0EEDzzjjzj0Dzz0EEDzzzkDzz0DzzzjzzkDz0DjzzjjzjjjzjjjjjzjjjjjjjzjjjjjjjjkDjjjjjjjjjTjjjjjjjTTjTjTTjTzTjTTTTTTjTjTTTjTTDTTTTTTDDTTDDDDDDDTDDDDDDDDDDDCzDCzCyyyyyyyyyyyiiiiiiiiiiiSSSSSSSCCCBxxxhhRREQIBuwgYtvK959oon13iquum9r2lb00SVc60vRRANqKZaJMtTKTYVpKG0ahYhWi2GOSjCQyUWxlF8Yys6KoUIriRGMOYAX4WIWYdRHiXDJRA/T5kTwDKgFxALmbAZVctL1S0twbpaQ8yuK5sAKsZRVDqAMmANmA8I/A/wZYAWKoBNx6MYlS0+Jc+F6VjOqAi8vHp8F3LQMyAj0APkvH6IcxyH8N4M0VQHFB9gPePx60HuXrv0TJ82i96OmZAEL2omV8lCpFkVcpeu8QZ0MsImEVaRvJQnQ/lIti6Lq4Ai41C1aIMSq47KxEnxBlrx2HErwZIOUP5e9MtLy86u9FEAMlobwYEJC86ZAMaFGFuD9AieCMgeIEhB9gvYYIDxlYSMtAcs6P1RFrqqgCBvVXEKuu8F9eu8Z11XgrL13qvXXIL1Vy967wBLXr5/e8tXXz667yC/eu9V51711d+Ab96r1XrqndddVdfK9u9711d+rqqgHBa3eqquf111ddcta970d6u9d+/AE/97V13r73nVVcvbvf+fXftfvAE39rW7f2vXe0T36KL25KibRI0WtAEj13gywQsHqIUSLTO3eqN3lr36bRR13p7WgB2vE06mjoiuiZTFk2UmQrxNLz5f653MpnzpauAHCiLJ0rKz5sjNqvL3n3gsKZtHRGctGVFry8temAIebTeuZK1zoqqtOnU0QtylpadXIOmVtRaurgB5riTOlpSSm950pJXolIL20hl7SUyWn941ROla4Ag43DiEfEmqde0nR9qq4MdXanpov3rrt8A2bTrSt5equmRqo78QK45D2FGBtwV94k01z5fveAa8ajdHzpDVRJ1x2EmqMo511xqRjdq+iimumKYAb50TS8T3n1RLkpGZDuMpfg+UyUlDaKormQ0S8+Px2qCagn4BvSCQ2hAWj9oMKRhBS8FnAu4LadB7nz65euq8rXXev+AKSuquu9V5/9fPqj3effot0V13oorgCl+9r110/zO1pK/aZ/MtRanpmQBQWt2ta821PT24mta1qK6713tVXe0ASVvo73ptRRbvwau3KWmyUJdMybBvgxQ+tADLa3bqlYCmtA8wtQuSCJMfgnIxnSsGedPmQmUQ8gSsAyYC9gT8+AGiHEERMgYfFPAana0A9oA1oByzIDsiaTvEGuWkEIWMoaJGJUYxlGEAR15/LysrePTbz67349XXRadNjvGVXPkZ0egCQt2rrqqrmU2vXX9q+02XvaqqWl7yUJMLED5M6aZs6Sm2rjKEq951583nRNKxNIz5kpGVNU69Ur3r/prmd78SonjCOw2lInmxqMofSGPWtemWkNNUyq8yfMkp9MvE8lDifCTTD2mHXDiQQ6hrXDiIMUwpwjY3FFEa5k2JcOaocw4krSNpOmbaZO5GbOvI9fR026+qfTPkETx+M4vmS8tH6qq66pK9pl6qarVSMavbrrvNnUTZlcybbnUykQYiw/guZGF2MI/aXple/e8radIJ15BK1WqvVauivrrrm8gvI2riuL4O8CPjV4TIZ4KGB4gloOMdkY7aS6bUdHRai9FrdrW7UXvRa1vtRe9rf2vf6L2vam17d/ov0W+1dr9v79drdu/e9701/bprtfvavve9drf1W+1F6Ojt0V2o5ne973r+v+1vt/Xe972tbtRe3f/+1vta9He/3tz+qu9XR012roqvEiK5SG9fzKqJ9VdE+9dNXVaq1d6rT67110V11dV+fMva9Ha1u30d6K6L0dN6OiZR0UUXotMvRa1Nq6K6KLXtXbovbtai1r2tRa1dH10XorpvMvTeq9FqKO9FqbU2tai9q6O39rUXtamujotR2opta1qrWtR09qK6arUW6K6LW6K7XvR9NM2qRimntRbopt03tb6KqaKO1ryXXM6aKJ/ftRVRXN5O8jzeRmTOTkabTa5GdDiJMJU+LLRqZKTYUJl66a5s2feQSkXRyA+YQdFdFNu1Ha/2r7V2+97Wvaui97V379N+ii3Rf6K5G8jeb02t/a3e970Wqp6L0/Re1u9Ha9q6/va3RVeivr712rv27W+iZ3otb6O/X96L3v13tI2vai1+1p0vaF6JEDIh3AzIhwX0QoY4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7RVKU8T0yVotvbjnJWhMtKSkbjUlaUt3jkOpe8WRTLT5euu8y8lMl4zl7Q+mxZII9IapGJUlK8ZVzp8UUTKaJkYyGZRz5eQUzY7RRXXyG143VadyPE0lXLy1chmXn9FrV1xPxnGUZTI7M50rKzZ9pGOyGPS143JS171RqZVH641HIcSCMbVVURqbei97xqfa1p9M286qqXmXtHZt7S15fvzK6KL8WURuHEKsFxBZWkFrX6r8JUapnTKa5eViRLxuH8doiRBS3iaiFmZBihxDeSlp8ajOJ43BNQ3g7RPCjA+wsUQa50gnwgp8gnwMCqETLwhqYRkIeBHQjIQ0McQpefaBkX73veuBn11Xn3ve9d7z6qqp/frv9FdfVXVXXe9+3eU6O33v2t3+U7W/vfta3RyP2ot9F/t2op/t2t/e33mTabWva86/brn1yPa3e17fa171w1tKUQ5hXi6EdDymTmQdIWYb3gRHa3auQQHVANCATkYwKSFCHkUQAKRRF8YQImKJGTgFtAOiANOCUg3w+gRUUQYUy3BZcrGECngYEC/gPGAhcMcI6NRdy8ZR6S7RHhkiHVGFU+daim9X112nS8gmSG/embXHpeZKwfYuq59V5OSn1TptXMvV2vNppk650vVVeiQXjslI2lZ8X0z5l+1VFUyuWkrxhDWMpGSmWrrkNdFpOXl659u/e9/oqk6p9EYzY1I1zKaa6I1Nimuu9cymViuI86Wj3MgQeAYkGBAeM2K4yrjkeiiZDWM41EaOVSV6LS8cl4/IxyqmnkapKJUc5k2mKIshnhQhWm8B7wJa8XyMtMptaiifGMaploa3rrvX0Xvb6LXvRbvPqvI9UrTIIzpqjVp8OZ8htI0XrvPmz5aVjGHMR67xZEKK4SZeS5G9Fq5kejc379d66q73ptVaQ0zZkyERBFRRDJDyBH1wIXIwiYRsD9IycPINMVRXKcpOgKSDXBIQY4EnC7BygTcEXESF+B/h7Bi+3267Xvbv13tX37112r73rv97f19/6L9+9rX79f973vV1du9dNdqq+r+/for672rtboote3e1F7X//p/vXMv13vTa96/va97/a/X1dXX1Vz7V1dN736/79Vd+u9XPtP59ohQozInv96r/I2myVfbt25tqbSUtCbGUOYpp7Ud5k+i821FqOjovMvT0yNHai16apS1uZemqm1qK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m97UT5SuM41E8fhtamR5a06RjOOSld6pk7mVWlpKuZ27TqLV3pnUSlUgvftRVRb58jaZTNvajoveu0flqqr8jVEuR4viJeiife9N6O150yGeDXAGVBDQBeRAgCyogHFJwDitAFjJQMKAf16IXoNkC0i+BmRdBYRKhFxbXEKJ6Y9MnSslMtTaum9r2v08US8teRk51MbkpBE0vJUykna1E6TqlJkzjdcak6ImlY1LyC9cNMdnRJpkbTe970df11U3vadVeqXlpSLZkgiaLZDLRhfva9Fdr3r58jJxNaii0pIIth7CHgdEUwJGBtQJmCrgOuKYZo1RIYewMKDBjCAYUgpgv4NMEbB3gM6AtaY3P6urqvVeu9V73vRXa9/7Xn3673ve1dr0V3qvfv19d797Xote1F7T7VXrqoveirvVfv9r0X70XtX1XrovXeurqv2veuivqtXz7Xrvarn0z66rVVT71WqvVeqvrt9FddrVUd73lI/CTKw8lJaK4uvKytVEydJWl58znyMtLw3hmiyEFCfDWbHLdNVu16LWva1rUUUWte3aijovTeZMm18nJ3krSdcnE9F6uiNXhAQJKFSGsnKSNqL2rtPrpnylcpTFMXwO0QoT4CkgZEFZOl51EreGaD1a9FFFE6OQwQ3gb0KkDKmQL2EJDNDDeVkeDZBgwcYnh9DWU5lNFoshigKqC3g6wSNNpklauZTTzJ1pam1N7W6aLUUWoota1HRe3a9F+ujmzYnlpsbkYwjkWU1yPKVQ1j0JM6FadGcOIhw6hIwxwaIPkBZwwQKmK4JqFa9dd6q5svNieRlZGZVVRRR1dp9ujmdcjPrrtTXBQxyFmFabe1quFGGOCNiNB3hxDyHFdN6K72nWtRPoprtXe972vXe172vejov3vX96L0V2t3ptRau0+970XtRf+u9r103tbqtefa9HRb7Xtb73/t/R9H3tXai1d6b/frooortR27WotajtKwlxdDqHVNcyfMtPmxfIZGbai0+iSqtPtP65eOS9Fo1Gooi2Sri6HMQIN9NMfl5khvJR6K4qol5eZTKRKkpGQxJh7EjvIxqifaIcjJxLk4wjCmQzLXrkZ9omkHHrT6ZKJumm8nyPGqJGKYlVRfV2iHTK3kMgtTeumvmWovzKKbxydG5kXQqSUehxH7xTXVa8a51crantTTVOovytcpzbdFX1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m2qvR9vvTeu9P266L0X7Sl7VTaIU/tb+1MvLT45CfEGI97yGiMoxvx/loohxwXUGiIsg4sjKRm11UxqTloexjA0oX5slFMvKxRTK1UQ0w3o7xKtKXkbzbyM6qWrrk6ZaRkZ0lRTPkaIxvEe8rPj8zl6LTJnVJWnRqbVTP6a73vKxqUjOZNvTLxqMojWlrf8Ppklz7c2ff+L49XaR41emfMvVL0Wo7WtR11cpFMelqqZebPnys+DFBVTZ96+jr+95srMi6bedNprriidXHqo/FsKUQoEZCCgiYN0Tx2PRGmy9FVFp9qJBCtBkm0U9FUjTTw/5GG1qrUfbn0StEteZXM6Ovorqvarmz6Ku9uQ9FUveNRbFcgiRJR6SimuQS8tLyMrVOpkNEgvL2rkZ9dVFUvXRade8vRXVV1dXe9V6/iX36oNMDHgmoawKWBCoFVJQaYjQFPAloUISobw5lKJGmmmi1HTem1PTe32+i1rf36fov19Frfe972mWvau1u/Ra/a9v79F7VWtftfv3797V113rorqva/e396673ta96+u97X7WtVR127/96u1d+rvem170df/9+3btR2t3tP59Xe/2tentai3RXfv2iPDuUiyqidefTVXXauidXXXV13q79fIxuqbO51MhvXK97UU9FFFFFqOm1FqK6bUdFcy9r0dr0dPNr6KOm1r09HT02otbova9Fv72vRXT0dr0dHMrotRej7UV0Xpvan7XtRbte3btaj7fbt0VUW/vbt0Wtf+9q712v10d6fotRTRD+jo7du3Rem1FdNdqKK7TKa7dPNopvNpo5kjMtNvG5SZeRvMtJXieQQ9mxTHJeHMfpiXMkMH2DnBUQIyB8rny9crJTrQf4IyA458IOD7Pqv/R0dHRemu17UWvTXa9FH370d6K6LUX79r9+9u1d72qr70dq+m9rW7d79/rt/Xau32tTXam1dHTRX/aumi1dNdHTRzLV0TLXtR351F66q+vt0V0W79rVzLzKIzvJxAlZtcfkYrlZammuRj8jESEuPyUXxFhrF0JMpI3keZeM4sn0RuPxGhUrj9UlF0YVWnRudXKT58pJyCZKVWn1SkgiedKWtI86mdTNvTVGFMteWpm1XnTJeL5OXve0j1zZvyM+QSsghYj0Ra47blqJa9qZstavvTe1Uy3VPmUUdMva1+J5DGc+UjVrSkVxybCrEGLp/eR5BF8+ZyMlH4eyGHsnD6HsN45EqIXCdeZFEH6AY8A0pBBPSMlHIwn/AkY3RVE8jL3hSvXLwQEBowEtnxRBngGtHYjzpkjBnriPDDClOhllry8YS8QIngJTAPumbH7XjcNo1OlIHDCGjOXmytPX97Wo7UXt3v082WpkZsNo3VOku1FoZYQM20ybLRRFcURJhkiPGcZRTCjVKwwyGLJKGGM5aP3htCh8bhaiqXn8rLz5De15nLwnRPa0tPgLmAS0BiQkILmEmbEmBQQU0bgQuK5eI0FjDmJEL8ghvXLVQY4pjGWhXjKVjscriPXHK6ubXPrte9qK6q6K672vVe3XXfrrt1373t3v950/797V19797110XrvXa/f673v2rrtX2t1zq679p3fr712ve179+97Wv3713te3RXVX197Xv9+3eqv/veu8v13t/Va1r3vzrTKJldfPtXVOgxwj4lx7opte94/XVe/T19N5eRm00Xtam9NonojVp0PZGiNRXK1UfXJ10zaZedeTp41yGqRlJs69N5141TI2qpi+dJWtXaWtMkqKa6KJW8jE0/tenkZK869Uhokp9rdq7yXGUfok41TI3lqLdpslyGWtJSM6RvPkbTpWubGpktfnz5klT3665lX0XptTeuq1PRTau1+XrmzJk+178l2mXhEwjK5G171WvycnJ2tTeXkpWba0VTotjdd6J0cjkpGpKiu1rSkLVUKUyI0hh/RByiJeTiFDPCzGoJ6LZBxNJwoQuQPdUtwS9MNF4DnjOEHCFgioL6F+MIGfXPnwLfnzq65equuu966q+9d7Xv3vXejrr+/Mte9f2mX72t8y/bta1F+3aiim1um17Wtai9FFqb2+1PNtRXeiZyNFFF6+828/mVVXotbo5lH/b+mmRon2ieSm2kpGWhTht037dFUrE95GJoSMISL+DnKSXDLE0UxVB2kYV4eRAk5GTi2UlYxgeYX4ZIgQj58JkNYxgrIurl5vHoxom1XhliH3taiRrn3ptVLzbz49XTRaO1UXvVPv8vLz7TK6aqqpKf3n35fmX6Zaqmu8ch9E0FRC9HodTa6q49M5Hk5amZTGdqK6bX6L8jKUTLWva9EvIe1+ui8617T6qpsyXjdddF6abUQvQPcnIZOfHITqqumZXMlbRXLSGJo/ECG8QKoTq43DiPSstKR6mu8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a9rfb7Wot1UW796Oij/veu/Xant0Xo+9r3vV9667Xoq59ddFV79Vp3Prn3roqtVevq66ohQoTYsnWl65967V1Wp+Tl41MtXXauufTz5lMTxfCXJycpau1FNcj0dHR010yMymZPotTRRajo6aLdq5GfR00UX72va9um1NdHRVTenotR97V02pvbtRRa16a6LW7Wpvai3TRa1Fdqe1HR96LW6K6a+9u1rX7972t9r2ovTb7fe32ovRe33vNj8N6K5vMtTTM6LUU0dHTNovRTNtTVJXkpGRtIzqaar2tKQ/kErOgb8CWg4QeIiwcOArIQMUQrRIl50ho6K5GuXrgZkEVAcErBdwfp1U60+1ddU+fequqi973vRfte3R010XovR0WtXa3au3e9u9qL12vai1VqKKrWovTa1qei3a1fRX2vfr796v+1F5Gufauj6Ou9rzL10dq+fNoo73tVR3vai1u0jKyMT/Mop7Wtei1r0XkYzg3RFh1RDqHM+WrlIw5aVhvEKGSPwhpeF6LZ8vDmF6CZiFBvhTi+K4YogRhCFvOqkMOog3vOj3RebTaWkbyfNv0VzeTm2jU6bLVy0YQ26o78gkbRhaVvLz65WZOrtTVVNoprieRkb2r43Lx+mVkaoqhteWtPqrrved0cy1qKbRudPqovRTan70w5j0ZT5OSm8lFcdhMhUhkqmTOqJMfiTOovE0WRZDRRCdCJhtDefESI8JGqCekNEagkYC2gFpBFweLwmw2gFPMkqYF5IYyk4wj0L8Yw4riTEqALOAOeA++NQbIAYIdwAE3lpsFjOpmRLm1RfALuEfAvI9AakBGIEKnyUYRfVHY3DqOz6oHPCQgspSMIjzL2vauv7Uf35G1VcjJScdlYnjcZU1fzIYoQ0Iyi0jIykTzYnhinXhWiHOr4iSMvCEh7MiTDyiXiDJw44iwzxlLcKM6dVejqhOohTggokTpBXB5gAigWEggSEFrChJQFRDuHMF5B/i+D/CTIIP8IOQQeaoewxwP8S5KEyJ4EBgZklBzge4LGEPBX1z67VT6596u1665eqq96p96r13vXXequuvrv3teu9U+uf3rrvX1V/13vPvXeq9713v9drV1T713+rv3tequ31f13va3eu9vnV3ve17/RbvVXLXvevtebe9dXfjK/b79F79+94wt9NFFdui1NfeQXtVClBxhERG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eNRIiqCShrA3YqhXloInjKdyGq8vwiYlwQUMUBuQgIVoygcXA3Ly96+q1+qron3ornWorrrr+q/1966+973ve9F73v3vX13o/q7dr0d+3X0d7zOu9FqO97Wv9qPtb+3a3au1f9rTKqqJnXz+3P5tqK6KJ9pnajva9Nq7SdpWG8T1w1iNeibTaFKq9HRei9c6PxAhHw5iaPRRE0UXmz41eZzOH06TimPyMOpsSo5CxTzYH6QwiJOUhAwnzIlx+Mol8jVTLQx2tPnStFfb66bV1T6LRJirjCfJT5BMovGElDNVGqKeNTJlXyXMkpt6OqOxJmxydGNEfkNqZeZETiimufaWlLU2pmyNVpSfMt0ytp166JTovPrtNlK6+9Eje9qOdTedTPjkgiXMtamJ4kXnUT5KL+W5nVMvN41OgOqABeBAYB+QZIaOSkE+Sl4mlIqvNiaRnRjClermXr5nTRPvI96p8+uqiBZwCjkEMtdp8+ufXMtL1XmScghzMkqeZLzJOmfMtem9NVUjaTokubXVGq5Bb51Fu9FqK6r2rtPlJDTM+9V59dFfVXy06nnV13teu96q70d58pXa8jEaDFIJsL0FhGc+ViaDlAgF4gQbYRcVQW0KsKMGyGaBsxTChEOCShzA+QMqD/AKGB8glIeQZO1rWt2+j727dN7X7f/X37d+/Rf79d/v3ta33tRfta1qL9q7//e9+16726K73tX3v96r97/e1f2varnXn3/r/vVaq9712qrqtVaq9dqufeq1V671Wn2v1119d67VUVV1Wrqve/1xIhTvzJ0pTJSNMym8pPtI12tPvTFkXwmxuUjdqLdu3Re8la0ym16OZemunpptXM6Jem8jVMomXm0TOZam1HM5n9r0c2uZ3ot0WotTem1FVNFFNH9FqaaOmim1FFrUdFFr09Npl6KaOjovT0X+1rWotborta1qPvb726PovPoooppvami1q7Ud7dcnGUU09r0dPTRTRa9uZOkqOZIz6Y5XLQ8iPBCwuwT0G6ORRHZkGuF+BIQkYCwj8bhMn1Vy1peii8jPtEKDJAeUHCBdQU8XRGqvXVfor667Vzq+Wol596K79+1d7372t/aiu16aKK6LUX6b137X+9rX+17X6LXoqm2mU0VWv0fbovRa3a9Fu1u1FrWromfau1dfVafa/e9FdFd/6bTOi1FrV2ote1cV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Yv4jVxjGUyuiKpedVz667/f6qpkfmSCqXoqokpeJ58WXhxTDaiHFUOaIr47RKWk+S5SuUtMvG7xy8bnx2mSmyNuuii1qb2tbmXka5G8pxy8UT4by0JN4dSUOuLJslJR+NRbxbTEmqLp8hlrczlLylF5K1MpLSXMmzJl6Pn0VT67ddVdcyvieM4V4yg1ScP4spkb3teZaZb6LWrotRajp7dF7Xo6e1rVSsXWt9NE2Xk5lM21+umuZ08yfA8wVEE3AUklEGKY7GdcejKimiVqhzCVEOKY7Di8VSMjXN5OXjkctXNnRXVA/wvwHlAsIFlAPCiPRqZRPkZkjPmScnDRMjCJpkOOZw4k41HpGfDiVjUz5krMlZnIzJGN1w8oj1cyZEf5ePT+ufLzIymR6VriXJxhMk4rhpgUkBnSdFEpeSpmVUz4mtOrp7wV8CYjOMZ023z+Z12orvXRXJTJ8pPvXXTXau1NEnMqjk6ZXMolps+i1EyfXafIxqqKa5BI8tOokZGTo50jXPlaO02K5euV4kUx6P08UWlJsvIJSmNSkTylFo5Hom4slptry15a1MZTohxGqjsXw7lYvte8yfRTaTkqJs+N1WjcYwdoYIEpDPAWcQoBPxKgMWFGBNQpwRsOINc2E+OynI83k58b5SZI10U3vIJKPVxjaMKIkzYi8Q5kM0tEqmL7xKmRHriLMiVREquI9cS64zrjHjOXrqkZ0aptTFMXwrRKg7RnBTRLgU0XwF5PgMSOwK2IEFDC5BkiBFUUSsnF8giNXDLNhnlYZJ8Sq4ulZ0reuVjcSrRLkYkSCMpbnykZQTkHaRhxVRIZeQRzvTPi6G82L7SMS4eRNF06uWj0+G0hqlo9LcvPiLVProk7U1TZWRk6ZWqKYnotRRMj8jJ10cZUW4i0zZebMmzZ9qqpOQRNEuQRKi2uWnR+RtNqiqZI8ynpkpKI8RIgQ0QnVw3kQQAEAAFhUAQCKB+4HEAAAEAAAAAEAEQEREVEREVERUREVFX1XVX/XfXPb91f1V9V3/9///////////////////////////////////////////////////////////////////////////////////3/rUwEAAAAAAAAAAQAnBAAAfn0KAAAAAAAEQUUUYYcccggggggkkkkkoooooosossssssssssssswswwswwwwwwsw0wwwww0ww0w000000000000000004004400000000000004000040004444480440444884444444804444444444444445A4044844844449A84484885I84448444845A9I4844488889A888A889BE9A889E89BBA889FBEBBFE89FA89E9BFEBBE9BBA9BBE9BFFBBBABA8BBBBFBEBBA8BFBFFEBEBFFFDtFEBFBFFBABHtFBFHtH5FHxH8BRARR9Q9R7RAR+RRR+RRQ8RAPRAQRR7R8RR8RRARR/A0fEfEQEfEfwRHtH5FH1FEBFHtH8BRARRAR8R9R7QQ7RRAQRQRQAR8R+RARRARARRRAR8R8R7R9QRRRQ9RQARRRARRR7RRARARR/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yVD1H8IR/B0fw1FD5FABH8ARR/AEQEe0fwdHxEBHxHxFEBHtD5EBHtH8ARRARRR+Q7RR7RAR8RR8QAR7Q7RRQRRARQQRQRQQRARRRAQQARRQQARAQAR7RRQAQAQQPQP7QQQQPARRQAQRQQAPQQQQPPPQQRQPQAQPPRQQPPRAPPQPQQQPPPPPOQPPPQPPPPPPPRPPOPPPPPOPOAQOOOOPOPOQPPOO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pPi8OImqi8PIaUTZ8+bTza45Li0XkY1KSUXi8YhnTHIb1wOMDDhUgsIV5GbMqtvV2xe8XrndkuUonXrnU2WUyF7L0VVdHReZXTTTPon29d4/RZZ3ptpn2ytXOmTpGmi29vRe2ibTTZRMrsl022xe2dfjt7yd713vZ1T6LLK6o50SdtEbsvG5KuLX58udI2zLZGfIX65DopmzaZWuLR2TtpopkpG8lbHp8pTbFabaJW8rOkeQpkbKpCqbJVyX/NjE+XMjclVK2QjQMCDveFyPw8kK4rTGoxZVFMnH4/JVTJ8hEFcpKxPZEEhI3vFo9ZzJO2EyPxyfNvMtmWykjEkyyK0URiLza4zNjsyyKykuVmQxtpplz4fzrLY1DOF+bTGIprhRvTPkJODvVEdEN6YfTKJsPYphehhD+iqKx6GE+KYUoniaqF62deKapS9EuuZEltlUei8J0yfXE0pEsrClE3ZEFtdErLqi8bjM6qEmy9UrNjd5CqEaqJ5chOlJ02q286QnReJIkjEajUhKy5nZbMnV3iiNW1xa8PauL0RWfI2S6L2TeJPiSfVIS5sheKJ8lIUVS5kTWzpcRWTZtU+IuRvZIyUE7AcoBNw5iWBeQD5BdQERBI3gNEL0dj0heTl8RcVjXZVTeZOjM6mViaSisdmxqGMlNgzQX8A0QXsCUgPEyEeF+PxTH5tMpN67JDh1LkJG3l20TJSL8yXCNCxE0nbZR0zqpCuyEyFKEyKIYRimVGABAAB6gQEAiwfuB8z/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3284wBQOgQEAAAAAAAAAAQA3BAAAGOYLAAAAAAAEUUYYYYYccccccggggggkkkkkkkkkooooooooooosssssosssssssssssssssswswwwwwwww0wwwwwwwww000ww0000w0000000000000004004404400400440444444408440440044484844044444844444844444448444484848888444444445A5A8884448888048849A444884449A8488888849A89FI89E9A49BA49A8889BA885A9BFE89A9A88885I89A9A89BBJBI9BE9BJJJBJBBJEBFBFBFBBBFIBIBJFFFBBBFFBBBFFBJA89ABJIBJJBFFBFJJBBJABJEBFJJFJE9BIBFJFBI9BBJBJJFEBJFHtA9BBIBBJBJEBABBBBJJBBFJHtJI9BAA9FBFJFFEA9FBFFFBJJBJDtJABIBHtFFJABLtJFJLxJIBIBL1IBFH1FJJIBFEBIBJJIBIBLxIBLxEBFEBIBIBL1IBJLtHtL8CSASS9SRSSSAS8SAS7RASRSASAS7S/D0vwFIBIBL8BR+S+S9S/EUu0QEvUu0v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1L8QS/AEu0fwZL8lS7RS8SASAS/BUgEvEvUgEQEEvku0vEvEvUkAEUkkgEUQEUkEQEUUAEAEEQEAEfEUUQEUUUQD0AEUEAEEAEUAEAEe0UD0UUUUUDzz0D0AEEET0Dzz0Dzz0ADzwDz0D0UTzjkEDzzz0D0D0TzzzjjjjjzjjjzzjjzjjjjzjjzjzjzjjjjTjjjjTTTjjjTTTTTTTTTTTTTTTTDTTTDTDTDDDDTDDDDCyzDCyzCyyyyyyyyyyyyyiiiiiiiiiiSiSSSSSSCCCCCCCBxxxxhhhhhhUQIAK9mrYsz6v17o3PtkHEW2v30LbZSfX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EOHMrCNXgqQR8DLCTEeIcQ41Ul4ujsP5FBthnGMQaEfqxXDmFylM0IdwfRlCJBqoxRKWxNJpSKOctlIlnZNdUlpqbk0RJShbYiaJaNmXiWVulJi2jToWK1efOwe31Lowq1rbZ8tXn32ezVl7M7Nx2bhZk85JIhds1RiqCxPtjGGk5J6/bfRsUbqM5Pvk0SSaMrMvVmZ2fCDBh7a9ecq061e62T20b6Fe637qdCJqkOYXoRaMfim2IUllalSOSatQqz5ectutnasa58vJ76F1ftr2aESTttidui2zZn2ZuGl0gtjte+xbUiqJZLQo16Nm6MI1RtlY3QjK2vSvgAEAALxyAQCLB9QHrP///////////////////////////////////////////////////////////////////////////////////////3/3/z8MBBBqcgEAAAAAAAAAAQAQAwAAL3oLAAAAAAAEUYYYYYYYccccccggggggkkkkkkkookoooooosssssssswwswwwwwww00w040040040044408484444888448889BA9A9BBJBABBBBFJJJBIBABEBIBJFJLtIBLtLxL8BS7R/AUu0vwBLtL8NS9S7S9R9SS/AUvkvkvwNL8AS/BkvkvwJL8sSSASSS7QSSASS7QSRAQARSSAQASSRSQASSSASSARSRSASR8SASSAS8SS7SASS8SSASAS/AEe0ku0u0u0vUgEgEku0u0u0vEkvwRL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1ZL8GSSASAS9SAS8SAS/DkvwNJH8ES/C0vwJFH8ASR/A0kgEgEfwFJFHxEBFBEBFFFBFEBBBBBAA9E9BBFA84888844885A48848840444440000000000000w0wwwwwwwwswsssssssssssssoooooooookkkkkkkkggggggggccccccYYYYYYYVEgAV3T7qU+6d33z61uxMzp1HtTdXnTpmanWOFIAbU6MnPvoVKE+jQnVZu3Ts0Lr6M6d1bM+xNzMpABvdMx6rEqV1ezIWL5SdQvvo25/Ovnfbrd10ACehatWac6fOnULp99mlSs0p1GL0Ld1rvv7U+AGtvt9ufS777diva7M1fzfNS1mLU7dK3fQgA4t1ZKjauqTrPQ50xGa0GpTtRefXt1b6k+ja4AOZ1mjYrWp1qhRm61mhUmrVqfYvoXWrdmz2uzAB1Tk759ujZsTUzPm7dulXsRToVLV3OoTFu1VowANb5q1LzU1bt3yVmxfYpW7M6x1bUlPnX39ChbgAc2/vr1qFq33T5CdfXtWbU6nd2pqzWqzclKQANKklPlLUlThinQtUJ903I26981LUe+daoUad9SAB5RtW7NizHI3JT50vfb4cvluxdQmo/fOiX1bEAESnXtW5edW6tOf0Lp8+1Yp3zrVi+vZn3WrV8AHtufPvoWZG1zpLr2r6U3Pk76NC1F+zZleSpwA3o0JSUo3RaL04rF4LyEWi8DMjKUoNwxDHAxEoUisF4rIyEAB6dCk+Gp8Ga8GpqStxe1S4M3UqcpQoz4YoULqVC3OgAMTqFCQkqdqLyVm3OinJRSvbvnWp19C1ffwiutwAbSshPvvl49ajkzdwrSjFKhISt9ChVpSN1uzJV58ABaWs0b7M6xbk5Sf0LNq+zNVZ1elXuunW7V198ABuxdI17768fjcbnQ/MTVaD8+bidm+/hB2LUP2I9bgBxbsWIjqzNWD8djEcqzEvYggmYxXgn7MSgKIjh+rCSjarwASbrNmbutROvY5S1Pm4/ZqTctWl6Fm+lat3XT7cAE6hffY7du1an0L7r7q9u3ZtXc61259uzS4AJ9u+fboz+6hffdUoUbNeO17cjWnTMtM1ZeLUoRwAUYtNRBHqFitVrzc1WoUK/M3SsTnRSlK3z7N0MUaMAE2QhFCOTlYMRyF751inNz4LxaP2bV1OpUkpKhIT7U/gA9vtT686lSlbF186jRtxKXt0J03OnXzF0To0aF8AD2+dQt2JOn325S6hfUusWJ90rTpW7r51Dn0IAG0+lfOoUrp/Upz76UlJXWbMTn0qcSoUZ3MW7MAHdLt0O6+xa7qtOxbs2b6tXrS90jIU59i+lAAznXT+3Zn177+zbmrVG3OuuvtzdDvn2rVqYgAXSNO3OqT6FC/tXzpuOU5KdNdO6Rt39rr2bV0/vnT50j175q6tDEciKK3Tc1FpiCuzfLxKGa8jAsikXvm7dGlRszq1OP24zZr33W7pW/i1WlJ14VtW4jm4zRtQMzcNWI9E6VuzPoX0bN06z33zV1eQt0pK3a590rZr8++vMXW5OzNX27FKFo/Pn3Tr5/CnYtzrN8/usX0rc663Rn3z7N83aoRyLzEUsVaUbj0IpqxZr1bc+fb5OI4G4KYDKZj0biGvMT5m1RmrN9ufak4boTrrNKFpiZgYtTMRx+lyNutNWrFibpRuRrXW7E+vf9O1KTVmRlKVmFY3dL15ibjUxEMjBm1F7qsUs1LVO/g50YRU5mShNGYikI5PlpeKSs6ToTq8Xj1uZt2r69q6Qvq9LrUL+pPt1q9jrSEpAsgcs0r5axfITU6Xl60Sm6NedXoWbpufOh+blr59KvB2vDclJSdKnOnU4KIpDMzNzUhak7ctZrR+Tuj8DMfnQntzql90vKTqETi10pCKfJzFWhUtX1pmhOoTUlL04WlY7IWLpSlVk77oUi8lJT+X5KnHJ8Xl7uQrWo1FLE++6pVr0p9KvE61CJS9qfLReM1o5KRqzEFmCe3Lwglr45Lzd/bmInRoTrNmZjVOblbovYkrMxWn15qx307rVifVi1u3XqX1o9ZtW59S+3Zi0zC8+zNyNGdNxWpMTFXpV59mtahHGoO8UmYYmKExGOBFLzqUTs2ZeIacD9SvZi/SsTU6Ts2KtfkJ1exKU5e+hTmZ9GhFbFihVnXzNmjG5OEXHIvD8jCscj8agsncnfIUalaR58TvkrduzfWtxKWhinCtuUicWrWp1HlJGbqzEJJiFrd01dLyNaajsQSdaPRyjIRmLx6P2IzShaX5C63RtX0Z1OTryFOtYlI/L3TrdCvNz7F1O6jfbnSdexatT7PJ3S8zEVWtEp0tKS0IIlOsRaNRHJUInZpQvDEdk4IIEEC2fFY1Ug5JW4lXideXukZGDtirBelClGKx6VkJCLUIhnQJoMwrTgegfiGB2JVKtCQtQeikQxezI075anFp8lPkLN06n2JerSik+hf0a1ql07UKXXyVefSnT6dKxNzrPQozr5elFIVoTUrF4tZmalqjfarx+arz69a6hRk5/d9ChOupUZC3Ix6JVp01arT7r51G3ZrSM6xUkbc1boW7r7u3GqsctzV91W61FYjkYA7IW7cfkI/RpV6t8lQvo27V9mfbsSE6WpTuSs259q3apTUjOhWfCSjKX2qU6vE510bgXtw9I0oYic+lQm7pKjbtc6zZnzu+6jfZvqU49Qoy8MUoUpxq1PmePU4ViOOU6UxRtWakhXn31bM+bm603btW6MnWn0Z1ixMTqNW6SszoxI06dSbuj0LXWqtK3dfRnX2bNu61XpSnYtWrFefPt33zrM6ddZs2bo9Pp27506dOtTuzRup8+3arXTqt986xfGpmlI24jsV6UnaoyV1STpTFWWqWKEtRvujNanCO3EqFGXnT49VkqU6PV6dObvjt99qn9iGZmhxO6Pyk1WjcndXmalfs26lmag9G7U+dNTp9ijYrz6li+hC1GzNzpGjG4zTsUpKOUp06jPm5udQhWIe+SiOYmYrZoX15enfQp1bc+f87upTpq/ukKda6f1+++anxO6hRl7ETtxO+NR++lGaVOSjcrNz5udOrxq3SumKV0Sr0K1eRp2rpviVrum7Vq+hfXrXWY9MUObkoxSqVqlKYvk5eO2JW13wnofKz7V/f9e66zz6V1qzPsTpu1arzqV1PqUp9qYmZ1vnWLFuQqWLHQty8nM0qVO3J15mJxngZrQrD9KGOCSFL4vApitmRgVQzF5KCGnQikJJSHrMOReCyUmpC+Rmq0xJTNCvbmrdC+akbPL30rM1Ou5a1TsTNmxQq30q9efbozdetXl7NqrNxe6ZrULV8tamqU3PlK03fapWJGhNR+YuhS3Sis3aq1oUumJO1dbnToxC0Yvs27N1q3UjVCJzrN0pat3XU77p9CnRo8fpyFaP0pG1VtWJOrSnzdCTtUJvmqcvMTUlfHLFazE7cZtQcrRSOQ1XtxHLR2FJmHo/CWTmYelY5dJ3y03MyV0RxWOUo3Vs2Ze3Ps0KEO0qEtToTp1C1fffy1eQjs6jO7dfutW76NqvZrfPq16kvSmruUr2KdqdOoW6Nmn2rd8OXRaQjUpSm7UGpCxXilW6jIzfwbmqszEp8KTNehK8XgdgrtQXkLp0MyUH4VmITQIYelIWk6c+lFJaL0aElSvkLNqxbtz7qN0+xdQnWb506zRnWrVudzNe3IXSVa6Ym5ujS5199unOnT7FezD1qJ9W3RnSUhbnX0b4iqxazVoWp1inbsTp1ixy19863dZvkp0PVYUmpeQvn1qVq6dzd/QsX9q3bnzrF1SZkbrpqzRoc+anSEVtzotXmbFGvdbn2rNa3OqzNCJS01Rs2p8+Z7FunfH60zPlL5K61IWL6FS+zfbtchZ5GQ5S+3aoUKXZqy0lYrW50+6jfPt25a6dJw9JQ7ISkSlpSVg5Ce+GZKZnwWU686tTpzElZmJOJRqVsx2jHJ1Cdbsz6HIRqhFp9eMQrPiKLxWlJ2qk3NzFKvHbdahQvsUJ1qpVmpOC91afPrSU12JC+xZt2Z9WJ3UrdSxPs2rM6/tVe3Zq86dbtUe+6vdaj8GL7dSQoWbofhSI47G60Q27U6Zj81WkpmP98+agxBNEpSpI2rEvPjEZjdGZumq8dnTdWjWoz6M1UjU3QsQbqz68jGYgkatmIb6MpLzrMDkAknx+1GZ1Gha6dS+XhuWjk6Ut2JeQi8Q0ZW6hC8xEpqdViUR0ItBbfTm68DcJZCHodjVCxJV51WtZsVb5utXtUrVGjWmqNCtGpGxTnW6kzJ17ctFpuZpW4rVqUoegYpT6UDM1Yjkcry9aQmZ1W1biOSiUFkxBbNQ9IxFLS1eNzNmajtPlpKGK1S6zQv5SPzo9OpxeRnQtUi8K14lGY1JQ9JzovyFCdI32u3bvt268hSoUZmnQr0LN9CM30PsSFOFJ9izToQ3GJq6tYhqlH5ujC0RWLUxI0a9KFqcfupR2dPh+pJy8SjdSNQXiGXhDBRBVMxHNwUQegS3RBCKIY9BDF7MMT75eamIN32OYmbVm6tQm6tmdNyczC9m+bnTcjbl5evfEp0hM27FuldamJuhPlI52pGPwzSs2J8xC1CH5mdMwmsw9OmaUfmoYqwnoxKtK16FWGZqrMxTq16svRmoLa9m3YtS1q66hfO7VitdTs2+QnULNe6PTEGItIRaYox2GJaQgvSgO31rV9mxXk59elXj0hLzVWbsXTN1WrFL4tMSMlC8amoVgkgxHYJ5q6hEcDccnxatIy8KTMxLysIo/Xh+QmZiRiGVhaD8rI3SF01PkpCnavrUZeJw7B23Wn26slbj11m+6xZq0akhWtyERXTdipMwUfx6Uu6FiLUY1KX1qMvDteMxWAhqUYZlLElFqsK2aFaQi0KxFTkYIY7GYRxFFY9Xk4TU4YjcQQtG4vIwdikJYB6HIAxgvQk5mGZehCslSpydmxb7rU6+fPs1K0+3NWu3QvkrrV/Pp26N8zfb6U1A3IzFqrPinK3V51uxPrRKlVlKFi61XikpMXRaJ0oUicBqdJW4HJKvSr2bqFeWit9eL1LPdMzpavUgQRqRi03b5CYkb591mUoUalOXnUbFqjapSMrdSn3Wp11aSpTVaC8Whu/tW7U63Qvq2qNSYkpSEsN1ocqTNClaoX3Wr5qEMKQrOp2J1mP0Ze1PnS9aRnxudHK9iz2rd9mvMVqlepy0+K2aF1unOvt2rPyU+dH759CjKR6xbtW7FCan1JGL2rEhLSkzSmZ9ivWiVGxVn8fo/VmZe3XhS7tzuxQrSFidFKVqQrdq1NSc63X776Ni+Hp110+zfYurWOjbsU7delOo0fuvoUJqzfatWKEhauunX1/mrV1udQs2aFihb6Hasz5Kh3V7qcTjUlSsSM+3Wt81Ga1qTgH4ij10PQrEp13OsTNi3Rma9KfI9q1Ws261e3YryUvbgvLV+xbtWqtexRpyEdswvavtVq9ShNzMpauozp11matxivavt1PnXTVC6fHaFW6Py8R1ubrVrF10vdZpT7fOmrrPHbp1KrzrfPnVrE7uv7dOr2peRm6VCrFZKd8hPme+6ha5q1WtWa1Cvbuvp8xZuvp3Wq83OrVas6ZvhWzYmbUvzMtUr0LNWZiCtHb5KJ053bv7d1adbn9919vv7q91ixOnc3Qus2+ldNzdivOvl+TnR21Os27N8++hSle1Vk6UShmQhSfPnWoSytGA5Jc+GYCmtUlIvMQtC8AY3yEnF5WpDcAcRWFpiH4UiULwJYnJUYflYldDsUkbNW+jPjV9G6dat1o7LyMj1brUdt861Mz6Ees2rF1/Ny1mtGK1e3Tjslaszp9GjHaFSzMc+xNyVCWkZKlITVu/owxPtS9qrbt0LF0tOsTE+zXoy86PRqbpXUZmfPvpzr7NW1WvuszpmJWbFmvBmdOoTccnQxNXUo3ahydJS8dmIJJaPVZKvLTVi1RkIIK1OOwdmo1L0Yigogll5iCqjaloTwZiCUuvlb7cGYet17PX7peZtxDDtS1Vtz+f3zqff1r6HWt06E63Tun27VuvPoTVntXUZ06666aodmStSU6damrNujWkJ1WQt3WbEGK1ulWsTc+DNC1YrUJatAhrUbr69qrAPxbl4VicZrwdo16kGZ03dClifAehNPoTMrQsWal86Y6N0zI3zMldO7FKdfRrWpaZp2Il99a+xXqUpK1dXnT5C+Qn0KM/oXSdDoV7FC3UtWbMhQuuqUK8RWO7pTNG6javhS3Xtc6++J3Wp9KnSutVaEjP6E6fM0p/bu7c3QvtV6Vqv3W+btW7drr2qluj0KVC1PrdqdfddffzrVazYnWq8jZt3TrdudP7rdWYoUZ0++dNSdinS51iXtV6lu66/pW7dq+1OtWr77MzTi0C9u31KF9K3RvkKEhJyUdlotHrcIYagMLolB+LQ3agzDkJYL2IDkpDFCGaVmhCSFIgjc3FKMJ7FqxH6U1SjkpanUrduSoRKFLM3Oi8hFLM1XtWrM+hfQsWbc6pQjsDEhPukLdeQocrdTtSF9edSo17czbt31OtfM0pKtUnUuXs1rrqM+zf0J81Rk601ddOiCQnR+Qty93fNT6Va1KWr5Wxap2pSbiUSloH6kBVQidm6nCCtBm+3Pk5mhbsTq1mnSiGpCkjGInTk4xOhSTmLdWJR2PQvDkKzUFkvAJodgmqWa91CzISFizQunUKlmZkK/fRqzNavdIQig5Mx+G4dlZudLwrN04cgPx6lZkak+daqX30rM+hdGpGbunWL6Ecnz6V9C3RpXxirF6NGXlIVh2G4zyfZitGbi0vH7dehN9GXlZuUm683WicZmYpL1ezRkelKVJHrz5eN1oLwUwtF7clXtxa3IcNzFKtNwXicpBqlIyU6lasxK+jOsSVmdKWOzZvnVZO1E7rU6YnxS3fRnzcL2a/VsS9G3avow3Grd8OXytmUny0+6lJ8RwbvutRiHIK5uOQvRiKbhHCaYpxFEMAetVIRXQ/EcFFjozMzHYLwQxOCuIZuC2I4VjcQRqIpub59ixM1JujXnzUlOtU+vQuoV7c1MTE6+JVbr7U+as2qdaTgM69fr3Stq+dWmoxNTU1DNC+hEfRkISVLctNWbM+XicTnUL59ezWrXRedWvlrd0zbscahutTj9azTsULcS7c+zN0rESpRq+fah6CKAN5WhUsSUE8Pxe+lWm5eN2qs3VmZ9eJx2xHp8Yko5bnUaEdk7VSJwcgMoNwZryEtdH5OpHbcp0YRUKl1qNcflpiNxKjEEBqBbHI1MzFClHY1Rj9CvRlJ3IxOlGY7VrzVOK0KnOunc+hG68jFLdCjWidSG45XrRDLVpCJVYfpTcnZoxKjXn30evRqSVOH4nE5uFpK3EonZo0LUF68Hp0B2nA3PgcjFKGq8fi1WlJ1LcEl8LwWQN2INXSknK1ZiKz6VabtXy8Xo2ZiHbd9/1bMUvumqcbmK9mhOoTXSnyM63z5uMXSVuxOmak6lxTqSMjEVC+6dYp143Rt3V5KOW7p1uRl7E1O+IJ8hOnScxFYGa1u1YqzNKdLTNGjdSszrE3damb5affbtdi1Zp2LFulPm50hat05uzHonfUhnt1ZK+bvuvn31qPfOtWJft27d/Sut2atqdfdPus1ezdQpTV1KfJWIpJXys107M7vsyF0auvo2eapyE1Qvr2Lr77XYm7u+6PWqXE6cKXw5TlLcWiGUq8+VrQxNzEjFIzQnTE+vZoz6F1SvPpzrNO++Rnzp1mJTqt9Li1mXj1unNTpihbuvt2b7d0pajF10+hO7Vq3d3176Vuj1exboUexPtXT6NmtYqXz7M6dVrQtVmq0+6+tVtXz7FKfbvmInfdI3z7rFafdZ6E6Vs2rc3QozqlmJw7DsrHpGP38ndEpulI2LMUqz591S3ToWqF0bvvo31oZn0ZTp241NW5SLUJ10Wj8enSE6jOrT5axCsxGqc1Or2Jidboz7u6hQn05OSlZupQituWryUv0aNCzfG6sjWiCffLRBQm6lefaqx+Zrz7E+PXWbFC+hOlrd1qbnStinJxyIpSfNTpqldJTN1C+6dEqFCva58tbk5iakLFmfQtWborNV60lam5qTpTcnDVaRuvmYUkI7MW6d1eJWJ9G63Pq251C1bt9qjX6Pbr2JCZlrNi1aur83btT5nqWbclH69ilOp2rqc+hIxqSpTq86Qik+6Vp26kMW75KF6cXnS8ORmUoWJ01NQNXz4FdWJ0YFsWugxAlj0fg5CGQq2oBjBbfA1AnlYjqQkkZuUjEjVqS3Qsx+fdMWZ9C1MW51GrPt0Jq1Zo1bEjaqzqFGfPj01Vs2KVi1StVZSZsR+halLNvk7dCdTl4QS9G+jQke3DN9W6TmZulTur17qkt0OMRSUh+ddKWrNCTjk1XkZSrRsS0atzcSrzpavBi6LTUaj0VhFPkoDUDUYmoYlYTzFiMRHTqzUPQ5N0YTzEKcRxeEFqdEd1eDt0IoTTcJoDcEtq3GZeO0YWjl1uXr3zq9qa6tmKXTF1a6/rxKWoULVi6xzN1StXun2rqVCzO/tUbNadXpVKUdmLohqT6NufP6tCpTsWJCdE6kjfLTdejfXn2e+UtTrEpbtXUL4pSg3UjNSB+zIXQaqVaNejIW6ViJ1qFeJwxAxRpRKVvr2b6VC3WqRFUvmo/Hpanw1dauvvtU7FfikPS8GKcvbrSFWnZt0ZOhb5KQr8hdL0Kk+rP7NCzQlJCv9m6jYpz6k6rWuvvn3UKFChdStW77rVT+dz51C+1Os2ZKfYnW7VqfRsW51KtHKM+RsT+6xOsWbN863Yn3WbolN251SlWsz+61dao3d/arz5/arde+j2qVuddZm7r6c+Qo2p1Ohbo0qNjtTurdZt0K9ihXnWrNOhbo2ZuvMzcvfaurWqN9GXlJaXjVahMUp0XpwtRkKF1mMQO0Lc6jE41E68hRgIIQ3RSha4WqRXp0I/ToyV86pRr3zuh3zu6rSiVutMRKtVqyFm1ZnWbVmt1K0+vZt0LU+61Xjtu3ZjV863dYoUZihQt07U+zbtzcjXrSN0+nEEfiK1VkItar16cxI0Y7MV6Vizanz7oipXUZa6L0LVCRvulr75u1N0eVgoikOzrEpbmZaPw5Wj8vLzo3bn9qan27V06C8FkjYmqc1CGShqXn2b7MQ3U7E1GbNmnQoxeaiLrTExIxiAPxqEEvNSsZsxyJUopFb6N8lyl066QmKFCYozclVi8NUpmSowzTiklMVJGrXisar25uxYrxKrG45ITMvbi1qQmr586TsToxJ1pGKSUdtXWLdqzPn2Z181IWKFudQrwpGIEUEUJpCMzMrdNxelOgYqXSk3Dd18dkJKOTN9qZtTUTgjhLXtwghWWvm4DlKUn068jYnR2jfRq06snbmJqxXkJezZt049KSM1FY7Xt25SFL5apRic3GJW3GJe1ZkJi6KQtE5SRkadqnfFoilYWm4N326M+lA/BeXqQbvjVaUhaB2vUmr7UPxuBFEMSh+QqwLxDUjUUgL4AkhBHI1dB+nBNRhDXh6bjMtWkLNCbs147Qt2ZeZmrFOzSsyNinZmL6svFa9qxSmJu3avmOTm+xfWhDH4tbg9UhepUqxmlRtQ3GYGrVSxI2Z1izHo/N0I5FZ0KVYYnR+6Rt327MRRDGa/Xut9CSiOjCsfjlWRr2pGEdOJzUbl4L2Yxbp0YEUJJGIICudC0doU4nGIKINRypC9qIr7cR1o5KQ/ZgohSYjt1uZusz6sOwMQ1QhqtHoTwbjNOZlpqFrc+xUrWKU+ddPnTdO6XtV4aiV063StSM6PyFGtJUZKzfas81XtUOUoVZSNydCfHIMwrJT4nVs2Lq9WVlaViSrWLVCUtz7M+Xr9q+pXkp8xJScrQkbM1Qi81asycnRq075iO0YG49OpxaJS99ufRtV4HL5KBiKS1CZtzFOMxubk53E503YpxaCK3aoVaEpy9OxUlpiJRWZrSVWJ0J8pfFOTlZWZlLNORoyNitfNVqVmdSs27/n16dirOt2qkfoSNC+dOt3X2pmL30qMeunUr6FKdPt3c66HLMK2e+rf159exPm5evSgYtVr7rdW32p19e1Utz5eWv6Mh3VrNutffdOvoWevTm5mvfN0rV1e6rWoy863PtUq/br0LVGO1bq91KrZpQ7QvtzrdG3zNufYsWrFqblLN9O6fOt0Z1v593fIX2bE6akZOam7E6+ZoVLda6hSnXVorGZCTs2I7EdmdOnUZ8nbrX0Ps30KMld32/n9m+rYmZGXszdqzbp0Ju3bn0a86RrX158+b53zqM66dbqzrc66xPu7+dbutXWLdudfanz+13VrNXo0Lrd8+db61186hQn1rdq3butT5HtSV1qRo16Nq1Yq2J8F+O/dTpy8MU51GxfYmbrp9etY5ivbrVYlWrUehbtWKEzG7VGxOp0bdHurWbValDkjajfI0pivKzUtNxBNyFaH7MelJKSmIjvsTrdKz9GdWoW7EjfVsVb7VevWsWZ9q3fQn2Zm3f0KlWzWm7FqfPtU7qdatWm5uVik6Fo7fRlqElJSUv3xa3OrW7qElOr2rdeVnV5K+xWvhi6t17VmasS9iffJ3RFSjVGpEp99u1H7qtqQ7M3br1Lqtm1Xn3WIiszU6jSoTdO6zbj/fdYoyE6naqX2J0lf3WYrOnXUr7r41dRvidGzQoxuJVad1CPw1YmY/RlZCjATz7ulIzccgDsDcSvkKE6zACDRi1ORnS8EcMQLxebi1SUpQAXpOpOnzEhIRylI0YtCsnC8AJcMStKKcnZh+fQnyFmlKQEsen0qlG++O0+Mylq+lAo6Vu/nU7N0jFaFvvgkp3y0+blaHRoUJqdYpwKJKfKTMIIXvrX1p1m1MWYFcj3ylGhY7p9eavt3wJ+nGJiQjUJ4cisxN1aNaagKJqbmYhg5G5uDMbrU4xXmZuAIMQ16sIa8R16VavbjlitF4R1oUhyvLx+IYJ4SwUQjhHRnxKNVrrpurfdTlaFeUo0LrPOvo9Gdbty99mddQtz7dida+ddZs2L7V81ITdmZq3ylm6brTqVOUoz61idNzrdehfXuuunRKvNTuvOtRDHqNO+/ugPdqYs1JGtNWp86xTm5SBy+Ss2pm3Rk6VCtHac6FoMU7EvFaET4VpWKVjp151mNTUhQk7FO+6hPt9qQuo9exWumoLyU6GopJ1JWh3zVqtPi1K3bo3ROpK3x2dZtWrcvRozpG11orKXVbU6zXlbHPu7Udn9u+fQo27519i+zfy9uhSp0p19Ht077Vm6Ir7N9eJyNa+NzcvyNmzajcjboz7+Ys/yF11Xt9q+xbvuvvtz7de3ap0efdRs2ehSszpHs0qHXr327NGnOpWJuZusS1exXid0hPqzqNShJQZ7dudfSs3XWbM+zPm4ViOlZhSlPkZmFoPTd0+jbjsrN26cFUVgVW50hzMagRxFL0IVvmbrE6QvrW5S+jdErNu3ffburU+Qj8jClulyE+tN25ufNWJ0fvkrXYnWL5u105ebt1bqFavar27q1m3I1+dPr1p066xRt2pKfPt0OtfbtWatPtT518hasdSdf26dSdRqSUhfXrUopXoUYLbM6ZishVvgzDsCqKQchaar0accq1ZOTsRerfYnVZWXk43A1CSCevMX16VqSlZmD1CEteTkLMxBeH4nWgQzEzHZOHLEQWetGYMxqHoVm4hiUJJiE8DUEkrG41fQoSFqjZiKJScYo2ZefbnQ1Oj8hFIXm6cVn1b5axIW6lOdKUZejUqycYpwNRiRscZqx2PT5u3dNzdKFJ9mCe3MSFWE8Ujs6JUqd10nYsQ3EULzViNWacI4vfDM1DUA5JUYMRuKQrC0Tp175GSoQ1DEKUp8Ss17q8Tkr+jXs1onTkOzbn8lZoTEdhehCSUkbFmpH7pufXkInUisnJVKlWDdSzKW+hOnyFetKdazUvmKl8jL0OEcUqT+SpRKvBu+tWl7MSq2rVaNRaWhyZiGfZsyVKhfLQ9BiHrpSG43B+E9OE98OToRcH4UjMrBFSgKYlBPWg/IQkj8dj83RmYlbsWonanV58vMTFCbszFKzDc1KWoXpycbm59W6GLogmYGK8lLVp8pHIj5mfBmpTq3WOhbmYxYpTMRV41LwJrUUqyFaJy1qdBunAqmp8fhPfIy8pYkehFqcIoDVqnD8A/PiktIXQpG6kZlo9Vr8Qw1CkKcTq2JuzG4F6tuvUkp8R8durcE0D8bhJHo7MRFMRmEEhC8E9mTi0HqcJa9q3CH5iIY/L05ShZupUZ3Ptc/ryEhdbsz6FmboXdChQm7rNW+Qvk7UQUY5HpCzIRKPxFXmq9SdIW45XkoTVIXtSE6ZpT6s+bhLahepEpCCSF5GQoWZmhMScdhilEoji906+nDF0rEMBy1NzdeX47NUpmSkIij8Zn2OxdOq0qVTtyMejclGocicMwTV751avOtclH76tm63YoVoUgctTN0zfL0aNGxYoU7dSza59qQo0erV7PfWmb7N8hUqydKhJV69/IS8+fdZhuILr7VntW5CfPn27FS314tYk43GrVuvTrS199u7txyjGZeWqUIghSHJqaiCjOicQXzFazZn27q9KpRnUbffWtd9CvPkOYt0b7FudIStSRtz77NupR6k3OnWKXQjsYkJS3OlovaoyUPWJmLRO6Ztyde+hNTp8SvsULdezOtUruzfQt3W7pWzdUvrXUbMrOle1fOmY9I15uLxKrbuhLOiULx+YisPW+3Qvt3zp1i6pfYtzrd/QpyNabo1pqGq8xVsUK1GrPt0a8jL2opbq8tQszr6FqQr0O63OtT7da+1b+fR69K+xZnTV19Wd3V7U+d2eddIS3brT519KfffYunWZStNUrNe1am6ETvvvhWblKNK1ZlpDlopdWo1o/amonWm6Vu1RsduOXxW3G5OpEEhHojmYlL2Jm3bmrMn9GxI31Kkf61qK27fdfLUKMF5ePwvUjluEPWictdSun2r+UrVZa6jfdfaqUa3TrVb6l1qjQtydq6xZtU+K0KFqNS9qhTsV5O6xHLVKHoRykRScldNSNKdG6Enao2JDvo1LMjaulZ10hZpUaNvs0qMpVsQlj8WkpW3Wj1mJwYl7V0Wj81OrRmpKy0esxHISdKPdi3KR2Xk4htdiOSNCfI0p1ivyNSzZo307FOhUn3xmP2KspMc6jO5ulKw5JSdqRj1GA5CGYgZhNQukaE1L3yFq1FJKvIWrdCYrUu6zCt0ekpelMz5KTg/SiOXgojcWvgkk6duCahRnwJ6ULwXgGsNTU+AOY/ThSAlgxdRgLqUaowjkbFCILdmlLT586O151qary8xGZOFZ1ijQr3zV1qrNTVePToVi8elp0TqxyW5mvX5qxOszUfiCLRuMQjlJmZka0zEp8Stw9NwzLw9CaRh+EtmY50KTcQQLYeujtaPRHNclD9a1LzMvOt1YxMwYgGEQR2+6Es3zcFnJxqEslEFWNXSNmC2PwxZgVQvBbUh2aoS9i1CeIovfRqzq1SxKyUSj9e6NTd199OzWnW7VCddbrSEr3zudIWKM66xZs2KVW3dOunWbp0+ZsQramI/06dC+WjcSiUpEr7XZmb59CFbE3GZODtKSoV5KdIV5ChNWqFmvaoR23KROrRn0I92ZCzZishXtUL4rPqx7vkYgjcXhNMykYvvm5rvnQhuqUpOFpWjBevfQn251erQ+zQr1opdSpUpCUpyMjdOkLNu+3WsU77FGJU6t0zVur3WOhPsUJTtVIrXq0IvboTNC7t3cvO59u+da519Wrffzr61iP25ufblbXJSN3Yt27pazNRSvP7MvfOtTc6J2JWrM0ZS+dy9OffTuv6duvXoVKV06hSnz6NuxT51m3X7qPf2b76VG3M1pCdTqVLM66tan32LNOfQnVuNzctKVqdSTtVLU1ZnzEtWnTpevRrXy1uJTp9S3XoS0TtScnOt3W5GnbmoA7CSDEBBDEpAeginRSJ3QrT7p1fvs38har2bFudbtWb5K+fEpSrOox2BiE0jNTfWuoxy3MxulQiGWjNqbmujNxuhC1CbnT59uQ6Fi1RtS19KhatSdutdbukq0hdb5G1YvoXWIlEp8tVnX1513RtX2ZmjfIWZitfMSMc47OuutStWnSvoSdirAzQk47DMzCtWDtmdaoUJ83YmYUvqR6CuBuC2DUhFYHYXoQR3RBA7ahHGrVWYnXTU1NyNKFY/fRisrEpCYpyFKXgxC8GY5AvB2NR6JxBRi903zrdrm6FODsbi0DM+nNU7Fe6rbp9ehdThWdPidW3MzMTuiCjFOYozdCKRK3PkoUmYpByC8IrozTjs61G75uVtT7c3bhapan26MWn1JGbhWRnxq3JV6MekJ8zdPiGDMxXhiPSl8K8dpx6JQlgghmHqMXr8FFaAyical5WRkJ0WmroYsROboc+vYrW5C3NT6c1IRKrRtz777rNeamaFqhJUrfXvt1bpeIIDkjEEXkpOThy3KxWXkqtKjPj1abha1UhSvYj1m3N0KMP2YUtVLoUtyU1zcpLVYcpx6tGbMZqQilIitzNCOzoLJaEMJIhg5Dk+IpOCiYgknQS0oFVqCi+CeYg/dEcdjtGY7EvHY9FJeOyMxXm4hsdWdSmK8rYjMnEEQVo7B+vFYjjVOCi+3fHrFuxH5m6Zlq98egfkYMcbk4YupUpPgGsXgEtGbpwtH5eap2LMJYXpQ7RhWNXTUVnT4xB2hEE3Ha9SPyEZlLUBfBBAQxBzETmZiEcJI7NQlj0tJS9WZisQxePwQyUBuPw5GqN0bmYUm4EsDV0rDN1aQj91afOq26l01CnEFmd0LNa1JWJGzHZ0rQ69X+++dfUmpWdYozPKUJ8tRheD1q+vM3SNWhNycUuikGZudQnylazbrR6IoEcDMA3KSF0LUY1dWqWaVqlAxSkKUvYmKU1J1aEzYrSsH4VgXsQG6ESnyspEUD1aA7C1uBeCiA9Lx2dOnSszNTUetSvbhqrS6M+davoXWrF03S7VCKRBFpKdfEFKlQidC6btWbdejWusfamr+VuoX3diQn0rdGxRukrMhPpS9u1bvoWL6E3bn0LrdGvfdz7rfRuvjElfRt05uNT7VCpZvtWp0hWpW6k3ZtRKxFbdufRko9Yp1pjjMrViUSnUJ1u+jNTrpeLQ1Yn3zdK3ZtV47UsTrr7d9m1db6N9bsTqsTnQnowv06NrlLrU6fVj1mYqTrpaZgosQzZq3z6lCvQmrFGQt3SV1m3NQfnxORsdu3P++dQvtz699SzFLrFuQm5mCyfdISN113Zuun9mtOm7u+ffZmbUF5G+btSNOvNVbM+pSt3xOpTmaF03fOoX2Klq1dTusz6U6fZpW7vpTrPOtU7dehYvnWbu3F7Hz6Fu1Ec61an0b7rN/boULVC+xasXzd06xOpUa9u+jNUIUkbd03M1743Oj9jmITTdLi8dsULUtautxONVZuO919uvbi0xHo7VtW61aPxy+Ruq1qkdlq9OjL8Wmp861I2burdPtzrdq+P0bcjKT6ErN26MTmrNa+tCadOvq0Z86zQ691m3Pt2rdC3fSk51udd2aE630KFWaoTdebrUKFenLz5izLwtClu3XkJO/tULFC+6hfOpWbruVt2a1addIUpCYt151mUs32In0K8Sm5ePR6taus2oN3RBMzFuak50xNy9KhJTdCdYpUbrF1u30J1DtTrV86lRt27PdU7+RvvsW7N9mdZkLMhDEUsWqM6jWrzrUrasyNmPyUKWZWaur2JGlanWrq1SzN0Knwguo3QpX7UCaxEuKT7d0AroSNeK2aEpACVTo14rYlZOADHdS5OpJT4AQ59OZq0alKAEnqXTNuJRSANZu3CKHaMhQgJrqlu+dIXQGURyNm1ByfCkCevJyM3fSugU3T69SK2rcCWO2qHHoF47AXQmsQ9PlILzcC2CaTicrbry0BXdI2YlH6MFkBNSukoNwgi0FcAzrzME10SlpiAN5u1ajdmbj0AqgqhFbug1L14FVuaj/BXYrwSRTuvszHAVWuTpSEvBTdJzHBNLR6ra6EhdfatWaMhWpUJ9uvbvi9WjQpW7M63dXt1Lc3Or3Tr7p1/1rffPoVrdK6tLVpW++3ZumbcpJULqcxK3XzqfYukalGajcrFL6EhbsydKr0YrQsT75CpfIXzqk6OUZKFYFVOKxqO3c+vUoW4/NxHNwjrwirQEUV6V1ivVsVp0pfQtxTvv+hK1rrVC3bs1q9m1HJGBmGotL0Z8+1arWqluWmY5C861Pn26VuPV+3YvtSl9GfM0rrpKxa506tWo27Vu3dPvutUu661Yn3z77Ni7vsdCjfIU61m1Nz7V9evK0rFexOtTp9jpWJ19186rPnWqdqvSs0511eYtW6Vizf2qPSsUqNm+pan1OtdfdPn33Wr7E+dClaf2rp3Zoc6xZutVrUctxy++zGZ0LQrfEcLTPVnzNaXjlGfWt17fYsReVpVp999uhXnWJi1am51mlVmpu1WtTdKPQLxSI7cj2Ldrp3zrV9ixWvsXWqsei8Yghupy1inIR+6XhutfDEtDNGQg5XmbpOxPkpmJVJGzJzorJcUlrE3VpdqrfZtW5SO326/dUmZS3GJKDfVo0bd0RQPUqM+3a7rdDqUrE+rbtTNSfXlebl5SRkr6lWhfEFOLWK3Rp0ZmC9mnQsWpSYjHYsXVZ8lHqEnGacU5ORp0YE8GofqQQQaoR6V4Vh2zahiNyUXvmJ8JojgNxHEfUul5GOULq0pz49Cs6Ek3CK+6Ox2PRmZgaszFu+6jCCASw9HZuDFvoV7rFqlZvo1uSt90zKX0L51GfHZ8LTNeZkJebm4tAmiUIa8PxBw1VjMnN3ROhHOpfY+tIR61Gp0bpVrFatG7Uejs/qRKxG5uSj8EsQR2tHJiPRKfH5SagGtKdPl6snamocg1D8lLU7EHK0YisWgzJSF98nRlakdnxShOvnW+6anyE+Ytzq9OhQt0bfM1aN8+YmKVGHZ0FkvBevM30qd9C+rFZqXlLErfRi86vRsUp3Tvj1etOsR+zE4tfUm49Zk7Fi3Psx6Ytzd8zdHJCI5qPSFiUgoikIZmIpKCytBVfEV8IZeNy8OXxBTj1OD8tD1KEkWgS1YQxeBbQgmhHBbEMIZ0FHCCtBXMy8FsCuAfh+vGY/KQcl60fha1TjMSj9jj8OxBUgxH5GHYimoPzETgVQHoxEoKYHojlYihiIIlEFaE8BuIogjd8I5GCuC8zLwgsQKoEcIIjhBJQkjMI4cgthetQryUemIhvryEJ4TQLYCaWm4imZuXn1Z8Fd8DkaqzM6YmZedN1I9BZHocilmMQjszNa+buurS10+fQgQS3ZjFWSqSkQQR9qvRmLN863Tqx2rIV6N9CrNTde6fOujFeJ0ro7dFo3Ui0pTkoh7oLIVhTkZmP0brM6+6xxOLWK9CFYlBeGIzdboyM6ddOkaUrdIwGc+6dSjMciKjJxmBZADKE8JJOdFpuhUuqTMGYlAYwCaIYAMqUBFAACnSVu1IzVGfXunTrp9qhX5ezLxu6fQkbcxLXzEpKwzOggsxuhPnT7d119C12b5mhVj0C8Rx261OsSdipLT+jbo2KN18+zRpSk+3YlbFWdLzqVSrPvsVL6/Po3dC1dak7U6blbr59ulfdTpy9edakZ03PnV7Fu++3Oo2pi6+hfRpyEctW41dZl+rRkLVKzYr1adSlCtqNyE63bt2bNntd9qdZodqbh2pPtUaFKzSr2J9e61WqTUK061qFL49I0p83E77u6Xo2qV9GhL0a91SpEU1VkZOKzdWtQqxWRiGPUaPVoRixXpd0UtRFRi/DVWrP7FefPutTpGWrT51K3Rs1rVaRtyF0WnUJCMWZmUl7cjLT7rqtmbqUZelK2JvilS+Qi9m+1aqxWYqyFm66dZn9mpQnzo/33TNivzrU1NxipbtUb69irbvsdatUjludda77dKUk50jL0bMtaj1OpPh+OVadGViOlSrRKNzchXqR+hMzduRrTczIVpW1HoQUorYmJSUrQnlYeqycpTnx63ZoWJe63f39arHp9u3EEJ51GrPnWKFa3dXvsx26WtzqEhdXmJ0hb7pCzakJSrNxeat2r51q+66j1LNnnxifO6VezPlKU1MRaKxKSjtWO2olEUOwpOr2ZCbpWaNWQunUZWfXn2ZOdSt2bqF1Wam6lCVjtSaiCLc6zRrW4zTqSN9SUlIRQV3StSlHLqFGfOoxSndGKUR2KsenW5CNWp9qam7dqhOvrWLVWj9G3I1r+hPtXVb5uJUO3ZtUqNqxTqxW6xZpdmbtW5Cajs61dG49x6Xi8PVaM3ffSkp9SfLz69mUmLF9ujWm6MzHIVm+OdKjCG3ZtwktU4rBTW6MJp0TqQS8jagSX1LoE8rPj8BdZpUYC2fXowJ4Wr3QF8J4RyUAxilKzAHHNUIBbWiGtALadCPwF8SoUYCWxCa6AxvoW4C6VrzUBbEUP3QFkrC1eBNFInE4FUvBifAURDGp8CyIoMV4AhzUfhLAZSEKS0BPOhLGYElqDctATz4CWdAmkYJp0C3kZOAunQ5CSArhabnQJ5mAggYgM45IUYKoxEUhNzMlLxqxQ4joTPGpCSkZjgm4zMReTrT69aanWqEd5utYjUrVrU5GhJXS99qfQt17XavvrUbr51m6lZunWaNq+biO1Os32a8dr1LM1KUJS6vdbmKFStZ5qzOr325qzOt2ZqjFLrd9uxXnUL7u3HqMXkrcWsVJaOz5C3Wnw1ViVSJ151mrG68+tHpeKQOXQnnzq8C8XoTpqQrzUnIW5O3bt1OZn1Kt0/lrr7FOQlJ1WTi9SFZGnfUtXWp99qbr27F8TicemZOJ39mzRnc+hdYuqUolM2pCtbvpWpe138+daszqVa6dautTpK1Rnz75qd3X1b50lPnVZ9m6hSq2rujalqFGtQrdvo0J1rnTdWjarynNz58xNVrFev27czLz6lW3Hp1G6+zbp31p3OnWrpCWpXxufXmIbkJuK2rXXtSFadTkOvUjMnRlrdWJzNCfVus2r5mTjE1ZtzN0fi83PlY1AzDcxYjEhNVZmIK0hEFeHL4KLq0+zNSUxbn2LM6zYkJmdOmrpGnXnX0JadJ307d9OPzNKzOqdexQit90zSumqUN0qtuUl5CdA/YjkjWnyNazNy9aU58+3FbNC1QjUjI1J98rfZ6lGOUZ107kL75WPzc61ZrT7Ufn326dmQ5ijb59HsU7FCpyUnMzPTr05aWrQxCaNdGzWoS06fCsSm4XvhNXiV1OXlLVeJQXgspVpaOyUQw/D0pDsOSsLS8CqRsycZicnQsy0vHKMao0Zfr9edTsSVbhiZmYOTrMSqxaORaUjVGYj1uxdajcUjsepVqNu1BqPxHQt2qlWrRpT6sSi1idQk6Fi+dITdbszHH4KIzNRuRjsB2zBiJ14tC8rQj0ar2erHadGrBbRsRSQilPvqzVKPSkJq8MwtOpQzJQJIGZKUgngajUGYJoWkpCSitaD0AykItMykKR2GonA5UhWKyElHYDcxAZReBeGLdGL1oYozFqJTfTrzVezI27+PTrVmStV7FidbsW5eNzces0J0N0JaTqTp9mPx2TtWrEL25PnUK1CPx+zOiUZkYOyt9enK1KXUkKN9e/n1KdCxdfVh6Ca1Rr0ZaZkIdtUI/DkZtx6DcajN1SHaUH6cIpqE/Ed8FsUgsvhNG4I6cEMvD9Gbg1G60R2I/OiKjCKzDlOHZCHY5CKVh6CKHZ8OwLwWTrfBXIQR1ILLEIIWgU24CiARwV0Iek4IIAuiOBLANYTw7CCXikCqLQ9Wh6MQgmoitRFAojUXhHNQVRHG4TRibhFAJ5uAECE1mAvgqh+NR2GIisx2AIdqCGEMMwKJmxH4I4Atj8WvgEsQwYjEJ50nMVLE6vK0pO1DUbjszOrxKtZjtuRlJePTd99ClL25186FIEli1VvqR+SmonSiclRvpzM6hPmJSpEpunPm63Qvus0ovGrMpXqzNmP1Z03PjMC9SRndKWi8pRtRWhCO3A3IU6UbtV6shPlroOTctxW3UkbFq3LwdkZSdJWJSQhFbtwtWic6lZpUL7VmRjNS3Zkp18MQ9fGpqYrTEvasSMLzMLRHaukrNu6TlI7EoUs3WuxPsxS3KRanQgxKwXuj1OdPkKMhbsWaFGtPsWJuUj9uAu5etFLdDoT76U6jE+1SnXTU+TkJG6+fL1KNq+ViXOnTchI31KNmnFpWO3RORo1qFrt27rUzL27EzPtzqVilboXWKd1ujakalKblYgoWalmhIy0jXkpuC86nIS1aC81KRyE8Q1O139b587nTp1G1HIZk4xPoROIoeheH4KKsWvs9ulJV41Tm5iDN8cpzo/BerPuuqyU/sVqNmx9CRoWLqNGhI0Lr6s3dJXyEpXt8+tOq0K11C+7k+xQut0K/PnWO6+xRoWp81HPs3175uhRtzr77rrc6jSoT4jm4VrVq8SrUaU6n32rqshOpW+67r3VrNG6dP769qrGqshSnWrFujZjVKhSqWq83dfUn0Z0/t2afZt2Y3z7PQtT5uzQnzFiXlpGFZ8Ur0LFmxJ0J3danxq6dRpVKF91mtMXwvbjtWhfTq17rdGUnR36dWHq3EuJ2ZqvJU77dm6vJz5qpXus3UaslXnX2ac1boUqk3ISNKnPt3wp2pqanU51q1L2qE/tW6NmPUOhZmrqs3OrX2KVGzPiczSnT5CzZvtyNKpTpwWy98xJRWL2pSJwrCkn26Fqha5C6dRtWrNuanWrcYsU6lrtT5aI5aNTN9CPRuJ15exXmbEvWry9WhGYjsUandMyF9PpW6dS3YmZGhfambc+jbvmLc6zdO6N91u/nWLN9uSp2KM6jOpUKFufFZO3fXnWYIaPbla8+nIx+JzpS6B6UgcoUZOdWmO3fYnT7F0nAB/bt0rfTkaU7uoW51uBBfzr7d9Poz5u6tPlIAK1CfYoUb7FKjOlaHdyUnZo1IYn2Z1qJ1LMMSEbgApVZ03YhSN0p8+Zjkcs8GLuO0ZCGIXj06nJx6vDkM2YAKcII9B6ZisLwtwKIWnTMCWPyk1bk5qWiteSmYgqy9GdRtwAW6EIIxQga4R1LFKQmbEPxBBVIWYRy8QzNOIbcIYjhFAQxOCiAVVJSF51WdJVrFCbsTccswE1KJWq9maqxqFO1Hq01EViJX9CSk7PWnSEtITUUtz+x0LFi1at0L7rN9qhNzNq+dIXVrdj599ivZmaMlEqNKdOqW69ihUuoUb6s6nYqWLNa+rDUxNWuzdZoT761CnNW6kD0nOr2rfDN1u6zO6VCjdautctEfbi0KT49NykLVLE6fanWZ9u+Ys1Z1OKSElQoXW6U+6f0LupIWLFm6jbvpTpSUileas0L7Fazdas3SNGan1J19G+zZpX0J11ORp2LNehUt32Zmxbu7NqRs0opVrSFO1IUZ11G3Oun9i1I2q9W125WlddPsWO3VtX3zqFHnVb6lq6+hY7rrN9eZvoWJKdVtSs6xdfY7rNGrWmZ01Qk5jt3TrNSrdbut3ULcQWpTp3T+6+Zp0LqlChNSkhJU75C1Sodi1XmpihDVrtTNeOWJqjPtxOtN0LFmKR+bi/NVJKlC0PxKG686tfXm+D1KPzMXnWaE61NyndfyU6++3307NOUqRezRrTuxIxmvIXVbpuf2opaqWaEUgdtWpmCK1LSlKhToV4xFJbmbNqUt3Tq9qfZs31Ze1PrV4MS0R16FmzZik3BeNWrUlf0pu3XnTqUjb69qzfZn1paJXydS126MdqzpiRhuCKI49EcMSs6IIZhqO0atmbjs6lWukql0+6pMysvHJuKRKCCBmRiknfBZJQYsz5OPRONwCSI4MQBXNwVRyrycfqVZqOQbj0IYWtSMlF47IR2FogsS8NRqGILxKpMQrLQrLzVPm5enblJevLVZixFJ8fpT+6ZkbNnrSkvZqRBZhPaglj3Ep9aYpRi1LcUnSU1VmJ8L05mO315CJWoA9DUMwXoSstEc+G6UPVqkbko1Sh+bmI3OjsTkZOfZid9mdWhFASWIKZ/Ck+3K2LFabtR+DcFEF4auisGo1BiPwpAcj9uNS9aahWUoy0+MyM3Ri1qIaM3RmOhOt0K13Yo32LVKhdUn24pVjklHrU6tRkp9OaoTpeUsc3OkIxPmL6dKYgJpKYj1GNT5Wjar0ZqYrXycFk6Ha861JzUpYtVO3brUbM6NxmNwjlYjnRWanV61OhXkZqdM0Ze6IYXjNmP0o7Zl58apRmA3BPCOE86CujHJWCSAshFBmCaB2IIK4K4J4hgL4Q04I4XgilYgsQmm4EkcjMlBVIwVRDCCJw9AqjENQK4CGPQDkJIK4JasH4DkJo9KwggGkZgthNBHDMFUFcE03AogejN8PT4cpwKaEPwADYigWQRwCebhHBNFYIo9BJFZiGYRwdjU3Xg1HJqdF4R26sA3EcOzoD863ShPMQYty9mJWLoxGrNmfYtXzNmas1p0fkL4xFKMWg5TnzU+zXnyUI4C21ffNTqUxI9eQlLdG+XnUJunJ9iP0r7qv3T5unWhWnBLISMrWnSXZsxypPt25aQ5mjI0K9iXpwIorfbmrd/L2J06rVka8QxOGbdOfAzTgrt3zr76VO3dYo30rr7cPxDYtx2J1pixGrrqlOf9ePxKfdRn0LVq1bvl5ux259uzYl6Mco1IUk47Wun26t1K1SvtVaduzRjdOGJSIZCVo2+dalrEjamqk6lIXc6hdfx6dKV6NqfPjsFsHLUpMVqdmnPt0u+dIW77UjXn9izYtWO6+jIR+bs3V6cjboWbVupx+jb77dHut3TNOzXrTF0OzfOm7VuvQt0LdeOxanMzVizW6d0+TmLq/Sr2oRwtWkbUQTonN1YMR2jSiULUJCRmqMvKR+Tun0rM7lqVqvOgxVnyUxYrzp81LTpa+aoVqNqbtzrrpqaqXT7fOoW7UxYtS1GMUoioxBQt9elOt9863OvnWZqfJW6tm3bumKVutC91mzYnX2J0hQkbMhP5mO14STq0hLTqNGtNXXT7XITNuj0rFeakKVm+jVvoRu3N33XWrMzZvqW5u6ToT7cjRkOvJT+6t16l11inN1atGKS8zKV5adTjd1KTk6VKUj9C6xDNWCyI6VKCiRpxOPX06cbj9WNW7VW3NzESq14UnX2uhdMTd9OGKszQnX3VY5Rj8f7oT0bq0jNxqpVsXR2rIydi+3UjVOUvlIxH75SP8+ao3z7NKlT7N9qQoTVeJx2JTdajYr8es2o/fGI/HbcKxmQikPQ/IS8IJmzSlohkpiPRyUmZeXp2pCJRSlaoVKdGFqU3RqW6NKWmqlmXtULrVOlIx++nMT60bsSV/Uur30rVWUmaEfsS9C1FIzRhebtU5ulGZCRkKEh1bNOjTsc6StVpKXkJ1qlatXV7udPtXT503fNz7ql1GjfffbtyPamL5ChL3T50augvCeBXah2LXwBHOtWql9CamaNiZkpCKSdaaus1e6vzU6rakL5eKTV990fvmp8KW4jvu7VehXmrVmjG5a7iKhKU4P1oiicR07VeCylC1uEcSqToK7cK0IIZ8UhWBbQiKDUCufah6BXFo7KwDW+OwdgWQMRixAmtTF0EcUgZgXgUQU24rBJBPEU6COMQchmCqHoOQvAqgoiOagWUIDlSCWYpRHApla1eAqgbi0J4KpWVi8FNWb4E0xAcuhyVp1YSycNRKHoSxmOTMKS8aj0AigLJaMQbgqi8ehLBu+Vm+fWuk59q1XszdqTuj83H6VmMycjC1SG60SpWPhDBNF+hOr383bp3zVCjZn2JmjIRyYj1C+++LTq3HaU+jYnROnC111qlStUJmWtSfZkK/QrT5WQqUpiDVCzJ07M1as275K1TpS86lfI2JOPQnn9uvaoSFGvZutzNC+Sh6Up0opJ2ZKlIzdePz/nzqc3ZpSk6N0JW3dQn27dKdOoTq99KlbtSEhaiU7qWYlNV4nNzE1N2599e1J0aduzOnz7Nq3Uoz7E+fSo2rd9012KMxZqyfVjkvHJ8Sg1dZidq3fRuoXxKbsXz5KWsU6XOrycF6E66vbiU6P0rdW1OkbN0+33Xc++vbndW6tOsVYhunzpufal76F9upJ07UdqTuv2rqE6zMS8+6tdQk7MQ259u6+btz5qfI0rNCpIV5CTtSchZvunX250+3apzNuJzNetfapSEPycPwfsxeFYnIT50Zp1alKjUkaNqhaurz7NaxXkoA/Ho/AjjkrKV4MS9a+zPszrFGdZur077NiYnW6UzWpQvA3RnTpO+tfQnyNinfLQdjNODEIbUajVa1N27dihQrSVa1Tun3ytibheILrV9KWrXVq8jdfErU3ITctD9qJ2qtKfXhyxGLd9azXnXz5CToSVejNwxXh+Dccj1SYkI9L06khJROPTpulVpSlOlHJSCeDMcmaEIKkUiUSnTMYkY/CkO3wZh2AjkrMVnwTyN1WxJxmpCkYicR27E+Io7LQ3D0F4LYrbtWJeD8N1oIpGCydCO+C9SIq0jYlKd8vDc+xXlJu3bp2L6ctKSVujbj8hJ2qFWMWJqStT7VOfN3wXhLAehLJ3RiFI3AUToF4C6WjkGoiqQGUpBHCWEcThNGo3DUIIVh26EcQULNSRgevlJGrJTfXqzqUtKTE+YlZebj0QXTq1CXoVpCZhLPg71b6V8SoQjhaCyJx2l0YA/G4CutAfhydLRBJQOy8vN1LN9KdPp0L5GLSHIRazzVux9adaoyVi3H5S3DErM1LdCzOuumaFGbo2Zuhbrzq8JrcrCSC8BNSgqgK4UgXq0b6lmdffbrTEnGIjkYzSm7EWsWZKHZ9KzN2at8fvlpOas3zMel4nd1o7XtW6FiFJuam5KQjV0HJqdVrysLVeYmZqVjMR0IvGJSNRyHKUtIwijc3NwnmIgk4fjcfgxNwehyB+vMQ9BPEc6Ioeh2CqPTo5CkvCaOQ/dJwLZuEsH4gm4LIMW4SQUwahyD1jiKEM3PjkH5uFogkZm1BZDteA9EUJpiJzNiYtQ9ALK8frQljUNQjjcPxWpAqhyAXQxLQ/AW0ozCODcIoFEtKRmAfq0bEdiUvdDczF6s++nDt0tEU6QsTMjboW6V0lOsRKQglkYvRvtyNitOoTrVC3Os903MyUcl69aAkoSUYj9q6rVrTde+nUm6V1edPiluagxSoSs1JT7pKtMy8JKNqKwPWKNGrdM3yM+rLXSNu3au51mVjF9mtOpWpGnas26PTo3xSPROJSMpSvko3Uj1KZk5uFKVGlUsVLMxAhmYdn0Lrc61PoSl/U5C7n2OpJ2Jear3V6dmnHInaq3WJ3Tn3T61uzMW6kUiUnakaV9K+30a8hOkJ9iYkJmaiGB2vKx6E0dpRuEs6zOoWK8eiChNz6EnHqsP3QPUadWIb50hOupTUVoRefNykUo3TrXOt2+6x2qNqdamIvHZq+nW7d8hdOnXVpivErp0Vj9aSnV+EkVmrVmnVtTupTrz5Hn0rcjHYlErdSjK24/xydSmrXWnUp9C6vFoVuo326li3MWqFC3YlZCdQt3zpC1f3XyUWjdq3OunWq9iddzrVeYoX3Tqt99qtKyF1md33V59866+tZvtUKNGhVqSF9a1Pt98+RoSVW6xYlLU1MwkkZGtzdCzSk6NiZvt3T7683QoXVuzZo0uKWr7Ml0599qIJ063I0qF19a3Pt0ejfbvnXW+lI0p9C1PvsX27VKhYq07M6pPsTE1N26sVjszQpTESnzUKSdaE9uakoWjVWbjVqL3RFCvCli3bvsWpHmJ1u6rQnWKlGbnz+3W5OQuuvj9mhfZuulbc/nWrVafdI261Wbkp103SsVqVGxPvuqzq86ldOox6pOvt27FGxZrwUS9CxHbF8+SnX0YTWJKnNUJOrXiKCe6pOgbt14SxyrDVe3IWIT0OdJ0JOzD8xXvvtWJ0P17F0lOq81NWbctzdKYtULd1effOlqNq1Iy0IKEVkp0zSqWubtVbV9u/p99udWo9LsTq1uh0Z9qfSut0rVvsUp9ed2qFSjJTog5iaikXm50JJq6bh2C8jNyFCRpyU6tLxi1bpWrdmWqzrp9edPumKN1ahffTl6NGpNTrVS3T5G6dZkY9ZnTVC+1HYfhBCtCxfPmI1KSE/kJqJQjn0LUnHZaVgVWIzaida+VgTxqbjtmDcNxWAML5eKwOQLIBHPgMJWFJKQn1I9AVX1K0aheL24DOZtytO+I4NwFsvZmrFmC2BuCCPVYgnxqFL4CaCW6fXiOxF4Iak3yMzJRKCro3TcaoWoTx+jRm6saozMWvkpaDcFkrEMI4JLpanZr1q9mNTcpHpifJUaspZl4nfVj3QkLESn2pKnf258hbsVZmnZmb6F9idYtXWrdudRnWZixambMzauqVa0zYrwtJW5uMxySjEvFO3ZtTujXr3S9uhdbsSduPzdSM332r6d1ej15qfffIzXVup0bM+Pd1uhQnWqFuxboVqM+ry8ekZOfE6nNW6d9CzdSndSVn1a9ShIUb6FC+hdZozF9OzfdfSn26Vm12Y/CtGjQj9ShJ0p101b59GxbvoUKk6Kz6E1bkKVKtbs14l1ZaOVLVeVj18N2pujNUZSG6FaYm47fC9ChWvloYs0q8F7rNqRum69idZtT51iSupXW5Ho/as2uQsTrqs3OsWJ/bnderdK9efddfd2ZqQuo27FvsT5riluvWrVKNDnXVZ1ivZryVCnOnRqfIVvkpKddfTtUJClfb7VC3fF4Ys1LPIU6l81ByOQnnSkckI5bmuSpXQPxubpXyE+dVoV7ql8zFY3Dduas8B2Cy+lEcVhirfNVq83Sr069q3fZnduzPlZqfWszFuvUmIlaqWrFO+dSqSE3KycJJOpUiUrByPQ9Rszql99GtZi1eYqzq1qbnVqleZqd911GYpyMem5mblJu6dWqRqlHqFuhSusc66nKSvN27F861P7MThanJVYei1111iL3wzQsRHdZsVKNOYlYMRiD1WEt0fo8xDMOwSQ3AZQPQEk1bjMrGJuBmLwOxiAhjcBHMQdgPU69CByfRqSMF43FIpM2KNWnLxSvM15mtZhHPhmrAsgzfNUaVaYl5iRj9i1LSUDFmtd2r7VGNx2vOtQMS1OUoyNCpLcSvpRKD9KBq6PzcvTugYgRVovThizSnTcDcaoy8HJiLwQR6BmE8J4zDkcjs+rbo2rE1A3Ec1S7dSXkI/amLo3Wl7UtTl7qNGap2Y/OqTdSzJ2r5iOQK4B6BbAF0LVpGbvicdmZaIZOpOk7c6zOoUp1GxM8+hW75CG7E/o3dGh3Wrd010OjZmb61CvD8DcOQj7EIINQBtDMxBDEqs+HL7VqnHZqYnz50+tWsTUKTc3VqVqshDMdk5qI6MKVpqfUsUZu315CRmrVaXtR2Zis++1JQGMATRqzUj0Rwcqw5bi1iOxmENeSpS1CPxySmpKIYSxWHqsMTEpG4YhJLV6kXpw/CaBPADCBbApgZkqUSl7p8BPGpWO2ronDkXumJeSnVZSBFdAmsx6ToQkgllIQUJiNSE+dDkBBHopNSEZgihHEMhPjEC9O1YkJqpXjU6+NwD0eiObukIBPA7FJ8lA7ACyxBqDUA0gogHbMJ68Nz7dOMSMnViduvPpyMbhqAhiUeicHqlWWiKWs3Ur4pXr33y1mnYtwtanX32rp8l2+d3V5CRtRavSrRynYjUM0pCfNxaXgxLRDfdWo2KFCddOnwtUmJmarxS1OmI9Aaic1ISMQ2I/Pjl03IWZuvRjl1G3fZj9O1SjFKtdQrz7Pbnz6NGlbum6dCQt2a1Wnbo3WZChasWpixNzrETm4joSN8h0K9OxTvoUrqE++zIyF9W1S4al4vMQ3fbnR+GuFKU6fbndadfSrXROlLVZuQnX050xbo1aE3Yo1pWF4zGJO3Fqkeg3XgsoQ/wvEUIbVqfSr159OZiGhXhWKU5mWgPXXX06UUuutVa9q+rO+7pdOfamYnXlbFi+zfQg7H51qpPrVqNGtJykzfLdOxQum5CP0oZo1YigxQn3W598pWik1TlJ9rujUBuYj3ykW6M+1YkbM3On87nUKFuTqTF8SjNOFOQsWLMjEqvRmqEl2aNa3J30b7c6z3U+3dQtWrFGajMlSj0SkOxToc+xfdW6lu+tPt27dedIU6E6zPuutzqVelQpcvfWsTV8WhaOwrQkLM1Ql68jHZuhOm5jr3TFuxPr99mnQnyU66+3fdOt2K0rfRqV76PM0KN1OdRsTr7rp9e3z6FaNy/YvpdqxOmpKjz6dufWqS9qJ1Kl1e31J8dr1J9DiVO3dHbo/Yk6d9Gbs05Sb5SvQvhu6fZ5uGL7E+Zo06E1XvnULM7lqklOid06zI2+FY7VsxapN1p0rDVWWlYWrwYiG3Xt3W5vo1LErNx2XpydeIp0Wqx+VhNYh6QjESilKGK1Obj8hNU7cVjsRyt8TlqlWXjMCCZoVqcxBNQg/C8YowrLQWT4dkYjukZ8ZvjNCrSumZurdXvsS/Yt277M3ZoTc+3IXy90Xt2rrMLTMXluVnR2hUq0brp9i63at2LVKVt90+dfbnXV6N9md0rc+/sz6U+zYk7dmrNVqt8LTEEcYgdtQfrxFKx6dV6tCFbEboUKM1Pr1L7rrM6pfaqzrf27UjNx+UqVZCQpVZKrYtzq1qfbtWLcSmrcb7UcoQrdIT6MTv5WfZn0bE3Ga0v2p8DVSbm47Sj8zM1Y9alY1J2LrFmtEohgTQTwCqDdmD8lFYxCOCqZglhPNwknw3M0ozBiOzpePxFBbLV6UGYSXQCSATVopVlIRTMJaERVq9iHrdGFaNCMRqnNQdhSIbpvl5atK86FadehCaOylWSoUpiFYJ6t8AUQEsRQH4giU+NQWwpOuhSRnXz7pGrH6FGa43Ony1aP0Yd5aZk4M2bc3fIdbtUJ99mvWr2aNC1Mx6O0pqpTjMlSpWZKdD81ddfbhyIIblJaLR2fOt0LFi6Yn0JeNyFWtSicStwtasycbuoUqt0fjtKPyV1eK2uSrX0almRnSF107qW59OX77dO6jPs0ZujRq8WiCtYnz+fRo0qc+xSn0p0+3QtfPsUp0pXtUuV51qdQvp1pDi1q3OnWp0Tn17qFHt2KE+fYsXSV0ZoSd8K2a19q+at81NQpbmpWKRalRisQzcKRKSj986GpifZi9O+3I1LMxZiluvCeVnUZ0Tt9SaqxazPpV69CdfPuvuoWKsxYt2YVm+zKWKVOdHr5C38+vYt0+663WsW6N/ak6lWxFL61OvUo0q9OtMWaFLjcVmLc6jRn0KFmnPn27qE+6hb7d186fMxmIJ8QyUPydGKcWmIYgaoxOvZh2JxmORyfYiGZiCzZmZCtKWbU+1ffOqydCahmtEcegYj8P1ZKjKWrM+dNSdmaq0LNadXuuvsUqF86JUJKpR7MtPk7rfG7UK2+zUnRaYsXW6tSlRmZeOw3NTXNxW+1bs3di3UpSl8jdZtTq0zPsyEfilOxbt3T5CdWoXde7nXSUdnyN10MQWX0Lr53ZhWH4rZlp/RiUKWrcSg1KzoORujH7FqP0YVmYTxDbj9SIY7EqsDUDcIYdgGcKwvCKC8GZGlZszNKtdVtyUZk5OlART49QiktJzFqO2ZqLToho0YvIxyUo2ofgnlKnBudfamYzB+KRq3E681KzEUoyURToaj0YhPDsagXgkjUJJWFYXgfnU5eKQJYCCUloPTFmUm5WzbmIGaMG4UgNQVxKAihizbg1C0dgZi8cgOQbiGA1Ogtj0ZmIhj0tdHJ0zTq1buENGEkch+OXydmP17da1Y+tdN1olRukpGSh6UgXiKtDUhDEIYUi8zEpm3DtqZiczN2YxTmOQozMLwrWqWZ867n0pi6vbqzVKxLWac+1Vtzp86akLdGWtSVmMy0H4dhBF5iAgg5I1K0lYiVmIJ98bmpjr2Z1ipbvo911aQpXTU6pHqcnBLZk49A3Qo332o/aqVql9S1LUZK3FI3AvDUDk6nM05CnUi1ivdH7pWWgYhWH6VCQs1YXoTUOwHYUsyV1aDMNQSdKtLQMwFEAmgkm4KYSwBHMQ7VuvtTMXjVmddzEjI3wajkThWBVCCGZirNwhnw1HYjlpbgNRuYgSxyjCGhBeH4ckakSjtmO0YOTFmvQl4tRn0YXq24/Jzq11KTtRS1DUCixfB+W4tIw1H4rLwhnz7NmhIWOdGOTl68vAxTjsragfp3UKMYkIHpqxRvnUe3R7N9ilalLVu66pLUpmzCWLwTSNOfQj9C1IWalCZisZkoGuvdZoU6URykO1Y1IxBYj0TnSMYnXQnjMF4vNx6QnXTohgbtROfH5SDd9qzLT50pEM+LT6F9a+J2KFm6lC0hKzdmvNWpPoUJWQh+Rsz50hdZt0aU+zI9qpd3yFKhRrcldJzc1Xmqln6c++QnR7g7RsW7qNirEqstanULVmfYpTrElH5KjOp2bVWdXm506Qj9qPTqUnSi8FEF603FpKHOxZmoEc3YtWa1OZmIbswlqQZs1Z9itZloenTc+6lIW5C1Zn07r7VCxPm7rdKzKTMJpGQsxHZusTr59qlasV6M6lRoxKQkJefbunVI/TkalORtWrcxLzcvLVYpGqkrCliB6nahutNTp07o0qFS6zRs0aVu3Pp0LUtDNKToR6Zrx+DMfukr7pLlbPWl6sbjkZkIWhqKycpfVjtq3M1p8nfWut2qlu1Kz7r7FGdatzrq8LW5uxa7p066zYtyFChbtTFKRv6chaoSkzZmbNitdat1uvG75ijMRabikxUuur2YpfPkJ8jPq2rc6tfatTr7FC3Rv47anR2hZt27u3dbo8+fb50/tV68+66vbr2ZWzar3TNOfSoTV99u3N3ULU3YpdOrPtzNGf2KNq3Xr9WbkKNCFJ9ftXUru1Wq2Il0+rW69epfOr1bEvPrV7VejZn261OjITdudOrWY5OsyM6nFKNa+3GYndDdOUvmevdYj1a+1WqzqNmnampqVr3crbus177dCP91uVtS01Gq8z1ZmlOt32586FaE6pdLTM6CqZnULE3anUexOn0758Jql/auvsRqx2r77dWYs919utHJudy1qhPtX2bcvYk6khPo1OQs2qFu+dJXc6dZr26M+fOtz5m+nYm6EjWt3RWjaqT68vdE7E1Z5O3Nz5KtfIWY/EuffdZk5Cfb7F1WHLV0++jz6FqxPutW6EJ6dOxTod1m3SoTrpiBiMWLEfpW7EQ0LqUnPk5CvCa3fKV4L0aElI0YVo1qsNwRQ/Tv7dexSjNmP050hSgnkLVK+FKUPTd8nFbEJL5SAwpVYMSElPhNYqw7BbJw1WqwKKkI5GZrVIirQXrQzUqcvAlmKcWr0a8KU7U1Ul49D8PQQwMwtfdfOvpTF8pdDEV4ekadevQt24xSunTU61JwmgURaHp8HpCBmtIR+SmZKZikbm4pOsXRuOzHNS0vGbp119C3fQvtW598hddSvmbfavn3zuSnX1bVivPqz4hoWaEUtVL51101WoR+hYsy9KjUo2Y/Oo3x3laE6dfdavjcjI3TqtC3RkKtihwpXq2Y/Qt06U+1ITuboWaNqxSt27FKjIULVubpU61q1auu7pSd2p3P50+3dSoX25ChbnUKdeXpXX90tao32qket2LVuSlKVKvRnyd0rJ2p99qtWvtzNCjUoTNqt27F06KSlOlZtWqlaxO75izJxuTrQcpRehaqx21I3zFKYpdqndByKxOvBLBuUmYfiGBqjPusX27NatboWqM61Yvn2K1/Xm6EhKXUqdK3Wuvs26NCtIylS+hZs1Ji6jffTuoSspQqW+1bo3V5uvffdaoz6nRuvutXzr6EjGLr6PRvt3UaVGLUJ1mxD8biKzDMBNAggPR6GIgnwhh6WjE++lKwtCaVgrtwfhWS6k3Std9ifbpzU+fyE+xDUNzrNmnPnTrNmSsRqxTmInITvurV58vdN0pqKWurNUY7TgfnXz774ak4nYlKM+QoykEluGK0CeZiO+CSlHbpCdFO3Rs3TpDo0KlG3QtV751KhBmjBmVvn2ruv1L6/Pt33X9mdOnV6XTvnUL6NutXnRFdWrUJCrL1JmvSrx2dYsUIhmbrqEpfZlJaFrMpEFWA/COtEEvLVY3F47Yq1pejMXRytLzUrDsPQ1CWNzo9Eo/B6HoOzcWoxOKROjF5eJxahYnyvD0ai0SidejSmI3RsUaE+FINTEzLytGP043Azbo86fHLEYjsLwVwdg5YpzEalorbikhIz75mIqdqfH7cHJOKQvzMKysIrEHJqTjlmrJ0r7M6xBXLT61eJSN1mORHIXz5S3Rmb6tSvaqylaToSEjdDXEpa+Sm4pZicfg1CGdI3TFSCWLzUIoMRSGq8+v1K1HoSE6fJ8jOsT7NajfN1ad0dkIvMUY7brxqnOupRqpEoitWrczOuilrn0obheEU61NxehQqW5GlUm5K3JWbVGrJR+3LTd9GblJaNXRaXl6dGOzEnHqUhboQkgGVadIxiRpxHDUbn1KN8pYvkbNqhE5KnFZm6NUL+H43HYBufCeLQ3QmZqKSEP16dOOykGa012JuH68BqSg9ANwE0Yp15qAqgLo3GZqEkxDsRyEVgPTdSbpwVxuahy6N1Y5FoPXQctQpVhJLxDWsVYhkopIQvGYLwBlAzAYQFELQiukqkzK0IZhqjHZifHo/YjE3QhNTh+1H5qz0bN0BVE4FEGoCePQakYnbgclYLY1AhhyBitIzM6Ib5m3LzNiAhma9G1StVKF11azNX27de+fUsXVp1uxWmLpqzRm5CnCWUhLfXhaFZGpI0Z83DUIp9GUjkC8XrwpVr3T6VOxSkoYqzM+jYn1oC2lPpzp1SPxHanRKH4ZgXmaluYvuvrcdk6tWl2J8+zZq250pLRibpVYxFJG39idVn33zqlrsX05qWr1L699S1QoX3V4vEfQum+P0qc3EqM6Uma8h9qpPictEMQw3anWuxQ50XgWS8QSdOXisdtzF1eWoRazHL77NOtatUo9Bvj3al4FVeDMhRjUBy+BmKwZoRDWqcPVIGo3Dt8xPoxWEUdg3Yl6M3KTo/IV6lGbtzrHO6F9OfEMM2rNq1Oi9OvDd0Vj8Xk6kSoyt86+Zk7VSzUtdGKTNuJSsn867maVCYurWZ8ekJKr3y9WJWatWOQjg9H69PjdGag5RlISwmsTdiZiVCW4asWJaFpOpZ6sLysvFLMnNxHanWoTzcHpelQsS99ajGInD8jN2a8nQko/fd2p0/t3UrE3IyNq1260+P3WKEzZtWZ98vdTnyNnmoJo5EqF/PtUJWjO5mbun0LVaEEJpKldXsW6c6rQqTU6QnT6tqQvq2b6NWxasdW6rOnU61bq9a3Qn330Z9ru6M+lUs2L7daXh+11KFahMzFK/lLM6jQr327qlu3Rm7UzVvl60jMS0+bs0ZSlRun2pOhfUlLqN8+ap1LNunL2KFqQi8hR5e3dYhiORBH5KKVpKzZr31ItSq17qNqJ2alS7p14cr06cStdSx9/NT58fkIlYl7cSupV6EjZmqsWuqV+PT+zIVeWiOSnVqfOl6EvNSEjXs26lCtQmbFmfQvjtmzSm77dKZpTrVandbmLr+tOoWrF863PoX1q3Zo0LpitLRKP05eOWa0+dN07U6QkJ/bl75Kam6066dZoWudPr1b+Xm6lqpdQq3yl1WfylOWtz7didMTU6Zh+MQmhWfWnz6Vq3OumLo/Rn1L77MKXR+6QrRqQutRmPWKEei8vFY3NWJqZpVL58+IJG+zas2J01MydCVtT77rNCfNzqVuQk7V1OQjNqfGI/UsT5udOsx+O2KdmSj0zEcnSul5aZj0hJTE6FI7IToigHo3DdiA5BHEr6MCmCeIOA9QlIggT1ZarMxaI58rHo3D0VhBNwtN8+LxFOh2EkLykYpQjgojEzEMlCGCKPwGpiajdiIY7dIRuNRijfM2akdtRKQsXxFHakFExOnzoOyUtFoF4JbUehiSsRqvfVtX31Y/LzNm3AxZsyczRnWu1OpXTrEjNXV5udYmqFKQunWLdW6fOuvtS061NVbE3bi0UoT5edSmrEXqyUlZr0pOzPqx+ldbnRubpRafxOjNTUShWtJS8SpUIYmLEjH7NqOWaduV7VmzWp0J1enOj8nZnT5CrI05OvUutUutXkKF9m6ddZtz51GtPpTc+jfTt1KFmxaoz6fWoTFCtNTrU3Tm5101Zjscvk49KytmWl5qvOviCRkaMWtR++QpzU1N0bM3fNx2D8zWsTrUnPoUqUfg5dEU3C8nN0rMVlrNqGYPTHTpyUMTdmKzEGKnE5qEsdnW5Ohamo9LSd9CzdP6F1arSp2rFqRtSdOdZqxefRtyk+xbmpW++jQl7FKlVnyU+UiVGhdO7d86nPmrdGxR50dtWe3Zrzd0rEp0TjFubm50+hMTUrRumqU3YpTpWF7V1aUpRqRkL6VWjOgOxiIYQRBDUEEF4inQEEJYegZnTFKbtR2tLQHJaZjtSajk1fZt0J1Grzr6E+10aMtQn0puLQfozVG61IdmTlrcLyNmzJSEE0pC0+3ap3Qrbo9e61JRetTj0CKjWpxOfZk4naj9O+nSn2Z1CvZoTcxSsR66am6cc5a6rH6nRn3X2K1uxdZun2qHdPm7M+rdVmYggzViKUpXVLE6Trd9jtXyVilQit86+3Xt2b7FWTow7H4ahyBVKSErOqW74Uqz43Zr1I9JVoikK8Ho/BqhE50DMHpu+ZkJudAzCKA5dDMJ4MzoZrUo9KwcsxqTk6dXusUrVu+dE5qnQoylu+1HrctaumJmYjlCtPrXTqk+KRKJRiTkJ0P9SjMzrE6nWiCZsVIdtwamYbiUQ3yETiKxLUJGapUI3EoVvswWSEEM1NQ7GpuXpRjrV5uRr3Vacfl61ixbumqUpYszr6sjGKnWk4A7Ix6WmqlmRtXUJCMRKKW+zZmYT1JazYr1Z9mtFZ0Ym4UkYnRi3XoXWqlGToSduP0aduda7EF45WjEVnQLYlRhmD8hRvrVJi+St1LVqnXn0atatdVpVa06am5KbichL1YcqwpMxOarS1OvIToemZWrFK1azHJSFJeC9CZtV7rNW1UrX32rctD01KVIJ4Ty8coX0pmYsQLKlqC90cpx+P1JCdfdAYRaJ3zohg3L0KUDkhAxMR/jUHJGC8AvrTMQQAui0BRG4HroGpKEUOQxPmY9RhBA1FqERzovBiP3QVQB6VgDaB6AdgMYHIEVmC2bicJ61WCCtEc6bgrlYfidqKydGjEpCPSdipHYnLxKpHas1amYXj8xyEPSluIoBhdM27PQoTMjWl6dKzK2YzLzc61fPo1L6cpboW51idXkK0tHK99OrOurRWfPhuxIxmJTUjGoXj8Fkdt1q0Vn3T59axVnwimas+F59unaunx6UmYfsQpHI1HYYmIQTchdSoSkRRKjBqZvoxSxRut25Oxx6bp2rNKxJ0rXPoWKV11qQnUadahNRu6zfffdOuut0bV0VnzVK+rMSErdarzFCrSvmYXm5GzWrRKUgspRDfKT4MXwG6MEEegzH4Go7IQXjs1LXTrdO3VrzUzdZmo3KV6lWVhHC3BTTkr6MUjkHILxKA5Xhybhu3LxKPRDEotDU6jOg7DkfsUZGdap2oRQIYI75CIYLK0HK8TmoRTErYq2b5uddavuk7dqIqdqJ2rc66jburTM+zDcCObgxbjclNyEjTunyvHbu1ffb++lfat2JCfH4b6leXkpe6IZOLS8O0KkLVI9EocgvEEYh+FJebilqlQkbfYtQra5GzTt1bVitJ0brozD1KdFb4/HIDcpfOiGt25SJV47BXdThHEcSlKVuhJ0Zmddao3c6jb7c66+n27+3VsUaVWWiCfSutVbujz6VizWuvpSFnq0bFmKylO1QozrVulYo0qNu1WoTrM6xfatWa91Ofbuq9G3L33XXz+vdU7VaVideamqshNTvnTNm130aNuvzrc+tZ6c6ddIWLUhZ61i1RpzqHL2KEzWtVLpuZunWb5mQutVp061dOvlbdKpL259uJWbFWKXS8+xdXrx+Fon24/1p0Suo0L7dqlQvvvuutWZ1udQn0uzfbo051uvdSvsyHfQt1rM3Ut3yVCvZpX3S81arVql03arzrqNq3d2IrW7VWldRt177rF1azWkbMemulWsTrE6ZrW7c/6FWjPnWrU7tT7Ninbun1JC3dHbq3OmJ06Ts1Y1HqUhFJqfbnTVGdXtT6PP6FS3PrRunb7FC3YlJ8hSoUbNOfXsW5mLU4zHbcvJQYiGzKT6U+6hRsdK12as+jfSmZ1u6VrVuN2K8S7d1ONyFWfSmb+aoVa8vR7MYs26FqpQujVK7nUZ8rHKNm1Ovsz4T9arb6vCOK2bNu+tOhyRn2OvYj0JqsjQmrMjJQjmZ031rr49LXwemJHpxuvTmoYicTujlfmIlFIlIRinThqdJQYlIfrRKhDUxGIdhPJTN1upS47JSFqjYnQxVk+QnX2ro/CtmZkJ0Zh6EULSE+KVasZtQZrRFEVCvHrULzUer1rUGJfn17ETr15/dNzVifPr1Z1qlb59qdffQs9evffP51qrWr3277F8zbnULN8pyNqYt1aUlfW7dq3H7NuFZ03dZiVmfQmZqWlZqjYs0J9q+RoVKl81EuTh+6Fr7p1ivYpTVqTusW7rM6zdbt2p9qYo2b77FG6xdfZ6VqdTn39e3IUJupQvtTrMhSp1p1K6+tanc1FLrqtWdbsUpKN06NGfLTNqjJSN1udRlZmVsdKtNRKSnVZqtPmuGotWmIUtxm6Ec1BZHInLQemY5Rm7pOblInDFa1W5OrLS8lYryk+GbFWPxWRpXT7UUn17Fq+XrdSzNQrOtV60++6r069i+ZqQzUsULVGnUt2LpK+1K0JajfQm6cWk7u1Ou59mdWviVKKV59updN2aslWrWo9Qt16E66vVun0qclJWJmbo0bc6Zr2ZOdPugXsSUG45BTOryFaGbN8Lysdi9K3PhaCidRo2oAUQTQAvgvAhgR2K0ajXEcrB6dCaKwCGKQbhFF43D1mapW75G++dasyNedYr3yd9apTtxSRp1p9OI5qP31LNizZs3XzqUtSrz6VizIT6UKycOSNCKValepPqctOs25mxfNUqVmxPtyMdpSFuanyFilfQsV7V1Wld9COxqxL2YlDNGlNdOjQumacMVrHTr0bdm6Z5KzVutSd1erIV4ji3XsTNOJU60BFEUDkMzMHas1LTUchSOUerOvoWp1CxEcnfE58N86zJU+tzpOShuxCsH77EThBDUFcF4NQfqzEhWmKHLQrLzc1dXsTp1GpfdfJUqFSlfddQvk7d9mvYuupWLFqzC83IXS0hHI1Wt2pepL2IVhrlJnkp86YhevCsO1Ihh2bg1LRydJzcH63TiCBe+bhSxd1+nQsV6l86fWtzuvdWnX2r++hSpRWtVm5C+O99GpTmL68fg1Ym511iQvk51alQlK9KLRatJ0IZgMKdC1HopdLSFKUqT4lVkIrQmK1GxRgrtw1BbBufZkJCKXV6E+xErFqfMXWbNeThWzOmq181fNzr6MVqULcpWgojUCirRlJnqy1GlH6slYrTMZl5qWpRiM1bdW3ZidmfNTo5Ec1C0tPs27XHpiJQal5aXlJepE6dqJx2G7VibrSEesQ9SnQKYGoLbdSIY50ZShRkKdmVnS1epHY3Lwxah+bl6sAdjsSrwYicGIcgKZKVrwkp3zodjE+pAVx6F4D8O2ItFoCKVhyUk5KtEonYpX0Yfg1WqSda6RhHBmQpTNSF4RTpO3Kwii1iN04vFYGopBJfEFO+YoXzNSTl7XYnzXf2KczfJzF1W1fYoTp1udQsU769ebqyt/bm49Eo3DFizRvlJG3ak4coRuhDE+am58lLQel4ZgelY5WiklGpOKRyK16larOkbU1IStiF5CdxuffErUTgxYjdGfHZ9qfUi1mtO7EVr27VO+OXyFmnfaqSdqdbvtULc61Q5mlQtXVJetS4lZp3TpGvPlK83fQqSEciOfNyFaStW47Yl7dKn04K7oYrTqNiPTMKwWytuZrWZGvfYl7cfqwpLy90XsQFUZgxNQMUpWJwbrQSQigdmZOPQTx+OScBqPTHB6PxHSmJS/keBifApmIEc3Hb7pKFLcctxePQzHojrWbNKvTqWZ91WRrW511GORSL1LNiRrTV1vkL681biUZpSkNS0NwNXT590/txKhNyFqvfVidClz7dOdI0ZmvE5KPcen04tZiUOS8emZmSjMnISE6UhWnYmpKK1pKjdVjFeDdW+JQnuuvisbjNSK3UoUq24MUYKp8D9qUsQHa9SvXjcVm4lbgji0lMyEGZ0+Tt2LE6vOn0Z8vDtifZoUrrrUboTo3Rum7cVq2JClasT77uhMXU5u+hU7d8+zYkolJU6tS1RoUZO+WtTuzaoWr7dalQtWbrVCjd3ULqNGhPtTu/s0r749Ym4nF7Uvbp2qFmRvn16d0lzr7FqfUl/o332q11utG45JXV5Wd3TVGLcQT4Xq906dSt15C1fNy8rNxmvLWYnP50UmI3IQvPoTHHpGMx6xGru3DFilRj/Er7M+fZupUatCzZ51uzasTVu6vddZt2uddYt306PboWpDt2Klm61Ifbi10bs0p1mZnSUZ74jtzE3EpGdJX3zpCfT7Nm6zfPj/NzU6rTp31KtuUt3UbFq++ddffQuvnzM+63btWrFi6tYivddWpROd9KtEojsSsjPj8xdFIjh63J1aE3QkqVefKUI9YpzV9ulJy83WmbordJ3X32K1G3D9GKwL0ac1UvoWJ1Cdbs1aVC1dSkbE6zOs3Tpq1PrW7XburUYtMUpmapUrFG++1fKzdaKzNidXvmZKdbjtqlxmhXviKtfdHqNuYiKnCsFEIIxKUYTz7dKEVqJxmH7UpCsRXxKZiKOQkkIfm45NRFRkpmHJqpYmZeE0KxujCszB+Wm4rEdShYiOpZtULUU4/MwT1bEKQYkI/BqlYhBBDVhLbqSsLRWxEpqjL2bqsF4it176liO1adaXt0bMtOjFOtRikdh6KwHpOXinB+RqQWUpWVl61q+3KTclUs26te3MXTdatdWuuus2rU+Qszd9KzZoVbN1apRqWqs6UnRa3Ymrp86SiC3btxKVt0alqXjsnE5qlIxOdYulfpWKc6GoemeFK1apITM3UvuoU6dm3TnW6tiJyM3Iy0TnzrMlOtSFG6dRt2bM6jOuvvu6UzOs3TrrV99uhRuukbN9q+lbnzqdnn3051OLWL7p1SjYiOfLwjvgPXV75udRtyl01bs1YbmYgkaFi3FJqbn2I9OhnjXEp1CPXXW5izJ0qVHryEJJeRhupHIvA9CenQikJ76shIS0C9CK14GpqI61ePXxKdRhu7pzqEKRuxRjVerWluUtUYrBn6d9irSkqVGZvkp0Ts2I10r7rNnvmaNOrEdCLzNTupzrFaF5mdYk5KHpmAih6vbpS11S3fdN2LUKS9CnG7VudOqT4Xtx+tFrF8+ZtRe/rSV9GdX7U+BuI5qAGcFUJ6fdbicPR+YgiiUQQSzrp1i/ndq+lNUqsAfhDFIAM4nAkic3BuGItDcWsQvH7pWJRHdOt24vBRzuxZsdCjdEocrRizSh2xJRS3UulKNi6tKXSU+pQn1KE6rDFWHotK0506+StS8FVmD1mvfXn07fdYrx63fVnTNuhQpSlqRn2LNSUvpXcjNWoMwrFYWrdWdbvo30J8/unU7F1q3Po0LdivPm6M3Qj9aJV6F1Sbnw1Ovo0rV8+jSjcnYhWLRDSrx6hXkrVCRsQrajERwYqV5CDNu/mOFY/E4fhmEs1C8GY9JwpHKtKZpW7Vu+jWt2J9mfSi/I2pW1RnzU663btTp9q1QtW59WYsT7NK+/sSNu6+hOmonWmYvNTqHMWKk6jA1BPDEdi18GIWrTUzSm7peXsR+3Qsx/tULMvIS8epTr50Ozq0QT6FKd99ujdOq3WaFGhblK9ufKRyG5W3U6s6661CkehFDcvZloZmofmInEdGMQvCaNxSMyVK+h1p9GzK15K+IqcvdAdlYahWK15iGIjkYLxWCWC9CdL25SZvvm6987tdqxaqWOZr0KM+bm5CYm6devFKMP3RS1EUblaUSo0LVObqRe1MQrM250drTV03f2pCXoxyTiObmr69Sbqx+Uj1CWszUbgshqHurHo/C8RzcPxmlITFKC2DEJ4FE3dQiGXun8hCt8PRBDMJrMPxuM24hjlWKTVe3AIY9COWqXw9QitejYg/dCaBeAej0nXpR2XrxSE0LS8rNRqbtQ9ButfPqQWQFFahWmpqToWaE6EMGIgjk+++F41fEUKxm6ZgMYXkYHYJLEUj8hDEMydenPrUpeLyMtf99KTrSfDE6Rm5S66lG5qF611e+ZurS9enC1WK0JWdJydORnUotQiU+jd0KMhWsXwgmIORW3ENiamJCvUilShfSmbERQP1pqEkzO6Mxz7EYowpdIR6Cy3QhJQp2bM3C0GqUnSpSFKQpX2bqczPn0p1m+zP5OZtUqdWjM3TrFfr2YVnSFaWmrVirbrXzM+hfatV6NCXr2YKp9OPQvViGfI14Zrw9ISNGO1qliGpizOgzfbn2r7VSZj0JLUnZs1IO3VJCYnUORnxHBeHohiUXgEU1AKIVpxyDk6pLQvTh+GIvfN2IQVIBPJR6QgP0ZeQoxWGJSV6M3ZnVoagttxujIWrdCJQ/CKxOs2rMjbhNKyE6rS7UhTjNe1Zs3zp9u61RjcldE41IWJCRk4pNwR14iisLQlgD1iHZSPQZi1C3Pui9CagxEEJ4fsy0D03OjlKhMQPS3E4frx+K26N9/Vs0K1mAG06fdTn86+++fVt149fIU7rc1Vn90dlp1e6F4AEshTlJ98+nPnXUJ81WtSNijOupT7rpqxPrS8tEoAEl0tHKsXp9W3JVb4lPn276d8/n3zr77M1fOnQAI6VuzYp3UOfQ7r7FSlXpXUYvR77V9991qjADS1fautzqXf27NWz2pq+3NczH7MKU7NG30oAa2ZqTo2rpGdXvo8+PQ/NwGorZrQ1zVqrOqT6dq6AG9CxUs17U++RozNWxSk5izaur30p1u1Ysdi6xAAvkpW1StUbVuamaE3a6dezE+fIWLrc6hL27U3RgAY8zZlqs3a7clWq3VafboV6E3bk6U63fOqUrcAHlm3darTVS1auuoSc+6xas2Z1O/tTNiYqzElE4AGElJTpKzIUoYkKlqlPuqydutfMy9P6NmdSp3SMADehfbtWLEajspPoS9990O3Ry63OpTEevvhS66arQAQpKtZvjdCbumpCfz7p9G1XqXz7Va+rXn269i+AB/dQn8+zKWrp8nfXsdOXoSnUp3wp1q0rydGAGtKdKyVG+KxWlFIUgxTi0VgapSlKDUMQxwMRSFIvBiLSEhAAdnQvdDE6DVeDUvJ24vaocGJ1OnJUJ0+FqFDoUbc6AAvOozpCpUtRWRt27pW3JROvb7rd3Ot27fCChbgAKSlShb5eXsRqZnz4WpxHTo1Ilbp0q1OS7NmVr0IANpa3RutTq86Uic+dQsWbrEvNUK1StdPn27F9q+AA1WnSla+1VmI1H6EQTE1VhDRqxa33XwjusW4hry1qAG1qxXjNaamYQR+MxqamJizAtmojsQT31olAVRiMV4Tyd9eACLOvszV1mK17F8lZqTcdsSUzH6sbqWLpK1WunT7EAEulf2J19mxWn1Lc6/rWrc3anXUbXbnWLMhwATLVulboUJ11C33VKNKxWjVW+Rr0JuPzViahWpCCAChE5uI4/Us2qtaXj1qnI1eP2YlEp8VpxKhPsXQ1PoQASKkH4QScThqOwrb7FKauhiLxyxZvpyMlEpSpKz69KdABAt2J83dJSUTsX86jStxOPWpKfH58+6W4Wp06FqABxbnULNmKU77dqKzql0h1rFDidOjdPtTqFm6hAAyoUu6fTnTr6VSd0ZKpdYsROfSpydChdfL9uAHFS+zP7u3bunVqdm+1ZtTVXqy8+RkpChZt04AOZ90+7tULFu3dYvmK9G+hOuvszM+6+dZtW4/AAqkqdq6pPoULd1m+fLxDSlKEtdIz5S+3fburWbE6d9GjOkLq9qX60NxBDkldNTMKx2Cyvx2VgvNyUCSLQrOrW6FOjYozVSOXxDXsWp98+JfDE3Sk60F7FmHZuH6VqA7MQdrRqLzrdahSt07FCdY/mp81K2qkStWrudFK9XnX15edbilmWv61SGI5Qo86+jwvfYtz7HQt3WL6HPus0J9qjYszN1CNwvLwrN1aUYj0E8tarVZm1Rn2bcrCeBDApgDabiCIY1MRqjL305a1OtUrUTg9UpUpupDctHYD9ebh2PU7pTrTFitWmZCIInNzrdmlNX3X1LETlq0jClOzCkcvlpuWmYxLw7IQL24UnV4lao2qd1qBy6+CqRl5WEERQ/UjU6PxyGIpPidGdYhqN8vfVt1rE6Svmupam59u+QnWq1mvfNyMXgKoEFipx6vaqTU6Yj1eKzdCvQrz7U+bo3QmmY7YnUpmBybg7JSsSo0bqcjBBC8GI9MS0nXlbUetzUeic+OwHJa3CC1Ok7dGNxShQhiFbcVgmpykxVkaXdNy1GfTj8pMSEGIpGJOvdFKFiSvoQXgxKRWndLz5WRiOdDMcr8lVtRHFrVDnSFWvIUaVmJVqETl+6Yi8dm4/Jx21EVmCO+Xgqj90Zlpi+6zLQpSoUK9uZjUjNxKdC9uRtTFmjXmrHbpz7FejWinbsVL7Eft27E6QvsWJOZhWfYm5CjfNQXqV5itdI2KFirbhDGoHbcLTMGJe1Nxm+Aij/IROzdLwnlIByTr24ndSszFCJW7NaavkZ9WvE5CPX0Kcen0KUMV7E6buty9ehG5KEFuNwrD0nDUdj8RwUTrclfI0aVaTtz4rbkbd9m+rdEpmFKcMWJSKxaYs9LiVSYsxqCmPwzfOlro7J1o/HoflK0bh2pE4zC8ejNqIqcC8brxShMxWr0Z1SGJaTikfswzGIxQoWalWYp158ryN9edFK1ixVozNGKz45Lw/N1YpQjkpLQVRWhWhWIoflKMraoQvDUalIIoByBPOikdkINxO1KVoWl47ykhA5YmYNyMK0ItH5ShUhWjD1SBLDUKUIH4D0RwMStSXoyFeD0rEEX5OnbjtOGaMlRik1RuqdWIJuQheQqTp1CatUORswvOqRWPUKk6fJxKrN3WLdGfPtx6pFINyMxKwzDFqZqWJC3arxybrTq030aUnP5986hQuuoUpG1Ix6Tr3TdmvPnX0KV9irJz7MlJcvfQt9u7tw/NRyvN3UJqjYhWH5SAjkbduPSEeoVJqXvkKN9C1Zt2J9uvJ0I9SoW4lY5999mjMSk+FroQUZS3bo9WFp3EMB6tCWS4NRepEqE1dJ0rVm6dZtT59991C+vbkakboyEfg3ThWpGLU+XtxFIQYhPG6dGP077FSRs90zbpy81VmL7dulI1ZChdWtR2jQq3StmdENOpIyc3fHYM32atS3dfSoXWK9/am6kSvtWbNmvdOtW7p9m6ddZs2uPTpG1fdPnTrN3bo3U7p9q1XnTqvfPr2IxNU5O+IKs3TlbFGToSUSqR+rLSFahLUrd0RTchBPfC1KnH+pEc3FaE6O2KMhV43fPtU50+vBmYp3xe6Nxaam4jiV1iWp1brFunXl4HojtTp8vPn2KVatPka1uhC9G3VnSVGMRFTr05OI6N0+lOm5uhShaILduRjEbjsF61G+vHpK6jUm7U+jdOnXzql03fdOkZKa6V01dfdLz4rfPpRmvClqFLUQxydUiKRuk41E6tCrPurRnp3x6ToRatQq1pOQszpq3FbHdM2LXRvsVp1eMzE6+aiUQ05OrUpS9qKR2M2YvZn3whnzronQvv7d3Yn27U+lU69qpYnS9u+vdRupcnTutS0tT51GvWtSUjYr3U60eiUcqVKU6VrS8Th+6BubhaHaMGbUEUL2IZgVxarJQKoNQpJQRUqMVhDIwmsw5FYKpWbp2pOrNS8pNz6981Zo2pqSr8ft0a83dO5mxSrzFqzQr8hYtTrU+xXrWZmvarV4X5e+hfalrUvTqzorWsX2qFmUuj8tMT4ZtU4vNXzUzDFCXk7VC+hdEUNwnut2rc/syEQ0onOsTopZtUOQvn0KNSnRvjlGTm5anKWZmxYla9KjNUZOzSm7czSlpmalL43Yq2ZS+NWYbsRWNwXtWojjkchmWh2Zgti0tCaFYjnRK1H6szKXxHCkalI5XvsTFqpNUZCCqQoRyTp3UpCx27M+O25SOUpKfdbsXdi3ZpX1a81ffSmZunHpCWncUrzUhYn0KNqhZp3Wb7oR3wxIxqUkZazDcrM1ovNWqUjWqXQXjkxMRaQhmYrT5O3F4DcH7MGJG6fDElCCLx+HIBuHolFYrUnU4tHopRpyNO+Qs2rNu3RnyHPmp1KjYszqNWlQtWJ063LTduRvic1fH5uPUalqfbuvp3Tp1eYtQltQpbl7dOfFJHus0b4TTcNV5uQm6VinatUJ1i1fLX3zrV1e+SnQnmoZm5mRtT7NG3fQnVr7qFbus2r59C1dJTUjO5mxQoXUZmhKRW3Oha1LWKda+3QtWqtu6aj8+JR2rSs2qU+Yvr2qluNVZajFOUt3yle3QkbNmzasXyVflJTlbd9mjQp9ebj8nXsWrp86lfOtWo3dxKE8pCeRikTj0rKQG4KuBiTm6EE9KvPm5GRmZWzH4nFoiilmN04xOpz7FufTvlYgkIXp14fgvQhNDUKVJW3ITdeP0q0at1qE+3XoT7EhNS8Sg3fVoUZqRmbq8hat2LVqhNRTo3UrdG+tapd9ur27E3fPoW7VK+31+zHYNW75KSo2Z0PQzCaORmahPZt0I5HJuakpaOXW6ktA7AYxeGJGVr1o/Uh6Ho3SmOXrRudVrUqtKhSm5CNS0+rAxN0JqJw9CWTr14cvoSsfoWIEEAVz4/ZiKfQo2rpCStRyDsfjNCJX149IwxCanE+hDcci0zQrRSHbopBPQpx6vAhgsikIILYioVZO1TrVbNubnTNaxYo9OhXmKdCbh2VsSM6zUmJWxfHIaj8fqW4Uq06MIIGqdKnAcj8zEcbtS9iQm7q1u6HItBuCCI4J5eE8lD0dj1WI5qvNxuU47KQ3NyM6ap3TolHKUbnSUMSt0HJCF4arQpDsRysFUXvgxdKU58pfXt2bVq3brydSnSmKdCvQsXUYzan27M3ISEKU7F9SpAbh2M9itBqhHqtGDMOVa0ek6FelDNGP3T4zOoQmkpSPwpHJGNwciGI4QwSwRx+MS8FEDUBlbiKCyIo7BFCliDFGrLS0xAz150emL7V1WhNzdqfNRKXhqvfM3TMlfH5e1fFJ1OYnX30p8+brdKUjtHpS8F6d/OqxelDk1Qm4Lb4S0KtSYloN1oRyMF60SsUJmGZmZmop1rFaWoTEC2tZtV7cavn3U77rrVmvdIWrPKT6NmvdHZeDUKysKS9ONwYjclBypAN2Zu+1bt15KdNUrUeqR+brTNmfNT6s3E+Ly1SVhaI5aFoDODccgVVeQiCAch6lDVaTmIUmY/NykFkQV4TSs1LyUOQtAvBDEpW1Kzo3Ui8To17MvIx6Lwjg7Ylp9uPStmIO3aurVZmfKSla+Uh66XrSEvAqvn3RmKTulXhalGJW3NSMehFWiCFYAko0YZidaThWbhirO5KFYtD8+3BBGozCOHonGashCCnBiNxHC0ai8lBqJw9AfhPAFsF59SZhiWpQtJU6Ehas2bqFuffRpzcpNydqYs32KNqFrrV91CQryl8xf3U5iA/KxqvNXRblL69C3apS8WozUrPs3deLROP3wtK0obhaBBPiViBHEq1Sra6VWWhi+tC8lZt81dLVpCAgjknCk1zpSXkb6F1qVpUZGnLXULFufbo1IpPo0bd91urKUJiZhmFoGO+3fbnW6dqrZo1JmQiUH4OV4SU5ufTt0bU6xamIIoLwYn07FGxG6UtZo3S83J0IfoRHWr2e+xdYrS81IVqPH58Xs0LrdOdfbt2e+Tnzo3fRoUJOM1bVefXnTFKSikMWpmTl4nMVI/Pq1q8VqWK8+6O1J183MR2zWgxddfOnVqleUrcK1LMjW69iblJ1uvffbp17UJp906hWvr9evbo2rFS1ZqTqND++6dNW7dq1WoyVrnTurdzNedz6VmzQsUr+j2a1CJULubnSMWh+JUrcnQtzFvm4jr2pOAkhNGaUJ4Yi06fbnWJmvaoy9eQoSXYtTdq3WmrNitKR3g7HbF1e+1ZqzdahUpxu+GrV9mtap0ZmYlK19GddfbmLcQ1bFu1Id06dL0aE6OUZq6PRyE9WdWqy9XoS91mlQt3XTN9bjM6jTrc+1bn3Vq06dzrdijM32o7IzNGlNxeTn32pChMTrrqVjmbM1bszM+t3W6l0tZn26XZq1aNaxVoS9uFp1mP2Zbj8ckq1CzVj0I68bnSMKyNCdZvvtTq06+f2u/t/OrXWLHzpujdWtTqNCbmq9WffGp0UoxqvPr2bXP6VSK3XzEnSlIYqQxPn3WoSStCAbkefDUBTNVIlFo5DEMwBnbkYlFIpUg1ASwpCseiOFpODECeLSk+HJWJ8PxaQsWbc+jG7dKdPtWqsdj0lJ3zV1qXt3zrUxPpzFm1X7V83VtTcOTFe1Ul5KxYoUKVOWoyFmWun17ESujknKU5Krbt3UIOUrMxZmrVujZnzFCvLz7ValLzo1EU1UupTNG61Tn3169qvbusz5eJWLFq3BudO5mMXQxVoVI3ahylJy8eloJ4/LValmZmLNuhTgirUI5B2tG49PiKCiCGbmYKZHjsH4HYdic7i1i+A3D983Yur2+Wjt0PQliViYt0r6F99GU53H5119i1I0uzIXT+rbm58hHa11ijUp0ujdLT7rETsyU6famLFqnWkZ0zJXzrViDFe3Ts2q0+DFK3ZsTo9VgPTdKhfYt1YB6LW4zC0WiOvBulZqQ3dN0IrZ4BuIKHHpKfWsSHOj9ulOl5G+Yk7qF8zJTuQmLUajkjVhS63fXt25elTkbV1ahSlLUhPoU6F9Dkp3PrWaNuTs2LMlQnXSdCahNVuuvkZqlfTr2IY7Fro2rUKz7M6jUqTrNahJz+lOnzVGd2p99uZoW7Nmjbr3z77pu+1Zs9ezUtyF1OpStT699m/nXX2+daq2bN1qxJWb5063auuuuvm4/Tp3UL50zIWKVHoV47ZqyFifO+pbt277E+1Zt9iXkIUgbvtzqdC+l0OpPqRKJxHHYXjNuCOBmANZ0Uggi0HLEHIRQUQM1oA9CsM1IYkLVCCuGYTw/WhWQhFWtV45ITNOIonbnyF9eKUoVhu1Vui8pFrUvYsWbE+lfQsWbd0jSjcDsjPukr68nP4lQkLEnzdGRp17pi+++n1bczRqTNSdSnR6zY50+fav59CaoxObj866hCaJXR2Stx+ddbm50hWtRO1xKxYpWYlNxOSjsA7KwCuThS+fIwV1oGOzPiktOt2bqtmRpwnqQxJRDFaUrEFCGJObvmotH4xBqD8LTUE8egCiHIIZCxWup2JCTs2p86dRqV5iTsWulWmatmdJwRQNx6NwehPF5mfHINy0jCGAhjclVicVn0LNTtyNqfRvh6SmLuvbpRmjSqdOzUpzofm4UoyEvIQYhHB2ILUU60NUasXmI7ZsT5e6jHIVlpWYrTNWKRBHIUj0euvoSdujE6UjfXoR+N2YOwRQ3C9aTrV4vYkL4GI3KTEcg3JxaBmpKSk6nXsxK3SnVpS1Oile+xZvoVpPi063Sj9OLXzp8+YhuxNTpirEdG3Vtz4NxHanQT3RS+KT4/dOnxK3EEDF9i+IoQQTS0chinD8xBNCSWkoTw/AEd9OEF8aiCCevQoV49LwbghisFUQVoJ4xC8bhNG4fmpq7s2ZiQq0bFKZk7q0h16PQr25mZmKM6KVZ1u3QmbF8hNQrAMbNnmp8nY51aZiKYmJqC9C+jCedQicFklRj0vat0JeFoXvo31K1mvNz4XozVuXt8tatXxHB2rJxuYtSFilZi0+xQrzNKvFacR2p9iHYIIBdEp9SvIwRwlhW3SqzUtEVuvWqzF1qVj1qOU41Ix6+fRox2Ss1IpAvAVQLwbqyUetxyVkohtyvSgjkqdu+IqMQS0zEEXqQjgIIIIihJLR6QlYTxijDlKN1IXn2onCtGMxHNzUekoXpSVCh0b6VKIa8rDEzUqTMKyUDsQTVWEccmZGLTMJKE1J2aETo2KF9C+vRpyNKHolJzUK1L5GJTdKfVhuzBydA/JQNWYHIipQXrx+K1aclI24J5uF4LYGroL3yETlKsci86hWmbN0fhiQry8Ja9m1fbjViGbE+Yk4hj83Yu6MtdSoxTs2p0tCW+TvrXy9S6hPk76clKxBR50+vI1oxQtzq8TiC+6fbkJa1MzrrUOUZDukY/CsBut2q1WXkp8dmqNC6lanWJq61MccoX27U+3at07Ve3SozU6QtWJGbtRyKXyUN3WpuTt1bV1qfbq0rrVG3XmJ1q1XvvqXWLVWzQnXU51qr2r59Gb6E6TrxaVtxaPz6diffbsU50Rzr6Vu6ZqSM1Sur1532+tNXX3T4zYo24vUhq+C2nE7cLwlitadQik1BiYjsrDEQUZ8co17dGhTukbE+nQsyHakKF19mKTq1ulfClmYjlqQm50xRtzr7Vq+3xOzEd10+jddbsW513NX0bdS6b7FuhR7E+1z6NurWkOhYoXTdWGZuZrUu+vVt30LF0+dx6KX8pbodeboTr7dKjErV/NUKV1SxF4Pwji8cikc50rfFpqQk61iFJqfP5C3TpWqM6MX9K1Vg1OpRTqWYxNV4rC8+dRi0tHZ0rbpTrE+O1YZjUYkZefZrTVC+jRnzp1ChIVItJxSbqUYXvjVWRjHEqVGrxmtI14do8ah+lMU7E+vXjscr0a8+PXWbM7pXR+1OszE+JWKUrEcPxKfMTo9Tuk5qdQvuoRWdUrV51CP24UjUzI1rU+jZr3xebsVZTmZeKVJeVg1Yk6NqXgvKRqP8hOmoVr1Kc+3Pm+6jbs327NOtaoXWZmxITMbtWa9edNXS9qvPlp8jYsxSIqtepOkrPUp0opGIpQo2KFSLULUpTrScM2b5OGZCFaEvCWIJSQs0petAavugVy8UpwRRSjB6BLGo9AvCanLWYBnBRXgegVysRUoTVKsnGJCbqTHOsR7nR+3Po2Zm+dTqzujNWrFGaryNurPpUKNGMTNavYp2LUhYmopL1o9SsRa3auic+ldUj8EsvS6FCTnWoPTpq6Jy03IyPWsXSUfun3RBC0UhyfdErNejKxmYsSkrXpWI/GOailifMVYMTotMxiOReEU6JQHYDkYqw3FoTTFmIYjka81EMJ5ilEExFr41FIS2Z0RXWoGboSQjl4dgPwKZ3EcdjNSG4jnWo/MzrqtqP3y1aF7q9uZ7XWisQyEjNV76vHJ8lLVaFCzak6dadzubkLMxQrysUkohj18JpCdUsz6HMzpKQtWpOfF5GVtx+aq07dadavvqWqFiRt2Z11uJVIO0oxIQGrNPg1TmKVajK16ViKVaNeVhmBmjQlZS1MWOjdbq04gqczHIijUjZg7dX7PZqVa10KQhjsC8UjleakZaQrzqFShZupyNjp3R+fSnVrrrV1ulISli6+/oWKU+QnTU132p91GfQodOtYtzrNPtXT7rp1K/usWJOdYn32bc+hYtz6NWNz6EjZoc61Qs2bPPtW6F9efFZi+hJUq1iffdXnWqM6+/tV51Chbr9a+j25C1On2ZmdfTqSE6vdITrM+lTsW7VC6a7FuhXrT7M+zaqU76Nmam4/Mx++317VK+lHonHo/EExSmKV0MVILyEhPn14ggHandTiUaiszJ0YAogkuhWjbtwZpxedRoy1OdKW50hSsd10+6+dfdXpRTm5mKWK9eRsW7E+zYs1Z9OvQr2b6NufdfXjfYsRi1OtT6tCfMUJ98hbn27N03J160lzqkOx6HrVWShWxYrUpeUpRyYrSFi1bo0OH6l1OOT4MT61GVt3zFu6xam6d8XgTwrCK3YinLR+Owfrx+WmJ8ZvuvtS1G1ZnUYOQTyluXkJaCKVhuN06t1eH+lNV4fmq8lRpwxMQ9dVlpaSh2AUxiCePx2KxBZjEVpwrF7ql0lPic6hyUcoUZahWisbgvAxSmZGjDdKFZOPSUSj9qLxuYn1a1ibhWah6NycxHb4XsyMtdPuik1QjEnVk4UisQ9nvvsz51m66Ykq1K1RnV4Uh6AigSQTyURS8W5uGac+B2SoykvBmjdG5OTjkvZsy1qZikCmD9jgmhmWnzcA7JStGQrStifG6V9KZkJqUty8xZm5KOW69qnG4nIx+FohmutFoL8QScjFpeEsVvhNH7VeJS9iGIPQpFJCUn2KV0Xh6Jw1NQdvt0qdKAcgzLyEC98R2YrBeBFYkK9ajCCPQCSIpKMU6ECKMyMZikBTAFkII/HroQ0ILKcI60PTcYj9mSsUpi1XjNK1al5mXtSNmQsyNmpYl75qPxexZs0ZaXt2L5fic12bpuCiPwrfA/Jw3KSFWIpClwdiGA9YqWZGzQtVo7HpihEUL0IZmIbnR2hK2++zDsIohl7pu6++hKw7IQzG45NVLF0rBXIwrMxiZgzYiKzTpwB6C2dDkAcUILx2dIxaIYI4F5qQhmdDl98arR6JRDYg/CkzHJ/MW7M+Xh6DcM3QaqxyD8B2E9KOQ7LwL2aNWJS81I06dKnSj0nOhPZl4HoUnzq8TrSk+H4pIzUTk4vat25u3HZqxIXQtPj0TiGSp04hgchqJTonNV7E6bqxWKU68pNWb6MSvnWqUeq27FuRryc6ZqSknPkLMzPhmWvvlJWfVpWpiWpQNS1CfC8Sl++jQt2IG7pOBmKx6hLW5mnGIjsSV90TvlrEnC8BfbtVI9Qi0+I6lmRjsdlIXrTUUloLzp8pai1GSicpLydmlKU5CvWnTFqlboULVu1dzrFOtMzrVqpHZ8rQvn0Ld19mXhadTox/uo26NKf33Xz7cILMGbPdWu7NCtVn1ZatIwOWrdq6zM/aoX17dS+fHY9b6kSut17VizbtXTrU+zfYpVZezbrUrdGtfNzVGPzr599Grbt159mhG691jpy9qnCClfbn307XL2Z1mvXr2pmVsXyE6fdbo9u6+ddffJX2Ju+ZkolLTNijbmKUhfN86hOnTMWiKVilqvGIc6VChTnxK3NW6HfavoyEnd327d9Pr9WtMSsvZmbNjkp81bvo0at0nWvqz6M3fPtc6ldzrNafanzrFDt2759u6zPsW7c/tT599jn17NXqUOzz6Fu+v2+jQn2Ldq3an2Z0j2JTtSVKvUvvrTNmhBm3Ge7qSUfg1ITqle3XmOdPq1rFuPV7U3NxaxYo8+zbr049GbNKxQkadqlPum7ditJQ5IWI1ZkaUtWiczHZmHpqQrwlsxyJRKUj8PX2J9uQs3TqNKvTvtSU6tYq27VWvWr2KFq/pTrMtfddRkJuvNS9e1dOs058lWrzc1WicXnwxGbE6P0YnFJSOz50KW51a1dQlKFW1fXiXXkrrFa3C8+vbr27E3Zma9G3I8PSUakKcUn3V7MaoTdiSvsTFqtI81Zt1qM+zDlmXoUadCXpTrFqN98+vUkp8hakL61GJ32p3Ck+jdPt2rceuo24lQm6FKMxOZpT6EchetLx2jFZKlAW0Lr6MhMRFAHYD8U5GfOswAYacLTql8egWQvA7DE1FqknRgBAlKfy1SlG6MjTi0LyMMQBdBeJ04rydqIZ1ChIWKMrAUR2hTqULduOUuI5S1ZpwRXU7Vvn07M6ThSjbvtQVVL49SmopRn1KFCWnV6kCmVnysvBJBq6tfWoWrUtZggiV18pRoV77qFWYt2bcCq6nD8tJRHB+EsLTEzWpWKsBXNTczEEDUYm4Oxi1TjVmam4BVEFuvCCxGLdKZsWo5NzcXhLH4vCKalo7DsFMH4J4Qw7TlIWiKYn0I/LWrpGFJ81FKlDtXU7chOpTr7Eb7VGdTt32rVGzPnT51etYt2uWk5ixH5nhW3PmKs6nIxOnSmqtGWn9e6xWunXUYlWlp91ahaiOO06V9u/gf7c1ZkJOzM2qM6xSm5SBvk7Nqas3StKlXj1GfDEF6leXilGKz4tTr0a11KrPrRBVk5GJ1ZG3dPoWb7NO3Uum5qrzcDUTnQYhSTkZSfatzduxQhSlf0bpWpKctdatX3zNCjdSs2puKSl81bo260hZuo3dmI6V9q3Po0r759uvbs27UxaoUqdPt0bdmn327oxar9WKSU3fEdWOT5GtWtRuU6U+3zVmffdI/Vvt3W7699rvuunW619mQp3T+lZt3T59e6Rus0aF9etbszdOSn068zMULEerVq0KUJOlWnU6k+Ug5fbtzulan9izQt81DUJ5OtDE7kY/DUDUzRoUbcZik3VugghmAtq0al01D8Ajh2NUYZtzN1edU69uUuqUYrZt27+3dXpcjGpKF7dLkaderzVGZrz5a+VtdedYvq2unH5m+an0a9W1Xvum7VuRrc6fVq0Z11epatylChbodW63brzUh2qM++QtV+lPnX305DoSsjJdevShiZnXQQWJ0tCkhM24PQkgLIVgYhqarTpKPTdWJxKvCla6vQmYlHZWMQIIKIFU3MX1aVmVikfgfqQUWonK3R2DMI4WmYCOWlojqQjvhyXn1Yeg3EMJoWm4elITRyEcB2BTKxHENuhSkZ1K1DsViUPSFqXo2p8Nzo9UisKzVCJ3VbEdm6liQkuJSUdnyNaJQ/RgPw/ITc6IJuMRHPmb6E1NyELULUEFmYlJmEUXjlCK0JC7idixDcQQ1M141WqQWwrbgxNwzAjkqcG4xCkKwxF5KbukJWnBqGYMSE6LVqt1WFZWzOn1q0zFacl2bNG3K26ccjEGaUFESlK1iSjlGXp1pKFJWFItFJOpNQPSvFLdCSnT5KtVidqtWkrcvTukZelwfi1ShailCLTcHrpqvL2ovNfVh6G4/CGahynWvkpSdQjcPQZiCdC8DMfgqhyQh61D3CW+EcKx2SglqQFcrBbMQhlITR2WjtapMxO3WviVudYoS8tMUqtiXqWYOzETtwzIysRzVGZnwboQmmIDleJxyZnxSI4fuj8+BuRkpq+x0uYiGtIS8O1ofj8A0swpNyFeKx6+jAxJwF83PjkI+Sl4rakp1GFJGCyBD1ITQCelC0ekroYjVKNx6Wq17UQQei8LTdSXs160bgdr315CRpRDUj86bvgjgbtwVy0fmYhmIfgqkoVgW2JSGoD8nAsr9iCG3PjsORmIpGGKVW+KVJ/QszrqEfiUXo2JqnSsTEj8nJ1I9dYm7cjYitqElOMxHJzEVikdhNNzFeTtSdCIZeVg/EoGbcrx6SnTFGWgqtwYkIrUgVwvJVJ9iYny9KNwzUk4ii911qlC9uLQ9AetzdWzVujkzQq1KcQR+I6Vi6zfRmKdKnffSjkbkIhhJKwMwF81RnTE1Pq0YtGLpn7dWjLw3AHrExZjl8fpUqVezRqXSFixfdapUp1ubq27F9uametbkJGrJyV0nNx61dTmLqF9iDcH777dqdf1J8+lZsVO6tC9uSj0Zt2q0hNx/t93fGaEQxqNydSE0F4LaszDspRi0OWJirZtXX83Uk6U+jf9i1ddQsTpPmL6d1i1yMpUqW6F1m+RqXyUxQn2KV9GNxFKQpfRjEMVrclD9WXhWF75a1KzduhMzp0Wt16NurXoV6d1ux07d1u+VqzpC1Vuo25OhE+xaox+IJSvHIbhibtXwfoRWGI7LxeHL7rU6+3fPnWZ1TsW51q3fQkpKtVpzUxDdWWm5qjWp1p9mhNycdswpbm58do2Z19C1JVqM663Otz7Ne3avvvn0etUtWLF0zOtzVDnV7VCh2L50+Tlu6tPn3059u3YndiVmpepYq161alFeffCkzK06VublpC+PxfmaM1HLMvC1WZqWrNK3bsxmzC9iH5WQhFIx2EsehaO2Jq3YmbUndPkbEpfIyUc61WFLNu1dbjtClB2YjkNUo1bgmnzUVjvI3duhdJ1rEfpVJ0/sVKNe+nWmr5Gfao0b4nYvsWLFG6LUadeH4/aoU69iVuvjd9SEcH4nD8pErpiRpUYxQiVipakb76MhYkrV0SoXSlifRpW7rVGlKV6sH49CkjE7NaPV4nBmYsUIMRuP05mHpGLx+NWITycSpxvsWolEUfikJLXYiCJSFGVoz69i+JSNezIXyNeRoyE++E0csV4tHb51OlzNOKwVyEpYkoxQgHIFstAfgro8lQmI7akrduLyNepZvoTU3Pvo2oanS0nHak1Rk4lCSSiKPQWw7Fr4KJCR4KJ9GfAppwzBmArg1MXQDOOSENQFMGL6UBnQjNGE8hZoRHbtUZmhPnx6rSszdePy0ZlYLzrFKhWnTHarTNeZj86DENR6Oz4tWiKO81WsXzNefZqxmE8Lx6IILYnMS8Tm5mLT4tfCWXhuWhDBbKw9B+vMUJ0NTMOQJoS8erRiIZq6JQlsW49NTVC3NRiXg9AEKI470Icm+rCCfKxHCOJxBViOdFbUFUdhS+BZDUJZ8J5qdMWL4chyGZ8hNTq0TmorJRWIpmdD81fbvlLEfn2bElQvs1ZGF7rqXSic3J0J9iaqzVSZtz6F3WvoUI/NwYrx+IuRqUuNxBCkLRaF7Ni3YjvOkIO15uMxKBunE59WS5OtIUpm1PsVbdKN2ZSJTdKfQjvZqWLEUkK9afbis6rH510jEUci0JpiTjVu+Zq906EM6QpykGIpUgbmb6k+3Olpapbt16FWZhqjISUnIxKpKSN3J2b77NivU7FGTp1bpuv2LrPQoWbpG3dSlZuZoRXurUbrrd18tOt3Wb59vn9aa7r6Fu3ajN9edRlbF8nJ3zrVuzy1ibhaaoT7Uf6NmbuhWvE60xRiljvjklRt051/IX1a9SVpXXU6M6jRt2KfOs27F11H769u+lTtS81KTpGRkrN1uZvoX2bEjOndW6MzctK1qNSStSVmYsUZaPV+fH5ulN3x2vCs+lI27FCPxe3JxK6zdai8+1NQCWCOBiASwbiUBDAlnReKXwZku6dX77dvkbVezZtzrdixbkrc+LStedQjUD8FcjMzM6an1IxfLxHUoQ9HoiszM10ZqMU4MUpehPo25S6nXtSFiO26dC3ZlbM1OtXSlaR7V8pbsW6M6tFInOlpuhbr86+havsTM++Qsx6xajcSiGdHbp198pLSFToRerNwHKETh+DsegvNQPWbrdGhQm7EvDdmViOCCBHAqgekYWgRwcnwGFaHoEN0EUYvszFKhMV5qSkoMRy6hDcThSVlqklIR6BmDsDUQQGoF41DkKwnpQtdMzu3fOmpCSgdjkLwG6MhMyFezdM30uvRukYYo3QpN2paPwrwlqRe+WpzFCKwrfRlIZmYWgag9BPSiGnEU+1GLdeK2Z1mbsw1IWp9ihDM6RkqsLyFCM3yVelHZGdL3XxDAvHq0MR+J2oaujVCNReC2Avg1CClDFa1ApmYBrCkYjcUlZC6GJrgzWhSZoW7puZr2ZS+rPkJeSiVal3X33Wpqbj1CvSicha61q1Vuj8IYCSnD8KSUrJQksxSLy0nVp0bo3amoVt1IWrV45ZtzU+QhPahe+ToQtfIzE6akpaNQlko7fGq8ZkoRyERc1Pj1uC2WhFB+MwMRDOjMVgmloJp0E8+CGzBbdBTVg/OjMbj1KZ7EzG43F5aOysvXrQ5Z6s6pLWIlfEEUhLD8xGoIbEWiGI5OBT250Yt3Vo/MWpePWb47APycG50QxKBidRkYtdALIXgBXIRHIQ3MxutJWrcIIZqQlpQXjFuWgvdOiCB2lCWbjlmRl6Mbk6EAygggJIjt1YnWmITQkl6sJYhjsXjM1MxaH4Yj8BjDECCrDkZo0o3NwzagGEB6fJwYvqycOUJalQm68jTjkHq8Ia0/qVo/Yi9iRtxqfDcnQqzFC1Pt2almJy8TusUZflbuI6cGoD9a+rLTpWrPl5GFJ8NwHY7OozorM1q8zEUQQEMBuAjisldBmlEfN1LNKvTgNU5GnHLEtUmZStRlrFiVgshSDtiA1Pik6TiUPwO3wPQrwahDA9MTE6fQi0xNTUarxW61DdqpQp3T7+TndWxHJPsT4ZhHBiJ1LMOUqdCLT75qzZusULN9udddM2p0pOn/2JG6lan2p18jM07qMtbsW759joVrNGjOvpV7p19Dt9GddD8j0LVSPxDPvpVK/Yt25CbpXSNWtdC1mLX30J0nHqtSrM3RBF5iLQpOnzufQm51CWgvAzZn3zVG1WtV4jkbVCf2rrV9186nfVvr3TUXnQVUYMdSpWnRS63OoVY7ZmZOhOjlWCmzBivNXT6k+rQl61GQ7pOdX5mCSfFZKx325119ufR7V1W3I2oUnVb5KZloFk/lJS66d2J3OnWa0+bu7599eO24GJPm7UnTsTM3ZpSNK3bikjTmKF8vdSp269OxZukZ1afS6NupbutdO6zfdZkbdalXvur3duGLXbn0rdiE8+1fPoX9i12aFC3RtV7Ve+tz69ChQsWOlLXQtUsz61WxOiKjG698fg/NyF8MRFXp2pazOtRaMTUzHe6+vWvhSZjkar176s3MRi1KzpqtJx6OWpGlLXwvWnXWJStzrF3ffZsWo5I2ZSFKFCLTU6pCkfs1rdWEFGj1aVCdWoda6zbo32bNC61Slbrc6d158+1dSpV5ahM1puvTpV5KXvjtiWgvC9rm5CV7dulWpXTqVmdUrzrrpO+zWm510jJSExZsU7cStWbESnUK0Wm4/HI7Ws3WLcDnCWPx63NRWfHY/LyVKJTFGdNyNG6tO7XTn0r7N1q+dTpWbdn5HtXSn2bdi+tRsyE3IwXitmxQ6FarOsxSzXlLMflIYsSsxdarylStPt3WZCzMz5HvhBdSvhWtaswGdWLWopSt0IA0uka8Sr0IrAD6pSrROtKycAOb6l0rSqXQA5uqS9WjTowBb1OXtxOKwEsvYgmhNPpUYDCfIWudJcCuHpOzbgZoQxBDViUpMTpG6CCdzcShW3bgUxFao241AbjcBhB+vCafEoF5qCaBXKxeKW6scgL7UpaikdpwSwFtK6SgYgohmCOApszUCyfCktHYBlVvvh6vXj0AsgngrvoQNTNiBZ1Y/Tgpt14JYUuu7MxPgSWr5CRqRuCWpJzd8FEvH6te6Qk59qxYq0pOZpUaNiavui01J0alqzRt0pnkbcxPm6FCzbnX3Tpi1fVo1Jq3Uvm4jrQr9i1x+1FYlRoScdic6+dI3TXJyNSYiKKRSvQkrFWKUpvoRShXn25OSvqX3VJ0doyUKwKKkXjkauvoV6lHlqsYrwim4I60Aki91TsWK03MzolYpWoVvt2rd9KFZrq0a9ivVq27EPSMB+DULx6hdOtWq1qpfLzUag1OtVLVenbj9idbs27UnfRnTU6+6Rr2rp11mvQ+3YnT76Fqj3Tr7FC+d2rE7690+lakKNWtXmKVm6zYlKVebtT7FKhZoUK86+lbumKk+zUtTdOzIXTrEzb6levddYo9KtIUrF8jfPpdadbnTp9/XvtTuF61C1Znz51ijdPr2rrM3WjVqNX3WoxShWGbcPQXluZozFePR2hPm7de++xMwZiVutPvvt0K9GvLWrc3dZpVpubt1b6tGI4EMLw7fK9ftdK3dWurV63Zut1Y1BiHYDCfTj1aRqR+hH4F5u3DUeg9RkoHK8fnRSanScvClSJXRKdC0pdFY1Wlpmn2Jm+xYsRON/Xtz6kxE7UOxSB26rQp2p0JYA7Rozrd91CzQnUqVi6rdZmZCdVi3MzEKyUpap159uE9CFK01dRkakfg9Yp0q90Xj8JJ1WxzdCUjtGTh+RhXi8WkZ8BfA3DknAXwvIxuKXQ1CS1WgzEUShnm7oKofgG4ehNOqUZiUjMhPrROjdHYboQTx6CazaiKORBCaZgfrzFft0YJoAshFEM3B210as+xap2LVSrdK3XT5iVunWp9KhGqMGJaalpOPTVeFYCmKQVzcJ4cvhubiGJ1p0KUoxOkLq3dNSEbtxHOiG6br1q0RWYzGZ1ujKV4zMSkYghiCNWozMx+JXRuRrwC2UtUo5NydeYgtgahFEo1Um4GJqHYZhqByKSN1uTpxOSjFCK077qFq+6Xnyc6N251alRo30rV8fmqVuhLTNGlCSlAtmoGK0xfSqWaFerFZuPytiJzpGFJ1enWpzr5C+N1puhZjVqVhS3Tqxy3KWLFuhbjMetS1CNTo1TiKZjcjbisEkThNLRuSgtmYLJ0ZvhFMxyXh6zGqk1IQijcP1ISwpAnj8QwpBNUg/BVCWH4TToQcOV4RTNaCuBNAEUQ14jjsWgcmq0fhadJRmLR6tPjkJoSRSDsxThLCetBNMwpAZQDcckYKIEUZlIxDEYlYzXhLAOxqIIzfCORhDByvHYR2IFEAghDHIT04Ty0JIKoQwds1L4lLy0aszpCIIRwKIBfLy0ZmKsxPq0IJqEByO1ZrmZiXoTdSZgqj0JYbrxyE18zXnTF91WI59SnPgH4zYtQjm4tEopDsENezMW4z983KzERS1Cao26ktLy01fRnzoSS8Nyc6IroMQ/KwXiknKwjtT4IIag1fFoxENOfWnW59axCsKTFWjDElDcGYdutyEnOoXTpKQlLpCAounTqUYjcZ5WNQK4AZwngtk58Vm6MpfJVYZicCWARy0AGUjAEcAMJ8LV7MlNSMhXoUaU+RtSMxdGJqPRBPunxWzEca43FIVg9PgK5uIKN0+db5/Rt3WLMdusRiBqHY7OunVZWzIy1ChRtUbFLvn2p9SJz768pam6MvPqSFWhbs0r6/PoTuhbutylmhNSk++jbp3zpKnLV7dqRoTMhOsV7dq63QocvPuutU6clGbNqMz7Ex1qUpVqTc3WmaklThe+NSNCvZt2bVm63btWrrNC+1VhLJTrNKfTsVJuzPr3WqshLwxUq24Vty1S6lNRWzOuumKdajfRoR6nVukJGHJeYkZWGpmbmaEzCkpDkbpUuYow/Yq07r4Uvh2jDXBytVn9itPo9mdIx+rRnU+nXq81ErUlOhefIScP2I/KR+3Jx2hzqtiZkKUtTi1iZvi0lfIQxYtWrM3CktNyNm6hdVn9iSo0qEbvn0JevYuutTMzENOzbndevN32686arSUR30Lrrdu+QlZSdJS9GzG7UtSkp0Jo3VkZCLRBUka0UiOrI2KkdqS8xZk5qamZCrFbUdgnow1Yl4pFa8IItCKtE4nJUYj7VGxL3d3fzU3H59e1D0Ft0hNz6c1UtWrdq3XjFKO2rqMp149Ok7XQqWbNSJTc1C81arWrrNmdOn2JGxXnT4ho3dOtfQlKktHYMRaFIlGpuM14vDsJIaumLMhLVL7pmRoT6UpQr0LMr0rVmdSumZiZp0InGpOWhNC8+d0atqIpGSkrdSUicFcEU+KyNKNTrpChPpwxITofow9NzMZnWJSHbNG1MTNi3PoXzdm1N0p11C3J1rd06hfdM81F6fasWqdKxXp1otRsWqV9mtYvkKsa7M+I45xyPwtCWbpTV/Sk50jPlp9WxKS1q3fRm5eRlo3DM1xu+pSgqsW7UH7VKLQU17c+Et0rTgn5C+BRbqXwQSk6PQJbVGjAko2aUC2GLE6BPCOCmSgKIpPrQE86ZnwEs3CStAS06McgURedSgJq8IOBZbnXwGcrfHYDGHYR3QGUXgvXggi8KwpBLMQM0IC6EkQ04KITQLzcAby0dgqgT1IZl4CmhBXEMCitA7LQFNSAMp8CqUggnwS3ScnAXT4SwjgMYMRylAqmYAkgNQF0didOCKIogk7EzITEcs1LoxQsz4xJyEn3wKLcbloailihXrS91iQiO3LTVeIIrNTUrJU4nRjdu1QoX1b7qtudLUaHSrz5GzPpTUjZtTEIbVOrasV4glpO3MRanFrq/bj9KVmKtmZt1Ju1Ylrrq9abpwrfYv5utPpdK1YjMhDUnfDFipH43QpWpifBiXlZSKVbq83G68+tHY/E4HeD8+6xA5C1GfLydiXlZC3Frdi3K3x6dITM+nxD3zUlJxKfLRWF5KDUnS6lmdavvtzNi3WtwvCsbjsTi3QtWqV18+h2+QoSFXqVrd1KzM27u6dOt2aNKtz7fbnVLdGfPszc6+7q3zpKj2J1mdUkK1v6NuPz6Fe6zdb6NOfbvul61PrRK6bn0I9LTVWvM2rV8ejtCVm7Edn0Lp1q3T63zrq/Ix2nbiOjXloNyMzF7dnr2aladUkr61OMSdGYtzEKRmjQmbq9q3LSkOzFm+P2o5DMxdFYjgOwMR6tD8pLzMtDkficJpuCy1BBbrT7E1Jx2zPrWbrNipMzp0xdJ1Ks7oR6fK2qdq3UjktI2qNO6rWpRe1Qlqd03Tg5Tmb5SXkOBFXjUlWnyNWvNS9aUun0bELV6NijGJOUkqF8VtWb6lCNz7p07kbr4pH5ujbsVp9uOzrfTsyc6ZpWp06n1pGtQkL5GVj8x0q9KWj1eG4RRjp2q9GPVJ0GoZmIbvgrrQrdSj8UtTUUg5BFRm47HIlD0OQWycIYKotByPwE8lZiURReSpz45MRifGKdCXvsTpqQlL5CxfB2NTUHutEpiGofhqJRqSj0QW6tCxGYZiONVJujZswLxuHp9uzITMxSpUa0ThavdSidKtbn0pet2Y9fMwKY7LxBKRuAOzUNwrVi0NQrPjEZr30ascqUK0H6VeLSEVp2rpmZoxiJwhtQYgzTpwLxWAZwIYnEoJIDUYg3BFBiVkZGL14H4BZJwxMSsNR2D0KQIpSFoXkZSIoB2OQEsNQH4N31IMVoO0paxCkxbka0xXrydq++OT7NmVs1bVmfbr243EMfjdqjOg1Oj0SkLqFuPxyTt2rENW5PupzUhGI5bnRSIqcDsWvr04pUkL6VSnbsWbU+Qp0a99uahyCG1Rs0JeXkoSW58ehPGrEtB6NxFPlYSU4P1IRzUP0I5fCCLwfuh6NwR0oI45EdG3AvH6scqzU+NyEJJqH5KHJCMRyEMrDsCWHLcQQOwfnVJ0FkhBFJwhm4dhaCCfANYAshDTiKJwLIARIzAUQBzB+IoFlWLwGUGIhlofiGCuXjM3HICuMxWEVWCuII9BXG49CWALLUAF2H7EBdBBEcZmoZjVmagDG3AZQmhqBXNcegWQA6l4UoQCmIYOxiEk+Vl6NedXlakrXg7GI1L2a0TtVZa+RqS8cq276lSN2qF8+G4A5sWpi6UiKLxyDEjBmSlLcUjFKTpQ9DElBiNysnHJu6ldPrU4YiKbhWbjkfsx2WkKtCHoEETlKFupHIWituxDFCCu+B+JSVOIbdealJ0ZugHJuNUYL25GKTFq+PwHJOJXSdeVqQgsWoXrRKfUvo0rNW1JRHTtV5ChZi8P3xuZmrMfmbVaVg1LQbjF9uLzdedFIXh2F4MzduzZsUasMWYtDFOpB6LQenR2jOuqUJG+zan0bE+vNR+KRmzAGt8esxS+jdOoXTqFCVus07p81Qk5CQvncxToWr5KT586rISPSpWakLSkd4nUqVqNqd332pmOdWZpW7pDo87rUrq8+3IU6U1FIdumpGrUkZaUsRKZgZpTotG68HI/CkQwUQnlOz332L+ddzp0+fbiGG5SHKFSLQ9CWF4cgkmovbs99KSmogpy8xBy3GpDjEDExQt83Jzr61WjZs99CQoV51SjQkJ/aqy9uJcnFbFnn1Z01RrTqNudxLr0Z19GvfQus33WrE+d0ZmMzrrFuvbmKdK3Ovuu7V1GnSnRBMQ1WrV4pZpU59S+3YumpGfUvnTrV1e6tYo38/t1rE1ENeTkJ1qxbpWIjpzqclar1brdShRuoXWrFS+zfbj31ulZumLU+dH7EejslDdGFqtKzYrys+ddOsz41ddRp1KX2asvfBizGq9SzK1bHZqRO6NT7pGbh6tbivFrEvZlJD69CzIUJiUm59azRmpOaoW7FOxbpyElNSUnTkaFu+Gp9qxH7qdG+zL2aE/s26liO0ehamOamqE3Rr1KNujFpejPnyNm1WulKlSnUg/H75aQhSFbpSJwzC8St251mja5G3Oo32LN1ahatxyxSkrPZnx+II/D8zPpx+NROxHLFqatS01Zj0zThyE1inKXUI9KW5G3IWpSStTctKUL68zbpULN8ftzrN1DpXzrdq+hXs3XyslYqUKM6nQo38WlLNivOswT0L7otWuqSEYi8+VugPxOBqlSkrq0xfZt2J061dJwAg2rVK3OpSNKddOn2rrUB23fR7+jdRoVZ1WfE4ALU6fYoUr7FGjQhShda6kVs05CG51edVi8hZgzJRmACrM0ZutCsR0p1CPxHGbM6Dc/jVORg1BmOT6crGpqEcGrUAFiCaMwOzEWgvDV0BVBmfLwFsZilW3KzEehablZiEcxHqdGQtwAXKEE0JqMCKdBVI2KknMWYTQkgrla8FMtDkxIQ/fBTD8H4AjhSCKAVyUUgvRm58rat061qXjNmAZVIpZr2ZubjMK32Y5WmISWYW7qkrFq3MT4vG4lMRafU5u+hWmq1avTvoV776ktGrVehE58zar39G+Zr2pmpKRalUoz5WzH61GTupyHWnVLESr1pm+bg5MzE1br0K9OdbrUpGXvqQG5WdNWLdCDs+xdYn25OSpzrFC1dHofncKwxRjstKQzSrzqFidYoWrpavVnUorIxOTpz69KdOo9Cfbk5Kbr176d8+hfJRKL1pqxP769qdZtT5OjMT6k+3Pur259qdOvoyFGxZr0JC32pqxfOus3yFipCtWxJSFqQoz7qV866f17FG+tWt9eVpXdCbq99ixfbn0KN901ap2rr6Nfuus31Y9fPsxKjV4t1rutz7FCZmZidL0YnN9futSM1PtTrd9CzCazEp1S6jdOvj1SfdKVKNaJSMnUtSVqnQnWbVWYlqMN2Ld8frRixM0qFqFJqXoV7ETjdWGLczIyMhDMI4rB6rSq31Zu6A1UjUtDU+xR7U3KTrr7pKhautXX069GKyEMX0Ju66tUiGvJXTU+ao9WFbFKvQi0B+1YmIFdqPROlRkaU3EMKx2+Xs2JW33VbNCtYszctao1q8HY/D1mjatV4pNQcjV9uU76lWzZ6FOTsUKtm3fanTctC1eJydq++pGpufH5WBiBNCKNw5ByLzogg3B2M0JqtMRzpVbpOpdOukJiJzMcmoVhSBJAOwvForfAtkoOWaESjkVjUAKYhg3AAFmoJIim7dKWk5uYiKBePQVwZ5SVgzEEhG4Owmry8HYhg5AzFKc1C8zBmWmpSdNR+QtROO2I/Wj1iJUY9ITu+akq9m3WiUbvkoerwfrQJIjnSk+rLUYhtS3C0+Ul6sepwYkJmO2bcpFrcARQYg5BqlFo9ENGD1GHLNONRKIZCHY/MRydGoUkYlI14lbs0JuD8ATVYIKVmC9K6JWLdeO2I7A9AqgYg5QhqB6HIG47BeAhjFuHY5Vm4LxapHJ8QSs3ThivDtGXoy99Dt1Juhfapde+lRpSchai0xEcUjtuhVoydGnNUbpeJ176s6RiKhMWJWnLQC2pMx6lGZ0So2q9OYj83fKQRzoQ1rrUnVlbdiR7dixRtzo7EccgtisYui1W6tZp0LMjNXTVGYuiCDEbtR+TjdeN0YjujkBHBJBTDk+CaQmYnBDAL4TwagmgPRiCmC2CeH4A1hNSgjgxBJFYxXhyrAXxHLROEEjCCIYRQrGYDGOwZgUQCaYgIYcgigmqwWQB2HI7DUEsAuh2D8FkEUGIQQKYKJmBJAHY9w/PhyRgS3Q9AAQjECSBbAC2bhBBPKwQxyCOGa8GYQwPxFHK0A3D0zSicH+vAORBCOjAOT758I5eG74/ZilalEEQ2LU+rZulpirPrToji/DkNToagYkqMdsV5mTheCyAW2bN0tPqRDFL47EpWxRuhyjIzEhE6NmM0qF0fnc6hMVKsM0IFMlKRWXnRO6vZjUjPs8fkbpinEqctYj8lAIYXqWpe3Z41WnzpaXkZuE8WgxfJToEEjAosV51C3RlOdMSNmlf2IgiCtdHalaasR2+6lTn27daOyU/pUZ9mzYtW4xVmu1UtVZqNU4zTpwZikQS86lXmuhfRnWK8hfXqRHIwXiUO1JWTs861GrElaq1LqNS6+dR7+Wvk7FC1QoRyCSB6zE5avRs0p1ulf8jY7MhWnXV7VezVuvn0pKNTdefWkZPuvvt0+WndmvbpW7rc6Wkq9iZjc6EVXny9m3VoX3X1Y3C1SYlq1it1OdJy103fRr14LIbrSNqE86LzM1AvD9SjFYL0akjH58xFIzJzqFOzOujtK+bpQcm6MrH69ihdMx7j18eozVO3NWZ1903LSM+ha7p19mXrWo7RhPSh2lCKpatWKc63Otz76N99Wbnyt8zbsWZ8doWpqDd1ixZodidJUJSzIzp8tG6sFc6tJxudRoVZjn3WeTj19G6pXrTEhUs31JrnxHbq38+3ZmbV8nbl7pWhPtSVORt15SlOnTPYkLp1mQl5ubpwrG5mJzEeoyMRTpKKRSlIxONUrq8GpqCaIaNOBXK1IpHb6chGY3NRF2Zu3Nx2LVasMT7dnuvj9W1Ug3Mx6lQtz6sZlI7HOhBZSnVpGZiCnLVr43H4lEq1q1JRDRiduJQ9HLcXjfQm6V1G1TpSF9ntyc+XsQpGonMVaNaxOjtm3GuMRyIqUMQlkYtCOEsnHoJJjozEPSktHYjiUdl5ehdUiUL9mjUqUobpzNGUs0KUtMSFqXtd3ToVJe3TmKlaIbEUunSN03OqWJmUmaUZqy1CtC8OUYNy9iRmpCE8jKyVGTumbEhTkat86VszUrHpK6xSs2bq0+dddanT6E1bl586Rup0r7+++S7M1dTozFulPjN0GoQQF1aEsM0IAVUrV0hbnzcvQsTcnIReVm5q6vNX32J8t2LchbmIvL9C6O3zdCFLcR8++1WoVqtmrRj0duvjdKJSEFlWHYpEVOvXgnkoZswkhWpwWXwzPghoQtDMCqhCGByCDtwigggxGYrAM50ZgPQRQIIcswKuPT4KIZgPQDcCmBRfDMEsCmH58EsPwMQcgsg/AzByBZAmh+OQK6MBHJwUR6JQngUQtNS8A0gQxWEMFUXhWGIJqstdAXxqA/OhFEpCbhFFINxKHoLITRurDMzEccgCSAay0RQMQSQxHIRwMcSmuhWnSk+3bq25e1F74jj0ZkLMJInFoOVIDdaFZCr3wQQFcHbqlCYunx2zKW5alRtXVYxRpxHHojo0J9mG7pu6IKU6lXnRSnDM66zQkLVSORq1K33ys1OqTNSFqknRiOB+nNxWpYl7NizylmQko5Pkr5SZicYhFTuszNiSladavdZj9K6LQiiVOfDErYlJCpNWIzRuszqMjNV6cSsxmlFbFCjO7FSdSpXVrchSs25GTsxad068UrWIlNTUtM3U76taUoVL7d3QsWbpOfOtXXz51izfOmbVipH61WpOm4iloiqReD06tCti10J1C3E5uzz5GOVpKRtXVpKDdCdzdqKUI1TvmLV0lYun27+d3X17fOtz5u++bhHOqTqt1mWtz7NunKyVmNSFC3Wur30brExHZ98vPnyliHbNO63fM2qUxSk6VihKSFaRlLMrJVu6dfdPnWq9SPTcMR6tN2rchJxDKQ7CGzDEF4rIc+H5KZk6dSRlJGxTtXVp1mrYmopAKY1HIBHHYpFa8G4/N32J1q6zQurUrFK+zWmJ19KYm5KDcAdoz+Uvm7dChI1qluWgNQ7IQLwVW4giKtbm77NahSqyU1Zpzp3Fas1DcOWr7cjGq8+rZkZ10UtzUjVjsJrEWszNKfXhFXiK1Oq169C3OkYlRlZulMQzWhJA9Ecck5mSjsdkInIycVjs+ap16crUkIiisC2DUZj8pBBUhaJxOlH4flI5DUILcDMFsApilaLWoJJTm7EShLIQtD8KRBZrzoTRyPwLwig7ArlbNibl4JIPTcBbKQRU4LeG6kRVpGvFKluPQN0K01ITPZkLFunLSsnOo24/JxW3Rm4grzUSt0bMjSm7UHoLYCCEclbhFE4egFs6A3AHEaiOBiEk+AaSkBnCaCeJQUQ/EUHIFsMQfoQRQV07EnJQIbUTk68nM2q81Qny0WmJ8zEpirHYfnUbFCXo1ZKPwinwcoTFqRsxOjBVBuCCKx+pYnwAoh6AXTcAfgsox6HpKBHHY3LyFe+QoT6c+3KQpJzpKGq10zZr0OrOvoydnjsXrQdikxJW6li6+dMUqcxSrzdGxZo1YS8pBZB6AW3wTwC6GYEFWpdUtXW775qYlIzEUrGKU1Wi9i1JQkn07c1ar3x63H5SrZty8amIrOtzccm7dqfXi1aZqycSjM+Bqa61eJQvVvmZaXheIYSUILwnikJo1BRSjEnBPHqszCLhNCkOw5HIGLMByEMA3ZjcOQGUR0Ihgsh6CKO2o9Cs1CWPQmkYpAlmYQwTw5G4JoDVKCKCWA1CWBBapw7BBWnxmBTVgzCaFpivBTCWtAQRBBbMxaNWZaPQ7ADu1EdiEMPwMwgjcQQxKwJYRQBAhuWh2AmpxFCCBmCyAul4nEcAhrUrUci8doQbmIUq0LMnBNPiOENOVtTEUs0bVKdKydaJ1IDCJQ3I0JuGas1Onz7FG7sW58bjcpGo7HZuAF8jC8PRjnzE3XqzdeQlI/TvmrqUMy01A9IT4WlopIW4Ulohj0FlS3F4B6bkakvbj98hQmI7Pic1amp9ulYi0O2q81fI2IrIWrdmQnSEhbi9WKRSQiVS1E4hkI5Sj8pMwXkKk+Ts1JmZgEMtBbOqX2qEz0ZS66QnyN11CrOk4pXjkeq2LFC3Iw/BexMUa9G6Qp91e+xL26cXi0laqUbVO1ffTrU7pClNVZSZm4SwI60WjcII5Sh2CudWuo168dh2lNT58rHZuE1uAbnyE1Ce/kZ/UloYowzRmYlC1G6hZ7uzd17r599CfHobiKZvpVr77cj9C1NR+bis6dDUYqxOdXvgoheWtWJCZtUb5GTm6cSun0rUnGonFbVSQil0fujlKpLUOrOqTqE6vF4ZukLrMpWvlrFGfZrxSQ59rnyFi3btcpBeHrVufO77Fad86zVlpG1dQm7V1urE6fNz++fMz7587m7Xbn0qdKtIyHYtz7du3PkqEpNzrFiJ2piWgpiUlV4/SrVJOhXl+1QodeZo07rXZtUqXF7duzK3SE/tQnnz7cSp0Z19a3dbp3U77fR7F9ORo0J3TvtW7VinRqzUlZukL7ctMTXNQvGo/PpzEUny8GIpVgrvmpKC8Ym5qIbENXwmgxYgvZtX9mvJ8tPnc1Uo2ZCnNz6F1qtycpf3xybp3V6U+K2ufPs27M6jKWa03MylC+YqWKslKTE+/rTqs+R59ON0bp9q3YoV7NaCCPUK0RWenKz7qcFtqJSk3TlZqtDsCu+QugQ2ZeEEYmIN1bcSsw5TvulZ8nYh+Xr3dqvxDWszpKdNXVpq1bj/NSk1bo2qFij0Y/Rt2JGNQRUoVlJ8tIU6/MWqtW3OndO+3dOm6l9O6vQrWqM6jQtUKVu1Utd1ijQrUOtQkakrPh21HJaFIZqzoQzN0tCKD0lNxSnI04lPrS0ZtWqFu3Zlq910+tdOnTNC6bod9OZo0ak1dakL6VuSoTrElHbc+YodqOxBBZDHWvoS0clZGlQkJiVhDQoWYnG47KwJrMR2YrVuicCiI5qN1YF4GIWgCDaj8LQPwGUAooQGMVhaJSNKQjEBVOkZaI4Yhe6BNLWYnUtw9AzAVS1ePWb4JID8CyIZmEt0PwvbgGUCqfQtRBWheCWRmr5SZlItBX0p0fjNHh6O06U1Nxm6vC86VloPQTykQwWwLLUcp31rFexGJuVj8vSkqE3E7MtC3NxqhOilqGKdeVkL77VCJW60tH5W3H7qXWo17FKvZsUJSdWiGrbmKsbtzolVmJm1WhmUnTUJI1Eohj8Xn32rV3JTE3QiK3SnW5uLWo5MyEP99q3J3TVCfWjtG3ykfnzM6SqVaMYvnW6VShVp15uzQmpGnVnRqI5OKUoYpXTNipfRscjPvkovPj1iToStGxRo9C6xRjHIX/bkKN8lXsXzcfhqnIcbkZ8lR51e3z6dm3dRpSHJTro/OkKFGxat2JPmI1HJK6vFY3fAxYmaUfqRWBmjNR+YjdqDNGjVtx6C9alVg1fXsSl0zYq0LVmdRryV1C6+S6F19u1a5CxQ60zQr1qF1uj1pmdFbq06663PvszUn0r7N99edMW4tdN1a8jRo3Xc3QsVq9eVoyF1CNUZCrbvk5WfdbkLFGRpdrt0LduGYbsSdm6Ro3To7AzEcH50pGZON2o/Plac6APxDGadqTnTrNGbukLpuLxHB6xL2L4B6CS6lDkKQYq3zM1Vm6UvIzVm3bqzrd9mjFZmfXszHXqS8VukbVmpZupVKk1KQ1BTFIlUikKQGo3CWjYukLd1GbrwvNx+r2L5uhNyFaPyV19G6jLVJSMTUvNROapc3IRFUjdG3Pp3V7p18jKRS+rfZ7rc+6vF4L1IlNwlhW6dQqwXtwYnzUOz69ipTqR2LQMwngQ1YLLpihfHoOwfgSQdgGUByAUzMzD8Sh2PQHYZgPw/AKI7AFMzA5AHqlifAduoyMlAvEELQxLWKkvSjkMR6ZrR6vVgrnwYmIC6Brl5CQqzMcl4rHpu3GovAdtVp06x26cZj9brQOS1KJ05GhTlrcK26MMQQyEA5QjtaWiUfgNQEMzDFODNadTloEURUpaBuOQvAZRyA9BbCKMQWRuNUZu+jarzEB+Ho9ToW5SWlJavNT4zXl7Mfk47dUlJmQvjdCJzdS6TvnS0bgKYAqgL4AQoPR6VrcLRibjkIonIUZW3QsXUZDpV5e6hSm518jB6rP5919KdOs2750vOn9Sbmb5mpVhPAhhHBVaswRQZgBNgzLQJYrZnQkt32KUbmZahRupzVe+aharN1aVerIw1HJWbiKlDFaXn1LFGZm59iSlJq+bj9eOTMVoW75CAtgBVGJ8hGYigYm4TXQrZj0YgqsSVKXoRHG5WbkYghDCsJq0GZqUjMF4QS1eRhmRh+EMBhAAHgUwDWA9EpSFY/QnwC2IYvEcxQikJYXnR6XlKNaKwEVGAt4zFKkFcEErAqnR2IbqN0JoBPHYVmJKIoFcIISxKjGoDclZvka1K1GaNuNQCKPRDWukYAngG4UkIlAggACVoGYGYBXBDAEVaEtmG6U+ThJJydWFOvOkZOI4PQCeKRmF4ENSajMORmtyV8UrWe6M1JWPXQcrWp3bnSMLzq3Q59aVicxDN1SrEUTmIfg7FIlSmIWjUD8Yg/fXqyNifRvn0r4Wk5iYmpqD1ijMRBARRWNSUlEFeNUIjnxiTvmK1GMT5Hs14hkpuQhyUmZ1SaqTVGzUo1JKRs8et0ZK1ZmI9ErdGdWladmXrx2hM2K8LzUJqcW4lz68hXkb6EhfRqX1ZWVtzdinYg9HYWl4HO6fHoL0onT51q6+v2aFu3KU43MV6V98hTlp9GtJTU3TrQpC8Qw5E7ULUojgbm4JKcOT4Lw9BPbtzqVexOpS0O0a8LwpSj8vAOzp3TqRPn2pmtZt1p1/3z+nOtR+Fa0XtVuzbnQPRmjdToTdWlPrRWJTN8vdUr0LpqJRqRg1UmoSwMUaN3Q4lNRebqRKhZnXRqB+ZjvysWuoULViUsTU6h3c+jQvilOXtRaHZGFr5SvN2pOKTfSmqEpdZpTFeK30bVufZ51TtXVLVutSl4flacdi0rfVp0+hVvoVrpG3bmp1q3br0JKnPusUbr7c6lXpUKPHubrzN8KQ3GoMUJOxH6Efm5KMzVS+bmbqt0xfXoWb+1IUKEnQnWbXdPt2asU6cjVt0uWo07pCdRszr+6dN/RoTcRx63Z6N9utdMxOjdPkb583Ix+3CslSnV7fJUo1M0JCjfClK1dGZ0brStO+nNW5CLy86JWaPAxOnWLczBvm6Efo06cvWvnULM+zH5SJUIrOo14lb4LxFN1oXpzUzdKwbm45FoMVYG4TXzd99iZvpSNaKTMZjcjEqsJ6MKzEcikE9aHJOHIvDEhBqakpqNSUzJzoViOHYpdF43JzEdh+AkjlOYpTUENGCmDERUobl4J6EJZKIeSpxm1EVGbp3Vq83dXnVo7dfYtdubrUK8+3IWY7fCvPt2IORyDMZvhe+IqkrNT58+jYutWrVWzUil/dRod3dWpX2qF1G+jd259OdWsRKvVm5atN3wzH4E8PwP14QWIQRSWvr3VaEM1Y1SoUpuhVqTvs0Kl9mtOtXTrVmSm49J05uRqUq0pWs2503ZoWrFe3Cstbjt/G6cL3SNGlFL+JULM+jNVYjm5e3bnwGpCrNxqhHZqamo5bikRRSrOr8zFIggSQRwA8gXvgqlYrEEFsEkvAphJLQWU4PTNGMQajdCZjsPwTR+bowehBwBVAFleLS0pCSYhBRjE1bsw/akIWkqMRRmJTMDsXiKdM3y8em4lPnQxStT4QR6K1pWjTloZgWzF0AL4AziKAPwkidCI4KYVn8WlKV066Tm43PozXEN1KOzEcqQW3x2PRSBq+3L3wpdXutU519aXmJerJSNWMxiIJGXk6URylSJWKU+HpizfY4eh2DEVmotH50+3I1ZqfG6ElLQ7E6s1SheGL4GJqrEohvqScc4xHpGORWfLwXs3xWWtykrZlaEUn9O+UtzpKMTrNuQvkLq9SO1JSxRheH5uvJT76FOnIyd01I0ZXo1qlfuoVqc6J169GzFp0+3OnX1JqJWoXunT6NjiU+bupUO3aoz51WrPkOPzpC3FLVq61zdqdHasGLcvFIpCtOnF4emYXisVj986DctOswvI2b5WSrx2vClmYhHErqXFu6Slq8K159KvboTuddfdPszcbq2rUMzfXilepIz4xfJW7rqNatbqX0qN9exapX3V5SnWrxPrVJuSoUq1Oblq9OR4ihqO2p1OjQozrNS6db6FDoWr77rV1CYiCE10QycFMrJRa3CsegxAdpwrXswki8QxiIqFeHJaCy3amZKvE7Fmfa7U+alZ8zBybh2NwOR2Es3J1IrasUealbMxN0bVahYv76tGf3ROnJSU66vH58nd8R2Yas316l0VlrE+xNSshSlo/HINzUvdNwrbtW7E+6takKcSvk59i3SrzFC1JR2LyFm+3Qn1L60+6+vdddOlIxTkqfAxBD0Z1uddWhqE8VsR+hdTikL2rovA1F7oF4xSj1mzGKMG45COH+NSEPxmFJqB+AbgqhDAGMKwZgngYgekZGzXl6UzzVqJRHFYlUgFNCNUIvGonHq8QVo7DU6ElOpC0pEcpSvhHApichOgeoWbczEEFMKxBbhWrHZWYitKThPdBqI4zBTCGIYDcCqHYKonByDkBBPistDEBPAEkLxuB+PTcVl4pdYjsB6SgehmBHAthWAJYNVuBqDMQQIoWjUBBAhiKAPVIJozEUxD0Zl58aoTMlMS918FtCEUahyOWpKzHq1qr16PX5eailK6JSkUhBFIEMJ5aBqVhuCSFoXj8Sjs6EMvH4Yl5qxEUhMXSNOXg3BqakbNC6dbn0ZedZt15qRrR6tJz7FW+fQnx+VsUpizJ2odjMCqMQTQvHYBJA3IXV5SxEr4TUJ0cl5edVtTq9S3dSnXT68jSumZ1SO04lAtsyMdgdp0r7dqN2qlaQukbEbqSV0TjcDkNQHLqEzIyVKpClexfHOUl4DUF4TU6UnbrQzUmoTQH4ZqydCbg1ByBVbo1ZiB2AaQBTBRLQSQjgE0tCarffamYWiOrSpczJSl8C8bisNQGME8G49H5uCuhDcciGXj90D8dj8BhGqMH6MGYchyTqROO2oxTg7L2rE6PQpQoUoXr3R6Sur26UjbitWBmAps24KY1PhSTgzHIYj8IJ9GxZn1LHOjPKTNiNwIpKEcLy8A/IXUpKE9SBuZs07p9O+rIUpu3M0q8M2K86hJS0pGZuCqGIEsSqdONT7EpWlKEfhWHovA5RvutUpOhCGLQgmYgk4TTUPQvJysI5C6C2EsDUWmYxK3UKEIoEFiKU4zF4DV1qbiGfTikIKENz5GxH58M2rrM6Tg5KQtH5qtLcMXSMlDVSHZKvPnSfWt1InSmYUoVZO63YikjSkZe+TtRSXmZuO1LVq1UncnTh+fAep1b7uvMRWtHOfPt2rq9O6xITFSdOoWrFifbm6FGKxDXjE6pK0YvAtg5NS8LycJ+rVmYA9NV69mrTmJaBi+CyTgYrzXYmb45COfWnTqUp0uxOkLrdqjZn1Z9unbisvBbJyNaHLfZnX0bVK3Xr1LqVGnCkrJS9C1PukY/Tk6UhTtWa8el5iPx2XhaIJOJwXtQDcjagam5i+66+jSnSF9mhYoUbdqhTo2o5BihClSNS03HIF4/fJ2rpO+K1erLzcRxiE8jBiDkLysUum4za5mrSiVurdfbkrdqKTrr69G6zfddNQZ61mzdf3dmxfTo0LViWpSd9unI2acVj9aYr15ufbtWLrEaty9GPQtLwrHpKdPrXxa+fIzpCfN2bV1W3faoX2KF9K3ajtu6PUrff32brVC6hTunTqHZrV5111fsWpSxZrzpeQoSFCZv7d83QoWpqxT5Cbn2pqfQsTUlas1aturNUp1CGKNW+zSp3XWq9WvK31OrVnVrEl3Wpi1HKFetZsyFe6tVkaklVtc+rfH7rElyEK1K9u3D8T4GpGV5edVnV4xWvr1pqlRsSdmYmIrM3cTtXWJu7oRm+63FOPzcarzM+tWo9q61Q4rTnSU6PzE+CqPUKdaas0KV9ehQqW6UO1L+1Ovrxu1PtXX81Vs3Tp3Mxian8RWKM+xPsV45NxSTlKMhJcrYs0rdqdKT76E6xWtUrqF1qfMWpCtLUolNWZ0L0rUjQqx+3F681YulLUe5OrfR5aK3UbV1WSkqFq6vOqw7ZnTr6N1CjZrz7rNqhDkhIWZCjd1rdKj8tAajNixH6d9iH506pKUIlI1oTW7onXg1RnRKSowvQm5uDcEMPyU7tVq9GI7cdkKEjUgpkLNO+GKcJ5u3KRazCTk4DCRqwZkpWdCSzNwhgplIM1puBZJQWxOZm5CIa0NzMGZCRnS0CWXqQtWo14YkLEvIx6Nw7DsEkDsGLrrp9unLWpS6DEKzoikqlevOtW4ekLp0zQtScJ4DGGoR0IHJKB+1IxuRj8pLReOy8K3WrojiGYul4jjUPXTqPSt307dq1RtxPvkOOWb7PTnUrotPtS9itVnzNSEVOvUhezJWqF10xNU4xUusxynRlKNeNz5G+Hp0K0591863fDsnFLqE3TtzpKXm5/Bi1L14xSvkpOfYlJ98dpTcjbryVm1NyNKQqV75inIzFqxYn0Lp8WoW610+jz51ahTodqRnWp9CQrxyR77uXs07r5GNWq1m1JxOQp1Z9GJXSsrZn9qtWvrxyhPkaE1YrduzPoxKJVJCvbtyFavPvtx6vEo1KzMD1SF6V8zG7Enaj1OWpX2Kc6BiFotYgTQLxOXhJDkB+fQ61u1am7F9CzRn32OfYr3zq8zRk4pdTp0bVadfdfRo1ZGJyduhZryU1dRtWZC3yUUoydvtWqU6vNWLd86xQoSfS+fatT7VGRh63bpX0Z1q6fUpwzSn17EH4ch6xB6AVQCSAfjMG4cowUwjj8PULdSVgvBbFoFXBHDUX6k1Ss277M+vUmJ0++RusQZg7Pvs06N0+1ZiU1D9WlHoUkLrd/VrzpadNSEzF7HMzM+MUoBy6+favgzJRWvJUp8hSicCW1ButAMpiIZ0CuRjE+U4v2qNrukLqE+pQt0bU3fOoVIaoQXk7dC1burzql9bn27d199m6dOsUOh8++hamK10J51WrQikvM05ibpVo7PsVacJ5jt0ZW3ZiUbgxZisJpuAigprQ9H45WiOF4jsVasdox+fGa0fmorCGEcC8FERTo1C0RwGoRQG5uGZ0VheK3waj0XhifZuil0FkeikXi1elUrRHQs0aV0GIDstH5eKVJapEUCCdUt0J0Q2Igh+DcEcD0BurIRyH47FbMKSEjP45CWlboR/geiUMwvTmYMQrBJXgZl4pG6tWJUL7E+xAsjtSxMwtJ3Xx2HZS6fK9GZvrU61erFqsnPkJW+DvCkf5Wbi1qFYigbgjvis6YoQJoZl4KYF4Ug7YozV1SrSuoydClIzpKfbn2JmhbmJqRuiKVhqP0oz1oekqN1KMSEXiGxZsTN18WrX3ToMwzBXdXm4Vo05C3Iz5OZlLMrZsUpuRjvHZezQmJWOxHwrLx2pTjczKxqnI27oLYBZXnSMbqU4fgzGaMjStyte3J2LF0VlacTmroxQt3Q5GI5AOT4TQrBylMzELyEJ6spRj8pB2Yl7U3NQ7NwIpWBeAbgKohnV4/AMYCiNQ/NQhmYRw9IwpAOTVSZpwURiZhDPjFeMwtA5fB61DFWD9WI7NqrDlSL1IZiGDMAPIHYCiAlhiC26TkJaKT4NQ1Sj0tOj0drw9Vpwhpw7Vj8tb6NafAG8LwFcDcAbRiDEnFb4GopApiGAQQWQHK0hM8JqE3Qj8dnwBPG69Pk7MpI3UpmvLV776/JxOaoR+dXmJuP24zVkJqnUg/JQksy0G4vFKcVo0asDsCupF4tEMDEMWIVmrNGhKylmhE4NS8bo0rVCXgFchdJ0aMrHIdt3wvCSBmA9GYlXjU747bhLFZqXk769K+tMy9edBePxBHZKYiGF6lid1Z1WjOs1JO+xLW4nMRqZi18vdFbUhSuurQxCToTpm6PU6c3FqVGKx6xJUJ/UowpHYciKDlq6zOr0bc+GICeNQliVOaiUxam7r49UhirGPtUa3ZqRyBq1EM63HICixA1KVIjgR3QGoWg3ShNWkL4SUIEEPwmvj91CFYKIzA7Xj9OYiXGIlWp0Zq+dZundHpVIdhqxM2rd0LUa8G+LxHC8TqRWjJd101ErUhZpWL6cKRy+JwpF7uf2pmjQj101anRuTis18tWiliam4hgtgNxutT4enR2BmlJwUQTWZqzMxenL8DNatHoLycpa5uDMrG4valZmHrN1qCu3AbjlS+tHr6tKH4lCaVmLFiUnykav7rM6f3dSxHpOStW7rFajG59mhM2rdqdfLXU6UhZuloFEYilG3dOs0ZOpQumJuhQo2a8FMFsnI3WbF9OjVnyE3dTun1bUlbq2b6c1Ys17619ahQkK1e6avq2qNC1apTr77+ldSpWa186xGoRVp9OhXoS8tQt3xSzPoUa9u+6QtWqE1Zl6tiOzMhMx2fN2pCKUqE+jWladuQi91DozNSTsW6kft0KslBiVqTpa1OsQZiOEcciUKVZPsTVqnC9GZtzqNeK1pKpPuk68JJqQqQrZvkq93fdH6VGNyEKV4/wrfTr0ZC3LTEMT5GrOjlC6zJ1ePRBErpqT50ekI5MSkjWsX1KNahLVbMhRtRHYsyM1dfIS1CfbryM+xMXXWpqhRtWOdfRoXVq1uxSo2o3Wj8TmJKOxiYmqM+akr+TkaE63HrUTj03Wn91qlatzqE1NTrczMSdqUnU5q6Kc3S5WQjdrs2KEcmro7CGMQWwZumqNCpbtT+Xuj1OhIfZhadL9SrGZC3fGI3dOj0LR+FIzN1pmZoyXSoQmkbVbrVp0tNSdGJ3z+dYpUZefSsyUnf0pGNWZ0QS0hVoVZ9CvH45WqWpCOzEQxKjOlo9MR2pJzE6LRypPiKAkiKG7oEUEUSpT4DCCCIOBBUisJYC6bjs3LwtEdOLx2OwmisFViGpu+jDUO3QlgshqQiGRgrgjjUvDknBTAZxyBFHpqMzcQxu+pGYxD9K+WsSUetRKQsWYjjklAtj91Tgdicci0BuBRxiDUTrxBXvr2q1ubiOOx2xZgPWLMSjtOhan2aEl1KsKRu6ajlKrHZ9SJW58xZmrudffxidbmpitWtQXhinPiOlIzc1CkfkorarU4lVnS0QSE+tPhyZpw1Qvi06arxeFbMnHIXkKcBqNzMTiKvZiO3JWYWvrTdWXkaM+Yk7oxFK91OUl5OTiVWQnTcrzMzEqlmvfQo1bVGdIR2fKR+fU6VuQoV7HQnVL5upHaMxLUbMzKR7vmrUQxDZlZaFJGxHo7VmfhPEolSha1NcjI15qbpXzV0zGoJ5uZrT7MpdRkKEagZvh+bhqUmKliFY7XtQZgej/JU5KDU3ZisegZlbcLTEFcZoWpWlYj0dl4lZn/OnULq03Tp2q9mSsytSdZmYWoz7cToWrMtCtm1PoR+rOpTdCpPk4rSo8+61aukKMtbpWKU6fGLFnt2q0zOicWoReHbcvLzqNCWsRSjdLU5uvTnRaDVq6biVSIpOT6VWlbgIYTQmgWwngxAWQbjVCAjgkgrgPUY/Uj98RzMYgH45Ho1Iy8ZmLVi3PuoVbp9ujOtTqNOWoT6c1C8EtKrT7UjfalY7dC0pZtScUgMYnBedbvpToavpde61KQtZpxqAdoWKcWn2ZSL2Y5Rup0Z9edQq1qM3MU7Mbuma1GP8x1ZandSnTrdiv1r7XQtT+7r2Z9W6amoRQGpqE8UozqdmdFJm6jVt2LcrXkKML2aV3Yt2rq01FakIY5BqEUBbFJCK0Kdi+F5q6MWq1SNys3CeTm4DUagdowvJQHYDcvzMhVnQHIJ4B26BeCaA3PgYl5WI4UgN2IxKRKnNc+zRtWrU6Lx2pSoSfatRy3GrXGpeWiOjNUJu+fIz4rKROIYlEqUIZ8jUj1KtTlK8J5mtFIK7oG49DcWhFfJQtCevHJGTmqlKIYvBmfXgVysBZLTEIoej8ckYesV6s3I1503IRyXm5mta5qQite1PtV5GE8W5anAI4pD0cjkrZhWzTkpOHIrF7duxbjUFdCWs1q1WhbrRWjD03DEpEp8L31qE6xI0YnQk74zUkrc6z2IPRBZh6GJ0CSLzoOwRStO+rUmLcSt1LNqQs0KVabrXVqdWrRlqsjVhWUjc1CarC8vFataXqWalKE8xFJqL16tiOSsLS0NzqtivdWm75GbtX2LUtD81KSEEkIJmNzp9KamL4Eklag3xylMR+TkqVWlAUwvCludD8HpejJwIJCBqXjk6I4O0IOwBfXmIhgBjDEAcxmBDOgdiUE0OwrRry1KD8BqFaMQ24Ygejt8EsAghWALYEUAjgJ4D8BFNQfmoZhBVm4E9eHJCvBFFoehaxF4pRulZWNSdinH4tLykUiKrN2JqG49MWqkPRK1EUAW047btzrpCMxWMxuLytmLWoQxqYvs3dCSnROFrdS3OsXzVSZjcO3WZKP33TcKTqMDFmJwmhaOScPw3LQJoim5mPwZtTqlCbq1acEU1M0oOUuUmr6URykvB+1DEQwnjEF60I6tKhUkoZhLJUoHY9YqQxLyl1ivFq9iMzElbsSEtC8hWvpULEnz7UToVJOZpR2HJ1XvvpUOdZqX0oNXTFSzNS0hFJ1mvNz5qnfHINy0VtVZqLRSBXPhLblakD10AhtwGUdg9HID0YikHoijkc/o31bEvM315qI4nXpzMWgtgzbgWU5C+pC0RQOwdlYCGYgrmYasx6JxyE0ThaDk6jTgNQhjNihEp1qUswSwEcBndKQ7BJNQPTcWloK5mUtVbFuXnzrFq+JWbcPyN8Wvsz+hbum5mdXgagEc1BuzG5WXkJWjzopbiPnWLd9u6+dSvt269ShHIGOpNzMlLTogisMx2ElCRhqhHIvCKDUI4TQ5DUbm4rYp0JG+6xahuxfJ2ZG3N261WUpXTohgtkKMK3RmIoA7EunCexOsRWJ1oxAtn1IKoihWL1LNSVozPfZpzp9Glb7U6dap9/Pvm69GQrRmE1CpOszM7pT6FOxWqzr6knZvmqVetCsWqWak6das1LFGjRsWK1Gha63atWLF1OjfdWvpXzF86ddOuq3SV1qaikXsy8zNyc1O7p0zaszp9Sj1b599CtYuqXTuTsW5KxfVrWqNOdRvjtelLzdqTnTMf7rNuZlLpubnTrd1C1KXyUSl7NLilezWis+P0LE+rWjUNxe/jnN0pW+6fbtWJGhZtT7p1mxOtz6NCn27dqjIz7dWdTvsSd11G1Vry8hb5OdYsyN98dj9irNSlCbt1aV1O1f32YVm7rc3Puk69i7sz61irJTcYmuRl5ulYnTM3at0L76M3SnzrdufOtT7FelfOukpOxPiHm7dKOUJ8WrTUJo1IysMS8+3Oj9C6tYoVOd0JKxOmIfkbV9ij1olOlKlGpYkKNaxXloWkIijduPSsDsI68rSqc6lStXU77Vebo0b6c3Ot3Stetx2tVi9u10o5ITVulNXTq0+tXj9K1YjFi3RryFHjdPun0LpWO07VqhfXnQ5zNW3zV0JYtavs81Oh6Rn1761aPQ9Xkp8zYkZCEkvRq2q/fMx6+ByYkr6cfr1JiG4rE7UfsXTMWhSVlYzUkIN8Tg5Kw9VilCDUtD8H4glZqfZkKd0fiklYoWZ8M25W6Qu7N8tDFmWkrohhPCKDMlPi01MxDdAxNwlh2lNxFdDc3EcxL2YG5m1RsVoVr2KN86ZmqtOlNR6fXkbc6lap27dOtYjs13T76Fmbm69m3dWtS9q6nZvi10K143ZmKEXumLVuxdG7d0F503bmovYo0o7LxuLS1KxVpVLVqKXycrdLwzQi0IL4F7ufXmJupHLEUum53N0Zrs2bVCxG6NjtzNSdM9uv1LFCSoX8xfFKUvKT+1SsVKVOrOpUbcza+aitC6ZqzrdqRk4dkKVShHI9YoSsjQszqcTlotXn1JuWikrOrTc3OmaUHYXqy8L2YdnwUTEEUQxaOQPx6IaUxPicxKwrBivaq3yc1HpaVr2InQhurNR6LxKpPn2YUoVq1u+P1uRszcMXW6s1P+buqTdnmJGDUhXo26VKpfYukbdqKXR6jfSmakKSF1q3fdddVumbcKU4vNTuTnS9mtEpqrajNCzXo39WanT6VSTlK8vLUqdqdLVrErIUaED1eQgch2BRdNyVeG7HDMTjUM1L58HIDGhTpW4AM4FMAAuDUARwCKzah+NWoei0DtOEENQBNDED8FUMxFCCtL0LVqSt2qFm1J1aFerytqxUpXxeTkq1CSh2ZjV8hbsWbFjv5CPU5uhUr2pCjThiThDJUYrM1K9OjIzpadZszVm+rIULdadfUlqFS1N0JCxSvpWLNm6akLrd1KIohry1mKQepSE1ydOdPl5OBivW5OtTvrz5ejJWpudZik6vVqV4ei9uxWlpGJSVWATRBAhg7HYHpiZj0vEULRFRtzd9qffdRmYfkK8TnQL077NSjdW50rEoGLMMwS31oWgng3BJB6BeCW+OyE3H6NuNwrMzMzRr2KFGnI3X3SshRkal3dUvkbd9qvYnXSFerasw1VlKEckoih2aszERyUfsQvB2dFI9QiU+fH4NWoNwVxKEcFU1B2PRmdFqsCiavlYQwH741DFe1OsX1J1WvIfTm76F1mfNzr5udZ59GRhetVmpK3Gbrc+VkYjuqxuA5MxvusSV8SpVZChFKtSLwtNytGDkAcyN10ehefGJKjKyFKKTdSFp0xHZCzSgitw3BRAbnV6cnCl03Rp2pW3aoy8+tarykLWaE1Vvq25ihfUhmpTtxKvBHGIDGvQikxOsS9OjLTcjZrTERS0vLUYhjM1bm7VuLWp8xPjsRzUKTFK1Xs3RyWikC8ej0flI/TiVGzFo9Bi3XrTUnHbcP07oDOBuCyzKRDHb6knPnSFS1J0Y9WkY5EUfg3ahJVj9eAIo5KTUDEVg7CSAWScXmYKad8+EkQU5SAYR+FYCKE98LwtAJ4rCWLSsnNxKKW6l9OHYNV5GVm7pKCyBiJytWRg9BPSqUIWgjg3Yh+VhqFYEELQGVCEtO+YpXS0rDEQ9qzdL2/mJOPW4Lxrjk3ZmZ8+6xPo2KV9ixNVopOs9WORKMwYq2qduFJCxblYJKEO2YGro3MXwpGIEE1ByBHDEYloLyURwrC8QRSrJ1ZipC9WMykMzEKStniKlwrIQtBubg/ToxDdYupw3NzVKhWgvMVa0lbhNdFZulZqysUsUrN01J2p1idfLVJ8zWk4zM0p0Ts1J0+Urz5SxXvo06kRQnoVZGrJVrMYvjdqhKXycEPDNahTmoxH4LwLYrZmJe+JVuxGrcfqwpLRHPhavAEOH4G5eA3ThSFIHJmBLBPAjlorGoFsciKVgG43LXQOx+E1KZiludJUID1KBJHoBHLxu7k4atRmzDERwajUPV69qQsU5KzOnTUnVtTqFKMQtBeRtW5KxN3W7pGdNzduKRDRicMzEHIDl06ddP74tQmZC+buj0LXUOdakJ8nQma8Wk45xq6Qi1iLwljsbj0vKRFJyUldE4Lycel6kXmIlQpVYcm4HpqzCkIfvi8RQ9IQxRqQXmr4OUYI50AdtxOzAP16lavHIVmIUnwJ4ViUvKwOT6EStWK11WlPo0JeEtifaoSH241RnRufdMW4YmLMnQs15/ffSlrpCZvo1O1fPsWJSKyUpNSNunQpROxHbU+6vapW776tSlfYutz6M7vp9KlQnWp3Z7NS3dGpqZi8L2o1bkLdGzJX0KsjPlb59uzaoSMdunUrr7dafbqxHG5TrROfOuj9KF+Hp8NzXd9K1Mydi+PRyKx2Es1EdeJ3c+TjsPSMK0J0zajchEEQ1ojn2rUG61CRjl8X6tCnZ6dObp1rU+fbrWbEvZur3XWbFqhPvsTupRnX0rcj2bFOvdfJfbhedEFmRnWZa6Jw9ddEFmXm4pK0JS+6fKTqc+rYvs30Yj5mXvm5KQtVJm1C9u+lNWbrd0++vSn8+Znduxbs16901NwvfOvmaMWnT+nNReHa0XidKMy06GoSwftRSXozU+RqTU+KUIzXqTN9unKS0zMy9uFOKUbVmrM1LUI6UKQIJClN1LVSxOoTr683Po276cpZoVp9nuq2KFmxbnV7q1GF4/ITExUkbMhf2LcrNTUWmLU6rfNSU63LWqfG6Va3Edi+dHKFqXiGnDUEEIIji1GHqFunCC1FYdh63IwXjN8Xloij8H5CH5qOS8RT5CYh2YkLVWWhHDEbowxNQfj1iLxHTnTcZkrFuRrQzdLS8CqrwvB2pH4O07EFcCebgtnSEThqGasUmqcfrXVYOQ5fYvqWI/VpTc1bp25q6H5CxShaMwki8AeiUzF6MEcnJQSU4vFY3WnXW4rH5WnNzpqYtR23Lx6Pz7M6dSmKtmpK3xy1K15mnL1aE3SkpOvNzoUowasV5i6dRiUJr69qF4vZoyNmMxFF4tHJKSi9mvbhevbk5unPg7CCO3wtVrSkpMS0n250hUr26c61MzcLyM1IxHFad1WKXWIlIUZ8pZrWaFHnT7c66hLWrF11mvat2aVKddKy1q3076PI2LqFqlPkYvX76MlUrQ7PjkEt8BFPsWJujPtxSdM315eBmOwlk6lizF5mboWI3OgXnQ9Pi86dHbu+P2YlTkaPVk4LI5KwOSMYhiBDB+lQhSENuvK04/AaowrWgel4fqzUZvhSfw3dOqXT4ViOzRiKxN149OiVmpC8C863IdeZpStKjNW5OdFrVaMXUrd1ux3zFGjNw/PhSWqfTpVpeDcx1pSJwWx+AUQhrV5CNXU77ro/XrQ1HqFKI7FqfdUoQatRyrC01aoR+1DN9mvE+nOrXWaEB6H5aADWBRBVIX3W4tCONS8CSShNAooc+z86db6UxTmoAnhBC0AGsLQE0LS8BqDcMwMQzfBeOzpOLw9Po324agVzrr7devOoU50ShLYiC1UgtsSUL3058pTsTqsnOk59SfOqUbpqC8zCSFYpIz5/J2o7BDWgesWOvPkbd0+vVjlq+ty18+hTitmRoWLMhK3U506SmbEDkNQvBmtdN3W+jOoTp9866nWnV+fRp2bVifNUpihHK0XmqF1StOgxOt05G1fOoyMRRKxBmFITSlWNT7MpWoyliG7EOQ7A7Ur1IDVq3blr4UjsWhJB2C2IoLwG4jicMxHLUI7TsWrd9KtZrULNOnC1CVtxWvRvj1rvtWZ0+3Zo2b583L2aFmnbtdqRsfPulorVloUmJ1O3L1anQgOQQQbiKGroF4LzMvH6UvQjcerxvoVYxatULUtUjcQU6HQgroTUJZ9CjdanX2ZC6hMXWp0hPsylXoRSI4HonZkrc13dqC8YgggZjM6MwMzcEseheEtiE8HoKIxCkQSdS3PumqNCzFKsnYiGhHbEBBFYOQYherLQZhJEoGoWgUQLz6UevlZi+3NV7d1uzOtWrUhZtzVaQoT603IS01JTNuLyMIJ8K3wkjUTqROnStyEzJQrYm4WmbdCNWZmfWvvtVJmhHpONTdfsSM1WjkWj8+NydaOQLYNRDZsR6XhqI6sYiOTic1Qgog7CWAusz5KIpejSnVIZuhJCeDMIK8QRHGrURRutFpuxwCaXgsmZS1D8+K2ZGxBbOhBA3AII3KV7o/HrMXhHDcxFJiMTV8Pwcqz+TgjgDardZrTETn1ac6EMNxBGqFvhuIrcOQaiClLQCuDsrAjgL7UKx+ShqDcnZkqU3RjMG4nENm61bkYYmoXvg3Si8tC/QkYQS8DEfnTVmNyMxD9mpBiOQrKRW6LReRiV1KFp0UnSF/TqSM1btwLZeB2FboQXS8xI15OF5SpXkIhrQggIZiPQUS91ulH7chXiCpDE6FYegTVpGCevI17UzB2BuSi0hE4lKRKdfNT5WNT7qdKYt16c6LTNeQkZijHZ3NTc6YsQNUZSYjUvYr1bU1bl6M++vfXp049VswRT4nGoNVYT0pO1BevCWQkacbmpGxB6Ym6MGrXP7VmpNRDBFalbVmnAzfJSMaun2pSdCeDMI4RxeGYAUzMAGkMSEOwH6FOOwbqQ9BeF+rVgnkoAYykfqQDdOMyVCFYaiUUupTVudNwbgmujEjI2OnFoSQTWJ1mzZlLEIpWpOrUOzTpxFVtWLNufPt315GIInbhWIqlmQiUUikzAlrwWxSF4KIAmvh6Kx6BuGp867it0QwehBBVCG3HoHpmhEcndH4D0txaEHEMTsUrd/Vr0qteABNdO6dCdOvt3zqt9iW6dLszM3PvujkboTc6GoAEVSlKz+hUnTp1CdVrW5KxSn9GdOum7F1aXl4pAAhvj8aqxep1rElWsxKfPtX0rc66ffdfbszV06fAAfo2rVqpOn3XUOf2KlSxSupQpSt32+++6+jAAgt32+1Ppzu+1ar2u3N2ub5mPWIvUtULVujADS1NStCzdU69uffQjsO1YDkUs1oM3zF9WdI0ZC+fABvRsUbFW1QvkKUvVr1JOYs2p9jpXW7VizdX7EAN5OJWqVqhZtTUzSm7d9KxZiU6hIWJ19KjLX2puhAAtvmbUfrzVnvkq9edWo9qlYoVbcpS7d86jRtwAdWvtVZupYs33UZShdVt2Ld1P7EvZmqsdk4nADiRkZ1SvPvheKRO1ITrq0pfY5mWpXX0LFClTuqQAeUb77VizGY9K0KExfb4e5a63dRmpa3Ois66asQAPpStatxujM3TVSddRun0rdeSvn31+tVn9v4AHc6hQtzq0paoTpS+vZt0ZihKW6dKzFurZleSpwA0pT5SRoWotE6cUhSGqkXi8DFOUnQZgvDNuBmVhSFYbhSQkYADnC1CGL4PWYNR6Utwpao8NzqVSSn0J8Lz5/QqWp8ABWhQoyUTkLMWkrNufDN8SiVazYnWaPdYv7oFs+zAASi0jRtcciOtGY9augzIw7SqSsUs0KcvUk7VmtE7FGAAnGrdLtT68+KQpOn061edVjstOrSEzdRutWLdm3AAZqz5Stbt15qMy9GIZiarQjoTMK393CSdYviKvLW4AaW7FiMV5eWhBH4zHJuXmLMENWMzcE/YhSAriKMV4clb7EAEGdfZm+zFa1m1J26VaO2ZSal60bka0+RtVZ1KhYgAjSF9mtf2K9ilI2uzOm7VuYt0J0hXt2Z9itI3wAR7V8hbn051CnfPoUqlSzNRiatyNWjNR2atTUWkILIAJUSm4jlqVu3Wqx2NW6krXuj9WJxOhFqkr3VroZoUIAIdGEEIpKShaMQpa7NKrdDEKRurW5CUicUhSQis+tQugAdWq9SYoyclEq99voUbUrHL5GdLUJ/Hr4VpVKNuADu3zrFaKyPavis+SukevWo8Tp0Z91qdQtT6EACyhT7p9CdddSozuhIVLdizEqFKnJz6F1uWvtQAKaXZod19qzzq9Sz2rN83V6svdISdShW5GADiddO77NCxf32eXs0rc+dd2pmfdfOsWrMtAAokadm6nPnz7fZ58vEdGVnx7qTpW3bvt3V7VufP7qM6dIXV75idVgvGIekp01MQtHoKK18bisF5uQgMYvC19W3Qp0rFCZoxu6Hrde1d3RK/hmZqRStDd9qHK0PUrMBuXgarxDClK+tQo30rM+db77pmfXk7dSVvtXTrolXm+dfWmZ10VsS9u+rJQYlp1C6dbn3Qv2bU6xdPtz7F9G+dOvozrdCvbmbp0aheXhmtWpxHHoJI7asV5u1RoWb5WEsA7AogF01EEQxHNRFRmbMjHa91uQtxWBqpdTsScNTMegR1a0Ox6QnSl1WbtV681UiKKzc6+3Pm77r5CzEpibkYUp2YUj3LTUtNRiWiCpB61Cl9aJWKVupbtwOX8E8nLyUII3DkhGZ0cloYiU+JUbq0LxrmLVa+vYnydqavp26s6++RnW6tqtfMyUTgLIEEep0I7XtSM1Olo5Xhabn2Z9idZpVZ98J5iNWaVSagbqwblJOJUaXUkIIIWhuPzExK1pSzHrNWPxSdHoD0YtQfscjdPjcUozoWhqvFIK6EpLTdKpfOmY/RnU5aUj0hBmKRqSr3StGvKXz4YhmVic/meUkYxQheO1rcSm7UQRS1OnXSdaxSoU7MVrUIpLWZ83FY/WlonG7MQ2YILUzBPH+Mx2YtTrUehSjSpVb5iNVKsSnwXtydqZr0LEzWusydGtVozUMWrFeQvrRm1Xq0YrfXswtMw3RrTMrI2ZiGopWjsxfJWZ1ebnwVRiBDbhaWg7HLpmH7UASx6nKQtZnR6EUnAIpWvfBifJ2ZipCl9maj/F6czZi8jHb50lG6MnQhmrM83Ory9ihGpKCzjULQ7UhuNR6IIJLrclbkKFOtJ30InfJW7Vq3NXROYi8jCliTlYvL2aM/iU6PzcaglmoL33TN8fk60elogk60fiCQk41C0ejVeMz4F4erRepNSdfpWpSDEdikVjdiFYcjVChXk5aNUa/F50nfXoQYj9qtNU5a6G58OR6HI9MQpbiKGY9BNDN1eDURwnifE7NCGoYjsVgmgH4DKdE47IwblLUSm4Xjkb4nEoGZmxBuJwtPi8ekpWQi1CHaMBlDUSowHIDkbgZilKaoU7cHJSMQrTlZW1EEnAvRitSLzdKhIXVYfjkhBypUuupTdihbp2YNT5GTj86nOnyUUm5ntW6FDnx+QhSG6UzJQag5ZmZGzJWrNeOzFefWmZ1GhKTr5191Cf9OfUtUo9Eqt0zZrzp19GjfYqyk+1ISN8zfPt3WrviCajtebt3Td1qLRBKQB+St2o7Jx2jIVZe3I0L6NuxfZnXWJOhH6FC6JVr6Fu1apS8rOhW6ElCSvsULpuF5/EMByvCWSnQbilSK0JqdJ0bVrnWbE+f251G3X5CpHqUhH4bpQtUjNqfMWoiqQzCaOUp8vTs2alSvfbmenLTNeZt2+jJVqlGdWtxyhPm7onYnRDTkJKRq8egz2a1S3ddTo9mxffam6kUt2bFqtXunX2+hanTrrVmzdHrpK1zp86dZndmhQpc+1brXTqvzrFqMTdOStRBXmpCVtUpOfJxWnHK0tTr0JelZuiOaqQTToYo049dJQ7VhafdGa9SRmeM30LVOdSrwXl5LhW6OxSrNxHE77EzSr9q3Try8BuI7dGdLz59inXq0JGtaoQtSvm7pSjGIxSq05OIqM6hTn1ZqfUhaHLViTjUZj0F6tK3Wjcl0KlW1Q7rp3dUnTFudyknV6U6avv5ifFr6FONV4rZhS1EEbuk4hqchHYYq0K07sRzqW47K0IvVo15qSkqs+aviti++Ys2KE++zXp145M901JxipI1alCWtxSOxHahWtfbgtpT+Tn327rc66tddZupyN1mtTsc3b7M6l1L5CQutS0vQ+jVs9SQrWp9OrHolHadOhdJVZiJQ/wMzcLQmpwbvgjgxMQrAritmSgTw3DErBBSpRWEkShJWhPCkFcUm6VqTmpiOxSrPsWpm3QtzcpWvlrdGtNzqN8ft05uWszdKvPic1Zo16laZsVo7Wr1rEN2o9Zn17ctYl6lWdF5evbm5DiVCNx6PToOW6cMx+6YjsGaMeit9GfU4eg5CO6+zfdfblYSyMNUZm6LW7FCfJ2p9GfIVKF0coxKamKEpbmK9eJ1qFSZpSVmjVvmqEtNTMpxFVq2YnfGrMGbEUjkGLVeIo3HYbmYeqwVRePQlhiH7cT4/WmqfGovH5SP1rNqXtVJihKQRSVOPSVG6hJWe+3dG7UrHKclSuszU66tYrylqWlpa6+SjkxJxuUj861F5urKWZ1Klao3yNGzfOhFdBmTjMrJTFmDUrNVovN2qUnYpXQXjMemYUk4Zma18rbisB+Cy+GZGddC0nBXF4/D8CCMSUWlKl1OKx+J0qclUvk61ivWvpz5G6fMzqVOzXnUZinQt2rM63H69qpdE5uzHJuXnSFifbu6N07sTNaD9qLWpq+nQikjf9OxCWtDdWrTq0K9S1Yodmtaj9u+6+dYtyHDstBetMyPPsUrd8/r39Cv32LdudPr3SE1KTuar0Z/RmbpWK16EMV5ezTrd8+1ZrX81H58KR2tSs2qM+Y7FujxuYl6ESvk7d8pYt0JG1bs2bF8lXvlJTiVu+zQo0uzNx6TsWLc6hOpXT7dmOfKQnkoTyUUistKxSB6Cm1B6TmqEEdOtOsSFOYiViPRSFohi9qN045Ooz7VqdSsykR1IpTrwnhu+HIYheQk7dStZlqNeOWq9CdfYnT7MhVlolBy3WnUJqRmZ1iSt2bFmzQm4rOqX07FC3XtUO+1VvtWat8+ffapdqdXnWo/Bi3fIyVGvOhPDMJY1G5iE1q1PjkcmZmUlo3PtyMegOQFcMQakopZrx6QhNCeN1Jq+asRu6am6dajQpTMlGpmjWg9YozEVhNCOVq2IdvuictRsQIIAVzo9ajNGlStdSSsx2DsejU6J268eqQrD9GUtz4NR2KVqMzFognRKCmjTj1aBFBTFILYLYjpTEXr0Jubr2Zq+Zq1bVG1So1pqnOqw9KVpChZpzMpX47DEvHaduFJulRg/AvIUacCCPzEYiOzNV5Ca6198OQrAzAriOCaPwjlYcjUdsRHMV5qNRLj8Tg1VkZ1ihdOlY3QjNmRgvJUIMzoXhuahWHYjlYJIvfC3JT6MndYusX27+tKSFGQj9SnXo1ufG7511uvI1IVpWrdClA1Dsbt16sGKMam6kHoSTdqPSNCxQhSfNUL45PpwjkpWWhWMxWMQvGo1CWCmCWOxuXgigegKLMQwSxuPwLIYsQ3Qqx2PR6B++rPjczfb61Kbl7U+Yicfhq1zNCYiduIY9V4Zoysbs1q8jTujkxSqRaMXTpKOwZlbE+fMQdkIQS9GYgj4TUZuTiOOwPzcFklBytE61GWgxLzEvC18cmpaIaM3BBMzVeZvhHZoUKd9G6vVszpSxNcSoUrNa6Ny0G4ZhSLzVKOw3GKcHaUA7ZmLde3fZkp03Trx+Qj8zNR61Pm6NaailuFJenKwrEMvC8BlBuOwK69uRiGAdhBQhqrIzEXmpibk4KIdswllastEoRQXgZgTRSJ25ShG5CKxOSrW4/IxHFYKoO2I5Ttx2FrUIKde+dMzcaqRaLTNaKQmvjdilNQFNu66MxfvpVobkIRRa+XlI7CCbhyFYBLSpQ1EpuTilWFK/YkYvCkJ6VqCCII3COE0Th2rUgqpwvHodhiMwtEoMxOHYD0I4ASIZukpiGJenCsrQpSdivZtUbNGvRpTUSmZG1L27rdS3DV19u3QqWJG+atW758dgRyMtWj86JzpS6zddZoR6FaFWTn151qrCkUl58Lxbg3C8A9dFa8COTm6c13Uq8dha+1Fqlq1Pm58frykAij0jCk1bukZiS591qTo0JCnLXUbNqhboyMrQnzr7U/rSVKbmYMwvAxfdZvv76V9i1QkpaQiUFEHq0OUpufTs0bVCzfMwLYYhefTsUbMbox+1S5iZlKUP0IjrWLPbtdevHpuSq1OPz4VsT7rVO6+++zddKT7o3fOn0ZKMVb68+xPmJ8jF4XsTMnLystTj8+rVrxepYrXXR6pffVmI3YrQ3d2p86vTryda6FqVmTr3WLEvKTrdi+3bp17cOTp06hX7HWr26NuzTtWKk6hQu++dQmr77NmrQk7XzutdzNmffOo2bVKxSvvoW7FijKULrqs6QisPRKnfEqF8za5uMVrMpASQnjNCHIai86lfQsTdezRj9aQoSd1qzWs26tWzYrycdtQdj1edXvtWJirZo06cc4Ys27NaxTozUzKVeh3W7cxbh+rYt2qfz58vUozo1Pm58ejkI60+vNzNa/lrrdOdfbumexdGbp1GrzrPPn160/u7danM9iNSVWnQqwrKT7dildN0aV1KxdMWpm3YmaFW3OtU7pe3OtUuxNzdGxYrUJjhWxXjteYnTMfkq0+xVj0I5mMz5KFJCff39u6tPt9186dfdfddVn1693Oq0urboU7pqXr1p98cnxWlHK86vbs/Yo0YtOvmJKnKQxUhWdP74TStKBDI3ToYgJ5mQicKRqGIagDGxJxKKRSQg5AHEKQrG4xDUnByBPFZG+E0Ti1uIIUqV7VqfPjNujOus25uOy0lIz5rsx2+/vj0+Qjta1NXW7cdmLVaE8vM2pGPRSrVo0aVKO0pTjPSq14tQjkpFqcpXtWb6cC9K3HbczZtUq18ep2I9Or1qcfoxuIpqjdRmaE63UoX1rNuvbusz4/ErVq++Dt0/mYjugxNSFSNXw5Tk5ePTEEcbjtWlYmZi+3RpwS16Ecg5VjkxdD8FECyamIKZLjkFUD8J4rPnRSxPgHIivma1CrZtS0ZnQ9CSLWY9apdS3fQkrVGdHb591a1ISFGxK9K6ral6EjGas6vRqUqVupOjNLswpYidGhbj9i+nNSc6Xkbc+xVgxWt1LVqrdDVK3Zt0Y5NwHKtOjfZvrQD0TsRiGYpGLMG6VipBm6apxKxZgHIho8dkaNWxS7o1bkZ8dkbcek7qNuYlLrUjLWoxGJKXhafb6tuzMUaMjbnV6FKTt1J91Gjz+SnX0KtmnbkrdqvJUruRoTcOVZ1DkJmjfTsWYXtWLN9CzbhS61OpUafYrUJKfOoTp01Tn9i++1NT77delasXTr+ratWrHWtSN9S+lUpWp1fs3c66+33Wa1qzbs1ZOxfOut258++61My9Kl0L50xUsU6F0+vHq9aQtT5/dUtWrfXoWrdrsTFSFYG+zdTn30+hdIzpCJRKMR2GYzfBDA1AGluJQKoUgXsQLwhgmgam4BBCkNU4akLNCCuGITxBNxeSg/Vvsx2pMSERRexQpXWotShWDdmanReTilqXsV7NehR6FixfdI0o1A5ITrpK3Xkp90TnSFiS6tCRo1b5i+307qt8xSkZqnPozo7Yq3dChYt9CfNUopNx2ddRhJJToxIW5ad2pidJV7MWt8TsWadqJTEUlY7APROAVRKGOdJQR1oGrrM6JS9G+zdXs06UP1IWk4hitSUiOfDUlVtTMUjkZg5CCFJqCaOQAoh6CWQrV+nWkJO3aoUp91OtLSlW+6fXmKtmdKQLIG47GYF4SRWbnR+DkdkYRQB6MyVWSlJ1C1R75G3PoTohlZm6hXt0ojoT6k6nbqUp0QTcNUqcvJwXhHAxEHCl9eGp1eKTUdt2KExdTjkNS8rM1ZqrFIijkVjcevvnyl9CVoSlexPlo3Xg5BDBmC9eQr2IrYkJ0HY1FKsbg9JxaByRkJWhUr2orfT68nZnSdi+1atzpuUtxadZoR6lClm+jPm4ZtVp8tNRBR69ulAvGbN0Cu+L2YnRjt1ChErohg5Ptz4ehJBXVjsMyEQVoK4Tx2UiKHYBTOowfvjkPwUX0aVWI49AxAphWCuH7MEsRQxGoSxqH5mZnWbdmZkpqhXozMTnWqnWuvo2LU1Lx+++G5e3bq043WryM3FoBfYrzpjidaxPqy0JpeOy0GqVunB+6dFIIYlZiOWtV5KOQxCt1LpVrFeYoQL1I/bjXx6dWnRFBevJRqZsVK9S1F59ajZmKNaFKkPW6FiHoFkAYRK6QryMEMH4bvqTcxLxFdVrVo/StSsftRujGJGP2p1CfHZK3TicC8BRA7B6tJx+1HZWKQnnRS6pApk6di+MU4Sy8xCaFqME8BJAqhPBbLR+lKwihNQhPfGJKFKM6LQ3QhLCetLxBE4GpGL9S1S6FOD83JQbrVKktDETgRQlmJuCuI7UjKy8H6NeK2aUF6Vejbo3TdSlI0oglJSrFaduSisxSnTcN2YNUYG5ODlqBqHJCGas3FJqlJ0r4Ko9C0IYGLEF7chKxOWjkK0JOZjdmzHIMSNmOQU2Ldv43ZhevQj0Vh2Ia9ifdQmOpRlLrV9GXhydJ32bcvUn0eUtyErKw7Q53Yka0R0L+rEoe+hycdtzM+dYh26QvnSEfi8D1js2ZuakbpaWoUOlZn15qfZq3R6fOtWrrdizI2K1ujRm6FS1akJqtEUTsScG59qrJXzVu63StzdK61Ss2Zedbs2b76nbtzVq6ddRusVrdm+6hN3UaEpYicS4tLTqlqd9ilPiGdfTtXTEhIzMhdYrzr77fXmbvoxmzTtwpUhu+C2nFr4YhJFqt9GLTcNTEblILw/RnxufXvp0al0nXoU6FmRvsyNCddZis6tap3wtYlo1ZkJudLUb51u1bvv4lYiK66fQuvvs250/m76PSum+xaoUexPt3TqNmtXkOhXn3TU1BiZmJul3161noV59Dty8V+JWp/Ym6M61bpT4nat81QpTpGxCsFcH4tHItGudEp0WmakpVsQvMz5/Ut1KVqjOjPz7ViDV1SVn07MZmbMShifOoQrHo5Ok+nPsz49XgvGY1KTE6zWmZ/Qnzp86hPkZCLyUUmpGjDPGK0lGOVpULHG6sjYh+hPjEQ0ZilXn2qsdjM3IWbo9Os16PTuj1qdZl6ETsUpWMQ9E581x6nPlas6jfboRW6Sr150+OWoUiOakrFqfQt2LcWq1a8ny8xFKcflIbsylGxLwzE4zG7pChYhevTo0LdGa7qNqzddapVrqPbm68rLRqzVs2KNfl501Pj06SmrUTjdexSup2bqlCdFohi9CnVoSEXo25OnYk4Xs2pKGpGFacvCaIZSSr0ZmrAat3QLI/FacEsU4F4EsRR+D0JacvYgGME83AbgWROHJCHaliTjUjXpTN11iOXXR2+hQszPfUrzrqEtZsUZqtIXzNChRpUohma1aaqWbEnWqxaOV49TtQpa+KchdUjcEEzS6VGLT7MD981PhSOTMrITrNjkI70L4hhmJwmncVs2KErGZatJStapbjsRXS8XsUZqbgxPi0xD8chWCydFYEEB6Ia0GYXgtj1qHIgkpiaiGHJenEcxFb43E4cszohnXwNz4SwilocgQQJ590QRuMVIF4T0LUdl506atR+dG68GJ1e1L27V01CsJpKSmat01dGKMSjs1SqWK0SkatCdz5qSrR2hZiUKyEPRm3BRE7pGtTpWY/PlIlasRKnDESit8bjUzI2691m7qW6diQ7F1u1FKkHKcYkIG7EjOgzTl6dmfK16dmJ17rEUhqDk+1FJS1MV7dKhzUhCeStx+IITRBJ1oF7de1ZtWpOYmroVgqjcDcUjVablY5Trz51Sla5GpN9Tj86nOr91q+zUkZGzP7d1O1TnyM6rWnW7dG6hPoUelZs30K9O+1zrrp9Hv69WRnWJ9u1bn0bF86hVjlGfIWKF86zPsWbd8+1an3WJ0Umb6EnI1rE/7NCzQv7fZrz6FCzN9e3S75C3PusS91unRkJ9idUus0KVKvbt0J81dZt0LFefautW6dK3SrzdaYl49a+bs0+nHolG5aH5alMVJ0NVIbpSM+jWh+BHUtXVInGotMylKAKoIZ8KT7F8NyELXUKUtToSd91OpY53P77rrqtOFOYmorXrVpGzbtXWrNmbnSFafXsdG1OuvrRq3brRDbuvurT6E1PoWpC3Rs383KVZuU59SE8bhPam5KF7NWrUl5KpGpitI17V9CdOh+pfUjFGDdGxRlLc6Xt9a1NUrcKQKIWhBdfEuPR2OQgrR6Px+jHL7u+XpWrN1CDcFEnZmZGWgTxKDUdurXV4doSE1Yh+bryU+lC0tD/VmY/UhLAFMYgll5aLQ/ZjETowpFZ1K6TnRKfR5GPUJ8tQqxWOQYgZoy8lRhupCsrLSETjduFI1W5uvYqwtMw9G5WXj9qFrMnH+hfE77oik5qVhaLRHSrXXdedOszuZkK9O1Ro14tD8BJAXwSSUOTMXumYXkJ8DUlQlJeDdLjslTjs1bsy/NRWBRBRXswSQxL25iBHUlKFStK16EaqX0atOblbUvL2ZmRjdmxbkI5FZWWhiIJi+zF4L0IfkpWKy8JondD0ftTETjMxBiBqF4pJSlOdUvhaI5SGJqDtu+lOkoEEGpmRg5OiG1KwzAftSFarRgnj0ASxDIxFToQHo1E4zFoCuAFUIJqYvhLUgspQksQ/NRiP15K3Rl7VaIqde1MTUtakbdOzI2ZCzLXzEehevZt05aWtVuP2onHa1m+vAtjcF7MB+SgzEpOzCeKT7cCGHYENWnXk7E+vVjEQR+Uh6GroMzUGp8cnSdu63YhyEkO2L6t1q6fEock4YjcZm5GzOlYLJOFpqI4/B6tD1mRowCGCWThNALeGI1ysKQ7AogcvkIL3Q9fbjc3MSUasQki0zHqXL2bU6PxiDUNz4NzcvBTAhhJIR2II7AbrUqsTj81I1KVSRoRyJUIRVpaBFC8+dYitqUpwghaUj8MysNVrdiatx6Yqyk6DNONQYhLEpGTh2B+DclbgxL2ZmjLS8F4rJS8KTc3Xoxa1OsU4is9e+Rsyc6ZqScpSqWJehC8ft3SkrPrUq83L04HZijPhqKx+66hdZswL25CBiKx+jHbUzTiKIJuVq0oZvj83FYagJrN1SYowrQhPI2qUfiKKwaqzcSjUHp0+RtROfIRKSmadihJU6duzdVsULU+favtTp1GrUtTc6+zIxydKz+6df27UxF7qMhGp11G6fQunXzu6fBZagxZ7q32KVarPmpatUgbtWbd1uZv7511i+pbnxyOW+QlZ1utbs2L7F063Qs3WKdWXs31qNqjXt1ZqhHrr51unNX260+zSjljtW5CXs0YRUu3PvpW+YtT7NizVszMnYukJ0+63Rutd911u3JW69bmJOJR+Zq0L5mlIX1ehQoXTEXh6SititEcJehRn1J8StTF8/vtW6EhJTvt2+p2L5urMSkvYmrNi+Rnzdu1QoVeTq260+hW59991K66fZm6Fqf159199063danV7dud2aFC63dOq2qt1Sf2ufQt2q99u+jQn17dq+3dYoSF1iTvtSVCzU77FWzPhu+M/fISctBqSoVLFutLc6fVrV+PVbMxNxWxaodGzfYkJaNWaluhTpWqPdN2bNWpCeQsRy+SpS9iJzEbmYfmpCvCW1HopKSsfh61WnW5CzdOpUbFO1XketZm7dmtXrV69CzavoXWY/91OQmqs3M1rE+6xTnSdaxNzdeJRefC0RV75ipEonKx6fdCl86tauoSU6tbvrxO6rJXV69uGp9e+xbsTdmas0LchOh+QjEjIROfdYsxmjNWpS6vM2q0ldN2evSnWYcsx6hQqUJepOs2o3dbum6cjOkL5KdNUInffPtxahP6Fu1fH7qN8rQmZ1GNRWrToUY7C1aYj1GJyNCAtn3W6FSaiGAdgPxa+SqTq8AGCpCt1S+PQK4Ygbhebi8jJ0YAP5Sp8ep0Y3Qp0otDMnDcAWwZiVKK8naiOfQoU69GJQDOOUKdShbtxyjfEErbs04Ft1O+1zqNnlIVo39mCmQtxmhNxWlQkp9KPzq0hAmlJ8Ul4JIPXTduboW7cvZgWSl1uUnzq9idSqzFm/gVXU4clpOH4LISwvLzFepYmYCqZmpeIYDcRTcDEPWqcZsTEzAKogvsQgsRjumq9mNzczE4TTMKQkmZaNwhgrgtgpg/EEpFoZiKXpT4/HejKQ1Ol4rKUbdidIcldTn32o1as1J1S1Or1aVedOo0a1WrZsccictYjkzPhmxfH611SUi1SQmJmfHJ9KrTtTNCddRiU3H53WpV4ijshTtW77cBydfN2pCSrTFqlPr0ZuJQN3SdqxNV+KUacvGqdGG4bkrEYi1KFropJTUhNXyUxPsQ7XlZKK1pG1Oo0K9itSvqXTMxMdiB6Kz4Zi1SlJ0b76tuvRi1C1zp8nTkuYnX2r7qtGhdQtXzUrI3zd9K+rUsXT511mIqF1986fPs3z+1fatXzNifTpU77dK+3Tvt2uNW6/NykhNXxutHJ0lXq2o9KW6FG/mbN1vkLp012r7d9i+x906fbrX2pClfRuo2rM6fQsXSPYoz769e3Zq05KhSrTM1QsS1avWi0+QpVrqchQiUHe+1Pvp2ruxYoW50zDUJpCrC118lH4LwNR+nPo245E5qbnQKoLwFtWlUvm4cgEkJ43RgxfM3Vp8j1r5KdToRK1bt2rudXp3yMYkoYs075ClWmr5qlMVZ8dtydu6vOtW61q3Tj8zfNT6dWtZr2rqtm3I1u6fVrUJ/XpWrcnQo3z76t9u1WmqPaoz75C1Zt05326kldRlZKSur16UMzFDgV1r5eKyUzfAvCSAxisC8F7VXkY7WmolK1oUqzq1CZicelYigRQUQKpqWvq07cpE5eBupBPalYndHIbhJDEzAII9Hoik4RWYTTdCah+D0RQmhWXhPE4RxqEECCBVIxHENqfSkujbhPFolDslblqHPg1RjkhFoXmqcVoV7UerVLdOpOiUUj1GnNxKHakCGH5SrdEMzEcYnzF90zNyEK0q0Ed0zJTMI4vHaEVo0ufE69iDEQQ3NVozVkoLIWuhuYgxARSMhBmMReFIXhSQr8hKyMNQvC9S6JV6s6tCsnZnXV601CtGUoV+d1K1KNRHAxSgmiUpWryEenR6nWk4tKQtFYlI05iB+Quk7d8j3SVebil9atJWZejOqTM/hFKyNC3FZ8Xm4PXzNeXsRKb+tD8GJaEMvCWpMW4pE6lONxBBiIacXg5LQVQ7IQ5fDs6EPB+LRFKQRUYCaVhBNwhqQlj0tHqtOYiXVuitufYnx+Wl6E3Wl6liBmZlLMNyMrEM3Rmp8HKEOR2A5XiUcjk6KQ/COdG6cC8nKS9OvQpzpqH7MpHoS1YgjsAxsQxMSdeKxu3Qgak4DGrdGoQzpOXiliSn0IWlIJoBzkYSQAppwxLSE+Go1TjktHati3DkDsKwxNUY7bm4/HYHLFqzUk6MPVI7dN3wQQd4QR+Ymofm4ignoQzAnm4rBiA/E4DKv1oDG6dGYK4ghyShujVnRKRoX0rHOuj8VhaSrzFSpNRqR51SSlY1Qqxm1FqsMV4SScRRFCkdhWLR6EszH7otOik6E8ZiUFMWgN2IrxyUpR26PwS2oblYXkYFcG5GQn2JifMU45DVOUiGFb7rNOGOJRFAdtTc3YqzofmrpqhIQksQ5IWLdWhRjkpKyc3fIxqIZOE8JZOB2Asm58+Wmr6tGF4e5u+dbs0ZeDkAhtR+3HrpenPp2b6EjPqWbVu6zSnVL6tbtX3zczatWZGlVqSHKTUftz6kvPo3VoOwhuut2Lrr5CfPo2LNTnVYVsycbjNu1Yp14/dfdddbj1CMS8ZilCHoag/NzMOyVCF4TctL2rU666vSqUaFG/uq2/o2LpHl7dOdWtXSUTkJC3QurXyNPk5ehdYp30YzEEpClujD8F6t1SIJuXhWFbpm3J1rVCanz4tbrUbdaxPr051ux0bd19uUqzpK3L3U7USoRK+1aul4hk7EtDUK1bduCulFIZj0tCkJr51q6+/nXWZ1TtW59qzfSkZOtNUJuYg1WmK03Rm6VWhaoVpSWtQpbqzpejan3ULclN0brudbn161u198+h16V9mzdMT75uhzq1ihP7HdPkJe/m5919Sh31511mVmZenYrV5utQinR4tMydOQvmZeRsx6LXzFCajdiYhWrNUrNmlY7MYtQxZiCTkoPyMdhJHIXj1WZs1atmSuoVK0SuqSMavq1otZvvutx6fTg7H41BeUjN0FU6bisdukbr7dC6UrVY/SpdC1YqU61unVm7ch30p9uVs317FmldClKnZh+P26FGxZiXfG7cjCKC2Th2ViXLSNSjG58Ts0bUh26NS1J2rolQukrVGlSs32qNGJV60II5CkhE7daP2pSGZavPg1HI/Sqw5IwvHoxWhHJylSOde1FYhjsKwmt3WojlKc+Upz69jlZGtakL6leSoSdCxCSN15qLxy6fSpcxUi8FUjK2ZKIuAegVxyBDBPO5KhMx61IWLcUk7NSzz6tX6NmG50flY5Sqz5KVhNJRDHYLYclLUFNSR4Jp8hOgUUYYhuAqhuZvgGMcpQcgKYL3UYEtGM0IckbFCIrVmlMT6M6PVaVmbqx+OxDEoNT7NKfXnzHYrzM3MR+dBuDEejt0K2Igjd81N1+asTrdaIYRw1HYigqicvLRSal4vRha+EkfgzLwggqicPQVVZqjdBqYhyAzhLdHZqMQmmJ8ThJWvjs1VoWpqOTEDcAPYjjtClCetZmoRT5WNQkisRzEQUYX4KI5K3wKoMQntQlmL5mzfD0JoapUq0+rFZmFpSF4hj98JY5ZrzpSvHJ1irErp1erJQ3d0bqcVj8rRn2JuXmKktYoUKF8v0aEfrQcqx2E10nI0uIYTQYhWFoL25uxXh/oSUB2ZqxiKQOSMKUZmRoxWZkactYn2K1uhGrUpEpunSoR3tyNmbi1SzWn2YZnzMenXScQx2GISzFSM2745LWp06D86Uk4Wg7F6kBuYtyFG3Rj8bkLdutRm5eDtKQlJWQk6NSQ50nYvvt2K9Prz5ShXn1qt1q63zp186nfOoSVWYoxPnVZ911866PXXXWuda7utX7+hbs2I1fWn0InaukZG661bt3S9irF6s6fZjl1K1M3QrWi03L04rX74/Un25Cda5C1NzdSJ0J11OjPnU77VTnWevd0Pt17fTqWpeblZ0nISlmhfM3z7769Sh83bjU1LxKtSqSdqSsTFifLx+vOuj9WnM8bqxa+jIW69GPQpfKxS6+61ClG3NQCOCuDsARQalYCKAyoQpFJ0GKnzrHfa75K1VtWr51uxXtyXQicSrTqMagdgsqTMzdVuqRm+WiGpQh6PRHbmZq6hNRilBmjL0J9HlKFOrZqWI5fUoWrUStVZ9mhEq8n2uRt2r6N1eKRO6Ym53W59uhat15mfyNqWq2Y7E4jnRy6d3ysfqSN86K2o/AdnysPQdj0F5qB21Ot1J9GZrS8F68rEMCqAdgggck4WgH4OUYDCzCSA/wQxq3Xl6VCZrVpGSgxHZ9GC8VhaUm6UlSjsDUHoGocgQwHYzCWFYepQpdLzr7d/M1JCBuOQpA/QkZqjZrzpvo9iffIQXnXxeYtS0difDkhCvH6U1dCkVtUZSGJiFoGYGIIakZqRmhajNuvFrM++ZtQ1Us0LVGGJ8hUqwrUoRq6JV6cfkJ81dxDB6XtwxHonahqjG6UZicFUBZBmEdCF6tuBNLQBzCsajMUidSdF5u+Gq0UmqlulNy1q1JXzU+QlpKKTdS1Ot/aqzEdqWaMSlbVmtat1b4/BbAI6UOQpISlGEluLwrHonNUqXHLczDFunC9qxHbNuanSEQWYVvk6ELXyMfumqkfjkI5KPUI3XjUlCSQiPmqEftQWx6EsI4xAxEM6MQaghmoFlCCa+CK1CC+CqahDOjcaj9CbutTMbjkLRqMxaWr2ISWutOkI/YiV8OwpCCE8fiOBRfFYgiCVgM7750Zs9aNS1qYjlq6OwI5ODk+H4rA9z5GKcAYQvACuQiCSg5LxmtIW7UIILykJJGDcR25mD106HoDVCEFaNcjVpTNORgGUCaASRBPsROzMwlhDL2IQw5G4WiGXloXh6F5mAwgvAgmYRxFPoxybhngJYENCShu3MSsJqUxSoVq0rE4zAxagrmpO1IzMcsQpWkbMPUoMyU6WjVTnzrUjXheI4WnS9KO0IUnUIipQMQIKtmbj06JS1CXkIUug5Ajjc6nUhuP1q8fhNDkAVwHICGLU7oD8lCOzG5CZp16ED1GUkIzam6U1Kx+jMV7EpBTDUDNqA9QivC8UhJA9agOQvOgvCGB2amKFCjBmMy1WMVYNTrMGrNOhUvn27dSfXr1o5J9ijCkIINxOVrw9Qn0IlOnTFex16Fjszr75uxyc6hf32ql1K+hanXSVWQnUZm+zbvnV+hWtUKE63OsffQuvunzuIJDndSWh2ffRqWbrNrqVqN1OvY4UvindRuicaryU3Lzodi01FYtPnzu+hLTqEbgzA5an2pmfbq2ZqMydilPv77Nqdbup9XrXzcTnwT0oMW6lKxOil1mdRmo7ZlpKzOj9eCu3DdeYunyNCrRlpulIX3Sk6xbmYJ58TkbF9u+fffbn0b7M6rbkLUKXV75Kaj8CedykrdzuxOunT7VafW776FutHbcC8jzNqVp1pqYsU5Gp3xKnTmKN8v06Vu1Us2eQnVp1HpWZC1da6d1nnWJKzWpWL51i+6+GrF98+jfYhPdbtz6V91m/tT6NqhasWq9qrddYn0KNezfTl58LyVmdVq2LojnxHN8tB+akb4YjNeQtR+zdbisYmpmPd11avfBiYiOIq9nm6svGLcrzNaSj8asyNGWtQrWoT7MVrX3WJ06+++vYjMnbikXoUYUmupF5e1VtzcFdKnZq06E+zS7HXtUL7dudfaqRK610OxQutXUqc3H6E1Xmq1GlZk5i6OWY9DUK2Obkol2rdKtRvn0LXTrT7rpW+zYmp19SRkZa3Xp3yt9uvEr6daKzUejsfrWL6tuB7hJLRzmoUnR2Oy8lSi0tSoV6lDsULVq6lOp9m6xfOqU7Vuxf1OzyvdYs2LVadWka0lDMTtWKN1CxXn2YpZrylmPScN15WXnWasnTrULd1ipZmKcj8Ft9HhWtbswGc3FbUrUt0YBZOkbETrUonAD6nTrxOvEpWAEa3SulakhdACLOpRubkZCjAD++nZmOKxSAYS1iCGEk+pQgL7pK1PnSN8EEOROzwG6MLwQ1YtKTF1S6BbO5uThftQK4gsUr49AejcBlBZXhPRlIGZuCWAziUVil9eOQJLUjbi0cpQRwFtK6VgaghgxAogKbEvAovhmXjMAymbfDk1XjsArgogovpwOzdiBX15aQgqt14JovzrViXoQJLfISVCNwLZKSm7oJpmWr1p1SSpW7NqrISUtToUK0xbnxaZkqkhXsSF9GPcSvj9CXp0LN861Onxy3fXpyEtakbpqIKsNXWrNjjtmF4tRnxWNQtP+LTpq6KyklHITwtF7EhJ15qGaktfRhWnVoWoUiXJW59OfGaEpDEEEhFozEXdSm5OnZj1WI5uCubgMq8AohijI3TdiampejFLNG1DPfZvvqQzNXTEhXr1ZmzarwlpwIoNwtHKE6fZs1bMhzVWOQ3bsyFqrUtzFqfbtX25G+fPrTrfUsW/nW69H7dmdPt3W6N911uzQtz/r3c6vOoUbdOlVq2JmfY69uVpV61m6zSn2qFGtOt0L+XkZ1mSszchYpz7c3L33VKtWdPrUr6daQp2uRvnyF9W7nz5191i+1dbhevQt2J86dXn3T69ifYm7EYvjt19qN0YUhi3D8GJe6YozFWOx+hOm+ta7FaDMUurz++3QrUa0taszd1qlNTczZm7c1TiCAdhmHb5Tsd/Svn1+vXrXWO1WjMNw7AXzpCOV5CSl50tA7NWoZmYNT5KBixHp8UrT5OXisjK3ys6LyV8ViOrLS9Lszd9q1Yikb7Va3OkZaJ24TxSA5fN0aNvhNAP0aE+3b51qjfUp2erOsS8ndVi101LxeQlLNSboWYT04Wmo/z5SRjsDFmjIVuF49COdVs3VZ0nHqMSh6nCvC8VkqMBfBqHIlAVwpJRyKUYLwjsVYNxFCkMT5ejCKIIByHYS3SFGPxOI5GlWilChH4ZoQVxmCOZsRFHIehHMQP1o/Y76cEMALoRQ5Vg5b6Ve6vZqWLdOaoyU6dRlop0LE+pOjs6DEfmJaSjs3XhSAphWCmrCWEfBibjcpLcLUognyE6t3VakdtxFOiCfNV69aIbcQxqfZkItYjMxKRqCKHo3WjcvH4lPjVO1ALJKxSlpqKWI1BbA/BbCkdpWYPVoSwZg9AbhWRvtyNOKSManxejf3W+6YoSHH7VutTo0L6Nrl5qldOlpanRhDQgjmoO1pq6jIW6FmtFa0eidmJz5GC91epN1J/IW43Vm6NiO24nF7dSbjtqTsWLVGxGY3WluNXxyjGJuNRO3E4JZWHJaNykFs1B+fG7cI5qOS8O2ogtTETgnjMJqkJYXgSR2IYtBRIQhgohyIIduhDdDtWEEzVgmgSwCaI5uNRqLwPTU3LQXnyUai0tWoRyEkH4rB2YpwlhLWgomotAkgHI9TgngDsckY3DEYiUYqwlgQx2E0atwkkILYGbEYhNNwJYBNCSYhyRhNMQigjhBAatRbi0ciKM1bqcQQmgTwBpMzcbmK83Sq0oJqMByP1as6amo/Or0bEEstD8MWI3CO1Vm7c1d2Igo0ZG6Akh2+zBJMRaKwpCWBLYty/EVu+6Yi8dhPGZGPytmpG4jjsfn0qlCCmYgZkr4hug1DkpByTlItCDnQJoNQYug5DkJpC+aqWp0xwXgxH5aTgXkYF4GIRULMhK0ad0+LSUXtSkAvnUJ8hGo5GLMSiCCGAGEI4PxOpCkdoxW6VsQdiUCSAQUIAZUIAlgBbPhmbtxKWk6kvOnUL6VeTmOHZmMQgnT5CGbUdjFOIoXhqA1SgF81CefRnffPvoW59m3GaNeNwPQ7HP60lZpy9C6lbn2qF9qfaoUZSdatSdubumZ1KpVnX2qN9fn0J19G3OtStqdNSs63RtSE66SqR2zOsyNCbpULVa+++3zrExzrdmlIysQX2o5dZj/XpylWRmZqbmKklThmzGpOlatWrNuvOs39qdZnX2ZuEcldZpUKdiRm7M6tfZqyEfgxTs2oWty1To1YpZ7rpinYn26VCOVJrkZGHpaXk5SGpmbm6cxF5SHY5QpW5mnD9erS74UtwlowXvgXrVZ1qxYn0b7M6Rj83PoSPSszV8xErcpOhmhUkogry0TluTjs/nTdiZkacxSiteY4rJW5KGbFi3ZmoUlpqSsc6dXn9mRo0p8evuoS9ivO7c3MRBTtW5/Xrzd9qxzc3JRHaoXW+++QlZOdJS1CvGrctTk58J41NSMlFIgpyVWJRixIWqcdkY5MW5KampmRqwpbj8ENKGrMxE4pWg/F4Q1YnKyNCM32qFean3907rTMepWLcOQWX05ufUmqdi++zarRmhG7dCjEr6sdukrU6hUtWpCUmpmF5q1Yvn2rc66jbkL690+IKF19SraoSchLR2DMWhSJRqbjNmKxFCKGqcesU5aQtzpqRoT6USoVqN8SupWLNCnzMxM058TjMlLQnhqndfQr2YjkZCTvpykVgqgjnxSQoxqdOkJKjShmRnQlow/Ny8PUK8Wh2zPr1ZavZn0LdWzZm6d3PtyVazzqNudN25qF51/YtU6lqtUsROlXsUu1N275CrHLrE+Io1xyPwrCSbqTV/TkqEhOl6FWzKS9i++hNzEhLxqF63Gb6dKCexZswWWakXgos90OTorUgpvkLcCq+jfBBJUpaBJZp0oDCjYpwK4Z+AzhDBJIQDWFbq0A1nzE+AYzEIasBLRnS0CuL06UBNNwT3wQWKFmBLKWpaAzhHCG+BJCsGasEkWhaLQSzMBujAYQmhPTgshFAvVgFsejkEsCqnBmOQFE6CeHIE81A7NQFMlACdPgTSMCqfBFPk5WAspQUwigMobjtOBVMQBNAzAVxuLU4IIfh6QszNKZjtqQ4zdXnRqRkZPtwKbMaj0LRWxQrV5adXkYS24/NVYggxMTMTiUjFaEevt0rrVWtOsWrcfkp/Rq0IlNTpCak69uagnqyU3YrV4Ty0palotThedNXW45QlJitYmbVOxasRz5uvH5KGbrVvl5qnIWqVivEMhByUuhitIxqM05C3HaEG49JxWF5idMzMRzVKrHZeJwGuEF1qZgOw3RoxiVrRyKytqGa9i3E7o1RlZefTviG3YmqkUilSPQrBeJQdkKF9K1OtXW+tYt2LcMwxHI5FYWun9mjOvoUft059Sas1K999CxV7vnzrdqhSsc+3QtTpCzQn0Lc1Pt33Vr6EjQnWJ9mdQkLF9/Rsy8+hYo1+30KM6zfOl61K+rKz610+Py0xXrzduzZlo7Ride3HZ9SfQsW6NmtOuo3WLpGOyFmIaFeWg5KzUKWbN1ezUrXSEp1pGMyVGYty8LxqjRmbrFu+WlYdmrN8tfGobmborEMBuBqOVYfkpiWj8J5aKQ5YhDbgW269CvMyUdsz7Fm6zXkZifRmJ0lI1Z3Qj9CU5K+3IxmWkbNCQuq2aMWt8endWnBupN25WPyM+AcsRuRrT5CbqzUerRK6dRsQtapVqMRyMnITrcTt2OpQjVGdd8h24rHJqfbszd1qO3X26NeTvjtKzOoULq1SvQqWpCVjdfo2KUxLWIbhHGOnarUI/T4NQvMwZtwU2IpdUl4pZmIrB6BVOm49G5SHodhDJQggqi8G5mArlbEUiOLSlKhG4/GJ8ZpUo/Omp1alFLUhYnQcjM1BzrSctBeI4alYxUjcQ2pqjYjkLxHGqVWhXsQMRyIJ9qzTmJqjToVpSFKtGfEqNjukZet2o/fNQGcxH4ik4xAP14MwvVhWDcMT4fjNW+fNxipPm4K6NWFJGKyFmfMzFCI4rCGvBqDFGpByKQE8A3CkSgigdj0GYI4LyUlIRavAbgFkjC0vIQzHYNwpAihWFotJycQQCKPwBnByBDB6fIQdm4N0ZetDEtfJTE3YrSVq3x2dasStmvZszrdazGISTMbrz6EF6cvKSd0+zHo5J27ViF7cnd0asjGI9Z4vEdGBuFbdinFZCRvp06VuvYtz6lOhX7pmIIJLdC3RlpmRhFfdHYdjU3LQMxHEdCJwgpQgpwkmYevj9qEkXhDxBGYJqUEsbjFG1B6PVY1Xm58RRSD8zCSUg/JQ/DsFUpCaAshDQhPAagonSk+ENOCSJQlrQ9C0C2dAMYAAMH58RUIIIAQo7AMICWEcagUzMF4CyF4hlohjMFE1GpiNQEsRRaCutB+I45BLGIigtgBnwAfQ7bgGsBbEcRTUGI7Zl4AhXwKITw1AsmLo7BDADqWk6UAoiKDEQwj5WYp2u3E6clYg7HY1M27MTtVo9blZCaj1a63QlIhtUbcnB2ALrU+WoRSE8Nx6BiUgalYlbhSIKMjUgtgxFoOy8rUjcRzqnQmJODkPTEF5eIIxXjMak69CHICCLRXvk41BmFJ9WDdOCm3AH4UkpOEVmYl4WkIT0YBLHohnwMXxWFpqtbiOAik5C6FZqGKMCybrwtVhW6TmJGJ2bNaKw/bszFSnahaE9mH4/MTEtYsTUVgbjcDsRVJ0L2K9GGIYhHDcC9W+zbsT5uGbEVgzFJGB6FoH58vSoT5CfIW7VqdSsT68djUUjViAL747Yi06fQoUbp1GhKXWKc+6bukKlP50zToX3SUrfQurSNLp1LEjC0nHrcTkKlafz7d1mzMx6+tM0rfUtUL+dVp9ejfIVKUzFocnVqlalJx+UmorLQL058KxixB2PwtD8EsP07rN1/X/n3Tp06jaiKDMTh2jTisQQlhWE0C2bhW+x2qcpMQ7IS01Bu3HKd0bg9MT7XNSU6+tVpWLXfSkaNedSoz5KfdZm5fiV0lFq9jn159WhVuo253EurSut0rN1G613WrFCddSmo1OusW61qXpUbc++6661dRp0Z0PzEMVqtWFLNGnOqdu1dNSNCnb51vr3V7FLunW+rZqxDWkpCdZsX0bERVLqcjarVvp0KM6jOt2anYt2o/fOrW6di6Zrzp0tXlo5IwZpQtWo2rNiJUJ86dYoxvuo06lPvtTcetwatxyzRsytW3dYpxWdGbuSm4frXwrdFLEtZicl3V6FqRoy8pVurV6EvJTM66xTq30pGTqyclSkJ9ngvQtVpidTo27Uzan0LrVunXjtG+hZluamZ01RryVC3RisxSoUJKzZtWpOnUqVIRS1GP04tFrclFIahiJ2+nbn2rMhzqF9izdVn2rcer05O12p0tEUfiCYn04/GorZjtmxN2ZabtRuYkYSwkr1JW6jHYlbk7cnak5S3WmJShbrTNupRtcft3WLp3T59rvo1q998TkbNGhRnUp0++3FZKxWrzrMFFK7i031KkZhWdKzoEETgYpUpOdWmu1fZ7rPEoAL9q1TtXUpClOnTp9qdagOW7qXbvpdGjNXTc6KQAWaE+xQp32KVKhDE/s25CK2aUjBqdWn1ovUswckIxABUmKU1Wi0QyE+fHoijFm6DM++NT5GDUF4xOpykamoPwZswAV4JozA/MwxBeG7oCaDM+XgKY5FpmzE5uPxWalZqEsxLVKEhZgA+oQRwjowI7oKZOxJSUxYhFCKC2JVYI4/COXkYhnQUQ7BbAI4XglgDWSi0MUqtCKWuRrXzUctQDGpFbNm3NzUYhbvjk3MQW2oNTp8jJwrN3RyfC8Zi83E6VO+bt0JuXq1ashan1rVqpHIjtWKcKUI3bmr7qV0drVZeQiULVKlCfFa0em6crdISd1WdK2InNzUxYqwcl5ea68+ak51ubkJWOW5KA9FJ0vXvpwN0LV1WffKSEhOr0LM6NQincF4O04jjkShmpN3UJqdNzrU6OTUzOqRaKRWTqT68jPuoXUJ18nIzdarbkL6c6+RlYtWmbND7FqfatzpSfLzqU/u7Fqhbo0LU6jSsWbFKRtW7UxX591q+nXnwrVryMhZkaE+6lbnXUL7FmdfWrWr7MSqXc+vWuvtWbV/Pn90zbkL7ufXv51rrx+3PrROfN2otOrzr6191ifMzMzPl6USm7rN19mSmqFq630LUJbcSukbp/Ptx+QnXyVOlWiklKU7cnZpULrNmtMy9KDNi1fLTUYrzdGjfCs3MT7ViJxqahm+akJCShiEkVgYm6VW1Vm7oG6kaj0MTrFCdZmpO7+pRt3c6+QsUopUhe1Qm7p1aSiGtIXTc6bn9iGK9OakonA/fYj8CW3LROlRqUbEQQrHuXs2Ina7q1ifZsX1ZazQsVoNx6H7U+3bsRWrBmM32ZS3fIzfanUKcnan1bdq1anVZaFqsTidm++jHKs+PxSDsBnCGIoPwci06HoOQejdCrXm43PpzfKU7p11SXikxHKsWhiAzgHYahaK8C2UgYsUpWNxWMQAth6DkAAmbgWRib5OO1JuYjEHY/BVBqhJSsGIdkozByD9magYjsHIbichMwzMwYlpqVvmY9UsystVlpuP2pWlHqlC/mZKvY60UjXIxBYg/NQGcQTpOdNy1OI68vwrSitWrHacNSMejtrk4tagE0GoNwMT4UjcO0IOSMJ69OMysRSUOS8tHJ0ZhepKylaJX2J03CCAU14IaFmC9TlbNqzL2JaA5AogbgboQXgNxFAajcGICOIbUJY7YmoMwrIS/EUpLU4Vqw/QmaMtfTuvkJif2Kduxap0KclUsxSYiGJx21Pq0JKdTmaM6ZiVjm+UjFCrYkakxAGlCZjtCMzpWlar0pqZm+SghvhLNzrElNylq1TutWq9CzQj0RxmCmKRi6Lzd1abpXW5Ob5qfLU4TwYiG+Wko3WiOjGOMwEcEcEcOz4KpGXiUC2AXQlg3BHAPRFBPB+CmMQBhCanBFDcE0TjFiHZuAsjceicH5KEERQihSMwJZaDMCaAJJqAPQmglgmj0FUAhh+NwbgVwC6E0IIK4JYZhyBNBZNwJIB2PcQzofqQJZ0OQAEYigMYIYAXVoQQWxSCaNwLYO2YMwhgG4jj9aAhh2PyMUgtm7MAdh+EM+A9Q7odl4btR6xE5ulCWE9a1Or2rUvMzVqtPh+G7cFMHaUNQLxKjGqFeOysF4KoAhWrdGOT6kPwzQjcKQtYkb4SUZGORSFKUzCepR41fbpyMdka0GeBXFYpDMfpQxOmK8QxKdXsxHUoRFIxelMVY7UgEkHZKvEVq3XhLMUJ8cj0XqwUQ1BytCs+AjiUBjYndC1Iyt1CYk7MnQvtQ5D9afGJCtM2Yht3ysToT75qIYtPpUOjWq2bVuIJaZnW6VutNxqpGZGfAvDUORi+QsTF1C3Qus2qV1mlGJCC8VhylKVLfQsxytKWKs/n0rr59KdanTN8rYn2J/HYIYEFiKR+vTsU59qlbt9Sz25CzddXs2LVWdz6MlHJuxdWkYnfdbs25C6Ozr7Ni1Qt9vj0natTER0YQTd9GXtWpuffdfNRyFqkxL1rFW6pdOlY/PrX0q9eCyDM3JWYSz4pN1YGohp0YrDNKRkJajMxOMRKfQqWJ18eo9anB2boSkfsWqE6blrpa+PzpunfMWqPdWj9SdPs2511uxM17Ec4SUIekISVLVuzTnX3X3Xz77c3Mz5O3NWrNqdHqNmrBu6xZrz+vdJUJOzIT6MtHKsFc+rJR2dQo1pifOn2uRj99HqV681I07VuQmujGLU3b6FuxNWr5O3MXRKjPtSlKRvrxKjddN9iQ7rVOXm5mlCsbmolNx2jJxBOkYrK05GLRHRn14NTUEsRSVKBPEqkUjd9CSjMcrxDfZr3TMcitWvDU++1dStx6asyEHJmO0KF86ZjUnG47zoLKN1apLxiQlqs6NR6SiVa3aqQ/RiduKw9Hr4rG76M3S6FilRqdnsyNCWqwvGInNVpCbs8es3xq3EMeiKnC8JZKFYQQkiUcgkl758vD0rH4/G4pGqstQupSsNXWKUhUqQZoy1CSr0aUxM1LMxaundOlUj99KZkq0PWYr0ak6rdTtTcnMU4xNTE+zDMJp8HZqxUm5WEsrF5KjKX1bNKnIVr50nam5WPSXZp2bPVnXTp1udOozN81PnVJ0+ndbtX3SV1iavkKUv0p8Zug1B+ArmoSwZoQBXRs3VLc+tM0rM1J1IpKTUzdZm7uvQl+rbkbcvFpi+hxy+aoRe+Ib6HZrUa83ar0Y3HZ18ZpSdSCqrDsUiGQszcEslDNaEcLVJ8H58NXQS0oaheCCjCKByBbOtwgghgzG4tAM74xANwTQHIdsQKp8dnwVwzAdgRQLIDO3DcE0CaEtCCeH4GYPQfgrgagaghgMohjMCydAJJWCiPxSEkCyDExH4BpAPwpBbBVCkKwzBTLxudAYRDAOUYRQpIS8JIUgXisOwfhBGpuG5uMRyAUwE8vGIGYJ4WjsIIPcSm69CxdJ0LrVW1HrMXvh+PxBKVYK4VhmBmnAfqwzITd/ArgDiBudTo1Z10btRK+O0alq1WiGQk4fjkPUZ1Pg7zV0JJG+nanRSQhmhPr1JS1IxDEdeK98UmeQjtSGqkpUiKA9TrQrK1Y3XrWrUVsScpD9GVvlZqLxFBNU7EtakItTrVZ1uIqfFoKopTpwYi1mJSUrLWIcpT7U6dKR6tJRaxGaUWtUKU61ZqTqdKfWtSFK1bkYlXivfTrxSrXiVeajcz0b69eVo0bdq6dRtWbcjdPtz7fOs2bp8xbr05azXkZ0vGJiIaMWgY60Kzdu3RnULcSm7N06QjtiSkLM+vKQZn3XVbcToRynamrXIWLqFu7u6HXtTrrE+Yuum4QTql1a6zL2qFu1TlZOxHZGdarde+ldVj8cn2pa6fJVoes1LrV83apzFGRkLFKVpWJGVtysjVt3T7U6ddar1I7NwxNVpm1aqSMRyEQQntQxBiLSE+jDlSrJU5CRladmnZ606rYrTcrAKI1H4Aij0Wi9iDMtVt2brPXn3TdOtTtWq8vPtUpqbkIOQDlKfdKXzXRnyNapfH4H4dkIOQV1ogiKtbmezWoVJuRm7FSdQvidaahuHPsSMcr9axIzrotaqyFWOwltRe3VpUJuENeILU+rZr0b75KVoyk1Tm4YrQmgeiCOykvIxuMyUUlZWLxuhN06shJ05OIZWBXA3HJmVghkYaikWny0PSsahiEVaB2CuAKotXi/BDJTpmzKwjkIWhyLQ/arT4Sx2OQNQjgxAqitu1NzMEcHq0BdEoJJCD/BqpEM1J14pIctAxRmpehM27EnWt0o7KyXStS0jErFGXhyxMSludfUnTVqBiCyAhgqik3DkLQ9AGc+A9AG0ZiCB6EFKAZykBnCKCeJQTQmjULQRwvB+pAtgnqV4lIwIZ8Tp2JSanWJufPlorMT5uVma0eiCdQrz5alVkZaEU6DdCYvqWpWpBXBuBTFI7Ut0IAXwngDKXgEUE06NRHFYA9Ho9NSNe1IU7qk+1E4vKT5SF7F011591WfboVLF0ci9uDMUmZHoWKFmfMUqM3Rs159qzQqwm5OCqB6AV2IJYBbBeAbrUp0lau7durMROOxmViOpM2ItZsSMJ6FK3M2qt0vfHZWbtXy0bmJWffLxuratz68XqzU1IycZnQMzVutXiUMTc6Zj8chiH4LKMHIciUJoegmpRDRgpiGbmYRU4cicPRiYgZtwHoKYBy1GIcgTxmhD0E0PwRRutHotNwnloTSsUgSR2C2D8J4ggmgQ0YFEC2BBCOAdq04dgU1qURwGdqDkJ4Wm5mCqEkzASRFBbMwzHK0vXhNAD2+MTcFEPwHIQx2IoUlYEsH4AfwzMQWwC+jGIPwMQWQF0disRwEFWfbj8Kx2fDcxC01PtykEVOE0H6cK2I7Fa0+zPnyclVi1CAnikDMhbrwvNy8+jRr06F1q3xDGInEUaiCagAEScLwhjNCfHpebmZirKSsQyc6PT5GDEfl4D0hbgvHYWpXw3GoejUEMjNwrAPTdKVjU+WtxSnHIzdDE3amqNulZhWNW6svOlK8Xili+rUtydTisxFItKwtIWIXh2ViKfH4nGYGKMhJSleUjc3AFMfgmnUr7VCYunxKhfUuif0Ks+SiVaOR6bsWKNCpEEHa81OrzunSvnV+vMW6cVisn06Vujbv6FaQukqVWbkZurDkB+ZhiMwgjVOHYKp1e6lVrRyHqMzPoSUvMQ9agPUaczDl90hOvpy0KUIXozUrFqE+fa7r7d3aut0bc+fG4MxmZ6Va3btSN3Q5uWm4vO4MRHNxOdZvgqhmP2LFOZs0bclIzVSJTp9K3KRqJxaxTkInx66MUakfn81OkJ9CdXi8GJ0h2pGtfL2KFC1biUjPoWe6pYt9rlYMw/atzp3bsV587oWasfqW59Kat9mvFJG6rOvvnTNDnXX1bN9qfSpUqsjI9e1PtW7dGUoSk1PsV4namJaCaJSdXj9KrUk6NiWvtUKXXmKNK6zdZs0qnClq+zK3VJ/ahNQn25OnRnda3Pt0+jfa6Ha6UjRn0bdO+++1Zp0q81JWp8ldZlpmaszULRiP0pCZi0+WhuKTcFVqZkoZjU3NRFYgxOhJDdiDFuzffXrSt0foXczUnWpGnWoT+3VtSkpd245Wp3Vp90TtTp8+1bs3UZKzVmpiUpXzdOvNycnNUL75udVn1J0+pG6c/s31aNezVgWR6jXiC3OpSlC6pCGzE5SbpSs3YhyBNyM6AbsR+EUZmIMzVqKcO0bN0SnytmH5etdat2p0RVrU+SoVp1iZscvam5WrfRtz7NC3SlqdqxIxiCClCspdHpSRs3y9mrXv/p3250+ZkOQnV59e1QuoT7NKnfbqWfq0aFeffWnyMhK0IetRqWhSGa06EMzy8FkHJCbitGpSilCrLRq1ao2rVmWsT50+xzp01RumqU6+RmaNGpNzrUj0rcpQn15GOWZ0xPvtx+IIKoanVbdGWjcpI0KVSXicIKFG1KxqPxKBLajNiKVuJwJ4imY5Wg5B6FIAgcvF4DkBhAKbUBjFYYislQkYxAU3SEeiOFIXnQJY9aisjfEUDEBTLV43XtwTQHoIIfloPzodhm+AYQJZ1K+E9eGIJZKrdK1pOKQVdOfLxHR4ej9OnLTUZnVYL3SkzAxBNKQ/BZArsxqlbq161iMVZOWl6NOdNxO3LQX5mMU50UtQXkK8Vk+6zPivXj0di9mM26dqrRs26Ne1WnxehVh2asx+bjFqfFJuOzNeZhuFJ8zBTGIrD0chedfYsTrpCPzE+ILFSdYmYZtRHLyEJe/vic6YpW5iI6dqdE41Pl7pSUm6cQV5/UqUK9SzNWZ8tKSNXh+E0pC1SDlS6WtSNqpXsRKhfJQxPjtWVqRandSodG6xPiO+nb/qULdOtZtzcvB2nJV47ITpGjf2bXOn2bV1GjIzpCddMXSNCjXt2q8lOm49HpC+xCkcswN15uhLVIVgZnTExLxmzDdChN2o/DdanWgz17MSnTVatPs2p86zJTqM61IdD7dm1fIWqN1ianV69GdbpXzMxQid1afPu59uvLyc6lfYtdnluKXzVWbqU6N07m6FmrXrROjIzqERz6k3fblZWfdfIV6MnSvtdqhbtQxBqzIWbpKjfOjsHYxCO6JRiTjdqPT5WQpQB+IIjqW5SdOrU606RumoViKBivL2p8AfghoVISQ1Bub5mtWrU5aQq2rrNe6++1Qik3Pq2Ze+vIS8VukrVipZup0qk1KwYgkikrUikLwPRqEdGzyFu6fVrxeblpvq25uhWka0vJXX0b6MvUiURzczMxWZp9WpEcjGqV9CndYvnclKRK3MX2u61Q68XhunE5iEcXvnUK8LWYL0JuHp9exI1JKPRaBmHID8zCC+P0b47B6D8BhAzAMID8ALJiPRDJQ7HYD8GYEUOQCmXgBRHoHYCKpaoQPz6UjUgYh+FoZmLNGZpRyGJmYmZaZswT0oNy0BlB3mZKpWl45HYWjs3bjcVgfszc66z26Mbj1i+vAblqMSpSNOjM2oa6UMQRSkA9OjVWWicfgegD8vC1SDNafIzECOIKEvA3G4agMI5AfgthFEEII7G6NW+lYrTEB6HI3T75OXkZevN0I5XmbEtKRyfTlZuUsx+dFZmjOqXz5aNwFEAVwF0AGKBqPyle+LxFWjUFMTqUZW+fanUpDp1o9dPn1u1Iwdq3XUZ3Sn3dq+fN3UeQm5jmZCvDsD8I4J77EFMGoAfwal4E0KVZ8Jr77FGOTExRoz6c3VszUK161enYrycGI5E5qHakF7ExPkLFOasXV5CVmbNeXsx2aiVG6+lAVwAqiOdUjURwL1YcvhSxHIhgoryVKWoRmMxOakYxCWFYcrQYmZSMQXhHLW5ODEjEUJIDGAANArgLIDsrJwpGp86AMofisRzc6VhLC86PR+FKNeJQD9CAvnQ7FZCCmBbFoEtOOQ/WlKUJ4ApjsKxyhEMCSEEH4nSl4HInZ5GbkrUQU7cfgD0fiKbtSkAogRw1Tk4D0AMrEHYGoBVAtgCOzCexBmjdJwnkZKXhW+xdIyUQwNwBPC0RwbgD8rYjEFsZtTpO+J2LV8+IKEWl58Dlq39idIQxdXund0ehiFI/AvIyM1DsKR6EsHYrFbo/DMagQRDBTYrS0nNzpPn0qcNxWNR6rMwG6tCXhyASRaIoXikH5qHqUIqEai1eYlpCHp8hdbmYSRKalIKpOPUKlWpVoWalKpKyfy3TkrFWOx2Ut07deJyl83XjdqOz5iDUvBVKQzyfOq1K0r0qXQo2q0jKWpuxI2IOx6GJiBq/nxuG6MUkvtXdjtUa90TpR6YsUu+nQmLqFanNzdOrCkNQ9COVtwtUiGA1agnow5OhmHoKbdqfQr159GXiGhYheF6MxLQDl119KpEp06xMVbFuvOv7+j1J1uXi9eK2rE6xzoDscoXSE+rVoUK8Siczbj90hXn3VZWIpCDMhMQkgcoT+3RvilWFZenFJ9mdxuA7Vjt10Thi6jRtVpSxLT6N07n0Z9uJ05e1FogkoUtSNeZrScVmrdOaoyU6zUj83Fuj259m+dIW7d1SzYsU5iIJSnHYUletUpXz7F9CrOkLNubn2rVutPkKdCdXpXW7U+lXpUaPH51WrMXwpBiMQ3Sk7MtQlqspGJqldNy/WnTPYoWfsSFChKT7rVr6NuxWitunJVbdHmKNS6QnUbV19906btXUKE1EMcvr9C+1YnS8SozqFS+lWk47Zi0rIzq998hQjUzPqUrcWpWuNXRuzI1LVOrYqReNzorXpXwMzp1nmob5qhLUKlOXr3z6lntR6SiU6KXUq8SvnQXiGbsQtIS83OiUG5uNxeG5uB2E9mbvvsTV1OQqxWZjMakpWrDtKC8xG4pBRVhNEochWF5CDczTmo1IS8nfC8YhLFKEMRqSlo5DsARR2Sm5KZgjnwUwdh+hBqagoowkk4inSFOOW4gn1qfVs1brNCvH/tW77U3XoTdC3IWo7wzzp1eBeNQ3GL4XnRijEpehz7rM+3atVbMlFr7r6E6++6fXo32p86hboW7rc+nPs2JWxVmI9VmbcNxyBND0ButBbYgtikxXs3zdCFq0boz6dWfWkJ111ejUvtV7rV0+1Zk68elKk3I1KVaTrV7U+rYn261a1Fo/fG7+OT4L3yM+hE774lQtT6MvWjE3Ld9CA1I15uNUo/Hqs1HbUUiGJV7dm6rFIhgSQQwA8g5agriUUh6D8EcvAnhJMQV0oPR+QiKDUcoS8ciKCmWmp8HIP8ALIAAFaGZaJwjmIQUYjmq1eHrdSGJKhGI1E5mByFYxdN25eOzUTnXQtTt0YQR2FKsUo0o/DMCaY4AAcAYRFARwlik+IoKYV50XkZ/bnStiOz6U1w7QpxyPR2Rgqtx2PRaB2++PXQxdWnWqNG+amJiYm5OpXiCE8QROOytSH4pJxSbqT4jjVi+zfD0OQrFJmLTNKjak5uXpRifJxmEsWmZmjBeG74DcxViUOXSETjN0PxiRjkKz5iDdfi0ftSsK3xOhFJ99S1J2p8rD91/Er6lCYkY5SlZqjBiEstVqUp1OSkJGUoTMjSk+lWka8+dRm5GfFatmnfE+dZnUujNRa1DV186hY5W6bvozu3apzr61afU4/Op24patXWObtz4/Vhm1MRWJRanUhSHZqGorC0evnwcjdCzC1O1bk6liP14tZmYTRO+jfFbc6nMV4Vs3Ua1mjd0LufOs15aavvhavfXi1iQkZ8R2pC18+tYvqXzqFqtat0edYkqVexFb5qQrSVClYqTUvYoyV8QQ1G76EhRnUZ9mnOo276FCdPtX27rPRl4hhNxHUgslJKLWYUj8GID9GK1r4RxeIYzEVCxCeOwVWbMxJ1YnXrTrV/Oj8SpTEG5mIY3A5G4TzUrUitq1QnTcStTNWlbrUK3dbrUZ990TpyNOhdZjs+Uuv4zXgvZvs07ovL159mbkpClLRyNQcmpm6ai3atWp11a3UoytuSn17dKvM0LclGorUsW7c6hIdWfOvr3XTrpSM0pOpwMwLZ1GfbndaC8JoVrx+ddRicL2+FIHYUnwNxmlHLViIqEG49COHr45TiCNQpNQIYBuD8IYAtheDUE8DUDsnStWJijNzpq3EoiiUrTgCihGZ8XjUSjleIa8dhifDtKpC0lGYlU4QwJ4lRnwN0rNuYh+CeF4etxetH4pHYvSk4coQ3GojgqhJD8B2AzhNBTKwZgXgIKMTj8MwDWAUwzHIDsvXiktFZ1uPwIJCA1BeAdgSwrAFMGJmdA3AvD0A9CsfgHoB2IoBFRgmh6MS8ORBMUo5OmZOYj9CvCWjCSOQ5G+Ssx6tbq3WJ11e+WrxKpdEpSLQgisCOEkcgek4MwK4XhWPROOToKpaPReWmZuMUpa+pSloOQcqyFulddbuoy11i+vMSdeOWJGjaq2p86nMxSrQl68jw7EUCmIYFcLS0AogbpX2JS1K3wmn3x6PzFKtZnWJCzdRnXTrEjUumZ9OPU4nAttyUfgdpVL7VqO25CrIdOzGZCRoReNwNQ3A/zpinKVKcK1q9uOcTmIHYZh2jdI268MUq0OwDcNV5GhVg3B2CW+jVqwLwFMATwUS0EcIoBPH4T1e+zMwpGJqlOnR6Rk+Dcci8F4DGCWDczMS8FXByIoTS0xdAgj0fgL45JQVyENw7CeTkIpGrUZpwNS9qxOjkL0Z9KF7HHpGdWvpydmKzcDUBLY4KIgpQXlYNx2Fo9CCdQr150hYvnRq+UmbcQQDsShBDcagJJOhSk4ekIGZivTnT6luzUumbcxUrwXsVqFCTl4nD1uBbDUBjF5SfIw9I2ZOrJyEQQvDsKQG6NmdVkJWnBPCkFUtCGJQVzEI4MyMWgpp3QSQWQH4WjsORepdSgngHK0UnwkheBFOtzMOUKkKQT0YYkJGzHroYsz60+JQPxSG43My0PWYNcnIQYoQ/J87iVuZryMKUZaFaE3FL51eJyFKQl75LiUvL1Y7UsXXyM6+VoRDPgO05i+7ty8Tmo1bnz7dq+zRusSEtUoTqFqxYnc1OpRWIK8an0JSnC0EMGbExDMrDl9atNQEMdsWLE3Tmo7A5agsk4PWJmdXmr41CSdVn3U5K3IWbM+QnW7dC1OrXTpDi8zCKTkZuHa86tfan2almxN07qU+nCkSko/QtXTpCP0ZKjTqWbFaPzEvMxuXi8RSkUgxagHKlqBibmO67oUqEn2qFmhRt2p9OfajkGJ0XqRiWmo3AxLWZO3Oid0Wm+rM1YjiGE0hBmDsMRKKzpqMWbpmboRS3Ndq1JX24nddfYpXWr590zB2+tZsfdO7Vi3Tnz7deP0pG+3SkLElFo/XlrFibut32evGrcfox+FZeFY5JXT5u1F750jPkJ83atXVrdq1P7NG+lbtR23OjdG3fffbtTr6U6hSvunUL7NaxP+tfWsyljr0I/I0JChL39903dRtTVmpdTm6VuZnz7U3IWbNetYrTVKjShefN27FSRuus161iU6d83XusWJG661M2o5PrzdixTrz5qZkqklVtc6avmbq8nOkIUpVr74gil0DkhEr4/OsTq8RVb7FeaqU7VS1LzEVmO3FbV1mvQvnRju4lfHZuI601OrWqNu330OKUJ0lPlpjg/HaFKrM2aNC+vdRkOlENK3dbn9WN3XWfvmq1idPuvmo3Nd8QV6NGtPsV41ViknKSNSRvlLNilbt0JSjfOn2KtqjOnXWZ0takK0eoxOasz4YpWJCdVlr4lWmbF0hfHrMlVvpTo5FehbuqyMjQt3WZ9aH6/OvpXUKVmtd2LdGHqkjbp0brrVqlSutx+B+N17EepW68QT6FSUnyshVhPfdEq8GaM+JyNCFqNWrBiCOH5G/7FmlEdqPVKEhUgokLNS+FqUJ5u1KxaxCPqQGMpWg1JRWjCSvNwhgnlIMVpqCCRg/FpuaqRFVgxMw1ISM+ZgSy1SFq1GtDEhZmpGPxyHodgmgfgvdO59qpLXyd8NQpOjMlUrV6Nq3DkjPnTN1eRh2AsgxCGlA/KwP2qkZqS0hLRePR6F7rd0Qw7MctGIjhPbnVL6lvpX2rFG1FvkOMX9i6j1KEM0bUerTda6WpwUSE1KQzaiVqj0ZebkIek7NqIaVOJVJuIp0nbhFPheQoTudZtQiicKzqEzJWJ8nGJqpdB6vHa0P1LUpKTrMWuvjklYkbU1Eq9eaiVGSp1r5aRkpevWq3UOfF6NqvOn0LdGfN3VKHakJ9qhPqVozI9u63LWKXbko1ZrV7clE6dSao0JTkpOzd2q9e+vG6PIUJu1N27NifSiUTqU7Fq+Rq1+++O2pWNSkzA/UhefamIzYk7MfpR6pfYqToGoWi1aAwgYiczCWHIEM+hfX+3NWrc+xRn27FqhYrfYmqMpFJ1OnRtV5191ujRm6kUk7c+xYlJjo2rNS3akorSlbd1q1SnWJu1f3Wp8+TvofPvtTrU+Rh+3fSvoXWejUowxRur2ILYTwnvg9AF8AlgIYeg5DlGCSC2PQmn25CKwzCKLwJ7MC2C8V5GZqWb77VCzUmKE+1JX14MQ3Qt2qVCfdYsyszDlehH4VkJ1vnVa90vOmqkvClm6bmqEakIB+6+da4NSMSsSdKfI04rAntwasQEsxCe6BVKRqfK8Kdqjavn0759GpQtUbNXoUqUGJ8GpW3QsX31p0lbr33W77rXa591elfRv59qhZmqs6HrrFehFZiPyEzVp1o7Oszc+HI9dQpSdu1KxuC9qLQmmIB+CeXh+YjXEUKRmxVqxynHKMRzcemopCKEUHYJojnRyFYxA9B+A1MQxPikKRO6DMZi8MUbE+K8FsckorF69KQsRHRs0JCnDcB6Px+OxajL04zAgt0bc+6IZuH4hgzBHAbgP1pCOwmjsVtRaRk59qPw5UrT43PgORKG4ZpVoYhaCSzB6rEo7YrRKhbr0bEEMdpV5qFZOffHohlbp8T6E1bryNexXidaSnyESug7dCkftSczFbUKRmB2CG6K25qjAYwel4FkDEKwdq0pqdI2KU6jIzqcjOkp999aap8vWkboglYXlqkRz6sOyVG6nGKcThLYt2pi6dFZnnzoZhmCftTUXo0ZKzI0pCrJ2ZStbp1ZKO3x6Yr0piUj8Yui8xHpCpHZmJRqlUvnwVQBfXnyUZkKMRw1HKEhUtSle+Rs2ropKUYlMXRmjZuh2Io5AO0YTQvByjVl4VpwmmpGjH5SD0zHrU1XhBMwDcpB6BFATxmTrR+AlgJ4xEMzDkxCWHpSFYEMzUmacE0cmYRT4zWjkKQe4GboZswhm43XvmIT0oWpwrEEGoATIHICaANoZgtuk5CPxWdBuGqcdl58blq0PzchCChD1WPzNu6nYkYBdDEBNA7AKpaDcjClqD0LQJIhgEcFsCOvJTV8JZGrRj0zPgBbEMxIWpSxJyV06Zmo9N32avIRWZnR2dNTEtEV8YmZGMytCBbUgssxqB2GoUkoWkpGMwH4DKSi0Lw9A5BqxDMtQpzorJ2pKKwLy0aqVLNOPQBhUoytSjFYdhPZsw1BXA9AHohgvNxifOtS1mC2KTMtJ3V6d0zHJirRg5G4TxHKx6EUG5Wv0I9Qq0Z1qlE6tiasxOXhJLxW+ZuitmfPnX14LwV26V01x6lSmYvIXxKWryc6+1UoxeNw7GIN27rd1apfPhmAaxuE0nQqxKYtzd1uPUYVrRrvtUa86zSjcD1qIezGIBpXg9IUIjgR3QHYvBqQhHXk7cJKkB+IoR8e6MKwSx6A7XjlKak50akbEhSm7+zOnW59mjUh6GrM1atz4VpWYOT4rGoWlZOVqRW6dzEnfUs07VqjFo1fKQrDXz7uXpz5e+rfQjkrFZu+6XrRSzN1ofhBA9G69G+H7o9AvSlIK4KLE3YmYvTl7oGa9aOQ1JROxdNwalI1CtuKTUP2u1BZwHY5IX1Y/zVKHorCGJTVe1JzpWN93b6HfOka8fkpG1bus1aEdus0Zm1bsT7o/0qMhXty0CiNROjffOs0JWpRul5ufPo2a8E8FUrUus2LdOfNz5CbnU50+rZkb5uzfSrWbVa+t1aFCQrV7pu1Wt0p9uzRnW/vpX0aVqrzq0ahFNUZChWoy8eoWuK159ChYt251O3ao1rctN2Y7MSMzHLpqzUiVSjOoWIlQsyUWupdGapyNW3Tj1mhXkoLysjOlufZgzEEIo1FIUqxOzXmbdOFZ81fdStxatUkbp1StCabkKkLWrcjZu7c6PUaUak4tYj98KXTq1KpalpqFqUSrzo9OnWZOrxuHIrPmJDpR+pG5qTp2LNuhRr0JetbpUbUR2LNSrOvpzFKfasyF9mb7fXoVLVu+nbo0bdezbsU6fGqsdiVWSj8PR6bpTpaUutykhQnW49bi8dm68+f1qF/PoTU32ZqWk7EpOozc+J3zNG6UqRq1Os2Lo/M3xyEMRwhg1dM0aNK3Zuulp0ep0Kn2IVul50hNxqQt2Y1G+6PQ1HYvEcxNzMxRk76c+EcjardarPl5mSoxK+dfOs0qMxQo2pKTtdGRjVq6I5epZoVp1CvLx6vRsSUbmIgiVGhLR2PR6lEpidFY5UnRmAkiODF0B+CaVpcBZBDEN8B+lF4SQFFaPVasKxHUhSNy0OxOD9eG5npQxD8+E8IYaqRFJQUwLY7LQ7JQUwGEdgG5erGqsRxvqRuNxBRty9qTl7cpJWbERx2JQK45dJzoDsSjsWgPQJJ0bgYiduIq/atTd9eHo7Ga9mAisTcXjdOfbus0JHqTULRvlozQl4zUkJW1Rq15afandu1Dk6+Wj9WbtwZgxIUYhoycxNwzHaML2ZuSilWhHYRSM6tOhHN1IPT58KzpeXhuGKsSiGG5KRgPRuaiURWKsP1ZWzB2zWmpmalaU6WlLoii1WdIRSORKJxaZlZ81ErEfmYrTtVrrqFW1SnSEboykvOocjdI0pmzfQuqXzUhHqMzM0LUxJxu7mbUPw5ZiUvDVKvMx+zMzrMJJOVoxa1N8lIW5mZpWpqdMRmCiZma1CxJz51ShG4G7cJ5uGYrLyFeFo9VrwYgfj98jIVIOzdmKxuBmVsQrLQVRqnxOhYj0tMRKxO5110/sValSzXtSV8pToWJmF6FG3EqFi1LwrbtUaMer0KVWfUnykXkKE6f2rd1ShMW6NmfOnRixYvtWqszOikXoRWIbMvNTqNCN14pQ47Um7FOdF4bt3TUVpQ9JyHSm6lqAjhHCOBZCKGoC6DkYnwEkEMEsCCjLz5i3GpmIYCKNx2MyEtEczbt3z50+tzr6V1qdTpTFCdTmYUgqoVaPYkLrUSjt0NSdi1JRSAyiUGJ1u+ndDN9Pr3WpSFbNOMwD9KvUhWfZkotZjtHpUZ9edOrV6E3MUq8dvm5mnHuY5qO1OlPn2bde6vffz7VC+d1a86bnTU3CCA5NQ9FKE6RsTotMTqNa+zfKV6dCFb6M+zYtV77UxCtOCuOQahLAXxaQilCQr8MTd0RWasjG5OvD0nXgejUDlGF6cB6A3MXzNSbnQHIIoB6zA5CCA5JQdmZGMReB2xEcpJ06t8+vRtWbU+FY9TnUZW3atxu+O2aMbjsfiChN0avOkr4rEopEcUik+EE6RqS9SvRlbMJJeaicFN8DcvBqLwl5KLQ9XjtOpMyFGIYWgvPrwKZWAolpeE0PR6PSkRWa1WrUq0JuQj0tNzdqzQmpSFK1qfarSMPRPmqcASRWEcclotNQ1dUk5OHYnClqzXtxHBLRlq1mrNzrFWL0odqwzJylCDNqtQvtSdGVnyNuNU5KzPtX2INxm1CeDnAVQrSgXggk5G3VqS98Tt1LNqSrz6NWarc3TrVZCNVpKrC0lG5mHKsLTEVm68tUs06cOzEUm4tYr2I5KwtLQXnVbNW6rWvkat/YtR6H5mVowWwlmY5OupzMtZgM5OvBylHKMvG5SVpVqMBXDEL2rogg7L0JKA7IQNy0cviOBefB2AV2ZmIYAYwzAMI3AdpwORSCeHYWqTUxRg/A7ClSI7MLwNR23BPARQvAKoD0ARwE8CKAirQhmYLwWzMvAmrw7I14I4vEMMTUKxOlOlIpGpW1Rl4nMSkTiKxN2paDkRy99SH5W3EMAI9GOWrN0+RjcLRBEMNStWFLUFMQTFu1zp8pPicL2JGzOrTo/FY9DsIr7UrGqM+Pwv1IHrUWgrhmNwrCOG4zAWQ9Lx+vByzdSpy01GqMBfMy1CBBQ5WrfRhyRj0IrENw9D0YgbnQWzUjQlJODUFkjRgG4htSMGJapOq2IrMzofjdSzVpxyDMVmJ8jUmJWhPrxKjUlJenG4RXzV1u3QnXzrMlNUIO3TFSxMRqTi0+vXm76tC1GoPS0Us1ZuLQrAY0IS25WdA9dAEViAoj8DUtAcjEKweh+Px6dfPo2q1eWmrdiZiOJV6c1FYLIN14FNKTtSEWjED8HolAP1YQTEF7UeicdhFCsKwcoUZCA5CGIrNCJ2rUpYgogJIC+dE4SwQTcBqrFZaCuZlbc3XvmKM6zfOlbVqH5CzFu+h0r+bqz68DEAjmYbvjcSm5GTp30YpdD86fatX3d/R7duxTnRuBfpTcvJy90QRaDEfhLPkIYoRyFIPwLwWwlhJBmNTUUr0qElb7F8Gq18jZkrdW1Wm5SlOnQ/BZI0YWujEQwB2KXU4TV7pmKxKaiKBZfSgoiKFYWkLElK0Jad2KV0+jUs3Wrp1qnfbvn2atmjIVYzCWlIXWpm7ozp9KxYqzr6clYvq0q9aFYUqWak+dat069CnRtWK1KhZt177VuzYn1KFvq30b5e+dO5/NXSV1uZikXsTExNSs1OvuumLNqdQkKVutzufWsXyE6fdJWLcjYnTda+hTn0uOWKctN2pPqx/7FqblOYmp0/upWpG6TiUftU+J1rFWLUJajYoVbUYgzF/jd9WlEr50++1XkJ9u1OunWq91ufRoU7rPboyV1qb6fZk776NutYmZCzbkrq1qR7cbj9exNys+rarUrqdq332IUmZ19WfytWxPuvn1q83ITcZmeRl61GtOmZu+3R+jVo86van/QsVqV3dJyde6H+rdUjdGhF5iPwgjEnJwYj8+zOj9GfWrUZG3OvnSNufMQ5I2b61LrSnJVKFSzJUpuvXloUkIijFuYkoHoQ1ZSnUn3Uadjo2r683PpdOrdbulLFa6PV6sUu7qUckZrpzF91efVrS1K+xGrN9GxUocbkJ110+6JR+patz7di6Hbperb5idCaFrNu1dMz4hk51W+xXj0QVZKdNWZCShPNT5u+tdfMx61A7NSV9OXrU5mDMUiluZr3TUXi0pJxypJQc4Ug5EoirROhBiWh6EcRSk1Qs0aU+XiklZnWKEM2pO+nPusXzMMWpmSnRDCeEsGZOfFZmPxmjA3VhJDtKaiKhDc1D8vL2ID0xao160L16tS+fMVZmpTmI7QmZPn07VO3fSq2Y5LfTs0bEzLV7FuzYtTNm6nWvhidBivEFaP04YnS/Zr2ojt3QZnx2zNQXtSEhGZaMQtHZCrN0pC1bi1GUid0agzQhaCi3A7fQozcxNSUZrQrOmZ1uWnzN1ivYpVoeoVrr5qUnS9u+tfJVaMSn86ZvilKXlKFuzUqyFCpNT6V3Vs/LwpdOma06zZpycQU6VOfHY5WnROUoW51SLRmLWp9SZmZWVnVa1WdNToNQtVloMWITToKJiCWIIpGYDktD9KZnSsvEotBetarcnNS8dlK1iK0IbrVo7C8TqTqFmLUa1q3fHavIWZqGbrc3VoW7pq6nNWOXkIOSFelbp0qluxOkrViLcepW6MxTheQnWrd93dW5q3FqUXqzuTnVrNaJzVa1GaFmtQ+tN3XUqknKVpeP06dq6PzdWVkKNCB2tIwOQ5AlumpGxBezbheJRmGZC3Rg5AYT6lK3ABpAmgAGQegEcAkq1oejtuHorA9QhNC8AVQtAdgmhaHoK68vRt2ZO3fQs2pKrPr1eUvsVKVuLScjVoyMOzUatyVmxZsW7vqR6nN0KdaxI0KELykIpGhFZqpWpz5Dj0+xYmrNutTpWq8+3IxynIWpmhI2aV9OzYt3TEnfYvpRFD1iP14UgYqSEvdIyE6fMSMDc3Wuka9K3Ynx6fJWJm6vFLq9eQm4gi99evLyUrIVYBTD0CGBmPQOTcvHZeH4ZiCfam7+dffSloTVK8VnQdodqpUvr90SlYHr4MQV314Vgmg5AtgZgZgqtx6pVj9K1G4YlqszdXrUaNOSt90rTpU6Vu+6hfIX32q9ifyNexXsQXmZKdHZSMwkm68zEclH7UF4F+Vjt0pO47B6zBqCmKwhglrQclo9dFqsCub5SEUCDiKDNWvOr3059ivUvuo1ufdanVp3Wutc6jThWrVmaluN326MTiUQ3TMYgPTEQXTrMhfF59aQ4tWkYUheblKEHoA1pd8RwvfGpSfKUqMVm5GFZ8tH5CxUginQagmgOdWjIwvzc6fYlbF9KPzq9mtKQvZnTVe+aty1C6lC0hUtRKtBFGoElijFZe6vL06Mfm5G1NVojl5mYpxDGJqzN27MWs0JmfHozNwpN0LfanRqPxWBmWj0zKS0jFKliFY9BizasTUUjduIKl0CiBiD9uRh2O2qkSun0aVmRpR6vIx6I5eDHCWtLWoBBHJKtB2JQbgtgFspF5iCylbpwhjEnEoBfH4XgI4Qz4YhSAkicJIpIRWrFItZp31ITwZtScrMzpOCqBeJSVapAvB+nUqQ1BBA1ah2Vg7DECOG4CmlCeR5elfMycLRBdZtTpe1bvlolGLENw5xibszM6ddXoVJupalpuWmop38tEcKw9ByXt0LEGKVatFoFlKCy+A3Pjke4MRBAH6sDcBJDMOxFA1IxiFIMwnhaYi8zEclBytGJODUZhuT7MPULMLSsLQMS0EsnPhJQm50nButL0qE1A3L168TtwW3RaXitivFoZm6Vi+bkbNCtbtzFOlNTMrG5ejbi01JXzpKrRidmraoyFOHoRUZmSrRKrbjVqOWKMlfEoILoMzU+fViCOQzAmilmYmOUrW68ctR6bheWjtCFJuANYcgOTEBqnCsLQNy8BfBNAPzUUjkC2NxFJwHY3H6UDMfh6pMxL5OdA/SgMZaAgmYzdysMTo3bhmNQcjkP17NmnXpyNuddVkrFudOpRqFoaqWLMnYm+3OkZ9abtxOH6EWhiPQegQXTp86dfai9Cbp25u6WhSfS51mQnSk+bqwtJR/j06pFbMKQnlo9LTEpEUpJyPEoMyctH6UXmInRnzcOTcBybrxaD/fwrEEOyML0qcNTV8HaMCydAP2opYgHq9OvXjULTMKXQGELyseiUDs6hErNixzdKfRoS0I68+zRkb51qN0Z0cnXTFmF5q1JUrNmjffdRl7pCYvo1Lr76FixJxWSkpqRs06NKJ2I5Zn9i3StdurUo32Lrc6ldfdTuoUaE+1Ous9mpddGpqZhSGbcZvkLdOzI30ashOle6+vboVI/OnVLdu+rOt1ojjUr1YvP50tShnhLQg1NX9qdSsy8pZtxqMReOQfmoisRLtUJGNw/JwrRnzFqN04hiOtDs+3Zgzbo1I9fFuxQpWOQpTVStXundizYmLM6vddYs2rp99nukKPbn25Hs2KVe63JfahedD9iSn15mhKRB8O25aYi0jdK3zp8Un1J1ez2OfEfVmLU1KVL5CWsxe++lVtdudOtV6c63RmJ87s2rVmzzFeFb5981Ti0+hdUmYUhJVhmJUoxLUIbhFBZfF5ijHrolUqz4rQjNenVt26krHpqZj1uFb4lRs2a0vSqwioQpAN05CYqW6NidQuvsTVKjbvpStifan2burZo2bdrrXVqMMx6Ql5inJWZC3dZsSs3Vi8xan2L5uSnW5a1UvjdCvdGbHOj9G1MRinBeBTCOMQtRiKdfThDai0J4htysGI3bistGI7BZIRFYjszGaElMxDMyFuzHoRwvHqUKzcI5exFYzJTq0bkbXJVoU5mYgWTVuF4OSEtBmnZg/AqtQWXVIvDcM1orMUZmvfVgZhPfavqVpabp1Zu+jbq3Q/JV6MKR2EkTgEETmoZughislBDSi8XjFWjfVi8tE6kvQmZa+O3S0bjVGZoTqMvXtT4rZjt8Sm6shHZqlHpSUilmPToZoQMWZqWvnVInBXfYrwchmtUkbEPQ7CkLxHJxWL1pifBmbtykepToGYKY5ahaamYUiUvHIr3zpSUq3yNGzH6sGakxJQki9KdMRWdahSTpzpKtN16EnOn0rN90nHbNafdYr2LduQpzr4nMW77pC+lyVadRt06EhCta/nSMjXhLPjcC2hAJZ1W3Nzp98TumrVWXgNRiHJCnXsxWXq0K8dpwetQ/fCt1CO/aj9qJU6VO+bikE8blIG5KMQ1AjgtoT4Ug/arSVSWgfnxarA/Lw7Wm47xefdByh07qEKxmzSjE3N2I9OlbFOGYF++l15ipK06cvyt0K160RdO327Xal6FGaiCfCktTt2ZCnXj8HZmdNykTgtj8ASQkrTcjGZ1K+3OjtibhqOX04jsWaHIT4atRqrC03anx6zBe3XrxW+Qn1+zQgPw9MQAD4EsFlO6dbhWD8bloEknCaBRP51i+66fa6UtTmoAog/C8AA6FoBjF4/Adg1DUD0M3w3Gp8ThSHp1C+3DMCqd9mvYun0p8rCetEViSgrrSULX1J8Sp2urJ3SdCpPn1KF1WGJuEsKxSQnz75O3HIFdaBuzWurUKlvn2JqM2r5udLW586pE7UlOs2JCV5C66RmLED0LwxButOrd/S58+fzunX7VudRp2a9mfNUZqjHq8Ky8+fTm+DM+zTqW77qNSI4lYg3C0IJOtEdSbi01IxKvA1YhBDsCGQr1IH7Nm+P24Uj0WhLByCmIIMQPxuJQxHpmjHJGzZt9StYm6FijShedK8WsUZ8es3du1PnW7dC1fQqzNafXpWr768ja+fOl4tWloVmZ8hzFepdRgOQKoMxFDFGDkLzctMUZqhHpazHLdKrGb7NGxH5CNQ7ToX04KOahPPo0J1/bryFC6PdufSn2pKrfPicRQG5W1J31f7EMRHAqgNxHSiCBqYgmjkXhLMQkgcghjMXh+To911WjQsytWTtRFTjVqAPwpB2G4YqzcGISScC8MwGUDM+dH74pM325qtandmd1r6lufNWJCjQr1akvN1K9iKU4SzovwijUrTi1OnZkJuQhe3VhWZtT49My86at9mnMz47KRqar32ZGbrR+VmKctQtR2BVB2H7rEcmoaiKrEcRxKVq0YLIOwngK7FCnGZifUnyUL3wnhyGYS1ojjUfsxyNVYvVm6EASy8I5iRtxFOiVqRswguhLAxARxuSr04/Ha0LQfg7LRWYjUzbh2BibnXyUEMAtmp1iZmonTrVJ0JYZiOP0K9CGY1Ph+GoiqR6AHcDUVgIICrhWXkYNQMStiVo2J0ag1C0JLE+1blIZmYZtwI6kLx6DPQlYPxyA5H50zbjNKah+tEoGIzByThmhF4vKwxOowrOituJW+pTlY9N1oC+PQGoaqwS8vMxWYiUHIrUsRKE0vBVARx+NwSS11ilH7dSbhHJQ3QgvEEBVZk4FdmRq2ZiByA1E4YlIWiUrFZPq0YrD9OhJ0ZazMUZ0LRqxKycfpR6dzM1OmK8DVuTj8Qx+xWq2pu1HqVG+x1qVCP2LEEFCTh+BqZhJPkLEGa8JakjRjc3JcDkzYoQdvs1LrdunVh2BZalbdmpA3dKSEavoWZShDkHIRQhgvBiAFcxAAKhaKQngRTqcag9ThyGoX+rBJEoAZSkclID0nGJOlC8GZSUupTFvqw3BPxDISFq3SisIoJ69CxYm5SrBVEpG6tRt2pGpEFazYtW5063btU4flb4vEdSxJSsVi0zAkqwVxWGYKIAmuh+KS8DsM0b7p0Sow7B2CyCiEU6PwNzc+IpCdH4D0enRaCuhD0Ws07Vq6rYpVa6gAQAAWoEBALAH9AeA/////////////////////////////////////////////////////////////////////////////7/++hoSBwIgIIANgQEAAAAAAAAAAQDuAgAAVfALAAAAAAAEYYYYYYYYccccccggggggggkkkkkkkkkkooooooooososssssssssssssswwwwwwww0www000000000000000044004004444404444889BA4889BA9A889E9BI9BBFFBFFFJBBFBJJBLtBJLtJFHtJEBEBLtJLtJHtJJH1JFH8BS7SSAS/B0gEvwdL8ESS/BEfwlL/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8sS/BUUvEgEkvEvEu0Eu0QEkgEkgEUu0UUkgEkkkUkAEEkgEAEEgEgEkUUQEgEEEEkETwEgEUUkgEUEUUEUkEED0UEUDz0Dj0Dz0UTzzz0Tzjzz0DzjzzjjjjzjjjjjjjjTTTTTTTTTTTTTTTTTTTTDDDDDDDDDDDDDDCyyyyyyyyyyyyiiiiiiiiiiSiSSSSSSSCSCCCCCCBxxxxxxxhhhhhhhkSB+cqVZOl0J2Zn5O7xuvQuWbl2xSnqsnWsVJy7UgjsT0XvQ1Sks5ZtVqNi/HLtyfk+7Rv07tapSvT1eElSpfo0u5ck792ftyCEFKLylaxF7FnjN+vRpXbEJZy9duz92X6crbvyluSUZS3Ja9bp1qF6jeu37kEXdoXZmrS7turbjdyds2KMpUv3LtClSvXu7fgS37l+3fu3567dvXK9+jbr0Kdu3QvVL1O3ft2L8CaHqUrYoVaFG50a927b6Fa3Q71i9Vv8/Nz1WBZYkkXozlSvc701bqUKNmhfiqrO0qtOhP0ak7apwFFLsVL1+9ao2rtq1Q5qxTo2rXJ2KF+zap8kgElG7LUrtDoX7t+9353pUL96927v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gVw1BpATQ3AAagFkMImhFAjRmIYXwYQD8F8E0G8GUMLVqNTt2VhXMQKIDqBZAO4NYLo1ALoHsPwcwD8Wi0vRkErNQjgIoWQKZyLyCG4LIBRCuEV+QQSRPUjlCHZ+tCelBzDMnAAwgH5SPwVQ3CeBPBFAiQPI1AEUCeVhfCGJIDyUiKXgUQcxDB2RQQQM7E/FUljMBpAlgXxeMz8tNQw+Oxq/Oy0jqSlS3Xn5iORqvCujIYho3rlKcsVbUdp1IJZ23KzMKonimBJbuUK05eiKAdwF0NTMIItPx+BVH4ij8fvQnhfJa1a9UiaC+ahyNyd6KqVyNwkn4tdvW5uRT8Wj1Hj8aksnCirekViRyS3HZOxDM5M1JFXlKUpJJDYr2YQSC7MzFSZpUfr9qWmoas37lyzXv2+1Qq0KdChSo0rd6pfpR+BLcoDAAQAARXcBALEH8wfg/////////////////////////////////////////////////////////////////////////////397UJHKBo6B+nYBAAAAAAAAAAEA1QIAAIigCwAAAAAABFGGGGGHHHHHHHIIIIIIIIIJJJJJJJJKKKKKKKKKKKKKLLLLLMLLLLLLMMMMMMMMMMNMNMNNNNNNNNNNNNOOOOOOONOPNOPPPOOOPOOOPOPPQOPPPPPQQQRPQPSPRQPPPSRQPSSASQSSQQRSRSARASQRRSASSS7SASQS7QSQQSS7SSRSS7S/AEgEkvwBL8ASS/DUvwNLxL5IBL5L/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9TSS9SAS/A0kke0vEu0UvkkkgEkUvUkvwBD49JJFJEBFJFEA9JFJFABE9BFI9E889A89E889BA4A88888444444844044400440000000000000www0wwwwwwwwwwssssssssssssoooooooooookkkkkkkgggggggcccccccYYYYYUVECCahSoW0aPQoW20e2zdfVlruSvsUp+2vZk47BJB6Ws07q9ehPUZyfkc5N0bFGQWYRRSUvgbXwdtnrEjghlo3Tvs1+bm5qai0YqclfbfdffSsWK11Gt0ITUZuP2YJaEesxmasylCUvs2LN91KlSo0I7BXfBBGeEnZoSU9ynYn5m6Vl6Vet9ixVs2LaNeekuWghhXSmLbMekrrNaF9eMyV10W+fk61a+hdV6tGjAjrUO6SoXXc/Zvpdi+lRtttoUK9b699GhAnsUO2etkrN1ipX7ra05Wk75KlK30OrYr9aAgs21KEn1OrbQoUqN1iLUa1exdJ16N19ehIrEBNSr2bNizdYumYvRq8nfYrUadttCjQpW31aVGAnv7+lToWbrNGxdWts1KNbupUrq9DtuvtgEVtttaI7pez317b56R2aUlfZoW16VG+xRp2eAuk7qda+6hVlbrF0p1Z+hXsW306l1SRz18rGYvALZBPzFmdqXX3yk7Pz85UrXxiUqTcl2xWVhbSk6M9AEk/Ia0lJ/MylGlPz83NyK2Zgvn5OHrZ2+tG5udtqQAEKkhnKs/HpyQQxnYJpqORHKxDD81BfDUBTGJ2vQkUE87M33QAIo3SugxgZwMakDaZg5EEC2GM5F52ckFHpRLCWAklJOvJUJiXgAMQanoVWYmnaV8VvsxHAa2ysNQliCpThhUhLKweiCGYvIp+EcAUykvNy8Rw3II3GJmGpWJYtCCUsQMoD2XgI4PVLZ2UlJKjR4AHrFetP1raFvdVvk7aUlf0Kd1mxdbSr99tmAB6Yp2LrF189bZvs0aF07YsWa9KrM21brrFKxH4AIIG1G2J5HDUQWIM5yJehRg3WnJDMx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Q9FYjlq07JT0UsQksSGzPUYQwZ2wjhbNVefsTNKRz1WzYryt0nbF5+OdmVsUa909P2yUelZDM0rMtTo31uSm76linIpDfXtrzMOT8Xk4LKcWhVCWDGFUA3gJJmI60UgPqcF8UgcwLOABAADQUAEAswfPB/j//////////////////////////+9/fz0yDBMQq1ABAAAAAAAAAAEAfAIAANJwCgAAAAAABFFGGGGHHHHHIIIIIJJJJJJJJKKKKKKKKKLKLLLLLLLLLMLLMMMMMMMNMMNMMMNNNNNNNNOOOOOPOOPOPPPPSPPPPPQRRRPQRPSQSQQARSRQASAQASS7SAR7SS+RRRAQ/AEfkQEAEUf///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tEBFFDxHtFHxBFDxFFHtABFFBBA9A9BBBBBAA89A848888444444444440000040000wwww00wwwwwwwsswsssssssooooooookkkkkkkkgggggggccccccYYYUUREgQ1S94tE4+uuWvenOnyPIXmys7/pcTvFOA/eqbMwloQxZRn0qobn0b12XlrIxK2zMjFZ/bZAgsgniUSk4W4lSoys3rqnXtmbK6UaoxOQtl41HyEB/kps2qYmapG9c62v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\",type:rt.TEXTURE_EXR}};var it;!function(e){e.ObjectClicked=\"object-clicked\",e.ObjectDoubleClicked=\"object-doubleclicked\",e.DownloadComplete=\"download-complete\",e.LoadComplete=\"load-complete\",e.LoadProgress=\"load-progress\",e.UnloadComplete=\"unload-complete\",e.LoadCancelled=\"load-cancelled\",e.UnloadAllComplete=\"unload-all-complete\",e.Busy=\"busy\",e.SectionBoxChanged=\"section-box-changed\",e.SectionBoxUpdated=\"section-box-updated\",e.FilteringStateSet=\"filtering-state-set\",e.LightConfigUpdated=\"light-config-updated\"}(it||(it={}));const lt={enabled:!0,castShadow:!0,intensity:5,color:16777215,elevation:1.33,azimuth:.75,radius:0,indirectLightIntensity:1.2,shadowcatcher:!0};class at{constructor(e,t){this.spoofIDs=!0,this.NodeConverterMapping={View3D:this.View3DToNode.bind(this),BlockInstance:this.BlockInstanceToNode.bind(this),Pointcloud:this.PointcloudToNode.bind(this),Brep:this.BrepToNode.bind(this),Mesh:this.MeshToNode.bind(this),Point:this.PointToNode.bind(this),Line:this.LineToNode.bind(this),Polyline:this.PolylineToNode.bind(this),Box:this.BoxToNode.bind(this),Polycurve:this.PolycurveToNode.bind(this),Curve:this.CurveToNode.bind(this),Circle:this.CircleToNode.bind(this),Arc:this.ArcToNode.bind(this),Ellipse:this.EllipseToNode.bind(this),RevitInstance:this.RevitInstanceToNode.bind(this),Text:this.TextToNode.bind(this),Dimension:this.DimensionToNode.bind(this)},e||We.warn(\"Converter initialized without a corresponding object loader. Any objects that include references will throw errors.\"),this.objectLoader=e,this.lastAsyncPause=Date.now(),this.activePromises=0,this.maxChildrenPromises=200,this.tree=t}async asyncPause(){Date.now()-this.lastAsyncPause>=100&&(this.lastAsyncPause=Date.now(),await new Promise((e=>setTimeout(e,0))))}async traverse(e,t,r,n=null){if(await this.asyncPause(),null===t||\"object\"!=typeof t)return;t.referencedId&&(t=await this.resolveReference(t));const i=[];if(Array.isArray(t)){for(const l of t){if(\"object\"!=typeof l)break;if(this.activePromises>=this.maxChildrenPromises)await this.traverse(e,l,r,n);else{const t=this.traverse(e,l,r,n);i.push(t)}}return this.activePromises+=i.length,await Promise.all(i),void(this.activePromises-=i.length)}const l=this.tree.parse({id:n?this.getNodeId(t):e,raw:Object.assign({},t),atomic:!0,children:[]});null===n?this.tree.addSubtree(l):this.tree.addNode(l,n);const a=this.getSpeckleType(t);if(this.directNodeConverterExists(t))try{return await this.convertToNode(t.data||t,l),void await r(null)}catch(e){We.warn(`(Traversing - direct) Failed to convert ${a} with id: ${t.id}`,e)}const s=t;let u=this.getDisplayValue(s);if(l.model.atomic=!!u,u){if(Array.isArray(u))for(const e of u){const n=await this.resolveReference(e);n.units||(n.units=t.units);const i=this.tree.parse({id:this.getNodeId(n),raw:Object.assign({},n),atomic:!1,children:[]});await this.convertToNode(n,i),this.tree.addNode(i,l),await r({})}else{u=await this.resolveReference(u),u.units||(u.units=t.units);try{const e=this.tree.parse({id:this.getNodeId(u),raw:Object.assign({},u),atomic:!1,children:[]});await this.convertToNode(u,e),this.tree.addNode(e,l),await r({})}catch(e){We.warn(`(Traversing) Failed to convert obj with id: ${t.id} — ${e.message}`)}}if(t.speckle_type.toLowerCase().includes(\"builtelements\")){const n=this.getElementsValue(t);return void(n&&(i.push(this.traverse(e,n,r,l)),this.activePromises+=i.length,await Promise.all(i),this.activePromises-=i.length))}}for(const t in s)if(\"__parents\"!==t&&\"bbox\"!==t&&\"__closure\"!==t&&![\"displayMesh\",\"@displayMesh\",\"displayValue\",\"@displayValue\"].includes(t)&&\"object\"==typeof s[t]&&null!==s[t])if(this.activePromises>=this.maxChildrenPromises)await this.traverse(e,s[t],r,l);else{const n=this.traverse(e,s[t],r,l);i.push(n)}this.activePromises+=i.length,await Promise.all(i),this.activePromises-=i.length}getNodeId(e){return this.spoofIDs?Pe():e.id}async dechunk(e){if(!e||0===e.length)return e;if(!e[0].referencedId)return e;const t=[];for(const r of e){const e=await this.objectLoader.getObject(r.referencedId);t.push(e.data)}return[].concat(...t)}async resolveReference(e){if(e.referencedId){return await this.objectLoader.getObject(e.referencedId)}return e}getSpeckleType(e){const t=this.getSpeckleTypeChain(e);for(const e of t){if(e in this.NodeConverterMapping)return e}return\"Base\"}getSpeckleTypeChain(e){let t=[\"Base\"];return t=e.data?e.data.speckle_type?e.data.speckle_type.split(\":\").reverse():t:e.speckle_type?e.speckle_type.split(\":\").reverse():t,t.map((e=>e.split(\".\").reverse()[0]))}directNodeConverterExists(e){const t=this.getSpeckleTypeChain(e);for(const e of t){const t=e in this.NodeConverterMapping;if(t)return t}return!1}async convertToNode(e,t){e.referencedId&&(e=await this.resolveReference(e));try{return this.directNodeConverterExists(e)?await this.NodeConverterMapping[this.getSpeckleType(e)](e,t):null}catch(t){throw We.warn(`(Direct convert) Failed to convert object with id: ${e.id}`),t}}getDisplayValue(e){const t=e.displayValue||e[\"@displayValue\"]||e.displayMesh||e[\"@displayMesh\"];if(t){if(Array.isArray(t)){const r=t.filter((e=>e));return t.length!==r.length&&We.warn(`Object ${e.id} has null display values which will be ignored`),r}return t}return null}getElementsValue(e){return e.elements||e[\"@elements\"]}getBlockDefinition(e){return e[\"@blockDefinition\"]||e.blockDefinition||e.definition||e[\"@definition\"]}getBlockDefinitionGeometry(e){return e[\"@geometry\"]||e.geometry}async View3DToNode(e,t){e.origin.units=e.units,e.target.units=e.units}async displayableLookup(e,t){if(this.directNodeConverterExists(e))await this.convertToNode(e,t);else{const r=this.getDisplayValue(e),n=this.getElementsValue(e),i=[...r||[],...n||[]];for(const e of i){const r=await this.resolveReference(e),n=this.tree.parse({id:this.getNodeId(r),raw:Object.assign({},r),atomic:!1,children:[]});this.tree.addNode(n,t),await this.displayableLookup(r,n)}}}async BlockInstanceToNode(e,t){const r=await this.resolveReference(this.getBlockDefinition(e));t.model.raw.definition=r;for(const n of this.getBlockDefinitionGeometry(r)){const r=await this.resolveReference(n);r.id=r.id+t.model.raw.transform.id;const i=this.tree.parse({id:this.getNodeId(r),raw:Object.assign({},r),atomic:!1,children:[]});this.tree.addNode(i,t),await this.displayableLookup(r,i);const l=this.getElementsValue(e);if(l)for(const r of l){const n=await this.resolveReference(r),i=this.tree.parse({id:this.getNodeId(n),raw:Object.assign({},n),atomic:!1,children:[]});i.model.raw.host=e.id,this.tree.addNode(i,t),await this.displayableLookup(n,i)}}}async RevitInstanceToNode(e,t){const r=async(e,r)=>{if(e)for(const n of e){const e=await this.resolveReference(n),i=this.tree.parse({id:this.getNodeId(e),raw:Object.assign({},e),atomic:!1,children:[]});r&&(i.model.raw.host=r),this.tree.addNode(i,t),await this.convertToNode(e,i)}},n=await this.resolveReference(e.definition);t.model.raw.definition=n,await r(this.getElementsValue(n)),await r(this.getDisplayValue(n)),await r(this.getElementsValue(e),e.id)}async PointcloudToNode(e,t){t.model.raw.points=await this.dechunk(e.points),t.model.raw.colors=await this.dechunk(e.colors)}async BrepToNode(e,t){try{if(!e)return;let r=this.getDisplayValue(e);if(Array.isArray(r)&&(r=r[0]),!r)return;const n=await this.resolveReference(r),i=this.tree.parse({id:this.getNodeId(n),raw:Object.assign({},n),atomic:!1,children:[]});await this.convertToNode(n,i),this.tree.addNode(i,t),delete e.Edges,delete e.Faces,delete e.Loops,delete e.Trims,delete e.Curve2D,delete e.Curve3D,delete e.Surfaces,delete e.Vertices}catch(t){throw We.warn(`Failed to convert brep id: ${e.id}`),t}}async MeshToNode(e,t){e&&(e.vertices&&0!==e.vertices.length?e.faces&&0!==e.faces.length?(t.model.raw.vertices=await this.dechunk(e.vertices),t.model.raw.faces=await this.dechunk(e.faces),t.model.raw.colors=await this.dechunk(e.colors)):We.warn(`Object id ${e.id} of type ${e.speckle_type} has no face data and will be ignored`):We.warn(`Object id ${e.id} of type ${e.speckle_type} has no vertex position data and will be ignored`))}async TextToNode(e,t){}async DimensionToNode(e,t){const r=[...this.getDisplayValue(e)];for(const e of r){const r=this.tree.parse({id:this.getNodeId(e),raw:Object.assign({},e),atomic:!1,children:[]});this.tree.addNode(r,t),await this.convertToNode(e,r)}const n=JSON.parse(JSON.stringify(e));n.plane=n.RhinoProps.plane;switch(this.getSpeckleTypeChain(n)[0]){case\"LengthDimension\":n.plane.origin=n.position;break;case\"DistanceDimension\":case\"AngleDimension\":n.plane.origin=n.textPosition}n.speckle_type=\"Objects.Other.Text\";const i=this.tree.parse({id:this.getNodeId(n),raw:n,atomic:!1,children:[]});this.tree.addNode(i,t),await this.convertToNode(n,i)}async PointToNode(e,t){}async LineToNode(e,t){t.model.raw.start=Object.assign({},e.start),t.model.raw.end=Object.assign({},e.end)}async PolylineToNode(e,t){t.model.raw.value=await this.dechunk(e.value)}async BoxToNode(e,t){}async PolycurveToNode(e,t){t.model.nestedNodes=[];for(let r=0;r{await this.converter.asyncPause(),i++})),t=!1,n=e.totalChildrenCount),r++,this.emiter.emit(it.LoadProgress,{progress:r/(n+1),id:this.objectId})}l&&await l,We.warn(`Finished downloading object ${this.objectId} in ${(performance.now()-e)/1e3} seconds`),this.emiter.emit(it.DownloadComplete,this.objectUrl),0===i&&(We.warn(`Viewer: no 3d objects found in object ${this.objectId}`),this.emiter.emit(\"load-warning\",{message:`No displayable objects found in object ${this.objectId}.`}))}cancelLoad(){this.cancel=!0}dispose(){this.loader.dispose()}}class ut{constructor(){this._events={}}on(e,t){this._events[e]||(this._events[e]=[]),this._events[e].push(t)}removeListener(e,t){if(!this._events[e])return;this._events[e]=this._events[e].filter((e=>e!==t))}emit(e,...t){if(!this._events[e])return;this._events[e].forEach((e=>{e(...t)}))}dispose(){this._events=null}}let dt;function pt(e){return e.isOrthographicCamera}!function(e){e[e.NONE=0]=\"NONE\",e[e.ROTATE=1]=\"ROTATE\",e[e.TRUCK=2]=\"TRUCK\",e[e.OFFSET=3]=\"OFFSET\",e[e.DOLLY=4]=\"DOLLY\",e[e.ZOOM=5]=\"ZOOM\",e[e.TOUCH_ROTATE=6]=\"TOUCH_ROTATE\",e[e.TOUCH_TRUCK=7]=\"TOUCH_TRUCK\",e[e.TOUCH_OFFSET=8]=\"TOUCH_OFFSET\",e[e.TOUCH_DOLLY=9]=\"TOUCH_DOLLY\",e[e.TOUCH_ZOOM=10]=\"TOUCH_ZOOM\",e[e.TOUCH_DOLLY_TRUCK=11]=\"TOUCH_DOLLY_TRUCK\",e[e.TOUCH_DOLLY_OFFSET=12]=\"TOUCH_DOLLY_OFFSET\",e[e.TOUCH_ZOOM_TRUCK=13]=\"TOUCH_ZOOM_TRUCK\",e[e.TOUCH_ZOOM_OFFSET=14]=\"TOUCH_ZOOM_OFFSET\"}(dt||(dt={}));function ot(e,t=1e-5){return Math.abs(e){const n=Math.pow(.95,-e*this.dollySpeed),i=this._sphericalEnd.radius*n,l=this._sphericalEnd.radius,a=l*(e>=0?-1:1);this.dollyTo(i,!0,.9),this.infinityDolly&&(i{const n=Math.pow(.95,e*this.dollySpeed),i=Math.pow(.95,-e*this.dollySpeed),l=this._sphericalEnd.radius*i;this.dollyTo(l,!0,.9),this.zoomTo(this._zoom*n,!1,1),this._didDolly=!0,this.dispatchEvent({type:\"controlstart\"}),this.dollyToCursor&&(this._dollyControlAmount=this._zoomEnd,this._dollyControlCoord.set(t,r))}}static install(){St=new t,ht=new t,Vt=new t,mt=new t,zt=new t,Xt=new t,vt=new t,ft=new t}get hasRested(){return this._hasRested}set isTrucking(e){this._isTrucking=e}zoomTo(e,t=!1,n){this._zoomEnd=r.clamp(e,this.minZoom,this.maxZoom),this._needsUpdate=!0,this.overrideZoomLerpRatio=t?.05:n,t||(this._zoom=this._zoomEnd);const i=!t||ct(this._zoom,this._zoomEnd,this.restThreshold);return this._createOnRestPromise(i)}dollyTo(e,t=!0,n){const i=this._sphericalEnd.radius,l=r.clamp(e,this.minDistance,this.maxDistance);if(this.colliderMeshes.length>=1){const e=this._collisionTest(),t=ct(e,this._spherical.radius);if(!(i>l)&&t)return Promise.resolve();this._sphericalEnd.radius=Math.min(l,e)}else this._sphericalEnd.radius=l;this._needsUpdate=!0,this.overrideDollyLerpRatio=n,t||(this._spherical.radius=this._sphericalEnd.radius,this._didDolly=!0,this.dispatchEvent({type:\"controlstart\"}));const a=!t||ct(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(a)}update(e){this._hasRestedLastFrame=this._hasRested;const t=this._state===dt.NONE?this.dampingFactor:this.draggingDampingFactor,n=Math.min(t*e*60,1),i=this._sphericalEnd.theta-this._spherical.theta,l=this._sphericalEnd.phi-this._spherical.phi,a=this._sphericalEnd.radius-this._spherical.radius,s=vt.subVectors(this._targetEnd,this._target),u=ft.subVectors(this._focalOffsetEnd,this._focalOffset);if(ot(i)&&ot(l)&&ot(a)&&ot(s.x)&&ot(s.y)&&ot(s.z)&&ot(u.x)&&ot(u.y)&&ot(u.z)?(this._spherical.copy(this._sphericalEnd),this._target.copy(this._targetEnd),this._focalOffset.copy(this._focalOffsetEnd)):(this._spherical.set(this._spherical.radius+a*(this.overrideDollyLerpRatio?this.overrideDollyLerpRatio:n),this._spherical.phi+l*n,this._spherical.theta+i*n),this._target.add(s.multiplyScalar(n)),this._focalOffset.add(u.multiplyScalar(n)),this._needsUpdate=!0),0!==this._dollyControlAmount){if(this._camera.isPerspectiveCamera){const e=this._camera,t=St.setFromSpherical(this._sphericalEnd).applyQuaternion(this._yAxisUpSpaceInverse).normalize().negate(),n=ht.copy(t).cross(e.up).normalize();0===n.lengthSq()&&(n.x=1);const i=Vt.crossVectors(n,t),l=this._sphericalEnd.radius*Math.tan(e.getEffectiveFOV()*r.DEG2RAD*.5),a=(this._sphericalEnd.radius-this._dollyControlAmount-this._sphericalEnd.radius)/this._sphericalEnd.radius,s=St.copy(this._targetEnd).add(n.multiplyScalar(this._dollyControlCoord.x*l*e.aspect)).add(i.multiplyScalar(this._dollyControlCoord.y*l));this._targetEnd.lerp(s,a),this._target.copy(this._targetEnd)}else if(pt(this._camera)){const e=this._camera,t=St.set(this._dollyControlCoord.x,this._dollyControlCoord.y,(e.near+e.far)/(e.near-e.far)).unproject(e),r=ht.set(0,0,-1).applyQuaternion(e.quaternion),n=r.dot(e.up),i=ot(n)?-t.dot(e.up):-t.dot(e.up)/n,l=Vt.copy(t).add(r.multiplyScalar(i));this._targetEnd.lerp(l,1-e.zoom/this._dollyControlAmount),this._target.copy(this._targetEnd)}this._dollyControlAmount=0}const d=this._collisionTest();this._spherical.radius=Math.min(this._spherical.radius,d),this._spherical.makeSafe(),this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target),this._camera.lookAt(this._target);(!ot(this._focalOffset.x)||!ot(this._focalOffset.y)||!ot(this._focalOffset.z))&&(this._camera.updateMatrix(),mt.setFromMatrixColumn(this._camera.matrix,0),zt.setFromMatrixColumn(this._camera.matrix,1),Xt.setFromMatrixColumn(this._camera.matrix,2),mt.multiplyScalar(this._focalOffset.x),zt.multiplyScalar(-this._focalOffset.y),Xt.multiplyScalar(this._focalOffset.z),St.copy(mt).add(zt).add(Xt),this._camera.position.add(St)),this._boundaryEnclosesCamera&&this._encloseToBoundary(this._camera.position.copy(this._target),St.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse),1);const p=this._zoomEnd-this._zoom;this._zoom+=p*(this.overrideZoomLerpRatio?this.overrideZoomLerpRatio:n),this._camera.zoom!==this._zoom?(ot(p)&&(this._zoom=this._zoomEnd),this._camera.zoom=this._zoom,this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0,this._didZoom=!0):this._didZoom=!1;const o=this._needsUpdate;return o&&!this._updatedLastTime?(this._hasRested=!1,this.dispatchEvent({type:\"wake\"}),this.dispatchEvent({type:\"update\"})):o?(this.dispatchEvent({type:\"update\"}),!(ot(i,this.restThreshold)&&ot(l,this.restThreshold)&&ot(a,this.restThreshold)&&ot(s.x,this.restThreshold)&&ot(s.y,this.restThreshold)&&ot(s.z,this.restThreshold)&&ot(u.x,this.restThreshold)&&ot(u.y,this.restThreshold)&&ot(u.z,this.restThreshold))||this._hasRested||this._isTrucking||pt(this._camera)&&this._didZoom||(this._hasRested=!0,this.dispatchEvent({type:\"rest\"}))):!o&&this._updatedLastTime&&this.dispatchEvent({type:\"sleep\"}),this._didDollyLastFrame&&(!(ot(i,this.restThreshold)&&ot(l,this.restThreshold)&&ot(a,this.restThreshold)&&ot(s.x,this.restThreshold)&&ot(s.y,this.restThreshold)&&ot(s.z,this.restThreshold)&&ot(u.x,this.restThreshold)&&ot(u.y,this.restThreshold)&&ot(u.z,this.restThreshold))||this._isTrucking||pt(this._camera)&&this._didZoom||(this.dispatchEvent({type:\"rest\"}),this._didDollyLastFrame=!1)),this._didDolly&&(this._didDolly=!1,this._didDollyLastFrame=!0),this._updatedLastTime=o,this._needsUpdate=!1,o&&!this._hasRested}}class qt{constructor(t){this.viewer=t,this.camera=new e.PerspectiveCamera(55,window.innerWidth/window.innerHeight),this.camera.up.set(0,0,1),this.camera.position.set(1,1,1),this.camera.updateProjectionMatrix();const r=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight;this.orthoCamera=new e.OrthographicCamera(-50*r/2,50*r/2,25,-25,.001,1e4),this.orthoCamera.up.set(0,0,1),this.orthoCamera.position.set(100,100,100),this.orthoCamera.updateProjectionMatrix(),ye.install({THREE:e}),bt.install(),this.controls=new bt(this.camera,this.viewer.container),this.controls.maxPolarAngle=Math.PI/2,this.setupWASDControls(),this.cameras=[{camera:this.camera,controls:this.controls,name:\"perspective\",active:!0},{camera:this.orthoCamera,controls:this.controls,name:\"ortho\",active:!1}],this.orbiting=!1,this.controls.addEventListener(\"transitionstart\",(()=>{this.orbiting=!0})),this.controls.addEventListener(\"controlend\",(()=>{})),this.controls.addEventListener(\"rest\",(()=>{setTimeout((()=>{this.orbiting=!1}),400)})),window.addEventListener(\"resize\",this.onWindowResize.bind(this),!1),this.onWindowResize()}get activeCam(){return this.cameras[0].active?this.cameras[0]:this.cameras[1]}set activeCam(e){if(\"perspective\"===e)this.setPerspectiveCameraOn();else{if(\"ortho\"!==e)throw new Error(`'${e}' projection mode is invalid. Try with 'perspective' or 'ortho'.`);this.setOrthoCameraOn()}}set enabled(e){this.controls.enabled=e}setPerspectiveCameraOn(){this.cameras[0].active||(this.cameras[0].active=!0,this.cameras[1].active=!1,this.setupPerspectiveCamera(),this.viewer.needsRender=!0)}setOrthoCameraOn(){this.cameras[1].active||(this.cameras[0].active=!1,this.cameras[1].active=!0,this.setupOrthoCamera(),this.viewer.needsRender=!0)}toggleCameras(){this.cameras[0].active?this.setOrthoCameraOn():this.setPerspectiveCameraOn()}setupOrthoCamera(){this.previousDistance=this.controls.distance,this.controls.mouseButtons.wheel=ye.ACTION.ZOOM;const t=new e.Vector3;this.camera.getWorldDirection(t);const r=(new e.Vector3).copy(this.viewer.World.worldOrigin).clone().sub(this.camera.position).length(),n=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight,i=this.camera.fov,l=2*r*Math.atan(i*(Math.PI/180)/2),a=l*n;this.orthoCamera.zoom=1,this.orthoCamera.left=a/-2,this.orthoCamera.right=a/2,this.orthoCamera.top=l/2,this.orthoCamera.bottom=l/-2,this.orthoCamera.far=this.camera.far,this.orthoCamera.near=1e-4,this.orthoCamera.updateProjectionMatrix(),this.orthoCamera.position.copy(this.camera.position),this.orthoCamera.quaternion.copy(this.camera.quaternion),this.orthoCamera.updateProjectionMatrix(),this.controls.camera=this.orthoCamera,this.viewer.emit(\"projection-change\",\"ortho\")}setupPerspectiveCamera(){this.controls.mouseButtons.wheel=ye.ACTION.DOLLY,this.camera.position.copy(this.orthoCamera.position),this.camera.quaternion.copy(this.orthoCamera.quaternion),this.camera.updateProjectionMatrix(),this.controls.camera=this.camera,this.controls.zoomTo(1),this.enableRotations(),this.viewer.emit(\"projection-change\",\"perspective\")}disableRotations(){this.controls.mouseButtons.left=ye.ACTION.TRUCK}enableRotations(){this.controls.mouseButtons.left=ye.ACTION.ROTATE}setupWASDControls(){const e=65,t=83,r=68,n=new Re(87,16.666),i=new Re(e,16.666),l=new Re(t,16.666),a=new Re(r,16.666),s=new Array(4),u=(e,t)=>{s[e]=t,s.every((e=>!1===e))?(this.controls.isTrucking=!1,this.controls.dispatchEvent({type:\"rest\"})):this.controls.isTrucking=!0};i.addEventListener(Me.HOLD_START,function(){this.controls.dispatchEvent({type:\"controlstart\"})}.bind(this)),i.addEventListener(\"holding\",function(e){!1!==this.viewer.mouseOverRenderer&&(u(0,!0),this.controls.truck(-.01*e.deltaTime,0,!1))}.bind(this)),i.addEventListener(Me.HOLD_END,function(){u(0,!1)}.bind(this)),a.addEventListener(Me.HOLD_START,function(){this.controls.dispatchEvent({type:\"controlstart\"})}.bind(this)),a.addEventListener(\"holding\",function(e){!1!==this.viewer.mouseOverRenderer&&(u(1,!0),this.controls.truck(.01*e.deltaTime,0,!1))}.bind(this)),a.addEventListener(Me.HOLD_END,function(){u(1,!1)}.bind(this)),n.addEventListener(Me.HOLD_START,function(){this.controls.dispatchEvent({type:\"controlstart\"})}.bind(this)),n.addEventListener(\"holding\",function(e){!1!==this.viewer.mouseOverRenderer&&(u(2,!0),this.controls.forward(.01*e.deltaTime,!1))}.bind(this)),n.addEventListener(Me.HOLD_END,function(){u(2,!1)}.bind(this)),l.addEventListener(Me.HOLD_START,function(){this.controls.dispatchEvent({type:\"controlstart\"})}.bind(this)),l.addEventListener(\"holding\",function(e){!1!==this.viewer.mouseOverRenderer&&(u(3,!0),this.controls.forward(-.01*e.deltaTime,!1))}.bind(this)),l.addEventListener(Me.HOLD_END,function(){u(3,!1)}.bind(this))}onWindowResize(){this.camera.aspect=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight,this.camera.updateProjectionMatrix();const t=new e.Vector3;this.camera.getWorldDirection(t);const r=new e.Vector3;this.controls.getTarget(r);const n=r.clone().sub(this.camera.position).dot(t),i=this.viewer.container.offsetWidth/this.viewer.container.offsetHeight,l=this.camera.fov,a=2*n*Math.atan(l*(Math.PI/180)/2),s=a*i;this.orthoCamera.zoom=1,this.orthoCamera.left=s/-2,this.orthoCamera.right=s/2,this.orthoCamera.top=a/2,this.orthoCamera.bottom=a/-2,this.orthoCamera.updateProjectionMatrix()}_setOrbitPoint(t,r){const n=this.viewer.container.getBoundingClientRect(),i=t-n.left,l=r-n.top,a=new e.Vector2(i/n.width*2-1,(n.height-l)/n.height*2-1),s=new e.Raycaster;s.setFromCamera(a,this.camera);const u=s.intersectObjects(this.viewer.sceneManager.allObjects);0!==u.length&&this.controls.setOrbitPoint(u[0].point.x,u[0].point.y,u[0].point.z,!1)}}var Kt;!function(e){e[e.MESH=0]=\"MESH\",e[e.LINE=1]=\"LINE\",e[e.POINT=2]=\"POINT\",e[e.POINT_CLOUD=3]=\"POINT_CLOUD\",e[e.TEXT=4]=\"TEXT\"}(Kt||(Kt={}));const Ut={offset:0,count:0},Tt={offset:0,count:1/0};var xt;!function(e){e.POSITION=\"POSITION\",e.COLOR=\"COLOR\",e.NORMAL=\"NORMAL\",e.UV=\"UV\",e.TANGENT=\"TANGENT\",e.INDEX=\"INDEX\"}(xt||(xt={}));class Pt{static updateRTEGeometry(e,t){if(\"BufferGeometry\"===e.type||\"PlaneGeometry\"===e.type||\"CircleGeometry\"===e.type){const r=new Float32Array(t.length),i=e.attributes.position.array;Pt.DoubleToHighLowBuffer(t,r,i),e.setAttribute(\"position_low\",new n(r,3))}else if(\"LineGeometry\"===e.type||\"LineSegmentsGeometry\"===e.type){const r=new Float32Array(t.length),n=e.attributes.instanceStart.array;Pt.DoubleToHighLowBuffer(t,r,n);const a=new i(new Float32Array(r),6,1);e.setAttribute(\"instanceStartLow\",new l(a,3,0)),e.setAttribute(\"instanceEndLow\",new l(a,3,3))}}static mergeGeometryAttribute(e,t){let r=0;for(let n=0;ne.attributes[xt.INDEX])),n=e.map((e=>e.attributes[xt.POSITION]));r.attributes[xt.INDEX]=Pt.mergeIndexAttribute(t,n)}for(const n in t)if(n!==xt.INDEX){const t=e.map((e=>e.attributes[n]));r.attributes[n]=Pt.mergeGeometryAttribute(t,n===xt.POSITION?new Float64Array(t.reduce(((e,t)=>e+t.length),0)):new Float32Array(t.reduce(((e,t)=>e+t.length),0)))}return e.forEach((e=>{for(const t in e.attributes)delete e.attributes[t]})),r}static transformGeometryData(e,t){if(!e.attributes.POSITION)return;const r=t.elements;for(let t=0;t>16&255,l=n>>8&255,a=255&n;t[3*r]=i/255,t[3*r+1]=l/255,t[3*r+2]=a/255}return t}static DoubleToHighLowVector(e,t,r){let n=e.x;if(n>=0){this.floatArrayBuff[0]=n;const e=this.floatArrayBuff[0];r.x=e,t.x=n-e}else{this.floatArrayBuff[0]=-n;const e=this.floatArrayBuff[0];r.x=-e,t.x=n+e}if(n=e.y,n>=0){this.floatArrayBuff[0]=n;const e=this.floatArrayBuff[0];r.y=e,t.y=n-e}else{this.floatArrayBuff[0]=-n;const e=this.floatArrayBuff[0];r.y=-e,t.y=n+e}if(n=e.z,n>=0){this.floatArrayBuff[0]=n;const e=this.floatArrayBuff[0];r.z=e,t.z=n-e}else{this.floatArrayBuff[0]=-n;const e=this.floatArrayBuff[0];r.z=-e,t.z=n+e}}static DoubleToHighLowBuffer(e,t,r){for(let n=0;n=0){this.floatArrayBuff[0]=i;const e=this.floatArrayBuff[0];r[n]=e,t[n]=i-e}else{this.floatArrayBuff[0]=-i;const e=this.floatArrayBuff[0];r[n]=-e,t[n]=i+e}}}static computeVertexNormals(e,r){const n=e.index,i=e.getAttribute(\"position\");if(void 0!==i){let l=e.getAttribute(\"normal\");if(void 0===l)l=new a(new Float32Array(3*i.count),3),e.setAttribute(\"normal\",l);else for(let e=0,t=l.count;e=65535||e.length>=65535?(l=new Uint32Array(e.length),l.set(e,0),i.setIndex(new d(l,1))):(l=new Uint16Array(e.length),l.set(e,0),i.setIndex(new p(l,1))),i.setAttribute(\"position\",new n(t,3)),i.computeBoundingBox();return new yt(i,r)}constructor(e,t={}){super(e,t)}raycast(e,t=o){const r=super.raycast(this.transformInput(e),t);return r.forEach((e=>{e.point=this.transformOutput(e.point)})),r}raycastFirst(e,t=o){const r=super.raycastFirst(this.transformInput(e),t);return r.point=this.transformOutput(r.point),r}shapecast(e){const t=new c,r=new Oe,n=Object.create(null);return e.intersectsBounds&&(n.intersectsBounds=(r,n,i,l,a)=>(t.copy(r),this.transformOutput(t),e.intersectsBounds(t,n,i,l,a))),e.intersectsTriangle&&(n.intersectsTriangle=(t,n,i,l)=>(r.copy(t),this.transformOutput(r.a),this.transformOutput(r.b),this.transformOutput(r.c),e.intersectsTriangle(r,n,i,l))),n.intersectsRange=e.intersectsRange,n.traverseBoundsOrder=e.traverseBoundsOrder,super.shapecast(n)}transformInput(e){return yt.MatBuff.copy(this.inputOriginTransform).premultiply(this.inputTransform),e.applyMatrix4(yt.MatBuff)}transformOutput(e){return yt.MatBuff.copy(this.outputOriginTransfom).multiply(this.outputTransform),e.applyMatrix4(yt.MatBuff)}getBoundingBox(e){return super.getBoundingBox(e),this.transformOutput(e)}getVertexAtIndex(e){const r=this.geometry.attributes.position.array;return this.transformOutput(new t(r[3*e],r[3*e+1],r[3*e+2]))}}yt.MatBuff=new s;class Rt{constructor(e){this.batchObjects=[],this.bounds=new c(new t(0,0,0),new t(0,0,0)),this.boxHelpers=[],this.tas=null,this.lastRefitTime=0,this.batchObjects=e,this.buildTAS(),this.getBoundingBox(this.bounds)}buildTAS(){const e=[],t=new Float32Array(3*Rt.CUBE_VERTS*this.batchObjects.length);let r=0;for(let n=0;ne+r/3))),this.batchObjects[n].tasVertIndexStart=r/3,this.batchObjects[n].tasVertIndexEnd=r/3+Rt.CUBE_VERTS,r+=3*Rt.CUBE_VERTS,Rt.debugBoxes){const e=new v(i);e.layers.set(En.PROPS),this.boxHelpers.push(e)}}this.tas=yt.buildBVH(e,t),this.tas.inputTransform=new s,this.tas.outputTransform=new s,this.tas.inputOriginTransform=new s,this.tas.outputOriginTransfom=new s}updateVertArray(e,t,r){r[t]=e.min.x,r[t+1]=e.min.y,r[t+2]=e.max.z,r[t+3]=e.max.x,r[t+4]=e.min.y,r[t+5]=e.max.z,r[t+6]=e.max.x,r[t+7]=e.max.y,r[t+8]=e.max.z,r[t+9]=e.min.x,r[t+10]=e.max.y,r[t+11]=e.max.z,r[t+12]=e.min.x,r[t+13]=e.min.y,r[t+14]=e.min.z,r[t+15]=e.max.x,r[t+16]=e.min.y,r[t+17]=e.min.z,r[t+18]=e.max.x,r[t+19]=e.max.y,r[t+20]=e.min.z,r[t+21]=e.min.x,r[t+22]=e.max.y,r[t+23]=e.min.z}refit(){const e=performance.now(),t=this.tas.geometry.attributes.position.array,r=new c;for(let e=0;e{const l=this.tas.geometry.index.array[3*i.faceIndex],a=Math.trunc(l/Rt.CUBE_VERTS);n.copy(e);const s=this.batchObjects[a].bvh.raycast(n,t);s.forEach((e=>{e.batchObject=this.batchObjects[a]})),r.push(...s)})),r):r}raycastFirst(e,t=o){const r=new f;r.copy(e);const n=this.tas.raycastFirst(r,o);if(!n)return null;const i=this.tas.geometry.index.array[3*n.faceIndex],l=Math.trunc(i/Rt.CUBE_VERTS);r.copy(e);const a=this.batchObjects[l].bvh.raycast(r,t);a.forEach((e=>{e.batchObject=this.batchObjects[l]})),null.push(...a)}shapecast(e){let t=!1;return this.tas.shapecast({intersectsBounds:(t,r,n,i,l)=>e.intersectsTAS(t,r,n,i,l),intersectsRange:r=>{const n=this.tas.geometry.index.array[3*r],i=Math.trunc(n/Rt.CUBE_VERTS);return t||(t=this.batchObjects[i].bvh.shapecast((t=>{const r=Object.create(null);return e.intersectsBounds&&(r.intersectsBounds=e.intersectsBounds),e.intersectsTriangle&&(r.intersectsTriangle=(r,n,i,l)=>e.intersectsTriangle(r,n,i,l,t)),r.intersectsRange=e.intersectsRange,r.traverseBoundsOrder=e.traverseBoundsOrder,r})(this.batchObjects[i]))),!1}}),t}getBoundingBox(e){return this.tas.getBoundingBox(e),e}}Rt.debugBoxes=!1,Rt.cubeIndices=[0,1,2,2,3,0,1,5,6,6,2,1,7,6,5,5,4,7,4,0,3,3,7,4,4,5,1,1,0,4,3,2,6,6,7,3],Rt.CUBE_VERTS=8;class Mt{static triangulateFace(e,t,r){let n=t[e];function i(t){return e+t+1}function l(e){const n=3*t[i(e)];return new Nt(r[n],r[n+1],r[n+2])}n<3&&(n+=3);const a=Array(3*(n-2)),s=new Nt(0,0,0);for(let e=n-1,t=0;t=3;){let e=!0;if(n>3&&o0}}class Nt{constructor(e,t,r){this.x=e,this.y=t,this.z=r}add(e){return new Nt(this.x+e.x,this.y+e.y,this.z+e.z)}sub(e){return new Nt(this.x-e.x,this.y-e.y,this.z-e.z)}mul(e){return new Nt(this.x-e,this.y-e,this.z-e)}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}cross(e){const t=this.y*e.z-this.z*e.y,r=this.z*e.x-this.x*e.z,n=this.x*e.y-this.y*e.x;return new Nt(t,r,n)}squareSum(){return this.x*this.x+this.y*this.y+this.z*this.z}normalize(){const e=1/Math.sqrt(this.squareSum());this.x*=e,this.y*=e,this.z*=e}}const Ot={Millimeters:\"mm\",Centimeters:\"cm\",Meters:\"m\",Kilometers:\"km\",Inches:\"in\",Feet:\"ft\",Yards:\"yd\",Miles:\"mi\"};function Lt(e,t=Ot.Meters){switch(e=Zt(e),t=Zt(t),e){case Ot.Millimeters:switch(t){case Ot.Centimeters:return.1;case Ot.Meters:return.001;case Ot.Kilometers:return 1e-6;case Ot.Inches:return.0393701;case Ot.Feet:return.00328084;case Ot.Yards:return.00109361;case Ot.Miles:return 6.21371e-7}break;case Ot.Centimeters:switch(t){case Ot.Millimeters:return 10;case Ot.Meters:return.01;case Ot.Kilometers:return 1e-5;case Ot.Inches:return.393701;case Ot.Feet:return.0328084;case Ot.Yards:return.0109361;case Ot.Miles:return 621371e-11}break;case Ot.Meters:switch(t){case Ot.Millimeters:return 1e3;case Ot.Centimeters:return 100;case Ot.Kilometers:return.001;case Ot.Inches:return 39.3701;case Ot.Feet:return 3.28084;case Ot.Yards:return 1.09361;case Ot.Miles:return 621371e-9}break;case Ot.Kilometers:switch(t){case Ot.Millimeters:return 1e6;case Ot.Centimeters:return 1e5;case Ot.Meters:return 1e3;case Ot.Inches:return 39370.1;case Ot.Feet:return 3280.84;case Ot.Yards:return 1093.61;case Ot.Miles:return.621371}break;case Ot.Inches:switch(t){case Ot.Millimeters:return 25.4;case Ot.Centimeters:return 2.54;case Ot.Meters:return.0254;case Ot.Kilometers:return 254e-7;case Ot.Feet:return.0833333;case Ot.Yards:return.027777694;case Ot.Miles:return 157828e-10}break;case Ot.Feet:switch(t){case Ot.Millimeters:return 304.8;case Ot.Centimeters:return 30.48;case Ot.Meters:return.3048;case Ot.Kilometers:return 3048e-7;case Ot.Inches:return 12;case Ot.Yards:return.333332328;case Ot.Miles:return 189394e-9}break;case Ot.Miles:switch(t){case Ot.Millimeters:return 1609e3;case Ot.Centimeters:return 160934;case Ot.Meters:return 1609.34;case Ot.Kilometers:return 1.60934;case Ot.Inches:return 63360;case Ot.Feet:return 5280;case Ot.Yards:return 1759.99469184}}return 1}function Zt(e){if(!e)return Ot.Meters;switch(e.toLowerCase()){case\"mm\":case\"mil\":case\"millimeters\":case\"millimetres\":return Ot.Millimeters;case\"cm\":case\"centimetre\":case\"centimeter\":case\"centimetres\":case\"centimeters\":return Ot.Centimeters;case\"m\":case\"meter\":case\"metre\":case\"meters\":case\"metres\":default:return Ot.Meters;case\"inches\":case\"inch\":case\"in\":return Ot.Inches;case\"feet\":case\"foot\":case\"ft\":return Ot.Feet;case\"yard\":case\"yards\":case\"yd\":return Ot.Yards;case\"miles\":case\"mile\":case\"mi\":return Ot.Miles;case\"km\":case\"kilometers\":return Ot.Kilometers}}var kt;!function(e){e.View3D=\"View3D\",e.BlockInstance=\"BlockInstance\",e.Pointcloud=\"Pointcloud\",e.Brep=\"Brep\",e.Mesh=\"Mesh\",e.Point=\"Point\",e.Line=\"Line\",e.Polyline=\"Polyline\",e.Box=\"Box\",e.Polycurve=\"Polycurve\",e.Curve=\"Curve\",e.Circle=\"Circle\",e.Arc=\"Arc\",e.Ellipse=\"Ellipse\",e.RevitInstance=\"RevitInstance\",e.Text=\"Text\",e.Unknown=\"Unknown\"}(kt||(kt={}));const Gt=[kt.Pointcloud,kt.Brep,kt.Mesh,kt.Point,kt.Line,kt.Polyline,kt.Box,kt.Polycurve,kt.Curve,kt.Circle,kt.Arc,kt.Ellipse,kt.Text];class jt{static getSpeckleType(e){let t=[\"Base\"];t=e.raw.data?e.raw.data.speckle_type?e.raw.data.speckle_type.split(\":\").reverse():t:e.raw.speckle_type?e.raw.speckle_type.split(\":\").reverse():t,t=t.map((e=>e.split(\".\").reverse()[0]));for(const e of t)if(e in kt)return e;return kt.Unknown}static convertNodeToGeometryData(e){switch(jt.getSpeckleType(e)){case kt.BlockInstance:return jt.BlockInstanceToGeometryData(e);case kt.Pointcloud:return jt.PointcloudToGeometryData(e);case kt.Brep:return jt.BrepToGeometryData(e);case kt.Mesh:return jt.MeshToGeometryData(e);case kt.Point:return jt.PointToGeometryData(e);case kt.Line:return jt.LineToGeometryData(e);case kt.Polyline:return jt.PolylineToGeometryData(e);case kt.Box:return jt.BoxToGeometryData(e);case kt.Polycurve:return jt.PolycurveToGeometryData(e);case kt.Curve:return jt.CurveToGeometryData(e);case kt.Circle:return jt.CircleToGeometryData(e);case kt.Arc:return jt.ArcToGeometryData(e);case kt.Ellipse:return jt.EllipseToGeometryData(e);case kt.View3D:return jt.View3DToGeometryData(e);case kt.RevitInstance:return jt.RevitInstanceToGeometryData(e);case kt.Text:return jt.TextToGeometryData(e);case kt.Unknown:return null}}static disposeNodeGeometryData(e){switch(jt.getSpeckleType(e)){case kt.Pointcloud:e.raw.vertices=[],e.raw.colors=[];break;case kt.Mesh:e.raw.vertices=[],e.raw.faces=[],e.raw.colors=[];break;case kt.Point:e.raw.value?e.raw.value=[]:(delete e.raw.x,delete e.raw.y,delete e.raw.z);break;case kt.Line:e.raw.start.value?e.raw.start.value=[]:(delete e.raw.start.x,delete e.raw.start.y,delete e.raw.start.z),e.raw.end.value?e.raw.end.value=[]:(delete e.raw.end.x,delete e.raw.end.y,delete e.raw.end.z);break;case kt.Polyline:e.raw.value=[]}}static View3DToGeometryData(e){const t=jt.PointToVector3(e.raw.origin),r=jt.PointToVector3(e.raw.target);return e.raw.origin=t,e.raw.target=r,{attributes:null,bakeTransform:null,transform:null}}static BlockInstanceToGeometryData(e){const t=Lt(e.raw.units),r=Array.isArray(e.raw.transform)?e.raw.transform:e.raw.transform.value?e.raw.transform.value:e.raw.transform.matrix,n=(new s).fromArray(r).transpose();return{attributes:null,bakeTransform:null,transform:(new s).makeScale(t,t,t).multiply(n).multiply((new s).makeScale(1/t,1/t,1/t))}}static RevitInstanceToGeometryData(e){const t=Lt(e.raw.units),r=Array.isArray(e.raw.transform)?e.raw.transform:e.raw.transform.value?e.raw.transform.value:e.raw.transform.matrix,n=(new s).fromArray(r).transpose();return{attributes:null,bakeTransform:null,transform:(new s).makeScale(t,t,t).multiply(n).multiply((new s).makeScale(1/t,1/t,1/t))}}static PointcloudToGeometryData(e){const t=Lt(e.raw.units),r=e.raw.points,n=e.raw.colors;let i=null;return n&&0!==n.length&&(n.length!==r.length/3&&We.warn(`Mesh (id ${e.raw.id}) colours are mismatched with vertice counts. The number of colours must equal the number of vertices.`),i=jt.unpackColors(n,!0)),{attributes:{POSITION:r,COLOR:i},bakeTransform:(new s).makeScale(t,t,t),transform:null}}static BrepToGeometryData(e){return null}static MeshToGeometryData(e){if(!e.raw)return;const t=Lt(e.raw.units),r=[];if(!e.raw.vertices)return;if(!e.raw.faces)return;const n=e.raw.vertices,i=e.raw.faces,l=e.raw.colors;let a,u=0;for(;uvoid 0!==e)))}u+=e+1}return l&&0!==l.length&&(l.length!==n.length/3&&We.warn(`Mesh (id ${e.raw.id}) colours are mismatched with vertice counts. The number of colours must equal the number of vertices.`),a=jt.unpackColors(l)),{attributes:{POSITION:n,INDEX:r,...a&&{COLOR:a}},bakeTransform:(new s).makeScale(t,t,t),transform:null}}static TextToGeometryData(e){const r=Lt(e.raw.units),n=e.raw.plane,i=new t(n.origin.x,n.origin.y,n.origin.z),l=(new s).makeScale(r,r,r),a=(new s).makeBasis(n.xdir,n.ydir,n.normal);return a.setPosition(i),a.premultiply(l),{attributes:null,bakeTransform:a,transform:null,metaData:e.raw}}static PointToGeometryData(e){const t=Lt(e.raw.units);return{attributes:{POSITION:this.PointToFloatArray(e.raw)},bakeTransform:(new s).makeScale(t,t,t),transform:null}}static LineToGeometryData(e){const t=Lt(e.raw.units);return{attributes:{POSITION:this.PointToFloatArray(e.raw.start).concat(this.PointToFloatArray(e.raw.end))},bakeTransform:(new s).makeScale(t,t,t),transform:null}}static PolylineToGeometryData(e){const t=Lt(e.raw.units);return e.raw.closed&&e.raw.value.push(e.raw.value[0],e.raw.value[1],e.raw.value[2]),{attributes:{POSITION:e.raw.value.slice(0)},bakeTransform:(new s).makeScale(t,t,t),transform:null}}static BoxToGeometryData(e){const r=Lt(e.raw.units),n=this.PointToVector3(e.raw.basePlane.origin),i=(e.raw.xSize.end-e.raw.xSize.start)*r,l=(e.raw.ySize.end-e.raw.ySize.start)*r,a=(e.raw.zSize.end-e.raw.zSize.start)*r,u=new c(new t(.5*-i,.5*-l,.5*-a),new t(.5*i,.5*l,.5*a));return{attributes:{POSITION:[u.min.x,u.min.y,u.min.z,u.min.x,u.max.y,u.min.z,u.min.x,u.min.y,u.max.z,u.min.x,u.max.y,u.max.z,u.min.x,u.min.y,u.min.z,u.min.x,u.min.y,u.max.z,u.min.x,u.max.y,u.min.z,u.min.x,u.max.y,u.max.z,u.max.x,u.min.y,u.min.z,u.max.x,u.max.y,u.min.z,u.max.x,u.min.y,u.max.z,u.max.x,u.max.y,u.max.z,u.max.x,u.min.y,u.min.z,u.max.x,u.min.y,u.max.z,u.max.x,u.max.y,u.min.z,u.max.x,u.max.y,u.max.z,u.max.x,u.min.y,u.max.z,u.min.x,u.min.y,u.max.z,u.max.x,u.min.y,u.min.z,u.min.x,u.min.y,u.min.z,u.max.x,u.max.y,u.max.z,u.min.x,u.max.y,u.max.z,u.max.x,u.max.y,u.min.z,u.min.x,u.max.y,u.min.z]},bakeTransform:(new s).setPosition(n),transform:null}}static PolycurveToGeometryData(e){const t=[];for(let r=0;r0,p=(new t).subVectors(n,r);p.normalize();const o=(new t).subVectors(i,r);o.normalize();const c=(new t).crossVectors(p,o);if(c.normalize(),0===c.length()){const e=(new t).subVectors(l,r);e.normalize(),c.copy((new t).crossVectors(p,e)),c.normalize()}const v=(new t).crossVectors(c,p);v.normalize();const f=Math.min(Math.max(p.dot(o),-1),1),h=Math.acos(f),V=e.raw.radius,m=new S(0,0,V,V,0,h,d,0).getPoints(50),z=new s,X=Lt(e.raw.plane.units),b=(new s).makeBasis(p,v,c),q=(new s).setPosition(r.multiplyScalar(X));z.multiply(q).multiply(b);const K=(new s).scale(new t(X,X,X));return z.multiply(K),{attributes:{POSITION:this.FlattenVector3Array(m)},bakeTransform:z,transform:null}}static EllipseToGeometryData(e){const r=Lt(e.raw.units),n=new t(e.raw.plane.origin.x,e.raw.plane.origin.y,e.raw.plane.origin.z).multiplyScalar(r),i=new t(e.raw.plane.xdir.x,e.raw.plane.xdir.y,e.raw.plane.xdir.z).normalize(),l=new t(e.raw.plane.ydir.x,e.raw.plane.ydir.y,e.raw.plane.ydir.z).normalize();let a=2*Math.PI*e.raw.firstRadius*r*10;a=parseInt(a.toString());const s=[];for(let u=0;u<=a;u++){const d=u*Math.PI*2/a,p=Math.cos(d)*e.raw.firstRadius*r,o=Math.sin(d)*e.raw.secondRadius*r,c=new t(i.x*p,i.y*p,i.z*p),v=new t(l.x*o,l.y*o,l.z*o),f=(new t).addVectors(c,v).add(n);s.push(f)}return{attributes:{POSITION:this.FlattenVector3Array(s)},bakeTransform:null,transform:null}}static getCircularCurvePoints(e,r,n=0,i=2*Math.PI,l=.1){const a=this.PointToVector3(e.origin),s=this.PointToVector3(e.xdir),u=this.PointToVector3(e.ydir);s.normalize(),u.normalize();let d=(i-n)*r/l;d=parseInt(d.toString());const p=[];for(let e=0;e<=d;e++){const l=n+e*(i-n)/d,o=Math.cos(l)*r,c=Math.sin(l)*r,v=new t(s.x*o,s.y*o,s.z*o),f=new t(u.x*c,u.y*c,u.z*c),S=(new t).addVectors(v,f).add(a);p.push(S)}return p}static PointToVector3(e,r=!0){const n=r?Lt(e.units):1;let i=null;return i=e.value?new t(e.value[0]*n,e.value[1]*n,e.value[2]*n):new t(e.x*n,e.y*n,e.z*n),i}static PointToFloatArray(e){return e.value?[e.value[0],e.value[1],e.value[2]]:[e.x,e.y,e.z]}static FlattenVector3Array(e){const t=new Array(3*e.length),r=[];for(let n=0,i=0;n>16&255,a=i>>8&255,s=255&i;r[3*n]=l/255,r[3*n+1]=a/255,r[3*n+2]=s/255,t&&(r[3*n]=jt.srgbToLinear(r[3*n]),r[3*n+1]=jt.srgbToLinear(r[3*n+1]),r[3*n+2]=jt.srgbToLinear(r[3*n+2]))}return r}static srgbToLinear(e){return e<=0?0:e>=1?1:e<.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}}var It;jt.keepGeometryData=!1;class Et{static hashCode(e){let t;for(let r=0;r0&&(this._geometryType!==Kt.MESH||this._renderData.geometry.attributes.INDEX&&this._renderData.geometry.attributes.INDEX.length>0)}constructor(e){this._aabb=null,this._renderData=e,this._geometryType=this.getGeometryType(),this._materialHash=this.getMaterialHash(),this._batchId,this._batchIndexCount,this._batchIndexStart,this._batchVertexStart,this._batchVertexEnd}setBatchData(e,t,r,n,i){this._batchId=e,this._batchIndexStart=t,this._batchIndexCount=r,void 0!==n&&(this._batchVertexStart=n),void 0!==i&&(this._batchVertexEnd=i)}computeAABB(){this._aabb=(new c).setFromArray(this._renderData.geometry.attributes.POSITION)}getGeometryType(){switch(this._renderData.speckleType){case kt.Mesh:case kt.Brep:return Kt.MESH;case kt.Point:return Kt.POINT;case kt.Pointcloud:return Kt.POINT_CLOUD;case kt.Text:return Kt.TEXT;default:return Kt.LINE}}disposeGeometry(){for(const e in this._renderData.geometry.attributes)this._renderData.geometry.attributes[e]=[]}renderMaterialToString(){return this.renderData.renderMaterial.color.toString()+\"/\"+this.renderData.renderMaterial.opacity.toString()+\"/\"+this.renderData.renderMaterial.roughness.toString()+\"/\"+this.renderData.renderMaterial.metalness.toString()}displayStyleToString(){var e;return(null===(e=this.renderData.displayStyle.color)||void 0===e?void 0:e.toString())+\"/\"+this.renderData.displayStyle.lineWeight.toString()}getMaterialHash(){const e=!this.renderData.renderMaterial||this.geometryType!==Kt.MESH&&this.geometryType!==Kt.POINT&&this.geometryType!==Kt.TEXT?this.renderData.displayStyle&&this.geometryType!==Kt.MESH&&this.geometryType!==Kt.POINT?this.displayStyleToString():\"\":this.renderMaterialToString();let t=\"\";this.renderData.geometry.attributes&&(t=this.renderData.geometry.attributes.COLOR?\"vertexColors\":\"\");const r=this.geometryType.toString()+t+e+(this.geometryType===Kt.TEXT?this._renderData.id:\"\");return It.hashCode(r)}}It=Et,Et.NullRenderMaterialHash=It.hashCode(Kt.MESH.toString()),Et.NullRenderMaterialVertexColorsHash=It.hashCode(Kt.MESH.toString()+\"vertexColors\"),Et.NullDisplayStyleHash=It.hashCode(Kt.LINE.toString()),Et.NullPointMaterialHash=It.hashCode(Kt.POINT.toString()),Et.NullPointCloudMaterialHash=It.hashCode(Kt.POINT_CLOUD.toString()),Et.NullPointCloudVertexColorsMaterialHash=It.hashCode(Kt.POINT_CLOUD.toString()+\"vertexColors\");class wt extends ke{set pixelThreshold(e){this.userData.pixelThreshold.value=e,this.needsUpdate=!0}constructor(e,r=[]){super(e),this.userData.uViewer_high={value:new t},this.userData.uViewer_low={value:new t},this.userData.pixelThreshold={value:0},this.vertProgram=\"\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\n\\t\\tuniform float linewidth;\\n\\t\\tuniform vec2 resolution;\\n\\t\\tuniform float pixelThreshold;\\n\\n\\t\\tvarying float vAlpha;\\n\\n\\t\\t#define SEARCH_STEPS 10\\n\\n\\t\\tattribute vec3 instanceStart;\\n\\t\\tattribute vec3 instanceEnd;\\n\\n\\t\\tattribute vec4 instanceColorStart;\\n\\t\\tattribute vec4 instanceColorEnd;\\n\\t\\t// varying vec3 debugColor;\\n\\n\\t\\t#ifdef WORLD_UNITS\\n\\n\\t\\t\\tvarying vec4 worldPos;\\n\\t\\t\\tvarying vec3 worldStart;\\n\\t\\t\\tvarying vec3 worldEnd;\\n\\t\\t\\tvarying float correctedLineWidth;\\n\\n\\t\\t\\t#ifdef USE_DASH\\n\\n\\t\\t\\t\\tvarying vec2 vUv;\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t#else\\n\\n\\t\\t\\tvarying vec2 vUv;\\n\\n\\t\\t#endif\\n\\n\\t\\t#ifdef USE_DASH\\n\\n\\t\\t\\tuniform float dashScale;\\n\\t\\t\\tattribute float instanceDistanceStart;\\n\\t\\t\\tattribute float instanceDistanceEnd;\\n\\t\\t\\tvarying float vLineDistance;\\n\\n\\t\\t#endif\\n\\n #ifdef USE_RTE\\n\\t\\t\\tattribute vec3 instanceStartLow;\\n\\t\\t\\tattribute vec3 instanceEndLow;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n #endif\\n\\n\\t\\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\\n\\n\\t\\t\\t// trim end segment so it terminates between the camera plane and the near plane\\n\\n\\t\\t\\t// conservative estimate of the near plane\\n\\t\\t\\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\\n\\t\\t\\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\\n\\t\\t\\tfloat nearEstimate = - 0.5 * b / a;\\n\\n\\t\\t\\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\\n\\n\\t\\t\\tend.xyz = mix( start.xyz, end.xyz, alpha );\\n\\n\\t\\t}\\n\\n\\t\\tfloat screenSpaceDistance(vec4 p0, vec4 p1) {\\n\\t\\t\\tp0 = projectionMatrix * p0;\\n\\t\\t\\tp0 /= p0.w;\\n\\t\\t\\tp1 = projectionMatrix * p1;\\n\\t\\t\\tp1 /= p1.w;\\n\\t\\t\\treturn length(p1.xy - p0.xy);\\n\\t\\t}\\n\\n\\t\\tvec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n\\t\\t\\t/* \\n\\t\\t\\tVector calculation for the high and low differences works on everything \\n\\t\\t\\t*BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n\\t\\t\\tIt would seem that when this code gets compiled, vector types get a lower precision(?)\\n\\t\\t\\twhich completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n\\t\\t\\tvector component using floats works fine.\\n\\t\\t\\t*/\\n\\t\\t\\tvec3 highDifference;\\n\\t\\t\\tvec3 lowDifference;\\n\\t\\t\\tfloat t1 = position_low.x - relativeTo_low.x;\\n\\t\\t\\tfloat e = t1 - position_low.x;\\n\\t\\t\\tfloat t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n\\t\\t\\thighDifference.x = t1 + t2;\\n\\t\\t\\tlowDifference.x = t2 - (highDifference.x - t1);\\n\\n\\t\\t\\tt1 = position_low.y - relativeTo_low.y;\\n\\t\\t\\te = t1 - position_low.y;\\n\\t\\t\\tt2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n\\t\\t\\thighDifference.y = t1 + t2;\\n\\t\\t\\tlowDifference.y = t2 - (highDifference.y - t1);\\n\\n\\t\\t\\tt1 = position_low.z - relativeTo_low.z;\\n\\t\\t\\te = t1 - position_low.z;\\n\\t\\t\\tt2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n\\t\\t\\thighDifference.z = t1 + t2;\\n\\t\\t\\tlowDifference.z = t2 - (highDifference.z - t1);\\n\\n\\t\\t\\tvec3 position = highDifference.xyz + lowDifference.xyz;\\n\\t\\t\\treturn vec4(position, 1.);\\n\\t\\t}\\n\\n\\t\\tvec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n\\t\\t\\t/* \\n\\t\\t\\tSource https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n\\t\\t\\tNote here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n\\t\\t\\t*/\\n\\t\\t\\tvec3 t1 = position_low.xyz - relativeTo_low;\\n\\t\\t\\tvec3 e = t1 - position_low.xyz;\\n\\t\\t\\tvec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n\\t\\t\\tvec3 highDifference = t1 + t2;\\n\\t\\t\\tvec3 lowDifference = t2 - (highDifference - t1);\\n\\t\\t\\t\\n\\t\\t\\tvec3 position = highDifference.xyz + lowDifference.xyz;\\n\\t\\t\\treturn vec4(position, 1.);\\n\\t\\t}\\n\\n\\t\\tvoid main() {\\n\\t\\t\\tif(instanceColorStart.w == 0.) {\\n\\t\\t\\t\\tgl_Position = vec4(0.);\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t\\t\\n\\t\\t\\tvAlpha = instanceColorStart.w;\\n\\n vec3 computedPosition = position;\\n\\t\\t\\t#ifdef USE_COLOR\\n\\n\\t\\t\\t\\tvColor.xyz = ( computedPosition.y < 0.5 ) ? instanceColorStart.xyz : instanceColorEnd.xyz;\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\t#ifdef USE_DASH\\n\\n\\t\\t\\t\\tvLineDistance = ( computedPosition.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\\n\\t\\t\\t\\tvUv = uv;\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\tfloat aspect = resolution.x / resolution.y;\\n\\n\\t\\t\\t// camera space\\n #ifdef USE_RTE\\n\\t\\t\\t/** Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl */\\n\\t\\t\\t\\t// vec3 t1 = instanceStartLow.xyz - uViewer_low;\\n\\t\\t\\t\\t// vec3 e = t1 - instanceStartLow.xyz;\\n\\t\\t\\t\\t// vec3 t2 = ((-uViewer_low - e) + (instanceStartLow.xyz - (t1 - e))) + instanceStart.xyz - uViewer_high;\\n\\t\\t\\t\\t// vec3 highDifference = t1 + t2;\\n\\t\\t\\t\\t// vec3 lowDifference = t2 - (highDifference - t1);\\n\\t\\t\\t\\t// vec4 start = modelViewMatrix * vec4(highDifference.xyz + lowDifference.xyz , 1.);\\n\\t\\t\\t\\tvec4 start = modelViewMatrix * computeRelativePositionSeparate(instanceStartLow.xyz, instanceStart.xyz, uViewer_low, uViewer_high);\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t// t1 = instanceEndLow.xyz - uViewer_low;\\n\\t\\t\\t\\t// e = t1 - instanceEndLow.xyz;\\n\\t\\t\\t\\t// t2 = ((-uViewer_low - e) + (instanceEndLow.xyz - (t1 - e))) + instanceEnd.xyz - uViewer_high;\\n\\t\\t\\t\\t// highDifference = t1 + t2;\\n\\t\\t\\t\\t// lowDifference = t2 - (highDifference - t1);\\n\\t\\t\\t\\t// vec4 end = modelViewMatrix * vec4(highDifference.xyz + lowDifference.xyz , 1.);\\n\\t\\t\\t\\tvec4 end = modelViewMatrix * computeRelativePositionSeparate(instanceEndLow.xyz, instanceEnd.xyz, uViewer_low, uViewer_high);\\n #else\\n vec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\\n vec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\\n #endif\\n\\n\\t\\t\\t#ifdef WORLD_UNITS\\n\\n\\t\\t\\t\\tworldStart = start.xyz;\\n\\t\\t\\t\\tworldEnd = end.xyz;\\n\\n\\t\\t\\t#else\\n\\n\\t\\t\\t\\tvUv = uv;\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\\n\\t\\t\\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\\n\\t\\t\\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\\n\\t\\t\\t// perhaps there is a more elegant solution -- WestLangley\\n\\n\\t\\t\\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\\n\\n\\t\\t\\tif ( perspective ) {\\n\\n\\t\\t\\t\\tif ( start.z < 0.0 && end.z >= 0.0 ) {\\n\\n\\t\\t\\t\\t\\ttrimSegment( start, end );\\n\\n\\t\\t\\t\\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\\n\\n\\t\\t\\t\\t\\ttrimSegment( end, start );\\n\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t}\\n\\n\\t\\t\\t// clip space\\n\\t\\t\\tvec4 clipStart = projectionMatrix * start;\\n\\t\\t\\tvec4 clipEnd = projectionMatrix * end;\\n\\n\\t\\t\\t// ndc space\\n\\t\\t\\tvec3 ndcStart = clipStart.xyz / clipStart.w;\\n\\t\\t\\tvec3 ndcEnd = clipEnd.xyz / clipEnd.w;\\n\\n\\t\\t\\t// direction\\n\\t\\t\\tvec2 dir = ndcEnd.xy - ndcStart.xy;\\n\\n\\t\\t\\t// account for clip-space aspect ratio\\n\\t\\t\\tdir.x *= aspect;\\n\\t\\t\\tdir = normalize( dir );\\n\\n\\t\\t\\t#ifdef WORLD_UNITS\\n\\n\\t\\t\\t\\t// get the offset direction as perpendicular to the view vector\\n\\t\\t\\t\\tvec3 worldDir = normalize( end.xyz - start.xyz );\\n\\t\\t\\t\\tvec3 offset;\\n\\t\\t\\t\\tif ( computedPosition.y < 0.5 ) {\\n\\n\\t\\t\\t\\t\\toffset = normalize( cross( start.xyz, worldDir ) );\\n\\n\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\toffset = normalize( cross( end.xyz, worldDir ) );\\n\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// sign flip\\n\\t\\t\\t\\tif ( computedPosition.x < 0.0 ) offset *= - 1.0;\\n\\n\\t\\t\\t\\tfloat forwardOffset = dot( worldDir, vec3( 0.0, 0.0, 1.0 ) );\\n\\n\\t\\t\\t\\t// don't extend the line if we're rendering dashes because we\\n\\t\\t\\t\\t// won't be rendering the endcaps\\n\\t\\t\\t\\t#ifndef USE_DASH\\n\\n\\t\\t\\t\\t\\t// extend the line bounds to encompass endcaps\\n\\t\\t\\t\\t\\tstart.xyz += - worldDir * linewidth * 0.5;\\n\\t\\t\\t\\t\\tend.xyz += worldDir * linewidth * 0.5;\\n\\n\\t\\t\\t\\t\\t// shift the position of the quad so it hugs the forward edge of the line\\n\\t\\t\\t\\t\\toffset.xy -= dir * forwardOffset;\\n\\t\\t\\t\\t\\toffset.z += 0.5;\\n\\n\\t\\t\\t\\t#endif\\n\\n\\t\\t\\t\\t// endcaps\\n\\t\\t\\t\\tif ( computedPosition.y > 1.0 || computedPosition.y < 0.0 ) {\\n\\n\\t\\t\\t\\t\\toffset.xy += dir * 2.0 * forwardOffset;\\n\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// debugColor = vec3(0., 0., 1.);\\n\\t\\t\\t\\tcorrectedLineWidth = linewidth;\\n\\t\\t\\t\\tvec3 cOffset = offset;\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t// adjust for linewidth\\n\\t\\t\\t\\toffset *= linewidth * 0.5;\\n\\n\\t\\t\\t\\t// set the world position\\n\\t\\t\\t\\tworldPos = ( computedPosition.y < 0.5 ) ? start : end;\\n\\n\\t\\t\\t\\t/*\\n\\t\\t\\t\\tNot great, not terrible\\n\\t\\t\\t\\t*/\\n\\t\\t\\t\\tfloat pixelSize = length(vec2(pixelThreshold/resolution.x + pixelThreshold/resolution.y));\\n\\t\\t\\t\\tfloat offsetStep = linewidth;\\n\\t\\t\\t\\tfloat d = screenSpaceDistance(worldPos, worldPos + vec4(cOffset * offsetStep, 0.));\\n\\t\\t\\t\\t/* We're trying to start off with a step closer to the initial difference between SS distance and the pixel size we want\\n\\t\\t\\t\\t*/\\n\\t\\t\\t\\t// offsetStep += pixelSize - d;\\n\\t\\t\\t\\tvec3 move = offset;\\n\\t\\t\\t\\t\\n\\t\\t\\t\\tfor(int i = 0; i < SEARCH_STEPS; i++){\\n\\t\\t\\t\\t\\tmove = cOffset * offsetStep;\\n\\t\\t\\t\\t\\td = screenSpaceDistance(worldPos, worldPos + vec4(move, 0.));\\n\\t\\t\\t\\t\\tif(d > pixelSize) {\\n\\t\\t\\t\\t\\t\\tcorrectedLineWidth = offsetStep;\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\toffsetStep += offsetStep;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tworldPos.xyz += move;\\n\\n\\t\\t\\t\\t// project the worldpos\\n\\t\\t\\t\\tvec4 clip = projectionMatrix * worldPos;\\n\\n\\t\\t\\t\\t// shift the depth of the projected points so the line\\n\\t\\t\\t\\t// segments overlap neatly\\n\\t\\t\\t\\tvec3 clipPose = ( computedPosition.y < 0.5 ) ? ndcStart : ndcEnd;\\n\\t\\t\\t\\tclip.z = clipPose.z * clip.w;\\n\\n\\t\\t\\t#else\\n\\n\\t\\t\\t\\tvec2 offset = vec2( dir.y, - dir.x );\\n\\t\\t\\t\\t// undo aspect ratio adjustment\\n\\t\\t\\t\\tdir.x /= aspect;\\n\\t\\t\\t\\toffset.x /= aspect;\\n\\n\\t\\t\\t\\t// sign flip\\n\\t\\t\\t\\tif ( computedPosition.x < 0.0 ) offset *= - 1.0;\\n\\n\\t\\t\\t\\t// endcaps\\n\\t\\t\\t\\tif ( computedPosition.y < 0.0 ) {\\n\\n\\t\\t\\t\\t\\toffset += - dir;\\n\\n\\t\\t\\t\\t} else if ( computedPosition.y > 1.0 ) {\\n\\n\\t\\t\\t\\t\\toffset += dir;\\n\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// adjust for linewidth\\n\\t\\t\\t\\toffset *= linewidth;\\n\\n\\t\\t\\t\\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\\n\\t\\t\\t\\toffset /= resolution.y;\\n\\n\\t\\t\\t\\t// select end\\n\\t\\t\\t\\tvec4 clip = ( computedPosition.y < 0.5 ) ? clipStart : clipEnd;\\n\\n\\t\\t\\t\\t// back to clip space\\n\\t\\t\\t\\toffset *= clip.w;\\n\\n\\t\\t\\t\\tclip.xy += offset;\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\tgl_Position = clip;\\n\\n\\t\\t\\tvec4 mvPosition = ( computedPosition.y < 0.5 ) ? start : end; // this is an approximation\\n\\n\\t\\t\\t#include \\n\\t\\t\\t#include \\n\\t\\t\\t#include \\n\\n\\t\\t}\\n\\t\\t\",this.fragProgram=\"\\n\\t\\tuniform vec3 diffuse;\\n\\t\\tuniform float opacity;\\n\\t\\tuniform float linewidth;\\n\\t\\tvarying float vAlpha;\\n\\t\\t// varying vec3 debugColor;\\n\\n\\t\\t#ifdef USE_DASH\\n\\n\\t\\t\\tuniform float dashOffset;\\n\\t\\t\\tuniform float dashSize;\\n\\t\\t\\tuniform float gapSize;\\n\\n\\t\\t#endif\\n\\n\\t\\tvarying float vLineDistance;\\n\\n\\t\\t#ifdef WORLD_UNITS\\n\\n\\t\\t\\tvarying vec4 worldPos;\\n\\t\\t\\tvarying vec3 worldStart;\\n\\t\\t\\tvarying vec3 worldEnd;\\n\\t\\t\\tvarying float correctedLineWidth;\\n\\n\\t\\t\\t#ifdef USE_DASH\\n\\n\\t\\t\\t\\tvarying vec2 vUv;\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t#else\\n\\n\\t\\t\\tvarying vec2 vUv;\\n\\n\\t\\t#endif\\n\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\n\\t\\tvec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {\\n\\n\\t\\t\\tfloat mua;\\n\\t\\t\\tfloat mub;\\n\\n\\t\\t\\tvec3 p13 = p1 - p3;\\n\\t\\t\\tvec3 p43 = p4 - p3;\\n\\n\\t\\t\\tvec3 p21 = p2 - p1;\\n\\n\\t\\t\\tfloat d1343 = dot( p13, p43 );\\n\\t\\t\\tfloat d4321 = dot( p43, p21 );\\n\\t\\t\\tfloat d1321 = dot( p13, p21 );\\n\\t\\t\\tfloat d4343 = dot( p43, p43 );\\n\\t\\t\\tfloat d2121 = dot( p21, p21 );\\n\\n\\t\\t\\tfloat denom = d2121 * d4343 - d4321 * d4321;\\n\\n\\t\\t\\tfloat numer = d1343 * d4321 - d1321 * d4343;\\n\\n\\t\\t\\tmua = numer / denom;\\n\\t\\t\\tmua = clamp( mua, 0.0, 1.0 );\\n\\t\\t\\tmub = ( d1343 + d4321 * ( mua ) ) / d4343;\\n\\t\\t\\tmub = clamp( mub, 0.0, 1.0 );\\n\\n\\t\\t\\treturn vec2( mua, mub );\\n\\n\\t\\t}\\n\\n\\t\\tvoid main() {\\n\\n\\t\\t\\t#include \\n\\n\\t\\t\\t#ifdef USE_DASH\\n\\n\\t\\t\\t\\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\\n\\n\\t\\t\\t\\tif ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\tfloat alpha;\\n\\t\\t\\t#ifdef UNIFORM_OPACITY\\n\\t\\t\\t\\talpha = opacity;\\n\\t\\t\\t#else\\n\\t\\t\\t\\talpha = vAlpha;\\n\\t\\t\\t#endif\\n\\n\\n\\t\\t\\t#ifdef WORLD_UNITS\\n\\n\\t\\t\\t\\t// Find the closest points on the view ray and the line segment\\n\\t\\t\\t\\tvec3 rayEnd = normalize( worldPos.xyz ) * 1e5;\\n\\t\\t\\t\\tvec3 lineDir = worldEnd - worldStart;\\n\\t\\t\\t\\tvec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );\\n\\n\\t\\t\\t\\tvec3 p1 = worldStart + lineDir * params.x;\\n\\t\\t\\t\\tvec3 p2 = rayEnd * params.y;\\n\\t\\t\\t\\tvec3 delta = p1 - p2;\\n\\t\\t\\t\\tfloat len = length( delta );\\n\\t\\t\\t\\tfloat norm = len / correctedLineWidth;\\n\\n\\t\\t\\t\\t#ifndef USE_DASH\\n\\n\\t\\t\\t\\t\\t#ifdef USE_ALPHA_TO_COVERAGE\\n\\n\\t\\t\\t\\t\\t\\tfloat dnorm = fwidth( norm );\\n\\t\\t\\t\\t\\t\\talpha = 1.0 - smoothstep( 0.5 - dnorm, 0.5 + dnorm, norm );\\n\\n\\t\\t\\t\\t\\t#else\\n\\n\\t\\t\\t\\t\\t\\tif ( norm > 0.5 ) {\\n\\n\\t\\t\\t\\t\\t\\t\\tdiscard;\\n\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t#endif\\n\\n\\t\\t\\t\\t#endif\\n\\n\\t\\t\\t#else\\n\\n\\t\\t\\t\\t#ifdef USE_ALPHA_TO_COVERAGE\\n\\n\\t\\t\\t\\t\\t// artifacts appear on some hardware if a derivative is taken within a conditional\\n\\t\\t\\t\\t\\tfloat a = vUv.x;\\n\\t\\t\\t\\t\\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\\n\\t\\t\\t\\t\\tfloat len2 = a * a + b * b;\\n\\t\\t\\t\\t\\tfloat dlen = fwidth( len2 );\\n\\n\\t\\t\\t\\t\\tif ( abs( vUv.y ) > 1.0 ) {\\n\\n\\t\\t\\t\\t\\t\\talpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );\\n\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t#else\\n\\n\\t\\t\\t\\t\\tif ( abs( vUv.y ) > 1.0 ) {\\n\\n\\t\\t\\t\\t\\t\\tfloat a = vUv.x;\\n\\t\\t\\t\\t\\t\\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\\n\\t\\t\\t\\t\\t\\tfloat len2 = a * a + b * b;\\n\\n\\t\\t\\t\\t\\t\\tif ( len2 > 1.0 ) discard;\\n\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t#endif\\n\\n\\t\\t\\t#endif\\n\\n\\t\\t\\tvec4 diffuseColor = vec4( diffuse, alpha );\\n\\n\\t\\t\\t#include \\n\\t\\t\\t// #include COMMENTED CHUNK\\n\\t\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\t\\tdiffuseColor *= vColor;\\n\\t\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\t\\tdiffuseColor.rgb = vColor;\\n\\t\\t\\t#endif\\n\\n\\t\\t\\tgl_FragColor = vec4( diffuseColor.rgb, alpha );\\n\\n\\t\\t\\t#include \\n\\t\\t\\t#include \\n\\t\\t\\t#include \\n\\t\\t\\t#include \\n\\n\\t\\t}\\n\\t\\t\",this.uniforms=h.merge([V.line.uniforms,{uViewer_high:{value:this.userData.uViewer_high.value},uViewer_low:{value:this.userData.uViewer_low.value},pixelThreshold:{value:this.userData.pixelThreshold}}]),this.onBeforeCompile=function(e){e.uniforms.uViewer_high=this.userData.uViewer_high,e.uniforms.uViewer_low=this.userData.uViewer_low,e.uniforms.pixelThreshold=this.userData.pixelThreshold,e.vertexShader=this.vertProgram,e.fragmentShader=this.fragProgram};for(let e=0;e{Object.getOwnPropertyNames(t.prototype).forEach((r=>{Object.defineProperty(e.prototype,r,Object.getOwnPropertyDescriptor(t.prototype,r)||Object.create(null))}))}))}Ht(Ft,[Yt]),Ht(Dt,[Yt]),Ht(gt,[Yt]),Ht(Ct,[Yt]);class Qt extends Ft{get vertexShader(){return\"\\n#define STANDARD\\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n uniform mat4 rteShadowMatrix;\\n uniform vec3 uShadowViewer_high;\\n uniform vec3 uShadowViewer_low;\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\nvarying vec3 vViewPosition;\\n\\n#ifdef USE_TRANSMISSION\\n\\n varying vec3 vWorldPosition;\\n\\n#endif\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\n\\n\\nvoid main() {\\n\\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n\\n #include \\n #include \\n #include \\n #include \\n //#include // EDITED CHUNK\\n \\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n\\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n \\n mvPosition = modelViewMatrix * mvPosition;\\n\\n gl_Position = projectionMatrix * mvPosition;\\n\\n\\n #include \\n #include \\n\\n vViewPosition = - mvPosition.xyz;\\n\\n #include \\n // #include COMMENTED CHUNK!!!\\n #ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t// Offsetting the position used for querying occlusion along the world normal can be used to reduce shadow acne.\\n\\t\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\tvec4 shadowWorldPosition;\\n\\t#endif\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n vec4 shadowPosition = vec4(transformed, 1.0);\\n mat4 shadowMatrix = directionalShadowMatrix[ i ];\\n\\n #ifdef USE_RTE\\n shadowPosition = computeRelativePositionSeparate(position_low.xyz, position.xyz, uShadowViewer_low, uShadowViewer_high);\\n shadowMatrix = rteShadowMatrix;\\n #endif\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivotShadow = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uShadowViewer_low, uShadowViewer_high);\\n shadowPosition.xyz = rotate_vertex_position((shadowPosition - rtePivotShadow).xyz, tQuaternion) * tScale.xyz + rtePivotShadow.xyz + tTranslation.xyz;\\n #endif\\n shadowWorldPosition = modelMatrix * shadowPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n vDirectionalShadowCoord[ i ] = shadowMatrix * shadowWorldPosition;\\n\\t}\\n \\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t/*\\n\\t#if NUM_RECT_AREA_LIGHTS > 0\\n\\t\\t// TODO (abelnation): update vAreaShadowCoord with area light info\\n\\t#endif\\n\\t*/\\n #endif\\n\\n #include \\n\\n#ifdef USE_TRANSMISSION\\n\\n vWorldPosition = worldPosition.xyz;\\n\\n#endif\\n}\\n\"}get fragmentShader(){return\"\\n#define STANDARD\\n\\n#ifdef PHYSICAL\\n #define IOR\\n #define SPECULAR\\n#endif\\n\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n\\n#ifdef IOR\\n uniform float ior;\\n#endif\\n\\n#ifdef SPECULAR\\n uniform float specularIntensity;\\n uniform vec3 specularColor;\\n\\n #ifdef USE_SPECULARINTENSITYMAP\\n uniform sampler2D specularIntensityMap;\\n #endif\\n\\n #ifdef USE_SPECULARCOLORMAP\\n uniform sampler2D specularColorMap;\\n #endif\\n#endif\\n\\n#ifdef USE_CLEARCOAT\\n uniform float clearcoat;\\n uniform float clearcoatRoughness;\\n#endif\\n\\n#ifdef USE_SHEEN\\n uniform vec3 sheenColor;\\n uniform float sheenRoughness;\\n\\n #ifdef USE_SHEENCOLORMAP\\n uniform sampler2D sheenColorMap;\\n #endif\\n\\n #ifdef USE_SHEENROUGHNESSMAP\\n uniform sampler2D sheenRoughnessMap;\\n #endif\\n#endif\\n\\nvarying vec3 vViewPosition;\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\nvoid main() {\\n\\n #include \\n\\n vec4 diffuseColor = vec4( diffuse, opacity );\\n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n vec3 totalEmissiveRadiance = emissive;\\n\\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n\\n // accumulation\\n #include \\n #include \\n #include \\n #include \\n\\n // modulation\\n #include \\n\\n vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\n #include \\n\\n vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\n #ifdef USE_SHEEN\\n\\n // Sheen energy compensation approximation calculation can be found at the end of\\n // https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing\\n float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\n outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\\n\\n #endif\\n\\n #ifdef USE_CLEARCOAT\\n\\n float dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\\n\\n vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\n outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\\n\\n #endif\\n\\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n\\n}\\n\"}get baseUniforms(){return V.standard.uniforms}get uniformsDef(){return{uViewer_high:new t,uViewer_low:new t,rteShadowMatrix:new s,uShadowViewer_high:new t,uShadowViewer_low:new t,uTransforms:[new s],tTransforms:null,objCount:1}}constructor(e,t=[]){super(e),this.init(t)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}fastCopy(e,t){super.fastCopy(e,t);const r=t,n=e;r.color.copy(n.color),r.roughness=n.roughness,r.metalness=n.metalness,r.emissive.copy(n.emissive),r.emissiveIntensity=n.emissiveIntensity,r.envMap=n.envMap,r.envMapIntensity=n.envMapIntensity,r.refractionRatio=n.refractionRatio}onBeforeRender(e,t,r,n,i,l){Qt.matBuff.copy(r.matrixWorldInverse),Qt.matBuff.elements[12]=0,Qt.matBuff.elements[13]=0,Qt.matBuff.elements[14]=0,i.modelViewMatrix.copy(Qt.matBuff),Qt.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),Pt.DoubleToHighLowVector(Qt.vecBuff0,Qt.vecBuff1,Qt.vecBuff2),this.userData.uViewer_low.value.copy(Qt.vecBuff1),this.userData.uViewer_high.value.copy(Qt.vecBuff2),i instanceof kr&&i.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}Qt.matBuff=new s,Qt.vecBuff0=new t,Qt.vecBuff1=new t,Qt.vecBuff2=new t;const At=\"\\nuniform float size;\\nuniform float scale;\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n#endif\\n\\nvec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n}\\n\\nvec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n}\\n\\n#ifdef USE_GRADIENT_RAMP\\n attribute float gradientIndex;\\n varying float vGradientIndex;\\n#endif\\n\\nvoid main() {\\n\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t// #include COMMENTED CHUNK\\n\\t#ifdef USE_RTE\\n vec4 mvPosition = computeRelativePositionSeparate(position_low.xyz, position.xyz, uViewer_low, uViewer_high);\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n \\n #ifdef USE_INSTANCING\\n\\n mvPosition = instanceMatrix * mvPosition;\\n\\n #endif\\n mvPosition = modelViewMatrix * mvPosition;\\n\\n #ifdef USE_GRADIENT_RAMP\\n vGradientIndex = gradientIndex;\\n #endif\\n\\n gl_Position = projectionMatrix * mvPosition;\\n\\n\\tgl_PointSize = size;\\n\\n\\t#ifdef USE_SIZEATTENUATION\\n\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\n\\t#endif\\n\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\n}\\n\",Bt=\"\\nuniform vec3 diffuse;\\nuniform float opacity;\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef USE_GRADIENT_RAMP\\n\\tvarying float vGradientIndex;\\n\\tuniform sampler2D gradientRamp;\\n#endif\\n\\nvoid main() {\\n\\n\\t#include \\n\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\n\\t#ifdef USE_GRADIENT_RAMP\\n\\t\\tvec4 diffuseColor = vec4( texture2D(gradientRamp, vec2(vGradientIndex, 0.)).rgb, opacity );\\n\\t#else\\n\\t\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#endif\\n\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\n\\toutgoingLight = diffuseColor.rgb;\\n\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\n}\\n\";class _t extends q{constructor(e,r=[]){super(e),this.userData.uViewer_high={value:new t},this.userData.uViewer_low={value:new t},this.vertProgram=At,this.fragProgram=Bt,this.uniforms=h.merge([V.standard.uniforms,{uViewer_high:{value:this.userData.uViewer_high.value},uViewer_low:{value:this.userData.uViewer_low.value}}]),this.onBeforeCompile=function(e){e.uniforms.uViewer_high=this.userData.uViewer_high,e.uniforms.uViewer_low=this.userData.uViewer_low,e.vertexShader=this.vertProgram,e.fragmentShader=this.fragProgram},r&&(this.defines={});for(let e=0;e{const l=$t.getLoader(n,r);l?l.load(n,(r=>{const i=new U(t);i.compileEquirectangularShader();const l=i.fromEquirectangular(r);this._cache[n]=l.texture,r.dispose(),i.dispose(),e(this._cache[n])}),void 0,(e=>{i(`Loading asset ${n} failed ${e.message}`)})):i(`Loading asset ${n} failed`)}))}static getTexture(e){let t,r=null;return e.src?(r=e.src,t=e.type):r=e,this._cache[r]?Promise.resolve(this._cache[r]):new Promise(((e,n)=>{if(r.includes(\"data:image\")){const t=new Image;t.src=r,t.onload=()=>{const n=new T(t);n.needsUpdate=!0,this._cache[r]=n,e(n)},t.onerror=e=>{n(`Loading asset ${r} failed with ${e.toString()}`)}}else{const i=$t.getLoader(r,t);i?i.load(r,(t=>{this._cache[r]=t,e(this._cache[r])}),void 0,(e=>{n(`Loading asset ${r} failed ${e.message}`)})):n(`Loading asset ${r} failed`)}}))}static getFont(e){let t=null;return t=e.src?e.src:e,this._cache[t]?Promise.resolve(this._cache[t]):new Promise(((e,r)=>{(new Ee).load(t,(t=>{e(t)}),void 0,(e=>{r(`Loading asset ${t} failed ${e.message}`)}))}))}static async getTextureData(e){const t=await $t.getTexture(e),r=document.createElement(\"canvas\");r.width=t.image.width,r.height=t.image.height;const n=r.getContext(\"2d\");n.drawImage(t.image,0,0);const i=n.getImageData(0,0,r.width,r.height);return Promise.resolve(i)}static generateGradientRampTexture(e,t,r){}static generateDiscreetRampTexture(e){const t=e.length,r=new Uint8Array(4*(1*t));for(let t=0;t1)&&this.VisibilityState.reset(),this.StateKey=t,this.VisibilityState.rvs=[],this.VisibilityState.ghost=i,n&&(e=[...e,...this.getDescendantIds(e)]),r===tr.SHOW||r===tr.UNISOLATE)for(let t=0;t(e[t]=1,e)),{}));if(!(0!==Object.keys(this.VisibilityState.ids).length))return this.VisibilityState.command=tr.NONE,this.setFilters();let l;return this.VisibilityState.command=r,r!==tr.HIDE&&r!==tr.SHOW||(l=this.visibilityWalk),r!==tr.ISOLATE&&r!==tr.UNISOLATE||(l=this.isolationWalk),this.WTI.walk(l.bind(this)),this.setFilters()}visibilityWalk(e){return!e.model.atomic||(this.VisibilityState.ids[e.model.raw.id]&&this.VisibilityState.rvs.push(...this.WTI.getRenderTree().getRenderViewsForNode(e,e)),!0)}isolationWalk(e){if(!e.model.atomic||this.WTI.isRoot(e))return!0;const t=this.WTI.getRenderTree().getRenderViewsForNode(e,e);return this.VisibilityState.ids[e.model.raw.id]?this.VisibilityState.rvs=this.VisibilityState.rvs.filter((e=>!t.includes(e))):this.VisibilityState.rvs.push(...t),!0}setColorFilter(e,t=!0){return\"number\"===e.type?(this.ColorStringFilterState=null,this.ColorNumericFilterState=new lr,this.setNumericColorFilter(e,t)):\"string\"===e.type?(this.ColorNumericFilterState=null,this.ColorStringFilterState=new ir,this.setStringColorFilter(e,t)):void 0}setNumericColorFilter(e,t){this.ColorNumericFilterState.currentProp=e;const r=e.passMin||e.min,n=e.passMax||e.max,i={};for(let t=0;t=r&&e.valueGroups[t].value<=n&&(i[e.valueGroups[t].id]=e.valueGroups[t].value);const l=[],a=[];return this.WTI.walk((e=>{if(!e.model.atomic||this.WTI.isRoot(e))return!0;const t=this.WTI.getRenderTree().getRenderViewsForNode(e,e),s=i[e.model.raw.id];s?a.push({rvs:t,value:(s-r)/(n-r)}):l.push(...t)})),this.ColorNumericFilterState.colorGroups=a,this.ColorNumericFilterState.nonMatchingRvs=l,this.ColorNumericFilterState.ghost=t,this.ColorNumericFilterState.matchingIds=i,this.setFilters()}setStringColorFilter(e,t){this.ColorStringFilterState.currentProp=e;const r=[];for(const t of e.valueGroups){const e=Ge(t.value),n={...t,color:new x(e),rvs:[]};n.idMap={};for(let e=0;ee.color.getHex()))),i=[];this.WTI.walk((e=>{if(!e.model.atomic||this.WTI.isRoot(e))return!0;const t=r.find((t=>t.idMap[e.model.raw.id])),n=this.WTI.getRenderTree().getRenderViewNodesForNode(e,e);if(!t)return i.push(...n.map((e=>e.model.renderView))),!0;const l=[];return n.forEach((t=>{this.WTI.getRenderTree().getAtomicParent(t)===e&&l.push(t.model.renderView)})),t.rvs.push(...l),!0}));for(const e of r)delete e.idMap;return this.ColorStringFilterState.colorGroups=r,this.ColorStringFilterState.rampTexture=n,this.ColorStringFilterState.nonMatchingRvs=i,this.ColorStringFilterState.ghost=t,this.setFilters()}removeColorFilter(){return this.ColorStringFilterState=null,this.ColorNumericFilterState=null,this.setFilters()}selectObjects(e){return this.resetSelection(),this.populateGenericState(e,this.SelectionState),0!==this.SelectionState.rvs.length&&(this.SelectionState.id=this.Renderer.applyDirectFilter(this.SelectionState.rvs,{filterType:er.SELECT})),this.Renderer.updateClippingPlanes(),this.Renderer.viewer.requestRender(),this.emit(it.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}highlightObjects(e,t=!1){return this.resetHighlight(),this.HighlightState.ghost=t,this.populateGenericState(e,this.HighlightState),0!==this.HighlightState.rvs.length&&(this.HighlightState.id=this.Renderer.applyDirectFilter(this.HighlightState.rvs,{filterType:er.OVERLAY})),this.Renderer.viewer.requestRender(),this.emit(it.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}setUserObjectColors(e){this.UserspaceColorState=new sr,this.ColorNumericFilterState=null,this.ColorStringFilterState=null;const t=e.map((e=>({...e,nodes:[],rvs:[]})));this.WTI.walk((e=>{var r,n;if(!(null===(n=null===(r=e.model)||void 0===r?void 0:r.raw)||void 0===n?void 0:n.id))return!0;for(const r of t)if(r.objectIds.includes(e.model.raw.id)){r.nodes.push(e);const t=this.WTI.getRenderTree().getRenderViewNodesForNode(e,e).map((e=>e.model.renderView));t&&r.rvs.push(...t)}return!0})),this.UserspaceColorState.groups=t;const r=$t.generateDiscreetRampTexture(e.map((e=>new x(e.color).getHex())));return this.UserspaceColorState.rampTexture=r,this.setFilters()}removeUserObjectColors(){return this.UserspaceColorState=null,this.setFilters()}setUserMaterials(e){this.UserMaterialState=new ur;const t=e.map((e=>({...e,nodes:[],rvs:e.rvs?e.rvs:[]})));return this.WTI.walk((e=>{var r,n;if(!(null===(n=null===(r=e.model)||void 0===r?void 0:r.raw)||void 0===n?void 0:n.id))return!0;for(const r of t){if(r.rvs.length>0)return!0;if(r.objectIds.includes(e.model.raw.id)){r.nodes.push(e);const t=this.WTI.getRenderTree().getRenderViewNodesForNode(e,e).map((e=>e.model.renderView));t&&r.rvs.push(...t)}}return!0})),this.UserMaterialState.groups=t,this.setFilters()}removeUserMaterials(){return this.UserMaterialState=null,this.setFilters()}populateGenericState(e,t){let r=[...e];r=[...Array.from(new Set(r.map((e=>e))))],t.rvs=[],t.ids=[];const n=[];if(0!==r.length){this.WTI.walk((e=>(-1!==r.indexOf(e.model.raw.id)&&n.push(e),!0)));for(let e=0;ee.model.renderView))),t.ids.push(...r.map((e=>e.model.raw.id))))}}}resetSelection(){return this.SelectionState.rvs.length>0&&this.Renderer.removeDirectFilter(this.SelectionState.id),this.SelectionState=new ar,this.Renderer.updateClippingPlanes(),this.Renderer.viewer.requestRender(),this.emit(it.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}resetHighlight(){return this.HighlightState.rvs.length>0&&this.Renderer.removeDirectFilter(this.HighlightState.id),this.HighlightState=new ar,this.Renderer.viewer.requestRender(),this.emit(it.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}reset(){return this.Renderer.clearFilter(),this.VisibilityState=new nr,this.ColorStringFilterState=null,this.ColorNumericFilterState=null,this.SelectionState=new ar,this.HighlightState=new ar,this.UserspaceColorState=null,this.StateKey=null,null}setFilters(){var e,t;if(this.CurrentFilteringState={},this.Renderer.clearFilter(),this.Renderer.beginFilter(),this.UserMaterialState)for(const e of this.UserMaterialState.groups)this.Renderer.applyMaterial(e.rvs,e.material);if(this.ColorStringFilterState){this.CurrentFilteringState.colorGroups=[];let e=-1;for(const t of this.ColorStringFilterState.colorGroups)e++,this.Renderer.applyFilter(t.rvs,{filterType:er.COLORED,rampIndex:e/this.ColorStringFilterState.colorGroups.length,rampIndexColor:t.color,rampTexture:this.ColorStringFilterState.rampTexture}),this.CurrentFilteringState.colorGroups.push({value:t.value,color:t.color.getHexString(),ids:t.ids}),this.CurrentFilteringState.activePropFilterKey=this.ColorStringFilterState.currentProp.key}if(this.ColorNumericFilterState){for(const e of this.ColorNumericFilterState.colorGroups)this.Renderer.applyFilter(e.rvs,{filterType:er.GRADIENT,rampIndex:e.value});this.CurrentFilteringState.activePropFilterKey=this.ColorNumericFilterState.currentProp.key,this.CurrentFilteringState.passMin=this.ColorNumericFilterState.currentProp.passMin||this.ColorNumericFilterState.currentProp.min,this.CurrentFilteringState.passMax=this.ColorNumericFilterState.currentProp.passMax||this.ColorNumericFilterState.currentProp.max,this.CurrentFilteringState.isolatedObjects=Object.keys(this.ColorNumericFilterState.matchingIds)}const r=this.VisibilityState.command===tr.HIDE||this.VisibilityState.command===tr.SHOW,n=this.VisibilityState.command===tr.ISOLATE||this.VisibilityState.command===tr.UNISOLATE;(r||n)&&(this.Renderer.applyFilter(this.VisibilityState.rvs,{filterType:this.VisibilityState.ghost?er.GHOST:er.HIDDEN}),r&&(this.CurrentFilteringState.hiddenObjects=Object.keys(this.VisibilityState.ids)),n&&(this.CurrentFilteringState.isolatedObjects=Object.keys(this.VisibilityState.ids)));const i=(null===(e=this.ColorStringFilterState)||void 0===e?void 0:e.nonMatchingRvs)||(null===(t=this.ColorNumericFilterState)||void 0===t?void 0:t.nonMatchingRvs);let l=!1;if(this.ColorStringFilterState&&(l=this.ColorStringFilterState.ghost),this.ColorNumericFilterState&&(l=this.ColorNumericFilterState.ghost),i&&this.Renderer.applyFilter(i,{filterType:l?er.GHOST:er.HIDDEN}),this.UserspaceColorState){this.CurrentFilteringState.userColorGroups=[];let e=-1;for(const t of this.UserspaceColorState.groups)e++,this.Renderer.applyFilter(t.rvs,{filterType:er.COLORED,rampIndex:e/this.UserspaceColorState.groups.length,rampIndexColor:new x(t.color),rampTexture:this.UserspaceColorState.rampTexture}),this.CurrentFilteringState.userColorGroups.push({ids:t.objectIds,color:t.color})}return this.Renderer.endFilter(),0!==this.HighlightState.rvs.length&&(this.HighlightState.id=this.Renderer.applyDirectFilter(this.HighlightState.rvs,{filterType:this.HighlightState.ghost?er.GHOST:er.OVERLAY})),0!==this.SelectionState.rvs.length&&(this.SelectionState.id=this.Renderer.applyDirectFilter(this.SelectionState.rvs,{filterType:er.SELECT})),this.Renderer.viewer.requestRender(),this.emit(it.FilteringStateSet,this.CurrentFilteringState),this.CurrentFilteringState}getDescendantIds(e){const t=[],r=e.join(\",\");return this.idCache[r]&&this.idCache[r].length?this.idCache[r]:(this.WTI.walk((r=>{if(e.includes(r.model.raw.id)){const e=r.all((e=>void 0!==e.model.raw)).map((e=>e.model.raw.id));t.push(...e),this.idCache[r.model.raw.id]=e}return!0})),this.idCache[r]=t,t)}}!function(e){e[e.HIDE=10]=\"HIDE\",e[e.SHOW=11]=\"SHOW\",e[e.ISOLATE=20]=\"ISOLATE\",e[e.UNISOLATE=21]=\"UNISOLATE\",e[e.NONE=30]=\"NONE\"}(tr||(tr={}));class nr{constructor(){this.command=tr.NONE,this.ghost=!0,this.ids={},this.rvs=[]}reset(){this.ghost=!0,this.ids={},this.rvs=[]}}class ir{constructor(){this.ghost=!0}reset(){this.currentProp=null,this.colorGroups=[],this.nonMatchingRvs=[],this.rampTexture=null}}class lr{constructor(){this.ghost=!0}}class ar{constructor(){this.ids=[],this.rvs=[],this.ghost=!1}reset(){this.rvs=[],this.ids=[]}}class sr{constructor(){this.groups=[]}reset(){this.groups=[]}}class ur{constructor(){this.groups=[]}reset(){this.groups=[]}}class dr extends Qt{get vertexShader(){return\"\\n#define STANDARD\\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n uniform mat4 rteShadowMatrix;\\n uniform vec3 uShadowViewer_high;\\n uniform vec3 uShadowViewer_low;\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\nvarying vec3 vViewPosition;\\n\\n#ifdef USE_TRANSMISSION\\n\\n varying vec3 vWorldPosition;\\n\\n#endif\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\nattribute float gradientIndex;\\nvarying float vGradientIndex;\\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\nvoid main() {\\n\\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n\\n #include \\n #include \\n #include \\n #include \\n //#include // EDITED CHUNK\\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n \\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n\\n\\n mvPosition = modelViewMatrix * mvPosition;\\n\\n vGradientIndex = gradientIndex;\\n gl_Position = projectionMatrix * mvPosition;\\n\\n #include \\n #include \\n\\n vViewPosition = - mvPosition.xyz;\\n\\n #include \\n // #include // EDITED CHUNK\\n #ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t// Offsetting the position used for querying occlusion along the world normal can be used to reduce shadow acne.\\n\\t\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\tvec4 shadowWorldPosition;\\n\\t#endif\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n vec4 shadowPosition = vec4(transformed, 1.0);\\n mat4 shadowMatrix = directionalShadowMatrix[ i ];\\n\\n #ifdef USE_RTE\\n shadowPosition = computeRelativePositionSeparate(position_low.xyz, position.xyz, uShadowViewer_low, uShadowViewer_high);\\n shadowMatrix = rteShadowMatrix;\\n #endif\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivotShadow = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uShadowViewer_low, uShadowViewer_high);\\n shadowPosition.xyz = rotate_vertex_position((shadowPosition - rtePivotShadow).xyz, tQuaternion) * tScale.xyz + rtePivotShadow.xyz + tTranslation.xyz;\\n #endif\\n shadowWorldPosition = modelMatrix * shadowPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n vDirectionalShadowCoord[ i ] = shadowMatrix * shadowWorldPosition;\\n \\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t/*\\n\\t#if NUM_RECT_AREA_LIGHTS > 0\\n\\t\\t// TODO (abelnation): update vAreaShadowCoord with area light info\\n\\t#endif\\n\\t*/\\n #endif\\n #include \\n\\n#ifdef USE_TRANSMISSION\\n\\n vWorldPosition = worldPosition.xyz;\\n\\n#endif\\n}\\n\"}get fragmentShader(){return\"\\n#define STANDARD\\n\\n#ifdef PHYSICAL\\n #define IOR\\n #define SPECULAR\\n#endif\\n\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n\\n#ifdef IOR\\n uniform float ior;\\n#endif\\n\\n#ifdef SPECULAR\\n uniform float specularIntensity;\\n uniform vec3 specularColor;\\n\\n #ifdef USE_SPECULARINTENSITYMAP\\n uniform sampler2D specularIntensityMap;\\n #endif\\n\\n #ifdef USE_SPECULARCOLORMAP\\n uniform sampler2D specularColorMap;\\n #endif\\n#endif\\n\\n#ifdef USE_CLEARCOAT\\n uniform float clearcoat;\\n uniform float clearcoatRoughness;\\n#endif\\n\\n#ifdef USE_SHEEN\\n uniform vec3 sheenColor;\\n uniform float sheenRoughness;\\n\\n #ifdef USE_SHEENCOLORMAP\\n uniform sampler2D sheenColorMap;\\n #endif\\n\\n #ifdef USE_SHEENROUGHNESSMAP\\n uniform sampler2D sheenRoughnessMap;\\n #endif\\n#endif\\n\\nvarying vec3 vViewPosition;\\n\\nvarying float vGradientIndex;\\nuniform sampler2D gradientRamp;\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\nvoid main() {\\n\\n #include \\n\\n vec4 diffuseColor = vec4( texture2D(gradientRamp, vec2(vGradientIndex, 0.)).rgb, opacity );\\n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n vec3 totalEmissiveRadiance = emissive;\\n\\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n\\n // accumulation\\n #include \\n #include \\n #include \\n #include \\n\\n // modulation\\n #include \\n\\n vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\n #include \\n\\n vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\n #ifdef USE_SHEEN\\n\\n // Sheen energy compensation approximation calculation can be found at the end of\\n // https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing\\n float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\n outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\\n\\n #endif\\n\\n #ifdef USE_CLEARCOAT\\n\\n float dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\\n\\n vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\n outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\\n\\n #endif\\n\\n #include \\n #include \\n #include \\n #include \\n #include \\n #include \\n}\\n\"}get uniformsDef(){return{...super.uniformsDef,gradientRamp:null}}constructor(e,t=[]){super(e,t)}setGradientTexture(e){this.userData.gradientRamp.value=e,this.userData.gradientRamp.value.generateMipmaps=!1,this.userData.gradientRamp.value.minFilter=W,this.userData.gradientRamp.value.magFilter=W,this.needsUpdate=!0}onBeforeRender(e,t,r,n,i,l){Qt.matBuff.copy(r.matrixWorldInverse),Qt.matBuff.elements[12]=0,Qt.matBuff.elements[13]=0,Qt.matBuff.elements[14]=0,i.modelViewMatrix.copy(Qt.matBuff),Qt.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),Pt.DoubleToHighLowVector(Qt.vecBuff0,Qt.vecBuff1,Qt.vecBuff2),this.userData.uViewer_low.value.copy(Qt.vecBuff1),this.userData.uViewer_high.value.copy(Qt.vecBuff2),i instanceof kr&&i.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}var pr=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAABCAIAAAAn2YEhAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHoSURBVDhPTZRRdoMwDAQx9//seaEzI5sXpwFptVqvMOm6/t7retd1Le8XAdF6+SMEYr03l2fF4GJprcfixl4+tyklG6ZvxeAKWGxBQsKDk9FIdD+pDUFiak9IDQEWMAM4dczEZmWSDOXPBuAQ1OCLYI4bc0S0bbnlFOR6Vgo2WwgraIvgbh8L2ZNxRH5T7QWKyKz9E7kNnUE+KTA3Oz6O3YIOkop+4juHoh1H+m3slByVm9vgOCOoXr7HvBJSjLdJRUHuSrbse+jDiZOPPt/jZIv8WPJeW+JVzYj2CIHc9GaEjmc/OhF3C+neQoBgW/KKZx2VuyxFKqDBNwfqA8NXa7p0781GBT6TPkSOozQPMPer4sBqTrvZUZgqSKP5oaCXXirJdZ4jqyRbtyE8amCkLLkzW9qik7Fx9mWE9pHEh9vMHsIawZSPcxut2DcDyjzeKinisypDwQoKnLU5WVLz7pGO/nbrIhC2MMOaGrj8PRLmfKpSJcT4NZn5wFgbKbVlCzia76HbQZMAjP72IyX94v189i7Ewfa2wcdMTfGOqekE2i/O9LZRi/T8qwFuuvknA3kW/YnLTMVO22OwUXg0OZ1IAdeqcEjXffH2jjEqNmSvRZbF43BLuUPsYsk5XPu3NqD3WKzr/QfN+6p+JpC7ZQAAAABJRU5ErkJggg==\";class or extends Dt{get vertexShader(){return\"\\n#include \\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\n#if defined(BILLBOARD) || defined(BILLBOARD_FIXED)\\n uniform vec3 billboardPos;\\n uniform mat4 invProjection;\\n#endif\\n#ifdef BILLBOARD_FIXED\\n uniform vec2 billboardSize;\\n#endif\\n\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t// #include COMMENTED CHUNK\\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n\\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n \\n mvPosition = modelViewMatrix * mvPosition;\\n \\n #if defined(BILLBOARD)\\n float div = 1.;\\n gl_Position = projectionMatrix * (viewMatrix * vec4(billboardPos, 1.0) + vec4(position.x, position.y, 0., 0.0));\\n #elif defined(BILLBOARD_FIXED)\\n gl_Position = projectionMatrix * (viewMatrix * vec4(billboardPos, 1.0));\\n float div = gl_Position.w;\\n gl_Position /= gl_Position.w;\\n gl_Position.xy += position.xy * billboardSize;\\n #else\\n gl_Position = projectionMatrix * mvPosition;\\n #endif\\n\\n\\n\\t#include \\n\\t// #include COMMENTED CHUNK\\n #if NUM_CLIPPING_PLANES > 0\\n #if defined(BILLBOARD) || defined(BILLBOARD_FIXED)\\n vec4 movelViewProjection = gl_Position * div;\\n vClipPosition = - (invProjection * movelViewProjection).xyz;\\n #else\\n\\t vClipPosition = - mvPosition.xyz;\\n #endif\\n #endif\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}get fragmentShader(){return\"\\nuniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t// accumulation (baked indirect lighting only)\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t// modulation\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}get baseUniforms(){return V.basic.uniforms}get uniformsDef(){return{uViewer_high:new t,uViewer_low:new t,uTransforms:[new s],tTransforms:null,billboardPos:new t,billboardSize:new y,invProjection:new s,objCount:1}}set billboardPixelHeight(e){this._billboardPixelHeight=e}constructor(e,t=[]){super(e),this.init(t)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}fastCopy(e,t){super.fastCopy(e,t);const r=t,n=e;r.color.copy(n.color),r.refractionRatio=n.refractionRatio}onBeforeRender(e,t,r,n,i,l){if(this.defines.BILLBOARD_FIXED){const t=e.getDrawingBufferSize(or.vecBuff3);or.vecBuff3.set(this._billboardPixelHeight/t.x*2,this._billboardPixelHeight/t.y*2),this.userData.billboardSize.value.copy(or.vecBuff3),or.matBuff.copy(r.projectionMatrix).invert(),this.userData.invProjection.value.copy(or.matBuff)}this.defines.USE_RTE&&(or.matBuff.copy(r.matrixWorldInverse),or.matBuff.elements[12]=0,or.matBuff.elements[13]=0,or.matBuff.elements[14]=0,i.modelViewMatrix.copy(or.matBuff),or.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),Pt.DoubleToHighLowVector(or.vecBuff0,or.vecBuff1,or.vecBuff2)),this.userData.uViewer_low.value.copy(or.vecBuff1),this.userData.uViewer_high.value.copy(or.vecBuff2),i instanceof kr&&i.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}or.matBuff=new s,or.vecBuff0=new t,or.vecBuff1=new t,or.vecBuff2=new t,or.vecBuff3=new y;class cr extends or{get vertexShader(){return\"\\n#include \\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t// #include COMMENTED CHUNK\\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n \\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n \\n mvPosition = modelViewMatrix * mvPosition;\\n\\n gl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}get fragmentShader(){return\"\\nuniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n // We're disabling alpha testing because we need to use it for shadow rejection. Three.js gave me no choice\\n\\t// #include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t// accumulation (baked indirect lighting only)\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t// modulation\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}constructor(e,t=[]){super(e,t)}}class vr extends Dt{get vertexShader(){return\"\\n#include \\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\n#if defined(BILLBOARD) || defined(BILLBOARD_FIXED)\\n uniform vec3 billboardPos;\\n uniform mat4 invProjection;\\n#endif\\n#ifdef BILLBOARD_FIXED\\n uniform vec2 billboardSize;\\n#endif\\n\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t// #include COMMENTED CHUNK\\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n\\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n \\n mvPosition = modelViewMatrix * mvPosition;\\n \\n #if defined(BILLBOARD)\\n float div = 1.;\\n gl_Position = projectionMatrix * (viewMatrix * vec4(billboardPos, 1.0) + vec4(position.x, position.y, 0., 0.0));\\n #elif defined(BILLBOARD_FIXED)\\n gl_Position = projectionMatrix * (viewMatrix * vec4(billboardPos, 1.0));\\n float div = gl_Position.w;\\n gl_Position /= gl_Position.w;\\n gl_Position.xy += position.xy * billboardSize;\\n #else\\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.);\\n #endif\\n\\t#include \\n\\t// #include COMMENTED CHUNK\\n #if NUM_CLIPPING_PLANES > 0\\n #if defined(BILLBOARD) || defined(BILLBOARD_FIXED)\\n vec4 movelViewProjection = gl_Position * div;\\n vClipPosition = - (invProjection * movelViewProjection).xyz;\\n #else\\n\\t vClipPosition = - mvPosition.xyz;\\n #endif\\n #endif\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}get fragmentShader(){return\"\\nuniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t// accumulation (baked indirect lighting only)\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t// modulation\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}get baseUniforms(){return V.basic.uniforms}get uniformsDef(){return{uViewer_high:new t,uViewer_low:new t,uTransforms:[new s],tTransforms:null,objCount:1,billboardPos:new t,billboardSize:new y,invProjection:new s}}set billboardPixelHeight(e){this._billboardPixelHeight=e}get billboardPixelHeight(){return this._billboardPixelHeight}constructor(e,t=[]){super(e),this.init(t)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}getDerivedMaterial(){const e=we(this);for(const t in this.userData)e.uniforms[t]=this.userData[t];return e}onBeforeRender(e,t,r,n,i,l){if(this.defines.BILLBOARD_FIXED){const t=e.getDrawingBufferSize(vr.vecBuff3);vr.vecBuff3.set(this._billboardPixelHeight/t.x*2,this._billboardPixelHeight/t.y*2),this.userData.billboardSize.value.copy(vr.vecBuff3),vr.matBuff.copy(r.projectionMatrix).invert(),this.userData.invProjection.value.copy(vr.matBuff)}}}vr.matBuff=new s,vr.vecBuff0=new t,vr.vecBuff1=new t,vr.vecBuff2=new t,vr.vecBuff3=new y;class fr extends q{constructor(e,r=[]){super(e),this.userData.uViewer_high={value:new t},this.userData.uViewer_low={value:new t},this.userData.gradientRamp={value:null},this.vertProgram=At,this.fragProgram=Bt,this.uniforms=h.merge([V.standard.uniforms,{uViewer_high:{value:this.userData.uViewer_high.value},uViewer_low:{value:this.userData.uViewer_low.value},gradientRamp:{value:this.userData.gradientRamp.value}}]),this.onBeforeCompile=function(e){e.uniforms.uViewer_high=this.userData.uViewer_high,e.uniforms.uViewer_low=this.userData.uViewer_low,e.uniforms.gradientRamp=this.userData.gradientRamp,e.vertexShader=this.vertProgram,e.fragmentShader=this.fragProgram},r&&(this.defines={USE_GRADIENT_RAMP:\"\"});for(let e=0;e0}),r}static displayStyleFromNode(e){if(!e)return null;let t=null;if(e.model.raw.displayStyle){let r=e.model.raw.displayStyle.lineweight||0;const n=e.model.raw.displayStyle.units;r=n?r*Lt(n):0,r=r<.001?0:r,t={id:e.model.raw.displayStyle.id,color:e.model.raw.displayStyle.diffuse||e.model.raw.displayStyle.color,lineWeight:r}}else e.model.raw.renderMaterial&&(t={id:e.model.raw.renderMaterial.id,color:e.model.raw.renderMaterial.diffuse,lineWeight:0});return t}static fastCopy(e,t){t.fastCopy(e,t)}static isTransparent(e){return!0===e.transparent&&e.opacity<1}static isOpaque(e){return!1===e.transparent||!0===e.transparent&&e.opacity>=1}async createDefaultMeshMaterials(){this.meshHighlightMaterial=new Qt({color:294651,emissive:0,roughness:1,metalness:0,side:R},[\"USE_RTE\"]),this.meshHighlightMaterial.clipShadows=!0,this.meshHighlightMaterial.stencilWrite=!0,this.meshHighlightMaterial.stencilWriteMask=255,this.meshHighlightMaterial.stencilRef=0,this.meshHighlightMaterial.stencilFunc=M,this.meshHighlightMaterial.stencilZFail=N,this.meshHighlightMaterial.stencilZPass=N,this.meshHighlightMaterial.stencilFail=N,this.meshTransparentHighlightMaterial=new Qt({color:294651,emissive:0,roughness:1,metalness:0,side:R,transparent:!0,opacity:.5},[\"USE_RTE\"]),this.meshTransparentHighlightMaterial.clipShadows=!0,this.meshTransparentHighlightMaterial.stencilWrite=!0,this.meshTransparentHighlightMaterial.stencilWriteMask=255,this.meshTransparentHighlightMaterial.stencilRef=0,this.meshTransparentHighlightMaterial.stencilFunc=M,this.meshTransparentHighlightMaterial.stencilZFail=N,this.meshTransparentHighlightMaterial.stencilZPass=N,this.meshTransparentHighlightMaterial.stencilFail=N,this.meshGhostMaterial=new cr({color:16777215,side:o,transparent:!0,opacity:.1},[\"USE_RTE\"]),this.meshGhostMaterial.depthWrite=!1,this.meshGhostMaterial.alphaTest=1,this.meshGradientMaterial=new dr({side:R,transparent:!1,opacity:1},[\"USE_RTE\"]),this.meshGradientMaterial.setGradientTexture(await $t.getTexture(pr)),this.meshGradientMaterial.clipShadows=!0,this.meshTransparentGradientMaterial=new dr({side:R,transparent:!0,opacity:.5},[\"USE_RTE\"]),this.meshTransparentGradientMaterial.setGradientTexture(await $t.getTexture(pr)),this.meshTransparentGradientMaterial.clipShadows=!0,this.meshColoredMaterial=new dr({side:R,transparent:!1,wireframe:!1},[\"USE_RTE\"]),this.meshColoredMaterial.clipShadows=!0,this.meshTransparentColoredMaterial=new dr({side:R,transparent:!0,opacity:.5},[\"USE_RTE\"]),this.meshHiddenMaterial=new Qt({side:R,transparent:!1,opacity:1,wireframe:!1},[\"USE_RTE\"]),this.meshHiddenMaterial.visible=!1,this.meshOverlayMaterial=new Qt({color:314363,emissive:0,roughness:1,metalness:0,side:R},[\"USE_RTE\"]),this.meshOverlayMaterial.clipShadows=!0,this.meshTransparentOverlayMaterial=new Qt({color:314363,emissive:0,roughness:1,metalness:0,side:R,transparent:!0,opacity:.5},[\"USE_RTE\"]),this.meshTransparentHighlightMaterial.color.convertSRGBToLinear(),this.meshHighlightMaterial.color.convertSRGBToLinear(),this.meshOverlayMaterial.color.convertSRGBToLinear(),this.meshTransparentOverlayMaterial.color.convertSRGBToLinear()}async createLineDefaultMaterials(){this.lineHighlightMaterial=new wt({color:294651,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new y},[\"USE_RTE\"]),this.lineHighlightMaterial.color=new x(294651),this.lineHighlightMaterial.linewidth=1,this.lineHighlightMaterial.worldUnits=!1,this.lineHighlightMaterial.vertexColors=!0,this.lineHighlightMaterial.pixelThreshold=.5,this.lineHighlightMaterial.resolution=new y,this.lineGhostMaterial=new wt({color:16777215,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new y},[\"USE_RTE\"]),this.lineGhostMaterial.color=new x(16777215),this.lineGhostMaterial.linewidth=1,this.lineGhostMaterial.worldUnits=!0,this.lineGhostMaterial.vertexColors=!0,this.lineGhostMaterial.pixelThreshold=.5,this.lineGhostMaterial.resolution=new y,this.lineColoredMaterial=new wt({color:16777215,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new y},[\"USE_RTE\"]),this.lineColoredMaterial.color=new x(16777215),this.lineColoredMaterial.linewidth=1,this.lineColoredMaterial.worldUnits=!1,this.lineColoredMaterial.vertexColors=!0,this.lineColoredMaterial.pixelThreshold=.5,this.lineColoredMaterial.resolution=new y,this.lineHiddenMaterial=new wt({color:16777215,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new y},[\"USE_RTE\"]),this.lineHiddenMaterial.color=new x(16711680),this.lineHiddenMaterial.linewidth=1,this.lineHiddenMaterial.worldUnits=!1,this.lineHiddenMaterial.vertexColors=!0,this.lineHiddenMaterial.pixelThreshold=.5,this.lineHiddenMaterial.resolution=new y,this.lineHiddenMaterial.visible=!1,this.lineOverlayMaterial=new wt({color:314363,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new y},[\"USE_RTE\"]),this.lineHighlightMaterial.color=new x(314363),this.lineHighlightMaterial.linewidth=1,this.lineHighlightMaterial.worldUnits=!1,this.lineHighlightMaterial.vertexColors=!0,this.lineHighlightMaterial.pixelThreshold=.5,this.lineHighlightMaterial.resolution=new y,this.lineHighlightMaterial.color.convertSRGBToLinear(),this.lineOverlayMaterial.color.convertSRGBToLinear()}async createDefaultPointMaterials(){this.pointCloudHighlightMaterial=new _t({color:294651,vertexColors:!0,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.pointHighlightMaterial=new _t({color:294651,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.pointGhostMaterial=new _t({color:16777215,vertexColors:!1,size:2,opacity:.01,sizeAttenuation:!1},[\"USE_RTE\"]),this.pointCloudOverlayMaterial=new _t({color:314363,vertexColors:!0,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.pointOverlayMaterial=new _t({color:314363,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.pointCloudColouredMaterial=new fr({color:16777215,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.pointCloudGradientMaterial=new fr({color:16777215,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.pointCloudGradientMaterial.setGradientTexture(await $t.getTexture(pr)),this.pointCloudHighlightMaterial.color.convertSRGBToLinear(),this.pointCloudHighlightMaterial.toneMapped=!1,this.pointHighlightMaterial.color.convertSRGBToLinear(),this.pointHighlightMaterial.toneMapped=!1,this.pointOverlayMaterial.color.convertSRGBToLinear(),this.pointOverlayMaterial.toneMapped=!1,this.pointCloudOverlayMaterial.color.convertSRGBToLinear(),this.pointCloudOverlayMaterial.toneMapped=!1,this.pointGhostMaterial.toneMapped=!1}async createDefaultTextMaterials(){this.textHighlightMaterial=new vr({color:294651,opacity:1,side:R},[\"USE_RTE\"]),this.textHighlightMaterial.transparent=this.textHighlightMaterial.opacity<1,this.textHighlightMaterial.depthWrite=!this.textHighlightMaterial.transparent,this.textHighlightMaterial.toneMapped=!1,this.textHighlightMaterial.color.convertSRGBToLinear(),this.textHighlightMaterial=this.textHighlightMaterial.getDerivedMaterial(),this.textGhostMaterial=new vr({color:16777215,opacity:.1,side:R},[\"USE_RTE\"]),this.textGhostMaterial.transparent=this.textGhostMaterial.opacity<1,this.textGhostMaterial.depthWrite=!this.textGhostMaterial.transparent,this.textGhostMaterial.toneMapped=!1,this.textGhostMaterial.color.convertSRGBToLinear(),this.textGhostMaterial=this.textGhostMaterial.getDerivedMaterial(),this.textColoredMaterial=new vr({color:16777215,opacity:1,side:R},[\"USE_RTE\"]),this.textColoredMaterial.transparent=this.textColoredMaterial.opacity<1,this.textColoredMaterial.depthWrite=!this.textColoredMaterial.transparent,this.textColoredMaterial.toneMapped=!1,this.textColoredMaterial.color.convertSRGBToLinear(),this.textColoredMaterial=this.textColoredMaterial.getDerivedMaterial(),this.textOverlayMaterial=new vr({color:314363,opacity:1,side:R},[\"USE_RTE\"]),this.textOverlayMaterial.transparent=this.textOverlayMaterial.opacity<1,this.textOverlayMaterial.depthWrite=!this.textOverlayMaterial.transparent,this.textOverlayMaterial.toneMapped=!1,this.textOverlayMaterial.color.convertSRGBToLinear(),this.textOverlayMaterial=this.textOverlayMaterial.getDerivedMaterial(),this.textHiddenMaterial=new vr({color:16777215,opacity:1,side:R},[\"USE_RTE\"]),this.textHiddenMaterial.visible=!1,this.textHiddenMaterial.toneMapped=!1,this.textHiddenMaterial.color.convertSRGBToLinear(),this.textHiddenMaterial=this.textHiddenMaterial.getDerivedMaterial()}async createDefaultNullMaterials(){this.materialMap[Et.NullRenderMaterialHash]=new Qt({color:8355711,emissive:0,roughness:1,metalness:0,side:R},[\"USE_RTE\"]),this.materialMap[Et.NullRenderMaterialHash].color.convertSRGBToLinear(),this.materialMap[Et.NullRenderMaterialVertexColorsHash]=new Qt({color:16777215,emissive:0,roughness:1,metalness:0,side:R,vertexColors:!0},[\"USE_RTE\"]),this.materialMap[Et.NullRenderMaterialVertexColorsHash].color.convertSRGBToLinear();const e=Et.NullDisplayStyleHash;this.materialMap[e]=new wt({color:8355711,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new y},[\"USE_RTE\"]),this.materialMap[e].color=new x(8355711),this.materialMap[e].color.convertSRGBToLinear(),this.materialMap[e].linewidth=1,this.materialMap[e].worldUnits=!1,this.materialMap[e].vertexColors=!0,this.materialMap[e].pixelThreshold=.5,this.materialMap[e].resolution=new y,this.materialMap[Et.NullPointMaterialHash]=new _t({color:8355711,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.materialMap[Et.NullPointMaterialHash].color.convertSRGBToLinear(),this.materialMap[Et.NullPointCloudVertexColorsMaterialHash]=new _t({color:16777215,vertexColors:!0,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.materialMap[Et.NullPointCloudMaterialHash]=new _t({color:16777215,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"])}async createDefaultMaterials(){await this.createDefaultMeshMaterials(),await this.createLineDefaultMaterials(),await this.createDefaultPointMaterials(),await this.createDefaultTextMaterials(),await this.createDefaultNullMaterials(),this.defaultGradientTextureData=await $t.getTextureData(pr)}makeMeshMaterial(e){const t=new Qt({color:e.color,emissive:0,roughness:e.roughness,metalness:e.metalness,opacity:e.opacity,side:R},[\"USE_RTE\"]);return t.vertexColors=e.vertexColors,t.transparent=t.opacity<1,t.depthWrite=!t.transparent,t.clipShadows=!0,t.color.convertSRGBToLinear(),t}makeLineMaterial(e){const t=new wt({color:e.color,linewidth:e.lineWeight>0?e.lineWeight:1,worldUnits:e.lineWeight>0,vertexColors:!0,alphaToCoverage:!1,resolution:new y},[\"USE_RTE\"]);return t.color=new x(e.color),t.color.convertSRGBToLinear(),t.linewidth=e.lineWeight>0?e.lineWeight:1,t.worldUnits=e.lineWeight>0,t.vertexColors=!0,t.pixelThreshold=.5,t.resolution=new y,t}makePointMaterial(e){const t=-16777216===e.color,r=e.vertexColors&&t?16777215:e.color,n=new _t({color:r,opacity:e.opacity,vertexColors:e.vertexColors,size:2,sizeAttenuation:!1},[\"USE_RTE\"]);return n.transparent=n.opacity<1,n.depthWrite=!n.transparent,n.toneMapped=!1,n.color.convertSRGBToLinear(),n}makeTextMaterial(e){const t=new vr({color:e.color,opacity:1,side:R},[\"USE_RTE\"]);return t.transparent=t.opacity<1,t.depthWrite=!t.transparent,t.toneMapped=!1,t.color.convertSRGBToLinear(),t.getDerivedMaterial()}getMaterial(e,t,r){let n;switch(r){case Kt.MESH:n=this.getMeshMaterial(e,t);break;case Kt.LINE:n=this.getLineMaterial(e,t);break;case Kt.POINT:n=this.getPointMaterial(e,t);break;case Kt.POINT_CLOUD:n=this.getPointCloudMaterial(e,t);break;case Kt.TEXT:n=this.getTextMaterial(e,t)}return n.clippingPlanes=[],n}getMeshMaterial(e,t){return t?this.makeMeshMaterial(t):this.materialMap[e]?this.materialMap[e].clone():void We.warn(`Could not create mesh material hash ${e} for `,t)}getLineMaterial(e,t){return this.materialMap[e]?this.materialMap[e]:this.makeLineMaterial(t)}getPointMaterial(e,t){return this.materialMap[e]?this.materialMap[e]:this.makePointMaterial(t)}getPointCloudMaterial(e,t){return this.getPointMaterial(e,t)}getTextMaterial(e,t){return this.makeTextMaterial(t)}getHighlightMaterial(e){switch(e.geometryType){case Kt.MESH:return e.transparent?this.meshTransparentHighlightMaterial:this.meshHighlightMaterial;case Kt.LINE:return this.lineHighlightMaterial;case Kt.POINT:return this.pointHighlightMaterial;case Kt.POINT_CLOUD:return this.pointCloudHighlightMaterial;case Kt.TEXT:return this.textHighlightMaterial}}getGhostMaterial(e){switch(e.geometryType){case Kt.MESH:return this.meshGhostMaterial;case Kt.LINE:return this.lineGhostMaterial;case Kt.POINT:case Kt.POINT_CLOUD:return this.pointGhostMaterial;case Kt.TEXT:return this.textGhostMaterial}}getGradientMaterial(e){switch(e.geometryType){case Kt.MESH:return e.transparent?this.meshTransparentGradientMaterial:this.meshGradientMaterial;case Kt.LINE:return this.lineColoredMaterial;case Kt.POINT:case Kt.POINT_CLOUD:return this.pointCloudGradientMaterial;case Kt.TEXT:return this.textColoredMaterial}}getColoredMaterial(e){switch(e.geometryType){case Kt.MESH:return e.transparent?this.meshTransparentColoredMaterial:this.meshColoredMaterial;case Kt.LINE:return this.lineColoredMaterial;case Kt.POINT:case Kt.POINT_CLOUD:return this.pointCloudColouredMaterial;case Kt.TEXT:return this.textColoredMaterial}}getOverlayMaterial(e){switch(e.geometryType){case Kt.MESH:return e.transparent?this.meshTransparentOverlayMaterial:this.meshOverlayMaterial;case Kt.LINE:return this.lineOverlayMaterial;case Kt.POINT:return this.pointOverlayMaterial;case Kt.POINT_CLOUD:return this.pointCloudOverlayMaterial;case Kt.TEXT:return this.textOverlayMaterial}}getHiddenMaterial(e){switch(e.geometryType){case Kt.MESH:return this.meshHiddenMaterial;case Kt.LINE:return this.lineHiddenMaterial;case Kt.POINT:case Kt.POINT_CLOUD:return this.meshHiddenMaterial;case Kt.TEXT:return this.textHiddenMaterial}}getDebugBatchMaterial(e){const t=new x(r.randInt(0,16777215));switch(t.convertSRGBToLinear(),e.geometryType){case Kt.MESH:return new Qt({color:t,emissive:0,roughness:1,metalness:0,opacity:1,side:R},[\"USE_RTE\"]);case Kt.LINE:{const e=new wt({color:t,linewidth:1,worldUnits:!1,vertexColors:!0,alphaToCoverage:!1,resolution:new y});return e.color=t,e.linewidth=1,e.worldUnits=!1,e.vertexColors=!0,e.pixelThreshold=.5,e.resolution=new y,e}case Kt.POINT:return new _t({color:t,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]);case Kt.POINT_CLOUD:return new _t({color:t,vertexColors:!0,size:2,sizeAttenuation:!1},[\"USE_RTE\"]);case Kt.TEXT:{const e=new vr({color:t,opacity:1,side:R},[\"USE_RTE\"]);return e.toneMapped=!1,e.color.convertSRGBToLinear(),e.getDerivedMaterial()}}}getFilterMaterial(e,t){let r;switch(t){case er.SELECT:r=this.getHighlightMaterial(e);break;case er.GHOST:r=this.getGhostMaterial(e);break;case er.GRADIENT:r=this.getGradientMaterial(e);break;case er.COLORED:r=this.getColoredMaterial(e);break;case er.OVERLAY:r=this.getOverlayMaterial(e);break;case er.HIDDEN:r=this.getHiddenMaterial(e)}return r.clippingPlanes=[],r}getFilterMaterialOptions(e){switch(e.filterType){case er.COLORED:return{rampIndex:void 0!==e.rampIndex?e.rampIndex:void 0,rampIndexColor:e.rampIndexColor,rampTexture:e.rampTexture?e.rampTexture:void 0,rampWidth:e.rampTexture?e.rampTexture.image.width:void 0};case er.GRADIENT:return{rampIndex:void 0!==e.rampIndex?e.rampIndex:void 0,rampIndexColor:void 0!==e.rampIndexColor?e.rampIndexColor:(new x).setRGB(this.defaultGradientTextureData.data[4*Math.floor(e.rampIndex*(this.defaultGradientTextureData.width-1))]/255,this.defaultGradientTextureData.data[4*Math.floor(e.rampIndex*(this.defaultGradientTextureData.width-1))+1]/255,this.defaultGradientTextureData.data[4*Math.floor(e.rampIndex*(this.defaultGradientTextureData.width-1))+2]/255).convertSRGBToLinear(),rampTexture:e.rampTexture?e.rampTexture:this.meshGradientMaterial.userData.gradientRamp.value,rampWidth:e.rampTexture?e.rampTexture.image.width:this.meshGradientMaterial.userData.gradientRamp.value.image.width}}}purge(){}}Sr.UNIFORM_VECTORS_USED=33;const hr=new s,Vr=new f,mr=new O,zr=new t,Xr=new t,br=new t,qr=new t,Kr=new t,Ur=new t,Tr=new t,xr=new t,Pr=new t,Wr=new t,yr=new y,Rr=new y,Mr=new y,Nr=new t,Or=new t,Lr=new f,Zr=new s;class kr extends L{get BVH(){return this.bvh}get batchObjects(){return this._batchObjects}constructor(e,t){super(e,t),this.bvh=null,this.batchMaterial=null,this.materialCache={},this.materialStack=[],this.transformsBuffer=null,this.transformsDirty=!0,this.transformsTextureUniform=null,this.transformsArrayUniforms=null,this.debugBatchBox=!1,this.batchMaterial=t}setBatchObjects(e,t){this._batchObjects=e,this.transformStorage=t,this.transformStorage===gr.VERTEX_TEXTURE?(this.transformsBuffer=new Float32Array(4*this._batchObjects.length*4),this.transformsTextureUniform=new P(this.transformsBuffer,this.transformsBuffer.length/4,1,Z,k)):this.transformStorage===gr.UNIFORM_ARRAY&&(this.transformsArrayUniforms=this._batchObjects.map((()=>new s))),this.updateTransformsUniform()}setOverrideMaterial(e){this.materialStack.push(this.material),this.materialCache[e.id]||(this.materialCache[e.id]=e.clone()),this.materialCache[e.id].copy(e),this.material=this.materialCache[e.id],this.material.needsUpdate=!0}getCachedMaterial(e,t=!1){return this.materialCache[e.id]?t&&Sr.fastCopy(e,this.materialCache[e.id]):this.materialCache[e.id]=e.clone(),this.materialCache[e.id]}restoreMaterial(){this.materialStack.length>0&&(this.material=this.materialStack.pop())}updateMaterialTransformsUniform(e){e.defines.TRANSFORM_STORAGE=this.transformStorage,this.transformStorage===gr.VERTEX_TEXTURE?(e.userData.tTransforms.value=this.transformsTextureUniform,e.userData.objCount&&(e.userData.objCount.value=this._batchObjects.length)):this.transformStorage===gr.UNIFORM_ARRAY&&(e.defines.OBJ_COUNT&&e.defines.OBJ_COUNT===this._batchObjects.length||(e.defines.OBJ_COUNT=this._batchObjects.length),e.userData.uTransforms.value=this.transformsArrayUniforms),e.needsUpdate=!0}updateTransformsUniform(){this.transformsDirty?(this.transformStorage===gr.VERTEX_TEXTURE?(this._batchObjects.forEach((e=>{const t=16*e.batchIndex;this.transformsBuffer[t]=e.quaternion.x,this.transformsBuffer[t+1]=e.quaternion.y,this.transformsBuffer[t+2]=e.quaternion.z,this.transformsBuffer[t+3]=e.quaternion.w,this.transformsBuffer[t+4]=e.pivot_Low.x,this.transformsBuffer[t+5]=e.pivot_Low.y,this.transformsBuffer[t+6]=e.pivot_Low.z,this.transformsBuffer[t+7]=e.scale.x,this.transformsBuffer[t+8]=e.pivot_High.x,this.transformsBuffer[t+9]=e.pivot_High.y,this.transformsBuffer[t+10]=e.pivot_High.z,this.transformsBuffer[t+11]=e.scale.y,this.transformsBuffer[t+12]=e.translation.x,this.transformsBuffer[t+13]=e.translation.y,this.transformsBuffer[t+14]=e.translation.z,this.transformsBuffer[t+15]=e.scale.z})),this.transformsTextureUniform.needsUpdate=!0):this._batchObjects.forEach(((e,t)=>{this.transformsArrayUniforms[t].set(e.quaternion.x,e.pivot_Low.x,e.pivot_High.x,e.translation.x,e.quaternion.y,e.pivot_Low.y,e.pivot_High.y,e.translation.y,e.quaternion.z,e.pivot_Low.z,e.pivot_High.z,e.translation.z,e.quaternion.w,e.scale.x,e.scale.y,e.scale.z)})),this.bvh&&(this.bvh.refit(),this.bvh.getBoundingBox(this.bvh.bounds),this.geometry.boundingBox.copy(this.bvh.bounds),this.geometry.boundingBox.getBoundingSphere(this.geometry.boundingSphere),!this.boxHelper&&this.debugBatchBox&&(this.boxHelper=new v(this.bvh.bounds,new x(16711680)),this.boxHelper.layers.set(En.PROPS),this.parent.add(this.boxHelper))),this.transformsDirty=!1):this.bvh&&(this.bvh.lastRefitTime=0)}buildBVH(){this.bvh=new Rt(this.batchObjects),this.bvh.tas.refit()}getBatchObjectMaterial(e){const t=e.renderView,r=this.geometry.groups.find((e=>t.batchStart>=e.start&&t.batchStart+t.batchCount<=e.count+e.start));return Array.isArray(this.material)?r?this.material[r.materialIndex]:(We.warn(`Could not get material for ${e.renderView.renderData.id}`),null):this.material}convertRaycastIntersect(e,t,r){return null===e?null:(e.point.applyMatrix4(t.matrixWorld),e.distance=e.point.distanceTo(r.ray.origin),e.object=t,e.distancer.far?null:e)}raycast(e,t){if(this.bvh){if(void 0===this.batchMaterial)return;Zr.copy(this.matrixWorld).invert(),Lr.copy(e.ray).applyMatrix4(Zr);const r=this.bvh;if(!0===e.firstHitOnly){const n=this.convertRaycastIntersect(r.raycastFirst(Lr,this.batchMaterial),this,e);n&&t.push(n)}else{const n=r.raycast(Lr,this.batchMaterial);for(let r=0,i=n.length;rr.far?null:{distance:d,point:Or.clone(),object:e,uv:void 0,uv2:void 0,face:void 0}}(e,r,n,i,Xr,br,qr,Nr);if(S){d&&(yr.fromBufferAttribute(d,o),Rr.fromBufferAttribute(d,c),Mr.fromBufferAttribute(d,v),S.uv=G.getUV(Nr,Xr,br,qr,yr,Rr,Mr,new y)),p&&(yr.fromBufferAttribute(p,o),Rr.fromBufferAttribute(p,c),Mr.fromBufferAttribute(p,v),S.uv2=G.getUV(Nr,Xr,br,qr,yr,Rr,Mr,new y));const e={a:o,b:c,c:v,normal:new t,materialIndex:0};G.getNormal(Xr,br,qr,e.normal),S.face=e}return S}kr.MeshBatchNumber=0;class jr{get renderView(){return this._renderView}get bvh(){return this._bvh}get batchIndex(){return this._batchIndex}get speckleId(){return this._renderView.renderData.id}constructor(e,r){this.quaternion=new E,this.pivot_High=new t,this.pivot_Low=new t,this.translation=new t,this.scale=new t(1,1,1),this._renderView=e,this._batchIndex=r,this.transform=(new s).identity(),this.transformInv=(new s).identity(),this._localOrigin=this._renderView.aabb.getCenter(new t),Pt.DoubleToHighLowVector(new t(this._localOrigin.x,this._localOrigin.y,this._localOrigin.z),this.pivot_Low,this.pivot_High)}buildBVH(){const e=(new s).makeTranslation(this._localOrigin.x,this._localOrigin.y,this._localOrigin.z);e.invert();const r=this._renderView.renderData.geometry.attributes.INDEX,n=this._renderView.renderData.geometry.attributes.POSITION,i=new Float32Array(n.length),l=new t;for(let t=0;t{t=Math.min(t,e.offset),r=Math.max(r,e.offset)})),this.geometry.setDrawRange(t,r-t+e.find((e=>e.offset===r)).count),this.mesh.visible=!0}getVisibleRange(){return 0===this.geometry.groups.length?Tt:{offset:this.geometry.drawRange.start,count:this.geometry.drawRange.count}}setDrawRanges(...e){e.forEach((e=>{var t;e.material&&(e.material=this.mesh.getCachedMaterial(e.material,null===(t=e.materialOptions)||void 0===t?void 0:t.needsCopy))}));const t=e.map((e=>e.material)),r=[...Array.from(new Set(t.map((e=>e))))];Array.isArray(this.mesh.material)||(this.mesh.material=[this.mesh.material]);for(let e=0;ee.offset-t.offset)),i=[];let l=1/0,a=0;for(let e=0;ee.material)),r=[...Array.from(new Set(t.map((e=>e))))];Array.isArray(this.mesh.material)||(this.mesh.material=[this.mesh.material]);for(let e=0;ee.offset-t.offset));for(let e=0;e(-1===e.indexOf(t.materialIndex)&&e.push(t.materialIndex),e)),i);const l=[];for(let e=0;et.materialIndex===i[e])));this.geometry.groups=[];for(let e=0;et.id===e)))||void 0===t?void 0:t.materialIndex;n&&(this.geometry.groups=this.geometry.groups.filter((t=>!(t.id&&t.id===e))),this.mesh.material.splice(n,1),n!==r-1&&this.geometry.groups.forEach((e=>{e.materialIndex>n&&e.materialIndex--})))}getDrawRangeCollision(e){if(this.geometry.groups.length>0){for(let t=0;t0===e.start&&e.count===this.getCount()&&0===e.materialIndex));-1!==e&&this.geometry.groups.splice(e,1);const t=this.geometry.groups.sort(((e,t)=>e.start-t.start)).slice(),r=t.map((e=>e.start));for(let e=0;e{const r=this.mesh.material[e.materialIndex],n=this.mesh.material[t.materialIndex],i=+n.visible-+r.visible,l=+r.transparent-+n.transparent;return 0!==i?i:l}));const n=[];t.reduce(((e,t)=>(-1===e.indexOf(t.materialIndex)&&e.push(t.materialIndex),e)),n);const i=[];for(let e=0;et.materialIndex===n[e])));const l=this.getCurrentIndexBuffer(),a=this.getNextIndexBuffer(),s=[],u={};let d=0;for(let e=0;e!1===this.mesh.material[e.materialIndex].visible));o&&this.setVisibleRange({offset:0,count:o.start})}createRenderViewMapping(){const e={};for(let t=0;te.renderData.geometry.attributes.INDEX)).length,t=this.renderViews.flatMap((e=>e.renderData.geometry.attributes.POSITION)).length,r=void 0!==this.renderViews[0].renderData.geometry.attributes.COLOR,n=new Uint32Array(e),i=new Float64Array(t),l=new Float32Array(r?t:0);l.fill(1);const a=new Float32Array(t/3);let s=0,u=0;const d=[];for(let e=0;ee+s/3)),u),i.set(t.attributes.POSITION,s),t.attributes.COLOR&&l.set(t.attributes.COLOR,s),a.fill(e,s/3,s/3+t.attributes.POSITION.length/3),this.renderViews[e].setBatchData(this.id,u,t.attributes.INDEX.length,s/3,s/3+t.attributes.POSITION.length/3);const r=new jr(this.renderViews[e],e);r.buildBVH(),d.push(r),s+=t.attributes.POSITION.length,u+=t.attributes.INDEX.length}this.makeMeshGeometry(n,i,a,r?l:null),this.mesh=new kr(this.geometry,this.batchMaterial),this.mesh.setBatchObjects(d,this.transformStorage),this.mesh.buildBVH(),this.mesh.uuid=this.id,this.mesh.layers.set(En.STREAM_CONTENT_MESH),this.mesh.frustumCulled=!1,this.mesh.material=[this.batchMaterial],this.mesh.geometry.addGroup(0,this.getCount(),0),jt.keepGeometryData||d.forEach((e=>{e.renderView.disposeGeometry()}))}getRenderView(e){return console.warn(\"Deprecated! Do not call this anymore\"),null}getMaterialAtIndex(e){return console.warn(\"Deprecated! Do not call this anymore\"),null}makeMeshGeometry(e,t,r,i){this.geometry=new u,t.length>=65535||e.length>=65535?(this.indexBuffer0=new d(e,1),this.indexBuffer1=new d(new Uint32Array(e.length),1)):(this.indexBuffer0=new p(e,1),this.indexBuffer1=new p(new Uint16Array(e.length),1)),this.geometry.setIndex(this.indexBuffer0),t&&this.geometry.setAttribute(\"position\",new n(t,3)),r&&this.geometry.setAttribute(\"objIndex\",new n(r,1)),i&&this.geometry.setAttribute(\"color\",new n(i,3));const l=new Float32Array(t.length/3);return this.gradientIndexBuffer=new n(l,1),this.gradientIndexBuffer.setUsage(w),this.geometry.setAttribute(\"gradientIndex\",this.gradientIndexBuffer),this.updateGradientIndexBufferData(0,l.length,0),this.updateGradientIndexBuffer(),Pt.computeVertexNormals(this.geometry,t),this.geometry.computeBoundingSphere(),this.geometry.computeBoundingBox(),Pt.updateRTEGeometry(this.geometry,t),this.geometry}updateGradientIndexBufferData(e,t,r){const n=this.geometry.index.array,i=this.gradientIndexBuffer.array;let l=1/0,a=0;for(let s=e;st.id===e));t.length&&(this.setDrawRanges(...t),this.insertedRanges=this.insertedRanges.filter((e=>!t.includes(e))))}autoFillDrawRanges(){}resetDrawRanges(){this.setDrawRanges({offset:0,count:1/0,material:this.batchMaterial}),this.mesh.material=this.batchMaterial,this.mesh.visible=!0,this.batchMaterial.transparent=!1}buildBatch(){let e=0;this.renderViews.forEach((t=>e+=t.needsSegmentConversion?2*(t.renderData.geometry.attributes.POSITION.length-3):t.renderData.geometry.attributes.POSITION.length));const t=new Float64Array(e);let r=0;for(let e=0;e=this.renderViews[t].batchStart&&e{t=Math.min(t,e.offset),r=Math.max(r,e.offset)})),this.geometry.setDrawRange(t,r-t+e.find((e=>e.offset===r)).count),this.mesh.visible=!0}getVisibleRange(){return Tt}setDrawRanges(...e){const t=e.map((e=>e.material)),r=[...Array.from(new Set(t.map((e=>e))))];Array.isArray(this.mesh.material)?this.mesh.material=this.mesh.material.concat(r):this.mesh.material=[this.mesh.material,...r];const n=e.sort(((e,t)=>e.offset-t.offset)),i=[];let l=1/0,a=0;for(let e=0;ee.material)),r=[...Array.from(new Set(t.map((e=>e))))];Array.isArray(this.mesh.material)||(this.mesh.material=[this.mesh.material]);for(let e=0;ee.offset-t.offset));for(let e=0;e!(t.id&&t.id===e)))}getDrawRangeCollision(e){if(this.geometry.groups.length>0){for(let t=0;t1&&0===this.geometry.groups[0].start&&this.geometry.groups[0].count===this.getCount()&&this.geometry.groups.shift();const e=this.geometry.groups.sort(((e,t)=>e.start-t.start)).slice();for(let t=0;t0&&this.geometry.addGroup(0,e[t].start,0),1===e.length&&e[t].start+e[t].counte.start-t.start));let t=0;this.geometry.groups.forEach((e=>{t+=e.count})),t(-1===e.indexOf(t.materialIndex)&&e.push(t.materialIndex),e)),e);const t=[];for(let r=0;rt.materialIndex===e[r])));this.geometry.groups=[];for(let e=0;ee.renderData.geometry.attributes.POSITION)).length,t=new Float64Array(e),r=new Float32Array(e).fill(1);let n=0;for(let e=0;e=this.renderViews[t].batchStart&&e=this.renderViews[t].batchStart&&ee.batchStart>=t.start&&e.batchStart+e.batchCount<=t.count+t.start));return Array.isArray(this.mesh.material)?r?this.mesh.material[r.materialIndex]:(We.warn(\"Malformed material index!\"),null):this.mesh.material}}makePointGeometry(e,t){this.geometry=new u,this.geometry.setAttribute(\"position\",new n(e,3)),this.geometry.setAttribute(\"color\",new n(t,3));const r=new Float32Array(e.length/3);return this.gradientIndexBuffer=new n(r,1),this.gradientIndexBuffer.setUsage(w),this.geometry.setAttribute(\"gradientIndex\",this.gradientIndexBuffer),this.updateGradientIndexBufferData(0,r.length,0),this.updateGradientIndexBuffer(),this.geometry.computeVertexNormals(),this.geometry.computeBoundingSphere(),this.geometry.computeBoundingBox(),Pt.updateRTEGeometry(this.geometry,e),this.geometry}updateGradientIndexBufferData(e,t,r){return this.gradientIndexBuffer.array.fill(r,e,t),this.gradientIndexBuffer.updateRange={offset:e,count:t-e},this.gradientIndexBuffer.needsUpdate=!0,this.geometry.attributes.gradientIndex.needsUpdate=!0,{minIndex:e,maxIndex:t}}updateGradientIndexBuffer(e,t){this.gradientIndexBuffer.updateRange={offset:void 0!==e?e:0,count:void 0!==e&&void 0!==t?t-e+1:-1},this.gradientIndexBuffer.needsUpdate=!0,this.geometry.attributes.gradientIndex.needsUpdate=!0}purge(){this.renderViews.length=0,this.geometry.dispose(),this.batchMaterial.dispose(),this.mesh=null}}class Jr{constructor(){this.boxes=new Array,this.worldBox=new c,this._worldOrigin=new t}get worldSize(){this.worldBox.getCenter(this._worldOrigin);const e=(new t).subVectors(this.worldBox.max,this.worldBox.min);return{x:e.x,y:e.y,z:e.z}}get worldOrigin(){return this._worldOrigin}expandWorld(e){this.boxes.push(e),this.updateWorld()}reduceWorld(e){this.boxes.splice(this.boxes.indexOf(e),1),this.updateWorld()}updateWorld(){this.worldBox.makeEmpty();for(let e=0;e{let r=0;return async()=>{Date.now()-r>=e&&(r=Date.now(),await new Promise((e=>setTimeout(e,t))))}})(e,t)}}const Yr={backgroundColor:null,backgroundCornerRadius:1,backgroundPixelHeight:50,textColor:new x(16777215),billboard:!1};class Fr extends L{static SpeckleTextParamsFromMetadata(e){return{textValue:e.value?e.value:\"N/A\",height:e.height}}get textMesh(){return this._text}get backgroundMesh(){return this._background}set style(e){Object.assign(this._style,e),this.updateStyle()}constructor(e){super(),this._text=null,this._background=null,this._backgroundSize=new t,this._style=Object.assign({},Yr),this._resolution=new y,this.defaultMaterial=new z({color:16777215,side:R,transparent:!0}),this.getFlatRaycastMesh=()=>{const e=new L(new F(1,1),this.defaultMaterial);return this.getFlatRaycastMesh=()=>e,e},this.getCurvedRaycastMesh=()=>{const e=new L(new F(1,1,32,1),this.defaultMaterial);return this.getCurvedRaycastMesh=()=>e,e},this.uuid=e,this._text=new Je,this._text.depthOffset=-.1,this._text.raycast=()=>{},this.add(this._text),this.onBeforeRender=e=>{e.getDrawingBufferSize(this._resolution)}}async update(e,t){return new Promise((r=>{e.textValue&&(this._text.text=e.textValue),e.richTextValue,e.height&&(this._text.fontSize=e.height),this._text.anchorX=e.anchorX,this._text.anchorY=e.anchorY,this._text._needsSync?this._text.sync((()=>{r(),t&&t()})):(r(),t&&t())}))}setTransform(e,t,r){e&&(this._style.billboard&&(this.textMesh.material.userData.billboardPos.value.copy(e),this._background.material.userData.billboardPos.value.copy(e)),this.position.copy(e)),t&&this.quaternion.copy(t),r&&this.scale.copy(r)}raycast(e,t){const{textRenderInfo:r,curveRadius:n}=this.textMesh;if(r){const i=r.blockBounds,l=n?this.getCurvedRaycastMesh():this.getFlatRaycastMesh(),a=l.geometry,{position:u,uv:d}=a.attributes;for(let t=0;t.1&&(i=this.RectangleRounded(1.2*r.x,1.2*r.y,.5,5),i.computeBoundingBox(),this._backgroundSize.copy(r),this._background&&(this._background.geometry=i)),null===this._background){const e=new or({},[\"BILLBOARD_FIXED\"]);e.toneMapped=!1,e.side=R,e.depthTest=!1,this._background=new L(i,e),this._background.layers.set(En.MEASUREMENTS),this._background.frustumCulled=!1,this._background.renderOrder=1,this.add(this._background)}const l=new x(this._style.backgroundColor).convertSRGBToLinear();this._background.material.color=l,this._background.material.billboardPixelHeight=this._style.backgroundPixelHeight*window.devicePixelRatio}RectangleRounded(e,t,r,n){const i=2*Math.PI,l=4*(n+1),s=[],d=[],p=[];let o,c,v,f,S;for(let e=1;et.id===e));t.length&&(this.setDrawRanges(...t),this.insertedRanges=this.insertedRanges.filter((e=>!t.includes(e))))}autoFillDrawRanges(){}resetDrawRanges(){this.mesh.textMesh.material=this.batchMaterial,this.mesh.textMesh.visible=!0}async buildBatch(){this.mesh=new Fr(this.id),this.mesh.matrixAutoUpdate=!1,await this.mesh.update(Fr.SpeckleTextParamsFromMetadata(this.renderViews[0].renderData.geometry.metaData)),this.mesh.matrix.copy(this.renderViews[0].renderData.geometry.bakeTransform),this.renderViews[0].setBatchData(this.id,0,this.mesh.textMesh.geometry.index.length/3),this.mesh.textMesh.material=this.batchMaterial,this.mesh.layers.set(En.STREAM_CONTENT_TEXT),this.mesh.textMesh.layers.set(En.STREAM_CONTENT_TEXT)}getRenderView(e){return this.renderViews[0]}getMaterialAtIndex(e){return this.batchMaterial}purge(){this.renderViews.length=0,this.batchMaterial.dispose(),this.mesh.geometry.dispose(),this.mesh=null}}var gr;!function(e){e[e.VERTEX_TEXTURE=0]=\"VERTEX_TEXTURE\",e[e.UNIFORM_ARRAY=1]=\"UNIFORM_ARRAY\"}(gr||(gr={}));class Cr{constructor(e,t){this.maxHardwareUniformCount=0,this.floatTextures=!1,this.maxBatchObjects=0,this.maxBatchVertices=5e5,this.batches={},this.maxHardwareUniformCount=e,this.maxBatchObjects=Math.floor((this.maxHardwareUniformCount-Sr.UNIFORM_VECTORS_USED)/4),this.floatTextures=t,this.materials=new Sr,this.materials.createDefaultMaterials()}async makeBatches(e,t,r){const n=e.getRenderableRenderViews(...t).sort(((e,t)=>0===e.renderMaterialHash?-1:0===t.renderMaterialHash?1:e.renderMaterialHash-t.renderMaterialHash)),i=[...Array.from(new Set(n.map((e=>e.renderMaterialHash))))];We.warn(`Batch count: ${i}`);for(let t=0;te.renderMaterialHash===i[t]));a=a.filter((e=>{const t=e.validGeometry;return t&&(l+=e.renderData.geometry.attributes.POSITION.length/3),t||e.hasMetadata}));const s=this.splitBatch(a,l);for(let n=0;n0===e.renderMaterialHash?-1:0===t.renderMaterialHash?1:e.renderMaterialHash-t.renderMaterialHash)),a=[...Array.from(new Set(l.map((e=>e.renderMaterialHash))))];let s=Number.MAX_SAFE_INTEGER,u=-1,d=0,p=0;for(let t=0;te.renderMaterialHash===a[t])),o=0;if(n=n.filter((e=>{const t=e.validGeometry;return t&&(o+=e.renderData.geometry.attributes.POSITION.length/3),t||e.hasMetadata})),0===n.length)continue;const c=this.splitBatch(n,o);for(let n=0;n0){let t=0,n=0;r.push([]);for(let i=0;i=this.maxBatchVertices&&e[i+1]&&(r.push([]),n++,t=0)}}else r.push(e);if(e[0].geometryType===Kt.MESH){const e=[];for(let t=0;t0&&e.push(r[t].slice(a,a+l))}return e}return r}async buildBatch(e,t,r,n){const i=t.filter((e=>e.renderMaterialHash===r));if(!i.length)return We.warn(\"All renderviews have invalid geometries. Skipping batch!\",t),null;const l=void 0!==n?n:i[0].geometryType;let a=null;l===Kt.MESH?a=t[0].renderData.renderMaterial:l===Kt.LINE?a=t[0].renderData.displayStyle:l===Kt.POINT||l===Kt.POINT_CLOUD?a=t[0].renderData.renderMaterial:l===Kt.TEXT&&(a=t[0].renderData.displayStyle);const s=this.materials.getMaterial(r,a,l),u=Pe();let d=null;switch(l){case Kt.MESH:d=new Ir(u,e.id,i,this.floatTextures?gr.VERTEX_TEXTURE:gr.UNIFORM_ARRAY);break;case Kt.LINE:d=new Er(u,e.id,i);break;case Kt.POINT:case Kt.POINT_CLOUD:d=new wr(u,e.id,i);break;case Kt.TEXT:d=new Dr(u,e.id,i)}return d.setBatchMaterial(s),await d.buildBatch(),d}update(e){for(const t in this.batches)this.batches[t].onUpdate(e)}render(e){for(const t in this.batches)this.batches[t].onRender(e)}saveVisiblity(){const e={};for(const t in this.batches){const r=this.batches[t];e[t]=r.getVisibleRange()}return e}applyVisibility(e){for(const t in this.batches){const r=this.batches[t],n=e[t];n?r.setVisibleRange(n):r.setVisibleRange(Ut)}}getTransparent(){const e={};for(const t in this.batches){const r=this.batches[t],n=r.renderObject;if(0===n.geometry.groups.length)Sr.isTransparent(n.material)&&(e[t]=Tt);else{const i=n.geometry.groups.find((e=>Sr.isTransparent(n.material[e.materialIndex]))),l=n.geometry.groups.find((e=>!1===n.material[e.materialIndex].visible));i&&(e[t]={offset:i.start,count:void 0!==l?l.start:r.getCount()-i.start})}}return e}getStencil(){const e={};for(const t in this.batches){const r=this.batches[t].renderObject;if(0===r.geometry.groups.length)!0===r.material.stencilWrite&&(e[t]=Tt);else{const n=r.geometry.groups.find((e=>!0===r.material[e.materialIndex].stencilWrite));n&&(e[t]={offset:n.start,count:n.count})}}return e}getOpaque(){const e={};for(const t in this.batches){const r=this.batches[t],n=r.renderObject;if(0===n.geometry.groups.length)Sr.isOpaque(n.material)&&(e[t]=Tt);else{const i=n.geometry.groups.find((e=>Sr.isTransparent(n.material[e.materialIndex])||!1===n.material[e.materialIndex].visible));e[t]={offset:0,count:void 0!==i?i.start:r.getCount()}}}return e}overrideMaterial(e,t){for(const r in e){if(this.batches[r].geometryType!==Kt.MESH)continue;this.batches[r].renderObject.setOverrideMaterial(t)}}restoreMaterial(e){for(const t in e){if(this.batches[t].geometryType!==Kt.MESH)continue;this.batches[t].renderObject.restoreMaterial()}}getByMaterialUUID(e){const t={};for(const r in this.batches){const n=this.batches[r],i=n.renderObject;if(0===i.geometry.groups.length)i.material.uuid===e&&(t[r]=Tt);else{const l=i.geometry.groups.find((t=>i.material[t.materialIndex].uuid===e));t[r]={offset:0,count:void 0!==l?l.start:n.getCount()}}}return t}purgeBatches(e){for(const t in this.batches)this.batches[t].subtreeId===e&&(this.batches[t].purge(),delete this.batches[t])}getBatches(e,t){return Object.values(this.batches).filter((r=>{const n=void 0===e||r.subtreeId===e,i=void 0===t||r.geometryType===t;return n&&i}))}getBatch(e){return Object.values(this.batches).find((t=>t.renderViews.includes(e)))}getRenderView(e,t){return this.batches[e]?this.batches[e].getRenderView(t):(We.error(\"Invalid batch id!\"),null)}getRenderViewMaterial(e,t){return this.batches[e]?this.batches[e].getMaterialAtIndex(t):(We.error(\"Invalid batch id!\"),null)}resetBatchesDrawRanges(){for(const e in this.batches)this.batches[e].resetDrawRanges()}setObjectsFilterMaterial(e,t,r=!0){return this.setObjectsMaterial(e,(e=>({offset:e.batchStart,count:e.batchCount,material:this.materials.getFilterMaterial(e,t.filterType),materialOptions:this.materials.getFilterMaterialOptions(t)})),r)}setObjectsMaterial(e,t,r=!0){let n=e;r&&(n=[...Array.from(new Set(e.map((e=>e))))]);const i=[...Array.from(new Set(n.map((e=>e.batchId))))];for(let e=0;et.batchId===i[e])).map(t);r.setDrawRanges(...l)}return i}insertObjectsFilterMaterial(e,t){let r=e;r=[...Array.from(new Set(e.map((e=>e))))];const n=[...Array.from(new Set(r.map((e=>e.batchId))))],i=Pe();for(let e=0;et.batchId===n[e])),s=a.filter((e=>!e.transparent)),u=a.filter((e=>e.transparent));let d,p;s.length&&(d=this.materials.getFilterMaterial(s[0],t.filterType).clone()),u.length&&(p=this.materials.getFilterMaterial(u[0],t.filterType).clone());const o=a.map((e=>({offset:e.batchStart,count:e.batchCount,material:e.transparent?p:d,materialOptions:this.materials.getFilterMaterialOptions(t),id:i})));l.insertDrawRanges(...o)}return i}removeObjectsMaterial(e){for(const t in this.batches)this.batches[t]&&this.batches[t].removeDrawRanges(e)}autoFillDrawRanges(e){[...Array.from(new Set(e.map((e=>e))))].forEach((e=>{e&&this.batches[e].autoFillDrawRanges()}))}async isolateRenderViewBatch(e,t){const r=t.getRenderViewForNodeId(e);for(const e in this.batches)e!==r.batchId&&this.batches[e].setDrawRanges({offset:0,count:this.batches[e].getCount(),material:this.materials.getFilterMaterial(this.batches[e].renderViews[0],er.GHOST)})}async isolateBatch(e){for(const t in this.batches)t!==e&&this.batches[t].setDrawRanges({offset:0,count:this.batches[t].getCount(),material:this.materials.getFilterMaterial(this.batches[t].renderViews[0],er.GHOST)})}}const Hr={hover:!1};class Qr extends ut{constructor(e,t){let r;super(),this.lastTap=0,this.lastClick=0,this.container=e,this.container.addEventListener(\"pointerdown\",(e=>{e.preventDefault(),r=(new Date).getTime()})),this.container.addEventListener(\"pointerup\",(e=>{e.preventDefault();const t=(new Date).getTime(),n=t-r,i=t-this.lastClick;if(n>250||i{this.touchLocation=e.targetTouches[0]})),this.container.addEventListener(\"touchend\",(e=>{if(e.targetTouches.length>0)return;const t=(new Date).getTime(),r=t-this.lastTap;clearTimeout(this.tapTimeout),r<500&&r>0?this.emit(it.ObjectDoubleClicked,this._getNormalisedClickPosition(this.touchLocation)):this.tapTimeout=setTimeout((function(){clearTimeout(this.tapTimeout)}),500),this.lastTap=t})),this.container.addEventListener(\"dblclick\",(e=>{const t=this._getNormalisedClickPosition(e);t.event=e,this.emit(it.ObjectDoubleClicked,t)})),this.container.addEventListener(\"pointermove\",(e=>{const t=this._getNormalisedClickPosition(e);t.event=e,this.emit(\"pointer-move\",t)})),document.addEventListener(\"keyup\",(e=>{this.emit(\"key-up\",e)}))}_getNormalisedClickPosition(e){const t=this.container,r=this.container.getBoundingClientRect(),n=(e.clientX-r.left)*t.width/r.width,i=(e.clientY-r.top)*t.height/r.height;return new y(n/t.width*2-1,i/t.height*-2+1)}dispose(){super.dispose()}}Qr.MAX_DOUBLE_CLICK_TIMING=500;class Ar extends D{constructor(e,t,r=0,n=1/0){super(e,t,r,n),this.onObjectIntersectionTest=null,this.layers.disableAll(),this.layers.enable(En.STREAM_CONTENT),this.layers.enable(En.STREAM_CONTENT_MESH),this.layers.enable(En.STREAM_CONTENT_LINE),this.layers.enable(En.STREAM_CONTENT_TEXT),this.layers.enable(En.STREAM_CONTENT_POINT_CLOUD)}intersectObjects(e,t=!0,r=[]){for(let n=0,i=e.length;n{this.raycaster.layers.enable(e)})));const l=e.getObjectByName(\"ContentGroup\");let a=[];return l&&(a=this.raycaster.intersectObjects(l.children)),this.raycaster.layers.mask=i,0===a.length?null:(t&&a.sort(((e,t)=>e.distance-t.distance)),r&&(a=a.filter((e=>r.containsPoint(e.point)))),a)}}class en extends gt{get vertexShader(){return\"\\n#include \\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n uniform mat4 rteModelViewMatrix;\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\n#ifdef LINEAR_DEPTH\\n varying vec4 vViewPosition;\\n#endif\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n// This is used for computing an equivalent of gl_FragCoord.z that is as high precision as possible.\\n// Some platforms compute gl_FragCoord at a lower precision which makes the manually computed value better for\\n// depth-based postprocessing effects. Reproduced on iPad with A10 processor / iPadOS 13.3.1.\\nvarying vec2 vHighPrecisionZW;\\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\n\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t//#include // EDITED CHUNK\\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n\\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n \\n mvPosition = rteModelViewMatrix * mvPosition;\\n\\n #ifdef LINEAR_DEPTH\\n vViewPosition = mvPosition;\\n #endif \\n \\n gl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t// #include \\n #if NUM_CLIPPING_PLANES > 0\\n\\t vClipPosition = - mvPosition.xyz;\\n #endif\\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\\n\"}get fragmentShader(){return\"\\n#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#ifdef LINEAR_DEPTH\\n varying vec4 vViewPosition;\\n\\tuniform float near;\\n\\tuniform float far;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\n\\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t// #include \\n\\t#ifdef USE_ALPHATEST\\n\\t\\tif ( diffuseColor.a < alphaTest ) discard;\\n\\t\\t/** This is a workaround for rejecting shadows for certain materials, since three.js gave me no choice*/\\n\\t\\t#ifdef ALPHATEST_REJECTION\\n\\t\\t\\tif (alphaTest > 0. ) discard;\\n\\t\\t#endif\\n\\t#endif\\n\\t#include \\n\\t// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.\\n\\t#ifdef LINEAR_DEPTH\\n\\t\\t/** View z is negative moving away from the camera */\\n\\t\\tgl_FragColor = packDepthToRGBA((vViewPosition.z + near) / (near - far));\\n\\t#else\\n\\t\\tfloat fragCoordZ = (0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5);\\n\\t\\t#if DEPTH_PACKING == 3200\\n\\t\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t\\t#elif DEPTH_PACKING == 3201\\n\\t\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t\\t#endif\\n\\t#endif\\n}\\n\"}get baseUniforms(){return V.depth.uniforms}get uniformsDef(){return{uViewer_high:new t,uViewer_low:new t,rteModelViewMatrix:new s,near:0,far:0,uTransforms:[new s],tTransforms:null,objCount:1}}constructor(e,t=[]){super(e),this.init(t)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}onBeforeRender(e,t,r,n,i,l){en.matBuff.copy(r.matrixWorldInverse),en.matBuff.elements[12]=0,en.matBuff.elements[13]=0,en.matBuff.elements[14]=0,i.modelViewMatrix.copy(en.matBuff),en.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),Pt.DoubleToHighLowVector(en.vecBuff0,en.vecBuff1,en.vecBuff2),this.userData.uViewer_low.value.copy(en.vecBuff1),this.userData.uViewer_high.value.copy(en.vecBuff2),this.userData.rteModelViewMatrix.value.copy(i.modelViewMatrix),i instanceof kr&&i.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}en.matBuff=new s,en.vecBuff0=new t,en.vecBuff1=new t,en.vecBuff2=new t;class tn extends ge{constructor(){super(),this.frameIndex=0,this.materialCopy=new g({defines:{ACCUMULATE:0},uniforms:{tDiffuse:{value:null},tDiffuseInterp:{value:null},frameIndex:{value:0}},vertexShader:\"\\n\\t\\tvarying vec2 vUv;\\n\\t\\tvoid main() {\\n\\t\\t\\tvUv = uv;\\n\\t\\t\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n\\t\\t}\",fragmentShader:\"\\n\\t\\tuniform float opacity;\\n\\t\\tuniform sampler2D tDiffuse;\\n uniform sampler2D tDiffuseInterp;\\n\\t\\tvarying vec2 vUv;\\n #if ACCUMULATE == 1\\n uniform float frameIndex;\\n #endif\\n\\n\\t\\tvoid main() {\\n vec3 currentSample = texture2D( tDiffuse, vUv ).rgb;\\n \\n #if ACCUMULATE == 1\\n vec3 interpSample = texture2D( tDiffuseInterp, vUv ).rgb;\\n\\t\\t\\t gl_FragColor.rgb = mix(interpSample, currentSample, frameIndex/float(NUM_FRAMES));\\n #else\\n gl_FragColor.rgb = currentSample;\\n #endif\\n\\t\\t\\tgl_FragColor.a = 1.;\\n\\t\\t}\",blending:C}),this.materialCopy.transparent=!0,this.materialCopy.depthTest=!1,this.materialCopy.depthWrite=!1,this.materialCopy.blending=H,this.materialCopy.blendSrc=Q,this.materialCopy.blendDst=A,this.materialCopy.blendEquation=B,this.materialCopy.blendSrcAlpha=_,this.materialCopy.blendDstAlpha=A,this.materialCopy.blendEquationAlpha=B,this.materialCopy.needsUpdate=!0,this.fsQuad=new Ce(this.materialCopy)}setTexture(e,t){this.materialCopy.uniforms[e].value=t,this.materialCopy.needsUpdate=!0}get displayName(){return\"APPLYSAO\"}get outputTexture(){return null}setParams(e){}setFrameIndex(e){this.frameIndex=e}setRenderType(e){e===bn.NORMAL?this.materialCopy.defines.ACCUMULATE=0:(this.materialCopy.defines.ACCUMULATE=1,this.frameIndex=0),this.materialCopy.needsUpdate=!0}update(e,t){this.materialCopy.defines.NUM_FRAMES=Un.ACCUMULATE_FRAMES,this.materialCopy.uniforms.frameIndex.value=this.frameIndex,this.materialCopy.needsUpdate=!0}render(e,t,r){e.setRenderTarget(null);const n=e.autoClear;e.autoClear=!1,this.fsQuad.render(e),e.autoClear=n}}class rn extends ge{constructor(){super(),this.materialCopy=new g({defines:{INPUT_TYPE:0},uniforms:h.clone(He.uniforms),vertexShader:\"\\n varying vec2 vUv;\\n void main() {\\n vUv = uv;\\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n }\",fragmentShader:\"\\n uniform float opacity;\\n uniform sampler2D tDiffuse;\\n varying vec2 vUv;\\n\\n const float UnpackDownscale = 255. / 256.;\\n const vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\n const vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\n\\n float unpackRGBAToDepth( const in vec4 v ) {\\n return dot( v, UnpackFactors );\\n }\\n\\n vec3 unpackRGBToNormal( const in vec3 rgb ) {\\n return 2.0 * rgb.xyz - 1.0;\\n }\\n\\n void main() {\\n vec4 inSample = texture2D( tDiffuse, vUv );\\n vec3 outSample = inSample.rgb;\\n #if OUTPUT_TYPE == 1\\n outSample.rgb = vec3(unpackRGBAToDepth(inSample));\\n #endif\\n // #if OUTPUT_TYPE == 3\\n // outSample.rgb = unpackRGBToNormal(inSample.rgb);\\n // #endif\\n\\n gl_FragColor.rgb = outSample;\\n gl_FragColor.a = 1.;\\n }\",blending:C}),this.materialCopy.needsUpdate=!0,this.fsQuad=new Ce(this.materialCopy)}setOutputType(e){this.materialCopy.defines.OUTPUT_TYPE=e,this.materialCopy.needsUpdate=!0}setTexture(e,t){this.materialCopy.uniforms[e].value=t,this.materialCopy.needsUpdate=!0}get displayName(){return\"COPY-OUTPUT\"}get outputTexture(){return null}render(e,t,r){e.setRenderTarget(null);const n=e.autoClear;e.autoClear=!1,this.fsQuad.render(e),e.autoClear=n}}class nn extends ge{get enabledLayers(){return this._enabledLayers}constructor(){super(),this.layers=null,this._enabledLayers=[]}get displayName(){return\"BASE\"}get outputTexture(){return null}setLayers(e){this.layers=e,this._enabledLayers=e.slice()}enableLayer(e,t){this._enabledLayers.includes(e)?t||this._enabledLayers.splice(this._enabledLayers.indexOf(e),1):t&&this._enabledLayers.push(e)}applyLayers(e){null!==this.layers?(e.layers.disableAll(),this.layers.forEach((t=>{this._enabledLayers.includes(t)&&e.layers.enable(t)}))):e.layers.enableAll()}}var ln,an;!function(e){e[e.PERSPECTIVE_DEPTH=0]=\"PERSPECTIVE_DEPTH\",e[e.LINEAR_DEPTH=1]=\"LINEAR_DEPTH\"}(ln||(ln={})),function(e){e[e.FULL=0]=\"FULL\",e[e.HALF=1]=\"HALF\"}(an||(an={}));class sn extends nn{get displayName(){return\"DEPTH\"}get material(){return this.depthMaterial}get outputTexture(){return this.renderTarget.texture}get outputTextureHalf(){return this.renderTargetHalf.texture}set depthType(e){e===ln.LINEAR_DEPTH?this.depthMaterial.defines.LINEAR_DEPTH=\" \":delete this.depthMaterial.defines.LINEAR_DEPTH,this.depthMaterial.needsUpdate=!0}set depthSize(e){this.depthBufferSize=e}set depthSide(e){this.depthMaterial.side=e}constructor(){super(),this.depthMaterial=null,this.depthBufferSize=an.FULL,this.colorBuffer=new x,this.onBeforeRender=null,this.onAfterRender=null,this.renderTarget=new $(256,256,{minFilter:W,magFilter:W}),this.renderTargetHalf=new $(256,256,{minFilter:W,magFilter:W}),this.renderTarget.depthBuffer=!0,this.renderTarget.stencilBuffer=!0,this.renderTargetHalf.depthBuffer=!0,this.renderTargetHalf.stencilBuffer=!0,this.depthMaterial=new en({depthPacking:ee},[\"USE_RTE\",\"ALPHATEST_REJECTION\"]),this.depthMaterial.blending=C,this.depthMaterial.side=R}setClippingPlanes(e){this.depthMaterial.clippingPlanes=e}update(e,t){this.camera=t,this.scene=e,this.depthMaterial.userData.near.value=t.near,this.depthMaterial.userData.far.value=t.far,this.depthMaterial.needsUpdate=!0}render(e,t,r){this.onBeforeRender(),e.getClearColor(this.colorBuffer);const n=e.getClearAlpha(),i=e.autoClear;e.setRenderTarget(this.depthBufferSize===an.FULL?this.renderTarget:this.renderTargetHalf),e.autoClear=!1,e.setClearColor(0),e.setClearAlpha(1),e.clear();const l=e.shadowMap.enabled,a=e.shadowMap.needsUpdate;e.shadowMap.enabled=!1,e.shadowMap.needsUpdate=!1,this.applyLayers(this.camera),e.render(this.scene,this.camera),e.shadowMap.enabled=l,e.shadowMap.needsUpdate=a,this.scene.overrideMaterial=null,e.autoClear=i,e.setClearColor(this.colorBuffer),e.setClearAlpha(n),this.onAfterRender()}setSize(e,t){this.renderTarget.setSize(e,t),this.renderTargetHalf.setSize(.5*e,.5*t)}}class un extends Ct{get vertexShader(){return\"\\n#define NORMAL\\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n //#include // EDITED CHUNK\\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n\\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n\\n mvPosition = modelViewMatrix * mvPosition;\\n\\n gl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\t vViewPosition = - mvPosition.xyz;\\n #endif\\n}\\n\"}get fragmentShader(){return\"\\n#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\\n\"}get baseUniforms(){return V.normal.uniforms}get uniformsDef(){return{uViewer_high:new t,uViewer_low:new t,uTransforms:[new s],tTransforms:null}}constructor(e,t=[]){super(e),this.init(t)}customProgramCacheKey(){return this.constructor.name}copy(e){return super.copy(e),this.copyFrom(e),this}onBeforeRender(e,t,r,n,i,l){un.matBuff.copy(r.matrixWorldInverse),un.matBuff.elements[12]=0,un.matBuff.elements[13]=0,un.matBuff.elements[14]=0,i.modelViewMatrix.copy(un.matBuff),un.vecBuff0.set(r.matrixWorld.elements[12],r.matrixWorld.elements[13],r.matrixWorld.elements[14]),Pt.DoubleToHighLowVector(un.vecBuff0,un.vecBuff1,un.vecBuff2),this.userData.uViewer_low.value.copy(un.vecBuff1),this.userData.uViewer_high.value.copy(un.vecBuff2),i instanceof kr&&i.updateMaterialTransformsUniform(this),this.needsUpdate=!0}}un.matBuff=new s,un.vecBuff0=new t,un.vecBuff1=new t,un.vecBuff2=new t;class dn extends nn{get displayName(){return\"GEOMETRY-NORMALS\"}get outputTexture(){return this.renderTarget.texture}get material(){return this.normalsMaterial}constructor(){super(),this.normalsMaterial=null,this.colorBuffer=new x,this.onBeforeRender=null,this.onAfterRender=null,this.renderTarget=new $(256,256),this.renderTarget.depthBuffer=!0,this.renderTarget.stencilBuffer=!0,this.normalsMaterial=new un({},[\"USE_RTE\"]),this.normalsMaterial.blending=C,this.normalsMaterial.side=R}setClippingPlanes(e){this.normalsMaterial.clippingPlanes=e}update(e,t){this.camera=t,this.scene=e}render(e,t,r){this.onBeforeRender(),e.getClearColor(this.colorBuffer);const n=e.getClearAlpha(),i=e.autoClear;e.setRenderTarget(this.renderTarget),e.autoClear=!1,e.setClearColor(0),e.setClearAlpha(1),e.clear();const l=e.shadowMap.enabled,a=e.shadowMap.needsUpdate;e.shadowMap.enabled=!1,e.shadowMap.needsUpdate=!1,this.applyLayers(this.camera),e.render(this.scene,this.camera),e.shadowMap.enabled=l,e.shadowMap.needsUpdate=a,this.scene.overrideMaterial=null,e.autoClear=i,e.setClearColor(this.colorBuffer),e.setClearAlpha(n),this.onAfterRender()}setSize(e,t){this.renderTarget.setSize(e,t)}}var pn,on;!function(e){e[e.DEFAULT=0]=\"DEFAULT\",e[e.IMPROVED=1]=\"IMPROVED\",e[e.ACCURATE=2]=\"ACCURATE\"}(pn||(pn={})),function(e){e[e.RECONSTRUCTED_NORMALS=0]=\"RECONSTRUCTED_NORMALS\",e[e.AO=1]=\"AO\",e[e.AO_BLURRED=2]=\"AO_BLURRED\"}(on||(on={}));const cn={intensity:1.5,scale:0,kernelRadius:5,bias:.2,normalsType:pn.ACCURATE,blurEnabled:!0,blurRadius:2,blurStdDev:4,blurDepthCutoff:.007};class vn extends ge{get displayName(){return\"SAO\"}get outputTexture(){return this.saoRenderTarget.texture}constructor(){super(),this.params=cn,this.colorBuffer=new x,this.saoMaterial=null,this.vBlurMaterial=null,this.hBlurMaterial=null,this.saoRenderTarget=null,this.blurIntermediateRenderTarget=null,this.fsQuad=null,this._outputType=on.AO_BLURRED,this.outputScale=.5,this.saoRenderTarget=new $(256,256),this.blurIntermediateRenderTarget=new $(256,256),this.saoMaterial=new g({defines:{NUM_SAMPLES:7,NUM_RINGS:4,NORMAL_TEXTURE:0,DIFFUSE_TEXTURE:0,DEPTH_PACKING:1,PERSPECTIVE_CAMERA:1},fragmentShader:\"\\n\\t\\t#include \\n\\t\\tvarying vec2 vUv;\\n\\t\\t#if DIFFUSE_TEXTURE == 1\\n\\t\\tuniform sampler2D tDiffuse;\\n\\t\\t#endif\\n\\t\\tuniform sampler2D tDepth;\\n\\t\\t#if NORMAL_TEXTURE == 1\\n\\t\\tuniform sampler2D tNormal;\\n\\t\\t#endif\\n\\t\\tuniform float cameraNear;\\n\\t\\tuniform float cameraFar;\\n\\t\\tuniform mat4 cameraProjectionMatrix;\\n\\t\\tuniform mat4 cameraInverseProjectionMatrix;\\n\\t\\tuniform float scale;\\n\\t\\tuniform float intensity;\\n\\t\\tuniform float bias;\\n\\t\\tuniform float kernelRadius;\\n\\t\\tuniform float minResolution;\\n\\t\\tuniform vec2 size;\\n\\t\\tuniform float randomSeed;\\n\\t\\t// RGBA depth\\n\\t\\t#include \\n\\t\\tvec4 getDefaultColor( const in vec2 screenPosition ) {\\n\\t\\t\\t#if DIFFUSE_TEXTURE == 1\\n\\t\\t\\treturn texture2D( tDiffuse, vUv );\\n\\t\\t\\t#else\\n\\t\\t\\treturn vec4( 1.0 );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\tfloat getDepth( const in vec2 screenPosition ) {\\n\\t\\t\\t#if DEPTH_PACKING == 1\\n\\t\\t\\treturn unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );\\n\\t\\t\\t#else\\n\\t\\t\\treturn texture2D( tDepth, screenPosition ).x;\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\tfloat getViewZ( const in float depth ) {\\n\\t\\t\\t#if PERSPECTIVE_CAMERA == 1\\n\\t\\t\\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\\n\\t\\t\\t#else\\n\\t\\t\\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\tvec3 getViewPosition( const in vec2 screenPosition, const in float depth, const in float viewZ ) {\\n\\t\\t\\tfloat clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];\\n\\t\\t\\tvec4 clipPosition = vec4( ( vec3( screenPosition, depth ) - 0.5 ) * 2.0, 1.0 );\\n\\t\\t\\tclipPosition *= clipW; // unprojection.\\n\\t\\t\\treturn ( cameraInverseProjectionMatrix * clipPosition ).xyz;\\n\\t\\t}\\n\\n\\t\\t//https://wickedengine.net/2019/09/22/improved-normal-reconstruction-from-depth/\\n\\t\\tvec3 viewNormalImproved(in vec2 uv, in vec3 origin)\\n\\t\\t{\\t\\n\\t\\t\\thighp vec2 dd = abs(vec2(1./size.x, 1./size.y));\\n\\t\\t\\thighp vec2 ddx = vec2(dd.x, 0.);\\n\\t\\t\\thighp vec2 ddy = vec2(0., dd.y);\\n\\n\\t\\t\\tfloat sampleDepth = getDepth( uv - ddy );\\n\\t\\t\\tfloat sampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 top = getViewPosition( uv - ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getDepth( uv + ddy );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 bottom = getViewPosition( uv + ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\thighp vec3 center = origin;\\n\\t\\t\\t\\n\\t\\t\\tsampleDepth = getDepth( uv - ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 left = getViewPosition( uv - ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getDepth( uv + ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 right = getViewPosition( uv + ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\t // get the difference between the current and each offset position\\n\\t\\t\\tvec3 l = center - left;\\n\\t\\t\\tvec3 r = right - center;\\n\\t\\t\\tvec3 d = center - top;\\n\\t\\t\\tvec3 u = bottom - center;\\n\\n\\t\\t\\t// pick horizontal and vertical diff with the smallest z difference\\n\\t\\t\\tvec3 hDeriv = abs(l.z) < abs(r.z) ? l : r;\\n\\t\\t\\tvec3 vDeriv = abs(d.z) < abs(u.z) ? d : u;\\n\\n\\t\\t\\t// get view space normal from the cross product of the two smallest offsets\\n\\t\\t\\tvec3 viewNormal = normalize(cross(hDeriv, vDeriv));\\n\\n\\t\\t\\treturn viewNormal;\\n\\t\\t}\\n\\n\\t\\tvec3 viewNormalAccurate(in vec2 uv, in vec3 origin, in float centerDepth) {\\n\\t\\t\\thighp vec2 dd = abs(vec2(1./size.x, 1./size.y));\\n\\t\\t\\thighp vec2 ddx = vec2(dd.x, 0.);\\n\\t\\t\\thighp vec2 ddy = vec2(0., dd.y);\\n\\n\\t\\t\\tfloat sampleDepth = getDepth( uv - ddy );\\n\\t\\t\\tfloat sampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 top = getViewPosition( uv - ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getDepth( uv + ddy );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 bottom = getViewPosition( uv + ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\thighp vec3 center = origin;\\n\\t\\t\\t\\n\\t\\t\\tsampleDepth = getDepth( uv - ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 left = getViewPosition( uv - ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getDepth( uv + ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 right = getViewPosition( uv + ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\t // get the difference between the current and each offset position\\n\\t\\t\\tvec3 l = center - left;\\n\\t\\t\\tvec3 r = right - center;\\n\\t\\t\\tvec3 d = center - top;\\n\\t\\t\\tvec3 u = bottom - center;\\n\\n\\t\\t\\t// get depth values at 1 & 2 pixels offsets from current along the horizontal axis\\n\\t\\t\\tvec4 H = vec4(\\n\\t\\t\\t\\tgetDepth(uv - ddx),\\n\\t\\t\\t\\tgetDepth(uv + ddx),\\n\\t\\t\\t\\tgetDepth(uv - 2. * ddx),\\n\\t\\t\\t\\tgetDepth(uv + 2. * ddx)\\n\\t\\t\\t);\\n\\n\\t\\t\\t// get depth values at 1 & 2 pixels offsets from current along the vertical axis\\n\\t\\t\\tvec4 V = vec4(\\n\\t\\t\\t\\tgetDepth(uv - ddy),\\n\\t\\t\\t\\tgetDepth(uv + ddy),\\n\\t\\t\\t\\tgetDepth(uv - 2. * ddy),\\n\\t\\t\\t\\tgetDepth(uv + 2. * ddy)\\n\\t\\t\\t);\\n\\n\\t\\t\\t// current pixel's depth difference from slope of offset depth samples\\n\\t\\t\\t// differs from original article because we're using non-linear depth values\\n\\t\\t\\t// see article's comments\\n\\t\\t\\tvec2 he = abs((2. * H.xy - H.zw) - centerDepth);\\n\\t\\t\\tvec2 ve = abs((2. * V.xy - V.zw) - centerDepth);\\n\\n\\t\\t\\t// pick horizontal and vertical diff with the smallest depth difference from slopes\\n\\t\\t\\tvec3 hDeriv = he.x < he.y ? l : r;\\n\\t\\t\\tvec3 vDeriv = ve.x < ve.y ? d : u;\\n\\n\\t\\t\\t// get view space normal from the cross product of the best derivatives\\n\\t\\t\\tvec3 viewNormal = normalize(cross(hDeriv, vDeriv));\\n\\n\\t\\t\\treturn viewNormal;\\n\\n\\t\\t}\\n\\n\\t\\tvec3 getViewNormal( const in vec3 viewPosition, const in vec2 screenPosition, in float centerDepth ) {\\n\\t\\t\\t#if NORMAL_TEXTURE == 1\\n\\t\\t\\t\\treturn unpackRGBToNormal( texture2D( tNormal, screenPosition ).xyz );\\n\\t\\t\\t#elif IMPROVED_NORMAL_RECONSTRUCTION == 1\\n\\t\\t\\t\\treturn viewNormalImproved(screenPosition, viewPosition);\\n\\t\\t\\t#elif ACCURATE_NORMAL_RECONSTRUCTION == 1\\n\\t\\t\\t\\treturn viewNormalAccurate(screenPosition, viewPosition, centerDepth);\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn normalize( cross( dFdx( viewPosition ), dFdy( viewPosition ) ) );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\n\\t\\tfloat scaleDividedByCameraFar;\\n\\t\\tfloat minResolutionMultipliedByCameraFar;\\n\\t\\tfloat getOcclusion( const in vec3 centerViewPosition, const in vec3 centerViewNormal, const in vec3 sampleViewPosition ) {\\n\\t\\t\\tvec3 viewDelta = sampleViewPosition - centerViewPosition;\\n\\t\\t\\tfloat viewDistance = length( viewDelta );\\n\\t\\t\\tfloat scaledScreenDistance = scaleDividedByCameraFar * viewDistance;\\n\\t\\t\\treturn max(0.0, (dot(centerViewNormal, viewDelta) - minResolutionMultipliedByCameraFar) / scaledScreenDistance - bias) / (1.0 + pow2( scaledScreenDistance ) );\\n\\t\\t}\\n\\t\\t// moving costly divides into consts\\n\\t\\tconst float ANGLE_STEP = PI2 * float( NUM_RINGS ) / float( NUM_SAMPLES );\\n\\t\\tconst float INV_NUM_SAMPLES = 1.0 / float( NUM_SAMPLES );\\n\\t\\tfloat getAmbientOcclusion( const in vec3 centerViewPosition, in float centerDepth ) {\\n\\t\\t\\t// precompute some variables require in getOcclusion.\\n\\t\\t\\tscaleDividedByCameraFar = scale / cameraFar;\\n\\t\\t\\tminResolutionMultipliedByCameraFar = minResolution * cameraFar;\\n\\t\\t\\tvec3 centerViewNormal = getViewNormal( centerViewPosition, vUv, centerDepth );\\n\\t\\t\\t// jsfiddle that shows sample pattern: https://jsfiddle.net/a16ff1p7/\\n\\t\\t\\tfloat angle = rand( vUv + randomSeed ) * PI2;\\n\\t\\t\\tvec2 radius = vec2( kernelRadius * INV_NUM_SAMPLES ) / size;\\n\\t\\t\\tvec2 radiusStep = radius;\\n\\t\\t\\tfloat occlusionSum = 0.0;\\n\\t\\t\\tfloat weightSum = 0.0;\\n\\t\\t\\tfor( int i = 0; i < NUM_SAMPLES; i ++ ) {\\n\\t\\t\\t\\tvec2 sampleUv = vUv + vec2( cos( angle ), sin( angle ) ) * radius;\\n\\t\\t\\t\\tradius += radiusStep;\\n\\t\\t\\t\\tangle += ANGLE_STEP;\\n\\t\\t\\t\\tfloat sampleDepth = getDepth( sampleUv );\\n\\t\\t\\t\\tif( sampleDepth >= ( 1.0 - EPSILON ) ) {\\n\\t\\t\\t\\t\\tcontinue;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tfloat sampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\t\\tvec3 sampleViewPosition = getViewPosition( sampleUv, sampleDepth, sampleViewZ );\\n\\t\\t\\t\\tocclusionSum += getOcclusion( centerViewPosition, centerViewNormal, sampleViewPosition );\\n\\t\\t\\t\\tweightSum += 1.0;\\n\\t\\t\\t}\\n\\t\\t\\tif( weightSum == 0.0 ) discard;\\n\\t\\t\\treturn occlusionSum * ( intensity / weightSum );\\n\\t\\t}\\n\\t\\tvoid main() {\\n\\t\\t\\tfloat centerDepth = getDepth( vUv );\\n\\t\\t\\tif( centerDepth >= ( 1.0 - EPSILON ) ) {\\n\\t\\t\\t\\tdiscard;\\n\\t\\t\\t}\\n\\t\\t\\tfloat centerViewZ = getViewZ( centerDepth );\\n\\t\\t\\tvec3 viewPosition = getViewPosition( vUv, centerDepth, centerViewZ );\\n\\n\\t\\t\\t#ifdef OUTPUT_RECONSTRUCTED_NORMALS\\n\\t\\t\\t\\tvec3 normal;\\n\\t\\t\\t\\t#if IMPROVED_NORMAL_RECONSTRUCTION == 1\\n\\t\\t\\t\\t\\tnormal = viewNormalImproved(vUv, viewPosition);\\n\\t\\t\\t\\t#elif ACCURATE_NORMAL_RECONSTRUCTION == 1\\n\\t\\t\\t\\t\\tnormal = viewNormalAccurate(vUv, viewPosition, centerDepth);\\n\\t\\t\\t\\t#else\\n\\t\\t\\t\\t\\tnormal = normalize( cross( dFdx( viewPosition ), dFdy( viewPosition ) ) );\\n\\t\\t\\t\\t#endif\\n\\t\\t\\t\\tgl_FragColor.rgb = packNormalToRGB(normal);\\n\\t\\t\\t\\tgl_FragColor.a = 1.;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t#endif\\n\\t\\t\\t\\n\\t\\t\\tfloat ambientOcclusion = getAmbientOcclusion( viewPosition, centerDepth );\\n\\t\\t\\tgl_FragColor = getDefaultColor( vUv );\\n\\t\\t\\tgl_FragColor.xyz *= 1. - ambientOcclusion;\\n\\t\\t}\",vertexShader:\"\\n\\t\\tvarying vec2 vUv;\\n\\t\\tvoid main() {\\n\\t\\t\\tvUv = uv;\\n\\t\\t\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n\\t\\t}\",uniforms:h.clone(Qe.uniforms)}),this.saoMaterial.extensions.derivatives=!0,this.saoMaterial.defines.DEPTH_PACKING=1,this.saoMaterial.uniforms.tDepth.value=null,this.saoMaterial.uniforms.tNormal.value=null,this.saoMaterial.uniforms.size.value.set(256,256),this.saoMaterial.uniforms.minResolution.value=0,this.saoMaterial.blending=C,this.vBlurMaterial=new g({uniforms:h.clone(Ae.uniforms),defines:Object.assign({},Ae.defines),vertexShader:Ae.vertexShader,fragmentShader:Ae.fragmentShader}),this.vBlurMaterial.defines.DEPTH_PACKING=1,this.vBlurMaterial.uniforms.tDiffuse.value=this.saoRenderTarget.texture,this.vBlurMaterial.uniforms.tDepth.value=null,this.vBlurMaterial.uniforms.size.value.set(256,256),this.vBlurMaterial.blending=C,this.hBlurMaterial=new g({uniforms:h.clone(Ae.uniforms),defines:Object.assign({},Ae.defines),vertexShader:Ae.vertexShader,fragmentShader:Ae.fragmentShader}),this.hBlurMaterial.defines.DEPTH_PACKING=1,this.hBlurMaterial.uniforms.tDiffuse.value=this.blurIntermediateRenderTarget.texture,this.hBlurMaterial.uniforms.tDepth.value=null,this.hBlurMaterial.uniforms.size.value.set(256,256),this.hBlurMaterial.blending=C,this.fsQuad=new Ce(this.saoMaterial)}setParams(e){Object.assign(this.params,e)}setOutputType(e){this._outputType=e}setTexture(e,t){\"tDepth\"===e&&(this.saoMaterial.uniforms.tDepth.value=t,this.vBlurMaterial.uniforms.tDepth.value=t,this.hBlurMaterial.uniforms.tDepth.value=t),\"tNormal\"===e&&(this.saoMaterial.uniforms.tNormal.value=t),this.saoMaterial.needsUpdate=!0,this.vBlurMaterial.needsUpdate=!0,this.hBlurMaterial.needsUpdate=!0}update(e,t){this._outputType===on.RECONSTRUCTED_NORMALS?this.saoMaterial.defines.OUTPUT_RECONSTRUCTED_NORMALS=\"\":delete this.saoMaterial.defines.OUTPUT_RECONSTRUCTED_NORMALS,this.params.scale=t.far,this.saoMaterial.defines.PERSPECTIVE_CAMERA=t.isPerspectiveCamera?1:0,this.saoMaterial.defines.NORMAL_TEXTURE=this.params.normalsType===pn.DEFAULT?1:0,this.saoMaterial.defines.IMPROVED_NORMAL_RECONSTRUCTION=this.params.normalsType===pn.IMPROVED?1:0,this.saoMaterial.defines.ACCURATE_NORMAL_RECONSTRUCTION=this.params.normalsType===pn.ACCURATE?1:0,this.saoMaterial.uniforms.cameraNear.value=t.near,this.saoMaterial.uniforms.cameraFar.value=t.far,this.saoMaterial.uniforms.cameraInverseProjectionMatrix.value.copy(t.projectionMatrixInverse),this.saoMaterial.uniforms.cameraProjectionMatrix.value=t.projectionMatrix,this.saoMaterial.uniforms.intensity.value=this.params.intensity,this.saoMaterial.uniforms.scale.value=this.params.scale,this.saoMaterial.uniforms.kernelRadius.value=this.params.kernelRadius,this.saoMaterial.uniforms.bias.value=this.params.bias,this.saoMaterial.needsUpdate=!0,this.vBlurMaterial.defines.PERSPECTIVE_CAMERA=t.isPerspectiveCamera?1:0,this.hBlurMaterial.defines.PERSPECTIVE_CAMERA=t.isPerspectiveCamera?1:0,this.vBlurMaterial.uniforms.cameraNear.value=t.near,this.vBlurMaterial.uniforms.cameraFar.value=t.far,this.hBlurMaterial.uniforms.cameraNear.value=t.near,this.hBlurMaterial.uniforms.cameraFar.value=t.far;const r=this.params.blurDepthCutoff*(t.far-t.near);this.vBlurMaterial.uniforms.depthCutoff.value=r,this.hBlurMaterial.uniforms.depthCutoff.value=r,this.params.blurRadius=Math.floor(this.params.blurRadius),this.prevStdDev===this.params.blurStdDev&&this.prevNumSamples===this.params.blurRadius||(Be.configure(this.vBlurMaterial,this.params.blurRadius,this.params.blurStdDev,new y(0,1)),Be.configure(this.hBlurMaterial,this.params.blurRadius,this.params.blurStdDev,new y(1,0)),this.prevStdDev=this.params.blurStdDev,this.prevNumSamples=this.params.blurRadius),this.vBlurMaterial.needsUpdate=!0,this.hBlurMaterial.needsUpdate=!0}render(e){e.getClearColor(this.colorBuffer);const t=e.getClearAlpha(),r=e.autoClear;e.setRenderTarget(this.saoRenderTarget),e.autoClear=!1,e.setClearColor(16777215),e.setClearAlpha(1),e.clear(),this.fsQuad.material=this.saoMaterial,this.fsQuad.render(e),this.params.blurEnabled&&this._outputType===on.AO_BLURRED&&(e.setRenderTarget(this.blurIntermediateRenderTarget),e.setClearColor(16777215),e.setClearAlpha(1),e.clear(),this.fsQuad.material=this.vBlurMaterial,this.fsQuad.render(e),e.setRenderTarget(this.saoRenderTarget),this.fsQuad.material=this.hBlurMaterial,this.fsQuad.render(e)),e.autoClear=r,e.setClearColor(this.colorBuffer),e.setClearAlpha(t)}setSize(e,t){const r=e*this.outputScale,n=t*this.outputScale;this.saoRenderTarget.setSize(r,n),this.blurIntermediateRenderTarget.setSize(r,n),this.saoMaterial.uniforms.size.value.set(r,n),this.vBlurMaterial.uniforms.size.value.set(r,n),this.hBlurMaterial.uniforms.size.value.set(r,n),this.saoMaterial.needsUpdate=!0}}const fn={intensity:1,kernelRadius:30,kernelSize:16,bias:.01,minDistance:0,maxDistance:.008};class Sn extends ge{setTexture(e,t){\"tDepth\"===e&&(this.aoMaterial.uniforms.tDepth.value=t),\"tNormal\"===e&&(this.aoMaterial.uniforms.tNormal.value=t),this.aoMaterial.needsUpdate=!0}get outputTexture(){return this._accumulationBuffer.texture}get displayName(){return\"STATIC-AO\"}constructor(){super(),this.aoMaterial=null,this.accumulateMaterial=null,this.params=fn,this.frameIndex=0,this.kernels=[],this.noiseTextures=[],this._generationBuffer=new $(256,256),this._accumulationBuffer=new $(256,256),this.aoMaterial=new g({fragmentShader:\"\\n\\t\\t#include \\n\\t\\tvarying vec2 vUv;\\n\\t\\tuniform sampler2D tDepth;\\n\\t\\tuniform sampler2D tNormal;\\n uniform vec2 size;\\n\\n\\t\\tuniform float cameraNear;\\n\\t\\tuniform float cameraFar;\\n\\t\\tuniform mat4 cameraProjectionMatrix;\\n\\t\\tuniform mat4 cameraInverseProjectionMatrix;\\n\\n\\t\\tuniform float scale;\\n\\t\\tuniform float intensity;\\n\\t\\tuniform float bias;\\n\\t\\tuniform float kernelRadius;\\n\\t\\tuniform float minResolution;\\n uniform float frameIndex;\\n\\t\\tuniform float tanFov;\\n\\n\\t\\t#define AO_ESTIMATOR 1\\n\\t\\t// #define KERNEL_SIZE 16\\n\\t\\tuniform sampler2D tNoise;\\n\\t\\tuniform vec3 kernel[ KERNEL_SIZE ];\\n\\t\\tuniform float minDistance;\\n\\t\\tuniform float maxDistance;\\n\\n #define NUM_SAMPLES 16\\n #define SPIRAL_TURNS 2\\n\\t\\t\\n // #define NUM_FRAMES 16\\n\\n\\t\\t#define NORMAL_TEXTURE 0\\n\\t\\t#define IMPROVED_NORMAL_RECONSTRUCTION 0\\n\\t\\t#define ACCURATE_NORMAL_RECONSTRUCTION 1\\n\\t\\t\\n\\t\\t// RGBA depth\\n\\t\\t#include \\n\\t\\tvec4 getDefaultColor( const in vec2 screenPosition ) {\\n\\t\\t\\treturn vec4( 1.0 );\\n\\t\\t}\\n\\n\\n\\t\\tfloat getLinearDepth( const in vec2 screenPosition ) {\\n\\t\\t\\treturn unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );\\n\\t\\t}\\n\\n\\t\\tfloat getPerspectiveDepth(const in vec2 coords) {\\n\\t\\t\\tfloat linearDepth = unpackRGBAToDepth( texture2D( tDepth, coords ) );\\n\\t\\t\\t#if PERSPECTIVE_CAMERA == 1\\n\\t\\t\\t\\tfloat viewZ = orthographicDepthToViewZ(linearDepth, cameraNear, cameraFar);\\n\\t\\t\\t\\tfloat centerDepth = viewZToPerspectiveDepth(viewZ, cameraNear, cameraFar);\\n\\t\\t\\t\\treturn centerDepth;\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn linearDepth;\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\n\\t\\tfloat getViewDepth(const in float linearDepth) {\\n\\t\\t\\treturn orthographicDepthToViewZ(linearDepth, cameraNear, cameraFar);\\n\\t\\t}\\n\\n\\t\\tfloat getViewZ( const in float depth ) {\\n\\t\\t\\t#if PERSPECTIVE_CAMERA == 1\\n\\t\\t\\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\\n\\t\\t\\t#else\\n\\t\\t\\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\n\\t\\tvec3 getViewPosition( const in vec2 screenPosition, const in float depth, const in float viewZ ) {\\n\\t\\t\\tfloat clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];\\n\\t\\t\\tvec4 clipPosition = vec4( ( vec3( screenPosition, depth ) - 0.5 ) * 2.0, 1.0 );\\n\\t\\t\\tclipPosition *= clipW; // unprojection.\\n\\t\\t\\treturn ( cameraInverseProjectionMatrix * clipPosition ).xyz;\\n\\t\\t}\\n\\n\\t\\t//https://wickedengine.net/2019/09/22/improved-normal-reconstruction-from-depth/\\n\\t\\tvec3 viewNormalImproved(in vec2 uv, in vec3 origin)\\n\\t\\t{\\t\\n\\t\\t\\thighp vec2 dd = abs(vec2(1./size.x, 1./size.y));\\n\\t\\t\\thighp vec2 ddx = vec2(dd.x, 0.);\\n\\t\\t\\thighp vec2 ddy = vec2(0., dd.y);\\n\\n\\t\\t\\tfloat sampleDepth = getPerspectiveDepth( uv - ddy );\\n\\t\\t\\tfloat sampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 top = getViewPosition( uv - ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getPerspectiveDepth( uv + ddy );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 bottom = getViewPosition( uv + ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\thighp vec3 center = origin;\\n\\t\\t\\t\\n\\t\\t\\tsampleDepth = getPerspectiveDepth( uv - ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 left = getViewPosition( uv - ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getPerspectiveDepth( uv + ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 right = getViewPosition( uv + ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\t // get the difference between the current and each offset position\\n\\t\\t\\tvec3 l = center - left;\\n\\t\\t\\tvec3 r = right - center;\\n\\t\\t\\tvec3 d = center - top;\\n\\t\\t\\tvec3 u = bottom - center;\\n\\n\\t\\t\\t// pick horizontal and vertical diff with the smallest z difference\\n\\t\\t\\tvec3 hDeriv = abs(l.z) < abs(r.z) ? l : r;\\n\\t\\t\\tvec3 vDeriv = abs(d.z) < abs(u.z) ? d : u;\\n\\n\\t\\t\\t// get view space normal from the cross product of the two smallest offsets\\n\\t\\t\\tvec3 viewNormal = normalize(cross(hDeriv, vDeriv));\\n\\n\\t\\t\\treturn viewNormal;\\n\\t\\t}\\n\\n\\t\\tvec3 viewNormalAccurate(in vec2 uv, in vec3 origin, in float centerDepth) {\\n\\t\\t\\thighp vec2 dd = abs(vec2(1./size.x, 1./size.y));\\n\\t\\t\\thighp vec2 ddx = vec2(dd.x, 0.);\\n\\t\\t\\thighp vec2 ddy = vec2(0., dd.y);\\n\\n\\t\\t\\tfloat sampleDepth = getPerspectiveDepth( uv - ddy );\\n\\t\\t\\tfloat sampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 top = getViewPosition( uv - ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getPerspectiveDepth( uv + ddy );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 bottom = getViewPosition( uv + ddy, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\thighp vec3 center = origin;\\n\\t\\t\\t\\n\\t\\t\\tsampleDepth = getPerspectiveDepth( uv - ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 left = getViewPosition( uv - ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\tsampleDepth = getPerspectiveDepth( uv + ddx );\\n\\t\\t\\tsampleViewZ = getViewZ( sampleDepth );\\n\\t\\t\\thighp vec3 right = getViewPosition( uv + ddx, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\t // get the difference between the current and each offset position\\n\\t\\t\\tvec3 l = center - left;\\n\\t\\t\\tvec3 r = right - center;\\n\\t\\t\\tvec3 d = center - top;\\n\\t\\t\\tvec3 u = bottom - center;\\n\\n\\t\\t\\t// get depth values at 1 & 2 pixels offsets from current along the horizontal axis\\n\\t\\t\\tvec4 H = vec4(\\n\\t\\t\\t\\tgetLinearDepth(uv - ddx),\\n\\t\\t\\t\\tgetLinearDepth(uv + ddx),\\n\\t\\t\\t\\tgetLinearDepth(uv - 2. * ddx),\\n\\t\\t\\t\\tgetLinearDepth(uv + 2. * ddx)\\n\\t\\t\\t);\\n\\n\\t\\t\\t// get depth values at 1 & 2 pixels offsets from current along the vertical axis\\n\\t\\t\\tvec4 V = vec4(\\n\\t\\t\\t\\tgetLinearDepth(uv - ddy),\\n\\t\\t\\t\\tgetLinearDepth(uv + ddy),\\n\\t\\t\\t\\tgetLinearDepth(uv - 2. * ddy),\\n\\t\\t\\t\\tgetLinearDepth(uv + 2. * ddy)\\n\\t\\t\\t);\\n\\n\\t\\t\\t// current pixel's depth difference from slope of offset depth samples\\n\\t\\t\\t// differs from original article because we're using non-linear depth values\\n\\t\\t\\t// see article's comments\\n\\t\\t\\tvec2 he = abs((2. * H.xy - H.zw) - centerDepth);\\n\\t\\t\\tvec2 ve = abs((2. * V.xy - V.zw) - centerDepth);\\n\\n\\t\\t\\t// pick horizontal and vertical diff with the smallest depth difference from slopes\\n\\t\\t\\tvec3 hDeriv = he.x < he.y ? l : r;\\n\\t\\t\\tvec3 vDeriv = ve.x < ve.y ? d : u;\\n\\n\\t\\t\\t// get view space normal from the cross product of the best derivatives\\n\\t\\t\\tvec3 viewNormal = normalize(cross(hDeriv, vDeriv));\\n\\n\\t\\t\\treturn viewNormal;\\n\\n\\t\\t}\\n\\n\\t\\tvec3 getViewNormal( const in vec3 viewPosition, const in vec2 screenPosition, in float centerDepth ) {\\n\\t\\t\\t#if NORMAL_TEXTURE == 1\\n\\t\\t\\t\\treturn unpackRGBToNormal( texture2D( tNormal, screenPosition ).xyz );\\n\\t\\t\\t#elif IMPROVED_NORMAL_RECONSTRUCTION == 1\\n\\t\\t\\t\\treturn viewNormalImproved(screenPosition, viewPosition);\\n\\t\\t\\t#elif ACCURATE_NORMAL_RECONSTRUCTION == 1\\n\\t\\t\\t\\treturn viewNormalAccurate(screenPosition, viewPosition, centerDepth);\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn normalize( cross( dFdx( viewPosition ), dFdy( viewPosition ) ) );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\n\\n\\t\\tfloat scaleDividedByCameraFar;\\n\\t\\tfloat minResolutionMultipliedByCameraFar;\\n // moving costly divides into consts\\n\\t\\tconst float INV_NUM_SAMPLES = 1.0 / float( NUM_SAMPLES );\\n const float offset = PI2 / float(NUM_FRAMES);\\n\\n\\t\\tfloat computeKernelSize(float d, float r) {\\n\\t\\t\\t#if PERSPECTIVE_CAMERA == 1\\n\\t\\t\\t\\t// Apparently this is wrong\\n\\t\\t\\t\\t// return (r * tan(fov) * d) / (size.y * 0.5);\\n\\t\\t\\t\\t// And this is correct\\n\\t\\t\\t\\tfloat rp = r / (size.y * 0.5);\\n\\t\\t\\t\\treturn sqrt((rp*rp*tanFov*tanFov*d*d)/(1. + rp*rp*tanFov*tanFov));\\n\\t\\t\\t#else\\n\\t\\t\\t\\tfloat twoOrthoSize = size.y / (2./ cameraProjectionMatrix[1][1]);\\n\\t\\t\\t\\treturn r / twoOrthoSize;\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\n\\t\\tfloat getAmbientOcclusion( const in vec3 centerViewPosition, in float centerDepth ) {\\n #if AO_ESTIMATOR == 0\\n // precompute some variables require in getOcclusion.\\n scaleDividedByCameraFar = scale / cameraFar;\\n minResolutionMultipliedByCameraFar = minResolution * cameraFar;\\n vec3 centerViewNormal = getViewNormal( centerViewPosition, vUv, centerDepth );\\n // jsfiddle that shows sample pattern: https://jsfiddle.net/TenHands/jun67k9y/7/\\n float occlusionSum = 0.0;\\n float weightSum = 0.0;\\n for( int i = 0; i < NUM_SAMPLES; i ++ ) {\\n float alpha = ( float(i) + 1. ) / float(NUM_SAMPLES);\\n float angle = float(SPIRAL_TURNS) * alpha;\\n vec2 radius = (kernelRadius / size) * pow( alpha, 1.1 );\\n vec2 sampleUv = vUv + vec2( cos( angle + frameIndex * offset ), sin( angle + frameIndex * offset ) ) * radius;\\n\\n float sampleDepth = getPerspectiveDepth( sampleUv );\\n if( sampleDepth >= ( 1.0 - EPSILON ) ) {\\n continue;\\n }\\n float sampleViewZ = getViewZ( sampleDepth );\\n vec3 sampleViewPosition = getViewPosition( sampleUv, sampleDepth, sampleViewZ );\\n\\n\\t\\t\\t\\t\\t/** McGuire Estimator*/\\n\\t\\t\\t\\t\\tvec3 v = sampleViewPosition - centerViewPosition;\\n\\t\\t\\t\\t\\tfloat vv = dot(v, v);\\n\\t\\t\\t\\t\\tfloat vn = dot(v, centerViewNormal) - bias;\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t// Note large epsilon to avoid overdarkening within cracks\\n\\t\\t\\t\\t\\tfloat radius2 = 2.;//uSampleRadiusWS * uSampleRadiusWS\\n\\t\\t\\t\\t\\tfloat epsilon = 0.01;\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\tfloat f = max(radius2 - vv, 0.0) / radius2;\\n\\t\\t\\t\\t\\tocclusionSum += f * f * f * max(vn / (epsilon + vv), 0.0) / 4.;\\n\\n\\t\\t\\t\\t\\t/** Three.js SAO Estimator*/\\n // vec3 viewDelta = sampleViewPosition - centerViewPosition;\\n // float viewDistance = length( viewDelta );\\n // float scaledScreenDistance = scaleDividedByCameraFar * viewDistance;\\n // occlusionSum += max(0.0, (dot(centerViewNormal, viewDelta) - minResolutionMultipliedByCameraFar) / scaledScreenDistance - bias) / (1.0 + pow2( scaledScreenDistance ) );\\n weightSum += 1.0;\\n }\\n if( weightSum == 0.0 ) discard;\\n return occlusionSum * ( intensity / weightSum );\\n\\t\\t\\t#elif AO_ESTIMATOR == 1\\n\\t\\t\\t\\tvec3 viewPosition = centerViewPosition;\\n\\t\\t\\t\\tvec3 viewNormal = getViewNormal( centerViewPosition, vUv, centerDepth );\\n\\t\\t\\t\\tvec2 noiseScale = vec2( size.x / 4.0, size.y / 4.0 );\\n\\t\\t\\t\\tvec3 random = vec3( texture2D( tNoise, vUv * noiseScale ).r );\\n\\t\\t\\t\\t// compute matrix used to reorient a kernel vector\\n\\t\\t\\t\\tvec3 tangent = normalize( random - viewNormal * dot( random, viewNormal ) );\\n\\t\\t\\t\\tvec3 bitangent = cross( viewNormal, tangent );\\n\\t\\t\\t\\tmat3 kernelMatrix = mat3( tangent, bitangent, viewNormal );\\n\\t\\t\\t\\tfloat occlusion = 0.0;\\n\\t\\t\\t\\tfloat kernelSize_ws = computeKernelSize(-viewPosition.z, kernelRadius);\\n\\t\\t\\t\\tfloat div = float( KERNEL_SIZE);\\n\\t\\t\\t\\tfloat maxDist = kernelSize_ws / (cameraFar - cameraNear);\\n\\t\\t\\t\\tfor ( int i = 0; i < KERNEL_SIZE; i ++ ) {\\n\\t\\t\\t\\t\\tvec3 sampleVector = kernelMatrix * kernel[ i ]; // reorient sample vector in view space\\n\\t\\t\\t\\t\\tvec3 samplePoint = viewPosition + ( sampleVector * kernelSize_ws ); // calculate sample point\\n\\t\\t\\t\\t\\tvec4 samplePointNDC = cameraProjectionMatrix * vec4( samplePoint, 1.0 ); // project point and calculate NDC\\n\\t\\t\\t\\t\\tsamplePointNDC /= samplePointNDC.w;\\n\\t\\t\\t\\t\\tvec2 samplePointUv = samplePointNDC.xy * 0.5 + 0.5; // compute uv coordinates\\n\\t\\t\\t\\t\\tfloat realDepth = getLinearDepth( samplePointUv ); // get linear depth from depth texture\\n\\t\\t\\t\\t\\tfloat sampleDepth = viewZToOrthographicDepth( samplePoint.z + bias, cameraNear, cameraFar ); // compute linear depth of the sample view Z value\\n\\t\\t\\t\\t\\tfloat delta = sampleDepth - realDepth;\\n\\t\\t\\t\\t\\tif ( delta > 0. && delta < maxDist ) { // if fragment is before sample point, increase occlusion\\n\\t\\t\\t\\t\\t\\tocclusion += 1.0;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn clamp( occlusion * intensity / div, 0.0, 1.0 );\\n\\t\\t\\t#endif\\n\\t\\t\\t}\\n\\t\\tvoid main() {\\n\\t\\t\\tfloat linearDepth = unpackRGBAToDepth( texture2D( tDepth, vUv ) );\\n\\t\\t\\tfloat centerDepth = getPerspectiveDepth(vUv);\\n\\t\\t\\tif( centerDepth >= ( 1.0 - EPSILON ) ) {\\n\\t\\t\\t\\tdiscard;\\n\\t\\t\\t}\\n\\t\\t\\tfloat centerViewZ = getViewDepth(linearDepth);\\n\\t\\t\\tvec3 viewPosition = getViewPosition( vUv, centerDepth, centerViewZ );\\n\\t\\t\\tvec3 viewNormal = getViewNormal(viewPosition, vUv, linearDepth);\\n\\t\\t\\tfloat ambientOcclusion = getAmbientOcclusion( viewPosition, centerDepth );\\n\\t\\t\\tgl_FragColor = getDefaultColor( vUv );\\n\\t\\t\\tgl_FragColor.xyz *= ambientOcclusion;\\n\\t\\t\\tgl_FragColor.a = 1.;\\n\\t\\t}\",vertexShader:\"\\n\\t\\tvarying vec2 vUv;\\n\\t\\tvoid main() {\\n\\t\\t\\tvUv = uv;\\n\\t\\t\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n\\t\\t}\",uniforms:{tDepth:{value:null},tNormal:{value:null},size:{value:new y(512,512)},cameraNear:{value:1},cameraFar:{value:100},cameraProjectionMatrix:{value:new s},cameraInverseProjectionMatrix:{value:new s},tanFov:{value:0},scale:{value:1},intensity:{value:1},bias:{value:0},minResolution:{value:0},kernelRadius:{value:.5},frameIndex:{value:0},tNoise:{value:null},kernel:{value:null},minDistance:{value:.001},maxDistance:{value:1}}}),this.aoMaterial.extensions.derivatives=!0,this.aoMaterial.uniforms.size.value.set(256,256),this.aoMaterial.blending=C,this.accumulateMaterial=new g({defines:{},fragmentShader:\"\\n uniform float opacity;\\n uniform sampler2D tDiffuse;\\n varying vec2 vUv;\\n // #define NUM_FRAMES 16\\n\\n void main() {\\n vec4 frameSample = texture2D( tDiffuse, vUv );\\n gl_FragColor.xyz = frameSample.rgb * 1./float(NUM_FRAMES);\\n gl_FragColor.a = 1.;//*= opacity;\\n }\",vertexShader:\"\\n varying vec2 vUv;\\n void main() {\\n vUv = uv;\\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n }\",uniforms:{tDiffuse:{value:null},opacity:{value:1}}}),this.accumulateMaterial.uniforms.tDiffuse.value=this._generationBuffer.texture,this.accumulateMaterial.blending=H,this.accumulateMaterial.blendSrc=te,this.accumulateMaterial.blendDst=te,this.accumulateMaterial.blendEquation=re,this.accumulateMaterial.blendSrcAlpha=te,this.accumulateMaterial.blendDstAlpha=te,this.accumulateMaterial.blendEquationAlpha=B,this.fsQuad=new Ce(this.aoMaterial)}setParams(e){Object.assign(this.params,e),this.kernels=[],this.noiseTextures=[]}setFrameIndex(e){this.frameIndex=e}update(e,t){this.aoMaterial.defines.PERSPECTIVE_CAMERA=t.isPerspectiveCamera?1:0,this.aoMaterial.defines.NUM_FRAMES=Un.ACCUMULATE_FRAMES,this.aoMaterial.defines.KERNEL_SIZE=this.params.kernelSize,this.accumulateMaterial.defines.NUM_FRAMES=Un.ACCUMULATE_FRAMES,this.aoMaterial.uniforms.cameraNear.value=t.near,this.aoMaterial.uniforms.cameraFar.value=t.far,this.aoMaterial.uniforms.cameraInverseProjectionMatrix.value.copy(t.projectionMatrixInverse),this.aoMaterial.uniforms.cameraProjectionMatrix.value.copy(t.projectionMatrix);const r=t.fov/2*Math.PI/180;this.aoMaterial.uniforms.tanFov.value=Math.tan(r),this.kernels[this.frameIndex]||this.generateSampleKernel(this.frameIndex),this.noiseTextures[this.frameIndex]||this.generateRandomKernelRotations(this.frameIndex),this.aoMaterial.uniforms.kernel.value=this.kernels[this.frameIndex],this.aoMaterial.uniforms.tNoise.value=this.noiseTextures[this.frameIndex],this.aoMaterial.uniforms.intensity.value=this.params.intensity,this.aoMaterial.uniforms.kernelRadius.value=this.params.kernelRadius,this.aoMaterial.uniforms.bias.value=this.params.bias,this.aoMaterial.uniforms.frameIndex.value=this.frameIndex,this.aoMaterial.uniforms.minDistance.value=this.params.minDistance,this.aoMaterial.uniforms.maxDistance.value=this.params.maxDistance,this.aoMaterial.needsUpdate=!0,this.accumulateMaterial.needsUpdate=!0}render(e,t,r){const n=new x;e.getClearColor(n);const i=e.getClearAlpha(),l=e.autoClear;this.renderFrame(e),e.autoClear=l,e.setClearColor(n),e.setClearAlpha(i)}renderFrame(e){e.setRenderTarget(this._generationBuffer),e.autoClear=!1,e.setClearColor(0),e.setClearAlpha(1),e.clear(!0),this.fsQuad.material=this.aoMaterial,this.fsQuad.render(e),e.setRenderTarget(this._accumulationBuffer),0===this.frameIndex&&(e.setClearColor(16777215),e.setClearAlpha(1),e.clear(!0)),this.fsQuad.material=this.accumulateMaterial,this.fsQuad.render(e)}setSize(e,t){this._generationBuffer.setSize(e,t),this._accumulationBuffer.setSize(e,t),this.aoMaterial.uniforms.size.value.set(e,t),this.aoMaterial.needsUpdate=!0}generateSampleKernel(e){const n=this.params.kernelSize;this.kernels[e]=[];for(let i=0;i\\n#ifdef USE_RTE\\n // The high component is stored as the default 'position' attribute buffer\\n attribute vec3 position_low;\\n uniform vec3 uViewer_high;\\n uniform vec3 uViewer_low;\\n#endif\\nuniform vec2 size;\\nuniform float displacement;\\n\\n#ifdef TRANSFORM_STORAGE\\n attribute float objIndex;\\n\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n #define TRANSFORM_STRIDE 4\\n #else\\n #define TRANSFORM_STRIDE 4.\\n #endif\\n uniform sampler2D tTransforms;\\n uniform float objCount;\\n #elif TRANSFORM_STORAGE == 1\\n uniform mat4 uTransforms[OBJ_COUNT];\\n #endif\\n#endif\\n\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n\\n#ifdef TRANSFORM_STORAGE\\n void objectTransform(out vec4 quaternion, out vec4 pivotLow, out vec4 pivotHigh, out vec4 translation, out vec4 scale){\\n #if TRANSFORM_STORAGE == 0\\n #if __VERSION__ == 300\\n ivec2 uv = ivec2(int(objIndex) * TRANSFORM_STRIDE, 0); \\n vec4 v0 = texelFetch( tTransforms, uv, 0 );\\n vec4 v1 = texelFetch( tTransforms, uv + ivec2(1, 0), 0);\\n vec4 v2 = texelFetch( tTransforms, uv + ivec2(2, 0), 0);\\n vec4 v3 = texelFetch( tTransforms, uv + ivec2(3, 0), 0);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #elif\\n float size = objCount * TRANSFORM_STRIDE;\\n vec2 cUv = vec2(0.5/size, 0.5);\\n vec2 dUv = vec2(1./size, 0.);\\n \\n vec2 uv = vec2((objIndex * TRANSFORM_STRIDE)/size + cUv.x, cUv.y);\\n vec4 v0 = texture2D( tTransforms, uv);\\n vec4 v1 = texture2D( tTransforms, uv + dUv);\\n vec4 v2 = texture2D( tTransforms, uv + 2. * dUv);\\n vec4 v3 = texture2D( tTransforms, uv + 3. * dUv);\\n quaternion = v0;\\n pivotLow = vec4(v1.xyz, 1.);\\n pivotHigh = vec4(v2.xyz, 1.);\\n translation = vec4(v3.xyz, 1.);\\n scale = vec4(v1.w, v2.w, v3.w, 1.);\\n #endif\\n #elif TRANSFORM_STORAGE == 1\\n mat4 tMatrix = uTransforms[int(objIndex)];\\n quaternion = tMatrix[0];\\n pivotLow = vec4(tMatrix[1].xyz, 1.);\\n pivotHigh = vec4(tMatrix[2].xyz, 1.);\\n translation = vec4(tMatrix[3].xyz, 1.);\\n scale = vec4(tMatrix[1][3], tMatrix[2][3], tMatrix[3][3], 1.);\\n #endif\\n }\\n\\n vec3 rotate_vertex_position(vec3 position, vec4 quat)\\n { \\n return position + 2.0 * cross(quat.xyz, cross(quat.xyz, position) + quat.w * position);\\n }\\n#endif\\n\\n#ifdef USE_RTE\\n vec4 computeRelativePositionSeparate(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Vector calculation for the high and low differences works on everything \\n *BESIDES* Apple Silicon (or whatever they call it) GPUs\\n\\n It would seem that when this code gets compiled, vector types get a lower precision(?)\\n which completely brakes the 2 float -> double reconstructio. Doing it separately for each \\n vector component using floats works fine.\\n */\\n vec3 highDifference;\\n vec3 lowDifference;\\n float t1 = position_low.x - relativeTo_low.x;\\n float e = t1 - position_low.x;\\n float t2 = ((-relativeTo_low.x - e) + (position_low.x - (t1 - e))) + position_high.x - relativeTo_high.x;\\n highDifference.x = t1 + t2;\\n lowDifference.x = t2 - (highDifference.x - t1);\\n\\n t1 = position_low.y - relativeTo_low.y;\\n e = t1 - position_low.y;\\n t2 = ((-relativeTo_low.y - e) + (position_low.y - (t1 - e))) + position_high.y - relativeTo_high.y;\\n highDifference.y = t1 + t2;\\n lowDifference.y = t2 - (highDifference.y - t1);\\n\\n t1 = position_low.z - relativeTo_low.z;\\n e = t1 - position_low.z;\\n t2 = ((-relativeTo_low.z - e) + (position_low.z - (t1 - e))) + position_high.z - relativeTo_high.z;\\n highDifference.z = t1 + t2;\\n lowDifference.z = t2 - (highDifference.z - t1);\\n\\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n\\n vec4 computeRelativePosition(in vec3 position_low, in vec3 position_high, in vec3 relativeTo_low, in vec3 relativeTo_high){\\n /* \\n Source https://github.com/virtualglobebook/OpenGlobe/blob/master/Source/Examples/Chapter05/Jitter/GPURelativeToEyeDSFUN90/Shaders/VS.glsl \\n Note here, we're storing the high part of the position encoding inside three's default 'position' attribute buffer so we avoid redundancy \\n */\\n vec3 t1 = position_low.xyz - relativeTo_low;\\n vec3 e = t1 - position_low.xyz;\\n vec3 t2 = ((-relativeTo_low - e) + (position_low.xyz - (t1 - e))) + position_high.xyz - relativeTo_high;\\n vec3 highDifference = t1 + t2;\\n vec3 lowDifference = t2 - (highDifference - t1);\\n \\n vec3 position = highDifference.xyz + lowDifference.xyz;\\n return vec4(position, 1.);\\n }\\n#endif\\n\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t// #include COMMENTED CHUNK\\n #ifdef TRANSFORM_STORAGE\\n vec4 tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale;\\n objectTransform(tQuaternion, tPivotLow, tPivotHigh, tTranslation, tScale);\\n #endif\\n #ifdef USE_RTE\\n vec4 position_lowT = vec4(position_low, 1.);\\n vec4 position_highT = vec4(position, 1.);\\n vec4 rteLocalPosition = computeRelativePositionSeparate(position_lowT.xyz, position_highT.xyz, uViewer_low, uViewer_high);\\n #ifdef TRANSFORM_STORAGE\\n vec4 rtePivot = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uViewer_low, uViewer_high);\\n rteLocalPosition.xyz = rotate_vertex_position((rteLocalPosition - rtePivot).xyz, tQuaternion) * tScale.xyz + rtePivot.xyz + tTranslation.xyz;\\n #endif\\n #endif\\n\\n #ifdef USE_RTE\\n vec4 mvPosition = rteLocalPosition;\\n #else\\n vec4 mvPosition = vec4( transformed, 1.0 );\\n #endif\\n \\n #ifdef USE_INSTANCING\\n mvPosition = instanceMatrix * mvPosition;\\n #endif\\n \\n mvPosition = modelViewMatrix * mvPosition;\\n\\n gl_Position = projectionMatrix * mvPosition;\\n \\n // Transform normal vector from object space to clip space.\\n vec3 normalHCS = mat3(projectionMatrix) * normalMatrix * normal;\\n\\n // Move vertex along normal vector in clip space.\\n gl_Position.xy += normalize(normalHCS.xy) / size * gl_Position.w * displacement * 2.;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}get fragmentShader(){return\"\\nuniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t// accumulation (baked indirect lighting only)\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t// modulation\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\"}get uniformsDef(){return{...super.uniformsDef,size:new y,displacement:0}}constructor(e,t=[]){super(e,t)}}class mn extends nn{constructor(){super(),this.overrideMaterial=null,this._oldClearColor=new x,this.clearColor=null,this.clearAlpha=0,this.clearDepth=!0,this.drawBufferSize=new y,this.onBeforeRender=null,this.onAfterRender=null,this.overrideMaterial=new Vn({color:16711680},[\"USE_RTE\"]),this.overrideMaterial.userData.displacement.value=2,this.overrideMaterial.colorWrite=!1,this.overrideMaterial.depthWrite=!1,this.overrideMaterial.stencilWrite=!0,this.overrideMaterial.stencilFunc=M,this.overrideMaterial.stencilWriteMask=255,this.overrideMaterial.stencilRef=255,this.overrideMaterial.stencilZFail=N,this.overrideMaterial.stencilZPass=N,this.overrideMaterial.stencilFail=N,this.overrideMaterial.side=R}get displayName(){return\"STENCIL\"}get outputTexture(){return null}get material(){return this.overrideMaterial}update(e,t){this.camera=t,this.scene=e}setClippingPlanes(e){this.overrideMaterial.clippingPlanes=e}render(e,t,r){this.onBeforeRender&&this.onBeforeRender();const n=e.autoClear;let i,l;e.autoClear=!1,void 0!==this.overrideMaterial&&(l=this.scene.overrideMaterial),this.clearColor&&(e.getClearColor(this._oldClearColor),i=e.getClearAlpha(),e.setClearColor(this.clearColor,this.clearAlpha)),this.clearDepth&&e.clearDepth(),this.applyLayers(this.camera),e.setRenderTarget(this.renderToScreen?null:r),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),e.getDrawingBufferSize(this.drawBufferSize),this.overrideMaterial.userData.size.value.copy(this.drawBufferSize),e.clear(!1,!1,!0);const a=e.shadowMap.enabled;e.shadowMap.enabled=!1,e.render(this.scene,this.camera),e.shadowMap.enabled=a,this.clearColor&&e.setClearColor(this._oldClearColor,i),void 0!==this.overrideMaterial&&(this.scene.overrideMaterial=l),e.autoClear=n,this.onAfterRender&&this.onAfterRender()}}class zn extends nn{constructor(){super(),this.overrideMaterial=null,this._oldClearColor=new x,this.clearColor=null,this.clearAlpha=0,this.clearDepth=!0,this.drawBufferSize=new y,this.onBeforeRender=null,this.onAfterRender=null,this.overrideMaterial=new Vn({color:304635},[\"USE_RTE\"]),this.overrideMaterial.userData.displacement.value=2,this.overrideMaterial.colorWrite=!0,this.overrideMaterial.depthWrite=!1,this.overrideMaterial.stencilWrite=!0,this.overrideMaterial.stencilFunc=le,this.overrideMaterial.stencilRef=255,this.overrideMaterial.side=R}get displayName(){return\"STENCIL\"}get outputTexture(){return null}get material(){return this.overrideMaterial}update(e,t){this.camera=t,this.scene=e}setClippingPlanes(e){this.overrideMaterial.clippingPlanes=e}render(e,t,r){this.onBeforeRender&&this.onBeforeRender();const n=e.autoClear;let i,l;e.autoClear=!1,void 0!==this.overrideMaterial&&(l=this.scene.overrideMaterial),this.clearColor&&(e.getClearColor(this._oldClearColor),i=e.getClearAlpha(),e.setClearColor(this.clearColor,this.clearAlpha)),this.clearDepth&&e.clearDepth(),this.applyLayers(this.camera),e.setRenderTarget(this.renderToScreen?null:r),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),e.getDrawingBufferSize(this.drawBufferSize),this.overrideMaterial.userData.size.value.copy(this.drawBufferSize);const a=e.shadowMap.enabled;e.shadowMap.enabled=!1,e.render(this.scene,this.camera),e.shadowMap.enabled=a,this.clearColor&&e.setClearColor(this._oldClearColor,i),void 0!==this.overrideMaterial&&(this.scene.overrideMaterial=l),e.autoClear=n,this.onAfterRender&&this.onAfterRender()}}class Xn extends nn{constructor(){super(),this.onBeforeRender=null,this.onAfterRender=null}get displayName(){return\"OVERLAY\"}get outputTexture(){return null}update(e,t){this.camera=t,this.scene=e}render(e,t,r){const n=e.autoClear;e.autoClear=!1,this.applyLayers(this.camera),e.setRenderTarget(this.renderToScreen?null:r),this.onBeforeRender&&this.onBeforeRender(),e.render(this.scene,this.camera),this.onAfterRender&&this.onAfterRender(),e.autoClear=n}}var bn,qn;!function(e){e[e.NORMAL=0]=\"NORMAL\",e[e.ACCUMULATION=1]=\"ACCUMULATION\"}(bn||(bn={})),function(e){e[e.DEPTH_RGBA=0]=\"DEPTH_RGBA\",e[e.DEPTH=1]=\"DEPTH\",e[e.COLOR=2]=\"COLOR\",e[e.GEOMETRY_NORMALS=3]=\"GEOMETRY_NORMALS\",e[e.RECONSTRUCTED_NORMALS=4]=\"RECONSTRUCTED_NORMALS\",e[e.DYNAMIC_AO=5]=\"DYNAMIC_AO\",e[e.DYNAMIC_AO_BLURED=6]=\"DYNAMIC_AO_BLURED\",e[e.PROGRESSIVE_AO=7]=\"PROGRESSIVE_AO\",e[e.FINAL=8]=\"FINAL\"}(qn||(qn={}));const Kn={pipelineOutput:qn.FINAL,accumulationFrames:16,dynamicAoEnabled:!0,dynamicAoParams:cn,staticAoEnabled:!0,staticAoParams:fn,depthSide:R};class Un{set pipelineOptions(e){Object.assign(this._pipelineOptions,e),this.dynamicAoPass.setParams(e.dynamicAoParams),this.staticAoPass.setParams(e.staticAoParams),this.accumulationFrame=0,Un.ACCUMULATE_FRAMES=e.accumulationFrames,this.depthPass.depthSide=e.depthSide,this.pipelineOutput=e.pipelineOutput}get pipelineOptions(){return JSON.parse(JSON.stringify(this._pipelineOptions))}set pipelineOutput(e){let t=[];switch(this.clearPipeline(),e){case qn.FINAL:t=this.getDefaultPipeline(),this.depthPass.depthSize=an.FULL,this.applySaoPass.setTexture(\"tDiffuse\",this.staticAoPass.outputTexture),this.applySaoPass.setTexture(\"tDiffuseInterp\",this.dynamicAoPass.outputTexture),this.needsProgressive=!0;break;case qn.DEPTH_RGBA:t.push(this.depthPass),t.push(this.copyOutputPass),this.depthPass.depthSize=an.FULL,this.copyOutputPass.setTexture(\"tDiffuse\",this.depthPass.outputTexture),this.copyOutputPass.setOutputType(qn.DEPTH_RGBA),this.needsProgressive=!1;break;case qn.DEPTH:t.push(this.depthPass),t.push(this.copyOutputPass),this.depthPass.depthSize=an.FULL,this.copyOutputPass.setTexture(\"tDiffuse\",this.depthPass.outputTexture),this.copyOutputPass.setOutputType(qn.DEPTH),this.needsProgressive=!1;break;case qn.COLOR:t.push(this.renderPass);break;case qn.GEOMETRY_NORMALS:t.push(this.normalsPass),t.push(this.copyOutputPass),this.normalsPass.enabled=!0,this.copyOutputPass.setTexture(\"tDiffuse\",this.normalsPass.outputTexture),this.copyOutputPass.setOutputType(qn.GEOMETRY_NORMALS),this.needsProgressive=!1;break;case qn.RECONSTRUCTED_NORMALS:t.push(this.depthPass),t.push(this.dynamicAoPass),t.push(this.copyOutputPass),this.dynamicAoPass.enabled=!0,this.depthPass.depthType=ln.PERSPECTIVE_DEPTH,this.depthPass.depthSize=an.HALF,this.dynamicAoPass.setOutputType(on.RECONSTRUCTED_NORMALS),this.copyOutputPass.setTexture(\"tDiffuse\",this.dynamicAoPass.outputTexture),this.copyOutputPass.setOutputType(qn.GEOMETRY_NORMALS),this.needsProgressive=!1;break;case qn.DYNAMIC_AO:t.push(this.depthPass),t.push(this.normalsPass),t.push(this.dynamicAoPass),t.push(this.copyOutputPass),this.normalsPass.enabled=this._pipelineOptions.dynamicAoParams.normalsType===pn.DEFAULT,this.dynamicAoPass.enabled=!0,this.depthPass.depthType=ln.PERSPECTIVE_DEPTH,this.copyOutputPass.setTexture(\"tDiffuse\",this.dynamicAoPass.outputTexture),this.copyOutputPass.setOutputType(qn.COLOR),this.dynamicAoPass.setOutputType(on.AO),this.needsProgressive=!1;break;case qn.DYNAMIC_AO_BLURED:t.push(this.depthPass),t.push(this.normalsPass),t.push(this.dynamicAoPass),t.push(this.copyOutputPass),this.normalsPass.enabled=this._pipelineOptions.dynamicAoParams.normalsType===pn.DEFAULT,this.dynamicAoPass.enabled=!0,this.depthPass.depthType=ln.PERSPECTIVE_DEPTH,this.depthPass.depthSize=an.HALF,this.copyOutputPass.setTexture(\"tDiffuse\",this.dynamicAoPass.outputTexture),this.copyOutputPass.setOutputType(qn.COLOR),this.dynamicAoPass.setOutputType(on.AO_BLURRED),this.needsProgressive=!1;break;case qn.PROGRESSIVE_AO:t.push(this.depthPass),t.push(this.dynamicAoPass),t.push(this.staticAoPass),t.push(this.copyOutputPass),this.depthPass.depthType=ln.LINEAR_DEPTH,this.depthPass.depthSize=an.FULL,this.copyOutputPass.setTexture(\"tDiffuse\",this.staticAoPass.outputTexture),this.copyOutputPass.setOutputType(qn.COLOR),this.needsProgressive=!0}this.setPipeline(t)}set needsProgressive(e){this._needsProgressive=e,e||(this._renderType=bn.NORMAL),e&&this._renderType===bn.NORMAL&&(this._renderType=bn.ACCUMULATION),this.accumulationFrame=0}get renderType(){return this._renderType}get composer(){return this._composer}constructor(e,t){this._renderer=null,this._batcher=null,this._pipelineOptions=Object.assign({},Kn),this._needsProgressive=!1,this._resetFrame=!1,this._composer=null,this.depthPass=null,this.normalsPass=null,this.stencilPass=null,this.renderPass=null,this.stencilMaskPass=null,this.dynamicAoPass=null,this.applySaoPass=null,this.copyOutputPass=null,this.staticAoPass=null,this.overlayPass=null,this.drawingSize=new y,this._renderType=bn.NORMAL,this.accumulationFrame=0,this.onBeforePipelineRender=null,this.onAfterPipelineRender=null,this._renderer=e,this._batcher=t,this._composer=new De(e),this._composer.readBuffer=null,this._composer.writeBuffer=null}configure(){let e,t,r;this.depthPass=new sn,this.normalsPass=new dn,this.dynamicAoPass=new vn,this.stencilPass=new mn,this.renderPass=new hn,this.stencilMaskPass=new zn,this.applySaoPass=new tn,this.staticAoPass=new Sn,this.overlayPass=new Xn,this.copyOutputPass=new rn,this.copyOutputPass.renderToScreen=!0,this.depthPass.setLayers([En.STREAM_CONTENT_MESH]),this.normalsPass.setLayers([En.STREAM_CONTENT_MESH]),this.stencilPass.setLayers([En.STREAM_CONTENT_MESH]),this.renderPass.setLayers([En.PROPS,En.STREAM_CONTENT,En.STREAM_CONTENT_MESH,En.STREAM_CONTENT_LINE,En.STREAM_CONTENT_POINT,En.STREAM_CONTENT_POINT_CLOUD,En.STREAM_CONTENT_TEXT,En.SHADOWCATCHER]),this.stencilMaskPass.setLayers([En.STREAM_CONTENT_MESH]),this.overlayPass.setLayers([En.MEASUREMENTS]),this.onBeforePipelineRender=()=>{e=this._batcher.saveVisiblity(),t=this._batcher.getOpaque(),r=this._batcher.getStencil()},this.onAfterPipelineRender=()=>{this._batcher.applyVisibility(e)},this.depthPass.onBeforeRender=()=>{this._batcher.applyVisibility(t),this._batcher.overrideMaterial(t,this.depthPass.material)},this.depthPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(t)},this.normalsPass.onBeforeRender=()=>{this._batcher.applyVisibility(t),this._batcher.overrideMaterial(t,this.normalsPass.material)},this.normalsPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(e)},this.stencilPass.onBeforeRender=()=>{this._batcher.applyVisibility(r),this._batcher.overrideMaterial(r,this.stencilPass.material)},this.stencilPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(r)},this.stencilMaskPass.onBeforeRender=()=>{this._batcher.applyVisibility(r),this._batcher.overrideMaterial(r,this.stencilMaskPass.material)},this.stencilMaskPass.onAfterRender=()=>{this._batcher.applyVisibility(e),this._batcher.restoreMaterial(r)},this.renderPass.onBeforeRenderOpauqe=()=>{e=this._batcher.saveVisiblity();const t=this._batcher.getOpaque();this._batcher.applyVisibility(t)},this.renderPass.onBeforeRenderTransparent=()=>{const e=this._batcher.getTransparent();this._batcher.applyVisibility(e)},this.renderPass.onAfterRenderTransparent=()=>{this._batcher.applyVisibility(e)},this.setPipeline(this.getDefaultPipeline())}getDefaultPipeline(){this.renderPass.renderToScreen=!0,this.normalsPass.enabled=this._pipelineOptions.dynamicAoParams.normalsType===pn.DEFAULT,this.dynamicAoPass.setOutputType(this._pipelineOptions.dynamicAoParams.blurEnabled?on.AO_BLURRED:on.AO),this.applySaoPass.renderToScreen=!0,this.dynamicAoPass.setTexture(\"tDepth\",this.depthPass.outputTextureHalf),this.dynamicAoPass.setTexture(\"tNormal\",this.normalsPass.outputTexture),this.applySaoPass.setTexture(\"tDiffuse\",this.dynamicAoPass.outputTexture),this.applySaoPass.setTexture(\"tDiffuseInterp\",this.dynamicAoPass.outputTexture),this.staticAoPass.setTexture(\"tDepth\",this.depthPass.outputTexture),this.staticAoPass.setTexture(\"tNormal\",this.normalsPass.outputTexture);const e=[];return e.push(this.depthPass),e.push(this.normalsPass),e.push(this.dynamicAoPass),e.push(this.staticAoPass),e.push(this.stencilPass),e.push(this.renderPass),e.push(this.stencilMaskPass),e.push(this.applySaoPass),e.push(this.overlayPass),this.needsProgressive=!0,e}clearPipeline(){for(;this._composer.passes.length>0;)this._composer.removePass(this._composer.passes[0])}setPipeline(e){for(let t=0;tthis.getPlaneId(e)!==t));this.planeOutlines[t].renderable.material.clippingPlanes=r}}updatePlaneOutline(e,r){const n=new t,i=new t,l=new t,a=new t,s=new t,u=new ae,d=this.getPlaneId(r),p=this.planeOutlines[d].renderable;let o=0,c=p.geometry.attributes.instanceStart.data;const v=new Array;for(let t=0;td.intersectsBox(e),intersectsBounds:e=>d.intersectsBox(e),intersectsTriangle(r,p,c,f,S){const h=e[t].mesh.getBatchObjectMaterial(S);if(h instanceof cr||!1===h.visible||null===h)return;const V=d;let m=0;u.start.copy(r.a),u.end.copy(r.b),V.intersectLine(u,n)&&(n.add(s.copy(d.normal).multiplyScalar(xn.Z_OFFSET)),v[3*o]=n.x,v[3*o+1]=n.y,v[3*o+2]=n.z,o++,m++),u.start.copy(r.b),u.end.copy(r.c),V.intersectLine(u,n)&&(n.add(s.copy(d.normal).multiplyScalar(xn.Z_OFFSET)),v[3*o]=n.x,v[3*o+1]=n.y,v[3*o+2]=n.z,m++,o++),u.start.copy(r.c),u.end.copy(r.a),V.intersectLine(u,n)&&(n.add(s.copy(d.normal).multiplyScalar(xn.Z_OFFSET)),v[3*o]=n.x,v[3*o+1]=n.y,v[3*o+2]=n.z,m++,o++),3===m&&(i.set(v[3*(o-3)],v[3*(o-3)+1],v[3*(o-3)+2]),l.set(v[3*(o-2)],v[3*(o-2)+1],v[3*(o-2)+2]),a.set(v[3*(o-1)],v[3*(o-1)+1],v[3*(o-1)+2]),a.equals(i)||a.equals(l)?(m--,o--):i.equals(l)&&(a.set(n.x,n.y,n.z),a.add(s.copy(d.normal).multiplyScalar(xn.Z_OFFSET)),v[3*(o-2)]=a.x,v[3*(o-2)+1]=a.y,v[3*(o-2)+2]=a.z,m--,o--)),2!==m&&(o-=m)}})}v.length>c.array.length&&(this.resizeGeometryBuffer(this.planeOutlines[d],v.length),console.warn(`Resized outline buffer from ${c.array.length} to ${v.length}. ${v.length/6} instance count`)),c=p.geometry.attributes.instanceStart.data;const f=p.geometry.attributes.instanceStartLow.data;Pt.DoubleToHighLowBuffer(v,f.array,c.array),c.needsUpdate=!0,c.updateRange={offset:0,count:3*o},f.needsUpdate=!0,f.updateRange={offset:0,count:3*o},p.visible=!0,p.geometry.instanceCount=o/2,p.geometry.attributes.instanceStart.needsUpdate=!0,p.geometry.attributes.instanceEnd.needsUpdate=!0,p.geometry.attributes.instanceStartLow.needsUpdate=!0,p.geometry.attributes.instanceEndLow.needsUpdate=!0,p.geometry.computeBoundingBox(),p.geometry.computeBoundingSphere()}createPlaneOutline(e){const t=new Float64Array(xn.INITIAL_BUFFER_SIZE),r=new Fe;r.setPositions(new Float32Array(t)),r.attributes.instanceStart.data.setUsage(w),Pt.updateRTEGeometry(r,t);const n=new wt({color:294651,linewidth:2,worldUnits:!1,vertexColors:!1,alphaToCoverage:!1,resolution:new y(919,848)},[\"USE_RTE\"]);n.color=new x(294651),n.color.convertSRGBToLinear(),n.linewidth=2,n.worldUnits=!1,n.resolution=new y(1513,1306);const i=new Ye(r,n);return i.name=`${e}-outline`,i.frustumCulled=!1,i.renderOrder=1,i.layers.set(En.PROPS),{renderable:i}}resizeGeometryBuffer(e,t){e.renderable.geometry.dispose();const r=new Float32Array(t);e.renderable.geometry=new Fe,e.renderable.geometry.setPositions(new Float32Array(r)),e.renderable.geometry.attributes.instanceStart.data.setUsage(w),Pt.updateRTEGeometry(e.renderable.geometry,r)}getPlaneId(e){return this.tmpVec.set(Math.round(e.normal.x),Math.round(e.normal.y),Math.round(e.normal.z)),this.tmpVec.equals(this.right)?Tn.POSITIVE_X:this.tmpVec.equals(this.left)?Tn.NEGATIVE_X:this.tmpVec.equals(this.up)?Tn.POSITIVE_Y:this.tmpVec.equals(this.down)?Tn.NEGATIVE_Y:this.tmpVec.equals(this.back)?Tn.NEGATIVE_Z:this.tmpVec.equals(this.forward)?Tn.POSITIVE_Z:void 0}}xn.INITIAL_BUFFER_SIZE=6e4,xn.Z_OFFSET=-.001;class Pn extends or{get vertexShader(){return\"\\n\\tvarying vec2 vUv;\\n\\t\\tvoid main() {\\n\\t\\t\\tvUv = vec2(1. - uv.x, uv.y);\\n\\t\\t\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n\\t\\t}\\n\"}get fragmentShader(){return\"\\nvarying vec2 vUv;\\n\\nuniform sampler2D tex0;\\nuniform sampler2D tex1;\\nuniform sampler2D tex2;\\nuniform sampler2D tex3;\\nuniform vec4 weights;\\nuniform float sigmoidRange;\\nuniform float sigmoidStrength;\\n\\nvoid main() {\\n\\tfloat color0 = texture2D(tex0, vUv).r * weights.x;\\n\\tfloat color1 = texture2D(tex1, vUv).r * weights.y;\\n\\tfloat color2 = texture2D(tex2, vUv).r * weights.z;\\n\\tfloat color3 = texture2D(tex3, vUv).r * weights.w;\\n\\n\\t// float c0 = mix(color0, 0., color1);\\n\\t// float c1 = mix(color1, 0., color0);\\n\\t// float c2 = mix(color3, 0., color0 * 0.5 + color1 * 0.5);\\n\\t// float sum = c0 + c1 + c2;\\n\\n\\tfloat sum = color0 + color1 + color3 + color2;\\n\\n\\tfloat a = sigmoidRange;//2.;\\n\\tfloat b = 0.03;\\n\\tfloat c = sigmoidStrength;//2.43;\\n\\tfloat d = 0.59;\\n\\tfloat e = 0.14;\\n\\tsum = clamp((sum*(a*sum+b))/(sum*(c*sum+d)+e), 0., 1.);\\n\\n\\tvec2 sUv = vUv * 2. - 1.;\\n\\tsum *= 1. - pow(abs(sUv.x), 6.);\\n\\tsum *= 1. - pow(abs(sUv.y), 6.);\\n\\n\\tgl_FragColor = vec4( vec3(sum), sum );\\n}\\n\"}get uniformsDef(){return{...super.uniformsDef,tex0:null,tex1:null,tex2:null,tex3:null,weights:new J,sigmoidRange:0,sigmoidStrength:0}}constructor(e,t=[]){super(e,t)}}class Wn extends nn{get displayName(){return\"Shadowcatcher\"}get outputTexture(){return this.outputTarget.texture}set needsUpdate(e){this._needsUpdate=e}constructor(){super(),this.levels=4,this.debugCamera=!1,this.renderTargets=[],this.tempTargets=[],this.camera=null,this.scene=null,this._needsUpdate=!1,this.fsQuad=null,this.blendMaterial=null,this.depthMaterial=null,this.vBlurMaterial=null,this.hBlurMaterial=null,this.blurStdDev=yn.stdDeviation,this.blurRadius=yn.blurRadius,this.prevBlurStdDev=0,this.prevBlurRadius=0,this.cameraHelper=null,this.onBeforeRender=null,this.onAfterRender=null;for(let e=0;ee*Rn.MAX_TEXTURE_SIZE_SCALE&&(r.y=e*Rn.MAX_TEXTURE_SIZE_SCALE,r.x=t*r.y),r}updatePlaneMesh(e,r){const n=e.getSize(new t),i=e.getCenter(new t);(new y(n.x,n.y).distanceTo(this.planeSize)>.001||r)&&this.updatePlaneMeshGeometry(new y(2*n.x,2*n.y),new t(i.x,i.y,i.z-.5*n.z-.001)),this.planeSize.set(n.x,n.y)}updatePlaneMeshGeometry(e,t){this.planeMesh.geometry&&this.planeMesh.geometry.dispose();const r=new F(e.x,e.y,Rn.PLANE_SUBD,Rn.PLANE_SUBD),n=(new s).makeTranslation(t.x,t.y,t.z);r.applyMatrix4(n);const i=new Float64Array(r.attributes.position.array);Pt.updateRTEGeometry(r,i),this.planeMesh.geometry=r,this.planeMesh.geometry.computeBoundingBox()}}Rn.MESH_NAME=\"Shadowcatcher\",Rn.PLANE_SUBD=2,Rn.MAX_TEXTURE_SIZE_SCALE=.5;const Mn={fixedSize:!0,dashedLine:!1,discColor:294651,discOpacity:1,lineColor:294651,lineOpacity:1,pointColor:294651,pointOpacity:1,textColor:16777215,textOpacity:1,textPixelHeight:17,pointPixelHeight:5};class Nn extends ve{set style(e){Object.assign(this._style,e),this.updateStyle()}set highlight(e){e?(this.disc.material.color=new x(16711680),this.line.material.color=new x(16711680),this.point.material.color=new x(16711680),this.text.textMesh.material.color.copy(new x(16711680))):this.updateStyle()}getDiscMaterial(){const e=new or({color:this._style.discColor});return e.color.convertSRGBToLinear(),e.toneMapped=!1,e.polygonOffset=!0,e.polygonOffsetFactor=-5,e.polygonOffsetUnits=5,e.opacity=this._style.discOpacity,e.transparent=e.opacity<1,e}getLineMaterial(){const e=new wt({color:294651,linewidth:1,worldUnits:!1,vertexColors:!1,alphaToCoverage:!1,resolution:new y(1,1)},[\"USE_RTE\",\"UNIFORM_OPACITY\"].concat(this._style.dashedLine?[\"USE_DASH\"]:[]));return e.color=new x(this._style.lineColor),e.color.convertSRGBToLinear(),e.toneMapped=!1,this._style.dashedLine&&(e.dashSize=1,e.gapSize=1,e.dashScale=10),e.linewidth=2,e.worldUnits=!1,e.resolution=new y(1513,1306),e.opacity=this._style.lineOpacity,e.transparent=e.opacity<1,e.depthTest=!1,e}getPointMaterial(e){const t=new or({color:e||this._style.pointColor},[\"BILLBOARD_FIXED\"]);return t.opacity=this._style.pointOpacity,t.transparent=t.opacity<1,t.color.convertSRGBToLinear(),t.toneMapped=!1,t.depthTest=!1,t.billboardPixelHeight=this._style.pointPixelHeight*window.devicePixelRatio,t.userData.billboardPos.value.copy(this.point.position),t}getTextMaterial(){const e=new vr({color:this._style.textColor,opacity:1,side:R},[\"USE_RTE\",\"BILLBOARD_FIXED\"]);return e.toneMapped=!1,e.color.convertSRGBToLinear(),e.opacity=this._style.textOpacity,e.transparent=e.opacity<1,e.depthTest=!1,e.billboardPixelHeight=this._style.textPixelHeight*window.devicePixelRatio,e.userData.billboardPos.value.copy(this.text.position),e.getDerivedMaterial()}constructor(e){super(),this._style=Object.assign({},Mn),this.layers.set(En.MEASUREMENTS);const t=new fe(1,16),r=new Float64Array(t.attributes.position.array);Pt.updateRTEGeometry(t,r),this.disc=new L(t,null),this.disc.layers.set(En.MEASUREMENTS);const n=new Float64Array(18),i=new Fe;i.setPositions(new Float32Array(n)),i.attributes.instanceStart.data.setUsage(w),Pt.updateRTEGeometry(i,n),this.line=new Ye(i,null),this.line.computeLineDistances(),this.line.name=\"test-mesurements-line\",this.line.frustumCulled=!1,this.line.renderOrder=0,this.line.layers.set(En.MEASUREMENTS);const l=new fe(1,16);this.point=new L(l,null),this.point.layers.set(En.MEASUREMENTS),this.point.visible=!1,this.point.renderOrder=1;const a=new L(l,this.getPointMaterial(16777215));a.renderOrder=2,a.material.billboardPixelHeight=this._style.pointPixelHeight*window.devicePixelRatio-2*window.devicePixelRatio,a.layers.set(En.MEASUREMENTS),this.point.add(a),this.text=new Fr(\"test-text\"),this.text.textMesh.material=null,this.text.layers.set(En.MEASUREMENTS),this.text.textMesh.layers.set(En.MEASUREMENTS),this.text.backgroundMesh,this.add(this.point),this.add(this.disc),this.add(this.line),this.add(this.text),this.style=e}enable(e,t,r,n){this.disc.visible=e,this.line.visible=t,this.point.visible=r,this.text.visible=n,this.text.textMesh.visible=n,this.line.material.visible=t}frameUpdate(e,t){if(\"PerspectiveCamera\"===e.type&&+this._style.fixedSize>0){const r=e,n=r.position.distanceTo(this.disc.position),i=Math.abs(2*Math.tan(r.fov/2)*n),l=2*t.min.distanceTo(t.max),a=.0035*Math.min(i,l);this.disc.scale.set(a,a,a),this.disc.matrixWorldNeedsUpdate=!0}if(\"OrthographicCamera\"===e.type&&+this._style.fixedSize>0){const t=e,r=(t.top-t.bottom)/t.zoom*.0075;this.disc.scale.set(r,r,r),this.disc.matrixWorldNeedsUpdate=!0}}updateDisc(e,t){this.disc.position.copy(e),Nn.vecBuff0.set(0,0,1),this.disc.quaternion.setFromUnitVectors(Nn.vecBuff0,t)}updatePoint(e){this.point.position.copy(e),this.point.material.userData.billboardPos.value.copy(this.point.position),this.point.children[0].material.userData.billboardPos.value.copy(this.point.position)}updateLine(e){const t=new Float64Array(3*e.length);e.forEach(((e,r)=>{e.toArray(t,3*r)}));const r=this.line.geometry.attributes.instanceStart.data,n=this.line.geometry.attributes.instanceStartLow.data;Pt.DoubleToHighLowBuffer(t,n.array,r.array),r.needsUpdate=!0,r.updateRange={offset:0,count:3*e.length},n.needsUpdate=!0,n.updateRange={offset:0,count:3*e.length},this.line.visible=!0,this.line.geometry.instanceCount=e.length/2,this.line.geometry.attributes.instanceStart.needsUpdate=!0,this.line.geometry.attributes.instanceEnd.needsUpdate=!0,this.line.geometry.attributes.instanceStartLow.needsUpdate=!0,this.line.geometry.attributes.instanceEndLow.needsUpdate=!0,this.line.geometry.computeBoundingBox(),this.line.geometry.computeBoundingSphere(),this.line.computeLineDistances()}updateText(e,t,r,n){this.text.update({textValue:e,height:1,anchorX:\"50%\",anchorY:\"43%\"}).then((()=>{this.text.style={backgroundColor:new x(294651),billboard:!0,backgroundPixelHeight:20},this.text.setTransform(t,r,n),this.text.backgroundMesh.renderOrder=3,this.text.textMesh.renderOrder=4}))}updateStyle(){this.disc.material=this.getDiscMaterial(),this.line.material=this.getLineMaterial(),this.point.material=this.getPointMaterial(),this.text.textMesh.material=this.getTextMaterial()}raycast(e,t){this.line.raycast(e,t),this.text.raycast(e,t)}updateClippingPlanes(e){var t;this.disc.material.clippingPlanes=e,this.point.material.clippingPlanes=e,this.point.children[0].material.clippingPlanes=e,this.line.material.clippingPlanes=e,this.text.backgroundMesh&&(this.text.backgroundMesh.material.clippingPlanes=e),this.text.textMesh&&((null===(t=this.text.textMesh)||void 0===t?void 0:t.material).clippingPlanes=e)}}var On,Ln;Nn.vecBuff0=new t,function(e){e[e.HIDDEN=0]=\"HIDDEN\",e[e.DANGLING_START=1]=\"DANGLING_START\",e[e.DANGLING_END=2]=\"DANGLING_END\",e[e.COMPLETE=3]=\"COMPLETE\"}(On||(On={}));class Zn extends Se{constructor(){super(...arguments),this.startPoint=new t,this.endPoint=new t,this.startNormal=new t,this.endNormal=new t,this.value=0,this.units=\"m\",this.precision=2,this._state=On.HIDDEN,this.renderingSize=new y}set state(e){this._state=e}get state(){return this._state}set isVisible(e){}get bounds(){return(new c).expandByPoint(this.startPoint).expandByPoint(this.endPoint)}frameUpdate(e,t,r){this.renderingCamera=e,this.renderingSize.copy(t)}update(){}raycast(e,t){}highlight(e){}updateClippingPlanes(e){}}Zn.vec3Buff0=new t,Zn.vec3Buff1=new t,Zn.vec3Buff2=new t,Zn.vec3Buff3=new t,Zn.vec3Buff4=new t,Zn.vec4Buff0=new J,Zn.vec4Buff1=new J,Zn.vec2Buff0=new y;class kn extends Zn{set isVisible(e){this.startGizmo.enable(e,e,e,e),this.endGizmo.enable(e,e,e,e)}get bounds(){return(new c).expandByPoint(this.startPoint).expandByPoint(this.midPoint)}constructor(){super(),this.startGizmo=null,this.endGizmo=null,this.midPoint=new t,this.normalIndicatorPixelSize=15,this.type=\"PerpendicularMeasurement\",this.startPoint.set(NaN,NaN,NaN),this.startGizmo=new Nn,this.endGizmo=new Nn({dashedLine:!0,lineOpacity:.25}),this.startLineLength=.25,this.add(this.startGizmo),this.add(this.endGizmo),this.layers.set(En.MEASUREMENTS)}frameUpdate(e,t,r){super.frameUpdate(e,t,r),this.startGizmo.frameUpdate(e,r),this.endGizmo.frameUpdate(e,r),this._state===On.DANGLING_START&&this.update()}update(){if(!isNaN(this.startPoint.length())){if(this.startGizmo.updateDisc(this.startPoint,this.startNormal),this.startGizmo.updatePoint(this.startPoint),this.endGizmo.updateDisc(this.endPoint,this.endNormal),this._state===On.DANGLING_START){const e=Zn.vec3Buff0.copy(this.startPoint),t=Zn.vec4Buff0.set(this.startPoint.x,this.startPoint.y,this.startPoint.z,1).applyMatrix4(this.renderingCamera.matrixWorldInverse).applyMatrix4(this.renderingCamera.projectionMatrix),r=t.w;t.multiplyScalar(1/r);const n=Zn.vec4Buff1.set(this.startNormal.x,this.startNormal.y,this.startNormal.z,0).applyMatrix4(this.renderingCamera.matrixWorldInverse).applyMatrix4(this.renderingCamera.projectionMatrix).normalize(),i=0===n.w?1:n.w;n.multiplyScalar(1/i).normalize(),this.renderingCamera instanceof he&&n.negate();const l=Zn.vec2Buff0.set(this.normalIndicatorPixelSize/this.renderingSize.x*2,this.normalIndicatorPixelSize/this.renderingSize.y*2),a=Zn.vec4Buff0.set(t.x,t.y,t.z,1).add(Zn.vec4Buff1.set(n.x*l.x,n.y*l.y,0,0));a.multiplyScalar(r),a.applyMatrix4(this.renderingCamera.projectionMatrixInverse).applyMatrix4(this.renderingCamera.matrixWorld),this.startGizmo.updateLine([e,Zn.vec3Buff1.set(a.x,a.y,a.z)]),this.endGizmo.enable(!1,!1,!1,!1)}if(this._state===On.DANGLING_END){const e=this.startPoint.distanceTo(this.endPoint),t=Zn.vec3Buff0.copy(this.startPoint).sub(this.endPoint).normalize();let r=this.startNormal.dot(t);const n=Math.acos(Math.min(Math.max(r,-1),1));this.startLineLength=Math.abs(e*Math.cos(n)),this.midPoint.copy(Zn.vec3Buff0.copy(this.startPoint).add(Zn.vec3Buff1.copy(this.startNormal).multiplyScalar(this.startLineLength)));const i=Zn.vec3Buff1.copy(this.midPoint).sub(this.endPoint).normalize();this.endLineLength=this.midPoint.distanceTo(this.endPoint),r=this.endNormal.dot(i);const l=Math.acos(Math.min(Math.max(r,-1),1)),a=this.endLineLength*Math.cos(l),s=Zn.vec3Buff1.copy(this.endPoint).add(Zn.vec3Buff2.copy(this.endNormal).multiplyScalar(a)),u=Zn.vec3Buff2.copy(this.startPoint),d=Zn.vec3Buff3.copy(this.startPoint).add(Zn.vec3Buff4.copy(this.startNormal).multiplyScalar(this.startLineLength));this.startGizmo.updateLine([u,d]);const p=Zn.vec3Buff3.copy(this.endPoint);this.endGizmo.updateLine([p,s,s,this.midPoint,this.midPoint,p]),this.endGizmo.updatePoint(this.midPoint);const o=Zn.vec3Buff0.copy(this.startPoint).add(Zn.vec3Buff1.copy(this.startNormal).multiplyScalar(.5*this.startLineLength));this.value=this.midPoint.distanceTo(this.startPoint),this.startGizmo.updateText(`${(this.value*Lt(\"m\",this.units)).toFixed(this.precision)} ${this.units}`,o),this.endGizmo.enable(!0,!0,!0,!0)}this._state===On.COMPLETE&&(this.startGizmo.updateText(`${(this.value*Lt(\"m\",this.units)).toFixed(this.precision)} ${this.units}`),this.startGizmo.enable(!1,!0,!0,!0),this.endGizmo.enable(!1,!1,!0,!1))}}raycast(e,t){const r=[];this.startGizmo.raycast(e,r),this.endGizmo.raycast(e,r),r.length&&t.push({distance:r[0].distance,face:r[0].face,faceIndex:r[0].faceIndex,object:this,point:r[0].point,uv:r[0].uv})}highlight(e){this.startGizmo.highlight=e,this.endGizmo.highlight=e}updateClippingPlanes(e){this.startGizmo.updateClippingPlanes(e),this.endGizmo.updateClippingPlanes(e)}}class Gn extends Zn{set isVisible(e){this.startGizmo.enable(e,e,e,e),this.endGizmo.enable(e,e,e,e)}constructor(){super(),this.startGizmo=null,this.endGizmo=null,this.type=\"PointToPointMeasurement\",this.startGizmo=new Nn,this.endGizmo=new Nn({dashedLine:!0,lineOpacity:.25}),this.startLineLength=0,this.add(this.startGizmo),this.add(this.endGizmo),this.layers.set(En.MEASUREMENTS)}frameUpdate(e,t,r){super.frameUpdate(e,t,r),this.startGizmo.frameUpdate(e,r),this.endGizmo.frameUpdate(e,r)}update(){if(this.startGizmo.updateDisc(this.startPoint,this.startNormal),this.startGizmo.updatePoint(this.startPoint),this.endGizmo.updateDisc(this.endPoint,this.endNormal),this._state===On.DANGLING_START){const e=Zn.vec3Buff0.copy(this.startPoint),t=Zn.vec3Buff1.copy(this.startPoint).add(Zn.vec3Buff2.copy(this.startNormal).multiplyScalar(this.startLineLength));this.startGizmo.updateLine([e,t]),this.endGizmo.enable(!1,!1,!1,!1)}if(this._state===On.DANGLING_END){this.startLineLength=this.startPoint.distanceTo(this.endPoint),this.value=this.startLineLength;const e=Zn.vec3Buff0.copy(this.endPoint).sub(this.startPoint).normalize(),t=Zn.vec3Buff1.copy(this.startPoint).add(Zn.vec3Buff2.copy(e).multiplyScalar(this.startLineLength)),r=Zn.vec3Buff3.copy(this.startPoint).add(Zn.vec3Buff4.copy(e).multiplyScalar(.5*this.startLineLength));this.startGizmo.updateLine([this.startPoint,t]),this.endGizmo.updatePoint(t),this.startGizmo.updateText(`${(this.value*Lt(\"m\",this.units)).toFixed(this.precision)} ${this.units}`,r),this.endGizmo.enable(!0,!0,!0,!0)}this._state===On.COMPLETE&&(this.startGizmo.enable(!1,!0,!0,!0),this.endGizmo.enable(!1,!1,!0,!1),this.startGizmo.updateText(`${(this.value*Lt(\"m\",this.units)).toFixed(this.precision)} ${this.units}`))}raycast(e,t){const r=[];this.startGizmo.raycast(e,r),this.endGizmo.raycast(e,r),r.length&&t.push({distance:r[0].distance,face:r[0].face,faceIndex:r[0].faceIndex,object:this,point:r[0].point,uv:r[0].uv})}highlight(e){this.startGizmo.highlight=e,this.endGizmo.highlight=e}updateClippingPlanes(e){this.startGizmo.updateClippingPlanes(e),this.endGizmo.updateClippingPlanes(e)}}!function(e){e[e.PERPENDICULAR=0]=\"PERPENDICULAR\",e[e.POINTTOPOINT=1]=\"POINTTOPOINT\"}(Ln||(Ln={}));const jn={visible:!0,type:Ln.POINTTOPOINT,vertexSnap:!0,units:\"m\",precision:2};class In{constructor(e){this.renderer=null,this.measurements=[],this.measurement=null,this.selectedMeasurement=null,this.raycaster=null,this._options=Object.assign({},jn),this.frameLock=!1,this._enabled=!1,this._paused=!1,this.pointBuff=new t,this.normalBuff=new t,this.screenBuff0=new y,this.screenBuff1=new y,this.renderer=e,this.raycaster=new D,this.raycaster.layers.set(En.MEASUREMENTS),this.renderer.input.on(\"pointer-move\",this.onPointerMove.bind(this)),this.renderer.input.on(it.ObjectClicked,this.onPointerClick.bind(this)),this.renderer.input.on(it.ObjectDoubleClicked,this.onPointerDoubleClick.bind(this))}get enabled(){return this._enabled}get visible(){return this._options.visible}set enabled(e){this._enabled=e,this.measurement&&(this.measurement.isVisible=e,this.measurement.update()),this.renderer.needsRender=!0,this.renderer.resetPipeline()}set paused(e){this._paused=e}set options(e){const t=this._options.type!==e.type&&this.measurement&&this.measurement.state===On.DANGLING_START;Object.assign(this._options,e),t&&(this.cancelMeasurement(),this.startMeasurement()),this.applyOptions()}update(){this._enabled&&(this.frameLock=!1,this.renderer.renderer.getDrawingBufferSize(this.screenBuff0),this.measurement&&this.measurement.frameUpdate(this.renderer.camera,this.screenBuff0,this.renderer.sceneBox),this.measurements.forEach((e=>{e.frameUpdate(this.renderer.camera,this.screenBuff0,this.renderer.sceneBox)})))}fromMeasurementData(e,t){const r=new Gn;r.startPoint.copy(e),r.endPoint.copy(t),r.state=On.DANGLING_END,r.update(),r.state=On.COMPLETE,r.update(),this.measurements.push(this.measurement)}updateClippingPlanes(e){this.measurements.forEach((t=>{t.updateClippingPlanes(e)}))}onPointerMove(e){if(!this._enabled||this._paused)return;if(this.frameLock)return;let t=this.renderer.intersections.intersect(this.renderer.scene,this.renderer.camera,e,!0,this.renderer.currentSectionBox,[En.STREAM_CONTENT_MESH])||[];t=t.filter((e=>{const t=e.object.getBatchObjectMaterial(e.batchObject);return!(t instanceof cr)&&t.visible})),t.length&&(this.measurement||this.startMeasurement(),this.measurement.isVisible=!0,this.pointBuff.copy(t[0].point),this.normalBuff.copy(t[0].face.normal),this._options.vertexSnap&&this.snap(t[0],this.pointBuff,this.normalBuff),this.measurement.state===On.DANGLING_START?(this.measurement.startPoint.copy(this.pointBuff),this.measurement.startNormal.copy(this.normalBuff)):this.measurement.state===On.DANGLING_END&&(this.measurement.endPoint.copy(this.pointBuff),this.measurement.endNormal.copy(this.normalBuff)),this.measurement.update(),this.renderer.needsRender=!0,this.renderer.resetPipeline(\"OrthographicCamera\"===this.renderer.camera.type),this.frameLock=!0)}onPointerClick(e){this._enabled&&(2!==e.event.button?this.measurement&&(this.measurement.state===On.DANGLING_START?this.measurement.state=On.DANGLING_END:this.measurement.state===On.DANGLING_END&&this.finishMeasurement()):this.cancelMeasurement())}onPointerDoubleClick(e){this._options.type!==Ln.PERPENDICULAR||this.autoLazerMeasure(e)}autoLazerMeasure(e){if(!this.measurement)return;this.measurement.state=On.DANGLING_START;let r=this.renderer.intersections.intersect(this.renderer.scene,this.renderer.camera,e,!0,this.renderer.currentSectionBox,[En.STREAM_CONTENT_MESH])||[];if(r=r.filter((e=>{const t=e.object.getBatchObjectMaterial(e.batchObject);return!(t instanceof cr)&&t.visible})),!r.length)return;const n=(new t).copy(r[0].point),i=(new t).copy(r[0].face.normal),l=(new t).copy(n).add((new t).copy(i).multiplyScalar(1e-6));let a=this.renderer.intersections.intersectRay(this.renderer.scene,this.renderer.camera,new f(l,i),!0,this.renderer.currentSectionBox,[En.STREAM_CONTENT_MESH])||[];a=a.filter((e=>{const t=e.object.getBatchObjectMaterial(e.batchObject);return!(t instanceof cr)&&t.visible})),a.length?(this.measurement.startPoint.copy(n),this.measurement.startNormal.copy(i),this.measurement.endPoint.copy(a[0].point),this.measurement.endNormal.copy(a[0].face.normal),this.measurement.state=On.DANGLING_END,this.measurement.update(),this.finishMeasurement()):this.flashMeasurement()}startMeasurement(){this._options.type===Ln.PERPENDICULAR?this.measurement=new kn:this._options.type===Ln.POINTTOPOINT&&(this.measurement=new Gn),this.measurement.state=On.DANGLING_START,this.measurement.frameUpdate(this.renderer.camera,this.screenBuff0,this.renderer.sceneBox),this.renderer.scene.add(this.measurement)}cancelMeasurement(){this.renderer.scene.remove(this.measurement),this.measurement=null,this.renderer.needsRender=!0,this.renderer.resetPipeline()}finishMeasurement(){this.measurement.state=On.COMPLETE,this.measurement.update(),this.measurement.value>0?this.measurements.push(this.measurement):(this.renderer.scene.remove(this.measurement),We.error(\"Ignoring zero value measurement!\")),this.measurement=null}snap(e,t,r){const n=e.batchObject.bvh.getVertexAtIndex(e.face.a).project(this.renderer.camera),i=e.batchObject.bvh.getVertexAtIndex(e.face.b).project(this.renderer.camera),l=e.batchObject.bvh.getVertexAtIndex(e.face.c).project(this.renderer.camera),a=e.point.project(this.renderer.camera),s=[n,i,l];s.sort(((e,t)=>a.distanceTo(e)-a.distanceTo(t)));const u=this.renderer.NDCToScreen(s[0].x,s[0].y),d=this.renderer.NDCToScreen(a.x,a.y);this.screenBuff0.set(u.x,u.y),this.screenBuff1.set(d.x,d.y);const p=s[0].unproject(this.renderer.camera);this.screenBuff0.distanceTo(this.screenBuff1)<10*window.devicePixelRatio&&(t.copy(p),r.copy(e.face.normal))}flashMeasurement(){let e=0;const t=setInterval((()=>{this.measurement.highlight(Boolean(e++%2)),e>=5&&clearInterval(t),this.renderer.needsRender=!0,this.renderer.resetPipeline()}),100)}pickMeasurement(e){var t;this.measurements.forEach((e=>{e.highlight(!1)})),this.raycaster.setFromCamera(e,this.renderer.camera);return null===(t=this.raycaster.intersectObjects(this.measurements,!1)[0])||void 0===t?void 0:t.object}selectMeasurement(e,t){this.cancelMeasurement(),e.highlight(t),this.selectedMeasurement=e}removeMeasurement(){this.selectedMeasurement?(this.measurements.splice(this.measurements.indexOf(this.selectedMeasurement),1),this.renderer.scene.remove(this.selectedMeasurement),this.selectedMeasurement=null,this.renderer.needsRender=!0,this.renderer.resetPipeline()):this.cancelMeasurement()}applyOptions(){[this.measurement,...this.measurements].forEach((e=>{e&&(e.units=this._options.units,e.precision=this._options.precision,e.update())})),this.renderer.enableLayers([En.MEASUREMENTS],this._options.visible),this.renderer.needsRender=!0,this.renderer.resetPipeline()}}var En;!function(e){e[e.STREAM_CONTENT_MESH=10]=\"STREAM_CONTENT_MESH\",e[e.STREAM_CONTENT_LINE=11]=\"STREAM_CONTENT_LINE\",e[e.STREAM_CONTENT_POINT=12]=\"STREAM_CONTENT_POINT\",e[e.STREAM_CONTENT_TEXT=13]=\"STREAM_CONTENT_TEXT\",e[e.STREAM_CONTENT_POINT_CLOUD=14]=\"STREAM_CONTENT_POINT_CLOUD\",e[e.STREAM_CONTENT=1]=\"STREAM_CONTENT\",e[e.PROPS=2]=\"PROPS\",e[e.SHADOWCATCHER=3]=\"SHADOWCATCHER\",e[e.MEASUREMENTS=4]=\"MEASUREMENTS\"}(En||(En={}));class wn{get renderer(){return this._renderer}set needsRender(e){this._needsRender||(this._needsRender=e)}set indirectIBL(e){this._scene.environment=e}set indirectIBLIntensity(e){const t=this.batcher.getBatches(void 0,Kt.MESH);for(let r=0;r{e.name.includes(\"_bvh\")&&(e.visible=this.SHOW_BVH)}))}get shadowcatcher(){return this._shadowcatcher}get intersections(){return this._intersections}get currentSectionBox(){return this.viewer.sectionBox.getCurrentBox()}get measurements(){return this._measurements}constructor(e){this.SHOW_HELPERS=!1,this.IGNORE_ZERO_OPACITY_OBJECTS=!0,this.SHOW_BVH=!1,this.sunConfiguration=lt,this.filterBatchRecording=[],this.lastSectionPlanes=[],this.sectionPlanesChanged=[],this.sectionBoxOutlines=null,this._shadowcatcher=null,this._measurements=null,this.cancel={},this.explodeTime=-1,this.explodeRange=0,this._scene=new Ve,this.rootGroup=new ve,this.rootGroup.name=\"ContentGroup\",this.rootGroup.layers.set(En.STREAM_CONTENT),this._scene.add(this.rootGroup),this._intersections=new $r,this.viewer=e,this.lastSectionPlanes.push(new se,new se,new se,new se,new se,new se)}create(e){this._renderer=new me({antialias:!0,alpha:!0,preserveDrawingBuffer:!0,stencil:!0}),this._renderer.setClearColor(16777215,0),this._renderer.setPixelRatio(window.devicePixelRatio),this._renderer.outputEncoding=ze,this._renderer.toneMapping=Xe,this._renderer.toneMappingExposure=.5,this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=be,this.renderer.shadowMap.autoUpdate=!1,this.renderer.shadowMap.needsUpdate=!0,this.renderer.physicallyCorrectLights=!0,this.renderer.autoClearStencil=!1,this.container=e,this._renderer.setSize(e.offsetWidth,e.offsetHeight),e.appendChild(this._renderer.domElement),this.batcher=new Cr(this.renderer.capabilities.maxVertexUniforms,this.renderer.capabilities.floatVertexTextures),this.pipeline=new Un(this._renderer,this.batcher),this.pipeline.configure(),this.pipeline.pipelineOptions=Kn,this.sectionBoxOutlines=new xn;const t=new ve;if(t.name=\"SectionBoxOutlines\",this.scene.add(t),t.add(this.sectionBoxOutlines.getPlaneOutline(Tn.NEGATIVE_Z).renderable),t.add(this.sectionBoxOutlines.getPlaneOutline(Tn.POSITIVE_Z).renderable),t.add(this.sectionBoxOutlines.getPlaneOutline(Tn.POSITIVE_X).renderable),t.add(this.sectionBoxOutlines.getPlaneOutline(Tn.NEGATIVE_X).renderable),t.add(this.sectionBoxOutlines.getPlaneOutline(Tn.POSITIVE_Y).renderable),t.add(this.sectionBoxOutlines.getPlaneOutline(Tn.NEGATIVE_Y).renderable),this.input=new Qr(this._renderer.domElement,Hr),this.input.on(it.ObjectClicked,this.onObjectClick.bind(this)),this.input.on(it.ObjectDoubleClicked,this.onObjectDoubleClick.bind(this)),this.addDirectLights(),this.SHOW_HELPERS){const e=new ve;e.name=\"Helpers\",this._scene.add(e);const t=new v(this.sceneBox,new x(255));t.name=\"SceneBoxHelper\",t.layers.set(En.PROPS),e.add(t);const r=new qe(this.sun,50,16711680);r.name=\"DirLightHelper\",r.layers.set(En.PROPS),e.add(r);const n=new oe(this.sun.shadow.camera);n.name=\"CamHelper\",n.layers.set(En.PROPS),e.add(n)}let r;this.viewer.cameraHandler.controls.restThreshold=.001,this.viewer.cameraHandler.controls.addEventListener(\"rest\",(()=>{this._needsRender=!0,this.pipeline.onStationaryBegin(),this._measurements.paused=!1})),this.viewer.cameraHandler.controls.addEventListener(\"controlstart\",(()=>{this._needsRender=!0,this.pipeline.onStationaryEnd()})),this.viewer.cameraHandler.controls.addEventListener(\"controlend\",(()=>{this._needsRender=!0,this.viewer.cameraHandler.controls.hasRested&&this.pipeline.onStationaryBegin(),this._measurements.paused=!1})),this.viewer.cameraHandler.controls.addEventListener(\"control\",(()=>{this._needsRender=!0,this.pipeline.onStationaryEnd(),this._measurements.paused=!0})),this.viewer.cameraHandler.controls.addEventListener(\"update\",(()=>{this.viewer.cameraHandler.controls.hasRested||this.pipeline.renderType!==bn.ACCUMULATION||(this._needsRender=!0,this.pipeline.onStationaryEnd())})),this._shadowcatcher=new Rn(En.SHADOWCATCHER,[En.STREAM_CONTENT_MESH]),this._shadowcatcher.shadowcatcherPass.onBeforeRender=()=>{r=this.batcher.saveVisiblity();const e=this.batcher.getOpaque();this.batcher.applyVisibility(e)},this._shadowcatcher.shadowcatcherPass.onAfterRender=()=>{this.batcher.applyVisibility(r)},this._scene.add(this._shadowcatcher.shadowcatcherMesh),this._measurements=new In(this)}update(e){this.needsRender=this.viewer.cameraHandler.controls.update(e),this.batcher.update(e),this.updateRTEShadows(),this.updateTransforms(),this.updateFrustum(),this._measurements.update(),this.pipeline.update(this),this.sunConfiguration.shadowcatcher&&this._shadowcatcher.update(this._scene),this.explodeTime>-1&&(this.explode(this.explodeTime,this.explodeRange),this.explodeTime=-1)}updateRTEShadows(){if(!this._renderer.shadowMap.needsUpdate)return;const e=new t,r=new t,n=new t;e.set(this.sun.shadow.camera.matrixWorld.elements[12],this.sun.shadow.camera.matrixWorld.elements[13],this.sun.shadow.camera.matrixWorld.elements[14]),Pt.DoubleToHighLowVector(e,r,n);const i=new s;i.copy(this.sun.shadow.camera.matrixWorldInverse),i.elements[12]=0,i.elements[13]=0,i.elements[14]=0;const l=new s;l.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),l.multiply(this.sun.shadow.camera.projectionMatrix),l.multiply(i);const a=new s,u=this.batcher.getBatches(void 0,Kt.MESH);for(let e=0;e{this.addBatch(e,t)})),this.updateDirectLights(),this.updateHelpers(),this.viewer.sectionBox.display.visible&&this.viewer.setSectionBox(),this.updateShadowCatcher(),this._needsRender=!0}async addRenderTreeAsync(e,t=1,r=!0){this.cancel[e]=!1;const n=new ve;n.name=e,n.layers.set(En.STREAM_CONTENT),this.rootGroup.add(n);const i=this.batcher.makeBatchesAsync(this.viewer.getWorldTree().getRenderTree(e),Gt,void 0,t);for await(const t of i)if(t&&(this.addBatch(t,n),r&&this.zoom(),t.geometryType===Kt.MESH&&this.updateDirectLights(),this._needsRender=!0,this.cancel[e])){i.return(),this.removeRenderTree(e),delete this.cancel[e];break}this.updateHelpers(),this.updateShadowCatcher(),this.viewer.sectionBox.display.visible&&this.viewer.setSectionBox(),delete this.cancel[e]}addBatch(e,t){const r=e.renderObject;if(t.add(e.renderObject),e.geometryType===Kt.MESH){const n=r.material;if(r.castShadow=!n.transparent,r.receiveShadow=!n.transparent,r.customDepthMaterial=new en({depthPacking:ee},[\"USE_RTE\",\"ALPHATEST_REJECTION\"]),this.SHOW_BVH){const n=new Ze(r,10);n.name=e.renderObject.id+\"_bvh\",n.traverse((e=>{e.layers.set(En.PROPS)})),n.displayParents=!0,n.visible=!1,n.update(),t.add(n)}r.BVH.boxHelpers.forEach((e=>{this.scene.add(e)}))}this.viewer.World.expandWorld(e.bounds)}removeRenderTree(e){this.rootGroup.remove(this.rootGroup.getObjectByName(e)),this.updateShadowCatcher();this.batcher.getBatches(e).forEach((e=>{this.viewer.World.reduceWorld(e.bounds)})),this.batcher.purgeBatches(e),this.updateDirectLights(),this.updateHelpers()}cancelRenderTree(e){void 0!==this.cancel[e]&&(this.cancel[e]=!0)}clearFilter(){this.batcher.resetBatchesDrawRanges(),this.filterBatchRecording=[]}applyFilter(e,t){this.filterBatchRecording.push(...this.batcher.setObjectsFilterMaterial(e,t))}applyDirectFilter(e,t){return this.batcher.insertObjectsFilterMaterial(e,t)}removeDirectFilter(e){this.batcher.removeObjectsMaterial(e)}applyMaterial(e,t){const r={needsCopy:!0};this.filterBatchRecording.push(...this.batcher.setObjectsMaterial(e,(e=>({offset:e.batchStart,count:e.batchCount,material:t,materialOptions:r}))))}beginFilter(){this.filterBatchRecording=[]}endFilter(){this.batcher.autoFillDrawRanges(this.filterBatchRecording),this.updateClippingPlanes(this.viewer.sectionBox.planes),this.viewer.sectionBox.display.visible&&this.updateSectionBoxCapper(),this.renderer.shadowMap.needsUpdate=!0,this.updateShadowCatcher()}getBatchMaterials(){return Object.keys(this.batcher.batches).reduce(((e,t)=>({...e,[t]:this.batcher.batches[t].batchMaterial})),{})}updateClippingPlanes(e){this.allObjects&&(e||(e=this.viewer.sectionBox.planes),this.allObjects.traverse((t=>{const r=t.material;if(r)if(Array.isArray(r))for(let t=0;t1e-4&&this.sectionPlanesChanged.push(e[t]),this.lastSectionPlanes[t].copy(e[t])}onSectionBoxDragStart(){this.sectionBoxOutlines.enable(!1)}onSectionBoxDragEnd(){const e=()=>{this.setSectionPlaneChanged(this.viewer.sectionBox.planes),this.updateSectionBoxCapper(this.sectionPlanesChanged),this.updateShadowCatcher(),this.viewer.removeListener(it.SectionBoxUpdated,e)};this.viewer.on(it.SectionBoxUpdated,e)}updateSectionBoxCapper(e){const t=performance.now();e||(e=this.viewer.sectionBox.planes);for(let t=0;t{e.name.includes(\"_bvh\")&&(e.visible=!0)})));let n=!1;e.multiSelect&&(n=!0);const i=this.queryHits(r);if(!i)return void this.viewer.emit(it.ObjectClicked,n?{multiple:!0,event:e.event}:null);const l={multiple:n,event:e.event,hits:i.map((e=>({guid:e.node.model.id,object:e.node.model.raw,point:e.point})))};this.viewer.emit(it.ObjectClicked,l)}onObjectDoubleClick(e){const t=this._measurements.pickMeasurement(e);if(t)return void this.zoomToBox(t.bounds);if(this._measurements.enabled)return;const r=this._intersections.intersect(this._scene,this.viewer.cameraHandler.activeCam.camera,e,!0,this.viewer.sectionBox.getCurrentBox());if(!r)return void this.viewer.emit(it.ObjectDoubleClicked,null);let n=!1;e.multiSelect&&(n=!0);const i=this.queryHits(r);if(!i)return void this.viewer.emit(it.ObjectClicked,null);const l={multiple:n,hits:i.map((e=>({guid:e.node.model.id,object:e.node.model.raw,point:e.point})))};this.viewer.emit(it.ObjectDoubleClicked,l)}boxFromObjects(e){let r=new c;const n=[];e.length>0?this.viewer.getWorldTree().walk((t=>!t.model.atomic||(!t.model.raw||(-1!==e.indexOf(t.model.raw.id)&&n.push(...this.viewer.getWorldTree().getRenderTree().getRenderViewsForNode(t,t)),!0)))):r=this.sceneBox;for(let e=0;ee.renderViews.length-t.renderViews.length));const t=[];for(let r=0;re.mesh)).flatMap((e=>e.batchObjects)).filter((e=>r.includes(e.renderView)))}markTransformsDirty(e){this.batcher.batches[e].mesh.transformsDirty=!0}enableLayers(e,t){this.pipeline.composer.passes.forEach((r=>{r instanceof nn&&e.forEach((e=>{r.enableLayer(e,t)}))}))}}class Jn extends ut{constructor(t,r){let n;super(),this.viewer=t,this.raycaster=new e.Raycaster,this.raycaster.params.Line.threshold=.1,this.raycaster.params.Line2={},this.raycaster.params.Line2.threshold=1,this.raycaster.layers.set(En.PROPS),this.subset=void 0!==r&&void 0!==r.subset?r.subset:null,this.pointerDown=!1,this.checkForSectionBoxInclusion=!0,void 0!==r&&r.checkForSectionBoxInclusion&&(this.sectionBox=r.checkForSectionBoxInclusion),this.viewer.speckleRenderer.renderer.domElement.addEventListener(\"pointerdown\",(e=>{e.preventDefault(),n=(new Date).getTime()})),this.viewer.speckleRenderer.renderer.domElement.addEventListener(\"pointerup\",(e=>{if(e.preventDefault(),this.viewer.cameraHandler.orbiting)return;const t=(new Date).getTime()-n;if(this.pointerDown=!1,t>250)return;const r=this.getClickedObjects(e);this.emit(\"object-clicked\",r)})),this.tapTimeout,this.lastTap=0,this.touchLocation,this.viewer.speckleRenderer.renderer.domElement.addEventListener(\"touchstart\",(e=>{this.touchLocation=e.targetTouches[0]})),this.viewer.speckleRenderer.renderer.domElement.addEventListener(\"touchend\",(e=>{if(e.targetTouches.length>0)return;const t=(new Date).getTime(),r=t-this.lastTap;if(clearTimeout(this.tapTimeout),r<500&&r>0){const e=this.getClickedObjects(this.touchLocation);this.emit(\"object-doubleclicked\",e)}else this.tapTimeout=setTimeout((function(){clearTimeout(this.tapTimeout)}),500);this.lastTap=t})),this.viewer.speckleRenderer.renderer.domElement.addEventListener(\"dblclick\",(e=>{const t=this.getClickedObjects(e);this.emit(\"object-doubleclicked\",t)})),this.multiSelect=!1,document.addEventListener(\"keydown\",(e=>{e.isComposing||229===e.keyCode||(\"Shift\"===e.key&&(this.multiSelect=!0),\"Escape\"===e.key&&this.unselect())})),document.addEventListener(\"keyup\",(e=>{e.isComposing||229===e.keyCode||\"Shift\"===e.key&&(this.multiSelect=!1)})),this.originalSelectionObjects=[]}unselect(){this.originalSelectionObjects=[]}getClickedObjects(e){const t=this._getNormalisedClickPosition(e);this.raycaster.setFromCamera(t,this.viewer.cameraHandler.activeCam.camera);let r=[];return this.viewer.sectionBox.display.visible&&this.checkForSectionBoxInclusion&&(r=this.raycaster.intersectObject(this.viewer.sectionBox.cube)),r}_getNormalisedClickPosition(e){const t=this.viewer.speckleRenderer.renderer.domElement,r=this.viewer.speckleRenderer.renderer.domElement.getBoundingClientRect(),n=(e.clientX-r.left)*t.width/r.width,i=(e.clientY-r.top)*t.height/r.height;return{x:n/t.width*2-1,y:i/t.height*-2+1}}dispose(){super.dispose(),this.unselect(),this.originalSelectionObjects=null}}const Yn=\"section-box-drag-start\",Fn=\"section-box-drag-end\";class Dn extends ut{constructor(t){super(),this.viewer=t,this.viewer.speckleRenderer.renderer.localClippingEnabled=!0,this.dragging=!1,this.display=new e.Group,this.display.name=\"SectionBox\",this.display.layers.set(En.PROPS),this.viewer.speckleRenderer.scene.add(this.display),this.boxGeometry=this._generateSimpleCube(5,5,5),this.material=new e.MeshStandardMaterial({color:65535,opacity:0,wireframe:!1,side:e.DoubleSide}),this.cube=new e.Mesh(this.boxGeometry,this.material),this.cube.visible=!1,this.cube.layers.set(En.PROPS),this.display.add(this.cube),this.boxHelper=new e.Box3Helper(this.boxGeometry.boundingBox,681727),this.boxHelper.material.opacity=.4,this.boxHelper.layers.set(En.PROPS),this.display.add(this.boxHelper);const r=new e.SphereGeometry(.01,10,10);this.sphere=new e.Mesh(r,new e.MeshStandardMaterial({color:65535})),this.sphere.layers.set(En.PROPS),this.sphere.visible=!1,this.display.add(this.sphere),this.plane=new e.PlaneGeometry(1,1),this.hoverPlane=new e.Mesh(this.plane,new e.MeshStandardMaterial({transparent:!0,side:e.DoubleSide,opacity:.1,wireframe:!1,color:681727,metalness:.1,roughness:.75})),this.hoverPlane.visible=!1,this.hoverPlane.layers.set(En.PROPS),this.display.add(this.hoverPlane),this.dragging=!1,this._setupControls(),this.sidesSimple={256:{verts:[1,2,5,6],axis:\"x\"},152:{verts:[1,2,5,6],axis:\"x\"},407:{verts:[0,3,4,7],axis:\"x\"},703:{verts:[0,3,4,7],axis:\"x\"},327:{verts:[2,3,6,7],axis:\"y\"},726:{verts:[2,3,6,7],axis:\"y\"},450:{verts:[0,1,4,5],axis:\"y\"},\"051\":{verts:[0,1,4,5],axis:\"y\"},312:{verts:[0,1,3,2],axis:\"z\"},\"013\":{verts:[0,1,3,2],axis:\"z\"},546:{verts:[4,5,7,6],axis:\"z\"},647:{verts:[4,5,7,6],axis:\"z\"}},this._generateOrUpdatePlanes(),this.currentRange=null,this.prevPosition=null,this.attachedToBox=!0,this.selectionHelper=new Jn(this.viewer,{subset:[this.cube],hover:!1,checkForSectionBoxInclusion:!1}),this.selectionHelper.on(it.ObjectClicked,this._clickHandler.bind(this)),this.selectionHelper.on(\"hovered\",(()=>{})),document.addEventListener(\"keydown\",(e=>{\"Escape\"===e.key&&this.viewer.mouseOverRenderer&&this._attachControlsToBox()})),this._attachControlsToBox(),this.viewer.on(\"projection-change\",function(){this._setupControls(),this._attachControlsToBox()}.bind(this))}_setupControls(){var e,t;null===(e=this.controls)||void 0===e||e.dispose(),null===(t=this.controls)||void 0===t||t.detach(),this.controls=new $e(this.viewer.cameraHandler.activeCam.camera,this.viewer.speckleRenderer.renderer.domElement);for(let e=0;e{e.layers.set(En.PROPS)}));this.controls.getRaycaster().layers.set(En.PROPS),this.controls.setSize(.75),this.display.add(this.controls),this.controls.addEventListener(\"change\",this._draggingChangeHandler.bind(this)),this.controls.addEventListener(\"dragging-changed\",(e=>{if(!this.display.visible)return;const t=!!e.value;t?(this.emit(Yn),this.dragging=t,this.viewer.cameraHandler.enabled=!t):(this.emit(Fn),setTimeout((()=>{this.dragging=t,this.viewer.cameraHandler.enabled=!t}),100))})),this.viewer.needsRender=!0}_draggingChangeHandler(){if(this.display.visible){if(this.boxGeometry.computeBoundingBox(),this.boxHelper.box.copy(this.boxGeometry.boundingBox),this.dragging&&this.currentRange){this._generateOrUpdatePlanes(),null===this.prevPosition&&(this.prevPosition=this.hoverPlane.position.clone()),this.prevPosition.sub(this.hoverPlane.position),this.prevPosition.negate();const e=this.boxGeometry.attributes.position.array;for(let t=0;t!!t.model.data&&e(t.model.guid,t.model.data))).map((e=>e.model.data))}findFirst(e){return this.root.first((t=>!!t.model.data&&e(t.model.guid,t.model.data))).model.data}walk(e){this.root.walk((t=>!t.model.data||e(t.model.guid,t.model.data)))}}class Cn{static build(e){const t=new gn;let r=null;return e.root.walk((n=>{if(!n.parent)return r=t.root,!0;r=t.root.first((e=>e.model.guid===n.parent.model.id));const i=e.parse({guid:n.model.id,data:n.model.raw,atomic:n.model.atomic,children:[]});return r.addChild(i),!0}),e.root),t}}class Hn{get treeBounds(){return this._treeBounds}get id(){return this.root.model.id}constructor(e,t){this._treeBounds=new c,this.cancel=!1,this.tree=e,this.root=t}buildRenderTree(){this.root.walk((e=>{const t=this.buildRenderNode(e);return e.model.renderView=t?new Et(t):null,this.applyTransforms(e),!0}))}buildRenderTreeAsync(e){return this.tree.walkAsync((e=>{const t=this.buildRenderNode(e);return e.model.renderView=t?new Et(t):null,this.applyTransforms(e),!this.cancel}),this.root,e)}applyTransforms(e){if(e.model.renderView){const t=this.computeTransform(e);e.model.renderView.hasGeometry?(e.model.renderView.renderData.geometry.bakeTransform&&t.multiply(e.model.renderView.renderData.geometry.bakeTransform),Pt.transformGeometryData(e.model.renderView.renderData.geometry,t),e.model.renderView.computeAABB(),this._treeBounds.union(e.model.renderView.aabb),jt.keepGeometryData||jt.disposeNodeGeometryData(e.model)):e.model.renderView.hasMetadata&&e.model.renderView.renderData.geometry.bakeTransform.premultiply(t)}}buildRenderNode(e){let t=null;const r=jt.convertNodeToGeometryData(e.model);if(r){const n=this.getRenderMaterialNode(e),i=this.getDisplayStyleNode(e);t={id:e.model.id,speckleType:jt.getSpeckleType(e.model),geometry:r,renderMaterial:Sr.renderMaterialFromNode(n||i,e),displayStyle:Sr.displayStyleFromNode(i||n)}}return t}getRenderMaterialNode(e){if(e.model.raw.renderMaterial)return e;const t=this.tree.getAncestors(e);for(let e=0;e0){const t=r[e].model.raw.id;if(r[e-1].model.raw.host===t)continue}t.premultiply(n.geometry.transform)}}return t}getRenderableRenderViews(...e){return this.root.all((t=>null!==t.model.renderView&&(t.model.renderView.hasGeometry||t.model.renderView.hasMetadata)&&e.includes(t.model.renderView.renderData.speckleType))).map((e=>e.model.renderView))}getRenderableNodes(...e){return this.root.all((t=>null!==t.model.renderView&&(t.model.renderView.hasGeometry||t.model.renderView.hasMetadata)&&e.includes(t.model.renderView.renderData.speckleType)))}getRenderViewsForNode(e,t){return e.model.atomic&&e.model.renderView&&jt.getSpeckleType(e.model)!==kt.RevitInstance&&jt.getSpeckleType(e.model)!==kt.BlockInstance?[e.model.renderView]:(t||e.parent).all((e=>e.model.renderView&&(e.model.renderView.hasGeometry||e.model.renderView.hasMetadata))).map((e=>e.model.renderView))}getRenderViewNodesForNode(e,t){return e.model.atomic&&e.model.renderView&&jt.getSpeckleType(e.model)!==kt.RevitInstance&&jt.getSpeckleType(e.model)!==kt.BlockInstance?[e]:(t||e.parent).all((e=>e.model.renderView&&(e.model.renderView.hasGeometry||e.model.renderView.hasMetadata)))}getAtomicParent(e){return e.model.atomic?e:this.tree.getAncestors(e).find((e=>e.model.atomic))}getRenderViewsForNodeId(e){const t=this.tree.findId(e);return t?this.getRenderViewsForNode(t):(We.warn(`Id ${e} does not exist`),null)}getRenderViewForNodeId(e){const t=this.tree.findId(e);return t?t.model.renderView:(We.warn(`Id ${e} does not exist`),null)}purge(){this.tree=null}cancelBuild(e){this.cancel=!0,this.tree.purge(e),this.purge()}}class Qn{constructor(){this.renderTreeInstances={},this.supressWarnings=!0,this.tree=new et,this._root=this.parse({id:Qn.ROOT_ID,raw:{},atomic:!0,children:[],renderView:null})}getRenderTree(e){if(!this._root)return console.error(\"WorldTree not initialised\"),null;const t=e||this.root.model.id;return this.renderTreeInstances[t]||(this.renderTreeInstances[t]=new Hn(this,this.findId(t))),this.renderTreeInstances[t]}getDataTree(){return Cn.build(this)}get root(){return this._root}isRoot(e){return e===this._root}parse(e){return this.tree.parse(e)}addSubtree(e){this._root.addChild(e)}addNode(e,t){null!==t?t.addChild(e):We.error(\"Invalid parent node!\")}removeNode(e){e.drop()}findAll(e,t){return t||this.supressWarnings||We.warn(\"Root will be used for searching. You might not want that\"),(t||this.root).all(e)}findId(e,t){return t||this.supressWarnings||We.warn(\"Root will be used for searching. You might not want that\"),(t||this.root).first((t=>t.model.id===e))}getAncestors(e){return e.getPath().reverse().slice(1)}walk(e,t){t||this.supressWarnings||We.warn(\"Root will be used for searching. You might not want that\"),this._root.walk(e,t)}async walkAsync(e,t,r){t||this.supressWarnings||We.warn(\"Root will be used for searching. You might not want that\");const n=Jr.getPause(r);const i=async function*e(t,r){let n,i;for(yield t(r),n=0,i=r.children.length;ndelete this.renderTreeInstances[e])),this._root.drop(),this._root.children.length=0,this.tree=new et,this._root=this.tree.parse({id:Qn.ROOT_ID,raw:{},atomic:!0,children:[]})}}Qn.ROOT_ID=\"ROOT\";const An=function(e){const t={};for(const r in e){if([\"id\",\"__closure\",\"__parents\",\"bbox\",\"totalChildrenCount\"].includes(r))continue;const n=e[r];if(null!=n&&!Array.isArray(n))if(n.constructor!==Object)[\"string\",\"number\",\"boolean\"].includes(typeof n)&&(t[r]=n);else{const e=An(n);for(const n in e)t[`${r}.${n}`]=e[n]}}return e.id&&(t.id=e.id),t};class Bn{constructor(){this.propCache={}}getProperties(e,t=null,r=!1){let n=e.root;if(!r&&this.propCache[t||n.model.id])return this.propCache[t||n.model.id];if(t){const e=n.children.find((e=>e.model.id===t));if(!e)throw new Error(`Could not find root node for ${t} - is it loaded?`);n=e}const i={};e.walk((e=>{if(!e.model.atomic)return!0;const t=An(e.model.raw);for(const e in t)Array.isArray(t[e])||(i[e]||(i[e]=[]),i[e].push({value:t[e],id:t.id}))}),n);const l=[];for(const e in i){const t=i[e],r={};if(r.key=e,r.type=\"string\"==typeof t[0].value?\"string\":\"number\",r.objectCount=t.length,\"string\"===r.type){const e=r,n={};for(const{value:e,id:r}of t)n[e]||(n[e]=[]),n[e].push(r);e.valueGroups=[];for(const t in n)e.valueGroups.push({value:t,ids:n[t]});e.valueGroups=e.valueGroups.sort(((e,t)=>e.value.localeCompare(t.value)))}if(\"number\"===r.type){const e=r;e.min=Number.MAX_VALUE,e.max=Number.MIN_VALUE;for(const{value:r}of t)re.max&&(e.max=r);e.valueGroups=t.sort(((e,t)=>e.value-t.value))}l.push(r)}return this.propCache[n.model.id]=l,l}}class _n{static isPointQuery(e){return\"Project\"===e.operation||\"Unproject\"===e.operation}static isIntersectionQuery(e){return\"Occlusion\"===e.operation||\"Pick\"===e.operation}}var $n;_n.DefaultPointQuerySolver=new class{setContext(e){this.renderer=e}solve(e){switch(e.operation){case\"Project\":return this.solveProjection(e);case\"Unproject\":return this.solveUnprojection(e);default:We.error(\"Malformed query\")}}solveProjection(e){const r=new t(e.point.x,e.point.y,e.point.z);return r.project(this.renderer.camera),{x:r.x,y:r.y,z:r.z}}solveUnprojection(e){const r=new t(e.point.x,e.point.y,e.point.z);return r.unproject(this.renderer.camera),{x:r.x,y:r.y,z:r.z}}},_n.DefaultIntersectionQuerySolver=new class{constructor(){this.vecBuff0=new t,this.vecBuff1=new t}setContext(e){this.renderer=e}solve(e){switch(e.operation){case\"Occlusion\":return this.solveOcclusion(e);case\"Pick\":return this.solvePick(e);default:We.error(\"Malformed query\")}}solveOcclusion(e){const t=this.vecBuff0.set(e.point.x,e.point.y,e.point.z),r=this.vecBuff1.copy(t).sub(this.renderer.camera.position);r.normalize();const n=new f(this.renderer.camera.position,r),i=this.renderer.intersections.intersectRay(this.renderer.scene,this.renderer.camera,n,!0,this.renderer.currentSectionBox,[En.STREAM_CONTENT_MESH]);if(!i||0===i.length)return{objects:null};const l=this.renderer.queryHitIds(i);if(!l)return{objects:null};let a=this.renderer.camera.position.distanceTo(t);return a-=e.tolerance,a({guid:e.node.model.id,object:e.node.model.raw,point:e.point})))}}},function(e){e[e.PLAIN=0]=\"PLAIN\",e[e.COLORED=1]=\"COLORED\"}($n||($n={}));class ei{get materialGroups(){return this._materialGroups}constructor(e){this.tree=null,this.addedMaterialMesh=null,this.changedNewMaterialMesh=null,this.changedOldMaterialMesh=null,this.removedMaterialMesh=null,this.addedMaterialPoint=null,this.changedNewMaterialPoint=null,this.changedOldMaterialPoint=null,this.removedMaterialPoint=null,this.addedMaterials=[],this.changedOldMaterials=[],this.changedNewMaterials=[],this.removedMaterials=[],this._materialGroups=null,this.tree=e,this.addedMaterialMesh=new Qt({color:new x(\"#00ff00\"),emissive:0,roughness:1,metalness:0,opacity:1,side:o},[\"USE_RTE\"]),this.addedMaterialMesh.vertexColors=!1,this.addedMaterialMesh.depthWrite=!0,this.addedMaterialMesh.transparent=!0,this.addedMaterialMesh.clipShadows=!0,this.addedMaterialMesh.color.convertSRGBToLinear(),this.changedNewMaterialMesh=new Qt({color:new x(\"#ffff00\"),emissive:0,roughness:1,metalness:0,opacity:1,side:o},[\"USE_RTE\"]),this.changedNewMaterialMesh.vertexColors=!1,this.changedNewMaterialMesh.transparent=!0,this.addedMaterialMesh.depthWrite=!0,this.changedNewMaterialMesh.clipShadows=!0,this.changedNewMaterialMesh.color.convertSRGBToLinear(),this.changedOldMaterialMesh=new Qt({color:new x(\"#ffff00\"),emissive:0,roughness:1,metalness:0,opacity:1,side:o},[\"USE_RTE\"]),this.changedOldMaterialMesh.vertexColors=!1,this.changedOldMaterialMesh.transparent=!0,this.addedMaterialMesh.depthWrite=!0,this.changedOldMaterialMesh.clipShadows=!0,this.changedOldMaterialMesh.color.convertSRGBToLinear(),this.removedMaterialMesh=new Qt({color:new x(\"#ff0000\"),emissive:0,roughness:1,metalness:0,opacity:1,side:o},[\"USE_RTE\"]),this.removedMaterialMesh.vertexColors=!1,this.removedMaterialMesh.transparent=!0,this.addedMaterialMesh.depthWrite=!0,this.removedMaterialMesh.clipShadows=!0,this.removedMaterialMesh.color.convertSRGBToLinear(),this.addedMaterialPoint=new _t({color:65280,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.addedMaterialPoint.transparent=!0,this.addedMaterialPoint.color.convertSRGBToLinear(),this.addedMaterialPoint.toneMapped=!1,this.changedNewMaterialPoint=new _t({color:16776960,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.changedNewMaterialPoint.transparent=!0,this.changedNewMaterialPoint.color.convertSRGBToLinear(),this.changedNewMaterialPoint.toneMapped=!1,this.changedOldMaterialPoint=new _t({color:16776960,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.changedOldMaterialPoint.transparent=!0,this.changedOldMaterialPoint.color.convertSRGBToLinear(),this.changedOldMaterialPoint.toneMapped=!1,this.removedMaterialPoint=new _t({color:16711680,vertexColors:!1,size:2,sizeAttenuation:!1},[\"USE_RTE\"]),this.removedMaterialPoint.transparent=!0,this.removedMaterialPoint.color.convertSRGBToLinear(),this.removedMaterialPoint.toneMapped=!1}intersection(e,t){const[r,n]=[Object.keys(e),Object.keys(t)],[i,l]=r.length>n.length?[n,e]:[r,t];return i.filter((e=>e in l))}buildIdMaps(e,t,r){var n;for(let i=0;ie.model.raw.applicationId)))||void 0===n?void 0:n.model.raw.applicationId;t[l.model.raw.id]={node:l,applicationId:a},a&&(r[a]=1)}}diff(e,t){return this.diffIterative(e,t)}diffBoolean(e,t){const r=performance.now(),n={unchanged:[],added:[],removed:[],modified:[]},i=this.tree.getRenderTree(e),l=this.tree.getRenderTree(t);let a=i.getRenderableNodes(...Gt),s=l.getRenderableNodes(...Gt);a=a.map((e=>i.getAtomicParent(e))),s=s.map((e=>l.getAtomicParent(e))),a=[...Array.from(new Set(a))],s=[...Array.from(new Set(s))];const u={},d={};this.buildIdMaps(a,u,d);const p={},o={};this.buildIdMaps(s,p,o);const c=this.intersection(u,p),v=tt.omit(p,c),f=tt.omit(u,c),S=tt.omit(v,(function(e,t,r){return e.applicationId&&void 0!==d[e.applicationId]})),h=tt.omit(f,(function(e,t,r){return e.applicationId&&void 0!==o[e.applicationId]})),V=tt.omit(f,Object.keys(h)),m=tt.omit(v,Object.keys(S)),z=Object.values(V).map((e=>e.node)),X=Object.values(m).map((e=>e.node));return n.unchanged.push(...c.map((e=>u[e].node))),n.unchanged.push(...c.map((e=>p[e].node))),n.removed.push(...Object.values(h).map((e=>e.node))),n.added.push(...Object.values(S).map((e=>e.node))),z.forEach(((e,t)=>{n.modified.push([z[t],X[t]])})),console.warn(\"Boolean Time -> \",performance.now()-r),Promise.resolve(n)}diffIterative(e,t){var r,n;const i=performance.now(),l=[],a=[],s={unchanged:[],added:[],removed:[],modified:[]},u=this.tree.getRenderTree(e),d=this.tree.getRenderTree(t);let p=u.getRenderableNodes(...Gt),o=d.getRenderableNodes(...Gt);p=p.map((e=>u.getAtomicParent(e))),o=o.map((e=>d.getAtomicParent(e))),p=[...Array.from(new Set(p))],o=[...Array.from(new Set(o))];const c={},v={};this.buildIdMaps(p,c,v);const f={},S={};this.buildIdMaps(o,f,S);for(let e=0;e{s.modified.push([a[t],l[t]])})),console.warn(\"Interative Time -> \",performance.now()-i),Promise.resolve(s)}setDiffTime(e){const t=Math.min(Math.max(1-e,0),1),r=Math.min(Math.max(e,0),1);this.addedMaterials.forEach((e=>{e.opacity=void 0!==e.clampOpacity?Math.min(t,e.clampOpacity):t,e.depthWrite=!(t<.5),e.transparent=e.opacity<1})),this.changedOldMaterials.forEach((e=>{e.opacity=void 0!==e.clampOpacity?Math.min(r,e.clampOpacity):r,e.depthWrite=!(r<.5),e.transparent=e.opacity<1})),this.changedNewMaterials.forEach((e=>{e.opacity=void 0!==e.clampOpacity?Math.min(t,e.clampOpacity):t,e.depthWrite=!(t<.5),e.transparent=e.opacity<1})),this.removedMaterials.forEach((e=>{e.opacity=void 0!==e.clampOpacity?Math.min(r,e.clampOpacity):r,e.depthWrite=!(r<.5),e.transparent=e.opacity<1}))}buildMaterialGroups(e,t,r){const n=performance.now();switch(e){case $n.COLORED:this._materialGroups=this.getColoredMaterialGroups(this.getVisualDiffResult(t));break;case $n.PLAIN:this._materialGroups=this.getPlainMaterialGroups(this.getVisualDiffResult(t),r);break;default:We.error(`Unsupported visual diff mode ${e}`)}return console.warn(\"Material groups -> \",performance.now()-n),this._materialGroups}resetMaterialGroups(){this._materialGroups=null,this.addedMaterials=[],this.changedOldMaterials=[],this.changedNewMaterials=[],this.removedMaterials=[]}getVisualDiffResult(e){const t=this.tree.getRenderTree(),r=e.added.flatMap((e=>t.getRenderViewsForNode(e,e))),n=e.removed.flatMap((e=>t.getRenderViewsForNode(e,e))),i=e.unchanged.flatMap((e=>t.getRenderViewsForNode(e,e))),l=e.modified.flatMap((e=>t.getRenderViewsForNode(e[0],e[0]))).filter((e=>!i.includes(e)&&!n.includes(e))),a=e.modified.flatMap((e=>t.getRenderViewsForNode(e[1],e[1]))).filter((e=>!i.includes(e)&&!r.includes(e)));return{unchanged:i,added:r,removed:n,modifiedOld:l,modifiedNew:a}}getColoredMaterialGroups(e){const t=[{objectIds:[],rvs:e.added.filter((e=>e.geometryType===Kt.MESH||e.geometryType===Kt.LINE)),material:this.addedMaterialMesh},{objectIds:[],rvs:e.modifiedNew.filter((e=>e.geometryType===Kt.MESH||e.geometryType===Kt.LINE)),material:this.changedNewMaterialMesh},{objectIds:[],rvs:e.modifiedOld.filter((e=>e.geometryType===Kt.MESH||e.geometryType===Kt.LINE)),material:this.changedOldMaterialMesh},{objectIds:[],rvs:e.removed.filter((e=>e.geometryType===Kt.MESH||e.geometryType===Kt.LINE)),material:this.removedMaterialMesh},{objectIds:[],rvs:e.added.filter((e=>e.geometryType===Kt.POINT||e.geometryType===Kt.POINT_CLOUD)),material:this.addedMaterialPoint},{objectIds:[],rvs:e.modifiedNew.filter((e=>e.geometryType===Kt.POINT||e.geometryType===Kt.POINT_CLOUD)),material:this.changedNewMaterialPoint},{objectIds:[],rvs:e.modifiedOld.filter((e=>e.geometryType===Kt.POINT||e.geometryType===Kt.POINT_CLOUD)),material:this.changedOldMaterialPoint},{objectIds:[],rvs:e.removed.filter((e=>e.geometryType===Kt.POINT||e.geometryType===Kt.POINT_CLOUD)),material:this.removedMaterialPoint}];return this.addedMaterials.push(this.addedMaterialMesh,this.addedMaterialPoint),this.changedOldMaterials.push(this.changedOldMaterialMesh,this.changedOldMaterialPoint),this.changedNewMaterials.push(this.changedNewMaterialMesh,this.changedNewMaterialPoint),this.removedMaterials.push(this.removedMaterialMesh,this.removedMaterialPoint),t.filter((e=>e.rvs.length>0))}getPlainMaterialGroups(e,t){const r=this.getBatchesSubgroups(e.added,t),n=this.getBatchesSubgroups(e.modifiedOld,t),i=this.getBatchesSubgroups(e.modifiedNew,t),l=this.getBatchesSubgroups(e.removed,t);return this.addedMaterials=r.map((e=>e.material)),this.changedOldMaterials=n.map((e=>e.material)),this.changedNewMaterials=i.map((e=>e.material)),this.removedMaterials=l.map((e=>e.material)),[...r,...n,...i,...l]}getBatchesSubgroups(e,t){const r=[...Array.from(new Set(e.map((e=>e.batchId))))],n=[];for(let i=0;ie.batchId===r[i])),material:l})}return n}}class ti extends ut{get World(){return this.world}get Utils(){return this.utils||(this.utils={screenToNDC:this.speckleRenderer.screenToNDC.bind(this.speckleRenderer),NDCToScreen:this.speckleRenderer.NDCToScreen.bind(this.speckleRenderer)}),this.utils}constructor(t,r=nt){super(),this.tree=new Qn,this.world=new Jr,this.loaders={},this.dynamicallyLoadedDiffResources=[],We.useDefaults(),We.setLevel(r.verbose?We.TRACE:We.ERROR),jt.keepGeometryData=r.keepGeometryData,this.container=t||document.getElementById(\"renderer\"),r.showStats&&(this.stats=Te(),this.container.prepend(this.stats.dom),this.stats.dom.style.position=\"relative\"),this.loaders={},this.startupParams=r,this.clock=new e.Clock,this.inProgressOperations=0,this.cameraHandler=new qt(this),this.speckleRenderer=new wn(this),this.speckleRenderer.create(this.container),window.addEventListener(\"resize\",this.resize.bind(this),!1),this.filteringManager=new rr(this.speckleRenderer,this.tree),this.filteringManager.on(it.FilteringStateSet,(e=>{this.emit(it.FilteringStateSet,e)})),this.propertyManager=new Bn,this.differ=new ei(this.tree),window._V=this,this.sectionBox=new Dn(this),this.sectionBox.disable(),this.on(it.SectionBoxUpdated,(()=>{this.speckleRenderer.updateClippingPlanes(this.sectionBox.planes)})),this.sectionBox.on(Yn,this.speckleRenderer.onSectionBoxDragStart.bind(this.speckleRenderer)),this.sectionBox.on(Fn,this.speckleRenderer.onSectionBoxDragEnd.bind(this.speckleRenderer)),this.frame(),this.resize(),this.on(it.LoadCancelled,(e=>{We.warn(`Cancelled load for ${e}`)}))}getObjects(e){return this.speckleRenderer.getObjects(e)}setSectionBox(e,t){e||(e=this.speckleRenderer.sceneBox),this.sectionBox.setBox(e,t),this.speckleRenderer.updateSectionBoxCapper()}getSectionBoxFromObjects(e){return this.speckleRenderer.boxFromObjects(e)}setSectionBoxFromObjects(e,t){this.setSectionBox(this.getSectionBoxFromObjects(e),t)}getCurrentSectionBox(){return this.sectionBox.getCurrentBox()}resize(){const e=this.container.offsetWidth,t=this.container.offsetHeight;this.speckleRenderer.resize(e,t)}requestRender(){this.speckleRenderer.needsRender=!0,this.speckleRenderer.resetPipeline()}frame(){this.update(),this.render()}update(){var e;const t=this.clock.getDelta();this.speckleRenderer.update(t),null===(e=this.stats)||void 0===e||e.update(),requestAnimationFrame(this.frame.bind(this))}render(){this.speckleRenderer.render()}async init(){this.startupParams.environmentSrc&&$t.getEnvironment(this.startupParams.environmentSrc,this.speckleRenderer.renderer).then((e=>{this.speckleRenderer.indirectIBL=e})).catch((e=>{We.error(e),We.error(\"Fallback to null environment!\")}))}on(e,t){super.on(e,t)}getObjectProperties(e=null,t=!0){return this.propertyManager.getProperties(this.tree,e,t)}selectObjects(e){return new Promise((t=>{t(this.filteringManager.selectObjects(e))}))}resetSelection(){return new Promise((e=>{e(this.filteringManager.resetSelection())}))}hideObjects(e,t=null,r=!1,n=!1){return new Promise((i=>{i(this.filteringManager.hideObjects(e,t,r,n))}))}showObjects(e,t=null,r=!1){return new Promise((n=>{n(this.filteringManager.showObjects(e,t,r))}))}isolateObjects(e,t=null,r=!1,n=!0){return new Promise((i=>{i(this.filteringManager.isolateObjects(e,t,r,n))}))}unIsolateObjects(e,t=null,r=!1){return new Promise((n=>{n(this.filteringManager.unIsolateObjects(e,t,r))}))}highlightObjects(e,t=!1){return new Promise((r=>{r(this.filteringManager.highlightObjects(e,t))}))}resetHighlight(){return new Promise((e=>{e(this.filteringManager.resetHighlight())}))}setColorFilter(e,t=!0){return new Promise((r=>{r(this.filteringManager.setColorFilter(e,t))}))}removeColorFilter(){return new Promise((e=>{e(this.filteringManager.removeColorFilter())}))}setUserObjectColors(e){return new Promise((t=>{t(this.filteringManager.setUserObjectColors(e))}))}resetFilters(){return new Promise((e=>{e(this.filteringManager.reset())}))}async applyFilter(e){}getDataTree(){return this.tree.getDataTree()}getWorldTree(){return this.tree}query(e){return _n.isPointQuery(e)?(_n.DefaultPointQuerySolver.setContext(this.speckleRenderer),_n.DefaultPointQuerySolver.solve(e)):_n.isIntersectionQuery(e)?(_n.DefaultIntersectionQuerySolver.setContext(this.speckleRenderer),_n.DefaultIntersectionQuerySolver.solve(e)):void 0}queryAsync(e){return null}toggleSectionBox(){this.sectionBox.toggle(),this.speckleRenderer.updateSectionBoxCapper()}sectionBoxOff(){this.sectionBox.disable(),this.speckleRenderer.updateSectionBoxCapper()}sectionBoxOn(){this.sectionBox.enable(),this.speckleRenderer.updateSectionBoxCapper()}zoom(e,t,r){this.speckleRenderer.zoom(e,t,r)}setProjectionMode(e){this.cameraHandler.activeCam=e}setOrthoCameraOn(){this.cameraHandler.setOrthoCameraOn(),this.speckleRenderer.resetPipeline(!0)}setPerspectiveCameraOn(){this.cameraHandler.setPerspectiveCameraOn(),this.speckleRenderer.resetPipeline(!0)}toggleCameraProjection(){this.cameraHandler.toggleCameras(),this.speckleRenderer.resetPipeline(!0)}setLightConfiguration(e){this.speckleRenderer.setSunLightConfiguration(e)}getViews(){return this.tree.findAll((e=>{var t;return(null===(t=e.model.renderView)||void 0===t?void 0:t.speckleType)===kt.View3D})).map((e=>({name:e.model.raw.applicationId,id:e.model.id,view:e.model.raw})))}setView(e,t=!0){this.speckleRenderer.setView(e,t)}screenshot(){return new Promise((e=>{const t=this.sectionBox.display.visible;t&&this.sectionBox.displayOff();const r=this.speckleRenderer.renderer.domElement.toDataURL(\"image/png\");t&&this.sectionBox.displayOn(),e(r)}))}explode(e){const t=this.world.worldSize,r=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z);this.speckleRenderer.setExplode(e,r)}async downloadObject(e,t=null,r=!0){const n=new st(this,e,t,r);this.loaders[e]=n,await n.load()}async loadObject(e,t=null,r=!0,n=!0){1==++this.inProgressOperations&&this.emit(it.Busy,!0),await this.downloadObject(e,t,r);let i=performance.now();this.tree.getRenderTree(e).buildRenderTree(),We.log(\"SYNC Tree build time -> \",performance.now()-i),i=performance.now(),await this.speckleRenderer.addRenderTree(e),We.log(\"SYNC batch build time -> \",performance.now()-i),n&&this.zoom(),this.speckleRenderer.resetPipeline(!0),this.emit(it.LoadComplete,e),this.loaders[e].dispose(),delete this.loaders[e],0==--this.inProgressOperations&&this.emit(it.Busy,!1)}async loadObjectAsync(e,t=null,r=!0,n=1,i=!0){1==++this.inProgressOperations&&this.emit(it.Busy,!0),await this.downloadObject(e,t,r);let l=performance.now();const a=await this.tree.getRenderTree(e).buildRenderTreeAsync(n);We.log(\"ASYNC Tree build time -> \",performance.now()-l),a&&(l=performance.now(),await this.speckleRenderer.addRenderTreeAsync(e,n,i),We.log(\"ASYNC batch build time -> \",performance.now()-l),this.speckleRenderer.resetPipeline(!0),this.emit(it.LoadComplete,e)),this.loaders[e].dispose(),delete this.loaders[e],0==--this.inProgressOperations&&this.emit(it.Busy,!1)}async cancelLoad(e,t=!1){this.loaders[e].cancelLoad(),this.tree.getRenderTree(e).cancelBuild(e),this.speckleRenderer.cancelRenderTree(e),t?await this.unloadObject(e):0==--this.inProgressOperations&&this.emit(it.Busy,!1)}async unloadObject(e){try{1==++this.inProgressOperations&&this.emit(it.Busy,!0),delete this.loaders[e],this.speckleRenderer.removeRenderTree(e),this.tree.getRenderTree(e).purge(),this.tree.purge(e)}finally{0==--this.inProgressOperations&&(this.emit(it.Busy,!1),We.warn(`Removed subtree ${e}`),this.emit(it.UnloadComplete,e))}}async unloadAll(){try{1==++this.inProgressOperations&&this.emit(it.Busy,!0);for(const e of Object.keys(this.loaders))delete this.loaders[e];this.filteringManager.reset(),this.tree.root.children.forEach((e=>{this.speckleRenderer.removeRenderTree(e.model.id),this.tree.getRenderTree().purge()})),this.tree.purge()}finally{0==--this.inProgressOperations&&(this.emit(it.Busy,!1),We.warn(\"Removed all subtrees\"),this.emit(it.UnloadAllComplete))}}async diff(e,t,r,n){const i=[];this.dynamicallyLoadedDiffResources=[],this.tree.findId(e)||(i.push(this.loadObjectAsync(e,n,void 0,1)),this.dynamicallyLoadedDiffResources.push(e)),this.tree.findId(t)||(i.push(this.loadObjectAsync(t,n,void 0,1)),this.dynamicallyLoadedDiffResources.push(t)),await Promise.all(i);const l=await this.differ.diff(e,t),a=this.speckleRenderer.pipelineOptions;return a.depthSide=o,this.speckleRenderer.pipelineOptions=a,this.differ.resetMaterialGroups(),this.differ.buildMaterialGroups(r,l,this.speckleRenderer.getBatchMaterials()),this.differ.setDiffTime(0),this.filteringManager.setUserMaterials(this.differ.materialGroups),Promise.resolve(l)}async undiff(){const e=this.speckleRenderer.pipelineOptions;e.depthSide=R,this.speckleRenderer.pipelineOptions=e,this.differ.resetMaterialGroups(),this.filteringManager.removeUserMaterials();const t=[];if(0!==this.dynamicallyLoadedDiffResources.length)for(const e of this.dynamicallyLoadedDiffResources)t.push(this.unloadObject(e));this.dynamicallyLoadedDiffResources=[],await Promise.all(t)}setDiffTime(e,t){this.differ.setDiffTime(t),this.filteringManager.setUserMaterials(this.differ.materialGroups)}setVisualDiffMode(e,t){this.differ.resetMaterialGroups(),this.differ.buildMaterialGroups(t,e,this.speckleRenderer.getBatchMaterials()),this.filteringManager.setUserMaterials(this.differ.materialGroups)}enableMeasurements(e){this.speckleRenderer.measurements.enabled=e}setMeasurementOptions(e){this.speckleRenderer.measurements.options=e}removeMeasurement(){this.speckleRenderer.measurements.removeMeasurement()}dispose(){}}class ri extends ti{getRenderer(){return this.speckleRenderer}requestRenderShadowmap(){this.getRenderer().updateDirectLights()}}export{jr as BatchObject,ri as DebugViewer,lt as DefaultLightConfiguration,nt as DefaultViewerParams,Ln as MeasurementType,Ot as Units,ti as Viewer,it as ViewerEvent,$n as VisualDiffMode,Jr as World,Qn as WorldTree};\n","/**\n * @file This file defines the `useSpeckleStore` store, which is used to manage the state of the Speckle integration in the application.\n * It exports a Pinia store object that contains the state, actions, and getters for the Speckle integration.\n * The store is used to manage the user's authentication status, project details, versions, models, and versions of models.\n * The store also provides methods to interact with the Speckle API, such as logging in, logging out, exchanging access codes, and getting user data.\n * The store is defined using the `defineStore` function from the Pinia library.\n * @see https://pinia.esm.dev/api/define-store.html\n */\n\nimport type {\n\tModelsAndVersions,\n\tObjectParameter,\n\tProjectDetails,\n\tProjectId,\n\tServerInfo,\n\tUser,\n\tVersion,\n\tColorGroup,\n\tModelResponseObject\n} from '@/models/speckle'\nimport router from '@/router'\nimport { logMessageToSentry } from '@/utils/monitoring'\nimport { updateGroupColors } from '@/utils/projectUtils'\nimport { hslToHex } from '@/utils/colorUtils'\nimport {\n\texchangeAccessCode,\n\tgetObjectParameters,\n\tgetProjectVersions,\n\tgetProjectsData,\n\tgetUserData,\n\tnavigateToAuthPage,\n\tspeckleLogOut,\n\tgetLatestModel\n} from '@/utils/speckleUtils' // TODO Is this the right import in the wider structure?\nimport { Viewer } from '@speckle/viewer'\nimport { defineStore } from 'pinia'\nimport type { NestedGroup } from '@/models/filters'\nimport type { GeometryObject } from '@/models/geometryObject'\n\n/**\n * The `useSpeckleStore` is a store that manages the state and actions related to the Speckle integration.\n * It provides access to project details, versions, models, user information, and server information.\n * The store also includes actions for logging in, logging out, updating user data, updating projects,\n * updating project versions, getting objects for a project, and managing custom parameters.\n */\nexport const useSpeckleStore = defineStore({\n\tid: 'speckleStore',\n\tstate: () => {\n\t\treturn {\n\t\t\t/**\n\t\t\t * The project details for the currently selected project.\n\t\t\t * @type {ProjectDetails | null}\n\t\t\t */\n\t\t\tprojectDetails: null as ProjectDetails | null,\n\n\t\t\t/**\n\t\t\t * The currently selected version of the project.\n\t\t\t * @type {Version | null}\n\t\t\t */\n\t\t\tselectedVersion: null as Version | null,\n\n\t\t\t/**\n\t\t\t * The currently loaded project in the speckle store\n\t\t\t */\n\t\t\tselectedProject: null as ProjectId | null,\n\n\t\t\t/**\n\t\t\t * An array of all the projects available to the application on the server\n\t\t\t */\n\t\t\tallProjects: null as ProjectId[] | null,\n\n\t\t\t/**\n\t\t\t * An array of all the versions of the project.\n\t\t\t * @type {Version[] | null}\n\t\t\t */\n\t\t\tallVersions: null as Version[] | null,\n\n\t\t\t/**\n\t\t\t * An array of all the models in the project.\n\t\t\t * @type {string[] | null}\n\t\t\t */\n\t\t\tallModels: null as string[] | null,\n\n\t\t\t/**\n\t\t\t * An object that maps each model to an array of its versions.\n\t\t\t * @type {ModelsAndVersions | null}\n\t\t\t */\n\t\t\tmodelsAndVersions: null as ModelsAndVersions | null,\n\n\t\t\t/**\n\t\t\t * The user object for the currently authenticated user.\n\t\t\t * @type {User | null}\n\t\t\t */\n\t\t\tuser: null as User | null,\n\n\t\t\t/**\n\t\t\t * The server info object for the Speckle server.\n\t\t\t * @type {ServerInfo | null}\n\t\t\t */\n\t\t\tserverInfo: null as ServerInfo | null,\n\n\t\t\t/**\n\t\t\t * Array of specific parameters that are included in the project that the application\n\t\t\t * will get information for the objects from\n\t\t\t * @type {ObjectParameter[] | null}\n\t\t\t */\n\t\t\tcustomParameters: null as ObjectParameter[] | null,\n\n\t\t\t/**\n\t\t\t * The viewer instance for the Speckle viewer.\n\t\t\t * @type {Viewer | null}\n\t\t\t */\n\t\t\tviewer: null as Viewer | null,\n\n\t\t\t/**\n\t\t\t * The currently selected objects from the viewer.\n\t\t\t * @type {SpeckleObject[] | null}\n\t\t\t */\n\t\t\tselectedObjectIds: [] as string[],\n\n\t\t\t/**\n\t\t\t * Current Color groupings for the viewer\n\t\t\t */\n\t\t\tcolorGroups: [] as ColorGroup[],\n\n\t\t\t/**\n\t\t\t * Token for the current user\n\t\t\t */\n\t\t\ttoken: null as string | null,\n\n\t\t\t/**\n\t\t\t * Server URL for the current user\n\t\t\t */\n\t\t\tserverUrl: null as string | null,\n\n\t\t\t/**\n\t\t\t * Hidden objects in the viewer\n\t\t\t */\n\t\t\thiddenObjects: [] as GeometryObject[],\n\n\t\t\t/**\n\t\t\t * Render mode for the app, true for 3D with materials, false for diagram style \n\t\t\t */\n\t\t\trenderMode: true as boolean,\n\n\t\t\t/**\n\t\t\t * Show hidden objects or not, set to hide them as default\n\t\t\t */\n\t\t\tshowHiddenObjects: false as boolean\n\t\t}\n\t},\n\tactions: {\n\t\t/**\n\t\t * The `login` action logs the user into the Speckle integration and redirects them to the authorisation page.\n\t\t * @returns {Promise}\n\t\t */\n\t\tasync login(): Promise {\n\t\t\tnavigateToAuthPage()\n\t\t},\n\n\t\t/**\n\t\t * Logs out the user and clears the state and tokens.\n\t\t * @returns A promise that resolves when the logout process is complete.\n\t\t */\n\t\tasync logout(): Promise {\n\t\t\tthis.$patch((state) => {\n\t\t\t\tstate.user = null\n\t\t\t\tstate.serverInfo = null\n\t\t\t\tstate.projectDetails = null\n\t\t\t\tstate.selectedVersion = null\n\t\t\t})\n\t\t\t// Wipe the tokens\n\t\t\tspeckleLogOut()\n\t\t\trouter.push('/login')\n\t\t},\n\n\t\t/**\n\t\t * Exchanges the provided access code for tokens and saves them to the store if necessary.\n\t\t * @param accessCode The access code to exchange.\n\t\t * @returns A promise that resolves when the access code is exchanged and tokens are saved.\n\t\t */\n\t\tasync exchangeAccessCodes(accessCode: string): Promise {\n\t\t\t// Here, you can save the tokens to the store if necessary.\n\t\t\treturn exchangeAccessCode(accessCode)\n\t\t},\n\n\t\t/**\n\t\t * Updates the user data by fetching it from the server.\n\t\t * @returns A Promise that resolves to void.\n\t\t */\n\t\tasync updateUser(): Promise {\n\t\t\ttry {\n\t\t\t\tconst json = await getUserData()\n\t\t\t\tconst data = json.data\n\n\t\t\t\tthis.$patch((state) => {\n\t\t\t\t\tstate.user = data.user\n\t\t\t\t\tstate.serverInfo = data.serverInfo\n\t\t\t\t})\n\t\t\t} catch (err: any) {\n\t\t\t\tlogMessageToSentry(err as string, 'info')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Updates the projects by fetching the latest data from the server.\n\t\t * Clears the existing projects list and populates it with the updated data.\n\t\t * @returns A promise that resolves when the projects are successfully updated.\n\t\t */\n\t\tasync updateProjects(): Promise {\n\t\t\ttry {\n\t\t\t\tconst json = await getProjectsData()\n\t\t\t\tconst data = json.data\n\t\t\n\t\t\t\tconst projects: ProjectId[] = []\n\t\t\n\t\t\t\tfor (const el of data.streams.items) {\n\t\t\t\t\tconst model: ModelResponseObject = await getLatestModel(el.id)\n\n\t\t\n\t\t\t\t\tconst proj: ProjectId = {\n\t\t\t\t\t\tname: el.name,\n\t\t\t\t\t\tid: el.id,\n\t\t\t\t\t\tupdatedAt: el.updatedAt,\n\t\t\t\t\t\tlatestModelId: model.data.project.models.items[0].id\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\tprojects.push(proj)\n\t\t\t\t}\n\t\t\n\t\t\t\t// Directly assign the array to your state, no $patch needed\n\t\t\t\tthis.allProjects = projects\n\t\t\t} catch (err: any) {\n\t\t\t\tlogMessageToSentry(err as string, 'info')\n\t\t\t}\n\t\t},\n\t\t\n\n\t\t/**\n\t\t * The `updateProjectVersions` action updates the project versions for the specified project.\n\t\t * @param {string} projectId - The ID of the project to get versions for.\n\t\t * @param {number} limit - The maximum number of versions to get.\n\t\t * @param {Date | null} cursor - The cursor to use for pagination.\n\t\t * @returns {Promise}\n\t\t */\n\t\tasync updateProjectVersions(\n\t\t\tprojectId: string,\n\t\t\tlimit: number,\n\t\t\tcursor: Date | null\n\t\t): Promise {\n\t\t\ttry {\n\t\t\t\tconst response = await getProjectVersions(projectId, limit, cursor)\n\t\t\t\tconst data = response.data\n\t\t\t\tconst projDet: ProjectDetails = data\n\n\t\t\t\tconst selectedProj: ProjectId = {\n\t\t\t\t\tname: projDet.stream.name,\n\t\t\t\t\tid: projDet.stream.id,\n\t\t\t\t\tupdatedAt: projDet.stream.updatedAt\n\t\t\t\t}\n\n\t\t\t\tlet allModels: string[]\n\t\t\t\tconst allVers: Version[] = []\n\t\t\t\tconst modelVers: ModelsAndVersions = {}\n\n\t\t\t\t// Get versions for this project, and store them in an array.\n\t\t\t\tif (\n\t\t\t\t\tprojDet.stream.commits?.items &&\n\t\t\t\t\tprojDet.stream.commits?.items.length > 0\n\t\t\t\t) {\n\t\t\t\t\tprojDet.stream.commits?.items?.forEach((version) => {\n\t\t\t\t\t\tallVers.push(version)\n\n\t\t\t\t\t\tconst { branchName } = version\n\t\t\t\t\t\tif (!modelVers[branchName]) {\n\t\t\t\t\t\t\tmodelVers[branchName] = []\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmodelVers[branchName].push(version)\n\t\t\t\t\t})\n\n\t\t\t\t\t// Get the list of all models if available, returning the branch name.\n\t\t\t\t\tallModels = projDet.stream.commits?.items?.map(function (version) {\n\t\t\t\t\t\treturn version?.branchName\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\t// Use this.$patch instead of commit to update state\n\t\t\t\tthis.$patch((state) => {\n\t\t\t\t\tstate.selectedProject = selectedProj\n\t\t\t\t\tstate.projectDetails = projDet\n\t\t\t\t\tstate.allVersions = allVers\n\t\t\t\t\tstate.allModels = allModels\n\t\t\t\t\tstate.modelsAndVersions = modelVers\n\t\t\t\t})\n\t\t\t} catch (err: any) {\n\t\t\t\tlogMessageToSentry(err as string, 'info')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Get all objects for the currently loaded project and the selected version\n\t\t * @param projectId projectId to get objects for\n\t\t * @returns\n\t\t */\n\t\tasync getObjects(): Promise {\n\t\t\ttry {\n\t\t\t\tif (this.selectedProject && this.selectedVersion) {\n\t\t\t\t\tconst objs = await getObjectParameters(\n\t\t\t\t\t\tthis.selectedProject.id,\n\t\t\t\t\t\tthis.selectedVersion.referencedObject,\n\t\t\t\t\t\tthis.selectedVersion.sourceApplication\n\t\t\t\t\t)\n\t\t\t\t\treturn objs\n\t\t\t\t} else {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t} catch (err: any) {\n\t\t\t\tlogMessageToSentry(err as string, 'info')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The `setProjectDetails` action sets the project details for the currently selected project.\n\t\t * @param {ProjectDetails} project - The project details to set.\n\t\t * @returns {void}\n\t\t */\n\t\tsetProjectDetails(project: ProjectDetails): void {\n\t\t\tthis.projectDetails = project\n\t\t},\n\n\t\t/**\n\t\t * The `setAllVersions` action sets the array of all versions of the project.\n\t\t * @param {Version[]} allVer - The array of all versions to set.\n\t\t * @returns {void}\n\t\t */\n\t\tsetAllVersions(allVer: Version[]): void {\n\t\t\tthis.allVersions = allVer\n\t\t},\n\n\t\t/**\n\t\t * The `setAllModels` action sets the array of all models in the project.\n\t\t * @param {string[]} allModels - The array of all models to set.\n\t\t * @returns {void}\n\t\t */\n\t\tsetAllModels(allModels: string[]): void {\n\t\t\tthis.allModels = allModels\n\t\t},\n\n\t\t/**\n\t\t * The `setModelsAndVersions` action sets the object that maps each model to an array of its versions.\n\t\t * @param {ModelsAndVersions} modelVer - The object to set.\n\t\t * @returns {void}\n\t\t */\n\t\tsetModelsAndVersions(modelVer: ModelsAndVersions): void {\n\t\t\tthis.modelsAndVersions = modelVer\n\t\t},\n\n\t\t/**\n\t\t * Sets the currently selected version in the store\n\t\t * @param version\n\t\t */\n\t\tsetSelectedVersion(version: Version) {\n\t\t\tthis.selectedVersion = version\n\t\t},\n\n\t\t/**\n\t\t * Sets the viewer instance.\n\t\t * @param viewerInstance The viewer instance to set.\n\t\t */\n\t\tsetViewerInstance(viewerInstance: Viewer) {\n\t\t\tthis.viewer = viewerInstance\n\t\t},\n\n\t\t/**\n\t\t * Sets the currently selected objects.\n\t\t * @param objects - An array of object IDs to be added to the selectedObjectIds array.\n\t\t */\n\t\tsetCurrentlySelectedObject(objects: string[]) {\n\t\t\tthis.selectedObjectIds.push(...objects)\n\t\t},\n\n\t\t/**\n\t\t * Calculates the group colors for the viewer based on nested groups tree\n\t\t * @param refTree \n\t\t */\n\t\tcalculateGroupColors(tree: NestedGroup[]) {\n\t\t\tupdateGroupColors(tree)\n\t\t\tconst groups = []\n\t\t\ttree.forEach(element => {\n\t\t\t\t// Extract the hsl values from the color string using regex\n\t\t\t\tconst hslRegex = /hsl\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%\\)/\n\t\t\t\tlet color\n\t\t\t\tif (!element.color) {\n\t\t\t\t\tcolor = hslToHex(151, 100, 50)\n\t\t\t\t} else {\n\t\t\t\t\tconst match = element.color.match(hslRegex)\n\t\t\t\t\tconst [, hue, saturation, lightness] = match.map(str => parseInt(str))\n\t\t\t\t\tcolor = hslToHex(hue, saturation, lightness)\n\t\t\t\t}\n\t\t\t\t// Create group object with hex color\n\t\t\t\tconst group = {\n\t\t\t\t\tobjectIds: element.objects.map(obj => obj.URI),\n\t\t\t\t\tcolor: color\n\t\t\t\t}\n\t\t\t\tgroups.push(group)\n\t\t\t})\n\t\t\tthis.setColorGroups(groups)\n\t\t},\n\n\t\t/**\n\t\t * Set colorGroups overriding the last, used for coherent colors in graphics and setting the colors in the viewer\n\t\t * @param colorGroups \n\t\t */\n\t\tsetColorGroups(colorGroups: ColorGroup[]) {\n\t\t\tthis.colorGroups = colorGroups\n\t\t\tif (!this.renderMode)\n\t\t\t\tthis.viewer?.setUserObjectColors(colorGroups)\n\t\t},\n\n\t\t/**\n\t\t * Set token for the current user\n\t\t * @param token \n\t\t */\n\t\tsetToken(token: string) {\n\t\t\tthis.token = token\n\t\t},\n\n\t\t/**\n\t\t * Set serverUrl for the current user\n\t\t * @param serverUrl \n\t\t */\n\t\tsetServerUrl(serverUrl: string) {\n\t\t\tthis.serverUrl = serverUrl\n\t\t},\n\n\t\t/**\n\t\t * Add new parameter to list of parameters to include in fetching of speckle objects\n\t\t * @param parameter\n\t\t */\n\t\taddCustomParameter(parameter: ObjectParameter) {\n\t\t\tif (!this.parameterNameCheck(parameter.name)) {\n\t\t\t\tif (this.customParameters) this.customParameters.push(parameter)\n\t\t\t\telse this.customParameters = [parameter]\n\t\t\t} else {\n\t\t\t\tconsole.warn('Duplicate name found. Object not added.')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Adds a geometry object to the hidden objects in the project.\n\t\t * @param object \n\t\t */\n\t\taddHiddenObject(object: GeometryObject) {\n\t\t\tthis.hiddenObjects.push(object)\n\t\t},\n\n\t\t/**\n\t\t * Sets the hidden objects in the project, this is checked when rendering the objects\n\t\t * @param objects \n\t\t */\n\t\tsetHiddenObjects(objects: GeometryObject[]) {\n\t\t\tthis.hiddenObjects = objects\n\t\t},\n\n\t\t/**\n\t\t * Checks a if a name already exists within objects in parameters\n\t\t * @param newName name to check\n\t\t * @returns true if its already in parameters, false if not\n\t\t */\n\t\tparameterNameCheck(newName: string): boolean {\n\t\t\tif (this.customParameters)\n\t\t\t\treturn this.customParameters.some((obj) => obj.name === newName)\n\t\t\telse return false\n\t\t},\n\n\t\t/**\n\t\t * Removes a customParameter on its name\n\t\t * @param name name to remove, will never be duplicate since we check\n\t\t */\n\t\tremoveCustomParameter(name: string) {\n\t\t\tif (this.customParameters)\n\t\t\t\tthis.customParameters = this.customParameters?.filter(\n\t\t\t\t\t(item) => item.name !== name\n\t\t\t\t)\n\t\t},\n\n\t\tisolateObjects(objectIds: string[]) {\n\t\t\tthis.viewer?.resetFilters()\n\t\t\tthis.viewer?.isolateObjects(objectIds, null, true, true)\n\t\t\t\n\t\t\tif (objectIds.length > 0 && !this.renderMode) {\n\t\t\t\t//Find all color groups relevant for ids\n\t\t\t\tconst colorMap = new Map();\n\n\t\t\t\t// Create a map from object ID to color\n\t\t\t\tthis.colorGroups.forEach(group => {\n\t\t\t\t\tgroup.objectIds.forEach(id => {\n\t\t\t\t\t\tcolorMap.set(id, group.color)\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t\t\tconst relevantColorGroups = objectIds.map(id => ({\n\t\t\t\t\tobjectIds: [id],\n\t\t\t\t\tcolor: colorMap.get(id)\n\t\t\t\t})).filter(group => group.color !== undefined)\n\t\t\t\t\n\t\t\t\tthis.viewer?.setUserObjectColors(relevantColorGroups)\n\t\t\t} else {\n\t\t\t\tif (!this.renderMode)\n\t\t\t\t\tthis.viewer?.setUserObjectColors(this.colorGroups)\n\t\t\t\t//if (!this.showHiddenObjects)\n\t\t\t\t\t//this.viewer?.hideObjects(this.hiddenObjects.map(obj => obj.id), null, false, false)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Hides all unusedObjects in the viewer\n\t\t * @param objectUrls \n\t\t */\n\t\thideUnusedObjects(objectIds: string[]) {\n\t\t\tif (!this.showHiddenObjects)\n\t\t\t\tthis.viewer?.hideObjects(objectIds, null, false, false)\n\t\t},\n\n\t\t/**\n\t\t * Reset filters and colors to base state\n\t\t */\n\t\tasync resetUnusedObjects() {\n\t\t\tthis.viewer?.resetFilters()\n\t\t\tif (!this.renderMode)\n\t\t\t\tthis.viewer?.setUserObjectColors(this.colorGroups)\n\t\t},\n\n\t\t/**\n\t\t * Toggle rendering mode on the app\n\t\t */\n\t\ttoggleRenderMode() {\n\t\t\tthis.renderMode = !this.renderMode\n\t\t\tthis.resetUnusedObjects()\n\t\t\t//This is just to refresh the viewer\n\t\t\tthis.viewer?.resize()\n\t\t},\n\n\t\t/**\n\t\t * Toggle showing hidden objects in the viewer\n\t\t */\n\t\ttoggleHiddenObjects() {\n\t\t\tthis.showHiddenObjects = !this.showHiddenObjects\n\t\t\tthis.resetUnusedObjects()\n\t\t\tif (!this.showHiddenObjects)\n\t\t\t\tthis.viewer?.hideObjects(this.hiddenObjects.map(obj => obj.id), null, false, false)\n\t\t\t//This is just to refresh the viewer\n\t\t\tthis.viewer?.resize()\n\t\t}\n\t},\n\n\tgetters: {\n\t\t/**\n\t\t * The `projectDetails` getter returns the project details for the currently selected project.\n\t\t * @returns {ProjectDetails | null}\n\t\t */\n\t\tgetProjectDetails: (state): ProjectDetails | null => state.projectDetails,\n\n\t\t/**\n\t\t * The `selectedVersion` getter returns the currently selected version of the project.\n\t\t * @returns {Version | null}\n\t\t */\n\t\tgetSelectedVersion: (state): Version | null => state.selectedVersion,\n\n\t\t/**\n\t\t * The `allVersions` getter returns an array of all the versions of the project.\n\t\t * @returns {Version[] | null}\n\t\t */\n\t\tgetAllVersions: (state): Version[] | null => state.allVersions,\n\n\t\t/**\n\t\t * The `allModels` getter returns an array of all the models in the project.\n\t\t * @returns {string[] | null}\n\t\t */\n\t\tgetAllModels: (state): string[] | null => state.allModels,\n\n\t\t/**\n\t\t * The `modelsAndVersions` getter returns an object that maps each model to an array of its versions.\n\t\t * @returns {ModelsAndVersions | null}\n\t\t */\n\t\tgetModelsAndVersions: (state): ModelsAndVersions | null =>\n\t\t\tstate.modelsAndVersions,\n\n\t\t/**\n\t\t * The `isAuthenticated` getter returns a boolean indicating whether the user is authenticated.\n\t\t * @returns {boolean}\n\t\t */\n\t\tisAuthenticated: (state): boolean => state.user !== null,\n\n\t\t/**\n\t\t * The `getUserInfo` getter returns the user object for the currently authenticated user.\n\t\t * @returns {User | null}\n\t\t */\n\t\tgetUserInfo: (state): User | null => state.user,\n\n\t\t/**\n\t\t * The `getProjectsInfo` getter returns all projects available to the applications\n\t\t * @returns {ProjectId[] | null}\n\t\t */\n\t\tgetProjectsInfo: (state): ProjectId[] | null => state.allProjects,\n\n\t\t/**\n\t\t * Returns a list of all customParameters for this stream\n\t\t * @returns {ObjectParameter[] | null}\n\t\t */\n\t\tgetCustomParameters: (state): ObjectParameter[] | null =>\n\t\t\tstate.customParameters,\n\n\t\t/**\n\t\t * The `getViewerInstance` getter returns the viewer instance.\n\t\t * @returns {Viewer | null}\n\t\t */\n\t\tgetViewerInstance: (state): Viewer => state.viewer as Viewer,\n\n\t\t/**\n\t\t * Returns the currently selected object ids\n\t\t * @returns {string[]}\n\t\t */\n\t\tgetCurrentSelectedObjectIDs: (state): string[] => state.selectedObjectIds,\n\n\t\t/**\n\t\t * Returns the currently selected color groups\n\t\t * @returns {ColorGroup[]}\n\t\t */\n\t\tgetColorGroups: (state): ColorGroup[] => state.colorGroups\n\t}\n})\n","/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Firebase constants. Some of these (@defines) can be overridden at compile-time.\r\n */\r\nconst CONSTANTS = {\r\n /**\r\n * @define {boolean} Whether this is the client Node.js SDK.\r\n */\r\n NODE_CLIENT: false,\r\n /**\r\n * @define {boolean} Whether this is the Admin Node.js SDK.\r\n */\r\n NODE_ADMIN: false,\r\n /**\r\n * Firebase SDK Version\r\n */\r\n SDK_VERSION: '${JSCORE_VERSION}'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Throws an error if the provided assertion is falsy\r\n */\r\nconst assert = function (assertion, message) {\r\n if (!assertion) {\r\n throw assertionError(message);\r\n }\r\n};\r\n/**\r\n * Returns an Error object suitable for throwing.\r\n */\r\nconst assertionError = function (message) {\r\n return new Error('Firebase Database (' +\r\n CONSTANTS.SDK_VERSION +\r\n ') INTERNAL ASSERT FAILED: ' +\r\n message);\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst stringToByteArray$1 = function (str) {\r\n // TODO(user): Use native implementations if/when available\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if ((c & 0xfc00) === 0xd800 &&\r\n i + 1 < str.length &&\r\n (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00) {\r\n // Surrogate Pair\r\n c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Turns an array of numbers into the string given by the concatenation of the\r\n * characters to which the numbers correspond.\r\n * @param bytes Array of numbers representing characters.\r\n * @return Stringification of the array.\r\n */\r\nconst byteArrayToString = function (bytes) {\r\n // TODO(user): Use native implementations if/when available\r\n const out = [];\r\n let pos = 0, c = 0;\r\n while (pos < bytes.length) {\r\n const c1 = bytes[pos++];\r\n if (c1 < 128) {\r\n out[c++] = String.fromCharCode(c1);\r\n }\r\n else if (c1 > 191 && c1 < 224) {\r\n const c2 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));\r\n }\r\n else if (c1 > 239 && c1 < 365) {\r\n // Surrogate Pair\r\n const c2 = bytes[pos++];\r\n const c3 = bytes[pos++];\r\n const c4 = bytes[pos++];\r\n const u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -\r\n 0x10000;\r\n out[c++] = String.fromCharCode(0xd800 + (u >> 10));\r\n out[c++] = String.fromCharCode(0xdc00 + (u & 1023));\r\n }\r\n else {\r\n const c2 = bytes[pos++];\r\n const c3 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\r\n }\r\n }\r\n return out.join('');\r\n};\r\n// We define it as an object literal instead of a class because a class compiled down to es5 can't\r\n// be treeshaked. https://github.com/rollup/rollup/issues/1691\r\n// Static lookup maps, lazily populated by init_()\r\nconst base64 = {\r\n /**\r\n * Maps bytes to characters.\r\n */\r\n byteToCharMap_: null,\r\n /**\r\n * Maps characters to bytes.\r\n */\r\n charToByteMap_: null,\r\n /**\r\n * Maps bytes to websafe characters.\r\n * @private\r\n */\r\n byteToCharMapWebSafe_: null,\r\n /**\r\n * Maps websafe characters to bytes.\r\n * @private\r\n */\r\n charToByteMapWebSafe_: null,\r\n /**\r\n * Our default alphabet, shared between\r\n * ENCODED_VALS and ENCODED_VALS_WEBSAFE\r\n */\r\n ENCODED_VALS_BASE: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789',\r\n /**\r\n * Our default alphabet. Value 64 (=) is special; it means \"nothing.\"\r\n */\r\n get ENCODED_VALS() {\r\n return this.ENCODED_VALS_BASE + '+/=';\r\n },\r\n /**\r\n * Our websafe alphabet.\r\n */\r\n get ENCODED_VALS_WEBSAFE() {\r\n return this.ENCODED_VALS_BASE + '-_.';\r\n },\r\n /**\r\n * Whether this browser supports the atob and btoa functions. This extension\r\n * started at Mozilla but is now implemented by many browsers. We use the\r\n * ASSUME_* variables to avoid pulling in the full useragent detection library\r\n * but still allowing the standard per-browser compilations.\r\n *\r\n */\r\n HAS_NATIVE_SUPPORT: typeof atob === 'function',\r\n /**\r\n * Base64-encode an array of bytes.\r\n *\r\n * @param input An array of bytes (numbers with\r\n * value in [0, 255]) to encode.\r\n * @param webSafe Boolean indicating we should use the\r\n * alternative alphabet.\r\n * @return The base64 encoded string.\r\n */\r\n encodeByteArray(input, webSafe) {\r\n if (!Array.isArray(input)) {\r\n throw Error('encodeByteArray takes an array as a parameter');\r\n }\r\n this.init_();\r\n const byteToCharMap = webSafe\r\n ? this.byteToCharMapWebSafe_\r\n : this.byteToCharMap_;\r\n const output = [];\r\n for (let i = 0; i < input.length; i += 3) {\r\n const byte1 = input[i];\r\n const haveByte2 = i + 1 < input.length;\r\n const byte2 = haveByte2 ? input[i + 1] : 0;\r\n const haveByte3 = i + 2 < input.length;\r\n const byte3 = haveByte3 ? input[i + 2] : 0;\r\n const outByte1 = byte1 >> 2;\r\n const outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);\r\n let outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6);\r\n let outByte4 = byte3 & 0x3f;\r\n if (!haveByte3) {\r\n outByte4 = 64;\r\n if (!haveByte2) {\r\n outByte3 = 64;\r\n }\r\n }\r\n output.push(byteToCharMap[outByte1], byteToCharMap[outByte2], byteToCharMap[outByte3], byteToCharMap[outByte4]);\r\n }\r\n return output.join('');\r\n },\r\n /**\r\n * Base64-encode a string.\r\n *\r\n * @param input A string to encode.\r\n * @param webSafe If true, we should use the\r\n * alternative alphabet.\r\n * @return The base64 encoded string.\r\n */\r\n encodeString(input, webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\r\n return btoa(input);\r\n }\r\n return this.encodeByteArray(stringToByteArray$1(input), webSafe);\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * @param input to decode.\r\n * @param webSafe True if we should use the\r\n * alternative alphabet.\r\n * @return string representing the decoded value.\r\n */\r\n decodeString(input, webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\r\n return atob(input);\r\n }\r\n return byteArrayToString(this.decodeStringToByteArray(input, webSafe));\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * In base-64 decoding, groups of four characters are converted into three\r\n * bytes. If the encoder did not apply padding, the input length may not\r\n * be a multiple of 4.\r\n *\r\n * In this case, the last group will have fewer than 4 characters, and\r\n * padding will be inferred. If the group has one or two characters, it decodes\r\n * to one byte. If the group has three characters, it decodes to two bytes.\r\n *\r\n * @param input Input to decode.\r\n * @param webSafe True if we should use the web-safe alphabet.\r\n * @return bytes representing the decoded value.\r\n */\r\n decodeStringToByteArray(input, webSafe) {\r\n this.init_();\r\n const charToByteMap = webSafe\r\n ? this.charToByteMapWebSafe_\r\n : this.charToByteMap_;\r\n const output = [];\r\n for (let i = 0; i < input.length;) {\r\n const byte1 = charToByteMap[input.charAt(i++)];\r\n const haveByte2 = i < input.length;\r\n const byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0;\r\n ++i;\r\n const haveByte3 = i < input.length;\r\n const byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n const haveByte4 = i < input.length;\r\n const byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {\r\n throw new DecodeBase64StringError();\r\n }\r\n const outByte1 = (byte1 << 2) | (byte2 >> 4);\r\n output.push(outByte1);\r\n if (byte3 !== 64) {\r\n const outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2);\r\n output.push(outByte2);\r\n if (byte4 !== 64) {\r\n const outByte3 = ((byte3 << 6) & 0xc0) | byte4;\r\n output.push(outByte3);\r\n }\r\n }\r\n }\r\n return output;\r\n },\r\n /**\r\n * Lazy static initialization function. Called before\r\n * accessing any of the static map variables.\r\n * @private\r\n */\r\n init_() {\r\n if (!this.byteToCharMap_) {\r\n this.byteToCharMap_ = {};\r\n this.charToByteMap_ = {};\r\n this.byteToCharMapWebSafe_ = {};\r\n this.charToByteMapWebSafe_ = {};\r\n // We want quick mappings back and forth, so we precompute two maps.\r\n for (let i = 0; i < this.ENCODED_VALS.length; i++) {\r\n this.byteToCharMap_[i] = this.ENCODED_VALS.charAt(i);\r\n this.charToByteMap_[this.byteToCharMap_[i]] = i;\r\n this.byteToCharMapWebSafe_[i] = this.ENCODED_VALS_WEBSAFE.charAt(i);\r\n this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i]] = i;\r\n // Be forgiving when decoding and correctly decode both encodings.\r\n if (i >= this.ENCODED_VALS_BASE.length) {\r\n this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i)] = i;\r\n this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i)] = i;\r\n }\r\n }\r\n }\r\n }\r\n};\r\n/**\r\n * An error encountered while decoding base64 string.\r\n */\r\nclass DecodeBase64StringError extends Error {\r\n constructor() {\r\n super(...arguments);\r\n this.name = 'DecodeBase64StringError';\r\n }\r\n}\r\n/**\r\n * URL-safe base64 encoding\r\n */\r\nconst base64Encode = function (str) {\r\n const utf8Bytes = stringToByteArray$1(str);\r\n return base64.encodeByteArray(utf8Bytes, true);\r\n};\r\n/**\r\n * URL-safe base64 encoding (without \".\" padding in the end).\r\n * e.g. Used in JSON Web Token (JWT) parts.\r\n */\r\nconst base64urlEncodeWithoutPadding = function (str) {\r\n // Use base64url encoding and remove padding in the end (dot characters).\r\n return base64Encode(str).replace(/\\./g, '');\r\n};\r\n/**\r\n * URL-safe base64 decoding\r\n *\r\n * NOTE: DO NOT use the global atob() function - it does NOT support the\r\n * base64Url variant encoding.\r\n *\r\n * @param str To be decoded\r\n * @return Decoded result, if possible\r\n */\r\nconst base64Decode = function (str) {\r\n try {\r\n return base64.decodeString(str, true);\r\n }\r\n catch (e) {\r\n console.error('base64Decode failed: ', e);\r\n }\r\n return null;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Do a deep-copy of basic JavaScript Objects or Arrays.\r\n */\r\nfunction deepCopy(value) {\r\n return deepExtend(undefined, value);\r\n}\r\n/**\r\n * Copy properties from source to target (recursively allows extension\r\n * of Objects and Arrays). Scalar values in the target are over-written.\r\n * If target is undefined, an object of the appropriate type will be created\r\n * (and returned).\r\n *\r\n * We recursively copy all child properties of plain Objects in the source- so\r\n * that namespace- like dictionaries are merged.\r\n *\r\n * Note that the target can be a function, in which case the properties in\r\n * the source Object are copied onto it as static properties of the Function.\r\n *\r\n * Note: we don't merge __proto__ to prevent prototype pollution\r\n */\r\nfunction deepExtend(target, source) {\r\n if (!(source instanceof Object)) {\r\n return source;\r\n }\r\n switch (source.constructor) {\r\n case Date:\r\n // Treat Dates like scalars; if the target date object had any child\r\n // properties - they will be lost!\r\n const dateValue = source;\r\n return new Date(dateValue.getTime());\r\n case Object:\r\n if (target === undefined) {\r\n target = {};\r\n }\r\n break;\r\n case Array:\r\n // Always copy the array source and overwrite the target.\r\n target = [];\r\n break;\r\n default:\r\n // Not a plain Object - treat it as a scalar.\r\n return source;\r\n }\r\n for (const prop in source) {\r\n // use isValidKey to guard against prototype pollution. See https://snyk.io/vuln/SNYK-JS-LODASH-450202\r\n if (!source.hasOwnProperty(prop) || !isValidKey(prop)) {\r\n continue;\r\n }\r\n target[prop] = deepExtend(target[prop], source[prop]);\r\n }\r\n return target;\r\n}\r\nfunction isValidKey(key) {\r\n return key !== '__proto__';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Polyfill for `globalThis` object.\r\n * @returns the `globalThis` object for the given environment.\r\n * @public\r\n */\r\nfunction getGlobal() {\r\n if (typeof self !== 'undefined') {\r\n return self;\r\n }\r\n if (typeof window !== 'undefined') {\r\n return window;\r\n }\r\n if (typeof global !== 'undefined') {\r\n return global;\r\n }\r\n throw new Error('Unable to locate global object.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst getDefaultsFromGlobal = () => getGlobal().__FIREBASE_DEFAULTS__;\r\n/**\r\n * Attempt to read defaults from a JSON string provided to\r\n * process(.)env(.)__FIREBASE_DEFAULTS__ or a JSON file whose path is in\r\n * process(.)env(.)__FIREBASE_DEFAULTS_PATH__\r\n * The dots are in parens because certain compilers (Vite?) cannot\r\n * handle seeing that variable in comments.\r\n * See https://github.com/firebase/firebase-js-sdk/issues/6838\r\n */\r\nconst getDefaultsFromEnvVariable = () => {\r\n if (typeof process === 'undefined' || typeof process.env === 'undefined') {\r\n return;\r\n }\r\n const defaultsJsonString = process.env.__FIREBASE_DEFAULTS__;\r\n if (defaultsJsonString) {\r\n return JSON.parse(defaultsJsonString);\r\n }\r\n};\r\nconst getDefaultsFromCookie = () => {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n let match;\r\n try {\r\n match = document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/);\r\n }\r\n catch (e) {\r\n // Some environments such as Angular Universal SSR have a\r\n // `document` object but error on accessing `document.cookie`.\r\n return;\r\n }\r\n const decoded = match && base64Decode(match[1]);\r\n return decoded && JSON.parse(decoded);\r\n};\r\n/**\r\n * Get the __FIREBASE_DEFAULTS__ object. It checks in order:\r\n * (1) if such an object exists as a property of `globalThis`\r\n * (2) if such an object was provided on a shell environment variable\r\n * (3) if such an object exists in a cookie\r\n * @public\r\n */\r\nconst getDefaults = () => {\r\n try {\r\n return (getDefaultsFromGlobal() ||\r\n getDefaultsFromEnvVariable() ||\r\n getDefaultsFromCookie());\r\n }\r\n catch (e) {\r\n /**\r\n * Catch-all for being unable to get __FIREBASE_DEFAULTS__ due\r\n * to any environment case we have not accounted for. Log to\r\n * info instead of swallowing so we can find these unknown cases\r\n * and add paths for them if needed.\r\n */\r\n console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e}`);\r\n return;\r\n }\r\n};\r\n/**\r\n * Returns emulator host stored in the __FIREBASE_DEFAULTS__ object\r\n * for the given product.\r\n * @returns a URL host formatted like `127.0.0.1:9999` or `[::1]:4000` if available\r\n * @public\r\n */\r\nconst getDefaultEmulatorHost = (productName) => { var _a, _b; return (_b = (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.emulatorHosts) === null || _b === void 0 ? void 0 : _b[productName]; };\r\n/**\r\n * Returns emulator hostname and port stored in the __FIREBASE_DEFAULTS__ object\r\n * for the given product.\r\n * @returns a pair of hostname and port like `[\"::1\", 4000]` if available\r\n * @public\r\n */\r\nconst getDefaultEmulatorHostnameAndPort = (productName) => {\r\n const host = getDefaultEmulatorHost(productName);\r\n if (!host) {\r\n return undefined;\r\n }\r\n const separatorIndex = host.lastIndexOf(':'); // Finding the last since IPv6 addr also has colons.\r\n if (separatorIndex <= 0 || separatorIndex + 1 === host.length) {\r\n throw new Error(`Invalid host ${host} with no separate hostname and port!`);\r\n }\r\n // eslint-disable-next-line no-restricted-globals\r\n const port = parseInt(host.substring(separatorIndex + 1), 10);\r\n if (host[0] === '[') {\r\n // Bracket-quoted `[ipv6addr]:port` => return \"ipv6addr\" (without brackets).\r\n return [host.substring(1, separatorIndex - 1), port];\r\n }\r\n else {\r\n return [host.substring(0, separatorIndex), port];\r\n }\r\n};\r\n/**\r\n * Returns Firebase app config stored in the __FIREBASE_DEFAULTS__ object.\r\n * @public\r\n */\r\nconst getDefaultAppConfig = () => { var _a; return (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.config; };\r\n/**\r\n * Returns an experimental setting on the __FIREBASE_DEFAULTS__ object (properties\r\n * prefixed by \"_\")\r\n * @public\r\n */\r\nconst getExperimentalSetting = (name) => { var _a; return (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a[`_${name}`]; };\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass Deferred {\r\n constructor() {\r\n this.reject = () => { };\r\n this.resolve = () => { };\r\n this.promise = new Promise((resolve, reject) => {\r\n this.resolve = resolve;\r\n this.reject = reject;\r\n });\r\n }\r\n /**\r\n * Our API internals are not promisified and cannot because our callback APIs have subtle expectations around\r\n * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback\r\n * and returns a node-style callback which will resolve or reject the Deferred's promise.\r\n */\r\n wrapCallback(callback) {\r\n return (error, value) => {\r\n if (error) {\r\n this.reject(error);\r\n }\r\n else {\r\n this.resolve(value);\r\n }\r\n if (typeof callback === 'function') {\r\n // Attaching noop handler just in case developer wasn't expecting\r\n // promises\r\n this.promise.catch(() => { });\r\n // Some of our callbacks don't expect a value and our own tests\r\n // assert that the parameter length is 1\r\n if (callback.length === 1) {\r\n callback(error);\r\n }\r\n else {\r\n callback(error, value);\r\n }\r\n }\r\n };\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction createMockUserToken(token, projectId) {\r\n if (token.uid) {\r\n throw new Error('The \"uid\" field is no longer supported by mockUserToken. Please use \"sub\" instead for Firebase Auth User ID.');\r\n }\r\n // Unsecured JWTs use \"none\" as the algorithm.\r\n const header = {\r\n alg: 'none',\r\n type: 'JWT'\r\n };\r\n const project = projectId || 'demo-project';\r\n const iat = token.iat || 0;\r\n const sub = token.sub || token.user_id;\r\n if (!sub) {\r\n throw new Error(\"mockUserToken must contain 'sub' or 'user_id' field!\");\r\n }\r\n const payload = Object.assign({ \r\n // Set all required fields to decent defaults\r\n iss: `https://securetoken.google.com/${project}`, aud: project, iat, exp: iat + 3600, auth_time: iat, sub, user_id: sub, firebase: {\r\n sign_in_provider: 'custom',\r\n identities: {}\r\n } }, token);\r\n // Unsecured JWTs use the empty string as a signature.\r\n const signature = '';\r\n return [\r\n base64urlEncodeWithoutPadding(JSON.stringify(header)),\r\n base64urlEncodeWithoutPadding(JSON.stringify(payload)),\r\n signature\r\n ].join('.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns navigator.userAgent string or '' if it's not defined.\r\n * @return user agent string\r\n */\r\nfunction getUA() {\r\n if (typeof navigator !== 'undefined' &&\r\n typeof navigator['userAgent'] === 'string') {\r\n return navigator['userAgent'];\r\n }\r\n else {\r\n return '';\r\n }\r\n}\r\n/**\r\n * Detect Cordova / PhoneGap / Ionic frameworks on a mobile device.\r\n *\r\n * Deliberately does not rely on checking `file://` URLs (as this fails PhoneGap\r\n * in the Ripple emulator) nor Cordova `onDeviceReady`, which would normally\r\n * wait for a callback.\r\n */\r\nfunction isMobileCordova() {\r\n return (typeof window !== 'undefined' &&\r\n // @ts-ignore Setting up an broadly applicable index signature for Window\r\n // just to deal with this case would probably be a bad idea.\r\n !!(window['cordova'] || window['phonegap'] || window['PhoneGap']) &&\r\n /ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(getUA()));\r\n}\r\n/**\r\n * Detect Node.js.\r\n *\r\n * @return true if Node.js environment is detected or specified.\r\n */\r\n// Node detection logic from: https://github.com/iliakan/detect-node/\r\nfunction isNode() {\r\n var _a;\r\n const forceEnvironment = (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.forceEnvironment;\r\n if (forceEnvironment === 'node') {\r\n return true;\r\n }\r\n else if (forceEnvironment === 'browser') {\r\n return false;\r\n }\r\n try {\r\n return (Object.prototype.toString.call(global.process) === '[object process]');\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n}\r\n/**\r\n * Detect Browser Environment.\r\n * Note: This will return true for certain test frameworks that are incompletely\r\n * mimicking a browser, and should not lead to assuming all browser APIs are\r\n * available.\r\n */\r\nfunction isBrowser() {\r\n return typeof window !== 'undefined' || isWebWorker();\r\n}\r\n/**\r\n * Detect Web Worker context.\r\n */\r\nfunction isWebWorker() {\r\n return (typeof WorkerGlobalScope !== 'undefined' &&\r\n typeof self !== 'undefined' &&\r\n self instanceof WorkerGlobalScope);\r\n}\r\n/**\r\n * Detect Cloudflare Worker context.\r\n */\r\nfunction isCloudflareWorker() {\r\n return (typeof navigator !== 'undefined' &&\r\n navigator.userAgent === 'Cloudflare-Workers');\r\n}\r\nfunction isBrowserExtension() {\r\n const runtime = typeof chrome === 'object'\r\n ? chrome.runtime\r\n : typeof browser === 'object'\r\n ? browser.runtime\r\n : undefined;\r\n return typeof runtime === 'object' && runtime.id !== undefined;\r\n}\r\n/**\r\n * Detect React Native.\r\n *\r\n * @return true if ReactNative environment is detected.\r\n */\r\nfunction isReactNative() {\r\n return (typeof navigator === 'object' && navigator['product'] === 'ReactNative');\r\n}\r\n/** Detects Electron apps. */\r\nfunction isElectron() {\r\n return getUA().indexOf('Electron/') >= 0;\r\n}\r\n/** Detects Internet Explorer. */\r\nfunction isIE() {\r\n const ua = getUA();\r\n return ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;\r\n}\r\n/** Detects Universal Windows Platform apps. */\r\nfunction isUWP() {\r\n return getUA().indexOf('MSAppHost/') >= 0;\r\n}\r\n/**\r\n * Detect whether the current SDK build is the Node version.\r\n *\r\n * @return true if it's the Node SDK build.\r\n */\r\nfunction isNodeSdk() {\r\n return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true;\r\n}\r\n/** Returns true if we are running in Safari. */\r\nfunction isSafari() {\r\n return (!isNode() &&\r\n !!navigator.userAgent &&\r\n navigator.userAgent.includes('Safari') &&\r\n !navigator.userAgent.includes('Chrome'));\r\n}\r\n/**\r\n * This method checks if indexedDB is supported by current browser/service worker context\r\n * @return true if indexedDB is supported by current browser/service worker context\r\n */\r\nfunction isIndexedDBAvailable() {\r\n try {\r\n return typeof indexedDB === 'object';\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n}\r\n/**\r\n * This method validates browser/sw context for indexedDB by opening a dummy indexedDB database and reject\r\n * if errors occur during the database open operation.\r\n *\r\n * @throws exception if current browser/sw context can't run idb.open (ex: Safari iframe, Firefox\r\n * private browsing)\r\n */\r\nfunction validateIndexedDBOpenable() {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n let preExist = true;\r\n const DB_CHECK_NAME = 'validate-browser-context-for-indexeddb-analytics-module';\r\n const request = self.indexedDB.open(DB_CHECK_NAME);\r\n request.onsuccess = () => {\r\n request.result.close();\r\n // delete database only when it doesn't pre-exist\r\n if (!preExist) {\r\n self.indexedDB.deleteDatabase(DB_CHECK_NAME);\r\n }\r\n resolve(true);\r\n };\r\n request.onupgradeneeded = () => {\r\n preExist = false;\r\n };\r\n request.onerror = () => {\r\n var _a;\r\n reject(((_a = request.error) === null || _a === void 0 ? void 0 : _a.message) || '');\r\n };\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n/**\r\n *\r\n * This method checks whether cookie is enabled within current browser\r\n * @return true if cookie is enabled within current browser\r\n */\r\nfunction areCookiesEnabled() {\r\n if (typeof navigator === 'undefined' || !navigator.cookieEnabled) {\r\n return false;\r\n }\r\n return true;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Standardized Firebase Error.\r\n *\r\n * Usage:\r\n *\r\n * // TypeScript string literals for type-safe codes\r\n * type Err =\r\n * 'unknown' |\r\n * 'object-not-found'\r\n * ;\r\n *\r\n * // Closure enum for type-safe error codes\r\n * // at-enum {string}\r\n * var Err = {\r\n * UNKNOWN: 'unknown',\r\n * OBJECT_NOT_FOUND: 'object-not-found',\r\n * }\r\n *\r\n * let errors: Map = {\r\n * 'generic-error': \"Unknown error\",\r\n * 'file-not-found': \"Could not find file: {$file}\",\r\n * };\r\n *\r\n * // Type-safe function - must pass a valid error code as param.\r\n * let error = new ErrorFactory('service', 'Service', errors);\r\n *\r\n * ...\r\n * throw error.create(Err.GENERIC);\r\n * ...\r\n * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\r\n * ...\r\n * // Service: Could not file file: foo.txt (service/file-not-found).\r\n *\r\n * catch (e) {\r\n * assert(e.message === \"Could not find file: foo.txt.\");\r\n * if ((e as FirebaseError)?.code === 'service/file-not-found') {\r\n * console.log(\"Could not read file: \" + e['file']);\r\n * }\r\n * }\r\n */\r\nconst ERROR_NAME = 'FirebaseError';\r\n// Based on code from:\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\r\nclass FirebaseError extends Error {\r\n constructor(\r\n /** The error code for this error. */\r\n code, message, \r\n /** Custom data for this error. */\r\n customData) {\r\n super(message);\r\n this.code = code;\r\n this.customData = customData;\r\n /** The custom name for all FirebaseErrors. */\r\n this.name = ERROR_NAME;\r\n // Fix For ES5\r\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n Object.setPrototypeOf(this, FirebaseError.prototype);\r\n // Maintains proper stack trace for where our error was thrown.\r\n // Only available on V8.\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, ErrorFactory.prototype.create);\r\n }\r\n }\r\n}\r\nclass ErrorFactory {\r\n constructor(service, serviceName, errors) {\r\n this.service = service;\r\n this.serviceName = serviceName;\r\n this.errors = errors;\r\n }\r\n create(code, ...data) {\r\n const customData = data[0] || {};\r\n const fullCode = `${this.service}/${code}`;\r\n const template = this.errors[code];\r\n const message = template ? replaceTemplate(template, customData) : 'Error';\r\n // Service Name: Error message (service/code).\r\n const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\r\n const error = new FirebaseError(fullCode, fullMessage, customData);\r\n return error;\r\n }\r\n}\r\nfunction replaceTemplate(template, data) {\r\n return template.replace(PATTERN, (_, key) => {\r\n const value = data[key];\r\n return value != null ? String(value) : `<${key}?>`;\r\n });\r\n}\r\nconst PATTERN = /\\{\\$([^}]+)}/g;\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Evaluates a JSON string into a javascript object.\r\n *\r\n * @param {string} str A string containing JSON.\r\n * @return {*} The javascript object representing the specified JSON.\r\n */\r\nfunction jsonEval(str) {\r\n return JSON.parse(str);\r\n}\r\n/**\r\n * Returns JSON representing a javascript object.\r\n * @param {*} data JavaScript object to be stringified.\r\n * @return {string} The JSON contents of the object.\r\n */\r\nfunction stringify(data) {\r\n return JSON.stringify(data);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Decodes a Firebase auth. token into constituent parts.\r\n *\r\n * Notes:\r\n * - May return with invalid / incomplete claims if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst decode = function (token) {\r\n let header = {}, claims = {}, data = {}, signature = '';\r\n try {\r\n const parts = token.split('.');\r\n header = jsonEval(base64Decode(parts[0]) || '');\r\n claims = jsonEval(base64Decode(parts[1]) || '');\r\n signature = parts[2];\r\n data = claims['d'] || {};\r\n delete claims['d'];\r\n }\r\n catch (e) { }\r\n return {\r\n header,\r\n claims,\r\n data,\r\n signature\r\n };\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the\r\n * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidTimestamp = function (token) {\r\n const claims = decode(token).claims;\r\n const now = Math.floor(new Date().getTime() / 1000);\r\n let validSince = 0, validUntil = 0;\r\n if (typeof claims === 'object') {\r\n if (claims.hasOwnProperty('nbf')) {\r\n validSince = claims['nbf'];\r\n }\r\n else if (claims.hasOwnProperty('iat')) {\r\n validSince = claims['iat'];\r\n }\r\n if (claims.hasOwnProperty('exp')) {\r\n validUntil = claims['exp'];\r\n }\r\n else {\r\n // token will expire after 24h by default\r\n validUntil = validSince + 86400;\r\n }\r\n }\r\n return (!!now &&\r\n !!validSince &&\r\n !!validUntil &&\r\n now >= validSince &&\r\n now <= validUntil);\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise.\r\n *\r\n * Notes:\r\n * - May return null if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst issuedAtTime = function (token) {\r\n const claims = decode(token).claims;\r\n if (typeof claims === 'object' && claims.hasOwnProperty('iat')) {\r\n return claims['iat'];\r\n }\r\n return null;\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidFormat = function (token) {\r\n const decoded = decode(token), claims = decoded.claims;\r\n return !!claims && typeof claims === 'object' && claims.hasOwnProperty('iat');\r\n};\r\n/**\r\n * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isAdmin = function (token) {\r\n const claims = decode(token).claims;\r\n return typeof claims === 'object' && claims['admin'] === true;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction contains(obj, key) {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n}\r\nfunction safeGet(obj, key) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return obj[key];\r\n }\r\n else {\r\n return undefined;\r\n }\r\n}\r\nfunction isEmpty(obj) {\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction map(obj, fn, contextObj) {\r\n const res = {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n res[key] = fn.call(contextObj, obj[key], key, obj);\r\n }\r\n }\r\n return res;\r\n}\r\n/**\r\n * Deep equal two objects. Support Arrays and Objects.\r\n */\r\nfunction deepEqual(a, b) {\r\n if (a === b) {\r\n return true;\r\n }\r\n const aKeys = Object.keys(a);\r\n const bKeys = Object.keys(b);\r\n for (const k of aKeys) {\r\n if (!bKeys.includes(k)) {\r\n return false;\r\n }\r\n const aProp = a[k];\r\n const bProp = b[k];\r\n if (isObject(aProp) && isObject(bProp)) {\r\n if (!deepEqual(aProp, bProp)) {\r\n return false;\r\n }\r\n }\r\n else if (aProp !== bProp) {\r\n return false;\r\n }\r\n }\r\n for (const k of bKeys) {\r\n if (!aKeys.includes(k)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isObject(thing) {\r\n return thing !== null && typeof thing === 'object';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Rejects if the given promise doesn't resolve in timeInMS milliseconds.\r\n * @internal\r\n */\r\nfunction promiseWithTimeout(promise, timeInMS = 2000) {\r\n const deferredPromise = new Deferred();\r\n setTimeout(() => deferredPromise.reject('timeout!'), timeInMS);\r\n promise.then(deferredPromise.resolve, deferredPromise.reject);\r\n return deferredPromise.promise;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a\r\n * params object (e.g. {arg: 'val', arg2: 'val2'})\r\n * Note: You must prepend it with ? when adding it to a URL.\r\n */\r\nfunction querystring(querystringParams) {\r\n const params = [];\r\n for (const [key, value] of Object.entries(querystringParams)) {\r\n if (Array.isArray(value)) {\r\n value.forEach(arrayVal => {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal));\r\n });\r\n }\r\n else {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\r\n }\r\n }\r\n return params.length ? '&' + params.join('&') : '';\r\n}\r\n/**\r\n * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object\r\n * (e.g. {arg: 'val', arg2: 'val2'})\r\n */\r\nfunction querystringDecode(querystring) {\r\n const obj = {};\r\n const tokens = querystring.replace(/^\\?/, '').split('&');\r\n tokens.forEach(token => {\r\n if (token) {\r\n const [key, value] = token.split('=');\r\n obj[decodeURIComponent(key)] = decodeURIComponent(value);\r\n }\r\n });\r\n return obj;\r\n}\r\n/**\r\n * Extract the query string part of a URL, including the leading question mark (if present).\r\n */\r\nfunction extractQuerystring(url) {\r\n const queryStart = url.indexOf('?');\r\n if (!queryStart) {\r\n return '';\r\n }\r\n const fragmentStart = url.indexOf('#', queryStart);\r\n return url.substring(queryStart, fragmentStart > 0 ? fragmentStart : undefined);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview SHA-1 cryptographic hash.\r\n * Variable names follow the notation in FIPS PUB 180-3:\r\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\r\n *\r\n * Usage:\r\n * var sha1 = new sha1();\r\n * sha1.update(bytes);\r\n * var hash = sha1.digest();\r\n *\r\n * Performance:\r\n * Chrome 23: ~400 Mbit/s\r\n * Firefox 16: ~250 Mbit/s\r\n *\r\n */\r\n/**\r\n * SHA-1 cryptographic hash constructor.\r\n *\r\n * The properties declared here are discussed in the above algorithm document.\r\n * @constructor\r\n * @final\r\n * @struct\r\n */\r\nclass Sha1 {\r\n constructor() {\r\n /**\r\n * Holds the previous values of accumulated variables a-e in the compress_\r\n * function.\r\n * @private\r\n */\r\n this.chain_ = [];\r\n /**\r\n * A buffer holding the partially computed hash result.\r\n * @private\r\n */\r\n this.buf_ = [];\r\n /**\r\n * An array of 80 bytes, each a part of the message to be hashed. Referred to\r\n * as the message schedule in the docs.\r\n * @private\r\n */\r\n this.W_ = [];\r\n /**\r\n * Contains data needed to pad messages less than 64 bytes.\r\n * @private\r\n */\r\n this.pad_ = [];\r\n /**\r\n * @private {number}\r\n */\r\n this.inbuf_ = 0;\r\n /**\r\n * @private {number}\r\n */\r\n this.total_ = 0;\r\n this.blockSize = 512 / 8;\r\n this.pad_[0] = 128;\r\n for (let i = 1; i < this.blockSize; ++i) {\r\n this.pad_[i] = 0;\r\n }\r\n this.reset();\r\n }\r\n reset() {\r\n this.chain_[0] = 0x67452301;\r\n this.chain_[1] = 0xefcdab89;\r\n this.chain_[2] = 0x98badcfe;\r\n this.chain_[3] = 0x10325476;\r\n this.chain_[4] = 0xc3d2e1f0;\r\n this.inbuf_ = 0;\r\n this.total_ = 0;\r\n }\r\n /**\r\n * Internal compress helper function.\r\n * @param buf Block to compress.\r\n * @param offset Offset of the block in the buffer.\r\n * @private\r\n */\r\n compress_(buf, offset) {\r\n if (!offset) {\r\n offset = 0;\r\n }\r\n const W = this.W_;\r\n // get 16 big endian words\r\n if (typeof buf === 'string') {\r\n for (let i = 0; i < 16; i++) {\r\n // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS\r\n // have a bug that turns the post-increment ++ operator into pre-increment\r\n // during JIT compilation. We have code that depends heavily on SHA-1 for\r\n // correctness and which is affected by this bug, so I've removed all uses\r\n // of post-increment ++ in which the result value is used. We can revert\r\n // this change once the Safari bug\r\n // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and\r\n // most clients have been updated.\r\n W[i] =\r\n (buf.charCodeAt(offset) << 24) |\r\n (buf.charCodeAt(offset + 1) << 16) |\r\n (buf.charCodeAt(offset + 2) << 8) |\r\n buf.charCodeAt(offset + 3);\r\n offset += 4;\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < 16; i++) {\r\n W[i] =\r\n (buf[offset] << 24) |\r\n (buf[offset + 1] << 16) |\r\n (buf[offset + 2] << 8) |\r\n buf[offset + 3];\r\n offset += 4;\r\n }\r\n }\r\n // expand to 80 words\r\n for (let i = 16; i < 80; i++) {\r\n const t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\r\n W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff;\r\n }\r\n let a = this.chain_[0];\r\n let b = this.chain_[1];\r\n let c = this.chain_[2];\r\n let d = this.chain_[3];\r\n let e = this.chain_[4];\r\n let f, k;\r\n // TODO(user): Try to unroll this loop to speed up the computation.\r\n for (let i = 0; i < 80; i++) {\r\n if (i < 40) {\r\n if (i < 20) {\r\n f = d ^ (b & (c ^ d));\r\n k = 0x5a827999;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0x6ed9eba1;\r\n }\r\n }\r\n else {\r\n if (i < 60) {\r\n f = (b & c) | (d & (b | c));\r\n k = 0x8f1bbcdc;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0xca62c1d6;\r\n }\r\n }\r\n const t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff;\r\n e = d;\r\n d = c;\r\n c = ((b << 30) | (b >>> 2)) & 0xffffffff;\r\n b = a;\r\n a = t;\r\n }\r\n this.chain_[0] = (this.chain_[0] + a) & 0xffffffff;\r\n this.chain_[1] = (this.chain_[1] + b) & 0xffffffff;\r\n this.chain_[2] = (this.chain_[2] + c) & 0xffffffff;\r\n this.chain_[3] = (this.chain_[3] + d) & 0xffffffff;\r\n this.chain_[4] = (this.chain_[4] + e) & 0xffffffff;\r\n }\r\n update(bytes, length) {\r\n // TODO(johnlenz): tighten the function signature and remove this check\r\n if (bytes == null) {\r\n return;\r\n }\r\n if (length === undefined) {\r\n length = bytes.length;\r\n }\r\n const lengthMinusBlock = length - this.blockSize;\r\n let n = 0;\r\n // Using local instead of member variables gives ~5% speedup on Firefox 16.\r\n const buf = this.buf_;\r\n let inbuf = this.inbuf_;\r\n // The outer while loop should execute at most twice.\r\n while (n < length) {\r\n // When we have no data in the block to top up, we can directly process the\r\n // input buffer (assuming it contains sufficient data). This gives ~25%\r\n // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that\r\n // the data is provided in large chunks (or in multiples of 64 bytes).\r\n if (inbuf === 0) {\r\n while (n <= lengthMinusBlock) {\r\n this.compress_(bytes, n);\r\n n += this.blockSize;\r\n }\r\n }\r\n if (typeof bytes === 'string') {\r\n while (n < length) {\r\n buf[inbuf] = bytes.charCodeAt(n);\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n while (n < length) {\r\n buf[inbuf] = bytes[n];\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n this.inbuf_ = inbuf;\r\n this.total_ += length;\r\n }\r\n /** @override */\r\n digest() {\r\n const digest = [];\r\n let totalBits = this.total_ * 8;\r\n // Add pad 0x80 0x00*.\r\n if (this.inbuf_ < 56) {\r\n this.update(this.pad_, 56 - this.inbuf_);\r\n }\r\n else {\r\n this.update(this.pad_, this.blockSize - (this.inbuf_ - 56));\r\n }\r\n // Add # bits.\r\n for (let i = this.blockSize - 1; i >= 56; i--) {\r\n this.buf_[i] = totalBits & 255;\r\n totalBits /= 256; // Don't use bit-shifting here!\r\n }\r\n this.compress_(this.buf_);\r\n let n = 0;\r\n for (let i = 0; i < 5; i++) {\r\n for (let j = 24; j >= 0; j -= 8) {\r\n digest[n] = (this.chain_[i] >> j) & 255;\r\n ++n;\r\n }\r\n }\r\n return digest;\r\n }\r\n}\n\n/**\r\n * Helper to make a Subscribe function (just like Promise helps make a\r\n * Thenable).\r\n *\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\nfunction createSubscribe(executor, onNoObservers) {\r\n const proxy = new ObserverProxy(executor, onNoObservers);\r\n return proxy.subscribe.bind(proxy);\r\n}\r\n/**\r\n * Implement fan-out for any number of Observers attached via a subscribe\r\n * function.\r\n */\r\nclass ObserverProxy {\r\n /**\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\n constructor(executor, onNoObservers) {\r\n this.observers = [];\r\n this.unsubscribes = [];\r\n this.observerCount = 0;\r\n // Micro-task scheduling by calling task.then().\r\n this.task = Promise.resolve();\r\n this.finalized = false;\r\n this.onNoObservers = onNoObservers;\r\n // Call the executor asynchronously so subscribers that are called\r\n // synchronously after the creation of the subscribe function\r\n // can still receive the very first value generated in the executor.\r\n this.task\r\n .then(() => {\r\n executor(this);\r\n })\r\n .catch(e => {\r\n this.error(e);\r\n });\r\n }\r\n next(value) {\r\n this.forEachObserver((observer) => {\r\n observer.next(value);\r\n });\r\n }\r\n error(error) {\r\n this.forEachObserver((observer) => {\r\n observer.error(error);\r\n });\r\n this.close(error);\r\n }\r\n complete() {\r\n this.forEachObserver((observer) => {\r\n observer.complete();\r\n });\r\n this.close();\r\n }\r\n /**\r\n * Subscribe function that can be used to add an Observer to the fan-out list.\r\n *\r\n * - We require that no event is sent to a subscriber synchronously to their\r\n * call to subscribe().\r\n */\r\n subscribe(nextOrObserver, error, complete) {\r\n let observer;\r\n if (nextOrObserver === undefined &&\r\n error === undefined &&\r\n complete === undefined) {\r\n throw new Error('Missing Observer.');\r\n }\r\n // Assemble an Observer object when passed as callback functions.\r\n if (implementsAnyMethods(nextOrObserver, [\r\n 'next',\r\n 'error',\r\n 'complete'\r\n ])) {\r\n observer = nextOrObserver;\r\n }\r\n else {\r\n observer = {\r\n next: nextOrObserver,\r\n error,\r\n complete\r\n };\r\n }\r\n if (observer.next === undefined) {\r\n observer.next = noop;\r\n }\r\n if (observer.error === undefined) {\r\n observer.error = noop;\r\n }\r\n if (observer.complete === undefined) {\r\n observer.complete = noop;\r\n }\r\n const unsub = this.unsubscribeOne.bind(this, this.observers.length);\r\n // Attempt to subscribe to a terminated Observable - we\r\n // just respond to the Observer with the final error or complete\r\n // event.\r\n if (this.finalized) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n try {\r\n if (this.finalError) {\r\n observer.error(this.finalError);\r\n }\r\n else {\r\n observer.complete();\r\n }\r\n }\r\n catch (e) {\r\n // nothing\r\n }\r\n return;\r\n });\r\n }\r\n this.observers.push(observer);\r\n return unsub;\r\n }\r\n // Unsubscribe is synchronous - we guarantee that no events are sent to\r\n // any unsubscribed Observer.\r\n unsubscribeOne(i) {\r\n if (this.observers === undefined || this.observers[i] === undefined) {\r\n return;\r\n }\r\n delete this.observers[i];\r\n this.observerCount -= 1;\r\n if (this.observerCount === 0 && this.onNoObservers !== undefined) {\r\n this.onNoObservers(this);\r\n }\r\n }\r\n forEachObserver(fn) {\r\n if (this.finalized) {\r\n // Already closed by previous event....just eat the additional values.\r\n return;\r\n }\r\n // Since sendOne calls asynchronously - there is no chance that\r\n // this.observers will become undefined.\r\n for (let i = 0; i < this.observers.length; i++) {\r\n this.sendOne(i, fn);\r\n }\r\n }\r\n // Call the Observer via one of it's callback function. We are careful to\r\n // confirm that the observe has not been unsubscribed since this asynchronous\r\n // function had been queued.\r\n sendOne(i, fn) {\r\n // Execute the callback asynchronously\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n if (this.observers !== undefined && this.observers[i] !== undefined) {\r\n try {\r\n fn(this.observers[i]);\r\n }\r\n catch (e) {\r\n // Ignore exceptions raised in Observers or missing methods of an\r\n // Observer.\r\n // Log error to console. b/31404806\r\n if (typeof console !== 'undefined' && console.error) {\r\n console.error(e);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n close(err) {\r\n if (this.finalized) {\r\n return;\r\n }\r\n this.finalized = true;\r\n if (err !== undefined) {\r\n this.finalError = err;\r\n }\r\n // Proxy is no longer needed - garbage collect references\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n this.observers = undefined;\r\n this.onNoObservers = undefined;\r\n });\r\n }\r\n}\r\n/** Turn synchronous function into one called asynchronously. */\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\nfunction async(fn, onError) {\r\n return (...args) => {\r\n Promise.resolve(true)\r\n .then(() => {\r\n fn(...args);\r\n })\r\n .catch((error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n });\r\n };\r\n}\r\n/**\r\n * Return true if the object passed in implements any of the named methods.\r\n */\r\nfunction implementsAnyMethods(obj, methods) {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n for (const method of methods) {\r\n if (method in obj && typeof obj[method] === 'function') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\nfunction noop() {\r\n // do nothing\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Check to make sure the appropriate number of arguments are provided for a public function.\r\n * Throws an error if it fails.\r\n *\r\n * @param fnName The function name\r\n * @param minCount The minimum number of arguments to allow for the function call\r\n * @param maxCount The maximum number of argument to allow for the function call\r\n * @param argCount The actual number of arguments provided.\r\n */\r\nconst validateArgCount = function (fnName, minCount, maxCount, argCount) {\r\n let argError;\r\n if (argCount < minCount) {\r\n argError = 'at least ' + minCount;\r\n }\r\n else if (argCount > maxCount) {\r\n argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount;\r\n }\r\n if (argError) {\r\n const error = fnName +\r\n ' failed: Was called with ' +\r\n argCount +\r\n (argCount === 1 ? ' argument.' : ' arguments.') +\r\n ' Expects ' +\r\n argError +\r\n '.';\r\n throw new Error(error);\r\n }\r\n};\r\n/**\r\n * Generates a string to prefix an error message about failed argument validation\r\n *\r\n * @param fnName The function name\r\n * @param argName The name of the argument\r\n * @return The prefix to add to the error thrown for validation.\r\n */\r\nfunction errorPrefix(fnName, argName) {\r\n return `${fnName} failed: ${argName} argument `;\r\n}\r\n/**\r\n * @param fnName\r\n * @param argumentNumber\r\n * @param namespace\r\n * @param optional\r\n */\r\nfunction validateNamespace(fnName, namespace, optional) {\r\n if (optional && !namespace) {\r\n return;\r\n }\r\n if (typeof namespace !== 'string') {\r\n //TODO: I should do more validation here. We only allow certain chars in namespaces.\r\n throw new Error(errorPrefix(fnName, 'namespace') + 'must be a valid firebase namespace.');\r\n }\r\n}\r\nfunction validateCallback(fnName, argumentName, \r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\ncallback, optional) {\r\n if (optional && !callback) {\r\n return;\r\n }\r\n if (typeof callback !== 'function') {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid function.');\r\n }\r\n}\r\nfunction validateContextObject(fnName, argumentName, context, optional) {\r\n if (optional && !context) {\r\n return;\r\n }\r\n if (typeof context !== 'object' || context === null) {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid context object.');\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they\r\n// automatically replaced '\\r\\n' with '\\n', and they didn't handle surrogate pairs,\r\n// so it's been modified.\r\n// Note that not all Unicode characters appear as single characters in JavaScript strings.\r\n// fromCharCode returns the UTF-16 encoding of a character - so some Unicode characters\r\n// use 2 characters in JavaScript. All 4-byte UTF-8 characters begin with a first\r\n// character in the range 0xD800 - 0xDBFF (the first character of a so-called surrogate\r\n// pair).\r\n// See http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3\r\n/**\r\n * @param {string} str\r\n * @return {Array}\r\n */\r\nconst stringToByteArray = function (str) {\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n // Is this the lead surrogate in a surrogate pair?\r\n if (c >= 0xd800 && c <= 0xdbff) {\r\n const high = c - 0xd800; // the high 10 bits.\r\n i++;\r\n assert(i < str.length, 'Surrogate pair missing trail surrogate.');\r\n const low = str.charCodeAt(i) - 0xdc00; // the low 10 bits.\r\n c = 0x10000 + (high << 10) + low;\r\n }\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if (c < 65536) {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Calculate length without actually converting; useful for doing cheaper validation.\r\n * @param {string} str\r\n * @return {number}\r\n */\r\nconst stringLength = function (str) {\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const c = str.charCodeAt(i);\r\n if (c < 128) {\r\n p++;\r\n }\r\n else if (c < 2048) {\r\n p += 2;\r\n }\r\n else if (c >= 0xd800 && c <= 0xdbff) {\r\n // Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent.\r\n p += 4;\r\n i++; // skip trail surrogate.\r\n }\r\n else {\r\n p += 3;\r\n }\r\n }\r\n return p;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Copied from https://stackoverflow.com/a/2117523\r\n * Generates a new uuid.\r\n * @public\r\n */\r\nconst uuidv4 = function () {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\r\n const r = (Math.random() * 16) | 0, v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The amount of milliseconds to exponentially increase.\r\n */\r\nconst DEFAULT_INTERVAL_MILLIS = 1000;\r\n/**\r\n * The factor to backoff by.\r\n * Should be a number greater than 1.\r\n */\r\nconst DEFAULT_BACKOFF_FACTOR = 2;\r\n/**\r\n * The maximum milliseconds to increase to.\r\n *\r\n *

    Visible for testing\r\n */\r\nconst MAX_VALUE_MILLIS = 4 * 60 * 60 * 1000; // Four hours, like iOS and Android.\r\n/**\r\n * The percentage of backoff time to randomize by.\r\n * See\r\n * http://go/safe-client-behavior#step-1-determine-the-appropriate-retry-interval-to-handle-spike-traffic\r\n * for context.\r\n *\r\n *

    Visible for testing\r\n */\r\nconst RANDOM_FACTOR = 0.5;\r\n/**\r\n * Based on the backoff method from\r\n * https://github.com/google/closure-library/blob/master/closure/goog/math/exponentialbackoff.js.\r\n * Extracted here so we don't need to pass metadata and a stateful ExponentialBackoff object around.\r\n */\r\nfunction calculateBackoffMillis(backoffCount, intervalMillis = DEFAULT_INTERVAL_MILLIS, backoffFactor = DEFAULT_BACKOFF_FACTOR) {\r\n // Calculates an exponentially increasing value.\r\n // Deviation: calculates value from count and a constant interval, so we only need to save value\r\n // and count to restore state.\r\n const currBaseValue = intervalMillis * Math.pow(backoffFactor, backoffCount);\r\n // A random \"fuzz\" to avoid waves of retries.\r\n // Deviation: randomFactor is required.\r\n const randomWait = Math.round(\r\n // A fraction of the backoff value to add/subtract.\r\n // Deviation: changes multiplication order to improve readability.\r\n RANDOM_FACTOR *\r\n currBaseValue *\r\n // A random float (rounded to int by Math.round above) in the range [-1, 1]. Determines\r\n // if we add or subtract.\r\n (Math.random() - 0.5) *\r\n 2);\r\n // Limits backoff to max to avoid effectively permanent backoff.\r\n return Math.min(MAX_VALUE_MILLIS, currBaseValue + randomWait);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provide English ordinal letters after a number\r\n */\r\nfunction ordinal(i) {\r\n if (!Number.isFinite(i)) {\r\n return `${i}`;\r\n }\r\n return i + indicator(i);\r\n}\r\nfunction indicator(i) {\r\n i = Math.abs(i);\r\n const cent = i % 100;\r\n if (cent >= 10 && cent <= 20) {\r\n return 'th';\r\n }\r\n const dec = i % 10;\r\n if (dec === 1) {\r\n return 'st';\r\n }\r\n if (dec === 2) {\r\n return 'nd';\r\n }\r\n if (dec === 3) {\r\n return 'rd';\r\n }\r\n return 'th';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getModularInstance(service) {\r\n if (service && service._delegate) {\r\n return service._delegate;\r\n }\r\n else {\r\n return service;\r\n }\r\n}\n\nexport { CONSTANTS, DecodeBase64StringError, Deferred, ErrorFactory, FirebaseError, MAX_VALUE_MILLIS, RANDOM_FACTOR, Sha1, areCookiesEnabled, assert, assertionError, async, base64, base64Decode, base64Encode, base64urlEncodeWithoutPadding, calculateBackoffMillis, contains, createMockUserToken, createSubscribe, decode, deepCopy, deepEqual, deepExtend, errorPrefix, extractQuerystring, getDefaultAppConfig, getDefaultEmulatorHost, getDefaultEmulatorHostnameAndPort, getDefaults, getExperimentalSetting, getGlobal, getModularInstance, getUA, isAdmin, isBrowser, isBrowserExtension, isCloudflareWorker, isElectron, isEmpty, isIE, isIndexedDBAvailable, isMobileCordova, isNode, isNodeSdk, isReactNative, isSafari, isUWP, isValidFormat, isValidTimestamp, isWebWorker, issuedAtTime, jsonEval, map, ordinal, promiseWithTimeout, querystring, querystringDecode, safeGet, stringLength, stringToByteArray, stringify, uuidv4, validateArgCount, validateCallback, validateContextObject, validateIndexedDBOpenable, validateNamespace };\n//# sourceMappingURL=index.esm2017.js.map\n","import { Deferred } from '@firebase/util';\n\n/**\r\n * Component for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass Component {\r\n /**\r\n *\r\n * @param name The public service name, e.g. app, auth, firestore, database\r\n * @param instanceFactory Service factory responsible for creating the public interface\r\n * @param type whether the service provided by the component is public or private\r\n */\r\n constructor(name, instanceFactory, type) {\r\n this.name = name;\r\n this.instanceFactory = instanceFactory;\r\n this.type = type;\r\n this.multipleInstances = false;\r\n /**\r\n * Properties to be added to the service namespace\r\n */\r\n this.serviceProps = {};\r\n this.instantiationMode = \"LAZY\" /* InstantiationMode.LAZY */;\r\n this.onInstanceCreated = null;\r\n }\r\n setInstantiationMode(mode) {\r\n this.instantiationMode = mode;\r\n return this;\r\n }\r\n setMultipleInstances(multipleInstances) {\r\n this.multipleInstances = multipleInstances;\r\n return this;\r\n }\r\n setServiceProps(props) {\r\n this.serviceProps = props;\r\n return this;\r\n }\r\n setInstanceCreatedCallback(callback) {\r\n this.onInstanceCreated = callback;\r\n return this;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for instance for service name T, e.g. 'auth', 'auth-internal'\r\n * NameServiceMapping[T] is an alias for the type of the instance\r\n */\r\nclass Provider {\r\n constructor(name, container) {\r\n this.name = name;\r\n this.container = container;\r\n this.component = null;\r\n this.instances = new Map();\r\n this.instancesDeferred = new Map();\r\n this.instancesOptions = new Map();\r\n this.onInitCallbacks = new Map();\r\n }\r\n /**\r\n * @param identifier A provider can provide multiple instances of a service\r\n * if this.component.multipleInstances is true.\r\n */\r\n get(identifier) {\r\n // if multipleInstances is not supported, use the default name\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n if (!this.instancesDeferred.has(normalizedIdentifier)) {\r\n const deferred = new Deferred();\r\n this.instancesDeferred.set(normalizedIdentifier, deferred);\r\n if (this.isInitialized(normalizedIdentifier) ||\r\n this.shouldAutoInitialize()) {\r\n // initialize the service if it can be auto-initialized\r\n try {\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n if (instance) {\r\n deferred.resolve(instance);\r\n }\r\n }\r\n catch (e) {\r\n // when the instance factory throws an exception during get(), it should not cause\r\n // a fatal error. We just return the unresolved promise in this case.\r\n }\r\n }\r\n }\r\n return this.instancesDeferred.get(normalizedIdentifier).promise;\r\n }\r\n getImmediate(options) {\r\n var _a;\r\n // if multipleInstances is not supported, use the default name\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(options === null || options === void 0 ? void 0 : options.identifier);\r\n const optional = (_a = options === null || options === void 0 ? void 0 : options.optional) !== null && _a !== void 0 ? _a : false;\r\n if (this.isInitialized(normalizedIdentifier) ||\r\n this.shouldAutoInitialize()) {\r\n try {\r\n return this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n }\r\n catch (e) {\r\n if (optional) {\r\n return null;\r\n }\r\n else {\r\n throw e;\r\n }\r\n }\r\n }\r\n else {\r\n // In case a component is not initialized and should/cannot be auto-initialized at the moment, return null if the optional flag is set, or throw\r\n if (optional) {\r\n return null;\r\n }\r\n else {\r\n throw Error(`Service ${this.name} is not available`);\r\n }\r\n }\r\n }\r\n getComponent() {\r\n return this.component;\r\n }\r\n setComponent(component) {\r\n if (component.name !== this.name) {\r\n throw Error(`Mismatching Component ${component.name} for Provider ${this.name}.`);\r\n }\r\n if (this.component) {\r\n throw Error(`Component for ${this.name} has already been provided`);\r\n }\r\n this.component = component;\r\n // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)\r\n if (!this.shouldAutoInitialize()) {\r\n return;\r\n }\r\n // if the service is eager, initialize the default instance\r\n if (isComponentEager(component)) {\r\n try {\r\n this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });\r\n }\r\n catch (e) {\r\n // when the instance factory for an eager Component throws an exception during the eager\r\n // initialization, it should not cause a fatal error.\r\n // TODO: Investigate if we need to make it configurable, because some component may want to cause\r\n // a fatal error in this case?\r\n }\r\n }\r\n // Create service instances for the pending promises and resolve them\r\n // NOTE: if this.multipleInstances is false, only the default instance will be created\r\n // and all promises with resolve with it regardless of the identifier.\r\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n try {\r\n // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier\r\n });\r\n instanceDeferred.resolve(instance);\r\n }\r\n catch (e) {\r\n // when the instance factory throws an exception, it should not cause\r\n // a fatal error. We just leave the promise unresolved.\r\n }\r\n }\r\n }\r\n clearInstance(identifier = DEFAULT_ENTRY_NAME) {\r\n this.instancesDeferred.delete(identifier);\r\n this.instancesOptions.delete(identifier);\r\n this.instances.delete(identifier);\r\n }\r\n // app.delete() will call this method on every provider to delete the services\r\n // TODO: should we mark the provider as deleted?\r\n async delete() {\r\n const services = Array.from(this.instances.values());\r\n await Promise.all([\r\n ...services\r\n .filter(service => 'INTERNAL' in service) // legacy services\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .map(service => service.INTERNAL.delete()),\r\n ...services\r\n .filter(service => '_delete' in service) // modularized services\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n .map(service => service._delete())\r\n ]);\r\n }\r\n isComponentSet() {\r\n return this.component != null;\r\n }\r\n isInitialized(identifier = DEFAULT_ENTRY_NAME) {\r\n return this.instances.has(identifier);\r\n }\r\n getOptions(identifier = DEFAULT_ENTRY_NAME) {\r\n return this.instancesOptions.get(identifier) || {};\r\n }\r\n initialize(opts = {}) {\r\n const { options = {} } = opts;\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier);\r\n if (this.isInitialized(normalizedIdentifier)) {\r\n throw Error(`${this.name}(${normalizedIdentifier}) has already been initialized`);\r\n }\r\n if (!this.isComponentSet()) {\r\n throw Error(`Component ${this.name} has not been registered yet`);\r\n }\r\n const instance = this.getOrInitializeService({\r\n instanceIdentifier: normalizedIdentifier,\r\n options\r\n });\r\n // resolve any pending promise waiting for the service instance\r\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n if (normalizedIdentifier === normalizedDeferredIdentifier) {\r\n instanceDeferred.resolve(instance);\r\n }\r\n }\r\n return instance;\r\n }\r\n /**\r\n *\r\n * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().\r\n * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.\r\n *\r\n * @param identifier An optional instance identifier\r\n * @returns a function to unregister the callback\r\n */\r\n onInit(callback, identifier) {\r\n var _a;\r\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n const existingCallbacks = (_a = this.onInitCallbacks.get(normalizedIdentifier)) !== null && _a !== void 0 ? _a : new Set();\r\n existingCallbacks.add(callback);\r\n this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);\r\n const existingInstance = this.instances.get(normalizedIdentifier);\r\n if (existingInstance) {\r\n callback(existingInstance, normalizedIdentifier);\r\n }\r\n return () => {\r\n existingCallbacks.delete(callback);\r\n };\r\n }\r\n /**\r\n * Invoke onInit callbacks synchronously\r\n * @param instance the service instance`\r\n */\r\n invokeOnInitCallbacks(instance, identifier) {\r\n const callbacks = this.onInitCallbacks.get(identifier);\r\n if (!callbacks) {\r\n return;\r\n }\r\n for (const callback of callbacks) {\r\n try {\r\n callback(instance, identifier);\r\n }\r\n catch (_a) {\r\n // ignore errors in the onInit callback\r\n }\r\n }\r\n }\r\n getOrInitializeService({ instanceIdentifier, options = {} }) {\r\n let instance = this.instances.get(instanceIdentifier);\r\n if (!instance && this.component) {\r\n instance = this.component.instanceFactory(this.container, {\r\n instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),\r\n options\r\n });\r\n this.instances.set(instanceIdentifier, instance);\r\n this.instancesOptions.set(instanceIdentifier, options);\r\n /**\r\n * Invoke onInit listeners.\r\n * Note this.component.onInstanceCreated is different, which is used by the component creator,\r\n * while onInit listeners are registered by consumers of the provider.\r\n */\r\n this.invokeOnInitCallbacks(instance, instanceIdentifier);\r\n /**\r\n * Order is important\r\n * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which\r\n * makes `isInitialized()` return true.\r\n */\r\n if (this.component.onInstanceCreated) {\r\n try {\r\n this.component.onInstanceCreated(this.container, instanceIdentifier, instance);\r\n }\r\n catch (_a) {\r\n // ignore errors in the onInstanceCreatedCallback\r\n }\r\n }\r\n }\r\n return instance || null;\r\n }\r\n normalizeInstanceIdentifier(identifier = DEFAULT_ENTRY_NAME) {\r\n if (this.component) {\r\n return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;\r\n }\r\n else {\r\n return identifier; // assume multiple instances are supported before the component is provided.\r\n }\r\n }\r\n shouldAutoInitialize() {\r\n return (!!this.component &&\r\n this.component.instantiationMode !== \"EXPLICIT\" /* InstantiationMode.EXPLICIT */);\r\n }\r\n}\r\n// undefined should be passed to the service factory for the default instance\r\nfunction normalizeIdentifierForFactory(identifier) {\r\n return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;\r\n}\r\nfunction isComponentEager(component) {\r\n return component.instantiationMode === \"EAGER\" /* InstantiationMode.EAGER */;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass ComponentContainer {\r\n constructor(name) {\r\n this.name = name;\r\n this.providers = new Map();\r\n }\r\n /**\r\n *\r\n * @param component Component being added\r\n * @param overwrite When a component with the same name has already been registered,\r\n * if overwrite is true: overwrite the existing component with the new component and create a new\r\n * provider with the new component. It can be useful in tests where you want to use different mocks\r\n * for different tests.\r\n * if overwrite is false: throw an exception\r\n */\r\n addComponent(component) {\r\n const provider = this.getProvider(component.name);\r\n if (provider.isComponentSet()) {\r\n throw new Error(`Component ${component.name} has already been registered with ${this.name}`);\r\n }\r\n provider.setComponent(component);\r\n }\r\n addOrOverwriteComponent(component) {\r\n const provider = this.getProvider(component.name);\r\n if (provider.isComponentSet()) {\r\n // delete the existing provider from the container, so we can register the new component\r\n this.providers.delete(component.name);\r\n }\r\n this.addComponent(component);\r\n }\r\n /**\r\n * getProvider provides a type safe interface where it can only be called with a field name\r\n * present in NameServiceMapping interface.\r\n *\r\n * Firebase SDKs providing services should extend NameServiceMapping interface to register\r\n * themselves.\r\n */\r\n getProvider(name) {\r\n if (this.providers.has(name)) {\r\n return this.providers.get(name);\r\n }\r\n // create a Provider for a service that hasn't registered with Firebase\r\n const provider = new Provider(name, this);\r\n this.providers.set(name, provider);\r\n return provider;\r\n }\r\n getProviders() {\r\n return Array.from(this.providers.values());\r\n }\r\n}\n\nexport { Component, ComponentContainer, Provider };\n//# sourceMappingURL=index.esm2017.js.map\n","/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A container for all of the Logger instances\r\n */\r\nconst instances = [];\r\n/**\r\n * The JS SDK supports 5 log levels and also allows a user the ability to\r\n * silence the logs altogether.\r\n *\r\n * The order is a follows:\r\n * DEBUG < VERBOSE < INFO < WARN < ERROR\r\n *\r\n * All of the log types above the current log level will be captured (i.e. if\r\n * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and\r\n * `VERBOSE` logs will not)\r\n */\r\nvar LogLevel;\r\n(function (LogLevel) {\r\n LogLevel[LogLevel[\"DEBUG\"] = 0] = \"DEBUG\";\r\n LogLevel[LogLevel[\"VERBOSE\"] = 1] = \"VERBOSE\";\r\n LogLevel[LogLevel[\"INFO\"] = 2] = \"INFO\";\r\n LogLevel[LogLevel[\"WARN\"] = 3] = \"WARN\";\r\n LogLevel[LogLevel[\"ERROR\"] = 4] = \"ERROR\";\r\n LogLevel[LogLevel[\"SILENT\"] = 5] = \"SILENT\";\r\n})(LogLevel || (LogLevel = {}));\r\nconst levelStringToEnum = {\r\n 'debug': LogLevel.DEBUG,\r\n 'verbose': LogLevel.VERBOSE,\r\n 'info': LogLevel.INFO,\r\n 'warn': LogLevel.WARN,\r\n 'error': LogLevel.ERROR,\r\n 'silent': LogLevel.SILENT\r\n};\r\n/**\r\n * The default log level\r\n */\r\nconst defaultLogLevel = LogLevel.INFO;\r\n/**\r\n * By default, `console.debug` is not displayed in the developer console (in\r\n * chrome). To avoid forcing users to have to opt-in to these logs twice\r\n * (i.e. once for firebase, and once in the console), we are sending `DEBUG`\r\n * logs to the `console.log` function.\r\n */\r\nconst ConsoleMethod = {\r\n [LogLevel.DEBUG]: 'log',\r\n [LogLevel.VERBOSE]: 'log',\r\n [LogLevel.INFO]: 'info',\r\n [LogLevel.WARN]: 'warn',\r\n [LogLevel.ERROR]: 'error'\r\n};\r\n/**\r\n * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR\r\n * messages on to their corresponding console counterparts (if the log method\r\n * is supported by the current log level)\r\n */\r\nconst defaultLogHandler = (instance, logType, ...args) => {\r\n if (logType < instance.logLevel) {\r\n return;\r\n }\r\n const now = new Date().toISOString();\r\n const method = ConsoleMethod[logType];\r\n if (method) {\r\n console[method](`[${now}] ${instance.name}:`, ...args);\r\n }\r\n else {\r\n throw new Error(`Attempted to log a message with an invalid logType (value: ${logType})`);\r\n }\r\n};\r\nclass Logger {\r\n /**\r\n * Gives you an instance of a Logger to capture messages according to\r\n * Firebase's logging scheme.\r\n *\r\n * @param name The name that the logs will be associated with\r\n */\r\n constructor(name) {\r\n this.name = name;\r\n /**\r\n * The log level of the given Logger instance.\r\n */\r\n this._logLevel = defaultLogLevel;\r\n /**\r\n * The main (internal) log handler for the Logger instance.\r\n * Can be set to a new function in internal package code but not by user.\r\n */\r\n this._logHandler = defaultLogHandler;\r\n /**\r\n * The optional, additional, user-defined log handler for the Logger instance.\r\n */\r\n this._userLogHandler = null;\r\n /**\r\n * Capture the current instance for later use\r\n */\r\n instances.push(this);\r\n }\r\n get logLevel() {\r\n return this._logLevel;\r\n }\r\n set logLevel(val) {\r\n if (!(val in LogLevel)) {\r\n throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\r\n }\r\n this._logLevel = val;\r\n }\r\n // Workaround for setter/getter having to be the same type.\r\n setLogLevel(val) {\r\n this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val;\r\n }\r\n get logHandler() {\r\n return this._logHandler;\r\n }\r\n set logHandler(val) {\r\n if (typeof val !== 'function') {\r\n throw new TypeError('Value assigned to `logHandler` must be a function');\r\n }\r\n this._logHandler = val;\r\n }\r\n get userLogHandler() {\r\n return this._userLogHandler;\r\n }\r\n set userLogHandler(val) {\r\n this._userLogHandler = val;\r\n }\r\n /**\r\n * The functions below are all based on the `console` interface\r\n */\r\n debug(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args);\r\n this._logHandler(this, LogLevel.DEBUG, ...args);\r\n }\r\n log(...args) {\r\n this._userLogHandler &&\r\n this._userLogHandler(this, LogLevel.VERBOSE, ...args);\r\n this._logHandler(this, LogLevel.VERBOSE, ...args);\r\n }\r\n info(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args);\r\n this._logHandler(this, LogLevel.INFO, ...args);\r\n }\r\n warn(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args);\r\n this._logHandler(this, LogLevel.WARN, ...args);\r\n }\r\n error(...args) {\r\n this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args);\r\n this._logHandler(this, LogLevel.ERROR, ...args);\r\n }\r\n}\r\nfunction setLogLevel(level) {\r\n instances.forEach(inst => {\r\n inst.setLogLevel(level);\r\n });\r\n}\r\nfunction setUserLogHandler(logCallback, options) {\r\n for (const instance of instances) {\r\n let customLogLevel = null;\r\n if (options && options.level) {\r\n customLogLevel = levelStringToEnum[options.level];\r\n }\r\n if (logCallback === null) {\r\n instance.userLogHandler = null;\r\n }\r\n else {\r\n instance.userLogHandler = (instance, level, ...args) => {\r\n const message = args\r\n .map(arg => {\r\n if (arg == null) {\r\n return null;\r\n }\r\n else if (typeof arg === 'string') {\r\n return arg;\r\n }\r\n else if (typeof arg === 'number' || typeof arg === 'boolean') {\r\n return arg.toString();\r\n }\r\n else if (arg instanceof Error) {\r\n return arg.message;\r\n }\r\n else {\r\n try {\r\n return JSON.stringify(arg);\r\n }\r\n catch (ignored) {\r\n return null;\r\n }\r\n }\r\n })\r\n .filter(arg => arg)\r\n .join(' ');\r\n if (level >= (customLogLevel !== null && customLogLevel !== void 0 ? customLogLevel : instance.logLevel)) {\r\n logCallback({\r\n level: LogLevel[level].toLowerCase(),\r\n message,\r\n args,\r\n type: instance.name\r\n });\r\n }\r\n };\r\n }\r\n }\r\n}\n\nexport { LogLevel, Logger, setLogLevel, setUserLogHandler };\n//# sourceMappingURL=index.esm2017.js.map\n","const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n return (idbProxyableTypes ||\n (idbProxyableTypes = [\n IDBDatabase,\n IDBObjectStore,\n IDBIndex,\n IDBCursor,\n IDBTransaction,\n ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n return (cursorAdvanceMethods ||\n (cursorAdvanceMethods = [\n IDBCursor.prototype.advance,\n IDBCursor.prototype.continue,\n IDBCursor.prototype.continuePrimaryKey,\n ]));\n}\nconst cursorRequestMap = new WeakMap();\nconst transactionDoneMap = new WeakMap();\nconst transactionStoreNamesMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n const promise = new Promise((resolve, reject) => {\n const unlisten = () => {\n request.removeEventListener('success', success);\n request.removeEventListener('error', error);\n };\n const success = () => {\n resolve(wrap(request.result));\n unlisten();\n };\n const error = () => {\n reject(request.error);\n unlisten();\n };\n request.addEventListener('success', success);\n request.addEventListener('error', error);\n });\n promise\n .then((value) => {\n // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval\n // (see wrapFunction).\n if (value instanceof IDBCursor) {\n cursorRequestMap.set(value, request);\n }\n // Catching to avoid \"Uncaught Promise exceptions\"\n })\n .catch(() => { });\n // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This\n // is because we create many promises from a single IDBRequest.\n reverseTransformCache.set(promise, request);\n return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n // Early bail if we've already created a done promise for this transaction.\n if (transactionDoneMap.has(tx))\n return;\n const done = new Promise((resolve, reject) => {\n const unlisten = () => {\n tx.removeEventListener('complete', complete);\n tx.removeEventListener('error', error);\n tx.removeEventListener('abort', error);\n };\n const complete = () => {\n resolve();\n unlisten();\n };\n const error = () => {\n reject(tx.error || new DOMException('AbortError', 'AbortError'));\n unlisten();\n };\n tx.addEventListener('complete', complete);\n tx.addEventListener('error', error);\n tx.addEventListener('abort', error);\n });\n // Cache it for later retrieval.\n transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n get(target, prop, receiver) {\n if (target instanceof IDBTransaction) {\n // Special handling for transaction.done.\n if (prop === 'done')\n return transactionDoneMap.get(target);\n // Polyfill for objectStoreNames because of Edge.\n if (prop === 'objectStoreNames') {\n return target.objectStoreNames || transactionStoreNamesMap.get(target);\n }\n // Make tx.store return the only store in the transaction, or undefined if there are many.\n if (prop === 'store') {\n return receiver.objectStoreNames[1]\n ? undefined\n : receiver.objectStore(receiver.objectStoreNames[0]);\n }\n }\n // Else transform whatever we get back.\n return wrap(target[prop]);\n },\n set(target, prop, value) {\n target[prop] = value;\n return true;\n },\n has(target, prop) {\n if (target instanceof IDBTransaction &&\n (prop === 'done' || prop === 'store')) {\n return true;\n }\n return prop in target;\n },\n};\nfunction replaceTraps(callback) {\n idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n // Due to expected object equality (which is enforced by the caching in `wrap`), we\n // only create one new func per func.\n // Edge doesn't support objectStoreNames (booo), so we polyfill it here.\n if (func === IDBDatabase.prototype.transaction &&\n !('objectStoreNames' in IDBTransaction.prototype)) {\n return function (storeNames, ...args) {\n const tx = func.call(unwrap(this), storeNames, ...args);\n transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);\n return wrap(tx);\n };\n }\n // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n // with real promises, so each advance methods returns a new promise for the cursor object, or\n // undefined if the end of the cursor has been reached.\n if (getCursorAdvanceMethods().includes(func)) {\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n func.apply(unwrap(this), args);\n return wrap(cursorRequestMap.get(this));\n };\n }\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n return wrap(func.apply(unwrap(this), args));\n };\n}\nfunction transformCachableValue(value) {\n if (typeof value === 'function')\n return wrapFunction(value);\n // This doesn't return, it just creates a 'done' promise for the transaction,\n // which is later returned for transaction.done (see idbObjectHandler).\n if (value instanceof IDBTransaction)\n cacheDonePromiseForTransaction(value);\n if (instanceOfAny(value, getIdbProxyableTypes()))\n return new Proxy(value, idbProxyTraps);\n // Return the same value back if we're not going to transform it.\n return value;\n}\nfunction wrap(value) {\n // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n if (value instanceof IDBRequest)\n return promisifyRequest(value);\n // If we've already transformed this value before, reuse the transformed value.\n // This is faster, but it also provides object equality.\n if (transformCache.has(value))\n return transformCache.get(value);\n const newValue = transformCachableValue(value);\n // Not all types are transformed.\n // These may be primitive types, so they can't be WeakMap keys.\n if (newValue !== value) {\n transformCache.set(value, newValue);\n reverseTransformCache.set(newValue, value);\n }\n return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\nexport { reverseTransformCache as a, instanceOfAny as i, replaceTraps as r, unwrap as u, wrap as w };\n","import { w as wrap, r as replaceTraps } from './wrap-idb-value.js';\nexport { u as unwrap, w as wrap } from './wrap-idb-value.js';\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n const request = indexedDB.open(name, version);\n const openPromise = wrap(request);\n if (upgrade) {\n request.addEventListener('upgradeneeded', (event) => {\n upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction), event);\n });\n }\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event.newVersion, event));\n }\n openPromise\n .then((db) => {\n if (terminated)\n db.addEventListener('close', () => terminated());\n if (blocking) {\n db.addEventListener('versionchange', (event) => blocking(event.oldVersion, event.newVersion, event));\n }\n })\n .catch(() => { });\n return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n const request = indexedDB.deleteDatabase(name);\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event));\n }\n return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = new Map();\nfunction getMethod(target, prop) {\n if (!(target instanceof IDBDatabase &&\n !(prop in target) &&\n typeof prop === 'string')) {\n return;\n }\n if (cachedMethods.get(prop))\n return cachedMethods.get(prop);\n const targetFuncName = prop.replace(/FromIndex$/, '');\n const useIndex = prop !== targetFuncName;\n const isWrite = writeMethods.includes(targetFuncName);\n if (\n // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n !(isWrite || readMethods.includes(targetFuncName))) {\n return;\n }\n const method = async function (storeName, ...args) {\n // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n let target = tx.store;\n if (useIndex)\n target = target.index(args.shift());\n // Must reject if op rejects.\n // If it's a write operation, must reject if tx.done rejects.\n // Must reject with op rejection first.\n // Must resolve with op value.\n // Must handle both promises (no unhandled rejections)\n return (await Promise.all([\n target[targetFuncName](...args),\n isWrite && tx.done,\n ]))[0];\n };\n cachedMethods.set(prop, method);\n return method;\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nexport { deleteDB, openDB };\n","import { Component, ComponentContainer } from '@firebase/component';\nimport { Logger, setUserLogHandler, setLogLevel as setLogLevel$1 } from '@firebase/logger';\nimport { ErrorFactory, getDefaultAppConfig, deepEqual, isBrowser, isWebWorker, FirebaseError, base64urlEncodeWithoutPadding, isIndexedDBAvailable, validateIndexedDBOpenable } from '@firebase/util';\nexport { FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass PlatformLoggerServiceImpl {\r\n constructor(container) {\r\n this.container = container;\r\n }\r\n // In initial implementation, this will be called by installations on\r\n // auth token refresh, and installations will send this string.\r\n getPlatformInfoString() {\r\n const providers = this.container.getProviders();\r\n // Loop through providers and get library/version pairs from any that are\r\n // version components.\r\n return providers\r\n .map(provider => {\r\n if (isVersionServiceProvider(provider)) {\r\n const service = provider.getImmediate();\r\n return `${service.library}/${service.version}`;\r\n }\r\n else {\r\n return null;\r\n }\r\n })\r\n .filter(logString => logString)\r\n .join(' ');\r\n }\r\n}\r\n/**\r\n *\r\n * @param provider check if this provider provides a VersionService\r\n *\r\n * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider\r\n * provides VersionService. The provider is not necessarily a 'app-version'\r\n * provider.\r\n */\r\nfunction isVersionServiceProvider(provider) {\r\n const component = provider.getComponent();\r\n return (component === null || component === void 0 ? void 0 : component.type) === \"VERSION\" /* ComponentType.VERSION */;\r\n}\n\nconst name$q = \"@firebase/app\";\nconst version$1 = \"0.10.13\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst logger = new Logger('@firebase/app');\n\nconst name$p = \"@firebase/app-compat\";\n\nconst name$o = \"@firebase/analytics-compat\";\n\nconst name$n = \"@firebase/analytics\";\n\nconst name$m = \"@firebase/app-check-compat\";\n\nconst name$l = \"@firebase/app-check\";\n\nconst name$k = \"@firebase/auth\";\n\nconst name$j = \"@firebase/auth-compat\";\n\nconst name$i = \"@firebase/database\";\n\nconst name$h = \"@firebase/data-connect\";\n\nconst name$g = \"@firebase/database-compat\";\n\nconst name$f = \"@firebase/functions\";\n\nconst name$e = \"@firebase/functions-compat\";\n\nconst name$d = \"@firebase/installations\";\n\nconst name$c = \"@firebase/installations-compat\";\n\nconst name$b = \"@firebase/messaging\";\n\nconst name$a = \"@firebase/messaging-compat\";\n\nconst name$9 = \"@firebase/performance\";\n\nconst name$8 = \"@firebase/performance-compat\";\n\nconst name$7 = \"@firebase/remote-config\";\n\nconst name$6 = \"@firebase/remote-config-compat\";\n\nconst name$5 = \"@firebase/storage\";\n\nconst name$4 = \"@firebase/storage-compat\";\n\nconst name$3 = \"@firebase/firestore\";\n\nconst name$2 = \"@firebase/vertexai-preview\";\n\nconst name$1 = \"@firebase/firestore-compat\";\n\nconst name = \"firebase\";\nconst version = \"10.14.1\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The default app name\r\n *\r\n * @internal\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\r\nconst PLATFORM_LOG_STRING = {\r\n [name$q]: 'fire-core',\r\n [name$p]: 'fire-core-compat',\r\n [name$n]: 'fire-analytics',\r\n [name$o]: 'fire-analytics-compat',\r\n [name$l]: 'fire-app-check',\r\n [name$m]: 'fire-app-check-compat',\r\n [name$k]: 'fire-auth',\r\n [name$j]: 'fire-auth-compat',\r\n [name$i]: 'fire-rtdb',\r\n [name$h]: 'fire-data-connect',\r\n [name$g]: 'fire-rtdb-compat',\r\n [name$f]: 'fire-fn',\r\n [name$e]: 'fire-fn-compat',\r\n [name$d]: 'fire-iid',\r\n [name$c]: 'fire-iid-compat',\r\n [name$b]: 'fire-fcm',\r\n [name$a]: 'fire-fcm-compat',\r\n [name$9]: 'fire-perf',\r\n [name$8]: 'fire-perf-compat',\r\n [name$7]: 'fire-rc',\r\n [name$6]: 'fire-rc-compat',\r\n [name$5]: 'fire-gcs',\r\n [name$4]: 'fire-gcs-compat',\r\n [name$3]: 'fire-fst',\r\n [name$1]: 'fire-fst-compat',\r\n [name$2]: 'fire-vertex',\r\n 'fire-js': 'fire-js',\r\n [name]: 'fire-js-all'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @internal\r\n */\r\nconst _apps = new Map();\r\n/**\r\n * @internal\r\n */\r\nconst _serverApps = new Map();\r\n/**\r\n * Registered components.\r\n *\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst _components = new Map();\r\n/**\r\n * @param component - the component being added to this app's container\r\n *\r\n * @internal\r\n */\r\nfunction _addComponent(app, component) {\r\n try {\r\n app.container.addComponent(component);\r\n }\r\n catch (e) {\r\n logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app.name}`, e);\r\n }\r\n}\r\n/**\r\n *\r\n * @internal\r\n */\r\nfunction _addOrOverwriteComponent(app, component) {\r\n app.container.addOrOverwriteComponent(component);\r\n}\r\n/**\r\n *\r\n * @param component - the component to register\r\n * @returns whether or not the component is registered successfully\r\n *\r\n * @internal\r\n */\r\nfunction _registerComponent(component) {\r\n const componentName = component.name;\r\n if (_components.has(componentName)) {\r\n logger.debug(`There were multiple attempts to register component ${componentName}.`);\r\n return false;\r\n }\r\n _components.set(componentName, component);\r\n // add the component to existing app instances\r\n for (const app of _apps.values()) {\r\n _addComponent(app, component);\r\n }\r\n for (const serverApp of _serverApps.values()) {\r\n _addComponent(serverApp, component);\r\n }\r\n return true;\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n *\r\n * @returns the provider for the service with the matching name\r\n *\r\n * @internal\r\n */\r\nfunction _getProvider(app, name) {\r\n const heartbeatController = app.container\r\n .getProvider('heartbeat')\r\n .getImmediate({ optional: true });\r\n if (heartbeatController) {\r\n void heartbeatController.triggerHeartbeat();\r\n }\r\n return app.container.getProvider(name);\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n * @param instanceIdentifier - service instance identifier in case the service supports multiple instances\r\n *\r\n * @internal\r\n */\r\nfunction _removeServiceInstance(app, name, instanceIdentifier = DEFAULT_ENTRY_NAME) {\r\n _getProvider(app, name).clearInstance(instanceIdentifier);\r\n}\r\n/**\r\n *\r\n * @param obj - an object of type FirebaseApp or FirebaseOptions.\r\n *\r\n * @returns true if the provide object is of type FirebaseApp.\r\n *\r\n * @internal\r\n */\r\nfunction _isFirebaseApp(obj) {\r\n return obj.options !== undefined;\r\n}\r\n/**\r\n *\r\n * @param obj - an object of type FirebaseApp.\r\n *\r\n * @returns true if the provided object is of type FirebaseServerAppImpl.\r\n *\r\n * @internal\r\n */\r\nfunction _isFirebaseServerApp(obj) {\r\n return obj.settings !== undefined;\r\n}\r\n/**\r\n * Test only\r\n *\r\n * @internal\r\n */\r\nfunction _clearComponents() {\r\n _components.clear();\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst ERRORS = {\r\n [\"no-app\" /* AppError.NO_APP */]: \"No Firebase App '{$appName}' has been created - \" +\r\n 'call initializeApp() first',\r\n [\"bad-app-name\" /* AppError.BAD_APP_NAME */]: \"Illegal App name: '{$appName}'\",\r\n [\"duplicate-app\" /* AppError.DUPLICATE_APP */]: \"Firebase App named '{$appName}' already exists with different options or config\",\r\n [\"app-deleted\" /* AppError.APP_DELETED */]: \"Firebase App named '{$appName}' already deleted\",\r\n [\"server-app-deleted\" /* AppError.SERVER_APP_DELETED */]: 'Firebase Server App has been deleted',\r\n [\"no-options\" /* AppError.NO_OPTIONS */]: 'Need to provide options, when not being deployed to hosting via source.',\r\n [\"invalid-app-argument\" /* AppError.INVALID_APP_ARGUMENT */]: 'firebase.{$appName}() takes either no argument or a ' +\r\n 'Firebase App instance.',\r\n [\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */]: 'First argument to `onLog` must be null or a function.',\r\n [\"idb-open\" /* AppError.IDB_OPEN */]: 'Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-get\" /* AppError.IDB_GET */]: 'Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-set\" /* AppError.IDB_WRITE */]: 'Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"idb-delete\" /* AppError.IDB_DELETE */]: 'Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.',\r\n [\"finalization-registry-not-supported\" /* AppError.FINALIZATION_REGISTRY_NOT_SUPPORTED */]: 'FirebaseServerApp deleteOnDeref field defined but the JS runtime does not support FinalizationRegistry.',\r\n [\"invalid-server-app-environment\" /* AppError.INVALID_SERVER_APP_ENVIRONMENT */]: 'FirebaseServerApp is not for use in browser environments.'\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory('app', 'Firebase', ERRORS);\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass FirebaseAppImpl {\r\n constructor(options, config, container) {\r\n this._isDeleted = false;\r\n this._options = Object.assign({}, options);\r\n this._config = Object.assign({}, config);\r\n this._name = config.name;\r\n this._automaticDataCollectionEnabled =\r\n config.automaticDataCollectionEnabled;\r\n this._container = container;\r\n this.container.addComponent(new Component('app', () => this, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n }\r\n get automaticDataCollectionEnabled() {\r\n this.checkDestroyed();\r\n return this._automaticDataCollectionEnabled;\r\n }\r\n set automaticDataCollectionEnabled(val) {\r\n this.checkDestroyed();\r\n this._automaticDataCollectionEnabled = val;\r\n }\r\n get name() {\r\n this.checkDestroyed();\r\n return this._name;\r\n }\r\n get options() {\r\n this.checkDestroyed();\r\n return this._options;\r\n }\r\n get config() {\r\n this.checkDestroyed();\r\n return this._config;\r\n }\r\n get container() {\r\n return this._container;\r\n }\r\n get isDeleted() {\r\n return this._isDeleted;\r\n }\r\n set isDeleted(val) {\r\n this._isDeleted = val;\r\n }\r\n /**\r\n * This function will throw an Error if the App has already been deleted -\r\n * use before performing API actions on the App.\r\n */\r\n checkDestroyed() {\r\n if (this.isDeleted) {\r\n throw ERROR_FACTORY.create(\"app-deleted\" /* AppError.APP_DELETED */, { appName: this._name });\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2023 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass FirebaseServerAppImpl extends FirebaseAppImpl {\r\n constructor(options, serverConfig, name, container) {\r\n // Build configuration parameters for the FirebaseAppImpl base class.\r\n const automaticDataCollectionEnabled = serverConfig.automaticDataCollectionEnabled !== undefined\r\n ? serverConfig.automaticDataCollectionEnabled\r\n : false;\r\n // Create the FirebaseAppSettings object for the FirebaseAppImp constructor.\r\n const config = {\r\n name,\r\n automaticDataCollectionEnabled\r\n };\r\n if (options.apiKey !== undefined) {\r\n // Construct the parent FirebaseAppImp object.\r\n super(options, config, container);\r\n }\r\n else {\r\n const appImpl = options;\r\n super(appImpl.options, config, container);\r\n }\r\n // Now construct the data for the FirebaseServerAppImpl.\r\n this._serverConfig = Object.assign({ automaticDataCollectionEnabled }, serverConfig);\r\n this._finalizationRegistry = null;\r\n if (typeof FinalizationRegistry !== 'undefined') {\r\n this._finalizationRegistry = new FinalizationRegistry(() => {\r\n this.automaticCleanup();\r\n });\r\n }\r\n this._refCount = 0;\r\n this.incRefCount(this._serverConfig.releaseOnDeref);\r\n // Do not retain a hard reference to the dref object, otherwise the FinalizationRegistry\r\n // will never trigger.\r\n this._serverConfig.releaseOnDeref = undefined;\r\n serverConfig.releaseOnDeref = undefined;\r\n registerVersion(name$q, version$1, 'serverapp');\r\n }\r\n toJSON() {\r\n return undefined;\r\n }\r\n get refCount() {\r\n return this._refCount;\r\n }\r\n // Increment the reference count of this server app. If an object is provided, register it\r\n // with the finalization registry.\r\n incRefCount(obj) {\r\n if (this.isDeleted) {\r\n return;\r\n }\r\n this._refCount++;\r\n if (obj !== undefined && this._finalizationRegistry !== null) {\r\n this._finalizationRegistry.register(obj, this);\r\n }\r\n }\r\n // Decrement the reference count.\r\n decRefCount() {\r\n if (this.isDeleted) {\r\n return 0;\r\n }\r\n return --this._refCount;\r\n }\r\n // Invoked by the FinalizationRegistry callback to note that this app should go through its\r\n // reference counts and delete itself if no reference count remain. The coordinating logic that\r\n // handles this is in deleteApp(...).\r\n automaticCleanup() {\r\n void deleteApp(this);\r\n }\r\n get settings() {\r\n this.checkDestroyed();\r\n return this._serverConfig;\r\n }\r\n /**\r\n * This function will throw an Error if the App has already been deleted -\r\n * use before performing API actions on the App.\r\n */\r\n checkDestroyed() {\r\n if (this.isDeleted) {\r\n throw ERROR_FACTORY.create(\"server-app-deleted\" /* AppError.SERVER_APP_DELETED */);\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The current SDK version.\r\n *\r\n * @public\r\n */\r\nconst SDK_VERSION = version;\r\nfunction initializeApp(_options, rawConfig = {}) {\r\n let options = _options;\r\n if (typeof rawConfig !== 'object') {\r\n const name = rawConfig;\r\n rawConfig = { name };\r\n }\r\n const config = Object.assign({ name: DEFAULT_ENTRY_NAME, automaticDataCollectionEnabled: false }, rawConfig);\r\n const name = config.name;\r\n if (typeof name !== 'string' || !name) {\r\n throw ERROR_FACTORY.create(\"bad-app-name\" /* AppError.BAD_APP_NAME */, {\r\n appName: String(name)\r\n });\r\n }\r\n options || (options = getDefaultAppConfig());\r\n if (!options) {\r\n throw ERROR_FACTORY.create(\"no-options\" /* AppError.NO_OPTIONS */);\r\n }\r\n const existingApp = _apps.get(name);\r\n if (existingApp) {\r\n // return the existing app if options and config deep equal the ones in the existing app.\r\n if (deepEqual(options, existingApp.options) &&\r\n deepEqual(config, existingApp.config)) {\r\n return existingApp;\r\n }\r\n else {\r\n throw ERROR_FACTORY.create(\"duplicate-app\" /* AppError.DUPLICATE_APP */, { appName: name });\r\n }\r\n }\r\n const container = new ComponentContainer(name);\r\n for (const component of _components.values()) {\r\n container.addComponent(component);\r\n }\r\n const newApp = new FirebaseAppImpl(options, config, container);\r\n _apps.set(name, newApp);\r\n return newApp;\r\n}\r\nfunction initializeServerApp(_options, _serverAppConfig) {\r\n if (isBrowser() && !isWebWorker()) {\r\n // FirebaseServerApp isn't designed to be run in browsers.\r\n throw ERROR_FACTORY.create(\"invalid-server-app-environment\" /* AppError.INVALID_SERVER_APP_ENVIRONMENT */);\r\n }\r\n if (_serverAppConfig.automaticDataCollectionEnabled === undefined) {\r\n _serverAppConfig.automaticDataCollectionEnabled = false;\r\n }\r\n let appOptions;\r\n if (_isFirebaseApp(_options)) {\r\n appOptions = _options.options;\r\n }\r\n else {\r\n appOptions = _options;\r\n }\r\n // Build an app name based on a hash of the configuration options.\r\n const nameObj = Object.assign(Object.assign({}, _serverAppConfig), appOptions);\r\n // However, Do not mangle the name based on releaseOnDeref, since it will vary between the\r\n // construction of FirebaseServerApp instances. For example, if the object is the request headers.\r\n if (nameObj.releaseOnDeref !== undefined) {\r\n delete nameObj.releaseOnDeref;\r\n }\r\n const hashCode = (s) => {\r\n return [...s].reduce((hash, c) => (Math.imul(31, hash) + c.charCodeAt(0)) | 0, 0);\r\n };\r\n if (_serverAppConfig.releaseOnDeref !== undefined) {\r\n if (typeof FinalizationRegistry === 'undefined') {\r\n throw ERROR_FACTORY.create(\"finalization-registry-not-supported\" /* AppError.FINALIZATION_REGISTRY_NOT_SUPPORTED */, {});\r\n }\r\n }\r\n const nameString = '' + hashCode(JSON.stringify(nameObj));\r\n const existingApp = _serverApps.get(nameString);\r\n if (existingApp) {\r\n existingApp.incRefCount(_serverAppConfig.releaseOnDeref);\r\n return existingApp;\r\n }\r\n const container = new ComponentContainer(nameString);\r\n for (const component of _components.values()) {\r\n container.addComponent(component);\r\n }\r\n const newApp = new FirebaseServerAppImpl(appOptions, _serverAppConfig, nameString, container);\r\n _serverApps.set(nameString, newApp);\r\n return newApp;\r\n}\r\n/**\r\n * Retrieves a {@link @firebase/app#FirebaseApp} instance.\r\n *\r\n * When called with no arguments, the default app is returned. When an app name\r\n * is provided, the app corresponding to that name is returned.\r\n *\r\n * An exception is thrown if the app being retrieved has not yet been\r\n * initialized.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return the default app\r\n * const app = getApp();\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return a named app\r\n * const otherApp = getApp(\"otherApp\");\r\n * ```\r\n *\r\n * @param name - Optional name of the app to return. If no name is\r\n * provided, the default is `\"[DEFAULT]\"`.\r\n *\r\n * @returns The app corresponding to the provided app name.\r\n * If no app name is provided, the default app is returned.\r\n *\r\n * @public\r\n */\r\nfunction getApp(name = DEFAULT_ENTRY_NAME) {\r\n const app = _apps.get(name);\r\n if (!app && name === DEFAULT_ENTRY_NAME && getDefaultAppConfig()) {\r\n return initializeApp();\r\n }\r\n if (!app) {\r\n throw ERROR_FACTORY.create(\"no-app\" /* AppError.NO_APP */, { appName: name });\r\n }\r\n return app;\r\n}\r\n/**\r\n * A (read-only) array of all initialized apps.\r\n * @public\r\n */\r\nfunction getApps() {\r\n return Array.from(_apps.values());\r\n}\r\n/**\r\n * Renders this app unusable and frees the resources of all associated\r\n * services.\r\n *\r\n * @example\r\n * ```javascript\r\n * deleteApp(app)\r\n * .then(function() {\r\n * console.log(\"App deleted successfully\");\r\n * })\r\n * .catch(function(error) {\r\n * console.log(\"Error deleting app:\", error);\r\n * });\r\n * ```\r\n *\r\n * @public\r\n */\r\nasync function deleteApp(app) {\r\n let cleanupProviders = false;\r\n const name = app.name;\r\n if (_apps.has(name)) {\r\n cleanupProviders = true;\r\n _apps.delete(name);\r\n }\r\n else if (_serverApps.has(name)) {\r\n const firebaseServerApp = app;\r\n if (firebaseServerApp.decRefCount() <= 0) {\r\n _serverApps.delete(name);\r\n cleanupProviders = true;\r\n }\r\n }\r\n if (cleanupProviders) {\r\n await Promise.all(app.container\r\n .getProviders()\r\n .map(provider => provider.delete()));\r\n app.isDeleted = true;\r\n }\r\n}\r\n/**\r\n * Registers a library's name and version for platform logging purposes.\r\n * @param library - Name of 1p or 3p library (e.g. firestore, angularfire)\r\n * @param version - Current version of that library.\r\n * @param variant - Bundle variant, e.g., node, rn, etc.\r\n *\r\n * @public\r\n */\r\nfunction registerVersion(libraryKeyOrName, version, variant) {\r\n var _a;\r\n // TODO: We can use this check to whitelist strings when/if we set up\r\n // a good whitelist system.\r\n let library = (_a = PLATFORM_LOG_STRING[libraryKeyOrName]) !== null && _a !== void 0 ? _a : libraryKeyOrName;\r\n if (variant) {\r\n library += `-${variant}`;\r\n }\r\n const libraryMismatch = library.match(/\\s|\\//);\r\n const versionMismatch = version.match(/\\s|\\//);\r\n if (libraryMismatch || versionMismatch) {\r\n const warning = [\r\n `Unable to register library \"${library}\" with version \"${version}\":`\r\n ];\r\n if (libraryMismatch) {\r\n warning.push(`library name \"${library}\" contains illegal characters (whitespace or \"/\")`);\r\n }\r\n if (libraryMismatch && versionMismatch) {\r\n warning.push('and');\r\n }\r\n if (versionMismatch) {\r\n warning.push(`version name \"${version}\" contains illegal characters (whitespace or \"/\")`);\r\n }\r\n logger.warn(warning.join(' '));\r\n return;\r\n }\r\n _registerComponent(new Component(`${library}-version`, () => ({ library, version }), \"VERSION\" /* ComponentType.VERSION */));\r\n}\r\n/**\r\n * Sets log handler for all Firebase SDKs.\r\n * @param logCallback - An optional custom log handler that executes user code whenever\r\n * the Firebase SDK makes a logging call.\r\n *\r\n * @public\r\n */\r\nfunction onLog(logCallback, options) {\r\n if (logCallback !== null && typeof logCallback !== 'function') {\r\n throw ERROR_FACTORY.create(\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */);\r\n }\r\n setUserLogHandler(logCallback, options);\r\n}\r\n/**\r\n * Sets log level for all Firebase SDKs.\r\n *\r\n * All of the log types above the current log level are captured (i.e. if\r\n * you set the log level to `info`, errors are logged, but `debug` and\r\n * `verbose` logs are not).\r\n *\r\n * @public\r\n */\r\nfunction setLogLevel(logLevel) {\r\n setLogLevel$1(logLevel);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DB_NAME = 'firebase-heartbeat-database';\r\nconst DB_VERSION = 1;\r\nconst STORE_NAME = 'firebase-heartbeat-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n if (!dbPromise) {\r\n dbPromise = openDB(DB_NAME, DB_VERSION, {\r\n upgrade: (db, oldVersion) => {\r\n // We don't use 'break' in this switch statement, the fall-through\r\n // behavior is what we want, because if there are multiple versions between\r\n // the old version and the current version, we want ALL the migrations\r\n // that correspond to those versions to run, not only the last one.\r\n // eslint-disable-next-line default-case\r\n switch (oldVersion) {\r\n case 0:\r\n try {\r\n db.createObjectStore(STORE_NAME);\r\n }\r\n catch (e) {\r\n // Safari/iOS browsers throw occasional exceptions on\r\n // db.createObjectStore() that may be a bug. Avoid blocking\r\n // the rest of the app functionality.\r\n console.warn(e);\r\n }\r\n }\r\n }\r\n }).catch(e => {\r\n throw ERROR_FACTORY.create(\"idb-open\" /* AppError.IDB_OPEN */, {\r\n originalErrorMessage: e.message\r\n });\r\n });\r\n }\r\n return dbPromise;\r\n}\r\nasync function readHeartbeatsFromIndexedDB(app) {\r\n try {\r\n const db = await getDbPromise();\r\n const tx = db.transaction(STORE_NAME);\r\n const result = await tx.objectStore(STORE_NAME).get(computeKey(app));\r\n // We already have the value but tx.done can throw,\r\n // so we need to await it here to catch errors\r\n await tx.done;\r\n return result;\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError) {\r\n logger.warn(e.message);\r\n }\r\n else {\r\n const idbGetError = ERROR_FACTORY.create(\"idb-get\" /* AppError.IDB_GET */, {\r\n originalErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n logger.warn(idbGetError.message);\r\n }\r\n }\r\n}\r\nasync function writeHeartbeatsToIndexedDB(app, heartbeatObject) {\r\n try {\r\n const db = await getDbPromise();\r\n const tx = db.transaction(STORE_NAME, 'readwrite');\r\n const objectStore = tx.objectStore(STORE_NAME);\r\n await objectStore.put(heartbeatObject, computeKey(app));\r\n await tx.done;\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError) {\r\n logger.warn(e.message);\r\n }\r\n else {\r\n const idbGetError = ERROR_FACTORY.create(\"idb-set\" /* AppError.IDB_WRITE */, {\r\n originalErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n logger.warn(idbGetError.message);\r\n }\r\n }\r\n}\r\nfunction computeKey(app) {\r\n return `${app.name}!${app.options.appId}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst MAX_HEADER_BYTES = 1024;\r\n// 30 days\r\nconst STORED_HEARTBEAT_RETENTION_MAX_MILLIS = 30 * 24 * 60 * 60 * 1000;\r\nclass HeartbeatServiceImpl {\r\n constructor(container) {\r\n this.container = container;\r\n /**\r\n * In-memory cache for heartbeats, used by getHeartbeatsHeader() to generate\r\n * the header string.\r\n * Stores one record per date. This will be consolidated into the standard\r\n * format of one record per user agent string before being sent as a header.\r\n * Populated from indexedDB when the controller is instantiated and should\r\n * be kept in sync with indexedDB.\r\n * Leave public for easier testing.\r\n */\r\n this._heartbeatsCache = null;\r\n const app = this.container.getProvider('app').getImmediate();\r\n this._storage = new HeartbeatStorageImpl(app);\r\n this._heartbeatsCachePromise = this._storage.read().then(result => {\r\n this._heartbeatsCache = result;\r\n return result;\r\n });\r\n }\r\n /**\r\n * Called to report a heartbeat. The function will generate\r\n * a HeartbeatsByUserAgent object, update heartbeatsCache, and persist it\r\n * to IndexedDB.\r\n * Note that we only store one heartbeat per day. So if a heartbeat for today is\r\n * already logged, subsequent calls to this function in the same day will be ignored.\r\n */\r\n async triggerHeartbeat() {\r\n var _a, _b;\r\n try {\r\n const platformLogger = this.container\r\n .getProvider('platform-logger')\r\n .getImmediate();\r\n // This is the \"Firebase user agent\" string from the platform logger\r\n // service, not the browser user agent.\r\n const agent = platformLogger.getPlatformInfoString();\r\n const date = getUTCDateString();\r\n if (((_a = this._heartbeatsCache) === null || _a === void 0 ? void 0 : _a.heartbeats) == null) {\r\n this._heartbeatsCache = await this._heartbeatsCachePromise;\r\n // If we failed to construct a heartbeats cache, then return immediately.\r\n if (((_b = this._heartbeatsCache) === null || _b === void 0 ? void 0 : _b.heartbeats) == null) {\r\n return;\r\n }\r\n }\r\n // Do not store a heartbeat if one is already stored for this day\r\n // or if a header has already been sent today.\r\n if (this._heartbeatsCache.lastSentHeartbeatDate === date ||\r\n this._heartbeatsCache.heartbeats.some(singleDateHeartbeat => singleDateHeartbeat.date === date)) {\r\n return;\r\n }\r\n else {\r\n // There is no entry for this date. Create one.\r\n this._heartbeatsCache.heartbeats.push({ date, agent });\r\n }\r\n // Remove entries older than 30 days.\r\n this._heartbeatsCache.heartbeats =\r\n this._heartbeatsCache.heartbeats.filter(singleDateHeartbeat => {\r\n const hbTimestamp = new Date(singleDateHeartbeat.date).valueOf();\r\n const now = Date.now();\r\n return now - hbTimestamp <= STORED_HEARTBEAT_RETENTION_MAX_MILLIS;\r\n });\r\n return this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n catch (e) {\r\n logger.warn(e);\r\n }\r\n }\r\n /**\r\n * Returns a base64 encoded string which can be attached to the heartbeat-specific header directly.\r\n * It also clears all heartbeats from memory as well as in IndexedDB.\r\n *\r\n * NOTE: Consuming product SDKs should not send the header if this method\r\n * returns an empty string.\r\n */\r\n async getHeartbeatsHeader() {\r\n var _a;\r\n try {\r\n if (this._heartbeatsCache === null) {\r\n await this._heartbeatsCachePromise;\r\n }\r\n // If it's still null or the array is empty, there is no data to send.\r\n if (((_a = this._heartbeatsCache) === null || _a === void 0 ? void 0 : _a.heartbeats) == null ||\r\n this._heartbeatsCache.heartbeats.length === 0) {\r\n return '';\r\n }\r\n const date = getUTCDateString();\r\n // Extract as many heartbeats from the cache as will fit under the size limit.\r\n const { heartbeatsToSend, unsentEntries } = extractHeartbeatsForHeader(this._heartbeatsCache.heartbeats);\r\n const headerString = base64urlEncodeWithoutPadding(JSON.stringify({ version: 2, heartbeats: heartbeatsToSend }));\r\n // Store last sent date to prevent another being logged/sent for the same day.\r\n this._heartbeatsCache.lastSentHeartbeatDate = date;\r\n if (unsentEntries.length > 0) {\r\n // Store any unsent entries if they exist.\r\n this._heartbeatsCache.heartbeats = unsentEntries;\r\n // This seems more likely than emptying the array (below) to lead to some odd state\r\n // since the cache isn't empty and this will be called again on the next request,\r\n // and is probably safest if we await it.\r\n await this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n else {\r\n this._heartbeatsCache.heartbeats = [];\r\n // Do not wait for this, to reduce latency.\r\n void this._storage.overwrite(this._heartbeatsCache);\r\n }\r\n return headerString;\r\n }\r\n catch (e) {\r\n logger.warn(e);\r\n return '';\r\n }\r\n }\r\n}\r\nfunction getUTCDateString() {\r\n const today = new Date();\r\n // Returns date format 'YYYY-MM-DD'\r\n return today.toISOString().substring(0, 10);\r\n}\r\nfunction extractHeartbeatsForHeader(heartbeatsCache, maxSize = MAX_HEADER_BYTES) {\r\n // Heartbeats grouped by user agent in the standard format to be sent in\r\n // the header.\r\n const heartbeatsToSend = [];\r\n // Single date format heartbeats that are not sent.\r\n let unsentEntries = heartbeatsCache.slice();\r\n for (const singleDateHeartbeat of heartbeatsCache) {\r\n // Look for an existing entry with the same user agent.\r\n const heartbeatEntry = heartbeatsToSend.find(hb => hb.agent === singleDateHeartbeat.agent);\r\n if (!heartbeatEntry) {\r\n // If no entry for this user agent exists, create one.\r\n heartbeatsToSend.push({\r\n agent: singleDateHeartbeat.agent,\r\n dates: [singleDateHeartbeat.date]\r\n });\r\n if (countBytes(heartbeatsToSend) > maxSize) {\r\n // If the header would exceed max size, remove the added heartbeat\r\n // entry and stop adding to the header.\r\n heartbeatsToSend.pop();\r\n break;\r\n }\r\n }\r\n else {\r\n heartbeatEntry.dates.push(singleDateHeartbeat.date);\r\n // If the header would exceed max size, remove the added date\r\n // and stop adding to the header.\r\n if (countBytes(heartbeatsToSend) > maxSize) {\r\n heartbeatEntry.dates.pop();\r\n break;\r\n }\r\n }\r\n // Pop unsent entry from queue. (Skipped if adding the entry exceeded\r\n // quota and the loop breaks early.)\r\n unsentEntries = unsentEntries.slice(1);\r\n }\r\n return {\r\n heartbeatsToSend,\r\n unsentEntries\r\n };\r\n}\r\nclass HeartbeatStorageImpl {\r\n constructor(app) {\r\n this.app = app;\r\n this._canUseIndexedDBPromise = this.runIndexedDBEnvironmentCheck();\r\n }\r\n async runIndexedDBEnvironmentCheck() {\r\n if (!isIndexedDBAvailable()) {\r\n return false;\r\n }\r\n else {\r\n return validateIndexedDBOpenable()\r\n .then(() => true)\r\n .catch(() => false);\r\n }\r\n }\r\n /**\r\n * Read all heartbeats.\r\n */\r\n async read() {\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return { heartbeats: [] };\r\n }\r\n else {\r\n const idbHeartbeatObject = await readHeartbeatsFromIndexedDB(this.app);\r\n if (idbHeartbeatObject === null || idbHeartbeatObject === void 0 ? void 0 : idbHeartbeatObject.heartbeats) {\r\n return idbHeartbeatObject;\r\n }\r\n else {\r\n return { heartbeats: [] };\r\n }\r\n }\r\n }\r\n // overwrite the storage with the provided heartbeats\r\n async overwrite(heartbeatsObject) {\r\n var _a;\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return;\r\n }\r\n else {\r\n const existingHeartbeatsObject = await this.read();\r\n return writeHeartbeatsToIndexedDB(this.app, {\r\n lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n heartbeats: heartbeatsObject.heartbeats\r\n });\r\n }\r\n }\r\n // add heartbeats\r\n async add(heartbeatsObject) {\r\n var _a;\r\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n if (!canUseIndexedDB) {\r\n return;\r\n }\r\n else {\r\n const existingHeartbeatsObject = await this.read();\r\n return writeHeartbeatsToIndexedDB(this.app, {\r\n lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n heartbeats: [\r\n ...existingHeartbeatsObject.heartbeats,\r\n ...heartbeatsObject.heartbeats\r\n ]\r\n });\r\n }\r\n }\r\n}\r\n/**\r\n * Calculate bytes of a HeartbeatsByUserAgent array after being wrapped\r\n * in a platform logging header JSON object, stringified, and converted\r\n * to base 64.\r\n */\r\nfunction countBytes(heartbeatsCache) {\r\n // base64 has a restricted set of characters, all of which should be 1 byte.\r\n return base64urlEncodeWithoutPadding(\r\n // heartbeatsCache wrapper properties\r\n JSON.stringify({ version: 2, heartbeats: heartbeatsCache })).length;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction registerCoreComponents(variant) {\r\n _registerComponent(new Component('platform-logger', container => new PlatformLoggerServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n _registerComponent(new Component('heartbeat', container => new HeartbeatServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n // Register `app` package.\r\n registerVersion(name$q, version$1, variant);\r\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n registerVersion(name$q, version$1, 'esm2017');\r\n // Register platform SDK identifier (no version).\r\n registerVersion('fire-js', '');\r\n}\n\n/**\r\n * Firebase App\r\n *\r\n * @remarks This package coordinates the communication between the different Firebase components\r\n * @packageDocumentation\r\n */\r\nregisterCoreComponents('');\n\nexport { SDK_VERSION, DEFAULT_ENTRY_NAME as _DEFAULT_ENTRY_NAME, _addComponent, _addOrOverwriteComponent, _apps, _clearComponents, _components, _getProvider, _isFirebaseApp, _isFirebaseServerApp, _registerComponent, _removeServiceInstance, _serverApps, deleteApp, getApp, getApps, initializeApp, initializeServerApp, onLog, registerVersion, setLogLevel };\n//# sourceMappingURL=index.esm2017.js.map\n","import { registerVersion } from '@firebase/app';\nexport * from '@firebase/app';\n\nvar name = \"firebase\";\nvar version = \"10.14.1\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nregisterVersion(name, version, 'app');\n//# sourceMappingURL=index.esm.js.map\n","var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nvar bloom_blob_es2018 = {};\n\n/** @license\nCopyright The Closure Library Authors.\nSPDX-License-Identifier: Apache-2.0\n*/\n\nvar Integer;\nvar Md5;\n(function() {var h;/** @license\n\n Copyright The Closure Library Authors.\n SPDX-License-Identifier: Apache-2.0\n*/\nfunction k(f,a){function c(){}c.prototype=a.prototype;f.D=a.prototype;f.prototype=new c;f.prototype.constructor=f;f.C=function(d,e,g){for(var b=Array(arguments.length-2),r=2;re;++e)d[e]=a.charCodeAt(c++)|a.charCodeAt(c++)<<8|a.charCodeAt(c++)<<16|a.charCodeAt(c++)<<24;else for(e=0;16>e;++e)d[e]=a[c++]|a[c++]<<8|a[c++]<<16|a[c++]<<24;a=f.g[0];c=f.g[1];e=f.g[2];var g=f.g[3];var b=a+(g^c&(e^g))+d[0]+3614090360&4294967295;a=c+(b<<7&4294967295|b>>>25);b=g+(e^a&(c^e))+d[1]+3905402710&4294967295;g=a+(b<<12&4294967295|b>>>20);b=e+(c^g&(a^c))+d[2]+606105819&4294967295;e=g+(b<<17&4294967295|b>>>15);\nb=c+(a^e&(g^a))+d[3]+3250441966&4294967295;c=e+(b<<22&4294967295|b>>>10);b=a+(g^c&(e^g))+d[4]+4118548399&4294967295;a=c+(b<<7&4294967295|b>>>25);b=g+(e^a&(c^e))+d[5]+1200080426&4294967295;g=a+(b<<12&4294967295|b>>>20);b=e+(c^g&(a^c))+d[6]+2821735955&4294967295;e=g+(b<<17&4294967295|b>>>15);b=c+(a^e&(g^a))+d[7]+4249261313&4294967295;c=e+(b<<22&4294967295|b>>>10);b=a+(g^c&(e^g))+d[8]+1770035416&4294967295;a=c+(b<<7&4294967295|b>>>25);b=g+(e^a&(c^e))+d[9]+2336552879&4294967295;g=a+(b<<12&4294967295|\nb>>>20);b=e+(c^g&(a^c))+d[10]+4294925233&4294967295;e=g+(b<<17&4294967295|b>>>15);b=c+(a^e&(g^a))+d[11]+2304563134&4294967295;c=e+(b<<22&4294967295|b>>>10);b=a+(g^c&(e^g))+d[12]+1804603682&4294967295;a=c+(b<<7&4294967295|b>>>25);b=g+(e^a&(c^e))+d[13]+4254626195&4294967295;g=a+(b<<12&4294967295|b>>>20);b=e+(c^g&(a^c))+d[14]+2792965006&4294967295;e=g+(b<<17&4294967295|b>>>15);b=c+(a^e&(g^a))+d[15]+1236535329&4294967295;c=e+(b<<22&4294967295|b>>>10);b=a+(e^g&(c^e))+d[1]+4129170786&4294967295;a=c+(b<<\n5&4294967295|b>>>27);b=g+(c^e&(a^c))+d[6]+3225465664&4294967295;g=a+(b<<9&4294967295|b>>>23);b=e+(a^c&(g^a))+d[11]+643717713&4294967295;e=g+(b<<14&4294967295|b>>>18);b=c+(g^a&(e^g))+d[0]+3921069994&4294967295;c=e+(b<<20&4294967295|b>>>12);b=a+(e^g&(c^e))+d[5]+3593408605&4294967295;a=c+(b<<5&4294967295|b>>>27);b=g+(c^e&(a^c))+d[10]+38016083&4294967295;g=a+(b<<9&4294967295|b>>>23);b=e+(a^c&(g^a))+d[15]+3634488961&4294967295;e=g+(b<<14&4294967295|b>>>18);b=c+(g^a&(e^g))+d[4]+3889429448&4294967295;c=\ne+(b<<20&4294967295|b>>>12);b=a+(e^g&(c^e))+d[9]+568446438&4294967295;a=c+(b<<5&4294967295|b>>>27);b=g+(c^e&(a^c))+d[14]+3275163606&4294967295;g=a+(b<<9&4294967295|b>>>23);b=e+(a^c&(g^a))+d[3]+4107603335&4294967295;e=g+(b<<14&4294967295|b>>>18);b=c+(g^a&(e^g))+d[8]+1163531501&4294967295;c=e+(b<<20&4294967295|b>>>12);b=a+(e^g&(c^e))+d[13]+2850285829&4294967295;a=c+(b<<5&4294967295|b>>>27);b=g+(c^e&(a^c))+d[2]+4243563512&4294967295;g=a+(b<<9&4294967295|b>>>23);b=e+(a^c&(g^a))+d[7]+1735328473&4294967295;\ne=g+(b<<14&4294967295|b>>>18);b=c+(g^a&(e^g))+d[12]+2368359562&4294967295;c=e+(b<<20&4294967295|b>>>12);b=a+(c^e^g)+d[5]+4294588738&4294967295;a=c+(b<<4&4294967295|b>>>28);b=g+(a^c^e)+d[8]+2272392833&4294967295;g=a+(b<<11&4294967295|b>>>21);b=e+(g^a^c)+d[11]+1839030562&4294967295;e=g+(b<<16&4294967295|b>>>16);b=c+(e^g^a)+d[14]+4259657740&4294967295;c=e+(b<<23&4294967295|b>>>9);b=a+(c^e^g)+d[1]+2763975236&4294967295;a=c+(b<<4&4294967295|b>>>28);b=g+(a^c^e)+d[4]+1272893353&4294967295;g=a+(b<<11&4294967295|\nb>>>21);b=e+(g^a^c)+d[7]+4139469664&4294967295;e=g+(b<<16&4294967295|b>>>16);b=c+(e^g^a)+d[10]+3200236656&4294967295;c=e+(b<<23&4294967295|b>>>9);b=a+(c^e^g)+d[13]+681279174&4294967295;a=c+(b<<4&4294967295|b>>>28);b=g+(a^c^e)+d[0]+3936430074&4294967295;g=a+(b<<11&4294967295|b>>>21);b=e+(g^a^c)+d[3]+3572445317&4294967295;e=g+(b<<16&4294967295|b>>>16);b=c+(e^g^a)+d[6]+76029189&4294967295;c=e+(b<<23&4294967295|b>>>9);b=a+(c^e^g)+d[9]+3654602809&4294967295;a=c+(b<<4&4294967295|b>>>28);b=g+(a^c^e)+d[12]+\n3873151461&4294967295;g=a+(b<<11&4294967295|b>>>21);b=e+(g^a^c)+d[15]+530742520&4294967295;e=g+(b<<16&4294967295|b>>>16);b=c+(e^g^a)+d[2]+3299628645&4294967295;c=e+(b<<23&4294967295|b>>>9);b=a+(e^(c|~g))+d[0]+4096336452&4294967295;a=c+(b<<6&4294967295|b>>>26);b=g+(c^(a|~e))+d[7]+1126891415&4294967295;g=a+(b<<10&4294967295|b>>>22);b=e+(a^(g|~c))+d[14]+2878612391&4294967295;e=g+(b<<15&4294967295|b>>>17);b=c+(g^(e|~a))+d[5]+4237533241&4294967295;c=e+(b<<21&4294967295|b>>>11);b=a+(e^(c|~g))+d[12]+1700485571&\n4294967295;a=c+(b<<6&4294967295|b>>>26);b=g+(c^(a|~e))+d[3]+2399980690&4294967295;g=a+(b<<10&4294967295|b>>>22);b=e+(a^(g|~c))+d[10]+4293915773&4294967295;e=g+(b<<15&4294967295|b>>>17);b=c+(g^(e|~a))+d[1]+2240044497&4294967295;c=e+(b<<21&4294967295|b>>>11);b=a+(e^(c|~g))+d[8]+1873313359&4294967295;a=c+(b<<6&4294967295|b>>>26);b=g+(c^(a|~e))+d[15]+4264355552&4294967295;g=a+(b<<10&4294967295|b>>>22);b=e+(a^(g|~c))+d[6]+2734768916&4294967295;e=g+(b<<15&4294967295|b>>>17);b=c+(g^(e|~a))+d[13]+1309151649&\n4294967295;c=e+(b<<21&4294967295|b>>>11);b=a+(e^(c|~g))+d[4]+4149444226&4294967295;a=c+(b<<6&4294967295|b>>>26);b=g+(c^(a|~e))+d[11]+3174756917&4294967295;g=a+(b<<10&4294967295|b>>>22);b=e+(a^(g|~c))+d[2]+718787259&4294967295;e=g+(b<<15&4294967295|b>>>17);b=c+(g^(e|~a))+d[9]+3951481745&4294967295;f.g[0]=f.g[0]+a&4294967295;f.g[1]=f.g[1]+(e+(b<<21&4294967295|b>>>11))&4294967295;f.g[2]=f.g[2]+e&4294967295;f.g[3]=f.g[3]+g&4294967295;}\nm.prototype.u=function(f,a){void 0===a&&(a=f.length);for(var c=a-this.blockSize,d=this.B,e=this.h,g=0;gthis.h?this.blockSize:2*this.blockSize)-this.h);f[0]=128;for(var a=1;aa;++a)for(var d=0;32>d;d+=8)f[c++]=this.g[a]>>>d&255;return f};function p(f,a){var c=q;return Object.prototype.hasOwnProperty.call(c,f)?c[f]:c[f]=a(f)}function t(f,a){this.h=a;for(var c=[],d=!0,e=f.length-1;0<=e;e--){var g=f[e]|0;d&&g==a||(c[e]=g,d=!1);}this.g=c;}var q={};function u(f){return -128<=f&&128>f?p(f,function(a){return new t([a|0],0>a?-1:0)}):new t([f|0],0>f?-1:0)}function v(f){if(isNaN(f)||!isFinite(f))return w;if(0>f)return x(v(-f));for(var a=[],c=1,d=0;f>=c;d++)a[d]=f/c|0,c*=4294967296;return new t(a,0)}\nfunction y(f,a){if(0==f.length)throw Error(\"number format error: empty string\");a=a||10;if(2>a||36g?(g=v(Math.pow(a,g)),d=d.j(g).add(v(b))):(d=d.j(c),d=d.add(v(b)));}return d}var w=u(0),z=u(1),A=u(16777216);h=t.prototype;\nh.m=function(){if(B(this))return -x(this).m();for(var f=0,a=1,c=0;cf||36>>0).toString(f);c=e;if(C(c))return g+d;for(;6>g.length;)g=\"0\"+g;d=g+d;}};\nh.i=function(f){return 0>f?0:f>>16)+(this.i(e)>>>16)+(f.i(e)>>>16);d=b>>>16;g&=65535;b&=65535;c[e]=b<<16|g;}return new t(c,c[c.length-1]&-2147483648?-1:0)};function F(f,a){return f.add(x(a))}\nh.j=function(f){if(C(this)||C(f))return w;if(B(this))return B(f)?x(this).j(x(f)):x(x(this).j(f));if(B(f))return x(this.j(x(f)));if(0>this.l(A)&&0>f.l(A))return v(this.m()*f.m());for(var a=this.g.length+f.g.length,c=[],d=0;d<2*a;d++)c[d]=0;for(d=0;d>>16,b=this.i(d)&65535,r=f.i(e)>>>16,E=f.i(e)&65535;c[2*d+2*e]+=b*E;G(c,2*d+2*e);c[2*d+2*e+1]+=g*E;G(c,2*d+2*e+1);c[2*d+2*e+1]+=b*r;G(c,2*d+2*e+1);c[2*d+2*e+2]+=g*r;G(c,2*d+2*e+2);}for(d=0;d<\na;d++)c[d]=c[2*d+1]<<16|c[2*d];for(d=a;d<2*a;d++)c[d]=0;return new t(c,0)};function G(f,a){for(;(f[a]&65535)!=f[a];)f[a+1]+=f[a]>>>16,f[a]&=65535,a++;}function H(f,a){this.g=f;this.h=a;}\nfunction D(f,a){if(C(a))throw Error(\"division by zero\");if(C(f))return new H(w,w);if(B(f))return a=D(x(f),a),new H(x(a.g),x(a.h));if(B(a))return a=D(f,x(a)),new H(x(a.g),a.h);if(30=d.l(f);)c=I(c),d=I(d);var e=J(c,1),g=J(d,1);d=J(d,2);for(c=J(c,2);!C(d);){var b=g.add(d);0>=b.l(f)&&(e=e.add(c),g=b);d=J(d,1);c=J(c,1);}a=F(f,e.j(a));return new H(e,a)}for(e=w;0<=f.l(a);){c=Math.max(1,Math.floor(f.m()/\na.m()));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);g=v(c);for(b=g.j(a);B(b)||0>>31;return new t(c,f.h)}function J(f,a){var c=a>>5;a%=32;for(var d=f.g.length-c,e=[],g=0;g>>a|f.i(g+c+1)<<32-a:f.i(g+c);return new t(e,f.h)}m.prototype.digest=m.prototype.v;m.prototype.reset=m.prototype.s;m.prototype.update=m.prototype.u;Md5 = bloom_blob_es2018.Md5=m;t.prototype.add=t.prototype.add;t.prototype.multiply=t.prototype.j;t.prototype.modulo=t.prototype.A;t.prototype.compare=t.prototype.l;t.prototype.toNumber=t.prototype.m;t.prototype.toString=t.prototype.toString;t.prototype.getBits=t.prototype.i;t.fromNumber=v;t.fromString=y;Integer = bloom_blob_es2018.Integer=t;}).apply( typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : {});\n\nexport { Integer, Md5, bloom_blob_es2018 as default };\n//# sourceMappingURL=bloom_blob_es2018.js.map\n","var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nvar webchannel_blob_es2018 = {};\n\n/** @license\nCopyright The Closure Library Authors.\nSPDX-License-Identifier: Apache-2.0\n*/\n\nvar XhrIo;\nvar FetchXmlHttpFactory;\nvar WebChannel;\nvar EventType;\nvar ErrorCode;\nvar Stat;\nvar Event;\nvar getStatEventTarget;\nvar createWebChannelTransport;\n(function() {var h,aa=\"function\"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=[\"object\"==typeof globalThis&&globalThis,a,\"object\"==typeof window&&window,\"object\"==typeof self&&self,\"object\"==typeof commonjsGlobal&&commonjsGlobal];for(var b=0;b{throw a;},0);}function xa(){var a=za;let b=null;a.g&&(b=a.g,a.g=a.g.next,a.g||(a.h=null),b.next=null);return b}class Aa{constructor(){this.h=this.g=null;}add(a,b){const c=Ba.get();c.set(a,b);this.h?this.h.next=c:this.g=c;this.h=c;}}var Ba=new na(()=>new Ca,a=>a.reset());class Ca{constructor(){this.next=this.g=this.h=null;}set(a,b){this.h=a;this.g=b;this.next=null;}reset(){this.next=this.g=this.h=null;}}let x,y=!1,za=new Aa,Ea=()=>{const a=k.Promise.resolve(void 0);x=()=>{a.then(Da);};};var Da=()=>{for(var a;a=xa();){try{a.h.call(a.g);}catch(c){wa(c);}var b=Ba;b.j(a);100>b.h&&(b.h++,a.next=b.g,b.g=a);}y=!1;};function z(){this.s=this.s;this.C=this.C;}z.prototype.s=!1;z.prototype.ma=function(){this.s||(this.s=!0,this.N());};z.prototype.N=function(){if(this.C)for(;this.C.length;)this.C.shift()();};function A(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1;}A.prototype.h=function(){this.defaultPrevented=!0;};var Fa=function(){if(!k.addEventListener||!Object.defineProperty)return !1;var a=!1,b=Object.defineProperty({},\"passive\",{get:function(){a=!0;}});try{const c=()=>{};k.addEventListener(\"test\",c,b);k.removeEventListener(\"test\",c,b);}catch(c){}return a}();function C(a,b){A.call(this,a?a.type:\"\");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key=\"\";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType=\"\";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(pa){a:{try{oa(b.nodeName);var e=!0;break a}catch(f){}e=\n!1;}e||(b=null);}}else \"mouseover\"==c?b=a.fromElement:\"mouseout\"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||\"\";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=\na.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType=\"string\"===typeof a.pointerType?a.pointerType:Ga[a.pointerType]||\"\";this.state=a.state;this.i=a;a.defaultPrevented&&C.aa.h.call(this);}}r(C,A);var Ga={2:\"touch\",3:\"pen\",4:\"mouse\"};C.prototype.h=function(){C.aa.h.call(this);var a=this.i;a.preventDefault?a.preventDefault():a.returnValue=!1;};var D=\"closure_listenable_\"+(1E6*Math.random()|0);var Ha=0;function Ia(a,b,c,d,e){this.listener=a;this.proxy=null;this.src=b;this.type=c;this.capture=!!d;this.ha=e;this.key=++Ha;this.da=this.fa=!1;}function Ja(a){a.da=!0;a.listener=null;a.proxy=null;a.src=null;a.ha=null;}function Ka(a){this.src=a;this.g={};this.h=0;}Ka.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g=La(a,b,d,e);-1>>0);function Sa(a){if(\"function\"===typeof a)return a;a[$a]||(a[$a]=function(b){return a.handleEvent(b)});return a[$a]}function E(){z.call(this);this.i=new Ka(this);this.M=this;this.F=null;}r(E,z);E.prototype[D]=!0;E.prototype.removeEventListener=function(a,b,c,d){Ya(this,a,b,c,d);};\nfunction F(a,b){var c,d=a.F;if(d)for(c=[];d;d=d.F)c.push(d);a=a.M;d=b.type||b;if(\"string\"===typeof b)b=new A(b,a);else if(b instanceof A)b.target=b.target||a;else {var e=b;b=new A(d,a);ua(b,e);}e=!0;if(c)for(var f=c.length-1;0<=f;f--){var g=b.g=c[f];e=ab(g,d,!0,b)&&e;}g=b.g=a;e=ab(g,d,!0,b)&&e;e=ab(g,d,!1,b)&&e;if(c)for(f=0;f{a.g=null;a.i&&(a.i=!1,cb(a));},a.l);const b=a.h;a.h=null;a.m.apply(null,b);}class eb extends z{constructor(a,b){super();this.m=a;this.l=b;this.h=null;this.i=!1;this.g=null;}j(a){this.h=arguments;this.g?this.i=!0:cb(this);}N(){super.N();this.g&&(k.clearTimeout(this.g),this.g=null,this.i=!1,this.h=null);}}function G(a){z.call(this);this.h=a;this.g={};}r(G,z);var fb=[];function gb(a){qa(a.g,function(b,c){this.g.hasOwnProperty(c)&&Za(b);},a);a.g={};}G.prototype.N=function(){G.aa.N.call(this);gb(this);};G.prototype.handleEvent=function(){throw Error(\"EventHandler.handleEvent not implemented\");};var hb=k.JSON.stringify;var ib=k.JSON.parse;var jb=class{stringify(a){return k.JSON.stringify(a,void 0)}parse(a){return k.JSON.parse(a,void 0)}};function kb(){}kb.prototype.h=null;function lb(a){return a.h||(a.h=a.i())}function mb(){}var H={OPEN:\"a\",kb:\"b\",Ja:\"c\",wb:\"d\"};function nb(){A.call(this,\"d\");}r(nb,A);function ob(){A.call(this,\"c\");}r(ob,A);var I={},pb=null;function qb(){return pb=pb||new E}I.La=\"serverreachability\";function rb(a){A.call(this,I.La,a);}r(rb,A);function J(a){const b=qb();F(b,new rb(b));}I.STAT_EVENT=\"statevent\";function sb(a,b){A.call(this,I.STAT_EVENT,a);this.stat=b;}r(sb,A);function K(a){const b=qb();F(b,new sb(b,a));}I.Ma=\"timingevent\";function tb(a,b){A.call(this,I.Ma,a);this.size=b;}r(tb,A);\nfunction ub(a,b){if(\"function\"!==typeof a)throw Error(\"Fn must not be null and must be a function\");return k.setTimeout(function(){a();},b)}function vb(){this.g=!0;}vb.prototype.xa=function(){this.g=!1;};function wb(a,b,c,d,e,f){a.info(function(){if(a.g)if(f){var g=\"\";for(var m=f.split(\"&\"),q=0;qd.length)){var e=d[1];if(Array.isArray(e)&&!(1>e.length)){var f=e[0];if(\"noop\"!=f&&\"stop\"!=f&&\"close\"!=f)for(var g=1;gw)&&(3!=w||this.g&&(this.h.h||this.g.oa()||Nb(this.g)))){this.J||4!=w||7==b||(8==b||0>=O?J(3):J(2));Ob(this);var c=this.g.Z();this.X=c;b:if(Pb(this)){var d=Nb(this.g);a=\"\";var e=d.length,f=4==P(this.g);if(!this.h.i){if(\"undefined\"===typeof TextDecoder){Q(this);Qb(this);var g=\"\";break b}this.h.i=new k.TextDecoder;}for(b=0;bb.length)return Gb;b=b.slice(d,d+c);a.C=d+c;return b}M.prototype.cancel=function(){this.J=!0;Q(this);};function Kb(a){a.S=Date.now()+a.I;Wb(a,a.I);}function Wb(a,b){if(null!=a.B)throw Error(\"WatchDog timer not null\");a.B=ub(p(a.ba,a),b);}function Ob(a){a.B&&(k.clearTimeout(a.B),a.B=null);}\nM.prototype.ba=function(){this.B=null;const a=Date.now();0<=a-this.S?(zb(this.i,this.A),2!=this.L&&(J(),K(17)),Q(this),this.s=2,Qb(this)):Wb(this,this.S-a);};function Qb(a){0==a.j.G||a.J||Ub(a.j,a);}function Q(a){Ob(a);var b=a.M;b&&\"function\"==typeof b.ma&&b.ma();a.M=null;gb(a.U);a.g&&(b=a.g,a.g=null,b.abort(),b.ma());}\nfunction Rb(a,b){try{var c=a.j;if(0!=c.G&&(c.g==a||Xb(c.h,a)))if(!a.K&&Xb(c.h,a)&&3==c.G){try{var d=c.Da.g.parse(b);}catch(l){d=null;}if(Array.isArray(d)&&3==d.length){var e=d;if(0==e[0])a:{if(!c.u){if(c.g)if(c.g.F+3E3e[2]&&c.F&&0==c.v&&!c.C&&(c.C=ub(p(c.Za,c),6E3));if(1>=ac(c.h)&&c.ca){try{c.ca();}catch(l){}c.ca=void 0;}}else R(c,11);}else if((a.K||c.g==a)&&Yb(c),!t(b))for(e=c.Da.g.parse(b),b=0;b=a.j:!1}function ac(a){return a.h?1:a.g?a.g.size:0}function Xb(a,b){return a.h?a.h==b:a.g?a.g.has(b):!1}\nfunction bc(a,b){a.g?a.g.add(b):a.h=b;}function dc(a,b){a.h&&a.h==b?a.h=null:a.g&&a.g.has(b)&&a.g.delete(b);}ic.prototype.cancel=function(){this.i=kc(this);if(this.h)this.h.cancel(),this.h=null;else if(this.g&&0!==this.g.size){for(const a of this.g.values())a.cancel();this.g.clear();}};function kc(a){if(null!=a.h)return a.i.concat(a.h.D);if(null!=a.g&&0!==a.g.size){let b=a.i;for(const c of a.g.values())b=b.concat(c.D);return b}return la(a.i)}function lc(a){if(a.V&&\"function\"==typeof a.V)return a.V();if(\"undefined\"!==typeof Map&&a instanceof Map||\"undefined\"!==typeof Set&&a instanceof Set)return Array.from(a.values());if(\"string\"===typeof a)return a.split(\"\");if(ha(a)){for(var b=[],c=a.length,d=0;db)throw Error(\"Bad port number \"+b);a.s=b;}else a.s=null;}function tc(a,b,c){b instanceof sc?(a.i=b,Ac(a.i,a.h)):(c||(b=vc(b,Bc)),a.i=new sc(b,a.h));}function S(a,b,c){a.i.set(b,c);}function Ib(a){S(a,\"zx\",Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^Date.now()).toString(36));return a}\nfunction uc(a,b){return a?b?decodeURI(a.replace(/%25/g,\"%2525\")):decodeURIComponent(a):\"\"}function vc(a,b,c){return \"string\"===typeof a?(a=encodeURI(a).replace(b,Cc),c&&(a=a.replace(/%25([0-9a-fA-F]{2})/g,\"%$1\")),a):null}function Cc(a){a=a.charCodeAt(0);return \"%\"+(a>>4&15).toString(16)+(a&15).toString(16)}var wc=/[#\\/\\?@]/g,yc=/[#\\?:]/g,xc=/[#\\?]/g,Bc=/[#\\?@]/g,zc=/#/g;function sc(a,b){this.h=this.g=null;this.i=a||null;this.j=!!b;}\nfunction U(a){a.g||(a.g=new Map,a.h=0,a.i&&pc(a.i,function(b,c){a.add(decodeURIComponent(b.replace(/\\+/g,\" \")),c);}));}h=sc.prototype;h.add=function(a,b){U(this);this.i=null;a=V(this,a);var c=this.g.get(a);c||this.g.set(a,c=[]);c.push(b);this.h+=1;return this};function Dc(a,b){U(a);b=V(a,b);a.g.has(b)&&(a.i=null,a.h-=a.g.get(b).length,a.g.delete(b));}function Ec(a,b){U(a);b=V(a,b);return a.g.has(b)}\nh.forEach=function(a,b){U(this);this.g.forEach(function(c,d){c.forEach(function(e){a.call(b,e,d,this);},this);},this);};h.na=function(){U(this);const a=Array.from(this.g.values()),b=Array.from(this.g.keys()),c=[];for(let d=0;d{d.abort();W(c,\"TestPingServer: timeout\",!1,b);},1E4);fetch(a,{signal:d.signal}).then(f=>{clearTimeout(e);f.ok?W(c,\"TestPingServer: ok\",!0,b):W(c,\"TestPingServer: server error\",!1,b);}).catch(()=>{clearTimeout(e);W(c,\"TestPingServer: error\",!1,b);});}function W(a,b,c,d,e){try{e&&(e.onload=null,e.onerror=null,e.onabort=null,e.ontimeout=null),d(c);}catch(f){}}function Hc(){this.g=new jb;}function Ic(a,b,c){const d=c||\"\";try{nc(a,function(e,f){let g=e;n(e)&&(g=hb(e));b.push(d+f+\"=\"+encodeURIComponent(g));});}catch(e){throw b.push(d+\"type=\"+encodeURIComponent(\"_badmap\")),e;}}function Jc(a){this.l=a.Ub||null;this.j=a.eb||!1;}r(Jc,kb);Jc.prototype.g=function(){return new Kc(this.l,this.j)};Jc.prototype.i=function(a){return function(){return a}}({});function Kc(a,b){E.call(this);this.D=a;this.o=b;this.m=void 0;this.status=this.readyState=0;this.responseType=this.responseText=this.response=this.statusText=\"\";this.onreadystatechange=null;this.u=new Headers;this.h=null;this.B=\"GET\";this.A=\"\";this.g=!1;this.v=this.j=this.l=null;}r(Kc,E);h=Kc.prototype;\nh.open=function(a,b){if(0!=this.readyState)throw this.abort(),Error(\"Error reopening a connection\");this.B=a;this.A=b;this.readyState=1;Lc(this);};h.send=function(a){if(1!=this.readyState)throw this.abort(),Error(\"need to call open() first. \");this.g=!0;const b={headers:this.u,method:this.B,credentials:this.m,cache:void 0};a&&(b.body=a);(this.D||k).fetch(new Request(this.A,b)).then(this.Sa.bind(this),this.ga.bind(this));};\nh.abort=function(){this.response=this.responseText=\"\";this.u=new Headers;this.status=0;this.j&&this.j.cancel(\"Request was aborted.\").catch(()=>{});1<=this.readyState&&this.g&&4!=this.readyState&&(this.g=!1,Mc(this));this.readyState=0;};\nh.Sa=function(a){if(this.g&&(this.l=a,this.h||(this.status=this.l.status,this.statusText=this.l.statusText,this.h=a.headers,this.readyState=2,Lc(this)),this.g&&(this.readyState=3,Lc(this),this.g)))if(\"arraybuffer\"===this.responseType)a.arrayBuffer().then(this.Qa.bind(this),this.ga.bind(this));else if(\"undefined\"!==typeof k.ReadableStream&&\"body\"in a){this.j=a.body.getReader();if(this.o){if(this.responseType)throw Error('responseType must be empty for \"streamBinaryChunks\" mode responses.');this.response=\n[];}else this.response=this.responseText=\"\",this.v=new TextDecoder;Nc(this);}else a.text().then(this.Ra.bind(this),this.ga.bind(this));};function Nc(a){a.j.read().then(a.Pa.bind(a)).catch(a.ga.bind(a));}h.Pa=function(a){if(this.g){if(this.o&&a.value)this.response.push(a.value);else if(!this.o){var b=a.value?a.value:new Uint8Array(0);if(b=this.v.decode(b,{stream:!a.done}))this.response=this.responseText+=b;}a.done?Mc(this):Lc(this);3==this.readyState&&Nc(this);}};\nh.Ra=function(a){this.g&&(this.response=this.responseText=a,Mc(this));};h.Qa=function(a){this.g&&(this.response=a,Mc(this));};h.ga=function(){this.g&&Mc(this);};function Mc(a){a.readyState=4;a.l=null;a.j=null;a.v=null;Lc(a);}h.setRequestHeader=function(a,b){this.u.append(a,b);};h.getResponseHeader=function(a){return this.h?this.h.get(a.toLowerCase())||\"\":\"\"};\nh.getAllResponseHeaders=function(){if(!this.h)return \"\";const a=[],b=this.h.entries();for(var c=b.next();!c.done;)c=c.value,a.push(c[0]+\": \"+c[1]),c=b.next();return a.join(\"\\r\\n\")};function Lc(a){a.onreadystatechange&&a.onreadystatechange.call(a);}Object.defineProperty(Kc.prototype,\"withCredentials\",{get:function(){return \"include\"===this.m},set:function(a){this.m=a?\"include\":\"same-origin\";}});function Oc(a){let b=\"\";qa(a,function(c,d){b+=d;b+=\":\";b+=c;b+=\"\\r\\n\";});return b}function Pc(a,b,c){a:{for(d in c){var d=!1;break a}d=!0;}d||(c=Oc(c),\"string\"===typeof a?(null!=c&&encodeURIComponent(String(c))):S(a,b,c));}function X(a){E.call(this);this.headers=new Map;this.o=a||null;this.h=!1;this.v=this.g=null;this.D=\"\";this.m=0;this.l=\"\";this.j=this.B=this.u=this.A=!1;this.I=null;this.H=\"\";this.J=!1;}r(X,E);var Qc=/^https?$/i,Rc=[\"POST\",\"PUT\"];h=X.prototype;h.Ha=function(a){this.J=a;};\nh.ea=function(a,b,c,d){if(this.g)throw Error(\"[goog.net.XhrIo] Object is active with another request=\"+this.D+\"; newUri=\"+a);b=b?b.toUpperCase():\"GET\";this.D=a;this.l=\"\";this.m=0;this.A=!1;this.h=!0;this.g=this.o?this.o.g():Cb.g();this.v=this.o?lb(this.o):lb(Cb);this.g.onreadystatechange=p(this.Ea,this);try{this.B=!0,this.g.open(b,String(a),!0),this.B=!1;}catch(f){Sc(this,f);return}a=c||\"\";c=new Map(this.headers);if(d)if(Object.getPrototypeOf(d)===Object.prototype)for(var e in d)c.set(e,d[e]);else if(\"function\"===\ntypeof d.keys&&\"function\"===typeof d.get)for(const f of d.keys())c.set(f,d.get(f));else throw Error(\"Unknown input type for opt_headers: \"+String(d));d=Array.from(c.keys()).find(f=>\"content-type\"==f.toLowerCase());e=k.FormData&&a instanceof k.FormData;!(0<=Array.prototype.indexOf.call(Rc,b,void 0))||d||e||c.set(\"Content-Type\",\"application/x-www-form-urlencoded;charset=utf-8\");for(const [f,g]of c)this.g.setRequestHeader(f,g);this.H&&(this.g.responseType=this.H);\"withCredentials\"in this.g&&this.g.withCredentials!==\nthis.J&&(this.g.withCredentials=this.J);try{Tc(this),this.u=!0,this.g.send(a),this.u=!1;}catch(f){Sc(this,f);}};function Sc(a,b){a.h=!1;a.g&&(a.j=!0,a.g.abort(),a.j=!1);a.l=b;a.m=5;Uc(a);Vc(a);}function Uc(a){a.A||(a.A=!0,F(a,\"complete\"),F(a,\"error\"));}h.abort=function(a){this.g&&this.h&&(this.h=!1,this.j=!0,this.g.abort(),this.j=!1,this.m=a||7,F(this,\"complete\"),F(this,\"abort\"),Vc(this));};h.N=function(){this.g&&(this.h&&(this.h=!1,this.j=!0,this.g.abort(),this.j=!1),Vc(this,!0));X.aa.N.call(this);};\nh.Ea=function(){this.s||(this.B||this.u||this.j?Wc(this):this.bb());};h.bb=function(){Wc(this);};\nfunction Wc(a){if(a.h&&\"undefined\"!=typeof fa&&(!a.v[1]||4!=P(a)||2!=a.Z()))if(a.u&&4==P(a))bb(a.Ea,0,a);else if(F(a,\"readystatechange\"),4==P(a)){a.h=!1;try{const g=a.Z();a:switch(g){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var b=!0;break a;default:b=!1;}var c;if(!(c=b)){var d;if(d=0===g){var e=String(a.D).match(oc)[1]||null;!e&&k.self&&k.self.location&&(e=k.self.location.protocol.slice(0,-1));d=!Qc.test(e?e.toLowerCase():\"\");}c=d;}if(c)F(a,\"complete\"),F(a,\"success\");else {a.m=\n6;try{var f=2{}:null;a.g=null;a.v=null;b||F(a,\"ready\");try{c.onreadystatechange=d;}catch(e){}}}function Tc(a){a.I&&(k.clearTimeout(a.I),a.I=null);}h.isActive=function(){return !!this.g};function P(a){return a.g?a.g.readyState:0}h.Z=function(){try{return 2=a.h.j-(a.s?1:0))return !1;if(a.s)return a.i=b.D.concat(a.i),!0;if(1==a.G||2==a.G||a.B>=(a.Va?0:a.Wa))return !1;a.s=ub(p(a.Ga,a,b),cd(a,a.B));a.B++;return !0}\nh.Ga=function(a){if(this.s)if(this.s=null,1==this.G){if(!a){this.U=Math.floor(1E5*Math.random());a=this.U++;const e=new M(this,this.j,a);let f=this.o;this.S&&(f?(f=sa(f),ua(f,this.S)):f=this.S);null!==this.m||this.O||(e.H=f,f=null);if(this.P)a:{var b=0;for(var c=0;cl)f=Math.max(0,e[q].g-100),m=!1;else try{Ic(v,g,\"req\"+l+\"_\");}catch(w){d&&d(v);}}if(m){d=g.join(\"&\");break a}}}a=a.i.splice(0,c);b.D=a;return d}function ec(a){if(!a.g&&!a.u){a.Y=1;var b=a.Fa;x||Ea();y||(x(),y=!0);za.add(b,a);a.v=0;}}\nfunction $b(a){if(a.g||a.u||3<=a.v)return !1;a.Y++;a.u=ub(p(a.Fa,a),cd(a,a.v));a.v++;return !0}h.Fa=function(){this.u=null;fd(this);if(this.ba&&!(this.M||null==this.g||0>=this.R)){var a=2*this.R;this.j.info(\"BP detection timer enabled: \"+a);this.A=ub(p(this.ab,this),a);}};h.ab=function(){this.A&&(this.A=null,this.j.info(\"BP detection timeout reached.\"),this.j.info(\"Buffering proxy detected and switch to long-polling!\"),this.F=!1,this.M=!0,K(10),Zb(this),fd(this));};\nfunction Tb(a){null!=a.A&&(k.clearTimeout(a.A),a.A=null);}function fd(a){a.g=new M(a,a.j,\"rpc\",a.Y);null===a.m&&(a.g.H=a.o);a.g.O=0;var b=N(a.qa);S(b,\"RID\",\"rpc\");S(b,\"SID\",a.K);S(b,\"AID\",a.T);S(b,\"CI\",a.F?\"0\":\"1\");!a.F&&a.ja&&S(b,\"TO\",a.ja);S(b,\"TYPE\",\"xmlhttp\");$c(a,b);a.m&&a.o&&Pc(b,a.m,a.o);a.L&&(a.g.I=a.L);var c=a.g;a=a.ia;c.L=1;c.v=Ib(N(b));c.m=null;c.P=!0;Jb(c,a);}h.Za=function(){null!=this.C&&(this.C=null,Zb(this),$b(this),K(19));};function Yb(a){null!=a.C&&(k.clearTimeout(a.C),a.C=null);}\nfunction Ub(a,b){var c=null;if(a.g==b){Yb(a);Tb(a);a.g=null;var d=2;}else if(Xb(a.h,b))c=b.D,dc(a.h,b),d=1;else return;if(0!=a.G)if(b.o)if(1==d){c=b.m?b.m.length:0;b=Date.now()-b.F;var e=a.B;d=qb();F(d,new tb(d,c));fc(a);}else ec(a);else if(e=b.s,3==e||0==e&&0\n *

  • `debug` for the most verbose logging level, primarily for\n * debugging.
  • \n *
  • `error` to log errors only.
  • \n *
  • `silent` to turn off logging.
  • \n * \n */ function setLogLevel(e) {\n b.setLogLevel(e);\n}\n\nfunction __PRIVATE_logDebug(e, ...t) {\n if (b.logLevel <= LogLevel.DEBUG) {\n const n = t.map(__PRIVATE_argToString);\n b.debug(`Firestore (${S}): ${e}`, ...n);\n }\n}\n\nfunction __PRIVATE_logError(e, ...t) {\n if (b.logLevel <= LogLevel.ERROR) {\n const n = t.map(__PRIVATE_argToString);\n b.error(`Firestore (${S}): ${e}`, ...n);\n }\n}\n\n/**\n * @internal\n */ function __PRIVATE_logWarn(e, ...t) {\n if (b.logLevel <= LogLevel.WARN) {\n const n = t.map(__PRIVATE_argToString);\n b.warn(`Firestore (${S}): ${e}`, ...n);\n }\n}\n\n/**\n * Converts an additional log parameter to a string representation.\n */ function __PRIVATE_argToString(e) {\n if (\"string\" == typeof e) return e;\n try {\n /**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /** Formats an object as a JSON string, suitable for logging. */\n return function __PRIVATE_formatJSON(e) {\n return JSON.stringify(e);\n }(e);\n } catch (t) {\n // Converting to JSON failed, just log the object directly\n return e;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Unconditionally fails, throwing an Error with the given message.\n * Messages are stripped in production builds.\n *\n * Returns `never` and can be used in expressions:\n * @example\n * let futureVar = fail('not implemented yet');\n */ function fail(e = \"Unexpected state\") {\n // Log the failure in addition to throw an exception, just in case the\n // exception is swallowed.\n const t = `FIRESTORE (${S}) INTERNAL ASSERTION FAILED: ` + e;\n // NOTE: We don't use FirestoreError here because these are internal failures\n // that cannot be handled by the user. (Also it would create a circular\n // dependency between the error and assert modules which doesn't work.)\n throw __PRIVATE_logError(t), new Error(t);\n}\n\n/**\n * Fails if the given assertion condition is false, throwing an Error with the\n * given message if it did.\n *\n * Messages are stripped in production builds.\n */ function __PRIVATE_hardAssert(e, t) {\n e || fail();\n}\n\n/**\n * Fails if the given assertion condition is false, throwing an Error with the\n * given message if it did.\n *\n * The code of callsites invoking this function are stripped out in production\n * builds. Any side-effects of code within the debugAssert() invocation will not\n * happen in this case.\n *\n * @internal\n */ function __PRIVATE_debugAssert(e, t) {\n e || fail();\n}\n\n/**\n * Casts `obj` to `T`. In non-production builds, verifies that `obj` is an\n * instance of `T` before casting.\n */ function __PRIVATE_debugCast(e, \n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nt) {\n return e;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const D = {\n // Causes are copied from:\n // https://github.com/grpc/grpc/blob/bceec94ea4fc5f0085d81235d8e1c06798dc341a/include/grpc%2B%2B/impl/codegen/status_code_enum.h\n /** Not an error; returned on success. */\n OK: \"ok\",\n /** The operation was cancelled (typically by the caller). */\n CANCELLED: \"cancelled\",\n /** Unknown error or an error from a different error domain. */\n UNKNOWN: \"unknown\",\n /**\n * Client specified an invalid argument. Note that this differs from\n * FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments that are\n * problematic regardless of the state of the system (e.g., a malformed file\n * name).\n */\n INVALID_ARGUMENT: \"invalid-argument\",\n /**\n * Deadline expired before operation could complete. For operations that\n * change the state of the system, this error may be returned even if the\n * operation has completed successfully. For example, a successful response\n * from a server could have been delayed long enough for the deadline to\n * expire.\n */\n DEADLINE_EXCEEDED: \"deadline-exceeded\",\n /** Some requested entity (e.g., file or directory) was not found. */\n NOT_FOUND: \"not-found\",\n /**\n * Some entity that we attempted to create (e.g., file or directory) already\n * exists.\n */\n ALREADY_EXISTS: \"already-exists\",\n /**\n * The caller does not have permission to execute the specified operation.\n * PERMISSION_DENIED must not be used for rejections caused by exhausting\n * some resource (use RESOURCE_EXHAUSTED instead for those errors).\n * PERMISSION_DENIED must not be used if the caller cannot be identified\n * (use UNAUTHENTICATED instead for those errors).\n */\n PERMISSION_DENIED: \"permission-denied\",\n /**\n * The request does not have valid authentication credentials for the\n * operation.\n */\n UNAUTHENTICATED: \"unauthenticated\",\n /**\n * Some resource has been exhausted, perhaps a per-user quota, or perhaps the\n * entire file system is out of space.\n */\n RESOURCE_EXHAUSTED: \"resource-exhausted\",\n /**\n * Operation was rejected because the system is not in a state required for\n * the operation's execution. For example, directory to be deleted may be\n * non-empty, an rmdir operation is applied to a non-directory, etc.\n *\n * A litmus test that may help a service implementor in deciding\n * between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE:\n * (a) Use UNAVAILABLE if the client can retry just the failing call.\n * (b) Use ABORTED if the client should retry at a higher-level\n * (e.g., restarting a read-modify-write sequence).\n * (c) Use FAILED_PRECONDITION if the client should not retry until\n * the system state has been explicitly fixed. E.g., if an \"rmdir\"\n * fails because the directory is non-empty, FAILED_PRECONDITION\n * should be returned since the client should not retry unless\n * they have first fixed up the directory by deleting files from it.\n * (d) Use FAILED_PRECONDITION if the client performs conditional\n * REST Get/Update/Delete on a resource and the resource on the\n * server does not match the condition. E.g., conflicting\n * read-modify-write on the same resource.\n */\n FAILED_PRECONDITION: \"failed-precondition\",\n /**\n * The operation was aborted, typically due to a concurrency issue like\n * sequencer check failures, transaction aborts, etc.\n *\n * See litmus test above for deciding between FAILED_PRECONDITION, ABORTED,\n * and UNAVAILABLE.\n */\n ABORTED: \"aborted\",\n /**\n * Operation was attempted past the valid range. E.g., seeking or reading\n * past end of file.\n *\n * Unlike INVALID_ARGUMENT, this error indicates a problem that may be fixed\n * if the system state changes. For example, a 32-bit file system will\n * generate INVALID_ARGUMENT if asked to read at an offset that is not in the\n * range [0,2^32-1], but it will generate OUT_OF_RANGE if asked to read from\n * an offset past the current file size.\n *\n * There is a fair bit of overlap between FAILED_PRECONDITION and\n * OUT_OF_RANGE. We recommend using OUT_OF_RANGE (the more specific error)\n * when it applies so that callers who are iterating through a space can\n * easily look for an OUT_OF_RANGE error to detect when they are done.\n */\n OUT_OF_RANGE: \"out-of-range\",\n /** Operation is not implemented or not supported/enabled in this service. */\n UNIMPLEMENTED: \"unimplemented\",\n /**\n * Internal errors. Means some invariants expected by underlying System has\n * been broken. If you see one of these errors, Something is very broken.\n */\n INTERNAL: \"internal\",\n /**\n * The service is currently unavailable. This is a most likely a transient\n * condition and may be corrected by retrying with a backoff.\n *\n * See litmus test above for deciding between FAILED_PRECONDITION, ABORTED,\n * and UNAVAILABLE.\n */\n UNAVAILABLE: \"unavailable\",\n /** Unrecoverable data loss or corruption. */\n DATA_LOSS: \"data-loss\"\n};\n\n/** An error returned by a Firestore operation. */ class FirestoreError extends FirebaseError {\n /** @hideconstructor */\n constructor(\n /**\n * The backend error code associated with this error.\n */\n e, \n /**\n * A custom error description.\n */\n t) {\n super(e, t), this.code = e, this.message = t, \n // HACK: We write a toString property directly because Error is not a real\n // class and so inheritance does not work correctly. We could alternatively\n // do the same \"back-door inheritance\" trick that FirebaseError does.\n this.toString = () => `${this.name}: [code=${this.code}]: ${this.message}`;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_Deferred {\n constructor() {\n this.promise = new Promise(((e, t) => {\n this.resolve = e, this.reject = t;\n }));\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_OAuthToken {\n constructor(e, t) {\n this.user = t, this.type = \"OAuth\", this.headers = new Map, this.headers.set(\"Authorization\", `Bearer ${e}`);\n }\n}\n\n/**\n * A CredentialsProvider that always yields an empty token.\n * @internal\n */ class __PRIVATE_EmptyAuthCredentialsProvider {\n getToken() {\n return Promise.resolve(null);\n }\n invalidateToken() {}\n start(e, t) {\n // Fire with initial user.\n e.enqueueRetryable((() => t(User.UNAUTHENTICATED)));\n }\n shutdown() {}\n}\n\n/**\n * A CredentialsProvider that always returns a constant token. Used for\n * emulator token mocking.\n */ class __PRIVATE_EmulatorAuthCredentialsProvider {\n constructor(e) {\n this.token = e, \n /**\n * Stores the listener registered with setChangeListener()\n * This isn't actually necessary since the UID never changes, but we use this\n * to verify the listen contract is adhered to in tests.\n */\n this.changeListener = null;\n }\n getToken() {\n return Promise.resolve(this.token);\n }\n invalidateToken() {}\n start(e, t) {\n this.changeListener = t, \n // Fire with initial user.\n e.enqueueRetryable((() => t(this.token.user)));\n }\n shutdown() {\n this.changeListener = null;\n }\n}\n\nclass __PRIVATE_FirebaseAuthCredentialsProvider {\n constructor(e) {\n this.t = e, \n /** Tracks the current User. */\n this.currentUser = User.UNAUTHENTICATED, \n /**\n * Counter used to detect if the token changed while a getToken request was\n * outstanding.\n */\n this.i = 0, this.forceRefresh = !1, this.auth = null;\n }\n start(e, t) {\n __PRIVATE_hardAssert(void 0 === this.o);\n let n = this.i;\n // A change listener that prevents double-firing for the same token change.\n const __PRIVATE_guardedChangeListener = e => this.i !== n ? (n = this.i, \n t(e)) : Promise.resolve();\n // A promise that can be waited on to block on the next token change.\n // This promise is re-created after each change.\n let r = new __PRIVATE_Deferred;\n this.o = () => {\n this.i++, this.currentUser = this.u(), r.resolve(), r = new __PRIVATE_Deferred, \n e.enqueueRetryable((() => __PRIVATE_guardedChangeListener(this.currentUser)));\n };\n const __PRIVATE_awaitNextToken = () => {\n const t = r;\n e.enqueueRetryable((async () => {\n await t.promise, await __PRIVATE_guardedChangeListener(this.currentUser);\n }));\n }, __PRIVATE_registerAuth = e => {\n __PRIVATE_logDebug(\"FirebaseAuthCredentialsProvider\", \"Auth detected\"), this.auth = e, \n this.o && (this.auth.addAuthTokenListener(this.o), __PRIVATE_awaitNextToken());\n };\n this.t.onInit((e => __PRIVATE_registerAuth(e))), \n // Our users can initialize Auth right after Firestore, so we give it\n // a chance to register itself with the component framework before we\n // determine whether to start up in unauthenticated mode.\n setTimeout((() => {\n if (!this.auth) {\n const e = this.t.getImmediate({\n optional: !0\n });\n e ? __PRIVATE_registerAuth(e) : (\n // If auth is still not available, proceed with `null` user\n __PRIVATE_logDebug(\"FirebaseAuthCredentialsProvider\", \"Auth not yet detected\"), \n r.resolve(), r = new __PRIVATE_Deferred);\n }\n }), 0), __PRIVATE_awaitNextToken();\n }\n getToken() {\n // Take note of the current value of the tokenCounter so that this method\n // can fail (with an ABORTED error) if there is a token change while the\n // request is outstanding.\n const e = this.i, t = this.forceRefresh;\n return this.forceRefresh = !1, this.auth ? this.auth.getToken(t).then((t => \n // Cancel the request since the token changed while the request was\n // outstanding so the response is potentially for a previous user (which\n // user, we can't be sure).\n this.i !== e ? (__PRIVATE_logDebug(\"FirebaseAuthCredentialsProvider\", \"getToken aborted due to token change.\"), \n this.getToken()) : t ? (__PRIVATE_hardAssert(\"string\" == typeof t.accessToken), \n new __PRIVATE_OAuthToken(t.accessToken, this.currentUser)) : null)) : Promise.resolve(null);\n }\n invalidateToken() {\n this.forceRefresh = !0;\n }\n shutdown() {\n this.auth && this.o && this.auth.removeAuthTokenListener(this.o), this.o = void 0;\n }\n // Auth.getUid() can return null even with a user logged in. It is because\n // getUid() is synchronous, but the auth code populating Uid is asynchronous.\n // This method should only be called in the AuthTokenListener callback\n // to guarantee to get the actual user.\n u() {\n const e = this.auth && this.auth.getUid();\n return __PRIVATE_hardAssert(null === e || \"string\" == typeof e), new User(e);\n }\n}\n\n/*\n * FirstPartyToken provides a fresh token each time its value\n * is requested, because if the token is too old, requests will be rejected.\n * Technically this may no longer be necessary since the SDK should gracefully\n * recover from unauthenticated errors (see b/33147818 for context), but it's\n * safer to keep the implementation as-is.\n */ class __PRIVATE_FirstPartyToken {\n constructor(e, t, n) {\n this.l = e, this.h = t, this.P = n, this.type = \"FirstParty\", this.user = User.FIRST_PARTY, \n this.I = new Map;\n }\n /**\n * Gets an authorization token, using a provided factory function, or return\n * null.\n */ T() {\n return this.P ? this.P() : null;\n }\n get headers() {\n this.I.set(\"X-Goog-AuthUser\", this.l);\n // Use array notation to prevent minification\n const e = this.T();\n return e && this.I.set(\"Authorization\", e), this.h && this.I.set(\"X-Goog-Iam-Authorization-Token\", this.h), \n this.I;\n }\n}\n\n/*\n * Provides user credentials required for the Firestore JavaScript SDK\n * to authenticate the user, using technique that is only available\n * to applications hosted by Google.\n */ class __PRIVATE_FirstPartyAuthCredentialsProvider {\n constructor(e, t, n) {\n this.l = e, this.h = t, this.P = n;\n }\n getToken() {\n return Promise.resolve(new __PRIVATE_FirstPartyToken(this.l, this.h, this.P));\n }\n start(e, t) {\n // Fire with initial uid.\n e.enqueueRetryable((() => t(User.FIRST_PARTY)));\n }\n shutdown() {}\n invalidateToken() {}\n}\n\nclass AppCheckToken {\n constructor(e) {\n this.value = e, this.type = \"AppCheck\", this.headers = new Map, e && e.length > 0 && this.headers.set(\"x-firebase-appcheck\", this.value);\n }\n}\n\nclass __PRIVATE_FirebaseAppCheckTokenProvider {\n constructor(e) {\n this.A = e, this.forceRefresh = !1, this.appCheck = null, this.R = null;\n }\n start(e, t) {\n __PRIVATE_hardAssert(void 0 === this.o);\n const onTokenChanged = e => {\n null != e.error && __PRIVATE_logDebug(\"FirebaseAppCheckTokenProvider\", `Error getting App Check token; using placeholder token instead. Error: ${e.error.message}`);\n const n = e.token !== this.R;\n return this.R = e.token, __PRIVATE_logDebug(\"FirebaseAppCheckTokenProvider\", `Received ${n ? \"new\" : \"existing\"} token.`), \n n ? t(e.token) : Promise.resolve();\n };\n this.o = t => {\n e.enqueueRetryable((() => onTokenChanged(t)));\n };\n const __PRIVATE_registerAppCheck = e => {\n __PRIVATE_logDebug(\"FirebaseAppCheckTokenProvider\", \"AppCheck detected\"), this.appCheck = e, \n this.o && this.appCheck.addTokenListener(this.o);\n };\n this.A.onInit((e => __PRIVATE_registerAppCheck(e))), \n // Our users can initialize AppCheck after Firestore, so we give it\n // a chance to register itself with the component framework.\n setTimeout((() => {\n if (!this.appCheck) {\n const e = this.A.getImmediate({\n optional: !0\n });\n e ? __PRIVATE_registerAppCheck(e) : \n // If AppCheck is still not available, proceed without it.\n __PRIVATE_logDebug(\"FirebaseAppCheckTokenProvider\", \"AppCheck not yet detected\");\n }\n }), 0);\n }\n getToken() {\n const e = this.forceRefresh;\n return this.forceRefresh = !1, this.appCheck ? this.appCheck.getToken(e).then((e => e ? (__PRIVATE_hardAssert(\"string\" == typeof e.token), \n this.R = e.token, new AppCheckToken(e.token)) : null)) : Promise.resolve(null);\n }\n invalidateToken() {\n this.forceRefresh = !0;\n }\n shutdown() {\n this.appCheck && this.o && this.appCheck.removeTokenListener(this.o), this.o = void 0;\n }\n}\n\n/**\n * An AppCheck token provider that always yields an empty token.\n * @internal\n */ class __PRIVATE_EmptyAppCheckTokenProvider {\n getToken() {\n return Promise.resolve(new AppCheckToken(\"\"));\n }\n invalidateToken() {}\n start(e, t) {}\n shutdown() {}\n}\n\n/**\n * Builds a CredentialsProvider depending on the type of\n * the credentials passed in.\n */\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Generates `nBytes` of random bytes.\n *\n * If `nBytes < 0` , an error will be thrown.\n */\nfunction __PRIVATE_randomBytes(e) {\n // Polyfills for IE and WebWorker by using `self` and `msCrypto` when `crypto` is not available.\n const t = \n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n \"undefined\" != typeof self && (self.crypto || self.msCrypto), n = new Uint8Array(e);\n if (t && \"function\" == typeof t.getRandomValues) t.getRandomValues(n); else \n // Falls back to Math.random\n for (let t = 0; t < e; t++) n[t] = Math.floor(256 * Math.random());\n return n;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A utility class for generating unique alphanumeric IDs of a specified length.\n *\n * @internal\n * Exported internally for testing purposes.\n */ class __PRIVATE_AutoId {\n static newId() {\n // Alphanumeric characters\n const e = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\", t = Math.floor(256 / e.length) * e.length;\n // The largest byte value that is a multiple of `char.length`.\n let n = \"\";\n for (;n.length < 20; ) {\n const r = __PRIVATE_randomBytes(40);\n for (let i = 0; i < r.length; ++i) \n // Only accept values that are [0, maxMultiple), this ensures they can\n // be evenly mapped to indices of `chars` via a modulo operation.\n n.length < 20 && r[i] < t && (n += e.charAt(r[i] % e.length));\n }\n return n;\n }\n}\n\nfunction __PRIVATE_primitiveComparator(e, t) {\n return e < t ? -1 : e > t ? 1 : 0;\n}\n\n/** Helper to compare arrays using isEqual(). */ function __PRIVATE_arrayEquals(e, t, n) {\n return e.length === t.length && e.every(((e, r) => n(e, t[r])));\n}\n\n/**\n * Returns the immediate lexicographically-following string. This is useful to\n * construct an inclusive range for indexeddb iterators.\n */ function __PRIVATE_immediateSuccessor(e) {\n // Return the input string, with an additional NUL byte appended.\n return e + \"\\0\";\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// The earliest date supported by Firestore timestamps (0001-01-01T00:00:00Z).\n/**\n * A `Timestamp` represents a point in time independent of any time zone or\n * calendar, represented as seconds and fractions of seconds at nanosecond\n * resolution in UTC Epoch time.\n *\n * It is encoded using the Proleptic Gregorian Calendar which extends the\n * Gregorian calendar backwards to year one. It is encoded assuming all minutes\n * are 60 seconds long, i.e. leap seconds are \"smeared\" so that no leap second\n * table is needed for interpretation. Range is from 0001-01-01T00:00:00Z to\n * 9999-12-31T23:59:59.999999999Z.\n *\n * For examples and further specifications, refer to the\n * {@link https://github.com/google/protobuf/blob/master/src/google/protobuf/timestamp.proto | Timestamp definition}.\n */\nclass Timestamp {\n /**\n * Creates a new timestamp.\n *\n * @param seconds - The number of seconds of UTC time since Unix epoch\n * 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to\n * 9999-12-31T23:59:59Z inclusive.\n * @param nanoseconds - The non-negative fractions of a second at nanosecond\n * resolution. Negative second values with fractions must still have\n * non-negative nanoseconds values that count forward in time. Must be\n * from 0 to 999,999,999 inclusive.\n */\n constructor(\n /**\n * The number of seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z.\n */\n e, \n /**\n * The fractions of a second at nanosecond resolution.*\n */\n t) {\n if (this.seconds = e, this.nanoseconds = t, t < 0) throw new FirestoreError(D.INVALID_ARGUMENT, \"Timestamp nanoseconds out of range: \" + t);\n if (t >= 1e9) throw new FirestoreError(D.INVALID_ARGUMENT, \"Timestamp nanoseconds out of range: \" + t);\n if (e < -62135596800) throw new FirestoreError(D.INVALID_ARGUMENT, \"Timestamp seconds out of range: \" + e);\n // This will break in the year 10,000.\n if (e >= 253402300800) throw new FirestoreError(D.INVALID_ARGUMENT, \"Timestamp seconds out of range: \" + e);\n }\n /**\n * Creates a new timestamp with the current date, with millisecond precision.\n *\n * @returns a new timestamp representing the current date.\n */ static now() {\n return Timestamp.fromMillis(Date.now());\n }\n /**\n * Creates a new timestamp from the given date.\n *\n * @param date - The date to initialize the `Timestamp` from.\n * @returns A new `Timestamp` representing the same point in time as the given\n * date.\n */ static fromDate(e) {\n return Timestamp.fromMillis(e.getTime());\n }\n /**\n * Creates a new timestamp from the given number of milliseconds.\n *\n * @param milliseconds - Number of milliseconds since Unix epoch\n * 1970-01-01T00:00:00Z.\n * @returns A new `Timestamp` representing the same point in time as the given\n * number of milliseconds.\n */ static fromMillis(e) {\n const t = Math.floor(e / 1e3), n = Math.floor(1e6 * (e - 1e3 * t));\n return new Timestamp(t, n);\n }\n /**\n * Converts a `Timestamp` to a JavaScript `Date` object. This conversion\n * causes a loss of precision since `Date` objects only support millisecond\n * precision.\n *\n * @returns JavaScript `Date` object representing the same point in time as\n * this `Timestamp`, with millisecond precision.\n */ toDate() {\n return new Date(this.toMillis());\n }\n /**\n * Converts a `Timestamp` to a numeric timestamp (in milliseconds since\n * epoch). This operation causes a loss of precision.\n *\n * @returns The point in time corresponding to this timestamp, represented as\n * the number of milliseconds since Unix epoch 1970-01-01T00:00:00Z.\n */ toMillis() {\n return 1e3 * this.seconds + this.nanoseconds / 1e6;\n }\n _compareTo(e) {\n return this.seconds === e.seconds ? __PRIVATE_primitiveComparator(this.nanoseconds, e.nanoseconds) : __PRIVATE_primitiveComparator(this.seconds, e.seconds);\n }\n /**\n * Returns true if this `Timestamp` is equal to the provided one.\n *\n * @param other - The `Timestamp` to compare against.\n * @returns true if this `Timestamp` is equal to the provided one.\n */ isEqual(e) {\n return e.seconds === this.seconds && e.nanoseconds === this.nanoseconds;\n }\n /** Returns a textual representation of this `Timestamp`. */ toString() {\n return \"Timestamp(seconds=\" + this.seconds + \", nanoseconds=\" + this.nanoseconds + \")\";\n }\n /** Returns a JSON-serializable representation of this `Timestamp`. */ toJSON() {\n return {\n seconds: this.seconds,\n nanoseconds: this.nanoseconds\n };\n }\n /**\n * Converts this object to a primitive string, which allows `Timestamp` objects\n * to be compared using the `>`, `<=`, `>=` and `>` operators.\n */ valueOf() {\n // This method returns a string of the form . where\n // is translated to have a non-negative value and both \n // and are left-padded with zeroes to be a consistent length.\n // Strings with this format then have a lexicographical ordering that matches\n // the expected ordering. The translation is done to avoid having\n // a leading negative sign (i.e. a leading '-' character) in its string\n // representation, which would affect its lexicographical ordering.\n const e = this.seconds - -62135596800;\n // Note: Up to 12 decimal digits are required to represent all valid\n // 'seconds' values.\n return String(e).padStart(12, \"0\") + \".\" + String(this.nanoseconds).padStart(9, \"0\");\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A version of a document in Firestore. This corresponds to the version\n * timestamp, such as update_time or read_time.\n */ class SnapshotVersion {\n constructor(e) {\n this.timestamp = e;\n }\n static fromTimestamp(e) {\n return new SnapshotVersion(e);\n }\n static min() {\n return new SnapshotVersion(new Timestamp(0, 0));\n }\n static max() {\n return new SnapshotVersion(new Timestamp(253402300799, 999999999));\n }\n compareTo(e) {\n return this.timestamp._compareTo(e.timestamp);\n }\n isEqual(e) {\n return this.timestamp.isEqual(e.timestamp);\n }\n /** Returns a number representation of the version for use in spec tests. */ toMicroseconds() {\n // Convert to microseconds.\n return 1e6 * this.timestamp.seconds + this.timestamp.nanoseconds / 1e3;\n }\n toString() {\n return \"SnapshotVersion(\" + this.timestamp.toString() + \")\";\n }\n toTimestamp() {\n return this.timestamp;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Path represents an ordered sequence of string segments.\n */\nclass BasePath {\n constructor(e, t, n) {\n void 0 === t ? t = 0 : t > e.length && fail(), void 0 === n ? n = e.length - t : n > e.length - t && fail(), \n this.segments = e, this.offset = t, this.len = n;\n }\n get length() {\n return this.len;\n }\n isEqual(e) {\n return 0 === BasePath.comparator(this, e);\n }\n child(e) {\n const t = this.segments.slice(this.offset, this.limit());\n return e instanceof BasePath ? e.forEach((e => {\n t.push(e);\n })) : t.push(e), this.construct(t);\n }\n /** The index of one past the last segment of the path. */ limit() {\n return this.offset + this.length;\n }\n popFirst(e) {\n return e = void 0 === e ? 1 : e, this.construct(this.segments, this.offset + e, this.length - e);\n }\n popLast() {\n return this.construct(this.segments, this.offset, this.length - 1);\n }\n firstSegment() {\n return this.segments[this.offset];\n }\n lastSegment() {\n return this.get(this.length - 1);\n }\n get(e) {\n return this.segments[this.offset + e];\n }\n isEmpty() {\n return 0 === this.length;\n }\n isPrefixOf(e) {\n if (e.length < this.length) return !1;\n for (let t = 0; t < this.length; t++) if (this.get(t) !== e.get(t)) return !1;\n return !0;\n }\n isImmediateParentOf(e) {\n if (this.length + 1 !== e.length) return !1;\n for (let t = 0; t < this.length; t++) if (this.get(t) !== e.get(t)) return !1;\n return !0;\n }\n forEach(e) {\n for (let t = this.offset, n = this.limit(); t < n; t++) e(this.segments[t]);\n }\n toArray() {\n return this.segments.slice(this.offset, this.limit());\n }\n static comparator(e, t) {\n const n = Math.min(e.length, t.length);\n for (let r = 0; r < n; r++) {\n const n = e.get(r), i = t.get(r);\n if (n < i) return -1;\n if (n > i) return 1;\n }\n return e.length < t.length ? -1 : e.length > t.length ? 1 : 0;\n }\n}\n\n/**\n * A slash-separated path for navigating resources (documents and collections)\n * within Firestore.\n *\n * @internal\n */ class ResourcePath extends BasePath {\n construct(e, t, n) {\n return new ResourcePath(e, t, n);\n }\n canonicalString() {\n // NOTE: The client is ignorant of any path segments containing escape\n // sequences (e.g. __id123__) and just passes them through raw (they exist\n // for legacy reasons and should not be used frequently).\n return this.toArray().join(\"/\");\n }\n toString() {\n return this.canonicalString();\n }\n /**\n * Returns a string representation of this path\n * where each path segment has been encoded with\n * `encodeURIComponent`.\n */ toUriEncodedString() {\n return this.toArray().map(encodeURIComponent).join(\"/\");\n }\n /**\n * Creates a resource path from the given slash-delimited string. If multiple\n * arguments are provided, all components are combined. Leading and trailing\n * slashes from all components are ignored.\n */ static fromString(...e) {\n // NOTE: The client is ignorant of any path segments containing escape\n // sequences (e.g. __id123__) and just passes them through raw (they exist\n // for legacy reasons and should not be used frequently).\n const t = [];\n for (const n of e) {\n if (n.indexOf(\"//\") >= 0) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid segment (${n}). Paths must not contain // in them.`);\n // Strip leading and trailing slashed.\n t.push(...n.split(\"/\").filter((e => e.length > 0)));\n }\n return new ResourcePath(t);\n }\n static emptyPath() {\n return new ResourcePath([]);\n }\n}\n\nconst v = /^[_a-zA-Z][_a-zA-Z0-9]*$/;\n\n/**\n * A dot-separated path for navigating sub-objects within a document.\n * @internal\n */ class FieldPath$1 extends BasePath {\n construct(e, t, n) {\n return new FieldPath$1(e, t, n);\n }\n /**\n * Returns true if the string could be used as a segment in a field path\n * without escaping.\n */ static isValidIdentifier(e) {\n return v.test(e);\n }\n canonicalString() {\n return this.toArray().map((e => (e = e.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\"), \n FieldPath$1.isValidIdentifier(e) || (e = \"`\" + e + \"`\"), e))).join(\".\");\n }\n toString() {\n return this.canonicalString();\n }\n /**\n * Returns true if this field references the key of a document.\n */ isKeyField() {\n return 1 === this.length && \"__name__\" === this.get(0);\n }\n /**\n * The field designating the key of a document.\n */ static keyField() {\n return new FieldPath$1([ \"__name__\" ]);\n }\n /**\n * Parses a field string from the given server-formatted string.\n *\n * - Splitting the empty string is not allowed (for now at least).\n * - Empty segments within the string (e.g. if there are two consecutive\n * separators) are not allowed.\n *\n * TODO(b/37244157): we should make this more strict. Right now, it allows\n * non-identifier path components, even if they aren't escaped.\n */ static fromServerFormat(e) {\n const t = [];\n let n = \"\", r = 0;\n const __PRIVATE_addCurrentSegment = () => {\n if (0 === n.length) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid field path (${e}). Paths must not be empty, begin with '.', end with '.', or contain '..'`);\n t.push(n), n = \"\";\n };\n let i = !1;\n for (;r < e.length; ) {\n const t = e[r];\n if (\"\\\\\" === t) {\n if (r + 1 === e.length) throw new FirestoreError(D.INVALID_ARGUMENT, \"Path has trailing escape character: \" + e);\n const t = e[r + 1];\n if (\"\\\\\" !== t && \".\" !== t && \"`\" !== t) throw new FirestoreError(D.INVALID_ARGUMENT, \"Path has invalid escape sequence: \" + e);\n n += t, r += 2;\n } else \"`\" === t ? (i = !i, r++) : \".\" !== t || i ? (n += t, r++) : (__PRIVATE_addCurrentSegment(), \n r++);\n }\n if (__PRIVATE_addCurrentSegment(), i) throw new FirestoreError(D.INVALID_ARGUMENT, \"Unterminated ` in path: \" + e);\n return new FieldPath$1(t);\n }\n static emptyPath() {\n return new FieldPath$1([]);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @internal\n */ class DocumentKey {\n constructor(e) {\n this.path = e;\n }\n static fromPath(e) {\n return new DocumentKey(ResourcePath.fromString(e));\n }\n static fromName(e) {\n return new DocumentKey(ResourcePath.fromString(e).popFirst(5));\n }\n static empty() {\n return new DocumentKey(ResourcePath.emptyPath());\n }\n get collectionGroup() {\n return this.path.popLast().lastSegment();\n }\n /** Returns true if the document is in the specified collectionId. */ hasCollectionId(e) {\n return this.path.length >= 2 && this.path.get(this.path.length - 2) === e;\n }\n /** Returns the collection group (i.e. the name of the parent collection) for this key. */ getCollectionGroup() {\n return this.path.get(this.path.length - 2);\n }\n /** Returns the fully qualified path to the parent collection. */ getCollectionPath() {\n return this.path.popLast();\n }\n isEqual(e) {\n return null !== e && 0 === ResourcePath.comparator(this.path, e.path);\n }\n toString() {\n return this.path.toString();\n }\n static comparator(e, t) {\n return ResourcePath.comparator(e.path, t.path);\n }\n static isDocumentKey(e) {\n return e.length % 2 == 0;\n }\n /**\n * Creates and returns a new document key with the given segments.\n *\n * @param segments - The segments of the path to the document\n * @returns A new instance of DocumentKey\n */ static fromSegments(e) {\n return new DocumentKey(new ResourcePath(e.slice()));\n }\n}\n\n/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The initial mutation batch id for each index. Gets updated during index\n * backfill.\n */\n/**\n * An index definition for field indexes in Firestore.\n *\n * Every index is associated with a collection. The definition contains a list\n * of fields and their index kind (which can be `ASCENDING`, `DESCENDING` or\n * `CONTAINS` for ArrayContains/ArrayContainsAny queries).\n *\n * Unlike the backend, the SDK does not differentiate between collection or\n * collection group-scoped indices. Every index can be used for both single\n * collection and collection group queries.\n */\nclass FieldIndex {\n constructor(\n /**\n * The index ID. Returns -1 if the index ID is not available (e.g. the index\n * has not yet been persisted).\n */\n e, \n /** The collection ID this index applies to. */\n t, \n /** The field segments for this index. */\n n, \n /** Shows how up-to-date the index is for the current user. */\n r) {\n this.indexId = e, this.collectionGroup = t, this.fields = n, this.indexState = r;\n }\n}\n\n/** An ID for an index that has not yet been added to persistence. */\n/** Returns the ArrayContains/ArrayContainsAny segment for this index. */\nfunction __PRIVATE_fieldIndexGetArraySegment(e) {\n return e.fields.find((e => 2 /* IndexKind.CONTAINS */ === e.kind));\n}\n\n/** Returns all directional (ascending/descending) segments for this index. */ function __PRIVATE_fieldIndexGetDirectionalSegments(e) {\n return e.fields.filter((e => 2 /* IndexKind.CONTAINS */ !== e.kind));\n}\n\n/**\n * Returns the order of the document key component for the given index.\n *\n * PORTING NOTE: This is only used in the Web IndexedDb implementation.\n */\n/**\n * Compares indexes by collection group and segments. Ignores update time and\n * index ID.\n */\nfunction __PRIVATE_fieldIndexSemanticComparator(e, t) {\n let n = __PRIVATE_primitiveComparator(e.collectionGroup, t.collectionGroup);\n if (0 !== n) return n;\n for (let r = 0; r < Math.min(e.fields.length, t.fields.length); ++r) if (n = __PRIVATE_indexSegmentComparator(e.fields[r], t.fields[r]), \n 0 !== n) return n;\n return __PRIVATE_primitiveComparator(e.fields.length, t.fields.length);\n}\n\n/** Returns a debug representation of the field index */ FieldIndex.UNKNOWN_ID = -1;\n\n/** An index component consisting of field path and index type. */\nclass IndexSegment {\n constructor(\n /** The field path of the component. */\n e, \n /** The fields sorting order. */\n t) {\n this.fieldPath = e, this.kind = t;\n }\n}\n\nfunction __PRIVATE_indexSegmentComparator(e, t) {\n const n = FieldPath$1.comparator(e.fieldPath, t.fieldPath);\n return 0 !== n ? n : __PRIVATE_primitiveComparator(e.kind, t.kind);\n}\n\n/**\n * Stores the \"high water mark\" that indicates how updated the Index is for the\n * current user.\n */ class IndexState {\n constructor(\n /**\n * Indicates when the index was last updated (relative to other indexes).\n */\n e, \n /** The the latest indexed read time, document and batch id. */\n t) {\n this.sequenceNumber = e, this.offset = t;\n }\n /** The state of an index that has not yet been backfilled. */ static empty() {\n return new IndexState(0, IndexOffset.min());\n }\n}\n\n/**\n * Creates an offset that matches all documents with a read time higher than\n * `readTime`.\n */ function __PRIVATE_newIndexOffsetSuccessorFromReadTime(e, t) {\n // We want to create an offset that matches all documents with a read time\n // greater than the provided read time. To do so, we technically need to\n // create an offset for `(readTime, MAX_DOCUMENT_KEY)`. While we could use\n // Unicode codepoints to generate MAX_DOCUMENT_KEY, it is much easier to use\n // `(readTime + 1, DocumentKey.empty())` since `> DocumentKey.empty()` matches\n // all valid document IDs.\n const n = e.toTimestamp().seconds, r = e.toTimestamp().nanoseconds + 1, i = SnapshotVersion.fromTimestamp(1e9 === r ? new Timestamp(n + 1, 0) : new Timestamp(n, r));\n return new IndexOffset(i, DocumentKey.empty(), t);\n}\n\n/** Creates a new offset based on the provided document. */ function __PRIVATE_newIndexOffsetFromDocument(e) {\n return new IndexOffset(e.readTime, e.key, -1);\n}\n\n/**\n * Stores the latest read time, document and batch ID that were processed for an\n * index.\n */ class IndexOffset {\n constructor(\n /**\n * The latest read time version that has been indexed by Firestore for this\n * field index.\n */\n e, \n /**\n * The key of the last document that was indexed for this query. Use\n * `DocumentKey.empty()` if no document has been indexed.\n */\n t, \n /*\n * The largest mutation batch id that's been processed by Firestore.\n */\n n) {\n this.readTime = e, this.documentKey = t, this.largestBatchId = n;\n }\n /** Returns an offset that sorts before all regular offsets. */ static min() {\n return new IndexOffset(SnapshotVersion.min(), DocumentKey.empty(), -1);\n }\n /** Returns an offset that sorts after all regular offsets. */ static max() {\n return new IndexOffset(SnapshotVersion.max(), DocumentKey.empty(), -1);\n }\n}\n\nfunction __PRIVATE_indexOffsetComparator(e, t) {\n let n = e.readTime.compareTo(t.readTime);\n return 0 !== n ? n : (n = DocumentKey.comparator(e.documentKey, t.documentKey), \n 0 !== n ? n : __PRIVATE_primitiveComparator(e.largestBatchId, t.largestBatchId));\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const C = \"The current tab is not in the required state to perform this operation. It might be necessary to refresh the browser tab.\";\n\n/**\n * A base class representing a persistence transaction, encapsulating both the\n * transaction's sequence numbers as well as a list of onCommitted listeners.\n *\n * When you call Persistence.runTransaction(), it will create a transaction and\n * pass it to your callback. You then pass it to any method that operates\n * on persistence.\n */ class PersistenceTransaction {\n constructor() {\n this.onCommittedListeners = [];\n }\n addOnCommittedListener(e) {\n this.onCommittedListeners.push(e);\n }\n raiseOnCommittedEvent() {\n this.onCommittedListeners.forEach((e => e()));\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Verifies the error thrown by a LocalStore operation. If a LocalStore\n * operation fails because the primary lease has been taken by another client,\n * we ignore the error (the persistence layer will immediately call\n * `applyPrimaryLease` to propagate the primary state change). All other errors\n * are re-thrown.\n *\n * @param err - An error returned by a LocalStore operation.\n * @returns A Promise that resolves after we recovered, or the original error.\n */ async function __PRIVATE_ignoreIfPrimaryLeaseLoss(e) {\n if (e.code !== D.FAILED_PRECONDITION || e.message !== C) throw e;\n __PRIVATE_logDebug(\"LocalStore\", \"Unexpectedly lost primary lease\");\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * PersistencePromise is essentially a re-implementation of Promise except\n * it has a .next() method instead of .then() and .next() and .catch() callbacks\n * are executed synchronously when a PersistencePromise resolves rather than\n * asynchronously (Promise implementations use setImmediate() or similar).\n *\n * This is necessary to interoperate with IndexedDB which will automatically\n * commit transactions if control is returned to the event loop without\n * synchronously initiating another operation on the transaction.\n *\n * NOTE: .then() and .catch() only allow a single consumer, unlike normal\n * Promises.\n */ class PersistencePromise {\n constructor(e) {\n // NOTE: next/catchCallback will always point to our own wrapper functions,\n // not the user's raw next() or catch() callbacks.\n this.nextCallback = null, this.catchCallback = null, \n // When the operation resolves, we'll set result or error and mark isDone.\n this.result = void 0, this.error = void 0, this.isDone = !1, \n // Set to true when .then() or .catch() are called and prevents additional\n // chaining.\n this.callbackAttached = !1, e((e => {\n this.isDone = !0, this.result = e, this.nextCallback && \n // value should be defined unless T is Void, but we can't express\n // that in the type system.\n this.nextCallback(e);\n }), (e => {\n this.isDone = !0, this.error = e, this.catchCallback && this.catchCallback(e);\n }));\n }\n catch(e) {\n return this.next(void 0, e);\n }\n next(e, t) {\n return this.callbackAttached && fail(), this.callbackAttached = !0, this.isDone ? this.error ? this.wrapFailure(t, this.error) : this.wrapSuccess(e, this.result) : new PersistencePromise(((n, r) => {\n this.nextCallback = t => {\n this.wrapSuccess(e, t).next(n, r);\n }, this.catchCallback = e => {\n this.wrapFailure(t, e).next(n, r);\n };\n }));\n }\n toPromise() {\n return new Promise(((e, t) => {\n this.next(e, t);\n }));\n }\n wrapUserFunction(e) {\n try {\n const t = e();\n return t instanceof PersistencePromise ? t : PersistencePromise.resolve(t);\n } catch (e) {\n return PersistencePromise.reject(e);\n }\n }\n wrapSuccess(e, t) {\n return e ? this.wrapUserFunction((() => e(t))) : PersistencePromise.resolve(t);\n }\n wrapFailure(e, t) {\n return e ? this.wrapUserFunction((() => e(t))) : PersistencePromise.reject(t);\n }\n static resolve(e) {\n return new PersistencePromise(((t, n) => {\n t(e);\n }));\n }\n static reject(e) {\n return new PersistencePromise(((t, n) => {\n n(e);\n }));\n }\n static waitFor(\n // Accept all Promise types in waitFor().\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n e) {\n return new PersistencePromise(((t, n) => {\n let r = 0, i = 0, s = !1;\n e.forEach((e => {\n ++r, e.next((() => {\n ++i, s && i === r && t();\n }), (e => n(e)));\n })), s = !0, i === r && t();\n }));\n }\n /**\n * Given an array of predicate functions that asynchronously evaluate to a\n * boolean, implements a short-circuiting `or` between the results. Predicates\n * will be evaluated until one of them returns `true`, then stop. The final\n * result will be whether any of them returned `true`.\n */ static or(e) {\n let t = PersistencePromise.resolve(!1);\n for (const n of e) t = t.next((e => e ? PersistencePromise.resolve(e) : n()));\n return t;\n }\n static forEach(e, t) {\n const n = [];\n return e.forEach(((e, r) => {\n n.push(t.call(this, e, r));\n })), this.waitFor(n);\n }\n /**\n * Concurrently map all array elements through asynchronous function.\n */ static mapArray(e, t) {\n return new PersistencePromise(((n, r) => {\n const i = e.length, s = new Array(i);\n let o = 0;\n for (let _ = 0; _ < i; _++) {\n const a = _;\n t(e[a]).next((e => {\n s[a] = e, ++o, o === i && n(s);\n }), (e => r(e)));\n }\n }));\n }\n /**\n * An alternative to recursive PersistencePromise calls, that avoids\n * potential memory problems from unbounded chains of promises.\n *\n * The `action` will be called repeatedly while `condition` is true.\n */ static doWhile(e, t) {\n return new PersistencePromise(((n, r) => {\n const process = () => {\n !0 === e() ? t().next((() => {\n process();\n }), r) : n();\n };\n process();\n }));\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// References to `window` are guarded by SimpleDb.isAvailable()\n/* eslint-disable no-restricted-globals */\n/**\n * Wraps an IDBTransaction and exposes a store() method to get a handle to a\n * specific object store.\n */\nclass __PRIVATE_SimpleDbTransaction {\n constructor(e, t) {\n this.action = e, this.transaction = t, this.aborted = !1, \n /**\n * A `Promise` that resolves with the result of the IndexedDb transaction.\n */\n this.V = new __PRIVATE_Deferred, this.transaction.oncomplete = () => {\n this.V.resolve();\n }, this.transaction.onabort = () => {\n t.error ? this.V.reject(new __PRIVATE_IndexedDbTransactionError(e, t.error)) : this.V.resolve();\n }, this.transaction.onerror = t => {\n const n = __PRIVATE_checkForAndReportiOSError(t.target.error);\n this.V.reject(new __PRIVATE_IndexedDbTransactionError(e, n));\n };\n }\n static open(e, t, n, r) {\n try {\n return new __PRIVATE_SimpleDbTransaction(t, e.transaction(r, n));\n } catch (e) {\n throw new __PRIVATE_IndexedDbTransactionError(t, e);\n }\n }\n get m() {\n return this.V.promise;\n }\n abort(e) {\n e && this.V.reject(e), this.aborted || (__PRIVATE_logDebug(\"SimpleDb\", \"Aborting transaction:\", e ? e.message : \"Client-initiated abort\"), \n this.aborted = !0, this.transaction.abort());\n }\n g() {\n // If the browser supports V3 IndexedDB, we invoke commit() explicitly to\n // speed up index DB processing if the event loop remains blocks.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const e = this.transaction;\n this.aborted || \"function\" != typeof e.commit || e.commit();\n }\n /**\n * Returns a SimpleDbStore for the specified store. All\n * operations performed on the SimpleDbStore happen within the context of this\n * transaction and it cannot be used anymore once the transaction is\n * completed.\n *\n * Note that we can't actually enforce that the KeyType and ValueType are\n * correct, but they allow type safety through the rest of the consuming code.\n */ store(e) {\n const t = this.transaction.objectStore(e);\n return new __PRIVATE_SimpleDbStore(t);\n }\n}\n\n/**\n * Provides a wrapper around IndexedDb with a simplified interface that uses\n * Promise-like return values to chain operations. Real promises cannot be used\n * since .then() continuations are executed asynchronously (e.g. via\n * .setImmediate), which would cause IndexedDB to end the transaction.\n * See PersistencePromise for more details.\n */ class __PRIVATE_SimpleDb {\n /*\n * Creates a new SimpleDb wrapper for IndexedDb database `name`.\n *\n * Note that `version` must not be a downgrade. IndexedDB does not support\n * downgrading the schema version. We currently do not support any way to do\n * versioning outside of IndexedDB's versioning mechanism, as only\n * version-upgrade transactions are allowed to do things like create\n * objectstores.\n */\n constructor(e, t, n) {\n this.name = e, this.version = t, this.p = n;\n // NOTE: According to https://bugs.webkit.org/show_bug.cgi?id=197050, the\n // bug we're checking for should exist in iOS >= 12.2 and < 13, but for\n // whatever reason it's much harder to hit after 12.2 so we only proactively\n // log on 12.2.\n 12.2 === __PRIVATE_SimpleDb.S(getUA()) && __PRIVATE_logError(\"Firestore persistence suffers from a bug in iOS 12.2 Safari that may cause your app to stop working. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround.\");\n }\n /** Deletes the specified database. */ static delete(e) {\n return __PRIVATE_logDebug(\"SimpleDb\", \"Removing database:\", e), __PRIVATE_wrapRequest(window.indexedDB.deleteDatabase(e)).toPromise();\n }\n /** Returns true if IndexedDB is available in the current environment. */ static D() {\n if (!isIndexedDBAvailable()) return !1;\n if (__PRIVATE_SimpleDb.v()) return !0;\n // We extensively use indexed array values and compound keys,\n // which IE and Edge do not support. However, they still have indexedDB\n // defined on the window, so we need to check for them here and make sure\n // to return that persistence is not enabled for those browsers.\n // For tracking support of this feature, see here:\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/status/indexeddbarraysandmultientrysupport/\n // Check the UA string to find out the browser.\n const e = getUA(), t = __PRIVATE_SimpleDb.S(e), n = 0 < t && t < 10, r = __PRIVATE_getAndroidVersion(e), i = 0 < r && r < 4.5;\n // IE 10\n // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';\n // IE 11\n // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';\n // Edge\n // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,\n // like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0';\n // iOS Safari: Disable for users running iOS version < 10.\n return !(e.indexOf(\"MSIE \") > 0 || e.indexOf(\"Trident/\") > 0 || e.indexOf(\"Edge/\") > 0 || n || i);\n }\n /**\n * Returns true if the backing IndexedDB store is the Node IndexedDBShim\n * (see https://github.com/axemclion/IndexedDBShim).\n */ static v() {\n var e;\n return \"undefined\" != typeof process && \"YES\" === (null === (e = process.__PRIVATE_env) || void 0 === e ? void 0 : e.C);\n }\n /** Helper to get a typed SimpleDbStore from a transaction. */ static F(e, t) {\n return e.store(t);\n }\n // visible for testing\n /** Parse User Agent to determine iOS version. Returns -1 if not found. */\n static S(e) {\n const t = e.match(/i(?:phone|pad|pod) os ([\\d_]+)/i), n = t ? t[1].split(\"_\").slice(0, 2).join(\".\") : \"-1\";\n return Number(n);\n }\n /**\n * Opens the specified database, creating or upgrading it if necessary.\n */ async M(e) {\n return this.db || (__PRIVATE_logDebug(\"SimpleDb\", \"Opening database:\", this.name), \n this.db = await new Promise(((t, n) => {\n // TODO(mikelehen): Investigate browser compatibility.\n // https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB\n // suggests IE9 and older WebKit browsers handle upgrade\n // differently. They expect setVersion, as described here:\n // https://developer.mozilla.org/en-US/docs/Web/API/IDBVersionChangeRequest/setVersion\n const r = indexedDB.open(this.name, this.version);\n r.onsuccess = e => {\n const n = e.target.result;\n t(n);\n }, r.onblocked = () => {\n n(new __PRIVATE_IndexedDbTransactionError(e, \"Cannot upgrade IndexedDB schema while another tab is open. Close all tabs that access Firestore and reload this page to proceed.\"));\n }, r.onerror = t => {\n const r = t.target.error;\n \"VersionError\" === r.name ? n(new FirestoreError(D.FAILED_PRECONDITION, \"A newer version of the Firestore SDK was previously used and so the persisted data is not compatible with the version of the SDK you are now using. The SDK will operate with persistence disabled. If you need persistence, please re-upgrade to a newer version of the SDK or else clear the persisted IndexedDB data for your app to start fresh.\")) : \"InvalidStateError\" === r.name ? n(new FirestoreError(D.FAILED_PRECONDITION, \"Unable to open an IndexedDB connection. This could be due to running in a private browsing session on a browser whose private browsing sessions do not support IndexedDB: \" + r)) : n(new __PRIVATE_IndexedDbTransactionError(e, r));\n }, r.onupgradeneeded = e => {\n __PRIVATE_logDebug(\"SimpleDb\", 'Database \"' + this.name + '\" requires upgrade from version:', e.oldVersion);\n const t = e.target.result;\n this.p.O(t, r.transaction, e.oldVersion, this.version).next((() => {\n __PRIVATE_logDebug(\"SimpleDb\", \"Database upgrade to version \" + this.version + \" complete\");\n }));\n };\n }))), this.N && (this.db.onversionchange = e => this.N(e)), this.db;\n }\n L(e) {\n this.N = e, this.db && (this.db.onversionchange = t => e(t));\n }\n async runTransaction(e, t, n, r) {\n const i = \"readonly\" === t;\n let s = 0;\n for (;;) {\n ++s;\n try {\n this.db = await this.M(e);\n const t = __PRIVATE_SimpleDbTransaction.open(this.db, e, i ? \"readonly\" : \"readwrite\", n), s = r(t).next((e => (t.g(), \n e))).catch((e => (\n // Abort the transaction if there was an error.\n t.abort(e), PersistencePromise.reject(e)))).toPromise();\n // As noted above, errors are propagated by aborting the transaction. So\n // we swallow any error here to avoid the browser logging it as unhandled.\n return s.catch((() => {})), \n // Wait for the transaction to complete (i.e. IndexedDb's onsuccess event to\n // fire), but still return the original transactionFnResult back to the\n // caller.\n await t.m, s;\n } catch (e) {\n const t = e, n = \"FirebaseError\" !== t.name && s < 3;\n // TODO(schmidt-sebastian): We could probably be smarter about this and\n // not retry exceptions that are likely unrecoverable (such as quota\n // exceeded errors).\n // Note: We cannot use an instanceof check for FirestoreException, since the\n // exception is wrapped in a generic error by our async/await handling.\n if (__PRIVATE_logDebug(\"SimpleDb\", \"Transaction failed with error:\", t.message, \"Retrying:\", n), \n this.close(), !n) return Promise.reject(t);\n }\n }\n }\n close() {\n this.db && this.db.close(), this.db = void 0;\n }\n}\n\n/** Parse User Agent to determine Android version. Returns -1 if not found. */ function __PRIVATE_getAndroidVersion(e) {\n const t = e.match(/Android ([\\d.]+)/i), n = t ? t[1].split(\".\").slice(0, 2).join(\".\") : \"-1\";\n return Number(n);\n}\n\n/**\n * A controller for iterating over a key range or index. It allows an iterate\n * callback to delete the currently-referenced object, or jump to a new key\n * within the key range or index.\n */ class __PRIVATE_IterationController {\n constructor(e) {\n this.B = e, this.k = !1, this.q = null;\n }\n get isDone() {\n return this.k;\n }\n get K() {\n return this.q;\n }\n set cursor(e) {\n this.B = e;\n }\n /**\n * This function can be called to stop iteration at any point.\n */ done() {\n this.k = !0;\n }\n /**\n * This function can be called to skip to that next key, which could be\n * an index or a primary key.\n */ $(e) {\n this.q = e;\n }\n /**\n * Delete the current cursor value from the object store.\n *\n * NOTE: You CANNOT do this with a keysOnly query.\n */ delete() {\n return __PRIVATE_wrapRequest(this.B.delete());\n }\n}\n\n/** An error that wraps exceptions that thrown during IndexedDB execution. */ class __PRIVATE_IndexedDbTransactionError extends FirestoreError {\n constructor(e, t) {\n super(D.UNAVAILABLE, `IndexedDB transaction '${e}' failed: ${t}`), this.name = \"IndexedDbTransactionError\";\n }\n}\n\n/** Verifies whether `e` is an IndexedDbTransactionError. */ function __PRIVATE_isIndexedDbTransactionError(e) {\n // Use name equality, as instanceof checks on errors don't work with errors\n // that wrap other errors.\n return \"IndexedDbTransactionError\" === e.name;\n}\n\n/**\n * A wrapper around an IDBObjectStore providing an API that:\n *\n * 1) Has generic KeyType / ValueType parameters to provide strongly-typed\n * methods for acting against the object store.\n * 2) Deals with IndexedDB's onsuccess / onerror event callbacks, making every\n * method return a PersistencePromise instead.\n * 3) Provides a higher-level API to avoid needing to do excessive wrapping of\n * intermediate IndexedDB types (IDBCursorWithValue, etc.)\n */ class __PRIVATE_SimpleDbStore {\n constructor(e) {\n this.store = e;\n }\n put(e, t) {\n let n;\n return void 0 !== t ? (__PRIVATE_logDebug(\"SimpleDb\", \"PUT\", this.store.name, e, t), \n n = this.store.put(t, e)) : (__PRIVATE_logDebug(\"SimpleDb\", \"PUT\", this.store.name, \"\", e), \n n = this.store.put(e)), __PRIVATE_wrapRequest(n);\n }\n /**\n * Adds a new value into an Object Store and returns the new key. Similar to\n * IndexedDb's `add()`, this method will fail on primary key collisions.\n *\n * @param value - The object to write.\n * @returns The key of the value to add.\n */ add(e) {\n __PRIVATE_logDebug(\"SimpleDb\", \"ADD\", this.store.name, e, e);\n return __PRIVATE_wrapRequest(this.store.add(e));\n }\n /**\n * Gets the object with the specified key from the specified store, or null\n * if no object exists with the specified key.\n *\n * @key The key of the object to get.\n * @returns The object with the specified key or null if no object exists.\n */ get(e) {\n // We're doing an unsafe cast to ValueType.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return __PRIVATE_wrapRequest(this.store.get(e)).next((t => (\n // Normalize nonexistence to null.\n void 0 === t && (t = null), __PRIVATE_logDebug(\"SimpleDb\", \"GET\", this.store.name, e, t), \n t)));\n }\n delete(e) {\n __PRIVATE_logDebug(\"SimpleDb\", \"DELETE\", this.store.name, e);\n return __PRIVATE_wrapRequest(this.store.delete(e));\n }\n /**\n * If we ever need more of the count variants, we can add overloads. For now,\n * all we need is to count everything in a store.\n *\n * Returns the number of rows in the store.\n */ count() {\n __PRIVATE_logDebug(\"SimpleDb\", \"COUNT\", this.store.name);\n return __PRIVATE_wrapRequest(this.store.count());\n }\n U(e, t) {\n const n = this.options(e, t), r = n.index ? this.store.index(n.index) : this.store;\n // Use `getAll()` if the browser supports IndexedDB v3, as it is roughly\n // 20% faster.\n if (\"function\" == typeof r.getAll) {\n const e = r.getAll(n.range);\n return new PersistencePromise(((t, n) => {\n e.onerror = e => {\n n(e.target.error);\n }, e.onsuccess = e => {\n t(e.target.result);\n };\n }));\n }\n {\n const e = this.cursor(n), t = [];\n return this.W(e, ((e, n) => {\n t.push(n);\n })).next((() => t));\n }\n }\n /**\n * Loads the first `count` elements from the provided index range. Loads all\n * elements if no limit is provided.\n */ G(e, t) {\n const n = this.store.getAll(e, null === t ? void 0 : t);\n return new PersistencePromise(((e, t) => {\n n.onerror = e => {\n t(e.target.error);\n }, n.onsuccess = t => {\n e(t.target.result);\n };\n }));\n }\n j(e, t) {\n __PRIVATE_logDebug(\"SimpleDb\", \"DELETE ALL\", this.store.name);\n const n = this.options(e, t);\n n.H = !1;\n const r = this.cursor(n);\n return this.W(r, ((e, t, n) => n.delete()));\n }\n J(e, t) {\n let n;\n t ? n = e : (n = {}, t = e);\n const r = this.cursor(n);\n return this.W(r, t);\n }\n /**\n * Iterates over a store, but waits for the given callback to complete for\n * each entry before iterating the next entry. This allows the callback to do\n * asynchronous work to determine if this iteration should continue.\n *\n * The provided callback should return `true` to continue iteration, and\n * `false` otherwise.\n */ Y(e) {\n const t = this.cursor({});\n return new PersistencePromise(((n, r) => {\n t.onerror = e => {\n const t = __PRIVATE_checkForAndReportiOSError(e.target.error);\n r(t);\n }, t.onsuccess = t => {\n const r = t.target.result;\n r ? e(r.primaryKey, r.value).next((e => {\n e ? r.continue() : n();\n })) : n();\n };\n }));\n }\n W(e, t) {\n const n = [];\n return new PersistencePromise(((r, i) => {\n e.onerror = e => {\n i(e.target.error);\n }, e.onsuccess = e => {\n const i = e.target.result;\n if (!i) return void r();\n const s = new __PRIVATE_IterationController(i), o = t(i.primaryKey, i.value, s);\n if (o instanceof PersistencePromise) {\n const e = o.catch((e => (s.done(), PersistencePromise.reject(e))));\n n.push(e);\n }\n s.isDone ? r() : null === s.K ? i.continue() : i.continue(s.K);\n };\n })).next((() => PersistencePromise.waitFor(n)));\n }\n options(e, t) {\n let n;\n return void 0 !== e && (\"string\" == typeof e ? n = e : t = e), {\n index: n,\n range: t\n };\n }\n cursor(e) {\n let t = \"next\";\n if (e.reverse && (t = \"prev\"), e.index) {\n const n = this.store.index(e.index);\n return e.H ? n.openKeyCursor(e.range, t) : n.openCursor(e.range, t);\n }\n return this.store.openCursor(e.range, t);\n }\n}\n\n/**\n * Wraps an IDBRequest in a PersistencePromise, using the onsuccess / onerror\n * handlers to resolve / reject the PersistencePromise as appropriate.\n */ function __PRIVATE_wrapRequest(e) {\n return new PersistencePromise(((t, n) => {\n e.onsuccess = e => {\n const n = e.target.result;\n t(n);\n }, e.onerror = e => {\n const t = __PRIVATE_checkForAndReportiOSError(e.target.error);\n n(t);\n };\n }));\n}\n\n// Guard so we only report the error once.\nlet F = !1;\n\nfunction __PRIVATE_checkForAndReportiOSError(e) {\n const t = __PRIVATE_SimpleDb.S(getUA());\n if (t >= 12.2 && t < 13) {\n const t = \"An internal error was encountered in the Indexed Database server\";\n if (e.message.indexOf(t) >= 0) {\n // Wrap error in a more descriptive one.\n const e = new FirestoreError(\"internal\", `IOS_INDEXEDDB_BUG1: IndexedDb has thrown '${t}'. This is likely due to an unavoidable bug in iOS. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround.`);\n return F || (F = !0, \n // Throw a global exception outside of this promise chain, for the user to\n // potentially catch.\n setTimeout((() => {\n throw e;\n }), 0)), e;\n }\n }\n return e;\n}\n\n/** This class is responsible for the scheduling of Index Backfiller. */\nclass __PRIVATE_IndexBackfillerScheduler {\n constructor(e, t) {\n this.asyncQueue = e, this.Z = t, this.task = null;\n }\n start() {\n this.X(15e3);\n }\n stop() {\n this.task && (this.task.cancel(), this.task = null);\n }\n get started() {\n return null !== this.task;\n }\n X(e) {\n __PRIVATE_logDebug(\"IndexBackfiller\", `Scheduled in ${e}ms`), this.task = this.asyncQueue.enqueueAfterDelay(\"index_backfill\" /* TimerId.IndexBackfill */ , e, (async () => {\n this.task = null;\n try {\n __PRIVATE_logDebug(\"IndexBackfiller\", `Documents written: ${await this.Z.ee()}`);\n } catch (e) {\n __PRIVATE_isIndexedDbTransactionError(e) ? __PRIVATE_logDebug(\"IndexBackfiller\", \"Ignoring IndexedDB error during index backfill: \", e) : await __PRIVATE_ignoreIfPrimaryLeaseLoss(e);\n }\n await this.X(6e4);\n }));\n }\n}\n\n/** Implements the steps for backfilling indexes. */ class __PRIVATE_IndexBackfiller {\n constructor(\n /**\n * LocalStore provides access to IndexManager and LocalDocumentView.\n * These properties will update when the user changes. Consequently,\n * making a local copy of IndexManager and LocalDocumentView will require\n * updates over time. The simpler solution is to rely on LocalStore to have\n * an up-to-date references to IndexManager and LocalDocumentStore.\n */\n e, t) {\n this.localStore = e, this.persistence = t;\n }\n async ee(e = 50) {\n return this.persistence.runTransaction(\"Backfill Indexes\", \"readwrite-primary\", (t => this.te(t, e)));\n }\n /** Writes index entries until the cap is reached. Returns the number of documents processed. */ te(e, t) {\n const n = new Set;\n let r = t, i = !0;\n return PersistencePromise.doWhile((() => !0 === i && r > 0), (() => this.localStore.indexManager.getNextCollectionGroupToUpdate(e).next((t => {\n if (null !== t && !n.has(t)) return __PRIVATE_logDebug(\"IndexBackfiller\", `Processing collection: ${t}`), \n this.ne(e, t, r).next((e => {\n r -= e, n.add(t);\n }));\n i = !1;\n })))).next((() => t - r));\n }\n /**\n * Writes entries for the provided collection group. Returns the number of documents processed.\n */ ne(e, t, n) {\n // Use the earliest offset of all field indexes to query the local cache.\n return this.localStore.indexManager.getMinOffsetFromCollectionGroup(e, t).next((r => this.localStore.localDocuments.getNextDocuments(e, t, r, n).next((n => {\n const i = n.changes;\n return this.localStore.indexManager.updateIndexEntries(e, i).next((() => this.re(r, n))).next((n => (__PRIVATE_logDebug(\"IndexBackfiller\", `Updating offset: ${n}`), \n this.localStore.indexManager.updateCollectionGroup(e, t, n)))).next((() => i.size));\n }))));\n }\n /** Returns the next offset based on the provided documents. */ re(e, t) {\n let n = e;\n return t.changes.forEach(((e, t) => {\n const r = __PRIVATE_newIndexOffsetFromDocument(t);\n __PRIVATE_indexOffsetComparator(r, n) > 0 && (n = r);\n })), new IndexOffset(n.readTime, n.documentKey, Math.max(t.batchId, e.largestBatchId));\n }\n}\n\n/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * `ListenSequence` is a monotonic sequence. It is initialized with a minimum value to\n * exceed. All subsequent calls to next will return increasing values. If provided with a\n * `SequenceNumberSyncer`, it will additionally bump its next value when told of a new value, as\n * well as write out sequence numbers that it produces via `next()`.\n */ class __PRIVATE_ListenSequence {\n constructor(e, t) {\n this.previousValue = e, t && (t.sequenceNumberHandler = e => this.ie(e), this.se = e => t.writeSequenceNumber(e));\n }\n ie(e) {\n return this.previousValue = Math.max(e, this.previousValue), this.previousValue;\n }\n next() {\n const e = ++this.previousValue;\n return this.se && this.se(e), e;\n }\n}\n\n__PRIVATE_ListenSequence.oe = -1;\n\n/**\n * Returns whether a variable is either undefined or null.\n */\nfunction __PRIVATE_isNullOrUndefined(e) {\n return null == e;\n}\n\n/** Returns whether the value represents -0. */ function __PRIVATE_isNegativeZero(e) {\n // Detect if the value is -0.0. Based on polyfill from\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n return 0 === e && 1 / e == -1 / 0;\n}\n\n/**\n * Returns whether a value is an integer and in the safe integer range\n * @param value - The value to test for being an integer and in the safe range\n */ function isSafeInteger(e) {\n return \"number\" == typeof e && Number.isInteger(e) && !__PRIVATE_isNegativeZero(e) && e <= Number.MAX_SAFE_INTEGER && e >= Number.MIN_SAFE_INTEGER;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Encodes a resource path into a IndexedDb-compatible string form.\n */\nfunction __PRIVATE_encodeResourcePath(e) {\n let t = \"\";\n for (let n = 0; n < e.length; n++) t.length > 0 && (t = __PRIVATE_encodeSeparator(t)), \n t = __PRIVATE_encodeSegment(e.get(n), t);\n return __PRIVATE_encodeSeparator(t);\n}\n\n/** Encodes a single segment of a resource path into the given result */ function __PRIVATE_encodeSegment(e, t) {\n let n = t;\n const r = e.length;\n for (let t = 0; t < r; t++) {\n const r = e.charAt(t);\n switch (r) {\n case \"\\0\":\n n += \"\u0001\u0010\";\n break;\n\n case \"\u0001\":\n n += \"\u0001\u0011\";\n break;\n\n default:\n n += r;\n }\n }\n return n;\n}\n\n/** Encodes a path separator into the given result */ function __PRIVATE_encodeSeparator(e) {\n return e + \"\u0001\u0001\";\n}\n\n/**\n * Decodes the given IndexedDb-compatible string form of a resource path into\n * a ResourcePath instance. Note that this method is not suitable for use with\n * decoding resource names from the server; those are One Platform format\n * strings.\n */ function __PRIVATE_decodeResourcePath(e) {\n // Event the empty path must encode as a path of at least length 2. A path\n // with exactly 2 must be the empty path.\n const t = e.length;\n if (__PRIVATE_hardAssert(t >= 2), 2 === t) return __PRIVATE_hardAssert(\"\u0001\" === e.charAt(0) && \"\u0001\" === e.charAt(1)), \n ResourcePath.emptyPath();\n // Escape characters cannot exist past the second-to-last position in the\n // source value.\n const __PRIVATE_lastReasonableEscapeIndex = t - 2, n = [];\n let r = \"\";\n for (let i = 0; i < t; ) {\n // The last two characters of a valid encoded path must be a separator, so\n // there must be an end to this segment.\n const t = e.indexOf(\"\u0001\", i);\n (t < 0 || t > __PRIVATE_lastReasonableEscapeIndex) && fail();\n switch (e.charAt(t + 1)) {\n case \"\u0001\":\n const s = e.substring(i, t);\n let o;\n 0 === r.length ? \n // Avoid copying for the common case of a segment that excludes \\0\n // and \\001\n o = s : (r += s, o = r, r = \"\"), n.push(o);\n break;\n\n case \"\u0010\":\n r += e.substring(i, t), r += \"\\0\";\n break;\n\n case \"\u0011\":\n // The escape character can be used in the output to encode itself.\n r += e.substring(i, t + 1);\n break;\n\n default:\n fail();\n }\n i = t + 2;\n }\n return new ResourcePath(n);\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const M = [ \"userId\", \"batchId\" ];\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Name of the IndexedDb object store.\n *\n * Note that the name 'owner' is chosen to ensure backwards compatibility with\n * older clients that only supported single locked access to the persistence\n * layer.\n */\n/**\n * Creates a [userId, encodedPath] key for use in the DbDocumentMutations\n * index to iterate over all at document mutations for a given path or lower.\n */\nfunction __PRIVATE_newDbDocumentMutationPrefixForPath(e, t) {\n return [ e, __PRIVATE_encodeResourcePath(t) ];\n}\n\n/**\n * Creates a full index key of [userId, encodedPath, batchId] for inserting\n * and deleting into the DbDocumentMutations index.\n */ function __PRIVATE_newDbDocumentMutationKey(e, t, n) {\n return [ e, __PRIVATE_encodeResourcePath(t), n ];\n}\n\n/**\n * Because we store all the useful information for this store in the key,\n * there is no useful information to store as the value. The raw (unencoded)\n * path cannot be stored because IndexedDb doesn't store prototype\n * information.\n */ const x = {}, O = [ \"prefixPath\", \"collectionGroup\", \"readTime\", \"documentId\" ], N = [ \"prefixPath\", \"collectionGroup\", \"documentId\" ], L = [ \"collectionGroup\", \"readTime\", \"prefixPath\", \"documentId\" ], B = [ \"canonicalId\", \"targetId\" ], k = [ \"targetId\", \"path\" ], q = [ \"path\", \"targetId\" ], Q = [ \"collectionId\", \"parent\" ], K = [ \"indexId\", \"uid\" ], $ = [ \"uid\", \"sequenceNumber\" ], U = [ \"indexId\", \"uid\", \"arrayValue\", \"directionalValue\", \"orderedDocumentKey\", \"documentKey\" ], W = [ \"indexId\", \"uid\", \"orderedDocumentKey\" ], G = [ \"userId\", \"collectionPath\", \"documentId\" ], z = [ \"userId\", \"collectionPath\", \"largestBatchId\" ], j = [ \"userId\", \"collectionGroup\", \"largestBatchId\" ], H = [ ...[ ...[ ...[ ...[ \"mutationQueues\", \"mutations\", \"documentMutations\", \"remoteDocuments\", \"targets\", \"owner\", \"targetGlobal\", \"targetDocuments\" ], \"clientMetadata\" ], \"remoteDocumentGlobal\" ], \"collectionParents\" ], \"bundles\", \"namedQueries\" ], J = [ ...H, \"documentOverlays\" ], Y = [ \"mutationQueues\", \"mutations\", \"documentMutations\", \"remoteDocumentsV14\", \"targets\", \"owner\", \"targetGlobal\", \"targetDocuments\", \"clientMetadata\", \"remoteDocumentGlobal\", \"collectionParents\", \"bundles\", \"namedQueries\", \"documentOverlays\" ], Z = Y, X = [ ...Z, \"indexConfiguration\", \"indexState\", \"indexEntries\" ], ee = X, te = [ ...X, \"globals\" ];\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass __PRIVATE_IndexedDbTransaction extends PersistenceTransaction {\n constructor(e, t) {\n super(), this._e = e, this.currentSequenceNumber = t;\n }\n}\n\nfunction __PRIVATE_getStore(e, t) {\n const n = __PRIVATE_debugCast(e);\n return __PRIVATE_SimpleDb.F(n._e, t);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ function __PRIVATE_objectSize(e) {\n let t = 0;\n for (const n in e) Object.prototype.hasOwnProperty.call(e, n) && t++;\n return t;\n}\n\nfunction forEach(e, t) {\n for (const n in e) Object.prototype.hasOwnProperty.call(e, n) && t(n, e[n]);\n}\n\nfunction __PRIVATE_mapToArray(e, t) {\n const n = [];\n for (const r in e) Object.prototype.hasOwnProperty.call(e, r) && n.push(t(e[r], r, e));\n return n;\n}\n\nfunction isEmpty(e) {\n for (const t in e) if (Object.prototype.hasOwnProperty.call(e, t)) return !1;\n return !0;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// An immutable sorted map implementation, based on a Left-leaning Red-Black\n// tree.\nclass SortedMap {\n constructor(e, t) {\n this.comparator = e, this.root = t || LLRBNode.EMPTY;\n }\n // Returns a copy of the map, with the specified key/value added or replaced.\n insert(e, t) {\n return new SortedMap(this.comparator, this.root.insert(e, t, this.comparator).copy(null, null, LLRBNode.BLACK, null, null));\n }\n // Returns a copy of the map, with the specified key removed.\n remove(e) {\n return new SortedMap(this.comparator, this.root.remove(e, this.comparator).copy(null, null, LLRBNode.BLACK, null, null));\n }\n // Returns the value of the node with the given key, or null.\n get(e) {\n let t = this.root;\n for (;!t.isEmpty(); ) {\n const n = this.comparator(e, t.key);\n if (0 === n) return t.value;\n n < 0 ? t = t.left : n > 0 && (t = t.right);\n }\n return null;\n }\n // Returns the index of the element in this sorted map, or -1 if it doesn't\n // exist.\n indexOf(e) {\n // Number of nodes that were pruned when descending right\n let t = 0, n = this.root;\n for (;!n.isEmpty(); ) {\n const r = this.comparator(e, n.key);\n if (0 === r) return t + n.left.size;\n r < 0 ? n = n.left : (\n // Count all nodes left of the node plus the node itself\n t += n.left.size + 1, n = n.right);\n }\n // Node not found\n return -1;\n }\n isEmpty() {\n return this.root.isEmpty();\n }\n // Returns the total number of nodes in the map.\n get size() {\n return this.root.size;\n }\n // Returns the minimum key in the map.\n minKey() {\n return this.root.minKey();\n }\n // Returns the maximum key in the map.\n maxKey() {\n return this.root.maxKey();\n }\n // Traverses the map in key order and calls the specified action function\n // for each key/value pair. If action returns true, traversal is aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n inorderTraversal(e) {\n return this.root.inorderTraversal(e);\n }\n forEach(e) {\n this.inorderTraversal(((t, n) => (e(t, n), !1)));\n }\n toString() {\n const e = [];\n return this.inorderTraversal(((t, n) => (e.push(`${t}:${n}`), !1))), `{${e.join(\", \")}}`;\n }\n // Traverses the map in reverse key order and calls the specified action\n // function for each key/value pair. If action returns true, traversal is\n // aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n reverseTraversal(e) {\n return this.root.reverseTraversal(e);\n }\n // Returns an iterator over the SortedMap.\n getIterator() {\n return new SortedMapIterator(this.root, null, this.comparator, !1);\n }\n getIteratorFrom(e) {\n return new SortedMapIterator(this.root, e, this.comparator, !1);\n }\n getReverseIterator() {\n return new SortedMapIterator(this.root, null, this.comparator, !0);\n }\n getReverseIteratorFrom(e) {\n return new SortedMapIterator(this.root, e, this.comparator, !0);\n }\n}\n\n // end SortedMap\n// An iterator over an LLRBNode.\nclass SortedMapIterator {\n constructor(e, t, n, r) {\n this.isReverse = r, this.nodeStack = [];\n let i = 1;\n for (;!e.isEmpty(); ) if (i = t ? n(e.key, t) : 1, \n // flip the comparison if we're going in reverse\n t && r && (i *= -1), i < 0) \n // This node is less than our start key. ignore it\n e = this.isReverse ? e.left : e.right; else {\n if (0 === i) {\n // This node is exactly equal to our start key. Push it on the stack,\n // but stop iterating;\n this.nodeStack.push(e);\n break;\n }\n // This node is greater than our start key, add it to the stack and move\n // to the next one\n this.nodeStack.push(e), e = this.isReverse ? e.right : e.left;\n }\n }\n getNext() {\n let e = this.nodeStack.pop();\n const t = {\n key: e.key,\n value: e.value\n };\n if (this.isReverse) for (e = e.left; !e.isEmpty(); ) this.nodeStack.push(e), e = e.right; else for (e = e.right; !e.isEmpty(); ) this.nodeStack.push(e), \n e = e.left;\n return t;\n }\n hasNext() {\n return this.nodeStack.length > 0;\n }\n peek() {\n if (0 === this.nodeStack.length) return null;\n const e = this.nodeStack[this.nodeStack.length - 1];\n return {\n key: e.key,\n value: e.value\n };\n }\n}\n\n // end SortedMapIterator\n// Represents a node in a Left-leaning Red-Black tree.\nclass LLRBNode {\n constructor(e, t, n, r, i) {\n this.key = e, this.value = t, this.color = null != n ? n : LLRBNode.RED, this.left = null != r ? r : LLRBNode.EMPTY, \n this.right = null != i ? i : LLRBNode.EMPTY, this.size = this.left.size + 1 + this.right.size;\n }\n // Returns a copy of the current node, optionally replacing pieces of it.\n copy(e, t, n, r, i) {\n return new LLRBNode(null != e ? e : this.key, null != t ? t : this.value, null != n ? n : this.color, null != r ? r : this.left, null != i ? i : this.right);\n }\n isEmpty() {\n return !1;\n }\n // Traverses the tree in key order and calls the specified action function\n // for each node. If action returns true, traversal is aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n inorderTraversal(e) {\n return this.left.inorderTraversal(e) || e(this.key, this.value) || this.right.inorderTraversal(e);\n }\n // Traverses the tree in reverse key order and calls the specified action\n // function for each node. If action returns true, traversal is aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n reverseTraversal(e) {\n return this.right.reverseTraversal(e) || e(this.key, this.value) || this.left.reverseTraversal(e);\n }\n // Returns the minimum node in the tree.\n min() {\n return this.left.isEmpty() ? this : this.left.min();\n }\n // Returns the maximum key in the tree.\n minKey() {\n return this.min().key;\n }\n // Returns the maximum key in the tree.\n maxKey() {\n return this.right.isEmpty() ? this.key : this.right.maxKey();\n }\n // Returns new tree, with the key/value added.\n insert(e, t, n) {\n let r = this;\n const i = n(e, r.key);\n return r = i < 0 ? r.copy(null, null, null, r.left.insert(e, t, n), null) : 0 === i ? r.copy(null, t, null, null, null) : r.copy(null, null, null, null, r.right.insert(e, t, n)), \n r.fixUp();\n }\n removeMin() {\n if (this.left.isEmpty()) return LLRBNode.EMPTY;\n let e = this;\n return e.left.isRed() || e.left.left.isRed() || (e = e.moveRedLeft()), e = e.copy(null, null, null, e.left.removeMin(), null), \n e.fixUp();\n }\n // Returns new tree, with the specified item removed.\n remove(e, t) {\n let n, r = this;\n if (t(e, r.key) < 0) r.left.isEmpty() || r.left.isRed() || r.left.left.isRed() || (r = r.moveRedLeft()), \n r = r.copy(null, null, null, r.left.remove(e, t), null); else {\n if (r.left.isRed() && (r = r.rotateRight()), r.right.isEmpty() || r.right.isRed() || r.right.left.isRed() || (r = r.moveRedRight()), \n 0 === t(e, r.key)) {\n if (r.right.isEmpty()) return LLRBNode.EMPTY;\n n = r.right.min(), r = r.copy(n.key, n.value, null, null, r.right.removeMin());\n }\n r = r.copy(null, null, null, null, r.right.remove(e, t));\n }\n return r.fixUp();\n }\n isRed() {\n return this.color;\n }\n // Returns new tree after performing any needed rotations.\n fixUp() {\n let e = this;\n return e.right.isRed() && !e.left.isRed() && (e = e.rotateLeft()), e.left.isRed() && e.left.left.isRed() && (e = e.rotateRight()), \n e.left.isRed() && e.right.isRed() && (e = e.colorFlip()), e;\n }\n moveRedLeft() {\n let e = this.colorFlip();\n return e.right.left.isRed() && (e = e.copy(null, null, null, null, e.right.rotateRight()), \n e = e.rotateLeft(), e = e.colorFlip()), e;\n }\n moveRedRight() {\n let e = this.colorFlip();\n return e.left.left.isRed() && (e = e.rotateRight(), e = e.colorFlip()), e;\n }\n rotateLeft() {\n const e = this.copy(null, null, LLRBNode.RED, null, this.right.left);\n return this.right.copy(null, null, this.color, e, null);\n }\n rotateRight() {\n const e = this.copy(null, null, LLRBNode.RED, this.left.right, null);\n return this.left.copy(null, null, this.color, null, e);\n }\n colorFlip() {\n const e = this.left.copy(null, null, !this.left.color, null, null), t = this.right.copy(null, null, !this.right.color, null, null);\n return this.copy(null, null, !this.color, e, t);\n }\n // For testing.\n checkMaxDepth() {\n const e = this.check();\n return Math.pow(2, e) <= this.size + 1;\n }\n // In a balanced RB tree, the black-depth (number of black nodes) from root to\n // leaves is equal on both sides. This function verifies that or asserts.\n check() {\n if (this.isRed() && this.left.isRed()) throw fail();\n if (this.right.isRed()) throw fail();\n const e = this.left.check();\n if (e !== this.right.check()) throw fail();\n return e + (this.isRed() ? 0 : 1);\n }\n}\n\n // end LLRBNode\n// Empty node is shared between all LLRB trees.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nLLRBNode.EMPTY = null, LLRBNode.RED = !0, LLRBNode.BLACK = !1;\n\n// end LLRBEmptyNode\nLLRBNode.EMPTY = new \n// Represents an empty node (a leaf node in the Red-Black Tree).\nclass LLRBEmptyNode {\n constructor() {\n this.size = 0;\n }\n get key() {\n throw fail();\n }\n get value() {\n throw fail();\n }\n get color() {\n throw fail();\n }\n get left() {\n throw fail();\n }\n get right() {\n throw fail();\n }\n // Returns a copy of the current node.\n copy(e, t, n, r, i) {\n return this;\n }\n // Returns a copy of the tree, with the specified key/value added.\n insert(e, t, n) {\n return new LLRBNode(e, t);\n }\n // Returns a copy of the tree, with the specified key removed.\n remove(e, t) {\n return this;\n }\n isEmpty() {\n return !0;\n }\n inorderTraversal(e) {\n return !1;\n }\n reverseTraversal(e) {\n return !1;\n }\n minKey() {\n return null;\n }\n maxKey() {\n return null;\n }\n isRed() {\n return !1;\n }\n // For testing.\n checkMaxDepth() {\n return !0;\n }\n check() {\n return 0;\n }\n};\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * SortedSet is an immutable (copy-on-write) collection that holds elements\n * in order specified by the provided comparator.\n *\n * NOTE: if provided comparator returns 0 for two elements, we consider them to\n * be equal!\n */\nclass SortedSet {\n constructor(e) {\n this.comparator = e, this.data = new SortedMap(this.comparator);\n }\n has(e) {\n return null !== this.data.get(e);\n }\n first() {\n return this.data.minKey();\n }\n last() {\n return this.data.maxKey();\n }\n get size() {\n return this.data.size;\n }\n indexOf(e) {\n return this.data.indexOf(e);\n }\n /** Iterates elements in order defined by \"comparator\" */ forEach(e) {\n this.data.inorderTraversal(((t, n) => (e(t), !1)));\n }\n /** Iterates over `elem`s such that: range[0] <= elem < range[1]. */ forEachInRange(e, t) {\n const n = this.data.getIteratorFrom(e[0]);\n for (;n.hasNext(); ) {\n const r = n.getNext();\n if (this.comparator(r.key, e[1]) >= 0) return;\n t(r.key);\n }\n }\n /**\n * Iterates over `elem`s such that: start <= elem until false is returned.\n */ forEachWhile(e, t) {\n let n;\n for (n = void 0 !== t ? this.data.getIteratorFrom(t) : this.data.getIterator(); n.hasNext(); ) {\n if (!e(n.getNext().key)) return;\n }\n }\n /** Finds the least element greater than or equal to `elem`. */ firstAfterOrEqual(e) {\n const t = this.data.getIteratorFrom(e);\n return t.hasNext() ? t.getNext().key : null;\n }\n getIterator() {\n return new SortedSetIterator(this.data.getIterator());\n }\n getIteratorFrom(e) {\n return new SortedSetIterator(this.data.getIteratorFrom(e));\n }\n /** Inserts or updates an element */ add(e) {\n return this.copy(this.data.remove(e).insert(e, !0));\n }\n /** Deletes an element */ delete(e) {\n return this.has(e) ? this.copy(this.data.remove(e)) : this;\n }\n isEmpty() {\n return this.data.isEmpty();\n }\n unionWith(e) {\n let t = this;\n // Make sure `result` always refers to the larger one of the two sets.\n return t.size < e.size && (t = e, e = this), e.forEach((e => {\n t = t.add(e);\n })), t;\n }\n isEqual(e) {\n if (!(e instanceof SortedSet)) return !1;\n if (this.size !== e.size) return !1;\n const t = this.data.getIterator(), n = e.data.getIterator();\n for (;t.hasNext(); ) {\n const e = t.getNext().key, r = n.getNext().key;\n if (0 !== this.comparator(e, r)) return !1;\n }\n return !0;\n }\n toArray() {\n const e = [];\n return this.forEach((t => {\n e.push(t);\n })), e;\n }\n toString() {\n const e = [];\n return this.forEach((t => e.push(t))), \"SortedSet(\" + e.toString() + \")\";\n }\n copy(e) {\n const t = new SortedSet(this.comparator);\n return t.data = e, t;\n }\n}\n\nclass SortedSetIterator {\n constructor(e) {\n this.iter = e;\n }\n getNext() {\n return this.iter.getNext().key;\n }\n hasNext() {\n return this.iter.hasNext();\n }\n}\n\n/**\n * Compares two sorted sets for equality using their natural ordering. The\n * method computes the intersection and invokes `onAdd` for every element that\n * is in `after` but not `before`. `onRemove` is invoked for every element in\n * `before` but missing from `after`.\n *\n * The method creates a copy of both `before` and `after` and runs in O(n log\n * n), where n is the size of the two lists.\n *\n * @param before - The elements that exist in the original set.\n * @param after - The elements to diff against the original set.\n * @param comparator - The comparator for the elements in before and after.\n * @param onAdd - A function to invoke for every element that is part of `\n * after` but not `before`.\n * @param onRemove - A function to invoke for every element that is part of\n * `before` but not `after`.\n */\n/**\n * Returns the next element from the iterator or `undefined` if none available.\n */\nfunction __PRIVATE_advanceIterator(e) {\n return e.hasNext() ? e.getNext() : void 0;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Provides a set of fields that can be used to partially patch a document.\n * FieldMask is used in conjunction with ObjectValue.\n * Examples:\n * foo - Overwrites foo entirely with the provided value. If foo is not\n * present in the companion ObjectValue, the field is deleted.\n * foo.bar - Overwrites only the field bar of the object foo.\n * If foo is not an object, foo is replaced with an object\n * containing foo\n */ class FieldMask {\n constructor(e) {\n this.fields = e, \n // TODO(dimond): validation of FieldMask\n // Sort the field mask to support `FieldMask.isEqual()` and assert below.\n e.sort(FieldPath$1.comparator);\n }\n static empty() {\n return new FieldMask([]);\n }\n /**\n * Returns a new FieldMask object that is the result of adding all the given\n * fields paths to this field mask.\n */ unionWith(e) {\n let t = new SortedSet(FieldPath$1.comparator);\n for (const e of this.fields) t = t.add(e);\n for (const n of e) t = t.add(n);\n return new FieldMask(t.toArray());\n }\n /**\n * Verifies that `fieldPath` is included by at least one field in this field\n * mask.\n *\n * This is an O(n) operation, where `n` is the size of the field mask.\n */ covers(e) {\n for (const t of this.fields) if (t.isPrefixOf(e)) return !0;\n return !1;\n }\n isEqual(e) {\n return __PRIVATE_arrayEquals(this.fields, e.fields, ((e, t) => e.isEqual(t)));\n }\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An error encountered while decoding base64 string.\n */ class __PRIVATE_Base64DecodeError extends Error {\n constructor() {\n super(...arguments), this.name = \"Base64DecodeError\";\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Converts a Base64 encoded string to a binary string. */\n/** True if and only if the Base64 conversion functions are available. */\nfunction __PRIVATE_isBase64Available() {\n return \"undefined\" != typeof atob;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Immutable class that represents a \"proto\" byte string.\n *\n * Proto byte strings can either be Base64-encoded strings or Uint8Arrays when\n * sent on the wire. This class abstracts away this differentiation by holding\n * the proto byte string in a common class that must be converted into a string\n * before being sent as a proto.\n * @internal\n */ class ByteString {\n constructor(e) {\n this.binaryString = e;\n }\n static fromBase64String(e) {\n const t = function __PRIVATE_decodeBase64(e) {\n try {\n return atob(e);\n } catch (e) {\n // Check that `DOMException` is defined before using it to avoid\n // \"ReferenceError: Property 'DOMException' doesn't exist\" in react-native.\n // (https://github.com/firebase/firebase-js-sdk/issues/7115)\n throw \"undefined\" != typeof DOMException && e instanceof DOMException ? new __PRIVATE_Base64DecodeError(\"Invalid base64 string: \" + e) : e;\n }\n }\n /** Converts a binary string to a Base64 encoded string. */ (e);\n return new ByteString(t);\n }\n static fromUint8Array(e) {\n // TODO(indexing); Remove the copy of the byte string here as this method\n // is frequently called during indexing.\n const t = \n /**\n * Helper function to convert an Uint8array to a binary string.\n */\n function __PRIVATE_binaryStringFromUint8Array(e) {\n let t = \"\";\n for (let n = 0; n < e.length; ++n) t += String.fromCharCode(e[n]);\n return t;\n }\n /**\n * Helper function to convert a binary string to an Uint8Array.\n */ (e);\n return new ByteString(t);\n }\n [Symbol.iterator]() {\n let e = 0;\n return {\n next: () => e < this.binaryString.length ? {\n value: this.binaryString.charCodeAt(e++),\n done: !1\n } : {\n value: void 0,\n done: !0\n }\n };\n }\n toBase64() {\n return function __PRIVATE_encodeBase64(e) {\n return btoa(e);\n }(this.binaryString);\n }\n toUint8Array() {\n return function __PRIVATE_uint8ArrayFromBinaryString(e) {\n const t = new Uint8Array(e.length);\n for (let n = 0; n < e.length; n++) t[n] = e.charCodeAt(n);\n return t;\n }\n /**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n // A RegExp matching ISO 8601 UTC timestamps with optional fraction.\n (this.binaryString);\n }\n approximateByteSize() {\n return 2 * this.binaryString.length;\n }\n compareTo(e) {\n return __PRIVATE_primitiveComparator(this.binaryString, e.binaryString);\n }\n isEqual(e) {\n return this.binaryString === e.binaryString;\n }\n}\n\nByteString.EMPTY_BYTE_STRING = new ByteString(\"\");\n\nconst ne = new RegExp(/^\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(?:\\.(\\d+))?Z$/);\n\n/**\n * Converts the possible Proto values for a timestamp value into a \"seconds and\n * nanos\" representation.\n */ function __PRIVATE_normalizeTimestamp(e) {\n // The json interface (for the browser) will return an iso timestamp string,\n // while the proto js library (for node) will return a\n // google.protobuf.Timestamp instance.\n if (__PRIVATE_hardAssert(!!e), \"string\" == typeof e) {\n // The date string can have higher precision (nanos) than the Date class\n // (millis), so we do some custom parsing here.\n // Parse the nanos right out of the string.\n let t = 0;\n const n = ne.exec(e);\n if (__PRIVATE_hardAssert(!!n), n[1]) {\n // Pad the fraction out to 9 digits (nanos).\n let e = n[1];\n e = (e + \"000000000\").substr(0, 9), t = Number(e);\n }\n // Parse the date to get the seconds.\n const r = new Date(e);\n return {\n seconds: Math.floor(r.getTime() / 1e3),\n nanos: t\n };\n }\n return {\n seconds: __PRIVATE_normalizeNumber(e.seconds),\n nanos: __PRIVATE_normalizeNumber(e.nanos)\n };\n}\n\n/**\n * Converts the possible Proto types for numbers into a JavaScript number.\n * Returns 0 if the value is not numeric.\n */ function __PRIVATE_normalizeNumber(e) {\n // TODO(bjornick): Handle int64 greater than 53 bits.\n return \"number\" == typeof e ? e : \"string\" == typeof e ? Number(e) : 0;\n}\n\n/** Converts the possible Proto types for Blobs into a ByteString. */ function __PRIVATE_normalizeByteString(e) {\n return \"string\" == typeof e ? ByteString.fromBase64String(e) : ByteString.fromUint8Array(e);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents a locally-applied ServerTimestamp.\n *\n * Server Timestamps are backed by MapValues that contain an internal field\n * `__type__` with a value of `server_timestamp`. The previous value and local\n * write time are stored in its `__previous_value__` and `__local_write_time__`\n * fields respectively.\n *\n * Notes:\n * - ServerTimestampValue instances are created as the result of applying a\n * transform. They can only exist in the local view of a document. Therefore\n * they do not need to be parsed or serialized.\n * - When evaluated locally (e.g. for snapshot.data()), they by default\n * evaluate to `null`. This behavior can be configured by passing custom\n * FieldValueOptions to value().\n * - With respect to other ServerTimestampValues, they sort by their\n * localWriteTime.\n */ function __PRIVATE_isServerTimestamp(e) {\n var t, n;\n return \"server_timestamp\" === (null === (n = ((null === (t = null == e ? void 0 : e.mapValue) || void 0 === t ? void 0 : t.fields) || {}).__type__) || void 0 === n ? void 0 : n.stringValue);\n}\n\n/**\n * Creates a new ServerTimestamp proto value (using the internal format).\n */\n/**\n * Returns the value of the field before this ServerTimestamp was set.\n *\n * Preserving the previous values allows the user to display the last resoled\n * value until the backend responds with the timestamp.\n */\nfunction __PRIVATE_getPreviousValue(e) {\n const t = e.mapValue.fields.__previous_value__;\n return __PRIVATE_isServerTimestamp(t) ? __PRIVATE_getPreviousValue(t) : t;\n}\n\n/**\n * Returns the local time at which this timestamp was first set.\n */ function __PRIVATE_getLocalWriteTime(e) {\n const t = __PRIVATE_normalizeTimestamp(e.mapValue.fields.__local_write_time__.timestampValue);\n return new Timestamp(t.seconds, t.nanos);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class DatabaseInfo {\n /**\n * Constructs a DatabaseInfo using the provided host, databaseId and\n * persistenceKey.\n *\n * @param databaseId - The database to use.\n * @param appId - The Firebase App Id.\n * @param persistenceKey - A unique identifier for this Firestore's local\n * storage (used in conjunction with the databaseId).\n * @param host - The Firestore backend host to connect to.\n * @param ssl - Whether to use SSL when connecting.\n * @param forceLongPolling - Whether to use the forceLongPolling option\n * when using WebChannel as the network transport.\n * @param autoDetectLongPolling - Whether to use the detectBufferingProxy\n * option when using WebChannel as the network transport.\n * @param longPollingOptions Options that configure long-polling.\n * @param useFetchStreams Whether to use the Fetch API instead of\n * XMLHTTPRequest\n */\n constructor(e, t, n, r, i, s, o, _, a) {\n this.databaseId = e, this.appId = t, this.persistenceKey = n, this.host = r, this.ssl = i, \n this.forceLongPolling = s, this.autoDetectLongPolling = o, this.longPollingOptions = _, \n this.useFetchStreams = a;\n }\n}\n\n/** The default database name for a project. */\n/**\n * Represents the database ID a Firestore client is associated with.\n * @internal\n */\nclass DatabaseId {\n constructor(e, t) {\n this.projectId = e, this.database = t || \"(default)\";\n }\n static empty() {\n return new DatabaseId(\"\", \"\");\n }\n get isDefaultDatabase() {\n return \"(default)\" === this.database;\n }\n isEqual(e) {\n return e instanceof DatabaseId && e.projectId === this.projectId && e.database === this.database;\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst re = {\n mapValue: {\n fields: {\n __type__: {\n stringValue: \"__max__\"\n }\n }\n }\n}, ie = {\n nullValue: \"NULL_VALUE\"\n};\n\n/** Extracts the backend's type order for the provided value. */\nfunction __PRIVATE_typeOrder(e) {\n return \"nullValue\" in e ? 0 /* TypeOrder.NullValue */ : \"booleanValue\" in e ? 1 /* TypeOrder.BooleanValue */ : \"integerValue\" in e || \"doubleValue\" in e ? 2 /* TypeOrder.NumberValue */ : \"timestampValue\" in e ? 3 /* TypeOrder.TimestampValue */ : \"stringValue\" in e ? 5 /* TypeOrder.StringValue */ : \"bytesValue\" in e ? 6 /* TypeOrder.BlobValue */ : \"referenceValue\" in e ? 7 /* TypeOrder.RefValue */ : \"geoPointValue\" in e ? 8 /* TypeOrder.GeoPointValue */ : \"arrayValue\" in e ? 9 /* TypeOrder.ArrayValue */ : \"mapValue\" in e ? __PRIVATE_isServerTimestamp(e) ? 4 /* TypeOrder.ServerTimestampValue */ : __PRIVATE_isMaxValue(e) ? 9007199254740991 /* TypeOrder.MaxValue */ : __PRIVATE_isVectorValue(e) ? 10 /* TypeOrder.VectorValue */ : 11 /* TypeOrder.ObjectValue */ : fail();\n}\n\n/** Tests `left` and `right` for equality based on the backend semantics. */ function __PRIVATE_valueEquals(e, t) {\n if (e === t) return !0;\n const n = __PRIVATE_typeOrder(e);\n if (n !== __PRIVATE_typeOrder(t)) return !1;\n switch (n) {\n case 0 /* TypeOrder.NullValue */ :\n case 9007199254740991 /* TypeOrder.MaxValue */ :\n return !0;\n\n case 1 /* TypeOrder.BooleanValue */ :\n return e.booleanValue === t.booleanValue;\n\n case 4 /* TypeOrder.ServerTimestampValue */ :\n return __PRIVATE_getLocalWriteTime(e).isEqual(__PRIVATE_getLocalWriteTime(t));\n\n case 3 /* TypeOrder.TimestampValue */ :\n return function __PRIVATE_timestampEquals(e, t) {\n if (\"string\" == typeof e.timestampValue && \"string\" == typeof t.timestampValue && e.timestampValue.length === t.timestampValue.length) \n // Use string equality for ISO 8601 timestamps\n return e.timestampValue === t.timestampValue;\n const n = __PRIVATE_normalizeTimestamp(e.timestampValue), r = __PRIVATE_normalizeTimestamp(t.timestampValue);\n return n.seconds === r.seconds && n.nanos === r.nanos;\n }(e, t);\n\n case 5 /* TypeOrder.StringValue */ :\n return e.stringValue === t.stringValue;\n\n case 6 /* TypeOrder.BlobValue */ :\n return function __PRIVATE_blobEquals(e, t) {\n return __PRIVATE_normalizeByteString(e.bytesValue).isEqual(__PRIVATE_normalizeByteString(t.bytesValue));\n }(e, t);\n\n case 7 /* TypeOrder.RefValue */ :\n return e.referenceValue === t.referenceValue;\n\n case 8 /* TypeOrder.GeoPointValue */ :\n return function __PRIVATE_geoPointEquals(e, t) {\n return __PRIVATE_normalizeNumber(e.geoPointValue.latitude) === __PRIVATE_normalizeNumber(t.geoPointValue.latitude) && __PRIVATE_normalizeNumber(e.geoPointValue.longitude) === __PRIVATE_normalizeNumber(t.geoPointValue.longitude);\n }(e, t);\n\n case 2 /* TypeOrder.NumberValue */ :\n return function __PRIVATE_numberEquals(e, t) {\n if (\"integerValue\" in e && \"integerValue\" in t) return __PRIVATE_normalizeNumber(e.integerValue) === __PRIVATE_normalizeNumber(t.integerValue);\n if (\"doubleValue\" in e && \"doubleValue\" in t) {\n const n = __PRIVATE_normalizeNumber(e.doubleValue), r = __PRIVATE_normalizeNumber(t.doubleValue);\n return n === r ? __PRIVATE_isNegativeZero(n) === __PRIVATE_isNegativeZero(r) : isNaN(n) && isNaN(r);\n }\n return !1;\n }(e, t);\n\n case 9 /* TypeOrder.ArrayValue */ :\n return __PRIVATE_arrayEquals(e.arrayValue.values || [], t.arrayValue.values || [], __PRIVATE_valueEquals);\n\n case 10 /* TypeOrder.VectorValue */ :\n case 11 /* TypeOrder.ObjectValue */ :\n return function __PRIVATE_objectEquals(e, t) {\n const n = e.mapValue.fields || {}, r = t.mapValue.fields || {};\n if (__PRIVATE_objectSize(n) !== __PRIVATE_objectSize(r)) return !1;\n for (const e in n) if (n.hasOwnProperty(e) && (void 0 === r[e] || !__PRIVATE_valueEquals(n[e], r[e]))) return !1;\n return !0;\n }\n /** Returns true if the ArrayValue contains the specified element. */ (e, t);\n\n default:\n return fail();\n }\n}\n\nfunction __PRIVATE_arrayValueContains(e, t) {\n return void 0 !== (e.values || []).find((e => __PRIVATE_valueEquals(e, t)));\n}\n\nfunction __PRIVATE_valueCompare(e, t) {\n if (e === t) return 0;\n const n = __PRIVATE_typeOrder(e), r = __PRIVATE_typeOrder(t);\n if (n !== r) return __PRIVATE_primitiveComparator(n, r);\n switch (n) {\n case 0 /* TypeOrder.NullValue */ :\n case 9007199254740991 /* TypeOrder.MaxValue */ :\n return 0;\n\n case 1 /* TypeOrder.BooleanValue */ :\n return __PRIVATE_primitiveComparator(e.booleanValue, t.booleanValue);\n\n case 2 /* TypeOrder.NumberValue */ :\n return function __PRIVATE_compareNumbers(e, t) {\n const n = __PRIVATE_normalizeNumber(e.integerValue || e.doubleValue), r = __PRIVATE_normalizeNumber(t.integerValue || t.doubleValue);\n return n < r ? -1 : n > r ? 1 : n === r ? 0 : \n // one or both are NaN.\n isNaN(n) ? isNaN(r) ? 0 : -1 : 1;\n }(e, t);\n\n case 3 /* TypeOrder.TimestampValue */ :\n return __PRIVATE_compareTimestamps(e.timestampValue, t.timestampValue);\n\n case 4 /* TypeOrder.ServerTimestampValue */ :\n return __PRIVATE_compareTimestamps(__PRIVATE_getLocalWriteTime(e), __PRIVATE_getLocalWriteTime(t));\n\n case 5 /* TypeOrder.StringValue */ :\n return __PRIVATE_primitiveComparator(e.stringValue, t.stringValue);\n\n case 6 /* TypeOrder.BlobValue */ :\n return function __PRIVATE_compareBlobs(e, t) {\n const n = __PRIVATE_normalizeByteString(e), r = __PRIVATE_normalizeByteString(t);\n return n.compareTo(r);\n }(e.bytesValue, t.bytesValue);\n\n case 7 /* TypeOrder.RefValue */ :\n return function __PRIVATE_compareReferences(e, t) {\n const n = e.split(\"/\"), r = t.split(\"/\");\n for (let e = 0; e < n.length && e < r.length; e++) {\n const t = __PRIVATE_primitiveComparator(n[e], r[e]);\n if (0 !== t) return t;\n }\n return __PRIVATE_primitiveComparator(n.length, r.length);\n }(e.referenceValue, t.referenceValue);\n\n case 8 /* TypeOrder.GeoPointValue */ :\n return function __PRIVATE_compareGeoPoints(e, t) {\n const n = __PRIVATE_primitiveComparator(__PRIVATE_normalizeNumber(e.latitude), __PRIVATE_normalizeNumber(t.latitude));\n if (0 !== n) return n;\n return __PRIVATE_primitiveComparator(__PRIVATE_normalizeNumber(e.longitude), __PRIVATE_normalizeNumber(t.longitude));\n }(e.geoPointValue, t.geoPointValue);\n\n case 9 /* TypeOrder.ArrayValue */ :\n return __PRIVATE_compareArrays(e.arrayValue, t.arrayValue);\n\n case 10 /* TypeOrder.VectorValue */ :\n return function __PRIVATE_compareVectors(e, t) {\n var n, r, i, s;\n const o = e.fields || {}, _ = t.fields || {}, a = null === (n = o.value) || void 0 === n ? void 0 : n.arrayValue, u = null === (r = _.value) || void 0 === r ? void 0 : r.arrayValue, c = __PRIVATE_primitiveComparator((null === (i = null == a ? void 0 : a.values) || void 0 === i ? void 0 : i.length) || 0, (null === (s = null == u ? void 0 : u.values) || void 0 === s ? void 0 : s.length) || 0);\n if (0 !== c) return c;\n return __PRIVATE_compareArrays(a, u);\n }(e.mapValue, t.mapValue);\n\n case 11 /* TypeOrder.ObjectValue */ :\n return function __PRIVATE_compareMaps(e, t) {\n if (e === re.mapValue && t === re.mapValue) return 0;\n if (e === re.mapValue) return 1;\n if (t === re.mapValue) return -1;\n const n = e.fields || {}, r = Object.keys(n), i = t.fields || {}, s = Object.keys(i);\n // Even though MapValues are likely sorted correctly based on their insertion\n // order (e.g. when received from the backend), local modifications can bring\n // elements out of order. We need to re-sort the elements to ensure that\n // canonical IDs are independent of insertion order.\n r.sort(), s.sort();\n for (let e = 0; e < r.length && e < s.length; ++e) {\n const t = __PRIVATE_primitiveComparator(r[e], s[e]);\n if (0 !== t) return t;\n const o = __PRIVATE_valueCompare(n[r[e]], i[s[e]]);\n if (0 !== o) return o;\n }\n return __PRIVATE_primitiveComparator(r.length, s.length);\n }\n /**\n * Generates the canonical ID for the provided field value (as used in Target\n * serialization).\n */ (e.mapValue, t.mapValue);\n\n default:\n throw fail();\n }\n}\n\nfunction __PRIVATE_compareTimestamps(e, t) {\n if (\"string\" == typeof e && \"string\" == typeof t && e.length === t.length) return __PRIVATE_primitiveComparator(e, t);\n const n = __PRIVATE_normalizeTimestamp(e), r = __PRIVATE_normalizeTimestamp(t), i = __PRIVATE_primitiveComparator(n.seconds, r.seconds);\n return 0 !== i ? i : __PRIVATE_primitiveComparator(n.nanos, r.nanos);\n}\n\nfunction __PRIVATE_compareArrays(e, t) {\n const n = e.values || [], r = t.values || [];\n for (let e = 0; e < n.length && e < r.length; ++e) {\n const t = __PRIVATE_valueCompare(n[e], r[e]);\n if (t) return t;\n }\n return __PRIVATE_primitiveComparator(n.length, r.length);\n}\n\nfunction canonicalId(e) {\n return __PRIVATE_canonifyValue(e);\n}\n\nfunction __PRIVATE_canonifyValue(e) {\n return \"nullValue\" in e ? \"null\" : \"booleanValue\" in e ? \"\" + e.booleanValue : \"integerValue\" in e ? \"\" + e.integerValue : \"doubleValue\" in e ? \"\" + e.doubleValue : \"timestampValue\" in e ? function __PRIVATE_canonifyTimestamp(e) {\n const t = __PRIVATE_normalizeTimestamp(e);\n return `time(${t.seconds},${t.nanos})`;\n }(e.timestampValue) : \"stringValue\" in e ? e.stringValue : \"bytesValue\" in e ? function __PRIVATE_canonifyByteString(e) {\n return __PRIVATE_normalizeByteString(e).toBase64();\n }(e.bytesValue) : \"referenceValue\" in e ? function __PRIVATE_canonifyReference(e) {\n return DocumentKey.fromName(e).toString();\n }(e.referenceValue) : \"geoPointValue\" in e ? function __PRIVATE_canonifyGeoPoint(e) {\n return `geo(${e.latitude},${e.longitude})`;\n }(e.geoPointValue) : \"arrayValue\" in e ? function __PRIVATE_canonifyArray(e) {\n let t = \"[\", n = !0;\n for (const r of e.values || []) n ? n = !1 : t += \",\", t += __PRIVATE_canonifyValue(r);\n return t + \"]\";\n }\n /**\n * Returns an approximate (and wildly inaccurate) in-memory size for the field\n * value.\n *\n * The memory size takes into account only the actual user data as it resides\n * in memory and ignores object overhead.\n */ (e.arrayValue) : \"mapValue\" in e ? function __PRIVATE_canonifyMap(e) {\n // Iteration order in JavaScript is not guaranteed. To ensure that we generate\n // matching canonical IDs for identical maps, we need to sort the keys.\n const t = Object.keys(e.fields || {}).sort();\n let n = \"{\", r = !0;\n for (const i of t) r ? r = !1 : n += \",\", n += `${i}:${__PRIVATE_canonifyValue(e.fields[i])}`;\n return n + \"}\";\n }(e.mapValue) : fail();\n}\n\nfunction __PRIVATE_estimateByteSize(e) {\n switch (__PRIVATE_typeOrder(e)) {\n case 0 /* TypeOrder.NullValue */ :\n case 1 /* TypeOrder.BooleanValue */ :\n return 4;\n\n case 2 /* TypeOrder.NumberValue */ :\n return 8;\n\n case 3 /* TypeOrder.TimestampValue */ :\n case 8 /* TypeOrder.GeoPointValue */ :\n // GeoPoints are made up of two distinct numbers (latitude + longitude)\n return 16;\n\n case 4 /* TypeOrder.ServerTimestampValue */ :\n const t = __PRIVATE_getPreviousValue(e);\n return t ? 16 + __PRIVATE_estimateByteSize(t) : 16;\n\n case 5 /* TypeOrder.StringValue */ :\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures:\n // \"JavaScript's String type is [...] a set of elements of 16-bit unsigned\n // integer values\"\n return 2 * e.stringValue.length;\n\n case 6 /* TypeOrder.BlobValue */ :\n return __PRIVATE_normalizeByteString(e.bytesValue).approximateByteSize();\n\n case 7 /* TypeOrder.RefValue */ :\n return e.referenceValue.length;\n\n case 9 /* TypeOrder.ArrayValue */ :\n return function __PRIVATE_estimateArrayByteSize(e) {\n return (e.values || []).reduce(((e, t) => e + __PRIVATE_estimateByteSize(t)), 0);\n }\n /** Returns a reference value for the provided database and key. */ (e.arrayValue);\n\n case 10 /* TypeOrder.VectorValue */ :\n case 11 /* TypeOrder.ObjectValue */ :\n return function __PRIVATE_estimateMapByteSize(e) {\n let t = 0;\n return forEach(e.fields, ((e, n) => {\n t += e.length + __PRIVATE_estimateByteSize(n);\n })), t;\n }(e.mapValue);\n\n default:\n throw fail();\n }\n}\n\nfunction __PRIVATE_refValue(e, t) {\n return {\n referenceValue: `projects/${e.projectId}/databases/${e.database}/documents/${t.path.canonicalString()}`\n };\n}\n\n/** Returns true if `value` is an IntegerValue . */ function isInteger(e) {\n return !!e && \"integerValue\" in e;\n}\n\n/** Returns true if `value` is a DoubleValue. */\n/** Returns true if `value` is an ArrayValue. */\nfunction isArray(e) {\n return !!e && \"arrayValue\" in e;\n}\n\n/** Returns true if `value` is a NullValue. */ function __PRIVATE_isNullValue(e) {\n return !!e && \"nullValue\" in e;\n}\n\n/** Returns true if `value` is NaN. */ function __PRIVATE_isNanValue(e) {\n return !!e && \"doubleValue\" in e && isNaN(Number(e.doubleValue));\n}\n\n/** Returns true if `value` is a MapValue. */ function __PRIVATE_isMapValue(e) {\n return !!e && \"mapValue\" in e;\n}\n\n/** Returns true if `value` is a VetorValue. */ function __PRIVATE_isVectorValue(e) {\n var t, n;\n return \"__vector__\" === (null === (n = ((null === (t = null == e ? void 0 : e.mapValue) || void 0 === t ? void 0 : t.fields) || {}).__type__) || void 0 === n ? void 0 : n.stringValue);\n}\n\n/** Creates a deep copy of `source`. */ function __PRIVATE_deepClone(e) {\n if (e.geoPointValue) return {\n geoPointValue: Object.assign({}, e.geoPointValue)\n };\n if (e.timestampValue && \"object\" == typeof e.timestampValue) return {\n timestampValue: Object.assign({}, e.timestampValue)\n };\n if (e.mapValue) {\n const t = {\n mapValue: {\n fields: {}\n }\n };\n return forEach(e.mapValue.fields, ((e, n) => t.mapValue.fields[e] = __PRIVATE_deepClone(n))), \n t;\n }\n if (e.arrayValue) {\n const t = {\n arrayValue: {\n values: []\n }\n };\n for (let n = 0; n < (e.arrayValue.values || []).length; ++n) t.arrayValue.values[n] = __PRIVATE_deepClone(e.arrayValue.values[n]);\n return t;\n }\n return Object.assign({}, e);\n}\n\n/** Returns true if the Value represents the canonical {@link #MAX_VALUE} . */ function __PRIVATE_isMaxValue(e) {\n return \"__max__\" === (((e.mapValue || {}).fields || {}).__type__ || {}).stringValue;\n}\n\nconst se = {\n mapValue: {\n fields: {\n __type__: {\n stringValue: \"__vector__\"\n },\n value: {\n arrayValue: {}\n }\n }\n }\n};\n\n/** Returns the lowest value for the given value type (inclusive). */ function __PRIVATE_valuesGetLowerBound(e) {\n return \"nullValue\" in e ? ie : \"booleanValue\" in e ? {\n booleanValue: !1\n } : \"integerValue\" in e || \"doubleValue\" in e ? {\n doubleValue: NaN\n } : \"timestampValue\" in e ? {\n timestampValue: {\n seconds: Number.MIN_SAFE_INTEGER\n }\n } : \"stringValue\" in e ? {\n stringValue: \"\"\n } : \"bytesValue\" in e ? {\n bytesValue: \"\"\n } : \"referenceValue\" in e ? __PRIVATE_refValue(DatabaseId.empty(), DocumentKey.empty()) : \"geoPointValue\" in e ? {\n geoPointValue: {\n latitude: -90,\n longitude: -180\n }\n } : \"arrayValue\" in e ? {\n arrayValue: {}\n } : \"mapValue\" in e ? __PRIVATE_isVectorValue(e) ? se : {\n mapValue: {}\n } : fail();\n}\n\n/** Returns the largest value for the given value type (exclusive). */ function __PRIVATE_valuesGetUpperBound(e) {\n return \"nullValue\" in e ? {\n booleanValue: !1\n } : \"booleanValue\" in e ? {\n doubleValue: NaN\n } : \"integerValue\" in e || \"doubleValue\" in e ? {\n timestampValue: {\n seconds: Number.MIN_SAFE_INTEGER\n }\n } : \"timestampValue\" in e ? {\n stringValue: \"\"\n } : \"stringValue\" in e ? {\n bytesValue: \"\"\n } : \"bytesValue\" in e ? __PRIVATE_refValue(DatabaseId.empty(), DocumentKey.empty()) : \"referenceValue\" in e ? {\n geoPointValue: {\n latitude: -90,\n longitude: -180\n }\n } : \"geoPointValue\" in e ? {\n arrayValue: {}\n } : \"arrayValue\" in e ? se : \"mapValue\" in e ? __PRIVATE_isVectorValue(e) ? {\n mapValue: {}\n } : re : fail();\n}\n\nfunction __PRIVATE_lowerBoundCompare(e, t) {\n const n = __PRIVATE_valueCompare(e.value, t.value);\n return 0 !== n ? n : e.inclusive && !t.inclusive ? -1 : !e.inclusive && t.inclusive ? 1 : 0;\n}\n\nfunction __PRIVATE_upperBoundCompare(e, t) {\n const n = __PRIVATE_valueCompare(e.value, t.value);\n return 0 !== n ? n : e.inclusive && !t.inclusive ? 1 : !e.inclusive && t.inclusive ? -1 : 0;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An ObjectValue represents a MapValue in the Firestore Proto and offers the\n * ability to add and remove fields (via the ObjectValueBuilder).\n */ class ObjectValue {\n constructor(e) {\n this.value = e;\n }\n static empty() {\n return new ObjectValue({\n mapValue: {}\n });\n }\n /**\n * Returns the value at the given path or null.\n *\n * @param path - the path to search\n * @returns The value at the path or null if the path is not set.\n */ field(e) {\n if (e.isEmpty()) return this.value;\n {\n let t = this.value;\n for (let n = 0; n < e.length - 1; ++n) if (t = (t.mapValue.fields || {})[e.get(n)], \n !__PRIVATE_isMapValue(t)) return null;\n return t = (t.mapValue.fields || {})[e.lastSegment()], t || null;\n }\n }\n /**\n * Sets the field to the provided value.\n *\n * @param path - The field path to set.\n * @param value - The value to set.\n */ set(e, t) {\n this.getFieldsMap(e.popLast())[e.lastSegment()] = __PRIVATE_deepClone(t);\n }\n /**\n * Sets the provided fields to the provided values.\n *\n * @param data - A map of fields to values (or null for deletes).\n */ setAll(e) {\n let t = FieldPath$1.emptyPath(), n = {}, r = [];\n e.forEach(((e, i) => {\n if (!t.isImmediateParentOf(i)) {\n // Insert the accumulated changes at this parent location\n const e = this.getFieldsMap(t);\n this.applyChanges(e, n, r), n = {}, r = [], t = i.popLast();\n }\n e ? n[i.lastSegment()] = __PRIVATE_deepClone(e) : r.push(i.lastSegment());\n }));\n const i = this.getFieldsMap(t);\n this.applyChanges(i, n, r);\n }\n /**\n * Removes the field at the specified path. If there is no field at the\n * specified path, nothing is changed.\n *\n * @param path - The field path to remove.\n */ delete(e) {\n const t = this.field(e.popLast());\n __PRIVATE_isMapValue(t) && t.mapValue.fields && delete t.mapValue.fields[e.lastSegment()];\n }\n isEqual(e) {\n return __PRIVATE_valueEquals(this.value, e.value);\n }\n /**\n * Returns the map that contains the leaf element of `path`. If the parent\n * entry does not yet exist, or if it is not a map, a new map will be created.\n */ getFieldsMap(e) {\n let t = this.value;\n t.mapValue.fields || (t.mapValue = {\n fields: {}\n });\n for (let n = 0; n < e.length; ++n) {\n let r = t.mapValue.fields[e.get(n)];\n __PRIVATE_isMapValue(r) && r.mapValue.fields || (r = {\n mapValue: {\n fields: {}\n }\n }, t.mapValue.fields[e.get(n)] = r), t = r;\n }\n return t.mapValue.fields;\n }\n /**\n * Modifies `fieldsMap` by adding, replacing or deleting the specified\n * entries.\n */ applyChanges(e, t, n) {\n forEach(t, ((t, n) => e[t] = n));\n for (const t of n) delete e[t];\n }\n clone() {\n return new ObjectValue(__PRIVATE_deepClone(this.value));\n }\n}\n\n/**\n * Returns a FieldMask built from all fields in a MapValue.\n */ function __PRIVATE_extractFieldMask(e) {\n const t = [];\n return forEach(e.fields, ((e, n) => {\n const r = new FieldPath$1([ e ]);\n if (__PRIVATE_isMapValue(n)) {\n const e = __PRIVATE_extractFieldMask(n.mapValue).fields;\n if (0 === e.length) \n // Preserve the empty map by adding it to the FieldMask.\n t.push(r); else \n // For nested and non-empty ObjectValues, add the FieldPath of the\n // leaf nodes.\n for (const n of e) t.push(r.child(n));\n } else \n // For nested and non-empty ObjectValues, add the FieldPath of the leaf\n // nodes.\n t.push(r);\n })), new FieldMask(t);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents a document in Firestore with a key, version, data and whether it\n * has local mutations applied to it.\n *\n * Documents can transition between states via `convertToFoundDocument()`,\n * `convertToNoDocument()` and `convertToUnknownDocument()`. If a document does\n * not transition to one of these states even after all mutations have been\n * applied, `isValidDocument()` returns false and the document should be removed\n * from all views.\n */ class MutableDocument {\n constructor(e, t, n, r, i, s, o) {\n this.key = e, this.documentType = t, this.version = n, this.readTime = r, this.createTime = i, \n this.data = s, this.documentState = o;\n }\n /**\n * Creates a document with no known version or data, but which can serve as\n * base document for mutations.\n */ static newInvalidDocument(e) {\n return new MutableDocument(e, 0 /* DocumentType.INVALID */ , \n /* version */ SnapshotVersion.min(), \n /* readTime */ SnapshotVersion.min(), \n /* createTime */ SnapshotVersion.min(), ObjectValue.empty(), 0 /* DocumentState.SYNCED */);\n }\n /**\n * Creates a new document that is known to exist with the given data at the\n * given version.\n */ static newFoundDocument(e, t, n, r) {\n return new MutableDocument(e, 1 /* DocumentType.FOUND_DOCUMENT */ , \n /* version */ t, \n /* readTime */ SnapshotVersion.min(), \n /* createTime */ n, r, 0 /* DocumentState.SYNCED */);\n }\n /** Creates a new document that is known to not exist at the given version. */ static newNoDocument(e, t) {\n return new MutableDocument(e, 2 /* DocumentType.NO_DOCUMENT */ , \n /* version */ t, \n /* readTime */ SnapshotVersion.min(), \n /* createTime */ SnapshotVersion.min(), ObjectValue.empty(), 0 /* DocumentState.SYNCED */);\n }\n /**\n * Creates a new document that is known to exist at the given version but\n * whose data is not known (e.g. a document that was updated without a known\n * base document).\n */ static newUnknownDocument(e, t) {\n return new MutableDocument(e, 3 /* DocumentType.UNKNOWN_DOCUMENT */ , \n /* version */ t, \n /* readTime */ SnapshotVersion.min(), \n /* createTime */ SnapshotVersion.min(), ObjectValue.empty(), 2 /* DocumentState.HAS_COMMITTED_MUTATIONS */);\n }\n /**\n * Changes the document type to indicate that it exists and that its version\n * and data are known.\n */ convertToFoundDocument(e, t) {\n // If a document is switching state from being an invalid or deleted\n // document to a valid (FOUND_DOCUMENT) document, either due to receiving an\n // update from Watch or due to applying a local set mutation on top\n // of a deleted document, our best guess about its createTime would be the\n // version at which the document transitioned to a FOUND_DOCUMENT.\n return !this.createTime.isEqual(SnapshotVersion.min()) || 2 /* DocumentType.NO_DOCUMENT */ !== this.documentType && 0 /* DocumentType.INVALID */ !== this.documentType || (this.createTime = e), \n this.version = e, this.documentType = 1 /* DocumentType.FOUND_DOCUMENT */ , this.data = t, \n this.documentState = 0 /* DocumentState.SYNCED */ , this;\n }\n /**\n * Changes the document type to indicate that it doesn't exist at the given\n * version.\n */ convertToNoDocument(e) {\n return this.version = e, this.documentType = 2 /* DocumentType.NO_DOCUMENT */ , \n this.data = ObjectValue.empty(), this.documentState = 0 /* DocumentState.SYNCED */ , \n this;\n }\n /**\n * Changes the document type to indicate that it exists at a given version but\n * that its data is not known (e.g. a document that was updated without a known\n * base document).\n */ convertToUnknownDocument(e) {\n return this.version = e, this.documentType = 3 /* DocumentType.UNKNOWN_DOCUMENT */ , \n this.data = ObjectValue.empty(), this.documentState = 2 /* DocumentState.HAS_COMMITTED_MUTATIONS */ , \n this;\n }\n setHasCommittedMutations() {\n return this.documentState = 2 /* DocumentState.HAS_COMMITTED_MUTATIONS */ , this;\n }\n setHasLocalMutations() {\n return this.documentState = 1 /* DocumentState.HAS_LOCAL_MUTATIONS */ , this.version = SnapshotVersion.min(), \n this;\n }\n setReadTime(e) {\n return this.readTime = e, this;\n }\n get hasLocalMutations() {\n return 1 /* DocumentState.HAS_LOCAL_MUTATIONS */ === this.documentState;\n }\n get hasCommittedMutations() {\n return 2 /* DocumentState.HAS_COMMITTED_MUTATIONS */ === this.documentState;\n }\n get hasPendingWrites() {\n return this.hasLocalMutations || this.hasCommittedMutations;\n }\n isValidDocument() {\n return 0 /* DocumentType.INVALID */ !== this.documentType;\n }\n isFoundDocument() {\n return 1 /* DocumentType.FOUND_DOCUMENT */ === this.documentType;\n }\n isNoDocument() {\n return 2 /* DocumentType.NO_DOCUMENT */ === this.documentType;\n }\n isUnknownDocument() {\n return 3 /* DocumentType.UNKNOWN_DOCUMENT */ === this.documentType;\n }\n isEqual(e) {\n return e instanceof MutableDocument && this.key.isEqual(e.key) && this.version.isEqual(e.version) && this.documentType === e.documentType && this.documentState === e.documentState && this.data.isEqual(e.data);\n }\n mutableCopy() {\n return new MutableDocument(this.key, this.documentType, this.version, this.readTime, this.createTime, this.data.clone(), this.documentState);\n }\n toString() {\n return `Document(${this.key}, ${this.version}, ${JSON.stringify(this.data.value)}, {createTime: ${this.createTime}}), {documentType: ${this.documentType}}), {documentState: ${this.documentState}})`;\n }\n}\n\n/**\n * Compares the value for field `field` in the provided documents. Throws if\n * the field does not exist in both documents.\n */\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents a bound of a query.\n *\n * The bound is specified with the given components representing a position and\n * whether it's just before or just after the position (relative to whatever the\n * query order is).\n *\n * The position represents a logical index position for a query. It's a prefix\n * of values for the (potentially implicit) order by clauses of a query.\n *\n * Bound provides a function to determine whether a document comes before or\n * after a bound. This is influenced by whether the position is just before or\n * just after the provided values.\n */\nclass Bound {\n constructor(e, t) {\n this.position = e, this.inclusive = t;\n }\n}\n\nfunction __PRIVATE_boundCompareToDocument(e, t, n) {\n let r = 0;\n for (let i = 0; i < e.position.length; i++) {\n const s = t[i], o = e.position[i];\n if (s.field.isKeyField()) r = DocumentKey.comparator(DocumentKey.fromName(o.referenceValue), n.key); else {\n r = __PRIVATE_valueCompare(o, n.data.field(s.field));\n }\n if (\"desc\" /* Direction.DESCENDING */ === s.dir && (r *= -1), 0 !== r) break;\n }\n return r;\n}\n\n/**\n * Returns true if a document sorts after a bound using the provided sort\n * order.\n */ function __PRIVATE_boundEquals(e, t) {\n if (null === e) return null === t;\n if (null === t) return !1;\n if (e.inclusive !== t.inclusive || e.position.length !== t.position.length) return !1;\n for (let n = 0; n < e.position.length; n++) {\n if (!__PRIVATE_valueEquals(e.position[n], t.position[n])) return !1;\n }\n return !0;\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An ordering on a field, in some Direction. Direction defaults to ASCENDING.\n */ class OrderBy {\n constructor(e, t = \"asc\" /* Direction.ASCENDING */) {\n this.field = e, this.dir = t;\n }\n}\n\nfunction __PRIVATE_orderByEquals(e, t) {\n return e.dir === t.dir && e.field.isEqual(t.field);\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class Filter {}\n\nclass FieldFilter extends Filter {\n constructor(e, t, n) {\n super(), this.field = e, this.op = t, this.value = n;\n }\n /**\n * Creates a filter based on the provided arguments.\n */ static create(e, t, n) {\n return e.isKeyField() ? \"in\" /* Operator.IN */ === t || \"not-in\" /* Operator.NOT_IN */ === t ? this.createKeyFieldInFilter(e, t, n) : new __PRIVATE_KeyFieldFilter(e, t, n) : \"array-contains\" /* Operator.ARRAY_CONTAINS */ === t ? new __PRIVATE_ArrayContainsFilter(e, n) : \"in\" /* Operator.IN */ === t ? new __PRIVATE_InFilter(e, n) : \"not-in\" /* Operator.NOT_IN */ === t ? new __PRIVATE_NotInFilter(e, n) : \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ === t ? new __PRIVATE_ArrayContainsAnyFilter(e, n) : new FieldFilter(e, t, n);\n }\n static createKeyFieldInFilter(e, t, n) {\n return \"in\" /* Operator.IN */ === t ? new __PRIVATE_KeyFieldInFilter(e, n) : new __PRIVATE_KeyFieldNotInFilter(e, n);\n }\n matches(e) {\n const t = e.data.field(this.field);\n // Types do not have to match in NOT_EQUAL filters.\n return \"!=\" /* Operator.NOT_EQUAL */ === this.op ? null !== t && this.matchesComparison(__PRIVATE_valueCompare(t, this.value)) : null !== t && __PRIVATE_typeOrder(this.value) === __PRIVATE_typeOrder(t) && this.matchesComparison(__PRIVATE_valueCompare(t, this.value));\n // Only compare types with matching backend order (such as double and int).\n }\n matchesComparison(e) {\n switch (this.op) {\n case \"<\" /* Operator.LESS_THAN */ :\n return e < 0;\n\n case \"<=\" /* Operator.LESS_THAN_OR_EQUAL */ :\n return e <= 0;\n\n case \"==\" /* Operator.EQUAL */ :\n return 0 === e;\n\n case \"!=\" /* Operator.NOT_EQUAL */ :\n return 0 !== e;\n\n case \">\" /* Operator.GREATER_THAN */ :\n return e > 0;\n\n case \">=\" /* Operator.GREATER_THAN_OR_EQUAL */ :\n return e >= 0;\n\n default:\n return fail();\n }\n }\n isInequality() {\n return [ \"<\" /* Operator.LESS_THAN */ , \"<=\" /* Operator.LESS_THAN_OR_EQUAL */ , \">\" /* Operator.GREATER_THAN */ , \">=\" /* Operator.GREATER_THAN_OR_EQUAL */ , \"!=\" /* Operator.NOT_EQUAL */ , \"not-in\" /* Operator.NOT_IN */ ].indexOf(this.op) >= 0;\n }\n getFlattenedFilters() {\n return [ this ];\n }\n getFilters() {\n return [ this ];\n }\n}\n\nclass CompositeFilter extends Filter {\n constructor(e, t) {\n super(), this.filters = e, this.op = t, this.ae = null;\n }\n /**\n * Creates a filter based on the provided arguments.\n */ static create(e, t) {\n return new CompositeFilter(e, t);\n }\n matches(e) {\n return __PRIVATE_compositeFilterIsConjunction(this) ? void 0 === this.filters.find((t => !t.matches(e))) : void 0 !== this.filters.find((t => t.matches(e)));\n }\n getFlattenedFilters() {\n return null !== this.ae || (this.ae = this.filters.reduce(((e, t) => e.concat(t.getFlattenedFilters())), [])), \n this.ae;\n }\n // Returns a mutable copy of `this.filters`\n getFilters() {\n return Object.assign([], this.filters);\n }\n}\n\nfunction __PRIVATE_compositeFilterIsConjunction(e) {\n return \"and\" /* CompositeOperator.AND */ === e.op;\n}\n\nfunction __PRIVATE_compositeFilterIsDisjunction(e) {\n return \"or\" /* CompositeOperator.OR */ === e.op;\n}\n\n/**\n * Returns true if this filter is a conjunction of field filters only. Returns false otherwise.\n */ function __PRIVATE_compositeFilterIsFlatConjunction(e) {\n return __PRIVATE_compositeFilterIsFlat(e) && __PRIVATE_compositeFilterIsConjunction(e);\n}\n\n/**\n * Returns true if this filter does not contain any composite filters. Returns false otherwise.\n */ function __PRIVATE_compositeFilterIsFlat(e) {\n for (const t of e.filters) if (t instanceof CompositeFilter) return !1;\n return !0;\n}\n\nfunction __PRIVATE_canonifyFilter(e) {\n if (e instanceof FieldFilter) \n // TODO(b/29183165): Technically, this won't be unique if two values have\n // the same description, such as the int 3 and the string \"3\". So we should\n // add the types in here somehow, too.\n return e.field.canonicalString() + e.op.toString() + canonicalId(e.value);\n if (__PRIVATE_compositeFilterIsFlatConjunction(e)) \n // Older SDK versions use an implicit AND operation between their filters.\n // In the new SDK versions, the developer may use an explicit AND filter.\n // To stay consistent with the old usages, we add a special case to ensure\n // the canonical ID for these two are the same. For example:\n // `col.whereEquals(\"a\", 1).whereEquals(\"b\", 2)` should have the same\n // canonical ID as `col.where(and(equals(\"a\",1), equals(\"b\",2)))`.\n return e.filters.map((e => __PRIVATE_canonifyFilter(e))).join(\",\");\n {\n // filter instanceof CompositeFilter\n const t = e.filters.map((e => __PRIVATE_canonifyFilter(e))).join(\",\");\n return `${e.op}(${t})`;\n }\n}\n\nfunction __PRIVATE_filterEquals(e, t) {\n return e instanceof FieldFilter ? function __PRIVATE_fieldFilterEquals(e, t) {\n return t instanceof FieldFilter && e.op === t.op && e.field.isEqual(t.field) && __PRIVATE_valueEquals(e.value, t.value);\n }(e, t) : e instanceof CompositeFilter ? function __PRIVATE_compositeFilterEquals(e, t) {\n if (t instanceof CompositeFilter && e.op === t.op && e.filters.length === t.filters.length) {\n return e.filters.reduce(((e, n, r) => e && __PRIVATE_filterEquals(n, t.filters[r])), !0);\n }\n return !1;\n }\n /**\n * Returns a new composite filter that contains all filter from\n * `compositeFilter` plus all the given filters in `otherFilters`.\n */ (e, t) : void fail();\n}\n\nfunction __PRIVATE_compositeFilterWithAddedFilters(e, t) {\n const n = e.filters.concat(t);\n return CompositeFilter.create(n, e.op);\n}\n\n/** Returns a debug description for `filter`. */ function __PRIVATE_stringifyFilter(e) {\n return e instanceof FieldFilter ? function __PRIVATE_stringifyFieldFilter(e) {\n return `${e.field.canonicalString()} ${e.op} ${canonicalId(e.value)}`;\n }\n /** Filter that matches on key fields (i.e. '__name__'). */ (e) : e instanceof CompositeFilter ? function __PRIVATE_stringifyCompositeFilter(e) {\n return e.op.toString() + \" {\" + e.getFilters().map(__PRIVATE_stringifyFilter).join(\" ,\") + \"}\";\n }(e) : \"Filter\";\n}\n\nclass __PRIVATE_KeyFieldFilter extends FieldFilter {\n constructor(e, t, n) {\n super(e, t, n), this.key = DocumentKey.fromName(n.referenceValue);\n }\n matches(e) {\n const t = DocumentKey.comparator(e.key, this.key);\n return this.matchesComparison(t);\n }\n}\n\n/** Filter that matches on key fields within an array. */ class __PRIVATE_KeyFieldInFilter extends FieldFilter {\n constructor(e, t) {\n super(e, \"in\" /* Operator.IN */ , t), this.keys = __PRIVATE_extractDocumentKeysFromArrayValue(\"in\" /* Operator.IN */ , t);\n }\n matches(e) {\n return this.keys.some((t => t.isEqual(e.key)));\n }\n}\n\n/** Filter that matches on key fields not present within an array. */ class __PRIVATE_KeyFieldNotInFilter extends FieldFilter {\n constructor(e, t) {\n super(e, \"not-in\" /* Operator.NOT_IN */ , t), this.keys = __PRIVATE_extractDocumentKeysFromArrayValue(\"not-in\" /* Operator.NOT_IN */ , t);\n }\n matches(e) {\n return !this.keys.some((t => t.isEqual(e.key)));\n }\n}\n\nfunction __PRIVATE_extractDocumentKeysFromArrayValue(e, t) {\n var n;\n return ((null === (n = t.arrayValue) || void 0 === n ? void 0 : n.values) || []).map((e => DocumentKey.fromName(e.referenceValue)));\n}\n\n/** A Filter that implements the array-contains operator. */ class __PRIVATE_ArrayContainsFilter extends FieldFilter {\n constructor(e, t) {\n super(e, \"array-contains\" /* Operator.ARRAY_CONTAINS */ , t);\n }\n matches(e) {\n const t = e.data.field(this.field);\n return isArray(t) && __PRIVATE_arrayValueContains(t.arrayValue, this.value);\n }\n}\n\n/** A Filter that implements the IN operator. */ class __PRIVATE_InFilter extends FieldFilter {\n constructor(e, t) {\n super(e, \"in\" /* Operator.IN */ , t);\n }\n matches(e) {\n const t = e.data.field(this.field);\n return null !== t && __PRIVATE_arrayValueContains(this.value.arrayValue, t);\n }\n}\n\n/** A Filter that implements the not-in operator. */ class __PRIVATE_NotInFilter extends FieldFilter {\n constructor(e, t) {\n super(e, \"not-in\" /* Operator.NOT_IN */ , t);\n }\n matches(e) {\n if (__PRIVATE_arrayValueContains(this.value.arrayValue, {\n nullValue: \"NULL_VALUE\"\n })) return !1;\n const t = e.data.field(this.field);\n return null !== t && !__PRIVATE_arrayValueContains(this.value.arrayValue, t);\n }\n}\n\n/** A Filter that implements the array-contains-any operator. */ class __PRIVATE_ArrayContainsAnyFilter extends FieldFilter {\n constructor(e, t) {\n super(e, \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ , t);\n }\n matches(e) {\n const t = e.data.field(this.field);\n return !(!isArray(t) || !t.arrayValue.values) && t.arrayValue.values.some((e => __PRIVATE_arrayValueContains(this.value.arrayValue, e)));\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// Visible for testing\nclass __PRIVATE_TargetImpl {\n constructor(e, t = null, n = [], r = [], i = null, s = null, o = null) {\n this.path = e, this.collectionGroup = t, this.orderBy = n, this.filters = r, this.limit = i, \n this.startAt = s, this.endAt = o, this.ue = null;\n }\n}\n\n/**\n * Initializes a Target with a path and optional additional query constraints.\n * Path must currently be empty if this is a collection group query.\n *\n * NOTE: you should always construct `Target` from `Query.toTarget` instead of\n * using this factory method, because `Query` provides an implicit `orderBy`\n * property.\n */ function __PRIVATE_newTarget(e, t = null, n = [], r = [], i = null, s = null, o = null) {\n return new __PRIVATE_TargetImpl(e, t, n, r, i, s, o);\n}\n\nfunction __PRIVATE_canonifyTarget(e) {\n const t = __PRIVATE_debugCast(e);\n if (null === t.ue) {\n let e = t.path.canonicalString();\n null !== t.collectionGroup && (e += \"|cg:\" + t.collectionGroup), e += \"|f:\", e += t.filters.map((e => __PRIVATE_canonifyFilter(e))).join(\",\"), \n e += \"|ob:\", e += t.orderBy.map((e => function __PRIVATE_canonifyOrderBy(e) {\n // TODO(b/29183165): Make this collision robust.\n return e.field.canonicalString() + e.dir;\n }(e))).join(\",\"), __PRIVATE_isNullOrUndefined(t.limit) || (e += \"|l:\", e += t.limit), \n t.startAt && (e += \"|lb:\", e += t.startAt.inclusive ? \"b:\" : \"a:\", e += t.startAt.position.map((e => canonicalId(e))).join(\",\")), \n t.endAt && (e += \"|ub:\", e += t.endAt.inclusive ? \"a:\" : \"b:\", e += t.endAt.position.map((e => canonicalId(e))).join(\",\")), \n t.ue = e;\n }\n return t.ue;\n}\n\nfunction __PRIVATE_targetEquals(e, t) {\n if (e.limit !== t.limit) return !1;\n if (e.orderBy.length !== t.orderBy.length) return !1;\n for (let n = 0; n < e.orderBy.length; n++) if (!__PRIVATE_orderByEquals(e.orderBy[n], t.orderBy[n])) return !1;\n if (e.filters.length !== t.filters.length) return !1;\n for (let n = 0; n < e.filters.length; n++) if (!__PRIVATE_filterEquals(e.filters[n], t.filters[n])) return !1;\n return e.collectionGroup === t.collectionGroup && (!!e.path.isEqual(t.path) && (!!__PRIVATE_boundEquals(e.startAt, t.startAt) && __PRIVATE_boundEquals(e.endAt, t.endAt)));\n}\n\nfunction __PRIVATE_targetIsDocumentTarget(e) {\n return DocumentKey.isDocumentKey(e.path) && null === e.collectionGroup && 0 === e.filters.length;\n}\n\n/** Returns the field filters that target the given field path. */ function __PRIVATE_targetGetFieldFiltersForPath(e, t) {\n return e.filters.filter((e => e instanceof FieldFilter && e.field.isEqual(t)));\n}\n\n/**\n * Returns the values that are used in ARRAY_CONTAINS or ARRAY_CONTAINS_ANY\n * filters. Returns `null` if there are no such filters.\n */\n/**\n * Returns the value to use as the lower bound for ascending index segment at\n * the provided `fieldPath` (or the upper bound for an descending segment).\n */\nfunction __PRIVATE_targetGetAscendingBound(e, t, n) {\n let r = ie, i = !0;\n // Process all filters to find a value for the current field segment\n for (const n of __PRIVATE_targetGetFieldFiltersForPath(e, t)) {\n let e = ie, t = !0;\n switch (n.op) {\n case \"<\" /* Operator.LESS_THAN */ :\n case \"<=\" /* Operator.LESS_THAN_OR_EQUAL */ :\n e = __PRIVATE_valuesGetLowerBound(n.value);\n break;\n\n case \"==\" /* Operator.EQUAL */ :\n case \"in\" /* Operator.IN */ :\n case \">=\" /* Operator.GREATER_THAN_OR_EQUAL */ :\n e = n.value;\n break;\n\n case \">\" /* Operator.GREATER_THAN */ :\n e = n.value, t = !1;\n break;\n\n case \"!=\" /* Operator.NOT_EQUAL */ :\n case \"not-in\" /* Operator.NOT_IN */ :\n e = ie;\n // Remaining filters cannot be used as lower bounds.\n }\n __PRIVATE_lowerBoundCompare({\n value: r,\n inclusive: i\n }, {\n value: e,\n inclusive: t\n }) < 0 && (r = e, i = t);\n }\n // If there is an additional bound, compare the values against the existing\n // range to see if we can narrow the scope.\n if (null !== n) for (let s = 0; s < e.orderBy.length; ++s) {\n if (e.orderBy[s].field.isEqual(t)) {\n const e = n.position[s];\n __PRIVATE_lowerBoundCompare({\n value: r,\n inclusive: i\n }, {\n value: e,\n inclusive: n.inclusive\n }) < 0 && (r = e, i = n.inclusive);\n break;\n }\n }\n return {\n value: r,\n inclusive: i\n };\n}\n\n/**\n * Returns the value to use as the upper bound for ascending index segment at\n * the provided `fieldPath` (or the lower bound for a descending segment).\n */ function __PRIVATE_targetGetDescendingBound(e, t, n) {\n let r = re, i = !0;\n // Process all filters to find a value for the current field segment\n for (const n of __PRIVATE_targetGetFieldFiltersForPath(e, t)) {\n let e = re, t = !0;\n switch (n.op) {\n case \">=\" /* Operator.GREATER_THAN_OR_EQUAL */ :\n case \">\" /* Operator.GREATER_THAN */ :\n e = __PRIVATE_valuesGetUpperBound(n.value), t = !1;\n break;\n\n case \"==\" /* Operator.EQUAL */ :\n case \"in\" /* Operator.IN */ :\n case \"<=\" /* Operator.LESS_THAN_OR_EQUAL */ :\n e = n.value;\n break;\n\n case \"<\" /* Operator.LESS_THAN */ :\n e = n.value, t = !1;\n break;\n\n case \"!=\" /* Operator.NOT_EQUAL */ :\n case \"not-in\" /* Operator.NOT_IN */ :\n e = re;\n // Remaining filters cannot be used as upper bounds.\n }\n __PRIVATE_upperBoundCompare({\n value: r,\n inclusive: i\n }, {\n value: e,\n inclusive: t\n }) > 0 && (r = e, i = t);\n }\n // If there is an additional bound, compare the values against the existing\n // range to see if we can narrow the scope.\n if (null !== n) for (let s = 0; s < e.orderBy.length; ++s) {\n if (e.orderBy[s].field.isEqual(t)) {\n const e = n.position[s];\n __PRIVATE_upperBoundCompare({\n value: r,\n inclusive: i\n }, {\n value: e,\n inclusive: n.inclusive\n }) > 0 && (r = e, i = n.inclusive);\n break;\n }\n }\n return {\n value: r,\n inclusive: i\n };\n}\n\n/** Returns the number of segments of a perfect index for this target. */\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Query encapsulates all the query attributes we support in the SDK. It can\n * be run against the LocalStore, as well as be converted to a `Target` to\n * query the RemoteStore results.\n *\n * Visible for testing.\n */\nclass __PRIVATE_QueryImpl {\n /**\n * Initializes a Query with a path and optional additional query constraints.\n * Path must currently be empty if this is a collection group query.\n */\n constructor(e, t = null, n = [], r = [], i = null, s = \"F\" /* LimitType.First */ , o = null, _ = null) {\n this.path = e, this.collectionGroup = t, this.explicitOrderBy = n, this.filters = r, \n this.limit = i, this.limitType = s, this.startAt = o, this.endAt = _, this.ce = null, \n // The corresponding `Target` of this `Query` instance, for use with\n // non-aggregate queries.\n this.le = null, \n // The corresponding `Target` of this `Query` instance, for use with\n // aggregate queries. Unlike targets for non-aggregate queries,\n // aggregate query targets do not contain normalized order-bys, they only\n // contain explicit order-bys.\n this.he = null, this.startAt, this.endAt;\n }\n}\n\n/** Creates a new Query instance with the options provided. */ function __PRIVATE_newQuery(e, t, n, r, i, s, o, _) {\n return new __PRIVATE_QueryImpl(e, t, n, r, i, s, o, _);\n}\n\n/** Creates a new Query for a query that matches all documents at `path` */ function __PRIVATE_newQueryForPath(e) {\n return new __PRIVATE_QueryImpl(e);\n}\n\n/**\n * Helper to convert a collection group query into a collection query at a\n * specific path. This is used when executing collection group queries, since\n * we have to split the query into a set of collection queries at multiple\n * paths.\n */\n/**\n * Returns true if this query does not specify any query constraints that\n * could remove results.\n */\nfunction __PRIVATE_queryMatchesAllDocuments(e) {\n return 0 === e.filters.length && null === e.limit && null == e.startAt && null == e.endAt && (0 === e.explicitOrderBy.length || 1 === e.explicitOrderBy.length && e.explicitOrderBy[0].field.isKeyField());\n}\n\n// Returns the sorted set of inequality filter fields used in this query.\n/**\n * Returns whether the query matches a collection group rather than a specific\n * collection.\n */\nfunction __PRIVATE_isCollectionGroupQuery(e) {\n return null !== e.collectionGroup;\n}\n\n/**\n * Returns the normalized order-by constraint that is used to execute the Query,\n * which can be different from the order-by constraints the user provided (e.g.\n * the SDK and backend always orders by `__name__`). The normalized order-by\n * includes implicit order-bys in addition to the explicit user provided\n * order-bys.\n */ function __PRIVATE_queryNormalizedOrderBy(e) {\n const t = __PRIVATE_debugCast(e);\n if (null === t.ce) {\n t.ce = [];\n const e = new Set;\n // Any explicit order by fields should be added as is.\n for (const n of t.explicitOrderBy) t.ce.push(n), e.add(n.field.canonicalString());\n // The order of the implicit ordering always matches the last explicit order by.\n const n = t.explicitOrderBy.length > 0 ? t.explicitOrderBy[t.explicitOrderBy.length - 1].dir : \"asc\" /* Direction.ASCENDING */ , r = function __PRIVATE_getInequalityFilterFields(e) {\n let t = new SortedSet(FieldPath$1.comparator);\n return e.filters.forEach((e => {\n e.getFlattenedFilters().forEach((e => {\n e.isInequality() && (t = t.add(e.field));\n }));\n })), t;\n }\n /**\n * Creates a new Query for a collection group query that matches all documents\n * within the provided collection group.\n */ (t);\n // Any inequality fields not explicitly ordered should be implicitly ordered in a lexicographical\n // order. When there are multiple inequality filters on the same field, the field should be added\n // only once.\n // Note: `SortedSet` sorts the key field before other fields. However, we want the key\n // field to be sorted last.\n r.forEach((r => {\n e.has(r.canonicalString()) || r.isKeyField() || t.ce.push(new OrderBy(r, n));\n })), \n // Add the document key field to the last if it is not explicitly ordered.\n e.has(FieldPath$1.keyField().canonicalString()) || t.ce.push(new OrderBy(FieldPath$1.keyField(), n));\n }\n return t.ce;\n}\n\n/**\n * Converts this `Query` instance to its corresponding `Target` representation.\n */ function __PRIVATE_queryToTarget(e) {\n const t = __PRIVATE_debugCast(e);\n return t.le || (t.le = __PRIVATE__queryToTarget(t, __PRIVATE_queryNormalizedOrderBy(e))), \n t.le;\n}\n\n/**\n * Converts this `Query` instance to its corresponding `Target` representation,\n * for use within an aggregate query. Unlike targets for non-aggregate queries,\n * aggregate query targets do not contain normalized order-bys, they only\n * contain explicit order-bys.\n */ function __PRIVATE_queryToAggregateTarget(e) {\n const t = __PRIVATE_debugCast(e);\n return t.he || (\n // Do not include implicit order-bys for aggregate queries.\n t.he = __PRIVATE__queryToTarget(t, e.explicitOrderBy)), t.he;\n}\n\nfunction __PRIVATE__queryToTarget(e, t) {\n if (\"F\" /* LimitType.First */ === e.limitType) return __PRIVATE_newTarget(e.path, e.collectionGroup, t, e.filters, e.limit, e.startAt, e.endAt);\n {\n // Flip the orderBy directions since we want the last results\n t = t.map((e => {\n const t = \"desc\" /* Direction.DESCENDING */ === e.dir ? \"asc\" /* Direction.ASCENDING */ : \"desc\" /* Direction.DESCENDING */;\n return new OrderBy(e.field, t);\n }));\n // We need to swap the cursors to match the now-flipped query ordering.\n const n = e.endAt ? new Bound(e.endAt.position, e.endAt.inclusive) : null, r = e.startAt ? new Bound(e.startAt.position, e.startAt.inclusive) : null;\n // Now return as a LimitType.First query.\n return __PRIVATE_newTarget(e.path, e.collectionGroup, t, e.filters, e.limit, n, r);\n }\n}\n\nfunction __PRIVATE_queryWithAddedFilter(e, t) {\n const n = e.filters.concat([ t ]);\n return new __PRIVATE_QueryImpl(e.path, e.collectionGroup, e.explicitOrderBy.slice(), n, e.limit, e.limitType, e.startAt, e.endAt);\n}\n\nfunction __PRIVATE_queryWithLimit(e, t, n) {\n return new __PRIVATE_QueryImpl(e.path, e.collectionGroup, e.explicitOrderBy.slice(), e.filters.slice(), t, n, e.startAt, e.endAt);\n}\n\nfunction __PRIVATE_queryEquals(e, t) {\n return __PRIVATE_targetEquals(__PRIVATE_queryToTarget(e), __PRIVATE_queryToTarget(t)) && e.limitType === t.limitType;\n}\n\n// TODO(b/29183165): This is used to get a unique string from a query to, for\n// example, use as a dictionary key, but the implementation is subject to\n// collisions. Make it collision-free.\nfunction __PRIVATE_canonifyQuery(e) {\n return `${__PRIVATE_canonifyTarget(__PRIVATE_queryToTarget(e))}|lt:${e.limitType}`;\n}\n\nfunction __PRIVATE_stringifyQuery(e) {\n return `Query(target=${function __PRIVATE_stringifyTarget(e) {\n let t = e.path.canonicalString();\n return null !== e.collectionGroup && (t += \" collectionGroup=\" + e.collectionGroup), \n e.filters.length > 0 && (t += `, filters: [${e.filters.map((e => __PRIVATE_stringifyFilter(e))).join(\", \")}]`), \n __PRIVATE_isNullOrUndefined(e.limit) || (t += \", limit: \" + e.limit), e.orderBy.length > 0 && (t += `, orderBy: [${e.orderBy.map((e => function __PRIVATE_stringifyOrderBy(e) {\n return `${e.field.canonicalString()} (${e.dir})`;\n }(e))).join(\", \")}]`), e.startAt && (t += \", startAt: \", t += e.startAt.inclusive ? \"b:\" : \"a:\", \n t += e.startAt.position.map((e => canonicalId(e))).join(\",\")), e.endAt && (t += \", endAt: \", \n t += e.endAt.inclusive ? \"a:\" : \"b:\", t += e.endAt.position.map((e => canonicalId(e))).join(\",\")), \n `Target(${t})`;\n }(__PRIVATE_queryToTarget(e))}; limitType=${e.limitType})`;\n}\n\n/** Returns whether `doc` matches the constraints of `query`. */ function __PRIVATE_queryMatches(e, t) {\n return t.isFoundDocument() && function __PRIVATE_queryMatchesPathAndCollectionGroup(e, t) {\n const n = t.key.path;\n return null !== e.collectionGroup ? t.key.hasCollectionId(e.collectionGroup) && e.path.isPrefixOf(n) : DocumentKey.isDocumentKey(e.path) ? e.path.isEqual(n) : e.path.isImmediateParentOf(n);\n }\n /**\n * A document must have a value for every ordering clause in order to show up\n * in the results.\n */ (e, t) && function __PRIVATE_queryMatchesOrderBy(e, t) {\n // We must use `queryNormalizedOrderBy()` to get the list of all orderBys (both implicit and explicit).\n // Note that for OR queries, orderBy applies to all disjunction terms and implicit orderBys must\n // be taken into account. For example, the query \"a > 1 || b==1\" has an implicit \"orderBy a\" due\n // to the inequality, and is evaluated as \"a > 1 orderBy a || b==1 orderBy a\".\n // A document with content of {b:1} matches the filters, but does not match the orderBy because\n // it's missing the field 'a'.\n for (const n of __PRIVATE_queryNormalizedOrderBy(e)) \n // order-by key always matches\n if (!n.field.isKeyField() && null === t.data.field(n.field)) return !1;\n return !0;\n }(e, t) && function __PRIVATE_queryMatchesFilters(e, t) {\n for (const n of e.filters) if (!n.matches(t)) return !1;\n return !0;\n }\n /** Makes sure a document is within the bounds, if provided. */ (e, t) && function __PRIVATE_queryMatchesBounds(e, t) {\n if (e.startAt && !\n /**\n * Returns true if a document sorts before a bound using the provided sort\n * order.\n */\n function __PRIVATE_boundSortsBeforeDocument(e, t, n) {\n const r = __PRIVATE_boundCompareToDocument(e, t, n);\n return e.inclusive ? r <= 0 : r < 0;\n }(e.startAt, __PRIVATE_queryNormalizedOrderBy(e), t)) return !1;\n if (e.endAt && !function __PRIVATE_boundSortsAfterDocument(e, t, n) {\n const r = __PRIVATE_boundCompareToDocument(e, t, n);\n return e.inclusive ? r >= 0 : r > 0;\n }(e.endAt, __PRIVATE_queryNormalizedOrderBy(e), t)) return !1;\n return !0;\n }\n /**\n * Returns the collection group that this query targets.\n *\n * PORTING NOTE: This is only used in the Web SDK to facilitate multi-tab\n * synchronization for query results.\n */ (e, t);\n}\n\nfunction __PRIVATE_queryCollectionGroup(e) {\n return e.collectionGroup || (e.path.length % 2 == 1 ? e.path.lastSegment() : e.path.get(e.path.length - 2));\n}\n\n/**\n * Returns a new comparator function that can be used to compare two documents\n * based on the Query's ordering constraint.\n */ function __PRIVATE_newQueryComparator(e) {\n return (t, n) => {\n let r = !1;\n for (const i of __PRIVATE_queryNormalizedOrderBy(e)) {\n const e = __PRIVATE_compareDocs(i, t, n);\n if (0 !== e) return e;\n r = r || i.field.isKeyField();\n }\n return 0;\n };\n}\n\nfunction __PRIVATE_compareDocs(e, t, n) {\n const r = e.field.isKeyField() ? DocumentKey.comparator(t.key, n.key) : function __PRIVATE_compareDocumentsByField(e, t, n) {\n const r = t.data.field(e), i = n.data.field(e);\n return null !== r && null !== i ? __PRIVATE_valueCompare(r, i) : fail();\n }(e.field, t, n);\n switch (e.dir) {\n case \"asc\" /* Direction.ASCENDING */ :\n return r;\n\n case \"desc\" /* Direction.DESCENDING */ :\n return -1 * r;\n\n default:\n return fail();\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A map implementation that uses objects as keys. Objects must have an\n * associated equals function and must be immutable. Entries in the map are\n * stored together with the key being produced from the mapKeyFn. This map\n * automatically handles collisions of keys.\n */ class ObjectMap {\n constructor(e, t) {\n this.mapKeyFn = e, this.equalsFn = t, \n /**\n * The inner map for a key/value pair. Due to the possibility of collisions we\n * keep a list of entries that we do a linear search through to find an actual\n * match. Note that collisions should be rare, so we still expect near\n * constant time lookups in practice.\n */\n this.inner = {}, \n /** The number of entries stored in the map */\n this.innerSize = 0;\n }\n /** Get a value for this key, or undefined if it does not exist. */ get(e) {\n const t = this.mapKeyFn(e), n = this.inner[t];\n if (void 0 !== n) for (const [t, r] of n) if (this.equalsFn(t, e)) return r;\n }\n has(e) {\n return void 0 !== this.get(e);\n }\n /** Put this key and value in the map. */ set(e, t) {\n const n = this.mapKeyFn(e), r = this.inner[n];\n if (void 0 === r) return this.inner[n] = [ [ e, t ] ], void this.innerSize++;\n for (let n = 0; n < r.length; n++) if (this.equalsFn(r[n][0], e)) \n // This is updating an existing entry and does not increase `innerSize`.\n return void (r[n] = [ e, t ]);\n r.push([ e, t ]), this.innerSize++;\n }\n /**\n * Remove this key from the map. Returns a boolean if anything was deleted.\n */ delete(e) {\n const t = this.mapKeyFn(e), n = this.inner[t];\n if (void 0 === n) return !1;\n for (let r = 0; r < n.length; r++) if (this.equalsFn(n[r][0], e)) return 1 === n.length ? delete this.inner[t] : n.splice(r, 1), \n this.innerSize--, !0;\n return !1;\n }\n forEach(e) {\n forEach(this.inner, ((t, n) => {\n for (const [t, r] of n) e(t, r);\n }));\n }\n isEmpty() {\n return isEmpty(this.inner);\n }\n size() {\n return this.innerSize;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const oe = new SortedMap(DocumentKey.comparator);\n\nfunction __PRIVATE_mutableDocumentMap() {\n return oe;\n}\n\nconst _e = new SortedMap(DocumentKey.comparator);\n\nfunction documentMap(...e) {\n let t = _e;\n for (const n of e) t = t.insert(n.key, n);\n return t;\n}\n\nfunction __PRIVATE_convertOverlayedDocumentMapToDocumentMap(e) {\n let t = _e;\n return e.forEach(((e, n) => t = t.insert(e, n.overlayedDocument))), t;\n}\n\nfunction __PRIVATE_newOverlayMap() {\n return __PRIVATE_newDocumentKeyMap();\n}\n\nfunction __PRIVATE_newMutationMap() {\n return __PRIVATE_newDocumentKeyMap();\n}\n\nfunction __PRIVATE_newDocumentKeyMap() {\n return new ObjectMap((e => e.toString()), ((e, t) => e.isEqual(t)));\n}\n\nconst ae = new SortedMap(DocumentKey.comparator);\n\nconst ue = new SortedSet(DocumentKey.comparator);\n\nfunction __PRIVATE_documentKeySet(...e) {\n let t = ue;\n for (const n of e) t = t.add(n);\n return t;\n}\n\nconst ce = new SortedSet(__PRIVATE_primitiveComparator);\n\nfunction __PRIVATE_targetIdSet() {\n return ce;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Returns an DoubleValue for `value` that is encoded based the serializer's\n * `useProto3Json` setting.\n */ function __PRIVATE_toDouble(e, t) {\n if (e.useProto3Json) {\n if (isNaN(t)) return {\n doubleValue: \"NaN\"\n };\n if (t === 1 / 0) return {\n doubleValue: \"Infinity\"\n };\n if (t === -1 / 0) return {\n doubleValue: \"-Infinity\"\n };\n }\n return {\n doubleValue: __PRIVATE_isNegativeZero(t) ? \"-0\" : t\n };\n}\n\n/**\n * Returns an IntegerValue for `value`.\n */ function __PRIVATE_toInteger(e) {\n return {\n integerValue: \"\" + e\n };\n}\n\n/**\n * Returns a value for a number that's appropriate to put into a proto.\n * The return value is an IntegerValue if it can safely represent the value,\n * otherwise a DoubleValue is returned.\n */ function toNumber(e, t) {\n return isSafeInteger(t) ? __PRIVATE_toInteger(t) : __PRIVATE_toDouble(e, t);\n}\n\n/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Used to represent a field transform on a mutation. */ class TransformOperation {\n constructor() {\n // Make sure that the structural type of `TransformOperation` is unique.\n // See https://github.com/microsoft/TypeScript/issues/5451\n this._ = void 0;\n }\n}\n\n/**\n * Computes the local transform result against the provided `previousValue`,\n * optionally using the provided localWriteTime.\n */ function __PRIVATE_applyTransformOperationToLocalView(e, t, n) {\n return e instanceof __PRIVATE_ServerTimestampTransform ? function serverTimestamp$1(e, t) {\n const n = {\n fields: {\n __type__: {\n stringValue: \"server_timestamp\"\n },\n __local_write_time__: {\n timestampValue: {\n seconds: e.seconds,\n nanos: e.nanoseconds\n }\n }\n }\n };\n // We should avoid storing deeply nested server timestamp map values\n // because we never use the intermediate \"previous values\".\n // For example:\n // previous: 42L, add: t1, result: t1 -> 42L\n // previous: t1, add: t2, result: t2 -> 42L (NOT t2 -> t1 -> 42L)\n // previous: t2, add: t3, result: t3 -> 42L (NOT t3 -> t2 -> t1 -> 42L)\n // `getPreviousValue` recursively traverses server timestamps to find the\n // least recent Value.\n return t && __PRIVATE_isServerTimestamp(t) && (t = __PRIVATE_getPreviousValue(t)), \n t && (n.fields.__previous_value__ = t), {\n mapValue: n\n };\n }(n, t) : e instanceof __PRIVATE_ArrayUnionTransformOperation ? __PRIVATE_applyArrayUnionTransformOperation(e, t) : e instanceof __PRIVATE_ArrayRemoveTransformOperation ? __PRIVATE_applyArrayRemoveTransformOperation(e, t) : function __PRIVATE_applyNumericIncrementTransformOperationToLocalView(e, t) {\n // PORTING NOTE: Since JavaScript's integer arithmetic is limited to 53 bit\n // precision and resolves overflows by reducing precision, we do not\n // manually cap overflows at 2^63.\n const n = __PRIVATE_computeTransformOperationBaseValue(e, t), r = asNumber(n) + asNumber(e.Pe);\n return isInteger(n) && isInteger(e.Pe) ? __PRIVATE_toInteger(r) : __PRIVATE_toDouble(e.serializer, r);\n }(e, t);\n}\n\n/**\n * Computes a final transform result after the transform has been acknowledged\n * by the server, potentially using the server-provided transformResult.\n */ function __PRIVATE_applyTransformOperationToRemoteDocument(e, t, n) {\n // The server just sends null as the transform result for array operations,\n // so we have to calculate a result the same as we do for local\n // applications.\n return e instanceof __PRIVATE_ArrayUnionTransformOperation ? __PRIVATE_applyArrayUnionTransformOperation(e, t) : e instanceof __PRIVATE_ArrayRemoveTransformOperation ? __PRIVATE_applyArrayRemoveTransformOperation(e, t) : n;\n}\n\n/**\n * If this transform operation is not idempotent, returns the base value to\n * persist for this transform. If a base value is returned, the transform\n * operation is always applied to this base value, even if document has\n * already been updated.\n *\n * Base values provide consistent behavior for non-idempotent transforms and\n * allow us to return the same latency-compensated value even if the backend\n * has already applied the transform operation. The base value is null for\n * idempotent transforms, as they can be re-played even if the backend has\n * already applied them.\n *\n * @returns a base value to store along with the mutation, or null for\n * idempotent transforms.\n */ function __PRIVATE_computeTransformOperationBaseValue(e, t) {\n return e instanceof __PRIVATE_NumericIncrementTransformOperation ? \n /** Returns true if `value` is either an IntegerValue or a DoubleValue. */\n function __PRIVATE_isNumber(e) {\n return isInteger(e) || function __PRIVATE_isDouble(e) {\n return !!e && \"doubleValue\" in e;\n }(e);\n }(t) ? t : {\n integerValue: 0\n } : null;\n}\n\n/** Transforms a value into a server-generated timestamp. */\nclass __PRIVATE_ServerTimestampTransform extends TransformOperation {}\n\n/** Transforms an array value via a union operation. */ class __PRIVATE_ArrayUnionTransformOperation extends TransformOperation {\n constructor(e) {\n super(), this.elements = e;\n }\n}\n\nfunction __PRIVATE_applyArrayUnionTransformOperation(e, t) {\n const n = __PRIVATE_coercedFieldValuesArray(t);\n for (const t of e.elements) n.some((e => __PRIVATE_valueEquals(e, t))) || n.push(t);\n return {\n arrayValue: {\n values: n\n }\n };\n}\n\n/** Transforms an array value via a remove operation. */ class __PRIVATE_ArrayRemoveTransformOperation extends TransformOperation {\n constructor(e) {\n super(), this.elements = e;\n }\n}\n\nfunction __PRIVATE_applyArrayRemoveTransformOperation(e, t) {\n let n = __PRIVATE_coercedFieldValuesArray(t);\n for (const t of e.elements) n = n.filter((e => !__PRIVATE_valueEquals(e, t)));\n return {\n arrayValue: {\n values: n\n }\n };\n}\n\n/**\n * Implements the backend semantics for locally computed NUMERIC_ADD (increment)\n * transforms. Converts all field values to integers or doubles, but unlike the\n * backend does not cap integer values at 2^63. Instead, JavaScript number\n * arithmetic is used and precision loss can occur for values greater than 2^53.\n */ class __PRIVATE_NumericIncrementTransformOperation extends TransformOperation {\n constructor(e, t) {\n super(), this.serializer = e, this.Pe = t;\n }\n}\n\nfunction asNumber(e) {\n return __PRIVATE_normalizeNumber(e.integerValue || e.doubleValue);\n}\n\nfunction __PRIVATE_coercedFieldValuesArray(e) {\n return isArray(e) && e.arrayValue.values ? e.arrayValue.values.slice() : [];\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** A field path and the TransformOperation to perform upon it. */ class FieldTransform {\n constructor(e, t) {\n this.field = e, this.transform = t;\n }\n}\n\nfunction __PRIVATE_fieldTransformEquals(e, t) {\n return e.field.isEqual(t.field) && function __PRIVATE_transformOperationEquals(e, t) {\n return e instanceof __PRIVATE_ArrayUnionTransformOperation && t instanceof __PRIVATE_ArrayUnionTransformOperation || e instanceof __PRIVATE_ArrayRemoveTransformOperation && t instanceof __PRIVATE_ArrayRemoveTransformOperation ? __PRIVATE_arrayEquals(e.elements, t.elements, __PRIVATE_valueEquals) : e instanceof __PRIVATE_NumericIncrementTransformOperation && t instanceof __PRIVATE_NumericIncrementTransformOperation ? __PRIVATE_valueEquals(e.Pe, t.Pe) : e instanceof __PRIVATE_ServerTimestampTransform && t instanceof __PRIVATE_ServerTimestampTransform;\n }(e.transform, t.transform);\n}\n\n/** The result of successfully applying a mutation to the backend. */\nclass MutationResult {\n constructor(\n /**\n * The version at which the mutation was committed:\n *\n * - For most operations, this is the updateTime in the WriteResult.\n * - For deletes, the commitTime of the WriteResponse (because deletes are\n * not stored and have no updateTime).\n *\n * Note that these versions can be different: No-op writes will not change\n * the updateTime even though the commitTime advances.\n */\n e, \n /**\n * The resulting fields returned from the backend after a mutation\n * containing field transforms has been committed. Contains one FieldValue\n * for each FieldTransform that was in the mutation.\n *\n * Will be empty if the mutation did not contain any field transforms.\n */\n t) {\n this.version = e, this.transformResults = t;\n }\n}\n\n/**\n * Encodes a precondition for a mutation. This follows the model that the\n * backend accepts with the special case of an explicit \"empty\" precondition\n * (meaning no precondition).\n */ class Precondition {\n constructor(e, t) {\n this.updateTime = e, this.exists = t;\n }\n /** Creates a new empty Precondition. */ static none() {\n return new Precondition;\n }\n /** Creates a new Precondition with an exists flag. */ static exists(e) {\n return new Precondition(void 0, e);\n }\n /** Creates a new Precondition based on a version a document exists at. */ static updateTime(e) {\n return new Precondition(e);\n }\n /** Returns whether this Precondition is empty. */ get isNone() {\n return void 0 === this.updateTime && void 0 === this.exists;\n }\n isEqual(e) {\n return this.exists === e.exists && (this.updateTime ? !!e.updateTime && this.updateTime.isEqual(e.updateTime) : !e.updateTime);\n }\n}\n\n/** Returns true if the preconditions is valid for the given document. */ function __PRIVATE_preconditionIsValidForDocument(e, t) {\n return void 0 !== e.updateTime ? t.isFoundDocument() && t.version.isEqual(e.updateTime) : void 0 === e.exists || e.exists === t.isFoundDocument();\n}\n\n/**\n * A mutation describes a self-contained change to a document. Mutations can\n * create, replace, delete, and update subsets of documents.\n *\n * Mutations not only act on the value of the document but also its version.\n *\n * For local mutations (mutations that haven't been committed yet), we preserve\n * the existing version for Set and Patch mutations. For Delete mutations, we\n * reset the version to 0.\n *\n * Here's the expected transition table.\n *\n * MUTATION APPLIED TO RESULTS IN\n *\n * SetMutation Document(v3) Document(v3)\n * SetMutation NoDocument(v3) Document(v0)\n * SetMutation InvalidDocument(v0) Document(v0)\n * PatchMutation Document(v3) Document(v3)\n * PatchMutation NoDocument(v3) NoDocument(v3)\n * PatchMutation InvalidDocument(v0) UnknownDocument(v3)\n * DeleteMutation Document(v3) NoDocument(v0)\n * DeleteMutation NoDocument(v3) NoDocument(v0)\n * DeleteMutation InvalidDocument(v0) NoDocument(v0)\n *\n * For acknowledged mutations, we use the updateTime of the WriteResponse as\n * the resulting version for Set and Patch mutations. As deletes have no\n * explicit update time, we use the commitTime of the WriteResponse for\n * Delete mutations.\n *\n * If a mutation is acknowledged by the backend but fails the precondition check\n * locally, we transition to an `UnknownDocument` and rely on Watch to send us\n * the updated version.\n *\n * Field transforms are used only with Patch and Set Mutations. We use the\n * `updateTransforms` message to store transforms, rather than the `transforms`s\n * messages.\n *\n * ## Subclassing Notes\n *\n * Every type of mutation needs to implement its own applyToRemoteDocument() and\n * applyToLocalView() to implement the actual behavior of applying the mutation\n * to some source document (see `setMutationApplyToRemoteDocument()` for an\n * example).\n */ class Mutation {}\n\n/**\n * A utility method to calculate a `Mutation` representing the overlay from the\n * final state of the document, and a `FieldMask` representing the fields that\n * are mutated by the local mutations.\n */ function __PRIVATE_calculateOverlayMutation(e, t) {\n if (!e.hasLocalMutations || t && 0 === t.fields.length) return null;\n // mask is null when sets or deletes are applied to the current document.\n if (null === t) return e.isNoDocument() ? new __PRIVATE_DeleteMutation(e.key, Precondition.none()) : new __PRIVATE_SetMutation(e.key, e.data, Precondition.none());\n {\n const n = e.data, r = ObjectValue.empty();\n let i = new SortedSet(FieldPath$1.comparator);\n for (let e of t.fields) if (!i.has(e)) {\n let t = n.field(e);\n // If we are deleting a nested field, we take the immediate parent as\n // the mask used to construct the resulting mutation.\n // Justification: Nested fields can create parent fields implicitly. If\n // only a leaf entry is deleted in later mutations, the parent field\n // should still remain, but we may have lost this information.\n // Consider mutation (foo.bar 1), then mutation (foo.bar delete()).\n // This leaves the final result (foo, {}). Despite the fact that `doc`\n // has the correct result, `foo` is not in `mask`, and the resulting\n // mutation would miss `foo`.\n null === t && e.length > 1 && (e = e.popLast(), t = n.field(e)), null === t ? r.delete(e) : r.set(e, t), \n i = i.add(e);\n }\n return new __PRIVATE_PatchMutation(e.key, r, new FieldMask(i.toArray()), Precondition.none());\n }\n}\n\n/**\n * Applies this mutation to the given document for the purposes of computing a\n * new remote document. If the input document doesn't match the expected state\n * (e.g. it is invalid or outdated), the document type may transition to\n * unknown.\n *\n * @param mutation - The mutation to apply.\n * @param document - The document to mutate. The input document can be an\n * invalid document if the client has no knowledge of the pre-mutation state\n * of the document.\n * @param mutationResult - The result of applying the mutation from the backend.\n */ function __PRIVATE_mutationApplyToRemoteDocument(e, t, n) {\n e instanceof __PRIVATE_SetMutation ? function __PRIVATE_setMutationApplyToRemoteDocument(e, t, n) {\n // Unlike setMutationApplyToLocalView, if we're applying a mutation to a\n // remote document the server has accepted the mutation so the precondition\n // must have held.\n const r = e.value.clone(), i = __PRIVATE_serverTransformResults(e.fieldTransforms, t, n.transformResults);\n r.setAll(i), t.convertToFoundDocument(n.version, r).setHasCommittedMutations();\n }(e, t, n) : e instanceof __PRIVATE_PatchMutation ? function __PRIVATE_patchMutationApplyToRemoteDocument(e, t, n) {\n if (!__PRIVATE_preconditionIsValidForDocument(e.precondition, t)) \n // Since the mutation was not rejected, we know that the precondition\n // matched on the backend. We therefore must not have the expected version\n // of the document in our cache and convert to an UnknownDocument with a\n // known updateTime.\n return void t.convertToUnknownDocument(n.version);\n const r = __PRIVATE_serverTransformResults(e.fieldTransforms, t, n.transformResults), i = t.data;\n i.setAll(__PRIVATE_getPatch(e)), i.setAll(r), t.convertToFoundDocument(n.version, i).setHasCommittedMutations();\n }(e, t, n) : function __PRIVATE_deleteMutationApplyToRemoteDocument(e, t, n) {\n // Unlike applyToLocalView, if we're applying a mutation to a remote\n // document the server has accepted the mutation so the precondition must\n // have held.\n t.convertToNoDocument(n.version).setHasCommittedMutations();\n }(0, t, n);\n}\n\n/**\n * Applies this mutation to the given document for the purposes of computing\n * the new local view of a document. If the input document doesn't match the\n * expected state, the document is not modified.\n *\n * @param mutation - The mutation to apply.\n * @param document - The document to mutate. The input document can be an\n * invalid document if the client has no knowledge of the pre-mutation state\n * of the document.\n * @param previousMask - The fields that have been updated before applying this mutation.\n * @param localWriteTime - A timestamp indicating the local write time of the\n * batch this mutation is a part of.\n * @returns A `FieldMask` representing the fields that are changed by applying this mutation.\n */ function __PRIVATE_mutationApplyToLocalView(e, t, n, r) {\n return e instanceof __PRIVATE_SetMutation ? function __PRIVATE_setMutationApplyToLocalView(e, t, n, r) {\n if (!__PRIVATE_preconditionIsValidForDocument(e.precondition, t)) \n // The mutation failed to apply (e.g. a document ID created with add()\n // caused a name collision).\n return n;\n const i = e.value.clone(), s = __PRIVATE_localTransformResults(e.fieldTransforms, r, t);\n return i.setAll(s), t.convertToFoundDocument(t.version, i).setHasLocalMutations(), \n null;\n // SetMutation overwrites all fields.\n }\n /**\n * A mutation that modifies fields of the document at the given key with the\n * given values. The values are applied through a field mask:\n *\n * * When a field is in both the mask and the values, the corresponding field\n * is updated.\n * * When a field is in neither the mask nor the values, the corresponding\n * field is unmodified.\n * * When a field is in the mask but not in the values, the corresponding field\n * is deleted.\n * * When a field is not in the mask but is in the values, the values map is\n * ignored.\n */ (e, t, n, r) : e instanceof __PRIVATE_PatchMutation ? function __PRIVATE_patchMutationApplyToLocalView(e, t, n, r) {\n if (!__PRIVATE_preconditionIsValidForDocument(e.precondition, t)) return n;\n const i = __PRIVATE_localTransformResults(e.fieldTransforms, r, t), s = t.data;\n if (s.setAll(__PRIVATE_getPatch(e)), s.setAll(i), t.convertToFoundDocument(t.version, s).setHasLocalMutations(), \n null === n) return null;\n return n.unionWith(e.fieldMask.fields).unionWith(e.fieldTransforms.map((e => e.field)));\n }\n /**\n * Returns a FieldPath/Value map with the content of the PatchMutation.\n */ (e, t, n, r) : function __PRIVATE_deleteMutationApplyToLocalView(e, t, n) {\n if (__PRIVATE_preconditionIsValidForDocument(e.precondition, t)) return t.convertToNoDocument(t.version).setHasLocalMutations(), \n null;\n return n;\n }\n /**\n * A mutation that verifies the existence of the document at the given key with\n * the provided precondition.\n *\n * The `verify` operation is only used in Transactions, and this class serves\n * primarily to facilitate serialization into protos.\n */ (e, t, n);\n}\n\n/**\n * If this mutation is not idempotent, returns the base value to persist with\n * this mutation. If a base value is returned, the mutation is always applied\n * to this base value, even if document has already been updated.\n *\n * The base value is a sparse object that consists of only the document\n * fields for which this mutation contains a non-idempotent transformation\n * (e.g. a numeric increment). The provided value guarantees consistent\n * behavior for non-idempotent transforms and allow us to return the same\n * latency-compensated value even if the backend has already applied the\n * mutation. The base value is null for idempotent mutations, as they can be\n * re-played even if the backend has already applied them.\n *\n * @returns a base value to store along with the mutation, or null for\n * idempotent mutations.\n */ function __PRIVATE_mutationExtractBaseValue(e, t) {\n let n = null;\n for (const r of e.fieldTransforms) {\n const e = t.data.field(r.field), i = __PRIVATE_computeTransformOperationBaseValue(r.transform, e || null);\n null != i && (null === n && (n = ObjectValue.empty()), n.set(r.field, i));\n }\n return n || null;\n}\n\nfunction __PRIVATE_mutationEquals(e, t) {\n return e.type === t.type && (!!e.key.isEqual(t.key) && (!!e.precondition.isEqual(t.precondition) && (!!function __PRIVATE_fieldTransformsAreEqual(e, t) {\n return void 0 === e && void 0 === t || !(!e || !t) && __PRIVATE_arrayEquals(e, t, ((e, t) => __PRIVATE_fieldTransformEquals(e, t)));\n }(e.fieldTransforms, t.fieldTransforms) && (0 /* MutationType.Set */ === e.type ? e.value.isEqual(t.value) : 1 /* MutationType.Patch */ !== e.type || e.data.isEqual(t.data) && e.fieldMask.isEqual(t.fieldMask)))));\n}\n\n/**\n * A mutation that creates or replaces the document at the given key with the\n * object value contents.\n */ class __PRIVATE_SetMutation extends Mutation {\n constructor(e, t, n, r = []) {\n super(), this.key = e, this.value = t, this.precondition = n, this.fieldTransforms = r, \n this.type = 0 /* MutationType.Set */;\n }\n getFieldMask() {\n return null;\n }\n}\n\nclass __PRIVATE_PatchMutation extends Mutation {\n constructor(e, t, n, r, i = []) {\n super(), this.key = e, this.data = t, this.fieldMask = n, this.precondition = r, \n this.fieldTransforms = i, this.type = 1 /* MutationType.Patch */;\n }\n getFieldMask() {\n return this.fieldMask;\n }\n}\n\nfunction __PRIVATE_getPatch(e) {\n const t = new Map;\n return e.fieldMask.fields.forEach((n => {\n if (!n.isEmpty()) {\n const r = e.data.field(n);\n t.set(n, r);\n }\n })), t;\n}\n\n/**\n * Creates a list of \"transform results\" (a transform result is a field value\n * representing the result of applying a transform) for use after a mutation\n * containing transforms has been acknowledged by the server.\n *\n * @param fieldTransforms - The field transforms to apply the result to.\n * @param mutableDocument - The current state of the document after applying all\n * previous mutations.\n * @param serverTransformResults - The transform results received by the server.\n * @returns The transform results list.\n */ function __PRIVATE_serverTransformResults(e, t, n) {\n const r = new Map;\n __PRIVATE_hardAssert(e.length === n.length);\n for (let i = 0; i < n.length; i++) {\n const s = e[i], o = s.transform, _ = t.data.field(s.field);\n r.set(s.field, __PRIVATE_applyTransformOperationToRemoteDocument(o, _, n[i]));\n }\n return r;\n}\n\n/**\n * Creates a list of \"transform results\" (a transform result is a field value\n * representing the result of applying a transform) for use when applying a\n * transform locally.\n *\n * @param fieldTransforms - The field transforms to apply the result to.\n * @param localWriteTime - The local time of the mutation (used to\n * generate ServerTimestampValues).\n * @param mutableDocument - The document to apply transforms on.\n * @returns The transform results list.\n */ function __PRIVATE_localTransformResults(e, t, n) {\n const r = new Map;\n for (const i of e) {\n const e = i.transform, s = n.data.field(i.field);\n r.set(i.field, __PRIVATE_applyTransformOperationToLocalView(e, s, t));\n }\n return r;\n}\n\n/** A mutation that deletes the document at the given key. */ class __PRIVATE_DeleteMutation extends Mutation {\n constructor(e, t) {\n super(), this.key = e, this.precondition = t, this.type = 2 /* MutationType.Delete */ , \n this.fieldTransforms = [];\n }\n getFieldMask() {\n return null;\n }\n}\n\nclass __PRIVATE_VerifyMutation extends Mutation {\n constructor(e, t) {\n super(), this.key = e, this.precondition = t, this.type = 3 /* MutationType.Verify */ , \n this.fieldTransforms = [];\n }\n getFieldMask() {\n return null;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A batch of mutations that will be sent as one unit to the backend.\n */ class MutationBatch {\n /**\n * @param batchId - The unique ID of this mutation batch.\n * @param localWriteTime - The original write time of this mutation.\n * @param baseMutations - Mutations that are used to populate the base\n * values when this mutation is applied locally. This can be used to locally\n * overwrite values that are persisted in the remote document cache. Base\n * mutations are never sent to the backend.\n * @param mutations - The user-provided mutations in this mutation batch.\n * User-provided mutations are applied both locally and remotely on the\n * backend.\n */\n constructor(e, t, n, r) {\n this.batchId = e, this.localWriteTime = t, this.baseMutations = n, this.mutations = r;\n }\n /**\n * Applies all the mutations in this MutationBatch to the specified document\n * to compute the state of the remote document\n *\n * @param document - The document to apply mutations to.\n * @param batchResult - The result of applying the MutationBatch to the\n * backend.\n */ applyToRemoteDocument(e, t) {\n const n = t.mutationResults;\n for (let t = 0; t < this.mutations.length; t++) {\n const r = this.mutations[t];\n if (r.key.isEqual(e.key)) {\n __PRIVATE_mutationApplyToRemoteDocument(r, e, n[t]);\n }\n }\n }\n /**\n * Computes the local view of a document given all the mutations in this\n * batch.\n *\n * @param document - The document to apply mutations to.\n * @param mutatedFields - Fields that have been updated before applying this mutation batch.\n * @returns A `FieldMask` representing all the fields that are mutated.\n */ applyToLocalView(e, t) {\n // First, apply the base state. This allows us to apply non-idempotent\n // transform against a consistent set of values.\n for (const n of this.baseMutations) n.key.isEqual(e.key) && (t = __PRIVATE_mutationApplyToLocalView(n, e, t, this.localWriteTime));\n // Second, apply all user-provided mutations.\n for (const n of this.mutations) n.key.isEqual(e.key) && (t = __PRIVATE_mutationApplyToLocalView(n, e, t, this.localWriteTime));\n return t;\n }\n /**\n * Computes the local view for all provided documents given the mutations in\n * this batch. Returns a `DocumentKey` to `Mutation` map which can be used to\n * replace all the mutation applications.\n */ applyToLocalDocumentSet(e, t) {\n // TODO(mrschmidt): This implementation is O(n^2). If we apply the mutations\n // directly (as done in `applyToLocalView()`), we can reduce the complexity\n // to O(n).\n const n = __PRIVATE_newMutationMap();\n return this.mutations.forEach((r => {\n const i = e.get(r.key), s = i.overlayedDocument;\n // TODO(mutabledocuments): This method should take a MutableDocumentMap\n // and we should remove this cast.\n let o = this.applyToLocalView(s, i.mutatedFields);\n // Set mutatedFields to null if the document is only from local mutations.\n // This creates a Set or Delete mutation, instead of trying to create a\n // patch mutation as the overlay.\n o = t.has(r.key) ? null : o;\n const _ = __PRIVATE_calculateOverlayMutation(s, o);\n null !== _ && n.set(r.key, _), s.isValidDocument() || s.convertToNoDocument(SnapshotVersion.min());\n })), n;\n }\n keys() {\n return this.mutations.reduce(((e, t) => e.add(t.key)), __PRIVATE_documentKeySet());\n }\n isEqual(e) {\n return this.batchId === e.batchId && __PRIVATE_arrayEquals(this.mutations, e.mutations, ((e, t) => __PRIVATE_mutationEquals(e, t))) && __PRIVATE_arrayEquals(this.baseMutations, e.baseMutations, ((e, t) => __PRIVATE_mutationEquals(e, t)));\n }\n}\n\n/** The result of applying a mutation batch to the backend. */ class MutationBatchResult {\n constructor(e, t, n, \n /**\n * A pre-computed mapping from each mutated document to the resulting\n * version.\n */\n r) {\n this.batch = e, this.commitVersion = t, this.mutationResults = n, this.docVersions = r;\n }\n /**\n * Creates a new MutationBatchResult for the given batch and results. There\n * must be one result for each mutation in the batch. This static factory\n * caches a document=>version mapping (docVersions).\n */ static from(e, t, n) {\n __PRIVATE_hardAssert(e.mutations.length === n.length);\n let r = function __PRIVATE_documentVersionMap() {\n return ae;\n }();\n const i = e.mutations;\n for (let e = 0; e < i.length; e++) r = r.insert(i[e].key, n[e].version);\n return new MutationBatchResult(e, t, n, r);\n }\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Representation of an overlay computed by Firestore.\n *\n * Holds information about a mutation and the largest batch id in Firestore when\n * the mutation was created.\n */ class Overlay {\n constructor(e, t) {\n this.largestBatchId = e, this.mutation = t;\n }\n getKey() {\n return this.mutation.key;\n }\n isEqual(e) {\n return null !== e && this.mutation === e.mutation;\n }\n toString() {\n return `Overlay{\\n largestBatchId: ${this.largestBatchId},\\n mutation: ${this.mutation.toString()}\\n }`;\n }\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Concrete implementation of the Aggregate type.\n */ class __PRIVATE_AggregateImpl {\n constructor(e, t, n) {\n this.alias = e, this.aggregateType = t, this.fieldPath = n;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class ExistenceFilter {\n constructor(e, t) {\n this.count = e, this.unchangedNames = t;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Error Codes describing the different ways GRPC can fail. These are copied\n * directly from GRPC's sources here:\n *\n * https://github.com/grpc/grpc/blob/bceec94ea4fc5f0085d81235d8e1c06798dc341a/include/grpc%2B%2B/impl/codegen/status_code_enum.h\n *\n * Important! The names of these identifiers matter because the string forms\n * are used for reverse lookups from the webchannel stream. Do NOT change the\n * names of these identifiers or change this into a const enum.\n */ var le, he;\n\n/**\n * Determines whether an error code represents a permanent error when received\n * in response to a non-write operation.\n *\n * See isPermanentWriteError for classifying write errors.\n */\nfunction __PRIVATE_isPermanentError(e) {\n switch (e) {\n default:\n return fail();\n\n case D.CANCELLED:\n case D.UNKNOWN:\n case D.DEADLINE_EXCEEDED:\n case D.RESOURCE_EXHAUSTED:\n case D.INTERNAL:\n case D.UNAVAILABLE:\n // Unauthenticated means something went wrong with our token and we need\n // to retry with new credentials which will happen automatically.\n case D.UNAUTHENTICATED:\n return !1;\n\n case D.INVALID_ARGUMENT:\n case D.NOT_FOUND:\n case D.ALREADY_EXISTS:\n case D.PERMISSION_DENIED:\n case D.FAILED_PRECONDITION:\n // Aborted might be retried in some scenarios, but that is dependent on\n // the context and should handled individually by the calling code.\n // See https://cloud.google.com/apis/design/errors.\n case D.ABORTED:\n case D.OUT_OF_RANGE:\n case D.UNIMPLEMENTED:\n case D.DATA_LOSS:\n return !0;\n }\n}\n\n/**\n * Determines whether an error code represents a permanent error when received\n * in response to a write operation.\n *\n * Write operations must be handled specially because as of b/119437764, ABORTED\n * errors on the write stream should be retried too (even though ABORTED errors\n * are not generally retryable).\n *\n * Note that during the initial handshake on the write stream an ABORTED error\n * signals that we should discard our stream token (i.e. it is permanent). This\n * means a handshake error should be classified with isPermanentError, above.\n */\n/**\n * Maps an error Code from GRPC status code number, like 0, 1, or 14. These\n * are not the same as HTTP status codes.\n *\n * @returns The Code equivalent to the given GRPC status code. Fails if there\n * is no match.\n */\nfunction __PRIVATE_mapCodeFromRpcCode(e) {\n if (void 0 === e) \n // This shouldn't normally happen, but in certain error cases (like trying\n // to send invalid proto messages) we may get an error with no GRPC code.\n return __PRIVATE_logError(\"GRPC error has no .code\"), D.UNKNOWN;\n switch (e) {\n case le.OK:\n return D.OK;\n\n case le.CANCELLED:\n return D.CANCELLED;\n\n case le.UNKNOWN:\n return D.UNKNOWN;\n\n case le.DEADLINE_EXCEEDED:\n return D.DEADLINE_EXCEEDED;\n\n case le.RESOURCE_EXHAUSTED:\n return D.RESOURCE_EXHAUSTED;\n\n case le.INTERNAL:\n return D.INTERNAL;\n\n case le.UNAVAILABLE:\n return D.UNAVAILABLE;\n\n case le.UNAUTHENTICATED:\n return D.UNAUTHENTICATED;\n\n case le.INVALID_ARGUMENT:\n return D.INVALID_ARGUMENT;\n\n case le.NOT_FOUND:\n return D.NOT_FOUND;\n\n case le.ALREADY_EXISTS:\n return D.ALREADY_EXISTS;\n\n case le.PERMISSION_DENIED:\n return D.PERMISSION_DENIED;\n\n case le.FAILED_PRECONDITION:\n return D.FAILED_PRECONDITION;\n\n case le.ABORTED:\n return D.ABORTED;\n\n case le.OUT_OF_RANGE:\n return D.OUT_OF_RANGE;\n\n case le.UNIMPLEMENTED:\n return D.UNIMPLEMENTED;\n\n case le.DATA_LOSS:\n return D.DATA_LOSS;\n\n default:\n return fail();\n }\n}\n\n/**\n * Converts an HTTP response's error status to the equivalent error code.\n *\n * @param status - An HTTP error response status (\"FAILED_PRECONDITION\",\n * \"UNKNOWN\", etc.)\n * @returns The equivalent Code. Non-matching responses are mapped to\n * Code.UNKNOWN.\n */ (he = le || (le = {}))[he.OK = 0] = \"OK\", he[he.CANCELLED = 1] = \"CANCELLED\", \nhe[he.UNKNOWN = 2] = \"UNKNOWN\", he[he.INVALID_ARGUMENT = 3] = \"INVALID_ARGUMENT\", \nhe[he.DEADLINE_EXCEEDED = 4] = \"DEADLINE_EXCEEDED\", he[he.NOT_FOUND = 5] = \"NOT_FOUND\", \nhe[he.ALREADY_EXISTS = 6] = \"ALREADY_EXISTS\", he[he.PERMISSION_DENIED = 7] = \"PERMISSION_DENIED\", \nhe[he.UNAUTHENTICATED = 16] = \"UNAUTHENTICATED\", he[he.RESOURCE_EXHAUSTED = 8] = \"RESOURCE_EXHAUSTED\", \nhe[he.FAILED_PRECONDITION = 9] = \"FAILED_PRECONDITION\", he[he.ABORTED = 10] = \"ABORTED\", \nhe[he.OUT_OF_RANGE = 11] = \"OUT_OF_RANGE\", he[he.UNIMPLEMENTED = 12] = \"UNIMPLEMENTED\", \nhe[he.INTERNAL = 13] = \"INTERNAL\", he[he.UNAVAILABLE = 14] = \"UNAVAILABLE\", he[he.DATA_LOSS = 15] = \"DATA_LOSS\";\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The global, singleton instance of TestingHooksSpi.\n *\n * This variable will be `null` in all cases _except_ when running from\n * integration tests that have registered callbacks to be notified of events\n * that happen during the test execution.\n */\nlet Pe = null;\n\n/**\n * Sets the value of the `testingHooksSpi` object.\n * @param instance the instance to set.\n */\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An instance of the Platform's 'TextEncoder' implementation.\n */\nfunction __PRIVATE_newTextEncoder() {\n return new TextEncoder;\n}\n\n/**\n * An instance of the Platform's 'TextDecoder' implementation.\n */\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst Ie = new Integer([ 4294967295, 4294967295 ], 0);\n\n// Hash a string using md5 hashing algorithm.\nfunction __PRIVATE_getMd5HashValue(e) {\n const t = __PRIVATE_newTextEncoder().encode(e), n = new Md5;\n return n.update(t), new Uint8Array(n.digest());\n}\n\n// Interpret the 16 bytes array as two 64-bit unsigned integers, encoded using\n// 2’s complement using little endian.\nfunction __PRIVATE_get64BitUints(e) {\n const t = new DataView(e.buffer), n = t.getUint32(0, /* littleEndian= */ !0), r = t.getUint32(4, /* littleEndian= */ !0), i = t.getUint32(8, /* littleEndian= */ !0), s = t.getUint32(12, /* littleEndian= */ !0);\n return [ new Integer([ n, r ], 0), new Integer([ i, s ], 0) ];\n}\n\nclass BloomFilter {\n constructor(e, t, n) {\n if (this.bitmap = e, this.padding = t, this.hashCount = n, t < 0 || t >= 8) throw new __PRIVATE_BloomFilterError(`Invalid padding: ${t}`);\n if (n < 0) throw new __PRIVATE_BloomFilterError(`Invalid hash count: ${n}`);\n if (e.length > 0 && 0 === this.hashCount) \n // Only empty bloom filter can have 0 hash count.\n throw new __PRIVATE_BloomFilterError(`Invalid hash count: ${n}`);\n if (0 === e.length && 0 !== t) \n // Empty bloom filter should have 0 padding.\n throw new __PRIVATE_BloomFilterError(`Invalid padding when bitmap length is 0: ${t}`);\n this.Ie = 8 * e.length - t, \n // Set the bit count in Integer to avoid repetition in mightContain().\n this.Te = Integer.fromNumber(this.Ie);\n }\n // Calculate the ith hash value based on the hashed 64bit integers,\n // and calculate its corresponding bit index in the bitmap to be checked.\n Ee(e, t, n) {\n // Calculate hashed value h(i) = h1 + (i * h2).\n let r = e.add(t.multiply(Integer.fromNumber(n)));\n // Wrap if hash value overflow 64bit.\n return 1 === r.compare(Ie) && (r = new Integer([ r.getBits(0), r.getBits(1) ], 0)), \n r.modulo(this.Te).toNumber();\n }\n // Return whether the bit on the given index in the bitmap is set to 1.\n de(e) {\n return 0 != (this.bitmap[Math.floor(e / 8)] & 1 << e % 8);\n }\n mightContain(e) {\n // Empty bitmap should always return false on membership check.\n if (0 === this.Ie) return !1;\n const t = __PRIVATE_getMd5HashValue(e), [n, r] = __PRIVATE_get64BitUints(t);\n for (let e = 0; e < this.hashCount; e++) {\n const t = this.Ee(n, r, e);\n if (!this.de(t)) return !1;\n }\n return !0;\n }\n /** Create bloom filter for testing purposes only. */ static create(e, t, n) {\n const r = e % 8 == 0 ? 0 : 8 - e % 8, i = new Uint8Array(Math.ceil(e / 8)), s = new BloomFilter(i, r, t);\n return n.forEach((e => s.insert(e))), s;\n }\n insert(e) {\n if (0 === this.Ie) return;\n const t = __PRIVATE_getMd5HashValue(e), [n, r] = __PRIVATE_get64BitUints(t);\n for (let e = 0; e < this.hashCount; e++) {\n const t = this.Ee(n, r, e);\n this.Ae(t);\n }\n }\n Ae(e) {\n const t = Math.floor(e / 8), n = e % 8;\n this.bitmap[t] |= 1 << n;\n }\n}\n\nclass __PRIVATE_BloomFilterError extends Error {\n constructor() {\n super(...arguments), this.name = \"BloomFilterError\";\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An event from the RemoteStore. It is split into targetChanges (changes to the\n * state or the set of documents in our watched targets) and documentUpdates\n * (changes to the actual documents).\n */ class RemoteEvent {\n constructor(\n /**\n * The snapshot version this event brings us up to, or MIN if not set.\n */\n e, \n /**\n * A map from target to changes to the target. See TargetChange.\n */\n t, \n /**\n * A map of targets that is known to be inconsistent, and the purpose for\n * re-listening. Listens for these targets should be re-established without\n * resume tokens.\n */\n n, \n /**\n * A set of which documents have changed or been deleted, along with the\n * doc's new values (if not deleted).\n */\n r, \n /**\n * A set of which document updates are due only to limbo resolution targets.\n */\n i) {\n this.snapshotVersion = e, this.targetChanges = t, this.targetMismatches = n, this.documentUpdates = r, \n this.resolvedLimboDocuments = i;\n }\n /**\n * HACK: Views require RemoteEvents in order to determine whether the view is\n * CURRENT, but secondary tabs don't receive remote events. So this method is\n * used to create a synthesized RemoteEvent that can be used to apply a\n * CURRENT status change to a View, for queries executed in a different tab.\n */\n // PORTING NOTE: Multi-tab only\n static createSynthesizedRemoteEventForCurrentChange(e, t, n) {\n const r = new Map;\n return r.set(e, TargetChange.createSynthesizedTargetChangeForCurrentChange(e, t, n)), \n new RemoteEvent(SnapshotVersion.min(), r, new SortedMap(__PRIVATE_primitiveComparator), __PRIVATE_mutableDocumentMap(), __PRIVATE_documentKeySet());\n }\n}\n\n/**\n * A TargetChange specifies the set of changes for a specific target as part of\n * a RemoteEvent. These changes track which documents are added, modified or\n * removed, as well as the target's resume token and whether the target is\n * marked CURRENT.\n * The actual changes *to* documents are not part of the TargetChange since\n * documents may be part of multiple targets.\n */ class TargetChange {\n constructor(\n /**\n * An opaque, server-assigned token that allows watching a query to be resumed\n * after disconnecting without retransmitting all the data that matches the\n * query. The resume token essentially identifies a point in time from which\n * the server should resume sending results.\n */\n e, \n /**\n * The \"current\" (synced) status of this target. Note that \"current\"\n * has special meaning in the RPC protocol that implies that a target is\n * both up-to-date and consistent with the rest of the watch stream.\n */\n t, \n /**\n * The set of documents that were newly assigned to this target as part of\n * this remote event.\n */\n n, \n /**\n * The set of documents that were already assigned to this target but received\n * an update during this remote event.\n */\n r, \n /**\n * The set of documents that were removed from this target as part of this\n * remote event.\n */\n i) {\n this.resumeToken = e, this.current = t, this.addedDocuments = n, this.modifiedDocuments = r, \n this.removedDocuments = i;\n }\n /**\n * This method is used to create a synthesized TargetChanges that can be used to\n * apply a CURRENT status change to a View (for queries executed in a different\n * tab) or for new queries (to raise snapshots with correct CURRENT status).\n */ static createSynthesizedTargetChangeForCurrentChange(e, t, n) {\n return new TargetChange(n, t, __PRIVATE_documentKeySet(), __PRIVATE_documentKeySet(), __PRIVATE_documentKeySet());\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents a changed document and a list of target ids to which this change\n * applies.\n *\n * If document has been deleted NoDocument will be provided.\n */ class __PRIVATE_DocumentWatchChange {\n constructor(\n /** The new document applies to all of these targets. */\n e, \n /** The new document is removed from all of these targets. */\n t, \n /** The key of the document for this change. */\n n, \n /**\n * The new document or NoDocument if it was deleted. Is null if the\n * document went out of view without the server sending a new document.\n */\n r) {\n this.Re = e, this.removedTargetIds = t, this.key = n, this.Ve = r;\n }\n}\n\nclass __PRIVATE_ExistenceFilterChange {\n constructor(e, t) {\n this.targetId = e, this.me = t;\n }\n}\n\nclass __PRIVATE_WatchTargetChange {\n constructor(\n /** What kind of change occurred to the watch target. */\n e, \n /** The target IDs that were added/removed/set. */\n t, \n /**\n * An opaque, server-assigned token that allows watching a target to be\n * resumed after disconnecting without retransmitting all the data that\n * matches the target. The resume token essentially identifies a point in\n * time from which the server should resume sending results.\n */\n n = ByteString.EMPTY_BYTE_STRING\n /** An RPC error indicating why the watch failed. */ , r = null) {\n this.state = e, this.targetIds = t, this.resumeToken = n, this.cause = r;\n }\n}\n\n/** Tracks the internal state of a Watch target. */ class __PRIVATE_TargetState {\n constructor() {\n /**\n * The number of pending responses (adds or removes) that we are waiting on.\n * We only consider targets active that have no pending responses.\n */\n this.fe = 0, \n /**\n * Keeps track of the document changes since the last raised snapshot.\n *\n * These changes are continuously updated as we receive document updates and\n * always reflect the current set of changes against the last issued snapshot.\n */\n this.ge = __PRIVATE_snapshotChangesMap(), \n /** See public getters for explanations of these fields. */\n this.pe = ByteString.EMPTY_BYTE_STRING, this.ye = !1, \n /**\n * Whether this target state should be included in the next snapshot. We\n * initialize to true so that newly-added targets are included in the next\n * RemoteEvent.\n */\n this.we = !0;\n }\n /**\n * Whether this target has been marked 'current'.\n *\n * 'Current' has special meaning in the RPC protocol: It implies that the\n * Watch backend has sent us all changes up to the point at which the target\n * was added and that the target is consistent with the rest of the watch\n * stream.\n */ get current() {\n return this.ye;\n }\n /** The last resume token sent to us for this target. */ get resumeToken() {\n return this.pe;\n }\n /** Whether this target has pending target adds or target removes. */ get Se() {\n return 0 !== this.fe;\n }\n /** Whether we have modified any state that should trigger a snapshot. */ get be() {\n return this.we;\n }\n /**\n * Applies the resume token to the TargetChange, but only when it has a new\n * value. Empty resumeTokens are discarded.\n */ De(e) {\n e.approximateByteSize() > 0 && (this.we = !0, this.pe = e);\n }\n /**\n * Creates a target change from the current set of changes.\n *\n * To reset the document changes after raising this snapshot, call\n * `clearPendingChanges()`.\n */ ve() {\n let e = __PRIVATE_documentKeySet(), t = __PRIVATE_documentKeySet(), n = __PRIVATE_documentKeySet();\n return this.ge.forEach(((r, i) => {\n switch (i) {\n case 0 /* ChangeType.Added */ :\n e = e.add(r);\n break;\n\n case 2 /* ChangeType.Modified */ :\n t = t.add(r);\n break;\n\n case 1 /* ChangeType.Removed */ :\n n = n.add(r);\n break;\n\n default:\n fail();\n }\n })), new TargetChange(this.pe, this.ye, e, t, n);\n }\n /**\n * Resets the document changes and sets `hasPendingChanges` to false.\n */ Ce() {\n this.we = !1, this.ge = __PRIVATE_snapshotChangesMap();\n }\n Fe(e, t) {\n this.we = !0, this.ge = this.ge.insert(e, t);\n }\n Me(e) {\n this.we = !0, this.ge = this.ge.remove(e);\n }\n xe() {\n this.fe += 1;\n }\n Oe() {\n this.fe -= 1, __PRIVATE_hardAssert(this.fe >= 0);\n }\n Ne() {\n this.we = !0, this.ye = !0;\n }\n}\n\n/**\n * A helper class to accumulate watch changes into a RemoteEvent.\n */\nclass __PRIVATE_WatchChangeAggregator {\n constructor(e) {\n this.Le = e, \n /** The internal state of all tracked targets. */\n this.Be = new Map, \n /** Keeps track of the documents to update since the last raised snapshot. */\n this.ke = __PRIVATE_mutableDocumentMap(), \n /** A mapping of document keys to their set of target IDs. */\n this.qe = __PRIVATE_documentTargetMap(), \n /**\n * A map of targets with existence filter mismatches. These targets are\n * known to be inconsistent and their listens needs to be re-established by\n * RemoteStore.\n */\n this.Qe = new SortedMap(__PRIVATE_primitiveComparator);\n }\n /**\n * Processes and adds the DocumentWatchChange to the current set of changes.\n */ Ke(e) {\n for (const t of e.Re) e.Ve && e.Ve.isFoundDocument() ? this.$e(t, e.Ve) : this.Ue(t, e.key, e.Ve);\n for (const t of e.removedTargetIds) this.Ue(t, e.key, e.Ve);\n }\n /** Processes and adds the WatchTargetChange to the current set of changes. */ We(e) {\n this.forEachTarget(e, (t => {\n const n = this.Ge(t);\n switch (e.state) {\n case 0 /* WatchTargetChangeState.NoChange */ :\n this.ze(t) && n.De(e.resumeToken);\n break;\n\n case 1 /* WatchTargetChangeState.Added */ :\n // We need to decrement the number of pending acks needed from watch\n // for this targetId.\n n.Oe(), n.Se || \n // We have a freshly added target, so we need to reset any state\n // that we had previously. This can happen e.g. when remove and add\n // back a target for existence filter mismatches.\n n.Ce(), n.De(e.resumeToken);\n break;\n\n case 2 /* WatchTargetChangeState.Removed */ :\n // We need to keep track of removed targets to we can post-filter and\n // remove any target changes.\n // We need to decrement the number of pending acks needed from watch\n // for this targetId.\n n.Oe(), n.Se || this.removeTarget(t);\n break;\n\n case 3 /* WatchTargetChangeState.Current */ :\n this.ze(t) && (n.Ne(), n.De(e.resumeToken));\n break;\n\n case 4 /* WatchTargetChangeState.Reset */ :\n this.ze(t) && (\n // Reset the target and synthesizes removes for all existing\n // documents. The backend will re-add any documents that still\n // match the target before it sends the next global snapshot.\n this.je(t), n.De(e.resumeToken));\n break;\n\n default:\n fail();\n }\n }));\n }\n /**\n * Iterates over all targetIds that the watch change applies to: either the\n * targetIds explicitly listed in the change or the targetIds of all currently\n * active targets.\n */ forEachTarget(e, t) {\n e.targetIds.length > 0 ? e.targetIds.forEach(t) : this.Be.forEach(((e, n) => {\n this.ze(n) && t(n);\n }));\n }\n /**\n * Handles existence filters and synthesizes deletes for filter mismatches.\n * Targets that are invalidated by filter mismatches are added to\n * `pendingTargetResets`.\n */ He(e) {\n const t = e.targetId, n = e.me.count, r = this.Je(t);\n if (r) {\n const i = r.target;\n if (__PRIVATE_targetIsDocumentTarget(i)) if (0 === n) {\n // The existence filter told us the document does not exist. We deduce\n // that this document does not exist and apply a deleted document to\n // our updates. Without applying this deleted document there might be\n // another query that will raise this document as part of a snapshot\n // until it is resolved, essentially exposing inconsistency between\n // queries.\n const e = new DocumentKey(i.path);\n this.Ue(t, e, MutableDocument.newNoDocument(e, SnapshotVersion.min()));\n } else __PRIVATE_hardAssert(1 === n); else {\n const r = this.Ye(t);\n // Existence filter mismatch. Mark the documents as being in limbo, and\n // raise a snapshot with `isFromCache:true`.\n if (r !== n) {\n // Apply bloom filter to identify and mark removed documents.\n const n = this.Ze(e), i = n ? this.Xe(n, e, r) : 1 /* BloomFilterApplicationStatus.Skipped */;\n if (0 /* BloomFilterApplicationStatus.Success */ !== i) {\n // If bloom filter application fails, we reset the mapping and\n // trigger re-run of the query.\n this.je(t);\n const e = 2 /* BloomFilterApplicationStatus.FalsePositive */ === i ? \"TargetPurposeExistenceFilterMismatchBloom\" /* TargetPurpose.ExistenceFilterMismatchBloom */ : \"TargetPurposeExistenceFilterMismatch\" /* TargetPurpose.ExistenceFilterMismatch */;\n this.Qe = this.Qe.insert(t, e);\n }\n null == Pe || Pe.et(function __PRIVATE_createExistenceFilterMismatchInfoForTestingHooks(e, t, n, r, i) {\n var s, o, _, a, u, c;\n const l = {\n localCacheCount: e,\n existenceFilterCount: t.count,\n databaseId: n.database,\n projectId: n.projectId\n }, h = t.unchangedNames;\n h && (l.bloomFilter = {\n applied: 0 /* BloomFilterApplicationStatus.Success */ === i,\n hashCount: null !== (s = null == h ? void 0 : h.hashCount) && void 0 !== s ? s : 0,\n bitmapLength: null !== (a = null === (_ = null === (o = null == h ? void 0 : h.bits) || void 0 === o ? void 0 : o.bitmap) || void 0 === _ ? void 0 : _.length) && void 0 !== a ? a : 0,\n padding: null !== (c = null === (u = null == h ? void 0 : h.bits) || void 0 === u ? void 0 : u.padding) && void 0 !== c ? c : 0,\n mightContain: e => {\n var t;\n return null !== (t = null == r ? void 0 : r.mightContain(e)) && void 0 !== t && t;\n }\n });\n return l;\n }\n /**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ (r, e.me, this.Le.tt(), n, i));\n }\n }\n }\n }\n /**\n * Parse the bloom filter from the \"unchanged_names\" field of an existence\n * filter.\n */ Ze(e) {\n const t = e.me.unchangedNames;\n if (!t || !t.bits) return null;\n const {bits: {bitmap: n = \"\", padding: r = 0}, hashCount: i = 0} = t;\n let s, o;\n try {\n s = __PRIVATE_normalizeByteString(n).toUint8Array();\n } catch (e) {\n if (e instanceof __PRIVATE_Base64DecodeError) return __PRIVATE_logWarn(\"Decoding the base64 bloom filter in existence filter failed (\" + e.message + \"); ignoring the bloom filter and falling back to full re-query.\"), \n null;\n throw e;\n }\n try {\n // BloomFilter throws error if the inputs are invalid.\n o = new BloomFilter(s, r, i);\n } catch (e) {\n return __PRIVATE_logWarn(e instanceof __PRIVATE_BloomFilterError ? \"BloomFilter error: \" : \"Applying bloom filter failed: \", e), \n null;\n }\n return 0 === o.Ie ? null : o;\n }\n /**\n * Apply bloom filter to remove the deleted documents, and return the\n * application status.\n */ Xe(e, t, n) {\n return t.me.count === n - this.nt(e, t.targetId) ? 0 /* BloomFilterApplicationStatus.Success */ : 2 /* BloomFilterApplicationStatus.FalsePositive */;\n }\n /**\n * Filter out removed documents based on bloom filter membership result and\n * return number of documents removed.\n */ nt(e, t) {\n const n = this.Le.getRemoteKeysForTarget(t);\n let r = 0;\n return n.forEach((n => {\n const i = this.Le.tt(), s = `projects/${i.projectId}/databases/${i.database}/documents/${n.path.canonicalString()}`;\n e.mightContain(s) || (this.Ue(t, n, /*updatedDocument=*/ null), r++);\n })), r;\n }\n /**\n * Converts the currently accumulated state into a remote event at the\n * provided snapshot version. Resets the accumulated changes before returning.\n */ rt(e) {\n const t = new Map;\n this.Be.forEach(((n, r) => {\n const i = this.Je(r);\n if (i) {\n if (n.current && __PRIVATE_targetIsDocumentTarget(i.target)) {\n // Document queries for document that don't exist can produce an empty\n // result set. To update our local cache, we synthesize a document\n // delete if we have not previously received the document. This\n // resolves the limbo state of the document, removing it from\n // limboDocumentRefs.\n // TODO(dimond): Ideally we would have an explicit lookup target\n // instead resulting in an explicit delete message and we could\n // remove this special logic.\n const t = new DocumentKey(i.target.path);\n null !== this.ke.get(t) || this.it(r, t) || this.Ue(r, t, MutableDocument.newNoDocument(t, e));\n }\n n.be && (t.set(r, n.ve()), n.Ce());\n }\n }));\n let n = __PRIVATE_documentKeySet();\n // We extract the set of limbo-only document updates as the GC logic\n // special-cases documents that do not appear in the target cache.\n \n // TODO(gsoltis): Expand on this comment once GC is available in the JS\n // client.\n this.qe.forEach(((e, t) => {\n let r = !0;\n t.forEachWhile((e => {\n const t = this.Je(e);\n return !t || \"TargetPurposeLimboResolution\" /* TargetPurpose.LimboResolution */ === t.purpose || (r = !1, \n !1);\n })), r && (n = n.add(e));\n })), this.ke.forEach(((t, n) => n.setReadTime(e)));\n const r = new RemoteEvent(e, t, this.Qe, this.ke, n);\n return this.ke = __PRIVATE_mutableDocumentMap(), this.qe = __PRIVATE_documentTargetMap(), \n this.Qe = new SortedMap(__PRIVATE_primitiveComparator), r;\n }\n /**\n * Adds the provided document to the internal list of document updates and\n * its document key to the given target's mapping.\n */\n // Visible for testing.\n $e(e, t) {\n if (!this.ze(e)) return;\n const n = this.it(e, t.key) ? 2 /* ChangeType.Modified */ : 0 /* ChangeType.Added */;\n this.Ge(e).Fe(t.key, n), this.ke = this.ke.insert(t.key, t), this.qe = this.qe.insert(t.key, this.st(t.key).add(e));\n }\n /**\n * Removes the provided document from the target mapping. If the\n * document no longer matches the target, but the document's state is still\n * known (e.g. we know that the document was deleted or we received the change\n * that caused the filter mismatch), the new document can be provided\n * to update the remote document cache.\n */\n // Visible for testing.\n Ue(e, t, n) {\n if (!this.ze(e)) return;\n const r = this.Ge(e);\n this.it(e, t) ? r.Fe(t, 1 /* ChangeType.Removed */) : \n // The document may have entered and left the target before we raised a\n // snapshot, so we can just ignore the change.\n r.Me(t), this.qe = this.qe.insert(t, this.st(t).delete(e)), n && (this.ke = this.ke.insert(t, n));\n }\n removeTarget(e) {\n this.Be.delete(e);\n }\n /**\n * Returns the current count of documents in the target. This includes both\n * the number of documents that the LocalStore considers to be part of the\n * target as well as any accumulated changes.\n */ Ye(e) {\n const t = this.Ge(e).ve();\n return this.Le.getRemoteKeysForTarget(e).size + t.addedDocuments.size - t.removedDocuments.size;\n }\n /**\n * Increment the number of acks needed from watch before we can consider the\n * server to be 'in-sync' with the client's active targets.\n */ xe(e) {\n this.Ge(e).xe();\n }\n Ge(e) {\n let t = this.Be.get(e);\n return t || (t = new __PRIVATE_TargetState, this.Be.set(e, t)), t;\n }\n st(e) {\n let t = this.qe.get(e);\n return t || (t = new SortedSet(__PRIVATE_primitiveComparator), this.qe = this.qe.insert(e, t)), \n t;\n }\n /**\n * Verifies that the user is still interested in this target (by calling\n * `getTargetDataForTarget()`) and that we are not waiting for pending ADDs\n * from watch.\n */ ze(e) {\n const t = null !== this.Je(e);\n return t || __PRIVATE_logDebug(\"WatchChangeAggregator\", \"Detected inactive target\", e), \n t;\n }\n /**\n * Returns the TargetData for an active target (i.e. a target that the user\n * is still interested in that has no outstanding target change requests).\n */ Je(e) {\n const t = this.Be.get(e);\n return t && t.Se ? null : this.Le.ot(e);\n }\n /**\n * Resets the state of a Watch target to its initial state (e.g. sets\n * 'current' to false, clears the resume token and removes its target mapping\n * from all documents).\n */ je(e) {\n this.Be.set(e, new __PRIVATE_TargetState);\n this.Le.getRemoteKeysForTarget(e).forEach((t => {\n this.Ue(e, t, /*updatedDocument=*/ null);\n }));\n }\n /**\n * Returns whether the LocalStore considers the document to be part of the\n * specified target.\n */ it(e, t) {\n return this.Le.getRemoteKeysForTarget(e).has(t);\n }\n}\n\nfunction __PRIVATE_documentTargetMap() {\n return new SortedMap(DocumentKey.comparator);\n}\n\nfunction __PRIVATE_snapshotChangesMap() {\n return new SortedMap(DocumentKey.comparator);\n}\n\nconst Te = (() => {\n const e = {\n asc: \"ASCENDING\",\n desc: \"DESCENDING\"\n };\n return e;\n})(), Ee = (() => {\n const e = {\n \"<\": \"LESS_THAN\",\n \"<=\": \"LESS_THAN_OR_EQUAL\",\n \">\": \"GREATER_THAN\",\n \">=\": \"GREATER_THAN_OR_EQUAL\",\n \"==\": \"EQUAL\",\n \"!=\": \"NOT_EQUAL\",\n \"array-contains\": \"ARRAY_CONTAINS\",\n in: \"IN\",\n \"not-in\": \"NOT_IN\",\n \"array-contains-any\": \"ARRAY_CONTAINS_ANY\"\n };\n return e;\n})(), de = (() => {\n const e = {\n and: \"AND\",\n or: \"OR\"\n };\n return e;\n})();\n\n/**\n * This class generates JsonObject values for the Datastore API suitable for\n * sending to either GRPC stub methods or via the JSON/HTTP REST API.\n *\n * The serializer supports both Protobuf.js and Proto3 JSON formats. By\n * setting `useProto3Json` to true, the serializer will use the Proto3 JSON\n * format.\n *\n * For a description of the Proto3 JSON format check\n * https://developers.google.com/protocol-buffers/docs/proto3#json\n *\n * TODO(klimt): We can remove the databaseId argument if we keep the full\n * resource name in documents.\n */\nclass JsonProtoSerializer {\n constructor(e, t) {\n this.databaseId = e, this.useProto3Json = t;\n }\n}\n\n/**\n * Returns a value for a number (or null) that's appropriate to put into\n * a google.protobuf.Int32Value proto.\n * DO NOT USE THIS FOR ANYTHING ELSE.\n * This method cheats. It's typed as returning \"number\" because that's what\n * our generated proto interfaces say Int32Value must be. But GRPC actually\n * expects a { value: } struct.\n */\nfunction __PRIVATE_toInt32Proto(e, t) {\n return e.useProto3Json || __PRIVATE_isNullOrUndefined(t) ? t : {\n value: t\n };\n}\n\n/**\n * Returns a number (or null) from a google.protobuf.Int32Value proto.\n */\n/**\n * Returns a value for a Date that's appropriate to put into a proto.\n */\nfunction toTimestamp(e, t) {\n if (e.useProto3Json) {\n return `${new Date(1e3 * t.seconds).toISOString().replace(/\\.\\d*/, \"\").replace(\"Z\", \"\")}.${(\"000000000\" + t.nanoseconds).slice(-9)}Z`;\n }\n return {\n seconds: \"\" + t.seconds,\n nanos: t.nanoseconds\n };\n}\n\n/**\n * Returns a value for bytes that's appropriate to put in a proto.\n *\n * Visible for testing.\n */\nfunction __PRIVATE_toBytes(e, t) {\n return e.useProto3Json ? t.toBase64() : t.toUint8Array();\n}\n\n/**\n * Returns a ByteString based on the proto string value.\n */ function __PRIVATE_toVersion(e, t) {\n return toTimestamp(e, t.toTimestamp());\n}\n\nfunction __PRIVATE_fromVersion(e) {\n return __PRIVATE_hardAssert(!!e), SnapshotVersion.fromTimestamp(function fromTimestamp(e) {\n const t = __PRIVATE_normalizeTimestamp(e);\n return new Timestamp(t.seconds, t.nanos);\n }(e));\n}\n\nfunction __PRIVATE_toResourceName(e, t) {\n return __PRIVATE_toResourcePath(e, t).canonicalString();\n}\n\nfunction __PRIVATE_toResourcePath(e, t) {\n const n = function __PRIVATE_fullyQualifiedPrefixPath(e) {\n return new ResourcePath([ \"projects\", e.projectId, \"databases\", e.database ]);\n }(e).child(\"documents\");\n return void 0 === t ? n : n.child(t);\n}\n\nfunction __PRIVATE_fromResourceName(e) {\n const t = ResourcePath.fromString(e);\n return __PRIVATE_hardAssert(__PRIVATE_isValidResourceName(t)), t;\n}\n\nfunction __PRIVATE_toName(e, t) {\n return __PRIVATE_toResourceName(e.databaseId, t.path);\n}\n\nfunction fromName(e, t) {\n const n = __PRIVATE_fromResourceName(t);\n if (n.get(1) !== e.databaseId.projectId) throw new FirestoreError(D.INVALID_ARGUMENT, \"Tried to deserialize key from different project: \" + n.get(1) + \" vs \" + e.databaseId.projectId);\n if (n.get(3) !== e.databaseId.database) throw new FirestoreError(D.INVALID_ARGUMENT, \"Tried to deserialize key from different database: \" + n.get(3) + \" vs \" + e.databaseId.database);\n return new DocumentKey(__PRIVATE_extractLocalPathFromResourceName(n));\n}\n\nfunction __PRIVATE_toQueryPath(e, t) {\n return __PRIVATE_toResourceName(e.databaseId, t);\n}\n\nfunction __PRIVATE_fromQueryPath(e) {\n const t = __PRIVATE_fromResourceName(e);\n // In v1beta1 queries for collections at the root did not have a trailing\n // \"/documents\". In v1 all resource paths contain \"/documents\". Preserve the\n // ability to read the v1beta1 form for compatibility with queries persisted\n // in the local target cache.\n return 4 === t.length ? ResourcePath.emptyPath() : __PRIVATE_extractLocalPathFromResourceName(t);\n}\n\nfunction __PRIVATE_getEncodedDatabaseId(e) {\n return new ResourcePath([ \"projects\", e.databaseId.projectId, \"databases\", e.databaseId.database ]).canonicalString();\n}\n\nfunction __PRIVATE_extractLocalPathFromResourceName(e) {\n return __PRIVATE_hardAssert(e.length > 4 && \"documents\" === e.get(4)), e.popFirst(5);\n}\n\n/** Creates a Document proto from key and fields (but no create/update time) */ function __PRIVATE_toMutationDocument(e, t, n) {\n return {\n name: __PRIVATE_toName(e, t),\n fields: n.value.mapValue.fields\n };\n}\n\nfunction __PRIVATE_fromDocument(e, t, n) {\n const r = fromName(e, t.name), i = __PRIVATE_fromVersion(t.updateTime), s = t.createTime ? __PRIVATE_fromVersion(t.createTime) : SnapshotVersion.min(), o = new ObjectValue({\n mapValue: {\n fields: t.fields\n }\n }), _ = MutableDocument.newFoundDocument(r, i, s, o);\n return n && _.setHasCommittedMutations(), n ? _.setHasCommittedMutations() : _;\n}\n\nfunction __PRIVATE_fromBatchGetDocumentsResponse(e, t) {\n return \"found\" in t ? function __PRIVATE_fromFound(e, t) {\n __PRIVATE_hardAssert(!!t.found), t.found.name, t.found.updateTime;\n const n = fromName(e, t.found.name), r = __PRIVATE_fromVersion(t.found.updateTime), i = t.found.createTime ? __PRIVATE_fromVersion(t.found.createTime) : SnapshotVersion.min(), s = new ObjectValue({\n mapValue: {\n fields: t.found.fields\n }\n });\n return MutableDocument.newFoundDocument(n, r, i, s);\n }(e, t) : \"missing\" in t ? function __PRIVATE_fromMissing(e, t) {\n __PRIVATE_hardAssert(!!t.missing), __PRIVATE_hardAssert(!!t.readTime);\n const n = fromName(e, t.missing), r = __PRIVATE_fromVersion(t.readTime);\n return MutableDocument.newNoDocument(n, r);\n }(e, t) : fail();\n}\n\nfunction __PRIVATE_fromWatchChange(e, t) {\n let n;\n if (\"targetChange\" in t) {\n t.targetChange;\n // proto3 default value is unset in JSON (undefined), so use 'NO_CHANGE'\n // if unset\n const r = function __PRIVATE_fromWatchTargetChangeState(e) {\n return \"NO_CHANGE\" === e ? 0 /* WatchTargetChangeState.NoChange */ : \"ADD\" === e ? 1 /* WatchTargetChangeState.Added */ : \"REMOVE\" === e ? 2 /* WatchTargetChangeState.Removed */ : \"CURRENT\" === e ? 3 /* WatchTargetChangeState.Current */ : \"RESET\" === e ? 4 /* WatchTargetChangeState.Reset */ : fail();\n }(t.targetChange.targetChangeType || \"NO_CHANGE\"), i = t.targetChange.targetIds || [], s = function __PRIVATE_fromBytes(e, t) {\n return e.useProto3Json ? (__PRIVATE_hardAssert(void 0 === t || \"string\" == typeof t), \n ByteString.fromBase64String(t || \"\")) : (__PRIVATE_hardAssert(void 0 === t || \n // Check if the value is an instance of both Buffer and Uint8Array,\n // despite the fact that Buffer extends Uint8Array. In some\n // environments, such as jsdom, the prototype chain of Buffer\n // does not indicate that it extends Uint8Array.\n t instanceof Buffer || t instanceof Uint8Array), ByteString.fromUint8Array(t || new Uint8Array));\n }(e, t.targetChange.resumeToken), o = t.targetChange.cause, _ = o && function __PRIVATE_fromRpcStatus(e) {\n const t = void 0 === e.code ? D.UNKNOWN : __PRIVATE_mapCodeFromRpcCode(e.code);\n return new FirestoreError(t, e.message || \"\");\n }(o);\n n = new __PRIVATE_WatchTargetChange(r, i, s, _ || null);\n } else if (\"documentChange\" in t) {\n t.documentChange;\n const r = t.documentChange;\n r.document, r.document.name, r.document.updateTime;\n const i = fromName(e, r.document.name), s = __PRIVATE_fromVersion(r.document.updateTime), o = r.document.createTime ? __PRIVATE_fromVersion(r.document.createTime) : SnapshotVersion.min(), _ = new ObjectValue({\n mapValue: {\n fields: r.document.fields\n }\n }), a = MutableDocument.newFoundDocument(i, s, o, _), u = r.targetIds || [], c = r.removedTargetIds || [];\n n = new __PRIVATE_DocumentWatchChange(u, c, a.key, a);\n } else if (\"documentDelete\" in t) {\n t.documentDelete;\n const r = t.documentDelete;\n r.document;\n const i = fromName(e, r.document), s = r.readTime ? __PRIVATE_fromVersion(r.readTime) : SnapshotVersion.min(), o = MutableDocument.newNoDocument(i, s), _ = r.removedTargetIds || [];\n n = new __PRIVATE_DocumentWatchChange([], _, o.key, o);\n } else if (\"documentRemove\" in t) {\n t.documentRemove;\n const r = t.documentRemove;\n r.document;\n const i = fromName(e, r.document), s = r.removedTargetIds || [];\n n = new __PRIVATE_DocumentWatchChange([], s, i, null);\n } else {\n if (!(\"filter\" in t)) return fail();\n {\n t.filter;\n const e = t.filter;\n e.targetId;\n const {count: r = 0, unchangedNames: i} = e, s = new ExistenceFilter(r, i), o = e.targetId;\n n = new __PRIVATE_ExistenceFilterChange(o, s);\n }\n }\n return n;\n}\n\nfunction toMutation(e, t) {\n let n;\n if (t instanceof __PRIVATE_SetMutation) n = {\n update: __PRIVATE_toMutationDocument(e, t.key, t.value)\n }; else if (t instanceof __PRIVATE_DeleteMutation) n = {\n delete: __PRIVATE_toName(e, t.key)\n }; else if (t instanceof __PRIVATE_PatchMutation) n = {\n update: __PRIVATE_toMutationDocument(e, t.key, t.data),\n updateMask: __PRIVATE_toDocumentMask(t.fieldMask)\n }; else {\n if (!(t instanceof __PRIVATE_VerifyMutation)) return fail();\n n = {\n verify: __PRIVATE_toName(e, t.key)\n };\n }\n return t.fieldTransforms.length > 0 && (n.updateTransforms = t.fieldTransforms.map((e => function __PRIVATE_toFieldTransform(e, t) {\n const n = t.transform;\n if (n instanceof __PRIVATE_ServerTimestampTransform) return {\n fieldPath: t.field.canonicalString(),\n setToServerValue: \"REQUEST_TIME\"\n };\n if (n instanceof __PRIVATE_ArrayUnionTransformOperation) return {\n fieldPath: t.field.canonicalString(),\n appendMissingElements: {\n values: n.elements\n }\n };\n if (n instanceof __PRIVATE_ArrayRemoveTransformOperation) return {\n fieldPath: t.field.canonicalString(),\n removeAllFromArray: {\n values: n.elements\n }\n };\n if (n instanceof __PRIVATE_NumericIncrementTransformOperation) return {\n fieldPath: t.field.canonicalString(),\n increment: n.Pe\n };\n throw fail();\n }(0, e)))), t.precondition.isNone || (n.currentDocument = function __PRIVATE_toPrecondition(e, t) {\n return void 0 !== t.updateTime ? {\n updateTime: __PRIVATE_toVersion(e, t.updateTime)\n } : void 0 !== t.exists ? {\n exists: t.exists\n } : fail();\n }(e, t.precondition)), n;\n}\n\nfunction __PRIVATE_fromMutation(e, t) {\n const n = t.currentDocument ? function __PRIVATE_fromPrecondition(e) {\n return void 0 !== e.updateTime ? Precondition.updateTime(__PRIVATE_fromVersion(e.updateTime)) : void 0 !== e.exists ? Precondition.exists(e.exists) : Precondition.none();\n }(t.currentDocument) : Precondition.none(), r = t.updateTransforms ? t.updateTransforms.map((t => function __PRIVATE_fromFieldTransform(e, t) {\n let n = null;\n if (\"setToServerValue\" in t) __PRIVATE_hardAssert(\"REQUEST_TIME\" === t.setToServerValue), \n n = new __PRIVATE_ServerTimestampTransform; else if (\"appendMissingElements\" in t) {\n const e = t.appendMissingElements.values || [];\n n = new __PRIVATE_ArrayUnionTransformOperation(e);\n } else if (\"removeAllFromArray\" in t) {\n const e = t.removeAllFromArray.values || [];\n n = new __PRIVATE_ArrayRemoveTransformOperation(e);\n } else \"increment\" in t ? n = new __PRIVATE_NumericIncrementTransformOperation(e, t.increment) : fail();\n const r = FieldPath$1.fromServerFormat(t.fieldPath);\n return new FieldTransform(r, n);\n }(e, t))) : [];\n if (t.update) {\n t.update.name;\n const i = fromName(e, t.update.name), s = new ObjectValue({\n mapValue: {\n fields: t.update.fields\n }\n });\n if (t.updateMask) {\n const e = function __PRIVATE_fromDocumentMask(e) {\n const t = e.fieldPaths || [];\n return new FieldMask(t.map((e => FieldPath$1.fromServerFormat(e))));\n }(t.updateMask);\n return new __PRIVATE_PatchMutation(i, s, e, n, r);\n }\n return new __PRIVATE_SetMutation(i, s, n, r);\n }\n if (t.delete) {\n const r = fromName(e, t.delete);\n return new __PRIVATE_DeleteMutation(r, n);\n }\n if (t.verify) {\n const r = fromName(e, t.verify);\n return new __PRIVATE_VerifyMutation(r, n);\n }\n return fail();\n}\n\nfunction __PRIVATE_fromWriteResults(e, t) {\n return e && e.length > 0 ? (__PRIVATE_hardAssert(void 0 !== t), e.map((e => function __PRIVATE_fromWriteResult(e, t) {\n // NOTE: Deletes don't have an updateTime.\n let n = e.updateTime ? __PRIVATE_fromVersion(e.updateTime) : __PRIVATE_fromVersion(t);\n return n.isEqual(SnapshotVersion.min()) && (\n // The Firestore Emulator currently returns an update time of 0 for\n // deletes of non-existing documents (rather than null). This breaks the\n // test \"get deleted doc while offline with source=cache\" as NoDocuments\n // with version 0 are filtered by IndexedDb's RemoteDocumentCache.\n // TODO(#2149): Remove this when Emulator is fixed\n n = __PRIVATE_fromVersion(t)), new MutationResult(n, e.transformResults || []);\n }(e, t)))) : [];\n}\n\nfunction __PRIVATE_toDocumentsTarget(e, t) {\n return {\n documents: [ __PRIVATE_toQueryPath(e, t.path) ]\n };\n}\n\nfunction __PRIVATE_toQueryTarget(e, t) {\n // Dissect the path into parent, collectionId, and optional key filter.\n const n = {\n structuredQuery: {}\n }, r = t.path;\n let i;\n null !== t.collectionGroup ? (i = r, n.structuredQuery.from = [ {\n collectionId: t.collectionGroup,\n allDescendants: !0\n } ]) : (i = r.popLast(), n.structuredQuery.from = [ {\n collectionId: r.lastSegment()\n } ]), n.parent = __PRIVATE_toQueryPath(e, i);\n const s = function __PRIVATE_toFilters(e) {\n if (0 === e.length) return;\n return __PRIVATE_toFilter(CompositeFilter.create(e, \"and\" /* CompositeOperator.AND */));\n }(t.filters);\n s && (n.structuredQuery.where = s);\n const o = function __PRIVATE_toOrder(e) {\n if (0 === e.length) return;\n return e.map((e => \n // visible for testing\n function __PRIVATE_toPropertyOrder(e) {\n return {\n field: __PRIVATE_toFieldPathReference(e.field),\n direction: __PRIVATE_toDirection(e.dir)\n };\n }(e)));\n }(t.orderBy);\n o && (n.structuredQuery.orderBy = o);\n const _ = __PRIVATE_toInt32Proto(e, t.limit);\n return null !== _ && (n.structuredQuery.limit = _), t.startAt && (n.structuredQuery.startAt = function __PRIVATE_toStartAtCursor(e) {\n return {\n before: e.inclusive,\n values: e.position\n };\n }(t.startAt)), t.endAt && (n.structuredQuery.endAt = function __PRIVATE_toEndAtCursor(e) {\n return {\n before: !e.inclusive,\n values: e.position\n };\n }(t.endAt)), {\n _t: n,\n parent: i\n };\n}\n\nfunction __PRIVATE_toRunAggregationQueryRequest(e, t, n, r) {\n const {_t: i, parent: s} = __PRIVATE_toQueryTarget(e, t), o = {}, _ = [];\n let a = 0;\n return n.forEach((e => {\n // Map all client-side aliases to a unique short-form\n // alias. This avoids issues with client-side aliases that\n // exceed the 1500-byte string size limit.\n const t = r ? e.alias : \"aggregate_\" + a++;\n o[t] = e.alias, \"count\" === e.aggregateType ? _.push({\n alias: t,\n count: {}\n }) : \"avg\" === e.aggregateType ? _.push({\n alias: t,\n avg: {\n field: __PRIVATE_toFieldPathReference(e.fieldPath)\n }\n }) : \"sum\" === e.aggregateType && _.push({\n alias: t,\n sum: {\n field: __PRIVATE_toFieldPathReference(e.fieldPath)\n }\n });\n })), {\n request: {\n structuredAggregationQuery: {\n aggregations: _,\n structuredQuery: i.structuredQuery\n },\n parent: i.parent\n },\n ut: o,\n parent: s\n };\n}\n\nfunction __PRIVATE_convertQueryTargetToQuery(e) {\n let t = __PRIVATE_fromQueryPath(e.parent);\n const n = e.structuredQuery, r = n.from ? n.from.length : 0;\n let i = null;\n if (r > 0) {\n __PRIVATE_hardAssert(1 === r);\n const e = n.from[0];\n e.allDescendants ? i = e.collectionId : t = t.child(e.collectionId);\n }\n let s = [];\n n.where && (s = function __PRIVATE_fromFilters(e) {\n const t = __PRIVATE_fromFilter(e);\n if (t instanceof CompositeFilter && __PRIVATE_compositeFilterIsFlatConjunction(t)) return t.getFilters();\n return [ t ];\n }(n.where));\n let o = [];\n n.orderBy && (o = function __PRIVATE_fromOrder(e) {\n return e.map((e => function __PRIVATE_fromPropertyOrder(e) {\n return new OrderBy(__PRIVATE_fromFieldPathReference(e.field), \n // visible for testing\n function __PRIVATE_fromDirection(e) {\n switch (e) {\n case \"ASCENDING\":\n return \"asc\" /* Direction.ASCENDING */;\n\n case \"DESCENDING\":\n return \"desc\" /* Direction.DESCENDING */;\n\n default:\n return;\n }\n }\n // visible for testing\n (e.direction));\n }\n // visible for testing\n (e)));\n }(n.orderBy));\n let _ = null;\n n.limit && (_ = function __PRIVATE_fromInt32Proto(e) {\n let t;\n return t = \"object\" == typeof e ? e.value : e, __PRIVATE_isNullOrUndefined(t) ? null : t;\n }(n.limit));\n let a = null;\n n.startAt && (a = function __PRIVATE_fromStartAtCursor(e) {\n const t = !!e.before, n = e.values || [];\n return new Bound(n, t);\n }(n.startAt));\n let u = null;\n return n.endAt && (u = function __PRIVATE_fromEndAtCursor(e) {\n const t = !e.before, n = e.values || [];\n return new Bound(n, t);\n }\n // visible for testing\n (n.endAt)), __PRIVATE_newQuery(t, i, o, s, _, \"F\" /* LimitType.First */ , a, u);\n}\n\nfunction __PRIVATE_toListenRequestLabels(e, t) {\n const n = function __PRIVATE_toLabel(e) {\n switch (e) {\n case \"TargetPurposeListen\" /* TargetPurpose.Listen */ :\n return null;\n\n case \"TargetPurposeExistenceFilterMismatch\" /* TargetPurpose.ExistenceFilterMismatch */ :\n return \"existence-filter-mismatch\";\n\n case \"TargetPurposeExistenceFilterMismatchBloom\" /* TargetPurpose.ExistenceFilterMismatchBloom */ :\n return \"existence-filter-mismatch-bloom\";\n\n case \"TargetPurposeLimboResolution\" /* TargetPurpose.LimboResolution */ :\n return \"limbo-document\";\n\n default:\n return fail();\n }\n }(t.purpose);\n return null == n ? null : {\n \"goog-listen-tags\": n\n };\n}\n\nfunction __PRIVATE_fromFilter(e) {\n return void 0 !== e.unaryFilter ? function __PRIVATE_fromUnaryFilter(e) {\n switch (e.unaryFilter.op) {\n case \"IS_NAN\":\n const t = __PRIVATE_fromFieldPathReference(e.unaryFilter.field);\n return FieldFilter.create(t, \"==\" /* Operator.EQUAL */ , {\n doubleValue: NaN\n });\n\n case \"IS_NULL\":\n const n = __PRIVATE_fromFieldPathReference(e.unaryFilter.field);\n return FieldFilter.create(n, \"==\" /* Operator.EQUAL */ , {\n nullValue: \"NULL_VALUE\"\n });\n\n case \"IS_NOT_NAN\":\n const r = __PRIVATE_fromFieldPathReference(e.unaryFilter.field);\n return FieldFilter.create(r, \"!=\" /* Operator.NOT_EQUAL */ , {\n doubleValue: NaN\n });\n\n case \"IS_NOT_NULL\":\n const i = __PRIVATE_fromFieldPathReference(e.unaryFilter.field);\n return FieldFilter.create(i, \"!=\" /* Operator.NOT_EQUAL */ , {\n nullValue: \"NULL_VALUE\"\n });\n\n default:\n return fail();\n }\n }(e) : void 0 !== e.fieldFilter ? function __PRIVATE_fromFieldFilter(e) {\n return FieldFilter.create(__PRIVATE_fromFieldPathReference(e.fieldFilter.field), function __PRIVATE_fromOperatorName(e) {\n switch (e) {\n case \"EQUAL\":\n return \"==\" /* Operator.EQUAL */;\n\n case \"NOT_EQUAL\":\n return \"!=\" /* Operator.NOT_EQUAL */;\n\n case \"GREATER_THAN\":\n return \">\" /* Operator.GREATER_THAN */;\n\n case \"GREATER_THAN_OR_EQUAL\":\n return \">=\" /* Operator.GREATER_THAN_OR_EQUAL */;\n\n case \"LESS_THAN\":\n return \"<\" /* Operator.LESS_THAN */;\n\n case \"LESS_THAN_OR_EQUAL\":\n return \"<=\" /* Operator.LESS_THAN_OR_EQUAL */;\n\n case \"ARRAY_CONTAINS\":\n return \"array-contains\" /* Operator.ARRAY_CONTAINS */;\n\n case \"IN\":\n return \"in\" /* Operator.IN */;\n\n case \"NOT_IN\":\n return \"not-in\" /* Operator.NOT_IN */;\n\n case \"ARRAY_CONTAINS_ANY\":\n return \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */;\n\n default:\n return fail();\n }\n }(e.fieldFilter.op), e.fieldFilter.value);\n }(e) : void 0 !== e.compositeFilter ? function __PRIVATE_fromCompositeFilter(e) {\n return CompositeFilter.create(e.compositeFilter.filters.map((e => __PRIVATE_fromFilter(e))), function __PRIVATE_fromCompositeOperatorName(e) {\n switch (e) {\n case \"AND\":\n return \"and\" /* CompositeOperator.AND */;\n\n case \"OR\":\n return \"or\" /* CompositeOperator.OR */;\n\n default:\n return fail();\n }\n }(e.compositeFilter.op));\n }(e) : fail();\n}\n\nfunction __PRIVATE_toDirection(e) {\n return Te[e];\n}\n\nfunction __PRIVATE_toOperatorName(e) {\n return Ee[e];\n}\n\nfunction __PRIVATE_toCompositeOperatorName(e) {\n return de[e];\n}\n\nfunction __PRIVATE_toFieldPathReference(e) {\n return {\n fieldPath: e.canonicalString()\n };\n}\n\nfunction __PRIVATE_fromFieldPathReference(e) {\n return FieldPath$1.fromServerFormat(e.fieldPath);\n}\n\nfunction __PRIVATE_toFilter(e) {\n return e instanceof FieldFilter ? function __PRIVATE_toUnaryOrFieldFilter(e) {\n if (\"==\" /* Operator.EQUAL */ === e.op) {\n if (__PRIVATE_isNanValue(e.value)) return {\n unaryFilter: {\n field: __PRIVATE_toFieldPathReference(e.field),\n op: \"IS_NAN\"\n }\n };\n if (__PRIVATE_isNullValue(e.value)) return {\n unaryFilter: {\n field: __PRIVATE_toFieldPathReference(e.field),\n op: \"IS_NULL\"\n }\n };\n } else if (\"!=\" /* Operator.NOT_EQUAL */ === e.op) {\n if (__PRIVATE_isNanValue(e.value)) return {\n unaryFilter: {\n field: __PRIVATE_toFieldPathReference(e.field),\n op: \"IS_NOT_NAN\"\n }\n };\n if (__PRIVATE_isNullValue(e.value)) return {\n unaryFilter: {\n field: __PRIVATE_toFieldPathReference(e.field),\n op: \"IS_NOT_NULL\"\n }\n };\n }\n return {\n fieldFilter: {\n field: __PRIVATE_toFieldPathReference(e.field),\n op: __PRIVATE_toOperatorName(e.op),\n value: e.value\n }\n };\n }(e) : e instanceof CompositeFilter ? function __PRIVATE_toCompositeFilter(e) {\n const t = e.getFilters().map((e => __PRIVATE_toFilter(e)));\n if (1 === t.length) return t[0];\n return {\n compositeFilter: {\n op: __PRIVATE_toCompositeOperatorName(e.op),\n filters: t\n }\n };\n }(e) : fail();\n}\n\nfunction __PRIVATE_toDocumentMask(e) {\n const t = [];\n return e.fields.forEach((e => t.push(e.canonicalString()))), {\n fieldPaths: t\n };\n}\n\nfunction __PRIVATE_isValidResourceName(e) {\n // Resource names have at least 4 components (project ID, database ID)\n return e.length >= 4 && \"projects\" === e.get(0) && \"databases\" === e.get(2);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An immutable set of metadata that the local store tracks for each target.\n */ class TargetData {\n constructor(\n /** The target being listened to. */\n e, \n /**\n * The target ID to which the target corresponds; Assigned by the\n * LocalStore for user listens and by the SyncEngine for limbo watches.\n */\n t, \n /** The purpose of the target. */\n n, \n /**\n * The sequence number of the last transaction during which this target data\n * was modified.\n */\n r, \n /** The latest snapshot version seen for this target. */\n i = SnapshotVersion.min()\n /**\n * The maximum snapshot version at which the associated view\n * contained no limbo documents.\n */ , s = SnapshotVersion.min()\n /**\n * An opaque, server-assigned token that allows watching a target to be\n * resumed after disconnecting without retransmitting all the data that\n * matches the target. The resume token essentially identifies a point in\n * time from which the server should resume sending results.\n */ , o = ByteString.EMPTY_BYTE_STRING\n /**\n * The number of documents that last matched the query at the resume token or\n * read time. Documents are counted only when making a listen request with\n * resume token or read time, otherwise, keep it null.\n */ , _ = null) {\n this.target = e, this.targetId = t, this.purpose = n, this.sequenceNumber = r, this.snapshotVersion = i, \n this.lastLimboFreeSnapshotVersion = s, this.resumeToken = o, this.expectedCount = _;\n }\n /** Creates a new target data instance with an updated sequence number. */ withSequenceNumber(e) {\n return new TargetData(this.target, this.targetId, this.purpose, e, this.snapshotVersion, this.lastLimboFreeSnapshotVersion, this.resumeToken, this.expectedCount);\n }\n /**\n * Creates a new target data instance with an updated resume token and\n * snapshot version.\n */ withResumeToken(e, t) {\n return new TargetData(this.target, this.targetId, this.purpose, this.sequenceNumber, t, this.lastLimboFreeSnapshotVersion, e, \n /* expectedCount= */ null);\n }\n /**\n * Creates a new target data instance with an updated expected count.\n */ withExpectedCount(e) {\n return new TargetData(this.target, this.targetId, this.purpose, this.sequenceNumber, this.snapshotVersion, this.lastLimboFreeSnapshotVersion, this.resumeToken, e);\n }\n /**\n * Creates a new target data instance with an updated last limbo free\n * snapshot version number.\n */ withLastLimboFreeSnapshotVersion(e) {\n return new TargetData(this.target, this.targetId, this.purpose, this.sequenceNumber, this.snapshotVersion, e, this.resumeToken, this.expectedCount);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Serializer for values stored in the LocalStore. */ class __PRIVATE_LocalSerializer {\n constructor(e) {\n this.ct = e;\n }\n}\n\n/** Decodes a remote document from storage locally to a Document. */ function __PRIVATE_fromDbRemoteDocument(e, t) {\n let n;\n if (t.document) n = __PRIVATE_fromDocument(e.ct, t.document, !!t.hasCommittedMutations); else if (t.noDocument) {\n const e = DocumentKey.fromSegments(t.noDocument.path), r = __PRIVATE_fromDbTimestamp(t.noDocument.readTime);\n n = MutableDocument.newNoDocument(e, r), t.hasCommittedMutations && n.setHasCommittedMutations();\n } else {\n if (!t.unknownDocument) return fail();\n {\n const e = DocumentKey.fromSegments(t.unknownDocument.path), r = __PRIVATE_fromDbTimestamp(t.unknownDocument.version);\n n = MutableDocument.newUnknownDocument(e, r);\n }\n }\n return t.readTime && n.setReadTime(function __PRIVATE_fromDbTimestampKey(e) {\n const t = new Timestamp(e[0], e[1]);\n return SnapshotVersion.fromTimestamp(t);\n }(t.readTime)), n;\n}\n\n/** Encodes a document for storage locally. */ function __PRIVATE_toDbRemoteDocument(e, t) {\n const n = t.key, r = {\n prefixPath: n.getCollectionPath().popLast().toArray(),\n collectionGroup: n.collectionGroup,\n documentId: n.path.lastSegment(),\n readTime: __PRIVATE_toDbTimestampKey(t.readTime),\n hasCommittedMutations: t.hasCommittedMutations\n };\n if (t.isFoundDocument()) r.document = function __PRIVATE_toDocument(e, t) {\n return {\n name: __PRIVATE_toName(e, t.key),\n fields: t.data.value.mapValue.fields,\n updateTime: toTimestamp(e, t.version.toTimestamp()),\n createTime: toTimestamp(e, t.createTime.toTimestamp())\n };\n }(e.ct, t); else if (t.isNoDocument()) r.noDocument = {\n path: n.path.toArray(),\n readTime: __PRIVATE_toDbTimestamp(t.version)\n }; else {\n if (!t.isUnknownDocument()) return fail();\n r.unknownDocument = {\n path: n.path.toArray(),\n version: __PRIVATE_toDbTimestamp(t.version)\n };\n }\n return r;\n}\n\nfunction __PRIVATE_toDbTimestampKey(e) {\n const t = e.toTimestamp();\n return [ t.seconds, t.nanoseconds ];\n}\n\nfunction __PRIVATE_toDbTimestamp(e) {\n const t = e.toTimestamp();\n return {\n seconds: t.seconds,\n nanoseconds: t.nanoseconds\n };\n}\n\nfunction __PRIVATE_fromDbTimestamp(e) {\n const t = new Timestamp(e.seconds, e.nanoseconds);\n return SnapshotVersion.fromTimestamp(t);\n}\n\n/** Encodes a batch of mutations into a DbMutationBatch for local storage. */\n/** Decodes a DbMutationBatch into a MutationBatch */\nfunction __PRIVATE_fromDbMutationBatch(e, t) {\n const n = (t.baseMutations || []).map((t => __PRIVATE_fromMutation(e.ct, t)));\n // Squash old transform mutations into existing patch or set mutations.\n // The replacement of representing `transforms` with `update_transforms`\n // on the SDK means that old `transform` mutations stored in IndexedDB need\n // to be updated to `update_transforms`.\n // TODO(b/174608374): Remove this code once we perform a schema migration.\n for (let e = 0; e < t.mutations.length - 1; ++e) {\n const n = t.mutations[e];\n if (e + 1 < t.mutations.length && void 0 !== t.mutations[e + 1].transform) {\n const r = t.mutations[e + 1];\n n.updateTransforms = r.transform.fieldTransforms, t.mutations.splice(e + 1, 1), \n ++e;\n }\n }\n const r = t.mutations.map((t => __PRIVATE_fromMutation(e.ct, t))), i = Timestamp.fromMillis(t.localWriteTimeMs);\n return new MutationBatch(t.batchId, i, n, r);\n}\n\n/** Decodes a DbTarget into TargetData */ function __PRIVATE_fromDbTarget(e) {\n const t = __PRIVATE_fromDbTimestamp(e.readTime), n = void 0 !== e.lastLimboFreeSnapshotVersion ? __PRIVATE_fromDbTimestamp(e.lastLimboFreeSnapshotVersion) : SnapshotVersion.min();\n let r;\n return r = \n /**\n * A helper function for figuring out what kind of query has been stored.\n */\n function __PRIVATE_isDocumentQuery(e) {\n return void 0 !== e.documents;\n }\n /** Encodes a DbBundle to a BundleMetadata object. */ (e.query) ? function __PRIVATE_fromDocumentsTarget(e) {\n return __PRIVATE_hardAssert(1 === e.documents.length), __PRIVATE_queryToTarget(__PRIVATE_newQueryForPath(__PRIVATE_fromQueryPath(e.documents[0])));\n }(e.query) : function __PRIVATE_fromQueryTarget(e) {\n return __PRIVATE_queryToTarget(__PRIVATE_convertQueryTargetToQuery(e));\n }(e.query), new TargetData(r, e.targetId, \"TargetPurposeListen\" /* TargetPurpose.Listen */ , e.lastListenSequenceNumber, t, n, ByteString.fromBase64String(e.resumeToken));\n}\n\n/** Encodes TargetData into a DbTarget for storage locally. */ function __PRIVATE_toDbTarget(e, t) {\n const n = __PRIVATE_toDbTimestamp(t.snapshotVersion), r = __PRIVATE_toDbTimestamp(t.lastLimboFreeSnapshotVersion);\n let i;\n i = __PRIVATE_targetIsDocumentTarget(t.target) ? __PRIVATE_toDocumentsTarget(e.ct, t.target) : __PRIVATE_toQueryTarget(e.ct, t.target)._t;\n // We can't store the resumeToken as a ByteString in IndexedDb, so we\n // convert it to a base64 string for storage.\n const s = t.resumeToken.toBase64();\n // lastListenSequenceNumber is always 0 until we do real GC.\n return {\n targetId: t.targetId,\n canonicalId: __PRIVATE_canonifyTarget(t.target),\n readTime: n,\n resumeToken: s,\n lastListenSequenceNumber: t.sequenceNumber,\n lastLimboFreeSnapshotVersion: r,\n query: i\n };\n}\n\n/**\n * Encodes a `BundledQuery` from bundle proto to a Query object.\n *\n * This reconstructs the original query used to build the bundle being loaded,\n * including features exists only in SDKs (for example: limit-to-last).\n */\nfunction __PRIVATE_fromBundledQuery(e) {\n const t = __PRIVATE_convertQueryTargetToQuery({\n parent: e.parent,\n structuredQuery: e.structuredQuery\n });\n return \"LAST\" === e.limitType ? __PRIVATE_queryWithLimit(t, t.limit, \"L\" /* LimitType.Last */) : t;\n}\n\n/** Encodes a NamedQuery proto object to a NamedQuery model object. */\n/** Encodes a DbDocumentOverlay object to an Overlay model object. */\nfunction __PRIVATE_fromDbDocumentOverlay(e, t) {\n return new Overlay(t.largestBatchId, __PRIVATE_fromMutation(e.ct, t.overlayMutation));\n}\n\n/** Decodes an Overlay model object into a DbDocumentOverlay object. */\n/**\n * Returns the DbDocumentOverlayKey corresponding to the given user and\n * document key.\n */\nfunction __PRIVATE_toDbDocumentOverlayKey(e, t) {\n const n = t.path.lastSegment();\n return [ e, __PRIVATE_encodeResourcePath(t.path.popLast()), n ];\n}\n\nfunction __PRIVATE_toDbIndexState(e, t, n, r) {\n return {\n indexId: e,\n uid: t,\n sequenceNumber: n,\n readTime: __PRIVATE_toDbTimestamp(r.readTime),\n documentKey: __PRIVATE_encodeResourcePath(r.documentKey.path),\n largestBatchId: r.largestBatchId\n };\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_IndexedDbBundleCache {\n getBundleMetadata(e, t) {\n return __PRIVATE_bundlesStore(e).get(t).next((e => {\n if (e) return function __PRIVATE_fromDbBundle(e) {\n return {\n id: e.bundleId,\n createTime: __PRIVATE_fromDbTimestamp(e.createTime),\n version: e.version\n };\n }\n /** Encodes a BundleMetadata to a DbBundle. */ (e);\n }));\n }\n saveBundleMetadata(e, t) {\n return __PRIVATE_bundlesStore(e).put(function __PRIVATE_toDbBundle(e) {\n return {\n bundleId: e.id,\n createTime: __PRIVATE_toDbTimestamp(__PRIVATE_fromVersion(e.createTime)),\n version: e.version\n };\n }\n /** Encodes a DbNamedQuery to a NamedQuery. */ (t));\n }\n getNamedQuery(e, t) {\n return __PRIVATE_namedQueriesStore(e).get(t).next((e => {\n if (e) return function __PRIVATE_fromDbNamedQuery(e) {\n return {\n name: e.name,\n query: __PRIVATE_fromBundledQuery(e.bundledQuery),\n readTime: __PRIVATE_fromDbTimestamp(e.readTime)\n };\n }\n /** Encodes a NamedQuery from a bundle proto to a DbNamedQuery. */ (e);\n }));\n }\n saveNamedQuery(e, t) {\n return __PRIVATE_namedQueriesStore(e).put(function __PRIVATE_toDbNamedQuery(e) {\n return {\n name: e.name,\n readTime: __PRIVATE_toDbTimestamp(__PRIVATE_fromVersion(e.readTime)),\n bundledQuery: e.bundledQuery\n };\n }(t));\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the bundles object store.\n */ function __PRIVATE_bundlesStore(e) {\n return __PRIVATE_getStore(e, \"bundles\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the namedQueries object store.\n */ function __PRIVATE_namedQueriesStore(e) {\n return __PRIVATE_getStore(e, \"namedQueries\");\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Implementation of DocumentOverlayCache using IndexedDb.\n */ class __PRIVATE_IndexedDbDocumentOverlayCache {\n /**\n * @param serializer - The document serializer.\n * @param userId - The userId for which we are accessing overlays.\n */\n constructor(e, t) {\n this.serializer = e, this.userId = t;\n }\n static lt(e, t) {\n const n = t.uid || \"\";\n return new __PRIVATE_IndexedDbDocumentOverlayCache(e, n);\n }\n getOverlay(e, t) {\n return __PRIVATE_documentOverlayStore(e).get(__PRIVATE_toDbDocumentOverlayKey(this.userId, t)).next((e => e ? __PRIVATE_fromDbDocumentOverlay(this.serializer, e) : null));\n }\n getOverlays(e, t) {\n const n = __PRIVATE_newOverlayMap();\n return PersistencePromise.forEach(t, (t => this.getOverlay(e, t).next((e => {\n null !== e && n.set(t, e);\n })))).next((() => n));\n }\n saveOverlays(e, t, n) {\n const r = [];\n return n.forEach(((n, i) => {\n const s = new Overlay(t, i);\n r.push(this.ht(e, s));\n })), PersistencePromise.waitFor(r);\n }\n removeOverlaysForBatchId(e, t, n) {\n const r = new Set;\n // Get the set of unique collection paths.\n t.forEach((e => r.add(__PRIVATE_encodeResourcePath(e.getCollectionPath()))));\n const i = [];\n return r.forEach((t => {\n const r = IDBKeyRange.bound([ this.userId, t, n ], [ this.userId, t, n + 1 ], \n /*lowerOpen=*/ !1, \n /*upperOpen=*/ !0);\n i.push(__PRIVATE_documentOverlayStore(e).j(\"collectionPathOverlayIndex\", r));\n })), PersistencePromise.waitFor(i);\n }\n getOverlaysForCollection(e, t, n) {\n const r = __PRIVATE_newOverlayMap(), i = __PRIVATE_encodeResourcePath(t), s = IDBKeyRange.bound([ this.userId, i, n ], [ this.userId, i, Number.POSITIVE_INFINITY ], \n /*lowerOpen=*/ !0);\n return __PRIVATE_documentOverlayStore(e).U(\"collectionPathOverlayIndex\", s).next((e => {\n for (const t of e) {\n const e = __PRIVATE_fromDbDocumentOverlay(this.serializer, t);\n r.set(e.getKey(), e);\n }\n return r;\n }));\n }\n getOverlaysForCollectionGroup(e, t, n, r) {\n const i = __PRIVATE_newOverlayMap();\n let s;\n // We want batch IDs larger than `sinceBatchId`, and so the lower bound\n // is not inclusive.\n const o = IDBKeyRange.bound([ this.userId, t, n ], [ this.userId, t, Number.POSITIVE_INFINITY ], \n /*lowerOpen=*/ !0);\n return __PRIVATE_documentOverlayStore(e).J({\n index: \"collectionGroupOverlayIndex\",\n range: o\n }, ((e, t, n) => {\n // We do not want to return partial batch overlays, even if the size\n // of the result set exceeds the given `count` argument. Therefore, we\n // continue to aggregate results even after the result size exceeds\n // `count` if there are more overlays from the `currentBatchId`.\n const o = __PRIVATE_fromDbDocumentOverlay(this.serializer, t);\n i.size() < r || o.largestBatchId === s ? (i.set(o.getKey(), o), s = o.largestBatchId) : n.done();\n })).next((() => i));\n }\n ht(e, t) {\n return __PRIVATE_documentOverlayStore(e).put(function __PRIVATE_toDbDocumentOverlay(e, t, n) {\n const [r, i, s] = __PRIVATE_toDbDocumentOverlayKey(t, n.mutation.key);\n return {\n userId: t,\n collectionPath: i,\n documentId: s,\n collectionGroup: n.mutation.key.getCollectionGroup(),\n largestBatchId: n.largestBatchId,\n overlayMutation: toMutation(e.ct, n.mutation)\n };\n }(this.serializer, this.userId, t));\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the document overlay object store.\n */ function __PRIVATE_documentOverlayStore(e) {\n return __PRIVATE_getStore(e, \"documentOverlays\");\n}\n\n/**\n * @license\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_IndexedDbGlobalsCache {\n Pt(e) {\n return __PRIVATE_getStore(e, \"globals\");\n }\n getSessionToken(e) {\n return this.Pt(e).get(\"sessionToken\").next((e => {\n const t = null == e ? void 0 : e.value;\n return t ? ByteString.fromUint8Array(t) : ByteString.EMPTY_BYTE_STRING;\n }));\n }\n setSessionToken(e, t) {\n return this.Pt(e).put({\n name: \"sessionToken\",\n value: t.toUint8Array()\n });\n }\n}\n\n/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// Note: This code is copied from the backend. Code that is not used by\n// Firestore was removed.\n/** Firestore index value writer. */\nclass __PRIVATE_FirestoreIndexValueWriter {\n constructor() {}\n // The write methods below short-circuit writing terminators for values\n // containing a (terminating) truncated value.\n // As an example, consider the resulting encoding for:\n // [\"bar\", [2, \"foo\"]] -> (STRING, \"bar\", TERM, ARRAY, NUMBER, 2, STRING, \"foo\", TERM, TERM, TERM)\n // [\"bar\", [2, truncated(\"foo\")]] -> (STRING, \"bar\", TERM, ARRAY, NUMBER, 2, STRING, \"foo\", TRUNC)\n // [\"bar\", truncated([\"foo\"])] -> (STRING, \"bar\", TERM, ARRAY. STRING, \"foo\", TERM, TRUNC)\n /** Writes an index value. */\n It(e, t) {\n this.Tt(e, t), \n // Write separator to split index values\n // (see go/firestore-storage-format#encodings).\n t.Et();\n }\n Tt(e, t) {\n if (\"nullValue\" in e) this.dt(t, 5); else if (\"booleanValue\" in e) this.dt(t, 10), \n t.At(e.booleanValue ? 1 : 0); else if (\"integerValue\" in e) this.dt(t, 15), t.At(__PRIVATE_normalizeNumber(e.integerValue)); else if (\"doubleValue\" in e) {\n const n = __PRIVATE_normalizeNumber(e.doubleValue);\n isNaN(n) ? this.dt(t, 13) : (this.dt(t, 15), __PRIVATE_isNegativeZero(n) ? \n // -0.0, 0 and 0.0 are all considered the same\n t.At(0) : t.At(n));\n } else if (\"timestampValue\" in e) {\n let n = e.timestampValue;\n this.dt(t, 20), \"string\" == typeof n && (n = __PRIVATE_normalizeTimestamp(n)), t.Rt(`${n.seconds || \"\"}`), \n t.At(n.nanos || 0);\n } else if (\"stringValue\" in e) this.Vt(e.stringValue, t), this.ft(t); else if (\"bytesValue\" in e) this.dt(t, 30), \n t.gt(__PRIVATE_normalizeByteString(e.bytesValue)), this.ft(t); else if (\"referenceValue\" in e) this.yt(e.referenceValue, t); else if (\"geoPointValue\" in e) {\n const n = e.geoPointValue;\n this.dt(t, 45), t.At(n.latitude || 0), t.At(n.longitude || 0);\n } else \"mapValue\" in e ? __PRIVATE_isMaxValue(e) ? this.dt(t, Number.MAX_SAFE_INTEGER) : __PRIVATE_isVectorValue(e) ? this.wt(e.mapValue, t) : (this.St(e.mapValue, t), \n this.ft(t)) : \"arrayValue\" in e ? (this.bt(e.arrayValue, t), this.ft(t)) : fail();\n }\n Vt(e, t) {\n this.dt(t, 25), this.Dt(e, t);\n }\n Dt(e, t) {\n t.Rt(e);\n }\n St(e, t) {\n const n = e.fields || {};\n this.dt(t, 55);\n for (const e of Object.keys(n)) this.Vt(e, t), this.Tt(n[e], t);\n }\n wt(e, t) {\n var n, r;\n const i = e.fields || {};\n this.dt(t, 53);\n // Vectors sort first by length\n const s = \"value\", o = (null === (r = null === (n = i[s].arrayValue) || void 0 === n ? void 0 : n.values) || void 0 === r ? void 0 : r.length) || 0;\n this.dt(t, 15), t.At(__PRIVATE_normalizeNumber(o)), \n // Vectors then sort by position value\n this.Vt(s, t), this.Tt(i[s], t);\n }\n bt(e, t) {\n const n = e.values || [];\n this.dt(t, 50);\n for (const e of n) this.Tt(e, t);\n }\n yt(e, t) {\n this.dt(t, 37);\n DocumentKey.fromName(e).path.forEach((e => {\n this.dt(t, 60), this.Dt(e, t);\n }));\n }\n dt(e, t) {\n e.At(t);\n }\n ft(e) {\n // While the SDK does not implement truncation, the truncation marker is\n // used to terminate all variable length values (which are strings, bytes,\n // references, arrays and maps).\n e.At(2);\n }\n}\n\n__PRIVATE_FirestoreIndexValueWriter.vt = new __PRIVATE_FirestoreIndexValueWriter;\n\n/**\n * Counts the number of zeros in a byte.\n *\n * Visible for testing.\n */\nfunction __PRIVATE_numberOfLeadingZerosInByte(e) {\n if (0 === e) return 8;\n let t = 0;\n return e >> 4 == 0 && (\n // Test if the first four bits are zero.\n t += 4, e <<= 4), e >> 6 == 0 && (\n // Test if the first two (or next two) bits are zero.\n t += 2, e <<= 2), e >> 7 == 0 && (\n // Test if the remaining bit is zero.\n t += 1), t;\n}\n\n/** Counts the number of leading zeros in the given byte array. */\n/**\n * Returns the number of bytes required to store \"value\". Leading zero bytes\n * are skipped.\n */\nfunction __PRIVATE_unsignedNumLength(e) {\n // This is just the number of bytes for the unsigned representation of the number.\n const t = 64 - function __PRIVATE_numberOfLeadingZeros(e) {\n let t = 0;\n for (let n = 0; n < 8; ++n) {\n const r = __PRIVATE_numberOfLeadingZerosInByte(255 & e[n]);\n if (t += r, 8 !== r) break;\n }\n return t;\n }(e);\n return Math.ceil(t / 8);\n}\n\n/**\n * OrderedCodeWriter is a minimal-allocation implementation of the writing\n * behavior defined by the backend.\n *\n * The code is ported from its Java counterpart.\n */ class __PRIVATE_OrderedCodeWriter {\n constructor() {\n this.buffer = new Uint8Array(1024), this.position = 0;\n }\n Ct(e) {\n const t = e[Symbol.iterator]();\n let n = t.next();\n for (;!n.done; ) this.Ft(n.value), n = t.next();\n this.Mt();\n }\n xt(e) {\n const t = e[Symbol.iterator]();\n let n = t.next();\n for (;!n.done; ) this.Ot(n.value), n = t.next();\n this.Nt();\n }\n /** Writes utf8 bytes into this byte sequence, ascending. */ Lt(e) {\n for (const t of e) {\n const e = t.charCodeAt(0);\n if (e < 128) this.Ft(e); else if (e < 2048) this.Ft(960 | e >>> 6), this.Ft(128 | 63 & e); else if (t < \"\\ud800\" || \"\\udbff\" < t) this.Ft(480 | e >>> 12), \n this.Ft(128 | 63 & e >>> 6), this.Ft(128 | 63 & e); else {\n const e = t.codePointAt(0);\n this.Ft(240 | e >>> 18), this.Ft(128 | 63 & e >>> 12), this.Ft(128 | 63 & e >>> 6), \n this.Ft(128 | 63 & e);\n }\n }\n this.Mt();\n }\n /** Writes utf8 bytes into this byte sequence, descending */ Bt(e) {\n for (const t of e) {\n const e = t.charCodeAt(0);\n if (e < 128) this.Ot(e); else if (e < 2048) this.Ot(960 | e >>> 6), this.Ot(128 | 63 & e); else if (t < \"\\ud800\" || \"\\udbff\" < t) this.Ot(480 | e >>> 12), \n this.Ot(128 | 63 & e >>> 6), this.Ot(128 | 63 & e); else {\n const e = t.codePointAt(0);\n this.Ot(240 | e >>> 18), this.Ot(128 | 63 & e >>> 12), this.Ot(128 | 63 & e >>> 6), \n this.Ot(128 | 63 & e);\n }\n }\n this.Nt();\n }\n kt(e) {\n // Values are encoded with a single byte length prefix, followed by the\n // actual value in big-endian format with leading 0 bytes dropped.\n const t = this.qt(e), n = __PRIVATE_unsignedNumLength(t);\n this.Qt(1 + n), this.buffer[this.position++] = 255 & n;\n // Write the length\n for (let e = t.length - n; e < t.length; ++e) this.buffer[this.position++] = 255 & t[e];\n }\n Kt(e) {\n // Values are encoded with a single byte length prefix, followed by the\n // inverted value in big-endian format with leading 0 bytes dropped.\n const t = this.qt(e), n = __PRIVATE_unsignedNumLength(t);\n this.Qt(1 + n), this.buffer[this.position++] = ~(255 & n);\n // Write the length\n for (let e = t.length - n; e < t.length; ++e) this.buffer[this.position++] = ~(255 & t[e]);\n }\n /**\n * Writes the \"infinity\" byte sequence that sorts after all other byte\n * sequences written in ascending order.\n */ $t() {\n this.Ut(255), this.Ut(255);\n }\n /**\n * Writes the \"infinity\" byte sequence that sorts before all other byte\n * sequences written in descending order.\n */ Wt() {\n this.Gt(255), this.Gt(255);\n }\n /**\n * Resets the buffer such that it is the same as when it was newly\n * constructed.\n */ reset() {\n this.position = 0;\n }\n seed(e) {\n this.Qt(e.length), this.buffer.set(e, this.position), this.position += e.length;\n }\n /** Makes a copy of the encoded bytes in this buffer. */ zt() {\n return this.buffer.slice(0, this.position);\n }\n /**\n * Encodes `val` into an encoding so that the order matches the IEEE 754\n * floating-point comparison results with the following exceptions:\n * -0.0 < 0.0\n * all non-NaN < NaN\n * NaN = NaN\n */ qt(e) {\n const t = \n /** Converts a JavaScript number to a byte array (using big endian encoding). */\n function __PRIVATE_doubleToLongBits(e) {\n const t = new DataView(new ArrayBuffer(8));\n return t.setFloat64(0, e, /* littleEndian= */ !1), new Uint8Array(t.buffer);\n }(e), n = 0 != (128 & t[0]);\n // Check if the first bit is set. We use a bit mask since value[0] is\n // encoded as a number from 0 to 255.\n // Revert the two complement to get natural ordering\n t[0] ^= n ? 255 : 128;\n for (let e = 1; e < t.length; ++e) t[e] ^= n ? 255 : 0;\n return t;\n }\n /** Writes a single byte ascending to the buffer. */ Ft(e) {\n const t = 255 & e;\n 0 === t ? (this.Ut(0), this.Ut(255)) : 255 === t ? (this.Ut(255), this.Ut(0)) : this.Ut(t);\n }\n /** Writes a single byte descending to the buffer. */ Ot(e) {\n const t = 255 & e;\n 0 === t ? (this.Gt(0), this.Gt(255)) : 255 === t ? (this.Gt(255), this.Gt(0)) : this.Gt(e);\n }\n Mt() {\n this.Ut(0), this.Ut(1);\n }\n Nt() {\n this.Gt(0), this.Gt(1);\n }\n Ut(e) {\n this.Qt(1), this.buffer[this.position++] = e;\n }\n Gt(e) {\n this.Qt(1), this.buffer[this.position++] = ~e;\n }\n Qt(e) {\n const t = e + this.position;\n if (t <= this.buffer.length) return;\n // Try doubling.\n let n = 2 * this.buffer.length;\n // Still not big enough? Just allocate the right size.\n n < t && (n = t);\n // Create the new buffer.\n const r = new Uint8Array(n);\n r.set(this.buffer), // copy old data\n this.buffer = r;\n }\n}\n\nclass __PRIVATE_AscendingIndexByteEncoder {\n constructor(e) {\n this.jt = e;\n }\n gt(e) {\n this.jt.Ct(e);\n }\n Rt(e) {\n this.jt.Lt(e);\n }\n At(e) {\n this.jt.kt(e);\n }\n Et() {\n this.jt.$t();\n }\n}\n\nclass __PRIVATE_DescendingIndexByteEncoder {\n constructor(e) {\n this.jt = e;\n }\n gt(e) {\n this.jt.xt(e);\n }\n Rt(e) {\n this.jt.Bt(e);\n }\n At(e) {\n this.jt.Kt(e);\n }\n Et() {\n this.jt.Wt();\n }\n}\n\n/**\n * Implements `DirectionalIndexByteEncoder` using `OrderedCodeWriter` for the\n * actual encoding.\n */ class __PRIVATE_IndexByteEncoder {\n constructor() {\n this.jt = new __PRIVATE_OrderedCodeWriter, this.Ht = new __PRIVATE_AscendingIndexByteEncoder(this.jt), \n this.Jt = new __PRIVATE_DescendingIndexByteEncoder(this.jt);\n }\n seed(e) {\n this.jt.seed(e);\n }\n Yt(e) {\n return 0 /* IndexKind.ASCENDING */ === e ? this.Ht : this.Jt;\n }\n zt() {\n return this.jt.zt();\n }\n reset() {\n this.jt.reset();\n }\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Represents an index entry saved by the SDK in persisted storage. */ class __PRIVATE_IndexEntry {\n constructor(e, t, n, r) {\n this.indexId = e, this.documentKey = t, this.arrayValue = n, this.directionalValue = r;\n }\n /**\n * Returns an IndexEntry entry that sorts immediately after the current\n * directional value.\n */ Zt() {\n const e = this.directionalValue.length, t = 0 === e || 255 === this.directionalValue[e - 1] ? e + 1 : e, n = new Uint8Array(t);\n return n.set(this.directionalValue, 0), t !== e ? n.set([ 0 ], this.directionalValue.length) : ++n[n.length - 1], \n new __PRIVATE_IndexEntry(this.indexId, this.documentKey, this.arrayValue, n);\n }\n}\n\nfunction __PRIVATE_indexEntryComparator(e, t) {\n let n = e.indexId - t.indexId;\n return 0 !== n ? n : (n = __PRIVATE_compareByteArrays(e.arrayValue, t.arrayValue), \n 0 !== n ? n : (n = __PRIVATE_compareByteArrays(e.directionalValue, t.directionalValue), \n 0 !== n ? n : DocumentKey.comparator(e.documentKey, t.documentKey)));\n}\n\nfunction __PRIVATE_compareByteArrays(e, t) {\n for (let n = 0; n < e.length && n < t.length; ++n) {\n const r = e[n] - t[n];\n if (0 !== r) return r;\n }\n return e.length - t.length;\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A light query planner for Firestore.\n *\n * This class matches a `FieldIndex` against a Firestore Query `Target`. It\n * determines whether a given index can be used to serve the specified target.\n *\n * The following table showcases some possible index configurations:\n *\n * Query | Index\n * -----------------------------------------------------------------------------\n * where('a', '==', 'a').where('b', '==', 'b') | a ASC, b DESC\n * where('a', '==', 'a').where('b', '==', 'b') | a ASC\n * where('a', '==', 'a').where('b', '==', 'b') | b DESC\n * where('a', '>=', 'a').orderBy('a') | a ASC\n * where('a', '>=', 'a').orderBy('a', 'desc') | a DESC\n * where('a', '>=', 'a').orderBy('a').orderBy('b') | a ASC, b ASC\n * where('a', '>=', 'a').orderBy('a').orderBy('b') | a ASC\n * where('a', 'array-contains', 'a').orderBy('b') | a CONTAINS, b ASCENDING\n * where('a', 'array-contains', 'a').orderBy('b') | a CONTAINS\n */ class __PRIVATE_TargetIndexMatcher {\n constructor(e) {\n // The inequality filters of the target (if it exists).\n // Note: The sort on FieldFilters is not required. Using SortedSet here just to utilize the custom\n // comparator.\n this.Xt = new SortedSet(((e, t) => FieldPath$1.comparator(e.field, t.field))), this.collectionId = null != e.collectionGroup ? e.collectionGroup : e.path.lastSegment(), \n this.en = e.orderBy, this.tn = [];\n for (const t of e.filters) {\n const e = t;\n e.isInequality() ? this.Xt = this.Xt.add(e) : this.tn.push(e);\n }\n }\n get nn() {\n return this.Xt.size > 1;\n }\n /**\n * Returns whether the index can be used to serve the TargetIndexMatcher's\n * target.\n *\n * An index is considered capable of serving the target when:\n * - The target uses all index segments for its filters and orderBy clauses.\n * The target can have additional filter and orderBy clauses, but not\n * fewer.\n * - If an ArrayContains/ArrayContainsAnyfilter is used, the index must also\n * have a corresponding `CONTAINS` segment.\n * - All directional index segments can be mapped to the target as a series of\n * equality filters, a single inequality filter and a series of orderBy\n * clauses.\n * - The segments that represent the equality filters may appear out of order.\n * - The optional segment for the inequality filter must appear after all\n * equality segments.\n * - The segments that represent that orderBy clause of the target must appear\n * in order after all equality and inequality segments. Single orderBy\n * clauses cannot be skipped, but a continuous orderBy suffix may be\n * omitted.\n */ rn(e) {\n if (__PRIVATE_hardAssert(e.collectionGroup === this.collectionId), this.nn) \n // Only single inequality is supported for now.\n // TODO(Add support for multiple inequality query): b/298441043\n return !1;\n // If there is an array element, find a matching filter.\n const t = __PRIVATE_fieldIndexGetArraySegment(e);\n if (void 0 !== t && !this.sn(t)) return !1;\n const n = __PRIVATE_fieldIndexGetDirectionalSegments(e);\n let r = new Set, i = 0, s = 0;\n // Process all equalities first. Equalities can appear out of order.\n for (;i < n.length && this.sn(n[i]); ++i) r = r.add(n[i].fieldPath.canonicalString());\n // If we already have processed all segments, all segments are used to serve\n // the equality filters and we do not need to map any segments to the\n // target's inequality and orderBy clauses.\n if (i === n.length) return !0;\n if (this.Xt.size > 0) {\n // Only a single inequality is currently supported. Get the only entry in the set.\n const e = this.Xt.getIterator().getNext();\n // If there is an inequality filter and the field was not in one of the\n // equality filters above, the next segment must match both the filter\n // and the first orderBy clause.\n if (!r.has(e.field.canonicalString())) {\n const t = n[i];\n if (!this.on(e, t) || !this._n(this.en[s++], t)) return !1;\n }\n ++i;\n }\n // All remaining segments need to represent the prefix of the target's\n // orderBy.\n for (;i < n.length; ++i) {\n const e = n[i];\n if (s >= this.en.length || !this._n(this.en[s++], e)) return !1;\n }\n return !0;\n }\n /**\n * Returns a full matched field index for this target. Currently multiple\n * inequality query is not supported so function returns null.\n */ an() {\n if (this.nn) return null;\n // We want to make sure only one segment created for one field. For example,\n // in case like a == 3 and a > 2, Index {a ASCENDING} will only be created\n // once.\n let e = new SortedSet(FieldPath$1.comparator);\n const t = [];\n for (const n of this.tn) {\n if (n.field.isKeyField()) continue;\n if (\"array-contains\" /* Operator.ARRAY_CONTAINS */ === n.op || \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ === n.op) t.push(new IndexSegment(n.field, 2 /* IndexKind.CONTAINS */)); else {\n if (e.has(n.field)) continue;\n e = e.add(n.field), t.push(new IndexSegment(n.field, 0 /* IndexKind.ASCENDING */));\n }\n }\n // Note: We do not explicitly check `this.inequalityFilter` but rather rely\n // on the target defining an appropriate \"order by\" to ensure that the\n // required index segment is added. The query engine would reject a query\n // with an inequality filter that lacks the required order-by clause.\n for (const n of this.en) \n // Stop adding more segments if we see a order-by on key. Typically this\n // is the default implicit order-by which is covered in the index_entry\n // table as a separate column. If it is not the default order-by, the\n // generated index will be missing some segments optimized for order-bys,\n // which is probably fine.\n n.field.isKeyField() || e.has(n.field) || (e = e.add(n.field), t.push(new IndexSegment(n.field, \"asc\" /* Direction.ASCENDING */ === n.dir ? 0 /* IndexKind.ASCENDING */ : 1 /* IndexKind.DESCENDING */)));\n return new FieldIndex(FieldIndex.UNKNOWN_ID, this.collectionId, t, IndexState.empty());\n }\n sn(e) {\n for (const t of this.tn) if (this.on(t, e)) return !0;\n return !1;\n }\n on(e, t) {\n if (void 0 === e || !e.field.isEqual(t.fieldPath)) return !1;\n const n = \"array-contains\" /* Operator.ARRAY_CONTAINS */ === e.op || \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ === e.op;\n return 2 /* IndexKind.CONTAINS */ === t.kind === n;\n }\n _n(e, t) {\n return !!e.field.isEqual(t.fieldPath) && (0 /* IndexKind.ASCENDING */ === t.kind && \"asc\" /* Direction.ASCENDING */ === e.dir || 1 /* IndexKind.DESCENDING */ === t.kind && \"desc\" /* Direction.DESCENDING */ === e.dir);\n }\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Provides utility functions that help with boolean logic transformations needed for handling\n * complex filters used in queries.\n */\n/**\n * The `in` filter is only a syntactic sugar over a disjunction of equalities. For instance: `a in\n * [1,2,3]` is in fact `a==1 || a==2 || a==3`. This method expands any `in` filter in the given\n * input into a disjunction of equality filters and returns the expanded filter.\n */ function __PRIVATE_computeInExpansion(e) {\n var t, n;\n if (__PRIVATE_hardAssert(e instanceof FieldFilter || e instanceof CompositeFilter), \n e instanceof FieldFilter) {\n if (e instanceof __PRIVATE_InFilter) {\n const r = (null === (n = null === (t = e.value.arrayValue) || void 0 === t ? void 0 : t.values) || void 0 === n ? void 0 : n.map((t => FieldFilter.create(e.field, \"==\" /* Operator.EQUAL */ , t)))) || [];\n return CompositeFilter.create(r, \"or\" /* CompositeOperator.OR */);\n }\n // We have reached other kinds of field filters.\n return e;\n }\n // We have a composite filter.\n const r = e.filters.map((e => __PRIVATE_computeInExpansion(e)));\n return CompositeFilter.create(r, e.op);\n}\n\n/**\n * Given a composite filter, returns the list of terms in its disjunctive normal form.\n *\n *

    Each element in the return value is one term of the resulting DNF. For instance: For the\n * input: (A || B) && C, the DNF form is: (A && C) || (B && C), and the return value is a list\n * with two elements: a composite filter that performs (A && C), and a composite filter that\n * performs (B && C).\n *\n * @param filter the composite filter to calculate DNF transform for.\n * @return the terms in the DNF transform.\n */ function __PRIVATE_getDnfTerms(e) {\n if (0 === e.getFilters().length) return [];\n const t = __PRIVATE_computeDistributedNormalForm(__PRIVATE_computeInExpansion(e));\n return __PRIVATE_hardAssert(__PRIVATE_isDisjunctiveNormalForm(t)), __PRIVATE_isSingleFieldFilter(t) || __PRIVATE_isFlatConjunction(t) ? [ t ] : t.getFilters();\n}\n\n/** Returns true if the given filter is a single field filter. e.g. (a == 10). */ function __PRIVATE_isSingleFieldFilter(e) {\n return e instanceof FieldFilter;\n}\n\n/**\n * Returns true if the given filter is the conjunction of one or more field filters. e.g. (a == 10\n * && b == 20)\n */ function __PRIVATE_isFlatConjunction(e) {\n return e instanceof CompositeFilter && __PRIVATE_compositeFilterIsFlatConjunction(e);\n}\n\n/**\n * Returns whether or not the given filter is in disjunctive normal form (DNF).\n *\n *

    In boolean logic, a disjunctive normal form (DNF) is a canonical normal form of a logical\n * formula consisting of a disjunction of conjunctions; it can also be described as an OR of ANDs.\n *\n *

    For more info, visit: https://en.wikipedia.org/wiki/Disjunctive_normal_form\n */ function __PRIVATE_isDisjunctiveNormalForm(e) {\n return __PRIVATE_isSingleFieldFilter(e) || __PRIVATE_isFlatConjunction(e) || \n /**\n * Returns true if the given filter is the disjunction of one or more \"flat conjunctions\" and\n * field filters. e.g. (a == 10) || (b==20 && c==30)\n */\n function __PRIVATE_isDisjunctionOfFieldFiltersAndFlatConjunctions(e) {\n if (e instanceof CompositeFilter && __PRIVATE_compositeFilterIsDisjunction(e)) {\n for (const t of e.getFilters()) if (!__PRIVATE_isSingleFieldFilter(t) && !__PRIVATE_isFlatConjunction(t)) return !1;\n return !0;\n }\n return !1;\n }(e);\n}\n\nfunction __PRIVATE_computeDistributedNormalForm(e) {\n if (__PRIVATE_hardAssert(e instanceof FieldFilter || e instanceof CompositeFilter), \n e instanceof FieldFilter) return e;\n if (1 === e.filters.length) return __PRIVATE_computeDistributedNormalForm(e.filters[0]);\n // Compute DNF for each of the subfilters first\n const t = e.filters.map((e => __PRIVATE_computeDistributedNormalForm(e)));\n let n = CompositeFilter.create(t, e.op);\n return n = __PRIVATE_applyAssociation(n), __PRIVATE_isDisjunctiveNormalForm(n) ? n : (__PRIVATE_hardAssert(n instanceof CompositeFilter), \n __PRIVATE_hardAssert(__PRIVATE_compositeFilterIsConjunction(n)), __PRIVATE_hardAssert(n.filters.length > 1), \n n.filters.reduce(((e, t) => __PRIVATE_applyDistribution(e, t))));\n}\n\nfunction __PRIVATE_applyDistribution(e, t) {\n let n;\n return __PRIVATE_hardAssert(e instanceof FieldFilter || e instanceof CompositeFilter), \n __PRIVATE_hardAssert(t instanceof FieldFilter || t instanceof CompositeFilter), \n // FieldFilter FieldFilter\n n = e instanceof FieldFilter ? t instanceof FieldFilter ? function __PRIVATE_applyDistributionFieldFilters(e, t) {\n // Conjunction distribution for two field filters is the conjunction of them.\n return CompositeFilter.create([ e, t ], \"and\" /* CompositeOperator.AND */);\n }(e, t) : __PRIVATE_applyDistributionFieldAndCompositeFilters(e, t) : t instanceof FieldFilter ? __PRIVATE_applyDistributionFieldAndCompositeFilters(t, e) : function __PRIVATE_applyDistributionCompositeFilters(e, t) {\n // There are four cases:\n // (A & B) & (C & D) --> (A & B & C & D)\n // (A & B) & (C | D) --> (A & B & C) | (A & B & D)\n // (A | B) & (C & D) --> (C & D & A) | (C & D & B)\n // (A | B) & (C | D) --> (A & C) | (A & D) | (B & C) | (B & D)\n // Case 1 is a merge.\n if (__PRIVATE_hardAssert(e.filters.length > 0 && t.filters.length > 0), __PRIVATE_compositeFilterIsConjunction(e) && __PRIVATE_compositeFilterIsConjunction(t)) return __PRIVATE_compositeFilterWithAddedFilters(e, t.getFilters());\n // Case 2,3,4 all have at least one side (lhs or rhs) that is a disjunction. In all three cases\n // we should take each element of the disjunction and distribute it over the other side, and\n // return the disjunction of the distribution results.\n const n = __PRIVATE_compositeFilterIsDisjunction(e) ? e : t, r = __PRIVATE_compositeFilterIsDisjunction(e) ? t : e, i = n.filters.map((e => __PRIVATE_applyDistribution(e, r)));\n return CompositeFilter.create(i, \"or\" /* CompositeOperator.OR */);\n }(e, t), __PRIVATE_applyAssociation(n);\n}\n\nfunction __PRIVATE_applyDistributionFieldAndCompositeFilters(e, t) {\n // There are two cases:\n // A & (B & C) --> (A & B & C)\n // A & (B | C) --> (A & B) | (A & C)\n if (__PRIVATE_compositeFilterIsConjunction(t)) \n // Case 1\n return __PRIVATE_compositeFilterWithAddedFilters(t, e.getFilters());\n {\n // Case 2\n const n = t.filters.map((t => __PRIVATE_applyDistribution(e, t)));\n return CompositeFilter.create(n, \"or\" /* CompositeOperator.OR */);\n }\n}\n\n/**\n * Applies the associativity property to the given filter and returns the resulting filter.\n *\n *

      \n *
    • A | (B | C) == (A | B) | C == (A | B | C)\n *
    • A & (B & C) == (A & B) & C == (A & B & C)\n *
    \n *\n *

    For more info, visit: https://en.wikipedia.org/wiki/Associative_property#Propositional_logic\n */ function __PRIVATE_applyAssociation(e) {\n if (__PRIVATE_hardAssert(e instanceof FieldFilter || e instanceof CompositeFilter), \n e instanceof FieldFilter) return e;\n const t = e.getFilters();\n // If the composite filter only contains 1 filter, apply associativity to it.\n if (1 === t.length) return __PRIVATE_applyAssociation(t[0]);\n // Associativity applied to a flat composite filter results is itself.\n if (__PRIVATE_compositeFilterIsFlat(e)) return e;\n // First apply associativity to all subfilters. This will in turn recursively apply\n // associativity to all nested composite filters and field filters.\n const n = t.map((e => __PRIVATE_applyAssociation(e))), r = [];\n // For composite subfilters that perform the same kind of logical operation as `compositeFilter`\n // take out their filters and add them to `compositeFilter`. For example:\n // compositeFilter = (A | (B | C | D))\n // compositeSubfilter = (B | C | D)\n // Result: (A | B | C | D)\n // Note that the `compositeSubfilter` has been eliminated, and its filters (B, C, D) have been\n // added to the top-level \"compositeFilter\".\n return n.forEach((t => {\n t instanceof FieldFilter ? r.push(t) : t instanceof CompositeFilter && (t.op === e.op ? \n // compositeFilter: (A | (B | C))\n // compositeSubfilter: (B | C)\n // Result: (A | B | C)\n r.push(...t.filters) : \n // compositeFilter: (A | (B & C))\n // compositeSubfilter: (B & C)\n // Result: (A | (B & C))\n r.push(t));\n })), 1 === r.length ? r[0] : CompositeFilter.create(r, e.op);\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An in-memory implementation of IndexManager.\n */ class __PRIVATE_MemoryIndexManager {\n constructor() {\n this.un = new __PRIVATE_MemoryCollectionParentIndex;\n }\n addToCollectionParentIndex(e, t) {\n return this.un.add(t), PersistencePromise.resolve();\n }\n getCollectionParents(e, t) {\n return PersistencePromise.resolve(this.un.getEntries(t));\n }\n addFieldIndex(e, t) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n deleteFieldIndex(e, t) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n deleteAllFieldIndexes(e) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n createTargetIndexes(e, t) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n getDocumentsMatchingTarget(e, t) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve(null);\n }\n getIndexType(e, t) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve(0 /* IndexType.NONE */);\n }\n getFieldIndexes(e, t) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve([]);\n }\n getNextCollectionGroupToUpdate(e) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve(null);\n }\n getMinOffset(e, t) {\n return PersistencePromise.resolve(IndexOffset.min());\n }\n getMinOffsetFromCollectionGroup(e, t) {\n return PersistencePromise.resolve(IndexOffset.min());\n }\n updateCollectionGroup(e, t, n) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n updateIndexEntries(e, t) {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n}\n\n/**\n * Internal implementation of the collection-parent index exposed by MemoryIndexManager.\n * Also used for in-memory caching by IndexedDbIndexManager and initial index population\n * in indexeddb_schema.ts\n */ class __PRIVATE_MemoryCollectionParentIndex {\n constructor() {\n this.index = {};\n }\n // Returns false if the entry already existed.\n add(e) {\n const t = e.lastSegment(), n = e.popLast(), r = this.index[t] || new SortedSet(ResourcePath.comparator), i = !r.has(n);\n return this.index[t] = r.add(n), i;\n }\n has(e) {\n const t = e.lastSegment(), n = e.popLast(), r = this.index[t];\n return r && r.has(n);\n }\n getEntries(e) {\n return (this.index[e] || new SortedSet(ResourcePath.comparator)).toArray();\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const Ae = new Uint8Array(0);\n\n/**\n * A persisted implementation of IndexManager.\n *\n * PORTING NOTE: Unlike iOS and Android, the Web SDK does not memoize index\n * data as it supports multi-tab access.\n */\nclass __PRIVATE_IndexedDbIndexManager {\n constructor(e, t) {\n this.databaseId = t, \n /**\n * An in-memory copy of the index entries we've already written since the SDK\n * launched. Used to avoid re-writing the same entry repeatedly.\n *\n * This is *NOT* a complete cache of what's in persistence and so can never be\n * used to satisfy reads.\n */\n this.cn = new __PRIVATE_MemoryCollectionParentIndex, \n /**\n * Maps from a target to its equivalent list of sub-targets. Each sub-target\n * contains only one term from the target's disjunctive normal form (DNF).\n */\n this.ln = new ObjectMap((e => __PRIVATE_canonifyTarget(e)), ((e, t) => __PRIVATE_targetEquals(e, t))), \n this.uid = e.uid || \"\";\n }\n /**\n * Adds a new entry to the collection parent index.\n *\n * Repeated calls for the same collectionPath should be avoided within a\n * transaction as IndexedDbIndexManager only caches writes once a transaction\n * has been committed.\n */ addToCollectionParentIndex(e, t) {\n if (!this.cn.has(t)) {\n const n = t.lastSegment(), r = t.popLast();\n e.addOnCommittedListener((() => {\n // Add the collection to the in memory cache only if the transaction was\n // successfully committed.\n this.cn.add(t);\n }));\n const i = {\n collectionId: n,\n parent: __PRIVATE_encodeResourcePath(r)\n };\n return __PRIVATE_collectionParentsStore(e).put(i);\n }\n return PersistencePromise.resolve();\n }\n getCollectionParents(e, t) {\n const n = [], r = IDBKeyRange.bound([ t, \"\" ], [ __PRIVATE_immediateSuccessor(t), \"\" ], \n /*lowerOpen=*/ !1, \n /*upperOpen=*/ !0);\n return __PRIVATE_collectionParentsStore(e).U(r).next((e => {\n for (const r of e) {\n // This collectionId guard shouldn't be necessary (and isn't as long\n // as we're running in a real browser), but there's a bug in\n // indexeddbshim that breaks our range in our tests running in node:\n // https://github.com/axemclion/IndexedDBShim/issues/334\n if (r.collectionId !== t) break;\n n.push(__PRIVATE_decodeResourcePath(r.parent));\n }\n return n;\n }));\n }\n addFieldIndex(e, t) {\n // TODO(indexing): Verify that the auto-incrementing index ID works in\n // Safari & Firefox.\n const n = __PRIVATE_indexConfigurationStore(e), r = function __PRIVATE_toDbIndexConfiguration(e) {\n return {\n indexId: e.indexId,\n collectionGroup: e.collectionGroup,\n fields: e.fields.map((e => [ e.fieldPath.canonicalString(), e.kind ]))\n };\n }(t);\n delete r.indexId;\n // `indexId` is auto-populated by IndexedDb\n const i = n.add(r);\n if (t.indexState) {\n const n = __PRIVATE_indexStateStore(e);\n return i.next((e => {\n n.put(__PRIVATE_toDbIndexState(e, this.uid, t.indexState.sequenceNumber, t.indexState.offset));\n }));\n }\n return i.next();\n }\n deleteFieldIndex(e, t) {\n const n = __PRIVATE_indexConfigurationStore(e), r = __PRIVATE_indexStateStore(e), i = __PRIVATE_indexEntriesStore(e);\n return n.delete(t.indexId).next((() => r.delete(IDBKeyRange.bound([ t.indexId ], [ t.indexId + 1 ], \n /*lowerOpen=*/ !1, \n /*upperOpen=*/ !0)))).next((() => i.delete(IDBKeyRange.bound([ t.indexId ], [ t.indexId + 1 ], \n /*lowerOpen=*/ !1, \n /*upperOpen=*/ !0))));\n }\n deleteAllFieldIndexes(e) {\n const t = __PRIVATE_indexConfigurationStore(e), n = __PRIVATE_indexEntriesStore(e), r = __PRIVATE_indexStateStore(e);\n return t.j().next((() => n.j())).next((() => r.j()));\n }\n createTargetIndexes(e, t) {\n return PersistencePromise.forEach(this.hn(t), (t => this.getIndexType(e, t).next((n => {\n if (0 /* IndexType.NONE */ === n || 1 /* IndexType.PARTIAL */ === n) {\n const n = new __PRIVATE_TargetIndexMatcher(t).an();\n if (null != n) return this.addFieldIndex(e, n);\n }\n }))));\n }\n getDocumentsMatchingTarget(e, t) {\n const n = __PRIVATE_indexEntriesStore(e);\n let r = !0;\n const i = new Map;\n return PersistencePromise.forEach(this.hn(t), (t => this.Pn(e, t).next((e => {\n r && (r = !!e), i.set(t, e);\n })))).next((() => {\n if (r) {\n let e = __PRIVATE_documentKeySet();\n const r = [];\n return PersistencePromise.forEach(i, ((i, s) => {\n __PRIVATE_logDebug(\"IndexedDbIndexManager\", `Using index ${function __PRIVATE_fieldIndexToString(e) {\n return `id=${e.indexId}|cg=${e.collectionGroup}|f=${e.fields.map((e => `${e.fieldPath}:${e.kind}`)).join(\",\")}`;\n }(i)} to execute ${__PRIVATE_canonifyTarget(t)}`);\n const o = function __PRIVATE_targetGetArrayValues(e, t) {\n const n = __PRIVATE_fieldIndexGetArraySegment(t);\n if (void 0 === n) return null;\n for (const t of __PRIVATE_targetGetFieldFiltersForPath(e, n.fieldPath)) switch (t.op) {\n case \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ :\n return t.value.arrayValue.values || [];\n\n case \"array-contains\" /* Operator.ARRAY_CONTAINS */ :\n return [ t.value ];\n // Remaining filters are not array filters.\n }\n return null;\n }\n /**\n * Returns the list of values that are used in != or NOT_IN filters. Returns\n * `null` if there are no such filters.\n */ (s, i), _ = function __PRIVATE_targetGetNotInValues(e, t) {\n const n = new Map;\n for (const r of __PRIVATE_fieldIndexGetDirectionalSegments(t)) for (const t of __PRIVATE_targetGetFieldFiltersForPath(e, r.fieldPath)) switch (t.op) {\n case \"==\" /* Operator.EQUAL */ :\n case \"in\" /* Operator.IN */ :\n // Encode equality prefix, which is encoded in the index value before\n // the inequality (e.g. `a == 'a' && b != 'b'` is encoded to\n // `value != 'ab'`).\n n.set(r.fieldPath.canonicalString(), t.value);\n break;\n\n case \"not-in\" /* Operator.NOT_IN */ :\n case \"!=\" /* Operator.NOT_EQUAL */ :\n // NotIn/NotEqual is always a suffix. There cannot be any remaining\n // segments and hence we can return early here.\n return n.set(r.fieldPath.canonicalString(), t.value), Array.from(n.values());\n // Remaining filters cannot be used as notIn bounds.\n }\n return null;\n }\n /**\n * Returns a lower bound of field values that can be used as a starting point to\n * scan the index defined by `fieldIndex`. Returns `MIN_VALUE` if no lower bound\n * exists.\n */ (s, i), a = function __PRIVATE_targetGetLowerBound(e, t) {\n const n = [];\n let r = !0;\n // For each segment, retrieve a lower bound if there is a suitable filter or\n // startAt.\n for (const i of __PRIVATE_fieldIndexGetDirectionalSegments(t)) {\n const t = 0 /* IndexKind.ASCENDING */ === i.kind ? __PRIVATE_targetGetAscendingBound(e, i.fieldPath, e.startAt) : __PRIVATE_targetGetDescendingBound(e, i.fieldPath, e.startAt);\n n.push(t.value), r && (r = t.inclusive);\n }\n return new Bound(n, r);\n }\n /**\n * Returns an upper bound of field values that can be used as an ending point\n * when scanning the index defined by `fieldIndex`. Returns `MAX_VALUE` if no\n * upper bound exists.\n */ (s, i), u = function __PRIVATE_targetGetUpperBound(e, t) {\n const n = [];\n let r = !0;\n // For each segment, retrieve an upper bound if there is a suitable filter or\n // endAt.\n for (const i of __PRIVATE_fieldIndexGetDirectionalSegments(t)) {\n const t = 0 /* IndexKind.ASCENDING */ === i.kind ? __PRIVATE_targetGetDescendingBound(e, i.fieldPath, e.endAt) : __PRIVATE_targetGetAscendingBound(e, i.fieldPath, e.endAt);\n n.push(t.value), r && (r = t.inclusive);\n }\n return new Bound(n, r);\n }(s, i), c = this.In(i, s, a), l = this.In(i, s, u), h = this.Tn(i, s, _), P = this.En(i.indexId, o, c, a.inclusive, l, u.inclusive, h);\n return PersistencePromise.forEach(P, (i => n.G(i, t.limit).next((t => {\n t.forEach((t => {\n const n = DocumentKey.fromSegments(t.documentKey);\n e.has(n) || (e = e.add(n), r.push(n));\n }));\n }))));\n })).next((() => r));\n }\n return PersistencePromise.resolve(null);\n }));\n }\n hn(e) {\n let t = this.ln.get(e);\n if (t) return t;\n if (0 === e.filters.length) t = [ e ]; else {\n t = __PRIVATE_getDnfTerms(CompositeFilter.create(e.filters, \"and\" /* CompositeOperator.AND */)).map((t => __PRIVATE_newTarget(e.path, e.collectionGroup, e.orderBy, t.getFilters(), e.limit, e.startAt, e.endAt)));\n }\n return this.ln.set(e, t), t;\n }\n /**\n * Constructs a key range query on `DbIndexEntryStore` that unions all\n * bounds.\n */ En(e, t, n, r, i, s, o) {\n // The number of total index scans we union together. This is similar to a\n // distributed normal form, but adapted for array values. We create a single\n // index range per value in an ARRAY_CONTAINS or ARRAY_CONTAINS_ANY filter\n // combined with the values from the query bounds.\n const _ = (null != t ? t.length : 1) * Math.max(n.length, i.length), a = _ / (null != t ? t.length : 1), u = [];\n for (let c = 0; c < _; ++c) {\n const _ = t ? this.dn(t[c / a]) : Ae, l = this.An(e, _, n[c % a], r), h = this.Rn(e, _, i[c % a], s), P = o.map((t => this.An(e, _, t, \n /* inclusive= */ !0)));\n u.push(...this.createRange(l, h, P));\n }\n return u;\n }\n /** Generates the lower bound for `arrayValue` and `directionalValue`. */ An(e, t, n, r) {\n const i = new __PRIVATE_IndexEntry(e, DocumentKey.empty(), t, n);\n return r ? i : i.Zt();\n }\n /** Generates the upper bound for `arrayValue` and `directionalValue`. */ Rn(e, t, n, r) {\n const i = new __PRIVATE_IndexEntry(e, DocumentKey.empty(), t, n);\n return r ? i.Zt() : i;\n }\n Pn(e, t) {\n const n = new __PRIVATE_TargetIndexMatcher(t), r = null != t.collectionGroup ? t.collectionGroup : t.path.lastSegment();\n return this.getFieldIndexes(e, r).next((e => {\n // Return the index with the most number of segments.\n let t = null;\n for (const r of e) {\n n.rn(r) && (!t || r.fields.length > t.fields.length) && (t = r);\n }\n return t;\n }));\n }\n getIndexType(e, t) {\n let n = 2 /* IndexType.FULL */;\n const r = this.hn(t);\n return PersistencePromise.forEach(r, (t => this.Pn(e, t).next((e => {\n e ? 0 /* IndexType.NONE */ !== n && e.fields.length < function __PRIVATE_targetGetSegmentCount(e) {\n let t = new SortedSet(FieldPath$1.comparator), n = !1;\n for (const r of e.filters) for (const e of r.getFlattenedFilters()) \n // __name__ is not an explicit segment of any index, so we don't need to\n // count it.\n e.field.isKeyField() || (\n // ARRAY_CONTAINS or ARRAY_CONTAINS_ANY filters must be counted separately.\n // For instance, it is possible to have an index for \"a ARRAY a ASC\". Even\n // though these are on the same field, they should be counted as two\n // separate segments in an index.\n \"array-contains\" /* Operator.ARRAY_CONTAINS */ === e.op || \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ === e.op ? n = !0 : t = t.add(e.field));\n for (const n of e.orderBy) \n // __name__ is not an explicit segment of any index, so we don't need to\n // count it.\n n.field.isKeyField() || (t = t.add(n.field));\n return t.size + (n ? 1 : 0);\n }(t) && (n = 1 /* IndexType.PARTIAL */) : n = 0 /* IndexType.NONE */;\n })))).next((() => \n // OR queries have more than one sub-target (one sub-target per DNF term). We currently consider\n // OR queries that have a `limit` to have a partial index. For such queries we perform sorting\n // and apply the limit in memory as a post-processing step.\n function __PRIVATE_targetHasLimit(e) {\n return null !== e.limit;\n }(t) && r.length > 1 && 2 /* IndexType.FULL */ === n ? 1 /* IndexType.PARTIAL */ : n));\n }\n /**\n * Returns the byte encoded form of the directional values in the field index.\n * Returns `null` if the document does not have all fields specified in the\n * index.\n */ Vn(e, t) {\n const n = new __PRIVATE_IndexByteEncoder;\n for (const r of __PRIVATE_fieldIndexGetDirectionalSegments(e)) {\n const e = t.data.field(r.fieldPath);\n if (null == e) return null;\n const i = n.Yt(r.kind);\n __PRIVATE_FirestoreIndexValueWriter.vt.It(e, i);\n }\n return n.zt();\n }\n /** Encodes a single value to the ascending index format. */ dn(e) {\n const t = new __PRIVATE_IndexByteEncoder;\n return __PRIVATE_FirestoreIndexValueWriter.vt.It(e, t.Yt(0 /* IndexKind.ASCENDING */)), \n t.zt();\n }\n /**\n * Returns an encoded form of the document key that sorts based on the key\n * ordering of the field index.\n */ mn(e, t) {\n const n = new __PRIVATE_IndexByteEncoder;\n return __PRIVATE_FirestoreIndexValueWriter.vt.It(__PRIVATE_refValue(this.databaseId, t), n.Yt(function __PRIVATE_fieldIndexGetKeyOrder(e) {\n const t = __PRIVATE_fieldIndexGetDirectionalSegments(e);\n return 0 === t.length ? 0 /* IndexKind.ASCENDING */ : t[t.length - 1].kind;\n }(e))), n.zt();\n }\n /**\n * Encodes the given field values according to the specification in `target`.\n * For IN queries, a list of possible values is returned.\n */ Tn(e, t, n) {\n if (null === n) return [];\n let r = [];\n r.push(new __PRIVATE_IndexByteEncoder);\n let i = 0;\n for (const s of __PRIVATE_fieldIndexGetDirectionalSegments(e)) {\n const e = n[i++];\n for (const n of r) if (this.fn(t, s.fieldPath) && isArray(e)) r = this.gn(r, s, e); else {\n const t = n.Yt(s.kind);\n __PRIVATE_FirestoreIndexValueWriter.vt.It(e, t);\n }\n }\n return this.pn(r);\n }\n /**\n * Encodes the given bounds according to the specification in `target`. For IN\n * queries, a list of possible values is returned.\n */ In(e, t, n) {\n return this.Tn(e, t, n.position);\n }\n /** Returns the byte representation for the provided encoders. */ pn(e) {\n const t = [];\n for (let n = 0; n < e.length; ++n) t[n] = e[n].zt();\n return t;\n }\n /**\n * Creates a separate encoder for each element of an array.\n *\n * The method appends each value to all existing encoders (e.g. filter(\"a\",\n * \"==\", \"a1\").filter(\"b\", \"in\", [\"b1\", \"b2\"]) becomes [\"a1,b1\", \"a1,b2\"]). A\n * list of new encoders is returned.\n */ gn(e, t, n) {\n const r = [ ...e ], i = [];\n for (const e of n.arrayValue.values || []) for (const n of r) {\n const r = new __PRIVATE_IndexByteEncoder;\n r.seed(n.zt()), __PRIVATE_FirestoreIndexValueWriter.vt.It(e, r.Yt(t.kind)), i.push(r);\n }\n return i;\n }\n fn(e, t) {\n return !!e.filters.find((e => e instanceof FieldFilter && e.field.isEqual(t) && (\"in\" /* Operator.IN */ === e.op || \"not-in\" /* Operator.NOT_IN */ === e.op)));\n }\n getFieldIndexes(e, t) {\n const n = __PRIVATE_indexConfigurationStore(e), r = __PRIVATE_indexStateStore(e);\n return (t ? n.U(\"collectionGroupIndex\", IDBKeyRange.bound(t, t)) : n.U()).next((e => {\n const t = [];\n return PersistencePromise.forEach(e, (e => r.get([ e.indexId, this.uid ]).next((n => {\n t.push(function __PRIVATE_fromDbIndexConfiguration(e, t) {\n const n = t ? new IndexState(t.sequenceNumber, new IndexOffset(__PRIVATE_fromDbTimestamp(t.readTime), new DocumentKey(__PRIVATE_decodeResourcePath(t.documentKey)), t.largestBatchId)) : IndexState.empty(), r = e.fields.map((([e, t]) => new IndexSegment(FieldPath$1.fromServerFormat(e), t)));\n return new FieldIndex(e.indexId, e.collectionGroup, r, n);\n }(e, n));\n })))).next((() => t));\n }));\n }\n getNextCollectionGroupToUpdate(e) {\n return this.getFieldIndexes(e).next((e => 0 === e.length ? null : (e.sort(((e, t) => {\n const n = e.indexState.sequenceNumber - t.indexState.sequenceNumber;\n return 0 !== n ? n : __PRIVATE_primitiveComparator(e.collectionGroup, t.collectionGroup);\n })), e[0].collectionGroup)));\n }\n updateCollectionGroup(e, t, n) {\n const r = __PRIVATE_indexConfigurationStore(e), i = __PRIVATE_indexStateStore(e);\n return this.yn(e).next((e => r.U(\"collectionGroupIndex\", IDBKeyRange.bound(t, t)).next((t => PersistencePromise.forEach(t, (t => i.put(__PRIVATE_toDbIndexState(t.indexId, this.uid, e, n))))))));\n }\n updateIndexEntries(e, t) {\n // Porting Note: `getFieldIndexes()` on Web does not cache index lookups as\n // it could be used across different IndexedDB transactions. As any cached\n // data might be invalidated by other multi-tab clients, we can only trust\n // data within a single IndexedDB transaction. We therefore add a cache\n // here.\n const n = new Map;\n return PersistencePromise.forEach(t, ((t, r) => {\n const i = n.get(t.collectionGroup);\n return (i ? PersistencePromise.resolve(i) : this.getFieldIndexes(e, t.collectionGroup)).next((i => (n.set(t.collectionGroup, i), \n PersistencePromise.forEach(i, (n => this.wn(e, t, n).next((t => {\n const i = this.Sn(r, n);\n return t.isEqual(i) ? PersistencePromise.resolve() : this.bn(e, r, n, t, i);\n })))))));\n }));\n }\n Dn(e, t, n, r) {\n return __PRIVATE_indexEntriesStore(e).put({\n indexId: r.indexId,\n uid: this.uid,\n arrayValue: r.arrayValue,\n directionalValue: r.directionalValue,\n orderedDocumentKey: this.mn(n, t.key),\n documentKey: t.key.path.toArray()\n });\n }\n vn(e, t, n, r) {\n return __PRIVATE_indexEntriesStore(e).delete([ r.indexId, this.uid, r.arrayValue, r.directionalValue, this.mn(n, t.key), t.key.path.toArray() ]);\n }\n wn(e, t, n) {\n const r = __PRIVATE_indexEntriesStore(e);\n let i = new SortedSet(__PRIVATE_indexEntryComparator);\n return r.J({\n index: \"documentKeyIndex\",\n range: IDBKeyRange.only([ n.indexId, this.uid, this.mn(n, t) ])\n }, ((e, r) => {\n i = i.add(new __PRIVATE_IndexEntry(n.indexId, t, r.arrayValue, r.directionalValue));\n })).next((() => i));\n }\n /** Creates the index entries for the given document. */ Sn(e, t) {\n let n = new SortedSet(__PRIVATE_indexEntryComparator);\n const r = this.Vn(t, e);\n if (null == r) return n;\n const i = __PRIVATE_fieldIndexGetArraySegment(t);\n if (null != i) {\n const s = e.data.field(i.fieldPath);\n if (isArray(s)) for (const i of s.arrayValue.values || []) n = n.add(new __PRIVATE_IndexEntry(t.indexId, e.key, this.dn(i), r));\n } else n = n.add(new __PRIVATE_IndexEntry(t.indexId, e.key, Ae, r));\n return n;\n }\n /**\n * Updates the index entries for the provided document by deleting entries\n * that are no longer referenced in `newEntries` and adding all newly added\n * entries.\n */ bn(e, t, n, r, i) {\n __PRIVATE_logDebug(\"IndexedDbIndexManager\", \"Updating index entries for document '%s'\", t.key);\n const s = [];\n return function __PRIVATE_diffSortedSets(e, t, n, r, i) {\n const s = e.getIterator(), o = t.getIterator();\n let _ = __PRIVATE_advanceIterator(s), a = __PRIVATE_advanceIterator(o);\n // Walk through the two sets at the same time, using the ordering defined by\n // `comparator`.\n for (;_ || a; ) {\n let e = !1, t = !1;\n if (_ && a) {\n const r = n(_, a);\n r < 0 ? \n // The element was removed if the next element in our ordered\n // walkthrough is only in `before`.\n t = !0 : r > 0 && (\n // The element was added if the next element in our ordered walkthrough\n // is only in `after`.\n e = !0);\n } else null != _ ? t = !0 : e = !0;\n e ? (r(a), a = __PRIVATE_advanceIterator(o)) : t ? (i(_), _ = __PRIVATE_advanceIterator(s)) : (_ = __PRIVATE_advanceIterator(s), \n a = __PRIVATE_advanceIterator(o));\n }\n }(r, i, __PRIVATE_indexEntryComparator, (\n /* onAdd= */ r => {\n s.push(this.Dn(e, t, n, r));\n }), (\n /* onRemove= */ r => {\n s.push(this.vn(e, t, n, r));\n })), PersistencePromise.waitFor(s);\n }\n yn(e) {\n let t = 1;\n return __PRIVATE_indexStateStore(e).J({\n index: \"sequenceNumberIndex\",\n reverse: !0,\n range: IDBKeyRange.upperBound([ this.uid, Number.MAX_SAFE_INTEGER ])\n }, ((e, n, r) => {\n r.done(), t = n.sequenceNumber + 1;\n })).next((() => t));\n }\n /**\n * Returns a new set of IDB ranges that splits the existing range and excludes\n * any values that match the `notInValue` from these ranges. As an example,\n * '[foo > 2 && foo != 3]` becomes `[foo > 2 && < 3, foo > 3]`.\n */ createRange(e, t, n) {\n // The notIn values need to be sorted and unique so that we can return a\n // sorted set of non-overlapping ranges.\n n = n.sort(((e, t) => __PRIVATE_indexEntryComparator(e, t))).filter(((e, t, n) => !t || 0 !== __PRIVATE_indexEntryComparator(e, n[t - 1])));\n const r = [];\n r.push(e);\n for (const i of n) {\n const n = __PRIVATE_indexEntryComparator(i, e), s = __PRIVATE_indexEntryComparator(i, t);\n if (0 === n) \n // `notInValue` is the lower bound. We therefore need to raise the bound\n // to the next value.\n r[0] = e.Zt(); else if (n > 0 && s < 0) \n // `notInValue` is in the middle of the range\n r.push(i), r.push(i.Zt()); else if (s > 0) \n // `notInValue` (and all following values) are out of the range\n break;\n }\n r.push(t);\n const i = [];\n for (let e = 0; e < r.length; e += 2) {\n // If we encounter two bounds that will create an unmatchable key range,\n // then we return an empty set of key ranges.\n if (this.Cn(r[e], r[e + 1])) return [];\n const t = [ r[e].indexId, this.uid, r[e].arrayValue, r[e].directionalValue, Ae, [] ], n = [ r[e + 1].indexId, this.uid, r[e + 1].arrayValue, r[e + 1].directionalValue, Ae, [] ];\n i.push(IDBKeyRange.bound(t, n));\n }\n return i;\n }\n Cn(e, t) {\n // If lower bound is greater than the upper bound, then the key\n // range can never be matched.\n return __PRIVATE_indexEntryComparator(e, t) > 0;\n }\n getMinOffsetFromCollectionGroup(e, t) {\n return this.getFieldIndexes(e, t).next(__PRIVATE_getMinOffsetFromFieldIndexes);\n }\n getMinOffset(e, t) {\n return PersistencePromise.mapArray(this.hn(t), (t => this.Pn(e, t).next((e => e || fail())))).next(__PRIVATE_getMinOffsetFromFieldIndexes);\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the collectionParents\n * document store.\n */ function __PRIVATE_collectionParentsStore(e) {\n return __PRIVATE_getStore(e, \"collectionParents\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the index entry object store.\n */ function __PRIVATE_indexEntriesStore(e) {\n return __PRIVATE_getStore(e, \"indexEntries\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the index configuration object store.\n */ function __PRIVATE_indexConfigurationStore(e) {\n return __PRIVATE_getStore(e, \"indexConfiguration\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the index state object store.\n */ function __PRIVATE_indexStateStore(e) {\n return __PRIVATE_getStore(e, \"indexState\");\n}\n\nfunction __PRIVATE_getMinOffsetFromFieldIndexes(e) {\n __PRIVATE_hardAssert(0 !== e.length);\n let t = e[0].indexState.offset, n = t.largestBatchId;\n for (let r = 1; r < e.length; r++) {\n const i = e[r].indexState.offset;\n __PRIVATE_indexOffsetComparator(i, t) < 0 && (t = i), n < i.largestBatchId && (n = i.largestBatchId);\n }\n return new IndexOffset(t.readTime, t.documentKey, n);\n}\n\n/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const Re = {\n didRun: !1,\n sequenceNumbersCollected: 0,\n targetsRemoved: 0,\n documentsRemoved: 0\n};\n\nclass LruParams {\n constructor(\n // When we attempt to collect, we will only do so if the cache size is greater than this\n // threshold. Passing `COLLECTION_DISABLED` here will cause collection to always be skipped.\n e, \n // The percentage of sequence numbers that we will attempt to collect\n t, \n // A cap on the total number of sequence numbers that will be collected. This prevents\n // us from collecting a huge number of sequence numbers if the cache has grown very large.\n n) {\n this.cacheSizeCollectionThreshold = e, this.percentileToCollect = t, this.maximumSequenceNumbersToCollect = n;\n }\n static withCacheSize(e) {\n return new LruParams(e, LruParams.DEFAULT_COLLECTION_PERCENTILE, LruParams.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Delete a mutation batch and the associated document mutations.\n * @returns A PersistencePromise of the document mutations that were removed.\n */\nfunction removeMutationBatch(e, t, n) {\n const r = e.store(\"mutations\"), i = e.store(\"documentMutations\"), s = [], o = IDBKeyRange.only(n.batchId);\n let _ = 0;\n const a = r.J({\n range: o\n }, ((e, t, n) => (_++, n.delete())));\n s.push(a.next((() => {\n __PRIVATE_hardAssert(1 === _);\n })));\n const u = [];\n for (const e of n.mutations) {\n const r = __PRIVATE_newDbDocumentMutationKey(t, e.key.path, n.batchId);\n s.push(i.delete(r)), u.push(e.key);\n }\n return PersistencePromise.waitFor(s).next((() => u));\n}\n\n/**\n * Returns an approximate size for the given document.\n */ function __PRIVATE_dbDocumentSize(e) {\n if (!e) return 0;\n let t;\n if (e.document) t = e.document; else if (e.unknownDocument) t = e.unknownDocument; else {\n if (!e.noDocument) throw fail();\n t = e.noDocument;\n }\n return JSON.stringify(t).length;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** A mutation queue for a specific user, backed by IndexedDB. */ LruParams.DEFAULT_COLLECTION_PERCENTILE = 10, \nLruParams.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT = 1e3, LruParams.DEFAULT = new LruParams(41943040, LruParams.DEFAULT_COLLECTION_PERCENTILE, LruParams.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT), \nLruParams.DISABLED = new LruParams(-1, 0, 0);\n\nclass __PRIVATE_IndexedDbMutationQueue {\n constructor(\n /**\n * The normalized userId (e.g. null UID => \"\" userId) used to store /\n * retrieve mutations.\n */\n e, t, n, r) {\n this.userId = e, this.serializer = t, this.indexManager = n, this.referenceDelegate = r, \n /**\n * Caches the document keys for pending mutation batches. If the mutation\n * has been removed from IndexedDb, the cached value may continue to\n * be used to retrieve the batch's document keys. To remove a cached value\n * locally, `removeCachedMutationKeys()` should be invoked either directly\n * or through `removeMutationBatches()`.\n *\n * With multi-tab, when the primary client acknowledges or rejects a mutation,\n * this cache is used by secondary clients to invalidate the local\n * view of the documents that were previously affected by the mutation.\n */\n // PORTING NOTE: Multi-tab only.\n this.Fn = {};\n }\n /**\n * Creates a new mutation queue for the given user.\n * @param user - The user for which to create a mutation queue.\n * @param serializer - The serializer to use when persisting to IndexedDb.\n */ static lt(e, t, n, r) {\n // TODO(mcg): Figure out what constraints there are on userIDs\n // In particular, are there any reserved characters? are empty ids allowed?\n // For the moment store these together in the same mutations table assuming\n // that empty userIDs aren't allowed.\n __PRIVATE_hardAssert(\"\" !== e.uid);\n const i = e.isAuthenticated() ? e.uid : \"\";\n return new __PRIVATE_IndexedDbMutationQueue(i, t, n, r);\n }\n checkEmpty(e) {\n let t = !0;\n const n = IDBKeyRange.bound([ this.userId, Number.NEGATIVE_INFINITY ], [ this.userId, Number.POSITIVE_INFINITY ]);\n return __PRIVATE_mutationsStore(e).J({\n index: \"userMutationsIndex\",\n range: n\n }, ((e, n, r) => {\n t = !1, r.done();\n })).next((() => t));\n }\n addMutationBatch(e, t, n, r) {\n const i = __PRIVATE_documentMutationsStore(e), s = __PRIVATE_mutationsStore(e);\n // The IndexedDb implementation in Chrome (and Firefox) does not handle\n // compound indices that include auto-generated keys correctly. To ensure\n // that the index entry is added correctly in all browsers, we perform two\n // writes: The first write is used to retrieve the next auto-generated Batch\n // ID, and the second write populates the index and stores the actual\n // mutation batch.\n // See: https://bugs.chromium.org/p/chromium/issues/detail?id=701972\n // We write an empty object to obtain key\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return s.add({}).next((o => {\n __PRIVATE_hardAssert(\"number\" == typeof o);\n const _ = new MutationBatch(o, t, n, r), a = function __PRIVATE_toDbMutationBatch(e, t, n) {\n const r = n.baseMutations.map((t => toMutation(e.ct, t))), i = n.mutations.map((t => toMutation(e.ct, t)));\n return {\n userId: t,\n batchId: n.batchId,\n localWriteTimeMs: n.localWriteTime.toMillis(),\n baseMutations: r,\n mutations: i\n };\n }(this.serializer, this.userId, _), u = [];\n let c = new SortedSet(((e, t) => __PRIVATE_primitiveComparator(e.canonicalString(), t.canonicalString())));\n for (const e of r) {\n const t = __PRIVATE_newDbDocumentMutationKey(this.userId, e.key.path, o);\n c = c.add(e.key.path.popLast()), u.push(s.put(a)), u.push(i.put(t, x));\n }\n return c.forEach((t => {\n u.push(this.indexManager.addToCollectionParentIndex(e, t));\n })), e.addOnCommittedListener((() => {\n this.Fn[o] = _.keys();\n })), PersistencePromise.waitFor(u).next((() => _));\n }));\n }\n lookupMutationBatch(e, t) {\n return __PRIVATE_mutationsStore(e).get(t).next((e => e ? (__PRIVATE_hardAssert(e.userId === this.userId), \n __PRIVATE_fromDbMutationBatch(this.serializer, e)) : null));\n }\n /**\n * Returns the document keys for the mutation batch with the given batchId.\n * For primary clients, this method returns `null` after\n * `removeMutationBatches()` has been called. Secondary clients return a\n * cached result until `removeCachedMutationKeys()` is invoked.\n */\n // PORTING NOTE: Multi-tab only.\n Mn(e, t) {\n return this.Fn[t] ? PersistencePromise.resolve(this.Fn[t]) : this.lookupMutationBatch(e, t).next((e => {\n if (e) {\n const n = e.keys();\n return this.Fn[t] = n, n;\n }\n return null;\n }));\n }\n getNextMutationBatchAfterBatchId(e, t) {\n const n = t + 1, r = IDBKeyRange.lowerBound([ this.userId, n ]);\n let i = null;\n return __PRIVATE_mutationsStore(e).J({\n index: \"userMutationsIndex\",\n range: r\n }, ((e, t, r) => {\n t.userId === this.userId && (__PRIVATE_hardAssert(t.batchId >= n), i = __PRIVATE_fromDbMutationBatch(this.serializer, t)), \n r.done();\n })).next((() => i));\n }\n getHighestUnacknowledgedBatchId(e) {\n const t = IDBKeyRange.upperBound([ this.userId, Number.POSITIVE_INFINITY ]);\n let n = -1;\n return __PRIVATE_mutationsStore(e).J({\n index: \"userMutationsIndex\",\n range: t,\n reverse: !0\n }, ((e, t, r) => {\n n = t.batchId, r.done();\n })).next((() => n));\n }\n getAllMutationBatches(e) {\n const t = IDBKeyRange.bound([ this.userId, -1 ], [ this.userId, Number.POSITIVE_INFINITY ]);\n return __PRIVATE_mutationsStore(e).U(\"userMutationsIndex\", t).next((e => e.map((e => __PRIVATE_fromDbMutationBatch(this.serializer, e)))));\n }\n getAllMutationBatchesAffectingDocumentKey(e, t) {\n // Scan the document-mutation index starting with a prefix starting with\n // the given documentKey.\n const n = __PRIVATE_newDbDocumentMutationPrefixForPath(this.userId, t.path), r = IDBKeyRange.lowerBound(n), i = [];\n return __PRIVATE_documentMutationsStore(e).J({\n range: r\n }, ((n, r, s) => {\n const [o, _, a] = n, u = __PRIVATE_decodeResourcePath(_);\n // Only consider rows matching exactly the specific key of\n // interest. Note that because we order by path first, and we\n // order terminators before path separators, we'll encounter all\n // the index rows for documentKey contiguously. In particular, all\n // the rows for documentKey will occur before any rows for\n // documents nested in a subcollection beneath documentKey so we\n // can stop as soon as we hit any such row.\n if (o === this.userId && t.path.isEqual(u)) \n // Look up the mutation batch in the store.\n return __PRIVATE_mutationsStore(e).get(a).next((e => {\n if (!e) throw fail();\n __PRIVATE_hardAssert(e.userId === this.userId), i.push(__PRIVATE_fromDbMutationBatch(this.serializer, e));\n }));\n s.done();\n })).next((() => i));\n }\n getAllMutationBatchesAffectingDocumentKeys(e, t) {\n let n = new SortedSet(__PRIVATE_primitiveComparator);\n const r = [];\n return t.forEach((t => {\n const i = __PRIVATE_newDbDocumentMutationPrefixForPath(this.userId, t.path), s = IDBKeyRange.lowerBound(i), o = __PRIVATE_documentMutationsStore(e).J({\n range: s\n }, ((e, r, i) => {\n const [s, o, _] = e, a = __PRIVATE_decodeResourcePath(o);\n // Only consider rows matching exactly the specific key of\n // interest. Note that because we order by path first, and we\n // order terminators before path separators, we'll encounter all\n // the index rows for documentKey contiguously. In particular, all\n // the rows for documentKey will occur before any rows for\n // documents nested in a subcollection beneath documentKey so we\n // can stop as soon as we hit any such row.\n s === this.userId && t.path.isEqual(a) ? n = n.add(_) : i.done();\n }));\n r.push(o);\n })), PersistencePromise.waitFor(r).next((() => this.xn(e, n)));\n }\n getAllMutationBatchesAffectingQuery(e, t) {\n const n = t.path, r = n.length + 1, i = __PRIVATE_newDbDocumentMutationPrefixForPath(this.userId, n), s = IDBKeyRange.lowerBound(i);\n // Collect up unique batchIDs encountered during a scan of the index. Use a\n // SortedSet to accumulate batch IDs so they can be traversed in order in a\n // scan of the main table.\n let o = new SortedSet(__PRIVATE_primitiveComparator);\n return __PRIVATE_documentMutationsStore(e).J({\n range: s\n }, ((e, t, i) => {\n const [s, _, a] = e, u = __PRIVATE_decodeResourcePath(_);\n s === this.userId && n.isPrefixOf(u) ? \n // Rows with document keys more than one segment longer than the\n // query path can't be matches. For example, a query on 'rooms'\n // can't match the document /rooms/abc/messages/xyx.\n // TODO(mcg): we'll need a different scanner when we implement\n // ancestor queries.\n u.length === r && (o = o.add(a)) : i.done();\n })).next((() => this.xn(e, o)));\n }\n xn(e, t) {\n const n = [], r = [];\n // TODO(rockwood): Implement this using iterate.\n return t.forEach((t => {\n r.push(__PRIVATE_mutationsStore(e).get(t).next((e => {\n if (null === e) throw fail();\n __PRIVATE_hardAssert(e.userId === this.userId), n.push(__PRIVATE_fromDbMutationBatch(this.serializer, e));\n })));\n })), PersistencePromise.waitFor(r).next((() => n));\n }\n removeMutationBatch(e, t) {\n return removeMutationBatch(e._e, this.userId, t).next((n => (e.addOnCommittedListener((() => {\n this.On(t.batchId);\n })), PersistencePromise.forEach(n, (t => this.referenceDelegate.markPotentiallyOrphaned(e, t))))));\n }\n /**\n * Clears the cached keys for a mutation batch. This method should be\n * called by secondary clients after they process mutation updates.\n *\n * Note that this method does not have to be called from primary clients as\n * the corresponding cache entries are cleared when an acknowledged or\n * rejected batch is removed from the mutation queue.\n */\n // PORTING NOTE: Multi-tab only\n On(e) {\n delete this.Fn[e];\n }\n performConsistencyCheck(e) {\n return this.checkEmpty(e).next((t => {\n if (!t) return PersistencePromise.resolve();\n // Verify that there are no entries in the documentMutations index if\n // the queue is empty.\n const n = IDBKeyRange.lowerBound(\n /**\n * Creates a [userId] key for use in the DbDocumentMutations index to iterate\n * over all of a user's document mutations.\n */\n function __PRIVATE_newDbDocumentMutationPrefixForUser(e) {\n return [ e ];\n }(this.userId)), r = [];\n return __PRIVATE_documentMutationsStore(e).J({\n range: n\n }, ((e, t, n) => {\n if (e[0] === this.userId) {\n const t = __PRIVATE_decodeResourcePath(e[1]);\n r.push(t);\n } else n.done();\n })).next((() => {\n __PRIVATE_hardAssert(0 === r.length);\n }));\n }));\n }\n containsKey(e, t) {\n return __PRIVATE_mutationQueueContainsKey(e, this.userId, t);\n }\n // PORTING NOTE: Multi-tab only (state is held in memory in other clients).\n /** Returns the mutation queue's metadata from IndexedDb. */\n Nn(e) {\n return __PRIVATE_mutationQueuesStore(e).get(this.userId).next((e => e || {\n userId: this.userId,\n lastAcknowledgedBatchId: -1,\n lastStreamToken: \"\"\n }));\n }\n}\n\n/**\n * @returns true if the mutation queue for the given user contains a pending\n * mutation for the given key.\n */ function __PRIVATE_mutationQueueContainsKey(e, t, n) {\n const r = __PRIVATE_newDbDocumentMutationPrefixForPath(t, n.path), i = r[1], s = IDBKeyRange.lowerBound(r);\n let o = !1;\n return __PRIVATE_documentMutationsStore(e).J({\n range: s,\n H: !0\n }, ((e, n, r) => {\n const [s, _, /*batchID*/ a] = e;\n s === t && _ === i && (o = !0), r.done();\n })).next((() => o));\n}\n\n/** Returns true if any mutation queue contains the given document. */\n/**\n * Helper to get a typed SimpleDbStore for the mutations object store.\n */\nfunction __PRIVATE_mutationsStore(e) {\n return __PRIVATE_getStore(e, \"mutations\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the mutationQueues object store.\n */ function __PRIVATE_documentMutationsStore(e) {\n return __PRIVATE_getStore(e, \"documentMutations\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the mutationQueues object store.\n */ function __PRIVATE_mutationQueuesStore(e) {\n return __PRIVATE_getStore(e, \"mutationQueues\");\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Offset to ensure non-overlapping target ids. */\n/**\n * Generates monotonically increasing target IDs for sending targets to the\n * watch stream.\n *\n * The client constructs two generators, one for the target cache, and one for\n * for the sync engine (to generate limbo documents targets). These\n * generators produce non-overlapping IDs (by using even and odd IDs\n * respectively).\n *\n * By separating the target ID space, the query cache can generate target IDs\n * that persist across client restarts, while sync engine can independently\n * generate in-memory target IDs that are transient and can be reused after a\n * restart.\n */\nclass __PRIVATE_TargetIdGenerator {\n constructor(e) {\n this.Ln = e;\n }\n next() {\n return this.Ln += 2, this.Ln;\n }\n static Bn() {\n // The target cache generator must return '2' in its first call to `next()`\n // as there is no differentiation in the protocol layer between an unset\n // number and the number '0'. If we were to sent a target with target ID\n // '0', the backend would consider it unset and replace it with its own ID.\n return new __PRIVATE_TargetIdGenerator(0);\n }\n static kn() {\n // Sync engine assigns target IDs for limbo document detection.\n return new __PRIVATE_TargetIdGenerator(-1);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_IndexedDbTargetCache {\n constructor(e, t) {\n this.referenceDelegate = e, this.serializer = t;\n }\n // PORTING NOTE: We don't cache global metadata for the target cache, since\n // some of it (in particular `highestTargetId`) can be modified by secondary\n // tabs. We could perhaps be more granular (and e.g. still cache\n // `lastRemoteSnapshotVersion` in memory) but for simplicity we currently go\n // to IndexedDb whenever we need to read metadata. We can revisit if it turns\n // out to have a meaningful performance impact.\n allocateTargetId(e) {\n return this.qn(e).next((t => {\n const n = new __PRIVATE_TargetIdGenerator(t.highestTargetId);\n return t.highestTargetId = n.next(), this.Qn(e, t).next((() => t.highestTargetId));\n }));\n }\n getLastRemoteSnapshotVersion(e) {\n return this.qn(e).next((e => SnapshotVersion.fromTimestamp(new Timestamp(e.lastRemoteSnapshotVersion.seconds, e.lastRemoteSnapshotVersion.nanoseconds))));\n }\n getHighestSequenceNumber(e) {\n return this.qn(e).next((e => e.highestListenSequenceNumber));\n }\n setTargetsMetadata(e, t, n) {\n return this.qn(e).next((r => (r.highestListenSequenceNumber = t, n && (r.lastRemoteSnapshotVersion = n.toTimestamp()), \n t > r.highestListenSequenceNumber && (r.highestListenSequenceNumber = t), this.Qn(e, r))));\n }\n addTargetData(e, t) {\n return this.Kn(e, t).next((() => this.qn(e).next((n => (n.targetCount += 1, this.$n(t, n), \n this.Qn(e, n))))));\n }\n updateTargetData(e, t) {\n return this.Kn(e, t);\n }\n removeTargetData(e, t) {\n return this.removeMatchingKeysForTargetId(e, t.targetId).next((() => __PRIVATE_targetsStore(e).delete(t.targetId))).next((() => this.qn(e))).next((t => (__PRIVATE_hardAssert(t.targetCount > 0), \n t.targetCount -= 1, this.Qn(e, t))));\n }\n /**\n * Drops any targets with sequence number less than or equal to the upper bound, excepting those\n * present in `activeTargetIds`. Document associations for the removed targets are also removed.\n * Returns the number of targets removed.\n */ removeTargets(e, t, n) {\n let r = 0;\n const i = [];\n return __PRIVATE_targetsStore(e).J(((s, o) => {\n const _ = __PRIVATE_fromDbTarget(o);\n _.sequenceNumber <= t && null === n.get(_.targetId) && (r++, i.push(this.removeTargetData(e, _)));\n })).next((() => PersistencePromise.waitFor(i))).next((() => r));\n }\n /**\n * Call provided function with each `TargetData` that we have cached.\n */ forEachTarget(e, t) {\n return __PRIVATE_targetsStore(e).J(((e, n) => {\n const r = __PRIVATE_fromDbTarget(n);\n t(r);\n }));\n }\n qn(e) {\n return __PRIVATE_globalTargetStore(e).get(\"targetGlobalKey\").next((e => (__PRIVATE_hardAssert(null !== e), \n e)));\n }\n Qn(e, t) {\n return __PRIVATE_globalTargetStore(e).put(\"targetGlobalKey\", t);\n }\n Kn(e, t) {\n return __PRIVATE_targetsStore(e).put(__PRIVATE_toDbTarget(this.serializer, t));\n }\n /**\n * In-place updates the provided metadata to account for values in the given\n * TargetData. Saving is done separately. Returns true if there were any\n * changes to the metadata.\n */ $n(e, t) {\n let n = !1;\n return e.targetId > t.highestTargetId && (t.highestTargetId = e.targetId, n = !0), \n e.sequenceNumber > t.highestListenSequenceNumber && (t.highestListenSequenceNumber = e.sequenceNumber, \n n = !0), n;\n }\n getTargetCount(e) {\n return this.qn(e).next((e => e.targetCount));\n }\n getTargetData(e, t) {\n // Iterating by the canonicalId may yield more than one result because\n // canonicalId values are not required to be unique per target. This query\n // depends on the queryTargets index to be efficient.\n const n = __PRIVATE_canonifyTarget(t), r = IDBKeyRange.bound([ n, Number.NEGATIVE_INFINITY ], [ n, Number.POSITIVE_INFINITY ]);\n let i = null;\n return __PRIVATE_targetsStore(e).J({\n range: r,\n index: \"queryTargetsIndex\"\n }, ((e, n, r) => {\n const s = __PRIVATE_fromDbTarget(n);\n // After finding a potential match, check that the target is\n // actually equal to the requested target.\n __PRIVATE_targetEquals(t, s.target) && (i = s, r.done());\n })).next((() => i));\n }\n addMatchingKeys(e, t, n) {\n // PORTING NOTE: The reverse index (documentsTargets) is maintained by\n // IndexedDb.\n const r = [], i = __PRIVATE_documentTargetStore(e);\n return t.forEach((t => {\n const s = __PRIVATE_encodeResourcePath(t.path);\n r.push(i.put({\n targetId: n,\n path: s\n })), r.push(this.referenceDelegate.addReference(e, n, t));\n })), PersistencePromise.waitFor(r);\n }\n removeMatchingKeys(e, t, n) {\n // PORTING NOTE: The reverse index (documentsTargets) is maintained by\n // IndexedDb.\n const r = __PRIVATE_documentTargetStore(e);\n return PersistencePromise.forEach(t, (t => {\n const i = __PRIVATE_encodeResourcePath(t.path);\n return PersistencePromise.waitFor([ r.delete([ n, i ]), this.referenceDelegate.removeReference(e, n, t) ]);\n }));\n }\n removeMatchingKeysForTargetId(e, t) {\n const n = __PRIVATE_documentTargetStore(e), r = IDBKeyRange.bound([ t ], [ t + 1 ], \n /*lowerOpen=*/ !1, \n /*upperOpen=*/ !0);\n return n.delete(r);\n }\n getMatchingKeysForTargetId(e, t) {\n const n = IDBKeyRange.bound([ t ], [ t + 1 ], \n /*lowerOpen=*/ !1, \n /*upperOpen=*/ !0), r = __PRIVATE_documentTargetStore(e);\n let i = __PRIVATE_documentKeySet();\n return r.J({\n range: n,\n H: !0\n }, ((e, t, n) => {\n const r = __PRIVATE_decodeResourcePath(e[1]), s = new DocumentKey(r);\n i = i.add(s);\n })).next((() => i));\n }\n containsKey(e, t) {\n const n = __PRIVATE_encodeResourcePath(t.path), r = IDBKeyRange.bound([ n ], [ __PRIVATE_immediateSuccessor(n) ], \n /*lowerOpen=*/ !1, \n /*upperOpen=*/ !0);\n let i = 0;\n return __PRIVATE_documentTargetStore(e).J({\n index: \"documentTargetsIndex\",\n H: !0,\n range: r\n }, (([e, t], n, r) => {\n // Having a sentinel row for a document does not count as containing that document;\n // For the target cache, containing the document means the document is part of some\n // target.\n 0 !== e && (i++, r.done());\n })).next((() => i > 0));\n }\n /**\n * Looks up a TargetData entry by target ID.\n *\n * @param targetId - The target ID of the TargetData entry to look up.\n * @returns The cached TargetData entry, or null if the cache has no entry for\n * the target.\n */\n // PORTING NOTE: Multi-tab only.\n ot(e, t) {\n return __PRIVATE_targetsStore(e).get(t).next((e => e ? __PRIVATE_fromDbTarget(e) : null));\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the queries object store.\n */ function __PRIVATE_targetsStore(e) {\n return __PRIVATE_getStore(e, \"targets\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the target globals object store.\n */ function __PRIVATE_globalTargetStore(e) {\n return __PRIVATE_getStore(e, \"targetGlobal\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the document target object store.\n */ function __PRIVATE_documentTargetStore(e) {\n return __PRIVATE_getStore(e, \"targetDocuments\");\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ function __PRIVATE_bufferEntryComparator([e, t], [n, r]) {\n const i = __PRIVATE_primitiveComparator(e, n);\n return 0 === i ? __PRIVATE_primitiveComparator(t, r) : i;\n}\n\n/**\n * Used to calculate the nth sequence number. Keeps a rolling buffer of the\n * lowest n values passed to `addElement`, and finally reports the largest of\n * them in `maxValue`.\n */ class __PRIVATE_RollingSequenceNumberBuffer {\n constructor(e) {\n this.Un = e, this.buffer = new SortedSet(__PRIVATE_bufferEntryComparator), this.Wn = 0;\n }\n Gn() {\n return ++this.Wn;\n }\n zn(e) {\n const t = [ e, this.Gn() ];\n if (this.buffer.size < this.Un) this.buffer = this.buffer.add(t); else {\n const e = this.buffer.last();\n __PRIVATE_bufferEntryComparator(t, e) < 0 && (this.buffer = this.buffer.delete(e).add(t));\n }\n }\n get maxValue() {\n // Guaranteed to be non-empty. If we decide we are not collecting any\n // sequence numbers, nthSequenceNumber below short-circuits. If we have\n // decided that we are collecting n sequence numbers, it's because n is some\n // percentage of the existing sequence numbers. That means we should never\n // be in a situation where we are collecting sequence numbers but don't\n // actually have any.\n return this.buffer.last()[0];\n }\n}\n\n/**\n * This class is responsible for the scheduling of LRU garbage collection. It handles checking\n * whether or not GC is enabled, as well as which delay to use before the next run.\n */ class __PRIVATE_LruScheduler {\n constructor(e, t, n) {\n this.garbageCollector = e, this.asyncQueue = t, this.localStore = n, this.jn = null;\n }\n start() {\n -1 !== this.garbageCollector.params.cacheSizeCollectionThreshold && this.Hn(6e4);\n }\n stop() {\n this.jn && (this.jn.cancel(), this.jn = null);\n }\n get started() {\n return null !== this.jn;\n }\n Hn(e) {\n __PRIVATE_logDebug(\"LruGarbageCollector\", `Garbage collection scheduled in ${e}ms`), \n this.jn = this.asyncQueue.enqueueAfterDelay(\"lru_garbage_collection\" /* TimerId.LruGarbageCollection */ , e, (async () => {\n this.jn = null;\n try {\n await this.localStore.collectGarbage(this.garbageCollector);\n } catch (e) {\n __PRIVATE_isIndexedDbTransactionError(e) ? __PRIVATE_logDebug(\"LruGarbageCollector\", \"Ignoring IndexedDB error during garbage collection: \", e) : await __PRIVATE_ignoreIfPrimaryLeaseLoss(e);\n }\n await this.Hn(3e5);\n }));\n }\n}\n\n/**\n * Implements the steps for LRU garbage collection.\n */ class __PRIVATE_LruGarbageCollectorImpl {\n constructor(e, t) {\n this.Jn = e, this.params = t;\n }\n calculateTargetCount(e, t) {\n return this.Jn.Yn(e).next((e => Math.floor(t / 100 * e)));\n }\n nthSequenceNumber(e, t) {\n if (0 === t) return PersistencePromise.resolve(__PRIVATE_ListenSequence.oe);\n const n = new __PRIVATE_RollingSequenceNumberBuffer(t);\n return this.Jn.forEachTarget(e, (e => n.zn(e.sequenceNumber))).next((() => this.Jn.Zn(e, (e => n.zn(e))))).next((() => n.maxValue));\n }\n removeTargets(e, t, n) {\n return this.Jn.removeTargets(e, t, n);\n }\n removeOrphanedDocuments(e, t) {\n return this.Jn.removeOrphanedDocuments(e, t);\n }\n collect(e, t) {\n return -1 === this.params.cacheSizeCollectionThreshold ? (__PRIVATE_logDebug(\"LruGarbageCollector\", \"Garbage collection skipped; disabled\"), \n PersistencePromise.resolve(Re)) : this.getCacheSize(e).next((n => n < this.params.cacheSizeCollectionThreshold ? (__PRIVATE_logDebug(\"LruGarbageCollector\", `Garbage collection skipped; Cache size ${n} is lower than threshold ${this.params.cacheSizeCollectionThreshold}`), \n Re) : this.Xn(e, t)));\n }\n getCacheSize(e) {\n return this.Jn.getCacheSize(e);\n }\n Xn(e, t) {\n let n, r, i, s, o, a, u;\n const c = Date.now();\n return this.calculateTargetCount(e, this.params.percentileToCollect).next((t => (\n // Cap at the configured max\n t > this.params.maximumSequenceNumbersToCollect ? (__PRIVATE_logDebug(\"LruGarbageCollector\", `Capping sequence numbers to collect down to the maximum of ${this.params.maximumSequenceNumbersToCollect} from ${t}`), \n r = this.params.maximumSequenceNumbersToCollect) : r = t, s = Date.now(), this.nthSequenceNumber(e, r)))).next((r => (n = r, \n o = Date.now(), this.removeTargets(e, n, t)))).next((t => (i = t, a = Date.now(), \n this.removeOrphanedDocuments(e, n)))).next((e => {\n if (u = Date.now(), __PRIVATE_getLogLevel() <= LogLevel.DEBUG) {\n __PRIVATE_logDebug(\"LruGarbageCollector\", `LRU Garbage Collection\\n\\tCounted targets in ${s - c}ms\\n\\tDetermined least recently used ${r} in ` + (o - s) + \"ms\\n\" + `\\tRemoved ${i} targets in ` + (a - o) + \"ms\\n\" + `\\tRemoved ${e} documents in ` + (u - a) + \"ms\\n\" + `Total Duration: ${u - c}ms`);\n }\n return PersistencePromise.resolve({\n didRun: !0,\n sequenceNumbersCollected: r,\n targetsRemoved: i,\n documentsRemoved: e\n });\n }));\n }\n}\n\nfunction __PRIVATE_newLruGarbageCollector(e, t) {\n return new __PRIVATE_LruGarbageCollectorImpl(e, t);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Provides LRU functionality for IndexedDB persistence. */ class __PRIVATE_IndexedDbLruDelegateImpl {\n constructor(e, t) {\n this.db = e, this.garbageCollector = __PRIVATE_newLruGarbageCollector(this, t);\n }\n Yn(e) {\n const t = this.er(e);\n return this.db.getTargetCache().getTargetCount(e).next((e => t.next((t => e + t))));\n }\n er(e) {\n let t = 0;\n return this.Zn(e, (e => {\n t++;\n })).next((() => t));\n }\n forEachTarget(e, t) {\n return this.db.getTargetCache().forEachTarget(e, t);\n }\n Zn(e, t) {\n return this.tr(e, ((e, n) => t(n)));\n }\n addReference(e, t, n) {\n return __PRIVATE_writeSentinelKey(e, n);\n }\n removeReference(e, t, n) {\n return __PRIVATE_writeSentinelKey(e, n);\n }\n removeTargets(e, t, n) {\n return this.db.getTargetCache().removeTargets(e, t, n);\n }\n markPotentiallyOrphaned(e, t) {\n return __PRIVATE_writeSentinelKey(e, t);\n }\n /**\n * Returns true if anything would prevent this document from being garbage\n * collected, given that the document in question is not present in any\n * targets and has a sequence number less than or equal to the upper bound for\n * the collection run.\n */ nr(e, t) {\n return function __PRIVATE_mutationQueuesContainKey(e, t) {\n let n = !1;\n return __PRIVATE_mutationQueuesStore(e).Y((r => __PRIVATE_mutationQueueContainsKey(e, r, t).next((e => (e && (n = !0), \n PersistencePromise.resolve(!e)))))).next((() => n));\n }(e, t);\n }\n removeOrphanedDocuments(e, t) {\n const n = this.db.getRemoteDocumentCache().newChangeBuffer(), r = [];\n let i = 0;\n return this.tr(e, ((s, o) => {\n if (o <= t) {\n const t = this.nr(e, s).next((t => {\n if (!t) \n // Our size accounting requires us to read all documents before\n // removing them.\n return i++, n.getEntry(e, s).next((() => (n.removeEntry(s, SnapshotVersion.min()), \n __PRIVATE_documentTargetStore(e).delete(function __PRIVATE_sentinelKey$1(e) {\n return [ 0, __PRIVATE_encodeResourcePath(e.path) ];\n }\n /**\n * @returns A value suitable for writing a sentinel row in the target-document\n * store.\n */ (s)))));\n }));\n r.push(t);\n }\n })).next((() => PersistencePromise.waitFor(r))).next((() => n.apply(e))).next((() => i));\n }\n removeTarget(e, t) {\n const n = t.withSequenceNumber(e.currentSequenceNumber);\n return this.db.getTargetCache().updateTargetData(e, n);\n }\n updateLimboDocument(e, t) {\n return __PRIVATE_writeSentinelKey(e, t);\n }\n /**\n * Call provided function for each document in the cache that is 'orphaned'. Orphaned\n * means not a part of any target, so the only entry in the target-document index for\n * that document will be the sentinel row (targetId 0), which will also have the sequence\n * number for the last time the document was accessed.\n */ tr(e, t) {\n const n = __PRIVATE_documentTargetStore(e);\n let r, i = __PRIVATE_ListenSequence.oe;\n return n.J({\n index: \"documentTargetsIndex\"\n }, (([e, n], {path: s, sequenceNumber: o}) => {\n 0 === e ? (\n // if nextToReport is valid, report it, this is a new key so the\n // last one must not be a member of any targets.\n i !== __PRIVATE_ListenSequence.oe && t(new DocumentKey(__PRIVATE_decodeResourcePath(r)), i), \n // set nextToReport to be this sequence number. It's the next one we\n // might report, if we don't find any targets for this document.\n // Note that the sequence number must be defined when the targetId\n // is 0.\n i = o, r = s) : \n // set nextToReport to be invalid, we know we don't need to report\n // this one since we found a target for it.\n i = __PRIVATE_ListenSequence.oe;\n })).next((() => {\n // Since we report sequence numbers after getting to the next key, we\n // need to check if the last key we iterated over was an orphaned\n // document and report it.\n i !== __PRIVATE_ListenSequence.oe && t(new DocumentKey(__PRIVATE_decodeResourcePath(r)), i);\n }));\n }\n getCacheSize(e) {\n return this.db.getRemoteDocumentCache().getSize(e);\n }\n}\n\nfunction __PRIVATE_writeSentinelKey(e, t) {\n return __PRIVATE_documentTargetStore(e).put(function __PRIVATE_sentinelRow(e, t) {\n return {\n targetId: 0,\n path: __PRIVATE_encodeResourcePath(e.path),\n sequenceNumber: t\n };\n }(t, e.currentSequenceNumber));\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An in-memory buffer of entries to be written to a RemoteDocumentCache.\n * It can be used to batch up a set of changes to be written to the cache, but\n * additionally supports reading entries back with the `getEntry()` method,\n * falling back to the underlying RemoteDocumentCache if no entry is\n * buffered.\n *\n * Entries added to the cache *must* be read first. This is to facilitate\n * calculating the size delta of the pending changes.\n *\n * PORTING NOTE: This class was implemented then removed from other platforms.\n * If byte-counting ends up being needed on the other platforms, consider\n * porting this class as part of that implementation work.\n */ class RemoteDocumentChangeBuffer {\n constructor() {\n // A mapping of document key to the new cache entry that should be written.\n this.changes = new ObjectMap((e => e.toString()), ((e, t) => e.isEqual(t))), this.changesApplied = !1;\n }\n /**\n * Buffers a `RemoteDocumentCache.addEntry()` call.\n *\n * You can only modify documents that have already been retrieved via\n * `getEntry()/getEntries()` (enforced via IndexedDbs `apply()`).\n */ addEntry(e) {\n this.assertNotApplied(), this.changes.set(e.key, e);\n }\n /**\n * Buffers a `RemoteDocumentCache.removeEntry()` call.\n *\n * You can only remove documents that have already been retrieved via\n * `getEntry()/getEntries()` (enforced via IndexedDbs `apply()`).\n */ removeEntry(e, t) {\n this.assertNotApplied(), this.changes.set(e, MutableDocument.newInvalidDocument(e).setReadTime(t));\n }\n /**\n * Looks up an entry in the cache. The buffered changes will first be checked,\n * and if no buffered change applies, this will forward to\n * `RemoteDocumentCache.getEntry()`.\n *\n * @param transaction - The transaction in which to perform any persistence\n * operations.\n * @param documentKey - The key of the entry to look up.\n * @returns The cached document or an invalid document if we have nothing\n * cached.\n */ getEntry(e, t) {\n this.assertNotApplied();\n const n = this.changes.get(t);\n return void 0 !== n ? PersistencePromise.resolve(n) : this.getFromCache(e, t);\n }\n /**\n * Looks up several entries in the cache, forwarding to\n * `RemoteDocumentCache.getEntry()`.\n *\n * @param transaction - The transaction in which to perform any persistence\n * operations.\n * @param documentKeys - The keys of the entries to look up.\n * @returns A map of cached documents, indexed by key. If an entry cannot be\n * found, the corresponding key will be mapped to an invalid document.\n */ getEntries(e, t) {\n return this.getAllFromCache(e, t);\n }\n /**\n * Applies buffered changes to the underlying RemoteDocumentCache, using\n * the provided transaction.\n */ apply(e) {\n return this.assertNotApplied(), this.changesApplied = !0, this.applyChanges(e);\n }\n /** Helper to assert this.changes is not null */ assertNotApplied() {}\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The RemoteDocumentCache for IndexedDb. To construct, invoke\n * `newIndexedDbRemoteDocumentCache()`.\n */ class __PRIVATE_IndexedDbRemoteDocumentCacheImpl {\n constructor(e) {\n this.serializer = e;\n }\n setIndexManager(e) {\n this.indexManager = e;\n }\n /**\n * Adds the supplied entries to the cache.\n *\n * All calls of `addEntry` are required to go through the RemoteDocumentChangeBuffer\n * returned by `newChangeBuffer()` to ensure proper accounting of metadata.\n */ addEntry(e, t, n) {\n return __PRIVATE_remoteDocumentsStore(e).put(n);\n }\n /**\n * Removes a document from the cache.\n *\n * All calls of `removeEntry` are required to go through the RemoteDocumentChangeBuffer\n * returned by `newChangeBuffer()` to ensure proper accounting of metadata.\n */ removeEntry(e, t, n) {\n return __PRIVATE_remoteDocumentsStore(e).delete(\n /**\n * Returns a key that can be used for document lookups via the primary key of\n * the DbRemoteDocument object store.\n */\n function __PRIVATE_dbReadTimeKey(e, t) {\n const n = e.path.toArray();\n return [ \n /* prefix path */ n.slice(0, n.length - 2), \n /* collection id */ n[n.length - 2], __PRIVATE_toDbTimestampKey(t), \n /* document id */ n[n.length - 1] ];\n }\n /**\n * Returns a key that can be used for document lookups on the\n * `DbRemoteDocumentDocumentCollectionGroupIndex` index.\n */ (t, n));\n }\n /**\n * Updates the current cache size.\n *\n * Callers to `addEntry()` and `removeEntry()` *must* call this afterwards to update the\n * cache's metadata.\n */ updateMetadata(e, t) {\n return this.getMetadata(e).next((n => (n.byteSize += t, this.rr(e, n))));\n }\n getEntry(e, t) {\n let n = MutableDocument.newInvalidDocument(t);\n return __PRIVATE_remoteDocumentsStore(e).J({\n index: \"documentKeyIndex\",\n range: IDBKeyRange.only(__PRIVATE_dbKey(t))\n }, ((e, r) => {\n n = this.ir(t, r);\n })).next((() => n));\n }\n /**\n * Looks up an entry in the cache.\n *\n * @param documentKey - The key of the entry to look up.\n * @returns The cached document entry and its size.\n */ sr(e, t) {\n let n = {\n size: 0,\n document: MutableDocument.newInvalidDocument(t)\n };\n return __PRIVATE_remoteDocumentsStore(e).J({\n index: \"documentKeyIndex\",\n range: IDBKeyRange.only(__PRIVATE_dbKey(t))\n }, ((e, r) => {\n n = {\n document: this.ir(t, r),\n size: __PRIVATE_dbDocumentSize(r)\n };\n })).next((() => n));\n }\n getEntries(e, t) {\n let n = __PRIVATE_mutableDocumentMap();\n return this._r(e, t, ((e, t) => {\n const r = this.ir(e, t);\n n = n.insert(e, r);\n })).next((() => n));\n }\n /**\n * Looks up several entries in the cache.\n *\n * @param documentKeys - The set of keys entries to look up.\n * @returns A map of documents indexed by key and a map of sizes indexed by\n * key (zero if the document does not exist).\n */ ar(e, t) {\n let n = __PRIVATE_mutableDocumentMap(), r = new SortedMap(DocumentKey.comparator);\n return this._r(e, t, ((e, t) => {\n const i = this.ir(e, t);\n n = n.insert(e, i), r = r.insert(e, __PRIVATE_dbDocumentSize(t));\n })).next((() => ({\n documents: n,\n ur: r\n })));\n }\n _r(e, t, n) {\n if (t.isEmpty()) return PersistencePromise.resolve();\n let r = new SortedSet(__PRIVATE_dbKeyComparator);\n t.forEach((e => r = r.add(e)));\n const i = IDBKeyRange.bound(__PRIVATE_dbKey(r.first()), __PRIVATE_dbKey(r.last())), s = r.getIterator();\n let o = s.getNext();\n return __PRIVATE_remoteDocumentsStore(e).J({\n index: \"documentKeyIndex\",\n range: i\n }, ((e, t, r) => {\n const i = DocumentKey.fromSegments([ ...t.prefixPath, t.collectionGroup, t.documentId ]);\n // Go through keys not found in cache.\n for (;o && __PRIVATE_dbKeyComparator(o, i) < 0; ) n(o, null), o = s.getNext();\n o && o.isEqual(i) && (\n // Key found in cache.\n n(o, t), o = s.hasNext() ? s.getNext() : null), \n // Skip to the next key (if there is one).\n o ? r.$(__PRIVATE_dbKey(o)) : r.done();\n })).next((() => {\n // The rest of the keys are not in the cache. One case where `iterate`\n // above won't go through them is when the cache is empty.\n for (;o; ) n(o, null), o = s.hasNext() ? s.getNext() : null;\n }));\n }\n getDocumentsMatchingQuery(e, t, n, r, i) {\n const s = t.path, o = [ s.popLast().toArray(), s.lastSegment(), __PRIVATE_toDbTimestampKey(n.readTime), n.documentKey.path.isEmpty() ? \"\" : n.documentKey.path.lastSegment() ], _ = [ s.popLast().toArray(), s.lastSegment(), [ Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER ], \"\" ];\n return __PRIVATE_remoteDocumentsStore(e).U(IDBKeyRange.bound(o, _, !0)).next((e => {\n null == i || i.incrementDocumentReadCount(e.length);\n let n = __PRIVATE_mutableDocumentMap();\n for (const i of e) {\n const e = this.ir(DocumentKey.fromSegments(i.prefixPath.concat(i.collectionGroup, i.documentId)), i);\n e.isFoundDocument() && (__PRIVATE_queryMatches(t, e) || r.has(e.key)) && (\n // Either the document matches the given query, or it is mutated.\n n = n.insert(e.key, e));\n }\n return n;\n }));\n }\n getAllFromCollectionGroup(e, t, n, r) {\n let i = __PRIVATE_mutableDocumentMap();\n const s = __PRIVATE_dbCollectionGroupKey(t, n), o = __PRIVATE_dbCollectionGroupKey(t, IndexOffset.max());\n return __PRIVATE_remoteDocumentsStore(e).J({\n index: \"collectionGroupIndex\",\n range: IDBKeyRange.bound(s, o, !0)\n }, ((e, t, n) => {\n const s = this.ir(DocumentKey.fromSegments(t.prefixPath.concat(t.collectionGroup, t.documentId)), t);\n i = i.insert(s.key, s), i.size === r && n.done();\n })).next((() => i));\n }\n newChangeBuffer(e) {\n return new __PRIVATE_IndexedDbRemoteDocumentChangeBuffer(this, !!e && e.trackRemovals);\n }\n getSize(e) {\n return this.getMetadata(e).next((e => e.byteSize));\n }\n getMetadata(e) {\n return __PRIVATE_documentGlobalStore(e).get(\"remoteDocumentGlobalKey\").next((e => (__PRIVATE_hardAssert(!!e), \n e)));\n }\n rr(e, t) {\n return __PRIVATE_documentGlobalStore(e).put(\"remoteDocumentGlobalKey\", t);\n }\n /**\n * Decodes `dbRemoteDoc` and returns the document (or an invalid document if\n * the document corresponds to the format used for sentinel deletes).\n */ ir(e, t) {\n if (t) {\n const e = __PRIVATE_fromDbRemoteDocument(this.serializer, t);\n // Whether the document is a sentinel removal and should only be used in the\n // `getNewDocumentChanges()`\n if (!(e.isNoDocument() && e.version.isEqual(SnapshotVersion.min()))) return e;\n }\n return MutableDocument.newInvalidDocument(e);\n }\n}\n\n/** Creates a new IndexedDbRemoteDocumentCache. */ function __PRIVATE_newIndexedDbRemoteDocumentCache(e) {\n return new __PRIVATE_IndexedDbRemoteDocumentCacheImpl(e);\n}\n\n/**\n * Handles the details of adding and updating documents in the IndexedDbRemoteDocumentCache.\n *\n * Unlike the MemoryRemoteDocumentChangeBuffer, the IndexedDb implementation computes the size\n * delta for all submitted changes. This avoids having to re-read all documents from IndexedDb\n * when we apply the changes.\n */ class __PRIVATE_IndexedDbRemoteDocumentChangeBuffer extends RemoteDocumentChangeBuffer {\n /**\n * @param documentCache - The IndexedDbRemoteDocumentCache to apply the changes to.\n * @param trackRemovals - Whether to create sentinel deletes that can be tracked by\n * `getNewDocumentChanges()`.\n */\n constructor(e, t) {\n super(), this.cr = e, this.trackRemovals = t, \n // A map of document sizes and read times prior to applying the changes in\n // this buffer.\n this.lr = new ObjectMap((e => e.toString()), ((e, t) => e.isEqual(t)));\n }\n applyChanges(e) {\n const t = [];\n let n = 0, r = new SortedSet(((e, t) => __PRIVATE_primitiveComparator(e.canonicalString(), t.canonicalString())));\n return this.changes.forEach(((i, s) => {\n const o = this.lr.get(i);\n if (t.push(this.cr.removeEntry(e, i, o.readTime)), s.isValidDocument()) {\n const _ = __PRIVATE_toDbRemoteDocument(this.cr.serializer, s);\n r = r.add(i.path.popLast());\n const a = __PRIVATE_dbDocumentSize(_);\n n += a - o.size, t.push(this.cr.addEntry(e, i, _));\n } else if (n -= o.size, this.trackRemovals) {\n // In order to track removals, we store a \"sentinel delete\" in the\n // RemoteDocumentCache. This entry is represented by a NoDocument\n // with a version of 0 and ignored by `maybeDecodeDocument()` but\n // preserved in `getNewDocumentChanges()`.\n const n = __PRIVATE_toDbRemoteDocument(this.cr.serializer, s.convertToNoDocument(SnapshotVersion.min()));\n t.push(this.cr.addEntry(e, i, n));\n }\n })), r.forEach((n => {\n t.push(this.cr.indexManager.addToCollectionParentIndex(e, n));\n })), t.push(this.cr.updateMetadata(e, n)), PersistencePromise.waitFor(t);\n }\n getFromCache(e, t) {\n // Record the size of everything we load from the cache so we can compute a delta later.\n return this.cr.sr(e, t).next((e => (this.lr.set(t, {\n size: e.size,\n readTime: e.document.readTime\n }), e.document)));\n }\n getAllFromCache(e, t) {\n // Record the size of everything we load from the cache so we can compute\n // a delta later.\n return this.cr.ar(e, t).next((({documents: e, ur: t}) => (\n // Note: `getAllFromCache` returns two maps instead of a single map from\n // keys to `DocumentSizeEntry`s. This is to allow returning the\n // `MutableDocumentMap` directly, without a conversion.\n t.forEach(((t, n) => {\n this.lr.set(t, {\n size: n,\n readTime: e.get(t).readTime\n });\n })), e)));\n }\n}\n\nfunction __PRIVATE_documentGlobalStore(e) {\n return __PRIVATE_getStore(e, \"remoteDocumentGlobal\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the remoteDocuments object store.\n */ function __PRIVATE_remoteDocumentsStore(e) {\n return __PRIVATE_getStore(e, \"remoteDocumentsV14\");\n}\n\n/**\n * Returns a key that can be used for document lookups on the\n * `DbRemoteDocumentDocumentKeyIndex` index.\n */ function __PRIVATE_dbKey(e) {\n const t = e.path.toArray();\n return [ \n /* prefix path */ t.slice(0, t.length - 2), \n /* collection id */ t[t.length - 2], \n /* document id */ t[t.length - 1] ];\n}\n\nfunction __PRIVATE_dbCollectionGroupKey(e, t) {\n const n = t.documentKey.path.toArray();\n return [ \n /* collection id */ e, __PRIVATE_toDbTimestampKey(t.readTime), \n /* prefix path */ n.slice(0, n.length - 2), \n /* document id */ n.length > 0 ? n[n.length - 1] : \"\" ];\n}\n\n/**\n * Comparator that compares document keys according to the primary key sorting\n * used by the `DbRemoteDocumentDocument` store (by prefix path, collection id\n * and then document ID).\n *\n * Visible for testing.\n */ function __PRIVATE_dbKeyComparator(e, t) {\n const n = e.path.toArray(), r = t.path.toArray();\n // The ordering is based on https://chromium.googlesource.com/chromium/blink/+/fe5c21fef94dae71c1c3344775b8d8a7f7e6d9ec/Source/modules/indexeddb/IDBKey.cpp#74\n let i = 0;\n for (let e = 0; e < n.length - 2 && e < r.length - 2; ++e) if (i = __PRIVATE_primitiveComparator(n[e], r[e]), \n i) return i;\n return i = __PRIVATE_primitiveComparator(n.length, r.length), i || (i = __PRIVATE_primitiveComparator(n[n.length - 2], r[r.length - 2]), \n i || __PRIVATE_primitiveComparator(n[n.length - 1], r[r.length - 1]));\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Schema Version for the Web client:\n * 1. Initial version including Mutation Queue, Query Cache, and Remote\n * Document Cache\n * 2. Used to ensure a targetGlobal object exists and add targetCount to it. No\n * longer required because migration 3 unconditionally clears it.\n * 3. Dropped and re-created Query Cache to deal with cache corruption related\n * to limbo resolution. Addresses\n * https://github.com/firebase/firebase-ios-sdk/issues/1548\n * 4. Multi-Tab Support.\n * 5. Removal of held write acks.\n * 6. Create document global for tracking document cache size.\n * 7. Ensure every cached document has a sentinel row with a sequence number.\n * 8. Add collection-parent index for Collection Group queries.\n * 9. Change RemoteDocumentChanges store to be keyed by readTime rather than\n * an auto-incrementing ID. This is required for Index-Free queries.\n * 10. Rewrite the canonical IDs to the explicit Protobuf-based format.\n * 11. Add bundles and named_queries for bundle support.\n * 12. Add document overlays.\n * 13. Rewrite the keys of the remote document cache to allow for efficient\n * document lookup via `getAll()`.\n * 14. Add overlays.\n * 15. Add indexing support.\n * 16. Parse timestamp strings before creating index entries.\n */\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents a local view (overlay) of a document, and the fields that are\n * locally mutated.\n */\nclass OverlayedDocument {\n constructor(e, \n /**\n * The fields that are locally mutated by patch mutations.\n *\n * If the overlayed\tdocument is from set or delete mutations, this is `null`.\n * If there is no overlay (mutation) for the document, this is an empty `FieldMask`.\n */\n t) {\n this.overlayedDocument = e, this.mutatedFields = t;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A readonly view of the local state of all documents we're tracking (i.e. we\n * have a cached version in remoteDocumentCache or local mutations for the\n * document). The view is computed by applying the mutations in the\n * MutationQueue to the RemoteDocumentCache.\n */ class LocalDocumentsView {\n constructor(e, t, n, r) {\n this.remoteDocumentCache = e, this.mutationQueue = t, this.documentOverlayCache = n, \n this.indexManager = r;\n }\n /**\n * Get the local view of the document identified by `key`.\n *\n * @returns Local view of the document or null if we don't have any cached\n * state for it.\n */ getDocument(e, t) {\n let n = null;\n return this.documentOverlayCache.getOverlay(e, t).next((r => (n = r, this.remoteDocumentCache.getEntry(e, t)))).next((e => (null !== n && __PRIVATE_mutationApplyToLocalView(n.mutation, e, FieldMask.empty(), Timestamp.now()), \n e)));\n }\n /**\n * Gets the local view of the documents identified by `keys`.\n *\n * If we don't have cached state for a document in `keys`, a NoDocument will\n * be stored for that key in the resulting set.\n */ getDocuments(e, t) {\n return this.remoteDocumentCache.getEntries(e, t).next((t => this.getLocalViewOfDocuments(e, t, __PRIVATE_documentKeySet()).next((() => t))));\n }\n /**\n * Similar to `getDocuments`, but creates the local view from the given\n * `baseDocs` without retrieving documents from the local store.\n *\n * @param transaction - The transaction this operation is scoped to.\n * @param docs - The documents to apply local mutations to get the local views.\n * @param existenceStateChanged - The set of document keys whose existence state\n * is changed. This is useful to determine if some documents overlay needs\n * to be recalculated.\n */ getLocalViewOfDocuments(e, t, n = __PRIVATE_documentKeySet()) {\n const r = __PRIVATE_newOverlayMap();\n return this.populateOverlays(e, r, t).next((() => this.computeViews(e, t, r, n).next((e => {\n let t = documentMap();\n return e.forEach(((e, n) => {\n t = t.insert(e, n.overlayedDocument);\n })), t;\n }))));\n }\n /**\n * Gets the overlayed documents for the given document map, which will include\n * the local view of those documents and a `FieldMask` indicating which fields\n * are mutated locally, `null` if overlay is a Set or Delete mutation.\n */ getOverlayedDocuments(e, t) {\n const n = __PRIVATE_newOverlayMap();\n return this.populateOverlays(e, n, t).next((() => this.computeViews(e, t, n, __PRIVATE_documentKeySet())));\n }\n /**\n * Fetches the overlays for {@code docs} and adds them to provided overlay map\n * if the map does not already contain an entry for the given document key.\n */ populateOverlays(e, t, n) {\n const r = [];\n return n.forEach((e => {\n t.has(e) || r.push(e);\n })), this.documentOverlayCache.getOverlays(e, r).next((e => {\n e.forEach(((e, n) => {\n t.set(e, n);\n }));\n }));\n }\n /**\n * Computes the local view for the given documents.\n *\n * @param docs - The documents to compute views for. It also has the base\n * version of the documents.\n * @param overlays - The overlays that need to be applied to the given base\n * version of the documents.\n * @param existenceStateChanged - A set of documents whose existence states\n * might have changed. This is used to determine if we need to re-calculate\n * overlays from mutation queues.\n * @return A map represents the local documents view.\n */ computeViews(e, t, n, r) {\n let i = __PRIVATE_mutableDocumentMap();\n const s = __PRIVATE_newDocumentKeyMap(), o = function __PRIVATE_newOverlayedDocumentMap() {\n return __PRIVATE_newDocumentKeyMap();\n }();\n return t.forEach(((e, t) => {\n const o = n.get(t.key);\n // Recalculate an overlay if the document's existence state changed due to\n // a remote event *and* the overlay is a PatchMutation. This is because\n // document existence state can change if some patch mutation's\n // preconditions are met.\n // NOTE: we recalculate when `overlay` is undefined as well, because there\n // might be a patch mutation whose precondition does not match before the\n // change (hence overlay is undefined), but would now match.\n r.has(t.key) && (void 0 === o || o.mutation instanceof __PRIVATE_PatchMutation) ? i = i.insert(t.key, t) : void 0 !== o ? (s.set(t.key, o.mutation.getFieldMask()), \n __PRIVATE_mutationApplyToLocalView(o.mutation, t, o.mutation.getFieldMask(), Timestamp.now())) : \n // no overlay exists\n // Using EMPTY to indicate there is no overlay for the document.\n s.set(t.key, FieldMask.empty());\n })), this.recalculateAndSaveOverlays(e, i).next((e => (e.forEach(((e, t) => s.set(e, t))), \n t.forEach(((e, t) => {\n var n;\n return o.set(e, new OverlayedDocument(t, null !== (n = s.get(e)) && void 0 !== n ? n : null));\n })), o)));\n }\n recalculateAndSaveOverlays(e, t) {\n const n = __PRIVATE_newDocumentKeyMap();\n // A reverse lookup map from batch id to the documents within that batch.\n let r = new SortedMap(((e, t) => e - t)), i = __PRIVATE_documentKeySet();\n return this.mutationQueue.getAllMutationBatchesAffectingDocumentKeys(e, t).next((e => {\n for (const i of e) i.keys().forEach((e => {\n const s = t.get(e);\n if (null === s) return;\n let o = n.get(e) || FieldMask.empty();\n o = i.applyToLocalView(s, o), n.set(e, o);\n const _ = (r.get(i.batchId) || __PRIVATE_documentKeySet()).add(e);\n r = r.insert(i.batchId, _);\n }));\n })).next((() => {\n const s = [], o = r.getReverseIterator();\n // Iterate in descending order of batch IDs, and skip documents that are\n // already saved.\n for (;o.hasNext(); ) {\n const r = o.getNext(), _ = r.key, a = r.value, u = __PRIVATE_newMutationMap();\n a.forEach((e => {\n if (!i.has(e)) {\n const r = __PRIVATE_calculateOverlayMutation(t.get(e), n.get(e));\n null !== r && u.set(e, r), i = i.add(e);\n }\n })), s.push(this.documentOverlayCache.saveOverlays(e, _, u));\n }\n return PersistencePromise.waitFor(s);\n })).next((() => n));\n }\n /**\n * Recalculates overlays by reading the documents from remote document cache\n * first, and saves them after they are calculated.\n */ recalculateAndSaveOverlaysForDocumentKeys(e, t) {\n return this.remoteDocumentCache.getEntries(e, t).next((t => this.recalculateAndSaveOverlays(e, t)));\n }\n /**\n * Performs a query against the local view of all documents.\n *\n * @param transaction - The persistence transaction.\n * @param query - The query to match documents against.\n * @param offset - Read time and key to start scanning by (exclusive).\n * @param context - A optional tracker to keep a record of important details\n * during database local query execution.\n */ getDocumentsMatchingQuery(e, t, n, r) {\n /**\n * Returns whether the query matches a single document by path (rather than a\n * collection).\n */\n return function __PRIVATE_isDocumentQuery$1(e) {\n return DocumentKey.isDocumentKey(e.path) && null === e.collectionGroup && 0 === e.filters.length;\n }(t) ? this.getDocumentsMatchingDocumentQuery(e, t.path) : __PRIVATE_isCollectionGroupQuery(t) ? this.getDocumentsMatchingCollectionGroupQuery(e, t, n, r) : this.getDocumentsMatchingCollectionQuery(e, t, n, r);\n }\n /**\n * Given a collection group, returns the next documents that follow the provided offset, along\n * with an updated batch ID.\n *\n *

    The documents returned by this method are ordered by remote version from the provided\n * offset. If there are no more remote documents after the provided offset, documents with\n * mutations in order of batch id from the offset are returned. Since all documents in a batch are\n * returned together, the total number of documents returned can exceed {@code count}.\n *\n * @param transaction\n * @param collectionGroup The collection group for the documents.\n * @param offset The offset to index into.\n * @param count The number of documents to return\n * @return A LocalWriteResult with the documents that follow the provided offset and the last processed batch id.\n */ getNextDocuments(e, t, n, r) {\n return this.remoteDocumentCache.getAllFromCollectionGroup(e, t, n, r).next((i => {\n const s = r - i.size > 0 ? this.documentOverlayCache.getOverlaysForCollectionGroup(e, t, n.largestBatchId, r - i.size) : PersistencePromise.resolve(__PRIVATE_newOverlayMap());\n // The callsite will use the largest batch ID together with the latest read time to create\n // a new index offset. Since we only process batch IDs if all remote documents have been read,\n // no overlay will increase the overall read time. This is why we only need to special case\n // the batch id.\n let o = -1, _ = i;\n return s.next((t => PersistencePromise.forEach(t, ((t, n) => (o < n.largestBatchId && (o = n.largestBatchId), \n i.get(t) ? PersistencePromise.resolve() : this.remoteDocumentCache.getEntry(e, t).next((e => {\n _ = _.insert(t, e);\n }))))).next((() => this.populateOverlays(e, t, i))).next((() => this.computeViews(e, _, t, __PRIVATE_documentKeySet()))).next((e => ({\n batchId: o,\n changes: __PRIVATE_convertOverlayedDocumentMapToDocumentMap(e)\n })))));\n }));\n }\n getDocumentsMatchingDocumentQuery(e, t) {\n // Just do a simple document lookup.\n return this.getDocument(e, new DocumentKey(t)).next((e => {\n let t = documentMap();\n return e.isFoundDocument() && (t = t.insert(e.key, e)), t;\n }));\n }\n getDocumentsMatchingCollectionGroupQuery(e, t, n, r) {\n const i = t.collectionGroup;\n let s = documentMap();\n return this.indexManager.getCollectionParents(e, i).next((o => PersistencePromise.forEach(o, (o => {\n const _ = function __PRIVATE_asCollectionQueryAtPath(e, t) {\n return new __PRIVATE_QueryImpl(t, \n /*collectionGroup=*/ null, e.explicitOrderBy.slice(), e.filters.slice(), e.limit, e.limitType, e.startAt, e.endAt);\n }(t, o.child(i));\n return this.getDocumentsMatchingCollectionQuery(e, _, n, r).next((e => {\n e.forEach(((e, t) => {\n s = s.insert(e, t);\n }));\n }));\n })).next((() => s))));\n }\n getDocumentsMatchingCollectionQuery(e, t, n, r) {\n // Query the remote documents and overlay mutations.\n let i;\n return this.documentOverlayCache.getOverlaysForCollection(e, t.path, n.largestBatchId).next((s => (i = s, \n this.remoteDocumentCache.getDocumentsMatchingQuery(e, t, n, i, r)))).next((e => {\n // As documents might match the query because of their overlay we need to\n // include documents for all overlays in the initial document set.\n i.forEach(((t, n) => {\n const r = n.getKey();\n null === e.get(r) && (e = e.insert(r, MutableDocument.newInvalidDocument(r)));\n }));\n // Apply the overlays and match against the query.\n let n = documentMap();\n return e.forEach(((e, r) => {\n const s = i.get(e);\n void 0 !== s && __PRIVATE_mutationApplyToLocalView(s.mutation, r, FieldMask.empty(), Timestamp.now()), \n // Finally, insert the documents that still match the query\n __PRIVATE_queryMatches(t, r) && (n = n.insert(e, r));\n })), n;\n }));\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_MemoryBundleCache {\n constructor(e) {\n this.serializer = e, this.hr = new Map, this.Pr = new Map;\n }\n getBundleMetadata(e, t) {\n return PersistencePromise.resolve(this.hr.get(t));\n }\n saveBundleMetadata(e, t) {\n return this.hr.set(t.id, \n /** Decodes a BundleMetadata proto into a BundleMetadata object. */\n function __PRIVATE_fromBundleMetadata(e) {\n return {\n id: e.id,\n version: e.version,\n createTime: __PRIVATE_fromVersion(e.createTime)\n };\n }(t)), PersistencePromise.resolve();\n }\n getNamedQuery(e, t) {\n return PersistencePromise.resolve(this.Pr.get(t));\n }\n saveNamedQuery(e, t) {\n return this.Pr.set(t.name, function __PRIVATE_fromProtoNamedQuery(e) {\n return {\n name: e.name,\n query: __PRIVATE_fromBundledQuery(e.bundledQuery),\n readTime: __PRIVATE_fromVersion(e.readTime)\n };\n }(t)), PersistencePromise.resolve();\n }\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An in-memory implementation of DocumentOverlayCache.\n */ class __PRIVATE_MemoryDocumentOverlayCache {\n constructor() {\n // A map sorted by DocumentKey, whose value is a pair of the largest batch id\n // for the overlay and the overlay itself.\n this.overlays = new SortedMap(DocumentKey.comparator), this.Ir = new Map;\n }\n getOverlay(e, t) {\n return PersistencePromise.resolve(this.overlays.get(t));\n }\n getOverlays(e, t) {\n const n = __PRIVATE_newOverlayMap();\n return PersistencePromise.forEach(t, (t => this.getOverlay(e, t).next((e => {\n null !== e && n.set(t, e);\n })))).next((() => n));\n }\n saveOverlays(e, t, n) {\n return n.forEach(((n, r) => {\n this.ht(e, t, r);\n })), PersistencePromise.resolve();\n }\n removeOverlaysForBatchId(e, t, n) {\n const r = this.Ir.get(n);\n return void 0 !== r && (r.forEach((e => this.overlays = this.overlays.remove(e))), \n this.Ir.delete(n)), PersistencePromise.resolve();\n }\n getOverlaysForCollection(e, t, n) {\n const r = __PRIVATE_newOverlayMap(), i = t.length + 1, s = new DocumentKey(t.child(\"\")), o = this.overlays.getIteratorFrom(s);\n for (;o.hasNext(); ) {\n const e = o.getNext().value, s = e.getKey();\n if (!t.isPrefixOf(s.path)) break;\n // Documents from sub-collections\n s.path.length === i && (e.largestBatchId > n && r.set(e.getKey(), e));\n }\n return PersistencePromise.resolve(r);\n }\n getOverlaysForCollectionGroup(e, t, n, r) {\n let i = new SortedMap(((e, t) => e - t));\n const s = this.overlays.getIterator();\n for (;s.hasNext(); ) {\n const e = s.getNext().value;\n if (e.getKey().getCollectionGroup() === t && e.largestBatchId > n) {\n let t = i.get(e.largestBatchId);\n null === t && (t = __PRIVATE_newOverlayMap(), i = i.insert(e.largestBatchId, t)), \n t.set(e.getKey(), e);\n }\n }\n const o = __PRIVATE_newOverlayMap(), _ = i.getIterator();\n for (;_.hasNext(); ) {\n if (_.getNext().value.forEach(((e, t) => o.set(e, t))), o.size() >= r) break;\n }\n return PersistencePromise.resolve(o);\n }\n ht(e, t, n) {\n // Remove the association of the overlay to its batch id.\n const r = this.overlays.get(n.key);\n if (null !== r) {\n const e = this.Ir.get(r.largestBatchId).delete(n.key);\n this.Ir.set(r.largestBatchId, e);\n }\n this.overlays = this.overlays.insert(n.key, new Overlay(t, n));\n // Create the association of this overlay to the given largestBatchId.\n let i = this.Ir.get(t);\n void 0 === i && (i = __PRIVATE_documentKeySet(), this.Ir.set(t, i)), this.Ir.set(t, i.add(n.key));\n }\n}\n\n/**\n * @license\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_MemoryGlobalsCache {\n constructor() {\n this.sessionToken = ByteString.EMPTY_BYTE_STRING;\n }\n getSessionToken(e) {\n return PersistencePromise.resolve(this.sessionToken);\n }\n setSessionToken(e, t) {\n return this.sessionToken = t, PersistencePromise.resolve();\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A collection of references to a document from some kind of numbered entity\n * (either a target ID or batch ID). As references are added to or removed from\n * the set corresponding events are emitted to a registered garbage collector.\n *\n * Each reference is represented by a DocumentReference object. Each of them\n * contains enough information to uniquely identify the reference. They are all\n * stored primarily in a set sorted by key. A document is considered garbage if\n * there's no references in that set (this can be efficiently checked thanks to\n * sorting by key).\n *\n * ReferenceSet also keeps a secondary set that contains references sorted by\n * IDs. This one is used to efficiently implement removal of all references by\n * some target ID.\n */ class __PRIVATE_ReferenceSet {\n constructor() {\n // A set of outstanding references to a document sorted by key.\n this.Tr = new SortedSet(__PRIVATE_DocReference.Er), \n // A set of outstanding references to a document sorted by target id.\n this.dr = new SortedSet(__PRIVATE_DocReference.Ar);\n }\n /** Returns true if the reference set contains no references. */ isEmpty() {\n return this.Tr.isEmpty();\n }\n /** Adds a reference to the given document key for the given ID. */ addReference(e, t) {\n const n = new __PRIVATE_DocReference(e, t);\n this.Tr = this.Tr.add(n), this.dr = this.dr.add(n);\n }\n /** Add references to the given document keys for the given ID. */ Rr(e, t) {\n e.forEach((e => this.addReference(e, t)));\n }\n /**\n * Removes a reference to the given document key for the given\n * ID.\n */ removeReference(e, t) {\n this.Vr(new __PRIVATE_DocReference(e, t));\n }\n mr(e, t) {\n e.forEach((e => this.removeReference(e, t)));\n }\n /**\n * Clears all references with a given ID. Calls removeRef() for each key\n * removed.\n */ gr(e) {\n const t = new DocumentKey(new ResourcePath([])), n = new __PRIVATE_DocReference(t, e), r = new __PRIVATE_DocReference(t, e + 1), i = [];\n return this.dr.forEachInRange([ n, r ], (e => {\n this.Vr(e), i.push(e.key);\n })), i;\n }\n pr() {\n this.Tr.forEach((e => this.Vr(e)));\n }\n Vr(e) {\n this.Tr = this.Tr.delete(e), this.dr = this.dr.delete(e);\n }\n yr(e) {\n const t = new DocumentKey(new ResourcePath([])), n = new __PRIVATE_DocReference(t, e), r = new __PRIVATE_DocReference(t, e + 1);\n let i = __PRIVATE_documentKeySet();\n return this.dr.forEachInRange([ n, r ], (e => {\n i = i.add(e.key);\n })), i;\n }\n containsKey(e) {\n const t = new __PRIVATE_DocReference(e, 0), n = this.Tr.firstAfterOrEqual(t);\n return null !== n && e.isEqual(n.key);\n }\n}\n\nclass __PRIVATE_DocReference {\n constructor(e, t) {\n this.key = e, this.wr = t;\n }\n /** Compare by key then by ID */ static Er(e, t) {\n return DocumentKey.comparator(e.key, t.key) || __PRIVATE_primitiveComparator(e.wr, t.wr);\n }\n /** Compare by ID then by key */ static Ar(e, t) {\n return __PRIVATE_primitiveComparator(e.wr, t.wr) || DocumentKey.comparator(e.key, t.key);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_MemoryMutationQueue {\n constructor(e, t) {\n this.indexManager = e, this.referenceDelegate = t, \n /**\n * The set of all mutations that have been sent but not yet been applied to\n * the backend.\n */\n this.mutationQueue = [], \n /** Next value to use when assigning sequential IDs to each mutation batch. */\n this.Sr = 1, \n /** An ordered mapping between documents and the mutations batch IDs. */\n this.br = new SortedSet(__PRIVATE_DocReference.Er);\n }\n checkEmpty(e) {\n return PersistencePromise.resolve(0 === this.mutationQueue.length);\n }\n addMutationBatch(e, t, n, r) {\n const i = this.Sr;\n this.Sr++, this.mutationQueue.length > 0 && this.mutationQueue[this.mutationQueue.length - 1];\n const s = new MutationBatch(i, t, n, r);\n this.mutationQueue.push(s);\n // Track references by document key and index collection parents.\n for (const t of r) this.br = this.br.add(new __PRIVATE_DocReference(t.key, i)), \n this.indexManager.addToCollectionParentIndex(e, t.key.path.popLast());\n return PersistencePromise.resolve(s);\n }\n lookupMutationBatch(e, t) {\n return PersistencePromise.resolve(this.Dr(t));\n }\n getNextMutationBatchAfterBatchId(e, t) {\n const n = t + 1, r = this.vr(n), i = r < 0 ? 0 : r;\n // The requested batchId may still be out of range so normalize it to the\n // start of the queue.\n return PersistencePromise.resolve(this.mutationQueue.length > i ? this.mutationQueue[i] : null);\n }\n getHighestUnacknowledgedBatchId() {\n return PersistencePromise.resolve(0 === this.mutationQueue.length ? -1 : this.Sr - 1);\n }\n getAllMutationBatches(e) {\n return PersistencePromise.resolve(this.mutationQueue.slice());\n }\n getAllMutationBatchesAffectingDocumentKey(e, t) {\n const n = new __PRIVATE_DocReference(t, 0), r = new __PRIVATE_DocReference(t, Number.POSITIVE_INFINITY), i = [];\n return this.br.forEachInRange([ n, r ], (e => {\n const t = this.Dr(e.wr);\n i.push(t);\n })), PersistencePromise.resolve(i);\n }\n getAllMutationBatchesAffectingDocumentKeys(e, t) {\n let n = new SortedSet(__PRIVATE_primitiveComparator);\n return t.forEach((e => {\n const t = new __PRIVATE_DocReference(e, 0), r = new __PRIVATE_DocReference(e, Number.POSITIVE_INFINITY);\n this.br.forEachInRange([ t, r ], (e => {\n n = n.add(e.wr);\n }));\n })), PersistencePromise.resolve(this.Cr(n));\n }\n getAllMutationBatchesAffectingQuery(e, t) {\n // Use the query path as a prefix for testing if a document matches the\n // query.\n const n = t.path, r = n.length + 1;\n // Construct a document reference for actually scanning the index. Unlike\n // the prefix the document key in this reference must have an even number of\n // segments. The empty segment can be used a suffix of the query path\n // because it precedes all other segments in an ordered traversal.\n let i = n;\n DocumentKey.isDocumentKey(i) || (i = i.child(\"\"));\n const s = new __PRIVATE_DocReference(new DocumentKey(i), 0);\n // Find unique batchIDs referenced by all documents potentially matching the\n // query.\n let o = new SortedSet(__PRIVATE_primitiveComparator);\n return this.br.forEachWhile((e => {\n const t = e.key.path;\n return !!n.isPrefixOf(t) && (\n // Rows with document keys more than one segment longer than the query\n // path can't be matches. For example, a query on 'rooms' can't match\n // the document /rooms/abc/messages/xyx.\n // TODO(mcg): we'll need a different scanner when we implement\n // ancestor queries.\n t.length === r && (o = o.add(e.wr)), !0);\n }), s), PersistencePromise.resolve(this.Cr(o));\n }\n Cr(e) {\n // Construct an array of matching batches, sorted by batchID to ensure that\n // multiple mutations affecting the same document key are applied in order.\n const t = [];\n return e.forEach((e => {\n const n = this.Dr(e);\n null !== n && t.push(n);\n })), t;\n }\n removeMutationBatch(e, t) {\n __PRIVATE_hardAssert(0 === this.Fr(t.batchId, \"removed\")), this.mutationQueue.shift();\n let n = this.br;\n return PersistencePromise.forEach(t.mutations, (r => {\n const i = new __PRIVATE_DocReference(r.key, t.batchId);\n return n = n.delete(i), this.referenceDelegate.markPotentiallyOrphaned(e, r.key);\n })).next((() => {\n this.br = n;\n }));\n }\n On(e) {\n // No-op since the memory mutation queue does not maintain a separate cache.\n }\n containsKey(e, t) {\n const n = new __PRIVATE_DocReference(t, 0), r = this.br.firstAfterOrEqual(n);\n return PersistencePromise.resolve(t.isEqual(r && r.key));\n }\n performConsistencyCheck(e) {\n return this.mutationQueue.length, PersistencePromise.resolve();\n }\n /**\n * Finds the index of the given batchId in the mutation queue and asserts that\n * the resulting index is within the bounds of the queue.\n *\n * @param batchId - The batchId to search for\n * @param action - A description of what the caller is doing, phrased in passive\n * form (e.g. \"acknowledged\" in a routine that acknowledges batches).\n */ Fr(e, t) {\n return this.vr(e);\n }\n /**\n * Finds the index of the given batchId in the mutation queue. This operation\n * is O(1).\n *\n * @returns The computed index of the batch with the given batchId, based on\n * the state of the queue. Note this index can be negative if the requested\n * batchId has already been removed from the queue or past the end of the\n * queue if the batchId is larger than the last added batch.\n */ vr(e) {\n if (0 === this.mutationQueue.length) \n // As an index this is past the end of the queue\n return 0;\n // Examine the front of the queue to figure out the difference between the\n // batchId and indexes in the array. Note that since the queue is ordered\n // by batchId, if the first batch has a larger batchId then the requested\n // batchId doesn't exist in the queue.\n return e - this.mutationQueue[0].batchId;\n }\n /**\n * A version of lookupMutationBatch that doesn't return a promise, this makes\n * other functions that uses this code easier to read and more efficient.\n */ Dr(e) {\n const t = this.vr(e);\n if (t < 0 || t >= this.mutationQueue.length) return null;\n return this.mutationQueue[t];\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The memory-only RemoteDocumentCache for IndexedDb. To construct, invoke\n * `newMemoryRemoteDocumentCache()`.\n */\nclass __PRIVATE_MemoryRemoteDocumentCacheImpl {\n /**\n * @param sizer - Used to assess the size of a document. For eager GC, this is\n * expected to just return 0 to avoid unnecessarily doing the work of\n * calculating the size.\n */\n constructor(e) {\n this.Mr = e, \n /** Underlying cache of documents and their read times. */\n this.docs = function __PRIVATE_documentEntryMap() {\n return new SortedMap(DocumentKey.comparator);\n }(), \n /** Size of all cached documents. */\n this.size = 0;\n }\n setIndexManager(e) {\n this.indexManager = e;\n }\n /**\n * Adds the supplied entry to the cache and updates the cache size as appropriate.\n *\n * All calls of `addEntry` are required to go through the RemoteDocumentChangeBuffer\n * returned by `newChangeBuffer()`.\n */ addEntry(e, t) {\n const n = t.key, r = this.docs.get(n), i = r ? r.size : 0, s = this.Mr(t);\n return this.docs = this.docs.insert(n, {\n document: t.mutableCopy(),\n size: s\n }), this.size += s - i, this.indexManager.addToCollectionParentIndex(e, n.path.popLast());\n }\n /**\n * Removes the specified entry from the cache and updates the cache size as appropriate.\n *\n * All calls of `removeEntry` are required to go through the RemoteDocumentChangeBuffer\n * returned by `newChangeBuffer()`.\n */ removeEntry(e) {\n const t = this.docs.get(e);\n t && (this.docs = this.docs.remove(e), this.size -= t.size);\n }\n getEntry(e, t) {\n const n = this.docs.get(t);\n return PersistencePromise.resolve(n ? n.document.mutableCopy() : MutableDocument.newInvalidDocument(t));\n }\n getEntries(e, t) {\n let n = __PRIVATE_mutableDocumentMap();\n return t.forEach((e => {\n const t = this.docs.get(e);\n n = n.insert(e, t ? t.document.mutableCopy() : MutableDocument.newInvalidDocument(e));\n })), PersistencePromise.resolve(n);\n }\n getDocumentsMatchingQuery(e, t, n, r) {\n let i = __PRIVATE_mutableDocumentMap();\n // Documents are ordered by key, so we can use a prefix scan to narrow down\n // the documents we need to match the query against.\n const s = t.path, o = new DocumentKey(s.child(\"\")), _ = this.docs.getIteratorFrom(o);\n for (;_.hasNext(); ) {\n const {key: e, value: {document: o}} = _.getNext();\n if (!s.isPrefixOf(e.path)) break;\n e.path.length > s.length + 1 || (__PRIVATE_indexOffsetComparator(__PRIVATE_newIndexOffsetFromDocument(o), n) <= 0 || (r.has(o.key) || __PRIVATE_queryMatches(t, o)) && (i = i.insert(o.key, o.mutableCopy())));\n }\n return PersistencePromise.resolve(i);\n }\n getAllFromCollectionGroup(e, t, n, r) {\n // This method should only be called from the IndexBackfiller if persistence\n // is enabled.\n fail();\n }\n Or(e, t) {\n return PersistencePromise.forEach(this.docs, (e => t(e)));\n }\n newChangeBuffer(e) {\n // `trackRemovals` is ignores since the MemoryRemoteDocumentCache keeps\n // a separate changelog and does not need special handling for removals.\n return new __PRIVATE_MemoryRemoteDocumentChangeBuffer(this);\n }\n getSize(e) {\n return PersistencePromise.resolve(this.size);\n }\n}\n\n/**\n * Creates a new memory-only RemoteDocumentCache.\n *\n * @param sizer - Used to assess the size of a document. For eager GC, this is\n * expected to just return 0 to avoid unnecessarily doing the work of\n * calculating the size.\n */\n/**\n * Handles the details of adding and updating documents in the MemoryRemoteDocumentCache.\n */\nclass __PRIVATE_MemoryRemoteDocumentChangeBuffer extends RemoteDocumentChangeBuffer {\n constructor(e) {\n super(), this.cr = e;\n }\n applyChanges(e) {\n const t = [];\n return this.changes.forEach(((n, r) => {\n r.isValidDocument() ? t.push(this.cr.addEntry(e, r)) : this.cr.removeEntry(n);\n })), PersistencePromise.waitFor(t);\n }\n getFromCache(e, t) {\n return this.cr.getEntry(e, t);\n }\n getAllFromCache(e, t) {\n return this.cr.getEntries(e, t);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_MemoryTargetCache {\n constructor(e) {\n this.persistence = e, \n /**\n * Maps a target to the data about that target\n */\n this.Nr = new ObjectMap((e => __PRIVATE_canonifyTarget(e)), __PRIVATE_targetEquals), \n /** The last received snapshot version. */\n this.lastRemoteSnapshotVersion = SnapshotVersion.min(), \n /** The highest numbered target ID encountered. */\n this.highestTargetId = 0, \n /** The highest sequence number encountered. */\n this.Lr = 0, \n /**\n * A ordered bidirectional mapping between documents and the remote target\n * IDs.\n */\n this.Br = new __PRIVATE_ReferenceSet, this.targetCount = 0, this.kr = __PRIVATE_TargetIdGenerator.Bn();\n }\n forEachTarget(e, t) {\n return this.Nr.forEach(((e, n) => t(n))), PersistencePromise.resolve();\n }\n getLastRemoteSnapshotVersion(e) {\n return PersistencePromise.resolve(this.lastRemoteSnapshotVersion);\n }\n getHighestSequenceNumber(e) {\n return PersistencePromise.resolve(this.Lr);\n }\n allocateTargetId(e) {\n return this.highestTargetId = this.kr.next(), PersistencePromise.resolve(this.highestTargetId);\n }\n setTargetsMetadata(e, t, n) {\n return n && (this.lastRemoteSnapshotVersion = n), t > this.Lr && (this.Lr = t), \n PersistencePromise.resolve();\n }\n Kn(e) {\n this.Nr.set(e.target, e);\n const t = e.targetId;\n t > this.highestTargetId && (this.kr = new __PRIVATE_TargetIdGenerator(t), this.highestTargetId = t), \n e.sequenceNumber > this.Lr && (this.Lr = e.sequenceNumber);\n }\n addTargetData(e, t) {\n return this.Kn(t), this.targetCount += 1, PersistencePromise.resolve();\n }\n updateTargetData(e, t) {\n return this.Kn(t), PersistencePromise.resolve();\n }\n removeTargetData(e, t) {\n return this.Nr.delete(t.target), this.Br.gr(t.targetId), this.targetCount -= 1, \n PersistencePromise.resolve();\n }\n removeTargets(e, t, n) {\n let r = 0;\n const i = [];\n return this.Nr.forEach(((s, o) => {\n o.sequenceNumber <= t && null === n.get(o.targetId) && (this.Nr.delete(s), i.push(this.removeMatchingKeysForTargetId(e, o.targetId)), \n r++);\n })), PersistencePromise.waitFor(i).next((() => r));\n }\n getTargetCount(e) {\n return PersistencePromise.resolve(this.targetCount);\n }\n getTargetData(e, t) {\n const n = this.Nr.get(t) || null;\n return PersistencePromise.resolve(n);\n }\n addMatchingKeys(e, t, n) {\n return this.Br.Rr(t, n), PersistencePromise.resolve();\n }\n removeMatchingKeys(e, t, n) {\n this.Br.mr(t, n);\n const r = this.persistence.referenceDelegate, i = [];\n return r && t.forEach((t => {\n i.push(r.markPotentiallyOrphaned(e, t));\n })), PersistencePromise.waitFor(i);\n }\n removeMatchingKeysForTargetId(e, t) {\n return this.Br.gr(t), PersistencePromise.resolve();\n }\n getMatchingKeysForTargetId(e, t) {\n const n = this.Br.yr(t);\n return PersistencePromise.resolve(n);\n }\n containsKey(e, t) {\n return PersistencePromise.resolve(this.Br.containsKey(t));\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A memory-backed instance of Persistence. Data is stored only in RAM and\n * not persisted across sessions.\n */\nclass __PRIVATE_MemoryPersistence {\n /**\n * The constructor accepts a factory for creating a reference delegate. This\n * allows both the delegate and this instance to have strong references to\n * each other without having nullable fields that would then need to be\n * checked or asserted on every access.\n */\n constructor(e, t) {\n this.qr = {}, this.overlays = {}, this.Qr = new __PRIVATE_ListenSequence(0), this.Kr = !1, \n this.Kr = !0, this.$r = new __PRIVATE_MemoryGlobalsCache, this.referenceDelegate = e(this), \n this.Ur = new __PRIVATE_MemoryTargetCache(this);\n this.indexManager = new __PRIVATE_MemoryIndexManager, this.remoteDocumentCache = function __PRIVATE_newMemoryRemoteDocumentCache(e) {\n return new __PRIVATE_MemoryRemoteDocumentCacheImpl(e);\n }((e => this.referenceDelegate.Wr(e))), this.serializer = new __PRIVATE_LocalSerializer(t), \n this.Gr = new __PRIVATE_MemoryBundleCache(this.serializer);\n }\n start() {\n return Promise.resolve();\n }\n shutdown() {\n // No durable state to ensure is closed on shutdown.\n return this.Kr = !1, Promise.resolve();\n }\n get started() {\n return this.Kr;\n }\n setDatabaseDeletedListener() {\n // No op.\n }\n setNetworkEnabled() {\n // No op.\n }\n getIndexManager(e) {\n // We do not currently support indices for memory persistence, so we can\n // return the same shared instance of the memory index manager.\n return this.indexManager;\n }\n getDocumentOverlayCache(e) {\n let t = this.overlays[e.toKey()];\n return t || (t = new __PRIVATE_MemoryDocumentOverlayCache, this.overlays[e.toKey()] = t), \n t;\n }\n getMutationQueue(e, t) {\n let n = this.qr[e.toKey()];\n return n || (n = new __PRIVATE_MemoryMutationQueue(t, this.referenceDelegate), this.qr[e.toKey()] = n), \n n;\n }\n getGlobalsCache() {\n return this.$r;\n }\n getTargetCache() {\n return this.Ur;\n }\n getRemoteDocumentCache() {\n return this.remoteDocumentCache;\n }\n getBundleCache() {\n return this.Gr;\n }\n runTransaction(e, t, n) {\n __PRIVATE_logDebug(\"MemoryPersistence\", \"Starting transaction:\", e);\n const r = new __PRIVATE_MemoryTransaction(this.Qr.next());\n return this.referenceDelegate.zr(), n(r).next((e => this.referenceDelegate.jr(r).next((() => e)))).toPromise().then((e => (r.raiseOnCommittedEvent(), \n e)));\n }\n Hr(e, t) {\n return PersistencePromise.or(Object.values(this.qr).map((n => () => n.containsKey(e, t))));\n }\n}\n\n/**\n * Memory persistence is not actually transactional, but future implementations\n * may have transaction-scoped state.\n */ class __PRIVATE_MemoryTransaction extends PersistenceTransaction {\n constructor(e) {\n super(), this.currentSequenceNumber = e;\n }\n}\n\nclass __PRIVATE_MemoryEagerDelegate {\n constructor(e) {\n this.persistence = e, \n /** Tracks all documents that are active in Query views. */\n this.Jr = new __PRIVATE_ReferenceSet, \n /** The list of documents that are potentially GCed after each transaction. */\n this.Yr = null;\n }\n static Zr(e) {\n return new __PRIVATE_MemoryEagerDelegate(e);\n }\n get Xr() {\n if (this.Yr) return this.Yr;\n throw fail();\n }\n addReference(e, t, n) {\n return this.Jr.addReference(n, t), this.Xr.delete(n.toString()), PersistencePromise.resolve();\n }\n removeReference(e, t, n) {\n return this.Jr.removeReference(n, t), this.Xr.add(n.toString()), PersistencePromise.resolve();\n }\n markPotentiallyOrphaned(e, t) {\n return this.Xr.add(t.toString()), PersistencePromise.resolve();\n }\n removeTarget(e, t) {\n this.Jr.gr(t.targetId).forEach((e => this.Xr.add(e.toString())));\n const n = this.persistence.getTargetCache();\n return n.getMatchingKeysForTargetId(e, t.targetId).next((e => {\n e.forEach((e => this.Xr.add(e.toString())));\n })).next((() => n.removeTargetData(e, t)));\n }\n zr() {\n this.Yr = new Set;\n }\n jr(e) {\n // Remove newly orphaned documents.\n const t = this.persistence.getRemoteDocumentCache().newChangeBuffer();\n return PersistencePromise.forEach(this.Xr, (n => {\n const r = DocumentKey.fromPath(n);\n return this.ei(e, r).next((e => {\n e || t.removeEntry(r, SnapshotVersion.min());\n }));\n })).next((() => (this.Yr = null, t.apply(e))));\n }\n updateLimboDocument(e, t) {\n return this.ei(e, t).next((e => {\n e ? this.Xr.delete(t.toString()) : this.Xr.add(t.toString());\n }));\n }\n Wr(e) {\n // For eager GC, we don't care about the document size, there are no size thresholds.\n return 0;\n }\n ei(e, t) {\n return PersistencePromise.or([ () => PersistencePromise.resolve(this.Jr.containsKey(t)), () => this.persistence.getTargetCache().containsKey(e, t), () => this.persistence.Hr(e, t) ]);\n }\n}\n\nclass __PRIVATE_MemoryLruDelegate {\n constructor(e, t) {\n this.persistence = e, this.ti = new ObjectMap((e => __PRIVATE_encodeResourcePath(e.path)), ((e, t) => e.isEqual(t))), \n this.garbageCollector = __PRIVATE_newLruGarbageCollector(this, t);\n }\n static Zr(e, t) {\n return new __PRIVATE_MemoryLruDelegate(e, t);\n }\n // No-ops, present so memory persistence doesn't have to care which delegate\n // it has.\n zr() {}\n jr(e) {\n return PersistencePromise.resolve();\n }\n forEachTarget(e, t) {\n return this.persistence.getTargetCache().forEachTarget(e, t);\n }\n Yn(e) {\n const t = this.er(e);\n return this.persistence.getTargetCache().getTargetCount(e).next((e => t.next((t => e + t))));\n }\n er(e) {\n let t = 0;\n return this.Zn(e, (e => {\n t++;\n })).next((() => t));\n }\n Zn(e, t) {\n return PersistencePromise.forEach(this.ti, ((n, r) => this.nr(e, n, r).next((e => e ? PersistencePromise.resolve() : t(r)))));\n }\n removeTargets(e, t, n) {\n return this.persistence.getTargetCache().removeTargets(e, t, n);\n }\n removeOrphanedDocuments(e, t) {\n let n = 0;\n const r = this.persistence.getRemoteDocumentCache(), i = r.newChangeBuffer();\n return r.Or(e, (r => this.nr(e, r, t).next((e => {\n e || (n++, i.removeEntry(r, SnapshotVersion.min()));\n })))).next((() => i.apply(e))).next((() => n));\n }\n markPotentiallyOrphaned(e, t) {\n return this.ti.set(t, e.currentSequenceNumber), PersistencePromise.resolve();\n }\n removeTarget(e, t) {\n const n = t.withSequenceNumber(e.currentSequenceNumber);\n return this.persistence.getTargetCache().updateTargetData(e, n);\n }\n addReference(e, t, n) {\n return this.ti.set(n, e.currentSequenceNumber), PersistencePromise.resolve();\n }\n removeReference(e, t, n) {\n return this.ti.set(n, e.currentSequenceNumber), PersistencePromise.resolve();\n }\n updateLimboDocument(e, t) {\n return this.ti.set(t, e.currentSequenceNumber), PersistencePromise.resolve();\n }\n Wr(e) {\n let t = e.key.toString().length;\n return e.isFoundDocument() && (t += __PRIVATE_estimateByteSize(e.data.value)), t;\n }\n nr(e, t, n) {\n return PersistencePromise.or([ () => this.persistence.Hr(e, t), () => this.persistence.getTargetCache().containsKey(e, t), () => {\n const e = this.ti.get(t);\n return PersistencePromise.resolve(void 0 !== e && e > n);\n } ]);\n }\n getCacheSize(e) {\n return this.persistence.getRemoteDocumentCache().getSize(e);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Performs database creation and schema upgrades. */ class __PRIVATE_SchemaConverter {\n constructor(e) {\n this.serializer = e;\n }\n /**\n * Performs database creation and schema upgrades.\n *\n * Note that in production, this method is only ever used to upgrade the schema\n * to SCHEMA_VERSION. Different values of toVersion are only used for testing\n * and local feature development.\n */ O(e, t, n, r) {\n const i = new __PRIVATE_SimpleDbTransaction(\"createOrUpgrade\", t);\n n < 1 && r >= 1 && (!function __PRIVATE_createPrimaryClientStore(e) {\n e.createObjectStore(\"owner\");\n }(e), function __PRIVATE_createMutationQueue(e) {\n e.createObjectStore(\"mutationQueues\", {\n keyPath: \"userId\"\n });\n e.createObjectStore(\"mutations\", {\n keyPath: \"batchId\",\n autoIncrement: !0\n }).createIndex(\"userMutationsIndex\", M, {\n unique: !0\n }), e.createObjectStore(\"documentMutations\");\n }\n /**\n * Upgrade function to migrate the 'mutations' store from V1 to V3. Loads\n * and rewrites all data.\n */ (e), __PRIVATE_createQueryCache(e), function __PRIVATE_createLegacyRemoteDocumentCache(e) {\n e.createObjectStore(\"remoteDocuments\");\n }(e));\n // Migration 2 to populate the targetGlobal object no longer needed since\n // migration 3 unconditionally clears it.\n let s = PersistencePromise.resolve();\n return n < 3 && r >= 3 && (\n // Brand new clients don't need to drop and recreate--only clients that\n // potentially have corrupt data.\n 0 !== n && (!function __PRIVATE_dropQueryCache(e) {\n e.deleteObjectStore(\"targetDocuments\"), e.deleteObjectStore(\"targets\"), e.deleteObjectStore(\"targetGlobal\");\n }(e), __PRIVATE_createQueryCache(e)), s = s.next((() => \n /**\n * Creates the target global singleton row.\n *\n * @param txn - The version upgrade transaction for indexeddb\n */\n function __PRIVATE_writeEmptyTargetGlobalEntry(e) {\n const t = e.store(\"targetGlobal\"), n = {\n highestTargetId: 0,\n highestListenSequenceNumber: 0,\n lastRemoteSnapshotVersion: SnapshotVersion.min().toTimestamp(),\n targetCount: 0\n };\n return t.put(\"targetGlobalKey\", n);\n }(i)))), n < 4 && r >= 4 && (0 !== n && (\n // Schema version 3 uses auto-generated keys to generate globally unique\n // mutation batch IDs (this was previously ensured internally by the\n // client). To migrate to the new schema, we have to read all mutations\n // and write them back out. We preserve the existing batch IDs to guarantee\n // consistency with other object stores. Any further mutation batch IDs will\n // be auto-generated.\n s = s.next((() => function __PRIVATE_upgradeMutationBatchSchemaAndMigrateData(e, t) {\n return t.store(\"mutations\").U().next((n => {\n e.deleteObjectStore(\"mutations\");\n e.createObjectStore(\"mutations\", {\n keyPath: \"batchId\",\n autoIncrement: !0\n }).createIndex(\"userMutationsIndex\", M, {\n unique: !0\n });\n const r = t.store(\"mutations\"), i = n.map((e => r.put(e)));\n return PersistencePromise.waitFor(i);\n }));\n }(e, i)))), s = s.next((() => {\n !function __PRIVATE_createClientMetadataStore(e) {\n e.createObjectStore(\"clientMetadata\", {\n keyPath: \"clientId\"\n });\n }(e);\n }))), n < 5 && r >= 5 && (s = s.next((() => this.ni(i)))), n < 6 && r >= 6 && (s = s.next((() => (function __PRIVATE_createDocumentGlobalStore(e) {\n e.createObjectStore(\"remoteDocumentGlobal\");\n }(e), this.ri(i))))), n < 7 && r >= 7 && (s = s.next((() => this.ii(i)))), n < 8 && r >= 8 && (s = s.next((() => this.si(e, i)))), \n n < 9 && r >= 9 && (s = s.next((() => {\n // Multi-Tab used to manage its own changelog, but this has been moved\n // to the DbRemoteDocument object store itself. Since the previous change\n // log only contained transient data, we can drop its object store.\n !function __PRIVATE_dropRemoteDocumentChangesStore(e) {\n e.objectStoreNames.contains(\"remoteDocumentChanges\") && e.deleteObjectStore(\"remoteDocumentChanges\");\n }(e);\n // Note: Schema version 9 used to create a read time index for the\n // RemoteDocumentCache. This is now done with schema version 13.\n }))), n < 10 && r >= 10 && (s = s.next((() => this.oi(i)))), n < 11 && r >= 11 && (s = s.next((() => {\n !function __PRIVATE_createBundlesStore(e) {\n e.createObjectStore(\"bundles\", {\n keyPath: \"bundleId\"\n });\n }(e), function __PRIVATE_createNamedQueriesStore(e) {\n e.createObjectStore(\"namedQueries\", {\n keyPath: \"name\"\n });\n }(e);\n }))), n < 12 && r >= 12 && (s = s.next((() => {\n !function __PRIVATE_createDocumentOverlayStore(e) {\n const t = e.createObjectStore(\"documentOverlays\", {\n keyPath: G\n });\n t.createIndex(\"collectionPathOverlayIndex\", z, {\n unique: !1\n }), t.createIndex(\"collectionGroupOverlayIndex\", j, {\n unique: !1\n });\n }(e);\n }))), n < 13 && r >= 13 && (s = s.next((() => function __PRIVATE_createRemoteDocumentCache(e) {\n const t = e.createObjectStore(\"remoteDocumentsV14\", {\n keyPath: O\n });\n t.createIndex(\"documentKeyIndex\", N), t.createIndex(\"collectionGroupIndex\", L);\n }(e))).next((() => this._i(e, i))).next((() => e.deleteObjectStore(\"remoteDocuments\")))), \n n < 14 && r >= 14 && (s = s.next((() => this.ai(e, i)))), n < 15 && r >= 15 && (s = s.next((() => function __PRIVATE_createFieldIndex(e) {\n e.createObjectStore(\"indexConfiguration\", {\n keyPath: \"indexId\",\n autoIncrement: !0\n }).createIndex(\"collectionGroupIndex\", \"collectionGroup\", {\n unique: !1\n });\n e.createObjectStore(\"indexState\", {\n keyPath: K\n }).createIndex(\"sequenceNumberIndex\", $, {\n unique: !1\n });\n e.createObjectStore(\"indexEntries\", {\n keyPath: U\n }).createIndex(\"documentKeyIndex\", W, {\n unique: !1\n });\n }(e)))), n < 16 && r >= 16 && (\n // Clear the object stores to remove possibly corrupted index entries\n s = s.next((() => {\n t.objectStore(\"indexState\").clear();\n })).next((() => {\n t.objectStore(\"indexEntries\").clear();\n }))), n < 17 && r >= 17 && (s = s.next((() => {\n !function __PRIVATE_createGlobalsStore(e) {\n e.createObjectStore(\"globals\", {\n keyPath: \"name\"\n });\n }(e);\n }))), s;\n }\n ri(e) {\n let t = 0;\n return e.store(\"remoteDocuments\").J(((e, n) => {\n t += __PRIVATE_dbDocumentSize(n);\n })).next((() => {\n const n = {\n byteSize: t\n };\n return e.store(\"remoteDocumentGlobal\").put(\"remoteDocumentGlobalKey\", n);\n }));\n }\n ni(e) {\n const t = e.store(\"mutationQueues\"), n = e.store(\"mutations\");\n return t.U().next((t => PersistencePromise.forEach(t, (t => {\n const r = IDBKeyRange.bound([ t.userId, -1 ], [ t.userId, t.lastAcknowledgedBatchId ]);\n return n.U(\"userMutationsIndex\", r).next((n => PersistencePromise.forEach(n, (n => {\n __PRIVATE_hardAssert(n.userId === t.userId);\n const r = __PRIVATE_fromDbMutationBatch(this.serializer, n);\n return removeMutationBatch(e, t.userId, r).next((() => {}));\n }))));\n }))));\n }\n /**\n * Ensures that every document in the remote document cache has a corresponding sentinel row\n * with a sequence number. Missing rows are given the most recently used sequence number.\n */ ii(e) {\n const t = e.store(\"targetDocuments\"), n = e.store(\"remoteDocuments\");\n return e.store(\"targetGlobal\").get(\"targetGlobalKey\").next((e => {\n const r = [];\n return n.J(((n, i) => {\n const s = new ResourcePath(n), o = function __PRIVATE_sentinelKey(e) {\n return [ 0, __PRIVATE_encodeResourcePath(e) ];\n }(s);\n r.push(t.get(o).next((n => n ? PersistencePromise.resolve() : (n => t.put({\n targetId: 0,\n path: __PRIVATE_encodeResourcePath(n),\n sequenceNumber: e.highestListenSequenceNumber\n }))(s))));\n })).next((() => PersistencePromise.waitFor(r)));\n }));\n }\n si(e, t) {\n // Create the index.\n e.createObjectStore(\"collectionParents\", {\n keyPath: Q\n });\n const n = t.store(\"collectionParents\"), r = new __PRIVATE_MemoryCollectionParentIndex, addEntry = e => {\n if (r.add(e)) {\n const t = e.lastSegment(), r = e.popLast();\n return n.put({\n collectionId: t,\n parent: __PRIVATE_encodeResourcePath(r)\n });\n }\n };\n // Helper to add an index entry iff we haven't already written it.\n // Index existing remote documents.\n return t.store(\"remoteDocuments\").J({\n H: !0\n }, ((e, t) => {\n const n = new ResourcePath(e);\n return addEntry(n.popLast());\n })).next((() => t.store(\"documentMutations\").J({\n H: !0\n }, (([e, t, n], r) => {\n const i = __PRIVATE_decodeResourcePath(t);\n return addEntry(i.popLast());\n }))));\n }\n oi(e) {\n const t = e.store(\"targets\");\n return t.J(((e, n) => {\n const r = __PRIVATE_fromDbTarget(n), i = __PRIVATE_toDbTarget(this.serializer, r);\n return t.put(i);\n }));\n }\n _i(e, t) {\n const n = t.store(\"remoteDocuments\"), r = [];\n return n.J(((e, n) => {\n const i = t.store(\"remoteDocumentsV14\"), s = function __PRIVATE_extractKey(e) {\n return e.document ? new DocumentKey(ResourcePath.fromString(e.document.name).popFirst(5)) : e.noDocument ? DocumentKey.fromSegments(e.noDocument.path) : e.unknownDocument ? DocumentKey.fromSegments(e.unknownDocument.path) : fail();\n }\n /**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ (n).path.toArray(), o = {\n prefixPath: s.slice(0, s.length - 2),\n collectionGroup: s[s.length - 2],\n documentId: s[s.length - 1],\n readTime: n.readTime || [ 0, 0 ],\n unknownDocument: n.unknownDocument,\n noDocument: n.noDocument,\n document: n.document,\n hasCommittedMutations: !!n.hasCommittedMutations\n };\n r.push(i.put(o));\n })).next((() => PersistencePromise.waitFor(r)));\n }\n ai(e, t) {\n const n = t.store(\"mutations\"), r = __PRIVATE_newIndexedDbRemoteDocumentCache(this.serializer), i = new __PRIVATE_MemoryPersistence(__PRIVATE_MemoryEagerDelegate.Zr, this.serializer.ct);\n return n.U().next((e => {\n const n = new Map;\n return e.forEach((e => {\n var t;\n let r = null !== (t = n.get(e.userId)) && void 0 !== t ? t : __PRIVATE_documentKeySet();\n __PRIVATE_fromDbMutationBatch(this.serializer, e).keys().forEach((e => r = r.add(e))), \n n.set(e.userId, r);\n })), PersistencePromise.forEach(n, ((e, n) => {\n const s = new User(n), o = __PRIVATE_IndexedDbDocumentOverlayCache.lt(this.serializer, s), _ = i.getIndexManager(s), a = __PRIVATE_IndexedDbMutationQueue.lt(s, this.serializer, _, i.referenceDelegate);\n return new LocalDocumentsView(r, a, o, _).recalculateAndSaveOverlaysForDocumentKeys(new __PRIVATE_IndexedDbTransaction(t, __PRIVATE_ListenSequence.oe), e).next();\n }));\n }));\n }\n}\n\nfunction __PRIVATE_createQueryCache(e) {\n e.createObjectStore(\"targetDocuments\", {\n keyPath: k\n }).createIndex(\"documentTargetsIndex\", q, {\n unique: !0\n });\n // NOTE: This is unique only because the TargetId is the suffix.\n e.createObjectStore(\"targets\", {\n keyPath: \"targetId\"\n }).createIndex(\"queryTargetsIndex\", B, {\n unique: !0\n }), e.createObjectStore(\"targetGlobal\");\n}\n\nconst Ve = \"Failed to obtain exclusive access to the persistence layer. To allow shared access, multi-tab synchronization has to be enabled in all tabs. If you are using `experimentalForceOwningTab:true`, make sure that only one tab has persistence enabled at any given time.\";\n\n/**\n * Oldest acceptable age in milliseconds for client metadata before the client\n * is considered inactive and its associated data is garbage collected.\n */\n/**\n * An IndexedDB-backed instance of Persistence. Data is stored persistently\n * across sessions.\n *\n * On Web only, the Firestore SDKs support shared access to its persistence\n * layer. This allows multiple browser tabs to read and write to IndexedDb and\n * to synchronize state even without network connectivity. Shared access is\n * currently optional and not enabled unless all clients invoke\n * `enablePersistence()` with `{synchronizeTabs:true}`.\n *\n * In multi-tab mode, if multiple clients are active at the same time, the SDK\n * will designate one client as the “primary client”. An effort is made to pick\n * a visible, network-connected and active client, and this client is\n * responsible for letting other clients know about its presence. The primary\n * client writes a unique client-generated identifier (the client ID) to\n * IndexedDb’s “owner” store every 4 seconds. If the primary client fails to\n * update this entry, another client can acquire the lease and take over as\n * primary.\n *\n * Some persistence operations in the SDK are designated as primary-client only\n * operations. This includes the acknowledgment of mutations and all updates of\n * remote documents. The effects of these operations are written to persistence\n * and then broadcast to other tabs via LocalStorage (see\n * `WebStorageSharedClientState`), which then refresh their state from\n * persistence.\n *\n * Similarly, the primary client listens to notifications sent by secondary\n * clients to discover persistence changes written by secondary clients, such as\n * the addition of new mutations and query targets.\n *\n * If multi-tab is not enabled and another tab already obtained the primary\n * lease, IndexedDbPersistence enters a failed state and all subsequent\n * operations will automatically fail.\n *\n * Additionally, there is an optimization so that when a tab is closed, the\n * primary lease is released immediately (this is especially important to make\n * sure that a refreshed tab is able to immediately re-acquire the primary\n * lease). Unfortunately, IndexedDB cannot be reliably used in window.unload\n * since it is an asynchronous API. So in addition to attempting to give up the\n * lease, the leaseholder writes its client ID to a \"zombiedClient\" entry in\n * LocalStorage which acts as an indicator that another tab should go ahead and\n * take the primary lease immediately regardless of the current lease timestamp.\n *\n * TODO(b/114226234): Remove `synchronizeTabs` section when multi-tab is no\n * longer optional.\n */\nclass __PRIVATE_IndexedDbPersistence {\n constructor(\n /**\n * Whether to synchronize the in-memory state of multiple tabs and share\n * access to local persistence.\n */\n e, t, n, r, i, s, o, _, a, \n /**\n * If set to true, forcefully obtains database access. Existing tabs will\n * no longer be able to access IndexedDB.\n */\n u, c = 17) {\n if (this.allowTabSynchronization = e, this.persistenceKey = t, this.clientId = n, \n this.ui = i, this.window = s, this.document = o, this.ci = a, this.li = u, this.hi = c, \n this.Qr = null, this.Kr = !1, this.isPrimary = !1, this.networkEnabled = !0, \n /** Our window.unload handler, if registered. */\n this.Pi = null, this.inForeground = !1, \n /** Our 'visibilitychange' listener if registered. */\n this.Ii = null, \n /** The client metadata refresh task. */\n this.Ti = null, \n /** The last time we garbage collected the client metadata object store. */\n this.Ei = Number.NEGATIVE_INFINITY, \n /** A listener to notify on primary state changes. */\n this.di = e => Promise.resolve(), !__PRIVATE_IndexedDbPersistence.D()) throw new FirestoreError(D.UNIMPLEMENTED, \"This platform is either missing IndexedDB or is known to have an incomplete implementation. Offline persistence has been disabled.\");\n this.referenceDelegate = new __PRIVATE_IndexedDbLruDelegateImpl(this, r), this.Ai = t + \"main\", \n this.serializer = new __PRIVATE_LocalSerializer(_), this.Ri = new __PRIVATE_SimpleDb(this.Ai, this.hi, new __PRIVATE_SchemaConverter(this.serializer)), \n this.$r = new __PRIVATE_IndexedDbGlobalsCache, this.Ur = new __PRIVATE_IndexedDbTargetCache(this.referenceDelegate, this.serializer), \n this.remoteDocumentCache = __PRIVATE_newIndexedDbRemoteDocumentCache(this.serializer), \n this.Gr = new __PRIVATE_IndexedDbBundleCache, this.window && this.window.localStorage ? this.Vi = this.window.localStorage : (this.Vi = null, \n !1 === u && __PRIVATE_logError(\"IndexedDbPersistence\", \"LocalStorage is unavailable. As a result, persistence may not work reliably. In particular enablePersistence() could fail immediately after refreshing the page.\"));\n }\n /**\n * Attempt to start IndexedDb persistence.\n *\n * @returns Whether persistence was enabled.\n */ start() {\n // NOTE: This is expected to fail sometimes (in the case of another tab\n // already having the persistence lock), so it's the first thing we should\n // do.\n return this.mi().then((() => {\n if (!this.isPrimary && !this.allowTabSynchronization) \n // Fail `start()` if `synchronizeTabs` is disabled and we cannot\n // obtain the primary lease.\n throw new FirestoreError(D.FAILED_PRECONDITION, Ve);\n return this.fi(), this.gi(), this.pi(), this.runTransaction(\"getHighestListenSequenceNumber\", \"readonly\", (e => this.Ur.getHighestSequenceNumber(e)));\n })).then((e => {\n this.Qr = new __PRIVATE_ListenSequence(e, this.ci);\n })).then((() => {\n this.Kr = !0;\n })).catch((e => (this.Ri && this.Ri.close(), Promise.reject(e))));\n }\n /**\n * Registers a listener that gets called when the primary state of the\n * instance changes. Upon registering, this listener is invoked immediately\n * with the current primary state.\n *\n * PORTING NOTE: This is only used for Web multi-tab.\n */ yi(e) {\n return this.di = async t => {\n if (this.started) return e(t);\n }, e(this.isPrimary);\n }\n /**\n * Registers a listener that gets called when the database receives a\n * version change event indicating that it has deleted.\n *\n * PORTING NOTE: This is only used for Web multi-tab.\n */ setDatabaseDeletedListener(e) {\n this.Ri.L((async t => {\n // Check if an attempt is made to delete IndexedDB.\n null === t.newVersion && await e();\n }));\n }\n /**\n * Adjusts the current network state in the client's metadata, potentially\n * affecting the primary lease.\n *\n * PORTING NOTE: This is only used for Web multi-tab.\n */ setNetworkEnabled(e) {\n this.networkEnabled !== e && (this.networkEnabled = e, \n // Schedule a primary lease refresh for immediate execution. The eventual\n // lease update will be propagated via `primaryStateListener`.\n this.ui.enqueueAndForget((async () => {\n this.started && await this.mi();\n })));\n }\n /**\n * Updates the client metadata in IndexedDb and attempts to either obtain or\n * extend the primary lease for the local client. Asynchronously notifies the\n * primary state listener if the client either newly obtained or released its\n * primary lease.\n */ mi() {\n return this.runTransaction(\"updateClientMetadataAndTryBecomePrimary\", \"readwrite\", (e => __PRIVATE_clientMetadataStore(e).put({\n clientId: this.clientId,\n updateTimeMs: Date.now(),\n networkEnabled: this.networkEnabled,\n inForeground: this.inForeground\n }).next((() => {\n if (this.isPrimary) return this.wi(e).next((e => {\n e || (this.isPrimary = !1, this.ui.enqueueRetryable((() => this.di(!1))));\n }));\n })).next((() => this.Si(e))).next((t => this.isPrimary && !t ? this.bi(e).next((() => !1)) : !!t && this.Di(e).next((() => !0)))))).catch((e => {\n if (__PRIVATE_isIndexedDbTransactionError(e)) \n // Proceed with the existing state. Any subsequent access to\n // IndexedDB will verify the lease.\n return __PRIVATE_logDebug(\"IndexedDbPersistence\", \"Failed to extend owner lease: \", e), \n this.isPrimary;\n if (!this.allowTabSynchronization) throw e;\n return __PRIVATE_logDebug(\"IndexedDbPersistence\", \"Releasing owner lease after error during lease refresh\", e), \n /* isPrimary= */ !1;\n })).then((e => {\n this.isPrimary !== e && this.ui.enqueueRetryable((() => this.di(e))), this.isPrimary = e;\n }));\n }\n wi(e) {\n return __PRIVATE_primaryClientStore(e).get(\"owner\").next((e => PersistencePromise.resolve(this.vi(e))));\n }\n Ci(e) {\n return __PRIVATE_clientMetadataStore(e).delete(this.clientId);\n }\n /**\n * If the garbage collection threshold has passed, prunes the\n * RemoteDocumentChanges and the ClientMetadata store based on the last update\n * time of all clients.\n */ async Fi() {\n if (this.isPrimary && !this.Mi(this.Ei, 18e5)) {\n this.Ei = Date.now();\n const e = await this.runTransaction(\"maybeGarbageCollectMultiClientState\", \"readwrite-primary\", (e => {\n const t = __PRIVATE_getStore(e, \"clientMetadata\");\n return t.U().next((e => {\n const n = this.xi(e, 18e5), r = e.filter((e => -1 === n.indexOf(e)));\n // Delete metadata for clients that are no longer considered active.\n return PersistencePromise.forEach(r, (e => t.delete(e.clientId))).next((() => r));\n }));\n })).catch((() => []));\n // Delete potential leftover entries that may continue to mark the\n // inactive clients as zombied in LocalStorage.\n // Ideally we'd delete the IndexedDb and LocalStorage zombie entries for\n // the client atomically, but we can't. So we opt to delete the IndexedDb\n // entries first to avoid potentially reviving a zombied client.\n if (this.Vi) for (const t of e) this.Vi.removeItem(this.Oi(t.clientId));\n }\n }\n /**\n * Schedules a recurring timer to update the client metadata and to either\n * extend or acquire the primary lease if the client is eligible.\n */ pi() {\n this.Ti = this.ui.enqueueAfterDelay(\"client_metadata_refresh\" /* TimerId.ClientMetadataRefresh */ , 4e3, (() => this.mi().then((() => this.Fi())).then((() => this.pi()))));\n }\n /** Checks whether `client` is the local client. */ vi(e) {\n return !!e && e.ownerId === this.clientId;\n }\n /**\n * Evaluate the state of all active clients and determine whether the local\n * client is or can act as the holder of the primary lease. Returns whether\n * the client is eligible for the lease, but does not actually acquire it.\n * May return 'false' even if there is no active leaseholder and another\n * (foreground) client should become leaseholder instead.\n */ Si(e) {\n if (this.li) return PersistencePromise.resolve(!0);\n return __PRIVATE_primaryClientStore(e).get(\"owner\").next((t => {\n // A client is eligible for the primary lease if:\n // - its network is enabled and the client's tab is in the foreground.\n // - its network is enabled and no other client's tab is in the\n // foreground.\n // - every clients network is disabled and the client's tab is in the\n // foreground.\n // - every clients network is disabled and no other client's tab is in\n // the foreground.\n // - the `forceOwningTab` setting was passed in.\n if (null !== t && this.Mi(t.leaseTimestampMs, 5e3) && !this.Ni(t.ownerId)) {\n if (this.vi(t) && this.networkEnabled) return !0;\n if (!this.vi(t)) {\n if (!t.allowTabSynchronization) \n // Fail the `canActAsPrimary` check if the current leaseholder has\n // not opted into multi-tab synchronization. If this happens at\n // client startup, we reject the Promise returned by\n // `enablePersistence()` and the user can continue to use Firestore\n // with in-memory persistence.\n // If this fails during a lease refresh, we will instead block the\n // AsyncQueue from executing further operations. Note that this is\n // acceptable since mixing & matching different `synchronizeTabs`\n // settings is not supported.\n // TODO(b/114226234): Remove this check when `synchronizeTabs` can\n // no longer be turned off.\n throw new FirestoreError(D.FAILED_PRECONDITION, Ve);\n return !1;\n }\n }\n return !(!this.networkEnabled || !this.inForeground) || __PRIVATE_clientMetadataStore(e).U().next((e => void 0 === this.xi(e, 5e3).find((e => {\n if (this.clientId !== e.clientId) {\n const t = !this.networkEnabled && e.networkEnabled, n = !this.inForeground && e.inForeground, r = this.networkEnabled === e.networkEnabled;\n if (t || n && r) return !0;\n }\n return !1;\n }))));\n })).next((e => (this.isPrimary !== e && __PRIVATE_logDebug(\"IndexedDbPersistence\", `Client ${e ? \"is\" : \"is not\"} eligible for a primary lease.`), \n e)));\n }\n async shutdown() {\n // The shutdown() operations are idempotent and can be called even when\n // start() aborted (e.g. because it couldn't acquire the persistence lease).\n this.Kr = !1, this.Li(), this.Ti && (this.Ti.cancel(), this.Ti = null), this.Bi(), \n this.ki(), \n // Use `SimpleDb.runTransaction` directly to avoid failing if another tab\n // has obtained the primary lease.\n await this.Ri.runTransaction(\"shutdown\", \"readwrite\", [ \"owner\", \"clientMetadata\" ], (e => {\n const t = new __PRIVATE_IndexedDbTransaction(e, __PRIVATE_ListenSequence.oe);\n return this.bi(t).next((() => this.Ci(t)));\n })), this.Ri.close(), \n // Remove the entry marking the client as zombied from LocalStorage since\n // we successfully deleted its metadata from IndexedDb.\n this.qi();\n }\n /**\n * Returns clients that are not zombied and have an updateTime within the\n * provided threshold.\n */ xi(e, t) {\n return e.filter((e => this.Mi(e.updateTimeMs, t) && !this.Ni(e.clientId)));\n }\n /**\n * Returns the IDs of the clients that are currently active. If multi-tab\n * is not supported, returns an array that only contains the local client's\n * ID.\n *\n * PORTING NOTE: This is only used for Web multi-tab.\n */ Qi() {\n return this.runTransaction(\"getActiveClients\", \"readonly\", (e => __PRIVATE_clientMetadataStore(e).U().next((e => this.xi(e, 18e5).map((e => e.clientId))))));\n }\n get started() {\n return this.Kr;\n }\n getGlobalsCache() {\n return this.$r;\n }\n getMutationQueue(e, t) {\n return __PRIVATE_IndexedDbMutationQueue.lt(e, this.serializer, t, this.referenceDelegate);\n }\n getTargetCache() {\n return this.Ur;\n }\n getRemoteDocumentCache() {\n return this.remoteDocumentCache;\n }\n getIndexManager(e) {\n return new __PRIVATE_IndexedDbIndexManager(e, this.serializer.ct.databaseId);\n }\n getDocumentOverlayCache(e) {\n return __PRIVATE_IndexedDbDocumentOverlayCache.lt(this.serializer, e);\n }\n getBundleCache() {\n return this.Gr;\n }\n runTransaction(e, t, n) {\n __PRIVATE_logDebug(\"IndexedDbPersistence\", \"Starting transaction:\", e);\n const r = \"readonly\" === t ? \"readonly\" : \"readwrite\", i = \n /** Returns the object stores for the provided schema. */\n function __PRIVATE_getObjectStores(e) {\n return 17 === e ? te : 16 === e ? ee : 15 === e ? X : 14 === e ? Z : 13 === e ? Y : 12 === e ? J : 11 === e ? H : void fail();\n }(this.hi);\n let s;\n // Do all transactions as readwrite against all object stores, since we\n // are the only reader/writer.\n return this.Ri.runTransaction(e, r, i, (r => (s = new __PRIVATE_IndexedDbTransaction(r, this.Qr ? this.Qr.next() : __PRIVATE_ListenSequence.oe), \n \"readwrite-primary\" === t ? this.wi(s).next((e => !!e || this.Si(s))).next((t => {\n if (!t) throw __PRIVATE_logError(`Failed to obtain primary lease for action '${e}'.`), \n this.isPrimary = !1, this.ui.enqueueRetryable((() => this.di(!1))), new FirestoreError(D.FAILED_PRECONDITION, C);\n return n(s);\n })).next((e => this.Di(s).next((() => e)))) : this.Ki(s).next((() => n(s)))))).then((e => (s.raiseOnCommittedEvent(), \n e)));\n }\n /**\n * Verifies that the current tab is the primary leaseholder or alternatively\n * that the leaseholder has opted into multi-tab synchronization.\n */\n // TODO(b/114226234): Remove this check when `synchronizeTabs` can no longer\n // be turned off.\n Ki(e) {\n return __PRIVATE_primaryClientStore(e).get(\"owner\").next((e => {\n if (null !== e && this.Mi(e.leaseTimestampMs, 5e3) && !this.Ni(e.ownerId) && !this.vi(e) && !(this.li || this.allowTabSynchronization && e.allowTabSynchronization)) throw new FirestoreError(D.FAILED_PRECONDITION, Ve);\n }));\n }\n /**\n * Obtains or extends the new primary lease for the local client. This\n * method does not verify that the client is eligible for this lease.\n */ Di(e) {\n const t = {\n ownerId: this.clientId,\n allowTabSynchronization: this.allowTabSynchronization,\n leaseTimestampMs: Date.now()\n };\n return __PRIVATE_primaryClientStore(e).put(\"owner\", t);\n }\n static D() {\n return __PRIVATE_SimpleDb.D();\n }\n /** Checks the primary lease and removes it if we are the current primary. */ bi(e) {\n const t = __PRIVATE_primaryClientStore(e);\n return t.get(\"owner\").next((e => this.vi(e) ? (__PRIVATE_logDebug(\"IndexedDbPersistence\", \"Releasing primary lease.\"), \n t.delete(\"owner\")) : PersistencePromise.resolve()));\n }\n /** Verifies that `updateTimeMs` is within `maxAgeMs`. */ Mi(e, t) {\n const n = Date.now();\n return !(e < n - t) && (!(e > n) || (__PRIVATE_logError(`Detected an update time that is in the future: ${e} > ${n}`), \n !1));\n }\n fi() {\n null !== this.document && \"function\" == typeof this.document.addEventListener && (this.Ii = () => {\n this.ui.enqueueAndForget((() => (this.inForeground = \"visible\" === this.document.visibilityState, \n this.mi())));\n }, this.document.addEventListener(\"visibilitychange\", this.Ii), this.inForeground = \"visible\" === this.document.visibilityState);\n }\n Bi() {\n this.Ii && (this.document.removeEventListener(\"visibilitychange\", this.Ii), this.Ii = null);\n }\n /**\n * Attaches a window.unload handler that will synchronously write our\n * clientId to a \"zombie client id\" location in LocalStorage. This can be used\n * by tabs trying to acquire the primary lease to determine that the lease\n * is no longer valid even if the timestamp is recent. This is particularly\n * important for the refresh case (so the tab correctly re-acquires the\n * primary lease). LocalStorage is used for this rather than IndexedDb because\n * it is a synchronous API and so can be used reliably from an unload\n * handler.\n */ gi() {\n var e;\n \"function\" == typeof (null === (e = this.window) || void 0 === e ? void 0 : e.addEventListener) && (this.Pi = () => {\n // Note: In theory, this should be scheduled on the AsyncQueue since it\n // accesses internal state. We execute this code directly during shutdown\n // to make sure it gets a chance to run.\n this.Li();\n const e = /(?:Version|Mobile)\\/1[456]/;\n isSafari() && (navigator.appVersion.match(e) || navigator.userAgent.match(e)) && \n // On Safari 14, 15, and 16, we do not run any cleanup actions as it might\n // trigger a bug that prevents Safari from re-opening IndexedDB during\n // the next page load.\n // See https://bugs.webkit.org/show_bug.cgi?id=226547\n this.ui.enterRestrictedMode(/* purgeExistingTasks= */ !0), this.ui.enqueueAndForget((() => this.shutdown()));\n }, this.window.addEventListener(\"pagehide\", this.Pi));\n }\n ki() {\n this.Pi && (this.window.removeEventListener(\"pagehide\", this.Pi), this.Pi = null);\n }\n /**\n * Returns whether a client is \"zombied\" based on its LocalStorage entry.\n * Clients become zombied when their tab closes without running all of the\n * cleanup logic in `shutdown()`.\n */ Ni(e) {\n var t;\n try {\n const n = null !== (null === (t = this.Vi) || void 0 === t ? void 0 : t.getItem(this.Oi(e)));\n return __PRIVATE_logDebug(\"IndexedDbPersistence\", `Client '${e}' ${n ? \"is\" : \"is not\"} zombied in LocalStorage`), \n n;\n } catch (e) {\n // Gracefully handle if LocalStorage isn't working.\n return __PRIVATE_logError(\"IndexedDbPersistence\", \"Failed to get zombied client id.\", e), \n !1;\n }\n }\n /**\n * Record client as zombied (a client that had its tab closed). Zombied\n * clients are ignored during primary tab selection.\n */ Li() {\n if (this.Vi) try {\n this.Vi.setItem(this.Oi(this.clientId), String(Date.now()));\n } catch (e) {\n // Gracefully handle if LocalStorage isn't available / working.\n __PRIVATE_logError(\"Failed to set zombie client id.\", e);\n }\n }\n /** Removes the zombied client entry if it exists. */ qi() {\n if (this.Vi) try {\n this.Vi.removeItem(this.Oi(this.clientId));\n } catch (e) {\n // Ignore\n }\n }\n Oi(e) {\n return `firestore_zombie_${this.persistenceKey}_${e}`;\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the primary client object store.\n */ function __PRIVATE_primaryClientStore(e) {\n return __PRIVATE_getStore(e, \"owner\");\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the client metadata object store.\n */ function __PRIVATE_clientMetadataStore(e) {\n return __PRIVATE_getStore(e, \"clientMetadata\");\n}\n\n/**\n * Generates a string used as a prefix when storing data in IndexedDB and\n * LocalStorage.\n */ function __PRIVATE_indexedDbStoragePrefix(e, t) {\n // Use two different prefix formats:\n // * firestore / persistenceKey / projectID . databaseID / ...\n // * firestore / persistenceKey / projectID / ...\n // projectIDs are DNS-compatible names and cannot contain dots\n // so there's no danger of collisions.\n let n = e.projectId;\n return e.isDefaultDatabase || (n += \".\" + e.database), \"firestore/\" + t + \"/\" + n + \"/\";\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A set of changes to what documents are currently in view and out of view for\n * a given query. These changes are sent to the LocalStore by the View (via\n * the SyncEngine) and are used to pin / unpin documents as appropriate.\n */\nclass __PRIVATE_LocalViewChanges {\n constructor(e, t, n, r) {\n this.targetId = e, this.fromCache = t, this.$i = n, this.Ui = r;\n }\n static Wi(e, t) {\n let n = __PRIVATE_documentKeySet(), r = __PRIVATE_documentKeySet();\n for (const e of t.docChanges) switch (e.type) {\n case 0 /* ChangeType.Added */ :\n n = n.add(e.doc.key);\n break;\n\n case 1 /* ChangeType.Removed */ :\n r = r.add(e.doc.key);\n // do nothing\n }\n return new __PRIVATE_LocalViewChanges(e, t.fromCache, n, r);\n }\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A tracker to keep a record of important details during database local query\n * execution.\n */ class QueryContext {\n constructor() {\n /**\n * Counts the number of documents passed through during local query execution.\n */\n this._documentReadCount = 0;\n }\n get documentReadCount() {\n return this._documentReadCount;\n }\n incrementDocumentReadCount(e) {\n this._documentReadCount += e;\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The Firestore query engine.\n *\n * Firestore queries can be executed in three modes. The Query Engine determines\n * what mode to use based on what data is persisted. The mode only determines\n * the runtime complexity of the query - the result set is equivalent across all\n * implementations.\n *\n * The Query engine will use indexed-based execution if a user has configured\n * any index that can be used to execute query (via `setIndexConfiguration()`).\n * Otherwise, the engine will try to optimize the query by re-using a previously\n * persisted query result. If that is not possible, the query will be executed\n * via a full collection scan.\n *\n * Index-based execution is the default when available. The query engine\n * supports partial indexed execution and merges the result from the index\n * lookup with documents that have not yet been indexed. The index evaluation\n * matches the backend's format and as such, the SDK can use indexing for all\n * queries that the backend supports.\n *\n * If no index exists, the query engine tries to take advantage of the target\n * document mapping in the TargetCache. These mappings exists for all queries\n * that have been synced with the backend at least once and allow the query\n * engine to only read documents that previously matched a query plus any\n * documents that were edited after the query was last listened to.\n *\n * There are some cases when this optimization is not guaranteed to produce\n * the same results as full collection scans. In these cases, query\n * processing falls back to full scans. These cases are:\n *\n * - Limit queries where a document that matched the query previously no longer\n * matches the query.\n *\n * - Limit queries where a document edit may cause the document to sort below\n * another document that is in the local cache.\n *\n * - Queries that have never been CURRENT or free of limbo documents.\n */\nclass __PRIVATE_QueryEngine {\n constructor() {\n this.Gi = !1, this.zi = !1, \n /**\n * SDK only decides whether it should create index when collection size is\n * larger than this.\n */\n this.ji = 100, this.Hi = \n /**\n * This cost represents the evaluation result of\n * (([index, docKey] + [docKey, docContent]) per document in the result set)\n * / ([docKey, docContent] per documents in full collection scan) coming from\n * experiment [enter PR experiment URL here].\n */\n function __PRIVATE_getDefaultRelativeIndexReadCostPerDocument() {\n // These values were derived from an experiment where several members of the\n // Firestore SDK team ran a performance test in various environments.\n // Googlers can see b/299284287 for details.\n return isSafari() ? 8 : __PRIVATE_getAndroidVersion(getUA()) > 0 ? 6 : 4;\n }();\n }\n /** Sets the document view to query against. */ initialize(e, t) {\n this.Ji = e, this.indexManager = t, this.Gi = !0;\n }\n /** Returns all local documents matching the specified query. */ getDocumentsMatchingQuery(e, t, n, r) {\n // Stores the result from executing the query; using this object is more\n // convenient than passing the result between steps of the persistence\n // transaction and improves readability comparatively.\n const i = {\n result: null\n };\n return this.Yi(e, t).next((e => {\n i.result = e;\n })).next((() => {\n if (!i.result) return this.Zi(e, t, r, n).next((e => {\n i.result = e;\n }));\n })).next((() => {\n if (i.result) return;\n const n = new QueryContext;\n return this.Xi(e, t, n).next((r => {\n if (i.result = r, this.zi) return this.es(e, t, n, r.size);\n }));\n })).next((() => i.result));\n }\n es(e, t, n, r) {\n return n.documentReadCount < this.ji ? (__PRIVATE_getLogLevel() <= LogLevel.DEBUG && __PRIVATE_logDebug(\"QueryEngine\", \"SDK will not create cache indexes for query:\", __PRIVATE_stringifyQuery(t), \"since it only creates cache indexes for collection contains\", \"more than or equal to\", this.ji, \"documents\"), \n PersistencePromise.resolve()) : (__PRIVATE_getLogLevel() <= LogLevel.DEBUG && __PRIVATE_logDebug(\"QueryEngine\", \"Query:\", __PRIVATE_stringifyQuery(t), \"scans\", n.documentReadCount, \"local documents and returns\", r, \"documents as results.\"), \n n.documentReadCount > this.Hi * r ? (__PRIVATE_getLogLevel() <= LogLevel.DEBUG && __PRIVATE_logDebug(\"QueryEngine\", \"The SDK decides to create cache indexes for query:\", __PRIVATE_stringifyQuery(t), \"as using cache indexes may help improve performance.\"), \n this.indexManager.createTargetIndexes(e, __PRIVATE_queryToTarget(t))) : PersistencePromise.resolve());\n }\n /**\n * Performs an indexed query that evaluates the query based on a collection's\n * persisted index values. Returns `null` if an index is not available.\n */ Yi(e, t) {\n if (__PRIVATE_queryMatchesAllDocuments(t)) \n // Queries that match all documents don't benefit from using\n // key-based lookups. It is more efficient to scan all documents in a\n // collection, rather than to perform individual lookups.\n return PersistencePromise.resolve(null);\n let n = __PRIVATE_queryToTarget(t);\n return this.indexManager.getIndexType(e, n).next((r => 0 /* IndexType.NONE */ === r ? null : (null !== t.limit && 1 /* IndexType.PARTIAL */ === r && (\n // We cannot apply a limit for targets that are served using a partial\n // index. If a partial index will be used to serve the target, the\n // query may return a superset of documents that match the target\n // (e.g. if the index doesn't include all the target's filters), or\n // may return the correct set of documents in the wrong order (e.g. if\n // the index doesn't include a segment for one of the orderBys).\n // Therefore, a limit should not be applied in such cases.\n t = __PRIVATE_queryWithLimit(t, null, \"F\" /* LimitType.First */), n = __PRIVATE_queryToTarget(t)), \n this.indexManager.getDocumentsMatchingTarget(e, n).next((r => {\n const i = __PRIVATE_documentKeySet(...r);\n return this.Ji.getDocuments(e, i).next((r => this.indexManager.getMinOffset(e, n).next((n => {\n const s = this.ts(t, r);\n return this.ns(t, s, i, n.readTime) ? this.Yi(e, __PRIVATE_queryWithLimit(t, null, \"F\" /* LimitType.First */)) : this.rs(e, s, t, n);\n }))));\n })))));\n }\n /**\n * Performs a query based on the target's persisted query mapping. Returns\n * `null` if the mapping is not available or cannot be used.\n */ Zi(e, t, n, r) {\n return __PRIVATE_queryMatchesAllDocuments(t) || r.isEqual(SnapshotVersion.min()) ? PersistencePromise.resolve(null) : this.Ji.getDocuments(e, n).next((i => {\n const s = this.ts(t, i);\n return this.ns(t, s, n, r) ? PersistencePromise.resolve(null) : (__PRIVATE_getLogLevel() <= LogLevel.DEBUG && __PRIVATE_logDebug(\"QueryEngine\", \"Re-using previous result from %s to execute query: %s\", r.toString(), __PRIVATE_stringifyQuery(t)), \n this.rs(e, s, t, __PRIVATE_newIndexOffsetSuccessorFromReadTime(r, -1)).next((e => e)));\n }));\n // Queries that have never seen a snapshot without limbo free documents\n // should also be run as a full collection scan.\n }\n /** Applies the query filter and sorting to the provided documents. */ ts(e, t) {\n // Sort the documents and re-apply the query filter since previously\n // matching documents do not necessarily still match the query.\n let n = new SortedSet(__PRIVATE_newQueryComparator(e));\n return t.forEach(((t, r) => {\n __PRIVATE_queryMatches(e, r) && (n = n.add(r));\n })), n;\n }\n /**\n * Determines if a limit query needs to be refilled from cache, making it\n * ineligible for index-free execution.\n *\n * @param query - The query.\n * @param sortedPreviousResults - The documents that matched the query when it\n * was last synchronized, sorted by the query's comparator.\n * @param remoteKeys - The document keys that matched the query at the last\n * snapshot.\n * @param limboFreeSnapshotVersion - The version of the snapshot when the\n * query was last synchronized.\n */ ns(e, t, n, r) {\n if (null === e.limit) \n // Queries without limits do not need to be refilled.\n return !1;\n if (n.size !== t.size) \n // The query needs to be refilled if a previously matching document no\n // longer matches.\n return !0;\n // Limit queries are not eligible for index-free query execution if there is\n // a potential that an older document from cache now sorts before a document\n // that was previously part of the limit. This, however, can only happen if\n // the document at the edge of the limit goes out of limit.\n // If a document that is not the limit boundary sorts differently,\n // the boundary of the limit itself did not change and documents from cache\n // will continue to be \"rejected\" by this boundary. Therefore, we can ignore\n // any modifications that don't affect the last document.\n const i = \"F\" /* LimitType.First */ === e.limitType ? t.last() : t.first();\n return !!i && (i.hasPendingWrites || i.version.compareTo(r) > 0);\n }\n Xi(e, t, n) {\n return __PRIVATE_getLogLevel() <= LogLevel.DEBUG && __PRIVATE_logDebug(\"QueryEngine\", \"Using full collection scan to execute query:\", __PRIVATE_stringifyQuery(t)), \n this.Ji.getDocumentsMatchingQuery(e, t, IndexOffset.min(), n);\n }\n /**\n * Combines the results from an indexed execution with the remaining documents\n * that have not yet been indexed.\n */ rs(e, t, n, r) {\n // Retrieve all results for documents that were updated since the offset.\n return this.Ji.getDocumentsMatchingQuery(e, n, r).next((e => (\n // Merge with existing results\n t.forEach((t => {\n e = e.insert(t.key, t);\n })), e)));\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Implements `LocalStore` interface.\n *\n * Note: some field defined in this class might have public access level, but\n * the class is not exported so they are only accessible from this module.\n * This is useful to implement optional features (like bundles) in free\n * functions, such that they are tree-shakeable.\n */\nclass __PRIVATE_LocalStoreImpl {\n constructor(\n /** Manages our in-memory or durable persistence. */\n e, t, n, r) {\n this.persistence = e, this.ss = t, this.serializer = r, \n /**\n * Maps a targetID to data about its target.\n *\n * PORTING NOTE: We are using an immutable data structure on Web to make re-runs\n * of `applyRemoteEvent()` idempotent.\n */\n this.os = new SortedMap(__PRIVATE_primitiveComparator), \n /** Maps a target to its targetID. */\n // TODO(wuandy): Evaluate if TargetId can be part of Target.\n this._s = new ObjectMap((e => __PRIVATE_canonifyTarget(e)), __PRIVATE_targetEquals), \n /**\n * A per collection group index of the last read time processed by\n * `getNewDocumentChanges()`.\n *\n * PORTING NOTE: This is only used for multi-tab synchronization.\n */\n this.us = new Map, this.cs = e.getRemoteDocumentCache(), this.Ur = e.getTargetCache(), \n this.Gr = e.getBundleCache(), this.ls(n);\n }\n ls(e) {\n // TODO(indexing): Add spec tests that test these components change after a\n // user change\n this.documentOverlayCache = this.persistence.getDocumentOverlayCache(e), this.indexManager = this.persistence.getIndexManager(e), \n this.mutationQueue = this.persistence.getMutationQueue(e, this.indexManager), this.localDocuments = new LocalDocumentsView(this.cs, this.mutationQueue, this.documentOverlayCache, this.indexManager), \n this.cs.setIndexManager(this.indexManager), this.ss.initialize(this.localDocuments, this.indexManager);\n }\n collectGarbage(e) {\n return this.persistence.runTransaction(\"Collect garbage\", \"readwrite-primary\", (t => e.collect(t, this.os)));\n }\n}\n\nfunction __PRIVATE_newLocalStore(\n/** Manages our in-memory or durable persistence. */\ne, t, n, r) {\n return new __PRIVATE_LocalStoreImpl(e, t, n, r);\n}\n\n/**\n * Tells the LocalStore that the currently authenticated user has changed.\n *\n * In response the local store switches the mutation queue to the new user and\n * returns any resulting document changes.\n */\n// PORTING NOTE: Android and iOS only return the documents affected by the\n// change.\nasync function __PRIVATE_localStoreHandleUserChange(e, t) {\n const n = __PRIVATE_debugCast(e);\n return await n.persistence.runTransaction(\"Handle user change\", \"readonly\", (e => {\n // Swap out the mutation queue, grabbing the pending mutation batches\n // before and after.\n let r;\n return n.mutationQueue.getAllMutationBatches(e).next((i => (r = i, n.ls(t), n.mutationQueue.getAllMutationBatches(e)))).next((t => {\n const i = [], s = [];\n // Union the old/new changed keys.\n let o = __PRIVATE_documentKeySet();\n for (const e of r) {\n i.push(e.batchId);\n for (const t of e.mutations) o = o.add(t.key);\n }\n for (const e of t) {\n s.push(e.batchId);\n for (const t of e.mutations) o = o.add(t.key);\n }\n // Return the set of all (potentially) changed documents and the list\n // of mutation batch IDs that were affected by change.\n return n.localDocuments.getDocuments(e, o).next((e => ({\n hs: e,\n removedBatchIds: i,\n addedBatchIds: s\n })));\n }));\n }));\n}\n\n/* Accepts locally generated Mutations and commit them to storage. */\n/**\n * Acknowledges the given batch.\n *\n * On the happy path when a batch is acknowledged, the local store will\n *\n * + remove the batch from the mutation queue;\n * + apply the changes to the remote document cache;\n * + recalculate the latency compensated view implied by those changes (there\n * may be mutations in the queue that affect the documents but haven't been\n * acknowledged yet); and\n * + give the changed documents back the sync engine\n *\n * @returns The resulting (modified) documents.\n */\nfunction __PRIVATE_localStoreAcknowledgeBatch(e, t) {\n const n = __PRIVATE_debugCast(e);\n return n.persistence.runTransaction(\"Acknowledge batch\", \"readwrite-primary\", (e => {\n const r = t.batch.keys(), i = n.cs.newChangeBuffer({\n trackRemovals: !0\n });\n return function __PRIVATE_applyWriteToRemoteDocuments(e, t, n, r) {\n const i = n.batch, s = i.keys();\n let o = PersistencePromise.resolve();\n return s.forEach((e => {\n o = o.next((() => r.getEntry(t, e))).next((t => {\n const s = n.docVersions.get(e);\n __PRIVATE_hardAssert(null !== s), t.version.compareTo(s) < 0 && (i.applyToRemoteDocument(t, n), \n t.isValidDocument() && (\n // We use the commitVersion as the readTime rather than the\n // document's updateTime since the updateTime is not advanced\n // for updates that do not modify the underlying document.\n t.setReadTime(n.commitVersion), r.addEntry(t)));\n }));\n })), o.next((() => e.mutationQueue.removeMutationBatch(t, i)));\n }\n /** Returns the local view of the documents affected by a mutation batch. */\n // PORTING NOTE: Multi-Tab only.\n (n, e, t, i).next((() => i.apply(e))).next((() => n.mutationQueue.performConsistencyCheck(e))).next((() => n.documentOverlayCache.removeOverlaysForBatchId(e, r, t.batch.batchId))).next((() => n.localDocuments.recalculateAndSaveOverlaysForDocumentKeys(e, function __PRIVATE_getKeysWithTransformResults(e) {\n let t = __PRIVATE_documentKeySet();\n for (let n = 0; n < e.mutationResults.length; ++n) {\n e.mutationResults[n].transformResults.length > 0 && (t = t.add(e.batch.mutations[n].key));\n }\n return t;\n }\n /**\n * Removes mutations from the MutationQueue for the specified batch;\n * LocalDocuments will be recalculated.\n *\n * @returns The resulting modified documents.\n */ (t)))).next((() => n.localDocuments.getDocuments(e, r)));\n }));\n}\n\n/**\n * Returns the last consistent snapshot processed (used by the RemoteStore to\n * determine whether to buffer incoming snapshots from the backend).\n */\nfunction __PRIVATE_localStoreGetLastRemoteSnapshotVersion(e) {\n const t = __PRIVATE_debugCast(e);\n return t.persistence.runTransaction(\"Get last remote snapshot version\", \"readonly\", (e => t.Ur.getLastRemoteSnapshotVersion(e)));\n}\n\n/**\n * Updates the \"ground-state\" (remote) documents. We assume that the remote\n * event reflects any write batches that have been acknowledged or rejected\n * (i.e. we do not re-apply local mutations to updates from this event).\n *\n * LocalDocuments are re-calculated if there are remaining mutations in the\n * queue.\n */ function __PRIVATE_localStoreApplyRemoteEventToLocalCache(e, t) {\n const n = __PRIVATE_debugCast(e), r = t.snapshotVersion;\n let i = n.os;\n return n.persistence.runTransaction(\"Apply remote event\", \"readwrite-primary\", (e => {\n const s = n.cs.newChangeBuffer({\n trackRemovals: !0\n });\n // Reset newTargetDataByTargetMap in case this transaction gets re-run.\n i = n.os;\n const o = [];\n t.targetChanges.forEach(((s, _) => {\n const a = i.get(_);\n if (!a) return;\n // Only update the remote keys if the target is still active. This\n // ensures that we can persist the updated target data along with\n // the updated assignment.\n o.push(n.Ur.removeMatchingKeys(e, s.removedDocuments, _).next((() => n.Ur.addMatchingKeys(e, s.addedDocuments, _))));\n let u = a.withSequenceNumber(e.currentSequenceNumber);\n null !== t.targetMismatches.get(_) ? u = u.withResumeToken(ByteString.EMPTY_BYTE_STRING, SnapshotVersion.min()).withLastLimboFreeSnapshotVersion(SnapshotVersion.min()) : s.resumeToken.approximateByteSize() > 0 && (u = u.withResumeToken(s.resumeToken, r)), \n i = i.insert(_, u), \n // Update the target data if there are target changes (or if\n // sufficient time has passed since the last update).\n /**\n * Returns true if the newTargetData should be persisted during an update of\n * an active target. TargetData should always be persisted when a target is\n * being released and should not call this function.\n *\n * While the target is active, TargetData updates can be omitted when nothing\n * about the target has changed except metadata like the resume token or\n * snapshot version. Occasionally it's worth the extra write to prevent these\n * values from getting too stale after a crash, but this doesn't have to be\n * too frequent.\n */\n function __PRIVATE_shouldPersistTargetData(e, t, n) {\n // Always persist target data if we don't already have a resume token.\n if (0 === e.resumeToken.approximateByteSize()) return !0;\n // Don't allow resume token changes to be buffered indefinitely. This\n // allows us to be reasonably up-to-date after a crash and avoids needing\n // to loop over all active queries on shutdown. Especially in the browser\n // we may not get time to do anything interesting while the current tab is\n // closing.\n if (t.snapshotVersion.toMicroseconds() - e.snapshotVersion.toMicroseconds() >= 3e8) return !0;\n // Otherwise if the only thing that has changed about a target is its resume\n // token it's not worth persisting. Note that the RemoteStore keeps an\n // in-memory view of the currently active targets which includes the current\n // resume token, so stream failure or user changes will still use an\n // up-to-date resume token regardless of what we do here.\n return n.addedDocuments.size + n.modifiedDocuments.size + n.removedDocuments.size > 0;\n }\n /**\n * Notifies local store of the changed views to locally pin documents.\n */ (a, u, s) && o.push(n.Ur.updateTargetData(e, u));\n }));\n let _ = __PRIVATE_mutableDocumentMap(), a = __PRIVATE_documentKeySet();\n // HACK: The only reason we allow a null snapshot version is so that we\n // can synthesize remote events when we get permission denied errors while\n // trying to resolve the state of a locally cached document that is in\n // limbo.\n if (t.documentUpdates.forEach((r => {\n t.resolvedLimboDocuments.has(r) && o.push(n.persistence.referenceDelegate.updateLimboDocument(e, r));\n })), \n // Each loop iteration only affects its \"own\" doc, so it's safe to get all\n // the remote documents in advance in a single call.\n o.push(__PRIVATE_populateDocumentChangeBuffer(e, s, t.documentUpdates).next((e => {\n _ = e.Ps, a = e.Is;\n }))), !r.isEqual(SnapshotVersion.min())) {\n const t = n.Ur.getLastRemoteSnapshotVersion(e).next((t => n.Ur.setTargetsMetadata(e, e.currentSequenceNumber, r)));\n o.push(t);\n }\n return PersistencePromise.waitFor(o).next((() => s.apply(e))).next((() => n.localDocuments.getLocalViewOfDocuments(e, _, a))).next((() => _));\n })).then((e => (n.os = i, e)));\n}\n\n/**\n * Populates document change buffer with documents from backend or a bundle.\n * Returns the document changes resulting from applying those documents, and\n * also a set of documents whose existence state are changed as a result.\n *\n * @param txn - Transaction to use to read existing documents from storage.\n * @param documentBuffer - Document buffer to collect the resulted changes to be\n * applied to storage.\n * @param documents - Documents to be applied.\n */ function __PRIVATE_populateDocumentChangeBuffer(e, t, n) {\n let r = __PRIVATE_documentKeySet(), i = __PRIVATE_documentKeySet();\n return n.forEach((e => r = r.add(e))), t.getEntries(e, r).next((e => {\n let r = __PRIVATE_mutableDocumentMap();\n return n.forEach(((n, s) => {\n const o = e.get(n);\n // Check if see if there is a existence state change for this document.\n s.isFoundDocument() !== o.isFoundDocument() && (i = i.add(n)), \n // Note: The order of the steps below is important, since we want\n // to ensure that rejected limbo resolutions (which fabricate\n // NoDocuments with SnapshotVersion.min()) never add documents to\n // cache.\n s.isNoDocument() && s.version.isEqual(SnapshotVersion.min()) ? (\n // NoDocuments with SnapshotVersion.min() are used in manufactured\n // events. We remove these documents from cache since we lost\n // access.\n t.removeEntry(n, s.readTime), r = r.insert(n, s)) : !o.isValidDocument() || s.version.compareTo(o.version) > 0 || 0 === s.version.compareTo(o.version) && o.hasPendingWrites ? (t.addEntry(s), \n r = r.insert(n, s)) : __PRIVATE_logDebug(\"LocalStore\", \"Ignoring outdated watch update for \", n, \". Current version:\", o.version, \" Watch version:\", s.version);\n })), {\n Ps: r,\n Is: i\n };\n }));\n}\n\n/**\n * Gets the mutation batch after the passed in batchId in the mutation queue\n * or null if empty.\n * @param afterBatchId - If provided, the batch to search after.\n * @returns The next mutation or null if there wasn't one.\n */\nfunction __PRIVATE_localStoreGetNextMutationBatch(e, t) {\n const n = __PRIVATE_debugCast(e);\n return n.persistence.runTransaction(\"Get next mutation batch\", \"readonly\", (e => (void 0 === t && (t = -1), \n n.mutationQueue.getNextMutationBatchAfterBatchId(e, t))));\n}\n\n/**\n * Reads the current value of a Document with a given key or null if not\n * found - used for testing.\n */\n/**\n * Assigns the given target an internal ID so that its results can be pinned so\n * they don't get GC'd. A target must be allocated in the local store before\n * the store can be used to manage its view.\n *\n * Allocating an already allocated `Target` will return the existing `TargetData`\n * for that `Target`.\n */\nfunction __PRIVATE_localStoreAllocateTarget(e, t) {\n const n = __PRIVATE_debugCast(e);\n return n.persistence.runTransaction(\"Allocate target\", \"readwrite\", (e => {\n let r;\n return n.Ur.getTargetData(e, t).next((i => i ? (\n // This target has been listened to previously, so reuse the\n // previous targetID.\n // TODO(mcg): freshen last accessed date?\n r = i, PersistencePromise.resolve(r)) : n.Ur.allocateTargetId(e).next((i => (r = new TargetData(t, i, \"TargetPurposeListen\" /* TargetPurpose.Listen */ , e.currentSequenceNumber), \n n.Ur.addTargetData(e, r).next((() => r)))))));\n })).then((e => {\n // If Multi-Tab is enabled, the existing target data may be newer than\n // the in-memory data\n const r = n.os.get(e.targetId);\n return (null === r || e.snapshotVersion.compareTo(r.snapshotVersion) > 0) && (n.os = n.os.insert(e.targetId, e), \n n._s.set(t, e.targetId)), e;\n }));\n}\n\n/**\n * Returns the TargetData as seen by the LocalStore, including updates that may\n * have not yet been persisted to the TargetCache.\n */\n// Visible for testing.\n/**\n * Unpins all the documents associated with the given target. If\n * `keepPersistedTargetData` is set to false and Eager GC enabled, the method\n * directly removes the associated target data from the target cache.\n *\n * Releasing a non-existing `Target` is a no-op.\n */\n// PORTING NOTE: `keepPersistedTargetData` is multi-tab only.\nasync function __PRIVATE_localStoreReleaseTarget(e, t, n) {\n const r = __PRIVATE_debugCast(e), i = r.os.get(t), s = n ? \"readwrite\" : \"readwrite-primary\";\n try {\n n || await r.persistence.runTransaction(\"Release target\", s, (e => r.persistence.referenceDelegate.removeTarget(e, i)));\n } catch (e) {\n if (!__PRIVATE_isIndexedDbTransactionError(e)) throw e;\n // All `releaseTarget` does is record the final metadata state for the\n // target, but we've been recording this periodically during target\n // activity. If we lose this write this could cause a very slight\n // difference in the order of target deletion during GC, but we\n // don't define exact LRU semantics so this is acceptable.\n __PRIVATE_logDebug(\"LocalStore\", `Failed to update sequence numbers for target ${t}: ${e}`);\n }\n r.os = r.os.remove(t), r._s.delete(i.target);\n}\n\n/**\n * Runs the specified query against the local store and returns the results,\n * potentially taking advantage of query data from previous executions (such\n * as the set of remote keys).\n *\n * @param usePreviousResults - Whether results from previous executions can\n * be used to optimize this query execution.\n */ function __PRIVATE_localStoreExecuteQuery(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n let i = SnapshotVersion.min(), s = __PRIVATE_documentKeySet();\n return r.persistence.runTransaction(\"Execute query\", \"readwrite\", (// Use readwrite instead of readonly so indexes can be created\n // Use readwrite instead of readonly so indexes can be created\n e => function __PRIVATE_localStoreGetTargetData(e, t, n) {\n const r = __PRIVATE_debugCast(e), i = r._s.get(n);\n return void 0 !== i ? PersistencePromise.resolve(r.os.get(i)) : r.Ur.getTargetData(t, n);\n }(r, e, __PRIVATE_queryToTarget(t)).next((t => {\n if (t) return i = t.lastLimboFreeSnapshotVersion, r.Ur.getMatchingKeysForTargetId(e, t.targetId).next((e => {\n s = e;\n }));\n })).next((() => r.ss.getDocumentsMatchingQuery(e, t, n ? i : SnapshotVersion.min(), n ? s : __PRIVATE_documentKeySet()))).next((e => (__PRIVATE_setMaxReadTime(r, __PRIVATE_queryCollectionGroup(t), e), \n {\n documents: e,\n Ts: s\n })))));\n}\n\n// PORTING NOTE: Multi-Tab only.\nfunction __PRIVATE_localStoreGetCachedTarget(e, t) {\n const n = __PRIVATE_debugCast(e), r = __PRIVATE_debugCast(n.Ur), i = n.os.get(t);\n return i ? Promise.resolve(i.target) : n.persistence.runTransaction(\"Get target data\", \"readonly\", (e => r.ot(e, t).next((e => e ? e.target : null))));\n}\n\n/**\n * Returns the set of documents that have been updated since the last call.\n * If this is the first call, returns the set of changes since client\n * initialization. Further invocations will return document that have changed\n * since the prior call.\n */\n// PORTING NOTE: Multi-Tab only.\nfunction __PRIVATE_localStoreGetNewDocumentChanges(e, t) {\n const n = __PRIVATE_debugCast(e), r = n.us.get(t) || SnapshotVersion.min();\n // Get the current maximum read time for the collection. This should always\n // exist, but to reduce the chance for regressions we default to\n // SnapshotVersion.Min()\n // TODO(indexing): Consider removing the default value.\n return n.persistence.runTransaction(\"Get new document changes\", \"readonly\", (e => n.cs.getAllFromCollectionGroup(e, t, __PRIVATE_newIndexOffsetSuccessorFromReadTime(r, -1), \n /* limit= */ Number.MAX_SAFE_INTEGER))).then((e => (__PRIVATE_setMaxReadTime(n, t, e), \n e)));\n}\n\n/** Sets the collection group's maximum read time from the given documents. */\n// PORTING NOTE: Multi-Tab only.\nfunction __PRIVATE_setMaxReadTime(e, t, n) {\n let r = e.us.get(t) || SnapshotVersion.min();\n n.forEach(((e, t) => {\n t.readTime.compareTo(r) > 0 && (r = t.readTime);\n })), e.us.set(t, r);\n}\n\n/**\n * Creates a new target using the given bundle name, which will be used to\n * hold the keys of all documents from the bundle in query-document mappings.\n * This ensures that the loaded documents do not get garbage collected\n * right away.\n */\n/**\n * Applies the documents from a bundle to the \"ground-state\" (remote)\n * documents.\n *\n * LocalDocuments are re-calculated if there are remaining mutations in the\n * queue.\n */\nasync function __PRIVATE_localStoreApplyBundledDocuments(e, t, n, r) {\n const i = __PRIVATE_debugCast(e);\n let s = __PRIVATE_documentKeySet(), o = __PRIVATE_mutableDocumentMap();\n for (const e of n) {\n const n = t.Es(e.metadata.name);\n e.document && (s = s.add(n));\n const r = t.ds(e);\n r.setReadTime(t.As(e.metadata.readTime)), o = o.insert(n, r);\n }\n const _ = i.cs.newChangeBuffer({\n trackRemovals: !0\n }), a = await __PRIVATE_localStoreAllocateTarget(i, function __PRIVATE_umbrellaTarget(e) {\n // It is OK that the path used for the query is not valid, because this will\n // not be read and queried.\n return __PRIVATE_queryToTarget(__PRIVATE_newQueryForPath(ResourcePath.fromString(`__bundle__/docs/${e}`)));\n }(r));\n // Allocates a target to hold all document keys from the bundle, such that\n // they will not get garbage collected right away.\n return i.persistence.runTransaction(\"Apply bundle documents\", \"readwrite\", (e => __PRIVATE_populateDocumentChangeBuffer(e, _, o).next((t => (_.apply(e), \n t))).next((t => i.Ur.removeMatchingKeysForTargetId(e, a.targetId).next((() => i.Ur.addMatchingKeys(e, s, a.targetId))).next((() => i.localDocuments.getLocalViewOfDocuments(e, t.Ps, t.Is))).next((() => t.Ps))))));\n}\n\n/**\n * Returns a promise of a boolean to indicate if the given bundle has already\n * been loaded and the create time is newer than the current loading bundle.\n */\n/**\n * Saves the given `NamedQuery` to local persistence.\n */\nasync function __PRIVATE_localStoreSaveNamedQuery(e, t, n = __PRIVATE_documentKeySet()) {\n // Allocate a target for the named query such that it can be resumed\n // from associated read time if users use it to listen.\n // NOTE: this also means if no corresponding target exists, the new target\n // will remain active and will not get collected, unless users happen to\n // unlisten the query somehow.\n const r = await __PRIVATE_localStoreAllocateTarget(e, __PRIVATE_queryToTarget(__PRIVATE_fromBundledQuery(t.bundledQuery))), i = __PRIVATE_debugCast(e);\n return i.persistence.runTransaction(\"Save named query\", \"readwrite\", (e => {\n const s = __PRIVATE_fromVersion(t.readTime);\n // Simply save the query itself if it is older than what the SDK already\n // has.\n if (r.snapshotVersion.compareTo(s) >= 0) return i.Gr.saveNamedQuery(e, t);\n // Update existing target data because the query from the bundle is newer.\n const o = r.withResumeToken(ByteString.EMPTY_BYTE_STRING, s);\n return i.os = i.os.insert(o.targetId, o), i.Ur.updateTargetData(e, o).next((() => i.Ur.removeMatchingKeysForTargetId(e, r.targetId))).next((() => i.Ur.addMatchingKeys(e, n, r.targetId))).next((() => i.Gr.saveNamedQuery(e, t)));\n }));\n}\n\n/** Assembles the key for a client state in WebStorage */\nfunction createWebStorageClientStateKey(e, t) {\n return `firestore_clients_${e}_${t}`;\n}\n\n// The format of the WebStorage key that stores the mutation state is:\n// firestore_mutations__\n// (for unauthenticated users)\n// or: firestore_mutations___\n\n// 'user_uid' is last to avoid needing to escape '_' characters that it might\n// contain.\n/** Assembles the key for a mutation batch in WebStorage */\nfunction createWebStorageMutationBatchKey(e, t, n) {\n let r = `firestore_mutations_${e}_${n}`;\n return t.isAuthenticated() && (r += `_${t.uid}`), r;\n}\n\n// The format of the WebStorage key that stores a query target's metadata is:\n// firestore_targets__\n/** Assembles the key for a query state in WebStorage */\nfunction createWebStorageQueryTargetMetadataKey(e, t) {\n return `firestore_targets_${e}_${t}`;\n}\n\n// The WebStorage prefix that stores the primary tab's online state. The\n// format of the key is:\n// firestore_online_state_\n/**\n * Holds the state of a mutation batch, including its user ID, batch ID and\n * whether the batch is 'pending', 'acknowledged' or 'rejected'.\n */\n// Visible for testing\nclass __PRIVATE_MutationMetadata {\n constructor(e, t, n, r) {\n this.user = e, this.batchId = t, this.state = n, this.error = r;\n }\n /**\n * Parses a MutationMetadata from its JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */ static Rs(e, t, n) {\n const r = JSON.parse(n);\n let i, s = \"object\" == typeof r && -1 !== [ \"pending\", \"acknowledged\", \"rejected\" ].indexOf(r.state) && (void 0 === r.error || \"object\" == typeof r.error);\n return s && r.error && (s = \"string\" == typeof r.error.message && \"string\" == typeof r.error.code, \n s && (i = new FirestoreError(r.error.code, r.error.message))), s ? new __PRIVATE_MutationMetadata(e, t, r.state, i) : (__PRIVATE_logError(\"SharedClientState\", `Failed to parse mutation state for ID '${t}': ${n}`), \n null);\n }\n Vs() {\n const e = {\n state: this.state,\n updateTimeMs: Date.now()\n };\n return this.error && (e.error = {\n code: this.error.code,\n message: this.error.message\n }), JSON.stringify(e);\n }\n}\n\n/**\n * Holds the state of a query target, including its target ID and whether the\n * target is 'not-current', 'current' or 'rejected'.\n */\n// Visible for testing\nclass __PRIVATE_QueryTargetMetadata {\n constructor(e, t, n) {\n this.targetId = e, this.state = t, this.error = n;\n }\n /**\n * Parses a QueryTargetMetadata from its JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */ static Rs(e, t) {\n const n = JSON.parse(t);\n let r, i = \"object\" == typeof n && -1 !== [ \"not-current\", \"current\", \"rejected\" ].indexOf(n.state) && (void 0 === n.error || \"object\" == typeof n.error);\n return i && n.error && (i = \"string\" == typeof n.error.message && \"string\" == typeof n.error.code, \n i && (r = new FirestoreError(n.error.code, n.error.message))), i ? new __PRIVATE_QueryTargetMetadata(e, n.state, r) : (__PRIVATE_logError(\"SharedClientState\", `Failed to parse target state for ID '${e}': ${t}`), \n null);\n }\n Vs() {\n const e = {\n state: this.state,\n updateTimeMs: Date.now()\n };\n return this.error && (e.error = {\n code: this.error.code,\n message: this.error.message\n }), JSON.stringify(e);\n }\n}\n\n/**\n * This class represents the immutable ClientState for a client read from\n * WebStorage, containing the list of active query targets.\n */ class __PRIVATE_RemoteClientState {\n constructor(e, t) {\n this.clientId = e, this.activeTargetIds = t;\n }\n /**\n * Parses a RemoteClientState from the JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */ static Rs(e, t) {\n const n = JSON.parse(t);\n let r = \"object\" == typeof n && n.activeTargetIds instanceof Array, i = __PRIVATE_targetIdSet();\n for (let e = 0; r && e < n.activeTargetIds.length; ++e) r = isSafeInteger(n.activeTargetIds[e]), \n i = i.add(n.activeTargetIds[e]);\n return r ? new __PRIVATE_RemoteClientState(e, i) : (__PRIVATE_logError(\"SharedClientState\", `Failed to parse client data for instance '${e}': ${t}`), \n null);\n }\n}\n\n/**\n * This class represents the online state for all clients participating in\n * multi-tab. The online state is only written to by the primary client, and\n * used in secondary clients to update their query views.\n */ class __PRIVATE_SharedOnlineState {\n constructor(e, t) {\n this.clientId = e, this.onlineState = t;\n }\n /**\n * Parses a SharedOnlineState from its JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */ static Rs(e) {\n const t = JSON.parse(e);\n return \"object\" == typeof t && -1 !== [ \"Unknown\", \"Online\", \"Offline\" ].indexOf(t.onlineState) && \"string\" == typeof t.clientId ? new __PRIVATE_SharedOnlineState(t.clientId, t.onlineState) : (__PRIVATE_logError(\"SharedClientState\", `Failed to parse online state: ${e}`), \n null);\n }\n}\n\n/**\n * Metadata state of the local client. Unlike `RemoteClientState`, this class is\n * mutable and keeps track of all pending mutations, which allows us to\n * update the range of pending mutation batch IDs as new mutations are added or\n * removed.\n *\n * The data in `LocalClientState` is not read from WebStorage and instead\n * updated via its instance methods. The updated state can be serialized via\n * `toWebStorageJSON()`.\n */\n// Visible for testing.\nclass __PRIVATE_LocalClientState {\n constructor() {\n this.activeTargetIds = __PRIVATE_targetIdSet();\n }\n fs(e) {\n this.activeTargetIds = this.activeTargetIds.add(e);\n }\n gs(e) {\n this.activeTargetIds = this.activeTargetIds.delete(e);\n }\n /**\n * Converts this entry into a JSON-encoded format we can use for WebStorage.\n * Does not encode `clientId` as it is part of the key in WebStorage.\n */ Vs() {\n const e = {\n activeTargetIds: this.activeTargetIds.toArray(),\n updateTimeMs: Date.now()\n };\n return JSON.stringify(e);\n }\n}\n\n/**\n * `WebStorageSharedClientState` uses WebStorage (window.localStorage) as the\n * backing store for the SharedClientState. It keeps track of all active\n * clients and supports modifications of the local client's data.\n */ class __PRIVATE_WebStorageSharedClientState {\n constructor(e, t, n, r, i) {\n this.window = e, this.ui = t, this.persistenceKey = n, this.ps = r, this.syncEngine = null, \n this.onlineStateHandler = null, this.sequenceNumberHandler = null, this.ys = this.ws.bind(this), \n this.Ss = new SortedMap(__PRIVATE_primitiveComparator), this.started = !1, \n /**\n * Captures WebStorage events that occur before `start()` is called. These\n * events are replayed once `WebStorageSharedClientState` is started.\n */\n this.bs = [];\n // Escape the special characters mentioned here:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n const s = n.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n this.storage = this.window.localStorage, this.currentUser = i, this.Ds = createWebStorageClientStateKey(this.persistenceKey, this.ps), \n this.vs = \n /** Assembles the key for the current sequence number. */\n function createWebStorageSequenceNumberKey(e) {\n return `firestore_sequence_number_${e}`;\n }\n /**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ (this.persistenceKey), this.Ss = this.Ss.insert(this.ps, new __PRIVATE_LocalClientState), \n this.Cs = new RegExp(`^firestore_clients_${s}_([^_]*)$`), this.Fs = new RegExp(`^firestore_mutations_${s}_(\\\\d+)(?:_(.*))?$`), \n this.Ms = new RegExp(`^firestore_targets_${s}_(\\\\d+)$`), this.xs = \n /** Assembles the key for the online state of the primary tab. */\n function createWebStorageOnlineStateKey(e) {\n return `firestore_online_state_${e}`;\n }\n // The WebStorage prefix that plays as a event to indicate the remote documents\n // might have changed due to some secondary tabs loading a bundle.\n // format of the key is:\n // firestore_bundle_loaded_v2_\n // The version ending with \"v2\" stores the list of modified collection groups.\n (this.persistenceKey), this.Os = function createBundleLoadedKey(e) {\n return `firestore_bundle_loaded_v2_${e}`;\n }\n // The WebStorage key prefix for the key that stores the last sequence number allocated. The key\n // looks like 'firestore_sequence_number_'.\n (this.persistenceKey), \n // Rather than adding the storage observer during start(), we add the\n // storage observer during initialization. This ensures that we collect\n // events before other components populate their initial state (during their\n // respective start() calls). Otherwise, we might for example miss a\n // mutation that is added after LocalStore's start() processed the existing\n // mutations but before we observe WebStorage events.\n this.window.addEventListener(\"storage\", this.ys);\n }\n /** Returns 'true' if WebStorage is available in the current environment. */ static D(e) {\n return !(!e || !e.localStorage);\n }\n async start() {\n // Retrieve the list of existing clients to backfill the data in\n // SharedClientState.\n const e = await this.syncEngine.Qi();\n for (const t of e) {\n if (t === this.ps) continue;\n const e = this.getItem(createWebStorageClientStateKey(this.persistenceKey, t));\n if (e) {\n const n = __PRIVATE_RemoteClientState.Rs(t, e);\n n && (this.Ss = this.Ss.insert(n.clientId, n));\n }\n }\n this.Ns();\n // Check if there is an existing online state and call the callback handler\n // if applicable.\n const t = this.storage.getItem(this.xs);\n if (t) {\n const e = this.Ls(t);\n e && this.Bs(e);\n }\n for (const e of this.bs) this.ws(e);\n this.bs = [], \n // Register a window unload hook to remove the client metadata entry from\n // WebStorage even if `shutdown()` was not called.\n this.window.addEventListener(\"pagehide\", (() => this.shutdown())), this.started = !0;\n }\n writeSequenceNumber(e) {\n this.setItem(this.vs, JSON.stringify(e));\n }\n getAllActiveQueryTargets() {\n return this.ks(this.Ss);\n }\n isActiveQueryTarget(e) {\n let t = !1;\n return this.Ss.forEach(((n, r) => {\n r.activeTargetIds.has(e) && (t = !0);\n })), t;\n }\n addPendingMutation(e) {\n this.qs(e, \"pending\");\n }\n updateMutationState(e, t, n) {\n this.qs(e, t, n), \n // Once a final mutation result is observed by other clients, they no longer\n // access the mutation's metadata entry. Since WebStorage replays events\n // in order, it is safe to delete the entry right after updating it.\n this.Qs(e);\n }\n addLocalQueryTarget(e, t = !0) {\n let n = \"not-current\";\n // Lookup an existing query state if the target ID was already registered\n // by another tab\n if (this.isActiveQueryTarget(e)) {\n const t = this.storage.getItem(createWebStorageQueryTargetMetadataKey(this.persistenceKey, e));\n if (t) {\n const r = __PRIVATE_QueryTargetMetadata.Rs(e, t);\n r && (n = r.state);\n }\n }\n // If the query is listening to cache only, the target ID should not be registered with the\n // local Firestore client as an active watch target.\n return t && this.Ks.fs(e), this.Ns(), n;\n }\n removeLocalQueryTarget(e) {\n this.Ks.gs(e), this.Ns();\n }\n isLocalQueryTarget(e) {\n return this.Ks.activeTargetIds.has(e);\n }\n clearQueryState(e) {\n this.removeItem(createWebStorageQueryTargetMetadataKey(this.persistenceKey, e));\n }\n updateQueryState(e, t, n) {\n this.$s(e, t, n);\n }\n handleUserChange(e, t, n) {\n t.forEach((e => {\n this.Qs(e);\n })), this.currentUser = e, n.forEach((e => {\n this.addPendingMutation(e);\n }));\n }\n setOnlineState(e) {\n this.Us(e);\n }\n notifyBundleLoaded(e) {\n this.Ws(e);\n }\n shutdown() {\n this.started && (this.window.removeEventListener(\"storage\", this.ys), this.removeItem(this.Ds), \n this.started = !1);\n }\n getItem(e) {\n const t = this.storage.getItem(e);\n return __PRIVATE_logDebug(\"SharedClientState\", \"READ\", e, t), t;\n }\n setItem(e, t) {\n __PRIVATE_logDebug(\"SharedClientState\", \"SET\", e, t), this.storage.setItem(e, t);\n }\n removeItem(e) {\n __PRIVATE_logDebug(\"SharedClientState\", \"REMOVE\", e), this.storage.removeItem(e);\n }\n ws(e) {\n // Note: The function is typed to take Event to be interface-compatible with\n // `Window.addEventListener`.\n const t = e;\n if (t.storageArea === this.storage) {\n if (__PRIVATE_logDebug(\"SharedClientState\", \"EVENT\", t.key, t.newValue), t.key === this.Ds) return void __PRIVATE_logError(\"Received WebStorage notification for local change. Another client might have garbage-collected our state\");\n this.ui.enqueueRetryable((async () => {\n if (this.started) {\n if (null !== t.key) if (this.Cs.test(t.key)) {\n if (null == t.newValue) {\n const e = this.Gs(t.key);\n return this.zs(e, null);\n }\n {\n const e = this.js(t.key, t.newValue);\n if (e) return this.zs(e.clientId, e);\n }\n } else if (this.Fs.test(t.key)) {\n if (null !== t.newValue) {\n const e = this.Hs(t.key, t.newValue);\n if (e) return this.Js(e);\n }\n } else if (this.Ms.test(t.key)) {\n if (null !== t.newValue) {\n const e = this.Ys(t.key, t.newValue);\n if (e) return this.Zs(e);\n }\n } else if (t.key === this.xs) {\n if (null !== t.newValue) {\n const e = this.Ls(t.newValue);\n if (e) return this.Bs(e);\n }\n } else if (t.key === this.vs) {\n const e = function __PRIVATE_fromWebStorageSequenceNumber(e) {\n let t = __PRIVATE_ListenSequence.oe;\n if (null != e) try {\n const n = JSON.parse(e);\n __PRIVATE_hardAssert(\"number\" == typeof n), t = n;\n } catch (e) {\n __PRIVATE_logError(\"SharedClientState\", \"Failed to read sequence number from WebStorage\", e);\n }\n return t;\n }\n /**\n * `MemorySharedClientState` is a simple implementation of SharedClientState for\n * clients using memory persistence. The state in this class remains fully\n * isolated and no synchronization is performed.\n */ (t.newValue);\n e !== __PRIVATE_ListenSequence.oe && this.sequenceNumberHandler(e);\n } else if (t.key === this.Os) {\n const e = this.Xs(t.newValue);\n await Promise.all(e.map((e => this.syncEngine.eo(e))));\n }\n } else this.bs.push(t);\n }));\n }\n }\n get Ks() {\n return this.Ss.get(this.ps);\n }\n Ns() {\n this.setItem(this.Ds, this.Ks.Vs());\n }\n qs(e, t, n) {\n const r = new __PRIVATE_MutationMetadata(this.currentUser, e, t, n), i = createWebStorageMutationBatchKey(this.persistenceKey, this.currentUser, e);\n this.setItem(i, r.Vs());\n }\n Qs(e) {\n const t = createWebStorageMutationBatchKey(this.persistenceKey, this.currentUser, e);\n this.removeItem(t);\n }\n Us(e) {\n const t = {\n clientId: this.ps,\n onlineState: e\n };\n this.storage.setItem(this.xs, JSON.stringify(t));\n }\n $s(e, t, n) {\n const r = createWebStorageQueryTargetMetadataKey(this.persistenceKey, e), i = new __PRIVATE_QueryTargetMetadata(e, t, n);\n this.setItem(r, i.Vs());\n }\n Ws(e) {\n const t = JSON.stringify(Array.from(e));\n this.setItem(this.Os, t);\n }\n /**\n * Parses a client state key in WebStorage. Returns null if the key does not\n * match the expected key format.\n */ Gs(e) {\n const t = this.Cs.exec(e);\n return t ? t[1] : null;\n }\n /**\n * Parses a client state in WebStorage. Returns 'null' if the value could not\n * be parsed.\n */ js(e, t) {\n const n = this.Gs(e);\n return __PRIVATE_RemoteClientState.Rs(n, t);\n }\n /**\n * Parses a mutation batch state in WebStorage. Returns 'null' if the value\n * could not be parsed.\n */ Hs(e, t) {\n const n = this.Fs.exec(e), r = Number(n[1]), i = void 0 !== n[2] ? n[2] : null;\n return __PRIVATE_MutationMetadata.Rs(new User(i), r, t);\n }\n /**\n * Parses a query target state from WebStorage. Returns 'null' if the value\n * could not be parsed.\n */ Ys(e, t) {\n const n = this.Ms.exec(e), r = Number(n[1]);\n return __PRIVATE_QueryTargetMetadata.Rs(r, t);\n }\n /**\n * Parses an online state from WebStorage. Returns 'null' if the value\n * could not be parsed.\n */ Ls(e) {\n return __PRIVATE_SharedOnlineState.Rs(e);\n }\n Xs(e) {\n return JSON.parse(e);\n }\n async Js(e) {\n if (e.user.uid === this.currentUser.uid) return this.syncEngine.no(e.batchId, e.state, e.error);\n __PRIVATE_logDebug(\"SharedClientState\", `Ignoring mutation for non-active user ${e.user.uid}`);\n }\n Zs(e) {\n return this.syncEngine.ro(e.targetId, e.state, e.error);\n }\n zs(e, t) {\n const n = t ? this.Ss.insert(e, t) : this.Ss.remove(e), r = this.ks(this.Ss), i = this.ks(n), s = [], o = [];\n return i.forEach((e => {\n r.has(e) || s.push(e);\n })), r.forEach((e => {\n i.has(e) || o.push(e);\n })), this.syncEngine.io(s, o).then((() => {\n this.Ss = n;\n }));\n }\n Bs(e) {\n // We check whether the client that wrote this online state is still active\n // by comparing its client ID to the list of clients kept active in\n // IndexedDb. If a client does not update their IndexedDb client state\n // within 5 seconds, it is considered inactive and we don't emit an online\n // state event.\n this.Ss.get(e.clientId) && this.onlineStateHandler(e.onlineState);\n }\n ks(e) {\n let t = __PRIVATE_targetIdSet();\n return e.forEach(((e, n) => {\n t = t.unionWith(n.activeTargetIds);\n })), t;\n }\n}\n\nclass __PRIVATE_MemorySharedClientState {\n constructor() {\n this.so = new __PRIVATE_LocalClientState, this.oo = {}, this.onlineStateHandler = null, \n this.sequenceNumberHandler = null;\n }\n addPendingMutation(e) {\n // No op.\n }\n updateMutationState(e, t, n) {\n // No op.\n }\n addLocalQueryTarget(e, t = !0) {\n return t && this.so.fs(e), this.oo[e] || \"not-current\";\n }\n updateQueryState(e, t, n) {\n this.oo[e] = t;\n }\n removeLocalQueryTarget(e) {\n this.so.gs(e);\n }\n isLocalQueryTarget(e) {\n return this.so.activeTargetIds.has(e);\n }\n clearQueryState(e) {\n delete this.oo[e];\n }\n getAllActiveQueryTargets() {\n return this.so.activeTargetIds;\n }\n isActiveQueryTarget(e) {\n return this.so.activeTargetIds.has(e);\n }\n start() {\n return this.so = new __PRIVATE_LocalClientState, Promise.resolve();\n }\n handleUserChange(e, t, n) {\n // No op.\n }\n setOnlineState(e) {\n // No op.\n }\n shutdown() {}\n writeSequenceNumber(e) {}\n notifyBundleLoaded(e) {\n // No op.\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_NoopConnectivityMonitor {\n _o(e) {\n // No-op.\n }\n shutdown() {\n // No-op.\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// References to `window` are guarded by BrowserConnectivityMonitor.isAvailable()\n/* eslint-disable no-restricted-globals */\n/**\n * Browser implementation of ConnectivityMonitor.\n */\nclass __PRIVATE_BrowserConnectivityMonitor {\n constructor() {\n this.ao = () => this.uo(), this.co = () => this.lo(), this.ho = [], this.Po();\n }\n _o(e) {\n this.ho.push(e);\n }\n shutdown() {\n window.removeEventListener(\"online\", this.ao), window.removeEventListener(\"offline\", this.co);\n }\n Po() {\n window.addEventListener(\"online\", this.ao), window.addEventListener(\"offline\", this.co);\n }\n uo() {\n __PRIVATE_logDebug(\"ConnectivityMonitor\", \"Network connectivity changed: AVAILABLE\");\n for (const e of this.ho) e(0 /* NetworkStatus.AVAILABLE */);\n }\n lo() {\n __PRIVATE_logDebug(\"ConnectivityMonitor\", \"Network connectivity changed: UNAVAILABLE\");\n for (const e of this.ho) e(1 /* NetworkStatus.UNAVAILABLE */);\n }\n // TODO(chenbrian): Consider passing in window either into this component or\n // here for testing via FakeWindow.\n /** Checks that all used attributes of window are available. */\n static D() {\n return \"undefined\" != typeof window && void 0 !== window.addEventListener && void 0 !== window.removeEventListener;\n }\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The value returned from the most recent invocation of\n * `generateUniqueDebugId()`, or null if it has never been invoked.\n */ let me = null;\n\n/**\n * Generates and returns an initial value for `lastUniqueDebugId`.\n *\n * The returned value is randomly selected from a range of integers that are\n * represented as 8 hexadecimal digits. This means that (within reason) any\n * numbers generated by incrementing the returned number by 1 will also be\n * represented by 8 hexadecimal digits. This leads to all \"IDs\" having the same\n * length when converted to a hexadecimal string, making reading logs containing\n * these IDs easier to follow. And since the return value is randomly selected\n * it will help to differentiate between logs from different executions.\n */\n/**\n * Generates and returns a unique ID as a hexadecimal string.\n *\n * The returned ID is intended to be used in debug logging messages to help\n * correlate log messages that may be spatially separated in the logs, but\n * logically related. For example, a network connection could include the same\n * \"debug ID\" string in all of its log messages to help trace a specific\n * connection over time.\n *\n * @return the 10-character generated ID (e.g. \"0xa1b2c3d4\").\n */\nfunction __PRIVATE_generateUniqueDebugId() {\n return null === me ? me = function __PRIVATE_generateInitialUniqueDebugId() {\n return 268435456 + Math.round(2147483648 * Math.random());\n }() : me++, \"0x\" + me.toString(16);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const fe = {\n BatchGetDocuments: \"batchGet\",\n Commit: \"commit\",\n RunQuery: \"runQuery\",\n RunAggregationQuery: \"runAggregationQuery\"\n};\n\n/**\n * Maps RPC names to the corresponding REST endpoint name.\n *\n * We use array notation to avoid mangling.\n */\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Provides a simple helper class that implements the Stream interface to\n * bridge to other implementations that are streams but do not implement the\n * interface. The stream callbacks are invoked with the callOn... methods.\n */\nclass __PRIVATE_StreamBridge {\n constructor(e) {\n this.Io = e.Io, this.To = e.To;\n }\n Eo(e) {\n this.Ao = e;\n }\n Ro(e) {\n this.Vo = e;\n }\n mo(e) {\n this.fo = e;\n }\n onMessage(e) {\n this.po = e;\n }\n close() {\n this.To();\n }\n send(e) {\n this.Io(e);\n }\n yo() {\n this.Ao();\n }\n wo() {\n this.Vo();\n }\n So(e) {\n this.fo(e);\n }\n bo(e) {\n this.po(e);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const ge = \"WebChannelConnection\";\n\nclass __PRIVATE_WebChannelConnection extends \n/**\n * Base class for all Rest-based connections to the backend (WebChannel and\n * HTTP).\n */\nclass __PRIVATE_RestConnection {\n constructor(e) {\n this.databaseInfo = e, this.databaseId = e.databaseId;\n const t = e.ssl ? \"https\" : \"http\", n = encodeURIComponent(this.databaseId.projectId), r = encodeURIComponent(this.databaseId.database);\n this.Do = t + \"://\" + e.host, this.vo = `projects/${n}/databases/${r}`, this.Co = \"(default)\" === this.databaseId.database ? `project_id=${n}` : `project_id=${n}&database_id=${r}`;\n }\n get Fo() {\n // Both `invokeRPC()` and `invokeStreamingRPC()` use their `path` arguments to determine\n // where to run the query, and expect the `request` to NOT specify the \"path\".\n return !1;\n }\n Mo(e, t, n, r, i) {\n const s = __PRIVATE_generateUniqueDebugId(), o = this.xo(e, t.toUriEncodedString());\n __PRIVATE_logDebug(\"RestConnection\", `Sending RPC '${e}' ${s}:`, o, n);\n const _ = {\n \"google-cloud-resource-prefix\": this.vo,\n \"x-goog-request-params\": this.Co\n };\n return this.Oo(_, r, i), this.No(e, o, _, n).then((t => (__PRIVATE_logDebug(\"RestConnection\", `Received RPC '${e}' ${s}: `, t), \n t)), (t => {\n throw __PRIVATE_logWarn(\"RestConnection\", `RPC '${e}' ${s} failed with error: `, t, \"url: \", o, \"request:\", n), \n t;\n }));\n }\n Lo(e, t, n, r, i, s) {\n // The REST API automatically aggregates all of the streamed results, so we\n // can just use the normal invoke() method.\n return this.Mo(e, t, n, r, i);\n }\n /**\n * Modifies the headers for a request, adding any authorization token if\n * present and any additional headers for the request.\n */ Oo(e, t, n) {\n e[\"X-Goog-Api-Client\"] = \n // SDK_VERSION is updated to different value at runtime depending on the entry point,\n // so we need to get its value when we need it in a function.\n function __PRIVATE_getGoogApiClientValue() {\n return \"gl-js/ fire/\" + S;\n }(), \n // Content-Type: text/plain will avoid preflight requests which might\n // mess with CORS and redirects by proxies. If we add custom headers\n // we will need to change this code to potentially use the $httpOverwrite\n // parameter supported by ESF to avoid triggering preflight requests.\n e[\"Content-Type\"] = \"text/plain\", this.databaseInfo.appId && (e[\"X-Firebase-GMPID\"] = this.databaseInfo.appId), \n t && t.headers.forEach(((t, n) => e[n] = t)), n && n.headers.forEach(((t, n) => e[n] = t));\n }\n xo(e, t) {\n const n = fe[e];\n return `${this.Do}/v1/${t}:${n}`;\n }\n /**\n * Closes and cleans up any resources associated with the connection. This\n * implementation is a no-op because there are no resources associated\n * with the RestConnection that need to be cleaned up.\n */ terminate() {\n // No-op\n }\n} {\n constructor(e) {\n super(e), this.forceLongPolling = e.forceLongPolling, this.autoDetectLongPolling = e.autoDetectLongPolling, \n this.useFetchStreams = e.useFetchStreams, this.longPollingOptions = e.longPollingOptions;\n }\n No(e, t, n, r) {\n const i = __PRIVATE_generateUniqueDebugId();\n return new Promise(((s, o) => {\n const _ = new XhrIo;\n _.setWithCredentials(!0), _.listenOnce(EventType.COMPLETE, (() => {\n try {\n switch (_.getLastErrorCode()) {\n case ErrorCode.NO_ERROR:\n const t = _.getResponseJson();\n __PRIVATE_logDebug(ge, `XHR for RPC '${e}' ${i} received:`, JSON.stringify(t)), \n s(t);\n break;\n\n case ErrorCode.TIMEOUT:\n __PRIVATE_logDebug(ge, `RPC '${e}' ${i} timed out`), o(new FirestoreError(D.DEADLINE_EXCEEDED, \"Request time out\"));\n break;\n\n case ErrorCode.HTTP_ERROR:\n const n = _.getStatus();\n if (__PRIVATE_logDebug(ge, `RPC '${e}' ${i} failed with status:`, n, \"response text:\", _.getResponseText()), \n n > 0) {\n let e = _.getResponseJson();\n Array.isArray(e) && (e = e[0]);\n const t = null == e ? void 0 : e.error;\n if (t && t.status && t.message) {\n const e = function __PRIVATE_mapCodeFromHttpResponseErrorStatus(e) {\n const t = e.toLowerCase().replace(/_/g, \"-\");\n return Object.values(D).indexOf(t) >= 0 ? t : D.UNKNOWN;\n }(t.status);\n o(new FirestoreError(e, t.message));\n } else o(new FirestoreError(D.UNKNOWN, \"Server responded with status \" + _.getStatus()));\n } else \n // If we received an HTTP_ERROR but there's no status code,\n // it's most probably a connection issue\n o(new FirestoreError(D.UNAVAILABLE, \"Connection failed.\"));\n break;\n\n default:\n fail();\n }\n } finally {\n __PRIVATE_logDebug(ge, `RPC '${e}' ${i} completed.`);\n }\n }));\n const a = JSON.stringify(r);\n __PRIVATE_logDebug(ge, `RPC '${e}' ${i} sending request:`, r), _.send(t, \"POST\", a, n, 15);\n }));\n }\n Bo(e, t, n) {\n const r = __PRIVATE_generateUniqueDebugId(), i = [ this.Do, \"/\", \"google.firestore.v1.Firestore\", \"/\", e, \"/channel\" ], s = createWebChannelTransport(), o = getStatEventTarget(), _ = {\n // Required for backend stickiness, routing behavior is based on this\n // parameter.\n httpSessionIdParam: \"gsessionid\",\n initMessageHeaders: {},\n messageUrlParams: {\n // This param is used to improve routing and project isolation by the\n // backend and must be included in every request.\n database: `projects/${this.databaseId.projectId}/databases/${this.databaseId.database}`\n },\n sendRawJson: !0,\n supportsCrossDomainXhr: !0,\n internalChannelParams: {\n // Override the default timeout (randomized between 10-20 seconds) since\n // a large write batch on a slow internet connection may take a long\n // time to send to the backend. Rather than have WebChannel impose a\n // tight timeout which could lead to infinite timeouts and retries, we\n // set it very large (5-10 minutes) and rely on the browser's builtin\n // timeouts to kick in if the request isn't working.\n forwardChannelRequestTimeoutMs: 6e5\n },\n forceLongPolling: this.forceLongPolling,\n detectBufferingProxy: this.autoDetectLongPolling\n }, a = this.longPollingOptions.timeoutSeconds;\n void 0 !== a && (_.longPollingTimeout = Math.round(1e3 * a)), this.useFetchStreams && (_.useFetchStreams = !0), \n this.Oo(_.initMessageHeaders, t, n), \n // Sending the custom headers we just added to request.initMessageHeaders\n // (Authorization, etc.) will trigger the browser to make a CORS preflight\n // request because the XHR will no longer meet the criteria for a \"simple\"\n // CORS request:\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests\n // Therefore to avoid the CORS preflight request (an extra network\n // roundtrip), we use the encodeInitMessageHeaders option to specify that\n // the headers should instead be encoded in the request's POST payload,\n // which is recognized by the webchannel backend.\n _.encodeInitMessageHeaders = !0;\n const u = i.join(\"\");\n __PRIVATE_logDebug(ge, `Creating RPC '${e}' stream ${r}: ${u}`, _);\n const c = s.createWebChannel(u, _);\n // WebChannel supports sending the first message with the handshake - saving\n // a network round trip. However, it will have to call send in the same\n // JS event loop as open. In order to enforce this, we delay actually\n // opening the WebChannel until send is called. Whether we have called\n // open is tracked with this variable.\n let l = !1, h = !1;\n // A flag to determine whether the stream was closed (by us or through an\n // error/close event) to avoid delivering multiple close events or sending\n // on a closed stream\n const P = new __PRIVATE_StreamBridge({\n Io: t => {\n h ? __PRIVATE_logDebug(ge, `Not sending because RPC '${e}' stream ${r} is closed:`, t) : (l || (__PRIVATE_logDebug(ge, `Opening RPC '${e}' stream ${r} transport.`), \n c.open(), l = !0), __PRIVATE_logDebug(ge, `RPC '${e}' stream ${r} sending:`, t), \n c.send(t));\n },\n To: () => c.close()\n }), __PRIVATE_unguardedEventListen = (e, t, n) => {\n // TODO(dimond): closure typing seems broken because WebChannel does\n // not implement goog.events.Listenable\n e.listen(t, (e => {\n try {\n n(e);\n } catch (e) {\n setTimeout((() => {\n throw e;\n }), 0);\n }\n }));\n };\n // Closure events are guarded and exceptions are swallowed, so catch any\n // exception and rethrow using a setTimeout so they become visible again.\n // Note that eventually this function could go away if we are confident\n // enough the code is exception free.\n return __PRIVATE_unguardedEventListen(c, WebChannel.EventType.OPEN, (() => {\n h || (__PRIVATE_logDebug(ge, `RPC '${e}' stream ${r} transport opened.`), P.yo());\n })), __PRIVATE_unguardedEventListen(c, WebChannel.EventType.CLOSE, (() => {\n h || (h = !0, __PRIVATE_logDebug(ge, `RPC '${e}' stream ${r} transport closed`), \n P.So());\n })), __PRIVATE_unguardedEventListen(c, WebChannel.EventType.ERROR, (t => {\n h || (h = !0, __PRIVATE_logWarn(ge, `RPC '${e}' stream ${r} transport errored:`, t), \n P.So(new FirestoreError(D.UNAVAILABLE, \"The operation could not be completed\")));\n })), __PRIVATE_unguardedEventListen(c, WebChannel.EventType.MESSAGE, (t => {\n var n;\n if (!h) {\n const i = t.data[0];\n __PRIVATE_hardAssert(!!i);\n // TODO(b/35143891): There is a bug in One Platform that caused errors\n // (and only errors) to be wrapped in an extra array. To be forward\n // compatible with the bug we need to check either condition. The latter\n // can be removed once the fix has been rolled out.\n // Use any because msgData.error is not typed.\n const s = i, o = s.error || (null === (n = s[0]) || void 0 === n ? void 0 : n.error);\n if (o) {\n __PRIVATE_logDebug(ge, `RPC '${e}' stream ${r} received error:`, o);\n // error.status will be a string like 'OK' or 'NOT_FOUND'.\n const t = o.status;\n let n = \n /**\n * Maps an error Code from a GRPC status identifier like 'NOT_FOUND'.\n *\n * @returns The Code equivalent to the given status string or undefined if\n * there is no match.\n */\n function __PRIVATE_mapCodeFromRpcStatus(e) {\n // lookup by string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const t = le[e];\n if (void 0 !== t) return __PRIVATE_mapCodeFromRpcCode(t);\n }(t), i = o.message;\n void 0 === n && (n = D.INTERNAL, i = \"Unknown error status: \" + t + \" with message \" + o.message), \n // Mark closed so no further events are propagated\n h = !0, P.So(new FirestoreError(n, i)), c.close();\n } else __PRIVATE_logDebug(ge, `RPC '${e}' stream ${r} received:`, i), P.bo(i);\n }\n })), __PRIVATE_unguardedEventListen(o, Event.STAT_EVENT, (t => {\n t.stat === Stat.PROXY ? __PRIVATE_logDebug(ge, `RPC '${e}' stream ${r} detected buffering proxy`) : t.stat === Stat.NOPROXY && __PRIVATE_logDebug(ge, `RPC '${e}' stream ${r} detected no buffering proxy`);\n })), setTimeout((() => {\n // Technically we could/should wait for the WebChannel opened event,\n // but because we want to send the first message with the WebChannel\n // handshake we pretend the channel opened here (asynchronously), and\n // then delay the actual open until the first message is sent.\n P.wo();\n }), 0), P;\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Initializes the WebChannelConnection for the browser. */\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** The Platform's 'window' implementation or null if not available. */\nfunction __PRIVATE_getWindow() {\n // `window` is not always available, e.g. in ReactNative and WebWorkers.\n // eslint-disable-next-line no-restricted-globals\n return \"undefined\" != typeof window ? window : null;\n}\n\n/** The Platform's 'document' implementation or null if not available. */ function getDocument() {\n // `document` is not always available, e.g. in ReactNative and WebWorkers.\n // eslint-disable-next-line no-restricted-globals\n return \"undefined\" != typeof document ? document : null;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ function __PRIVATE_newSerializer(e) {\n return new JsonProtoSerializer(e, /* useProto3Json= */ !0);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A helper for running delayed tasks following an exponential backoff curve\n * between attempts.\n *\n * Each delay is made up of a \"base\" delay which follows the exponential\n * backoff curve, and a +/- 50% \"jitter\" that is calculated and added to the\n * base delay. This prevents clients from accidentally synchronizing their\n * delays causing spikes of load to the backend.\n */\nclass __PRIVATE_ExponentialBackoff {\n constructor(\n /**\n * The AsyncQueue to run backoff operations on.\n */\n e, \n /**\n * The ID to use when scheduling backoff operations on the AsyncQueue.\n */\n t, \n /**\n * The initial delay (used as the base delay on the first retry attempt).\n * Note that jitter will still be applied, so the actual delay could be as\n * little as 0.5*initialDelayMs.\n */\n n = 1e3\n /**\n * The multiplier to use to determine the extended base delay after each\n * attempt.\n */ , r = 1.5\n /**\n * The maximum base delay after which no further backoff is performed.\n * Note that jitter will still be applied, so the actual delay could be as\n * much as 1.5*maxDelayMs.\n */ , i = 6e4) {\n this.ui = e, this.timerId = t, this.ko = n, this.qo = r, this.Qo = i, this.Ko = 0, \n this.$o = null, \n /** The last backoff attempt, as epoch milliseconds. */\n this.Uo = Date.now(), this.reset();\n }\n /**\n * Resets the backoff delay.\n *\n * The very next backoffAndWait() will have no delay. If it is called again\n * (i.e. due to an error), initialDelayMs (plus jitter) will be used, and\n * subsequent ones will increase according to the backoffFactor.\n */ reset() {\n this.Ko = 0;\n }\n /**\n * Resets the backoff delay to the maximum delay (e.g. for use after a\n * RESOURCE_EXHAUSTED error).\n */ Wo() {\n this.Ko = this.Qo;\n }\n /**\n * Returns a promise that resolves after currentDelayMs, and increases the\n * delay for any subsequent attempts. If there was a pending backoff operation\n * already, it will be canceled.\n */ Go(e) {\n // Cancel any pending backoff operation.\n this.cancel();\n // First schedule using the current base (which may be 0 and should be\n // honored as such).\n const t = Math.floor(this.Ko + this.zo()), n = Math.max(0, Date.now() - this.Uo), r = Math.max(0, t - n);\n // Guard against lastAttemptTime being in the future due to a clock change.\n r > 0 && __PRIVATE_logDebug(\"ExponentialBackoff\", `Backing off for ${r} ms (base delay: ${this.Ko} ms, delay with jitter: ${t} ms, last attempt: ${n} ms ago)`), \n this.$o = this.ui.enqueueAfterDelay(this.timerId, r, (() => (this.Uo = Date.now(), \n e()))), \n // Apply backoff factor to determine next delay and ensure it is within\n // bounds.\n this.Ko *= this.qo, this.Ko < this.ko && (this.Ko = this.ko), this.Ko > this.Qo && (this.Ko = this.Qo);\n }\n jo() {\n null !== this.$o && (this.$o.skipDelay(), this.$o = null);\n }\n cancel() {\n null !== this.$o && (this.$o.cancel(), this.$o = null);\n }\n /** Returns a random value in the range [-currentBaseMs/2, currentBaseMs/2] */ zo() {\n return (Math.random() - .5) * this.Ko;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A PersistentStream is an abstract base class that represents a streaming RPC\n * to the Firestore backend. It's built on top of the connections own support\n * for streaming RPCs, and adds several critical features for our clients:\n *\n * - Exponential backoff on failure\n * - Authentication via CredentialsProvider\n * - Dispatching all callbacks into the shared worker queue\n * - Closing idle streams after 60 seconds of inactivity\n *\n * Subclasses of PersistentStream implement serialization of models to and\n * from the JSON representation of the protocol buffers for a specific\n * streaming RPC.\n *\n * ## Starting and Stopping\n *\n * Streaming RPCs are stateful and need to be start()ed before messages can\n * be sent and received. The PersistentStream will call the onOpen() function\n * of the listener once the stream is ready to accept requests.\n *\n * Should a start() fail, PersistentStream will call the registered onClose()\n * listener with a FirestoreError indicating what went wrong.\n *\n * A PersistentStream can be started and stopped repeatedly.\n *\n * Generic types:\n * SendType: The type of the outgoing message of the underlying\n * connection stream\n * ReceiveType: The type of the incoming message of the underlying\n * connection stream\n * ListenerType: The type of the listener that will be used for callbacks\n */\nclass __PRIVATE_PersistentStream {\n constructor(e, t, n, r, i, s, o, _) {\n this.ui = e, this.Ho = n, this.Jo = r, this.connection = i, this.authCredentialsProvider = s, \n this.appCheckCredentialsProvider = o, this.listener = _, this.state = 0 /* PersistentStreamState.Initial */ , \n /**\n * A close count that's incremented every time the stream is closed; used by\n * getCloseGuardedDispatcher() to invalidate callbacks that happen after\n * close.\n */\n this.Yo = 0, this.Zo = null, this.Xo = null, this.stream = null, \n /**\n * Count of response messages received.\n */\n this.e_ = 0, this.t_ = new __PRIVATE_ExponentialBackoff(e, t);\n }\n /**\n * Returns true if start() has been called and no error has occurred. True\n * indicates the stream is open or in the process of opening (which\n * encompasses respecting backoff, getting auth tokens, and starting the\n * actual RPC). Use isOpen() to determine if the stream is open and ready for\n * outbound requests.\n */ n_() {\n return 1 /* PersistentStreamState.Starting */ === this.state || 5 /* PersistentStreamState.Backoff */ === this.state || this.r_();\n }\n /**\n * Returns true if the underlying RPC is open (the onOpen() listener has been\n * called) and the stream is ready for outbound requests.\n */ r_() {\n return 2 /* PersistentStreamState.Open */ === this.state || 3 /* PersistentStreamState.Healthy */ === this.state;\n }\n /**\n * Starts the RPC. Only allowed if isStarted() returns false. The stream is\n * not immediately ready for use: onOpen() will be invoked when the RPC is\n * ready for outbound requests, at which point isOpen() will return true.\n *\n * When start returns, isStarted() will return true.\n */ start() {\n this.e_ = 0, 4 /* PersistentStreamState.Error */ !== this.state ? this.auth() : this.i_();\n }\n /**\n * Stops the RPC. This call is idempotent and allowed regardless of the\n * current isStarted() state.\n *\n * When stop returns, isStarted() and isOpen() will both return false.\n */ async stop() {\n this.n_() && await this.close(0 /* PersistentStreamState.Initial */);\n }\n /**\n * After an error the stream will usually back off on the next attempt to\n * start it. If the error warrants an immediate restart of the stream, the\n * sender can use this to indicate that the receiver should not back off.\n *\n * Each error will call the onClose() listener. That function can decide to\n * inhibit backoff if required.\n */ s_() {\n this.state = 0 /* PersistentStreamState.Initial */ , this.t_.reset();\n }\n /**\n * Marks this stream as idle. If no further actions are performed on the\n * stream for one minute, the stream will automatically close itself and\n * notify the stream's onClose() handler with Status.OK. The stream will then\n * be in a !isStarted() state, requiring the caller to start the stream again\n * before further use.\n *\n * Only streams that are in state 'Open' can be marked idle, as all other\n * states imply pending network operations.\n */ o_() {\n // Starts the idle time if we are in state 'Open' and are not yet already\n // running a timer (in which case the previous idle timeout still applies).\n this.r_() && null === this.Zo && (this.Zo = this.ui.enqueueAfterDelay(this.Ho, 6e4, (() => this.__())));\n }\n /** Sends a message to the underlying stream. */ a_(e) {\n this.u_(), this.stream.send(e);\n }\n /** Called by the idle timer when the stream should close due to inactivity. */ async __() {\n if (this.r_()) \n // When timing out an idle stream there's no reason to force the stream into backoff when\n // it restarts so set the stream state to Initial instead of Error.\n return this.close(0 /* PersistentStreamState.Initial */);\n }\n /** Marks the stream as active again. */ u_() {\n this.Zo && (this.Zo.cancel(), this.Zo = null);\n }\n /** Cancels the health check delayed operation. */ c_() {\n this.Xo && (this.Xo.cancel(), this.Xo = null);\n }\n /**\n * Closes the stream and cleans up as necessary:\n *\n * * closes the underlying GRPC stream;\n * * calls the onClose handler with the given 'error';\n * * sets internal stream state to 'finalState';\n * * adjusts the backoff timer based on the error\n *\n * A new stream can be opened by calling start().\n *\n * @param finalState - the intended state of the stream after closing.\n * @param error - the error the connection was closed with.\n */ async close(e, t) {\n // Cancel any outstanding timers (they're guaranteed not to execute).\n this.u_(), this.c_(), this.t_.cancel(), \n // Invalidates any stream-related callbacks (e.g. from auth or the\n // underlying stream), guaranteeing they won't execute.\n this.Yo++, 4 /* PersistentStreamState.Error */ !== e ? \n // If this is an intentional close ensure we don't delay our next connection attempt.\n this.t_.reset() : t && t.code === D.RESOURCE_EXHAUSTED ? (\n // Log the error. (Probably either 'quota exceeded' or 'max queue length reached'.)\n __PRIVATE_logError(t.toString()), __PRIVATE_logError(\"Using maximum backoff delay to prevent overloading the backend.\"), \n this.t_.Wo()) : t && t.code === D.UNAUTHENTICATED && 3 /* PersistentStreamState.Healthy */ !== this.state && (\n // \"unauthenticated\" error means the token was rejected. This should rarely\n // happen since both Auth and AppCheck ensure a sufficient TTL when we\n // request a token. If a user manually resets their system clock this can\n // fail, however. In this case, we should get a Code.UNAUTHENTICATED error\n // before we received the first message and we need to invalidate the token\n // to ensure that we fetch a new token.\n this.authCredentialsProvider.invalidateToken(), this.appCheckCredentialsProvider.invalidateToken()), \n // Clean up the underlying stream because we are no longer interested in events.\n null !== this.stream && (this.l_(), this.stream.close(), this.stream = null), \n // This state must be assigned before calling onClose() to allow the callback to\n // inhibit backoff or otherwise manipulate the state in its non-started state.\n this.state = e, \n // Notify the listener that the stream closed.\n await this.listener.mo(t);\n }\n /**\n * Can be overridden to perform additional cleanup before the stream is closed.\n * Calling super.tearDown() is not required.\n */ l_() {}\n auth() {\n this.state = 1 /* PersistentStreamState.Starting */;\n const e = this.h_(this.Yo), t = this.Yo;\n // TODO(mikelehen): Just use dispatchIfNotClosed, but see TODO below.\n Promise.all([ this.authCredentialsProvider.getToken(), this.appCheckCredentialsProvider.getToken() ]).then((([e, n]) => {\n // Stream can be stopped while waiting for authentication.\n // TODO(mikelehen): We really should just use dispatchIfNotClosed\n // and let this dispatch onto the queue, but that opened a spec test can\n // of worms that I don't want to deal with in this PR.\n this.Yo === t && \n // Normally we'd have to schedule the callback on the AsyncQueue.\n // However, the following calls are safe to be called outside the\n // AsyncQueue since they don't chain asynchronous calls\n this.P_(e, n);\n }), (t => {\n e((() => {\n const e = new FirestoreError(D.UNKNOWN, \"Fetching auth token failed: \" + t.message);\n return this.I_(e);\n }));\n }));\n }\n P_(e, t) {\n const n = this.h_(this.Yo);\n this.stream = this.T_(e, t), this.stream.Eo((() => {\n n((() => this.listener.Eo()));\n })), this.stream.Ro((() => {\n n((() => (this.state = 2 /* PersistentStreamState.Open */ , this.Xo = this.ui.enqueueAfterDelay(this.Jo, 1e4, (() => (this.r_() && (this.state = 3 /* PersistentStreamState.Healthy */), \n Promise.resolve()))), this.listener.Ro())));\n })), this.stream.mo((e => {\n n((() => this.I_(e)));\n })), this.stream.onMessage((e => {\n n((() => 1 == ++this.e_ ? this.E_(e) : this.onNext(e)));\n }));\n }\n i_() {\n this.state = 5 /* PersistentStreamState.Backoff */ , this.t_.Go((async () => {\n this.state = 0 /* PersistentStreamState.Initial */ , this.start();\n }));\n }\n // Visible for tests\n I_(e) {\n // In theory the stream could close cleanly, however, in our current model\n // we never expect this to happen because if we stop a stream ourselves,\n // this callback will never be called. To prevent cases where we retry\n // without a backoff accidentally, we set the stream to error in all cases.\n return __PRIVATE_logDebug(\"PersistentStream\", `close with error: ${e}`), this.stream = null, \n this.close(4 /* PersistentStreamState.Error */ , e);\n }\n /**\n * Returns a \"dispatcher\" function that dispatches operations onto the\n * AsyncQueue but only runs them if closeCount remains unchanged. This allows\n * us to turn auth / stream callbacks into no-ops if the stream is closed /\n * re-opened, etc.\n */ h_(e) {\n return t => {\n this.ui.enqueueAndForget((() => this.Yo === e ? t() : (__PRIVATE_logDebug(\"PersistentStream\", \"stream callback skipped by getCloseGuardedDispatcher.\"), \n Promise.resolve())));\n };\n }\n}\n\n/**\n * A PersistentStream that implements the Listen RPC.\n *\n * Once the Listen stream has called the onOpen() listener, any number of\n * listen() and unlisten() calls can be made to control what changes will be\n * sent from the server for ListenResponses.\n */ class __PRIVATE_PersistentListenStream extends __PRIVATE_PersistentStream {\n constructor(e, t, n, r, i, s) {\n super(e, \"listen_stream_connection_backoff\" /* TimerId.ListenStreamConnectionBackoff */ , \"listen_stream_idle\" /* TimerId.ListenStreamIdle */ , \"health_check_timeout\" /* TimerId.HealthCheckTimeout */ , t, n, r, s), \n this.serializer = i;\n }\n T_(e, t) {\n return this.connection.Bo(\"Listen\", e, t);\n }\n E_(e) {\n return this.onNext(e);\n }\n onNext(e) {\n // A successful response means the stream is healthy\n this.t_.reset();\n const t = __PRIVATE_fromWatchChange(this.serializer, e), n = function __PRIVATE_versionFromListenResponse(e) {\n // We have only reached a consistent snapshot for the entire stream if there\n // is a read_time set and it applies to all targets (i.e. the list of\n // targets is empty). The backend is guaranteed to send such responses.\n if (!(\"targetChange\" in e)) return SnapshotVersion.min();\n const t = e.targetChange;\n return t.targetIds && t.targetIds.length ? SnapshotVersion.min() : t.readTime ? __PRIVATE_fromVersion(t.readTime) : SnapshotVersion.min();\n }(e);\n return this.listener.d_(t, n);\n }\n /**\n * Registers interest in the results of the given target. If the target\n * includes a resumeToken it will be included in the request. Results that\n * affect the target will be streamed back as WatchChange messages that\n * reference the targetId.\n */ A_(e) {\n const t = {};\n t.database = __PRIVATE_getEncodedDatabaseId(this.serializer), t.addTarget = function __PRIVATE_toTarget(e, t) {\n let n;\n const r = t.target;\n if (n = __PRIVATE_targetIsDocumentTarget(r) ? {\n documents: __PRIVATE_toDocumentsTarget(e, r)\n } : {\n query: __PRIVATE_toQueryTarget(e, r)._t\n }, n.targetId = t.targetId, t.resumeToken.approximateByteSize() > 0) {\n n.resumeToken = __PRIVATE_toBytes(e, t.resumeToken);\n const r = __PRIVATE_toInt32Proto(e, t.expectedCount);\n null !== r && (n.expectedCount = r);\n } else if (t.snapshotVersion.compareTo(SnapshotVersion.min()) > 0) {\n // TODO(wuandy): Consider removing above check because it is most likely true.\n // Right now, many tests depend on this behaviour though (leaving min() out\n // of serialization).\n n.readTime = toTimestamp(e, t.snapshotVersion.toTimestamp());\n const r = __PRIVATE_toInt32Proto(e, t.expectedCount);\n null !== r && (n.expectedCount = r);\n }\n return n;\n }(this.serializer, e);\n const n = __PRIVATE_toListenRequestLabels(this.serializer, e);\n n && (t.labels = n), this.a_(t);\n }\n /**\n * Unregisters interest in the results of the target associated with the\n * given targetId.\n */ R_(e) {\n const t = {};\n t.database = __PRIVATE_getEncodedDatabaseId(this.serializer), t.removeTarget = e, \n this.a_(t);\n }\n}\n\n/**\n * A Stream that implements the Write RPC.\n *\n * The Write RPC requires the caller to maintain special streamToken\n * state in between calls, to help the server understand which responses the\n * client has processed by the time the next request is made. Every response\n * will contain a streamToken; this value must be passed to the next\n * request.\n *\n * After calling start() on this stream, the next request must be a handshake,\n * containing whatever streamToken is on hand. Once a response to this\n * request is received, all pending mutations may be submitted. When\n * submitting multiple batches of mutations at the same time, it's\n * okay to use the same streamToken for the calls to writeMutations.\n *\n * TODO(b/33271235): Use proto types\n */ class __PRIVATE_PersistentWriteStream extends __PRIVATE_PersistentStream {\n constructor(e, t, n, r, i, s) {\n super(e, \"write_stream_connection_backoff\" /* TimerId.WriteStreamConnectionBackoff */ , \"write_stream_idle\" /* TimerId.WriteStreamIdle */ , \"health_check_timeout\" /* TimerId.HealthCheckTimeout */ , t, n, r, s), \n this.serializer = i;\n }\n /**\n * Tracks whether or not a handshake has been successfully exchanged and\n * the stream is ready to accept mutations.\n */ get V_() {\n return this.e_ > 0;\n }\n // Override of PersistentStream.start\n start() {\n this.lastStreamToken = void 0, super.start();\n }\n l_() {\n this.V_ && this.m_([]);\n }\n T_(e, t) {\n return this.connection.Bo(\"Write\", e, t);\n }\n E_(e) {\n // Always capture the last stream token.\n return __PRIVATE_hardAssert(!!e.streamToken), this.lastStreamToken = e.streamToken, \n // The first response is always the handshake response\n __PRIVATE_hardAssert(!e.writeResults || 0 === e.writeResults.length), this.listener.f_();\n }\n onNext(e) {\n // Always capture the last stream token.\n __PRIVATE_hardAssert(!!e.streamToken), this.lastStreamToken = e.streamToken, \n // A successful first write response means the stream is healthy,\n // Note, that we could consider a successful handshake healthy, however,\n // the write itself might be causing an error we want to back off from.\n this.t_.reset();\n const t = __PRIVATE_fromWriteResults(e.writeResults, e.commitTime), n = __PRIVATE_fromVersion(e.commitTime);\n return this.listener.g_(n, t);\n }\n /**\n * Sends an initial streamToken to the server, performing the handshake\n * required to make the StreamingWrite RPC work. Subsequent\n * calls should wait until onHandshakeComplete was called.\n */ p_() {\n // TODO(dimond): Support stream resumption. We intentionally do not set the\n // stream token on the handshake, ignoring any stream token we might have.\n const e = {};\n e.database = __PRIVATE_getEncodedDatabaseId(this.serializer), this.a_(e);\n }\n /** Sends a group of mutations to the Firestore backend to apply. */ m_(e) {\n const t = {\n streamToken: this.lastStreamToken,\n writes: e.map((e => toMutation(this.serializer, e)))\n };\n this.a_(t);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Datastore and its related methods are a wrapper around the external Google\n * Cloud Datastore grpc API, which provides an interface that is more convenient\n * for the rest of the client SDK architecture to consume.\n */\n/**\n * An implementation of Datastore that exposes additional state for internal\n * consumption.\n */\nclass __PRIVATE_DatastoreImpl extends class Datastore {} {\n constructor(e, t, n, r) {\n super(), this.authCredentials = e, this.appCheckCredentials = t, this.connection = n, \n this.serializer = r, this.y_ = !1;\n }\n w_() {\n if (this.y_) throw new FirestoreError(D.FAILED_PRECONDITION, \"The client has already been terminated.\");\n }\n /** Invokes the provided RPC with auth and AppCheck tokens. */ Mo(e, t, n, r) {\n return this.w_(), Promise.all([ this.authCredentials.getToken(), this.appCheckCredentials.getToken() ]).then((([i, s]) => this.connection.Mo(e, __PRIVATE_toResourcePath(t, n), r, i, s))).catch((e => {\n throw \"FirebaseError\" === e.name ? (e.code === D.UNAUTHENTICATED && (this.authCredentials.invalidateToken(), \n this.appCheckCredentials.invalidateToken()), e) : new FirestoreError(D.UNKNOWN, e.toString());\n }));\n }\n /** Invokes the provided RPC with streamed results with auth and AppCheck tokens. */ Lo(e, t, n, r, i) {\n return this.w_(), Promise.all([ this.authCredentials.getToken(), this.appCheckCredentials.getToken() ]).then((([s, o]) => this.connection.Lo(e, __PRIVATE_toResourcePath(t, n), r, s, o, i))).catch((e => {\n throw \"FirebaseError\" === e.name ? (e.code === D.UNAUTHENTICATED && (this.authCredentials.invalidateToken(), \n this.appCheckCredentials.invalidateToken()), e) : new FirestoreError(D.UNKNOWN, e.toString());\n }));\n }\n terminate() {\n this.y_ = !0, this.connection.terminate();\n }\n}\n\n// TODO(firestorexp): Make sure there is only one Datastore instance per\n// firestore-exp client.\n/**\n * A component used by the RemoteStore to track the OnlineState (that is,\n * whether or not the client as a whole should be considered to be online or\n * offline), implementing the appropriate heuristics.\n *\n * In particular, when the client is trying to connect to the backend, we\n * allow up to MAX_WATCH_STREAM_FAILURES within ONLINE_STATE_TIMEOUT_MS for\n * a connection to succeed. If we have too many failures or the timeout elapses,\n * then we set the OnlineState to Offline, and the client will behave as if\n * it is offline (get()s will return cached data, etc.).\n */\nclass __PRIVATE_OnlineStateTracker {\n constructor(e, t) {\n this.asyncQueue = e, this.onlineStateHandler = t, \n /** The current OnlineState. */\n this.state = \"Unknown\" /* OnlineState.Unknown */ , \n /**\n * A count of consecutive failures to open the stream. If it reaches the\n * maximum defined by MAX_WATCH_STREAM_FAILURES, we'll set the OnlineState to\n * Offline.\n */\n this.S_ = 0, \n /**\n * A timer that elapses after ONLINE_STATE_TIMEOUT_MS, at which point we\n * transition from OnlineState.Unknown to OnlineState.Offline without waiting\n * for the stream to actually fail (MAX_WATCH_STREAM_FAILURES times).\n */\n this.b_ = null, \n /**\n * Whether the client should log a warning message if it fails to connect to\n * the backend (initially true, cleared after a successful stream, or if we've\n * logged the message already).\n */\n this.D_ = !0;\n }\n /**\n * Called by RemoteStore when a watch stream is started (including on each\n * backoff attempt).\n *\n * If this is the first attempt, it sets the OnlineState to Unknown and starts\n * the onlineStateTimer.\n */ v_() {\n 0 === this.S_ && (this.C_(\"Unknown\" /* OnlineState.Unknown */), this.b_ = this.asyncQueue.enqueueAfterDelay(\"online_state_timeout\" /* TimerId.OnlineStateTimeout */ , 1e4, (() => (this.b_ = null, \n this.F_(\"Backend didn't respond within 10 seconds.\"), this.C_(\"Offline\" /* OnlineState.Offline */), \n Promise.resolve()))));\n }\n /**\n * Updates our OnlineState as appropriate after the watch stream reports a\n * failure. The first failure moves us to the 'Unknown' state. We then may\n * allow multiple failures (based on MAX_WATCH_STREAM_FAILURES) before we\n * actually transition to the 'Offline' state.\n */ M_(e) {\n \"Online\" /* OnlineState.Online */ === this.state ? this.C_(\"Unknown\" /* OnlineState.Unknown */) : (this.S_++, \n this.S_ >= 1 && (this.x_(), this.F_(`Connection failed 1 times. Most recent error: ${e.toString()}`), \n this.C_(\"Offline\" /* OnlineState.Offline */)));\n }\n /**\n * Explicitly sets the OnlineState to the specified state.\n *\n * Note that this resets our timers / failure counters, etc. used by our\n * Offline heuristics, so must not be used in place of\n * handleWatchStreamStart() and handleWatchStreamFailure().\n */ set(e) {\n this.x_(), this.S_ = 0, \"Online\" /* OnlineState.Online */ === e && (\n // We've connected to watch at least once. Don't warn the developer\n // about being offline going forward.\n this.D_ = !1), this.C_(e);\n }\n C_(e) {\n e !== this.state && (this.state = e, this.onlineStateHandler(e));\n }\n F_(e) {\n const t = `Could not reach Cloud Firestore backend. ${e}\\nThis typically indicates that your device does not have a healthy Internet connection at the moment. The client will operate in offline mode until it is able to successfully connect to the backend.`;\n this.D_ ? (__PRIVATE_logError(t), this.D_ = !1) : __PRIVATE_logDebug(\"OnlineStateTracker\", t);\n }\n x_() {\n null !== this.b_ && (this.b_.cancel(), this.b_ = null);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_RemoteStoreImpl {\n constructor(\n /**\n * The local store, used to fill the write pipeline with outbound mutations.\n */\n e, \n /** The client-side proxy for interacting with the backend. */\n t, n, r, i) {\n this.localStore = e, this.datastore = t, this.asyncQueue = n, this.remoteSyncer = {}, \n /**\n * A list of up to MAX_PENDING_WRITES writes that we have fetched from the\n * LocalStore via fillWritePipeline() and have or will send to the write\n * stream.\n *\n * Whenever writePipeline.length > 0 the RemoteStore will attempt to start or\n * restart the write stream. When the stream is established the writes in the\n * pipeline will be sent in order.\n *\n * Writes remain in writePipeline until they are acknowledged by the backend\n * and thus will automatically be re-sent if the stream is interrupted /\n * restarted before they're acknowledged.\n *\n * Write responses from the backend are linked to their originating request\n * purely based on order, and so we can just shift() writes from the front of\n * the writePipeline as we receive responses.\n */\n this.O_ = [], \n /**\n * A mapping of watched targets that the client cares about tracking and the\n * user has explicitly called a 'listen' for this target.\n *\n * These targets may or may not have been sent to or acknowledged by the\n * server. On re-establishing the listen stream, these targets should be sent\n * to the server. The targets removed with unlistens are removed eagerly\n * without waiting for confirmation from the listen stream.\n */\n this.N_ = new Map, \n /**\n * A set of reasons for why the RemoteStore may be offline. If empty, the\n * RemoteStore may start its network connections.\n */\n this.L_ = new Set, \n /**\n * Event handlers that get called when the network is disabled or enabled.\n *\n * PORTING NOTE: These functions are used on the Web client to create the\n * underlying streams (to support tree-shakeable streams). On Android and iOS,\n * the streams are created during construction of RemoteStore.\n */\n this.B_ = [], this.k_ = i, this.k_._o((e => {\n n.enqueueAndForget((async () => {\n // Porting Note: Unlike iOS, `restartNetwork()` is called even when the\n // network becomes unreachable as we don't have any other way to tear\n // down our streams.\n __PRIVATE_canUseNetwork(this) && (__PRIVATE_logDebug(\"RemoteStore\", \"Restarting streams for network reachability change.\"), \n await async function __PRIVATE_restartNetwork(e) {\n const t = __PRIVATE_debugCast(e);\n t.L_.add(4 /* OfflineCause.ConnectivityChange */), await __PRIVATE_disableNetworkInternal(t), \n t.q_.set(\"Unknown\" /* OnlineState.Unknown */), t.L_.delete(4 /* OfflineCause.ConnectivityChange */), \n await __PRIVATE_enableNetworkInternal(t);\n }(this));\n }));\n })), this.q_ = new __PRIVATE_OnlineStateTracker(n, r);\n }\n}\n\nasync function __PRIVATE_enableNetworkInternal(e) {\n if (__PRIVATE_canUseNetwork(e)) for (const t of e.B_) await t(/* enabled= */ !0);\n}\n\n/**\n * Temporarily disables the network. The network can be re-enabled using\n * enableNetwork().\n */ async function __PRIVATE_disableNetworkInternal(e) {\n for (const t of e.B_) await t(/* enabled= */ !1);\n}\n\n/**\n * Starts new listen for the given target. Uses resume token if provided. It\n * is a no-op if the target of given `TargetData` is already being listened to.\n */\nfunction __PRIVATE_remoteStoreListen(e, t) {\n const n = __PRIVATE_debugCast(e);\n n.N_.has(t.targetId) || (\n // Mark this as something the client is currently listening for.\n n.N_.set(t.targetId, t), __PRIVATE_shouldStartWatchStream(n) ? \n // The listen will be sent in onWatchStreamOpen\n __PRIVATE_startWatchStream(n) : __PRIVATE_ensureWatchStream(n).r_() && __PRIVATE_sendWatchRequest(n, t));\n}\n\n/**\n * Removes the listen from server. It is a no-op if the given target id is\n * not being listened to.\n */ function __PRIVATE_remoteStoreUnlisten(e, t) {\n const n = __PRIVATE_debugCast(e), r = __PRIVATE_ensureWatchStream(n);\n n.N_.delete(t), r.r_() && __PRIVATE_sendUnwatchRequest(n, t), 0 === n.N_.size && (r.r_() ? r.o_() : __PRIVATE_canUseNetwork(n) && \n // Revert to OnlineState.Unknown if the watch stream is not open and we\n // have no listeners, since without any listens to send we cannot\n // confirm if the stream is healthy and upgrade to OnlineState.Online.\n n.q_.set(\"Unknown\" /* OnlineState.Unknown */));\n}\n\n/**\n * We need to increment the expected number of pending responses we're due\n * from watch so we wait for the ack to process any messages from this target.\n */ function __PRIVATE_sendWatchRequest(e, t) {\n if (e.Q_.xe(t.targetId), t.resumeToken.approximateByteSize() > 0 || t.snapshotVersion.compareTo(SnapshotVersion.min()) > 0) {\n const n = e.remoteSyncer.getRemoteKeysForTarget(t.targetId).size;\n t = t.withExpectedCount(n);\n }\n __PRIVATE_ensureWatchStream(e).A_(t);\n}\n\n/**\n * We need to increment the expected number of pending responses we're due\n * from watch so we wait for the removal on the server before we process any\n * messages from this target.\n */ function __PRIVATE_sendUnwatchRequest(e, t) {\n e.Q_.xe(t), __PRIVATE_ensureWatchStream(e).R_(t);\n}\n\nfunction __PRIVATE_startWatchStream(e) {\n e.Q_ = new __PRIVATE_WatchChangeAggregator({\n getRemoteKeysForTarget: t => e.remoteSyncer.getRemoteKeysForTarget(t),\n ot: t => e.N_.get(t) || null,\n tt: () => e.datastore.serializer.databaseId\n }), __PRIVATE_ensureWatchStream(e).start(), e.q_.v_();\n}\n\n/**\n * Returns whether the watch stream should be started because it's necessary\n * and has not yet been started.\n */ function __PRIVATE_shouldStartWatchStream(e) {\n return __PRIVATE_canUseNetwork(e) && !__PRIVATE_ensureWatchStream(e).n_() && e.N_.size > 0;\n}\n\nfunction __PRIVATE_canUseNetwork(e) {\n return 0 === __PRIVATE_debugCast(e).L_.size;\n}\n\nfunction __PRIVATE_cleanUpWatchStreamState(e) {\n e.Q_ = void 0;\n}\n\nasync function __PRIVATE_onWatchStreamConnected(e) {\n // Mark the client as online since we got a \"connected\" notification.\n e.q_.set(\"Online\" /* OnlineState.Online */);\n}\n\nasync function __PRIVATE_onWatchStreamOpen(e) {\n e.N_.forEach(((t, n) => {\n __PRIVATE_sendWatchRequest(e, t);\n }));\n}\n\nasync function __PRIVATE_onWatchStreamClose(e, t) {\n __PRIVATE_cleanUpWatchStreamState(e), \n // If we still need the watch stream, retry the connection.\n __PRIVATE_shouldStartWatchStream(e) ? (e.q_.M_(t), __PRIVATE_startWatchStream(e)) : \n // No need to restart watch stream because there are no active targets.\n // The online state is set to unknown because there is no active attempt\n // at establishing a connection\n e.q_.set(\"Unknown\" /* OnlineState.Unknown */);\n}\n\nasync function __PRIVATE_onWatchStreamChange(e, t, n) {\n if (\n // Mark the client as online since we got a message from the server\n e.q_.set(\"Online\" /* OnlineState.Online */), t instanceof __PRIVATE_WatchTargetChange && 2 /* WatchTargetChangeState.Removed */ === t.state && t.cause) \n // There was an error on a target, don't wait for a consistent snapshot\n // to raise events\n try {\n await \n /** Handles an error on a target */\n async function __PRIVATE_handleTargetError(e, t) {\n const n = t.cause;\n for (const r of t.targetIds) \n // A watched target might have been removed already.\n e.N_.has(r) && (await e.remoteSyncer.rejectListen(r, n), e.N_.delete(r), e.Q_.removeTarget(r));\n }\n /**\n * Attempts to fill our write pipeline with writes from the LocalStore.\n *\n * Called internally to bootstrap or refill the write pipeline and by\n * SyncEngine whenever there are new mutations to process.\n *\n * Starts the write stream if necessary.\n */ (e, t);\n } catch (n) {\n __PRIVATE_logDebug(\"RemoteStore\", \"Failed to remove targets %s: %s \", t.targetIds.join(\",\"), n), \n await __PRIVATE_disableNetworkUntilRecovery(e, n);\n } else if (t instanceof __PRIVATE_DocumentWatchChange ? e.Q_.Ke(t) : t instanceof __PRIVATE_ExistenceFilterChange ? e.Q_.He(t) : e.Q_.We(t), \n !n.isEqual(SnapshotVersion.min())) try {\n const t = await __PRIVATE_localStoreGetLastRemoteSnapshotVersion(e.localStore);\n n.compareTo(t) >= 0 && \n // We have received a target change with a global snapshot if the snapshot\n // version is not equal to SnapshotVersion.min().\n await \n /**\n * Takes a batch of changes from the Datastore, repackages them as a\n * RemoteEvent, and passes that on to the listener, which is typically the\n * SyncEngine.\n */\n function __PRIVATE_raiseWatchSnapshot(e, t) {\n const n = e.Q_.rt(t);\n // Update in-memory resume tokens. LocalStore will update the\n // persistent view of these when applying the completed RemoteEvent.\n return n.targetChanges.forEach(((n, r) => {\n if (n.resumeToken.approximateByteSize() > 0) {\n const i = e.N_.get(r);\n // A watched target might have been removed already.\n i && e.N_.set(r, i.withResumeToken(n.resumeToken, t));\n }\n })), \n // Re-establish listens for the targets that have been invalidated by\n // existence filter mismatches.\n n.targetMismatches.forEach(((t, n) => {\n const r = e.N_.get(t);\n if (!r) \n // A watched target might have been removed already.\n return;\n // Clear the resume token for the target, since we're in a known mismatch\n // state.\n e.N_.set(t, r.withResumeToken(ByteString.EMPTY_BYTE_STRING, r.snapshotVersion)), \n // Cause a hard reset by unwatching and rewatching immediately, but\n // deliberately don't send a resume token so that we get a full update.\n __PRIVATE_sendUnwatchRequest(e, t);\n // Mark the target we send as being on behalf of an existence filter\n // mismatch, but don't actually retain that in listenTargets. This ensures\n // that we flag the first re-listen this way without impacting future\n // listens of this target (that might happen e.g. on reconnect).\n const i = new TargetData(r.target, t, n, r.sequenceNumber);\n __PRIVATE_sendWatchRequest(e, i);\n })), e.remoteSyncer.applyRemoteEvent(n);\n }(e, n);\n } catch (t) {\n __PRIVATE_logDebug(\"RemoteStore\", \"Failed to raise snapshot:\", t), await __PRIVATE_disableNetworkUntilRecovery(e, t);\n }\n}\n\n/**\n * Recovery logic for IndexedDB errors that takes the network offline until\n * `op` succeeds. Retries are scheduled with backoff using\n * `enqueueRetryable()`. If `op()` is not provided, IndexedDB access is\n * validated via a generic operation.\n *\n * The returned Promise is resolved once the network is disabled and before\n * any retry attempt.\n */ async function __PRIVATE_disableNetworkUntilRecovery(e, t, n) {\n if (!__PRIVATE_isIndexedDbTransactionError(t)) throw t;\n e.L_.add(1 /* OfflineCause.IndexedDbFailed */), \n // Disable network and raise offline snapshots\n await __PRIVATE_disableNetworkInternal(e), e.q_.set(\"Offline\" /* OnlineState.Offline */), \n n || (\n // Use a simple read operation to determine if IndexedDB recovered.\n // Ideally, we would expose a health check directly on SimpleDb, but\n // RemoteStore only has access to persistence through LocalStore.\n n = () => __PRIVATE_localStoreGetLastRemoteSnapshotVersion(e.localStore)), \n // Probe IndexedDB periodically and re-enable network\n e.asyncQueue.enqueueRetryable((async () => {\n __PRIVATE_logDebug(\"RemoteStore\", \"Retrying IndexedDB access\"), await n(), e.L_.delete(1 /* OfflineCause.IndexedDbFailed */), \n await __PRIVATE_enableNetworkInternal(e);\n }));\n}\n\n/**\n * Executes `op`. If `op` fails, takes the network offline until `op`\n * succeeds. Returns after the first attempt.\n */ function __PRIVATE_executeWithRecovery(e, t) {\n return t().catch((n => __PRIVATE_disableNetworkUntilRecovery(e, n, t)));\n}\n\nasync function __PRIVATE_fillWritePipeline(e) {\n const t = __PRIVATE_debugCast(e), n = __PRIVATE_ensureWriteStream(t);\n let r = t.O_.length > 0 ? t.O_[t.O_.length - 1].batchId : -1;\n for (;__PRIVATE_canAddToWritePipeline(t); ) try {\n const e = await __PRIVATE_localStoreGetNextMutationBatch(t.localStore, r);\n if (null === e) {\n 0 === t.O_.length && n.o_();\n break;\n }\n r = e.batchId, __PRIVATE_addToWritePipeline(t, e);\n } catch (e) {\n await __PRIVATE_disableNetworkUntilRecovery(t, e);\n }\n __PRIVATE_shouldStartWriteStream(t) && __PRIVATE_startWriteStream(t);\n}\n\n/**\n * Returns true if we can add to the write pipeline (i.e. the network is\n * enabled and the write pipeline is not full).\n */ function __PRIVATE_canAddToWritePipeline(e) {\n return __PRIVATE_canUseNetwork(e) && e.O_.length < 10;\n}\n\n/**\n * Queues additional writes to be sent to the write stream, sending them\n * immediately if the write stream is established.\n */ function __PRIVATE_addToWritePipeline(e, t) {\n e.O_.push(t);\n const n = __PRIVATE_ensureWriteStream(e);\n n.r_() && n.V_ && n.m_(t.mutations);\n}\n\nfunction __PRIVATE_shouldStartWriteStream(e) {\n return __PRIVATE_canUseNetwork(e) && !__PRIVATE_ensureWriteStream(e).n_() && e.O_.length > 0;\n}\n\nfunction __PRIVATE_startWriteStream(e) {\n __PRIVATE_ensureWriteStream(e).start();\n}\n\nasync function __PRIVATE_onWriteStreamOpen(e) {\n __PRIVATE_ensureWriteStream(e).p_();\n}\n\nasync function __PRIVATE_onWriteHandshakeComplete(e) {\n const t = __PRIVATE_ensureWriteStream(e);\n // Send the write pipeline now that the stream is established.\n for (const n of e.O_) t.m_(n.mutations);\n}\n\nasync function __PRIVATE_onMutationResult(e, t, n) {\n const r = e.O_.shift(), i = MutationBatchResult.from(r, t, n);\n await __PRIVATE_executeWithRecovery(e, (() => e.remoteSyncer.applySuccessfulWrite(i))), \n // It's possible that with the completion of this mutation another\n // slot has freed up.\n await __PRIVATE_fillWritePipeline(e);\n}\n\nasync function __PRIVATE_onWriteStreamClose(e, t) {\n // If the write stream closed after the write handshake completes, a write\n // operation failed and we fail the pending operation.\n t && __PRIVATE_ensureWriteStream(e).V_ && \n // This error affects the actual write.\n await async function __PRIVATE_handleWriteError(e, t) {\n // Only handle permanent errors here. If it's transient, just let the retry\n // logic kick in.\n if (function __PRIVATE_isPermanentWriteError(e) {\n return __PRIVATE_isPermanentError(e) && e !== D.ABORTED;\n }(t.code)) {\n // This was a permanent error, the request itself was the problem\n // so it's not going to succeed if we resend it.\n const n = e.O_.shift();\n // In this case it's also unlikely that the server itself is melting\n // down -- this was just a bad request so inhibit backoff on the next\n // restart.\n __PRIVATE_ensureWriteStream(e).s_(), await __PRIVATE_executeWithRecovery(e, (() => e.remoteSyncer.rejectFailedWrite(n.batchId, t))), \n // It's possible that with the completion of this mutation\n // another slot has freed up.\n await __PRIVATE_fillWritePipeline(e);\n }\n }(e, t), \n // The write stream might have been started by refilling the write\n // pipeline for failed writes\n __PRIVATE_shouldStartWriteStream(e) && __PRIVATE_startWriteStream(e);\n}\n\nasync function __PRIVATE_remoteStoreHandleCredentialChange(e, t) {\n const n = __PRIVATE_debugCast(e);\n n.asyncQueue.verifyOperationInProgress(), __PRIVATE_logDebug(\"RemoteStore\", \"RemoteStore received new credentials\");\n const r = __PRIVATE_canUseNetwork(n);\n // Tear down and re-create our network streams. This will ensure we get a\n // fresh auth token for the new user and re-fill the write pipeline with\n // new mutations from the LocalStore (since mutations are per-user).\n n.L_.add(3 /* OfflineCause.CredentialChange */), await __PRIVATE_disableNetworkInternal(n), \n r && \n // Don't set the network status to Unknown if we are offline.\n n.q_.set(\"Unknown\" /* OnlineState.Unknown */), await n.remoteSyncer.handleCredentialChange(t), \n n.L_.delete(3 /* OfflineCause.CredentialChange */), await __PRIVATE_enableNetworkInternal(n);\n}\n\n/**\n * Toggles the network state when the client gains or loses its primary lease.\n */ async function __PRIVATE_remoteStoreApplyPrimaryState(e, t) {\n const n = __PRIVATE_debugCast(e);\n t ? (n.L_.delete(2 /* OfflineCause.IsSecondary */), await __PRIVATE_enableNetworkInternal(n)) : t || (n.L_.add(2 /* OfflineCause.IsSecondary */), \n await __PRIVATE_disableNetworkInternal(n), n.q_.set(\"Unknown\" /* OnlineState.Unknown */));\n}\n\n/**\n * If not yet initialized, registers the WatchStream and its network state\n * callback with `remoteStoreImpl`. Returns the existing stream if one is\n * already available.\n *\n * PORTING NOTE: On iOS and Android, the WatchStream gets registered on startup.\n * This is not done on Web to allow it to be tree-shaken.\n */ function __PRIVATE_ensureWatchStream(e) {\n return e.K_ || (\n // Create stream (but note that it is not started yet).\n e.K_ = function __PRIVATE_newPersistentWatchStream(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n return r.w_(), new __PRIVATE_PersistentListenStream(t, r.connection, r.authCredentials, r.appCheckCredentials, r.serializer, n);\n }\n /**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ (e.datastore, e.asyncQueue, {\n Eo: __PRIVATE_onWatchStreamConnected.bind(null, e),\n Ro: __PRIVATE_onWatchStreamOpen.bind(null, e),\n mo: __PRIVATE_onWatchStreamClose.bind(null, e),\n d_: __PRIVATE_onWatchStreamChange.bind(null, e)\n }), e.B_.push((async t => {\n t ? (e.K_.s_(), __PRIVATE_shouldStartWatchStream(e) ? __PRIVATE_startWatchStream(e) : e.q_.set(\"Unknown\" /* OnlineState.Unknown */)) : (await e.K_.stop(), \n __PRIVATE_cleanUpWatchStreamState(e));\n }))), e.K_;\n}\n\n/**\n * If not yet initialized, registers the WriteStream and its network state\n * callback with `remoteStoreImpl`. Returns the existing stream if one is\n * already available.\n *\n * PORTING NOTE: On iOS and Android, the WriteStream gets registered on startup.\n * This is not done on Web to allow it to be tree-shaken.\n */ function __PRIVATE_ensureWriteStream(e) {\n return e.U_ || (\n // Create stream (but note that it is not started yet).\n e.U_ = function __PRIVATE_newPersistentWriteStream(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n return r.w_(), new __PRIVATE_PersistentWriteStream(t, r.connection, r.authCredentials, r.appCheckCredentials, r.serializer, n);\n }(e.datastore, e.asyncQueue, {\n Eo: () => Promise.resolve(),\n Ro: __PRIVATE_onWriteStreamOpen.bind(null, e),\n mo: __PRIVATE_onWriteStreamClose.bind(null, e),\n f_: __PRIVATE_onWriteHandshakeComplete.bind(null, e),\n g_: __PRIVATE_onMutationResult.bind(null, e)\n }), e.B_.push((async t => {\n t ? (e.U_.s_(), \n // This will start the write stream if necessary.\n await __PRIVATE_fillWritePipeline(e)) : (await e.U_.stop(), e.O_.length > 0 && (__PRIVATE_logDebug(\"RemoteStore\", `Stopping write stream with ${e.O_.length} pending writes`), \n e.O_ = []));\n }))), e.U_;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents an operation scheduled to be run in the future on an AsyncQueue.\n *\n * It is created via DelayedOperation.createAndSchedule().\n *\n * Supports cancellation (via cancel()) and early execution (via skipDelay()).\n *\n * Note: We implement `PromiseLike` instead of `Promise`, as the `Promise` type\n * in newer versions of TypeScript defines `finally`, which is not available in\n * IE.\n */\nclass DelayedOperation {\n constructor(e, t, n, r, i) {\n this.asyncQueue = e, this.timerId = t, this.targetTimeMs = n, this.op = r, this.removalCallback = i, \n this.deferred = new __PRIVATE_Deferred, this.then = this.deferred.promise.then.bind(this.deferred.promise), \n // It's normal for the deferred promise to be canceled (due to cancellation)\n // and so we attach a dummy catch callback to avoid\n // 'UnhandledPromiseRejectionWarning' log spam.\n this.deferred.promise.catch((e => {}));\n }\n get promise() {\n return this.deferred.promise;\n }\n /**\n * Creates and returns a DelayedOperation that has been scheduled to be\n * executed on the provided asyncQueue after the provided delayMs.\n *\n * @param asyncQueue - The queue to schedule the operation on.\n * @param id - A Timer ID identifying the type of operation this is.\n * @param delayMs - The delay (ms) before the operation should be scheduled.\n * @param op - The operation to run.\n * @param removalCallback - A callback to be called synchronously once the\n * operation is executed or canceled, notifying the AsyncQueue to remove it\n * from its delayedOperations list.\n * PORTING NOTE: This exists to prevent making removeDelayedOperation() and\n * the DelayedOperation class public.\n */ static createAndSchedule(e, t, n, r, i) {\n const s = Date.now() + n, o = new DelayedOperation(e, t, s, r, i);\n return o.start(n), o;\n }\n /**\n * Starts the timer. This is called immediately after construction by\n * createAndSchedule().\n */ start(e) {\n this.timerHandle = setTimeout((() => this.handleDelayElapsed()), e);\n }\n /**\n * Queues the operation to run immediately (if it hasn't already been run or\n * canceled).\n */ skipDelay() {\n return this.handleDelayElapsed();\n }\n /**\n * Cancels the operation if it hasn't already been executed or canceled. The\n * promise will be rejected.\n *\n * As long as the operation has not yet been run, calling cancel() provides a\n * guarantee that the operation will not be run.\n */ cancel(e) {\n null !== this.timerHandle && (this.clearTimeout(), this.deferred.reject(new FirestoreError(D.CANCELLED, \"Operation cancelled\" + (e ? \": \" + e : \"\"))));\n }\n handleDelayElapsed() {\n this.asyncQueue.enqueueAndForget((() => null !== this.timerHandle ? (this.clearTimeout(), \n this.op().then((e => this.deferred.resolve(e)))) : Promise.resolve()));\n }\n clearTimeout() {\n null !== this.timerHandle && (this.removalCallback(this), clearTimeout(this.timerHandle), \n this.timerHandle = null);\n }\n}\n\n/**\n * Returns a FirestoreError that can be surfaced to the user if the provided\n * error is an IndexedDbTransactionError. Re-throws the error otherwise.\n */ function __PRIVATE_wrapInUserErrorIfRecoverable(e, t) {\n if (__PRIVATE_logError(\"AsyncQueue\", `${t}: ${e}`), __PRIVATE_isIndexedDbTransactionError(e)) return new FirestoreError(D.UNAVAILABLE, `${t}: ${e}`);\n throw e;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * DocumentSet is an immutable (copy-on-write) collection that holds documents\n * in order specified by the provided comparator. We always add a document key\n * comparator on top of what is provided to guarantee document equality based on\n * the key.\n */ class DocumentSet {\n /** The default ordering is by key if the comparator is omitted */\n constructor(e) {\n // We are adding document key comparator to the end as it's the only\n // guaranteed unique property of a document.\n this.comparator = e ? (t, n) => e(t, n) || DocumentKey.comparator(t.key, n.key) : (e, t) => DocumentKey.comparator(e.key, t.key), \n this.keyedMap = documentMap(), this.sortedSet = new SortedMap(this.comparator);\n }\n /**\n * Returns an empty copy of the existing DocumentSet, using the same\n * comparator.\n */ static emptySet(e) {\n return new DocumentSet(e.comparator);\n }\n has(e) {\n return null != this.keyedMap.get(e);\n }\n get(e) {\n return this.keyedMap.get(e);\n }\n first() {\n return this.sortedSet.minKey();\n }\n last() {\n return this.sortedSet.maxKey();\n }\n isEmpty() {\n return this.sortedSet.isEmpty();\n }\n /**\n * Returns the index of the provided key in the document set, or -1 if the\n * document key is not present in the set;\n */ indexOf(e) {\n const t = this.keyedMap.get(e);\n return t ? this.sortedSet.indexOf(t) : -1;\n }\n get size() {\n return this.sortedSet.size;\n }\n /** Iterates documents in order defined by \"comparator\" */ forEach(e) {\n this.sortedSet.inorderTraversal(((t, n) => (e(t), !1)));\n }\n /** Inserts or updates a document with the same key */ add(e) {\n // First remove the element if we have it.\n const t = this.delete(e.key);\n return t.copy(t.keyedMap.insert(e.key, e), t.sortedSet.insert(e, null));\n }\n /** Deletes a document with a given key */ delete(e) {\n const t = this.get(e);\n return t ? this.copy(this.keyedMap.remove(e), this.sortedSet.remove(t)) : this;\n }\n isEqual(e) {\n if (!(e instanceof DocumentSet)) return !1;\n if (this.size !== e.size) return !1;\n const t = this.sortedSet.getIterator(), n = e.sortedSet.getIterator();\n for (;t.hasNext(); ) {\n const e = t.getNext().key, r = n.getNext().key;\n if (!e.isEqual(r)) return !1;\n }\n return !0;\n }\n toString() {\n const e = [];\n return this.forEach((t => {\n e.push(t.toString());\n })), 0 === e.length ? \"DocumentSet ()\" : \"DocumentSet (\\n \" + e.join(\" \\n\") + \"\\n)\";\n }\n copy(e, t) {\n const n = new DocumentSet;\n return n.comparator = this.comparator, n.keyedMap = e, n.sortedSet = t, n;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * DocumentChangeSet keeps track of a set of changes to docs in a query, merging\n * duplicate events for the same doc.\n */ class __PRIVATE_DocumentChangeSet {\n constructor() {\n this.W_ = new SortedMap(DocumentKey.comparator);\n }\n track(e) {\n const t = e.doc.key, n = this.W_.get(t);\n n ? \n // Merge the new change with the existing change.\n 0 /* ChangeType.Added */ !== e.type && 3 /* ChangeType.Metadata */ === n.type ? this.W_ = this.W_.insert(t, e) : 3 /* ChangeType.Metadata */ === e.type && 1 /* ChangeType.Removed */ !== n.type ? this.W_ = this.W_.insert(t, {\n type: n.type,\n doc: e.doc\n }) : 2 /* ChangeType.Modified */ === e.type && 2 /* ChangeType.Modified */ === n.type ? this.W_ = this.W_.insert(t, {\n type: 2 /* ChangeType.Modified */ ,\n doc: e.doc\n }) : 2 /* ChangeType.Modified */ === e.type && 0 /* ChangeType.Added */ === n.type ? this.W_ = this.W_.insert(t, {\n type: 0 /* ChangeType.Added */ ,\n doc: e.doc\n }) : 1 /* ChangeType.Removed */ === e.type && 0 /* ChangeType.Added */ === n.type ? this.W_ = this.W_.remove(t) : 1 /* ChangeType.Removed */ === e.type && 2 /* ChangeType.Modified */ === n.type ? this.W_ = this.W_.insert(t, {\n type: 1 /* ChangeType.Removed */ ,\n doc: n.doc\n }) : 0 /* ChangeType.Added */ === e.type && 1 /* ChangeType.Removed */ === n.type ? this.W_ = this.W_.insert(t, {\n type: 2 /* ChangeType.Modified */ ,\n doc: e.doc\n }) : \n // This includes these cases, which don't make sense:\n // Added->Added\n // Removed->Removed\n // Modified->Added\n // Removed->Modified\n // Metadata->Added\n // Removed->Metadata\n fail() : this.W_ = this.W_.insert(t, e);\n }\n G_() {\n const e = [];\n return this.W_.inorderTraversal(((t, n) => {\n e.push(n);\n })), e;\n }\n}\n\nclass ViewSnapshot {\n constructor(e, t, n, r, i, s, o, _, a) {\n this.query = e, this.docs = t, this.oldDocs = n, this.docChanges = r, this.mutatedKeys = i, \n this.fromCache = s, this.syncStateChanged = o, this.excludesMetadataChanges = _, \n this.hasCachedResults = a;\n }\n /** Returns a view snapshot as if all documents in the snapshot were added. */ static fromInitialDocuments(e, t, n, r, i) {\n const s = [];\n return t.forEach((e => {\n s.push({\n type: 0 /* ChangeType.Added */ ,\n doc: e\n });\n })), new ViewSnapshot(e, t, DocumentSet.emptySet(t), s, n, r, \n /* syncStateChanged= */ !0, \n /* excludesMetadataChanges= */ !1, i);\n }\n get hasPendingWrites() {\n return !this.mutatedKeys.isEmpty();\n }\n isEqual(e) {\n if (!(this.fromCache === e.fromCache && this.hasCachedResults === e.hasCachedResults && this.syncStateChanged === e.syncStateChanged && this.mutatedKeys.isEqual(e.mutatedKeys) && __PRIVATE_queryEquals(this.query, e.query) && this.docs.isEqual(e.docs) && this.oldDocs.isEqual(e.oldDocs))) return !1;\n const t = this.docChanges, n = e.docChanges;\n if (t.length !== n.length) return !1;\n for (let e = 0; e < t.length; e++) if (t[e].type !== n[e].type || !t[e].doc.isEqual(n[e].doc)) return !1;\n return !0;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Holds the listeners and the last received ViewSnapshot for a query being\n * tracked by EventManager.\n */ class __PRIVATE_QueryListenersInfo {\n constructor() {\n this.z_ = void 0, this.j_ = [];\n }\n // Helper methods that checks if the query has listeners that listening to remote store\n H_() {\n return this.j_.some((e => e.J_()));\n }\n}\n\nclass __PRIVATE_EventManagerImpl {\n constructor() {\n this.queries = __PRIVATE_newQueriesObjectMap(), this.onlineState = \"Unknown\" /* OnlineState.Unknown */ , \n this.Y_ = new Set;\n }\n terminate() {\n !function __PRIVATE_errorAllTargets(e, t) {\n const n = __PRIVATE_debugCast(e), r = n.queries;\n // Prevent further access by clearing ObjectMap.\n n.queries = __PRIVATE_newQueriesObjectMap(), r.forEach(((e, n) => {\n for (const e of n.j_) e.onError(t);\n }));\n }\n // Call all global snapshot listeners that have been set.\n (this, new FirestoreError(D.ABORTED, \"Firestore shutting down\"));\n }\n}\n\nfunction __PRIVATE_newQueriesObjectMap() {\n return new ObjectMap((e => __PRIVATE_canonifyQuery(e)), __PRIVATE_queryEquals);\n}\n\nasync function __PRIVATE_eventManagerListen(e, t) {\n const n = __PRIVATE_debugCast(e);\n let r = 3 /* ListenerSetupAction.NoActionRequired */;\n const i = t.query;\n let s = n.queries.get(i);\n s ? !s.H_() && t.J_() && (\n // Query has been listening to local cache, and tries to add a new listener sourced from watch.\n r = 2 /* ListenerSetupAction.RequireWatchConnectionOnly */) : (s = new __PRIVATE_QueryListenersInfo, \n r = t.J_() ? 0 /* ListenerSetupAction.InitializeLocalListenAndRequireWatchConnection */ : 1 /* ListenerSetupAction.InitializeLocalListenOnly */);\n try {\n switch (r) {\n case 0 /* ListenerSetupAction.InitializeLocalListenAndRequireWatchConnection */ :\n s.z_ = await n.onListen(i, \n /** enableRemoteListen= */ !0);\n break;\n\n case 1 /* ListenerSetupAction.InitializeLocalListenOnly */ :\n s.z_ = await n.onListen(i, \n /** enableRemoteListen= */ !1);\n break;\n\n case 2 /* ListenerSetupAction.RequireWatchConnectionOnly */ :\n await n.onFirstRemoteStoreListen(i);\n }\n } catch (e) {\n const n = __PRIVATE_wrapInUserErrorIfRecoverable(e, `Initialization of query '${__PRIVATE_stringifyQuery(t.query)}' failed`);\n return void t.onError(n);\n }\n if (n.queries.set(i, s), s.j_.push(t), \n // Run global snapshot listeners if a consistent snapshot has been emitted.\n t.Z_(n.onlineState), s.z_) {\n t.X_(s.z_) && __PRIVATE_raiseSnapshotsInSyncEvent(n);\n }\n}\n\nasync function __PRIVATE_eventManagerUnlisten(e, t) {\n const n = __PRIVATE_debugCast(e), r = t.query;\n let i = 3 /* ListenerRemovalAction.NoActionRequired */;\n const s = n.queries.get(r);\n if (s) {\n const e = s.j_.indexOf(t);\n e >= 0 && (s.j_.splice(e, 1), 0 === s.j_.length ? i = t.J_() ? 0 /* ListenerRemovalAction.TerminateLocalListenAndRequireWatchDisconnection */ : 1 /* ListenerRemovalAction.TerminateLocalListenOnly */ : !s.H_() && t.J_() && (\n // The removed listener is the last one that sourced from watch.\n i = 2 /* ListenerRemovalAction.RequireWatchDisconnectionOnly */));\n }\n switch (i) {\n case 0 /* ListenerRemovalAction.TerminateLocalListenAndRequireWatchDisconnection */ :\n return n.queries.delete(r), n.onUnlisten(r, \n /** disableRemoteListen= */ !0);\n\n case 1 /* ListenerRemovalAction.TerminateLocalListenOnly */ :\n return n.queries.delete(r), n.onUnlisten(r, \n /** disableRemoteListen= */ !1);\n\n case 2 /* ListenerRemovalAction.RequireWatchDisconnectionOnly */ :\n return n.onLastRemoteStoreUnlisten(r);\n\n default:\n return;\n }\n}\n\nfunction __PRIVATE_eventManagerOnWatchChange(e, t) {\n const n = __PRIVATE_debugCast(e);\n let r = !1;\n for (const e of t) {\n const t = e.query, i = n.queries.get(t);\n if (i) {\n for (const t of i.j_) t.X_(e) && (r = !0);\n i.z_ = e;\n }\n }\n r && __PRIVATE_raiseSnapshotsInSyncEvent(n);\n}\n\nfunction __PRIVATE_eventManagerOnWatchError(e, t, n) {\n const r = __PRIVATE_debugCast(e), i = r.queries.get(t);\n if (i) for (const e of i.j_) e.onError(n);\n // Remove all listeners. NOTE: We don't need to call syncEngine.unlisten()\n // after an error.\n r.queries.delete(t);\n}\n\nfunction __PRIVATE_raiseSnapshotsInSyncEvent(e) {\n e.Y_.forEach((e => {\n e.next();\n }));\n}\n\nvar pe, ye;\n\n/** Listen to both cache and server changes */\n(ye = pe || (pe = {})).ea = \"default\", \n/** Listen to changes in cache only */\nye.Cache = \"cache\";\n\n/**\n * QueryListener takes a series of internal view snapshots and determines\n * when to raise the event.\n *\n * It uses an Observer to dispatch events.\n */\nclass __PRIVATE_QueryListener {\n constructor(e, t, n) {\n this.query = e, this.ta = t, \n /**\n * Initial snapshots (e.g. from cache) may not be propagated to the wrapped\n * observer. This flag is set to true once we've actually raised an event.\n */\n this.na = !1, this.ra = null, this.onlineState = \"Unknown\" /* OnlineState.Unknown */ , \n this.options = n || {};\n }\n /**\n * Applies the new ViewSnapshot to this listener, raising a user-facing event\n * if applicable (depending on what changed, whether the user has opted into\n * metadata-only changes, etc.). Returns true if a user-facing event was\n * indeed raised.\n */ X_(e) {\n if (!this.options.includeMetadataChanges) {\n // Remove the metadata only changes.\n const t = [];\n for (const n of e.docChanges) 3 /* ChangeType.Metadata */ !== n.type && t.push(n);\n e = new ViewSnapshot(e.query, e.docs, e.oldDocs, t, e.mutatedKeys, e.fromCache, e.syncStateChanged, \n /* excludesMetadataChanges= */ !0, e.hasCachedResults);\n }\n let t = !1;\n return this.na ? this.ia(e) && (this.ta.next(e), t = !0) : this.sa(e, this.onlineState) && (this.oa(e), \n t = !0), this.ra = e, t;\n }\n onError(e) {\n this.ta.error(e);\n }\n /** Returns whether a snapshot was raised. */ Z_(e) {\n this.onlineState = e;\n let t = !1;\n return this.ra && !this.na && this.sa(this.ra, e) && (this.oa(this.ra), t = !0), \n t;\n }\n sa(e, t) {\n // Always raise the first event when we're synced\n if (!e.fromCache) return !0;\n // Always raise event if listening to cache\n if (!this.J_()) return !0;\n // NOTE: We consider OnlineState.Unknown as online (it should become Offline\n // or Online if we wait long enough).\n const n = \"Offline\" /* OnlineState.Offline */ !== t;\n // Don't raise the event if we're online, aren't synced yet (checked\n // above) and are waiting for a sync.\n return (!this.options._a || !n) && (!e.docs.isEmpty() || e.hasCachedResults || \"Offline\" /* OnlineState.Offline */ === t);\n // Raise data from cache if we have any documents, have cached results before,\n // or we are offline.\n }\n ia(e) {\n // We don't need to handle includeDocumentMetadataChanges here because\n // the Metadata only changes have already been stripped out if needed.\n // At this point the only changes we will see are the ones we should\n // propagate.\n if (e.docChanges.length > 0) return !0;\n const t = this.ra && this.ra.hasPendingWrites !== e.hasPendingWrites;\n return !(!e.syncStateChanged && !t) && !0 === this.options.includeMetadataChanges;\n // Generally we should have hit one of the cases above, but it's possible\n // to get here if there were only metadata docChanges and they got\n // stripped out.\n }\n oa(e) {\n e = ViewSnapshot.fromInitialDocuments(e.query, e.docs, e.mutatedKeys, e.fromCache, e.hasCachedResults), \n this.na = !0, this.ta.next(e);\n }\n J_() {\n return this.options.source !== pe.Cache;\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A complete element in the bundle stream, together with the byte length it\n * occupies in the stream.\n */ class __PRIVATE_SizedBundleElement {\n constructor(e, \n // How many bytes this element takes to store in the bundle.\n t) {\n this.aa = e, this.byteLength = t;\n }\n ua() {\n return \"metadata\" in this.aa;\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Helper to convert objects from bundles to model objects in the SDK.\n */ class __PRIVATE_BundleConverterImpl {\n constructor(e) {\n this.serializer = e;\n }\n Es(e) {\n return fromName(this.serializer, e);\n }\n /**\n * Converts a BundleDocument to a MutableDocument.\n */ ds(e) {\n return e.metadata.exists ? __PRIVATE_fromDocument(this.serializer, e.document, !1) : MutableDocument.newNoDocument(this.Es(e.metadata.name), this.As(e.metadata.readTime));\n }\n As(e) {\n return __PRIVATE_fromVersion(e);\n }\n}\n\n/**\n * A class to process the elements from a bundle, load them into local\n * storage and provide progress update while loading.\n */ class __PRIVATE_BundleLoader {\n constructor(e, t, n) {\n this.ca = e, this.localStore = t, this.serializer = n, \n /** Batched queries to be saved into storage */\n this.queries = [], \n /** Batched documents to be saved into storage */\n this.documents = [], \n /** The collection groups affected by this bundle. */\n this.collectionGroups = new Set, this.progress = __PRIVATE_bundleInitialProgress(e);\n }\n /**\n * Adds an element from the bundle to the loader.\n *\n * Returns a new progress if adding the element leads to a new progress,\n * otherwise returns null.\n */ la(e) {\n this.progress.bytesLoaded += e.byteLength;\n let t = this.progress.documentsLoaded;\n if (e.aa.namedQuery) this.queries.push(e.aa.namedQuery); else if (e.aa.documentMetadata) {\n this.documents.push({\n metadata: e.aa.documentMetadata\n }), e.aa.documentMetadata.exists || ++t;\n const n = ResourcePath.fromString(e.aa.documentMetadata.name);\n this.collectionGroups.add(n.get(n.length - 2));\n } else e.aa.document && (this.documents[this.documents.length - 1].document = e.aa.document, \n ++t);\n return t !== this.progress.documentsLoaded ? (this.progress.documentsLoaded = t, \n Object.assign({}, this.progress)) : null;\n }\n ha(e) {\n const t = new Map, n = new __PRIVATE_BundleConverterImpl(this.serializer);\n for (const r of e) if (r.metadata.queries) {\n const e = n.Es(r.metadata.name);\n for (const n of r.metadata.queries) {\n const r = (t.get(n) || __PRIVATE_documentKeySet()).add(e);\n t.set(n, r);\n }\n }\n return t;\n }\n /**\n * Update the progress to 'Success' and return the updated progress.\n */ async complete() {\n const e = await __PRIVATE_localStoreApplyBundledDocuments(this.localStore, new __PRIVATE_BundleConverterImpl(this.serializer), this.documents, this.ca.id), t = this.ha(this.documents);\n for (const e of this.queries) await __PRIVATE_localStoreSaveNamedQuery(this.localStore, e, t.get(e.name));\n return this.progress.taskState = \"Success\", {\n progress: this.progress,\n Pa: this.collectionGroups,\n Ia: e\n };\n }\n}\n\n/**\n * Returns a `LoadBundleTaskProgress` representing the initial progress of\n * loading a bundle.\n */ function __PRIVATE_bundleInitialProgress(e) {\n return {\n taskState: \"Running\",\n documentsLoaded: 0,\n bytesLoaded: 0,\n totalDocuments: e.totalDocuments,\n totalBytes: e.totalBytes\n };\n}\n\n/**\n * Returns a `LoadBundleTaskProgress` representing the progress that the loading\n * has succeeded.\n */\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass __PRIVATE_AddedLimboDocument {\n constructor(e) {\n this.key = e;\n }\n}\n\nclass __PRIVATE_RemovedLimboDocument {\n constructor(e) {\n this.key = e;\n }\n}\n\n/**\n * View is responsible for computing the final merged truth of what docs are in\n * a query. It gets notified of local and remote changes to docs, and applies\n * the query filters and limits to determine the most correct possible results.\n */ class __PRIVATE_View {\n constructor(e, \n /** Documents included in the remote target */\n t) {\n this.query = e, this.Ta = t, this.Ea = null, this.hasCachedResults = !1, \n /**\n * A flag whether the view is current with the backend. A view is considered\n * current after it has seen the current flag from the backend and did not\n * lose consistency within the watch stream (e.g. because of an existence\n * filter mismatch).\n */\n this.current = !1, \n /** Documents in the view but not in the remote target */\n this.da = __PRIVATE_documentKeySet(), \n /** Document Keys that have local changes */\n this.mutatedKeys = __PRIVATE_documentKeySet(), this.Aa = __PRIVATE_newQueryComparator(e), \n this.Ra = new DocumentSet(this.Aa);\n }\n /**\n * The set of remote documents that the server has told us belongs to the target associated with\n * this view.\n */ get Va() {\n return this.Ta;\n }\n /**\n * Iterates over a set of doc changes, applies the query limit, and computes\n * what the new results should be, what the changes were, and whether we may\n * need to go back to the local cache for more results. Does not make any\n * changes to the view.\n * @param docChanges - The doc changes to apply to this view.\n * @param previousChanges - If this is being called with a refill, then start\n * with this set of docs and changes instead of the current view.\n * @returns a new set of docs, changes, and refill flag.\n */ ma(e, t) {\n const n = t ? t.fa : new __PRIVATE_DocumentChangeSet, r = t ? t.Ra : this.Ra;\n let i = t ? t.mutatedKeys : this.mutatedKeys, s = r, o = !1;\n // Track the last doc in a (full) limit. This is necessary, because some\n // update (a delete, or an update moving a doc past the old limit) might\n // mean there is some other document in the local cache that either should\n // come (1) between the old last limit doc and the new last document, in the\n // case of updates, or (2) after the new last document, in the case of\n // deletes. So we keep this doc at the old limit to compare the updates to.\n // Note that this should never get used in a refill (when previousChanges is\n // set), because there will only be adds -- no deletes or updates.\n const _ = \"F\" /* LimitType.First */ === this.query.limitType && r.size === this.query.limit ? r.last() : null, a = \"L\" /* LimitType.Last */ === this.query.limitType && r.size === this.query.limit ? r.first() : null;\n // Drop documents out to meet limit/limitToLast requirement.\n if (e.inorderTraversal(((e, t) => {\n const u = r.get(e), c = __PRIVATE_queryMatches(this.query, t) ? t : null, l = !!u && this.mutatedKeys.has(u.key), h = !!c && (c.hasLocalMutations || \n // We only consider committed mutations for documents that were\n // mutated during the lifetime of the view.\n this.mutatedKeys.has(c.key) && c.hasCommittedMutations);\n let P = !1;\n // Calculate change\n if (u && c) {\n u.data.isEqual(c.data) ? l !== h && (n.track({\n type: 3 /* ChangeType.Metadata */ ,\n doc: c\n }), P = !0) : this.ga(u, c) || (n.track({\n type: 2 /* ChangeType.Modified */ ,\n doc: c\n }), P = !0, (_ && this.Aa(c, _) > 0 || a && this.Aa(c, a) < 0) && (\n // This doc moved from inside the limit to outside the limit.\n // That means there may be some other doc in the local cache\n // that should be included instead.\n o = !0));\n } else !u && c ? (n.track({\n type: 0 /* ChangeType.Added */ ,\n doc: c\n }), P = !0) : u && !c && (n.track({\n type: 1 /* ChangeType.Removed */ ,\n doc: u\n }), P = !0, (_ || a) && (\n // A doc was removed from a full limit query. We'll need to\n // requery from the local cache to see if we know about some other\n // doc that should be in the results.\n o = !0));\n P && (c ? (s = s.add(c), i = h ? i.add(e) : i.delete(e)) : (s = s.delete(e), i = i.delete(e)));\n })), null !== this.query.limit) for (;s.size > this.query.limit; ) {\n const e = \"F\" /* LimitType.First */ === this.query.limitType ? s.last() : s.first();\n s = s.delete(e.key), i = i.delete(e.key), n.track({\n type: 1 /* ChangeType.Removed */ ,\n doc: e\n });\n }\n return {\n Ra: s,\n fa: n,\n ns: o,\n mutatedKeys: i\n };\n }\n ga(e, t) {\n // We suppress the initial change event for documents that were modified as\n // part of a write acknowledgment (e.g. when the value of a server transform\n // is applied) as Watch will send us the same document again.\n // By suppressing the event, we only raise two user visible events (one with\n // `hasPendingWrites` and the final state of the document) instead of three\n // (one with `hasPendingWrites`, the modified document with\n // `hasPendingWrites` and the final state of the document).\n return e.hasLocalMutations && t.hasCommittedMutations && !t.hasLocalMutations;\n }\n /**\n * Updates the view with the given ViewDocumentChanges and optionally updates\n * limbo docs and sync state from the provided target change.\n * @param docChanges - The set of changes to make to the view's docs.\n * @param limboResolutionEnabled - Whether to update limbo documents based on\n * this change.\n * @param targetChange - A target change to apply for computing limbo docs and\n * sync state.\n * @param targetIsPendingReset - Whether the target is pending to reset due to\n * existence filter mismatch. If not explicitly specified, it is treated\n * equivalently to `false`.\n * @returns A new ViewChange with the given docs, changes, and sync state.\n */\n // PORTING NOTE: The iOS/Android clients always compute limbo document changes.\n applyChanges(e, t, n, r) {\n const i = this.Ra;\n this.Ra = e.Ra, this.mutatedKeys = e.mutatedKeys;\n // Sort changes based on type and query comparator\n const s = e.fa.G_();\n s.sort(((e, t) => function __PRIVATE_compareChangeType(e, t) {\n const order = e => {\n switch (e) {\n case 0 /* ChangeType.Added */ :\n return 1;\n\n case 2 /* ChangeType.Modified */ :\n case 3 /* ChangeType.Metadata */ :\n // A metadata change is converted to a modified change at the public\n // api layer. Since we sort by document key and then change type,\n // metadata and modified changes must be sorted equivalently.\n return 2;\n\n case 1 /* ChangeType.Removed */ :\n return 0;\n\n default:\n return fail();\n }\n };\n return order(e) - order(t);\n }\n /**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ (e.type, t.type) || this.Aa(e.doc, t.doc))), this.pa(n), r = null != r && r;\n const o = t && !r ? this.ya() : [], _ = 0 === this.da.size && this.current && !r ? 1 /* SyncState.Synced */ : 0 /* SyncState.Local */ , a = _ !== this.Ea;\n // We are at synced state if there is no limbo docs are waiting to be resolved, view is current\n // with the backend, and the query is not pending to reset due to existence filter mismatch.\n if (this.Ea = _, 0 !== s.length || a) {\n return {\n snapshot: new ViewSnapshot(this.query, e.Ra, i, s, e.mutatedKeys, 0 /* SyncState.Local */ === _, a, \n /* excludesMetadataChanges= */ !1, !!n && n.resumeToken.approximateByteSize() > 0),\n wa: o\n };\n }\n // no changes\n return {\n wa: o\n };\n }\n /**\n * Applies an OnlineState change to the view, potentially generating a\n * ViewChange if the view's syncState changes as a result.\n */ Z_(e) {\n return this.current && \"Offline\" /* OnlineState.Offline */ === e ? (\n // If we're offline, set `current` to false and then call applyChanges()\n // to refresh our syncState and generate a ViewChange as appropriate. We\n // are guaranteed to get a new TargetChange that sets `current` back to\n // true once the client is back online.\n this.current = !1, this.applyChanges({\n Ra: this.Ra,\n fa: new __PRIVATE_DocumentChangeSet,\n mutatedKeys: this.mutatedKeys,\n ns: !1\n }, \n /* limboResolutionEnabled= */ !1)) : {\n wa: []\n };\n }\n /**\n * Returns whether the doc for the given key should be in limbo.\n */ Sa(e) {\n // If the remote end says it's part of this query, it's not in limbo.\n return !this.Ta.has(e) && (\n // The local store doesn't think it's a result, so it shouldn't be in limbo.\n !!this.Ra.has(e) && !this.Ra.get(e).hasLocalMutations);\n }\n /**\n * Updates syncedDocuments, current, and limbo docs based on the given change.\n * Returns the list of changes to which docs are in limbo.\n */ pa(e) {\n e && (e.addedDocuments.forEach((e => this.Ta = this.Ta.add(e))), e.modifiedDocuments.forEach((e => {})), \n e.removedDocuments.forEach((e => this.Ta = this.Ta.delete(e))), this.current = e.current);\n }\n ya() {\n // We can only determine limbo documents when we're in-sync with the server.\n if (!this.current) return [];\n // TODO(klimt): Do this incrementally so that it's not quadratic when\n // updating many documents.\n const e = this.da;\n this.da = __PRIVATE_documentKeySet(), this.Ra.forEach((e => {\n this.Sa(e.key) && (this.da = this.da.add(e.key));\n }));\n // Diff the new limbo docs with the old limbo docs.\n const t = [];\n return e.forEach((e => {\n this.da.has(e) || t.push(new __PRIVATE_RemovedLimboDocument(e));\n })), this.da.forEach((n => {\n e.has(n) || t.push(new __PRIVATE_AddedLimboDocument(n));\n })), t;\n }\n /**\n * Update the in-memory state of the current view with the state read from\n * persistence.\n *\n * We update the query view whenever a client's primary status changes:\n * - When a client transitions from primary to secondary, it can miss\n * LocalStorage updates and its query views may temporarily not be\n * synchronized with the state on disk.\n * - For secondary to primary transitions, the client needs to update the list\n * of `syncedDocuments` since secondary clients update their query views\n * based purely on synthesized RemoteEvents.\n *\n * @param queryResult.documents - The documents that match the query according\n * to the LocalStore.\n * @param queryResult.remoteKeys - The keys of the documents that match the\n * query according to the backend.\n *\n * @returns The ViewChange that resulted from this synchronization.\n */\n // PORTING NOTE: Multi-tab only.\n ba(e) {\n this.Ta = e.Ts, this.da = __PRIVATE_documentKeySet();\n const t = this.ma(e.documents);\n return this.applyChanges(t, /* limboResolutionEnabled= */ !0);\n }\n /**\n * Returns a view snapshot as if this query was just listened to. Contains\n * a document add for every existing document and the `fromCache` and\n * `hasPendingWrites` status of the already established view.\n */\n // PORTING NOTE: Multi-tab only.\n Da() {\n return ViewSnapshot.fromInitialDocuments(this.query, this.Ra, this.mutatedKeys, 0 /* SyncState.Local */ === this.Ea, this.hasCachedResults);\n }\n}\n\n/**\n * QueryView contains all of the data that SyncEngine needs to keep track of for\n * a particular query.\n */\nclass __PRIVATE_QueryView {\n constructor(\n /**\n * The query itself.\n */\n e, \n /**\n * The target number created by the client that is used in the watch\n * stream to identify this query.\n */\n t, \n /**\n * The view is responsible for computing the final merged truth of what\n * docs are in the query. It gets notified of local and remote changes,\n * and applies the query filters and limits to determine the most correct\n * possible results.\n */\n n) {\n this.query = e, this.targetId = t, this.view = n;\n }\n}\n\n/** Tracks a limbo resolution. */ class LimboResolution {\n constructor(e) {\n this.key = e, \n /**\n * Set to true once we've received a document. This is used in\n * getRemoteKeysForTarget() and ultimately used by WatchChangeAggregator to\n * decide whether it needs to manufacture a delete event for the target once\n * the target is CURRENT.\n */\n this.va = !1;\n }\n}\n\n/**\n * An implementation of `SyncEngine` coordinating with other parts of SDK.\n *\n * The parts of SyncEngine that act as a callback to RemoteStore need to be\n * registered individually. This is done in `syncEngineWrite()` and\n * `syncEngineListen()` (as well as `applyPrimaryState()`) as these methods\n * serve as entry points to RemoteStore's functionality.\n *\n * Note: some field defined in this class might have public access level, but\n * the class is not exported so they are only accessible from this module.\n * This is useful to implement optional features (like bundles) in free\n * functions, such that they are tree-shakeable.\n */ class __PRIVATE_SyncEngineImpl {\n constructor(e, t, n, \n // PORTING NOTE: Manages state synchronization in multi-tab environments.\n r, i, s) {\n this.localStore = e, this.remoteStore = t, this.eventManager = n, this.sharedClientState = r, \n this.currentUser = i, this.maxConcurrentLimboResolutions = s, this.Ca = {}, this.Fa = new ObjectMap((e => __PRIVATE_canonifyQuery(e)), __PRIVATE_queryEquals), \n this.Ma = new Map, \n /**\n * The keys of documents that are in limbo for which we haven't yet started a\n * limbo resolution query. The strings in this set are the result of calling\n * `key.path.canonicalString()` where `key` is a `DocumentKey` object.\n *\n * The `Set` type was chosen because it provides efficient lookup and removal\n * of arbitrary elements and it also maintains insertion order, providing the\n * desired queue-like FIFO semantics.\n */\n this.xa = new Set, \n /**\n * Keeps track of the target ID for each document that is in limbo with an\n * active target.\n */\n this.Oa = new SortedMap(DocumentKey.comparator), \n /**\n * Keeps track of the information about an active limbo resolution for each\n * active target ID that was started for the purpose of limbo resolution.\n */\n this.Na = new Map, this.La = new __PRIVATE_ReferenceSet, \n /** Stores user completion handlers, indexed by User and BatchId. */\n this.Ba = {}, \n /** Stores user callbacks waiting for all pending writes to be acknowledged. */\n this.ka = new Map, this.qa = __PRIVATE_TargetIdGenerator.kn(), this.onlineState = \"Unknown\" /* OnlineState.Unknown */ , \n // The primary state is set to `true` or `false` immediately after Firestore\n // startup. In the interim, a client should only be considered primary if\n // `isPrimary` is true.\n this.Qa = void 0;\n }\n get isPrimaryClient() {\n return !0 === this.Qa;\n }\n}\n\n/**\n * Initiates the new listen, resolves promise when listen enqueued to the\n * server. All the subsequent view snapshots or errors are sent to the\n * subscribed handlers. Returns the initial snapshot.\n */\nasync function __PRIVATE_syncEngineListen(e, t, n = !0) {\n const r = __PRIVATE_ensureWatchCallbacks(e);\n let i;\n const s = r.Fa.get(t);\n return s ? (\n // PORTING NOTE: With Multi-Tab Web, it is possible that a query view\n // already exists when EventManager calls us for the first time. This\n // happens when the primary tab is already listening to this query on\n // behalf of another tab and the user of the primary also starts listening\n // to the query. EventManager will not have an assigned target ID in this\n // case and calls `listen` to obtain this ID.\n r.sharedClientState.addLocalQueryTarget(s.targetId), i = s.view.Da()) : i = await __PRIVATE_allocateTargetAndMaybeListen(r, t, n, \n /** shouldInitializeView= */ !0), i;\n}\n\n/** Query has been listening to the cache, and tries to initiate the remote store listen */ async function __PRIVATE_triggerRemoteStoreListen(e, t) {\n const n = __PRIVATE_ensureWatchCallbacks(e);\n await __PRIVATE_allocateTargetAndMaybeListen(n, t, \n /** shouldListenToRemote= */ !0, \n /** shouldInitializeView= */ !1);\n}\n\nasync function __PRIVATE_allocateTargetAndMaybeListen(e, t, n, r) {\n const i = await __PRIVATE_localStoreAllocateTarget(e.localStore, __PRIVATE_queryToTarget(t)), s = i.targetId, o = e.sharedClientState.addLocalQueryTarget(s, n);\n let _;\n return r && (_ = await __PRIVATE_initializeViewAndComputeSnapshot(e, t, s, \"current\" === o, i.resumeToken)), \n e.isPrimaryClient && n && __PRIVATE_remoteStoreListen(e.remoteStore, i), _;\n}\n\n/**\n * Registers a view for a previously unknown query and computes its initial\n * snapshot.\n */ async function __PRIVATE_initializeViewAndComputeSnapshot(e, t, n, r, i) {\n // PORTING NOTE: On Web only, we inject the code that registers new Limbo\n // targets based on view changes. This allows us to only depend on Limbo\n // changes when user code includes queries.\n e.Ka = (t, n, r) => async function __PRIVATE_applyDocChanges(e, t, n, r) {\n let i = t.view.ma(n);\n i.ns && (\n // The query has a limit and some docs were removed, so we need\n // to re-run the query against the local store to make sure we\n // didn't lose any good docs that had been past the limit.\n i = await __PRIVATE_localStoreExecuteQuery(e.localStore, t.query, \n /* usePreviousResults= */ !1).then((({documents: e}) => t.view.ma(e, i))));\n const s = r && r.targetChanges.get(t.targetId), o = r && null != r.targetMismatches.get(t.targetId), _ = t.view.applyChanges(i, \n /* limboResolutionEnabled= */ e.isPrimaryClient, s, o);\n return __PRIVATE_updateTrackedLimbos(e, t.targetId, _.wa), _.snapshot;\n }(e, t, n, r);\n const s = await __PRIVATE_localStoreExecuteQuery(e.localStore, t, \n /* usePreviousResults= */ !0), o = new __PRIVATE_View(t, s.Ts), _ = o.ma(s.documents), a = TargetChange.createSynthesizedTargetChangeForCurrentChange(n, r && \"Offline\" /* OnlineState.Offline */ !== e.onlineState, i), u = o.applyChanges(_, \n /* limboResolutionEnabled= */ e.isPrimaryClient, a);\n __PRIVATE_updateTrackedLimbos(e, n, u.wa);\n const c = new __PRIVATE_QueryView(t, n, o);\n return e.Fa.set(t, c), e.Ma.has(n) ? e.Ma.get(n).push(t) : e.Ma.set(n, [ t ]), u.snapshot;\n}\n\n/** Stops listening to the query. */ async function __PRIVATE_syncEngineUnlisten(e, t, n) {\n const r = __PRIVATE_debugCast(e), i = r.Fa.get(t), s = r.Ma.get(i.targetId);\n if (s.length > 1) return r.Ma.set(i.targetId, s.filter((e => !__PRIVATE_queryEquals(e, t)))), \n void r.Fa.delete(t);\n // No other queries are mapped to the target, clean up the query and the target.\n if (r.isPrimaryClient) {\n // We need to remove the local query target first to allow us to verify\n // whether any other client is still interested in this target.\n r.sharedClientState.removeLocalQueryTarget(i.targetId);\n r.sharedClientState.isActiveQueryTarget(i.targetId) || await __PRIVATE_localStoreReleaseTarget(r.localStore, i.targetId, \n /*keepPersistedTargetData=*/ !1).then((() => {\n r.sharedClientState.clearQueryState(i.targetId), n && __PRIVATE_remoteStoreUnlisten(r.remoteStore, i.targetId), \n __PRIVATE_removeAndCleanupTarget(r, i.targetId);\n })).catch(__PRIVATE_ignoreIfPrimaryLeaseLoss);\n } else __PRIVATE_removeAndCleanupTarget(r, i.targetId), await __PRIVATE_localStoreReleaseTarget(r.localStore, i.targetId, \n /*keepPersistedTargetData=*/ !0);\n}\n\n/** Unlistens to the remote store while still listening to the cache. */ async function __PRIVATE_triggerRemoteStoreUnlisten(e, t) {\n const n = __PRIVATE_debugCast(e), r = n.Fa.get(t), i = n.Ma.get(r.targetId);\n n.isPrimaryClient && 1 === i.length && (\n // PORTING NOTE: Unregister the target ID with local Firestore client as\n // watch target.\n n.sharedClientState.removeLocalQueryTarget(r.targetId), __PRIVATE_remoteStoreUnlisten(n.remoteStore, r.targetId));\n}\n\n/**\n * Initiates the write of local mutation batch which involves adding the\n * writes to the mutation queue, notifying the remote store about new\n * mutations and raising events for any changes this write caused.\n *\n * The promise returned by this call is resolved when the above steps\n * have completed, *not* when the write was acked by the backend. The\n * userCallback is resolved once the write was acked/rejected by the\n * backend (or failed locally for any other reason).\n */ async function __PRIVATE_syncEngineWrite(e, t, n) {\n const r = __PRIVATE_syncEngineEnsureWriteCallbacks(e);\n try {\n const e = await function __PRIVATE_localStoreWriteLocally(e, t) {\n const n = __PRIVATE_debugCast(e), r = Timestamp.now(), i = t.reduce(((e, t) => e.add(t.key)), __PRIVATE_documentKeySet());\n let s, o;\n return n.persistence.runTransaction(\"Locally write mutations\", \"readwrite\", (e => {\n // Figure out which keys do not have a remote version in the cache, this\n // is needed to create the right overlay mutation: if no remote version\n // presents, we do not need to create overlays as patch mutations.\n // TODO(Overlay): Is there a better way to determine this? Using the\n // document version does not work because local mutations set them back\n // to 0.\n let _ = __PRIVATE_mutableDocumentMap(), a = __PRIVATE_documentKeySet();\n return n.cs.getEntries(e, i).next((e => {\n _ = e, _.forEach(((e, t) => {\n t.isValidDocument() || (a = a.add(e));\n }));\n })).next((() => n.localDocuments.getOverlayedDocuments(e, _))).next((i => {\n s = i;\n // For non-idempotent mutations (such as `FieldValue.increment()`),\n // we record the base state in a separate patch mutation. This is\n // later used to guarantee consistent values and prevents flicker\n // even if the backend sends us an update that already includes our\n // transform.\n const o = [];\n for (const e of t) {\n const t = __PRIVATE_mutationExtractBaseValue(e, s.get(e.key).overlayedDocument);\n null != t && \n // NOTE: The base state should only be applied if there's some\n // existing document to override, so use a Precondition of\n // exists=true\n o.push(new __PRIVATE_PatchMutation(e.key, t, __PRIVATE_extractFieldMask(t.value.mapValue), Precondition.exists(!0)));\n }\n return n.mutationQueue.addMutationBatch(e, r, o, t);\n })).next((t => {\n o = t;\n const r = t.applyToLocalDocumentSet(s, a);\n return n.documentOverlayCache.saveOverlays(e, t.batchId, r);\n }));\n })).then((() => ({\n batchId: o.batchId,\n changes: __PRIVATE_convertOverlayedDocumentMapToDocumentMap(s)\n })));\n }(r.localStore, t);\n r.sharedClientState.addPendingMutation(e.batchId), function __PRIVATE_addMutationCallback(e, t, n) {\n let r = e.Ba[e.currentUser.toKey()];\n r || (r = new SortedMap(__PRIVATE_primitiveComparator));\n r = r.insert(t, n), e.Ba[e.currentUser.toKey()] = r;\n }\n /**\n * Resolves or rejects the user callback for the given batch and then discards\n * it.\n */ (r, e.batchId, n), await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(r, e.changes), \n await __PRIVATE_fillWritePipeline(r.remoteStore);\n } catch (e) {\n // If we can't persist the mutation, we reject the user callback and\n // don't send the mutation. The user can then retry the write.\n const t = __PRIVATE_wrapInUserErrorIfRecoverable(e, \"Failed to persist write\");\n n.reject(t);\n }\n}\n\n/**\n * Applies one remote event to the sync engine, notifying any views of the\n * changes, and releasing any pending mutation batches that would become\n * visible because of the snapshot version the remote event contains.\n */ async function __PRIVATE_syncEngineApplyRemoteEvent(e, t) {\n const n = __PRIVATE_debugCast(e);\n try {\n const e = await __PRIVATE_localStoreApplyRemoteEventToLocalCache(n.localStore, t);\n // Update `receivedDocument` as appropriate for any limbo targets.\n t.targetChanges.forEach(((e, t) => {\n const r = n.Na.get(t);\n r && (\n // Since this is a limbo resolution lookup, it's for a single document\n // and it could be added, modified, or removed, but not a combination.\n __PRIVATE_hardAssert(e.addedDocuments.size + e.modifiedDocuments.size + e.removedDocuments.size <= 1), \n e.addedDocuments.size > 0 ? r.va = !0 : e.modifiedDocuments.size > 0 ? __PRIVATE_hardAssert(r.va) : e.removedDocuments.size > 0 && (__PRIVATE_hardAssert(r.va), \n r.va = !1));\n })), await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(n, e, t);\n } catch (e) {\n await __PRIVATE_ignoreIfPrimaryLeaseLoss(e);\n }\n}\n\n/**\n * Applies an OnlineState change to the sync engine and notifies any views of\n * the change.\n */ function __PRIVATE_syncEngineApplyOnlineStateChange(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n // If we are the secondary client, we explicitly ignore the remote store's\n // online state (the local client may go offline, even though the primary\n // tab remains online) and only apply the primary tab's online state from\n // SharedClientState.\n if (r.isPrimaryClient && 0 /* OnlineStateSource.RemoteStore */ === n || !r.isPrimaryClient && 1 /* OnlineStateSource.SharedClientState */ === n) {\n const e = [];\n r.Fa.forEach(((n, r) => {\n const i = r.view.Z_(t);\n i.snapshot && e.push(i.snapshot);\n })), function __PRIVATE_eventManagerOnOnlineStateChange(e, t) {\n const n = __PRIVATE_debugCast(e);\n n.onlineState = t;\n let r = !1;\n n.queries.forEach(((e, n) => {\n for (const e of n.j_) \n // Run global snapshot listeners if a consistent snapshot has been emitted.\n e.Z_(t) && (r = !0);\n })), r && __PRIVATE_raiseSnapshotsInSyncEvent(n);\n }(r.eventManager, t), e.length && r.Ca.d_(e), r.onlineState = t, r.isPrimaryClient && r.sharedClientState.setOnlineState(t);\n }\n}\n\n/**\n * Rejects the listen for the given targetID. This can be triggered by the\n * backend for any active target.\n *\n * @param syncEngine - The sync engine implementation.\n * @param targetId - The targetID corresponds to one previously initiated by the\n * user as part of TargetData passed to listen() on RemoteStore.\n * @param err - A description of the condition that has forced the rejection.\n * Nearly always this will be an indication that the user is no longer\n * authorized to see the data matching the target.\n */ async function __PRIVATE_syncEngineRejectListen(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n // PORTING NOTE: Multi-tab only.\n r.sharedClientState.updateQueryState(t, \"rejected\", n);\n const i = r.Na.get(t), s = i && i.key;\n if (s) {\n // TODO(klimt): We really only should do the following on permission\n // denied errors, but we don't have the cause code here.\n // It's a limbo doc. Create a synthetic event saying it was deleted.\n // This is kind of a hack. Ideally, we would have a method in the local\n // store to purge a document. However, it would be tricky to keep all of\n // the local store's invariants with another method.\n let e = new SortedMap(DocumentKey.comparator);\n // TODO(b/217189216): This limbo document should ideally have a read time,\n // so that it is picked up by any read-time based scans. The backend,\n // however, does not send a read time for target removals.\n e = e.insert(s, MutableDocument.newNoDocument(s, SnapshotVersion.min()));\n const n = __PRIVATE_documentKeySet().add(s), i = new RemoteEvent(SnapshotVersion.min(), \n /* targetChanges= */ new Map, \n /* targetMismatches= */ new SortedMap(__PRIVATE_primitiveComparator), e, n);\n await __PRIVATE_syncEngineApplyRemoteEvent(r, i), \n // Since this query failed, we won't want to manually unlisten to it.\n // We only remove it from bookkeeping after we successfully applied the\n // RemoteEvent. If `applyRemoteEvent()` throws, we want to re-listen to\n // this query when the RemoteStore restarts the Watch stream, which should\n // re-trigger the target failure.\n r.Oa = r.Oa.remove(s), r.Na.delete(t), __PRIVATE_pumpEnqueuedLimboResolutions(r);\n } else await __PRIVATE_localStoreReleaseTarget(r.localStore, t, \n /* keepPersistedTargetData */ !1).then((() => __PRIVATE_removeAndCleanupTarget(r, t, n))).catch(__PRIVATE_ignoreIfPrimaryLeaseLoss);\n}\n\nasync function __PRIVATE_syncEngineApplySuccessfulWrite(e, t) {\n const n = __PRIVATE_debugCast(e), r = t.batch.batchId;\n try {\n const e = await __PRIVATE_localStoreAcknowledgeBatch(n.localStore, t);\n // The local store may or may not be able to apply the write result and\n // raise events immediately (depending on whether the watcher is caught\n // up), so we raise user callbacks first so that they consistently happen\n // before listen events.\n __PRIVATE_processUserCallback(n, r, /*error=*/ null), __PRIVATE_triggerPendingWritesCallbacks(n, r), \n n.sharedClientState.updateMutationState(r, \"acknowledged\"), await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(n, e);\n } catch (e) {\n await __PRIVATE_ignoreIfPrimaryLeaseLoss(e);\n }\n}\n\nasync function __PRIVATE_syncEngineRejectFailedWrite(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n try {\n const e = await function __PRIVATE_localStoreRejectBatch(e, t) {\n const n = __PRIVATE_debugCast(e);\n return n.persistence.runTransaction(\"Reject batch\", \"readwrite-primary\", (e => {\n let r;\n return n.mutationQueue.lookupMutationBatch(e, t).next((t => (__PRIVATE_hardAssert(null !== t), \n r = t.keys(), n.mutationQueue.removeMutationBatch(e, t)))).next((() => n.mutationQueue.performConsistencyCheck(e))).next((() => n.documentOverlayCache.removeOverlaysForBatchId(e, r, t))).next((() => n.localDocuments.recalculateAndSaveOverlaysForDocumentKeys(e, r))).next((() => n.localDocuments.getDocuments(e, r)));\n }));\n }\n /**\n * Returns the largest (latest) batch id in mutation queue that is pending\n * server response.\n *\n * Returns `BATCHID_UNKNOWN` if the queue is empty.\n */ (r.localStore, t);\n // The local store may or may not be able to apply the write result and\n // raise events immediately (depending on whether the watcher is caught up),\n // so we raise user callbacks first so that they consistently happen before\n // listen events.\n __PRIVATE_processUserCallback(r, t, n), __PRIVATE_triggerPendingWritesCallbacks(r, t), \n r.sharedClientState.updateMutationState(t, \"rejected\", n), await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(r, e);\n } catch (n) {\n await __PRIVATE_ignoreIfPrimaryLeaseLoss(n);\n }\n}\n\n/**\n * Registers a user callback that resolves when all pending mutations at the moment of calling\n * are acknowledged .\n */ async function __PRIVATE_syncEngineRegisterPendingWritesCallback(e, t) {\n const n = __PRIVATE_debugCast(e);\n __PRIVATE_canUseNetwork(n.remoteStore) || __PRIVATE_logDebug(\"SyncEngine\", \"The network is disabled. The task returned by 'awaitPendingWrites()' will not complete until the network is enabled.\");\n try {\n const e = await function __PRIVATE_localStoreGetHighestUnacknowledgedBatchId(e) {\n const t = __PRIVATE_debugCast(e);\n return t.persistence.runTransaction(\"Get highest unacknowledged batch id\", \"readonly\", (e => t.mutationQueue.getHighestUnacknowledgedBatchId(e)));\n }(n.localStore);\n if (-1 === e) \n // Trigger the callback right away if there is no pending writes at the moment.\n return void t.resolve();\n const r = n.ka.get(e) || [];\n r.push(t), n.ka.set(e, r);\n } catch (e) {\n const n = __PRIVATE_wrapInUserErrorIfRecoverable(e, \"Initialization of waitForPendingWrites() operation failed\");\n t.reject(n);\n }\n}\n\n/**\n * Triggers the callbacks that are waiting for this batch id to get acknowledged by server,\n * if there are any.\n */ function __PRIVATE_triggerPendingWritesCallbacks(e, t) {\n (e.ka.get(t) || []).forEach((e => {\n e.resolve();\n })), e.ka.delete(t);\n}\n\n/** Reject all outstanding callbacks waiting for pending writes to complete. */ function __PRIVATE_processUserCallback(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n let i = r.Ba[r.currentUser.toKey()];\n // NOTE: Mutations restored from persistence won't have callbacks, so it's\n // okay for there to be no callback for this ID.\n if (i) {\n const e = i.get(t);\n e && (n ? e.reject(n) : e.resolve(), i = i.remove(t)), r.Ba[r.currentUser.toKey()] = i;\n }\n}\n\nfunction __PRIVATE_removeAndCleanupTarget(e, t, n = null) {\n e.sharedClientState.removeLocalQueryTarget(t);\n for (const r of e.Ma.get(t)) e.Fa.delete(r), n && e.Ca.$a(r, n);\n if (e.Ma.delete(t), e.isPrimaryClient) {\n e.La.gr(t).forEach((t => {\n e.La.containsKey(t) || \n // We removed the last reference for this key\n __PRIVATE_removeLimboTarget(e, t);\n }));\n }\n}\n\nfunction __PRIVATE_removeLimboTarget(e, t) {\n e.xa.delete(t.path.canonicalString());\n // It's possible that the target already got removed because the query failed. In that case,\n // the key won't exist in `limboTargetsByKey`. Only do the cleanup if we still have the target.\n const n = e.Oa.get(t);\n null !== n && (__PRIVATE_remoteStoreUnlisten(e.remoteStore, n), e.Oa = e.Oa.remove(t), \n e.Na.delete(n), __PRIVATE_pumpEnqueuedLimboResolutions(e));\n}\n\nfunction __PRIVATE_updateTrackedLimbos(e, t, n) {\n for (const r of n) if (r instanceof __PRIVATE_AddedLimboDocument) e.La.addReference(r.key, t), \n __PRIVATE_trackLimboChange(e, r); else if (r instanceof __PRIVATE_RemovedLimboDocument) {\n __PRIVATE_logDebug(\"SyncEngine\", \"Document no longer in limbo: \" + r.key), e.La.removeReference(r.key, t);\n e.La.containsKey(r.key) || \n // We removed the last reference for this key\n __PRIVATE_removeLimboTarget(e, r.key);\n } else fail();\n}\n\nfunction __PRIVATE_trackLimboChange(e, t) {\n const n = t.key, r = n.path.canonicalString();\n e.Oa.get(n) || e.xa.has(r) || (__PRIVATE_logDebug(\"SyncEngine\", \"New document in limbo: \" + n), \n e.xa.add(r), __PRIVATE_pumpEnqueuedLimboResolutions(e));\n}\n\n/**\n * Starts listens for documents in limbo that are enqueued for resolution,\n * subject to a maximum number of concurrent resolutions.\n *\n * Without bounding the number of concurrent resolutions, the server can fail\n * with \"resource exhausted\" errors which can lead to pathological client\n * behavior as seen in https://github.com/firebase/firebase-js-sdk/issues/2683.\n */ function __PRIVATE_pumpEnqueuedLimboResolutions(e) {\n for (;e.xa.size > 0 && e.Oa.size < e.maxConcurrentLimboResolutions; ) {\n const t = e.xa.values().next().value;\n e.xa.delete(t);\n const n = new DocumentKey(ResourcePath.fromString(t)), r = e.qa.next();\n e.Na.set(r, new LimboResolution(n)), e.Oa = e.Oa.insert(n, r), __PRIVATE_remoteStoreListen(e.remoteStore, new TargetData(__PRIVATE_queryToTarget(__PRIVATE_newQueryForPath(n.path)), r, \"TargetPurposeLimboResolution\" /* TargetPurpose.LimboResolution */ , __PRIVATE_ListenSequence.oe));\n }\n}\n\nasync function __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(e, t, n) {\n const r = __PRIVATE_debugCast(e), i = [], s = [], o = [];\n r.Fa.isEmpty() || (r.Fa.forEach(((e, _) => {\n o.push(r.Ka(_, t, n).then((e => {\n var t;\n // If there are changes, or we are handling a global snapshot, notify\n // secondary clients to update query state.\n if ((e || n) && r.isPrimaryClient) {\n // Query state is set to `current` if:\n // - There is a view change and it is up-to-date, or,\n // - There is a global snapshot, the Target is current, and no changes to be resolved\n const i = e ? !e.fromCache : null === (t = null == n ? void 0 : n.targetChanges.get(_.targetId)) || void 0 === t ? void 0 : t.current;\n r.sharedClientState.updateQueryState(_.targetId, i ? \"current\" : \"not-current\");\n }\n // Update views if there are actual changes.\n if (e) {\n i.push(e);\n const t = __PRIVATE_LocalViewChanges.Wi(_.targetId, e);\n s.push(t);\n }\n })));\n })), await Promise.all(o), r.Ca.d_(i), await async function __PRIVATE_localStoreNotifyLocalViewChanges(e, t) {\n const n = __PRIVATE_debugCast(e);\n try {\n await n.persistence.runTransaction(\"notifyLocalViewChanges\", \"readwrite\", (e => PersistencePromise.forEach(t, (t => PersistencePromise.forEach(t.$i, (r => n.persistence.referenceDelegate.addReference(e, t.targetId, r))).next((() => PersistencePromise.forEach(t.Ui, (r => n.persistence.referenceDelegate.removeReference(e, t.targetId, r)))))))));\n } catch (e) {\n if (!__PRIVATE_isIndexedDbTransactionError(e)) throw e;\n // If `notifyLocalViewChanges` fails, we did not advance the sequence\n // number for the documents that were included in this transaction.\n // This might trigger them to be deleted earlier than they otherwise\n // would have, but it should not invalidate the integrity of the data.\n __PRIVATE_logDebug(\"LocalStore\", \"Failed to update sequence numbers: \" + e);\n }\n for (const e of t) {\n const t = e.targetId;\n if (!e.fromCache) {\n const e = n.os.get(t), r = e.snapshotVersion, i = e.withLastLimboFreeSnapshotVersion(r);\n // Advance the last limbo free snapshot version\n n.os = n.os.insert(t, i);\n }\n }\n }(r.localStore, s));\n}\n\nasync function __PRIVATE_syncEngineHandleCredentialChange(e, t) {\n const n = __PRIVATE_debugCast(e);\n if (!n.currentUser.isEqual(t)) {\n __PRIVATE_logDebug(\"SyncEngine\", \"User change. New user:\", t.toKey());\n const e = await __PRIVATE_localStoreHandleUserChange(n.localStore, t);\n n.currentUser = t, \n // Fails tasks waiting for pending writes requested by previous user.\n function __PRIVATE_rejectOutstandingPendingWritesCallbacks(e, t) {\n e.ka.forEach((e => {\n e.forEach((e => {\n e.reject(new FirestoreError(D.CANCELLED, t));\n }));\n })), e.ka.clear();\n }(n, \"'waitForPendingWrites' promise is rejected due to a user change.\"), \n // TODO(b/114226417): Consider calling this only in the primary tab.\n n.sharedClientState.handleUserChange(t, e.removedBatchIds, e.addedBatchIds), await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(n, e.hs);\n }\n}\n\nfunction __PRIVATE_syncEngineGetRemoteKeysForTarget(e, t) {\n const n = __PRIVATE_debugCast(e), r = n.Na.get(t);\n if (r && r.va) return __PRIVATE_documentKeySet().add(r.key);\n {\n let e = __PRIVATE_documentKeySet();\n const r = n.Ma.get(t);\n if (!r) return e;\n for (const t of r) {\n const r = n.Fa.get(t);\n e = e.unionWith(r.view.Va);\n }\n return e;\n }\n}\n\n/**\n * Reconcile the list of synced documents in an existing view with those\n * from persistence.\n */ async function __PRIVATE_synchronizeViewAndComputeSnapshot(e, t) {\n const n = __PRIVATE_debugCast(e), r = await __PRIVATE_localStoreExecuteQuery(n.localStore, t.query, \n /* usePreviousResults= */ !0), i = t.view.ba(r);\n return n.isPrimaryClient && __PRIVATE_updateTrackedLimbos(n, t.targetId, i.wa), \n i;\n}\n\n/**\n * Retrieves newly changed documents from remote document cache and raises\n * snapshots if needed.\n */\n// PORTING NOTE: Multi-Tab only.\nasync function __PRIVATE_syncEngineSynchronizeWithChangedDocuments(e, t) {\n const n = __PRIVATE_debugCast(e);\n return __PRIVATE_localStoreGetNewDocumentChanges(n.localStore, t).then((e => __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(n, e)));\n}\n\n/** Applies a mutation state to an existing batch. */\n// PORTING NOTE: Multi-Tab only.\nasync function __PRIVATE_syncEngineApplyBatchState(e, t, n, r) {\n const i = __PRIVATE_debugCast(e), s = await function __PRIVATE_localStoreLookupMutationDocuments(e, t) {\n const n = __PRIVATE_debugCast(e), r = __PRIVATE_debugCast(n.mutationQueue);\n return n.persistence.runTransaction(\"Lookup mutation documents\", \"readonly\", (e => r.Mn(e, t).next((t => t ? n.localDocuments.getDocuments(e, t) : PersistencePromise.resolve(null)))));\n }\n // PORTING NOTE: Multi-Tab only.\n (i.localStore, t);\n null !== s ? (\"pending\" === n ? \n // If we are the primary client, we need to send this write to the\n // backend. Secondary clients will ignore these writes since their remote\n // connection is disabled.\n await __PRIVATE_fillWritePipeline(i.remoteStore) : \"acknowledged\" === n || \"rejected\" === n ? (\n // NOTE: Both these methods are no-ops for batches that originated from\n // other clients.\n __PRIVATE_processUserCallback(i, t, r || null), __PRIVATE_triggerPendingWritesCallbacks(i, t), \n function __PRIVATE_localStoreRemoveCachedMutationBatchMetadata(e, t) {\n __PRIVATE_debugCast(__PRIVATE_debugCast(e).mutationQueue).On(t);\n }\n // PORTING NOTE: Multi-Tab only.\n (i.localStore, t)) : fail(), await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(i, s)) : \n // A throttled tab may not have seen the mutation before it was completed\n // and removed from the mutation queue, in which case we won't have cached\n // the affected documents. In this case we can safely ignore the update\n // since that means we didn't apply the mutation locally at all (if we\n // had, we would have cached the affected documents), and so we will just\n // see any resulting document changes via normal remote document updates\n // as applicable.\n __PRIVATE_logDebug(\"SyncEngine\", \"Cannot apply mutation batch with id: \" + t);\n}\n\n/** Applies a query target change from a different tab. */\n// PORTING NOTE: Multi-Tab only.\nasync function __PRIVATE_syncEngineApplyPrimaryState(e, t) {\n const n = __PRIVATE_debugCast(e);\n if (__PRIVATE_ensureWatchCallbacks(n), __PRIVATE_syncEngineEnsureWriteCallbacks(n), \n !0 === t && !0 !== n.Qa) {\n // Secondary tabs only maintain Views for their local listeners and the\n // Views internal state may not be 100% populated (in particular\n // secondary tabs don't track syncedDocuments, the set of documents the\n // server considers to be in the target). So when a secondary becomes\n // primary, we need to need to make sure that all views for all targets\n // match the state on disk.\n const e = n.sharedClientState.getAllActiveQueryTargets(), t = await __PRIVATE_synchronizeQueryViewsAndRaiseSnapshots(n, e.toArray());\n n.Qa = !0, await __PRIVATE_remoteStoreApplyPrimaryState(n.remoteStore, !0);\n for (const e of t) __PRIVATE_remoteStoreListen(n.remoteStore, e);\n } else if (!1 === t && !1 !== n.Qa) {\n const e = [];\n let t = Promise.resolve();\n n.Ma.forEach(((r, i) => {\n n.sharedClientState.isLocalQueryTarget(i) ? e.push(i) : t = t.then((() => (__PRIVATE_removeAndCleanupTarget(n, i), \n __PRIVATE_localStoreReleaseTarget(n.localStore, i, \n /*keepPersistedTargetData=*/ !0)))), __PRIVATE_remoteStoreUnlisten(n.remoteStore, i);\n })), await t, await __PRIVATE_synchronizeQueryViewsAndRaiseSnapshots(n, e), \n // PORTING NOTE: Multi-Tab only.\n function __PRIVATE_resetLimboDocuments(e) {\n const t = __PRIVATE_debugCast(e);\n t.Na.forEach(((e, n) => {\n __PRIVATE_remoteStoreUnlisten(t.remoteStore, n);\n })), t.La.pr(), t.Na = new Map, t.Oa = new SortedMap(DocumentKey.comparator);\n }\n /**\n * Reconcile the query views of the provided query targets with the state from\n * persistence. Raises snapshots for any changes that affect the local\n * client and returns the updated state of all target's query data.\n *\n * @param syncEngine - The sync engine implementation\n * @param targets - the list of targets with views that need to be recomputed\n * @param transitionToPrimary - `true` iff the tab transitions from a secondary\n * tab to a primary tab\n */\n // PORTING NOTE: Multi-Tab only.\n (n), n.Qa = !1, await __PRIVATE_remoteStoreApplyPrimaryState(n.remoteStore, !1);\n }\n}\n\nasync function __PRIVATE_synchronizeQueryViewsAndRaiseSnapshots(e, t, n) {\n const r = __PRIVATE_debugCast(e), i = [], s = [];\n for (const e of t) {\n let t;\n const n = r.Ma.get(e);\n if (n && 0 !== n.length) {\n // For queries that have a local View, we fetch their current state\n // from LocalStore (as the resume token and the snapshot version\n // might have changed) and reconcile their views with the persisted\n // state (the list of syncedDocuments may have gotten out of sync).\n t = await __PRIVATE_localStoreAllocateTarget(r.localStore, __PRIVATE_queryToTarget(n[0]));\n for (const e of n) {\n const t = r.Fa.get(e), n = await __PRIVATE_synchronizeViewAndComputeSnapshot(r, t);\n n.snapshot && s.push(n.snapshot);\n }\n } else {\n // For queries that never executed on this client, we need to\n // allocate the target in LocalStore and initialize a new View.\n const n = await __PRIVATE_localStoreGetCachedTarget(r.localStore, e);\n t = await __PRIVATE_localStoreAllocateTarget(r.localStore, n), await __PRIVATE_initializeViewAndComputeSnapshot(r, __PRIVATE_synthesizeTargetToQuery(n), e, \n /*current=*/ !1, t.resumeToken);\n }\n i.push(t);\n }\n return r.Ca.d_(s), i;\n}\n\n/**\n * Creates a `Query` object from the specified `Target`. There is no way to\n * obtain the original `Query`, so we synthesize a `Query` from the `Target`\n * object.\n *\n * The synthesized result might be different from the original `Query`, but\n * since the synthesized `Query` should return the same results as the\n * original one (only the presentation of results might differ), the potential\n * difference will not cause issues.\n */\n// PORTING NOTE: Multi-Tab only.\nfunction __PRIVATE_synthesizeTargetToQuery(e) {\n return __PRIVATE_newQuery(e.path, e.collectionGroup, e.orderBy, e.filters, e.limit, \"F\" /* LimitType.First */ , e.startAt, e.endAt);\n}\n\n/** Returns the IDs of the clients that are currently active. */\n// PORTING NOTE: Multi-Tab only.\nfunction __PRIVATE_syncEngineGetActiveClients(e) {\n return function __PRIVATE_localStoreGetActiveClients(e) {\n return __PRIVATE_debugCast(__PRIVATE_debugCast(e).persistence).Qi();\n }(__PRIVATE_debugCast(e).localStore);\n}\n\n/** Applies a query target change from a different tab. */\n// PORTING NOTE: Multi-Tab only.\nasync function __PRIVATE_syncEngineApplyTargetState(e, t, n, r) {\n const i = __PRIVATE_debugCast(e);\n if (i.Qa) \n // If we receive a target state notification via WebStorage, we are\n // either already secondary or another tab has taken the primary lease.\n return void __PRIVATE_logDebug(\"SyncEngine\", \"Ignoring unexpected query state notification.\");\n const s = i.Ma.get(t);\n if (s && s.length > 0) switch (n) {\n case \"current\":\n case \"not-current\":\n {\n const e = await __PRIVATE_localStoreGetNewDocumentChanges(i.localStore, __PRIVATE_queryCollectionGroup(s[0])), r = RemoteEvent.createSynthesizedRemoteEventForCurrentChange(t, \"current\" === n, ByteString.EMPTY_BYTE_STRING);\n await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(i, e, r);\n break;\n }\n\n case \"rejected\":\n await __PRIVATE_localStoreReleaseTarget(i.localStore, t, \n /* keepPersistedTargetData */ !0), __PRIVATE_removeAndCleanupTarget(i, t, r);\n break;\n\n default:\n fail();\n }\n}\n\n/** Adds or removes Watch targets for queries from different tabs. */ async function __PRIVATE_syncEngineApplyActiveTargetsChange(e, t, n) {\n const r = __PRIVATE_ensureWatchCallbacks(e);\n if (r.Qa) {\n for (const e of t) {\n if (r.Ma.has(e) && r.sharedClientState.isActiveQueryTarget(e)) {\n __PRIVATE_logDebug(\"SyncEngine\", \"Adding an already active target \" + e);\n continue;\n }\n const t = await __PRIVATE_localStoreGetCachedTarget(r.localStore, e), n = await __PRIVATE_localStoreAllocateTarget(r.localStore, t);\n await __PRIVATE_initializeViewAndComputeSnapshot(r, __PRIVATE_synthesizeTargetToQuery(t), n.targetId, \n /*current=*/ !1, n.resumeToken), __PRIVATE_remoteStoreListen(r.remoteStore, n);\n }\n for (const e of n) \n // Check that the target is still active since the target might have been\n // removed if it has been rejected by the backend.\n r.Ma.has(e) && \n // Release queries that are still active.\n await __PRIVATE_localStoreReleaseTarget(r.localStore, e, \n /* keepPersistedTargetData */ !1).then((() => {\n __PRIVATE_remoteStoreUnlisten(r.remoteStore, e), __PRIVATE_removeAndCleanupTarget(r, e);\n })).catch(__PRIVATE_ignoreIfPrimaryLeaseLoss);\n }\n}\n\nfunction __PRIVATE_ensureWatchCallbacks(e) {\n const t = __PRIVATE_debugCast(e);\n return t.remoteStore.remoteSyncer.applyRemoteEvent = __PRIVATE_syncEngineApplyRemoteEvent.bind(null, t), \n t.remoteStore.remoteSyncer.getRemoteKeysForTarget = __PRIVATE_syncEngineGetRemoteKeysForTarget.bind(null, t), \n t.remoteStore.remoteSyncer.rejectListen = __PRIVATE_syncEngineRejectListen.bind(null, t), \n t.Ca.d_ = __PRIVATE_eventManagerOnWatchChange.bind(null, t.eventManager), t.Ca.$a = __PRIVATE_eventManagerOnWatchError.bind(null, t.eventManager), \n t;\n}\n\nfunction __PRIVATE_syncEngineEnsureWriteCallbacks(e) {\n const t = __PRIVATE_debugCast(e);\n return t.remoteStore.remoteSyncer.applySuccessfulWrite = __PRIVATE_syncEngineApplySuccessfulWrite.bind(null, t), \n t.remoteStore.remoteSyncer.rejectFailedWrite = __PRIVATE_syncEngineRejectFailedWrite.bind(null, t), \n t;\n}\n\n/**\n * Loads a Firestore bundle into the SDK. The returned promise resolves when\n * the bundle finished loading.\n *\n * @param syncEngine - SyncEngine to use.\n * @param bundleReader - Bundle to load into the SDK.\n * @param task - LoadBundleTask used to update the loading progress to public API.\n */ function __PRIVATE_syncEngineLoadBundle(e, t, n) {\n const r = __PRIVATE_debugCast(e);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n (\n /** Loads a bundle and returns the list of affected collection groups. */\n async function __PRIVATE_loadBundleImpl(e, t, n) {\n try {\n const r = await t.getMetadata();\n if (await function __PRIVATE_localStoreHasNewerBundle(e, t) {\n const n = __PRIVATE_debugCast(e), r = __PRIVATE_fromVersion(t.createTime);\n return n.persistence.runTransaction(\"hasNewerBundle\", \"readonly\", (e => n.Gr.getBundleMetadata(e, t.id))).then((e => !!e && e.createTime.compareTo(r) >= 0));\n }\n /**\n * Saves the given `BundleMetadata` to local persistence.\n */ (e.localStore, r)) return await t.close(), n._completeWith(function __PRIVATE_bundleSuccessProgress(e) {\n return {\n taskState: \"Success\",\n documentsLoaded: e.totalDocuments,\n bytesLoaded: e.totalBytes,\n totalDocuments: e.totalDocuments,\n totalBytes: e.totalBytes\n };\n }(r)), Promise.resolve(new Set);\n n._updateProgress(__PRIVATE_bundleInitialProgress(r));\n const i = new __PRIVATE_BundleLoader(r, e.localStore, t.serializer);\n let s = await t.Ua();\n for (;s; ) {\n const e = await i.la(s);\n e && n._updateProgress(e), s = await t.Ua();\n }\n const o = await i.complete();\n return await __PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore(e, o.Ia, \n /* remoteEvent */ void 0), \n // Save metadata, so loading the same bundle will skip.\n await function __PRIVATE_localStoreSaveBundle(e, t) {\n const n = __PRIVATE_debugCast(e);\n return n.persistence.runTransaction(\"Save bundle\", \"readwrite\", (e => n.Gr.saveBundleMetadata(e, t)));\n }\n /**\n * Returns a promise of a `NamedQuery` associated with given query name. Promise\n * resolves to undefined if no persisted data can be found.\n */ (e.localStore, r), n._completeWith(o.progress), Promise.resolve(o.Pa);\n } catch (e) {\n return __PRIVATE_logWarn(\"SyncEngine\", `Loading bundle failed with ${e}`), n._failWith(e), \n Promise.resolve(new Set);\n }\n }\n /**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /**\n * Provides all components needed for Firestore with in-memory persistence.\n * Uses EagerGC garbage collection.\n */)(r, t, n).then((e => {\n r.sharedClientState.notifyBundleLoaded(e);\n }));\n}\n\nclass __PRIVATE_MemoryOfflineComponentProvider {\n constructor() {\n this.kind = \"memory\", this.synchronizeTabs = !1;\n }\n async initialize(e) {\n this.serializer = __PRIVATE_newSerializer(e.databaseInfo.databaseId), this.sharedClientState = this.Wa(e), \n this.persistence = this.Ga(e), await this.persistence.start(), this.localStore = this.za(e), \n this.gcScheduler = this.ja(e, this.localStore), this.indexBackfillerScheduler = this.Ha(e, this.localStore);\n }\n ja(e, t) {\n return null;\n }\n Ha(e, t) {\n return null;\n }\n za(e) {\n return __PRIVATE_newLocalStore(this.persistence, new __PRIVATE_QueryEngine, e.initialUser, this.serializer);\n }\n Ga(e) {\n return new __PRIVATE_MemoryPersistence(__PRIVATE_MemoryEagerDelegate.Zr, this.serializer);\n }\n Wa(e) {\n return new __PRIVATE_MemorySharedClientState;\n }\n async terminate() {\n var e, t;\n null === (e = this.gcScheduler) || void 0 === e || e.stop(), null === (t = this.indexBackfillerScheduler) || void 0 === t || t.stop(), \n this.sharedClientState.shutdown(), await this.persistence.shutdown();\n }\n}\n\n__PRIVATE_MemoryOfflineComponentProvider.provider = {\n build: () => new __PRIVATE_MemoryOfflineComponentProvider\n};\n\nclass __PRIVATE_LruGcMemoryOfflineComponentProvider extends __PRIVATE_MemoryOfflineComponentProvider {\n constructor(e) {\n super(), this.cacheSizeBytes = e;\n }\n ja(e, t) {\n __PRIVATE_hardAssert(this.persistence.referenceDelegate instanceof __PRIVATE_MemoryLruDelegate);\n const n = this.persistence.referenceDelegate.garbageCollector;\n return new __PRIVATE_LruScheduler(n, e.asyncQueue, t);\n }\n Ga(e) {\n const t = void 0 !== this.cacheSizeBytes ? LruParams.withCacheSize(this.cacheSizeBytes) : LruParams.DEFAULT;\n return new __PRIVATE_MemoryPersistence((e => __PRIVATE_MemoryLruDelegate.Zr(e, t)), this.serializer);\n }\n}\n\n/**\n * Provides all components needed for Firestore with IndexedDB persistence.\n */ class __PRIVATE_IndexedDbOfflineComponentProvider extends __PRIVATE_MemoryOfflineComponentProvider {\n constructor(e, t, n) {\n super(), this.Ja = e, this.cacheSizeBytes = t, this.forceOwnership = n, this.kind = \"persistent\", \n this.synchronizeTabs = !1;\n }\n async initialize(e) {\n await super.initialize(e), await this.Ja.initialize(this, e), \n // Enqueue writes from a previous session\n await __PRIVATE_syncEngineEnsureWriteCallbacks(this.Ja.syncEngine), await __PRIVATE_fillWritePipeline(this.Ja.remoteStore), \n // NOTE: This will immediately call the listener, so we make sure to\n // set it after localStore / remoteStore are started.\n await this.persistence.yi((() => (this.gcScheduler && !this.gcScheduler.started && this.gcScheduler.start(), \n this.indexBackfillerScheduler && !this.indexBackfillerScheduler.started && this.indexBackfillerScheduler.start(), \n Promise.resolve())));\n }\n za(e) {\n return __PRIVATE_newLocalStore(this.persistence, new __PRIVATE_QueryEngine, e.initialUser, this.serializer);\n }\n ja(e, t) {\n const n = this.persistence.referenceDelegate.garbageCollector;\n return new __PRIVATE_LruScheduler(n, e.asyncQueue, t);\n }\n Ha(e, t) {\n const n = new __PRIVATE_IndexBackfiller(t, this.persistence);\n return new __PRIVATE_IndexBackfillerScheduler(e.asyncQueue, n);\n }\n Ga(e) {\n const t = __PRIVATE_indexedDbStoragePrefix(e.databaseInfo.databaseId, e.databaseInfo.persistenceKey), n = void 0 !== this.cacheSizeBytes ? LruParams.withCacheSize(this.cacheSizeBytes) : LruParams.DEFAULT;\n return new __PRIVATE_IndexedDbPersistence(this.synchronizeTabs, t, e.clientId, n, e.asyncQueue, __PRIVATE_getWindow(), getDocument(), this.serializer, this.sharedClientState, !!this.forceOwnership);\n }\n Wa(e) {\n return new __PRIVATE_MemorySharedClientState;\n }\n}\n\n/**\n * Provides all components needed for Firestore with multi-tab IndexedDB\n * persistence.\n *\n * In the legacy client, this provider is used to provide both multi-tab and\n * non-multi-tab persistence since we cannot tell at build time whether\n * `synchronizeTabs` will be enabled.\n */ class __PRIVATE_MultiTabOfflineComponentProvider extends __PRIVATE_IndexedDbOfflineComponentProvider {\n constructor(e, t) {\n super(e, t, /* forceOwnership= */ !1), this.Ja = e, this.cacheSizeBytes = t, this.synchronizeTabs = !0;\n }\n async initialize(e) {\n await super.initialize(e);\n const t = this.Ja.syncEngine;\n this.sharedClientState instanceof __PRIVATE_WebStorageSharedClientState && (this.sharedClientState.syncEngine = {\n no: __PRIVATE_syncEngineApplyBatchState.bind(null, t),\n ro: __PRIVATE_syncEngineApplyTargetState.bind(null, t),\n io: __PRIVATE_syncEngineApplyActiveTargetsChange.bind(null, t),\n Qi: __PRIVATE_syncEngineGetActiveClients.bind(null, t),\n eo: __PRIVATE_syncEngineSynchronizeWithChangedDocuments.bind(null, t)\n }, await this.sharedClientState.start()), \n // NOTE: This will immediately call the listener, so we make sure to\n // set it after localStore / remoteStore are started.\n await this.persistence.yi((async e => {\n await __PRIVATE_syncEngineApplyPrimaryState(this.Ja.syncEngine, e), this.gcScheduler && (e && !this.gcScheduler.started ? this.gcScheduler.start() : e || this.gcScheduler.stop()), \n this.indexBackfillerScheduler && (e && !this.indexBackfillerScheduler.started ? this.indexBackfillerScheduler.start() : e || this.indexBackfillerScheduler.stop());\n }));\n }\n Wa(e) {\n const t = __PRIVATE_getWindow();\n if (!__PRIVATE_WebStorageSharedClientState.D(t)) throw new FirestoreError(D.UNIMPLEMENTED, \"IndexedDB persistence is only available on platforms that support LocalStorage.\");\n const n = __PRIVATE_indexedDbStoragePrefix(e.databaseInfo.databaseId, e.databaseInfo.persistenceKey);\n return new __PRIVATE_WebStorageSharedClientState(t, e.asyncQueue, n, e.clientId, e.initialUser);\n }\n}\n\n/**\n * Initializes and wires the components that are needed to interface with the\n * network.\n */ class OnlineComponentProvider {\n async initialize(e, t) {\n this.localStore || (this.localStore = e.localStore, this.sharedClientState = e.sharedClientState, \n this.datastore = this.createDatastore(t), this.remoteStore = this.createRemoteStore(t), \n this.eventManager = this.createEventManager(t), this.syncEngine = this.createSyncEngine(t, \n /* startAsPrimary=*/ !e.synchronizeTabs), this.sharedClientState.onlineStateHandler = e => __PRIVATE_syncEngineApplyOnlineStateChange(this.syncEngine, e, 1 /* OnlineStateSource.SharedClientState */), \n this.remoteStore.remoteSyncer.handleCredentialChange = __PRIVATE_syncEngineHandleCredentialChange.bind(null, this.syncEngine), \n await __PRIVATE_remoteStoreApplyPrimaryState(this.remoteStore, this.syncEngine.isPrimaryClient));\n }\n createEventManager(e) {\n return function __PRIVATE_newEventManager() {\n return new __PRIVATE_EventManagerImpl;\n }();\n }\n createDatastore(e) {\n const t = __PRIVATE_newSerializer(e.databaseInfo.databaseId), n = function __PRIVATE_newConnection(e) {\n return new __PRIVATE_WebChannelConnection(e);\n }\n /** Return the Platform-specific connectivity monitor. */ (e.databaseInfo);\n return function __PRIVATE_newDatastore(e, t, n, r) {\n return new __PRIVATE_DatastoreImpl(e, t, n, r);\n }(e.authCredentials, e.appCheckCredentials, n, t);\n }\n createRemoteStore(e) {\n return function __PRIVATE_newRemoteStore(e, t, n, r, i) {\n return new __PRIVATE_RemoteStoreImpl(e, t, n, r, i);\n }\n /** Re-enables the network. Idempotent. */ (this.localStore, this.datastore, e.asyncQueue, (e => __PRIVATE_syncEngineApplyOnlineStateChange(this.syncEngine, e, 0 /* OnlineStateSource.RemoteStore */)), function __PRIVATE_newConnectivityMonitor() {\n return __PRIVATE_BrowserConnectivityMonitor.D() ? new __PRIVATE_BrowserConnectivityMonitor : new __PRIVATE_NoopConnectivityMonitor;\n }());\n }\n createSyncEngine(e, t) {\n return function __PRIVATE_newSyncEngine(e, t, n, \n // PORTING NOTE: Manages state synchronization in multi-tab environments.\n r, i, s, o) {\n const _ = new __PRIVATE_SyncEngineImpl(e, t, n, r, i, s);\n return o && (_.Qa = !0), _;\n }(this.localStore, this.remoteStore, this.eventManager, this.sharedClientState, e.initialUser, e.maxConcurrentLimboResolutions, t);\n }\n async terminate() {\n var e, t;\n await async function __PRIVATE_remoteStoreShutdown(e) {\n const t = __PRIVATE_debugCast(e);\n __PRIVATE_logDebug(\"RemoteStore\", \"RemoteStore shutting down.\"), t.L_.add(5 /* OfflineCause.Shutdown */), \n await __PRIVATE_disableNetworkInternal(t), t.k_.shutdown(), \n // Set the OnlineState to Unknown (rather than Offline) to avoid potentially\n // triggering spurious listener events with cached data, etc.\n t.q_.set(\"Unknown\" /* OnlineState.Unknown */);\n }(this.remoteStore), null === (e = this.datastore) || void 0 === e || e.terminate(), \n null === (t = this.eventManager) || void 0 === t || t.terminate();\n }\n}\n\nOnlineComponentProvider.provider = {\n build: () => new OnlineComponentProvider\n};\n\n/**\n * Builds a `ByteStreamReader` from a UInt8Array.\n * @param source - The data source to use.\n * @param bytesPerRead - How many bytes each `read()` from the returned reader\n * will read.\n */\nfunction __PRIVATE_toByteStreamReaderHelper(e, t = 10240) {\n let n = 0;\n // The TypeScript definition for ReadableStreamReader changed. We use\n // `any` here to allow this code to compile with different versions.\n // See https://github.com/microsoft/TypeScript/issues/42970\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async read() {\n if (n < e.byteLength) {\n const r = {\n value: e.slice(n, n + t),\n done: !1\n };\n return n += t, r;\n }\n return {\n done: !0\n };\n },\n async cancel() {},\n releaseLock() {},\n closed: Promise.resolve()\n };\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * On web, a `ReadableStream` is wrapped around by a `ByteStreamReader`.\n */\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/*\n * A wrapper implementation of Observer that will dispatch events\n * asynchronously. To allow immediate silencing, a mute call is added which\n * causes events scheduled to no longer be raised.\n */\nclass __PRIVATE_AsyncObserver {\n constructor(e) {\n this.observer = e, \n /**\n * When set to true, will not raise future events. Necessary to deal with\n * async detachment of listener.\n */\n this.muted = !1;\n }\n next(e) {\n this.muted || this.observer.next && this.Ya(this.observer.next, e);\n }\n error(e) {\n this.muted || (this.observer.error ? this.Ya(this.observer.error, e) : __PRIVATE_logError(\"Uncaught Error in snapshot listener:\", e.toString()));\n }\n Za() {\n this.muted = !0;\n }\n Ya(e, t) {\n setTimeout((() => {\n this.muted || e(t);\n }), 0);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A class representing a bundle.\n *\n * Takes a bundle stream or buffer, and presents abstractions to read bundled\n * elements out of the underlying content.\n */ class __PRIVATE_BundleReaderImpl {\n constructor(\n /** The reader to read from underlying binary bundle data source. */\n e, t) {\n this.Xa = e, this.serializer = t, \n /** Cached bundle metadata. */\n this.metadata = new __PRIVATE_Deferred, \n /**\n * Internal buffer to hold bundle content, accumulating incomplete element\n * content.\n */\n this.buffer = new Uint8Array, this.eu = function __PRIVATE_newTextDecoder() {\n return new TextDecoder(\"utf-8\");\n }(), \n // Read the metadata (which is the first element).\n this.tu().then((e => {\n e && e.ua() ? this.metadata.resolve(e.aa.metadata) : this.metadata.reject(new Error(`The first element of the bundle is not a metadata, it is\\n ${JSON.stringify(null == e ? void 0 : e.aa)}`));\n }), (e => this.metadata.reject(e)));\n }\n close() {\n return this.Xa.cancel();\n }\n async getMetadata() {\n return this.metadata.promise;\n }\n async Ua() {\n // Makes sure metadata is read before proceeding.\n return await this.getMetadata(), this.tu();\n }\n /**\n * Reads from the head of internal buffer, and pulling more data from\n * underlying stream if a complete element cannot be found, until an\n * element(including the prefixed length and the JSON string) is found.\n *\n * Once a complete element is read, it is dropped from internal buffer.\n *\n * Returns either the bundled element, or null if we have reached the end of\n * the stream.\n */ async tu() {\n const e = await this.nu();\n if (null === e) return null;\n const t = this.eu.decode(e), n = Number(t);\n isNaN(n) && this.ru(`length string (${t}) is not valid number`);\n const r = await this.iu(n);\n return new __PRIVATE_SizedBundleElement(JSON.parse(r), e.length + n);\n }\n /** First index of '{' from the underlying buffer. */ su() {\n return this.buffer.findIndex((e => e === \"{\".charCodeAt(0)));\n }\n /**\n * Reads from the beginning of the internal buffer, until the first '{', and\n * return the content.\n *\n * If reached end of the stream, returns a null.\n */ async nu() {\n for (;this.su() < 0; ) {\n if (await this.ou()) break;\n }\n // Broke out of the loop because underlying stream is closed, and there\n // happens to be no more data to process.\n if (0 === this.buffer.length) return null;\n const e = this.su();\n // Broke out of the loop because underlying stream is closed, but still\n // cannot find an open bracket.\n e < 0 && this.ru(\"Reached the end of bundle when a length string is expected.\");\n const t = this.buffer.slice(0, e);\n // Update the internal buffer to drop the read length.\n return this.buffer = this.buffer.slice(e), t;\n }\n /**\n * Reads from a specified position from the internal buffer, for a specified\n * number of bytes, pulling more data from the underlying stream if needed.\n *\n * Returns a string decoded from the read bytes.\n */ async iu(e) {\n for (;this.buffer.length < e; ) {\n await this.ou() && this.ru(\"Reached the end of bundle when more is expected.\");\n }\n const t = this.eu.decode(this.buffer.slice(0, e));\n // Update the internal buffer to drop the read json string.\n return this.buffer = this.buffer.slice(e), t;\n }\n ru(e) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n throw this.Xa.cancel(), new Error(`Invalid bundle format: ${e}`);\n }\n /**\n * Pulls more data from underlying stream to internal buffer.\n * Returns a boolean indicating whether the stream is finished.\n */ async ou() {\n const e = await this.Xa.read();\n if (!e.done) {\n const t = new Uint8Array(this.buffer.length + e.value.length);\n t.set(this.buffer), t.set(e.value, this.buffer.length), this.buffer = t;\n }\n return e.done;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Internal transaction object responsible for accumulating the mutations to\n * perform and the base versions for any documents read.\n */\nclass Transaction$2 {\n constructor(e) {\n this.datastore = e, \n // The version of each document that was read during this transaction.\n this.readVersions = new Map, this.mutations = [], this.committed = !1, \n /**\n * A deferred usage error that occurred previously in this transaction that\n * will cause the transaction to fail once it actually commits.\n */\n this.lastTransactionError = null, \n /**\n * Set of documents that have been written in the transaction.\n *\n * When there's more than one write to the same key in a transaction, any\n * writes after the first are handled differently.\n */\n this.writtenDocs = new Set;\n }\n async lookup(e) {\n if (this.ensureCommitNotCalled(), this.mutations.length > 0) throw this.lastTransactionError = new FirestoreError(D.INVALID_ARGUMENT, \"Firestore transactions require all reads to be executed before all writes.\"), \n this.lastTransactionError;\n const t = await async function __PRIVATE_invokeBatchGetDocumentsRpc(e, t) {\n const n = __PRIVATE_debugCast(e), r = {\n documents: t.map((e => __PRIVATE_toName(n.serializer, e)))\n }, i = await n.Lo(\"BatchGetDocuments\", n.serializer.databaseId, ResourcePath.emptyPath(), r, t.length), s = new Map;\n i.forEach((e => {\n const t = __PRIVATE_fromBatchGetDocumentsResponse(n.serializer, e);\n s.set(t.key.toString(), t);\n }));\n const o = [];\n return t.forEach((e => {\n const t = s.get(e.toString());\n __PRIVATE_hardAssert(!!t), o.push(t);\n })), o;\n }(this.datastore, e);\n return t.forEach((e => this.recordVersion(e))), t;\n }\n set(e, t) {\n this.write(t.toMutation(e, this.precondition(e))), this.writtenDocs.add(e.toString());\n }\n update(e, t) {\n try {\n this.write(t.toMutation(e, this.preconditionForUpdate(e)));\n } catch (e) {\n this.lastTransactionError = e;\n }\n this.writtenDocs.add(e.toString());\n }\n delete(e) {\n this.write(new __PRIVATE_DeleteMutation(e, this.precondition(e))), this.writtenDocs.add(e.toString());\n }\n async commit() {\n if (this.ensureCommitNotCalled(), this.lastTransactionError) throw this.lastTransactionError;\n const e = this.readVersions;\n // For each mutation, note that the doc was written.\n this.mutations.forEach((t => {\n e.delete(t.key.toString());\n })), \n // For each document that was read but not written to, we want to perform\n // a `verify` operation.\n e.forEach(((e, t) => {\n const n = DocumentKey.fromPath(t);\n this.mutations.push(new __PRIVATE_VerifyMutation(n, this.precondition(n)));\n })), await async function __PRIVATE_invokeCommitRpc(e, t) {\n const n = __PRIVATE_debugCast(e), r = {\n writes: t.map((e => toMutation(n.serializer, e)))\n };\n await n.Mo(\"Commit\", n.serializer.databaseId, ResourcePath.emptyPath(), r);\n }(this.datastore, this.mutations), this.committed = !0;\n }\n recordVersion(e) {\n let t;\n if (e.isFoundDocument()) t = e.version; else {\n if (!e.isNoDocument()) throw fail();\n // Represent a deleted doc using SnapshotVersion.min().\n t = SnapshotVersion.min();\n }\n const n = this.readVersions.get(e.key.toString());\n if (n) {\n if (!t.isEqual(n)) \n // This transaction will fail no matter what.\n throw new FirestoreError(D.ABORTED, \"Document version changed between two reads.\");\n } else this.readVersions.set(e.key.toString(), t);\n }\n /**\n * Returns the version of this document when it was read in this transaction,\n * as a precondition, or no precondition if it was not read.\n */ precondition(e) {\n const t = this.readVersions.get(e.toString());\n return !this.writtenDocs.has(e.toString()) && t ? t.isEqual(SnapshotVersion.min()) ? Precondition.exists(!1) : Precondition.updateTime(t) : Precondition.none();\n }\n /**\n * Returns the precondition for a document if the operation is an update.\n */ preconditionForUpdate(e) {\n const t = this.readVersions.get(e.toString());\n // The first time a document is written, we want to take into account the\n // read time and existence\n if (!this.writtenDocs.has(e.toString()) && t) {\n if (t.isEqual(SnapshotVersion.min())) \n // The document doesn't exist, so fail the transaction.\n // This has to be validated locally because you can't send a\n // precondition that a document does not exist without changing the\n // semantics of the backend write to be an insert. This is the reverse\n // of what we want, since we want to assert that the document doesn't\n // exist but then send the update and have it fail. Since we can't\n // express that to the backend, we have to validate locally.\n // Note: this can change once we can send separate verify writes in the\n // transaction.\n throw new FirestoreError(D.INVALID_ARGUMENT, \"Can't update a document that doesn't exist.\");\n // Document exists, base precondition on document update time.\n return Precondition.updateTime(t);\n }\n // Document was not read, so we just use the preconditions for a blind\n // update.\n return Precondition.exists(!0);\n }\n write(e) {\n this.ensureCommitNotCalled(), this.mutations.push(e);\n }\n ensureCommitNotCalled() {}\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * TransactionRunner encapsulates the logic needed to run and retry transactions\n * with backoff.\n */ class __PRIVATE_TransactionRunner {\n constructor(e, t, n, r, i) {\n this.asyncQueue = e, this.datastore = t, this.options = n, this.updateFunction = r, \n this.deferred = i, this._u = n.maxAttempts, this.t_ = new __PRIVATE_ExponentialBackoff(this.asyncQueue, \"transaction_retry\" /* TimerId.TransactionRetry */);\n }\n /** Runs the transaction and sets the result on deferred. */ au() {\n this._u -= 1, this.uu();\n }\n uu() {\n this.t_.Go((async () => {\n const e = new Transaction$2(this.datastore), t = this.cu(e);\n t && t.then((t => {\n this.asyncQueue.enqueueAndForget((() => e.commit().then((() => {\n this.deferred.resolve(t);\n })).catch((e => {\n this.lu(e);\n }))));\n })).catch((e => {\n this.lu(e);\n }));\n }));\n }\n cu(e) {\n try {\n const t = this.updateFunction(e);\n return !__PRIVATE_isNullOrUndefined(t) && t.catch && t.then ? t : (this.deferred.reject(Error(\"Transaction callback must return a Promise\")), \n null);\n } catch (e) {\n // Do not retry errors thrown by user provided updateFunction.\n return this.deferred.reject(e), null;\n }\n }\n lu(e) {\n this._u > 0 && this.hu(e) ? (this._u -= 1, this.asyncQueue.enqueueAndForget((() => (this.uu(), \n Promise.resolve())))) : this.deferred.reject(e);\n }\n hu(e) {\n if (\"FirebaseError\" === e.name) {\n // In transactions, the backend will fail outdated reads with FAILED_PRECONDITION and\n // non-matching document versions with ABORTED. These errors should be retried.\n const t = e.code;\n return \"aborted\" === t || \"failed-precondition\" === t || \"already-exists\" === t || !__PRIVATE_isPermanentError(t);\n }\n return !1;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * FirestoreClient is a top-level class that constructs and owns all of the //\n * pieces of the client SDK architecture. It is responsible for creating the //\n * async queue that is shared by all of the other components in the system. //\n */\nclass FirestoreClient {\n constructor(e, t, \n /**\n * Asynchronous queue responsible for all of our internal processing. When\n * we get incoming work from the user (via public API) or the network\n * (incoming GRPC messages), we should always schedule onto this queue.\n * This ensures all of our work is properly serialized (e.g. we don't\n * start processing a new operation while the previous one is waiting for\n * an async I/O to complete).\n */\n n, r, i) {\n this.authCredentials = e, this.appCheckCredentials = t, this.asyncQueue = n, this.databaseInfo = r, \n this.user = User.UNAUTHENTICATED, this.clientId = __PRIVATE_AutoId.newId(), this.authCredentialListener = () => Promise.resolve(), \n this.appCheckCredentialListener = () => Promise.resolve(), this._uninitializedComponentsProvider = i, \n this.authCredentials.start(n, (async e => {\n __PRIVATE_logDebug(\"FirestoreClient\", \"Received user=\", e.uid), await this.authCredentialListener(e), \n this.user = e;\n })), this.appCheckCredentials.start(n, (e => (__PRIVATE_logDebug(\"FirestoreClient\", \"Received new app check token=\", e), \n this.appCheckCredentialListener(e, this.user))));\n }\n get configuration() {\n return {\n asyncQueue: this.asyncQueue,\n databaseInfo: this.databaseInfo,\n clientId: this.clientId,\n authCredentials: this.authCredentials,\n appCheckCredentials: this.appCheckCredentials,\n initialUser: this.user,\n maxConcurrentLimboResolutions: 100\n };\n }\n setCredentialChangeListener(e) {\n this.authCredentialListener = e;\n }\n setAppCheckTokenChangeListener(e) {\n this.appCheckCredentialListener = e;\n }\n terminate() {\n this.asyncQueue.enterRestrictedMode();\n const e = new __PRIVATE_Deferred;\n return this.asyncQueue.enqueueAndForgetEvenWhileRestricted((async () => {\n try {\n this._onlineComponents && await this._onlineComponents.terminate(), this._offlineComponents && await this._offlineComponents.terminate(), \n // The credentials provider must be terminated after shutting down the\n // RemoteStore as it will prevent the RemoteStore from retrieving auth\n // tokens.\n this.authCredentials.shutdown(), this.appCheckCredentials.shutdown(), e.resolve();\n } catch (t) {\n const n = __PRIVATE_wrapInUserErrorIfRecoverable(t, \"Failed to shutdown persistence\");\n e.reject(n);\n }\n })), e.promise;\n }\n}\n\nasync function __PRIVATE_setOfflineComponentProvider(e, t) {\n e.asyncQueue.verifyOperationInProgress(), __PRIVATE_logDebug(\"FirestoreClient\", \"Initializing OfflineComponentProvider\");\n const n = e.configuration;\n await t.initialize(n);\n let r = n.initialUser;\n e.setCredentialChangeListener((async e => {\n r.isEqual(e) || (await __PRIVATE_localStoreHandleUserChange(t.localStore, e), r = e);\n })), \n // When a user calls clearPersistence() in one client, all other clients\n // need to be terminated to allow the delete to succeed.\n t.persistence.setDatabaseDeletedListener((() => e.terminate())), e._offlineComponents = t;\n}\n\nasync function __PRIVATE_setOnlineComponentProvider(e, t) {\n e.asyncQueue.verifyOperationInProgress();\n const n = await __PRIVATE_ensureOfflineComponents(e);\n __PRIVATE_logDebug(\"FirestoreClient\", \"Initializing OnlineComponentProvider\"), await t.initialize(n, e.configuration), \n // The CredentialChangeListener of the online component provider takes\n // precedence over the offline component provider.\n e.setCredentialChangeListener((e => __PRIVATE_remoteStoreHandleCredentialChange(t.remoteStore, e))), \n e.setAppCheckTokenChangeListener(((e, n) => __PRIVATE_remoteStoreHandleCredentialChange(t.remoteStore, n))), \n e._onlineComponents = t;\n}\n\n/**\n * Decides whether the provided error allows us to gracefully disable\n * persistence (as opposed to crashing the client).\n */ async function __PRIVATE_ensureOfflineComponents(e) {\n if (!e._offlineComponents) if (e._uninitializedComponentsProvider) {\n __PRIVATE_logDebug(\"FirestoreClient\", \"Using user provided OfflineComponentProvider\");\n try {\n await __PRIVATE_setOfflineComponentProvider(e, e._uninitializedComponentsProvider._offline);\n } catch (t) {\n const n = t;\n if (!function __PRIVATE_canFallbackFromIndexedDbError(e) {\n return \"FirebaseError\" === e.name ? e.code === D.FAILED_PRECONDITION || e.code === D.UNIMPLEMENTED : !(\"undefined\" != typeof DOMException && e instanceof DOMException) || \n // When the browser is out of quota we could get either quota exceeded\n // or an aborted error depending on whether the error happened during\n // schema migration.\n 22 === e.code || 20 === e.code || \n // Firefox Private Browsing mode disables IndexedDb and returns\n // INVALID_STATE for any usage.\n 11 === e.code;\n }(n)) throw n;\n __PRIVATE_logWarn(\"Error using user provided cache. Falling back to memory cache: \" + n), \n await __PRIVATE_setOfflineComponentProvider(e, new __PRIVATE_MemoryOfflineComponentProvider);\n }\n } else __PRIVATE_logDebug(\"FirestoreClient\", \"Using default OfflineComponentProvider\"), \n await __PRIVATE_setOfflineComponentProvider(e, new __PRIVATE_MemoryOfflineComponentProvider);\n return e._offlineComponents;\n}\n\nasync function __PRIVATE_ensureOnlineComponents(e) {\n return e._onlineComponents || (e._uninitializedComponentsProvider ? (__PRIVATE_logDebug(\"FirestoreClient\", \"Using user provided OnlineComponentProvider\"), \n await __PRIVATE_setOnlineComponentProvider(e, e._uninitializedComponentsProvider._online)) : (__PRIVATE_logDebug(\"FirestoreClient\", \"Using default OnlineComponentProvider\"), \n await __PRIVATE_setOnlineComponentProvider(e, new OnlineComponentProvider))), e._onlineComponents;\n}\n\nfunction __PRIVATE_getPersistence(e) {\n return __PRIVATE_ensureOfflineComponents(e).then((e => e.persistence));\n}\n\nfunction __PRIVATE_getLocalStore(e) {\n return __PRIVATE_ensureOfflineComponents(e).then((e => e.localStore));\n}\n\nfunction __PRIVATE_getRemoteStore(e) {\n return __PRIVATE_ensureOnlineComponents(e).then((e => e.remoteStore));\n}\n\nfunction __PRIVATE_getSyncEngine(e) {\n return __PRIVATE_ensureOnlineComponents(e).then((e => e.syncEngine));\n}\n\nfunction __PRIVATE_getDatastore(e) {\n return __PRIVATE_ensureOnlineComponents(e).then((e => e.datastore));\n}\n\nasync function __PRIVATE_getEventManager(e) {\n const t = await __PRIVATE_ensureOnlineComponents(e), n = t.eventManager;\n return n.onListen = __PRIVATE_syncEngineListen.bind(null, t.syncEngine), n.onUnlisten = __PRIVATE_syncEngineUnlisten.bind(null, t.syncEngine), \n n.onFirstRemoteStoreListen = __PRIVATE_triggerRemoteStoreListen.bind(null, t.syncEngine), \n n.onLastRemoteStoreUnlisten = __PRIVATE_triggerRemoteStoreUnlisten.bind(null, t.syncEngine), \n n;\n}\n\n/** Enables the network connection and re-enqueues all pending operations. */ function __PRIVATE_firestoreClientEnableNetwork(e) {\n return e.asyncQueue.enqueue((async () => {\n const t = await __PRIVATE_getPersistence(e), n = await __PRIVATE_getRemoteStore(e);\n return t.setNetworkEnabled(!0), function __PRIVATE_remoteStoreEnableNetwork(e) {\n const t = __PRIVATE_debugCast(e);\n return t.L_.delete(0 /* OfflineCause.UserDisabled */), __PRIVATE_enableNetworkInternal(t);\n }(n);\n }));\n}\n\n/** Disables the network connection. Pending operations will not complete. */ function __PRIVATE_firestoreClientDisableNetwork(e) {\n return e.asyncQueue.enqueue((async () => {\n const t = await __PRIVATE_getPersistence(e), n = await __PRIVATE_getRemoteStore(e);\n return t.setNetworkEnabled(!1), async function __PRIVATE_remoteStoreDisableNetwork(e) {\n const t = __PRIVATE_debugCast(e);\n t.L_.add(0 /* OfflineCause.UserDisabled */), await __PRIVATE_disableNetworkInternal(t), \n // Set the OnlineState to Offline so get()s return from cache, etc.\n t.q_.set(\"Offline\" /* OnlineState.Offline */);\n }(n);\n }));\n}\n\n/**\n * Returns a Promise that resolves when all writes that were pending at the time\n * this method was called received server acknowledgement. An acknowledgement\n * can be either acceptance or rejection.\n */ function __PRIVATE_firestoreClientGetDocumentFromLocalCache(e, t) {\n const n = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => async function __PRIVATE_readDocumentFromCache(e, t, n) {\n try {\n const r = await function __PRIVATE_localStoreReadDocument(e, t) {\n const n = __PRIVATE_debugCast(e);\n return n.persistence.runTransaction(\"read document\", \"readonly\", (e => n.localDocuments.getDocument(e, t)));\n }(e, t);\n r.isFoundDocument() ? n.resolve(r) : r.isNoDocument() ? n.resolve(null) : n.reject(new FirestoreError(D.UNAVAILABLE, \"Failed to get document from cache. (However, this document may exist on the server. Run again without setting 'source' in the GetOptions to attempt to retrieve the document from the server.)\"));\n } catch (e) {\n const r = __PRIVATE_wrapInUserErrorIfRecoverable(e, `Failed to get document '${t} from cache`);\n n.reject(r);\n }\n }\n /**\n * Retrieves a latency-compensated document from the backend via a\n * SnapshotListener.\n */ (await __PRIVATE_getLocalStore(e), t, n))), n.promise;\n}\n\nfunction __PRIVATE_firestoreClientGetDocumentViaSnapshotListener(e, t, n = {}) {\n const r = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => function __PRIVATE_readDocumentViaSnapshotListener(e, t, n, r, i) {\n const s = new __PRIVATE_AsyncObserver({\n next: _ => {\n // Mute and remove query first before passing event to user to avoid\n // user actions affecting the now stale query.\n s.Za(), t.enqueueAndForget((() => __PRIVATE_eventManagerUnlisten(e, o)));\n const a = _.docs.has(n);\n !a && _.fromCache ? \n // TODO(dimond): If we're online and the document doesn't\n // exist then we resolve with a doc.exists set to false. If\n // we're offline however, we reject the Promise in this\n // case. Two options: 1) Cache the negative response from\n // the server so we can deliver that even when you're\n // offline 2) Actually reject the Promise in the online case\n // if the document doesn't exist.\n i.reject(new FirestoreError(D.UNAVAILABLE, \"Failed to get document because the client is offline.\")) : a && _.fromCache && r && \"server\" === r.source ? i.reject(new FirestoreError(D.UNAVAILABLE, 'Failed to get document from server. (However, this document does exist in the local cache. Run again without setting source to \"server\" to retrieve the cached document.)')) : i.resolve(_);\n },\n error: e => i.reject(e)\n }), o = new __PRIVATE_QueryListener(__PRIVATE_newQueryForPath(n.path), s, {\n includeMetadataChanges: !0,\n _a: !0\n });\n return __PRIVATE_eventManagerListen(e, o);\n }(await __PRIVATE_getEventManager(e), e.asyncQueue, t, n, r))), r.promise;\n}\n\nfunction __PRIVATE_firestoreClientGetDocumentsFromLocalCache(e, t) {\n const n = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => async function __PRIVATE_executeQueryFromCache(e, t, n) {\n try {\n const r = await __PRIVATE_localStoreExecuteQuery(e, t, \n /* usePreviousResults= */ !0), i = new __PRIVATE_View(t, r.Ts), s = i.ma(r.documents), o = i.applyChanges(s, \n /* limboResolutionEnabled= */ !1);\n n.resolve(o.snapshot);\n } catch (e) {\n const r = __PRIVATE_wrapInUserErrorIfRecoverable(e, `Failed to execute query '${t} against cache`);\n n.reject(r);\n }\n }\n /**\n * Retrieves a latency-compensated query snapshot from the backend via a\n * SnapshotListener.\n */ (await __PRIVATE_getLocalStore(e), t, n))), n.promise;\n}\n\nfunction __PRIVATE_firestoreClientGetDocumentsViaSnapshotListener(e, t, n = {}) {\n const r = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => function __PRIVATE_executeQueryViaSnapshotListener(e, t, n, r, i) {\n const s = new __PRIVATE_AsyncObserver({\n next: n => {\n // Mute and remove query first before passing event to user to avoid\n // user actions affecting the now stale query.\n s.Za(), t.enqueueAndForget((() => __PRIVATE_eventManagerUnlisten(e, o))), n.fromCache && \"server\" === r.source ? i.reject(new FirestoreError(D.UNAVAILABLE, 'Failed to get documents from server. (However, these documents may exist in the local cache. Run again without setting source to \"server\" to retrieve the cached documents.)')) : i.resolve(n);\n },\n error: e => i.reject(e)\n }), o = new __PRIVATE_QueryListener(n, s, {\n includeMetadataChanges: !0,\n _a: !0\n });\n return __PRIVATE_eventManagerListen(e, o);\n }(await __PRIVATE_getEventManager(e), e.asyncQueue, t, n, r))), r.promise;\n}\n\nfunction __PRIVATE_firestoreClientRunAggregateQuery(e, t, n) {\n const r = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => {\n // Implement and call executeAggregateQueryViaSnapshotListener, similar\n // to the implementation in firestoreClientGetDocumentsViaSnapshotListener\n // above\n try {\n // TODO(b/277628384): check `canUseNetwork()` and handle multi-tab.\n const i = await __PRIVATE_getDatastore(e);\n r.resolve(async function __PRIVATE_invokeRunAggregationQueryRpc(e, t, n) {\n var r;\n const i = __PRIVATE_debugCast(e), {request: s, ut: o, parent: _} = __PRIVATE_toRunAggregationQueryRequest(i.serializer, __PRIVATE_queryToAggregateTarget(t), n);\n i.connection.Fo || delete s.parent;\n const a = (await i.Lo(\"RunAggregationQuery\", i.serializer.databaseId, _, s, \n /*expectedResponseCount=*/ 1)).filter((e => !!e.result));\n // Omit RunAggregationQueryResponse that only contain readTimes.\n __PRIVATE_hardAssert(1 === a.length);\n // Remap the short-form aliases that were sent to the server\n // to the client-side aliases. Users will access the results\n // using the client-side alias.\n const u = null === (r = a[0].result) || void 0 === r ? void 0 : r.aggregateFields;\n return Object.keys(u).reduce(((e, t) => (e[o[t]] = u[t], e)), {});\n }(i, t, n));\n } catch (e) {\n r.reject(e);\n }\n })), r.promise;\n}\n\nfunction __PRIVATE_firestoreClientAddSnapshotsInSyncListener(e, t) {\n const n = new __PRIVATE_AsyncObserver(t);\n return e.asyncQueue.enqueueAndForget((async () => function __PRIVATE_addSnapshotsInSyncListener(e, t) {\n __PRIVATE_debugCast(e).Y_.add(t), \n // Immediately fire an initial event, indicating all existing listeners\n // are in-sync.\n t.next();\n }(await __PRIVATE_getEventManager(e), n))), () => {\n n.Za(), e.asyncQueue.enqueueAndForget((async () => function __PRIVATE_removeSnapshotsInSyncListener(e, t) {\n __PRIVATE_debugCast(e).Y_.delete(t);\n }(await __PRIVATE_getEventManager(e), n)));\n };\n}\n\n/**\n * Takes an updateFunction in which a set of reads and writes can be performed\n * atomically. In the updateFunction, the client can read and write values\n * using the supplied transaction object. After the updateFunction, all\n * changes will be committed. If a retryable error occurs (ex: some other\n * client has changed any of the data referenced), then the updateFunction\n * will be called again after a backoff. If the updateFunction still fails\n * after all retries, then the transaction will be rejected.\n *\n * The transaction object passed to the updateFunction contains methods for\n * accessing documents and collections. Unlike other datastore access, data\n * accessed with the transaction will not reflect local changes that have not\n * been committed. For this reason, it is required that all reads are\n * performed before any writes. Transactions must be performed while online.\n */ function __PRIVATE_firestoreClientLoadBundle(e, t, n, r) {\n const i = function __PRIVATE_createBundleReader(e, t) {\n let n;\n n = \"string\" == typeof e ? __PRIVATE_newTextEncoder().encode(e) : e;\n return function __PRIVATE_newBundleReader(e, t) {\n return new __PRIVATE_BundleReaderImpl(e, t);\n }(function __PRIVATE_toByteStreamReader(e, t) {\n if (e instanceof Uint8Array) return __PRIVATE_toByteStreamReaderHelper(e, t);\n if (e instanceof ArrayBuffer) return __PRIVATE_toByteStreamReaderHelper(new Uint8Array(e), t);\n if (e instanceof ReadableStream) return e.getReader();\n throw new Error(\"Source of `toByteStreamReader` has to be a ArrayBuffer or ReadableStream\");\n }(n), t);\n }(n, __PRIVATE_newSerializer(t));\n e.asyncQueue.enqueueAndForget((async () => {\n __PRIVATE_syncEngineLoadBundle(await __PRIVATE_getSyncEngine(e), i, r);\n }));\n}\n\nfunction __PRIVATE_firestoreClientGetNamedQuery(e, t) {\n return e.asyncQueue.enqueue((async () => function __PRIVATE_localStoreGetNamedQuery(e, t) {\n const n = __PRIVATE_debugCast(e);\n return n.persistence.runTransaction(\"Get named query\", \"readonly\", (e => n.Gr.getNamedQuery(e, t)));\n }(await __PRIVATE_getLocalStore(e), t)));\n}\n\nfunction __PRIVATE_firestoreClientSetIndexConfiguration(e, t) {\n return e.asyncQueue.enqueue((async () => async function __PRIVATE_localStoreConfigureFieldIndexes(e, t) {\n const n = __PRIVATE_debugCast(e), r = n.indexManager, i = [];\n return n.persistence.runTransaction(\"Configure indexes\", \"readwrite\", (e => r.getFieldIndexes(e).next((n => \n /**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /**\n * Compares two array for equality using comparator. The method computes the\n * intersection and invokes `onAdd` for every element that is in `after` but not\n * `before`. `onRemove` is invoked for every element in `before` but missing\n * from `after`.\n *\n * The method creates a copy of both `before` and `after` and runs in O(n log\n * n), where n is the size of the two lists.\n *\n * @param before - The elements that exist in the original array.\n * @param after - The elements to diff against the original array.\n * @param comparator - The comparator for the elements in before and after.\n * @param onAdd - A function to invoke for every element that is part of `\n * after` but not `before`.\n * @param onRemove - A function to invoke for every element that is part of\n * `before` but not `after`.\n */\n function __PRIVATE_diffArrays(e, t, n, r, i) {\n e = [ ...e ], t = [ ...t ], e.sort(n), t.sort(n);\n const s = e.length, o = t.length;\n let _ = 0, a = 0;\n for (;_ < o && a < s; ) {\n const s = n(e[a], t[_]);\n s < 0 ? \n // The element was removed if the next element in our ordered\n // walkthrough is only in `before`.\n i(e[a++]) : s > 0 ? \n // The element was added if the next element in our ordered walkthrough\n // is only in `after`.\n r(t[_++]) : (_++, a++);\n }\n for (;_ < o; ) r(t[_++]);\n for (;a < s; ) i(e[a++]);\n }\n /**\n * Verifies equality for an array of primitives.\n *\n * @private\n * @internal\n * @param left Array of primitives.\n * @param right Array of primitives.\n * @return True if arrays are equal.\n */ (n, t, __PRIVATE_fieldIndexSemanticComparator, (t => {\n i.push(r.addFieldIndex(e, t));\n }), (t => {\n i.push(r.deleteFieldIndex(e, t));\n })))).next((() => PersistencePromise.waitFor(i)))));\n }(await __PRIVATE_getLocalStore(e), t)));\n}\n\nfunction __PRIVATE_firestoreClientSetPersistentCacheIndexAutoCreationEnabled(e, t) {\n return e.asyncQueue.enqueue((async () => function __PRIVATE_localStoreSetIndexAutoCreationEnabled(e, t) {\n __PRIVATE_debugCast(e).ss.zi = t;\n }(await __PRIVATE_getLocalStore(e), t)));\n}\n\nfunction __PRIVATE_firestoreClientDeleteAllFieldIndexes(e) {\n return e.asyncQueue.enqueue((async () => function __PRIVATE_localStoreDeleteAllFieldIndexes(e) {\n const t = __PRIVATE_debugCast(e), n = t.indexManager;\n return t.persistence.runTransaction(\"Delete All Indexes\", \"readwrite\", (e => n.deleteAllFieldIndexes(e)));\n }\n /**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n // The format of the LocalStorage key that stores the client state is:\n // firestore_clients__\n (await __PRIVATE_getLocalStore(e))));\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Compares two `ExperimentalLongPollingOptions` objects for equality.\n */\n/**\n * Creates and returns a new `ExperimentalLongPollingOptions` with the same\n * option values as the given instance.\n */\nfunction __PRIVATE_cloneLongPollingOptions(e) {\n const t = {};\n return void 0 !== e.timeoutSeconds && (t.timeoutSeconds = e.timeoutSeconds), t;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const we = new Map;\n\n/**\n * An instance map that ensures only one Datastore exists per Firestore\n * instance.\n */\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction __PRIVATE_validateNonEmptyArgument(e, t, n) {\n if (!n) throw new FirestoreError(D.INVALID_ARGUMENT, `Function ${e}() cannot be called with an empty ${t}.`);\n}\n\n/**\n * Validates that two boolean options are not set at the same time.\n * @internal\n */ function __PRIVATE_validateIsNotUsedTogether(e, t, n, r) {\n if (!0 === t && !0 === r) throw new FirestoreError(D.INVALID_ARGUMENT, `${e} and ${n} cannot be used together.`);\n}\n\n/**\n * Validates that `path` refers to a document (indicated by the fact it contains\n * an even numbers of segments).\n */ function __PRIVATE_validateDocumentPath(e) {\n if (!DocumentKey.isDocumentKey(e)) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid document reference. Document references must have an even number of segments, but ${e} has ${e.length}.`);\n}\n\n/**\n * Validates that `path` refers to a collection (indicated by the fact it\n * contains an odd numbers of segments).\n */ function __PRIVATE_validateCollectionPath(e) {\n if (DocumentKey.isDocumentKey(e)) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid collection reference. Collection references must have an odd number of segments, but ${e} has ${e.length}.`);\n}\n\n/**\n * Returns true if it's a non-null object without a custom prototype\n * (i.e. excludes Array, Date, etc.).\n */\n/** Returns a string describing the type / value of the provided input. */\nfunction __PRIVATE_valueDescription(e) {\n if (void 0 === e) return \"undefined\";\n if (null === e) return \"null\";\n if (\"string\" == typeof e) return e.length > 20 && (e = `${e.substring(0, 20)}...`), \n JSON.stringify(e);\n if (\"number\" == typeof e || \"boolean\" == typeof e) return \"\" + e;\n if (\"object\" == typeof e) {\n if (e instanceof Array) return \"an array\";\n {\n const t = \n /** try to get the constructor name for an object. */\n function __PRIVATE_tryGetCustomObjectType(e) {\n if (e.constructor) return e.constructor.name;\n return null;\n }\n /**\n * Casts `obj` to `T`, optionally unwrapping Compat types to expose the\n * underlying instance. Throws if `obj` is not an instance of `T`.\n *\n * This cast is used in the Lite and Full SDK to verify instance types for\n * arguments passed to the public API.\n * @internal\n */ (e);\n return t ? `a custom ${t} object` : \"an object\";\n }\n }\n return \"function\" == typeof e ? \"a function\" : fail();\n}\n\nfunction __PRIVATE_cast(e, \n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nt) {\n if (\"_delegate\" in e && (\n // Unwrap Compat types\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n e = e._delegate), !(e instanceof t)) {\n if (t.name === e.constructor.name) throw new FirestoreError(D.INVALID_ARGUMENT, \"Type does not match the expected instance. Did you pass a reference from a different Firestore SDK?\");\n {\n const n = __PRIVATE_valueDescription(e);\n throw new FirestoreError(D.INVALID_ARGUMENT, `Expected type '${t.name}', but it was: ${n}`);\n }\n }\n return e;\n}\n\nfunction __PRIVATE_validatePositiveNumber(e, t) {\n if (t <= 0) throw new FirestoreError(D.INVALID_ARGUMENT, `Function ${e}() requires a positive number, but it was: ${t}.`);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// settings() defaults:\n/**\n * A concrete type describing all the values that can be applied via a\n * user-supplied `FirestoreSettings` object. This is a separate type so that\n * defaults can be supplied and the value can be checked for equality.\n */\nclass FirestoreSettingsImpl {\n constructor(e) {\n var t, n;\n if (void 0 === e.host) {\n if (void 0 !== e.ssl) throw new FirestoreError(D.INVALID_ARGUMENT, \"Can't provide ssl option if host option is not set\");\n this.host = \"firestore.googleapis.com\", this.ssl = true;\n } else this.host = e.host, this.ssl = null === (t = e.ssl) || void 0 === t || t;\n if (this.credentials = e.credentials, this.ignoreUndefinedProperties = !!e.ignoreUndefinedProperties, \n this.localCache = e.localCache, void 0 === e.cacheSizeBytes) this.cacheSizeBytes = 41943040; else {\n if (-1 !== e.cacheSizeBytes && e.cacheSizeBytes < 1048576) throw new FirestoreError(D.INVALID_ARGUMENT, \"cacheSizeBytes must be at least 1048576\");\n this.cacheSizeBytes = e.cacheSizeBytes;\n }\n __PRIVATE_validateIsNotUsedTogether(\"experimentalForceLongPolling\", e.experimentalForceLongPolling, \"experimentalAutoDetectLongPolling\", e.experimentalAutoDetectLongPolling), \n this.experimentalForceLongPolling = !!e.experimentalForceLongPolling, this.experimentalForceLongPolling ? this.experimentalAutoDetectLongPolling = !1 : void 0 === e.experimentalAutoDetectLongPolling ? this.experimentalAutoDetectLongPolling = true : \n // For backwards compatibility, coerce the value to boolean even though\n // the TypeScript compiler has narrowed the type to boolean already.\n // noinspection PointlessBooleanExpressionJS\n this.experimentalAutoDetectLongPolling = !!e.experimentalAutoDetectLongPolling, \n this.experimentalLongPollingOptions = __PRIVATE_cloneLongPollingOptions(null !== (n = e.experimentalLongPollingOptions) && void 0 !== n ? n : {}), \n function __PRIVATE_validateLongPollingOptions(e) {\n if (void 0 !== e.timeoutSeconds) {\n if (isNaN(e.timeoutSeconds)) throw new FirestoreError(D.INVALID_ARGUMENT, `invalid long polling timeout: ${e.timeoutSeconds} (must not be NaN)`);\n if (e.timeoutSeconds < 5) throw new FirestoreError(D.INVALID_ARGUMENT, `invalid long polling timeout: ${e.timeoutSeconds} (minimum allowed value is 5)`);\n if (e.timeoutSeconds > 30) throw new FirestoreError(D.INVALID_ARGUMENT, `invalid long polling timeout: ${e.timeoutSeconds} (maximum allowed value is 30)`);\n }\n }\n /**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /**\n * The Cloud Firestore service interface.\n *\n * Do not call this constructor directly. Instead, use {@link (getFirestore:1)}.\n */ (this.experimentalLongPollingOptions), this.useFetchStreams = !!e.useFetchStreams;\n }\n isEqual(e) {\n return this.host === e.host && this.ssl === e.ssl && this.credentials === e.credentials && this.cacheSizeBytes === e.cacheSizeBytes && this.experimentalForceLongPolling === e.experimentalForceLongPolling && this.experimentalAutoDetectLongPolling === e.experimentalAutoDetectLongPolling && function __PRIVATE_longPollingOptionsEqual(e, t) {\n return e.timeoutSeconds === t.timeoutSeconds;\n }(this.experimentalLongPollingOptions, e.experimentalLongPollingOptions) && this.ignoreUndefinedProperties === e.ignoreUndefinedProperties && this.useFetchStreams === e.useFetchStreams;\n }\n}\n\nclass Firestore$1 {\n /** @hideconstructor */\n constructor(e, t, n, r) {\n this._authCredentials = e, this._appCheckCredentials = t, this._databaseId = n, \n this._app = r, \n /**\n * Whether it's a Firestore or Firestore Lite instance.\n */\n this.type = \"firestore-lite\", this._persistenceKey = \"(lite)\", this._settings = new FirestoreSettingsImpl({}), \n this._settingsFrozen = !1, \n // A task that is assigned when the terminate() is invoked and resolved when\n // all components have shut down. Otherwise, Firestore is not terminated,\n // which can mean either the FirestoreClient is in the process of starting,\n // or restarting.\n this._terminateTask = \"notTerminated\";\n }\n /**\n * The {@link @firebase/app#FirebaseApp} associated with this `Firestore` service\n * instance.\n */ get app() {\n if (!this._app) throw new FirestoreError(D.FAILED_PRECONDITION, \"Firestore was not initialized using the Firebase SDK. 'app' is not available\");\n return this._app;\n }\n get _initialized() {\n return this._settingsFrozen;\n }\n get _terminated() {\n return \"notTerminated\" !== this._terminateTask;\n }\n _setSettings(e) {\n if (this._settingsFrozen) throw new FirestoreError(D.FAILED_PRECONDITION, \"Firestore has already been started and its settings can no longer be changed. You can only modify settings before calling any other methods on a Firestore object.\");\n this._settings = new FirestoreSettingsImpl(e), void 0 !== e.credentials && (this._authCredentials = function __PRIVATE_makeAuthCredentialsProvider(e) {\n if (!e) return new __PRIVATE_EmptyAuthCredentialsProvider;\n switch (e.type) {\n case \"firstParty\":\n return new __PRIVATE_FirstPartyAuthCredentialsProvider(e.sessionIndex || \"0\", e.iamToken || null, e.authTokenFactory || null);\n\n case \"provider\":\n return e.client;\n\n default:\n throw new FirestoreError(D.INVALID_ARGUMENT, \"makeAuthCredentialsProvider failed due to invalid credential type\");\n }\n }(e.credentials));\n }\n _getSettings() {\n return this._settings;\n }\n _freezeSettings() {\n return this._settingsFrozen = !0, this._settings;\n }\n _delete() {\n // The `_terminateTask` must be assigned future that completes when\n // terminate is complete. The existence of this future puts SDK in state\n // that will not accept further API interaction.\n return \"notTerminated\" === this._terminateTask && (this._terminateTask = this._terminate()), \n this._terminateTask;\n }\n async _restart() {\n // The `_terminateTask` must equal 'notTerminated' after restart to\n // signal that client is in a state that accepts API calls.\n \"notTerminated\" === this._terminateTask ? await this._terminate() : this._terminateTask = \"notTerminated\";\n }\n /** Returns a JSON-serializable representation of this `Firestore` instance. */ toJSON() {\n return {\n app: this._app,\n databaseId: this._databaseId,\n settings: this._settings\n };\n }\n /**\n * Terminates all components used by this client. Subclasses can override\n * this method to clean up their own dependencies, but must also call this\n * method.\n *\n * Only ever called once.\n */ _terminate() {\n /**\n * Removes all components associated with the provided instance. Must be called\n * when the `Firestore` instance is terminated.\n */\n return function __PRIVATE_removeComponents(e) {\n const t = we.get(e);\n t && (__PRIVATE_logDebug(\"ComponentProvider\", \"Removing Datastore\"), we.delete(e), \n t.terminate());\n }(this), Promise.resolve();\n }\n}\n\n/**\n * Modify this instance to communicate with the Cloud Firestore emulator.\n *\n * Note: This must be called before this instance has been used to do any\n * operations.\n *\n * @param firestore - The `Firestore` instance to configure to connect to the\n * emulator.\n * @param host - the emulator host (ex: localhost).\n * @param port - the emulator port (ex: 9000).\n * @param options.mockUserToken - the mock auth token to use for unit testing\n * Security Rules.\n */ function connectFirestoreEmulator(e, t, n, r = {}) {\n var i;\n const s = (e = __PRIVATE_cast(e, Firestore$1))._getSettings(), o = `${t}:${n}`;\n if (\"firestore.googleapis.com\" !== s.host && s.host !== o && __PRIVATE_logWarn(\"Host has been set in both settings() and connectFirestoreEmulator(), emulator host will be used.\"), \n e._setSettings(Object.assign(Object.assign({}, s), {\n host: o,\n ssl: !1\n })), r.mockUserToken) {\n let t, n;\n if (\"string\" == typeof r.mockUserToken) t = r.mockUserToken, n = User.MOCK_USER; else {\n // Let createMockUserToken validate first (catches common mistakes like\n // invalid field \"uid\" and missing field \"sub\" / \"user_id\".)\n t = createMockUserToken(r.mockUserToken, null === (i = e._app) || void 0 === i ? void 0 : i.options.projectId);\n const s = r.mockUserToken.sub || r.mockUserToken.user_id;\n if (!s) throw new FirestoreError(D.INVALID_ARGUMENT, \"mockUserToken must contain 'sub' or 'user_id' field!\");\n n = new User(s);\n }\n e._authCredentials = new __PRIVATE_EmulatorAuthCredentialsProvider(new __PRIVATE_OAuthToken(t, n));\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A `Query` refers to a query which you can read or listen to. You can also\n * construct refined `Query` objects by adding filters and ordering.\n */ class Query {\n // This is the lite version of the Query class in the main SDK.\n /** @hideconstructor protected */\n constructor(e, \n /**\n * If provided, the `FirestoreDataConverter` associated with this instance.\n */\n t, n) {\n this.converter = t, this._query = n, \n /** The type of this Firestore reference. */\n this.type = \"query\", this.firestore = e;\n }\n withConverter(e) {\n return new Query(this.firestore, e, this._query);\n }\n}\n\n/**\n * A `DocumentReference` refers to a document location in a Firestore database\n * and can be used to write, read, or listen to the location. The document at\n * the referenced location may or may not exist.\n */ class DocumentReference {\n /** @hideconstructor */\n constructor(e, \n /**\n * If provided, the `FirestoreDataConverter` associated with this instance.\n */\n t, n) {\n this.converter = t, this._key = n, \n /** The type of this Firestore reference. */\n this.type = \"document\", this.firestore = e;\n }\n get _path() {\n return this._key.path;\n }\n /**\n * The document's identifier within its collection.\n */ get id() {\n return this._key.path.lastSegment();\n }\n /**\n * A string representing the path of the referenced document (relative\n * to the root of the database).\n */ get path() {\n return this._key.path.canonicalString();\n }\n /**\n * The collection this `DocumentReference` belongs to.\n */ get parent() {\n return new CollectionReference(this.firestore, this.converter, this._key.path.popLast());\n }\n withConverter(e) {\n return new DocumentReference(this.firestore, e, this._key);\n }\n}\n\n/**\n * A `CollectionReference` object can be used for adding documents, getting\n * document references, and querying for documents (using {@link (query:1)}).\n */ class CollectionReference extends Query {\n /** @hideconstructor */\n constructor(e, t, n) {\n super(e, t, __PRIVATE_newQueryForPath(n)), this._path = n, \n /** The type of this Firestore reference. */\n this.type = \"collection\";\n }\n /** The collection's identifier. */ get id() {\n return this._query.path.lastSegment();\n }\n /**\n * A string representing the path of the referenced collection (relative\n * to the root of the database).\n */ get path() {\n return this._query.path.canonicalString();\n }\n /**\n * A reference to the containing `DocumentReference` if this is a\n * subcollection. If this isn't a subcollection, the reference is null.\n */ get parent() {\n const e = this._path.popLast();\n return e.isEmpty() ? null : new DocumentReference(this.firestore, \n /* converter= */ null, new DocumentKey(e));\n }\n withConverter(e) {\n return new CollectionReference(this.firestore, e, this._path);\n }\n}\n\nfunction collection(e, t, ...n) {\n if (e = getModularInstance(e), __PRIVATE_validateNonEmptyArgument(\"collection\", \"path\", t), e instanceof Firestore$1) {\n const r = ResourcePath.fromString(t, ...n);\n return __PRIVATE_validateCollectionPath(r), new CollectionReference(e, /* converter= */ null, r);\n }\n {\n if (!(e instanceof DocumentReference || e instanceof CollectionReference)) throw new FirestoreError(D.INVALID_ARGUMENT, \"Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore\");\n const r = e._path.child(ResourcePath.fromString(t, ...n));\n return __PRIVATE_validateCollectionPath(r), new CollectionReference(e.firestore, \n /* converter= */ null, r);\n }\n}\n\n// TODO(firestorelite): Consider using ErrorFactory -\n// https://github.com/firebase/firebase-js-sdk/blob/0131e1f/packages/util/src/errors.ts#L106\n/**\n * Creates and returns a new `Query` instance that includes all documents in the\n * database that are contained in a collection or subcollection with the\n * given `collectionId`.\n *\n * @param firestore - A reference to the root `Firestore` instance.\n * @param collectionId - Identifies the collections to query over. Every\n * collection or subcollection with this ID as the last segment of its path\n * will be included. Cannot contain a slash.\n * @returns The created `Query`.\n */ function collectionGroup(e, t) {\n if (e = __PRIVATE_cast(e, Firestore$1), __PRIVATE_validateNonEmptyArgument(\"collectionGroup\", \"collection id\", t), \n t.indexOf(\"/\") >= 0) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid collection ID '${t}' passed to function collectionGroup(). Collection IDs must not contain '/'.`);\n return new Query(e, \n /* converter= */ null, function __PRIVATE_newQueryForCollectionGroup(e) {\n return new __PRIVATE_QueryImpl(ResourcePath.emptyPath(), e);\n }(t));\n}\n\nfunction doc(e, t, ...n) {\n if (e = getModularInstance(e), \n // We allow omission of 'pathString' but explicitly prohibit passing in both\n // 'undefined' and 'null'.\n 1 === arguments.length && (t = __PRIVATE_AutoId.newId()), __PRIVATE_validateNonEmptyArgument(\"doc\", \"path\", t), \n e instanceof Firestore$1) {\n const r = ResourcePath.fromString(t, ...n);\n return __PRIVATE_validateDocumentPath(r), new DocumentReference(e, \n /* converter= */ null, new DocumentKey(r));\n }\n {\n if (!(e instanceof DocumentReference || e instanceof CollectionReference)) throw new FirestoreError(D.INVALID_ARGUMENT, \"Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore\");\n const r = e._path.child(ResourcePath.fromString(t, ...n));\n return __PRIVATE_validateDocumentPath(r), new DocumentReference(e.firestore, e instanceof CollectionReference ? e.converter : null, new DocumentKey(r));\n }\n}\n\n/**\n * Returns true if the provided references are equal.\n *\n * @param left - A reference to compare.\n * @param right - A reference to compare.\n * @returns true if the references point to the same location in the same\n * Firestore database.\n */ function refEqual(e, t) {\n return e = getModularInstance(e), t = getModularInstance(t), (e instanceof DocumentReference || e instanceof CollectionReference) && (t instanceof DocumentReference || t instanceof CollectionReference) && (e.firestore === t.firestore && e.path === t.path && e.converter === t.converter);\n}\n\n/**\n * Returns true if the provided queries point to the same collection and apply\n * the same constraints.\n *\n * @param left - A `Query` to compare.\n * @param right - A `Query` to compare.\n * @returns true if the references point to the same location in the same\n * Firestore database.\n */ function queryEqual(e, t) {\n return e = getModularInstance(e), t = getModularInstance(t), e instanceof Query && t instanceof Query && (e.firestore === t.firestore && __PRIVATE_queryEquals(e._query, t._query) && e.converter === t.converter);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ class __PRIVATE_AsyncQueueImpl {\n constructor(e = Promise.resolve()) {\n // A list of retryable operations. Retryable operations are run in order and\n // retried with backoff.\n this.Pu = [], \n // Is this AsyncQueue being shut down? Once it is set to true, it will not\n // be changed again.\n this.Iu = !1, \n // Operations scheduled to be queued in the future. Operations are\n // automatically removed after they are run or canceled.\n this.Tu = [], \n // visible for testing\n this.Eu = null, \n // Flag set while there's an outstanding AsyncQueue operation, used for\n // assertion sanity-checks.\n this.du = !1, \n // Enabled during shutdown on Safari to prevent future access to IndexedDB.\n this.Au = !1, \n // List of TimerIds to fast-forward delays for.\n this.Ru = [], \n // Backoff timer used to schedule retries for retryable operations\n this.t_ = new __PRIVATE_ExponentialBackoff(this, \"async_queue_retry\" /* TimerId.AsyncQueueRetry */), \n // Visibility handler that triggers an immediate retry of all retryable\n // operations. Meant to speed up recovery when we regain file system access\n // after page comes into foreground.\n this.Vu = () => {\n const e = getDocument();\n e && __PRIVATE_logDebug(\"AsyncQueue\", \"Visibility state changed to \" + e.visibilityState), \n this.t_.jo();\n }, this.mu = e;\n const t = getDocument();\n t && \"function\" == typeof t.addEventListener && t.addEventListener(\"visibilitychange\", this.Vu);\n }\n get isShuttingDown() {\n return this.Iu;\n }\n /**\n * Adds a new operation to the queue without waiting for it to complete (i.e.\n * we ignore the Promise result).\n */ enqueueAndForget(e) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.enqueue(e);\n }\n enqueueAndForgetEvenWhileRestricted(e) {\n this.fu(), \n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.gu(e);\n }\n enterRestrictedMode(e) {\n if (!this.Iu) {\n this.Iu = !0, this.Au = e || !1;\n const t = getDocument();\n t && \"function\" == typeof t.removeEventListener && t.removeEventListener(\"visibilitychange\", this.Vu);\n }\n }\n enqueue(e) {\n if (this.fu(), this.Iu) \n // Return a Promise which never resolves.\n return new Promise((() => {}));\n // Create a deferred Promise that we can return to the callee. This\n // allows us to return a \"hanging Promise\" only to the callee and still\n // advance the queue even when the operation is not run.\n const t = new __PRIVATE_Deferred;\n return this.gu((() => this.Iu && this.Au ? Promise.resolve() : (e().then(t.resolve, t.reject), \n t.promise))).then((() => t.promise));\n }\n enqueueRetryable(e) {\n this.enqueueAndForget((() => (this.Pu.push(e), this.pu())));\n }\n /**\n * Runs the next operation from the retryable queue. If the operation fails,\n * reschedules with backoff.\n */ async pu() {\n if (0 !== this.Pu.length) {\n try {\n await this.Pu[0](), this.Pu.shift(), this.t_.reset();\n } catch (e) {\n if (!__PRIVATE_isIndexedDbTransactionError(e)) throw e;\n // Failure will be handled by AsyncQueue\n __PRIVATE_logDebug(\"AsyncQueue\", \"Operation failed with retryable error: \" + e);\n }\n this.Pu.length > 0 && \n // If there are additional operations, we re-schedule `retryNextOp()`.\n // This is necessary to run retryable operations that failed during\n // their initial attempt since we don't know whether they are already\n // enqueued. If, for example, `op1`, `op2`, `op3` are enqueued and `op1`\n // needs to be re-run, we will run `op1`, `op1`, `op2` using the\n // already enqueued calls to `retryNextOp()`. `op3()` will then run in the\n // call scheduled here.\n // Since `backoffAndRun()` cancels an existing backoff and schedules a\n // new backoff on every call, there is only ever a single additional\n // operation in the queue.\n this.t_.Go((() => this.pu()));\n }\n }\n gu(e) {\n const t = this.mu.then((() => (this.du = !0, e().catch((e => {\n this.Eu = e, this.du = !1;\n const t = \n /**\n * Chrome includes Error.message in Error.stack. Other browsers do not.\n * This returns expected output of message + stack when available.\n * @param error - Error or FirestoreError\n */\n function __PRIVATE_getMessageOrStack(e) {\n let t = e.message || \"\";\n e.stack && (t = e.stack.includes(e.message) ? e.stack : e.message + \"\\n\" + e.stack);\n return t;\n }\n /**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ (e);\n // Re-throw the error so that this.tail becomes a rejected Promise and\n // all further attempts to chain (via .then) will just short-circuit\n // and return the rejected Promise.\n throw __PRIVATE_logError(\"INTERNAL UNHANDLED ERROR: \", t), e;\n })).then((e => (this.du = !1, e))))));\n return this.mu = t, t;\n }\n enqueueAfterDelay(e, t, n) {\n this.fu(), \n // Fast-forward delays for timerIds that have been overridden.\n this.Ru.indexOf(e) > -1 && (t = 0);\n const r = DelayedOperation.createAndSchedule(this, e, t, n, (e => this.yu(e)));\n return this.Tu.push(r), r;\n }\n fu() {\n this.Eu && fail();\n }\n verifyOperationInProgress() {}\n /**\n * Waits until all currently queued tasks are finished executing. Delayed\n * operations are not run.\n */ async wu() {\n // Operations in the queue prior to draining may have enqueued additional\n // operations. Keep draining the queue until the tail is no longer advanced,\n // which indicates that no more new operations were enqueued and that all\n // operations were executed.\n let e;\n do {\n e = this.mu, await e;\n } while (e !== this.mu);\n }\n /**\n * For Tests: Determine if a delayed operation with a particular TimerId\n * exists.\n */ Su(e) {\n for (const t of this.Tu) if (t.timerId === e) return !0;\n return !1;\n }\n /**\n * For Tests: Runs some or all delayed operations early.\n *\n * @param lastTimerId - Delayed operations up to and including this TimerId\n * will be drained. Pass TimerId.All to run all delayed operations.\n * @returns a Promise that resolves once all operations have been run.\n */ bu(e) {\n // Note that draining may generate more delayed ops, so we do that first.\n return this.wu().then((() => {\n // Run ops in the same order they'd run if they ran naturally.\n /* eslint-disable-next-line @typescript-eslint/no-floating-promises */\n this.Tu.sort(((e, t) => e.targetTimeMs - t.targetTimeMs));\n for (const t of this.Tu) if (t.skipDelay(), \"all\" /* TimerId.All */ !== e && t.timerId === e) break;\n return this.wu();\n }));\n }\n /**\n * For Tests: Skip all subsequent delays for a timer id.\n */ Du(e) {\n this.Ru.push(e);\n }\n /** Called once a DelayedOperation is run or canceled. */ yu(e) {\n // NOTE: indexOf / slice are O(n), but delayedOperations is expected to be small.\n const t = this.Tu.indexOf(e);\n /* eslint-disable-next-line @typescript-eslint/no-floating-promises */ this.Tu.splice(t, 1);\n }\n}\n\nfunction __PRIVATE_isPartialObserver(e) {\n /**\n * Returns true if obj is an object and contains at least one of the specified\n * methods.\n */\n return function __PRIVATE_implementsAnyMethods(e, t) {\n if (\"object\" != typeof e || null === e) return !1;\n const n = e;\n for (const e of t) if (e in n && \"function\" == typeof n[e]) return !0;\n return !1;\n }\n /**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /**\n * Represents the task of loading a Firestore bundle. It provides progress of bundle\n * loading, as well as task completion and error events.\n *\n * The API is compatible with `Promise`.\n */ (e, [ \"next\", \"error\", \"complete\" ]);\n}\n\nclass LoadBundleTask {\n constructor() {\n this._progressObserver = {}, this._taskCompletionResolver = new __PRIVATE_Deferred, \n this._lastProgress = {\n taskState: \"Running\",\n totalBytes: 0,\n totalDocuments: 0,\n bytesLoaded: 0,\n documentsLoaded: 0\n };\n }\n /**\n * Registers functions to listen to bundle loading progress events.\n * @param next - Called when there is a progress update from bundle loading. Typically `next` calls occur\n * each time a Firestore document is loaded from the bundle.\n * @param error - Called when an error occurs during bundle loading. The task aborts after reporting the\n * error, and there should be no more updates after this.\n * @param complete - Called when the loading task is complete.\n */ onProgress(e, t, n) {\n this._progressObserver = {\n next: e,\n error: t,\n complete: n\n };\n }\n /**\n * Implements the `Promise.catch` interface.\n *\n * @param onRejected - Called when an error occurs during bundle loading.\n */ catch(e) {\n return this._taskCompletionResolver.promise.catch(e);\n }\n /**\n * Implements the `Promise.then` interface.\n *\n * @param onFulfilled - Called on the completion of the loading task with a final `LoadBundleTaskProgress` update.\n * The update will always have its `taskState` set to `\"Success\"`.\n * @param onRejected - Called when an error occurs during bundle loading.\n */ then(e, t) {\n return this._taskCompletionResolver.promise.then(e, t);\n }\n /**\n * Notifies all observers that bundle loading has completed, with a provided\n * `LoadBundleTaskProgress` object.\n *\n * @private\n */ _completeWith(e) {\n this._updateProgress(e), this._progressObserver.complete && this._progressObserver.complete(), \n this._taskCompletionResolver.resolve(e);\n }\n /**\n * Notifies all observers that bundle loading has failed, with a provided\n * `Error` as the reason.\n *\n * @private\n */ _failWith(e) {\n this._lastProgress.taskState = \"Error\", this._progressObserver.next && this._progressObserver.next(this._lastProgress), \n this._progressObserver.error && this._progressObserver.error(e), this._taskCompletionResolver.reject(e);\n }\n /**\n * Notifies a progress update of loading a bundle.\n * @param progress - The new progress.\n *\n * @private\n */ _updateProgress(e) {\n this._lastProgress = e, this._progressObserver.next && this._progressObserver.next(e);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Constant used to indicate the LRU garbage collection should be disabled.\n * Set this value as the `cacheSizeBytes` on the settings passed to the\n * {@link Firestore} instance.\n */ const Se = -1;\n\n/**\n * The Cloud Firestore service interface.\n *\n * Do not call this constructor directly. Instead, use {@link (getFirestore:1)}.\n */ class Firestore extends Firestore$1 {\n /** @hideconstructor */\n constructor(e, t, n, r) {\n super(e, t, n, r), \n /**\n * Whether it's a {@link Firestore} or Firestore Lite instance.\n */\n this.type = \"firestore\", this._queue = new __PRIVATE_AsyncQueueImpl, this._persistenceKey = (null == r ? void 0 : r.name) || \"[DEFAULT]\";\n }\n async _terminate() {\n if (this._firestoreClient) {\n const e = this._firestoreClient.terminate();\n this._queue = new __PRIVATE_AsyncQueueImpl(e), this._firestoreClient = void 0, await e;\n }\n }\n}\n\n/**\n * Initializes a new instance of {@link Firestore} with the provided settings.\n * Can only be called before any other function, including\n * {@link (getFirestore:1)}. If the custom settings are empty, this function is\n * equivalent to calling {@link (getFirestore:1)}.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} with which the {@link Firestore} instance will\n * be associated.\n * @param settings - A settings object to configure the {@link Firestore} instance.\n * @param databaseId - The name of the database.\n * @returns A newly initialized {@link Firestore} instance.\n */ function initializeFirestore(e, t, n) {\n n || (n = \"(default)\");\n const r = _getProvider(e, \"firestore\");\n if (r.isInitialized(n)) {\n const e = r.getImmediate({\n identifier: n\n }), i = r.getOptions(n);\n if (deepEqual(i, t)) return e;\n throw new FirestoreError(D.FAILED_PRECONDITION, \"initializeFirestore() has already been called with different options. To avoid this error, call initializeFirestore() with the same options as when it was originally called, or call getFirestore() to return the already initialized instance.\");\n }\n if (void 0 !== t.cacheSizeBytes && void 0 !== t.localCache) throw new FirestoreError(D.INVALID_ARGUMENT, \"cache and cacheSizeBytes cannot be specified at the same time as cacheSizeBytes willbe deprecated. Instead, specify the cache size in the cache object\");\n if (void 0 !== t.cacheSizeBytes && -1 !== t.cacheSizeBytes && t.cacheSizeBytes < 1048576) throw new FirestoreError(D.INVALID_ARGUMENT, \"cacheSizeBytes must be at least 1048576\");\n return r.initialize({\n options: t,\n instanceIdentifier: n\n });\n}\n\nfunction getFirestore(t, n) {\n const r = \"object\" == typeof t ? t : getApp(), i = \"string\" == typeof t ? t : n || \"(default)\", s = _getProvider(r, \"firestore\").getImmediate({\n identifier: i\n });\n if (!s._initialized) {\n const e = getDefaultEmulatorHostnameAndPort(\"firestore\");\n e && connectFirestoreEmulator(s, ...e);\n }\n return s;\n}\n\n/**\n * @internal\n */ function ensureFirestoreConfigured(e) {\n if (e._terminated) throw new FirestoreError(D.FAILED_PRECONDITION, \"The client has already been terminated.\");\n return e._firestoreClient || __PRIVATE_configureFirestore(e), e._firestoreClient;\n}\n\nfunction __PRIVATE_configureFirestore(e) {\n var t, n, r;\n const i = e._freezeSettings(), s = function __PRIVATE_makeDatabaseInfo(e, t, n, r) {\n return new DatabaseInfo(e, t, n, r.host, r.ssl, r.experimentalForceLongPolling, r.experimentalAutoDetectLongPolling, __PRIVATE_cloneLongPollingOptions(r.experimentalLongPollingOptions), r.useFetchStreams);\n }(e._databaseId, (null === (t = e._app) || void 0 === t ? void 0 : t.options.appId) || \"\", e._persistenceKey, i);\n e._componentsProvider || (null === (n = i.localCache) || void 0 === n ? void 0 : n._offlineComponentProvider) && (null === (r = i.localCache) || void 0 === r ? void 0 : r._onlineComponentProvider) && (e._componentsProvider = {\n _offline: i.localCache._offlineComponentProvider,\n _online: i.localCache._onlineComponentProvider\n }), e._firestoreClient = new FirestoreClient(e._authCredentials, e._appCheckCredentials, e._queue, s, e._componentsProvider && function __PRIVATE_buildComponentProvider(e) {\n const t = null == e ? void 0 : e._online.build();\n return {\n _offline: null == e ? void 0 : e._offline.build(t),\n _online: t\n };\n }\n /**\n * Attempts to enable persistent storage, if possible.\n *\n * On failure, `enableIndexedDbPersistence()` will reject the promise or\n * throw an exception. There are several reasons why this can fail, which can be\n * identified by the `code` on the error.\n *\n * * failed-precondition: The app is already open in another browser tab.\n * * unimplemented: The browser is incompatible with the offline persistence\n * implementation.\n *\n * Note that even after a failure, the {@link Firestore} instance will remain\n * usable, however offline persistence will be disabled.\n *\n * Note: `enableIndexedDbPersistence()` must be called before any other functions\n * (other than {@link initializeFirestore}, {@link (getFirestore:1)} or\n * {@link clearIndexedDbPersistence}.\n *\n * Persistence cannot be used in a Node.js environment.\n *\n * @param firestore - The {@link Firestore} instance to enable persistence for.\n * @param persistenceSettings - Optional settings object to configure\n * persistence.\n * @returns A `Promise` that represents successfully enabling persistent storage.\n * @deprecated This function will be removed in a future major release. Instead, set\n * `FirestoreSettings.localCache` to an instance of `PersistentLocalCache` to\n * turn on IndexedDb cache. Calling this function when `FirestoreSettings.localCache`\n * is already specified will throw an exception.\n */ (e._componentsProvider));\n}\n\nfunction enableIndexedDbPersistence(e, t) {\n __PRIVATE_logWarn(\"enableIndexedDbPersistence() will be deprecated in the future, you can use `FirestoreSettings.cache` instead.\");\n const n = e._freezeSettings();\n return __PRIVATE_setPersistenceProviders(e, OnlineComponentProvider.provider, {\n build: e => new __PRIVATE_IndexedDbOfflineComponentProvider(e, n.cacheSizeBytes, null == t ? void 0 : t.forceOwnership)\n }), Promise.resolve();\n}\n\n/**\n * Attempts to enable multi-tab persistent storage, if possible. If enabled\n * across all tabs, all operations share access to local persistence, including\n * shared execution of queries and latency-compensated local document updates\n * across all connected instances.\n *\n * On failure, `enableMultiTabIndexedDbPersistence()` will reject the promise or\n * throw an exception. There are several reasons why this can fail, which can be\n * identified by the `code` on the error.\n *\n * * failed-precondition: The app is already open in another browser tab and\n * multi-tab is not enabled.\n * * unimplemented: The browser is incompatible with the offline persistence\n * implementation.\n *\n * Note that even after a failure, the {@link Firestore} instance will remain\n * usable, however offline persistence will be disabled.\n *\n * @param firestore - The {@link Firestore} instance to enable persistence for.\n * @returns A `Promise` that represents successfully enabling persistent\n * storage.\n * @deprecated This function will be removed in a future major release. Instead, set\n * `FirestoreSettings.localCache` to an instance of `PersistentLocalCache` to\n * turn on indexeddb cache. Calling this function when `FirestoreSettings.localCache`\n * is already specified will throw an exception.\n */ async function enableMultiTabIndexedDbPersistence(e) {\n __PRIVATE_logWarn(\"enableMultiTabIndexedDbPersistence() will be deprecated in the future, you can use `FirestoreSettings.cache` instead.\");\n const t = e._freezeSettings();\n __PRIVATE_setPersistenceProviders(e, OnlineComponentProvider.provider, {\n build: e => new __PRIVATE_MultiTabOfflineComponentProvider(e, t.cacheSizeBytes)\n });\n}\n\n/**\n * Registers both the `OfflineComponentProvider` and `OnlineComponentProvider`.\n * If the operation fails with a recoverable error (see\n * `canRecoverFromIndexedDbError()` below), the returned Promise is rejected\n * but the client remains usable.\n */ function __PRIVATE_setPersistenceProviders(e, t, n) {\n if ((e = __PRIVATE_cast(e, Firestore))._firestoreClient || e._terminated) throw new FirestoreError(D.FAILED_PRECONDITION, \"Firestore has already been started and persistence can no longer be enabled. You can only enable persistence before calling any other methods on a Firestore object.\");\n if (e._componentsProvider || e._getSettings().localCache) throw new FirestoreError(D.FAILED_PRECONDITION, \"SDK cache is already specified.\");\n e._componentsProvider = {\n _online: t,\n _offline: n\n }, __PRIVATE_configureFirestore(e);\n}\n\n/**\n * Clears the persistent storage. This includes pending writes and cached\n * documents.\n *\n * Must be called while the {@link Firestore} instance is not started (after the app is\n * terminated or when the app is first initialized). On startup, this function\n * must be called before other functions (other than {@link\n * initializeFirestore} or {@link (getFirestore:1)})). If the {@link Firestore}\n * instance is still running, the promise will be rejected with the error code\n * of `failed-precondition`.\n *\n * Note: `clearIndexedDbPersistence()` is primarily intended to help write\n * reliable tests that use Cloud Firestore. It uses an efficient mechanism for\n * dropping existing data but does not attempt to securely overwrite or\n * otherwise make cached data unrecoverable. For applications that are sensitive\n * to the disclosure of cached data in between user sessions, we strongly\n * recommend not enabling persistence at all.\n *\n * @param firestore - The {@link Firestore} instance to clear persistence for.\n * @returns A `Promise` that is resolved when the persistent storage is\n * cleared. Otherwise, the promise is rejected with an error.\n */ function clearIndexedDbPersistence(e) {\n if (e._initialized && !e._terminated) throw new FirestoreError(D.FAILED_PRECONDITION, \"Persistence can only be cleared before a Firestore instance is initialized or after it is terminated.\");\n const t = new __PRIVATE_Deferred;\n return e._queue.enqueueAndForgetEvenWhileRestricted((async () => {\n try {\n await async function __PRIVATE_indexedDbClearPersistence(e) {\n if (!__PRIVATE_SimpleDb.D()) return Promise.resolve();\n const t = e + \"main\";\n await __PRIVATE_SimpleDb.delete(t);\n }(__PRIVATE_indexedDbStoragePrefix(e._databaseId, e._persistenceKey)), t.resolve();\n } catch (e) {\n t.reject(e);\n }\n })), t.promise;\n}\n\n/**\n * Waits until all currently pending writes for the active user have been\n * acknowledged by the backend.\n *\n * The returned promise resolves immediately if there are no outstanding writes.\n * Otherwise, the promise waits for all previously issued writes (including\n * those written in a previous app session), but it does not wait for writes\n * that were added after the function is called. If you want to wait for\n * additional writes, call `waitForPendingWrites()` again.\n *\n * Any outstanding `waitForPendingWrites()` promises are rejected during user\n * changes.\n *\n * @returns A `Promise` which resolves when all currently pending writes have been\n * acknowledged by the backend.\n */ function waitForPendingWrites(e) {\n return function __PRIVATE_firestoreClientWaitForPendingWrites(e) {\n const t = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => __PRIVATE_syncEngineRegisterPendingWritesCallback(await __PRIVATE_getSyncEngine(e), t))), \n t.promise;\n }(ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore)));\n}\n\n/**\n * Re-enables use of the network for this {@link Firestore} instance after a prior\n * call to {@link disableNetwork}.\n *\n * @returns A `Promise` that is resolved once the network has been enabled.\n */ function enableNetwork(e) {\n return __PRIVATE_firestoreClientEnableNetwork(ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore)));\n}\n\n/**\n * Disables network usage for this instance. It can be re-enabled via {@link\n * enableNetwork}. While the network is disabled, any snapshot listeners,\n * `getDoc()` or `getDocs()` calls will return results from cache, and any write\n * operations will be queued until the network is restored.\n *\n * @returns A `Promise` that is resolved once the network has been disabled.\n */ function disableNetwork(e) {\n return __PRIVATE_firestoreClientDisableNetwork(ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore)));\n}\n\n/**\n * Terminates the provided {@link Firestore} instance.\n *\n * After calling `terminate()` only the `clearIndexedDbPersistence()` function\n * may be used. Any other function will throw a `FirestoreError`.\n *\n * To restart after termination, create a new instance of FirebaseFirestore with\n * {@link (getFirestore:1)}.\n *\n * Termination does not cancel any pending writes, and any promises that are\n * awaiting a response from the server will not be resolved. If you have\n * persistence enabled, the next time you start this instance, it will resume\n * sending these writes to the server.\n *\n * Note: Under normal circumstances, calling `terminate()` is not required. This\n * function is useful only when you want to force this instance to release all\n * of its resources or in combination with `clearIndexedDbPersistence()` to\n * ensure that all local state is destroyed between test runs.\n *\n * @returns A `Promise` that is resolved when the instance has been successfully\n * terminated.\n */ function terminate(e) {\n return _removeServiceInstance(e.app, \"firestore\", e._databaseId.database), e._delete();\n}\n\n/**\n * Loads a Firestore bundle into the local cache.\n *\n * @param firestore - The {@link Firestore} instance to load bundles for.\n * @param bundleData - An object representing the bundle to be loaded. Valid\n * objects are `ArrayBuffer`, `ReadableStream` or `string`.\n *\n * @returns A `LoadBundleTask` object, which notifies callers with progress\n * updates, and completion or error events. It can be used as a\n * `Promise`.\n */ function loadBundle(e, t) {\n const n = ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore)), r = new LoadBundleTask;\n return __PRIVATE_firestoreClientLoadBundle(n, e._databaseId, t, r), r;\n}\n\n/**\n * Reads a Firestore {@link Query} from local cache, identified by the given\n * name.\n *\n * The named queries are packaged into bundles on the server side (along\n * with resulting documents), and loaded to local cache using `loadBundle`. Once\n * in local cache, use this method to extract a {@link Query} by name.\n *\n * @param firestore - The {@link Firestore} instance to read the query from.\n * @param name - The name of the query.\n * @returns A `Promise` that is resolved with the Query or `null`.\n */ function namedQuery(e, t) {\n return __PRIVATE_firestoreClientGetNamedQuery(ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore)), t).then((t => t ? new Query(e, null, t.query) : null));\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents an aggregation that can be performed by Firestore.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nclass AggregateField {\n /**\n * Create a new AggregateField\n * @param aggregateType Specifies the type of aggregation operation to perform.\n * @param _internalFieldPath Optionally specifies the field that is aggregated.\n * @internal\n */\n constructor(e = \"count\", t) {\n this._internalFieldPath = t, \n /** A type string to uniquely identify instances of this class. */\n this.type = \"AggregateField\", this.aggregateType = e;\n }\n}\n\n/**\n * The results of executing an aggregation query.\n */ class AggregateQuerySnapshot {\n /** @hideconstructor */\n constructor(e, t, n) {\n this._userDataWriter = t, this._data = n, \n /** A type string to uniquely identify instances of this class. */\n this.type = \"AggregateQuerySnapshot\", this.query = e;\n }\n /**\n * Returns the results of the aggregations performed over the underlying\n * query.\n *\n * The keys of the returned object will be the same as those of the\n * `AggregateSpec` object specified to the aggregation method, and the values\n * will be the corresponding aggregation result.\n *\n * @returns The results of the aggregations performed over the underlying\n * query.\n */ data() {\n return this._userDataWriter.convertObjectMap(this._data);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An immutable object representing an array of bytes.\n */ class Bytes {\n /** @hideconstructor */\n constructor(e) {\n this._byteString = e;\n }\n /**\n * Creates a new `Bytes` object from the given Base64 string, converting it to\n * bytes.\n *\n * @param base64 - The Base64 string used to create the `Bytes` object.\n */ static fromBase64String(e) {\n try {\n return new Bytes(ByteString.fromBase64String(e));\n } catch (e) {\n throw new FirestoreError(D.INVALID_ARGUMENT, \"Failed to construct data from Base64 string: \" + e);\n }\n }\n /**\n * Creates a new `Bytes` object from the given Uint8Array.\n *\n * @param array - The Uint8Array used to create the `Bytes` object.\n */ static fromUint8Array(e) {\n return new Bytes(ByteString.fromUint8Array(e));\n }\n /**\n * Returns the underlying bytes as a Base64-encoded string.\n *\n * @returns The Base64-encoded string created from the `Bytes` object.\n */ toBase64() {\n return this._byteString.toBase64();\n }\n /**\n * Returns the underlying bytes in a new `Uint8Array`.\n *\n * @returns The Uint8Array created from the `Bytes` object.\n */ toUint8Array() {\n return this._byteString.toUint8Array();\n }\n /**\n * Returns a string representation of the `Bytes` object.\n *\n * @returns A string representation of the `Bytes` object.\n */ toString() {\n return \"Bytes(base64: \" + this.toBase64() + \")\";\n }\n /**\n * Returns true if this `Bytes` object is equal to the provided one.\n *\n * @param other - The `Bytes` object to compare against.\n * @returns true if this `Bytes` object is equal to the provided one.\n */ isEqual(e) {\n return this._byteString.isEqual(e._byteString);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A `FieldPath` refers to a field in a document. The path may consist of a\n * single field name (referring to a top-level field in the document), or a\n * list of field names (referring to a nested field in the document).\n *\n * Create a `FieldPath` by providing field names. If more than one field\n * name is provided, the path will point to a nested field in a document.\n */ class FieldPath {\n /**\n * Creates a `FieldPath` from the provided field names. If more than one field\n * name is provided, the path will point to a nested field in a document.\n *\n * @param fieldNames - A list of field names.\n */\n constructor(...e) {\n for (let t = 0; t < e.length; ++t) if (0 === e[t].length) throw new FirestoreError(D.INVALID_ARGUMENT, \"Invalid field name at argument $(i + 1). Field names must not be empty.\");\n this._internalPath = new FieldPath$1(e);\n }\n /**\n * Returns true if this `FieldPath` is equal to the provided one.\n *\n * @param other - The `FieldPath` to compare against.\n * @returns true if this `FieldPath` is equal to the provided one.\n */ isEqual(e) {\n return this._internalPath.isEqual(e._internalPath);\n }\n}\n\n/**\n * Returns a special sentinel `FieldPath` to refer to the ID of a document.\n * It can be used in queries to sort or filter by the document ID.\n */ function documentId() {\n return new FieldPath(\"__name__\");\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Sentinel values that can be used when writing document fields with `set()`\n * or `update()`.\n */ class FieldValue {\n /**\n * @param _methodName - The public API endpoint that returns this class.\n * @hideconstructor\n */\n constructor(e) {\n this._methodName = e;\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * An immutable object representing a geographic location in Firestore. The\n * location is represented as latitude/longitude pair.\n *\n * Latitude values are in the range of [-90, 90].\n * Longitude values are in the range of [-180, 180].\n */ class GeoPoint {\n /**\n * Creates a new immutable `GeoPoint` object with the provided latitude and\n * longitude values.\n * @param latitude - The latitude as number between -90 and 90.\n * @param longitude - The longitude as number between -180 and 180.\n */\n constructor(e, t) {\n if (!isFinite(e) || e < -90 || e > 90) throw new FirestoreError(D.INVALID_ARGUMENT, \"Latitude must be a number between -90 and 90, but was: \" + e);\n if (!isFinite(t) || t < -180 || t > 180) throw new FirestoreError(D.INVALID_ARGUMENT, \"Longitude must be a number between -180 and 180, but was: \" + t);\n this._lat = e, this._long = t;\n }\n /**\n * The latitude of this `GeoPoint` instance.\n */ get latitude() {\n return this._lat;\n }\n /**\n * The longitude of this `GeoPoint` instance.\n */ get longitude() {\n return this._long;\n }\n /**\n * Returns true if this `GeoPoint` is equal to the provided one.\n *\n * @param other - The `GeoPoint` to compare against.\n * @returns true if this `GeoPoint` is equal to the provided one.\n */ isEqual(e) {\n return this._lat === e._lat && this._long === e._long;\n }\n /** Returns a JSON-serializable representation of this GeoPoint. */ toJSON() {\n return {\n latitude: this._lat,\n longitude: this._long\n };\n }\n /**\n * Actually private to JS consumers of our API, so this function is prefixed\n * with an underscore.\n */ _compareTo(e) {\n return __PRIVATE_primitiveComparator(this._lat, e._lat) || __PRIVATE_primitiveComparator(this._long, e._long);\n }\n}\n\n/**\n * @license\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Represents a vector type in Firestore documents.\n * Create an instance with {@link FieldValue.vector}.\n *\n * @class VectorValue\n */ class VectorValue {\n /**\n * @private\n * @internal\n */\n constructor(e) {\n // Making a copy of the parameter.\n this._values = (e || []).map((e => e));\n }\n /**\n * Returns a copy of the raw number array form of the vector.\n */ toArray() {\n return this._values.map((e => e));\n }\n /**\n * Returns `true` if the two VectorValue has the same raw number arrays, returns `false` otherwise.\n */ isEqual(e) {\n return function __PRIVATE_isPrimitiveArrayEqual(e, t) {\n if (e.length !== t.length) return !1;\n for (let n = 0; n < e.length; ++n) if (e[n] !== t[n]) return !1;\n return !0;\n }(this._values, e._values);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const be = /^__.*__$/;\n\n/** The result of parsing document data (e.g. for a setData call). */ class ParsedSetData {\n constructor(e, t, n) {\n this.data = e, this.fieldMask = t, this.fieldTransforms = n;\n }\n toMutation(e, t) {\n return null !== this.fieldMask ? new __PRIVATE_PatchMutation(e, this.data, this.fieldMask, t, this.fieldTransforms) : new __PRIVATE_SetMutation(e, this.data, t, this.fieldTransforms);\n }\n}\n\n/** The result of parsing \"update\" data (i.e. for an updateData call). */ class ParsedUpdateData {\n constructor(e, \n // The fieldMask does not include document transforms.\n t, n) {\n this.data = e, this.fieldMask = t, this.fieldTransforms = n;\n }\n toMutation(e, t) {\n return new __PRIVATE_PatchMutation(e, this.data, this.fieldMask, t, this.fieldTransforms);\n }\n}\n\nfunction __PRIVATE_isWrite(e) {\n switch (e) {\n case 0 /* UserDataSource.Set */ :\n // fall through\n case 2 /* UserDataSource.MergeSet */ :\n // fall through\n case 1 /* UserDataSource.Update */ :\n return !0;\n\n case 3 /* UserDataSource.Argument */ :\n case 4 /* UserDataSource.ArrayArgument */ :\n return !1;\n\n default:\n throw fail();\n }\n}\n\n/** A \"context\" object passed around while parsing user data. */ class __PRIVATE_ParseContextImpl {\n /**\n * Initializes a ParseContext with the given source and path.\n *\n * @param settings - The settings for the parser.\n * @param databaseId - The database ID of the Firestore instance.\n * @param serializer - The serializer to use to generate the Value proto.\n * @param ignoreUndefinedProperties - Whether to ignore undefined properties\n * rather than throw.\n * @param fieldTransforms - A mutable list of field transforms encountered\n * while parsing the data.\n * @param fieldMask - A mutable list of field paths encountered while parsing\n * the data.\n *\n * TODO(b/34871131): We don't support array paths right now, so path can be\n * null to indicate the context represents any location within an array (in\n * which case certain features will not work and errors will be somewhat\n * compromised).\n */\n constructor(e, t, n, r, i, s) {\n this.settings = e, this.databaseId = t, this.serializer = n, this.ignoreUndefinedProperties = r, \n // Minor hack: If fieldTransforms is undefined, we assume this is an\n // external call and we need to validate the entire path.\n void 0 === i && this.vu(), this.fieldTransforms = i || [], this.fieldMask = s || [];\n }\n get path() {\n return this.settings.path;\n }\n get Cu() {\n return this.settings.Cu;\n }\n /** Returns a new context with the specified settings overwritten. */ Fu(e) {\n return new __PRIVATE_ParseContextImpl(Object.assign(Object.assign({}, this.settings), e), this.databaseId, this.serializer, this.ignoreUndefinedProperties, this.fieldTransforms, this.fieldMask);\n }\n Mu(e) {\n var t;\n const n = null === (t = this.path) || void 0 === t ? void 0 : t.child(e), r = this.Fu({\n path: n,\n xu: !1\n });\n return r.Ou(e), r;\n }\n Nu(e) {\n var t;\n const n = null === (t = this.path) || void 0 === t ? void 0 : t.child(e), r = this.Fu({\n path: n,\n xu: !1\n });\n return r.vu(), r;\n }\n Lu(e) {\n // TODO(b/34871131): We don't support array paths right now; so make path\n // undefined.\n return this.Fu({\n path: void 0,\n xu: !0\n });\n }\n Bu(e) {\n return __PRIVATE_createError(e, this.settings.methodName, this.settings.ku || !1, this.path, this.settings.qu);\n }\n /** Returns 'true' if 'fieldPath' was traversed when creating this context. */ contains(e) {\n return void 0 !== this.fieldMask.find((t => e.isPrefixOf(t))) || void 0 !== this.fieldTransforms.find((t => e.isPrefixOf(t.field)));\n }\n vu() {\n // TODO(b/34871131): Remove null check once we have proper paths for fields\n // within arrays.\n if (this.path) for (let e = 0; e < this.path.length; e++) this.Ou(this.path.get(e));\n }\n Ou(e) {\n if (0 === e.length) throw this.Bu(\"Document fields must not be empty\");\n if (__PRIVATE_isWrite(this.Cu) && be.test(e)) throw this.Bu('Document fields cannot begin and end with \"__\"');\n }\n}\n\n/**\n * Helper for parsing raw user input (provided via the API) into internal model\n * classes.\n */ class __PRIVATE_UserDataReader {\n constructor(e, t, n) {\n this.databaseId = e, this.ignoreUndefinedProperties = t, this.serializer = n || __PRIVATE_newSerializer(e);\n }\n /** Creates a new top-level parse context. */ Qu(e, t, n, r = !1) {\n return new __PRIVATE_ParseContextImpl({\n Cu: e,\n methodName: t,\n qu: n,\n path: FieldPath$1.emptyPath(),\n xu: !1,\n ku: r\n }, this.databaseId, this.serializer, this.ignoreUndefinedProperties);\n }\n}\n\nfunction __PRIVATE_newUserDataReader(e) {\n const t = e._freezeSettings(), n = __PRIVATE_newSerializer(e._databaseId);\n return new __PRIVATE_UserDataReader(e._databaseId, !!t.ignoreUndefinedProperties, n);\n}\n\n/** Parse document data from a set() call. */ function __PRIVATE_parseSetData(e, t, n, r, i, s = {}) {\n const o = e.Qu(s.merge || s.mergeFields ? 2 /* UserDataSource.MergeSet */ : 0 /* UserDataSource.Set */ , t, n, i);\n __PRIVATE_validatePlainObject(\"Data must be an object, but it was:\", o, r);\n const _ = __PRIVATE_parseObject(r, o);\n let a, u;\n if (s.merge) a = new FieldMask(o.fieldMask), u = o.fieldTransforms; else if (s.mergeFields) {\n const e = [];\n for (const r of s.mergeFields) {\n const i = __PRIVATE_fieldPathFromArgument$1(t, r, n);\n if (!o.contains(i)) throw new FirestoreError(D.INVALID_ARGUMENT, `Field '${i}' is specified in your field mask but missing from your input data.`);\n __PRIVATE_fieldMaskContains(e, i) || e.push(i);\n }\n a = new FieldMask(e), u = o.fieldTransforms.filter((e => a.covers(e.field)));\n } else a = null, u = o.fieldTransforms;\n return new ParsedSetData(new ObjectValue(_), a, u);\n}\n\nclass __PRIVATE_DeleteFieldValueImpl extends FieldValue {\n _toFieldTransform(e) {\n if (2 /* UserDataSource.MergeSet */ !== e.Cu) throw 1 /* UserDataSource.Update */ === e.Cu ? e.Bu(`${this._methodName}() can only appear at the top level of your update data`) : e.Bu(`${this._methodName}() cannot be used with set() unless you pass {merge:true}`);\n // No transform to add for a delete, but we need to add it to our\n // fieldMask so it gets deleted.\n return e.fieldMask.push(e.path), null;\n }\n isEqual(e) {\n return e instanceof __PRIVATE_DeleteFieldValueImpl;\n }\n}\n\n/**\n * Creates a child context for parsing SerializableFieldValues.\n *\n * This is different than calling `ParseContext.contextWith` because it keeps\n * the fieldTransforms and fieldMask separate.\n *\n * The created context has its `dataSource` set to `UserDataSource.Argument`.\n * Although these values are used with writes, any elements in these FieldValues\n * are not considered writes since they cannot contain any FieldValue sentinels,\n * etc.\n *\n * @param fieldValue - The sentinel FieldValue for which to create a child\n * context.\n * @param context - The parent context.\n * @param arrayElement - Whether or not the FieldValue has an array.\n */ function __PRIVATE_createSentinelChildContext(e, t, n) {\n return new __PRIVATE_ParseContextImpl({\n Cu: 3 /* UserDataSource.Argument */ ,\n qu: t.settings.qu,\n methodName: e._methodName,\n xu: n\n }, t.databaseId, t.serializer, t.ignoreUndefinedProperties);\n}\n\nclass __PRIVATE_ServerTimestampFieldValueImpl extends FieldValue {\n _toFieldTransform(e) {\n return new FieldTransform(e.path, new __PRIVATE_ServerTimestampTransform);\n }\n isEqual(e) {\n return e instanceof __PRIVATE_ServerTimestampFieldValueImpl;\n }\n}\n\nclass __PRIVATE_ArrayUnionFieldValueImpl extends FieldValue {\n constructor(e, t) {\n super(e), this.Ku = t;\n }\n _toFieldTransform(e) {\n const t = __PRIVATE_createSentinelChildContext(this, e, \n /*array=*/ !0), n = this.Ku.map((e => __PRIVATE_parseData(e, t))), r = new __PRIVATE_ArrayUnionTransformOperation(n);\n return new FieldTransform(e.path, r);\n }\n isEqual(e) {\n return e instanceof __PRIVATE_ArrayUnionFieldValueImpl && deepEqual(this.Ku, e.Ku);\n }\n}\n\nclass __PRIVATE_ArrayRemoveFieldValueImpl extends FieldValue {\n constructor(e, t) {\n super(e), this.Ku = t;\n }\n _toFieldTransform(e) {\n const t = __PRIVATE_createSentinelChildContext(this, e, \n /*array=*/ !0), n = this.Ku.map((e => __PRIVATE_parseData(e, t))), r = new __PRIVATE_ArrayRemoveTransformOperation(n);\n return new FieldTransform(e.path, r);\n }\n isEqual(e) {\n return e instanceof __PRIVATE_ArrayRemoveFieldValueImpl && deepEqual(this.Ku, e.Ku);\n }\n}\n\nclass __PRIVATE_NumericIncrementFieldValueImpl extends FieldValue {\n constructor(e, t) {\n super(e), this.$u = t;\n }\n _toFieldTransform(e) {\n const t = new __PRIVATE_NumericIncrementTransformOperation(e.serializer, toNumber(e.serializer, this.$u));\n return new FieldTransform(e.path, t);\n }\n isEqual(e) {\n return e instanceof __PRIVATE_NumericIncrementFieldValueImpl && this.$u === e.$u;\n }\n}\n\n/** Parse update data from an update() call. */ function __PRIVATE_parseUpdateData(e, t, n, r) {\n const i = e.Qu(1 /* UserDataSource.Update */ , t, n);\n __PRIVATE_validatePlainObject(\"Data must be an object, but it was:\", i, r);\n const s = [], o = ObjectValue.empty();\n forEach(r, ((e, r) => {\n const _ = __PRIVATE_fieldPathFromDotSeparatedString(t, e, n);\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n r = getModularInstance(r);\n const a = i.Nu(_);\n if (r instanceof __PRIVATE_DeleteFieldValueImpl) \n // Add it to the field mask, but don't add anything to updateData.\n s.push(_); else {\n const e = __PRIVATE_parseData(r, a);\n null != e && (s.push(_), o.set(_, e));\n }\n }));\n const _ = new FieldMask(s);\n return new ParsedUpdateData(o, _, i.fieldTransforms);\n}\n\n/** Parse update data from a list of field/value arguments. */ function __PRIVATE_parseUpdateVarargs(e, t, n, r, i, s) {\n const o = e.Qu(1 /* UserDataSource.Update */ , t, n), _ = [ __PRIVATE_fieldPathFromArgument$1(t, r, n) ], a = [ i ];\n if (s.length % 2 != 0) throw new FirestoreError(D.INVALID_ARGUMENT, `Function ${t}() needs to be called with an even number of arguments that alternate between field names and values.`);\n for (let e = 0; e < s.length; e += 2) _.push(__PRIVATE_fieldPathFromArgument$1(t, s[e])), \n a.push(s[e + 1]);\n const u = [], c = ObjectValue.empty();\n // We iterate in reverse order to pick the last value for a field if the\n // user specified the field multiple times.\n for (let e = _.length - 1; e >= 0; --e) if (!__PRIVATE_fieldMaskContains(u, _[e])) {\n const t = _[e];\n let n = a[e];\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n n = getModularInstance(n);\n const r = o.Nu(t);\n if (n instanceof __PRIVATE_DeleteFieldValueImpl) \n // Add it to the field mask, but don't add anything to updateData.\n u.push(t); else {\n const e = __PRIVATE_parseData(n, r);\n null != e && (u.push(t), c.set(t, e));\n }\n }\n const l = new FieldMask(u);\n return new ParsedUpdateData(c, l, o.fieldTransforms);\n}\n\n/**\n * Parse a \"query value\" (e.g. value in a where filter or a value in a cursor\n * bound).\n *\n * @param allowArrays - Whether the query value is an array that may directly\n * contain additional arrays (e.g. the operand of an `in` query).\n */ function __PRIVATE_parseQueryValue(e, t, n, r = !1) {\n return __PRIVATE_parseData(n, e.Qu(r ? 4 /* UserDataSource.ArrayArgument */ : 3 /* UserDataSource.Argument */ , t));\n}\n\n/**\n * Parses user data to Protobuf Values.\n *\n * @param input - Data to be parsed.\n * @param context - A context object representing the current path being parsed,\n * the source of the data being parsed, etc.\n * @returns The parsed value, or null if the value was a FieldValue sentinel\n * that should not be included in the resulting parsed data.\n */ function __PRIVATE_parseData(e, t) {\n if (__PRIVATE_looksLikeJsonObject(\n // Unwrap the API type from the Compat SDK. This will return the API type\n // from firestore-exp.\n e = getModularInstance(e))) return __PRIVATE_validatePlainObject(\"Unsupported field value:\", t, e), \n __PRIVATE_parseObject(e, t);\n if (e instanceof FieldValue) \n // FieldValues usually parse into transforms (except deleteField())\n // in which case we do not want to include this field in our parsed data\n // (as doing so will overwrite the field directly prior to the transform\n // trying to transform it). So we don't add this location to\n // context.fieldMask and we return null as our parsing result.\n /**\n * \"Parses\" the provided FieldValueImpl, adding any necessary transforms to\n * context.fieldTransforms.\n */\n return function __PRIVATE_parseSentinelFieldValue(e, t) {\n // Sentinels are only supported with writes, and not within arrays.\n if (!__PRIVATE_isWrite(t.Cu)) throw t.Bu(`${e._methodName}() can only be used with update() and set()`);\n if (!t.path) throw t.Bu(`${e._methodName}() is not currently supported inside arrays`);\n const n = e._toFieldTransform(t);\n n && t.fieldTransforms.push(n);\n }\n /**\n * Helper to parse a scalar value (i.e. not an Object, Array, or FieldValue)\n *\n * @returns The parsed value\n */ (e, t), null;\n if (void 0 === e && t.ignoreUndefinedProperties) \n // If the input is undefined it can never participate in the fieldMask, so\n // don't handle this below. If `ignoreUndefinedProperties` is false,\n // `parseScalarValue` will reject an undefined value.\n return null;\n if (\n // If context.path is null we are inside an array and we don't support\n // field mask paths more granular than the top-level array.\n t.path && t.fieldMask.push(t.path), e instanceof Array) {\n // TODO(b/34871131): Include the path containing the array in the error\n // message.\n // In the case of IN queries, the parsed data is an array (representing\n // the set of values to be included for the IN query) that may directly\n // contain additional arrays (each representing an individual field\n // value), so we disable this validation.\n if (t.settings.xu && 4 /* UserDataSource.ArrayArgument */ !== t.Cu) throw t.Bu(\"Nested arrays are not supported\");\n return function __PRIVATE_parseArray(e, t) {\n const n = [];\n let r = 0;\n for (const i of e) {\n let e = __PRIVATE_parseData(i, t.Lu(r));\n null == e && (\n // Just include nulls in the array for fields being replaced with a\n // sentinel.\n e = {\n nullValue: \"NULL_VALUE\"\n }), n.push(e), r++;\n }\n return {\n arrayValue: {\n values: n\n }\n };\n }(e, t);\n }\n return function __PRIVATE_parseScalarValue(e, t) {\n if (null === (e = getModularInstance(e))) return {\n nullValue: \"NULL_VALUE\"\n };\n if (\"number\" == typeof e) return toNumber(t.serializer, e);\n if (\"boolean\" == typeof e) return {\n booleanValue: e\n };\n if (\"string\" == typeof e) return {\n stringValue: e\n };\n if (e instanceof Date) {\n const n = Timestamp.fromDate(e);\n return {\n timestampValue: toTimestamp(t.serializer, n)\n };\n }\n if (e instanceof Timestamp) {\n // Firestore backend truncates precision down to microseconds. To ensure\n // offline mode works the same with regards to truncation, perform the\n // truncation immediately without waiting for the backend to do that.\n const n = new Timestamp(e.seconds, 1e3 * Math.floor(e.nanoseconds / 1e3));\n return {\n timestampValue: toTimestamp(t.serializer, n)\n };\n }\n if (e instanceof GeoPoint) return {\n geoPointValue: {\n latitude: e.latitude,\n longitude: e.longitude\n }\n };\n if (e instanceof Bytes) return {\n bytesValue: __PRIVATE_toBytes(t.serializer, e._byteString)\n };\n if (e instanceof DocumentReference) {\n const n = t.databaseId, r = e.firestore._databaseId;\n if (!r.isEqual(n)) throw t.Bu(`Document reference is for database ${r.projectId}/${r.database} but should be for database ${n.projectId}/${n.database}`);\n return {\n referenceValue: __PRIVATE_toResourceName(e.firestore._databaseId || t.databaseId, e._key.path)\n };\n }\n if (e instanceof VectorValue) \n /**\n * Creates a new VectorValue proto value (using the internal format).\n */\n return function __PRIVATE_parseVectorValue(e, t) {\n return {\n mapValue: {\n fields: {\n __type__: {\n stringValue: \"__vector__\"\n },\n value: {\n arrayValue: {\n values: e.toArray().map((e => {\n if (\"number\" != typeof e) throw t.Bu(\"VectorValues must only contain numeric values.\");\n return __PRIVATE_toDouble(t.serializer, e);\n }))\n }\n }\n }\n }\n };\n }\n /**\n * Checks whether an object looks like a JSON object that should be converted\n * into a struct. Normal class/prototype instances are considered to look like\n * JSON objects since they should be converted to a struct value. Arrays, Dates,\n * GeoPoints, etc. are not considered to look like JSON objects since they map\n * to specific FieldValue types other than ObjectValue.\n */ (e, t);\n throw t.Bu(`Unsupported field value: ${__PRIVATE_valueDescription(e)}`);\n }(e, t);\n}\n\nfunction __PRIVATE_parseObject(e, t) {\n const n = {};\n return isEmpty(e) ? \n // If we encounter an empty object, we explicitly add it to the update\n // mask to ensure that the server creates a map entry.\n t.path && t.path.length > 0 && t.fieldMask.push(t.path) : forEach(e, ((e, r) => {\n const i = __PRIVATE_parseData(r, t.Mu(e));\n null != i && (n[e] = i);\n })), {\n mapValue: {\n fields: n\n }\n };\n}\n\nfunction __PRIVATE_looksLikeJsonObject(e) {\n return !(\"object\" != typeof e || null === e || e instanceof Array || e instanceof Date || e instanceof Timestamp || e instanceof GeoPoint || e instanceof Bytes || e instanceof DocumentReference || e instanceof FieldValue || e instanceof VectorValue);\n}\n\nfunction __PRIVATE_validatePlainObject(e, t, n) {\n if (!__PRIVATE_looksLikeJsonObject(n) || !function __PRIVATE_isPlainObject(e) {\n return \"object\" == typeof e && null !== e && (Object.getPrototypeOf(e) === Object.prototype || null === Object.getPrototypeOf(e));\n }(n)) {\n const r = __PRIVATE_valueDescription(n);\n throw \"an object\" === r ? t.Bu(e + \" a custom object\") : t.Bu(e + \" \" + r);\n }\n}\n\n/**\n * Helper that calls fromDotSeparatedString() but wraps any error thrown.\n */ function __PRIVATE_fieldPathFromArgument$1(e, t, n) {\n if ((\n // If required, replace the FieldPath Compat class with the firestore-exp\n // FieldPath.\n t = getModularInstance(t)) instanceof FieldPath) return t._internalPath;\n if (\"string\" == typeof t) return __PRIVATE_fieldPathFromDotSeparatedString(e, t);\n throw __PRIVATE_createError(\"Field path arguments must be of type string or \", e, \n /* hasConverter= */ !1, \n /* path= */ void 0, n);\n}\n\n/**\n * Matches any characters in a field path string that are reserved.\n */ const De = new RegExp(\"[~\\\\*/\\\\[\\\\]]\");\n\n/**\n * Wraps fromDotSeparatedString with an error message about the method that\n * was thrown.\n * @param methodName - The publicly visible method name\n * @param path - The dot-separated string form of a field path which will be\n * split on dots.\n * @param targetDoc - The document against which the field path will be\n * evaluated.\n */ function __PRIVATE_fieldPathFromDotSeparatedString(e, t, n) {\n if (t.search(De) >= 0) throw __PRIVATE_createError(`Invalid field path (${t}). Paths must not contain '~', '*', '/', '[', or ']'`, e, \n /* hasConverter= */ !1, \n /* path= */ void 0, n);\n try {\n return new FieldPath(...t.split(\".\"))._internalPath;\n } catch (r) {\n throw __PRIVATE_createError(`Invalid field path (${t}). Paths must not be empty, begin with '.', end with '.', or contain '..'`, e, \n /* hasConverter= */ !1, \n /* path= */ void 0, n);\n }\n}\n\nfunction __PRIVATE_createError(e, t, n, r, i) {\n const s = r && !r.isEmpty(), o = void 0 !== i;\n let _ = `Function ${t}() called with invalid data`;\n n && (_ += \" (via `toFirestore()`)\"), _ += \". \";\n let a = \"\";\n return (s || o) && (a += \" (found\", s && (a += ` in field ${r}`), o && (a += ` in document ${i}`), \n a += \")\"), new FirestoreError(D.INVALID_ARGUMENT, _ + e + a);\n}\n\n/** Checks `haystack` if FieldPath `needle` is present. Runs in O(n). */ function __PRIVATE_fieldMaskContains(e, t) {\n return e.some((e => e.isEqual(t)));\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A `DocumentSnapshot` contains data read from a document in your Firestore\n * database. The data can be extracted with `.data()` or `.get()` to\n * get a specific field.\n *\n * For a `DocumentSnapshot` that points to a non-existing document, any data\n * access will return 'undefined'. You can use the `exists()` method to\n * explicitly verify a document's existence.\n */ class DocumentSnapshot$1 {\n // Note: This class is stripped down version of the DocumentSnapshot in\n // the legacy SDK. The changes are:\n // - No support for SnapshotMetadata.\n // - No support for SnapshotOptions.\n /** @hideconstructor protected */\n constructor(e, t, n, r, i) {\n this._firestore = e, this._userDataWriter = t, this._key = n, this._document = r, \n this._converter = i;\n }\n /** Property of the `DocumentSnapshot` that provides the document's ID. */ get id() {\n return this._key.path.lastSegment();\n }\n /**\n * The `DocumentReference` for the document included in the `DocumentSnapshot`.\n */ get ref() {\n return new DocumentReference(this._firestore, this._converter, this._key);\n }\n /**\n * Signals whether or not the document at the snapshot's location exists.\n *\n * @returns true if the document exists.\n */ exists() {\n return null !== this._document;\n }\n /**\n * Retrieves all fields in the document as an `Object`. Returns `undefined` if\n * the document doesn't exist.\n *\n * @returns An `Object` containing all fields in the document or `undefined`\n * if the document doesn't exist.\n */ data() {\n if (this._document) {\n if (this._converter) {\n // We only want to use the converter and create a new DocumentSnapshot\n // if a converter has been provided.\n const e = new QueryDocumentSnapshot$1(this._firestore, this._userDataWriter, this._key, this._document, \n /* converter= */ null);\n return this._converter.fromFirestore(e);\n }\n return this._userDataWriter.convertValue(this._document.data.value);\n }\n }\n /**\n * Retrieves the field specified by `fieldPath`. Returns `undefined` if the\n * document or field doesn't exist.\n *\n * @param fieldPath - The path (for example 'foo' or 'foo.bar') to a specific\n * field.\n * @returns The data at the specified field location or undefined if no such\n * field exists in the document.\n */\n // We are using `any` here to avoid an explicit cast by our users.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(e) {\n if (this._document) {\n const t = this._document.data.field(__PRIVATE_fieldPathFromArgument(\"DocumentSnapshot.get\", e));\n if (null !== t) return this._userDataWriter.convertValue(t);\n }\n }\n}\n\n/**\n * A `QueryDocumentSnapshot` contains data read from a document in your\n * Firestore database as part of a query. The document is guaranteed to exist\n * and its data can be extracted with `.data()` or `.get()` to get a\n * specific field.\n *\n * A `QueryDocumentSnapshot` offers the same API surface as a\n * `DocumentSnapshot`. Since query results contain only existing documents, the\n * `exists` property will always be true and `data()` will never return\n * 'undefined'.\n */ class QueryDocumentSnapshot$1 extends DocumentSnapshot$1 {\n /**\n * Retrieves all fields in the document as an `Object`.\n *\n * @override\n * @returns An `Object` containing all fields in the document.\n */\n data() {\n return super.data();\n }\n}\n\n/**\n * Helper that calls `fromDotSeparatedString()` but wraps any error thrown.\n */ function __PRIVATE_fieldPathFromArgument(e, t) {\n return \"string\" == typeof t ? __PRIVATE_fieldPathFromDotSeparatedString(e, t) : t instanceof FieldPath ? t._internalPath : t._delegate._internalPath;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ function __PRIVATE_validateHasExplicitOrderByForLimitToLast(e) {\n if (\"L\" /* LimitType.Last */ === e.limitType && 0 === e.explicitOrderBy.length) throw new FirestoreError(D.UNIMPLEMENTED, \"limitToLast() queries require specifying at least one orderBy() clause\");\n}\n\n/**\n * An `AppliableConstraint` is an abstraction of a constraint that can be applied\n * to a Firestore query.\n */ class AppliableConstraint {}\n\n/**\n * A `QueryConstraint` is used to narrow the set of documents returned by a\n * Firestore query. `QueryConstraint`s are created by invoking {@link where},\n * {@link orderBy}, {@link (startAt:1)}, {@link (startAfter:1)}, {@link\n * (endBefore:1)}, {@link (endAt:1)}, {@link limit}, {@link limitToLast} and\n * can then be passed to {@link (query:1)} to create a new query instance that\n * also contains this `QueryConstraint`.\n */ class QueryConstraint extends AppliableConstraint {}\n\nfunction query(e, t, ...n) {\n let r = [];\n t instanceof AppliableConstraint && r.push(t), r = r.concat(n), function __PRIVATE_validateQueryConstraintArray(e) {\n const t = e.filter((e => e instanceof QueryCompositeFilterConstraint)).length, n = e.filter((e => e instanceof QueryFieldFilterConstraint)).length;\n if (t > 1 || t > 0 && n > 0) throw new FirestoreError(D.INVALID_ARGUMENT, \"InvalidQuery. When using composite filters, you cannot use more than one filter at the top level. Consider nesting the multiple filters within an `and(...)` statement. For example: change `query(query, where(...), or(...))` to `query(query, and(where(...), or(...)))`.\");\n }\n /**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /**\n * Converts Firestore's internal types to the JavaScript types that we expose\n * to the user.\n *\n * @internal\n */ (r);\n for (const t of r) e = t._apply(e);\n return e;\n}\n\n/**\n * A `QueryFieldFilterConstraint` is used to narrow the set of documents returned by\n * a Firestore query by filtering on one or more document fields.\n * `QueryFieldFilterConstraint`s are created by invoking {@link where} and can then\n * be passed to {@link (query:1)} to create a new query instance that also contains\n * this `QueryFieldFilterConstraint`.\n */ class QueryFieldFilterConstraint extends QueryConstraint {\n /**\n * @internal\n */\n constructor(e, t, n) {\n super(), this._field = e, this._op = t, this._value = n, \n /** The type of this query constraint */\n this.type = \"where\";\n }\n static _create(e, t, n) {\n return new QueryFieldFilterConstraint(e, t, n);\n }\n _apply(e) {\n const t = this._parse(e);\n return __PRIVATE_validateNewFieldFilter(e._query, t), new Query(e.firestore, e.converter, __PRIVATE_queryWithAddedFilter(e._query, t));\n }\n _parse(e) {\n const t = __PRIVATE_newUserDataReader(e.firestore), n = function __PRIVATE_newQueryFilter(e, t, n, r, i, s, o) {\n let _;\n if (i.isKeyField()) {\n if (\"array-contains\" /* Operator.ARRAY_CONTAINS */ === s || \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ === s) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid Query. You can't perform '${s}' queries on documentId().`);\n if (\"in\" /* Operator.IN */ === s || \"not-in\" /* Operator.NOT_IN */ === s) {\n __PRIVATE_validateDisjunctiveFilterElements(o, s);\n const t = [];\n for (const n of o) t.push(__PRIVATE_parseDocumentIdValue(r, e, n));\n _ = {\n arrayValue: {\n values: t\n }\n };\n } else _ = __PRIVATE_parseDocumentIdValue(r, e, o);\n } else \"in\" /* Operator.IN */ !== s && \"not-in\" /* Operator.NOT_IN */ !== s && \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ !== s || __PRIVATE_validateDisjunctiveFilterElements(o, s), \n _ = __PRIVATE_parseQueryValue(n, t, o, \n /* allowArrays= */ \"in\" /* Operator.IN */ === s || \"not-in\" /* Operator.NOT_IN */ === s);\n return FieldFilter.create(i, s, _);\n }(e._query, \"where\", t, e.firestore._databaseId, this._field, this._op, this._value);\n return n;\n }\n}\n\n/**\n * Creates a {@link QueryFieldFilterConstraint} that enforces that documents\n * must contain the specified field and that the value should satisfy the\n * relation constraint provided.\n *\n * @param fieldPath - The path to compare\n * @param opStr - The operation string (e.g \"<\", \"<=\", \"==\", \"<\",\n * \"<=\", \"!=\").\n * @param value - The value for comparison\n * @returns The created {@link QueryFieldFilterConstraint}.\n */ function where(e, t, n) {\n const r = t, i = __PRIVATE_fieldPathFromArgument(\"where\", e);\n return QueryFieldFilterConstraint._create(i, r, n);\n}\n\n/**\n * A `QueryCompositeFilterConstraint` is used to narrow the set of documents\n * returned by a Firestore query by performing the logical OR or AND of multiple\n * {@link QueryFieldFilterConstraint}s or {@link QueryCompositeFilterConstraint}s.\n * `QueryCompositeFilterConstraint`s are created by invoking {@link or} or\n * {@link and} and can then be passed to {@link (query:1)} to create a new query\n * instance that also contains the `QueryCompositeFilterConstraint`.\n */ class QueryCompositeFilterConstraint extends AppliableConstraint {\n /**\n * @internal\n */\n constructor(\n /** The type of this query constraint */\n e, t) {\n super(), this.type = e, this._queryConstraints = t;\n }\n static _create(e, t) {\n return new QueryCompositeFilterConstraint(e, t);\n }\n _parse(e) {\n const t = this._queryConstraints.map((t => t._parse(e))).filter((e => e.getFilters().length > 0));\n return 1 === t.length ? t[0] : CompositeFilter.create(t, this._getOperator());\n }\n _apply(e) {\n const t = this._parse(e);\n return 0 === t.getFilters().length ? e : (function __PRIVATE_validateNewFilter(e, t) {\n let n = e;\n const r = t.getFlattenedFilters();\n for (const e of r) __PRIVATE_validateNewFieldFilter(n, e), n = __PRIVATE_queryWithAddedFilter(n, e);\n }\n // Checks if any of the provided filter operators are included in the given list of filters and\n // returns the first one that is, or null if none are.\n (e._query, t), new Query(e.firestore, e.converter, __PRIVATE_queryWithAddedFilter(e._query, t)));\n }\n _getQueryConstraints() {\n return this._queryConstraints;\n }\n _getOperator() {\n return \"and\" === this.type ? \"and\" /* CompositeOperator.AND */ : \"or\" /* CompositeOperator.OR */;\n }\n}\n\n/**\n * Creates a new {@link QueryCompositeFilterConstraint} that is a disjunction of\n * the given filter constraints. A disjunction filter includes a document if it\n * satisfies any of the given filters.\n *\n * @param queryConstraints - Optional. The list of\n * {@link QueryFilterConstraint}s to perform a disjunction for. These must be\n * created with calls to {@link where}, {@link or}, or {@link and}.\n * @returns The newly created {@link QueryCompositeFilterConstraint}.\n */ function or(...e) {\n // Only support QueryFilterConstraints\n return e.forEach((e => __PRIVATE_validateQueryFilterConstraint(\"or\", e))), QueryCompositeFilterConstraint._create(\"or\" /* CompositeOperator.OR */ , e);\n}\n\n/**\n * Creates a new {@link QueryCompositeFilterConstraint} that is a conjunction of\n * the given filter constraints. A conjunction filter includes a document if it\n * satisfies all of the given filters.\n *\n * @param queryConstraints - Optional. The list of\n * {@link QueryFilterConstraint}s to perform a conjunction for. These must be\n * created with calls to {@link where}, {@link or}, or {@link and}.\n * @returns The newly created {@link QueryCompositeFilterConstraint}.\n */ function and(...e) {\n // Only support QueryFilterConstraints\n return e.forEach((e => __PRIVATE_validateQueryFilterConstraint(\"and\", e))), QueryCompositeFilterConstraint._create(\"and\" /* CompositeOperator.AND */ , e);\n}\n\n/**\n * A `QueryOrderByConstraint` is used to sort the set of documents returned by a\n * Firestore query. `QueryOrderByConstraint`s are created by invoking\n * {@link orderBy} and can then be passed to {@link (query:1)} to create a new query\n * instance that also contains this `QueryOrderByConstraint`.\n *\n * Note: Documents that do not contain the orderBy field will not be present in\n * the query result.\n */ class QueryOrderByConstraint extends QueryConstraint {\n /**\n * @internal\n */\n constructor(e, t) {\n super(), this._field = e, this._direction = t, \n /** The type of this query constraint */\n this.type = \"orderBy\";\n }\n static _create(e, t) {\n return new QueryOrderByConstraint(e, t);\n }\n _apply(e) {\n const t = function __PRIVATE_newQueryOrderBy(e, t, n) {\n if (null !== e.startAt) throw new FirestoreError(D.INVALID_ARGUMENT, \"Invalid query. You must not call startAt() or startAfter() before calling orderBy().\");\n if (null !== e.endAt) throw new FirestoreError(D.INVALID_ARGUMENT, \"Invalid query. You must not call endAt() or endBefore() before calling orderBy().\");\n return new OrderBy(t, n);\n }\n /**\n * Create a `Bound` from a query and a document.\n *\n * Note that the `Bound` will always include the key of the document\n * and so only the provided document will compare equal to the returned\n * position.\n *\n * Will throw if the document does not contain all fields of the order by\n * of the query or if any of the fields in the order by are an uncommitted\n * server timestamp.\n */ (e._query, this._field, this._direction);\n return new Query(e.firestore, e.converter, function __PRIVATE_queryWithAddedOrderBy(e, t) {\n // TODO(dimond): validate that orderBy does not list the same key twice.\n const n = e.explicitOrderBy.concat([ t ]);\n return new __PRIVATE_QueryImpl(e.path, e.collectionGroup, n, e.filters.slice(), e.limit, e.limitType, e.startAt, e.endAt);\n }(e._query, t));\n }\n}\n\n/**\n * Creates a {@link QueryOrderByConstraint} that sorts the query result by the\n * specified field, optionally in descending order instead of ascending.\n *\n * Note: Documents that do not contain the specified field will not be present\n * in the query result.\n *\n * @param fieldPath - The field to sort by.\n * @param directionStr - Optional direction to sort by ('asc' or 'desc'). If\n * not specified, order will be ascending.\n * @returns The created {@link QueryOrderByConstraint}.\n */ function orderBy(e, t = \"asc\") {\n const n = t, r = __PRIVATE_fieldPathFromArgument(\"orderBy\", e);\n return QueryOrderByConstraint._create(r, n);\n}\n\n/**\n * A `QueryLimitConstraint` is used to limit the number of documents returned by\n * a Firestore query.\n * `QueryLimitConstraint`s are created by invoking {@link limit} or\n * {@link limitToLast} and can then be passed to {@link (query:1)} to create a new\n * query instance that also contains this `QueryLimitConstraint`.\n */ class QueryLimitConstraint extends QueryConstraint {\n /**\n * @internal\n */\n constructor(\n /** The type of this query constraint */\n e, t, n) {\n super(), this.type = e, this._limit = t, this._limitType = n;\n }\n static _create(e, t, n) {\n return new QueryLimitConstraint(e, t, n);\n }\n _apply(e) {\n return new Query(e.firestore, e.converter, __PRIVATE_queryWithLimit(e._query, this._limit, this._limitType));\n }\n}\n\n/**\n * Creates a {@link QueryLimitConstraint} that only returns the first matching\n * documents.\n *\n * @param limit - The maximum number of items to return.\n * @returns The created {@link QueryLimitConstraint}.\n */ function limit(e) {\n return __PRIVATE_validatePositiveNumber(\"limit\", e), QueryLimitConstraint._create(\"limit\", e, \"F\" /* LimitType.First */);\n}\n\n/**\n * Creates a {@link QueryLimitConstraint} that only returns the last matching\n * documents.\n *\n * You must specify at least one `orderBy` clause for `limitToLast` queries,\n * otherwise an exception will be thrown during execution.\n *\n * @param limit - The maximum number of items to return.\n * @returns The created {@link QueryLimitConstraint}.\n */ function limitToLast(e) {\n return __PRIVATE_validatePositiveNumber(\"limitToLast\", e), QueryLimitConstraint._create(\"limitToLast\", e, \"L\" /* LimitType.Last */);\n}\n\n/**\n * A `QueryStartAtConstraint` is used to exclude documents from the start of a\n * result set returned by a Firestore query.\n * `QueryStartAtConstraint`s are created by invoking {@link (startAt:1)} or\n * {@link (startAfter:1)} and can then be passed to {@link (query:1)} to create a\n * new query instance that also contains this `QueryStartAtConstraint`.\n */ class QueryStartAtConstraint extends QueryConstraint {\n /**\n * @internal\n */\n constructor(\n /** The type of this query constraint */\n e, t, n) {\n super(), this.type = e, this._docOrFields = t, this._inclusive = n;\n }\n static _create(e, t, n) {\n return new QueryStartAtConstraint(e, t, n);\n }\n _apply(e) {\n const t = __PRIVATE_newQueryBoundFromDocOrFields(e, this.type, this._docOrFields, this._inclusive);\n return new Query(e.firestore, e.converter, function __PRIVATE_queryWithStartAt(e, t) {\n return new __PRIVATE_QueryImpl(e.path, e.collectionGroup, e.explicitOrderBy.slice(), e.filters.slice(), e.limit, e.limitType, t, e.endAt);\n }(e._query, t));\n }\n}\n\nfunction startAt(...e) {\n return QueryStartAtConstraint._create(\"startAt\", e, \n /*inclusive=*/ !0);\n}\n\nfunction startAfter(...e) {\n return QueryStartAtConstraint._create(\"startAfter\", e, \n /*inclusive=*/ !1);\n}\n\n/**\n * A `QueryEndAtConstraint` is used to exclude documents from the end of a\n * result set returned by a Firestore query.\n * `QueryEndAtConstraint`s are created by invoking {@link (endAt:1)} or\n * {@link (endBefore:1)} and can then be passed to {@link (query:1)} to create a new\n * query instance that also contains this `QueryEndAtConstraint`.\n */ class QueryEndAtConstraint extends QueryConstraint {\n /**\n * @internal\n */\n constructor(\n /** The type of this query constraint */\n e, t, n) {\n super(), this.type = e, this._docOrFields = t, this._inclusive = n;\n }\n static _create(e, t, n) {\n return new QueryEndAtConstraint(e, t, n);\n }\n _apply(e) {\n const t = __PRIVATE_newQueryBoundFromDocOrFields(e, this.type, this._docOrFields, this._inclusive);\n return new Query(e.firestore, e.converter, function __PRIVATE_queryWithEndAt(e, t) {\n return new __PRIVATE_QueryImpl(e.path, e.collectionGroup, e.explicitOrderBy.slice(), e.filters.slice(), e.limit, e.limitType, e.startAt, t);\n }(e._query, t));\n }\n}\n\nfunction endBefore(...e) {\n return QueryEndAtConstraint._create(\"endBefore\", e, \n /*inclusive=*/ !1);\n}\n\nfunction endAt(...e) {\n return QueryEndAtConstraint._create(\"endAt\", e, \n /*inclusive=*/ !0);\n}\n\n/** Helper function to create a bound from a document or fields */ function __PRIVATE_newQueryBoundFromDocOrFields(e, t, n, r) {\n if (n[0] = getModularInstance(n[0]), n[0] instanceof DocumentSnapshot$1) return function __PRIVATE_newQueryBoundFromDocument(e, t, n, r, i) {\n if (!r) throw new FirestoreError(D.NOT_FOUND, `Can't use a DocumentSnapshot that doesn't exist for ${n}().`);\n const s = [];\n // Because people expect to continue/end a query at the exact document\n // provided, we need to use the implicit sort order rather than the explicit\n // sort order, because it's guaranteed to contain the document key. That way\n // the position becomes unambiguous and the query continues/ends exactly at\n // the provided document. Without the key (by using the explicit sort\n // orders), multiple documents could match the position, yielding duplicate\n // results.\n for (const n of __PRIVATE_queryNormalizedOrderBy(e)) if (n.field.isKeyField()) s.push(__PRIVATE_refValue(t, r.key)); else {\n const e = r.data.field(n.field);\n if (__PRIVATE_isServerTimestamp(e)) throw new FirestoreError(D.INVALID_ARGUMENT, 'Invalid query. You are trying to start or end a query using a document for which the field \"' + n.field + '\" is an uncommitted server timestamp. (Since the value of this field is unknown, you cannot start/end a query with it.)');\n if (null === e) {\n const e = n.field.canonicalString();\n throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. You are trying to start or end a query using a document for which the field '${e}' (used as the orderBy) does not exist.`);\n }\n s.push(e);\n }\n return new Bound(s, i);\n }\n /**\n * Converts a list of field values to a `Bound` for the given query.\n */ (e._query, e.firestore._databaseId, t, n[0]._document, r);\n {\n const i = __PRIVATE_newUserDataReader(e.firestore);\n return function __PRIVATE_newQueryBoundFromFields(e, t, n, r, i, s) {\n // Use explicit order by's because it has to match the query the user made\n const o = e.explicitOrderBy;\n if (i.length > o.length) throw new FirestoreError(D.INVALID_ARGUMENT, `Too many arguments provided to ${r}(). The number of arguments must be less than or equal to the number of orderBy() clauses`);\n const _ = [];\n for (let s = 0; s < i.length; s++) {\n const a = i[s];\n if (o[s].field.isKeyField()) {\n if (\"string\" != typeof a) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. Expected a string for document ID in ${r}(), but got a ${typeof a}`);\n if (!__PRIVATE_isCollectionGroupQuery(e) && -1 !== a.indexOf(\"/\")) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. When querying a collection and ordering by documentId(), the value passed to ${r}() must be a plain document ID, but '${a}' contains a slash.`);\n const n = e.path.child(ResourcePath.fromString(a));\n if (!DocumentKey.isDocumentKey(n)) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. When querying a collection group and ordering by documentId(), the value passed to ${r}() must result in a valid document path, but '${n}' is not because it contains an odd number of segments.`);\n const i = new DocumentKey(n);\n _.push(__PRIVATE_refValue(t, i));\n } else {\n const e = __PRIVATE_parseQueryValue(n, r, a);\n _.push(e);\n }\n }\n return new Bound(_, s);\n }\n /**\n * Parses the given `documentIdValue` into a `ReferenceValue`, throwing\n * appropriate errors if the value is anything other than a `DocumentReference`\n * or `string`, or if the string is malformed.\n */ (e._query, e.firestore._databaseId, i, t, n, r);\n }\n}\n\nfunction __PRIVATE_parseDocumentIdValue(e, t, n) {\n if (\"string\" == typeof (n = getModularInstance(n))) {\n if (\"\" === n) throw new FirestoreError(D.INVALID_ARGUMENT, \"Invalid query. When querying with documentId(), you must provide a valid document ID, but it was an empty string.\");\n if (!__PRIVATE_isCollectionGroupQuery(t) && -1 !== n.indexOf(\"/\")) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. When querying a collection by documentId(), you must provide a plain document ID, but '${n}' contains a '/' character.`);\n const r = t.path.child(ResourcePath.fromString(n));\n if (!DocumentKey.isDocumentKey(r)) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. When querying a collection group by documentId(), the value provided must result in a valid document path, but '${r}' is not because it has an odd number of segments (${r.length}).`);\n return __PRIVATE_refValue(e, new DocumentKey(r));\n }\n if (n instanceof DocumentReference) return __PRIVATE_refValue(e, n._key);\n throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. When querying with documentId(), you must provide a valid string or a DocumentReference, but it was: ${__PRIVATE_valueDescription(n)}.`);\n}\n\n/**\n * Validates that the value passed into a disjunctive filter satisfies all\n * array requirements.\n */ function __PRIVATE_validateDisjunctiveFilterElements(e, t) {\n if (!Array.isArray(e) || 0 === e.length) throw new FirestoreError(D.INVALID_ARGUMENT, `Invalid Query. A non-empty array is required for '${t.toString()}' filters.`);\n}\n\n/**\n * Given an operator, returns the set of operators that cannot be used with it.\n *\n * This is not a comprehensive check, and this function should be removed in the\n * long term. Validations should occur in the Firestore backend.\n *\n * Operators in a query must adhere to the following set of rules:\n * 1. Only one inequality per query.\n * 2. `NOT_IN` cannot be used with array, disjunctive, or `NOT_EQUAL` operators.\n */ function __PRIVATE_validateNewFieldFilter(e, t) {\n const n = function __PRIVATE_findOpInsideFilters(e, t) {\n for (const n of e) for (const e of n.getFlattenedFilters()) if (t.indexOf(e.op) >= 0) return e.op;\n return null;\n }(e.filters, function __PRIVATE_conflictingOps(e) {\n switch (e) {\n case \"!=\" /* Operator.NOT_EQUAL */ :\n return [ \"!=\" /* Operator.NOT_EQUAL */ , \"not-in\" /* Operator.NOT_IN */ ];\n\n case \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ :\n case \"in\" /* Operator.IN */ :\n return [ \"not-in\" /* Operator.NOT_IN */ ];\n\n case \"not-in\" /* Operator.NOT_IN */ :\n return [ \"array-contains-any\" /* Operator.ARRAY_CONTAINS_ANY */ , \"in\" /* Operator.IN */ , \"not-in\" /* Operator.NOT_IN */ , \"!=\" /* Operator.NOT_EQUAL */ ];\n\n default:\n return [];\n }\n }(t.op));\n if (null !== n) \n // Special case when it's a duplicate op to give a slightly clearer error message.\n throw n === t.op ? new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. You cannot use more than one '${t.op.toString()}' filter.`) : new FirestoreError(D.INVALID_ARGUMENT, `Invalid query. You cannot use '${t.op.toString()}' filters with '${n.toString()}' filters.`);\n}\n\nfunction __PRIVATE_validateQueryFilterConstraint(e, t) {\n if (!(t instanceof QueryFieldFilterConstraint || t instanceof QueryCompositeFilterConstraint)) throw new FirestoreError(D.INVALID_ARGUMENT, `Function ${e}() requires AppliableConstraints created with a call to 'where(...)', 'or(...)', or 'and(...)'.`);\n}\n\nclass AbstractUserDataWriter {\n convertValue(e, t = \"none\") {\n switch (__PRIVATE_typeOrder(e)) {\n case 0 /* TypeOrder.NullValue */ :\n return null;\n\n case 1 /* TypeOrder.BooleanValue */ :\n return e.booleanValue;\n\n case 2 /* TypeOrder.NumberValue */ :\n return __PRIVATE_normalizeNumber(e.integerValue || e.doubleValue);\n\n case 3 /* TypeOrder.TimestampValue */ :\n return this.convertTimestamp(e.timestampValue);\n\n case 4 /* TypeOrder.ServerTimestampValue */ :\n return this.convertServerTimestamp(e, t);\n\n case 5 /* TypeOrder.StringValue */ :\n return e.stringValue;\n\n case 6 /* TypeOrder.BlobValue */ :\n return this.convertBytes(__PRIVATE_normalizeByteString(e.bytesValue));\n\n case 7 /* TypeOrder.RefValue */ :\n return this.convertReference(e.referenceValue);\n\n case 8 /* TypeOrder.GeoPointValue */ :\n return this.convertGeoPoint(e.geoPointValue);\n\n case 9 /* TypeOrder.ArrayValue */ :\n return this.convertArray(e.arrayValue, t);\n\n case 11 /* TypeOrder.ObjectValue */ :\n return this.convertObject(e.mapValue, t);\n\n case 10 /* TypeOrder.VectorValue */ :\n return this.convertVectorValue(e.mapValue);\n\n default:\n throw fail();\n }\n }\n convertObject(e, t) {\n return this.convertObjectMap(e.fields, t);\n }\n /**\n * @internal\n */ convertObjectMap(e, t = \"none\") {\n const n = {};\n return forEach(e, ((e, r) => {\n n[e] = this.convertValue(r, t);\n })), n;\n }\n /**\n * @internal\n */ convertVectorValue(e) {\n var t, n, r;\n const i = null === (r = null === (n = null === (t = e.fields) || void 0 === t ? void 0 : t.value.arrayValue) || void 0 === n ? void 0 : n.values) || void 0 === r ? void 0 : r.map((e => __PRIVATE_normalizeNumber(e.doubleValue)));\n return new VectorValue(i);\n }\n convertGeoPoint(e) {\n return new GeoPoint(__PRIVATE_normalizeNumber(e.latitude), __PRIVATE_normalizeNumber(e.longitude));\n }\n convertArray(e, t) {\n return (e.values || []).map((e => this.convertValue(e, t)));\n }\n convertServerTimestamp(e, t) {\n switch (t) {\n case \"previous\":\n const n = __PRIVATE_getPreviousValue(e);\n return null == n ? null : this.convertValue(n, t);\n\n case \"estimate\":\n return this.convertTimestamp(__PRIVATE_getLocalWriteTime(e));\n\n default:\n return null;\n }\n }\n convertTimestamp(e) {\n const t = __PRIVATE_normalizeTimestamp(e);\n return new Timestamp(t.seconds, t.nanos);\n }\n convertDocumentKey(e, t) {\n const n = ResourcePath.fromString(e);\n __PRIVATE_hardAssert(__PRIVATE_isValidResourceName(n));\n const r = new DatabaseId(n.get(1), n.get(3)), i = new DocumentKey(n.popFirst(5));\n return r.isEqual(t) || \n // TODO(b/64130202): Somehow support foreign references.\n __PRIVATE_logError(`Document ${i} contains a document reference within a different database (${r.projectId}/${r.database}) which is not supported. It will be treated as a reference in the current database (${t.projectId}/${t.database}) instead.`), \n i;\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Converts custom model object of type T into `DocumentData` by applying the\n * converter if it exists.\n *\n * This function is used when converting user objects to `DocumentData`\n * because we want to provide the user with a more specific error message if\n * their `set()` or fails due to invalid data originating from a `toFirestore()`\n * call.\n */ function __PRIVATE_applyFirestoreDataConverter(e, t, n) {\n let r;\n // Cast to `any` in order to satisfy the union type constraint on\n // toFirestore().\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return r = e ? n && (n.merge || n.mergeFields) ? e.toFirestore(t, n) : e.toFirestore(t) : t, \n r;\n}\n\nclass __PRIVATE_LiteUserDataWriter extends AbstractUserDataWriter {\n constructor(e) {\n super(), this.firestore = e;\n }\n convertBytes(e) {\n return new Bytes(e);\n }\n convertReference(e) {\n const t = this.convertDocumentKey(e, this.firestore._databaseId);\n return new DocumentReference(this.firestore, /* converter= */ null, t);\n }\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Create an AggregateField object that can be used to compute the sum of\n * a specified field over a range of documents in the result set of a query.\n * @param field Specifies the field to sum across the result set.\n */ function sum(e) {\n return new AggregateField(\"sum\", __PRIVATE_fieldPathFromArgument$1(\"sum\", e));\n}\n\n/**\n * Create an AggregateField object that can be used to compute the average of\n * a specified field over a range of documents in the result set of a query.\n * @param field Specifies the field to average across the result set.\n */ function average(e) {\n return new AggregateField(\"avg\", __PRIVATE_fieldPathFromArgument$1(\"average\", e));\n}\n\n/**\n * Create an AggregateField object that can be used to compute the count of\n * documents in the result set of a query.\n */ function count() {\n return new AggregateField(\"count\");\n}\n\n/**\n * Compares two 'AggregateField` instances for equality.\n *\n * @param left Compare this AggregateField to the `right`.\n * @param right Compare this AggregateField to the `left`.\n */ function aggregateFieldEqual(e, t) {\n var n, r;\n return e instanceof AggregateField && t instanceof AggregateField && e.aggregateType === t.aggregateType && (null === (n = e._internalFieldPath) || void 0 === n ? void 0 : n.canonicalString()) === (null === (r = t._internalFieldPath) || void 0 === r ? void 0 : r.canonicalString());\n}\n\n/**\n * Compares two `AggregateQuerySnapshot` instances for equality.\n *\n * Two `AggregateQuerySnapshot` instances are considered \"equal\" if they have\n * underlying queries that compare equal, and the same data.\n *\n * @param left - The first `AggregateQuerySnapshot` to compare.\n * @param right - The second `AggregateQuerySnapshot` to compare.\n *\n * @returns `true` if the objects are \"equal\", as defined above, or `false`\n * otherwise.\n */ function aggregateQuerySnapshotEqual(e, t) {\n return queryEqual(e.query, t.query) && deepEqual(e.data(), t.data());\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Metadata about a snapshot, describing the state of the snapshot.\n */ class SnapshotMetadata {\n /** @hideconstructor */\n constructor(e, t) {\n this.hasPendingWrites = e, this.fromCache = t;\n }\n /**\n * Returns true if this `SnapshotMetadata` is equal to the provided one.\n *\n * @param other - The `SnapshotMetadata` to compare against.\n * @returns true if this `SnapshotMetadata` is equal to the provided one.\n */ isEqual(e) {\n return this.hasPendingWrites === e.hasPendingWrites && this.fromCache === e.fromCache;\n }\n}\n\n/**\n * A `DocumentSnapshot` contains data read from a document in your Firestore\n * database. The data can be extracted with `.data()` or `.get()` to\n * get a specific field.\n *\n * For a `DocumentSnapshot` that points to a non-existing document, any data\n * access will return 'undefined'. You can use the `exists()` method to\n * explicitly verify a document's existence.\n */ class DocumentSnapshot extends DocumentSnapshot$1 {\n /** @hideconstructor protected */\n constructor(e, t, n, r, i, s) {\n super(e, t, n, r, s), this._firestore = e, this._firestoreImpl = e, this.metadata = i;\n }\n /**\n * Returns whether or not the data exists. True if the document exists.\n */ exists() {\n return super.exists();\n }\n /**\n * Retrieves all fields in the document as an `Object`. Returns `undefined` if\n * the document doesn't exist.\n *\n * By default, `serverTimestamp()` values that have not yet been\n * set to their final value will be returned as `null`. You can override\n * this by passing an options object.\n *\n * @param options - An options object to configure how data is retrieved from\n * the snapshot (for example the desired behavior for server timestamps that\n * have not yet been set to their final value).\n * @returns An `Object` containing all fields in the document or `undefined` if\n * the document doesn't exist.\n */ data(e = {}) {\n if (this._document) {\n if (this._converter) {\n // We only want to use the converter and create a new DocumentSnapshot\n // if a converter has been provided.\n const t = new QueryDocumentSnapshot(this._firestore, this._userDataWriter, this._key, this._document, this.metadata, \n /* converter= */ null);\n return this._converter.fromFirestore(t, e);\n }\n return this._userDataWriter.convertValue(this._document.data.value, e.serverTimestamps);\n }\n }\n /**\n * Retrieves the field specified by `fieldPath`. Returns `undefined` if the\n * document or field doesn't exist.\n *\n * By default, a `serverTimestamp()` that has not yet been set to\n * its final value will be returned as `null`. You can override this by\n * passing an options object.\n *\n * @param fieldPath - The path (for example 'foo' or 'foo.bar') to a specific\n * field.\n * @param options - An options object to configure how the field is retrieved\n * from the snapshot (for example the desired behavior for server timestamps\n * that have not yet been set to their final value).\n * @returns The data at the specified field location or undefined if no such\n * field exists in the document.\n */\n // We are using `any` here to avoid an explicit cast by our users.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(e, t = {}) {\n if (this._document) {\n const n = this._document.data.field(__PRIVATE_fieldPathFromArgument(\"DocumentSnapshot.get\", e));\n if (null !== n) return this._userDataWriter.convertValue(n, t.serverTimestamps);\n }\n }\n}\n\n/**\n * A `QueryDocumentSnapshot` contains data read from a document in your\n * Firestore database as part of a query. The document is guaranteed to exist\n * and its data can be extracted with `.data()` or `.get()` to get a\n * specific field.\n *\n * A `QueryDocumentSnapshot` offers the same API surface as a\n * `DocumentSnapshot`. Since query results contain only existing documents, the\n * `exists` property will always be true and `data()` will never return\n * 'undefined'.\n */ class QueryDocumentSnapshot extends DocumentSnapshot {\n /**\n * Retrieves all fields in the document as an `Object`.\n *\n * By default, `serverTimestamp()` values that have not yet been\n * set to their final value will be returned as `null`. You can override\n * this by passing an options object.\n *\n * @override\n * @param options - An options object to configure how data is retrieved from\n * the snapshot (for example the desired behavior for server timestamps that\n * have not yet been set to their final value).\n * @returns An `Object` containing all fields in the document.\n */\n data(e = {}) {\n return super.data(e);\n }\n}\n\n/**\n * A `QuerySnapshot` contains zero or more `DocumentSnapshot` objects\n * representing the results of a query. The documents can be accessed as an\n * array via the `docs` property or enumerated using the `forEach` method. The\n * number of documents can be determined via the `empty` and `size`\n * properties.\n */ class QuerySnapshot {\n /** @hideconstructor */\n constructor(e, t, n, r) {\n this._firestore = e, this._userDataWriter = t, this._snapshot = r, this.metadata = new SnapshotMetadata(r.hasPendingWrites, r.fromCache), \n this.query = n;\n }\n /** An array of all the documents in the `QuerySnapshot`. */ get docs() {\n const e = [];\n return this.forEach((t => e.push(t))), e;\n }\n /** The number of documents in the `QuerySnapshot`. */ get size() {\n return this._snapshot.docs.size;\n }\n /** True if there are no documents in the `QuerySnapshot`. */ get empty() {\n return 0 === this.size;\n }\n /**\n * Enumerates all of the documents in the `QuerySnapshot`.\n *\n * @param callback - A callback to be called with a `QueryDocumentSnapshot` for\n * each document in the snapshot.\n * @param thisArg - The `this` binding for the callback.\n */ forEach(e, t) {\n this._snapshot.docs.forEach((n => {\n e.call(t, new QueryDocumentSnapshot(this._firestore, this._userDataWriter, n.key, n, new SnapshotMetadata(this._snapshot.mutatedKeys.has(n.key), this._snapshot.fromCache), this.query.converter));\n }));\n }\n /**\n * Returns an array of the documents changes since the last snapshot. If this\n * is the first snapshot, all documents will be in the list as 'added'\n * changes.\n *\n * @param options - `SnapshotListenOptions` that control whether metadata-only\n * changes (i.e. only `DocumentSnapshot.metadata` changed) should trigger\n * snapshot events.\n */ docChanges(e = {}) {\n const t = !!e.includeMetadataChanges;\n if (t && this._snapshot.excludesMetadataChanges) throw new FirestoreError(D.INVALID_ARGUMENT, \"To include metadata changes with your document changes, you must also pass { includeMetadataChanges:true } to onSnapshot().\");\n return this._cachedChanges && this._cachedChangesIncludeMetadataChanges === t || (this._cachedChanges = \n /** Calculates the array of `DocumentChange`s for a given `ViewSnapshot`. */\n function __PRIVATE_changesFromSnapshot(e, t) {\n if (e._snapshot.oldDocs.isEmpty()) {\n let t = 0;\n return e._snapshot.docChanges.map((n => {\n const r = new QueryDocumentSnapshot(e._firestore, e._userDataWriter, n.doc.key, n.doc, new SnapshotMetadata(e._snapshot.mutatedKeys.has(n.doc.key), e._snapshot.fromCache), e.query.converter);\n return n.doc, {\n type: \"added\",\n doc: r,\n oldIndex: -1,\n newIndex: t++\n };\n }));\n }\n {\n // A `DocumentSet` that is updated incrementally as changes are applied to use\n // to lookup the index of a document.\n let n = e._snapshot.oldDocs;\n return e._snapshot.docChanges.filter((e => t || 3 /* ChangeType.Metadata */ !== e.type)).map((t => {\n const r = new QueryDocumentSnapshot(e._firestore, e._userDataWriter, t.doc.key, t.doc, new SnapshotMetadata(e._snapshot.mutatedKeys.has(t.doc.key), e._snapshot.fromCache), e.query.converter);\n let i = -1, s = -1;\n return 0 /* ChangeType.Added */ !== t.type && (i = n.indexOf(t.doc.key), n = n.delete(t.doc.key)), \n 1 /* ChangeType.Removed */ !== t.type && (n = n.add(t.doc), s = n.indexOf(t.doc.key)), \n {\n type: __PRIVATE_resultChangeType(t.type),\n doc: r,\n oldIndex: i,\n newIndex: s\n };\n }));\n }\n }(this, t), this._cachedChangesIncludeMetadataChanges = t), this._cachedChanges;\n }\n}\n\nfunction __PRIVATE_resultChangeType(e) {\n switch (e) {\n case 0 /* ChangeType.Added */ :\n return \"added\";\n\n case 2 /* ChangeType.Modified */ :\n case 3 /* ChangeType.Metadata */ :\n return \"modified\";\n\n case 1 /* ChangeType.Removed */ :\n return \"removed\";\n\n default:\n return fail();\n }\n}\n\n// TODO(firestoreexp): Add tests for snapshotEqual with different snapshot\n// metadata\n/**\n * Returns true if the provided snapshots are equal.\n *\n * @param left - A snapshot to compare.\n * @param right - A snapshot to compare.\n * @returns true if the snapshots are equal.\n */ function snapshotEqual(e, t) {\n return e instanceof DocumentSnapshot && t instanceof DocumentSnapshot ? e._firestore === t._firestore && e._key.isEqual(t._key) && (null === e._document ? null === t._document : e._document.isEqual(t._document)) && e._converter === t._converter : e instanceof QuerySnapshot && t instanceof QuerySnapshot && (e._firestore === t._firestore && queryEqual(e.query, t.query) && e.metadata.isEqual(t.metadata) && e._snapshot.isEqual(t._snapshot));\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Reads the document referred to by this `DocumentReference`.\n *\n * Note: `getDoc()` attempts to provide up-to-date data when possible by waiting\n * for data from the server, but it may return cached data or fail if you are\n * offline and the server cannot be reached. To specify this behavior, invoke\n * {@link getDocFromCache} or {@link getDocFromServer}.\n *\n * @param reference - The reference of the document to fetch.\n * @returns A Promise resolved with a `DocumentSnapshot` containing the\n * current document contents.\n */ function getDoc(e) {\n e = __PRIVATE_cast(e, DocumentReference);\n const t = __PRIVATE_cast(e.firestore, Firestore);\n return __PRIVATE_firestoreClientGetDocumentViaSnapshotListener(ensureFirestoreConfigured(t), e._key).then((n => __PRIVATE_convertToDocSnapshot(t, e, n)));\n}\n\nclass __PRIVATE_ExpUserDataWriter extends AbstractUserDataWriter {\n constructor(e) {\n super(), this.firestore = e;\n }\n convertBytes(e) {\n return new Bytes(e);\n }\n convertReference(e) {\n const t = this.convertDocumentKey(e, this.firestore._databaseId);\n return new DocumentReference(this.firestore, /* converter= */ null, t);\n }\n}\n\n/**\n * Reads the document referred to by this `DocumentReference` from cache.\n * Returns an error if the document is not currently cached.\n *\n * @returns A `Promise` resolved with a `DocumentSnapshot` containing the\n * current document contents.\n */ function getDocFromCache(e) {\n e = __PRIVATE_cast(e, DocumentReference);\n const t = __PRIVATE_cast(e.firestore, Firestore), n = ensureFirestoreConfigured(t), r = new __PRIVATE_ExpUserDataWriter(t);\n return __PRIVATE_firestoreClientGetDocumentFromLocalCache(n, e._key).then((n => new DocumentSnapshot(t, r, e._key, n, new SnapshotMetadata(null !== n && n.hasLocalMutations, \n /* fromCache= */ !0), e.converter)));\n}\n\n/**\n * Reads the document referred to by this `DocumentReference` from the server.\n * Returns an error if the network is not available.\n *\n * @returns A `Promise` resolved with a `DocumentSnapshot` containing the\n * current document contents.\n */ function getDocFromServer(e) {\n e = __PRIVATE_cast(e, DocumentReference);\n const t = __PRIVATE_cast(e.firestore, Firestore);\n return __PRIVATE_firestoreClientGetDocumentViaSnapshotListener(ensureFirestoreConfigured(t), e._key, {\n source: \"server\"\n }).then((n => __PRIVATE_convertToDocSnapshot(t, e, n)));\n}\n\n/**\n * Executes the query and returns the results as a `QuerySnapshot`.\n *\n * Note: `getDocs()` attempts to provide up-to-date data when possible by\n * waiting for data from the server, but it may return cached data or fail if\n * you are offline and the server cannot be reached. To specify this behavior,\n * invoke {@link getDocsFromCache} or {@link getDocsFromServer}.\n *\n * @returns A `Promise` that will be resolved with the results of the query.\n */ function getDocs(e) {\n e = __PRIVATE_cast(e, Query);\n const t = __PRIVATE_cast(e.firestore, Firestore), n = ensureFirestoreConfigured(t), r = new __PRIVATE_ExpUserDataWriter(t);\n return __PRIVATE_validateHasExplicitOrderByForLimitToLast(e._query), __PRIVATE_firestoreClientGetDocumentsViaSnapshotListener(n, e._query).then((n => new QuerySnapshot(t, r, e, n)));\n}\n\n/**\n * Executes the query and returns the results as a `QuerySnapshot` from cache.\n * Returns an empty result set if no documents matching the query are currently\n * cached.\n *\n * @returns A `Promise` that will be resolved with the results of the query.\n */ function getDocsFromCache(e) {\n e = __PRIVATE_cast(e, Query);\n const t = __PRIVATE_cast(e.firestore, Firestore), n = ensureFirestoreConfigured(t), r = new __PRIVATE_ExpUserDataWriter(t);\n return __PRIVATE_firestoreClientGetDocumentsFromLocalCache(n, e._query).then((n => new QuerySnapshot(t, r, e, n)));\n}\n\n/**\n * Executes the query and returns the results as a `QuerySnapshot` from the\n * server. Returns an error if the network is not available.\n *\n * @returns A `Promise` that will be resolved with the results of the query.\n */ function getDocsFromServer(e) {\n e = __PRIVATE_cast(e, Query);\n const t = __PRIVATE_cast(e.firestore, Firestore), n = ensureFirestoreConfigured(t), r = new __PRIVATE_ExpUserDataWriter(t);\n return __PRIVATE_firestoreClientGetDocumentsViaSnapshotListener(n, e._query, {\n source: \"server\"\n }).then((n => new QuerySnapshot(t, r, e, n)));\n}\n\nfunction setDoc(e, t, n) {\n e = __PRIVATE_cast(e, DocumentReference);\n const r = __PRIVATE_cast(e.firestore, Firestore), i = __PRIVATE_applyFirestoreDataConverter(e.converter, t, n);\n return executeWrite(r, [ __PRIVATE_parseSetData(__PRIVATE_newUserDataReader(r), \"setDoc\", e._key, i, null !== e.converter, n).toMutation(e._key, Precondition.none()) ]);\n}\n\nfunction updateDoc(e, t, n, ...r) {\n e = __PRIVATE_cast(e, DocumentReference);\n const i = __PRIVATE_cast(e.firestore, Firestore), s = __PRIVATE_newUserDataReader(i);\n let o;\n o = \"string\" == typeof (\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n t = getModularInstance(t)) || t instanceof FieldPath ? __PRIVATE_parseUpdateVarargs(s, \"updateDoc\", e._key, t, n, r) : __PRIVATE_parseUpdateData(s, \"updateDoc\", e._key, t);\n return executeWrite(i, [ o.toMutation(e._key, Precondition.exists(!0)) ]);\n}\n\n/**\n * Deletes the document referred to by the specified `DocumentReference`.\n *\n * @param reference - A reference to the document to delete.\n * @returns A Promise resolved once the document has been successfully\n * deleted from the backend (note that it won't resolve while you're offline).\n */ function deleteDoc(e) {\n return executeWrite(__PRIVATE_cast(e.firestore, Firestore), [ new __PRIVATE_DeleteMutation(e._key, Precondition.none()) ]);\n}\n\n/**\n * Add a new document to specified `CollectionReference` with the given data,\n * assigning it a document ID automatically.\n *\n * @param reference - A reference to the collection to add this document to.\n * @param data - An Object containing the data for the new document.\n * @returns A `Promise` resolved with a `DocumentReference` pointing to the\n * newly created document after it has been written to the backend (Note that it\n * won't resolve while you're offline).\n */ function addDoc(e, t) {\n const n = __PRIVATE_cast(e.firestore, Firestore), r = doc(e), i = __PRIVATE_applyFirestoreDataConverter(e.converter, t);\n return executeWrite(n, [ __PRIVATE_parseSetData(__PRIVATE_newUserDataReader(e.firestore), \"addDoc\", r._key, i, null !== e.converter, {}).toMutation(r._key, Precondition.exists(!1)) ]).then((() => r));\n}\n\nfunction onSnapshot(e, ...t) {\n var n, r, i;\n e = getModularInstance(e);\n let s = {\n includeMetadataChanges: !1,\n source: \"default\"\n }, o = 0;\n \"object\" != typeof t[o] || __PRIVATE_isPartialObserver(t[o]) || (s = t[o], o++);\n const _ = {\n includeMetadataChanges: s.includeMetadataChanges,\n source: s.source\n };\n if (__PRIVATE_isPartialObserver(t[o])) {\n const e = t[o];\n t[o] = null === (n = e.next) || void 0 === n ? void 0 : n.bind(e), t[o + 1] = null === (r = e.error) || void 0 === r ? void 0 : r.bind(e), \n t[o + 2] = null === (i = e.complete) || void 0 === i ? void 0 : i.bind(e);\n }\n let a, u, c;\n if (e instanceof DocumentReference) u = __PRIVATE_cast(e.firestore, Firestore), \n c = __PRIVATE_newQueryForPath(e._key.path), a = {\n next: n => {\n t[o] && t[o](__PRIVATE_convertToDocSnapshot(u, e, n));\n },\n error: t[o + 1],\n complete: t[o + 2]\n }; else {\n const n = __PRIVATE_cast(e, Query);\n u = __PRIVATE_cast(n.firestore, Firestore), c = n._query;\n const r = new __PRIVATE_ExpUserDataWriter(u);\n a = {\n next: e => {\n t[o] && t[o](new QuerySnapshot(u, r, n, e));\n },\n error: t[o + 1],\n complete: t[o + 2]\n }, __PRIVATE_validateHasExplicitOrderByForLimitToLast(e._query);\n }\n return function __PRIVATE_firestoreClientListen(e, t, n, r) {\n const i = new __PRIVATE_AsyncObserver(r), s = new __PRIVATE_QueryListener(t, i, n);\n return e.asyncQueue.enqueueAndForget((async () => __PRIVATE_eventManagerListen(await __PRIVATE_getEventManager(e), s))), \n () => {\n i.Za(), e.asyncQueue.enqueueAndForget((async () => __PRIVATE_eventManagerUnlisten(await __PRIVATE_getEventManager(e), s)));\n };\n }(ensureFirestoreConfigured(u), c, _, a);\n}\n\nfunction onSnapshotsInSync(e, t) {\n return __PRIVATE_firestoreClientAddSnapshotsInSyncListener(ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore)), __PRIVATE_isPartialObserver(t) ? t : {\n next: t\n });\n}\n\n/**\n * Locally writes `mutations` on the async queue.\n * @internal\n */ function executeWrite(e, t) {\n return function __PRIVATE_firestoreClientWrite(e, t) {\n const n = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => __PRIVATE_syncEngineWrite(await __PRIVATE_getSyncEngine(e), t, n))), \n n.promise;\n }(ensureFirestoreConfigured(e), t);\n}\n\n/**\n * Converts a {@link ViewSnapshot} that contains the single document specified by `ref`\n * to a {@link DocumentSnapshot}.\n */ function __PRIVATE_convertToDocSnapshot(e, t, n) {\n const r = n.docs.get(t._key), i = new __PRIVATE_ExpUserDataWriter(e);\n return new DocumentSnapshot(e, i, t._key, r, new SnapshotMetadata(n.hasPendingWrites, n.fromCache), t.converter);\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Calculates the number of documents in the result set of the given query\n * without actually downloading the documents.\n *\n * Using this function to count the documents is efficient because only the\n * final count, not the documents' data, is downloaded. This function can\n * count the documents in cases where the result set is prohibitively large to\n * download entirely (thousands of documents).\n *\n * The result received from the server is presented, unaltered, without\n * considering any local state. That is, documents in the local cache are not\n * taken into consideration, neither are local modifications not yet\n * synchronized with the server. Previously-downloaded results, if any, are not\n * used. Every invocation of this function necessarily involves a round trip to\n * the server.\n *\n * @param query The query whose result set size is calculated.\n * @returns A Promise that will be resolved with the count; the count can be\n * retrieved from `snapshot.data().count`, where `snapshot` is the\n * `AggregateQuerySnapshot` to which the returned Promise resolves.\n */ function getCountFromServer(e) {\n return getAggregateFromServer(e, {\n count: count()\n });\n}\n\n/**\n * Calculates the specified aggregations over the documents in the result\n * set of the given query without actually downloading the documents.\n *\n * Using this function to perform aggregations is efficient because only the\n * final aggregation values, not the documents' data, are downloaded. This\n * function can perform aggregations of the documents in cases where the result\n * set is prohibitively large to download entirely (thousands of documents).\n *\n * The result received from the server is presented, unaltered, without\n * considering any local state. That is, documents in the local cache are not\n * taken into consideration, neither are local modifications not yet\n * synchronized with the server. Previously-downloaded results, if any, are not\n * used. Every invocation of this function necessarily involves a round trip to\n * the server.\n *\n * @param query The query whose result set is aggregated over.\n * @param aggregateSpec An `AggregateSpec` object that specifies the aggregates\n * to perform over the result set. The AggregateSpec specifies aliases for each\n * aggregate, which can be used to retrieve the aggregate result.\n * @example\n * ```typescript\n * const aggregateSnapshot = await getAggregateFromServer(query, {\n * countOfDocs: count(),\n * totalHours: sum('hours'),\n * averageScore: average('score')\n * });\n *\n * const countOfDocs: number = aggregateSnapshot.data().countOfDocs;\n * const totalHours: number = aggregateSnapshot.data().totalHours;\n * const averageScore: number | null = aggregateSnapshot.data().averageScore;\n * ```\n */ function getAggregateFromServer(e, t) {\n const n = __PRIVATE_cast(e.firestore, Firestore), r = ensureFirestoreConfigured(n), i = __PRIVATE_mapToArray(t, ((e, t) => new __PRIVATE_AggregateImpl(t, e.aggregateType, e._internalFieldPath)));\n // Run the aggregation and convert the results\n return __PRIVATE_firestoreClientRunAggregateQuery(r, e._query, i).then((t => \n /**\n * Converts the core aggregation result to an `AggregateQuerySnapshot`\n * that can be returned to the consumer.\n * @param query\n * @param aggregateResult Core aggregation result\n * @internal\n */\n function __PRIVATE_convertToAggregateQuerySnapshot(e, t, n) {\n const r = new __PRIVATE_ExpUserDataWriter(e);\n return new AggregateQuerySnapshot(t, r, n);\n }\n /**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ (n, e, t)));\n}\n\nclass __PRIVATE_MemoryLocalCacheImpl {\n constructor(e) {\n this.kind = \"memory\", this._onlineComponentProvider = OnlineComponentProvider.provider, \n (null == e ? void 0 : e.garbageCollector) ? this._offlineComponentProvider = e.garbageCollector._offlineComponentProvider : this._offlineComponentProvider = __PRIVATE_MemoryOfflineComponentProvider.provider;\n }\n toJSON() {\n return {\n kind: this.kind\n };\n }\n}\n\nclass __PRIVATE_PersistentLocalCacheImpl {\n constructor(e) {\n let t;\n this.kind = \"persistent\", (null == e ? void 0 : e.tabManager) ? (e.tabManager._initialize(e), \n t = e.tabManager) : (t = persistentSingleTabManager(void 0), t._initialize(e)), \n this._onlineComponentProvider = t._onlineComponentProvider, this._offlineComponentProvider = t._offlineComponentProvider;\n }\n toJSON() {\n return {\n kind: this.kind\n };\n }\n}\n\nclass __PRIVATE_MemoryEagerGarbageCollectorImpl {\n constructor() {\n this.kind = \"memoryEager\", this._offlineComponentProvider = __PRIVATE_MemoryOfflineComponentProvider.provider;\n }\n toJSON() {\n return {\n kind: this.kind\n };\n }\n}\n\nclass __PRIVATE_MemoryLruGarbageCollectorImpl {\n constructor(e) {\n this.kind = \"memoryLru\", this._offlineComponentProvider = {\n build: () => new __PRIVATE_LruGcMemoryOfflineComponentProvider(e)\n };\n }\n toJSON() {\n return {\n kind: this.kind\n };\n }\n}\n\n/**\n * Creates an instance of `MemoryEagerGarbageCollector`. This is also the\n * default garbage collector unless it is explicitly specified otherwise.\n */ function memoryEagerGarbageCollector() {\n return new __PRIVATE_MemoryEagerGarbageCollectorImpl;\n}\n\n/**\n * Creates an instance of `MemoryLruGarbageCollector`.\n *\n * A target size can be specified as part of the setting parameter. The\n * collector will start deleting documents once the cache size exceeds\n * the given size. The default cache size is 40MB (40 * 1024 * 1024 bytes).\n */ function memoryLruGarbageCollector(e) {\n return new __PRIVATE_MemoryLruGarbageCollectorImpl(null == e ? void 0 : e.cacheSizeBytes);\n}\n\n/**\n * Creates an instance of `MemoryLocalCache`. The instance can be set to\n * `FirestoreSettings.cache` to tell the SDK which cache layer to use.\n */ function memoryLocalCache(e) {\n return new __PRIVATE_MemoryLocalCacheImpl(e);\n}\n\n/**\n * Creates an instance of `PersistentLocalCache`. The instance can be set to\n * `FirestoreSettings.cache` to tell the SDK which cache layer to use.\n *\n * Persistent cache cannot be used in a Node.js environment.\n */ function persistentLocalCache(e) {\n return new __PRIVATE_PersistentLocalCacheImpl(e);\n}\n\nclass __PRIVATE_SingleTabManagerImpl {\n constructor(e) {\n this.forceOwnership = e, this.kind = \"persistentSingleTab\";\n }\n toJSON() {\n return {\n kind: this.kind\n };\n }\n /**\n * @internal\n */ _initialize(e) {\n this._onlineComponentProvider = OnlineComponentProvider.provider, this._offlineComponentProvider = {\n build: t => new __PRIVATE_IndexedDbOfflineComponentProvider(t, null == e ? void 0 : e.cacheSizeBytes, this.forceOwnership)\n };\n }\n}\n\nclass __PRIVATE_MultiTabManagerImpl {\n constructor() {\n this.kind = \"PersistentMultipleTab\";\n }\n toJSON() {\n return {\n kind: this.kind\n };\n }\n /**\n * @internal\n */ _initialize(e) {\n this._onlineComponentProvider = OnlineComponentProvider.provider, this._offlineComponentProvider = {\n build: t => new __PRIVATE_MultiTabOfflineComponentProvider(t, null == e ? void 0 : e.cacheSizeBytes)\n };\n }\n}\n\n/**\n * Creates an instance of `PersistentSingleTabManager`.\n *\n * @param settings Configures the created tab manager.\n */ function persistentSingleTabManager(e) {\n return new __PRIVATE_SingleTabManagerImpl(null == e ? void 0 : e.forceOwnership);\n}\n\n/**\n * Creates an instance of `PersistentMultipleTabManager`.\n */ function persistentMultipleTabManager() {\n return new __PRIVATE_MultiTabManagerImpl;\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ const ve = {\n maxAttempts: 5\n};\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A write batch, used to perform multiple writes as a single atomic unit.\n *\n * A `WriteBatch` object can be acquired by calling {@link writeBatch}. It\n * provides methods for adding writes to the write batch. None of the writes\n * will be committed (or visible locally) until {@link WriteBatch.commit} is\n * called.\n */\nclass WriteBatch {\n /** @hideconstructor */\n constructor(e, t) {\n this._firestore = e, this._commitHandler = t, this._mutations = [], this._committed = !1, \n this._dataReader = __PRIVATE_newUserDataReader(e);\n }\n set(e, t, n) {\n this._verifyNotCommitted();\n const r = __PRIVATE_validateReference(e, this._firestore), i = __PRIVATE_applyFirestoreDataConverter(r.converter, t, n), s = __PRIVATE_parseSetData(this._dataReader, \"WriteBatch.set\", r._key, i, null !== r.converter, n);\n return this._mutations.push(s.toMutation(r._key, Precondition.none())), this;\n }\n update(e, t, n, ...r) {\n this._verifyNotCommitted();\n const i = __PRIVATE_validateReference(e, this._firestore);\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n let s;\n return s = \"string\" == typeof (t = getModularInstance(t)) || t instanceof FieldPath ? __PRIVATE_parseUpdateVarargs(this._dataReader, \"WriteBatch.update\", i._key, t, n, r) : __PRIVATE_parseUpdateData(this._dataReader, \"WriteBatch.update\", i._key, t), \n this._mutations.push(s.toMutation(i._key, Precondition.exists(!0))), this;\n }\n /**\n * Deletes the document referred to by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be deleted.\n * @returns This `WriteBatch` instance. Used for chaining method calls.\n */ delete(e) {\n this._verifyNotCommitted();\n const t = __PRIVATE_validateReference(e, this._firestore);\n return this._mutations = this._mutations.concat(new __PRIVATE_DeleteMutation(t._key, Precondition.none())), \n this;\n }\n /**\n * Commits all of the writes in this write batch as a single atomic unit.\n *\n * The result of these writes will only be reflected in document reads that\n * occur after the returned promise resolves. If the client is offline, the\n * write fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @returns A `Promise` resolved once all of the writes in the batch have been\n * successfully written to the backend as an atomic unit (note that it won't\n * resolve while you're offline).\n */ commit() {\n return this._verifyNotCommitted(), this._committed = !0, this._mutations.length > 0 ? this._commitHandler(this._mutations) : Promise.resolve();\n }\n _verifyNotCommitted() {\n if (this._committed) throw new FirestoreError(D.FAILED_PRECONDITION, \"A write batch can no longer be used after commit() has been called.\");\n }\n}\n\nfunction __PRIVATE_validateReference(e, t) {\n if ((e = getModularInstance(e)).firestore !== t) throw new FirestoreError(D.INVALID_ARGUMENT, \"Provided document reference is from a different Firestore instance.\");\n return e;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// TODO(mrschmidt) Consider using `BaseTransaction` as the base class in the\n// legacy SDK.\n/**\n * A reference to a transaction.\n *\n * The `Transaction` object passed to a transaction's `updateFunction` provides\n * the methods to read and write data within the transaction context. See\n * {@link runTransaction}.\n */\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A reference to a transaction.\n *\n * The `Transaction` object passed to a transaction's `updateFunction` provides\n * the methods to read and write data within the transaction context. See\n * {@link runTransaction}.\n */\nclass Transaction extends class Transaction$1 {\n /** @hideconstructor */\n constructor(e, t) {\n this._firestore = e, this._transaction = t, this._dataReader = __PRIVATE_newUserDataReader(e);\n }\n /**\n * Reads the document referenced by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be read.\n * @returns A `DocumentSnapshot` with the read data.\n */ get(e) {\n const t = __PRIVATE_validateReference(e, this._firestore), n = new __PRIVATE_LiteUserDataWriter(this._firestore);\n return this._transaction.lookup([ t._key ]).then((e => {\n if (!e || 1 !== e.length) return fail();\n const r = e[0];\n if (r.isFoundDocument()) return new DocumentSnapshot$1(this._firestore, n, r.key, r, t.converter);\n if (r.isNoDocument()) return new DocumentSnapshot$1(this._firestore, n, t._key, null, t.converter);\n throw fail();\n }));\n }\n set(e, t, n) {\n const r = __PRIVATE_validateReference(e, this._firestore), i = __PRIVATE_applyFirestoreDataConverter(r.converter, t, n), s = __PRIVATE_parseSetData(this._dataReader, \"Transaction.set\", r._key, i, null !== r.converter, n);\n return this._transaction.set(r._key, s), this;\n }\n update(e, t, n, ...r) {\n const i = __PRIVATE_validateReference(e, this._firestore);\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n let s;\n return s = \"string\" == typeof (t = getModularInstance(t)) || t instanceof FieldPath ? __PRIVATE_parseUpdateVarargs(this._dataReader, \"Transaction.update\", i._key, t, n, r) : __PRIVATE_parseUpdateData(this._dataReader, \"Transaction.update\", i._key, t), \n this._transaction.update(i._key, s), this;\n }\n /**\n * Deletes the document referred to by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be deleted.\n * @returns This `Transaction` instance. Used for chaining method calls.\n */ delete(e) {\n const t = __PRIVATE_validateReference(e, this._firestore);\n return this._transaction.delete(t._key), this;\n }\n} {\n // This class implements the same logic as the Transaction API in the Lite SDK\n // but is subclassed in order to return its own DocumentSnapshot types.\n /** @hideconstructor */\n constructor(e, t) {\n super(e, t), this._firestore = e;\n }\n /**\n * Reads the document referenced by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be read.\n * @returns A `DocumentSnapshot` with the read data.\n */ get(e) {\n const t = __PRIVATE_validateReference(e, this._firestore), n = new __PRIVATE_ExpUserDataWriter(this._firestore);\n return super.get(e).then((e => new DocumentSnapshot(this._firestore, n, t._key, e._document, new SnapshotMetadata(\n /* hasPendingWrites= */ !1, \n /* fromCache= */ !1), t.converter)));\n }\n}\n\n/**\n * Executes the given `updateFunction` and then attempts to commit the changes\n * applied within the transaction. If any document read within the transaction\n * has changed, Cloud Firestore retries the `updateFunction`. If it fails to\n * commit after 5 attempts, the transaction fails.\n *\n * The maximum number of writes allowed in a single transaction is 500.\n *\n * @param firestore - A reference to the Firestore database to run this\n * transaction against.\n * @param updateFunction - The function to execute within the transaction\n * context.\n * @param options - An options object to configure maximum number of attempts to\n * commit.\n * @returns If the transaction completed successfully or was explicitly aborted\n * (the `updateFunction` returned a failed promise), the promise returned by the\n * `updateFunction `is returned here. Otherwise, if the transaction failed, a\n * rejected promise with the corresponding failure error is returned.\n */ function runTransaction(e, t, n) {\n e = __PRIVATE_cast(e, Firestore);\n const r = Object.assign(Object.assign({}, ve), n);\n !function __PRIVATE_validateTransactionOptions(e) {\n if (e.maxAttempts < 1) throw new FirestoreError(D.INVALID_ARGUMENT, \"Max attempts must be at least 1\");\n }(r);\n return function __PRIVATE_firestoreClientTransaction(e, t, n) {\n const r = new __PRIVATE_Deferred;\n return e.asyncQueue.enqueueAndForget((async () => {\n const i = await __PRIVATE_getDatastore(e);\n new __PRIVATE_TransactionRunner(e.asyncQueue, i, n, t, r).au();\n })), r.promise;\n }(ensureFirestoreConfigured(e), (n => t(new Transaction(e, n))), r);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Returns a sentinel for use with {@link @firebase/firestore/lite#(updateDoc:1)} or\n * {@link @firebase/firestore/lite#(setDoc:1)} with `{merge: true}` to mark a field for deletion.\n */ function deleteField() {\n return new __PRIVATE_DeleteFieldValueImpl(\"deleteField\");\n}\n\n/**\n * Returns a sentinel used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link @firebase/firestore/lite#(updateDoc:1)} to\n * include a server-generated timestamp in the written data.\n */ function serverTimestamp() {\n return new __PRIVATE_ServerTimestampFieldValueImpl(\"serverTimestamp\");\n}\n\n/**\n * Returns a special value that can be used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link\n * @firebase/firestore/lite#(updateDoc:1)} that tells the server to union the given elements with any array\n * value that already exists on the server. Each specified element that doesn't\n * already exist in the array will be added to the end. If the field being\n * modified is not already an array it will be overwritten with an array\n * containing exactly the specified elements.\n *\n * @param elements - The elements to union into the array.\n * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or\n * `updateDoc()`.\n */ function arrayUnion(...e) {\n // NOTE: We don't actually parse the data until it's used in set() or\n // update() since we'd need the Firestore instance to do this.\n return new __PRIVATE_ArrayUnionFieldValueImpl(\"arrayUnion\", e);\n}\n\n/**\n * Returns a special value that can be used with {@link (setDoc:1)} or {@link\n * updateDoc:1} that tells the server to remove the given elements from any\n * array value that already exists on the server. All instances of each element\n * specified will be removed from the array. If the field being modified is not\n * already an array it will be overwritten with an empty array.\n *\n * @param elements - The elements to remove from the array.\n * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or\n * `updateDoc()`\n */ function arrayRemove(...e) {\n // NOTE: We don't actually parse the data until it's used in set() or\n // update() since we'd need the Firestore instance to do this.\n return new __PRIVATE_ArrayRemoveFieldValueImpl(\"arrayRemove\", e);\n}\n\n/**\n * Returns a special value that can be used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link\n * @firebase/firestore/lite#(updateDoc:1)} that tells the server to increment the field's current value by\n * the given value.\n *\n * If either the operand or the current field value uses floating point\n * precision, all arithmetic follows IEEE 754 semantics. If both values are\n * integers, values outside of JavaScript's safe number range\n * (`Number.MIN_SAFE_INTEGER` to `Number.MAX_SAFE_INTEGER`) are also subject to\n * precision loss. Furthermore, once processed by the Firestore backend, all\n * integer operations are capped between -2^63 and 2^63-1.\n *\n * If the current field value is not of type `number`, or if the field does not\n * yet exist, the transformation sets the field to the given value.\n *\n * @param n - The value to increment by.\n * @returns The `FieldValue` sentinel for use in a call to `setDoc()` or\n * `updateDoc()`\n */ function increment(e) {\n return new __PRIVATE_NumericIncrementFieldValueImpl(\"increment\", e);\n}\n\n/**\n * Creates a new `VectorValue` constructed with a copy of the given array of numbers.\n *\n * @param values - Create a `VectorValue` instance with a copy of this array of numbers.\n *\n * @returns A new `VectorValue` constructed with a copy of the given array of numbers.\n */ function vector(e) {\n return new VectorValue(e);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Creates a write batch, used for performing multiple writes as a single\n * atomic operation. The maximum number of writes allowed in a single {@link WriteBatch}\n * is 500.\n *\n * Unlike transactions, write batches are persisted offline and therefore are\n * preferable when you don't need to condition your writes on read data.\n *\n * @returns A {@link WriteBatch} that can be used to atomically execute multiple\n * writes.\n */ function writeBatch(e) {\n return ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore)), new WriteBatch(e, (t => executeWrite(e, t)));\n}\n\n/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */ function setIndexConfiguration(e, t) {\n const n = ensureFirestoreConfigured(e = __PRIVATE_cast(e, Firestore));\n if (!n._uninitializedComponentsProvider || \"memory\" === n._uninitializedComponentsProvider._offline.kind) \n // PORTING NOTE: We don't return an error if the user has not enabled\n // persistence since `enableIndexeddbPersistence()` can fail on the Web.\n return __PRIVATE_logWarn(\"Cannot enable indexes when persistence is disabled\"), \n Promise.resolve();\n const r = function __PRIVATE_parseIndexes(e) {\n const t = \"string\" == typeof e ? function __PRIVATE_tryParseJson(e) {\n try {\n return JSON.parse(e);\n } catch (e) {\n throw new FirestoreError(D.INVALID_ARGUMENT, \"Failed to parse JSON: \" + (null == e ? void 0 : e.message));\n }\n }(e) : e, n = [];\n if (Array.isArray(t.indexes)) for (const e of t.indexes) {\n const t = __PRIVATE_tryGetString(e, \"collectionGroup\"), r = [];\n if (Array.isArray(e.fields)) for (const t of e.fields) {\n const e = __PRIVATE_fieldPathFromDotSeparatedString(\"setIndexConfiguration\", __PRIVATE_tryGetString(t, \"fieldPath\"));\n \"CONTAINS\" === t.arrayConfig ? r.push(new IndexSegment(e, 2 /* IndexKind.CONTAINS */)) : \"ASCENDING\" === t.order ? r.push(new IndexSegment(e, 0 /* IndexKind.ASCENDING */)) : \"DESCENDING\" === t.order && r.push(new IndexSegment(e, 1 /* IndexKind.DESCENDING */));\n }\n n.push(new FieldIndex(FieldIndex.UNKNOWN_ID, t, r, IndexState.empty()));\n }\n return n;\n }(t);\n return __PRIVATE_firestoreClientSetIndexConfiguration(n, r);\n}\n\nfunction __PRIVATE_tryGetString(e, t) {\n if (\"string\" != typeof e[t]) throw new FirestoreError(D.INVALID_ARGUMENT, \"Missing string value for: \" + t);\n return e[t];\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A `PersistentCacheIndexManager` for configuring persistent cache indexes used\n * for local query execution.\n *\n * To use, call `getPersistentCacheIndexManager()` to get an instance.\n */ class PersistentCacheIndexManager {\n /** @hideconstructor */\n constructor(e) {\n this._firestore = e, \n /** A type string to uniquely identify instances of this class. */\n this.type = \"PersistentCacheIndexManager\";\n }\n}\n\n/**\n * Returns the PersistentCache Index Manager used by the given `Firestore`\n * object.\n *\n * @return The `PersistentCacheIndexManager` instance, or `null` if local\n * persistent storage is not in use.\n */ function getPersistentCacheIndexManager(e) {\n var t;\n e = __PRIVATE_cast(e, Firestore);\n const n = Ce.get(e);\n if (n) return n;\n if (\"persistent\" !== (null === (t = ensureFirestoreConfigured(e)._uninitializedComponentsProvider) || void 0 === t ? void 0 : t._offline.kind)) return null;\n const r = new PersistentCacheIndexManager(e);\n return Ce.set(e, r), r;\n}\n\n/**\n * Enables the SDK to create persistent cache indexes automatically for local\n * query execution when the SDK believes cache indexes can help improve\n * performance.\n *\n * This feature is disabled by default.\n */ function enablePersistentCacheIndexAutoCreation(e) {\n __PRIVATE_setPersistentCacheIndexAutoCreationEnabled(e, !0);\n}\n\n/**\n * Stops creating persistent cache indexes automatically for local query\n * execution. The indexes which have been created by calling\n * `enablePersistentCacheIndexAutoCreation()` still take effect.\n */ function disablePersistentCacheIndexAutoCreation(e) {\n __PRIVATE_setPersistentCacheIndexAutoCreationEnabled(e, !1);\n}\n\n/**\n * Removes all persistent cache indexes.\n *\n * Please note this function will also deletes indexes generated by\n * `setIndexConfiguration()`, which is deprecated.\n */ function deleteAllPersistentCacheIndexes(e) {\n __PRIVATE_firestoreClientDeleteAllFieldIndexes(ensureFirestoreConfigured(e._firestore)).then((e => __PRIVATE_logDebug(\"deleting all persistent cache indexes succeeded\"))).catch((e => __PRIVATE_logWarn(\"deleting all persistent cache indexes failed\", e)));\n}\n\nfunction __PRIVATE_setPersistentCacheIndexAutoCreationEnabled(e, t) {\n __PRIVATE_firestoreClientSetPersistentCacheIndexAutoCreationEnabled(ensureFirestoreConfigured(e._firestore), t).then((e => __PRIVATE_logDebug(`setting persistent cache index auto creation isEnabled=${t} succeeded`))).catch((e => __PRIVATE_logWarn(`setting persistent cache index auto creation isEnabled=${t} failed`, e)));\n}\n\n/**\n * Maps `Firestore` instances to their corresponding\n * `PersistentCacheIndexManager` instances.\n *\n * Use a `WeakMap` so that the mapping will be automatically dropped when the\n * `Firestore` instance is garbage collected. This emulates a private member\n * as described in https://goo.gle/454yvug.\n */ const Ce = new WeakMap;\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @internal\n * @private\n *\n * This function is for internal use only.\n *\n * Returns the `QueryTarget` representation of the given query. Returns `null`\n * if the Firestore client associated with the given query has not been\n * initialized or has been terminated.\n *\n * @param query - The Query to convert to proto representation.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _internalQueryToProtoQueryTarget(e) {\n var t;\n const n = null === (t = ensureFirestoreConfigured(__PRIVATE_cast(e.firestore, Firestore))._onlineComponents) || void 0 === t ? void 0 : t.datastore.serializer;\n return void 0 === n ? null : __PRIVATE_toQueryTarget(n, __PRIVATE_queryToTarget(e._query))._t;\n}\n\n/**\n * @internal\n * @private\n *\n * This function is for internal use only.\n *\n * Returns `RunAggregationQueryRequest` which contains the proto representation\n * of the given aggregation query request. Returns null if the Firestore client\n * associated with the given query has not been initialized or has been\n * terminated.\n *\n * @param query - The Query to convert to proto representation.\n * @param aggregateSpec - The set of aggregations and their aliases.\n */ function _internalAggregationQueryToProtoRunAggregationQueryRequest(e, t) {\n var n;\n const r = __PRIVATE_mapToArray(t, ((e, t) => new __PRIVATE_AggregateImpl(t, e.aggregateType, e._internalFieldPath))), i = null === (n = ensureFirestoreConfigured(__PRIVATE_cast(e.firestore, Firestore))._onlineComponents) || void 0 === n ? void 0 : n.datastore.serializer;\n return void 0 === i ? null : __PRIVATE_toRunAggregationQueryRequest(i, __PRIVATE_queryToAggregateTarget(e._query), r, \n /* skipAliasing= */ !0).request;\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Testing hooks for use by Firestore's integration test suite to reach into the\n * SDK internals to validate logic and behavior that is not visible from the\n * public API surface.\n *\n * @internal\n */ class TestingHooks {\n constructor() {\n throw new Error(\"instances of this class should not be created\");\n }\n /**\n * Registers a callback to be notified when an existence filter mismatch\n * occurs in the Watch listen stream.\n *\n * The relative order in which callbacks are notified is unspecified; do not\n * rely on any particular ordering. If a given callback is registered multiple\n * times then it will be notified multiple times, once per registration.\n *\n * @param callback the callback to invoke upon existence filter mismatch.\n *\n * @return a function that, when called, unregisters the given callback; only\n * the first invocation of the returned function does anything; all subsequent\n * invocations do nothing.\n */ static onExistenceFilterMismatch(e) {\n return __PRIVATE_TestingHooksSpiImpl.instance.onExistenceFilterMismatch(e);\n }\n}\n\n/**\n * The implementation of `TestingHooksSpi`.\n */ class __PRIVATE_TestingHooksSpiImpl {\n constructor() {\n this.Uu = new Map;\n }\n static get instance() {\n return Fe || (Fe = new __PRIVATE_TestingHooksSpiImpl, function __PRIVATE_setTestingHooksSpi(e) {\n if (Pe) throw new Error(\"a TestingHooksSpi instance is already set\");\n Pe = e;\n }(Fe)), Fe;\n }\n et(e) {\n this.Uu.forEach((t => t(e)));\n }\n onExistenceFilterMismatch(e) {\n const t = Symbol(), n = this.Uu;\n return n.set(t, e), () => n.delete(t);\n }\n}\n\nlet Fe = null;\n\n/**\n * Cloud Firestore\n *\n * @packageDocumentation\n */ !function __PRIVATE_registerFirestore(e, t = !0) {\n !function __PRIVATE_setSDKVersion(e) {\n S = e;\n }(SDK_VERSION), _registerComponent(new Component(\"firestore\", ((e, {instanceIdentifier: n, options: r}) => {\n const i = e.getProvider(\"app\").getImmediate(), s = new Firestore(new __PRIVATE_FirebaseAuthCredentialsProvider(e.getProvider(\"auth-internal\")), new __PRIVATE_FirebaseAppCheckTokenProvider(e.getProvider(\"app-check-internal\")), function __PRIVATE_databaseIdFromApp(e, t) {\n if (!Object.prototype.hasOwnProperty.apply(e.options, [ \"projectId\" ])) throw new FirestoreError(D.INVALID_ARGUMENT, '\"projectId\" not provided in firebase.initializeApp.');\n return new DatabaseId(e.options.projectId, t);\n }(i, n), i);\n return r = Object.assign({\n useFetchStreams: t\n }, r), s._setSettings(r), s;\n }), \"PUBLIC\").setMultipleInstances(!0)), registerVersion(w, \"4.7.3\", e), \n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\n registerVersion(w, \"4.7.3\", \"esm2017\");\n}();\n\nexport { AbstractUserDataWriter, AggregateField, AggregateQuerySnapshot, Bytes, Se as CACHE_SIZE_UNLIMITED, CollectionReference, DocumentReference, DocumentSnapshot, FieldPath, FieldValue, Firestore, FirestoreError, GeoPoint, LoadBundleTask, PersistentCacheIndexManager, Query, QueryCompositeFilterConstraint, QueryConstraint, QueryDocumentSnapshot, QueryEndAtConstraint, QueryFieldFilterConstraint, QueryLimitConstraint, QueryOrderByConstraint, QuerySnapshot, QueryStartAtConstraint, SnapshotMetadata, Timestamp, Transaction, VectorValue, WriteBatch, __PRIVATE_AutoId as _AutoId, ByteString as _ByteString, DatabaseId as _DatabaseId, DocumentKey as _DocumentKey, __PRIVATE_EmptyAppCheckTokenProvider as _EmptyAppCheckTokenProvider, __PRIVATE_EmptyAuthCredentialsProvider as _EmptyAuthCredentialsProvider, FieldPath$1 as _FieldPath, TestingHooks as _TestingHooks, __PRIVATE_cast as _cast, __PRIVATE_debugAssert as _debugAssert, _internalAggregationQueryToProtoRunAggregationQueryRequest, _internalQueryToProtoQueryTarget, __PRIVATE_isBase64Available as _isBase64Available, __PRIVATE_logWarn as _logWarn, __PRIVATE_validateIsNotUsedTogether as _validateIsNotUsedTogether, addDoc, aggregateFieldEqual, aggregateQuerySnapshotEqual, and, arrayRemove, arrayUnion, average, clearIndexedDbPersistence, collection, collectionGroup, connectFirestoreEmulator, count, deleteAllPersistentCacheIndexes, deleteDoc, deleteField, disableNetwork, disablePersistentCacheIndexAutoCreation, doc, documentId, enableIndexedDbPersistence, enableMultiTabIndexedDbPersistence, enableNetwork, enablePersistentCacheIndexAutoCreation, endAt, endBefore, ensureFirestoreConfigured, executeWrite, getAggregateFromServer, getCountFromServer, getDoc, getDocFromCache, getDocFromServer, getDocs, getDocsFromCache, getDocsFromServer, getFirestore, getPersistentCacheIndexManager, increment, initializeFirestore, limit, limitToLast, loadBundle, memoryEagerGarbageCollector, memoryLocalCache, memoryLruGarbageCollector, namedQuery, onSnapshot, onSnapshotsInSync, or, orderBy, persistentLocalCache, persistentMultipleTabManager, persistentSingleTabManager, query, queryEqual, refEqual, runTransaction, serverTimestamp, setDoc, setIndexConfiguration, setLogLevel, snapshotEqual, startAfter, startAt, sum, terminate, updateDoc, vector, waitForPendingWrites, where, writeBatch };\n//# sourceMappingURL=index.esm2017.js.map\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import { SDK_VERSION, _isFirebaseServerApp, _getProvider, _registerComponent, registerVersion, getApp } from '@firebase/app';\nimport { ErrorFactory, isBrowserExtension, isMobileCordova, isReactNative, FirebaseError, querystring, isCloudflareWorker, getModularInstance, base64Decode, getUA, isIE, createSubscribe, deepEqual, querystringDecode, extractQuerystring, isEmpty, getExperimentalSetting, getDefaultEmulatorHost } from '@firebase/util';\nimport { Logger, LogLevel } from '@firebase/logger';\nimport { __rest } from 'tslib';\nimport { Component } from '@firebase/component';\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An enum of factors that may be used for multifactor authentication.\r\n *\r\n * @public\r\n */\r\nconst FactorId = {\r\n /** Phone as second factor */\r\n PHONE: 'phone',\r\n TOTP: 'totp'\r\n};\r\n/**\r\n * Enumeration of supported providers.\r\n *\r\n * @public\r\n */\r\nconst ProviderId = {\r\n /** Facebook provider ID */\r\n FACEBOOK: 'facebook.com',\r\n /** GitHub provider ID */\r\n GITHUB: 'github.com',\r\n /** Google provider ID */\r\n GOOGLE: 'google.com',\r\n /** Password provider */\r\n PASSWORD: 'password',\r\n /** Phone provider */\r\n PHONE: 'phone',\r\n /** Twitter provider ID */\r\n TWITTER: 'twitter.com'\r\n};\r\n/**\r\n * Enumeration of supported sign-in methods.\r\n *\r\n * @public\r\n */\r\nconst SignInMethod = {\r\n /** Email link sign in method */\r\n EMAIL_LINK: 'emailLink',\r\n /** Email/password sign in method */\r\n EMAIL_PASSWORD: 'password',\r\n /** Facebook sign in method */\r\n FACEBOOK: 'facebook.com',\r\n /** GitHub sign in method */\r\n GITHUB: 'github.com',\r\n /** Google sign in method */\r\n GOOGLE: 'google.com',\r\n /** Phone sign in method */\r\n PHONE: 'phone',\r\n /** Twitter sign in method */\r\n TWITTER: 'twitter.com'\r\n};\r\n/**\r\n * Enumeration of supported operation types.\r\n *\r\n * @public\r\n */\r\nconst OperationType = {\r\n /** Operation involving linking an additional provider to an already signed-in user. */\r\n LINK: 'link',\r\n /** Operation involving using a provider to reauthenticate an already signed-in user. */\r\n REAUTHENTICATE: 'reauthenticate',\r\n /** Operation involving signing in a user. */\r\n SIGN_IN: 'signIn'\r\n};\r\n/**\r\n * An enumeration of the possible email action types.\r\n *\r\n * @public\r\n */\r\nconst ActionCodeOperation = {\r\n /** The email link sign-in action. */\r\n EMAIL_SIGNIN: 'EMAIL_SIGNIN',\r\n /** The password reset action. */\r\n PASSWORD_RESET: 'PASSWORD_RESET',\r\n /** The email revocation action. */\r\n RECOVER_EMAIL: 'RECOVER_EMAIL',\r\n /** The revert second factor addition email action. */\r\n REVERT_SECOND_FACTOR_ADDITION: 'REVERT_SECOND_FACTOR_ADDITION',\r\n /** The revert second factor addition email action. */\r\n VERIFY_AND_CHANGE_EMAIL: 'VERIFY_AND_CHANGE_EMAIL',\r\n /** The email verification action. */\r\n VERIFY_EMAIL: 'VERIFY_EMAIL'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _debugErrorMap() {\r\n return {\r\n [\"admin-restricted-operation\" /* AuthErrorCode.ADMIN_ONLY_OPERATION */]: 'This operation is restricted to administrators only.',\r\n [\"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */]: '',\r\n [\"app-not-authorized\" /* AuthErrorCode.APP_NOT_AUTHORIZED */]: \"This app, identified by the domain where it's hosted, is not \" +\r\n 'authorized to use Firebase Authentication with the provided API key. ' +\r\n 'Review your key configuration in the Google API console.',\r\n [\"app-not-installed\" /* AuthErrorCode.APP_NOT_INSTALLED */]: 'The requested mobile application corresponding to the identifier (' +\r\n 'Android package name or iOS bundle ID) provided is not installed on ' +\r\n 'this device.',\r\n [\"captcha-check-failed\" /* AuthErrorCode.CAPTCHA_CHECK_FAILED */]: 'The reCAPTCHA response token provided is either invalid, expired, ' +\r\n 'already used or the domain associated with it does not match the list ' +\r\n 'of whitelisted domains.',\r\n [\"code-expired\" /* AuthErrorCode.CODE_EXPIRED */]: 'The SMS code has expired. Please re-send the verification code to try ' +\r\n 'again.',\r\n [\"cordova-not-ready\" /* AuthErrorCode.CORDOVA_NOT_READY */]: 'Cordova framework is not ready.',\r\n [\"cors-unsupported\" /* AuthErrorCode.CORS_UNSUPPORTED */]: 'This browser is not supported.',\r\n [\"credential-already-in-use\" /* AuthErrorCode.CREDENTIAL_ALREADY_IN_USE */]: 'This credential is already associated with a different user account.',\r\n [\"custom-token-mismatch\" /* AuthErrorCode.CREDENTIAL_MISMATCH */]: 'The custom token corresponds to a different audience.',\r\n [\"requires-recent-login\" /* AuthErrorCode.CREDENTIAL_TOO_OLD_LOGIN_AGAIN */]: 'This operation is sensitive and requires recent authentication. Log in ' +\r\n 'again before retrying this request.',\r\n [\"dependent-sdk-initialized-before-auth\" /* AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH */]: 'Another Firebase SDK was initialized and is trying to use Auth before Auth is ' +\r\n 'initialized. Please be sure to call `initializeAuth` or `getAuth` before ' +\r\n 'starting any other Firebase SDK.',\r\n [\"dynamic-link-not-activated\" /* AuthErrorCode.DYNAMIC_LINK_NOT_ACTIVATED */]: 'Please activate Dynamic Links in the Firebase Console and agree to the terms and ' +\r\n 'conditions.',\r\n [\"email-change-needs-verification\" /* AuthErrorCode.EMAIL_CHANGE_NEEDS_VERIFICATION */]: 'Multi-factor users must always have a verified email.',\r\n [\"email-already-in-use\" /* AuthErrorCode.EMAIL_EXISTS */]: 'The email address is already in use by another account.',\r\n [\"emulator-config-failed\" /* AuthErrorCode.EMULATOR_CONFIG_FAILED */]: 'Auth instance has already been used to make a network call. Auth can ' +\r\n 'no longer be configured to use the emulator. Try calling ' +\r\n '\"connectAuthEmulator()\" sooner.',\r\n [\"expired-action-code\" /* AuthErrorCode.EXPIRED_OOB_CODE */]: 'The action code has expired.',\r\n [\"cancelled-popup-request\" /* AuthErrorCode.EXPIRED_POPUP_REQUEST */]: 'This operation has been cancelled due to another conflicting popup being opened.',\r\n [\"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */]: 'An internal AuthError has occurred.',\r\n [\"invalid-app-credential\" /* AuthErrorCode.INVALID_APP_CREDENTIAL */]: 'The phone verification request contains an invalid application verifier.' +\r\n ' The reCAPTCHA token response is either invalid or expired.',\r\n [\"invalid-app-id\" /* AuthErrorCode.INVALID_APP_ID */]: 'The mobile app identifier is not registered for the current project.',\r\n [\"invalid-user-token\" /* AuthErrorCode.INVALID_AUTH */]: \"This user's credential isn't valid for this project. This can happen \" +\r\n \"if the user's token has been tampered with, or if the user isn't for \" +\r\n 'the project associated with this API key.',\r\n [\"invalid-auth-event\" /* AuthErrorCode.INVALID_AUTH_EVENT */]: 'An internal AuthError has occurred.',\r\n [\"invalid-verification-code\" /* AuthErrorCode.INVALID_CODE */]: 'The SMS verification code used to create the phone auth credential is ' +\r\n 'invalid. Please resend the verification code sms and be sure to use the ' +\r\n 'verification code provided by the user.',\r\n [\"invalid-continue-uri\" /* AuthErrorCode.INVALID_CONTINUE_URI */]: 'The continue URL provided in the request is invalid.',\r\n [\"invalid-cordova-configuration\" /* AuthErrorCode.INVALID_CORDOVA_CONFIGURATION */]: 'The following Cordova plugins must be installed to enable OAuth sign-in: ' +\r\n 'cordova-plugin-buildinfo, cordova-universal-links-plugin, ' +\r\n 'cordova-plugin-browsertab, cordova-plugin-inappbrowser and ' +\r\n 'cordova-plugin-customurlscheme.',\r\n [\"invalid-custom-token\" /* AuthErrorCode.INVALID_CUSTOM_TOKEN */]: 'The custom token format is incorrect. Please check the documentation.',\r\n [\"invalid-dynamic-link-domain\" /* AuthErrorCode.INVALID_DYNAMIC_LINK_DOMAIN */]: 'The provided dynamic link domain is not configured or authorized for the current project.',\r\n [\"invalid-email\" /* AuthErrorCode.INVALID_EMAIL */]: 'The email address is badly formatted.',\r\n [\"invalid-emulator-scheme\" /* AuthErrorCode.INVALID_EMULATOR_SCHEME */]: 'Emulator URL must start with a valid scheme (http:// or https://).',\r\n [\"invalid-api-key\" /* AuthErrorCode.INVALID_API_KEY */]: 'Your API key is invalid, please check you have copied it correctly.',\r\n [\"invalid-cert-hash\" /* AuthErrorCode.INVALID_CERT_HASH */]: 'The SHA-1 certificate hash provided is invalid.',\r\n [\"invalid-credential\" /* AuthErrorCode.INVALID_CREDENTIAL */]: 'The supplied auth credential is incorrect, malformed or has expired.',\r\n [\"invalid-message-payload\" /* AuthErrorCode.INVALID_MESSAGE_PAYLOAD */]: 'The email template corresponding to this action contains invalid characters in its message. ' +\r\n 'Please fix by going to the Auth email templates section in the Firebase Console.',\r\n [\"invalid-multi-factor-session\" /* AuthErrorCode.INVALID_MFA_SESSION */]: 'The request does not contain a valid proof of first factor successful sign-in.',\r\n [\"invalid-oauth-provider\" /* AuthErrorCode.INVALID_OAUTH_PROVIDER */]: 'EmailAuthProvider is not supported for this operation. This operation ' +\r\n 'only supports OAuth providers.',\r\n [\"invalid-oauth-client-id\" /* AuthErrorCode.INVALID_OAUTH_CLIENT_ID */]: 'The OAuth client ID provided is either invalid or does not match the ' +\r\n 'specified API key.',\r\n [\"unauthorized-domain\" /* AuthErrorCode.INVALID_ORIGIN */]: 'This domain is not authorized for OAuth operations for your Firebase ' +\r\n 'project. Edit the list of authorized domains from the Firebase console.',\r\n [\"invalid-action-code\" /* AuthErrorCode.INVALID_OOB_CODE */]: 'The action code is invalid. This can happen if the code is malformed, ' +\r\n 'expired, or has already been used.',\r\n [\"wrong-password\" /* AuthErrorCode.INVALID_PASSWORD */]: 'The password is invalid or the user does not have a password.',\r\n [\"invalid-persistence-type\" /* AuthErrorCode.INVALID_PERSISTENCE */]: 'The specified persistence type is invalid. It can only be local, session or none.',\r\n [\"invalid-phone-number\" /* AuthErrorCode.INVALID_PHONE_NUMBER */]: 'The format of the phone number provided is incorrect. Please enter the ' +\r\n 'phone number in a format that can be parsed into E.164 format. E.164 ' +\r\n 'phone numbers are written in the format [+][country code][subscriber ' +\r\n 'number including area code].',\r\n [\"invalid-provider-id\" /* AuthErrorCode.INVALID_PROVIDER_ID */]: 'The specified provider ID is invalid.',\r\n [\"invalid-recipient-email\" /* AuthErrorCode.INVALID_RECIPIENT_EMAIL */]: 'The email corresponding to this action failed to send as the provided ' +\r\n 'recipient email address is invalid.',\r\n [\"invalid-sender\" /* AuthErrorCode.INVALID_SENDER */]: 'The email template corresponding to this action contains an invalid sender email or name. ' +\r\n 'Please fix by going to the Auth email templates section in the Firebase Console.',\r\n [\"invalid-verification-id\" /* AuthErrorCode.INVALID_SESSION_INFO */]: 'The verification ID used to create the phone auth credential is invalid.',\r\n [\"invalid-tenant-id\" /* AuthErrorCode.INVALID_TENANT_ID */]: \"The Auth instance's tenant ID is invalid.\",\r\n [\"login-blocked\" /* AuthErrorCode.LOGIN_BLOCKED */]: 'Login blocked by user-provided method: {$originalMessage}',\r\n [\"missing-android-pkg-name\" /* AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME */]: 'An Android Package Name must be provided if the Android App is required to be installed.',\r\n [\"auth-domain-config-required\" /* AuthErrorCode.MISSING_AUTH_DOMAIN */]: 'Be sure to include authDomain when calling firebase.initializeApp(), ' +\r\n 'by following the instructions in the Firebase console.',\r\n [\"missing-app-credential\" /* AuthErrorCode.MISSING_APP_CREDENTIAL */]: 'The phone verification request is missing an application verifier ' +\r\n 'assertion. A reCAPTCHA response token needs to be provided.',\r\n [\"missing-verification-code\" /* AuthErrorCode.MISSING_CODE */]: 'The phone auth credential was created with an empty SMS verification code.',\r\n [\"missing-continue-uri\" /* AuthErrorCode.MISSING_CONTINUE_URI */]: 'A continue URL must be provided in the request.',\r\n [\"missing-iframe-start\" /* AuthErrorCode.MISSING_IFRAME_START */]: 'An internal AuthError has occurred.',\r\n [\"missing-ios-bundle-id\" /* AuthErrorCode.MISSING_IOS_BUNDLE_ID */]: 'An iOS Bundle ID must be provided if an App Store ID is provided.',\r\n [\"missing-or-invalid-nonce\" /* AuthErrorCode.MISSING_OR_INVALID_NONCE */]: 'The request does not contain a valid nonce. This can occur if the ' +\r\n 'SHA-256 hash of the provided raw nonce does not match the hashed nonce ' +\r\n 'in the ID token payload.',\r\n [\"missing-password\" /* AuthErrorCode.MISSING_PASSWORD */]: 'A non-empty password must be provided',\r\n [\"missing-multi-factor-info\" /* AuthErrorCode.MISSING_MFA_INFO */]: 'No second factor identifier is provided.',\r\n [\"missing-multi-factor-session\" /* AuthErrorCode.MISSING_MFA_SESSION */]: 'The request is missing proof of first factor successful sign-in.',\r\n [\"missing-phone-number\" /* AuthErrorCode.MISSING_PHONE_NUMBER */]: 'To send verification codes, provide a phone number for the recipient.',\r\n [\"missing-verification-id\" /* AuthErrorCode.MISSING_SESSION_INFO */]: 'The phone auth credential was created with an empty verification ID.',\r\n [\"app-deleted\" /* AuthErrorCode.MODULE_DESTROYED */]: 'This instance of FirebaseApp has been deleted.',\r\n [\"multi-factor-info-not-found\" /* AuthErrorCode.MFA_INFO_NOT_FOUND */]: 'The user does not have a second factor matching the identifier provided.',\r\n [\"multi-factor-auth-required\" /* AuthErrorCode.MFA_REQUIRED */]: 'Proof of ownership of a second factor is required to complete sign-in.',\r\n [\"account-exists-with-different-credential\" /* AuthErrorCode.NEED_CONFIRMATION */]: 'An account already exists with the same email address but different ' +\r\n 'sign-in credentials. Sign in using a provider associated with this ' +\r\n 'email address.',\r\n [\"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */]: 'A network AuthError (such as timeout, interrupted connection or unreachable host) has occurred.',\r\n [\"no-auth-event\" /* AuthErrorCode.NO_AUTH_EVENT */]: 'An internal AuthError has occurred.',\r\n [\"no-such-provider\" /* AuthErrorCode.NO_SUCH_PROVIDER */]: 'User was not linked to an account with the given provider.',\r\n [\"null-user\" /* AuthErrorCode.NULL_USER */]: 'A null user object was provided as the argument for an operation which ' +\r\n 'requires a non-null user object.',\r\n [\"operation-not-allowed\" /* AuthErrorCode.OPERATION_NOT_ALLOWED */]: 'The given sign-in provider is disabled for this Firebase project. ' +\r\n 'Enable it in the Firebase console, under the sign-in method tab of the ' +\r\n 'Auth section.',\r\n [\"operation-not-supported-in-this-environment\" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */]: 'This operation is not supported in the environment this application is ' +\r\n 'running on. \"location.protocol\" must be http, https or chrome-extension' +\r\n ' and web storage must be enabled.',\r\n [\"popup-blocked\" /* AuthErrorCode.POPUP_BLOCKED */]: 'Unable to establish a connection with the popup. It may have been blocked by the browser.',\r\n [\"popup-closed-by-user\" /* AuthErrorCode.POPUP_CLOSED_BY_USER */]: 'The popup has been closed by the user before finalizing the operation.',\r\n [\"provider-already-linked\" /* AuthErrorCode.PROVIDER_ALREADY_LINKED */]: 'User can only be linked to one identity for the given provider.',\r\n [\"quota-exceeded\" /* AuthErrorCode.QUOTA_EXCEEDED */]: \"The project's quota for this operation has been exceeded.\",\r\n [\"redirect-cancelled-by-user\" /* AuthErrorCode.REDIRECT_CANCELLED_BY_USER */]: 'The redirect operation has been cancelled by the user before finalizing.',\r\n [\"redirect-operation-pending\" /* AuthErrorCode.REDIRECT_OPERATION_PENDING */]: 'A redirect sign-in operation is already pending.',\r\n [\"rejected-credential\" /* AuthErrorCode.REJECTED_CREDENTIAL */]: 'The request contains malformed or mismatching credentials.',\r\n [\"second-factor-already-in-use\" /* AuthErrorCode.SECOND_FACTOR_ALREADY_ENROLLED */]: 'The second factor is already enrolled on this account.',\r\n [\"maximum-second-factor-count-exceeded\" /* AuthErrorCode.SECOND_FACTOR_LIMIT_EXCEEDED */]: 'The maximum allowed number of second factors on a user has been exceeded.',\r\n [\"tenant-id-mismatch\" /* AuthErrorCode.TENANT_ID_MISMATCH */]: \"The provided tenant ID does not match the Auth instance's tenant ID\",\r\n [\"timeout\" /* AuthErrorCode.TIMEOUT */]: 'The operation has timed out.',\r\n [\"user-token-expired\" /* AuthErrorCode.TOKEN_EXPIRED */]: \"The user's credential is no longer valid. The user must sign in again.\",\r\n [\"too-many-requests\" /* AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER */]: 'We have blocked all requests from this device due to unusual activity. ' +\r\n 'Try again later.',\r\n [\"unauthorized-continue-uri\" /* AuthErrorCode.UNAUTHORIZED_DOMAIN */]: 'The domain of the continue URL is not whitelisted. Please whitelist ' +\r\n 'the domain in the Firebase console.',\r\n [\"unsupported-first-factor\" /* AuthErrorCode.UNSUPPORTED_FIRST_FACTOR */]: 'Enrolling a second factor or signing in with a multi-factor account requires sign-in with a supported first factor.',\r\n [\"unsupported-persistence-type\" /* AuthErrorCode.UNSUPPORTED_PERSISTENCE */]: 'The current environment does not support the specified persistence type.',\r\n [\"unsupported-tenant-operation\" /* AuthErrorCode.UNSUPPORTED_TENANT_OPERATION */]: 'This operation is not supported in a multi-tenant context.',\r\n [\"unverified-email\" /* AuthErrorCode.UNVERIFIED_EMAIL */]: 'The operation requires a verified email.',\r\n [\"user-cancelled\" /* AuthErrorCode.USER_CANCELLED */]: 'The user did not grant your application the permissions it requested.',\r\n [\"user-not-found\" /* AuthErrorCode.USER_DELETED */]: 'There is no user record corresponding to this identifier. The user may ' +\r\n 'have been deleted.',\r\n [\"user-disabled\" /* AuthErrorCode.USER_DISABLED */]: 'The user account has been disabled by an administrator.',\r\n [\"user-mismatch\" /* AuthErrorCode.USER_MISMATCH */]: 'The supplied credentials do not correspond to the previously signed in user.',\r\n [\"user-signed-out\" /* AuthErrorCode.USER_SIGNED_OUT */]: '',\r\n [\"weak-password\" /* AuthErrorCode.WEAK_PASSWORD */]: 'The password must be 6 characters long or more.',\r\n [\"web-storage-unsupported\" /* AuthErrorCode.WEB_STORAGE_UNSUPPORTED */]: 'This browser is not supported or 3rd party cookies and data may be disabled.',\r\n [\"already-initialized\" /* AuthErrorCode.ALREADY_INITIALIZED */]: 'initializeAuth() has already been called with ' +\r\n 'different options. To avoid this error, call initializeAuth() with the ' +\r\n 'same options as when it was originally called, or call getAuth() to return the' +\r\n ' already initialized instance.',\r\n [\"missing-recaptcha-token\" /* AuthErrorCode.MISSING_RECAPTCHA_TOKEN */]: 'The reCAPTCHA token is missing when sending request to the backend.',\r\n [\"invalid-recaptcha-token\" /* AuthErrorCode.INVALID_RECAPTCHA_TOKEN */]: 'The reCAPTCHA token is invalid when sending request to the backend.',\r\n [\"invalid-recaptcha-action\" /* AuthErrorCode.INVALID_RECAPTCHA_ACTION */]: 'The reCAPTCHA action is invalid when sending request to the backend.',\r\n [\"recaptcha-not-enabled\" /* AuthErrorCode.RECAPTCHA_NOT_ENABLED */]: 'reCAPTCHA Enterprise integration is not enabled for this project.',\r\n [\"missing-client-type\" /* AuthErrorCode.MISSING_CLIENT_TYPE */]: 'The reCAPTCHA client type is missing when sending request to the backend.',\r\n [\"missing-recaptcha-version\" /* AuthErrorCode.MISSING_RECAPTCHA_VERSION */]: 'The reCAPTCHA version is missing when sending request to the backend.',\r\n [\"invalid-req-type\" /* AuthErrorCode.INVALID_REQ_TYPE */]: 'Invalid request parameters.',\r\n [\"invalid-recaptcha-version\" /* AuthErrorCode.INVALID_RECAPTCHA_VERSION */]: 'The reCAPTCHA version is invalid when sending request to the backend.',\r\n [\"unsupported-password-policy-schema-version\" /* AuthErrorCode.UNSUPPORTED_PASSWORD_POLICY_SCHEMA_VERSION */]: 'The password policy received from the backend uses a schema version that is not supported by this version of the Firebase SDK.',\r\n [\"password-does-not-meet-requirements\" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */]: 'The password does not meet the requirements.'\r\n };\r\n}\r\nfunction _prodErrorMap() {\r\n // We will include this one message in the prod error map since by the very\r\n // nature of this error, developers will never be able to see the message\r\n // using the debugErrorMap (which is installed during auth initialization).\r\n return {\r\n [\"dependent-sdk-initialized-before-auth\" /* AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH */]: 'Another Firebase SDK was initialized and is trying to use Auth before Auth is ' +\r\n 'initialized. Please be sure to call `initializeAuth` or `getAuth` before ' +\r\n 'starting any other Firebase SDK.'\r\n };\r\n}\r\n/**\r\n * A verbose error map with detailed descriptions for most error codes.\r\n *\r\n * See discussion at {@link AuthErrorMap}\r\n *\r\n * @public\r\n */\r\nconst debugErrorMap = _debugErrorMap;\r\n/**\r\n * A minimal error map with all verbose error messages stripped.\r\n *\r\n * See discussion at {@link AuthErrorMap}\r\n *\r\n * @public\r\n */\r\nconst prodErrorMap = _prodErrorMap;\r\nconst _DEFAULT_AUTH_ERROR_FACTORY = new ErrorFactory('auth', 'Firebase', _prodErrorMap());\r\n/**\r\n * A map of potential `Auth` error codes, for easier comparison with errors\r\n * thrown by the SDK.\r\n *\r\n * @remarks\r\n * Note that you can't tree-shake individual keys\r\n * in the map, so by using the map you might substantially increase your\r\n * bundle size.\r\n *\r\n * @public\r\n */\r\nconst AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY = {\r\n ADMIN_ONLY_OPERATION: 'auth/admin-restricted-operation',\r\n ARGUMENT_ERROR: 'auth/argument-error',\r\n APP_NOT_AUTHORIZED: 'auth/app-not-authorized',\r\n APP_NOT_INSTALLED: 'auth/app-not-installed',\r\n CAPTCHA_CHECK_FAILED: 'auth/captcha-check-failed',\r\n CODE_EXPIRED: 'auth/code-expired',\r\n CORDOVA_NOT_READY: 'auth/cordova-not-ready',\r\n CORS_UNSUPPORTED: 'auth/cors-unsupported',\r\n CREDENTIAL_ALREADY_IN_USE: 'auth/credential-already-in-use',\r\n CREDENTIAL_MISMATCH: 'auth/custom-token-mismatch',\r\n CREDENTIAL_TOO_OLD_LOGIN_AGAIN: 'auth/requires-recent-login',\r\n DEPENDENT_SDK_INIT_BEFORE_AUTH: 'auth/dependent-sdk-initialized-before-auth',\r\n DYNAMIC_LINK_NOT_ACTIVATED: 'auth/dynamic-link-not-activated',\r\n EMAIL_CHANGE_NEEDS_VERIFICATION: 'auth/email-change-needs-verification',\r\n EMAIL_EXISTS: 'auth/email-already-in-use',\r\n EMULATOR_CONFIG_FAILED: 'auth/emulator-config-failed',\r\n EXPIRED_OOB_CODE: 'auth/expired-action-code',\r\n EXPIRED_POPUP_REQUEST: 'auth/cancelled-popup-request',\r\n INTERNAL_ERROR: 'auth/internal-error',\r\n INVALID_API_KEY: 'auth/invalid-api-key',\r\n INVALID_APP_CREDENTIAL: 'auth/invalid-app-credential',\r\n INVALID_APP_ID: 'auth/invalid-app-id',\r\n INVALID_AUTH: 'auth/invalid-user-token',\r\n INVALID_AUTH_EVENT: 'auth/invalid-auth-event',\r\n INVALID_CERT_HASH: 'auth/invalid-cert-hash',\r\n INVALID_CODE: 'auth/invalid-verification-code',\r\n INVALID_CONTINUE_URI: 'auth/invalid-continue-uri',\r\n INVALID_CORDOVA_CONFIGURATION: 'auth/invalid-cordova-configuration',\r\n INVALID_CUSTOM_TOKEN: 'auth/invalid-custom-token',\r\n INVALID_DYNAMIC_LINK_DOMAIN: 'auth/invalid-dynamic-link-domain',\r\n INVALID_EMAIL: 'auth/invalid-email',\r\n INVALID_EMULATOR_SCHEME: 'auth/invalid-emulator-scheme',\r\n INVALID_IDP_RESPONSE: 'auth/invalid-credential',\r\n INVALID_LOGIN_CREDENTIALS: 'auth/invalid-credential',\r\n INVALID_MESSAGE_PAYLOAD: 'auth/invalid-message-payload',\r\n INVALID_MFA_SESSION: 'auth/invalid-multi-factor-session',\r\n INVALID_OAUTH_CLIENT_ID: 'auth/invalid-oauth-client-id',\r\n INVALID_OAUTH_PROVIDER: 'auth/invalid-oauth-provider',\r\n INVALID_OOB_CODE: 'auth/invalid-action-code',\r\n INVALID_ORIGIN: 'auth/unauthorized-domain',\r\n INVALID_PASSWORD: 'auth/wrong-password',\r\n INVALID_PERSISTENCE: 'auth/invalid-persistence-type',\r\n INVALID_PHONE_NUMBER: 'auth/invalid-phone-number',\r\n INVALID_PROVIDER_ID: 'auth/invalid-provider-id',\r\n INVALID_RECIPIENT_EMAIL: 'auth/invalid-recipient-email',\r\n INVALID_SENDER: 'auth/invalid-sender',\r\n INVALID_SESSION_INFO: 'auth/invalid-verification-id',\r\n INVALID_TENANT_ID: 'auth/invalid-tenant-id',\r\n MFA_INFO_NOT_FOUND: 'auth/multi-factor-info-not-found',\r\n MFA_REQUIRED: 'auth/multi-factor-auth-required',\r\n MISSING_ANDROID_PACKAGE_NAME: 'auth/missing-android-pkg-name',\r\n MISSING_APP_CREDENTIAL: 'auth/missing-app-credential',\r\n MISSING_AUTH_DOMAIN: 'auth/auth-domain-config-required',\r\n MISSING_CODE: 'auth/missing-verification-code',\r\n MISSING_CONTINUE_URI: 'auth/missing-continue-uri',\r\n MISSING_IFRAME_START: 'auth/missing-iframe-start',\r\n MISSING_IOS_BUNDLE_ID: 'auth/missing-ios-bundle-id',\r\n MISSING_OR_INVALID_NONCE: 'auth/missing-or-invalid-nonce',\r\n MISSING_MFA_INFO: 'auth/missing-multi-factor-info',\r\n MISSING_MFA_SESSION: 'auth/missing-multi-factor-session',\r\n MISSING_PHONE_NUMBER: 'auth/missing-phone-number',\r\n MISSING_SESSION_INFO: 'auth/missing-verification-id',\r\n MODULE_DESTROYED: 'auth/app-deleted',\r\n NEED_CONFIRMATION: 'auth/account-exists-with-different-credential',\r\n NETWORK_REQUEST_FAILED: 'auth/network-request-failed',\r\n NULL_USER: 'auth/null-user',\r\n NO_AUTH_EVENT: 'auth/no-auth-event',\r\n NO_SUCH_PROVIDER: 'auth/no-such-provider',\r\n OPERATION_NOT_ALLOWED: 'auth/operation-not-allowed',\r\n OPERATION_NOT_SUPPORTED: 'auth/operation-not-supported-in-this-environment',\r\n POPUP_BLOCKED: 'auth/popup-blocked',\r\n POPUP_CLOSED_BY_USER: 'auth/popup-closed-by-user',\r\n PROVIDER_ALREADY_LINKED: 'auth/provider-already-linked',\r\n QUOTA_EXCEEDED: 'auth/quota-exceeded',\r\n REDIRECT_CANCELLED_BY_USER: 'auth/redirect-cancelled-by-user',\r\n REDIRECT_OPERATION_PENDING: 'auth/redirect-operation-pending',\r\n REJECTED_CREDENTIAL: 'auth/rejected-credential',\r\n SECOND_FACTOR_ALREADY_ENROLLED: 'auth/second-factor-already-in-use',\r\n SECOND_FACTOR_LIMIT_EXCEEDED: 'auth/maximum-second-factor-count-exceeded',\r\n TENANT_ID_MISMATCH: 'auth/tenant-id-mismatch',\r\n TIMEOUT: 'auth/timeout',\r\n TOKEN_EXPIRED: 'auth/user-token-expired',\r\n TOO_MANY_ATTEMPTS_TRY_LATER: 'auth/too-many-requests',\r\n UNAUTHORIZED_DOMAIN: 'auth/unauthorized-continue-uri',\r\n UNSUPPORTED_FIRST_FACTOR: 'auth/unsupported-first-factor',\r\n UNSUPPORTED_PERSISTENCE: 'auth/unsupported-persistence-type',\r\n UNSUPPORTED_TENANT_OPERATION: 'auth/unsupported-tenant-operation',\r\n UNVERIFIED_EMAIL: 'auth/unverified-email',\r\n USER_CANCELLED: 'auth/user-cancelled',\r\n USER_DELETED: 'auth/user-not-found',\r\n USER_DISABLED: 'auth/user-disabled',\r\n USER_MISMATCH: 'auth/user-mismatch',\r\n USER_SIGNED_OUT: 'auth/user-signed-out',\r\n WEAK_PASSWORD: 'auth/weak-password',\r\n WEB_STORAGE_UNSUPPORTED: 'auth/web-storage-unsupported',\r\n ALREADY_INITIALIZED: 'auth/already-initialized',\r\n RECAPTCHA_NOT_ENABLED: 'auth/recaptcha-not-enabled',\r\n MISSING_RECAPTCHA_TOKEN: 'auth/missing-recaptcha-token',\r\n INVALID_RECAPTCHA_TOKEN: 'auth/invalid-recaptcha-token',\r\n INVALID_RECAPTCHA_ACTION: 'auth/invalid-recaptcha-action',\r\n MISSING_CLIENT_TYPE: 'auth/missing-client-type',\r\n MISSING_RECAPTCHA_VERSION: 'auth/missing-recaptcha-version',\r\n INVALID_RECAPTCHA_VERSION: 'auth/invalid-recaptcha-version',\r\n INVALID_REQ_TYPE: 'auth/invalid-req-type'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst logClient = new Logger('@firebase/auth');\r\nfunction _logWarn(msg, ...args) {\r\n if (logClient.logLevel <= LogLevel.WARN) {\r\n logClient.warn(`Auth (${SDK_VERSION}): ${msg}`, ...args);\r\n }\r\n}\r\nfunction _logError(msg, ...args) {\r\n if (logClient.logLevel <= LogLevel.ERROR) {\r\n logClient.error(`Auth (${SDK_VERSION}): ${msg}`, ...args);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _fail(authOrCode, ...rest) {\r\n throw createErrorInternal(authOrCode, ...rest);\r\n}\r\nfunction _createError(authOrCode, ...rest) {\r\n return createErrorInternal(authOrCode, ...rest);\r\n}\r\nfunction _errorWithCustomMessage(auth, code, message) {\r\n const errorMap = Object.assign(Object.assign({}, prodErrorMap()), { [code]: message });\r\n const factory = new ErrorFactory('auth', 'Firebase', errorMap);\r\n return factory.create(code, {\r\n appName: auth.name\r\n });\r\n}\r\nfunction _serverAppCurrentUserOperationNotSupportedError(auth) {\r\n return _errorWithCustomMessage(auth, \"operation-not-supported-in-this-environment\" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */, 'Operations that alter the current user are not supported in conjunction with FirebaseServerApp');\r\n}\r\nfunction _assertInstanceOf(auth, object, instance) {\r\n const constructorInstance = instance;\r\n if (!(object instanceof constructorInstance)) {\r\n if (constructorInstance.name !== object.constructor.name) {\r\n _fail(auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n }\r\n throw _errorWithCustomMessage(auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */, `Type of ${object.constructor.name} does not match expected instance.` +\r\n `Did you pass a reference from a different Auth SDK?`);\r\n }\r\n}\r\nfunction createErrorInternal(authOrCode, ...rest) {\r\n if (typeof authOrCode !== 'string') {\r\n const code = rest[0];\r\n const fullParams = [...rest.slice(1)];\r\n if (fullParams[0]) {\r\n fullParams[0].appName = authOrCode.name;\r\n }\r\n return authOrCode._errorFactory.create(code, ...fullParams);\r\n }\r\n return _DEFAULT_AUTH_ERROR_FACTORY.create(authOrCode, ...rest);\r\n}\r\nfunction _assert(assertion, authOrCode, ...rest) {\r\n if (!assertion) {\r\n throw createErrorInternal(authOrCode, ...rest);\r\n }\r\n}\r\n/**\r\n * Unconditionally fails, throwing an internal error with the given message.\r\n *\r\n * @param failure type of failure encountered\r\n * @throws Error\r\n */\r\nfunction debugFail(failure) {\r\n // Log the failure in addition to throw an exception, just in case the\r\n // exception is swallowed.\r\n const message = `INTERNAL ASSERTION FAILED: ` + failure;\r\n _logError(message);\r\n // NOTE: We don't use FirebaseError here because these are internal failures\r\n // that cannot be handled by the user. (Also it would create a circular\r\n // dependency between the error and assert modules which doesn't work.)\r\n throw new Error(message);\r\n}\r\n/**\r\n * Fails if the given assertion condition is false, throwing an Error with the\r\n * given message if it did.\r\n *\r\n * @param assertion\r\n * @param message\r\n */\r\nfunction debugAssert(assertion, message) {\r\n if (!assertion) {\r\n debugFail(message);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _getCurrentUrl() {\r\n var _a;\r\n return (typeof self !== 'undefined' && ((_a = self.location) === null || _a === void 0 ? void 0 : _a.href)) || '';\r\n}\r\nfunction _isHttpOrHttps() {\r\n return _getCurrentScheme() === 'http:' || _getCurrentScheme() === 'https:';\r\n}\r\nfunction _getCurrentScheme() {\r\n var _a;\r\n return (typeof self !== 'undefined' && ((_a = self.location) === null || _a === void 0 ? void 0 : _a.protocol)) || null;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Determine whether the browser is working online\r\n */\r\nfunction _isOnline() {\r\n if (typeof navigator !== 'undefined' &&\r\n navigator &&\r\n 'onLine' in navigator &&\r\n typeof navigator.onLine === 'boolean' &&\r\n // Apply only for traditional web apps and Chrome extensions.\r\n // This is especially true for Cordova apps which have unreliable\r\n // navigator.onLine behavior unless cordova-plugin-network-information is\r\n // installed which overwrites the native navigator.onLine value and\r\n // defines navigator.connection.\r\n (_isHttpOrHttps() || isBrowserExtension() || 'connection' in navigator)) {\r\n return navigator.onLine;\r\n }\r\n // If we can't determine the state, assume it is online.\r\n return true;\r\n}\r\nfunction _getUserLanguage() {\r\n if (typeof navigator === 'undefined') {\r\n return null;\r\n }\r\n const navigatorLanguage = navigator;\r\n return (\r\n // Most reliable, but only supported in Chrome/Firefox.\r\n (navigatorLanguage.languages && navigatorLanguage.languages[0]) ||\r\n // Supported in most browsers, but returns the language of the browser\r\n // UI, not the language set in browser settings.\r\n navigatorLanguage.language ||\r\n // Couldn't determine language.\r\n null);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A structure to help pick between a range of long and short delay durations\r\n * depending on the current environment. In general, the long delay is used for\r\n * mobile environments whereas short delays are used for desktop environments.\r\n */\r\nclass Delay {\r\n constructor(shortDelay, longDelay) {\r\n this.shortDelay = shortDelay;\r\n this.longDelay = longDelay;\r\n // Internal error when improperly initialized.\r\n debugAssert(longDelay > shortDelay, 'Short delay should be less than long delay!');\r\n this.isMobile = isMobileCordova() || isReactNative();\r\n }\r\n get() {\r\n if (!_isOnline()) {\r\n // Pick the shorter timeout.\r\n return Math.min(5000 /* DelayMin.OFFLINE */, this.shortDelay);\r\n }\r\n // If running in a mobile environment, return the long delay, otherwise\r\n // return the short delay.\r\n // This could be improved in the future to dynamically change based on other\r\n // variables instead of just reading the current environment.\r\n return this.isMobile ? this.longDelay : this.shortDelay;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _emulatorUrl(config, path) {\r\n debugAssert(config.emulator, 'Emulator should always be set here');\r\n const { url } = config.emulator;\r\n if (!path) {\r\n return url;\r\n }\r\n return `${url}${path.startsWith('/') ? path.slice(1) : path}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass FetchProvider {\r\n static initialize(fetchImpl, headersImpl, responseImpl) {\r\n this.fetchImpl = fetchImpl;\r\n if (headersImpl) {\r\n this.headersImpl = headersImpl;\r\n }\r\n if (responseImpl) {\r\n this.responseImpl = responseImpl;\r\n }\r\n }\r\n static fetch() {\r\n if (this.fetchImpl) {\r\n return this.fetchImpl;\r\n }\r\n if (typeof self !== 'undefined' && 'fetch' in self) {\r\n return self.fetch;\r\n }\r\n if (typeof globalThis !== 'undefined' && globalThis.fetch) {\r\n return globalThis.fetch;\r\n }\r\n if (typeof fetch !== 'undefined') {\r\n return fetch;\r\n }\r\n debugFail('Could not find fetch implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill');\r\n }\r\n static headers() {\r\n if (this.headersImpl) {\r\n return this.headersImpl;\r\n }\r\n if (typeof self !== 'undefined' && 'Headers' in self) {\r\n return self.Headers;\r\n }\r\n if (typeof globalThis !== 'undefined' && globalThis.Headers) {\r\n return globalThis.Headers;\r\n }\r\n if (typeof Headers !== 'undefined') {\r\n return Headers;\r\n }\r\n debugFail('Could not find Headers implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill');\r\n }\r\n static response() {\r\n if (this.responseImpl) {\r\n return this.responseImpl;\r\n }\r\n if (typeof self !== 'undefined' && 'Response' in self) {\r\n return self.Response;\r\n }\r\n if (typeof globalThis !== 'undefined' && globalThis.Response) {\r\n return globalThis.Response;\r\n }\r\n if (typeof Response !== 'undefined') {\r\n return Response;\r\n }\r\n debugFail('Could not find Response implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill');\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Map from errors returned by the server to errors to developer visible errors\r\n */\r\nconst SERVER_ERROR_MAP = {\r\n // Custom token errors.\r\n [\"CREDENTIAL_MISMATCH\" /* ServerError.CREDENTIAL_MISMATCH */]: \"custom-token-mismatch\" /* AuthErrorCode.CREDENTIAL_MISMATCH */,\r\n // This can only happen if the SDK sends a bad request.\r\n [\"MISSING_CUSTOM_TOKEN\" /* ServerError.MISSING_CUSTOM_TOKEN */]: \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */,\r\n // Create Auth URI errors.\r\n [\"INVALID_IDENTIFIER\" /* ServerError.INVALID_IDENTIFIER */]: \"invalid-email\" /* AuthErrorCode.INVALID_EMAIL */,\r\n // This can only happen if the SDK sends a bad request.\r\n [\"MISSING_CONTINUE_URI\" /* ServerError.MISSING_CONTINUE_URI */]: \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */,\r\n // Sign in with email and password errors (some apply to sign up too).\r\n [\"INVALID_PASSWORD\" /* ServerError.INVALID_PASSWORD */]: \"wrong-password\" /* AuthErrorCode.INVALID_PASSWORD */,\r\n // This can only happen if the SDK sends a bad request.\r\n [\"MISSING_PASSWORD\" /* ServerError.MISSING_PASSWORD */]: \"missing-password\" /* AuthErrorCode.MISSING_PASSWORD */,\r\n // Thrown if Email Enumeration Protection is enabled in the project and the email or password is\r\n // invalid.\r\n [\"INVALID_LOGIN_CREDENTIALS\" /* ServerError.INVALID_LOGIN_CREDENTIALS */]: \"invalid-credential\" /* AuthErrorCode.INVALID_CREDENTIAL */,\r\n // Sign up with email and password errors.\r\n [\"EMAIL_EXISTS\" /* ServerError.EMAIL_EXISTS */]: \"email-already-in-use\" /* AuthErrorCode.EMAIL_EXISTS */,\r\n [\"PASSWORD_LOGIN_DISABLED\" /* ServerError.PASSWORD_LOGIN_DISABLED */]: \"operation-not-allowed\" /* AuthErrorCode.OPERATION_NOT_ALLOWED */,\r\n // Verify assertion for sign in with credential errors:\r\n [\"INVALID_IDP_RESPONSE\" /* ServerError.INVALID_IDP_RESPONSE */]: \"invalid-credential\" /* AuthErrorCode.INVALID_CREDENTIAL */,\r\n [\"INVALID_PENDING_TOKEN\" /* ServerError.INVALID_PENDING_TOKEN */]: \"invalid-credential\" /* AuthErrorCode.INVALID_CREDENTIAL */,\r\n [\"FEDERATED_USER_ID_ALREADY_LINKED\" /* ServerError.FEDERATED_USER_ID_ALREADY_LINKED */]: \"credential-already-in-use\" /* AuthErrorCode.CREDENTIAL_ALREADY_IN_USE */,\r\n // This can only happen if the SDK sends a bad request.\r\n [\"MISSING_REQ_TYPE\" /* ServerError.MISSING_REQ_TYPE */]: \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */,\r\n // Send Password reset email errors:\r\n [\"EMAIL_NOT_FOUND\" /* ServerError.EMAIL_NOT_FOUND */]: \"user-not-found\" /* AuthErrorCode.USER_DELETED */,\r\n [\"RESET_PASSWORD_EXCEED_LIMIT\" /* ServerError.RESET_PASSWORD_EXCEED_LIMIT */]: \"too-many-requests\" /* AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER */,\r\n [\"EXPIRED_OOB_CODE\" /* ServerError.EXPIRED_OOB_CODE */]: \"expired-action-code\" /* AuthErrorCode.EXPIRED_OOB_CODE */,\r\n [\"INVALID_OOB_CODE\" /* ServerError.INVALID_OOB_CODE */]: \"invalid-action-code\" /* AuthErrorCode.INVALID_OOB_CODE */,\r\n // This can only happen if the SDK sends a bad request.\r\n [\"MISSING_OOB_CODE\" /* ServerError.MISSING_OOB_CODE */]: \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */,\r\n // Operations that require ID token in request:\r\n [\"CREDENTIAL_TOO_OLD_LOGIN_AGAIN\" /* ServerError.CREDENTIAL_TOO_OLD_LOGIN_AGAIN */]: \"requires-recent-login\" /* AuthErrorCode.CREDENTIAL_TOO_OLD_LOGIN_AGAIN */,\r\n [\"INVALID_ID_TOKEN\" /* ServerError.INVALID_ID_TOKEN */]: \"invalid-user-token\" /* AuthErrorCode.INVALID_AUTH */,\r\n [\"TOKEN_EXPIRED\" /* ServerError.TOKEN_EXPIRED */]: \"user-token-expired\" /* AuthErrorCode.TOKEN_EXPIRED */,\r\n [\"USER_NOT_FOUND\" /* ServerError.USER_NOT_FOUND */]: \"user-token-expired\" /* AuthErrorCode.TOKEN_EXPIRED */,\r\n // Other errors.\r\n [\"TOO_MANY_ATTEMPTS_TRY_LATER\" /* ServerError.TOO_MANY_ATTEMPTS_TRY_LATER */]: \"too-many-requests\" /* AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER */,\r\n [\"PASSWORD_DOES_NOT_MEET_REQUIREMENTS\" /* ServerError.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */]: \"password-does-not-meet-requirements\" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */,\r\n // Phone Auth related errors.\r\n [\"INVALID_CODE\" /* ServerError.INVALID_CODE */]: \"invalid-verification-code\" /* AuthErrorCode.INVALID_CODE */,\r\n [\"INVALID_SESSION_INFO\" /* ServerError.INVALID_SESSION_INFO */]: \"invalid-verification-id\" /* AuthErrorCode.INVALID_SESSION_INFO */,\r\n [\"INVALID_TEMPORARY_PROOF\" /* ServerError.INVALID_TEMPORARY_PROOF */]: \"invalid-credential\" /* AuthErrorCode.INVALID_CREDENTIAL */,\r\n [\"MISSING_SESSION_INFO\" /* ServerError.MISSING_SESSION_INFO */]: \"missing-verification-id\" /* AuthErrorCode.MISSING_SESSION_INFO */,\r\n [\"SESSION_EXPIRED\" /* ServerError.SESSION_EXPIRED */]: \"code-expired\" /* AuthErrorCode.CODE_EXPIRED */,\r\n // Other action code errors when additional settings passed.\r\n // MISSING_CONTINUE_URI is getting mapped to INTERNAL_ERROR above.\r\n // This is OK as this error will be caught by client side validation.\r\n [\"MISSING_ANDROID_PACKAGE_NAME\" /* ServerError.MISSING_ANDROID_PACKAGE_NAME */]: \"missing-android-pkg-name\" /* AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME */,\r\n [\"UNAUTHORIZED_DOMAIN\" /* ServerError.UNAUTHORIZED_DOMAIN */]: \"unauthorized-continue-uri\" /* AuthErrorCode.UNAUTHORIZED_DOMAIN */,\r\n // getProjectConfig errors when clientId is passed.\r\n [\"INVALID_OAUTH_CLIENT_ID\" /* ServerError.INVALID_OAUTH_CLIENT_ID */]: \"invalid-oauth-client-id\" /* AuthErrorCode.INVALID_OAUTH_CLIENT_ID */,\r\n // User actions (sign-up or deletion) disabled errors.\r\n [\"ADMIN_ONLY_OPERATION\" /* ServerError.ADMIN_ONLY_OPERATION */]: \"admin-restricted-operation\" /* AuthErrorCode.ADMIN_ONLY_OPERATION */,\r\n // Multi factor related errors.\r\n [\"INVALID_MFA_PENDING_CREDENTIAL\" /* ServerError.INVALID_MFA_PENDING_CREDENTIAL */]: \"invalid-multi-factor-session\" /* AuthErrorCode.INVALID_MFA_SESSION */,\r\n [\"MFA_ENROLLMENT_NOT_FOUND\" /* ServerError.MFA_ENROLLMENT_NOT_FOUND */]: \"multi-factor-info-not-found\" /* AuthErrorCode.MFA_INFO_NOT_FOUND */,\r\n [\"MISSING_MFA_ENROLLMENT_ID\" /* ServerError.MISSING_MFA_ENROLLMENT_ID */]: \"missing-multi-factor-info\" /* AuthErrorCode.MISSING_MFA_INFO */,\r\n [\"MISSING_MFA_PENDING_CREDENTIAL\" /* ServerError.MISSING_MFA_PENDING_CREDENTIAL */]: \"missing-multi-factor-session\" /* AuthErrorCode.MISSING_MFA_SESSION */,\r\n [\"SECOND_FACTOR_EXISTS\" /* ServerError.SECOND_FACTOR_EXISTS */]: \"second-factor-already-in-use\" /* AuthErrorCode.SECOND_FACTOR_ALREADY_ENROLLED */,\r\n [\"SECOND_FACTOR_LIMIT_EXCEEDED\" /* ServerError.SECOND_FACTOR_LIMIT_EXCEEDED */]: \"maximum-second-factor-count-exceeded\" /* AuthErrorCode.SECOND_FACTOR_LIMIT_EXCEEDED */,\r\n // Blocking functions related errors.\r\n [\"BLOCKING_FUNCTION_ERROR_RESPONSE\" /* ServerError.BLOCKING_FUNCTION_ERROR_RESPONSE */]: \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */,\r\n // Recaptcha related errors.\r\n [\"RECAPTCHA_NOT_ENABLED\" /* ServerError.RECAPTCHA_NOT_ENABLED */]: \"recaptcha-not-enabled\" /* AuthErrorCode.RECAPTCHA_NOT_ENABLED */,\r\n [\"MISSING_RECAPTCHA_TOKEN\" /* ServerError.MISSING_RECAPTCHA_TOKEN */]: \"missing-recaptcha-token\" /* AuthErrorCode.MISSING_RECAPTCHA_TOKEN */,\r\n [\"INVALID_RECAPTCHA_TOKEN\" /* ServerError.INVALID_RECAPTCHA_TOKEN */]: \"invalid-recaptcha-token\" /* AuthErrorCode.INVALID_RECAPTCHA_TOKEN */,\r\n [\"INVALID_RECAPTCHA_ACTION\" /* ServerError.INVALID_RECAPTCHA_ACTION */]: \"invalid-recaptcha-action\" /* AuthErrorCode.INVALID_RECAPTCHA_ACTION */,\r\n [\"MISSING_CLIENT_TYPE\" /* ServerError.MISSING_CLIENT_TYPE */]: \"missing-client-type\" /* AuthErrorCode.MISSING_CLIENT_TYPE */,\r\n [\"MISSING_RECAPTCHA_VERSION\" /* ServerError.MISSING_RECAPTCHA_VERSION */]: \"missing-recaptcha-version\" /* AuthErrorCode.MISSING_RECAPTCHA_VERSION */,\r\n [\"INVALID_RECAPTCHA_VERSION\" /* ServerError.INVALID_RECAPTCHA_VERSION */]: \"invalid-recaptcha-version\" /* AuthErrorCode.INVALID_RECAPTCHA_VERSION */,\r\n [\"INVALID_REQ_TYPE\" /* ServerError.INVALID_REQ_TYPE */]: \"invalid-req-type\" /* AuthErrorCode.INVALID_REQ_TYPE */\r\n};\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_API_TIMEOUT_MS = new Delay(30000, 60000);\r\nfunction _addTidIfNecessary(auth, request) {\r\n if (auth.tenantId && !request.tenantId) {\r\n return Object.assign(Object.assign({}, request), { tenantId: auth.tenantId });\r\n }\r\n return request;\r\n}\r\nasync function _performApiRequest(auth, method, path, request, customErrorMap = {}) {\r\n return _performFetchWithErrorHandling(auth, customErrorMap, async () => {\r\n let body = {};\r\n let params = {};\r\n if (request) {\r\n if (method === \"GET\" /* HttpMethod.GET */) {\r\n params = request;\r\n }\r\n else {\r\n body = {\r\n body: JSON.stringify(request)\r\n };\r\n }\r\n }\r\n const query = querystring(Object.assign({ key: auth.config.apiKey }, params)).slice(1);\r\n const headers = await auth._getAdditionalHeaders();\r\n headers[\"Content-Type\" /* HttpHeader.CONTENT_TYPE */] = 'application/json';\r\n if (auth.languageCode) {\r\n headers[\"X-Firebase-Locale\" /* HttpHeader.X_FIREBASE_LOCALE */] = auth.languageCode;\r\n }\r\n const fetchArgs = Object.assign({ method,\r\n headers }, body);\r\n /* Security-conscious server-side frameworks tend to have built in mitigations for referrer\r\n problems\". See the Cloudflare GitHub issue #487: Error: The 'referrerPolicy' field on\r\n 'RequestInitializerDict' is not implemented.\"\r\n https://github.com/cloudflare/next-on-pages/issues/487 */\r\n if (!isCloudflareWorker()) {\r\n fetchArgs.referrerPolicy = 'no-referrer';\r\n }\r\n return FetchProvider.fetch()(_getFinalTarget(auth, auth.config.apiHost, path, query), fetchArgs);\r\n });\r\n}\r\nasync function _performFetchWithErrorHandling(auth, customErrorMap, fetchFn) {\r\n auth._canInitEmulator = false;\r\n const errorMap = Object.assign(Object.assign({}, SERVER_ERROR_MAP), customErrorMap);\r\n try {\r\n const networkTimeout = new NetworkTimeout(auth);\r\n const response = await Promise.race([\r\n fetchFn(),\r\n networkTimeout.promise\r\n ]);\r\n // If we've reached this point, the fetch succeeded and the networkTimeout\r\n // didn't throw; clear the network timeout delay so that Node won't hang\r\n networkTimeout.clearNetworkTimeout();\r\n const json = await response.json();\r\n if ('needConfirmation' in json) {\r\n throw _makeTaggedError(auth, \"account-exists-with-different-credential\" /* AuthErrorCode.NEED_CONFIRMATION */, json);\r\n }\r\n if (response.ok && !('errorMessage' in json)) {\r\n return json;\r\n }\r\n else {\r\n const errorMessage = response.ok ? json.errorMessage : json.error.message;\r\n const [serverErrorCode, serverErrorMessage] = errorMessage.split(' : ');\r\n if (serverErrorCode === \"FEDERATED_USER_ID_ALREADY_LINKED\" /* ServerError.FEDERATED_USER_ID_ALREADY_LINKED */) {\r\n throw _makeTaggedError(auth, \"credential-already-in-use\" /* AuthErrorCode.CREDENTIAL_ALREADY_IN_USE */, json);\r\n }\r\n else if (serverErrorCode === \"EMAIL_EXISTS\" /* ServerError.EMAIL_EXISTS */) {\r\n throw _makeTaggedError(auth, \"email-already-in-use\" /* AuthErrorCode.EMAIL_EXISTS */, json);\r\n }\r\n else if (serverErrorCode === \"USER_DISABLED\" /* ServerError.USER_DISABLED */) {\r\n throw _makeTaggedError(auth, \"user-disabled\" /* AuthErrorCode.USER_DISABLED */, json);\r\n }\r\n const authError = errorMap[serverErrorCode] ||\r\n serverErrorCode\r\n .toLowerCase()\r\n .replace(/[_\\s]+/g, '-');\r\n if (serverErrorMessage) {\r\n throw _errorWithCustomMessage(auth, authError, serverErrorMessage);\r\n }\r\n else {\r\n _fail(auth, authError);\r\n }\r\n }\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError) {\r\n throw e;\r\n }\r\n // Changing this to a different error code will log user out when there is a network error\r\n // because we treat any error other than NETWORK_REQUEST_FAILED as token is invalid.\r\n // https://github.com/firebase/firebase-js-sdk/blob/4fbc73610d70be4e0852e7de63a39cb7897e8546/packages/auth/src/core/auth/auth_impl.ts#L309-L316\r\n _fail(auth, \"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */, { 'message': String(e) });\r\n }\r\n}\r\nasync function _performSignInRequest(auth, method, path, request, customErrorMap = {}) {\r\n const serverResponse = (await _performApiRequest(auth, method, path, request, customErrorMap));\r\n if ('mfaPendingCredential' in serverResponse) {\r\n _fail(auth, \"multi-factor-auth-required\" /* AuthErrorCode.MFA_REQUIRED */, {\r\n _serverResponse: serverResponse\r\n });\r\n }\r\n return serverResponse;\r\n}\r\nfunction _getFinalTarget(auth, host, path, query) {\r\n const base = `${host}${path}?${query}`;\r\n if (!auth.config.emulator) {\r\n return `${auth.config.apiScheme}://${base}`;\r\n }\r\n return _emulatorUrl(auth.config, base);\r\n}\r\nfunction _parseEnforcementState(enforcementStateStr) {\r\n switch (enforcementStateStr) {\r\n case 'ENFORCE':\r\n return \"ENFORCE\" /* EnforcementState.ENFORCE */;\r\n case 'AUDIT':\r\n return \"AUDIT\" /* EnforcementState.AUDIT */;\r\n case 'OFF':\r\n return \"OFF\" /* EnforcementState.OFF */;\r\n default:\r\n return \"ENFORCEMENT_STATE_UNSPECIFIED\" /* EnforcementState.ENFORCEMENT_STATE_UNSPECIFIED */;\r\n }\r\n}\r\nclass NetworkTimeout {\r\n constructor(auth) {\r\n this.auth = auth;\r\n // Node timers and browser timers are fundamentally incompatible, but we\r\n // don't care about the value here\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n this.timer = null;\r\n this.promise = new Promise((_, reject) => {\r\n this.timer = setTimeout(() => {\r\n return reject(_createError(this.auth, \"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */));\r\n }, DEFAULT_API_TIMEOUT_MS.get());\r\n });\r\n }\r\n clearNetworkTimeout() {\r\n clearTimeout(this.timer);\r\n }\r\n}\r\nfunction _makeTaggedError(auth, code, response) {\r\n const errorParams = {\r\n appName: auth.name\r\n };\r\n if (response.email) {\r\n errorParams.email = response.email;\r\n }\r\n if (response.phoneNumber) {\r\n errorParams.phoneNumber = response.phoneNumber;\r\n }\r\n const error = _createError(auth, code, errorParams);\r\n // We know customData is defined on error because errorParams is defined\r\n error.customData._tokenResponse = response;\r\n return error;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction isV2(grecaptcha) {\r\n return (grecaptcha !== undefined &&\r\n grecaptcha.getResponse !== undefined);\r\n}\r\nfunction isEnterprise(grecaptcha) {\r\n return (grecaptcha !== undefined &&\r\n grecaptcha.enterprise !== undefined);\r\n}\r\nclass RecaptchaConfig {\r\n constructor(response) {\r\n /**\r\n * The reCAPTCHA site key.\r\n */\r\n this.siteKey = '';\r\n /**\r\n * The list of providers and their enablement status for reCAPTCHA Enterprise.\r\n */\r\n this.recaptchaEnforcementState = [];\r\n if (response.recaptchaKey === undefined) {\r\n throw new Error('recaptchaKey undefined');\r\n }\r\n // Example response.recaptchaKey: \"projects/proj123/keys/sitekey123\"\r\n this.siteKey = response.recaptchaKey.split('/')[3];\r\n this.recaptchaEnforcementState = response.recaptchaEnforcementState;\r\n }\r\n /**\r\n * Returns the reCAPTCHA Enterprise enforcement state for the given provider.\r\n *\r\n * @param providerStr - The provider whose enforcement state is to be returned.\r\n * @returns The reCAPTCHA Enterprise enforcement state for the given provider.\r\n */\r\n getProviderEnforcementState(providerStr) {\r\n if (!this.recaptchaEnforcementState ||\r\n this.recaptchaEnforcementState.length === 0) {\r\n return null;\r\n }\r\n for (const recaptchaEnforcementState of this.recaptchaEnforcementState) {\r\n if (recaptchaEnforcementState.provider &&\r\n recaptchaEnforcementState.provider === providerStr) {\r\n return _parseEnforcementState(recaptchaEnforcementState.enforcementState);\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Returns true if the reCAPTCHA Enterprise enforcement state for the provider is set to ENFORCE or AUDIT.\r\n *\r\n * @param providerStr - The provider whose enablement state is to be returned.\r\n * @returns Whether or not reCAPTCHA Enterprise protection is enabled for the given provider.\r\n */\r\n isProviderEnabled(providerStr) {\r\n return (this.getProviderEnforcementState(providerStr) ===\r\n \"ENFORCE\" /* EnforcementState.ENFORCE */ ||\r\n this.getProviderEnforcementState(providerStr) === \"AUDIT\" /* EnforcementState.AUDIT */);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function getRecaptchaParams(auth) {\r\n return ((await _performApiRequest(auth, \"GET\" /* HttpMethod.GET */, \"/v1/recaptchaParams\" /* Endpoint.GET_RECAPTCHA_PARAM */)).recaptchaSiteKey || '');\r\n}\r\nasync function getRecaptchaConfig(auth, request) {\r\n return _performApiRequest(auth, \"GET\" /* HttpMethod.GET */, \"/v2/recaptchaConfig\" /* Endpoint.GET_RECAPTCHA_CONFIG */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function deleteAccount(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:delete\" /* Endpoint.DELETE_ACCOUNT */, request);\r\n}\r\nasync function deleteLinkedAccounts(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:update\" /* Endpoint.SET_ACCOUNT_INFO */, request);\r\n}\r\nasync function getAccountInfo(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:lookup\" /* Endpoint.GET_ACCOUNT_INFO */, request);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction utcTimestampToDateString(utcTimestamp) {\r\n if (!utcTimestamp) {\r\n return undefined;\r\n }\r\n try {\r\n // Convert to date object.\r\n const date = new Date(Number(utcTimestamp));\r\n // Test date is valid.\r\n if (!isNaN(date.getTime())) {\r\n // Convert to UTC date string.\r\n return date.toUTCString();\r\n }\r\n }\r\n catch (e) {\r\n // Do nothing. undefined will be returned.\r\n }\r\n return undefined;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a JSON Web Token (JWT) used to identify the user to a Firebase service.\r\n *\r\n * @remarks\r\n * Returns the current token if it has not expired or if it will not expire in the next five\r\n * minutes. Otherwise, this will refresh the token and return a new one.\r\n *\r\n * @param user - The user.\r\n * @param forceRefresh - Force refresh regardless of token expiration.\r\n *\r\n * @public\r\n */\r\nfunction getIdToken(user, forceRefresh = false) {\r\n return getModularInstance(user).getIdToken(forceRefresh);\r\n}\r\n/**\r\n * Returns a deserialized JSON Web Token (JWT) used to identify the user to a Firebase service.\r\n *\r\n * @remarks\r\n * Returns the current token if it has not expired or if it will not expire in the next five\r\n * minutes. Otherwise, this will refresh the token and return a new one.\r\n *\r\n * @param user - The user.\r\n * @param forceRefresh - Force refresh regardless of token expiration.\r\n *\r\n * @public\r\n */\r\nasync function getIdTokenResult(user, forceRefresh = false) {\r\n const userInternal = getModularInstance(user);\r\n const token = await userInternal.getIdToken(forceRefresh);\r\n const claims = _parseToken(token);\r\n _assert(claims && claims.exp && claims.auth_time && claims.iat, userInternal.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const firebase = typeof claims.firebase === 'object' ? claims.firebase : undefined;\r\n const signInProvider = firebase === null || firebase === void 0 ? void 0 : firebase['sign_in_provider'];\r\n return {\r\n claims,\r\n token,\r\n authTime: utcTimestampToDateString(secondsStringToMilliseconds(claims.auth_time)),\r\n issuedAtTime: utcTimestampToDateString(secondsStringToMilliseconds(claims.iat)),\r\n expirationTime: utcTimestampToDateString(secondsStringToMilliseconds(claims.exp)),\r\n signInProvider: signInProvider || null,\r\n signInSecondFactor: (firebase === null || firebase === void 0 ? void 0 : firebase['sign_in_second_factor']) || null\r\n };\r\n}\r\nfunction secondsStringToMilliseconds(seconds) {\r\n return Number(seconds) * 1000;\r\n}\r\nfunction _parseToken(token) {\r\n const [algorithm, payload, signature] = token.split('.');\r\n if (algorithm === undefined ||\r\n payload === undefined ||\r\n signature === undefined) {\r\n _logError('JWT malformed, contained fewer than 3 sections');\r\n return null;\r\n }\r\n try {\r\n const decoded = base64Decode(payload);\r\n if (!decoded) {\r\n _logError('Failed to decode base64 JWT payload');\r\n return null;\r\n }\r\n return JSON.parse(decoded);\r\n }\r\n catch (e) {\r\n _logError('Caught error parsing JWT payload as JSON', e === null || e === void 0 ? void 0 : e.toString());\r\n return null;\r\n }\r\n}\r\n/**\r\n * Extract expiresIn TTL from a token by subtracting the expiration from the issuance.\r\n */\r\nfunction _tokenExpiresIn(token) {\r\n const parsedToken = _parseToken(token);\r\n _assert(parsedToken, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n _assert(typeof parsedToken.exp !== 'undefined', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n _assert(typeof parsedToken.iat !== 'undefined', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return Number(parsedToken.exp) - Number(parsedToken.iat);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function _logoutIfInvalidated(user, promise, bypassAuthState = false) {\r\n if (bypassAuthState) {\r\n return promise;\r\n }\r\n try {\r\n return await promise;\r\n }\r\n catch (e) {\r\n if (e instanceof FirebaseError && isUserInvalidated(e)) {\r\n if (user.auth.currentUser === user) {\r\n await user.auth.signOut();\r\n }\r\n }\r\n throw e;\r\n }\r\n}\r\nfunction isUserInvalidated({ code }) {\r\n return (code === `auth/${\"user-disabled\" /* AuthErrorCode.USER_DISABLED */}` ||\r\n code === `auth/${\"user-token-expired\" /* AuthErrorCode.TOKEN_EXPIRED */}`);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass ProactiveRefresh {\r\n constructor(user) {\r\n this.user = user;\r\n this.isRunning = false;\r\n // Node timers and browser timers return fundamentally different types.\r\n // We don't actually care what the value is but TS won't accept unknown and\r\n // we can't cast properly in both environments.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n this.timerId = null;\r\n this.errorBackoff = 30000 /* Duration.RETRY_BACKOFF_MIN */;\r\n }\r\n _start() {\r\n if (this.isRunning) {\r\n return;\r\n }\r\n this.isRunning = true;\r\n this.schedule();\r\n }\r\n _stop() {\r\n if (!this.isRunning) {\r\n return;\r\n }\r\n this.isRunning = false;\r\n if (this.timerId !== null) {\r\n clearTimeout(this.timerId);\r\n }\r\n }\r\n getInterval(wasError) {\r\n var _a;\r\n if (wasError) {\r\n const interval = this.errorBackoff;\r\n this.errorBackoff = Math.min(this.errorBackoff * 2, 960000 /* Duration.RETRY_BACKOFF_MAX */);\r\n return interval;\r\n }\r\n else {\r\n // Reset the error backoff\r\n this.errorBackoff = 30000 /* Duration.RETRY_BACKOFF_MIN */;\r\n const expTime = (_a = this.user.stsTokenManager.expirationTime) !== null && _a !== void 0 ? _a : 0;\r\n const interval = expTime - Date.now() - 300000 /* Duration.OFFSET */;\r\n return Math.max(0, interval);\r\n }\r\n }\r\n schedule(wasError = false) {\r\n if (!this.isRunning) {\r\n // Just in case...\r\n return;\r\n }\r\n const interval = this.getInterval(wasError);\r\n this.timerId = setTimeout(async () => {\r\n await this.iteration();\r\n }, interval);\r\n }\r\n async iteration() {\r\n try {\r\n await this.user.getIdToken(true);\r\n }\r\n catch (e) {\r\n // Only retry on network errors\r\n if ((e === null || e === void 0 ? void 0 : e.code) ===\r\n `auth/${\"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */}`) {\r\n this.schedule(/* wasError */ true);\r\n }\r\n return;\r\n }\r\n this.schedule();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass UserMetadata {\r\n constructor(createdAt, lastLoginAt) {\r\n this.createdAt = createdAt;\r\n this.lastLoginAt = lastLoginAt;\r\n this._initializeTime();\r\n }\r\n _initializeTime() {\r\n this.lastSignInTime = utcTimestampToDateString(this.lastLoginAt);\r\n this.creationTime = utcTimestampToDateString(this.createdAt);\r\n }\r\n _copy(metadata) {\r\n this.createdAt = metadata.createdAt;\r\n this.lastLoginAt = metadata.lastLoginAt;\r\n this._initializeTime();\r\n }\r\n toJSON() {\r\n return {\r\n createdAt: this.createdAt,\r\n lastLoginAt: this.lastLoginAt\r\n };\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function _reloadWithoutSaving(user) {\r\n var _a;\r\n const auth = user.auth;\r\n const idToken = await user.getIdToken();\r\n const response = await _logoutIfInvalidated(user, getAccountInfo(auth, { idToken }));\r\n _assert(response === null || response === void 0 ? void 0 : response.users.length, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const coreAccount = response.users[0];\r\n user._notifyReloadListener(coreAccount);\r\n const newProviderData = ((_a = coreAccount.providerUserInfo) === null || _a === void 0 ? void 0 : _a.length)\r\n ? extractProviderData(coreAccount.providerUserInfo)\r\n : [];\r\n const providerData = mergeProviderData(user.providerData, newProviderData);\r\n // Preserves the non-nonymous status of the stored user, even if no more\r\n // credentials (federated or email/password) are linked to the user. If\r\n // the user was previously anonymous, then use provider data to update.\r\n // On the other hand, if it was not anonymous before, it should never be\r\n // considered anonymous now.\r\n const oldIsAnonymous = user.isAnonymous;\r\n const newIsAnonymous = !(user.email && coreAccount.passwordHash) && !(providerData === null || providerData === void 0 ? void 0 : providerData.length);\r\n const isAnonymous = !oldIsAnonymous ? false : newIsAnonymous;\r\n const updates = {\r\n uid: coreAccount.localId,\r\n displayName: coreAccount.displayName || null,\r\n photoURL: coreAccount.photoUrl || null,\r\n email: coreAccount.email || null,\r\n emailVerified: coreAccount.emailVerified || false,\r\n phoneNumber: coreAccount.phoneNumber || null,\r\n tenantId: coreAccount.tenantId || null,\r\n providerData,\r\n metadata: new UserMetadata(coreAccount.createdAt, coreAccount.lastLoginAt),\r\n isAnonymous\r\n };\r\n Object.assign(user, updates);\r\n}\r\n/**\r\n * Reloads user account data, if signed in.\r\n *\r\n * @param user - The user.\r\n *\r\n * @public\r\n */\r\nasync function reload(user) {\r\n const userInternal = getModularInstance(user);\r\n await _reloadWithoutSaving(userInternal);\r\n // Even though the current user hasn't changed, update\r\n // current user will trigger a persistence update w/ the\r\n // new info.\r\n await userInternal.auth._persistUserIfCurrent(userInternal);\r\n userInternal.auth._notifyListenersIfCurrent(userInternal);\r\n}\r\nfunction mergeProviderData(original, newData) {\r\n const deduped = original.filter(o => !newData.some(n => n.providerId === o.providerId));\r\n return [...deduped, ...newData];\r\n}\r\nfunction extractProviderData(providers) {\r\n return providers.map((_a) => {\r\n var { providerId } = _a, provider = __rest(_a, [\"providerId\"]);\r\n return {\r\n providerId,\r\n uid: provider.rawId || '',\r\n displayName: provider.displayName || null,\r\n email: provider.email || null,\r\n phoneNumber: provider.phoneNumber || null,\r\n photoURL: provider.photoUrl || null\r\n };\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function requestStsToken(auth, refreshToken) {\r\n const response = await _performFetchWithErrorHandling(auth, {}, async () => {\r\n const body = querystring({\r\n 'grant_type': 'refresh_token',\r\n 'refresh_token': refreshToken\r\n }).slice(1);\r\n const { tokenApiHost, apiKey } = auth.config;\r\n const url = _getFinalTarget(auth, tokenApiHost, \"/v1/token\" /* Endpoint.TOKEN */, `key=${apiKey}`);\r\n const headers = await auth._getAdditionalHeaders();\r\n headers[\"Content-Type\" /* HttpHeader.CONTENT_TYPE */] = 'application/x-www-form-urlencoded';\r\n return FetchProvider.fetch()(url, {\r\n method: \"POST\" /* HttpMethod.POST */,\r\n headers,\r\n body\r\n });\r\n });\r\n // The response comes back in snake_case. Convert to camel:\r\n return {\r\n accessToken: response.access_token,\r\n expiresIn: response.expires_in,\r\n refreshToken: response.refresh_token\r\n };\r\n}\r\nasync function revokeToken(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts:revokeToken\" /* Endpoint.REVOKE_TOKEN */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * We need to mark this class as internal explicitly to exclude it in the public typings, because\r\n * it references AuthInternal which has a circular dependency with UserInternal.\r\n *\r\n * @internal\r\n */\r\nclass StsTokenManager {\r\n constructor() {\r\n this.refreshToken = null;\r\n this.accessToken = null;\r\n this.expirationTime = null;\r\n }\r\n get isExpired() {\r\n return (!this.expirationTime ||\r\n Date.now() > this.expirationTime - 30000 /* Buffer.TOKEN_REFRESH */);\r\n }\r\n updateFromServerResponse(response) {\r\n _assert(response.idToken, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n _assert(typeof response.idToken !== 'undefined', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n _assert(typeof response.refreshToken !== 'undefined', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const expiresIn = 'expiresIn' in response && typeof response.expiresIn !== 'undefined'\r\n ? Number(response.expiresIn)\r\n : _tokenExpiresIn(response.idToken);\r\n this.updateTokensAndExpiration(response.idToken, response.refreshToken, expiresIn);\r\n }\r\n updateFromIdToken(idToken) {\r\n _assert(idToken.length !== 0, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const expiresIn = _tokenExpiresIn(idToken);\r\n this.updateTokensAndExpiration(idToken, null, expiresIn);\r\n }\r\n async getToken(auth, forceRefresh = false) {\r\n if (!forceRefresh && this.accessToken && !this.isExpired) {\r\n return this.accessToken;\r\n }\r\n _assert(this.refreshToken, auth, \"user-token-expired\" /* AuthErrorCode.TOKEN_EXPIRED */);\r\n if (this.refreshToken) {\r\n await this.refresh(auth, this.refreshToken);\r\n return this.accessToken;\r\n }\r\n return null;\r\n }\r\n clearRefreshToken() {\r\n this.refreshToken = null;\r\n }\r\n async refresh(auth, oldToken) {\r\n const { accessToken, refreshToken, expiresIn } = await requestStsToken(auth, oldToken);\r\n this.updateTokensAndExpiration(accessToken, refreshToken, Number(expiresIn));\r\n }\r\n updateTokensAndExpiration(accessToken, refreshToken, expiresInSec) {\r\n this.refreshToken = refreshToken || null;\r\n this.accessToken = accessToken || null;\r\n this.expirationTime = Date.now() + expiresInSec * 1000;\r\n }\r\n static fromJSON(appName, object) {\r\n const { refreshToken, accessToken, expirationTime } = object;\r\n const manager = new StsTokenManager();\r\n if (refreshToken) {\r\n _assert(typeof refreshToken === 'string', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */, {\r\n appName\r\n });\r\n manager.refreshToken = refreshToken;\r\n }\r\n if (accessToken) {\r\n _assert(typeof accessToken === 'string', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */, {\r\n appName\r\n });\r\n manager.accessToken = accessToken;\r\n }\r\n if (expirationTime) {\r\n _assert(typeof expirationTime === 'number', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */, {\r\n appName\r\n });\r\n manager.expirationTime = expirationTime;\r\n }\r\n return manager;\r\n }\r\n toJSON() {\r\n return {\r\n refreshToken: this.refreshToken,\r\n accessToken: this.accessToken,\r\n expirationTime: this.expirationTime\r\n };\r\n }\r\n _assign(stsTokenManager) {\r\n this.accessToken = stsTokenManager.accessToken;\r\n this.refreshToken = stsTokenManager.refreshToken;\r\n this.expirationTime = stsTokenManager.expirationTime;\r\n }\r\n _clone() {\r\n return Object.assign(new StsTokenManager(), this.toJSON());\r\n }\r\n _performRefresh() {\r\n return debugFail('not implemented');\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction assertStringOrUndefined(assertion, appName) {\r\n _assert(typeof assertion === 'string' || typeof assertion === 'undefined', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */, { appName });\r\n}\r\nclass UserImpl {\r\n constructor(_a) {\r\n var { uid, auth, stsTokenManager } = _a, opt = __rest(_a, [\"uid\", \"auth\", \"stsTokenManager\"]);\r\n // For the user object, provider is always Firebase.\r\n this.providerId = \"firebase\" /* ProviderId.FIREBASE */;\r\n this.proactiveRefresh = new ProactiveRefresh(this);\r\n this.reloadUserInfo = null;\r\n this.reloadListener = null;\r\n this.uid = uid;\r\n this.auth = auth;\r\n this.stsTokenManager = stsTokenManager;\r\n this.accessToken = stsTokenManager.accessToken;\r\n this.displayName = opt.displayName || null;\r\n this.email = opt.email || null;\r\n this.emailVerified = opt.emailVerified || false;\r\n this.phoneNumber = opt.phoneNumber || null;\r\n this.photoURL = opt.photoURL || null;\r\n this.isAnonymous = opt.isAnonymous || false;\r\n this.tenantId = opt.tenantId || null;\r\n this.providerData = opt.providerData ? [...opt.providerData] : [];\r\n this.metadata = new UserMetadata(opt.createdAt || undefined, opt.lastLoginAt || undefined);\r\n }\r\n async getIdToken(forceRefresh) {\r\n const accessToken = await _logoutIfInvalidated(this, this.stsTokenManager.getToken(this.auth, forceRefresh));\r\n _assert(accessToken, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n if (this.accessToken !== accessToken) {\r\n this.accessToken = accessToken;\r\n await this.auth._persistUserIfCurrent(this);\r\n this.auth._notifyListenersIfCurrent(this);\r\n }\r\n return accessToken;\r\n }\r\n getIdTokenResult(forceRefresh) {\r\n return getIdTokenResult(this, forceRefresh);\r\n }\r\n reload() {\r\n return reload(this);\r\n }\r\n _assign(user) {\r\n if (this === user) {\r\n return;\r\n }\r\n _assert(this.uid === user.uid, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n this.displayName = user.displayName;\r\n this.photoURL = user.photoURL;\r\n this.email = user.email;\r\n this.emailVerified = user.emailVerified;\r\n this.phoneNumber = user.phoneNumber;\r\n this.isAnonymous = user.isAnonymous;\r\n this.tenantId = user.tenantId;\r\n this.providerData = user.providerData.map(userInfo => (Object.assign({}, userInfo)));\r\n this.metadata._copy(user.metadata);\r\n this.stsTokenManager._assign(user.stsTokenManager);\r\n }\r\n _clone(auth) {\r\n const newUser = new UserImpl(Object.assign(Object.assign({}, this), { auth, stsTokenManager: this.stsTokenManager._clone() }));\r\n newUser.metadata._copy(this.metadata);\r\n return newUser;\r\n }\r\n _onReload(callback) {\r\n // There should only ever be one listener, and that is a single instance of MultiFactorUser\r\n _assert(!this.reloadListener, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n this.reloadListener = callback;\r\n if (this.reloadUserInfo) {\r\n this._notifyReloadListener(this.reloadUserInfo);\r\n this.reloadUserInfo = null;\r\n }\r\n }\r\n _notifyReloadListener(userInfo) {\r\n if (this.reloadListener) {\r\n this.reloadListener(userInfo);\r\n }\r\n else {\r\n // If no listener is subscribed yet, save the result so it's available when they do subscribe\r\n this.reloadUserInfo = userInfo;\r\n }\r\n }\r\n _startProactiveRefresh() {\r\n this.proactiveRefresh._start();\r\n }\r\n _stopProactiveRefresh() {\r\n this.proactiveRefresh._stop();\r\n }\r\n async _updateTokensIfNecessary(response, reload = false) {\r\n let tokensRefreshed = false;\r\n if (response.idToken &&\r\n response.idToken !== this.stsTokenManager.accessToken) {\r\n this.stsTokenManager.updateFromServerResponse(response);\r\n tokensRefreshed = true;\r\n }\r\n if (reload) {\r\n await _reloadWithoutSaving(this);\r\n }\r\n await this.auth._persistUserIfCurrent(this);\r\n if (tokensRefreshed) {\r\n this.auth._notifyListenersIfCurrent(this);\r\n }\r\n }\r\n async delete() {\r\n if (_isFirebaseServerApp(this.auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(this.auth));\r\n }\r\n const idToken = await this.getIdToken();\r\n await _logoutIfInvalidated(this, deleteAccount(this.auth, { idToken }));\r\n this.stsTokenManager.clearRefreshToken();\r\n // TODO: Determine if cancellable-promises are necessary to use in this class so that delete()\r\n // cancels pending actions...\r\n return this.auth.signOut();\r\n }\r\n toJSON() {\r\n return Object.assign(Object.assign({ uid: this.uid, email: this.email || undefined, emailVerified: this.emailVerified, displayName: this.displayName || undefined, isAnonymous: this.isAnonymous, photoURL: this.photoURL || undefined, phoneNumber: this.phoneNumber || undefined, tenantId: this.tenantId || undefined, providerData: this.providerData.map(userInfo => (Object.assign({}, userInfo))), stsTokenManager: this.stsTokenManager.toJSON(), \r\n // Redirect event ID must be maintained in case there is a pending\r\n // redirect event.\r\n _redirectEventId: this._redirectEventId }, this.metadata.toJSON()), { \r\n // Required for compatibility with the legacy SDK (go/firebase-auth-sdk-persistence-parsing):\r\n apiKey: this.auth.config.apiKey, appName: this.auth.name });\r\n }\r\n get refreshToken() {\r\n return this.stsTokenManager.refreshToken || '';\r\n }\r\n static _fromJSON(auth, object) {\r\n var _a, _b, _c, _d, _e, _f, _g, _h;\r\n const displayName = (_a = object.displayName) !== null && _a !== void 0 ? _a : undefined;\r\n const email = (_b = object.email) !== null && _b !== void 0 ? _b : undefined;\r\n const phoneNumber = (_c = object.phoneNumber) !== null && _c !== void 0 ? _c : undefined;\r\n const photoURL = (_d = object.photoURL) !== null && _d !== void 0 ? _d : undefined;\r\n const tenantId = (_e = object.tenantId) !== null && _e !== void 0 ? _e : undefined;\r\n const _redirectEventId = (_f = object._redirectEventId) !== null && _f !== void 0 ? _f : undefined;\r\n const createdAt = (_g = object.createdAt) !== null && _g !== void 0 ? _g : undefined;\r\n const lastLoginAt = (_h = object.lastLoginAt) !== null && _h !== void 0 ? _h : undefined;\r\n const { uid, emailVerified, isAnonymous, providerData, stsTokenManager: plainObjectTokenManager } = object;\r\n _assert(uid && plainObjectTokenManager, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const stsTokenManager = StsTokenManager.fromJSON(this.name, plainObjectTokenManager);\r\n _assert(typeof uid === 'string', auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n assertStringOrUndefined(displayName, auth.name);\r\n assertStringOrUndefined(email, auth.name);\r\n _assert(typeof emailVerified === 'boolean', auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n _assert(typeof isAnonymous === 'boolean', auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n assertStringOrUndefined(phoneNumber, auth.name);\r\n assertStringOrUndefined(photoURL, auth.name);\r\n assertStringOrUndefined(tenantId, auth.name);\r\n assertStringOrUndefined(_redirectEventId, auth.name);\r\n assertStringOrUndefined(createdAt, auth.name);\r\n assertStringOrUndefined(lastLoginAt, auth.name);\r\n const user = new UserImpl({\r\n uid,\r\n auth,\r\n email,\r\n emailVerified,\r\n displayName,\r\n isAnonymous,\r\n photoURL,\r\n phoneNumber,\r\n tenantId,\r\n stsTokenManager,\r\n createdAt,\r\n lastLoginAt\r\n });\r\n if (providerData && Array.isArray(providerData)) {\r\n user.providerData = providerData.map(userInfo => (Object.assign({}, userInfo)));\r\n }\r\n if (_redirectEventId) {\r\n user._redirectEventId = _redirectEventId;\r\n }\r\n return user;\r\n }\r\n /**\r\n * Initialize a User from an idToken server response\r\n * @param auth\r\n * @param idTokenResponse\r\n */\r\n static async _fromIdTokenResponse(auth, idTokenResponse, isAnonymous = false) {\r\n const stsTokenManager = new StsTokenManager();\r\n stsTokenManager.updateFromServerResponse(idTokenResponse);\r\n // Initialize the Firebase Auth user.\r\n const user = new UserImpl({\r\n uid: idTokenResponse.localId,\r\n auth,\r\n stsTokenManager,\r\n isAnonymous\r\n });\r\n // Updates the user info and data and resolves with a user instance.\r\n await _reloadWithoutSaving(user);\r\n return user;\r\n }\r\n /**\r\n * Initialize a User from an idToken server response\r\n * @param auth\r\n * @param idTokenResponse\r\n */\r\n static async _fromGetAccountInfoResponse(auth, response, idToken) {\r\n const coreAccount = response.users[0];\r\n _assert(coreAccount.localId !== undefined, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const providerData = coreAccount.providerUserInfo !== undefined\r\n ? extractProviderData(coreAccount.providerUserInfo)\r\n : [];\r\n const isAnonymous = !(coreAccount.email && coreAccount.passwordHash) && !(providerData === null || providerData === void 0 ? void 0 : providerData.length);\r\n const stsTokenManager = new StsTokenManager();\r\n stsTokenManager.updateFromIdToken(idToken);\r\n // Initialize the Firebase Auth user.\r\n const user = new UserImpl({\r\n uid: coreAccount.localId,\r\n auth,\r\n stsTokenManager,\r\n isAnonymous\r\n });\r\n // update the user with data from the GetAccountInfo response.\r\n const updates = {\r\n uid: coreAccount.localId,\r\n displayName: coreAccount.displayName || null,\r\n photoURL: coreAccount.photoUrl || null,\r\n email: coreAccount.email || null,\r\n emailVerified: coreAccount.emailVerified || false,\r\n phoneNumber: coreAccount.phoneNumber || null,\r\n tenantId: coreAccount.tenantId || null,\r\n providerData,\r\n metadata: new UserMetadata(coreAccount.createdAt, coreAccount.lastLoginAt),\r\n isAnonymous: !(coreAccount.email && coreAccount.passwordHash) &&\r\n !(providerData === null || providerData === void 0 ? void 0 : providerData.length)\r\n };\r\n Object.assign(user, updates);\r\n return user;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst instanceCache = new Map();\r\nfunction _getInstance(cls) {\r\n debugAssert(cls instanceof Function, 'Expected a class definition');\r\n let instance = instanceCache.get(cls);\r\n if (instance) {\r\n debugAssert(instance instanceof cls, 'Instance stored in cache mismatched with class');\r\n return instance;\r\n }\r\n instance = new cls();\r\n instanceCache.set(cls, instance);\r\n return instance;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass InMemoryPersistence {\r\n constructor() {\r\n this.type = \"NONE\" /* PersistenceType.NONE */;\r\n this.storage = {};\r\n }\r\n async _isAvailable() {\r\n return true;\r\n }\r\n async _set(key, value) {\r\n this.storage[key] = value;\r\n }\r\n async _get(key) {\r\n const value = this.storage[key];\r\n return value === undefined ? null : value;\r\n }\r\n async _remove(key) {\r\n delete this.storage[key];\r\n }\r\n _addListener(_key, _listener) {\r\n // Listeners are not supported for in-memory storage since it cannot be shared across windows/workers\r\n return;\r\n }\r\n _removeListener(_key, _listener) {\r\n // Listeners are not supported for in-memory storage since it cannot be shared across windows/workers\r\n return;\r\n }\r\n}\r\nInMemoryPersistence.type = 'NONE';\r\n/**\r\n * An implementation of {@link Persistence} of type 'NONE'.\r\n *\r\n * @public\r\n */\r\nconst inMemoryPersistence = InMemoryPersistence;\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _persistenceKeyName(key, apiKey, appName) {\r\n return `${\"firebase\" /* Namespace.PERSISTENCE */}:${key}:${apiKey}:${appName}`;\r\n}\r\nclass PersistenceUserManager {\r\n constructor(persistence, auth, userKey) {\r\n this.persistence = persistence;\r\n this.auth = auth;\r\n this.userKey = userKey;\r\n const { config, name } = this.auth;\r\n this.fullUserKey = _persistenceKeyName(this.userKey, config.apiKey, name);\r\n this.fullPersistenceKey = _persistenceKeyName(\"persistence\" /* KeyName.PERSISTENCE_USER */, config.apiKey, name);\r\n this.boundEventHandler = auth._onStorageEvent.bind(auth);\r\n this.persistence._addListener(this.fullUserKey, this.boundEventHandler);\r\n }\r\n setCurrentUser(user) {\r\n return this.persistence._set(this.fullUserKey, user.toJSON());\r\n }\r\n async getCurrentUser() {\r\n const blob = await this.persistence._get(this.fullUserKey);\r\n return blob ? UserImpl._fromJSON(this.auth, blob) : null;\r\n }\r\n removeCurrentUser() {\r\n return this.persistence._remove(this.fullUserKey);\r\n }\r\n savePersistenceForRedirect() {\r\n return this.persistence._set(this.fullPersistenceKey, this.persistence.type);\r\n }\r\n async setPersistence(newPersistence) {\r\n if (this.persistence === newPersistence) {\r\n return;\r\n }\r\n const currentUser = await this.getCurrentUser();\r\n await this.removeCurrentUser();\r\n this.persistence = newPersistence;\r\n if (currentUser) {\r\n return this.setCurrentUser(currentUser);\r\n }\r\n }\r\n delete() {\r\n this.persistence._removeListener(this.fullUserKey, this.boundEventHandler);\r\n }\r\n static async create(auth, persistenceHierarchy, userKey = \"authUser\" /* KeyName.AUTH_USER */) {\r\n if (!persistenceHierarchy.length) {\r\n return new PersistenceUserManager(_getInstance(inMemoryPersistence), auth, userKey);\r\n }\r\n // Eliminate any persistences that are not available\r\n const availablePersistences = (await Promise.all(persistenceHierarchy.map(async (persistence) => {\r\n if (await persistence._isAvailable()) {\r\n return persistence;\r\n }\r\n return undefined;\r\n }))).filter(persistence => persistence);\r\n // Fall back to the first persistence listed, or in memory if none available\r\n let selectedPersistence = availablePersistences[0] ||\r\n _getInstance(inMemoryPersistence);\r\n const key = _persistenceKeyName(userKey, auth.config.apiKey, auth.name);\r\n // Pull out the existing user, setting the chosen persistence to that\r\n // persistence if the user exists.\r\n let userToMigrate = null;\r\n // Note, here we check for a user in _all_ persistences, not just the\r\n // ones deemed available. If we can migrate a user out of a broken\r\n // persistence, we will (but only if that persistence supports migration).\r\n for (const persistence of persistenceHierarchy) {\r\n try {\r\n const blob = await persistence._get(key);\r\n if (blob) {\r\n const user = UserImpl._fromJSON(auth, blob); // throws for unparsable blob (wrong format)\r\n if (persistence !== selectedPersistence) {\r\n userToMigrate = user;\r\n }\r\n selectedPersistence = persistence;\r\n break;\r\n }\r\n }\r\n catch (_a) { }\r\n }\r\n // If we find the user in a persistence that does support migration, use\r\n // that migration path (of only persistences that support migration)\r\n const migrationHierarchy = availablePersistences.filter(p => p._shouldAllowMigration);\r\n // If the persistence does _not_ allow migration, just finish off here\r\n if (!selectedPersistence._shouldAllowMigration ||\r\n !migrationHierarchy.length) {\r\n return new PersistenceUserManager(selectedPersistence, auth, userKey);\r\n }\r\n selectedPersistence = migrationHierarchy[0];\r\n if (userToMigrate) {\r\n // This normally shouldn't throw since chosenPersistence.isAvailable() is true, but if it does\r\n // we'll just let it bubble to surface the error.\r\n await selectedPersistence._set(key, userToMigrate.toJSON());\r\n }\r\n // Attempt to clear the key in other persistences but ignore errors. This helps prevent issues\r\n // such as users getting stuck with a previous account after signing out and refreshing the tab.\r\n await Promise.all(persistenceHierarchy.map(async (persistence) => {\r\n if (persistence !== selectedPersistence) {\r\n try {\r\n await persistence._remove(key);\r\n }\r\n catch (_a) { }\r\n }\r\n }));\r\n return new PersistenceUserManager(selectedPersistence, auth, userKey);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Determine the browser for the purposes of reporting usage to the API\r\n */\r\nfunction _getBrowserName(userAgent) {\r\n const ua = userAgent.toLowerCase();\r\n if (ua.includes('opera/') || ua.includes('opr/') || ua.includes('opios/')) {\r\n return \"Opera\" /* BrowserName.OPERA */;\r\n }\r\n else if (_isIEMobile(ua)) {\r\n // Windows phone IEMobile browser.\r\n return \"IEMobile\" /* BrowserName.IEMOBILE */;\r\n }\r\n else if (ua.includes('msie') || ua.includes('trident/')) {\r\n return \"IE\" /* BrowserName.IE */;\r\n }\r\n else if (ua.includes('edge/')) {\r\n return \"Edge\" /* BrowserName.EDGE */;\r\n }\r\n else if (_isFirefox(ua)) {\r\n return \"Firefox\" /* BrowserName.FIREFOX */;\r\n }\r\n else if (ua.includes('silk/')) {\r\n return \"Silk\" /* BrowserName.SILK */;\r\n }\r\n else if (_isBlackBerry(ua)) {\r\n // Blackberry browser.\r\n return \"Blackberry\" /* BrowserName.BLACKBERRY */;\r\n }\r\n else if (_isWebOS(ua)) {\r\n // WebOS default browser.\r\n return \"Webos\" /* BrowserName.WEBOS */;\r\n }\r\n else if (_isSafari(ua)) {\r\n return \"Safari\" /* BrowserName.SAFARI */;\r\n }\r\n else if ((ua.includes('chrome/') || _isChromeIOS(ua)) &&\r\n !ua.includes('edge/')) {\r\n return \"Chrome\" /* BrowserName.CHROME */;\r\n }\r\n else if (_isAndroid(ua)) {\r\n // Android stock browser.\r\n return \"Android\" /* BrowserName.ANDROID */;\r\n }\r\n else {\r\n // Most modern browsers have name/version at end of user agent string.\r\n const re = /([a-zA-Z\\d\\.]+)\\/[a-zA-Z\\d\\.]*$/;\r\n const matches = userAgent.match(re);\r\n if ((matches === null || matches === void 0 ? void 0 : matches.length) === 2) {\r\n return matches[1];\r\n }\r\n }\r\n return \"Other\" /* BrowserName.OTHER */;\r\n}\r\nfunction _isFirefox(ua = getUA()) {\r\n return /firefox\\//i.test(ua);\r\n}\r\nfunction _isSafari(userAgent = getUA()) {\r\n const ua = userAgent.toLowerCase();\r\n return (ua.includes('safari/') &&\r\n !ua.includes('chrome/') &&\r\n !ua.includes('crios/') &&\r\n !ua.includes('android'));\r\n}\r\nfunction _isChromeIOS(ua = getUA()) {\r\n return /crios\\//i.test(ua);\r\n}\r\nfunction _isIEMobile(ua = getUA()) {\r\n return /iemobile/i.test(ua);\r\n}\r\nfunction _isAndroid(ua = getUA()) {\r\n return /android/i.test(ua);\r\n}\r\nfunction _isBlackBerry(ua = getUA()) {\r\n return /blackberry/i.test(ua);\r\n}\r\nfunction _isWebOS(ua = getUA()) {\r\n return /webos/i.test(ua);\r\n}\r\nfunction _isIOS(ua = getUA()) {\r\n return (/iphone|ipad|ipod/i.test(ua) ||\r\n (/macintosh/i.test(ua) && /mobile/i.test(ua)));\r\n}\r\nfunction _isIOS7Or8(ua = getUA()) {\r\n return (/(iPad|iPhone|iPod).*OS 7_\\d/i.test(ua) ||\r\n /(iPad|iPhone|iPod).*OS 8_\\d/i.test(ua));\r\n}\r\nfunction _isIOSStandalone(ua = getUA()) {\r\n var _a;\r\n return _isIOS(ua) && !!((_a = window.navigator) === null || _a === void 0 ? void 0 : _a.standalone);\r\n}\r\nfunction _isIE10() {\r\n return isIE() && document.documentMode === 10;\r\n}\r\nfunction _isMobileBrowser(ua = getUA()) {\r\n // TODO: implement getBrowserName equivalent for OS.\r\n return (_isIOS(ua) ||\r\n _isAndroid(ua) ||\r\n _isWebOS(ua) ||\r\n _isBlackBerry(ua) ||\r\n /windows phone/i.test(ua) ||\r\n _isIEMobile(ua));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/*\r\n * Determine the SDK version string\r\n */\r\nfunction _getClientVersion(clientPlatform, frameworks = []) {\r\n let reportedPlatform;\r\n switch (clientPlatform) {\r\n case \"Browser\" /* ClientPlatform.BROWSER */:\r\n // In a browser environment, report the browser name.\r\n reportedPlatform = _getBrowserName(getUA());\r\n break;\r\n case \"Worker\" /* ClientPlatform.WORKER */:\r\n // Technically a worker runs from a browser but we need to differentiate a\r\n // worker from a browser.\r\n // For example: Chrome-Worker/JsCore/4.9.1/FirebaseCore-web.\r\n reportedPlatform = `${_getBrowserName(getUA())}-${clientPlatform}`;\r\n break;\r\n default:\r\n reportedPlatform = clientPlatform;\r\n }\r\n const reportedFrameworks = frameworks.length\r\n ? frameworks.join(',')\r\n : 'FirebaseCore-web'; /* default value if no other framework is used */\r\n return `${reportedPlatform}/${\"JsCore\" /* ClientImplementation.CORE */}/${SDK_VERSION}/${reportedFrameworks}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass AuthMiddlewareQueue {\r\n constructor(auth) {\r\n this.auth = auth;\r\n this.queue = [];\r\n }\r\n pushCallback(callback, onAbort) {\r\n // The callback could be sync or async. Wrap it into a\r\n // function that is always async.\r\n const wrappedCallback = (user) => new Promise((resolve, reject) => {\r\n try {\r\n const result = callback(user);\r\n // Either resolve with existing promise or wrap a non-promise\r\n // return value into a promise.\r\n resolve(result);\r\n }\r\n catch (e) {\r\n // Sync callback throws.\r\n reject(e);\r\n }\r\n });\r\n // Attach the onAbort if present\r\n wrappedCallback.onAbort = onAbort;\r\n this.queue.push(wrappedCallback);\r\n const index = this.queue.length - 1;\r\n return () => {\r\n // Unsubscribe. Replace with no-op. Do not remove from array, or it will disturb\r\n // indexing of other elements.\r\n this.queue[index] = () => Promise.resolve();\r\n };\r\n }\r\n async runMiddleware(nextUser) {\r\n if (this.auth.currentUser === nextUser) {\r\n return;\r\n }\r\n // While running the middleware, build a temporary stack of onAbort\r\n // callbacks to call if one middleware callback rejects.\r\n const onAbortStack = [];\r\n try {\r\n for (const beforeStateCallback of this.queue) {\r\n await beforeStateCallback(nextUser);\r\n // Only push the onAbort if the callback succeeds\r\n if (beforeStateCallback.onAbort) {\r\n onAbortStack.push(beforeStateCallback.onAbort);\r\n }\r\n }\r\n }\r\n catch (e) {\r\n // Run all onAbort, with separate try/catch to ignore any errors and\r\n // continue\r\n onAbortStack.reverse();\r\n for (const onAbort of onAbortStack) {\r\n try {\r\n onAbort();\r\n }\r\n catch (_) {\r\n /* swallow error */\r\n }\r\n }\r\n throw this.auth._errorFactory.create(\"login-blocked\" /* AuthErrorCode.LOGIN_BLOCKED */, {\r\n originalMessage: e === null || e === void 0 ? void 0 : e.message\r\n });\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2023 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Fetches the password policy for the currently set tenant or the project if no tenant is set.\r\n *\r\n * @param auth Auth object.\r\n * @param request Password policy request.\r\n * @returns Password policy response.\r\n */\r\nasync function _getPasswordPolicy(auth, request = {}) {\r\n return _performApiRequest(auth, \"GET\" /* HttpMethod.GET */, \"/v2/passwordPolicy\" /* Endpoint.GET_PASSWORD_POLICY */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2023 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Minimum min password length enforced by the backend, even if no minimum length is set.\r\nconst MINIMUM_MIN_PASSWORD_LENGTH = 6;\r\n/**\r\n * Stores password policy requirements and provides password validation against the policy.\r\n *\r\n * @internal\r\n */\r\nclass PasswordPolicyImpl {\r\n constructor(response) {\r\n var _a, _b, _c, _d;\r\n // Only include custom strength options defined in the response.\r\n const responseOptions = response.customStrengthOptions;\r\n this.customStrengthOptions = {};\r\n // TODO: Remove once the backend is updated to include the minimum min password length instead of undefined when there is no minimum length set.\r\n this.customStrengthOptions.minPasswordLength =\r\n (_a = responseOptions.minPasswordLength) !== null && _a !== void 0 ? _a : MINIMUM_MIN_PASSWORD_LENGTH;\r\n if (responseOptions.maxPasswordLength) {\r\n this.customStrengthOptions.maxPasswordLength =\r\n responseOptions.maxPasswordLength;\r\n }\r\n if (responseOptions.containsLowercaseCharacter !== undefined) {\r\n this.customStrengthOptions.containsLowercaseLetter =\r\n responseOptions.containsLowercaseCharacter;\r\n }\r\n if (responseOptions.containsUppercaseCharacter !== undefined) {\r\n this.customStrengthOptions.containsUppercaseLetter =\r\n responseOptions.containsUppercaseCharacter;\r\n }\r\n if (responseOptions.containsNumericCharacter !== undefined) {\r\n this.customStrengthOptions.containsNumericCharacter =\r\n responseOptions.containsNumericCharacter;\r\n }\r\n if (responseOptions.containsNonAlphanumericCharacter !== undefined) {\r\n this.customStrengthOptions.containsNonAlphanumericCharacter =\r\n responseOptions.containsNonAlphanumericCharacter;\r\n }\r\n this.enforcementState = response.enforcementState;\r\n if (this.enforcementState === 'ENFORCEMENT_STATE_UNSPECIFIED') {\r\n this.enforcementState = 'OFF';\r\n }\r\n // Use an empty string if no non-alphanumeric characters are specified in the response.\r\n this.allowedNonAlphanumericCharacters =\r\n (_c = (_b = response.allowedNonAlphanumericCharacters) === null || _b === void 0 ? void 0 : _b.join('')) !== null && _c !== void 0 ? _c : '';\r\n this.forceUpgradeOnSignin = (_d = response.forceUpgradeOnSignin) !== null && _d !== void 0 ? _d : false;\r\n this.schemaVersion = response.schemaVersion;\r\n }\r\n validatePassword(password) {\r\n var _a, _b, _c, _d, _e, _f;\r\n const status = {\r\n isValid: true,\r\n passwordPolicy: this\r\n };\r\n // Check the password length and character options.\r\n this.validatePasswordLengthOptions(password, status);\r\n this.validatePasswordCharacterOptions(password, status);\r\n // Combine the status into single isValid property.\r\n status.isValid && (status.isValid = (_a = status.meetsMinPasswordLength) !== null && _a !== void 0 ? _a : true);\r\n status.isValid && (status.isValid = (_b = status.meetsMaxPasswordLength) !== null && _b !== void 0 ? _b : true);\r\n status.isValid && (status.isValid = (_c = status.containsLowercaseLetter) !== null && _c !== void 0 ? _c : true);\r\n status.isValid && (status.isValid = (_d = status.containsUppercaseLetter) !== null && _d !== void 0 ? _d : true);\r\n status.isValid && (status.isValid = (_e = status.containsNumericCharacter) !== null && _e !== void 0 ? _e : true);\r\n status.isValid && (status.isValid = (_f = status.containsNonAlphanumericCharacter) !== null && _f !== void 0 ? _f : true);\r\n return status;\r\n }\r\n /**\r\n * Validates that the password meets the length options for the policy.\r\n *\r\n * @param password Password to validate.\r\n * @param status Validation status.\r\n */\r\n validatePasswordLengthOptions(password, status) {\r\n const minPasswordLength = this.customStrengthOptions.minPasswordLength;\r\n const maxPasswordLength = this.customStrengthOptions.maxPasswordLength;\r\n if (minPasswordLength) {\r\n status.meetsMinPasswordLength = password.length >= minPasswordLength;\r\n }\r\n if (maxPasswordLength) {\r\n status.meetsMaxPasswordLength = password.length <= maxPasswordLength;\r\n }\r\n }\r\n /**\r\n * Validates that the password meets the character options for the policy.\r\n *\r\n * @param password Password to validate.\r\n * @param status Validation status.\r\n */\r\n validatePasswordCharacterOptions(password, status) {\r\n // Assign statuses for requirements even if the password is an empty string.\r\n this.updatePasswordCharacterOptionsStatuses(status, \r\n /* containsLowercaseCharacter= */ false, \r\n /* containsUppercaseCharacter= */ false, \r\n /* containsNumericCharacter= */ false, \r\n /* containsNonAlphanumericCharacter= */ false);\r\n let passwordChar;\r\n for (let i = 0; i < password.length; i++) {\r\n passwordChar = password.charAt(i);\r\n this.updatePasswordCharacterOptionsStatuses(status, \r\n /* containsLowercaseCharacter= */ passwordChar >= 'a' &&\r\n passwordChar <= 'z', \r\n /* containsUppercaseCharacter= */ passwordChar >= 'A' &&\r\n passwordChar <= 'Z', \r\n /* containsNumericCharacter= */ passwordChar >= '0' &&\r\n passwordChar <= '9', \r\n /* containsNonAlphanumericCharacter= */ this.allowedNonAlphanumericCharacters.includes(passwordChar));\r\n }\r\n }\r\n /**\r\n * Updates the running validation status with the statuses for the character options.\r\n * Expected to be called each time a character is processed to update each option status\r\n * based on the current character.\r\n *\r\n * @param status Validation status.\r\n * @param containsLowercaseCharacter Whether the character is a lowercase letter.\r\n * @param containsUppercaseCharacter Whether the character is an uppercase letter.\r\n * @param containsNumericCharacter Whether the character is a numeric character.\r\n * @param containsNonAlphanumericCharacter Whether the character is a non-alphanumeric character.\r\n */\r\n updatePasswordCharacterOptionsStatuses(status, containsLowercaseCharacter, containsUppercaseCharacter, containsNumericCharacter, containsNonAlphanumericCharacter) {\r\n if (this.customStrengthOptions.containsLowercaseLetter) {\r\n status.containsLowercaseLetter || (status.containsLowercaseLetter = containsLowercaseCharacter);\r\n }\r\n if (this.customStrengthOptions.containsUppercaseLetter) {\r\n status.containsUppercaseLetter || (status.containsUppercaseLetter = containsUppercaseCharacter);\r\n }\r\n if (this.customStrengthOptions.containsNumericCharacter) {\r\n status.containsNumericCharacter || (status.containsNumericCharacter = containsNumericCharacter);\r\n }\r\n if (this.customStrengthOptions.containsNonAlphanumericCharacter) {\r\n status.containsNonAlphanumericCharacter || (status.containsNonAlphanumericCharacter = containsNonAlphanumericCharacter);\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass AuthImpl {\r\n constructor(app, heartbeatServiceProvider, appCheckServiceProvider, config) {\r\n this.app = app;\r\n this.heartbeatServiceProvider = heartbeatServiceProvider;\r\n this.appCheckServiceProvider = appCheckServiceProvider;\r\n this.config = config;\r\n this.currentUser = null;\r\n this.emulatorConfig = null;\r\n this.operations = Promise.resolve();\r\n this.authStateSubscription = new Subscription(this);\r\n this.idTokenSubscription = new Subscription(this);\r\n this.beforeStateQueue = new AuthMiddlewareQueue(this);\r\n this.redirectUser = null;\r\n this.isProactiveRefreshEnabled = false;\r\n this.EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION = 1;\r\n // Any network calls will set this to true and prevent subsequent emulator\r\n // initialization\r\n this._canInitEmulator = true;\r\n this._isInitialized = false;\r\n this._deleted = false;\r\n this._initializationPromise = null;\r\n this._popupRedirectResolver = null;\r\n this._errorFactory = _DEFAULT_AUTH_ERROR_FACTORY;\r\n this._agentRecaptchaConfig = null;\r\n this._tenantRecaptchaConfigs = {};\r\n this._projectPasswordPolicy = null;\r\n this._tenantPasswordPolicies = {};\r\n // Tracks the last notified UID for state change listeners to prevent\r\n // repeated calls to the callbacks. Undefined means it's never been\r\n // called, whereas null means it's been called with a signed out user\r\n this.lastNotifiedUid = undefined;\r\n this.languageCode = null;\r\n this.tenantId = null;\r\n this.settings = { appVerificationDisabledForTesting: false };\r\n this.frameworks = [];\r\n this.name = app.name;\r\n this.clientVersion = config.sdkClientVersion;\r\n }\r\n _initializeWithPersistence(persistenceHierarchy, popupRedirectResolver) {\r\n if (popupRedirectResolver) {\r\n this._popupRedirectResolver = _getInstance(popupRedirectResolver);\r\n }\r\n // Have to check for app deletion throughout initialization (after each\r\n // promise resolution)\r\n this._initializationPromise = this.queue(async () => {\r\n var _a, _b;\r\n if (this._deleted) {\r\n return;\r\n }\r\n this.persistenceManager = await PersistenceUserManager.create(this, persistenceHierarchy);\r\n if (this._deleted) {\r\n return;\r\n }\r\n // Initialize the resolver early if necessary (only applicable to web:\r\n // this will cause the iframe to load immediately in certain cases)\r\n if ((_a = this._popupRedirectResolver) === null || _a === void 0 ? void 0 : _a._shouldInitProactively) {\r\n // If this fails, don't halt auth loading\r\n try {\r\n await this._popupRedirectResolver._initialize(this);\r\n }\r\n catch (e) {\r\n /* Ignore the error */\r\n }\r\n }\r\n await this.initializeCurrentUser(popupRedirectResolver);\r\n this.lastNotifiedUid = ((_b = this.currentUser) === null || _b === void 0 ? void 0 : _b.uid) || null;\r\n if (this._deleted) {\r\n return;\r\n }\r\n this._isInitialized = true;\r\n });\r\n return this._initializationPromise;\r\n }\r\n /**\r\n * If the persistence is changed in another window, the user manager will let us know\r\n */\r\n async _onStorageEvent() {\r\n if (this._deleted) {\r\n return;\r\n }\r\n const user = await this.assertedPersistence.getCurrentUser();\r\n if (!this.currentUser && !user) {\r\n // No change, do nothing (was signed out and remained signed out).\r\n return;\r\n }\r\n // If the same user is to be synchronized.\r\n if (this.currentUser && user && this.currentUser.uid === user.uid) {\r\n // Data update, simply copy data changes.\r\n this._currentUser._assign(user);\r\n // If tokens changed from previous user tokens, this will trigger\r\n // notifyAuthListeners_.\r\n await this.currentUser.getIdToken();\r\n return;\r\n }\r\n // Update current Auth state. Either a new login or logout.\r\n // Skip blocking callbacks, they should not apply to a change in another tab.\r\n await this._updateCurrentUser(user, /* skipBeforeStateCallbacks */ true);\r\n }\r\n async initializeCurrentUserFromIdToken(idToken) {\r\n try {\r\n const response = await getAccountInfo(this, { idToken });\r\n const user = await UserImpl._fromGetAccountInfoResponse(this, response, idToken);\r\n await this.directlySetCurrentUser(user);\r\n }\r\n catch (err) {\r\n console.warn('FirebaseServerApp could not login user with provided authIdToken: ', err);\r\n await this.directlySetCurrentUser(null);\r\n }\r\n }\r\n async initializeCurrentUser(popupRedirectResolver) {\r\n var _a;\r\n if (_isFirebaseServerApp(this.app)) {\r\n const idToken = this.app.settings.authIdToken;\r\n if (idToken) {\r\n // Start the auth operation in the next tick to allow a moment for the customer's app to\r\n // attach an emulator, if desired.\r\n return new Promise(resolve => {\r\n setTimeout(() => this.initializeCurrentUserFromIdToken(idToken).then(resolve, resolve));\r\n });\r\n }\r\n else {\r\n return this.directlySetCurrentUser(null);\r\n }\r\n }\r\n // First check to see if we have a pending redirect event.\r\n const previouslyStoredUser = (await this.assertedPersistence.getCurrentUser());\r\n let futureCurrentUser = previouslyStoredUser;\r\n let needsTocheckMiddleware = false;\r\n if (popupRedirectResolver && this.config.authDomain) {\r\n await this.getOrInitRedirectPersistenceManager();\r\n const redirectUserEventId = (_a = this.redirectUser) === null || _a === void 0 ? void 0 : _a._redirectEventId;\r\n const storedUserEventId = futureCurrentUser === null || futureCurrentUser === void 0 ? void 0 : futureCurrentUser._redirectEventId;\r\n const result = await this.tryRedirectSignIn(popupRedirectResolver);\r\n // If the stored user (i.e. the old \"currentUser\") has a redirectId that\r\n // matches the redirect user, then we want to initially sign in with the\r\n // new user object from result.\r\n // TODO(samgho): More thoroughly test all of this\r\n if ((!redirectUserEventId || redirectUserEventId === storedUserEventId) &&\r\n (result === null || result === void 0 ? void 0 : result.user)) {\r\n futureCurrentUser = result.user;\r\n needsTocheckMiddleware = true;\r\n }\r\n }\r\n // If no user in persistence, there is no current user. Set to null.\r\n if (!futureCurrentUser) {\r\n return this.directlySetCurrentUser(null);\r\n }\r\n if (!futureCurrentUser._redirectEventId) {\r\n // This isn't a redirect link operation, we can reload and bail.\r\n // First though, ensure that we check the middleware is happy.\r\n if (needsTocheckMiddleware) {\r\n try {\r\n await this.beforeStateQueue.runMiddleware(futureCurrentUser);\r\n }\r\n catch (e) {\r\n futureCurrentUser = previouslyStoredUser;\r\n // We know this is available since the bit is only set when the\r\n // resolver is available\r\n this._popupRedirectResolver._overrideRedirectResult(this, () => Promise.reject(e));\r\n }\r\n }\r\n if (futureCurrentUser) {\r\n return this.reloadAndSetCurrentUserOrClear(futureCurrentUser);\r\n }\r\n else {\r\n return this.directlySetCurrentUser(null);\r\n }\r\n }\r\n _assert(this._popupRedirectResolver, this, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n await this.getOrInitRedirectPersistenceManager();\r\n // If the redirect user's event ID matches the current user's event ID,\r\n // DO NOT reload the current user, otherwise they'll be cleared from storage.\r\n // This is important for the reauthenticateWithRedirect() flow.\r\n if (this.redirectUser &&\r\n this.redirectUser._redirectEventId === futureCurrentUser._redirectEventId) {\r\n return this.directlySetCurrentUser(futureCurrentUser);\r\n }\r\n return this.reloadAndSetCurrentUserOrClear(futureCurrentUser);\r\n }\r\n async tryRedirectSignIn(redirectResolver) {\r\n // The redirect user needs to be checked (and signed in if available)\r\n // during auth initialization. All of the normal sign in and link/reauth\r\n // flows call back into auth and push things onto the promise queue. We\r\n // need to await the result of the redirect sign in *inside the promise\r\n // queue*. This presents a problem: we run into deadlock. See:\r\n // ┌> [Initialization] ─────┐\r\n // ┌> [] │\r\n // └─ [getRedirectResult] <─┘\r\n // where [] are tasks on the queue and arrows denote awaits\r\n // Initialization will never complete because it's waiting on something\r\n // that's waiting for initialization to complete!\r\n //\r\n // Instead, this method calls getRedirectResult() (stored in\r\n // _completeRedirectFn) with an optional parameter that instructs all of\r\n // the underlying auth operations to skip anything that mutates auth state.\r\n let result = null;\r\n try {\r\n // We know this._popupRedirectResolver is set since redirectResolver\r\n // is passed in. The _completeRedirectFn expects the unwrapped extern.\r\n result = await this._popupRedirectResolver._completeRedirectFn(this, redirectResolver, true);\r\n }\r\n catch (e) {\r\n // Swallow any errors here; the code can retrieve them in\r\n // getRedirectResult().\r\n await this._setRedirectUser(null);\r\n }\r\n return result;\r\n }\r\n async reloadAndSetCurrentUserOrClear(user) {\r\n try {\r\n await _reloadWithoutSaving(user);\r\n }\r\n catch (e) {\r\n if ((e === null || e === void 0 ? void 0 : e.code) !==\r\n `auth/${\"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */}`) {\r\n // Something's wrong with the user's token. Log them out and remove\r\n // them from storage\r\n return this.directlySetCurrentUser(null);\r\n }\r\n }\r\n return this.directlySetCurrentUser(user);\r\n }\r\n useDeviceLanguage() {\r\n this.languageCode = _getUserLanguage();\r\n }\r\n async _delete() {\r\n this._deleted = true;\r\n }\r\n async updateCurrentUser(userExtern) {\r\n if (_isFirebaseServerApp(this.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(this));\r\n }\r\n // The public updateCurrentUser method needs to make a copy of the user,\r\n // and also check that the project matches\r\n const user = userExtern\r\n ? getModularInstance(userExtern)\r\n : null;\r\n if (user) {\r\n _assert(user.auth.config.apiKey === this.config.apiKey, this, \"invalid-user-token\" /* AuthErrorCode.INVALID_AUTH */);\r\n }\r\n return this._updateCurrentUser(user && user._clone(this));\r\n }\r\n async _updateCurrentUser(user, skipBeforeStateCallbacks = false) {\r\n if (this._deleted) {\r\n return;\r\n }\r\n if (user) {\r\n _assert(this.tenantId === user.tenantId, this, \"tenant-id-mismatch\" /* AuthErrorCode.TENANT_ID_MISMATCH */);\r\n }\r\n if (!skipBeforeStateCallbacks) {\r\n await this.beforeStateQueue.runMiddleware(user);\r\n }\r\n return this.queue(async () => {\r\n await this.directlySetCurrentUser(user);\r\n this.notifyAuthListeners();\r\n });\r\n }\r\n async signOut() {\r\n if (_isFirebaseServerApp(this.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(this));\r\n }\r\n // Run first, to block _setRedirectUser() if any callbacks fail.\r\n await this.beforeStateQueue.runMiddleware(null);\r\n // Clear the redirect user when signOut is called\r\n if (this.redirectPersistenceManager || this._popupRedirectResolver) {\r\n await this._setRedirectUser(null);\r\n }\r\n // Prevent callbacks from being called again in _updateCurrentUser, as\r\n // they were already called in the first line.\r\n return this._updateCurrentUser(null, /* skipBeforeStateCallbacks */ true);\r\n }\r\n setPersistence(persistence) {\r\n if (_isFirebaseServerApp(this.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(this));\r\n }\r\n return this.queue(async () => {\r\n await this.assertedPersistence.setPersistence(_getInstance(persistence));\r\n });\r\n }\r\n _getRecaptchaConfig() {\r\n if (this.tenantId == null) {\r\n return this._agentRecaptchaConfig;\r\n }\r\n else {\r\n return this._tenantRecaptchaConfigs[this.tenantId];\r\n }\r\n }\r\n async validatePassword(password) {\r\n if (!this._getPasswordPolicyInternal()) {\r\n await this._updatePasswordPolicy();\r\n }\r\n // Password policy will be defined after fetching.\r\n const passwordPolicy = this._getPasswordPolicyInternal();\r\n // Check that the policy schema version is supported by the SDK.\r\n // TODO: Update this logic to use a max supported policy schema version once we have multiple schema versions.\r\n if (passwordPolicy.schemaVersion !==\r\n this.EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION) {\r\n return Promise.reject(this._errorFactory.create(\"unsupported-password-policy-schema-version\" /* AuthErrorCode.UNSUPPORTED_PASSWORD_POLICY_SCHEMA_VERSION */, {}));\r\n }\r\n return passwordPolicy.validatePassword(password);\r\n }\r\n _getPasswordPolicyInternal() {\r\n if (this.tenantId === null) {\r\n return this._projectPasswordPolicy;\r\n }\r\n else {\r\n return this._tenantPasswordPolicies[this.tenantId];\r\n }\r\n }\r\n async _updatePasswordPolicy() {\r\n const response = await _getPasswordPolicy(this);\r\n const passwordPolicy = new PasswordPolicyImpl(response);\r\n if (this.tenantId === null) {\r\n this._projectPasswordPolicy = passwordPolicy;\r\n }\r\n else {\r\n this._tenantPasswordPolicies[this.tenantId] = passwordPolicy;\r\n }\r\n }\r\n _getPersistence() {\r\n return this.assertedPersistence.persistence.type;\r\n }\r\n _updateErrorMap(errorMap) {\r\n this._errorFactory = new ErrorFactory('auth', 'Firebase', errorMap());\r\n }\r\n onAuthStateChanged(nextOrObserver, error, completed) {\r\n return this.registerStateListener(this.authStateSubscription, nextOrObserver, error, completed);\r\n }\r\n beforeAuthStateChanged(callback, onAbort) {\r\n return this.beforeStateQueue.pushCallback(callback, onAbort);\r\n }\r\n onIdTokenChanged(nextOrObserver, error, completed) {\r\n return this.registerStateListener(this.idTokenSubscription, nextOrObserver, error, completed);\r\n }\r\n authStateReady() {\r\n return new Promise((resolve, reject) => {\r\n if (this.currentUser) {\r\n resolve();\r\n }\r\n else {\r\n const unsubscribe = this.onAuthStateChanged(() => {\r\n unsubscribe();\r\n resolve();\r\n }, reject);\r\n }\r\n });\r\n }\r\n /**\r\n * Revokes the given access token. Currently only supports Apple OAuth access tokens.\r\n */\r\n async revokeAccessToken(token) {\r\n if (this.currentUser) {\r\n const idToken = await this.currentUser.getIdToken();\r\n // Generalize this to accept other providers once supported.\r\n const request = {\r\n providerId: 'apple.com',\r\n tokenType: \"ACCESS_TOKEN\" /* TokenType.ACCESS_TOKEN */,\r\n token,\r\n idToken\r\n };\r\n if (this.tenantId != null) {\r\n request.tenantId = this.tenantId;\r\n }\r\n await revokeToken(this, request);\r\n }\r\n }\r\n toJSON() {\r\n var _a;\r\n return {\r\n apiKey: this.config.apiKey,\r\n authDomain: this.config.authDomain,\r\n appName: this.name,\r\n currentUser: (_a = this._currentUser) === null || _a === void 0 ? void 0 : _a.toJSON()\r\n };\r\n }\r\n async _setRedirectUser(user, popupRedirectResolver) {\r\n const redirectManager = await this.getOrInitRedirectPersistenceManager(popupRedirectResolver);\r\n return user === null\r\n ? redirectManager.removeCurrentUser()\r\n : redirectManager.setCurrentUser(user);\r\n }\r\n async getOrInitRedirectPersistenceManager(popupRedirectResolver) {\r\n if (!this.redirectPersistenceManager) {\r\n const resolver = (popupRedirectResolver && _getInstance(popupRedirectResolver)) ||\r\n this._popupRedirectResolver;\r\n _assert(resolver, this, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n this.redirectPersistenceManager = await PersistenceUserManager.create(this, [_getInstance(resolver._redirectPersistence)], \"redirectUser\" /* KeyName.REDIRECT_USER */);\r\n this.redirectUser =\r\n await this.redirectPersistenceManager.getCurrentUser();\r\n }\r\n return this.redirectPersistenceManager;\r\n }\r\n async _redirectUserForId(id) {\r\n var _a, _b;\r\n // Make sure we've cleared any pending persistence actions if we're not in\r\n // the initializer\r\n if (this._isInitialized) {\r\n await this.queue(async () => { });\r\n }\r\n if (((_a = this._currentUser) === null || _a === void 0 ? void 0 : _a._redirectEventId) === id) {\r\n return this._currentUser;\r\n }\r\n if (((_b = this.redirectUser) === null || _b === void 0 ? void 0 : _b._redirectEventId) === id) {\r\n return this.redirectUser;\r\n }\r\n return null;\r\n }\r\n async _persistUserIfCurrent(user) {\r\n if (user === this.currentUser) {\r\n return this.queue(async () => this.directlySetCurrentUser(user));\r\n }\r\n }\r\n /** Notifies listeners only if the user is current */\r\n _notifyListenersIfCurrent(user) {\r\n if (user === this.currentUser) {\r\n this.notifyAuthListeners();\r\n }\r\n }\r\n _key() {\r\n return `${this.config.authDomain}:${this.config.apiKey}:${this.name}`;\r\n }\r\n _startProactiveRefresh() {\r\n this.isProactiveRefreshEnabled = true;\r\n if (this.currentUser) {\r\n this._currentUser._startProactiveRefresh();\r\n }\r\n }\r\n _stopProactiveRefresh() {\r\n this.isProactiveRefreshEnabled = false;\r\n if (this.currentUser) {\r\n this._currentUser._stopProactiveRefresh();\r\n }\r\n }\r\n /** Returns the current user cast as the internal type */\r\n get _currentUser() {\r\n return this.currentUser;\r\n }\r\n notifyAuthListeners() {\r\n var _a, _b;\r\n if (!this._isInitialized) {\r\n return;\r\n }\r\n this.idTokenSubscription.next(this.currentUser);\r\n const currentUid = (_b = (_a = this.currentUser) === null || _a === void 0 ? void 0 : _a.uid) !== null && _b !== void 0 ? _b : null;\r\n if (this.lastNotifiedUid !== currentUid) {\r\n this.lastNotifiedUid = currentUid;\r\n this.authStateSubscription.next(this.currentUser);\r\n }\r\n }\r\n registerStateListener(subscription, nextOrObserver, error, completed) {\r\n if (this._deleted) {\r\n return () => { };\r\n }\r\n const cb = typeof nextOrObserver === 'function'\r\n ? nextOrObserver\r\n : nextOrObserver.next.bind(nextOrObserver);\r\n let isUnsubscribed = false;\r\n const promise = this._isInitialized\r\n ? Promise.resolve()\r\n : this._initializationPromise;\r\n _assert(promise, this, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n // The callback needs to be called asynchronously per the spec.\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n promise.then(() => {\r\n if (isUnsubscribed) {\r\n return;\r\n }\r\n cb(this.currentUser);\r\n });\r\n if (typeof nextOrObserver === 'function') {\r\n const unsubscribe = subscription.addObserver(nextOrObserver, error, completed);\r\n return () => {\r\n isUnsubscribed = true;\r\n unsubscribe();\r\n };\r\n }\r\n else {\r\n const unsubscribe = subscription.addObserver(nextOrObserver);\r\n return () => {\r\n isUnsubscribed = true;\r\n unsubscribe();\r\n };\r\n }\r\n }\r\n /**\r\n * Unprotected (from race conditions) method to set the current user. This\r\n * should only be called from within a queued callback. This is necessary\r\n * because the queue shouldn't rely on another queued callback.\r\n */\r\n async directlySetCurrentUser(user) {\r\n if (this.currentUser && this.currentUser !== user) {\r\n this._currentUser._stopProactiveRefresh();\r\n }\r\n if (user && this.isProactiveRefreshEnabled) {\r\n user._startProactiveRefresh();\r\n }\r\n this.currentUser = user;\r\n if (user) {\r\n await this.assertedPersistence.setCurrentUser(user);\r\n }\r\n else {\r\n await this.assertedPersistence.removeCurrentUser();\r\n }\r\n }\r\n queue(action) {\r\n // In case something errors, the callback still should be called in order\r\n // to keep the promise chain alive\r\n this.operations = this.operations.then(action, action);\r\n return this.operations;\r\n }\r\n get assertedPersistence() {\r\n _assert(this.persistenceManager, this, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return this.persistenceManager;\r\n }\r\n _logFramework(framework) {\r\n if (!framework || this.frameworks.includes(framework)) {\r\n return;\r\n }\r\n this.frameworks.push(framework);\r\n // Sort alphabetically so that \"FirebaseCore-web,FirebaseUI-web\" and\r\n // \"FirebaseUI-web,FirebaseCore-web\" aren't viewed as different.\r\n this.frameworks.sort();\r\n this.clientVersion = _getClientVersion(this.config.clientPlatform, this._getFrameworks());\r\n }\r\n _getFrameworks() {\r\n return this.frameworks;\r\n }\r\n async _getAdditionalHeaders() {\r\n var _a;\r\n // Additional headers on every request\r\n const headers = {\r\n [\"X-Client-Version\" /* HttpHeader.X_CLIENT_VERSION */]: this.clientVersion\r\n };\r\n if (this.app.options.appId) {\r\n headers[\"X-Firebase-gmpid\" /* HttpHeader.X_FIREBASE_GMPID */] = this.app.options.appId;\r\n }\r\n // If the heartbeat service exists, add the heartbeat string\r\n const heartbeatsHeader = await ((_a = this.heartbeatServiceProvider\r\n .getImmediate({\r\n optional: true\r\n })) === null || _a === void 0 ? void 0 : _a.getHeartbeatsHeader());\r\n if (heartbeatsHeader) {\r\n headers[\"X-Firebase-Client\" /* HttpHeader.X_FIREBASE_CLIENT */] = heartbeatsHeader;\r\n }\r\n // If the App Check service exists, add the App Check token in the headers\r\n const appCheckToken = await this._getAppCheckToken();\r\n if (appCheckToken) {\r\n headers[\"X-Firebase-AppCheck\" /* HttpHeader.X_FIREBASE_APP_CHECK */] = appCheckToken;\r\n }\r\n return headers;\r\n }\r\n async _getAppCheckToken() {\r\n var _a;\r\n const appCheckTokenResult = await ((_a = this.appCheckServiceProvider\r\n .getImmediate({ optional: true })) === null || _a === void 0 ? void 0 : _a.getToken());\r\n if (appCheckTokenResult === null || appCheckTokenResult === void 0 ? void 0 : appCheckTokenResult.error) {\r\n // Context: appCheck.getToken() will never throw even if an error happened.\r\n // In the error case, a dummy token will be returned along with an error field describing\r\n // the error. In general, we shouldn't care about the error condition and just use\r\n // the token (actual or dummy) to send requests.\r\n _logWarn(`Error while retrieving App Check token: ${appCheckTokenResult.error}`);\r\n }\r\n return appCheckTokenResult === null || appCheckTokenResult === void 0 ? void 0 : appCheckTokenResult.token;\r\n }\r\n}\r\n/**\r\n * Method to be used to cast down to our private implementation of Auth.\r\n * It will also handle unwrapping from the compat type if necessary\r\n *\r\n * @param auth Auth object passed in from developer\r\n */\r\nfunction _castAuth(auth) {\r\n return getModularInstance(auth);\r\n}\r\n/** Helper class to wrap subscriber logic */\r\nclass Subscription {\r\n constructor(auth) {\r\n this.auth = auth;\r\n this.observer = null;\r\n this.addObserver = createSubscribe(observer => (this.observer = observer));\r\n }\r\n get next() {\r\n _assert(this.observer, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return this.observer.next.bind(this.observer);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nlet externalJSProvider = {\r\n async loadJS() {\r\n throw new Error('Unable to load external scripts');\r\n },\r\n recaptchaV2Script: '',\r\n recaptchaEnterpriseScript: '',\r\n gapiScript: ''\r\n};\r\nfunction _setExternalJSProvider(p) {\r\n externalJSProvider = p;\r\n}\r\nfunction _loadJS(url) {\r\n return externalJSProvider.loadJS(url);\r\n}\r\nfunction _recaptchaV2ScriptUrl() {\r\n return externalJSProvider.recaptchaV2Script;\r\n}\r\nfunction _recaptchaEnterpriseScriptUrl() {\r\n return externalJSProvider.recaptchaEnterpriseScript;\r\n}\r\nfunction _gapiScriptUrl() {\r\n return externalJSProvider.gapiScript;\r\n}\r\nfunction _generateCallbackName(prefix) {\r\n return `__${prefix}${Math.floor(Math.random() * 1000000)}`;\r\n}\n\n/* eslint-disable @typescript-eslint/no-require-imports */\r\nconst RECAPTCHA_ENTERPRISE_VERIFIER_TYPE = 'recaptcha-enterprise';\r\nconst FAKE_TOKEN = 'NO_RECAPTCHA';\r\nclass RecaptchaEnterpriseVerifier {\r\n /**\r\n *\r\n * @param authExtern - The corresponding Firebase {@link Auth} instance.\r\n *\r\n */\r\n constructor(authExtern) {\r\n /**\r\n * Identifies the type of application verifier (e.g. \"recaptcha-enterprise\").\r\n */\r\n this.type = RECAPTCHA_ENTERPRISE_VERIFIER_TYPE;\r\n this.auth = _castAuth(authExtern);\r\n }\r\n /**\r\n * Executes the verification process.\r\n *\r\n * @returns A Promise for a token that can be used to assert the validity of a request.\r\n */\r\n async verify(action = 'verify', forceRefresh = false) {\r\n async function retrieveSiteKey(auth) {\r\n if (!forceRefresh) {\r\n if (auth.tenantId == null && auth._agentRecaptchaConfig != null) {\r\n return auth._agentRecaptchaConfig.siteKey;\r\n }\r\n if (auth.tenantId != null &&\r\n auth._tenantRecaptchaConfigs[auth.tenantId] !== undefined) {\r\n return auth._tenantRecaptchaConfigs[auth.tenantId].siteKey;\r\n }\r\n }\r\n return new Promise(async (resolve, reject) => {\r\n getRecaptchaConfig(auth, {\r\n clientType: \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */,\r\n version: \"RECAPTCHA_ENTERPRISE\" /* RecaptchaVersion.ENTERPRISE */\r\n })\r\n .then(response => {\r\n if (response.recaptchaKey === undefined) {\r\n reject(new Error('recaptcha Enterprise site key undefined'));\r\n }\r\n else {\r\n const config = new RecaptchaConfig(response);\r\n if (auth.tenantId == null) {\r\n auth._agentRecaptchaConfig = config;\r\n }\r\n else {\r\n auth._tenantRecaptchaConfigs[auth.tenantId] = config;\r\n }\r\n return resolve(config.siteKey);\r\n }\r\n })\r\n .catch(error => {\r\n reject(error);\r\n });\r\n });\r\n }\r\n function retrieveRecaptchaToken(siteKey, resolve, reject) {\r\n const grecaptcha = window.grecaptcha;\r\n if (isEnterprise(grecaptcha)) {\r\n grecaptcha.enterprise.ready(() => {\r\n grecaptcha.enterprise\r\n .execute(siteKey, { action })\r\n .then(token => {\r\n resolve(token);\r\n })\r\n .catch(() => {\r\n resolve(FAKE_TOKEN);\r\n });\r\n });\r\n }\r\n else {\r\n reject(Error('No reCAPTCHA enterprise script loaded.'));\r\n }\r\n }\r\n return new Promise((resolve, reject) => {\r\n retrieveSiteKey(this.auth)\r\n .then(siteKey => {\r\n if (!forceRefresh && isEnterprise(window.grecaptcha)) {\r\n retrieveRecaptchaToken(siteKey, resolve, reject);\r\n }\r\n else {\r\n if (typeof window === 'undefined') {\r\n reject(new Error('RecaptchaVerifier is only supported in browser'));\r\n return;\r\n }\r\n let url = _recaptchaEnterpriseScriptUrl();\r\n if (url.length !== 0) {\r\n url += siteKey;\r\n }\r\n _loadJS(url)\r\n .then(() => {\r\n retrieveRecaptchaToken(siteKey, resolve, reject);\r\n })\r\n .catch(error => {\r\n reject(error);\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n reject(error);\r\n });\r\n });\r\n }\r\n}\r\nasync function injectRecaptchaFields(auth, request, action, captchaResp = false) {\r\n const verifier = new RecaptchaEnterpriseVerifier(auth);\r\n let captchaResponse;\r\n try {\r\n captchaResponse = await verifier.verify(action);\r\n }\r\n catch (error) {\r\n captchaResponse = await verifier.verify(action, true);\r\n }\r\n const newRequest = Object.assign({}, request);\r\n if (!captchaResp) {\r\n Object.assign(newRequest, { captchaResponse });\r\n }\r\n else {\r\n Object.assign(newRequest, { 'captchaResp': captchaResponse });\r\n }\r\n Object.assign(newRequest, { 'clientType': \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */ });\r\n Object.assign(newRequest, {\r\n 'recaptchaVersion': \"RECAPTCHA_ENTERPRISE\" /* RecaptchaVersion.ENTERPRISE */\r\n });\r\n return newRequest;\r\n}\r\nasync function handleRecaptchaFlow(authInstance, request, actionName, actionMethod) {\r\n var _a;\r\n if ((_a = authInstance\r\n ._getRecaptchaConfig()) === null || _a === void 0 ? void 0 : _a.isProviderEnabled(\"EMAIL_PASSWORD_PROVIDER\" /* RecaptchaProvider.EMAIL_PASSWORD_PROVIDER */)) {\r\n const requestWithRecaptcha = await injectRecaptchaFields(authInstance, request, actionName, actionName === \"getOobCode\" /* RecaptchaActionName.GET_OOB_CODE */);\r\n return actionMethod(authInstance, requestWithRecaptcha);\r\n }\r\n else {\r\n return actionMethod(authInstance, request).catch(async (error) => {\r\n if (error.code === `auth/${\"missing-recaptcha-token\" /* AuthErrorCode.MISSING_RECAPTCHA_TOKEN */}`) {\r\n console.log(`${actionName} is protected by reCAPTCHA Enterprise for this project. Automatically triggering the reCAPTCHA flow and restarting the flow.`);\r\n const requestWithRecaptcha = await injectRecaptchaFields(authInstance, request, actionName, actionName === \"getOobCode\" /* RecaptchaActionName.GET_OOB_CODE */);\r\n return actionMethod(authInstance, requestWithRecaptcha);\r\n }\r\n else {\r\n return Promise.reject(error);\r\n }\r\n });\r\n }\r\n}\r\nasync function _initializeRecaptchaConfig(auth) {\r\n const authInternal = _castAuth(auth);\r\n const response = await getRecaptchaConfig(authInternal, {\r\n clientType: \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */,\r\n version: \"RECAPTCHA_ENTERPRISE\" /* RecaptchaVersion.ENTERPRISE */\r\n });\r\n const config = new RecaptchaConfig(response);\r\n if (authInternal.tenantId == null) {\r\n authInternal._agentRecaptchaConfig = config;\r\n }\r\n else {\r\n authInternal._tenantRecaptchaConfigs[authInternal.tenantId] = config;\r\n }\r\n if (config.isProviderEnabled(\"EMAIL_PASSWORD_PROVIDER\" /* RecaptchaProvider.EMAIL_PASSWORD_PROVIDER */)) {\r\n const verifier = new RecaptchaEnterpriseVerifier(authInternal);\r\n void verifier.verify();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Initializes an {@link Auth} instance with fine-grained control over\r\n * {@link Dependencies}.\r\n *\r\n * @remarks\r\n *\r\n * This function allows more control over the {@link Auth} instance than\r\n * {@link getAuth}. `getAuth` uses platform-specific defaults to supply\r\n * the {@link Dependencies}. In general, `getAuth` is the easiest way to\r\n * initialize Auth and works for most use cases. Use `initializeAuth` if you\r\n * need control over which persistence layer is used, or to minimize bundle\r\n * size if you're not using either `signInWithPopup` or `signInWithRedirect`.\r\n *\r\n * For example, if your app only uses anonymous accounts and you only want\r\n * accounts saved for the current session, initialize `Auth` with:\r\n *\r\n * ```js\r\n * const auth = initializeAuth(app, {\r\n * persistence: browserSessionPersistence,\r\n * popupRedirectResolver: undefined,\r\n * });\r\n * ```\r\n *\r\n * @public\r\n */\r\nfunction initializeAuth(app, deps) {\r\n const provider = _getProvider(app, 'auth');\r\n if (provider.isInitialized()) {\r\n const auth = provider.getImmediate();\r\n const initialOptions = provider.getOptions();\r\n if (deepEqual(initialOptions, deps !== null && deps !== void 0 ? deps : {})) {\r\n return auth;\r\n }\r\n else {\r\n _fail(auth, \"already-initialized\" /* AuthErrorCode.ALREADY_INITIALIZED */);\r\n }\r\n }\r\n const auth = provider.initialize({ options: deps });\r\n return auth;\r\n}\r\nfunction _initializeAuthInstance(auth, deps) {\r\n const persistence = (deps === null || deps === void 0 ? void 0 : deps.persistence) || [];\r\n const hierarchy = (Array.isArray(persistence) ? persistence : [persistence]).map(_getInstance);\r\n if (deps === null || deps === void 0 ? void 0 : deps.errorMap) {\r\n auth._updateErrorMap(deps.errorMap);\r\n }\r\n // This promise is intended to float; auth initialization happens in the\r\n // background, meanwhile the auth object may be used by the app.\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n auth._initializeWithPersistence(hierarchy, deps === null || deps === void 0 ? void 0 : deps.popupRedirectResolver);\r\n}\n\n/**\r\n * Changes the {@link Auth} instance to communicate with the Firebase Auth Emulator, instead of production\r\n * Firebase Auth services.\r\n *\r\n * @remarks\r\n * This must be called synchronously immediately following the first call to\r\n * {@link initializeAuth}. Do not use with production credentials as emulator\r\n * traffic is not encrypted.\r\n *\r\n *\r\n * @example\r\n * ```javascript\r\n * connectAuthEmulator(auth, 'http://127.0.0.1:9099', { disableWarnings: true });\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param url - The URL at which the emulator is running (eg, 'http://localhost:9099').\r\n * @param options - Optional. `options.disableWarnings` defaults to `false`. Set it to\r\n * `true` to disable the warning banner attached to the DOM.\r\n *\r\n * @public\r\n */\r\nfunction connectAuthEmulator(auth, url, options) {\r\n const authInternal = _castAuth(auth);\r\n _assert(authInternal._canInitEmulator, authInternal, \"emulator-config-failed\" /* AuthErrorCode.EMULATOR_CONFIG_FAILED */);\r\n _assert(/^https?:\\/\\//.test(url), authInternal, \"invalid-emulator-scheme\" /* AuthErrorCode.INVALID_EMULATOR_SCHEME */);\r\n const disableWarnings = !!(options === null || options === void 0 ? void 0 : options.disableWarnings);\r\n const protocol = extractProtocol(url);\r\n const { host, port } = extractHostAndPort(url);\r\n const portStr = port === null ? '' : `:${port}`;\r\n // Always replace path with \"/\" (even if input url had no path at all, or had a different one).\r\n authInternal.config.emulator = { url: `${protocol}//${host}${portStr}/` };\r\n authInternal.settings.appVerificationDisabledForTesting = true;\r\n authInternal.emulatorConfig = Object.freeze({\r\n host,\r\n port,\r\n protocol: protocol.replace(':', ''),\r\n options: Object.freeze({ disableWarnings })\r\n });\r\n if (!disableWarnings) {\r\n emitEmulatorWarning();\r\n }\r\n}\r\nfunction extractProtocol(url) {\r\n const protocolEnd = url.indexOf(':');\r\n return protocolEnd < 0 ? '' : url.substr(0, protocolEnd + 1);\r\n}\r\nfunction extractHostAndPort(url) {\r\n const protocol = extractProtocol(url);\r\n const authority = /(\\/\\/)?([^?#/]+)/.exec(url.substr(protocol.length)); // Between // and /, ? or #.\r\n if (!authority) {\r\n return { host: '', port: null };\r\n }\r\n const hostAndPort = authority[2].split('@').pop() || ''; // Strip out \"username:password@\".\r\n const bracketedIPv6 = /^(\\[[^\\]]+\\])(:|$)/.exec(hostAndPort);\r\n if (bracketedIPv6) {\r\n const host = bracketedIPv6[1];\r\n return { host, port: parsePort(hostAndPort.substr(host.length + 1)) };\r\n }\r\n else {\r\n const [host, port] = hostAndPort.split(':');\r\n return { host, port: parsePort(port) };\r\n }\r\n}\r\nfunction parsePort(portStr) {\r\n if (!portStr) {\r\n return null;\r\n }\r\n const port = Number(portStr);\r\n if (isNaN(port)) {\r\n return null;\r\n }\r\n return port;\r\n}\r\nfunction emitEmulatorWarning() {\r\n function attachBanner() {\r\n const el = document.createElement('p');\r\n const sty = el.style;\r\n el.innerText =\r\n 'Running in emulator mode. Do not use with production credentials.';\r\n sty.position = 'fixed';\r\n sty.width = '100%';\r\n sty.backgroundColor = '#ffffff';\r\n sty.border = '.1em solid #000000';\r\n sty.color = '#b50000';\r\n sty.bottom = '0px';\r\n sty.left = '0px';\r\n sty.margin = '0px';\r\n sty.zIndex = '10000';\r\n sty.textAlign = 'center';\r\n el.classList.add('firebase-emulator-warning');\r\n document.body.appendChild(el);\r\n }\r\n if (typeof console !== 'undefined' && typeof console.info === 'function') {\r\n console.info('WARNING: You are using the Auth Emulator,' +\r\n ' which is intended for local testing only. Do not use with' +\r\n ' production credentials.');\r\n }\r\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\r\n if (document.readyState === 'loading') {\r\n window.addEventListener('DOMContentLoaded', attachBanner);\r\n }\r\n else {\r\n attachBanner();\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Interface that represents the credentials returned by an {@link AuthProvider}.\r\n *\r\n * @remarks\r\n * Implementations specify the details about each auth provider's credential requirements.\r\n *\r\n * @public\r\n */\r\nclass AuthCredential {\r\n /** @internal */\r\n constructor(\r\n /**\r\n * The authentication provider ID for the credential.\r\n *\r\n * @remarks\r\n * For example, 'facebook.com', or 'google.com'.\r\n */\r\n providerId, \r\n /**\r\n * The authentication sign in method for the credential.\r\n *\r\n * @remarks\r\n * For example, {@link SignInMethod}.EMAIL_PASSWORD, or\r\n * {@link SignInMethod}.EMAIL_LINK. This corresponds to the sign-in method\r\n * identifier as returned in {@link fetchSignInMethodsForEmail}.\r\n */\r\n signInMethod) {\r\n this.providerId = providerId;\r\n this.signInMethod = signInMethod;\r\n }\r\n /**\r\n * Returns a JSON-serializable representation of this object.\r\n *\r\n * @returns a JSON-serializable representation of this object.\r\n */\r\n toJSON() {\r\n return debugFail('not implemented');\r\n }\r\n /** @internal */\r\n _getIdTokenResponse(_auth) {\r\n return debugFail('not implemented');\r\n }\r\n /** @internal */\r\n _linkToIdToken(_auth, _idToken) {\r\n return debugFail('not implemented');\r\n }\r\n /** @internal */\r\n _getReauthenticationResolver(_auth) {\r\n return debugFail('not implemented');\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function resetPassword(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:resetPassword\" /* Endpoint.RESET_PASSWORD */, _addTidIfNecessary(auth, request));\r\n}\r\nasync function updateEmailPassword(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:update\" /* Endpoint.SET_ACCOUNT_INFO */, request);\r\n}\r\n// Used for linking an email/password account to an existing idToken. Uses the same request/response\r\n// format as updateEmailPassword.\r\nasync function linkEmailPassword(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signUp\" /* Endpoint.SIGN_UP */, request);\r\n}\r\nasync function applyActionCode$1(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:update\" /* Endpoint.SET_ACCOUNT_INFO */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function signInWithPassword(auth, request) {\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithPassword\" /* Endpoint.SIGN_IN_WITH_PASSWORD */, _addTidIfNecessary(auth, request));\r\n}\r\nasync function sendOobCode(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:sendOobCode\" /* Endpoint.SEND_OOB_CODE */, _addTidIfNecessary(auth, request));\r\n}\r\nasync function sendEmailVerification$1(auth, request) {\r\n return sendOobCode(auth, request);\r\n}\r\nasync function sendPasswordResetEmail$1(auth, request) {\r\n return sendOobCode(auth, request);\r\n}\r\nasync function sendSignInLinkToEmail$1(auth, request) {\r\n return sendOobCode(auth, request);\r\n}\r\nasync function verifyAndChangeEmail(auth, request) {\r\n return sendOobCode(auth, request);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function signInWithEmailLink$1(auth, request) {\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithEmailLink\" /* Endpoint.SIGN_IN_WITH_EMAIL_LINK */, _addTidIfNecessary(auth, request));\r\n}\r\nasync function signInWithEmailLinkForLinking(auth, request) {\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithEmailLink\" /* Endpoint.SIGN_IN_WITH_EMAIL_LINK */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Interface that represents the credentials returned by {@link EmailAuthProvider} for\r\n * {@link ProviderId}.PASSWORD\r\n *\r\n * @remarks\r\n * Covers both {@link SignInMethod}.EMAIL_PASSWORD and\r\n * {@link SignInMethod}.EMAIL_LINK.\r\n *\r\n * @public\r\n */\r\nclass EmailAuthCredential extends AuthCredential {\r\n /** @internal */\r\n constructor(\r\n /** @internal */\r\n _email, \r\n /** @internal */\r\n _password, signInMethod, \r\n /** @internal */\r\n _tenantId = null) {\r\n super(\"password\" /* ProviderId.PASSWORD */, signInMethod);\r\n this._email = _email;\r\n this._password = _password;\r\n this._tenantId = _tenantId;\r\n }\r\n /** @internal */\r\n static _fromEmailAndPassword(email, password) {\r\n return new EmailAuthCredential(email, password, \"password\" /* SignInMethod.EMAIL_PASSWORD */);\r\n }\r\n /** @internal */\r\n static _fromEmailAndCode(email, oobCode, tenantId = null) {\r\n return new EmailAuthCredential(email, oobCode, \"emailLink\" /* SignInMethod.EMAIL_LINK */, tenantId);\r\n }\r\n /** {@inheritdoc AuthCredential.toJSON} */\r\n toJSON() {\r\n return {\r\n email: this._email,\r\n password: this._password,\r\n signInMethod: this.signInMethod,\r\n tenantId: this._tenantId\r\n };\r\n }\r\n /**\r\n * Static method to deserialize a JSON representation of an object into an {@link AuthCredential}.\r\n *\r\n * @param json - Either `object` or the stringified representation of the object. When string is\r\n * provided, `JSON.parse` would be called first.\r\n *\r\n * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned.\r\n */\r\n static fromJSON(json) {\r\n const obj = typeof json === 'string' ? JSON.parse(json) : json;\r\n if ((obj === null || obj === void 0 ? void 0 : obj.email) && (obj === null || obj === void 0 ? void 0 : obj.password)) {\r\n if (obj.signInMethod === \"password\" /* SignInMethod.EMAIL_PASSWORD */) {\r\n return this._fromEmailAndPassword(obj.email, obj.password);\r\n }\r\n else if (obj.signInMethod === \"emailLink\" /* SignInMethod.EMAIL_LINK */) {\r\n return this._fromEmailAndCode(obj.email, obj.password, obj.tenantId);\r\n }\r\n }\r\n return null;\r\n }\r\n /** @internal */\r\n async _getIdTokenResponse(auth) {\r\n switch (this.signInMethod) {\r\n case \"password\" /* SignInMethod.EMAIL_PASSWORD */:\r\n const request = {\r\n returnSecureToken: true,\r\n email: this._email,\r\n password: this._password,\r\n clientType: \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */\r\n };\r\n return handleRecaptchaFlow(auth, request, \"signInWithPassword\" /* RecaptchaActionName.SIGN_IN_WITH_PASSWORD */, signInWithPassword);\r\n case \"emailLink\" /* SignInMethod.EMAIL_LINK */:\r\n return signInWithEmailLink$1(auth, {\r\n email: this._email,\r\n oobCode: this._password\r\n });\r\n default:\r\n _fail(auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }\r\n }\r\n /** @internal */\r\n async _linkToIdToken(auth, idToken) {\r\n switch (this.signInMethod) {\r\n case \"password\" /* SignInMethod.EMAIL_PASSWORD */:\r\n const request = {\r\n idToken,\r\n returnSecureToken: true,\r\n email: this._email,\r\n password: this._password,\r\n clientType: \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */\r\n };\r\n return handleRecaptchaFlow(auth, request, \"signUpPassword\" /* RecaptchaActionName.SIGN_UP_PASSWORD */, linkEmailPassword);\r\n case \"emailLink\" /* SignInMethod.EMAIL_LINK */:\r\n return signInWithEmailLinkForLinking(auth, {\r\n idToken,\r\n email: this._email,\r\n oobCode: this._password\r\n });\r\n default:\r\n _fail(auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }\r\n }\r\n /** @internal */\r\n _getReauthenticationResolver(auth) {\r\n return this._getIdTokenResponse(auth);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function signInWithIdp(auth, request) {\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithIdp\" /* Endpoint.SIGN_IN_WITH_IDP */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst IDP_REQUEST_URI$1 = 'http://localhost';\r\n/**\r\n * Represents the OAuth credentials returned by an {@link OAuthProvider}.\r\n *\r\n * @remarks\r\n * Implementations specify the details about each auth provider's credential requirements.\r\n *\r\n * @public\r\n */\r\nclass OAuthCredential extends AuthCredential {\r\n constructor() {\r\n super(...arguments);\r\n this.pendingToken = null;\r\n }\r\n /** @internal */\r\n static _fromParams(params) {\r\n const cred = new OAuthCredential(params.providerId, params.signInMethod);\r\n if (params.idToken || params.accessToken) {\r\n // OAuth 2 and either ID token or access token.\r\n if (params.idToken) {\r\n cred.idToken = params.idToken;\r\n }\r\n if (params.accessToken) {\r\n cred.accessToken = params.accessToken;\r\n }\r\n // Add nonce if available and no pendingToken is present.\r\n if (params.nonce && !params.pendingToken) {\r\n cred.nonce = params.nonce;\r\n }\r\n if (params.pendingToken) {\r\n cred.pendingToken = params.pendingToken;\r\n }\r\n }\r\n else if (params.oauthToken && params.oauthTokenSecret) {\r\n // OAuth 1 and OAuth token with token secret\r\n cred.accessToken = params.oauthToken;\r\n cred.secret = params.oauthTokenSecret;\r\n }\r\n else {\r\n _fail(\"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n }\r\n return cred;\r\n }\r\n /** {@inheritdoc AuthCredential.toJSON} */\r\n toJSON() {\r\n return {\r\n idToken: this.idToken,\r\n accessToken: this.accessToken,\r\n secret: this.secret,\r\n nonce: this.nonce,\r\n pendingToken: this.pendingToken,\r\n providerId: this.providerId,\r\n signInMethod: this.signInMethod\r\n };\r\n }\r\n /**\r\n * Static method to deserialize a JSON representation of an object into an\r\n * {@link AuthCredential}.\r\n *\r\n * @param json - Input can be either Object or the stringified representation of the object.\r\n * When string is provided, JSON.parse would be called first.\r\n *\r\n * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned.\r\n */\r\n static fromJSON(json) {\r\n const obj = typeof json === 'string' ? JSON.parse(json) : json;\r\n const { providerId, signInMethod } = obj, rest = __rest(obj, [\"providerId\", \"signInMethod\"]);\r\n if (!providerId || !signInMethod) {\r\n return null;\r\n }\r\n const cred = new OAuthCredential(providerId, signInMethod);\r\n cred.idToken = rest.idToken || undefined;\r\n cred.accessToken = rest.accessToken || undefined;\r\n cred.secret = rest.secret;\r\n cred.nonce = rest.nonce;\r\n cred.pendingToken = rest.pendingToken || null;\r\n return cred;\r\n }\r\n /** @internal */\r\n _getIdTokenResponse(auth) {\r\n const request = this.buildRequest();\r\n return signInWithIdp(auth, request);\r\n }\r\n /** @internal */\r\n _linkToIdToken(auth, idToken) {\r\n const request = this.buildRequest();\r\n request.idToken = idToken;\r\n return signInWithIdp(auth, request);\r\n }\r\n /** @internal */\r\n _getReauthenticationResolver(auth) {\r\n const request = this.buildRequest();\r\n request.autoCreate = false;\r\n return signInWithIdp(auth, request);\r\n }\r\n buildRequest() {\r\n const request = {\r\n requestUri: IDP_REQUEST_URI$1,\r\n returnSecureToken: true\r\n };\r\n if (this.pendingToken) {\r\n request.pendingToken = this.pendingToken;\r\n }\r\n else {\r\n const postBody = {};\r\n if (this.idToken) {\r\n postBody['id_token'] = this.idToken;\r\n }\r\n if (this.accessToken) {\r\n postBody['access_token'] = this.accessToken;\r\n }\r\n if (this.secret) {\r\n postBody['oauth_token_secret'] = this.secret;\r\n }\r\n postBody['providerId'] = this.providerId;\r\n if (this.nonce && !this.pendingToken) {\r\n postBody['nonce'] = this.nonce;\r\n }\r\n request.postBody = querystring(postBody);\r\n }\r\n return request;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function sendPhoneVerificationCode(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:sendVerificationCode\" /* Endpoint.SEND_VERIFICATION_CODE */, _addTidIfNecessary(auth, request));\r\n}\r\nasync function signInWithPhoneNumber$1(auth, request) {\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithPhoneNumber\" /* Endpoint.SIGN_IN_WITH_PHONE_NUMBER */, _addTidIfNecessary(auth, request));\r\n}\r\nasync function linkWithPhoneNumber$1(auth, request) {\r\n const response = await _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithPhoneNumber\" /* Endpoint.SIGN_IN_WITH_PHONE_NUMBER */, _addTidIfNecessary(auth, request));\r\n if (response.temporaryProof) {\r\n throw _makeTaggedError(auth, \"account-exists-with-different-credential\" /* AuthErrorCode.NEED_CONFIRMATION */, response);\r\n }\r\n return response;\r\n}\r\nconst VERIFY_PHONE_NUMBER_FOR_EXISTING_ERROR_MAP_ = {\r\n [\"USER_NOT_FOUND\" /* ServerError.USER_NOT_FOUND */]: \"user-not-found\" /* AuthErrorCode.USER_DELETED */\r\n};\r\nasync function verifyPhoneNumberForExisting(auth, request) {\r\n const apiRequest = Object.assign(Object.assign({}, request), { operation: 'REAUTH' });\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithPhoneNumber\" /* Endpoint.SIGN_IN_WITH_PHONE_NUMBER */, _addTidIfNecessary(auth, apiRequest), VERIFY_PHONE_NUMBER_FOR_EXISTING_ERROR_MAP_);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Represents the credentials returned by {@link PhoneAuthProvider}.\r\n *\r\n * @public\r\n */\r\nclass PhoneAuthCredential extends AuthCredential {\r\n constructor(params) {\r\n super(\"phone\" /* ProviderId.PHONE */, \"phone\" /* SignInMethod.PHONE */);\r\n this.params = params;\r\n }\r\n /** @internal */\r\n static _fromVerification(verificationId, verificationCode) {\r\n return new PhoneAuthCredential({ verificationId, verificationCode });\r\n }\r\n /** @internal */\r\n static _fromTokenResponse(phoneNumber, temporaryProof) {\r\n return new PhoneAuthCredential({ phoneNumber, temporaryProof });\r\n }\r\n /** @internal */\r\n _getIdTokenResponse(auth) {\r\n return signInWithPhoneNumber$1(auth, this._makeVerificationRequest());\r\n }\r\n /** @internal */\r\n _linkToIdToken(auth, idToken) {\r\n return linkWithPhoneNumber$1(auth, Object.assign({ idToken }, this._makeVerificationRequest()));\r\n }\r\n /** @internal */\r\n _getReauthenticationResolver(auth) {\r\n return verifyPhoneNumberForExisting(auth, this._makeVerificationRequest());\r\n }\r\n /** @internal */\r\n _makeVerificationRequest() {\r\n const { temporaryProof, phoneNumber, verificationId, verificationCode } = this.params;\r\n if (temporaryProof && phoneNumber) {\r\n return { temporaryProof, phoneNumber };\r\n }\r\n return {\r\n sessionInfo: verificationId,\r\n code: verificationCode\r\n };\r\n }\r\n /** {@inheritdoc AuthCredential.toJSON} */\r\n toJSON() {\r\n const obj = {\r\n providerId: this.providerId\r\n };\r\n if (this.params.phoneNumber) {\r\n obj.phoneNumber = this.params.phoneNumber;\r\n }\r\n if (this.params.temporaryProof) {\r\n obj.temporaryProof = this.params.temporaryProof;\r\n }\r\n if (this.params.verificationCode) {\r\n obj.verificationCode = this.params.verificationCode;\r\n }\r\n if (this.params.verificationId) {\r\n obj.verificationId = this.params.verificationId;\r\n }\r\n return obj;\r\n }\r\n /** Generates a phone credential based on a plain object or a JSON string. */\r\n static fromJSON(json) {\r\n if (typeof json === 'string') {\r\n json = JSON.parse(json);\r\n }\r\n const { verificationId, verificationCode, phoneNumber, temporaryProof } = json;\r\n if (!verificationCode &&\r\n !verificationId &&\r\n !phoneNumber &&\r\n !temporaryProof) {\r\n return null;\r\n }\r\n return new PhoneAuthCredential({\r\n verificationId,\r\n verificationCode,\r\n phoneNumber,\r\n temporaryProof\r\n });\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Maps the mode string in action code URL to Action Code Info operation.\r\n *\r\n * @param mode\r\n */\r\nfunction parseMode(mode) {\r\n switch (mode) {\r\n case 'recoverEmail':\r\n return \"RECOVER_EMAIL\" /* ActionCodeOperation.RECOVER_EMAIL */;\r\n case 'resetPassword':\r\n return \"PASSWORD_RESET\" /* ActionCodeOperation.PASSWORD_RESET */;\r\n case 'signIn':\r\n return \"EMAIL_SIGNIN\" /* ActionCodeOperation.EMAIL_SIGNIN */;\r\n case 'verifyEmail':\r\n return \"VERIFY_EMAIL\" /* ActionCodeOperation.VERIFY_EMAIL */;\r\n case 'verifyAndChangeEmail':\r\n return \"VERIFY_AND_CHANGE_EMAIL\" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */;\r\n case 'revertSecondFactorAddition':\r\n return \"REVERT_SECOND_FACTOR_ADDITION\" /* ActionCodeOperation.REVERT_SECOND_FACTOR_ADDITION */;\r\n default:\r\n return null;\r\n }\r\n}\r\n/**\r\n * Helper to parse FDL links\r\n *\r\n * @param url\r\n */\r\nfunction parseDeepLink(url) {\r\n const link = querystringDecode(extractQuerystring(url))['link'];\r\n // Double link case (automatic redirect).\r\n const doubleDeepLink = link\r\n ? querystringDecode(extractQuerystring(link))['deep_link_id']\r\n : null;\r\n // iOS custom scheme links.\r\n const iOSDeepLink = querystringDecode(extractQuerystring(url))['deep_link_id'];\r\n const iOSDoubleDeepLink = iOSDeepLink\r\n ? querystringDecode(extractQuerystring(iOSDeepLink))['link']\r\n : null;\r\n return iOSDoubleDeepLink || iOSDeepLink || doubleDeepLink || link || url;\r\n}\r\n/**\r\n * A utility class to parse email action URLs such as password reset, email verification,\r\n * email link sign in, etc.\r\n *\r\n * @public\r\n */\r\nclass ActionCodeURL {\r\n /**\r\n * @param actionLink - The link from which to extract the URL.\r\n * @returns The {@link ActionCodeURL} object, or null if the link is invalid.\r\n *\r\n * @internal\r\n */\r\n constructor(actionLink) {\r\n var _a, _b, _c, _d, _e, _f;\r\n const searchParams = querystringDecode(extractQuerystring(actionLink));\r\n const apiKey = (_a = searchParams[\"apiKey\" /* QueryField.API_KEY */]) !== null && _a !== void 0 ? _a : null;\r\n const code = (_b = searchParams[\"oobCode\" /* QueryField.CODE */]) !== null && _b !== void 0 ? _b : null;\r\n const operation = parseMode((_c = searchParams[\"mode\" /* QueryField.MODE */]) !== null && _c !== void 0 ? _c : null);\r\n // Validate API key, code and mode.\r\n _assert(apiKey && code && operation, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n this.apiKey = apiKey;\r\n this.operation = operation;\r\n this.code = code;\r\n this.continueUrl = (_d = searchParams[\"continueUrl\" /* QueryField.CONTINUE_URL */]) !== null && _d !== void 0 ? _d : null;\r\n this.languageCode = (_e = searchParams[\"languageCode\" /* QueryField.LANGUAGE_CODE */]) !== null && _e !== void 0 ? _e : null;\r\n this.tenantId = (_f = searchParams[\"tenantId\" /* QueryField.TENANT_ID */]) !== null && _f !== void 0 ? _f : null;\r\n }\r\n /**\r\n * Parses the email action link string and returns an {@link ActionCodeURL} if the link is valid,\r\n * otherwise returns null.\r\n *\r\n * @param link - The email action link string.\r\n * @returns The {@link ActionCodeURL} object, or null if the link is invalid.\r\n *\r\n * @public\r\n */\r\n static parseLink(link) {\r\n const actionLink = parseDeepLink(link);\r\n try {\r\n return new ActionCodeURL(actionLink);\r\n }\r\n catch (_a) {\r\n return null;\r\n }\r\n }\r\n}\r\n/**\r\n * Parses the email action link string and returns an {@link ActionCodeURL} if\r\n * the link is valid, otherwise returns null.\r\n *\r\n * @public\r\n */\r\nfunction parseActionCodeURL(link) {\r\n return ActionCodeURL.parseLink(link);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for generating {@link EmailAuthCredential}.\r\n *\r\n * @public\r\n */\r\nclass EmailAuthProvider {\r\n constructor() {\r\n /**\r\n * Always set to {@link ProviderId}.PASSWORD, even for email link.\r\n */\r\n this.providerId = EmailAuthProvider.PROVIDER_ID;\r\n }\r\n /**\r\n * Initialize an {@link AuthCredential} using an email and password.\r\n *\r\n * @example\r\n * ```javascript\r\n * const authCredential = EmailAuthProvider.credential(email, password);\r\n * const userCredential = await signInWithCredential(auth, authCredential);\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * const userCredential = await signInWithEmailAndPassword(auth, email, password);\r\n * ```\r\n *\r\n * @param email - Email address.\r\n * @param password - User account password.\r\n * @returns The auth provider credential.\r\n */\r\n static credential(email, password) {\r\n return EmailAuthCredential._fromEmailAndPassword(email, password);\r\n }\r\n /**\r\n * Initialize an {@link AuthCredential} using an email and an email link after a sign in with\r\n * email link operation.\r\n *\r\n * @example\r\n * ```javascript\r\n * const authCredential = EmailAuthProvider.credentialWithLink(auth, email, emailLink);\r\n * const userCredential = await signInWithCredential(auth, authCredential);\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * await sendSignInLinkToEmail(auth, email);\r\n * // Obtain emailLink from user.\r\n * const userCredential = await signInWithEmailLink(auth, email, emailLink);\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance used to verify the link.\r\n * @param email - Email address.\r\n * @param emailLink - Sign-in email link.\r\n * @returns - The auth provider credential.\r\n */\r\n static credentialWithLink(email, emailLink) {\r\n const actionCodeUrl = ActionCodeURL.parseLink(emailLink);\r\n _assert(actionCodeUrl, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n return EmailAuthCredential._fromEmailAndCode(email, actionCodeUrl.code, actionCodeUrl.tenantId);\r\n }\r\n}\r\n/**\r\n * Always set to {@link ProviderId}.PASSWORD, even for email link.\r\n */\r\nEmailAuthProvider.PROVIDER_ID = \"password\" /* ProviderId.PASSWORD */;\r\n/**\r\n * Always set to {@link SignInMethod}.EMAIL_PASSWORD.\r\n */\r\nEmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD = \"password\" /* SignInMethod.EMAIL_PASSWORD */;\r\n/**\r\n * Always set to {@link SignInMethod}.EMAIL_LINK.\r\n */\r\nEmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD = \"emailLink\" /* SignInMethod.EMAIL_LINK */;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The base class for all Federated providers (OAuth (including OIDC), SAML).\r\n *\r\n * This class is not meant to be instantiated directly.\r\n *\r\n * @public\r\n */\r\nclass FederatedAuthProvider {\r\n /**\r\n * Constructor for generic OAuth providers.\r\n *\r\n * @param providerId - Provider for which credentials should be generated.\r\n */\r\n constructor(providerId) {\r\n this.providerId = providerId;\r\n /** @internal */\r\n this.defaultLanguageCode = null;\r\n /** @internal */\r\n this.customParameters = {};\r\n }\r\n /**\r\n * Set the language gode.\r\n *\r\n * @param languageCode - language code\r\n */\r\n setDefaultLanguage(languageCode) {\r\n this.defaultLanguageCode = languageCode;\r\n }\r\n /**\r\n * Sets the OAuth custom parameters to pass in an OAuth request for popup and redirect sign-in\r\n * operations.\r\n *\r\n * @remarks\r\n * For a detailed list, check the reserved required OAuth 2.0 parameters such as `client_id`,\r\n * `redirect_uri`, `scope`, `response_type`, and `state` are not allowed and will be ignored.\r\n *\r\n * @param customOAuthParameters - The custom OAuth parameters to pass in the OAuth request.\r\n */\r\n setCustomParameters(customOAuthParameters) {\r\n this.customParameters = customOAuthParameters;\r\n return this;\r\n }\r\n /**\r\n * Retrieve the current list of {@link CustomParameters}.\r\n */\r\n getCustomParameters() {\r\n return this.customParameters;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Common code to all OAuth providers. This is separate from the\r\n * {@link OAuthProvider} so that child providers (like\r\n * {@link GoogleAuthProvider}) don't inherit the `credential` instance method.\r\n * Instead, they rely on a static `credential` method.\r\n */\r\nclass BaseOAuthProvider extends FederatedAuthProvider {\r\n constructor() {\r\n super(...arguments);\r\n /** @internal */\r\n this.scopes = [];\r\n }\r\n /**\r\n * Add an OAuth scope to the credential.\r\n *\r\n * @param scope - Provider OAuth scope to add.\r\n */\r\n addScope(scope) {\r\n // If not already added, add scope to list.\r\n if (!this.scopes.includes(scope)) {\r\n this.scopes.push(scope);\r\n }\r\n return this;\r\n }\r\n /**\r\n * Retrieve the current list of OAuth scopes.\r\n */\r\n getScopes() {\r\n return [...this.scopes];\r\n }\r\n}\r\n/**\r\n * Provider for generating generic {@link OAuthCredential}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new OAuthProvider('google.com');\r\n * // Start a sign in process for an unauthenticated user.\r\n * provider.addScope('profile');\r\n * provider.addScope('email');\r\n * await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * if (result) {\r\n * // This is the signed-in user\r\n * const user = result.user;\r\n * // This gives you a OAuth Access Token for the provider.\r\n * const credential = provider.credentialFromResult(auth, result);\r\n * const token = credential.accessToken;\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a popup.\r\n * const provider = new OAuthProvider('google.com');\r\n * provider.addScope('profile');\r\n * provider.addScope('email');\r\n * const result = await signInWithPopup(auth, provider);\r\n *\r\n * // The signed-in user info.\r\n * const user = result.user;\r\n * // This gives you a OAuth Access Token for the provider.\r\n * const credential = provider.credentialFromResult(auth, result);\r\n * const token = credential.accessToken;\r\n * ```\r\n * @public\r\n */\r\nclass OAuthProvider extends BaseOAuthProvider {\r\n /**\r\n * Creates an {@link OAuthCredential} from a JSON string or a plain object.\r\n * @param json - A plain object or a JSON string\r\n */\r\n static credentialFromJSON(json) {\r\n const obj = typeof json === 'string' ? JSON.parse(json) : json;\r\n _assert('providerId' in obj && 'signInMethod' in obj, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n return OAuthCredential._fromParams(obj);\r\n }\r\n /**\r\n * Creates a {@link OAuthCredential} from a generic OAuth provider's access token or ID token.\r\n *\r\n * @remarks\r\n * The raw nonce is required when an ID token with a nonce field is provided. The SHA-256 hash of\r\n * the raw nonce must match the nonce field in the ID token.\r\n *\r\n * @example\r\n * ```javascript\r\n * // `googleUser` from the onsuccess Google Sign In callback.\r\n * // Initialize a generate OAuth provider with a `google.com` providerId.\r\n * const provider = new OAuthProvider('google.com');\r\n * const credential = provider.credential({\r\n * idToken: googleUser.getAuthResponse().id_token,\r\n * });\r\n * const result = await signInWithCredential(credential);\r\n * ```\r\n *\r\n * @param params - Either the options object containing the ID token, access token and raw nonce\r\n * or the ID token string.\r\n */\r\n credential(params) {\r\n return this._credential(Object.assign(Object.assign({}, params), { nonce: params.rawNonce }));\r\n }\r\n /** An internal credential method that accepts more permissive options */\r\n _credential(params) {\r\n _assert(params.idToken || params.accessToken, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n // For OAuthCredential, sign in method is same as providerId.\r\n return OAuthCredential._fromParams(Object.assign(Object.assign({}, params), { providerId: this.providerId, signInMethod: this.providerId }));\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromResult(userCredential) {\r\n return OAuthProvider.oauthCredentialFromTaggedObject(userCredential);\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\r\n * thrown during a sign-in, link, or reauthenticate operation.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromError(error) {\r\n return OAuthProvider.oauthCredentialFromTaggedObject((error.customData || {}));\r\n }\r\n static oauthCredentialFromTaggedObject({ _tokenResponse: tokenResponse }) {\r\n if (!tokenResponse) {\r\n return null;\r\n }\r\n const { oauthIdToken, oauthAccessToken, oauthTokenSecret, pendingToken, nonce, providerId } = tokenResponse;\r\n if (!oauthAccessToken &&\r\n !oauthTokenSecret &&\r\n !oauthIdToken &&\r\n !pendingToken) {\r\n return null;\r\n }\r\n if (!providerId) {\r\n return null;\r\n }\r\n try {\r\n return new OAuthProvider(providerId)._credential({\r\n idToken: oauthIdToken,\r\n accessToken: oauthAccessToken,\r\n nonce,\r\n pendingToken\r\n });\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.FACEBOOK.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new FacebookAuthProvider();\r\n * // Start a sign in process for an unauthenticated user.\r\n * provider.addScope('user_birthday');\r\n * await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * if (result) {\r\n * // This is the signed-in user\r\n * const user = result.user;\r\n * // This gives you a Facebook Access Token.\r\n * const credential = FacebookAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a popup.\r\n * const provider = new FacebookAuthProvider();\r\n * provider.addScope('user_birthday');\r\n * const result = await signInWithPopup(auth, provider);\r\n *\r\n * // The signed-in user info.\r\n * const user = result.user;\r\n * // This gives you a Facebook Access Token.\r\n * const credential = FacebookAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * ```\r\n *\r\n * @public\r\n */\r\nclass FacebookAuthProvider extends BaseOAuthProvider {\r\n constructor() {\r\n super(\"facebook.com\" /* ProviderId.FACEBOOK */);\r\n }\r\n /**\r\n * Creates a credential for Facebook.\r\n *\r\n * @example\r\n * ```javascript\r\n * // `event` from the Facebook auth.authResponseChange callback.\r\n * const credential = FacebookAuthProvider.credential(event.authResponse.accessToken);\r\n * const result = await signInWithCredential(credential);\r\n * ```\r\n *\r\n * @param accessToken - Facebook access token.\r\n */\r\n static credential(accessToken) {\r\n return OAuthCredential._fromParams({\r\n providerId: FacebookAuthProvider.PROVIDER_ID,\r\n signInMethod: FacebookAuthProvider.FACEBOOK_SIGN_IN_METHOD,\r\n accessToken\r\n });\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromResult(userCredential) {\r\n return FacebookAuthProvider.credentialFromTaggedObject(userCredential);\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\r\n * thrown during a sign-in, link, or reauthenticate operation.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromError(error) {\r\n return FacebookAuthProvider.credentialFromTaggedObject((error.customData || {}));\r\n }\r\n static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) {\r\n if (!tokenResponse || !('oauthAccessToken' in tokenResponse)) {\r\n return null;\r\n }\r\n if (!tokenResponse.oauthAccessToken) {\r\n return null;\r\n }\r\n try {\r\n return FacebookAuthProvider.credential(tokenResponse.oauthAccessToken);\r\n }\r\n catch (_a) {\r\n return null;\r\n }\r\n }\r\n}\r\n/** Always set to {@link SignInMethod}.FACEBOOK. */\r\nFacebookAuthProvider.FACEBOOK_SIGN_IN_METHOD = \"facebook.com\" /* SignInMethod.FACEBOOK */;\r\n/** Always set to {@link ProviderId}.FACEBOOK. */\r\nFacebookAuthProvider.PROVIDER_ID = \"facebook.com\" /* ProviderId.FACEBOOK */;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.GOOGLE.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new GoogleAuthProvider();\r\n * // Start a sign in process for an unauthenticated user.\r\n * provider.addScope('profile');\r\n * provider.addScope('email');\r\n * await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * if (result) {\r\n * // This is the signed-in user\r\n * const user = result.user;\r\n * // This gives you a Google Access Token.\r\n * const credential = GoogleAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a popup.\r\n * const provider = new GoogleAuthProvider();\r\n * provider.addScope('profile');\r\n * provider.addScope('email');\r\n * const result = await signInWithPopup(auth, provider);\r\n *\r\n * // The signed-in user info.\r\n * const user = result.user;\r\n * // This gives you a Google Access Token.\r\n * const credential = GoogleAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * ```\r\n *\r\n * @public\r\n */\r\nclass GoogleAuthProvider extends BaseOAuthProvider {\r\n constructor() {\r\n super(\"google.com\" /* ProviderId.GOOGLE */);\r\n this.addScope('profile');\r\n }\r\n /**\r\n * Creates a credential for Google. At least one of ID token and access token is required.\r\n *\r\n * @example\r\n * ```javascript\r\n * // \\`googleUser\\` from the onsuccess Google Sign In callback.\r\n * const credential = GoogleAuthProvider.credential(googleUser.getAuthResponse().id_token);\r\n * const result = await signInWithCredential(credential);\r\n * ```\r\n *\r\n * @param idToken - Google ID token.\r\n * @param accessToken - Google access token.\r\n */\r\n static credential(idToken, accessToken) {\r\n return OAuthCredential._fromParams({\r\n providerId: GoogleAuthProvider.PROVIDER_ID,\r\n signInMethod: GoogleAuthProvider.GOOGLE_SIGN_IN_METHOD,\r\n idToken,\r\n accessToken\r\n });\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromResult(userCredential) {\r\n return GoogleAuthProvider.credentialFromTaggedObject(userCredential);\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\r\n * thrown during a sign-in, link, or reauthenticate operation.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromError(error) {\r\n return GoogleAuthProvider.credentialFromTaggedObject((error.customData || {}));\r\n }\r\n static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) {\r\n if (!tokenResponse) {\r\n return null;\r\n }\r\n const { oauthIdToken, oauthAccessToken } = tokenResponse;\r\n if (!oauthIdToken && !oauthAccessToken) {\r\n // This could be an oauth 1 credential or a phone credential\r\n return null;\r\n }\r\n try {\r\n return GoogleAuthProvider.credential(oauthIdToken, oauthAccessToken);\r\n }\r\n catch (_a) {\r\n return null;\r\n }\r\n }\r\n}\r\n/** Always set to {@link SignInMethod}.GOOGLE. */\r\nGoogleAuthProvider.GOOGLE_SIGN_IN_METHOD = \"google.com\" /* SignInMethod.GOOGLE */;\r\n/** Always set to {@link ProviderId}.GOOGLE. */\r\nGoogleAuthProvider.PROVIDER_ID = \"google.com\" /* ProviderId.GOOGLE */;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.GITHUB.\r\n *\r\n * @remarks\r\n * GitHub requires an OAuth 2.0 redirect, so you can either handle the redirect directly, or use\r\n * the {@link signInWithPopup} handler:\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new GithubAuthProvider();\r\n * // Start a sign in process for an unauthenticated user.\r\n * provider.addScope('repo');\r\n * await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * if (result) {\r\n * // This is the signed-in user\r\n * const user = result.user;\r\n * // This gives you a GitHub Access Token.\r\n * const credential = GithubAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a popup.\r\n * const provider = new GithubAuthProvider();\r\n * provider.addScope('repo');\r\n * const result = await signInWithPopup(auth, provider);\r\n *\r\n * // The signed-in user info.\r\n * const user = result.user;\r\n * // This gives you a GitHub Access Token.\r\n * const credential = GithubAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * ```\r\n * @public\r\n */\r\nclass GithubAuthProvider extends BaseOAuthProvider {\r\n constructor() {\r\n super(\"github.com\" /* ProviderId.GITHUB */);\r\n }\r\n /**\r\n * Creates a credential for GitHub.\r\n *\r\n * @param accessToken - GitHub access token.\r\n */\r\n static credential(accessToken) {\r\n return OAuthCredential._fromParams({\r\n providerId: GithubAuthProvider.PROVIDER_ID,\r\n signInMethod: GithubAuthProvider.GITHUB_SIGN_IN_METHOD,\r\n accessToken\r\n });\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromResult(userCredential) {\r\n return GithubAuthProvider.credentialFromTaggedObject(userCredential);\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\r\n * thrown during a sign-in, link, or reauthenticate operation.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromError(error) {\r\n return GithubAuthProvider.credentialFromTaggedObject((error.customData || {}));\r\n }\r\n static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) {\r\n if (!tokenResponse || !('oauthAccessToken' in tokenResponse)) {\r\n return null;\r\n }\r\n if (!tokenResponse.oauthAccessToken) {\r\n return null;\r\n }\r\n try {\r\n return GithubAuthProvider.credential(tokenResponse.oauthAccessToken);\r\n }\r\n catch (_a) {\r\n return null;\r\n }\r\n }\r\n}\r\n/** Always set to {@link SignInMethod}.GITHUB. */\r\nGithubAuthProvider.GITHUB_SIGN_IN_METHOD = \"github.com\" /* SignInMethod.GITHUB */;\r\n/** Always set to {@link ProviderId}.GITHUB. */\r\nGithubAuthProvider.PROVIDER_ID = \"github.com\" /* ProviderId.GITHUB */;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst IDP_REQUEST_URI = 'http://localhost';\r\n/**\r\n * @public\r\n */\r\nclass SAMLAuthCredential extends AuthCredential {\r\n /** @internal */\r\n constructor(providerId, pendingToken) {\r\n super(providerId, providerId);\r\n this.pendingToken = pendingToken;\r\n }\r\n /** @internal */\r\n _getIdTokenResponse(auth) {\r\n const request = this.buildRequest();\r\n return signInWithIdp(auth, request);\r\n }\r\n /** @internal */\r\n _linkToIdToken(auth, idToken) {\r\n const request = this.buildRequest();\r\n request.idToken = idToken;\r\n return signInWithIdp(auth, request);\r\n }\r\n /** @internal */\r\n _getReauthenticationResolver(auth) {\r\n const request = this.buildRequest();\r\n request.autoCreate = false;\r\n return signInWithIdp(auth, request);\r\n }\r\n /** {@inheritdoc AuthCredential.toJSON} */\r\n toJSON() {\r\n return {\r\n signInMethod: this.signInMethod,\r\n providerId: this.providerId,\r\n pendingToken: this.pendingToken\r\n };\r\n }\r\n /**\r\n * Static method to deserialize a JSON representation of an object into an\r\n * {@link AuthCredential}.\r\n *\r\n * @param json - Input can be either Object or the stringified representation of the object.\r\n * When string is provided, JSON.parse would be called first.\r\n *\r\n * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned.\r\n */\r\n static fromJSON(json) {\r\n const obj = typeof json === 'string' ? JSON.parse(json) : json;\r\n const { providerId, signInMethod, pendingToken } = obj;\r\n if (!providerId ||\r\n !signInMethod ||\r\n !pendingToken ||\r\n providerId !== signInMethod) {\r\n return null;\r\n }\r\n return new SAMLAuthCredential(providerId, pendingToken);\r\n }\r\n /**\r\n * Helper static method to avoid exposing the constructor to end users.\r\n *\r\n * @internal\r\n */\r\n static _create(providerId, pendingToken) {\r\n return new SAMLAuthCredential(providerId, pendingToken);\r\n }\r\n buildRequest() {\r\n return {\r\n requestUri: IDP_REQUEST_URI,\r\n returnSecureToken: true,\r\n pendingToken: this.pendingToken\r\n };\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst SAML_PROVIDER_PREFIX = 'saml.';\r\n/**\r\n * An {@link AuthProvider} for SAML.\r\n *\r\n * @public\r\n */\r\nclass SAMLAuthProvider extends FederatedAuthProvider {\r\n /**\r\n * Constructor. The providerId must start with \"saml.\"\r\n * @param providerId - SAML provider ID.\r\n */\r\n constructor(providerId) {\r\n _assert(providerId.startsWith(SAML_PROVIDER_PREFIX), \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n super(providerId);\r\n }\r\n /**\r\n * Generates an {@link AuthCredential} from a {@link UserCredential} after a\r\n * successful SAML flow completes.\r\n *\r\n * @remarks\r\n *\r\n * For example, to get an {@link AuthCredential}, you could write the\r\n * following code:\r\n *\r\n * ```js\r\n * const userCredential = await signInWithPopup(auth, samlProvider);\r\n * const credential = SAMLAuthProvider.credentialFromResult(userCredential);\r\n * ```\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromResult(userCredential) {\r\n return SAMLAuthProvider.samlCredentialFromTaggedObject(userCredential);\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\r\n * thrown during a sign-in, link, or reauthenticate operation.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromError(error) {\r\n return SAMLAuthProvider.samlCredentialFromTaggedObject((error.customData || {}));\r\n }\r\n /**\r\n * Creates an {@link AuthCredential} from a JSON string or a plain object.\r\n * @param json - A plain object or a JSON string\r\n */\r\n static credentialFromJSON(json) {\r\n const credential = SAMLAuthCredential.fromJSON(json);\r\n _assert(credential, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n return credential;\r\n }\r\n static samlCredentialFromTaggedObject({ _tokenResponse: tokenResponse }) {\r\n if (!tokenResponse) {\r\n return null;\r\n }\r\n const { pendingToken, providerId } = tokenResponse;\r\n if (!pendingToken || !providerId) {\r\n return null;\r\n }\r\n try {\r\n return SAMLAuthCredential._create(providerId, pendingToken);\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.TWITTER.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new TwitterAuthProvider();\r\n * // Start a sign in process for an unauthenticated user.\r\n * await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * if (result) {\r\n * // This is the signed-in user\r\n * const user = result.user;\r\n * // This gives you a Twitter Access Token and Secret.\r\n * const credential = TwitterAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * const secret = credential.secret;\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a popup.\r\n * const provider = new TwitterAuthProvider();\r\n * const result = await signInWithPopup(auth, provider);\r\n *\r\n * // The signed-in user info.\r\n * const user = result.user;\r\n * // This gives you a Twitter Access Token and Secret.\r\n * const credential = TwitterAuthProvider.credentialFromResult(result);\r\n * const token = credential.accessToken;\r\n * const secret = credential.secret;\r\n * ```\r\n *\r\n * @public\r\n */\r\nclass TwitterAuthProvider extends BaseOAuthProvider {\r\n constructor() {\r\n super(\"twitter.com\" /* ProviderId.TWITTER */);\r\n }\r\n /**\r\n * Creates a credential for Twitter.\r\n *\r\n * @param token - Twitter access token.\r\n * @param secret - Twitter secret.\r\n */\r\n static credential(token, secret) {\r\n return OAuthCredential._fromParams({\r\n providerId: TwitterAuthProvider.PROVIDER_ID,\r\n signInMethod: TwitterAuthProvider.TWITTER_SIGN_IN_METHOD,\r\n oauthToken: token,\r\n oauthTokenSecret: secret\r\n });\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromResult(userCredential) {\r\n return TwitterAuthProvider.credentialFromTaggedObject(userCredential);\r\n }\r\n /**\r\n * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was\r\n * thrown during a sign-in, link, or reauthenticate operation.\r\n *\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromError(error) {\r\n return TwitterAuthProvider.credentialFromTaggedObject((error.customData || {}));\r\n }\r\n static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) {\r\n if (!tokenResponse) {\r\n return null;\r\n }\r\n const { oauthAccessToken, oauthTokenSecret } = tokenResponse;\r\n if (!oauthAccessToken || !oauthTokenSecret) {\r\n return null;\r\n }\r\n try {\r\n return TwitterAuthProvider.credential(oauthAccessToken, oauthTokenSecret);\r\n }\r\n catch (_a) {\r\n return null;\r\n }\r\n }\r\n}\r\n/** Always set to {@link SignInMethod}.TWITTER. */\r\nTwitterAuthProvider.TWITTER_SIGN_IN_METHOD = \"twitter.com\" /* SignInMethod.TWITTER */;\r\n/** Always set to {@link ProviderId}.TWITTER. */\r\nTwitterAuthProvider.PROVIDER_ID = \"twitter.com\" /* ProviderId.TWITTER */;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function signUp(auth, request) {\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signUp\" /* Endpoint.SIGN_UP */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass UserCredentialImpl {\r\n constructor(params) {\r\n this.user = params.user;\r\n this.providerId = params.providerId;\r\n this._tokenResponse = params._tokenResponse;\r\n this.operationType = params.operationType;\r\n }\r\n static async _fromIdTokenResponse(auth, operationType, idTokenResponse, isAnonymous = false) {\r\n const user = await UserImpl._fromIdTokenResponse(auth, idTokenResponse, isAnonymous);\r\n const providerId = providerIdForResponse(idTokenResponse);\r\n const userCred = new UserCredentialImpl({\r\n user,\r\n providerId,\r\n _tokenResponse: idTokenResponse,\r\n operationType\r\n });\r\n return userCred;\r\n }\r\n static async _forOperation(user, operationType, response) {\r\n await user._updateTokensIfNecessary(response, /* reload */ true);\r\n const providerId = providerIdForResponse(response);\r\n return new UserCredentialImpl({\r\n user,\r\n providerId,\r\n _tokenResponse: response,\r\n operationType\r\n });\r\n }\r\n}\r\nfunction providerIdForResponse(response) {\r\n if (response.providerId) {\r\n return response.providerId;\r\n }\r\n if ('phoneNumber' in response) {\r\n return \"phone\" /* ProviderId.PHONE */;\r\n }\r\n return null;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Asynchronously signs in as an anonymous user.\r\n *\r\n * @remarks\r\n * If there is already an anonymous user signed in, that user will be returned; otherwise, a\r\n * new anonymous user identity will be created and returned.\r\n *\r\n * This method is not supported by {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n *\r\n * @public\r\n */\r\nasync function signInAnonymously(auth) {\r\n var _a;\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const authInternal = _castAuth(auth);\r\n await authInternal._initializationPromise;\r\n if ((_a = authInternal.currentUser) === null || _a === void 0 ? void 0 : _a.isAnonymous) {\r\n // If an anonymous user is already signed in, no need to sign them in again.\r\n return new UserCredentialImpl({\r\n user: authInternal.currentUser,\r\n providerId: null,\r\n operationType: \"signIn\" /* OperationType.SIGN_IN */\r\n });\r\n }\r\n const response = await signUp(authInternal, {\r\n returnSecureToken: true\r\n });\r\n const userCredential = await UserCredentialImpl._fromIdTokenResponse(authInternal, \"signIn\" /* OperationType.SIGN_IN */, response, true);\r\n await authInternal._updateCurrentUser(userCredential.user);\r\n return userCredential;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass MultiFactorError extends FirebaseError {\r\n constructor(auth, error, operationType, user) {\r\n var _a;\r\n super(error.code, error.message);\r\n this.operationType = operationType;\r\n this.user = user;\r\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n Object.setPrototypeOf(this, MultiFactorError.prototype);\r\n this.customData = {\r\n appName: auth.name,\r\n tenantId: (_a = auth.tenantId) !== null && _a !== void 0 ? _a : undefined,\r\n _serverResponse: error.customData._serverResponse,\r\n operationType\r\n };\r\n }\r\n static _fromErrorAndOperation(auth, error, operationType, user) {\r\n return new MultiFactorError(auth, error, operationType, user);\r\n }\r\n}\r\nfunction _processCredentialSavingMfaContextIfNecessary(auth, operationType, credential, user) {\r\n const idTokenProvider = operationType === \"reauthenticate\" /* OperationType.REAUTHENTICATE */\r\n ? credential._getReauthenticationResolver(auth)\r\n : credential._getIdTokenResponse(auth);\r\n return idTokenProvider.catch(error => {\r\n if (error.code === `auth/${\"multi-factor-auth-required\" /* AuthErrorCode.MFA_REQUIRED */}`) {\r\n throw MultiFactorError._fromErrorAndOperation(auth, error, operationType, user);\r\n }\r\n throw error;\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Takes a set of UserInfo provider data and converts it to a set of names\r\n */\r\nfunction providerDataAsNames(providerData) {\r\n return new Set(providerData\r\n .map(({ providerId }) => providerId)\r\n .filter(pid => !!pid));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Unlinks a provider from a user account.\r\n *\r\n * @param user - The user.\r\n * @param providerId - The provider to unlink.\r\n *\r\n * @public\r\n */\r\nasync function unlink(user, providerId) {\r\n const userInternal = getModularInstance(user);\r\n await _assertLinkedStatus(true, userInternal, providerId);\r\n const { providerUserInfo } = await deleteLinkedAccounts(userInternal.auth, {\r\n idToken: await userInternal.getIdToken(),\r\n deleteProvider: [providerId]\r\n });\r\n const providersLeft = providerDataAsNames(providerUserInfo || []);\r\n userInternal.providerData = userInternal.providerData.filter(pd => providersLeft.has(pd.providerId));\r\n if (!providersLeft.has(\"phone\" /* ProviderId.PHONE */)) {\r\n userInternal.phoneNumber = null;\r\n }\r\n await userInternal.auth._persistUserIfCurrent(userInternal);\r\n return userInternal;\r\n}\r\nasync function _link$1(user, credential, bypassAuthState = false) {\r\n const response = await _logoutIfInvalidated(user, credential._linkToIdToken(user.auth, await user.getIdToken()), bypassAuthState);\r\n return UserCredentialImpl._forOperation(user, \"link\" /* OperationType.LINK */, response);\r\n}\r\nasync function _assertLinkedStatus(expected, user, provider) {\r\n await _reloadWithoutSaving(user);\r\n const providerIds = providerDataAsNames(user.providerData);\r\n const code = expected === false\r\n ? \"provider-already-linked\" /* AuthErrorCode.PROVIDER_ALREADY_LINKED */\r\n : \"no-such-provider\" /* AuthErrorCode.NO_SUCH_PROVIDER */;\r\n _assert(providerIds.has(provider) === expected, user.auth, code);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function _reauthenticate(user, credential, bypassAuthState = false) {\r\n const { auth } = user;\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const operationType = \"reauthenticate\" /* OperationType.REAUTHENTICATE */;\r\n try {\r\n const response = await _logoutIfInvalidated(user, _processCredentialSavingMfaContextIfNecessary(auth, operationType, credential, user), bypassAuthState);\r\n _assert(response.idToken, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const parsed = _parseToken(response.idToken);\r\n _assert(parsed, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const { sub: localId } = parsed;\r\n _assert(user.uid === localId, auth, \"user-mismatch\" /* AuthErrorCode.USER_MISMATCH */);\r\n return UserCredentialImpl._forOperation(user, operationType, response);\r\n }\r\n catch (e) {\r\n // Convert user deleted error into user mismatch\r\n if ((e === null || e === void 0 ? void 0 : e.code) === `auth/${\"user-not-found\" /* AuthErrorCode.USER_DELETED */}`) {\r\n _fail(auth, \"user-mismatch\" /* AuthErrorCode.USER_MISMATCH */);\r\n }\r\n throw e;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function _signInWithCredential(auth, credential, bypassAuthState = false) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const operationType = \"signIn\" /* OperationType.SIGN_IN */;\r\n const response = await _processCredentialSavingMfaContextIfNecessary(auth, operationType, credential);\r\n const userCredential = await UserCredentialImpl._fromIdTokenResponse(auth, operationType, response);\r\n if (!bypassAuthState) {\r\n await auth._updateCurrentUser(userCredential.user);\r\n }\r\n return userCredential;\r\n}\r\n/**\r\n * Asynchronously signs in with the given credentials.\r\n *\r\n * @remarks\r\n * An {@link AuthProvider} can be used to generate the credential.\r\n *\r\n * This method is not supported by {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param credential - The auth credential.\r\n *\r\n * @public\r\n */\r\nasync function signInWithCredential(auth, credential) {\r\n return _signInWithCredential(_castAuth(auth), credential);\r\n}\r\n/**\r\n * Links the user account with the given credentials.\r\n *\r\n * @remarks\r\n * An {@link AuthProvider} can be used to generate the credential.\r\n *\r\n * @param user - The user.\r\n * @param credential - The auth credential.\r\n *\r\n * @public\r\n */\r\nasync function linkWithCredential(user, credential) {\r\n const userInternal = getModularInstance(user);\r\n await _assertLinkedStatus(false, userInternal, credential.providerId);\r\n return _link$1(userInternal, credential);\r\n}\r\n/**\r\n * Re-authenticates a user using a fresh credential.\r\n *\r\n * @remarks\r\n * Use before operations such as {@link updatePassword} that require tokens from recent sign-in\r\n * attempts. This method can be used to recover from a `CREDENTIAL_TOO_OLD_LOGIN_AGAIN` error\r\n * or a `TOKEN_EXPIRED` error.\r\n *\r\n * This method is not supported on any {@link User} signed in by {@link Auth} instances\r\n * created with a {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @param user - The user.\r\n * @param credential - The auth credential.\r\n *\r\n * @public\r\n */\r\nasync function reauthenticateWithCredential(user, credential) {\r\n return _reauthenticate(getModularInstance(user), credential);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function signInWithCustomToken$1(auth, request) {\r\n return _performSignInRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:signInWithCustomToken\" /* Endpoint.SIGN_IN_WITH_CUSTOM_TOKEN */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Asynchronously signs in using a custom token.\r\n *\r\n * @remarks\r\n * Custom tokens are used to integrate Firebase Auth with existing auth systems, and must\r\n * be generated by an auth backend using the\r\n * {@link https://firebase.google.com/docs/reference/admin/node/admin.auth.Auth#createcustomtoken | createCustomToken}\r\n * method in the {@link https://firebase.google.com/docs/auth/admin | Admin SDK} .\r\n *\r\n * Fails with an error if the token is invalid, expired, or not accepted by the Firebase Auth service.\r\n *\r\n * This method is not supported by {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param customToken - The custom token to sign in with.\r\n *\r\n * @public\r\n */\r\nasync function signInWithCustomToken(auth, customToken) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const authInternal = _castAuth(auth);\r\n const response = await signInWithCustomToken$1(authInternal, {\r\n token: customToken,\r\n returnSecureToken: true\r\n });\r\n const cred = await UserCredentialImpl._fromIdTokenResponse(authInternal, \"signIn\" /* OperationType.SIGN_IN */, response);\r\n await authInternal._updateCurrentUser(cred.user);\r\n return cred;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass MultiFactorInfoImpl {\r\n constructor(factorId, response) {\r\n this.factorId = factorId;\r\n this.uid = response.mfaEnrollmentId;\r\n this.enrollmentTime = new Date(response.enrolledAt).toUTCString();\r\n this.displayName = response.displayName;\r\n }\r\n static _fromServerResponse(auth, enrollment) {\r\n if ('phoneInfo' in enrollment) {\r\n return PhoneMultiFactorInfoImpl._fromServerResponse(auth, enrollment);\r\n }\r\n else if ('totpInfo' in enrollment) {\r\n return TotpMultiFactorInfoImpl._fromServerResponse(auth, enrollment);\r\n }\r\n return _fail(auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }\r\n}\r\nclass PhoneMultiFactorInfoImpl extends MultiFactorInfoImpl {\r\n constructor(response) {\r\n super(\"phone\" /* FactorId.PHONE */, response);\r\n this.phoneNumber = response.phoneInfo;\r\n }\r\n static _fromServerResponse(_auth, enrollment) {\r\n return new PhoneMultiFactorInfoImpl(enrollment);\r\n }\r\n}\r\nclass TotpMultiFactorInfoImpl extends MultiFactorInfoImpl {\r\n constructor(response) {\r\n super(\"totp\" /* FactorId.TOTP */, response);\r\n }\r\n static _fromServerResponse(_auth, enrollment) {\r\n return new TotpMultiFactorInfoImpl(enrollment);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _setActionCodeSettingsOnRequest(auth, request, actionCodeSettings) {\r\n var _a;\r\n _assert(((_a = actionCodeSettings.url) === null || _a === void 0 ? void 0 : _a.length) > 0, auth, \"invalid-continue-uri\" /* AuthErrorCode.INVALID_CONTINUE_URI */);\r\n _assert(typeof actionCodeSettings.dynamicLinkDomain === 'undefined' ||\r\n actionCodeSettings.dynamicLinkDomain.length > 0, auth, \"invalid-dynamic-link-domain\" /* AuthErrorCode.INVALID_DYNAMIC_LINK_DOMAIN */);\r\n request.continueUrl = actionCodeSettings.url;\r\n request.dynamicLinkDomain = actionCodeSettings.dynamicLinkDomain;\r\n request.canHandleCodeInApp = actionCodeSettings.handleCodeInApp;\r\n if (actionCodeSettings.iOS) {\r\n _assert(actionCodeSettings.iOS.bundleId.length > 0, auth, \"missing-ios-bundle-id\" /* AuthErrorCode.MISSING_IOS_BUNDLE_ID */);\r\n request.iOSBundleId = actionCodeSettings.iOS.bundleId;\r\n }\r\n if (actionCodeSettings.android) {\r\n _assert(actionCodeSettings.android.packageName.length > 0, auth, \"missing-android-pkg-name\" /* AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME */);\r\n request.androidInstallApp = actionCodeSettings.android.installApp;\r\n request.androidMinimumVersionCode =\r\n actionCodeSettings.android.minimumVersion;\r\n request.androidPackageName = actionCodeSettings.android.packageName;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Updates the password policy cached in the {@link Auth} instance if a policy is already\r\n * cached for the project or tenant.\r\n *\r\n * @remarks\r\n * We only fetch the password policy if the password did not meet policy requirements and\r\n * there is an existing policy cached. A developer must call validatePassword at least\r\n * once for the cache to be automatically updated.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n *\r\n * @private\r\n */\r\nasync function recachePasswordPolicy(auth) {\r\n const authInternal = _castAuth(auth);\r\n if (authInternal._getPasswordPolicyInternal()) {\r\n await authInternal._updatePasswordPolicy();\r\n }\r\n}\r\n/**\r\n * Sends a password reset email to the given email address. This method does not throw an error when\r\n * there's no user account with the given email address and\r\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}\r\n * is enabled.\r\n *\r\n * @remarks\r\n * To complete the password reset, call {@link confirmPasswordReset} with the code supplied in\r\n * the email sent to the user, along with the new password specified by the user.\r\n *\r\n * @example\r\n * ```javascript\r\n * const actionCodeSettings = {\r\n * url: 'https://www.example.com/?email=user@example.com',\r\n * iOS: {\r\n * bundleId: 'com.example.ios'\r\n * },\r\n * android: {\r\n * packageName: 'com.example.android',\r\n * installApp: true,\r\n * minimumVersion: '12'\r\n * },\r\n * handleCodeInApp: true\r\n * };\r\n * await sendPasswordResetEmail(auth, 'user@example.com', actionCodeSettings);\r\n * // Obtain code from user.\r\n * await confirmPasswordReset('user@example.com', code);\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param email - The user's email address.\r\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\r\n *\r\n * @public\r\n */\r\nasync function sendPasswordResetEmail(auth, email, actionCodeSettings) {\r\n const authInternal = _castAuth(auth);\r\n const request = {\r\n requestType: \"PASSWORD_RESET\" /* ActionCodeOperation.PASSWORD_RESET */,\r\n email,\r\n clientType: \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */\r\n };\r\n if (actionCodeSettings) {\r\n _setActionCodeSettingsOnRequest(authInternal, request, actionCodeSettings);\r\n }\r\n await handleRecaptchaFlow(authInternal, request, \"getOobCode\" /* RecaptchaActionName.GET_OOB_CODE */, sendPasswordResetEmail$1);\r\n}\r\n/**\r\n * Completes the password reset process, given a confirmation code and new password.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param oobCode - A confirmation code sent to the user.\r\n * @param newPassword - The new password.\r\n *\r\n * @public\r\n */\r\nasync function confirmPasswordReset(auth, oobCode, newPassword) {\r\n await resetPassword(getModularInstance(auth), {\r\n oobCode,\r\n newPassword\r\n })\r\n .catch(async (error) => {\r\n if (error.code ===\r\n `auth/${\"password-does-not-meet-requirements\" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */}`) {\r\n void recachePasswordPolicy(auth);\r\n }\r\n throw error;\r\n });\r\n // Do not return the email.\r\n}\r\n/**\r\n * Applies a verification code sent to the user by email or other out-of-band mechanism.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param oobCode - A verification code sent to the user.\r\n *\r\n * @public\r\n */\r\nasync function applyActionCode(auth, oobCode) {\r\n await applyActionCode$1(getModularInstance(auth), { oobCode });\r\n}\r\n/**\r\n * Checks a verification code sent to the user by email or other out-of-band mechanism.\r\n *\r\n * @returns metadata about the code.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param oobCode - A verification code sent to the user.\r\n *\r\n * @public\r\n */\r\nasync function checkActionCode(auth, oobCode) {\r\n const authModular = getModularInstance(auth);\r\n const response = await resetPassword(authModular, { oobCode });\r\n // Email could be empty only if the request type is EMAIL_SIGNIN or\r\n // VERIFY_AND_CHANGE_EMAIL.\r\n // New email should not be empty if the request type is\r\n // VERIFY_AND_CHANGE_EMAIL.\r\n // Multi-factor info could not be empty if the request type is\r\n // REVERT_SECOND_FACTOR_ADDITION.\r\n const operation = response.requestType;\r\n _assert(operation, authModular, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n switch (operation) {\r\n case \"EMAIL_SIGNIN\" /* ActionCodeOperation.EMAIL_SIGNIN */:\r\n break;\r\n case \"VERIFY_AND_CHANGE_EMAIL\" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */:\r\n _assert(response.newEmail, authModular, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n break;\r\n case \"REVERT_SECOND_FACTOR_ADDITION\" /* ActionCodeOperation.REVERT_SECOND_FACTOR_ADDITION */:\r\n _assert(response.mfaInfo, authModular, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n // fall through\r\n default:\r\n _assert(response.email, authModular, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }\r\n // The multi-factor info for revert second factor addition\r\n let multiFactorInfo = null;\r\n if (response.mfaInfo) {\r\n multiFactorInfo = MultiFactorInfoImpl._fromServerResponse(_castAuth(authModular), response.mfaInfo);\r\n }\r\n return {\r\n data: {\r\n email: (response.requestType === \"VERIFY_AND_CHANGE_EMAIL\" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */\r\n ? response.newEmail\r\n : response.email) || null,\r\n previousEmail: (response.requestType === \"VERIFY_AND_CHANGE_EMAIL\" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */\r\n ? response.email\r\n : response.newEmail) || null,\r\n multiFactorInfo\r\n },\r\n operation\r\n };\r\n}\r\n/**\r\n * Checks a password reset code sent to the user by email or other out-of-band mechanism.\r\n *\r\n * @returns the user's email address if valid.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param code - A verification code sent to the user.\r\n *\r\n * @public\r\n */\r\nasync function verifyPasswordResetCode(auth, code) {\r\n const { data } = await checkActionCode(getModularInstance(auth), code);\r\n // Email should always be present since a code was sent to it\r\n return data.email;\r\n}\r\n/**\r\n * Creates a new user account associated with the specified email address and password.\r\n *\r\n * @remarks\r\n * On successful creation of the user account, this user will also be signed in to your application.\r\n *\r\n * User account creation can fail if the account already exists or the password is invalid.\r\n *\r\n * This method is not supported on {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * Note: The email address acts as a unique identifier for the user and enables an email-based\r\n * password reset. This function will create a new user account and set the initial user password.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param email - The user's email address.\r\n * @param password - The user's chosen password.\r\n *\r\n * @public\r\n */\r\nasync function createUserWithEmailAndPassword(auth, email, password) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const authInternal = _castAuth(auth);\r\n const request = {\r\n returnSecureToken: true,\r\n email,\r\n password,\r\n clientType: \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */\r\n };\r\n const signUpResponse = handleRecaptchaFlow(authInternal, request, \"signUpPassword\" /* RecaptchaActionName.SIGN_UP_PASSWORD */, signUp);\r\n const response = await signUpResponse.catch(error => {\r\n if (error.code === `auth/${\"password-does-not-meet-requirements\" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */}`) {\r\n void recachePasswordPolicy(auth);\r\n }\r\n throw error;\r\n });\r\n const userCredential = await UserCredentialImpl._fromIdTokenResponse(authInternal, \"signIn\" /* OperationType.SIGN_IN */, response);\r\n await authInternal._updateCurrentUser(userCredential.user);\r\n return userCredential;\r\n}\r\n/**\r\n * Asynchronously signs in using an email and password.\r\n *\r\n * @remarks\r\n * Fails with an error if the email address and password do not match. When\r\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}\r\n * is enabled, this method fails with \"auth/invalid-credential\" in case of an invalid\r\n * email/password.\r\n *\r\n * This method is not supported on {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * Note: The user's password is NOT the password used to access the user's email account. The\r\n * email address serves as a unique identifier for the user, and the password is used to access\r\n * the user's account in your Firebase project. See also: {@link createUserWithEmailAndPassword}.\r\n *\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param email - The users email address.\r\n * @param password - The users password.\r\n *\r\n * @public\r\n */\r\nfunction signInWithEmailAndPassword(auth, email, password) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n return signInWithCredential(getModularInstance(auth), EmailAuthProvider.credential(email, password)).catch(async (error) => {\r\n if (error.code === `auth/${\"password-does-not-meet-requirements\" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */}`) {\r\n void recachePasswordPolicy(auth);\r\n }\r\n throw error;\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Sends a sign-in email link to the user with the specified email.\r\n *\r\n * @remarks\r\n * The sign-in operation has to always be completed in the app unlike other out of band email\r\n * actions (password reset and email verifications). This is because, at the end of the flow,\r\n * the user is expected to be signed in and their Auth state persisted within the app.\r\n *\r\n * To complete sign in with the email link, call {@link signInWithEmailLink} with the email\r\n * address and the email link supplied in the email sent to the user.\r\n *\r\n * @example\r\n * ```javascript\r\n * const actionCodeSettings = {\r\n * url: 'https://www.example.com/?email=user@example.com',\r\n * iOS: {\r\n * bundleId: 'com.example.ios'\r\n * },\r\n * android: {\r\n * packageName: 'com.example.android',\r\n * installApp: true,\r\n * minimumVersion: '12'\r\n * },\r\n * handleCodeInApp: true\r\n * };\r\n * await sendSignInLinkToEmail(auth, 'user@example.com', actionCodeSettings);\r\n * // Obtain emailLink from the user.\r\n * if(isSignInWithEmailLink(auth, emailLink)) {\r\n * await signInWithEmailLink(auth, 'user@example.com', emailLink);\r\n * }\r\n * ```\r\n *\r\n * @param authInternal - The {@link Auth} instance.\r\n * @param email - The user's email address.\r\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\r\n *\r\n * @public\r\n */\r\nasync function sendSignInLinkToEmail(auth, email, actionCodeSettings) {\r\n const authInternal = _castAuth(auth);\r\n const request = {\r\n requestType: \"EMAIL_SIGNIN\" /* ActionCodeOperation.EMAIL_SIGNIN */,\r\n email,\r\n clientType: \"CLIENT_TYPE_WEB\" /* RecaptchaClientType.WEB */\r\n };\r\n function setActionCodeSettings(request, actionCodeSettings) {\r\n _assert(actionCodeSettings.handleCodeInApp, authInternal, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n if (actionCodeSettings) {\r\n _setActionCodeSettingsOnRequest(authInternal, request, actionCodeSettings);\r\n }\r\n }\r\n setActionCodeSettings(request, actionCodeSettings);\r\n await handleRecaptchaFlow(authInternal, request, \"getOobCode\" /* RecaptchaActionName.GET_OOB_CODE */, sendSignInLinkToEmail$1);\r\n}\r\n/**\r\n * Checks if an incoming link is a sign-in with email link suitable for {@link signInWithEmailLink}.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param emailLink - The link sent to the user's email address.\r\n *\r\n * @public\r\n */\r\nfunction isSignInWithEmailLink(auth, emailLink) {\r\n const actionCodeUrl = ActionCodeURL.parseLink(emailLink);\r\n return (actionCodeUrl === null || actionCodeUrl === void 0 ? void 0 : actionCodeUrl.operation) === \"EMAIL_SIGNIN\" /* ActionCodeOperation.EMAIL_SIGNIN */;\r\n}\r\n/**\r\n * Asynchronously signs in using an email and sign-in email link.\r\n *\r\n * @remarks\r\n * If no link is passed, the link is inferred from the current URL.\r\n *\r\n * Fails with an error if the email address is invalid or OTP in email link expires.\r\n *\r\n * This method is not supported by {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * Note: Confirm the link is a sign-in email link before calling this method firebase.auth.Auth.isSignInWithEmailLink.\r\n *\r\n * @example\r\n * ```javascript\r\n * const actionCodeSettings = {\r\n * url: 'https://www.example.com/?email=user@example.com',\r\n * iOS: {\r\n * bundleId: 'com.example.ios'\r\n * },\r\n * android: {\r\n * packageName: 'com.example.android',\r\n * installApp: true,\r\n * minimumVersion: '12'\r\n * },\r\n * handleCodeInApp: true\r\n * };\r\n * await sendSignInLinkToEmail(auth, 'user@example.com', actionCodeSettings);\r\n * // Obtain emailLink from the user.\r\n * if(isSignInWithEmailLink(auth, emailLink)) {\r\n * await signInWithEmailLink(auth, 'user@example.com', emailLink);\r\n * }\r\n * ```\r\n *\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param email - The user's email address.\r\n * @param emailLink - The link sent to the user's email address.\r\n *\r\n * @public\r\n */\r\nasync function signInWithEmailLink(auth, email, emailLink) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const authModular = getModularInstance(auth);\r\n const credential = EmailAuthProvider.credentialWithLink(email, emailLink || _getCurrentUrl());\r\n // Check if the tenant ID in the email link matches the tenant ID on Auth\r\n // instance.\r\n _assert(credential._tenantId === (authModular.tenantId || null), authModular, \"tenant-id-mismatch\" /* AuthErrorCode.TENANT_ID_MISMATCH */);\r\n return signInWithCredential(authModular, credential);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function createAuthUri(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:createAuthUri\" /* Endpoint.CREATE_AUTH_URI */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Gets the list of possible sign in methods for the given email address. This method returns an\r\n * empty list when\r\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}\r\n * is enabled, irrespective of the number of authentication methods available for the given email.\r\n *\r\n * @remarks\r\n * This is useful to differentiate methods of sign-in for the same provider, eg.\r\n * {@link EmailAuthProvider} which has 2 methods of sign-in,\r\n * {@link SignInMethod}.EMAIL_PASSWORD and\r\n * {@link SignInMethod}.EMAIL_LINK.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param email - The user's email address.\r\n *\r\n * Deprecated. Migrating off of this method is recommended as a security best-practice.\r\n * Learn more in the Identity Platform documentation for\r\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}.\r\n * @public\r\n */\r\nasync function fetchSignInMethodsForEmail(auth, email) {\r\n // createAuthUri returns an error if continue URI is not http or https.\r\n // For environments like Cordova, Chrome extensions, native frameworks, file\r\n // systems, etc, use http://localhost as continue URL.\r\n const continueUri = _isHttpOrHttps() ? _getCurrentUrl() : 'http://localhost';\r\n const request = {\r\n identifier: email,\r\n continueUri\r\n };\r\n const { signinMethods } = await createAuthUri(getModularInstance(auth), request);\r\n return signinMethods || [];\r\n}\r\n/**\r\n * Sends a verification email to a user.\r\n *\r\n * @remarks\r\n * The verification process is completed by calling {@link applyActionCode}.\r\n *\r\n * @example\r\n * ```javascript\r\n * const actionCodeSettings = {\r\n * url: 'https://www.example.com/?email=user@example.com',\r\n * iOS: {\r\n * bundleId: 'com.example.ios'\r\n * },\r\n * android: {\r\n * packageName: 'com.example.android',\r\n * installApp: true,\r\n * minimumVersion: '12'\r\n * },\r\n * handleCodeInApp: true\r\n * };\r\n * await sendEmailVerification(user, actionCodeSettings);\r\n * // Obtain code from the user.\r\n * await applyActionCode(auth, code);\r\n * ```\r\n *\r\n * @param user - The user.\r\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\r\n *\r\n * @public\r\n */\r\nasync function sendEmailVerification(user, actionCodeSettings) {\r\n const userInternal = getModularInstance(user);\r\n const idToken = await user.getIdToken();\r\n const request = {\r\n requestType: \"VERIFY_EMAIL\" /* ActionCodeOperation.VERIFY_EMAIL */,\r\n idToken\r\n };\r\n if (actionCodeSettings) {\r\n _setActionCodeSettingsOnRequest(userInternal.auth, request, actionCodeSettings);\r\n }\r\n const { email } = await sendEmailVerification$1(userInternal.auth, request);\r\n if (email !== user.email) {\r\n await user.reload();\r\n }\r\n}\r\n/**\r\n * Sends a verification email to a new email address.\r\n *\r\n * @remarks\r\n * The user's email will be updated to the new one after being verified.\r\n *\r\n * If you have a custom email action handler, you can complete the verification process by calling\r\n * {@link applyActionCode}.\r\n *\r\n * @example\r\n * ```javascript\r\n * const actionCodeSettings = {\r\n * url: 'https://www.example.com/?email=user@example.com',\r\n * iOS: {\r\n * bundleId: 'com.example.ios'\r\n * },\r\n * android: {\r\n * packageName: 'com.example.android',\r\n * installApp: true,\r\n * minimumVersion: '12'\r\n * },\r\n * handleCodeInApp: true\r\n * };\r\n * await verifyBeforeUpdateEmail(user, 'newemail@example.com', actionCodeSettings);\r\n * // Obtain code from the user.\r\n * await applyActionCode(auth, code);\r\n * ```\r\n *\r\n * @param user - The user.\r\n * @param newEmail - The new email address to be verified before update.\r\n * @param actionCodeSettings - The {@link ActionCodeSettings}.\r\n *\r\n * @public\r\n */\r\nasync function verifyBeforeUpdateEmail(user, newEmail, actionCodeSettings) {\r\n const userInternal = getModularInstance(user);\r\n const idToken = await user.getIdToken();\r\n const request = {\r\n requestType: \"VERIFY_AND_CHANGE_EMAIL\" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */,\r\n idToken,\r\n newEmail\r\n };\r\n if (actionCodeSettings) {\r\n _setActionCodeSettingsOnRequest(userInternal.auth, request, actionCodeSettings);\r\n }\r\n const { email } = await verifyAndChangeEmail(userInternal.auth, request);\r\n if (email !== user.email) {\r\n // If the local copy of the email on user is outdated, reload the\r\n // user.\r\n await user.reload();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function updateProfile$1(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v1/accounts:update\" /* Endpoint.SET_ACCOUNT_INFO */, request);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Updates a user's profile data.\r\n *\r\n * @param user - The user.\r\n * @param profile - The profile's `displayName` and `photoURL` to update.\r\n *\r\n * @public\r\n */\r\nasync function updateProfile(user, { displayName, photoURL: photoUrl }) {\r\n if (displayName === undefined && photoUrl === undefined) {\r\n return;\r\n }\r\n const userInternal = getModularInstance(user);\r\n const idToken = await userInternal.getIdToken();\r\n const profileRequest = {\r\n idToken,\r\n displayName,\r\n photoUrl,\r\n returnSecureToken: true\r\n };\r\n const response = await _logoutIfInvalidated(userInternal, updateProfile$1(userInternal.auth, profileRequest));\r\n userInternal.displayName = response.displayName || null;\r\n userInternal.photoURL = response.photoUrl || null;\r\n // Update the password provider as well\r\n const passwordProvider = userInternal.providerData.find(({ providerId }) => providerId === \"password\" /* ProviderId.PASSWORD */);\r\n if (passwordProvider) {\r\n passwordProvider.displayName = userInternal.displayName;\r\n passwordProvider.photoURL = userInternal.photoURL;\r\n }\r\n await userInternal._updateTokensIfNecessary(response);\r\n}\r\n/**\r\n * Updates the user's email address.\r\n *\r\n * @remarks\r\n * An email will be sent to the original email address (if it was set) that allows to revoke the\r\n * email address change, in order to protect them from account hijacking.\r\n *\r\n * This method is not supported on any {@link User} signed in by {@link Auth} instances\r\n * created with a {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * Important: this is a security sensitive operation that requires the user to have recently signed\r\n * in. If this requirement isn't met, ask the user to authenticate again and then call\r\n * {@link reauthenticateWithCredential}.\r\n *\r\n * @param user - The user.\r\n * @param newEmail - The new email address.\r\n *\r\n * Throws \"auth/operation-not-allowed\" error when\r\n * {@link https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection | Email Enumeration Protection}\r\n * is enabled.\r\n * Deprecated - Use {@link verifyBeforeUpdateEmail} instead.\r\n *\r\n * @public\r\n */\r\nfunction updateEmail(user, newEmail) {\r\n const userInternal = getModularInstance(user);\r\n if (_isFirebaseServerApp(userInternal.auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(userInternal.auth));\r\n }\r\n return updateEmailOrPassword(userInternal, newEmail, null);\r\n}\r\n/**\r\n * Updates the user's password.\r\n *\r\n * @remarks\r\n * Important: this is a security sensitive operation that requires the user to have recently signed\r\n * in. If this requirement isn't met, ask the user to authenticate again and then call\r\n * {@link reauthenticateWithCredential}.\r\n *\r\n * @param user - The user.\r\n * @param newPassword - The new password.\r\n *\r\n * @public\r\n */\r\nfunction updatePassword(user, newPassword) {\r\n return updateEmailOrPassword(getModularInstance(user), null, newPassword);\r\n}\r\nasync function updateEmailOrPassword(user, email, password) {\r\n const { auth } = user;\r\n const idToken = await user.getIdToken();\r\n const request = {\r\n idToken,\r\n returnSecureToken: true\r\n };\r\n if (email) {\r\n request.email = email;\r\n }\r\n if (password) {\r\n request.password = password;\r\n }\r\n const response = await _logoutIfInvalidated(user, updateEmailPassword(auth, request));\r\n await user._updateTokensIfNecessary(response, /* reload */ true);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Parse the `AdditionalUserInfo` from the ID token response.\r\n *\r\n */\r\nfunction _fromIdTokenResponse(idTokenResponse) {\r\n var _a, _b;\r\n if (!idTokenResponse) {\r\n return null;\r\n }\r\n const { providerId } = idTokenResponse;\r\n const profile = idTokenResponse.rawUserInfo\r\n ? JSON.parse(idTokenResponse.rawUserInfo)\r\n : {};\r\n const isNewUser = idTokenResponse.isNewUser ||\r\n idTokenResponse.kind === \"identitytoolkit#SignupNewUserResponse\" /* IdTokenResponseKind.SignupNewUser */;\r\n if (!providerId && (idTokenResponse === null || idTokenResponse === void 0 ? void 0 : idTokenResponse.idToken)) {\r\n const signInProvider = (_b = (_a = _parseToken(idTokenResponse.idToken)) === null || _a === void 0 ? void 0 : _a.firebase) === null || _b === void 0 ? void 0 : _b['sign_in_provider'];\r\n if (signInProvider) {\r\n const filteredProviderId = signInProvider !== \"anonymous\" /* ProviderId.ANONYMOUS */ &&\r\n signInProvider !== \"custom\" /* ProviderId.CUSTOM */\r\n ? signInProvider\r\n : null;\r\n // Uses generic class in accordance with the legacy SDK.\r\n return new GenericAdditionalUserInfo(isNewUser, filteredProviderId);\r\n }\r\n }\r\n if (!providerId) {\r\n return null;\r\n }\r\n switch (providerId) {\r\n case \"facebook.com\" /* ProviderId.FACEBOOK */:\r\n return new FacebookAdditionalUserInfo(isNewUser, profile);\r\n case \"github.com\" /* ProviderId.GITHUB */:\r\n return new GithubAdditionalUserInfo(isNewUser, profile);\r\n case \"google.com\" /* ProviderId.GOOGLE */:\r\n return new GoogleAdditionalUserInfo(isNewUser, profile);\r\n case \"twitter.com\" /* ProviderId.TWITTER */:\r\n return new TwitterAdditionalUserInfo(isNewUser, profile, idTokenResponse.screenName || null);\r\n case \"custom\" /* ProviderId.CUSTOM */:\r\n case \"anonymous\" /* ProviderId.ANONYMOUS */:\r\n return new GenericAdditionalUserInfo(isNewUser, null);\r\n default:\r\n return new GenericAdditionalUserInfo(isNewUser, providerId, profile);\r\n }\r\n}\r\nclass GenericAdditionalUserInfo {\r\n constructor(isNewUser, providerId, profile = {}) {\r\n this.isNewUser = isNewUser;\r\n this.providerId = providerId;\r\n this.profile = profile;\r\n }\r\n}\r\nclass FederatedAdditionalUserInfoWithUsername extends GenericAdditionalUserInfo {\r\n constructor(isNewUser, providerId, profile, username) {\r\n super(isNewUser, providerId, profile);\r\n this.username = username;\r\n }\r\n}\r\nclass FacebookAdditionalUserInfo extends GenericAdditionalUserInfo {\r\n constructor(isNewUser, profile) {\r\n super(isNewUser, \"facebook.com\" /* ProviderId.FACEBOOK */, profile);\r\n }\r\n}\r\nclass GithubAdditionalUserInfo extends FederatedAdditionalUserInfoWithUsername {\r\n constructor(isNewUser, profile) {\r\n super(isNewUser, \"github.com\" /* ProviderId.GITHUB */, profile, typeof (profile === null || profile === void 0 ? void 0 : profile.login) === 'string' ? profile === null || profile === void 0 ? void 0 : profile.login : null);\r\n }\r\n}\r\nclass GoogleAdditionalUserInfo extends GenericAdditionalUserInfo {\r\n constructor(isNewUser, profile) {\r\n super(isNewUser, \"google.com\" /* ProviderId.GOOGLE */, profile);\r\n }\r\n}\r\nclass TwitterAdditionalUserInfo extends FederatedAdditionalUserInfoWithUsername {\r\n constructor(isNewUser, profile, screenName) {\r\n super(isNewUser, \"twitter.com\" /* ProviderId.TWITTER */, profile, screenName);\r\n }\r\n}\r\n/**\r\n * Extracts provider specific {@link AdditionalUserInfo} for the given credential.\r\n *\r\n * @param userCredential - The user credential.\r\n *\r\n * @public\r\n */\r\nfunction getAdditionalUserInfo(userCredential) {\r\n const { user, _tokenResponse } = userCredential;\r\n if (user.isAnonymous && !_tokenResponse) {\r\n // Handle the special case where signInAnonymously() gets called twice.\r\n // No network call is made so there's nothing to actually fill this in\r\n return {\r\n providerId: null,\r\n isNewUser: false,\r\n profile: null\r\n };\r\n }\r\n return _fromIdTokenResponse(_tokenResponse);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Non-optional auth methods.\r\n/**\r\n * Changes the type of persistence on the {@link Auth} instance for the currently saved\r\n * `Auth` session and applies this type of persistence for future sign-in requests, including\r\n * sign-in with redirect requests.\r\n *\r\n * @remarks\r\n * This makes it easy for a user signing in to specify whether their session should be\r\n * remembered or not. It also makes it easier to never persist the `Auth` state for applications\r\n * that are shared by other users or have sensitive data.\r\n *\r\n * This method does not work in a Node.js environment or with {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * setPersistence(auth, browserSessionPersistence);\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param persistence - The {@link Persistence} to use.\r\n * @returns A `Promise` that resolves once the persistence change has completed\r\n *\r\n * @public\r\n */\r\nfunction setPersistence(auth, persistence) {\r\n return getModularInstance(auth).setPersistence(persistence);\r\n}\r\n/**\r\n * Loads the reCAPTCHA configuration into the `Auth` instance.\r\n *\r\n * @remarks\r\n * This will load the reCAPTCHA config, which indicates whether the reCAPTCHA\r\n * verification flow should be triggered for each auth provider, into the\r\n * current Auth session.\r\n *\r\n * If initializeRecaptchaConfig() is not invoked, the auth flow will always start\r\n * without reCAPTCHA verification. If the provider is configured to require reCAPTCHA\r\n * verification, the SDK will transparently load the reCAPTCHA config and restart the\r\n * auth flows.\r\n *\r\n * Thus, by calling this optional method, you will reduce the latency of future auth flows.\r\n * Loading the reCAPTCHA config early will also enhance the signal collected by reCAPTCHA.\r\n *\r\n * This method does not work in a Node.js environment.\r\n *\r\n * @example\r\n * ```javascript\r\n * initializeRecaptchaConfig(auth);\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n *\r\n * @public\r\n */\r\nfunction initializeRecaptchaConfig(auth) {\r\n return _initializeRecaptchaConfig(auth);\r\n}\r\n/**\r\n * Validates the password against the password policy configured for the project or tenant.\r\n *\r\n * @remarks\r\n * If no tenant ID is set on the `Auth` instance, then this method will use the password\r\n * policy configured for the project. Otherwise, this method will use the policy configured\r\n * for the tenant. If a password policy has not been configured, then the default policy\r\n * configured for all projects will be used.\r\n *\r\n * If an auth flow fails because a submitted password does not meet the password policy\r\n * requirements and this method has previously been called, then this method will use the\r\n * most recent policy available when called again.\r\n *\r\n * @example\r\n * ```javascript\r\n * validatePassword(auth, 'some-password');\r\n * ```\r\n *\r\n * @param auth The {@link Auth} instance.\r\n * @param password The password to validate.\r\n *\r\n * @public\r\n */\r\nasync function validatePassword(auth, password) {\r\n const authInternal = _castAuth(auth);\r\n return authInternal.validatePassword(password);\r\n}\r\n/**\r\n * Adds an observer for changes to the signed-in user's ID token.\r\n *\r\n * @remarks\r\n * This includes sign-in, sign-out, and token refresh events.\r\n * This will not be triggered automatically upon ID token expiration. Use {@link User.getIdToken} to refresh the ID token.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param nextOrObserver - callback triggered on change.\r\n * @param error - Deprecated. This callback is never triggered. Errors\r\n * on signing in/out can be caught in promises returned from\r\n * sign-in/sign-out functions.\r\n * @param completed - Deprecated. This callback is never triggered.\r\n *\r\n * @public\r\n */\r\nfunction onIdTokenChanged(auth, nextOrObserver, error, completed) {\r\n return getModularInstance(auth).onIdTokenChanged(nextOrObserver, error, completed);\r\n}\r\n/**\r\n * Adds a blocking callback that runs before an auth state change\r\n * sets a new user.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param callback - callback triggered before new user value is set.\r\n * If this throws, it blocks the user from being set.\r\n * @param onAbort - callback triggered if a later `beforeAuthStateChanged()`\r\n * callback throws, allowing you to undo any side effects.\r\n */\r\nfunction beforeAuthStateChanged(auth, callback, onAbort) {\r\n return getModularInstance(auth).beforeAuthStateChanged(callback, onAbort);\r\n}\r\n/**\r\n * Adds an observer for changes to the user's sign-in state.\r\n *\r\n * @remarks\r\n * To keep the old behavior, see {@link onIdTokenChanged}.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param nextOrObserver - callback triggered on change.\r\n * @param error - Deprecated. This callback is never triggered. Errors\r\n * on signing in/out can be caught in promises returned from\r\n * sign-in/sign-out functions.\r\n * @param completed - Deprecated. This callback is never triggered.\r\n *\r\n * @public\r\n */\r\nfunction onAuthStateChanged(auth, nextOrObserver, error, completed) {\r\n return getModularInstance(auth).onAuthStateChanged(nextOrObserver, error, completed);\r\n}\r\n/**\r\n * Sets the current language to the default device/browser preference.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n *\r\n * @public\r\n */\r\nfunction useDeviceLanguage(auth) {\r\n getModularInstance(auth).useDeviceLanguage();\r\n}\r\n/**\r\n * Asynchronously sets the provided user as {@link Auth.currentUser} on the\r\n * {@link Auth} instance.\r\n *\r\n * @remarks\r\n * A new instance copy of the user provided will be made and set as currentUser.\r\n *\r\n * This will trigger {@link onAuthStateChanged} and {@link onIdTokenChanged} listeners\r\n * like other sign in methods.\r\n *\r\n * The operation fails with an error if the user to be updated belongs to a different Firebase\r\n * project.\r\n *\r\n * This method is not supported by {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param user - The new {@link User}.\r\n *\r\n * @public\r\n */\r\nfunction updateCurrentUser(auth, user) {\r\n return getModularInstance(auth).updateCurrentUser(user);\r\n}\r\n/**\r\n * Signs out the current user.\r\n *\r\n * @remarks\r\n * This method is not supported by {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n *\r\n * @public\r\n */\r\nfunction signOut(auth) {\r\n return getModularInstance(auth).signOut();\r\n}\r\n/**\r\n * Revokes the given access token. Currently only supports Apple OAuth access tokens.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param token - The Apple OAuth access token.\r\n *\r\n * @public\r\n */\r\nfunction revokeAccessToken(auth, token) {\r\n const authInternal = _castAuth(auth);\r\n return authInternal.revokeAccessToken(token);\r\n}\r\n/**\r\n * Deletes and signs out the user.\r\n *\r\n * @remarks\r\n * Important: this is a security-sensitive operation that requires the user to have recently\r\n * signed in. If this requirement isn't met, ask the user to authenticate again and then call\r\n * {@link reauthenticateWithCredential}.\r\n *\r\n * @param user - The user.\r\n *\r\n * @public\r\n */\r\nasync function deleteUser(user) {\r\n return getModularInstance(user).delete();\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass MultiFactorSessionImpl {\r\n constructor(type, credential, user) {\r\n this.type = type;\r\n this.credential = credential;\r\n this.user = user;\r\n }\r\n static _fromIdtoken(idToken, user) {\r\n return new MultiFactorSessionImpl(\"enroll\" /* MultiFactorSessionType.ENROLL */, idToken, user);\r\n }\r\n static _fromMfaPendingCredential(mfaPendingCredential) {\r\n return new MultiFactorSessionImpl(\"signin\" /* MultiFactorSessionType.SIGN_IN */, mfaPendingCredential);\r\n }\r\n toJSON() {\r\n const key = this.type === \"enroll\" /* MultiFactorSessionType.ENROLL */\r\n ? 'idToken'\r\n : 'pendingCredential';\r\n return {\r\n multiFactorSession: {\r\n [key]: this.credential\r\n }\r\n };\r\n }\r\n static fromJSON(obj) {\r\n var _a, _b;\r\n if (obj === null || obj === void 0 ? void 0 : obj.multiFactorSession) {\r\n if ((_a = obj.multiFactorSession) === null || _a === void 0 ? void 0 : _a.pendingCredential) {\r\n return MultiFactorSessionImpl._fromMfaPendingCredential(obj.multiFactorSession.pendingCredential);\r\n }\r\n else if ((_b = obj.multiFactorSession) === null || _b === void 0 ? void 0 : _b.idToken) {\r\n return MultiFactorSessionImpl._fromIdtoken(obj.multiFactorSession.idToken);\r\n }\r\n }\r\n return null;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass MultiFactorResolverImpl {\r\n constructor(session, hints, signInResolver) {\r\n this.session = session;\r\n this.hints = hints;\r\n this.signInResolver = signInResolver;\r\n }\r\n /** @internal */\r\n static _fromError(authExtern, error) {\r\n const auth = _castAuth(authExtern);\r\n const serverResponse = error.customData._serverResponse;\r\n const hints = (serverResponse.mfaInfo || []).map(enrollment => MultiFactorInfoImpl._fromServerResponse(auth, enrollment));\r\n _assert(serverResponse.mfaPendingCredential, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const session = MultiFactorSessionImpl._fromMfaPendingCredential(serverResponse.mfaPendingCredential);\r\n return new MultiFactorResolverImpl(session, hints, async (assertion) => {\r\n const mfaResponse = await assertion._process(auth, session);\r\n // Clear out the unneeded fields from the old login response\r\n delete serverResponse.mfaInfo;\r\n delete serverResponse.mfaPendingCredential;\r\n // Use in the new token & refresh token in the old response\r\n const idTokenResponse = Object.assign(Object.assign({}, serverResponse), { idToken: mfaResponse.idToken, refreshToken: mfaResponse.refreshToken });\r\n // TODO: we should collapse this switch statement into UserCredentialImpl._forOperation and have it support the SIGN_IN case\r\n switch (error.operationType) {\r\n case \"signIn\" /* OperationType.SIGN_IN */:\r\n const userCredential = await UserCredentialImpl._fromIdTokenResponse(auth, error.operationType, idTokenResponse);\r\n await auth._updateCurrentUser(userCredential.user);\r\n return userCredential;\r\n case \"reauthenticate\" /* OperationType.REAUTHENTICATE */:\r\n _assert(error.user, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return UserCredentialImpl._forOperation(error.user, error.operationType, idTokenResponse);\r\n default:\r\n _fail(auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }\r\n });\r\n }\r\n async resolveSignIn(assertionExtern) {\r\n const assertion = assertionExtern;\r\n return this.signInResolver(assertion);\r\n }\r\n}\r\n/**\r\n * Provides a {@link MultiFactorResolver} suitable for completion of a\r\n * multi-factor flow.\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param error - The {@link MultiFactorError} raised during a sign-in, or\r\n * reauthentication operation.\r\n *\r\n * @public\r\n */\r\nfunction getMultiFactorResolver(auth, error) {\r\n var _a;\r\n const authModular = getModularInstance(auth);\r\n const errorInternal = error;\r\n _assert(error.customData.operationType, authModular, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n _assert((_a = errorInternal.customData._serverResponse) === null || _a === void 0 ? void 0 : _a.mfaPendingCredential, authModular, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n return MultiFactorResolverImpl._fromError(authModular, errorInternal);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction startEnrollPhoneMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaEnrollment:start\" /* Endpoint.START_MFA_ENROLLMENT */, _addTidIfNecessary(auth, request));\r\n}\r\nfunction finalizeEnrollPhoneMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaEnrollment:finalize\" /* Endpoint.FINALIZE_MFA_ENROLLMENT */, _addTidIfNecessary(auth, request));\r\n}\r\nfunction startEnrollTotpMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaEnrollment:start\" /* Endpoint.START_MFA_ENROLLMENT */, _addTidIfNecessary(auth, request));\r\n}\r\nfunction finalizeEnrollTotpMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaEnrollment:finalize\" /* Endpoint.FINALIZE_MFA_ENROLLMENT */, _addTidIfNecessary(auth, request));\r\n}\r\nfunction withdrawMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaEnrollment:withdraw\" /* Endpoint.WITHDRAW_MFA */, _addTidIfNecessary(auth, request));\r\n}\n\nclass MultiFactorUserImpl {\r\n constructor(user) {\r\n this.user = user;\r\n this.enrolledFactors = [];\r\n user._onReload(userInfo => {\r\n if (userInfo.mfaInfo) {\r\n this.enrolledFactors = userInfo.mfaInfo.map(enrollment => MultiFactorInfoImpl._fromServerResponse(user.auth, enrollment));\r\n }\r\n });\r\n }\r\n static _fromUser(user) {\r\n return new MultiFactorUserImpl(user);\r\n }\r\n async getSession() {\r\n return MultiFactorSessionImpl._fromIdtoken(await this.user.getIdToken(), this.user);\r\n }\r\n async enroll(assertionExtern, displayName) {\r\n const assertion = assertionExtern;\r\n const session = (await this.getSession());\r\n const finalizeMfaResponse = await _logoutIfInvalidated(this.user, assertion._process(this.user.auth, session, displayName));\r\n // New tokens will be issued after enrollment of the new second factors.\r\n // They need to be updated on the user.\r\n await this.user._updateTokensIfNecessary(finalizeMfaResponse);\r\n // The user needs to be reloaded to get the new multi-factor information\r\n // from server. USER_RELOADED event will be triggered and `enrolledFactors`\r\n // will be updated.\r\n return this.user.reload();\r\n }\r\n async unenroll(infoOrUid) {\r\n const mfaEnrollmentId = typeof infoOrUid === 'string' ? infoOrUid : infoOrUid.uid;\r\n const idToken = await this.user.getIdToken();\r\n try {\r\n const idTokenResponse = await _logoutIfInvalidated(this.user, withdrawMfa(this.user.auth, {\r\n idToken,\r\n mfaEnrollmentId\r\n }));\r\n // Remove the second factor from the user's list.\r\n this.enrolledFactors = this.enrolledFactors.filter(({ uid }) => uid !== mfaEnrollmentId);\r\n // Depending on whether the backend decided to revoke the user's session,\r\n // the tokenResponse may be empty. If the tokens were not updated (and they\r\n // are now invalid), reloading the user will discover this and invalidate\r\n // the user's state accordingly.\r\n await this.user._updateTokensIfNecessary(idTokenResponse);\r\n await this.user.reload();\r\n }\r\n catch (e) {\r\n throw e;\r\n }\r\n }\r\n}\r\nconst multiFactorUserCache = new WeakMap();\r\n/**\r\n * The {@link MultiFactorUser} corresponding to the user.\r\n *\r\n * @remarks\r\n * This is used to access all multi-factor properties and operations related to the user.\r\n *\r\n * @param user - The user.\r\n *\r\n * @public\r\n */\r\nfunction multiFactor(user) {\r\n const userModular = getModularInstance(user);\r\n if (!multiFactorUserCache.has(userModular)) {\r\n multiFactorUserCache.set(userModular, MultiFactorUserImpl._fromUser(userModular));\r\n }\r\n return multiFactorUserCache.get(userModular);\r\n}\n\nconst STORAGE_AVAILABLE_KEY = '__sak';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// There are two different browser persistence types: local and session.\r\n// Both have the same implementation but use a different underlying storage\r\n// object.\r\nclass BrowserPersistenceClass {\r\n constructor(storageRetriever, type) {\r\n this.storageRetriever = storageRetriever;\r\n this.type = type;\r\n }\r\n _isAvailable() {\r\n try {\r\n if (!this.storage) {\r\n return Promise.resolve(false);\r\n }\r\n this.storage.setItem(STORAGE_AVAILABLE_KEY, '1');\r\n this.storage.removeItem(STORAGE_AVAILABLE_KEY);\r\n return Promise.resolve(true);\r\n }\r\n catch (_a) {\r\n return Promise.resolve(false);\r\n }\r\n }\r\n _set(key, value) {\r\n this.storage.setItem(key, JSON.stringify(value));\r\n return Promise.resolve();\r\n }\r\n _get(key) {\r\n const json = this.storage.getItem(key);\r\n return Promise.resolve(json ? JSON.parse(json) : null);\r\n }\r\n _remove(key) {\r\n this.storage.removeItem(key);\r\n return Promise.resolve();\r\n }\r\n get storage() {\r\n return this.storageRetriever();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// The polling period in case events are not supported\r\nconst _POLLING_INTERVAL_MS$1 = 1000;\r\n// The IE 10 localStorage cross tab synchronization delay in milliseconds\r\nconst IE10_LOCAL_STORAGE_SYNC_DELAY = 10;\r\nclass BrowserLocalPersistence extends BrowserPersistenceClass {\r\n constructor() {\r\n super(() => window.localStorage, \"LOCAL\" /* PersistenceType.LOCAL */);\r\n this.boundEventHandler = (event, poll) => this.onStorageEvent(event, poll);\r\n this.listeners = {};\r\n this.localCache = {};\r\n // setTimeout return value is platform specific\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n this.pollTimer = null;\r\n // Whether to use polling instead of depending on window events\r\n this.fallbackToPolling = _isMobileBrowser();\r\n this._shouldAllowMigration = true;\r\n }\r\n forAllChangedKeys(cb) {\r\n // Check all keys with listeners on them.\r\n for (const key of Object.keys(this.listeners)) {\r\n // Get value from localStorage.\r\n const newValue = this.storage.getItem(key);\r\n const oldValue = this.localCache[key];\r\n // If local map value does not match, trigger listener with storage event.\r\n // Differentiate this simulated event from the real storage event.\r\n if (newValue !== oldValue) {\r\n cb(key, oldValue, newValue);\r\n }\r\n }\r\n }\r\n onStorageEvent(event, poll = false) {\r\n // Key would be null in some situations, like when localStorage is cleared\r\n if (!event.key) {\r\n this.forAllChangedKeys((key, _oldValue, newValue) => {\r\n this.notifyListeners(key, newValue);\r\n });\r\n return;\r\n }\r\n const key = event.key;\r\n // Check the mechanism how this event was detected.\r\n // The first event will dictate the mechanism to be used.\r\n if (poll) {\r\n // Environment detects storage changes via polling.\r\n // Remove storage event listener to prevent possible event duplication.\r\n this.detachListener();\r\n }\r\n else {\r\n // Environment detects storage changes via storage event listener.\r\n // Remove polling listener to prevent possible event duplication.\r\n this.stopPolling();\r\n }\r\n const triggerListeners = () => {\r\n // Keep local map up to date in case storage event is triggered before\r\n // poll.\r\n const storedValue = this.storage.getItem(key);\r\n if (!poll && this.localCache[key] === storedValue) {\r\n // Real storage event which has already been detected, do nothing.\r\n // This seems to trigger in some IE browsers for some reason.\r\n return;\r\n }\r\n this.notifyListeners(key, storedValue);\r\n };\r\n const storedValue = this.storage.getItem(key);\r\n if (_isIE10() &&\r\n storedValue !== event.newValue &&\r\n event.newValue !== event.oldValue) {\r\n // IE 10 has this weird bug where a storage event would trigger with the\r\n // correct key, oldValue and newValue but localStorage.getItem(key) does\r\n // not yield the updated value until a few milliseconds. This ensures\r\n // this recovers from that situation.\r\n setTimeout(triggerListeners, IE10_LOCAL_STORAGE_SYNC_DELAY);\r\n }\r\n else {\r\n triggerListeners();\r\n }\r\n }\r\n notifyListeners(key, value) {\r\n this.localCache[key] = value;\r\n const listeners = this.listeners[key];\r\n if (listeners) {\r\n for (const listener of Array.from(listeners)) {\r\n listener(value ? JSON.parse(value) : value);\r\n }\r\n }\r\n }\r\n startPolling() {\r\n this.stopPolling();\r\n this.pollTimer = setInterval(() => {\r\n this.forAllChangedKeys((key, oldValue, newValue) => {\r\n this.onStorageEvent(new StorageEvent('storage', {\r\n key,\r\n oldValue,\r\n newValue\r\n }), \r\n /* poll */ true);\r\n });\r\n }, _POLLING_INTERVAL_MS$1);\r\n }\r\n stopPolling() {\r\n if (this.pollTimer) {\r\n clearInterval(this.pollTimer);\r\n this.pollTimer = null;\r\n }\r\n }\r\n attachListener() {\r\n window.addEventListener('storage', this.boundEventHandler);\r\n }\r\n detachListener() {\r\n window.removeEventListener('storage', this.boundEventHandler);\r\n }\r\n _addListener(key, listener) {\r\n if (Object.keys(this.listeners).length === 0) {\r\n // Whether browser can detect storage event when it had already been pushed to the background.\r\n // This may happen in some mobile browsers. A localStorage change in the foreground window\r\n // will not be detected in the background window via the storage event.\r\n // This was detected in iOS 7.x mobile browsers\r\n if (this.fallbackToPolling) {\r\n this.startPolling();\r\n }\r\n else {\r\n this.attachListener();\r\n }\r\n }\r\n if (!this.listeners[key]) {\r\n this.listeners[key] = new Set();\r\n // Populate the cache to avoid spuriously triggering on first poll.\r\n this.localCache[key] = this.storage.getItem(key);\r\n }\r\n this.listeners[key].add(listener);\r\n }\r\n _removeListener(key, listener) {\r\n if (this.listeners[key]) {\r\n this.listeners[key].delete(listener);\r\n if (this.listeners[key].size === 0) {\r\n delete this.listeners[key];\r\n }\r\n }\r\n if (Object.keys(this.listeners).length === 0) {\r\n this.detachListener();\r\n this.stopPolling();\r\n }\r\n }\r\n // Update local cache on base operations:\r\n async _set(key, value) {\r\n await super._set(key, value);\r\n this.localCache[key] = JSON.stringify(value);\r\n }\r\n async _get(key) {\r\n const value = await super._get(key);\r\n this.localCache[key] = JSON.stringify(value);\r\n return value;\r\n }\r\n async _remove(key) {\r\n await super._remove(key);\r\n delete this.localCache[key];\r\n }\r\n}\r\nBrowserLocalPersistence.type = 'LOCAL';\r\n/**\r\n * An implementation of {@link Persistence} of type `LOCAL` using `localStorage`\r\n * for the underlying storage.\r\n *\r\n * @public\r\n */\r\nconst browserLocalPersistence = BrowserLocalPersistence;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass BrowserSessionPersistence extends BrowserPersistenceClass {\r\n constructor() {\r\n super(() => window.sessionStorage, \"SESSION\" /* PersistenceType.SESSION */);\r\n }\r\n _addListener(_key, _listener) {\r\n // Listeners are not supported for session storage since it cannot be shared across windows\r\n return;\r\n }\r\n _removeListener(_key, _listener) {\r\n // Listeners are not supported for session storage since it cannot be shared across windows\r\n return;\r\n }\r\n}\r\nBrowserSessionPersistence.type = 'SESSION';\r\n/**\r\n * An implementation of {@link Persistence} of `SESSION` using `sessionStorage`\r\n * for the underlying storage.\r\n *\r\n * @public\r\n */\r\nconst browserSessionPersistence = BrowserSessionPersistence;\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Shim for Promise.allSettled, note the slightly different format of `fulfilled` vs `status`.\r\n *\r\n * @param promises - Array of promises to wait on.\r\n */\r\nfunction _allSettled(promises) {\r\n return Promise.all(promises.map(async (promise) => {\r\n try {\r\n const value = await promise;\r\n return {\r\n fulfilled: true,\r\n value\r\n };\r\n }\r\n catch (reason) {\r\n return {\r\n fulfilled: false,\r\n reason\r\n };\r\n }\r\n }));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Interface class for receiving messages.\r\n *\r\n */\r\nclass Receiver {\r\n constructor(eventTarget) {\r\n this.eventTarget = eventTarget;\r\n this.handlersMap = {};\r\n this.boundEventHandler = this.handleEvent.bind(this);\r\n }\r\n /**\r\n * Obtain an instance of a Receiver for a given event target, if none exists it will be created.\r\n *\r\n * @param eventTarget - An event target (such as window or self) through which the underlying\r\n * messages will be received.\r\n */\r\n static _getInstance(eventTarget) {\r\n // The results are stored in an array since objects can't be keys for other\r\n // objects. In addition, setting a unique property on an event target as a\r\n // hash map key may not be allowed due to CORS restrictions.\r\n const existingInstance = this.receivers.find(receiver => receiver.isListeningto(eventTarget));\r\n if (existingInstance) {\r\n return existingInstance;\r\n }\r\n const newInstance = new Receiver(eventTarget);\r\n this.receivers.push(newInstance);\r\n return newInstance;\r\n }\r\n isListeningto(eventTarget) {\r\n return this.eventTarget === eventTarget;\r\n }\r\n /**\r\n * Fans out a MessageEvent to the appropriate listeners.\r\n *\r\n * @remarks\r\n * Sends an {@link Status.ACK} upon receipt and a {@link Status.DONE} once all handlers have\r\n * finished processing.\r\n *\r\n * @param event - The MessageEvent.\r\n *\r\n */\r\n async handleEvent(event) {\r\n const messageEvent = event;\r\n const { eventId, eventType, data } = messageEvent.data;\r\n const handlers = this.handlersMap[eventType];\r\n if (!(handlers === null || handlers === void 0 ? void 0 : handlers.size)) {\r\n return;\r\n }\r\n messageEvent.ports[0].postMessage({\r\n status: \"ack\" /* _Status.ACK */,\r\n eventId,\r\n eventType\r\n });\r\n const promises = Array.from(handlers).map(async (handler) => handler(messageEvent.origin, data));\r\n const response = await _allSettled(promises);\r\n messageEvent.ports[0].postMessage({\r\n status: \"done\" /* _Status.DONE */,\r\n eventId,\r\n eventType,\r\n response\r\n });\r\n }\r\n /**\r\n * Subscribe an event handler for a particular event.\r\n *\r\n * @param eventType - Event name to subscribe to.\r\n * @param eventHandler - The event handler which should receive the events.\r\n *\r\n */\r\n _subscribe(eventType, eventHandler) {\r\n if (Object.keys(this.handlersMap).length === 0) {\r\n this.eventTarget.addEventListener('message', this.boundEventHandler);\r\n }\r\n if (!this.handlersMap[eventType]) {\r\n this.handlersMap[eventType] = new Set();\r\n }\r\n this.handlersMap[eventType].add(eventHandler);\r\n }\r\n /**\r\n * Unsubscribe an event handler from a particular event.\r\n *\r\n * @param eventType - Event name to unsubscribe from.\r\n * @param eventHandler - Optional event handler, if none provided, unsubscribe all handlers on this event.\r\n *\r\n */\r\n _unsubscribe(eventType, eventHandler) {\r\n if (this.handlersMap[eventType] && eventHandler) {\r\n this.handlersMap[eventType].delete(eventHandler);\r\n }\r\n if (!eventHandler || this.handlersMap[eventType].size === 0) {\r\n delete this.handlersMap[eventType];\r\n }\r\n if (Object.keys(this.handlersMap).length === 0) {\r\n this.eventTarget.removeEventListener('message', this.boundEventHandler);\r\n }\r\n }\r\n}\r\nReceiver.receivers = [];\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _generateEventId(prefix = '', digits = 10) {\r\n let random = '';\r\n for (let i = 0; i < digits; i++) {\r\n random += Math.floor(Math.random() * 10);\r\n }\r\n return prefix + random;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Interface for sending messages and waiting for a completion response.\r\n *\r\n */\r\nclass Sender {\r\n constructor(target) {\r\n this.target = target;\r\n this.handlers = new Set();\r\n }\r\n /**\r\n * Unsubscribe the handler and remove it from our tracking Set.\r\n *\r\n * @param handler - The handler to unsubscribe.\r\n */\r\n removeMessageHandler(handler) {\r\n if (handler.messageChannel) {\r\n handler.messageChannel.port1.removeEventListener('message', handler.onMessage);\r\n handler.messageChannel.port1.close();\r\n }\r\n this.handlers.delete(handler);\r\n }\r\n /**\r\n * Send a message to the Receiver located at {@link target}.\r\n *\r\n * @remarks\r\n * We'll first wait a bit for an ACK , if we get one we will wait significantly longer until the\r\n * receiver has had a chance to fully process the event.\r\n *\r\n * @param eventType - Type of event to send.\r\n * @param data - The payload of the event.\r\n * @param timeout - Timeout for waiting on an ACK from the receiver.\r\n *\r\n * @returns An array of settled promises from all the handlers that were listening on the receiver.\r\n */\r\n async _send(eventType, data, timeout = 50 /* _TimeoutDuration.ACK */) {\r\n const messageChannel = typeof MessageChannel !== 'undefined' ? new MessageChannel() : null;\r\n if (!messageChannel) {\r\n throw new Error(\"connection_unavailable\" /* _MessageError.CONNECTION_UNAVAILABLE */);\r\n }\r\n // Node timers and browser timers return fundamentally different types.\r\n // We don't actually care what the value is but TS won't accept unknown and\r\n // we can't cast properly in both environments.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n let completionTimer;\r\n let handler;\r\n return new Promise((resolve, reject) => {\r\n const eventId = _generateEventId('', 20);\r\n messageChannel.port1.start();\r\n const ackTimer = setTimeout(() => {\r\n reject(new Error(\"unsupported_event\" /* _MessageError.UNSUPPORTED_EVENT */));\r\n }, timeout);\r\n handler = {\r\n messageChannel,\r\n onMessage(event) {\r\n const messageEvent = event;\r\n if (messageEvent.data.eventId !== eventId) {\r\n return;\r\n }\r\n switch (messageEvent.data.status) {\r\n case \"ack\" /* _Status.ACK */:\r\n // The receiver should ACK first.\r\n clearTimeout(ackTimer);\r\n completionTimer = setTimeout(() => {\r\n reject(new Error(\"timeout\" /* _MessageError.TIMEOUT */));\r\n }, 3000 /* _TimeoutDuration.COMPLETION */);\r\n break;\r\n case \"done\" /* _Status.DONE */:\r\n // Once the receiver's handlers are finished we will get the results.\r\n clearTimeout(completionTimer);\r\n resolve(messageEvent.data.response);\r\n break;\r\n default:\r\n clearTimeout(ackTimer);\r\n clearTimeout(completionTimer);\r\n reject(new Error(\"invalid_response\" /* _MessageError.INVALID_RESPONSE */));\r\n break;\r\n }\r\n }\r\n };\r\n this.handlers.add(handler);\r\n messageChannel.port1.addEventListener('message', handler.onMessage);\r\n this.target.postMessage({\r\n eventType,\r\n eventId,\r\n data\r\n }, [messageChannel.port2]);\r\n }).finally(() => {\r\n if (handler) {\r\n this.removeMessageHandler(handler);\r\n }\r\n });\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Lazy accessor for window, since the compat layer won't tree shake this out,\r\n * we need to make sure not to mess with window unless we have to\r\n */\r\nfunction _window() {\r\n return window;\r\n}\r\nfunction _setWindowLocation(url) {\r\n _window().location.href = url;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction _isWorker() {\r\n return (typeof _window()['WorkerGlobalScope'] !== 'undefined' &&\r\n typeof _window()['importScripts'] === 'function');\r\n}\r\nasync function _getActiveServiceWorker() {\r\n if (!(navigator === null || navigator === void 0 ? void 0 : navigator.serviceWorker)) {\r\n return null;\r\n }\r\n try {\r\n const registration = await navigator.serviceWorker.ready;\r\n return registration.active;\r\n }\r\n catch (_a) {\r\n return null;\r\n }\r\n}\r\nfunction _getServiceWorkerController() {\r\n var _a;\r\n return ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.serviceWorker) === null || _a === void 0 ? void 0 : _a.controller) || null;\r\n}\r\nfunction _getWorkerGlobalScope() {\r\n return _isWorker() ? self : null;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DB_NAME = 'firebaseLocalStorageDb';\r\nconst DB_VERSION = 1;\r\nconst DB_OBJECTSTORE_NAME = 'firebaseLocalStorage';\r\nconst DB_DATA_KEYPATH = 'fbase_key';\r\n/**\r\n * Promise wrapper for IDBRequest\r\n *\r\n * Unfortunately we can't cleanly extend Promise since promises are not callable in ES6\r\n *\r\n */\r\nclass DBPromise {\r\n constructor(request) {\r\n this.request = request;\r\n }\r\n toPromise() {\r\n return new Promise((resolve, reject) => {\r\n this.request.addEventListener('success', () => {\r\n resolve(this.request.result);\r\n });\r\n this.request.addEventListener('error', () => {\r\n reject(this.request.error);\r\n });\r\n });\r\n }\r\n}\r\nfunction getObjectStore(db, isReadWrite) {\r\n return db\r\n .transaction([DB_OBJECTSTORE_NAME], isReadWrite ? 'readwrite' : 'readonly')\r\n .objectStore(DB_OBJECTSTORE_NAME);\r\n}\r\nfunction _deleteDatabase() {\r\n const request = indexedDB.deleteDatabase(DB_NAME);\r\n return new DBPromise(request).toPromise();\r\n}\r\nfunction _openDatabase() {\r\n const request = indexedDB.open(DB_NAME, DB_VERSION);\r\n return new Promise((resolve, reject) => {\r\n request.addEventListener('error', () => {\r\n reject(request.error);\r\n });\r\n request.addEventListener('upgradeneeded', () => {\r\n const db = request.result;\r\n try {\r\n db.createObjectStore(DB_OBJECTSTORE_NAME, { keyPath: DB_DATA_KEYPATH });\r\n }\r\n catch (e) {\r\n reject(e);\r\n }\r\n });\r\n request.addEventListener('success', async () => {\r\n const db = request.result;\r\n // Strange bug that occurs in Firefox when multiple tabs are opened at the\r\n // same time. The only way to recover seems to be deleting the database\r\n // and re-initializing it.\r\n // https://github.com/firebase/firebase-js-sdk/issues/634\r\n if (!db.objectStoreNames.contains(DB_OBJECTSTORE_NAME)) {\r\n // Need to close the database or else you get a `blocked` event\r\n db.close();\r\n await _deleteDatabase();\r\n resolve(await _openDatabase());\r\n }\r\n else {\r\n resolve(db);\r\n }\r\n });\r\n });\r\n}\r\nasync function _putObject(db, key, value) {\r\n const request = getObjectStore(db, true).put({\r\n [DB_DATA_KEYPATH]: key,\r\n value\r\n });\r\n return new DBPromise(request).toPromise();\r\n}\r\nasync function getObject(db, key) {\r\n const request = getObjectStore(db, false).get(key);\r\n const data = await new DBPromise(request).toPromise();\r\n return data === undefined ? null : data.value;\r\n}\r\nfunction _deleteObject(db, key) {\r\n const request = getObjectStore(db, true).delete(key);\r\n return new DBPromise(request).toPromise();\r\n}\r\nconst _POLLING_INTERVAL_MS = 800;\r\nconst _TRANSACTION_RETRY_COUNT = 3;\r\nclass IndexedDBLocalPersistence {\r\n constructor() {\r\n this.type = \"LOCAL\" /* PersistenceType.LOCAL */;\r\n this._shouldAllowMigration = true;\r\n this.listeners = {};\r\n this.localCache = {};\r\n // setTimeout return value is platform specific\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n this.pollTimer = null;\r\n this.pendingWrites = 0;\r\n this.receiver = null;\r\n this.sender = null;\r\n this.serviceWorkerReceiverAvailable = false;\r\n this.activeServiceWorker = null;\r\n // Fire & forget the service worker registration as it may never resolve\r\n this._workerInitializationPromise =\r\n this.initializeServiceWorkerMessaging().then(() => { }, () => { });\r\n }\r\n async _openDb() {\r\n if (this.db) {\r\n return this.db;\r\n }\r\n this.db = await _openDatabase();\r\n return this.db;\r\n }\r\n async _withRetries(op) {\r\n let numAttempts = 0;\r\n while (true) {\r\n try {\r\n const db = await this._openDb();\r\n return await op(db);\r\n }\r\n catch (e) {\r\n if (numAttempts++ > _TRANSACTION_RETRY_COUNT) {\r\n throw e;\r\n }\r\n if (this.db) {\r\n this.db.close();\r\n this.db = undefined;\r\n }\r\n // TODO: consider adding exponential backoff\r\n }\r\n }\r\n }\r\n /**\r\n * IndexedDB events do not propagate from the main window to the worker context. We rely on a\r\n * postMessage interface to send these events to the worker ourselves.\r\n */\r\n async initializeServiceWorkerMessaging() {\r\n return _isWorker() ? this.initializeReceiver() : this.initializeSender();\r\n }\r\n /**\r\n * As the worker we should listen to events from the main window.\r\n */\r\n async initializeReceiver() {\r\n this.receiver = Receiver._getInstance(_getWorkerGlobalScope());\r\n // Refresh from persistence if we receive a KeyChanged message.\r\n this.receiver._subscribe(\"keyChanged\" /* _EventType.KEY_CHANGED */, async (_origin, data) => {\r\n const keys = await this._poll();\r\n return {\r\n keyProcessed: keys.includes(data.key)\r\n };\r\n });\r\n // Let the sender know that we are listening so they give us more timeout.\r\n this.receiver._subscribe(\"ping\" /* _EventType.PING */, async (_origin, _data) => {\r\n return [\"keyChanged\" /* _EventType.KEY_CHANGED */];\r\n });\r\n }\r\n /**\r\n * As the main window, we should let the worker know when keys change (set and remove).\r\n *\r\n * @remarks\r\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/ready | ServiceWorkerContainer.ready}\r\n * may not resolve.\r\n */\r\n async initializeSender() {\r\n var _a, _b;\r\n // Check to see if there's an active service worker.\r\n this.activeServiceWorker = await _getActiveServiceWorker();\r\n if (!this.activeServiceWorker) {\r\n return;\r\n }\r\n this.sender = new Sender(this.activeServiceWorker);\r\n // Ping the service worker to check what events they can handle.\r\n const results = await this.sender._send(\"ping\" /* _EventType.PING */, {}, 800 /* _TimeoutDuration.LONG_ACK */);\r\n if (!results) {\r\n return;\r\n }\r\n if (((_a = results[0]) === null || _a === void 0 ? void 0 : _a.fulfilled) &&\r\n ((_b = results[0]) === null || _b === void 0 ? void 0 : _b.value.includes(\"keyChanged\" /* _EventType.KEY_CHANGED */))) {\r\n this.serviceWorkerReceiverAvailable = true;\r\n }\r\n }\r\n /**\r\n * Let the worker know about a changed key, the exact key doesn't technically matter since the\r\n * worker will just trigger a full sync anyway.\r\n *\r\n * @remarks\r\n * For now, we only support one service worker per page.\r\n *\r\n * @param key - Storage key which changed.\r\n */\r\n async notifyServiceWorker(key) {\r\n if (!this.sender ||\r\n !this.activeServiceWorker ||\r\n _getServiceWorkerController() !== this.activeServiceWorker) {\r\n return;\r\n }\r\n try {\r\n await this.sender._send(\"keyChanged\" /* _EventType.KEY_CHANGED */, { key }, \r\n // Use long timeout if receiver has previously responded to a ping from us.\r\n this.serviceWorkerReceiverAvailable\r\n ? 800 /* _TimeoutDuration.LONG_ACK */\r\n : 50 /* _TimeoutDuration.ACK */);\r\n }\r\n catch (_a) {\r\n // This is a best effort approach. Ignore errors.\r\n }\r\n }\r\n async _isAvailable() {\r\n try {\r\n if (!indexedDB) {\r\n return false;\r\n }\r\n const db = await _openDatabase();\r\n await _putObject(db, STORAGE_AVAILABLE_KEY, '1');\r\n await _deleteObject(db, STORAGE_AVAILABLE_KEY);\r\n return true;\r\n }\r\n catch (_a) { }\r\n return false;\r\n }\r\n async _withPendingWrite(write) {\r\n this.pendingWrites++;\r\n try {\r\n await write();\r\n }\r\n finally {\r\n this.pendingWrites--;\r\n }\r\n }\r\n async _set(key, value) {\r\n return this._withPendingWrite(async () => {\r\n await this._withRetries((db) => _putObject(db, key, value));\r\n this.localCache[key] = value;\r\n return this.notifyServiceWorker(key);\r\n });\r\n }\r\n async _get(key) {\r\n const obj = (await this._withRetries((db) => getObject(db, key)));\r\n this.localCache[key] = obj;\r\n return obj;\r\n }\r\n async _remove(key) {\r\n return this._withPendingWrite(async () => {\r\n await this._withRetries((db) => _deleteObject(db, key));\r\n delete this.localCache[key];\r\n return this.notifyServiceWorker(key);\r\n });\r\n }\r\n async _poll() {\r\n // TODO: check if we need to fallback if getAll is not supported\r\n const result = await this._withRetries((db) => {\r\n const getAllRequest = getObjectStore(db, false).getAll();\r\n return new DBPromise(getAllRequest).toPromise();\r\n });\r\n if (!result) {\r\n return [];\r\n }\r\n // If we have pending writes in progress abort, we'll get picked up on the next poll\r\n if (this.pendingWrites !== 0) {\r\n return [];\r\n }\r\n const keys = [];\r\n const keysInResult = new Set();\r\n if (result.length !== 0) {\r\n for (const { fbase_key: key, value } of result) {\r\n keysInResult.add(key);\r\n if (JSON.stringify(this.localCache[key]) !== JSON.stringify(value)) {\r\n this.notifyListeners(key, value);\r\n keys.push(key);\r\n }\r\n }\r\n }\r\n for (const localKey of Object.keys(this.localCache)) {\r\n if (this.localCache[localKey] && !keysInResult.has(localKey)) {\r\n // Deleted\r\n this.notifyListeners(localKey, null);\r\n keys.push(localKey);\r\n }\r\n }\r\n return keys;\r\n }\r\n notifyListeners(key, newValue) {\r\n this.localCache[key] = newValue;\r\n const listeners = this.listeners[key];\r\n if (listeners) {\r\n for (const listener of Array.from(listeners)) {\r\n listener(newValue);\r\n }\r\n }\r\n }\r\n startPolling() {\r\n this.stopPolling();\r\n this.pollTimer = setInterval(async () => this._poll(), _POLLING_INTERVAL_MS);\r\n }\r\n stopPolling() {\r\n if (this.pollTimer) {\r\n clearInterval(this.pollTimer);\r\n this.pollTimer = null;\r\n }\r\n }\r\n _addListener(key, listener) {\r\n if (Object.keys(this.listeners).length === 0) {\r\n this.startPolling();\r\n }\r\n if (!this.listeners[key]) {\r\n this.listeners[key] = new Set();\r\n // Populate the cache to avoid spuriously triggering on first poll.\r\n void this._get(key); // This can happen in the background async and we can return immediately.\r\n }\r\n this.listeners[key].add(listener);\r\n }\r\n _removeListener(key, listener) {\r\n if (this.listeners[key]) {\r\n this.listeners[key].delete(listener);\r\n if (this.listeners[key].size === 0) {\r\n delete this.listeners[key];\r\n }\r\n }\r\n if (Object.keys(this.listeners).length === 0) {\r\n this.stopPolling();\r\n }\r\n }\r\n}\r\nIndexedDBLocalPersistence.type = 'LOCAL';\r\n/**\r\n * An implementation of {@link Persistence} of type `LOCAL` using `indexedDB`\r\n * for the underlying storage.\r\n *\r\n * @public\r\n */\r\nconst indexedDBLocalPersistence = IndexedDBLocalPersistence;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction startSignInPhoneMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaSignIn:start\" /* Endpoint.START_MFA_SIGN_IN */, _addTidIfNecessary(auth, request));\r\n}\r\nfunction finalizeSignInPhoneMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaSignIn:finalize\" /* Endpoint.FINALIZE_MFA_SIGN_IN */, _addTidIfNecessary(auth, request));\r\n}\r\nfunction finalizeSignInTotpMfa(auth, request) {\r\n return _performApiRequest(auth, \"POST\" /* HttpMethod.POST */, \"/v2/accounts/mfaSignIn:finalize\" /* Endpoint.FINALIZE_MFA_SIGN_IN */, _addTidIfNecessary(auth, request));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst _SOLVE_TIME_MS = 500;\r\nconst _EXPIRATION_TIME_MS = 60000;\r\nconst _WIDGET_ID_START = 1000000000000;\r\nclass MockReCaptcha {\r\n constructor(auth) {\r\n this.auth = auth;\r\n this.counter = _WIDGET_ID_START;\r\n this._widgets = new Map();\r\n }\r\n render(container, parameters) {\r\n const id = this.counter;\r\n this._widgets.set(id, new MockWidget(container, this.auth.name, parameters || {}));\r\n this.counter++;\r\n return id;\r\n }\r\n reset(optWidgetId) {\r\n var _a;\r\n const id = optWidgetId || _WIDGET_ID_START;\r\n void ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.delete());\r\n this._widgets.delete(id);\r\n }\r\n getResponse(optWidgetId) {\r\n var _a;\r\n const id = optWidgetId || _WIDGET_ID_START;\r\n return ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.getResponse()) || '';\r\n }\r\n async execute(optWidgetId) {\r\n var _a;\r\n const id = optWidgetId || _WIDGET_ID_START;\r\n void ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.execute());\r\n return '';\r\n }\r\n}\r\nclass MockWidget {\r\n constructor(containerOrId, appName, params) {\r\n this.params = params;\r\n this.timerId = null;\r\n this.deleted = false;\r\n this.responseToken = null;\r\n this.clickHandler = () => {\r\n this.execute();\r\n };\r\n const container = typeof containerOrId === 'string'\r\n ? document.getElementById(containerOrId)\r\n : containerOrId;\r\n _assert(container, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */, { appName });\r\n this.container = container;\r\n this.isVisible = this.params.size !== 'invisible';\r\n if (this.isVisible) {\r\n this.execute();\r\n }\r\n else {\r\n this.container.addEventListener('click', this.clickHandler);\r\n }\r\n }\r\n getResponse() {\r\n this.checkIfDeleted();\r\n return this.responseToken;\r\n }\r\n delete() {\r\n this.checkIfDeleted();\r\n this.deleted = true;\r\n if (this.timerId) {\r\n clearTimeout(this.timerId);\r\n this.timerId = null;\r\n }\r\n this.container.removeEventListener('click', this.clickHandler);\r\n }\r\n execute() {\r\n this.checkIfDeleted();\r\n if (this.timerId) {\r\n return;\r\n }\r\n this.timerId = window.setTimeout(() => {\r\n this.responseToken = generateRandomAlphaNumericString(50);\r\n const { callback, 'expired-callback': expiredCallback } = this.params;\r\n if (callback) {\r\n try {\r\n callback(this.responseToken);\r\n }\r\n catch (e) { }\r\n }\r\n this.timerId = window.setTimeout(() => {\r\n this.timerId = null;\r\n this.responseToken = null;\r\n if (expiredCallback) {\r\n try {\r\n expiredCallback();\r\n }\r\n catch (e) { }\r\n }\r\n if (this.isVisible) {\r\n this.execute();\r\n }\r\n }, _EXPIRATION_TIME_MS);\r\n }, _SOLVE_TIME_MS);\r\n }\r\n checkIfDeleted() {\r\n if (this.deleted) {\r\n throw new Error('reCAPTCHA mock was already deleted!');\r\n }\r\n }\r\n}\r\nfunction generateRandomAlphaNumericString(len) {\r\n const chars = [];\r\n const allowedChars = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\r\n for (let i = 0; i < len; i++) {\r\n chars.push(allowedChars.charAt(Math.floor(Math.random() * allowedChars.length)));\r\n }\r\n return chars.join('');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// ReCaptcha will load using the same callback, so the callback function needs\r\n// to be kept around\r\nconst _JSLOAD_CALLBACK = _generateCallbackName('rcb');\r\nconst NETWORK_TIMEOUT_DELAY = new Delay(30000, 60000);\r\n/**\r\n * Loader for the GReCaptcha library. There should only ever be one of this.\r\n */\r\nclass ReCaptchaLoaderImpl {\r\n constructor() {\r\n var _a;\r\n this.hostLanguage = '';\r\n this.counter = 0;\r\n /**\r\n * Check for `render()` method. `window.grecaptcha` will exist if the Enterprise\r\n * version of the ReCAPTCHA script was loaded by someone else (e.g. App Check) but\r\n * `window.grecaptcha.render()` will not. Another load will add it.\r\n */\r\n this.librarySeparatelyLoaded = !!((_a = _window().grecaptcha) === null || _a === void 0 ? void 0 : _a.render);\r\n }\r\n load(auth, hl = '') {\r\n _assert(isHostLanguageValid(hl), auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n if (this.shouldResolveImmediately(hl) && isV2(_window().grecaptcha)) {\r\n return Promise.resolve(_window().grecaptcha);\r\n }\r\n return new Promise((resolve, reject) => {\r\n const networkTimeout = _window().setTimeout(() => {\r\n reject(_createError(auth, \"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */));\r\n }, NETWORK_TIMEOUT_DELAY.get());\r\n _window()[_JSLOAD_CALLBACK] = () => {\r\n _window().clearTimeout(networkTimeout);\r\n delete _window()[_JSLOAD_CALLBACK];\r\n const recaptcha = _window().grecaptcha;\r\n if (!recaptcha || !isV2(recaptcha)) {\r\n reject(_createError(auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */));\r\n return;\r\n }\r\n // Wrap the recaptcha render function so that we know if the developer has\r\n // called it separately\r\n const render = recaptcha.render;\r\n recaptcha.render = (container, params) => {\r\n const widgetId = render(container, params);\r\n this.counter++;\r\n return widgetId;\r\n };\r\n this.hostLanguage = hl;\r\n resolve(recaptcha);\r\n };\r\n const url = `${_recaptchaV2ScriptUrl()}?${querystring({\r\n onload: _JSLOAD_CALLBACK,\r\n render: 'explicit',\r\n hl\r\n })}`;\r\n _loadJS(url).catch(() => {\r\n clearTimeout(networkTimeout);\r\n reject(_createError(auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */));\r\n });\r\n });\r\n }\r\n clearedOneInstance() {\r\n this.counter--;\r\n }\r\n shouldResolveImmediately(hl) {\r\n var _a;\r\n // We can resolve immediately if:\r\n // • grecaptcha is already defined AND (\r\n // 1. the requested language codes are the same OR\r\n // 2. there exists already a ReCaptcha on the page\r\n // 3. the library was already loaded by the app\r\n // In cases (2) and (3), we _can't_ reload as it would break the recaptchas\r\n // that are already in the page\r\n return (!!((_a = _window().grecaptcha) === null || _a === void 0 ? void 0 : _a.render) &&\r\n (hl === this.hostLanguage ||\r\n this.counter > 0 ||\r\n this.librarySeparatelyLoaded));\r\n }\r\n}\r\nfunction isHostLanguageValid(hl) {\r\n return hl.length <= 6 && /^\\s*[a-zA-Z0-9\\-]*\\s*$/.test(hl);\r\n}\r\nclass MockReCaptchaLoaderImpl {\r\n async load(auth) {\r\n return new MockReCaptcha(auth);\r\n }\r\n clearedOneInstance() { }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst RECAPTCHA_VERIFIER_TYPE = 'recaptcha';\r\nconst DEFAULT_PARAMS = {\r\n theme: 'light',\r\n type: 'image'\r\n};\r\n/**\r\n * An {@link https://www.google.com/recaptcha/ | reCAPTCHA}-based application verifier.\r\n *\r\n * @remarks\r\n * `RecaptchaVerifier` does not work in a Node.js environment.\r\n *\r\n * @public\r\n */\r\nclass RecaptchaVerifier {\r\n /**\r\n * @param authExtern - The corresponding Firebase {@link Auth} instance.\r\n *\r\n * @param containerOrId - The reCAPTCHA container parameter.\r\n *\r\n * @remarks\r\n * This has different meaning depending on whether the reCAPTCHA is hidden or visible. For a\r\n * visible reCAPTCHA the container must be empty. If a string is used, it has to correspond to\r\n * an element ID. The corresponding element must also must be in the DOM at the time of\r\n * initialization.\r\n *\r\n * @param parameters - The optional reCAPTCHA parameters.\r\n *\r\n * @remarks\r\n * Check the reCAPTCHA docs for a comprehensive list. All parameters are accepted except for\r\n * the sitekey. Firebase Auth backend provisions a reCAPTCHA for each project and will\r\n * configure this upon rendering. For an invisible reCAPTCHA, a size key must have the value\r\n * 'invisible'.\r\n */\r\n constructor(authExtern, containerOrId, parameters = Object.assign({}, DEFAULT_PARAMS)) {\r\n this.parameters = parameters;\r\n /**\r\n * The application verifier type.\r\n *\r\n * @remarks\r\n * For a reCAPTCHA verifier, this is 'recaptcha'.\r\n */\r\n this.type = RECAPTCHA_VERIFIER_TYPE;\r\n this.destroyed = false;\r\n this.widgetId = null;\r\n this.tokenChangeListeners = new Set();\r\n this.renderPromise = null;\r\n this.recaptcha = null;\r\n this.auth = _castAuth(authExtern);\r\n this.isInvisible = this.parameters.size === 'invisible';\r\n _assert(typeof document !== 'undefined', this.auth, \"operation-not-supported-in-this-environment\" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */);\r\n const container = typeof containerOrId === 'string'\r\n ? document.getElementById(containerOrId)\r\n : containerOrId;\r\n _assert(container, this.auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n this.container = container;\r\n this.parameters.callback = this.makeTokenCallback(this.parameters.callback);\r\n this._recaptchaLoader = this.auth.settings.appVerificationDisabledForTesting\r\n ? new MockReCaptchaLoaderImpl()\r\n : new ReCaptchaLoaderImpl();\r\n this.validateStartingState();\r\n // TODO: Figure out if sdk version is needed\r\n }\r\n /**\r\n * Waits for the user to solve the reCAPTCHA and resolves with the reCAPTCHA token.\r\n *\r\n * @returns A Promise for the reCAPTCHA token.\r\n */\r\n async verify() {\r\n this.assertNotDestroyed();\r\n const id = await this.render();\r\n const recaptcha = this.getAssertedRecaptcha();\r\n const response = recaptcha.getResponse(id);\r\n if (response) {\r\n return response;\r\n }\r\n return new Promise(resolve => {\r\n const tokenChange = (token) => {\r\n if (!token) {\r\n return; // Ignore token expirations.\r\n }\r\n this.tokenChangeListeners.delete(tokenChange);\r\n resolve(token);\r\n };\r\n this.tokenChangeListeners.add(tokenChange);\r\n if (this.isInvisible) {\r\n recaptcha.execute(id);\r\n }\r\n });\r\n }\r\n /**\r\n * Renders the reCAPTCHA widget on the page.\r\n *\r\n * @returns A Promise that resolves with the reCAPTCHA widget ID.\r\n */\r\n render() {\r\n try {\r\n this.assertNotDestroyed();\r\n }\r\n catch (e) {\r\n // This method returns a promise. Since it's not async (we want to return the\r\n // _same_ promise if rendering is still occurring), the API surface should\r\n // reject with the error rather than just throw\r\n return Promise.reject(e);\r\n }\r\n if (this.renderPromise) {\r\n return this.renderPromise;\r\n }\r\n this.renderPromise = this.makeRenderPromise().catch(e => {\r\n this.renderPromise = null;\r\n throw e;\r\n });\r\n return this.renderPromise;\r\n }\r\n /** @internal */\r\n _reset() {\r\n this.assertNotDestroyed();\r\n if (this.widgetId !== null) {\r\n this.getAssertedRecaptcha().reset(this.widgetId);\r\n }\r\n }\r\n /**\r\n * Clears the reCAPTCHA widget from the page and destroys the instance.\r\n */\r\n clear() {\r\n this.assertNotDestroyed();\r\n this.destroyed = true;\r\n this._recaptchaLoader.clearedOneInstance();\r\n if (!this.isInvisible) {\r\n this.container.childNodes.forEach(node => {\r\n this.container.removeChild(node);\r\n });\r\n }\r\n }\r\n validateStartingState() {\r\n _assert(!this.parameters.sitekey, this.auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n _assert(this.isInvisible || !this.container.hasChildNodes(), this.auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n _assert(typeof document !== 'undefined', this.auth, \"operation-not-supported-in-this-environment\" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */);\r\n }\r\n makeTokenCallback(existing) {\r\n return token => {\r\n this.tokenChangeListeners.forEach(listener => listener(token));\r\n if (typeof existing === 'function') {\r\n existing(token);\r\n }\r\n else if (typeof existing === 'string') {\r\n const globalFunc = _window()[existing];\r\n if (typeof globalFunc === 'function') {\r\n globalFunc(token);\r\n }\r\n }\r\n };\r\n }\r\n assertNotDestroyed() {\r\n _assert(!this.destroyed, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }\r\n async makeRenderPromise() {\r\n await this.init();\r\n if (!this.widgetId) {\r\n let container = this.container;\r\n if (!this.isInvisible) {\r\n const guaranteedEmpty = document.createElement('div');\r\n container.appendChild(guaranteedEmpty);\r\n container = guaranteedEmpty;\r\n }\r\n this.widgetId = this.getAssertedRecaptcha().render(container, this.parameters);\r\n }\r\n return this.widgetId;\r\n }\r\n async init() {\r\n _assert(_isHttpOrHttps() && !_isWorker(), this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n await domReady();\r\n this.recaptcha = await this._recaptchaLoader.load(this.auth, this.auth.languageCode || undefined);\r\n const siteKey = await getRecaptchaParams(this.auth);\r\n _assert(siteKey, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n this.parameters.sitekey = siteKey;\r\n }\r\n getAssertedRecaptcha() {\r\n _assert(this.recaptcha, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return this.recaptcha;\r\n }\r\n}\r\nfunction domReady() {\r\n let resolver = null;\r\n return new Promise(resolve => {\r\n if (document.readyState === 'complete') {\r\n resolve();\r\n return;\r\n }\r\n // Document not ready, wait for load before resolving.\r\n // Save resolver, so we can remove listener in case it was externally\r\n // cancelled.\r\n resolver = () => resolve();\r\n window.addEventListener('load', resolver);\r\n }).catch(e => {\r\n if (resolver) {\r\n window.removeEventListener('load', resolver);\r\n }\r\n throw e;\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass ConfirmationResultImpl {\r\n constructor(verificationId, onConfirmation) {\r\n this.verificationId = verificationId;\r\n this.onConfirmation = onConfirmation;\r\n }\r\n confirm(verificationCode) {\r\n const authCredential = PhoneAuthCredential._fromVerification(this.verificationId, verificationCode);\r\n return this.onConfirmation(authCredential);\r\n }\r\n}\r\n/**\r\n * Asynchronously signs in using a phone number.\r\n *\r\n * @remarks\r\n * This method sends a code via SMS to the given\r\n * phone number, and returns a {@link ConfirmationResult}. After the user\r\n * provides the code sent to their phone, call {@link ConfirmationResult.confirm}\r\n * with the code to sign the user in.\r\n *\r\n * For abuse prevention, this method also requires a {@link ApplicationVerifier}.\r\n * This SDK includes a reCAPTCHA-based implementation, {@link RecaptchaVerifier}.\r\n * This function can work on other platforms that do not support the\r\n * {@link RecaptchaVerifier} (like React Native), but you need to use a\r\n * third-party {@link ApplicationVerifier} implementation.\r\n *\r\n * This method does not work in a Node.js environment or with {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // 'recaptcha-container' is the ID of an element in the DOM.\r\n * const applicationVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container');\r\n * const confirmationResult = await signInWithPhoneNumber(auth, phoneNumber, applicationVerifier);\r\n * // Obtain a verificationCode from the user.\r\n * const credential = await confirmationResult.confirm(verificationCode);\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101).\r\n * @param appVerifier - The {@link ApplicationVerifier}.\r\n *\r\n * @public\r\n */\r\nasync function signInWithPhoneNumber(auth, phoneNumber, appVerifier) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const authInternal = _castAuth(auth);\r\n const verificationId = await _verifyPhoneNumber(authInternal, phoneNumber, getModularInstance(appVerifier));\r\n return new ConfirmationResultImpl(verificationId, cred => signInWithCredential(authInternal, cred));\r\n}\r\n/**\r\n * Links the user account with the given phone number.\r\n *\r\n * @remarks\r\n * This method does not work in a Node.js environment.\r\n *\r\n * @param user - The user.\r\n * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101).\r\n * @param appVerifier - The {@link ApplicationVerifier}.\r\n *\r\n * @public\r\n */\r\nasync function linkWithPhoneNumber(user, phoneNumber, appVerifier) {\r\n const userInternal = getModularInstance(user);\r\n await _assertLinkedStatus(false, userInternal, \"phone\" /* ProviderId.PHONE */);\r\n const verificationId = await _verifyPhoneNumber(userInternal.auth, phoneNumber, getModularInstance(appVerifier));\r\n return new ConfirmationResultImpl(verificationId, cred => linkWithCredential(userInternal, cred));\r\n}\r\n/**\r\n * Re-authenticates a user using a fresh phone credential.\r\n *\r\n * @remarks\r\n * Use before operations such as {@link updatePassword} that require tokens from recent sign-in attempts.\r\n *\r\n * This method does not work in a Node.js environment or on any {@link User} signed in by\r\n * {@link Auth} instances created with a {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @param user - The user.\r\n * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101).\r\n * @param appVerifier - The {@link ApplicationVerifier}.\r\n *\r\n * @public\r\n */\r\nasync function reauthenticateWithPhoneNumber(user, phoneNumber, appVerifier) {\r\n const userInternal = getModularInstance(user);\r\n if (_isFirebaseServerApp(userInternal.auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(userInternal.auth));\r\n }\r\n const verificationId = await _verifyPhoneNumber(userInternal.auth, phoneNumber, getModularInstance(appVerifier));\r\n return new ConfirmationResultImpl(verificationId, cred => reauthenticateWithCredential(userInternal, cred));\r\n}\r\n/**\r\n * Returns a verification ID to be used in conjunction with the SMS code that is sent.\r\n *\r\n */\r\nasync function _verifyPhoneNumber(auth, options, verifier) {\r\n var _a;\r\n const recaptchaToken = await verifier.verify();\r\n try {\r\n _assert(typeof recaptchaToken === 'string', auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n _assert(verifier.type === RECAPTCHA_VERIFIER_TYPE, auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n let phoneInfoOptions;\r\n if (typeof options === 'string') {\r\n phoneInfoOptions = {\r\n phoneNumber: options\r\n };\r\n }\r\n else {\r\n phoneInfoOptions = options;\r\n }\r\n if ('session' in phoneInfoOptions) {\r\n const session = phoneInfoOptions.session;\r\n if ('phoneNumber' in phoneInfoOptions) {\r\n _assert(session.type === \"enroll\" /* MultiFactorSessionType.ENROLL */, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const response = await startEnrollPhoneMfa(auth, {\r\n idToken: session.credential,\r\n phoneEnrollmentInfo: {\r\n phoneNumber: phoneInfoOptions.phoneNumber,\r\n recaptchaToken\r\n }\r\n });\r\n return response.phoneSessionInfo.sessionInfo;\r\n }\r\n else {\r\n _assert(session.type === \"signin\" /* MultiFactorSessionType.SIGN_IN */, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const mfaEnrollmentId = ((_a = phoneInfoOptions.multiFactorHint) === null || _a === void 0 ? void 0 : _a.uid) ||\r\n phoneInfoOptions.multiFactorUid;\r\n _assert(mfaEnrollmentId, auth, \"missing-multi-factor-info\" /* AuthErrorCode.MISSING_MFA_INFO */);\r\n const response = await startSignInPhoneMfa(auth, {\r\n mfaPendingCredential: session.credential,\r\n mfaEnrollmentId,\r\n phoneSignInInfo: {\r\n recaptchaToken\r\n }\r\n });\r\n return response.phoneResponseInfo.sessionInfo;\r\n }\r\n }\r\n else {\r\n const { sessionInfo } = await sendPhoneVerificationCode(auth, {\r\n phoneNumber: phoneInfoOptions.phoneNumber,\r\n recaptchaToken\r\n });\r\n return sessionInfo;\r\n }\r\n }\r\n finally {\r\n verifier._reset();\r\n }\r\n}\r\n/**\r\n * Updates the user's phone number.\r\n *\r\n * @remarks\r\n * This method does not work in a Node.js environment or on any {@link User} signed in by\r\n * {@link Auth} instances created with a {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```\r\n * // 'recaptcha-container' is the ID of an element in the DOM.\r\n * const applicationVerifier = new RecaptchaVerifier('recaptcha-container');\r\n * const provider = new PhoneAuthProvider(auth);\r\n * const verificationId = await provider.verifyPhoneNumber('+16505550101', applicationVerifier);\r\n * // Obtain the verificationCode from the user.\r\n * const phoneCredential = PhoneAuthProvider.credential(verificationId, verificationCode);\r\n * await updatePhoneNumber(user, phoneCredential);\r\n * ```\r\n *\r\n * @param user - The user.\r\n * @param credential - A credential authenticating the new phone number.\r\n *\r\n * @public\r\n */\r\nasync function updatePhoneNumber(user, credential) {\r\n const userInternal = getModularInstance(user);\r\n if (_isFirebaseServerApp(userInternal.auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(userInternal.auth));\r\n }\r\n await _link$1(userInternal, credential);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provider for generating an {@link PhoneAuthCredential}.\r\n *\r\n * @remarks\r\n * `PhoneAuthProvider` does not work in a Node.js environment.\r\n *\r\n * @example\r\n * ```javascript\r\n * // 'recaptcha-container' is the ID of an element in the DOM.\r\n * const applicationVerifier = new RecaptchaVerifier('recaptcha-container');\r\n * const provider = new PhoneAuthProvider(auth);\r\n * const verificationId = await provider.verifyPhoneNumber('+16505550101', applicationVerifier);\r\n * // Obtain the verificationCode from the user.\r\n * const phoneCredential = PhoneAuthProvider.credential(verificationId, verificationCode);\r\n * const userCredential = await signInWithCredential(auth, phoneCredential);\r\n * ```\r\n *\r\n * @public\r\n */\r\nclass PhoneAuthProvider {\r\n /**\r\n * @param auth - The Firebase {@link Auth} instance in which sign-ins should occur.\r\n *\r\n */\r\n constructor(auth) {\r\n /** Always set to {@link ProviderId}.PHONE. */\r\n this.providerId = PhoneAuthProvider.PROVIDER_ID;\r\n this.auth = _castAuth(auth);\r\n }\r\n /**\r\n *\r\n * Starts a phone number authentication flow by sending a verification code to the given phone\r\n * number.\r\n *\r\n * @example\r\n * ```javascript\r\n * const provider = new PhoneAuthProvider(auth);\r\n * const verificationId = await provider.verifyPhoneNumber(phoneNumber, applicationVerifier);\r\n * // Obtain verificationCode from the user.\r\n * const authCredential = PhoneAuthProvider.credential(verificationId, verificationCode);\r\n * const userCredential = await signInWithCredential(auth, authCredential);\r\n * ```\r\n *\r\n * @example\r\n * An alternative flow is provided using the `signInWithPhoneNumber` method.\r\n * ```javascript\r\n * const confirmationResult = signInWithPhoneNumber(auth, phoneNumber, applicationVerifier);\r\n * // Obtain verificationCode from the user.\r\n * const userCredential = confirmationResult.confirm(verificationCode);\r\n * ```\r\n *\r\n * @param phoneInfoOptions - The user's {@link PhoneInfoOptions}. The phone number should be in\r\n * E.164 format (e.g. +16505550101).\r\n * @param applicationVerifier - For abuse prevention, this method also requires a\r\n * {@link ApplicationVerifier}. This SDK includes a reCAPTCHA-based implementation,\r\n * {@link RecaptchaVerifier}.\r\n *\r\n * @returns A Promise for a verification ID that can be passed to\r\n * {@link PhoneAuthProvider.credential} to identify this flow..\r\n */\r\n verifyPhoneNumber(phoneOptions, applicationVerifier) {\r\n return _verifyPhoneNumber(this.auth, phoneOptions, getModularInstance(applicationVerifier));\r\n }\r\n /**\r\n * Creates a phone auth credential, given the verification ID from\r\n * {@link PhoneAuthProvider.verifyPhoneNumber} and the code that was sent to the user's\r\n * mobile device.\r\n *\r\n * @example\r\n * ```javascript\r\n * const provider = new PhoneAuthProvider(auth);\r\n * const verificationId = provider.verifyPhoneNumber(phoneNumber, applicationVerifier);\r\n * // Obtain verificationCode from the user.\r\n * const authCredential = PhoneAuthProvider.credential(verificationId, verificationCode);\r\n * const userCredential = signInWithCredential(auth, authCredential);\r\n * ```\r\n *\r\n * @example\r\n * An alternative flow is provided using the `signInWithPhoneNumber` method.\r\n * ```javascript\r\n * const confirmationResult = await signInWithPhoneNumber(auth, phoneNumber, applicationVerifier);\r\n * // Obtain verificationCode from the user.\r\n * const userCredential = await confirmationResult.confirm(verificationCode);\r\n * ```\r\n *\r\n * @param verificationId - The verification ID returned from {@link PhoneAuthProvider.verifyPhoneNumber}.\r\n * @param verificationCode - The verification code sent to the user's mobile device.\r\n *\r\n * @returns The auth provider credential.\r\n */\r\n static credential(verificationId, verificationCode) {\r\n return PhoneAuthCredential._fromVerification(verificationId, verificationCode);\r\n }\r\n /**\r\n * Generates an {@link AuthCredential} from a {@link UserCredential}.\r\n * @param userCredential - The user credential.\r\n */\r\n static credentialFromResult(userCredential) {\r\n const credential = userCredential;\r\n return PhoneAuthProvider.credentialFromTaggedObject(credential);\r\n }\r\n /**\r\n * Returns an {@link AuthCredential} when passed an error.\r\n *\r\n * @remarks\r\n *\r\n * This method works for errors like\r\n * `auth/account-exists-with-different-credentials`. This is useful for\r\n * recovering when attempting to set a user's phone number but the number\r\n * in question is already tied to another account. For example, the following\r\n * code tries to update the current user's phone number, and if that\r\n * fails, links the user with the account associated with that number:\r\n *\r\n * ```js\r\n * const provider = new PhoneAuthProvider(auth);\r\n * const verificationId = await provider.verifyPhoneNumber(number, verifier);\r\n * try {\r\n * const code = ''; // Prompt the user for the verification code\r\n * await updatePhoneNumber(\r\n * auth.currentUser,\r\n * PhoneAuthProvider.credential(verificationId, code));\r\n * } catch (e) {\r\n * if ((e as FirebaseError)?.code === 'auth/account-exists-with-different-credential') {\r\n * const cred = PhoneAuthProvider.credentialFromError(e);\r\n * await linkWithCredential(auth.currentUser, cred);\r\n * }\r\n * }\r\n *\r\n * // At this point, auth.currentUser.phoneNumber === number.\r\n * ```\r\n *\r\n * @param error - The error to generate a credential from.\r\n */\r\n static credentialFromError(error) {\r\n return PhoneAuthProvider.credentialFromTaggedObject((error.customData || {}));\r\n }\r\n static credentialFromTaggedObject({ _tokenResponse: tokenResponse }) {\r\n if (!tokenResponse) {\r\n return null;\r\n }\r\n const { phoneNumber, temporaryProof } = tokenResponse;\r\n if (phoneNumber && temporaryProof) {\r\n return PhoneAuthCredential._fromTokenResponse(phoneNumber, temporaryProof);\r\n }\r\n return null;\r\n }\r\n}\r\n/** Always set to {@link ProviderId}.PHONE. */\r\nPhoneAuthProvider.PROVIDER_ID = \"phone\" /* ProviderId.PHONE */;\r\n/** Always set to {@link SignInMethod}.PHONE. */\r\nPhoneAuthProvider.PHONE_SIGN_IN_METHOD = \"phone\" /* SignInMethod.PHONE */;\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Chooses a popup/redirect resolver to use. This prefers the override (which\r\n * is directly passed in), and falls back to the property set on the auth\r\n * object. If neither are available, this function errors w/ an argument error.\r\n */\r\nfunction _withDefaultResolver(auth, resolverOverride) {\r\n if (resolverOverride) {\r\n return _getInstance(resolverOverride);\r\n }\r\n _assert(auth._popupRedirectResolver, auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n return auth._popupRedirectResolver;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass IdpCredential extends AuthCredential {\r\n constructor(params) {\r\n super(\"custom\" /* ProviderId.CUSTOM */, \"custom\" /* ProviderId.CUSTOM */);\r\n this.params = params;\r\n }\r\n _getIdTokenResponse(auth) {\r\n return signInWithIdp(auth, this._buildIdpRequest());\r\n }\r\n _linkToIdToken(auth, idToken) {\r\n return signInWithIdp(auth, this._buildIdpRequest(idToken));\r\n }\r\n _getReauthenticationResolver(auth) {\r\n return signInWithIdp(auth, this._buildIdpRequest());\r\n }\r\n _buildIdpRequest(idToken) {\r\n const request = {\r\n requestUri: this.params.requestUri,\r\n sessionId: this.params.sessionId,\r\n postBody: this.params.postBody,\r\n tenantId: this.params.tenantId,\r\n pendingToken: this.params.pendingToken,\r\n returnSecureToken: true,\r\n returnIdpCredential: true\r\n };\r\n if (idToken) {\r\n request.idToken = idToken;\r\n }\r\n return request;\r\n }\r\n}\r\nfunction _signIn(params) {\r\n return _signInWithCredential(params.auth, new IdpCredential(params), params.bypassAuthState);\r\n}\r\nfunction _reauth(params) {\r\n const { auth, user } = params;\r\n _assert(user, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return _reauthenticate(user, new IdpCredential(params), params.bypassAuthState);\r\n}\r\nasync function _link(params) {\r\n const { auth, user } = params;\r\n _assert(user, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return _link$1(user, new IdpCredential(params), params.bypassAuthState);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Popup event manager. Handles the popup's entire lifecycle; listens to auth\r\n * events\r\n */\r\nclass AbstractPopupRedirectOperation {\r\n constructor(auth, filter, resolver, user, bypassAuthState = false) {\r\n this.auth = auth;\r\n this.resolver = resolver;\r\n this.user = user;\r\n this.bypassAuthState = bypassAuthState;\r\n this.pendingPromise = null;\r\n this.eventManager = null;\r\n this.filter = Array.isArray(filter) ? filter : [filter];\r\n }\r\n execute() {\r\n return new Promise(async (resolve, reject) => {\r\n this.pendingPromise = { resolve, reject };\r\n try {\r\n this.eventManager = await this.resolver._initialize(this.auth);\r\n await this.onExecution();\r\n this.eventManager.registerConsumer(this);\r\n }\r\n catch (e) {\r\n this.reject(e);\r\n }\r\n });\r\n }\r\n async onAuthEvent(event) {\r\n const { urlResponse, sessionId, postBody, tenantId, error, type } = event;\r\n if (error) {\r\n this.reject(error);\r\n return;\r\n }\r\n const params = {\r\n auth: this.auth,\r\n requestUri: urlResponse,\r\n sessionId: sessionId,\r\n tenantId: tenantId || undefined,\r\n postBody: postBody || undefined,\r\n user: this.user,\r\n bypassAuthState: this.bypassAuthState\r\n };\r\n try {\r\n this.resolve(await this.getIdpTask(type)(params));\r\n }\r\n catch (e) {\r\n this.reject(e);\r\n }\r\n }\r\n onError(error) {\r\n this.reject(error);\r\n }\r\n getIdpTask(type) {\r\n switch (type) {\r\n case \"signInViaPopup\" /* AuthEventType.SIGN_IN_VIA_POPUP */:\r\n case \"signInViaRedirect\" /* AuthEventType.SIGN_IN_VIA_REDIRECT */:\r\n return _signIn;\r\n case \"linkViaPopup\" /* AuthEventType.LINK_VIA_POPUP */:\r\n case \"linkViaRedirect\" /* AuthEventType.LINK_VIA_REDIRECT */:\r\n return _link;\r\n case \"reauthViaPopup\" /* AuthEventType.REAUTH_VIA_POPUP */:\r\n case \"reauthViaRedirect\" /* AuthEventType.REAUTH_VIA_REDIRECT */:\r\n return _reauth;\r\n default:\r\n _fail(this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }\r\n }\r\n resolve(cred) {\r\n debugAssert(this.pendingPromise, 'Pending promise was never set');\r\n this.pendingPromise.resolve(cred);\r\n this.unregisterAndCleanUp();\r\n }\r\n reject(error) {\r\n debugAssert(this.pendingPromise, 'Pending promise was never set');\r\n this.pendingPromise.reject(error);\r\n this.unregisterAndCleanUp();\r\n }\r\n unregisterAndCleanUp() {\r\n if (this.eventManager) {\r\n this.eventManager.unregisterConsumer(this);\r\n }\r\n this.pendingPromise = null;\r\n this.cleanUp();\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst _POLL_WINDOW_CLOSE_TIMEOUT = new Delay(2000, 10000);\r\n/**\r\n * Authenticates a Firebase client using a popup-based OAuth authentication flow.\r\n *\r\n * @remarks\r\n * If succeeds, returns the signed in user along with the provider's credential. If sign in was\r\n * unsuccessful, returns an error object containing additional information about the error.\r\n *\r\n * This method does not work in a Node.js environment or with {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a popup.\r\n * const provider = new FacebookAuthProvider();\r\n * const result = await signInWithPopup(auth, provider);\r\n *\r\n * // The signed-in user info.\r\n * const user = result.user;\r\n * // This gives you a Facebook Access Token.\r\n * const credential = provider.credentialFromResult(auth, result);\r\n * const token = credential.accessToken;\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\r\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\r\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\r\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\r\n *\r\n * @public\r\n */\r\nasync function signInWithPopup(auth, provider, resolver) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_createError(auth, \"operation-not-supported-in-this-environment\" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */));\r\n }\r\n const authInternal = _castAuth(auth);\r\n _assertInstanceOf(auth, provider, FederatedAuthProvider);\r\n const resolverInternal = _withDefaultResolver(authInternal, resolver);\r\n const action = new PopupOperation(authInternal, \"signInViaPopup\" /* AuthEventType.SIGN_IN_VIA_POPUP */, provider, resolverInternal);\r\n return action.executeNotNull();\r\n}\r\n/**\r\n * Reauthenticates the current user with the specified {@link OAuthProvider} using a pop-up based\r\n * OAuth flow.\r\n *\r\n * @remarks\r\n * If the reauthentication is successful, the returned result will contain the user and the\r\n * provider's credential.\r\n *\r\n * This method does not work in a Node.js environment or on any {@link User} signed in by\r\n * {@link Auth} instances created with a {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a popup.\r\n * const provider = new FacebookAuthProvider();\r\n * const result = await signInWithPopup(auth, provider);\r\n * // Reauthenticate using a popup.\r\n * await reauthenticateWithPopup(result.user, provider);\r\n * ```\r\n *\r\n * @param user - The user.\r\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\r\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\r\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\r\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\r\n *\r\n * @public\r\n */\r\nasync function reauthenticateWithPopup(user, provider, resolver) {\r\n const userInternal = getModularInstance(user);\r\n if (_isFirebaseServerApp(userInternal.auth.app)) {\r\n return Promise.reject(_createError(userInternal.auth, \"operation-not-supported-in-this-environment\" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */));\r\n }\r\n _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider);\r\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\r\n const action = new PopupOperation(userInternal.auth, \"reauthViaPopup\" /* AuthEventType.REAUTH_VIA_POPUP */, provider, resolverInternal, userInternal);\r\n return action.executeNotNull();\r\n}\r\n/**\r\n * Links the authenticated provider to the user account using a pop-up based OAuth flow.\r\n *\r\n * @remarks\r\n * If the linking is successful, the returned result will contain the user and the provider's credential.\r\n *\r\n * This method does not work in a Node.js environment.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using some other provider.\r\n * const result = await signInWithEmailAndPassword(auth, email, password);\r\n * // Link using a popup.\r\n * const provider = new FacebookAuthProvider();\r\n * await linkWithPopup(result.user, provider);\r\n * ```\r\n *\r\n * @param user - The user.\r\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\r\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\r\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\r\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\r\n *\r\n * @public\r\n */\r\nasync function linkWithPopup(user, provider, resolver) {\r\n const userInternal = getModularInstance(user);\r\n _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider);\r\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\r\n const action = new PopupOperation(userInternal.auth, \"linkViaPopup\" /* AuthEventType.LINK_VIA_POPUP */, provider, resolverInternal, userInternal);\r\n return action.executeNotNull();\r\n}\r\n/**\r\n * Popup event manager. Handles the popup's entire lifecycle; listens to auth\r\n * events\r\n *\r\n */\r\nclass PopupOperation extends AbstractPopupRedirectOperation {\r\n constructor(auth, filter, provider, resolver, user) {\r\n super(auth, filter, resolver, user);\r\n this.provider = provider;\r\n this.authWindow = null;\r\n this.pollId = null;\r\n if (PopupOperation.currentPopupAction) {\r\n PopupOperation.currentPopupAction.cancel();\r\n }\r\n PopupOperation.currentPopupAction = this;\r\n }\r\n async executeNotNull() {\r\n const result = await this.execute();\r\n _assert(result, this.auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return result;\r\n }\r\n async onExecution() {\r\n debugAssert(this.filter.length === 1, 'Popup operations only handle one event');\r\n const eventId = _generateEventId();\r\n this.authWindow = await this.resolver._openPopup(this.auth, this.provider, this.filter[0], // There's always one, see constructor\r\n eventId);\r\n this.authWindow.associatedEvent = eventId;\r\n // Check for web storage support and origin validation _after_ the popup is\r\n // loaded. These operations are slow (~1 second or so) Rather than\r\n // waiting on them before opening the window, optimistically open the popup\r\n // and check for storage support at the same time. If storage support is\r\n // not available, this will cause the whole thing to reject properly. It\r\n // will also close the popup, but since the promise has already rejected,\r\n // the popup closed by user poll will reject into the void.\r\n this.resolver._originValidation(this.auth).catch(e => {\r\n this.reject(e);\r\n });\r\n this.resolver._isIframeWebStorageSupported(this.auth, isSupported => {\r\n if (!isSupported) {\r\n this.reject(_createError(this.auth, \"web-storage-unsupported\" /* AuthErrorCode.WEB_STORAGE_UNSUPPORTED */));\r\n }\r\n });\r\n // Handle user closure. Notice this does *not* use await\r\n this.pollUserCancellation();\r\n }\r\n get eventId() {\r\n var _a;\r\n return ((_a = this.authWindow) === null || _a === void 0 ? void 0 : _a.associatedEvent) || null;\r\n }\r\n cancel() {\r\n this.reject(_createError(this.auth, \"cancelled-popup-request\" /* AuthErrorCode.EXPIRED_POPUP_REQUEST */));\r\n }\r\n cleanUp() {\r\n if (this.authWindow) {\r\n this.authWindow.close();\r\n }\r\n if (this.pollId) {\r\n window.clearTimeout(this.pollId);\r\n }\r\n this.authWindow = null;\r\n this.pollId = null;\r\n PopupOperation.currentPopupAction = null;\r\n }\r\n pollUserCancellation() {\r\n const poll = () => {\r\n var _a, _b;\r\n if ((_b = (_a = this.authWindow) === null || _a === void 0 ? void 0 : _a.window) === null || _b === void 0 ? void 0 : _b.closed) {\r\n // Make sure that there is sufficient time for whatever action to\r\n // complete. The window could have closed but the sign in network\r\n // call could still be in flight. This is specifically true for\r\n // Firefox or if the opener is in an iframe, in which case the oauth\r\n // helper closes the popup.\r\n this.pollId = window.setTimeout(() => {\r\n this.pollId = null;\r\n this.reject(_createError(this.auth, \"popup-closed-by-user\" /* AuthErrorCode.POPUP_CLOSED_BY_USER */));\r\n }, 8000 /* _Timeout.AUTH_EVENT */);\r\n return;\r\n }\r\n this.pollId = window.setTimeout(poll, _POLL_WINDOW_CLOSE_TIMEOUT.get());\r\n };\r\n poll();\r\n }\r\n}\r\n// Only one popup is ever shown at once. The lifecycle of the current popup\r\n// can be managed / cancelled by the constructor.\r\nPopupOperation.currentPopupAction = null;\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst PENDING_REDIRECT_KEY = 'pendingRedirect';\r\n// We only get one redirect outcome for any one auth, so just store it\r\n// in here.\r\nconst redirectOutcomeMap = new Map();\r\nclass RedirectAction extends AbstractPopupRedirectOperation {\r\n constructor(auth, resolver, bypassAuthState = false) {\r\n super(auth, [\r\n \"signInViaRedirect\" /* AuthEventType.SIGN_IN_VIA_REDIRECT */,\r\n \"linkViaRedirect\" /* AuthEventType.LINK_VIA_REDIRECT */,\r\n \"reauthViaRedirect\" /* AuthEventType.REAUTH_VIA_REDIRECT */,\r\n \"unknown\" /* AuthEventType.UNKNOWN */\r\n ], resolver, undefined, bypassAuthState);\r\n this.eventId = null;\r\n }\r\n /**\r\n * Override the execute function; if we already have a redirect result, then\r\n * just return it.\r\n */\r\n async execute() {\r\n let readyOutcome = redirectOutcomeMap.get(this.auth._key());\r\n if (!readyOutcome) {\r\n try {\r\n const hasPendingRedirect = await _getAndClearPendingRedirectStatus(this.resolver, this.auth);\r\n const result = hasPendingRedirect ? await super.execute() : null;\r\n readyOutcome = () => Promise.resolve(result);\r\n }\r\n catch (e) {\r\n readyOutcome = () => Promise.reject(e);\r\n }\r\n redirectOutcomeMap.set(this.auth._key(), readyOutcome);\r\n }\r\n // If we're not bypassing auth state, the ready outcome should be set to\r\n // null.\r\n if (!this.bypassAuthState) {\r\n redirectOutcomeMap.set(this.auth._key(), () => Promise.resolve(null));\r\n }\r\n return readyOutcome();\r\n }\r\n async onAuthEvent(event) {\r\n if (event.type === \"signInViaRedirect\" /* AuthEventType.SIGN_IN_VIA_REDIRECT */) {\r\n return super.onAuthEvent(event);\r\n }\r\n else if (event.type === \"unknown\" /* AuthEventType.UNKNOWN */) {\r\n // This is a sentinel value indicating there's no pending redirect\r\n this.resolve(null);\r\n return;\r\n }\r\n if (event.eventId) {\r\n const user = await this.auth._redirectUserForId(event.eventId);\r\n if (user) {\r\n this.user = user;\r\n return super.onAuthEvent(event);\r\n }\r\n else {\r\n this.resolve(null);\r\n }\r\n }\r\n }\r\n async onExecution() { }\r\n cleanUp() { }\r\n}\r\nasync function _getAndClearPendingRedirectStatus(resolver, auth) {\r\n const key = pendingRedirectKey(auth);\r\n const persistence = resolverPersistence(resolver);\r\n if (!(await persistence._isAvailable())) {\r\n return false;\r\n }\r\n const hasPendingRedirect = (await persistence._get(key)) === 'true';\r\n await persistence._remove(key);\r\n return hasPendingRedirect;\r\n}\r\nasync function _setPendingRedirectStatus(resolver, auth) {\r\n return resolverPersistence(resolver)._set(pendingRedirectKey(auth), 'true');\r\n}\r\nfunction _clearRedirectOutcomes() {\r\n redirectOutcomeMap.clear();\r\n}\r\nfunction _overrideRedirectResult(auth, result) {\r\n redirectOutcomeMap.set(auth._key(), result);\r\n}\r\nfunction resolverPersistence(resolver) {\r\n return _getInstance(resolver._redirectPersistence);\r\n}\r\nfunction pendingRedirectKey(auth) {\r\n return _persistenceKeyName(PENDING_REDIRECT_KEY, auth.config.apiKey, auth.name);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Authenticates a Firebase client using a full-page redirect flow.\r\n *\r\n * @remarks\r\n * To handle the results and errors for this operation, refer to {@link getRedirectResult}.\r\n * Follow the {@link https://firebase.google.com/docs/auth/web/redirect-best-practices\r\n * | best practices} when using {@link signInWithRedirect}.\r\n *\r\n * This method does not work in a Node.js environment or with {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new FacebookAuthProvider();\r\n * // You can add additional scopes to the provider:\r\n * provider.addScope('user_birthday');\r\n * // Start a sign in process for an unauthenticated user.\r\n * await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * if (result) {\r\n * // This is the signed-in user\r\n * const user = result.user;\r\n * // This gives you a Facebook Access Token.\r\n * const credential = provider.credentialFromResult(auth, result);\r\n * const token = credential.accessToken;\r\n * }\r\n * // As this API can be used for sign-in, linking and reauthentication,\r\n * // check the operationType to determine what triggered this redirect\r\n * // operation.\r\n * const operationType = result.operationType;\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\r\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\r\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\r\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\r\n *\r\n * @public\r\n */\r\nfunction signInWithRedirect(auth, provider, resolver) {\r\n return _signInWithRedirect(auth, provider, resolver);\r\n}\r\nasync function _signInWithRedirect(auth, provider, resolver) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const authInternal = _castAuth(auth);\r\n _assertInstanceOf(auth, provider, FederatedAuthProvider);\r\n // Wait for auth initialization to complete, this will process pending redirects and clear the\r\n // PENDING_REDIRECT_KEY in persistence. This should be completed before starting a new\r\n // redirect and creating a PENDING_REDIRECT_KEY entry.\r\n await authInternal._initializationPromise;\r\n const resolverInternal = _withDefaultResolver(authInternal, resolver);\r\n await _setPendingRedirectStatus(resolverInternal, authInternal);\r\n return resolverInternal._openRedirect(authInternal, provider, \"signInViaRedirect\" /* AuthEventType.SIGN_IN_VIA_REDIRECT */);\r\n}\r\n/**\r\n * Reauthenticates the current user with the specified {@link OAuthProvider} using a full-page redirect flow.\r\n * @remarks\r\n * To handle the results and errors for this operation, refer to {@link getRedirectResult}.\r\n * Follow the {@link https://firebase.google.com/docs/auth/web/redirect-best-practices\r\n * | best practices} when using {@link reauthenticateWithRedirect}.\r\n *\r\n * This method does not work in a Node.js environment or with {@link Auth} instances\r\n * created with a {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new FacebookAuthProvider();\r\n * const result = await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * // Reauthenticate using a redirect.\r\n * await reauthenticateWithRedirect(result.user, provider);\r\n * // This will again trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * ```\r\n *\r\n * @param user - The user.\r\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\r\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\r\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\r\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\r\n *\r\n * @public\r\n */\r\nfunction reauthenticateWithRedirect(user, provider, resolver) {\r\n return _reauthenticateWithRedirect(user, provider, resolver);\r\n}\r\nasync function _reauthenticateWithRedirect(user, provider, resolver) {\r\n const userInternal = getModularInstance(user);\r\n _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider);\r\n if (_isFirebaseServerApp(userInternal.auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(userInternal.auth));\r\n }\r\n // Wait for auth initialization to complete, this will process pending redirects and clear the\r\n // PENDING_REDIRECT_KEY in persistence. This should be completed before starting a new\r\n // redirect and creating a PENDING_REDIRECT_KEY entry.\r\n await userInternal.auth._initializationPromise;\r\n // Allow the resolver to error before persisting the redirect user\r\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\r\n await _setPendingRedirectStatus(resolverInternal, userInternal.auth);\r\n const eventId = await prepareUserForRedirect(userInternal);\r\n return resolverInternal._openRedirect(userInternal.auth, provider, \"reauthViaRedirect\" /* AuthEventType.REAUTH_VIA_REDIRECT */, eventId);\r\n}\r\n/**\r\n * Links the {@link OAuthProvider} to the user account using a full-page redirect flow.\r\n * @remarks\r\n * To handle the results and errors for this operation, refer to {@link getRedirectResult}.\r\n * Follow the {@link https://firebase.google.com/docs/auth/web/redirect-best-practices\r\n * | best practices} when using {@link linkWithRedirect}.\r\n *\r\n * This method does not work in a Node.js environment or with {@link Auth} instances\r\n * created with a {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using some other provider.\r\n * const result = await signInWithEmailAndPassword(auth, email, password);\r\n * // Link using a redirect.\r\n * const provider = new FacebookAuthProvider();\r\n * await linkWithRedirect(result.user, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * ```\r\n *\r\n * @param user - The user.\r\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\r\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\r\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\r\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\r\n *\r\n * @public\r\n */\r\nfunction linkWithRedirect(user, provider, resolver) {\r\n return _linkWithRedirect(user, provider, resolver);\r\n}\r\nasync function _linkWithRedirect(user, provider, resolver) {\r\n const userInternal = getModularInstance(user);\r\n _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider);\r\n // Wait for auth initialization to complete, this will process pending redirects and clear the\r\n // PENDING_REDIRECT_KEY in persistence. This should be completed before starting a new\r\n // redirect and creating a PENDING_REDIRECT_KEY entry.\r\n await userInternal.auth._initializationPromise;\r\n // Allow the resolver to error before persisting the redirect user\r\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\r\n await _assertLinkedStatus(false, userInternal, provider.providerId);\r\n await _setPendingRedirectStatus(resolverInternal, userInternal.auth);\r\n const eventId = await prepareUserForRedirect(userInternal);\r\n return resolverInternal._openRedirect(userInternal.auth, provider, \"linkViaRedirect\" /* AuthEventType.LINK_VIA_REDIRECT */, eventId);\r\n}\r\n/**\r\n * Returns a {@link UserCredential} from the redirect-based sign-in flow.\r\n *\r\n * @remarks\r\n * If sign-in succeeded, returns the signed in user. If sign-in was unsuccessful, fails with an\r\n * error. If no redirect operation was called, returns `null`.\r\n *\r\n * This method does not work in a Node.js environment or with {@link Auth} instances created with a\r\n * {@link @firebase/app#FirebaseServerApp}.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Sign in using a redirect.\r\n * const provider = new FacebookAuthProvider();\r\n * // You can add additional scopes to the provider:\r\n * provider.addScope('user_birthday');\r\n * // Start a sign in process for an unauthenticated user.\r\n * await signInWithRedirect(auth, provider);\r\n * // This will trigger a full page redirect away from your app\r\n *\r\n * // After returning from the redirect when your app initializes you can obtain the result\r\n * const result = await getRedirectResult(auth);\r\n * if (result) {\r\n * // This is the signed-in user\r\n * const user = result.user;\r\n * // This gives you a Facebook Access Token.\r\n * const credential = provider.credentialFromResult(auth, result);\r\n * const token = credential.accessToken;\r\n * }\r\n * // As this API can be used for sign-in, linking and reauthentication,\r\n * // check the operationType to determine what triggered this redirect\r\n * // operation.\r\n * const operationType = result.operationType;\r\n * ```\r\n *\r\n * @param auth - The {@link Auth} instance.\r\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\r\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\r\n *\r\n * @public\r\n */\r\nasync function getRedirectResult(auth, resolver) {\r\n await _castAuth(auth)._initializationPromise;\r\n return _getRedirectResult(auth, resolver, false);\r\n}\r\nasync function _getRedirectResult(auth, resolverExtern, bypassAuthState = false) {\r\n if (_isFirebaseServerApp(auth.app)) {\r\n return Promise.reject(_serverAppCurrentUserOperationNotSupportedError(auth));\r\n }\r\n const authInternal = _castAuth(auth);\r\n const resolver = _withDefaultResolver(authInternal, resolverExtern);\r\n const action = new RedirectAction(authInternal, resolver, bypassAuthState);\r\n const result = await action.execute();\r\n if (result && !bypassAuthState) {\r\n delete result.user._redirectEventId;\r\n await authInternal._persistUserIfCurrent(result.user);\r\n await authInternal._setRedirectUser(null, resolverExtern);\r\n }\r\n return result;\r\n}\r\nasync function prepareUserForRedirect(user) {\r\n const eventId = _generateEventId(`${user.uid}:::`);\r\n user._redirectEventId = eventId;\r\n await user.auth._setRedirectUser(user);\r\n await user.auth._persistUserIfCurrent(user);\r\n return eventId;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// The amount of time to store the UIDs of seen events; this is\r\n// set to 10 min by default\r\nconst EVENT_DUPLICATION_CACHE_DURATION_MS = 10 * 60 * 1000;\r\nclass AuthEventManager {\r\n constructor(auth) {\r\n this.auth = auth;\r\n this.cachedEventUids = new Set();\r\n this.consumers = new Set();\r\n this.queuedRedirectEvent = null;\r\n this.hasHandledPotentialRedirect = false;\r\n this.lastProcessedEventTime = Date.now();\r\n }\r\n registerConsumer(authEventConsumer) {\r\n this.consumers.add(authEventConsumer);\r\n if (this.queuedRedirectEvent &&\r\n this.isEventForConsumer(this.queuedRedirectEvent, authEventConsumer)) {\r\n this.sendToConsumer(this.queuedRedirectEvent, authEventConsumer);\r\n this.saveEventToCache(this.queuedRedirectEvent);\r\n this.queuedRedirectEvent = null;\r\n }\r\n }\r\n unregisterConsumer(authEventConsumer) {\r\n this.consumers.delete(authEventConsumer);\r\n }\r\n onEvent(event) {\r\n // Check if the event has already been handled\r\n if (this.hasEventBeenHandled(event)) {\r\n return false;\r\n }\r\n let handled = false;\r\n this.consumers.forEach(consumer => {\r\n if (this.isEventForConsumer(event, consumer)) {\r\n handled = true;\r\n this.sendToConsumer(event, consumer);\r\n this.saveEventToCache(event);\r\n }\r\n });\r\n if (this.hasHandledPotentialRedirect || !isRedirectEvent(event)) {\r\n // If we've already seen a redirect before, or this is a popup event,\r\n // bail now\r\n return handled;\r\n }\r\n this.hasHandledPotentialRedirect = true;\r\n // If the redirect wasn't handled, hang on to it\r\n if (!handled) {\r\n this.queuedRedirectEvent = event;\r\n handled = true;\r\n }\r\n return handled;\r\n }\r\n sendToConsumer(event, consumer) {\r\n var _a;\r\n if (event.error && !isNullRedirectEvent(event)) {\r\n const code = ((_a = event.error.code) === null || _a === void 0 ? void 0 : _a.split('auth/')[1]) ||\r\n \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */;\r\n consumer.onError(_createError(this.auth, code));\r\n }\r\n else {\r\n consumer.onAuthEvent(event);\r\n }\r\n }\r\n isEventForConsumer(event, consumer) {\r\n const eventIdMatches = consumer.eventId === null ||\r\n (!!event.eventId && event.eventId === consumer.eventId);\r\n return consumer.filter.includes(event.type) && eventIdMatches;\r\n }\r\n hasEventBeenHandled(event) {\r\n if (Date.now() - this.lastProcessedEventTime >=\r\n EVENT_DUPLICATION_CACHE_DURATION_MS) {\r\n this.cachedEventUids.clear();\r\n }\r\n return this.cachedEventUids.has(eventUid(event));\r\n }\r\n saveEventToCache(event) {\r\n this.cachedEventUids.add(eventUid(event));\r\n this.lastProcessedEventTime = Date.now();\r\n }\r\n}\r\nfunction eventUid(e) {\r\n return [e.type, e.eventId, e.sessionId, e.tenantId].filter(v => v).join('-');\r\n}\r\nfunction isNullRedirectEvent({ type, error }) {\r\n return (type === \"unknown\" /* AuthEventType.UNKNOWN */ &&\r\n (error === null || error === void 0 ? void 0 : error.code) === `auth/${\"no-auth-event\" /* AuthErrorCode.NO_AUTH_EVENT */}`);\r\n}\r\nfunction isRedirectEvent(event) {\r\n switch (event.type) {\r\n case \"signInViaRedirect\" /* AuthEventType.SIGN_IN_VIA_REDIRECT */:\r\n case \"linkViaRedirect\" /* AuthEventType.LINK_VIA_REDIRECT */:\r\n case \"reauthViaRedirect\" /* AuthEventType.REAUTH_VIA_REDIRECT */:\r\n return true;\r\n case \"unknown\" /* AuthEventType.UNKNOWN */:\r\n return isNullRedirectEvent(event);\r\n default:\r\n return false;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nasync function _getProjectConfig(auth, request = {}) {\r\n return _performApiRequest(auth, \"GET\" /* HttpMethod.GET */, \"/v1/projects\" /* Endpoint.GET_PROJECT_CONFIG */, request);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst IP_ADDRESS_REGEX = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\r\nconst HTTP_REGEX = /^https?/;\r\nasync function _validateOrigin(auth) {\r\n // Skip origin validation if we are in an emulated environment\r\n if (auth.config.emulator) {\r\n return;\r\n }\r\n const { authorizedDomains } = await _getProjectConfig(auth);\r\n for (const domain of authorizedDomains) {\r\n try {\r\n if (matchDomain(domain)) {\r\n return;\r\n }\r\n }\r\n catch (_a) {\r\n // Do nothing if there's a URL error; just continue searching\r\n }\r\n }\r\n // In the old SDK, this error also provides helpful messages.\r\n _fail(auth, \"unauthorized-domain\" /* AuthErrorCode.INVALID_ORIGIN */);\r\n}\r\nfunction matchDomain(expected) {\r\n const currentUrl = _getCurrentUrl();\r\n const { protocol, hostname } = new URL(currentUrl);\r\n if (expected.startsWith('chrome-extension://')) {\r\n const ceUrl = new URL(expected);\r\n if (ceUrl.hostname === '' && hostname === '') {\r\n // For some reason we're not parsing chrome URLs properly\r\n return (protocol === 'chrome-extension:' &&\r\n expected.replace('chrome-extension://', '') ===\r\n currentUrl.replace('chrome-extension://', ''));\r\n }\r\n return protocol === 'chrome-extension:' && ceUrl.hostname === hostname;\r\n }\r\n if (!HTTP_REGEX.test(protocol)) {\r\n return false;\r\n }\r\n if (IP_ADDRESS_REGEX.test(expected)) {\r\n // The domain has to be exactly equal to the pattern, as an IP domain will\r\n // only contain the IP, no extra character.\r\n return hostname === expected;\r\n }\r\n // Dots in pattern should be escaped.\r\n const escapedDomainPattern = expected.replace(/\\./g, '\\\\.');\r\n // Non ip address domains.\r\n // domain.com = *.domain.com OR domain.com\r\n const re = new RegExp('^(.+\\\\.' + escapedDomainPattern + '|' + escapedDomainPattern + ')$', 'i');\r\n return re.test(hostname);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst NETWORK_TIMEOUT = new Delay(30000, 60000);\r\n/**\r\n * Reset unloaded GApi modules. If gapi.load fails due to a network error,\r\n * it will stop working after a retrial. This is a hack to fix this issue.\r\n */\r\nfunction resetUnloadedGapiModules() {\r\n // Clear last failed gapi.load state to force next gapi.load to first\r\n // load the failed gapi.iframes module.\r\n // Get gapix.beacon context.\r\n const beacon = _window().___jsl;\r\n // Get current hint.\r\n if (beacon === null || beacon === void 0 ? void 0 : beacon.H) {\r\n // Get gapi hint.\r\n for (const hint of Object.keys(beacon.H)) {\r\n // Requested modules.\r\n beacon.H[hint].r = beacon.H[hint].r || [];\r\n // Loaded modules.\r\n beacon.H[hint].L = beacon.H[hint].L || [];\r\n // Set requested modules to a copy of the loaded modules.\r\n beacon.H[hint].r = [...beacon.H[hint].L];\r\n // Clear pending callbacks.\r\n if (beacon.CP) {\r\n for (let i = 0; i < beacon.CP.length; i++) {\r\n // Remove all failed pending callbacks.\r\n beacon.CP[i] = null;\r\n }\r\n }\r\n }\r\n }\r\n}\r\nfunction loadGapi(auth) {\r\n return new Promise((resolve, reject) => {\r\n var _a, _b, _c;\r\n // Function to run when gapi.load is ready.\r\n function loadGapiIframe() {\r\n // The developer may have tried to previously run gapi.load and failed.\r\n // Run this to fix that.\r\n resetUnloadedGapiModules();\r\n gapi.load('gapi.iframes', {\r\n callback: () => {\r\n resolve(gapi.iframes.getContext());\r\n },\r\n ontimeout: () => {\r\n // The above reset may be sufficient, but having this reset after\r\n // failure ensures that if the developer calls gapi.load after the\r\n // connection is re-established and before another attempt to embed\r\n // the iframe, it would work and would not be broken because of our\r\n // failed attempt.\r\n // Timeout when gapi.iframes.Iframe not loaded.\r\n resetUnloadedGapiModules();\r\n reject(_createError(auth, \"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */));\r\n },\r\n timeout: NETWORK_TIMEOUT.get()\r\n });\r\n }\r\n if ((_b = (_a = _window().gapi) === null || _a === void 0 ? void 0 : _a.iframes) === null || _b === void 0 ? void 0 : _b.Iframe) {\r\n // If gapi.iframes.Iframe available, resolve.\r\n resolve(gapi.iframes.getContext());\r\n }\r\n else if (!!((_c = _window().gapi) === null || _c === void 0 ? void 0 : _c.load)) {\r\n // Gapi loader ready, load gapi.iframes.\r\n loadGapiIframe();\r\n }\r\n else {\r\n // Create a new iframe callback when this is called so as not to overwrite\r\n // any previous defined callback. This happens if this method is called\r\n // multiple times in parallel and could result in the later callback\r\n // overwriting the previous one. This would end up with a iframe\r\n // timeout.\r\n const cbName = _generateCallbackName('iframefcb');\r\n // GApi loader not available, dynamically load platform.js.\r\n _window()[cbName] = () => {\r\n // GApi loader should be ready.\r\n if (!!gapi.load) {\r\n loadGapiIframe();\r\n }\r\n else {\r\n // Gapi loader failed, throw error.\r\n reject(_createError(auth, \"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */));\r\n }\r\n };\r\n // Load GApi loader.\r\n return _loadJS(`${_gapiScriptUrl()}?onload=${cbName}`)\r\n .catch(e => reject(e));\r\n }\r\n }).catch(error => {\r\n // Reset cached promise to allow for retrial.\r\n cachedGApiLoader = null;\r\n throw error;\r\n });\r\n}\r\nlet cachedGApiLoader = null;\r\nfunction _loadGapi(auth) {\r\n cachedGApiLoader = cachedGApiLoader || loadGapi(auth);\r\n return cachedGApiLoader;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst PING_TIMEOUT = new Delay(5000, 15000);\r\nconst IFRAME_PATH = '__/auth/iframe';\r\nconst EMULATED_IFRAME_PATH = 'emulator/auth/iframe';\r\nconst IFRAME_ATTRIBUTES = {\r\n style: {\r\n position: 'absolute',\r\n top: '-100px',\r\n width: '1px',\r\n height: '1px'\r\n },\r\n 'aria-hidden': 'true',\r\n tabindex: '-1'\r\n};\r\n// Map from apiHost to endpoint ID for passing into iframe. In current SDK, apiHost can be set to\r\n// anything (not from a list of endpoints with IDs as in legacy), so this is the closest we can get.\r\nconst EID_FROM_APIHOST = new Map([\r\n [\"identitytoolkit.googleapis.com\" /* DefaultConfig.API_HOST */, 'p'],\r\n ['staging-identitytoolkit.sandbox.googleapis.com', 's'],\r\n ['test-identitytoolkit.sandbox.googleapis.com', 't'] // test\r\n]);\r\nfunction getIframeUrl(auth) {\r\n const config = auth.config;\r\n _assert(config.authDomain, auth, \"auth-domain-config-required\" /* AuthErrorCode.MISSING_AUTH_DOMAIN */);\r\n const url = config.emulator\r\n ? _emulatorUrl(config, EMULATED_IFRAME_PATH)\r\n : `https://${auth.config.authDomain}/${IFRAME_PATH}`;\r\n const params = {\r\n apiKey: config.apiKey,\r\n appName: auth.name,\r\n v: SDK_VERSION\r\n };\r\n const eid = EID_FROM_APIHOST.get(auth.config.apiHost);\r\n if (eid) {\r\n params.eid = eid;\r\n }\r\n const frameworks = auth._getFrameworks();\r\n if (frameworks.length) {\r\n params.fw = frameworks.join(',');\r\n }\r\n return `${url}?${querystring(params).slice(1)}`;\r\n}\r\nasync function _openIframe(auth) {\r\n const context = await _loadGapi(auth);\r\n const gapi = _window().gapi;\r\n _assert(gapi, auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n return context.open({\r\n where: document.body,\r\n url: getIframeUrl(auth),\r\n messageHandlersFilter: gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER,\r\n attributes: IFRAME_ATTRIBUTES,\r\n dontclear: true\r\n }, (iframe) => new Promise(async (resolve, reject) => {\r\n await iframe.restyle({\r\n // Prevent iframe from closing on mouse out.\r\n setHideOnLeave: false\r\n });\r\n const networkError = _createError(auth, \"network-request-failed\" /* AuthErrorCode.NETWORK_REQUEST_FAILED */);\r\n // Confirm iframe is correctly loaded.\r\n // To fallback on failure, set a timeout.\r\n const networkErrorTimer = _window().setTimeout(() => {\r\n reject(networkError);\r\n }, PING_TIMEOUT.get());\r\n // Clear timer and resolve pending iframe ready promise.\r\n function clearTimerAndResolve() {\r\n _window().clearTimeout(networkErrorTimer);\r\n resolve(iframe);\r\n }\r\n // This returns an IThenable. However the reject part does not call\r\n // when the iframe is not loaded.\r\n iframe.ping(clearTimerAndResolve).then(clearTimerAndResolve, () => {\r\n reject(networkError);\r\n });\r\n }));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst BASE_POPUP_OPTIONS = {\r\n location: 'yes',\r\n resizable: 'yes',\r\n statusbar: 'yes',\r\n toolbar: 'no'\r\n};\r\nconst DEFAULT_WIDTH = 500;\r\nconst DEFAULT_HEIGHT = 600;\r\nconst TARGET_BLANK = '_blank';\r\nconst FIREFOX_EMPTY_URL = 'http://localhost';\r\nclass AuthPopup {\r\n constructor(window) {\r\n this.window = window;\r\n this.associatedEvent = null;\r\n }\r\n close() {\r\n if (this.window) {\r\n try {\r\n this.window.close();\r\n }\r\n catch (e) { }\r\n }\r\n }\r\n}\r\nfunction _open(auth, url, name, width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT) {\r\n const top = Math.max((window.screen.availHeight - height) / 2, 0).toString();\r\n const left = Math.max((window.screen.availWidth - width) / 2, 0).toString();\r\n let target = '';\r\n const options = Object.assign(Object.assign({}, BASE_POPUP_OPTIONS), { width: width.toString(), height: height.toString(), top,\r\n left });\r\n // Chrome iOS 7 and 8 is returning an undefined popup win when target is\r\n // specified, even though the popup is not necessarily blocked.\r\n const ua = getUA().toLowerCase();\r\n if (name) {\r\n target = _isChromeIOS(ua) ? TARGET_BLANK : name;\r\n }\r\n if (_isFirefox(ua)) {\r\n // Firefox complains when invalid URLs are popped out. Hacky way to bypass.\r\n url = url || FIREFOX_EMPTY_URL;\r\n // Firefox disables by default scrolling on popup windows, which can create\r\n // issues when the user has many Google accounts, for instance.\r\n options.scrollbars = 'yes';\r\n }\r\n const optionsString = Object.entries(options).reduce((accum, [key, value]) => `${accum}${key}=${value},`, '');\r\n if (_isIOSStandalone(ua) && target !== '_self') {\r\n openAsNewWindowIOS(url || '', target);\r\n return new AuthPopup(null);\r\n }\r\n // about:blank getting sanitized causing browsers like IE/Edge to display\r\n // brief error message before redirecting to handler.\r\n const newWin = window.open(url || '', target, optionsString);\r\n _assert(newWin, auth, \"popup-blocked\" /* AuthErrorCode.POPUP_BLOCKED */);\r\n // Flaky on IE edge, encapsulate with a try and catch.\r\n try {\r\n newWin.focus();\r\n }\r\n catch (e) { }\r\n return new AuthPopup(newWin);\r\n}\r\nfunction openAsNewWindowIOS(url, target) {\r\n const el = document.createElement('a');\r\n el.href = url;\r\n el.target = target;\r\n const click = document.createEvent('MouseEvent');\r\n click.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 1, null);\r\n el.dispatchEvent(click);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * URL for Authentication widget which will initiate the OAuth handshake\r\n *\r\n * @internal\r\n */\r\nconst WIDGET_PATH = '__/auth/handler';\r\n/**\r\n * URL for emulated environment\r\n *\r\n * @internal\r\n */\r\nconst EMULATOR_WIDGET_PATH = 'emulator/auth/handler';\r\n/**\r\n * Fragment name for the App Check token that gets passed to the widget\r\n *\r\n * @internal\r\n */\r\nconst FIREBASE_APP_CHECK_FRAGMENT_ID = encodeURIComponent('fac');\r\nasync function _getRedirectUrl(auth, provider, authType, redirectUrl, eventId, additionalParams) {\r\n _assert(auth.config.authDomain, auth, \"auth-domain-config-required\" /* AuthErrorCode.MISSING_AUTH_DOMAIN */);\r\n _assert(auth.config.apiKey, auth, \"invalid-api-key\" /* AuthErrorCode.INVALID_API_KEY */);\r\n const params = {\r\n apiKey: auth.config.apiKey,\r\n appName: auth.name,\r\n authType,\r\n redirectUrl,\r\n v: SDK_VERSION,\r\n eventId\r\n };\r\n if (provider instanceof FederatedAuthProvider) {\r\n provider.setDefaultLanguage(auth.languageCode);\r\n params.providerId = provider.providerId || '';\r\n if (!isEmpty(provider.getCustomParameters())) {\r\n params.customParameters = JSON.stringify(provider.getCustomParameters());\r\n }\r\n // TODO set additionalParams from the provider as well?\r\n for (const [key, value] of Object.entries(additionalParams || {})) {\r\n params[key] = value;\r\n }\r\n }\r\n if (provider instanceof BaseOAuthProvider) {\r\n const scopes = provider.getScopes().filter(scope => scope !== '');\r\n if (scopes.length > 0) {\r\n params.scopes = scopes.join(',');\r\n }\r\n }\r\n if (auth.tenantId) {\r\n params.tid = auth.tenantId;\r\n }\r\n // TODO: maybe set eid as endpointId\r\n // TODO: maybe set fw as Frameworks.join(\",\")\r\n const paramsDict = params;\r\n for (const key of Object.keys(paramsDict)) {\r\n if (paramsDict[key] === undefined) {\r\n delete paramsDict[key];\r\n }\r\n }\r\n // Sets the App Check token to pass to the widget\r\n const appCheckToken = await auth._getAppCheckToken();\r\n const appCheckTokenFragment = appCheckToken\r\n ? `#${FIREBASE_APP_CHECK_FRAGMENT_ID}=${encodeURIComponent(appCheckToken)}`\r\n : '';\r\n // Start at index 1 to skip the leading '&' in the query string\r\n return `${getHandlerBase(auth)}?${querystring(paramsDict).slice(1)}${appCheckTokenFragment}`;\r\n}\r\nfunction getHandlerBase({ config }) {\r\n if (!config.emulator) {\r\n return `https://${config.authDomain}/${WIDGET_PATH}`;\r\n }\r\n return _emulatorUrl(config, EMULATOR_WIDGET_PATH);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The special web storage event\r\n *\r\n */\r\nconst WEB_STORAGE_SUPPORT_KEY = 'webStorageSupport';\r\nclass BrowserPopupRedirectResolver {\r\n constructor() {\r\n this.eventManagers = {};\r\n this.iframes = {};\r\n this.originValidationPromises = {};\r\n this._redirectPersistence = browserSessionPersistence;\r\n this._completeRedirectFn = _getRedirectResult;\r\n this._overrideRedirectResult = _overrideRedirectResult;\r\n }\r\n // Wrapping in async even though we don't await anywhere in order\r\n // to make sure errors are raised as promise rejections\r\n async _openPopup(auth, provider, authType, eventId) {\r\n var _a;\r\n debugAssert((_a = this.eventManagers[auth._key()]) === null || _a === void 0 ? void 0 : _a.manager, '_initialize() not called before _openPopup()');\r\n const url = await _getRedirectUrl(auth, provider, authType, _getCurrentUrl(), eventId);\r\n return _open(auth, url, _generateEventId());\r\n }\r\n async _openRedirect(auth, provider, authType, eventId) {\r\n await this._originValidation(auth);\r\n const url = await _getRedirectUrl(auth, provider, authType, _getCurrentUrl(), eventId);\r\n _setWindowLocation(url);\r\n return new Promise(() => { });\r\n }\r\n _initialize(auth) {\r\n const key = auth._key();\r\n if (this.eventManagers[key]) {\r\n const { manager, promise } = this.eventManagers[key];\r\n if (manager) {\r\n return Promise.resolve(manager);\r\n }\r\n else {\r\n debugAssert(promise, 'If manager is not set, promise should be');\r\n return promise;\r\n }\r\n }\r\n const promise = this.initAndGetManager(auth);\r\n this.eventManagers[key] = { promise };\r\n // If the promise is rejected, the key should be removed so that the\r\n // operation can be retried later.\r\n promise.catch(() => {\r\n delete this.eventManagers[key];\r\n });\r\n return promise;\r\n }\r\n async initAndGetManager(auth) {\r\n const iframe = await _openIframe(auth);\r\n const manager = new AuthEventManager(auth);\r\n iframe.register('authEvent', (iframeEvent) => {\r\n _assert(iframeEvent === null || iframeEvent === void 0 ? void 0 : iframeEvent.authEvent, auth, \"invalid-auth-event\" /* AuthErrorCode.INVALID_AUTH_EVENT */);\r\n // TODO: Consider splitting redirect and popup events earlier on\r\n const handled = manager.onEvent(iframeEvent.authEvent);\r\n return { status: handled ? \"ACK\" /* GapiOutcome.ACK */ : \"ERROR\" /* GapiOutcome.ERROR */ };\r\n }, gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER);\r\n this.eventManagers[auth._key()] = { manager };\r\n this.iframes[auth._key()] = iframe;\r\n return manager;\r\n }\r\n _isIframeWebStorageSupported(auth, cb) {\r\n const iframe = this.iframes[auth._key()];\r\n iframe.send(WEB_STORAGE_SUPPORT_KEY, { type: WEB_STORAGE_SUPPORT_KEY }, result => {\r\n var _a;\r\n const isSupported = (_a = result === null || result === void 0 ? void 0 : result[0]) === null || _a === void 0 ? void 0 : _a[WEB_STORAGE_SUPPORT_KEY];\r\n if (isSupported !== undefined) {\r\n cb(!!isSupported);\r\n }\r\n _fail(auth, \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n }, gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER);\r\n }\r\n _originValidation(auth) {\r\n const key = auth._key();\r\n if (!this.originValidationPromises[key]) {\r\n this.originValidationPromises[key] = _validateOrigin(auth);\r\n }\r\n return this.originValidationPromises[key];\r\n }\r\n get _shouldInitProactively() {\r\n // Mobile browsers and Safari need to optimistically initialize\r\n return _isMobileBrowser() || _isSafari() || _isIOS();\r\n }\r\n}\r\n/**\r\n * An implementation of {@link PopupRedirectResolver} suitable for browser\r\n * based applications.\r\n *\r\n * @remarks\r\n * This method does not work in a Node.js environment.\r\n *\r\n * @public\r\n */\r\nconst browserPopupRedirectResolver = BrowserPopupRedirectResolver;\n\nclass MultiFactorAssertionImpl {\r\n constructor(factorId) {\r\n this.factorId = factorId;\r\n }\r\n _process(auth, session, displayName) {\r\n switch (session.type) {\r\n case \"enroll\" /* MultiFactorSessionType.ENROLL */:\r\n return this._finalizeEnroll(auth, session.credential, displayName);\r\n case \"signin\" /* MultiFactorSessionType.SIGN_IN */:\r\n return this._finalizeSignIn(auth, session.credential);\r\n default:\r\n return debugFail('unexpected MultiFactorSessionType');\r\n }\r\n }\r\n}\n\n/**\r\n * {@inheritdoc PhoneMultiFactorAssertion}\r\n *\r\n * @public\r\n */\r\nclass PhoneMultiFactorAssertionImpl extends MultiFactorAssertionImpl {\r\n constructor(credential) {\r\n super(\"phone\" /* FactorId.PHONE */);\r\n this.credential = credential;\r\n }\r\n /** @internal */\r\n static _fromCredential(credential) {\r\n return new PhoneMultiFactorAssertionImpl(credential);\r\n }\r\n /** @internal */\r\n _finalizeEnroll(auth, idToken, displayName) {\r\n return finalizeEnrollPhoneMfa(auth, {\r\n idToken,\r\n displayName,\r\n phoneVerificationInfo: this.credential._makeVerificationRequest()\r\n });\r\n }\r\n /** @internal */\r\n _finalizeSignIn(auth, mfaPendingCredential) {\r\n return finalizeSignInPhoneMfa(auth, {\r\n mfaPendingCredential,\r\n phoneVerificationInfo: this.credential._makeVerificationRequest()\r\n });\r\n }\r\n}\r\n/**\r\n * Provider for generating a {@link PhoneMultiFactorAssertion}.\r\n *\r\n * @public\r\n */\r\nclass PhoneMultiFactorGenerator {\r\n constructor() { }\r\n /**\r\n * Provides a {@link PhoneMultiFactorAssertion} to confirm ownership of the phone second factor.\r\n *\r\n * @remarks\r\n * This method does not work in a Node.js environment.\r\n *\r\n * @param phoneAuthCredential - A credential provided by {@link PhoneAuthProvider.credential}.\r\n * @returns A {@link PhoneMultiFactorAssertion} which can be used with\r\n * {@link MultiFactorResolver.resolveSignIn}\r\n */\r\n static assertion(credential) {\r\n return PhoneMultiFactorAssertionImpl._fromCredential(credential);\r\n }\r\n}\r\n/**\r\n * The identifier of the phone second factor: `phone`.\r\n */\r\nPhoneMultiFactorGenerator.FACTOR_ID = 'phone';\n\n/**\r\n * Provider for generating a {@link TotpMultiFactorAssertion}.\r\n *\r\n * @public\r\n */\r\nclass TotpMultiFactorGenerator {\r\n /**\r\n * Provides a {@link TotpMultiFactorAssertion} to confirm ownership of\r\n * the TOTP (time-based one-time password) second factor.\r\n * This assertion is used to complete enrollment in TOTP second factor.\r\n *\r\n * @param secret A {@link TotpSecret} containing the shared secret key and other TOTP parameters.\r\n * @param oneTimePassword One-time password from TOTP App.\r\n * @returns A {@link TotpMultiFactorAssertion} which can be used with\r\n * {@link MultiFactorUser.enroll}.\r\n */\r\n static assertionForEnrollment(secret, oneTimePassword) {\r\n return TotpMultiFactorAssertionImpl._fromSecret(secret, oneTimePassword);\r\n }\r\n /**\r\n * Provides a {@link TotpMultiFactorAssertion} to confirm ownership of the TOTP second factor.\r\n * This assertion is used to complete signIn with TOTP as the second factor.\r\n *\r\n * @param enrollmentId identifies the enrolled TOTP second factor.\r\n * @param oneTimePassword One-time password from TOTP App.\r\n * @returns A {@link TotpMultiFactorAssertion} which can be used with\r\n * {@link MultiFactorResolver.resolveSignIn}.\r\n */\r\n static assertionForSignIn(enrollmentId, oneTimePassword) {\r\n return TotpMultiFactorAssertionImpl._fromEnrollmentId(enrollmentId, oneTimePassword);\r\n }\r\n /**\r\n * Returns a promise to {@link TotpSecret} which contains the TOTP shared secret key and other parameters.\r\n * Creates a TOTP secret as part of enrolling a TOTP second factor.\r\n * Used for generating a QR code URL or inputting into a TOTP app.\r\n * This method uses the auth instance corresponding to the user in the multiFactorSession.\r\n *\r\n * @param session The {@link MultiFactorSession} that the user is part of.\r\n * @returns A promise to {@link TotpSecret}.\r\n */\r\n static async generateSecret(session) {\r\n var _a;\r\n const mfaSession = session;\r\n _assert(typeof ((_a = mfaSession.user) === null || _a === void 0 ? void 0 : _a.auth) !== 'undefined', \"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n const response = await startEnrollTotpMfa(mfaSession.user.auth, {\r\n idToken: mfaSession.credential,\r\n totpEnrollmentInfo: {}\r\n });\r\n return TotpSecret._fromStartTotpMfaEnrollmentResponse(response, mfaSession.user.auth);\r\n }\r\n}\r\n/**\r\n * The identifier of the TOTP second factor: `totp`.\r\n */\r\nTotpMultiFactorGenerator.FACTOR_ID = \"totp\" /* FactorId.TOTP */;\r\nclass TotpMultiFactorAssertionImpl extends MultiFactorAssertionImpl {\r\n constructor(otp, enrollmentId, secret) {\r\n super(\"totp\" /* FactorId.TOTP */);\r\n this.otp = otp;\r\n this.enrollmentId = enrollmentId;\r\n this.secret = secret;\r\n }\r\n /** @internal */\r\n static _fromSecret(secret, otp) {\r\n return new TotpMultiFactorAssertionImpl(otp, undefined, secret);\r\n }\r\n /** @internal */\r\n static _fromEnrollmentId(enrollmentId, otp) {\r\n return new TotpMultiFactorAssertionImpl(otp, enrollmentId);\r\n }\r\n /** @internal */\r\n async _finalizeEnroll(auth, idToken, displayName) {\r\n _assert(typeof this.secret !== 'undefined', auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n return finalizeEnrollTotpMfa(auth, {\r\n idToken,\r\n displayName,\r\n totpVerificationInfo: this.secret._makeTotpVerificationInfo(this.otp)\r\n });\r\n }\r\n /** @internal */\r\n async _finalizeSignIn(auth, mfaPendingCredential) {\r\n _assert(this.enrollmentId !== undefined && this.otp !== undefined, auth, \"argument-error\" /* AuthErrorCode.ARGUMENT_ERROR */);\r\n const totpVerificationInfo = { verificationCode: this.otp };\r\n return finalizeSignInTotpMfa(auth, {\r\n mfaPendingCredential,\r\n mfaEnrollmentId: this.enrollmentId,\r\n totpVerificationInfo\r\n });\r\n }\r\n}\r\n/**\r\n * Provider for generating a {@link TotpMultiFactorAssertion}.\r\n *\r\n * Stores the shared secret key and other parameters to generate time-based OTPs.\r\n * Implements methods to retrieve the shared secret key and generate a QR code URL.\r\n * @public\r\n */\r\nclass TotpSecret {\r\n // The public members are declared outside the constructor so the docs can be generated.\r\n constructor(secretKey, hashingAlgorithm, codeLength, codeIntervalSeconds, enrollmentCompletionDeadline, sessionInfo, auth) {\r\n this.sessionInfo = sessionInfo;\r\n this.auth = auth;\r\n this.secretKey = secretKey;\r\n this.hashingAlgorithm = hashingAlgorithm;\r\n this.codeLength = codeLength;\r\n this.codeIntervalSeconds = codeIntervalSeconds;\r\n this.enrollmentCompletionDeadline = enrollmentCompletionDeadline;\r\n }\r\n /** @internal */\r\n static _fromStartTotpMfaEnrollmentResponse(response, auth) {\r\n return new TotpSecret(response.totpSessionInfo.sharedSecretKey, response.totpSessionInfo.hashingAlgorithm, response.totpSessionInfo.verificationCodeLength, response.totpSessionInfo.periodSec, new Date(response.totpSessionInfo.finalizeEnrollmentTime).toUTCString(), response.totpSessionInfo.sessionInfo, auth);\r\n }\r\n /** @internal */\r\n _makeTotpVerificationInfo(otp) {\r\n return { sessionInfo: this.sessionInfo, verificationCode: otp };\r\n }\r\n /**\r\n * Returns a QR code URL as described in\r\n * https://github.com/google/google-authenticator/wiki/Key-Uri-Format\r\n * This can be displayed to the user as a QR code to be scanned into a TOTP app like Google Authenticator.\r\n * If the optional parameters are unspecified, an accountName of and issuer of are used.\r\n *\r\n * @param accountName the name of the account/app along with a user identifier.\r\n * @param issuer issuer of the TOTP (likely the app name).\r\n * @returns A QR code URL string.\r\n */\r\n generateQrCodeUrl(accountName, issuer) {\r\n var _a;\r\n let useDefaults = false;\r\n if (_isEmptyString(accountName) || _isEmptyString(issuer)) {\r\n useDefaults = true;\r\n }\r\n if (useDefaults) {\r\n if (_isEmptyString(accountName)) {\r\n accountName = ((_a = this.auth.currentUser) === null || _a === void 0 ? void 0 : _a.email) || 'unknownuser';\r\n }\r\n if (_isEmptyString(issuer)) {\r\n issuer = this.auth.name;\r\n }\r\n }\r\n return `otpauth://totp/${issuer}:${accountName}?secret=${this.secretKey}&issuer=${issuer}&algorithm=${this.hashingAlgorithm}&digits=${this.codeLength}`;\r\n }\r\n}\r\n/** @internal */\r\nfunction _isEmptyString(input) {\r\n return typeof input === 'undefined' || (input === null || input === void 0 ? void 0 : input.length) === 0;\r\n}\n\nvar name = \"@firebase/auth\";\nvar version = \"1.7.9\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass AuthInterop {\r\n constructor(auth) {\r\n this.auth = auth;\r\n this.internalListeners = new Map();\r\n }\r\n getUid() {\r\n var _a;\r\n this.assertAuthConfigured();\r\n return ((_a = this.auth.currentUser) === null || _a === void 0 ? void 0 : _a.uid) || null;\r\n }\r\n async getToken(forceRefresh) {\r\n this.assertAuthConfigured();\r\n await this.auth._initializationPromise;\r\n if (!this.auth.currentUser) {\r\n return null;\r\n }\r\n const accessToken = await this.auth.currentUser.getIdToken(forceRefresh);\r\n return { accessToken };\r\n }\r\n addAuthTokenListener(listener) {\r\n this.assertAuthConfigured();\r\n if (this.internalListeners.has(listener)) {\r\n return;\r\n }\r\n const unsubscribe = this.auth.onIdTokenChanged(user => {\r\n listener((user === null || user === void 0 ? void 0 : user.stsTokenManager.accessToken) || null);\r\n });\r\n this.internalListeners.set(listener, unsubscribe);\r\n this.updateProactiveRefresh();\r\n }\r\n removeAuthTokenListener(listener) {\r\n this.assertAuthConfigured();\r\n const unsubscribe = this.internalListeners.get(listener);\r\n if (!unsubscribe) {\r\n return;\r\n }\r\n this.internalListeners.delete(listener);\r\n unsubscribe();\r\n this.updateProactiveRefresh();\r\n }\r\n assertAuthConfigured() {\r\n _assert(this.auth._initializationPromise, \"dependent-sdk-initialized-before-auth\" /* AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH */);\r\n }\r\n updateProactiveRefresh() {\r\n if (this.internalListeners.size > 0) {\r\n this.auth._startProactiveRefresh();\r\n }\r\n else {\r\n this.auth._stopProactiveRefresh();\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getVersionForPlatform(clientPlatform) {\r\n switch (clientPlatform) {\r\n case \"Node\" /* ClientPlatform.NODE */:\r\n return 'node';\r\n case \"ReactNative\" /* ClientPlatform.REACT_NATIVE */:\r\n return 'rn';\r\n case \"Worker\" /* ClientPlatform.WORKER */:\r\n return 'webworker';\r\n case \"Cordova\" /* ClientPlatform.CORDOVA */:\r\n return 'cordova';\r\n case \"WebExtension\" /* ClientPlatform.WEB_EXTENSION */:\r\n return 'web-extension';\r\n default:\r\n return undefined;\r\n }\r\n}\r\n/** @internal */\r\nfunction registerAuth(clientPlatform) {\r\n _registerComponent(new Component(\"auth\" /* _ComponentName.AUTH */, (container, { options: deps }) => {\r\n const app = container.getProvider('app').getImmediate();\r\n const heartbeatServiceProvider = container.getProvider('heartbeat');\r\n const appCheckServiceProvider = container.getProvider('app-check-internal');\r\n const { apiKey, authDomain } = app.options;\r\n _assert(apiKey && !apiKey.includes(':'), \"invalid-api-key\" /* AuthErrorCode.INVALID_API_KEY */, { appName: app.name });\r\n const config = {\r\n apiKey,\r\n authDomain,\r\n clientPlatform,\r\n apiHost: \"identitytoolkit.googleapis.com\" /* DefaultConfig.API_HOST */,\r\n tokenApiHost: \"securetoken.googleapis.com\" /* DefaultConfig.TOKEN_API_HOST */,\r\n apiScheme: \"https\" /* DefaultConfig.API_SCHEME */,\r\n sdkClientVersion: _getClientVersion(clientPlatform)\r\n };\r\n const authInstance = new AuthImpl(app, heartbeatServiceProvider, appCheckServiceProvider, config);\r\n _initializeAuthInstance(authInstance, deps);\r\n return authInstance;\r\n }, \"PUBLIC\" /* ComponentType.PUBLIC */)\r\n /**\r\n * Auth can only be initialized by explicitly calling getAuth() or initializeAuth()\r\n * For why we do this, See go/firebase-next-auth-init\r\n */\r\n .setInstantiationMode(\"EXPLICIT\" /* InstantiationMode.EXPLICIT */)\r\n /**\r\n * Because all firebase products that depend on auth depend on auth-internal directly,\r\n * we need to initialize auth-internal after auth is initialized to make it available to other firebase products.\r\n */\r\n .setInstanceCreatedCallback((container, _instanceIdentifier, _instance) => {\r\n const authInternalProvider = container.getProvider(\"auth-internal\" /* _ComponentName.AUTH_INTERNAL */);\r\n authInternalProvider.initialize();\r\n }));\r\n _registerComponent(new Component(\"auth-internal\" /* _ComponentName.AUTH_INTERNAL */, container => {\r\n const auth = _castAuth(container.getProvider(\"auth\" /* _ComponentName.AUTH */).getImmediate());\r\n return (auth => new AuthInterop(auth))(auth);\r\n }, \"PRIVATE\" /* ComponentType.PRIVATE */).setInstantiationMode(\"EXPLICIT\" /* InstantiationMode.EXPLICIT */));\r\n registerVersion(name, version, getVersionForPlatform(clientPlatform));\r\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n registerVersion(name, version, 'esm2017');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst DEFAULT_ID_TOKEN_MAX_AGE = 5 * 60;\r\nconst authIdTokenMaxAge = getExperimentalSetting('authIdTokenMaxAge') || DEFAULT_ID_TOKEN_MAX_AGE;\r\nlet lastPostedIdToken = null;\r\nconst mintCookieFactory = (url) => async (user) => {\r\n const idTokenResult = user && (await user.getIdTokenResult());\r\n const idTokenAge = idTokenResult &&\r\n (new Date().getTime() - Date.parse(idTokenResult.issuedAtTime)) / 1000;\r\n if (idTokenAge && idTokenAge > authIdTokenMaxAge) {\r\n return;\r\n }\r\n // Specifically trip null => undefined when logged out, to delete any existing cookie\r\n const idToken = idTokenResult === null || idTokenResult === void 0 ? void 0 : idTokenResult.token;\r\n if (lastPostedIdToken === idToken) {\r\n return;\r\n }\r\n lastPostedIdToken = idToken;\r\n await fetch(url, {\r\n method: idToken ? 'POST' : 'DELETE',\r\n headers: idToken\r\n ? {\r\n 'Authorization': `Bearer ${idToken}`\r\n }\r\n : {}\r\n });\r\n};\r\n/**\r\n * Returns the Auth instance associated with the provided {@link @firebase/app#FirebaseApp}.\r\n * If no instance exists, initializes an Auth instance with platform-specific default dependencies.\r\n *\r\n * @param app - The Firebase App.\r\n *\r\n * @public\r\n */\r\nfunction getAuth(app = getApp()) {\r\n const provider = _getProvider(app, 'auth');\r\n if (provider.isInitialized()) {\r\n return provider.getImmediate();\r\n }\r\n const auth = initializeAuth(app, {\r\n popupRedirectResolver: browserPopupRedirectResolver,\r\n persistence: [\r\n indexedDBLocalPersistence,\r\n browserLocalPersistence,\r\n browserSessionPersistence\r\n ]\r\n });\r\n const authTokenSyncPath = getExperimentalSetting('authTokenSyncURL');\r\n // Only do the Cookie exchange in a secure context\r\n if (authTokenSyncPath &&\r\n typeof isSecureContext === 'boolean' &&\r\n isSecureContext) {\r\n // Don't allow urls (XSS possibility), only paths on the same domain\r\n const authTokenSyncUrl = new URL(authTokenSyncPath, location.origin);\r\n if (location.origin === authTokenSyncUrl.origin) {\r\n const mintCookie = mintCookieFactory(authTokenSyncUrl.toString());\r\n beforeAuthStateChanged(auth, mintCookie, () => mintCookie(auth.currentUser));\r\n onIdTokenChanged(auth, user => mintCookie(user));\r\n }\r\n }\r\n const authEmulatorHost = getDefaultEmulatorHost('auth');\r\n if (authEmulatorHost) {\r\n connectAuthEmulator(auth, `http://${authEmulatorHost}`);\r\n }\r\n return auth;\r\n}\r\nfunction getScriptParentElement() {\r\n var _a, _b;\r\n return (_b = (_a = document.getElementsByTagName('head')) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : document;\r\n}\r\n_setExternalJSProvider({\r\n loadJS(url) {\r\n // TODO: consider adding timeout support & cancellation\r\n return new Promise((resolve, reject) => {\r\n const el = document.createElement('script');\r\n el.setAttribute('src', url);\r\n el.onload = resolve;\r\n el.onerror = e => {\r\n const error = _createError(\"internal-error\" /* AuthErrorCode.INTERNAL_ERROR */);\r\n error.customData = e;\r\n reject(error);\r\n };\r\n el.type = 'text/javascript';\r\n el.charset = 'UTF-8';\r\n getScriptParentElement().appendChild(el);\r\n });\r\n },\r\n gapiScript: 'https://apis.google.com/js/api.js',\r\n recaptchaV2Script: 'https://www.google.com/recaptcha/api.js',\r\n recaptchaEnterpriseScript: 'https://www.google.com/recaptcha/enterprise.js?render='\r\n});\r\nregisterAuth(\"Browser\" /* ClientPlatform.BROWSER */);\n\nexport { TwitterAuthProvider as $, ActionCodeOperation as A, updateCurrentUser as B, signOut as C, revokeAccessToken as D, deleteUser as E, FactorId as F, debugErrorMap as G, prodErrorMap as H, AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY as I, initializeAuth as J, connectAuthEmulator as K, AuthCredential as L, EmailAuthCredential as M, OAuthCredential as N, OperationType as O, PhoneAuthProvider as P, PhoneAuthCredential as Q, RecaptchaVerifier as R, SignInMethod as S, TotpMultiFactorGenerator as T, inMemoryPersistence as U, EmailAuthProvider as V, FacebookAuthProvider as W, GoogleAuthProvider as X, GithubAuthProvider as Y, OAuthProvider as Z, SAMLAuthProvider as _, browserSessionPersistence as a, signInAnonymously as a0, signInWithCredential as a1, linkWithCredential as a2, reauthenticateWithCredential as a3, signInWithCustomToken as a4, sendPasswordResetEmail as a5, confirmPasswordReset as a6, applyActionCode as a7, checkActionCode as a8, verifyPasswordResetCode as a9, _isIOS7Or8 as aA, _createError as aB, _assert as aC, AuthEventManager as aD, _getInstance as aE, _persistenceKeyName as aF, _getRedirectResult as aG, _overrideRedirectResult as aH, _clearRedirectOutcomes as aI, _castAuth as aJ, UserImpl as aK, AuthImpl as aL, _getClientVersion as aM, _generateEventId as aN, AuthPopup as aO, FetchProvider as aP, SAMLAuthCredential as aQ, createUserWithEmailAndPassword as aa, signInWithEmailAndPassword as ab, sendSignInLinkToEmail as ac, isSignInWithEmailLink as ad, signInWithEmailLink as ae, fetchSignInMethodsForEmail as af, sendEmailVerification as ag, verifyBeforeUpdateEmail as ah, ActionCodeURL as ai, parseActionCodeURL as aj, updateProfile as ak, updateEmail as al, updatePassword as am, getIdToken as an, getIdTokenResult as ao, unlink as ap, getAdditionalUserInfo as aq, reload as ar, getMultiFactorResolver as as, multiFactor as at, debugAssert as au, _isIOS as av, _isAndroid as aw, _fail as ax, _getRedirectUrl as ay, _getProjectConfig as az, browserLocalPersistence as b, signInWithPopup as c, linkWithPopup as d, reauthenticateWithPopup as e, signInWithRedirect as f, linkWithRedirect as g, reauthenticateWithRedirect as h, indexedDBLocalPersistence as i, getRedirectResult as j, browserPopupRedirectResolver as k, linkWithPhoneNumber as l, PhoneMultiFactorGenerator as m, TotpSecret as n, getAuth as o, ProviderId as p, setPersistence as q, reauthenticateWithPhoneNumber as r, signInWithPhoneNumber as s, initializeRecaptchaConfig as t, updatePhoneNumber as u, validatePassword as v, onIdTokenChanged as w, beforeAuthStateChanged as x, onAuthStateChanged as y, useDeviceLanguage as z };\n//# sourceMappingURL=index-68602d24.js.map\n","import { initializeApp } from 'firebase/app'\nimport { Firestore, getFirestore } from 'firebase/firestore'\nimport { getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword } from 'firebase/auth'\nimport { useSettingsStore } from '@/stores/settings'\n\nexport let db: Firestore = null\n\nexport function initializeFirebase() {\n const settingsStore = useSettingsStore()\n\n if (!settingsStore.keySettings.firebaseConfig || !settingsStore.keySettings.firebaseConfig.apiKey) {\n console.error('Firebase configuration or API key not found in settings')\n }\n\n const app = initializeApp(settingsStore.keySettings.firebaseConfig)\n const tempDb = getFirestore(app)\n const auth = getAuth(app)\n\n login(auth)\n\n // update database when intialized\n db = tempDb\n\n return { tempDb, auth }\n}\n\nasync function login(auth) {\n const testEmail = 'test@example.com'\n const testPassword = 'dummyPassword123'\n try {\n // Try to create the user\n await createUserWithEmailAndPassword(auth, testEmail, testPassword)\n console.log('User created successfully')\n\n // Sign in the user\n await signInWithEmailAndPassword(auth, testEmail, testPassword)\n console.log('User signed in successfully')\n\n // Get the current user\n const user = auth.currentUser\n console.log('Current user:', user)\n } catch (error) {\n if (error.code === 'auth/email-already-in-use') {\n // If the email is already in use, sign in the user\n await signInWithEmailAndPassword(auth, testEmail, testPassword)\n console.log('User signed in successfully')\n\n // Get the current user\n const user = auth.currentUser\n console.log('Current user:', user)\n } else {\n console.error('Error:', error)\n }\n }\n}","import { toRaw, isProxy } from 'vue'\n\nimport type { Product, Assembly } from '@/models/material'\n\n/**\n * Removes all nested reactivity and returns a raw object\n * @param obj json object to convert\n * @returns object without reactivity\n */\nexport function deepToRaw(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n // Base case: return the value if it's not an object or array\n return obj\n }\n\n if (Array.isArray(obj)) {\n // If it's an array, iterate through the elements and deep convert\n return obj.map((item) => deepToRaw(item)) as unknown as T\n }\n\n if (isProxy(obj)) {\n // If the object is a reactive proxy, use toRaw to convert it\n obj = toRaw(obj)\n }\n\n // If it's a plain object, iterate through keys and deep convert values\n const result: any = {}\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = deepToRaw(obj[key])\n }\n }\n\n return result as T\n}\n\n/**\n * Sanitizer for undefined fields in an object eg. for use in firebase\n * @param obj json object to sanitize\n * @returns returns sanitized object\n */\nexport function removeUndefinedFields(obj: any): any {\n if (obj === null || typeof obj !== 'object') {\n return obj\n }\n\n return Array.isArray(obj)\n ? obj.map((item) => removeUndefinedFields(item))\n : Object.entries(obj)\n .filter(([_, value]) => value !== undefined)\n .reduce((acc, [key, value]) => {\n acc[key] = removeUndefinedFields(value) // Recursively process nested objects\n return acc\n }, {} as any)\n}\n\nexport const getEnumEntries = (enumObj: any) => {\n return Object.keys(enumObj)\n .filter((key) => isNaN(Number(key)))\n .map((key) => ({ label: key, value: enumObj[key] }))\n}\n\n/**\n * Checks a list of objects recursively and gathers all keys within it\n * @param parameters Start point for the parameter collection\n * @param parameterSet Returns set of unique parameters\n */\nexport function collectParameters(parameters: Record, parameterSet: Set) {\n const guidOrHexRegex = /^(?:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}|[0-9a-fA-F]{32})$/;\n\n Object.keys(parameters).forEach((key) => {\n // Skip if the key is already in the set\n if (parameterSet.has(key)) {\n return\n }\n\n const value = parameters[key]\n\n // Skip if the key is a GUID or 32-character hex string\n if (guidOrHexRegex.test(key)) {\n return\n }\n\n // Skip if the value is null, undefined, or an empty object/array\n if (\n value === null ||\n value === undefined ||\n (Array.isArray(value) && value.length === 0) ||\n (typeof value === 'object' && Object.keys(value).length === 0)\n ) {\n return\n }\n\n // Add the key to the set\n parameterSet.add(key);\n\n if (Array.isArray(value)) {\n // If it's an array, recursively process each object in the array\n value.forEach((element) => {\n if (typeof element === 'object' && element !== null) {\n collectParameters(element, parameterSet)\n }\n })\n } else if (typeof value === 'object' && value !== null) {\n // If it's an object, process it recursively\n collectParameters(value, parameterSet)\n }\n })\n}","import { defineStore } from 'pinia'\nimport { db } from '@/firebase'\nimport type {\n\tFilterRegistry,\n FilterList\n} from '@/models/filters'\nimport { \n collection, \n addDoc,\n setDoc,\n query, \n where, \n orderBy, \n limit, \n getDocs,\n writeBatch\n} from 'firebase/firestore'\nimport type { \n Mapping,\n Assembly\n} from '@/models/material'\nimport type { \n Results, \n ResultList\n} from '@/models/result'\nimport type {\n FilterLog,\n MappingLog,\n ResultsLog,\n AssemblyList,\n CalculationSettingsLog\n} from '@/models/firebase'\n\nimport { \n deepToRaw,\n removeUndefinedFields\n } from '@/utils/dataUtils'\nimport type { CalculationSettings } from '@/models/settings'\n\nexport const useFirebaseStore = defineStore('firebase', {\n state: () => ({\n loading: false,\n error: null,\n }),\n actions: {\n /**\n * Saves the current filter state to the database, with a timestamp\n * @param projectId projectId which usually is the streamID from speckle\n * @param filterRegistry current loaded filterRegistry\n * @param stackName name of the filter state, eg. Archicad walls \n */\n async addFilterRegistry(projectId: string ,filterRegistry: FilterRegistry, stackName: string) {\n this.loading = true\n this.error = null\n try {\n const newStack: FilterLog = {\n projectId: projectId,\n stackName: stackName,\n filterCallStack: filterRegistry.filterCallStack,\n date: new Date(),\n }\n await addDoc(collection(db, 'projectFilters'), newStack)\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Saves the current filter state to the database, with a timestamp\n * @param projectId projectId which usually is the streamID from speckle\n * @param filterRegistry current loaded filterRegistry\n * @param stackName name of the filter state, eg. Archicad walls \n */\n async addFilterList(projectId: string ,filterList: FilterList, stackName: string) {\n this.loading = true\n this.error = null\n try {\n const newStack: FilterLog = {\n projectId: projectId,\n stackName: stackName,\n filterCallStack: filterList,\n date: new Date(),\n }\n await addDoc(collection(db, 'projectFilters'), newStack)\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Fetches the last 5 filterLogs for a project\n * @param projectId projectId which usually is the streamID from speckle\n * @returns last 5 filterLogs, or null if none found\n */\n async fetchLatestFilters(projectId: string): Promise {\n this.loading = true\n this.error = null\n try {\n const q = query(\n collection(db, 'projectFilters'),\n where('projectId', '==', projectId),\n orderBy('date', 'desc'),\n limit(5)\n )\n const querySnapshot = await getDocs(q)\n if (!querySnapshot.empty) {\n // Get the 5 latest filterstates\n const filterStates = querySnapshot.docs.map(doc => doc.data()) as FilterLog[]\n return filterStates\n } else {\n return null\n }\n } catch (error: any) {\n this.error = error.message\n return null\n } finally {\n this.loading = false\n }\n },\n\n\n /**\n * Returns the last generic filterLogs to be used as standard filters\n * @param resLimit Optional limit of results, default is 20\n * @returns last 20 generic filterLogs\n */\n async fetchGenericFilters(resLimit: number = 20): Promise {\n this.loading = true\n this.error = null\n try {\n const q = query(\n collection(db, 'genericFilters'),\n orderBy('date', 'desc'),\n limit(resLimit)\n )\n const querySnapshot = await getDocs(q)\n if (!querySnapshot.empty) {\n // Get the 20 latest generic filterstates\n const filterStates = querySnapshot.docs.map(doc => doc.data()) as FilterLog[]\n return filterStates\n } else {\n return []\n }\n } catch (error: any) {\n this.error = error.message\n return null\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Adds mapping to the firebase DB to save the current mapping progress\n * @param projectId projectId which usually is the streamID from speckle\n * @param mapping mapping to save\n */\n async addMapping(projectId: string, mapping: Mapping, name: string) {\n this.loading = true\n this.error = null\n\n const rawMapping = deepToRaw(mapping)\n const cleanedMapping = removeUndefinedFields(rawMapping)\n\n try {\n const mappingLog: MappingLog = {\n projectId: projectId,\n mapping: cleanedMapping,\n date: new Date(),\n name: name,\n }\n await addDoc(collection(db, 'mappings'), mappingLog)\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Gets mappings for the project, with a optional limit\n * @param projectId projectId which usually is the streamID from speckle\n * @param resLimit Optional limit of results, default is 25\n * @returns \n */\n async fetchMappings(projectId: string, resLimit: number = 25): Promise {\n this.loading = true\n this.error = null\n try {\n const q = query(\n collection(db, 'mappings'),\n where('projectId', '==', projectId),\n orderBy('date', 'desc'),\n limit(resLimit)\n )\n const querySnapshot = await getDocs(q)\n if (!querySnapshot.empty) {\n const mappings = querySnapshot.docs.map(doc => doc.data()) as MappingLog[]\n return mappings\n } else {\n return []\n }\n } catch (error: any) {\n this.error = error.message\n return null\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Deletes a mapping from the database\n * @param projectId projectId which usually is the streamID from Speckle\n * @param mappingId mappingId to delete\n */\n async deleteMapping(projectId: string, mappingId: string) {\n this.loading = true\n this.error = null\n\n try {\n const q = query(\n collection(db, 'mappings'),\n where('projectId', '==', projectId),\n where('mappingId', '==', mappingId)\n )\n const querySnapshot = await getDocs(q)\n if (!querySnapshot.empty) {\n const batch = writeBatch(db)\n querySnapshot.forEach(doc => {\n batch.delete(doc.ref)\n })\n await batch.commit()\n } else {\n this.error = 'No matching document found'\n }\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n\n\n /**\n * Adds results to the firebase DB to save the current results, only saving aggregated results\n * To get object based results reload the mappings and recalculate\n * @param projectId projectId which usually is the streamID from speckle\n * @param results aggregated results from geometry objects\n */\n async addResultList(projectId: string, resultList: ResultList, name: string) {\n this.loading = true\n this.error = null\n try {\n const resultsLog: ResultsLog = {\n name: name,\n projectId: projectId,\n resultList: resultList,\n date: new Date(),\n }\n await addDoc(collection(db, 'resultLists'), resultsLog)\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Fetches aggregated results for the project, with a optional limit\n * @param projectId projectId which usually is the streamID from speckle\n * @param resLimit Optional limit of results, default is 25\n * @returns \n */\n async fetchResults(projectId: string, resLimit: number = 25): Promise {\n this.loading = true\n this.error = null\n try {\n const q = query(\n collection(db, 'resultLists'),\n where('projectId', '==', projectId),\n orderBy('date', 'desc'),\n limit(resLimit)\n )\n const querySnapshot = await getDocs(q)\n if (!querySnapshot.empty) {\n const results = querySnapshot.docs.map(doc => doc.data()) as ResultsLog[]\n return results\n } else {\n return []\n }\n } catch (error: any) {\n this.error = error.message\n return null\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Deletes a result from the database\n * @param projectId projectId which usually is the streamID from Speckle\n * @param resultsId resultsId to delete\n */\n async deleteResults(projectId: string, resultsId: string) {\n this.loading = true\n this.error = null\n \n try {\n const q = query(\n collection(db, 'projectResults'),\n where('projectId', '==', projectId),\n where('mappingId', '==', resultsId)\n )\n const querySnapshot = await getDocs(q)\n if (!querySnapshot.empty) {\n const batch = writeBatch(db)\n querySnapshot.forEach(doc => {\n batch.delete(doc.ref)\n })\n await batch.commit()\n } else {\n this.error = 'No matching document found'\n }\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Fetches the whole assembly list for a project\n * @param projectId \n * @returns \n */\n async fetchAssemblyList(projectId: string): Promise {\n this.loading = true\n this.error = null\n try {\n const q = query(\n collection(db, 'projectAssemblies'),\n where('projectId', '==', projectId)\n )\n const querySnapshot = await getDocs(q)\n if (!querySnapshot.empty) {\n const assemblyList = querySnapshot.docs[0].data() as AssemblyList\n return assemblyList\n } else {\n return null\n }\n } catch (error: any) {\n this.error = error.message\n return null\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Updates the assembly list for a project\n * Overwrites the current list\n * @param projectId \n * @param assemblies \n */\n async addAssemblyList(projectId: string, assemblies: Assembly[]) {\n this.loading = true\n this.error = null\n\n try {\n const querySnapshot = await getDocs(\n query(collection(db, 'projectAssemblies'), where('projectId', '==', projectId))\n )\n\n const assemblyList: AssemblyList = {\n projectId: projectId,\n assemblies: assemblies,\n }\n\n if (!querySnapshot.empty) {\n const docRef = querySnapshot.docs[0].ref\n await setDoc(docRef, assemblyList)\n } else {\n await addDoc(collection(db, 'projectAssemblies'), assemblyList);\n }\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Fetches the calculation settings for a project and all generic ones\n * @param projectId \n * @param settings \n * @returns CalculationSettings[] or null if none found\n */\n async fetchCalculationSettings(projectId: string): Promise {\n this.loading = true\n this.error = null\n\n try {\n const specificQuery = query(\n collection(db, 'calculationSettings'),\n where('projectId', '==', projectId)\n )\n const genericQuery = query(\n collection(db, 'calculationSettings'),\n where('projectId', '==', 'generic')\n )\n\n const [specificSnapshot, genericSnapshot] = await Promise.all([\n getDocs(specificQuery),\n getDocs(genericQuery)\n ])\n \n if (!specificSnapshot.empty || !genericSnapshot.empty) {\n const combinedSettings: CalculationSettingsLog[] = [...specificSnapshot.docs, ...genericSnapshot.docs].map(doc => ({\n ...doc.data()\n })) as CalculationSettingsLog[]\n return combinedSettings\n } else {\n return null\n }\n } catch (error: any) {\n this.error = error.message\n return null\n } finally {\n this.loading = false\n }\n },\n\n /**\n * Adds a calculation setting to the database\n * @param projectId \n * @param setting \n */\n async addCalculationSettings(projectId: string, setting: CalculationSettings, name: string) {\n this.loading = true\n this.error = null\n \n try {\n if (!setting) \n return null\n\n const settingLog: CalculationSettingsLog = {\n projectId: projectId,\n settings: setting,\n date: new Date(),\n name: name\n }\n await addDoc(collection(db, 'calculationSettings'), settingLog);\n } catch (error: any) {\n this.error = error.message\n } finally {\n this.loading = false\n }\n },\n },\n})","import type { Mapping, MaterialFilterParam, Product } from \"@/models/material\"\nimport type { FilterList, NestedGroup } from \"@/models/filters\"\nimport type { GeometryObject } from \"@/models/geometryObject\"\nimport type { AssemblyList } from \"@/models/firebase\"\n\nimport { useProjectStore } from \"@/stores/main\"\nimport { useMaterialStore } from \"@/stores/material\"\nimport { useSpeckleStore } from \"@/stores/speckle\"\nimport { useFirebaseStore } from \"@/stores/firebase\"\n\nimport { setMappingColorGroup, updateProjectGroups } from \"@/utils/projectUtils\"\n\n/**\n * Updates from a selected mapping to a new one, with all materials and objectIds\n * TODO: This needs a redo and optimisation\n * @param mapping Mapping object to update towards project and material store\n */\nexport function updateMapping(mapping: Mapping) {\n const projectStore = useProjectStore()\n const materialStore = useMaterialStore()\n\n // Keep this in memory to avoid unnecessary updates of groups\n let lastId = null\n clearMapping()\n\n mapping.steps.forEach(step => {\n if (lastId != step.filterId) {\n //Find the filter from the mapping and apply it to the project\n const filterList = mapping.filters.find(filter => filter.id == step.filterId);\n projectStore.updateRegistryStack(filterList.name, filterList.callStack)\n updateProjectGroups(true)\n\n lastId = step.filterId\n }\n //Search and find the group that we are updating\n const group = projectStore.getGroupById(step.nestedGroupId)\n \n if (group == null) {\n return\n } else {\n //Update the material for all objects in the group\n group.elements.forEach(obj => {\n obj.material = step.material\n })\n }\n\n materialStore.updateMappingMaterial(step.nestedGroupId, step.material)\n })\n materialStore.setMapping(mapping)\n}\n\nexport function clearMapping() {\n const projectStore = useProjectStore()\n const materialStore = useMaterialStore()\n\n // Clear the mapping and update the project\n materialStore.mapping = null\n \n // Remove all mappings on objects\n projectStore.currProject.geometry.forEach(geo => {\n geo.material = null\n })\n\n updateProjectGroups(true)\n}\n\n/**\n * Maps materials and updates the material store mapping with the current filter list and current selected material\n * Also sets the color groups for the speckle store and updates the color groups\n * @param inGroup nested group to map materials on\n */\nexport function mapMaterial(inGroup: NestedGroup) {\n const materialStore = useMaterialStore()\n const projectStore = useProjectStore()\n const speckleStore = useSpeckleStore()\n\n const currFilterList: FilterList = projectStore.filterRegistry.filterCallStack\n\n // If no mapping exists, create a new one and then add the step\n if (materialStore.mapping == null) {\n const newMapping: Mapping = {\n id: crypto.randomUUID(),\n name: 'temp',\n filters: [currFilterList],\n steps: []\n }\n materialStore.mapping = newMapping\n materialStore.addStep(inGroup, materialStore.currentMapping, currFilterList.id)\n } else {\n // If the filter list is not in the mapping, add it\n if (!materialStore.mapping.filters.includes(currFilterList)) {\n materialStore.mapping.filters.push(currFilterList)\n }\n materialStore.addStep(inGroup, materialStore.currentMapping, currFilterList.id)\n }\n\n // Apply materials to all objects in the group\n // TODO: I think this should be an automated function from the Step we added or moved to addStep instead\n inGroup.objects.forEach(obj => {\n if (materialStore.currentMapping != null) {\n obj.material = materialStore.currentMapping\n materialStore.updateMappingMaterial(obj.URI, materialStore.currentMapping)\n }\n })\n\n const mappingColors = setMappingColorGroup()\n speckleStore.setColorGroups(mappingColors)\n}\n\n/**\n * Function to sort through materials and only return relevant based on param List\n * @param materials Materials to sort through\n * @param paramFilters Filters to apply\n * @returns List of products matching filtering criteria\n */\nexport function applyParamFilters(materials: Product[], filters: MaterialFilterParam[]) {\n const filteredList = materials\n\n // Safety check if no filters are applied\n if (!filters || filters.length === 0) {\n return filteredList\n }\n\n // Go through all materials and check for filter inclusions\n return materials.filter((material) => {\n if (!material)\n return false\n \n return filters.some((filter) => {\n if (!filter.selected)\n return false\n // Helper function to get the property value if its hidden under metaData or similar so we can access directly\n const paramValue = getNestedPropertyValue(material, filter.filterParamter)\n return filter.name.includes(paramValue)\n })\n })\n}\n\n/**\n * Helper function to get nested property value from a string path\n * @param obj The object to extract the value from\n * @param path The path string (e.g., 'metaData.materialType')\n * @returns The value at the specified path or undefined\n */\nexport function getNestedPropertyValue(obj: any, path: string): any {\n return path.split('.').reduce((acc, part) => acc && acc[part], obj);\n}\n\n/**\n * Gets the mapped material and returns a color based on it\n * @param group \n * @returns \n */\nexport function getMappedMaterial(objects: GeometryObject[]) {\n if (objects) {\n const materialNames = objects.map(obj => obj.material?.name)\n const uniqueMaterialNames = [...new Set(materialNames)]\n \n // Check if there are objects without materials to turn the card yellow\n const objectsWithoutMaterials = objects.filter(obj => obj.material == undefined).length > 0\n\n if (uniqueMaterialNames.length === 1) {\n if (uniqueMaterialNames[0] == undefined) {\n return {\n name: \"No material mapped\",\n color: \"red-50\"\n }\n } else {\n return {\n name: uniqueMaterialNames[0],\n color: \"green-50\"\n }\n }\n } else {\n return {\n name: \"Mixed\",\n color: objectsWithoutMaterials? \"yellow-50\" : \"green-50\"\n }\n }\n } else {\n return {\n name: \"No material mapped\",\n color: \"red-50\"\n }\n }\n}\n\n/**\n * Creates a geometry object cube from a product for emission calculations\n * @param product \n * @returns geometryObject consitsting of a material cube\n */\nexport function createGeometryFromProduct(product: Product): GeometryObject {\n // Create base quantity object\n const quantity = {\n m: 1,\n m2: 1,\n m3: 1,\n kg: 1, // TODO: This should be the weight of the product\n pcs: 1,\n tonnes: 0,\n l: 0\n }\n \n if (product.metaData.thickness) {\n quantity.m3 = parseFloat(product.metaData.thickness) / 1000 // unit is in mm\n }\n\n const geo: GeometryObject = {\n id: product.id,\n name: 'type',\n quantity: quantity,\n material: product,\n parameters: {\n // Parameters from assembly creatino add more here if we add more to it\n thickness: product.metaData.thickness ? product.metaData.thickness: \"0\",\n color: product.metaData.color ? product.metaData.color: \"#ffffff\",\n },\n } \n\n return geo\n}\n\n/**\n * Get the assembly list from firebase and update the material store\n */\nexport async function getAssemblyList() {\n const materialStore = useMaterialStore()\n const projectStore = useProjectStore()\n const firebaseStore = useFirebaseStore()\n\n try {\n const assemblyList: AssemblyList = await firebaseStore.fetchAssemblyList(projectStore.currProject.id)\n if (assemblyList) {\n materialStore.assemblies = assemblyList.assemblies\n }\n } catch (error) {\n console.error('Error fetching assembly list:', error)\n }\n}","/**\n * Truncate text down to set length\n * @param text \n * @param maxLength \n * @returns \n */\nexport function truncateText(text, maxLength) {\n if (text.length > maxLength) {\n return text.substring(0, maxLength) + '...'\n }\n return text\n}\n\n/**\n * Returns a text without any dots in them and returning the last text\n * Used for speckleTypes and such to clean them up\n * @param text that should be cleaned \n * @returns cleaned text with last segement included\n */\nexport function getTextAfterLastDot(text: string): string {\n if (typeof text !== 'string') {\n return text\n }\n\n const lastIndex = text.lastIndexOf('.')\n if (lastIndex !== -1) {\n return text.substring(lastIndex + 1)\n }\n return text\n}","import { useResultStore } from '@/stores/result'\nimport { useProjectStore } from '@/stores/main'\nimport { useSettingsStore } from '@/stores/settings'\n\nimport { getNestedPropertyValue } from '@/utils/material'\nimport { DefaultResultList } from '@/models/result'\nimport { getTextAfterLastDot } from '@/utils/stringUtils'\n\nimport type { GroupedResults } from '@/models/result'\nimport type { ChartData, NestedChartData } from '@/models/chartModels'\nimport type { GeometryObject, Quantity } from '@/models/geometryObject'\nimport type { ExtendedImpactCategoryKey, Emission, LifeCycleStageEmission, MetricUnits } from '@/models/material'\nimport type { ResultItem, ResultList } from '@/models/result'\nimport type { ResultsLog } from '@/models/firebase'\n\n/**\n * Converter of geometry object results into aggregated ChartData for specific LifeCycleStages (LCS)\n * @param objects geometry objects to convert\n * @param impactCategory optional impact category to get results for that category\n * @param resultKey optional key to get specific result\n */\nexport function geometryToLCSChartData(objects: GeometryObject[], impactCategory: string = 'gwp', resultKey: number = Number.MIN_SAFE_INTEGER): ChartData[] {\n const groupedData = new Map()\n\n // Go through each selected object and get aggregated labels and emission data\n for (const obj of objects) {\n const results = obj.results\n if (!results) continue\n\n // Check if we got any resultKey otherwise just take the last one\n const result = resultKey === Number.MIN_SAFE_INTEGER ? results[results.length - 1] : results[resultKey]\n if (!result || !result.emission) continue\n\n for (const lifeCycleStage in result.emission[impactCategory]) {\n const currentValue = groupedData.get(lifeCycleStage) || 0\n groupedData.set(lifeCycleStage, currentValue + result.emission[impactCategory][lifeCycleStage])\n }\n }\n\n const data: ChartData[] = Array.from(groupedData, ([lifeCycleStage, value]) => ({\n label: lifeCycleStage,\n value: Math.round(value)\n }))\n\n return data\n}\n\n/**\n * Converts a ResultItem into a list of ChartData with only lifecycle stages information\n * @param resultItem ResultItem to convert\n * @returns ChartData array for use with charts such as stackedBar\n */\nexport function resultItemToLCSChartData(resultItem: ResultItem): ChartData[] {\n const settingsStore = useSettingsStore()\n const impactCategory = settingsStore.calculationSettings.standardImpactCategory\n const groupedData = new Map()\n\n if (!resultItem?.data) return []\n // Go through each selected object and get aggregated labels and emission data\n for (const groupedResult of resultItem.data) {\n groupedResultToLCSChartData(groupedResult, groupedData, impactCategory)\n }\n\n const data: ChartData[] = Array.from(groupedData, ([material, { value, ids }]) => ({\n label: material,\n value: Math.round(value),\n ids: ids\n }))\n\n return data\n}\n\n/**\n * Converts a ResultItem into a list of ChartData\n * @param resultItem ResultItem to convert\n * @returns ChartData array for use with charts such as pie, bar chart etc\n */\nexport function resultItemToChartData (resultItem: ResultItem): ChartData[] {\n const settingsStore = useSettingsStore()\n const impactCategory = settingsStore.calculationSettings.standardImpactCategory\n const groupedData = new Map()\n\n if (!resultItem?.data) return []\n // Go through each selected object and get aggregated labels and emission data\n for (const groupedResult of resultItem.data) {\n groupedResultToChartData(groupedResult, groupedData, impactCategory)\n }\n \n const data: ChartData[] = Array.from(groupedData, ([material, { value, ids }]) => ({\n label: material,\n value: Math.round(value),\n ids: ids\n }))\n\n return data\n}\n\n/**\n * Converts a ResultItem into a list of NestedChartData\n * The top-level resultItem is transformed into an array of NestedChartData:\n * @param resultItem ResultItem to convert\n * @returns NestedChartData array for use with charts such as diverging stacked bar chart\n */\nexport function resultItemToNestedChartData (resultItem: ResultItem): NestedChartData[] {\n const settingsStore = useSettingsStore()\n const impactCategory = settingsStore.calculationSettings.standardImpactCategory\n \n if (!resultItem?.data) return []\n\n const nestedChartData: NestedChartData[] = []\n\n for (const groupedResult of resultItem.data) {\n // For each top-level grouped result, we gather its ChartData\n const topLevelData = new Map()\n groupedResultToChartData(groupedResult, topLevelData, impactCategory)\n\n // If no nested data, we can still return a NestedChartData with just the top-level data\n if (!groupedResult.nested || groupedResult.nested.length === 0) {\n const topLevelArray: ChartData[] = Array.from(topLevelData, ([label, { value, ids }]) => ({\n label: label,\n value: Math.round(value),\n ids: ids\n }))\n \n nestedChartData.push({\n label: getTextAfterLastDot(groupedResult.parameter),\n value: topLevelArray\n })\n continue\n }\n \n // Add nested results\n const nestedDataArray: ChartData[] = []\n\n for (const nestedResult of groupedResult.nested) {\n const nestedResultMap = new Map()\n groupedResultToChartData(nestedResult, nestedResultMap, impactCategory)\n\n // Each nested result might have multiple entries, append them:\n for (const [label, data] of nestedResultMap) {\n nestedDataArray.push({\n label,\n value: Math.round(data.value),\n ids: data.ids\n })\n }\n }\n\n nestedChartData.push({\n label: getTextAfterLastDot(groupedResult.parameter),\n value: nestedDataArray\n })\n }\n\n return nestedChartData\n}\n\n/**\n * Helper function to convert a single grouped result into a chart data\n * @param groupedResult Grouped result to convert\n * @param groupedData Map to store the grouped data\n * @param impactCategory Impact category to get results for\n */\nfunction groupedResultToChartData(groupedResult: GroupedResults, groupedData: Map, impactCategory: ExtendedImpactCategoryKey): void {\n let objectName = groupedResult.parameter\n const emissionData = groupedResult.data.emission\n\n if (!objectName || !emissionData) return null\n\n // Fix for Speckletype names\n if ((objectName.split('.').length - 1) > 2 )\n objectName = getTextAfterLastDot(objectName)\n\n if (!groupedData.has(objectName)) {\n const entry: ChartData = {\n label: objectName,\n value: 0,\n ids: []\n }\n groupedData.set(objectName, entry)\n }\n\n const materialData = groupedData.get(objectName)!\n\n for (const lifeCycleStage in groupedResult.data.emission[impactCategory]) {\n materialData.value += groupedResult.data.emission[impactCategory][lifeCycleStage]\n }\n\n materialData.ids.push(... groupedResult.data.geoId) \n}\n\n\n/**\n * Helper function to convert a single grouped result into a chart data for lifecycle stages\n * @param groupedResult Grouped result to convert\n * @param groupedData Map to store the grouped data\n * @param impactCategory Impact category to get results for\n */\nfunction groupedResultToLCSChartData(groupedResult: GroupedResults, groupedData: Map, impactCategory: ExtendedImpactCategoryKey): void {\n const emissionData = groupedResult.data.emission\n\n if (!emissionData) return null\n\n for (const lifeCycleStage in groupedResult.data.emission[impactCategory]) {\n if (!groupedData.has(lifeCycleStage)) {\n const entry: ChartData = {\n label: lifeCycleStage,\n value: 0,\n ids: []\n }\n groupedData.set(lifeCycleStage, entry)\n }\n\n const materialData = groupedData.get(lifeCycleStage)!\n\n materialData.value += groupedResult.data.emission[impactCategory][lifeCycleStage]\n materialData.ids.push(... groupedResult.data.geoId) \n }\n}\n\n/**\n * Creates a result list from the given objects and then find the relevant parameter and makes it into chart data\n * @param objects Geoobject with reuslts on them\n * @param chartParameter Parameter to convert into chartdata\n * @returns Chartdata for given parameter\n */\nexport function geometryToChartData(objects: GeometryObject[], chartParameter: string, LCSData: boolean = false): ChartData[] {\n // Create result aggregator and calculator\n const resCalc = new ResultCalculator(objects)\n resCalc.aggregate(false, true)\n \n const resultItem = resCalc.resultList.find((item) => item.parameter === chartParameter)\n\n // If we are calculating for LCS, we need to convert the data differently\n if (LCSData) \n return resultItemToLCSChartData(resultItem)\n \n return resultItemToChartData(resultItem)\n}\n\n/**\n * Creates a result list from the given objects and then find the relevant parameter and makes it into nested chart data\n * @param objects Geoobject with reuslts on them\n * @param chartParameter Parameter to convert into nested chartdata\n * @returns Nested chartdata for given parameter\n */\nexport function geometryToNestedChartData(objects: GeometryObject[], chartParameter: string): NestedChartData[] {\n // Create result aggregator and calculator\n const resCalc = new ResultCalculator(objects)\n resCalc.aggregate(false, true)\n \n const resultItem = resCalc.resultList.find((item) => item.parameter === chartParameter)\n\n return resultItemToNestedChartData(resultItem)\n}\n\n/**\n * Returns number of total emission in co2 eq for a given emission object with all relevant phases and categories from settings\n * @param emission Emission object to convert to number\n * @returns Number for category and included phases in settings\n */\nexport function emissionToNumber(emission: Emission): number {\n const settingsStore = useSettingsStore()\n const impactCategory = settingsStore.calculationSettings.standardImpactCategory\n const includedPhases = settingsStore.calculationSettings.includedStages\n \n let total = 0\n\n // Only go through relevant ImpactCategory\n for (const phase in emission[impactCategory]) {\n // Find the relevant stage object for the current phase\n const relevantStage = includedPhases.relevantStages.find(\n (stageObj) => stageObj.stage === phase\n )\n \n // If the stage exists and is included, add its emission to the total\n if (relevantStage && relevantStage.included) {\n total += emission[impactCategory][phase]\n }\n } \n\n return total\n}\n\n/**\n * Returns emission object from a resultLog\n * @param resultLog ResultLog to get emission from, this comes from Firebase\n * @param parameter Paramater to get emissions for, e.g. 'parameter.category', 'parameter.speckleType'\n * @returns returns summed up emissions for the parameter\n */\nexport function getResultLogEmissions(resultLog: ResultsLog, parameter: string): Emission {\n const resItem = resultLog.resultList.find((item: ResultItem) => item.parameter === parameter)\n\n const emissionList = extractEmissionsFromResultItem(resItem)\n \n return sumEmissions(emissionList)\n}\n\nexport function extractEmissionsFromResultItem(resultItem: ResultItem): Emission[] {\n return resultItem.data.map(groupedResult => groupedResult.data.emission)\n}\n\nexport function sumEmissions(emissions: Emission[]): Emission {\n return emissions.reduce((accumulatedEmission, currentEmission) => {\n return addEmissions(accumulatedEmission, currentEmission)\n }, {})\n}\n\n/**\n * Simple function to add two emissions together\n * @param a Emission to add to\n * @param b Emission to add from\n * @returns Emission with added values\n */\nexport function addEmissions(a: Emission, b: Emission): Emission {\n const result: Emission = {}\n\n const mergeIntoResult = (source: Emission) => {\n for (const impactCategory in source) {\n if (!result[impactCategory]) {\n result[impactCategory] = {}\n }\n\n for (const phase in source[impactCategory]) {\n result[impactCategory][phase] =\n (result[impactCategory][phase] || 0) + (source[impactCategory][phase] || 0)\n }\n }\n }\n mergeIntoResult(a)\n mergeIntoResult(b)\n\n return result\n}\n\n/**\n * Simple function to add two quantities together\n * @param a Quantity to add to\n * @param b Quantity to add from\n * @returns Quantity with added values\n */\nexport function addQuantity(a: Quantity, b: Quantity): Quantity {\n const result: Quantity = {}\n // Find unique keys in a and b\n const allKeys = new Set([...Object.keys(a || {}) as MetricUnits[], ...Object.keys(b || {}) as MetricUnits[]])\n \n for (const key of allKeys) {\n result[key] = (a[key] || 0) + (b[key] || 0)\n }\n return result\n}\n\n/**\n * Aggregates a series of emissions on either whole project or just selection\n */\nexport class ResultCalculator {\n private geos: GeometryObject[] = []\n private resultStore = useResultStore()\n public totalEmission: Emission = {}\n // Decouple from original list\n public resultList: ResultList = DefaultResultList.map(item => ({\n ...item,\n data: [],\n }))\n\n /**\n * @param geos Geometry objects to aggregate emissions on if left empty it will do it on whole project\n */\n constructor(geos: GeometryObject[] = []) {\n this.geos = geos\n // If no geometry sent do it on whole project\n if (geos.length === 0) {\n const projectStore = useProjectStore()\n if (projectStore.currProject) {\n this.geos = projectStore.currProject.geometry\n }\n }\n }\n\n // Main function to aggregate emissions\n public aggregate(save: Boolean = true, calcResultList = true): void {\n this.geos.forEach(geo => {\n if (geo.results) {\n this.aggregateTotalEmissions(geo.results[geo.results.length - 1].emission)\n if (calcResultList) {\n this.aggregateEmissionsForResultList(geo)\n }\n }\n })\n\n if (save)\n this.saveResults()\n }\n\n // Get the total emission\n private aggregateTotalEmissions(emission: Emission): void {\n for (const impactCategory in emission) {\n if (!this.totalEmission[impactCategory]) {\n this.totalEmission[impactCategory] = {} as LifeCycleStageEmission\n }\n for (const phase in emission[impactCategory]) {\n if (!this.totalEmission[impactCategory][phase]) {\n this.totalEmission[impactCategory][phase] = { amount: 0 }\n }\n const emissionAmount = emission[impactCategory][phase] || 0\n const currentTotal = this.totalEmission[impactCategory][phase] || 0\n this.totalEmission[impactCategory][phase] = currentTotal + emissionAmount\n }\n }\n }\n\n private aggregateEmissionsForResultList(geo: GeometryObject): void {\n for (const index in this.resultList) {\n // Parameter to aggregate on\n const parameter = this.resultList[index].parameter\n const paramValue = getNestedPropertyValue(geo, parameter)\n if (paramValue) {\n // Get latest result\n const geoEmission = geo.results[geo.results.length - 1].emission\n const geoQuantity = geo.quantity\n\n const paramItem = this.resultList[index]\n\n if (!paramItem.data) {\n paramItem.data = []\n }\n\n // Find the parameter in the list\n let groupedResult = paramItem.data.find((result) => result.parameter === paramValue)\n\n if (!groupedResult) {\n groupedResult = {\n parameter: paramValue,\n quantity: geoQuantity,\n data: {\n emission: {} as Emission,\n geoId: [],\n }\n }\n paramItem.data.push(groupedResult)\n }\n\n // Add emissions together\n groupedResult.data.emission = addEmissions(\n groupedResult.data.emission,\n geoEmission\n )\n\n // Add quantities together\n groupedResult.quantity = addQuantity(\n groupedResult.quantity, \n geoQuantity\n )\n\n // Add geoId to list if not already there\n if (!groupedResult.data.geoId.includes(geo.id)) {\n groupedResult.data.geoId.push(geo.id)\n }\n\n this.aggregateLifeCycleStages(groupedResult)\n }\n }\n }\n\n /**\n * Aggregate emissions into a nested ResultItem by life cycle stages.\n */\n private aggregateLifeCycleStages(\n groupedResult: GroupedResults,\n ): void {\n // Ensure nested structure exists\n if (!groupedResult.nested) {\n groupedResult.nested = []\n }\n\n const aggregatedEmission = groupedResult.data.emission\n // Iterate through each impact category in the aggregated emission\n for (const impactCategoryKey in aggregatedEmission) {\n const categoryEmission = aggregatedEmission[impactCategoryKey]\n if (!categoryEmission) continue\n\n // For each life cycle stage in this category\n for (const stageKey in categoryEmission) {\n const stageValue = categoryEmission[stageKey]\n\n let stageGrouped = groupedResult.nested.find(\n (group) => group.parameter === stageKey\n )\n\n if (!stageGrouped) {\n stageGrouped = {\n parameter: stageKey,\n quantity: { m:0 }, \n data: {\n emission: {} as Emission,\n geoId: []\n }\n }\n groupedResult.nested.push(stageGrouped)\n }\n\n // Initialize this category and stage if it doesn't exist\n if (!stageGrouped.data.emission[impactCategoryKey]) {\n stageGrouped.data.emission[impactCategoryKey] = {}\n }\n\n // Aggregate the emission for this stage\n stageGrouped.data.emission[impactCategoryKey][stageKey] =\n (stageGrouped.data.emission[impactCategoryKey][stageKey] ?? 0) + stageValue\n\n // Add geoId to list if not already there\n if (groupedResult.data.geoId.length === 0) {\n groupedResult.data.geoId.push(... groupedResult.data.geoId)\n }\n }\n }\n }\n \n private saveResults(): void {\n this.resultStore.setResultList(this.resultList)\n }\n}\n","import type { NestedGroup, Filter, Group } from '@/models/filters'\nimport type { GeometryObject } from '@/models/geometryObject'\n\nimport { useProjectStore } from '@/stores/main'\nimport { useResultStore } from '@/stores/result'\nimport { useSettingsStore } from '@/stores/settings'\nimport { \n baseColors, \n getValueColorFromGradient,\n ColorManager \n} from '@/utils/colorUtils'\nimport { \n ResultCalculator,\n extractEmissionsFromResultItem,\n sumEmissions,\n emissionToNumber\n} from '@/utils/resultUtils'\n\n/**\n * Creates a nested object from an array of Group objects.\n * Each Group object represents a path, and the function creates a nested structure based on the paths.\n * The resulting nested object contains the total number of objects at each level of the hierarchy.\n *\n * @param data An array of Group objects representing the paths.\n * @returns A NestedGroup object representing the nested structure.\n */\nexport function createNestedObject(data: Group[]): NestedGroup {\n const nestedObject: NestedGroup = {\n name: 'root',\n objects: [],\n id: crypto.randomUUID(),\n children: [],\n }\n\n data.forEach(entry => {\n let currentLevel = nestedObject\n\n //TODO Change this to map instead for performance so we dont use find\n entry.path.forEach(level => {\n let existingLevel = currentLevel.children.find(\n child => child.name === level\n )\n\n if (!existingLevel) {\n existingLevel = {\n color: entry.color, \n name: level, \n objects: [], \n id: entry.id,\n children: [] \n }\n currentLevel.children.push(existingLevel)\n }\n\n existingLevel.objects.push(...entry.elements)\n currentLevel = existingLevel\n })\n })\n\n return nestedObject\n}\n\n/**\n * Calculate the groups based on the filters and the project\n * @param reCalc \n */\nexport function updateProjectGroups(reCalc: boolean) {\n const projectStore = useProjectStore()\n let groups: Group[] = []\n // First time running we need to define the groups from scratch\n if (reCalc) {\n //Create geometry objects from the project\n const geo: GeometryObject[] = []\n projectStore.currProject?.geometry.forEach((element) => {\n geo.push(element)\n })\n\n //Root for the group, this should not be needed\n groups = [\n {\n id: 'test',\n name: 'root',\n path: ['root'],\n elements: geo,\n color: 'hsl(151, 100%, 50%)'\n }\n ]\n\n //Go through each filter and iterate over them\n let reverseStack: Filter[] = []\n if (projectStore.filterRegistry)\n reverseStack = projectStore.filterRegistry.filterCallStack.callStack\n\n reverseStack.forEach((el) => {\n if (el.value) {\n groups = projectStore.filterRegistry?.callFilter(\n `${el.name}`,\n groups,\n `${el.field}`,\n `${el.value}`,\n el.remove\n )\n } else {\n groups = projectStore.filterRegistry?.callFilter(\n `${el.name}`,\n groups,\n `${el.field}`\n )\n }\n\n //Remove root in path since we had to add it\n groups.forEach((element) => {\n if (element.path[0] === 'root') element.path.splice(0, 1)\n })\n })\n } else {\n if (projectStore.projectGroups) {\n groups = projectStore.projectGroups\n }\n }\n\n groups.sort((a, b) => b.elements.length - a.elements.length)\n\n //Update groups\n projectStore.updateGroups(groups)\n}\n\n/**\n* Updates the colors of the groups in the project\n* Autmatically setting all colors, optional to change specific ones\n* @param id Optional: Ids of groups to change\n* @param color Optional: colors to change to\n*/\nexport function updateGroupColors(\n tree: NestedGroup[],\n id: string[] = [],\n color: string[] = []\n): void {\n const colorMngr = new ColorManager()\n const colors = colorMngr.getMostDistinctColors(tree.length > 0 ? tree.length : 1)\n tree.map((group, index) => {\n if (id.includes(group.id)) {\n tree[index].color = color[id.indexOf(group.id)]\n } else {\n tree[index].color = colors[index]\n }\n })\n}\n\n\n/**\n * Set the color based on results, if no object is provided it will set all objects in the project\n * @param objects optional for specfic material updates\n * @param colorRange optional number of steps of colors in the gradient\n * @returns gradient groups with increments for results\n */\nexport function setResultsColorGroup(objects: GeometryObject[] = null, colorRange: number = 10) {\n const projectStore = useProjectStore()\n const groups: { objectIds: string[], color: string }[] = []\n\n //Create all colorRange groups including no results\n const neutralGroup: { objectIds: string[], color: string } = \n { objectIds: [], color: baseColors.primaryGrey }\n\n if (!objects) {\n //Get all objects from the project\n const groups = projectStore.projectGroups\n if (groups) {\n groups.forEach(group => {\n group.elements.forEach(element => {\n assignColorGroup(element)\n })\n })\n }\n } else {\n objects.forEach((element) => {\n assignColorGroup(element)\n })\n }\n \n //Add groups to main\n groups.push(neutralGroup)\n\n return groups\n\n function assignColorGroup(object: GeometryObject) {\n const settingsStore = useSettingsStore()\n const resultStore = useResultStore()\n \n if (object && object.results) {\n // Calculate the resultlist for the object\n // TODO: Check if this is super inefficient nice to have it gathered into one function for all results\n const resCalc = new ResultCalculator([object])\n resCalc.aggregate(false)\n\n // Find the result for the active parameter\n const resItem = resCalc.resultList.find((item) => item.parameter === 'material.name')\n \n // Extract emissions from the result\n const emissionList = extractEmissionsFromResultItem(resItem)\n const emission = sumEmissions(emissionList)\n\n // We use a log10 scale, I think it makes sense\n const sizeFactor = object ? Math.log10(object.quantity.m2 + 1) : 1\n const normalisedEmissions = (emissionToNumber(emission) / object.quantity.m2) * sizeFactor\n //Calculate the color based on the gwp value\n const color = getValueColorFromGradient(normalisedEmissions, 0, 200)\n groups.push({ objectIds: [object.id], color: color })\n } else {\n //No result mapped set color to grey\n neutralGroup.objectIds.push(object.id)\n }\n }\n}\n\n/**\n * Set the color of the material based on if it is mapped or not, if no object is provided it will set all objects in the project\n * @param object optional for specifik material updates\n * @returns greenGroup and redGroup with objectIds and color\n */\nexport function setMappingColorGroup(objects: GeometryObject[] = null) {\n const projectStore = useProjectStore()\n //Create two groups for the mapping colors, one red and one green and move objects between them to match if mapped materials or not\n const greenGroup: { objectIds: string[], color: string } = \n { objectIds: [], color: baseColors.primaryGreen }\n const redGroup: { objectIds: string[], color: string } =\n { objectIds: [], color: baseColors.primaryRed }\n\n if (!objects) {\n //Get all objects from the project\n const groups = projectStore.projectGroups\n if (groups) {\n groups.forEach(group => {\n group.elements.forEach(element => {\n assignColorGroup(element)\n })\n })\n }\n } else {\n objects.forEach((element) => {\n assignColorGroup(element)\n })\n }\n \n return [ greenGroup, redGroup ]\n\n function assignColorGroup(object: GeometryObject) {\n //Check if we have a material to map\n if (object && object.material) {\n //Add the object to the green group\n greenGroup.objectIds.push(object.id)\n } else {\n //No material mapped\n redGroup.objectIds.push(object.id)\n }\n }\n}","import { defineStore } from 'pinia'\nimport type { GeometryObject } from '@/models/geometryObject'\nimport type { Project } from '@/models/project'\nimport type {\n\tFilterRegistry,\n\tGroup,\n\tFilter,\n\tNestedGroup\n} from '@/models/filters'\nimport type { Results } from '@/models/result'\n\nimport { createNestedObject } from '@/utils/projectUtils'\nimport { logMessageToSentry } from '@/utils/monitoring'\nimport { collectParameters } from '@/utils/dataUtils'\n\n\n/**\n * Defines the project store, which contains the current project and its geometry and results.\n * TODO: Restructure this and create a seperate speckleViewer store\n */\nexport const useProjectStore = defineStore({\n\tid: 'projectStore',\n\tstate: () => {\n\t\treturn {\n\t\t\tcurrProject: null as Project | null, // The current project being worked on\n\t\t\tprojectGroups: null as Group[] | null, // Groups that have been created for geometry objects\n\t\t\tfilterRegistry: null as FilterRegistry | null, // Filterregistry with current filters and filterCallStack\n\t\t\tselectedGroup: null as NestedGroup | null, // NestedGroup that is currently selected\n\t\t\tselectedObjects: [] as GeometryObject[], // GeometryObjects that are currently selected\n\t\t\thighlightedLabel: null as string | null, // Label that is currently highlighted\n\t\t\thiddenObjects: [] as GeometryObject[], // GeometryObjects that are currently hidden\n\t\t}\n\t},\n\tactions: {\n\t\t/**\n\t\t * Creates a new project.\n\t\t * @param project The project to create.\n\t\t */\n\t\tcreateNewProject(project: Project) {\n\t\t\tthis.currProject = project\n\t\t},\n\n\t\t/**\n\t\t * Creates or updated the current groups set on the project\n\t\t * @param groups\n\t\t */\n\t\tupdateGroups(groups: Group[]) {\n\t\t\tthis.projectGroups = groups\n\t\t},\n\n\t\t/**\n\t\t * Update a specific group by id with a new name and base path\n\t\t * @param name name to change to\n\t\t * @param id id of group to change\n\t\t */\n\t\tupdateGroupName(name: string, id: string) {\n\t\t\tif (this.projectGroups) {\n\t\t\t\tconst foundObject = this.projectGroups.find((obj) => obj.id === id)\n\t\t\t\tif (foundObject) {\n\t\t\t\t\tfoundObject.name = name\n\t\t\t\t\tfoundObject.path[0] = name\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log('Object with the provided ID not found.')\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Removes a group from the project with id reference\n\t\t * @param id if of group to remove\n\t\t */\n\t\tremoveGroup(id: string) {\n\t\t\tif (this.projectGroups) {\n\t\t\t\tconst foundIndex = this.projectGroups.findIndex((obj) => obj.id === id)\n\t\t\t\tif (foundIndex > -1) {\n\t\t\t\t\t//Filter used when splicing it doesnt update the watchers\n\t\t\t\t\tthis.projectGroups = this.projectGroups.filter(\n\t\t\t\t\t\t(element, index) => index != foundIndex\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('Object with the provided ID not found.')\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Adds a group to the project store\n\t\t * @param group group to add to store\n\t\t */\n\t\taddGroup(group: Group) {\n\t\t\tif (this.projectGroups) {\n\t\t\t\tthis.projectGroups.push(group)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Updates the current project.\n\t\t * @param project The project to update.\n\t\t */\n\t\tupdateProject(project: Project) {\n\t\t\tthis.currProject = project\n\t\t},\n\n\t\t/**\n\t\t * Update store with current filter registry\n\t\t * @param registry The registry to update to\n\t\t */\n\t\tsetFilterRegistry(registry: FilterRegistry) {\n\t\t\tthis.filterRegistry = registry\n\t\t},\n\n\t\t/**\n\t\t * Update store with new filter callstack with\n\t\t * names and values\n\t\t * @param callStack list of Filters\n\t\t */\n\t\tupdateRegistryStack(name: string, callStack: Filter[]) {\n\t\t\tif (this.filterRegistry)\n\t\t\t\tthis.filterRegistry.filterCallStack = {\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tname: name,\n\t\t\t\t\tcallStack: callStack\n\t\t\t\t}\n\t\t\t\t\n\t\t},\n\n\t\t/**\n\t\t * Get current filter registry call stack and returns a array of\n\t\t * filters that are within it\n\t\t * @returns Array of filters with keyvalues for the current filtering\n\t\t */\n\t\tgetRegistryStack(): Filter[] {\n\t\t\tif (this.filterRegistry !== null)\n\t\t\t\treturn this.filterRegistry.filterCallStack.callStack\n\t\t\telse\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'No filters founds',\n\t\t\t\t\t\tfield: 'No filters founds',\n\t\t\t\t\t\tvalue: 'No filters founds'\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t},\n\n\t\t/**\n\t\t * Get current filter names available in active registry\n\t\t * @returns array of available filter names\n\t\t */\n\t\tgetFilterNames() {\n\t\t\tif (this.filterRegistry !== null)\n\t\t\t\treturn this.filterRegistry.getFilterNames()\n\t\t\telse return ['No filters founds']\n\t\t},\n\n\t\t/**\n\t\t * Goes through geometry objects and returns list of parameters available\n\t\t * to filter project with\n\t\t * TODO: Run this lazy on load of projects\n\t\t * @returns array of available parameters\n\t\t */\n\t\tgetAvailableParameterList() {\n\t\t\tif (this.currProject) {\n\t\t\t\tconst parameterSet: Set = new Set()\n\t\t\t\tthis.currProject.geometry.forEach((geo) => {\n\t\t\t\t\tcollectParameters(geo.parameters, parameterSet)\n\n\t\t\t\t\tObject.keys(geo.quantity).forEach((key) => {\n\t\t\t\t\t\tconst quantityKey = key as keyof typeof geo.quantity\n\t\t\t\t\t\tif (geo.quantity[quantityKey] !== 0 && geo.quantity[quantityKey] !== null) {\n\t\t\t\t\t\t\tparameterSet.add(key)\n\t\t\t\t\t\t\tgeo.parameters[key] =\n\t\t\t\t\t\t\t\tgeo.quantity[key as keyof typeof geo.quantity].toString()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\treturn Array.from(parameterSet)\n\t\t\t} else {\n\t\t\t\treturn ['No parameters found']\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Adds a geometry object to the current project.\n\t\t * @param geometryObject The geometry object to add.\n\t\t */\n\t\taddGeometry(geometryObject: GeometryObject) {\n\t\t\tthis.currProject?.geometry.push(geometryObject)\n\t\t},\n\n\t\t/**\n\t\t * Removes a geometry object from the current project.\n\t\t * @param id The ID of the geometry object to remove.\n\t\t */\n\t\tremoveGeometry(id: string) {\n\t\t\tconst index = this.findGeometryIndexById(id)\n\n\t\t\tif (index === -1) return\n\n\t\t\tif (index != undefined) this.currProject?.geometry.splice(index, 1)\n\t\t},\n\n\t\t/**\n\t\t * Updates a geometry object in the current project.\n\t\t * @param payload The updated geometry object.\n\t\t * @param id The ID of the geometry object to update.\n\t\t */\n\t\tupdateGeometry(payload: GeometryObject, id: string) {\n\t\t\tif (!id || !payload || this.currProject === null) return\n\n\t\t\tconst index = this.findGeometryIndexById(id)\n\n\t\t\tif (index !== -1 && index != undefined)\n\t\t\t\tthis.currProject.geometry[index] = payload\n\t\t},\n\n\t\t/**\n\t\t * Get the geometry object by ID\n\t\t * @param id The ID of the geometry object to get.\n\t\t * @returns The geometry object with the provided ID.\n\t\t */\n\t\tgetGeometryObjectById(id: string) {\n\t\t\tif (this.currProject) {\n\t\t\t\treturn this.currProject.geometry.find((obj) => obj.id === id)\n\t\t\t} else {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Returns nested group\n\t\t * @param id \n\t\t * @returns \n\t\t */\n\t\tgetGroupById(id: string): Group | null{\n\t\t\tif (this.projectGroups) {\n\t\t\t\treturn this.projectGroups.find((group) => group.id === id)\n\t\t\t} else {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Adds results to the current project.\n\t\t * @param result The results to add.\n\t\t */\n\t\taddResults(result: Results) {\n\t\t\tif (this.currProject?.results != null)\n\t\t\t\tthis.currProject.results.push(result)\n\t\t\telse if (this.currProject != null) this.currProject.results = [result]\n\t\t},\n\n\t\t/**\n\t\t * Updates results in the current project.\n\t\t * @param payload The updated results.\n\t\t * @param id The ID of the results to update.\n\t\t */\n\t\tupdateResults(payload: Results, id: string) {\n\t\t\tif (!id || !payload || this.currProject === undefined) return\n\n\t\t\tconst index = this.findResultIndexById(id)\n\n\t\t\tif (\n\t\t\t\tindex !== -1 &&\n\t\t\t\tindex != undefined &&\n\t\t\t\tthis.currProject?.results != null\n\t\t\t)\n\t\t\t\tthis.currProject.results[index] = payload\n\t\t},\n\n\t\t/**\n\t\t * Set the highlighted label in the project\n\t\t * @param label\n\t\t */\n\t\tsetHighlightedLabel(label: string) {\n\t\t\tthis.highlightedLabel = label\n\t\t},\n\n\t\t/**\n\t\t * Set the selected group in the project\n\t\t * @param group\n\t\t * @returns\n\t\t */\n\t\tsetSelectedGroup(group: NestedGroup) {\n\t\t\tthis.selectedGroup = group\n\t\t\tthis.setObjectsFromGroup()\n\t\t},\n\n\t\t/**\n\t\t * set selected objects from the selected group\n\t\t * Can be used to reset selection\n\t\t */\n\t\tsetObjectsFromGroup() {\n\t\t\tthis.selectedObjects = []\n\t\t\t//if null just return\n\t\t\tif (this.selectedGroup === null) return\n\n\t\t\tconst group = this.selectedGroup\n\t\t\tgroup.objects.forEach(element => {\n\t\t\t\tthis.selectedObjects?.push(element)\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Set the selected objects in the project\n\t\t * @param objects\n\t\t */\n\t\tsetSelectedObjects(objects: GeometryObject[]) {\n\t\t\tthis.selectedObjects = objects\n\t\t},\n\n\t\t/**\n\t\t * Set the selected objects in the project by URI\n\t\t * @param uri\n\t\t */\n\t\tsetObjectsByURI(uri: string[]) {\n\t\t\tconst objects = this.currProject.geometry\n\t\t\tconst foundObjects = objects?.filter((obj) => {\n\t\t\t\treturn uri.includes(obj.URI as string)\n\t\t\t})\n\t\t\tthis.selectedObjects = foundObjects\n\t\t},\n\n\t\t/**\n\t\t * Set the selected objects to a subset of current selected objects by ID\n\t\t * Only searching current selected objects but if we need we can expand to whole project\n\t\t * @param id ids of objects to select\n\t\t */\n\t\tsetObjectsById(id: string[]) {\n\t\t\tconst objects = this.currProject.geometry\n\t\t\tconst foundObjects = objects?.filter((obj) => {\n\t\t\t\treturn id.includes(obj.id)\n\t\t\t})\n\t\t\tthis.selectedObjects = foundObjects\n\t\t},\n\n\t\t/**\n\t\t * Clear the selected objects in the project\n\t\t */\n\t\tclearSelectedObjects() {\n\t\t\tthis.selectedObjects = []\n\t\t},\n\n\t\t/**\n\t\t * Clear the selected group and objects in the project\n\t\t */\n\t\tclearSelectedGroup() {\n\t\t\tthis.selectedGroup = null\n\t\t\tthis.selectedObjects = []\n\t\t},\n\n\t\t/**\n\t\t * returns only the URI of the selected objects in the project\n\t\t * @returns \n\t\t */\n\t\tgetSelectedObjectsURI() {\n\t\t\tif (this.selectedObjects) {\n\t\t\t\treturn this.selectedObjects.map((obj) => obj.URI as string)\n\t\t\t} else {\n\t\t\t\treturn []\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Returns tree structure of current filter groupings in the project\n\t\t */\n\t\tgetGroupTree() {\n\t\t\tif (this.projectGroups) {\n\t\t\t\tconst data = this.projectGroups\n\n\t\t\t\t// Creating the nested object\n\t\t\t\tconst nestedObject = createNestedObject(data)\n\t\t\t\t// Sorting the nested object by the number of objects in each group\n\t\t\t\tnestedObject.children.sort((a, b) => b.objects.length - a.objects.length)\n\t\t\t\treturn nestedObject\n\t\t\t} else {\n\t\t\t\tconst msg =\n\t\t\t\t\t'No groups found to create tree structure in current project.'\n\t\t\t\tlogMessageToSentry(msg, 'info')\n\t\t\t\tconsole.log(msg)\n\t\t\t}\n\n\t\t\t// Add a return statement here\n\t\t\treturn null\n\t\t},\n\n\t\t/**\n\t\t * Finds the index of a geometry object in the current project by its ID.\n\t\t * @param id The ID of the geometry object to find.\n\t\t * @returns The index of the geometry object, or -1 if not found.\n\t\t */\n\t\tfindGeometryIndexById(id: string) {\n\t\t\treturn this.currProject?.geometry.findIndex((item) => item.id === id)\n\t\t},\n\n\t\t/**\n\t\t * Finds the index of results in the current project by its ID.\n\t\t * @param id The ID of the results to find.\n\t\t * @returns The index of the results, or -1 if not found.\n\t\t */\n\t\tfindResultIndexById(id: string) {\n\t\t\treturn this.currProject?.geometry.findIndex((item) => item.id === id)\n\t\t},\n\t}\n})\n","\n\n\n\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","\n\n","export default \"__VITE_ASSET__d4174b6c__\"","\n\n\n","\n\n\n","\n\n\n","\n\n\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M6.32 2.577a49.255 49.255 0 0 1 11.36 0c1.497.174 2.57 1.46 2.57 2.93V21a.75.75 0 0 1-1.085.67L12 18.089l-7.165 3.583A.75.75 0 0 1 3.75 21V5.507c0-1.47 1.073-2.756 2.57-2.93Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"m15 1.784-.796.795a1.125 1.125 0 1 0 1.591 0L15 1.784ZM12 1.784l-.796.795a1.125 1.125 0 1 0 1.591 0L12 1.784ZM9 1.784l-.796.795a1.125 1.125 0 1 0 1.591 0L9 1.784ZM9.75 7.547c.498-.021.998-.035 1.5-.042V6.75a.75.75 0 0 1 1.5 0v.755c.502.007 1.002.021 1.5.042V6.75a.75.75 0 0 1 1.5 0v.88l.307.022c1.55.117 2.693 1.427 2.693 2.946v1.018a62.182 62.182 0 0 0-13.5 0v-1.018c0-1.519 1.143-2.829 2.693-2.946l.307-.022v-.88a.75.75 0 0 1 1.5 0v.797ZM12 12.75c-2.472 0-4.9.184-7.274.54-1.454.217-2.476 1.482-2.476 2.916v.384a4.104 4.104 0 0 1 2.585.364 2.605 2.605 0 0 0 2.33 0 4.104 4.104 0 0 1 3.67 0 2.605 2.605 0 0 0 2.33 0 4.104 4.104 0 0 1 3.67 0 2.605 2.605 0 0 0 2.33 0 4.104 4.104 0 0 1 2.585-.364v-.384c0-1.434-1.022-2.7-2.476-2.917A49.138 49.138 0 0 0 12 12.75ZM21.75 18.131a2.604 2.604 0 0 0-1.915.165 4.104 4.104 0 0 1-3.67 0 2.605 2.605 0 0 0-2.33 0 4.104 4.104 0 0 1-3.67 0 2.605 2.605 0 0 0-2.33 0 4.104 4.104 0 0 1-3.67 0 2.604 2.604 0 0 0-1.915-.165v2.494c0 1.035.84 1.875 1.875 1.875h15.75c1.035 0 1.875-.84 1.875-1.875v-2.494Z\" })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M6.32 1.827a49.255 49.255 0 0 1 11.36 0c1.497.174 2.57 1.46 2.57 2.93V19.5a3 3 0 0 1-3 3H6.75a3 3 0 0 1-3-3V4.757c0-1.47 1.073-2.756 2.57-2.93ZM7.5 11.25a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75H8.25a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V13.5a.75.75 0 0 0-.75-.75H8.25Zm-.75 3a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75H8.25a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V18a.75.75 0 0 0-.75-.75H8.25Zm1.748-6a.75.75 0 0 1 .75-.75h.007a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.007a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.335.75.75.75h.007a.75.75 0 0 0 .75-.75V13.5a.75.75 0 0 0-.75-.75h-.007Zm-.75 3a.75.75 0 0 1 .75-.75h.007a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.007a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.335.75.75.75h.007a.75.75 0 0 0 .75-.75V18a.75.75 0 0 0-.75-.75h-.007Zm1.754-6a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.008a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V13.5a.75.75 0 0 0-.75-.75h-.008Zm-.75 3a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.008a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V18a.75.75 0 0 0-.75-.75h-.008Zm1.748-6a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.008a.75.75 0 0 1-.75-.75v-.008Zm.75 1.5a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75V13.5a.75.75 0 0 0-.75-.75h-.008Zm-8.25-6A.75.75 0 0 1 8.25 6h7.5a.75.75 0 0 1 .75.75v.75a.75.75 0 0 1-.75.75h-7.5a.75.75 0 0 1-.75-.75v-.75Zm9 9a.75.75 0 0 0-1.5 0V18a.75.75 0 0 0 1.5 0v-2.25Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M12.53 16.28a.75.75 0 0 1-1.06 0l-7.5-7.5a.75.75 0 0 1 1.06-1.06L12 14.69l6.97-6.97a.75.75 0 1 1 1.06 1.06l-7.5 7.5Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M7.72 12.53a.75.75 0 0 1 0-1.06l7.5-7.5a.75.75 0 1 1 1.06 1.06L9.31 12l6.97 6.97a.75.75 0 1 1-1.06 1.06l-7.5-7.5Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M11.47 7.72a.75.75 0 0 1 1.06 0l7.5 7.5a.75.75 0 1 1-1.06 1.06L12 9.31l-6.97 6.97a.75.75 0 0 1-1.06-1.06l7.5-7.5Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M8.161 2.58a1.875 1.875 0 0 1 1.678 0l4.993 2.498c.106.052.23.052.336 0l3.869-1.935A1.875 1.875 0 0 1 21.75 4.82v12.485c0 .71-.401 1.36-1.037 1.677l-4.875 2.437a1.875 1.875 0 0 1-1.676 0l-4.994-2.497a.375.375 0 0 0-.336 0l-3.868 1.935A1.875 1.875 0 0 1 2.25 19.18V6.695c0-.71.401-1.36 1.036-1.677l4.875-2.437ZM9 6a.75.75 0 0 1 .75.75V15a.75.75 0 0 1-1.5 0V6.75A.75.75 0 0 1 9 6Zm6.75 3a.75.75 0 0 0-1.5 0v8.25a.75.75 0 0 0 1.5 0V9Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm3 10.5a.75.75 0 0 0 0-1.5H9a.75.75 0 0 0 0 1.5h6Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", { d: \"M21.731 2.269a2.625 2.625 0 0 0-3.712 0l-1.157 1.157 3.712 3.712 1.157-1.157a2.625 2.625 0 0 0 0-3.712ZM19.513 8.199l-3.712-3.712-8.4 8.4a5.25 5.25 0 0 0-1.32 2.214l-.8 2.685a.75.75 0 0 0 .933.933l2.685-.8a5.25 5.25 0 0 0 2.214-1.32l8.4-8.4Z\" }),\n _createElementVNode(\"path\", { d: \"M5.25 5.25a3 3 0 0 0-3 3v10.5a3 3 0 0 0 3 3h10.5a3 3 0 0 0 3-3V13.5a.75.75 0 0 0-1.5 0v5.25a1.5 1.5 0 0 1-1.5 1.5H5.25a1.5 1.5 0 0 1-1.5-1.5V8.25a1.5 1.5 0 0 1 1.5-1.5h5.25a.75.75 0 0 0 0-1.5H5.25Z\" })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25ZM12.75 9a.75.75 0 0 0-1.5 0v2.25H9a.75.75 0 0 0 0 1.5h2.25V15a.75.75 0 0 0 1.5 0v-2.25H15a.75.75 0 0 0 0-1.5h-2.25V9Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","/**!\n * Sortable 1.14.0\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.14.0\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\n\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\n\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\n\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\n\nfunction matches(\n/**HTMLElement*/\nel,\n/**String*/\nselector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n\n return false;\n}\n\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\n\nfunction closest(\n/**HTMLElement*/\nel,\n/**String*/\nselector,\n/**HTMLElement*/\nctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n\n return null;\n}\n\nvar R_SPACE = /\\s+/g;\n\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\n\nfunction css(el, prop, val) {\n var style = el && el.style;\n\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\n\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n\n } while (!selfOnly && (el = el.parentNode));\n }\n\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n\n return matrixFn && new matrixFn(appliedTransforms);\n}\n\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n\n return list;\n }\n\n return [];\n}\n\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n/**\n * Returns the \"bounding client rect\" of given element\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\n * @param {[HTMLElement]} container The parent the element will be placed in\n * @return {Object} The boundingClientRect of el, with specified adjustments\n */\n\n\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container\n\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n\n } while (container = container.parentNode);\n }\n }\n\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n/**\n * Checks if a side of an element is scrolled past a side of its parents\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\n */\n\n\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n /* jshint boss:true */\n\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n\n return false;\n}\n/**\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\n * and non-draggable elements\n * @param {HTMLElement} el The parent element\n * @param {Number} childNum The index of the child\n * @param {Object} options Parent Sortable's options\n * @return {HTMLElement} The child at index childNum, or null if not found\n */\n\n\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n\n currentChild++;\n }\n\n i++;\n }\n\n return null;\n}\n/**\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\n * @param {HTMLElement} el Parent element\n * @param {selector} selector Any other elements that should be ignored\n * @return {HTMLElement} The last child, ignoring ghostEl\n */\n\n\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n\n return last || null;\n}\n/**\n * Returns the index of an element within its parent for a selected set of\n * elements\n * @param {HTMLElement} el\n * @param {selector} selector\n * @return {number}\n */\n\n\nfunction index(el, selector) {\n var index = 0;\n\n if (!el || !el.parentNode) {\n return -1;\n }\n /* jshint boss:true */\n\n\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n\n return index;\n}\n/**\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\n * The value is returned in real pixels.\n * @param {HTMLElement} el\n * @return {Array} Offsets in the format of [left, top]\n */\n\n\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n\n return [offsetLeft, offsetTop];\n}\n/**\n * Returns the index of the object within the given array\n * @param {Array} arr Array that may or may not hold the object\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\n * @return {Number} The index of the object in the array, or -1\n */\n\n\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n\n return -1;\n}\n\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n\n } while (elem = elem.parentNode);\n\n return getWindowScrollingElement();\n}\n\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n\n return dst;\n}\n\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\n\nvar _throttleTimeout;\n\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\n\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\n\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\n\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\n\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\n\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\n\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation\n\n\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n\n target.toRect = toRect;\n\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n } // if fromRect != toRect: animate\n\n\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n\n if (!time) {\n time = _this.options.animation;\n }\n\n _this.animate(target, animatingRect, toRect, time);\n }\n\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\n\nfunction repaint(target) {\n return target.offsetWidth;\n}\n\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n\n this.eventCanceled = false;\n\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable\n\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n } // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n\n\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized; // Add default options from plugin\n\n _extends(defaults, initialized.defaults);\n });\n\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature\n\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\n\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\n\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\n\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\nghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n_silent = false,\n savedInputChecked = [];\n/** @const */\n\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\nsupportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return; // false when <= IE11\n\n if (IE11OrLess) {\n return false;\n }\n\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n}(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n},\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n},\n\n/**\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\n * @param {Number} x X position\n * @param {Number} y Y position\n * @return {HTMLElement} Element of the first found nearest Sortable\n */\n_detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n},\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n\n var group = {};\n var originalGroup = options.group;\n\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n},\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n},\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n}; // #1184 fix - Prevent click event on fallback if dragged but item not changed position\n\n\nif (documentExists) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\n\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n\n if (nearest) {\n // Create imitation event\n var event = {};\n\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n\n nearest[expando]._onDragOver(event);\n }\n }\n};\n\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n/**\n * @class Sortable\n * @param {HTMLElement} el\n * @param {Object} [options]\n */\n\n\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n\n this.el = el; // root element\n\n this.options = options = _extends({}, options); // Export instance\n\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults); // Set default options\n\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n\n _prepareGroup(options); // Bind all private methods\n\n\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n } // Setup drag mode\n\n\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n } // Bind events\n\n\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n\n sortables.push(this.el); // Restore sorting\n\n options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager\n\n _extends(this, AnimationStateManager());\n}\n\nSortable.prototype =\n/** @lends Sortable.prototype */\n{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart(\n /** Event|TouchEvent */\n evt) {\n if (!evt.cancelable) return;\n\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n\n _saveInputCheckedState(el); // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n\n\n if (dragEl) {\n return;\n }\n\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n } // cancel dnd if original target is content editable\n\n\n if (originalTarget.isContentEditable) {\n return;\n } // Safari ignores further event handling after mousedown\n\n\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n\n target = closest(target, options.draggable, el, false);\n\n if (target && target.animated) {\n return;\n }\n\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n } // Get the index of the dragged element within its parent\n\n\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable); // Check filter\n\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n } // Prepare `dragstart`\n\n\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart(\n /** Event */\n evt,\n /** Touch */\n touch,\n /** HTMLElement */\n target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n\n if (Sortable.eventCanceled) {\n _this._onDrop();\n\n return;\n } // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n\n\n _this._disableDelayedDragEvents();\n\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n } // Bind the events: dragstart/dragend\n\n\n _this._triggerDragStart(evt, touch); // Drag start event\n\n\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n }); // Chosen item\n\n\n toggleClass(dragEl, options.chosenClass, true);\n }; // Disable \"draggable\"\n\n\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop); // Make dragEl draggable (must be before delay for FireFox)\n\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n\n pluginEvent('delayStart', this, {\n evt: evt\n }); // Delay is impossible for native DnD in Edge or IE\n\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n\n return;\n } // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n\n\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(\n /** TouchEvent|PointerEvent **/\n e) {\n var touch = e.touches ? e.touches[0] : e;\n\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart(\n /** Event */\n evt,\n /** Touch */\n touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n\n try {\n if (document.selection) {\n // Timeout neccessary for IE9\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n\n awaitingDragStarted = false;\n\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n\n var options = this.options; // Apply effect\n\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost(); // Drag start event\n\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n\n _hideGhostForTarget();\n\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n\n target = parent; // store last element\n }\n /* jshint boss:true */\n while (parent = parent.parentNode);\n }\n\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove(\n /**TouchEvent*/\n evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging\n\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n\n this._onDragStart(evt, true);\n }\n\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options; // Position absolutely\n\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl); // Set transform-origin\n\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart(\n /**Event*/\n evt,\n /**boolean*/\n fallback) {\n var _this = this;\n\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n\n if (Sortable.eventCanceled) {\n this._onDrop();\n\n return;\n }\n\n pluginEvent('setupClone', this);\n\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n\n this._hideClone();\n\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n } // #1143: IFrame support workaround\n\n\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n\n _this._hideClone();\n\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events\n\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n\n on(document, 'drop', _this); // #1276 fix:\n\n css(dragEl, 'transform', 'translateZ(0)');\n }\n\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver(\n /**Event*/\n evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n\n if (_silent) return;\n\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n } // Capture animation state\n\n\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n\n _this.captureAnimationState();\n\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n } // Return invocation when dragEl is inserted (or completed)\n\n\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n } // Animation\n\n\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n } // Null lastTarget if it is not inside a previously swapped element\n\n\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n } // no bubbling and not fallback\n\n\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted\n\n\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n } // Call when dragEl has been inserted\n\n\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n\n ignoreNextClick = false;\n\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n\n if (revert) {\n parentEl = rootEl; // actualization\n\n capture();\n\n this._hideClone();\n\n dragOverEvent('revert');\n\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n\n return completed(true);\n }\n\n var elLastChild = lastChild(el, options.draggable);\n\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n } // if there is a last element, it is the target\n\n\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n\n if (target) {\n targetRect = getRect(target);\n }\n\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n el.appendChild(dragEl);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n\n if (firstChild === dragEl) {\n return completed(false);\n }\n\n target = firstChild;\n targetRect = getRect(target);\n\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n } // If dragEl is already beside target: Do not insert\n\n\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n } // Undo chrome's scroll adjustment (has no effect on other browsers)\n\n\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n\n parentEl = dragEl.parentNode; // actualization\n // must be done before animation\n\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n\n changed();\n return completed(true);\n }\n }\n\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop(\n /**Event*/\n evt) {\n var el = this.el,\n options = this.options; // Get the index of the dragged element within its parent\n\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode; // Get again after plugin event\n\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n\n if (Sortable.eventCanceled) {\n this._nulling();\n\n return;\n }\n\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n\n _cancelNextTick(this.cloneId);\n\n _cancelNextTick(this._dragStartId); // Unbind events\n\n\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n\n this._offMoveEvents();\n\n this._offUpEvents();\n\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n\n css(dragEl, 'transform', '');\n\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n\n _disableDraggable(dragEl);\n\n dragEl.style['will-change'] = ''; // Remove classes\n // ghostClass is added in dragStarted\n\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n\n toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event\n\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n }); // Remove event\n\n\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n }); // drag from one list and drop into another\n\n\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n }); // Save sorting\n\n\n this.save();\n }\n }\n }\n\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent(\n /**Event*/\n evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n\n break;\n\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n\n _globalDragOver(evt);\n }\n\n break;\n\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n\n /**\n * Serializes the item into an array of string.\n * @returns {String[]}\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n\n for (; i < n; i++) {\n el = children[i];\n\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n\n return order;\n },\n\n /**\n * Sorts the elements according to the array.\n * @param {String[]} order order of the items\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n\n /**\n * Save the current sorting\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n\n /**\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\n * @param {HTMLElement} el\n * @param {String} [selector] default: `options.draggable`\n * @returns {HTMLElement|null}\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n\n /**\n * Set/get option\n * @param {string} name\n * @param {*} [value]\n * @returns {*}\n */\n option: function option(name, value) {\n var options = this.options;\n\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n\n /**\n * Destroy\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n } // Remove draggable attributes\n\n\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n\n this._onDrop();\n\n this._disableDelayedDragEvents();\n\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n\n return;\n }\n\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return; // show clone at dragEl or original position\n\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\n\nfunction _globalDragOver(\n/**Event*/\nevt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n\n evt.cancelable && evt.preventDefault();\n}\n\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal; // Support for new CustomEvent feature\n\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n\n return retVal;\n}\n\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\n\nfunction _unsilent() {\n _silent = false;\n}\n\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var rect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var spacer = 10;\n return vertical ? evt.clientX < rect.left - spacer || evt.clientY < rect.top && evt.clientX < rect.right : evt.clientY < rect.top - spacer || evt.clientY < rect.bottom && evt.clientX < rect.left;\n}\n\nfunction _ghostIsLast(evt, vertical, sortable) {\n var rect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var spacer = 10;\n return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer;\n}\n\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n\n invert = invert || invertSwap;\n\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n\n return 0;\n}\n/**\n * Gets the direction dragEl must be swapped relative to target in order to make it\n * seem that dragEl has been \"inserted\" into that element's position\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\n * @return {Number} Direction dragEl must be swapped\n */\n\n\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n/**\n * Generate id\n * @param {HTMLElement} el\n * @returns {String}\n * @private\n */\n\n\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n\n while (i--) {\n sum += str.charCodeAt(i);\n }\n\n return sum.toString(36);\n}\n\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\n\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\n\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n} // Fixed #973:\n\n\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n} // Export utils\n\n\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild\n};\n/**\n * Get the Sortable instance of an element\n * @param {HTMLElement} element The element\n * @return {Sortable|undefined} The instance of Sortable\n */\n\nSortable.get = function (element) {\n return element[expando];\n};\n/**\n * Mount a plugin to Sortable\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\n */\n\n\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n/**\n * Create sortable instance\n * @param {HTMLElement} el\n * @param {Object} [options]\n */\n\n\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n}; // Export\n\n\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\n\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n }; // Bind all private methods\n\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt; // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change\n\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour\n\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\n\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\n\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\n\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn; // New scroll root, set scrollEl\n\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n\n var layersOut = 0;\n var currentParent = scrollEl;\n\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n\n }\n\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\n\nfunction Revert() {}\n\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n\n this.sortable.animateAll();\n\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\n\nfunction Remove() {}\n\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\n\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\n\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\nmultiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\nfolding = false,\n // Folding any other time\ndragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\n\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n\n dataTransfer.setData('Text', data);\n }\n };\n }\n\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n\n sortable._hideClone();\n\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n }); // Sort multi-drag elements\n\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n sortable.captureAnimationState();\n\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n } // Remove all auxiliary multidrag items from el, if sorting enabled\n\n\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n\n initialFolding = false; // If leaving sort:false root, or already folding - Fold to new location\n\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute); // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n } // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n\n\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n\n activeSortable._showClone(sortable); // Unfold animation for clones if showing from hidden\n\n\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children; // Multi-drag selection\n\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvt: evt\n }); // Modifier activated, select from last to dragEl\n\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvt: evt\n });\n }\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvt: evt\n });\n }\n } // Multi-drag drop\n\n\n if (dragStarted && this.isMultiDrag) {\n folding = false; // Do not \"unfold\" after around dragEl if reverted\n\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect; // Prepare unfold animation\n\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n } // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n\n\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n\n multiDragIndex++;\n }); // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n\n if (update) {\n dispatchSortableEvent('update');\n }\n }\n } // Must be done after capturing individual rects (scroll bar)\n\n\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n\n multiDragSortable = toSortable;\n } // Remove clones if necessary\n\n\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return; // Only deselect if selection is in this sortable\n\n if (multiDragSortable !== this.sortable) return; // Only deselect if target is not item in this sortable\n\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; // Only deselect if left click\n\n if (evt && evt.button !== 0) return;\n\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvt: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\n * Selects the provided multi-drag item\n * @param {HTMLElement} el The element to be selected\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n\n multiDragSortable = sortable;\n }\n\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n\n /**\n * Deselects the provided multi-drag item\n * @param {HTMLElement} el The element to be deselected\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n }); // multiDragElements will already be sorted if folding\n\n var newIndex;\n\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n\n return key;\n }\n }\n });\n}\n\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n/**\n * Insert multi-drag clones\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\n * @param {HTMLElement} rootEl\n */\n\n\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\n\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"vue\"), require(\"sortablejs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([, \"sortablejs\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vuedraggable\"] = factory(require(\"vue\"), require(\"sortablejs\"));\n\telse\n\t\troot[\"vuedraggable\"] = factory(root[\"Vue\"], root[\"Sortable\"]);\n})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__8bbf__, __WEBPACK_EXTERNAL_MODULE_a352__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = \"fb15\");\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"00ee\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar wellKnownSymbol = __webpack_require__(\"b622\");\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n\n\n/***/ }),\n\n/***/ \"0366\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar aFunction = __webpack_require__(\"1c0b\");\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n\n\n/***/ }),\n\n/***/ \"057f\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toIndexedObject = __webpack_require__(\"fc6a\");\nvar nativeGetOwnPropertyNames = __webpack_require__(\"241c\").f;\n\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n\n\n/***/ }),\n\n/***/ \"06cf\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar DESCRIPTORS = __webpack_require__(\"83ab\");\nvar propertyIsEnumerableModule = __webpack_require__(\"d1e7\");\nvar createPropertyDescriptor = __webpack_require__(\"5c6c\");\nvar toIndexedObject = __webpack_require__(\"fc6a\");\nvar toPrimitive = __webpack_require__(\"c04e\");\nvar has = __webpack_require__(\"5135\");\nvar IE8_DOM_DEFINE = __webpack_require__(\"0cfb\");\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n\n\n/***/ }),\n\n/***/ \"0cfb\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar DESCRIPTORS = __webpack_require__(\"83ab\");\nvar fails = __webpack_require__(\"d039\");\nvar createElement = __webpack_require__(\"cc12\");\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n\n\n/***/ }),\n\n/***/ \"13d5\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $ = __webpack_require__(\"23e7\");\nvar $reduce = __webpack_require__(\"d58f\").left;\nvar arrayMethodIsStrict = __webpack_require__(\"a640\");\nvar arrayMethodUsesToLength = __webpack_require__(\"ae40\");\n\nvar STRICT_METHOD = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n\n/***/ }),\n\n/***/ \"14c3\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar classof = __webpack_require__(\"c6b6\");\nvar regexpExec = __webpack_require__(\"9263\");\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n\n\n/***/ }),\n\n/***/ \"159b\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"da84\");\nvar DOMIterables = __webpack_require__(\"fdbc\");\nvar forEach = __webpack_require__(\"17c2\");\nvar createNonEnumerableProperty = __webpack_require__(\"9112\");\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n\n\n/***/ }),\n\n/***/ \"17c2\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $forEach = __webpack_require__(\"b727\").forEach;\nvar arrayMethodIsStrict = __webpack_require__(\"a640\");\nvar arrayMethodUsesToLength = __webpack_require__(\"ae40\");\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n\n\n/***/ }),\n\n/***/ \"1be4\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getBuiltIn = __webpack_require__(\"d066\");\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n\n\n/***/ }),\n\n/***/ \"1c0b\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ \"1c7e\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar wellKnownSymbol = __webpack_require__(\"b622\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n\n\n/***/ }),\n\n/***/ \"1d80\":\n/***/ (function(module, exports) {\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n\n/***/ }),\n\n/***/ \"1dde\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar fails = __webpack_require__(\"d039\");\nvar wellKnownSymbol = __webpack_require__(\"b622\");\nvar V8_VERSION = __webpack_require__(\"2d00\");\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n\n\n/***/ }),\n\n/***/ \"23cb\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(\"a691\");\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n\n\n/***/ }),\n\n/***/ \"23e7\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"da84\");\nvar getOwnPropertyDescriptor = __webpack_require__(\"06cf\").f;\nvar createNonEnumerableProperty = __webpack_require__(\"9112\");\nvar redefine = __webpack_require__(\"6eeb\");\nvar setGlobal = __webpack_require__(\"ce4e\");\nvar copyConstructorProperties = __webpack_require__(\"e893\");\nvar isForced = __webpack_require__(\"94ca\");\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n\n\n/***/ }),\n\n/***/ \"241c\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar internalObjectKeys = __webpack_require__(\"ca84\");\nvar enumBugKeys = __webpack_require__(\"7839\");\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n\n\n/***/ }),\n\n/***/ \"25f0\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar redefine = __webpack_require__(\"6eeb\");\nvar anObject = __webpack_require__(\"825a\");\nvar fails = __webpack_require__(\"d039\");\nvar flags = __webpack_require__(\"ad6d\");\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n\n\n/***/ }),\n\n/***/ \"2ca0\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $ = __webpack_require__(\"23e7\");\nvar getOwnPropertyDescriptor = __webpack_require__(\"06cf\").f;\nvar toLength = __webpack_require__(\"50c4\");\nvar notARegExp = __webpack_require__(\"5a34\");\nvar requireObjectCoercible = __webpack_require__(\"1d80\");\nvar correctIsRegExpLogic = __webpack_require__(\"ab13\");\nvar IS_PURE = __webpack_require__(\"c430\");\n\nvar nativeStartsWith = ''.startsWith;\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.startsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = String(requireObjectCoercible(this));\n notARegExp(searchString);\n var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n\n\n/***/ }),\n\n/***/ \"2d00\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"da84\");\nvar userAgent = __webpack_require__(\"342f\");\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n\n\n/***/ }),\n\n/***/ \"342f\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getBuiltIn = __webpack_require__(\"d066\");\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n\n\n/***/ }),\n\n/***/ \"35a1\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar classof = __webpack_require__(\"f5df\");\nvar Iterators = __webpack_require__(\"3f8c\");\nvar wellKnownSymbol = __webpack_require__(\"b622\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n\n\n/***/ }),\n\n/***/ \"37e8\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar DESCRIPTORS = __webpack_require__(\"83ab\");\nvar definePropertyModule = __webpack_require__(\"9bf2\");\nvar anObject = __webpack_require__(\"825a\");\nvar objectKeys = __webpack_require__(\"df75\");\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n\n\n/***/ }),\n\n/***/ \"3bbe\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"861d\");\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ \"3ca3\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar charAt = __webpack_require__(\"6547\").charAt;\nvar InternalStateModule = __webpack_require__(\"69f3\");\nvar defineIterator = __webpack_require__(\"7dd0\");\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n\n\n/***/ }),\n\n/***/ \"3f8c\":\n/***/ (function(module, exports) {\n\nmodule.exports = {};\n\n\n/***/ }),\n\n/***/ \"4160\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $ = __webpack_require__(\"23e7\");\nvar forEach = __webpack_require__(\"17c2\");\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {\n forEach: forEach\n});\n\n\n/***/ }),\n\n/***/ \"428f\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"da84\");\n\nmodule.exports = global;\n\n\n/***/ }),\n\n/***/ \"44ad\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar fails = __webpack_require__(\"d039\");\nvar classof = __webpack_require__(\"c6b6\");\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n\n\n/***/ }),\n\n/***/ \"44d2\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar wellKnownSymbol = __webpack_require__(\"b622\");\nvar create = __webpack_require__(\"7c73\");\nvar definePropertyModule = __webpack_require__(\"9bf2\");\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n\n\n/***/ }),\n\n/***/ \"44e7\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"861d\");\nvar classof = __webpack_require__(\"c6b6\");\nvar wellKnownSymbol = __webpack_require__(\"b622\");\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n\n\n/***/ }),\n\n/***/ \"4930\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar fails = __webpack_require__(\"d039\");\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n\n\n/***/ }),\n\n/***/ \"4d64\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toIndexedObject = __webpack_require__(\"fc6a\");\nvar toLength = __webpack_require__(\"50c4\");\nvar toAbsoluteIndex = __webpack_require__(\"23cb\");\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n\n\n/***/ }),\n\n/***/ \"4de4\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $ = __webpack_require__(\"23e7\");\nvar $filter = __webpack_require__(\"b727\").filter;\nvar arrayMethodHasSpeciesSupport = __webpack_require__(\"1dde\");\nvar arrayMethodUsesToLength = __webpack_require__(\"ae40\");\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n// Edge 14- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n\n/***/ }),\n\n/***/ \"4df4\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar bind = __webpack_require__(\"0366\");\nvar toObject = __webpack_require__(\"7b0b\");\nvar callWithSafeIterationClosing = __webpack_require__(\"9bdd\");\nvar isArrayIteratorMethod = __webpack_require__(\"e95a\");\nvar toLength = __webpack_require__(\"50c4\");\nvar createProperty = __webpack_require__(\"8418\");\nvar getIteratorMethod = __webpack_require__(\"35a1\");\n\n// `Array.from` method implementation\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n\n\n/***/ }),\n\n/***/ \"4fad\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $ = __webpack_require__(\"23e7\");\nvar $entries = __webpack_require__(\"6f53\").entries;\n\n// `Object.entries` method\n// https://tc39.github.io/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n\n\n/***/ }),\n\n/***/ \"50c4\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(\"a691\");\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n\n\n/***/ }),\n\n/***/ \"5135\":\n/***/ (function(module, exports) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n\n/***/ \"5319\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar fixRegExpWellKnownSymbolLogic = __webpack_require__(\"d784\");\nvar anObject = __webpack_require__(\"825a\");\nvar toObject = __webpack_require__(\"7b0b\");\nvar toLength = __webpack_require__(\"50c4\");\nvar toInteger = __webpack_require__(\"a691\");\nvar requireObjectCoercible = __webpack_require__(\"1d80\");\nvar advanceStringIndex = __webpack_require__(\"8aa5\");\nvar regExpExec = __webpack_require__(\"14c3\");\n\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n\n\n/***/ }),\n\n/***/ \"5692\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar IS_PURE = __webpack_require__(\"c430\");\nvar store = __webpack_require__(\"c6cd\");\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.6.5',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n\n\n/***/ }),\n\n/***/ \"56ef\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getBuiltIn = __webpack_require__(\"d066\");\nvar getOwnPropertyNamesModule = __webpack_require__(\"241c\");\nvar getOwnPropertySymbolsModule = __webpack_require__(\"7418\");\nvar anObject = __webpack_require__(\"825a\");\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n\n\n/***/ }),\n\n/***/ \"5a34\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isRegExp = __webpack_require__(\"44e7\");\n\nmodule.exports = function (it) {\n if (isRegExp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n};\n\n\n/***/ }),\n\n/***/ \"5c6c\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\n\n/***/ }),\n\n/***/ \"5db7\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $ = __webpack_require__(\"23e7\");\nvar flattenIntoArray = __webpack_require__(\"a2bf\");\nvar toObject = __webpack_require__(\"7b0b\");\nvar toLength = __webpack_require__(\"50c4\");\nvar aFunction = __webpack_require__(\"1c0b\");\nvar arraySpeciesCreate = __webpack_require__(\"65f0\");\n\n// `Array.prototype.flatMap` method\n// https://github.com/tc39/proposal-flatMap\n$({ target: 'Array', proto: true }, {\n flatMap: function flatMap(callbackfn /* , thisArg */) {\n var O = toObject(this);\n var sourceLen = toLength(O.length);\n var A;\n aFunction(callbackfn);\n A = arraySpeciesCreate(O, 0);\n A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return A;\n }\n});\n\n\n/***/ }),\n\n/***/ \"6547\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(\"a691\");\nvar requireObjectCoercible = __webpack_require__(\"1d80\");\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n\n\n/***/ }),\n\n/***/ \"65f0\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"861d\");\nvar isArray = __webpack_require__(\"e8b5\");\nvar wellKnownSymbol = __webpack_require__(\"b622\");\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n\n\n/***/ }),\n\n/***/ \"69f3\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar NATIVE_WEAK_MAP = __webpack_require__(\"7f9a\");\nvar global = __webpack_require__(\"da84\");\nvar isObject = __webpack_require__(\"861d\");\nvar createNonEnumerableProperty = __webpack_require__(\"9112\");\nvar objectHas = __webpack_require__(\"5135\");\nvar sharedKey = __webpack_require__(\"f772\");\nvar hiddenKeys = __webpack_require__(\"d012\");\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = new WeakMap();\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n\n\n/***/ }),\n\n/***/ \"6eeb\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"da84\");\nvar createNonEnumerableProperty = __webpack_require__(\"9112\");\nvar has = __webpack_require__(\"5135\");\nvar setGlobal = __webpack_require__(\"ce4e\");\nvar inspectSource = __webpack_require__(\"8925\");\nvar InternalStateModule = __webpack_require__(\"69f3\");\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) createNonEnumerableProperty(value, 'name', key);\n enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n\n\n/***/ }),\n\n/***/ \"6f53\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar DESCRIPTORS = __webpack_require__(\"83ab\");\nvar objectKeys = __webpack_require__(\"df75\");\nvar toIndexedObject = __webpack_require__(\"fc6a\");\nvar propertyIsEnumerable = __webpack_require__(\"d1e7\").f;\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod(false)\n};\n\n\n/***/ }),\n\n/***/ \"73d9\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// this method was added to unscopables after implementation\n// in popular engines, so it's moved to a separate module\nvar addToUnscopables = __webpack_require__(\"44d2\");\n\naddToUnscopables('flatMap');\n\n\n/***/ }),\n\n/***/ \"7418\":\n/***/ (function(module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n\n/***/ \"746f\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar path = __webpack_require__(\"428f\");\nvar has = __webpack_require__(\"5135\");\nvar wrappedWellKnownSymbolModule = __webpack_require__(\"e538\");\nvar defineProperty = __webpack_require__(\"9bf2\").f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n\n\n/***/ }),\n\n/***/ \"7839\":\n/***/ (function(module, exports) {\n\n// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n\n\n/***/ }),\n\n/***/ \"7b0b\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar requireObjectCoercible = __webpack_require__(\"1d80\");\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n\n\n/***/ }),\n\n/***/ \"7c73\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(\"825a\");\nvar defineProperties = __webpack_require__(\"37e8\");\nvar enumBugKeys = __webpack_require__(\"7839\");\nvar hiddenKeys = __webpack_require__(\"d012\");\nvar html = __webpack_require__(\"1be4\");\nvar documentCreateElement = __webpack_require__(\"cc12\");\nvar sharedKey = __webpack_require__(\"f772\");\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n\n\n/***/ }),\n\n/***/ \"7dd0\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $ = __webpack_require__(\"23e7\");\nvar createIteratorConstructor = __webpack_require__(\"9ed3\");\nvar getPrototypeOf = __webpack_require__(\"e163\");\nvar setPrototypeOf = __webpack_require__(\"d2bb\");\nvar setToStringTag = __webpack_require__(\"d44e\");\nvar createNonEnumerableProperty = __webpack_require__(\"9112\");\nvar redefine = __webpack_require__(\"6eeb\");\nvar wellKnownSymbol = __webpack_require__(\"b622\");\nvar IS_PURE = __webpack_require__(\"c430\");\nvar Iterators = __webpack_require__(\"3f8c\");\nvar IteratorsCore = __webpack_require__(\"ae93\");\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n\n\n/***/ }),\n\n/***/ \"7f9a\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"da84\");\nvar inspectSource = __webpack_require__(\"8925\");\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n\n\n/***/ }),\n\n/***/ \"825a\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"861d\");\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n\n\n/***/ }),\n\n/***/ \"83ab\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar fails = __webpack_require__(\"d039\");\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n\n\n/***/ }),\n\n/***/ \"8418\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar toPrimitive = __webpack_require__(\"c04e\");\nvar definePropertyModule = __webpack_require__(\"9bf2\");\nvar createPropertyDescriptor = __webpack_require__(\"5c6c\");\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n\n\n/***/ }),\n\n/***/ \"861d\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n\n/***/ \"8875\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// addapted from the document.currentScript polyfill by Adam Miller\n// MIT license\n// source: https://github.com/amiller-gh/currentScript-polyfill\n\n// added support for Firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1620505\n\n(function (root, factory) {\n if (true) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n}(typeof self !== 'undefined' ? self : this, function () {\n function getCurrentScript () {\n var descriptor = Object.getOwnPropertyDescriptor(document, 'currentScript')\n // for chrome\n if (!descriptor && 'currentScript' in document && document.currentScript) {\n return document.currentScript\n }\n\n // for other browsers with native support for currentScript\n if (descriptor && descriptor.get !== getCurrentScript && document.currentScript) {\n return document.currentScript\n }\n \n // IE 8-10 support script readyState\n // IE 11+ & Firefox support stack trace\n try {\n throw new Error();\n }\n catch (err) {\n // Find the second match for the \"at\" string to get file src url from stack.\n var ieStackRegExp = /.*at [^(]*\\((.*):(.+):(.+)\\)$/ig,\n ffStackRegExp = /@([^@]*):(\\d+):(\\d+)\\s*$/ig,\n stackDetails = ieStackRegExp.exec(err.stack) || ffStackRegExp.exec(err.stack),\n scriptLocation = (stackDetails && stackDetails[1]) || false,\n line = (stackDetails && stackDetails[2]) || false,\n currentLocation = document.location.href.replace(document.location.hash, ''),\n pageSource,\n inlineScriptSourceRegExp,\n inlineScriptSource,\n scripts = document.getElementsByTagName('script'); // Live NodeList collection\n \n if (scriptLocation === currentLocation) {\n pageSource = document.documentElement.outerHTML;\n inlineScriptSourceRegExp = new RegExp('(?:[^\\\\n]+?\\\\n){0,' + (line - 2) + '}[^<]*\n","\n\n\n","\n\n\n","\n\n\n\n","\n\n","'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length|0]\n }\n\n return str;\n}\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object} params - The parameters to be converted to a FormData object.\n * @param {Object} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n if (utils.isFunction(options)) {\n options = {\n serialize: options\n };\n } \n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n _navigator as navigator,\n origin\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isHeaders(header)) {\n for (const [key, value] of header.entries()) {\n setHeader(value, key, rewrite);\n }\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn.apply(null, args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n","import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n","import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n\n return (\n origin.protocol === url.protocol &&\n origin.host === url.host &&\n (isMSIE || origin.port === url.port)\n );\n})(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, prop, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, prop , caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, prop , caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, prop , caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)\n };\n\n utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n let contentType;\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // Let the browser set it\n } else if ((contentType = headers.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n headers.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n }\n }\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n","import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils.asap(unsubscribe);\n\n return signal;\n }\n}\n\nexport default composeSignals;\n","\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n}\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst isFetchSupported = typeof fetch === 'function' && typeof Request === 'function' && typeof Response === 'function';\nconst isReadableStreamSupported = isFetchSupported && typeof ReadableStream === 'function';\n\n// used only inside the fetch adapter\nconst encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Response(str).arrayBuffer())\n);\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst supportsRequestStream = isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n});\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst supportsResponseStream = isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n\nconst resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n};\n\nisFetchSupported && (((res) => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = utils.isFunction(res[type]) ? (res) => res[type]() :\n (_, config) => {\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n})(new Response));\n\nconst getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if(utils.isBlob(body)) {\n return body.size;\n }\n\n if(utils.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if(utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if(utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if(utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n}\n\nconst resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n}\n\nexport default isFetchSupported && (async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = \"credentials\" in Request.prototype;\n request = new Request(url, {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n });\n\n let response = await fetch(request);\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n});\n\n\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: fetchAdapter\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","export const VERSION = \"1.7.9\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n // eslint-disable-next-line no-console\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: validators.spelling('withXSRFToken')\n }, true);\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","/**\n * Simple rounding function, how can this not be standard rounding in js!?\n * @param num \n * @param decimals \n * @returns \n */\nexport function roundNumber(num: number, decimals: number) {\n const rounded = num.toFixed(decimals); // Round to 1 decimal place\n if (rounded.endsWith('.0')) { // Check if it ends with .0\n return rounded.slice(0, -2); // Remove the .0\n } else if (rounded.endsWith('0')) {\n return rounded.slice(0, -1); // Remove the trailing 0\n }\n return rounded;\n}\n\nexport function delay(ms: number): Promise {\n return new Promise(resolve => setTimeout(resolve, ms))\n}","import axios from 'axios'\nimport type { AxiosInstance } from 'axios'\n\nimport { delay } from '@/utils/math'\n\nimport { useSettingsStore } from '@/stores/settings'\n\nimport { EPDSource } from '@/models/settings'\nimport type { RevaluData, RevaluCollection, RevaluSingleCollection } from '@/models/revaluDataSource'\nimport { type Product, type Emission, type LifeCycleStageEmission, type Assembly, Source} from '@/models/material'\n\n//import { convertIlcd } from 'epdx'\n\nconst MAX_EPD_COUNT = 15\n// Ilcd reference to GWP total\nconst GWP_REF_OBJECT_ID = '6a37f984-a4b3-458a-a20a-64418c145fa2'\n\ninterface EPDService {\n createApiClient(): AxiosInstance\n createListUrl(): string\n createEPDUrl(epd: any): string\n createCollectionUrl(): string\n createCollectionDetailsUrl(collectionId: string): string\n createListParams(): any\n createEPDParams(): any\n updatePageIndex(params: any): any\n extractEPDData(data: any): Product | null\n extractEPDList(data: any): any[]\n}\n\n/**\n * Class for fetching data from EcoPortal\n * TODO: This implementation is not done yet, EPD Information is flaky at best\n */\nclass EcoPortalService implements EPDService {\n createApiClient() {\n const settingsStore = useSettingsStore()\n return axios.create({\n headers: {\n Authorization: `Bearer ${settingsStore.keySettings.materialKeys.ecoPortal}`,\n },\n })\n }\n \n createListUrl() {\n return '/api/eco/resource/processes'\n }\n\n createEPDUrl(epd: any) {\n return `/${epd.nodeid}${epd.uuid}`\n }\n\n createCollectionUrl() {\n return null\n }\n\n createCollectionDetailsUrl(collectionId: string) {\n return null\n }\n\n createListParams() {\n return {\n search: 'true',\n distributed: 'true',\n virtual: 'true',\n metaDataOnly: 'false',\n startIndex: '0',\n pageSize: MAX_EPD_COUNT,\n format: 'json',\n }\n }\n\n createEPDParams() {\n return {\n format: 'json',\n view: 'extended',\n }\n }\n\n updatePageIndex(params: any) {\n const startIndex = parseInt(params.startIndex) + parseInt(params.pageSize)\n return { ...params, startIndex: startIndex.toString() }\n }\n\n extractEPDData(data: any) {\n return extractILCDData(data)\n }\n\n extractEPDList(data: any): any[] {\n return data.data;\n }\n}\n\n/**\n * Class for fetching data from Revalu\n */\nclass RevaluService implements EPDService {\n createApiClient() {\n const settingsStore = useSettingsStore()\n return axios.create({\n headers: {\n 'x-api-key': settingsStore.keySettings.materialKeys.revalu,\n },\n })\n }\n \n // Create list URL, we check if dev or not and switch the URL\n createListUrl() {\n const apiListUrl = import.meta.env.MODE === 'development' \n ? '/SpeckleLCA/api/revalu/epds/search' \n : 'https://api.revalu.io/epds/search'\n return apiListUrl\n }\n\n // Create EPD URL, we check if dev or not and switch the URL\n createEPDUrl(epd: any) {\n const apiEPDUrl = import.meta.env.MODE === 'development' \n ? `/SpeckleLCA/api/revalu/epds/${epd.id}` \n : `https://api.revalu.io/epds/${epd.id}`\n return apiEPDUrl\n }\n\n // Create collection URL\n createCollectionUrl() {\n const apiCollectionUrl = import.meta.env.MODE === 'development'\n ? '/SpeckleLCA/api/revalu/users/colletions?page_no=0&page_size=20' \n : 'https://api.revalu.io/users/colletions?page_no=0&page_size=20'\n return apiCollectionUrl\n }\n\n // Create collection details URL\n createCollectionDetailsUrl(collectionId: string) {\n const apiCollectionDetailsUrl = import.meta.env.MODE === 'development'\n ? `/SpeckleLCA/api/revalu/users/colletions/${collectionId}` \n : `https://api.revalu.io/users/colletions/${collectionId}`\n return apiCollectionDetailsUrl\n }\n\n createListParams() {\n return {\n search_term: '',\n page_no: 0,\n page_size: MAX_EPD_COUNT,\n }\n }\n\n createEPDParams() {\n return {}\n }\n\n updatePageIndex(params: any) {\n return { ...params, page_no: params.page_no + 1 }\n }\n\n extractEPDData(data: any) {\n return extractRevaluData(data)\n }\n\n extractEPDList(data: any): any[] {\n return data.body.search_results\n }\n}\n\n/**\n * Extract ILCD data from the response\n * TODO: Implement lcaX conversion already made\n * @param data \n * @returns \n */\nconst extractILCDData = (data: any) => {\n // Extract metaData\n const metaData: Record = {}\n const classifications =\n data?.processInformation?.dataSetInformation?.classificationInformation\n ?.classification || []\n\n classifications.forEach((classification: any) => {\n classification.class.forEach((cls: any) => {\n metaData[cls.classId] = cls.value\n })\n })\n\n // Extract GWP emissions\n const lciaResults = data?.LCIAResults?.LCIAResult || []\n const gwpResult = lciaResults.find(\n (result: any) =>\n result.referenceToLCIAMethodDataSet.refObjectId === GWP_REF_OBJECT_ID\n )\n\n const emission = {} as Emission\n let totalA1A3 = 0\n\n if (gwpResult?.other?.anies) {\n gwpResult.other.anies.forEach((entry: any) => {\n const module = entry.module?.toLowerCase().replace(/-/g, '') as string\n const amount = parseFloat(entry.value)\n\n if (['a1', 'a2', 'a3'].includes(module)) {\n totalA1A3 += amount\n } else {\n emission.gwp = emission.gwp || {} as LifeCycleStageEmission\n emission.gwp[module] = { amount }\n }\n })\n\n if (totalA1A3 > 0) {\n emission.gwp = emission.gwp || {} as LifeCycleStageEmission\n emission.gwp['a1a3'] = totalA1A3 \n }\n }\n\n // Extract unit and quantity\n const exchange = data?.exchanges?.exchange?.[0]\n const flowProperties = exchange?.flowProperties || []\n const referenceProperty = flowProperties.find(\n (prop: any) => prop.referenceUnit\n )\n const unit = referenceProperty?.referenceUnit || ''\n const quantity = parseFloat(referenceProperty?.meanValue || '0')\n\n // Build the product object\n const product: Product = {\n id: data.processInformation.dataSetInformation.UUID,\n name:\n data.processInformation.dataSetInformation.name.baseName[0]?.value ||\n '',\n description:\n data.processInformation.technology\n .technologyDescriptionAndIncludedProcesses[0]?.value || '',\n referenceServiceLife: 50,\n impactData: null,\n quantity,\n unit,\n transport: null,\n results: null,\n metaData,\n emission,\n source: Source.ECOPortal,\n }\n return product\n}\n\n/**\n * Extracts data from Revalu and their different data structure\n * @param data \n * @returns \n */\nconst extractRevaluData = (response: { body: RevaluData }, collection: string = \"\") => {\n const data = response.body\n const emission: Emission = {\n gwp: data.gwp,\n gwp_fossil: data.gwp_fossil,\n //gwp_biogenic: data.gwp_biogenic,\n //gwp_luluc: data.gwp_luluc,\n fw: data.fw,\n pert: data.pert,\n penrt: data.penrt,\n //energy_mix_percentage: data.energy_mix_percentage,\n }\n const product: Product = {\n id: data.id,\n name: data.name,\n description: data.manufacturer,\n referenceServiceLife: 50,\n impactData: null,\n quantity: 1,\n unit: data.declared_unit,\n transport: null,\n results: null,\n emission,\n source: Source.Revalu,\n metaData: { Collection: collection },\n }\n return product\n}\n\n/**\n * Checks projectstore and gets the relevant EPD service\n * @returns \n */\nfunction getEPDService(): EPDService {\n const settingsStore = useSettingsStore()\n\n switch (settingsStore.materialSettings.epdSource) {\n case EPDSource.EcoPortal:\n return new EcoPortalService()\n case EPDSource.Revalu:\n return new RevaluService()\n default:\n throw new Error('Unsupported EPD source')\n }\n}\n\n/**\n * Get all EPDs from chosen API\n * Acording to parameters, check API documentation for more information\n * @param parameters Key value pairs for the API call\n * @returns List of products with emission data\n */\nexport async function getEPDList(parameters: { [key: string]: string | string[] } = {}): Promise {\n const epdService = getEPDService()\n const EPDList: Product[] = []\n const apiClient = epdService.createApiClient()\n const baseUrl = epdService.createListUrl()\n let params = epdService.createListParams()\n\n params = { ...params, ...parameters }\n\n await delay(1000)\n\n while (EPDList.length < MAX_EPD_COUNT) {\n try {\n const response = await apiClient.get(baseUrl, { params })\n const data = response.data\n\n const epdListData = epdService.extractEPDList(data)\n\n if (!epdListData || epdListData.length === 0) {\n console.log('No more data to fetch')\n break\n }\n\n for (const epd of epdListData) {\n const product = await getSpecificEPD(epd)\n if (product) {\n EPDList.push(product)\n }\n }\n\n params = epdService.updatePageIndex(params)\n } catch (error) {\n console.error('Error fetching EPD list:', error)\n break\n }\n }\n\n return EPDList\n}\n\n/**\n * Fetches a specific EPD\n * @param epd The EPD data containing uuid and nodeid for ecoportal.\n * @returns A Product with EPD data or null if an error occurs.\n */\nexport async function getSpecificEPD(epd: any): Promise {\n const epdService = getEPDService()\n const apiClient = epdService.createApiClient()\n const url = epdService.createEPDUrl(epd)\n const params = epdService.createEPDParams()\n\n try {\n const response = await apiClient.get(url, { params })\n const data = response.data\n\n return epdService.extractEPDData(data)\n } catch (error) {\n console.error(`Error fetching EPD ${epd.uuid}:`, error)\n return null\n }\n}\n\nexport function isAssembly(val: any): val is Assembly {\n return val && typeof val === 'object' && 'products' in val && 'id' in val;\n}\n\n/**\n * Gets all collections from Revalu, and fetches all EPDs from them\n * Only available for Revalu for now, not sure if ECOportal has collections\n * @returns Products from collections converted to EPDx format\n */\nexport async function getCollection(): Promise {\n const epdService = getEPDService()\n const apiClient = epdService.createApiClient()\n const url = epdService.createCollectionUrl()\n\n try {\n const collectionEpds: Product[] = []\n const response = await apiClient.get(url)\n const data = response.data as RevaluCollection[]\n\n for (const collection of data) {\n const collectionDetailsUrl = epdService.createCollectionDetailsUrl(collection.collection_id)\n const collectionResponse = await apiClient.get(collectionDetailsUrl)\n\n const collectionData = collectionResponse.data as RevaluSingleCollection\n\n for (const product of collectionData.materials) {\n collectionEpds.push(extractRevaluData({ body: product }, collection.collection_name))\n }\n }\n \n return collectionEpds\n } catch (error) {\n console.error(`Error fetching Collections:`, error)\n return null\n }\n}","import { useProjectStore } from '@/stores/main'\nimport { useSettingsStore } from '@/stores/settings'\nimport { isAssembly } from '@/utils/EPDUtils'\n\nimport type { GeometryObject } from '@/models/geometryObject'\nimport type { LifeCycleStageEmission, Product, Emission } from '@/models/material'\nimport type { Results } from '@/models/result'\n\n/**\n * EmissionCalculator class to calculate the emissions of geometry objects if none sent calculate for all\n */\nexport class EmissionCalculator {\n private geo: GeometryObject[] = []\n private settingsStore = useSettingsStore()\n\n constructor(geo: GeometryObject[] = []) {\n const projectStore = useProjectStore()\n this.geo = geo\n if (projectStore.currProject) {\n // If no geometry is provided, calculate for all geometry objects in the project.\n if (geo.length === 0) {\n this.geo = projectStore.currProject.geometry\n }\n \n if (projectStore.currProject.results == null)\n projectStore.currProject.results = []\n }\n }\n\n /**\n * Calculate the emissions of the current geo and attach the results to the geo\n * @param geo\n * @returns\n */\n calculateEmissions(): Results | boolean {\n // Go through each geometry object and calculate the emissions\n for (const geo of this.geo) {\n let result: Results | boolean = false\n if (!geo.material) continue\n\n const emissions: Emission = { \n [this.settingsStore.calculationSettings.standardImpactCategory]: {} as LifeCycleStageEmission }\n const material = geo.material\n\n if (isAssembly(material)) {\n const products = material.products\n result = this.processAssembly(products, emissions, geo)\n } else {\n result = this.processEPD(material as Product, emissions, geo)\n }\n\n if (result) {\n result = this.addEmissionsToGeo(emissions, geo)\n }\n }\n return true\n }\n\n private processAssembly(\n material: { materials?: Product[] },\n emissions: Emission,\n geo: GeometryObject\n ): boolean {\n if (!material.materials) return false\n\n for (const mat of material.materials) {\n if (mat.emission) {\n this.calculateMaterialEmissions(mat, emissions, geo)\n }\n }\n return true\n }\n\n private processEPD(\n material: Product,\n emissions: Emission,\n geo: GeometryObject\n ): boolean {\n if (material.emission) {\n if (this.calculateMaterialEmissions(material, emissions, geo))\n return true\n else \n return false\n }\n return false\n }\n\n // Calculate the emissions of the material and add it to the emissions object\n // TODO this should calculate for all impact categories and then just show the relevant one, its other way around now.\n private calculateMaterialEmissions(\n mat: Product,\n emissions: Emission,\n geo: GeometryObject\n ): boolean {\n const impactCategory = this.settingsStore.calculationSettings.standardImpactCategory\n let matEmission: LifeCycleStageEmission = mat.emission[impactCategory]\n\n // Check if we have the emission for the selected impact category, if not use gwp as fallback\n if (!mat.emission[impactCategory]) {\n if (!mat.emission['gwp'])\n return false\n matEmission = mat.emission['gwp']\n }\n\n // Check if we have the emission else add it as empty object\n if (!emissions[impactCategory]) {\n emissions[impactCategory] = {} as LifeCycleStageEmission\n }\n\n for (const phase in matEmission) {\n // Check if the phase is included in the calculation settings, if not skip it\n if (this.settingsStore.calculationSettings.includedStages.relevantStages.some(\n (stage) => phase === stage.stage && stage.included)\n ){\n let value = matEmission[phase]\n if (value === undefined) value = matEmission[phase]\n if (value !== null && !isNaN(Number(value))) {\n const emissionValue = parseFloat(value as string) * geo.quantity[mat.unit]\n \n if (!emissions[impactCategory][phase]) {\n emissions[impactCategory][phase] = 0\n }\n \n const currentAmount = emissions[impactCategory][phase] || 0\n emissions[impactCategory][phase] = currentAmount + emissionValue\n }\n }\n }\n return true\n }\n\n /**\n * Attached emissions to Geo object\n * @param geo \n * @param emissions \n */\n private addEmissionsToGeo(\n emissions: Emission,\n geo: GeometryObject\n ) {\n const result: Results = {\n id: crypto.randomUUID(),\n date: new Date(),\n emission: emissions,\n }\n if (geo.results) {\n geo.results.push(result)\n } else {\n geo.results = [result]\n }\n return result\n }\n}","\n\n\n","\n\n\n","\n\n","import type { Group } from '@/models/filters'\nimport type { GeometryObject } from '@/models/geometryObject'\n\nimport { useProjectStore } from '@/stores/main'\nimport { useSpeckleStore } from '@/stores/speckle'\nimport { getTextAfterLastDot } from '@/utils/stringUtils'\n\n/**\n * Recursively searches an object for the specified key and applies the comparison function to its value.\n * @param obj Object to search\n * @param field The key whose value should be checked\n * @param comparisonFn Function to compare the value of the key\n * @param filterValue The value to compare against\n * @returns boolean\n */\nfunction recursiveValueCheck(\n obj: Record,\n field: string,\n comparisonFn: (a: any, b: any) => boolean,\n filterValue: any\n): boolean | null {\n let hasField = false\n\n //Check top level of object\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key]\n\n // Check if the current key matches the field and apply the comparison function\n if (key === field) {\n hasField = true\n // If the value is an object, check if it has a 'value' property and compare that\n if (typeof value === 'object') { \n if ('value' in value && value.value != null) {\n if (comparisonFn(value.value, filterValue)) {\n return true\n } else {\n return false\n }\n }\n }\n if (comparisonFn(value, filterValue)) {\n return true\n } else {\n return false\n }\n }\n }\n }\n\n // If the field was not found in the object we check deeper\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key]\n // If the value is an object, recurse into it\n if (typeof value === 'object') {\n const result = recursiveValueCheck(value, field, comparisonFn, filterValue)\n if (result) {\n return result // Return the value as soon as it's found\n }\n }\n }\n }\n\n return false\n}\n\n/**\n * Recursively searches for the value of the specified field in an object.\n * @param obj Object to search\n * @param field Target field name\n * @returns The value of the field, or null if not found\n */\nfunction recursiveFieldSearch(obj: Record, field: string): any | null {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n // If the key matches the target field, return its value\n if (key === field) {\n const value = obj[key]\n if (typeof value === 'object')\n if ('value' in value && value.value != null)\n return value.value // If the value is an object, return its value property\n if (typeof value === 'string' || typeof value === 'number') // Check type here so we dont get array or some strange object\n return value \n }\n }\n }\n\n // If we didnt find at first level we go deeper\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key]\n // If the value is an object and we didnt match field, recurse into it\n if (typeof value === 'object') {\n const result = recursiveFieldSearch(value, field)\n if (result) {\n return result // Return the value as soon as it's found\n }\n }\n }\n }\n\n\n return false\n}\n\n/**\n * Generic function to add filters to a registry\n * @param name name of filter\n * @param filterFn function of filter always returns an array of groups\n * @param registry registry to add filters to\n */\nfunction addFilter(\n name: string,\n filterFn: (inGroup: Group[], field: string, value?: any, remove?: boolean) => Group[]\n) {\n const projectStore = useProjectStore()\n const registry = projectStore.filterRegistry\n registry.addFilter(name, filterFn)\n}\n\n/**\n * generic function to create a filter that uses boolean comparisons on a field with specified value\n * @param comparisonFn function for comparison\n * @param name name of filter\n */\nfunction createComparisonFilter (\n name: string,\n comparisonFn: (a: any, b: any) => boolean,\n) {\n const speckleStore = useSpeckleStore()\n addFilter(\n name,\n (inGroup, field, filterValue, remove) => {\n const outGroup: { [key: string]: Group } = {}\n // Go through each group and find the objects that match the comparison function\n for (const grp of inGroup) {\n // Go through each obj in group\n for (const obj of grp.elements) {\n // Check if parameter exists, if not hide object\n if (!obj.parameters && remove) {\n speckleStore.addHiddenObject(obj)\n continue\n }\n // Search specified object recursively for value \n const matches = recursiveValueCheck(obj.parameters, field, comparisonFn, filterValue);\n\n if (matches) {\n addObjToGroup(outGroup, obj, true, grp, filterValue)\n } else if (remove) {\n speckleStore.addHiddenObject(obj)\n } else if (!remove) {\n addObjToGroup(outGroup, obj, false, grp, filterValue)\n }\n }\n }\n return Object.values(outGroup)\n }\n )\n}\n\n/**\n * Exmaple of how filters are structured\n * Creates standardfilters\n * @param registry \n */\nexport function createStandardFilters() {\n // Define filters\n createComparisonFilter('equalsFilter', (a, b) => a === b)\n createComparisonFilter('notEqualsFilter', (a, b) => a !== b)\n createComparisonFilter('greaterThan', (a, b) => !isNaN(Number(a)) && Number(a) > Number(b))\n\n /**\n * Groupby filter using only field\n */\n addFilter('groupBy', (inGroup, field) => {\n const outGroup: { [field: string]: Group } = {}\n for (const grp of inGroup) {\n for (const obj of grp.elements) {\n if (!obj.parameters) throw new Error(`No parameters found for '${obj.id}'.`)\n const fieldValue = recursiveFieldSearch(obj.parameters, field) || \"No Data\"\n\n const pathName = getTextAfterLastDot(fieldValue)\n addObjToGroup(outGroup, obj, true, grp, pathName)\n }\n }\n return Object.values(outGroup)\n })\n}\n\n/**\n * Generic function to push objects into the right group object\n * @param outGroup Groups to add objects to\n * @param obj Obj to add\n * @param condition remove or not\n * @param inGroup Existing group\n * @param fieldValue name of field filtering\n */\nfunction addObjToGroup(\n outGroup: { [key: string]: Group },\n obj: GeometryObject,\n condition: boolean,\n inGroup: Group,\n fieldValue: string\n) {\n const pathName = condition ? fieldValue : `!${fieldValue}`\n const uniqueField = pathName + inGroup.path.join('')\n const paths: string[] = [...inGroup.path, pathName]\n\n if (uniqueField in outGroup) {\n outGroup[uniqueField].elements.push(obj)\n } else {\n outGroup[uniqueField] = {\n id: uniqueField,\n name: pathName,\n path: paths,\n elements: [obj],\n }\n }\n}\n","import type { GeometryObject } from './geometryObject'\n\n/**\n * Filters done in correct sequencing with arguments to be used for each step\n */\nexport interface FilterList {\n\tname: string\n\tid: string\n\tcallStack: Filter[]\n}\n\n/**\n * Interface for filterList\n * name: The name of the filter that is added to the registry\n * field: GeoObject property which to run filter on\n * value: Optional value to use for comparrison in the filter\n * remove: Optional boolean if you want to remove all false results\n */\nexport interface Filter {\n\tname: string\n\tfield: string\n\tvalue?: string\n\tremove?: boolean\n}\n\n/**\n * Grouped geometryObjects with path and color information\n */\nexport interface Group {\n\tid: string\n\tname: string\n\t// Path describes how group is shown in the tree view.\n\t// Always put in the root first and then final name last\n\t// eg. [\"Wall\", \"Inner Wall\", \"Type 1\"]\n\tpath: string[]\n\telements: GeometryObject[]\n\tcolor?: string\n}\n\n/**\n * Filter registry to store all filter functions\n */\nexport class FilterRegistry {\n\tpublic filters: {\n\t\t[filterName: string]: Function\n\t} = {}\n\n\tpublic filterCallStack: FilterList = {\n\t\tname: '',\n\t\tid: '',\n\t\tcallStack: []\n\t}\n\n\t/**\n\t * Add functions to registry by providing a name and the function with 3 set parameters\n\t * @param name\n\t * @param filter\n\t * required inputs on filter (inGroup: Group[], field: string, value: string)\n\t * required output Group[]\n\t */\n\taddFilter(\n\t\tname: string,\n\t\tfilter: (\n\t\t\tinGroup: Group[],\n\t\t\tfield: string,\n\t\t\tvalue?: string,\n\t\t\tremove?: boolean\n\t\t) => Group[]\n\t) {\n\t\tthis.filters[name] = filter\n\t}\n\n\t/**\n\t * Call Filter defined in registry and return grouping\n\t * @param name name of filter\n\t * @param inGroup group to filter, has to have a root level atleast\n\t * @param field field to filter upon\n\t * @param value value to use for filtering true or false\n\t * @param remove remove all false results\n\t * @returns Group[] from filter\n\t */\n\tcallFilter(\n\t\tname: string,\n\t\tinGroup: Group[],\n\t\tfield: string,\n\t\tvalue?: string,\n\t\tremove?: boolean\n\t) {\n\t\tconst filter = this.filters[name]\n\t\tif (typeof filter === 'function') {\n\t\t\treturn filter(inGroup, field, value, remove)\n\t\t} else {\n\t\t\tthrow new Error(`Function '${name}' not found.`)\n\t\t}\n\t}\n\n\t/**\n\t * Get all filternames available for the registry, currently using real function name\n\t * Should maybe be changed to a more proper name later\n\t * @returns list of filter names available for registry\n\t */\n\tgetFilterNames(): string[] {\n\t\treturn Object.keys(this.filters)\n\t}\n}\n\n/**\n * Interface for tree created for grouped up object list\n */\nexport interface NestedGroup {\n\tname: string\n\tobjects: GeometryObject[]\n\tid: string\n\tchildren: NestedGroup[]\n\tcolor?: string\n}\n","\n\n\n","\n\n\n\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"m21 7.5-2.25-1.313M21 7.5v2.25m0-2.25-2.25 1.313M3 7.5l2.25-1.313M3 7.5l2.25 1.313M3 7.5v2.25m9 3 2.25-1.313M12 12.75l-2.25-1.313M12 12.75V15m0 6.75 2.25-1.313M12 21.75V19.5m0 2.25-2.25-1.313m0-16.875L12 2.25l2.25 1.313M21 14.25v2.25l-2.25 1.313m-13.5 0L3 16.5v-2.25\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M3.98 8.223A10.477 10.477 0 0 0 1.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.451 10.451 0 0 1 12 4.5c4.756 0 8.773 3.162 10.065 7.498a10.522 10.522 0 0 1-4.293 5.774M6.228 6.228 3 3m3.228 3.228 3.65 3.65m7.894 7.894L21 21m-3.228-3.228-3.65-3.65m0 0a3 3 0 1 0-4.243-4.243m4.242 4.242L9.88 9.88\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"m2.25 12 8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M16.5 10.5V6.75a4.5 4.5 0 1 0-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 0 0 2.25-2.25v-6.75a2.25 2.25 0 0 0-2.25-2.25H6.75a2.25 2.25 0 0 0-2.25 2.25v6.75a2.25 2.25 0 0 0 2.25 2.25Z\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"m15.75 10.5 4.72-4.72a.75.75 0 0 1 1.28.53v11.38a.75.75 0 0 1-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25h-9A2.25 2.25 0 0 0 2.25 7.5v9a2.25 2.25 0 0 0 2.25 2.25Z\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M7.5 3.75H6A2.25 2.25 0 0 0 3.75 6v1.5M16.5 3.75H18A2.25 2.25 0 0 1 20.25 6v1.5m0 9V18A2.25 2.25 0 0 1 18 20.25h-1.5m-9 0H6A2.25 2.25 0 0 1 3.75 18v-1.5M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M6 18 18 6M6 6l12 12\"\n })\n ]))\n}","\n\n\n","\n\n\n","\n \n \n ","\n\n","\n\n\n","\n\n","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/*!\n * Chart.js v4.4.7\n * https://www.chartjs.org\n * (c) 2024 Chart.js Contributors\n * Released under the MIT License\n */\nimport { Color } from '@kurkle/color';\n\n/**\n * @namespace Chart.helpers\n */ /**\n * An empty function that can be used, for example, for optional callback.\n */ function noop() {\n/* noop */ }\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */ const uid = (()=>{\n let id = 0;\n return ()=>id++;\n})();\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isNullOrUndef(value) {\n return value === null || value === undefined;\n}\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */ function isArray(value) {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isObject(value) {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */ function isNumberFinite(value) {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */ function finiteOrDefault(value, defaultValue) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */ function valueOrDefault(value, defaultValue) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 : +value / dimension;\nconst toDimension = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 * dimension : +value;\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */ function callback(fn, args, thisArg) {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n let i, len, keys;\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for(i = len - 1; i >= 0; i--){\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for(i = 0; i < len; i++){\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for(i = 0; i < len; i++){\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */ function _elementsEqual(a0, a1) {\n let i, ilen, v0, v1;\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n for(i = 0, ilen = a0.length; i < ilen; ++i){\n v0 = a0[i];\n v1 = a1[i];\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n return true;\n}\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */ function clone(source) {\n if (isArray(source)) {\n return source.map(clone);\n }\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n for(; k < klen; ++k){\n target[keys[k]] = clone(source[keys[k]]);\n }\n return target;\n }\n return source;\n}\nfunction isValidKey(key) {\n return [\n '__proto__',\n 'prototype',\n 'constructor'\n ].indexOf(key) === -1;\n}\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */ function _merger(key, target, source, options) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\nfunction merge(target, source, options) {\n const sources = isArray(source) ? source : [\n source\n ];\n const ilen = sources.length;\n if (!isObject(target)) {\n return target;\n }\n options = options || {};\n const merger = options.merger || _merger;\n let current;\n for(let i = 0; i < ilen; ++i){\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n const keys = Object.keys(current);\n for(let k = 0, klen = keys.length; k < klen; ++k){\n merger(keys[k], target, current, options);\n }\n }\n return target;\n}\nfunction mergeIf(target, source) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {\n merger: _mergerIf\n });\n}\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */ function _mergerIf(key, target, source) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n/**\n * @private\n */ function _deprecated(scope, value, previous, current) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous + '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': (v)=>v,\n // default resolvers\n x: (o)=>o.x,\n y: (o)=>o.y\n};\n/**\n * @private\n */ function _splitKey(key) {\n const parts = key.split('.');\n const keys = [];\n let tmp = '';\n for (const part of parts){\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\nfunction _getKeyResolver(key) {\n const keys = _splitKey(key);\n return (obj)=>{\n for (const k of keys){\n if (k === '') {\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\nfunction resolveObjectKey(obj, key) {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n/**\n * @private\n */ function _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value)=>typeof value !== 'undefined';\nconst isFunction = (value)=>typeof value === 'function';\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nconst setsEqual = (a, b)=>{\n if (a.size !== b.size) {\n return false;\n }\n for (const item of a){\n if (!b.has(item)) {\n return false;\n }\n }\n return true;\n};\n/**\n * @param e - The event\n * @private\n */ function _isClickEvent(e) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */ const PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction almostEquals(x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n}\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */ function niceNum(range) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */ function _factorize(value) {\n const result = [];\n const sqrt = Math.sqrt(value);\n let i;\n for(i = 1; i < sqrt; i++){\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) {\n result.push(sqrt);\n }\n result.sort((a, b)=>a - b).pop();\n return result;\n}\nfunction isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostWhole(x, epsilon) {\n const rounded = Math.round(x);\n return rounded - epsilon <= x && rounded + epsilon >= x;\n}\n/**\n * @private\n */ function _setMinAndMaxByKey(array, target, property) {\n let i, ilen, value;\n for(i = 0, ilen = array.length; i < ilen; i++){\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\nfunction toRadians(degrees) {\n return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n return radians * (180 / PI);\n}\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */ function _decimalPlaces(x) {\n if (!isNumberFinite(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while(Math.round(x * e) / e !== x){\n e *= 10;\n p++;\n }\n return p;\n}\n// Gets the angle from vertical upright to the point about a centre.\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n if (angle < -0.5 * PI) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */ function _angleDiff(a, b) {\n return (a - b + PITAU) % TAU - PI;\n}\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */ function _normalizeAngle(a) {\n return (a % TAU + TAU) % TAU;\n}\n/**\n * @private\n */ function _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || sameAngleIsFullCircle && s === e || angleToStart > angleToEnd && startToAngle < endToAngle;\n}\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */ function _limitValue(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n/**\n * @param {number} value\n * @private\n */ function _int16Range(value) {\n return _limitValue(value, -32768, 32767);\n}\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */ function _isBetween(value, start, end, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n\nfunction _lookup(table, value, cmp) {\n cmp = cmp || ((index)=>table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid;\n while(hi - lo > 1){\n mid = lo + hi >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return {\n lo,\n hi\n };\n}\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */ const _lookupByKey = (table, key, value, last)=>_lookup(table, value, last ? (index)=>{\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n } : (index)=>table[index][key] < value);\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */ const _rlookupByKey = (table, key, value)=>_lookup(table, value, (index)=>table[index][key] >= value);\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */ function _filterBetween(values, min, max) {\n let start = 0;\n let end = values.length;\n while(start < end && values[start] < min){\n start++;\n }\n while(end > start && values[end - 1] > max){\n end--;\n }\n return start > 0 || end < values.length ? values.slice(start, end) : values;\n}\nconst arrayEvents = [\n 'push',\n 'pop',\n 'shift',\n 'splice',\n 'unshift'\n];\nfunction listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [\n listener\n ]\n }\n });\n arrayEvents.forEach((key)=>{\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value (...args) {\n const res = base.apply(this, args);\n array._chartjs.listeners.forEach((object)=>{\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n return res;\n }\n });\n });\n}\nfunction unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n if (listeners.length > 0) {\n return;\n }\n arrayEvents.forEach((key)=>{\n delete array[key];\n });\n delete array._chartjs;\n}\n/**\n * @param items\n */ function _arrayUnique(items) {\n const set = new Set(items);\n if (set.size === items.length) {\n return items;\n }\n return Array.from(set);\n}\n\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n/**\n* Request animation polyfill\n*/ const requestAnimFrame = function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}();\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */ function throttled(fn, thisArg) {\n let argsToUse = [];\n let ticking = false;\n return function(...args) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, ()=>{\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n/**\n * Debounces calling `fn` for `delay` ms\n */ function debounce(fn, delay) {\n let timeout;\n return function(...args) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */ const _toLeftRightCenter = (align)=>align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */ const _alignStartEnd = (align, start, end)=>align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */ const _textX = (align, left, right, rtl)=>{\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n/**\n * Return start and count of visible points.\n * @private\n */ function _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n const pointCount = points.length;\n let start = 0;\n let count = pointCount;\n if (meta._sorted) {\n const { iScale , _parsed } = meta;\n const axis = iScale.axis;\n const { min , max , minDefined , maxDefined } = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(Math.min(// @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo, // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo), 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(Math.max(// @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1, // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1), start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n return {\n start,\n count\n };\n}\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */ function _scaleRangesChanged(meta) {\n const { xScale , yScale , _scaleRanges } = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min || _scaleRanges.xmax !== xScale.max || _scaleRanges.ymin !== yScale.min || _scaleRanges.ymax !== yScale.max;\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n\nconst atEdge = (t)=>t === 0 || t === 1;\nconst elasticIn = (t, s, p)=>-(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p)=>Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */ const effects = {\n linear: (t)=>t,\n easeInQuad: (t)=>t * t,\n easeOutQuad: (t)=>-t * (t - 2),\n easeInOutQuad: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1),\n easeInCubic: (t)=>t * t * t,\n easeOutCubic: (t)=>(t -= 1) * t * t + 1,\n easeInOutCubic: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2),\n easeInQuart: (t)=>t * t * t * t,\n easeOutQuart: (t)=>-((t -= 1) * t * t * t - 1),\n easeInOutQuart: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t : -0.5 * ((t -= 2) * t * t * t - 2),\n easeInQuint: (t)=>t * t * t * t * t,\n easeOutQuint: (t)=>(t -= 1) * t * t * t * t + 1,\n easeInOutQuint: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t * t : 0.5 * ((t -= 2) * t * t * t * t + 2),\n easeInSine: (t)=>-Math.cos(t * HALF_PI) + 1,\n easeOutSine: (t)=>Math.sin(t * HALF_PI),\n easeInOutSine: (t)=>-0.5 * (Math.cos(PI * t) - 1),\n easeInExpo: (t)=>t === 0 ? 0 : Math.pow(2, 10 * (t - 1)),\n easeOutExpo: (t)=>t === 1 ? 1 : -Math.pow(2, -10 * t) + 1,\n easeInOutExpo: (t)=>atEdge(t) ? t : t < 0.5 ? 0.5 * Math.pow(2, 10 * (t * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n easeInCirc: (t)=>t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1),\n easeOutCirc: (t)=>Math.sqrt(1 - (t -= 1) * t),\n easeInOutCirc: (t)=>(t /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n easeInElastic: (t)=>atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n easeOutElastic: (t)=>atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n easeInOutElastic (t) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t : t < 0.5 ? 0.5 * elasticIn(t * 2, s, p) : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n easeInBack (t) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n easeOutBack (t) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n easeInOutBack (t) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);\n },\n easeInBounce: (t)=>1 - effects.easeOutBounce(1 - t),\n easeOutBounce (t) {\n const m = 7.5625;\n const d = 2.75;\n if (t < 1 / d) {\n return m * t * t;\n }\n if (t < 2 / d) {\n return m * (t -= 1.5 / d) * t + 0.75;\n }\n if (t < 2.5 / d) {\n return m * (t -= 2.25 / d) * t + 0.9375;\n }\n return m * (t -= 2.625 / d) * t + 0.984375;\n },\n easeInOutBounce: (t)=>t < 0.5 ? effects.easeInBounce(t * 2) * 0.5 : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5\n};\n\nfunction isPatternOrGradient(value) {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n return false;\n}\nfunction color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\nfunction getHoverColor(value) {\n return isPatternOrGradient(value) ? value : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n\nconst numbers = [\n 'x',\n 'y',\n 'borderWidth',\n 'radius',\n 'tension'\n];\nconst colors = [\n 'color',\n 'borderColor',\n 'backgroundColor'\n];\nfunction applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined\n });\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name)=>name !== 'onProgress' && name !== 'onComplete' && name !== 'fn'\n });\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n }\n });\n defaults.describe('animations', {\n _fallback: 'animation'\n });\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0\n }\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: (v)=>v | 0\n }\n }\n }\n });\n}\n\nfunction applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\nfunction formatNumber(num, locale, options) {\n return getNumberFormat(locale, options).format(num);\n}\n\nconst formatters = {\n values (value) {\n return isArray(value) ? value : '' + value;\n },\n numeric (tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue;\n if (ticks.length > 1) {\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n delta = calculateDelta(tickValue, ticks);\n }\n const logDelta = log10(Math.abs(delta));\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n const options = {\n notation,\n minimumFractionDigits: numDecimal,\n maximumFractionDigits: numDecimal\n };\n Object.assign(options, this.options.ticks.format);\n return formatNumber(tickValue, locale, options);\n },\n logarithmic (tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || tickValue / Math.pow(10, Math.floor(log10(tickValue)));\n if ([\n 1,\n 2,\n 3,\n 5,\n 10,\n 15\n ].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n};\nfunction calculateDelta(tickValue, ticks) {\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n var Ticks = {\n formatters\n};\n\nfunction applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n bounds: 'ticks',\n clip: true,\n grace: 0,\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options)=>options.lineWidth,\n tickColor: (_ctx, options)=>options.color,\n offset: false\n },\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n title: {\n display: false,\n text: '',\n padding: {\n top: 4,\n bottom: 4\n }\n },\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2\n }\n });\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name)=>!name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name)=>name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash'\n });\n defaults.describe('scales', {\n _fallback: 'scale'\n });\n defaults.describe('scale.ticks', {\n _scriptable: (name)=>name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name)=>name !== 'backdropPadding'\n });\n}\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\n function getScope$1(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for(let i = 0, n = keys.length; i < n; ++i){\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope$1(root, scope), values);\n }\n return merge(getScope$1(root, ''), scope);\n}\n class Defaults {\n constructor(_descriptors, _appliers){\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context)=>context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options)=>getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options)=>getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options)=>getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n set(scope, values) {\n return set(this, scope, values);\n }\n get(scope) {\n return getScope$1(this, scope);\n }\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n override(scope, values) {\n return set(overrides, scope, values);\n }\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope$1(this, scope);\n const targetScopeObject = getScope$1(this, targetScope);\n const privateName = '_' + name;\n Object.defineProperties(scopeObject, {\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n [name]: {\n enumerable: true,\n get () {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set (value) {\n this[privateName] = value;\n }\n }\n });\n }\n apply(appliers) {\n appliers.forEach((apply)=>apply(this));\n }\n}\nvar defaults = /* #__PURE__ */ new Defaults({\n _scriptable: (name)=>!name.startsWith('on'),\n _indexable: (name)=>name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false\n }\n}, [\n applyAnimationsDefaults,\n applyLayoutsDefaults,\n applyScaleDefaults\n]);\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */ function toFontString(font) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n return (font.style ? font.style + ' ' : '') + (font.weight ? font.weight + ' ' : '') + font.size + 'px ' + font.family;\n}\n/**\n * @private\n */ function _measureText(ctx, data, gc, longest, string) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n/**\n * @private\n */ // eslint-disable-next-line complexity\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n ctx.save();\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i, j, jlen, thing, nestedThing;\n for(i = 0; i < ilen; i++){\n thing = arrayOfThings[i];\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for(j = 0, jlen = thing.length; j < jlen; j++){\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n ctx.restore();\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for(i = 0; i < gcLen; i++){\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */ function _alignPixel(chart, pixel, width) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n/**\n * Clears the entire canvas.\n */ function clearCanvas(canvas, ctx) {\n if (!ctx && !canvas) {\n return;\n }\n ctx = ctx || canvas.getContext('2d');\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n// eslint-disable-next-line complexity\nfunction drawPointLegend(ctx, options, x, y, w) {\n let type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n ctx.beginPath();\n switch(style){\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */ case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */ case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */ function _isPointInArea(point, area, margin) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n return !area || point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin;\n}\nfunction clipArea(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\nfunction unclipArea(ctx) {\n ctx.restore();\n}\n/**\n * @private\n */ function _steppedLineTo(ctx, previous, target, flip, mode) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n/**\n * @private\n */ function _bezierCurveTo(ctx, previous, target, flip) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(flip ? previous.cp1x : previous.cp2x, flip ? previous.cp1y : previous.cp2y, flip ? target.cp2x : target.cp1x, flip ? target.cp2y : target.cp1y, target.x, target.y);\n}\nfunction setRenderOpts(ctx, opts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */ const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\nfunction drawBackdrop(ctx, opts) {\n const oldColor = ctx.fillStyle;\n ctx.fillStyle = opts.color;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n/**\n * Render text onto the canvas\n */ function renderText(ctx, text, x, y, font, opts = {}) {\n const lines = isArray(text) ? text : [\n text\n ];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i, line;\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n for(i = 0; i < lines.length; ++i){\n line = lines[i];\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n y += Number(font.lineHeight);\n }\n ctx.restore();\n}\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */ function addRoundedRectPath(ctx, rect) {\n const { x , y , w , h , radius } = rect;\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n/**\n * @alias Chart.helpers.options\n * @namespace\n */ /**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */ function toLineHeight(value, size) {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n value = +matches[2];\n switch(matches[3]){\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n }\n return size * value;\n}\nconst numberOrZero = (v)=>+v || 0;\nfunction _readValueToProps(value, props) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value) ? objProps ? (prop)=>valueOrDefault(value[prop], value[props[prop]]) : (prop)=>value[prop] : ()=>value;\n for (const prop of keys){\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */ function toTRBL(value) {\n return _readValueToProps(value, {\n top: 'y',\n right: 'x',\n bottom: 'y',\n left: 'x'\n });\n}\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */ function toTRBLCorners(value) {\n return _readValueToProps(value, [\n 'topLeft',\n 'topRight',\n 'bottomLeft',\n 'bottomRight'\n ]);\n}\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */ function toPadding(value) {\n const obj = toTRBL(value);\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n return obj;\n}\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */ function toFont(options, fallback) {\n options = options || {};\n fallback = fallback || defaults.font;\n let size = valueOrDefault(options.size, fallback.size);\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n font.string = toFontString(font);\n return font;\n}\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */ function resolve(inputs, context, index, info) {\n let cacheable = true;\n let i, ilen, value;\n for(i = 0, ilen = inputs.length; i < ilen; ++i){\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */ function _addGrace(minmax, grace, beginAtZero) {\n const { min , max } = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value, add)=>beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\nfunction createContext(parentContext, context) {\n return Object.assign(Object.create(parentContext), context);\n}\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */ function _createResolver(scopes, prefixes = [\n ''\n], rootScopes, fallback, getTarget = ()=>scopes[0]) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope)=>_createResolver([\n scope,\n ...scopes\n ], prefixes, finalRootScopes, fallback)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */ deleteProperty (target, prop) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n /**\n * A trap for getting property values.\n */ get (target, prop) {\n return _cached(target, prop, ()=>_resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */ getOwnPropertyDescriptor (target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n /**\n * A trap for Object.getPrototypeOf.\n */ getPrototypeOf () {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n /**\n * A trap for the in operator.\n */ has (target, prop) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */ ownKeys (target) {\n return getKeysFromAllScopes(target);\n },\n /**\n * A trap for setting property values.\n */ set (target, prop, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n });\n}\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */ function _attachContext(proxy, context, subProxy, descriptorDefaults) {\n const cache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx)=>_attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope)=>_attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */ deleteProperty (target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n /**\n * A trap for getting property values.\n */ get (target, prop, receiver) {\n return _cached(target, prop, ()=>_resolveWithContext(target, prop, receiver));\n },\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */ getOwnPropertyDescriptor (target, prop) {\n return target._descriptors.allKeys ? Reflect.has(proxy, prop) ? {\n enumerable: true,\n configurable: true\n } : undefined : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n /**\n * A trap for Object.getPrototypeOf.\n */ getPrototypeOf () {\n return Reflect.getPrototypeOf(proxy);\n },\n /**\n * A trap for the in operator.\n */ has (target, prop) {\n return Reflect.has(proxy, prop);\n },\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */ ownKeys () {\n return Reflect.ownKeys(proxy);\n },\n /**\n * A trap for setting property values.\n */ set (target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n });\n}\n/**\n * @private\n */ function _descriptors(proxy, defaults = {\n scriptable: true,\n indexable: true\n}) {\n const { _scriptable =defaults.scriptable , _indexable =defaults.indexable , _allKeys =defaults.allKeys } = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : ()=>_scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : ()=>_indexable\n };\n}\nconst readKey = (prefix, name)=>prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value)=>isObject(value) && prop !== 'adapters' && (Object.getPrototypeOf(value) === null || value.constructor === Object);\nfunction _cached(target, prop, resolve) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n const { _proxy , _context , _subProxy , _descriptors: descriptors } = target;\n let value = _proxy[prop]; // resolve from proxy\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\nfunction _resolveScriptable(prop, getValue, target, receiver) {\n const { _proxy , _context , _subProxy , _stack } = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n const { _proxy , _context , _subProxy , _descriptors: descriptors } = target;\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter((s)=>s !== arr);\n value = [];\n for (const item of arr){\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent)=>key === true ? parent : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback, value) {\n for (const parent of parentScopes){\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [\n ...parentScopes,\n ...rootScopes\n ];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [\n ''\n ], rootScopes, fallback, ()=>subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback, item) {\n while(key){\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n let value;\n for (const prefix of prefixes){\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value) ? createSubResolver(scopes, proxy, prop, value) : value;\n }\n }\n}\nfunction _resolve(key, scopes) {\n for (const scope of scopes){\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\nfunction getKeysFromAllScopes(target) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n const set = new Set();\n for (const scope of scopes){\n for (const key of Object.keys(scope).filter((k)=>!k.startsWith('_'))){\n set.add(key);\n }\n }\n return Array.from(set);\n}\nfunction _parseObjectDataRadialScale(meta, data, start, count) {\n const { iScale } = meta;\n const { key ='r' } = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i)=>i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis)=>indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n // This function must also respect \"skipped\" points\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n/**\n * Adjust tangents to ensure monotonic properties\n */ function monotoneAdjust(points, deltaK, mK) {\n const pointsLen = points.length;\n let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(let i = 0; i < pointsLen - 1; ++i){\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(let i = 0; i < pointsLen; ++i){\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */ function splineCurveMonotone(points, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK = Array(pointsLen).fill(0);\n const mK = Array(pointsLen);\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(i = 0; i < pointsLen; ++i){\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i] : !pointAfter ? deltaK[i - 1] : sign(deltaK[i - 1]) !== sign(deltaK[i]) ? 0 : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n monotoneAdjust(points, deltaK, mK);\n monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for(i = 0, ilen = points.length; i < ilen; ++i){\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n/**\n * @private\n */ function _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n let i, ilen, point, controlPoints;\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt)=>!pt.skip);\n }\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for(i = 0, ilen = points.length; i < ilen; ++i){\n point = points[i];\n controlPoints = splineCurve(prev, point, points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen], options.tension);\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n\n/**\n * Note: typedefs are auto-exported, so use a made-up `dom` namespace where\n * necessary to avoid duplicates with `export * from './helpers`; see\n * https://github.com/microsoft/TypeScript/issues/46011\n * @typedef { import('../core/core.controller.js').default } dom.Chart\n * @typedef { import('../../types').ChartEvent } ChartEvent\n */ /**\n * @private\n */ function _isDomSupported() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n/**\n * @private\n */ function _getParentNode(domNode) {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = parent.host;\n }\n return parent;\n}\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */ function parseMaxStyle(styleValue, node, parentProperty) {\n let valueInPixels;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n return valueInPixels;\n}\nconst getComputedStyle = (element)=>element.ownerDocument.defaultView.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = [\n 'top',\n 'right',\n 'bottom',\n 'left'\n];\nfunction getPositionedStyle(styles, style, suffix) {\n const result = {};\n suffix = suffix ? '-' + suffix : '';\n for(let i = 0; i < 4; i++){\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\nconst useOffsetPos = (x, y, target)=>(x > 0 || y > 0) && (!target || !target.shadowRoot);\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */ function getCanvasPosition(e, canvas) {\n const touches = e.touches;\n const source = touches && touches.length ? touches[0] : e;\n const { offsetX , offsetY } = source;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {\n x,\n y,\n box\n };\n}\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */ function getRelativePosition(event, chart) {\n if ('native' in event) {\n return event;\n }\n const { canvas , currentDevicePixelRatio } = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const { x , y , box } = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n let { width , height } = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\nfunction getContainerSize(canvas, width, height) {\n let maxWidth, maxHeight;\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\nconst round1 = (v)=>Math.round(v * 10) / 10;\n// eslint-disable-next-line complexity\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let { width , height } = containerSize;\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n return {\n width,\n height\n };\n}\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */ function retinaScale(chart, forceRatio, forceStyle) {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = Math.floor(chart.height * pixelRatio);\n const deviceWidth = Math.floor(chart.width * pixelRatio);\n chart.height = Math.floor(chart.height);\n chart.width = Math.floor(chart.width);\n const canvas = chart.canvas;\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || !canvas.style.height && !canvas.style.width)) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) {\n chart.currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */ const supportsEventListenerOptions = function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive () {\n passiveSupported = true;\n return false;\n }\n };\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}();\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */ function readUsedSize(element, property) {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n\n/**\n * @private\n */ function _pointInLine(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n/**\n * @private\n */ function _steppedInterpolation(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y : mode === 'after' ? t < 1 ? p1.y : p2.y : t > 0 ? p2.y : p1.y\n };\n}\n/**\n * @private\n */ function _bezierInterpolation(p1, p2, t, mode) {\n const cp1 = {\n x: p1.cp2x,\n y: p1.cp2y\n };\n const cp2 = {\n x: p2.cp1x,\n y: p2.cp1y\n };\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n return {\n x (x) {\n return rectX + rectX + width - x;\n },\n setWidth (w) {\n width = w;\n },\n textAlign (align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus (x, value) {\n return x - value;\n },\n leftForLtr (x, itemWidth) {\n return x - itemWidth;\n }\n };\n};\nconst getLeftToRightAdapter = function() {\n return {\n x (x) {\n return x;\n },\n setWidth (w) {},\n textAlign (align) {\n return align;\n },\n xPlus (x, value) {\n return x + value;\n },\n leftForLtr (x, _itemWidth) {\n return x;\n }\n };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n let style, original;\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction')\n ];\n style.setProperty('direction', direction, 'important');\n ctx.prevTextDirection = original;\n }\n}\nfunction restoreTextDirection(ctx, original) {\n if (original !== undefined) {\n delete ctx.prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle\n };\n }\n return {\n between: _isBetween,\n compare: (a, b)=>a - b,\n normalize: (x)=>x\n };\n}\nfunction normalizeSegment({ start , end , count , loop , style }) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\nfunction getSegment(segment, points, bounds) {\n const { property , start: startBound , end: endBound } = bounds;\n const { between , normalize } = propertyFn(property);\n const count = points.length;\n let { start , end , loop } = segment;\n let i, ilen;\n if (loop) {\n start += count;\n end += count;\n for(i = 0, ilen = count; i < ilen; ++i){\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n if (end < start) {\n end += count;\n }\n return {\n start,\n end,\n loop,\n style: segment.style\n };\n}\n function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [\n segment\n ];\n }\n const { property , start: startBound , end: endBound } = bounds;\n const count = points.length;\n const { compare , between , normalize } = propertyFn(property);\n const { start , end , loop , style } = getSegment(segment, points, bounds);\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n const startIsBefore = ()=>between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = ()=>compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = ()=>inside || startIsBefore();\n const shouldStop = ()=>!inside || endIsBefore();\n for(let i = start, prev = start; i <= end; ++i){\n point = points[i % count];\n if (point.skip) {\n continue;\n }\n value = normalize(point[property]);\n if (value === prevValue) {\n continue;\n }\n inside = between(value, startBound, endBound);\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({\n start: subStart,\n end: i,\n loop,\n count,\n style\n }));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n if (subStart !== null) {\n result.push(normalizeSegment({\n start: subStart,\n end,\n loop,\n count,\n style\n }));\n }\n return result;\n}\n function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n for(let i = 0; i < segments.length; i++){\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n function findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n if (loop && !spanGaps) {\n while(start < count && !points[start].skip){\n start++;\n }\n }\n while(start < count && points[start].skip){\n start++;\n }\n start %= count;\n if (loop) {\n end += start;\n }\n while(end > start && points[end % count].skip){\n end--;\n }\n end %= count;\n return {\n start,\n end\n };\n}\n function solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n for(end = start + 1; end <= max; ++end){\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({\n start: start % count,\n end: (end - 1) % count,\n loop\n });\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n if (last !== null) {\n result.push({\n start: start % count,\n end: last % count,\n loop\n });\n }\n return result;\n}\n function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n if (!count) {\n return [];\n }\n const loop = !!line._loop;\n const { start , end } = findStartAndEnd(points, count, loop, spanGaps);\n if (spanGaps === true) {\n return splitByStyles(line, [\n {\n start,\n end,\n loop\n }\n ], points, segmentOptions);\n }\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n function splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n function doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const { _datasetIndex: datasetIndex , options: { spanGaps } } = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n s += count;\n while(points[s % count].skip){\n s -= dir;\n }\n while(points[e % count].skip){\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({\n start: s % count,\n end: e % count,\n loop: l,\n style: st\n });\n prevStyle = st;\n start = e % count;\n }\n }\n for (const segment of segments){\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for(i = start + 1; i <= segment.end; i++){\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n return result;\n}\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n\nexport { unclipArea as $, _rlookupByKey as A, _lookupByKey as B, _isPointInArea as C, getAngleFromPoint as D, toPadding as E, each as F, getMaximumSize as G, HALF_PI as H, _getParentNode as I, readUsedSize as J, supportsEventListenerOptions as K, throttled as L, _isDomSupported as M, _factorize as N, finiteOrDefault as O, PI as P, callback as Q, _addGrace as R, _limitValue as S, TAU as T, toDegrees as U, _measureText as V, _int16Range as W, _alignPixel as X, clipArea as Y, renderText as Z, _arrayUnique as _, resolve as a, fontString as a$, toFont as a0, _toLeftRightCenter as a1, _alignStartEnd as a2, overrides as a3, merge as a4, _capitalize as a5, descriptors as a6, isFunction as a7, _attachContext as a8, _createResolver as a9, overrideTextDirection as aA, _textX as aB, restoreTextDirection as aC, drawPointLegend as aD, distanceBetweenPoints as aE, noop as aF, _setMinAndMaxByKey as aG, niceNum as aH, almostWhole as aI, almostEquals as aJ, _decimalPlaces as aK, Ticks as aL, log10 as aM, _longestText as aN, _filterBetween as aO, _lookup as aP, isPatternOrGradient as aQ, getHoverColor as aR, clone as aS, _merger as aT, _mergerIf as aU, _deprecated as aV, _splitKey as aW, toFontString as aX, splineCurve as aY, splineCurveMonotone as aZ, getStyle as a_, _descriptors as aa, mergeIf as ab, uid as ac, debounce as ad, retinaScale as ae, clearCanvas as af, setsEqual as ag, _elementsEqual as ah, _isClickEvent as ai, _isBetween as aj, _readValueToProps as ak, _updateBezierControlPoints as al, _computeSegments as am, _boundSegments as an, _steppedInterpolation as ao, _bezierInterpolation as ap, _pointInLine as aq, _steppedLineTo as ar, _bezierCurveTo as as, drawPoint as at, addRoundedRectPath as au, toTRBL as av, toTRBLCorners as aw, _boundSegment as ax, _normalizeAngle as ay, getRtlAdapter as az, isArray as b, toLineHeight as b0, PITAU as b1, INFINITY as b2, RAD_PER_DEG as b3, QUARTER_PI as b4, TWO_THIRDS_PI as b5, _angleDiff as b6, color as c, defaults as d, effects as e, resolveObjectKey as f, isNumberFinite as g, defined as h, isObject as i, createContext as j, isNullOrUndef as k, listenArrayEvents as l, toPercentage as m, toDimension as n, formatNumber as o, _angleBetween as p, _getStartAndCountOfVisiblePoints as q, requestAnimFrame as r, sign as s, toRadians as t, unlistenArrayEvents as u, valueOrDefault as v, _scaleRangesChanged as w, isNumber as x, _parseObjectDataRadialScale as y, getRelativePosition as z };\n//# sourceMappingURL=helpers.segment.js.map\n","/*!\n * Chart.js v4.4.7\n * https://www.chartjs.org\n * (c) 2024 Chart.js Contributors\n * Released under the MIT License\n */\nimport { r as requestAnimFrame, a as resolve, e as effects, c as color, i as isObject, d as defaults, b as isArray, v as valueOrDefault, u as unlistenArrayEvents, l as listenArrayEvents, f as resolveObjectKey, g as isNumberFinite, h as defined, s as sign, j as createContext, k as isNullOrUndef, _ as _arrayUnique, t as toRadians, m as toPercentage, n as toDimension, T as TAU, o as formatNumber, p as _angleBetween, H as HALF_PI, P as PI, q as _getStartAndCountOfVisiblePoints, w as _scaleRangesChanged, x as isNumber, y as _parseObjectDataRadialScale, z as getRelativePosition, A as _rlookupByKey, B as _lookupByKey, C as _isPointInArea, D as getAngleFromPoint, E as toPadding, F as each, G as getMaximumSize, I as _getParentNode, J as readUsedSize, K as supportsEventListenerOptions, L as throttled, M as _isDomSupported, N as _factorize, O as finiteOrDefault, Q as callback, R as _addGrace, S as _limitValue, U as toDegrees, V as _measureText, W as _int16Range, X as _alignPixel, Y as clipArea, Z as renderText, $ as unclipArea, a0 as toFont, a1 as _toLeftRightCenter, a2 as _alignStartEnd, a3 as overrides, a4 as merge, a5 as _capitalize, a6 as descriptors, a7 as isFunction, a8 as _attachContext, a9 as _createResolver, aa as _descriptors, ab as mergeIf, ac as uid, ad as debounce, ae as retinaScale, af as clearCanvas, ag as setsEqual, ah as _elementsEqual, ai as _isClickEvent, aj as _isBetween, ak as _readValueToProps, al as _updateBezierControlPoints, am as _computeSegments, an as _boundSegments, ao as _steppedInterpolation, ap as _bezierInterpolation, aq as _pointInLine, ar as _steppedLineTo, as as _bezierCurveTo, at as drawPoint, au as addRoundedRectPath, av as toTRBL, aw as toTRBLCorners, ax as _boundSegment, ay as _normalizeAngle, az as getRtlAdapter, aA as overrideTextDirection, aB as _textX, aC as restoreTextDirection, aD as drawPointLegend, aE as distanceBetweenPoints, aF as noop, aG as _setMinAndMaxByKey, aH as niceNum, aI as almostWhole, aJ as almostEquals, aK as _decimalPlaces, aL as Ticks, aM as log10, aN as _longestText, aO as _filterBetween, aP as _lookup } from './chunks/helpers.segment.js';\nimport '@kurkle/color';\n\nclass Animator {\n constructor(){\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n callbacks.forEach((fn)=>fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n this._request = requestAnimFrame.call(window, ()=>{\n this._update();\n this._request = null;\n if (this._running) {\n this._refresh();\n }\n });\n }\n _update(date = Date.now()) {\n let remaining = 0;\n this._charts.forEach((anims, chart)=>{\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n for(; i >= 0; --i){\n item = items[i];\n if (item._active) {\n if (item._total > anims.duration) {\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n remaining += items.length;\n });\n this._lastDate = date;\n if (remaining === 0) {\n this._running = false;\n }\n }\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur)=>Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n for(; i >= 0; --i){\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\nvar animator = /* #__PURE__ */ new Animator();\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean (from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n color (from, to, factor) {\n const c0 = color(from || transparent);\n const c1 = c0.valid && color(to || transparent);\n return c1 && c1.valid ? c1.mix(c0, factor).hexString() : to;\n },\n number (from, to, factor) {\n return from + (to - from) * factor;\n }\n};\nclass Animation {\n constructor(cfg, target, prop, to){\n const currentValue = target[prop];\n to = resolve([\n cfg.to,\n to,\n currentValue,\n cfg.from\n ]);\n const from = resolve([\n cfg.from,\n currentValue,\n to\n ]);\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n active() {\n return this._active;\n }\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([\n cfg.to,\n to,\n currentValue,\n cfg.from\n ]);\n this._from = resolve([\n cfg.from,\n currentValue,\n to\n ]);\n }\n }\n cancel() {\n if (this._active) {\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n this._active = from !== to && (loop || elapsed < duration);\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n factor = elapsed / duration % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n this._target[prop] = this._fn(from, to, factor);\n }\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej)=>{\n promises.push({\n res,\n rej\n });\n });\n }\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for(let i = 0; i < promises.length; i++){\n promises[i][method]();\n }\n }\n}\n\nclass Animations {\n constructor(chart, config){\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n Object.getOwnPropertyNames(config).forEach((key)=>{\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions){\n resolved[option] = cfg[option];\n }\n (isArray(cfg.properties) && cfg.properties || [\n key\n ]).forEach((prop)=>{\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n awaitAll(target.options.$animations, newOptions).then(()=>{\n target.options = newOptions;\n }, ()=>{\n });\n }\n return animations;\n }\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n for(i = props.length - 1; i >= 0; --i){\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n if (animation) {\n if (cfg && animation.active()) {\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n target[prop] = value;\n continue;\n }\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n update(target, values) {\n if (this._properties.size === 0) {\n Object.assign(target, values);\n return;\n }\n const animations = this._createAnimations(target, values);\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for(let i = 0; i < keys.length; i++){\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n target.options = options = Object.assign({}, options, {\n $shared: false,\n $animations: {}\n });\n }\n return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\nfunction toClip(value) {\n let t, r, b, l;\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n for(i = 0, ilen = metasets.length; i < ilen; ++i){\n keys.push(metasets[i].index);\n }\n return keys;\n}\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n if (value === null) {\n return;\n }\n let found = false;\n for(i = 0, ilen = keys.length; i < ilen; ++i){\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isNumberFinite(otherValue) && (singleMode || value === 0 || sign(value) === sign(otherValue))) {\n value += otherValue;\n }\n }\n if (!found && !options.all) {\n return 0;\n }\n return value;\n}\nfunction convertObjectDataToArray(data, meta) {\n const { iScale , vScale } = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for(i = 0, ilen = keys.length; i < ilen; ++i){\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || stacked === undefined && meta.stack !== undefined;\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n const { min , max , minDefined , maxDefined } = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()){\n const value = stack[meta.index];\n if (positive && value > 0 || !positive && value < 0) {\n return meta.index;\n }\n }\n return null;\n}\nfunction updateStacks(controller, parsed) {\n const { chart , _cachedMeta: meta } = controller;\n const stacks = chart._stacks || (chart._stacks = {});\n const { iScale , vScale , index: datasetIndex } = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n for(let i = 0; i < ilen; ++i){\n const item = parsed[i];\n const { [iAxis]: index , [vAxis]: value } = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter((key)=>scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n return createContext(parent, {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n });\n}\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\nfunction clearStacks(meta, items) {\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n items = items || meta._parsed;\n for (const parsed of items){\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\nconst isDirectUpdateMode = (mode)=>mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared)=>shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart)=>canStack && !meta.hidden && meta._stacked && {\n keys: getSortedDatasetIndices(chart, true),\n values: null\n };\nclass DatasetController {\n static defaults = {};\n static datasetElementType = null;\n static dataElementType = null;\n constructor(chart, datasetIndex){\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n this.initialize();\n }\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n const chooseId = (axis, x, y, r)=>axis === 'x' ? x : axis === 'r' ? r : y;\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale ? meta.vScale : meta.iScale;\n }\n reset() {\n this._update('reset');\n }\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n unlistenArrayEvents(_data, this);\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n addElements() {\n const meta = this._cachedMeta;\n this._dataCheck();\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n this._dataCheck();\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n this._resyncElements(resetNewElements);\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n parse(start, count) {\n const { _cachedMeta: meta , _data: data } = this;\n const { iScale , _stacked } = meta;\n const iAxis = iScale.axis;\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n const isNotInOrderComparedToPrev = ()=>cur[iAxis] === null || prev && cur[iAxis] < prev[iAxis];\n for(i = 0; i < count; ++i){\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n parsePrimitiveData(meta, data, start, count) {\n const { iScale , vScale } = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const { xScale , yScale } = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const { xScale , yScale } = meta;\n const { xAxisKey ='x' , yAxisKey ='y' } = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {\n mode\n });\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY\n };\n const { min: otherMin , max: otherMax } = getUserBounds(otherScale);\n let i, parsed;\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n for(i = 0; i < ilen; ++i){\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n break;\n }\n }\n if (sorted) {\n for(i = ilen - 1; i >= 0; --i){\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n for(i = 0, ilen = parsed.length; i < ilen; ++i){\n value = parsed[i][scale.axis];\n if (isNumberFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n getMaxOverflow() {\n return false;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n update(mode) {}\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || elements.length - start;\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n for(i = start; i < start + count; ++i){\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n for(i = 0; i < active.length; ++i){\n active[i].draw(ctx, area);\n }\n }\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset ? this.resolveDatasetElementOptions(mode) : this.resolveDataElementOptions(index || 0, mode);\n }\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context || (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context || (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [\n `${elementType}Hover`,\n 'hover',\n elementType,\n ''\n ] : [\n elementType,\n ''\n ];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n const context = ()=>this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n if (values.$shared) {\n values.$shared = sharing;\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n return values;\n }\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || sharedOptions !== previouslySharedOptions;\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {\n sharedOptions,\n includeOptions\n };\n }\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n options: !active && this.getSharedOptions(options) || options\n });\n }\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n for (const [method, arg1, arg2] of this._syncList){\n this[method](arg1, arg2);\n }\n this._syncList = [];\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n if (count) {\n this.parse(0, count);\n }\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n const move = (arr)=>{\n arr.length += count;\n for(i = arr.length - 1; i >= end; i--){\n arr[i] = arr[i - count];\n }\n };\n move(data);\n for(i = start; i < end; ++i){\n data[i] = new this.dataElementType();\n }\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n updateElements(element, start, count, mode) {}\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([\n this.index,\n ...args\n ]);\n }\n _onDataPush() {\n const count = arguments.length;\n this._sync([\n '_insertElements',\n this.getDataset().data.length - count,\n count\n ]);\n }\n _onDataPop() {\n this._sync([\n '_removeElements',\n this._cachedMeta.data.length - 1,\n 1\n ]);\n }\n _onDataShift() {\n this._sync([\n '_removeElements',\n 0,\n 1\n ]);\n }\n _onDataSplice(start, count) {\n if (count) {\n this._sync([\n '_removeElements',\n start,\n count\n ]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync([\n '_insertElements',\n start,\n newCount\n ]);\n }\n }\n _onDataUnshift() {\n this._sync([\n '_insertElements',\n 0,\n arguments.length\n ]);\n }\n}\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n for(let i = 0, ilen = visibleMetas.length; i < ilen; i++){\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b)=>a - b));\n }\n return scale._cache.$bar;\n}\n function computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = ()=>{\n if (curr === 32767 || curr === -32768) {\n return;\n }\n if (defined(prev)) {\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n for(i = 0, ilen = values.length; i < ilen; ++i){\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n prev = undefined;\n for(i = 0, ilen = scale.ticks.length; i < ilen; ++i){\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n return min;\n}\n function computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n size = thickness * stackCount;\n ratio = 1;\n }\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - size / 2\n };\n}\n function computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n if (prev === null) {\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n if (next === null) {\n next = curr + curr - prev;\n }\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n item[vScale.axis] = barEnd;\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n for(i = start, ilen = start + count; i < ilen; ++i){\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {\n start,\n end,\n reverse,\n top,\n bottom\n };\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n if (edge === true) {\n properties.borderSkipped = {\n top: true,\n right: true,\n bottom: true,\n left: true\n };\n return;\n }\n const { start , end , reverse , top , bottom } = borderProps(properties);\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\nfunction setInflateAmount(properties, { inflateAmount }, ratio) {\n properties.inflateAmount = inflateAmount === 'auto' ? ratio === 1 ? 0.33 : 0 : inflateAmount;\n}\nclass BarController extends DatasetController {\n static id = 'bar';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'base',\n 'width',\n 'height'\n ]\n }\n }\n };\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true\n }\n }\n };\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseObjectData(meta, data, start, count) {\n const { iScale , vScale } = meta;\n const { xAxisKey ='x' , yAxisKey ='y' } = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for(i = start, ilen = start + count; i < ilen; ++i){\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n getMaxOverflow() {\n return 0;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const { iScale , vScale } = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom) ? '[' + custom.start + ', ' + custom.end + ']' : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const { index , _cachedMeta: { vScale } } = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n for(let i = start; i < start + count; i++){\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {\n base,\n head: base\n } : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || index === stack._top || index === stack._bottom,\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n _getStacks(last, dataIndex) {\n const { iScale } = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type).filter((meta)=>meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n const skipNull = (meta)=>{\n const parsed = meta._parsed.find((item)=>item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n for (const meta of metasets){\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === undefined && meta.stack === undefined) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n if (!stacks.length) {\n stacks.push(undefined);\n }\n return stacks;\n }\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = name !== undefined ? stacks.indexOf(name) : -1;\n return index === -1 ? stacks.length - 1 : index;\n }\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n for(i = 0, ilen = meta.data.length; i < ilen; ++i){\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n _calculateBarValuePixels(index) {\n const { _cachedMeta: { vScale , _stacked , index: datasetIndex } , options: { base: baseValue , minBarLength } } = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n if (length !== value) {\n start = length - value;\n length = value;\n }\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n head = base;\n }\n size = head - base;\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n if (_stacked && !floating) {\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options, stackCount) : computeFitCategoryTraits(index, ruler, options, stackCount);\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined);\n center = range.start + range.chunk * stackIndex + range.chunk / 2;\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n for(; i < ilen; ++i){\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n}\n\nclass BubbleController extends DatasetController {\n static id = 'bubble';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'borderWidth',\n 'radius'\n ]\n }\n }\n };\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n let max = 0;\n for(let i = data.length - 1; i >= 0; --i){\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const { xScale , yScale } = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n update(mode) {\n const points = this._cachedMeta.data;\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale } = this._cachedMeta;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n for(let i = start; i < start + count; i++){\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n if (reset) {\n properties.options.radius = 0;\n }\n }\n this.updateElement(point, i, properties, mode);\n }\n }\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n if (values.$shared) {\n values = Object.assign({}, values, {\n $shared: false\n });\n }\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n return values;\n }\n}\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {\n ratioX,\n ratioY,\n offsetX,\n offsetY\n };\n}\nclass DoughnutController extends DatasetController {\n static id = 'doughnut';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'circumference',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'startAngle',\n 'x',\n 'y',\n 'offset',\n 'borderWidth',\n 'spacing'\n ]\n }\n },\n cutout: '50%',\n rotation: 0,\n circumference: 360,\n radius: '100%',\n spacing: 0,\n indexAxis: 'r'\n };\n static descriptors = {\n _scriptable: (name)=>name !== 'spacing',\n _indexable: (name)=>name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash')\n };\n static overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels (chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const { labels: { pointStyle , color } } = chart.legend.options;\n return data.labels.map((label, i)=>{\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick (e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n constructor(chart, datasetIndex){\n super(chart, datasetIndex);\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n linkScales() {}\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i)=>+data[i];\n if (isObject(data[start])) {\n const { key ='value' } = this._parsing;\n getter = (i)=>+resolveObjectKey(data[i], key);\n }\n let i, ilen;\n for(i = start, ilen = start + count; i < ilen; ++i){\n meta._parsed[i] = getter(i);\n }\n }\n }\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n for(let i = 0; i < this.chart.data.datasets.length; ++i){\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n return {\n rotation: min,\n circumference: max - min\n };\n }\n update(mode) {\n const chart = this.chart;\n const { chartArea } = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n const { circumference , rotation } = this._getRotationExtents();\n const { ratioX , ratioY , offsetX , offsetY } = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n meta.total = this.calculateTotal();\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if (reset && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n for(i = 0; i < start; ++i){\n startAngle += this._circumference(i, reset);\n }\n for(i = start; i < start + count; ++i){\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n this.updateElement(arc, i, properties, mode);\n }\n }\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n for(i = 0; i < metaData.length; i++){\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n return total;\n }\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n return {\n label: labels[index] || '',\n value\n };\n }\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n if (!arcs) {\n for(i = 0, ilen = chart.data.datasets.length; i < ilen; ++i){\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n if (!arcs) {\n return 0;\n }\n for(i = 0, ilen = arcs.length; i < ilen; ++i){\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n getMaxOffset(arcs) {\n let max = 0;\n for(let i = 0, ilen = arcs.length; i < ilen; ++i){\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n for(let i = 0; i < datasetIndex; ++i){\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n return ringWeightOffset;\n }\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n\nclass LineController extends DatasetController {\n static id = 'line';\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n showLine: true,\n spanGaps: false\n };\n static overrides = {\n scales: {\n _index_: {\n type: 'category'\n },\n _value_: {\n type: 'linear'\n }\n }\n };\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n update(mode) {\n const meta = this._cachedMeta;\n const { dataset: line , data: points = [] , _dataset } = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let { start , count } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n this.updateElements(points, start, count, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale , _stacked , _dataset } = this._cachedMeta;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const { spanGaps , segment } = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for(let i = 0; i < pointsCount; ++i){\n const point = points[i];\n const properties = directUpdate ? point : {};\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n\nclass PolarAreaController extends DatasetController {\n static id = 'polarArea';\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ]\n }\n },\n indexAxis: 'r',\n startAngle: 0\n };\n static overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels (chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const { labels: { pointStyle , color } } = chart.legend.options;\n return data.labels.map((label, i)=>{\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick (e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n constructor(chart, datasetIndex){\n super(chart, datasetIndex);\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n return {\n label: labels[index] || '',\n value\n };\n }\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const arcs = this._cachedMeta.data;\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY\n };\n meta.data.forEach((element, index)=>{\n const parsed = this.getParsed(index).r;\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n return range;\n }\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? outerRadius / 100 * opts.cutoutPercentage : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n this.outerRadius = outerRadius - radiusLength * this.index;\n this.innerRadius = this.outerRadius - radiusLength;\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n const defaultAngle = 360 / this.countVisibleElements();\n for(i = 0; i < start; ++i){\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for(i = start; i < start + count; i++){\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n this.updateElement(arc, i, properties, mode);\n }\n }\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n meta.data.forEach((element, index)=>{\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n return count;\n }\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index) ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle) : 0;\n }\n}\n\nclass PieController extends DoughnutController {\n static id = 'pie';\n static defaults = {\n cutout: 0,\n rotation: 0,\n circumference: 360,\n radius: '100%'\n };\n}\n\nclass RadarController extends DatasetController {\n static id = 'radar';\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n }\n };\n static overrides = {\n aspectRatio: 1,\n scales: {\n r: {\n type: 'radialLinear'\n }\n }\n };\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n line.points = points;\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n this.updateElement(line, undefined, properties, mode);\n }\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n for(let i = start; i < start + count; i++){\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n\nclass ScatterController extends DatasetController {\n static id = 'scatter';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n static overrides = {\n interaction: {\n mode: 'point'\n },\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const { xScale , yScale } = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n update(mode) {\n const meta = this._cachedMeta;\n const { data: points = [] } = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let { start , count } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n if (this.options.showLine) {\n if (!this.datasetElementType) {\n this.addElements();\n }\n const { dataset: line , _dataset } = meta;\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n delete meta.dataset;\n this.datasetElementType = false;\n }\n this.updateElements(points, start, count, mode);\n }\n addElements() {\n const { showLine } = this.options;\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n super.addElements();\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale , _stacked , _dataset } = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const { spanGaps , segment } = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for(let i = start; i < start + count; ++i){\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n if (!this.options.showLine) {\n let max = 0;\n for(let i = data.length - 1; i >= 0; --i){\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPieController: PieController,\nPolarAreaController: PolarAreaController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\n/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */ function abstract() {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */ class DateAdapterBase {\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */ static override(members) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n options;\n constructor(options){\n this.options = options || {};\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n formats() {\n return abstract();\n }\n parse() {\n return abstract();\n }\n format() {\n return abstract();\n }\n add() {\n return abstract();\n }\n diff() {\n return abstract();\n }\n startOf() {\n return abstract();\n }\n endOf() {\n return abstract();\n }\n}\nvar adapters = {\n _date: DateAdapterBase\n};\n\nfunction binarySearch(metaset, axis, value, intersect) {\n const { controller , data , _sorted } = metaset;\n const iScale = controller._cachedMeta.iScale;\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n return lookupMethod(data, axis, value);\n } else if (controller._sharedOptions) {\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {\n lo: start.lo,\n hi: end.hi\n };\n }\n }\n }\n return {\n lo: 0,\n hi: data.length - 1\n };\n}\n function evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for(let i = 0, ilen = metasets.length; i < ilen; ++i){\n const { index , data } = metasets[i];\n const { lo , hi } = binarySearch(metasets[i], axis, value, intersect);\n for(let j = lo; j <= hi; ++j){\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n function getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n function getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n };\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n function getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n function evaluationFunc(element, datasetIndex, index) {\n const { startAngle , endAngle } = element.getProps([\n 'startAngle',\n 'endAngle'\n ], useFinalPosition);\n const { angle } = getAngleFromPoint(element, {\n x: position.x,\n y: position.y\n });\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n function getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [\n {\n element,\n datasetIndex,\n index\n }\n ];\n minDistance = distance;\n } else if (distance === minDistance) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n function getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n return axis === 'r' && !intersect ? getNearestRadialItems(chart, position, axis, useFinalPosition) : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n function getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index)=>{\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n var Interaction = {\n evaluateInteractionItems,\n modes: {\n index (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n if (!items.length) {\n return [];\n }\n chart.getSortedVisibleDatasetMetas().forEach((meta)=>{\n const index = items[0].index;\n const element = meta.data[index];\n if (element && !element.skip) {\n elements.push({\n element,\n datasetIndex: meta.index,\n index\n });\n }\n });\n return elements;\n },\n dataset (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for(let i = 0; i < data.length; ++i){\n items.push({\n element: data[i],\n datasetIndex,\n index: i\n });\n }\n }\n return items;\n },\n point (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n nearest (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n x (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n y (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n\nconst STATIC_POSITIONS = [\n 'left',\n 'top',\n 'right',\n 'bottom'\n];\nfunction filterByPosition(array, position) {\n return array.filter((v)=>v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter((v)=>STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b)=>{\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight;\n });\n}\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n for(i = 0, ilen = (boxes || []).length; i < ilen; ++i){\n box = boxes[i];\n ({ position: pos , options: { stack , stackWeight =1 } } = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && pos + stack,\n stackWeight\n });\n }\n return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts){\n const { stack , pos , stackWeight } = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {\n count: 0,\n placed: 0,\n weight: 0,\n size: 0\n });\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n function setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const { vBoxMaxWidth , hBoxMaxHeight } = params;\n let i, ilen, layout;\n for(i = 0, ilen = layouts.length; i < ilen; ++i){\n layout = layouts[i];\n const { fullSize } = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter((wrap)=>wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n const { pos , box } = layout;\n const maxPadding = chartArea.maxPadding;\n if (!isObject(pos)) {\n if (layout.size) {\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {\n size: 0,\n count: 1\n };\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n return layout.horizontal ? {\n same: widthChanged,\n other: heightChanged\n } : {\n same: heightChanged,\n other: widthChanged\n };\n}\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n function marginForPositions(positions) {\n const margin = {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n };\n positions.forEach((pos)=>{\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n return horizontal ? marginForPositions([\n 'left',\n 'right'\n ]) : marginForPositions([\n 'top',\n 'bottom'\n ]);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n for(i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i){\n layout = boxes[i];\n box = layout.box;\n box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea));\n const { same , other } = updateDims(chartArea, params, layout, stacks);\n refit |= same && refitBoxes.length;\n changed = changed || other;\n if (!box.fullSize) {\n refitBoxes.push(layout);\n }\n }\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let { x , y } = chartArea;\n for (const layout of boxes){\n const box = layout.box;\n const stack = stacks[layout.stack] || {\n count: 1,\n placed: 0,\n weight: 1\n };\n const weight = layout.stackWeight / stack.weight || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n chartArea.x = x;\n chartArea.y = y;\n}\nvar layouts = {\n addBox (chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n item._layers = item._layers || function() {\n return [\n {\n z: 0,\n draw (chartArea) {\n item.draw(chartArea);\n }\n }\n ];\n };\n chart.boxes.push(item);\n },\n removeBox (chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n configure (chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n update (chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n each(chart.boxes, (box)=>{\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap)=>wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n handleMaxPadding(chartArea);\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w\n };\n each(boxes.chartArea, (layout)=>{\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n });\n });\n }\n};\n\nclass BasePlatform {\n acquireContext(canvas, aspectRatio) {}\n releaseContext(context) {\n return false;\n }\n addEventListener(chart, type, listener) {}\n removeEventListener(chart, type, listener) {}\n getDevicePixelRatio() {\n return 1;\n }\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n isAttached(canvas) {\n return true;\n }\n updateConfig(config) {\n }\n}\n\nclass BasicPlatform extends BasePlatform {\n acquireContext(item) {\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n\nconst EXPANDO_KEY = '$chartjs';\n const EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\nconst isNullOrEmpty = (value)=>value === null || value === '';\n function initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n style.display = style.display || 'block';\n style.boxSizing = style.boxSizing || 'border-box';\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {\n passive: true\n} : false;\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const { x , y } = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null\n };\n}\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList){\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver((entries)=>{\n let trigger = false;\n for (const entry of entries){\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {\n childList: true,\n subtree: true\n });\n return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver((entries)=>{\n let trigger = false;\n for (const entry of entries){\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {\n childList: true,\n subtree: true\n });\n return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart)=>{\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height)=>{\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n listener();\n }\n }, window);\n const observer = new ResizeObserver((entries)=>{\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event)=>{\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n addListener(canvas, type, proxy);\n return proxy;\n}\n class DomPlatform extends BasePlatform {\n acquireContext(canvas, aspectRatio) {\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n if (context && context.canvas === canvas) {\n initCanvas(canvas, aspectRatio);\n return context;\n }\n return null;\n }\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n const initial = canvas[EXPANDO_KEY].initial;\n [\n 'height',\n 'width'\n ].forEach((prop)=>{\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n const style = initial.style || {};\n Object.keys(style).forEach((key)=>{\n canvas.style[key] = style[key];\n });\n canvas.width = canvas.width;\n delete canvas[EXPANDO_KEY];\n return true;\n }\n addEventListener(chart, type, listener) {\n this.removeEventListener(chart, type);\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n if (!proxy) {\n return;\n }\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n\nfunction _detectPlatform(canvas) {\n if (!_isDomSupported() || typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nclass Element {\n static defaults = {};\n static defaultRoutes = undefined;\n x;\n y;\n active = false;\n options;\n $animations;\n tooltipPosition(useFinalPosition) {\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return {\n x,\n y\n };\n }\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n getProps(props, final) {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this;\n }\n const ret = {};\n props.forEach((prop)=>{\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop];\n });\n return ret;\n }\n}\n\nfunction autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for(i = 0, ilen = numMajorIndices - 1; i < ilen; i++){\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n function calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n const factors = _factorize(evenMajorSpacing);\n for(let i = 0, ilen = factors.length - 1; i < ilen; i++){\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n function getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n function skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n spacing = Math.ceil(spacing);\n for(i = 0; i < ticks.length; i++){\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n function skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n next = start;\n while(next < 0){\n count++;\n next = Math.round(start + count * spacing);\n }\n for(i = Math.max(start, 0); i < end; i++){\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n function getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n if (len < 2) {\n return false;\n }\n for(diff = arr[0], i = 1; i < len; ++i){\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n\nconst reverseAlign = (align)=>align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset)=>edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit)=>Math.min(maxTicksLimit || ticksLength, ticksLength);\n function sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n for(; i < len; i += increment){\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n function getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6;\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n function garbageCollect(caches, length) {\n each(caches, (cache)=>{\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for(i = 0; i < gcLen; ++i){\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n function getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n function getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n return lines * font.lineHeight + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\nfunction titleAlign(align, position, reverse) {\n let ret = _toLeftRightCenter(align);\n if (reverse && position !== 'right' || !reverse && position === 'right') {\n ret = reverseAlign(ret);\n }\n return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n const { top , left , bottom , right , chart } = scale;\n const { chartArea , scales } = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {\n titleX,\n titleY,\n maxWidth,\n rotation\n };\n}\nclass Scale extends Element {\n constructor(cfg){\n super();\n this.id = cfg.id;\n this.type = cfg.type;\n this.options = undefined;\n this.ctx = cfg.ctx;\n this.chart = cfg.chart;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n this.maxWidth = undefined;\n this.maxHeight = undefined;\n this.paddingTop = undefined;\n this.paddingBottom = undefined;\n this.paddingLeft = undefined;\n this.paddingRight = undefined;\n this.axis = undefined;\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n this.ticks = [];\n this._gridLineItems = null;\n this._labelItems = null;\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n this._startPixel = undefined;\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n init(options) {\n this.options = options.setContext(this.getContext());\n this.axis = options.axis;\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n parse(raw, index) {\n return raw;\n }\n getUserBounds() {\n let { _userMin , _userMax , _suggestedMin , _suggestedMax } = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isNumberFinite(_userMin),\n maxDefined: isNumberFinite(_userMax)\n };\n }\n getMinMax(canStack) {\n let { min , max , minDefined , maxDefined } = this.getUserBounds();\n let range;\n if (minDefined && maxDefined) {\n return {\n min,\n max\n };\n }\n const metas = this.getMatchingVisibleMetas();\n for(let i = 0, ilen = metas.length; i < ilen; ++i){\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n getTicks() {\n return this.ticks;\n }\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n beforeUpdate() {\n callback(this.options.beforeUpdate, [\n this\n ]);\n }\n update(maxWidth, maxHeight, margins) {\n const { beginAtZero , grace , ticks: tickOpts } = this.options;\n const sampleSize = tickOpts.sampleSize;\n this.beforeUpdate();\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n this._maxLength = this.isHorizontal() ? this.width + margins.left + margins.right : this.height + margins.top + margins.bottom;\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n this.beforeBuildTicks();\n this.ticks = this.buildTicks() || [];\n this.afterBuildTicks();\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n this.configure();\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation();\n this.afterCalculateLabelRotation();\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n if (samplingEnabled) {\n this._convertTicksToLabels(this.ticks);\n }\n this.beforeFit();\n this.fit();\n this.afterFit();\n this.afterUpdate();\n }\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n afterUpdate() {\n callback(this.options.afterUpdate, [\n this\n ]);\n }\n beforeSetDimensions() {\n callback(this.options.beforeSetDimensions, [\n this\n ]);\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = 0;\n this.bottom = this.height;\n }\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n callback(this.options.afterSetDimensions, [\n this\n ]);\n }\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n callback(this.options[name], [\n this\n ]);\n }\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n beforeTickToLabelConversion() {\n callback(this.options.beforeTickToLabelConversion, [\n this\n ]);\n }\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n tick = ticks[i];\n tick.label = callback(tickOpts.callback, [\n tick.value,\n i,\n ticks\n ], this);\n }\n }\n afterTickToLabelConversion() {\n callback(this.options.afterTickToLabelConversion, [\n this\n ]);\n }\n beforeCalculateLabelRotation() {\n callback(this.options.beforeCalculateLabelRotation, [\n this\n ]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)), Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n callback(this.options.afterCalculateLabelRotation, [\n this\n ]);\n }\n afterAutoSkip() {}\n beforeFit() {\n callback(this.options.beforeFit, [\n this\n ]);\n }\n fit() {\n const minSize = {\n width: 0,\n height: 0\n };\n const { chart , options: { ticks: tickOpts , title: titleOpts , grid: gridOpts } } = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight;\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n if (tickOpts.display && this.ticks.length) {\n const { first , last , widest , highest } = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n if (isHorizontal) {\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n this._handleMargins();\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n _calculatePadding(first, last, sin, cos) {\n const { ticks: { align , padding } , position } = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n afterFit() {\n callback(this.options.afterFit, [\n this\n ]);\n }\n isHorizontal() {\n const { axis , position } = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n isFullSize() {\n return this.options.fullSize;\n }\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n this.generateTickLabels(ticks);\n let i, ilen;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n this.afterTickToLabelConversion();\n }\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n return labelSizes;\n }\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const { ctx , _longestTextCache: caches } = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n for(i = 0; i < length; i += increment){\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {\n data: {},\n gc: []\n };\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n for(j = 0, jlen = label.length; j < jlen; ++j){\n nestedLabel = label[j];\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n const valueAt = (idx)=>({\n width: widths[idx] || 0,\n height: heights[idx] || 0\n });\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights\n };\n }\n getLabelForValue(value) {\n return value;\n }\n getPixelForValue(value, index) {\n return NaN;\n }\n getValueForPixel(pixel) {}\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n getBaseValue() {\n const { min , max } = this;\n return min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0;\n }\n getContext(index) {\n const ticks = this.ticks || [];\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context || (tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context || (this.$context = createScaleContext(this.chart.getContext(), this));\n }\n _tickSize() {\n const optionTicks = this.options.ticks;\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n return this.isHorizontal() ? h * cos > w * sin ? w / cos : h / sin : h * sin < w * cos ? h / cos : w / sin;\n }\n _isVisible() {\n const display = this.options.display;\n if (display !== 'auto') {\n return !!display;\n }\n return this.getMatchingVisibleMetas().length > 0;\n }\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const { grid , position , border } = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for(i = 0; i < ticksLength; i += step){\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n lineValue = getPixelForGridLine(this, i, offset);\n if (lineValue === undefined) {\n continue;\n }\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset\n });\n }\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n return items;\n }\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const { position , ticks: optionTicks } = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const { align , crossAlign , padding , mirror } = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = (chartArea.top + chartArea.bottom) / 2 + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = (chartArea.left + chartArea.right) / 2 - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n const labelSizes = this._getLabelSizes();\n for(i = 0, ilen = ticks.length; i < ilen; ++i){\n tick = ticks[i];\n label = tick.label;\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n if (isHorizontal) {\n x = pixel;\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += lineHeight / 2 * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n let backdrop;\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n switch(textBaseline){\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n }\n switch(textAlign){\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n }\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n color: optsAtIndex.backdropColor\n };\n }\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [\n x,\n y\n ],\n backdrop\n }\n });\n }\n return items;\n }\n _getXAxisLabelAlignment() {\n const { position , ticks } = this.options;\n const rotation = -toRadians(this.labelRotation);\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n let align = 'center';\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n return align;\n }\n _getYAxisLabelAlignment(tl) {\n const { position , ticks: { crossAlign , mirror , padding } } = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n let textAlign;\n let x;\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= widest / 2;\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= widest / 2;\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n return {\n textAlign,\n x\n };\n }\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n const chart = this.chart;\n const position = this.options.position;\n if (position === 'left' || position === 'right') {\n return {\n top: 0,\n left: this.left,\n bottom: chart.height,\n right: this.right\n };\n }\n if (position === 'top' || position === 'bottom') {\n return {\n top: this.top,\n left: 0,\n bottom: this.bottom,\n right: chart.width\n };\n }\n }\n drawBackground() {\n const { ctx , options: { backgroundColor } , left , top , width , height } = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex((t)=>t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n const drawLine = (p1, p2, style)=>{\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n if (grid.display) {\n for(i = 0, ilen = items.length; i < ilen; ++i){\n const item = items[i];\n if (grid.drawOnChartArea) {\n drawLine({\n x: item.x1,\n y: item.y1\n }, {\n x: item.x2,\n y: item.y2\n }, item);\n }\n if (grid.drawTicks) {\n drawLine({\n x: item.tx1,\n y: item.ty1\n }, {\n x: item.tx2,\n y: item.ty2\n }, {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n });\n }\n }\n }\n }\n drawBorder() {\n const { chart , ctx , options: { border , grid } } = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.restore();\n }\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n if (!optionTicks.display) {\n return;\n }\n const ctx = this.ctx;\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n const items = this.getLabelItems(chartArea);\n for (const item of items){\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n if (area) {\n unclipArea(ctx);\n }\n }\n drawTitle() {\n const { ctx , options: { position , title , reverse } } = this;\n if (!title.display) {\n return;\n }\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n const { titleX , titleY , maxWidth , rotation } = titleArgs(this, offset, position, align);\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [\n titleX,\n titleY\n ]\n });\n }\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n return [\n {\n z: tz,\n draw: (chartArea)=>{\n this.draw(chartArea);\n }\n }\n ];\n }\n return [\n {\n z: gz,\n draw: (chartArea)=>{\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n },\n {\n z: bz,\n draw: ()=>{\n this.drawBorder();\n }\n },\n {\n z: tz,\n draw: (chartArea)=>{\n this.drawLabels(chartArea);\n }\n }\n ];\n }\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n for(i = 0, ilen = metas.length; i < ilen; ++i){\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n\nclass TypedRegistry {\n constructor(type, scope, override){\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n if (isIChartComponent(proto)) {\n parentScope = this.register(proto);\n }\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n if (id in items) {\n return scope;\n }\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n return scope;\n }\n get(id) {\n return this.items[id];\n }\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n if (id in items) {\n delete items[id];\n }\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\nfunction registerDefaults(item, scope, parentScope) {\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n defaults.set(scope, itemDefaults);\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach((property)=>{\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [\n scope\n ].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n constructor(){\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n this._typedRegistries = [\n this.controllers,\n this.scales,\n this.elements\n ];\n }\n add(...args) {\n this._each('register', args);\n }\n remove(...args) {\n this._each('unregister', args);\n }\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n _each(method, args, typedRegistry) {\n [\n ...args\n ].forEach((arg)=>{\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || reg === this.plugins && arg.id) {\n this._exec(method, reg, arg);\n } else {\n each(arg, (item)=>{\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n callback(component['before' + camelMethod], [], component);\n registry[method](component);\n callback(component['after' + camelMethod], [], component);\n }\n _getRegistryForType(type) {\n for(let i = 0; i < this._typedRegistries.length; i++){\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n return this.plugins;\n }\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n}\nvar registry = /* #__PURE__ */ new Registry();\n\nclass PluginService {\n constructor(){\n this._init = [];\n }\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n }\n return result;\n }\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors){\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [\n chart,\n args,\n descriptor.options\n ];\n if (callback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n return true;\n }\n invalidate() {\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n const descriptors = this._cache = this._createDescriptors(chart);\n this._notifyStateChanges(chart);\n return descriptors;\n }\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n function allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for(let i = 0; i < keys.length; i++){\n plugins.push(registry.getPlugin(keys[i]));\n }\n const local = config.plugins || [];\n for(let i = 0; i < local.length; i++){\n const plugin = local[i];\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n return {\n plugins,\n localIds\n };\n}\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\nfunction createDescriptors(chart, { plugins , localIds }, options, all) {\n const result = [];\n const context = chart.getContext();\n for (const plugin of plugins){\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {\n plugin,\n local: localIds[id]\n }, opts, context)\n });\n }\n return result;\n}\nfunction pluginOpts(config, { plugin , local }, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [\n ''\n ], {\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n\nfunction getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\nfunction determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions){\n const axis = opts.axis || axisFromPosition(opts.position) || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {\n axis\n };\n }\n}\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d)=>d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {\n scales: {}\n };\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n Object.keys(configScales).forEach((id)=>{\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [\n {\n axis\n },\n scaleConf,\n defaultScaleOptions[axis],\n defaultScaleOptions[defaultId]\n ]);\n });\n config.data.datasets.forEach((dataset)=>{\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach((defaultID)=>{\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [\n {\n axis\n },\n configScales[id],\n defaultScaleOptions[defaultID]\n ]);\n });\n });\n Object.keys(scales).forEach((key)=>{\n const scale = scales[key];\n mergeIf(scale, [\n defaults.scales[scale.type],\n defaults.scale\n ]);\n });\n return scales;\n}\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n initOptions(config);\n return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\nconst addIfFound = (set, obj, key)=>{\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\nclass Config {\n constructor(config){\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n get platform() {\n return this._config.platform;\n }\n get type() {\n return this._config.type;\n }\n set type(type) {\n this._config.type = type;\n }\n get data() {\n return this._config.data;\n }\n set data(data) {\n this._config.data = initData(data);\n }\n get options() {\n return this._config.options;\n }\n set options(options) {\n this._config.options = options;\n }\n get plugins() {\n return this._config.plugins;\n }\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType, ()=>[\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`, ()=>[\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`\n ],\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`, ()=>[\n [\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]\n ]);\n }\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`, ()=>[\n [\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || []\n ]\n ]);\n }\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n getOptionScopes(mainScope, keyLists, resetCache) {\n const { options , type } = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n const scopes = new Set();\n keyLists.forEach((keys)=>{\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach((key)=>addIfFound(scopes, mainScope, key));\n }\n keys.forEach((key)=>addIfFound(scopes, options, key));\n keys.forEach((key)=>addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach((key)=>addIfFound(scopes, defaults, key));\n keys.forEach((key)=>addIfFound(scopes, descriptors, key));\n });\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n chartOptionScopes() {\n const { options , type } = this;\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {},\n {\n type\n },\n defaults,\n descriptors\n ];\n }\n resolveNamedOptions(scopes, names, context, prefixes = [\n ''\n ]) {\n const result = {\n $shared: true\n };\n const { resolver , subPrefixes } = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n for (const prop of names){\n result[prop] = options[prop];\n }\n return result;\n }\n createResolver(scopes, context, prefixes = [\n ''\n ], descriptorDefaults) {\n const { resolver } = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context) ? _attachContext(resolver, context, undefined, descriptorDefaults) : resolver;\n }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter((p)=>!p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\nconst hasFunction = (value)=>isObject(value) && Object.getOwnPropertyNames(value).some((key)=>isFunction(value[key]));\nfunction needContext(proxy, names) {\n const { isScriptable , isIndexable } = _descriptors(proxy);\n for (const prop of names){\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if (scriptable && (isFunction(value) || hasFunction(value)) || indexable && isArray(value)) {\n return true;\n }\n }\n return false;\n}\n\nvar version = \"4.4.7\";\n\nconst KNOWN_POSITIONS = [\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'chartArea'\n];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x';\n}\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1];\n };\n}\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n chart.notifyPlugins('afterRender');\n callback(animationOptions && animationOptions.onComplete, [\n context\n ], chart);\n}\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callback(animationOptions && animationOptions.onProgress, [\n context\n ], chart);\n}\n function getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n item = item[0];\n }\n if (item && item.canvas) {\n item = item.canvas;\n }\n return item;\n}\nconst instances = {};\nconst getChart = (key)=>{\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c)=>c.canvas === canvas).pop();\n};\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys){\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n function determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\nfunction getSizeForArea(scale, chartArea, field) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\nfunction getDatasetArea(meta, chartArea) {\n const { xScale , yScale } = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\nclass Chart {\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n constructor(item, userConfig){\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error('Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' + ' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.');\n }\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce((mode)=>this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n instances[this.id] = this;\n if (!context || !canvas) {\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n get aspectRatio() {\n const { options: { aspectRatio , maintainAspectRatio } , width , height , _aspectRatio } = this;\n if (!isNullOrUndef(aspectRatio)) {\n return aspectRatio;\n }\n if (maintainAspectRatio && _aspectRatio) {\n return _aspectRatio;\n }\n return height ? width / height : null;\n }\n get data() {\n return this.config.data;\n }\n set data(data) {\n this.config.data = data;\n }\n get options() {\n return this._options;\n }\n set options(options) {\n this.config.options = options;\n }\n get registry() {\n return registry;\n }\n _initialize() {\n this.notifyPlugins('beforeInit');\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n this.bindEvents();\n this.notifyPlugins('afterInit');\n return this;\n }\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n stop() {\n animator.stop(this);\n return this;\n }\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {\n width,\n height\n };\n }\n }\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n this.notifyPlugins('resize', {\n size: newSize\n });\n callback(options.onResize, [\n this,\n newSize\n ], this);\n if (this.attached) {\n if (this._doResize(mode)) {\n this.render();\n }\n }\n }\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n each(scalesOptions, (axisOptions, axisID)=>{\n axisOptions.id = axisID;\n });\n }\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id)=>{\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n if (scaleOpts) {\n items = items.concat(Object.keys(scaleOpts).map((id)=>{\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n }));\n }\n each(items, (item)=>{\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n scale.init(scaleOptions, options);\n });\n each(updated, (hasUpdated, id)=>{\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n each(scales, (scale)=>{\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n metasets.sort((a, b)=>a.index - b.index);\n if (numMeta > numData) {\n for(let i = numData; i < numMeta; ++i){\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n _removeUnreferencedMetasets() {\n const { _metasets: metasets , data: { datasets } } = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index)=>{\n if (datasets.filter((x)=>x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n this._removeUnreferencedMetasets();\n for(i = 0, ilen = datasets.length; i < ilen; i++){\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const { datasetElementType , dataElementType } = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n this._updateMetasets();\n return newControllers;\n }\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex)=>{\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n update(mode) {\n const config = this.config;\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n this._plugins.invalidate();\n if (this.notifyPlugins('beforeUpdate', {\n mode,\n cancelable: true\n }) === false) {\n return;\n }\n const newControllers = this.buildOrUpdateControllers();\n this.notifyPlugins('beforeElementsUpdate');\n let minPadding = 0;\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; i++){\n const { controller } = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n if (!animsDisabled) {\n each(newControllers, (controller)=>{\n controller.reset();\n });\n }\n this._updateDatasets(mode);\n this.notifyPlugins('afterUpdate', {\n mode\n });\n this._layers.sort(compare2Level('z', '_idx'));\n const { _active , _lastEvent } = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n this.render();\n }\n _updateScales() {\n each(this.scales, (scale)=>{\n layouts.removeBox(this, scale);\n });\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n this.unbindEvents();\n this.bindEvents();\n }\n }\n _updateHiddenIndices() {\n const { _hiddenIndices } = this;\n const changes = this._getUniformDataChanges() || [];\n for (const { method , start , count } of changes){\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx)=>new Set(_dataChanges.filter((c)=>c[0] === idx).map((c, i)=>i + ',' + c.splice(1).join(',')));\n const changeSet = makeSet(0);\n for(let i = 1; i < datasetCount; i++){\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet).map((c)=>c.split(',')).map((a)=>({\n method: a[1],\n start: +a[2],\n count: +a[3]\n }));\n }\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {\n cancelable: true\n }) === false) {\n return;\n }\n layouts.update(this, this.width, this.height, minPadding);\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n this._layers = [];\n each(this.boxes, (box)=>{\n if (noArea && box.position === 'chartArea') {\n return;\n }\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n this._layers.forEach((item, index)=>{\n item._idx = index;\n });\n this.notifyPlugins('afterLayout');\n }\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {\n mode,\n cancelable: true\n }) === false) {\n return;\n }\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this.getDatasetMeta(i).controller.configure();\n }\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this._updateDataset(i, isFunction(mode) ? mode({\n datasetIndex: i\n }) : mode);\n }\n this.notifyPlugins('afterDatasetsUpdate', {\n mode\n });\n }\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {\n meta,\n index,\n mode,\n cancelable: true\n };\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n meta.controller._update(mode);\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n render() {\n if (this.notifyPlugins('beforeRender', {\n cancelable: true\n }) === false) {\n return;\n }\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({\n chart: this\n });\n }\n }\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const { width , height } = this._resizeBeforeDraw;\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n if (this.notifyPlugins('beforeDraw', {\n cancelable: true\n }) === false) {\n return;\n }\n const layers = this._layers;\n for(i = 0; i < layers.length && layers[i].z <= 0; ++i){\n layers[i].draw(this.chartArea);\n }\n this._drawDatasets();\n for(; i < layers.length; ++i){\n layers[i].draw(this.chartArea);\n }\n this.notifyPlugins('afterDraw');\n }\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n for(i = 0, ilen = metasets.length; i < ilen; ++i){\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n return result;\n }\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {\n cancelable: true\n }) === false) {\n return;\n }\n const metasets = this.getSortedVisibleDatasetMetas();\n for(let i = metasets.length - 1; i >= 0; --i){\n this._drawDataset(metasets[i]);\n }\n this.notifyPlugins('afterDatasetsDraw');\n }\n _drawDataset(meta) {\n const ctx = this.ctx;\n const clip = meta._clip;\n const useClip = !clip.disabled;\n const area = getDatasetArea(meta, this.chartArea);\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n if (useClip) {\n clipArea(ctx, {\n left: clip.left === false ? 0 : area.left - clip.left,\n right: clip.right === false ? this.width : area.right + clip.right,\n top: clip.top === false ? 0 : area.top - clip.top,\n bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n });\n }\n meta.controller.draw();\n if (useClip) {\n unclipArea(ctx);\n }\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n return [];\n }\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter((x)=>x && x._dataset === dataset).pop();\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n return meta;\n }\n getContext() {\n return this.$context || (this.$context = createContext(null, {\n chart: this,\n type: 'chart'\n }));\n }\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n const meta = this.getDatasetMeta(datasetIndex);\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n anims.update(meta, {\n visible\n });\n this.update((ctx)=>ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n for(i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this._destroyDatasetMeta(i);\n }\n }\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const { canvas , ctx } = this;\n this._stop();\n this.config.clearCache();\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n delete instances[this.id];\n this.notifyPlugins('afterDestroy');\n }\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n const _add = (type, listener)=>{\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const listener = (e, x, y)=>{\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n each(this.options.events, (type)=>_add(type, listener));\n }\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n const _add = (type, listener)=>{\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener)=>{\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n const listener = (width, height)=>{\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n let detached;\n const attached = ()=>{\n _remove('attach', attached);\n this.attached = true;\n this.resize();\n _add('resize', listener);\n _add('detach', detached);\n };\n detached = ()=>{\n this.attached = false;\n _remove('resize', listener);\n this._stop();\n this._resize(0, 0);\n _add('attach', attached);\n };\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n unbindEvents() {\n each(this._listeners, (listener, type)=>{\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n each(this._responsiveListeners, (listener, type)=>{\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n for(i = 0, ilen = items.length; i < ilen; ++i){\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({ datasetIndex , index })=>{\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n if (changed) {\n this._active = active;\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter((p)=>p.plugin.id === pluginId).length === 1;\n }\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin)=>(plugin.options.events || this.options.events).includes(e.native.type);\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n const changed = this._handleEvent(e, replay, args.inChartArea);\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n if (changed || args.changed) {\n this.render();\n }\n return this;\n }\n _handleEvent(e, replay, inChartArea) {\n const { _active: lastActive = [] , options } = this;\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n if (inChartArea) {\n this._lastEvent = null;\n callback(options.onHover, [\n e,\n active,\n this\n ], this);\n if (isClick) {\n callback(options.onClick, [\n e,\n active,\n this\n ], this);\n }\n }\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n this._lastEvent = lastEvent;\n return changed;\n }\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n if (!inChartArea) {\n return lastActive;\n }\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart)=>chart._plugins.invalidate());\n}\n\nfunction clipArc(ctx, element, endAngle) {\n const { startAngle , pixelMargin , x , y , outerRadius , innerRadius } = element;\n let angleMargin = pixelMargin / outerRadius;\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, [\n 'outerStart',\n 'outerEnd',\n 'innerStart',\n 'innerEnd'\n ]);\n}\n/**\n * Parse border radius from the provided options\n */ function parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val)=>{\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit)\n };\n}\n/**\n * Convert (r, 𝜃) to (x, y)\n */ function rThetaToXY(r, theta, x, y) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta)\n };\n}\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */ function pathArc(ctx, element, offset, spacing, end, circular) {\n const { x , y , startAngle: start , pixelMargin , innerRadius: innerR } = element;\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n let spacingOffset = 0;\n const alpha = end - start;\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? alpha * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const { outerStart , outerEnd , innerStart , innerEnd } = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n ctx.beginPath();\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2;\n ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true);\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing, circular) {\n const { fullCircles , startAngle , circumference } = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for(let i = 0; i < fullCircles; ++i){\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\nfunction drawBorder(ctx, element, offset, spacing, circular) {\n const { fullCircles , startAngle , circumference , options } = element;\n const { borderWidth , borderJoinStyle , borderDash , borderDashOffset } = options;\n const inner = options.borderAlign === 'inner';\n if (!borderWidth) {\n return;\n }\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for(let i = 0; i < fullCircles; ++i){\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\nclass ArcElement extends Element {\n static id = 'arc';\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n static descriptors = {\n _scriptable: true,\n _indexable: (name)=>name !== 'borderDash'\n };\n circumference;\n endAngle;\n fullCircles;\n innerRadius;\n outerRadius;\n pixelMargin;\n startAngle;\n constructor(cfg){\n super();\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(chartX, chartY, useFinalPosition) {\n const point = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n const { angle , distance } = getAngleFromPoint(point, {\n x: chartX,\n y: chartY\n });\n const { startAngle , endAngle , innerRadius , outerRadius , circumference } = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n return betweenAngles && withinRadius;\n }\n getCenterPoint(useFinalPosition) {\n const { x , y , startAngle , endAngle , innerRadius , outerRadius } = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const { offset , spacing } = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n tooltipPosition(useFinalPosition) {\n return this.getCenterPoint(useFinalPosition);\n }\n draw(ctx) {\n const { options , circumference } = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = options.borderAlign === 'inner' ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n ctx.save();\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n ctx.restore();\n }\n}\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n function getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const { start: paramsStart = 0 , end: paramsEnd = count - 1 } = params;\n const { start: segmentStart , end: segmentEnd } = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n function pathSegment(ctx, line, segment, params) {\n const { points , options } = line;\n const { count , start , loop , ilen } = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n let { move =true , reverse } = params || {};\n let i, point, prev;\n for(i = 0; i <= ilen; ++i){\n point = points[(start + (reverse ? ilen - i : i)) % count];\n if (point.skip) {\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n prev = point;\n }\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n return !!loop;\n}\n function fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const { count , start , ilen } = pathVars(points, segment, params);\n const { move =true , reverse } = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n const pointIndex = (index)=>(start + (reverse ? ilen - index : index)) % count;\n const drawX = ()=>{\n if (minY !== maxY) {\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n ctx.lineTo(avgX, lastY);\n }\n };\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n for(i = 0; i <= ilen; ++i){\n point = points[pointIndex(i)];\n if (point.skip) {\n continue;\n }\n const x = point.x;\n const y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n ctx.lineTo(x, y);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n lastY = y;\n }\n drawX();\n}\n function _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n function _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n const { segments , options } = line;\n const segmentMethod = _getSegmentMethod(line);\n for (const segment of segments){\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {\n start,\n end: start + count - 1\n })) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\nclass LineElement extends Element {\n static id = 'line';\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n static descriptors = {\n _scriptable: true,\n _indexable: (name)=>name !== 'borderDash' && name !== 'fill'\n };\n constructor(cfg){\n super();\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n get points() {\n return this._points;\n }\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {\n property,\n start: value,\n end: value\n });\n if (!segments.length) {\n return;\n }\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for(i = 0, ilen = segments.length; i < ilen; ++i){\n const { start , end } = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n start = start || 0;\n count = count || this.points.length - start;\n for (const segment of segments){\n loop &= segmentMethod(ctx, this, segment, {\n start,\n end: start + count - 1\n });\n }\n return !!loop;\n }\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n if (points.length && options.borderWidth) {\n ctx.save();\n draw(ctx, this, start, count);\n ctx.restore();\n }\n if (this.animated) {\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n const options = el.options;\n const { [axis]: value } = el.getProps([\n axis\n ], useFinalPosition);\n return Math.abs(pos - value) < options.radius + options.hitRadius;\n}\nclass PointElement extends Element {\n static id = 'point';\n parsed;\n skip;\n stop;\n /**\n * @type {any}\n */ static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n /**\n * @type {any}\n */ static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n constructor(cfg){\n super();\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n const options = this.options;\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2) < Math.pow(options.hitRadius + options.radius, 2);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange$1(this, mouseX, 'x', useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange$1(this, mouseY, 'y', useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return {\n x,\n y\n };\n }\n size(options) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n draw(ctx, area) {\n const options = this.options;\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n\nfunction getBarBounds(bar, useFinalPosition) {\n const { x , y , base , width , height } = bar.getProps([\n 'x',\n 'y',\n 'base',\n 'width',\n 'height'\n ], useFinalPosition);\n let left, right, top, bottom, half;\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n return {\n left,\n top,\n right,\n bottom\n };\n}\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n const { enableBorderRadius } = bar.getProps([\n 'enableBorderRadius'\n ]);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n const enableBorder = enableBorderRadius || isObject(value);\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r))\n }\n }\n };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n return bounds && (skipX || _isBetween(x, bounds.left, bounds.right)) && (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n function addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\nclass BarElement extends Element {\n static id = 'bar';\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n constructor(cfg){\n super();\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n draw(ctx) {\n const { inflateAmount , options: { borderColor , backgroundColor } } = this;\n const { inner , outer } = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n ctx.save();\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const { x , y , base , horizontal } = this.getProps([\n 'x',\n 'y',\n 'base',\n 'horizontal'\n ], useFinalPosition);\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nBarElement: BarElement,\nLineElement: LineElement,\nPointElement: PointElement\n});\n\nconst BORDER_COLORS = [\n 'rgb(54, 162, 235)',\n 'rgb(255, 99, 132)',\n 'rgb(255, 159, 64)',\n 'rgb(255, 205, 86)',\n 'rgb(75, 192, 192)',\n 'rgb(153, 102, 255)',\n 'rgb(201, 203, 207)' // grey\n];\n// Border colors with 50% transparency\nconst BACKGROUND_COLORS = /* #__PURE__ */ BORDER_COLORS.map((color)=>color.replace('rgb(', 'rgba(').replace(')', ', 0.5)'));\nfunction getBorderColor(i) {\n return BORDER_COLORS[i % BORDER_COLORS.length];\n}\nfunction getBackgroundColor(i) {\n return BACKGROUND_COLORS[i % BACKGROUND_COLORS.length];\n}\nfunction colorizeDefaultDataset(dataset, i) {\n dataset.borderColor = getBorderColor(i);\n dataset.backgroundColor = getBackgroundColor(i);\n return ++i;\n}\nfunction colorizeDoughnutDataset(dataset, i) {\n dataset.backgroundColor = dataset.data.map(()=>getBorderColor(i++));\n return i;\n}\nfunction colorizePolarAreaDataset(dataset, i) {\n dataset.backgroundColor = dataset.data.map(()=>getBackgroundColor(i++));\n return i;\n}\nfunction getColorizer(chart) {\n let i = 0;\n return (dataset, datasetIndex)=>{\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n if (controller instanceof DoughnutController) {\n i = colorizeDoughnutDataset(dataset, i);\n } else if (controller instanceof PolarAreaController) {\n i = colorizePolarAreaDataset(dataset, i);\n } else if (controller) {\n i = colorizeDefaultDataset(dataset, i);\n }\n };\n}\nfunction containsColorsDefinitions(descriptors) {\n let k;\n for(k in descriptors){\n if (descriptors[k].borderColor || descriptors[k].backgroundColor) {\n return true;\n }\n }\n return false;\n}\nfunction containsColorsDefinition(descriptor) {\n return descriptor && (descriptor.borderColor || descriptor.backgroundColor);\n}\nfunction containsDefaultColorsDefenitions() {\n return defaults.borderColor !== 'rgba(0,0,0,0.1)' || defaults.backgroundColor !== 'rgba(0,0,0,0.1)';\n}\nvar plugin_colors = {\n id: 'colors',\n defaults: {\n enabled: true,\n forceOverride: false\n },\n beforeLayout (chart, _args, options) {\n if (!options.enabled) {\n return;\n }\n const { data: { datasets } , options: chartOptions } = chart.config;\n const { elements } = chartOptions;\n const containsColorDefenition = containsColorsDefinitions(datasets) || containsColorsDefinition(chartOptions) || elements && containsColorsDefinitions(elements) || containsDefaultColorsDefenitions();\n if (!options.forceOverride && containsColorDefenition) {\n return;\n }\n const colorizer = getColorizer(chart);\n datasets.forEach(colorizer);\n }\n};\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n const samples = options.samples || availableWidth;\n if (samples >= count) {\n return data.slice(start, start + count);\n }\n const decimated = [];\n const bucketWidth = (count - 2) / (samples - 2);\n let sampledIndex = 0;\n const endIndex = start + count - 1;\n let a = start;\n let i, maxAreaPoint, maxArea, area, nextA;\n decimated[sampledIndex++] = data[a];\n for(i = 0; i < samples - 2; i++){\n let avgX = 0;\n let avgY = 0;\n let j;\n const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n for(j = avgRangeStart; j < avgRangeEnd; j++){\n avgX += data[j].x;\n avgY += data[j].y;\n }\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n const { x: pointAx , y: pointAy } = data[a];\n maxArea = area = -1;\n for(j = rangeOffs; j < rangeTo; j++){\n area = 0.5 * Math.abs((pointAx - avgX) * (data[j].y - pointAy) - (pointAx - data[j].x) * (avgY - pointAy));\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n decimated[sampledIndex++] = maxAreaPoint;\n a = nextA;\n }\n decimated[sampledIndex++] = data[endIndex];\n return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n let avgX = 0;\n let countX = 0;\n let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n const decimated = [];\n const endIndex = start + count - 1;\n const xMin = data[start].x;\n const xMax = data[endIndex].x;\n const dx = xMax - xMin;\n for(i = start; i < start + count; ++i){\n point = data[i];\n x = (point.x - xMin) / dx * availableWidth;\n y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n minIndex = i;\n } else if (y > maxY) {\n maxY = y;\n maxIndex = i;\n }\n avgX = (countX * avgX + point.x) / ++countX;\n } else {\n const lastIndex = i - 1;\n if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n const intermediateIndex1 = Math.min(minIndex, maxIndex);\n const intermediateIndex2 = Math.max(minIndex, maxIndex);\n if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex1],\n x: avgX\n });\n }\n if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex2],\n x: avgX\n });\n }\n }\n if (i > 0 && lastIndex !== startIndex) {\n decimated.push(data[lastIndex]);\n }\n decimated.push(point);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n minIndex = maxIndex = startIndex = i;\n }\n }\n return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n if (dataset._decimated) {\n const data = dataset._data;\n delete dataset._decimated;\n delete dataset._data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n writable: true,\n value: data\n });\n }\n}\nfunction cleanDecimatedData(chart) {\n chart.data.datasets.forEach((dataset)=>{\n cleanDecimatedDataset(dataset);\n });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n const pointCount = points.length;\n let start = 0;\n let count;\n const { iScale } = meta;\n const { min , max , minDefined , maxDefined } = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n return {\n start,\n count\n };\n}\nvar plugin_decimation = {\n id: 'decimation',\n defaults: {\n algorithm: 'min-max',\n enabled: false\n },\n beforeElementsUpdate: (chart, args, options)=>{\n if (!options.enabled) {\n cleanDecimatedData(chart);\n return;\n }\n const availableWidth = chart.width;\n chart.data.datasets.forEach((dataset, datasetIndex)=>{\n const { _data , indexAxis } = dataset;\n const meta = chart.getDatasetMeta(datasetIndex);\n const data = _data || dataset.data;\n if (resolve([\n indexAxis,\n chart.options.indexAxis\n ]) === 'y') {\n return;\n }\n if (!meta.controller.supportsDecimation) {\n return;\n }\n const xAxis = chart.scales[meta.xAxisID];\n if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n return;\n }\n if (chart.options.parsing) {\n return;\n }\n let { start , count } = getStartAndCountOfVisiblePointsSimplified(meta, data);\n const threshold = options.threshold || 4 * availableWidth;\n if (count <= threshold) {\n cleanDecimatedDataset(dataset);\n return;\n }\n if (isNullOrUndef(_data)) {\n dataset._data = data;\n delete dataset.data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this._decimated;\n },\n set: function(d) {\n this._data = d;\n }\n });\n }\n let decimated;\n switch(options.algorithm){\n case 'lttb':\n decimated = lttbDecimation(data, start, count, availableWidth, options);\n break;\n case 'min-max':\n decimated = minMaxDecimation(data, start, count, availableWidth);\n break;\n default:\n throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n }\n dataset._decimated = decimated;\n });\n },\n destroy (chart) {\n cleanDecimatedData(chart);\n }\n};\n\nfunction _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n for (const segment of segments){\n let { start , end } = segment;\n end = _findSegmentEnd(start, end, points);\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n if (!target.segments) {\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n const targetSegments = _boundSegments(target, bounds);\n for (const tgt of targetSegments){\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n for (const fillSource of fillSources){\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\nfunction _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {\n property,\n start,\n end\n };\n}\nfunction _pointsFromSegments(boundary, line) {\n const { x =null , y =null } = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({ start , end })=>{\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({\n x: first.x,\n y\n });\n points.push({\n x: last.x,\n y\n });\n } else if (x !== null) {\n points.push({\n x,\n y: first.y\n });\n points.push({\n x,\n y: last.y\n });\n }\n });\n return points;\n}\nfunction _findSegmentEnd(start, end, points) {\n for(; end > start; end--){\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n\nfunction _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n if (isArray(boundary)) {\n _loop = true;\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n return points.length ? new LineElement({\n points,\n options: {\n tension: 0\n },\n _loop,\n _fullLoop: _loop\n }) : null;\n}\nfunction _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n\nfunction _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [\n index\n ];\n let target;\n if (!propagate) {\n return fill;\n }\n while(fill !== false && visited.indexOf(fill) === -1){\n if (!isNumberFinite(fill)) {\n return fill;\n }\n target = sources[fill];\n if (!target) {\n return false;\n }\n if (target.visible) {\n return fill;\n }\n visited.push(fill);\n fill = target.fill;\n }\n return false;\n}\n function _decodeFill(line, index, count) {\n const fill = parseFillOption(line);\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n let target = parseFloat(fill);\n if (isNumberFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n return [\n 'origin',\n 'start',\n 'end',\n 'stack',\n 'shape'\n ].indexOf(fill) >= 0 && fill;\n}\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n return target;\n}\n function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n function _getTargetValue(fill, scale, startValue) {\n let value;\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n function parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n if (fill === false || fill === null) {\n return false;\n }\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n\nfunction _buildStackLine(source) {\n const { scale , index , line } = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({\n x: null,\n y: scale.bottom\n }, line));\n for(let i = 0; i < segments.length; i++){\n const segment = segments[i];\n for(let j = segment.start; j <= segment.end; j++){\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({\n points,\n options: {}\n });\n}\n function getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n for(let i = 0; i < metas.length; i++){\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n function addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for(let j = 0; j < linesBelow.length; j++){\n const line = linesBelow[j];\n const { first , last , point } = findPoint(line, sourcePoint, 'x');\n if (!point || first && last) {\n continue;\n }\n if (first) {\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n break;\n }\n }\n }\n points.push(...postponed);\n}\n function findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for(let i = 0; i < segments.length; i++){\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {\n first,\n last,\n point\n };\n}\n\nclass simpleArc {\n constructor(opts){\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n pathSegment(ctx, bounds, opts) {\n const { x , y , radius } = this;\n bounds = bounds || {\n start: 0,\n end: TAU\n };\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n interpolate(point) {\n const { x , y , radius } = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n\nfunction _getTarget(source) {\n const { chart , fill , line } = source;\n if (isNumberFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n if (fill === 'shape') {\n return true;\n }\n const boundary = computeBoundary(source);\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n return _createBoundaryLine(boundary, line);\n}\n function getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\nfunction computeLinearBoundary(source) {\n const { scale ={} , fill } = source;\n const pixel = _getTargetPixel(fill, scale);\n if (isNumberFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n return null;\n}\nfunction computeCircularBoundary(source) {\n const { scale , fill } = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n for(let i = 0; i < length; ++i){\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\nfunction _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const { line , scale , axis } = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const { above =color , below =color } = fillOption || {};\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {\n line,\n target,\n above,\n below,\n area,\n scale,\n axis\n });\n unclipArea(ctx);\n }\n}\nfunction doFill(ctx, cfg) {\n const { line , target , above , below , area , scale } = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n ctx.save();\n if (property === 'x' && below !== above) {\n clipVertical(ctx, target, area.top);\n fill(ctx, {\n line,\n target,\n color: above,\n scale,\n property\n });\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n }\n fill(ctx, {\n line,\n target,\n color: below,\n scale,\n property\n });\n ctx.restore();\n}\nfunction clipVertical(ctx, target, clipY) {\n const { segments , points } = target;\n let first = true;\n let lineLoop = false;\n ctx.beginPath();\n for (const segment of segments){\n const { start , end } = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {\n move: lineLoop\n });\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\nfunction fill(ctx, cfg) {\n const { line , target , property , color , scale } = cfg;\n const segments = _segments(line, target, property);\n for (const { source: src , target: tgt , start , end } of segments){\n const { style: { backgroundColor =color } = {} } = src;\n const notShape = target !== true;\n ctx.save();\n ctx.fillStyle = backgroundColor;\n clipBounds(ctx, scale, notShape && _getBounds(property, start, end));\n ctx.beginPath();\n const lineLoop = !!line.pathSegment(ctx, src);\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n const targetLoop = !!target.pathSegment(ctx, tgt, {\n move: lineLoop,\n reverse: true\n });\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n ctx.restore();\n }\n}\nfunction clipBounds(ctx, scale, bounds) {\n const { top , bottom } = scale.chart.chartArea;\n const { property , start , end } = bounds || {};\n if (property === 'x') {\n ctx.beginPath();\n ctx.rect(start, top, end - start, bottom - top);\n ctx.clip();\n }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\nvar index = {\n id: 'filler',\n afterDatasetsUpdate (chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n for(i = 0; i < count; ++i){\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line\n };\n }\n meta.$filler = source;\n sources.push(source);\n }\n for(i = 0; i < count; ++i){\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n beforeDraw (chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for(let i = metasets.length - 1; i >= 0; --i){\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n beforeDatasetsDraw (chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n const metasets = chart.getSortedVisibleDatasetMetas();\n for(let i = metasets.length - 1; i >= 0; --i){\n const source = metasets[i].$filler;\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n beforeDatasetDraw (chart, args, options) {\n const source = args.meta.$filler;\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n\nconst getBoxSize = (labelOpts, fontSize)=>{\n let { boxHeight =fontSize , boxWidth =fontSize } = labelOpts;\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\nconst itemsEqual = (a, b)=>a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n constructor(config){\n super();\n this._added = false;\n this.legendHitBoxes = [];\n this._hoveredItem = null;\n this.doughnutMode = false;\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = callback(labelOpts.generateLabels, [\n this.chart\n ], this) || [];\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item)=>labelOpts.filter(item, this.chart.data));\n }\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b)=>labelOpts.sort(a, b, this.chart.data));\n }\n if (this.options.reverse) {\n legendItems.reverse();\n }\n this.legendItems = legendItems;\n }\n fit() {\n const { options , ctx } = this;\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const { boxWidth , itemHeight } = getBoxSize(labelOpts, fontSize);\n let width, height;\n ctx.font = labelFont.string;\n if (this.isHorizontal()) {\n width = this.maxWidth;\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight;\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const { ctx , maxWidth , options: { labels: { padding } } } = this;\n const hitboxes = this.legendHitBoxes = [];\n const lineWidths = this.lineWidths = [\n 0\n ];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i)=>{\n const itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n hitboxes[i] = {\n left: 0,\n top,\n row,\n width: itemWidth,\n height: itemHeight\n };\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n return totalHeight;\n }\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const { ctx , maxHeight , options: { labels: { padding } } } = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n let left = 0;\n let col = 0;\n this.legendItems.forEach((legendItem, i)=>{\n const { itemWidth , itemHeight } = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({\n width: currentColWidth,\n height: currentColHeight\n });\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n hitboxes[i] = {\n left,\n top: currentColHeight,\n col,\n width: itemWidth,\n height: itemHeight\n };\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n totalWidth += currentColWidth;\n columnSizes.push({\n width: currentColWidth,\n height: currentColHeight\n });\n return totalWidth;\n }\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const { legendHitBoxes: hitboxes , options: { align , labels: { padding } , rtl } } = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes){\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes){\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n this._draw();\n unclipArea(ctx);\n }\n }\n _draw() {\n const { options: opts , columnSizes , lineWidths , ctx } = this;\n const { align , labels: labelOpts } = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const { padding } = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n this.drawTitle();\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n const { boxWidth , boxHeight , itemHeight } = getBoxSize(labelOpts, fontSize);\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n ctx.save();\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n if (labelOpts.usePointStyle) {\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n ctx.beginPath();\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n ctx.restore();\n };\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + itemHeight / 2, labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n overrideTextDirection(this.ctx, opts.textDirection);\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i)=>{\n ctx.strokeStyle = legendItem.fontColor;\n ctx.fillStyle = legendItem.fontColor;\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n rtlHelper.setWidth(this.width);\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n const realX = rtlHelper.x(x);\n drawLegendBox(realX, y, legendItem);\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n fillText(rtlHelper.x(x), y, legendItem);\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n if (!titleOpts.display) {\n return;\n }\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n let left = this.left;\n let maxWidth = this.width;\n if (this.isHorizontal()) {\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n const maxHeight = this.columnSizes.reduce((acc, size)=>Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n const x = _alignStartEnd(position, left, left + maxWidth);\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n if (_isBetween(x, this.left, this.right) && _isBetween(y, this.top, this.bottom)) {\n lh = this.legendHitBoxes;\n for(i = 0; i < lh.length; ++i){\n hitBox = lh[i];\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width) && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n return this.legendItems[i];\n }\n }\n }\n return null;\n }\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n callback(opts.onLeave, [\n e,\n previous,\n this\n ], this);\n }\n this._hoveredItem = hoveredItem;\n if (hoveredItem && !sameItem) {\n callback(opts.onHover, [\n e,\n hoveredItem,\n this\n ], this);\n }\n } else if (hoveredItem) {\n callback(opts.onClick, [\n e,\n hoveredItem,\n this\n ], this);\n }\n }\n}\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {\n itemWidth,\n itemHeight\n };\n}\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b)=>a.length > b.length ? a : b);\n }\n return boxWidth + labelFont.size / 2 + ctx.measureText(legendItemText).width;\n}\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\nvar plugin_legend = {\n id: 'legend',\n _element: Legend,\n start (chart, _args, options) {\n const legend = chart.legend = new Legend({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n stop (chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n beforeUpdate (chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n afterUpdate (chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n afterEvent (chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n onClick (e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n onHover: null,\n onLeave: null,\n labels: {\n color: (ctx)=>ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n generateLabels (chart) {\n const datasets = chart.data.datasets;\n const { labels: { usePointStyle , pointStyle , textAlign , color , useBorderRadius , borderRadius } } = chart.legend.options;\n return chart._getSortedDatasetMetas().map((meta)=>{\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n title: {\n color: (ctx)=>ctx.chart.options.color,\n display: false,\n position: 'center',\n text: ''\n }\n },\n descriptors: {\n _scriptable: (name)=>!name.startsWith('on'),\n labels: {\n _scriptable: (name)=>![\n 'generateLabels',\n 'filter',\n 'sort'\n ].includes(name)\n }\n }\n};\n\nclass Title extends Element {\n constructor(config){\n super();\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this._padding = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight) {\n const opts = this.options;\n this.left = 0;\n this.top = 0;\n if (!opts.display) {\n this.width = this.height = this.right = this.bottom = 0;\n return;\n }\n this.width = this.right = maxWidth;\n this.height = this.bottom = maxHeight;\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n this._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n if (this.isHorizontal()) {\n this.height = textSize;\n } else {\n this.width = textSize;\n }\n }\n isHorizontal() {\n const pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n }\n _drawArgs(offset) {\n const { top , left , bottom , right , options } = this;\n const align = options.align;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n if (this.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n if (options.position === 'left') {\n titleX = left + offset;\n titleY = _alignStartEnd(align, bottom, top);\n rotation = PI * -0.5;\n } else {\n titleX = right - offset;\n titleY = _alignStartEnd(align, top, bottom);\n rotation = PI * 0.5;\n }\n maxWidth = bottom - top;\n }\n return {\n titleX,\n titleY,\n maxWidth,\n rotation\n };\n }\n draw() {\n const ctx = this.ctx;\n const opts = this.options;\n if (!opts.display) {\n return;\n }\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + this._padding.top;\n const { titleX , titleY , maxWidth , rotation } = this._drawArgs(offset);\n renderText(ctx, opts.text, 0, 0, fontOpts, {\n color: opts.color,\n maxWidth,\n rotation,\n textAlign: _toLeftRightCenter(opts.align),\n textBaseline: 'middle',\n translation: [\n titleX,\n titleY\n ]\n });\n }\n}\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\nvar plugin_title = {\n id: 'title',\n _element: Title,\n start (chart, _args, options) {\n createTitle(chart, options);\n },\n stop (chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n beforeUpdate (chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'bold'\n },\n fullSize: true,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false\n }\n};\n\nconst map = new WeakMap();\nvar plugin_subtitle = {\n id: 'subtitle',\n start (chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n stop (chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n beforeUpdate (chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal'\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false\n }\n};\n\nconst positioners = {\n average (items) {\n if (!items.length) {\n return false;\n }\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n for(i = 0, len = items.length; i < len; ++i){\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n const xAverage = [\n ...xSet\n ].reduce((a, b)=>a + b) / xSet.size;\n return {\n x: xAverage,\n y: y / count\n };\n },\n nearest (items, eventPosition) {\n if (!items.length) {\n return false;\n }\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n for(i = 0, len = items.length; i < len; ++i){\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n return {\n x,\n y\n };\n }\n};\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n return base;\n}\n function splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n function createTooltipItem(chart, item) {\n const { element , datasetIndex , index } = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const { label , value } = controller.getLabelAndValue(index);\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n function getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const { body , footer , title } = tooltip;\n const { boxWidth , boxHeight } = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n let combinedBodyLength = body.reduce((count, bodyItem)=>count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight + (titleLineCount - 1) * options.titleSpacing + options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight + (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight + (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop + footerLineCount * footerFont.lineHeight + (footerLineCount - 1) * options.footerSpacing;\n }\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n ctx.save();\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n widthPadding = options.displayColors ? boxWidth + 2 + options.boxPadding : 0;\n each(body, (bodyItem)=>{\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n widthPadding = 0;\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n ctx.restore();\n width += padding.width;\n return {\n width,\n height\n };\n}\nfunction determineYAlign(chart, size) {\n const { y , height } = size;\n if (y < height / 2) {\n return 'top';\n } else if (y > chart.height - height / 2) {\n return 'bottom';\n }\n return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const { x , width } = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n const { x , width } = size;\n const { width: chartWidth , chartArea: { left , right } } = chart;\n let xAlign = 'center';\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n return xAlign;\n}\n function determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\nfunction alignX(size, xAlign) {\n let { x , width } = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= width / 2;\n }\n return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n let { y , height } = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= height / 2;\n }\n return y;\n}\n function getBackgroundPoint(options, size, alignment, chart) {\n const { caretSize , caretPadding , cornerRadius } = options;\n const { xAlign , yAlign } = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(cornerRadius);\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n return align === 'center' ? tooltip.x + tooltip.width / 2 : align === 'right' ? tooltip.x + tooltip.width - padding.right : tooltip.x + padding.left;\n}\n function getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\nconst defaultCallbacks = {\n beforeTitle: noop,\n title (tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n return '';\n },\n afterTitle: noop,\n beforeBody: noop,\n beforeLabel: noop,\n label (tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n let label = tooltipItem.dataset.label || '';\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor (tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0\n };\n },\n labelTextColor () {\n return this.options.bodyColor;\n },\n labelPointStyle (tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation\n };\n },\n afterLabel: noop,\n afterBody: noop,\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n function invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n return result;\n}\nclass Tooltip extends Element {\n static positioners = positioners;\n constructor(config){\n super();\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n if (cached) {\n return cached;\n }\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n return animations;\n }\n getContext() {\n return this.$context || (this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n getTitle(context, options) {\n const { callbacks } = options;\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n return lines;\n }\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems));\n }\n getBody(tooltipItems, options) {\n const { callbacks } = options;\n const bodyItems = [];\n each(tooltipItems, (context)=>{\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n bodyItems.push(bodyItem);\n });\n return bodyItems;\n }\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems));\n }\n getFooter(tooltipItems, options) {\n const { callbacks } = options;\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n return lines;\n }\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n for(i = 0, len = active.length; i < len; ++i){\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array)=>options.filter(element, index, array, data));\n }\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b)=>options.itemSort(a, b, data));\n }\n each(tooltipItems, (context)=>{\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n if (changed && options.external) {\n options.external.call(this, {\n chart: this.chart,\n tooltip: this,\n replay\n });\n }\n }\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n getCaretPosition(tooltipPoint, size, options) {\n const { xAlign , yAlign } = this;\n const { caretSize , cornerRadius } = options;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(cornerRadius);\n const { x: ptX , y: ptY } = tooltipPoint;\n const { width , height } = size;\n let x1, x2, x3, y1, y2, y3;\n if (yAlign === 'center') {\n y2 = ptY + height / 2;\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {\n x1,\n x2,\n x3,\n y1,\n y2,\n y3\n };\n }\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, options.titleAlign, options);\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n for(i = 0; i < length; ++i){\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing;\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing;\n }\n }\n }\n }\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const { boxHeight , boxWidth } = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2,\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : labelColor.borderWidth || 1;\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius\n });\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius\n });\n ctx.fill();\n } else {\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n ctx.fillStyle = this.labelTextColors[i];\n }\n drawBody(pt, ctx, options) {\n const { body } = this;\n const { bodySpacing , bodyAlign , displayColors , boxHeight , boxWidth , boxPadding } = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right' ? bodyAlign === 'center' ? boxWidth / 2 + boxPadding : boxWidth + 2 + boxPadding : 0;\n for(i = 0, ilen = body.length; i < ilen; ++i){\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n lines = bodyItem.lines;\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n for(j = 0, jlen = lines.length; j < jlen; ++j){\n fillLineOfText(lines[j]);\n bodyLineHeight = bodyFont.lineHeight;\n }\n each(bodyItem.after, fillLineOfText);\n }\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing;\n }\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n footerFont = toFont(options.footerFont);\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n for(i = 0; i < length; ++i){\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n drawBackground(pt, ctx, tooltipSize, options) {\n const { xAlign , yAlign } = this;\n const { x , y } = pt;\n const { width , height } = tooltipSize;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(options.cornerRadius);\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n _willRender() {\n return !!this.opacity;\n }\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n if (!opacity) {\n return;\n }\n this._updateAnimationTarget(options);\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n const padding = toPadding(options.padding);\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n this.drawBackground(pt, ctx, tooltipSize, options);\n overrideTextDirection(ctx, options.textDirection);\n pt.y += padding.top;\n this.drawTitle(pt, ctx, options);\n this.drawBody(pt, ctx, options);\n this.drawFooter(pt, ctx, options);\n restoreTextDirection(ctx, options.textDirection);\n ctx.restore();\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({ datasetIndex , index })=>{\n const meta = this.chart.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n const positionChanged = this._positionChanged(active, e);\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n if (changed) {\n this._active = active;\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n this.update(true, replay);\n }\n }\n return changed;\n }\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n if (e.type === 'mouseout') {\n return [];\n }\n if (!inChartArea) {\n return lastActive.filter((i)=>this.chart.data.datasets[i.datasetIndex] && this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined);\n }\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n if (options.reverse) {\n active.reverse();\n }\n return active;\n }\n _positionChanged(active, e) {\n const { caretX , caretY , options } = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\nvar plugin_tooltip = {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n afterInit (chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({\n chart,\n options\n });\n }\n },\n beforeUpdate (chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n reset (chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n afterDraw (chart) {\n const tooltip = chart.tooltip;\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n if (chart.notifyPlugins('beforeTooltipDraw', {\n ...args,\n cancelable: true\n }) === false) {\n return;\n }\n tooltip.draw(chart.ctx);\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n afterEvent (chart, args) {\n if (chart.tooltip) {\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n args.changed = true;\n }\n }\n },\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold'\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {},\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold'\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts)=>opts.bodyFont.size,\n boxWidth: (ctx, opts)=>opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart'\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'width',\n 'height',\n 'caretX',\n 'caretY'\n ]\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n descriptors: {\n _scriptable: (name)=>name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n additionalOptionScopes: [\n 'interaction'\n ]\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nColors: plugin_colors,\nDecimation: plugin_decimation,\nFiller: index,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index, addedLabels)=>{\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({\n index,\n label: raw\n });\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\nconst validIndex = (index, max)=>index === null ? null : _limitValue(Math.round(index), 0, max);\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\nclass CategoryScale extends Scale {\n static id = 'category';\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n constructor(cfg){\n super(cfg);\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const { index , label } of added){\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n determineDataLimits() {\n const { minDefined , maxDefined } = this.getUserBounds();\n let { min , max } = this.getMinMax(true);\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n labels = min === 0 && max === labels.length - 1 ? labels : labels.slice(min, max + 1);\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n for(let value = min; value <= max; value++){\n ticks.push({\n value\n });\n }\n return ticks;\n }\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n configure() {\n super.configure();\n if (!this.isHorizontal()) {\n this._reversePixels = !this._reversePixels;\n }\n }\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n getBasePixel() {\n return this.bottom;\n }\n}\n\nfunction generateTicks$1(generationOptions, dataRange) {\n const ticks = [];\n const MIN_SPACING = 1e-14;\n const { bounds , step , min , max , precision , count , maxTicks , maxDigits , includeBounds } = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const { min: rmin , max: rmax } = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [\n {\n value: rmin\n },\n {\n value: rmax\n }\n ];\n }\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n if (!isNullOrUndef(precision)) {\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n numSpaces = (niceMax - niceMin) / spacing;\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n const decimalPlaces = Math.max(_decimalPlaces(spacing), _decimalPlaces(niceMin));\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({\n value: min\n });\n if (niceMin < min) {\n j++;\n }\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n for(; j < numSpaces; ++j){\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({\n value: tickValue\n });\n }\n if (maxDefined && includeBounds && niceMax !== max) {\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({\n value: max\n });\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({\n value: niceMax\n });\n }\n return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, { horizontal , minRotation }) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n constructor(cfg){\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._endValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n return +raw;\n }\n handleTickRangeOptions() {\n const { beginAtZero } = this.options;\n const { minDefined , maxDefined } = this.getUserBounds();\n let { min , max } = this;\n const setMin = (v)=>min = minDefined ? min : v;\n const setMax = (v)=>max = maxDefined ? max : v;\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n setMax(max + offset);\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n getTickLimit() {\n const tickOpts = this.options.ticks;\n let { maxTicksLimit , stepSize } = tickOpts;\n let maxTicks;\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n return maxTicks;\n }\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n super.configure();\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n\nclass LinearScale extends LinearScaleBase {\n static id = 'linear';\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n determineDataLimits() {\n const { min , max } = this.getMinMax(true);\n this.min = isNumberFinite(min) ? min : 0;\n this.max = isNumberFinite(max) ? max : 1;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n\nconst log10Floor = (v)=>Math.floor(log10(v));\nconst changeExponent = (v, m)=>Math.pow(10, log10Floor(v) + m);\nfunction isMajor(tickVal) {\n const remain = tickVal / Math.pow(10, log10Floor(tickVal));\n return remain === 1;\n}\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while(steps(min, max, rangeExp) > 10){\n rangeExp++;\n }\n while(steps(min, max, rangeExp) < 10){\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n function generateTicks(generationOptions, { min , max }) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while(value < max){\n ticks.push({\n value,\n major: isMajor(value),\n significand\n });\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({\n value: lastTick,\n major: isMajor(lastTick),\n significand\n });\n return ticks;\n}\nclass LogarithmicScale extends Scale {\n static id = 'logarithmic';\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n constructor(cfg){\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [\n raw,\n index\n ]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isNumberFinite(value) && value > 0 ? value : null;\n }\n determineDataLimits() {\n const { min , max } = this.getMinMax(true);\n this.min = isNumberFinite(min) ? Math.max(0, min) : null;\n this.max = isNumberFinite(max) ? Math.max(0, max) : null;\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n if (this._zero && this.min !== this._suggestedMin && !isNumberFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n this.handleTickRangeOptions();\n }\n handleTickRangeOptions() {\n const { minDefined , maxDefined } = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n const setMin = (v)=>min = minDefined ? min : v;\n const setMax = (v)=>max = maxDefined ? max : v;\n if (min === max) {\n if (min <= 0) {\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n setMax(changeExponent(min, +1));\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const opts = this.options;\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n getLabelForValue(value) {\n return value === undefined ? '0' : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n configure() {\n const start = this.min;\n super.configure();\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min ? 0 : (log10(value) - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [\n label\n ];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - size / 2,\n end: pos + size / 2\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n return {\n start: pos,\n end: pos + size\n };\n}\n function fitWithPointLabels(scale) {\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n for(let i = 0; i < valueCount; i++){\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n scale.setCenterPoint(orig.l - limits.l, limits.r - orig.r, orig.t - limits.t, limits.b - orig.b);\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const { extra , additionalAngle , padding , size } = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n visible: true,\n x: pointLabelPosition.x,\n y,\n textAlign,\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const { left , top , right , bottom } = item;\n const apexesInArea = _isPointInArea({\n x: left,\n y: top\n }, area) || _isPointInArea({\n x: left,\n y: bottom\n }, area) || _isPointInArea({\n x: right,\n y: top\n }, area) || _isPointInArea({\n x: right,\n y: bottom\n }, area);\n return !apexesInArea;\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const { centerPointLabels , display } = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n for(let i = 0; i < valueCount; i++){\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n return 'right';\n}\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= w / 2;\n }\n return x;\n}\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= h / 2;\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\nfunction drawPointLabelBox(ctx, opts, item) {\n const { left , top , right , bottom } = item;\n const { backdropColor } = opts;\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\nfunction drawPointLabels(scale, labelCount) {\n const { ctx , options: { pointLabels } } = scale;\n for(let i = labelCount - 1; i >= 0; i--){\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const { x , y , textAlign } = item;\n renderText(ctx, scale._pointLabels[i], x, y + plFont.lineHeight / 2, plFont, {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n });\n }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const { ctx } = scale;\n if (circular) {\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n for(let i = 1; i < labelCount; i++){\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n const { color , lineWidth } = gridLineOpts;\n if (!circular && !labelCount || !color || !lineWidth || radius < 0) {\n return;\n }\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\nclass RadialLinearScale extends LinearScaleBase {\n static id = 'radialLinear';\n static defaults = {\n display: true,\n animate: true,\n position: 'chartArea',\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n grid: {\n circular: false\n },\n startAngle: 0,\n ticks: {\n showLabelBackdrop: true,\n callback: Ticks.formatters.numeric\n },\n pointLabels: {\n backdropColor: undefined,\n backdropPadding: 2,\n display: true,\n font: {\n size: 10\n },\n callback (label) {\n return label;\n },\n padding: 5,\n centerPointLabels: false\n }\n };\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n constructor(cfg){\n super(cfg);\n this.xCenter = undefined;\n this.yCenter = undefined;\n this.drawingArea = undefined;\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n setDimensions() {\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n determineDataLimits() {\n const { min , max } = this.getMinMax(false);\n this.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n this.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n this._pointLabels = this.getLabels().map((value, index)=>{\n const label = callback(this.options.pointLabels.callback, [\n value,\n index\n ], this);\n return label || label === 0 ? label : '';\n }).filter((v, i)=>this.chart.getDataVisibility(i));\n }\n fit() {\n const opts = this.options;\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n getPointLabelPosition(index) {\n const { left , top , right , bottom } = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom\n };\n }\n drawBackground() {\n const { backgroundColor , grid: { circular } } = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const { angleLines , grid , border } = opts;\n const labelCount = this._pointLabels.length;\n let i, offset, position;\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n if (grid.display) {\n this.ticks.forEach((tick, index)=>{\n if (index !== 0 || index === 0 && this.min < 0) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n if (angleLines.display) {\n ctx.save();\n for(i = labelCount - 1; i >= 0; i--){\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const { color , lineWidth } = optsAtIndex;\n if (!lineWidth || !color) {\n continue;\n }\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n ctx.restore();\n }\n }\n drawBorder() {}\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n if (!tickOpts.display) {\n return;\n }\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n this.ticks.forEach((tick, index)=>{\n if (index === 0 && this.min >= 0 && !opts.reverse) {\n return;\n }\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(-width / 2 - padding.left, -offset - tickFont.size / 2 - padding.top, width + padding.width, tickFont.size + padding.height);\n }\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth\n });\n });\n ctx.restore();\n }\n drawTitle() {}\n}\n\nconst INTERVALS = {\n millisecond: {\n common: true,\n size: 1,\n steps: 1000\n },\n second: {\n common: true,\n size: 1000,\n steps: 60\n },\n minute: {\n common: true,\n size: 60000,\n steps: 60\n },\n hour: {\n common: true,\n size: 3600000,\n steps: 24\n },\n day: {\n common: true,\n size: 86400000,\n steps: 30\n },\n week: {\n common: false,\n size: 604800000,\n steps: 4\n },\n month: {\n common: true,\n size: 2.628e9,\n steps: 12\n },\n quarter: {\n common: false,\n size: 7.884e9,\n steps: 4\n },\n year: {\n common: true,\n size: 3.154e10\n }\n};\n const UNITS = /* #__PURE__ */ Object.keys(INTERVALS);\n function sorter(a, b) {\n return a - b;\n}\n function parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n const adapter = scale._adapter;\n const { parser , round , isoWeekday } = scale._parseOpts;\n let value = input;\n if (typeof parser === 'function') {\n value = parser(value);\n }\n if (!isNumberFinite(value)) {\n value = typeof parser === 'string' ? adapter.parse(value, parser) : adapter.parse(value);\n }\n if (value === null) {\n return null;\n }\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true) ? adapter.startOf(value, 'isoWeek', isoWeekday) : adapter.startOf(value, round);\n }\n return +value;\n}\n function determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n for(let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i){\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n return UNITS[ilen - 1];\n}\n function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for(let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--){\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n function determineMajorUnit(unit) {\n for(let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i){\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n function addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const { lo , hi } = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n function setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n for(major = first; major <= last; major = +adapter.add(major, 1, majorUnit)){\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n function ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n const map = {};\n const ilen = values.length;\n let i, value;\n for(i = 0; i < ilen; ++i){\n value = values[i];\n map[value] = i;\n ticks.push({\n value,\n major: false\n });\n }\n return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n static id = 'time';\n static defaults = {\n bounds: 'data',\n adapters: {},\n time: {\n parser: false,\n unit: false,\n round: false,\n isoWeekday: false,\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n source: 'auto',\n callback: false,\n major: {\n enabled: false\n }\n }\n };\n constructor(props){\n super(props);\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n this._unit = 'day';\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n adapter.init(opts);\n mergeIf(time.displayFormats, adapter.formats());\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n super.init(scaleOpts);\n this._normalized = opts.normalized;\n }\n parse(raw, index) {\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n let { min , max , minDefined , maxDefined } = this.getUserBounds();\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n if (!minDefined || !maxDefined) {\n _applyBounds(this._getLabelBounds());\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {\n min,\n max\n };\n }\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n const min = this.min;\n const max = this.max;\n const ticks = _filterBetween(timestamps, min, max);\n this._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min)) : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n if (options.reverse) {\n ticks.reverse();\n }\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n afterAutoSkip() {\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map((tick)=>+tick.value));\n }\n }\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n this._offsets = {\n start,\n end,\n factor: 1 / (start + 1 + end)\n };\n }\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for(time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++){\n addTick(ticks, time, timestamps);\n }\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n return Object.keys(ticks).sort(sorter).map((x)=>+x);\n }\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n if (formatter) {\n return callback(formatter, [\n time,\n index,\n ticks\n ], this);\n }\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n generateTickLabels(ticks) {\n let i, ilen, tick;\n for(i = 0, ilen = ticks.length; i < ilen; ++i){\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n return {\n w: tickLabelWidth * cosRotation + tickFontSize * sinRotation,\n h: tickLabelWidth * sinRotation + tickFontSize * cosRotation\n };\n }\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [\n exampleTime\n ], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const metas = this.getMatchingVisibleMetas();\n if (this._normalized && metas.length) {\n return this._cache.data = metas[0].controller.getAllParsedValues(this);\n }\n for(i = 0, ilen = metas.length; i < ilen; ++i){\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n return this._cache.data = this.normalize(timestamps);\n }\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const labels = this.getLabels();\n for(i = 0, ilen = labels.length; i < ilen; ++i){\n timestamps.push(parse(this, labels[i]));\n }\n return this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps);\n }\n normalize(values) {\n return _arrayUnique(values.sort(sorter));\n }\n}\n\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({ lo , hi } = _lookupByKey(table, 'pos', val));\n }\n ({ pos: prevSource , time: prevTarget } = table[lo]);\n ({ pos: nextSource , time: nextTarget } = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({ lo , hi } = _lookupByKey(table, 'time', val));\n }\n ({ time: prevSource , pos: prevTarget } = table[lo]);\n ({ time: nextSource , pos: nextTarget } = table[hi]);\n }\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n static id = 'timeseries';\n static defaults = TimeScale.defaults;\n constructor(props){\n super(props);\n this._table = [];\n this._minPos = undefined;\n this._tableRange = undefined;\n }\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n buildLookupTable(timestamps) {\n const { min , max } = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n for(i = 0, ilen = timestamps.length; i < ilen; ++i){\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n if (items.length < 2) {\n return [\n {\n time: min,\n pos: 0\n },\n {\n time: max,\n pos: 1\n }\n ];\n }\n for(i = 0, ilen = items.length; i < ilen; ++i){\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({\n time: curr,\n pos: i / (ilen - 1)\n });\n }\n }\n return table;\n }\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b)=>a - b);\n }\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n if (timestamps.length) {\n return timestamps;\n }\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n return timestamps;\n }\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nconst registerables = [\n controllers,\n elements,\n plugins,\n scales\n];\n\nexport { Animation, Animations, ArcElement, BarController, BarElement, BasePlatform, BasicPlatform, BubbleController, CategoryScale, Chart, plugin_colors as Colors, DatasetController, plugin_decimation as Decimation, DomPlatform, DoughnutController, Element, index as Filler, Interaction, plugin_legend as Legend, LineController, LineElement, LinearScale, LogarithmicScale, PieController, PointElement, PolarAreaController, RadarController, RadialLinearScale, Scale, ScatterController, plugin_subtitle as SubTitle, Ticks, TimeScale, TimeSeriesScale, plugin_title as Title, plugin_tooltip as Tooltip, adapters as _adapters, _detectPlatform, animator, controllers, defaults, elements, layouts, plugins, registerables, registry, scales };\n//# sourceMappingURL=chart.js.map\n","import { Chart as Chart$1, BarController, DoughnutController, LineController, PieController, PolarAreaController, RadarController, BubbleController, ScatterController } from 'chart.js';\nimport { version, isProxy, toRaw, defineComponent, ref, shallowRef, onMounted, onUnmounted, watch, nextTick, h } from 'vue';\n\nconst CommonProps = {\n data: {\n type: Object,\n required: true\n },\n options: {\n type: Object,\n default: ()=>({})\n },\n plugins: {\n type: Array,\n default: ()=>[]\n },\n datasetIdKey: {\n type: String,\n default: \"label\"\n },\n updateMode: {\n type: String,\n default: undefined\n }\n};\nconst A11yProps = {\n ariaLabel: {\n type: String\n },\n ariaDescribedby: {\n type: String\n }\n};\nconst Props = {\n type: {\n type: String,\n required: true\n },\n destroyDelay: {\n type: Number,\n default: 0 // No delay by default\n },\n ...CommonProps,\n ...A11yProps\n};\n\nconst compatProps = version[0] === \"2\" ? (internals, props)=>Object.assign(internals, {\n attrs: props\n }) : (internals, props)=>Object.assign(internals, props);\nfunction toRawIfProxy(obj) {\n return isProxy(obj) ? toRaw(obj) : obj;\n}\nfunction cloneProxy(obj) {\n let src = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : obj;\n return isProxy(src) ? new Proxy(obj, {}) : obj;\n}\nfunction setOptions(chart, nextOptions) {\n const options = chart.options;\n if (options && nextOptions) {\n Object.assign(options, nextOptions);\n }\n}\nfunction setLabels(currentData, nextLabels) {\n currentData.labels = nextLabels;\n}\nfunction setDatasets(currentData, nextDatasets, datasetIdKey) {\n const addedDatasets = [];\n currentData.datasets = nextDatasets.map((nextDataset)=>{\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find((dataset)=>dataset[datasetIdKey] === nextDataset[datasetIdKey]);\n // There is no original to update, so simply add new one\n if (!currentDataset || !nextDataset.data || addedDatasets.includes(currentDataset)) {\n return {\n ...nextDataset\n };\n }\n addedDatasets.push(currentDataset);\n Object.assign(currentDataset, nextDataset);\n return currentDataset;\n });\n}\nfunction cloneData(data, datasetIdKey) {\n const nextData = {\n labels: [],\n datasets: []\n };\n setLabels(nextData, data.labels);\n setDatasets(nextData, data.datasets, datasetIdKey);\n return nextData;\n}\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */ function getDatasetAtEvent(chart, event) {\n return chart.getElementsAtEventForMode(event, \"dataset\", {\n intersect: true\n }, false);\n}\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */ function getElementAtEvent(chart, event) {\n return chart.getElementsAtEventForMode(event, \"nearest\", {\n intersect: true\n }, false);\n}\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */ function getElementsAtEvent(chart, event) {\n return chart.getElementsAtEventForMode(event, \"index\", {\n intersect: true\n }, false);\n}\n\nconst Chart = defineComponent({\n props: Props,\n setup (props, param) {\n let { expose , slots } = param;\n const canvasRef = ref(null);\n const chartRef = shallowRef(null);\n expose({\n chart: chartRef\n });\n const renderChart = ()=>{\n if (!canvasRef.value) return;\n const { type , data , options , plugins , datasetIdKey } = props;\n const clonedData = cloneData(data, datasetIdKey);\n const proxiedData = cloneProxy(clonedData, data);\n chartRef.value = new Chart$1(canvasRef.value, {\n type,\n data: proxiedData,\n options: {\n ...options\n },\n plugins\n });\n };\n const destroyChart = ()=>{\n const chart = toRaw(chartRef.value);\n if (chart) {\n if (props.destroyDelay > 0) {\n setTimeout(()=>{\n chart.destroy();\n chartRef.value = null;\n }, props.destroyDelay);\n } else {\n chart.destroy();\n chartRef.value = null;\n }\n }\n };\n const update = (chart)=>{\n chart.update(props.updateMode);\n };\n onMounted(renderChart);\n onUnmounted(destroyChart);\n watch([\n ()=>props.options,\n ()=>props.data\n ], (param, param1)=>{\n let [nextOptionsProxy, nextDataProxy] = param, [prevOptionsProxy, prevDataProxy] = param1;\n const chart = toRaw(chartRef.value);\n if (!chart) {\n return;\n }\n let shouldUpdate = false;\n if (nextOptionsProxy) {\n const nextOptions = toRawIfProxy(nextOptionsProxy);\n const prevOptions = toRawIfProxy(prevOptionsProxy);\n if (nextOptions && nextOptions !== prevOptions) {\n setOptions(chart, nextOptions);\n shouldUpdate = true;\n }\n }\n if (nextDataProxy) {\n const nextLabels = toRawIfProxy(nextDataProxy.labels);\n const prevLabels = toRawIfProxy(prevDataProxy.labels);\n const nextDatasets = toRawIfProxy(nextDataProxy.datasets);\n const prevDatasets = toRawIfProxy(prevDataProxy.datasets);\n if (nextLabels !== prevLabels) {\n setLabels(chart.config.data, nextLabels);\n shouldUpdate = true;\n }\n if (nextDatasets && nextDatasets !== prevDatasets) {\n setDatasets(chart.config.data, nextDatasets, props.datasetIdKey);\n shouldUpdate = true;\n }\n }\n if (shouldUpdate) {\n nextTick(()=>{\n update(chart);\n });\n }\n }, {\n deep: true\n });\n return ()=>{\n return h(\"canvas\", {\n role: \"img\",\n ariaLabel: props.ariaLabel,\n ariaDescribedby: props.ariaDescribedby,\n ref: canvasRef\n }, [\n h(\"p\", {}, [\n slots.default ? slots.default() : \"\"\n ])\n ]);\n };\n }\n});\n\nfunction createTypedChart(type, registerables) {\n Chart$1.register(registerables);\n return defineComponent({\n props: CommonProps,\n setup (props, param) {\n let { expose } = param;\n const ref = shallowRef(null);\n const reforwardRef = (chartRef)=>{\n ref.value = chartRef?.chart;\n };\n expose({\n chart: ref\n });\n return ()=>{\n return h(Chart, compatProps({\n ref: reforwardRef\n }, {\n type,\n ...props\n }));\n };\n }\n });\n}\nconst Bar = /* #__PURE__ */ createTypedChart(\"bar\", BarController);\nconst Doughnut = /* #__PURE__ */ createTypedChart(\"doughnut\", DoughnutController);\nconst Line = /* #__PURE__ */ createTypedChart(\"line\", LineController);\nconst Pie = /* #__PURE__ */ createTypedChart(\"pie\", PieController);\nconst PolarArea = /* #__PURE__ */ createTypedChart(\"polarArea\", PolarAreaController);\nconst Radar = /* #__PURE__ */ createTypedChart(\"radar\", RadarController);\nconst Bubble = /* #__PURE__ */ createTypedChart(\"bubble\", BubbleController);\nconst Scatter = /* #__PURE__ */ createTypedChart(\"scatter\", ScatterController);\n\nexport { Bar, Bubble, Chart, Doughnut, Line, Pie, PolarArea, Radar, Scatter, createTypedChart, getDatasetAtEvent, getElementAtEvent, getElementsAtEvent };\n//# sourceMappingURL=index.js.map\n","/*!\n * chartjs-plugin-datalabels v2.2.0\n * https://chartjs-plugin-datalabels.netlify.app\n * (c) 2017-2022 chartjs-plugin-datalabels contributors\n * Released under the MIT license\n */\nimport { isNullOrUndef, merge, toFont, resolve, toPadding, valueOrDefault, callback, isObject, each } from 'chart.js/helpers';\nimport { defaults as defaults$1, ArcElement, PointElement, BarElement } from 'chart.js';\n\nvar devicePixelRatio = (function() {\n if (typeof window !== 'undefined') {\n if (window.devicePixelRatio) {\n return window.devicePixelRatio;\n }\n\n // devicePixelRatio is undefined on IE10\n // https://stackoverflow.com/a/20204180/8837887\n // https://github.com/chartjs/chartjs-plugin-datalabels/issues/85\n var screen = window.screen;\n if (screen) {\n return (screen.deviceXDPI || 1) / (screen.logicalXDPI || 1);\n }\n }\n\n return 1;\n}());\n\nvar utils = {\n // @todo move this in Chart.helpers.toTextLines\n toTextLines: function(inputs) {\n var lines = [];\n var input;\n\n inputs = [].concat(inputs);\n while (inputs.length) {\n input = inputs.pop();\n if (typeof input === 'string') {\n lines.unshift.apply(lines, input.split('\\n'));\n } else if (Array.isArray(input)) {\n inputs.push.apply(inputs, input);\n } else if (!isNullOrUndef(inputs)) {\n lines.unshift('' + input);\n }\n }\n\n return lines;\n },\n\n // @todo move this in Chart.helpers.canvas.textSize\n // @todo cache calls of measureText if font doesn't change?!\n textSize: function(ctx, lines, font) {\n var items = [].concat(lines);\n var ilen = items.length;\n var prev = ctx.font;\n var width = 0;\n var i;\n\n ctx.font = font.string;\n\n for (i = 0; i < ilen; ++i) {\n width = Math.max(ctx.measureText(items[i]).width, width);\n }\n\n ctx.font = prev;\n\n return {\n height: ilen * font.lineHeight,\n width: width\n };\n },\n\n /**\n * Returns value bounded by min and max. This is equivalent to max(min, min(value, max)).\n * @todo move this method in Chart.helpers.bound\n * https://doc.qt.io/qt-5/qtglobal.html#qBound\n */\n bound: function(min, value, max) {\n return Math.max(min, Math.min(value, max));\n },\n\n /**\n * Returns an array of pair [value, state] where state is:\n * * -1: value is only in a0 (removed)\n * * 1: value is only in a1 (added)\n */\n arrayDiff: function(a0, a1) {\n var prev = a0.slice();\n var updates = [];\n var i, j, ilen, v;\n\n for (i = 0, ilen = a1.length; i < ilen; ++i) {\n v = a1[i];\n j = prev.indexOf(v);\n\n if (j === -1) {\n updates.push([v, 1]);\n } else {\n prev.splice(j, 1);\n }\n }\n\n for (i = 0, ilen = prev.length; i < ilen; ++i) {\n updates.push([prev[i], -1]);\n }\n\n return updates;\n },\n\n /**\n * https://github.com/chartjs/chartjs-plugin-datalabels/issues/70\n */\n rasterize: function(v) {\n return Math.round(v * devicePixelRatio) / devicePixelRatio;\n }\n};\n\nfunction orient(point, origin) {\n var x0 = origin.x;\n var y0 = origin.y;\n\n if (x0 === null) {\n return {x: 0, y: -1};\n }\n if (y0 === null) {\n return {x: 1, y: 0};\n }\n\n var dx = point.x - x0;\n var dy = point.y - y0;\n var ln = Math.sqrt(dx * dx + dy * dy);\n\n return {\n x: ln ? dx / ln : 0,\n y: ln ? dy / ln : -1\n };\n}\n\nfunction aligned(x, y, vx, vy, align) {\n switch (align) {\n case 'center':\n vx = vy = 0;\n break;\n case 'bottom':\n vx = 0;\n vy = 1;\n break;\n case 'right':\n vx = 1;\n vy = 0;\n break;\n case 'left':\n vx = -1;\n vy = 0;\n break;\n case 'top':\n vx = 0;\n vy = -1;\n break;\n case 'start':\n vx = -vx;\n vy = -vy;\n break;\n case 'end':\n // keep natural orientation\n break;\n default:\n // clockwise rotation (in degree)\n align *= (Math.PI / 180);\n vx = Math.cos(align);\n vy = Math.sin(align);\n break;\n }\n\n return {\n x: x,\n y: y,\n vx: vx,\n vy: vy\n };\n}\n\n// Line clipping (Cohen–Sutherland algorithm)\n// https://en.wikipedia.org/wiki/Cohen–Sutherland_algorithm\n\nvar R_INSIDE = 0;\nvar R_LEFT = 1;\nvar R_RIGHT = 2;\nvar R_BOTTOM = 4;\nvar R_TOP = 8;\n\nfunction region(x, y, rect) {\n var res = R_INSIDE;\n\n if (x < rect.left) {\n res |= R_LEFT;\n } else if (x > rect.right) {\n res |= R_RIGHT;\n }\n if (y < rect.top) {\n res |= R_TOP;\n } else if (y > rect.bottom) {\n res |= R_BOTTOM;\n }\n\n return res;\n}\n\nfunction clipped(segment, area) {\n var x0 = segment.x0;\n var y0 = segment.y0;\n var x1 = segment.x1;\n var y1 = segment.y1;\n var r0 = region(x0, y0, area);\n var r1 = region(x1, y1, area);\n var r, x, y;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (!(r0 | r1) || (r0 & r1)) {\n // both points inside or on the same side: no clipping\n break;\n }\n\n // at least one point is outside\n r = r0 || r1;\n\n if (r & R_TOP) {\n x = x0 + (x1 - x0) * (area.top - y0) / (y1 - y0);\n y = area.top;\n } else if (r & R_BOTTOM) {\n x = x0 + (x1 - x0) * (area.bottom - y0) / (y1 - y0);\n y = area.bottom;\n } else if (r & R_RIGHT) {\n y = y0 + (y1 - y0) * (area.right - x0) / (x1 - x0);\n x = area.right;\n } else if (r & R_LEFT) {\n y = y0 + (y1 - y0) * (area.left - x0) / (x1 - x0);\n x = area.left;\n }\n\n if (r === r0) {\n x0 = x;\n y0 = y;\n r0 = region(x0, y0, area);\n } else {\n x1 = x;\n y1 = y;\n r1 = region(x1, y1, area);\n }\n }\n\n return {\n x0: x0,\n x1: x1,\n y0: y0,\n y1: y1\n };\n}\n\nfunction compute$1(range, config) {\n var anchor = config.anchor;\n var segment = range;\n var x, y;\n\n if (config.clamp) {\n segment = clipped(segment, config.area);\n }\n\n if (anchor === 'start') {\n x = segment.x0;\n y = segment.y0;\n } else if (anchor === 'end') {\n x = segment.x1;\n y = segment.y1;\n } else {\n x = (segment.x0 + segment.x1) / 2;\n y = (segment.y0 + segment.y1) / 2;\n }\n\n return aligned(x, y, range.vx, range.vy, config.align);\n}\n\nvar positioners = {\n arc: function(el, config) {\n var angle = (el.startAngle + el.endAngle) / 2;\n var vx = Math.cos(angle);\n var vy = Math.sin(angle);\n var r0 = el.innerRadius;\n var r1 = el.outerRadius;\n\n return compute$1({\n x0: el.x + vx * r0,\n y0: el.y + vy * r0,\n x1: el.x + vx * r1,\n y1: el.y + vy * r1,\n vx: vx,\n vy: vy\n }, config);\n },\n\n point: function(el, config) {\n var v = orient(el, config.origin);\n var rx = v.x * el.options.radius;\n var ry = v.y * el.options.radius;\n\n return compute$1({\n x0: el.x - rx,\n y0: el.y - ry,\n x1: el.x + rx,\n y1: el.y + ry,\n vx: v.x,\n vy: v.y\n }, config);\n },\n\n bar: function(el, config) {\n var v = orient(el, config.origin);\n var x = el.x;\n var y = el.y;\n var sx = 0;\n var sy = 0;\n\n if (el.horizontal) {\n x = Math.min(el.x, el.base);\n sx = Math.abs(el.base - el.x);\n } else {\n y = Math.min(el.y, el.base);\n sy = Math.abs(el.base - el.y);\n }\n\n return compute$1({\n x0: x,\n y0: y + sy,\n x1: x + sx,\n y1: y,\n vx: v.x,\n vy: v.y\n }, config);\n },\n\n fallback: function(el, config) {\n var v = orient(el, config.origin);\n\n return compute$1({\n x0: el.x,\n y0: el.y,\n x1: el.x + (el.width || 0),\n y1: el.y + (el.height || 0),\n vx: v.x,\n vy: v.y\n }, config);\n }\n};\n\nvar rasterize = utils.rasterize;\n\nfunction boundingRects(model) {\n var borderWidth = model.borderWidth || 0;\n var padding = model.padding;\n var th = model.size.height;\n var tw = model.size.width;\n var tx = -tw / 2;\n var ty = -th / 2;\n\n return {\n frame: {\n x: tx - padding.left - borderWidth,\n y: ty - padding.top - borderWidth,\n w: tw + padding.width + borderWidth * 2,\n h: th + padding.height + borderWidth * 2\n },\n text: {\n x: tx,\n y: ty,\n w: tw,\n h: th\n }\n };\n}\n\nfunction getScaleOrigin(el, context) {\n var scale = context.chart.getDatasetMeta(context.datasetIndex).vScale;\n\n if (!scale) {\n return null;\n }\n\n if (scale.xCenter !== undefined && scale.yCenter !== undefined) {\n return {x: scale.xCenter, y: scale.yCenter};\n }\n\n var pixel = scale.getBasePixel();\n return el.horizontal ?\n {x: pixel, y: null} :\n {x: null, y: pixel};\n}\n\nfunction getPositioner(el) {\n if (el instanceof ArcElement) {\n return positioners.arc;\n }\n if (el instanceof PointElement) {\n return positioners.point;\n }\n if (el instanceof BarElement) {\n return positioners.bar;\n }\n return positioners.fallback;\n}\n\nfunction drawRoundedRect(ctx, x, y, w, h, radius) {\n var HALF_PI = Math.PI / 2;\n\n if (radius) {\n var r = Math.min(radius, h / 2, w / 2);\n var left = x + r;\n var top = y + r;\n var right = x + w - r;\n var bottom = y + h - r;\n\n ctx.moveTo(x, top);\n if (left < right && top < bottom) {\n ctx.arc(left, top, r, -Math.PI, -HALF_PI);\n ctx.arc(right, top, r, -HALF_PI, 0);\n ctx.arc(right, bottom, r, 0, HALF_PI);\n ctx.arc(left, bottom, r, HALF_PI, Math.PI);\n } else if (left < right) {\n ctx.moveTo(left, y);\n ctx.arc(right, top, r, -HALF_PI, HALF_PI);\n ctx.arc(left, top, r, HALF_PI, Math.PI + HALF_PI);\n } else if (top < bottom) {\n ctx.arc(left, top, r, -Math.PI, 0);\n ctx.arc(left, bottom, r, 0, Math.PI);\n } else {\n ctx.arc(left, top, r, -Math.PI, Math.PI);\n }\n ctx.closePath();\n ctx.moveTo(x, y);\n } else {\n ctx.rect(x, y, w, h);\n }\n}\n\nfunction drawFrame(ctx, rect, model) {\n var bgColor = model.backgroundColor;\n var borderColor = model.borderColor;\n var borderWidth = model.borderWidth;\n\n if (!bgColor && (!borderColor || !borderWidth)) {\n return;\n }\n\n ctx.beginPath();\n\n drawRoundedRect(\n ctx,\n rasterize(rect.x) + borderWidth / 2,\n rasterize(rect.y) + borderWidth / 2,\n rasterize(rect.w) - borderWidth,\n rasterize(rect.h) - borderWidth,\n model.borderRadius);\n\n ctx.closePath();\n\n if (bgColor) {\n ctx.fillStyle = bgColor;\n ctx.fill();\n }\n\n if (borderColor && borderWidth) {\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = 'miter';\n ctx.stroke();\n }\n}\n\nfunction textGeometry(rect, align, font) {\n var h = font.lineHeight;\n var w = rect.w;\n var x = rect.x;\n var y = rect.y + h / 2;\n\n if (align === 'center') {\n x += w / 2;\n } else if (align === 'end' || align === 'right') {\n x += w;\n }\n\n return {\n h: h,\n w: w,\n x: x,\n y: y\n };\n}\n\nfunction drawTextLine(ctx, text, cfg) {\n var shadow = ctx.shadowBlur;\n var stroked = cfg.stroked;\n var x = rasterize(cfg.x);\n var y = rasterize(cfg.y);\n var w = rasterize(cfg.w);\n\n if (stroked) {\n ctx.strokeText(text, x, y, w);\n }\n\n if (cfg.filled) {\n if (shadow && stroked) {\n // Prevent drawing shadow on both the text stroke and fill, so\n // if the text is stroked, remove the shadow for the text fill.\n ctx.shadowBlur = 0;\n }\n\n ctx.fillText(text, x, y, w);\n\n if (shadow && stroked) {\n ctx.shadowBlur = shadow;\n }\n }\n}\n\nfunction drawText(ctx, lines, rect, model) {\n var align = model.textAlign;\n var color = model.color;\n var filled = !!color;\n var font = model.font;\n var ilen = lines.length;\n var strokeColor = model.textStrokeColor;\n var strokeWidth = model.textStrokeWidth;\n var stroked = strokeColor && strokeWidth;\n var i;\n\n if (!ilen || (!filled && !stroked)) {\n return;\n }\n\n // Adjust coordinates based on text alignment and line height\n rect = textGeometry(rect, align, font);\n\n ctx.font = font.string;\n ctx.textAlign = align;\n ctx.textBaseline = 'middle';\n ctx.shadowBlur = model.textShadowBlur;\n ctx.shadowColor = model.textShadowColor;\n\n if (filled) {\n ctx.fillStyle = color;\n }\n if (stroked) {\n ctx.lineJoin = 'round';\n ctx.lineWidth = strokeWidth;\n ctx.strokeStyle = strokeColor;\n }\n\n for (i = 0, ilen = lines.length; i < ilen; ++i) {\n drawTextLine(ctx, lines[i], {\n stroked: stroked,\n filled: filled,\n w: rect.w,\n x: rect.x,\n y: rect.y + rect.h * i\n });\n }\n}\n\nvar Label = function(config, ctx, el, index) {\n var me = this;\n\n me._config = config;\n me._index = index;\n me._model = null;\n me._rects = null;\n me._ctx = ctx;\n me._el = el;\n};\n\nmerge(Label.prototype, {\n /**\n * @private\n */\n _modelize: function(display, lines, config, context) {\n var me = this;\n var index = me._index;\n var font = toFont(resolve([config.font, {}], context, index));\n var color = resolve([config.color, defaults$1.color], context, index);\n\n return {\n align: resolve([config.align, 'center'], context, index),\n anchor: resolve([config.anchor, 'center'], context, index),\n area: context.chart.chartArea,\n backgroundColor: resolve([config.backgroundColor, null], context, index),\n borderColor: resolve([config.borderColor, null], context, index),\n borderRadius: resolve([config.borderRadius, 0], context, index),\n borderWidth: resolve([config.borderWidth, 0], context, index),\n clamp: resolve([config.clamp, false], context, index),\n clip: resolve([config.clip, false], context, index),\n color: color,\n display: display,\n font: font,\n lines: lines,\n offset: resolve([config.offset, 4], context, index),\n opacity: resolve([config.opacity, 1], context, index),\n origin: getScaleOrigin(me._el, context),\n padding: toPadding(resolve([config.padding, 4], context, index)),\n positioner: getPositioner(me._el),\n rotation: resolve([config.rotation, 0], context, index) * (Math.PI / 180),\n size: utils.textSize(me._ctx, lines, font),\n textAlign: resolve([config.textAlign, 'start'], context, index),\n textShadowBlur: resolve([config.textShadowBlur, 0], context, index),\n textShadowColor: resolve([config.textShadowColor, color], context, index),\n textStrokeColor: resolve([config.textStrokeColor, color], context, index),\n textStrokeWidth: resolve([config.textStrokeWidth, 0], context, index)\n };\n },\n\n update: function(context) {\n var me = this;\n var model = null;\n var rects = null;\n var index = me._index;\n var config = me._config;\n var value, label, lines;\n\n // We first resolve the display option (separately) to avoid computing\n // other options in case the label is hidden (i.e. display: false).\n var display = resolve([config.display, true], context, index);\n\n if (display) {\n value = context.dataset.data[index];\n label = valueOrDefault(callback(config.formatter, [value, context]), value);\n lines = isNullOrUndef(label) ? [] : utils.toTextLines(label);\n\n if (lines.length) {\n model = me._modelize(display, lines, config, context);\n rects = boundingRects(model);\n }\n }\n\n me._model = model;\n me._rects = rects;\n },\n\n geometry: function() {\n return this._rects ? this._rects.frame : {};\n },\n\n rotation: function() {\n return this._model ? this._model.rotation : 0;\n },\n\n visible: function() {\n return this._model && this._model.opacity;\n },\n\n model: function() {\n return this._model;\n },\n\n draw: function(chart, center) {\n var me = this;\n var ctx = chart.ctx;\n var model = me._model;\n var rects = me._rects;\n var area;\n\n if (!this.visible()) {\n return;\n }\n\n ctx.save();\n\n if (model.clip) {\n area = model.area;\n ctx.beginPath();\n ctx.rect(\n area.left,\n area.top,\n area.right - area.left,\n area.bottom - area.top);\n ctx.clip();\n }\n\n ctx.globalAlpha = utils.bound(0, model.opacity, 1);\n ctx.translate(rasterize(center.x), rasterize(center.y));\n ctx.rotate(model.rotation);\n\n drawFrame(ctx, rects.frame, model);\n drawText(ctx, model.lines, rects.text, model);\n\n ctx.restore();\n }\n});\n\nvar MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; // eslint-disable-line es/no-number-minsafeinteger\nvar MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; // eslint-disable-line es/no-number-maxsafeinteger\n\nfunction rotated(point, center, angle) {\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var cx = center.x;\n var cy = center.y;\n\n return {\n x: cx + cos * (point.x - cx) - sin * (point.y - cy),\n y: cy + sin * (point.x - cx) + cos * (point.y - cy)\n };\n}\n\nfunction projected(points, axis) {\n var min = MAX_INTEGER;\n var max = MIN_INTEGER;\n var origin = axis.origin;\n var i, pt, vx, vy, dp;\n\n for (i = 0; i < points.length; ++i) {\n pt = points[i];\n vx = pt.x - origin.x;\n vy = pt.y - origin.y;\n dp = axis.vx * vx + axis.vy * vy;\n min = Math.min(min, dp);\n max = Math.max(max, dp);\n }\n\n return {\n min: min,\n max: max\n };\n}\n\nfunction toAxis(p0, p1) {\n var vx = p1.x - p0.x;\n var vy = p1.y - p0.y;\n var ln = Math.sqrt(vx * vx + vy * vy);\n\n return {\n vx: (p1.x - p0.x) / ln,\n vy: (p1.y - p0.y) / ln,\n origin: p0,\n ln: ln\n };\n}\n\nvar HitBox = function() {\n this._rotation = 0;\n this._rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n};\n\nmerge(HitBox.prototype, {\n center: function() {\n var r = this._rect;\n return {\n x: r.x + r.w / 2,\n y: r.y + r.h / 2\n };\n },\n\n update: function(center, rect, rotation) {\n this._rotation = rotation;\n this._rect = {\n x: rect.x + center.x,\n y: rect.y + center.y,\n w: rect.w,\n h: rect.h\n };\n },\n\n contains: function(point) {\n var me = this;\n var margin = 1;\n var rect = me._rect;\n\n point = rotated(point, me.center(), -me._rotation);\n\n return !(point.x < rect.x - margin\n || point.y < rect.y - margin\n || point.x > rect.x + rect.w + margin * 2\n || point.y > rect.y + rect.h + margin * 2);\n },\n\n // Separating Axis Theorem\n // https://gamedevelopment.tutsplus.com/tutorials/collision-detection-using-the-separating-axis-theorem--gamedev-169\n intersects: function(other) {\n var r0 = this._points();\n var r1 = other._points();\n var axes = [\n toAxis(r0[0], r0[1]),\n toAxis(r0[0], r0[3])\n ];\n var i, pr0, pr1;\n\n if (this._rotation !== other._rotation) {\n // Only separate with r1 axis if the rotation is different,\n // else it's enough to separate r0 and r1 with r0 axis only!\n axes.push(\n toAxis(r1[0], r1[1]),\n toAxis(r1[0], r1[3])\n );\n }\n\n for (i = 0; i < axes.length; ++i) {\n pr0 = projected(r0, axes[i]);\n pr1 = projected(r1, axes[i]);\n\n if (pr0.max < pr1.min || pr1.max < pr0.min) {\n return false;\n }\n }\n\n return true;\n },\n\n /**\n * @private\n */\n _points: function() {\n var me = this;\n var rect = me._rect;\n var angle = me._rotation;\n var center = me.center();\n\n return [\n rotated({x: rect.x, y: rect.y}, center, angle),\n rotated({x: rect.x + rect.w, y: rect.y}, center, angle),\n rotated({x: rect.x + rect.w, y: rect.y + rect.h}, center, angle),\n rotated({x: rect.x, y: rect.y + rect.h}, center, angle)\n ];\n }\n});\n\nfunction coordinates(el, model, geometry) {\n var point = model.positioner(el, model);\n var vx = point.vx;\n var vy = point.vy;\n\n if (!vx && !vy) {\n // if aligned center, we don't want to offset the center point\n return {x: point.x, y: point.y};\n }\n\n var w = geometry.w;\n var h = geometry.h;\n\n // take in account the label rotation\n var rotation = model.rotation;\n var dx = Math.abs(w / 2 * Math.cos(rotation)) + Math.abs(h / 2 * Math.sin(rotation));\n var dy = Math.abs(w / 2 * Math.sin(rotation)) + Math.abs(h / 2 * Math.cos(rotation));\n\n // scale the unit vector (vx, vy) to get at least dx or dy equal to\n // w or h respectively (else we would calculate the distance to the\n // ellipse inscribed in the bounding rect)\n var vs = 1 / Math.max(Math.abs(vx), Math.abs(vy));\n dx *= vx * vs;\n dy *= vy * vs;\n\n // finally, include the explicit offset\n dx += model.offset * vx;\n dy += model.offset * vy;\n\n return {\n x: point.x + dx,\n y: point.y + dy\n };\n}\n\nfunction collide(labels, collider) {\n var i, j, s0, s1;\n\n // IMPORTANT Iterate in the reverse order since items at the end of the\n // list have an higher weight/priority and thus should be less impacted\n // by the overlapping strategy.\n\n for (i = labels.length - 1; i >= 0; --i) {\n s0 = labels[i].$layout;\n\n for (j = i - 1; j >= 0 && s0._visible; --j) {\n s1 = labels[j].$layout;\n\n if (s1._visible && s0._box.intersects(s1._box)) {\n collider(s0, s1);\n }\n }\n }\n\n return labels;\n}\n\nfunction compute(labels) {\n var i, ilen, label, state, geometry, center, proxy;\n\n // Initialize labels for overlap detection\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n state = label.$layout;\n\n if (state._visible) {\n // Chart.js 3 removed el._model in favor of getProps(), making harder to\n // abstract reading values in positioners. Also, using string arrays to\n // read values (i.e. var {a,b,c} = el.getProps([\"a\",\"b\",\"c\"])) would make\n // positioners inefficient in the normal case (i.e. not the final values)\n // and the code a bit ugly, so let's use a Proxy instead.\n proxy = new Proxy(label._el, {get: (el, p) => el.getProps([p], true)[p]});\n\n geometry = label.geometry();\n center = coordinates(proxy, label.model(), geometry);\n state._box.update(center, geometry, label.rotation());\n }\n }\n\n // Auto hide overlapping labels\n return collide(labels, function(s0, s1) {\n var h0 = s0._hidable;\n var h1 = s1._hidable;\n\n if ((h0 && h1) || h1) {\n s1._visible = false;\n } else if (h0) {\n s0._visible = false;\n }\n });\n}\n\nvar layout = {\n prepare: function(datasets) {\n var labels = [];\n var i, j, ilen, jlen, label;\n\n for (i = 0, ilen = datasets.length; i < ilen; ++i) {\n for (j = 0, jlen = datasets[i].length; j < jlen; ++j) {\n label = datasets[i][j];\n labels.push(label);\n label.$layout = {\n _box: new HitBox(),\n _hidable: false,\n _visible: true,\n _set: i,\n _idx: label._index\n };\n }\n }\n\n // TODO New `z` option: labels with a higher z-index are drawn\n // of top of the ones with a lower index. Lowest z-index labels\n // are also discarded first when hiding overlapping labels.\n labels.sort(function(a, b) {\n var sa = a.$layout;\n var sb = b.$layout;\n\n return sa._idx === sb._idx\n ? sb._set - sa._set\n : sb._idx - sa._idx;\n });\n\n this.update(labels);\n\n return labels;\n },\n\n update: function(labels) {\n var dirty = false;\n var i, ilen, label, model, state;\n\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n model = label.model();\n state = label.$layout;\n state._hidable = model && model.display === 'auto';\n state._visible = label.visible();\n dirty |= state._hidable;\n }\n\n if (dirty) {\n compute(labels);\n }\n },\n\n lookup: function(labels, point) {\n var i, state;\n\n // IMPORTANT Iterate in the reverse order since items at the end of\n // the list have an higher z-index, thus should be picked first.\n\n for (i = labels.length - 1; i >= 0; --i) {\n state = labels[i].$layout;\n\n if (state && state._visible && state._box.contains(point)) {\n return labels[i];\n }\n }\n\n return null;\n },\n\n draw: function(chart, labels) {\n var i, ilen, label, state, geometry, center;\n\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n state = label.$layout;\n\n if (state._visible) {\n geometry = label.geometry();\n center = coordinates(label._el, label.model(), geometry);\n state._box.update(center, geometry, label.rotation());\n label.draw(chart, center);\n }\n }\n }\n};\n\nvar formatter = function(value) {\n if (isNullOrUndef(value)) {\n return null;\n }\n\n var label = value;\n var keys, klen, k;\n if (isObject(value)) {\n if (!isNullOrUndef(value.label)) {\n label = value.label;\n } else if (!isNullOrUndef(value.r)) {\n label = value.r;\n } else {\n label = '';\n keys = Object.keys(value);\n for (k = 0, klen = keys.length; k < klen; ++k) {\n label += (k !== 0 ? ', ' : '') + keys[k] + ': ' + value[keys[k]];\n }\n }\n }\n\n return '' + label;\n};\n\n/**\n * IMPORTANT: make sure to also update tests and TypeScript definition\n * files (`/test/specs/defaults.spec.js` and `/types/options.d.ts`)\n */\n\nvar defaults = {\n align: 'center',\n anchor: 'center',\n backgroundColor: null,\n borderColor: null,\n borderRadius: 0,\n borderWidth: 0,\n clamp: false,\n clip: false,\n color: undefined,\n display: true,\n font: {\n family: undefined,\n lineHeight: 1.2,\n size: undefined,\n style: undefined,\n weight: null\n },\n formatter: formatter,\n labels: undefined,\n listeners: {},\n offset: 4,\n opacity: 1,\n padding: {\n top: 4,\n right: 4,\n bottom: 4,\n left: 4\n },\n rotation: 0,\n textAlign: 'start',\n textStrokeColor: undefined,\n textStrokeWidth: 0,\n textShadowBlur: 0,\n textShadowColor: undefined\n};\n\n/**\n * @see https://github.com/chartjs/Chart.js/issues/4176\n */\n\nvar EXPANDO_KEY = '$datalabels';\nvar DEFAULT_KEY = '$default';\n\nfunction configure(dataset, options) {\n var override = dataset.datalabels;\n var listeners = {};\n var configs = [];\n var labels, keys;\n\n if (override === false) {\n return null;\n }\n if (override === true) {\n override = {};\n }\n\n options = merge({}, [options, override]);\n labels = options.labels || {};\n keys = Object.keys(labels);\n delete options.labels;\n\n if (keys.length) {\n keys.forEach(function(key) {\n if (labels[key]) {\n configs.push(merge({}, [\n options,\n labels[key],\n {_key: key}\n ]));\n }\n });\n } else {\n // Default label if no \"named\" label defined.\n configs.push(options);\n }\n\n // listeners: {: {: }}\n listeners = configs.reduce(function(target, config) {\n each(config.listeners || {}, function(fn, event) {\n target[event] = target[event] || {};\n target[event][config._key || DEFAULT_KEY] = fn;\n });\n\n delete config.listeners;\n return target;\n }, {});\n\n return {\n labels: configs,\n listeners: listeners\n };\n}\n\nfunction dispatchEvent(chart, listeners, label, event) {\n if (!listeners) {\n return;\n }\n\n var context = label.$context;\n var groups = label.$groups;\n var callback$1;\n\n if (!listeners[groups._set]) {\n return;\n }\n\n callback$1 = listeners[groups._set][groups._key];\n if (!callback$1) {\n return;\n }\n\n if (callback(callback$1, [context, event]) === true) {\n // Users are allowed to tweak the given context by injecting values that can be\n // used in scriptable options to display labels differently based on the current\n // event (e.g. highlight an hovered label). That's why we update the label with\n // the output context and schedule a new chart render by setting it dirty.\n chart[EXPANDO_KEY]._dirty = true;\n label.update(context);\n }\n}\n\nfunction dispatchMoveEvents(chart, listeners, previous, label, event) {\n var enter, leave;\n\n if (!previous && !label) {\n return;\n }\n\n if (!previous) {\n enter = true;\n } else if (!label) {\n leave = true;\n } else if (previous !== label) {\n leave = enter = true;\n }\n\n if (leave) {\n dispatchEvent(chart, listeners.leave, previous, event);\n }\n if (enter) {\n dispatchEvent(chart, listeners.enter, label, event);\n }\n}\n\nfunction handleMoveEvents(chart, event) {\n var expando = chart[EXPANDO_KEY];\n var listeners = expando._listeners;\n var previous, label;\n\n if (!listeners.enter && !listeners.leave) {\n return;\n }\n\n if (event.type === 'mousemove') {\n label = layout.lookup(expando._labels, event);\n } else if (event.type !== 'mouseout') {\n return;\n }\n\n previous = expando._hovered;\n expando._hovered = label;\n dispatchMoveEvents(chart, listeners, previous, label, event);\n}\n\nfunction handleClickEvents(chart, event) {\n var expando = chart[EXPANDO_KEY];\n var handlers = expando._listeners.click;\n var label = handlers && layout.lookup(expando._labels, event);\n if (label) {\n dispatchEvent(chart, handlers, label, event);\n }\n}\n\nvar plugin = {\n id: 'datalabels',\n\n defaults: defaults,\n\n beforeInit: function(chart) {\n chart[EXPANDO_KEY] = {\n _actives: []\n };\n },\n\n beforeUpdate: function(chart) {\n var expando = chart[EXPANDO_KEY];\n expando._listened = false;\n expando._listeners = {}; // {: {: {: }}}\n expando._datasets = []; // per dataset labels: [Label[]]\n expando._labels = []; // layouted labels: Label[]\n },\n\n afterDatasetUpdate: function(chart, args, options) {\n var datasetIndex = args.index;\n var expando = chart[EXPANDO_KEY];\n var labels = expando._datasets[datasetIndex] = [];\n var visible = chart.isDatasetVisible(datasetIndex);\n var dataset = chart.data.datasets[datasetIndex];\n var config = configure(dataset, options);\n var elements = args.meta.data || [];\n var ctx = chart.ctx;\n var i, j, ilen, jlen, cfg, key, el, label;\n\n ctx.save();\n\n for (i = 0, ilen = elements.length; i < ilen; ++i) {\n el = elements[i];\n el[EXPANDO_KEY] = [];\n\n if (visible && el && chart.getDataVisibility(i) && !el.skip) {\n for (j = 0, jlen = config.labels.length; j < jlen; ++j) {\n cfg = config.labels[j];\n key = cfg._key;\n\n label = new Label(cfg, ctx, el, i);\n label.$groups = {\n _set: datasetIndex,\n _key: key || DEFAULT_KEY\n };\n label.$context = {\n active: false,\n chart: chart,\n dataIndex: i,\n dataset: dataset,\n datasetIndex: datasetIndex\n };\n\n label.update(label.$context);\n el[EXPANDO_KEY].push(label);\n labels.push(label);\n }\n }\n }\n\n ctx.restore();\n\n // Store listeners at the chart level and per event type to optimize\n // cases where no listeners are registered for a specific event.\n merge(expando._listeners, config.listeners, {\n merger: function(event, target, source) {\n target[event] = target[event] || {};\n target[event][args.index] = source[event];\n expando._listened = true;\n }\n });\n },\n\n afterUpdate: function(chart) {\n chart[EXPANDO_KEY]._labels = layout.prepare(chart[EXPANDO_KEY]._datasets);\n },\n\n // Draw labels on top of all dataset elements\n // https://github.com/chartjs/chartjs-plugin-datalabels/issues/29\n // https://github.com/chartjs/chartjs-plugin-datalabels/issues/32\n afterDatasetsDraw: function(chart) {\n layout.draw(chart, chart[EXPANDO_KEY]._labels);\n },\n\n beforeEvent: function(chart, args) {\n // If there is no listener registered for this chart, `listened` will be false,\n // meaning we can immediately ignore the incoming event and avoid useless extra\n // computation for users who don't implement label interactions.\n if (chart[EXPANDO_KEY]._listened) {\n var event = args.event;\n switch (event.type) {\n case 'mousemove':\n case 'mouseout':\n handleMoveEvents(chart, event);\n break;\n case 'click':\n handleClickEvents(chart, event);\n break;\n }\n }\n },\n\n afterEvent: function(chart) {\n var expando = chart[EXPANDO_KEY];\n var previous = expando._actives;\n var actives = expando._actives = chart.getActiveElements();\n var updates = utils.arrayDiff(previous, actives);\n var i, ilen, j, jlen, update, label, labels;\n\n for (i = 0, ilen = updates.length; i < ilen; ++i) {\n update = updates[i];\n if (update[1]) {\n labels = update[0].element[EXPANDO_KEY] || [];\n for (j = 0, jlen = labels.length; j < jlen; ++j) {\n label = labels[j];\n label.$context.active = (update[1] === 1);\n label.update(label.$context);\n }\n }\n }\n\n if (expando._dirty || updates.length) {\n layout.update(expando._labels);\n chart.render();\n }\n\n delete expando._dirty;\n }\n};\n\nexport { plugin as default };\n","\n\n\n","export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function descending(a, b) {\n return a == null || b == null ? NaN\n : b < a ? -1\n : b > a ? 1\n : b >= a ? 0\n : NaN;\n}\n","import ascending from \"./ascending.js\";\nimport descending from \"./descending.js\";\n\nexport default function bisector(f) {\n let compare1, compare2, delta;\n\n // If an accessor is specified, promote it to a comparator. In this case we\n // can test whether the search value is (self-) comparable. We can’t do this\n // for a comparator (except for specific, known comparators) because we can’t\n // tell if the comparator is symmetric, and an asymmetric comparator can’t be\n // used to test whether a single value is comparable.\n if (f.length !== 2) {\n compare1 = ascending;\n compare2 = (d, x) => ascending(f(d), x);\n delta = (d, x) => f(d) - x;\n } else {\n compare1 = f === ascending || f === descending ? f : zero;\n compare2 = f;\n delta = f;\n }\n\n function left(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function right(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) <= 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function center(a, x, lo = 0, hi = a.length) {\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction zero() {\n return 0;\n}\n","export default function number(x) {\n return x === null ? NaN : +x;\n}\n\nexport function* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n","import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\n\nconst ascendingBisect = bisector(ascending);\nexport const bisectRight = ascendingBisect.right;\nexport const bisectLeft = ascendingBisect.left;\nexport const bisectCenter = bisector(number).center;\nexport default bisectRight;\n","export default function extent(values, valueof) {\n let min;\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n return [min, max];\n}\n","export class InternMap extends Map {\n constructor(entries, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (entries != null) for (const [key, value] of entries) this.set(key, value);\n }\n get(key) {\n return super.get(intern_get(this, key));\n }\n has(key) {\n return super.has(intern_get(this, key));\n }\n set(key, value) {\n return super.set(intern_set(this, key), value);\n }\n delete(key) {\n return super.delete(intern_delete(this, key));\n }\n}\n\nexport class InternSet extends Set {\n constructor(values, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (values != null) for (const value of values) this.add(value);\n }\n has(value) {\n return super.has(intern_get(this, value));\n }\n add(value) {\n return super.add(intern_set(this, value));\n }\n delete(value) {\n return super.delete(intern_delete(this, value));\n }\n}\n\nfunction intern_get({_intern, _key}, value) {\n const key = _key(value);\n return _intern.has(key) ? _intern.get(key) : value;\n}\n\nfunction intern_set({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) return _intern.get(key);\n _intern.set(key, value);\n return value;\n}\n\nfunction intern_delete({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) {\n value = _intern.get(key);\n _intern.delete(key);\n }\n return value;\n}\n\nfunction keyof(value) {\n return value !== null && typeof value === \"object\" ? value.valueOf() : value;\n}\n","export default function identity(x) {\n return x;\n}\n","import {InternMap} from \"internmap\";\nimport identity from \"./identity.js\";\n\nexport default function group(values, ...keys) {\n return nest(values, identity, identity, keys);\n}\n\nexport function groups(values, ...keys) {\n return nest(values, Array.from, identity, keys);\n}\n\nfunction flatten(groups, keys) {\n for (let i = 1, n = keys.length; i < n; ++i) {\n groups = groups.flatMap(g => g.pop().map(([key, value]) => [...g, key, value]));\n }\n return groups;\n}\n\nexport function flatGroup(values, ...keys) {\n return flatten(groups(values, ...keys), keys);\n}\n\nexport function flatRollup(values, reduce, ...keys) {\n return flatten(rollups(values, reduce, ...keys), keys);\n}\n\nexport function rollup(values, reduce, ...keys) {\n return nest(values, identity, reduce, keys);\n}\n\nexport function rollups(values, reduce, ...keys) {\n return nest(values, Array.from, reduce, keys);\n}\n\nexport function index(values, ...keys) {\n return nest(values, identity, unique, keys);\n}\n\nexport function indexes(values, ...keys) {\n return nest(values, Array.from, unique, keys);\n}\n\nfunction unique(values) {\n if (values.length !== 1) throw new Error(\"duplicate key\");\n return values[0];\n}\n\nfunction nest(values, map, reduce, keys) {\n return (function regroup(values, i) {\n if (i >= keys.length) return reduce(values);\n const groups = new InternMap();\n const keyof = keys[i++];\n let index = -1;\n for (const value of values) {\n const key = keyof(value, ++index, values);\n const group = groups.get(key);\n if (group) group.push(value);\n else groups.set(key, [value]);\n }\n for (const [key, values] of groups) {\n groups.set(key, regroup(values, i));\n }\n return map(groups);\n })(values, 0);\n}\n","const e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nfunction tickSpec(start, stop, count) {\n const step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log10(step)),\n error = step / Math.pow(10, power),\n factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;\n let i1, i2, inc;\n if (power < 0) {\n inc = Math.pow(10, -power) / factor;\n i1 = Math.round(start * inc);\n i2 = Math.round(stop * inc);\n if (i1 / inc < start) ++i1;\n if (i2 / inc > stop) --i2;\n inc = -inc;\n } else {\n inc = Math.pow(10, power) * factor;\n i1 = Math.round(start / inc);\n i2 = Math.round(stop / inc);\n if (i1 * inc < start) ++i1;\n if (i2 * inc > stop) --i2;\n }\n if (i2 < i1 && 0.5 <= count && count < 2) return tickSpec(start, stop, count * 2);\n return [i1, i2, inc];\n}\n\nexport default function ticks(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n if (!(count > 0)) return [];\n if (start === stop) return [start];\n const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);\n if (!(i2 >= i1)) return [];\n const n = i2 - i1 + 1, ticks = new Array(n);\n if (reverse) {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) * inc;\n } else {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) * inc;\n }\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n return tickSpec(start, stop, count)[2];\n}\n\nexport function tickStep(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);\n return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n}\n","export default function range(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n","export default function sum(values, valueof) {\n let sum = 0;\n if (valueof === undefined) {\n for (let value of values) {\n if (value = +value) {\n sum += value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if (value = +valueof(value, ++index, values)) {\n sum += value;\n }\n }\n }\n return sum;\n}\n","var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n","import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don’t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n","import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn’t worried about “live” collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don’t; we’d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n return Array.from(this);\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n","import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n","import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n","import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","export default function(event) {\n let sourceEvent;\n while (sourceEvent = event.sourceEvent) event = sourceEvent;\n return event;\n}\n","import sourceEvent from \"./sourceEvent.js\";\n\nexport default function(event, node) {\n event = sourceEvent(event);\n if (node === undefined) node = event.currentTarget;\n if (node) {\n var svg = node.ownerSVGElement || node;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n if (node.getBoundingClientRect) {\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n }\n }\n return [event.pageX, event.pageY];\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export default x => () => x;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","export default function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n","import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n","import value from \"./value.js\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return Math.round(a * (1 - t) + b * t);\n };\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n","import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n","import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n","import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n","import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n","import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n","import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n","import {set} from \"./schedule.js\";\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== \"function\") throw new Error;\n set(this, id).ease = v;\n };\n}\n\nexport default function(value) {\n if (typeof value !== \"function\") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n","import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n","import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n","import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n","function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n","import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n","import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n","import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n","import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n","function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n","import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n","function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n","import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n","import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n","import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_easeVarying from \"./easeVarying.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n selectChild: selection_prototype.selectChild,\n selectChildren: selection_prototype.selectChildren,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n","export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n","import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n","import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n","const pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction append(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n let d = Math.floor(digits);\n if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n if (d > 15) return append;\n const k = 10 ** d;\n return function(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n}\n\nexport class Path {\n constructor(digits) {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n this._append = digits == null ? append : appendRound(digits);\n }\n moveTo(x, y) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n }\n closePath() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._append`Z`;\n }\n }\n lineTo(x, y) {\n this._append`L${this._x1 = +x},${this._y1 = +y}`;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this._append`Q${+x1},${+y1},${this._x1 = +x},${this._y1 = +y}`;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this._append`C${+x1},${+y1},${+x2},${+y2},${this._x1 = +x},${this._y1 = +y}`;\n }\n arcTo(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._append`M${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._append`L${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Otherwise, draw an arc!\n else {\n let x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._append`L${x1 + t01 * x01},${y1 + t01 * y01}`;\n }\n\n this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x1 + t21 * x21},${this._y1 = y1 + t21 * y21}`;\n }\n }\n arc(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._append`M${x0},${y0}`;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._append`L${x0},${y0}`;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._append`A${r},${r},0,1,${cw},${x - dx},${y - dy}A${r},${r},0,1,${cw},${this._x1 = x0},${this._y1 = y0}`;\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._append`A${r},${r},0,${+(da >= pi)},${cw},${this._x1 = x + r * Math.cos(a1)},${this._y1 = y + r * Math.sin(a1)}`;\n }\n }\n rect(x, y, w, h) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${w = +w}v${+h}h${-w}Z`;\n }\n toString() {\n return this._;\n }\n}\n\nexport function path() {\n return new Path;\n}\n\n// Allow instanceof d3.path\npath.prototype = Path.prototype;\n\nexport function pathRound(digits = 3) {\n return new Path(+digits);\n}\n","export default function(x) {\n return Math.abs(x = Math.round(x)) >= 1e21\n ? x.toLocaleString(\"en\").replace(/,/g, \"\")\n : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nexport function formatDecimalParts(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatDecimal from \"./formatDecimal.js\";\nimport formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n \"%\": (x, p) => (x * 100).toFixed(p),\n \"b\": (x) => Math.round(x).toString(2),\n \"c\": (x) => x + \"\",\n \"d\": formatDecimal,\n \"e\": (x, p) => x.toExponential(p),\n \"f\": (x, p) => x.toFixed(p),\n \"g\": (x, p) => x.toPrecision(p),\n \"o\": (x) => Math.round(x).toString(8),\n \"p\": (x, p) => formatRounded(x * 100, p),\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": (x) => Math.round(x).toString(16).toUpperCase(),\n \"x\": (x) => Math.round(x).toString(16)\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n minus = locale.minus === undefined ? \"−\" : locale.minus + \"\",\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","export function initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: {\n if (typeof domain === \"function\") this.interpolator(domain);\n else this.range(domain);\n break;\n }\n default: {\n this.domain(domain);\n if (typeof interpolator === \"function\") this.interpolator(interpolator);\n else this.range(interpolator);\n break;\n }\n }\n return this;\n}\n","import {InternMap} from \"d3-array\";\nimport {initRange} from \"./init.js\";\n\nexport const implicit = Symbol(\"implicit\");\n\nexport default function ordinal() {\n var index = new InternMap(),\n domain = [],\n range = [],\n unknown = implicit;\n\n function scale(d) {\n let i = index.get(d);\n if (i === undefined) {\n if (unknown !== implicit) return unknown;\n index.set(d, i = domain.push(d) - 1);\n }\n return range[i % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = new InternMap();\n for (const value of _) {\n if (index.has(value)) continue;\n index.set(value, domain.push(value) - 1);\n }\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal(domain, range).unknown(unknown);\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n","import {range as sequence} from \"d3-array\";\nimport {initRange} from \"./init.js\";\nimport ordinal from \"./ordinal.js\";\n\nexport default function band() {\n var scale = ordinal().unknown(undefined),\n domain = scale.domain,\n ordinalRange = scale.range,\n r0 = 0,\n r1 = 1,\n step,\n bandwidth,\n round = false,\n paddingInner = 0,\n paddingOuter = 0,\n align = 0.5;\n\n delete scale.unknown;\n\n function rescale() {\n var n = domain().length,\n reverse = r1 < r0,\n start = reverse ? r1 : r0,\n stop = reverse ? r0 : r1;\n step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n if (round) step = Math.floor(step);\n start += (stop - start - step * (n - paddingInner)) * align;\n bandwidth = step * (1 - paddingInner);\n if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n var values = sequence(n).map(function(i) { return start + step * i; });\n return ordinalRange(reverse ? values.reverse() : values);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.range = function(_) {\n return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1];\n };\n\n scale.rangeRound = function(_) {\n return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale();\n };\n\n scale.bandwidth = function() {\n return bandwidth;\n };\n\n scale.step = function() {\n return step;\n };\n\n scale.round = function(_) {\n return arguments.length ? (round = !!_, rescale()) : round;\n };\n\n scale.padding = function(_) {\n return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;\n };\n\n scale.paddingInner = function(_) {\n return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;\n };\n\n scale.paddingOuter = function(_) {\n return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;\n };\n\n scale.align = function(_) {\n return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n };\n\n scale.copy = function() {\n return band(domain(), [r0, r1])\n .round(round)\n .paddingInner(paddingInner)\n .paddingOuter(paddingOuter)\n .align(align);\n };\n\n return initRange.apply(rescale(), arguments);\n}\n\nfunction pointish(scale) {\n var copy = scale.copy;\n\n scale.padding = scale.paddingOuter;\n delete scale.paddingInner;\n delete scale.paddingOuter;\n\n scale.copy = function() {\n return pointish(copy());\n };\n\n return scale;\n}\n\nexport function point() {\n return pointish(band.apply(null, arguments).paddingInner(1));\n}\n","export default function constants(x) {\n return function() {\n return x;\n };\n}\n","export default function number(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport constant from \"./constant.js\";\nimport number from \"./number.js\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n return x;\n}\n\nfunction normalize(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(a, b) {\n var t;\n if (a > b) t = a, a = b, b = t;\n return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport function transformer() {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n transform,\n untransform,\n unknown,\n clamp = identity,\n piecewise,\n output,\n input;\n\n function rescale() {\n var n = Math.min(domain.length, range.length);\n if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n piecewise = n > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n\n scale.invert = function(y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = Array.from(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\n\nexport default function continuous() {\n return transformer()(identity, identity);\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function tickFormat(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\nimport tickFormat from \"./tickFormat.js\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain();\n var i0 = 0;\n var i1 = d.length - 1;\n var start = d[i0];\n var stop = d[i1];\n var prestep;\n var step;\n var maxIter = 10;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n \n while (maxIter-- > 0) {\n step = tickIncrement(start, stop, count);\n if (step === prestep) {\n d[i0] = start\n d[i1] = stop\n return domain(d);\n } else if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n } else {\n break;\n }\n prestep = step;\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous();\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n initRange.apply(scale, arguments);\n\n return linearish(scale);\n}\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export const abs = Math.abs;\nexport const atan2 = Math.atan2;\nexport const cos = Math.cos;\nexport const max = Math.max;\nexport const min = Math.min;\nexport const sin = Math.sin;\nexport const sqrt = Math.sqrt;\n\nexport const epsilon = 1e-12;\nexport const pi = Math.PI;\nexport const halfPi = pi / 2;\nexport const tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","import {Path} from \"d3-path\";\n\nexport function withPath(shape) {\n let digits = 3;\n\n shape.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) {\n digits = null;\n } else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n return shape;\n };\n\n return () => new Path(digits);\n}\n","import constant from \"./constant.js\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math.js\";\nimport {withPath} from \"./path.js\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null,\n path = withPath(arc);\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle. If this\n // intersection fails, it’s probably because the arc is too small, so\n // disable the corner radius entirely.\n if (da < pi) {\n if (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10)) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n } else {\n rc0 = rc1 = 0;\n }\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","export var slice = Array.prototype.slice;\n\nexport default function(x) {\n return typeof x === \"object\" && \"length\" in x\n ? x // Array, TypedArray, NodeList, array-like\n : Array.from(x); // Map, Set, iterable, string, or anything else\n}\n","export default function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n","export default function(d) {\n return d;\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport descending from \"./descending.js\";\nimport identity from \"./identity.js\";\nimport {tau} from \"./math.js\";\n\nexport default function() {\n var value = identity,\n sortValues = descending,\n sort = null,\n startAngle = constant(0),\n endAngle = constant(tau),\n padAngle = constant(0);\n\n function pie(data) {\n var i,\n n = (data = array(data)).length,\n j,\n k,\n sum = 0,\n index = new Array(n),\n arcs = new Array(n),\n a0 = +startAngle.apply(this, arguments),\n da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)),\n a1,\n p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\n pa = p * (da < 0 ? -1 : 1),\n v;\n\n for (i = 0; i < n; ++i) {\n if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\n sum += v;\n }\n }\n\n // Optionally sort the arcs by previously-computed values or by data.\n if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });\n else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });\n\n // Compute the arcs! They are stored in the original data's order.\n for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\n j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\n data: data[j],\n index: i,\n value: v,\n startAngle: a0,\n endAngle: a1,\n padAngle: p\n };\n }\n\n return arcs;\n }\n\n pie.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), pie) : value;\n };\n\n pie.sortValues = function(_) {\n return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\n };\n\n pie.sort = function(_) {\n return arguments.length ? (sort = _, sortValues = null, pie) : sort;\n };\n\n pie.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : startAngle;\n };\n\n pie.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : endAngle;\n };\n\n pie.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : padAngle;\n };\n\n return pie;\n}\n","export default function(series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n s0 = s1, s1 = series[order[i]];\n for (j = 0; j < m; ++j) {\n s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n }\n }\n}\n","export default function(series) {\n var n = series.length, o = new Array(n);\n while (--n >= 0) o[n] = n;\n return o;\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport offsetNone from \"./offset/none.js\";\nimport orderNone from \"./order/none.js\";\n\nfunction stackValue(d, key) {\n return d[key];\n}\n\nfunction stackSeries(key) {\n const series = [];\n series.key = key;\n return series;\n}\n\nexport default function() {\n var keys = constant([]),\n order = orderNone,\n offset = offsetNone,\n value = stackValue;\n\n function stack(data) {\n var sz = Array.from(keys.apply(this, arguments), stackSeries),\n i, n = sz.length, j = -1,\n oz;\n\n for (const d of data) {\n for (i = 0, ++j; i < n; ++i) {\n (sz[i][j] = [0, +value(d, sz[i].key, j, data)]).data = d;\n }\n }\n\n for (i = 0, oz = array(order(sz)); i < n; ++i) {\n sz[oz[i]].index = i;\n }\n\n offset(sz, oz);\n return sz;\n }\n\n stack.keys = function(_) {\n return arguments.length ? (keys = typeof _ === \"function\" ? _ : constant(Array.from(_)), stack) : keys;\n };\n\n stack.value = function(_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), stack) : value;\n };\n\n stack.order = function(_) {\n return arguments.length ? (order = _ == null ? orderNone : typeof _ === \"function\" ? _ : constant(Array.from(_)), stack) : order;\n };\n\n stack.offset = function(_) {\n return arguments.length ? (offset = _ == null ? offsetNone : _, stack) : offset;\n };\n\n return stack;\n}\n","export default function(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {\n for (yp = yn = 0, i = 0; i < n; ++i) {\n if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) {\n d[0] = yp, d[1] = yp += dy;\n } else if (dy < 0) {\n d[1] = yn, d[0] = yn += dy;\n } else {\n d[0] = 0, d[1] = dy;\n }\n }\n }\n}\n","export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n while (!node.__zoom) if (!(node = node.parentNode)) return identity;\n return node.__zoom;\n}\n","import * as d3 from \"d3\"\nimport { roundNumber} from \"@/utils/math\"\nimport type { ChartData, ChartOptions } from '@/models/chartModels'\n\nimport { useProjectStore } from \"@/stores/main\"\n\n/**\n * For use with aggregate charts, places the total value in the center of the chart\n * @param graph \n * @param total \n * @param w \n * @param h \n * @param unit \n * @returns \n */\nexport function aggregateCenter(graph: d3.Selection, total: number , w: number, h: number, unit: string) {\n const textElement = graph.append(\"text\")\n .attr(\"class\", \"center-text\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dy\", \"0.35em\")\n .attr(\"x\", w / 2)\n .attr(\"y\", h / 2)\n .style(\"font-weight\", \"bold\")\n \n textElement.append(\"tspan\")\n .text(roundNumber(total, 1))\n .classed(\"text-md\", true)\n .attr(\"x\", w / 2)\n .attr(\"dy\", \"-0.2em\")\n textElement.append(\"tspan\")\n .text(unit)\n .classed(\"text-xs\", true)\n .attr(\"x\", w / 2)\n .attr(\"dy\", \"1.2em\")\n return textElement\n}\n\n/**\n * Add centertext of percentage that is within span.\n * @param graph \n * @param span Span to check within like [50, 100]\n * @param value This is the value we check is within span, like DL results\n * @param graphValue This is the actual value that we calculate percentage from like m2\n * @param w Width\n * @param h Height\n */\nexport function spanPercentCenter(graph: d3.Selection, span: number[], value: number[], graphValue: number[], w: number, h: number) {\n span.sort((a, b) => a - b)\n const result = checkValuesInSpan(value, span[0], span[1])\n const spanPercent = calculatePercent(result, graphValue)\n const textElement = graph.append(\"text\")\n .attr(\"class\", \"center-text\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dy\", \"0.35em\")\n .attr(\"x\", w / 2)\n .attr(\"y\", h / 2)\n .style(\"font-weight\", \"bold\")\n \n textElement.append(\"tspan\")\n .text(`${span[0]} - ${span[1]}`)\n .classed(\"text-md\", true)\n .attr(\"x\", w / 2)\n .attr(\"dy\", \"-0.2em\")\n textElement.append(\"tspan\")\n .text(`${spanPercent}%`)\n .classed(\"text-md\", true)\n .attr(\"x\", w / 2)\n .attr(\"dy\", \"1.2em\")\n return textElement\n function isValueInSpan(value: number, spanStart: number, spanEnd: number): boolean {\n return value >= spanStart && value <= spanEnd\n }\n \n function checkValuesInSpan(values: number[], spanStart: number, spanEnd: number): boolean[] {\n return values.map(value => isValueInSpan(value, spanStart, spanEnd))\n }\n function calculatePercent(result: boolean[], graphValues: number[]): number {\n const filteredSum = result.reduce((sum, isTrue, index) => {\n return isTrue ? sum + graphValues[index] : sum\n }, 0)\n const totalSum = graphValues.reduce((sum, value) => sum + value, 0)\n if (totalSum === 0) return 0\n return Math.round((filteredSum / totalSum) * 100)\n }\n}\n\nexport function parameterCenter(graph: d3.Selection, parameterValue: number, total: number, w: number, h: number) {\n const textElement = graph.append(\"text\")\n .attr(\"class\", \"center-text\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dy\", \"0.35em\")\n .attr(\"x\", w / 2)\n .attr(\"y\", h / 2)\n .style(\"font-weight\", \"bold\")\n \n textElement.append(\"tspan\")\n .text(parameterValue)\n .classed(\"text-md\", true)\n .attr(\"x\", w / 2)\n .attr(\"dy\", \"-0.2em\")\n return textElement\n}\n\n/**\n * Sets selected objects from charts\n * @param ids to select in viewer\n */\nexport function updateSelectedObjects(ids: string[]) {\n const projectStore = useProjectStore()\n projectStore.setObjectsById(ids)\n}\n\n/**\n * Create the same base chart options and object for all charts\n * @param options \n * @param containerElement \n * @returns \n */\nexport function createBaseChart(options: ChartOptions, containerElement: HTMLElement) {\n const width = options.width || 600\n const height = options.height || 400\n const margin = options.margin || { top: 20, right: 20, bottom: 20, left: 20 }\n\n const svg = d3.select(containerElement)\n .append('svg')\n .attr('width', width)\n .attr('height', height)\n\n return { svg, width, height, margin }\n}\n\n\n/**\n * Creates a style for tooltips of charts\n * @param tooltipElement \n * @returns \n */\nexport function createTooltip(tooltipElement: HTMLDivElement) {\n return d3.select(tooltipElement)\n .style('position', 'absolute')\n .style('background-color', 'white')\n .style('border', 'solid')\n .style('border-width', '2px')\n .style('border-radius', '5px')\n .style('padding', '5px')\n .style('opacity', 0)\n}\n\n/**\n * Creates generalized mouse event handlers for charts\n * @param tooltipDiv \n * @param container \n * @returns \n */\nexport function createMouseEventHandlers(tooltipDiv: d3.Selection, container: HTMLElement) {\n function mouseover(event: MouseEvent, data: any) {\n tooltipDiv.style('opacity', 1)\n d3.select(event.currentTarget)\n .style('stroke', 'black')\n .style('opacity', 1)\n }\n\n function mousemove(event: MouseEvent, data: any) {\n const [mouseX, mouseY] = d3.pointer(event, container)\n const containerRect = container.getBoundingClientRect()\n const tooltipRect = tooltipDiv.node()!.getBoundingClientRect()\n\n let left = mouseX + 15\n let top = mouseY - 28\n\n // Adjust left and top to keep the tooltip within the container\n if (left + tooltipRect.width > containerRect.width) {\n left = event.clientX - containerRect.left - tooltipRect.width - 15\n }\n if (left < 0) {\n left = 10\n }\n if (top + tooltipRect.height > containerRect.height) {\n top = containerRect.height - tooltipRect.height - 10\n }\n if (top < 0) {\n top = 10\n }\n\n tooltipDiv\n .html(data.tooltipContent)\n .style('left', `${left}px`)\n .style('top', `${top}px`)\n }\n\n function mouseleave(event: MouseEvent, data: any) {\n tooltipDiv.style('opacity', 0)\n d3.select(event.currentTarget)\n .style('stroke', null)\n .style('opacity', 0.8)\n }\n\n return { mouseover, mousemove, mouseleave }\n}\n\n/**\n * Process data for charts\n * @param data \n * @param totalValue \n * @returns \n */\nexport function groupChartData(data: ChartData[], totalValue: number) {\n let cumulative = 0\n return data.map((d) => {\n cumulative += Math.abs(d.value)\n const percent = totalValue > 0 ? (d.value / totalValue) * 100 : 0\n return {\n ...d,\n cumulative: cumulative - Math.abs(d.value),\n percent,\n }\n }).filter((d) => d.value !== 0)\n}\n","\n\n\n\n\n","\n\n\n\n","\n\n","\n\n","\n\n\n\n","\n\n","\n\n","\n\n","\n\n\n","import type { LifeCycleStageEmission } from \"@/models/material\"\nimport { Source } from \"@/models/material\"\nimport { useMaterialStore } from \"@/stores/material\"\nimport { getCollection, getEPDList } from \"@/utils/EPDUtils\"\n\n/**\n * Enum for countries to search from\n */\nexport enum Country {\n Sweden = \"Sweden\",\n Norway = \"Norway\",\n Denmark = \"Denmark\",\n Finland = \"Finland\",\n Germany = \"Germany\",\n Europe = \"Europe\",\n}\n\n/**\n * Reduced list for common use cases\n */\nexport enum StandardBuildingMaterialType {\n AluminiumElements = \"Aluminium elements\",\n Asphalt = \"Asphalt\",\n BioBasedInsulation = \"Bio-based insulation\",\n Boards = \"Boards\",\n Bricks = \"Bricks\",\n Cement = \"Cement\",\n Concrete = \"Concrete\",\n ConcreteBlocks = \"Concrete blocks\",\n CurtainWall = \"Curtain wall\",\n Doors = \"Doors\",\n /*ExteriorSubstrate = \"Exterior Substrate\",\n FibreCementBoard = \"Fibre Cement board\",\n FramesAndProfiles = \"Frames and profiles\",\n */\n Generic = \"Generic\",\n Gypsum = \"Gypsum\",\n /*Hemp = \"Hemp\",\n Infill = \"Infill\",\n */\n MineralWool = \"Mineral wool\",\n ModifiedWood = \"Modified wood\",\n Mortar = \"Mortar\",\n /*PaintExterior = \"Paint (Exterior)\",\n PaintInterior = \"Paint (Interior)\",\n Plasterboards = \"Plasterboards\",\n PlasticFlooring = \"Plastic flooring\",\n PlasticProfiles = \"Plastic profiles\",\n Primer = \"Primer\",\n ReinforcementSteel = \"Reinforcement steel\",\n RoofingMembranes = \"Roofing membranes\",\n RubberFlooring = \"Rubber flooring\",\n Stones = \"Stones\",\n StructuralTimber = \"Structural timber\",\n TextileFlooring = \"Textile flooring\",\n Tiles = \"Tiles\",*/\n TimberBoards = \"Timber Boards\",\n TimberElements = \"Timber Elements\",\n TimberFlooring = \"Timber flooring\",\n /*WaterproofingMembranes = \"Waterproofing membranes\",\n WindowFittings = \"Window fittings\",*/\n Windows = \"Windows\"\n}\n\n/**\n * Enum for all Building Material types\n */\nexport enum FullBuildingMaterialType {\n AccessoriesForWindowsWallingAndDoors = \"Accessories for windows, walling and doors\",\n Aggregates = \"Aggregates\",\n AirConditioningAndVentilationSystem = \"Air conditioning and ventilation system\",\n AluminiumElements = \"Aluminium elements\",\n Asphalt = \"Asphalt\",\n BioBasedInsulation = \"Bio-based insulation\",\n Boards = \"Boards\",\n Bricks = \"Bricks\",\n CalciumSilicateInsulation = \"Calcium Silicate Insulation\",\n Cement = \"Cement\",\n Clay = \"Clay\",\n CompositeBoards = \"Composite Boards\",\n Concrete = \"Concrete\",\n ConcreteBlocks = \"Concrete blocks\",\n CopperElements = \"Copper elements\",\n CurtainWall = \"Curtain wall\",\n DaylightSystemsAndSmokeOrHeatControlSystems = \"Daylight systems and smoke or heat control systems\",\n DaylightSystemsAndSmokeHeatControlSystems = \"Daylight systems and smoke/heat control systems\",\n Doors = \"Doors\",\n DriveSystemWindowsAndDoors = \"Drive system windows and doors\",\n ElectricalFireProtection = \"Electrical fire protection\",\n ElectricalSystem = \"Electrical system\",\n EndOfLifeProcesses = \"End-of-life processes\",\n EnergyCarrierDeliveryFreeUser = \"Energy carrier - delivery free user\",\n Escalator = \"Escalator\",\n ExpandedPerlit = \"Expanded perlit\",\n ExpandedPolystyreneEPS = \"Expanded polystyrene (EPS)\",\n ExteriorSubstrate = \"Exterior Substrate\",\n ExternalThermalInsulationCompositeSystemETICS = \"External Thermal insulation composite system (ETICS)\",\n ExtrudedPolystyreneXPS = \"Extruded polystyrene (XPS)\",\n FibreCementBoard = \"Fibre Cement board\",\n FireProtectionCoating = \"Fire protection coating\",\n FireProtectionDevices = \"Fire protection devices\",\n FoilsAndFleeces = \"Foils and fleeces\",\n FramesAndProfiles = \"Frames and profiles\",\n Generic = \"Generic\",\n Gypsum = \"Gypsum\",\n HeatingSystems = \"Heating systems\",\n Hemp = \"Hemp\",\n Infill = \"Infill\",\n InsulationFoam = \"Insulation foam\",\n IronElements = \"Iron elements\",\n LeadElements = \"Lead elements\",\n Lime = \"Lime\",\n MineralWool = \"Mineral wool\",\n ModifiedWood = \"Modified wood\",\n Mortar = \"Mortar\",\n Others = \"Others\",\n PaintExterior = \"Paint (Exterior)\",\n PaintInterior = \"Paint (Interior)\",\n PassengerTransportPersonKm = \"Passenger transport [person km]\",\n Pigments = \"Pigments\",\n Plasterboards = \"Plasterboards\",\n PlasticFlooring = \"Plastic flooring\",\n PlasticProfiles = \"Plastic profiles\",\n Primer = \"Primer\",\n ProcessesAtBuildingSite = \"Processes at building site\",\n ReinforcementSteel = \"Reinforcement steel\",\n RendersAndPlasters = \"Renders and plasters\",\n Resin = \"Resin\",\n RigidFoam = \"Rigid foam\",\n RigidFoamBoards = \"Rigid foam boards\",\n RoofingMembranes = \"Roofing membranes\",\n RubberFlooring = \"Rubber flooring\",\n SanitaryWare = \"Sanitary ware\",\n Screed = \"Screed\",\n SealingMaterials = \"Sealing materials\",\n SiliciumDioxideBased = \"Silicium dioxide based\",\n SolarPanel = \"Solar Panel\",\n StainlessSteelTubes = \"Stainless steel tubes\",\n SteelSheets = \"Steel sheets\",\n Stones = \"Stones\",\n StructuralTimber = \"Structural timber\",\n SystemCompositions = \"System compositions\",\n TextileFlooring = \"Textile flooring\",\n Tiles = \"Tiles\",\n TimberBoards = \"Timber Boards\",\n TimberElements = \"Timber Elements\",\n TimberFlooring = \"Timber flooring\",\n TransportOfGoodsTKm = \"Transport of goods [t km]\",\n TransportationSystem = \"Transportation system\",\n TreatmentAndCoatingOfMetals = \"Treatment and coating of metals\",\n Tubes = \"Tubes\",\n Use = \"Use\",\n VarnishesAndStains = \"Varnishes and stains\",\n WaterproofingMembranes = \"Waterproofing membranes\",\n WindowFittings = \"Window fittings\",\n Windows = \"Windows\"\n}\n\n/**\n * Interface for a single Revalu EPD\n */\nexport interface RevaluData {\n id: string\n location: string\n version: string\n registration_number: string\n name: string\n manufacturer: string\n valid_until: number\n valid_from: number\n declared_unit: string\n thickness: number | null\n grammage: number | null\n gross_density: number | null\n bulk_density: number | null\n linear_density: number | null\n standard: string\n subtype: string\n version_last_update_date: string\n lambda: number | null\n u_value: number | null\n r_value: number | null\n source: SourceInfo\n gwp: LifeCycleStageEmission\n gwp_fossil: LifeCycleStageEmission\n gwp_biogenic: LifeCycleStageEmission\n gwp_luluc: LifeCycleStageEmission\n fw: LifeCycleStageEmission\n pert: LifeCycleStageEmission\n penrt: LifeCycleStageEmission\n energy_mix_percentage: LifeCycleStageEmission\n custom_attribute: any \n additional_data: AdditionalData\n all_documents: Document[]\n data_quality_warnings: any | null \n certificates: any[]\n}\n\n/**\n * Interface for a collection of Revalu Collections\n */\nexport interface RevaluCollection {\n description: string\n material_count: number\n owner_name: string\n collaborator_names: string[] | null\n collaborationStatus: string | null\n publishStatus: string | null\n image: string | null\n team: any[] // Not sure what this returns\n collection_id: string\n collection_name: string\n created_date: number\n modified_date: number\n collection_ownership: \"own\" | \"shared\"\n original_collection_id: string | null\n collection_type: \"CATALOGUE\" | \"PROJECT\" | string // Might be more than catalogue and project\n project_contact_name: string | null\n project_contact_email: string | null\n project_link: string | null\n\n}\n\n/**\n * Interface for a single collection of Revalu data\n */\nexport interface RevaluSingleCollection extends RevaluCollection {\n materials: RevaluData[]\n}\n\n\ninterface SourceInfo {\n name: string\n url: string\n}\n\ninterface AdditionalData {\n epd_pdf_url: string\n}\n\ninterface Document {\n document_type: string\n document_url: string\n}\n\n/**\n * Get base list of materials from Revalu, we are getting 15 from every materialType\n */\nexport const getRevaluBaseList = async() => {\n const allCountries: Country[] = Object.values(Country)\n const materialStore = useMaterialStore()\n\n for (const materialType in StandardBuildingMaterialType) {\n const products = await getEPDList({\n \"material_type\": StandardBuildingMaterialType[materialType], \n \"country\": allCountries\n })\n\n for (const product of products) {\n product.metaData = { materialType: StandardBuildingMaterialType[materialType] }\n product.source = Source.Revalu\n \n materialStore.addMaterial(product)\n }\n }\n}\n\n/**\n * Gets all available collections for the user\n */\nexport const getRevaluCollections = async() => {\n const materialStore = useMaterialStore()\n const collection = await getCollection()\n\n for (const product of collection) {\n materialStore.addMaterial(product)\n }\n}","import { useProjectStore } from '@/stores/main'\nimport { useMaterialStore } from '@/stores/material'\n\nimport { getAssemblyList } from '@/utils/material'\nimport { getRevaluBaseList, getRevaluCollections } from '@/models/revaluDataSource'\n\n/**\n * Preload data needed for the dashboard view\n */\nexport async function preloadDashboardData() {\n const projectStore = useProjectStore()\n const materialStore = useMaterialStore()\n\n try {\n await projectStore.getAvailableParameterList()\n\n materialStore.materialsFromJson()\n\t\tgetAssemblyList()\n\t\t//getRevaluBaseList()\n\t\tgetRevaluCollections()\n\n // Add more preload calls here if needed\n console.log('Dashboard data preloaded successfully.')\n } catch (error) {\n console.error('Error preloading dashboard data:', error)\n }\n}\n","\n\n","\n\n","\n\n","\n\n","\n","\n\n","\n\n","\n\n\n","const name = 'VueColor';\n// 自定义组件前缀\nconst prefix = '';\nconst cssPrefix = '';\nconst size = 'medium';\n\nexport { cssPrefix, name, prefix, size };\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport { styleInject as s };\n","import { prefix } from '../defaultConfig.js';\n\nconst install = function (app, options) {\n const { componentPrefix = prefix } = options || {};\n app.component(`${componentPrefix}${this.name}`, this);\n};\n\nexport { install };\n","import { openBlock, createElementBlock, normalizeStyle } from 'vue';\nimport { s as styleInject } from '../../style-inject.es-746bb8ed.js';\nimport { install } from '../../utils/compoent.js';\nimport '../../defaultConfig.js';\n\nconst _checkboardCache = {};\n\nvar script = {\n name: 'Checkboard',\n props: {\n size: {\n type: [Number, String],\n default: 8,\n },\n white: {\n type: String,\n default: '#fff',\n },\n grey: {\n type: String,\n default: '#e6e6e6',\n },\n },\n computed: {\n bgStyle() {\n return {\n 'background-image': `url(${getCheckboard(this.white, this.grey, this.size)})`,\n };\n },\n },\n};\n\n/**\n * get base 64 data by canvas\n *\n * @param {String} c1 hex color\n * @param {String} c2 hex color\n * @param {Number} size\n */\n\nfunction renderCheckboard(c1, c2, size) {\n // Dont Render On Server\n if (typeof document === 'undefined')\n return null;\n\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = size * 2;\n const ctx = canvas.getContext('2d');\n // If no context can be found, return early.\n if (!ctx)\n return null;\n\n ctx.fillStyle = c1;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.fillStyle = c2;\n ctx.fillRect(0, 0, size, size);\n ctx.translate(size, size);\n ctx.fillRect(0, 0, size, size);\n return canvas.toDataURL();\n}\n\n/**\n * get checkboard base data and cache\n *\n * @param {String} c1 hex color\n * @param {String} c2 hex color\n * @param {Number} size\n */\n\nfunction getCheckboard(c1, c2, size) {\n const key = `${c1},${c2},${size}`;\n\n if (_checkboardCache[key])\n return _checkboardCache[key];\n\n const checkboard = renderCheckboard(c1, c2, size);\n _checkboardCache[key] = checkboard;\n return checkboard;\n}\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (openBlock(), createElementBlock(\"div\", {\n class: \"vc-checkerboard\",\n style: normalizeStyle($options.bgStyle)\n }, null, 4 /* STYLE */))\n}\n\nvar css_248z = \".vc-checkerboard{background-size:contain;bottom:0;left:0;position:absolute;right:0;top:0}\";\nstyleInject(css_248z);\n\nscript.render = render;\nscript.__file = \"src/components/checkboard/checkboard.vue\";\n\nscript.install = install;\n\nexport { script as default };\n","import script$1 from '../checkboard/index.js';\nimport { resolveComponent, openBlock, createElementBlock, createElementVNode, createVNode, normalizeStyle } from 'vue';\nimport { s as styleInject } from '../../style-inject.es-746bb8ed.js';\nimport { install } from '../../utils/compoent.js';\nimport '../../defaultConfig.js';\n\nvar script = {\n name: 'Alpha',\n components: {\n Checkboard: script$1,\n },\n props: {\n value: Object,\n onChange: Function,\n },\n computed: {\n colors() {\n return this.value;\n },\n gradientColor() {\n const { rgba } = this.colors;\n const rgbStr = [rgba.r, rgba.g, rgba.b].join(',');\n return `linear-gradient(to right, rgba(${rgbStr}, 0) 0%, rgba(${rgbStr}, 1) 100%)`;\n },\n },\n methods: {\n handleChange(e, skip) {\n !skip && e.preventDefault();\n const { container } = this.$refs;\n if (!container) {\n // for some edge cases, container may not exist. see #220\n return;\n }\n const containerWidth = container.clientWidth;\n\n const xOffset = container.getBoundingClientRect().left + window.pageXOffset;\n const pageX = e.pageX || (e.touches ? e.touches[0].pageX : 0);\n const left = pageX - xOffset;\n\n let a;\n if (left < 0)\n a = 0;\n else if (left > containerWidth)\n a = 1;\n else\n a = Math.round(left * 100 / containerWidth) / 100;\n\n if (this.colors.a !== a) {\n this.$emit('change', {\n h: this.colors.hsl.h,\n s: this.colors.hsl.s,\n l: this.colors.hsl.l,\n a,\n source: 'rgba',\n });\n }\n },\n handleMouseDown(e) {\n this.handleChange(e, true);\n window.addEventListener('mousemove', this.handleChange);\n window.addEventListener('mouseup', this.handleMouseUp);\n },\n handleMouseUp() {\n this.unbindEventListeners();\n },\n unbindEventListeners() {\n window.removeEventListener('mousemove', this.handleChange);\n window.removeEventListener('mouseup', this.handleMouseUp);\n },\n },\n};\n\nconst _hoisted_1 = { class: \"vc-alpha\" };\nconst _hoisted_2 = { class: \"vc-alpha-checkboard-wrap\" };\nconst _hoisted_3 = /*#__PURE__*/createElementVNode(\"div\", { class: \"vc-alpha-picker\" }, null, -1 /* HOISTED */);\nconst _hoisted_4 = [\n _hoisted_3\n];\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_Checkboard = resolveComponent(\"Checkboard\");\n\n return (openBlock(), createElementBlock(\"div\", _hoisted_1, [\n createElementVNode(\"div\", _hoisted_2, [\n createVNode(_component_Checkboard)\n ]),\n createElementVNode(\"div\", {\n class: \"vc-alpha-gradient\",\n style: normalizeStyle({ background: $options.gradientColor })\n }, null, 4 /* STYLE */),\n createElementVNode(\"div\", {\n ref: \"container\",\n class: \"vc-alpha-container\",\n onMousedown: _cache[0] || (_cache[0] = (...args) => ($options.handleMouseDown && $options.handleMouseDown(...args))),\n onTouchmove: _cache[1] || (_cache[1] = (...args) => ($options.handleChange && $options.handleChange(...args))),\n onTouchstart: _cache[2] || (_cache[2] = (...args) => ($options.handleChange && $options.handleChange(...args)))\n }, [\n createElementVNode(\"div\", {\n class: \"vc-alpha-pointer\",\n style: normalizeStyle({ left: `${$options.colors.a * 100}%` })\n }, _hoisted_4, 4 /* STYLE */)\n ], 544 /* HYDRATE_EVENTS, NEED_PATCH */)\n ]))\n}\n\nvar css_248z = \".vc-alpha,.vc-alpha-checkboard-wrap{bottom:0;left:0;position:absolute;right:0;top:0}.vc-alpha-checkboard-wrap{overflow:hidden}.vc-alpha-gradient{bottom:0;left:0;position:absolute;right:0;top:0}.vc-alpha-container{cursor:pointer;height:100%;margin:0 3px;position:relative;z-index:2}.vc-alpha-pointer{position:absolute;z-index:2}.vc-alpha-picker{background:#fff;border-radius:1px;box-shadow:0 0 2px rgba(0,0,0,.6);cursor:pointer;height:8px;margin-top:1px;transform:translateX(-2px);width:4px}\";\nstyleInject(css_248z);\n\nscript.render = render;\nscript.__file = \"src/components/alpha/alpha.vue\";\n\nscript.install = install;\n\nexport { script as default };\n","/**\n * Take input from [0, n] and return it as [0, 1]\n * @hidden\n */\nexport function bound01(n, max) {\n if (isOnePointZero(n)) {\n n = '100%';\n }\n var isPercent = isPercentage(n);\n n = max === 360 ? n : Math.min(max, Math.max(0, parseFloat(n)));\n // Automatically convert percentage into number\n if (isPercent) {\n n = parseInt(String(n * max), 10) / 100;\n }\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n // Convert into [0, 1] range if it isn't already\n if (max === 360) {\n // If n is a hue given in degrees,\n // wrap around out-of-range values into [0, 360] range\n // then convert into [0, 1].\n n = (n < 0 ? (n % max) + max : n % max) / parseFloat(String(max));\n }\n else {\n // If n not a hue given in degrees\n // Convert into [0, 1] range if it isn't already.\n n = (n % max) / parseFloat(String(max));\n }\n return n;\n}\n/**\n * Force a number between 0 and 1\n * @hidden\n */\nexport function clamp01(val) {\n return Math.min(1, Math.max(0, val));\n}\n/**\n * Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n * \n * @hidden\n */\nexport function isOnePointZero(n) {\n return typeof n === 'string' && n.indexOf('.') !== -1 && parseFloat(n) === 1;\n}\n/**\n * Check to see if string passed in is a percentage\n * @hidden\n */\nexport function isPercentage(n) {\n return typeof n === 'string' && n.indexOf('%') !== -1;\n}\n/**\n * Return a valid alpha value [0,1] with all invalid values being set to 1\n * @hidden\n */\nexport function boundAlpha(a) {\n a = parseFloat(a);\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n return a;\n}\n/**\n * Replace a decimal with it's percentage value\n * @hidden\n */\nexport function convertToPercentage(n) {\n if (n <= 1) {\n return \"\".concat(Number(n) * 100, \"%\");\n }\n return n;\n}\n/**\n * Force a hex value to have 2 characters\n * @hidden\n */\nexport function pad2(c) {\n return c.length === 1 ? '0' + c : String(c);\n}\n","import { bound01, pad2 } from './util.js';\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// \n/**\n * Handle bounds / percentage checking to conform to CSS color spec\n * \n * *Assumes:* r, g, b in [0, 255] or [0, 1]\n * *Returns:* { r, g, b } in [0, 255]\n */\nexport function rgbToRgb(r, g, b) {\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255,\n };\n}\n/**\n * Converts an RGB color value to HSL.\n * *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n * *Returns:* { h, s, l } in [0,1]\n */\nexport function rgbToHsl(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var h = 0;\n var s = 0;\n var l = (max + min) / 2;\n if (max === min) {\n s = 0;\n h = 0; // achromatic\n }\n else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n break;\n }\n h /= 6;\n }\n return { h: h, s: s, l: l };\n}\nfunction hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * (6 * t);\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n}\n/**\n * Converts an HSL color value to RGB.\n *\n * *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n * *Returns:* { r, g, b } in the set [0, 255]\n */\nexport function hslToRgb(h, s, l) {\n var r;\n var g;\n var b;\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n if (s === 0) {\n // achromatic\n g = l;\n b = l;\n r = l;\n }\n else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n/**\n * Converts an RGB color value to HSV\n *\n * *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n * *Returns:* { h, s, v } in [0,1]\n */\nexport function rgbToHsv(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var h = 0;\n var v = max;\n var d = max - min;\n var s = max === 0 ? 0 : d / max;\n if (max === min) {\n h = 0; // achromatic\n }\n else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n break;\n }\n h /= 6;\n }\n return { h: h, s: s, v: v };\n}\n/**\n * Converts an HSV color value to RGB.\n *\n * *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n * *Returns:* { r, g, b } in the set [0, 255]\n */\nexport function hsvToRgb(h, s, v) {\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n var i = Math.floor(h);\n var f = h - i;\n var p = v * (1 - s);\n var q = v * (1 - f * s);\n var t = v * (1 - (1 - f) * s);\n var mod = i % 6;\n var r = [v, q, p, p, t, v][mod];\n var g = [t, v, v, q, p, p][mod];\n var b = [p, p, t, v, v, q][mod];\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n/**\n * Converts an RGB color to hex\n *\n * Assumes r, g, and b are contained in the set [0, 255]\n * Returns a 3 or 6 character hex\n */\nexport function rgbToHex(r, g, b, allow3Char) {\n var hex = [\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n ];\n // Return a 3 character hex if possible\n if (allow3Char &&\n hex[0].startsWith(hex[0].charAt(1)) &&\n hex[1].startsWith(hex[1].charAt(1)) &&\n hex[2].startsWith(hex[2].charAt(1))) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n return hex.join('');\n}\n/**\n * Converts an RGBA color plus alpha transparency to hex\n *\n * Assumes r, g, b are contained in the set [0, 255] and\n * a in [0, 1]. Returns a 4 or 8 character rgba hex\n */\n// eslint-disable-next-line max-params\nexport function rgbaToHex(r, g, b, a, allow4Char) {\n var hex = [\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n pad2(convertDecimalToHex(a)),\n ];\n // Return a 4 character hex if possible\n if (allow4Char &&\n hex[0].startsWith(hex[0].charAt(1)) &&\n hex[1].startsWith(hex[1].charAt(1)) &&\n hex[2].startsWith(hex[2].charAt(1)) &&\n hex[3].startsWith(hex[3].charAt(1))) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n return hex.join('');\n}\n/**\n * Converts an RGBA color to an ARGB Hex8 string\n * Rarely used, but required for \"toFilter()\"\n */\nexport function rgbaToArgbHex(r, g, b, a) {\n var hex = [\n pad2(convertDecimalToHex(a)),\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n ];\n return hex.join('');\n}\n/** Converts a decimal to a hex value */\nexport function convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n}\n/** Converts a hex value to a decimal */\nexport function convertHexToDecimal(h) {\n return parseIntFromHex(h) / 255;\n}\n/** Parse a base-16 hex value into a base-10 integer */\nexport function parseIntFromHex(val) {\n return parseInt(val, 16);\n}\nexport function numberInputToObject(color) {\n return {\n r: color >> 16,\n g: (color & 0xff00) >> 8,\n b: color & 0xff,\n };\n}\n","// https://github.com/bahamas10/css-color-names/blob/master/css-color-names.json\n/**\n * @hidden\n */\nexport var names = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n goldenrod: '#daa520',\n gold: '#ffd700',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavenderblush: '#fff0f5',\n lavender: '#e6e6fa',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32',\n};\n","/* eslint-disable @typescript-eslint/no-redundant-type-constituents */\nimport { convertHexToDecimal, hslToRgb, hsvToRgb, parseIntFromHex, rgbToRgb, } from './conversion.js';\nimport { names } from './css-color-names.js';\nimport { boundAlpha, convertToPercentage } from './util.js';\n/**\n * Given a string or object, convert that input to RGB\n *\n * Possible string inputs:\n * ```\n * \"red\"\n * \"#f00\" or \"f00\"\n * \"#ff0000\" or \"ff0000\"\n * \"#ff000000\" or \"ff000000\"\n * \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n * \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n * \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n * \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n * \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n * \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n * \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n * ```\n */\nexport function inputToRGB(color) {\n var rgb = { r: 0, g: 0, b: 0 };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n if (typeof color === 'string') {\n color = stringInputToObject(color);\n }\n if (typeof color === 'object') {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === '%' ? 'prgb' : 'rgb';\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = 'hsv';\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = 'hsl';\n }\n if (Object.prototype.hasOwnProperty.call(color, 'a')) {\n a = color.a;\n }\n }\n a = boundAlpha(a);\n return {\n ok: ok,\n format: color.format || format,\n r: Math.min(255, Math.max(rgb.r, 0)),\n g: Math.min(255, Math.max(rgb.g, 0)),\n b: Math.min(255, Math.max(rgb.b, 0)),\n a: a,\n };\n}\n// \nvar CSS_INTEGER = '[-\\\\+]?\\\\d+%?';\n// \nvar CSS_NUMBER = '[-\\\\+]?\\\\d*\\\\.\\\\d+%?';\n// Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\nvar CSS_UNIT = \"(?:\".concat(CSS_NUMBER, \")|(?:\").concat(CSS_INTEGER, \")\");\n// Actual matching.\n// Parentheses and commas are optional, but not required.\n// Whitespace can take the place of commas or opening paren\nvar PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\".concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")\\\\s*\\\\)?\");\nvar PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\".concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")\\\\s*\\\\)?\");\nvar matchers = {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp('rgb' + PERMISSIVE_MATCH3),\n rgba: new RegExp('rgba' + PERMISSIVE_MATCH4),\n hsl: new RegExp('hsl' + PERMISSIVE_MATCH3),\n hsla: new RegExp('hsla' + PERMISSIVE_MATCH4),\n hsv: new RegExp('hsv' + PERMISSIVE_MATCH3),\n hsva: new RegExp('hsva' + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n};\n/**\n * Permissive string parsing. Take in a number of formats, and output an object\n * based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\n */\nexport function stringInputToObject(color) {\n color = color.trim().toLowerCase();\n if (color.length === 0) {\n return false;\n }\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n }\n else if (color === 'transparent') {\n return { r: 0, g: 0, b: 0, a: 0, format: 'name' };\n }\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match = matchers.rgb.exec(color);\n if (match) {\n return { r: match[1], g: match[2], b: match[3] };\n }\n match = matchers.rgba.exec(color);\n if (match) {\n return { r: match[1], g: match[2], b: match[3], a: match[4] };\n }\n match = matchers.hsl.exec(color);\n if (match) {\n return { h: match[1], s: match[2], l: match[3] };\n }\n match = matchers.hsla.exec(color);\n if (match) {\n return { h: match[1], s: match[2], l: match[3], a: match[4] };\n }\n match = matchers.hsv.exec(color);\n if (match) {\n return { h: match[1], s: match[2], v: match[3] };\n }\n match = matchers.hsva.exec(color);\n if (match) {\n return { h: match[1], s: match[2], v: match[3], a: match[4] };\n }\n match = matchers.hex8.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? 'name' : 'hex8',\n };\n }\n match = matchers.hex6.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? 'name' : 'hex',\n };\n }\n match = matchers.hex4.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1] + match[1]),\n g: parseIntFromHex(match[2] + match[2]),\n b: parseIntFromHex(match[3] + match[3]),\n a: convertHexToDecimal(match[4] + match[4]),\n format: named ? 'name' : 'hex8',\n };\n }\n match = matchers.hex3.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1] + match[1]),\n g: parseIntFromHex(match[2] + match[2]),\n b: parseIntFromHex(match[3] + match[3]),\n format: named ? 'name' : 'hex',\n };\n }\n return false;\n}\n/**\n * Check to see if it looks like a CSS unit\n * (see `matchers` above for definition).\n */\nexport function isValidCSSUnit(color) {\n return Boolean(matchers.CSS_UNIT.exec(String(color)));\n}\n","import { numberInputToObject, rgbaToHex, rgbToHex, rgbToHsl, rgbToHsv } from './conversion.js';\nimport { names } from './css-color-names.js';\nimport { inputToRGB } from './format-input';\nimport { bound01, boundAlpha, clamp01 } from './util.js';\nvar TinyColor = /** @class */ (function () {\n function TinyColor(color, opts) {\n if (color === void 0) { color = ''; }\n if (opts === void 0) { opts = {}; }\n var _a;\n // If input is already a tinycolor, return itself\n if (color instanceof TinyColor) {\n // eslint-disable-next-line no-constructor-return\n return color;\n }\n if (typeof color === 'number') {\n color = numberInputToObject(color);\n }\n this.originalInput = color;\n var rgb = inputToRGB(color);\n this.originalInput = color;\n this.r = rgb.r;\n this.g = rgb.g;\n this.b = rgb.b;\n this.a = rgb.a;\n this.roundA = Math.round(100 * this.a) / 100;\n this.format = (_a = opts.format) !== null && _a !== void 0 ? _a : rgb.format;\n this.gradientType = opts.gradientType;\n // Don't let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n if (this.r < 1) {\n this.r = Math.round(this.r);\n }\n if (this.g < 1) {\n this.g = Math.round(this.g);\n }\n if (this.b < 1) {\n this.b = Math.round(this.b);\n }\n this.isValid = rgb.ok;\n }\n TinyColor.prototype.isDark = function () {\n return this.getBrightness() < 128;\n };\n TinyColor.prototype.isLight = function () {\n return !this.isDark();\n };\n /**\n * Returns the perceived brightness of the color, from 0-255.\n */\n TinyColor.prototype.getBrightness = function () {\n // http://www.w3.org/TR/AERT#color-contrast\n var rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n };\n /**\n * Returns the perceived luminance of a color, from 0-1.\n */\n TinyColor.prototype.getLuminance = function () {\n // http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n var rgb = this.toRgb();\n var R;\n var G;\n var B;\n var RsRGB = rgb.r / 255;\n var GsRGB = rgb.g / 255;\n var BsRGB = rgb.b / 255;\n if (RsRGB <= 0.03928) {\n R = RsRGB / 12.92;\n }\n else {\n // eslint-disable-next-line prefer-exponentiation-operator\n R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n }\n if (GsRGB <= 0.03928) {\n G = GsRGB / 12.92;\n }\n else {\n // eslint-disable-next-line prefer-exponentiation-operator\n G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n }\n if (BsRGB <= 0.03928) {\n B = BsRGB / 12.92;\n }\n else {\n // eslint-disable-next-line prefer-exponentiation-operator\n B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n }\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n };\n /**\n * Returns the alpha value of a color, from 0-1.\n */\n TinyColor.prototype.getAlpha = function () {\n return this.a;\n };\n /**\n * Sets the alpha value on the current color.\n *\n * @param alpha - The new alpha value. The accepted range is 0-1.\n */\n TinyColor.prototype.setAlpha = function (alpha) {\n this.a = boundAlpha(alpha);\n this.roundA = Math.round(100 * this.a) / 100;\n return this;\n };\n /**\n * Returns whether the color is monochrome.\n */\n TinyColor.prototype.isMonochrome = function () {\n var s = this.toHsl().s;\n return s === 0;\n };\n /**\n * Returns the object as a HSVA object.\n */\n TinyColor.prototype.toHsv = function () {\n var hsv = rgbToHsv(this.r, this.g, this.b);\n return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this.a };\n };\n /**\n * Returns the hsva values interpolated into a string with the following format:\n * \"hsva(xxx, xxx, xxx, xx)\".\n */\n TinyColor.prototype.toHsvString = function () {\n var hsv = rgbToHsv(this.r, this.g, this.b);\n var h = Math.round(hsv.h * 360);\n var s = Math.round(hsv.s * 100);\n var v = Math.round(hsv.v * 100);\n return this.a === 1 ? \"hsv(\".concat(h, \", \").concat(s, \"%, \").concat(v, \"%)\") : \"hsva(\".concat(h, \", \").concat(s, \"%, \").concat(v, \"%, \").concat(this.roundA, \")\");\n };\n /**\n * Returns the object as a HSLA object.\n */\n TinyColor.prototype.toHsl = function () {\n var hsl = rgbToHsl(this.r, this.g, this.b);\n return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this.a };\n };\n /**\n * Returns the hsla values interpolated into a string with the following format:\n * \"hsla(xxx, xxx, xxx, xx)\".\n */\n TinyColor.prototype.toHslString = function () {\n var hsl = rgbToHsl(this.r, this.g, this.b);\n var h = Math.round(hsl.h * 360);\n var s = Math.round(hsl.s * 100);\n var l = Math.round(hsl.l * 100);\n return this.a === 1 ? \"hsl(\".concat(h, \", \").concat(s, \"%, \").concat(l, \"%)\") : \"hsla(\".concat(h, \", \").concat(s, \"%, \").concat(l, \"%, \").concat(this.roundA, \")\");\n };\n /**\n * Returns the hex value of the color.\n * @param allow3Char will shorten hex value to 3 char if possible\n */\n TinyColor.prototype.toHex = function (allow3Char) {\n if (allow3Char === void 0) { allow3Char = false; }\n return rgbToHex(this.r, this.g, this.b, allow3Char);\n };\n /**\n * Returns the hex value of the color -with a # prefixed.\n * @param allow3Char will shorten hex value to 3 char if possible\n */\n TinyColor.prototype.toHexString = function (allow3Char) {\n if (allow3Char === void 0) { allow3Char = false; }\n return '#' + this.toHex(allow3Char);\n };\n /**\n * Returns the hex 8 value of the color.\n * @param allow4Char will shorten hex value to 4 char if possible\n */\n TinyColor.prototype.toHex8 = function (allow4Char) {\n if (allow4Char === void 0) { allow4Char = false; }\n return rgbaToHex(this.r, this.g, this.b, this.a, allow4Char);\n };\n /**\n * Returns the hex 8 value of the color -with a # prefixed.\n * @param allow4Char will shorten hex value to 4 char if possible\n */\n TinyColor.prototype.toHex8String = function (allow4Char) {\n if (allow4Char === void 0) { allow4Char = false; }\n return '#' + this.toHex8(allow4Char);\n };\n /**\n * Returns the shorter hex value of the color depends on its alpha -with a # prefixed.\n * @param allowShortChar will shorten hex value to 3 or 4 char if possible\n */\n TinyColor.prototype.toHexShortString = function (allowShortChar) {\n if (allowShortChar === void 0) { allowShortChar = false; }\n return this.a === 1 ? this.toHexString(allowShortChar) : this.toHex8String(allowShortChar);\n };\n /**\n * Returns the object as a RGBA object.\n */\n TinyColor.prototype.toRgb = function () {\n return {\n r: Math.round(this.r),\n g: Math.round(this.g),\n b: Math.round(this.b),\n a: this.a,\n };\n };\n /**\n * Returns the RGBA values interpolated into a string with the following format:\n * \"RGBA(xxx, xxx, xxx, xx)\".\n */\n TinyColor.prototype.toRgbString = function () {\n var r = Math.round(this.r);\n var g = Math.round(this.g);\n var b = Math.round(this.b);\n return this.a === 1 ? \"rgb(\".concat(r, \", \").concat(g, \", \").concat(b, \")\") : \"rgba(\".concat(r, \", \").concat(g, \", \").concat(b, \", \").concat(this.roundA, \")\");\n };\n /**\n * Returns the object as a RGBA object.\n */\n TinyColor.prototype.toPercentageRgb = function () {\n var fmt = function (x) { return \"\".concat(Math.round(bound01(x, 255) * 100), \"%\"); };\n return {\n r: fmt(this.r),\n g: fmt(this.g),\n b: fmt(this.b),\n a: this.a,\n };\n };\n /**\n * Returns the RGBA relative values interpolated into a string\n */\n TinyColor.prototype.toPercentageRgbString = function () {\n var rnd = function (x) { return Math.round(bound01(x, 255) * 100); };\n return this.a === 1\n ? \"rgb(\".concat(rnd(this.r), \"%, \").concat(rnd(this.g), \"%, \").concat(rnd(this.b), \"%)\")\n : \"rgba(\".concat(rnd(this.r), \"%, \").concat(rnd(this.g), \"%, \").concat(rnd(this.b), \"%, \").concat(this.roundA, \")\");\n };\n /**\n * The 'real' name of the color -if there is one.\n */\n TinyColor.prototype.toName = function () {\n if (this.a === 0) {\n return 'transparent';\n }\n if (this.a < 1) {\n return false;\n }\n var hex = '#' + rgbToHex(this.r, this.g, this.b, false);\n for (var _i = 0, _a = Object.entries(names); _i < _a.length; _i++) {\n var _b = _a[_i], key = _b[0], value = _b[1];\n if (hex === value) {\n return key;\n }\n }\n return false;\n };\n TinyColor.prototype.toString = function (format) {\n var formatSet = Boolean(format);\n format = format !== null && format !== void 0 ? format : this.format;\n var formattedString = false;\n var hasAlpha = this.a < 1 && this.a >= 0;\n var needsAlphaFormat = !formatSet && hasAlpha && (format.startsWith('hex') || format === 'name');\n if (needsAlphaFormat) {\n // Special case for \"transparent\", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === 'name' && this.a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === 'rgb') {\n formattedString = this.toRgbString();\n }\n if (format === 'prgb') {\n formattedString = this.toPercentageRgbString();\n }\n if (format === 'hex' || format === 'hex6') {\n formattedString = this.toHexString();\n }\n if (format === 'hex3') {\n formattedString = this.toHexString(true);\n }\n if (format === 'hex4') {\n formattedString = this.toHex8String(true);\n }\n if (format === 'hex8') {\n formattedString = this.toHex8String();\n }\n if (format === 'name') {\n formattedString = this.toName();\n }\n if (format === 'hsl') {\n formattedString = this.toHslString();\n }\n if (format === 'hsv') {\n formattedString = this.toHsvString();\n }\n return formattedString || this.toHexString();\n };\n TinyColor.prototype.toNumber = function () {\n return (Math.round(this.r) << 16) + (Math.round(this.g) << 8) + Math.round(this.b);\n };\n TinyColor.prototype.clone = function () {\n return new TinyColor(this.toString());\n };\n /**\n * Lighten the color a given amount. Providing 100 will always return white.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.lighten = function (amount) {\n if (amount === void 0) { amount = 10; }\n var hsl = this.toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return new TinyColor(hsl);\n };\n /**\n * Brighten the color a given amount, from 0 to 100.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.brighten = function (amount) {\n if (amount === void 0) { amount = 10; }\n var rgb = this.toRgb();\n rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));\n rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));\n rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));\n return new TinyColor(rgb);\n };\n /**\n * Darken the color a given amount, from 0 to 100.\n * Providing 100 will always return black.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.darken = function (amount) {\n if (amount === void 0) { amount = 10; }\n var hsl = this.toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return new TinyColor(hsl);\n };\n /**\n * Mix the color with pure white, from 0 to 100.\n * Providing 0 will do nothing, providing 100 will always return white.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.tint = function (amount) {\n if (amount === void 0) { amount = 10; }\n return this.mix('white', amount);\n };\n /**\n * Mix the color with pure black, from 0 to 100.\n * Providing 0 will do nothing, providing 100 will always return black.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.shade = function (amount) {\n if (amount === void 0) { amount = 10; }\n return this.mix('black', amount);\n };\n /**\n * Desaturate the color a given amount, from 0 to 100.\n * Providing 100 will is the same as calling greyscale\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.desaturate = function (amount) {\n if (amount === void 0) { amount = 10; }\n var hsl = this.toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return new TinyColor(hsl);\n };\n /**\n * Saturate the color a given amount, from 0 to 100.\n * @param amount - valid between 1-100\n */\n TinyColor.prototype.saturate = function (amount) {\n if (amount === void 0) { amount = 10; }\n var hsl = this.toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return new TinyColor(hsl);\n };\n /**\n * Completely desaturates a color into greyscale.\n * Same as calling `desaturate(100)`\n */\n TinyColor.prototype.greyscale = function () {\n return this.desaturate(100);\n };\n /**\n * Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n * Values outside of this range will be wrapped into this range.\n */\n TinyColor.prototype.spin = function (amount) {\n var hsl = this.toHsl();\n var hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return new TinyColor(hsl);\n };\n /**\n * Mix the current color a given amount with another color, from 0 to 100.\n * 0 means no mixing (return current color).\n */\n TinyColor.prototype.mix = function (color, amount) {\n if (amount === void 0) { amount = 50; }\n var rgb1 = this.toRgb();\n var rgb2 = new TinyColor(color).toRgb();\n var p = amount / 100;\n var rgba = {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b,\n a: (rgb2.a - rgb1.a) * p + rgb1.a,\n };\n return new TinyColor(rgba);\n };\n TinyColor.prototype.analogous = function (results, slices) {\n if (results === void 0) { results = 6; }\n if (slices === void 0) { slices = 30; }\n var hsl = this.toHsl();\n var part = 360 / slices;\n var ret = [this];\n for (hsl.h = (hsl.h - ((part * results) >> 1) + 720) % 360; --results;) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(new TinyColor(hsl));\n }\n return ret;\n };\n /**\n * taken from https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js\n */\n TinyColor.prototype.complement = function () {\n var hsl = this.toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return new TinyColor(hsl);\n };\n TinyColor.prototype.monochromatic = function (results) {\n if (results === void 0) { results = 6; }\n var hsv = this.toHsv();\n var h = hsv.h;\n var s = hsv.s;\n var v = hsv.v;\n var res = [];\n var modification = 1 / results;\n while (results--) {\n res.push(new TinyColor({ h: h, s: s, v: v }));\n v = (v + modification) % 1;\n }\n return res;\n };\n TinyColor.prototype.splitcomplement = function () {\n var hsl = this.toHsl();\n var h = hsl.h;\n return [\n this,\n new TinyColor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l }),\n new TinyColor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l }),\n ];\n };\n /**\n * Compute how the color would appear on a background\n */\n TinyColor.prototype.onBackground = function (background) {\n var fg = this.toRgb();\n var bg = new TinyColor(background).toRgb();\n var alpha = fg.a + bg.a * (1 - fg.a);\n return new TinyColor({\n r: (fg.r * fg.a + bg.r * bg.a * (1 - fg.a)) / alpha,\n g: (fg.g * fg.a + bg.g * bg.a * (1 - fg.a)) / alpha,\n b: (fg.b * fg.a + bg.b * bg.a * (1 - fg.a)) / alpha,\n a: alpha,\n });\n };\n /**\n * Alias for `polyad(3)`\n */\n TinyColor.prototype.triad = function () {\n return this.polyad(3);\n };\n /**\n * Alias for `polyad(4)`\n */\n TinyColor.prototype.tetrad = function () {\n return this.polyad(4);\n };\n /**\n * Get polyad colors, like (for 1, 2, 3, 4, 5, 6, 7, 8, etc...)\n * monad, dyad, triad, tetrad, pentad, hexad, heptad, octad, etc...\n */\n TinyColor.prototype.polyad = function (n) {\n var hsl = this.toHsl();\n var h = hsl.h;\n var result = [this];\n var increment = 360 / n;\n for (var i = 1; i < n; i++) {\n result.push(new TinyColor({ h: (h + i * increment) % 360, s: hsl.s, l: hsl.l }));\n }\n return result;\n };\n /**\n * compare color vs current color\n */\n TinyColor.prototype.equals = function (color) {\n return this.toRgbString() === new TinyColor(color).toRgbString();\n };\n return TinyColor;\n}());\nexport { TinyColor };\n// kept for backwards compatability with v1\nexport function tinycolor(color, opts) {\n if (color === void 0) { color = ''; }\n if (opts === void 0) { opts = {}; }\n return new TinyColor(color, opts);\n}\n","import { TinyColor } from '@ctrl/tinycolor';\n\nfunction tinycolor(...args) {\n return new TinyColor(...args);\n}\n\nfunction _colorChange(data, oldHue) {\n const alpha = data && data.a;\n let color;\n\n // hsl is better than hex between conversions\n if (data && data.hsl)\n color = tinycolor(data.hsl);\n else if (data && data.hex && data.hex.length > 0)\n color = tinycolor(data.hex);\n else if (data && data.hsv)\n color = tinycolor(data.hsv);\n else if (data && data.rgba)\n color = tinycolor(data.rgba);\n else if (data && data.rgb)\n color = tinycolor(data.rgb);\n else\n color = tinycolor(data);\n\n if (color && (color._a === undefined || color._a === null))\n color.setAlpha(alpha || color.getAlpha());\n\n const hsl = color.toHsl();\n const hsv = color.toHsv();\n\n if (hsl.s === 0)\n hsv.h = hsl.h = data.h || (data.hsl && data.hsl.h) || oldHue || 0;\n\n /* --- comment this block to fix #109, may cause #25 again --- */\n // when the hsv.v is less than 0.0164 (base on test)\n // because of possible loss of precision\n // the result of hue and saturation would be miscalculated\n if (hsv.v < 0.0164) {\n hsv.h = data.h || (data.hsv && data.hsv.h) || 0;\n hsv.s = data.s || (data.hsv && data.hsv.s) || 0;\n }\n\n if (hsl.l < 0.01) {\n hsl.h = data.h || (data.hsl && data.hsl.h) || 0;\n hsl.s = data.s || (data.hsl && data.hsl.s) || 0;\n }\n /* ------ */\n\n return {\n hsl,\n hex: color.toHexString().toUpperCase(),\n hex8: color.toHex8String().toUpperCase(),\n rgba: color.toRgb(),\n hsv,\n oldHue: data.h || oldHue || hsl.h,\n source: data.source,\n a: color.getAlpha(),\n };\n}\n\nvar colorMixin = {\n model: {\n prop: 'modelValue',\n event: 'update:modelValue',\n },\n props: ['modelValue'],\n data() {\n return {\n val: _colorChange(this.modelValue),\n };\n },\n computed: {\n colors: {\n get() {\n return this.val;\n },\n set(newVal) {\n this.val = newVal;\n this.$emit('update:modelValue', newVal);\n },\n },\n },\n watch: {\n modelValue(newVal) {\n this.val = _colorChange(newVal);\n },\n },\n methods: {\n colorChange(data, oldHue) {\n this.oldHue = this.colors.hsl.h;\n this.colors = _colorChange(data, oldHue || this.oldHue);\n },\n isValidHex(hex) {\n return tinycolor(hex).isValid;\n },\n simpleCheckForValidColor(data) {\n const keysToCheck = ['r', 'g', 'b', 'a', 'h', 's', 'l', 'v'];\n let checked = 0;\n let passed = 0;\n\n for (let i = 0; i < keysToCheck.length; i++) {\n const letter = keysToCheck[i];\n if (data[letter]) {\n checked++;\n if (!isNaN(data[letter]))\n passed++;\n }\n }\n\n if (checked === passed)\n return data;\n },\n paletteUpperCase(palette) {\n return palette.map(c => c.toUpperCase());\n },\n isTransparent(color) {\n return tinycolor(color).getAlpha() === 0;\n },\n },\n};\n\nexport { colorMixin as default };\n","import { openBlock, createElementBlock, withDirectives, createElementVNode, vModelText, toDisplayString } from 'vue';\nimport { s as styleInject } from '../../style-inject.es-746bb8ed.js';\nimport { install } from '../../utils/compoent.js';\nimport '../../defaultConfig.js';\n\nvar script = {\n name: 'EditableInput',\n props: {\n label: String,\n labelText: String,\n desc: String,\n value: [String, Number],\n max: Number,\n min: Number,\n arrowOffset: {\n type: Number,\n default: 1,\n },\n },\n computed: {\n val: {\n get() {\n return this.value;\n },\n set(v) {\n // TODO: min\n if (!(this.max === undefined) && +v > this.max)\n this.$refs.input.value = this.max;\n else\n return v;\n },\n },\n labelId() {\n return `input__label__${this.label}__${Math.random().toString().slice(2, 5)}`;\n },\n labelSpanText() {\n return this.labelText || this.label;\n },\n },\n methods: {\n update(e) {\n this.handleChange(e.target.value);\n },\n handleChange(newVal) {\n const data = {};\n data[this.label] = newVal;\n if (data.hex === undefined && data['#'] === undefined)\n this.$emit('change', data);\n else if (newVal.length > 5)\n this.$emit('change', data);\n },\n // **** unused\n // handleBlur (e) {\n // console.log(e)\n // },\n handleKeyDown(e) {\n let { val } = this;\n const number = Number(val);\n\n if (number) {\n const amount = this.arrowOffset || 1;\n\n // Up\n if (e.keyCode === 38) {\n val = number + amount;\n this.handleChange(val);\n e.preventDefault();\n }\n\n // Down\n if (e.keyCode === 40) {\n val = number - amount;\n this.handleChange(val);\n e.preventDefault();\n }\n }\n },\n // **** unused\n // handleDrag (e) {\n // console.log(e)\n // },\n // handleMouseDown (e) {\n // console.log(e)\n // }\n },\n};\n\nconst _hoisted_1 = { class: \"vc-editable-input\" };\nconst _hoisted_2 = [\"aria-labelledby\"];\nconst _hoisted_3 = [\"id\", \"for\"];\nconst _hoisted_4 = { class: \"vc-input__desc\" };\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (openBlock(), createElementBlock(\"div\", _hoisted_1, [\n withDirectives(createElementVNode(\"input\", {\n ref: \"input\",\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($options.val) = $event)),\n \"aria-labelledby\": $options.labelId,\n class: \"vc-input__input\",\n onKeydown: _cache[1] || (_cache[1] = (...args) => ($options.handleKeyDown && $options.handleKeyDown(...args))),\n onInput: _cache[2] || (_cache[2] = (...args) => ($options.update && $options.update(...args)))\n }, null, 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_2), [\n [vModelText, $options.val]\n ]),\n createElementVNode(\"span\", {\n id: $options.labelId,\n for: $props.label,\n class: \"vc-input__label\"\n }, toDisplayString($options.labelSpanText), 9 /* TEXT, PROPS */, _hoisted_3),\n createElementVNode(\"span\", _hoisted_4, toDisplayString($props.desc), 1 /* TEXT */)\n ]))\n}\n\nvar css_248z = \".vc-editable-input{position:relative}.vc-input__input{border:0;outline:none;padding:0}.vc-input__label{text-transform:capitalize}\";\nstyleInject(css_248z);\n\nscript.render = render;\nscript.__file = \"src/components/editable-input/editable-input.vue\";\n\nscript.install = install;\n\nexport { script as default };\n","function clamp(value, min, max) {\n return min < max\n ? (value < min ? min : value > max ? max : value)\n : (value < max ? max : value > min ? min : value);\n}\n\nexport { clamp };\n","import { clamp } from '../../utils/utils.js';\nimport { openBlock, createElementBlock, normalizeStyle, createElementVNode } from 'vue';\nimport { s as styleInject } from '../../style-inject.es-746bb8ed.js';\nimport { install } from '../../utils/compoent.js';\nimport '../../defaultConfig.js';\n\nvar script = {\n name: 'Saturation',\n props: {\n value: Object,\n },\n computed: {\n colors() {\n return this.value;\n },\n bgColor() {\n return `hsl(${this.colors.hsv.h}, 100%, 50%)`;\n },\n pointerTop() {\n return `${(-(this.colors.hsv.v * 100) + 1) + 100}%`;\n },\n pointerLeft() {\n return `${this.colors.hsv.s * 100}%`;\n },\n },\n methods: {\n handleChange(e, skip) {\n !skip && e.preventDefault();\n const { container } = this.$refs;\n if (!container) {\n // for some edge cases, container may not exist. see #220\n return;\n }\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n const xOffset = container.getBoundingClientRect().left + window.pageXOffset;\n const yOffset = container.getBoundingClientRect().top + window.pageYOffset;\n const pageX = e.pageX || (e.touches ? e.touches[0].pageX : 0);\n const pageY = e.pageY || (e.touches ? e.touches[0].pageY : 0);\n const left = clamp(pageX - xOffset, 0, containerWidth);\n const top = clamp(pageY - yOffset, 0, containerHeight);\n const saturation = left / containerWidth;\n const bright = clamp(-(top / containerHeight) + 1, 0, 1);\n\n this.onChange({\n h: this.colors.hsv.h,\n s: saturation,\n v: bright,\n a: this.colors.hsv.a,\n source: 'hsva',\n });\n },\n onChange(param) {\n this.$emit('change', param);\n },\n handleMouseDown(e) {\n // this.handleChange(e, true)\n window.addEventListener('mousemove', this.handleChange);\n window.addEventListener('mouseup', this.handleChange);\n window.addEventListener('mouseup', this.handleMouseUp);\n },\n handleMouseUp(e) {\n this.unbindEventListeners();\n },\n unbindEventListeners() {\n window.removeEventListener('mousemove', this.handleChange);\n window.removeEventListener('mouseup', this.handleChange);\n window.removeEventListener('mouseup', this.handleMouseUp);\n },\n },\n};\n\nconst _hoisted_1 = /*#__PURE__*/createElementVNode(\"div\", { class: \"vc-saturation--white\" }, null, -1 /* HOISTED */);\nconst _hoisted_2 = /*#__PURE__*/createElementVNode(\"div\", { class: \"vc-saturation--black\" }, null, -1 /* HOISTED */);\nconst _hoisted_3 = /*#__PURE__*/createElementVNode(\"div\", { class: \"vc-saturation-circle\" }, null, -1 /* HOISTED */);\nconst _hoisted_4 = [\n _hoisted_3\n];\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (openBlock(), createElementBlock(\"div\", {\n ref: \"container\",\n class: \"vc-saturation\",\n style: normalizeStyle({ background: $options.bgColor }),\n onMousedown: _cache[0] || (_cache[0] = (...args) => ($options.handleMouseDown && $options.handleMouseDown(...args))),\n onTouchmove: _cache[1] || (_cache[1] = (...args) => ($options.handleChange && $options.handleChange(...args))),\n onTouchstart: _cache[2] || (_cache[2] = (...args) => ($options.handleChange && $options.handleChange(...args)))\n }, [\n _hoisted_1,\n _hoisted_2,\n createElementVNode(\"div\", {\n class: \"vc-saturation-pointer\",\n style: normalizeStyle({ top: $options.pointerTop, left: $options.pointerLeft })\n }, _hoisted_4, 4 /* STYLE */)\n ], 36 /* STYLE, HYDRATE_EVENTS */))\n}\n\nvar css_248z = \".vc-saturation,.vc-saturation--black,.vc-saturation--white{bottom:0;cursor:pointer;left:0;position:absolute;right:0;top:0}.vc-saturation--white{background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.vc-saturation--black{background:linear-gradient(0deg,#000,transparent)}.vc-saturation-pointer{cursor:pointer;position:absolute}.vc-saturation-circle{border-radius:50%;box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);cursor:head;height:4px;transform:translate(-2px,-2px);width:4px}\";\nstyleInject(css_248z);\n\nscript.render = render;\nscript.__file = \"src/components/saturation/saturation.vue\";\n\nscript.install = install;\n\nexport { script as default };\n","import { openBlock, createElementBlock, normalizeClass, createElementVNode, normalizeStyle } from 'vue';\nimport { s as styleInject } from '../../style-inject.es-746bb8ed.js';\nimport { install } from '../../utils/compoent.js';\nimport '../../defaultConfig.js';\n\nvar script = {\n name: 'Hue',\n props: {\n value: Object,\n direction: {\n type: String,\n // [horizontal | vertical]\n default: 'horizontal',\n },\n },\n data() {\n return {\n oldHue: 0,\n pullDirection: '',\n };\n },\n computed: {\n colors() {\n return this.value;\n },\n directionClass() {\n return {\n 'vc-hue--horizontal': this.direction === 'horizontal',\n 'vc-hue--vertical': this.direction === 'vertical',\n };\n },\n pointerTop() {\n if (this.direction === 'vertical') {\n if (this.colors.hsl.h === 0 && this.pullDirection === 'right')\n return 0;\n return `${-((this.colors.hsl.h * 100) / 360) + 100}%`;\n }\n return 0;\n },\n pointerLeft() {\n if (this.direction === 'vertical')\n return 0;\n\n if (this.colors.hsl.h === 0 && this.pullDirection === 'right')\n return '100%';\n return `${(this.colors.hsl.h * 100) / 360}%`;\n },\n },\n watch: {\n value: {\n handler(value, oldVal) {\n const { h } = value.hsl;\n if (h !== 0 && h - this.oldHue > 0)\n this.pullDirection = 'right';\n if (h !== 0 && h - this.oldHue < 0)\n this.pullDirection = 'left';\n this.oldHue = h;\n },\n deep: true,\n immediate: true,\n },\n },\n methods: {\n handleChange(e, skip) {\n !skip && e.preventDefault();\n\n const { container } = this.$refs;\n if (!container) {\n // for some edge cases, container may not exist. see #220\n return;\n }\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n const xOffset = container.getBoundingClientRect().left + window.pageXOffset;\n const yOffset = container.getBoundingClientRect().top + window.pageYOffset;\n const pageX = e.pageX || (e.touches ? e.touches[0].pageX : 0);\n const pageY = e.pageY || (e.touches ? e.touches[0].pageY : 0);\n const left = pageX - xOffset;\n const top = pageY - yOffset;\n\n let h;\n let percent;\n\n if (this.direction === 'vertical') {\n if (top < 0) {\n h = 360;\n }\n else if (top > containerHeight) {\n h = 0;\n }\n else {\n percent = -(top * 100 / containerHeight) + 100;\n h = (360 * percent / 100);\n }\n\n if (this.colors.hsl.h !== h) {\n this.$emit('change', {\n h,\n s: this.colors.hsl.s,\n l: this.colors.hsl.l,\n a: this.colors.hsl.a,\n source: 'hsl',\n });\n }\n }\n else {\n if (left < 0) {\n h = 0;\n }\n else if (left > containerWidth) {\n h = 360;\n }\n else {\n percent = left * 100 / containerWidth;\n h = (360 * percent / 100);\n }\n\n if (this.colors.hsl.h !== h) {\n this.$emit('change', {\n h,\n s: this.colors.hsl.s,\n l: this.colors.hsl.l,\n a: this.colors.hsl.a,\n source: 'hsl',\n });\n }\n }\n },\n handleMouseDown(e) {\n this.handleChange(e, true);\n window.addEventListener('mousemove', this.handleChange);\n window.addEventListener('mouseup', this.handleChange);\n window.addEventListener('mouseup', this.handleMouseUp);\n },\n handleMouseUp(e) {\n this.unbindEventListeners();\n },\n unbindEventListeners() {\n window.removeEventListener('mousemove', this.handleChange);\n window.removeEventListener('mouseup', this.handleChange);\n window.removeEventListener('mouseup', this.handleMouseUp);\n },\n },\n};\n\nconst _hoisted_1 = [\"aria-valuenow\"];\nconst _hoisted_2 = /*#__PURE__*/createElementVNode(\"div\", { class: \"vc-hue-picker\" }, null, -1 /* HOISTED */);\nconst _hoisted_3 = [\n _hoisted_2\n];\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\"vc-hue\", [$options.directionClass]])\n }, [\n createElementVNode(\"div\", {\n ref: \"container\",\n class: \"vc-hue-container\",\n role: \"slider\",\n \"aria-valuenow\": $options.colors.hsl.h,\n \"aria-valuemin\": \"0\",\n \"aria-valuemax\": \"360\",\n onMousedown: _cache[0] || (_cache[0] = (...args) => ($options.handleMouseDown && $options.handleMouseDown(...args))),\n onTouchmove: _cache[1] || (_cache[1] = (...args) => ($options.handleChange && $options.handleChange(...args))),\n onTouchstart: _cache[2] || (_cache[2] = (...args) => ($options.handleChange && $options.handleChange(...args)))\n }, [\n createElementVNode(\"div\", {\n class: \"vc-hue-pointer\",\n style: normalizeStyle({ top: $options.pointerTop, left: $options.pointerLeft }),\n role: \"presentation\"\n }, _hoisted_3, 4 /* STYLE */)\n ], 40 /* PROPS, HYDRATE_EVENTS */, _hoisted_1)\n ], 2 /* CLASS */))\n}\n\nvar css_248z = \".vc-hue{border-radius:2px;bottom:0;left:0;position:absolute;right:0;top:0}.vc-hue--horizontal{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.vc-hue--vertical{background:linear-gradient(0deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.vc-hue-container{cursor:pointer;height:100%;margin:0 2px;position:relative}.vc-hue-pointer{position:absolute;z-index:2}.vc-hue-picker{background:#fff;border-radius:1px;box-shadow:0 0 2px rgba(0,0,0,.6);cursor:pointer;height:8px;margin-top:1px;transform:translateX(-2px);width:4px}\";\nstyleInject(css_248z);\n\nscript.render = render;\nscript.__file = \"src/components/hue/hue.vue\";\n\nscript.install = install;\n\nexport { script as default };\n","import colorMixin from '../../mixin/color.js';\nimport script$4 from '../editable-input/index.js';\nimport script$1 from '../saturation/index.js';\nimport script$2 from '../hue/index.js';\nimport script$3 from '../alpha/index.js';\nimport script$5 from '../checkboard/index.js';\nimport { resolveComponent, openBlock, createElementBlock, normalizeClass, createElementVNode, createVNode, createCommentVNode, normalizeStyle, Fragment, renderList } from 'vue';\nimport { s as styleInject } from '../../style-inject.es-746bb8ed.js';\nimport { install } from '../../utils/compoent.js';\nimport '@ctrl/tinycolor';\nimport '../../defaultConfig.js';\nimport '../../utils/utils.js';\n\nconst presetColors = [\n '#D0021B', '#F5A623', '#F8E71C', '#8B572A', '#7ED321',\n '#417505', '#BD10E0', '#9013FE', '#4A90E2', '#50E3C2',\n '#B8E986', '#000000', '#4A4A4A', '#9B9B9B', '#FFFFFF',\n 'rgba(0,0,0,0)',\n];\n\nvar script = {\n name: 'Sketch',\n components: {\n Saturation: script$1,\n Hue: script$2,\n Alpha: script$3,\n EdIn: script$4,\n Checkboard: script$5,\n },\n mixins: [colorMixin],\n props: {\n presetColors: {\n type: Array,\n default() {\n return presetColors;\n },\n },\n disableAlpha: {\n type: Boolean,\n default: false,\n },\n disableFields: {\n type: Boolean,\n default: false,\n },\n },\n computed: {\n hex() {\n let hex;\n if (this.colors.a < 1)\n hex = this.colors.hex8;\n else\n hex = this.colors.hex;\n\n return hex.replace('#', '');\n },\n activeColor() {\n const { rgba } = this.colors;\n return `rgba(${[rgba.r, rgba.g, rgba.b, rgba.a].join(',')})`;\n },\n },\n methods: {\n handlePreset(c) {\n this.colorChange(c);\n },\n childChange(data) {\n this.colorChange(data);\n },\n inputChange(data) {\n if (!data)\n return;\n\n if (data.hex) {\n this.isValidHex(data.hex) && this.colorChange({\n hex: data.hex,\n source: 'hex',\n });\n }\n else if (data.r || data.g || data.b || data.a) {\n this.colorChange({\n r: data.r || this.colors.rgba.r,\n g: data.g || this.colors.rgba.g,\n b: data.b || this.colors.rgba.b,\n a: data.a || this.colors.rgba.a,\n source: 'rgba',\n });\n }\n },\n },\n};\n\nconst _hoisted_1 = { class: \"vc-sketch-saturation-wrap\" };\nconst _hoisted_2 = { class: \"vc-sketch-controls\" };\nconst _hoisted_3 = { class: \"vc-sketch-sliders\" };\nconst _hoisted_4 = { class: \"vc-sketch-hue-wrap\" };\nconst _hoisted_5 = {\n key: 0,\n class: \"vc-sketch-alpha-wrap\"\n};\nconst _hoisted_6 = { class: \"vc-sketch-color-wrap\" };\nconst _hoisted_7 = [\"aria-label\"];\nconst _hoisted_8 = {\n key: 0,\n class: \"vc-sketch-field\"\n};\nconst _hoisted_9 = { class: \"vc-sketch-field--double\" };\nconst _hoisted_10 = { class: \"vc-sketch-field--single\" };\nconst _hoisted_11 = { class: \"vc-sketch-field--single\" };\nconst _hoisted_12 = { class: \"vc-sketch-field--single\" };\nconst _hoisted_13 = {\n key: 0,\n class: \"vc-sketch-field--single\"\n};\nconst _hoisted_14 = {\n class: \"vc-sketch-presets\",\n role: \"group\",\n \"aria-label\": \"A color preset, pick one to set as current color\"\n};\nconst _hoisted_15 = [\"aria-label\", \"onClick\"];\nconst _hoisted_16 = [\"aria-label\", \"onClick\"];\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_Saturation = resolveComponent(\"Saturation\");\n const _component_Hue = resolveComponent(\"Hue\");\n const _component_Alpha = resolveComponent(\"Alpha\");\n const _component_Checkboard = resolveComponent(\"Checkboard\");\n const _component_EdIn = resolveComponent(\"EdIn\");\n\n return (openBlock(), createElementBlock(\"div\", {\n role: \"application\",\n \"aria-label\": \"Sketch color picker\",\n class: normalizeClass([\"vc-sketch\", [$props.disableAlpha ? 'vc-sketch__disable-alpha' : '']])\n }, [\n createElementVNode(\"div\", _hoisted_1, [\n createVNode(_component_Saturation, {\n value: _ctx.colors,\n onChange: $options.childChange\n }, null, 8 /* PROPS */, [\"value\", \"onChange\"])\n ]),\n createElementVNode(\"div\", _hoisted_2, [\n createElementVNode(\"div\", _hoisted_3, [\n createElementVNode(\"div\", _hoisted_4, [\n createVNode(_component_Hue, {\n value: _ctx.colors,\n onChange: $options.childChange\n }, null, 8 /* PROPS */, [\"value\", \"onChange\"])\n ]),\n (!$props.disableAlpha)\n ? (openBlock(), createElementBlock(\"div\", _hoisted_5, [\n createVNode(_component_Alpha, {\n value: _ctx.colors,\n onChange: $options.childChange\n }, null, 8 /* PROPS */, [\"value\", \"onChange\"])\n ]))\n : createCommentVNode(\"v-if\", true)\n ]),\n createElementVNode(\"div\", _hoisted_6, [\n createElementVNode(\"div\", {\n \"aria-label\": `Current color is ${$options.activeColor}`,\n class: \"vc-sketch-active-color\",\n style: normalizeStyle({ background: $options.activeColor })\n }, null, 12 /* STYLE, PROPS */, _hoisted_7),\n createVNode(_component_Checkboard)\n ])\n ]),\n (!$props.disableFields)\n ? (openBlock(), createElementBlock(\"div\", _hoisted_8, [\n createCommentVNode(\" rgba \"),\n createElementVNode(\"div\", _hoisted_9, [\n createVNode(_component_EdIn, {\n label: \"hex\",\n value: $options.hex,\n onChange: $options.inputChange\n }, null, 8 /* PROPS */, [\"value\", \"onChange\"])\n ]),\n createElementVNode(\"div\", _hoisted_10, [\n createVNode(_component_EdIn, {\n label: \"r\",\n value: _ctx.colors.rgba.r,\n onChange: $options.inputChange\n }, null, 8 /* PROPS */, [\"value\", \"onChange\"])\n ]),\n createElementVNode(\"div\", _hoisted_11, [\n createVNode(_component_EdIn, {\n label: \"g\",\n value: _ctx.colors.rgba.g,\n onChange: $options.inputChange\n }, null, 8 /* PROPS */, [\"value\", \"onChange\"])\n ]),\n createElementVNode(\"div\", _hoisted_12, [\n createVNode(_component_EdIn, {\n label: \"b\",\n value: _ctx.colors.rgba.b,\n onChange: $options.inputChange\n }, null, 8 /* PROPS */, [\"value\", \"onChange\"])\n ]),\n (!$props.disableAlpha)\n ? (openBlock(), createElementBlock(\"div\", _hoisted_13, [\n createVNode(_component_EdIn, {\n label: \"a\",\n value: _ctx.colors.a,\n \"arrow-offset\": 0.01,\n max: 1,\n onChange: $options.inputChange\n }, null, 8 /* PROPS */, [\"value\", \"arrow-offset\", \"onChange\"])\n ]))\n : createCommentVNode(\"v-if\", true)\n ]))\n : createCommentVNode(\"v-if\", true),\n createElementVNode(\"div\", _hoisted_14, [\n (openBlock(true), createElementBlock(Fragment, null, renderList($props.presetColors, (c) => {\n return (openBlock(), createElementBlock(Fragment, null, [\n (!_ctx.isTransparent(c))\n ? (openBlock(), createElementBlock(\"div\", {\n key: `!${c}`,\n class: \"vc-sketch-presets-color\",\n \"aria-label\": `Color:${c}`,\n style: normalizeStyle({ background: c }),\n onClick: $event => ($options.handlePreset(c))\n }, null, 12 /* STYLE, PROPS */, _hoisted_15))\n : (openBlock(), createElementBlock(\"div\", {\n key: c,\n \"aria-label\": `Color:${c}`,\n class: \"vc-sketch-presets-color\",\n onClick: $event => ($options.handlePreset(c))\n }, [\n createVNode(_component_Checkboard)\n ], 8 /* PROPS */, _hoisted_16))\n ], 64 /* STABLE_FRAGMENT */))\n }), 256 /* UNKEYED_FRAGMENT */))\n ])\n ], 2 /* CLASS */))\n}\n\nvar css_248z = \".vc-sketch{background:#fff;border-radius:4px;box-shadow:0 0 0 1px rgba(0,0,0,.15),0 8px 16px rgba(0,0,0,.15);box-sizing:initial;padding:10px 10px 0;position:relative;width:200px}.vc-sketch-saturation-wrap{overflow:hidden;padding-bottom:75%;position:relative;width:100%}.vc-sketch-controls{display:flex}.vc-sketch-sliders{flex:1;padding:4px 0}.vc-sketch-sliders .vc-alpha-gradient,.vc-sketch-sliders .vc-hue{border-radius:2px}.vc-sketch-alpha-wrap,.vc-sketch-hue-wrap{height:10px;position:relative}.vc-sketch-alpha-wrap{margin-top:4px;overflow:hidden}.vc-sketch-color-wrap{border-radius:3px;height:24px;margin-left:4px;margin-top:4px;position:relative;width:24px}.vc-sketch-active-color{border-radius:2px;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.15),inset 0 0 4px rgba(0,0,0,.25);left:0;position:absolute;right:0;top:0;z-index:2}.vc-sketch-color-wrap .vc-checkerboard{background-size:auto}.vc-sketch-field{display:flex;padding-top:4px}.vc-sketch-field .vc-input__input{border:none;box-shadow:inset 0 0 0 1px #ccc;font-size:10px;padding:4px 0 3px 10%;width:90%}.vc-sketch-field .vc-input__label{color:#222;display:block;font-size:11px;padding-bottom:4px;padding-top:3px;text-align:center;text-transform:capitalize}.vc-sketch-field--single{flex:1;padding-left:6px}.vc-sketch-field--double{flex:2}.vc-sketch-presets{border-top:1px solid #eee;margin-left:-10px;margin-right:-10px;padding-left:10px;padding-top:10px}.vc-sketch-presets-color{cursor:pointer;display:inline-block;height:16px;margin:0 10px 10px 0;overflow:hidden;position:relative;vertical-align:top;width:16px}.vc-sketch-presets-color,.vc-sketch-presets-color .vc-checkerboard{border-radius:3px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.15)}.vc-sketch__disable-alpha .vc-sketch-color-wrap{height:10px}\";\nstyleInject(css_248z);\n\nscript.render = render;\nscript.__file = \"src/components/sketch/sketch.vue\";\n\nscript.install = install;\n\nexport { script as default };\n","\n\n","\n\n\n","\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n","\n\n","\n\n\n","\n","\n\n","\n\n\n\n","\n\n\n","import { createRouter, createWebHistory } from 'vue-router'\nimport type { RouteLocationNormalized } from 'vue-router'\n\nimport LandingView from '@/views/Landing.vue'\nimport Dashboard from '@/views/Dashboard.vue'\nimport ProjectSelection from '@/views/ProjectSelection.vue'\nimport Benchmark from '@/views/Benchmark.vue'\nimport NotFound from '@/views/NotFound.vue'\nimport TestZone from '@/views/TestZone.vue'\nimport ReportPage from '@/views/ReportPage.vue'\n\n\nimport LoginComponent from '@/components/SpeckleLogin.vue'\n\nimport { useSpeckleStore } from '@/stores/speckle'\nimport { logMessageToSentry } from '@/utils/monitoring'\nimport { useSettingsStore } from '@/stores/settings'\nimport { useNavigationStore } from '@/stores/navigation'\n\n/**\n * The router instance for the application.\n */\nconst router = createRouter({\n history: createWebHistory(import.meta.env.BASE_URL),\n routes: [\n {\n path: '/',\n name: 'Landing',\n component: LandingView,\n meta: {\n requiresAuth: false,\n title: 'Landing',\n icon: '',\n },\n },\n {\n path: '/login',\n name: 'Login',\n component: LoginComponent,\n meta: {\n requiresAuth: false,\n title: 'Login',\n icon: '',\n },\n },\n {\n path: '/dashboard',\n name: 'Dashboard',\n component: Dashboard,\n meta: {\n requiresAuth: true,\n title: 'Dashboard',\n icon: '',\n },\n },\n {\n path: '/projects',\n name: 'Projects',\n component: ProjectSelection,\n meta: {\n requiresAuth: true,\n title: 'Project Selection',\n icon: '',\n },\n },\n {\n path: '/benchmark',\n name: 'Benchmark',\n component: Benchmark,\n meta: {\n requiresAuth: true,\n title: 'Benchmark',\n icon: '',\n },\n },\n {\n path: '/report',\n name: 'Report',\n component: ReportPage,\n meta: {\n requiresAuth: true,\n title: 'Report',\n icon: '',\n },\n },\n {\n path: '/:catchAll(.*)', // Wildcard for missing routes.\n name: 'NotFound', // 404 page.\n component: NotFound,\n meta: {\n requiresAuth: false,\n title: 'Not Found',\n icon: '',\n },\n },\n {\n path: '/test',\n name: 'Test',\n component: TestZone,\n meta: {\n requiresAuth: false,\n title: 'Test',\n icon: '',\n },\n },\n ],\n})\n\n/**\n * A navigation guard function that is executed before each route navigation.\n * It handles the exchange of access codes, updates the user information, and checks for authentication.\n *\n * @param to - The target route location.\n * @returns A route object indicating the next route to navigate to.\n */\nconst beforeEachGuard = async (to: RouteLocationNormalized) => {\n const speckleStore = useSpeckleStore()\n const settingsStore = useSettingsStore()\n const navigationStore = useNavigationStore()\n\n if (to.query.access_code) {\n // If the route contains an access code, exchange it.\n let accessCode: string\n if (Array.isArray(to.query.access_code) && to.query.access_code[0] != null) {\n accessCode = to.query.access_code[0].toString()\n }\n else {\n accessCode = to.query.access_code.toString()\n }\n\n // If the access code is not set, return to the home page.\n await speckleStore.exchangeAccessCodes(accessCode)\n .then(() => {\n logMessageToSentry('Access code exchange was successful', 'info');\n return { name: 'Projects' }\n })\n .catch(() => {\n logMessageToSentry('Access code exchange failed', 'warning');\n return { name: 'Home' }\n });\n }\n // Fetch if the user is authenticated.\n await speckleStore.updateUser().then(() => {\n logMessageToSentry(\"Updated current user to: \" + speckleStore.getUserInfo?.name, 'info');\n }).then(() => {\n // If the route requires authentication and the user is not authenticated, return to the login page.\n if (to.meta.requiresAuth && !speckleStore.isAuthenticated) {\n if (settingsStore.keySettings.speckleConfig.id == undefined || settingsStore.keySettings.speckleConfig.secret == undefined) {\n console.log(\"Speckle credentials are not set, redirecting to project.\")\n navigationStore.toggleSettingsModal()\n return { name: 'Projects' }\n } else {\n //logMessageToSentry(\"User is not authenticated, but the route required it.\", 'warning')\n console.log(\"User is not authenticated, but the route required it and keys exists.\")\n speckleStore.login()\n return { name: 'Login' }\n }\n }\n return true\n })\n}\n\nrouter.beforeEach(beforeEachGuard)\n\nexport default router","export const clickOutsideDirective = {\n beforeMount(element, binding) {\n element.clickOutsideEvent = function (event) {\n if (!(element === event.target || element.contains(event.target))) {\n binding.value(event)\n }\n }\n document.addEventListener('click', element.clickOutsideEvent, true)\n },\n unmounted(element) {\n document.removeEventListener('click', element.clickOutsideEvent, true)\n },\n}\n","/**\n * Entry point of the application.\n * Initializes the Vue app, Pinia store, router, and mounts the app to the DOM.\n */\n\nimport { createApp } from 'vue'\nimport { createPinia } from 'pinia'\nimport piniaPluginPersistedstate from 'pinia-plugin-persistedstate'\n\nimport App from './App.vue'\nimport router from './router'\nimport * as Sentry from '@sentry/vue'\nimport { initializeFirebase } from '@/firebase'\n\nimport './index.css'\nimport type { Vue } from '@sentry/vue/types/types'\n\nimport { clickOutsideDirective } from '@/directives/clickDirectives'\n\n// Create the Vue 3 application.\nconst app = createApp(App)\n\n// Initialize Sentry for application-wide\n// error monitoring and performance tracking.\nSentry.init({\n app,\n // dsn: import.meta.env.VITE_SENTRY_DSN,\n debug: false, // TODO Set this to `false` for production\n attachStacktrace: true,\n integrations: [\n new Sentry.BrowserTracing({\n // TODO Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled\n tracePropagationTargets: ['localhost', /^https:\\/\\/yourserver\\.io\\/api/],\n routingInstrumentation: Sentry.vueRouterInstrumentation(router)\n }),\n new Sentry.Replay({\n // Additional SDK configuration:\n maskAllText: true,\n blockAllMedia: true\n })\n ],\n // Performance (set appropriately for production.)\n tracesSampleRate: 0.1, // Capture 100% of transactions\n replaysSessionSampleRate: 0.5, // Change the sample rate to 100% while in development and then sample at a lower rate in production.\n replaysOnErrorSampleRate: 1.0 // If you're not already sampling the entire session, change the sample rate to 100% when sampling sessions where errors occur.\n})\n\n/**\n * Configures global error handling for Vue application.\n * @param {Vue} app - The Vue 3 application instance.\n */\nexport function configureGlobalErrorHandling(app: Vue) {\n app.config.errorHandler = (err: any, vm: any, info: any) => {\n Sentry.captureException(err, {\n extra: { info }\n })\n console.error(`Error: ${err}, Info: ${info}`)\n }\n}\n\n// Setup our Pinia store, and initialize the router.\nconst pinia = createPinia()\npinia.use(piniaPluginPersistedstate)\n\napp.use(pinia)\napp.use(router)\n\n// Create directives\napp.directive('click-outside' ,clickOutsideDirective)\n\n// Mount the app.\napp.mount('#app')\n\ninitializeFirebase()\n\nexport default app\n"],"file":"assets/index-8914f15f.js"} \ No newline at end of file diff --git a/assets/index-d194e655.css b/assets/index-d194e655.css new file mode 100644 index 0000000..3ba0897 --- /dev/null +++ b/assets/index-d194e655.css @@ -0,0 +1 @@ +@keyframes v-pacmanStretchDelay{75%{-webkit-opacity:.7;opacity:.7}to{transform:translate(-200px,-6.25px)}}.fade-enter-active[data-v-77df4156],.fade-leave-active[data-v-77df4156]{transition:opacity .2s}.fade-enter-from[data-v-77df4156],.fade-leave-to[data-v-77df4156]{opacity:0}.ghost[data-v-6171bc79]{opacity:.5}.rect-stacked{cursor:pointer}.tooltip{pointer-events:none;position:absolute;background-color:#fff;border:1px solid gray;padding:10px;border-radius:5px;opacity:0;transition:opacity .2s}.a4-print[data-v-8a7c709b]{width:210mm;margin:0 auto;box-sizing:border-box}@media print{.viewer-container[data-v-8a7c709b]{height:auto;overflow:hidden}.graphs-container[data-v-8a7c709b],.table-container[data-v-8a7c709b],.editable-text-container[data-v-8a7c709b]{page-break-inside:avoid}.a4-print[data-v-8a7c709b]{display:block}}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}[type=text],input:where(:not([type])),[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow: 0 0 #0000}[type=text]:focus,input:where(:not([type])):focus,[type=email]:focus,[type=url]:focus,[type=password]:focus,[type=number]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=month]:focus,[type=search]:focus,[type=tel]:focus,[type=time]:focus,[type=week]:focus,[multiple]:focus,textarea:focus,select:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow: 0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 2px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:hover,[type=checkbox]:checked:focus,[type=radio]:checked:hover,[type=radio]:checked:focus{border-color:transparent;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}@media (forced-colors: active){[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:hover,[type=checkbox]:indeterminate:focus{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.-inset-0\.5{top:-.125rem;right:-.125rem;bottom:-.125rem;left:-.125rem}.-inset-1\.5{top:-.375rem;right:-.375rem;bottom:-.375rem;left:-.375rem}.-inset-2\.5{top:-.625rem;right:-.625rem;bottom:-.625rem;left:-.625rem}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.inset-y-16{top:4rem;bottom:4rem}.-left-80{left:-20rem}.-right-2{right:-.5rem}.-right-8{right:-2rem}.-top-56{top:-14rem}.bottom-0{bottom:0}.bottom-4{bottom:1rem}.left-0{left:0}.left-1{left:.25rem}.left-1\/2{left:50%}.left-1\/3{left:33.333333%}.left-2{left:.5rem}.left-4{left:1rem}.left-\[12\.5\%\]{left:12.5%}.left-\[40\%\]{left:40%}.right-0{right:0}.right-4{right:1rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-10{top:2.5rem}.top-4{top:1rem}.isolate{isolation:isolate}.-z-10{z-index:-10}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[9999\]{z-index:9999}.col-span-1{grid-column:span 1 / span 1}.-m-2{margin:-.5rem}.m-1{margin:.25rem}.m-2{margin:.5rem}.m-3{margin:.75rem}.mx-auto{margin-left:auto;margin-right:auto}.-mb-6{margin-bottom:-1.5rem}.-ml-1{margin-left:-.25rem}.-ml-px{margin-left:-1px}.-mr-1{margin-right:-.25rem}.-mr-px{margin-right:-1px}.-mt-px{margin-top:-1px}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.mr-10{margin-right:2.5rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mr-6{margin-right:1.5rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mt-16{margin-top:4rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-36{margin-top:9rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.size-6{width:1.5rem;height:1.5rem}.h-1\/3{height:33.333333%}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[20vh\]{height:20vh}.h-\[33vh\]{height:33vh}.h-\[55vh\]{height:55vh}.h-\[calc\(100vh-12rem\)\]{height:calc(100vh - 12rem)}.h-\[calc\(100vh-4rem\)\]{height:calc(100vh - 4rem)}.h-full{height:100%}.h-min{height:-moz-min-content;height:min-content}.h-screen{height:100vh}.max-h-2{max-height:.5rem}.max-h-60{max-height:15rem}.max-h-8{max-height:2rem}.max-h-80{max-height:20rem}.max-h-full{max-height:100%}.max-h-screen{max-height:100vh}.min-h-12{min-height:3rem}.min-h-full{min-height:100%}.w-0{width:0px}.w-1{width:.25rem}.w-1\/12{width:8.333333%}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-1\/6{width:16.666667%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-11\/12{width:91.666667%}.w-2\/3{width:66.666667%}.w-2\/5{width:40%}.w-2\/6{width:33.333333%}.w-24{width:6rem}.w-3{width:.75rem}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-3\/6{width:50%}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-5\/6{width:83.333333%}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-\[68\.5625rem\]{width:68.5625rem}.w-\[76rem\]{width:76rem}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.min-w-52{min-width:13rem}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.table-auto{table-layout:auto}.table-fixed{table-layout:fixed}.origin-top-left{transform-origin:top left}.origin-top-right{transform-origin:top right}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x: 1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-4{--tw-translate-y: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.columns-2{-moz-columns:2;columns:2}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-items-center{justify-items:center}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-1{row-gap:.25rem}.gap-y-16{row-gap:4rem}.gap-y-5{row-gap:1.25rem}.gap-y-8{row-gap:2rem}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(2.5rem * var(--tw-space-x-reverse));margin-left:calc(2.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(3rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem * var(--tw-space-y-reverse))}.space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(243 244 246 / var(--tw-divide-opacity, 1))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(209 213 219 / var(--tw-divide-opacity, 1))}.place-self-center{place-self:center}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-bl-lg{border-bottom-left-radius:.5rem}.rounded-br-lg{border-bottom-right-radius:.5rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-400{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.border-gray-900\/10{border-color:#1118271a}.border-gray-900\/5{border-color:#1118270d}.border-green-500{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.border-neutral-400{--tw-border-opacity: 1;border-color:rgb(163 163 163 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-opacity-50{--tw-border-opacity: .5}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-gray-900\/10{background-color:#1118271a}.bg-gray-900\/5{background-color:#1118270d}.bg-gray-900\/90{background-color:#111827e6}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-300{--tw-bg-opacity: 1;background-color:rgb(134 239 172 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-red-300{--tw-bg-opacity: 1;background-color:rgb(252 165 165 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-opacity-10{--tw-bg-opacity: .1}.bg-opacity-75{--tw-bg-opacity: .75}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-\[\#0066CC\]{--tw-gradient-from: #0066CC var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 102 204 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-\[\#009999\]{--tw-gradient-from: #009999 var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 153 153 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-\[\#CCE5FF\]{--tw-gradient-to: #CCE5FF var(--tw-gradient-to-position)}.to-\[\#CCFFFF\]{--tw-gradient-to: #CCFFFF var(--tw-gradient-to-position)}.stroke-green-200{stroke:#bbf7d0}.object-bottom{-o-object-position:bottom;object-position:bottom}.p-0{padding:0}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-20{padding-left:5rem;padding-right:5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-36{padding-top:9rem;padding-bottom:9rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-60{padding-top:15rem;padding-bottom:15rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-12{padding-bottom:3rem}.pb-2{padding-bottom:.5rem}.pb-24{padding-bottom:6rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-60{padding-left:15rem}.pl-9{padding-left:2.25rem}.pr-0{padding-right:0}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-60{padding-right:15rem}.pr-7{padding-right:1.75rem}.pt-1{padding-top:.25rem}.pt-10{padding-top:2.5rem}.pt-16{padding-top:4rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-bottom{vertical-align:bottom}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-base{font-size:1rem;line-height:1.5rem}.text-base\/7{font-size:1rem;line-height:1.75rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-sm\/6{font-size:.875rem;line-height:1.5rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-8{line-height:2rem}.leading-9{line-height:2.25rem}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-900{--tw-text-opacity: 1;color:rgb(20 83 45 / var(--tw-text-opacity, 1))}.text-neutral-700{--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-slate-100{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-80{opacity:.8}.opacity-\[0\.45\]{opacity:.45}.mix-blend-multiply{mix-blend-mode:multiply}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-gray-300{--tw-shadow-color: #d1d5db;--tw-shadow: var(--tw-shadow-colored)}.outline{outline-style:solid}.outline-1{outline-width:1px}.outline-gray-200\/80{outline-color:#e5e7ebcc}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-inset{--tw-ring-inset: inset}.ring-black{--tw-ring-opacity: 1;--tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity, 1))}.ring-gray-200{--tw-ring-opacity: 1;--tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity, 1))}.ring-gray-300{--tw-ring-opacity: 1;--tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity, 1))}.ring-gray-400{--tw-ring-opacity: 1;--tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity, 1))}.ring-gray-400\/10{--tw-ring-color: rgb(156 163 175 / .1)}.ring-gray-900\/10{--tw-ring-color: rgb(17 24 39 / .1)}.ring-green-600\/20{--tw-ring-color: rgb(22 163 74 / .2)}.ring-opacity-5{--tw-ring-opacity: .05}.ring-opacity-50{--tw-ring-opacity: .5}.blur-3xl{--tw-blur: blur(64px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-1000{transition-duration:1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.\[key\:string\]{key:string}.\[mask-image\:radial-gradient\(100\%_100\%_at_top_right\,white\,transparent\)\]{-webkit-mask-image:radial-gradient(100% 100% at top right,white,transparent);mask-image:radial-gradient(100% 100% at top right,white,transparent)}.placeholder\:text-gray-400::-moz-placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.placeholder\:text-gray-400::placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.focus-within\:ring-2:focus-within{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-within\:ring-inset:focus-within{--tw-ring-inset: inset}.focus-within\:ring-green-600:focus-within{--tw-ring-opacity: 1;--tw-ring-color: rgb(22 163 74 / var(--tw-ring-opacity, 1))}.hover\:cursor-move:hover{cursor:move}.hover\:cursor-pointer:hover{cursor:pointer}.hover\:border-gray-300:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-green-500:hover{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.hover\:bg-green-600:hover{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.hover\:text-gray-500:hover{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.hover\:text-gray-800:hover{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-green-500:hover{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.hover\:text-green-600:hover{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.hover\:text-red-700:hover{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.focus\:z-10:focus{z-index:10}.focus\:border-indigo-500:focus{--tw-border-opacity: 1;border-color:rgb(99 102 241 / var(--tw-border-opacity, 1))}.focus\:underline:focus{text-decoration-line:underline}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-inset:focus{--tw-ring-inset: inset}.focus\:ring-gray-400:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity, 1))}.focus\:ring-gray-600:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(75 85 99 / var(--tw-ring-opacity, 1))}.focus\:ring-green-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity, 1))}.focus\:ring-green-600:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(22 163 74 / var(--tw-ring-opacity, 1))}.focus\:ring-indigo-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity, 1))}.focus\:ring-offset-0:focus{--tw-ring-offset-width: 0px}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-green-600:focus-visible{outline-color:#16a34a}.group:hover .group-hover\:text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}@media (min-width: 640px){.sm\:static{position:static}.sm\:inset-auto{inset:auto}.sm\:col-span-2{grid-column:span 2 / span 2}.sm\:col-span-4{grid-column:span 4 / span 4}.sm\:col-span-6{grid-column:span 6 / span 6}.sm\:col-start-1{grid-column-start:1}.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:ml-6{margin-left:1.5rem}.sm\:mt-0{margin-top:0}.sm\:mt-10{margin-top:2.5rem}.sm\:mt-24{margin-top:6rem}.sm\:mt-5{margin-top:1.25rem}.sm\:mt-6{margin-top:1.5rem}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:w-64{width:16rem}.sm\:w-\[1200px\]{width:1200px}.sm\:w-full{width:100%}.sm\:max-w-5xl{max-width:64rem}.sm\:max-w-\[480px\]{max-width:480px}.sm\:max-w-md{max-width:28rem}.sm\:max-w-sm{max-width:24rem}.sm\:flex-auto{flex:1 1 auto}.sm\:flex-none{flex:none}.sm\:translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:items-center{align-items:center}.sm\:items-baseline{align-items:baseline}.sm\:items-stretch{align-items:stretch}.sm\:justify-start{justify-content:flex-start}.sm\:justify-center{justify-content:center}.sm\:gap-y-20{row-gap:5rem}.sm\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(3rem * var(--tw-space-x-reverse));margin-left:calc(3rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(2rem * var(--tw-space-x-reverse));margin-left:calc(2rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem * var(--tw-space-y-reverse))}.sm\:rounded-3xl{border-radius:1.5rem}.sm\:rounded-xl{border-radius:.75rem}.sm\:p-0{padding:0}.sm\:p-4{padding:1rem}.sm\:p-6{padding:1.5rem}.sm\:px-10{padding-left:2.5rem;padding-right:2.5rem}.sm\:px-12{padding-left:3rem;padding-right:3rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-16{padding-top:4rem;padding-bottom:4rem}.sm\:py-24{padding-top:6rem;padding-bottom:6rem}.sm\:py-32{padding-top:8rem;padding-bottom:8rem}.sm\:pb-32{padding-bottom:8rem}.sm\:pr-0{padding-right:0}.sm\:pr-6{padding-right:1.5rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-5xl{font-size:3rem;line-height:1}.sm\:text-6xl{font-size:3.75rem;line-height:1}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}.sm\:leading-6{line-height:1.5rem}.sm\:leading-8{line-height:2rem}.sm\:duration-700{transition-duration:.7s}}@media (min-width: 768px){.md\:absolute{position:absolute}.md\:bottom-16{bottom:4rem}.md\:left-\[50rem\]{left:50rem}.md\:block{display:block}.md\:transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:px-12{padding-left:3rem;padding-right:3rem}.md\:blur-3xl{--tw-blur: blur(64px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}}@media (min-width: 1024px){.lg\:order-first{order:-9999}.lg\:-m-4{margin:-1rem}.lg\:mx-0{margin-left:0;margin-right:0}.lg\:ml-10{margin-left:2.5rem}.lg\:ml-auto{margin-left:auto}.lg\:mr-0{margin-right:0}.lg\:mt-0{margin-top:0}.lg\:mt-12{margin-top:3rem}.lg\:flex{display:flex}.lg\:max-w-7xl{max-width:80rem}.lg\:max-w-lg{max-width:32rem}.lg\:max-w-none{max-width:none}.lg\:max-w-xl{max-width:36rem}.lg\:flex-none{flex:none}.lg\:flex-shrink-0{flex-shrink:0}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:flex-col{flex-direction:column}.lg\:rounded-2xl{border-radius:1rem}.lg\:p-4{padding:1rem}.lg\:px-0{padding-left:0;padding-right:0}.lg\:px-20{padding-left:5rem;padding-right:5rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-20{padding-top:5rem;padding-bottom:5rem}.lg\:pl-4{padding-left:1rem}.lg\:pt-4{padding-top:1rem}.lg\:pt-8{padding-top:2rem}}@media (min-width: 1280px){.xl\:ml-32{margin-left:8rem}}@media print{.print\:flex{display:flex}.print\:hidden{display:none}.print\:max-h-\[250mm\]{max-height:250mm}.print\:max-w-\[210mm\]{max-width:210mm}.print\:flex-col{flex-direction:column}.print\:items-center{align-items:center}.print\:justify-center{justify-content:center}.print\:p-0{padding:0}} diff --git a/index.html b/index.html index 6604150..81cbb59 100644 --- a/index.html +++ b/index.html @@ -5,8 +5,8 @@ SpeckLCA - - + +